summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Android.mk10
-rw-r--r--CleanSpec.mk1
-rw-r--r--api/current.txt750
-rw-r--r--core/java/android/animation/AnimatorInflater.java2
-rw-r--r--core/java/android/animation/ArgbEvaluator.java13
-rw-r--r--core/java/android/animation/FloatArrayEvaluator.java77
-rw-r--r--core/java/android/animation/IntArrayEvaluator.java75
-rw-r--r--core/java/android/animation/ObjectAnimator.java172
-rw-r--r--core/java/android/animation/PropertyValuesHolder.java465
-rw-r--r--core/java/android/animation/RectEvaluator.java47
-rw-r--r--core/java/android/animation/TypeConverter.java68
-rw-r--r--core/java/android/animation/ValueAnimator.java18
-rw-r--r--core/java/android/annotation/IntDef.java65
-rw-r--r--core/java/android/annotation/NonNull.java34
-rw-r--r--core/java/android/annotation/Nullable.java41
-rw-r--r--core/java/android/annotation/StringDef.java55
-rw-r--r--core/java/android/app/ActionBar.java35
-rw-r--r--core/java/android/app/Activity.java103
-rw-r--r--core/java/android/app/AppOpsManager.java2
-rw-r--r--core/java/android/app/Fragment.java9
-rw-r--r--core/java/android/app/FragmentBreadCrumbs.java15
-rw-r--r--core/java/android/app/MediaRouteButton.java11
-rw-r--r--core/java/android/app/Notification.java11
-rw-r--r--core/java/android/app/PendingIntent.java51
-rw-r--r--core/java/android/app/TaskStackBuilder.java7
-rw-r--r--core/java/android/app/TimePickerDialog.java45
-rw-r--r--core/java/android/app/WallpaperManager.java21
-rw-r--r--core/java/android/bluetooth/BluetoothTetheringDataTracker.java5
-rw-r--r--core/java/android/content/AsyncTaskLoader.java34
-rw-r--r--core/java/android/content/ContentResolver.java167
-rw-r--r--core/java/android/content/Context.java208
-rw-r--r--core/java/android/content/IAnonymousSyncAdapter.aidl45
-rw-r--r--core/java/android/content/IContentService.aidl64
-rw-r--r--core/java/android/content/ISyncServiceAdapter.aidl45
-rw-r--r--core/java/android/content/Intent.java32
-rw-r--r--core/java/android/content/Loader.java2
-rw-r--r--core/java/android/content/PeriodicSync.java72
-rw-r--r--core/java/android/content/SyncInfo.java23
-rw-r--r--core/java/android/content/SyncRequest.java202
-rw-r--r--core/java/android/content/SyncService.java212
-rw-r--r--core/java/android/content/pm/ActivityInfo.java27
-rw-r--r--core/java/android/content/pm/PackageManager.java8
-rw-r--r--core/java/android/content/res/ColorStateList.java13
-rw-r--r--core/java/android/gesture/GestureOverlayView.java13
-rw-r--r--core/java/android/hardware/camera2/CaptureResult.java8
-rw-r--r--core/java/android/hardware/camera2/package.html2
-rw-r--r--core/java/android/inputmethodservice/ExtractButton.java8
-rw-r--r--core/java/android/inputmethodservice/ExtractEditText.java8
-rw-r--r--core/java/android/inputmethodservice/InputMethodService.java15
-rw-r--r--core/java/android/inputmethodservice/KeyboardView.java13
-rw-r--r--core/java/android/net/BaseNetworkStateTracker.java9
-rw-r--r--core/java/android/net/CaptivePortalTracker.java54
-rw-r--r--core/java/android/net/ConnectivityManager.java18
-rw-r--r--core/java/android/net/DummyDataStateTracker.java5
-rw-r--r--core/java/android/net/EthernetDataTracker.java5
-rw-r--r--core/java/android/net/IConnectivityManager.aidl2
-rw-r--r--core/java/android/net/MobileDataStateTracker.java5
-rw-r--r--core/java/android/net/NetworkInfo.java26
-rw-r--r--core/java/android/net/NetworkStateTracker.java5
-rw-r--r--core/java/android/net/SSLCertificateSocketFactory.java6
-rw-r--r--core/java/android/net/SSLSessionCache.java38
-rw-r--r--core/java/android/os/BatteryProperties.java6
-rw-r--r--core/java/android/os/BatteryProperty.aidl19
-rw-r--r--core/java/android/os/BatteryProperty.java70
-rw-r--r--core/java/android/os/IBatteryPropertiesRegistrar.aidl2
-rw-r--r--core/java/android/os/MessageQueue.java12
-rw-r--r--core/java/android/os/ParcelFileDescriptor.java4
-rw-r--r--core/java/android/os/Process.java13
-rw-r--r--core/java/android/preference/CheckBoxPreference.java15
-rw-r--r--core/java/android/preference/DialogPreference.java24
-rw-r--r--core/java/android/preference/EditTextPreference.java10
-rw-r--r--core/java/android/preference/ListPreference.java22
-rw-r--r--core/java/android/preference/MultiCheckPreference.java21
-rw-r--r--core/java/android/preference/MultiSelectListPreference.java22
-rw-r--r--core/java/android/preference/Preference.java63
-rw-r--r--core/java/android/preference/PreferenceCategory.java11
-rw-r--r--core/java/android/preference/PreferenceFrameLayout.java13
-rw-r--r--core/java/android/preference/PreferenceGroup.java14
-rw-r--r--core/java/android/preference/RingtonePreference.java14
-rw-r--r--core/java/android/preference/SeekBarDialogPreference.java17
-rw-r--r--core/java/android/preference/SeekBarPreference.java13
-rw-r--r--core/java/android/preference/SwitchPreference.java27
-rw-r--r--core/java/android/preference/TwoStatePreference.java8
-rw-r--r--core/java/android/preference/VolumePreference.java17
-rw-r--r--core/java/android/provider/Settings.java91
-rw-r--r--core/java/android/speech/tts/AbstractEventLogger.java124
-rw-r--r--core/java/android/speech/tts/AbstractSynthesisCallback.java29
-rw-r--r--core/java/android/speech/tts/AudioPlaybackHandler.java2
-rw-r--r--core/java/android/speech/tts/AudioPlaybackQueueItem.java8
-rw-r--r--core/java/android/speech/tts/EventLogTags.logtags3
-rw-r--r--core/java/android/speech/tts/EventLogger.java178
-rw-r--r--core/java/android/speech/tts/EventLoggerV1.java80
-rw-r--r--core/java/android/speech/tts/EventLoggerV2.java73
-rw-r--r--core/java/android/speech/tts/FileSynthesisCallback.java187
-rw-r--r--core/java/android/speech/tts/ITextToSpeechCallback.aidl44
-rw-r--r--core/java/android/speech/tts/ITextToSpeechService.aidl54
-rw-r--r--core/java/android/speech/tts/PlaybackQueueItem.java12
-rw-r--r--core/java/android/speech/tts/PlaybackSynthesisCallback.java152
-rw-r--r--core/java/android/speech/tts/RequestConfig.java213
-rw-r--r--core/java/android/speech/tts/RequestConfigHelper.java170
-rw-r--r--core/java/android/speech/tts/SilencePlaybackQueueItem.java13
-rw-r--r--core/java/android/speech/tts/SynthesisCallback.java79
-rw-r--r--core/java/android/speech/tts/SynthesisPlaybackQueueItem.java26
-rw-r--r--core/java/android/speech/tts/SynthesisRequestV2.aidl20
-rw-r--r--core/java/android/speech/tts/SynthesisRequestV2.java132
-rw-r--r--core/java/android/speech/tts/TextToSpeech.java22
-rw-r--r--core/java/android/speech/tts/TextToSpeechClient.java1055
-rw-r--r--core/java/android/speech/tts/TextToSpeechService.java815
-rw-r--r--core/java/android/speech/tts/VoiceInfo.aidl20
-rw-r--r--core/java/android/speech/tts/VoiceInfo.java325
-rw-r--r--core/java/android/text/style/SuggestionSpan.java12
-rw-r--r--core/java/android/transition/Recolor.java8
-rw-r--r--core/java/android/view/Display.java2
-rw-r--r--core/java/android/view/DisplayInfo.java1
-rw-r--r--core/java/android/view/HapticFeedbackConstants.java5
-rw-r--r--core/java/android/view/Surface.java10
-rw-r--r--core/java/android/view/SurfaceView.java9
-rw-r--r--core/java/android/view/TextureView.java30
-rw-r--r--core/java/android/view/View.java218
-rw-r--r--core/java/android/view/ViewGroup.java23
-rw-r--r--core/java/android/view/ViewRootImpl.java119
-rw-r--r--core/java/android/view/ViewStub.java13
-rw-r--r--core/java/android/view/Window.java6
-rw-r--r--core/java/android/view/WindowManagerPolicy.java27
-rw-r--r--core/java/android/view/accessibility/AccessibilityEvent.java60
-rw-r--r--core/java/android/view/accessibility/AccessibilityManager.java36
-rw-r--r--core/java/android/view/inputmethod/BaseInputConnection.java6
-rw-r--r--core/java/android/view/inputmethod/InputMethodManager.java29
-rw-r--r--core/java/android/view/inputmethod/InputMethodSubtype.java6
-rw-r--r--core/java/android/webkit/WebView.java72
-rw-r--r--core/java/android/webkit/WebViewFactoryProvider.java5
-rw-r--r--core/java/android/webkit/WebViewProvider.java1
-rw-r--r--core/java/android/widget/AbsListView.java134
-rw-r--r--core/java/android/widget/AbsSeekBar.java12
-rw-r--r--core/java/android/widget/AbsSpinner.java12
-rw-r--r--core/java/android/widget/AbsoluteLayout.java13
-rw-r--r--core/java/android/widget/ActivityChooserView.java27
-rw-r--r--core/java/android/widget/AdapterView.java12
-rw-r--r--core/java/android/widget/AdapterViewAnimator.java11
-rw-r--r--core/java/android/widget/AdapterViewFlipper.java15
-rw-r--r--core/java/android/widget/AnalogClock.java17
-rw-r--r--core/java/android/widget/AutoCompleteTextView.java14
-rw-r--r--core/java/android/widget/Button.java8
-rw-r--r--core/java/android/widget/CalendarView.java2684
-rw-r--r--core/java/android/widget/CheckBox.java8
-rw-r--r--core/java/android/widget/CheckedTextView.java12
-rw-r--r--core/java/android/widget/Chronometer.java13
-rw-r--r--core/java/android/widget/CompoundButton.java13
-rw-r--r--core/java/android/widget/DatePicker.java1238
-rw-r--r--core/java/android/widget/EditText.java8
-rw-r--r--core/java/android/widget/Editor.java4
-rw-r--r--core/java/android/widget/ExpandableListView.java14
-rw-r--r--core/java/android/widget/FastScroller.java245
-rw-r--r--core/java/android/widget/FrameLayout.java12
-rw-r--r--core/java/android/widget/Gallery.java14
-rw-r--r--core/java/android/widget/GridLayout.java56
-rw-r--r--core/java/android/widget/GridView.java65
-rw-r--r--core/java/android/widget/HorizontalScrollView.java13
-rw-r--r--core/java/android/widget/ImageButton.java8
-rw-r--r--core/java/android/widget/ImageView.java13
-rw-r--r--core/java/android/widget/LegacyTimePickerDelegate.java638
-rw-r--r--core/java/android/widget/LinearLayout.java44
-rw-r--r--core/java/android/widget/ListView.java40
-rw-r--r--core/java/android/widget/MultiAutoCompleteTextView.java9
-rw-r--r--core/java/android/widget/NumberPicker.java38
-rw-r--r--core/java/android/widget/OverScroller.java21
-rw-r--r--core/java/android/widget/PopupWindow.java7
-rw-r--r--core/java/android/widget/ProgressBar.java68
-rw-r--r--core/java/android/widget/QuickContactBadge.java9
-rw-r--r--core/java/android/widget/RadialTimePickerView.java1396
-rw-r--r--core/java/android/widget/RadioButton.java8
-rw-r--r--core/java/android/widget/RatingBar.java14
-rw-r--r--core/java/android/widget/RelativeLayout.java23
-rw-r--r--core/java/android/widget/ScrollView.java12
-rw-r--r--core/java/android/widget/Scroller.java78
-rw-r--r--core/java/android/widget/SearchView.java25
-rw-r--r--core/java/android/widget/SeekBar.java8
-rw-r--r--core/java/android/widget/SlidingDrawer.java29
-rw-r--r--core/java/android/widget/Space.java11
-rw-r--r--core/java/android/widget/Spinner.java62
-rw-r--r--core/java/android/widget/StackView.java13
-rw-r--r--core/java/android/widget/Switch.java167
-rw-r--r--core/java/android/widget/TabHost.java13
-rw-r--r--core/java/android/widget/TabWidget.java10
-rw-r--r--core/java/android/widget/TextClock.java18
-rw-r--r--core/java/android/widget/TextView.java20
-rw-r--r--core/java/android/widget/TimePicker.java700
-rw-r--r--core/java/android/widget/TimePickerDelegate.java1380
-rw-r--r--core/java/android/widget/Toast.java16
-rw-r--r--core/java/android/widget/ToggleButton.java20
-rw-r--r--core/java/android/widget/TwoLineListItem.java12
-rw-r--r--core/java/android/widget/VideoView.java16
-rw-r--r--core/java/android/widget/ZoomButton.java8
-rw-r--r--core/java/com/android/internal/app/AlertController.java9
-rw-r--r--core/java/com/android/internal/app/IBatteryStats.aidl14
-rw-r--r--core/java/com/android/internal/inputmethod/InputMethodSubtypeSwitchingController.java299
-rw-r--r--core/java/com/android/internal/inputmethod/InputMethodUtils.java11
-rw-r--r--core/java/com/android/internal/os/ZygoteInit.java1
-rw-r--r--core/java/com/android/internal/preference/YesNoPreference.java12
-rw-r--r--core/java/com/android/internal/view/CheckableLinearLayout.java10
-rw-r--r--core/java/com/android/internal/view/IInputMethodManager.aidl2
-rw-r--r--core/java/com/android/internal/view/menu/ActionMenuItemView.java12
-rw-r--r--core/java/com/android/internal/view/menu/IconMenuItemView.java17
-rw-r--r--core/java/com/android/internal/view/menu/ListMenuItemView.java18
-rw-r--r--core/java/com/android/internal/widget/AbsActionBarView.java13
-rw-r--r--core/java/com/android/internal/widget/ActionBarContextView.java14
-rw-r--r--core/java/com/android/internal/widget/DialogTitle.java11
-rw-r--r--core/java/com/android/internal/widget/PasswordEntryKeyboardView.java11
-rw-r--r--core/java/com/android/internal/widget/SizeAdaptiveLayout.java15
-rw-r--r--core/java/com/android/internal/widget/SubtitleView.java11
-rw-r--r--core/java/com/android/internal/widget/TextProgressBar.java8
-rw-r--r--core/jni/AndroidRuntime.cpp3
-rw-r--r--core/jni/android/graphics/BitmapRegionDecoder.cpp5
-rw-r--r--core/jni/android/graphics/ColorFilter.cpp6
-rw-r--r--core/jni/android_animation_PropertyValuesHolder.cpp98
-rw-r--r--core/jni/android_util_Process.cpp18
-rw-r--r--core/res/AndroidManifest.xml7
-rw-r--r--core/res/res/drawable-hdpi/scrollbar_handle_accelerated_anim2.9.pngbin1923 -> 2069 bytes
-rw-r--r--core/res/res/drawable-ldpi/scrollbar_handle_accelerated_anim2.9.pngbin1048 -> 1170 bytes
-rw-r--r--core/res/res/drawable-mdpi/scrollbar_handle_accelerated_anim2.9.pngbin1339 -> 1477 bytes
-rw-r--r--core/res/res/drawable-xhdpi/scrollbar_handle_accelerated_anim2.9.pngbin3797 -> 4272 bytes
-rw-r--r--core/res/res/layout-land/time_picker_holo.xml70
-rw-r--r--core/res/res/layout/time_header_label.xml60
-rw-r--r--core/res/res/layout/time_picker_holo.xml92
-rw-r--r--core/res/res/layout/time_picker_legacy.xml (renamed from core/res/res/layout/time_picker.xml)0
-rw-r--r--core/res/res/layout/time_picker_legacy_holo.xml86
-rw-r--r--core/res/res/values-af/strings.xml21
-rw-r--r--core/res/res/values-am/strings.xml33
-rw-r--r--core/res/res/values-ar/strings.xml517
-rw-r--r--core/res/res/values-az-rAZ/strings.xml1591
-rw-r--r--core/res/res/values-az/strings.xml1586
-rw-r--r--core/res/res/values-be/strings.xml32
-rw-r--r--core/res/res/values-bg/strings.xml19
-rw-r--r--core/res/res/values-ca/strings.xml21
-rw-r--r--core/res/res/values-cs/strings.xml19
-rw-r--r--core/res/res/values-da/strings.xml21
-rw-r--r--core/res/res/values-de/strings.xml19
-rw-r--r--core/res/res/values-el/strings.xml21
-rw-r--r--core/res/res/values-en-rGB/strings.xml19
-rw-r--r--core/res/res/values-en-rIN/strings.xml19
-rw-r--r--core/res/res/values-es-rUS/strings.xml21
-rw-r--r--core/res/res/values-es/strings.xml19
-rw-r--r--core/res/res/values-et-rEE/strings.xml21
-rw-r--r--core/res/res/values-et/strings.xml32
-rw-r--r--core/res/res/values-fa/strings.xml709
-rw-r--r--core/res/res/values-fi/strings.xml21
-rw-r--r--core/res/res/values-fr-rCA/strings.xml21
-rw-r--r--core/res/res/values-fr/strings.xml21
-rw-r--r--core/res/res/values-hi/strings.xml575
-rw-r--r--core/res/res/values-hr/strings.xml19
-rw-r--r--core/res/res/values-hu/strings.xml21
-rw-r--r--core/res/res/values-hy-rAM/strings.xml19
-rw-r--r--core/res/res/values-hy/strings.xml1586
-rw-r--r--core/res/res/values-in/strings.xml27
-rw-r--r--core/res/res/values-it/strings.xml19
-rw-r--r--core/res/res/values-iw/strings.xml599
-rw-r--r--core/res/res/values-ja/strings.xml19
-rw-r--r--core/res/res/values-ka-rGE/strings.xml21
-rw-r--r--core/res/res/values-ka/strings.xml1588
-rw-r--r--core/res/res/values-km-rKH/strings.xml21
-rw-r--r--core/res/res/values-km/strings.xml1588
-rw-r--r--core/res/res/values-ko/strings.xml21
-rw-r--r--core/res/res/values-land/dimens.xml4
-rw-r--r--core/res/res/values-lo-rLA/strings.xml21
-rw-r--r--core/res/res/values-lo/strings.xml1588
-rw-r--r--core/res/res/values-lt/strings.xml19
-rw-r--r--core/res/res/values-lv/strings.xml19
-rw-r--r--core/res/res/values-mn-rMN/strings.xml21
-rw-r--r--core/res/res/values-mn/strings.xml1586
-rw-r--r--core/res/res/values-ms-rMY/strings.xml21
-rw-r--r--core/res/res/values-ms/strings.xml39
-rw-r--r--core/res/res/values-nb/strings.xml19
-rw-r--r--core/res/res/values-ne-rNP/strings.xml1591
-rw-r--r--core/res/res/values-ne/strings.xml1588
-rw-r--r--core/res/res/values-nl/strings.xml23
-rw-r--r--core/res/res/values-pl/strings.xml21
-rw-r--r--core/res/res/values-pt-rPT/strings.xml19
-rw-r--r--core/res/res/values-pt/strings.xml21
-rw-r--r--core/res/res/values-rm/strings.xml32
-rw-r--r--core/res/res/values-ro/strings.xml19
-rw-r--r--core/res/res/values-ru/strings.xml21
-rw-r--r--core/res/res/values-si-rLK/strings.xml1594
-rw-r--r--core/res/res/values-si/strings.xml1591
-rw-r--r--core/res/res/values-sk/strings.xml21
-rw-r--r--core/res/res/values-sl/strings.xml19
-rw-r--r--core/res/res/values-sr/strings.xml19
-rw-r--r--core/res/res/values-sv/strings.xml19
-rw-r--r--core/res/res/values-sw/strings.xml23
-rw-r--r--core/res/res/values-th/strings.xml19
-rw-r--r--core/res/res/values-tl/strings.xml21
-rw-r--r--core/res/res/values-tr/strings.xml21
-rw-r--r--core/res/res/values-uk/strings.xml19
-rw-r--r--core/res/res/values-vi/strings.xml21
-rw-r--r--core/res/res/values-zh-rCN/strings.xml27
-rw-r--r--core/res/res/values-zh-rHK/strings.xml21
-rw-r--r--core/res/res/values-zh-rTW/strings.xml25
-rw-r--r--core/res/res/values-zu/strings.xml19
-rw-r--r--core/res/res/values/attrs.xml70
-rw-r--r--core/res/res/values/colors.xml17
-rw-r--r--core/res/res/values/config.xml6
-rw-r--r--core/res/res/values/dimens.xml36
-rw-r--r--core/res/res/values/public.xml18
-rw-r--r--core/res/res/values/strings.xml56
-rw-r--r--core/res/res/values/styles.xml98
-rw-r--r--core/res/res/values/styles_device_defaults.xml30
-rw-r--r--core/res/res/values/symbols.xml59
-rw-r--r--core/res/res/values/themes.xml70
-rw-r--r--core/res/res/values/themes_device_defaults.xml18
-rw-r--r--core/tests/coretests/Android.mk1
-rw-r--r--core/tests/coretests/assets/backup_mock.datbin0 -> 96 bytes
-rw-r--r--core/tests/coretests/assets/backup_mock.gld4
-rw-r--r--core/tests/coretests/assets/backup_real.datbin0 -> 248 bytes
-rw-r--r--core/tests/coretests/assets/backup_real.gld3
-rw-r--r--core/tests/coretests/src/android/app/backup/BackupDataTest.java291
-rw-r--r--core/tests/coretests/src/android/net/SSLSessionCacheTest.java108
-rw-r--r--core/tests/coretests/src/android/text/HtmlTest.java247
-rw-r--r--data/keyboards/Generic.kl13
-rw-r--r--graphics/java/android/graphics/BitmapFactory.java19
-rw-r--r--graphics/java/android/graphics/ColorFilter.java14
-rw-r--r--graphics/java/android/graphics/ColorMatrix.java43
-rw-r--r--graphics/java/android/graphics/ColorMatrixColorFilter.java90
-rw-r--r--graphics/java/android/graphics/ImageFormat.java6
-rw-r--r--graphics/java/android/graphics/LightingColorFilter.java81
-rw-r--r--graphics/java/android/graphics/PorterDuffColorFilter.java81
-rw-r--r--graphics/java/android/graphics/drawable/Drawable.java3
-rw-r--r--graphics/java/android/graphics/drawable/GradientDrawable.java179
-rw-r--r--graphics/java/android/renderscript/Allocation.java26
-rw-r--r--graphics/java/android/renderscript/Type.java75
-rw-r--r--include/androidfw/Asset.h322
-rw-r--r--include/androidfw/AssetDir.h145
-rw-r--r--include/androidfw/AssetManager.h374
-rw-r--r--include/androidfw/BackupHelpers.h169
-rw-r--r--include/androidfw/CursorWindow.h193
-rw-r--r--include/androidfw/ObbFile.h145
-rw-r--r--include/androidfw/PowerManager.h33
-rw-r--r--include/androidfw/ResourceTypes.h1605
-rw-r--r--include/androidfw/StreamingZipInflater.h84
-rw-r--r--include/androidfw/ZipFileRO.h262
-rw-r--r--include/androidfw/ZipUtils.h67
-rw-r--r--include/androidfw/misc.h49
-rw-r--r--libs/androidfw/Android.mk93
-rw-r--r--libs/androidfw/Asset.cpp897
-rw-r--r--libs/androidfw/AssetDir.cpp66
-rw-r--r--libs/androidfw/AssetManager.cpp2034
-rw-r--r--libs/androidfw/BackupData.cpp382
-rw-r--r--libs/androidfw/BackupHelpers.cpp1591
-rw-r--r--libs/androidfw/CursorWindow.cpp352
-rw-r--r--libs/androidfw/MODULE_LICENSE_APACHE20
-rw-r--r--libs/androidfw/NOTICE190
-rw-r--r--libs/androidfw/ObbFile.cpp345
-rw-r--r--libs/androidfw/ResourceTypes.cpp5796
-rw-r--r--libs/androidfw/StreamingZipInflater.cpp242
-rw-r--r--libs/androidfw/ZipFileRO.cpp995
-rw-r--r--libs/androidfw/ZipUtils.cpp345
-rw-r--r--libs/androidfw/misc.cpp83
-rw-r--r--libs/androidfw/tests/Android.mk31
-rw-r--r--libs/androidfw/tests/ObbFile_test.cpp102
-rw-r--r--libs/androidfw/tests/ZipFileRO_test.cpp64
-rw-r--r--libs/hwui/Android.mk1
-rw-r--r--libs/hwui/Caches.h2
-rw-r--r--libs/hwui/DisplayListOp.h4
-rw-r--r--libs/hwui/FontRenderer.cpp4
-rw-r--r--libs/hwui/GradientCache.cpp7
-rw-r--r--libs/hwui/GradientCache.h2
-rw-r--r--libs/hwui/OpenGLRenderer.cpp55
-rw-r--r--libs/hwui/OpenGLRenderer.h13
-rw-r--r--libs/hwui/PathTessellator.cpp142
-rw-r--r--libs/hwui/Program.h4
-rw-r--r--libs/hwui/SkiaShader.cpp9
-rw-r--r--libs/hwui/SkiaShader.h2
-rw-r--r--libs/hwui/TextDropShadowCache.cpp2
-rw-r--r--libs/hwui/TextureCache.cpp2
-rw-r--r--libs/hwui/Vertex.h36
-rw-r--r--libs/hwui/font/CacheTexture.cpp4
-rw-r--r--libs/hwui/font/CacheTexture.h2
-rw-r--r--media/java/android/media/Image.java12
-rw-r--r--media/java/android/media/ImageReader.java3
-rw-r--r--media/java/android/media/WebVttRenderer.java10
-rw-r--r--packages/BackupRestoreConfirmation/res/values-az-rAZ/strings.xml38
-rw-r--r--packages/BackupRestoreConfirmation/res/values-az/strings.xml38
-rw-r--r--packages/BackupRestoreConfirmation/res/values-en-rIN/strings.xml38
-rw-r--r--packages/BackupRestoreConfirmation/res/values-et-rEE/strings.xml38
-rw-r--r--packages/BackupRestoreConfirmation/res/values-fr-rCA/strings.xml38
-rw-r--r--packages/BackupRestoreConfirmation/res/values-hi/strings.xml16
-rw-r--r--packages/BackupRestoreConfirmation/res/values-hy-rAM/strings.xml38
-rw-r--r--packages/BackupRestoreConfirmation/res/values-hy/strings.xml38
-rw-r--r--packages/BackupRestoreConfirmation/res/values-ka-rGE/strings.xml38
-rw-r--r--packages/BackupRestoreConfirmation/res/values-ka/strings.xml38
-rw-r--r--packages/BackupRestoreConfirmation/res/values-km-rKH/strings.xml38
-rw-r--r--packages/BackupRestoreConfirmation/res/values-km/strings.xml38
-rw-r--r--packages/BackupRestoreConfirmation/res/values-lo-rLA/strings.xml38
-rw-r--r--packages/BackupRestoreConfirmation/res/values-lo/strings.xml38
-rw-r--r--packages/BackupRestoreConfirmation/res/values-mn-rMN/strings.xml38
-rw-r--r--packages/BackupRestoreConfirmation/res/values-mn/strings.xml38
-rw-r--r--packages/BackupRestoreConfirmation/res/values-ms-rMY/strings.xml38
-rw-r--r--packages/BackupRestoreConfirmation/res/values-ne-rNP/strings.xml38
-rw-r--r--packages/BackupRestoreConfirmation/res/values-ne/strings.xml38
-rw-r--r--packages/BackupRestoreConfirmation/res/values-si-rLK/strings.xml38
-rw-r--r--packages/BackupRestoreConfirmation/res/values-si/strings.xml38
-rw-r--r--packages/BackupRestoreConfirmation/res/values-zh-rHK/strings.xml38
-rw-r--r--packages/BackupRestoreConfirmation/res/values-zu/strings.xml2
-rw-r--r--packages/DefaultContainerService/res/values-az-rAZ/strings.xml24
-rw-r--r--packages/DefaultContainerService/res/values-az/strings.xml24
-rw-r--r--packages/DefaultContainerService/res/values-en-rIN/strings.xml24
-rw-r--r--packages/DefaultContainerService/res/values-et-rEE/strings.xml24
-rw-r--r--packages/DefaultContainerService/res/values-fr-rCA/strings.xml24
-rw-r--r--packages/DefaultContainerService/res/values-hy-rAM/strings.xml24
-rw-r--r--packages/DefaultContainerService/res/values-hy/strings.xml24
-rw-r--r--packages/DefaultContainerService/res/values-ka-rGE/strings.xml24
-rw-r--r--packages/DefaultContainerService/res/values-ka/strings.xml24
-rw-r--r--packages/DefaultContainerService/res/values-km-rKH/strings.xml24
-rw-r--r--packages/DefaultContainerService/res/values-km/strings.xml24
-rw-r--r--packages/DefaultContainerService/res/values-lo-rLA/strings.xml24
-rw-r--r--packages/DefaultContainerService/res/values-lo/strings.xml24
-rw-r--r--packages/DefaultContainerService/res/values-mn-rMN/strings.xml24
-rw-r--r--packages/DefaultContainerService/res/values-mn/strings.xml24
-rw-r--r--packages/DefaultContainerService/res/values-ms-rMY/strings.xml24
-rw-r--r--packages/DefaultContainerService/res/values-ne-rNP/strings.xml24
-rw-r--r--packages/DefaultContainerService/res/values-ne/strings.xml24
-rw-r--r--packages/DefaultContainerService/res/values-si-rLK/strings.xml24
-rw-r--r--packages/DefaultContainerService/res/values-si/strings.xml24
-rw-r--r--packages/DefaultContainerService/res/values-zh-rHK/strings.xml24
-rw-r--r--packages/DocumentsUI/res/values-af/strings.xml54
-rw-r--r--packages/DocumentsUI/res/values-am/strings.xml54
-rw-r--r--packages/DocumentsUI/res/values-ar/strings.xml54
-rw-r--r--packages/DocumentsUI/res/values-az-rAZ/strings.xml53
-rw-r--r--packages/DocumentsUI/res/values-az/strings.xml53
-rw-r--r--packages/DocumentsUI/res/values-bg/strings.xml54
-rw-r--r--packages/DocumentsUI/res/values-ca/strings.xml54
-rw-r--r--packages/DocumentsUI/res/values-cs/strings.xml54
-rw-r--r--packages/DocumentsUI/res/values-da/strings.xml54
-rw-r--r--packages/DocumentsUI/res/values-de/strings.xml54
-rw-r--r--packages/DocumentsUI/res/values-el/strings.xml54
-rw-r--r--packages/DocumentsUI/res/values-en-rGB/strings.xml54
-rw-r--r--packages/DocumentsUI/res/values-en-rIN/strings.xml54
-rw-r--r--packages/DocumentsUI/res/values-es-rUS/strings.xml54
-rw-r--r--packages/DocumentsUI/res/values-es/strings.xml54
-rw-r--r--packages/DocumentsUI/res/values-et-rEE/strings.xml54
-rw-r--r--packages/DocumentsUI/res/values-fa/strings.xml54
-rw-r--r--packages/DocumentsUI/res/values-fi/strings.xml54
-rw-r--r--packages/DocumentsUI/res/values-fr-rCA/strings.xml54
-rw-r--r--packages/DocumentsUI/res/values-fr/strings.xml54
-rw-r--r--packages/DocumentsUI/res/values-hi/strings.xml54
-rw-r--r--packages/DocumentsUI/res/values-hr/strings.xml54
-rw-r--r--packages/DocumentsUI/res/values-hu/strings.xml54
-rw-r--r--packages/DocumentsUI/res/values-hy-rAM/strings.xml54
-rw-r--r--packages/DocumentsUI/res/values-in/strings.xml54
-rw-r--r--packages/DocumentsUI/res/values-it/strings.xml54
-rw-r--r--packages/DocumentsUI/res/values-iw/strings.xml54
-rw-r--r--packages/DocumentsUI/res/values-ja/strings.xml54
-rw-r--r--packages/DocumentsUI/res/values-ka-rGE/strings.xml54
-rw-r--r--packages/DocumentsUI/res/values-km-rKH/strings.xml54
-rw-r--r--packages/DocumentsUI/res/values-ko/strings.xml54
-rw-r--r--packages/DocumentsUI/res/values-lo-rLA/strings.xml54
-rw-r--r--packages/DocumentsUI/res/values-lt/strings.xml54
-rw-r--r--packages/DocumentsUI/res/values-lv/strings.xml54
-rw-r--r--packages/DocumentsUI/res/values-mn-rMN/strings.xml54
-rw-r--r--packages/DocumentsUI/res/values-mn/strings.xml53
-rw-r--r--packages/DocumentsUI/res/values-ms-rMY/strings.xml54
-rw-r--r--packages/DocumentsUI/res/values-nb/strings.xml54
-rw-r--r--packages/DocumentsUI/res/values-ne-rNP/strings.xml53
-rw-r--r--packages/DocumentsUI/res/values-nl/strings.xml54
-rw-r--r--packages/DocumentsUI/res/values-pl/strings.xml54
-rw-r--r--packages/DocumentsUI/res/values-pt-rPT/strings.xml54
-rw-r--r--packages/DocumentsUI/res/values-pt/strings.xml54
-rw-r--r--packages/DocumentsUI/res/values-ro/strings.xml54
-rw-r--r--packages/DocumentsUI/res/values-ru/strings.xml54
-rw-r--r--packages/DocumentsUI/res/values-si-rLK/strings.xml53
-rw-r--r--packages/DocumentsUI/res/values-sk/strings.xml54
-rw-r--r--packages/DocumentsUI/res/values-sl/strings.xml54
-rw-r--r--packages/DocumentsUI/res/values-sr/strings.xml54
-rw-r--r--packages/DocumentsUI/res/values-sv/strings.xml54
-rw-r--r--packages/DocumentsUI/res/values-sw/strings.xml54
-rw-r--r--packages/DocumentsUI/res/values-th/strings.xml54
-rw-r--r--packages/DocumentsUI/res/values-tl/strings.xml54
-rw-r--r--packages/DocumentsUI/res/values-tr/strings.xml54
-rw-r--r--packages/DocumentsUI/res/values-uk/strings.xml54
-rw-r--r--packages/DocumentsUI/res/values-vi/strings.xml54
-rw-r--r--packages/DocumentsUI/res/values-zh-rCN/strings.xml54
-rw-r--r--packages/DocumentsUI/res/values-zh-rHK/strings.xml54
-rw-r--r--packages/DocumentsUI/res/values-zh-rTW/strings.xml54
-rw-r--r--packages/DocumentsUI/res/values-zu/strings.xml54
-rw-r--r--packages/ExternalStorageProvider/res/values-af/strings.xml22
-rw-r--r--packages/ExternalStorageProvider/res/values-am/strings.xml22
-rw-r--r--packages/ExternalStorageProvider/res/values-ar/strings.xml22
-rw-r--r--packages/ExternalStorageProvider/res/values-az-rAZ/strings.xml21
-rw-r--r--packages/ExternalStorageProvider/res/values-az/strings.xml21
-rw-r--r--packages/ExternalStorageProvider/res/values-bg/strings.xml22
-rw-r--r--packages/ExternalStorageProvider/res/values-ca/strings.xml22
-rw-r--r--packages/ExternalStorageProvider/res/values-cs/strings.xml22
-rw-r--r--packages/ExternalStorageProvider/res/values-da/strings.xml22
-rw-r--r--packages/ExternalStorageProvider/res/values-de/strings.xml22
-rw-r--r--packages/ExternalStorageProvider/res/values-el/strings.xml22
-rw-r--r--packages/ExternalStorageProvider/res/values-en-rGB/strings.xml22
-rw-r--r--packages/ExternalStorageProvider/res/values-en-rIN/strings.xml22
-rw-r--r--packages/ExternalStorageProvider/res/values-es-rUS/strings.xml22
-rw-r--r--packages/ExternalStorageProvider/res/values-es/strings.xml22
-rw-r--r--packages/ExternalStorageProvider/res/values-et-rEE/strings.xml22
-rw-r--r--packages/ExternalStorageProvider/res/values-fa/strings.xml22
-rw-r--r--packages/ExternalStorageProvider/res/values-fi/strings.xml22
-rw-r--r--packages/ExternalStorageProvider/res/values-fr-rCA/strings.xml22
-rw-r--r--packages/ExternalStorageProvider/res/values-fr/strings.xml22
-rw-r--r--packages/ExternalStorageProvider/res/values-hi/strings.xml22
-rw-r--r--packages/ExternalStorageProvider/res/values-hr/strings.xml22
-rw-r--r--packages/ExternalStorageProvider/res/values-hu/strings.xml22
-rw-r--r--packages/ExternalStorageProvider/res/values-hy-rAM/strings.xml22
-rw-r--r--packages/ExternalStorageProvider/res/values-in/strings.xml22
-rw-r--r--packages/ExternalStorageProvider/res/values-it/strings.xml22
-rw-r--r--packages/ExternalStorageProvider/res/values-iw/strings.xml22
-rw-r--r--packages/ExternalStorageProvider/res/values-ja/strings.xml22
-rw-r--r--packages/ExternalStorageProvider/res/values-ka-rGE/strings.xml22
-rw-r--r--packages/ExternalStorageProvider/res/values-km-rKH/strings.xml22
-rw-r--r--packages/ExternalStorageProvider/res/values-ko/strings.xml22
-rw-r--r--packages/ExternalStorageProvider/res/values-lo-rLA/strings.xml22
-rw-r--r--packages/ExternalStorageProvider/res/values-lt/strings.xml22
-rw-r--r--packages/ExternalStorageProvider/res/values-lv/strings.xml22
-rw-r--r--packages/ExternalStorageProvider/res/values-mn-rMN/strings.xml22
-rw-r--r--packages/ExternalStorageProvider/res/values-mn/strings.xml21
-rw-r--r--packages/ExternalStorageProvider/res/values-ms-rMY/strings.xml22
-rw-r--r--packages/ExternalStorageProvider/res/values-nb/strings.xml22
-rw-r--r--packages/ExternalStorageProvider/res/values-ne-rNP/strings.xml21
-rw-r--r--packages/ExternalStorageProvider/res/values-nl/strings.xml22
-rw-r--r--packages/ExternalStorageProvider/res/values-pl/strings.xml22
-rw-r--r--packages/ExternalStorageProvider/res/values-pt-rPT/strings.xml22
-rw-r--r--packages/ExternalStorageProvider/res/values-pt/strings.xml22
-rw-r--r--packages/ExternalStorageProvider/res/values-ro/strings.xml22
-rw-r--r--packages/ExternalStorageProvider/res/values-ru/strings.xml22
-rw-r--r--packages/ExternalStorageProvider/res/values-si-rLK/strings.xml21
-rw-r--r--packages/ExternalStorageProvider/res/values-sk/strings.xml22
-rw-r--r--packages/ExternalStorageProvider/res/values-sl/strings.xml22
-rw-r--r--packages/ExternalStorageProvider/res/values-sr/strings.xml22
-rw-r--r--packages/ExternalStorageProvider/res/values-sv/strings.xml22
-rw-r--r--packages/ExternalStorageProvider/res/values-sw/strings.xml22
-rw-r--r--packages/ExternalStorageProvider/res/values-th/strings.xml22
-rw-r--r--packages/ExternalStorageProvider/res/values-tl/strings.xml22
-rw-r--r--packages/ExternalStorageProvider/res/values-tr/strings.xml22
-rw-r--r--packages/ExternalStorageProvider/res/values-uk/strings.xml22
-rw-r--r--packages/ExternalStorageProvider/res/values-vi/strings.xml22
-rw-r--r--packages/ExternalStorageProvider/res/values-zh-rCN/strings.xml22
-rw-r--r--packages/ExternalStorageProvider/res/values-zh-rHK/strings.xml22
-rw-r--r--packages/ExternalStorageProvider/res/values-zh-rTW/strings.xml22
-rw-r--r--packages/ExternalStorageProvider/res/values-zu/strings.xml22
-rw-r--r--packages/FusedLocation/res/values-af/strings.xml5
-rw-r--r--packages/FusedLocation/res/values-am/strings.xml5
-rw-r--r--packages/FusedLocation/res/values-ar/strings.xml5
-rw-r--r--packages/FusedLocation/res/values-bg/strings.xml5
-rw-r--r--packages/FusedLocation/res/values-ca/strings.xml5
-rw-r--r--packages/FusedLocation/res/values-cs/strings.xml5
-rw-r--r--packages/FusedLocation/res/values-da/strings.xml5
-rw-r--r--packages/FusedLocation/res/values-de/strings.xml5
-rw-r--r--packages/FusedLocation/res/values-el/strings.xml5
-rw-r--r--packages/FusedLocation/res/values-en-rGB/strings.xml5
-rw-r--r--packages/FusedLocation/res/values-en-rIN/strings.xml5
-rw-r--r--packages/FusedLocation/res/values-es-rUS/strings.xml5
-rw-r--r--packages/FusedLocation/res/values-es/strings.xml5
-rw-r--r--packages/FusedLocation/res/values-et-rEE/strings.xml5
-rw-r--r--packages/FusedLocation/res/values-fa/strings.xml5
-rw-r--r--packages/FusedLocation/res/values-fi/strings.xml5
-rw-r--r--packages/FusedLocation/res/values-fr-rCA/strings.xml5
-rw-r--r--packages/FusedLocation/res/values-fr/strings.xml5
-rw-r--r--packages/FusedLocation/res/values-hi/strings.xml5
-rw-r--r--packages/FusedLocation/res/values-hr/strings.xml5
-rw-r--r--packages/FusedLocation/res/values-hu/strings.xml5
-rw-r--r--packages/FusedLocation/res/values-hy-rAM/strings.xml5
-rw-r--r--packages/FusedLocation/res/values-in/strings.xml5
-rw-r--r--packages/FusedLocation/res/values-it/strings.xml5
-rw-r--r--packages/FusedLocation/res/values-iw/strings.xml5
-rw-r--r--packages/FusedLocation/res/values-ja/strings.xml5
-rw-r--r--packages/FusedLocation/res/values-ka-rGE/strings.xml5
-rw-r--r--packages/FusedLocation/res/values-km-rKH/strings.xml5
-rw-r--r--packages/FusedLocation/res/values-ko/strings.xml5
-rw-r--r--packages/FusedLocation/res/values-lo-rLA/strings.xml5
-rw-r--r--packages/FusedLocation/res/values-lt/strings.xml5
-rw-r--r--packages/FusedLocation/res/values-lv/strings.xml5
-rw-r--r--packages/FusedLocation/res/values-mn-rMN/strings.xml5
-rw-r--r--packages/FusedLocation/res/values-ms-rMY/strings.xml5
-rw-r--r--packages/FusedLocation/res/values-nb/strings.xml5
-rw-r--r--packages/FusedLocation/res/values-nl/strings.xml5
-rw-r--r--packages/FusedLocation/res/values-pl/strings.xml5
-rw-r--r--packages/FusedLocation/res/values-pt-rPT/strings.xml5
-rw-r--r--packages/FusedLocation/res/values-pt/strings.xml5
-rw-r--r--packages/FusedLocation/res/values-ro/strings.xml5
-rw-r--r--packages/FusedLocation/res/values-ru/strings.xml5
-rw-r--r--packages/FusedLocation/res/values-sk/strings.xml5
-rw-r--r--packages/FusedLocation/res/values-sl/strings.xml5
-rw-r--r--packages/FusedLocation/res/values-sr/strings.xml5
-rw-r--r--packages/FusedLocation/res/values-sv/strings.xml5
-rw-r--r--packages/FusedLocation/res/values-sw/strings.xml5
-rw-r--r--packages/FusedLocation/res/values-th/strings.xml5
-rw-r--r--packages/FusedLocation/res/values-tl/strings.xml5
-rw-r--r--packages/FusedLocation/res/values-tr/strings.xml5
-rw-r--r--packages/FusedLocation/res/values-uk/strings.xml5
-rw-r--r--packages/FusedLocation/res/values-vi/strings.xml5
-rw-r--r--packages/FusedLocation/res/values-zh-rCN/strings.xml5
-rw-r--r--packages/FusedLocation/res/values-zh-rHK/strings.xml5
-rw-r--r--packages/FusedLocation/res/values-zh-rTW/strings.xml5
-rw-r--r--packages/FusedLocation/res/values-zu/strings.xml5
-rw-r--r--packages/InputDevices/res/values-af/strings.xml37
-rw-r--r--packages/InputDevices/res/values-am/strings.xml37
-rw-r--r--packages/InputDevices/res/values-ar/strings.xml37
-rw-r--r--packages/InputDevices/res/values-bg/strings.xml37
-rw-r--r--packages/InputDevices/res/values-ca/strings.xml37
-rw-r--r--packages/InputDevices/res/values-cs/strings.xml37
-rw-r--r--packages/InputDevices/res/values-da/strings.xml37
-rw-r--r--packages/InputDevices/res/values-de/strings.xml37
-rw-r--r--packages/InputDevices/res/values-el/strings.xml37
-rw-r--r--packages/InputDevices/res/values-en-rGB/strings.xml37
-rw-r--r--packages/InputDevices/res/values-en-rIN/strings.xml37
-rw-r--r--packages/InputDevices/res/values-es-rUS/strings.xml37
-rw-r--r--packages/InputDevices/res/values-es/strings.xml37
-rw-r--r--packages/InputDevices/res/values-et-rEE/strings.xml37
-rw-r--r--packages/InputDevices/res/values-fa/strings.xml37
-rw-r--r--packages/InputDevices/res/values-fi/strings.xml37
-rw-r--r--packages/InputDevices/res/values-fr-rCA/strings.xml37
-rw-r--r--packages/InputDevices/res/values-fr/strings.xml37
-rw-r--r--packages/InputDevices/res/values-hi/strings.xml37
-rw-r--r--packages/InputDevices/res/values-hr/strings.xml37
-rw-r--r--packages/InputDevices/res/values-hu/strings.xml37
-rw-r--r--packages/InputDevices/res/values-hy-rAM/strings.xml37
-rw-r--r--packages/InputDevices/res/values-in/strings.xml37
-rw-r--r--packages/InputDevices/res/values-it/strings.xml37
-rw-r--r--packages/InputDevices/res/values-iw/strings.xml37
-rw-r--r--packages/InputDevices/res/values-ja/strings.xml37
-rw-r--r--packages/InputDevices/res/values-ka-rGE/strings.xml37
-rw-r--r--packages/InputDevices/res/values-km-rKH/strings.xml37
-rw-r--r--packages/InputDevices/res/values-ko/strings.xml37
-rw-r--r--packages/InputDevices/res/values-lo-rLA/strings.xml37
-rw-r--r--packages/InputDevices/res/values-lt/strings.xml37
-rw-r--r--packages/InputDevices/res/values-lv/strings.xml37
-rw-r--r--packages/InputDevices/res/values-mn-rMN/strings.xml37
-rw-r--r--packages/InputDevices/res/values-ms-rMY/strings.xml37
-rw-r--r--packages/InputDevices/res/values-nb/strings.xml37
-rw-r--r--packages/InputDevices/res/values-nl/strings.xml37
-rw-r--r--packages/InputDevices/res/values-pl/strings.xml37
-rw-r--r--packages/InputDevices/res/values-pt-rPT/strings.xml37
-rw-r--r--packages/InputDevices/res/values-pt/strings.xml37
-rw-r--r--packages/InputDevices/res/values-ro/strings.xml37
-rw-r--r--packages/InputDevices/res/values-ru/strings.xml37
-rw-r--r--packages/InputDevices/res/values-sk/strings.xml37
-rw-r--r--packages/InputDevices/res/values-sl/strings.xml37
-rw-r--r--packages/InputDevices/res/values-sr/strings.xml37
-rw-r--r--packages/InputDevices/res/values-sv/strings.xml37
-rw-r--r--packages/InputDevices/res/values-sw/strings.xml37
-rw-r--r--packages/InputDevices/res/values-th/strings.xml37
-rw-r--r--packages/InputDevices/res/values-tl/strings.xml37
-rw-r--r--packages/InputDevices/res/values-tr/strings.xml37
-rw-r--r--packages/InputDevices/res/values-uk/strings.xml37
-rw-r--r--packages/InputDevices/res/values-vi/strings.xml37
-rw-r--r--packages/InputDevices/res/values-zh-rCN/strings.xml37
-rw-r--r--packages/InputDevices/res/values-zh-rHK/strings.xml37
-rw-r--r--packages/InputDevices/res/values-zh-rTW/strings.xml37
-rw-r--r--packages/InputDevices/res/values-zu/strings.xml37
-rw-r--r--packages/Keyguard/res/values-af/strings.xml27
-rw-r--r--packages/Keyguard/res/values-am/strings.xml27
-rw-r--r--packages/Keyguard/res/values-ar/strings.xml83
-rw-r--r--packages/Keyguard/res/values-az-rAZ/strings.xml138
-rw-r--r--packages/Keyguard/res/values-az/strings.xml138
-rw-r--r--packages/Keyguard/res/values-be/strings.xml38
-rw-r--r--packages/Keyguard/res/values-bg/strings.xml27
-rw-r--r--packages/Keyguard/res/values-ca/strings.xml27
-rw-r--r--packages/Keyguard/res/values-cs/strings.xml27
-rw-r--r--packages/Keyguard/res/values-da/strings.xml27
-rw-r--r--packages/Keyguard/res/values-de/strings.xml27
-rw-r--r--packages/Keyguard/res/values-el/strings.xml27
-rw-r--r--packages/Keyguard/res/values-en-rGB/strings.xml27
-rw-r--r--packages/Keyguard/res/values-en-rIN/strings.xml157
-rw-r--r--packages/Keyguard/res/values-es-rUS/strings.xml27
-rw-r--r--packages/Keyguard/res/values-es/strings.xml29
-rw-r--r--packages/Keyguard/res/values-et-rEE/strings.xml157
-rw-r--r--packages/Keyguard/res/values-fa/strings.xml45
-rw-r--r--packages/Keyguard/res/values-fi/strings.xml27
-rw-r--r--packages/Keyguard/res/values-fr-rCA/strings.xml157
-rw-r--r--packages/Keyguard/res/values-fr/strings.xml27
-rw-r--r--packages/Keyguard/res/values-hi/strings.xml49
-rw-r--r--packages/Keyguard/res/values-hr/strings.xml27
-rw-r--r--packages/Keyguard/res/values-hu/strings.xml27
-rw-r--r--packages/Keyguard/res/values-hy-rAM/strings.xml157
-rw-r--r--packages/Keyguard/res/values-hy/strings.xml138
-rw-r--r--packages/Keyguard/res/values-in/strings.xml27
-rw-r--r--packages/Keyguard/res/values-it/strings.xml27
-rw-r--r--packages/Keyguard/res/values-iw/strings.xml99
-rw-r--r--packages/Keyguard/res/values-ja/strings.xml27
-rw-r--r--packages/Keyguard/res/values-ka-rGE/strings.xml157
-rw-r--r--packages/Keyguard/res/values-ka/strings.xml138
-rw-r--r--packages/Keyguard/res/values-km-rKH/strings.xml157
-rw-r--r--packages/Keyguard/res/values-km/strings.xml138
-rw-r--r--packages/Keyguard/res/values-ko/strings.xml27
-rw-r--r--packages/Keyguard/res/values-lo-rLA/strings.xml157
-rw-r--r--packages/Keyguard/res/values-lo/strings.xml138
-rw-r--r--packages/Keyguard/res/values-lt/strings.xml27
-rw-r--r--packages/Keyguard/res/values-lv/strings.xml27
-rw-r--r--packages/Keyguard/res/values-mn-rMN/strings.xml157
-rw-r--r--packages/Keyguard/res/values-mn/strings.xml138
-rw-r--r--packages/Keyguard/res/values-ms-rMY/strings.xml157
-rw-r--r--packages/Keyguard/res/values-nb/strings.xml27
-rw-r--r--packages/Keyguard/res/values-ne-rNP/strings.xml138
-rw-r--r--packages/Keyguard/res/values-ne/strings.xml138
-rw-r--r--packages/Keyguard/res/values-nl/strings.xml27
-rw-r--r--packages/Keyguard/res/values-pl/strings.xml27
-rw-r--r--packages/Keyguard/res/values-pt-rPT/strings.xml27
-rw-r--r--packages/Keyguard/res/values-pt/strings.xml27
-rw-r--r--packages/Keyguard/res/values-rm/strings.xml36
-rw-r--r--packages/Keyguard/res/values-ro/strings.xml27
-rw-r--r--packages/Keyguard/res/values-ru/strings.xml27
-rw-r--r--packages/Keyguard/res/values-si-rLK/strings.xml140
-rw-r--r--packages/Keyguard/res/values-si/strings.xml140
-rw-r--r--packages/Keyguard/res/values-sk/strings.xml27
-rw-r--r--packages/Keyguard/res/values-sl/strings.xml27
-rw-r--r--packages/Keyguard/res/values-sr/strings.xml29
-rw-r--r--packages/Keyguard/res/values-sv/strings.xml27
-rw-r--r--packages/Keyguard/res/values-sw/strings.xml27
-rw-r--r--packages/Keyguard/res/values-th/strings.xml27
-rw-r--r--packages/Keyguard/res/values-tl/strings.xml27
-rw-r--r--packages/Keyguard/res/values-tr/strings.xml27
-rw-r--r--packages/Keyguard/res/values-uk/strings.xml27
-rw-r--r--packages/Keyguard/res/values-vi/strings.xml27
-rw-r--r--packages/Keyguard/res/values-zh-rCN/strings.xml27
-rw-r--r--packages/Keyguard/res/values-zh-rHK/strings.xml157
-rw-r--r--packages/Keyguard/res/values-zh-rTW/strings.xml27
-rw-r--r--packages/Keyguard/res/values-zu/strings.xml27
-rw-r--r--packages/PrintSpooler/res/values-af/strings.xml77
-rw-r--r--packages/PrintSpooler/res/values-am/strings.xml77
-rw-r--r--packages/PrintSpooler/res/values-ar/strings.xml77
-rw-r--r--packages/PrintSpooler/res/values-be/arrays.xml33
-rw-r--r--packages/PrintSpooler/res/values-bg/strings.xml77
-rw-r--r--packages/PrintSpooler/res/values-ca/arrays.xml33
-rw-r--r--packages/PrintSpooler/res/values-ca/strings.xml77
-rw-r--r--packages/PrintSpooler/res/values-cs/strings.xml77
-rw-r--r--packages/PrintSpooler/res/values-da/strings.xml77
-rw-r--r--packages/PrintSpooler/res/values-de/strings.xml77
-rw-r--r--packages/PrintSpooler/res/values-el/strings.xml77
-rw-r--r--packages/PrintSpooler/res/values-en-rGB/strings.xml77
-rw-r--r--packages/PrintSpooler/res/values-en-rIN/strings.xml77
-rw-r--r--packages/PrintSpooler/res/values-es-rUS/arrays.xml33
-rw-r--r--packages/PrintSpooler/res/values-es-rUS/strings.xml77
-rw-r--r--packages/PrintSpooler/res/values-es/strings.xml77
-rw-r--r--packages/PrintSpooler/res/values-et-rEE/strings.xml77
-rw-r--r--packages/PrintSpooler/res/values-fa/strings.xml77
-rw-r--r--packages/PrintSpooler/res/values-fi/strings.xml77
-rw-r--r--packages/PrintSpooler/res/values-fr-rCA/strings.xml77
-rw-r--r--packages/PrintSpooler/res/values-fr/strings.xml77
-rw-r--r--packages/PrintSpooler/res/values-hi/strings.xml77
-rw-r--r--packages/PrintSpooler/res/values-hr/strings.xml77
-rw-r--r--packages/PrintSpooler/res/values-hu/strings.xml77
-rw-r--r--packages/PrintSpooler/res/values-hy-rAM/strings.xml77
-rw-r--r--packages/PrintSpooler/res/values-in/strings.xml77
-rw-r--r--packages/PrintSpooler/res/values-it/strings.xml77
-rw-r--r--packages/PrintSpooler/res/values-iw/strings.xml77
-rw-r--r--packages/PrintSpooler/res/values-ja/arrays.xml41
-rw-r--r--packages/PrintSpooler/res/values-ja/strings.xml77
-rw-r--r--packages/PrintSpooler/res/values-ka-rGE/strings.xml77
-rw-r--r--packages/PrintSpooler/res/values-km-rKH/strings.xml77
-rw-r--r--packages/PrintSpooler/res/values-ko/strings.xml77
-rw-r--r--packages/PrintSpooler/res/values-lo-rLA/strings.xml77
-rw-r--r--packages/PrintSpooler/res/values-lt/strings.xml77
-rw-r--r--packages/PrintSpooler/res/values-lv/strings.xml77
-rw-r--r--packages/PrintSpooler/res/values-mn-rMN/strings.xml77
-rw-r--r--packages/PrintSpooler/res/values-ms-rMY/strings.xml77
-rw-r--r--packages/PrintSpooler/res/values-nb/strings.xml77
-rw-r--r--packages/PrintSpooler/res/values-nl/strings.xml77
-rw-r--r--packages/PrintSpooler/res/values-pl/strings.xml77
-rw-r--r--packages/PrintSpooler/res/values-pt-rPT/strings.xml77
-rw-r--r--packages/PrintSpooler/res/values-pt/strings.xml77
-rw-r--r--packages/PrintSpooler/res/values-ro/strings.xml77
-rw-r--r--packages/PrintSpooler/res/values-ru/strings.xml77
-rw-r--r--packages/PrintSpooler/res/values-sk/strings.xml77
-rw-r--r--packages/PrintSpooler/res/values-sl/strings.xml77
-rw-r--r--packages/PrintSpooler/res/values-sr/strings.xml77
-rw-r--r--packages/PrintSpooler/res/values-sv/strings.xml77
-rw-r--r--packages/PrintSpooler/res/values-sw/strings.xml77
-rw-r--r--packages/PrintSpooler/res/values-th/strings.xml77
-rw-r--r--packages/PrintSpooler/res/values-tl/strings.xml77
-rw-r--r--packages/PrintSpooler/res/values-tr/strings.xml77
-rw-r--r--packages/PrintSpooler/res/values-uk/strings.xml77
-rw-r--r--packages/PrintSpooler/res/values-vi/strings.xml77
-rw-r--r--packages/PrintSpooler/res/values-zh-rCN/arrays.xml37
-rw-r--r--packages/PrintSpooler/res/values-zh-rCN/strings.xml77
-rw-r--r--packages/PrintSpooler/res/values-zh-rHK/strings.xml77
-rw-r--r--packages/PrintSpooler/res/values-zh-rTW/strings.xml77
-rw-r--r--packages/PrintSpooler/res/values-zu/strings.xml77
-rw-r--r--packages/SettingsProvider/res/values-az-rAZ/strings.xml23
-rw-r--r--packages/SettingsProvider/res/values-az/strings.xml23
-rw-r--r--packages/SettingsProvider/res/values-en-rIN/strings.xml23
-rw-r--r--packages/SettingsProvider/res/values-et-rEE/strings.xml23
-rw-r--r--packages/SettingsProvider/res/values-fr-rCA/strings.xml23
-rw-r--r--packages/SettingsProvider/res/values-hy-rAM/strings.xml23
-rw-r--r--packages/SettingsProvider/res/values-hy/strings.xml23
-rw-r--r--packages/SettingsProvider/res/values-ka-rGE/strings.xml23
-rw-r--r--packages/SettingsProvider/res/values-ka/strings.xml23
-rw-r--r--packages/SettingsProvider/res/values-km-rKH/strings.xml23
-rw-r--r--packages/SettingsProvider/res/values-km/strings.xml23
-rw-r--r--packages/SettingsProvider/res/values-lo-rLA/strings.xml23
-rw-r--r--packages/SettingsProvider/res/values-lo/strings.xml23
-rw-r--r--packages/SettingsProvider/res/values-mn-rMN/strings.xml23
-rw-r--r--packages/SettingsProvider/res/values-mn/strings.xml23
-rw-r--r--packages/SettingsProvider/res/values-ms-rMY/strings.xml23
-rw-r--r--packages/SettingsProvider/res/values-ne-rNP/strings.xml23
-rw-r--r--packages/SettingsProvider/res/values-ne/strings.xml23
-rw-r--r--packages/SettingsProvider/res/values-si-rLK/strings.xml23
-rw-r--r--packages/SettingsProvider/res/values-si/strings.xml23
-rw-r--r--packages/SettingsProvider/res/values-zh-rHK/strings.xml23
-rw-r--r--packages/Shell/res/values-az-rAZ/strings.xml24
-rw-r--r--packages/Shell/res/values-az/strings.xml24
-rw-r--r--packages/Shell/res/values-cs/strings.xml6
-rw-r--r--packages/Shell/res/values-da/strings.xml2
-rw-r--r--packages/Shell/res/values-en-rIN/strings.xml24
-rw-r--r--packages/Shell/res/values-et-rEE/strings.xml24
-rw-r--r--packages/Shell/res/values-fr-rCA/strings.xml24
-rw-r--r--packages/Shell/res/values-hi/strings.xml2
-rw-r--r--packages/Shell/res/values-hy-rAM/strings.xml24
-rw-r--r--packages/Shell/res/values-hy/strings.xml24
-rw-r--r--packages/Shell/res/values-iw/strings.xml2
-rw-r--r--packages/Shell/res/values-ka-rGE/strings.xml24
-rw-r--r--packages/Shell/res/values-ka/strings.xml24
-rw-r--r--packages/Shell/res/values-km-rKH/strings.xml24
-rw-r--r--packages/Shell/res/values-km/strings.xml24
-rw-r--r--packages/Shell/res/values-lo-rLA/strings.xml24
-rw-r--r--packages/Shell/res/values-lo/strings.xml24
-rw-r--r--packages/Shell/res/values-mn-rMN/strings.xml24
-rw-r--r--packages/Shell/res/values-mn/strings.xml24
-rw-r--r--packages/Shell/res/values-ms-rMY/strings.xml24
-rw-r--r--packages/Shell/res/values-ne-rNP/strings.xml24
-rw-r--r--packages/Shell/res/values-ne/strings.xml24
-rw-r--r--packages/Shell/res/values-si-rLK/strings.xml24
-rw-r--r--packages/Shell/res/values-si/strings.xml24
-rw-r--r--packages/Shell/res/values-zh-rHK/strings.xml24
-rw-r--r--packages/SystemUI/proguard.flags1
-rw-r--r--packages/SystemUI/res/values-af/strings.xml22
-rw-r--r--packages/SystemUI/res/values-am/strings.xml16
-rw-r--r--packages/SystemUI/res/values-ar/strings.xml94
-rw-r--r--packages/SystemUI/res/values-az-land/strings.xml23
-rw-r--r--packages/SystemUI/res/values-az-rAZ-land/strings.xml23
-rw-r--r--packages/SystemUI/res/values-az-rAZ/strings.xml206
-rw-r--r--packages/SystemUI/res/values-az/strings.xml208
-rw-r--r--packages/SystemUI/res/values-be/strings.xml23
-rw-r--r--packages/SystemUI/res/values-bg/strings.xml22
-rw-r--r--packages/SystemUI/res/values-ca/strings.xml18
-rw-r--r--packages/SystemUI/res/values-cs/strings.xml22
-rw-r--r--packages/SystemUI/res/values-da/strings.xml20
-rw-r--r--packages/SystemUI/res/values-de/strings.xml22
-rw-r--r--packages/SystemUI/res/values-el/strings.xml16
-rw-r--r--packages/SystemUI/res/values-en-rGB/strings.xml16
-rw-r--r--packages/SystemUI/res/values-en-rIN-land/strings.xml23
-rw-r--r--packages/SystemUI/res/values-en-rIN/strings.xml207
-rw-r--r--packages/SystemUI/res/values-es-rUS/strings.xml22
-rw-r--r--packages/SystemUI/res/values-es/strings.xml16
-rw-r--r--packages/SystemUI/res/values-et-rEE-land/strings.xml23
-rw-r--r--packages/SystemUI/res/values-et-rEE/strings.xml207
-rw-r--r--packages/SystemUI/res/values-et/strings.xml3
-rw-r--r--packages/SystemUI/res/values-fa/strings.xml94
-rw-r--r--packages/SystemUI/res/values-fi/strings.xml16
-rw-r--r--packages/SystemUI/res/values-fr-rCA-land/strings.xml23
-rw-r--r--packages/SystemUI/res/values-fr-rCA/strings.xml209
-rw-r--r--packages/SystemUI/res/values-fr/strings.xml22
-rw-r--r--packages/SystemUI/res/values-hi/strings.xml48
-rw-r--r--packages/SystemUI/res/values-hr/strings.xml16
-rw-r--r--packages/SystemUI/res/values-hu/strings.xml16
-rw-r--r--packages/SystemUI/res/values-hy-land/strings.xml23
-rw-r--r--packages/SystemUI/res/values-hy-rAM-land/strings.xml23
-rw-r--r--packages/SystemUI/res/values-hy-rAM/strings.xml207
-rw-r--r--packages/SystemUI/res/values-hy/strings.xml204
-rw-r--r--packages/SystemUI/res/values-in/strings.xml22
-rw-r--r--packages/SystemUI/res/values-it/strings.xml22
-rw-r--r--packages/SystemUI/res/values-iw/strings.xml122
-rw-r--r--packages/SystemUI/res/values-ja/strings.xml16
-rw-r--r--packages/SystemUI/res/values-ka-land/strings.xml23
-rw-r--r--packages/SystemUI/res/values-ka-rGE-land/strings.xml23
-rw-r--r--packages/SystemUI/res/values-ka-rGE/strings.xml207
-rw-r--r--packages/SystemUI/res/values-ka/strings.xml204
-rw-r--r--packages/SystemUI/res/values-km-land/strings.xml23
-rw-r--r--packages/SystemUI/res/values-km-rKH-land/strings.xml23
-rw-r--r--packages/SystemUI/res/values-km-rKH/strings.xml207
-rw-r--r--packages/SystemUI/res/values-km/strings.xml204
-rw-r--r--packages/SystemUI/res/values-ko/strings.xml22
-rw-r--r--packages/SystemUI/res/values-lo-land/strings.xml23
-rw-r--r--packages/SystemUI/res/values-lo-rLA-land/strings.xml23
-rw-r--r--packages/SystemUI/res/values-lo-rLA/strings.xml207
-rw-r--r--packages/SystemUI/res/values-lo/strings.xml204
-rw-r--r--packages/SystemUI/res/values-lt/strings.xml16
-rw-r--r--packages/SystemUI/res/values-lv/strings.xml16
-rw-r--r--packages/SystemUI/res/values-mn-land/strings.xml23
-rw-r--r--packages/SystemUI/res/values-mn-rMN-land/strings.xml23
-rw-r--r--packages/SystemUI/res/values-mn-rMN/strings.xml207
-rw-r--r--packages/SystemUI/res/values-mn/strings.xml208
-rw-r--r--packages/SystemUI/res/values-ms-rMY-land/strings.xml23
-rw-r--r--packages/SystemUI/res/values-ms-rMY/strings.xml207
-rw-r--r--packages/SystemUI/res/values-ms/strings.xml9
-rw-r--r--packages/SystemUI/res/values-nb/strings.xml16
-rw-r--r--packages/SystemUI/res/values-ne-land/strings.xml23
-rw-r--r--packages/SystemUI/res/values-ne-rNP-land/strings.xml23
-rw-r--r--packages/SystemUI/res/values-ne-rNP/strings.xml206
-rw-r--r--packages/SystemUI/res/values-ne/strings.xml204
-rw-r--r--packages/SystemUI/res/values-nl/strings.xml18
-rw-r--r--packages/SystemUI/res/values-pl/strings.xml16
-rw-r--r--packages/SystemUI/res/values-pt-rPT/strings.xml16
-rw-r--r--packages/SystemUI/res/values-pt/strings.xml22
-rw-r--r--packages/SystemUI/res/values-rm/strings.xml22
-rw-r--r--packages/SystemUI/res/values-ro/strings.xml22
-rw-r--r--packages/SystemUI/res/values-ru/strings.xml22
-rw-r--r--packages/SystemUI/res/values-si-land/strings.xml23
-rw-r--r--packages/SystemUI/res/values-si-rLK-land/strings.xml23
-rw-r--r--packages/SystemUI/res/values-si-rLK/strings.xml206
-rw-r--r--packages/SystemUI/res/values-si/strings.xml204
-rw-r--r--packages/SystemUI/res/values-sk/strings.xml16
-rw-r--r--packages/SystemUI/res/values-sl/strings.xml16
-rw-r--r--packages/SystemUI/res/values-sr/strings.xml16
-rw-r--r--packages/SystemUI/res/values-sv/strings.xml16
-rw-r--r--packages/SystemUI/res/values-sw/strings.xml26
-rw-r--r--packages/SystemUI/res/values-th/strings.xml16
-rw-r--r--packages/SystemUI/res/values-tl/strings.xml16
-rw-r--r--packages/SystemUI/res/values-tr/strings.xml22
-rw-r--r--packages/SystemUI/res/values-uk/strings.xml16
-rw-r--r--packages/SystemUI/res/values-vi/strings.xml16
-rw-r--r--packages/SystemUI/res/values-zh-rCN/strings.xml32
-rw-r--r--packages/SystemUI/res/values-zh-rHK-land/strings.xml23
-rw-r--r--packages/SystemUI/res/values-zh-rHK/strings.xml209
-rw-r--r--packages/SystemUI/res/values-zh-rTW/strings.xml16
-rw-r--r--packages/SystemUI/res/values-zu/strings.xml28
-rw-r--r--packages/SystemUI/res/values/strings.xml6
-rw-r--r--packages/SystemUI/src/com/android/systemui/ImageWallpaper.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettings.java135
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettingsModel.java207
-rw-r--r--packages/VpnDialogs/res/values-ar/strings.xml4
-rw-r--r--packages/VpnDialogs/res/values-az-rAZ/strings.xml30
-rw-r--r--packages/VpnDialogs/res/values-az/strings.xml30
-rw-r--r--packages/VpnDialogs/res/values-en-rIN/strings.xml30
-rw-r--r--packages/VpnDialogs/res/values-et-rEE/strings.xml30
-rw-r--r--packages/VpnDialogs/res/values-fa/strings.xml4
-rw-r--r--packages/VpnDialogs/res/values-fr-rCA/strings.xml30
-rw-r--r--packages/VpnDialogs/res/values-hi/strings.xml4
-rw-r--r--packages/VpnDialogs/res/values-hy-rAM/strings.xml30
-rw-r--r--packages/VpnDialogs/res/values-hy/strings.xml30
-rw-r--r--packages/VpnDialogs/res/values-iw/strings.xml8
-rw-r--r--packages/VpnDialogs/res/values-ka-rGE/strings.xml30
-rw-r--r--packages/VpnDialogs/res/values-ka/strings.xml30
-rw-r--r--packages/VpnDialogs/res/values-km-rKH/strings.xml30
-rw-r--r--packages/VpnDialogs/res/values-km/strings.xml30
-rw-r--r--packages/VpnDialogs/res/values-lo-rLA/strings.xml30
-rw-r--r--packages/VpnDialogs/res/values-lo/strings.xml30
-rw-r--r--packages/VpnDialogs/res/values-mn-rMN/strings.xml30
-rw-r--r--packages/VpnDialogs/res/values-mn/strings.xml30
-rw-r--r--packages/VpnDialogs/res/values-ms-rMY/strings.xml30
-rw-r--r--packages/VpnDialogs/res/values-nb/strings.xml4
-rw-r--r--packages/VpnDialogs/res/values-ne-rNP/strings.xml30
-rw-r--r--packages/VpnDialogs/res/values-ne/strings.xml30
-rw-r--r--packages/VpnDialogs/res/values-si-rLK/strings.xml30
-rw-r--r--packages/VpnDialogs/res/values-si/strings.xml30
-rw-r--r--packages/VpnDialogs/res/values-zh-rHK/strings.xml30
-rw-r--r--policy/src/com/android/internal/policy/impl/PhoneWindowManager.java13
-rw-r--r--services/input/Android.mk2
-rw-r--r--services/input/EventHub.cpp66
-rw-r--r--services/input/EventHub.h8
-rw-r--r--services/input/InputReader.cpp14
-rw-r--r--services/input/InputReader.h2
-rw-r--r--services/input/SpriteController.cpp4
-rw-r--r--services/java/com/android/server/BackupManagerService.java1
-rw-r--r--services/java/com/android/server/BatteryService.java13
-rw-r--r--services/java/com/android/server/ConnectivityService.java64
-rw-r--r--services/java/com/android/server/InputMethodManagerService.java229
-rw-r--r--services/java/com/android/server/NetworkManagementService.java23
-rw-r--r--services/java/com/android/server/WallpaperManagerService.java2
-rw-r--r--services/java/com/android/server/accessibility/AccessibilityManagerService.java265
-rw-r--r--services/java/com/android/server/am/ActivityManagerService.java20
-rw-r--r--services/java/com/android/server/am/ActivityRecord.java1
-rw-r--r--services/java/com/android/server/am/ActivityStack.java56
-rw-r--r--services/java/com/android/server/am/ProcessList.java135
-rw-r--r--services/java/com/android/server/connectivity/Tethering.java11
-rw-r--r--services/java/com/android/server/content/ContentService.java300
-rw-r--r--services/java/com/android/server/content/SyncManager.java1015
-rw-r--r--services/java/com/android/server/content/SyncOperation.java214
-rw-r--r--services/java/com/android/server/content/SyncQueue.java134
-rw-r--r--services/java/com/android/server/content/SyncStorageEngine.java1319
-rw-r--r--services/java/com/android/server/display/LocalDisplayAdapter.java6
-rw-r--r--services/java/com/android/server/display/LogicalDisplay.java3
-rw-r--r--services/java/com/android/server/firewall/IntentFirewall.java10
-rw-r--r--services/java/com/android/server/wifi/WifiService.java5
-rw-r--r--services/java/com/android/server/wm/WindowManagerService.java41
-rw-r--r--services/tests/servicestests/src/com/android/server/NetworkManagementServiceTest.java3
-rw-r--r--services/tests/servicestests/src/com/android/server/content/SyncStorageEngineTest.java343
-rw-r--r--test-runner/src/android/test/ServiceTestCase.java1
-rw-r--r--tests/BiDiTests/src/com/android/bidi/BiDiTestGridLayoutCodeLtr.java20
-rw-r--r--tests/BiDiTests/src/com/android/bidi/BiDiTestGridLayoutCodeRtl.java20
-rw-r--r--tests/GridLayoutTest/src/com/android/test/layout/AbstractLayoutTest.java8
-rw-r--r--tests/GridLayoutTest/src/com/android/test/layout/AlignmentTest.java14
-rw-r--r--tests/GridLayoutTest/src/com/android/test/layout/GridLayoutTest.java5
-rw-r--r--tests/GridLayoutTest/src/com/android/test/layout/LinearLayoutTest.java4
-rw-r--r--tests/HwAccelerationTest/AndroidManifest.xml9
-rw-r--r--tests/HwAccelerationTest/src/com/android/test/hwui/ColorFiltersMutateActivity.java180
-rw-r--r--tools/aapt/AaptAssets.cpp2726
-rw-r--r--tools/aapt/AaptAssets.h633
-rw-r--r--tools/aapt/Android.mk103
-rw-r--r--tools/aapt/Bundle.h306
-rw-r--r--tools/aapt/CacheUpdater.h107
-rw-r--r--tools/aapt/Command.cpp2269
-rw-r--r--tools/aapt/CrunchCache.cpp104
-rw-r--r--tools/aapt/CrunchCache.h102
-rw-r--r--tools/aapt/DirectoryWalker.h98
-rw-r--r--tools/aapt/FileFinder.cpp98
-rw-r--r--tools/aapt/FileFinder.h80
-rw-r--r--tools/aapt/Images.cpp1386
-rw-r--r--tools/aapt/Images.h26
-rw-r--r--tools/aapt/Main.cpp651
-rw-r--r--tools/aapt/Main.h63
-rw-r--r--tools/aapt/NOTICE190
-rw-r--r--tools/aapt/Package.cpp505
-rw-r--r--tools/aapt/Resource.cpp2651
-rw-r--r--tools/aapt/ResourceFilter.cpp112
-rw-r--r--tools/aapt/ResourceFilter.h33
-rw-r--r--tools/aapt/ResourceIdCache.cpp107
-rw-r--r--tools/aapt/ResourceIdCache.h30
-rw-r--r--tools/aapt/ResourceTable.cpp3966
-rw-r--r--tools/aapt/ResourceTable.h557
-rw-r--r--tools/aapt/SourcePos.cpp171
-rw-r--r--tools/aapt/SourcePos.h28
-rw-r--r--tools/aapt/StringPool.cpp574
-rw-r--r--tools/aapt/StringPool.h183
-rw-r--r--tools/aapt/WorkQueue.cpp171
-rw-r--r--tools/aapt/WorkQueue.h119
-rw-r--r--tools/aapt/XMLNode.cpp1510
-rw-r--r--tools/aapt/XMLNode.h202
-rw-r--r--tools/aapt/ZipEntry.cpp696
-rw-r--r--tools/aapt/ZipEntry.h345
-rw-r--r--tools/aapt/ZipFile.cpp1297
-rw-r--r--tools/aapt/ZipFile.h270
-rw-r--r--tools/aapt/printapk.cpp127
-rw-r--r--tools/aapt/pseudolocalize.cpp119
-rw-r--r--tools/aapt/pseudolocalize.h9
-rw-r--r--tools/aapt/qsort_r_compat.c90
-rw-r--r--tools/aapt/qsort_r_compat.h39
-rw-r--r--tools/aapt/tests/CrunchCache_test.cpp97
-rw-r--r--tools/aapt/tests/FileFinder_test.cpp101
-rw-r--r--tools/aapt/tests/MockCacheUpdater.h40
-rw-r--r--tools/aapt/tests/MockDirectoryWalker.h85
-rw-r--r--tools/aapt/tests/MockFileFinder.h55
-rw-r--r--tools/aapt/tests/plurals/AndroidManifest.xml5
-rw-r--r--tools/aapt/tests/plurals/res/values/strings.xml7
-rwxr-xr-xtools/aapt/tests/plurals/run.sh16
-rw-r--r--tools/aidl/AST.cpp912
-rw-r--r--tools/aidl/AST.h371
-rw-r--r--tools/aidl/Android.mk29
-rw-r--r--tools/aidl/NOTICE190
-rw-r--r--tools/aidl/Type.cpp1440
-rw-r--r--tools/aidl/Type.h542
-rw-r--r--tools/aidl/aidl.cpp1156
-rw-r--r--tools/aidl/aidl_language.cpp20
-rw-r--r--tools/aidl/aidl_language.h172
-rw-r--r--tools/aidl/aidl_language_l.l214
-rw-r--r--tools/aidl/aidl_language_y.y373
-rw-r--r--tools/aidl/generate_java.cpp99
-rw-r--r--tools/aidl/generate_java.h33
-rw-r--r--tools/aidl/generate_java_binder.cpp560
-rw-r--r--tools/aidl/generate_java_rpc.cpp1001
-rw-r--r--tools/aidl/options.cpp154
-rw-r--r--tools/aidl/options.h36
-rw-r--r--tools/aidl/options_test.cpp291
-rw-r--r--tools/aidl/search_path.cpp57
-rw-r--r--tools/aidl/search_path.h23
-rw-r--r--tools/layoutlib/.gitignore1
-rw-r--r--tools/layoutlib/Android.mk65
-rw-r--r--tools/layoutlib/README4
-rw-r--r--tools/layoutlib/bridge/.classpath12
-rw-r--r--tools/layoutlib/bridge/.project17
-rw-r--r--tools/layoutlib/bridge/.settings/README.txt2
-rw-r--r--tools/layoutlib/bridge/.settings/org.eclipse.jdt.core.prefs93
-rw-r--r--tools/layoutlib/bridge/Android.mk39
-rw-r--r--tools/layoutlib/bridge/resources/bars/action_bar.xml7
-rw-r--r--tools/layoutlib/bridge/resources/bars/hdpi/ic_sysbar_back.pngbin1053 -> 0 bytes
-rw-r--r--tools/layoutlib/bridge/resources/bars/hdpi/ic_sysbar_home.pngbin1064 -> 0 bytes
-rw-r--r--tools/layoutlib/bridge/resources/bars/hdpi/ic_sysbar_recent.pngbin711 -> 0 bytes
-rw-r--r--tools/layoutlib/bridge/resources/bars/hdpi/stat_sys_battery_charge_anim100.pngbin1040 -> 0 bytes
-rw-r--r--tools/layoutlib/bridge/resources/bars/hdpi/stat_sys_wifi_signal_4_fully.pngbin2436 -> 0 bytes
-rw-r--r--tools/layoutlib/bridge/resources/bars/hdpi/status_bar_background.9.pngbin3233 -> 0 bytes
-rw-r--r--tools/layoutlib/bridge/resources/bars/ldrtl-hdpi/ic_sysbar_back.pngbin904 -> 0 bytes
-rw-r--r--tools/layoutlib/bridge/resources/bars/ldrtl-hdpi/ic_sysbar_recent.pngbin533 -> 0 bytes
-rw-r--r--tools/layoutlib/bridge/resources/bars/ldrtl-mdpi/ic_sysbar_back.pngbin617 -> 0 bytes
-rw-r--r--tools/layoutlib/bridge/resources/bars/ldrtl-mdpi/ic_sysbar_recent.pngbin423 -> 0 bytes
-rw-r--r--tools/layoutlib/bridge/resources/bars/ldrtl-xhdpi/ic_sysbar_back.pngbin1250 -> 0 bytes
-rw-r--r--tools/layoutlib/bridge/resources/bars/ldrtl-xhdpi/ic_sysbar_recent.pngbin552 -> 0 bytes
-rw-r--r--tools/layoutlib/bridge/resources/bars/mdpi/ic_sysbar_back.pngbin774 -> 0 bytes
-rw-r--r--tools/layoutlib/bridge/resources/bars/mdpi/ic_sysbar_home.pngbin836 -> 0 bytes
-rw-r--r--tools/layoutlib/bridge/resources/bars/mdpi/ic_sysbar_recent.pngbin591 -> 0 bytes
-rw-r--r--tools/layoutlib/bridge/resources/bars/mdpi/stat_sys_battery_charge_anim100.pngbin762 -> 0 bytes
-rw-r--r--tools/layoutlib/bridge/resources/bars/mdpi/stat_sys_wifi_signal_4_fully.pngbin1430 -> 0 bytes
-rw-r--r--tools/layoutlib/bridge/resources/bars/mdpi/status_bar_background.9.pngbin204 -> 0 bytes
-rw-r--r--tools/layoutlib/bridge/resources/bars/navigation_bar.xml20
-rw-r--r--tools/layoutlib/bridge/resources/bars/status_bar.xml17
-rw-r--r--tools/layoutlib/bridge/resources/bars/title_bar.xml6
-rw-r--r--tools/layoutlib/bridge/resources/bars/xhdpi/ic_sysbar_back.pngbin1421 -> 0 bytes
-rw-r--r--tools/layoutlib/bridge/resources/bars/xhdpi/ic_sysbar_home.pngbin1421 -> 0 bytes
-rw-r--r--tools/layoutlib/bridge/resources/bars/xhdpi/ic_sysbar_recent.pngbin749 -> 0 bytes
-rw-r--r--tools/layoutlib/bridge/resources/bars/xhdpi/stat_sys_battery_charge_anim100.pngbin1332 -> 0 bytes
-rw-r--r--tools/layoutlib/bridge/resources/bars/xhdpi/stat_sys_wifi_signal_4_fully.pngbin3485 -> 0 bytes
-rw-r--r--tools/layoutlib/bridge/src/android/animation/AnimationThread.java177
-rw-r--r--tools/layoutlib/bridge/src/android/animation/PropertyValuesHolder_Delegate.java59
-rw-r--r--tools/layoutlib/bridge/src/android/app/Fragment_Delegate.java104
-rw-r--r--tools/layoutlib/bridge/src/android/content/res/BridgeAssetManager.java53
-rw-r--r--tools/layoutlib/bridge/src/android/content/res/BridgeResources.java695
-rw-r--r--tools/layoutlib/bridge/src/android/content/res/BridgeTypedArray.java908
-rw-r--r--tools/layoutlib/bridge/src/android/content/res/Resources_Theme_Delegate.java67
-rw-r--r--tools/layoutlib/bridge/src/android/content/res/TypedArray_Delegate.java30
-rw-r--r--tools/layoutlib/bridge/src/android/graphics/AvoidXfermode_Delegate.java70
-rw-r--r--tools/layoutlib/bridge/src/android/graphics/BidiRenderer.java215
-rw-r--r--tools/layoutlib/bridge/src/android/graphics/BitmapFactory_Delegate.java184
-rw-r--r--tools/layoutlib/bridge/src/android/graphics/BitmapShader_Delegate.java252
-rw-r--r--tools/layoutlib/bridge/src/android/graphics/Bitmap_Delegate.java659
-rw-r--r--tools/layoutlib/bridge/src/android/graphics/BlurMaskFilter_Delegate.java64
-rw-r--r--tools/layoutlib/bridge/src/android/graphics/Canvas_Delegate.java1289
-rw-r--r--tools/layoutlib/bridge/src/android/graphics/ColorFilter_Delegate.java64
-rw-r--r--tools/layoutlib/bridge/src/android/graphics/ColorMatrixColorFilter_Delegate.java70
-rw-r--r--tools/layoutlib/bridge/src/android/graphics/ComposePathEffect_Delegate.java71
-rw-r--r--tools/layoutlib/bridge/src/android/graphics/ComposeShader_Delegate.java97
-rw-r--r--tools/layoutlib/bridge/src/android/graphics/CornerPathEffect_Delegate.java71
-rw-r--r--tools/layoutlib/bridge/src/android/graphics/DashPathEffect_Delegate.java89
-rw-r--r--tools/layoutlib/bridge/src/android/graphics/DiscretePathEffect_Delegate.java71
-rw-r--r--tools/layoutlib/bridge/src/android/graphics/DrawFilter_Delegate.java64
-rw-r--r--tools/layoutlib/bridge/src/android/graphics/EmbossMaskFilter_Delegate.java65
-rw-r--r--tools/layoutlib/bridge/src/android/graphics/Gradient_Delegate.java212
-rw-r--r--tools/layoutlib/bridge/src/android/graphics/LayerRasterizer_Delegate.java69
-rw-r--r--tools/layoutlib/bridge/src/android/graphics/LightingColorFilter_Delegate.java70
-rw-r--r--tools/layoutlib/bridge/src/android/graphics/LinearGradient_Delegate.java240
-rw-r--r--tools/layoutlib/bridge/src/android/graphics/MaskFilter_Delegate.java64
-rw-r--r--tools/layoutlib/bridge/src/android/graphics/Matrix_Delegate.java1129
-rw-r--r--tools/layoutlib/bridge/src/android/graphics/NinePatch_Delegate.java247
-rw-r--r--tools/layoutlib/bridge/src/android/graphics/PaintFlagsDrawFilter_Delegate.java64
-rw-r--r--tools/layoutlib/bridge/src/android/graphics/Paint_Delegate.java1208
-rw-r--r--tools/layoutlib/bridge/src/android/graphics/PathDashPathEffect_Delegate.java72
-rw-r--r--tools/layoutlib/bridge/src/android/graphics/PathEffect_Delegate.java69
-rw-r--r--tools/layoutlib/bridge/src/android/graphics/Path_Delegate.java815
-rw-r--r--tools/layoutlib/bridge/src/android/graphics/PixelXorXfermode_Delegate.java70
-rw-r--r--tools/layoutlib/bridge/src/android/graphics/PorterDuffColorFilter_Delegate.java71
-rw-r--r--tools/layoutlib/bridge/src/android/graphics/PorterDuffXfermode_Delegate.java140
-rw-r--r--tools/layoutlib/bridge/src/android/graphics/RadialGradient_Delegate.java215
-rw-r--r--tools/layoutlib/bridge/src/android/graphics/Rasterizer_Delegate.java64
-rw-r--r--tools/layoutlib/bridge/src/android/graphics/Region_Delegate.java484
-rw-r--r--tools/layoutlib/bridge/src/android/graphics/Shader_Delegate.java105
-rw-r--r--tools/layoutlib/bridge/src/android/graphics/SumPathEffect_Delegate.java71
-rw-r--r--tools/layoutlib/bridge/src/android/graphics/SweepGradient_Delegate.java222
-rw-r--r--tools/layoutlib/bridge/src/android/graphics/Typeface_Accessor.java27
-rw-r--r--tools/layoutlib/bridge/src/android/graphics/Typeface_Delegate.java211
-rw-r--r--tools/layoutlib/bridge/src/android/graphics/Xfermode_Delegate.java69
-rw-r--r--tools/layoutlib/bridge/src/android/os/Build_Delegate.java48
-rw-r--r--tools/layoutlib/bridge/src/android/os/HandlerThread_Delegate.java80
-rw-r--r--tools/layoutlib/bridge/src/android/os/Handler_Delegate.java57
-rw-r--r--tools/layoutlib/bridge/src/android/os/Looper_Accessor.java47
-rw-r--r--tools/layoutlib/bridge/src/android/os/ServiceManager.java72
-rw-r--r--tools/layoutlib/bridge/src/android/os/SystemClock_Delegate.java106
-rw-r--r--tools/layoutlib/bridge/src/android/text/AndroidBidi_Delegate.java60
-rw-r--r--tools/layoutlib/bridge/src/android/text/format/DateFormat_Delegate.java37
-rw-r--r--tools/layoutlib/bridge/src/android/text/format/Time_Delegate.java61
-rw-r--r--tools/layoutlib/bridge/src/android/util/BridgeXmlPullAttributes.java283
-rw-r--r--tools/layoutlib/bridge/src/android/util/FloatMath_Delegate.java132
-rw-r--r--tools/layoutlib/bridge/src/android/util/Log_Delegate.java51
-rw-r--r--tools/layoutlib/bridge/src/android/util/LruCache.java391
-rw-r--r--tools/layoutlib/bridge/src/android/view/AttachInfo_Accessor.java48
-rw-r--r--tools/layoutlib/bridge/src/android/view/BridgeInflater.java272
-rw-r--r--tools/layoutlib/bridge/src/android/view/Choreographer_Delegate.java33
-rw-r--r--tools/layoutlib/bridge/src/android/view/Display_Delegate.java36
-rw-r--r--tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java501
-rw-r--r--tools/layoutlib/bridge/src/android/view/LayoutInflater_Delegate.java199
-rw-r--r--tools/layoutlib/bridge/src/android/view/SurfaceView.java112
-rw-r--r--tools/layoutlib/bridge/src/android/view/ViewConfiguration_Accessor.java29
-rw-r--r--tools/layoutlib/bridge/src/android/view/ViewRootImpl_Delegate.java34
-rw-r--r--tools/layoutlib/bridge/src/android/view/View_Delegate.java34
-rw-r--r--tools/layoutlib/bridge/src/android/view/WindowManagerGlobal_Delegate.java43
-rw-r--r--tools/layoutlib/bridge/src/android/view/accessibility/AccessibilityManager.java137
-rw-r--r--tools/layoutlib/bridge/src/android/view/inputmethod/InputMethodManager_Accessor.java27
-rw-r--r--tools/layoutlib/bridge/src/android/view/inputmethod/InputMethodManager_Delegate.java49
-rw-r--r--tools/layoutlib/bridge/src/android/webkit/WebView.java238
-rw-r--r--tools/layoutlib/bridge/src/com/android/internal/policy/PolicyManager.java72
-rw-r--r--tools/layoutlib/bridge/src/com/android/internal/textservice/ITextServicesManager_Stub_Delegate.java111
-rw-r--r--tools/layoutlib/bridge/src/com/android/internal/util/XmlUtils_Delegate.java74
-rw-r--r--tools/layoutlib/bridge/src/com/android/layoutlib/bridge/Bridge.java639
-rw-r--r--tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeConstants.java51
-rw-r--r--tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeRenderSession.java196
-rw-r--r--tools/layoutlib/bridge/src/com/android/layoutlib/bridge/MockView.java47
-rw-r--r--tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContentProvider.java147
-rw-r--r--tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContentResolver.java120
-rw-r--r--tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java1437
-rw-r--r--tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeIInputMethodManager.java230
-rw-r--r--tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeLayoutParamsMapAttributes.java164
-rw-r--r--tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgePowerManager.java133
-rw-r--r--tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindow.java107
-rw-r--r--tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindowSession.java209
-rw-r--r--tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeXmlBlockParser.java494
-rw-r--r--tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/view/WindowManagerImpl.java66
-rw-r--r--tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/CustomBar.java323
-rw-r--r--tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/FakeActionBar.java48
-rw-r--r--tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/NavigationBar.java57
-rw-r--r--tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/StatusBar.java55
-rw-r--r--tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/TitleBar.java47
-rw-r--r--tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/DelegateManager.java146
-rw-r--r--tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/FontLoader.java396
-rw-r--r--tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/GcSnapshot.java803
-rw-r--r--tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/ParserFactory.java142
-rw-r--r--tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/PlayAnimationThread.java49
-rw-r--r--tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderAction.java390
-rw-r--r--tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderDrawable.java133
-rw-r--r--tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderSessionImpl.java1486
-rw-r--r--tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/ResourceHelper.java493
-rw-r--r--tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/Stack.java70
-rw-r--r--tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/binding/AdapterHelper.java148
-rw-r--r--tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/binding/AdapterItem.java74
-rw-r--r--tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/binding/FakeAdapter.java133
-rw-r--r--tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/binding/FakeExpandableAdapter.java236
-rw-r--r--tools/layoutlib/bridge/src/com/android/layoutlib/bridge/util/Debug.java23
-rw-r--r--tools/layoutlib/bridge/src/com/android/layoutlib/bridge/util/DynamicIdMap.java76
-rw-r--r--tools/layoutlib/bridge/src/com/android/layoutlib/bridge/util/SparseWeakArray.java376
-rw-r--r--tools/layoutlib/bridge/src/com/google/android/maps/MapView.java121
-rw-r--r--tools/layoutlib/bridge/src/libcore/icu/DateIntervalFormat_Delegate.java70
-rw-r--r--tools/layoutlib/bridge/src/libcore/icu/ICU_Delegate.java234
-rw-r--r--tools/layoutlib/bridge/tests/.classpath11
-rw-r--r--tools/layoutlib/bridge/tests/.project17
-rw-r--r--tools/layoutlib/bridge/tests/Android.mk32
-rw-r--r--tools/layoutlib/bridge/tests/res/com/android/layoutlib/testdata/layout1.xml49
-rw-r--r--tools/layoutlib/bridge/tests/src/android/graphics/Matrix_DelegateTest.java58
-rw-r--r--tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/TestDelegates.java197
-rw-r--r--tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/android/BridgeXmlBlockParserTest.java121
-rw-r--r--tools/layoutlib/create/.classpath9
-rw-r--r--tools/layoutlib/create/.project17
-rw-r--r--tools/layoutlib/create/.settings/README.txt2
-rw-r--r--tools/layoutlib/create/.settings/org.eclipse.jdt.core.prefs93
-rw-r--r--tools/layoutlib/create/Android.mk28
-rw-r--r--tools/layoutlib/create/README.txt271
-rw-r--r--tools/layoutlib/create/manifest.txt1
-rw-r--r--tools/layoutlib/create/src/com/android/tools/layoutlib/annotations/LayoutlibDelegate.java27
-rw-r--r--tools/layoutlib/create/src/com/android/tools/layoutlib/annotations/Nullable.java35
-rw-r--r--tools/layoutlib/create/src/com/android/tools/layoutlib/annotations/VisibleForTesting.java50
-rw-r--r--tools/layoutlib/create/src/com/android/tools/layoutlib/create/AbstractClassAdapter.java418
-rw-r--r--tools/layoutlib/create/src/com/android/tools/layoutlib/create/AsmAnalyzer.java854
-rw-r--r--tools/layoutlib/create/src/com/android/tools/layoutlib/create/AsmGenerator.java384
-rw-r--r--tools/layoutlib/create/src/com/android/tools/layoutlib/create/ClassHasNativeVisitor.java102
-rw-r--r--tools/layoutlib/create/src/com/android/tools/layoutlib/create/CreateInfo.java243
-rw-r--r--tools/layoutlib/create/src/com/android/tools/layoutlib/create/DelegateClassAdapter.java133
-rw-r--r--tools/layoutlib/create/src/com/android/tools/layoutlib/create/DelegateMethodAdapter2.java461
-rw-r--r--tools/layoutlib/create/src/com/android/tools/layoutlib/create/DependencyFinder.java787
-rw-r--r--tools/layoutlib/create/src/com/android/tools/layoutlib/create/ICreateInfo.java72
-rw-r--r--tools/layoutlib/create/src/com/android/tools/layoutlib/create/Log.java72
-rw-r--r--tools/layoutlib/create/src/com/android/tools/layoutlib/create/LogAbortException.java32
-rw-r--r--tools/layoutlib/create/src/com/android/tools/layoutlib/create/Main.java226
-rw-r--r--tools/layoutlib/create/src/com/android/tools/layoutlib/create/MethodAdapter.java97
-rw-r--r--tools/layoutlib/create/src/com/android/tools/layoutlib/create/MethodListener.java76
-rw-r--r--tools/layoutlib/create/src/com/android/tools/layoutlib/create/OverrideMethod.java151
-rw-r--r--tools/layoutlib/create/src/com/android/tools/layoutlib/create/RefactorClassAdapter.java49
-rw-r--r--tools/layoutlib/create/src/com/android/tools/layoutlib/create/RenameClassAdapter.java87
-rw-r--r--tools/layoutlib/create/src/com/android/tools/layoutlib/create/StubMethodAdapter.java376
-rw-r--r--tools/layoutlib/create/src/com/android/tools/layoutlib/create/TransformClassAdapter.java183
-rw-r--r--tools/layoutlib/create/src/com/android/tools/layoutlib/java/AutoCloseable.java31
-rw-r--r--tools/layoutlib/create/src/com/android/tools/layoutlib/java/Charsets.java133
-rw-r--r--tools/layoutlib/create/src/com/android/tools/layoutlib/java/IntegralToString.java537
-rw-r--r--tools/layoutlib/create/src/com/android/tools/layoutlib/java/Objects.java132
-rw-r--r--tools/layoutlib/create/src/com/android/tools/layoutlib/java/UnsafeByteSequence.java81
-rw-r--r--tools/layoutlib/create/tests/com/android/tools/layoutlib/create/AsmAnalyzerTest.java236
-rw-r--r--tools/layoutlib/create/tests/com/android/tools/layoutlib/create/AsmGeneratorTest.java330
-rw-r--r--tools/layoutlib/create/tests/com/android/tools/layoutlib/create/ClassHasNativeVisitorTest.java102
-rw-r--r--tools/layoutlib/create/tests/com/android/tools/layoutlib/create/DelegateClassAdapterTest.java463
-rw-r--r--tools/layoutlib/create/tests/com/android/tools/layoutlib/create/LogTest.java88
-rw-r--r--tools/layoutlib/create/tests/com/android/tools/layoutlib/create/MockLog.java43
-rw-r--r--tools/layoutlib/create/tests/com/android/tools/layoutlib/create/RenameClassAdapterTest.java116
-rw-r--r--tools/layoutlib/create/tests/com/android/tools/layoutlib/create/dataclass/ClassWithNative.java45
-rw-r--r--tools/layoutlib/create/tests/com/android/tools/layoutlib/create/dataclass/ClassWithNative_Delegate.java34
-rw-r--r--tools/layoutlib/create/tests/com/android/tools/layoutlib/create/dataclass/JavaClass.java22
-rw-r--r--tools/layoutlib/create/tests/com/android/tools/layoutlib/create/dataclass/OuterClass.java53
-rw-r--r--tools/layoutlib/create/tests/com/android/tools/layoutlib/create/dataclass/OuterClass_Delegate.java34
-rw-r--r--tools/layoutlib/create/tests/com/android/tools/layoutlib/create/dataclass/OuterClass_InnerClass_Delegate.java30
-rw-r--r--tools/layoutlib/create/tests/data/mock_android.jarbin9096 -> 0 bytes
-rw-r--r--tools/layoutlib/create/tests/mock_data/java/lang/JavaClass.java22
-rw-r--r--tools/layoutlib/create/tests/mock_data/mock_android/dummy/InnerTest.java91
-rw-r--r--tools/layoutlib/create/tests/mock_data/mock_android/view/View.java25
-rw-r--r--tools/layoutlib/create/tests/mock_data/mock_android/view/ViewGroup.java29
-rw-r--r--tools/layoutlib/create/tests/mock_data/mock_android/widget/LinearLayout.java27
-rw-r--r--tools/layoutlib/create/tests/mock_data/mock_android/widget/TableLayout.java27
-rw-r--r--tools/obbtool/Android.mk48
-rw-r--r--tools/obbtool/Main.cpp301
-rwxr-xr-xtools/obbtool/mkobb.sh281
-rw-r--r--tools/obbtool/pbkdf2gen.cpp78
-rw-r--r--tools/orientationplot/README.txt87
-rwxr-xr-xtools/orientationplot/orientationplot.py457
-rw-r--r--tools/preload/20080522.compiledbin11414749 -> 0 bytes
-rw-r--r--tools/preload/20090811.compiledbin15943336 -> 0 bytes
-rw-r--r--tools/preload/20100223.compiledbin21723744 -> 0 bytes
-rw-r--r--tools/preload/Android.mk23
-rw-r--r--tools/preload/Compile.java73
-rw-r--r--tools/preload/LoadedClass.java130
-rw-r--r--tools/preload/MemoryUsage.java298
-rw-r--r--tools/preload/Operation.java136
-rw-r--r--tools/preload/Policy.java89
-rw-r--r--tools/preload/PrintCsv.java127
-rw-r--r--tools/preload/PrintHtmlDiff.java142
-rw-r--r--tools/preload/PrintPsTree.java46
-rw-r--r--tools/preload/Proc.java168
-rw-r--r--tools/preload/Record.java182
-rw-r--r--tools/preload/Root.java163
-rw-r--r--tools/preload/WritePreloadedClassFile.java155
-rw-r--r--tools/preload/loadclass/Android.mk9
-rw-r--r--tools/preload/loadclass/LoadClass.java84
-rw-r--r--tools/preload/preload.iml14
-rw-r--r--tools/preload/preload.ipr495
-rw-r--r--tools/preload/sorttable.js493
-rw-r--r--tools/validatekeymaps/Android.mk33
-rw-r--r--tools/validatekeymaps/Main.cpp147
-rwxr-xr-xtools/velocityplot/velocityplot.py289
-rw-r--r--wifi/java/android/net/wifi/IWifiManager.aidl2
-rw-r--r--wifi/java/android/net/wifi/WifiInfo.java12
-rw-r--r--wifi/java/android/net/wifi/WifiManager.java7
-rw-r--r--wifi/java/android/net/wifi/WifiMonitor.java865
-rw-r--r--wifi/java/android/net/wifi/WifiSsid.java13
-rw-r--r--wifi/java/android/net/wifi/WifiStateMachine.java51
-rw-r--r--wifi/java/android/net/wifi/WifiStateTracker.java8
-rw-r--r--wifi/java/android/net/wifi/p2p/WifiP2pService.java1
1309 files changed, 63977 insertions, 95614 deletions
diff --git a/Android.mk b/Android.mk
index f97849c..bcab276 100644
--- a/Android.mk
+++ b/Android.mk
@@ -31,6 +31,10 @@ framework_res_source_path := APPS/framework-res_intermediates/src
# So we first build the framework as a monolithic static library then split it
# up into smaller pieces.
# ============================================================
+
+# embedded builds use nothing in frameworks/base
+ifneq ($(ANDROID_BUILD_EMBEDDED),true)
+
include $(CLEAR_VARS)
# FRAMEWORKS_BASE_SUBDIRS comes from build/core/pathmap.mk
@@ -105,9 +109,9 @@ LOCAL_SRC_FILES += \
core/java/android/content/IIntentReceiver.aidl \
core/java/android/content/IIntentSender.aidl \
core/java/android/content/IOnPrimaryClipChangedListener.aidl \
- core/java/android/content/IAnonymousSyncAdapter.aidl \
core/java/android/content/ISyncAdapter.aidl \
core/java/android/content/ISyncContext.aidl \
+ core/java/android/content/ISyncServiceAdapter.aidl \
core/java/android/content/ISyncStatusObserver.aidl \
core/java/android/content/pm/IPackageDataObserver.aidl \
core/java/android/content/pm/IPackageDeleteObserver.aidl \
@@ -282,7 +286,7 @@ LOCAL_JAVA_LIBRARIES := bouncycastle conscrypt core core-junit ext okhttp
LOCAL_MODULE := framework-base
-LOCAL_JAR_EXCLUDE_FILES := none
+LOCAL_RMTYPEDEFS := true
include $(BUILD_STATIC_JAVA_LIBRARY)
@@ -939,3 +943,5 @@ include $(BUILD_JAVA_LIBRARY)
ifeq (,$(ONE_SHOT_MAKEFILE))
include $(call first-makefiles-under,$(LOCAL_PATH))
endif
+
+endif # ANDROID_BUILD_EMBEDDED
diff --git a/CleanSpec.mk b/CleanSpec.mk
index cfa8be9..2fa195c 100644
--- a/CleanSpec.mk
+++ b/CleanSpec.mk
@@ -171,6 +171,7 @@ $(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/framew
$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/framework-base_intermediates/src/core/java/android/print/)
$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/framework-base_intermediates/src/core/java/android/printservice/)
$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/framework-base_intermediates/src/packages/services/Proxy/)
+$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/framework-base_intermediates)
$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/framework-base_intermediates/src/core/java/android/print/IPrinterDiscoverySessionObserver.*)
$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/framework-base_intermediates/src/core/java/android/print/IPrinterDiscoverySessionClient.*)
$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/framework-base_intermediates/src/core/java/android/os/IBattery*)
diff --git a/api/current.txt b/api/current.txt
index 8e69592..9f80ef6 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -9,6 +9,7 @@ package android {
field public static final java.lang.String ACCESS_CHECKIN_PROPERTIES = "android.permission.ACCESS_CHECKIN_PROPERTIES";
field public static final java.lang.String ACCESS_COARSE_LOCATION = "android.permission.ACCESS_COARSE_LOCATION";
field public static final java.lang.String ACCESS_FINE_LOCATION = "android.permission.ACCESS_FINE_LOCATION";
+ field public static final java.lang.String ACCESS_INPUT_FLINGER = "android.permission.ACCESS_INPUT_FLINGER";
field public static final java.lang.String ACCESS_LOCATION_EXTRA_COMMANDS = "android.permission.ACCESS_LOCATION_EXTRA_COMMANDS";
field public static final java.lang.String ACCESS_MOCK_LOCATION = "android.permission.ACCESS_MOCK_LOCATION";
field public static final java.lang.String ACCESS_NETWORK_STATE = "android.permission.ACCESS_NETWORK_STATE";
@@ -497,6 +498,7 @@ package android {
field public static final int fastScrollOverlayPosition = 16843578; // 0x101033a
field public static final int fastScrollPreviewBackgroundLeft = 16843575; // 0x1010337
field public static final int fastScrollPreviewBackgroundRight = 16843576; // 0x1010338
+ field public static final int fastScrollStyle = 16843763; // 0x10103f3
field public static final int fastScrollTextColor = 16843609; // 0x1010359
field public static final int fastScrollThumbDrawable = 16843574; // 0x1010336
field public static final int fastScrollTrackDrawable = 16843577; // 0x1010339
@@ -522,6 +524,7 @@ package android {
field public static final int format12Hour = 16843722; // 0x10103ca
field public static final int format24Hour = 16843723; // 0x10103cb
field public static final int fragment = 16843491; // 0x10102e3
+ field public static final int fragmentBreadCrumbsStyle = 16843762; // 0x10103f2
field public static final int fragmentCloseEnterAnimation = 16843495; // 0x10102e7
field public static final int fragmentCloseExitAnimation = 16843496; // 0x10102e8
field public static final int fragmentFadeEnterAnimation = 16843497; // 0x10102e9
@@ -1863,6 +1866,8 @@ package android {
field public static final int Widget_DeviceDefault_DropDownItem_Spinner = 16974178; // 0x1030162
field public static final int Widget_DeviceDefault_EditText = 16974154; // 0x103014a
field public static final int Widget_DeviceDefault_ExpandableListView = 16974155; // 0x103014b
+ field public static final int Widget_DeviceDefault_FastScroll = 16974316; // 0x10301ec
+ field public static final int Widget_DeviceDefault_FragmentBreadCrumbs = 16974311; // 0x10301e7
field public static final int Widget_DeviceDefault_GridView = 16974156; // 0x103014c
field public static final int Widget_DeviceDefault_HorizontalScrollView = 16974171; // 0x103015b
field public static final int Widget_DeviceDefault_ImageButton = 16974157; // 0x103014d
@@ -1896,6 +1901,8 @@ package android {
field public static final int Widget_DeviceDefault_Light_DropDownItem_Spinner = 16974233; // 0x1030199
field public static final int Widget_DeviceDefault_Light_EditText = 16974206; // 0x103017e
field public static final int Widget_DeviceDefault_Light_ExpandableListView = 16974207; // 0x103017f
+ field public static final int Widget_DeviceDefault_Light_FastScroll = 16974317; // 0x10301ed
+ field public static final int Widget_DeviceDefault_Light_FragmentBreadCrumbs = 16974312; // 0x10301e8
field public static final int Widget_DeviceDefault_Light_GridView = 16974208; // 0x1030180
field public static final int Widget_DeviceDefault_Light_HorizontalScrollView = 16974226; // 0x1030192
field public static final int Widget_DeviceDefault_Light_ImageButton = 16974209; // 0x1030181
@@ -1952,6 +1959,7 @@ package android {
field public static final int Widget_DropDownItem_Spinner = 16973868; // 0x103002c
field public static final int Widget_EditText = 16973859; // 0x1030023
field public static final int Widget_ExpandableListView = 16973860; // 0x1030024
+ field public static final int Widget_FastScroll = 16974313; // 0x10301e9
field public static final int Widget_FragmentBreadCrumbs = 16973961; // 0x1030089
field public static final int Widget_Gallery = 16973877; // 0x1030035
field public static final int Widget_GridView = 16973874; // 0x1030032
@@ -1983,6 +1991,8 @@ package android {
field public static final int Widget_Holo_DropDownItem_Spinner = 16973995; // 0x10300ab
field public static final int Widget_Holo_EditText = 16973971; // 0x1030093
field public static final int Widget_Holo_ExpandableListView = 16973972; // 0x1030094
+ field public static final int Widget_Holo_FastScroll = 16974314; // 0x10301ea
+ field public static final int Widget_Holo_FragmentBreadCrumbs = 16974309; // 0x10301e5
field public static final int Widget_Holo_GridView = 16973973; // 0x1030095
field public static final int Widget_Holo_HorizontalScrollView = 16973988; // 0x10300a4
field public static final int Widget_Holo_ImageButton = 16973974; // 0x1030096
@@ -2016,6 +2026,8 @@ package android {
field public static final int Widget_Holo_Light_DropDownItem_Spinner = 16974041; // 0x10300d9
field public static final int Widget_Holo_Light_EditText = 16974014; // 0x10300be
field public static final int Widget_Holo_Light_ExpandableListView = 16974015; // 0x10300bf
+ field public static final int Widget_Holo_Light_FastScroll = 16974315; // 0x10301eb
+ field public static final int Widget_Holo_Light_FragmentBreadCrumbs = 16974310; // 0x10301e6
field public static final int Widget_Holo_Light_GridView = 16974016; // 0x10300c0
field public static final int Widget_Holo_Light_HorizontalScrollView = 16974034; // 0x10300d2
field public static final int Widget_Holo_Light_ImageButton = 16974017; // 0x10300c1
@@ -2434,11 +2446,23 @@ package android.animation {
method public java.lang.Object evaluate(float, java.lang.Object, java.lang.Object);
}
+ public class FloatArrayEvaluator implements android.animation.TypeEvaluator {
+ ctor public FloatArrayEvaluator();
+ ctor public FloatArrayEvaluator(float[]);
+ method public float[] evaluate(float, float[], float[]);
+ }
+
public class FloatEvaluator implements android.animation.TypeEvaluator {
ctor public FloatEvaluator();
method public java.lang.Float evaluate(float, java.lang.Number, java.lang.Number);
}
+ public class IntArrayEvaluator implements android.animation.TypeEvaluator {
+ ctor public IntArrayEvaluator();
+ ctor public IntArrayEvaluator(int[]);
+ method public int[] evaluate(float, int[], int[]);
+ }
+
public class IntEvaluator implements android.animation.TypeEvaluator {
ctor public IntEvaluator();
method public java.lang.Integer evaluate(float, java.lang.Integer, java.lang.Integer);
@@ -2507,12 +2531,19 @@ package android.animation {
ctor public ObjectAnimator();
method public java.lang.String getPropertyName();
method public java.lang.Object getTarget();
+ method public static android.animation.ObjectAnimator ofArgb(java.lang.Object, java.lang.String, int...);
+ method public static android.animation.ObjectAnimator ofArgb(T, android.util.Property<T, java.lang.Integer>, int...);
method public static android.animation.ObjectAnimator ofFloat(java.lang.Object, java.lang.String, float...);
method public static android.animation.ObjectAnimator ofFloat(T, android.util.Property<T, java.lang.Float>, float...);
method public static android.animation.ObjectAnimator ofInt(java.lang.Object, java.lang.String, int...);
method public static android.animation.ObjectAnimator ofInt(T, android.util.Property<T, java.lang.Integer>, int...);
+ method public static android.animation.ObjectAnimator ofMultiFloat(java.lang.Object, java.lang.String, float[][]);
+ method public static android.animation.ObjectAnimator ofMultiFloat(java.lang.Object, java.lang.String, android.animation.TypeConverter<T, float[]>, android.animation.TypeEvaluator<T>, T...);
+ method public static android.animation.ObjectAnimator ofMultiInt(java.lang.Object, java.lang.String, int[][]);
+ method public static android.animation.ObjectAnimator ofMultiInt(java.lang.Object, java.lang.String, android.animation.TypeConverter<T, int[]>, android.animation.TypeEvaluator<T>, T...);
method public static android.animation.ObjectAnimator ofObject(java.lang.Object, java.lang.String, android.animation.TypeEvaluator, java.lang.Object...);
method public static android.animation.ObjectAnimator ofObject(T, android.util.Property<T, V>, android.animation.TypeEvaluator<V>, V...);
+ method public static android.animation.ObjectAnimator ofObject(T, android.util.Property<T, P>, android.animation.TypeConverter<V, P>, android.animation.TypeEvaluator<V>, V...);
method public static android.animation.ObjectAnimator ofPropertyValuesHolder(java.lang.Object, android.animation.PropertyValuesHolder...);
method public void setAutoCancel(boolean);
method public void setProperty(android.util.Property);
@@ -2528,8 +2559,16 @@ package android.animation {
method public static android.animation.PropertyValuesHolder ofInt(android.util.Property<?, java.lang.Integer>, int...);
method public static android.animation.PropertyValuesHolder ofKeyframe(java.lang.String, android.animation.Keyframe...);
method public static android.animation.PropertyValuesHolder ofKeyframe(android.util.Property, android.animation.Keyframe...);
+ method public static android.animation.PropertyValuesHolder ofMultiFloat(java.lang.String, float[][]);
+ method public static android.animation.PropertyValuesHolder ofMultiFloat(java.lang.String, android.animation.TypeConverter<V, float[]>, android.animation.TypeEvaluator<V>, V...);
+ method public static android.animation.PropertyValuesHolder ofMultiFloat(java.lang.String, android.animation.TypeConverter<T, float[]>, android.animation.TypeEvaluator<T>, android.animation.Keyframe...);
+ method public static android.animation.PropertyValuesHolder ofMultiInt(java.lang.String, int[][]);
+ method public static android.animation.PropertyValuesHolder ofMultiInt(java.lang.String, android.animation.TypeConverter<V, int[]>, android.animation.TypeEvaluator<V>, V...);
+ method public static android.animation.PropertyValuesHolder ofMultiInt(java.lang.String, android.animation.TypeConverter<T, int[]>, android.animation.TypeEvaluator<T>, android.animation.Keyframe...);
method public static android.animation.PropertyValuesHolder ofObject(java.lang.String, android.animation.TypeEvaluator, java.lang.Object...);
method public static android.animation.PropertyValuesHolder ofObject(android.util.Property, android.animation.TypeEvaluator<V>, V...);
+ method public static android.animation.PropertyValuesHolder ofObject(android.util.Property<?, V>, android.animation.TypeConverter<T, V>, android.animation.TypeEvaluator<T>, T...);
+ method public void setConverter(android.animation.TypeConverter);
method public void setEvaluator(android.animation.TypeEvaluator);
method public void setFloatValues(float...);
method public void setIntValues(int...);
@@ -2541,6 +2580,7 @@ package android.animation {
public class RectEvaluator implements android.animation.TypeEvaluator {
ctor public RectEvaluator();
+ ctor public RectEvaluator(android.graphics.Rect);
method public android.graphics.Rect evaluate(float, android.graphics.Rect, android.graphics.Rect);
}
@@ -2557,6 +2597,12 @@ package android.animation {
method public abstract float getInterpolation(float);
}
+ public abstract class TypeConverter {
+ ctor public TypeConverter(java.lang.Class<T>, java.lang.Class<V>);
+ method public abstract V convert(T);
+ method public T convertBack(V);
+ }
+
public abstract interface TypeEvaluator {
method public abstract T evaluate(float, T, T);
}
@@ -2575,6 +2621,7 @@ package android.animation {
method public long getStartDelay();
method public android.animation.PropertyValuesHolder[] getValues();
method public boolean isRunning();
+ method public static android.animation.ValueAnimator ofArgb(int...);
method public static android.animation.ValueAnimator ofFloat(float...);
method public static android.animation.ValueAnimator ofInt(int...);
method public static android.animation.ValueAnimator ofObject(android.animation.TypeEvaluator, java.lang.Object...);
@@ -2607,6 +2654,12 @@ package android.animation {
package android.annotation {
+ public abstract class NonNull implements java.lang.annotation.Annotation {
+ }
+
+ public abstract class Nullable implements java.lang.annotation.Annotation {
+ }
+
public abstract class SuppressLint implements java.lang.annotation.Annotation {
}
@@ -3600,6 +3653,7 @@ package android.app {
ctor public FragmentBreadCrumbs(android.content.Context);
ctor public FragmentBreadCrumbs(android.content.Context, android.util.AttributeSet);
ctor public FragmentBreadCrumbs(android.content.Context, android.util.AttributeSet, int);
+ ctor public FragmentBreadCrumbs(android.content.Context, android.util.AttributeSet, int, int);
method public void onBackStackChanged();
method protected void onLayout(boolean, int, int, int, int);
method public void setActivity(android.app.Activity);
@@ -3886,6 +3940,7 @@ package android.app {
ctor public MediaRouteButton(android.content.Context);
ctor public MediaRouteButton(android.content.Context, android.util.AttributeSet);
ctor public MediaRouteButton(android.content.Context, android.util.AttributeSet, int);
+ ctor public MediaRouteButton(android.content.Context, android.util.AttributeSet, int, int);
method public int getRouteTypes();
method public void onAttachedToWindow();
method public void onDetachedFromWindow();
@@ -5753,6 +5808,8 @@ package android.content {
method public final android.os.Bundle call(android.net.Uri, java.lang.String, java.lang.String, android.os.Bundle);
method public deprecated void cancelSync(android.net.Uri);
method public static void cancelSync(android.accounts.Account, java.lang.String);
+ method public static void cancelSync(android.content.ComponentName);
+ method public static void cancelSync(android.content.SyncRequest);
method public final android.net.Uri canonicalize(android.net.Uri);
method public final int delete(android.net.Uri, java.lang.String, java.lang.String[]);
method public static deprecated android.content.SyncInfo getCurrentSync();
@@ -5761,14 +5818,18 @@ package android.content {
method public static boolean getMasterSyncAutomatically();
method public java.util.List<android.content.UriPermission> getOutgoingPersistedUriPermissions();
method public static java.util.List<android.content.PeriodicSync> getPeriodicSyncs(android.accounts.Account, java.lang.String);
+ method public static java.util.List<android.content.PeriodicSync> getPeriodicSyncs(android.content.ComponentName);
method public java.util.List<android.content.UriPermission> getPersistedUriPermissions();
method public java.lang.String[] getStreamTypes(android.net.Uri, java.lang.String);
method public static android.content.SyncAdapterType[] getSyncAdapterTypes();
method public static boolean getSyncAutomatically(android.accounts.Account, java.lang.String);
method public final java.lang.String getType(android.net.Uri);
method public final android.net.Uri insert(android.net.Uri, android.content.ContentValues);
+ method public static boolean isServiceActive(android.content.ComponentName);
method public static boolean isSyncActive(android.accounts.Account, java.lang.String);
+ method public static boolean isSyncActive(android.content.ComponentName);
method public static boolean isSyncPending(android.accounts.Account, java.lang.String);
+ method public static boolean isSyncPending(android.content.ComponentName);
method public void notifyChange(android.net.Uri, android.database.ContentObserver);
method public void notifyChange(android.net.Uri, android.database.ContentObserver, boolean);
method public final android.content.res.AssetFileDescriptor openAssetFileDescriptor(android.net.Uri, java.lang.String) throws java.io.FileNotFoundException;
@@ -5790,6 +5851,7 @@ package android.content {
method public static void requestSync(android.content.SyncRequest);
method public static void setIsSyncable(android.accounts.Account, java.lang.String, int);
method public static void setMasterSyncAutomatically(boolean);
+ method public static void setServiceActive(android.content.ComponentName, boolean);
method public static void setSyncAutomatically(android.accounts.Account, java.lang.String, boolean);
method public deprecated void startSync(android.net.Uri, android.os.Bundle);
method public void takePersistableUriPermission(android.net.Uri, int);
@@ -5976,6 +6038,7 @@ package android.content {
field public static final int BIND_NOT_FOREGROUND = 4; // 0x4
field public static final int BIND_WAIVE_PRIORITY = 32; // 0x20
field public static final java.lang.String BLUETOOTH_SERVICE = "bluetooth";
+ field public static final java.lang.String CAMERA_SERVICE = "camera";
field public static final java.lang.String CAPTIONING_SERVICE = "captioning";
field public static final java.lang.String CLIPBOARD_SERVICE = "clipboard";
field public static final java.lang.String CONNECTIVITY_SERVICE = "connectivity";
@@ -6733,7 +6796,9 @@ package android.content {
field public final android.accounts.Account account;
field public final java.lang.String authority;
field public final android.os.Bundle extras;
+ field public final boolean isService;
field public final long period;
+ field public final android.content.ComponentName service;
}
public class ReceiverCallNotAllowedException extends android.util.AndroidRuntimeException {
@@ -6849,11 +6914,13 @@ package android.content {
method public void writeToParcel(android.os.Parcel, int);
field public final android.accounts.Account account;
field public final java.lang.String authority;
+ field public final android.content.ComponentName service;
field public final long startTime;
}
public class SyncRequest implements android.os.Parcelable {
method public int describeContents();
+ method public boolean isExpedited();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator CREATOR;
}
@@ -6868,7 +6935,10 @@ package android.content {
method public android.content.SyncRequest.Builder setIgnoreSettings(boolean);
method public android.content.SyncRequest.Builder setManual(boolean);
method public android.content.SyncRequest.Builder setNoRetry(boolean);
+ method public android.content.SyncRequest.Builder setPriority(int);
method public android.content.SyncRequest.Builder setSyncAdapter(android.accounts.Account, java.lang.String);
+ method public android.content.SyncRequest.Builder setSyncAdapter(android.content.ComponentName);
+ method public android.content.SyncRequest.Builder setTransferSize(long, long);
method public android.content.SyncRequest.Builder syncOnce();
method public android.content.SyncRequest.Builder syncPeriodic(long, long);
}
@@ -6896,6 +6966,13 @@ package android.content {
field public boolean tooManyRetries;
}
+ public abstract class SyncService extends android.app.Service {
+ ctor public SyncService();
+ method public android.os.IBinder onBind(android.content.Intent);
+ method public abstract void onPerformSync(android.os.Bundle, android.content.SyncResult);
+ method protected boolean parallelSyncsEnabled();
+ }
+
public class SyncStats implements android.os.Parcelable {
ctor public SyncStats();
ctor public SyncStats(android.os.Parcel);
@@ -7559,6 +7636,7 @@ package android.content.res {
method public int describeContents();
method public int getColorForState(int[], int);
method public int getDefaultColor();
+ method public boolean isOpaque();
method public boolean isStateful();
method public static android.content.res.ColorStateList valueOf(int);
method public android.content.res.ColorStateList withAlpha(int);
@@ -8748,6 +8826,7 @@ package android.gesture {
ctor public GestureOverlayView(android.content.Context);
ctor public GestureOverlayView(android.content.Context, android.util.AttributeSet);
ctor public GestureOverlayView(android.content.Context, android.util.AttributeSet, int);
+ ctor public GestureOverlayView(android.content.Context, android.util.AttributeSet, int, int);
method public void addOnGestureListener(android.gesture.GestureOverlayView.OnGestureListener);
method public void addOnGesturePerformedListener(android.gesture.GestureOverlayView.OnGesturePerformedListener);
method public void addOnGesturingListener(android.gesture.GestureOverlayView.OnGesturingListener);
@@ -9216,6 +9295,9 @@ package android.graphics {
public class ColorMatrixColorFilter extends android.graphics.ColorFilter {
ctor public ColorMatrixColorFilter(android.graphics.ColorMatrix);
ctor public ColorMatrixColorFilter(float[]);
+ method public android.graphics.ColorMatrix getColorMatrix();
+ method public void setColorMatrix(android.graphics.ColorMatrix);
+ method public void setColorMatrix(float[]);
}
public class ComposePathEffect extends android.graphics.PathEffect {
@@ -9253,6 +9335,7 @@ package android.graphics {
field public static final int JPEG = 256; // 0x100
field public static final int NV16 = 16; // 0x10
field public static final int NV21 = 17; // 0x11
+ field public static final int RAW_SENSOR = 32; // 0x20
field public static final int RGB_565 = 4; // 0x4
field public static final int UNKNOWN = 0; // 0x0
field public static final int YUV_420_888 = 35; // 0x23
@@ -9290,6 +9373,10 @@ package android.graphics {
public class LightingColorFilter extends android.graphics.ColorFilter {
ctor public LightingColorFilter(int, int);
+ method public int getColorAdd();
+ method public int getColorMultiply();
+ method public void setColorAdd(int);
+ method public void setColorMultiply(int);
}
public class LinearGradient extends android.graphics.Shader {
@@ -9764,6 +9851,10 @@ package android.graphics {
public class PorterDuffColorFilter extends android.graphics.ColorFilter {
ctor public PorterDuffColorFilter(int, android.graphics.PorterDuff.Mode);
+ method public int getColor();
+ method public android.graphics.PorterDuff.Mode getMode();
+ method public void setColor(int);
+ method public void setMode(android.graphics.PorterDuff.Mode);
}
public class PorterDuffXfermode extends android.graphics.Xfermode {
@@ -10191,8 +10282,10 @@ package android.graphics.drawable {
method public void draw(android.graphics.Canvas);
method public int getOpacity();
method public android.graphics.drawable.GradientDrawable.Orientation getOrientation();
+ method public boolean onStateChange(int[]);
method public void setAlpha(int);
method public void setColor(int);
+ method public void setColor(android.content.res.ColorStateList);
method public void setColorFilter(android.graphics.ColorFilter);
method public void setColors(int[]);
method public void setCornerRadii(float[]);
@@ -10204,7 +10297,9 @@ package android.graphics.drawable {
method public void setShape(int);
method public void setSize(int, int);
method public void setStroke(int, int);
+ method public void setStroke(int, android.content.res.ColorStateList);
method public void setStroke(int, int, float, float);
+ method public void setStroke(int, android.content.res.ColorStateList, float, float);
method public void setUseLevel(boolean);
field public static final int LINE = 2; // 0x2
field public static final int LINEAR_GRADIENT = 0; // 0x0
@@ -10860,6 +10955,402 @@ package android.hardware {
}
+package android.hardware.camera2 {
+
+ public class CameraAccessException extends android.util.AndroidException {
+ ctor public CameraAccessException(int);
+ ctor public CameraAccessException(int, java.lang.String);
+ ctor public CameraAccessException(int, java.lang.String, java.lang.Throwable);
+ ctor public CameraAccessException(int, java.lang.Throwable);
+ method public final int getReason();
+ field public static final int CAMERA_DISABLED = 1; // 0x1
+ field public static final int CAMERA_DISCONNECTED = 2; // 0x2
+ field public static final int CAMERA_ERROR = 3; // 0x3
+ }
+
+ public final class CameraCharacteristics extends android.hardware.camera2.CameraMetadata {
+ method public T get(android.hardware.camera2.CameraMetadata.Key<T>);
+ method public java.util.List<android.hardware.camera2.CameraMetadata.Key<?>> getAvailableCaptureRequestKeys();
+ method public java.util.List<android.hardware.camera2.CameraMetadata.Key<?>> getAvailableCaptureResultKeys();
+ field public static final android.hardware.camera2.CameraMetadata.Key CONTROL_AE_AVAILABLE_ANTIBANDING_MODES;
+ field public static final android.hardware.camera2.CameraMetadata.Key CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES;
+ field public static final android.hardware.camera2.CameraMetadata.Key CONTROL_AE_COMPENSATION_RANGE;
+ field public static final android.hardware.camera2.CameraMetadata.Key CONTROL_AE_COMPENSATION_STEP;
+ field public static final android.hardware.camera2.CameraMetadata.Key CONTROL_AF_AVAILABLE_MODES;
+ field public static final android.hardware.camera2.CameraMetadata.Key CONTROL_AVAILABLE_EFFECTS;
+ field public static final android.hardware.camera2.CameraMetadata.Key CONTROL_AVAILABLE_SCENE_MODES;
+ field public static final android.hardware.camera2.CameraMetadata.Key CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES;
+ field public static final android.hardware.camera2.CameraMetadata.Key CONTROL_AWB_AVAILABLE_MODES;
+ field public static final android.hardware.camera2.CameraMetadata.Key CONTROL_MAX_REGIONS;
+ field public static final android.hardware.camera2.CameraMetadata.Key FLASH_INFO_AVAILABLE;
+ field public static final android.hardware.camera2.CameraMetadata.Key INFO_SUPPORTED_HARDWARE_LEVEL;
+ field public static final android.hardware.camera2.CameraMetadata.Key JPEG_AVAILABLE_THUMBNAIL_SIZES;
+ field public static final android.hardware.camera2.CameraMetadata.Key LENS_FACING;
+ field public static final android.hardware.camera2.CameraMetadata.Key LENS_INFO_AVAILABLE_APERTURES;
+ field public static final android.hardware.camera2.CameraMetadata.Key LENS_INFO_AVAILABLE_FILTER_DENSITIES;
+ field public static final android.hardware.camera2.CameraMetadata.Key LENS_INFO_AVAILABLE_FOCAL_LENGTHS;
+ field public static final android.hardware.camera2.CameraMetadata.Key LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION;
+ field public static final android.hardware.camera2.CameraMetadata.Key LENS_INFO_HYPERFOCAL_DISTANCE;
+ field public static final android.hardware.camera2.CameraMetadata.Key LENS_INFO_MINIMUM_FOCUS_DISTANCE;
+ field public static final android.hardware.camera2.CameraMetadata.Key LENS_INFO_SHADING_MAP_SIZE;
+ field public static final android.hardware.camera2.CameraMetadata.Key REQUEST_MAX_NUM_OUTPUT_STREAMS;
+ field public static final android.hardware.camera2.CameraMetadata.Key SCALER_AVAILABLE_FORMATS;
+ field public static final android.hardware.camera2.CameraMetadata.Key SCALER_AVAILABLE_JPEG_MIN_DURATIONS;
+ field public static final android.hardware.camera2.CameraMetadata.Key SCALER_AVAILABLE_JPEG_SIZES;
+ field public static final android.hardware.camera2.CameraMetadata.Key SCALER_AVAILABLE_MAX_DIGITAL_ZOOM;
+ field public static final android.hardware.camera2.CameraMetadata.Key SCALER_AVAILABLE_PROCESSED_MIN_DURATIONS;
+ field public static final android.hardware.camera2.CameraMetadata.Key SCALER_AVAILABLE_PROCESSED_SIZES;
+ field public static final android.hardware.camera2.CameraMetadata.Key SENSOR_BASE_GAIN_FACTOR;
+ field public static final android.hardware.camera2.CameraMetadata.Key SENSOR_INFO_ACTIVE_ARRAY_SIZE;
+ field public static final android.hardware.camera2.CameraMetadata.Key SENSOR_INFO_EXPOSURE_TIME_RANGE;
+ field public static final android.hardware.camera2.CameraMetadata.Key SENSOR_INFO_MAX_FRAME_DURATION;
+ field public static final android.hardware.camera2.CameraMetadata.Key SENSOR_INFO_PHYSICAL_SIZE;
+ field public static final android.hardware.camera2.CameraMetadata.Key SENSOR_INFO_SENSITIVITY_RANGE;
+ field public static final android.hardware.camera2.CameraMetadata.Key SENSOR_MAX_ANALOG_SENSITIVITY;
+ field public static final android.hardware.camera2.CameraMetadata.Key SENSOR_ORIENTATION;
+ field public static final android.hardware.camera2.CameraMetadata.Key STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES;
+ field public static final android.hardware.camera2.CameraMetadata.Key STATISTICS_INFO_MAX_FACE_COUNT;
+ field public static final android.hardware.camera2.CameraMetadata.Key TONEMAP_MAX_CURVE_POINTS;
+ }
+
+ public abstract interface CameraDevice implements java.lang.AutoCloseable {
+ method public abstract int capture(android.hardware.camera2.CaptureRequest, android.hardware.camera2.CameraDevice.CaptureListener, android.os.Handler) throws android.hardware.camera2.CameraAccessException;
+ method public abstract int captureBurst(java.util.List<android.hardware.camera2.CaptureRequest>, android.hardware.camera2.CameraDevice.CaptureListener, android.os.Handler) throws android.hardware.camera2.CameraAccessException;
+ method public abstract void close();
+ method public abstract void configureOutputs(java.util.List<android.view.Surface>) throws android.hardware.camera2.CameraAccessException;
+ method public abstract android.hardware.camera2.CaptureRequest.Builder createCaptureRequest(int) throws android.hardware.camera2.CameraAccessException;
+ method public abstract void flush() throws android.hardware.camera2.CameraAccessException;
+ method public abstract java.lang.String getId();
+ method public abstract int setRepeatingBurst(java.util.List<android.hardware.camera2.CaptureRequest>, android.hardware.camera2.CameraDevice.CaptureListener, android.os.Handler) throws android.hardware.camera2.CameraAccessException;
+ method public abstract int setRepeatingRequest(android.hardware.camera2.CaptureRequest, android.hardware.camera2.CameraDevice.CaptureListener, android.os.Handler) throws android.hardware.camera2.CameraAccessException;
+ method public abstract void stopRepeating() throws android.hardware.camera2.CameraAccessException;
+ method public abstract void waitUntilIdle() throws android.hardware.camera2.CameraAccessException;
+ field public static final int TEMPLATE_PREVIEW = 1; // 0x1
+ field public static final int TEMPLATE_RECORD = 3; // 0x3
+ field public static final int TEMPLATE_STILL_CAPTURE = 2; // 0x2
+ field public static final int TEMPLATE_VIDEO_SNAPSHOT = 4; // 0x4
+ }
+
+ public static abstract class CameraDevice.CaptureListener {
+ ctor public CameraDevice.CaptureListener();
+ method public void onCaptureCompleted(android.hardware.camera2.CameraDevice, android.hardware.camera2.CaptureRequest, android.hardware.camera2.CaptureResult);
+ method public void onCaptureFailed(android.hardware.camera2.CameraDevice, android.hardware.camera2.CaptureRequest, android.hardware.camera2.CaptureFailure);
+ method public void onCaptureSequenceCompleted(android.hardware.camera2.CameraDevice, int, int);
+ method public void onCaptureStarted(android.hardware.camera2.CameraDevice, android.hardware.camera2.CaptureRequest, long);
+ }
+
+ public static abstract class CameraDevice.StateListener {
+ ctor public CameraDevice.StateListener();
+ method public void onActive(android.hardware.camera2.CameraDevice);
+ method public void onBusy(android.hardware.camera2.CameraDevice);
+ method public void onClosed(android.hardware.camera2.CameraDevice);
+ method public abstract void onDisconnected(android.hardware.camera2.CameraDevice);
+ method public abstract void onError(android.hardware.camera2.CameraDevice, int);
+ method public void onIdle(android.hardware.camera2.CameraDevice);
+ method public abstract void onOpened(android.hardware.camera2.CameraDevice);
+ method public void onUnconfigured(android.hardware.camera2.CameraDevice);
+ field public static final int ERROR_CAMERA_DEVICE = 4; // 0x4
+ field public static final int ERROR_CAMERA_DISABLED = 3; // 0x3
+ field public static final int ERROR_CAMERA_IN_USE = 1; // 0x1
+ field public static final int ERROR_CAMERA_SERVICE = 5; // 0x5
+ field public static final int ERROR_MAX_CAMERAS_IN_USE = 2; // 0x2
+ }
+
+ public final class CameraManager {
+ method public void addAvailabilityListener(android.hardware.camera2.CameraManager.AvailabilityListener, android.os.Handler);
+ method public android.hardware.camera2.CameraCharacteristics getCameraCharacteristics(java.lang.String) throws android.hardware.camera2.CameraAccessException;
+ method public java.lang.String[] getCameraIdList() throws android.hardware.camera2.CameraAccessException;
+ method public void openCamera(java.lang.String, android.hardware.camera2.CameraDevice.StateListener, android.os.Handler) throws android.hardware.camera2.CameraAccessException;
+ method public void removeAvailabilityListener(android.hardware.camera2.CameraManager.AvailabilityListener);
+ }
+
+ public static abstract class CameraManager.AvailabilityListener {
+ ctor public CameraManager.AvailabilityListener();
+ method public void onCameraAvailable(java.lang.String);
+ method public void onCameraUnavailable(java.lang.String);
+ }
+
+ public abstract class CameraMetadata {
+ method public abstract T get(android.hardware.camera2.CameraMetadata.Key<T>);
+ method public java.util.List<android.hardware.camera2.CameraMetadata.Key<?>> getKeys();
+ field public static final int COLOR_CORRECTION_MODE_FAST = 1; // 0x1
+ field public static final int COLOR_CORRECTION_MODE_HIGH_QUALITY = 2; // 0x2
+ field public static final int COLOR_CORRECTION_MODE_TRANSFORM_MATRIX = 0; // 0x0
+ field public static final int CONTROL_AE_ANTIBANDING_MODE_50HZ = 1; // 0x1
+ field public static final int CONTROL_AE_ANTIBANDING_MODE_60HZ = 2; // 0x2
+ field public static final int CONTROL_AE_ANTIBANDING_MODE_AUTO = 3; // 0x3
+ field public static final int CONTROL_AE_ANTIBANDING_MODE_OFF = 0; // 0x0
+ field public static final int CONTROL_AE_MODE_OFF = 0; // 0x0
+ field public static final int CONTROL_AE_MODE_ON = 1; // 0x1
+ field public static final int CONTROL_AE_MODE_ON_ALWAYS_FLASH = 3; // 0x3
+ field public static final int CONTROL_AE_MODE_ON_AUTO_FLASH = 2; // 0x2
+ field public static final int CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE = 4; // 0x4
+ field public static final int CONTROL_AE_PRECAPTURE_TRIGGER_IDLE = 0; // 0x0
+ field public static final int CONTROL_AE_PRECAPTURE_TRIGGER_START = 1; // 0x1
+ field public static final int CONTROL_AE_STATE_CONVERGED = 2; // 0x2
+ field public static final int CONTROL_AE_STATE_FLASH_REQUIRED = 4; // 0x4
+ field public static final int CONTROL_AE_STATE_INACTIVE = 0; // 0x0
+ field public static final int CONTROL_AE_STATE_LOCKED = 3; // 0x3
+ field public static final int CONTROL_AE_STATE_PRECAPTURE = 5; // 0x5
+ field public static final int CONTROL_AE_STATE_SEARCHING = 1; // 0x1
+ field public static final int CONTROL_AF_MODE_AUTO = 1; // 0x1
+ field public static final int CONTROL_AF_MODE_CONTINUOUS_PICTURE = 4; // 0x4
+ field public static final int CONTROL_AF_MODE_CONTINUOUS_VIDEO = 3; // 0x3
+ field public static final int CONTROL_AF_MODE_EDOF = 5; // 0x5
+ field public static final int CONTROL_AF_MODE_MACRO = 2; // 0x2
+ field public static final int CONTROL_AF_MODE_OFF = 0; // 0x0
+ field public static final int CONTROL_AF_STATE_ACTIVE_SCAN = 3; // 0x3
+ field public static final int CONTROL_AF_STATE_FOCUSED_LOCKED = 4; // 0x4
+ field public static final int CONTROL_AF_STATE_INACTIVE = 0; // 0x0
+ field public static final int CONTROL_AF_STATE_NOT_FOCUSED_LOCKED = 5; // 0x5
+ field public static final int CONTROL_AF_STATE_PASSIVE_FOCUSED = 2; // 0x2
+ field public static final int CONTROL_AF_STATE_PASSIVE_SCAN = 1; // 0x1
+ field public static final int CONTROL_AF_STATE_PASSIVE_UNFOCUSED = 6; // 0x6
+ field public static final int CONTROL_AF_TRIGGER_CANCEL = 2; // 0x2
+ field public static final int CONTROL_AF_TRIGGER_IDLE = 0; // 0x0
+ field public static final int CONTROL_AF_TRIGGER_START = 1; // 0x1
+ field public static final int CONTROL_AWB_MODE_AUTO = 1; // 0x1
+ field public static final int CONTROL_AWB_MODE_CLOUDY_DAYLIGHT = 6; // 0x6
+ field public static final int CONTROL_AWB_MODE_DAYLIGHT = 5; // 0x5
+ field public static final int CONTROL_AWB_MODE_FLUORESCENT = 3; // 0x3
+ field public static final int CONTROL_AWB_MODE_INCANDESCENT = 2; // 0x2
+ field public static final int CONTROL_AWB_MODE_OFF = 0; // 0x0
+ field public static final int CONTROL_AWB_MODE_SHADE = 8; // 0x8
+ field public static final int CONTROL_AWB_MODE_TWILIGHT = 7; // 0x7
+ field public static final int CONTROL_AWB_MODE_WARM_FLUORESCENT = 4; // 0x4
+ field public static final int CONTROL_AWB_STATE_CONVERGED = 2; // 0x2
+ field public static final int CONTROL_AWB_STATE_INACTIVE = 0; // 0x0
+ field public static final int CONTROL_AWB_STATE_LOCKED = 3; // 0x3
+ field public static final int CONTROL_AWB_STATE_SEARCHING = 1; // 0x1
+ field public static final int CONTROL_CAPTURE_INTENT_CUSTOM = 0; // 0x0
+ field public static final int CONTROL_CAPTURE_INTENT_PREVIEW = 1; // 0x1
+ field public static final int CONTROL_CAPTURE_INTENT_STILL_CAPTURE = 2; // 0x2
+ field public static final int CONTROL_CAPTURE_INTENT_VIDEO_RECORD = 3; // 0x3
+ field public static final int CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT = 4; // 0x4
+ field public static final int CONTROL_CAPTURE_INTENT_ZERO_SHUTTER_LAG = 5; // 0x5
+ field public static final int CONTROL_EFFECT_MODE_AQUA = 8; // 0x8
+ field public static final int CONTROL_EFFECT_MODE_BLACKBOARD = 7; // 0x7
+ field public static final int CONTROL_EFFECT_MODE_MONO = 1; // 0x1
+ field public static final int CONTROL_EFFECT_MODE_NEGATIVE = 2; // 0x2
+ field public static final int CONTROL_EFFECT_MODE_OFF = 0; // 0x0
+ field public static final int CONTROL_EFFECT_MODE_POSTERIZE = 5; // 0x5
+ field public static final int CONTROL_EFFECT_MODE_SEPIA = 4; // 0x4
+ field public static final int CONTROL_EFFECT_MODE_SOLARIZE = 3; // 0x3
+ field public static final int CONTROL_EFFECT_MODE_WHITEBOARD = 6; // 0x6
+ field public static final int CONTROL_MODE_AUTO = 1; // 0x1
+ field public static final int CONTROL_MODE_OFF = 0; // 0x0
+ field public static final int CONTROL_MODE_USE_SCENE_MODE = 2; // 0x2
+ field public static final int CONTROL_SCENE_MODE_ACTION = 2; // 0x2
+ field public static final int CONTROL_SCENE_MODE_BARCODE = 16; // 0x10
+ field public static final int CONTROL_SCENE_MODE_BEACH = 8; // 0x8
+ field public static final int CONTROL_SCENE_MODE_CANDLELIGHT = 15; // 0xf
+ field public static final int CONTROL_SCENE_MODE_FACE_PRIORITY = 1; // 0x1
+ field public static final int CONTROL_SCENE_MODE_FIREWORKS = 12; // 0xc
+ field public static final int CONTROL_SCENE_MODE_LANDSCAPE = 4; // 0x4
+ field public static final int CONTROL_SCENE_MODE_NIGHT = 5; // 0x5
+ field public static final int CONTROL_SCENE_MODE_NIGHT_PORTRAIT = 6; // 0x6
+ field public static final int CONTROL_SCENE_MODE_PARTY = 14; // 0xe
+ field public static final int CONTROL_SCENE_MODE_PORTRAIT = 3; // 0x3
+ field public static final int CONTROL_SCENE_MODE_SNOW = 9; // 0x9
+ field public static final int CONTROL_SCENE_MODE_SPORTS = 13; // 0xd
+ field public static final int CONTROL_SCENE_MODE_STEADYPHOTO = 11; // 0xb
+ field public static final int CONTROL_SCENE_MODE_SUNSET = 10; // 0xa
+ field public static final int CONTROL_SCENE_MODE_THEATRE = 7; // 0x7
+ field public static final int CONTROL_SCENE_MODE_UNSUPPORTED = 0; // 0x0
+ field public static final int EDGE_MODE_FAST = 1; // 0x1
+ field public static final int EDGE_MODE_HIGH_QUALITY = 2; // 0x2
+ field public static final int EDGE_MODE_OFF = 0; // 0x0
+ field public static final int FLASH_MODE_OFF = 0; // 0x0
+ field public static final int FLASH_MODE_SINGLE = 1; // 0x1
+ field public static final int FLASH_MODE_TORCH = 2; // 0x2
+ field public static final int FLASH_STATE_CHARGING = 1; // 0x1
+ field public static final int FLASH_STATE_FIRED = 3; // 0x3
+ field public static final int FLASH_STATE_READY = 2; // 0x2
+ field public static final int FLASH_STATE_UNAVAILABLE = 0; // 0x0
+ field public static final int INFO_SUPPORTED_HARDWARE_LEVEL_FULL = 1; // 0x1
+ field public static final int INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED = 0; // 0x0
+ field public static final int LENS_FACING_BACK = 1; // 0x1
+ field public static final int LENS_FACING_FRONT = 0; // 0x0
+ field public static final int LENS_OPTICAL_STABILIZATION_MODE_OFF = 0; // 0x0
+ field public static final int LENS_OPTICAL_STABILIZATION_MODE_ON = 1; // 0x1
+ field public static final int LENS_STATE_MOVING = 1; // 0x1
+ field public static final int LENS_STATE_STATIONARY = 0; // 0x0
+ field public static final int NOISE_REDUCTION_MODE_FAST = 1; // 0x1
+ field public static final int NOISE_REDUCTION_MODE_HIGH_QUALITY = 2; // 0x2
+ field public static final int NOISE_REDUCTION_MODE_OFF = 0; // 0x0
+ field public static final int STATISTICS_FACE_DETECT_MODE_FULL = 2; // 0x2
+ field public static final int STATISTICS_FACE_DETECT_MODE_OFF = 0; // 0x0
+ field public static final int STATISTICS_FACE_DETECT_MODE_SIMPLE = 1; // 0x1
+ field public static final int STATISTICS_LENS_SHADING_MAP_MODE_OFF = 0; // 0x0
+ field public static final int STATISTICS_LENS_SHADING_MAP_MODE_ON = 1; // 0x1
+ field public static final int STATISTICS_SCENE_FLICKER_50HZ = 1; // 0x1
+ field public static final int STATISTICS_SCENE_FLICKER_60HZ = 2; // 0x2
+ field public static final int STATISTICS_SCENE_FLICKER_NONE = 0; // 0x0
+ field public static final int TONEMAP_MODE_CONTRAST_CURVE = 0; // 0x0
+ field public static final int TONEMAP_MODE_FAST = 1; // 0x1
+ field public static final int TONEMAP_MODE_HIGH_QUALITY = 2; // 0x2
+ }
+
+ public static class CameraMetadata.Key {
+ method public final boolean equals(java.lang.Object);
+ method public final java.lang.String getName();
+ method public final int hashCode();
+ }
+
+ public class CaptureFailure {
+ method public int getFrameNumber();
+ method public int getReason();
+ method public android.hardware.camera2.CaptureRequest getRequest();
+ method public int getSequenceId();
+ method public boolean wasImageCaptured();
+ field public static final int REASON_ERROR = 0; // 0x0
+ field public static final int REASON_FLUSHED = 1; // 0x1
+ }
+
+ public final class CaptureRequest extends android.hardware.camera2.CameraMetadata implements android.os.Parcelable {
+ method public int describeContents();
+ method public T get(android.hardware.camera2.CameraMetadata.Key<T>);
+ method public java.lang.Object getTag();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.hardware.camera2.CameraMetadata.Key BLACK_LEVEL_LOCK;
+ field public static final android.hardware.camera2.CameraMetadata.Key COLOR_CORRECTION_GAINS;
+ field public static final android.hardware.camera2.CameraMetadata.Key COLOR_CORRECTION_MODE;
+ field public static final android.hardware.camera2.CameraMetadata.Key COLOR_CORRECTION_TRANSFORM;
+ field public static final android.hardware.camera2.CameraMetadata.Key CONTROL_AE_ANTIBANDING_MODE;
+ field public static final android.hardware.camera2.CameraMetadata.Key CONTROL_AE_EXPOSURE_COMPENSATION;
+ field public static final android.hardware.camera2.CameraMetadata.Key CONTROL_AE_LOCK;
+ field public static final android.hardware.camera2.CameraMetadata.Key CONTROL_AE_MODE;
+ field public static final android.hardware.camera2.CameraMetadata.Key CONTROL_AE_PRECAPTURE_TRIGGER;
+ field public static final android.hardware.camera2.CameraMetadata.Key CONTROL_AE_REGIONS;
+ field public static final android.hardware.camera2.CameraMetadata.Key CONTROL_AE_TARGET_FPS_RANGE;
+ field public static final android.hardware.camera2.CameraMetadata.Key CONTROL_AF_MODE;
+ field public static final android.hardware.camera2.CameraMetadata.Key CONTROL_AF_REGIONS;
+ field public static final android.hardware.camera2.CameraMetadata.Key CONTROL_AF_TRIGGER;
+ field public static final android.hardware.camera2.CameraMetadata.Key CONTROL_AWB_LOCK;
+ field public static final android.hardware.camera2.CameraMetadata.Key CONTROL_AWB_MODE;
+ field public static final android.hardware.camera2.CameraMetadata.Key CONTROL_AWB_REGIONS;
+ field public static final android.hardware.camera2.CameraMetadata.Key CONTROL_CAPTURE_INTENT;
+ field public static final android.hardware.camera2.CameraMetadata.Key CONTROL_EFFECT_MODE;
+ field public static final android.hardware.camera2.CameraMetadata.Key CONTROL_MODE;
+ field public static final android.hardware.camera2.CameraMetadata.Key CONTROL_SCENE_MODE;
+ field public static final android.hardware.camera2.CameraMetadata.Key CONTROL_VIDEO_STABILIZATION_MODE;
+ field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.hardware.camera2.CameraMetadata.Key EDGE_MODE;
+ field public static final android.hardware.camera2.CameraMetadata.Key FLASH_MODE;
+ field public static final android.hardware.camera2.CameraMetadata.Key JPEG_GPS_COORDINATES;
+ field public static final android.hardware.camera2.CameraMetadata.Key JPEG_GPS_PROCESSING_METHOD;
+ field public static final android.hardware.camera2.CameraMetadata.Key JPEG_GPS_TIMESTAMP;
+ field public static final android.hardware.camera2.CameraMetadata.Key JPEG_ORIENTATION;
+ field public static final android.hardware.camera2.CameraMetadata.Key JPEG_QUALITY;
+ field public static final android.hardware.camera2.CameraMetadata.Key JPEG_THUMBNAIL_QUALITY;
+ field public static final android.hardware.camera2.CameraMetadata.Key JPEG_THUMBNAIL_SIZE;
+ field public static final android.hardware.camera2.CameraMetadata.Key LENS_APERTURE;
+ field public static final android.hardware.camera2.CameraMetadata.Key LENS_FILTER_DENSITY;
+ field public static final android.hardware.camera2.CameraMetadata.Key LENS_FOCAL_LENGTH;
+ field public static final android.hardware.camera2.CameraMetadata.Key LENS_FOCUS_DISTANCE;
+ field public static final android.hardware.camera2.CameraMetadata.Key LENS_OPTICAL_STABILIZATION_MODE;
+ field public static final android.hardware.camera2.CameraMetadata.Key NOISE_REDUCTION_MODE;
+ field public static final android.hardware.camera2.CameraMetadata.Key SCALER_CROP_REGION;
+ field public static final android.hardware.camera2.CameraMetadata.Key SENSOR_EXPOSURE_TIME;
+ field public static final android.hardware.camera2.CameraMetadata.Key SENSOR_FRAME_DURATION;
+ field public static final android.hardware.camera2.CameraMetadata.Key SENSOR_SENSITIVITY;
+ field public static final android.hardware.camera2.CameraMetadata.Key STATISTICS_FACE_DETECT_MODE;
+ field public static final android.hardware.camera2.CameraMetadata.Key STATISTICS_LENS_SHADING_MAP_MODE;
+ field public static final android.hardware.camera2.CameraMetadata.Key TONEMAP_CURVE_BLUE;
+ field public static final android.hardware.camera2.CameraMetadata.Key TONEMAP_CURVE_GREEN;
+ field public static final android.hardware.camera2.CameraMetadata.Key TONEMAP_CURVE_RED;
+ field public static final android.hardware.camera2.CameraMetadata.Key TONEMAP_MODE;
+ }
+
+ public static final class CaptureRequest.Builder {
+ method public void addTarget(android.view.Surface);
+ method public android.hardware.camera2.CaptureRequest build();
+ method public T get(android.hardware.camera2.CameraMetadata.Key<T>);
+ method public void removeTarget(android.view.Surface);
+ method public void set(android.hardware.camera2.CameraMetadata.Key<T>, T);
+ method public void setTag(java.lang.Object);
+ }
+
+ public final class CaptureResult extends android.hardware.camera2.CameraMetadata {
+ method public T get(android.hardware.camera2.CameraMetadata.Key<T>);
+ method public int getFrameNumber();
+ method public android.hardware.camera2.CaptureRequest getRequest();
+ method public int getSequenceId();
+ field public static final android.hardware.camera2.CameraMetadata.Key BLACK_LEVEL_LOCK;
+ field public static final android.hardware.camera2.CameraMetadata.Key COLOR_CORRECTION_GAINS;
+ field public static final android.hardware.camera2.CameraMetadata.Key COLOR_CORRECTION_TRANSFORM;
+ field public static final android.hardware.camera2.CameraMetadata.Key CONTROL_AE_REGIONS;
+ field public static final android.hardware.camera2.CameraMetadata.Key CONTROL_AE_STATE;
+ field public static final android.hardware.camera2.CameraMetadata.Key CONTROL_AF_MODE;
+ field public static final android.hardware.camera2.CameraMetadata.Key CONTROL_AF_REGIONS;
+ field public static final android.hardware.camera2.CameraMetadata.Key CONTROL_AF_STATE;
+ field public static final android.hardware.camera2.CameraMetadata.Key CONTROL_AWB_MODE;
+ field public static final android.hardware.camera2.CameraMetadata.Key CONTROL_AWB_REGIONS;
+ field public static final android.hardware.camera2.CameraMetadata.Key CONTROL_AWB_STATE;
+ field public static final android.hardware.camera2.CameraMetadata.Key CONTROL_MODE;
+ field public static final android.hardware.camera2.CameraMetadata.Key EDGE_MODE;
+ field public static final android.hardware.camera2.CameraMetadata.Key FLASH_MODE;
+ field public static final android.hardware.camera2.CameraMetadata.Key FLASH_STATE;
+ field public static final android.hardware.camera2.CameraMetadata.Key JPEG_GPS_COORDINATES;
+ field public static final android.hardware.camera2.CameraMetadata.Key JPEG_GPS_PROCESSING_METHOD;
+ field public static final android.hardware.camera2.CameraMetadata.Key JPEG_GPS_TIMESTAMP;
+ field public static final android.hardware.camera2.CameraMetadata.Key JPEG_ORIENTATION;
+ field public static final android.hardware.camera2.CameraMetadata.Key JPEG_QUALITY;
+ field public static final android.hardware.camera2.CameraMetadata.Key JPEG_THUMBNAIL_QUALITY;
+ field public static final android.hardware.camera2.CameraMetadata.Key JPEG_THUMBNAIL_SIZE;
+ field public static final android.hardware.camera2.CameraMetadata.Key LENS_APERTURE;
+ field public static final android.hardware.camera2.CameraMetadata.Key LENS_FILTER_DENSITY;
+ field public static final android.hardware.camera2.CameraMetadata.Key LENS_FOCAL_LENGTH;
+ field public static final android.hardware.camera2.CameraMetadata.Key LENS_FOCUS_DISTANCE;
+ field public static final android.hardware.camera2.CameraMetadata.Key LENS_FOCUS_RANGE;
+ field public static final android.hardware.camera2.CameraMetadata.Key LENS_OPTICAL_STABILIZATION_MODE;
+ field public static final android.hardware.camera2.CameraMetadata.Key LENS_STATE;
+ field public static final android.hardware.camera2.CameraMetadata.Key NOISE_REDUCTION_MODE;
+ field public static final android.hardware.camera2.CameraMetadata.Key REQUEST_FRAME_COUNT;
+ field public static final android.hardware.camera2.CameraMetadata.Key SCALER_CROP_REGION;
+ field public static final android.hardware.camera2.CameraMetadata.Key SENSOR_EXPOSURE_TIME;
+ field public static final android.hardware.camera2.CameraMetadata.Key SENSOR_FRAME_DURATION;
+ field public static final android.hardware.camera2.CameraMetadata.Key SENSOR_SENSITIVITY;
+ field public static final android.hardware.camera2.CameraMetadata.Key SENSOR_TEMPERATURE;
+ field public static final android.hardware.camera2.CameraMetadata.Key SENSOR_TIMESTAMP;
+ field public static final android.hardware.camera2.CameraMetadata.Key STATISTICS_FACES;
+ field public static final android.hardware.camera2.CameraMetadata.Key STATISTICS_FACE_DETECT_MODE;
+ field public static final android.hardware.camera2.CameraMetadata.Key STATISTICS_LENS_SHADING_MAP;
+ field public static final android.hardware.camera2.CameraMetadata.Key STATISTICS_PREDICTED_COLOR_GAINS;
+ field public static final android.hardware.camera2.CameraMetadata.Key STATISTICS_PREDICTED_COLOR_TRANSFORM;
+ field public static final android.hardware.camera2.CameraMetadata.Key STATISTICS_SCENE_FLICKER;
+ field public static final android.hardware.camera2.CameraMetadata.Key TONEMAP_CURVE_BLUE;
+ field public static final android.hardware.camera2.CameraMetadata.Key TONEMAP_CURVE_GREEN;
+ field public static final android.hardware.camera2.CameraMetadata.Key TONEMAP_CURVE_RED;
+ field public static final android.hardware.camera2.CameraMetadata.Key TONEMAP_MODE;
+ }
+
+ public final class Face {
+ method public android.graphics.Rect getBounds();
+ method public int getId();
+ method public android.graphics.Point getLeftEyePosition();
+ method public android.graphics.Point getMouthPosition();
+ method public android.graphics.Point getRightEyePosition();
+ method public int getScore();
+ field public static final int ID_UNSUPPORTED = -1; // 0xffffffff
+ field public static final int SCORE_MAX = 100; // 0x64
+ field public static final int SCORE_MIN = 1; // 0x1
+ }
+
+ public final class Rational {
+ ctor public Rational(int, int);
+ method public int getDenominator();
+ method public int getNumerator();
+ }
+
+ public final class Size {
+ ctor public Size(int, int);
+ method public final int getHeight();
+ method public final int getWidth();
+ }
+
+}
+
package android.hardware.display {
public final class DisplayManager {
@@ -11137,6 +11628,7 @@ package android.inputmethodservice {
ctor public ExtractEditText(android.content.Context);
ctor public ExtractEditText(android.content.Context, android.util.AttributeSet);
ctor public ExtractEditText(android.content.Context, android.util.AttributeSet, int);
+ ctor public ExtractEditText(android.content.Context, android.util.AttributeSet, int, int);
method public void finishInternalChanges();
method public boolean hasVerticalScrollBar();
method public void startInternalChanges();
@@ -11151,6 +11643,7 @@ package android.inputmethodservice {
method public android.view.inputmethod.InputConnection getCurrentInputConnection();
method public android.view.inputmethod.EditorInfo getCurrentInputEditorInfo();
method public boolean getCurrentInputStarted();
+ method public int getInputMethodWindowRecommendedHeight();
method public android.view.LayoutInflater getLayoutInflater();
method public int getMaxWidth();
method public java.lang.CharSequence getTextForImeAction(int);
@@ -11333,6 +11826,7 @@ package android.inputmethodservice {
public class KeyboardView extends android.view.View implements android.view.View.OnClickListener {
ctor public KeyboardView(android.content.Context, android.util.AttributeSet);
ctor public KeyboardView(android.content.Context, android.util.AttributeSet, int);
+ ctor public KeyboardView(android.content.Context, android.util.AttributeSet, int, int);
method public void closing();
method public android.inputmethodservice.Keyboard getKeyboard();
method protected android.inputmethodservice.KeyboardView.OnKeyboardActionListener getOnKeyboardActionListener();
@@ -18430,13 +18924,16 @@ package android.preference {
public class CheckBoxPreference extends android.preference.TwoStatePreference {
ctor public CheckBoxPreference(android.content.Context, android.util.AttributeSet, int);
+ ctor public CheckBoxPreference(android.content.Context, android.util.AttributeSet, int, int);
ctor public CheckBoxPreference(android.content.Context, android.util.AttributeSet);
ctor public CheckBoxPreference(android.content.Context);
}
public abstract class DialogPreference extends android.preference.Preference implements android.content.DialogInterface.OnClickListener android.content.DialogInterface.OnDismissListener android.preference.PreferenceManager.OnActivityDestroyListener {
+ ctor public DialogPreference(android.content.Context, android.util.AttributeSet, int, int);
ctor public DialogPreference(android.content.Context, android.util.AttributeSet, int);
ctor public DialogPreference(android.content.Context, android.util.AttributeSet);
+ ctor public DialogPreference(android.content.Context);
method public android.app.Dialog getDialog();
method public android.graphics.drawable.Drawable getDialogIcon();
method public int getDialogLayoutResource();
@@ -18466,6 +18963,7 @@ package android.preference {
}
public class EditTextPreference extends android.preference.DialogPreference {
+ ctor public EditTextPreference(android.content.Context, android.util.AttributeSet, int, int);
ctor public EditTextPreference(android.content.Context, android.util.AttributeSet, int);
ctor public EditTextPreference(android.content.Context, android.util.AttributeSet);
ctor public EditTextPreference(android.content.Context);
@@ -18476,6 +18974,8 @@ package android.preference {
}
public class ListPreference extends android.preference.DialogPreference {
+ ctor public ListPreference(android.content.Context, android.util.AttributeSet, int, int);
+ ctor public ListPreference(android.content.Context, android.util.AttributeSet, int);
ctor public ListPreference(android.content.Context, android.util.AttributeSet);
ctor public ListPreference(android.content.Context);
method public int findIndexOfValue(java.lang.String);
@@ -18492,6 +18992,8 @@ package android.preference {
}
public class MultiSelectListPreference extends android.preference.DialogPreference {
+ ctor public MultiSelectListPreference(android.content.Context, android.util.AttributeSet, int, int);
+ ctor public MultiSelectListPreference(android.content.Context, android.util.AttributeSet, int);
ctor public MultiSelectListPreference(android.content.Context, android.util.AttributeSet);
ctor public MultiSelectListPreference(android.content.Context);
method public int findIndexOfValue(java.lang.String);
@@ -18506,6 +19008,7 @@ package android.preference {
}
public class Preference implements java.lang.Comparable {
+ ctor public Preference(android.content.Context, android.util.AttributeSet, int, int);
ctor public Preference(android.content.Context, android.util.AttributeSet, int);
ctor public Preference(android.content.Context, android.util.AttributeSet);
ctor public Preference(android.content.Context);
@@ -18671,6 +19174,7 @@ package android.preference {
}
public class PreferenceCategory extends android.preference.PreferenceGroup {
+ ctor public PreferenceCategory(android.content.Context, android.util.AttributeSet, int, int);
ctor public PreferenceCategory(android.content.Context, android.util.AttributeSet, int);
ctor public PreferenceCategory(android.content.Context, android.util.AttributeSet);
ctor public PreferenceCategory(android.content.Context);
@@ -18692,6 +19196,7 @@ package android.preference {
}
public abstract class PreferenceGroup extends android.preference.Preference {
+ ctor public PreferenceGroup(android.content.Context, android.util.AttributeSet, int, int);
ctor public PreferenceGroup(android.content.Context, android.util.AttributeSet, int);
ctor public PreferenceGroup(android.content.Context, android.util.AttributeSet);
method public void addItemFromInflater(android.preference.Preference);
@@ -18746,6 +19251,7 @@ package android.preference {
}
public class RingtonePreference extends android.preference.Preference implements android.preference.PreferenceManager.OnActivityResultListener {
+ ctor public RingtonePreference(android.content.Context, android.util.AttributeSet, int, int);
ctor public RingtonePreference(android.content.Context, android.util.AttributeSet, int);
ctor public RingtonePreference(android.content.Context, android.util.AttributeSet);
ctor public RingtonePreference(android.content.Context);
@@ -18762,6 +19268,7 @@ package android.preference {
}
public class SwitchPreference extends android.preference.TwoStatePreference {
+ ctor public SwitchPreference(android.content.Context, android.util.AttributeSet, int, int);
ctor public SwitchPreference(android.content.Context, android.util.AttributeSet, int);
ctor public SwitchPreference(android.content.Context, android.util.AttributeSet);
ctor public SwitchPreference(android.content.Context);
@@ -18774,6 +19281,7 @@ package android.preference {
}
public abstract class TwoStatePreference extends android.preference.Preference {
+ ctor public TwoStatePreference(android.content.Context, android.util.AttributeSet, int, int);
ctor public TwoStatePreference(android.content.Context, android.util.AttributeSet, int);
ctor public TwoStatePreference(android.content.Context, android.util.AttributeSet);
ctor public TwoStatePreference(android.content.Context);
@@ -22514,6 +23022,9 @@ package android.renderscript {
}
public class Type extends android.renderscript.BaseObj {
+ method public static android.renderscript.Type createX(android.renderscript.RenderScript, android.renderscript.Element, int);
+ method public static android.renderscript.Type createXY(android.renderscript.RenderScript, android.renderscript.Element, int, int);
+ method public static android.renderscript.Type createXYZ(android.renderscript.RenderScript, android.renderscript.Element, int, int, int);
method public int getCount();
method public android.renderscript.Element getElement();
method public int getX();
@@ -22901,11 +23412,52 @@ package android.speech {
package android.speech.tts {
+ public final class RequestConfig {
+ method public android.os.Bundle getAudioParams();
+ method public android.speech.tts.VoiceInfo getVoice();
+ method public android.os.Bundle getVoiceParams();
+ }
+
+ public static final class RequestConfig.Builder {
+ method public android.speech.tts.RequestConfig build();
+ method public static android.speech.tts.RequestConfig.Builder newBuilder();
+ method public static android.speech.tts.RequestConfig.Builder newBuilder(android.speech.tts.RequestConfig);
+ method public android.speech.tts.RequestConfig.Builder setAudioParam(java.lang.String, java.lang.Object);
+ method public void setAudioParamPan(float);
+ method public void setAudioParamStream(int);
+ method public void setAudioParamVolume(float);
+ method public android.speech.tts.RequestConfig.Builder setVoice(android.speech.tts.VoiceInfo);
+ method public android.speech.tts.RequestConfig.Builder setVoiceParam(java.lang.String, java.lang.Object);
+ }
+
+ public final class RequestConfigHelper {
+ method public static android.speech.tts.RequestConfig highestQuality(android.speech.tts.TextToSpeechClient.EngineStatus, boolean, android.speech.tts.RequestConfigHelper.VoiceScorer);
+ method public static android.speech.tts.RequestConfig highestQuality(android.speech.tts.TextToSpeechClient.EngineStatus, boolean);
+ }
+
+ public static final class RequestConfigHelper.ExactLocaleMatcher implements android.speech.tts.RequestConfigHelper.VoiceScorer {
+ ctor public RequestConfigHelper.ExactLocaleMatcher(java.util.Locale);
+ method public int scoreVoice(android.speech.tts.VoiceInfo);
+ }
+
+ public static final class RequestConfigHelper.LanguageMatcher implements android.speech.tts.RequestConfigHelper.VoiceScorer {
+ ctor public RequestConfigHelper.LanguageMatcher(java.util.Locale);
+ method public int scoreVoice(android.speech.tts.VoiceInfo);
+ }
+
+ public static abstract interface RequestConfigHelper.VoiceScorer {
+ method public abstract int scoreVoice(android.speech.tts.VoiceInfo);
+ }
+
public abstract interface SynthesisCallback {
method public abstract int audioAvailable(byte[], int, int);
method public abstract int done();
method public abstract void error();
+ method public abstract void error(int);
+ method public abstract int fallback();
method public abstract int getMaxBufferSize();
+ method public abstract boolean hasFinished();
+ method public abstract boolean hasStarted();
method public abstract int start(int, int, int);
}
@@ -22921,7 +23473,17 @@ package android.speech.tts {
method public java.lang.String getVariant();
}
- public class TextToSpeech {
+ public final class SynthesisRequestV2 implements android.os.Parcelable {
+ method public int describeContents();
+ method public android.os.Bundle getAudioParams();
+ method public java.lang.String getText();
+ method public java.lang.String getUtteranceId();
+ method public java.lang.String getVoiceName();
+ method public android.os.Bundle getVoiceParams();
+ method public void writeToParcel(android.os.Parcel, int);
+ }
+
+ public deprecated class TextToSpeech {
ctor public TextToSpeech(android.content.Context, android.speech.tts.TextToSpeech.OnInitListener);
ctor public TextToSpeech(android.content.Context, android.speech.tts.TextToSpeech.OnInitListener, java.lang.String);
method public int addEarcon(java.lang.String, java.lang.String, int);
@@ -23006,8 +23568,80 @@ package android.speech.tts {
method public abstract void onUtteranceCompleted(java.lang.String);
}
+ public final class TextToSpeechClient {
+ ctor public TextToSpeechClient(android.content.Context, java.lang.String, boolean, android.speech.tts.TextToSpeechClient.RequestCallbacks, android.speech.tts.TextToSpeechClient.ConnectionCallbacks);
+ ctor public TextToSpeechClient(android.content.Context, android.speech.tts.TextToSpeechClient.RequestCallbacks, android.speech.tts.TextToSpeechClient.ConnectionCallbacks);
+ method public void connect();
+ method public void disconnect();
+ method public android.speech.tts.TextToSpeechClient.EngineStatus getEngineStatus();
+ method public boolean isConnected();
+ method public void queueAudio(android.net.Uri, android.speech.tts.TextToSpeechClient.UtteranceId, android.speech.tts.RequestConfig, android.speech.tts.TextToSpeechClient.RequestCallbacks);
+ method public void queueSilence(long, android.speech.tts.TextToSpeechClient.UtteranceId, android.speech.tts.TextToSpeechClient.RequestCallbacks);
+ method public void queueSpeak(java.lang.String, android.speech.tts.TextToSpeechClient.UtteranceId, android.speech.tts.RequestConfig, android.speech.tts.TextToSpeechClient.RequestCallbacks);
+ method public void queueSynthesizeToFile(java.lang.String, android.speech.tts.TextToSpeechClient.UtteranceId, java.io.File, android.speech.tts.RequestConfig, android.speech.tts.TextToSpeechClient.RequestCallbacks);
+ method public void stop();
+ }
+
+ public static abstract interface TextToSpeechClient.ConnectionCallbacks {
+ method public abstract void onConnectionFailure();
+ method public abstract void onConnectionSuccess();
+ method public abstract void onEngineStatusChange(android.speech.tts.TextToSpeechClient.EngineStatus);
+ method public abstract void onServiceDisconnected();
+ }
+
+ public static final class TextToSpeechClient.EngineStatus {
+ method public java.lang.String getEnginePackage();
+ method public java.util.List<android.speech.tts.VoiceInfo> getVoices();
+ }
+
+ public static final class TextToSpeechClient.Params {
+ field public static final java.lang.String AUDIO_PARAM_PAN = "pan";
+ field public static final java.lang.String AUDIO_PARAM_STREAM = "streamType";
+ field public static final java.lang.String AUDIO_PARAM_VOLUME = "volume";
+ field public static final java.lang.String FALLBACK_VOICE_NAME = "fallbackVoiceName";
+ field public static final java.lang.String NETWORK_RETRIES_COUNT = "networkRetriesCount";
+ field public static final java.lang.String NETWORK_TIMEOUT_MS = "networkTimeoutMs";
+ field public static final java.lang.String SPEECH_PITCH = "speechPitch";
+ field public static final java.lang.String SPEECH_SPEED = "speechSpeed";
+ field public static final java.lang.String TRACK_SUBUTTERANCE_PROGRESS = "trackSubutteranceProgress";
+ }
+
+ public static abstract class TextToSpeechClient.RequestCallbacks {
+ ctor public TextToSpeechClient.RequestCallbacks();
+ method public void onSynthesisFailure(android.speech.tts.TextToSpeechClient.UtteranceId, int);
+ method public void onSynthesisFallback(android.speech.tts.TextToSpeechClient.UtteranceId);
+ method public void onSynthesisProgress(android.speech.tts.TextToSpeechClient.UtteranceId, int, int);
+ method public void onSynthesisStart(android.speech.tts.TextToSpeechClient.UtteranceId);
+ method public void onSynthesisStop(android.speech.tts.TextToSpeechClient.UtteranceId);
+ method public void onSynthesisSuccess(android.speech.tts.TextToSpeechClient.UtteranceId);
+ }
+
+ public static final class TextToSpeechClient.Status {
+ field public static final int ERROR_DOWNLOADING_ADDITIONAL_DATA = 17; // 0x11
+ field public static final int ERROR_INVALID_REQUEST = 15; // 0xf
+ field public static final int ERROR_NETWORK = 13; // 0xd
+ field public static final int ERROR_NETWORK_TIMEOUT = 14; // 0xe
+ field public static final int ERROR_NON_UNIQUE_UTTERANCE_ID = 16; // 0x10
+ field public static final int ERROR_OUTPUT = 12; // 0xc
+ field public static final int ERROR_SERVICE = 11; // 0xb
+ field public static final int ERROR_SYNTHESIS = 10; // 0xa
+ field public static final int ERROR_UNKNOWN = -1; // 0xffffffff
+ field public static final int STOPPED = 100; // 0x64
+ field public static final int SUCCESS = 0; // 0x0
+ }
+
+ public static final class TextToSpeechClient.UtteranceId {
+ ctor public TextToSpeechClient.UtteranceId();
+ ctor public TextToSpeechClient.UtteranceId(java.lang.String);
+ method public java.lang.String toUniqueString();
+ }
+
public abstract class TextToSpeechService extends android.app.Service {
ctor public TextToSpeechService();
+ method protected java.util.List<android.speech.tts.VoiceInfo> checkVoicesInfo();
+ method public void forceVoicesInfoCheck();
+ method public android.speech.tts.VoiceInfo getVoicesInfoWithName(java.lang.String);
+ method protected boolean implementsV2API();
method public android.os.IBinder onBind(android.content.Intent);
method protected java.util.Set<java.lang.String> onGetFeaturesForLanguage(java.lang.String, java.lang.String, java.lang.String);
method protected abstract java.lang.String[] onGetLanguage();
@@ -23015,6 +23649,8 @@ package android.speech.tts {
method protected abstract int onLoadLanguage(java.lang.String, java.lang.String, java.lang.String);
method protected abstract void onStop();
method protected abstract void onSynthesizeText(android.speech.tts.SynthesisRequest, android.speech.tts.SynthesisCallback);
+ method protected void onSynthesizeTextV2(android.speech.tts.SynthesisRequestV2, android.speech.tts.VoiceInfo, android.speech.tts.SynthesisCallback);
+ method protected void onVoicesInfoChange();
}
public abstract class UtteranceProgressListener {
@@ -23024,6 +23660,44 @@ package android.speech.tts {
method public abstract void onStart(java.lang.String);
}
+ public final class VoiceInfo implements android.os.Parcelable {
+ method public int describeContents();
+ method public android.os.Bundle getAdditionalFeatures();
+ method public int getLatency();
+ method public java.util.Locale getLocale();
+ method public java.lang.String getName();
+ method public android.os.Bundle getParamsWithDefaults();
+ method public int getQuality();
+ method public boolean getRequiresNetworkConnection();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final java.lang.String FEATURE_MAY_AUTOINSTALL = "mayAutoInstall";
+ field public static final java.lang.String FEATURE_SPEAKER_GENDER = "speakerGender";
+ field public static final java.lang.String FEATURE_WORDS_PER_MINUTE = "wordsPerMinute";
+ field public static final int LATENCY_HIGH = 400; // 0x190
+ field public static final int LATENCY_LOW = 200; // 0xc8
+ field public static final int LATENCY_NORMAL = 300; // 0x12c
+ field public static final int LATENCY_VERY_HIGH = 500; // 0x1f4
+ field public static final int LATENCY_VERY_LOW = 100; // 0x64
+ field public static final int QUALITY_HIGH = 400; // 0x190
+ field public static final int QUALITY_LOW = 200; // 0xc8
+ field public static final int QUALITY_NORMAL = 300; // 0x12c
+ field public static final int QUALITY_VERY_HIGH = 500; // 0x1f4
+ field public static final int QUALITY_VERY_LOW = 100; // 0x64
+ }
+
+ public static final class VoiceInfo.Builder {
+ ctor public VoiceInfo.Builder();
+ ctor public VoiceInfo.Builder(android.speech.tts.VoiceInfo);
+ method public android.speech.tts.VoiceInfo build();
+ method public android.speech.tts.VoiceInfo.Builder setAdditionalFeatures(android.os.Bundle);
+ method public android.speech.tts.VoiceInfo.Builder setLatency(int);
+ method public android.speech.tts.VoiceInfo.Builder setLocale(java.util.Locale);
+ method public android.speech.tts.VoiceInfo.Builder setName(java.lang.String);
+ method public android.speech.tts.VoiceInfo.Builder setParamsWithDefaults(android.os.Bundle);
+ method public android.speech.tts.VoiceInfo.Builder setQuality(int);
+ method public android.speech.tts.VoiceInfo.Builder setRequiresNetworkConnection(boolean);
+ }
+
}
package android.telephony {
@@ -26472,6 +27146,7 @@ package android.view {
}
public class HapticFeedbackConstants {
+ field public static final int CLOCK_TICK = 4; // 0x4
field public static final int FLAG_IGNORE_GLOBAL_SETTING = 2; // 0x2
field public static final int FLAG_IGNORE_VIEW_SETTING = 1; // 0x1
field public static final int KEYBOARD_TAP = 3; // 0x3
@@ -27422,6 +28097,7 @@ package android.view {
ctor public SurfaceView(android.content.Context);
ctor public SurfaceView(android.content.Context, android.util.AttributeSet);
ctor public SurfaceView(android.content.Context, android.util.AttributeSet, int);
+ ctor public SurfaceView(android.content.Context, android.util.AttributeSet, int, int);
method public boolean gatherTransparentRegion(android.graphics.Region);
method public android.view.SurfaceHolder getHolder();
method public void setSecure(boolean);
@@ -27433,6 +28109,7 @@ package android.view {
ctor public TextureView(android.content.Context);
ctor public TextureView(android.content.Context, android.util.AttributeSet);
ctor public TextureView(android.content.Context, android.util.AttributeSet, int);
+ ctor public TextureView(android.content.Context, android.util.AttributeSet, int, int);
method public final void draw(android.graphics.Canvas);
method public android.graphics.Bitmap getBitmap();
method public android.graphics.Bitmap getBitmap(int, int);
@@ -27484,6 +28161,7 @@ package android.view {
ctor public View(android.content.Context);
ctor public View(android.content.Context, android.util.AttributeSet);
ctor public View(android.content.Context, android.util.AttributeSet, int);
+ ctor public View(android.content.Context, android.util.AttributeSet, int, int);
method public void addChildrenForAccessibility(java.util.ArrayList<android.view.View>);
method public void addFocusables(java.util.ArrayList<android.view.View>, int);
method public void addFocusables(java.util.ArrayList<android.view.View>, int, int);
@@ -28222,6 +28900,7 @@ package android.view {
ctor public ViewGroup(android.content.Context);
ctor public ViewGroup(android.content.Context, android.util.AttributeSet);
ctor public ViewGroup(android.content.Context, android.util.AttributeSet, int);
+ ctor public ViewGroup(android.content.Context, android.util.AttributeSet, int, int);
method public boolean addStatesFromChildren();
method public void addView(android.view.View);
method public void addView(android.view.View, int);
@@ -28473,6 +29152,7 @@ package android.view {
ctor public ViewStub(android.content.Context, int);
ctor public ViewStub(android.content.Context, android.util.AttributeSet);
ctor public ViewStub(android.content.Context, android.util.AttributeSet, int);
+ ctor public ViewStub(android.content.Context, android.util.AttributeSet, int, int);
method public int getInflatedId();
method public android.view.LayoutInflater getLayoutInflater();
method public int getLayoutResource();
@@ -30234,6 +30914,7 @@ package android.webkit {
ctor public WebView(android.content.Context);
ctor public WebView(android.content.Context, android.util.AttributeSet);
ctor public WebView(android.content.Context, android.util.AttributeSet, int);
+ ctor public WebView(android.content.Context, android.util.AttributeSet, int, int);
ctor public deprecated WebView(android.content.Context, android.util.AttributeSet, int, boolean);
method public void addJavascriptInterface(java.lang.Object, java.lang.String);
method public boolean canGoBack();
@@ -30408,6 +31089,7 @@ package android.widget {
ctor public AbsListView(android.content.Context);
ctor public AbsListView(android.content.Context, android.util.AttributeSet);
ctor public AbsListView(android.content.Context, android.util.AttributeSet, int);
+ ctor public AbsListView(android.content.Context, android.util.AttributeSet, int, int);
method public void afterTextChanged(android.text.Editable);
method public void beforeTextChanged(java.lang.CharSequence, int, int, int);
method public boolean canScrollList(int);
@@ -30459,6 +31141,7 @@ package android.widget {
method public void setDrawSelectorOnTop(boolean);
method public void setFastScrollAlwaysVisible(boolean);
method public void setFastScrollEnabled(boolean);
+ method public void setFastScrollStyle(int);
method public void setFilterText(java.lang.String);
method public void setFriction(float);
method public void setItemChecked(int, boolean);
@@ -30521,6 +31204,7 @@ package android.widget {
ctor public AbsSeekBar(android.content.Context);
ctor public AbsSeekBar(android.content.Context, android.util.AttributeSet);
ctor public AbsSeekBar(android.content.Context, android.util.AttributeSet, int);
+ ctor public AbsSeekBar(android.content.Context, android.util.AttributeSet, int, int);
method public int getKeyProgressIncrement();
method public android.graphics.drawable.Drawable getThumb();
method public int getThumbOffset();
@@ -30533,6 +31217,7 @@ package android.widget {
ctor public AbsSpinner(android.content.Context);
ctor public AbsSpinner(android.content.Context, android.util.AttributeSet);
ctor public AbsSpinner(android.content.Context, android.util.AttributeSet, int);
+ ctor public AbsSpinner(android.content.Context, android.util.AttributeSet, int, int);
method public android.widget.SpinnerAdapter getAdapter();
method public android.view.View getSelectedView();
method public void onRestoreInstanceState(android.os.Parcelable);
@@ -30547,6 +31232,7 @@ package android.widget {
ctor public AbsoluteLayout(android.content.Context);
ctor public AbsoluteLayout(android.content.Context, android.util.AttributeSet);
ctor public AbsoluteLayout(android.content.Context, android.util.AttributeSet, int);
+ ctor public AbsoluteLayout(android.content.Context, android.util.AttributeSet, int, int);
method protected void onLayout(boolean, int, int, int, int);
}
@@ -30578,6 +31264,7 @@ package android.widget {
ctor public AdapterView(android.content.Context);
ctor public AdapterView(android.content.Context, android.util.AttributeSet);
ctor public AdapterView(android.content.Context, android.util.AttributeSet, int);
+ ctor public AdapterView(android.content.Context, android.util.AttributeSet, int, int);
method public abstract T getAdapter();
method public int getCount();
method public android.view.View getEmptyView();
@@ -30631,6 +31318,7 @@ package android.widget {
ctor public AdapterViewAnimator(android.content.Context);
ctor public AdapterViewAnimator(android.content.Context, android.util.AttributeSet);
ctor public AdapterViewAnimator(android.content.Context, android.util.AttributeSet, int);
+ ctor public AdapterViewAnimator(android.content.Context, android.util.AttributeSet, int, int);
method public void advance();
method public void deferNotifyDataSetChanged();
method public void fyiWillBeAdvancedByHostKThx();
@@ -30660,6 +31348,8 @@ package android.widget {
public class AdapterViewFlipper extends android.widget.AdapterViewAnimator {
ctor public AdapterViewFlipper(android.content.Context);
ctor public AdapterViewFlipper(android.content.Context, android.util.AttributeSet);
+ ctor public AdapterViewFlipper(android.content.Context, android.util.AttributeSet, int);
+ ctor public AdapterViewFlipper(android.content.Context, android.util.AttributeSet, int, int);
method public int getFlipInterval();
method public boolean isAutoStart();
method public boolean isFlipping();
@@ -30690,6 +31380,7 @@ package android.widget {
ctor public AnalogClock(android.content.Context);
ctor public AnalogClock(android.content.Context, android.util.AttributeSet);
ctor public AnalogClock(android.content.Context, android.util.AttributeSet, int);
+ ctor public AnalogClock(android.content.Context, android.util.AttributeSet, int, int);
}
public class ArrayAdapter extends android.widget.BaseAdapter implements android.widget.Filterable {
@@ -30722,6 +31413,7 @@ package android.widget {
ctor public AutoCompleteTextView(android.content.Context);
ctor public AutoCompleteTextView(android.content.Context, android.util.AttributeSet);
ctor public AutoCompleteTextView(android.content.Context, android.util.AttributeSet, int);
+ ctor public AutoCompleteTextView(android.content.Context, android.util.AttributeSet, int, int);
method public void clearListSelection();
method protected java.lang.CharSequence convertSelectionToString(java.lang.Object);
method public void dismissDropDown();
@@ -30814,12 +31506,14 @@ package android.widget {
ctor public Button(android.content.Context);
ctor public Button(android.content.Context, android.util.AttributeSet);
ctor public Button(android.content.Context, android.util.AttributeSet, int);
+ ctor public Button(android.content.Context, android.util.AttributeSet, int, int);
}
public class CalendarView extends android.widget.FrameLayout {
ctor public CalendarView(android.content.Context);
ctor public CalendarView(android.content.Context, android.util.AttributeSet);
ctor public CalendarView(android.content.Context, android.util.AttributeSet, int);
+ ctor public CalendarView(android.content.Context, android.util.AttributeSet, int, int);
method public long getDate();
method public int getDateTextAppearance();
method public int getFirstDayOfWeek();
@@ -30861,6 +31555,7 @@ package android.widget {
ctor public CheckBox(android.content.Context);
ctor public CheckBox(android.content.Context, android.util.AttributeSet);
ctor public CheckBox(android.content.Context, android.util.AttributeSet, int);
+ ctor public CheckBox(android.content.Context, android.util.AttributeSet, int, int);
}
public abstract interface Checkable {
@@ -30873,6 +31568,7 @@ package android.widget {
ctor public CheckedTextView(android.content.Context);
ctor public CheckedTextView(android.content.Context, android.util.AttributeSet);
ctor public CheckedTextView(android.content.Context, android.util.AttributeSet, int);
+ ctor public CheckedTextView(android.content.Context, android.util.AttributeSet, int, int);
method public android.graphics.drawable.Drawable getCheckMarkDrawable();
method public boolean isChecked();
method public void setCheckMarkDrawable(int);
@@ -30885,6 +31581,7 @@ package android.widget {
ctor public Chronometer(android.content.Context);
ctor public Chronometer(android.content.Context, android.util.AttributeSet);
ctor public Chronometer(android.content.Context, android.util.AttributeSet, int);
+ ctor public Chronometer(android.content.Context, android.util.AttributeSet, int, int);
method public long getBase();
method public java.lang.String getFormat();
method public android.widget.Chronometer.OnChronometerTickListener getOnChronometerTickListener();
@@ -30903,6 +31600,7 @@ package android.widget {
ctor public CompoundButton(android.content.Context);
ctor public CompoundButton(android.content.Context, android.util.AttributeSet);
ctor public CompoundButton(android.content.Context, android.util.AttributeSet, int);
+ ctor public CompoundButton(android.content.Context, android.util.AttributeSet, int, int);
method public boolean isChecked();
method public void setButtonDrawable(int);
method public void setButtonDrawable(android.graphics.drawable.Drawable);
@@ -30974,6 +31672,7 @@ package android.widget {
ctor public DatePicker(android.content.Context);
ctor public DatePicker(android.content.Context, android.util.AttributeSet);
ctor public DatePicker(android.content.Context, android.util.AttributeSet, int);
+ ctor public DatePicker(android.content.Context, android.util.AttributeSet, int, int);
method public android.widget.CalendarView getCalendarView();
method public boolean getCalendarViewShown();
method public int getDayOfMonth();
@@ -31037,6 +31736,7 @@ package android.widget {
ctor public EditText(android.content.Context);
ctor public EditText(android.content.Context, android.util.AttributeSet);
ctor public EditText(android.content.Context, android.util.AttributeSet, int);
+ ctor public EditText(android.content.Context, android.util.AttributeSet, int, int);
method public void extendSelection(int);
method public void selectAll();
method public void setSelection(int, int);
@@ -31068,6 +31768,7 @@ package android.widget {
ctor public ExpandableListView(android.content.Context);
ctor public ExpandableListView(android.content.Context, android.util.AttributeSet);
ctor public ExpandableListView(android.content.Context, android.util.AttributeSet, int);
+ ctor public ExpandableListView(android.content.Context, android.util.AttributeSet, int, int);
method public boolean collapseGroup(int);
method public boolean expandGroup(int);
method public boolean expandGroup(int, boolean);
@@ -31157,6 +31858,7 @@ package android.widget {
ctor public FrameLayout(android.content.Context);
ctor public FrameLayout(android.content.Context, android.util.AttributeSet);
ctor public FrameLayout(android.content.Context, android.util.AttributeSet, int);
+ ctor public FrameLayout(android.content.Context, android.util.AttributeSet, int, int);
method public deprecated boolean getConsiderGoneChildrenWhenMeasuring();
method public android.graphics.drawable.Drawable getForeground();
method public int getForegroundGravity();
@@ -31181,6 +31883,7 @@ package android.widget {
ctor public Gallery(android.content.Context);
ctor public Gallery(android.content.Context, android.util.AttributeSet);
ctor public Gallery(android.content.Context, android.util.AttributeSet, int);
+ ctor public Gallery(android.content.Context, android.util.AttributeSet, int, int);
method public boolean onDown(android.view.MotionEvent);
method public boolean onFling(android.view.MotionEvent, android.view.MotionEvent, float, float);
method public void onLongPress(android.view.MotionEvent);
@@ -31201,9 +31904,10 @@ package android.widget {
}
public class GridLayout extends android.view.ViewGroup {
- ctor public GridLayout(android.content.Context, android.util.AttributeSet, int);
- ctor public GridLayout(android.content.Context, android.util.AttributeSet);
ctor public GridLayout(android.content.Context);
+ ctor public GridLayout(android.content.Context, android.util.AttributeSet);
+ ctor public GridLayout(android.content.Context, android.util.AttributeSet, int);
+ ctor public GridLayout(android.content.Context, android.util.AttributeSet, int, int);
method public int getAlignmentMode();
method public int getColumnCount();
method public int getOrientation();
@@ -31261,6 +31965,7 @@ package android.widget {
ctor public GridView(android.content.Context);
ctor public GridView(android.content.Context, android.util.AttributeSet);
ctor public GridView(android.content.Context, android.util.AttributeSet, int);
+ ctor public GridView(android.content.Context, android.util.AttributeSet, int, int);
method public android.widget.ListAdapter getAdapter();
method public int getColumnWidth();
method public int getGravity();
@@ -31318,6 +32023,7 @@ package android.widget {
ctor public HorizontalScrollView(android.content.Context);
ctor public HorizontalScrollView(android.content.Context, android.util.AttributeSet);
ctor public HorizontalScrollView(android.content.Context, android.util.AttributeSet, int);
+ ctor public HorizontalScrollView(android.content.Context, android.util.AttributeSet, int, int);
method public boolean arrowScroll(int);
method protected int computeScrollDeltaToGetChildRectOnScreen(android.graphics.Rect);
method public boolean executeKeyEvent(android.view.KeyEvent);
@@ -31337,6 +32043,7 @@ package android.widget {
ctor public ImageButton(android.content.Context);
ctor public ImageButton(android.content.Context, android.util.AttributeSet);
ctor public ImageButton(android.content.Context, android.util.AttributeSet, int);
+ ctor public ImageButton(android.content.Context, android.util.AttributeSet, int, int);
}
public class ImageSwitcher extends android.widget.ViewSwitcher {
@@ -31351,6 +32058,7 @@ package android.widget {
ctor public ImageView(android.content.Context);
ctor public ImageView(android.content.Context, android.util.AttributeSet);
ctor public ImageView(android.content.Context, android.util.AttributeSet, int);
+ ctor public ImageView(android.content.Context, android.util.AttributeSet, int, int);
method public final void clearColorFilter();
method public boolean getAdjustViewBounds();
method public boolean getBaselineAlignBottom();
@@ -31402,6 +32110,7 @@ package android.widget {
ctor public LinearLayout(android.content.Context);
ctor public LinearLayout(android.content.Context, android.util.AttributeSet);
ctor public LinearLayout(android.content.Context, android.util.AttributeSet, int);
+ ctor public LinearLayout(android.content.Context, android.util.AttributeSet, int, int);
method public int getBaselineAlignedChildIndex();
method public android.graphics.drawable.Drawable getDividerDrawable();
method public int getDividerPadding();
@@ -31512,6 +32221,7 @@ package android.widget {
ctor public ListView(android.content.Context);
ctor public ListView(android.content.Context, android.util.AttributeSet);
ctor public ListView(android.content.Context, android.util.AttributeSet, int);
+ ctor public ListView(android.content.Context, android.util.AttributeSet, int, int);
method public void addFooterView(android.view.View, java.lang.Object, boolean);
method public void addFooterView(android.view.View);
method public void addHeaderView(android.view.View, java.lang.Object, boolean);
@@ -31584,6 +32294,7 @@ package android.widget {
ctor public MultiAutoCompleteTextView(android.content.Context);
ctor public MultiAutoCompleteTextView(android.content.Context, android.util.AttributeSet);
ctor public MultiAutoCompleteTextView(android.content.Context, android.util.AttributeSet, int);
+ ctor public MultiAutoCompleteTextView(android.content.Context, android.util.AttributeSet, int, int);
method protected void performFiltering(java.lang.CharSequence, int, int, int);
method public void setTokenizer(android.widget.MultiAutoCompleteTextView.Tokenizer);
}
@@ -31605,6 +32316,7 @@ package android.widget {
ctor public NumberPicker(android.content.Context);
ctor public NumberPicker(android.content.Context, android.util.AttributeSet);
ctor public NumberPicker(android.content.Context, android.util.AttributeSet, int);
+ ctor public NumberPicker(android.content.Context, android.util.AttributeSet, int, int);
method public java.lang.String[] getDisplayedValues();
method public int getMaxValue();
method public int getMinValue();
@@ -31750,6 +32462,7 @@ package android.widget {
ctor public ProgressBar(android.content.Context);
ctor public ProgressBar(android.content.Context, android.util.AttributeSet);
ctor public ProgressBar(android.content.Context, android.util.AttributeSet, int);
+ ctor public ProgressBar(android.content.Context, android.util.AttributeSet, int, int);
method public android.graphics.drawable.Drawable getIndeterminateDrawable();
method public android.view.animation.Interpolator getInterpolator();
method public synchronized int getMax();
@@ -31763,11 +32476,13 @@ package android.widget {
method public android.os.Parcelable onSaveInstanceState();
method public synchronized void setIndeterminate(boolean);
method public void setIndeterminateDrawable(android.graphics.drawable.Drawable);
+ method public void setIndeterminateDrawableTiled(android.graphics.drawable.Drawable);
method public void setInterpolator(android.content.Context, int);
method public void setInterpolator(android.view.animation.Interpolator);
method public synchronized void setMax(int);
method public synchronized void setProgress(int);
method public void setProgressDrawable(android.graphics.drawable.Drawable);
+ method public void setProgressDrawableTiled(android.graphics.drawable.Drawable);
method public synchronized void setSecondaryProgress(int);
}
@@ -31775,6 +32490,7 @@ package android.widget {
ctor public QuickContactBadge(android.content.Context);
ctor public QuickContactBadge(android.content.Context, android.util.AttributeSet);
ctor public QuickContactBadge(android.content.Context, android.util.AttributeSet, int);
+ ctor public QuickContactBadge(android.content.Context, android.util.AttributeSet, int, int);
method public void assignContactFromEmail(java.lang.String, boolean);
method public void assignContactFromEmail(java.lang.String, boolean, android.os.Bundle);
method public void assignContactFromPhone(java.lang.String, boolean);
@@ -31791,6 +32507,7 @@ package android.widget {
ctor public RadioButton(android.content.Context);
ctor public RadioButton(android.content.Context, android.util.AttributeSet);
ctor public RadioButton(android.content.Context, android.util.AttributeSet, int);
+ ctor public RadioButton(android.content.Context, android.util.AttributeSet, int, int);
}
public class RadioGroup extends android.widget.LinearLayout {
@@ -31816,6 +32533,7 @@ package android.widget {
public class RatingBar extends android.widget.AbsSeekBar {
ctor public RatingBar(android.content.Context, android.util.AttributeSet, int);
+ ctor public RatingBar(android.content.Context, android.util.AttributeSet, int, int);
ctor public RatingBar(android.content.Context, android.util.AttributeSet);
ctor public RatingBar(android.content.Context);
method public int getNumStars();
@@ -31838,6 +32556,7 @@ package android.widget {
ctor public RelativeLayout(android.content.Context);
ctor public RelativeLayout(android.content.Context, android.util.AttributeSet);
ctor public RelativeLayout(android.content.Context, android.util.AttributeSet, int);
+ ctor public RelativeLayout(android.content.Context, android.util.AttributeSet, int, int);
method public int getGravity();
method protected void onLayout(boolean, int, int, int, int);
method public void setGravity(int);
@@ -31986,6 +32705,7 @@ package android.widget {
ctor public ScrollView(android.content.Context);
ctor public ScrollView(android.content.Context, android.util.AttributeSet);
ctor public ScrollView(android.content.Context, android.util.AttributeSet, int);
+ ctor public ScrollView(android.content.Context, android.util.AttributeSet, int, int);
method public boolean arrowScroll(int);
method protected int computeScrollDeltaToGetChildRectOnScreen(android.graphics.Rect);
method public boolean executeKeyEvent(android.view.KeyEvent);
@@ -32030,6 +32750,8 @@ package android.widget {
public class SearchView extends android.widget.LinearLayout implements android.view.CollapsibleActionView {
ctor public SearchView(android.content.Context);
ctor public SearchView(android.content.Context, android.util.AttributeSet);
+ ctor public SearchView(android.content.Context, android.util.AttributeSet, int);
+ ctor public SearchView(android.content.Context, android.util.AttributeSet, int, int);
method public int getImeOptions();
method public int getInputType();
method public int getMaxWidth();
@@ -32084,6 +32806,7 @@ package android.widget {
ctor public SeekBar(android.content.Context);
ctor public SeekBar(android.content.Context, android.util.AttributeSet);
ctor public SeekBar(android.content.Context, android.util.AttributeSet, int);
+ ctor public SeekBar(android.content.Context, android.util.AttributeSet, int, int);
method public void setOnSeekBarChangeListener(android.widget.SeekBar.OnSeekBarChangeListener);
}
@@ -32185,6 +32908,7 @@ package android.widget {
public deprecated class SlidingDrawer extends android.view.ViewGroup {
ctor public SlidingDrawer(android.content.Context, android.util.AttributeSet);
ctor public SlidingDrawer(android.content.Context, android.util.AttributeSet, int);
+ ctor public SlidingDrawer(android.content.Context, android.util.AttributeSet, int, int);
method public void animateClose();
method public void animateOpen();
method public void animateToggle();
@@ -32219,6 +32943,7 @@ package android.widget {
}
public final class Space extends android.view.View {
+ ctor public Space(android.content.Context, android.util.AttributeSet, int, int);
ctor public Space(android.content.Context, android.util.AttributeSet, int);
ctor public Space(android.content.Context, android.util.AttributeSet);
ctor public Space(android.content.Context);
@@ -32230,6 +32955,7 @@ package android.widget {
ctor public Spinner(android.content.Context, android.util.AttributeSet);
ctor public Spinner(android.content.Context, android.util.AttributeSet, int);
ctor public Spinner(android.content.Context, android.util.AttributeSet, int, int);
+ ctor public Spinner(android.content.Context, android.util.AttributeSet, int, int, int);
method public int getDropDownHorizontalOffset();
method public int getDropDownVerticalOffset();
method public int getDropDownWidth();
@@ -32257,12 +32983,14 @@ package android.widget {
ctor public StackView(android.content.Context);
ctor public StackView(android.content.Context, android.util.AttributeSet);
ctor public StackView(android.content.Context, android.util.AttributeSet, int);
+ ctor public StackView(android.content.Context, android.util.AttributeSet, int, int);
}
public class Switch extends android.widget.CompoundButton {
ctor public Switch(android.content.Context);
ctor public Switch(android.content.Context, android.util.AttributeSet);
ctor public Switch(android.content.Context, android.util.AttributeSet, int);
+ ctor public Switch(android.content.Context, android.util.AttributeSet, int, int);
method public int getSwitchMinWidth();
method public int getSwitchPadding();
method public java.lang.CharSequence getTextOff();
@@ -32288,6 +33016,8 @@ package android.widget {
public class TabHost extends android.widget.FrameLayout implements android.view.ViewTreeObserver.OnTouchModeChangeListener {
ctor public TabHost(android.content.Context);
ctor public TabHost(android.content.Context, android.util.AttributeSet);
+ ctor public TabHost(android.content.Context, android.util.AttributeSet, int);
+ ctor public TabHost(android.content.Context, android.util.AttributeSet, int, int);
method public void addTab(android.widget.TabHost.TabSpec);
method public void clearAllTabs();
method public int getCurrentTab();
@@ -32327,6 +33057,7 @@ package android.widget {
ctor public TabWidget(android.content.Context);
ctor public TabWidget(android.content.Context, android.util.AttributeSet);
ctor public TabWidget(android.content.Context, android.util.AttributeSet, int);
+ ctor public TabWidget(android.content.Context, android.util.AttributeSet, int, int);
method public void dispatchDraw(android.graphics.Canvas);
method public void focusCurrentTab(int);
method public android.view.View getChildTabViewAt(int);
@@ -32389,6 +33120,7 @@ package android.widget {
ctor public TextClock(android.content.Context);
ctor public TextClock(android.content.Context, android.util.AttributeSet);
ctor public TextClock(android.content.Context, android.util.AttributeSet, int);
+ ctor public TextClock(android.content.Context, android.util.AttributeSet, int, int);
method public java.lang.CharSequence getFormat12Hour();
method public java.lang.CharSequence getFormat24Hour();
method public java.lang.String getTimeZone();
@@ -32411,6 +33143,7 @@ package android.widget {
ctor public TextView(android.content.Context);
ctor public TextView(android.content.Context, android.util.AttributeSet);
ctor public TextView(android.content.Context, android.util.AttributeSet, int);
+ ctor public TextView(android.content.Context, android.util.AttributeSet, int, int);
method public void addTextChangedListener(android.text.TextWatcher);
method public final void append(java.lang.CharSequence);
method public void append(java.lang.CharSequence, int, int);
@@ -32618,6 +33351,7 @@ package android.widget {
ctor public TimePicker(android.content.Context);
ctor public TimePicker(android.content.Context, android.util.AttributeSet);
ctor public TimePicker(android.content.Context, android.util.AttributeSet, int);
+ ctor public TimePicker(android.content.Context, android.util.AttributeSet, int, int);
method public java.lang.Integer getCurrentHour();
method public java.lang.Integer getCurrentMinute();
method public boolean is24HourView();
@@ -32655,6 +33389,7 @@ package android.widget {
}
public class ToggleButton extends android.widget.CompoundButton {
+ ctor public ToggleButton(android.content.Context, android.util.AttributeSet, int, int);
ctor public ToggleButton(android.content.Context, android.util.AttributeSet, int);
ctor public ToggleButton(android.content.Context, android.util.AttributeSet);
ctor public ToggleButton(android.content.Context);
@@ -32668,6 +33403,7 @@ package android.widget {
ctor public TwoLineListItem(android.content.Context);
ctor public TwoLineListItem(android.content.Context, android.util.AttributeSet);
ctor public TwoLineListItem(android.content.Context, android.util.AttributeSet, int);
+ ctor public TwoLineListItem(android.content.Context, android.util.AttributeSet, int, int);
method public android.widget.TextView getText1();
method public android.widget.TextView getText2();
}
@@ -32676,6 +33412,7 @@ package android.widget {
ctor public VideoView(android.content.Context);
ctor public VideoView(android.content.Context, android.util.AttributeSet);
ctor public VideoView(android.content.Context, android.util.AttributeSet, int);
+ ctor public VideoView(android.content.Context, android.util.AttributeSet, int, int);
method public void addSubtitleSource(java.io.InputStream, android.media.MediaFormat);
method public boolean canPause();
method public boolean canSeekBackward();
@@ -32750,6 +33487,7 @@ package android.widget {
ctor public ZoomButton(android.content.Context);
ctor public ZoomButton(android.content.Context, android.util.AttributeSet);
ctor public ZoomButton(android.content.Context, android.util.AttributeSet, int);
+ ctor public ZoomButton(android.content.Context, android.util.AttributeSet, int, int);
method public boolean onLongClick(android.view.View);
method public void setZoomSpeed(long);
}
@@ -42716,11 +43454,11 @@ package java.util.concurrent {
}
public class ConcurrentHashMap extends java.util.AbstractMap implements java.util.concurrent.ConcurrentMap java.io.Serializable {
- ctor public ConcurrentHashMap(int, float, int);
- ctor public ConcurrentHashMap(int, float);
- ctor public ConcurrentHashMap(int);
ctor public ConcurrentHashMap();
+ ctor public ConcurrentHashMap(int);
ctor public ConcurrentHashMap(java.util.Map<? extends K, ? extends V>);
+ ctor public ConcurrentHashMap(int, float);
+ ctor public ConcurrentHashMap(int, float, int);
method public boolean contains(java.lang.Object);
method public java.util.Enumeration<V> elements();
method public java.util.Set<java.util.Map.Entry<K, V>> entrySet();
diff --git a/core/java/android/animation/AnimatorInflater.java b/core/java/android/animation/AnimatorInflater.java
index d753e32..20236aa 100644
--- a/core/java/android/animation/AnimatorInflater.java
+++ b/core/java/android/animation/AnimatorInflater.java
@@ -215,7 +215,7 @@ public class AnimatorInflater {
(toType <= TypedValue.TYPE_LAST_COLOR_INT))) {
// special case for colors: ignore valueType and get ints
getFloats = false;
- anim.setEvaluator(new ArgbEvaluator());
+ evaluator = ArgbEvaluator.getInstance();
}
if (getFloats) {
diff --git a/core/java/android/animation/ArgbEvaluator.java b/core/java/android/animation/ArgbEvaluator.java
index 717a3d9..ed07195 100644
--- a/core/java/android/animation/ArgbEvaluator.java
+++ b/core/java/android/animation/ArgbEvaluator.java
@@ -21,6 +21,19 @@ package android.animation;
* values that represent ARGB colors.
*/
public class ArgbEvaluator implements TypeEvaluator {
+ private static final ArgbEvaluator sInstance = new ArgbEvaluator();
+
+ /**
+ * Returns an instance of <code>ArgbEvaluator</code> that may be used in
+ * {@link ValueAnimator#setEvaluator(TypeEvaluator)}. The same instance may
+ * be used in multiple <code>Animator</code>s because it holds no state.
+ * @return An instance of <code>ArgbEvalutor</code>.
+ *
+ * @hide
+ */
+ public static ArgbEvaluator getInstance() {
+ return sInstance;
+ }
/**
* This function returns the calculated in-between value for a color
diff --git a/core/java/android/animation/FloatArrayEvaluator.java b/core/java/android/animation/FloatArrayEvaluator.java
new file mode 100644
index 0000000..9ae1197
--- /dev/null
+++ b/core/java/android/animation/FloatArrayEvaluator.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2013 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.animation;
+
+/**
+ * This evaluator can be used to perform type interpolation between <code>float[]</code> values.
+ * Each index into the array is treated as a separate value to interpolate. For example,
+ * evaluating <code>{100, 200}</code> and <code>{300, 400}</code> will interpolate the value at
+ * the first index between 100 and 300 and the value at the second index value between 200 and 400.
+ */
+public class FloatArrayEvaluator implements TypeEvaluator<float[]> {
+
+ private float[] mArray;
+
+ /**
+ * Create a FloatArrayEvaluator that does not reuse the animated value. Care must be taken
+ * when using this option because on every evaluation a new <code>float[]</code> will be
+ * allocated.
+ *
+ * @see #FloatArrayEvaluator(float[])
+ */
+ public FloatArrayEvaluator() {
+ }
+
+ /**
+ * Create a FloatArrayEvaluator that reuses <code>reuseArray</code> for every evaluate() call.
+ * Caution must be taken to ensure that the value returned from
+ * {@link android.animation.ValueAnimator#getAnimatedValue()} is not cached, modified, or
+ * used across threads. The value will be modified on each <code>evaluate()</code> call.
+ *
+ * @param reuseArray The array to modify and return from <code>evaluate</code>.
+ */
+ public FloatArrayEvaluator(float[] reuseArray) {
+ mArray = reuseArray;
+ }
+
+ /**
+ * Interpolates the value at each index by the fraction. If
+ * {@link #FloatArrayEvaluator(float[])} was used to construct this object,
+ * <code>reuseArray</code> will be returned, otherwise a new <code>float[]</code>
+ * will be returned.
+ *
+ * @param fraction The fraction from the starting to the ending values
+ * @param startValue The start value.
+ * @param endValue The end value.
+ * @return A <code>float[]</code> where each element is an interpolation between
+ * the same index in startValue and endValue.
+ */
+ @Override
+ public float[] evaluate(float fraction, float[] startValue, float[] endValue) {
+ float[] array = mArray;
+ if (array == null) {
+ array = new float[startValue.length];
+ }
+
+ for (int i = 0; i < array.length; i++) {
+ float start = startValue[i];
+ float end = endValue[i];
+ array[i] = start + (fraction * (end - start));
+ }
+ return array;
+ }
+}
diff --git a/core/java/android/animation/IntArrayEvaluator.java b/core/java/android/animation/IntArrayEvaluator.java
new file mode 100644
index 0000000..d7f10f3
--- /dev/null
+++ b/core/java/android/animation/IntArrayEvaluator.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2013 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.animation;
+
+/**
+ * This evaluator can be used to perform type interpolation between <code>int[]</code> values.
+ * Each index into the array is treated as a separate value to interpolate. For example,
+ * evaluating <code>{100, 200}</code> and <code>{300, 400}</code> will interpolate the value at
+ * the first index between 100 and 300 and the value at the second index value between 200 and 400.
+ */
+public class IntArrayEvaluator implements TypeEvaluator<int[]> {
+
+ private int[] mArray;
+
+ /**
+ * Create an IntArrayEvaluator that does not reuse the animated value. Care must be taken
+ * when using this option because on every evaluation a new <code>int[]</code> will be
+ * allocated.
+ *
+ * @see #IntArrayEvaluator(int[])
+ */
+ public IntArrayEvaluator() {
+ }
+
+ /**
+ * Create an IntArrayEvaluator that reuses <code>reuseArray</code> for every evaluate() call.
+ * Caution must be taken to ensure that the value returned from
+ * {@link android.animation.ValueAnimator#getAnimatedValue()} is not cached, modified, or
+ * used across threads. The value will be modified on each <code>evaluate()</code> call.
+ *
+ * @param reuseArray The array to modify and return from <code>evaluate</code>.
+ */
+ public IntArrayEvaluator(int[] reuseArray) {
+ mArray = reuseArray;
+ }
+
+ /**
+ * Interpolates the value at each index by the fraction. If {@link #IntArrayEvaluator(int[])}
+ * was used to construct this object, <code>reuseArray</code> will be returned, otherwise
+ * a new <code>int[]</code> will be returned.
+ *
+ * @param fraction The fraction from the starting to the ending values
+ * @param startValue The start value.
+ * @param endValue The end value.
+ * @return An <code>int[]</code> where each element is an interpolation between
+ * the same index in startValue and endValue.
+ */
+ @Override
+ public int[] evaluate(float fraction, int[] startValue, int[] endValue) {
+ int[] array = mArray;
+ if (array == null) {
+ array = new int[startValue.length];
+ }
+ for (int i = 0; i < array.length; i++) {
+ int start = startValue[i];
+ int end = endValue[i];
+ array[i] = (int) (start + (fraction * (end - start)));
+ }
+ return array;
+ }
+}
diff --git a/core/java/android/animation/ObjectAnimator.java b/core/java/android/animation/ObjectAnimator.java
index 9c88ccf..3adbf08 100644
--- a/core/java/android/animation/ObjectAnimator.java
+++ b/core/java/android/animation/ObjectAnimator.java
@@ -191,7 +191,7 @@ public final class ObjectAnimator extends ValueAnimator {
/**
* Constructs and returns an ObjectAnimator that animates between int values. A single
- * value implies that that value is the one being animated to. Two values imply a starting
+ * value implies that that value is the one being animated to. Two values imply starting
* and ending values. More than two values imply a starting value, values to animate through
* along the way, and an ending value (these values will be distributed evenly across
* the duration of the animation).
@@ -211,7 +211,7 @@ public final class ObjectAnimator extends ValueAnimator {
/**
* Constructs and returns an ObjectAnimator that animates between int values. A single
- * value implies that that value is the one being animated to. Two values imply a starting
+ * value implies that that value is the one being animated to. Two values imply starting
* and ending values. More than two values imply a starting value, values to animate through
* along the way, and an ending value (these values will be distributed evenly across
* the duration of the animation).
@@ -228,8 +228,94 @@ public final class ObjectAnimator extends ValueAnimator {
}
/**
+ * Constructs and returns an ObjectAnimator that animates over int values for a multiple
+ * parameters setter. Only public methods that take only int parameters are supported.
+ * Each <code>int[]</code> contains a complete set of parameters to the setter method.
+ * At least two <code>int[]</code> values must be provided, a start and end. More than two
+ * values imply a starting value, values to animate through along the way, and an ending
+ * value (these values will be distributed evenly across the duration of the animation).
+ *
+ * @param target The object whose property is to be animated. This object may
+ * have a public method on it called <code>setName()</code>, where <code>name</code> is
+ * the value of the <code>propertyName</code> parameter. <code>propertyName</code> may also
+ * be the case-sensitive complete name of the public setter method.
+ * @param propertyName The name of the property being animated or the name of the setter method.
+ * @param values A set of values that the animation will animate between over time.
+ * @return An ObjectAnimator object that is set up to animate between the given values.
+ */
+ public static ObjectAnimator ofMultiInt(Object target, String propertyName, int[][] values) {
+ PropertyValuesHolder pvh = PropertyValuesHolder.ofMultiInt(propertyName, values);
+ return ofPropertyValuesHolder(target, pvh);
+ }
+
+ /**
+ * Constructs and returns an ObjectAnimator that animates over values for a multiple int
+ * parameters setter. Only public methods that take only int parameters are supported.
+ * <p>At least two values must be provided, a start and end. More than two
+ * values imply a starting value, values to animate through along the way, and an ending
+ * value (these values will be distributed evenly across the duration of the animation).</p>
+ *
+ * @param target The object whose property is to be animated. This object may
+ * have a public method on it called <code>setName()</code>, where <code>name</code> is
+ * the value of the <code>propertyName</code> parameter. <code>propertyName</code> may also
+ * be the complete name of the public method.
+ * @param propertyName The name of the property being animated or the name of the setter method.
+ * @param converter Converts T objects into int parameters for the multi-value setter.
+ * @param evaluator A TypeEvaluator that will be called on each animation frame to
+ * provide the necessary interpolation between the Object values to derive the animated
+ * value.
+ * @param values A set of values that the animation will animate between over time.
+ * @return An ObjectAnimator object that is set up to animate between the given values.
+ */
+ public static <T> ObjectAnimator ofMultiInt(Object target, String propertyName,
+ TypeConverter<T, int[]> converter, TypeEvaluator<T> evaluator, T... values) {
+ PropertyValuesHolder pvh = PropertyValuesHolder.ofMultiInt(propertyName, converter,
+ evaluator, values);
+ return ObjectAnimator.ofPropertyValuesHolder(target, pvh);
+ }
+
+ /**
+ * Constructs and returns an ObjectAnimator that animates between color values. A single
+ * value implies that that value is the one being animated to. Two values imply starting
+ * and ending values. More than two values imply a starting value, values to animate through
+ * along the way, and an ending value (these values will be distributed evenly across
+ * the duration of the animation).
+ *
+ * @param target The object whose property is to be animated. This object should
+ * have a public method on it called <code>setName()</code>, where <code>name</code> is
+ * the value of the <code>propertyName</code> parameter.
+ * @param propertyName The name of the property being animated.
+ * @param values A set of values that the animation will animate between over time.
+ * @return An ObjectAnimator object that is set up to animate between the given values.
+ */
+ public static ObjectAnimator ofArgb(Object target, String propertyName, int... values) {
+ ObjectAnimator animator = ofInt(target, propertyName, values);
+ animator.setEvaluator(ArgbEvaluator.getInstance());
+ return animator;
+ }
+
+ /**
+ * Constructs and returns an ObjectAnimator that animates between color values. A single
+ * value implies that that value is the one being animated to. Two values imply starting
+ * and ending values. More than two values imply a starting value, values to animate through
+ * along the way, and an ending value (these values will be distributed evenly across
+ * the duration of the animation).
+ *
+ * @param target The object whose property is to be animated.
+ * @param property The property being animated.
+ * @param values A set of values that the animation will animate between over time.
+ * @return An ObjectAnimator object that is set up to animate between the given values.
+ */
+ public static <T> ObjectAnimator ofArgb(T target, Property<T, Integer> property,
+ int... values) {
+ ObjectAnimator animator = ofInt(target, property, values);
+ animator.setEvaluator(ArgbEvaluator.getInstance());
+ return animator;
+ }
+
+ /**
* Constructs and returns an ObjectAnimator that animates between float values. A single
- * value implies that that value is the one being animated to. Two values imply a starting
+ * value implies that that value is the one being animated to. Two values imply starting
* and ending values. More than two values imply a starting value, values to animate through
* along the way, and an ending value (these values will be distributed evenly across
* the duration of the animation).
@@ -249,7 +335,7 @@ public final class ObjectAnimator extends ValueAnimator {
/**
* Constructs and returns an ObjectAnimator that animates between float values. A single
- * value implies that that value is the one being animated to. Two values imply a starting
+ * value implies that that value is the one being animated to. Two values imply starting
* and ending values. More than two values imply a starting value, values to animate through
* along the way, and an ending value (these values will be distributed evenly across
* the duration of the animation).
@@ -267,8 +353,56 @@ public final class ObjectAnimator extends ValueAnimator {
}
/**
+ * Constructs and returns an ObjectAnimator that animates over float values for a multiple
+ * parameters setter. Only public methods that take only float parameters are supported.
+ * Each <code>float[]</code> contains a complete set of parameters to the setter method.
+ * At least two <code>float[]</code> values must be provided, a start and end. More than two
+ * values imply a starting value, values to animate through along the way, and an ending
+ * value (these values will be distributed evenly across the duration of the animation).
+ *
+ * @param target The object whose property is to be animated. This object may
+ * have a public method on it called <code>setName()</code>, where <code>name</code> is
+ * the value of the <code>propertyName</code> parameter. <code>propertyName</code> may also
+ * be the complete name of the public method.
+ * @param propertyName The name of the property being animated or the name of the setter method.
+ * @param values A set of values that the animation will animate between over time.
+ * @return An ObjectAnimator object that is set up to animate between the given values.
+ */
+ public static ObjectAnimator ofMultiFloat(Object target, String propertyName,
+ float[][] values) {
+ PropertyValuesHolder pvh = PropertyValuesHolder.ofMultiFloat(propertyName, values);
+ return ofPropertyValuesHolder(target, pvh);
+ }
+
+ /**
+ * Constructs and returns an ObjectAnimator that animates over values for a multiple float
+ * parameters setter. Only public methods that take only float parameters are supported.
+ * <p>At least two values must be provided, a start and end. More than two
+ * values imply a starting value, values to animate through along the way, and an ending
+ * value (these values will be distributed evenly across the duration of the animation).</p>
+ *
+ * @param target The object whose property is to be animated. This object may
+ * have a public method on it called <code>setName()</code>, where <code>name</code> is
+ * the value of the <code>propertyName</code> parameter. <code>propertyName</code> may also
+ * be the case-sensitive complete name of the public setter method.
+ * @param propertyName The name of the property being animated or the name of the setter method.
+ * @param converter Converts T objects into float parameters for the multi-value setter.
+ * @param evaluator A TypeEvaluator that will be called on each animation frame to
+ * provide the necessary interpolation between the Object values to derive the animated
+ * value.
+ * @param values A set of values that the animation will animate between over time.
+ * @return An ObjectAnimator object that is set up to animate between the given values.
+ */
+ public static <T> ObjectAnimator ofMultiFloat(Object target, String propertyName,
+ TypeConverter<T, float[]> converter, TypeEvaluator<T> evaluator, T... values) {
+ PropertyValuesHolder pvh = PropertyValuesHolder.ofMultiFloat(propertyName, converter,
+ evaluator, values);
+ return ObjectAnimator.ofPropertyValuesHolder(target, pvh);
+ }
+
+ /**
* Constructs and returns an ObjectAnimator that animates between Object values. A single
- * value implies that that value is the one being animated to. Two values imply a starting
+ * value implies that that value is the one being animated to. Two values imply starting
* and ending values. More than two values imply a starting value, values to animate through
* along the way, and an ending value (these values will be distributed evenly across
* the duration of the animation).
@@ -293,7 +427,7 @@ public final class ObjectAnimator extends ValueAnimator {
/**
* Constructs and returns an ObjectAnimator that animates between Object values. A single
- * value implies that that value is the one being animated to. Two values imply a starting
+ * value implies that that value is the one being animated to. Two values imply starting
* and ending values. More than two values imply a starting value, values to animate through
* along the way, and an ending value (these values will be distributed evenly across
* the duration of the animation).
@@ -315,6 +449,32 @@ public final class ObjectAnimator extends ValueAnimator {
}
/**
+ * Constructs and returns an ObjectAnimator that animates between Object values. A single
+ * value implies that that value is the one being animated to. Two values imply starting
+ * and ending values. More than two values imply a starting value, values to animate through
+ * along the way, and an ending value (these values will be distributed evenly across
+ * the duration of the animation). This variant supplies a <code>TypeConverter</code> to
+ * convert from the animated values to the type of the property. If only one value is
+ * supplied, the <code>TypeConverter</code> must implement
+ * {@link TypeConverter#convertBack(Object)} to retrieve the current value.
+ *
+ * @param target The object whose property is to be animated.
+ * @param property The property being animated.
+ * @param converter Converts the animated object to the Property type.
+ * @param evaluator A TypeEvaluator that will be called on each animation frame to
+ * provide the necessary interpolation between the Object values to derive the animated
+ * value.
+ * @param values A set of values that the animation will animate between over time.
+ * @return An ObjectAnimator object that is set up to animate between the given values.
+ */
+ public static <T, V, P> ObjectAnimator ofObject(T target, Property<T, P> property,
+ TypeConverter<V, P> converter, TypeEvaluator<V> evaluator, V... values) {
+ PropertyValuesHolder pvh = PropertyValuesHolder.ofObject(property, converter, evaluator,
+ values);
+ return ofPropertyValuesHolder(target, pvh);
+ }
+
+ /**
* Constructs and returns an ObjectAnimator that animates between the sets of values specified
* in <code>PropertyValueHolder</code> objects. This variant should be used when animating
* several properties at once with the same ObjectAnimator, since PropertyValuesHolder allows
diff --git a/core/java/android/animation/PropertyValuesHolder.java b/core/java/android/animation/PropertyValuesHolder.java
index 43014ad..c291970 100644
--- a/core/java/android/animation/PropertyValuesHolder.java
+++ b/core/java/android/animation/PropertyValuesHolder.java
@@ -124,6 +124,11 @@ public class PropertyValuesHolder implements Cloneable {
private Object mAnimatedValue;
/**
+ * Converts from the source Object type to the setter Object type.
+ */
+ private TypeConverter mConverter;
+
+ /**
* Internal utility constructor, used by the factory methods to set the property name.
* @param propertyName The name of the property for this holder.
*/
@@ -166,6 +171,84 @@ public class PropertyValuesHolder implements Cloneable {
/**
* Constructs and returns a PropertyValuesHolder with a given property name and
+ * set of <code>int[]</code> values. At least two <code>int[]</code> values must be supplied,
+ * a start and end value. If more values are supplied, the values will be animated from the
+ * start, through all intermediate values to the end value. When used with ObjectAnimator,
+ * the elements of the array represent the parameters of the setter function.
+ *
+ * @param propertyName The name of the property being animated. Can also be the name of the
+ * entire setter method. Should not be null.
+ * @param values The values that the property will animate between.
+ * @return PropertyValuesHolder The constructed PropertyValuesHolder object.
+ * @see IntArrayEvaluator#IntArrayEvaluator(int[])
+ * @see ObjectAnimator#ofMultiInt(Object, String, TypeConverter, TypeEvaluator, Object[])
+ */
+ public static PropertyValuesHolder ofMultiInt(String propertyName, int[][] values) {
+ if (values.length < 2) {
+ throw new IllegalArgumentException("At least 2 values must be supplied");
+ }
+ int numParameters = 0;
+ for (int i = 0; i < values.length; i++) {
+ if (values[i] == null) {
+ throw new IllegalArgumentException("values must not be null");
+ }
+ int length = values[i].length;
+ if (i == 0) {
+ numParameters = length;
+ } else if (length != numParameters) {
+ throw new IllegalArgumentException("Values must all have the same length");
+ }
+ }
+ IntArrayEvaluator evaluator = new IntArrayEvaluator(new int[numParameters]);
+ return new MultiIntValuesHolder(propertyName, null, evaluator, (Object[]) values);
+ }
+
+ /**
+ * Constructs and returns a PropertyValuesHolder with a given property and
+ * set of Object values for use with ObjectAnimator multi-value setters. The Object
+ * values are converted to <code>int[]</code> using the converter.
+ *
+ * @param propertyName The property being animated or complete name of the setter.
+ * Should not be null.
+ * @param converter Used to convert the animated value to setter parameters.
+ * @param evaluator A TypeEvaluator that will be called on each animation frame to
+ * provide the necessary interpolation between the Object values to derive the animated
+ * value.
+ * @param values The values that the property will animate between.
+ * @return PropertyValuesHolder The constructed PropertyValuesHolder object.
+ * @see ObjectAnimator#ofMultiInt(Object, String, TypeConverter, TypeEvaluator, Object[])
+ * @see ObjectAnimator#ofPropertyValuesHolder(Object, PropertyValuesHolder...)
+ */
+ public static <V> PropertyValuesHolder ofMultiInt(String propertyName,
+ TypeConverter<V, int[]> converter, TypeEvaluator<V> evaluator, V... values) {
+ return new MultiIntValuesHolder(propertyName, converter, evaluator, values);
+ }
+
+ /**
+ * Constructs and returns a PropertyValuesHolder object with the specified property name or
+ * setter name for use in a multi-int setter function using ObjectAnimator. The values can be
+ * of any type, but the type should be consistent so that the supplied
+ * {@link android.animation.TypeEvaluator} can be used to to evaluate the animated value. The
+ * <code>converter</code> converts the values to parameters in the setter function.
+ *
+ * <p>At least two values must be supplied, a start and an end value.</p>
+ *
+ * @param propertyName The name of the property to associate with the set of values. This
+ * may also be the complete name of a setter function.
+ * @param converter Converts <code>values</code> into int parameters for the setter.
+ * Can be null if the Keyframes have int[] values.
+ * @param evaluator Used to interpolate between values.
+ * @param values The values at specific fractional times to evaluate between
+ * @return A PropertyValuesHolder for a multi-int parameter setter.
+ */
+ public static <T> PropertyValuesHolder ofMultiInt(String propertyName,
+ TypeConverter<T, int[]> converter, TypeEvaluator<T> evaluator, Keyframe... values) {
+ KeyframeSet keyframeSet = KeyframeSet.ofKeyframe(values);
+ return new MultiIntValuesHolder(propertyName, converter, evaluator, keyframeSet);
+ }
+
+ /**
+ * Constructs and returns a PropertyValuesHolder with a given property name and
* set of float values.
* @param propertyName The name of the property being animated.
* @param values The values that the named property will animate between.
@@ -188,6 +271,83 @@ public class PropertyValuesHolder implements Cloneable {
/**
* Constructs and returns a PropertyValuesHolder with a given property name and
+ * set of <code>float[]</code> values. At least two <code>float[]</code> values must be supplied,
+ * a start and end value. If more values are supplied, the values will be animated from the
+ * start, through all intermediate values to the end value. When used with ObjectAnimator,
+ * the elements of the array represent the parameters of the setter function.
+ *
+ * @param propertyName The name of the property being animated. Can also be the name of the
+ * entire setter method. Should not be null.
+ * @param values The values that the property will animate between.
+ * @return PropertyValuesHolder The constructed PropertyValuesHolder object.
+ * @see FloatArrayEvaluator#FloatArrayEvaluator(float[])
+ * @see ObjectAnimator#ofMultiFloat(Object, String, TypeConverter, TypeEvaluator, Object[])
+ */
+ public static PropertyValuesHolder ofMultiFloat(String propertyName, float[][] values) {
+ if (values.length < 2) {
+ throw new IllegalArgumentException("At least 2 values must be supplied");
+ }
+ int numParameters = 0;
+ for (int i = 0; i < values.length; i++) {
+ if (values[i] == null) {
+ throw new IllegalArgumentException("values must not be null");
+ }
+ int length = values[i].length;
+ if (i == 0) {
+ numParameters = length;
+ } else if (length != numParameters) {
+ throw new IllegalArgumentException("Values must all have the same length");
+ }
+ }
+ FloatArrayEvaluator evaluator = new FloatArrayEvaluator(new float[numParameters]);
+ return new MultiFloatValuesHolder(propertyName, null, evaluator, (Object[]) values);
+ }
+
+ /**
+ * Constructs and returns a PropertyValuesHolder with a given property and
+ * set of Object values for use with ObjectAnimator multi-value setters. The Object
+ * values are converted to <code>float[]</code> using the converter.
+ *
+ * @param propertyName The property being animated or complete name of the setter.
+ * Should not be null.
+ * @param converter Used to convert the animated value to setter parameters.
+ * @param evaluator A TypeEvaluator that will be called on each animation frame to
+ * provide the necessary interpolation between the Object values to derive the animated
+ * value.
+ * @param values The values that the property will animate between.
+ * @return PropertyValuesHolder The constructed PropertyValuesHolder object.
+ * @see ObjectAnimator#ofMultiFloat(Object, String, TypeConverter, TypeEvaluator, Object[])
+ */
+ public static <V> PropertyValuesHolder ofMultiFloat(String propertyName,
+ TypeConverter<V, float[]> converter, TypeEvaluator<V> evaluator, V... values) {
+ return new MultiFloatValuesHolder(propertyName, converter, evaluator, values);
+ }
+
+ /**
+ * Constructs and returns a PropertyValuesHolder object with the specified property name or
+ * setter name for use in a multi-float setter function using ObjectAnimator. The values can be
+ * of any type, but the type should be consistent so that the supplied
+ * {@link android.animation.TypeEvaluator} can be used to to evaluate the animated value. The
+ * <code>converter</code> converts the values to parameters in the setter function.
+ *
+ * <p>At least two values must be supplied, a start and an end value.</p>
+ *
+ * @param propertyName The name of the property to associate with the set of values. This
+ * may also be the complete name of a setter function.
+ * @param converter Converts <code>values</code> into float parameters for the setter.
+ * Can be null if the Keyframes have float[] values.
+ * @param evaluator Used to interpolate between values.
+ * @param values The values at specific fractional times to evaluate between
+ * @return A PropertyValuesHolder for a multi-float parameter setter.
+ */
+ public static <T> PropertyValuesHolder ofMultiFloat(String propertyName,
+ TypeConverter<T, float[]> converter, TypeEvaluator<T> evaluator, Keyframe... values) {
+ KeyframeSet keyframeSet = KeyframeSet.ofKeyframe(values);
+ return new MultiFloatValuesHolder(propertyName, converter, evaluator, keyframeSet);
+ }
+
+ /**
+ * Constructs and returns a PropertyValuesHolder with a given property name and
* set of Object values. This variant also takes a TypeEvaluator because the system
* cannot automatically interpolate between objects of unknown type.
*
@@ -227,6 +387,34 @@ public class PropertyValuesHolder implements Cloneable {
}
/**
+ * Constructs and returns a PropertyValuesHolder with a given property and
+ * set of Object values. This variant also takes a TypeEvaluator because the system
+ * cannot automatically interpolate between objects of unknown type. This variant also
+ * takes a <code>TypeConverter</code> to convert from animated values to the type
+ * of the property. If only one value is supplied, the <code>TypeConverter</code>
+ * must implement {@link TypeConverter#convertBack(Object)} to retrieve the current
+ * value.
+ *
+ * @param property The property being animated. Should not be null.
+ * @param converter Converts the animated object to the Property type.
+ * @param evaluator A TypeEvaluator that will be called on each animation frame to
+ * provide the necessary interpolation between the Object values to derive the animated
+ * value.
+ * @param values The values that the property will animate between.
+ * @return PropertyValuesHolder The constructed PropertyValuesHolder object.
+ * @see #setConverter(TypeConverter)
+ * @see TypeConverter
+ */
+ public static <T, V> PropertyValuesHolder ofObject(Property<?, V> property,
+ TypeConverter<T, V> converter, TypeEvaluator<T> evaluator, T... values) {
+ PropertyValuesHolder pvh = new PropertyValuesHolder(property);
+ pvh.setConverter(converter);
+ pvh.setObjectValues(values);
+ pvh.setEvaluator(evaluator);
+ return pvh;
+ }
+
+ /**
* Constructs and returns a PropertyValuesHolder object with the specified property name and set
* of values. These values can be of any type, but the type should be consistent so that
* an appropriate {@link android.animation.TypeEvaluator} can be found that matches
@@ -361,6 +549,14 @@ public class PropertyValuesHolder implements Cloneable {
}
/**
+ * Sets the converter to convert from the values type to the setter's parameter type.
+ * @param converter The converter to use to convert values.
+ */
+ public void setConverter(TypeConverter converter) {
+ mConverter = converter;
+ }
+
+ /**
* Determine the setter or getter function using the JavaBeans convention of setFoo or
* getFoo for a property named 'foo'. This function figures out what the name of the
* function should be and uses reflection to find the Method with that name on the
@@ -389,22 +585,24 @@ public class PropertyValuesHolder implements Cloneable {
} else {
args = new Class[1];
Class typeVariants[];
- if (mValueType.equals(Float.class)) {
+ if (valueType.equals(Float.class)) {
typeVariants = FLOAT_VARIANTS;
- } else if (mValueType.equals(Integer.class)) {
+ } else if (valueType.equals(Integer.class)) {
typeVariants = INTEGER_VARIANTS;
- } else if (mValueType.equals(Double.class)) {
+ } else if (valueType.equals(Double.class)) {
typeVariants = DOUBLE_VARIANTS;
} else {
typeVariants = new Class[1];
- typeVariants[0] = mValueType;
+ typeVariants[0] = valueType;
}
for (Class typeVariant : typeVariants) {
args[0] = typeVariant;
try {
returnVal = targetClass.getMethod(methodName, args);
- // change the value type to suit
- mValueType = typeVariant;
+ if (mConverter == null) {
+ // change the value type to suit
+ mValueType = typeVariant;
+ }
return returnVal;
} catch (NoSuchMethodException e) {
// Swallow the error and keep trying other variants
@@ -415,7 +613,7 @@ public class PropertyValuesHolder implements Cloneable {
if (returnVal == null) {
Log.w("PropertyValuesHolder", "Method " +
- getMethodName(prefix, mPropertyName) + "() with type " + mValueType +
+ getMethodName(prefix, mPropertyName) + "() with type " + valueType +
" not found on target class " + targetClass);
}
@@ -465,7 +663,8 @@ public class PropertyValuesHolder implements Cloneable {
* @param targetClass The Class on which the requested method should exist.
*/
void setupSetter(Class targetClass) {
- mSetter = setupSetterOrGetter(targetClass, sSetterPropertyMap, "set", mValueType);
+ Class<?> propertyType = mConverter == null ? mValueType : mConverter.getTargetType();
+ mSetter = setupSetterOrGetter(targetClass, sSetterPropertyMap, "set", propertyType);
}
/**
@@ -489,10 +688,13 @@ public class PropertyValuesHolder implements Cloneable {
if (mProperty != null) {
// check to make sure that mProperty is on the class of target
try {
- Object testValue = mProperty.get(target);
+ Object testValue = null;
for (Keyframe kf : mKeyframeSet.mKeyframes) {
if (!kf.hasValue()) {
- kf.setValue(mProperty.get(target));
+ if (testValue == null) {
+ testValue = convertBack(mProperty.get(target));
+ }
+ kf.setValue(testValue);
}
}
return;
@@ -516,7 +718,8 @@ public class PropertyValuesHolder implements Cloneable {
}
}
try {
- kf.setValue(mGetter.invoke(target));
+ Object value = convertBack(mGetter.invoke(target));
+ kf.setValue(value);
} catch (InvocationTargetException e) {
Log.e("PropertyValuesHolder", e.toString());
} catch (IllegalAccessException e) {
@@ -526,6 +729,18 @@ public class PropertyValuesHolder implements Cloneable {
}
}
+ private Object convertBack(Object value) {
+ if (mConverter != null) {
+ value = mConverter.convertBack(value);
+ if (value == null) {
+ throw new IllegalArgumentException("Converter "
+ + mConverter.getClass().getName()
+ + " must implement convertBack and not return null.");
+ }
+ }
+ return value;
+ }
+
/**
* Utility function to set the value stored in a particular Keyframe. The value used is
* whatever the value is for the property name specified in the keyframe on the target object.
@@ -535,7 +750,8 @@ public class PropertyValuesHolder implements Cloneable {
*/
private void setupValue(Object target, Keyframe kf) {
if (mProperty != null) {
- kf.setValue(mProperty.get(target));
+ Object value = convertBack(mProperty.get(target));
+ kf.setValue(value);
}
try {
if (mGetter == null) {
@@ -546,7 +762,8 @@ public class PropertyValuesHolder implements Cloneable {
return;
}
}
- kf.setValue(mGetter.invoke(target));
+ Object value = convertBack(mGetter.invoke(target));
+ kf.setValue(value);
} catch (InvocationTargetException e) {
Log.e("PropertyValuesHolder", e.toString());
} catch (IllegalAccessException e) {
@@ -657,7 +874,8 @@ public class PropertyValuesHolder implements Cloneable {
* @param fraction The elapsed, interpolated fraction of the animation.
*/
void calculateValue(float fraction) {
- mAnimatedValue = mKeyframeSet.getValue(fraction);
+ Object value = mKeyframeSet.getValue(fraction);
+ mAnimatedValue = mConverter == null ? value : mConverter.convert(value);
}
/**
@@ -1015,8 +1233,227 @@ public class PropertyValuesHolder implements Cloneable {
}
+ static class MultiFloatValuesHolder extends PropertyValuesHolder {
+ private int mJniSetter;
+ private static final HashMap<Class, HashMap<String, Integer>> sJNISetterPropertyMap =
+ new HashMap<Class, HashMap<String, Integer>>();
+
+ public MultiFloatValuesHolder(String propertyName, TypeConverter converter,
+ TypeEvaluator evaluator, Object... values) {
+ super(propertyName);
+ setConverter(converter);
+ setObjectValues(values);
+ setEvaluator(evaluator);
+ }
+
+ public MultiFloatValuesHolder(String propertyName, TypeConverter converter,
+ TypeEvaluator evaluator, KeyframeSet keyframeSet) {
+ super(propertyName);
+ setConverter(converter);
+ mKeyframeSet = keyframeSet;
+ setEvaluator(evaluator);
+ }
+
+ /**
+ * Internal function to set the value on the target object, using the setter set up
+ * earlier on this PropertyValuesHolder object. This function is called by ObjectAnimator
+ * to handle turning the value calculated by ValueAnimator into a value set on the object
+ * according to the name of the property.
+ *
+ * @param target The target object on which the value is set
+ */
+ @Override
+ void setAnimatedValue(Object target) {
+ float[] values = (float[]) getAnimatedValue();
+ int numParameters = values.length;
+ if (mJniSetter != 0) {
+ switch (numParameters) {
+ case 1:
+ nCallFloatMethod(target, mJniSetter, values[0]);
+ break;
+ case 2:
+ nCallTwoFloatMethod(target, mJniSetter, values[0], values[1]);
+ break;
+ case 4:
+ nCallFourFloatMethod(target, mJniSetter, values[0], values[1],
+ values[2], values[3]);
+ break;
+ default: {
+ nCallMultipleFloatMethod(target, mJniSetter, values);
+ break;
+ }
+ }
+ }
+ }
+
+ /**
+ * Internal function (called from ObjectAnimator) to set up the setter and getter
+ * prior to running the animation. No getter can be used for multiple parameters.
+ *
+ * @param target The object on which the setter exists.
+ */
+ @Override
+ void setupSetterAndGetter(Object target) {
+ setupSetter(target.getClass());
+ }
+
+ @Override
+ void setupSetter(Class targetClass) {
+ if (mJniSetter != 0) {
+ return;
+ }
+ try {
+ mPropertyMapLock.writeLock().lock();
+ HashMap<String, Integer> propertyMap = sJNISetterPropertyMap.get(targetClass);
+ if (propertyMap != null) {
+ Integer jniSetterInteger = propertyMap.get(mPropertyName);
+ if (jniSetterInteger != null) {
+ mJniSetter = jniSetterInteger;
+ }
+ }
+ if (mJniSetter == 0) {
+ String methodName = getMethodName("set", mPropertyName);
+ calculateValue(0f);
+ float[] values = (float[]) getAnimatedValue();
+ int numParams = values.length;
+ try {
+ mJniSetter = nGetMultipleFloatMethod(targetClass, methodName, numParams);
+ } catch (NoSuchMethodError e) {
+ // try without the 'set' prefix
+ mJniSetter = nGetMultipleFloatMethod(targetClass, mPropertyName, numParams);
+ }
+ if (mJniSetter != 0) {
+ if (propertyMap == null) {
+ propertyMap = new HashMap<String, Integer>();
+ sJNISetterPropertyMap.put(targetClass, propertyMap);
+ }
+ propertyMap.put(mPropertyName, mJniSetter);
+ }
+ }
+ } finally {
+ mPropertyMapLock.writeLock().unlock();
+ }
+ }
+ }
+
+ static class MultiIntValuesHolder extends PropertyValuesHolder {
+ private int mJniSetter;
+ private static final HashMap<Class, HashMap<String, Integer>> sJNISetterPropertyMap =
+ new HashMap<Class, HashMap<String, Integer>>();
+
+ public MultiIntValuesHolder(String propertyName, TypeConverter converter,
+ TypeEvaluator evaluator, Object... values) {
+ super(propertyName);
+ setConverter(converter);
+ setObjectValues(values);
+ setEvaluator(evaluator);
+ }
+
+ public MultiIntValuesHolder(String propertyName, TypeConverter converter,
+ TypeEvaluator evaluator, KeyframeSet keyframeSet) {
+ super(propertyName);
+ setConverter(converter);
+ mKeyframeSet = keyframeSet;
+ setEvaluator(evaluator);
+ }
+
+ /**
+ * Internal function to set the value on the target object, using the setter set up
+ * earlier on this PropertyValuesHolder object. This function is called by ObjectAnimator
+ * to handle turning the value calculated by ValueAnimator into a value set on the object
+ * according to the name of the property.
+ *
+ * @param target The target object on which the value is set
+ */
+ @Override
+ void setAnimatedValue(Object target) {
+ int[] values = (int[]) getAnimatedValue();
+ int numParameters = values.length;
+ if (mJniSetter != 0) {
+ switch (numParameters) {
+ case 1:
+ nCallIntMethod(target, mJniSetter, values[0]);
+ break;
+ case 2:
+ nCallTwoIntMethod(target, mJniSetter, values[0], values[1]);
+ break;
+ case 4:
+ nCallFourIntMethod(target, mJniSetter, values[0], values[1],
+ values[2], values[3]);
+ break;
+ default: {
+ nCallMultipleIntMethod(target, mJniSetter, values);
+ break;
+ }
+ }
+ }
+ }
+
+ /**
+ * Internal function (called from ObjectAnimator) to set up the setter and getter
+ * prior to running the animation. No getter can be used for multiple parameters.
+ *
+ * @param target The object on which the setter exists.
+ */
+ @Override
+ void setupSetterAndGetter(Object target) {
+ setupSetter(target.getClass());
+ }
+
+ @Override
+ void setupSetter(Class targetClass) {
+ if (mJniSetter != 0) {
+ return;
+ }
+ try {
+ mPropertyMapLock.writeLock().lock();
+ HashMap<String, Integer> propertyMap = sJNISetterPropertyMap.get(targetClass);
+ if (propertyMap != null) {
+ Integer jniSetterInteger = propertyMap.get(mPropertyName);
+ if (jniSetterInteger != null) {
+ mJniSetter = jniSetterInteger;
+ }
+ }
+ if (mJniSetter == 0) {
+ String methodName = getMethodName("set", mPropertyName);
+ calculateValue(0f);
+ int[] values = (int[]) getAnimatedValue();
+ int numParams = values.length;
+ try {
+ mJniSetter = nGetMultipleIntMethod(targetClass, methodName, numParams);
+ } catch (NoSuchMethodError e) {
+ // try without the 'set' prefix
+ mJniSetter = nGetMultipleIntMethod(targetClass, mPropertyName, numParams);
+ }
+ if (mJniSetter != 0) {
+ if (propertyMap == null) {
+ propertyMap = new HashMap<String, Integer>();
+ sJNISetterPropertyMap.put(targetClass, propertyMap);
+ }
+ propertyMap.put(mPropertyName, mJniSetter);
+ }
+ }
+ } finally {
+ mPropertyMapLock.writeLock().unlock();
+ }
+ }
+ }
+
native static private int nGetIntMethod(Class targetClass, String methodName);
native static private int nGetFloatMethod(Class targetClass, String methodName);
+ native static private int nGetMultipleIntMethod(Class targetClass, String methodName,
+ int numParams);
+ native static private int nGetMultipleFloatMethod(Class targetClass, String methodName,
+ int numParams);
native static private void nCallIntMethod(Object target, int methodID, int arg);
native static private void nCallFloatMethod(Object target, int methodID, float arg);
+ native static private void nCallTwoIntMethod(Object target, int methodID, int arg1, int arg2);
+ native static private void nCallFourIntMethod(Object target, int methodID, int arg1, int arg2,
+ int arg3, int arg4);
+ native static private void nCallMultipleIntMethod(Object target, int methodID, int[] args);
+ native static private void nCallTwoFloatMethod(Object target, int methodID, float arg1,
+ float arg2);
+ native static private void nCallFourFloatMethod(Object target, int methodID, float arg1,
+ float arg2, float arg3, float arg4);
+ native static private void nCallMultipleFloatMethod(Object target, int methodID, float[] args);
} \ No newline at end of file
diff --git a/core/java/android/animation/RectEvaluator.java b/core/java/android/animation/RectEvaluator.java
index 28d496b..23eb766 100644
--- a/core/java/android/animation/RectEvaluator.java
+++ b/core/java/android/animation/RectEvaluator.java
@@ -23,12 +23,45 @@ import android.graphics.Rect;
public class RectEvaluator implements TypeEvaluator<Rect> {
/**
+ * When null, a new Rect is returned on every evaluate call. When non-null,
+ * mRect will be modified and returned on every evaluate.
+ */
+ private Rect mRect;
+
+ /**
+ * Construct a RectEvaluator that returns a new Rect on every evaluate call.
+ * To avoid creating an object for each evaluate call,
+ * {@link RectEvaluator#RectEvaluator(android.graphics.Rect)} should be used
+ * whenever possible.
+ */
+ public RectEvaluator() {
+ }
+
+ /**
+ * Constructs a RectEvaluator that modifies and returns <code>reuseRect</code>
+ * in {@link #evaluate(float, android.graphics.Rect, android.graphics.Rect)} calls.
+ * The value returned from
+ * {@link #evaluate(float, android.graphics.Rect, android.graphics.Rect)} should
+ * not be cached because it will change over time as the object is reused on each
+ * call.
+ *
+ * @param reuseRect A Rect to be modified and returned by evaluate.
+ */
+ public RectEvaluator(Rect reuseRect) {
+ mRect = reuseRect;
+ }
+
+ /**
* This function returns the result of linearly interpolating the start and
* end Rect values, with <code>fraction</code> representing the proportion
* between the start and end values. The calculation is a simple parametric
* calculation on each of the separate components in the Rect objects
* (left, top, right, and bottom).
*
+ * <p>If {@link #RectEvaluator(android.graphics.Rect)} was used to construct
+ * this RectEvaluator, the object returned will be the <code>reuseRect</code>
+ * passed into the constructor.</p>
+ *
* @param fraction The fraction from the starting to the ending values
* @param startValue The start Rect
* @param endValue The end Rect
@@ -37,9 +70,15 @@ public class RectEvaluator implements TypeEvaluator<Rect> {
*/
@Override
public Rect evaluate(float fraction, Rect startValue, Rect endValue) {
- return new Rect(startValue.left + (int)((endValue.left - startValue.left) * fraction),
- startValue.top + (int)((endValue.top - startValue.top) * fraction),
- startValue.right + (int)((endValue.right - startValue.right) * fraction),
- startValue.bottom + (int)((endValue.bottom - startValue.bottom) * fraction));
+ int left = startValue.left + (int) ((endValue.left - startValue.left) * fraction);
+ int top = startValue.top + (int) ((endValue.top - startValue.top) * fraction);
+ int right = startValue.right + (int) ((endValue.right - startValue.right) * fraction);
+ int bottom = startValue.bottom + (int) ((endValue.bottom - startValue.bottom) * fraction);
+ if (mRect == null) {
+ return new Rect(left, top, right, bottom);
+ } else {
+ mRect.set(left, top, right, bottom);
+ return mRect;
+ }
}
}
diff --git a/core/java/android/animation/TypeConverter.java b/core/java/android/animation/TypeConverter.java
new file mode 100644
index 0000000..03b3eb5
--- /dev/null
+++ b/core/java/android/animation/TypeConverter.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2013 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.animation;
+
+/**
+ * Abstract base class used convert type T to another type V. This
+ * is necessary when the value types of in animation are different
+ * from the property type.
+ * @see PropertyValuesHolder#setConverter(TypeConverter)
+ */
+public abstract class TypeConverter<T, V> {
+ private Class<T> mFromClass;
+ private Class<V> mToClass;
+
+ public TypeConverter(Class<T> fromClass, Class<V> toClass) {
+ mFromClass = fromClass;
+ mToClass = toClass;
+ }
+
+ /**
+ * Returns the target converted type. Used by the animation system to determine
+ * the proper setter function to call.
+ * @return The Class to convert the input to.
+ */
+ Class<V> getTargetType() {
+ return mToClass;
+ }
+
+ /**
+ * Returns the source conversion type.
+ */
+ Class<T> getSourceType() {
+ return mFromClass;
+ }
+
+ /**
+ * Converts a value from one type to another.
+ * @param value The Object to convert.
+ * @return A value of type V, converted from <code>value</code>.
+ */
+ public abstract V convert(T value);
+
+ /**
+ * Does a conversion from the target type back to the source type. The subclass
+ * must implement this when a TypeConverter is used in animations and current
+ * values will need to be read for an animation. By default, this will return null,
+ * indicating that back-conversion is not supported.
+ * @param value The Object to convert.
+ * @return A value of type T, converted from <code>value</code>.
+ */
+ public T convertBack(V value) {
+ return null;
+ }
+}
diff --git a/core/java/android/animation/ValueAnimator.java b/core/java/android/animation/ValueAnimator.java
index 86da673..7880f39 100644
--- a/core/java/android/animation/ValueAnimator.java
+++ b/core/java/android/animation/ValueAnimator.java
@@ -280,6 +280,24 @@ public class ValueAnimator extends Animator {
}
/**
+ * Constructs and returns a ValueAnimator that animates between color values. A single
+ * value implies that that value is the one being animated to. However, this is not typically
+ * useful in a ValueAnimator object because there is no way for the object to determine the
+ * starting value for the animation (unlike ObjectAnimator, which can derive that value
+ * from the target object and property being animated). Therefore, there should typically
+ * be two or more values.
+ *
+ * @param values A set of values that the animation will animate between over time.
+ * @return A ValueAnimator object that is set up to animate between the given values.
+ */
+ public static ValueAnimator ofArgb(int... values) {
+ ValueAnimator anim = new ValueAnimator();
+ anim.setIntValues(values);
+ anim.setEvaluator(ArgbEvaluator.getInstance());
+ return anim;
+ }
+
+ /**
* Constructs and returns a ValueAnimator that animates between float values. A single
* value implies that that value is the one being animated to. However, this is not typically
* useful in a ValueAnimator object because there is no way for the object to determine the
diff --git a/core/java/android/annotation/IntDef.java b/core/java/android/annotation/IntDef.java
new file mode 100644
index 0000000..0c4e5a5
--- /dev/null
+++ b/core/java/android/annotation/IntDef.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2013 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.annotation;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.RetentionPolicy.CLASS;
+import static java.lang.annotation.RetentionPolicy.SOURCE;
+
+/**
+ * Denotes that the annotated element of integer type, represents
+ * a logical type and that its value should be one of the explicitly
+ * named constants. If the {@link #flag()} attribute is set to true,
+ * multiple constants can be combined.
+ * <p>
+ * Example:
+ * <pre>{@code
+ * &#64;Retention(CLASS)
+ * &#64;IntDef(&#123;NAVIGATION_MODE_STANDARD, NAVIGATION_MODE_LIST, NAVIGATION_MODE_TABS&#125;)
+ * public &#64;interface NavigationMode &#123;&#125;
+ * public static final int NAVIGATION_MODE_STANDARD = 0;
+ * public static final int NAVIGATION_MODE_LIST = 1;
+ * public static final int NAVIGATION_MODE_TABS = 2;
+ * ...
+ * public abstract void setNavigationMode(&#64;NavigationMode int mode);
+ * &#64;NavigationMode
+ * public abstract int getNavigationMode();
+ * }</pre>
+ * For a flag, set the flag attribute:
+ * <pre>{@code
+ * &#64;IntDef(
+ * flag = true
+ * value = &#123;NAVIGATION_MODE_STANDARD, NAVIGATION_MODE_LIST, NAVIGATION_MODE_TABS&#125;)
+ * }</pre>
+ *
+ * @hide
+ */
+@Retention(CLASS)
+@Target({ANNOTATION_TYPE})
+public @interface IntDef {
+ /** Defines the allowed constants for this element */
+ long[] value() default {};
+
+ /** Defines whether the constants can be used as a flag, or just as an enum (the default) */
+ boolean flag() default false;
+}
diff --git a/core/java/android/annotation/NonNull.java b/core/java/android/annotation/NonNull.java
new file mode 100644
index 0000000..8e604f0
--- /dev/null
+++ b/core/java/android/annotation/NonNull.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2013 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.annotation;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.RetentionPolicy.SOURCE;
+
+/**
+ * Denotes that a parameter, field or method return value can never be null.
+ * <p>
+ * This is a marker annotation and it has no specific attributes.
+ */
+@Retention(SOURCE)
+@Target({METHOD, PARAMETER, FIELD})
+public @interface NonNull {
+}
diff --git a/core/java/android/annotation/Nullable.java b/core/java/android/annotation/Nullable.java
new file mode 100644
index 0000000..cdba2f6
--- /dev/null
+++ b/core/java/android/annotation/Nullable.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2013 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.annotation;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.RetentionPolicy.SOURCE;
+
+/**
+ * Denotes that a parameter, field or method return value can be null.
+ * <p>
+ * When decorating a method call parameter, this denotes that the parameter can
+ * legitimately be null and the method will gracefully deal with it. Typically
+ * used on optional parameters.
+ * <p>
+ * When decorating a method, this denotes the method might legitimately return
+ * null.
+ * <p>
+ * This is a marker annotation and it has no specific attributes.
+ */
+@Retention(SOURCE)
+@Target({METHOD, PARAMETER, FIELD})
+public @interface Nullable {
+}
diff --git a/core/java/android/annotation/StringDef.java b/core/java/android/annotation/StringDef.java
new file mode 100644
index 0000000..6b9dff4
--- /dev/null
+++ b/core/java/android/annotation/StringDef.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2013 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.annotation;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.RetentionPolicy.CLASS;
+import static java.lang.annotation.RetentionPolicy.SOURCE;
+
+/**
+ * Denotes that the annotated String element, represents a logical
+ * type and that its value should be one of the explicitly named constants.
+ * <p>
+ * Example:
+ * <pre>{@code
+ * &#64;Retention(SOURCE)
+ * &#64;StringDef(&#123;
+ * POWER_SERVICE,
+ * WINDOW_SERVICE,
+ * LAYOUT_INFLATER_SERVICE
+ * &#125;)
+ * public &#64;interface ServiceName &#123;&#125;
+ * public static final String POWER_SERVICE = "power";
+ * public static final String WINDOW_SERVICE = "window";
+ * public static final String LAYOUT_INFLATER_SERVICE = "layout_inflater";
+ * ...
+ * public abstract Object getSystemService(&#64;ServiceName String name);
+ * }</pre>
+ *
+ * @hide
+ */
+@Retention(CLASS)
+@Target({ANNOTATION_TYPE})
+public @interface StringDef {
+ /** Defines the allowed constants for this element */
+ String[] value() default {};
+}
diff --git a/core/java/android/app/ActionBar.java b/core/java/android/app/ActionBar.java
index c4ddf1f..fbe8987 100644
--- a/core/java/android/app/ActionBar.java
+++ b/core/java/android/app/ActionBar.java
@@ -16,6 +16,9 @@
package android.app;
+import android.annotation.IntDef;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.drawable.Drawable;
@@ -28,6 +31,9 @@ import android.view.ViewGroup.MarginLayoutParams;
import android.view.Window;
import android.widget.SpinnerAdapter;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
/**
* A window feature at the top of the activity that may display the activity title, navigation
* modes, and other interactive items.
@@ -57,6 +63,11 @@ import android.widget.SpinnerAdapter;
* </div>
*/
public abstract class ActionBar {
+ /** @hide */
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef({NAVIGATION_MODE_STANDARD, NAVIGATION_MODE_LIST, NAVIGATION_MODE_TABS})
+ public @interface NavigationMode {}
+
/**
* Standard navigation mode. Consists of either a logo or icon
* and title text with an optional subtitle. Clicking any of these elements
@@ -78,6 +89,19 @@ public abstract class ActionBar {
*/
public static final int NAVIGATION_MODE_TABS = 2;
+ /** @hide */
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef(flag = true,
+ value = {
+ DISPLAY_USE_LOGO,
+ DISPLAY_SHOW_HOME,
+ DISPLAY_HOME_AS_UP,
+ DISPLAY_SHOW_TITLE,
+ DISPLAY_SHOW_CUSTOM,
+ DISPLAY_TITLE_MULTIPLE_LINES
+ })
+ public @interface DisplayOptions {}
+
/**
* Use logo instead of icon if available. This flag will cause appropriate
* navigation modes to use a wider logo in place of the standard icon.
@@ -341,7 +365,7 @@ public abstract class ActionBar {
* @param options A combination of the bits defined by the DISPLAY_ constants
* defined in ActionBar.
*/
- public abstract void setDisplayOptions(int options);
+ public abstract void setDisplayOptions(@DisplayOptions int options);
/**
* Set selected display options. Only the options specified by mask will be changed.
@@ -356,7 +380,7 @@ public abstract class ActionBar {
* defined in ActionBar.
* @param mask A bit mask declaring which display options should be changed.
*/
- public abstract void setDisplayOptions(int options, int mask);
+ public abstract void setDisplayOptions(@DisplayOptions int options, @DisplayOptions int mask);
/**
* Set whether to display the activity logo rather than the activity icon.
@@ -431,7 +455,7 @@ public abstract class ActionBar {
* @see #setStackedBackgroundDrawable(Drawable)
* @see #setSplitBackgroundDrawable(Drawable)
*/
- public abstract void setBackgroundDrawable(Drawable d);
+ public abstract void setBackgroundDrawable(@Nullable Drawable d);
/**
* Set the ActionBar's stacked background. This will appear
@@ -484,6 +508,7 @@ public abstract class ActionBar {
*
* @return The current navigation mode.
*/
+ @NavigationMode
public abstract int getNavigationMode();
/**
@@ -494,7 +519,7 @@ public abstract class ActionBar {
* @see #NAVIGATION_MODE_LIST
* @see #NAVIGATION_MODE_TABS
*/
- public abstract void setNavigationMode(int mode);
+ public abstract void setNavigationMode(@NavigationMode int mode);
/**
* @return The current set of display options.
@@ -1024,7 +1049,7 @@ public abstract class ActionBar {
})
public int gravity = Gravity.NO_GRAVITY;
- public LayoutParams(Context c, AttributeSet attrs) {
+ public LayoutParams(@NonNull Context c, AttributeSet attrs) {
super(c, attrs);
TypedArray a = c.obtainStyledAttributes(attrs,
diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java
index d6db8c2..8628ff7 100644
--- a/core/java/android/app/Activity.java
+++ b/core/java/android/app/Activity.java
@@ -16,11 +16,14 @@
package android.app;
+import android.annotation.NonNull;
import android.util.ArrayMap;
import android.util.SuperNotCalledException;
import com.android.internal.app.ActionBarImpl;
import com.android.internal.policy.PolicyManager;
+import android.annotation.IntDef;
+import android.annotation.Nullable;
import android.content.ComponentCallbacks2;
import android.content.ComponentName;
import android.content.ContentResolver;
@@ -84,6 +87,8 @@ import android.widget.AdapterView;
import java.io.FileDescriptor;
import java.io.PrintWriter;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
import java.util.HashMap;
@@ -852,6 +857,7 @@ public class Activity extends ContextThemeWrapper
* @see #getWindow
* @see android.view.Window#getCurrentFocus
*/
+ @Nullable
public View getCurrentFocus() {
return mWindow != null ? mWindow.getCurrentFocus() : null;
}
@@ -882,7 +888,7 @@ public class Activity extends ContextThemeWrapper
* @see #onRestoreInstanceState
* @see #onPostCreate
*/
- protected void onCreate(Bundle savedInstanceState) {
+ protected void onCreate(@Nullable Bundle savedInstanceState) {
if (DEBUG_LIFECYCLE) Slog.v(TAG, "onCreate " + this + ": " + savedInstanceState);
if (mLastNonConfigurationInstances != null) {
mAllLoaderManagers = mLastNonConfigurationInstances.loaders;
@@ -1010,7 +1016,7 @@ public class Activity extends ContextThemeWrapper
* recently supplied in {@link #onSaveInstanceState}. <b><i>Note: Otherwise it is null.</i></b>
* @see #onCreate
*/
- protected void onPostCreate(Bundle savedInstanceState) {
+ protected void onPostCreate(@Nullable Bundle savedInstanceState) {
if (!isChild()) {
mTitleReady = true;
onTitleChanged(getTitle(), getTitleColor());
@@ -1347,6 +1353,7 @@ public class Activity extends ContextThemeWrapper
* @see #onSaveInstanceState
* @see #onPause
*/
+ @Nullable
public CharSequence onCreateDescription() {
return null;
}
@@ -1551,6 +1558,7 @@ public class Activity extends ContextThemeWrapper
* {@link Fragment#setRetainInstance(boolean)} instead; this is also
* available on older platforms through the Android compatibility package.
*/
+ @Nullable
@Deprecated
public Object getLastNonConfigurationInstance() {
return mLastNonConfigurationInstances != null
@@ -1630,6 +1638,7 @@ public class Activity extends ContextThemeWrapper
* @return Returns the object previously returned by
* {@link #onRetainNonConfigurationChildInstances()}
*/
+ @Nullable
HashMap<String, Object> getLastNonConfigurationChildInstances() {
return mLastNonConfigurationInstances != null
? mLastNonConfigurationInstances.children : null;
@@ -1642,6 +1651,7 @@ public class Activity extends ContextThemeWrapper
* set of child activities, such as ActivityGroup. The same guarantees and restrictions apply
* as for {@link #onRetainNonConfigurationInstance()}. The default implementation returns null.
*/
+ @Nullable
HashMap<String,Object> onRetainNonConfigurationChildInstances() {
return null;
}
@@ -1889,6 +1899,7 @@ public class Activity extends ContextThemeWrapper
*
* @return The Activity's ActionBar, or null if it does not have one.
*/
+ @Nullable
public ActionBar getActionBar() {
initActionBar();
return mActionBar;
@@ -1985,7 +1996,17 @@ public class Activity extends ContextThemeWrapper
public void setFinishOnTouchOutside(boolean finish) {
mWindow.setCloseOnTouchOutside(finish);
}
-
+
+ /** @hide */
+ @IntDef({
+ DEFAULT_KEYS_DISABLE,
+ DEFAULT_KEYS_DIALER,
+ DEFAULT_KEYS_SHORTCUT,
+ DEFAULT_KEYS_SEARCH_LOCAL,
+ DEFAULT_KEYS_SEARCH_GLOBAL})
+ @Retention(RetentionPolicy.SOURCE)
+ @interface DefaultKeyMode {}
+
/**
* Use with {@link #setDefaultKeyMode} to turn off default handling of
* keys.
@@ -2055,7 +2076,7 @@ public class Activity extends ContextThemeWrapper
* @see #DEFAULT_KEYS_SEARCH_GLOBAL
* @see #onKeyDown
*/
- public final void setDefaultKeyMode(int mode) {
+ public final void setDefaultKeyMode(@DefaultKeyMode int mode) {
mDefaultKeyMode = mode;
// Some modes use a SpannableStringBuilder to track & dispatch input events
@@ -2521,6 +2542,7 @@ public class Activity extends ContextThemeWrapper
* simply returns null so that all panel sub-windows will have the default
* menu behavior.
*/
+ @Nullable
public View onCreatePanelView(int featureId) {
return null;
}
@@ -3018,6 +3040,7 @@ public class Activity extends ContextThemeWrapper
* {@link FragmentManager} instead; this is also
* available on older platforms through the Android compatibility package.
*/
+ @Nullable
@Deprecated
protected Dialog onCreateDialog(int id, Bundle args) {
return onCreateDialog(id);
@@ -3105,6 +3128,7 @@ public class Activity extends ContextThemeWrapper
* {@link FragmentManager} instead; this is also
* available on older platforms through the Android compatibility package.
*/
+ @Nullable
@Deprecated
public final boolean showDialog(int id, Bundle args) {
if (mManagedDialogs == null) {
@@ -3226,13 +3250,13 @@ public class Activity extends ContextThemeWrapper
* <p>It is typically called from onSearchRequested(), either directly from
* Activity.onSearchRequested() or from an overridden version in any given
* Activity. If your goal is simply to activate search, it is preferred to call
- * onSearchRequested(), which may have been overriden elsewhere in your Activity. If your goal
+ * onSearchRequested(), which may have been overridden elsewhere in your Activity. If your goal
* is to inject specific data such as context data, it is preferred to <i>override</i>
* onSearchRequested(), so that any callers to it will benefit from the override.
*
* @param initialQuery Any non-null non-empty string will be inserted as
* pre-entered text in the search query box.
- * @param selectInitialQuery If true, the intial query will be preselected, which means that
+ * @param selectInitialQuery If true, the initial query will be preselected, which means that
* any further typing will replace it. This is useful for cases where an entire pre-formed
* query is being inserted. If false, the selection point will be placed at the end of the
* inserted query. This is useful when the inserted query is text that the user entered,
@@ -3250,8 +3274,8 @@ public class Activity extends ContextThemeWrapper
* @see android.app.SearchManager
* @see #onSearchRequested
*/
- public void startSearch(String initialQuery, boolean selectInitialQuery,
- Bundle appSearchData, boolean globalSearch) {
+ public void startSearch(@Nullable String initialQuery, boolean selectInitialQuery,
+ @Nullable Bundle appSearchData, boolean globalSearch) {
ensureSearchManager();
mSearchManager.startSearch(initialQuery, selectInitialQuery, getComponentName(),
appSearchData, globalSearch);
@@ -3267,7 +3291,7 @@ public class Activity extends ContextThemeWrapper
* searches. This data will be returned with SEARCH intent(s). Null if
* no extra data is required.
*/
- public void triggerSearch(String query, Bundle appSearchData) {
+ public void triggerSearch(String query, @Nullable Bundle appSearchData) {
ensureSearchManager();
mSearchManager.triggerSearch(query, getComponentName(), appSearchData);
}
@@ -3334,6 +3358,7 @@ public class Activity extends ContextThemeWrapper
* Convenience for calling
* {@link android.view.Window#getLayoutInflater}.
*/
+ @NonNull
public LayoutInflater getLayoutInflater() {
return getWindow().getLayoutInflater();
}
@@ -3341,6 +3366,7 @@ public class Activity extends ContextThemeWrapper
/**
* Returns a {@link MenuInflater} with this context.
*/
+ @NonNull
public MenuInflater getMenuInflater() {
// Make sure that action views can get an appropriate theme.
if (mMenuInflater == null) {
@@ -3419,7 +3445,7 @@ public class Activity extends ContextThemeWrapper
*
* @see #startActivity
*/
- public void startActivityForResult(Intent intent, int requestCode, Bundle options) {
+ public void startActivityForResult(Intent intent, int requestCode, @Nullable Bundle options) {
if (mParent == null) {
Instrumentation.ActivityResult ar =
mInstrumentation.execStartActivity(
@@ -3498,7 +3524,7 @@ public class Activity extends ContextThemeWrapper
* @param extraFlags Always set to 0.
*/
public void startIntentSenderForResult(IntentSender intent, int requestCode,
- Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags)
+ @Nullable Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags)
throws IntentSender.SendIntentException {
startIntentSenderForResult(intent, requestCode, fillInIntent, flagsMask,
flagsValues, extraFlags, null);
@@ -3530,7 +3556,7 @@ public class Activity extends ContextThemeWrapper
* override any that conflict with those given by the IntentSender.
*/
public void startIntentSenderForResult(IntentSender intent, int requestCode,
- Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags,
+ @Nullable Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags,
Bundle options) throws IntentSender.SendIntentException {
if (mParent == null) {
startIntentSenderForResultInner(intent, requestCode, fillInIntent,
@@ -3618,7 +3644,7 @@ public class Activity extends ContextThemeWrapper
* @see #startActivityForResult
*/
@Override
- public void startActivity(Intent intent, Bundle options) {
+ public void startActivity(Intent intent, @Nullable Bundle options) {
if (options != null) {
startActivityForResult(intent, -1, options);
} else {
@@ -3667,7 +3693,7 @@ public class Activity extends ContextThemeWrapper
* @see #startActivityForResult
*/
@Override
- public void startActivities(Intent[] intents, Bundle options) {
+ public void startActivities(Intent[] intents, @Nullable Bundle options) {
mInstrumentation.execStartActivities(this, mMainThread.getApplicationThread(),
mToken, this, intents, options);
}
@@ -3686,7 +3712,7 @@ public class Activity extends ContextThemeWrapper
* @param extraFlags Always set to 0.
*/
public void startIntentSender(IntentSender intent,
- Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags)
+ @Nullable Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags)
throws IntentSender.SendIntentException {
startIntentSender(intent, fillInIntent, flagsMask, flagsValues,
extraFlags, null);
@@ -3713,7 +3739,7 @@ public class Activity extends ContextThemeWrapper
* override any that conflict with those given by the IntentSender.
*/
public void startIntentSender(IntentSender intent,
- Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags,
+ @Nullable Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags,
Bundle options) throws IntentSender.SendIntentException {
if (options != null) {
startIntentSenderForResult(intent, -1, fillInIntent, flagsMask,
@@ -3741,7 +3767,7 @@ public class Activity extends ContextThemeWrapper
* @see #startActivity
* @see #startActivityForResult
*/
- public boolean startActivityIfNeeded(Intent intent, int requestCode) {
+ public boolean startActivityIfNeeded(@NonNull Intent intent, int requestCode) {
return startActivityIfNeeded(intent, requestCode, null);
}
@@ -3775,7 +3801,8 @@ public class Activity extends ContextThemeWrapper
* @see #startActivity
* @see #startActivityForResult
*/
- public boolean startActivityIfNeeded(Intent intent, int requestCode, Bundle options) {
+ public boolean startActivityIfNeeded(@NonNull Intent intent, int requestCode,
+ @Nullable Bundle options) {
if (mParent == null) {
int result = ActivityManager.START_RETURN_INTENT_TO_CALLER;
try {
@@ -3824,7 +3851,7 @@ public class Activity extends ContextThemeWrapper
* wasn't. In general, if true is returned you will then want to call
* finish() on yourself.
*/
- public boolean startNextMatchingActivity(Intent intent) {
+ public boolean startNextMatchingActivity(@NonNull Intent intent) {
return startNextMatchingActivity(intent, null);
}
@@ -3847,7 +3874,7 @@ public class Activity extends ContextThemeWrapper
* wasn't. In general, if true is returned you will then want to call
* finish() on yourself.
*/
- public boolean startNextMatchingActivity(Intent intent, Bundle options) {
+ public boolean startNextMatchingActivity(@NonNull Intent intent, @Nullable Bundle options) {
if (mParent == null) {
try {
intent.migrateExtraStreamToClipData();
@@ -3877,7 +3904,7 @@ public class Activity extends ContextThemeWrapper
* @see #startActivity
* @see #startActivityForResult
*/
- public void startActivityFromChild(Activity child, Intent intent,
+ public void startActivityFromChild(@NonNull Activity child, Intent intent,
int requestCode) {
startActivityFromChild(child, intent, requestCode, null);
}
@@ -3901,8 +3928,8 @@ public class Activity extends ContextThemeWrapper
* @see #startActivity
* @see #startActivityForResult
*/
- public void startActivityFromChild(Activity child, Intent intent,
- int requestCode, Bundle options) {
+ public void startActivityFromChild(@NonNull Activity child, Intent intent,
+ int requestCode, @Nullable Bundle options) {
Instrumentation.ActivityResult ar =
mInstrumentation.execStartActivity(
this, mMainThread.getApplicationThread(), mToken, child,
@@ -3927,7 +3954,7 @@ public class Activity extends ContextThemeWrapper
* @see Fragment#startActivity
* @see Fragment#startActivityForResult
*/
- public void startActivityFromFragment(Fragment fragment, Intent intent,
+ public void startActivityFromFragment(@NonNull Fragment fragment, Intent intent,
int requestCode) {
startActivityFromFragment(fragment, intent, requestCode, null);
}
@@ -3952,8 +3979,8 @@ public class Activity extends ContextThemeWrapper
* @see Fragment#startActivity
* @see Fragment#startActivityForResult
*/
- public void startActivityFromFragment(Fragment fragment, Intent intent,
- int requestCode, Bundle options) {
+ public void startActivityFromFragment(@NonNull Fragment fragment, Intent intent,
+ int requestCode, @Nullable Bundle options) {
Instrumentation.ActivityResult ar =
mInstrumentation.execStartActivity(
this, mMainThread.getApplicationThread(), mToken, fragment,
@@ -3985,7 +4012,7 @@ public class Activity extends ContextThemeWrapper
*/
public void startIntentSenderFromChild(Activity child, IntentSender intent,
int requestCode, Intent fillInIntent, int flagsMask, int flagsValues,
- int extraFlags, Bundle options)
+ int extraFlags, @Nullable Bundle options)
throws IntentSender.SendIntentException {
startIntentSenderForResultInner(intent, requestCode, fillInIntent,
flagsMask, flagsValues, child, options);
@@ -4084,6 +4111,7 @@ public class Activity extends ContextThemeWrapper
* @return The package of the activity that will receive your
* reply, or null if none.
*/
+ @Nullable
public String getCallingPackage() {
try {
return ActivityManagerNative.getDefault().getCallingPackage(mToken);
@@ -4106,6 +4134,7 @@ public class Activity extends ContextThemeWrapper
* @return The ComponentName of the activity that will receive your
* reply, or null if none.
*/
+ @Nullable
public ComponentName getCallingActivity() {
try {
return ActivityManagerNative.getDefault().getCallingActivity(mToken);
@@ -4298,7 +4327,7 @@ public class Activity extends ContextThemeWrapper
* @param requestCode Request code that had been used to start the
* activity.
*/
- public void finishActivityFromChild(Activity child, int requestCode) {
+ public void finishActivityFromChild(@NonNull Activity child, int requestCode) {
try {
ActivityManagerNative.getDefault()
.finishSubActivity(mToken, child.mEmbeddedID, requestCode);
@@ -4359,8 +4388,8 @@ public class Activity extends ContextThemeWrapper
*
* @see PendingIntent
*/
- public PendingIntent createPendingResult(int requestCode, Intent data,
- int flags) {
+ public PendingIntent createPendingResult(int requestCode, @NonNull Intent data,
+ @PendingIntent.Flags int flags) {
String packageName = getPackageName();
try {
data.prepareToLeaveProcess();
@@ -4387,7 +4416,7 @@ public class Activity extends ContextThemeWrapper
* @param requestedOrientation An orientation constant as used in
* {@link ActivityInfo#screenOrientation ActivityInfo.screenOrientation}.
*/
- public void setRequestedOrientation(int requestedOrientation) {
+ public void setRequestedOrientation(@ActivityInfo.ScreenOrientation int requestedOrientation) {
if (mParent == null) {
try {
ActivityManagerNative.getDefault().setRequestedOrientation(
@@ -4409,6 +4438,7 @@ public class Activity extends ContextThemeWrapper
* @return Returns an orientation constant as used in
* {@link ActivityInfo#screenOrientation ActivityInfo.screenOrientation}.
*/
+ @ActivityInfo.ScreenOrientation
public int getRequestedOrientation() {
if (mParent == null) {
try {
@@ -4480,6 +4510,7 @@ public class Activity extends ContextThemeWrapper
*
* @return The local class name.
*/
+ @NonNull
public String getLocalClassName() {
final String pkg = getPackageName();
final String cls = mComponent.getClassName();
@@ -4525,9 +4556,9 @@ public class Activity extends ContextThemeWrapper
mSearchManager = new SearchManager(this, null);
}
-
+
@Override
- public Object getSystemService(String name) {
+ public Object getSystemService(@ServiceName @NonNull String name) {
if (getBaseContext() == null) {
throw new IllegalStateException(
"System services not available to Activities before onCreate()");
@@ -4689,7 +4720,7 @@ public class Activity extends ContextThemeWrapper
/**
* Gets the suggested audio stream whose volume should be changed by the
- * harwdare volume controls.
+ * hardware volume controls.
*
* @return The suggested audio stream type whose volume should be changed by
* the hardware volume controls.
@@ -4725,6 +4756,7 @@ public class Activity extends ContextThemeWrapper
* @see android.view.LayoutInflater#createView
* @see android.view.Window#getLayoutInflater
*/
+ @Nullable
public View onCreateView(String name, Context context, AttributeSet attrs) {
return null;
}
@@ -4983,6 +5015,7 @@ public class Activity extends ContextThemeWrapper
*
* @see ActionMode
*/
+ @Nullable
public ActionMode startActionMode(ActionMode.Callback callback) {
return mWindow.getDecorView().startActionMode(callback);
}
@@ -4998,6 +5031,7 @@ public class Activity extends ContextThemeWrapper
* @return The new action mode, or <code>null</code> if the activity does not want to
* provide special handling for this action mode. (It will be handled by the system.)
*/
+ @Nullable
@Override
public ActionMode onWindowStartingActionMode(ActionMode.Callback callback) {
initActionBar();
@@ -5141,6 +5175,7 @@ public class Activity extends ContextThemeWrapper
* @return a new Intent targeting the defined parent of this activity or null if
* there is no valid parent.
*/
+ @Nullable
public Intent getParentActivityIntent() {
final String parentName = mActivityInfo.parentActivityName;
if (TextUtils.isEmpty(parentName)) {
diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java
index aece462..e71d47d 100644
--- a/core/java/android/app/AppOpsManager.java
+++ b/core/java/android/app/AppOpsManager.java
@@ -36,7 +36,7 @@ import android.os.RemoteException;
* API for interacting with "application operation" tracking.
*
* <p>This API is not generally intended for third party application developers; most
- * features are only available to system applicatins. Obtain an instance of it through
+ * features are only available to system applications. Obtain an instance of it through
* {@link Context#getSystemService(String) Context.getSystemService} with
* {@link Context#APP_OPS_SERVICE Context.APP_OPS_SERVICE}.</p>
*/
diff --git a/core/java/android/app/Fragment.java b/core/java/android/app/Fragment.java
index d626e5f..c09da87 100644
--- a/core/java/android/app/Fragment.java
+++ b/core/java/android/app/Fragment.java
@@ -17,6 +17,7 @@
package android.app;
import android.animation.Animator;
+import android.annotation.Nullable;
import android.content.ComponentCallbacks2;
import android.content.Context;
import android.content.Intent;
@@ -575,7 +576,7 @@ public class Fragment implements ComponentCallbacks2, OnCreateContextMenuListene
* the given fragment class. This is a runtime exception; it is not
* normally expected to happen.
*/
- public static Fragment instantiate(Context context, String fname, Bundle args) {
+ public static Fragment instantiate(Context context, String fname, @Nullable Bundle args) {
try {
Class<?> clazz = sClassMap.get(fname);
if (clazz == null) {
@@ -1213,7 +1214,8 @@ public class Fragment implements ComponentCallbacks2, OnCreateContextMenuListene
*
* @return Return the View for the fragment's UI, or null.
*/
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ @Nullable
+ public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
Bundle savedInstanceState) {
return null;
}
@@ -1228,7 +1230,7 @@ public class Fragment implements ComponentCallbacks2, OnCreateContextMenuListene
* @param savedInstanceState If non-null, this fragment is being re-constructed
* from a previous saved state as given here.
*/
- public void onViewCreated(View view, Bundle savedInstanceState) {
+ public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
}
/**
@@ -1237,6 +1239,7 @@ public class Fragment implements ComponentCallbacks2, OnCreateContextMenuListene
*
* @return The fragment's root view, or null if it has no layout.
*/
+ @Nullable
public View getView() {
return mView;
}
diff --git a/core/java/android/app/FragmentBreadCrumbs.java b/core/java/android/app/FragmentBreadCrumbs.java
index b810b89..e4de7af 100644
--- a/core/java/android/app/FragmentBreadCrumbs.java
+++ b/core/java/android/app/FragmentBreadCrumbs.java
@@ -81,14 +81,19 @@ public class FragmentBreadCrumbs extends ViewGroup
}
public FragmentBreadCrumbs(Context context, AttributeSet attrs) {
- this(context, attrs, android.R.style.Widget_FragmentBreadCrumbs);
+ this(context, attrs, com.android.internal.R.attr.fragmentBreadCrumbsStyle);
}
- public FragmentBreadCrumbs(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
+ public FragmentBreadCrumbs(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
+ public FragmentBreadCrumbs(
+ Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
- TypedArray a = context.obtainStyledAttributes(attrs,
- com.android.internal.R.styleable.FragmentBreadCrumbs, defStyle, 0);
+ final TypedArray a = context.obtainStyledAttributes(attrs,
+ com.android.internal.R.styleable.FragmentBreadCrumbs, defStyleAttr, defStyleRes);
mGravity = a.getInt(com.android.internal.R.styleable.FragmentBreadCrumbs_gravity,
DEFAULT_GRAVITY);
diff --git a/core/java/android/app/MediaRouteButton.java b/core/java/android/app/MediaRouteButton.java
index 7e0a27a..2464e35 100644
--- a/core/java/android/app/MediaRouteButton.java
+++ b/core/java/android/app/MediaRouteButton.java
@@ -75,12 +75,17 @@ public class MediaRouteButton extends View {
}
public MediaRouteButton(Context context, AttributeSet attrs, int defStyleAttr) {
- super(context, attrs, defStyleAttr);
+ this(context, attrs, defStyleAttr, 0);
+ }
+
+ public MediaRouteButton(
+ Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
mRouter = (MediaRouter)context.getSystemService(Context.MEDIA_ROUTER_SERVICE);
- TypedArray a = context.obtainStyledAttributes(attrs,
- com.android.internal.R.styleable.MediaRouteButton, defStyleAttr, 0);
+ final TypedArray a = context.obtainStyledAttributes(attrs,
+ com.android.internal.R.styleable.MediaRouteButton, defStyleAttr, defStyleRes);
setRemoteIndicatorDrawable(a.getDrawable(
com.android.internal.R.styleable.MediaRouteButton_externalRouteEnabledDrawable));
mMinWidth = a.getDimensionPixelSize(
diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java
index c63e586..ed3bb92 100644
--- a/core/java/android/app/Notification.java
+++ b/core/java/android/app/Notification.java
@@ -18,6 +18,7 @@ package android.app;
import com.android.internal.R;
+import android.annotation.IntDef;
import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
@@ -37,6 +38,8 @@ import android.view.View;
import android.widget.ProgressBar;
import android.widget.RemoteViews;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
import java.text.NumberFormat;
import java.util.ArrayList;
@@ -350,6 +353,11 @@ public class Notification implements Parcelable
public int flags;
+ /** @hide */
+ @IntDef({PRIORITY_DEFAULT,PRIORITY_LOW,PRIORITY_MIN,PRIORITY_HIGH,PRIORITY_MAX})
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface Priority {}
+
/**
* Default notification {@link #priority}. If your application does not prioritize its own
* notifications, use this value for all notifications.
@@ -391,6 +399,7 @@ public class Notification implements Parcelable
* system will make a determination about how to interpret this priority when presenting
* the notification.
*/
+ @Priority
public int priority;
/**
@@ -1550,7 +1559,7 @@ public class Notification implements Parcelable
*
* @see Notification#priority
*/
- public Builder setPriority(int pri) {
+ public Builder setPriority(@Priority int pri) {
mPriority = pri;
return this;
}
diff --git a/core/java/android/app/PendingIntent.java b/core/java/android/app/PendingIntent.java
index bdd0adb..a03e5b6 100644
--- a/core/java/android/app/PendingIntent.java
+++ b/core/java/android/app/PendingIntent.java
@@ -16,6 +16,9 @@
package android.app;
+import android.annotation.IntDef;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.content.Context;
import android.content.Intent;
import android.content.IIntentReceiver;
@@ -30,6 +33,9 @@ import android.os.Parcelable;
import android.os.UserHandle;
import android.util.AndroidException;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
/**
* A description of an Intent and target action to perform with it. Instances
* of this class are created with {@link #getActivity}, {@link #getActivities},
@@ -86,6 +92,26 @@ import android.util.AndroidException;
public final class PendingIntent implements Parcelable {
private final IIntentSender mTarget;
+ /** @hide */
+ @IntDef(flag = true,
+ value = {
+ FLAG_ONE_SHOT,
+ FLAG_NO_CREATE,
+ FLAG_CANCEL_CURRENT,
+ FLAG_UPDATE_CURRENT,
+
+ Intent.FILL_IN_ACTION,
+ Intent.FILL_IN_DATA,
+ Intent.FILL_IN_CATEGORIES,
+ Intent.FILL_IN_COMPONENT,
+ Intent.FILL_IN_PACKAGE,
+ Intent.FILL_IN_SOURCE_BOUNDS,
+ Intent.FILL_IN_SELECTOR,
+ Intent.FILL_IN_CLIP_DATA
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface Flags {}
+
/**
* Flag for use with {@link #getActivity}, {@link #getBroadcast}, and
* {@link #getService}: this
@@ -220,7 +246,7 @@ public final class PendingIntent implements Parcelable {
* supplied.
*/
public static PendingIntent getActivity(Context context, int requestCode,
- Intent intent, int flags) {
+ Intent intent, @Flags int flags) {
return getActivity(context, requestCode, intent, flags, null);
}
@@ -253,7 +279,7 @@ public final class PendingIntent implements Parcelable {
* supplied.
*/
public static PendingIntent getActivity(Context context, int requestCode,
- Intent intent, int flags, Bundle options) {
+ @NonNull Intent intent, @Flags int flags, @Nullable Bundle options) {
String packageName = context.getPackageName();
String resolvedType = intent != null ? intent.resolveTypeIfNeeded(
context.getContentResolver()) : null;
@@ -278,7 +304,7 @@ public final class PendingIntent implements Parcelable {
* activity is started, not when the pending intent is created.
*/
public static PendingIntent getActivityAsUser(Context context, int requestCode,
- Intent intent, int flags, Bundle options, UserHandle user) {
+ @NonNull Intent intent, int flags, Bundle options, UserHandle user) {
String packageName = context.getPackageName();
String resolvedType = intent != null ? intent.resolveTypeIfNeeded(
context.getContentResolver()) : null;
@@ -343,7 +369,7 @@ public final class PendingIntent implements Parcelable {
* supplied.
*/
public static PendingIntent getActivities(Context context, int requestCode,
- Intent[] intents, int flags) {
+ @NonNull Intent[] intents, @Flags int flags) {
return getActivities(context, requestCode, intents, flags, null);
}
@@ -393,7 +419,7 @@ public final class PendingIntent implements Parcelable {
* supplied.
*/
public static PendingIntent getActivities(Context context, int requestCode,
- Intent[] intents, int flags, Bundle options) {
+ @NonNull Intent[] intents, @Flags int flags, @Nullable Bundle options) {
String packageName = context.getPackageName();
String[] resolvedTypes = new String[intents.length];
for (int i=0; i<intents.length; i++) {
@@ -419,7 +445,7 @@ public final class PendingIntent implements Parcelable {
* activity is started, not when the pending intent is created.
*/
public static PendingIntent getActivitiesAsUser(Context context, int requestCode,
- Intent[] intents, int flags, Bundle options, UserHandle user) {
+ @NonNull Intent[] intents, int flags, Bundle options, UserHandle user) {
String packageName = context.getPackageName();
String[] resolvedTypes = new String[intents.length];
for (int i=0; i<intents.length; i++) {
@@ -463,7 +489,7 @@ public final class PendingIntent implements Parcelable {
* supplied.
*/
public static PendingIntent getBroadcast(Context context, int requestCode,
- Intent intent, int flags) {
+ Intent intent, @Flags int flags) {
return getBroadcastAsUser(context, requestCode, intent, flags,
new UserHandle(UserHandle.myUserId()));
}
@@ -517,7 +543,7 @@ public final class PendingIntent implements Parcelable {
* supplied.
*/
public static PendingIntent getService(Context context, int requestCode,
- Intent intent, int flags) {
+ @NonNull Intent intent, @Flags int flags) {
String packageName = context.getPackageName();
String resolvedType = intent != null ? intent.resolveTypeIfNeeded(
context.getContentResolver()) : null;
@@ -747,6 +773,7 @@ public final class PendingIntent implements Parcelable {
* @return The package name of the PendingIntent, or null if there is
* none associated with it.
*/
+ @Nullable
public String getCreatorPackage() {
try {
return ActivityManagerNative.getDefault()
@@ -805,6 +832,7 @@ public final class PendingIntent implements Parcelable {
* @return The user handle of the PendingIntent, or null if there is
* none associated with it.
*/
+ @Nullable
public UserHandle getCreatorUserHandle() {
try {
int uid = ActivityManagerNative.getDefault()
@@ -920,8 +948,8 @@ public final class PendingIntent implements Parcelable {
* @param sender The PendingIntent to write, or null.
* @param out Where to write the PendingIntent.
*/
- public static void writePendingIntentOrNullToParcel(PendingIntent sender,
- Parcel out) {
+ public static void writePendingIntentOrNullToParcel(@Nullable PendingIntent sender,
+ @NonNull Parcel out) {
out.writeStrongBinder(sender != null ? sender.mTarget.asBinder()
: null);
}
@@ -936,7 +964,8 @@ public final class PendingIntent implements Parcelable {
* @return Returns the Messenger read from the Parcel, or null if null had
* been written.
*/
- public static PendingIntent readPendingIntentOrNullFromParcel(Parcel in) {
+ @Nullable
+ public static PendingIntent readPendingIntentOrNullFromParcel(@NonNull Parcel in) {
IBinder b = in.readStrongBinder();
return b != null ? new PendingIntent(b) : null;
}
diff --git a/core/java/android/app/TaskStackBuilder.java b/core/java/android/app/TaskStackBuilder.java
index 3e0ac7e..0077db1 100644
--- a/core/java/android/app/TaskStackBuilder.java
+++ b/core/java/android/app/TaskStackBuilder.java
@@ -16,6 +16,7 @@
package android.app;
+import android.annotation.NonNull;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
@@ -244,7 +245,7 @@ public class TaskStackBuilder {
*
* @return The obtained PendingIntent
*/
- public PendingIntent getPendingIntent(int requestCode, int flags) {
+ public PendingIntent getPendingIntent(int requestCode, @PendingIntent.Flags int flags) {
return getPendingIntent(requestCode, flags, null);
}
@@ -263,7 +264,8 @@ public class TaskStackBuilder {
*
* @return The obtained PendingIntent
*/
- public PendingIntent getPendingIntent(int requestCode, int flags, Bundle options) {
+ public PendingIntent getPendingIntent(int requestCode, @PendingIntent.Flags int flags,
+ Bundle options) {
if (mIntents.isEmpty()) {
throw new IllegalStateException(
"No intents added to TaskStackBuilder; cannot getPendingIntent");
@@ -294,6 +296,7 @@ public class TaskStackBuilder {
*
* @return An array containing the intents added to this builder.
*/
+ @NonNull
public Intent[] getIntents() {
Intent[] intents = new Intent[mIntents.size()];
if (intents.length == 0) return intents;
diff --git a/core/java/android/app/TimePickerDialog.java b/core/java/android/app/TimePickerDialog.java
index 952227f..a85c61f 100644
--- a/core/java/android/app/TimePickerDialog.java
+++ b/core/java/android/app/TimePickerDialog.java
@@ -16,17 +16,19 @@
package android.app;
-import com.android.internal.R;
-
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.os.Bundle;
+import android.util.TypedValue;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.TimePicker;
import android.widget.TimePicker.OnTimeChangedListener;
+import com.android.internal.R;
+
+
/**
* A dialog that prompts the user for the time of day using a {@link TimePicker}.
*
@@ -38,7 +40,7 @@ public class TimePickerDialog extends AlertDialog
/**
* The callback interface used to indicate the user is done filling in
- * the time (they clicked on the 'Set' button).
+ * the time (they clicked on the 'Done' button).
*/
public interface OnTimeSetListener {
@@ -55,7 +57,7 @@ public class TimePickerDialog extends AlertDialog
private static final String IS_24_HOUR = "is24hour";
private final TimePicker mTimePicker;
- private final OnTimeSetListener mCallback;
+ private final OnTimeSetListener mTimeSetCallback;
int mInitialHourOfDay;
int mInitialMinute;
@@ -74,6 +76,16 @@ public class TimePickerDialog extends AlertDialog
this(context, 0, callBack, hourOfDay, minute, is24HourView);
}
+ static int resolveDialogTheme(Context context, int resid) {
+ if (resid == 0) {
+ TypedValue outValue = new TypedValue();
+ context.getTheme().resolveAttribute(R.attr.timePickerDialogTheme, outValue, true);
+ return outValue.resourceId;
+ } else {
+ return resid;
+ }
+ }
+
/**
* @param context Parent.
* @param theme the theme to apply to this dialog
@@ -86,17 +98,13 @@ public class TimePickerDialog extends AlertDialog
int theme,
OnTimeSetListener callBack,
int hourOfDay, int minute, boolean is24HourView) {
- super(context, theme);
- mCallback = callBack;
+ super(context, resolveDialogTheme(context, theme));
+ mTimeSetCallback = callBack;
mInitialHourOfDay = hourOfDay;
mInitialMinute = minute;
mIs24HourView = is24HourView;
- setIcon(0);
- setTitle(R.string.time_picker_dialog_title);
-
Context themeContext = getContext();
- setButton(BUTTON_POSITIVE, themeContext.getText(R.string.date_time_done), this);
LayoutInflater inflater =
(LayoutInflater) themeContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
@@ -104,7 +112,18 @@ public class TimePickerDialog extends AlertDialog
setView(view);
mTimePicker = (TimePicker) view.findViewById(R.id.timePicker);
- // initialize state
+ // Initialize state
+ mTimePicker.setLegacyMode(false /* will show new UI */);
+ mTimePicker.setShowDoneButton(true);
+ mTimePicker.setDismissCallback(new TimePicker.TimePickerDismissCallback() {
+ @Override
+ public void dismiss(TimePicker view, boolean isCancel, int hourOfDay, int minute) {
+ if (!isCancel) {
+ mTimeSetCallback.onTimeSet(view, hourOfDay, minute);
+ }
+ TimePickerDialog.this.dismiss();
+ }
+ });
mTimePicker.setIs24HourView(mIs24HourView);
mTimePicker.setCurrentHour(mInitialHourOfDay);
mTimePicker.setCurrentMinute(mInitialMinute);
@@ -125,9 +144,9 @@ public class TimePickerDialog extends AlertDialog
}
private void tryNotifyTimeSet() {
- if (mCallback != null) {
+ if (mTimeSetCallback != null) {
mTimePicker.clearFocus();
- mCallback.onTimeSet(mTimePicker, mTimePicker.getCurrentHour(),
+ mTimeSetCallback.onTimeSet(mTimePicker, mTimePicker.getCurrentHour(),
mTimePicker.getCurrentMinute());
}
}
diff --git a/core/java/android/app/WallpaperManager.java b/core/java/android/app/WallpaperManager.java
index ced72f8..99eecb0 100644
--- a/core/java/android/app/WallpaperManager.java
+++ b/core/java/android/app/WallpaperManager.java
@@ -221,24 +221,9 @@ public class WallpaperManager {
private static final int MSG_CLEAR_WALLPAPER = 1;
- private final Handler mHandler;
-
Globals(Looper looper) {
IBinder b = ServiceManager.getService(Context.WALLPAPER_SERVICE);
mService = IWallpaperManager.Stub.asInterface(b);
- mHandler = new Handler(looper) {
- @Override
- public void handleMessage(Message msg) {
- switch (msg.what) {
- case MSG_CLEAR_WALLPAPER:
- synchronized (this) {
- mWallpaper = null;
- mDefaultWallpaper = null;
- }
- break;
- }
- }
- };
}
public void onWallpaperChanged() {
@@ -247,7 +232,10 @@ public class WallpaperManager {
* to null so if the user requests the wallpaper again then we'll
* fetch it.
*/
- mHandler.sendEmptyMessage(MSG_CLEAR_WALLPAPER);
+ synchronized (this) {
+ mWallpaper = null;
+ mDefaultWallpaper = null;
+ }
}
public Bitmap peekWallpaperBitmap(Context context, boolean returnDefault) {
@@ -280,7 +268,6 @@ public class WallpaperManager {
synchronized (this) {
mWallpaper = null;
mDefaultWallpaper = null;
- mHandler.removeMessages(MSG_CLEAR_WALLPAPER);
}
}
diff --git a/core/java/android/bluetooth/BluetoothTetheringDataTracker.java b/core/java/android/bluetooth/BluetoothTetheringDataTracker.java
index a9b7176..ca7749d 100644
--- a/core/java/android/bluetooth/BluetoothTetheringDataTracker.java
+++ b/core/java/android/bluetooth/BluetoothTetheringDataTracker.java
@@ -143,11 +143,6 @@ public class BluetoothTetheringDataTracker extends BaseNetworkStateTracker {
}
@Override
- public void captivePortalCheckComplete() {
- // not implemented
- }
-
- @Override
public void captivePortalCheckCompleted(boolean isCaptivePortal) {
// not implemented
}
diff --git a/core/java/android/content/AsyncTaskLoader.java b/core/java/android/content/AsyncTaskLoader.java
index eb7426e..7241e0d 100644
--- a/core/java/android/content/AsyncTaskLoader.java
+++ b/core/java/android/content/AsyncTaskLoader.java
@@ -20,7 +20,7 @@ import android.os.AsyncTask;
import android.os.Handler;
import android.os.OperationCanceledException;
import android.os.SystemClock;
-import android.util.Slog;
+import android.util.Log;
import android.util.TimeUtils;
import java.io.FileDescriptor;
@@ -64,10 +64,10 @@ public abstract class AsyncTaskLoader<D> extends Loader<D> {
/* Runs on a worker thread */
@Override
protected D doInBackground(Void... params) {
- if (DEBUG) Slog.v(TAG, this + " >>> doInBackground");
+ if (DEBUG) Log.v(TAG, this + " >>> doInBackground");
try {
D data = AsyncTaskLoader.this.onLoadInBackground();
- if (DEBUG) Slog.v(TAG, this + " <<< doInBackground");
+ if (DEBUG) Log.v(TAG, this + " <<< doInBackground");
return data;
} catch (OperationCanceledException ex) {
if (!isCancelled()) {
@@ -79,7 +79,7 @@ public abstract class AsyncTaskLoader<D> extends Loader<D> {
// So we treat this case as an unhandled exception.
throw ex;
}
- if (DEBUG) Slog.v(TAG, this + " <<< doInBackground (was canceled)", ex);
+ if (DEBUG) Log.v(TAG, this + " <<< doInBackground (was canceled)", ex);
return null;
}
}
@@ -87,7 +87,7 @@ public abstract class AsyncTaskLoader<D> extends Loader<D> {
/* Runs on the UI thread */
@Override
protected void onPostExecute(D data) {
- if (DEBUG) Slog.v(TAG, this + " onPostExecute");
+ if (DEBUG) Log.v(TAG, this + " onPostExecute");
try {
AsyncTaskLoader.this.dispatchOnLoadComplete(this, data);
} finally {
@@ -98,7 +98,7 @@ public abstract class AsyncTaskLoader<D> extends Loader<D> {
/* Runs on the UI thread */
@Override
protected void onCancelled(D data) {
- if (DEBUG) Slog.v(TAG, this + " onCancelled");
+ if (DEBUG) Log.v(TAG, this + " onCancelled");
try {
AsyncTaskLoader.this.dispatchOnCancelled(this, data);
} finally {
@@ -162,18 +162,18 @@ public abstract class AsyncTaskLoader<D> extends Loader<D> {
super.onForceLoad();
cancelLoad();
mTask = new LoadTask();
- if (DEBUG) Slog.v(TAG, "Preparing load: mTask=" + mTask);
+ if (DEBUG) Log.v(TAG, "Preparing load: mTask=" + mTask);
executePendingTask();
}
@Override
protected boolean onCancelLoad() {
- if (DEBUG) Slog.v(TAG, "onCancelLoad: mTask=" + mTask);
+ if (DEBUG) Log.v(TAG, "onCancelLoad: mTask=" + mTask);
if (mTask != null) {
if (mCancellingTask != null) {
// There was a pending task already waiting for a previous
// one being canceled; just drop it.
- if (DEBUG) Slog.v(TAG,
+ if (DEBUG) Log.v(TAG,
"cancelLoad: still waiting for cancelled task; dropping next");
if (mTask.waiting) {
mTask.waiting = false;
@@ -184,14 +184,14 @@ public abstract class AsyncTaskLoader<D> extends Loader<D> {
} else if (mTask.waiting) {
// There is a task, but it is waiting for the time it should
// execute. We can just toss it.
- if (DEBUG) Slog.v(TAG, "cancelLoad: task is waiting, dropping it");
+ if (DEBUG) Log.v(TAG, "cancelLoad: task is waiting, dropping it");
mTask.waiting = false;
mHandler.removeCallbacks(mTask);
mTask = null;
return false;
} else {
boolean cancelled = mTask.cancel(false);
- if (DEBUG) Slog.v(TAG, "cancelLoad: cancelled=" + cancelled);
+ if (DEBUG) Log.v(TAG, "cancelLoad: cancelled=" + cancelled);
if (cancelled) {
mCancellingTask = mTask;
cancelLoadInBackground();
@@ -223,7 +223,7 @@ public abstract class AsyncTaskLoader<D> extends Loader<D> {
long now = SystemClock.uptimeMillis();
if (now < (mLastLoadCompleteTime+mUpdateThrottle)) {
// Not yet time to do another load.
- if (DEBUG) Slog.v(TAG, "Waiting until "
+ if (DEBUG) Log.v(TAG, "Waiting until "
+ (mLastLoadCompleteTime+mUpdateThrottle)
+ " to execute: " + mTask);
mTask.waiting = true;
@@ -231,7 +231,7 @@ public abstract class AsyncTaskLoader<D> extends Loader<D> {
return;
}
}
- if (DEBUG) Slog.v(TAG, "Executing: " + mTask);
+ if (DEBUG) Log.v(TAG, "Executing: " + mTask);
mTask.executeOnExecutor(mExecutor, (Void[]) null);
}
}
@@ -239,11 +239,11 @@ public abstract class AsyncTaskLoader<D> extends Loader<D> {
void dispatchOnCancelled(LoadTask task, D data) {
onCanceled(data);
if (mCancellingTask == task) {
- if (DEBUG) Slog.v(TAG, "Cancelled task is now canceled!");
+ if (DEBUG) Log.v(TAG, "Cancelled task is now canceled!");
rollbackContentChanged();
mLastLoadCompleteTime = SystemClock.uptimeMillis();
mCancellingTask = null;
- if (DEBUG) Slog.v(TAG, "Delivering cancellation");
+ if (DEBUG) Log.v(TAG, "Delivering cancellation");
deliverCancellation();
executePendingTask();
}
@@ -251,7 +251,7 @@ public abstract class AsyncTaskLoader<D> extends Loader<D> {
void dispatchOnLoadComplete(LoadTask task, D data) {
if (mTask != task) {
- if (DEBUG) Slog.v(TAG, "Load complete of old task, trying to cancel");
+ if (DEBUG) Log.v(TAG, "Load complete of old task, trying to cancel");
dispatchOnCancelled(task, data);
} else {
if (isAbandoned()) {
@@ -261,7 +261,7 @@ public abstract class AsyncTaskLoader<D> extends Loader<D> {
commitContentChanged();
mLastLoadCompleteTime = SystemClock.uptimeMillis();
mTask = null;
- if (DEBUG) Slog.v(TAG, "Delivering result");
+ if (DEBUG) Log.v(TAG, "Delivering result");
deliverResult(data);
}
}
diff --git a/core/java/android/content/ContentResolver.java b/core/java/android/content/ContentResolver.java
index 4e6cc92..018e4c5 100644
--- a/core/java/android/content/ContentResolver.java
+++ b/core/java/android/content/ContentResolver.java
@@ -141,7 +141,7 @@ public abstract class ContentResolver {
public static final String SYNC_EXTRAS_PRIORITY = "sync_priority";
/** {@hide} Flag to allow sync to occur on metered network. */
- public static final String SYNC_EXTRAS_DISALLOW_METERED = "disallow_metered";
+ public static final String SYNC_EXTRAS_DISALLOW_METERED = "allow_metered";
/**
* Set by the SyncManager to request that the SyncAdapter initialize itself for
@@ -368,9 +368,7 @@ public abstract class ContentResolver {
}
/**
- * <p>
* Query the given URI, returning a {@link Cursor} over the result set.
- * </p>
* <p>
* For best performance, the caller should follow these guidelines:
* <ul>
@@ -405,9 +403,8 @@ public abstract class ContentResolver {
}
/**
- * <p>
- * Query the given URI, returning a {@link Cursor} over the result set.
- * </p>
+ * Query the given URI, returning a {@link Cursor} over the result set
+ * with optional support for cancellation.
* <p>
* For best performance, the caller should follow these guidelines:
* <ul>
@@ -1751,7 +1748,7 @@ public abstract class ContentResolver {
new SyncRequest.Builder()
.setSyncAdapter(account, authority)
.setExtras(extras)
- .syncOnce()
+ .syncOnce() // Immediate sync.
.build();
requestSync(request);
}
@@ -1759,9 +1756,6 @@ public abstract class ContentResolver {
/**
* Register a sync with the SyncManager. These requests are built using the
* {@link SyncRequest.Builder}.
- *
- * @param request The immutable SyncRequest object containing the sync parameters. Use
- * {@link SyncRequest.Builder} to construct these.
*/
public static void requestSync(SyncRequest request) {
try {
@@ -1829,12 +1823,25 @@ public abstract class ContentResolver {
*/
public static void cancelSync(Account account, String authority) {
try {
- getContentService().cancelSync(account, authority);
+ getContentService().cancelSync(account, authority, null);
} catch (RemoteException e) {
}
}
/**
+ * Cancel any active or pending syncs that are running on this service.
+ *
+ * @param cname the service for which to cancel all active/pending operations.
+ */
+ public static void cancelSync(ComponentName cname) {
+ try {
+ getContentService().cancelSync(null, null, cname);
+ } catch (RemoteException e) {
+
+ }
+ }
+
+ /**
* Get information about the SyncAdapters that are known to the system.
* @return an array of SyncAdapters that have registered with the system
*/
@@ -1897,12 +1904,13 @@ public abstract class ContentResolver {
* {@link #SYNC_EXTRAS_INITIALIZE}, {@link #SYNC_EXTRAS_FORCE},
* {@link #SYNC_EXTRAS_EXPEDITED}, {@link #SYNC_EXTRAS_MANUAL} set to true.
* If any are supplied then an {@link IllegalArgumentException} will be thrown.
- * <p>As of API level 19 this function introduces a default flexibility of ~4% (up to a maximum
- * of one hour in the day) into the requested period. Use
- * {@link SyncRequest.Builder#syncPeriodic(long, long)} to set this flexibility manually.
*
* <p>This method requires the caller to hold the permission
* {@link android.Manifest.permission#WRITE_SYNC_SETTINGS}.
+ * <p>The bundle for a periodic sync can be queried by applications with the correct
+ * permissions using
+ * {@link ContentResolver#getPeriodicSyncs(Account account, String provider)}, so no
+ * sensitive data should be transferred here.
*
* @param account the account to specify in the sync
* @param authority the provider to specify in the sync request
@@ -1932,6 +1940,26 @@ public abstract class ContentResolver {
}
/**
+ * {@hide}
+ * Helper function to throw an <code>IllegalArgumentException</code> if any illegal
+ * extras were set for a periodic sync.
+ *
+ * @param extras bundle to validate.
+ */
+ public static boolean invalidPeriodicExtras(Bundle extras) {
+ if (extras.getBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, false)
+ || extras.getBoolean(ContentResolver.SYNC_EXTRAS_DO_NOT_RETRY, false)
+ || extras.getBoolean(ContentResolver.SYNC_EXTRAS_IGNORE_BACKOFF, false)
+ || extras.getBoolean(ContentResolver.SYNC_EXTRAS_IGNORE_SETTINGS, false)
+ || extras.getBoolean(ContentResolver.SYNC_EXTRAS_INITIALIZE, false)
+ || extras.getBoolean(ContentResolver.SYNC_EXTRAS_FORCE, false)
+ || extras.getBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, false)) {
+ return true;
+ }
+ return false;
+ }
+
+ /**
* Remove a periodic sync. Has no affect if account, authority and extras don't match
* an existing periodic sync.
* <p>This method requires the caller to hold the permission
@@ -1951,6 +1979,31 @@ public abstract class ContentResolver {
}
/**
+ * Remove the specified sync. This will cancel any pending or active syncs. If the request is
+ * for a periodic sync, this call will remove any future occurrences.
+ * <p>If a periodic sync is specified, the caller must hold the permission
+ * {@link android.Manifest.permission#WRITE_SYNC_SETTINGS}. If this SyncRequest targets a
+ * SyncService adapter,the calling application must be signed with the same certificate as the
+ * adapter.
+ *</p>It is possible to cancel a sync using a SyncRequest object that is not the same object
+ * with which you requested the sync. Do so by building a SyncRequest with the same
+ * service/adapter, frequency, <b>and</b> extras bundle.
+ *
+ * @param request SyncRequest object containing information about sync to cancel.
+ */
+ public static void cancelSync(SyncRequest request) {
+ if (request == null) {
+ throw new IllegalArgumentException("request cannot be null");
+ }
+ try {
+ getContentService().cancelRequest(request);
+ } catch (RemoteException e) {
+ // exception ignored; if this is thrown then it means the runtime is in the midst of
+ // being restarted
+ }
+ }
+
+ /**
* Get the list of information about the periodic syncs for the given account and authority.
* <p>This method requires the caller to hold the permission
* {@link android.Manifest.permission#READ_SYNC_SETTINGS}.
@@ -1961,7 +2014,23 @@ public abstract class ContentResolver {
*/
public static List<PeriodicSync> getPeriodicSyncs(Account account, String authority) {
try {
- return getContentService().getPeriodicSyncs(account, authority);
+ return getContentService().getPeriodicSyncs(account, authority, null);
+ } catch (RemoteException e) {
+ throw new RuntimeException("the ContentService should always be reachable", e);
+ }
+ }
+
+ /**
+ * Return periodic syncs associated with the provided component.
+ * <p>The calling application must be signed with the same certificate as the target component,
+ * otherwise this call will fail.
+ */
+ public static List<PeriodicSync> getPeriodicSyncs(ComponentName cname) {
+ if (cname == null) {
+ throw new IllegalArgumentException("Component must not be null");
+ }
+ try {
+ return getContentService().getPeriodicSyncs(null, null, cname);
} catch (RemoteException e) {
throw new RuntimeException("the ContentService should always be reachable", e);
}
@@ -1997,6 +2066,38 @@ public abstract class ContentResolver {
}
/**
+ * Set whether the provided {@link SyncService} is available to process work.
+ * <p>This method requires the caller to hold the permission
+ * {@link android.Manifest.permission#WRITE_SYNC_SETTINGS}.
+ * <p>The calling application must be signed with the same certificate as the target component,
+ * otherwise this call will fail.
+ */
+ public static void setServiceActive(ComponentName cname, boolean active) {
+ try {
+ getContentService().setServiceActive(cname, active);
+ } catch (RemoteException e) {
+ // exception ignored; if this is thrown then it means the runtime is in the midst of
+ // being restarted
+ }
+ }
+
+ /**
+ * Query the state of this sync service.
+ * <p>Set with {@link #setServiceActive(ComponentName cname, boolean active)}.
+ * <p>The calling application must be signed with the same certificate as the target component,
+ * otherwise this call will fail.
+ * @param cname ComponentName referring to a {@link SyncService}
+ * @return true if jobs will be run on this service, false otherwise.
+ */
+ public static boolean isServiceActive(ComponentName cname) {
+ try {
+ return getContentService().isServiceActive(cname);
+ } catch (RemoteException e) {
+ throw new RuntimeException("the ContentService should always be reachable", e);
+ }
+ }
+
+ /**
* Gets the master auto-sync setting that applies to all the providers and accounts.
* If this is false then the per-provider auto-sync setting is ignored.
* <p>This method requires the caller to hold the permission
@@ -2030,8 +2131,8 @@ public abstract class ContentResolver {
}
/**
- * Returns true if there is currently a sync operation for the given
- * account or authority in the pending list, or actively being processed.
+ * Returns true if there is currently a sync operation for the given account or authority
+ * actively being processed.
* <p>This method requires the caller to hold the permission
* {@link android.Manifest.permission#READ_SYNC_STATS}.
* @param account the account whose setting we are querying
@@ -2039,8 +2140,26 @@ public abstract class ContentResolver {
* @return true if a sync is active for the given account or authority.
*/
public static boolean isSyncActive(Account account, String authority) {
+ if (account == null) {
+ throw new IllegalArgumentException("account must not be null");
+ }
+ if (authority == null) {
+ throw new IllegalArgumentException("authority must not be null");
+ }
+
+ try {
+ return getContentService().isSyncActive(account, authority, null);
+ } catch (RemoteException e) {
+ throw new RuntimeException("the ContentService should always be reachable", e);
+ }
+ }
+
+ public static boolean isSyncActive(ComponentName cname) {
+ if (cname == null) {
+ throw new IllegalArgumentException("component name must not be null");
+ }
try {
- return getContentService().isSyncActive(account, authority);
+ return getContentService().isSyncActive(null, null, cname);
} catch (RemoteException e) {
throw new RuntimeException("the ContentService should always be reachable", e);
}
@@ -2098,7 +2217,7 @@ public abstract class ContentResolver {
*/
public static SyncStatusInfo getSyncStatus(Account account, String authority) {
try {
- return getContentService().getSyncStatus(account, authority);
+ return getContentService().getSyncStatus(account, authority, null);
} catch (RemoteException e) {
throw new RuntimeException("the ContentService should always be reachable", e);
}
@@ -2114,7 +2233,15 @@ public abstract class ContentResolver {
*/
public static boolean isSyncPending(Account account, String authority) {
try {
- return getContentService().isSyncPending(account, authority);
+ return getContentService().isSyncPending(account, authority, null);
+ } catch (RemoteException e) {
+ throw new RuntimeException("the ContentService should always be reachable", e);
+ }
+ }
+
+ public static boolean isSyncPending(ComponentName cname) {
+ try {
+ return getContentService().isSyncPending(null, null, cname);
} catch (RemoteException e) {
throw new RuntimeException("the ContentService should always be reachable", e);
}
diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java
index 2e4e209..32b95c2 100644
--- a/core/java/android/content/Context.java
+++ b/core/java/android/content/Context.java
@@ -16,6 +16,10 @@
package android.content;
+import android.annotation.IntDef;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.StringDef;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.res.AssetManager;
@@ -47,6 +51,8 @@ import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
/**
* Interface to global information about an application environment. This is
@@ -132,6 +138,20 @@ public abstract class Context {
*/
public static final int MODE_ENABLE_WRITE_AHEAD_LOGGING = 0x0008;
+ /** @hide */
+ @IntDef(flag = true,
+ value = {
+ BIND_AUTO_CREATE,
+ BIND_AUTO_CREATE,
+ BIND_DEBUG_UNBIND,
+ BIND_NOT_FOREGROUND,
+ BIND_ABOVE_CLIENT,
+ BIND_ALLOW_OOM_MANAGEMENT,
+ BIND_WAIVE_PRIORITY
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface BindServiceFlags {}
+
/**
* Flag for {@link #bindService}: automatically create the service as long
* as the binding exists. Note that while this will create the service,
@@ -495,7 +515,7 @@ public abstract class Context {
* and {@link #MODE_WORLD_WRITEABLE} to control permissions. The bit
* {@link #MODE_MULTI_PROCESS} can also be used if multiple processes
* are mutating the same SharedPreferences file. {@link #MODE_MULTI_PROCESS}
- * is always on in apps targetting Gingerbread (Android 2.3) and below, and
+ * is always on in apps targeting Gingerbread (Android 2.3) and below, and
* off by default in later versions.
*
* @return The single {@link SharedPreferences} instance that can be used
@@ -674,7 +694,8 @@ public abstract class Context {
* @see #getFilesDir
* @see android.os.Environment#getExternalStoragePublicDirectory
*/
- public abstract File getExternalFilesDir(String type);
+ @Nullable
+ public abstract File getExternalFilesDir(@Nullable String type);
/**
* Returns absolute paths to application-specific directories on all
@@ -840,6 +861,7 @@ public abstract class Context {
*
* @see #getCacheDir
*/
+ @Nullable
public abstract File getExternalCacheDir();
/**
@@ -960,7 +982,8 @@ public abstract class Context {
* @see #deleteDatabase
*/
public abstract SQLiteDatabase openOrCreateDatabase(String name,
- int mode, CursorFactory factory, DatabaseErrorHandler errorHandler);
+ int mode, CursorFactory factory,
+ @Nullable DatabaseErrorHandler errorHandler);
/**
* Delete an existing private SQLiteDatabase associated with this Context's
@@ -1106,7 +1129,7 @@ public abstract class Context {
* @see #startActivity(Intent)
* @see PackageManager#resolveActivity
*/
- public abstract void startActivity(Intent intent, Bundle options);
+ public abstract void startActivity(Intent intent, @Nullable Bundle options);
/**
* Version of {@link #startActivity(Intent, Bundle)} that allows you to specify the
@@ -1122,7 +1145,7 @@ public abstract class Context {
* @throws ActivityNotFoundException &nbsp;
* @hide
*/
- public void startActivityAsUser(Intent intent, Bundle options, UserHandle userId) {
+ public void startActivityAsUser(Intent intent, @Nullable Bundle options, UserHandle userId) {
throw new RuntimeException("Not implemented. Must override in a subclass.");
}
@@ -1241,7 +1264,7 @@ public abstract class Context {
* @see #startIntentSender(IntentSender, Intent, int, int, int)
*/
public abstract void startIntentSender(IntentSender intent,
- Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags,
+ @Nullable Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags,
Bundle options) throws IntentSender.SendIntentException;
/**
@@ -1291,11 +1314,11 @@ public abstract class Context {
* @see #sendOrderedBroadcast(Intent, String, BroadcastReceiver, Handler, int, String, Bundle)
*/
public abstract void sendBroadcast(Intent intent,
- String receiverPermission);
+ @Nullable String receiverPermission);
/**
* Like {@link #sendBroadcast(Intent, String)}, but also allows specification
- * of an assocated app op as per {@link android.app.AppOpsManager}.
+ * of an associated app op as per {@link android.app.AppOpsManager}.
* @hide
*/
public abstract void sendBroadcast(Intent intent,
@@ -1322,7 +1345,7 @@ public abstract class Context {
* @see #sendOrderedBroadcast(Intent, String, BroadcastReceiver, Handler, int, String, Bundle)
*/
public abstract void sendOrderedBroadcast(Intent intent,
- String receiverPermission);
+ @Nullable String receiverPermission);
/**
* Version of {@link #sendBroadcast(Intent)} that allows you to
@@ -1366,15 +1389,15 @@ public abstract class Context {
* @see #registerReceiver
* @see android.app.Activity#RESULT_OK
*/
- public abstract void sendOrderedBroadcast(Intent intent,
- String receiverPermission, BroadcastReceiver resultReceiver,
- Handler scheduler, int initialCode, String initialData,
- Bundle initialExtras);
+ public abstract void sendOrderedBroadcast(@NonNull Intent intent,
+ @Nullable String receiverPermission, BroadcastReceiver resultReceiver,
+ @Nullable Handler scheduler, int initialCode, @Nullable String initialData,
+ @Nullable Bundle initialExtras);
/**
* Like {@link #sendOrderedBroadcast(Intent, String, BroadcastReceiver, android.os.Handler,
* int, String, android.os.Bundle)}, but also allows specification
- * of an assocated app op as per {@link android.app.AppOpsManager}.
+ * of an associated app op as per {@link android.app.AppOpsManager}.
* @hide
*/
public abstract void sendOrderedBroadcast(Intent intent,
@@ -1409,7 +1432,7 @@ public abstract class Context {
* @see #sendBroadcast(Intent, String)
*/
public abstract void sendBroadcastAsUser(Intent intent, UserHandle user,
- String receiverPermission);
+ @Nullable String receiverPermission);
/**
* Version of
@@ -1442,8 +1465,9 @@ public abstract class Context {
* @see #sendOrderedBroadcast(Intent, String, BroadcastReceiver, Handler, int, String, Bundle)
*/
public abstract void sendOrderedBroadcastAsUser(Intent intent, UserHandle user,
- String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler,
- int initialCode, String initialData, Bundle initialExtras);
+ @Nullable String receiverPermission, BroadcastReceiver resultReceiver,
+ @Nullable Handler scheduler, int initialCode, @Nullable String initialData,
+ @Nullable Bundle initialExtras);
/**
* Perform a {@link #sendBroadcast(Intent)} that is "sticky," meaning the
@@ -1508,8 +1532,8 @@ public abstract class Context {
*/
public abstract void sendStickyOrderedBroadcast(Intent intent,
BroadcastReceiver resultReceiver,
- Handler scheduler, int initialCode, String initialData,
- Bundle initialExtras);
+ @Nullable Handler scheduler, int initialCode, @Nullable String initialData,
+ @Nullable Bundle initialExtras);
/**
* Remove the data previously sent with {@link #sendStickyBroadcast},
@@ -1569,8 +1593,8 @@ public abstract class Context {
*/
public abstract void sendStickyOrderedBroadcastAsUser(Intent intent,
UserHandle user, BroadcastReceiver resultReceiver,
- Handler scheduler, int initialCode, String initialData,
- Bundle initialExtras);
+ @Nullable Handler scheduler, int initialCode, @Nullable String initialData,
+ @Nullable Bundle initialExtras);
/**
* Version of {@link #removeStickyBroadcast(Intent)} that allows you to specify the
@@ -1637,7 +1661,8 @@ public abstract class Context {
* @see #sendBroadcast
* @see #unregisterReceiver
*/
- public abstract Intent registerReceiver(BroadcastReceiver receiver,
+ @Nullable
+ public abstract Intent registerReceiver(@Nullable BroadcastReceiver receiver,
IntentFilter filter);
/**
@@ -1671,8 +1696,10 @@ public abstract class Context {
* @see #sendBroadcast
* @see #unregisterReceiver
*/
+ @Nullable
public abstract Intent registerReceiver(BroadcastReceiver receiver,
- IntentFilter filter, String broadcastPermission, Handler scheduler);
+ IntentFilter filter, @Nullable String broadcastPermission,
+ @Nullable Handler scheduler);
/**
* @hide
@@ -1698,9 +1725,10 @@ public abstract class Context {
* @see #sendBroadcast
* @see #unregisterReceiver
*/
+ @Nullable
public abstract Intent registerReceiverAsUser(BroadcastReceiver receiver,
- UserHandle user, IntentFilter filter, String broadcastPermission,
- Handler scheduler);
+ UserHandle user, IntentFilter filter, @Nullable String broadcastPermission,
+ @Nullable Handler scheduler);
/**
* Unregister a previously registered BroadcastReceiver. <em>All</em>
@@ -1759,6 +1787,7 @@ public abstract class Context {
* @see #stopService
* @see #bindService
*/
+ @Nullable
public abstract ComponentName startService(Intent service);
/**
@@ -1846,8 +1875,8 @@ public abstract class Context {
* @see #BIND_DEBUG_UNBIND
* @see #BIND_NOT_FOREGROUND
*/
- public abstract boolean bindService(Intent service, ServiceConnection conn,
- int flags);
+ public abstract boolean bindService(Intent service, @NonNull ServiceConnection conn,
+ @BindServiceFlags int flags);
/**
* Same as {@link #bindService(Intent, ServiceConnection, int)}, but with an explicit userHandle
@@ -1868,7 +1897,7 @@ public abstract class Context {
*
* @see #bindService
*/
- public abstract void unbindService(ServiceConnection conn);
+ public abstract void unbindService(@NonNull ServiceConnection conn);
/**
* Start executing an {@link android.app.Instrumentation} class. The given
@@ -1893,8 +1922,64 @@ public abstract class Context {
* @return {@code true} if the instrumentation was successfully started,
* else {@code false} if it could not be found.
*/
- public abstract boolean startInstrumentation(ComponentName className,
- String profileFile, Bundle arguments);
+ public abstract boolean startInstrumentation(@NonNull ComponentName className,
+ @Nullable String profileFile, @Nullable Bundle arguments);
+
+ /** @hide */
+ @StringDef({
+ POWER_SERVICE,
+ WINDOW_SERVICE,
+ LAYOUT_INFLATER_SERVICE,
+ ACCOUNT_SERVICE,
+ ACTIVITY_SERVICE,
+ ALARM_SERVICE,
+ NOTIFICATION_SERVICE,
+ ACCESSIBILITY_SERVICE,
+ CAPTIONING_SERVICE,
+ KEYGUARD_SERVICE,
+ LOCATION_SERVICE,
+ //@hide: COUNTRY_DETECTOR,
+ SEARCH_SERVICE,
+ SENSOR_SERVICE,
+ STORAGE_SERVICE,
+ WALLPAPER_SERVICE,
+ VIBRATOR_SERVICE,
+ //@hide: STATUS_BAR_SERVICE,
+ CONNECTIVITY_SERVICE,
+ //@hide: UPDATE_LOCK_SERVICE,
+ //@hide: NETWORKMANAGEMENT_SERVICE,
+ //@hide: NETWORK_STATS_SERVICE,
+ //@hide: NETWORK_POLICY_SERVICE,
+ WIFI_SERVICE,
+ WIFI_P2P_SERVICE,
+ NSD_SERVICE,
+ AUDIO_SERVICE,
+ MEDIA_ROUTER_SERVICE,
+ TELEPHONY_SERVICE,
+ CLIPBOARD_SERVICE,
+ INPUT_METHOD_SERVICE,
+ TEXT_SERVICES_MANAGER_SERVICE,
+ //@hide: APPWIDGET_SERVICE,
+ //@hide: BACKUP_SERVICE,
+ DROPBOX_SERVICE,
+ DEVICE_POLICY_SERVICE,
+ UI_MODE_SERVICE,
+ DOWNLOAD_SERVICE,
+ NFC_SERVICE,
+ BLUETOOTH_SERVICE,
+ //@hide: SIP_SERVICE,
+ USB_SERVICE,
+ //@hide: SERIAL_SERVICE,
+ INPUT_SERVICE,
+ DISPLAY_SERVICE,
+ //@hide: SCHEDULING_POLICY_SERVICE,
+ USER_SERVICE,
+ //@hide: APP_OPS_SERVICE
+ CAMERA_SERVICE,
+ PRINT_SERVICE
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface ServiceName {}
/**
* Return the handle to a system-level service by name. The class of the
@@ -1995,7 +2080,7 @@ public abstract class Context {
* @see #DOWNLOAD_SERVICE
* @see android.app.DownloadManager
*/
- public abstract Object getSystemService(String name);
+ public abstract Object getSystemService(@ServiceName @NonNull String name);
/**
* Use with {@link #getSystemService} to retrieve a
@@ -2431,7 +2516,6 @@ public abstract class Context {
*
* @see #getSystemService
* @see android.hardware.camera2.CameraManager
- * @hide
*/
public static final String CAMERA_SERVICE = "camera";
@@ -2470,7 +2554,8 @@ public abstract class Context {
* @see PackageManager#checkPermission(String, String)
* @see #checkCallingPermission
*/
- public abstract int checkPermission(String permission, int pid, int uid);
+ @PackageManager.PermissionResult
+ public abstract int checkPermission(@NonNull String permission, int pid, int uid);
/**
* Determine whether the calling process of an IPC you are handling has been
@@ -2493,7 +2578,8 @@ public abstract class Context {
* @see #checkPermission
* @see #checkCallingOrSelfPermission
*/
- public abstract int checkCallingPermission(String permission);
+ @PackageManager.PermissionResult
+ public abstract int checkCallingPermission(@NonNull String permission);
/**
* Determine whether the calling process of an IPC <em>or you</em> have been
@@ -2511,7 +2597,8 @@ public abstract class Context {
* @see #checkPermission
* @see #checkCallingPermission
*/
- public abstract int checkCallingOrSelfPermission(String permission);
+ @PackageManager.PermissionResult
+ public abstract int checkCallingOrSelfPermission(@NonNull String permission);
/**
* If the given permission is not allowed for a particular process
@@ -2526,7 +2613,7 @@ public abstract class Context {
* @see #checkPermission(String, int, int)
*/
public abstract void enforcePermission(
- String permission, int pid, int uid, String message);
+ @NonNull String permission, int pid, int uid, @Nullable String message);
/**
* If the calling process of an IPC you are handling has not been
@@ -2547,7 +2634,7 @@ public abstract class Context {
* @see #checkCallingPermission(String)
*/
public abstract void enforceCallingPermission(
- String permission, String message);
+ @NonNull String permission, @Nullable String message);
/**
* If neither you nor the calling process of an IPC you are
@@ -2563,7 +2650,7 @@ public abstract class Context {
* @see #checkCallingOrSelfPermission(String)
*/
public abstract void enforceCallingOrSelfPermission(
- String permission, String message);
+ @NonNull String permission, @Nullable String message);
/**
* Grant permission to access a specific Uri to another package, regardless
@@ -2599,7 +2686,7 @@ public abstract class Context {
* @see #revokeUriPermission
*/
public abstract void grantUriPermission(String toPackage, Uri uri,
- int modeFlags);
+ @Intent.GrantUriMode int modeFlags);
/**
* Remove all permissions to access a particular content provider Uri
@@ -2618,7 +2705,7 @@ public abstract class Context {
*
* @see #grantUriPermission
*/
- public abstract void revokeUriPermission(Uri uri, int modeFlags);
+ public abstract void revokeUriPermission(Uri uri, @Intent.GrantUriMode int modeFlags);
/**
* Determine whether a particular process and user ID has been granted
@@ -2641,7 +2728,8 @@ public abstract class Context {
*
* @see #checkCallingUriPermission
*/
- public abstract int checkUriPermission(Uri uri, int pid, int uid, int modeFlags);
+ public abstract int checkUriPermission(Uri uri, int pid, int uid,
+ @Intent.GrantUriMode int modeFlags);
/**
* Determine whether the calling process and user ID has been
@@ -2664,7 +2752,7 @@ public abstract class Context {
*
* @see #checkUriPermission(Uri, int, int, int)
*/
- public abstract int checkCallingUriPermission(Uri uri, int modeFlags);
+ public abstract int checkCallingUriPermission(Uri uri, @Intent.GrantUriMode int modeFlags);
/**
* Determine whether the calling process of an IPC <em>or you</em> has been granted
@@ -2683,7 +2771,8 @@ public abstract class Context {
*
* @see #checkCallingUriPermission
*/
- public abstract int checkCallingOrSelfUriPermission(Uri uri, int modeFlags);
+ public abstract int checkCallingOrSelfUriPermission(Uri uri,
+ @Intent.GrantUriMode int modeFlags);
/**
* Check both a Uri and normal permission. This allows you to perform
@@ -2695,7 +2784,7 @@ public abstract class Context {
* @param readPermission The permission that provides overall read access,
* or null to not do this check.
* @param writePermission The permission that provides overall write
- * acess, or null to not do this check.
+ * access, or null to not do this check.
* @param pid The process ID being checked against. Must be &gt; 0.
* @param uid The user ID being checked against. A uid of 0 is the root
* user, which will pass every permission check.
@@ -2707,8 +2796,9 @@ public abstract class Context {
* is allowed to access that uri or holds one of the given permissions, or
* {@link PackageManager#PERMISSION_DENIED} if it is not.
*/
- public abstract int checkUriPermission(Uri uri, String readPermission,
- String writePermission, int pid, int uid, int modeFlags);
+ public abstract int checkUriPermission(@Nullable Uri uri, @Nullable String readPermission,
+ @Nullable String writePermission, int pid, int uid,
+ @Intent.GrantUriMode int modeFlags);
/**
* If a particular process and user ID has not been granted
@@ -2730,7 +2820,7 @@ public abstract class Context {
* @see #checkUriPermission(Uri, int, int, int)
*/
public abstract void enforceUriPermission(
- Uri uri, int pid, int uid, int modeFlags, String message);
+ Uri uri, int pid, int uid, @Intent.GrantUriMode int modeFlags, String message);
/**
* If the calling process and user ID has not been granted
@@ -2752,7 +2842,7 @@ public abstract class Context {
* @see #checkCallingUriPermission(Uri, int)
*/
public abstract void enforceCallingUriPermission(
- Uri uri, int modeFlags, String message);
+ Uri uri, @Intent.GrantUriMode int modeFlags, String message);
/**
* If the calling process of an IPC <em>or you</em> has not been
@@ -2771,7 +2861,7 @@ public abstract class Context {
* @see #checkCallingOrSelfUriPermission(Uri, int)
*/
public abstract void enforceCallingOrSelfUriPermission(
- Uri uri, int modeFlags, String message);
+ Uri uri, @Intent.GrantUriMode int modeFlags, String message);
/**
* Enforce both a Uri and normal permission. This allows you to perform
@@ -2783,7 +2873,7 @@ public abstract class Context {
* @param readPermission The permission that provides overall read access,
* or null to not do this check.
* @param writePermission The permission that provides overall write
- * acess, or null to not do this check.
+ * access, or null to not do this check.
* @param pid The process ID being checked against. Must be &gt; 0.
* @param uid The user ID being checked against. A uid of 0 is the root
* user, which will pass every permission check.
@@ -2795,8 +2885,15 @@ public abstract class Context {
* @see #checkUriPermission(Uri, String, String, int, int, int)
*/
public abstract void enforceUriPermission(
- Uri uri, String readPermission, String writePermission,
- int pid, int uid, int modeFlags, String message);
+ @Nullable Uri uri, @Nullable String readPermission,
+ @Nullable String writePermission, int pid, int uid, @Intent.GrantUriMode int modeFlags,
+ @Nullable String message);
+
+ /** @hide */
+ @IntDef(flag = true,
+ value = {CONTEXT_INCLUDE_CODE, CONTEXT_IGNORE_SECURITY, CONTEXT_RESTRICTED})
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface CreatePackageOptions {}
/**
* Flag for use with {@link #createPackageContext}: include the application
@@ -2854,7 +2951,7 @@ public abstract class Context {
* the given package name.
*/
public abstract Context createPackageContext(String packageName,
- int flags) throws PackageManager.NameNotFoundException;
+ @CreatePackageOptions int flags) throws PackageManager.NameNotFoundException;
/**
* Similar to {@link #createPackageContext(String, int)}, but with a
@@ -2890,7 +2987,8 @@ public abstract class Context {
*
* @return A {@link Context} with the given configuration override.
*/
- public abstract Context createConfigurationContext(Configuration overrideConfiguration);
+ public abstract Context createConfigurationContext(
+ @NonNull Configuration overrideConfiguration);
/**
* Return a new Context object for the current Context but whose resources
@@ -2910,7 +3008,7 @@ public abstract class Context {
*
* @return A {@link Context} for the display.
*/
- public abstract Context createDisplayContext(Display display);
+ public abstract Context createDisplayContext(@NonNull Display display);
/**
* Gets the display adjustments holder for this context. This information
diff --git a/core/java/android/content/IAnonymousSyncAdapter.aidl b/core/java/android/content/IAnonymousSyncAdapter.aidl
deleted file mode 100644
index a80cea3..0000000
--- a/core/java/android/content/IAnonymousSyncAdapter.aidl
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (C) 2013 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.content;
-import android.os.Bundle;
-import android.content.ISyncContext;
-
-/**
- * Interface to define an anonymous service that is extended by developers
- * in order to perform anonymous syncs (syncs without an Account or Content
- * Provider specified). See {@link android.content.AbstractThreadedSyncAdapter}.
- * {@hide}
- */
-oneway interface IAnonymousSyncAdapter {
-
- /**
- * Initiate a sync. SyncAdapter-specific parameters may be specified in
- * extras, which is guaranteed to not be null.
- *
- * @param syncContext the ISyncContext used to indicate the progress of the sync. When
- * the sync is finished (successfully or not) ISyncContext.onFinished() must be called.
- * @param extras SyncAdapter-specific parameters.
- *
- */
- void startSync(ISyncContext syncContext, in Bundle extras);
-
- /**
- * Cancel the currently ongoing sync.
- */
- void cancelSync(ISyncContext syncContext);
-
-}
diff --git a/core/java/android/content/IContentService.aidl b/core/java/android/content/IContentService.aidl
index 9ad5a19..73a76e8 100644
--- a/core/java/android/content/IContentService.aidl
+++ b/core/java/android/content/IContentService.aidl
@@ -17,6 +17,7 @@
package android.content;
import android.accounts.Account;
+import android.content.ComponentName;
import android.content.SyncInfo;
import android.content.ISyncStatusObserver;
import android.content.SyncAdapterType;
@@ -55,8 +56,14 @@ interface IContentService {
int userHandle);
void requestSync(in Account account, String authority, in Bundle extras);
+ /**
+ * Start a sync given a request.
+ */
void sync(in SyncRequest request);
- void cancelSync(in Account account, String authority);
+ void cancelSync(in Account account, String authority, in ComponentName cname);
+
+ /** Cancel a sync, providing information about the sync to be cancelled. */
+ void cancelRequest(in SyncRequest request);
/**
* Check if the provider should be synced when a network tickle is received
@@ -74,12 +81,14 @@ interface IContentService {
void setSyncAutomatically(in Account account, String providerName, boolean sync);
/**
- * Get the frequency of the periodic poll, if any.
- * @param providerName the provider whose setting we are querying
- * @return the frequency of the periodic sync in seconds. If 0 then no periodic syncs
- * will take place.
+ * Get a list of periodic operations for a specified authority, or service.
+ * @param account account for authority, must be null if cname is non-null.
+ * @param providerName name of provider, must be null if cname is non-null.
+ * @param cname component to identify sync service, must be null if account/providerName are
+ * non-null.
*/
- List<PeriodicSync> getPeriodicSyncs(in Account account, String providerName);
+ List<PeriodicSync> getPeriodicSyncs(in Account account, String providerName,
+ in ComponentName cname);
/**
* Set whether or not the provider is to be synced on a periodic basis.
@@ -112,15 +121,22 @@ interface IContentService {
*/
void setIsSyncable(in Account account, String providerName, int syncable);
- void setMasterSyncAutomatically(boolean flag);
-
- boolean getMasterSyncAutomatically();
+ /**
+ * Corresponds roughly to setIsSyncable(String account, String provider) for syncs that bind
+ * to a SyncService.
+ */
+ void setServiceActive(in ComponentName cname, boolean active);
/**
- * Returns true if there is currently a sync operation for the given
- * account or authority in the pending list, or actively being processed.
+ * Corresponds roughly to getIsSyncable(String account, String provider) for syncs that bind
+ * to a SyncService.
+ * @return 0 if this SyncService is not enabled, 1 if enabled, <0 if unknown.
*/
- boolean isSyncActive(in Account account, String authority);
+ boolean isServiceActive(in ComponentName cname);
+
+ void setMasterSyncAutomatically(boolean flag);
+
+ boolean getMasterSyncAutomatically();
List<SyncInfo> getCurrentSyncs();
@@ -131,17 +147,33 @@ interface IContentService {
SyncAdapterType[] getSyncAdapterTypes();
/**
+ * Returns true if there is currently a operation for the given account/authority or service
+ * actively being processed.
+ * @param account account for authority, must be null if cname is non-null.
+ * @param providerName name of provider, must be null if cname is non-null.
+ * @param cname component to identify sync service, must be null if account/providerName are
+ * non-null.
+ */
+ boolean isSyncActive(in Account account, String authority, in ComponentName cname);
+
+ /**
* Returns the status that matches the authority. If there are multiples accounts for
* the authority, the one with the latest "lastSuccessTime" status is returned.
- * @param authority the authority whose row should be selected
- * @return the SyncStatusInfo for the authority, or null if none exists
+ * @param account account for authority, must be null if cname is non-null.
+ * @param providerName name of provider, must be null if cname is non-null.
+ * @param cname component to identify sync service, must be null if account/providerName are
+ * non-null.
*/
- SyncStatusInfo getSyncStatus(in Account account, String authority);
+ SyncStatusInfo getSyncStatus(in Account account, String authority, in ComponentName cname);
/**
* Return true if the pending status is true of any matching authorities.
+ * @param account account for authority, must be null if cname is non-null.
+ * @param providerName name of provider, must be null if cname is non-null.
+ * @param cname component to identify sync service, must be null if account/providerName are
+ * non-null.
*/
- boolean isSyncPending(in Account account, String authority);
+ boolean isSyncPending(in Account account, String authority, in ComponentName cname);
void addStatusChangeListener(int mask, ISyncStatusObserver callback);
diff --git a/core/java/android/content/ISyncServiceAdapter.aidl b/core/java/android/content/ISyncServiceAdapter.aidl
new file mode 100644
index 0000000..d419307
--- /dev/null
+++ b/core/java/android/content/ISyncServiceAdapter.aidl
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2013 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.content;
+import android.os.Bundle;
+import android.content.ISyncContext;
+
+/**
+ * Interface to define an anonymous service that is extended by developers
+ * in order to perform anonymous syncs (syncs without an Account or Content
+ * Provider specified). See {@link android.content.AbstractThreadedSyncAdapter}.
+ * {@hide}
+ */
+oneway interface ISyncServiceAdapter {
+
+ /**
+ * Initiate a sync. SyncAdapter-specific parameters may be specified in
+ * extras, which is guaranteed to not be null.
+ *
+ * @param syncContext the ISyncContext used to indicate the progress of the sync. When
+ * the sync is finished (successfully or not) ISyncContext.onFinished() must be called.
+ * @param extras SyncAdapter-specific parameters.
+ *
+ */
+ void startSync(ISyncContext syncContext, in Bundle extras);
+
+ /**
+ * Cancel the currently ongoing sync.
+ */
+ void cancelSync(ISyncContext syncContext);
+
+}
diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java
index a289649..85b3141 100644
--- a/core/java/android/content/Intent.java
+++ b/core/java/android/content/Intent.java
@@ -21,6 +21,7 @@ import android.util.ArraySet;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
+import android.annotation.IntDef;
import android.annotation.SdkConstant;
import android.annotation.SdkConstant.SdkConstantType;
import android.content.pm.ActivityInfo;
@@ -45,6 +46,8 @@ import com.android.internal.util.XmlUtils;
import java.io.IOException;
import java.io.Serializable;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.List;
@@ -3335,6 +3338,12 @@ public class Intent implements Parcelable, Cloneable {
// ---------------------------------------------------------------------
// Intent flags (see mFlags variable).
+ /** @hide */
+ @IntDef(flag = true,
+ value = {FLAG_GRANT_READ_URI_PERMISSION, FLAG_GRANT_WRITE_URI_PERMISSION})
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface GrantUriMode {}
+
/**
* If set, the recipient of this Intent will be granted permission to
* perform read operations on the URI in the Intent's data and any URIs
@@ -6374,6 +6383,21 @@ public class Intent implements Parcelable, Cloneable {
}
}
+ /** @hide */
+ @IntDef(flag = true,
+ value = {
+ FILL_IN_ACTION,
+ FILL_IN_DATA,
+ FILL_IN_CATEGORIES,
+ FILL_IN_COMPONENT,
+ FILL_IN_PACKAGE,
+ FILL_IN_SOURCE_BOUNDS,
+ FILL_IN_SELECTOR,
+ FILL_IN_CLIP_DATA
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface FillInFlags {}
+
/**
* Use with {@link #fillIn} to allow the current action value to be
* overwritten, even if it is already set.
@@ -6467,10 +6491,12 @@ public class Intent implements Parcelable, Cloneable {
*
* @return Returns a bit mask of {@link #FILL_IN_ACTION},
* {@link #FILL_IN_DATA}, {@link #FILL_IN_CATEGORIES}, {@link #FILL_IN_PACKAGE},
- * {@link #FILL_IN_COMPONENT}, {@link #FILL_IN_SOURCE_BOUNDS}, and
- * {@link #FILL_IN_SELECTOR} indicating which fields were changed.
+ * {@link #FILL_IN_COMPONENT}, {@link #FILL_IN_SOURCE_BOUNDS},
+ * {@link #FILL_IN_SELECTOR} and {@link #FILL_IN_CLIP_DATA indicating which fields were
+ * changed.
*/
- public int fillIn(Intent other, int flags) {
+ @FillInFlags
+ public int fillIn(Intent other, @FillInFlags int flags) {
int changes = 0;
if (other.mAction != null
&& (mAction == null || (flags&FILL_IN_ACTION) != 0)) {
diff --git a/core/java/android/content/Loader.java b/core/java/android/content/Loader.java
index 911e49c..f3828b0 100644
--- a/core/java/android/content/Loader.java
+++ b/core/java/android/content/Loader.java
@@ -413,7 +413,7 @@ public class Loader<D> {
* {@link #onReset()} happens. You can retrieve the current abandoned
* state with {@link #isAbandoned}.
*/
- protected void onAbandon() {
+ protected void onAbandon() {
}
/**
diff --git a/core/java/android/content/PeriodicSync.java b/core/java/android/content/PeriodicSync.java
index b586eec..836c6f8 100644
--- a/core/java/android/content/PeriodicSync.java
+++ b/core/java/android/content/PeriodicSync.java
@@ -29,13 +29,17 @@ public class PeriodicSync implements Parcelable {
public final Account account;
/** The authority of the sync. Can be null. */
public final String authority;
+ /** The service for syncing, if this is an anonymous sync. Can be null.*/
+ public final ComponentName service;
/** Any extras that parameters that are to be passed to the sync adapter. */
public final Bundle extras;
/** How frequently the sync should be scheduled, in seconds. Kept around for API purposes. */
public final long period;
+ /** Whether this periodic sync runs on a {@link SyncService}. */
+ public final boolean isService;
/**
- * {@hide}
* How much flexibility can be taken in scheduling the sync, in seconds.
+ * {@hide}
*/
public final long flexTime;
@@ -48,44 +52,74 @@ public class PeriodicSync implements Parcelable {
public PeriodicSync(Account account, String authority, Bundle extras, long periodInSeconds) {
this.account = account;
this.authority = authority;
+ this.service = null;
+ this.isService = false;
if (extras == null) {
this.extras = new Bundle();
} else {
this.extras = new Bundle(extras);
}
this.period = periodInSeconds;
- // Initialise to a sane value.
+ // Old API uses default flex time. No-one should be using this ctor anyway.
this.flexTime = 0L;
}
/**
- * {@hide}
* Create a copy of a periodic sync.
+ * {@hide}
*/
public PeriodicSync(PeriodicSync other) {
this.account = other.account;
this.authority = other.authority;
+ this.service = other.service;
+ this.isService = other.isService;
this.extras = new Bundle(other.extras);
this.period = other.period;
this.flexTime = other.flexTime;
}
/**
- * {@hide}
* A PeriodicSync for a sync with a specified provider.
+ * {@hide}
*/
public PeriodicSync(Account account, String authority, Bundle extras,
long period, long flexTime) {
this.account = account;
this.authority = authority;
+ this.service = null;
+ this.isService = false;
+ this.extras = new Bundle(extras);
+ this.period = period;
+ this.flexTime = flexTime;
+ }
+
+ /**
+ * A PeriodicSync for a sync with a specified SyncService.
+ * {@hide}
+ */
+ public PeriodicSync(ComponentName service, Bundle extras,
+ long period,
+ long flexTime) {
+ this.account = null;
+ this.authority = null;
+ this.service = service;
+ this.isService = true;
this.extras = new Bundle(extras);
this.period = period;
this.flexTime = flexTime;
}
private PeriodicSync(Parcel in) {
- this.account = in.readParcelable(null);
- this.authority = in.readString();
+ this.isService = (in.readInt() != 0);
+ if (this.isService) {
+ this.service = in.readParcelable(null);
+ this.account = null;
+ this.authority = null;
+ } else {
+ this.account = in.readParcelable(null);
+ this.authority = in.readString();
+ this.service = null;
+ }
this.extras = in.readBundle();
this.period = in.readLong();
this.flexTime = in.readLong();
@@ -98,8 +132,13 @@ public class PeriodicSync implements Parcelable {
@Override
public void writeToParcel(Parcel dest, int flags) {
- dest.writeParcelable(account, flags);
- dest.writeString(authority);
+ dest.writeInt(isService ? 1 : 0);
+ if (account == null && authority == null) {
+ dest.writeParcelable(service, flags);
+ } else {
+ dest.writeParcelable(account, flags);
+ dest.writeString(authority);
+ }
dest.writeBundle(extras);
dest.writeLong(period);
dest.writeLong(flexTime);
@@ -126,14 +165,24 @@ public class PeriodicSync implements Parcelable {
return false;
}
final PeriodicSync other = (PeriodicSync) o;
- return account.equals(other.account)
- && authority.equals(other.authority)
+ if (this.isService != other.isService) {
+ return false;
+ }
+ boolean equal = false;
+ if (this.isService) {
+ equal = service.equals(other.service);
+ } else {
+ equal = account.equals(other.account)
+ && authority.equals(other.authority);
+ }
+ return equal
&& period == other.period
&& syncExtrasEquals(extras, other.extras);
}
/**
- * Periodic sync extra comparison function.
+ * Periodic sync extra comparison function. Duplicated from
+ * {@link com.android.server.content.SyncManager#syncExtrasEquals(Bundle b1, Bundle b2)}
* {@hide}
*/
public static boolean syncExtrasEquals(Bundle b1, Bundle b2) {
@@ -158,6 +207,7 @@ public class PeriodicSync implements Parcelable {
public String toString() {
return "account: " + account +
", authority: " + authority +
+ ", service: " + service +
". period: " + period + "s " +
", flex: " + flexTime;
}
diff --git a/core/java/android/content/SyncInfo.java b/core/java/android/content/SyncInfo.java
index 0284882..61b11c2 100644
--- a/core/java/android/content/SyncInfo.java
+++ b/core/java/android/content/SyncInfo.java
@@ -17,6 +17,7 @@
package android.content;
import android.accounts.Account;
+import android.content.pm.RegisteredServicesCache;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.Parcelable.Creator;
@@ -29,16 +30,24 @@ public class SyncInfo implements Parcelable {
public final int authorityId;
/**
- * The {@link Account} that is currently being synced.
+ * The {@link Account} that is currently being synced. Will be null if this sync is running via
+ * a {@link SyncService}.
*/
public final Account account;
/**
- * The authority of the provider that is currently being synced.
+ * The authority of the provider that is currently being synced. Will be null if this sync
+ * is running via a {@link SyncService}.
*/
public final String authority;
/**
+ * The {@link SyncService} that is targeted by this operation. Null if this sync is running via
+ * a {@link AbstractThreadedSyncAdapter}.
+ */
+ public final ComponentName service;
+
+ /**
* The start time of the current sync operation in milliseconds since boot.
* This is represented in elapsed real time.
* See {@link android.os.SystemClock#elapsedRealtime()}.
@@ -46,12 +55,13 @@ public class SyncInfo implements Parcelable {
public final long startTime;
/** @hide */
- public SyncInfo(int authorityId, Account account, String authority,
+ public SyncInfo(int authorityId, Account account, String authority, ComponentName service,
long startTime) {
this.authorityId = authorityId;
this.account = account;
this.authority = authority;
this.startTime = startTime;
+ this.service = service;
}
/** @hide */
@@ -62,17 +72,20 @@ public class SyncInfo implements Parcelable {
/** @hide */
public void writeToParcel(Parcel parcel, int flags) {
parcel.writeInt(authorityId);
- account.writeToParcel(parcel, 0);
+ parcel.writeParcelable(account, flags);
parcel.writeString(authority);
parcel.writeLong(startTime);
+ parcel.writeParcelable(service, flags);
+
}
/** @hide */
SyncInfo(Parcel parcel) {
authorityId = parcel.readInt();
- account = new Account(parcel);
+ account = parcel.readParcelable(Account.class.getClassLoader());
authority = parcel.readString();
startTime = parcel.readLong();
+ service = parcel.readParcelable(ComponentName.class.getClassLoader());
}
/** @hide */
diff --git a/core/java/android/content/SyncRequest.java b/core/java/android/content/SyncRequest.java
index 6ca283d..9894aad 100644
--- a/core/java/android/content/SyncRequest.java
+++ b/core/java/android/content/SyncRequest.java
@@ -20,18 +20,19 @@ import android.accounts.Account;
import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;
+import android.util.Pair;
public class SyncRequest implements Parcelable {
private static final String TAG = "SyncRequest";
- /** Account to pass to the sync adapter. May be null. */
+ /** Account to pass to the sync adapter. Can be null. */
private final Account mAccountToSync;
/** Authority string that corresponds to a ContentProvider. */
private final String mAuthority;
- /** Sync service identifier. May be null.*/
+ /** {@link SyncService} identifier. */
private final ComponentName mComponentInfo;
/** Bundle containing user info as well as sync settings. */
private final Bundle mExtras;
- /** Disallow this sync request on metered networks. */
+ /** Don't allow this sync request on metered networks. */
private final boolean mDisallowMetered;
/**
* Anticipated upload size in bytes.
@@ -69,18 +70,14 @@ public class SyncRequest implements Parcelable {
return mIsPeriodic;
}
- /**
- * {@hide}
- * @return whether this is an expedited sync.
- */
public boolean isExpedited() {
return mIsExpedited;
}
/**
* {@hide}
- * @return true if this sync uses an account/authority pair, or false if this sync is bound to
- * a Sync Service.
+ * @return true if this sync uses an account/authority pair, or false if
+ * this is an anonymous sync bound to an @link AnonymousSyncService.
*/
public boolean hasAuthority() {
return mIsAuthority;
@@ -88,34 +85,51 @@ public class SyncRequest implements Parcelable {
/**
* {@hide}
+ *
* @return account object for this sync.
- * @throws IllegalArgumentException if this function is called for a request that does not
- * specify an account/provider authority.
+ * @throws IllegalArgumentException if this function is called for a request that targets a
+ * sync service.
*/
public Account getAccount() {
if (!hasAuthority()) {
- throw new IllegalArgumentException("Cannot getAccount() for a sync that does not"
- + "specify an authority.");
+ throw new IllegalArgumentException("Cannot getAccount() for a sync that targets a sync"
+ + "service.");
}
return mAccountToSync;
}
/**
* {@hide}
+ *
* @return provider for this sync.
- * @throws IllegalArgumentException if this function is called for a request that does not
- * specify an account/provider authority.
+ * @throws IllegalArgumentException if this function is called for a request that targets a
+ * sync service.
*/
public String getProvider() {
if (!hasAuthority()) {
- throw new IllegalArgumentException("Cannot getProvider() for a sync that does not"
- + "specify a provider.");
+ throw new IllegalArgumentException("Cannot getProvider() for a sync that targets a"
+ + "sync service.");
}
return mAuthority;
}
/**
* {@hide}
+ * Throws a runtime IllegalArgumentException if this function is called for a
+ * SyncRequest that is bound to an account/provider.
+ *
+ * @return ComponentName for the service that this sync will bind to.
+ */
+ public ComponentName getService() {
+ if (hasAuthority()) {
+ throw new IllegalArgumentException(
+ "Cannot getAnonymousService() for a sync that has specified a provider.");
+ }
+ return mComponentInfo;
+ }
+
+ /**
+ * {@hide}
* Retrieve bundle for this SyncRequest. Will not be null.
*/
public Bundle getBundle() {
@@ -129,7 +143,6 @@ public class SyncRequest implements Parcelable {
public long getSyncFlexTime() {
return mSyncFlexTimeSecs;
}
-
/**
* {@hide}
* @return the last point in time at which this sync must scheduled.
@@ -216,7 +229,7 @@ public class SyncRequest implements Parcelable {
}
/**
- * Builder class for a {@link SyncRequest}. As you build your SyncRequest this class will also
+ * Builder class for a @link SyncRequest. As you build your SyncRequest this class will also
* perform validation.
*/
public static class Builder {
@@ -232,9 +245,12 @@ public class SyncRequest implements Parcelable {
private static final int SYNC_TARGET_SERVICE = 1;
/** Specify that this is a sync with a provider. */
private static final int SYNC_TARGET_ADAPTER = 2;
- /** Earliest point of displacement into the future at which this sync can occur. */
+ /**
+ * Earliest point of displacement into the future at which this sync can
+ * occur.
+ */
private long mSyncFlexTimeSecs;
- /** Latest point of displacement into the future at which this sync must occur. */
+ /** Displacement into the future at which this sync must occur. */
private long mSyncRunTimeSecs;
/**
* Sync configuration information - custom user data explicitly provided by the developer.
@@ -283,8 +299,9 @@ public class SyncRequest implements Parcelable {
private boolean mExpedited;
/**
- * The sync component that contains the sync logic if this is a provider-less sync,
- * otherwise null.
+ * The {@link SyncService} component that
+ * contains the sync logic if this is a provider-less sync, otherwise
+ * null.
*/
private ComponentName mComponentName;
/**
@@ -320,11 +337,15 @@ public class SyncRequest implements Parcelable {
/**
* Build a periodic sync. Either this or syncOnce() <b>must</b> be called for this builder.
- * Syncs are identified by target {@link android.provider}/{@link android.accounts.Account}
- * and by the contents of the extras bundle.
- * You cannot reuse the same builder for one-time syncs (by calling this function) after
- * having specified a periodic sync. If you do, an <code>IllegalArgumentException</code>
+ * Syncs are identified by target {@link SyncService}/{@link android.provider} and by the
+ * contents of the extras bundle.
+ * You cannot reuse the same builder for one-time syncs after having specified a periodic
+ * sync (by calling this function). If you do, an <code>IllegalArgumentException</code>
* will be thrown.
+ * <p>The bundle for a periodic sync can be queried by applications with the correct
+ * permissions using
+ * {@link ContentResolver#getPeriodicSyncs(Account account, String provider)}, so no
+ * sensitive data should be transferred here.
*
* Example usage.
*
@@ -375,7 +396,6 @@ public class SyncRequest implements Parcelable {
}
/**
- * {@hide}
* Developer can provide insight into their payload size; optional. -1 specifies unknown,
* so that you are not restricted to defining both fields.
*
@@ -389,20 +409,28 @@ public class SyncRequest implements Parcelable {
}
/**
- * @see android.net.ConnectivityManager#isActiveNetworkMetered()
- * @param disallow true to enforce that this transfer not occur on metered networks.
- * Default false.
+ * Will throw an <code>IllegalArgumentException</code> if called and
+ * {@link #setIgnoreSettings(boolean ignoreSettings)} has already been called.
+ * @param disallow true to allow this transfer on metered networks. Default false.
+ *
*/
public Builder setDisallowMetered(boolean disallow) {
+ if (mIgnoreSettings && disallow) {
+ throw new IllegalArgumentException("setDisallowMetered(true) after having"
+ + "specified that settings are ignored.");
+ }
mDisallowMetered = disallow;
return this;
}
/**
- * Specify an authority and account for this transfer.
+ * Specify an authority and account for this transfer. Cannot be used with
+ * {@link #setSyncAdapter(ComponentName cname)}.
*
- * @param authority String identifying which content provider to sync.
- * @param account Account to sync. Can be null unless this is a periodic sync.
+ * @param authority
+ * @param account Account to sync. Can be null unless this is a periodic
+ * sync, for which verification by the ContentResolver will
+ * fail. If a sync is performed without an account, the
*/
public Builder setSyncAdapter(Account account, String authority) {
if (mSyncTarget != SYNC_TARGET_UNKNOWN) {
@@ -419,10 +447,26 @@ public class SyncRequest implements Parcelable {
}
/**
- * Optional developer-provided extras handed back in
- * {@link AbstractThreadedSyncAdapter#onPerformSync(Account, Bundle, String,
- * ContentProviderClient, SyncResult)} occurs. This bundle is copied into the SyncRequest
- * returned by {@link #build()}.
+ * Specify the {@link SyncService} component for this sync. This is not validated until
+ * sync time so providing an incorrect component name here will not fail. Cannot be used
+ * with {@link #setSyncAdapter(Account account, String authority)}.
+ *
+ * @param cname ComponentName to identify your Anonymous service
+ */
+ public Builder setSyncAdapter(ComponentName cname) {
+ if (mSyncTarget != SYNC_TARGET_UNKNOWN) {
+ throw new IllegalArgumentException("Sync target has already been defined.");
+ }
+ mSyncTarget = SYNC_TARGET_SERVICE;
+ mComponentName = cname;
+ mAccount = null;
+ mAuthority = null;
+ return this;
+ }
+
+ /**
+ * Developer-provided extras handed back when sync actually occurs. This bundle is copied
+ * into the SyncRequest returned by {@link #build()}.
*
* Example:
* <pre>
@@ -436,7 +480,7 @@ public class SyncRequest implements Parcelable {
* Bundle extras = new Bundle();
* extras.setString("data", syncData);
* builder.setExtras(extras);
- * ContentResolver.sync(builder.build()); // Each sync() request is for a unique sync.
+ * ContentResolver.sync(builder.build()); // Each sync() request creates a unique sync.
* }
* </pre>
* Only values of the following types may be used in the extras bundle:
@@ -477,13 +521,19 @@ public class SyncRequest implements Parcelable {
/**
* Convenience function for setting {@link ContentResolver#SYNC_EXTRAS_IGNORE_SETTINGS}.
*
- * A sync can specify that system sync settings be ignored (user has turned sync off). Not
- * valid for periodic sync and will throw an <code>IllegalArgumentException</code> in
+ * Not valid for periodic sync and will throw an <code>IllegalArgumentException</code> in
* {@link #build()}.
+ * <p>Throws <code>IllegalArgumentException</code> if called and
+ * {@link #setDisallowMetered(boolean)} has been set.
+ *
*
* @param ignoreSettings true to ignore the sync automatically settings. Default false.
*/
public Builder setIgnoreSettings(boolean ignoreSettings) {
+ if (mDisallowMetered && ignoreSettings) {
+ throw new IllegalArgumentException("setIgnoreSettings(true) after having specified"
+ + " sync settings with this builder.");
+ }
mIgnoreSettings = ignoreSettings;
return this;
}
@@ -491,13 +541,13 @@ public class SyncRequest implements Parcelable {
/**
* Convenience function for setting {@link ContentResolver#SYNC_EXTRAS_IGNORE_BACKOFF}.
*
- * Force the sync scheduling process to ignore any back-off that was the result of a failed
- * sync, as well as to invalidate any {@link SyncResult#delayUntil} value that may have
- * been set by the adapter. Successive failures will not honor this flag. Not valid for
- * periodic sync and will throw an <code>IllegalArgumentException</code> in
- * {@link #build()}.
+ * Ignoring back-off will force the sync scheduling process to ignore any back-off that was
+ * the result of a failed sync, as well as to invalidate any {@link SyncResult#delayUntil}
+ * value that may have been set by the adapter. Successive failures will not honor this
+ * flag. Not valid for periodic sync and will throw an <code>IllegalArgumentException</code>
+ * in {@link #build()}.
*
- * @param ignoreBackoff ignore back-off settings. Default false.
+ * @param ignoreBackoff ignore back off settings. Default false.
*/
public Builder setIgnoreBackoff(boolean ignoreBackoff) {
mIgnoreBackoff = ignoreBackoff;
@@ -507,9 +557,8 @@ public class SyncRequest implements Parcelable {
/**
* Convenience function for setting {@link ContentResolver#SYNC_EXTRAS_MANUAL}.
*
- * A manual sync is functionally equivalent to calling {@link #setIgnoreBackoff(boolean)}
- * and {@link #setIgnoreSettings(boolean)}. Not valid for periodic sync and will throw an
- * <code>IllegalArgumentException</code> in {@link #build()}.
+ * Not valid for periodic sync and will throw an <code>IllegalArgumentException</code> in
+ * {@link #build()}.
*
* @param isManual User-initiated sync or not. Default false.
*/
@@ -519,7 +568,7 @@ public class SyncRequest implements Parcelable {
}
/**
- * An expedited sync runs immediately and will preempt another non-expedited running sync.
+ * An expedited sync runs immediately and can preempt other non-expedited running syncs.
*
* Not valid for periodic sync and will throw an <code>IllegalArgumentException</code> in
* {@link #build()}.
@@ -532,7 +581,6 @@ public class SyncRequest implements Parcelable {
}
/**
- * {@hide}
* @param priority the priority of this request among all requests from the calling app.
* Range of [-2,2] similar to how this is done with notifications.
*/
@@ -552,11 +600,11 @@ public class SyncRequest implements Parcelable {
* builder.
*/
public SyncRequest build() {
+ // Validate the extras bundle
+ ContentResolver.validateSyncExtrasBundle(mCustomExtras);
if (mCustomExtras == null) {
mCustomExtras = new Bundle();
}
- // Validate the extras bundle
- ContentResolver.validateSyncExtrasBundle(mCustomExtras);
// Combine builder extra flags into the config bundle.
mSyncConfigExtras = new Bundle();
if (mIgnoreBackoff) {
@@ -575,51 +623,33 @@ public class SyncRequest implements Parcelable {
mSyncConfigExtras.putBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, true);
}
if (mIsManual) {
- mSyncConfigExtras.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, true);
+ mSyncConfigExtras.putBoolean(ContentResolver.SYNC_EXTRAS_IGNORE_BACKOFF, true);
+ mSyncConfigExtras.putBoolean(ContentResolver.SYNC_EXTRAS_IGNORE_SETTINGS, true);
}
mSyncConfigExtras.putLong(ContentResolver.SYNC_EXTRAS_EXPECTED_UPLOAD, mTxBytes);
mSyncConfigExtras.putLong(ContentResolver.SYNC_EXTRAS_EXPECTED_DOWNLOAD, mRxBytes);
mSyncConfigExtras.putInt(ContentResolver.SYNC_EXTRAS_PRIORITY, mPriority);
if (mSyncType == SYNC_TYPE_PERIODIC) {
// If this is a periodic sync ensure than invalid extras were not set.
- validatePeriodicExtras(mCustomExtras);
- validatePeriodicExtras(mSyncConfigExtras);
- // Verify that account and provider are not null.
- if (mAccount == null) {
- throw new IllegalArgumentException("Account must not be null for periodic"
- + " sync.");
- }
- if (mAuthority == null) {
- throw new IllegalArgumentException("Authority must not be null for periodic"
- + " sync.");
+ if (ContentResolver.invalidPeriodicExtras(mCustomExtras) ||
+ ContentResolver.invalidPeriodicExtras(mSyncConfigExtras)) {
+ throw new IllegalArgumentException("Illegal extras were set");
}
} else if (mSyncType == SYNC_TYPE_UNKNOWN) {
throw new IllegalArgumentException("Must call either syncOnce() or syncPeriodic()");
}
+ if (mSyncTarget == SYNC_TARGET_SERVICE) {
+ if (mSyncConfigExtras.getBoolean(ContentResolver.SYNC_EXTRAS_INITIALIZE, false)) {
+ throw new IllegalArgumentException("Cannot specify an initialisation sync"
+ + " that targets a service.");
+ }
+ }
// Ensure that a target for the sync has been set.
if (mSyncTarget == SYNC_TARGET_UNKNOWN) {
- throw new IllegalArgumentException("Must specify an adapter with "
- + "setSyncAdapter(Account, String");
+ throw new IllegalArgumentException("Must specify an adapter with one of"
+ + "setSyncAdapter(ComponentName) or setSyncAdapter(Account, String");
}
return new SyncRequest(this);
}
-
- /**
- * Helper function to throw an <code>IllegalArgumentException</code> if any illegal
- * extras were set for a periodic sync.
- *
- * @param extras bundle to validate.
- */
- private void validatePeriodicExtras(Bundle extras) {
- if (extras.getBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, false)
- || extras.getBoolean(ContentResolver.SYNC_EXTRAS_DO_NOT_RETRY, false)
- || extras.getBoolean(ContentResolver.SYNC_EXTRAS_IGNORE_BACKOFF, false)
- || extras.getBoolean(ContentResolver.SYNC_EXTRAS_IGNORE_SETTINGS, false)
- || extras.getBoolean(ContentResolver.SYNC_EXTRAS_INITIALIZE, false)
- || extras.getBoolean(ContentResolver.SYNC_EXTRAS_FORCE, false)
- || extras.getBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, false)) {
- throw new IllegalArgumentException("Illegal extras were set");
- }
- }
- }
+ }
}
diff --git a/core/java/android/content/SyncService.java b/core/java/android/content/SyncService.java
new file mode 100644
index 0000000..d6fc87f
--- /dev/null
+++ b/core/java/android/content/SyncService.java
@@ -0,0 +1,212 @@
+/*
+ * Copyright (C) 2013 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.content;
+
+import android.app.Service;
+import android.os.Bundle;
+import android.os.IBinder;
+import android.os.Process;
+import android.os.Trace;
+import android.util.ArrayMap;
+import android.util.SparseArray;
+import android.util.Log;
+
+import com.android.internal.annotations.GuardedBy;
+
+/**
+ * Simplified @link android.content.AbstractThreadedSyncAdapter. Folds that
+ * behaviour into a service to which the system can bind when requesting an
+ * anonymous (providerless/accountless) sync.
+ * <p>
+ * In order to perform an anonymous sync operation you must extend this service, implementing the
+ * abstract methods. This service must be declared in the application's manifest as usual. You
+ * can use this service for other work, however you <b> must not </b> override the onBind() method
+ * unless you know what you're doing, which limits the usefulness of this service for other work.
+ * <p>A {@link SyncService} can either be active or inactive. Different to an
+ * {@link AbstractThreadedSyncAdapter}, there is no
+ * {@link ContentResolver#setSyncAutomatically(android.accounts.Account account, String provider, boolean sync)},
+ * as well as no concept of initialisation (you can handle your own if needed).
+ *
+ * <pre>
+ * &lt;service android:name=".MySyncService"/&gt;
+ * </pre>
+ * Like @link android.content.AbstractThreadedSyncAdapter this service supports
+ * multiple syncs at the same time. Each incoming startSync() with a unique tag
+ * will spawn a thread to do the work of that sync. If startSync() is called
+ * with a tag that already exists, a SyncResult.ALREADY_IN_PROGRESS is returned.
+ * Remember that your service will spawn multiple threads if you schedule multiple syncs
+ * at once, so if you mutate local objects you must ensure synchronization.
+ */
+public abstract class SyncService extends Service {
+ private static final String TAG = "SyncService";
+
+ private final SyncAdapterImpl mSyncAdapter = new SyncAdapterImpl();
+
+ /** Keep track of on-going syncs, keyed by bundle. */
+ @GuardedBy("mSyncThreadLock")
+ private final SparseArray<SyncThread>
+ mSyncThreads = new SparseArray<SyncThread>();
+ /** Lock object for accessing the SyncThreads HashMap. */
+ private final Object mSyncThreadLock = new Object();
+ /**
+ * Default key for if this sync service does not support parallel operations. Currently not
+ * sure if null keys will make it into the ArrayMap for KLP, so keeping our default for now.
+ */
+ private static final int KEY_DEFAULT = 0;
+ /** Identifier for this sync service. */
+ private ComponentName mServiceComponent;
+
+ /** {@hide} */
+ public IBinder onBind(Intent intent) {
+ mServiceComponent = new ComponentName(this, getClass());
+ return mSyncAdapter.asBinder();
+ }
+
+ /** {@hide} */
+ private class SyncAdapterImpl extends ISyncServiceAdapter.Stub {
+ @Override
+ public void startSync(ISyncContext syncContext, Bundle extras) {
+ // Wrap the provided Sync Context because it may go away by the time
+ // we call it.
+ final SyncContext syncContextClient = new SyncContext(syncContext);
+ boolean alreadyInProgress = false;
+ final int extrasAsKey = extrasToKey(extras);
+ synchronized (mSyncThreadLock) {
+ if (mSyncThreads.get(extrasAsKey) == null) {
+ if (Log.isLoggable(TAG, Log.VERBOSE)) {
+ Log.v(TAG, "starting sync for : " + mServiceComponent);
+ }
+ // Start sync.
+ SyncThread syncThread = new SyncThread(syncContextClient, extras);
+ mSyncThreads.put(extrasAsKey, syncThread);
+ syncThread.start();
+ } else {
+ // Don't want to call back to SyncManager while still
+ // holding lock.
+ alreadyInProgress = true;
+ }
+ }
+ if (alreadyInProgress) {
+ syncContextClient.onFinished(SyncResult.ALREADY_IN_PROGRESS);
+ }
+ }
+
+ /**
+ * Used by the SM to cancel a specific sync using the
+ * com.android.server.content.SyncManager.ActiveSyncContext as a handle.
+ */
+ @Override
+ public void cancelSync(ISyncContext syncContext) {
+ SyncThread runningSync = null;
+ synchronized (mSyncThreadLock) {
+ for (int i = 0; i < mSyncThreads.size(); i++) {
+ SyncThread thread = mSyncThreads.valueAt(i);
+ if (thread.mSyncContext.getSyncContextBinder() == syncContext.asBinder()) {
+ runningSync = thread;
+ break;
+ }
+ }
+ }
+ if (runningSync != null) {
+ runningSync.interrupt();
+ }
+ }
+ }
+
+ /**
+ *
+ * @param extras Bundle for which to compute hash
+ * @return an integer hash that is equal to that of another bundle if they both contain the
+ * same key -> value mappings, however, not necessarily in order.
+ * Based on the toString() representation of the value mapped.
+ */
+ private int extrasToKey(Bundle extras) {
+ int hash = KEY_DEFAULT; // Empty bundle, or no parallel operations enabled.
+ if (parallelSyncsEnabled()) {
+ for (String key : extras.keySet()) {
+ String mapping = key + " " + extras.get(key).toString();
+ hash += mapping.hashCode();
+ }
+ }
+ return hash;
+ }
+
+ /**
+ * {@hide}
+ * Similar to {@link android.content.AbstractThreadedSyncAdapter.SyncThread}. However while
+ * the ATSA considers an already in-progress sync to be if the account provided is currently
+ * syncing, this anonymous sync has no notion of account and considers a sync unique if the
+ * provided bundle is different.
+ */
+ private class SyncThread extends Thread {
+ private final SyncContext mSyncContext;
+ private final Bundle mExtras;
+ private final int mThreadsKey;
+
+ public SyncThread(SyncContext syncContext, Bundle extras) {
+ mSyncContext = syncContext;
+ mExtras = extras;
+ mThreadsKey = extrasToKey(extras);
+ }
+
+ @Override
+ public void run() {
+ Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
+
+ Trace.traceBegin(Trace.TRACE_TAG_SYNC_MANAGER, getApplication().getPackageName());
+
+ SyncResult syncResult = new SyncResult();
+ try {
+ if (isCancelled()) return;
+ // Run the sync.
+ SyncService.this.onPerformSync(mExtras, syncResult);
+ } finally {
+ Trace.traceEnd(Trace.TRACE_TAG_SYNC_MANAGER);
+ if (!isCancelled()) {
+ mSyncContext.onFinished(syncResult);
+ }
+ // Synchronize so that the assignment will be seen by other
+ // threads that also synchronize accesses to mSyncThreads.
+ synchronized (mSyncThreadLock) {
+ mSyncThreads.remove(mThreadsKey);
+ }
+ }
+ }
+
+ private boolean isCancelled() {
+ return Thread.currentThread().isInterrupted();
+ }
+ }
+
+ /**
+ * Initiate an anonymous sync using this service. SyncAdapter-specific
+ * parameters may be specified in extras, which is guaranteed to not be
+ * null.
+ */
+ public abstract void onPerformSync(Bundle extras, SyncResult syncResult);
+
+ /**
+ * Override this function to indicated whether you want to support parallel syncs.
+ * <p>If you override and return true multiple threads will be spawned within your Service to
+ * handle each concurrent sync request.
+ *
+ * @return false to indicate that this service does not support parallel operations by default.
+ */
+ protected boolean parallelSyncsEnabled() {
+ return false;
+ }
+}
diff --git a/core/java/android/content/pm/ActivityInfo.java b/core/java/android/content/pm/ActivityInfo.java
index b8ac3bf..40275d8 100644
--- a/core/java/android/content/pm/ActivityInfo.java
+++ b/core/java/android/content/pm/ActivityInfo.java
@@ -16,11 +16,15 @@
package android.content.pm;
+import android.annotation.IntDef;
import android.content.res.Configuration;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.Printer;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
/**
* Information you can retrieve about a particular application
* activity or receiver. This corresponds to information collected
@@ -212,6 +216,28 @@ public class ActivityInfo extends ComponentInfo
*/
public int flags;
+ /** @hide */
+ @IntDef({
+ SCREEN_ORIENTATION_UNSPECIFIED,
+ SCREEN_ORIENTATION_LANDSCAPE,
+ SCREEN_ORIENTATION_PORTRAIT,
+ SCREEN_ORIENTATION_USER,
+ SCREEN_ORIENTATION_BEHIND,
+ SCREEN_ORIENTATION_SENSOR,
+ SCREEN_ORIENTATION_NOSENSOR,
+ SCREEN_ORIENTATION_SENSOR_LANDSCAPE,
+ SCREEN_ORIENTATION_SENSOR_PORTRAIT,
+ SCREEN_ORIENTATION_REVERSE_LANDSCAPE,
+ SCREEN_ORIENTATION_REVERSE_PORTRAIT,
+ SCREEN_ORIENTATION_FULL_SENSOR,
+ SCREEN_ORIENTATION_USER_LANDSCAPE,
+ SCREEN_ORIENTATION_USER_PORTRAIT,
+ SCREEN_ORIENTATION_FULL_USER,
+ SCREEN_ORIENTATION_LOCKED
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface ScreenOrientation {}
+
/**
* Constant corresponding to <code>unspecified</code> in
* the {@link android.R.attr#screenOrientation} attribute.
@@ -323,6 +349,7 @@ public class ActivityInfo extends ComponentInfo
* {@link #SCREEN_ORIENTATION_FULL_USER},
* {@link #SCREEN_ORIENTATION_LOCKED},
*/
+ @ScreenOrientation
public int screenOrientation = SCREEN_ORIENTATION_UNSPECIFIED;
/**
diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java
index c97c2b8..0192a30 100644
--- a/core/java/android/content/pm/PackageManager.java
+++ b/core/java/android/content/pm/PackageManager.java
@@ -16,6 +16,7 @@
package android.content.pm;
+import android.annotation.IntDef;
import android.annotation.SdkConstant;
import android.annotation.SdkConstant.SdkConstantType;
import android.content.ComponentName;
@@ -33,6 +34,8 @@ import android.util.AndroidException;
import android.util.DisplayMetrics;
import java.io.File;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
import java.util.List;
/**
@@ -190,6 +193,11 @@ public abstract class PackageManager {
*/
public static final int MATCH_DEFAULT_ONLY = 0x00010000;
+ /** @hide */
+ @IntDef({PERMISSION_GRANTED, PERMISSION_DENIED})
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface PermissionResult {}
+
/**
* Permission check result: this is returned by {@link #checkPermission}
* if the permission has been granted to the given package.
diff --git a/core/java/android/content/res/ColorStateList.java b/core/java/android/content/res/ColorStateList.java
index bd23db4..431226a 100644
--- a/core/java/android/content/res/ColorStateList.java
+++ b/core/java/android/content/res/ColorStateList.java
@@ -16,6 +16,7 @@
package android.content.res;
+import android.graphics.Color;
import com.android.internal.util.ArrayUtils;
import org.xmlpull.v1.XmlPullParser;
@@ -259,7 +260,17 @@ public class ColorStateList implements Parcelable {
public boolean isStateful() {
return mStateSpecs.length > 1;
}
-
+
+ public boolean isOpaque() {
+ final int n = mColors.length;
+ for (int i = 0; i < n; i++) {
+ if (Color.alpha(mColors[i]) != 0xFF) {
+ return false;
+ }
+ }
+ return true;
+ }
+
/**
* Return the color associated with the given set of {@link android.view.View} states.
*
diff --git a/core/java/android/gesture/GestureOverlayView.java b/core/java/android/gesture/GestureOverlayView.java
index 2d47f28..6e3a00f 100644
--- a/core/java/android/gesture/GestureOverlayView.java
+++ b/core/java/android/gesture/GestureOverlayView.java
@@ -134,11 +134,16 @@ public class GestureOverlayView extends FrameLayout {
this(context, attrs, com.android.internal.R.attr.gestureOverlayViewStyle);
}
- public GestureOverlayView(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
+ public GestureOverlayView(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
+ public GestureOverlayView(
+ Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
- TypedArray a = context.obtainStyledAttributes(attrs,
- R.styleable.GestureOverlayView, defStyle, 0);
+ final TypedArray a = context.obtainStyledAttributes(
+ attrs, R.styleable.GestureOverlayView, defStyleAttr, defStyleRes);
mGestureStrokeWidth = a.getFloat(R.styleable.GestureOverlayView_gestureStrokeWidth,
mGestureStrokeWidth);
diff --git a/core/java/android/hardware/camera2/CaptureResult.java b/core/java/android/hardware/camera2/CaptureResult.java
index dbd0457..e24be9f 100644
--- a/core/java/android/hardware/camera2/CaptureResult.java
+++ b/core/java/android/hardware/camera2/CaptureResult.java
@@ -758,6 +758,8 @@ public final class CaptureResult extends CameraMetadata {
* <p>
* Only available if faceDetectMode == FULL
* </p>
+ *
+ * @hide
*/
public static final Key<int[]> STATISTICS_FACE_IDS =
new Key<int[]>("android.statistics.faceIds", int[].class);
@@ -770,6 +772,8 @@ public final class CaptureResult extends CameraMetadata {
* <p>
* Only available if faceDetectMode == FULL
* </p>
+ *
+ * @hide
*/
public static final Key<int[]> STATISTICS_FACE_LANDMARKS =
new Key<int[]>("android.statistics.faceLandmarks", int[].class);
@@ -782,6 +786,8 @@ public final class CaptureResult extends CameraMetadata {
* <p>
* Only available if faceDetectMode != OFF
* </p>
+ *
+ * @hide
*/
public static final Key<android.graphics.Rect[]> STATISTICS_FACE_RECTANGLES =
new Key<android.graphics.Rect[]>("android.statistics.faceRectangles", android.graphics.Rect[].class);
@@ -795,6 +801,8 @@ public final class CaptureResult extends CameraMetadata {
* Only available if faceDetectMode != OFF. The value should be
* meaningful (for example, setting 100 at all times is illegal).
* </p>
+ *
+ * @hide
*/
public static final Key<byte[]> STATISTICS_FACE_SCORES =
new Key<byte[]>("android.statistics.faceScores", byte[].class);
diff --git a/core/java/android/hardware/camera2/package.html b/core/java/android/hardware/camera2/package.html
index c619984..9f6c2a9 100644
--- a/core/java/android/hardware/camera2/package.html
+++ b/core/java/android/hardware/camera2/package.html
@@ -80,7 +80,5 @@ output streams included in the request. These are produced
asynchronously relative to the output CaptureResult, sometimes
substantially later.</p>
-{@hide}
-
</BODY>
</HTML>
diff --git a/core/java/android/inputmethodservice/ExtractButton.java b/core/java/android/inputmethodservice/ExtractButton.java
index b6b7595..fe63c1e 100644
--- a/core/java/android/inputmethodservice/ExtractButton.java
+++ b/core/java/android/inputmethodservice/ExtractButton.java
@@ -32,8 +32,12 @@ class ExtractButton extends Button {
super(context, attrs, com.android.internal.R.attr.buttonStyle);
}
- public ExtractButton(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
+ public ExtractButton(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
+ public ExtractButton(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
}
/**
diff --git a/core/java/android/inputmethodservice/ExtractEditText.java b/core/java/android/inputmethodservice/ExtractEditText.java
index 23ae21b..48b604c 100644
--- a/core/java/android/inputmethodservice/ExtractEditText.java
+++ b/core/java/android/inputmethodservice/ExtractEditText.java
@@ -38,8 +38,12 @@ public class ExtractEditText extends EditText {
super(context, attrs, com.android.internal.R.attr.editTextStyle);
}
- public ExtractEditText(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
+ public ExtractEditText(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
+ public ExtractEditText(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
}
void setIME(InputMethodService ime) {
diff --git a/core/java/android/inputmethodservice/InputMethodService.java b/core/java/android/inputmethodservice/InputMethodService.java
index 1b7d9ea..81ad28b 100644
--- a/core/java/android/inputmethodservice/InputMethodService.java
+++ b/core/java/android/inputmethodservice/InputMethodService.java
@@ -2322,6 +2322,21 @@ public class InputMethodService extends AbstractInputMethodService {
}
/**
+ * @return The recommended height of the input method window.
+ * An IME author can get the last input method's height as the recommended height
+ * by calling this in
+ * {@link android.inputmethodservice.InputMethodService#onStartInputView(EditorInfo, boolean)}.
+ * If you don't need to use a predefined fixed height, you can avoid the window-resizing of IME
+ * switching by using this value as a visible inset height. It's efficient for the smooth
+ * transition between different IMEs. However, note that this may return 0 (or possibly
+ * unexpectedly low height). You should thus avoid relying on the return value of this method
+ * all the time. Please make sure to use a reasonable height for the IME.
+ */
+ public int getInputMethodWindowRecommendedHeight() {
+ return mImm.getInputMethodWindowVisibleHeight();
+ }
+
+ /**
* Performs a dump of the InputMethodService's internal state. Override
* to add your own information to the dump.
*/
diff --git a/core/java/android/inputmethodservice/KeyboardView.java b/core/java/android/inputmethodservice/KeyboardView.java
index 4916244..af75a0a 100644
--- a/core/java/android/inputmethodservice/KeyboardView.java
+++ b/core/java/android/inputmethodservice/KeyboardView.java
@@ -279,12 +279,15 @@ public class KeyboardView extends View implements View.OnClickListener {
this(context, attrs, com.android.internal.R.attr.keyboardViewStyle);
}
- public KeyboardView(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
+ public KeyboardView(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
+ public KeyboardView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
- TypedArray a =
- context.obtainStyledAttributes(
- attrs, android.R.styleable.KeyboardView, defStyle, 0);
+ TypedArray a = context.obtainStyledAttributes(
+ attrs, android.R.styleable.KeyboardView, defStyleAttr, defStyleRes);
LayoutInflater inflate =
(LayoutInflater) context
diff --git a/core/java/android/net/BaseNetworkStateTracker.java b/core/java/android/net/BaseNetworkStateTracker.java
index 476fefe..804f8ee 100644
--- a/core/java/android/net/BaseNetworkStateTracker.java
+++ b/core/java/android/net/BaseNetworkStateTracker.java
@@ -20,10 +20,10 @@ import android.content.Context;
import android.os.Handler;
import android.os.Messenger;
-import com.android.internal.util.Preconditions;
-
import java.util.concurrent.atomic.AtomicBoolean;
+import com.android.internal.util.Preconditions;
+
/**
* Interface to control and observe state of a specific network, hiding
* network-specific details from {@link ConnectivityManager}. Surfaces events
@@ -108,11 +108,6 @@ public abstract class BaseNetworkStateTracker implements NetworkStateTracker {
}
@Override
- public void captivePortalCheckComplete() {
- // not implemented
- }
-
- @Override
public void captivePortalCheckCompleted(boolean isCaptivePortal) {
// not implemented
}
diff --git a/core/java/android/net/CaptivePortalTracker.java b/core/java/android/net/CaptivePortalTracker.java
index d678f1e..31b207c 100644
--- a/core/java/android/net/CaptivePortalTracker.java
+++ b/core/java/android/net/CaptivePortalTracker.java
@@ -84,13 +84,12 @@ public class CaptivePortalTracker extends StateMachine {
private String mServer;
private String mUrl;
private boolean mIsCaptivePortalCheckEnabled = false;
- private IConnectivityManager mConnService;
- private TelephonyManager mTelephonyManager;
- private WifiManager mWifiManager;
- private Context mContext;
+ private final IConnectivityManager mConnService;
+ private final TelephonyManager mTelephonyManager;
+ private final WifiManager mWifiManager;
+ private final Context mContext;
private NetworkInfo mNetworkInfo;
- private static final int CMD_DETECT_PORTAL = 0;
private static final int CMD_CONNECTIVITY_CHANGE = 1;
private static final int CMD_DELAYED_CAPTIVE_CHECK = 2;
@@ -98,14 +97,15 @@ public class CaptivePortalTracker extends StateMachine {
private static final int DELAYED_CHECK_INTERVAL_MS = 10000;
private int mDelayedCheckToken = 0;
- private State mDefaultState = new DefaultState();
- private State mNoActiveNetworkState = new NoActiveNetworkState();
- private State mActiveNetworkState = new ActiveNetworkState();
- private State mDelayedCaptiveCheckState = new DelayedCaptiveCheckState();
+ private final State mDefaultState = new DefaultState();
+ private final State mNoActiveNetworkState = new NoActiveNetworkState();
+ private final State mActiveNetworkState = new ActiveNetworkState();
+ private final State mDelayedCaptiveCheckState = new DelayedCaptiveCheckState();
private static final String SETUP_WIZARD_PACKAGE = "com.google.android.setupwizard";
private boolean mDeviceProvisioned = false;
- private ProvisioningObserver mProvisioningObserver;
+ @SuppressWarnings("unused")
+ private final ProvisioningObserver mProvisioningObserver;
private CaptivePortalTracker(Context context, IConnectivityManager cs) {
super(TAG);
@@ -174,29 +174,11 @@ public class CaptivePortalTracker extends StateMachine {
return captivePortal;
}
- public void detectCaptivePortal(NetworkInfo info) {
- sendMessage(obtainMessage(CMD_DETECT_PORTAL, info));
- }
-
private class DefaultState extends State {
@Override
public boolean processMessage(Message message) {
- if (DBG) log(getName() + message.toString());
- switch (message.what) {
- case CMD_DETECT_PORTAL:
- NetworkInfo info = (NetworkInfo) message.obj;
- // Checking on a secondary connection is not supported
- // yet
- notifyPortalCheckComplete(info);
- break;
- case CMD_CONNECTIVITY_CHANGE:
- case CMD_DELAYED_CAPTIVE_CHECK:
- break;
- default:
- loge("Ignoring " + message);
- break;
- }
+ loge("Ignoring " + message);
return HANDLED;
}
}
@@ -316,19 +298,6 @@ public class CaptivePortalTracker extends StateMachine {
}
}
- private void notifyPortalCheckComplete(NetworkInfo info) {
- if (info == null) {
- loge("notifyPortalCheckComplete on null");
- return;
- }
- try {
- if (DBG) log("notifyPortalCheckComplete: ni=" + info);
- mConnService.captivePortalCheckComplete(info);
- } catch(RemoteException e) {
- e.printStackTrace();
- }
- }
-
private void notifyPortalCheckCompleted(NetworkInfo info, boolean isCaptivePortal) {
if (info == null) {
loge("notifyPortalCheckComplete on null");
@@ -464,7 +433,6 @@ public class CaptivePortalTracker extends StateMachine {
latencyBroadcast.putExtra(EXTRA_NETWORK_TYPE, mTelephonyManager.getNetworkType());
List<CellInfo> info = mTelephonyManager.getAllCellInfo();
if (info == null) return;
- StringBuffer uniqueCellId = new StringBuffer();
int numRegisteredCellInfo = 0;
for (CellInfo cellInfo : info) {
if (cellInfo.isRegistered()) {
diff --git a/core/java/android/net/ConnectivityManager.java b/core/java/android/net/ConnectivityManager.java
index c78a973..0f8dc7a 100644
--- a/core/java/android/net/ConnectivityManager.java
+++ b/core/java/android/net/ConnectivityManager.java
@@ -1330,24 +1330,6 @@ public class ConnectivityManager {
/**
* Signal that the captive portal check on the indicated network
- * is complete and we can turn the network on for general use.
- *
- * @param info the {@link NetworkInfo} object for the networkType
- * in question.
- *
- * <p>This method requires the call to hold the permission
- * {@link android.Manifest.permission#CONNECTIVITY_INTERNAL}.
- * {@hide}
- */
- public void captivePortalCheckComplete(NetworkInfo info) {
- try {
- mService.captivePortalCheckComplete(info);
- } catch (RemoteException e) {
- }
- }
-
- /**
- * Signal that the captive portal check on the indicated network
* is complete and whether its a captive portal or not.
*
* @param info the {@link NetworkInfo} object for the networkType
diff --git a/core/java/android/net/DummyDataStateTracker.java b/core/java/android/net/DummyDataStateTracker.java
index 51a1191..a5d059e 100644
--- a/core/java/android/net/DummyDataStateTracker.java
+++ b/core/java/android/net/DummyDataStateTracker.java
@@ -117,11 +117,6 @@ public class DummyDataStateTracker extends BaseNetworkStateTracker {
}
@Override
- public void captivePortalCheckComplete() {
- // not implemented
- }
-
- @Override
public void captivePortalCheckCompleted(boolean isCaptivePortal) {
// not implemented
}
diff --git a/core/java/android/net/EthernetDataTracker.java b/core/java/android/net/EthernetDataTracker.java
index 501484c..c7e98c5 100644
--- a/core/java/android/net/EthernetDataTracker.java
+++ b/core/java/android/net/EthernetDataTracker.java
@@ -270,11 +270,6 @@ public class EthernetDataTracker extends BaseNetworkStateTracker {
}
@Override
- public void captivePortalCheckComplete() {
- // not implemented
- }
-
- @Override
public void captivePortalCheckCompleted(boolean isCaptivePortal) {
// not implemented
}
diff --git a/core/java/android/net/IConnectivityManager.aidl b/core/java/android/net/IConnectivityManager.aidl
index c1da2e3..b3217eb 100644
--- a/core/java/android/net/IConnectivityManager.aidl
+++ b/core/java/android/net/IConnectivityManager.aidl
@@ -129,8 +129,6 @@ interface IConnectivityManager
boolean updateLockdownVpn();
- void captivePortalCheckComplete(in NetworkInfo info);
-
void captivePortalCheckCompleted(in NetworkInfo info, boolean isCaptivePortal);
void supplyMessenger(int networkType, in Messenger messenger);
diff --git a/core/java/android/net/MobileDataStateTracker.java b/core/java/android/net/MobileDataStateTracker.java
index c106514..d9c35c0 100644
--- a/core/java/android/net/MobileDataStateTracker.java
+++ b/core/java/android/net/MobileDataStateTracker.java
@@ -460,11 +460,6 @@ public class MobileDataStateTracker extends BaseNetworkStateTracker {
}
@Override
- public void captivePortalCheckComplete() {
- // not implemented
- }
-
- @Override
public void captivePortalCheckCompleted(boolean isCaptivePortal) {
if (mIsCaptivePortal.getAndSet(isCaptivePortal) != isCaptivePortal) {
// Captive portal change enable/disable failing fast
diff --git a/core/java/android/net/NetworkInfo.java b/core/java/android/net/NetworkInfo.java
index 4d2a70d..53b1308 100644
--- a/core/java/android/net/NetworkInfo.java
+++ b/core/java/android/net/NetworkInfo.java
@@ -156,18 +156,20 @@ public class NetworkInfo implements Parcelable {
/** {@hide} */
public NetworkInfo(NetworkInfo source) {
if (source != null) {
- mNetworkType = source.mNetworkType;
- mSubtype = source.mSubtype;
- mTypeName = source.mTypeName;
- mSubtypeName = source.mSubtypeName;
- mState = source.mState;
- mDetailedState = source.mDetailedState;
- mReason = source.mReason;
- mExtraInfo = source.mExtraInfo;
- mIsFailover = source.mIsFailover;
- mIsRoaming = source.mIsRoaming;
- mIsAvailable = source.mIsAvailable;
- mIsConnectedToProvisioningNetwork = source.mIsConnectedToProvisioningNetwork;
+ synchronized (source) {
+ mNetworkType = source.mNetworkType;
+ mSubtype = source.mSubtype;
+ mTypeName = source.mTypeName;
+ mSubtypeName = source.mSubtypeName;
+ mState = source.mState;
+ mDetailedState = source.mDetailedState;
+ mReason = source.mReason;
+ mExtraInfo = source.mExtraInfo;
+ mIsFailover = source.mIsFailover;
+ mIsRoaming = source.mIsRoaming;
+ mIsAvailable = source.mIsAvailable;
+ mIsConnectedToProvisioningNetwork = source.mIsConnectedToProvisioningNetwork;
+ }
}
}
diff --git a/core/java/android/net/NetworkStateTracker.java b/core/java/android/net/NetworkStateTracker.java
index 1ca9255..c49b1d1 100644
--- a/core/java/android/net/NetworkStateTracker.java
+++ b/core/java/android/net/NetworkStateTracker.java
@@ -144,11 +144,6 @@ public interface NetworkStateTracker {
public boolean reconnect();
/**
- * Ready to switch on to the network after captive portal check
- */
- public void captivePortalCheckComplete();
-
- /**
* Captive portal check has completed
*/
public void captivePortalCheckCompleted(boolean isCaptive);
diff --git a/core/java/android/net/SSLCertificateSocketFactory.java b/core/java/android/net/SSLCertificateSocketFactory.java
index b0278d3..12e8791 100644
--- a/core/java/android/net/SSLCertificateSocketFactory.java
+++ b/core/java/android/net/SSLCertificateSocketFactory.java
@@ -135,7 +135,8 @@ public class SSLCertificateSocketFactory extends SSLSocketFactory {
* disabled, using an optional handshake timeout and SSL session cache.
*
* <p class="caution"><b>Warning:</b> Sockets created using this factory
- * are vulnerable to man-in-the-middle attacks!</p>
+ * are vulnerable to man-in-the-middle attacks!</p>. The caller must implement
+ * its own verification.
*
* @param handshakeTimeoutMillis to use for SSL connection handshake, or 0
* for none. The socket timeout is reset to 0 after the handshake.
@@ -223,8 +224,6 @@ public class SSLCertificateSocketFactory extends SSLSocketFactory {
if (mInsecureFactory == null) {
if (mSecure) {
Log.w(TAG, "*** BYPASSING SSL SECURITY CHECKS (socket.relaxsslcheck=yes) ***");
- } else {
- Log.w(TAG, "Bypassing SSL security checks at caller's request");
}
mInsecureFactory = makeSocketFactory(mKeyManagers, INSECURE_TRUST_MANAGER);
}
@@ -431,6 +430,7 @@ public class SSLCertificateSocketFactory extends SSLSocketFactory {
s.setAlpnProtocols(mAlpnProtocols);
s.setHandshakeTimeout(mHandshakeTimeoutMillis);
s.setChannelIdPrivateKey(mChannelIdPrivateKey);
+ s.setHostname(host);
if (mSecure) {
verifyHostname(s, host);
}
diff --git a/core/java/android/net/SSLSessionCache.java b/core/java/android/net/SSLSessionCache.java
index 15421de..65db2c3 100644
--- a/core/java/android/net/SSLSessionCache.java
+++ b/core/java/android/net/SSLSessionCache.java
@@ -19,12 +19,16 @@ package android.net;
import android.content.Context;
import android.util.Log;
+import com.android.org.conscrypt.ClientSessionContext;
import com.android.org.conscrypt.FileClientSessionCache;
import com.android.org.conscrypt.SSLClientSessionCache;
import java.io.File;
import java.io.IOException;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLSessionContext;
+
/**
* File-based cache of established SSL sessions. When re-establishing a
* connection to the same server, using an SSL session cache can save some time,
@@ -38,6 +42,40 @@ public final class SSLSessionCache {
/* package */ final SSLClientSessionCache mSessionCache;
/**
+ * Installs a {@link SSLSessionCache} on a {@link SSLContext}. The cache will
+ * be used on all socket factories created by this context (including factories
+ * created before this call).
+ *
+ * @param cache the cache instance to install, or {@code null} to uninstall any
+ * existing cache.
+ * @param context the context to install it on.
+ * @throws IllegalArgumentException if the context does not support a session
+ * cache.
+ *
+ * @hide candidate for public API
+ */
+ public static void install(SSLSessionCache cache, SSLContext context) {
+ SSLSessionContext clientContext = context.getClientSessionContext();
+ if (clientContext instanceof ClientSessionContext) {
+ ((ClientSessionContext) clientContext).setPersistentCache(
+ cache == null ? null : cache.mSessionCache);
+ } else {
+ throw new IllegalArgumentException("Incompatible SSLContext: " + context);
+ }
+ }
+
+ /**
+ * NOTE: This needs to be Object (and not SSLClientSessionCache) because apps
+ * that build directly against the framework (and not the SDK) might not declare
+ * a dependency on conscrypt. Javac will then has fail while resolving constructors.
+ *
+ * @hide For unit test use only
+ */
+ public SSLSessionCache(Object cache) {
+ mSessionCache = (SSLClientSessionCache) cache;
+ }
+
+ /**
* Create a session cache using the specified directory.
* Individual session entries will be files within the directory.
* Multiple instances for the same directory share data internally.
diff --git a/core/java/android/os/BatteryProperties.java b/core/java/android/os/BatteryProperties.java
index 5df5214..2d67264 100644
--- a/core/java/android/os/BatteryProperties.java
+++ b/core/java/android/os/BatteryProperties.java
@@ -30,8 +30,6 @@ public class BatteryProperties implements Parcelable {
public boolean batteryPresent;
public int batteryLevel;
public int batteryVoltage;
- public int batteryCurrentNow;
- public int batteryChargeCounter;
public int batteryTemperature;
public String batteryTechnology;
@@ -49,8 +47,6 @@ public class BatteryProperties implements Parcelable {
batteryPresent = p.readInt() == 1 ? true : false;
batteryLevel = p.readInt();
batteryVoltage = p.readInt();
- batteryCurrentNow = p.readInt();
- batteryChargeCounter = p.readInt();
batteryTemperature = p.readInt();
batteryTechnology = p.readString();
}
@@ -64,8 +60,6 @@ public class BatteryProperties implements Parcelable {
p.writeInt(batteryPresent ? 1 : 0);
p.writeInt(batteryLevel);
p.writeInt(batteryVoltage);
- p.writeInt(batteryCurrentNow);
- p.writeInt(batteryChargeCounter);
p.writeInt(batteryTemperature);
p.writeString(batteryTechnology);
}
diff --git a/core/java/android/os/BatteryProperty.aidl b/core/java/android/os/BatteryProperty.aidl
new file mode 100644
index 0000000..b3f2ec3
--- /dev/null
+++ b/core/java/android/os/BatteryProperty.aidl
@@ -0,0 +1,19 @@
+/*
+** Copyright 2013, 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.os;
+
+parcelable BatteryProperty;
diff --git a/core/java/android/os/BatteryProperty.java b/core/java/android/os/BatteryProperty.java
new file mode 100644
index 0000000..346f5de
--- /dev/null
+++ b/core/java/android/os/BatteryProperty.java
@@ -0,0 +1,70 @@
+/* Copyright 2013, 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.os;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/**
+ * {@hide}
+ */
+public class BatteryProperty implements Parcelable {
+ /*
+ * Battery property identifiers. These must match the values in
+ * frameworks/native/include/batteryservice/BatteryService.h
+ */
+ public static final int BATTERY_PROP_CHARGE_COUNTER = 1;
+ public static final int BATTERY_PROP_CURRENT_NOW = 2;
+ public static final int BATTERY_PROP_CURRENT_AVG = 3;
+
+ public int valueInt;
+
+ public BatteryProperty() {
+ valueInt = Integer.MIN_VALUE;
+ }
+
+ /*
+ * Parcel read/write code must be kept in sync with
+ * frameworks/native/services/batteryservice/BatteryProperty.cpp
+ */
+
+ private BatteryProperty(Parcel p) {
+ readFromParcel(p);
+ }
+
+ public void readFromParcel(Parcel p) {
+ valueInt = p.readInt();
+ }
+
+ public void writeToParcel(Parcel p, int flags) {
+ p.writeInt(valueInt);
+ }
+
+ public static final Parcelable.Creator<BatteryProperty> CREATOR
+ = new Parcelable.Creator<BatteryProperty>() {
+ public BatteryProperty createFromParcel(Parcel p) {
+ return new BatteryProperty(p);
+ }
+
+ public BatteryProperty[] newArray(int size) {
+ return new BatteryProperty[size];
+ }
+ };
+
+ public int describeContents() {
+ return 0;
+ }
+}
diff --git a/core/java/android/os/IBatteryPropertiesRegistrar.aidl b/core/java/android/os/IBatteryPropertiesRegistrar.aidl
index 376f6c9..fd01802 100644
--- a/core/java/android/os/IBatteryPropertiesRegistrar.aidl
+++ b/core/java/android/os/IBatteryPropertiesRegistrar.aidl
@@ -17,6 +17,7 @@
package android.os;
import android.os.IBatteryPropertiesListener;
+import android.os.BatteryProperty;
/**
* {@hide}
@@ -25,4 +26,5 @@ import android.os.IBatteryPropertiesListener;
interface IBatteryPropertiesRegistrar {
void registerListener(IBatteryPropertiesListener listener);
void unregisterListener(IBatteryPropertiesListener listener);
+ int getProperty(in int id, out BatteryProperty prop);
}
diff --git a/core/java/android/os/MessageQueue.java b/core/java/android/os/MessageQueue.java
index 799de5c..e90a457 100644
--- a/core/java/android/os/MessageQueue.java
+++ b/core/java/android/os/MessageQueue.java
@@ -126,6 +126,14 @@ public final class MessageQueue {
}
Message next() {
+ // Return here if the message loop has already quit and been disposed.
+ // This can happen if the application tries to restart a looper after quit
+ // which is not supported.
+ final int ptr = mPtr;
+ if (ptr == 0) {
+ return null;
+ }
+
int pendingIdleHandlerCount = -1; // -1 only during first iteration
int nextPollTimeoutMillis = 0;
for (;;) {
@@ -133,9 +141,7 @@ public final class MessageQueue {
Binder.flushPendingCommands();
}
- // We can assume mPtr != 0 because the loop is obviously still running.
- // The looper will not call this method after the loop quits.
- nativePollOnce(mPtr, nextPollTimeoutMillis);
+ nativePollOnce(ptr, nextPollTimeoutMillis);
synchronized (this) {
// Try to retrieve the next message. Return if found.
diff --git a/core/java/android/os/ParcelFileDescriptor.java b/core/java/android/os/ParcelFileDescriptor.java
index 5273c20..86dc8b4 100644
--- a/core/java/android/os/ParcelFileDescriptor.java
+++ b/core/java/android/os/ParcelFileDescriptor.java
@@ -872,6 +872,8 @@ public class ParcelFileDescriptor implements Parcelable, Closeable {
*/
@Override
public void writeToParcel(Parcel out, int flags) {
+ // WARNING: This must stay in sync with Parcel::readParcelFileDescriptor()
+ // in frameworks/native/libs/binder/Parcel.cpp
if (mWrapped != null) {
try {
mWrapped.writeToParcel(out, flags);
@@ -897,6 +899,8 @@ public class ParcelFileDescriptor implements Parcelable, Closeable {
= new Parcelable.Creator<ParcelFileDescriptor>() {
@Override
public ParcelFileDescriptor createFromParcel(Parcel in) {
+ // WARNING: This must stay in sync with Parcel::writeParcelFileDescriptor()
+ // in frameworks/native/libs/binder/Parcel.cpp
final FileDescriptor fd = in.readRawFileDescriptor();
FileDescriptor commChannel = null;
if (in.readInt() != 0) {
diff --git a/core/java/android/os/Process.java b/core/java/android/os/Process.java
index 631edd6..057f516 100644
--- a/core/java/android/os/Process.java
+++ b/core/java/android/os/Process.java
@@ -892,19 +892,6 @@ public class Process {
}
/**
- * Set the out-of-memory badness adjustment for a process.
- *
- * @param pid The process identifier to set.
- * @param amt Adjustment value -- linux allows -16 to +15.
- *
- * @return Returns true if the underlying system supports this
- * feature, else false.
- *
- * {@hide}
- */
- public static final native boolean setOomAdj(int pid, int amt);
-
- /**
* Adjust the swappiness level for a process.
*
* @param pid The process identifier to set.
diff --git a/core/java/android/preference/CheckBoxPreference.java b/core/java/android/preference/CheckBoxPreference.java
index 1536760..1ce98b8 100644
--- a/core/java/android/preference/CheckBoxPreference.java
+++ b/core/java/android/preference/CheckBoxPreference.java
@@ -34,11 +34,16 @@ import android.widget.Checkable;
*/
public class CheckBoxPreference extends TwoStatePreference {
- public CheckBoxPreference(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
-
- TypedArray a = context.obtainStyledAttributes(attrs,
- com.android.internal.R.styleable.CheckBoxPreference, defStyle, 0);
+ public CheckBoxPreference(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
+ public CheckBoxPreference(
+ Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+
+ final TypedArray a = context.obtainStyledAttributes(attrs,
+ com.android.internal.R.styleable.CheckBoxPreference, defStyleAttr, defStyleRes);
setSummaryOn(a.getString(com.android.internal.R.styleable.CheckBoxPreference_summaryOn));
setSummaryOff(a.getString(com.android.internal.R.styleable.CheckBoxPreference_summaryOff));
setDisableDependentsState(a.getBoolean(
diff --git a/core/java/android/preference/DialogPreference.java b/core/java/android/preference/DialogPreference.java
index a643c8a..5275bc0 100644
--- a/core/java/android/preference/DialogPreference.java
+++ b/core/java/android/preference/DialogPreference.java
@@ -64,12 +64,13 @@ public abstract class DialogPreference extends Preference implements
/** Which button was clicked. */
private int mWhichButtonClicked;
-
- public DialogPreference(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
-
- TypedArray a = context.obtainStyledAttributes(attrs,
- com.android.internal.R.styleable.DialogPreference, defStyle, 0);
+
+ public DialogPreference(
+ Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+
+ final TypedArray a = context.obtainStyledAttributes(attrs,
+ com.android.internal.R.styleable.DialogPreference, defStyleAttr, defStyleRes);
mDialogTitle = a.getString(com.android.internal.R.styleable.DialogPreference_dialogTitle);
if (mDialogTitle == null) {
// Fallback on the regular title of the preference
@@ -83,13 +84,20 @@ public abstract class DialogPreference extends Preference implements
mDialogLayoutResId = a.getResourceId(com.android.internal.R.styleable.DialogPreference_dialogLayout,
mDialogLayoutResId);
a.recycle();
-
+ }
+
+ public DialogPreference(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
}
public DialogPreference(Context context, AttributeSet attrs) {
this(context, attrs, com.android.internal.R.attr.dialogPreferenceStyle);
}
-
+
+ public DialogPreference(Context context) {
+ this(context, null);
+ }
+
/**
* Sets the title of the dialog. This will be shown on subsequent dialogs.
*
diff --git a/core/java/android/preference/EditTextPreference.java b/core/java/android/preference/EditTextPreference.java
index aa27627..ff37042 100644
--- a/core/java/android/preference/EditTextPreference.java
+++ b/core/java/android/preference/EditTextPreference.java
@@ -49,9 +49,9 @@ public class EditTextPreference extends DialogPreference {
private EditText mEditText;
private String mText;
-
- public EditTextPreference(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
+
+ public EditTextPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
mEditText = new EditText(context, attrs);
@@ -67,6 +67,10 @@ public class EditTextPreference extends DialogPreference {
mEditText.setEnabled(true);
}
+ public EditTextPreference(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
public EditTextPreference(Context context, AttributeSet attrs) {
this(context, attrs, com.android.internal.R.attr.editTextPreferenceStyle);
}
diff --git a/core/java/android/preference/ListPreference.java b/core/java/android/preference/ListPreference.java
index 9edf112..8081a54 100644
--- a/core/java/android/preference/ListPreference.java
+++ b/core/java/android/preference/ListPreference.java
@@ -42,12 +42,12 @@ public class ListPreference extends DialogPreference {
private String mSummary;
private int mClickedDialogEntryIndex;
private boolean mValueSet;
-
- public ListPreference(Context context, AttributeSet attrs) {
- super(context, attrs);
-
- TypedArray a = context.obtainStyledAttributes(attrs,
- com.android.internal.R.styleable.ListPreference, 0, 0);
+
+ public ListPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+
+ TypedArray a = context.obtainStyledAttributes(
+ attrs, com.android.internal.R.styleable.ListPreference, defStyleAttr, defStyleRes);
mEntries = a.getTextArray(com.android.internal.R.styleable.ListPreference_entries);
mEntryValues = a.getTextArray(com.android.internal.R.styleable.ListPreference_entryValues);
a.recycle();
@@ -56,11 +56,19 @@ public class ListPreference extends DialogPreference {
* in the Preference class.
*/
a = context.obtainStyledAttributes(attrs,
- com.android.internal.R.styleable.Preference, 0, 0);
+ com.android.internal.R.styleable.Preference, defStyleAttr, defStyleRes);
mSummary = a.getString(com.android.internal.R.styleable.Preference_summary);
a.recycle();
}
+ public ListPreference(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
+ public ListPreference(Context context, AttributeSet attrs) {
+ this(context, attrs, com.android.internal.R.attr.dialogPreferenceStyle);
+ }
+
public ListPreference(Context context) {
this(context, null);
}
diff --git a/core/java/android/preference/MultiCheckPreference.java b/core/java/android/preference/MultiCheckPreference.java
index 6953075..57c906d 100644
--- a/core/java/android/preference/MultiCheckPreference.java
+++ b/core/java/android/preference/MultiCheckPreference.java
@@ -40,12 +40,13 @@ public class MultiCheckPreference extends DialogPreference {
private boolean[] mSetValues;
private boolean[] mOrigValues;
private String mSummary;
-
- public MultiCheckPreference(Context context, AttributeSet attrs) {
- super(context, attrs);
-
- TypedArray a = context.obtainStyledAttributes(attrs,
- com.android.internal.R.styleable.ListPreference, 0, 0);
+
+ public MultiCheckPreference(
+ Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+
+ TypedArray a = context.obtainStyledAttributes(
+ attrs, com.android.internal.R.styleable.ListPreference, defStyleAttr, defStyleRes);
mEntries = a.getTextArray(com.android.internal.R.styleable.ListPreference_entries);
if (mEntries != null) {
setEntries(mEntries);
@@ -63,6 +64,14 @@ public class MultiCheckPreference extends DialogPreference {
a.recycle();
}
+ public MultiCheckPreference(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
+ public MultiCheckPreference(Context context, AttributeSet attrs) {
+ this(context, attrs, com.android.internal.R.attr.dialogPreferenceStyle);
+ }
+
public MultiCheckPreference(Context context) {
this(context, null);
}
diff --git a/core/java/android/preference/MultiSelectListPreference.java b/core/java/android/preference/MultiSelectListPreference.java
index 553ce80..6c4c20f 100644
--- a/core/java/android/preference/MultiSelectListPreference.java
+++ b/core/java/android/preference/MultiSelectListPreference.java
@@ -44,16 +44,26 @@ public class MultiSelectListPreference extends DialogPreference {
private Set<String> mValues = new HashSet<String>();
private Set<String> mNewValues = new HashSet<String>();
private boolean mPreferenceChanged;
-
- public MultiSelectListPreference(Context context, AttributeSet attrs) {
- super(context, attrs);
-
- TypedArray a = context.obtainStyledAttributes(attrs,
- com.android.internal.R.styleable.MultiSelectListPreference, 0, 0);
+
+ public MultiSelectListPreference(
+ Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+
+ final TypedArray a = context.obtainStyledAttributes(attrs,
+ com.android.internal.R.styleable.MultiSelectListPreference, defStyleAttr,
+ defStyleRes);
mEntries = a.getTextArray(com.android.internal.R.styleable.MultiSelectListPreference_entries);
mEntryValues = a.getTextArray(com.android.internal.R.styleable.MultiSelectListPreference_entryValues);
a.recycle();
}
+
+ public MultiSelectListPreference(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
+ public MultiSelectListPreference(Context context, AttributeSet attrs) {
+ this(context, attrs, com.android.internal.R.attr.dialogPreferenceStyle);
+ }
public MultiSelectListPreference(Context context) {
this(context, null);
diff --git a/core/java/android/preference/Preference.java b/core/java/android/preference/Preference.java
index 37a8102..9abd7ef 100644
--- a/core/java/android/preference/Preference.java
+++ b/core/java/android/preference/Preference.java
@@ -188,30 +188,33 @@ public class Preference implements Comparable<Preference> {
/**
* Perform inflation from XML and apply a class-specific base style. This
- * constructor of Preference allows subclasses to use their own base
- * style when they are inflating. For example, a {@link CheckBoxPreference}
+ * constructor of Preference allows subclasses to use their own base style
+ * when they are inflating. For example, a {@link CheckBoxPreference}
* constructor calls this version of the super class constructor and
- * supplies {@code android.R.attr.checkBoxPreferenceStyle} for <var>defStyle</var>.
- * This allows the theme's checkbox preference style to modify all of the base
- * preference attributes as well as the {@link CheckBoxPreference} class's
- * attributes.
- *
+ * supplies {@code android.R.attr.checkBoxPreferenceStyle} for
+ * <var>defStyleAttr</var>. This allows the theme's checkbox preference
+ * style to modify all of the base preference attributes as well as the
+ * {@link CheckBoxPreference} class's attributes.
+ *
* @param context The Context this is associated with, through which it can
- * access the current theme, resources, {@link SharedPreferences},
- * etc.
- * @param attrs The attributes of the XML tag that is inflating the preference.
- * @param defStyle The default style to apply to this preference. If 0, no style
- * will be applied (beyond what is included in the theme). This
- * may either be an attribute resource, whose value will be
- * retrieved from the current theme, or an explicit style
- * resource.
+ * access the current theme, resources,
+ * {@link SharedPreferences}, etc.
+ * @param attrs The attributes of the XML tag that is inflating the
+ * preference.
+ * @param defStyleAttr An attribute in the current theme that contains a
+ * reference to a style resource that supplies default values for
+ * the view. Can be 0 to not look for defaults.
+ * @param defStyleRes A resource identifier of a style resource that
+ * supplies default values for the view, used only if
+ * defStyleAttr is 0 or can not be found in the theme. Can be 0
+ * to not look for defaults.
* @see #Preference(Context, AttributeSet)
*/
- public Preference(Context context, AttributeSet attrs, int defStyle) {
+ public Preference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
mContext = context;
- TypedArray a = context.obtainStyledAttributes(attrs,
- com.android.internal.R.styleable.Preference, defStyle, 0);
+ final TypedArray a = context.obtainStyledAttributes(
+ attrs, com.android.internal.R.styleable.Preference, defStyleAttr, defStyleRes);
for (int i = a.getIndexCount(); i >= 0; i--) {
int attr = a.getIndex(i);
switch (attr) {
@@ -281,6 +284,30 @@ public class Preference implements Comparable<Preference> {
mCanRecycleLayout = false;
}
}
+
+ /**
+ * Perform inflation from XML and apply a class-specific base style. This
+ * constructor of Preference allows subclasses to use their own base style
+ * when they are inflating. For example, a {@link CheckBoxPreference}
+ * constructor calls this version of the super class constructor and
+ * supplies {@code android.R.attr.checkBoxPreferenceStyle} for
+ * <var>defStyleAttr</var>. This allows the theme's checkbox preference
+ * style to modify all of the base preference attributes as well as the
+ * {@link CheckBoxPreference} class's attributes.
+ *
+ * @param context The Context this is associated with, through which it can
+ * access the current theme, resources,
+ * {@link SharedPreferences}, etc.
+ * @param attrs The attributes of the XML tag that is inflating the
+ * preference.
+ * @param defStyleAttr An attribute in the current theme that contains a
+ * reference to a style resource that supplies default values for
+ * the view. Can be 0 to not look for defaults.
+ * @see #Preference(Context, AttributeSet)
+ */
+ public Preference(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
/**
* Constructor that is called when inflating a Preference from XML. This is
diff --git a/core/java/android/preference/PreferenceCategory.java b/core/java/android/preference/PreferenceCategory.java
index 229a96a..9c9b36e 100644
--- a/core/java/android/preference/PreferenceCategory.java
+++ b/core/java/android/preference/PreferenceCategory.java
@@ -34,9 +34,14 @@ import android.util.AttributeSet;
*/
public class PreferenceCategory extends PreferenceGroup {
private static final String TAG = "PreferenceCategory";
-
- public PreferenceCategory(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
+
+ public PreferenceCategory(
+ Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+ }
+
+ public PreferenceCategory(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
}
public PreferenceCategory(Context context, AttributeSet attrs) {
diff --git a/core/java/android/preference/PreferenceFrameLayout.java b/core/java/android/preference/PreferenceFrameLayout.java
index 75372aa..3210998 100644
--- a/core/java/android/preference/PreferenceFrameLayout.java
+++ b/core/java/android/preference/PreferenceFrameLayout.java
@@ -45,10 +45,15 @@ public class PreferenceFrameLayout extends FrameLayout {
this(context, attrs, com.android.internal.R.attr.preferenceFrameLayoutStyle);
}
- public PreferenceFrameLayout(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
- TypedArray a = context.obtainStyledAttributes(attrs,
- com.android.internal.R.styleable.PreferenceFrameLayout, defStyle, 0);
+ public PreferenceFrameLayout(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
+ public PreferenceFrameLayout(
+ Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+ final TypedArray a = context.obtainStyledAttributes(attrs,
+ com.android.internal.R.styleable.PreferenceFrameLayout, defStyleAttr, defStyleRes);
float density = context.getResources().getDisplayMetrics().density;
int defaultBorderTop = (int) (density * DEFAULT_BORDER_TOP + 0.5f);
diff --git a/core/java/android/preference/PreferenceGroup.java b/core/java/android/preference/PreferenceGroup.java
index 5f8c78d..2d35b1b 100644
--- a/core/java/android/preference/PreferenceGroup.java
+++ b/core/java/android/preference/PreferenceGroup.java
@@ -55,19 +55,23 @@ public abstract class PreferenceGroup extends Preference implements GenericInfla
private int mCurrentPreferenceOrder = 0;
private boolean mAttachedToActivity = false;
-
- public PreferenceGroup(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
+
+ public PreferenceGroup(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
mPreferenceList = new ArrayList<Preference>();
- TypedArray a = context.obtainStyledAttributes(attrs,
- com.android.internal.R.styleable.PreferenceGroup, defStyle, 0);
+ final TypedArray a = context.obtainStyledAttributes(
+ attrs, com.android.internal.R.styleable.PreferenceGroup, defStyleAttr, defStyleRes);
mOrderingAsAdded = a.getBoolean(com.android.internal.R.styleable.PreferenceGroup_orderingFromXml,
mOrderingAsAdded);
a.recycle();
}
+ public PreferenceGroup(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
public PreferenceGroup(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
diff --git a/core/java/android/preference/RingtonePreference.java b/core/java/android/preference/RingtonePreference.java
index 2ebf294..488a0c4 100644
--- a/core/java/android/preference/RingtonePreference.java
+++ b/core/java/android/preference/RingtonePreference.java
@@ -50,11 +50,11 @@ public class RingtonePreference extends Preference implements
private int mRequestCode;
- public RingtonePreference(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
-
- TypedArray a = context.obtainStyledAttributes(attrs,
- com.android.internal.R.styleable.RingtonePreference, defStyle, 0);
+ public RingtonePreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+
+ final TypedArray a = context.obtainStyledAttributes(attrs,
+ com.android.internal.R.styleable.RingtonePreference, defStyleAttr, defStyleRes);
mRingtoneType = a.getInt(com.android.internal.R.styleable.RingtonePreference_ringtoneType,
RingtoneManager.TYPE_RINGTONE);
mShowDefault = a.getBoolean(com.android.internal.R.styleable.RingtonePreference_showDefault,
@@ -64,6 +64,10 @@ public class RingtonePreference extends Preference implements
a.recycle();
}
+ public RingtonePreference(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
public RingtonePreference(Context context, AttributeSet attrs) {
this(context, attrs, com.android.internal.R.attr.ringtonePreferenceStyle);
}
diff --git a/core/java/android/preference/SeekBarDialogPreference.java b/core/java/android/preference/SeekBarDialogPreference.java
index 0e89b16..9a08827 100644
--- a/core/java/android/preference/SeekBarDialogPreference.java
+++ b/core/java/android/preference/SeekBarDialogPreference.java
@@ -32,8 +32,9 @@ public class SeekBarDialogPreference extends DialogPreference {
private Drawable mMyIcon;
- public SeekBarDialogPreference(Context context, AttributeSet attrs) {
- super(context, attrs);
+ public SeekBarDialogPreference(
+ Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
setDialogLayoutResource(com.android.internal.R.layout.seekbar_dialog);
createActionButtons();
@@ -43,6 +44,18 @@ public class SeekBarDialogPreference extends DialogPreference {
setDialogIcon(null);
}
+ public SeekBarDialogPreference(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
+ public SeekBarDialogPreference(Context context, AttributeSet attrs) {
+ this(context, attrs, com.android.internal.R.attr.dialogPreferenceStyle);
+ }
+
+ public SeekBarDialogPreference(Context context) {
+ this(context, null);
+ }
+
// Allow subclasses to override the action buttons
public void createActionButtons() {
setPositiveButtonText(android.R.string.ok);
diff --git a/core/java/android/preference/SeekBarPreference.java b/core/java/android/preference/SeekBarPreference.java
index 7133d3a..e32890d 100644
--- a/core/java/android/preference/SeekBarPreference.java
+++ b/core/java/android/preference/SeekBarPreference.java
@@ -37,15 +37,20 @@ public class SeekBarPreference extends Preference
private boolean mTrackingTouch;
public SeekBarPreference(
- Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
- TypedArray a = context.obtainStyledAttributes(attrs,
- com.android.internal.R.styleable.ProgressBar, defStyle, 0);
+ Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+
+ final TypedArray a = context.obtainStyledAttributes(
+ attrs, com.android.internal.R.styleable.ProgressBar, defStyleAttr, defStyleRes);
setMax(a.getInt(com.android.internal.R.styleable.ProgressBar_max, mMax));
a.recycle();
setLayoutResource(com.android.internal.R.layout.preference_widget_seekbar);
}
+ public SeekBarPreference(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
public SeekBarPreference(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
diff --git a/core/java/android/preference/SwitchPreference.java b/core/java/android/preference/SwitchPreference.java
index 8bac6bd..76ef544 100644
--- a/core/java/android/preference/SwitchPreference.java
+++ b/core/java/android/preference/SwitchPreference.java
@@ -60,13 +60,19 @@ public class SwitchPreference extends TwoStatePreference {
*
* @param context The Context that will style this preference
* @param attrs Style attributes that differ from the default
- * @param defStyle Theme attribute defining the default style options
+ * @param defStyleAttr An attribute in the current theme that contains a
+ * reference to a style resource that supplies default values for
+ * the view. Can be 0 to not look for defaults.
+ * @param defStyleRes A resource identifier of a style resource that
+ * supplies default values for the view, used only if
+ * defStyleAttr is 0 or can not be found in the theme. Can be 0
+ * to not look for defaults.
*/
- public SwitchPreference(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
+ public SwitchPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
TypedArray a = context.obtainStyledAttributes(attrs,
- com.android.internal.R.styleable.SwitchPreference, defStyle, 0);
+ com.android.internal.R.styleable.SwitchPreference, defStyleAttr, defStyleRes);
setSummaryOn(a.getString(com.android.internal.R.styleable.SwitchPreference_summaryOn));
setSummaryOff(a.getString(com.android.internal.R.styleable.SwitchPreference_summaryOff));
setSwitchTextOn(a.getString(
@@ -83,6 +89,19 @@ public class SwitchPreference extends TwoStatePreference {
*
* @param context The Context that will style this preference
* @param attrs Style attributes that differ from the default
+ * @param defStyleAttr An attribute in the current theme that contains a
+ * reference to a style resource that supplies default values for
+ * the view. Can be 0 to not look for defaults.
+ */
+ public SwitchPreference(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
+ /**
+ * Construct a new SwitchPreference with the given style options.
+ *
+ * @param context The Context that will style this preference
+ * @param attrs Style attributes that differ from the default
*/
public SwitchPreference(Context context, AttributeSet attrs) {
this(context, attrs, com.android.internal.R.attr.switchPreferenceStyle);
diff --git a/core/java/android/preference/TwoStatePreference.java b/core/java/android/preference/TwoStatePreference.java
index af83953..6f8be1f 100644
--- a/core/java/android/preference/TwoStatePreference.java
+++ b/core/java/android/preference/TwoStatePreference.java
@@ -42,9 +42,13 @@ public abstract class TwoStatePreference extends Preference {
private boolean mSendClickAccessibilityEvent;
private boolean mDisableDependentsState;
+ public TwoStatePreference(
+ Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+ }
- public TwoStatePreference(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
+ public TwoStatePreference(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
}
public TwoStatePreference(Context context, AttributeSet attrs) {
diff --git a/core/java/android/preference/VolumePreference.java b/core/java/android/preference/VolumePreference.java
index dc683a6..29f2545 100644
--- a/core/java/android/preference/VolumePreference.java
+++ b/core/java/android/preference/VolumePreference.java
@@ -51,15 +51,24 @@ public class VolumePreference extends SeekBarDialogPreference implements
/** May be null if the dialog isn't visible. */
private SeekBarVolumizer mSeekBarVolumizer;
- public VolumePreference(Context context, AttributeSet attrs) {
- super(context, attrs);
+ public VolumePreference(
+ Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
- TypedArray a = context.obtainStyledAttributes(attrs,
- com.android.internal.R.styleable.VolumePreference, 0, 0);
+ final TypedArray a = context.obtainStyledAttributes(attrs,
+ com.android.internal.R.styleable.VolumePreference, defStyleAttr, defStyleRes);
mStreamType = a.getInt(android.R.styleable.VolumePreference_streamType, 0);
a.recycle();
}
+ public VolumePreference(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
+ public VolumePreference(Context context, AttributeSet attrs) {
+ this(context, attrs, 0);
+ }
+
public void setStreamType(int streamType) {
mStreamType = streamType;
}
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index 7f24539..a960bba 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -3759,6 +3759,97 @@ public final class Settings {
"accessibility_captioning_font_scale";
/**
+ * Setting that specifies whether the quick setting tile for display
+ * color inversion is enabled.
+ *
+ * @hide
+ */
+ public static final String ACCESSIBILITY_DISPLAY_INVERSION_QUICK_SETTING_ENABLED =
+ "accessibility_display_inversion_quick_setting_enabled";
+
+ /**
+ * Setting that specifies whether display color inversion is enabled.
+ *
+ * @hide
+ */
+ public static final String ACCESSIBILITY_DISPLAY_INVERSION_ENABLED =
+ "accessibility_display_inversion_enabled";
+
+ /**
+ * Integer property that specifies the type of color inversion to
+ * perform. Valid values are defined in AccessibilityManager.
+ *
+ * @hide
+ */
+ public static final String ACCESSIBILITY_DISPLAY_INVERSION =
+ "accessibility_display_inversion";
+
+ /**
+ * Setting that specifies whether the quick setting tile for display
+ * color space adjustment is enabled.
+ *
+ * @hide
+ */
+ public static final String ACCESSIBILITY_DISPLAY_DALTONIZER_QUICK_SETTING_ENABLED =
+ "accessibility_display_daltonizer_quick_setting_enabled";
+
+ /**
+ * Setting that specifies whether display color space adjustment is
+ * enabled.
+ *
+ * @hide
+ */
+ public static final String ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED =
+ "accessibility_display_daltonizer_enabled";
+
+ /**
+ * Integer property that specifies the type of color space adjustment to
+ * perform. Valid values are defined in AccessibilityManager.
+ *
+ * @hide
+ */
+ public static final String ACCESSIBILITY_DISPLAY_DALTONIZER =
+ "accessibility_display_daltonizer";
+
+ /**
+ * Setting that specifies whether the quick setting tile for display
+ * contrast enhancement is enabled.
+ *
+ * @hide
+ */
+ public static final String ACCESSIBILITY_DISPLAY_CONTRAST_QUICK_SETTING_ENABLED =
+ "accessibility_display_contrast_quick_setting_enabled";
+
+ /**
+ * Setting that specifies whether display contrast enhancement is
+ * enabled.
+ *
+ * @hide
+ */
+ public static final String ACCESSIBILITY_DISPLAY_CONTRAST_ENABLED =
+ "accessibility_display_contrast_enabled";
+
+ /**
+ * Floating point property that specifies display contrast adjustment.
+ * Valid range is [0, ...] where 0 is gray, 1 is normal, and higher
+ * values indicate enhanced contrast.
+ *
+ * @hide
+ */
+ public static final String ACCESSIBILITY_DISPLAY_CONTRAST =
+ "accessibility_display_contrast";
+
+ /**
+ * Floating point property that specifies display brightness adjustment.
+ * Valid range is [-1, 1] where -1 is black, 0 is default, and 1 is
+ * white.
+ *
+ * @hide
+ */
+ public static final String ACCESSIBILITY_DISPLAY_BRIGHTNESS =
+ "accessibility_display_brightness";
+
+ /**
* The timout for considering a press to be a long press in milliseconds.
* @hide
*/
diff --git a/core/java/android/speech/tts/AbstractEventLogger.java b/core/java/android/speech/tts/AbstractEventLogger.java
new file mode 100644
index 0000000..37f8656
--- /dev/null
+++ b/core/java/android/speech/tts/AbstractEventLogger.java
@@ -0,0 +1,124 @@
+/*
+ * Copyright (C) 2013 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.tts;
+
+import android.os.SystemClock;
+
+/**
+ * Base class for storing data about a given speech synthesis request to the
+ * event logs. The data that is logged depends on actual implementation. Note
+ * that {@link AbstractEventLogger#onAudioDataWritten()} and
+ * {@link AbstractEventLogger#onEngineComplete()} must be called from a single
+ * thread (usually the audio playback thread}.
+ */
+abstract class AbstractEventLogger {
+ protected final String mServiceApp;
+ protected final int mCallerUid;
+ protected final int mCallerPid;
+ protected final long mReceivedTime;
+ protected long mPlaybackStartTime = -1;
+
+ private volatile long mRequestProcessingStartTime = -1;
+ private volatile long mEngineStartTime = -1;
+ private volatile long mEngineCompleteTime = -1;
+
+ private boolean mLogWritten = false;
+
+ AbstractEventLogger(int callerUid, int callerPid, String serviceApp) {
+ mCallerUid = callerUid;
+ mCallerPid = callerPid;
+ mServiceApp = serviceApp;
+ mReceivedTime = SystemClock.elapsedRealtime();
+ }
+
+ /**
+ * Notifies the logger that this request has been selected from
+ * the processing queue for processing. Engine latency / total time
+ * is measured from this baseline.
+ */
+ public void onRequestProcessingStart() {
+ mRequestProcessingStartTime = SystemClock.elapsedRealtime();
+ }
+
+ /**
+ * Notifies the logger that a chunk of data has been received from
+ * the engine. Might be called multiple times.
+ */
+ public void onEngineDataReceived() {
+ if (mEngineStartTime == -1) {
+ mEngineStartTime = SystemClock.elapsedRealtime();
+ }
+ }
+
+ /**
+ * Notifies the logger that the engine has finished processing data.
+ * Will be called exactly once.
+ */
+ public void onEngineComplete() {
+ mEngineCompleteTime = SystemClock.elapsedRealtime();
+ }
+
+ /**
+ * Notifies the logger that audio playback has started for some section
+ * of the synthesis. This is normally some amount of time after the engine
+ * has synthesized data and varies depending on utterances and
+ * other audio currently in the queue.
+ */
+ public void onAudioDataWritten() {
+ // For now, keep track of only the first chunk of audio
+ // that was played.
+ if (mPlaybackStartTime == -1) {
+ mPlaybackStartTime = SystemClock.elapsedRealtime();
+ }
+ }
+
+ /**
+ * Notifies the logger that the current synthesis has completed.
+ * All available data is not logged.
+ */
+ public void onCompleted(int statusCode) {
+ if (mLogWritten) {
+ return;
+ } else {
+ mLogWritten = true;
+ }
+
+ long completionTime = SystemClock.elapsedRealtime();
+
+ // We don't report latency for stopped syntheses because their overall
+ // total time spent will be inaccurate (will not correlate with
+ // the length of the utterance).
+
+ // onAudioDataWritten() should normally always be called, and hence mPlaybackStartTime
+ // should be set, if an error does not occur.
+ if (statusCode != TextToSpeechClient.Status.SUCCESS
+ || mPlaybackStartTime == -1 || mEngineCompleteTime == -1) {
+ logFailure(statusCode);
+ return;
+ }
+
+ final long audioLatency = mPlaybackStartTime - mReceivedTime;
+ final long engineLatency = mEngineStartTime - mRequestProcessingStartTime;
+ final long engineTotal = mEngineCompleteTime - mRequestProcessingStartTime;
+ logSuccess(audioLatency, engineLatency, engineTotal);
+ }
+
+ protected abstract void logFailure(int statusCode);
+ protected abstract void logSuccess(long audioLatency, long engineLatency,
+ long engineTotal);
+
+
+}
diff --git a/core/java/android/speech/tts/AbstractSynthesisCallback.java b/core/java/android/speech/tts/AbstractSynthesisCallback.java
index c7a4af0..91e119b 100644
--- a/core/java/android/speech/tts/AbstractSynthesisCallback.java
+++ b/core/java/android/speech/tts/AbstractSynthesisCallback.java
@@ -15,15 +15,28 @@
*/
package android.speech.tts;
+
/**
* Defines additional methods the synthesis callback must implement that
* are private to the TTS service implementation.
+ *
+ * All of these class methods (with the exception of {@link #stop()}) can be only called on the
+ * synthesis thread, while inside
+ * {@link TextToSpeechService#onSynthesizeText} or {@link TextToSpeechService#onSynthesizeTextV2}.
+ * {@link #stop()} is the exception, it may be called from multiple threads.
*/
abstract class AbstractSynthesisCallback implements SynthesisCallback {
+ /** If true, request comes from V2 TTS interface */
+ protected final boolean mClientIsUsingV2;
+
/**
- * Checks whether the synthesis request completed successfully.
+ * Constructor.
+ * @param clientIsUsingV2 If true, this callback will be used inside
+ * {@link TextToSpeechService#onSynthesizeTextV2} method.
*/
- abstract boolean isDone();
+ AbstractSynthesisCallback(boolean clientIsUsingV2) {
+ mClientIsUsingV2 = clientIsUsingV2;
+ }
/**
* Aborts the speech request.
@@ -31,4 +44,16 @@ abstract class AbstractSynthesisCallback implements SynthesisCallback {
* Can be called from multiple threads.
*/
abstract void stop();
+
+ /**
+ * Get status code for a "stop".
+ *
+ * V2 Clients will receive special status, V1 clients will receive standard error.
+ *
+ * This method should only be called on the synthesis thread,
+ * while in {@link TextToSpeechService#onSynthesizeText}.
+ */
+ int errorCodeOnStop() {
+ return mClientIsUsingV2 ? TextToSpeechClient.Status.STOPPED : TextToSpeech.ERROR;
+ }
}
diff --git a/core/java/android/speech/tts/AudioPlaybackHandler.java b/core/java/android/speech/tts/AudioPlaybackHandler.java
index d63f605..dcf49b0 100644
--- a/core/java/android/speech/tts/AudioPlaybackHandler.java
+++ b/core/java/android/speech/tts/AudioPlaybackHandler.java
@@ -43,7 +43,7 @@ class AudioPlaybackHandler {
return;
}
- item.stop(false);
+ item.stop(TextToSpeechClient.Status.STOPPED);
}
public void enqueue(PlaybackQueueItem item) {
diff --git a/core/java/android/speech/tts/AudioPlaybackQueueItem.java b/core/java/android/speech/tts/AudioPlaybackQueueItem.java
index 1a1fda8..c514639 100644
--- a/core/java/android/speech/tts/AudioPlaybackQueueItem.java
+++ b/core/java/android/speech/tts/AudioPlaybackQueueItem.java
@@ -53,7 +53,7 @@ class AudioPlaybackQueueItem extends PlaybackQueueItem {
dispatcher.dispatchOnStart();
mPlayer = MediaPlayer.create(mContext, mUri);
if (mPlayer == null) {
- dispatcher.dispatchOnError();
+ dispatcher.dispatchOnError(TextToSpeechClient.Status.ERROR_OUTPUT);
return;
}
@@ -83,9 +83,9 @@ class AudioPlaybackQueueItem extends PlaybackQueueItem {
}
if (mFinished) {
- dispatcher.dispatchOnDone();
+ dispatcher.dispatchOnSuccess();
} else {
- dispatcher.dispatchOnError();
+ dispatcher.dispatchOnStop();
}
}
@@ -99,7 +99,7 @@ class AudioPlaybackQueueItem extends PlaybackQueueItem {
}
@Override
- void stop(boolean isError) {
+ void stop(int errorCode) {
mDone.open();
}
}
diff --git a/core/java/android/speech/tts/EventLogTags.logtags b/core/java/android/speech/tts/EventLogTags.logtags
index f8654ad..e209a28 100644
--- a/core/java/android/speech/tts/EventLogTags.logtags
+++ b/core/java/android/speech/tts/EventLogTags.logtags
@@ -4,3 +4,6 @@ option java_package android.speech.tts;
76001 tts_speak_success (engine|3),(caller_uid|1),(caller_pid|1),(length|1),(locale|3),(rate|1),(pitch|1),(engine_latency|2|3),(engine_total|2|3),(audio_latency|2|3)
76002 tts_speak_failure (engine|3),(caller_uid|1),(caller_pid|1),(length|1),(locale|3),(rate|1),(pitch|1)
+
+76003 tts_v2_speak_success (engine|3),(caller_uid|1),(caller_pid|1),(length|1),(request_config|3),(engine_latency|2|3),(engine_total|2|3),(audio_latency|2|3)
+76004 tts_v2_speak_failure (engine|3),(caller_uid|1),(caller_pid|1),(length|1),(request_config|3), (statusCode|1)
diff --git a/core/java/android/speech/tts/EventLogger.java b/core/java/android/speech/tts/EventLogger.java
deleted file mode 100644
index 82ed4dd..0000000
--- a/core/java/android/speech/tts/EventLogger.java
+++ /dev/null
@@ -1,178 +0,0 @@
-/*
- * Copyright (C) 2011 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.tts;
-
-import android.os.SystemClock;
-import android.text.TextUtils;
-import android.util.Log;
-
-/**
- * Writes data about a given speech synthesis request to the event logs.
- * The data that is logged includes the calling app, length of the utterance,
- * speech rate / pitch and the latency and overall time taken.
- *
- * Note that {@link EventLogger#onStopped()} and {@link EventLogger#onError()}
- * might be called from any thread, but on {@link EventLogger#onAudioDataWritten()} and
- * {@link EventLogger#onComplete()} must be called from a single thread
- * (usually the audio playback thread}
- */
-class EventLogger {
- private final SynthesisRequest mRequest;
- private final String mServiceApp;
- private final int mCallerUid;
- private final int mCallerPid;
- private final long mReceivedTime;
- private long mPlaybackStartTime = -1;
- private volatile long mRequestProcessingStartTime = -1;
- private volatile long mEngineStartTime = -1;
- private volatile long mEngineCompleteTime = -1;
-
- private volatile boolean mError = false;
- private volatile boolean mStopped = false;
- private boolean mLogWritten = false;
-
- EventLogger(SynthesisRequest request, int callerUid, int callerPid, String serviceApp) {
- mRequest = request;
- mCallerUid = callerUid;
- mCallerPid = callerPid;
- mServiceApp = serviceApp;
- mReceivedTime = SystemClock.elapsedRealtime();
- }
-
- /**
- * Notifies the logger that this request has been selected from
- * the processing queue for processing. Engine latency / total time
- * is measured from this baseline.
- */
- public void onRequestProcessingStart() {
- mRequestProcessingStartTime = SystemClock.elapsedRealtime();
- }
-
- /**
- * Notifies the logger that a chunk of data has been received from
- * the engine. Might be called multiple times.
- */
- public void onEngineDataReceived() {
- if (mEngineStartTime == -1) {
- mEngineStartTime = SystemClock.elapsedRealtime();
- }
- }
-
- /**
- * Notifies the logger that the engine has finished processing data.
- * Will be called exactly once.
- */
- public void onEngineComplete() {
- mEngineCompleteTime = SystemClock.elapsedRealtime();
- }
-
- /**
- * Notifies the logger that audio playback has started for some section
- * of the synthesis. This is normally some amount of time after the engine
- * has synthesized data and varies depending on utterances and
- * other audio currently in the queue.
- */
- public void onAudioDataWritten() {
- // For now, keep track of only the first chunk of audio
- // that was played.
- if (mPlaybackStartTime == -1) {
- mPlaybackStartTime = SystemClock.elapsedRealtime();
- }
- }
-
- /**
- * Notifies the logger that the current synthesis was stopped.
- * Latency numbers are not reported for stopped syntheses.
- */
- public void onStopped() {
- mStopped = false;
- }
-
- /**
- * Notifies the logger that the current synthesis resulted in
- * an error. This is logged using {@link EventLogTags#writeTtsSpeakFailure}.
- */
- public void onError() {
- mError = true;
- }
-
- /**
- * Notifies the logger that the current synthesis has completed.
- * All available data is not logged.
- */
- public void onWriteData() {
- if (mLogWritten) {
- return;
- } else {
- mLogWritten = true;
- }
-
- long completionTime = SystemClock.elapsedRealtime();
- // onAudioDataWritten() should normally always be called if an
- // error does not occur.
- if (mError || mPlaybackStartTime == -1 || mEngineCompleteTime == -1) {
- EventLogTags.writeTtsSpeakFailure(mServiceApp, mCallerUid, mCallerPid,
- getUtteranceLength(), getLocaleString(),
- mRequest.getSpeechRate(), mRequest.getPitch());
- return;
- }
-
- // We don't report stopped syntheses because their overall
- // total time spent will be innacurate (will not correlate with
- // the length of the utterance).
- if (mStopped) {
- return;
- }
-
- final long audioLatency = mPlaybackStartTime - mReceivedTime;
- final long engineLatency = mEngineStartTime - mRequestProcessingStartTime;
- final long engineTotal = mEngineCompleteTime - mRequestProcessingStartTime;
-
- EventLogTags.writeTtsSpeakSuccess(mServiceApp, mCallerUid, mCallerPid,
- getUtteranceLength(), getLocaleString(),
- mRequest.getSpeechRate(), mRequest.getPitch(),
- engineLatency, engineTotal, audioLatency);
- }
-
- /**
- * @return the length of the utterance for the given synthesis, 0
- * if the utterance was {@code null}.
- */
- private int getUtteranceLength() {
- final String utterance = mRequest.getText();
- return utterance == null ? 0 : utterance.length();
- }
-
- /**
- * Returns a formatted locale string from the synthesis params of the
- * form lang-country-variant.
- */
- private String getLocaleString() {
- StringBuilder sb = new StringBuilder(mRequest.getLanguage());
- if (!TextUtils.isEmpty(mRequest.getCountry())) {
- sb.append('-');
- sb.append(mRequest.getCountry());
-
- if (!TextUtils.isEmpty(mRequest.getVariant())) {
- sb.append('-');
- sb.append(mRequest.getVariant());
- }
- }
-
- return sb.toString();
- }
-
-}
diff --git a/core/java/android/speech/tts/EventLoggerV1.java b/core/java/android/speech/tts/EventLoggerV1.java
new file mode 100644
index 0000000..f484347
--- /dev/null
+++ b/core/java/android/speech/tts/EventLoggerV1.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2013 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.tts;
+
+import android.text.TextUtils;
+
+/**
+ * Writes data about a given speech synthesis request for V1 API to the event
+ * logs. The data that is logged includes the calling app, length of the
+ * utterance, speech rate / pitch, the latency, and overall time taken.
+ */
+class EventLoggerV1 extends AbstractEventLogger {
+ private final SynthesisRequest mRequest;
+
+ EventLoggerV1(SynthesisRequest request, int callerUid, int callerPid, String serviceApp) {
+ super(callerUid, callerPid, serviceApp);
+ mRequest = request;
+ }
+
+ @Override
+ protected void logFailure(int statusCode) {
+ // We don't report stopped syntheses because their overall
+ // total time spent will be inaccurate (will not correlate with
+ // the length of the utterance).
+ if (statusCode != TextToSpeechClient.Status.STOPPED) {
+ EventLogTags.writeTtsSpeakFailure(mServiceApp, mCallerUid, mCallerPid,
+ getUtteranceLength(), getLocaleString(),
+ mRequest.getSpeechRate(), mRequest.getPitch());
+ }
+ }
+
+ @Override
+ protected void logSuccess(long audioLatency, long engineLatency, long engineTotal) {
+ EventLogTags.writeTtsSpeakSuccess(mServiceApp, mCallerUid, mCallerPid,
+ getUtteranceLength(), getLocaleString(),
+ mRequest.getSpeechRate(), mRequest.getPitch(),
+ engineLatency, engineTotal, audioLatency);
+ }
+
+ /**
+ * @return the length of the utterance for the given synthesis, 0
+ * if the utterance was {@code null}.
+ */
+ private int getUtteranceLength() {
+ final String utterance = mRequest.getText();
+ return utterance == null ? 0 : utterance.length();
+ }
+
+ /**
+ * Returns a formatted locale string from the synthesis params of the
+ * form lang-country-variant.
+ */
+ private String getLocaleString() {
+ StringBuilder sb = new StringBuilder(mRequest.getLanguage());
+ if (!TextUtils.isEmpty(mRequest.getCountry())) {
+ sb.append('-');
+ sb.append(mRequest.getCountry());
+
+ if (!TextUtils.isEmpty(mRequest.getVariant())) {
+ sb.append('-');
+ sb.append(mRequest.getVariant());
+ }
+ }
+
+ return sb.toString();
+ }
+}
diff --git a/core/java/android/speech/tts/EventLoggerV2.java b/core/java/android/speech/tts/EventLoggerV2.java
new file mode 100644
index 0000000..b8e4dae
--- /dev/null
+++ b/core/java/android/speech/tts/EventLoggerV2.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2013 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.tts;
+
+
+
+/**
+ * Writes data about a given speech synthesis request for V2 API to the event logs.
+ * The data that is logged includes the calling app, length of the utterance,
+ * synthesis request configuration and the latency and overall time taken.
+ */
+class EventLoggerV2 extends AbstractEventLogger {
+ private final SynthesisRequestV2 mRequest;
+
+ EventLoggerV2(SynthesisRequestV2 request, int callerUid, int callerPid, String serviceApp) {
+ super(callerUid, callerPid, serviceApp);
+ mRequest = request;
+ }
+
+ @Override
+ protected void logFailure(int statusCode) {
+ // We don't report stopped syntheses because their overall
+ // total time spent will be inaccurate (will not correlate with
+ // the length of the utterance).
+ if (statusCode != TextToSpeechClient.Status.STOPPED) {
+ EventLogTags.writeTtsV2SpeakFailure(mServiceApp,
+ mCallerUid, mCallerPid, getUtteranceLength(), getRequestConfigString(), statusCode);
+ }
+ }
+
+ @Override
+ protected void logSuccess(long audioLatency, long engineLatency, long engineTotal) {
+ EventLogTags.writeTtsV2SpeakSuccess(mServiceApp,
+ mCallerUid, mCallerPid, getUtteranceLength(), getRequestConfigString(),
+ engineLatency, engineTotal, audioLatency);
+ }
+
+ /**
+ * @return the length of the utterance for the given synthesis, 0
+ * if the utterance was {@code null}.
+ */
+ private int getUtteranceLength() {
+ final String utterance = mRequest.getText();
+ return utterance == null ? 0 : utterance.length();
+ }
+
+ /**
+ * Returns a string representation of the synthesis request configuration.
+ */
+ private String getRequestConfigString() {
+ // Ensure the bundles are unparceled.
+ mRequest.getVoiceParams().size();
+ mRequest.getAudioParams().size();
+
+ return new StringBuilder(64).append("VoiceName: ").append(mRequest.getVoiceName())
+ .append(" ,VoiceParams: ").append(mRequest.getVoiceParams())
+ .append(" ,SystemParams: ").append(mRequest.getAudioParams())
+ .append("]").toString();
+ }
+}
diff --git a/core/java/android/speech/tts/FileSynthesisCallback.java b/core/java/android/speech/tts/FileSynthesisCallback.java
index ab8f82f..859606a 100644
--- a/core/java/android/speech/tts/FileSynthesisCallback.java
+++ b/core/java/android/speech/tts/FileSynthesisCallback.java
@@ -17,6 +17,7 @@ package android.speech.tts;
import android.media.AudioFormat;
import android.os.FileUtils;
+import android.speech.tts.TextToSpeechService.UtteranceProgressDispatcher;
import android.util.Log;
import java.io.File;
@@ -48,19 +49,39 @@ class FileSynthesisCallback extends AbstractSynthesisCallback {
private FileChannel mFileChannel;
+ private final UtteranceProgressDispatcher mDispatcher;
+ private final Object mCallerIdentity;
+
private boolean mStarted = false;
- private boolean mStopped = false;
private boolean mDone = false;
- FileSynthesisCallback(FileChannel fileChannel) {
+ /** Status code of synthesis */
+ protected int mStatusCode;
+
+ FileSynthesisCallback(FileChannel fileChannel, UtteranceProgressDispatcher dispatcher,
+ Object callerIdentity, boolean clientIsUsingV2) {
+ super(clientIsUsingV2);
mFileChannel = fileChannel;
+ mDispatcher = dispatcher;
+ mCallerIdentity = callerIdentity;
+ mStatusCode = TextToSpeechClient.Status.SUCCESS;
}
@Override
void stop() {
synchronized (mStateLock) {
- mStopped = true;
+ if (mDone) {
+ return;
+ }
+ if (mStatusCode == TextToSpeechClient.Status.STOPPED) {
+ return;
+ }
+
+ mStatusCode = TextToSpeechClient.Status.STOPPED;
cleanUp();
+ if (mDispatcher != null) {
+ mDispatcher.dispatchOnStop();
+ }
}
}
@@ -75,14 +96,8 @@ class FileSynthesisCallback extends AbstractSynthesisCallback {
* Must be called while holding the monitor on {@link #mStateLock}.
*/
private void closeFile() {
- try {
- if (mFileChannel != null) {
- mFileChannel.close();
- mFileChannel = null;
- }
- } catch (IOException ex) {
- Log.e(TAG, "Failed to close output file descriptor", ex);
- }
+ // File will be closed by the SpeechItem in the speech service.
+ mFileChannel = null;
}
@Override
@@ -91,38 +106,46 @@ class FileSynthesisCallback extends AbstractSynthesisCallback {
}
@Override
- boolean isDone() {
- return mDone;
- }
-
- @Override
public int start(int sampleRateInHz, int audioFormat, int channelCount) {
if (DBG) {
Log.d(TAG, "FileSynthesisRequest.start(" + sampleRateInHz + "," + audioFormat
+ "," + channelCount + ")");
}
+ FileChannel fileChannel = null;
synchronized (mStateLock) {
- if (mStopped) {
+ if (mStatusCode == TextToSpeechClient.Status.STOPPED) {
if (DBG) Log.d(TAG, "Request has been aborted.");
+ return errorCodeOnStop();
+ }
+ if (mStatusCode != TextToSpeechClient.Status.SUCCESS) {
+ if (DBG) Log.d(TAG, "Error was raised");
return TextToSpeech.ERROR;
}
if (mStarted) {
- cleanUp();
- throw new IllegalArgumentException("FileSynthesisRequest.start() called twice");
+ Log.e(TAG, "Start called twice");
+ return TextToSpeech.ERROR;
}
mStarted = true;
mSampleRateInHz = sampleRateInHz;
mAudioFormat = audioFormat;
mChannelCount = channelCount;
- try {
- mFileChannel.write(ByteBuffer.allocate(WAV_HEADER_LENGTH));
+ if (mDispatcher != null) {
+ mDispatcher.dispatchOnStart();
+ }
+ fileChannel = mFileChannel;
+ }
+
+ try {
+ fileChannel.write(ByteBuffer.allocate(WAV_HEADER_LENGTH));
return TextToSpeech.SUCCESS;
- } catch (IOException ex) {
- Log.e(TAG, "Failed to write wav header to output file descriptor" + ex);
+ } catch (IOException ex) {
+ Log.e(TAG, "Failed to write wav header to output file descriptor", ex);
+ synchronized (mStateLock) {
cleanUp();
- return TextToSpeech.ERROR;
+ mStatusCode = TextToSpeechClient.Status.ERROR_OUTPUT;
}
+ return TextToSpeech.ERROR;
}
}
@@ -132,66 +155,128 @@ class FileSynthesisCallback extends AbstractSynthesisCallback {
Log.d(TAG, "FileSynthesisRequest.audioAvailable(" + buffer + "," + offset
+ "," + length + ")");
}
+ FileChannel fileChannel = null;
synchronized (mStateLock) {
- if (mStopped) {
+ if (mStatusCode == TextToSpeechClient.Status.STOPPED) {
if (DBG) Log.d(TAG, "Request has been aborted.");
+ return errorCodeOnStop();
+ }
+ if (mStatusCode != TextToSpeechClient.Status.SUCCESS) {
+ if (DBG) Log.d(TAG, "Error was raised");
return TextToSpeech.ERROR;
}
if (mFileChannel == null) {
Log.e(TAG, "File not open");
+ mStatusCode = TextToSpeechClient.Status.ERROR_OUTPUT;
return TextToSpeech.ERROR;
}
- try {
- mFileChannel.write(ByteBuffer.wrap(buffer, offset, length));
- return TextToSpeech.SUCCESS;
- } catch (IOException ex) {
- Log.e(TAG, "Failed to write to output file descriptor", ex);
- cleanUp();
+ if (!mStarted) {
+ Log.e(TAG, "Start method was not called");
return TextToSpeech.ERROR;
}
+ fileChannel = mFileChannel;
+ }
+
+ try {
+ fileChannel.write(ByteBuffer.wrap(buffer, offset, length));
+ return TextToSpeech.SUCCESS;
+ } catch (IOException ex) {
+ Log.e(TAG, "Failed to write to output file descriptor", ex);
+ synchronized (mStateLock) {
+ cleanUp();
+ mStatusCode = TextToSpeechClient.Status.ERROR_OUTPUT;
+ }
+ return TextToSpeech.ERROR;
}
}
@Override
public int done() {
if (DBG) Log.d(TAG, "FileSynthesisRequest.done()");
+ FileChannel fileChannel = null;
+
+ int sampleRateInHz = 0;
+ int audioFormat = 0;
+ int channelCount = 0;
+
synchronized (mStateLock) {
if (mDone) {
- if (DBG) Log.d(TAG, "Duplicate call to done()");
- // This preserves existing behaviour. Earlier, if done was called twice
- // we'd return ERROR because mFile == null and we'd add to logspam.
+ Log.w(TAG, "Duplicate call to done()");
+ // This is not an error that would prevent synthesis. Hence no
+ // setStatusCode is set.
return TextToSpeech.ERROR;
}
- if (mStopped) {
+ if (mStatusCode == TextToSpeechClient.Status.STOPPED) {
if (DBG) Log.d(TAG, "Request has been aborted.");
+ return errorCodeOnStop();
+ }
+ if (mDispatcher != null && mStatusCode != TextToSpeechClient.Status.SUCCESS &&
+ mStatusCode != TextToSpeechClient.Status.STOPPED) {
+ mDispatcher.dispatchOnError(mStatusCode);
return TextToSpeech.ERROR;
}
if (mFileChannel == null) {
Log.e(TAG, "File not open");
return TextToSpeech.ERROR;
}
- try {
- // Write WAV header at start of file
- mFileChannel.position(0);
- int dataLength = (int) (mFileChannel.size() - WAV_HEADER_LENGTH);
- mFileChannel.write(
- makeWavHeader(mSampleRateInHz, mAudioFormat, mChannelCount, dataLength));
+ mDone = true;
+ fileChannel = mFileChannel;
+ sampleRateInHz = mSampleRateInHz;
+ audioFormat = mAudioFormat;
+ channelCount = mChannelCount;
+ }
+
+ try {
+ // Write WAV header at start of file
+ fileChannel.position(0);
+ int dataLength = (int) (fileChannel.size() - WAV_HEADER_LENGTH);
+ fileChannel.write(
+ makeWavHeader(sampleRateInHz, audioFormat, channelCount, dataLength));
+
+ synchronized (mStateLock) {
closeFile();
- mDone = true;
+ if (mDispatcher != null) {
+ mDispatcher.dispatchOnSuccess();
+ }
return TextToSpeech.SUCCESS;
- } catch (IOException ex) {
- Log.e(TAG, "Failed to write to output file descriptor", ex);
+ }
+ } catch (IOException ex) {
+ Log.e(TAG, "Failed to write to output file descriptor", ex);
+ synchronized (mStateLock) {
cleanUp();
- return TextToSpeech.ERROR;
}
+ return TextToSpeech.ERROR;
}
}
@Override
public void error() {
+ error(TextToSpeechClient.Status.ERROR_SYNTHESIS);
+ }
+
+ @Override
+ public void error(int errorCode) {
if (DBG) Log.d(TAG, "FileSynthesisRequest.error()");
synchronized (mStateLock) {
+ if (mDone) {
+ return;
+ }
cleanUp();
+ mStatusCode = errorCode;
+ }
+ }
+
+ @Override
+ public boolean hasStarted() {
+ synchronized (mStateLock) {
+ return mStarted;
+ }
+ }
+
+ @Override
+ public boolean hasFinished() {
+ synchronized (mStateLock) {
+ return mDone;
}
}
@@ -225,4 +310,16 @@ class FileSynthesisCallback extends AbstractSynthesisCallback {
return header;
}
+ @Override
+ public int fallback() {
+ synchronized (mStateLock) {
+ if (hasStarted() || hasFinished()) {
+ return TextToSpeech.ERROR;
+ }
+
+ mDispatcher.dispatchOnFallback();
+ mStatusCode = TextToSpeechClient.Status.SUCCESS;
+ return TextToSpeechClient.Status.SUCCESS;
+ }
+ }
}
diff --git a/core/java/android/speech/tts/ITextToSpeechCallback.aidl b/core/java/android/speech/tts/ITextToSpeechCallback.aidl
index f0287d4..3c808ff 100644
--- a/core/java/android/speech/tts/ITextToSpeechCallback.aidl
+++ b/core/java/android/speech/tts/ITextToSpeechCallback.aidl
@@ -15,13 +15,53 @@
*/
package android.speech.tts;
+import android.speech.tts.VoiceInfo;
+
/**
* Interface for callbacks from TextToSpeechService
*
* {@hide}
*/
oneway interface ITextToSpeechCallback {
+ /**
+ * Tells the client that the synthesis has started.
+ *
+ * @param utteranceId Unique id identifying synthesis request.
+ */
void onStart(String utteranceId);
- void onDone(String utteranceId);
- void onError(String utteranceId);
+
+ /**
+ * Tells the client that the synthesis has finished.
+ *
+ * @param utteranceId Unique id identifying synthesis request.
+ */
+ void onSuccess(String utteranceId);
+
+ /**
+ * Tells the client that the synthesis was stopped.
+ *
+ * @param utteranceId Unique id identifying synthesis request.
+ */
+ void onStop(String utteranceId);
+
+ /**
+ * Tells the client that the synthesis failed, and fallback synthesis will be attempted.
+ *
+ * @param utteranceId Unique id identifying synthesis request.
+ */
+ void onFallback(String utteranceId);
+
+ /**
+ * Tells the client that the synthesis has failed.
+ *
+ * @param utteranceId Unique id identifying synthesis request.
+ * @param errorCode One of the values from
+ * {@link android.speech.tts.v2.TextToSpeechClient.Status}.
+ */
+ void onError(String utteranceId, int errorCode);
+
+ /**
+ * Inform the client that set of available voices changed.
+ */
+ void onVoicesInfoChange(in List<VoiceInfo> voices);
}
diff --git a/core/java/android/speech/tts/ITextToSpeechService.aidl b/core/java/android/speech/tts/ITextToSpeechService.aidl
index b7bc70c..9cf49ff 100644
--- a/core/java/android/speech/tts/ITextToSpeechService.aidl
+++ b/core/java/android/speech/tts/ITextToSpeechService.aidl
@@ -20,6 +20,8 @@ import android.net.Uri;
import android.os.Bundle;
import android.os.ParcelFileDescriptor;
import android.speech.tts.ITextToSpeechCallback;
+import android.speech.tts.VoiceInfo;
+import android.speech.tts.SynthesisRequestV2;
/**
* Interface for TextToSpeech to talk to TextToSpeechService.
@@ -70,9 +72,10 @@ interface ITextToSpeechService {
* TextToSpeech object.
* @param duration Number of milliseconds of silence to play.
* @param queueMode Determines what to do to requests already in the queue.
- * @param param Request parameters.
+ * @param utteranceId Unique id used to identify this request in callbacks.
*/
- int playSilence(in IBinder callingInstance, in long duration, in int queueMode, in Bundle params);
+ int playSilence(in IBinder callingInstance, in long duration, in int queueMode,
+ in String utteranceId);
/**
* Checks whether the service is currently playing some audio.
@@ -90,7 +93,6 @@ interface ITextToSpeechService {
/**
* Returns the language, country and variant currently being used by the TTS engine.
- *
* Can be called from multiple threads.
*
* @return A 3-element array, containing language (ISO 3-letter code),
@@ -99,7 +101,7 @@ interface ITextToSpeechService {
* be empty too.
*/
String[] getLanguage();
-
+
/**
* Returns a default TTS language, country and variant as set by the user.
*
@@ -111,7 +113,7 @@ interface ITextToSpeechService {
* be empty too.
*/
String[] getClientDefaultLanguage();
-
+
/**
* Checks whether the engine supports a given language.
*
@@ -137,7 +139,7 @@ interface ITextToSpeechService {
* @param country ISO-3 country code. May be empty or null.
* @param variant Language variant. May be empty or null.
* @return An array of strings containing the set of features supported for
- * the supplied locale. The array of strings must not contain
+ * the supplied locale. The array of strings must not contain
* duplicates.
*/
String[] getFeaturesForLanguage(in String lang, in String country, in String variant);
@@ -169,4 +171,44 @@ interface ITextToSpeechService {
*/
void setCallback(in IBinder caller, ITextToSpeechCallback cb);
+ /**
+ * Tells the engine to synthesize some speech and play it back.
+ *
+ * @param callingInstance a binder representing the identity of the calling
+ * TextToSpeech object.
+ * @param text The text to synthesize.
+ * @param queueMode Determines what to do to requests already in the queue.
+ * @param request Request parameters.
+ */
+ int speakV2(in IBinder callingInstance, in SynthesisRequestV2 request);
+
+ /**
+ * Tells the engine to synthesize some speech and write it to a file.
+ *
+ * @param callingInstance a binder representing the identity of the calling
+ * TextToSpeech object.
+ * @param text The text to synthesize.
+ * @param fileDescriptor The file descriptor to write the synthesized audio to. Has to be
+ writable.
+ * @param request Request parameters.
+ */
+ int synthesizeToFileDescriptorV2(in IBinder callingInstance,
+ in ParcelFileDescriptor fileDescriptor, in SynthesisRequestV2 request);
+
+ /**
+ * Plays an existing audio resource. V2 version
+ *
+ * @param callingInstance a binder representing the identity of the calling
+ * TextToSpeech object.
+ * @param audioUri URI for the audio resource (a file or android.resource URI)
+ * @param utteranceId Unique identifier.
+ * @param audioParameters Parameters for audio playback (from {@link SynthesisRequestV2}).
+ */
+ int playAudioV2(in IBinder callingInstance, in Uri audioUri, in String utteranceId,
+ in Bundle audioParameters);
+
+ /**
+ * Request the list of available voices from the service.
+ */
+ List<VoiceInfo> getVoicesInfo();
}
diff --git a/core/java/android/speech/tts/PlaybackQueueItem.java b/core/java/android/speech/tts/PlaybackQueueItem.java
index d0957ff..b2e323e 100644
--- a/core/java/android/speech/tts/PlaybackQueueItem.java
+++ b/core/java/android/speech/tts/PlaybackQueueItem.java
@@ -22,6 +22,16 @@ abstract class PlaybackQueueItem implements Runnable {
return mDispatcher;
}
+ @Override
public abstract void run();
- abstract void stop(boolean isError);
+
+ /**
+ * Stop the playback.
+ *
+ * @param errorCode Cause of the stop. Can be either one of the error codes from
+ * {@link android.speech.tts.TextToSpeechClient.Status} or
+ * {@link android.speech.tts.TextToSpeechClient.Status#STOPPED}
+ * if stopped on a client request.
+ */
+ abstract void stop(int errorCode);
}
diff --git a/core/java/android/speech/tts/PlaybackSynthesisCallback.java b/core/java/android/speech/tts/PlaybackSynthesisCallback.java
index c99f201..e345e89 100644
--- a/core/java/android/speech/tts/PlaybackSynthesisCallback.java
+++ b/core/java/android/speech/tts/PlaybackSynthesisCallback.java
@@ -55,20 +55,20 @@ class PlaybackSynthesisCallback extends AbstractSynthesisCallback {
private final AudioPlaybackHandler mAudioTrackHandler;
// A request "token", which will be non null after start() has been called.
private SynthesisPlaybackQueueItem mItem = null;
- // Whether this request has been stopped. This is useful for keeping
- // track whether stop() has been called before start(). In all other cases,
- // a non-null value of mItem will provide the same information.
- private boolean mStopped = false;
private volatile boolean mDone = false;
+ /** Status code of synthesis */
+ protected int mStatusCode;
+
private final UtteranceProgressDispatcher mDispatcher;
private final Object mCallerIdentity;
- private final EventLogger mLogger;
+ private final AbstractEventLogger mLogger;
PlaybackSynthesisCallback(int streamType, float volume, float pan,
AudioPlaybackHandler audioTrackHandler, UtteranceProgressDispatcher dispatcher,
- Object callerIdentity, EventLogger logger) {
+ Object callerIdentity, AbstractEventLogger logger, boolean clientIsUsingV2) {
+ super(clientIsUsingV2);
mStreamType = streamType;
mVolume = volume;
mPan = pan;
@@ -76,28 +76,25 @@ class PlaybackSynthesisCallback extends AbstractSynthesisCallback {
mDispatcher = dispatcher;
mCallerIdentity = callerIdentity;
mLogger = logger;
+ mStatusCode = TextToSpeechClient.Status.SUCCESS;
}
@Override
void stop() {
- stopImpl(false);
- }
-
- void stopImpl(boolean wasError) {
if (DBG) Log.d(TAG, "stop()");
- // Note that mLogger.mError might be true too at this point.
- mLogger.onStopped();
-
SynthesisPlaybackQueueItem item;
synchronized (mStateLock) {
- if (mStopped) {
+ if (mDone) {
+ return;
+ }
+ if (mStatusCode == TextToSpeechClient.Status.STOPPED) {
Log.w(TAG, "stop() called twice");
return;
}
item = mItem;
- mStopped = true;
+ mStatusCode = TextToSpeechClient.Status.STOPPED;
}
if (item != null) {
@@ -105,19 +102,15 @@ class PlaybackSynthesisCallback extends AbstractSynthesisCallback {
// point it will write an additional buffer to the item - but we
// won't worry about that because the audio playback queue will be cleared
// soon after (see SynthHandler#stop(String).
- item.stop(wasError);
+ item.stop(TextToSpeechClient.Status.STOPPED);
} else {
// This happens when stop() or error() were called before start() was.
// In all other cases, mAudioTrackHandler.stop() will
// result in onSynthesisDone being called, and we will
// write data there.
- mLogger.onWriteData();
-
- if (wasError) {
- // We have to dispatch the error ourselves.
- mDispatcher.dispatchOnError();
- }
+ mLogger.onCompleted(TextToSpeechClient.Status.STOPPED);
+ mDispatcher.dispatchOnStop();
}
}
@@ -129,26 +122,42 @@ class PlaybackSynthesisCallback extends AbstractSynthesisCallback {
}
@Override
- boolean isDone() {
- return mDone;
+ public boolean hasStarted() {
+ synchronized (mStateLock) {
+ return mItem != null;
+ }
}
@Override
- public int start(int sampleRateInHz, int audioFormat, int channelCount) {
- if (DBG) {
- Log.d(TAG, "start(" + sampleRateInHz + "," + audioFormat
- + "," + channelCount + ")");
+ public boolean hasFinished() {
+ synchronized (mStateLock) {
+ return mDone;
}
+ }
+
+ @Override
+ public int start(int sampleRateInHz, int audioFormat, int channelCount) {
+ if (DBG) Log.d(TAG, "start(" + sampleRateInHz + "," + audioFormat + "," + channelCount
+ + ")");
int channelConfig = BlockingAudioTrack.getChannelConfig(channelCount);
- if (channelConfig == 0) {
- Log.e(TAG, "Unsupported number of channels :" + channelCount);
- return TextToSpeech.ERROR;
- }
synchronized (mStateLock) {
- if (mStopped) {
+ if (channelConfig == 0) {
+ Log.e(TAG, "Unsupported number of channels :" + channelCount);
+ mStatusCode = TextToSpeechClient.Status.ERROR_OUTPUT;
+ return TextToSpeech.ERROR;
+ }
+ if (mStatusCode == TextToSpeechClient.Status.STOPPED) {
if (DBG) Log.d(TAG, "stop() called before start(), returning.");
+ return errorCodeOnStop();
+ }
+ if (mStatusCode != TextToSpeechClient.Status.SUCCESS) {
+ if (DBG) Log.d(TAG, "Error was raised");
+ return TextToSpeech.ERROR;
+ }
+ if (mItem != null) {
+ Log.e(TAG, "Start called twice");
return TextToSpeech.ERROR;
}
SynthesisPlaybackQueueItem item = new SynthesisPlaybackQueueItem(
@@ -161,13 +170,11 @@ class PlaybackSynthesisCallback extends AbstractSynthesisCallback {
return TextToSpeech.SUCCESS;
}
-
@Override
public int audioAvailable(byte[] buffer, int offset, int length) {
- if (DBG) {
- Log.d(TAG, "audioAvailable(byte[" + buffer.length + "],"
- + offset + "," + length + ")");
- }
+ if (DBG) Log.d(TAG, "audioAvailable(byte[" + buffer.length + "]," + offset + "," + length
+ + ")");
+
if (length > getMaxBufferSize() || length <= 0) {
throw new IllegalArgumentException("buffer is too large or of zero length (" +
+ length + " bytes)");
@@ -175,9 +182,17 @@ class PlaybackSynthesisCallback extends AbstractSynthesisCallback {
SynthesisPlaybackQueueItem item = null;
synchronized (mStateLock) {
- if (mItem == null || mStopped) {
+ if (mItem == null) {
+ mStatusCode = TextToSpeechClient.Status.ERROR_OUTPUT;
return TextToSpeech.ERROR;
}
+ if (mStatusCode != TextToSpeechClient.Status.SUCCESS) {
+ if (DBG) Log.d(TAG, "Error was raised");
+ return TextToSpeech.ERROR;
+ }
+ if (mStatusCode == TextToSpeechClient.Status.STOPPED) {
+ return errorCodeOnStop();
+ }
item = mItem;
}
@@ -190,11 +205,13 @@ class PlaybackSynthesisCallback extends AbstractSynthesisCallback {
try {
item.put(bufferCopy);
} catch (InterruptedException ie) {
- return TextToSpeech.ERROR;
+ synchronized (mStateLock) {
+ mStatusCode = TextToSpeechClient.Status.ERROR_OUTPUT;
+ return TextToSpeech.ERROR;
+ }
}
mLogger.onEngineDataReceived();
-
return TextToSpeech.SUCCESS;
}
@@ -202,35 +219,74 @@ class PlaybackSynthesisCallback extends AbstractSynthesisCallback {
public int done() {
if (DBG) Log.d(TAG, "done()");
+ int statusCode = 0;
SynthesisPlaybackQueueItem item = null;
synchronized (mStateLock) {
if (mDone) {
Log.w(TAG, "Duplicate call to done()");
+ // Not an error that would prevent synthesis. Hence no
+ // setStatusCode
return TextToSpeech.ERROR;
}
-
+ if (mStatusCode == TextToSpeechClient.Status.STOPPED) {
+ if (DBG) Log.d(TAG, "Request has been aborted.");
+ return errorCodeOnStop();
+ }
mDone = true;
if (mItem == null) {
+ // .done() was called before .start. Treat it as successful synthesis
+ // for a client, despite service bad implementation.
+ Log.w(TAG, "done() was called before start() call");
+ if (mStatusCode == TextToSpeechClient.Status.SUCCESS) {
+ mDispatcher.dispatchOnSuccess();
+ } else {
+ mDispatcher.dispatchOnError(mStatusCode);
+ }
+ mLogger.onEngineComplete();
return TextToSpeech.ERROR;
}
item = mItem;
+ statusCode = mStatusCode;
}
- item.done();
+ // Signal done or error to item
+ if (statusCode == TextToSpeechClient.Status.SUCCESS) {
+ item.done();
+ } else {
+ item.stop(statusCode);
+ }
mLogger.onEngineComplete();
-
return TextToSpeech.SUCCESS;
}
@Override
public void error() {
+ error(TextToSpeechClient.Status.ERROR_SYNTHESIS);
+ }
+
+ @Override
+ public void error(int errorCode) {
if (DBG) Log.d(TAG, "error() [will call stop]");
- // Currently, this call will not be logged if error( ) is called
- // before start.
- mLogger.onError();
- stopImpl(true);
+ synchronized (mStateLock) {
+ if (mDone) {
+ return;
+ }
+ mStatusCode = errorCode;
+ }
}
+ @Override
+ public int fallback() {
+ synchronized (mStateLock) {
+ if (hasStarted() || hasFinished()) {
+ return TextToSpeech.ERROR;
+ }
+
+ mDispatcher.dispatchOnFallback();
+ mStatusCode = TextToSpeechClient.Status.SUCCESS;
+ return TextToSpeechClient.Status.SUCCESS;
+ }
+ }
}
diff --git a/core/java/android/speech/tts/RequestConfig.java b/core/java/android/speech/tts/RequestConfig.java
new file mode 100644
index 0000000..4b5385f
--- /dev/null
+++ b/core/java/android/speech/tts/RequestConfig.java
@@ -0,0 +1,213 @@
+package android.speech.tts;
+
+import android.media.AudioManager;
+import android.os.Bundle;
+
+/**
+ * Synthesis request configuration.
+ *
+ * This class is immutable, and can only be constructed using
+ * {@link RequestConfig.Builder}.
+ */
+public final class RequestConfig {
+
+ /** Builder for constructing RequestConfig objects. */
+ public static final class Builder {
+ private VoiceInfo mCurrentVoiceInfo;
+ private Bundle mVoiceParams;
+ private Bundle mAudioParams;
+
+ Builder(VoiceInfo currentVoiceInfo, Bundle voiceParams, Bundle audioParams) {
+ mCurrentVoiceInfo = currentVoiceInfo;
+ mVoiceParams = voiceParams;
+ mAudioParams = audioParams;
+ }
+
+ /**
+ * Create new RequestConfig builder.
+ */
+ public static Builder newBuilder() {
+ return new Builder(null, new Bundle(), new Bundle());
+ }
+
+ /**
+ * Create new RequestConfig builder.
+ * @param prototype
+ * Prototype of new RequestConfig. Copies all fields of the
+ * prototype to the constructed object.
+ */
+ public static Builder newBuilder(RequestConfig prototype) {
+ return new Builder(prototype.mCurrentVoiceInfo,
+ (Bundle)prototype.mVoiceParams.clone(),
+ (Bundle)prototype.mAudioParams.clone());
+ }
+
+ /** Set voice for request. Will reset voice parameters to the defaults. */
+ public Builder setVoice(VoiceInfo voice) {
+ mCurrentVoiceInfo = voice;
+ mVoiceParams = (Bundle)voice.getParamsWithDefaults().clone();
+ return this;
+ }
+
+ /**
+ * Set request voice parameter.
+ *
+ * @param paramName
+ * The name of the parameter. It has to be one of the keys
+ * from {@link VoiceInfo#getParamsWithDefaults()}
+ * @param value
+ * Value of the parameter. Its type can be one of: Integer, Float,
+ * Boolean, String, VoiceInfo (will be set as a String, result of a call to
+ * the {@link VoiceInfo#getName()}) or byte[]. It has to be of the same type
+ * as the default value from {@link VoiceInfo#getParamsWithDefaults()}
+ * for that parameter.
+ * @throws IllegalArgumentException
+ * If paramName is not a valid parameter name or its value is of a wrong
+ * type.
+ * @throws IllegalStateException
+ * If no voice is set.
+ */
+ public Builder setVoiceParam(String paramName, Object value){
+ if (mCurrentVoiceInfo == null) {
+ throw new IllegalStateException(
+ "Couldn't set voice parameter, no voice is set");
+ }
+ Object defaultValue = mCurrentVoiceInfo.getParamsWithDefaults().get(paramName);
+ if (defaultValue == null) {
+ throw new IllegalArgumentException(
+ "Parameter \"" + paramName + "\" is not available in set voice with " +
+ "name: " + mCurrentVoiceInfo.getName());
+ }
+
+ // If it's VoiceInfo, get its name
+ if (value instanceof VoiceInfo) {
+ value = ((VoiceInfo)value).getName();
+ }
+
+ // Check type information
+ if (!defaultValue.getClass().equals(value.getClass())) {
+ throw new IllegalArgumentException(
+ "Parameter \"" + paramName +"\" is of different type. Value passed has " +
+ "type " + value.getClass().getSimpleName() + " but should have " +
+ "type " + defaultValue.getClass().getSimpleName());
+ }
+
+ setParam(mVoiceParams, paramName, value);
+ return this;
+ }
+
+ /**
+ * Set request audio parameter.
+ *
+ * Doesn't requires a set voice.
+ *
+ * @param paramName
+ * Name of parameter.
+ * @param value
+ * Value of parameter. Its type can be one of: Integer, Float, Boolean, String
+ * or byte[].
+ */
+ public Builder setAudioParam(String paramName, Object value) {
+ setParam(mAudioParams, paramName, value);
+ return this;
+ }
+
+ /**
+ * Set the {@link TextToSpeechClient.Params#AUDIO_PARAM_STREAM} audio parameter.
+ *
+ * @param streamId One of the STREAM_ constants defined in {@link AudioManager}.
+ */
+ public void setAudioParamStream(int streamId) {
+ setAudioParam(TextToSpeechClient.Params.AUDIO_PARAM_STREAM, streamId);
+ }
+
+ /**
+ * Set the {@link TextToSpeechClient.Params#AUDIO_PARAM_VOLUME} audio parameter.
+ *
+ * @param volume Float in range of 0.0 to 1.0.
+ */
+ public void setAudioParamVolume(float volume) {
+ setAudioParam(TextToSpeechClient.Params.AUDIO_PARAM_VOLUME, volume);
+ }
+
+ /**
+ * Set the {@link TextToSpeechClient.Params#AUDIO_PARAM_PAN} audio parameter.
+ *
+ * @param pan Float in range of -1.0 to +1.0.
+ */
+ public void setAudioParamPan(float pan) {
+ setAudioParam(TextToSpeechClient.Params.AUDIO_PARAM_PAN, pan);
+ }
+
+ private void setParam(Bundle bundle, String featureName, Object value) {
+ if (value instanceof String) {
+ bundle.putString(featureName, (String)value);
+ } else if(value instanceof byte[]) {
+ bundle.putByteArray(featureName, (byte[])value);
+ } else if(value instanceof Integer) {
+ bundle.putInt(featureName, (Integer)value);
+ } else if(value instanceof Float) {
+ bundle.putFloat(featureName, (Float)value);
+ } else if(value instanceof Double) {
+ bundle.putFloat(featureName, (Float)value);
+ } else if(value instanceof Boolean) {
+ bundle.putBoolean(featureName, (Boolean)value);
+ } else {
+ throw new IllegalArgumentException("Illegal type of object");
+ }
+ return;
+ }
+
+ /**
+ * Build new RequestConfig instance.
+ */
+ public RequestConfig build() {
+ RequestConfig config =
+ new RequestConfig(mCurrentVoiceInfo, mVoiceParams, mAudioParams);
+ return config;
+ }
+ }
+
+ private RequestConfig(VoiceInfo voiceInfo, Bundle voiceParams, Bundle audioParams) {
+ mCurrentVoiceInfo = voiceInfo;
+ mVoiceParams = voiceParams;
+ mAudioParams = audioParams;
+ }
+
+ /**
+ * Currently set voice.
+ */
+ private final VoiceInfo mCurrentVoiceInfo;
+
+ /**
+ * Voice parameters bundle.
+ */
+ private final Bundle mVoiceParams;
+
+ /**
+ * Audio parameters bundle.
+ */
+ private final Bundle mAudioParams;
+
+ /**
+ * @return Currently set request voice.
+ */
+ public VoiceInfo getVoice() {
+ return mCurrentVoiceInfo;
+ }
+
+ /**
+ * @return Request audio parameters.
+ */
+ public Bundle getAudioParams() {
+ return mAudioParams;
+ }
+
+ /**
+ * @return Request voice parameters.
+ */
+ public Bundle getVoiceParams() {
+ return mVoiceParams;
+ }
+
+}
diff --git a/core/java/android/speech/tts/RequestConfigHelper.java b/core/java/android/speech/tts/RequestConfigHelper.java
new file mode 100644
index 0000000..b25c985
--- /dev/null
+++ b/core/java/android/speech/tts/RequestConfigHelper.java
@@ -0,0 +1,170 @@
+package android.speech.tts;
+
+import android.speech.tts.TextToSpeechClient.EngineStatus;
+
+import java.util.Locale;
+
+/**
+ * Set of common heuristics for selecting {@link VoiceInfo} from
+ * {@link TextToSpeechClient#getEngineStatus()} output.
+ */
+public final class RequestConfigHelper {
+ private RequestConfigHelper() {}
+
+ /**
+ * Interface for scoring VoiceInfo object.
+ */
+ public static interface VoiceScorer {
+ /**
+ * Score VoiceInfo. If the score is less than or equal to zero, that voice is discarded.
+ * If two voices have same desired primary characteristics (highest quality, lowest
+ * latency or others), the one with the higher score is selected.
+ */
+ public int scoreVoice(VoiceInfo voiceInfo);
+ }
+
+ /**
+ * Score positively voices that exactly match the locale supplied to the constructor.
+ */
+ public static final class ExactLocaleMatcher implements VoiceScorer {
+ private final Locale mLocale;
+
+ /**
+ * Score positively voices that exactly match the given locale
+ * @param locale Reference locale. If null, the default locale will be used.
+ */
+ public ExactLocaleMatcher(Locale locale) {
+ if (locale == null) {
+ mLocale = Locale.getDefault();
+ } else {
+ mLocale = locale;
+ }
+ }
+ @Override
+ public int scoreVoice(VoiceInfo voiceInfo) {
+ return mLocale.equals(voiceInfo.getLocale()) ? 1 : 0;
+ }
+ }
+
+ /**
+ * Score positively voices that match exactly the given locale (score 3)
+ * or that share same language and country (score 2), or that share just a language (score 1).
+ */
+ public static final class LanguageMatcher implements VoiceScorer {
+ private final Locale mLocale;
+
+ /**
+ * Score positively voices with similar locale.
+ * @param locale Reference locale. If null, default will be used.
+ */
+ public LanguageMatcher(Locale locale) {
+ if (locale == null) {
+ mLocale = Locale.getDefault();
+ } else {
+ mLocale = locale;
+ }
+ }
+
+ @Override
+ public int scoreVoice(VoiceInfo voiceInfo) {
+ final Locale voiceLocale = voiceInfo.getLocale();
+ if (mLocale.equals(voiceLocale)) {
+ return 3;
+ } else {
+ if (mLocale.getLanguage().equals(voiceLocale.getLanguage())) {
+ if (mLocale.getCountry().equals(voiceLocale.getCountry())) {
+ return 2;
+ }
+ return 1;
+ }
+ return 0;
+ }
+ }
+ }
+
+ /**
+ * Get the highest quality voice from voices that score more than zero from the passed scorer.
+ * If there is more than one voice with the same highest quality, then this method returns one
+ * with the highest score. If they share same score as well, one with the lower index in the
+ * voices list is returned.
+ *
+ * @param engineStatus
+ * Voices status received from a {@link TextToSpeechClient#getEngineStatus()} call.
+ * @param voiceScorer
+ * Used to discard unsuitable voices and help settle cases where more than
+ * one voice has the desired characteristic.
+ * @param hasToBeEmbedded
+ * If true, require the voice to be an embedded voice (no network
+ * access will be required for synthesis).
+ */
+ private static VoiceInfo getHighestQualityVoice(EngineStatus engineStatus,
+ VoiceScorer voiceScorer, boolean hasToBeEmbedded) {
+ VoiceInfo bestVoice = null;
+ int bestScoreMatch = 1;
+ int bestVoiceQuality = 0;
+
+ for (VoiceInfo voice : engineStatus.getVoices()) {
+ int score = voiceScorer.scoreVoice(voice);
+ if (score <= 0 || hasToBeEmbedded && voice.getRequiresNetworkConnection()
+ || voice.getQuality() < bestVoiceQuality) {
+ continue;
+ }
+
+ if (bestVoice == null ||
+ voice.getQuality() > bestVoiceQuality ||
+ score > bestScoreMatch) {
+ bestVoice = voice;
+ bestScoreMatch = score;
+ bestVoiceQuality = voice.getQuality();
+ }
+ }
+ return bestVoice;
+ }
+
+ /**
+ * Get highest quality voice.
+ *
+ * Highest quality voice is selected from voices that score more than zero from the passed
+ * scorer. If there is more than one voice with the same highest quality, then this method
+ * will return one with the highest score. If they share same score as well, one with the lower
+ * index in the voices list is returned.
+
+ * @param engineStatus
+ * Voices status received from a {@link TextToSpeechClient#getEngineStatus()} call.
+ * @param hasToBeEmbedded
+ * If true, require the voice to be an embedded voice (no network
+ * access will be required for synthesis).
+ * @param voiceScorer
+ * Scorer is used to discard unsuitable voices and help settle cases where more than
+ * one voice has highest quality.
+ * @return RequestConfig with selected voice or null if suitable voice was not found.
+ */
+ public static RequestConfig highestQuality(EngineStatus engineStatus,
+ boolean hasToBeEmbedded, VoiceScorer voiceScorer) {
+ VoiceInfo voice = getHighestQualityVoice(engineStatus, voiceScorer, hasToBeEmbedded);
+ if (voice == null) {
+ return null;
+ }
+ return RequestConfig.Builder.newBuilder().setVoice(voice).build();
+ }
+
+ /**
+ * Get highest quality voice for the default locale.
+ *
+ * Call {@link #highestQuality(EngineStatus, boolean, VoiceScorer)} with
+ * {@link LanguageMatcher} set to device default locale.
+ *
+ * @param engineStatus
+ * Voices status received from a {@link TextToSpeechClient#getEngineStatus()} call.
+ * @param hasToBeEmbedded
+ * If true, require the voice to be an embedded voice (no network
+ * access will be required for synthesis).
+ * @return RequestConfig with selected voice or null if suitable voice was not found.
+ */
+ public static RequestConfig highestQuality(EngineStatus engineStatus,
+ boolean hasToBeEmbedded) {
+ return highestQuality(engineStatus, hasToBeEmbedded,
+ new LanguageMatcher(Locale.getDefault()));
+ }
+
+}
diff --git a/core/java/android/speech/tts/SilencePlaybackQueueItem.java b/core/java/android/speech/tts/SilencePlaybackQueueItem.java
index a5e47ae..88b7c70 100644
--- a/core/java/android/speech/tts/SilencePlaybackQueueItem.java
+++ b/core/java/android/speech/tts/SilencePlaybackQueueItem.java
@@ -17,7 +17,6 @@ package android.speech.tts;
import android.os.ConditionVariable;
import android.speech.tts.TextToSpeechService.UtteranceProgressDispatcher;
-import android.util.Log;
class SilencePlaybackQueueItem extends PlaybackQueueItem {
private final ConditionVariable mCondVar = new ConditionVariable();
@@ -32,14 +31,20 @@ class SilencePlaybackQueueItem extends PlaybackQueueItem {
@Override
public void run() {
getDispatcher().dispatchOnStart();
+ boolean wasStopped = false;
if (mSilenceDurationMs > 0) {
- mCondVar.block(mSilenceDurationMs);
+ wasStopped = mCondVar.block(mSilenceDurationMs);
}
- getDispatcher().dispatchOnDone();
+ if (wasStopped) {
+ getDispatcher().dispatchOnStop();
+ } else {
+ getDispatcher().dispatchOnSuccess();
+ }
+
}
@Override
- void stop(boolean isError) {
+ void stop(int errorCode) {
mCondVar.open();
}
}
diff --git a/core/java/android/speech/tts/SynthesisCallback.java b/core/java/android/speech/tts/SynthesisCallback.java
index f98bb09..bc2f239 100644
--- a/core/java/android/speech/tts/SynthesisCallback.java
+++ b/core/java/android/speech/tts/SynthesisCallback.java
@@ -26,7 +26,9 @@ package android.speech.tts;
* indicate that an error has occurred, but if the call is made after a call
* to {@link #done}, it might be discarded.
*
- * After {@link #start} been called, {@link #done} must be called regardless of errors.
+ * {@link #done} must be called at the end of synthesis, regardless of errors.
+ *
+ * All methods can be only called on the synthesis thread.
*/
public interface SynthesisCallback {
/**
@@ -41,13 +43,16 @@ public interface SynthesisCallback {
* request.
*
* This method should only be called on the synthesis thread,
- * while in {@link TextToSpeechService#onSynthesizeText}.
+ * while in {@link TextToSpeechService#onSynthesizeText} or
+ * {@link TextToSpeechService#onSynthesizeTextV2}.
*
* @param sampleRateInHz Sample rate in HZ of the generated audio.
* @param audioFormat Audio format of the generated audio. Must be one of
* the ENCODING_ constants defined in {@link android.media.AudioFormat}.
* @param channelCount The number of channels. Must be {@code 1} or {@code 2}.
- * @return {@link TextToSpeech#SUCCESS} or {@link TextToSpeech#ERROR}.
+ * @return {@link TextToSpeech#SUCCESS}, {@link TextToSpeech#ERROR}.
+ * {@link TextToSpeechClient.Status#STOPPED} is also possible if called in context of
+ * {@link TextToSpeechService#onSynthesizeTextV2}.
*/
public int start(int sampleRateInHz, int audioFormat, int channelCount);
@@ -55,7 +60,8 @@ public interface SynthesisCallback {
* The service should call this method when synthesized audio is ready for consumption.
*
* This method should only be called on the synthesis thread,
- * while in {@link TextToSpeechService#onSynthesizeText}.
+ * while in {@link TextToSpeechService#onSynthesizeText} or
+ * {@link TextToSpeechService#onSynthesizeTextV2}.
*
* @param buffer The generated audio data. This method will not hold on to {@code buffer},
* so the caller is free to modify it after this method returns.
@@ -63,6 +69,8 @@ public interface SynthesisCallback {
* @param length The number of bytes of audio data in {@code buffer}. This must be
* less than or equal to the return value of {@link #getMaxBufferSize}.
* @return {@link TextToSpeech#SUCCESS} or {@link TextToSpeech#ERROR}.
+ * {@link TextToSpeechClient.Status#STOPPED} is also possible if called in context of
+ * {@link TextToSpeechService#onSynthesizeTextV2}.
*/
public int audioAvailable(byte[] buffer, int offset, int length);
@@ -71,11 +79,14 @@ public interface SynthesisCallback {
* been passed to {@link #audioAvailable}.
*
* This method should only be called on the synthesis thread,
- * while in {@link TextToSpeechService#onSynthesizeText}.
+ * while in {@link TextToSpeechService#onSynthesizeText} or
+ * {@link TextToSpeechService#onSynthesizeTextV2}.
*
- * This method has to be called if {@link #start} was called.
+ * This method has to be called if {@link #start} and/or {@link #error} was called.
*
* @return {@link TextToSpeech#SUCCESS} or {@link TextToSpeech#ERROR}.
+ * {@link TextToSpeechClient.Status#STOPPED} is also possible if called in context of
+ * {@link TextToSpeechService#onSynthesizeTextV2}.
*/
public int done();
@@ -87,4 +98,58 @@ public interface SynthesisCallback {
*/
public void error();
-} \ No newline at end of file
+
+ /**
+ * The service should call this method if the speech synthesis fails.
+ *
+ * This method should only be called on the synthesis thread,
+ * while in {@link TextToSpeechService#onSynthesizeText} or
+ * {@link TextToSpeechService#onSynthesizeTextV2}.
+ *
+ * @param errorCode Error code to pass to the client. One of the ERROR_ values from
+ * {@link TextToSpeechClient.Status}
+ */
+ public void error(int errorCode);
+
+ /**
+ * Communicate to client that the original request can't be done and client-requested
+ * fallback is happening.
+ *
+ * Fallback can be requested by the client by setting
+ * {@link TextToSpeechClient.Params#FALLBACK_VOICE_NAME} voice parameter with a id of
+ * the voice that is expected to be used for the fallback.
+ *
+ * This method will fail if user called {@link #start(int, int, int)} and/or
+ * {@link #done()}.
+ *
+ * This method should only be called on the synthesis thread,
+ * while in {@link TextToSpeechService#onSynthesizeTextV2}.
+ *
+ * @return {@link TextToSpeech#SUCCESS}, {@link TextToSpeech#ERROR} if client already
+ * called {@link #start(int, int, int)}, {@link TextToSpeechClient.Status#STOPPED}
+ * if stop was requested.
+ */
+ public int fallback();
+
+ /**
+ * Check if {@link #start} was called or not.
+ *
+ * This method should only be called on the synthesis thread,
+ * while in {@link TextToSpeechService#onSynthesizeText} or
+ * {@link TextToSpeechService#onSynthesizeTextV2}.
+ *
+ * Useful for checking if a fallback from network request is possible.
+ */
+ public boolean hasStarted();
+
+ /**
+ * Check if {@link #done} was called or not.
+ *
+ * This method should only be called on the synthesis thread,
+ * while in {@link TextToSpeechService#onSynthesizeText} or
+ * {@link TextToSpeechService#onSynthesizeTextV2}.
+ *
+ * Useful for checking if a fallback from network request is possible.
+ */
+ public boolean hasFinished();
+}
diff --git a/core/java/android/speech/tts/SynthesisPlaybackQueueItem.java b/core/java/android/speech/tts/SynthesisPlaybackQueueItem.java
index e853c9e..b424356 100644
--- a/core/java/android/speech/tts/SynthesisPlaybackQueueItem.java
+++ b/core/java/android/speech/tts/SynthesisPlaybackQueueItem.java
@@ -57,23 +57,22 @@ final class SynthesisPlaybackQueueItem extends PlaybackQueueItem {
*/
private volatile boolean mStopped;
private volatile boolean mDone;
- private volatile boolean mIsError;
+ private volatile int mStatusCode;
private final BlockingAudioTrack mAudioTrack;
- private final EventLogger mLogger;
-
+ private final AbstractEventLogger mLogger;
SynthesisPlaybackQueueItem(int streamType, int sampleRate,
int audioFormat, int channelCount,
float volume, float pan, UtteranceProgressDispatcher dispatcher,
- Object callerIdentity, EventLogger logger) {
+ Object callerIdentity, AbstractEventLogger logger) {
super(dispatcher, callerIdentity);
mUnconsumedBytes = 0;
mStopped = false;
mDone = false;
- mIsError = false;
+ mStatusCode = TextToSpeechClient.Status.SUCCESS;
mAudioTrack = new BlockingAudioTrack(streamType, sampleRate, audioFormat,
channelCount, volume, pan);
@@ -86,9 +85,8 @@ final class SynthesisPlaybackQueueItem extends PlaybackQueueItem {
final UtteranceProgressDispatcher dispatcher = getDispatcher();
dispatcher.dispatchOnStart();
-
if (!mAudioTrack.init()) {
- dispatcher.dispatchOnError();
+ dispatcher.dispatchOnError(TextToSpeechClient.Status.ERROR_OUTPUT);
return;
}
@@ -112,23 +110,25 @@ final class SynthesisPlaybackQueueItem extends PlaybackQueueItem {
mAudioTrack.waitAndRelease();
- if (mIsError) {
- dispatcher.dispatchOnError();
+ if (mStatusCode == TextToSpeechClient.Status.SUCCESS) {
+ dispatcher.dispatchOnSuccess();
+ } else if(mStatusCode == TextToSpeechClient.Status.STOPPED) {
+ dispatcher.dispatchOnStop();
} else {
- dispatcher.dispatchOnDone();
+ dispatcher.dispatchOnError(mStatusCode);
}
- mLogger.onWriteData();
+ mLogger.onCompleted(mStatusCode);
}
@Override
- void stop(boolean isError) {
+ void stop(int statusCode) {
try {
mListLock.lock();
// Update our internal state.
mStopped = true;
- mIsError = isError;
+ mStatusCode = statusCode;
// Wake up the audio playback thread if it was waiting on take().
// take() will return null since mStopped was true, and will then
diff --git a/core/java/android/speech/tts/SynthesisRequestV2.aidl b/core/java/android/speech/tts/SynthesisRequestV2.aidl
new file mode 100644
index 0000000..2ac7da6
--- /dev/null
+++ b/core/java/android/speech/tts/SynthesisRequestV2.aidl
@@ -0,0 +1,20 @@
+/*
+**
+** Copyright 2013, 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.tts;
+
+parcelable SynthesisRequestV2; \ No newline at end of file
diff --git a/core/java/android/speech/tts/SynthesisRequestV2.java b/core/java/android/speech/tts/SynthesisRequestV2.java
new file mode 100644
index 0000000..ed268b7
--- /dev/null
+++ b/core/java/android/speech/tts/SynthesisRequestV2.java
@@ -0,0 +1,132 @@
+package android.speech.tts;
+
+import android.os.Bundle;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.speech.tts.TextToSpeechClient.UtteranceId;
+
+/**
+ * Service-side representation of a synthesis request from a V2 API client. Contains:
+ * <ul>
+ * <li>The utterance to synthesize</li>
+ * <li>The id of the utterance (String, result of {@link UtteranceId#toUniqueString()}</li>
+ * <li>The synthesis voice name (String, result of {@link VoiceInfo#getName()})</li>
+ * <li>Voice parameters (Bundle of parameters)</li>
+ * <li>Audio parameters (Bundle of parameters)</li>
+ * </ul>
+ */
+public final class SynthesisRequestV2 implements Parcelable {
+ /** Synthesis utterance. */
+ private final String mText;
+
+ /** Synthesis id. */
+ private final String mUtteranceId;
+
+ /** Voice ID. */
+ private final String mVoiceName;
+
+ /** Voice Parameters. */
+ private final Bundle mVoiceParams;
+
+ /** Audio Parameters. */
+ private final Bundle mAudioParams;
+
+ /**
+ * Parcel based constructor.
+ *
+ * @hide
+ */
+ public SynthesisRequestV2(Parcel in) {
+ this.mText = in.readString();
+ this.mUtteranceId = in.readString();
+ this.mVoiceName = in.readString();
+ this.mVoiceParams = in.readBundle();
+ this.mAudioParams = in.readBundle();
+ }
+
+ SynthesisRequestV2(String text, String utteranceId, RequestConfig rconfig) {
+ this.mText = text;
+ this.mUtteranceId = utteranceId;
+ this.mVoiceName = rconfig.getVoice().getName();
+ this.mVoiceParams = rconfig.getVoiceParams();
+ this.mAudioParams = rconfig.getAudioParams();
+ }
+
+ /**
+ * Write to parcel.
+ *
+ * @hide
+ */
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeString(mText);
+ dest.writeString(mUtteranceId);
+ dest.writeString(mVoiceName);
+ dest.writeBundle(mVoiceParams);
+ dest.writeBundle(mAudioParams);
+ }
+
+ /**
+ * @return the text which should be synthesized.
+ */
+ public String getText() {
+ return mText;
+ }
+
+ /**
+ * @return the id of the synthesis request. It's an output of a call to the
+ * {@link UtteranceId#toUniqueString()} method of the {@link UtteranceId} associated with
+ * this request.
+ */
+ public String getUtteranceId() {
+ return mUtteranceId;
+ }
+
+ /**
+ * @return the name of the voice to use for this synthesis request. Result of a call to
+ * the {@link VoiceInfo#getName()} method.
+ */
+ public String getVoiceName() {
+ return mVoiceName;
+ }
+
+ /**
+ * @return bundle of voice parameters.
+ */
+ public Bundle getVoiceParams() {
+ return mVoiceParams;
+ }
+
+ /**
+ * @return bundle of audio parameters.
+ */
+ public Bundle getAudioParams() {
+ return mAudioParams;
+ }
+
+ /**
+ * Parcel creators.
+ *
+ * @hide
+ */
+ public static final Parcelable.Creator<SynthesisRequestV2> CREATOR =
+ new Parcelable.Creator<SynthesisRequestV2>() {
+ @Override
+ public SynthesisRequestV2 createFromParcel(Parcel source) {
+ return new SynthesisRequestV2(source);
+ }
+
+ @Override
+ public SynthesisRequestV2[] newArray(int size) {
+ return new SynthesisRequestV2[size];
+ }
+ };
+
+ /**
+ * @hide
+ */
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+}
diff --git a/core/java/android/speech/tts/TextToSpeech.java b/core/java/android/speech/tts/TextToSpeech.java
index 2752085..02152fb 100644
--- a/core/java/android/speech/tts/TextToSpeech.java
+++ b/core/java/android/speech/tts/TextToSpeech.java
@@ -54,7 +54,9 @@ import java.util.Set;
* When you are done using the TextToSpeech instance, call the {@link #shutdown()} method
* to release the native resources used by the TextToSpeech engine.
*
+ * @deprecated Use {@link TextToSpeechClient} instead
*/
+@Deprecated
public class TextToSpeech {
private static final String TAG = "TextToSpeech";
@@ -970,7 +972,7 @@ public class TextToSpeech {
@Override
public Integer run(ITextToSpeechService service) throws RemoteException {
return service.playSilence(getCallerIdentity(), durationInMs, queueMode,
- getParams(params));
+ params == null ? null : params.get(Engine.KEY_PARAM_UTTERANCE_ID));
}
}, ERROR, "playSilence");
}
@@ -1443,8 +1445,17 @@ public class TextToSpeech {
private boolean mEstablished;
private final ITextToSpeechCallback.Stub mCallback = new ITextToSpeechCallback.Stub() {
+ public void onStop(String utteranceId) throws RemoteException {
+ // do nothing
+ };
+
+ @Override
+ public void onFallback(String utteranceId) throws RemoteException {
+ // do nothing
+ }
+
@Override
- public void onDone(String utteranceId) {
+ public void onSuccess(String utteranceId) {
UtteranceProgressListener listener = mUtteranceProgressListener;
if (listener != null) {
listener.onDone(utteranceId);
@@ -1452,7 +1463,7 @@ public class TextToSpeech {
}
@Override
- public void onError(String utteranceId) {
+ public void onError(String utteranceId, int errorCode) {
UtteranceProgressListener listener = mUtteranceProgressListener;
if (listener != null) {
listener.onError(utteranceId);
@@ -1466,6 +1477,11 @@ public class TextToSpeech {
listener.onStart(utteranceId);
}
}
+
+ @Override
+ public void onVoicesInfoChange(List<VoiceInfo> voicesInfo) throws RemoteException {
+ // Ignore it
+ }
};
private class SetupConnectionAsyncTask extends AsyncTask<Void, Void, Integer> {
diff --git a/core/java/android/speech/tts/TextToSpeechClient.java b/core/java/android/speech/tts/TextToSpeechClient.java
new file mode 100644
index 0000000..9a98e1c
--- /dev/null
+++ b/core/java/android/speech/tts/TextToSpeechClient.java
@@ -0,0 +1,1055 @@
+/*
+ * Copyright (C) 2013 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.tts;
+
+import android.app.Activity;
+import android.app.Application;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.ServiceConnection;
+import android.media.AudioManager;
+import android.net.Uri;
+import android.os.AsyncTask;
+import android.os.IBinder;
+import android.os.ParcelFileDescriptor;
+import android.os.RemoteException;
+import android.speech.tts.ITextToSpeechCallback;
+import android.speech.tts.ITextToSpeechService;
+import android.speech.tts.TextToSpeech.Engine;
+import android.util.Log;
+import android.util.Pair;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * Synthesizes speech from text for immediate playback or to create a sound
+ * file.
+ * <p>
+ * This is an updated version of the speech synthesis client that supersedes
+ * {@link android.speech.tts.TextToSpeech}.
+ * <p>
+ * A TextToSpeechClient instance can only be used to synthesize text once it has
+ * connected to the service. The TextToSpeechClient instance will start establishing
+ * the connection after a call to the {@link #connect()} method. This is usually done in
+ * {@link Application#onCreate()} or {@link Activity#onCreate}. When the connection
+ * is established, the instance will call back using the
+ * {@link TextToSpeechClient.ConnectionCallbacks} interface. Only after a
+ * successful callback is the client usable.
+ * <p>
+ * After successful connection, the list of all available voices can be obtained
+ * by calling the {@link TextToSpeechClient#getEngineStatus() method. The client can
+ * choose a voice using some custom heuristic and build a {@link RequestConfig} object
+ * using {@link RequestConfig.Builder}, or can use one of the common heuristics found
+ * in ({@link RequestConfigHelper}.
+ * <p>
+ * When you are done using the TextToSpeechClient instance, call the
+ * {@link #disconnect()} method to release the connection.
+ * <p>
+ * In the rare case of a change to the set of available voices, the service will call to the
+ * {@link ConnectionCallbacks#onEngineStatusChange} with new set of available voices as argument.
+ * In response, the client HAVE to recreate all {@link RequestConfig} instances in use.
+ */
+public final class TextToSpeechClient {
+ private static final String TAG = TextToSpeechClient.class.getSimpleName();
+
+ private final Object mLock = new Object();
+ private final TtsEngines mEnginesHelper;
+ private final Context mContext;
+
+ // Guarded by mLock
+ private Connection mServiceConnection;
+ private final RequestCallbacks mDefaultRequestCallbacks;
+ private final ConnectionCallbacks mConnectionCallbacks;
+ private EngineStatus mEngineStatus;
+ private String mRequestedEngine;
+ private boolean mFallbackToDefault;
+ private HashMap<String, Pair<UtteranceId, RequestCallbacks>> mCallbacks;
+ // Guarded by mLock
+
+ /** Common voices parameters */
+ public static final class Params {
+ private Params() {}
+
+ /**
+ * Maximum allowed time for a single request attempt, in milliseconds, before synthesis
+ * fails (or fallback request starts, if requested using
+ * {@link #FALLBACK_VOICE_NAME}).
+ */
+ public static final String NETWORK_TIMEOUT_MS = "networkTimeoutMs";
+
+ /**
+ * Number of network request retries that are attempted in case of failure
+ */
+ public static final String NETWORK_RETRIES_COUNT = "networkRetriesCount";
+
+ /**
+ * Should synthesizer report sub-utterance progress on synthesis. Only applicable
+ * for the {@link TextToSpeechClient#queueSpeak} method.
+ */
+ public static final String TRACK_SUBUTTERANCE_PROGRESS = "trackSubutteranceProgress";
+
+ /**
+ * If a voice exposes this parameter then it supports the fallback request feature.
+ *
+ * If it is set to a valid name of some other voice ({@link VoiceInfo#getName()}) then
+ * in case of request failure (due to network problems or missing data), fallback request
+ * will be attempted. Request will be done using the voice referenced by this parameter.
+ * If it is the case, the client will be informed by a callback to the {@link
+ * RequestCallbacks#onSynthesisFallback(UtteranceId)}.
+ */
+ public static final String FALLBACK_VOICE_NAME = "fallbackVoiceName";
+
+ /**
+ * Audio parameter for specifying a linear multiplier to the speaking speed of the voice.
+ * The value is a float. Values below zero decrease speed of the synthesized speech
+ * values above one increase it. If the value of this parameter is equal to zero,
+ * then it will be replaced by a settings-configurable default before it reaches
+ * TTS service.
+ */
+ public static final String SPEECH_SPEED = "speechSpeed";
+
+ /**
+ * Audio parameter for controlling the pitch of the output. The Value is a positive float,
+ * with default of {@code 1.0}. The value is used to scale the primary frequency linearly.
+ * Lower values lower the tone of the synthesized voice, greater values increase it.
+ */
+ public static final String SPEECH_PITCH = "speechPitch";
+
+ /**
+ * Audio parameter for controlling output volume. Value is a float with scale of 0 to 1
+ */
+ public static final String AUDIO_PARAM_VOLUME = TextToSpeech.Engine.KEY_PARAM_VOLUME;
+
+ /**
+ * Audio parameter for controlling output pan.
+ * Value is a float ranging from -1 to +1 where -1 maps to a hard-left pan,
+ * 0 to center (the default behavior), and +1 to hard-right.
+ */
+ public static final String AUDIO_PARAM_PAN = TextToSpeech.Engine.KEY_PARAM_PAN;
+
+ /**
+ * Audio parameter for specifying the audio stream type to be used when speaking text
+ * or playing back a file. The value should be one of the STREAM_ constants
+ * defined in {@link AudioManager}.
+ */
+ public static final String AUDIO_PARAM_STREAM = TextToSpeech.Engine.KEY_PARAM_STREAM;
+ }
+
+ /**
+ * Result codes for TTS operations.
+ */
+ public static final class Status {
+ private Status() {}
+
+ /**
+ * Denotes a successful operation.
+ */
+ public static final int SUCCESS = 0;
+
+ /**
+ * Denotes a stop requested by a client. It's used only on the service side of the API,
+ * client should never expect to see this result code.
+ */
+ public static final int STOPPED = 100;
+
+ /**
+ * Denotes a generic failure.
+ */
+ public static final int ERROR_UNKNOWN = -1;
+
+ /**
+ * Denotes a failure of a TTS engine to synthesize the given input.
+ */
+ public static final int ERROR_SYNTHESIS = 10;
+
+ /**
+ * Denotes a failure of a TTS service.
+ */
+ public static final int ERROR_SERVICE = 11;
+
+ /**
+ * Denotes a failure related to the output (audio device or a file).
+ */
+ public static final int ERROR_OUTPUT = 12;
+
+ /**
+ * Denotes a failure caused by a network connectivity problems.
+ */
+ public static final int ERROR_NETWORK = 13;
+
+ /**
+ * Denotes a failure caused by network timeout.
+ */
+ public static final int ERROR_NETWORK_TIMEOUT = 14;
+
+ /**
+ * Denotes a failure caused by an invalid request.
+ */
+ public static final int ERROR_INVALID_REQUEST = 15;
+
+ /**
+ * Denotes a failure related to passing a non-unique utterance id.
+ */
+ public static final int ERROR_NON_UNIQUE_UTTERANCE_ID = 16;
+
+ /**
+ * Denotes a failure related to missing data. The TTS implementation may download
+ * the missing data, and if so, request will succeed in future. This error can only happen
+ * for voices with {@link VoiceInfo#FEATURE_MAY_AUTOINSTALL} feature.
+ * Note: the recommended way to avoid this error is to create a request with the fallback
+ * voice.
+ */
+ public static final int ERROR_DOWNLOADING_ADDITIONAL_DATA = 17;
+ }
+
+ /**
+ * Set of callbacks for the events related to the progress of a synthesis request
+ * through the synthesis queue. Each synthesis request is associated with a call to
+ * {@link #queueSpeak} or {@link #queueSynthesizeToFile}.
+ *
+ * The callbacks specified in this method will NOT be called on UI thread.
+ */
+ public static abstract class RequestCallbacks {
+ /**
+ * Called after synthesis of utterance successfully starts.
+ */
+ public void onSynthesisStart(UtteranceId utteranceId) {}
+
+ /**
+ * Called after synthesis successfully finishes.
+ * @param utteranceId
+ * Unique identifier of synthesized utterance.
+ */
+ public void onSynthesisSuccess(UtteranceId utteranceId) {}
+
+ /**
+ * Called after synthesis was stopped in middle of synthesis process.
+ * @param utteranceId
+ * Unique identifier of synthesized utterance.
+ */
+ public void onSynthesisStop(UtteranceId utteranceId) {}
+
+ /**
+ * Called when requested synthesis failed and fallback synthesis is about to be attempted.
+ *
+ * Requires voice with available {@link TextToSpeechClient.Params#FALLBACK_VOICE_NAME}
+ * parameter, and request with this parameter enabled.
+ *
+ * This callback will be followed by callback to the {@link #onSynthesisStart},
+ * {@link #onSynthesisFailure} or {@link #onSynthesisSuccess} that depends on the
+ * fallback outcome.
+ *
+ * For more fallback feature reference, look at the
+ * {@link TextToSpeechClient.Params#FALLBACK_VOICE_NAME}.
+ *
+ * @param utteranceId
+ * Unique identifier of synthesized utterance.
+ */
+ public void onSynthesisFallback(UtteranceId utteranceId) {}
+
+ /**
+ * Called after synthesis of utterance fails.
+ *
+ * It may be called instead or after a {@link #onSynthesisStart} callback.
+ *
+ * @param utteranceId
+ * Unique identifier of synthesized utterance.
+ * @param errorCode
+ * One of the values from {@link Status}.
+ */
+ public void onSynthesisFailure(UtteranceId utteranceId, int errorCode) {}
+
+ /**
+ * Called during synthesis to mark synthesis progress.
+ *
+ * Requires voice with available
+ * {@link TextToSpeechClient.Params#TRACK_SUBUTTERANCE_PROGRESS} parameter, and
+ * request with this parameter enabled.
+ *
+ * @param utteranceId
+ * Unique identifier of synthesized utterance.
+ * @param charIndex
+ * String index (java char offset) of recently synthesized character.
+ * @param msFromStart
+ * Miliseconds from the start of the synthesis.
+ */
+ public void onSynthesisProgress(UtteranceId utteranceId, int charIndex, int msFromStart) {}
+ }
+
+ /**
+ * Interface definition of callbacks that are called when the client is
+ * connected or disconnected from the TTS service.
+ */
+ public static interface ConnectionCallbacks {
+ /**
+ * After calling {@link TextToSpeechClient#connect()}, this method will be invoked
+ * asynchronously when the connect request has successfully completed.
+ *
+ * Clients are strongly encouraged to call {@link TextToSpeechClient#getEngineStatus()}
+ * and create {@link RequestConfig} objects used in subsequent synthesis requests.
+ */
+ public void onConnectionSuccess();
+
+ /**
+ * After calling {@link TextToSpeechClient#connect()}, this method may be invoked
+ * asynchronously when the connect request has failed to complete.
+ *
+ * It may be also invoked synchronously, from the body of
+ * {@link TextToSpeechClient#connect()} method.
+ */
+ public void onConnectionFailure();
+
+ /**
+ * Called when the connection to the service is lost. This can happen if there is a problem
+ * with the speech service (e.g. a crash or resource problem causes it to be killed by the
+ * system). When called, all requests have been canceled and no outstanding listeners will
+ * be executed. Applications should disable UI components that require the service.
+ */
+ public void onServiceDisconnected();
+
+ /**
+ * After receiving {@link #onConnectionSuccess()} callback, this method may be invoked
+ * if engine status obtained from {@link TextToSpeechClient#getEngineStatus()}) changes.
+ * It usually means that some voices were removed, changed or added.
+ *
+ * Clients are required to recreate {@link RequestConfig} objects used in subsequent
+ * synthesis requests.
+ */
+ public void onEngineStatusChange(EngineStatus newEngineStatus);
+ }
+
+ /** State of voices as provided by engine and user. */
+ public static final class EngineStatus {
+ /** All available voices. */
+ private final List<VoiceInfo> mVoices;
+
+ /** Name of the TTS engine package */
+ private final String mPackageName;
+
+ private EngineStatus(String packageName, List<VoiceInfo> voices) {
+ this.mVoices = Collections.unmodifiableList(voices);
+ this.mPackageName = packageName;
+ }
+
+ /**
+ * Get an immutable list of all Voices exposed by the TTS engine.
+ */
+ public List<VoiceInfo> getVoices() {
+ return mVoices;
+ }
+
+ /**
+ * Get name of the TTS engine package currently in use.
+ */
+ public String getEnginePackage() {
+ return mPackageName;
+ }
+ }
+
+ /** Unique synthesis request identifier. */
+ public static final class UtteranceId {
+ private final String mDescription;
+ /**
+ * Create new, unique UtteranceId instance.
+ */
+ public UtteranceId() {
+ mDescription = null;
+ }
+
+ /**
+ * Create new, unique UtteranceId instance.
+ *
+ * @param description Additional string, that will be appended to
+ * {@link #toUniqueString()} output, allowing easier identification of the utterance in
+ * callbacks.
+ */
+ public UtteranceId(String description) {
+ mDescription = description;
+ }
+
+ /**
+ * Returns a unique string associated with an instance of this object.
+ *
+ * If you subclass {@link UtteranceId} make sure that output of this method is
+ * consistent across multiple calls and unique for the instance.
+ *
+ * This string will be used to identify the synthesis request/utterance inside the
+ * TTS service.
+ */
+ public String toUniqueString() {
+ return mDescription == null ? "UtteranceId" + System.identityHashCode(this) :
+ "UtteranceId" + System.identityHashCode(this) + ": " + mDescription;
+ }
+ }
+
+ /**
+ * Create TextToSpeech service client.
+ *
+ * Will connect to the default TTS service. In order to be usable, {@link #connect()} need
+ * to be called first and successful connection callback need to be received.
+ *
+ * @param context
+ * The context this instance is running in.
+ * @param engine
+ * Package name of requested TTS engine. If it's null, then default engine will
+ * be selected regardless of {@code fallbackToDefaultEngine} parameter value.
+ * @param fallbackToDefaultEngine
+ * If requested engine is not available, should we fallback to the default engine?
+ * @param defaultRequestCallbacks
+ * Default request callbacks, it will be used for all synthesis requests without
+ * supplied RequestCallbacks instance. Can't be null.
+ * @param connectionCallbacks
+ * Callbacks for connecting and disconnecting from the service. Can't be null.
+ */
+ public TextToSpeechClient(Context context,
+ String engine, boolean fallbackToDefaultEngine,
+ RequestCallbacks defaultRequestCallbacks,
+ ConnectionCallbacks connectionCallbacks) {
+ if (context == null)
+ throw new IllegalArgumentException("context can't be null");
+ if (defaultRequestCallbacks == null)
+ throw new IllegalArgumentException("defaultRequestCallbacks can't be null");
+ if (connectionCallbacks == null)
+ throw new IllegalArgumentException("connectionCallbacks can't be null");
+ mContext = context;
+ mEnginesHelper = new TtsEngines(mContext);
+ mCallbacks = new HashMap<String, Pair<UtteranceId, RequestCallbacks>>();
+ mDefaultRequestCallbacks = defaultRequestCallbacks;
+ mConnectionCallbacks = connectionCallbacks;
+
+ mRequestedEngine = engine;
+ mFallbackToDefault = fallbackToDefaultEngine;
+ }
+
+ /**
+ * Create TextToSpeech service client. Will connect to the default TTS
+ * service. In order to be usable, {@link #connect()} need to be called
+ * first and successful connection callback need to be received.
+ *
+ * @param context Context this instance is running in.
+ * @param defaultRequestCallbacks Default request callbacks, it
+ * will be used for all synthesis requests without supplied
+ * RequestCallbacks instance. Can't be null.
+ * @param connectionCallbacks Callbacks for connecting and disconnecting
+ * from the service. Can't be null.
+ */
+ public TextToSpeechClient(Context context, RequestCallbacks defaultRequestCallbacks,
+ ConnectionCallbacks connectionCallbacks) {
+ this(context, null, true, defaultRequestCallbacks, connectionCallbacks);
+ }
+
+
+ private boolean initTts(String requestedEngine, boolean fallbackToDefaultEngine) {
+ // Step 1: Try connecting to the engine that was requested.
+ if (requestedEngine != null) {
+ if (mEnginesHelper.isEngineInstalled(requestedEngine)) {
+ if ((mServiceConnection = connectToEngine(requestedEngine)) != null) {
+ return true;
+ } else if (!fallbackToDefaultEngine) {
+ Log.w(TAG, "Couldn't connect to requested engine: " + requestedEngine);
+ return false;
+ }
+ } else if (!fallbackToDefaultEngine) {
+ Log.w(TAG, "Requested engine not installed: " + requestedEngine);
+ return false;
+ }
+ }
+
+ // Step 2: Try connecting to the user's default engine.
+ final String defaultEngine = mEnginesHelper.getDefaultEngine();
+ if (defaultEngine != null && !defaultEngine.equals(requestedEngine)) {
+ if ((mServiceConnection = connectToEngine(defaultEngine)) != null) {
+ return true;
+ }
+ }
+
+ // Step 3: Try connecting to the highest ranked engine in the
+ // system.
+ final String highestRanked = mEnginesHelper.getHighestRankedEngineName();
+ if (highestRanked != null && !highestRanked.equals(requestedEngine) &&
+ !highestRanked.equals(defaultEngine)) {
+ if ((mServiceConnection = connectToEngine(highestRanked)) != null) {
+ return true;
+ }
+ }
+
+ Log.w(TAG, "Couldn't find working TTS engine");
+ return false;
+ }
+
+ private Connection connectToEngine(String engine) {
+ Connection connection = new Connection(engine);
+ Intent intent = new Intent(TextToSpeech.Engine.INTENT_ACTION_TTS_SERVICE);
+ intent.setPackage(engine);
+ boolean bound = mContext.bindService(intent, connection, Context.BIND_AUTO_CREATE);
+ if (!bound) {
+ Log.e(TAG, "Failed to bind to " + engine);
+ return null;
+ } else {
+ Log.i(TAG, "Successfully bound to " + engine);
+ return connection;
+ }
+ }
+
+
+ /**
+ * Connects the client to TTS service. This method returns immediately, and connects to the
+ * service in the background.
+ *
+ * After connection initializes successfully, {@link ConnectionCallbacks#onConnectionSuccess()}
+ * is called. On a failure {@link ConnectionCallbacks#onConnectionFailure} is called.
+ *
+ * Both of those callback may be called asynchronously on the main thread,
+ * {@link ConnectionCallbacks#onConnectionFailure} may be called synchronously, before
+ * this method returns.
+ */
+ public void connect() {
+ synchronized (mLock) {
+ if (mServiceConnection != null) {
+ return;
+ }
+ if(!initTts(mRequestedEngine, mFallbackToDefault)) {
+ mConnectionCallbacks.onConnectionFailure();
+ }
+ }
+ }
+
+ /**
+ * Checks if the client is currently connected to the service, so that
+ * requests to other methods will succeed.
+ */
+ public boolean isConnected() {
+ synchronized (mLock) {
+ return mServiceConnection != null && mServiceConnection.isEstablished();
+ }
+ }
+
+ /**
+ * Closes the connection to TextToSpeech service. No calls can be made on this object after
+ * calling this method.
+ * It is good practice to call this method in the onDestroy() method of an Activity
+ * so the TextToSpeech engine can be cleanly stopped.
+ */
+ public void disconnect() {
+ synchronized (mLock) {
+ if (mServiceConnection != null) {
+ mServiceConnection.disconnect();
+ mServiceConnection = null;
+ mCallbacks.clear();
+ }
+ }
+ }
+
+ /**
+ * Register callback.
+ *
+ * @param utteranceId Non-null UtteranceId instance.
+ * @param callback Non-null callbacks for the request
+ * @return Status.SUCCESS or error code in case of invalid arguments.
+ */
+ private int addCallback(UtteranceId utteranceId, RequestCallbacks callback) {
+ synchronized (mLock) {
+ if (utteranceId == null || callback == null) {
+ return Status.ERROR_INVALID_REQUEST;
+ }
+ if (mCallbacks.put(utteranceId.toUniqueString(),
+ new Pair<UtteranceId, RequestCallbacks>(utteranceId, callback)) != null) {
+ return Status.ERROR_NON_UNIQUE_UTTERANCE_ID;
+ }
+ return Status.SUCCESS;
+ }
+ }
+
+ /**
+ * Remove and return callback.
+ *
+ * @param utteranceIdStr Unique string obtained from {@link UtteranceId#toUniqueString}.
+ */
+ private Pair<UtteranceId, RequestCallbacks> removeCallback(String utteranceIdStr) {
+ synchronized (mLock) {
+ return mCallbacks.remove(utteranceIdStr);
+ }
+ }
+
+ /**
+ * Get callback and utterance id.
+ *
+ * @param utteranceIdStr Unique string obtained from {@link UtteranceId#toUniqueString}.
+ */
+ private Pair<UtteranceId, RequestCallbacks> getCallback(String utteranceIdStr) {
+ synchronized (mLock) {
+ return mCallbacks.get(utteranceIdStr);
+ }
+ }
+
+ /**
+ * Remove callback and call {@link RequestCallbacks#onSynthesisFailure} with passed
+ * error code.
+ *
+ * @param utteranceIdStr Unique string obtained from {@link UtteranceId#toUniqueString}.
+ * @param errorCode argument to {@link RequestCallbacks#onSynthesisFailure} call.
+ */
+ private void removeCallbackAndErr(String utteranceIdStr, int errorCode) {
+ synchronized (mLock) {
+ Pair<UtteranceId, RequestCallbacks> c = mCallbacks.remove(utteranceIdStr);
+ c.second.onSynthesisFailure(c.first, errorCode);
+ }
+ }
+
+ /**
+ * Retrieve TTS engine status {@link EngineStatus}. Requires connected client.
+ */
+ public EngineStatus getEngineStatus() {
+ synchronized (mLock) {
+ return mEngineStatus;
+ }
+ }
+
+ /**
+ * Query TTS engine about available voices and defaults.
+ *
+ * @return EngineStatus is connected or null if client is disconnected.
+ */
+ private EngineStatus requestEngineStatus(ITextToSpeechService service)
+ throws RemoteException {
+ List<VoiceInfo> voices = service.getVoicesInfo();
+ if (voices == null) {
+ Log.e(TAG, "Requested engine doesn't support TTS V2 API");
+ return null;
+ }
+
+ return new EngineStatus(mServiceConnection.getEngineName(), voices);
+ }
+
+ private class Connection implements ServiceConnection {
+ private final String mEngineName;
+
+ private ITextToSpeechService mService;
+
+ private boolean mEstablished;
+
+ private PrepareConnectionAsyncTask mSetupConnectionAsyncTask;
+
+ public Connection(String engineName) {
+ this.mEngineName = engineName;
+ }
+
+ private final ITextToSpeechCallback.Stub mCallback = new ITextToSpeechCallback.Stub() {
+
+ @Override
+ public void onStart(String utteranceIdStr) {
+ synchronized (mLock) {
+ Pair<UtteranceId, RequestCallbacks> callbacks = getCallback(utteranceIdStr);
+ callbacks.second.onSynthesisStart(callbacks.first);
+ }
+ }
+
+ public void onStop(String utteranceIdStr) {
+ synchronized (mLock) {
+ Pair<UtteranceId, RequestCallbacks> callbacks = removeCallback(utteranceIdStr);
+ callbacks.second.onSynthesisStop(callbacks.first);
+ }
+ }
+
+ @Override
+ public void onSuccess(String utteranceIdStr) {
+ synchronized (mLock) {
+ Pair<UtteranceId, RequestCallbacks> callbacks = removeCallback(utteranceIdStr);
+ callbacks.second.onSynthesisSuccess(callbacks.first);
+ }
+ }
+
+ public void onFallback(String utteranceIdStr) {
+ synchronized (mLock) {
+ Pair<UtteranceId, RequestCallbacks> callbacks = getCallback(utteranceIdStr);
+ callbacks.second.onSynthesisFallback(callbacks.first);
+ }
+ };
+
+ @Override
+ public void onError(String utteranceIdStr, int errorCode) {
+ removeCallbackAndErr(utteranceIdStr, errorCode);
+ }
+
+ @Override
+ public void onVoicesInfoChange(List<VoiceInfo> voicesInfo) {
+ synchronized (mLock) {
+ mEngineStatus = new EngineStatus(mServiceConnection.getEngineName(),
+ voicesInfo);
+ mConnectionCallbacks.onEngineStatusChange(mEngineStatus);
+ }
+ }
+ };
+
+ private class PrepareConnectionAsyncTask extends AsyncTask<Void, Void, EngineStatus> {
+
+ private final ComponentName mName;
+
+ public PrepareConnectionAsyncTask(ComponentName name) {
+ mName = name;
+ }
+
+ @Override
+ protected EngineStatus doInBackground(Void... params) {
+ synchronized(mLock) {
+ if (isCancelled()) {
+ return null;
+ }
+ try {
+ mService.setCallback(getCallerIdentity(), mCallback);
+ return requestEngineStatus(mService);
+ } catch (RemoteException re) {
+ Log.e(TAG, "Error setting up the TTS service");
+ return null;
+ }
+ }
+ }
+
+ @Override
+ protected void onPostExecute(EngineStatus result) {
+ synchronized(mLock) {
+ if (mSetupConnectionAsyncTask == this) {
+ mSetupConnectionAsyncTask = null;
+ }
+ if (result == null) {
+ Log.e(TAG, "Setup task failed");
+ disconnect();
+ mConnectionCallbacks.onConnectionFailure();
+ return;
+ }
+
+ mEngineStatus = result;
+ mEstablished = true;
+ }
+ mConnectionCallbacks.onConnectionSuccess();
+ }
+ }
+
+ @Override
+ public void onServiceConnected(ComponentName name, IBinder service) {
+ Log.i(TAG, "Connected to " + name);
+
+ synchronized(mLock) {
+ mEstablished = false;
+ mService = ITextToSpeechService.Stub.asInterface(service);
+ startSetupConnectionTask(name);
+ }
+ }
+
+ @Override
+ public void onServiceDisconnected(ComponentName name) {
+ Log.i(TAG, "Asked to disconnect from " + name);
+
+ synchronized(mLock) {
+ stopSetupConnectionTask();
+ }
+ mConnectionCallbacks.onServiceDisconnected();
+ }
+
+ private void startSetupConnectionTask(ComponentName name) {
+ stopSetupConnectionTask();
+ mSetupConnectionAsyncTask = new PrepareConnectionAsyncTask(name);
+ mSetupConnectionAsyncTask.execute();
+ }
+
+ private boolean stopSetupConnectionTask() {
+ boolean result = false;
+ if (mSetupConnectionAsyncTask != null) {
+ result = mSetupConnectionAsyncTask.cancel(false);
+ mSetupConnectionAsyncTask = null;
+ }
+ return result;
+ }
+
+ IBinder getCallerIdentity() {
+ return mCallback;
+ }
+
+ boolean isEstablished() {
+ return mService != null && mEstablished;
+ }
+
+ boolean runAction(Action action) {
+ synchronized (mLock) {
+ try {
+ action.run(mService);
+ return true;
+ } catch (Exception ex) {
+ Log.e(TAG, action.getName() + " failed", ex);
+ disconnect();
+ return false;
+ }
+ }
+ }
+
+ void disconnect() {
+ mContext.unbindService(this);
+ stopSetupConnectionTask();
+ mService = null;
+ mEstablished = false;
+ if (mServiceConnection == this) {
+ mServiceConnection = null;
+ }
+ }
+
+ String getEngineName() {
+ return mEngineName;
+ }
+ }
+
+ private abstract class Action {
+ private final String mName;
+
+ public Action(String name) {
+ mName = name;
+ }
+
+ public String getName() {return mName;}
+ abstract void run(ITextToSpeechService service) throws RemoteException;
+ }
+
+ private IBinder getCallerIdentity() {
+ if (mServiceConnection != null) {
+ return mServiceConnection.getCallerIdentity();
+ }
+ return null;
+ }
+
+ private boolean runAction(Action action) {
+ synchronized (mLock) {
+ if (mServiceConnection == null) {
+ return false;
+ }
+ if (!mServiceConnection.isEstablished()) {
+ return false;
+ }
+ mServiceConnection.runAction(action);
+ return true;
+ }
+ }
+
+ private static final String ACTION_STOP_NAME = "stop";
+
+ /**
+ * Interrupts the current utterance spoken (whether played or rendered to file) and discards
+ * other utterances in the queue.
+ */
+ public void stop() {
+ runAction(new Action(ACTION_STOP_NAME) {
+ @Override
+ public void run(ITextToSpeechService service) throws RemoteException {
+ if (service.stop(getCallerIdentity()) != Status.SUCCESS) {
+ Log.e(TAG, "Stop failed");
+ }
+ mCallbacks.clear();
+ }
+ });
+ }
+
+ private static final String ACTION_QUEUE_SPEAK_NAME = "queueSpeak";
+
+ /**
+ * Speaks the string using the specified queuing strategy using current
+ * voice. This method is asynchronous, i.e. the method just adds the request
+ * to the queue of TTS requests and then returns. The synthesis might not
+ * have finished (or even started!) at the time when this method returns.
+ *
+ * @param utterance The string of text to be spoken. No longer than
+ * 1000 characters.
+ * @param utteranceId Unique identificator used to track the synthesis progress
+ * in {@link RequestCallbacks}.
+ * @param config Synthesis request configuration. Can't be null. Has to contain a
+ * voice.
+ * @param callbacks Synthesis request callbacks. If null, default request
+ * callbacks object will be used.
+ */
+ public void queueSpeak(final String utterance, final UtteranceId utteranceId,
+ final RequestConfig config,
+ final RequestCallbacks callbacks) {
+ runAction(new Action(ACTION_QUEUE_SPEAK_NAME) {
+ @Override
+ public void run(ITextToSpeechService service) throws RemoteException {
+ RequestCallbacks c = mDefaultRequestCallbacks;
+ if (callbacks != null) {
+ c = callbacks;
+ }
+ int addCallbackStatus = addCallback(utteranceId, c);
+ if (addCallbackStatus != Status.SUCCESS) {
+ c.onSynthesisFailure(utteranceId, Status.ERROR_INVALID_REQUEST);
+ return;
+ }
+
+ int queueResult = service.speakV2(
+ getCallerIdentity(),
+ new SynthesisRequestV2(utterance, utteranceId.toUniqueString(), config));
+ if (queueResult != Status.SUCCESS) {
+ removeCallbackAndErr(utteranceId.toUniqueString(), queueResult);
+ }
+ }
+ });
+ }
+
+ private static final String ACTION_QUEUE_SYNTHESIZE_TO_FILE = "queueSynthesizeToFile";
+
+ /**
+ * Synthesizes the given text to a file using the specified parameters. This
+ * method is asynchronous, i.e. the method just adds the request to the
+ * queue of TTS requests and then returns. The synthesis might not have
+ * finished (or even started!) at the time when this method returns.
+ *
+ * @param utterance The text that should be synthesized. No longer than
+ * 1000 characters.
+ * @param utteranceId Unique identificator used to track the synthesis progress
+ * in {@link RequestCallbacks}.
+ * @param outputFile File to write the generated audio data to.
+ * @param config Synthesis request configuration. Can't be null. Have to contain a
+ * voice.
+ * @param callbacks Synthesis request callbacks. If null, default request
+ * callbacks object will be used.
+ */
+ public void queueSynthesizeToFile(final String utterance, final UtteranceId utteranceId,
+ final File outputFile, final RequestConfig config,
+ final RequestCallbacks callbacks) {
+ runAction(new Action(ACTION_QUEUE_SYNTHESIZE_TO_FILE) {
+ @Override
+ public void run(ITextToSpeechService service) throws RemoteException {
+ RequestCallbacks c = mDefaultRequestCallbacks;
+ if (callbacks != null) {
+ c = callbacks;
+ }
+ int addCallbackStatus = addCallback(utteranceId, c);
+ if (addCallbackStatus != Status.SUCCESS) {
+ c.onSynthesisFailure(utteranceId, Status.ERROR_INVALID_REQUEST);
+ return;
+ }
+
+ ParcelFileDescriptor fileDescriptor = null;
+ try {
+ if (outputFile.exists() && !outputFile.canWrite()) {
+ Log.e(TAG, "No permissions to write to " + outputFile);
+ removeCallbackAndErr(utteranceId.toUniqueString(), Status.ERROR_OUTPUT);
+ return;
+ }
+ fileDescriptor = ParcelFileDescriptor.open(outputFile,
+ ParcelFileDescriptor.MODE_WRITE_ONLY |
+ ParcelFileDescriptor.MODE_CREATE |
+ ParcelFileDescriptor.MODE_TRUNCATE);
+
+ int queueResult = service.synthesizeToFileDescriptorV2(getCallerIdentity(),
+ fileDescriptor,
+ new SynthesisRequestV2(utterance, utteranceId.toUniqueString(),
+ config));
+ fileDescriptor.close();
+ if (queueResult != Status.SUCCESS) {
+ removeCallbackAndErr(utteranceId.toUniqueString(), queueResult);
+ }
+ } catch (FileNotFoundException e) {
+ Log.e(TAG, "Opening file " + outputFile + " failed", e);
+ removeCallbackAndErr(utteranceId.toUniqueString(), Status.ERROR_OUTPUT);
+ } catch (IOException e) {
+ Log.e(TAG, "Closing file " + outputFile + " failed", e);
+ removeCallbackAndErr(utteranceId.toUniqueString(), Status.ERROR_OUTPUT);
+ }
+ }
+ });
+ }
+
+ private static final String ACTION_QUEUE_SILENCE_NAME = "queueSilence";
+
+ /**
+ * Plays silence for the specified amount of time. This method is asynchronous,
+ * i.e. the method just adds the request to the queue of TTS requests and then
+ * returns. The synthesis might not have finished (or even started!) at the time
+ * when this method returns.
+ *
+ * @param durationInMs The duration of the silence in milliseconds.
+ * @param utteranceId Unique identificator used to track the synthesis progress
+ * in {@link RequestCallbacks}.
+ * @param callbacks Synthesis request callbacks. If null, default request
+ * callbacks object will be used.
+ */
+ public void queueSilence(final long durationInMs, final UtteranceId utteranceId,
+ final RequestCallbacks callbacks) {
+ runAction(new Action(ACTION_QUEUE_SILENCE_NAME) {
+ @Override
+ public void run(ITextToSpeechService service) throws RemoteException {
+ RequestCallbacks c = mDefaultRequestCallbacks;
+ if (callbacks != null) {
+ c = callbacks;
+ }
+ int addCallbackStatus = addCallback(utteranceId, c);
+ if (addCallbackStatus != Status.SUCCESS) {
+ c.onSynthesisFailure(utteranceId, Status.ERROR_INVALID_REQUEST);
+ }
+
+ int queueResult = service.playSilence(getCallerIdentity(), durationInMs,
+ TextToSpeech.QUEUE_ADD, utteranceId.toUniqueString());
+
+ if (queueResult != Status.SUCCESS) {
+ removeCallbackAndErr(utteranceId.toUniqueString(), queueResult);
+ }
+ }
+ });
+ }
+
+
+ private static final String ACTION_QUEUE_AUDIO_NAME = "queueAudio";
+
+ /**
+ * Plays the audio resource using the specified parameters.
+ * This method is asynchronous, i.e. the method just adds the request to the queue of TTS
+ * requests and then returns. The synthesis might not have finished (or even started!) at the
+ * time when this method returns.
+ *
+ * @param audioUrl The audio resource that should be played
+ * @param utteranceId Unique identificator used to track synthesis progress
+ * in {@link RequestCallbacks}.
+ * @param config Synthesis request configuration. Can't be null. Doesn't have to contain a
+ * voice (only system parameters are used).
+ * @param callbacks Synthesis request callbacks. If null, default request
+ * callbacks object will be used.
+ */
+ public void queueAudio(final Uri audioUrl, final UtteranceId utteranceId,
+ final RequestConfig config, final RequestCallbacks callbacks) {
+ runAction(new Action(ACTION_QUEUE_AUDIO_NAME) {
+ @Override
+ public void run(ITextToSpeechService service) throws RemoteException {
+ RequestCallbacks c = mDefaultRequestCallbacks;
+ if (callbacks != null) {
+ c = callbacks;
+ }
+ int addCallbackStatus = addCallback(utteranceId, c);
+ if (addCallbackStatus != Status.SUCCESS) {
+ c.onSynthesisFailure(utteranceId, Status.ERROR_INVALID_REQUEST);
+ }
+
+ int queueResult = service.playAudioV2(getCallerIdentity(), audioUrl,
+ utteranceId.toUniqueString(), config.getVoiceParams());
+
+ if (queueResult != Status.SUCCESS) {
+ removeCallbackAndErr(utteranceId.toUniqueString(), queueResult);
+ }
+ }
+ });
+ }
+}
diff --git a/core/java/android/speech/tts/TextToSpeechService.java b/core/java/android/speech/tts/TextToSpeechService.java
index 575855c..d7c51fc 100644
--- a/core/java/android/speech/tts/TextToSpeechService.java
+++ b/core/java/android/speech/tts/TextToSpeechService.java
@@ -34,26 +34,27 @@ import android.speech.tts.TextToSpeech.Engine;
import android.text.TextUtils;
import android.util.Log;
-import java.io.FileDescriptor;
import java.io.FileOutputStream;
import java.io.IOException;
+import java.util.ArrayList;
import java.util.HashMap;
+import java.util.List;
import java.util.Locale;
+import java.util.Map;
+import java.util.MissingResourceException;
import java.util.Set;
/**
* Abstract base class for TTS engine implementations. The following methods
- * need to be implemented.
- *
+ * need to be implemented for V1 API ({@link TextToSpeech}) implementation.
* <ul>
- * <li>{@link #onIsLanguageAvailable}</li>
- * <li>{@link #onLoadLanguage}</li>
- * <li>{@link #onGetLanguage}</li>
- * <li>{@link #onSynthesizeText}</li>
- * <li>{@link #onStop}</li>
+ * <li>{@link #onIsLanguageAvailable}</li>
+ * <li>{@link #onLoadLanguage}</li>
+ * <li>{@link #onGetLanguage}</li>
+ * <li>{@link #onSynthesizeText}</li>
+ * <li>{@link #onStop}</li>
* </ul>
- *
* The first three deal primarily with language management, and are used to
* query the engine for it's support for a given language and indicate to it
* that requests in a given language are imminent.
@@ -61,22 +62,44 @@ import java.util.Set;
* {@link #onSynthesizeText} is central to the engine implementation. The
* implementation should synthesize text as per the request parameters and
* return synthesized data via the supplied callback. This class and its helpers
- * will then consume that data, which might mean queueing it for playback or writing
- * it to a file or similar. All calls to this method will be on a single
- * thread, which will be different from the main thread of the service. Synthesis
- * must be synchronous which means the engine must NOT hold on the callback or call
- * any methods on it after the method returns
+ * will then consume that data, which might mean queuing it for playback or writing
+ * it to a file or similar. All calls to this method will be on a single thread,
+ * which will be different from the main thread of the service. Synthesis must be
+ * synchronous which means the engine must NOT hold on to the callback or call any
+ * methods on it after the method returns.
*
- * {@link #onStop} tells the engine that it should stop all ongoing synthesis, if
- * any. Any pending data from the current synthesis will be discarded.
+ * {@link #onStop} tells the engine that it should stop
+ * all ongoing synthesis, if any. Any pending data from the current synthesis
+ * will be discarded.
*
+ * {@link #onGetLanguage} is not required as of JELLYBEAN_MR2 (API 18) and later, it is only
+ * called on earlier versions of Android.
+ * <p>
+ * In order to fully support the V2 API ({@link TextToSpeechClient}),
+ * these methods must be implemented:
+ * <ul>
+ * <li>{@link #onSynthesizeTextV2}</li>
+ * <li>{@link #checkVoicesInfo}</li>
+ * <li>{@link #onVoicesInfoChange}</li>
+ * <li>{@link #implementsV2API}</li>
+ * </ul>
+ * In addition {@link #implementsV2API} has to return true.
+ * <p>
+ * If the service does not implement these methods and {@link #implementsV2API} returns false,
+ * then the V2 API will be provided by converting V2 requests ({@link #onSynthesizeTextV2})
+ * to V1 requests ({@link #onSynthesizeText}). On service setup, all of the available device
+ * locales will be fed to {@link #onIsLanguageAvailable} to check if they are supported.
+ * If they are, embedded and/or network voices will be created depending on the result of
+ * {@link #onGetFeaturesForLanguage}.
+ * <p>
+ * Note that a V2 service will still receive requests from V1 clients and has to implement all
+ * of the V1 API methods.
*/
public abstract class TextToSpeechService extends Service {
private static final boolean DBG = false;
private static final String TAG = "TextToSpeechService";
-
private static final String SYNTH_THREAD_NAME = "SynthThread";
private SynthHandler mSynthHandler;
@@ -89,6 +112,11 @@ public abstract class TextToSpeechService extends Service {
private CallbackMap mCallbacks;
private String mPackageName;
+ private final Object mVoicesInfoLock = new Object();
+
+ private List<VoiceInfo> mVoicesInfoList;
+ private Map<String, VoiceInfo> mVoicesInfoLookup;
+
@Override
public void onCreate() {
if (DBG) Log.d(TAG, "onCreate()");
@@ -108,6 +136,7 @@ public abstract class TextToSpeechService extends Service {
mPackageName = getApplicationInfo().packageName;
String[] defaultLocale = getSettingsLocale();
+
// Load default language
onLoadLanguage(defaultLocale[0], defaultLocale[1], defaultLocale[2]);
}
@@ -148,6 +177,9 @@ public abstract class TextToSpeechService extends Service {
/**
* Returns the language, country and variant currently being used by the TTS engine.
*
+ * This method will be called only on Android 4.2 and before (API <= 17). In later versions
+ * this method is not called by the Android TTS framework.
+ *
* Can be called on multiple threads.
*
* @return A 3-element array, containing language (ISO 3-letter code),
@@ -191,21 +223,159 @@ public abstract class TextToSpeechService extends Service {
protected abstract void onStop();
/**
- * Tells the service to synthesize speech from the given text. This method should
- * block until the synthesis is finished.
- *
- * Called on the synthesis thread.
+ * Tells the service to synthesize speech from the given text. This method
+ * should block until the synthesis is finished. Used for requests from V1
+ * clients ({@link android.speech.tts.TextToSpeech}). Called on the synthesis
+ * thread.
*
* @param request The synthesis request.
- * @param callback The callback the the engine must use to make data available for
- * playback or for writing to a file.
+ * @param callback The callback that the engine must use to make data
+ * available for playback or for writing to a file.
*/
protected abstract void onSynthesizeText(SynthesisRequest request,
SynthesisCallback callback);
/**
+ * Check the available voices data and return an immutable list of the available voices.
+ * The output of this method will be passed to clients to allow them to configure synthesis
+ * requests.
+ *
+ * Can be called on multiple threads.
+ *
+ * The result of this method will be saved and served to all TTS clients. If a TTS service wants
+ * to update the set of available voices, it should call the {@link #forceVoicesInfoCheck()}
+ * method.
+ */
+ protected List<VoiceInfo> checkVoicesInfo() {
+ if (implementsV2API()) {
+ throw new IllegalStateException("For proper V2 API implementation this method has to" +
+ " be implemented");
+ }
+
+ // V2 to V1 interface adapter. This allows using V2 client interface on V1-only services.
+ Bundle defaultParams = new Bundle();
+ defaultParams.putFloat(TextToSpeechClient.Params.SPEECH_PITCH, 1.0f);
+ defaultParams.putFloat(TextToSpeechClient.Params.SPEECH_SPEED, -1.0f);
+
+ // Enumerate all locales and check if they are available
+ ArrayList<VoiceInfo> voicesInfo = new ArrayList<VoiceInfo>();
+ int id = 0;
+ for (Locale locale : Locale.getAvailableLocales()) {
+ int expectedStatus = TextToSpeech.LANG_COUNTRY_VAR_AVAILABLE;
+ if (locale.getVariant().isEmpty()) {
+ if (locale.getCountry().isEmpty()) {
+ expectedStatus = TextToSpeech.LANG_AVAILABLE;
+ } else {
+ expectedStatus = TextToSpeech.LANG_COUNTRY_AVAILABLE;
+ }
+ }
+ try {
+ int localeStatus = onIsLanguageAvailable(locale.getISO3Language(),
+ locale.getISO3Country(), locale.getVariant());
+ if (localeStatus != expectedStatus) {
+ continue;
+ }
+ } catch (MissingResourceException e) {
+ // Ignore locale without iso 3 codes
+ continue;
+ }
+
+ Set<String> features = onGetFeaturesForLanguage(locale.getISO3Language(),
+ locale.getISO3Country(), locale.getVariant());
+
+ VoiceInfo.Builder builder = new VoiceInfo.Builder();
+ builder.setLatency(VoiceInfo.LATENCY_NORMAL);
+ builder.setQuality(VoiceInfo.QUALITY_NORMAL);
+ builder.setLocale(locale);
+ builder.setParamsWithDefaults(defaultParams);
+
+ if (features == null || features.contains(
+ TextToSpeech.Engine.KEY_FEATURE_EMBEDDED_SYNTHESIS)) {
+ builder.setName(locale.toString() + "-embedded");
+ builder.setRequiresNetworkConnection(false);
+ voicesInfo.add(builder.build());
+ }
+
+ if (features != null && features.contains(
+ TextToSpeech.Engine.KEY_FEATURE_NETWORK_SYNTHESIS)) {
+ builder.setName(locale.toString() + "-network");
+ builder.setRequiresNetworkConnection(true);
+ voicesInfo.add(builder.build());
+ }
+ }
+
+ return voicesInfo;
+ }
+
+ /**
+ * Tells the synthesis thread that it should reload voice data.
+ * There's a high probability that the underlying set of available voice data has changed.
+ * Called only on the synthesis thread.
+ */
+ protected void onVoicesInfoChange() {
+
+ }
+
+ /**
+ * Tells the service to synthesize speech from the given text. This method
+ * should block until the synthesis is finished. Used for requests from V2
+ * client {@link android.speech.tts.TextToSpeechClient}. Called on the
+ * synthesis thread.
+ *
+ * @param request The synthesis request.
+ * @param callback The callback the the engine must use to make data
+ * available for playback or for writing to a file.
+ */
+ protected void onSynthesizeTextV2(SynthesisRequestV2 request,
+ VoiceInfo selectedVoice,
+ SynthesisCallback callback) {
+ if (implementsV2API()) {
+ throw new IllegalStateException("For proper V2 API implementation this method has to" +
+ " be implemented");
+ }
+
+ // Convert to V1 params
+ int speechRate = (int) (request.getVoiceParams().getFloat(
+ TextToSpeechClient.Params.SPEECH_SPEED, 1.0f) * 100);
+ int speechPitch = (int) (request.getVoiceParams().getFloat(
+ TextToSpeechClient.Params.SPEECH_PITCH, 1.0f) * 100);
+
+ // Provide adapter to V1 API
+ Bundle params = new Bundle();
+ params.putString(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, request.getUtteranceId());
+ params.putInt(TextToSpeech.Engine.KEY_PARAM_PITCH, speechPitch);
+ params.putInt(TextToSpeech.Engine.KEY_PARAM_RATE, speechRate);
+ if (selectedVoice.getRequiresNetworkConnection()) {
+ params.putString(TextToSpeech.Engine.KEY_FEATURE_NETWORK_SYNTHESIS, "true");
+ } else {
+ params.putString(TextToSpeech.Engine.KEY_FEATURE_EMBEDDED_SYNTHESIS, "true");
+ }
+
+ // Build V1 request
+ SynthesisRequest requestV1 = new SynthesisRequest(request.getText(), params);
+ Locale locale = selectedVoice.getLocale();
+ requestV1.setLanguage(locale.getISO3Language(), locale.getISO3Country(),
+ locale.getVariant());
+ requestV1.setSpeechRate(speechRate);
+ requestV1.setPitch(speechPitch);
+
+ // Synthesize using V1 interface
+ onSynthesizeText(requestV1, callback);
+ }
+
+ /**
+ * If true, this service implements proper V2 TTS API service. If it's false,
+ * V2 API will be provided through adapter.
+ */
+ protected boolean implementsV2API() {
+ return false;
+ }
+
+ /**
* Queries the service for a set of features supported for a given language.
*
+ * Can be called on multiple threads.
+ *
* @param lang ISO-3 language code.
* @param country ISO-3 country code. May be empty or null.
* @param variant Language variant. May be empty or null.
@@ -215,6 +385,69 @@ public abstract class TextToSpeechService extends Service {
return null;
}
+ private List<VoiceInfo> getVoicesInfo() {
+ synchronized (mVoicesInfoLock) {
+ if (mVoicesInfoList == null) {
+ // Get voices. Defensive copy to make sure TTS engine won't alter the list.
+ mVoicesInfoList = new ArrayList<VoiceInfo>(checkVoicesInfo());
+ // Build lookup map
+ mVoicesInfoLookup = new HashMap<String, VoiceInfo>((int) (
+ mVoicesInfoList.size()*1.5f));
+ for (VoiceInfo voiceInfo : mVoicesInfoList) {
+ VoiceInfo prev = mVoicesInfoLookup.put(voiceInfo.getName(), voiceInfo);
+ if (prev != null) {
+ Log.e(TAG, "Duplicate name (" + voiceInfo.getName() + ") of the voice ");
+ }
+ }
+ }
+ return mVoicesInfoList;
+ }
+ }
+
+ public VoiceInfo getVoicesInfoWithName(String name) {
+ synchronized (mVoicesInfoLock) {
+ if (mVoicesInfoLookup != null) {
+ return mVoicesInfoLookup.get(name);
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Force TTS service to reevaluate the set of available languages. Will result in
+ * a call to {@link #checkVoicesInfo()} on the same thread, {@link #onVoicesInfoChange}
+ * on the synthesizer thread and callback to
+ * {@link TextToSpeechClient.ConnectionCallbacks#onEngineStatusChange} of all connected
+ * TTS clients.
+ *
+ * Use this method only if you know that set of available languages changed.
+ *
+ * Can be called on multiple threads.
+ */
+ public void forceVoicesInfoCheck() {
+ synchronized (mVoicesInfoLock) {
+ List<VoiceInfo> old = mVoicesInfoList;
+
+ mVoicesInfoList = null; // Force recreation of voices info list
+ getVoicesInfo();
+
+ if (mVoicesInfoList == null) {
+ throw new IllegalStateException("This method applies only to services " +
+ "supporting V2 TTS API. This services doesn't support V2 TTS API.");
+ }
+
+ if (old != null) {
+ // Flush all existing items, and inform synthesis thread about the change.
+ mSynthHandler.enqueueSpeechItem(TextToSpeech.QUEUE_FLUSH,
+ new VoicesInfoChangeItem());
+ // TODO: Handle items that may be added to queue after SynthesizerRestartItem
+ // but before client reconnection
+ // Disconnect all of them
+ mCallbacks.dispatchVoicesInfoChange(mVoicesInfoList);
+ }
+ }
+ }
+
private int getDefaultSpeechRate() {
return getSecureSettingInt(Settings.Secure.TTS_DEFAULT_RATE, Engine.DEFAULT_RATE);
}
@@ -317,7 +550,8 @@ public abstract class TextToSpeechService extends Service {
if (!speechItem.isValid()) {
if (utterenceProgress != null) {
- utterenceProgress.dispatchOnError();
+ utterenceProgress.dispatchOnError(
+ TextToSpeechClient.Status.ERROR_INVALID_REQUEST);
}
return TextToSpeech.ERROR;
}
@@ -342,12 +576,13 @@ public abstract class TextToSpeechService extends Service {
//
// Note that this string is interned, so the == comparison works.
msg.obj = speechItem.getCallerIdentity();
+
if (sendMessage(msg)) {
return TextToSpeech.SUCCESS;
} else {
Log.w(TAG, "SynthThread has quit");
if (utterenceProgress != null) {
- utterenceProgress.dispatchOnError();
+ utterenceProgress.dispatchOnError(TextToSpeechClient.Status.ERROR_SERVICE);
}
return TextToSpeech.ERROR;
}
@@ -399,9 +634,11 @@ public abstract class TextToSpeechService extends Service {
}
interface UtteranceProgressDispatcher {
- public void dispatchOnDone();
+ public void dispatchOnFallback();
+ public void dispatchOnStop();
+ public void dispatchOnSuccess();
public void dispatchOnStart();
- public void dispatchOnError();
+ public void dispatchOnError(int errorCode);
}
/**
@@ -409,15 +646,13 @@ public abstract class TextToSpeechService extends Service {
*/
private abstract class SpeechItem {
private final Object mCallerIdentity;
- protected final Bundle mParams;
private final int mCallerUid;
private final int mCallerPid;
private boolean mStarted = false;
private boolean mStopped = false;
- public SpeechItem(Object caller, int callerUid, int callerPid, Bundle params) {
+ public SpeechItem(Object caller, int callerUid, int callerPid) {
mCallerIdentity = caller;
- mParams = params;
mCallerUid = callerUid;
mCallerPid = callerPid;
}
@@ -446,20 +681,18 @@ public abstract class TextToSpeechService extends Service {
* Must not be called more than once.
*
* Only called on the synthesis thread.
- *
- * @return {@link TextToSpeech#SUCCESS} or {@link TextToSpeech#ERROR}.
*/
- public int play() {
+ public void play() {
synchronized (this) {
if (mStarted) {
throw new IllegalStateException("play() called twice");
}
mStarted = true;
}
- return playImpl();
+ playImpl();
}
- protected abstract int playImpl();
+ protected abstract void playImpl();
/**
* Stops the speech item.
@@ -485,20 +718,37 @@ public abstract class TextToSpeechService extends Service {
}
/**
- * An item in the synth thread queue that process utterance.
+ * An item in the synth thread queue that process utterance (and call back to client about
+ * progress).
*/
private abstract class UtteranceSpeechItem extends SpeechItem
implements UtteranceProgressDispatcher {
- public UtteranceSpeechItem(Object caller, int callerUid, int callerPid, Bundle params) {
- super(caller, callerUid, callerPid, params);
+ public UtteranceSpeechItem(Object caller, int callerUid, int callerPid) {
+ super(caller, callerUid, callerPid);
+ }
+
+ @Override
+ public void dispatchOnSuccess() {
+ final String utteranceId = getUtteranceId();
+ if (utteranceId != null) {
+ mCallbacks.dispatchOnSuccess(getCallerIdentity(), utteranceId);
+ }
}
@Override
- public void dispatchOnDone() {
+ public void dispatchOnStop() {
final String utteranceId = getUtteranceId();
if (utteranceId != null) {
- mCallbacks.dispatchOnDone(getCallerIdentity(), utteranceId);
+ mCallbacks.dispatchOnStop(getCallerIdentity(), utteranceId);
+ }
+ }
+
+ @Override
+ public void dispatchOnFallback() {
+ final String utteranceId = getUtteranceId();
+ if (utteranceId != null) {
+ mCallbacks.dispatchOnFallback(getCallerIdentity(), utteranceId);
}
}
@@ -511,44 +761,260 @@ public abstract class TextToSpeechService extends Service {
}
@Override
- public void dispatchOnError() {
+ public void dispatchOnError(int errorCode) {
final String utteranceId = getUtteranceId();
if (utteranceId != null) {
- mCallbacks.dispatchOnError(getCallerIdentity(), utteranceId);
+ mCallbacks.dispatchOnError(getCallerIdentity(), utteranceId, errorCode);
}
}
- public int getStreamType() {
- return getIntParam(Engine.KEY_PARAM_STREAM, Engine.DEFAULT_STREAM);
+ abstract public String getUtteranceId();
+
+ String getStringParam(Bundle params, String key, String defaultValue) {
+ return params == null ? defaultValue : params.getString(key, defaultValue);
+ }
+
+ int getIntParam(Bundle params, String key, int defaultValue) {
+ return params == null ? defaultValue : params.getInt(key, defaultValue);
+ }
+
+ float getFloatParam(Bundle params, String key, float defaultValue) {
+ return params == null ? defaultValue : params.getFloat(key, defaultValue);
+ }
+ }
+
+ /**
+ * UtteranceSpeechItem for V1 API speech items. V1 API speech items keep
+ * synthesis parameters in a single Bundle passed as parameter. This class
+ * allow subclasses to access them conveniently.
+ */
+ private abstract class SpeechItemV1 extends UtteranceSpeechItem {
+ protected final Bundle mParams;
+
+ SpeechItemV1(Object callerIdentity, int callerUid, int callerPid,
+ Bundle params) {
+ super(callerIdentity, callerUid, callerPid);
+ mParams = params;
+ }
+
+ boolean hasLanguage() {
+ return !TextUtils.isEmpty(getStringParam(mParams, Engine.KEY_PARAM_LANGUAGE, null));
}
- public float getVolume() {
- return getFloatParam(Engine.KEY_PARAM_VOLUME, Engine.DEFAULT_VOLUME);
+ int getSpeechRate() {
+ return getIntParam(mParams, Engine.KEY_PARAM_RATE, getDefaultSpeechRate());
}
- public float getPan() {
- return getFloatParam(Engine.KEY_PARAM_PAN, Engine.DEFAULT_PAN);
+ int getPitch() {
+ return getIntParam(mParams, Engine.KEY_PARAM_PITCH, Engine.DEFAULT_PITCH);
}
+ @Override
public String getUtteranceId() {
- return getStringParam(Engine.KEY_PARAM_UTTERANCE_ID, null);
+ return getStringParam(mParams, Engine.KEY_PARAM_UTTERANCE_ID, null);
+ }
+
+ int getStreamType() {
+ return getIntParam(mParams, Engine.KEY_PARAM_STREAM, Engine.DEFAULT_STREAM);
+ }
+
+ float getVolume() {
+ return getFloatParam(mParams, Engine.KEY_PARAM_VOLUME, Engine.DEFAULT_VOLUME);
+ }
+
+ float getPan() {
+ return getFloatParam(mParams, Engine.KEY_PARAM_PAN, Engine.DEFAULT_PAN);
+ }
+ }
+
+ class SynthesisSpeechItemV2 extends UtteranceSpeechItem {
+ private final SynthesisRequestV2 mSynthesisRequest;
+ private AbstractSynthesisCallback mSynthesisCallback;
+ private final EventLoggerV2 mEventLogger;
+
+ public SynthesisSpeechItemV2(Object callerIdentity, int callerUid, int callerPid,
+ SynthesisRequestV2 synthesisRequest) {
+ super(callerIdentity, callerUid, callerPid);
+
+ mSynthesisRequest = synthesisRequest;
+ mEventLogger = new EventLoggerV2(synthesisRequest, callerUid, callerPid,
+ mPackageName);
+
+ updateSpeechSpeedParam(synthesisRequest);
+ }
+
+ private void updateSpeechSpeedParam(SynthesisRequestV2 synthesisRequest) {
+ Bundle voiceParams = mSynthesisRequest.getVoiceParams();
+
+ // Inject default speech speed if needed
+ if (voiceParams.containsKey(TextToSpeechClient.Params.SPEECH_SPEED)) {
+ if (voiceParams.getFloat(TextToSpeechClient.Params.SPEECH_SPEED) <= 0) {
+ voiceParams.putFloat(TextToSpeechClient.Params.SPEECH_SPEED,
+ getDefaultSpeechRate() / 100.0f);
+ }
+ }
}
- protected String getStringParam(String key, String defaultValue) {
- return mParams == null ? defaultValue : mParams.getString(key, defaultValue);
+ @Override
+ public boolean isValid() {
+ if (mSynthesisRequest.getText() == null) {
+ Log.e(TAG, "null synthesis text");
+ return false;
+ }
+ if (mSynthesisRequest.getText().length() >= TextToSpeech.getMaxSpeechInputLength()) {
+ Log.w(TAG, "Text too long: " + mSynthesisRequest.getText().length() + " chars");
+ return false;
+ }
+
+ return true;
}
- protected int getIntParam(String key, int defaultValue) {
- return mParams == null ? defaultValue : mParams.getInt(key, defaultValue);
+ @Override
+ protected void playImpl() {
+ AbstractSynthesisCallback synthesisCallback;
+ if (mEventLogger != null) {
+ mEventLogger.onRequestProcessingStart();
+ }
+ synchronized (this) {
+ // stop() might have been called before we enter this
+ // synchronized block.
+ if (isStopped()) {
+ return;
+ }
+ mSynthesisCallback = createSynthesisCallback();
+ synthesisCallback = mSynthesisCallback;
+ }
+
+ // Get voice info
+ VoiceInfo voiceInfo = getVoicesInfoWithName(mSynthesisRequest.getVoiceName());
+ if (voiceInfo != null) {
+ // Primary voice
+ TextToSpeechService.this.onSynthesizeTextV2(mSynthesisRequest, voiceInfo,
+ synthesisCallback);
+ } else {
+ Log.e(TAG, "Unknown voice name:" + mSynthesisRequest.getVoiceName());
+ synthesisCallback.error(TextToSpeechClient.Status.ERROR_INVALID_REQUEST);
+ }
+
+ // Fix for case where client called .start() & .error(), but did not called .done()
+ if (!synthesisCallback.hasFinished()) {
+ synthesisCallback.done();
+ }
}
- protected float getFloatParam(String key, float defaultValue) {
- return mParams == null ? defaultValue : mParams.getFloat(key, defaultValue);
+ @Override
+ protected void stopImpl() {
+ AbstractSynthesisCallback synthesisCallback;
+ synchronized (this) {
+ synthesisCallback = mSynthesisCallback;
+ }
+ if (synthesisCallback != null) {
+ // If the synthesis callback is null, it implies that we haven't
+ // entered the synchronized(this) block in playImpl which in
+ // turn implies that synthesis would not have started.
+ synthesisCallback.stop();
+ TextToSpeechService.this.onStop();
+ }
}
+ protected AbstractSynthesisCallback createSynthesisCallback() {
+ return new PlaybackSynthesisCallback(getStreamType(), getVolume(), getPan(),
+ mAudioPlaybackHandler, this, getCallerIdentity(), mEventLogger,
+ implementsV2API());
+ }
+
+ private int getStreamType() {
+ return getIntParam(mSynthesisRequest.getAudioParams(),
+ TextToSpeechClient.Params.AUDIO_PARAM_STREAM,
+ Engine.DEFAULT_STREAM);
+ }
+
+ private float getVolume() {
+ return getFloatParam(mSynthesisRequest.getAudioParams(),
+ TextToSpeechClient.Params.AUDIO_PARAM_VOLUME,
+ Engine.DEFAULT_VOLUME);
+ }
+
+ private float getPan() {
+ return getFloatParam(mSynthesisRequest.getAudioParams(),
+ TextToSpeechClient.Params.AUDIO_PARAM_PAN,
+ Engine.DEFAULT_PAN);
+ }
+
+ @Override
+ public String getUtteranceId() {
+ return mSynthesisRequest.getUtteranceId();
+ }
+ }
+
+ private class SynthesisToFileOutputStreamSpeechItemV2 extends SynthesisSpeechItemV2 {
+ private final FileOutputStream mFileOutputStream;
+
+ public SynthesisToFileOutputStreamSpeechItemV2(Object callerIdentity, int callerUid,
+ int callerPid,
+ SynthesisRequestV2 synthesisRequest,
+ FileOutputStream fileOutputStream) {
+ super(callerIdentity, callerUid, callerPid, synthesisRequest);
+ mFileOutputStream = fileOutputStream;
+ }
+
+ @Override
+ protected AbstractSynthesisCallback createSynthesisCallback() {
+ return new FileSynthesisCallback(mFileOutputStream.getChannel(),
+ this, getCallerIdentity(), implementsV2API());
+ }
+
+ @Override
+ protected void playImpl() {
+ super.playImpl();
+ try {
+ mFileOutputStream.close();
+ } catch(IOException e) {
+ Log.w(TAG, "Failed to close output file", e);
+ }
+ }
+ }
+
+ private class AudioSpeechItemV2 extends UtteranceSpeechItem {
+ private final AudioPlaybackQueueItem mItem;
+ private final Bundle mAudioParams;
+ private final String mUtteranceId;
+
+ public AudioSpeechItemV2(Object callerIdentity, int callerUid, int callerPid,
+ String utteranceId, Bundle audioParams, Uri uri) {
+ super(callerIdentity, callerUid, callerPid);
+ mUtteranceId = utteranceId;
+ mAudioParams = audioParams;
+ mItem = new AudioPlaybackQueueItem(this, getCallerIdentity(),
+ TextToSpeechService.this, uri, getStreamType());
+ }
+
+ @Override
+ public boolean isValid() {
+ return true;
+ }
+
+ @Override
+ protected void playImpl() {
+ mAudioPlaybackHandler.enqueue(mItem);
+ }
+
+ @Override
+ protected void stopImpl() {
+ // Do nothing.
+ }
+
+ protected int getStreamType() {
+ return mAudioParams.getInt(TextToSpeechClient.Params.AUDIO_PARAM_STREAM);
+ }
+
+ public String getUtteranceId() {
+ return mUtteranceId;
+ }
}
- class SynthesisSpeechItem extends UtteranceSpeechItem {
+
+ class SynthesisSpeechItemV1 extends SpeechItemV1 {
// Never null.
private final String mText;
private final SynthesisRequest mSynthesisRequest;
@@ -556,10 +1022,10 @@ public abstract class TextToSpeechService extends Service {
// Non null after synthesis has started, and all accesses
// guarded by 'this'.
private AbstractSynthesisCallback mSynthesisCallback;
- private final EventLogger mEventLogger;
+ private final EventLoggerV1 mEventLogger;
private final int mCallerUid;
- public SynthesisSpeechItem(Object callerIdentity, int callerUid, int callerPid,
+ public SynthesisSpeechItemV1(Object callerIdentity, int callerUid, int callerPid,
Bundle params, String text) {
super(callerIdentity, callerUid, callerPid, params);
mText = text;
@@ -567,7 +1033,7 @@ public abstract class TextToSpeechService extends Service {
mSynthesisRequest = new SynthesisRequest(mText, mParams);
mDefaultLocale = getSettingsLocale();
setRequestParams(mSynthesisRequest);
- mEventLogger = new EventLogger(mSynthesisRequest, callerUid, callerPid,
+ mEventLogger = new EventLoggerV1(mSynthesisRequest, callerUid, callerPid,
mPackageName);
}
@@ -589,25 +1055,30 @@ public abstract class TextToSpeechService extends Service {
}
@Override
- protected int playImpl() {
+ protected void playImpl() {
AbstractSynthesisCallback synthesisCallback;
mEventLogger.onRequestProcessingStart();
synchronized (this) {
// stop() might have been called before we enter this
// synchronized block.
if (isStopped()) {
- return TextToSpeech.ERROR;
+ return;
}
mSynthesisCallback = createSynthesisCallback();
synthesisCallback = mSynthesisCallback;
}
+
TextToSpeechService.this.onSynthesizeText(mSynthesisRequest, synthesisCallback);
- return synthesisCallback.isDone() ? TextToSpeech.SUCCESS : TextToSpeech.ERROR;
+
+ // Fix for case where client called .start() & .error(), but did not called .done()
+ if (synthesisCallback.hasStarted() && !synthesisCallback.hasFinished()) {
+ synthesisCallback.done();
+ }
}
protected AbstractSynthesisCallback createSynthesisCallback() {
return new PlaybackSynthesisCallback(getStreamType(), getVolume(), getPan(),
- mAudioPlaybackHandler, this, getCallerIdentity(), mEventLogger);
+ mAudioPlaybackHandler, this, getCallerIdentity(), mEventLogger, false);
}
private void setRequestParams(SynthesisRequest request) {
@@ -632,37 +1103,25 @@ public abstract class TextToSpeechService extends Service {
}
}
- public String getLanguage() {
- return getStringParam(Engine.KEY_PARAM_LANGUAGE, mDefaultLocale[0]);
- }
-
- private boolean hasLanguage() {
- return !TextUtils.isEmpty(getStringParam(Engine.KEY_PARAM_LANGUAGE, null));
- }
-
private String getCountry() {
if (!hasLanguage()) return mDefaultLocale[1];
- return getStringParam(Engine.KEY_PARAM_COUNTRY, "");
+ return getStringParam(mParams, Engine.KEY_PARAM_COUNTRY, "");
}
private String getVariant() {
if (!hasLanguage()) return mDefaultLocale[2];
- return getStringParam(Engine.KEY_PARAM_VARIANT, "");
+ return getStringParam(mParams, Engine.KEY_PARAM_VARIANT, "");
}
- private int getSpeechRate() {
- return getIntParam(Engine.KEY_PARAM_RATE, getDefaultSpeechRate());
- }
-
- private int getPitch() {
- return getIntParam(Engine.KEY_PARAM_PITCH, Engine.DEFAULT_PITCH);
+ public String getLanguage() {
+ return getStringParam(mParams, Engine.KEY_PARAM_LANGUAGE, mDefaultLocale[0]);
}
}
- private class SynthesisToFileOutputStreamSpeechItem extends SynthesisSpeechItem {
+ private class SynthesisToFileOutputStreamSpeechItemV1 extends SynthesisSpeechItemV1 {
private final FileOutputStream mFileOutputStream;
- public SynthesisToFileOutputStreamSpeechItem(Object callerIdentity, int callerUid,
+ public SynthesisToFileOutputStreamSpeechItemV1(Object callerIdentity, int callerUid,
int callerPid, Bundle params, String text, FileOutputStream fileOutputStream) {
super(callerIdentity, callerUid, callerPid, params, text);
mFileOutputStream = fileOutputStream;
@@ -670,30 +1129,26 @@ public abstract class TextToSpeechService extends Service {
@Override
protected AbstractSynthesisCallback createSynthesisCallback() {
- return new FileSynthesisCallback(mFileOutputStream.getChannel());
+ return new FileSynthesisCallback(mFileOutputStream.getChannel(),
+ this, getCallerIdentity(), false);
}
@Override
- protected int playImpl() {
+ protected void playImpl() {
dispatchOnStart();
- int status = super.playImpl();
- if (status == TextToSpeech.SUCCESS) {
- dispatchOnDone();
- } else {
- dispatchOnError();
- }
+ super.playImpl();
try {
mFileOutputStream.close();
} catch(IOException e) {
Log.w(TAG, "Failed to close output file", e);
}
- return status;
}
}
- private class AudioSpeechItem extends UtteranceSpeechItem {
+ private class AudioSpeechItemV1 extends SpeechItemV1 {
private final AudioPlaybackQueueItem mItem;
- public AudioSpeechItem(Object callerIdentity, int callerUid, int callerPid,
+
+ public AudioSpeechItemV1(Object callerIdentity, int callerUid, int callerPid,
Bundle params, Uri uri) {
super(callerIdentity, callerUid, callerPid, params);
mItem = new AudioPlaybackQueueItem(this, getCallerIdentity(),
@@ -706,23 +1161,29 @@ public abstract class TextToSpeechService extends Service {
}
@Override
- protected int playImpl() {
+ protected void playImpl() {
mAudioPlaybackHandler.enqueue(mItem);
- return TextToSpeech.SUCCESS;
}
@Override
protected void stopImpl() {
// Do nothing.
}
+
+ @Override
+ public String getUtteranceId() {
+ return getStringParam(mParams, Engine.KEY_PARAM_UTTERANCE_ID, null);
+ }
}
private class SilenceSpeechItem extends UtteranceSpeechItem {
private final long mDuration;
+ private final String mUtteranceId;
public SilenceSpeechItem(Object callerIdentity, int callerUid, int callerPid,
- Bundle params, long duration) {
- super(callerIdentity, callerUid, callerPid, params);
+ String utteranceId, long duration) {
+ super(callerIdentity, callerUid, callerPid);
+ mUtteranceId = utteranceId;
mDuration = duration;
}
@@ -732,26 +1193,57 @@ public abstract class TextToSpeechService extends Service {
}
@Override
- protected int playImpl() {
+ protected void playImpl() {
mAudioPlaybackHandler.enqueue(new SilencePlaybackQueueItem(
this, getCallerIdentity(), mDuration));
- return TextToSpeech.SUCCESS;
}
@Override
protected void stopImpl() {
- // Do nothing, handled by AudioPlaybackHandler#stopForApp
+
+ }
+
+ @Override
+ public String getUtteranceId() {
+ return mUtteranceId;
+ }
+ }
+
+ /**
+ * Call {@link TextToSpeechService#onVoicesInfoChange} on synthesis thread.
+ */
+ private class VoicesInfoChangeItem extends SpeechItem {
+ public VoicesInfoChangeItem() {
+ super(null, 0, 0); // It's never initiated by an user
+ }
+
+ @Override
+ public boolean isValid() {
+ return true;
+ }
+
+ @Override
+ protected void playImpl() {
+ TextToSpeechService.this.onVoicesInfoChange();
+ }
+
+ @Override
+ protected void stopImpl() {
+ // No-op
}
}
+ /**
+ * Call {@link TextToSpeechService#onLoadLanguage} on synth thread.
+ */
private class LoadLanguageItem extends SpeechItem {
private final String mLanguage;
private final String mCountry;
private final String mVariant;
public LoadLanguageItem(Object callerIdentity, int callerUid, int callerPid,
- Bundle params, String language, String country, String variant) {
- super(callerIdentity, callerUid, callerPid, params);
+ String language, String country, String variant) {
+ super(callerIdentity, callerUid, callerPid);
mLanguage = language;
mCountry = country;
mVariant = variant;
@@ -763,14 +1255,8 @@ public abstract class TextToSpeechService extends Service {
}
@Override
- protected int playImpl() {
- int result = TextToSpeechService.this.onLoadLanguage(mLanguage, mCountry, mVariant);
- if (result == TextToSpeech.LANG_AVAILABLE ||
- result == TextToSpeech.LANG_COUNTRY_AVAILABLE ||
- result == TextToSpeech.LANG_COUNTRY_VAR_AVAILABLE) {
- return TextToSpeech.SUCCESS;
- }
- return TextToSpeech.ERROR;
+ protected void playImpl() {
+ TextToSpeechService.this.onLoadLanguage(mLanguage, mCountry, mVariant);
}
@Override
@@ -800,7 +1286,7 @@ public abstract class TextToSpeechService extends Service {
return TextToSpeech.ERROR;
}
- SpeechItem item = new SynthesisSpeechItem(caller,
+ SpeechItem item = new SynthesisSpeechItemV1(caller,
Binder.getCallingUid(), Binder.getCallingPid(), params, text);
return mSynthHandler.enqueueSpeechItem(queueMode, item);
}
@@ -818,7 +1304,7 @@ public abstract class TextToSpeechService extends Service {
final ParcelFileDescriptor sameFileDescriptor = ParcelFileDescriptor.adoptFd(
fileDescriptor.detachFd());
- SpeechItem item = new SynthesisToFileOutputStreamSpeechItem(caller,
+ SpeechItem item = new SynthesisToFileOutputStreamSpeechItemV1(caller,
Binder.getCallingUid(), Binder.getCallingPid(), params, text,
new ParcelFileDescriptor.AutoCloseOutputStream(sameFileDescriptor));
return mSynthHandler.enqueueSpeechItem(TextToSpeech.QUEUE_ADD, item);
@@ -830,19 +1316,19 @@ public abstract class TextToSpeechService extends Service {
return TextToSpeech.ERROR;
}
- SpeechItem item = new AudioSpeechItem(caller,
+ SpeechItem item = new AudioSpeechItemV1(caller,
Binder.getCallingUid(), Binder.getCallingPid(), params, audioUri);
return mSynthHandler.enqueueSpeechItem(queueMode, item);
}
@Override
- public int playSilence(IBinder caller, long duration, int queueMode, Bundle params) {
- if (!checkNonNull(caller, params)) {
+ public int playSilence(IBinder caller, long duration, int queueMode, String utteranceId) {
+ if (!checkNonNull(caller)) {
return TextToSpeech.ERROR;
}
SpeechItem item = new SilenceSpeechItem(caller,
- Binder.getCallingUid(), Binder.getCallingPid(), params, duration);
+ Binder.getCallingUid(), Binder.getCallingPid(), utteranceId, duration);
return mSynthHandler.enqueueSpeechItem(queueMode, item);
}
@@ -912,7 +1398,7 @@ public abstract class TextToSpeechService extends Service {
retVal == TextToSpeech.LANG_COUNTRY_VAR_AVAILABLE) {
SpeechItem item = new LoadLanguageItem(caller, Binder.getCallingUid(),
- Binder.getCallingPid(), null, lang, country, variant);
+ Binder.getCallingPid(), lang, country, variant);
if (mSynthHandler.enqueueSpeechItem(TextToSpeech.QUEUE_ADD, item) !=
TextToSpeech.SUCCESS) {
@@ -943,6 +1429,58 @@ public abstract class TextToSpeechService extends Service {
}
return true;
}
+
+ @Override
+ public List<VoiceInfo> getVoicesInfo() {
+ return TextToSpeechService.this.getVoicesInfo();
+ }
+
+ @Override
+ public int speakV2(IBinder callingInstance,
+ SynthesisRequestV2 request) {
+ if (!checkNonNull(callingInstance, request)) {
+ return TextToSpeech.ERROR;
+ }
+
+ SpeechItem item = new SynthesisSpeechItemV2(callingInstance,
+ Binder.getCallingUid(), Binder.getCallingPid(), request);
+ return mSynthHandler.enqueueSpeechItem(TextToSpeech.QUEUE_ADD, item);
+ }
+
+ @Override
+ public int synthesizeToFileDescriptorV2(IBinder callingInstance,
+ ParcelFileDescriptor fileDescriptor,
+ SynthesisRequestV2 request) {
+ if (!checkNonNull(callingInstance, request, fileDescriptor)) {
+ return TextToSpeech.ERROR;
+ }
+
+ // In test env, ParcelFileDescriptor instance may be EXACTLY the same
+ // one that is used by client. And it will be closed by a client, thus
+ // preventing us from writing anything to it.
+ final ParcelFileDescriptor sameFileDescriptor = ParcelFileDescriptor.adoptFd(
+ fileDescriptor.detachFd());
+
+ SpeechItem item = new SynthesisToFileOutputStreamSpeechItemV2(callingInstance,
+ Binder.getCallingUid(), Binder.getCallingPid(), request,
+ new ParcelFileDescriptor.AutoCloseOutputStream(sameFileDescriptor));
+ return mSynthHandler.enqueueSpeechItem(TextToSpeech.QUEUE_ADD, item);
+
+ }
+
+ @Override
+ public int playAudioV2(
+ IBinder callingInstance, Uri audioUri, String utteranceId,
+ Bundle systemParameters) {
+ if (!checkNonNull(callingInstance, audioUri, systemParameters)) {
+ return TextToSpeech.ERROR;
+ }
+
+ SpeechItem item = new AudioSpeechItemV2(callingInstance,
+ Binder.getCallingUid(), Binder.getCallingPid(), utteranceId, systemParameters,
+ audioUri);
+ return mSynthHandler.enqueueSpeechItem(TextToSpeech.QUEUE_ADD, item);
+ }
};
private class CallbackMap extends RemoteCallbackList<ITextToSpeechCallback> {
@@ -964,11 +1502,31 @@ public abstract class TextToSpeechService extends Service {
}
}
- public void dispatchOnDone(Object callerIdentity, String utteranceId) {
+ public void dispatchOnFallback(Object callerIdentity, String utteranceId) {
+ ITextToSpeechCallback cb = getCallbackFor(callerIdentity);
+ if (cb == null) return;
+ try {
+ cb.onFallback(utteranceId);
+ } catch (RemoteException e) {
+ Log.e(TAG, "Callback onFallback failed: " + e);
+ }
+ }
+
+ public void dispatchOnStop(Object callerIdentity, String utteranceId) {
+ ITextToSpeechCallback cb = getCallbackFor(callerIdentity);
+ if (cb == null) return;
+ try {
+ cb.onStop(utteranceId);
+ } catch (RemoteException e) {
+ Log.e(TAG, "Callback onStop failed: " + e);
+ }
+ }
+
+ public void dispatchOnSuccess(Object callerIdentity, String utteranceId) {
ITextToSpeechCallback cb = getCallbackFor(callerIdentity);
if (cb == null) return;
try {
- cb.onDone(utteranceId);
+ cb.onSuccess(utteranceId);
} catch (RemoteException e) {
Log.e(TAG, "Callback onDone failed: " + e);
}
@@ -985,11 +1543,12 @@ public abstract class TextToSpeechService extends Service {
}
- public void dispatchOnError(Object callerIdentity, String utteranceId) {
+ public void dispatchOnError(Object callerIdentity, String utteranceId,
+ int errorCode) {
ITextToSpeechCallback cb = getCallbackFor(callerIdentity);
if (cb == null) return;
try {
- cb.onError(utteranceId);
+ cb.onError(utteranceId, errorCode);
} catch (RemoteException e) {
Log.e(TAG, "Callback onError failed: " + e);
}
@@ -1001,7 +1560,7 @@ public abstract class TextToSpeechService extends Service {
synchronized (mCallerToCallback) {
mCallerToCallback.remove(caller);
}
- mSynthHandler.stopForApp(caller);
+ //mSynthHandler.stopForApp(caller);
}
@Override
@@ -1012,6 +1571,18 @@ public abstract class TextToSpeechService extends Service {
}
}
+ public void dispatchVoicesInfoChange(List<VoiceInfo> voicesInfo) {
+ synchronized (mCallerToCallback) {
+ for (ITextToSpeechCallback callback : mCallerToCallback.values()) {
+ try {
+ callback.onVoicesInfoChange(voicesInfo);
+ } catch (RemoteException e) {
+ Log.e(TAG, "Failed to request reconnect", e);
+ }
+ }
+ }
+ }
+
private ITextToSpeechCallback getCallbackFor(Object caller) {
ITextToSpeechCallback cb;
IBinder asBinder = (IBinder) caller;
@@ -1021,7 +1592,5 @@ public abstract class TextToSpeechService extends Service {
return cb;
}
-
}
-
}
diff --git a/core/java/android/speech/tts/VoiceInfo.aidl b/core/java/android/speech/tts/VoiceInfo.aidl
new file mode 100644
index 0000000..4005f8b
--- /dev/null
+++ b/core/java/android/speech/tts/VoiceInfo.aidl
@@ -0,0 +1,20 @@
+/*
+**
+** Copyright 2013, 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.tts;
+
+parcelable VoiceInfo; \ No newline at end of file
diff --git a/core/java/android/speech/tts/VoiceInfo.java b/core/java/android/speech/tts/VoiceInfo.java
new file mode 100644
index 0000000..16b9a97
--- /dev/null
+++ b/core/java/android/speech/tts/VoiceInfo.java
@@ -0,0 +1,325 @@
+package android.speech.tts;
+
+import android.os.Bundle;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import java.util.Locale;
+
+/**
+ * Characteristics and features of a Text-To-Speech Voice. Each TTS Engine can expose
+ * multiple voices for multiple locales, with different set of features.
+ *
+ * Each VoiceInfo has an unique name. This name can be obtained using the {@link #getName()} method
+ * and will persist until the client is asked to re-evaluate the list of available voices in the
+ * {@link TextToSpeechClient.ConnectionCallbacks#onEngineStatusChange(android.speech.tts.TextToSpeechClient.EngineStatus)}
+ * callback. The name can be used to reference a VoiceInfo in an instance of {@link RequestConfig};
+ * the {@link TextToSpeechClient.Params#FALLBACK_VOICE_NAME} voice parameter is an example of this.
+ * It is recommended that the voice name never change during the TTS service lifetime.
+ */
+public final class VoiceInfo implements Parcelable {
+ /** Very low, but still intelligible quality of speech synthesis */
+ public static final int QUALITY_VERY_LOW = 100;
+
+ /** Low, not human-like quality of speech synthesis */
+ public static final int QUALITY_LOW = 200;
+
+ /** Normal quality of speech synthesis */
+ public static final int QUALITY_NORMAL = 300;
+
+ /** High, human-like quality of speech synthesis */
+ public static final int QUALITY_HIGH = 400;
+
+ /** Very high, almost human-indistinguishable quality of speech synthesis */
+ public static final int QUALITY_VERY_HIGH = 500;
+
+ /** Very low expected synthesizer latency (< 20ms) */
+ public static final int LATENCY_VERY_LOW = 100;
+
+ /** Low expected synthesizer latency (~20ms) */
+ public static final int LATENCY_LOW = 200;
+
+ /** Normal expected synthesizer latency (~50ms) */
+ public static final int LATENCY_NORMAL = 300;
+
+ /** Network based expected synthesizer latency (~200ms) */
+ public static final int LATENCY_HIGH = 400;
+
+ /** Very slow network based expected synthesizer latency (> 200ms) */
+ public static final int LATENCY_VERY_HIGH = 500;
+
+ /** Additional feature key, with string value, gender of the speaker */
+ public static final String FEATURE_SPEAKER_GENDER = "speakerGender";
+
+ /** Additional feature key, with integer value, speaking speed in words per minute
+ * when {@link TextToSpeechClient.Params#SPEECH_SPEED} parameter is set to {@code 1.0} */
+ public static final String FEATURE_WORDS_PER_MINUTE = "wordsPerMinute";
+
+ /**
+ * Additional feature key, with boolean value, that indicates that voice may need to
+ * download additional data if used for synthesis.
+ *
+ * Making a request with a voice that has this feature may result in a
+ * {@link TextToSpeechClient.Status#ERROR_DOWNLOADING_ADDITIONAL_DATA} error. It's recommended
+ * to set the {@link TextToSpeechClient.Params#FALLBACK_VOICE_NAME} voice parameter to reference
+ * a fully installed voice (or network voice) that can serve as replacement.
+ *
+ * Note: It's a good practice for a TTS engine to provide a sensible fallback voice as the
+ * default value for {@link TextToSpeechClient.Params#FALLBACK_VOICE_NAME} parameter if this
+ * feature is present.
+ */
+ public static final String FEATURE_MAY_AUTOINSTALL = "mayAutoInstall";
+
+ private final String mName;
+ private final Locale mLocale;
+ private final int mQuality;
+ private final int mLatency;
+ private final boolean mRequiresNetworkConnection;
+ private final Bundle mParams;
+ private final Bundle mAdditionalFeatures;
+
+ private VoiceInfo(Parcel in) {
+ this.mName = in.readString();
+ String[] localesData = new String[3];
+ in.readStringArray(localesData);
+ this.mLocale = new Locale(localesData[0], localesData[1], localesData[2]);
+
+ this.mQuality = in.readInt();
+ this.mLatency = in.readInt();
+ this.mRequiresNetworkConnection = (in.readByte() == 1);
+
+ this.mParams = in.readBundle();
+ this.mAdditionalFeatures = in.readBundle();
+ }
+
+ private VoiceInfo(String name,
+ Locale locale,
+ int quality,
+ int latency,
+ boolean requiresNetworkConnection,
+ Bundle params,
+ Bundle additionalFeatures) {
+ this.mName = name;
+ this.mLocale = locale;
+ this.mQuality = quality;
+ this.mLatency = latency;
+ this.mRequiresNetworkConnection = requiresNetworkConnection;
+ this.mParams = params;
+ this.mAdditionalFeatures = additionalFeatures;
+ }
+
+ /** Builder, allows TTS engines to create VoiceInfo instances. */
+ public static final class Builder {
+ private String name;
+ private Locale locale;
+ private int quality = VoiceInfo.QUALITY_NORMAL;
+ private int latency = VoiceInfo.LATENCY_NORMAL;
+ private boolean requiresNetworkConnection;
+ private Bundle params;
+ private Bundle additionalFeatures;
+
+ public Builder() {
+
+ }
+
+ /**
+ * Copy fields from given VoiceInfo instance.
+ */
+ public Builder(VoiceInfo voiceInfo) {
+ this.name = voiceInfo.mName;
+ this.locale = voiceInfo.mLocale;
+ this.quality = voiceInfo.mQuality;
+ this.latency = voiceInfo.mLatency;
+ this.requiresNetworkConnection = voiceInfo.mRequiresNetworkConnection;
+ this.params = (Bundle)voiceInfo.mParams.clone();
+ this.additionalFeatures = (Bundle) voiceInfo.mAdditionalFeatures.clone();
+ }
+
+ /**
+ * Sets the voice's unique name. It will be used by clients to reference the voice used by a
+ * request.
+ *
+ * It's recommended that each voice use the same consistent name during the TTS service
+ * lifetime.
+ */
+ public Builder setName(String name) {
+ this.name = name;
+ return this;
+ }
+
+ /**
+ * Sets voice locale. This has to be a valid locale, built from ISO 639-1 and ISO 3166-1
+ * two letter codes.
+ */
+ public Builder setLocale(Locale locale) {
+ this.locale = locale;
+ return this;
+ }
+
+ /**
+ * Sets map of all available request parameters with their default values.
+ * Some common parameter names can be found in {@link TextToSpeechClient.Params} static
+ * members.
+ */
+ public Builder setParamsWithDefaults(Bundle params) {
+ this.params = params;
+ return this;
+ }
+
+ /**
+ * Sets map of additional voice features. Some common feature names can be found in
+ * {@link VoiceInfo} static members.
+ */
+ public Builder setAdditionalFeatures(Bundle additionalFeatures) {
+ this.additionalFeatures = additionalFeatures;
+ return this;
+ }
+
+ /**
+ * Sets the voice quality (higher is better).
+ */
+ public Builder setQuality(int quality) {
+ this.quality = quality;
+ return this;
+ }
+
+ /**
+ * Sets the voice latency (lower is better).
+ */
+ public Builder setLatency(int latency) {
+ this.latency = latency;
+ return this;
+ }
+
+ /**
+ * Sets whether the voice requires network connection to work properly.
+ */
+ public Builder setRequiresNetworkConnection(boolean requiresNetworkConnection) {
+ this.requiresNetworkConnection = requiresNetworkConnection;
+ return this;
+ }
+
+ /**
+ * @return The built VoiceInfo instance.
+ */
+ public VoiceInfo build() {
+ if (name == null || name.isEmpty()) {
+ throw new IllegalStateException("Name can't be null or empty");
+ }
+ if (locale == null) {
+ throw new IllegalStateException("Locale can't be null");
+ }
+
+ return new VoiceInfo(name, locale, quality, latency,
+ requiresNetworkConnection,
+ ((params == null) ? new Bundle() :
+ (Bundle)params.clone()),
+ ((additionalFeatures == null) ? new Bundle() :
+ (Bundle)additionalFeatures.clone()));
+ }
+ }
+
+ /**
+ * @hide
+ */
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ /**
+ * @hide
+ */
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeString(mName);
+ String[] localesData = new String[]{mLocale.getLanguage(), mLocale.getCountry(), mLocale.getVariant()};
+ dest.writeStringArray(localesData);
+ dest.writeInt(mQuality);
+ dest.writeInt(mLatency);
+ dest.writeByte((byte) (mRequiresNetworkConnection ? 1 : 0));
+ dest.writeBundle(mParams);
+ dest.writeBundle(mAdditionalFeatures);
+ }
+
+ /**
+ * @hide
+ */
+ public static final Parcelable.Creator<VoiceInfo> CREATOR = new Parcelable.Creator<VoiceInfo>() {
+ @Override
+ public VoiceInfo createFromParcel(Parcel in) {
+ return new VoiceInfo(in);
+ }
+
+ @Override
+ public VoiceInfo[] newArray(int size) {
+ return new VoiceInfo[size];
+ }
+ };
+
+ /**
+ * @return The voice's locale
+ */
+ public Locale getLocale() {
+ return mLocale;
+ }
+
+ /**
+ * @return The voice's quality (higher is better)
+ */
+ public int getQuality() {
+ return mQuality;
+ }
+
+ /**
+ * @return The voice's latency (lower is better)
+ */
+ public int getLatency() {
+ return mLatency;
+ }
+
+ /**
+ * @return Does the Voice require a network connection to work.
+ */
+ public boolean getRequiresNetworkConnection() {
+ return mRequiresNetworkConnection;
+ }
+
+ /**
+ * @return Bundle of all available parameters with their default values.
+ */
+ public Bundle getParamsWithDefaults() {
+ return mParams;
+ }
+
+ /**
+ * @return Unique voice name.
+ *
+ * Each VoiceInfo has an unique name, that persists until client is asked to re-evaluate the
+ * set of the available languages in the {@link TextToSpeechClient.ConnectionCallbacks#onEngineStatusChange(android.speech.tts.TextToSpeechClient.EngineStatus)}
+ * callback (Voice may disappear from the set if voice was removed by the user).
+ */
+ public String getName() {
+ return mName;
+ }
+
+ /**
+ * @return Additional features of the voice.
+ */
+ public Bundle getAdditionalFeatures() {
+ return mAdditionalFeatures;
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder builder = new StringBuilder(64);
+ return builder.append("VoiceInfo[Name: ").append(mName)
+ .append(" ,locale: ").append(mLocale)
+ .append(" ,quality: ").append(mQuality)
+ .append(" ,latency: ").append(mLatency)
+ .append(" ,requiresNetwork: ").append(mRequiresNetworkConnection)
+ .append(" ,paramsWithDefaults: ").append(mParams.toString())
+ .append(" ,additionalFeatures: ").append(mAdditionalFeatures.toString())
+ .append("]").toString();
+ }
+}
diff --git a/core/java/android/text/style/SuggestionSpan.java b/core/java/android/text/style/SuggestionSpan.java
index 0ec7e84..8b40953 100644
--- a/core/java/android/text/style/SuggestionSpan.java
+++ b/core/java/android/text/style/SuggestionSpan.java
@@ -166,25 +166,25 @@ public class SuggestionSpan extends CharacterStyle implements ParcelableSpan {
return;
}
- int defStyle = com.android.internal.R.attr.textAppearanceMisspelledSuggestion;
+ int defStyleAttr = com.android.internal.R.attr.textAppearanceMisspelledSuggestion;
TypedArray typedArray = context.obtainStyledAttributes(
- null, com.android.internal.R.styleable.SuggestionSpan, defStyle, 0);
+ null, com.android.internal.R.styleable.SuggestionSpan, defStyleAttr, 0);
mMisspelledUnderlineThickness = typedArray.getDimension(
com.android.internal.R.styleable.SuggestionSpan_textUnderlineThickness, 0);
mMisspelledUnderlineColor = typedArray.getColor(
com.android.internal.R.styleable.SuggestionSpan_textUnderlineColor, Color.BLACK);
- defStyle = com.android.internal.R.attr.textAppearanceEasyCorrectSuggestion;
+ defStyleAttr = com.android.internal.R.attr.textAppearanceEasyCorrectSuggestion;
typedArray = context.obtainStyledAttributes(
- null, com.android.internal.R.styleable.SuggestionSpan, defStyle, 0);
+ null, com.android.internal.R.styleable.SuggestionSpan, defStyleAttr, 0);
mEasyCorrectUnderlineThickness = typedArray.getDimension(
com.android.internal.R.styleable.SuggestionSpan_textUnderlineThickness, 0);
mEasyCorrectUnderlineColor = typedArray.getColor(
com.android.internal.R.styleable.SuggestionSpan_textUnderlineColor, Color.BLACK);
- defStyle = com.android.internal.R.attr.textAppearanceAutoCorrectionSuggestion;
+ defStyleAttr = com.android.internal.R.attr.textAppearanceAutoCorrectionSuggestion;
typedArray = context.obtainStyledAttributes(
- null, com.android.internal.R.styleable.SuggestionSpan, defStyle, 0);
+ null, com.android.internal.R.styleable.SuggestionSpan, defStyleAttr, 0);
mAutoCorrectionUnderlineThickness = typedArray.getDimension(
com.android.internal.R.styleable.SuggestionSpan_textUnderlineThickness, 0);
mAutoCorrectionUnderlineColor = typedArray.getColor(
diff --git a/core/java/android/transition/Recolor.java b/core/java/android/transition/Recolor.java
index 70111d1..1638f67 100644
--- a/core/java/android/transition/Recolor.java
+++ b/core/java/android/transition/Recolor.java
@@ -17,7 +17,6 @@
package android.transition;
import android.animation.Animator;
-import android.animation.ArgbEvaluator;
import android.animation.ObjectAnimator;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
@@ -75,8 +74,8 @@ public class Recolor extends Transition {
if (startColor.getColor() != endColor.getColor()) {
endColor.setColor(startColor.getColor());
changed = true;
- return ObjectAnimator.ofObject(endBackground, "color",
- new ArgbEvaluator(), startColor.getColor(), endColor.getColor());
+ return ObjectAnimator.ofArgb(endBackground, "color", startColor.getColor(),
+ endColor.getColor());
}
}
if (view instanceof TextView) {
@@ -86,8 +85,7 @@ public class Recolor extends Transition {
if (start != end) {
textView.setTextColor(end);
changed = true;
- return ObjectAnimator.ofObject(textView, "textColor",
- new ArgbEvaluator(), start, end);
+ return ObjectAnimator.ofArgb(textView, "textColor", start, end);
}
}
return null;
diff --git a/core/java/android/view/Display.java b/core/java/android/view/Display.java
index 354ea66..27e3b08 100644
--- a/core/java/android/view/Display.java
+++ b/core/java/android/view/Display.java
@@ -528,6 +528,7 @@ public final class Display {
* 90 degrees clockwise and thus the returned value here will be
* {@link Surface#ROTATION_90 Surface.ROTATION_90}.
*/
+ @Surface.Rotation
public int getRotation() {
synchronized (this) {
updateDisplayInfoLocked();
@@ -540,6 +541,7 @@ public final class Display {
* @return orientation of this display.
*/
@Deprecated
+ @Surface.Rotation
public int getOrientation() {
return getRotation();
}
diff --git a/core/java/android/view/DisplayInfo.java b/core/java/android/view/DisplayInfo.java
index 8944207..8af2b63 100644
--- a/core/java/android/view/DisplayInfo.java
+++ b/core/java/android/view/DisplayInfo.java
@@ -144,6 +144,7 @@ public final class DisplayInfo implements Parcelable {
* more than one physical display.
* </p>
*/
+ @Surface.Rotation
public int rotation;
/**
diff --git a/core/java/android/view/HapticFeedbackConstants.java b/core/java/android/view/HapticFeedbackConstants.java
index 8f40260..26f47f9 100644
--- a/core/java/android/view/HapticFeedbackConstants.java
+++ b/core/java/android/view/HapticFeedbackConstants.java
@@ -41,6 +41,11 @@ public class HapticFeedbackConstants {
public static final int KEYBOARD_TAP = 3;
/**
+ * The user has pressed either an hour or minute tick of a Clock.
+ */
+ public static final int CLOCK_TICK = 4;
+
+ /**
* This is a private constant. Feel free to renumber as desired.
* @hide
*/
diff --git a/core/java/android/view/Surface.java b/core/java/android/view/Surface.java
index 1bfda2d..a2775d4 100644
--- a/core/java/android/view/Surface.java
+++ b/core/java/android/view/Surface.java
@@ -16,6 +16,7 @@
package android.view;
+import android.annotation.IntDef;
import android.content.res.CompatibilityInfo.Translator;
import android.graphics.Canvas;
import android.graphics.Matrix;
@@ -24,6 +25,10 @@ import android.graphics.SurfaceTexture;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.Log;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
import dalvik.system.CloseGuard;
/**
@@ -80,6 +85,11 @@ public class Surface implements Parcelable {
// non compatibility mode.
private Matrix mCompatibleMatrix;
+ /** @hide */
+ @IntDef({ROTATION_0, ROTATION_90, ROTATION_180, ROTATION_270})
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface Rotation {}
+
/**
* Rotation constant: 0 degree rotation (natural orientation)
*/
diff --git a/core/java/android/view/SurfaceView.java b/core/java/android/view/SurfaceView.java
index 22d4c9b..65d3f6d 100644
--- a/core/java/android/view/SurfaceView.java
+++ b/core/java/android/view/SurfaceView.java
@@ -188,8 +188,13 @@ public class SurfaceView extends View {
init();
}
- public SurfaceView(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
+ public SurfaceView(Context context, AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ init();
+ }
+
+ public SurfaceView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
init();
}
diff --git a/core/java/android/view/TextureView.java b/core/java/android/view/TextureView.java
index 47f7628..bf81811 100644
--- a/core/java/android/view/TextureView.java
+++ b/core/java/android/view/TextureView.java
@@ -156,14 +156,32 @@ public class TextureView extends View {
*
* @param context The context to associate this view with.
* @param attrs The attributes of the XML tag that is inflating the view.
- * @param defStyle The default style to apply to this view. If 0, no style
- * will be applied (beyond what is included in the theme). This may
- * either be an attribute resource, whose value will be retrieved
- * from the current theme, or an explicit style resource.
+ * @param defStyleAttr An attribute in the current theme that contains a
+ * reference to a style resource that supplies default values for
+ * the view. Can be 0 to not look for defaults.
*/
@SuppressWarnings({"UnusedDeclaration"})
- public TextureView(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
+ public TextureView(Context context, AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ init();
+ }
+
+ /**
+ * Creates a new TextureView.
+ *
+ * @param context The context to associate this view with.
+ * @param attrs The attributes of the XML tag that is inflating the view.
+ * @param defStyleAttr An attribute in the current theme that contains a
+ * reference to a style resource that supplies default values for
+ * the view. Can be 0 to not look for defaults.
+ * @param defStyleRes A resource identifier of a style resource that
+ * supplies default values for the view, used only if
+ * defStyleAttr is 0 or can not be found in the theme. Can be 0
+ * to not look for defaults.
+ */
+ @SuppressWarnings({"UnusedDeclaration"})
+ public TextureView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
init();
}
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index b74202d..2f1ee67 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -16,6 +16,9 @@
package android.view;
+import android.annotation.IntDef;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.content.ClipData;
import android.content.Context;
import android.content.pm.ApplicationInfo;
@@ -87,6 +90,8 @@ import com.android.internal.view.menu.MenuBuilder;
import com.google.android.collect.Lists;
import com.google.android.collect.Maps;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
import java.lang.ref.WeakReference;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
@@ -730,6 +735,11 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
*/
private static final int FITS_SYSTEM_WINDOWS = 0x00000002;
+ /** @hide */
+ @IntDef({VISIBLE, INVISIBLE, GONE})
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface Visibility {}
+
/**
* This view is visible.
* Use with {@link #setVisibility} and <a href="#attr_android:visibility">{@code
@@ -897,6 +907,11 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
*/
static final int FOCUSABLE_IN_TOUCH_MODE = 0x00040000;
+ /** @hide */
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef({DRAWING_CACHE_QUALITY_LOW, DRAWING_CACHE_QUALITY_HIGH, DRAWING_CACHE_QUALITY_AUTO})
+ public @interface DrawingCacheQuality {}
+
/**
* <p>Enables low quality mode for the drawing cache.</p>
*/
@@ -941,6 +956,16 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
*/
static final int DUPLICATE_PARENT_STATE = 0x00400000;
+ /** @hide */
+ @IntDef({
+ SCROLLBARS_INSIDE_OVERLAY,
+ SCROLLBARS_INSIDE_INSET,
+ SCROLLBARS_OUTSIDE_OVERLAY,
+ SCROLLBARS_OUTSIDE_INSET
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface ScrollBarStyle {}
+
/**
* The scrollbar style to display the scrollbars inside the content area,
* without increasing the padding. The scrollbars will be overlaid with
@@ -1021,6 +1046,15 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
*/
static final int PARENT_SAVE_DISABLED_MASK = 0x20000000;
+ /** @hide */
+ @IntDef(flag = true,
+ value = {
+ FOCUSABLES_ALL,
+ FOCUSABLES_TOUCH_MODE
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface FocusableMode {}
+
/**
* View flag indicating whether {@link #addFocusables(ArrayList, int, int)}
* should add all focusable Views regardless if they are focusable in touch mode.
@@ -1033,6 +1067,28 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
*/
public static final int FOCUSABLES_TOUCH_MODE = 0x00000001;
+ /** @hide */
+ @IntDef({
+ FOCUS_BACKWARD,
+ FOCUS_FORWARD,
+ FOCUS_LEFT,
+ FOCUS_UP,
+ FOCUS_RIGHT,
+ FOCUS_DOWN
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface FocusDirection {}
+
+ /** @hide */
+ @IntDef({
+ FOCUS_LEFT,
+ FOCUS_UP,
+ FOCUS_RIGHT,
+ FOCUS_DOWN
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface FocusRealDirection {} // Like @FocusDirection, but without forward/backward
+
/**
* Use with {@link #focusSearch(int)}. Move focus to the previous selectable
* item.
@@ -1805,6 +1861,25 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
*/
static final int PFLAG2_DRAG_HOVERED = 0x00000002;
+ /** @hide */
+ @IntDef({
+ LAYOUT_DIRECTION_LTR,
+ LAYOUT_DIRECTION_RTL,
+ LAYOUT_DIRECTION_INHERIT,
+ LAYOUT_DIRECTION_LOCALE
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ // Not called LayoutDirection to avoid conflict with android.util.LayoutDirection
+ public @interface LayoutDir {}
+
+ /** @hide */
+ @IntDef({
+ LAYOUT_DIRECTION_LTR,
+ LAYOUT_DIRECTION_RTL
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface ResolvedLayoutDir {}
+
/**
* Horizontal layout direction of this view is from Left to Right.
* Use with {@link #setLayoutDirection}.
@@ -1983,7 +2058,20 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
static final int PFLAG2_TEXT_DIRECTION_RESOLVED_DEFAULT =
TEXT_DIRECTION_RESOLVED_DEFAULT << PFLAG2_TEXT_DIRECTION_RESOLVED_MASK_SHIFT;
- /*
+ /** @hide */
+ @IntDef({
+ TEXT_ALIGNMENT_INHERIT,
+ TEXT_ALIGNMENT_GRAVITY,
+ TEXT_ALIGNMENT_CENTER,
+ TEXT_ALIGNMENT_TEXT_START,
+ TEXT_ALIGNMENT_TEXT_END,
+ TEXT_ALIGNMENT_VIEW_START,
+ TEXT_ALIGNMENT_VIEW_END
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface TextAlignment {}
+
+ /**
* Default text alignment. The text alignment of this View is inherited from its parent.
* Use with {@link #setTextAlignment(int)}
*/
@@ -2665,6 +2753,12 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
+ /** @hide */
+ @IntDef(flag = true,
+ value = { FIND_VIEWS_WITH_TEXT, FIND_VIEWS_WITH_CONTENT_DESCRIPTION })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface FindViewFlags {}
+
/**
* Find views that render the specified text.
*
@@ -2686,7 +2780,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
* added and it is a responsibility of the client to call the APIs of
* the provider to determine whether the virtual tree rooted at this View
* contains the text, i.e. getting the list of {@link AccessibilityNodeInfo}s
- * represeting the virtual views with this text.
+ * representing the virtual views with this text.
*
* @see #findViewsWithText(ArrayList, CharSequence, int)
*
@@ -3478,27 +3572,64 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
}
/**
- * Perform inflation from XML and apply a class-specific base style. This
- * constructor of View allows subclasses to use their own base style when
- * they are inflating. For example, a Button class's constructor would call
- * this version of the super class constructor and supply
- * <code>R.attr.buttonStyle</code> for <var>defStyle</var>; this allows
- * the theme's button style to modify all of the base view attributes (in
- * particular its background) as well as the Button class's attributes.
+ * Perform inflation from XML and apply a class-specific base style from a
+ * theme attribute. This constructor of View allows subclasses to use their
+ * own base style when they are inflating. For example, a Button class's
+ * constructor would call this version of the super class constructor and
+ * supply <code>R.attr.buttonStyle</code> for <var>defStyleAttr</var>; this
+ * allows the theme's button style to modify all of the base view attributes
+ * (in particular its background) as well as the Button class's attributes.
*
* @param context The Context the view is running in, through which it can
* access the current theme, resources, etc.
* @param attrs The attributes of the XML tag that is inflating the view.
* @param defStyleAttr An attribute in the current theme that contains a
- * reference to a style resource to apply to this view. If 0, no
- * default style will be applied.
+ * reference to a style resource that supplies default values for
+ * the view. Can be 0 to not look for defaults.
* @see #View(Context, AttributeSet)
*/
public View(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
+ /**
+ * Perform inflation from XML and apply a class-specific base style from a
+ * theme attribute or style resource. This constructor of View allows
+ * subclasses to use their own base style when they are inflating.
+ * <p>
+ * When determining the final value of a particular attribute, there are
+ * four inputs that come into play:
+ * <ol>
+ * <li>Any attribute values in the given AttributeSet.
+ * <li>The style resource specified in the AttributeSet (named "style").
+ * <li>The default style specified by <var>defStyleAttr</var>.
+ * <li>The default style specified by <var>defStyleRes</var>.
+ * <li>The base values in this theme.
+ * </ol>
+ * <p>
+ * Each of these inputs is considered in-order, with the first listed taking
+ * precedence over the following ones. In other words, if in the
+ * AttributeSet you have supplied <code>&lt;Button * textColor="#ff000000"&gt;</code>
+ * , then the button's text will <em>always</em> be black, regardless of
+ * what is specified in any of the styles.
+ *
+ * @param context The Context the view is running in, through which it can
+ * access the current theme, resources, etc.
+ * @param attrs The attributes of the XML tag that is inflating the view.
+ * @param defStyleAttr An attribute in the current theme that contains a
+ * reference to a style resource that supplies default values for
+ * the view. Can be 0 to not look for defaults.
+ * @param defStyleRes A resource identifier of a style resource that
+ * supplies default values for the view, used only if
+ * defStyleAttr is 0 or can not be found in the theme. Can be 0
+ * to not look for defaults.
+ * @see #View(Context, AttributeSet, int)
+ */
+ public View(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
this(context);
- TypedArray a = context.obtainStyledAttributes(attrs, com.android.internal.R.styleable.View,
- defStyleAttr, 0);
+ final TypedArray a = context.obtainStyledAttributes(
+ attrs, com.android.internal.R.styleable.View, defStyleAttr, defStyleRes);
Drawable background = null;
@@ -4584,7 +4715,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
* @param previouslyFocusedRect The rectangle of the view that had focus
* prior in this View's coordinate system.
*/
- void handleFocusGainInternal(int direction, Rect previouslyFocusedRect) {
+ void handleFocusGainInternal(@FocusRealDirection int direction, Rect previouslyFocusedRect) {
if (DBG) {
System.out.println(this + " requestFocus()");
}
@@ -4795,7 +4926,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
* passed in as finer grained information about where the focus is coming
* from (in addition to direction). Will be <code>null</code> otherwise.
*/
- protected void onFocusChanged(boolean gainFocus, int direction, Rect previouslyFocusedRect) {
+ protected void onFocusChanged(boolean gainFocus, @FocusDirection int direction,
+ @Nullable Rect previouslyFocusedRect) {
if (gainFocus) {
sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED);
} else {
@@ -5655,6 +5787,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
*
* @attr ref android.R.styleable#View_drawingCacheQuality
*/
+ @DrawingCacheQuality
public int getDrawingCacheQuality() {
return mViewFlags & DRAWING_CACHE_QUALITY_MASK;
}
@@ -5672,7 +5805,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
*
* @attr ref android.R.styleable#View_drawingCacheQuality
*/
- public void setDrawingCacheQuality(int quality) {
+ public void setDrawingCacheQuality(@DrawingCacheQuality int quality) {
setFlags(quality, DRAWING_CACHE_QUALITY_MASK);
}
@@ -6009,6 +6142,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
@ViewDebug.IntToString(from = INVISIBLE, to = "INVISIBLE"),
@ViewDebug.IntToString(from = GONE, to = "GONE")
})
+ @Visibility
public int getVisibility() {
return mViewFlags & VISIBILITY_MASK;
}
@@ -6020,7 +6154,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
* @attr ref android.R.styleable#View_visibility
*/
@RemotableViewMethod
- public void setVisibility(int visibility) {
+ public void setVisibility(@Visibility int visibility) {
setFlags(visibility, VISIBILITY_MASK);
if (mBackground != null) mBackground.setVisible(visibility == VISIBLE, false);
}
@@ -6179,6 +6313,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
@ViewDebug.IntToString(from = LAYOUT_DIRECTION_INHERIT, to = "INHERIT"),
@ViewDebug.IntToString(from = LAYOUT_DIRECTION_LOCALE, to = "LOCALE")
})
+ @LayoutDir
public int getRawLayoutDirection() {
return (mPrivateFlags2 & PFLAG2_LAYOUT_DIRECTION_MASK) >> PFLAG2_LAYOUT_DIRECTION_MASK_SHIFT;
}
@@ -6201,7 +6336,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
* @attr ref android.R.styleable#View_layoutDirection
*/
@RemotableViewMethod
- public void setLayoutDirection(int layoutDirection) {
+ public void setLayoutDirection(@LayoutDir int layoutDirection) {
if (getRawLayoutDirection() != layoutDirection) {
// Reset the current layout direction and the resolved one
mPrivateFlags2 &= ~PFLAG2_LAYOUT_DIRECTION_MASK;
@@ -6231,6 +6366,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
@ViewDebug.IntToString(from = LAYOUT_DIRECTION_LTR, to = "RESOLVED_DIRECTION_LTR"),
@ViewDebug.IntToString(from = LAYOUT_DIRECTION_RTL, to = "RESOLVED_DIRECTION_RTL")
})
+ @ResolvedLayoutDir
public int getLayoutDirection() {
final int targetSdkVersion = getContext().getApplicationInfo().targetSdkVersion;
if (targetSdkVersion < JELLY_BEAN_MR1) {
@@ -6600,7 +6736,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
* @return The nearest focusable in the specified direction, or null if none
* can be found.
*/
- public View focusSearch(int direction) {
+ public View focusSearch(@FocusRealDirection int direction) {
if (mParent != null) {
return mParent.focusSearch(this, direction);
} else {
@@ -6619,7 +6755,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
* FOCUS_DOWN, FOCUS_LEFT, and FOCUS_RIGHT.
* @return True if the this view consumed this unhandled move.
*/
- public boolean dispatchUnhandledMove(View focused, int direction) {
+ public boolean dispatchUnhandledMove(View focused, @FocusRealDirection int direction) {
return false;
}
@@ -6631,7 +6767,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
* or FOCUS_BACKWARD.
* @return The user specified next view, or null if there is none.
*/
- View findUserSetNextFocus(View root, int direction) {
+ View findUserSetNextFocus(View root, @FocusDirection int direction) {
switch (direction) {
case FOCUS_LEFT:
if (mNextFocusLeftId == View.NO_ID) return null;
@@ -6681,7 +6817,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
* @param direction The direction of the focus
* @return A list of focusable views
*/
- public ArrayList<View> getFocusables(int direction) {
+ public ArrayList<View> getFocusables(@FocusDirection int direction) {
ArrayList<View> result = new ArrayList<View>(24);
addFocusables(result, direction);
return result;
@@ -6695,7 +6831,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
* @param views Focusable views found so far
* @param direction The direction of the focus
*/
- public void addFocusables(ArrayList<View> views, int direction) {
+ public void addFocusables(ArrayList<View> views, @FocusDirection int direction) {
addFocusables(views, direction, FOCUSABLES_TOUCH_MODE);
}
@@ -6715,7 +6851,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
* @see #FOCUSABLES_ALL
* @see #FOCUSABLES_TOUCH_MODE
*/
- public void addFocusables(ArrayList<View> views, int direction, int focusableMode) {
+ public void addFocusables(ArrayList<View> views, @FocusDirection int direction,
+ @FocusableMode int focusableMode) {
if (views == null) {
return;
}
@@ -6744,7 +6881,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
* @see #FIND_VIEWS_WITH_CONTENT_DESCRIPTION
* @see #setContentDescription(CharSequence)
*/
- public void findViewsWithText(ArrayList<View> outViews, CharSequence searched, int flags) {
+ public void findViewsWithText(ArrayList<View> outViews, CharSequence searched,
+ @FindViewFlags int flags) {
if (getAccessibilityNodeProvider() != null) {
if ((flags & FIND_VIEWS_WITH_ACCESSIBILITY_NODE_PROVIDERS) != 0) {
outViews.add(this);
@@ -7235,7 +7373,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
}
/**
- * Returns whether the View has registered callbacks wich makes it
+ * Returns whether the View has registered callbacks which makes it
* important for accessibility.
*
* @return True if the view is actionable for accessibility.
@@ -7254,7 +7392,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
* notification is at at most once every
* {@link ViewConfiguration#getSendRecurringAccessibilityEventsInterval()}
* to avoid unnecessary load to the system. Also once a view has a pending
- * notifucation this method is a NOP until the notification has been sent.
+ * notification this method is a NOP until the notification has been sent.
*
* @hide
*/
@@ -7934,7 +8072,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
* @param visibility The new visibility of changedView: {@link #VISIBLE},
* {@link #INVISIBLE} or {@link #GONE}.
*/
- protected void dispatchVisibilityChanged(View changedView, int visibility) {
+ protected void dispatchVisibilityChanged(@NonNull View changedView,
+ @Visibility int visibility) {
onVisibilityChanged(changedView, visibility);
}
@@ -7945,7 +8084,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
* @param visibility The new visibility of changedView: {@link #VISIBLE},
* {@link #INVISIBLE} or {@link #GONE}.
*/
- protected void onVisibilityChanged(View changedView, int visibility) {
+ protected void onVisibilityChanged(@NonNull View changedView, @Visibility int visibility) {
if (visibility == VISIBLE) {
if (mAttachInfo != null) {
initialAwakenScrollBars();
@@ -7964,7 +8103,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
* @param hint A hint about whether or not this view is displayed:
* {@link #VISIBLE} or {@link #INVISIBLE}.
*/
- public void dispatchDisplayHint(int hint) {
+ public void dispatchDisplayHint(@Visibility int hint) {
onDisplayHint(hint);
}
@@ -7977,7 +8116,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
* @param hint A hint about whether or not this view is displayed:
* {@link #VISIBLE} or {@link #INVISIBLE}.
*/
- protected void onDisplayHint(int hint) {
+ protected void onDisplayHint(@Visibility int hint) {
}
/**
@@ -7988,7 +8127,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
*
* @see #onWindowVisibilityChanged(int)
*/
- public void dispatchWindowVisibilityChanged(int visibility) {
+ public void dispatchWindowVisibilityChanged(@Visibility int visibility) {
onWindowVisibilityChanged(visibility);
}
@@ -8002,7 +8141,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
*
* @param visibility The new visibility of the window.
*/
- protected void onWindowVisibilityChanged(int visibility) {
+ protected void onWindowVisibilityChanged(@Visibility int visibility) {
if (visibility == VISIBLE) {
initialAwakenScrollBars();
}
@@ -8014,6 +8153,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
*
* @return Returns the current visibility of the view's window.
*/
+ @Visibility
public int getWindowVisibility() {
return mAttachInfo != null ? mAttachInfo.mWindowVisibility : GONE;
}
@@ -11694,7 +11834,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
*
* @attr ref android.R.styleable#View_scrollbarStyle
*/
- public void setScrollBarStyle(int style) {
+ public void setScrollBarStyle(@ScrollBarStyle int style) {
if (style != (mViewFlags & SCROLLBARS_STYLE_MASK)) {
mViewFlags = (mViewFlags & ~SCROLLBARS_STYLE_MASK) | (style & SCROLLBARS_STYLE_MASK);
computeOpaqueFlags();
@@ -11718,6 +11858,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
@ViewDebug.IntToString(from = SCROLLBARS_OUTSIDE_OVERLAY, to = "OUTSIDE_OVERLAY"),
@ViewDebug.IntToString(from = SCROLLBARS_OUTSIDE_INSET, to = "OUTSIDE_INSET")
})
+ @ScrollBarStyle
public int getScrollBarStyle() {
return mViewFlags & SCROLLBARS_STYLE_MASK;
}
@@ -12219,7 +12360,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
* @see #LAYOUT_DIRECTION_LTR
* @see #LAYOUT_DIRECTION_RTL
*/
- public void onRtlPropertiesChanged(int layoutDirection) {
+ public void onRtlPropertiesChanged(@ResolvedLayoutDir int layoutDirection) {
}
/**
@@ -15052,7 +15193,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
*
* @hide
*/
- public void onResolveDrawables(int layoutDirection) {
+ public void onResolveDrawables(@ResolvedLayoutDir int layoutDirection) {
}
/**
@@ -17856,6 +17997,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
@ViewDebug.IntToString(from = TEXT_ALIGNMENT_VIEW_START, to = "VIEW_START"),
@ViewDebug.IntToString(from = TEXT_ALIGNMENT_VIEW_END, to = "VIEW_END")
})
+ @TextAlignment
public int getRawTextAlignment() {
return (mPrivateFlags2 & PFLAG2_TEXT_ALIGNMENT_MASK) >> PFLAG2_TEXT_ALIGNMENT_MASK_SHIFT;
}
@@ -17879,7 +18021,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
*
* @attr ref android.R.styleable#View_textAlignment
*/
- public void setTextAlignment(int textAlignment) {
+ public void setTextAlignment(@TextAlignment int textAlignment) {
if (textAlignment != getRawTextAlignment()) {
// Reset the current and resolved text alignment
mPrivateFlags2 &= ~PFLAG2_TEXT_ALIGNMENT_MASK;
@@ -17920,6 +18062,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
@ViewDebug.IntToString(from = TEXT_ALIGNMENT_VIEW_START, to = "VIEW_START"),
@ViewDebug.IntToString(from = TEXT_ALIGNMENT_VIEW_END, to = "VIEW_END")
})
+ @TextAlignment
public int getTextAlignment() {
return (mPrivateFlags2 & PFLAG2_TEXT_ALIGNMENT_RESOLVED_MASK) >>
PFLAG2_TEXT_ALIGNMENT_RESOLVED_MASK_SHIFT;
@@ -18732,7 +18875,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
View mRootView;
IBinder mPanelParentWindowToken;
- Surface mSurface;
boolean mHardwareAccelerated;
boolean mHardwareAccelerationRequested;
diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java
index 9414237..01eec98 100644
--- a/core/java/android/view/ViewGroup.java
+++ b/core/java/android/view/ViewGroup.java
@@ -456,20 +456,21 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
private int mChildCountWithTransientState = 0;
public ViewGroup(Context context) {
- super(context);
- initViewGroup();
+ this(context, null);
}
public ViewGroup(Context context, AttributeSet attrs) {
- super(context, attrs);
- initViewGroup();
- initFromAttributes(context, attrs);
+ this(context, attrs, 0);
+ }
+
+ public ViewGroup(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
}
- public ViewGroup(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
+ public ViewGroup(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
initViewGroup();
- initFromAttributes(context, attrs);
+ initFromAttributes(context, attrs, defStyleAttr, defStyleRes);
}
private boolean debugDraw() {
@@ -499,9 +500,9 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
mPersistentDrawingCache = PERSISTENT_SCROLLING_CACHE;
}
- private void initFromAttributes(Context context, AttributeSet attrs) {
- TypedArray a = context.obtainStyledAttributes(attrs,
- R.styleable.ViewGroup);
+ private void initFromAttributes(
+ Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ final TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ViewGroup);
final int N = a.getIndexCount();
for (int i = 0; i < N; i++) {
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index bc0d7e3..909907c 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -108,7 +108,6 @@ public final class ViewRootImpl implements ViewParent,
private static final boolean DEBUG_IMF = false || LOCAL_LOGV;
private static final boolean DEBUG_CONFIGURATION = false || LOCAL_LOGV;
private static final boolean DEBUG_FPS = false;
- private static final boolean DEBUG_INPUT_PROCESSING = false || LOCAL_LOGV;
/**
* Set this system property to true to force the view hierarchy to render
@@ -1195,11 +1194,6 @@ public final class ViewRootImpl implements ViewParent,
desiredWindowHeight = packageMetrics.heightPixels;
}
- // For the very first time, tell the view hierarchy that it
- // is attached to the window. Note that at this point the surface
- // object is not initialized to its backing store, but soon it
- // will be (assuming the window is visible).
- attachInfo.mSurface = mSurface;
// We used to use the following condition to choose 32 bits drawing caches:
// PixelFormat.hasAlpha(lp.format) || lp.format == PixelFormat.RGBX_8888
// However, windows are now always 32 bits by default, so choose 32 bits
@@ -1548,7 +1542,7 @@ public final class ViewRootImpl implements ViewParent,
if (mAttachInfo.mHardwareRenderer != null) {
try {
hwInitialized = mAttachInfo.mHardwareRenderer.initialize(
- mHolder.getSurface());
+ mSurface);
} catch (OutOfResourcesException e) {
handleOutOfResourcesException(e);
return;
@@ -1575,7 +1569,7 @@ public final class ViewRootImpl implements ViewParent,
mSurfaceHolder == null && mAttachInfo.mHardwareRenderer != null) {
mFullRedrawNeeded = true;
try {
- mAttachInfo.mHardwareRenderer.updateSurface(mHolder.getSurface());
+ mAttachInfo.mHardwareRenderer.updateSurface(mSurface);
} catch (OutOfResourcesException e) {
handleOutOfResourcesException(e);
return;
@@ -1658,7 +1652,7 @@ public final class ViewRootImpl implements ViewParent,
mHeight != mAttachInfo.mHardwareRenderer.getHeight()) {
mAttachInfo.mHardwareRenderer.setup(mWidth, mHeight);
if (!hwInitialized) {
- mAttachInfo.mHardwareRenderer.invalidate(mHolder.getSurface());
+ mAttachInfo.mHardwareRenderer.invalidate(mSurface);
mFullRedrawNeeded = true;
}
}
@@ -2395,7 +2389,7 @@ public final class ViewRootImpl implements ViewParent,
try {
attachInfo.mHardwareRenderer.initializeIfNeeded(mWidth, mHeight,
- mHolder.getSurface());
+ mSurface);
} catch (OutOfResourcesException e) {
handleOutOfResourcesException(e);
return;
@@ -2530,28 +2524,35 @@ public final class ViewRootImpl implements ViewParent,
* @param canvas The canvas on which to draw.
*/
private void drawAccessibilityFocusedDrawableIfNeeded(Canvas canvas) {
- AccessibilityManager manager = AccessibilityManager.getInstance(mView.mContext);
+ if (!mAttachInfo.mHasWindowFocus) {
+ return;
+ }
+
+ final AccessibilityManager manager = AccessibilityManager.getInstance(mView.mContext);
if (!manager.isEnabled() || !manager.isTouchExplorationEnabled()) {
return;
}
- if (mAccessibilityFocusedHost == null || mAccessibilityFocusedHost.mAttachInfo == null) {
+
+ final View host = mAccessibilityFocusedHost;
+ if (host == null || host.mAttachInfo == null) {
return;
}
- Drawable drawable = getAccessibilityFocusedDrawable();
+
+ final Drawable drawable = getAccessibilityFocusedDrawable();
if (drawable == null) {
return;
}
- AccessibilityNodeProvider provider =
- mAccessibilityFocusedHost.getAccessibilityNodeProvider();
- Rect bounds = mView.mAttachInfo.mTmpInvalRect;
+
+ final AccessibilityNodeProvider provider = host.getAccessibilityNodeProvider();
+ final Rect bounds = mView.mAttachInfo.mTmpInvalRect;
if (provider == null) {
- mAccessibilityFocusedHost.getBoundsOnScreen(bounds);
- } else {
- if (mAccessibilityFocusedVirtualView == null) {
- return;
- }
+ host.getBoundsOnScreen(bounds);
+ } else if (mAccessibilityFocusedVirtualView != null) {
mAccessibilityFocusedVirtualView.getBoundsInScreen(bounds);
+ } else {
+ return;
}
+
bounds.offset(-mAttachInfo.mWindowLeft, -mAttachInfo.mWindowTop);
bounds.intersect(0, 0, mAttachInfo.mViewRootImpl.mWidth, mAttachInfo.mViewRootImpl.mHeight);
drawable.setBounds(bounds);
@@ -2850,7 +2851,6 @@ public final class ViewRootImpl implements ViewParent,
mView.assignParent(null);
mView = null;
mAttachInfo.mRootView = null;
- mAttachInfo.mSurface = null;
mSurface.release();
@@ -3110,7 +3110,7 @@ public final class ViewRootImpl implements ViewParent,
mFullRedrawNeeded = true;
try {
mAttachInfo.mHardwareRenderer.initializeIfNeeded(
- mWidth, mHeight, mHolder.getSurface());
+ mWidth, mHeight, mSurface);
} catch (OutOfResourcesException e) {
Log.e(TAG, "OutOfResourcesException locking surface", e);
try {
@@ -3159,8 +3159,6 @@ public final class ViewRootImpl implements ViewParent,
mHasHadWindowFocus = true;
}
- setAccessibilityFocus(null, null);
-
if (mView != null && mAccessibilityManager.isEnabled()) {
if (hasWindowFocus) {
mView.sendAccessibilityEvent(
@@ -4506,8 +4504,7 @@ public final class ViewRootImpl implements ViewParent,
// The active pointer id, or -1 if none.
private int mActivePointerId = -1;
- // Time and location where tracking started.
- private long mStartTime;
+ // Location where tracking started.
private float mStartX;
private float mStartY;
@@ -4535,9 +4532,6 @@ public final class ViewRootImpl implements ViewParent,
private boolean mFlinging;
private float mFlingVelocity;
- // The last time a confirm key was pressed on the touch nav device
- private long mLastConfirmKeyTime = Long.MAX_VALUE;
-
public SyntheticTouchNavigationHandler() {
super(true);
}
@@ -4604,7 +4598,6 @@ public final class ViewRootImpl implements ViewParent,
mActivePointerId = event.getPointerId(0);
mVelocityTracker = VelocityTracker.obtain();
mVelocityTracker.addMovement(event);
- mStartTime = time;
mStartX = event.getX();
mStartY = event.getY();
mLastX = mStartX;
@@ -5388,7 +5381,7 @@ public final class ViewRootImpl implements ViewParent,
// Hardware rendering
if (mAttachInfo.mHardwareRenderer != null) {
- if (mAttachInfo.mHardwareRenderer.loadSystemProperties(mHolder.getSurface())) {
+ if (mAttachInfo.mHardwareRenderer.loadSystemProperties(mSurface)) {
invalidate();
}
}
@@ -6335,68 +6328,6 @@ public final class ViewRootImpl implements ViewParent,
}
}
- private final SurfaceHolder mHolder = new SurfaceHolder() {
- // we only need a SurfaceHolder for opengl. it would be nice
- // to implement everything else though, especially the callback
- // support (opengl doesn't make use of it right now, but eventually
- // will).
- @Override
- public Surface getSurface() {
- return mSurface;
- }
-
- @Override
- public boolean isCreating() {
- return false;
- }
-
- @Override
- public void addCallback(Callback callback) {
- }
-
- @Override
- public void removeCallback(Callback callback) {
- }
-
- @Override
- public void setFixedSize(int width, int height) {
- }
-
- @Override
- public void setSizeFromLayout() {
- }
-
- @Override
- public void setFormat(int format) {
- }
-
- @Override
- public void setType(int type) {
- }
-
- @Override
- public void setKeepScreenOn(boolean screenOn) {
- }
-
- @Override
- public Canvas lockCanvas() {
- return null;
- }
-
- @Override
- public Canvas lockCanvas(Rect dirty) {
- return null;
- }
-
- @Override
- public void unlockCanvasAndPost(Canvas canvas) {
- }
- @Override
- public Rect getSurfaceFrame() {
- return null;
- }
- };
-
static RunQueue getRunQueue() {
RunQueue rq = sRunQueues.get();
if (rq != null) {
diff --git a/core/java/android/view/ViewStub.java b/core/java/android/view/ViewStub.java
index a5dc3ae..d68a860 100644
--- a/core/java/android/view/ViewStub.java
+++ b/core/java/android/view/ViewStub.java
@@ -97,16 +97,21 @@ public final class ViewStub extends View {
}
@SuppressWarnings({"UnusedDeclaration"})
- public ViewStub(Context context, AttributeSet attrs, int defStyle) {
- TypedArray a = context.obtainStyledAttributes(attrs, com.android.internal.R.styleable.ViewStub,
- defStyle, 0);
+ public ViewStub(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
+ public ViewStub(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ TypedArray a = context.obtainStyledAttributes(
+ attrs, com.android.internal.R.styleable.ViewStub, defStyleAttr, defStyleRes);
mInflatedId = a.getResourceId(R.styleable.ViewStub_inflatedId, NO_ID);
mLayoutResource = a.getResourceId(R.styleable.ViewStub_layout, 0);
a.recycle();
- a = context.obtainStyledAttributes(attrs, com.android.internal.R.styleable.View, defStyle, 0);
+ a = context.obtainStyledAttributes(
+ attrs, com.android.internal.R.styleable.View, defStyleAttr, defStyleRes);
mID = a.getResourceId(R.styleable.View_id, NO_ID);
a.recycle();
diff --git a/core/java/android/view/Window.java b/core/java/android/view/Window.java
index b3a0699..a940f73 100644
--- a/core/java/android/view/Window.java
+++ b/core/java/android/view/Window.java
@@ -16,6 +16,8 @@
package android.view;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.content.Context;
import android.content.res.Configuration;
import android.content.res.TypedArray;
@@ -240,6 +242,7 @@ public abstract class Window {
*
* @see #onPreparePanel
*/
+ @Nullable
public View onCreatePanelView(int featureId);
/**
@@ -368,6 +371,7 @@ public abstract class Window {
* @param callback Callback to control the lifecycle of this action mode
* @return The ActionMode that was started, or null if the system should present it
*/
+ @Nullable
public ActionMode onWindowStartingActionMode(ActionMode.Callback callback);
/**
@@ -969,6 +973,7 @@ public abstract class Window {
*
* @return View The current View with focus or null.
*/
+ @Nullable
public abstract View getCurrentFocus();
/**
@@ -977,6 +982,7 @@ public abstract class Window {
*
* @return LayoutInflater The shared LayoutInflater.
*/
+ @NonNull
public abstract LayoutInflater getLayoutInflater();
public abstract void setTitle(CharSequence title);
diff --git a/core/java/android/view/WindowManagerPolicy.java b/core/java/android/view/WindowManagerPolicy.java
index c5a1b86..d9e140e 100644
--- a/core/java/android/view/WindowManagerPolicy.java
+++ b/core/java/android/view/WindowManagerPolicy.java
@@ -16,7 +16,9 @@
package android.view;
+import android.annotation.IntDef;
import android.content.Context;
+import android.content.pm.ActivityInfo;
import android.content.res.CompatibilityInfo;
import android.content.res.Configuration;
import android.graphics.Rect;
@@ -27,6 +29,8 @@ import android.os.Looper;
import android.view.animation.Animation;
import java.io.PrintWriter;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
/**
* This interface supplies all UI-specific behavior of the window manager. An
@@ -464,6 +468,11 @@ public interface WindowManagerPolicy {
/** Screen turned off because of proximity sensor */
public final int OFF_BECAUSE_OF_PROX_SENSOR = 4;
+ /** @hide */
+ @IntDef({USER_ROTATION_FREE, USER_ROTATION_LOCKED})
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface UserRotationMode {}
+
/** When not otherwise specified by the activity's screenOrientation, rotation should be
* determined by the system (that is, using sensors). */
public final int USER_ROTATION_FREE = 0;
@@ -1022,7 +1031,8 @@ public interface WindowManagerPolicy {
* @param lastRotation The most recently used rotation.
* @return The surface rotation to use.
*/
- public int rotationForOrientationLw(int orientation, int lastRotation);
+ public int rotationForOrientationLw(@ActivityInfo.ScreenOrientation int orientation,
+ int lastRotation);
/**
* Given an orientation constant and a rotation, returns true if the rotation
@@ -1037,7 +1047,8 @@ public interface WindowManagerPolicy {
* @param rotation The rotation to check.
* @return True if the rotation is compatible with the requested orientation.
*/
- public boolean rotationHasCompatibleMetricsLw(int orientation, int rotation);
+ public boolean rotationHasCompatibleMetricsLw(@ActivityInfo.ScreenOrientation int orientation,
+ int rotation);
/**
* Called by the window manager when the rotation changes.
@@ -1086,7 +1097,7 @@ public interface WindowManagerPolicy {
*/
public void enableScreenAfterBoot();
- public void setCurrentOrientationLw(int newOrientation);
+ public void setCurrentOrientationLw(@ActivityInfo.ScreenOrientation int newOrientation);
/**
* Call from application to perform haptic feedback on its window.
@@ -1113,6 +1124,7 @@ public interface WindowManagerPolicy {
* @see WindowManagerPolicy#USER_ROTATION_LOCKED
* @see WindowManagerPolicy#USER_ROTATION_FREE
*/
+ @UserRotationMode
public int getUserRotationMode();
/**
@@ -1123,12 +1135,12 @@ public interface WindowManagerPolicy {
* @param rotation One of {@link Surface#ROTATION_0}, {@link Surface#ROTATION_90},
* {@link Surface#ROTATION_180}, {@link Surface#ROTATION_270}.
*/
- public void setUserRotationMode(int mode, int rotation);
+ public void setUserRotationMode(@UserRotationMode int mode, @Surface.Rotation int rotation);
/**
* Called when a new system UI visibility is being reported, allowing
* the policy to adjust what is actually reported.
- * @param visibility The raw visiblity reported by the status bar.
+ * @param visibility The raw visibility reported by the status bar.
* @return The new desired visibility.
*/
public int adjustSystemUiVisibilityLw(int visibility);
@@ -1151,6 +1163,11 @@ public interface WindowManagerPolicy {
public void setLastInputMethodWindowLw(WindowState ime, WindowState target);
/**
+ * @return The current height of the input method window.
+ */
+ public int getInputMethodWindowVisibleHeightLw();
+
+ /**
* Called when the current user changes. Guaranteed to be called before the broadcast
* of the new user id is made to all listeners.
*
diff --git a/core/java/android/view/accessibility/AccessibilityEvent.java b/core/java/android/view/accessibility/AccessibilityEvent.java
index f635eee..8b91155 100644
--- a/core/java/android/view/accessibility/AccessibilityEvent.java
+++ b/core/java/android/view/accessibility/AccessibilityEvent.java
@@ -722,7 +722,7 @@ public final class AccessibilityEvent extends AccessibilityRecord implements Par
int mAction;
int mContentChangeTypes;
- private final ArrayList<AccessibilityRecord> mRecords = new ArrayList<AccessibilityRecord>();
+ private ArrayList<AccessibilityRecord> mRecords;
/*
* Hide constructor from clients.
@@ -755,11 +755,13 @@ public final class AccessibilityEvent extends AccessibilityRecord implements Par
@Override
public void setSealed(boolean sealed) {
super.setSealed(sealed);
- List<AccessibilityRecord> records = mRecords;
- final int recordCount = records.size();
- for (int i = 0; i < recordCount; i++) {
- AccessibilityRecord record = records.get(i);
- record.setSealed(sealed);
+ final List<AccessibilityRecord> records = mRecords;
+ if (records != null) {
+ final int recordCount = records.size();
+ for (int i = 0; i < recordCount; i++) {
+ AccessibilityRecord record = records.get(i);
+ record.setSealed(sealed);
+ }
}
}
@@ -769,7 +771,7 @@ public final class AccessibilityEvent extends AccessibilityRecord implements Par
* @return The number of records.
*/
public int getRecordCount() {
- return mRecords.size();
+ return mRecords == null ? 0 : mRecords.size();
}
/**
@@ -781,6 +783,9 @@ public final class AccessibilityEvent extends AccessibilityRecord implements Par
*/
public void appendRecord(AccessibilityRecord record) {
enforceNotSealed();
+ if (mRecords == null) {
+ mRecords = new ArrayList<AccessibilityRecord>();
+ }
mRecords.add(record);
}
@@ -791,6 +796,9 @@ public final class AccessibilityEvent extends AccessibilityRecord implements Par
* @return The record at the specified index.
*/
public AccessibilityRecord getRecord(int index) {
+ if (mRecords == null) {
+ throw new IndexOutOfBoundsException("Invalid index " + index + ", size is 0");
+ }
return mRecords.get(index);
}
@@ -964,11 +972,14 @@ public final class AccessibilityEvent extends AccessibilityRecord implements Par
AccessibilityEvent eventClone = AccessibilityEvent.obtain();
eventClone.init(event);
- final int recordCount = event.mRecords.size();
- for (int i = 0; i < recordCount; i++) {
- AccessibilityRecord record = event.mRecords.get(i);
- AccessibilityRecord recordClone = AccessibilityRecord.obtain(record);
- eventClone.mRecords.add(recordClone);
+ if (event.mRecords != null) {
+ final int recordCount = event.mRecords.size();
+ eventClone.mRecords = new ArrayList<AccessibilityRecord>(recordCount);
+ for (int i = 0; i < recordCount; i++) {
+ final AccessibilityRecord record = event.mRecords.get(i);
+ final AccessibilityRecord recordClone = AccessibilityRecord.obtain(record);
+ eventClone.mRecords.add(recordClone);
+ }
}
return eventClone;
@@ -1013,9 +1024,11 @@ public final class AccessibilityEvent extends AccessibilityRecord implements Par
mContentChangeTypes = 0;
mPackageName = null;
mEventTime = 0;
- while (!mRecords.isEmpty()) {
- AccessibilityRecord record = mRecords.remove(0);
- record.recycle();
+ if (mRecords != null) {
+ while (!mRecords.isEmpty()) {
+ AccessibilityRecord record = mRecords.remove(0);
+ record.recycle();
+ }
}
}
@@ -1037,11 +1050,14 @@ public final class AccessibilityEvent extends AccessibilityRecord implements Par
// Read the records.
final int recordCount = parcel.readInt();
- for (int i = 0; i < recordCount; i++) {
- AccessibilityRecord record = AccessibilityRecord.obtain();
- readAccessibilityRecordFromParcel(record, parcel);
- record.mConnectionId = mConnectionId;
- mRecords.add(record);
+ if (recordCount > 0) {
+ mRecords = new ArrayList<AccessibilityRecord>(recordCount);
+ for (int i = 0; i < recordCount; i++) {
+ AccessibilityRecord record = AccessibilityRecord.obtain();
+ readAccessibilityRecordFromParcel(record, parcel);
+ record.mConnectionId = mConnectionId;
+ mRecords.add(record);
+ }
}
}
@@ -1147,8 +1163,8 @@ public final class AccessibilityEvent extends AccessibilityRecord implements Par
builder.append("; ContentChangeTypes: ").append(mContentChangeTypes);
builder.append("; sourceWindowId: ").append(mSourceWindowId);
builder.append("; mSourceNodeId: ").append(mSourceNodeId);
- for (int i = 0; i < mRecords.size(); i++) {
- AccessibilityRecord record = mRecords.get(i);
+ for (int i = 0; i < getRecordCount(); i++) {
+ final AccessibilityRecord record = getRecord(i);
builder.append(" Record ");
builder.append(i);
builder.append(":");
diff --git a/core/java/android/view/accessibility/AccessibilityManager.java b/core/java/android/view/accessibility/AccessibilityManager.java
index 00f4adb..324ba77 100644
--- a/core/java/android/view/accessibility/AccessibilityManager.java
+++ b/core/java/android/view/accessibility/AccessibilityManager.java
@@ -75,6 +75,42 @@ public final class AccessibilityManager {
/** @hide */
public static final int STATE_FLAG_TOUCH_EXPLORATION_ENABLED = 0x00000002;
+ /** @hide */
+ public static final int INVERSION_DISABLED = -1;
+
+ /** @hide */
+ public static final int INVERSION_STANDARD = 0;
+
+ /** @hide */
+ public static final int INVERSION_HUE_ONLY = 1;
+
+ /** @hide */
+ public static final int INVERSION_VALUE_ONLY = 2;
+
+ /** @hide */
+ public static final int DALTONIZER_DISABLED = -1;
+
+ /** @hide */
+ public static final int DALTONIZER_SIMULATE_MONOCHROMACY = 0;
+
+ /** @hide */
+ public static final int DALTONIZER_SIMULATE_PROTANOMALY = 1;
+
+ /** @hide */
+ public static final int DALTONIZER_SIMULATE_DEUTERANOMALY = 2;
+
+ /** @hide */
+ public static final int DALTONIZER_SIMULATE_TRITANOMALY = 3;
+
+ /** @hide */
+ public static final int DALTONIZER_CORRECT_PROTANOMALY = 11;
+
+ /** @hide */
+ public static final int DALTONIZER_CORRECT_DEUTERANOMALY = 12;
+
+ /** @hide */
+ public static final int DALTONIZER_CORRECT_TRITANOMALY = 13;
+
static final Object sInstanceSync = new Object();
private static AccessibilityManager sInstance;
diff --git a/core/java/android/view/inputmethod/BaseInputConnection.java b/core/java/android/view/inputmethod/BaseInputConnection.java
index f730cf7..5552952 100644
--- a/core/java/android/view/inputmethod/BaseInputConnection.java
+++ b/core/java/android/view/inputmethod/BaseInputConnection.java
@@ -601,7 +601,11 @@ public class BaseInputConnection implements InputConnection {
}
beginBatchEdit();
-
+ if (!composing && !TextUtils.isEmpty(text)) {
+ // Notify the text is committed by the user to InputMethodManagerService
+ mIMM.notifyTextCommitted();
+ }
+
// delete composing text set previously.
int a = getComposingSpanStart(content);
int b = getComposingSpanEnd(content);
diff --git a/core/java/android/view/inputmethod/InputMethodManager.java b/core/java/android/view/inputmethod/InputMethodManager.java
index 53f7c79..70c53d2 100644
--- a/core/java/android/view/inputmethod/InputMethodManager.java
+++ b/core/java/android/view/inputmethod/InputMethodManager.java
@@ -1805,6 +1805,20 @@ public final class InputMethodManager {
}
/**
+ * Notify the current IME commits text
+ * @hide
+ */
+ public void notifyTextCommitted() {
+ synchronized (mH) {
+ try {
+ mService.notifyTextCommitted();
+ } catch (RemoteException e) {
+ Log.w(TAG, "IME died: " + mCurId, e);
+ }
+ }
+ }
+
+ /**
* Returns a map of all shortcut input method info and their subtypes.
*/
public Map<InputMethodInfo, List<InputMethodSubtype>> getShortcutInputMethodsAndSubtypes() {
@@ -1840,6 +1854,21 @@ public final class InputMethodManager {
}
/**
+ * @return The current height of the input method window.
+ * @hide
+ */
+ public int getInputMethodWindowVisibleHeight() {
+ synchronized (mH) {
+ try {
+ return mService.getInputMethodWindowVisibleHeight();
+ } catch (RemoteException e) {
+ Log.w(TAG, "IME died: " + mCurId, e);
+ return 0;
+ }
+ }
+ }
+
+ /**
* Force switch to the last used input method and subtype. If the last input method didn't have
* any subtypes, the framework will simply switch to the last input method with no subtype
* specified.
diff --git a/core/java/android/view/inputmethod/InputMethodSubtype.java b/core/java/android/view/inputmethod/InputMethodSubtype.java
index 40f95ce..84072bf 100644
--- a/core/java/android/view/inputmethod/InputMethodSubtype.java
+++ b/core/java/android/view/inputmethod/InputMethodSubtype.java
@@ -472,12 +472,12 @@ public final class InputMethodSubtype implements Parcelable {
return (subtype.hashCode() == hashCode());
}
return (subtype.hashCode() == hashCode())
- && (subtype.getNameResId() == getNameResId())
- && (subtype.getMode().equals(getMode()))
- && (subtype.getIconResId() == getIconResId())
&& (subtype.getLocale().equals(getLocale()))
+ && (subtype.getMode().equals(getMode()))
&& (subtype.getExtraValue().equals(getExtraValue()))
&& (subtype.isAuxiliary() == isAuxiliary())
+ && (subtype.overridesImplicitlyEnabledSubtype()
+ == overridesImplicitlyEnabledSubtype())
&& (subtype.isAsciiCapable() == isAsciiCapable());
}
return false;
diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java
index 5bc39f1..9fc8779 100644
--- a/core/java/android/webkit/WebView.java
+++ b/core/java/android/webkit/WebView.java
@@ -28,7 +28,6 @@ import android.graphics.drawable.Drawable;
import android.net.http.SslCertificate;
import android.os.Build;
import android.os.Bundle;
-import android.os.CancellationSignal;
import android.os.Looper;
import android.os.Message;
import android.os.StrictMode;
@@ -50,6 +49,7 @@ import android.widget.AbsoluteLayout;
import java.io.BufferedWriter;
import java.io.File;
+import java.io.OutputStream;
import java.util.Map;
/**
@@ -255,7 +255,7 @@ public class WebView extends AbsoluteLayout
// Throwing an exception for incorrect thread usage if the
// build target is JB MR2 or newer. Defaults to false, and is
// set in the WebView constructor.
- private static Boolean sEnforceThreadChecking = false;
+ private static volatile boolean sEnforceThreadChecking = false;
/**
* Transportation object for returning WebView across thread boundaries.
@@ -449,10 +449,12 @@ public class WebView extends AbsoluteLayout
*
* @param context a Context object used to access application assets
* @param attrs an AttributeSet passed to our parent
- * @param defStyle the default style resource ID
+ * @param defStyleAttr an attribute in the current theme that contains a
+ * reference to a style resource that supplies default values for
+ * the view. Can be 0 to not look for defaults.
*/
- public WebView(Context context, AttributeSet attrs, int defStyle) {
- this(context, attrs, defStyle, false);
+ public WebView(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
}
/**
@@ -460,7 +462,26 @@ public class WebView extends AbsoluteLayout
*
* @param context a Context object used to access application assets
* @param attrs an AttributeSet passed to our parent
- * @param defStyle the default style resource ID
+ * @param defStyleAttr an attribute in the current theme that contains a
+ * reference to a style resource that supplies default values for
+ * the view. Can be 0 to not look for defaults.
+ * @param defStyleRes a resource identifier of a style resource that
+ * supplies default values for the view, used only if
+ * defStyleAttr is 0 or can not be found in the theme. Can be 0
+ * to not look for defaults.
+ */
+ public WebView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ this(context, attrs, defStyleAttr, defStyleRes, null, false);
+ }
+
+ /**
+ * Constructs a new WebView with layout parameters and a default style.
+ *
+ * @param context a Context object used to access application assets
+ * @param attrs an AttributeSet passed to our parent
+ * @param defStyleAttr an attribute in the current theme that contains a
+ * reference to a style resource that supplies default values for
+ * the view. Can be 0 to not look for defaults.
* @param privateBrowsing whether this WebView will be initialized in
* private mode
*
@@ -470,9 +491,9 @@ public class WebView extends AbsoluteLayout
* and {@link WebStorage} for fine-grained control of privacy data.
*/
@Deprecated
- public WebView(Context context, AttributeSet attrs, int defStyle,
+ public WebView(Context context, AttributeSet attrs, int defStyleAttr,
boolean privateBrowsing) {
- this(context, attrs, defStyle, null, privateBrowsing);
+ this(context, attrs, defStyleAttr, 0, null, privateBrowsing);
}
/**
@@ -483,7 +504,9 @@ public class WebView extends AbsoluteLayout
*
* @param context a Context object used to access application assets
* @param attrs an AttributeSet passed to our parent
- * @param defStyle the default style resource ID
+ * @param defStyleAttr an attribute in the current theme that contains a
+ * reference to a style resource that supplies default values for
+ * the view. Can be 0 to not look for defaults.
* @param javaScriptInterfaces a Map of interface names, as keys, and
* object implementing those interfaces, as
* values
@@ -492,10 +515,18 @@ public class WebView extends AbsoluteLayout
* @hide This is used internally by dumprendertree, as it requires the javaScript interfaces to
* be added synchronously, before a subsequent loadUrl call takes effect.
*/
+ protected WebView(Context context, AttributeSet attrs, int defStyleAttr,
+ Map<String, Object> javaScriptInterfaces, boolean privateBrowsing) {
+ this(context, attrs, defStyleAttr, 0, javaScriptInterfaces, privateBrowsing);
+ }
+
+ /**
+ * @hide
+ */
@SuppressWarnings("deprecation") // for super() call into deprecated base class constructor.
- protected WebView(Context context, AttributeSet attrs, int defStyle,
+ protected WebView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes,
Map<String, Object> javaScriptInterfaces, boolean privateBrowsing) {
- super(context, attrs, defStyle);
+ super(context, attrs, defStyleAttr, defStyleRes);
if (context == null) {
throw new IllegalArgumentException("Invalid context argument");
}
@@ -686,6 +717,15 @@ public class WebView extends AbsoluteLayout
}
/**
+ * Used only by internal tests to free up memory.
+ *
+ * @hide
+ */
+ public static void freeMemoryForTests() {
+ getFactory().getStatics().freeMemoryForTests();
+ }
+
+ /**
* Informs WebView of the network state. This is used to set
* the JavaScript property window.navigator.isOnline and
* generates the online/offline event as specified in HTML5, sec. 5.7.7
@@ -781,7 +821,15 @@ public class WebView extends AbsoluteLayout
*/
public void loadUrl(String url, Map<String, String> additionalHttpHeaders) {
checkThread();
- if (DebugFlags.TRACE_API) Log.d(LOGTAG, "loadUrl(extra headers)=" + url);
+ if (DebugFlags.TRACE_API) {
+ StringBuilder headers = new StringBuilder();
+ if (additionalHttpHeaders != null) {
+ for (Map.Entry<String, String> entry : additionalHttpHeaders.entrySet()) {
+ headers.append(entry.getKey() + ":" + entry.getValue() + "\n");
+ }
+ }
+ Log.d(LOGTAG, "loadUrl(extra headers)=" + url + "\n" + headers);
+ }
mProvider.loadUrl(url, additionalHttpHeaders);
}
diff --git a/core/java/android/webkit/WebViewFactoryProvider.java b/core/java/android/webkit/WebViewFactoryProvider.java
index 9d9d882..e391aaf 100644
--- a/core/java/android/webkit/WebViewFactoryProvider.java
+++ b/core/java/android/webkit/WebViewFactoryProvider.java
@@ -50,6 +50,11 @@ public interface WebViewFactoryProvider {
String getDefaultUserAgent(Context context);
/**
+ * Used for tests only.
+ */
+ void freeMemoryForTests();
+
+ /**
* Implements the API method:
* {@link android.webkit.WebView#setWebContentsDebuggingEnabled(boolean) }
*/
diff --git a/core/java/android/webkit/WebViewProvider.java b/core/java/android/webkit/WebViewProvider.java
index 696aad4..b69b271 100644
--- a/core/java/android/webkit/WebViewProvider.java
+++ b/core/java/android/webkit/WebViewProvider.java
@@ -41,6 +41,7 @@ import android.webkit.WebView.PictureListener;
import java.io.BufferedWriter;
import java.io.File;
+import java.io.OutputStream;
import java.util.Map;
/**
diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java
index 092f474..413d6cf 100644
--- a/core/java/android/widget/AbsListView.java
+++ b/core/java/android/widget/AbsListView.java
@@ -55,6 +55,7 @@ import android.view.ViewConfiguration;
import android.view.ViewDebug;
import android.view.ViewGroup;
import android.view.ViewParent;
+import android.view.ViewRootImpl;
import android.view.ViewTreeObserver;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityManager;
@@ -581,7 +582,13 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
/**
* Helper object that renders and controls the fast scroll thumb.
*/
- private FastScroller mFastScroller;
+ private FastScroller mFastScroll;
+
+ /**
+ * Temporary holder for fast scroller style until a FastScroller object
+ * is created.
+ */
+ private int mFastScrollStyle;
private boolean mGlobalLayoutListenerAddedFilter;
@@ -773,14 +780,18 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
this(context, attrs, com.android.internal.R.attr.absListViewStyle);
}
- public AbsListView(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
+ public AbsListView(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
+ public AbsListView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
initAbsListView();
mOwnerThread = Thread.currentThread();
- TypedArray a = context.obtainStyledAttributes(attrs,
- com.android.internal.R.styleable.AbsListView, defStyle, 0);
+ final TypedArray a = context.obtainStyledAttributes(
+ attrs, com.android.internal.R.styleable.AbsListView, defStyleAttr, defStyleRes);
Drawable d = a.getDrawable(com.android.internal.R.styleable.AbsListView_listSelector);
if (d != null) {
@@ -809,6 +820,9 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
boolean enableFastScroll = a.getBoolean(R.styleable.AbsListView_fastScrollEnabled, false);
setFastScrollEnabled(enableFastScroll);
+ int fastScrollStyle = a.getResourceId(R.styleable.AbsListView_fastScrollStyle, 0);
+ setFastScrollStyle(fastScrollStyle);
+
boolean smoothScrollbar = a.getBoolean(R.styleable.AbsListView_smoothScrollbar, true);
setSmoothScrollbarEnabled(smoothScrollbar);
@@ -1238,17 +1252,31 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
}
private void setFastScrollerEnabledUiThread(boolean enabled) {
- if (mFastScroller != null) {
- mFastScroller.setEnabled(enabled);
+ if (mFastScroll != null) {
+ mFastScroll.setEnabled(enabled);
} else if (enabled) {
- mFastScroller = new FastScroller(this);
- mFastScroller.setEnabled(true);
+ mFastScroll = new FastScroller(this, mFastScrollStyle);
+ mFastScroll.setEnabled(true);
}
resolvePadding();
- if (mFastScroller != null) {
- mFastScroller.updateLayout();
+ if (mFastScroll != null) {
+ mFastScroll.updateLayout();
+ }
+ }
+
+ /**
+ * Specifies the style of the fast scroller decorations.
+ *
+ * @param styleResId style resource containing fast scroller properties
+ * @see android.R.styleable#FastScroll
+ */
+ public void setFastScrollStyle(int styleResId) {
+ if (mFastScroll == null) {
+ mFastScrollStyle = styleResId;
+ } else {
+ mFastScroll.setStyle(styleResId);
}
}
@@ -1288,8 +1316,8 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
}
private void setFastScrollerAlwaysVisibleUiThread(boolean alwaysShow) {
- if (mFastScroller != null) {
- mFastScroller.setAlwaysShow(alwaysShow);
+ if (mFastScroll != null) {
+ mFastScroll.setAlwaysShow(alwaysShow);
}
}
@@ -1307,17 +1335,17 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
* @see #setFastScrollAlwaysVisible(boolean)
*/
public boolean isFastScrollAlwaysVisible() {
- if (mFastScroller == null) {
+ if (mFastScroll == null) {
return mFastScrollEnabled && mFastScrollAlwaysVisible;
} else {
- return mFastScroller.isEnabled() && mFastScroller.isAlwaysShowEnabled();
+ return mFastScroll.isEnabled() && mFastScroll.isAlwaysShowEnabled();
}
}
@Override
public int getVerticalScrollbarWidth() {
- if (mFastScroller != null && mFastScroller.isEnabled()) {
- return Math.max(super.getVerticalScrollbarWidth(), mFastScroller.getWidth());
+ if (mFastScroll != null && mFastScroll.isEnabled()) {
+ return Math.max(super.getVerticalScrollbarWidth(), mFastScroll.getWidth());
}
return super.getVerticalScrollbarWidth();
}
@@ -1330,26 +1358,26 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
*/
@ViewDebug.ExportedProperty
public boolean isFastScrollEnabled() {
- if (mFastScroller == null) {
+ if (mFastScroll == null) {
return mFastScrollEnabled;
} else {
- return mFastScroller.isEnabled();
+ return mFastScroll.isEnabled();
}
}
@Override
public void setVerticalScrollbarPosition(int position) {
super.setVerticalScrollbarPosition(position);
- if (mFastScroller != null) {
- mFastScroller.setScrollbarPosition(position);
+ if (mFastScroll != null) {
+ mFastScroll.setScrollbarPosition(position);
}
}
@Override
public void setScrollBarStyle(int style) {
super.setScrollBarStyle(style);
- if (mFastScroller != null) {
- mFastScroller.setScrollBarStyle(style);
+ if (mFastScroll != null) {
+ mFastScroll.setScrollBarStyle(style);
}
}
@@ -1410,8 +1438,8 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
* Notify our scroll listener (if there is one) of a change in scroll state
*/
void invokeOnItemScrollListener() {
- if (mFastScroller != null) {
- mFastScroller.onScroll(mFirstPosition, getChildCount(), mItemCount);
+ if (mFastScroll != null) {
+ mFastScroll.onScroll(mFirstPosition, getChildCount(), mItemCount);
}
if (mOnScrollListener != null) {
mOnScrollListener.onScroll(this, mFirstPosition, getChildCount(), mItemCount);
@@ -2084,8 +2112,8 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
mRecycler.markChildrenDirty();
}
- if (mFastScroller != null && (mItemCount != mOldItemCount || mDataChanged)) {
- mFastScroller.onItemCountChanged(mItemCount);
+ if (mFastScroll != null && (mItemCount != mOldItemCount || mDataChanged)) {
+ mFastScroll.onItemCountChanged(mItemCount);
}
layoutChildren();
@@ -2120,6 +2148,34 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
protected void layoutChildren() {
}
+ /**
+ * @return the direct child that contains accessibility focus, or null if no
+ * child contains accessibility focus
+ */
+ View getAccessibilityFocusedChild() {
+ final ViewRootImpl viewRootImpl = getViewRootImpl();
+ if (viewRootImpl == null) {
+ return null;
+ }
+
+ View focusedView = viewRootImpl.getAccessibilityFocusedHost();
+ if (focusedView == null) {
+ return null;
+ }
+
+ ViewParent viewParent = focusedView.getParent();
+ while ((viewParent instanceof View) && (viewParent != this)) {
+ focusedView = (View) viewParent;
+ viewParent = viewParent.getParent();
+ }
+
+ if (!(viewParent instanceof View)) {
+ return null;
+ }
+
+ return focusedView;
+ }
+
void updateScrollIndicators() {
if (mScrollUp != null) {
boolean canScrollUp;
@@ -2499,8 +2555,8 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
rememberSyncState();
}
- if (mFastScroller != null) {
- mFastScroller.onSizeChanged(w, h, oldw, oldh);
+ if (mFastScroll != null) {
+ mFastScroll.onSizeChanged(w, h, oldw, oldh);
}
}
@@ -2829,8 +2885,8 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
@Override
public void onRtlPropertiesChanged(int layoutDirection) {
super.onRtlPropertiesChanged(layoutDirection);
- if (mFastScroller != null) {
- mFastScroller.setScrollbarPosition(getVerticalScrollbarPosition());
+ if (mFastScroll != null) {
+ mFastScroll.setScrollbarPosition(getVerticalScrollbarPosition());
}
}
@@ -3403,8 +3459,8 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
return false;
}
- if (mFastScroller != null) {
- boolean intercepted = mFastScroller.onTouchEvent(ev);
+ if (mFastScroll != null) {
+ boolean intercepted = mFastScroll.onTouchEvent(ev);
if (intercepted) {
return true;
}
@@ -3893,7 +3949,7 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
@Override
public boolean onInterceptHoverEvent(MotionEvent event) {
- if (mFastScroller != null && mFastScroller.onInterceptHoverEvent(event)) {
+ if (mFastScroll != null && mFastScroll.onInterceptHoverEvent(event)) {
return true;
}
@@ -3917,7 +3973,7 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
return false;
}
- if (mFastScroller != null && mFastScroller.onInterceptTouchEvent(ev)) {
+ if (mFastScroll != null && mFastScroll.onInterceptTouchEvent(ev)) {
return true;
}
@@ -6278,16 +6334,16 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
@Override
public void onChanged() {
super.onChanged();
- if (mFastScroller != null) {
- mFastScroller.onSectionsChanged();
+ if (mFastScroll != null) {
+ mFastScroll.onSectionsChanged();
}
}
@Override
public void onInvalidated() {
super.onInvalidated();
- if (mFastScroller != null) {
- mFastScroller.onSectionsChanged();
+ if (mFastScroll != null) {
+ mFastScroll.onSectionsChanged();
}
}
}
diff --git a/core/java/android/widget/AbsSeekBar.java b/core/java/android/widget/AbsSeekBar.java
index 7674837..941cdd0 100644
--- a/core/java/android/widget/AbsSeekBar.java
+++ b/core/java/android/widget/AbsSeekBar.java
@@ -65,11 +65,15 @@ public abstract class AbsSeekBar extends ProgressBar {
super(context, attrs);
}
- public AbsSeekBar(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
+ public AbsSeekBar(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
+ public AbsSeekBar(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
- TypedArray a = context.obtainStyledAttributes(attrs,
- com.android.internal.R.styleable.SeekBar, defStyle, 0);
+ TypedArray a = context.obtainStyledAttributes(
+ attrs, com.android.internal.R.styleable.SeekBar, defStyleAttr, defStyleRes);
Drawable thumb = a.getDrawable(com.android.internal.R.styleable.SeekBar_thumb);
setThumb(thumb); // will guess mThumbOffset if thumb != null...
// ...but allow layout to override this
diff --git a/core/java/android/widget/AbsSpinner.java b/core/java/android/widget/AbsSpinner.java
index f26527f..6a4ad75 100644
--- a/core/java/android/widget/AbsSpinner.java
+++ b/core/java/android/widget/AbsSpinner.java
@@ -64,12 +64,16 @@ public abstract class AbsSpinner extends AdapterView<SpinnerAdapter> {
this(context, attrs, 0);
}
- public AbsSpinner(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
+ public AbsSpinner(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
+ public AbsSpinner(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
initAbsSpinner();
- TypedArray a = context.obtainStyledAttributes(attrs,
- com.android.internal.R.styleable.AbsSpinner, defStyle, 0);
+ final TypedArray a = context.obtainStyledAttributes(
+ attrs, com.android.internal.R.styleable.AbsSpinner, defStyleAttr, defStyleRes);
CharSequence[] entries = a.getTextArray(R.styleable.AbsSpinner_entries);
if (entries != null) {
diff --git a/core/java/android/widget/AbsoluteLayout.java b/core/java/android/widget/AbsoluteLayout.java
index 7df6aab..4ce0d5d 100644
--- a/core/java/android/widget/AbsoluteLayout.java
+++ b/core/java/android/widget/AbsoluteLayout.java
@@ -40,16 +40,19 @@ import android.widget.RemoteViews.RemoteView;
@RemoteView
public class AbsoluteLayout extends ViewGroup {
public AbsoluteLayout(Context context) {
- super(context);
+ this(context, null);
}
public AbsoluteLayout(Context context, AttributeSet attrs) {
- super(context, attrs);
+ this(context, attrs, 0);
}
- public AbsoluteLayout(Context context, AttributeSet attrs,
- int defStyle) {
- super(context, attrs, defStyle);
+ public AbsoluteLayout(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
+ public AbsoluteLayout(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
}
@Override
diff --git a/core/java/android/widget/ActivityChooserView.java b/core/java/android/widget/ActivityChooserView.java
index 8612964..f9abec5 100644
--- a/core/java/android/widget/ActivityChooserView.java
+++ b/core/java/android/widget/ActivityChooserView.java
@@ -204,13 +204,32 @@ public class ActivityChooserView extends ViewGroup implements ActivityChooserMod
*
* @param context The application environment.
* @param attrs A collection of attributes.
- * @param defStyle The default style to apply to this view.
+ * @param defStyleAttr An attribute in the current theme that contains a
+ * reference to a style resource that supplies default values for
+ * the view. Can be 0 to not look for defaults.
*/
- public ActivityChooserView(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
+ public ActivityChooserView(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
+ /**
+ * Create a new instance.
+ *
+ * @param context The application environment.
+ * @param attrs A collection of attributes.
+ * @param defStyleAttr An attribute in the current theme that contains a
+ * reference to a style resource that supplies default values for
+ * the view. Can be 0 to not look for defaults.
+ * @param defStyleRes A resource identifier of a style resource that
+ * supplies default values for the view, used only if
+ * defStyleAttr is 0 or can not be found in the theme. Can be 0
+ * to not look for defaults.
+ */
+ public ActivityChooserView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
TypedArray attributesArray = context.obtainStyledAttributes(attrs,
- R.styleable.ActivityChooserView, defStyle, 0);
+ R.styleable.ActivityChooserView, defStyleAttr, defStyleRes);
mInitialActivityCount = attributesArray.getInt(
R.styleable.ActivityChooserView_initialActivityCount,
diff --git a/core/java/android/widget/AdapterView.java b/core/java/android/widget/AdapterView.java
index a5fad60..962ffba 100644
--- a/core/java/android/widget/AdapterView.java
+++ b/core/java/android/widget/AdapterView.java
@@ -223,15 +223,19 @@ public abstract class AdapterView<T extends Adapter> extends ViewGroup {
boolean mBlockLayoutRequests = false;
public AdapterView(Context context) {
- super(context);
+ this(context, null);
}
public AdapterView(Context context, AttributeSet attrs) {
- super(context, attrs);
+ this(context, attrs, 0);
}
- public AdapterView(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
+ public AdapterView(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
+ public AdapterView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
// If not explicitly specified this view is important for accessibility.
if (getImportantForAccessibility() == IMPORTANT_FOR_ACCESSIBILITY_AUTO) {
diff --git a/core/java/android/widget/AdapterViewAnimator.java b/core/java/android/widget/AdapterViewAnimator.java
index 90e949a..1bc2f4b 100644
--- a/core/java/android/widget/AdapterViewAnimator.java
+++ b/core/java/android/widget/AdapterViewAnimator.java
@@ -173,10 +173,15 @@ public abstract class AdapterViewAnimator extends AdapterView<Adapter>
}
public AdapterViewAnimator(Context context, AttributeSet attrs, int defStyleAttr) {
- super(context, attrs, defStyleAttr);
+ this(context, attrs, defStyleAttr, 0);
+ }
+
+ public AdapterViewAnimator(
+ Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
- TypedArray a = context.obtainStyledAttributes(attrs,
- com.android.internal.R.styleable.AdapterViewAnimator, defStyleAttr, 0);
+ final TypedArray a = context.obtainStyledAttributes(attrs,
+ com.android.internal.R.styleable.AdapterViewAnimator, defStyleAttr, defStyleRes);
int resource = a.getResourceId(
com.android.internal.R.styleable.AdapterViewAnimator_inAnimation, 0);
if (resource > 0) {
diff --git a/core/java/android/widget/AdapterViewFlipper.java b/core/java/android/widget/AdapterViewFlipper.java
index aea029b..3b026bd 100644
--- a/core/java/android/widget/AdapterViewFlipper.java
+++ b/core/java/android/widget/AdapterViewFlipper.java
@@ -59,10 +59,19 @@ public class AdapterViewFlipper extends AdapterViewAnimator {
}
public AdapterViewFlipper(Context context, AttributeSet attrs) {
- super(context, attrs);
+ this(context, attrs, 0);
+ }
+
+ public AdapterViewFlipper(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
+ public AdapterViewFlipper(
+ Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
- TypedArray a = context.obtainStyledAttributes(attrs,
- com.android.internal.R.styleable.AdapterViewFlipper);
+ final TypedArray a = context.obtainStyledAttributes(attrs,
+ com.android.internal.R.styleable.AdapterViewFlipper, defStyleAttr, defStyleRes);
mFlipInterval = a.getInt(
com.android.internal.R.styleable.AdapterViewFlipper_flipInterval, DEFAULT_INTERVAL);
mAutoStart = a.getBoolean(
diff --git a/core/java/android/widget/AnalogClock.java b/core/java/android/widget/AnalogClock.java
index c7da818..3c88e94 100644
--- a/core/java/android/widget/AnalogClock.java
+++ b/core/java/android/widget/AnalogClock.java
@@ -67,13 +67,16 @@ public class AnalogClock extends View {
this(context, attrs, 0);
}
- public AnalogClock(Context context, AttributeSet attrs,
- int defStyle) {
- super(context, attrs, defStyle);
- Resources r = mContext.getResources();
- TypedArray a =
- context.obtainStyledAttributes(
- attrs, com.android.internal.R.styleable.AnalogClock, defStyle, 0);
+ public AnalogClock(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
+ public AnalogClock(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+
+ final Resources r = context.getResources();
+ final TypedArray a = context.obtainStyledAttributes(
+ attrs, com.android.internal.R.styleable.AnalogClock, defStyleAttr, defStyleRes);
mDial = a.getDrawable(com.android.internal.R.styleable.AnalogClock_dial);
if (mDial == null) {
diff --git a/core/java/android/widget/AutoCompleteTextView.java b/core/java/android/widget/AutoCompleteTextView.java
index f0eb94f..259c66b 100644
--- a/core/java/android/widget/AutoCompleteTextView.java
+++ b/core/java/android/widget/AutoCompleteTextView.java
@@ -133,17 +133,21 @@ public class AutoCompleteTextView extends EditText implements Filter.FilterListe
this(context, attrs, com.android.internal.R.attr.autoCompleteTextViewStyle);
}
- public AutoCompleteTextView(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
+ public AutoCompleteTextView(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
+ public AutoCompleteTextView(
+ Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
mPopup = new ListPopupWindow(context, attrs,
com.android.internal.R.attr.autoCompleteTextViewStyle);
mPopup.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
mPopup.setPromptPosition(ListPopupWindow.POSITION_PROMPT_BELOW);
- TypedArray a =
- context.obtainStyledAttributes(
- attrs, com.android.internal.R.styleable.AutoCompleteTextView, defStyle, 0);
+ final TypedArray a = context.obtainStyledAttributes(attrs,
+ com.android.internal.R.styleable.AutoCompleteTextView, defStyleAttr, defStyleRes);
mThreshold = a.getInt(
R.styleable.AutoCompleteTextView_completionThreshold, 2);
diff --git a/core/java/android/widget/Button.java b/core/java/android/widget/Button.java
index 2ac56ac..1663620 100644
--- a/core/java/android/widget/Button.java
+++ b/core/java/android/widget/Button.java
@@ -103,8 +103,12 @@ public class Button extends TextView {
this(context, attrs, com.android.internal.R.attr.buttonStyle);
}
- public Button(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
+ public Button(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
+ public Button(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
}
@Override
diff --git a/core/java/android/widget/CalendarView.java b/core/java/android/widget/CalendarView.java
index 0957ab4..a87c7d2 100644
--- a/core/java/android/widget/CalendarView.java
+++ b/core/java/android/widget/CalendarView.java
@@ -80,234 +80,7 @@ public class CalendarView extends FrameLayout {
*/
private static final String LOG_TAG = CalendarView.class.getSimpleName();
- /**
- * Default value whether to show week number.
- */
- private static final boolean DEFAULT_SHOW_WEEK_NUMBER = true;
-
- /**
- * The number of milliseconds in a day.e
- */
- private static final long MILLIS_IN_DAY = 86400000L;
-
- /**
- * The number of day in a week.
- */
- private static final int DAYS_PER_WEEK = 7;
-
- /**
- * The number of milliseconds in a week.
- */
- private static final long MILLIS_IN_WEEK = DAYS_PER_WEEK * MILLIS_IN_DAY;
-
- /**
- * Affects when the month selection will change while scrolling upe
- */
- private static final int SCROLL_HYST_WEEKS = 2;
-
- /**
- * How long the GoTo fling animation should last.
- */
- private static final int GOTO_SCROLL_DURATION = 1000;
-
- /**
- * The duration of the adjustment upon a user scroll in milliseconds.
- */
- private static final int ADJUSTMENT_SCROLL_DURATION = 500;
-
- /**
- * How long to wait after receiving an onScrollStateChanged notification
- * before acting on it.
- */
- private static final int SCROLL_CHANGE_DELAY = 40;
-
- /**
- * String for parsing dates.
- */
- private static final String DATE_FORMAT = "MM/dd/yyyy";
-
- /**
- * The default minimal date.
- */
- private static final String DEFAULT_MIN_DATE = "01/01/1900";
-
- /**
- * The default maximal date.
- */
- private static final String DEFAULT_MAX_DATE = "01/01/2100";
-
- private static final int DEFAULT_SHOWN_WEEK_COUNT = 6;
-
- private static final int DEFAULT_DATE_TEXT_SIZE = 14;
-
- private static final int UNSCALED_SELECTED_DATE_VERTICAL_BAR_WIDTH = 6;
-
- private static final int UNSCALED_WEEK_MIN_VISIBLE_HEIGHT = 12;
-
- private static final int UNSCALED_LIST_SCROLL_TOP_OFFSET = 2;
-
- private static final int UNSCALED_BOTTOM_BUFFER = 20;
-
- private static final int UNSCALED_WEEK_SEPARATOR_LINE_WIDTH = 1;
-
- private static final int DEFAULT_WEEK_DAY_TEXT_APPEARANCE_RES_ID = -1;
-
- private final int mWeekSeperatorLineWidth;
-
- private int mDateTextSize;
-
- private Drawable mSelectedDateVerticalBar;
-
- private final int mSelectedDateVerticalBarWidth;
-
- private int mSelectedWeekBackgroundColor;
-
- private int mFocusedMonthDateColor;
-
- private int mUnfocusedMonthDateColor;
-
- private int mWeekSeparatorLineColor;
-
- private int mWeekNumberColor;
-
- private int mWeekDayTextAppearanceResId;
-
- private int mDateTextAppearanceResId;
-
- /**
- * The top offset of the weeks list.
- */
- private int mListScrollTopOffset = 2;
-
- /**
- * The visible height of a week view.
- */
- private int mWeekMinVisibleHeight = 12;
-
- /**
- * The visible height of a week view.
- */
- private int mBottomBuffer = 20;
-
- /**
- * The number of shown weeks.
- */
- private int mShownWeekCount;
-
- /**
- * Flag whether to show the week number.
- */
- private boolean mShowWeekNumber;
-
- /**
- * The number of day per week to be shown.
- */
- private int mDaysPerWeek = 7;
-
- /**
- * The friction of the week list while flinging.
- */
- private float mFriction = .05f;
-
- /**
- * Scale for adjusting velocity of the week list while flinging.
- */
- private float mVelocityScale = 0.333f;
-
- /**
- * The adapter for the weeks list.
- */
- private WeeksAdapter mAdapter;
-
- /**
- * The weeks list.
- */
- private ListView mListView;
-
- /**
- * The name of the month to display.
- */
- private TextView mMonthName;
-
- /**
- * The header with week day names.
- */
- private ViewGroup mDayNamesHeader;
-
- /**
- * Cached labels for the week names header.
- */
- private String[] mDayLabels;
-
- /**
- * The first day of the week.
- */
- private int mFirstDayOfWeek;
-
- /**
- * Which month should be displayed/highlighted [0-11].
- */
- private int mCurrentMonthDisplayed = -1;
-
- /**
- * Used for tracking during a scroll.
- */
- private long mPreviousScrollPosition;
-
- /**
- * Used for tracking which direction the view is scrolling.
- */
- private boolean mIsScrollingUp = false;
-
- /**
- * The previous scroll state of the weeks ListView.
- */
- private int mPreviousScrollState = OnScrollListener.SCROLL_STATE_IDLE;
-
- /**
- * The current scroll state of the weeks ListView.
- */
- private int mCurrentScrollState = OnScrollListener.SCROLL_STATE_IDLE;
-
- /**
- * Listener for changes in the selected day.
- */
- private OnDateChangeListener mOnDateChangeListener;
-
- /**
- * Command for adjusting the position after a scroll/fling.
- */
- private ScrollStateRunnable mScrollStateChangedRunnable = new ScrollStateRunnable();
-
- /**
- * Temporary instance to avoid multiple instantiations.
- */
- private Calendar mTempDate;
-
- /**
- * The first day of the focused month.
- */
- private Calendar mFirstDayOfMonth;
-
- /**
- * The start date of the range supported by this picker.
- */
- private Calendar mMinDate;
-
- /**
- * The end date of the range supported by this picker.
- */
- private Calendar mMaxDate;
-
- /**
- * Date format for parsing dates.
- */
- private final java.text.DateFormat mDateFormat = new SimpleDateFormat(DATE_FORMAT);
-
- /**
- * The current locale.
- */
- private Locale mCurrentLocale;
+ private CalendarViewDelegate mDelegate;
/**
* The callback used to indicate the user changes the date.
@@ -330,91 +103,17 @@ public class CalendarView extends FrameLayout {
}
public CalendarView(Context context, AttributeSet attrs) {
- this(context, attrs, 0);
+ this(context, attrs, R.attr.calendarViewStyle);
}
- public CalendarView(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, 0);
-
- // initialization based on locale
- setCurrentLocale(Locale.getDefault());
-
- TypedArray attributesArray = context.obtainStyledAttributes(attrs, R.styleable.CalendarView,
- R.attr.calendarViewStyle, 0);
- mShowWeekNumber = attributesArray.getBoolean(R.styleable.CalendarView_showWeekNumber,
- DEFAULT_SHOW_WEEK_NUMBER);
- mFirstDayOfWeek = attributesArray.getInt(R.styleable.CalendarView_firstDayOfWeek,
- LocaleData.get(Locale.getDefault()).firstDayOfWeek);
- String minDate = attributesArray.getString(R.styleable.CalendarView_minDate);
- if (TextUtils.isEmpty(minDate) || !parseDate(minDate, mMinDate)) {
- parseDate(DEFAULT_MIN_DATE, mMinDate);
- }
- String maxDate = attributesArray.getString(R.styleable.CalendarView_maxDate);
- if (TextUtils.isEmpty(maxDate) || !parseDate(maxDate, mMaxDate)) {
- parseDate(DEFAULT_MAX_DATE, mMaxDate);
- }
- if (mMaxDate.before(mMinDate)) {
- throw new IllegalArgumentException("Max date cannot be before min date.");
- }
- mShownWeekCount = attributesArray.getInt(R.styleable.CalendarView_shownWeekCount,
- DEFAULT_SHOWN_WEEK_COUNT);
- mSelectedWeekBackgroundColor = attributesArray.getColor(
- R.styleable.CalendarView_selectedWeekBackgroundColor, 0);
- mFocusedMonthDateColor = attributesArray.getColor(
- R.styleable.CalendarView_focusedMonthDateColor, 0);
- mUnfocusedMonthDateColor = attributesArray.getColor(
- R.styleable.CalendarView_unfocusedMonthDateColor, 0);
- mWeekSeparatorLineColor = attributesArray.getColor(
- R.styleable.CalendarView_weekSeparatorLineColor, 0);
- mWeekNumberColor = attributesArray.getColor(R.styleable.CalendarView_weekNumberColor, 0);
- mSelectedDateVerticalBar = attributesArray.getDrawable(
- R.styleable.CalendarView_selectedDateVerticalBar);
-
- mDateTextAppearanceResId = attributesArray.getResourceId(
- R.styleable.CalendarView_dateTextAppearance, R.style.TextAppearance_Small);
- updateDateTextSize();
-
- mWeekDayTextAppearanceResId = attributesArray.getResourceId(
- R.styleable.CalendarView_weekDayTextAppearance,
- DEFAULT_WEEK_DAY_TEXT_APPEARANCE_RES_ID);
- attributesArray.recycle();
-
- DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
- mWeekMinVisibleHeight = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
- UNSCALED_WEEK_MIN_VISIBLE_HEIGHT, displayMetrics);
- mListScrollTopOffset = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
- UNSCALED_LIST_SCROLL_TOP_OFFSET, displayMetrics);
- mBottomBuffer = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
- UNSCALED_BOTTOM_BUFFER, displayMetrics);
- mSelectedDateVerticalBarWidth = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
- UNSCALED_SELECTED_DATE_VERTICAL_BAR_WIDTH, displayMetrics);
- mWeekSeperatorLineWidth = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
- UNSCALED_WEEK_SEPARATOR_LINE_WIDTH, displayMetrics);
-
- LayoutInflater layoutInflater = (LayoutInflater) context
- .getSystemService(Service.LAYOUT_INFLATER_SERVICE);
- View content = layoutInflater.inflate(R.layout.calendar_view, null, false);
- addView(content);
-
- mListView = (ListView) findViewById(R.id.list);
- mDayNamesHeader = (ViewGroup) content.findViewById(com.android.internal.R.id.day_names);
- mMonthName = (TextView) content.findViewById(com.android.internal.R.id.month_name);
-
- setUpHeader();
- setUpListView();
- setUpAdapter();
-
- // go to today or whichever is close to today min or max date
- mTempDate.setTimeInMillis(System.currentTimeMillis());
- if (mTempDate.before(mMinDate)) {
- goTo(mMinDate, false, true, true);
- } else if (mMaxDate.before(mTempDate)) {
- goTo(mMaxDate, false, true, true);
- } else {
- goTo(mTempDate, false, true, true);
- }
+ public CalendarView(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
+ public CalendarView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
- invalidate();
+ mDelegate = new LegacyCalendarViewDelegate(this, context, attrs, defStyleAttr, defStyleRes);
}
/**
@@ -425,10 +124,7 @@ public class CalendarView extends FrameLayout {
* @attr ref android.R.styleable#CalendarView_shownWeekCount
*/
public void setShownWeekCount(int count) {
- if (mShownWeekCount != count) {
- mShownWeekCount = count;
- invalidate();
- }
+ mDelegate.setShownWeekCount(count);
}
/**
@@ -439,7 +135,7 @@ public class CalendarView extends FrameLayout {
* @attr ref android.R.styleable#CalendarView_shownWeekCount
*/
public int getShownWeekCount() {
- return mShownWeekCount;
+ return mDelegate.getShownWeekCount();
}
/**
@@ -450,16 +146,7 @@ public class CalendarView extends FrameLayout {
* @attr ref android.R.styleable#CalendarView_selectedWeekBackgroundColor
*/
public void setSelectedWeekBackgroundColor(int color) {
- if (mSelectedWeekBackgroundColor != color) {
- mSelectedWeekBackgroundColor = color;
- final int childCount = mListView.getChildCount();
- for (int i = 0; i < childCount; i++) {
- WeekView weekView = (WeekView) mListView.getChildAt(i);
- if (weekView.mHasSelectedDay) {
- weekView.invalidate();
- }
- }
- }
+ mDelegate.setSelectedWeekBackgroundColor(color);
}
/**
@@ -470,7 +157,7 @@ public class CalendarView extends FrameLayout {
* @attr ref android.R.styleable#CalendarView_selectedWeekBackgroundColor
*/
public int getSelectedWeekBackgroundColor() {
- return mSelectedWeekBackgroundColor;
+ return mDelegate.getSelectedWeekBackgroundColor();
}
/**
@@ -481,16 +168,7 @@ public class CalendarView extends FrameLayout {
* @attr ref android.R.styleable#CalendarView_focusedMonthDateColor
*/
public void setFocusedMonthDateColor(int color) {
- if (mFocusedMonthDateColor != color) {
- mFocusedMonthDateColor = color;
- final int childCount = mListView.getChildCount();
- for (int i = 0; i < childCount; i++) {
- WeekView weekView = (WeekView) mListView.getChildAt(i);
- if (weekView.mHasFocusedDay) {
- weekView.invalidate();
- }
- }
- }
+ mDelegate.setFocusedMonthDateColor(color);
}
/**
@@ -501,7 +179,7 @@ public class CalendarView extends FrameLayout {
* @attr ref android.R.styleable#CalendarView_focusedMonthDateColor
*/
public int getFocusedMonthDateColor() {
- return mFocusedMonthDateColor;
+ return mDelegate.getFocusedMonthDateColor();
}
/**
@@ -512,16 +190,7 @@ public class CalendarView extends FrameLayout {
* @attr ref android.R.styleable#CalendarView_unfocusedMonthDateColor
*/
public void setUnfocusedMonthDateColor(int color) {
- if (mUnfocusedMonthDateColor != color) {
- mUnfocusedMonthDateColor = color;
- final int childCount = mListView.getChildCount();
- for (int i = 0; i < childCount; i++) {
- WeekView weekView = (WeekView) mListView.getChildAt(i);
- if (weekView.mHasUnfocusedDay) {
- weekView.invalidate();
- }
- }
- }
+ mDelegate.setUnfocusedMonthDateColor(color);
}
/**
@@ -532,7 +201,7 @@ public class CalendarView extends FrameLayout {
* @attr ref android.R.styleable#CalendarView_unfocusedMonthDateColor
*/
public int getUnfocusedMonthDateColor() {
- return mFocusedMonthDateColor;
+ return mDelegate.getUnfocusedMonthDateColor();
}
/**
@@ -543,12 +212,7 @@ public class CalendarView extends FrameLayout {
* @attr ref android.R.styleable#CalendarView_weekNumberColor
*/
public void setWeekNumberColor(int color) {
- if (mWeekNumberColor != color) {
- mWeekNumberColor = color;
- if (mShowWeekNumber) {
- invalidateAllWeekViews();
- }
- }
+ mDelegate.setWeekNumberColor(color);
}
/**
@@ -559,7 +223,7 @@ public class CalendarView extends FrameLayout {
* @attr ref android.R.styleable#CalendarView_weekNumberColor
*/
public int getWeekNumberColor() {
- return mWeekNumberColor;
+ return mDelegate.getWeekNumberColor();
}
/**
@@ -570,10 +234,7 @@ public class CalendarView extends FrameLayout {
* @attr ref android.R.styleable#CalendarView_weekSeparatorLineColor
*/
public void setWeekSeparatorLineColor(int color) {
- if (mWeekSeparatorLineColor != color) {
- mWeekSeparatorLineColor = color;
- invalidateAllWeekViews();
- }
+ mDelegate.setWeekSeparatorLineColor(color);
}
/**
@@ -584,7 +245,7 @@ public class CalendarView extends FrameLayout {
* @attr ref android.R.styleable#CalendarView_weekSeparatorLineColor
*/
public int getWeekSeparatorLineColor() {
- return mWeekSeparatorLineColor;
+ return mDelegate.getWeekSeparatorLineColor();
}
/**
@@ -596,8 +257,7 @@ public class CalendarView extends FrameLayout {
* @attr ref android.R.styleable#CalendarView_selectedDateVerticalBar
*/
public void setSelectedDateVerticalBar(int resourceId) {
- Drawable drawable = getResources().getDrawable(resourceId);
- setSelectedDateVerticalBar(drawable);
+ mDelegate.setSelectedDateVerticalBar(resourceId);
}
/**
@@ -609,16 +269,7 @@ public class CalendarView extends FrameLayout {
* @attr ref android.R.styleable#CalendarView_selectedDateVerticalBar
*/
public void setSelectedDateVerticalBar(Drawable drawable) {
- if (mSelectedDateVerticalBar != drawable) {
- mSelectedDateVerticalBar = drawable;
- final int childCount = mListView.getChildCount();
- for (int i = 0; i < childCount; i++) {
- WeekView weekView = (WeekView) mListView.getChildAt(i);
- if (weekView.mHasSelectedDay) {
- weekView.invalidate();
- }
- }
- }
+ mDelegate.setSelectedDateVerticalBar(drawable);
}
/**
@@ -628,7 +279,7 @@ public class CalendarView extends FrameLayout {
* @return The vertical bar drawable.
*/
public Drawable getSelectedDateVerticalBar() {
- return mSelectedDateVerticalBar;
+ return mDelegate.getSelectedDateVerticalBar();
}
/**
@@ -639,10 +290,7 @@ public class CalendarView extends FrameLayout {
* @attr ref android.R.styleable#CalendarView_weekDayTextAppearance
*/
public void setWeekDayTextAppearance(int resourceId) {
- if (mWeekDayTextAppearanceResId != resourceId) {
- mWeekDayTextAppearanceResId = resourceId;
- setUpHeader();
- }
+ mDelegate.setWeekDayTextAppearance(resourceId);
}
/**
@@ -653,7 +301,7 @@ public class CalendarView extends FrameLayout {
* @attr ref android.R.styleable#CalendarView_weekDayTextAppearance
*/
public int getWeekDayTextAppearance() {
- return mWeekDayTextAppearanceResId;
+ return mDelegate.getWeekDayTextAppearance();
}
/**
@@ -664,11 +312,7 @@ public class CalendarView extends FrameLayout {
* @attr ref android.R.styleable#CalendarView_dateTextAppearance
*/
public void setDateTextAppearance(int resourceId) {
- if (mDateTextAppearanceResId != resourceId) {
- mDateTextAppearanceResId = resourceId;
- updateDateTextSize();
- invalidateAllWeekViews();
- }
+ mDelegate.setDateTextAppearance(resourceId);
}
/**
@@ -679,35 +323,17 @@ public class CalendarView extends FrameLayout {
* @attr ref android.R.styleable#CalendarView_dateTextAppearance
*/
public int getDateTextAppearance() {
- return mDateTextAppearanceResId;
+ return mDelegate.getDateTextAppearance();
}
@Override
public void setEnabled(boolean enabled) {
- mListView.setEnabled(enabled);
+ mDelegate.setEnabled(enabled);
}
@Override
public boolean isEnabled() {
- return mListView.isEnabled();
- }
-
- @Override
- protected void onConfigurationChanged(Configuration newConfig) {
- super.onConfigurationChanged(newConfig);
- setCurrentLocale(newConfig.locale);
- }
-
- @Override
- public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
- super.onInitializeAccessibilityEvent(event);
- event.setClassName(CalendarView.class.getName());
- }
-
- @Override
- public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
- super.onInitializeAccessibilityNodeInfo(info);
- info.setClassName(CalendarView.class.getName());
+ return mDelegate.isEnabled();
}
/**
@@ -723,7 +349,7 @@ public class CalendarView extends FrameLayout {
* @attr ref android.R.styleable#CalendarView_minDate
*/
public long getMinDate() {
- return mMinDate.getTimeInMillis();
+ return mDelegate.getMinDate();
}
/**
@@ -736,30 +362,7 @@ public class CalendarView extends FrameLayout {
* @attr ref android.R.styleable#CalendarView_minDate
*/
public void setMinDate(long minDate) {
- mTempDate.setTimeInMillis(minDate);
- if (isSameDate(mTempDate, mMinDate)) {
- return;
- }
- mMinDate.setTimeInMillis(minDate);
- // make sure the current date is not earlier than
- // the new min date since the latter is used for
- // calculating the indices in the adapter thus
- // avoiding out of bounds error
- Calendar date = mAdapter.mSelectedDate;
- if (date.before(mMinDate)) {
- mAdapter.setSelectedDay(mMinDate);
- }
- // reinitialize the adapter since its range depends on min date
- mAdapter.init();
- if (date.before(mMinDate)) {
- setDate(mTempDate.getTimeInMillis());
- } else {
- // we go to the current date to force the ListView to query its
- // adapter for the shown views since we have changed the adapter
- // range and the base from which the later calculates item indices
- // note that calling setDate will not work since the date is the same
- goTo(date, false, true, false);
- }
+ mDelegate.setMinDate(minDate);
}
/**
@@ -775,7 +378,7 @@ public class CalendarView extends FrameLayout {
* @attr ref android.R.styleable#CalendarView_maxDate
*/
public long getMaxDate() {
- return mMaxDate.getTimeInMillis();
+ return mDelegate.getMaxDate();
}
/**
@@ -788,23 +391,7 @@ public class CalendarView extends FrameLayout {
* @attr ref android.R.styleable#CalendarView_maxDate
*/
public void setMaxDate(long maxDate) {
- mTempDate.setTimeInMillis(maxDate);
- if (isSameDate(mTempDate, mMaxDate)) {
- return;
- }
- mMaxDate.setTimeInMillis(maxDate);
- // reinitialize the adapter since its range depends on max date
- mAdapter.init();
- Calendar date = mAdapter.mSelectedDate;
- if (date.after(mMaxDate)) {
- setDate(mMaxDate.getTimeInMillis());
- } else {
- // we go to the current date to force the ListView to query its
- // adapter for the shown views since we have changed the adapter
- // range and the base from which the later calculates item indices
- // note that calling setDate will not work since the date is the same
- goTo(date, false, true, false);
- }
+ mDelegate.setMaxDate(maxDate);
}
/**
@@ -815,12 +402,7 @@ public class CalendarView extends FrameLayout {
* @attr ref android.R.styleable#CalendarView_showWeekNumber
*/
public void setShowWeekNumber(boolean showWeekNumber) {
- if (mShowWeekNumber == showWeekNumber) {
- return;
- }
- mShowWeekNumber = showWeekNumber;
- mAdapter.notifyDataSetChanged();
- setUpHeader();
+ mDelegate.setShowWeekNumber(showWeekNumber);
}
/**
@@ -831,7 +413,7 @@ public class CalendarView extends FrameLayout {
* @attr ref android.R.styleable#CalendarView_showWeekNumber
*/
public boolean getShowWeekNumber() {
- return mShowWeekNumber;
+ return mDelegate.getShowWeekNumber();
}
/**
@@ -850,7 +432,7 @@ public class CalendarView extends FrameLayout {
* @attr ref android.R.styleable#CalendarView_firstDayOfWeek
*/
public int getFirstDayOfWeek() {
- return mFirstDayOfWeek;
+ return mDelegate.getFirstDayOfWeek();
}
/**
@@ -869,12 +451,7 @@ public class CalendarView extends FrameLayout {
* @attr ref android.R.styleable#CalendarView_firstDayOfWeek
*/
public void setFirstDayOfWeek(int firstDayOfWeek) {
- if (mFirstDayOfWeek == firstDayOfWeek) {
- return;
- }
- mFirstDayOfWeek = firstDayOfWeek;
- mAdapter.init();
- setUpHeader();
+ mDelegate.setFirstDayOfWeek(firstDayOfWeek);
}
/**
@@ -883,7 +460,7 @@ public class CalendarView extends FrameLayout {
* @param listener The listener to be notified.
*/
public void setOnDateChangeListener(OnDateChangeListener listener) {
- mOnDateChangeListener = listener;
+ mDelegate.setOnDateChangeListener(listener);
}
/**
@@ -893,7 +470,7 @@ public class CalendarView extends FrameLayout {
* @return The selected date.
*/
public long getDate() {
- return mAdapter.mSelectedDate.getTimeInMillis();
+ return mDelegate.getDate();
}
/**
@@ -910,7 +487,7 @@ public class CalendarView extends FrameLayout {
* @see #setMaxDate(long)
*/
public void setDate(long date) {
- setDate(date, false, false);
+ mDelegate.setDate(date);
}
/**
@@ -928,934 +505,1645 @@ public class CalendarView extends FrameLayout {
* @see #setMaxDate(long)
*/
public void setDate(long date, boolean animate, boolean center) {
- mTempDate.setTimeInMillis(date);
- if (isSameDate(mTempDate, mAdapter.mSelectedDate)) {
- return;
- }
- goTo(mTempDate, animate, true, center);
+ mDelegate.setDate(date, animate, center);
}
- private void updateDateTextSize() {
- TypedArray dateTextAppearance = mContext.obtainStyledAttributes(
- mDateTextAppearanceResId, R.styleable.TextAppearance);
- mDateTextSize = dateTextAppearance.getDimensionPixelSize(
- R.styleable.TextAppearance_textSize, DEFAULT_DATE_TEXT_SIZE);
- dateTextAppearance.recycle();
+ @Override
+ protected void onConfigurationChanged(Configuration newConfig) {
+ super.onConfigurationChanged(newConfig);
+ mDelegate.onConfigurationChanged(newConfig);
}
- /**
- * Invalidates all week views.
- */
- private void invalidateAllWeekViews() {
- final int childCount = mListView.getChildCount();
- for (int i = 0; i < childCount; i++) {
- View view = mListView.getChildAt(i);
- view.invalidate();
- }
+ @Override
+ public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
+ super.onInitializeAccessibilityEvent(event);
+ mDelegate.onInitializeAccessibilityEvent(event);
+ }
+
+ @Override
+ public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfo(info);
+ mDelegate.onInitializeAccessibilityNodeInfo(info);
}
/**
- * Sets the current locale.
- *
- * @param locale The current locale.
+ * A delegate interface that defined the public API of the CalendarView. Allows different
+ * CalendarView implementations. This would need to be implemented by the CalendarView delegates
+ * for the real behavior.
*/
- private void setCurrentLocale(Locale locale) {
- if (locale.equals(mCurrentLocale)) {
- return;
- }
+ private interface CalendarViewDelegate {
+ void setShownWeekCount(int count);
+ int getShownWeekCount();
- mCurrentLocale = locale;
+ void setSelectedWeekBackgroundColor(int color);
+ int getSelectedWeekBackgroundColor();
- mTempDate = getCalendarForLocale(mTempDate, locale);
- mFirstDayOfMonth = getCalendarForLocale(mFirstDayOfMonth, locale);
- mMinDate = getCalendarForLocale(mMinDate, locale);
- mMaxDate = getCalendarForLocale(mMaxDate, locale);
- }
+ void setFocusedMonthDateColor(int color);
+ int getFocusedMonthDateColor();
- /**
- * Gets a calendar for locale bootstrapped with the value of a given calendar.
- *
- * @param oldCalendar The old calendar.
- * @param locale The locale.
- */
- private Calendar getCalendarForLocale(Calendar oldCalendar, Locale locale) {
- if (oldCalendar == null) {
- return Calendar.getInstance(locale);
- } else {
- final long currentTimeMillis = oldCalendar.getTimeInMillis();
- Calendar newCalendar = Calendar.getInstance(locale);
- newCalendar.setTimeInMillis(currentTimeMillis);
- return newCalendar;
- }
- }
+ void setUnfocusedMonthDateColor(int color);
+ int getUnfocusedMonthDateColor();
- /**
- * @return True if the <code>firstDate</code> is the same as the <code>
- * secondDate</code>.
- */
- private boolean isSameDate(Calendar firstDate, Calendar secondDate) {
- return (firstDate.get(Calendar.DAY_OF_YEAR) == secondDate.get(Calendar.DAY_OF_YEAR)
- && firstDate.get(Calendar.YEAR) == secondDate.get(Calendar.YEAR));
- }
+ void setWeekNumberColor(int color);
+ int getWeekNumberColor();
- /**
- * Creates a new adapter if necessary and sets up its parameters.
- */
- private void setUpAdapter() {
- if (mAdapter == null) {
- mAdapter = new WeeksAdapter();
- mAdapter.registerDataSetObserver(new DataSetObserver() {
- @Override
- public void onChanged() {
- if (mOnDateChangeListener != null) {
- Calendar selectedDay = mAdapter.getSelectedDay();
- mOnDateChangeListener.onSelectedDayChange(CalendarView.this,
- selectedDay.get(Calendar.YEAR),
- selectedDay.get(Calendar.MONTH),
- selectedDay.get(Calendar.DAY_OF_MONTH));
- }
- }
- });
- mListView.setAdapter(mAdapter);
- }
+ void setWeekSeparatorLineColor(int color);
+ int getWeekSeparatorLineColor();
+
+ void setSelectedDateVerticalBar(int resourceId);
+ void setSelectedDateVerticalBar(Drawable drawable);
+ Drawable getSelectedDateVerticalBar();
+
+ void setWeekDayTextAppearance(int resourceId);
+ int getWeekDayTextAppearance();
+
+ void setDateTextAppearance(int resourceId);
+ int getDateTextAppearance();
+
+ void setEnabled(boolean enabled);
+ boolean isEnabled();
+
+ void setMinDate(long minDate);
+ long getMinDate();
+
+ void setMaxDate(long maxDate);
+ long getMaxDate();
+
+ void setShowWeekNumber(boolean showWeekNumber);
+ boolean getShowWeekNumber();
+
+ void setFirstDayOfWeek(int firstDayOfWeek);
+ int getFirstDayOfWeek();
+
+ void setDate(long date);
+ void setDate(long date, boolean animate, boolean center);
+ long getDate();
+
+ void setOnDateChangeListener(OnDateChangeListener listener);
- // refresh the view with the new parameters
- mAdapter.notifyDataSetChanged();
+ void onConfigurationChanged(Configuration newConfig);
+ void onInitializeAccessibilityEvent(AccessibilityEvent event);
+ void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info);
}
/**
- * Sets up the strings to be used by the header.
+ * An abstract class which can be used as a start for CalendarView implementations
*/
- private void setUpHeader() {
- final String[] tinyWeekdayNames = LocaleData.get(Locale.getDefault()).tinyWeekdayNames;
- mDayLabels = new String[mDaysPerWeek];
- for (int i = 0; i < mDaysPerWeek; i++) {
- final int j = i + mFirstDayOfWeek;
- final int calendarDay = (j > Calendar.SATURDAY) ? j - Calendar.SATURDAY : j;
- mDayLabels[i] = tinyWeekdayNames[calendarDay];
- }
- // Deal with week number
- TextView label = (TextView) mDayNamesHeader.getChildAt(0);
- if (mShowWeekNumber) {
- label.setVisibility(View.VISIBLE);
- } else {
- label.setVisibility(View.GONE);
+ abstract static class AbstractCalendarViewDelegate implements CalendarViewDelegate {
+ // The delegator
+ protected CalendarView mDelegator;
+
+ // The context
+ protected Context mContext;
+
+ // The current locale
+ protected Locale mCurrentLocale;
+
+ AbstractCalendarViewDelegate(CalendarView delegator, Context context) {
+ mDelegator = delegator;
+ mContext = context;
+
+ // Initialization based on locale
+ setCurrentLocale(Locale.getDefault());
}
- // Deal with day labels
- final int count = mDayNamesHeader.getChildCount();
- for (int i = 0; i < count - 1; i++) {
- label = (TextView) mDayNamesHeader.getChildAt(i + 1);
- if (mWeekDayTextAppearanceResId > -1) {
- label.setTextAppearance(mContext, mWeekDayTextAppearanceResId);
- }
- if (i < mDaysPerWeek) {
- label.setText(mDayLabels[i]);
- label.setVisibility(View.VISIBLE);
- } else {
- label.setVisibility(View.GONE);
+
+ protected void setCurrentLocale(Locale locale) {
+ if (locale.equals(mCurrentLocale)) {
+ return;
}
+ mCurrentLocale = locale;
}
- mDayNamesHeader.invalidate();
}
/**
- * Sets all the required fields for the list view.
+ * A delegate implementing the legacy CalendarView
*/
- private void setUpListView() {
- // Configure the listview
- mListView.setDivider(null);
- mListView.setItemsCanFocus(true);
- mListView.setVerticalScrollBarEnabled(false);
- mListView.setOnScrollListener(new OnScrollListener() {
- public void onScrollStateChanged(AbsListView view, int scrollState) {
- CalendarView.this.onScrollStateChanged(view, scrollState);
- }
-
- public void onScroll(
- AbsListView view, int firstVisibleItem, int visibleItemCount,
- int totalItemCount) {
- CalendarView.this.onScroll(view, firstVisibleItem, visibleItemCount,
- totalItemCount);
- }
- });
- // Make the scrolling behavior nicer
- mListView.setFriction(mFriction);
- mListView.setVelocityScale(mVelocityScale);
- }
+ private static class LegacyCalendarViewDelegate extends AbstractCalendarViewDelegate {
- /**
- * This moves to the specified time in the view. If the time is not already
- * in range it will move the list so that the first of the month containing
- * the time is at the top of the view. If the new time is already in view
- * the list will not be scrolled unless forceScroll is true. This time may
- * optionally be highlighted as selected as well.
- *
- * @param date The time to move to.
- * @param animate Whether to scroll to the given time or just redraw at the
- * new location.
- * @param setSelected Whether to set the given time as selected.
- * @param forceScroll Whether to recenter even if the time is already
- * visible.
- *
- * @throws IllegalArgumentException of the provided date is before the
- * range start of after the range end.
- */
- private void goTo(Calendar date, boolean animate, boolean setSelected, boolean forceScroll) {
- if (date.before(mMinDate) || date.after(mMaxDate)) {
- throw new IllegalArgumentException("Time not between " + mMinDate.getTime()
- + " and " + mMaxDate.getTime());
- }
- // Find the first and last entirely visible weeks
- int firstFullyVisiblePosition = mListView.getFirstVisiblePosition();
- View firstChild = mListView.getChildAt(0);
- if (firstChild != null && firstChild.getTop() < 0) {
- firstFullyVisiblePosition++;
- }
- int lastFullyVisiblePosition = firstFullyVisiblePosition + mShownWeekCount - 1;
- if (firstChild != null && firstChild.getTop() > mBottomBuffer) {
- lastFullyVisiblePosition--;
- }
- if (setSelected) {
- mAdapter.setSelectedDay(date);
- }
- // Get the week we're going to
- int position = getWeeksSinceMinDate(date);
+ /**
+ * Default value whether to show week number.
+ */
+ private static final boolean DEFAULT_SHOW_WEEK_NUMBER = true;
- // Check if the selected day is now outside of our visible range
- // and if so scroll to the month that contains it
- if (position < firstFullyVisiblePosition || position > lastFullyVisiblePosition
- || forceScroll) {
- mFirstDayOfMonth.setTimeInMillis(date.getTimeInMillis());
- mFirstDayOfMonth.set(Calendar.DAY_OF_MONTH, 1);
+ /**
+ * The number of milliseconds in a day.e
+ */
+ private static final long MILLIS_IN_DAY = 86400000L;
- setMonthDisplayed(mFirstDayOfMonth);
+ /**
+ * The number of day in a week.
+ */
+ private static final int DAYS_PER_WEEK = 7;
- // the earliest time we can scroll to is the min date
- if (mFirstDayOfMonth.before(mMinDate)) {
- position = 0;
- } else {
- position = getWeeksSinceMinDate(mFirstDayOfMonth);
+ /**
+ * The number of milliseconds in a week.
+ */
+ private static final long MILLIS_IN_WEEK = DAYS_PER_WEEK * MILLIS_IN_DAY;
+
+ /**
+ * Affects when the month selection will change while scrolling upe
+ */
+ private static final int SCROLL_HYST_WEEKS = 2;
+
+ /**
+ * How long the GoTo fling animation should last.
+ */
+ private static final int GOTO_SCROLL_DURATION = 1000;
+
+ /**
+ * The duration of the adjustment upon a user scroll in milliseconds.
+ */
+ private static final int ADJUSTMENT_SCROLL_DURATION = 500;
+
+ /**
+ * How long to wait after receiving an onScrollStateChanged notification
+ * before acting on it.
+ */
+ private static final int SCROLL_CHANGE_DELAY = 40;
+
+ /**
+ * String for parsing dates.
+ */
+ private static final String DATE_FORMAT = "MM/dd/yyyy";
+
+ /**
+ * The default minimal date.
+ */
+ private static final String DEFAULT_MIN_DATE = "01/01/1900";
+
+ /**
+ * The default maximal date.
+ */
+ private static final String DEFAULT_MAX_DATE = "01/01/2100";
+
+ private static final int DEFAULT_SHOWN_WEEK_COUNT = 6;
+
+ private static final int DEFAULT_DATE_TEXT_SIZE = 14;
+
+ private static final int UNSCALED_SELECTED_DATE_VERTICAL_BAR_WIDTH = 6;
+
+ private static final int UNSCALED_WEEK_MIN_VISIBLE_HEIGHT = 12;
+
+ private static final int UNSCALED_LIST_SCROLL_TOP_OFFSET = 2;
+
+ private static final int UNSCALED_BOTTOM_BUFFER = 20;
+
+ private static final int UNSCALED_WEEK_SEPARATOR_LINE_WIDTH = 1;
+
+ private static final int DEFAULT_WEEK_DAY_TEXT_APPEARANCE_RES_ID = -1;
+
+ private final int mWeekSeperatorLineWidth;
+
+ private int mDateTextSize;
+
+ private Drawable mSelectedDateVerticalBar;
+
+ private final int mSelectedDateVerticalBarWidth;
+
+ private int mSelectedWeekBackgroundColor;
+
+ private int mFocusedMonthDateColor;
+
+ private int mUnfocusedMonthDateColor;
+
+ private int mWeekSeparatorLineColor;
+
+ private int mWeekNumberColor;
+
+ private int mWeekDayTextAppearanceResId;
+
+ private int mDateTextAppearanceResId;
+
+ /**
+ * The top offset of the weeks list.
+ */
+ private int mListScrollTopOffset = 2;
+
+ /**
+ * The visible height of a week view.
+ */
+ private int mWeekMinVisibleHeight = 12;
+
+ /**
+ * The visible height of a week view.
+ */
+ private int mBottomBuffer = 20;
+
+ /**
+ * The number of shown weeks.
+ */
+ private int mShownWeekCount;
+
+ /**
+ * Flag whether to show the week number.
+ */
+ private boolean mShowWeekNumber;
+
+ /**
+ * The number of day per week to be shown.
+ */
+ private int mDaysPerWeek = 7;
+
+ /**
+ * The friction of the week list while flinging.
+ */
+ private float mFriction = .05f;
+
+ /**
+ * Scale for adjusting velocity of the week list while flinging.
+ */
+ private float mVelocityScale = 0.333f;
+
+ /**
+ * The adapter for the weeks list.
+ */
+ private WeeksAdapter mAdapter;
+
+ /**
+ * The weeks list.
+ */
+ private ListView mListView;
+
+ /**
+ * The name of the month to display.
+ */
+ private TextView mMonthName;
+
+ /**
+ * The header with week day names.
+ */
+ private ViewGroup mDayNamesHeader;
+
+ /**
+ * Cached labels for the week names header.
+ */
+ private String[] mDayLabels;
+
+ /**
+ * The first day of the week.
+ */
+ private int mFirstDayOfWeek;
+
+ /**
+ * Which month should be displayed/highlighted [0-11].
+ */
+ private int mCurrentMonthDisplayed = -1;
+
+ /**
+ * Used for tracking during a scroll.
+ */
+ private long mPreviousScrollPosition;
+
+ /**
+ * Used for tracking which direction the view is scrolling.
+ */
+ private boolean mIsScrollingUp = false;
+
+ /**
+ * The previous scroll state of the weeks ListView.
+ */
+ private int mPreviousScrollState = OnScrollListener.SCROLL_STATE_IDLE;
+
+ /**
+ * The current scroll state of the weeks ListView.
+ */
+ private int mCurrentScrollState = OnScrollListener.SCROLL_STATE_IDLE;
+
+ /**
+ * Listener for changes in the selected day.
+ */
+ private OnDateChangeListener mOnDateChangeListener;
+
+ /**
+ * Command for adjusting the position after a scroll/fling.
+ */
+ private ScrollStateRunnable mScrollStateChangedRunnable = new ScrollStateRunnable();
+
+ /**
+ * Temporary instance to avoid multiple instantiations.
+ */
+ private Calendar mTempDate;
+
+ /**
+ * The first day of the focused month.
+ */
+ private Calendar mFirstDayOfMonth;
+
+ /**
+ * The start date of the range supported by this picker.
+ */
+ private Calendar mMinDate;
+
+ /**
+ * The end date of the range supported by this picker.
+ */
+ private Calendar mMaxDate;
+
+ /**
+ * Date format for parsing dates.
+ */
+ private final java.text.DateFormat mDateFormat = new SimpleDateFormat(DATE_FORMAT);
+
+ LegacyCalendarViewDelegate(CalendarView delegator, Context context, AttributeSet attrs,
+ int defStyleAttr, int defStyleRes) {
+ super(delegator, context);
+
+ // initialization based on locale
+ setCurrentLocale(Locale.getDefault());
+
+ TypedArray attributesArray = context.obtainStyledAttributes(attrs,
+ R.styleable.CalendarView, defStyleAttr, defStyleRes);
+ mShowWeekNumber = attributesArray.getBoolean(R.styleable.CalendarView_showWeekNumber,
+ DEFAULT_SHOW_WEEK_NUMBER);
+ mFirstDayOfWeek = attributesArray.getInt(R.styleable.CalendarView_firstDayOfWeek,
+ LocaleData.get(Locale.getDefault()).firstDayOfWeek);
+ String minDate = attributesArray.getString(R.styleable.CalendarView_minDate);
+ if (TextUtils.isEmpty(minDate) || !parseDate(minDate, mMinDate)) {
+ parseDate(DEFAULT_MIN_DATE, mMinDate);
+ }
+ String maxDate = attributesArray.getString(R.styleable.CalendarView_maxDate);
+ if (TextUtils.isEmpty(maxDate) || !parseDate(maxDate, mMaxDate)) {
+ parseDate(DEFAULT_MAX_DATE, mMaxDate);
+ }
+ if (mMaxDate.before(mMinDate)) {
+ throw new IllegalArgumentException("Max date cannot be before min date.");
}
+ mShownWeekCount = attributesArray.getInt(R.styleable.CalendarView_shownWeekCount,
+ DEFAULT_SHOWN_WEEK_COUNT);
+ mSelectedWeekBackgroundColor = attributesArray.getColor(
+ R.styleable.CalendarView_selectedWeekBackgroundColor, 0);
+ mFocusedMonthDateColor = attributesArray.getColor(
+ R.styleable.CalendarView_focusedMonthDateColor, 0);
+ mUnfocusedMonthDateColor = attributesArray.getColor(
+ R.styleable.CalendarView_unfocusedMonthDateColor, 0);
+ mWeekSeparatorLineColor = attributesArray.getColor(
+ R.styleable.CalendarView_weekSeparatorLineColor, 0);
+ mWeekNumberColor = attributesArray.getColor(R.styleable.CalendarView_weekNumberColor, 0);
+ mSelectedDateVerticalBar = attributesArray.getDrawable(
+ R.styleable.CalendarView_selectedDateVerticalBar);
+
+ mDateTextAppearanceResId = attributesArray.getResourceId(
+ R.styleable.CalendarView_dateTextAppearance, R.style.TextAppearance_Small);
+ updateDateTextSize();
+
+ mWeekDayTextAppearanceResId = attributesArray.getResourceId(
+ R.styleable.CalendarView_weekDayTextAppearance,
+ DEFAULT_WEEK_DAY_TEXT_APPEARANCE_RES_ID);
+ attributesArray.recycle();
+
+ DisplayMetrics displayMetrics = mDelegator.getResources().getDisplayMetrics();
+ mWeekMinVisibleHeight = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
+ UNSCALED_WEEK_MIN_VISIBLE_HEIGHT, displayMetrics);
+ mListScrollTopOffset = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
+ UNSCALED_LIST_SCROLL_TOP_OFFSET, displayMetrics);
+ mBottomBuffer = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
+ UNSCALED_BOTTOM_BUFFER, displayMetrics);
+ mSelectedDateVerticalBarWidth = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
+ UNSCALED_SELECTED_DATE_VERTICAL_BAR_WIDTH, displayMetrics);
+ mWeekSeperatorLineWidth = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
+ UNSCALED_WEEK_SEPARATOR_LINE_WIDTH, displayMetrics);
+
+ LayoutInflater layoutInflater = (LayoutInflater) mContext
+ .getSystemService(Service.LAYOUT_INFLATER_SERVICE);
+ View content = layoutInflater.inflate(R.layout.calendar_view, null, false);
+ mDelegator.addView(content);
+
+ mListView = (ListView) mDelegator.findViewById(R.id.list);
+ mDayNamesHeader = (ViewGroup) content.findViewById(com.android.internal.R.id.day_names);
+ mMonthName = (TextView) content.findViewById(com.android.internal.R.id.month_name);
- mPreviousScrollState = OnScrollListener.SCROLL_STATE_FLING;
- if (animate) {
- mListView.smoothScrollToPositionFromTop(position, mListScrollTopOffset,
- GOTO_SCROLL_DURATION);
+ setUpHeader();
+ setUpListView();
+ setUpAdapter();
+
+ // go to today or whichever is close to today min or max date
+ mTempDate.setTimeInMillis(System.currentTimeMillis());
+ if (mTempDate.before(mMinDate)) {
+ goTo(mMinDate, false, true, true);
+ } else if (mMaxDate.before(mTempDate)) {
+ goTo(mMaxDate, false, true, true);
} else {
- mListView.setSelectionFromTop(position, mListScrollTopOffset);
- // Perform any after scroll operations that are needed
- onScrollStateChanged(mListView, OnScrollListener.SCROLL_STATE_IDLE);
+ goTo(mTempDate, false, true, true);
}
- } else if (setSelected) {
- // Otherwise just set the selection
- setMonthDisplayed(date);
+
+ mDelegator.invalidate();
}
- }
- /**
- * Parses the given <code>date</code> and in case of success sets
- * the result to the <code>outDate</code>.
- *
- * @return True if the date was parsed.
- */
- private boolean parseDate(String date, Calendar outDate) {
- try {
- outDate.setTime(mDateFormat.parse(date));
- return true;
- } catch (ParseException e) {
- Log.w(LOG_TAG, "Date: " + date + " not in format: " + DATE_FORMAT);
- return false;
+ @Override
+ public void setShownWeekCount(int count) {
+ if (mShownWeekCount != count) {
+ mShownWeekCount = count;
+ mDelegator.invalidate();
+ }
}
- }
- /**
- * Called when a <code>view</code> transitions to a new <code>scrollState
- * </code>.
- */
- private void onScrollStateChanged(AbsListView view, int scrollState) {
- mScrollStateChangedRunnable.doScrollStateChange(view, scrollState);
- }
+ @Override
+ public int getShownWeekCount() {
+ return mShownWeekCount;
+ }
- /**
- * Updates the title and selected month if the <code>view</code> has moved to a new
- * month.
- */
- private void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount,
- int totalItemCount) {
- WeekView child = (WeekView) view.getChildAt(0);
- if (child == null) {
- return;
+ @Override
+ public void setSelectedWeekBackgroundColor(int color) {
+ if (mSelectedWeekBackgroundColor != color) {
+ mSelectedWeekBackgroundColor = color;
+ final int childCount = mListView.getChildCount();
+ for (int i = 0; i < childCount; i++) {
+ WeekView weekView = (WeekView) mListView.getChildAt(i);
+ if (weekView.mHasSelectedDay) {
+ weekView.invalidate();
+ }
+ }
+ }
}
- // Figure out where we are
- long currScroll = view.getFirstVisiblePosition() * child.getHeight() - child.getBottom();
+ @Override
+ public int getSelectedWeekBackgroundColor() {
+ return mSelectedWeekBackgroundColor;
+ }
- // If we have moved since our last call update the direction
- if (currScroll < mPreviousScrollPosition) {
- mIsScrollingUp = true;
- } else if (currScroll > mPreviousScrollPosition) {
- mIsScrollingUp = false;
- } else {
- return;
+ @Override
+ public void setFocusedMonthDateColor(int color) {
+ if (mFocusedMonthDateColor != color) {
+ mFocusedMonthDateColor = color;
+ final int childCount = mListView.getChildCount();
+ for (int i = 0; i < childCount; i++) {
+ WeekView weekView = (WeekView) mListView.getChildAt(i);
+ if (weekView.mHasFocusedDay) {
+ weekView.invalidate();
+ }
+ }
+ }
}
- // Use some hysteresis for checking which month to highlight. This
- // causes the month to transition when two full weeks of a month are
- // visible when scrolling up, and when the first day in a month reaches
- // the top of the screen when scrolling down.
- int offset = child.getBottom() < mWeekMinVisibleHeight ? 1 : 0;
- if (mIsScrollingUp) {
- child = (WeekView) view.getChildAt(SCROLL_HYST_WEEKS + offset);
- } else if (offset != 0) {
- child = (WeekView) view.getChildAt(offset);
+ @Override
+ public int getFocusedMonthDateColor() {
+ return mFocusedMonthDateColor;
}
- // Find out which month we're moving into
- int month;
- if (mIsScrollingUp) {
- month = child.getMonthOfFirstWeekDay();
- } else {
- month = child.getMonthOfLastWeekDay();
+ @Override
+ public void setUnfocusedMonthDateColor(int color) {
+ if (mUnfocusedMonthDateColor != color) {
+ mUnfocusedMonthDateColor = color;
+ final int childCount = mListView.getChildCount();
+ for (int i = 0; i < childCount; i++) {
+ WeekView weekView = (WeekView) mListView.getChildAt(i);
+ if (weekView.mHasUnfocusedDay) {
+ weekView.invalidate();
+ }
+ }
+ }
}
- // And how it relates to our current highlighted month
- int monthDiff;
- if (mCurrentMonthDisplayed == 11 && month == 0) {
- monthDiff = 1;
- } else if (mCurrentMonthDisplayed == 0 && month == 11) {
- monthDiff = -1;
- } else {
- monthDiff = month - mCurrentMonthDisplayed;
+ @Override
+ public int getUnfocusedMonthDateColor() {
+ return mFocusedMonthDateColor;
}
- // Only switch months if we're scrolling away from the currently
- // selected month
- if ((!mIsScrollingUp && monthDiff > 0) || (mIsScrollingUp && monthDiff < 0)) {
- Calendar firstDay = child.getFirstDay();
- if (mIsScrollingUp) {
- firstDay.add(Calendar.DAY_OF_MONTH, -DAYS_PER_WEEK);
- } else {
- firstDay.add(Calendar.DAY_OF_MONTH, DAYS_PER_WEEK);
+ @Override
+ public void setWeekNumberColor(int color) {
+ if (mWeekNumberColor != color) {
+ mWeekNumberColor = color;
+ if (mShowWeekNumber) {
+ invalidateAllWeekViews();
+ }
}
- setMonthDisplayed(firstDay);
}
- mPreviousScrollPosition = currScroll;
- mPreviousScrollState = mCurrentScrollState;
- }
- /**
- * Sets the month displayed at the top of this view based on time. Override
- * to add custom events when the title is changed.
- *
- * @param calendar A day in the new focus month.
- */
- private void setMonthDisplayed(Calendar calendar) {
- mCurrentMonthDisplayed = calendar.get(Calendar.MONTH);
- mAdapter.setFocusMonth(mCurrentMonthDisplayed);
- final int flags = DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_NO_MONTH_DAY
- | DateUtils.FORMAT_SHOW_YEAR;
- final long millis = calendar.getTimeInMillis();
- String newMonthName = DateUtils.formatDateRange(mContext, millis, millis, flags);
- mMonthName.setText(newMonthName);
- mMonthName.invalidate();
- }
-
- /**
- * @return Returns the number of weeks between the current <code>date</code>
- * and the <code>mMinDate</code>.
- */
- private int getWeeksSinceMinDate(Calendar date) {
- if (date.before(mMinDate)) {
- throw new IllegalArgumentException("fromDate: " + mMinDate.getTime()
- + " does not precede toDate: " + date.getTime());
+ @Override
+ public int getWeekNumberColor() {
+ return mWeekNumberColor;
}
- long endTimeMillis = date.getTimeInMillis()
- + date.getTimeZone().getOffset(date.getTimeInMillis());
- long startTimeMillis = mMinDate.getTimeInMillis()
- + mMinDate.getTimeZone().getOffset(mMinDate.getTimeInMillis());
- long dayOffsetMillis = (mMinDate.get(Calendar.DAY_OF_WEEK) - mFirstDayOfWeek)
- * MILLIS_IN_DAY;
- return (int) ((endTimeMillis - startTimeMillis + dayOffsetMillis) / MILLIS_IN_WEEK);
- }
- /**
- * Command responsible for acting upon scroll state changes.
- */
- private class ScrollStateRunnable implements Runnable {
- private AbsListView mView;
+ @Override
+ public void setWeekSeparatorLineColor(int color) {
+ if (mWeekSeparatorLineColor != color) {
+ mWeekSeparatorLineColor = color;
+ invalidateAllWeekViews();
+ }
+ }
- private int mNewState;
+ @Override
+ public int getWeekSeparatorLineColor() {
+ return mWeekSeparatorLineColor;
+ }
- /**
- * Sets up the runnable with a short delay in case the scroll state
- * immediately changes again.
- *
- * @param view The list view that changed state
- * @param scrollState The new state it changed to
- */
- public void doScrollStateChange(AbsListView view, int scrollState) {
- mView = view;
- mNewState = scrollState;
- removeCallbacks(this);
- postDelayed(this, SCROLL_CHANGE_DELAY);
+ @Override
+ public void setSelectedDateVerticalBar(int resourceId) {
+ Drawable drawable = mDelegator.getResources().getDrawable(resourceId);
+ setSelectedDateVerticalBar(drawable);
}
- public void run() {
- mCurrentScrollState = mNewState;
- // Fix the position after a scroll or a fling ends
- if (mNewState == OnScrollListener.SCROLL_STATE_IDLE
- && mPreviousScrollState != OnScrollListener.SCROLL_STATE_IDLE) {
- View child = mView.getChildAt(0);
- if (child == null) {
- // The view is no longer visible, just return
- return;
- }
- int dist = child.getBottom() - mListScrollTopOffset;
- if (dist > mListScrollTopOffset) {
- if (mIsScrollingUp) {
- mView.smoothScrollBy(dist - child.getHeight(), ADJUSTMENT_SCROLL_DURATION);
- } else {
- mView.smoothScrollBy(dist, ADJUSTMENT_SCROLL_DURATION);
+ @Override
+ public void setSelectedDateVerticalBar(Drawable drawable) {
+ if (mSelectedDateVerticalBar != drawable) {
+ mSelectedDateVerticalBar = drawable;
+ final int childCount = mListView.getChildCount();
+ for (int i = 0; i < childCount; i++) {
+ WeekView weekView = (WeekView) mListView.getChildAt(i);
+ if (weekView.mHasSelectedDay) {
+ weekView.invalidate();
}
}
}
- mPreviousScrollState = mNewState;
}
- }
- /**
- * <p>
- * This is a specialized adapter for creating a list of weeks with
- * selectable days. It can be configured to display the week number, start
- * the week on a given day, show a reduced number of days, or display an
- * arbitrary number of weeks at a time.
- * </p>
- */
- private class WeeksAdapter extends BaseAdapter implements OnTouchListener {
- private final Calendar mSelectedDate = Calendar.getInstance();
- private final GestureDetector mGestureDetector;
+ @Override
+ public Drawable getSelectedDateVerticalBar() {
+ return mSelectedDateVerticalBar;
+ }
- private int mSelectedWeek;
+ @Override
+ public void setWeekDayTextAppearance(int resourceId) {
+ if (mWeekDayTextAppearanceResId != resourceId) {
+ mWeekDayTextAppearanceResId = resourceId;
+ setUpHeader();
+ }
+ }
- private int mFocusedMonth;
+ @Override
+ public int getWeekDayTextAppearance() {
+ return mWeekDayTextAppearanceResId;
+ }
- private int mTotalWeekCount;
+ @Override
+ public void setDateTextAppearance(int resourceId) {
+ if (mDateTextAppearanceResId != resourceId) {
+ mDateTextAppearanceResId = resourceId;
+ updateDateTextSize();
+ invalidateAllWeekViews();
+ }
+ }
- public WeeksAdapter() {
- mGestureDetector = new GestureDetector(mContext, new CalendarGestureListener());
- init();
+ @Override
+ public int getDateTextAppearance() {
+ return mDateTextAppearanceResId;
}
- /**
- * Set up the gesture detector and selected time
- */
- private void init() {
- mSelectedWeek = getWeeksSinceMinDate(mSelectedDate);
- mTotalWeekCount = getWeeksSinceMinDate(mMaxDate);
- if (mMinDate.get(Calendar.DAY_OF_WEEK) != mFirstDayOfWeek
- || mMaxDate.get(Calendar.DAY_OF_WEEK) != mFirstDayOfWeek) {
- mTotalWeekCount++;
- }
- notifyDataSetChanged();
+ @Override
+ public void setEnabled(boolean enabled) {
+ mListView.setEnabled(enabled);
}
- /**
- * Updates the selected day and related parameters.
- *
- * @param selectedDay The time to highlight
- */
- public void setSelectedDay(Calendar selectedDay) {
- if (selectedDay.get(Calendar.DAY_OF_YEAR) == mSelectedDate.get(Calendar.DAY_OF_YEAR)
- && selectedDay.get(Calendar.YEAR) == mSelectedDate.get(Calendar.YEAR)) {
+ @Override
+ public boolean isEnabled() {
+ return mListView.isEnabled();
+ }
+
+ @Override
+ public void setMinDate(long minDate) {
+ mTempDate.setTimeInMillis(minDate);
+ if (isSameDate(mTempDate, mMinDate)) {
return;
}
- mSelectedDate.setTimeInMillis(selectedDay.getTimeInMillis());
- mSelectedWeek = getWeeksSinceMinDate(mSelectedDate);
- mFocusedMonth = mSelectedDate.get(Calendar.MONTH);
- notifyDataSetChanged();
+ mMinDate.setTimeInMillis(minDate);
+ // make sure the current date is not earlier than
+ // the new min date since the latter is used for
+ // calculating the indices in the adapter thus
+ // avoiding out of bounds error
+ Calendar date = mAdapter.mSelectedDate;
+ if (date.before(mMinDate)) {
+ mAdapter.setSelectedDay(mMinDate);
+ }
+ // reinitialize the adapter since its range depends on min date
+ mAdapter.init();
+ if (date.before(mMinDate)) {
+ setDate(mTempDate.getTimeInMillis());
+ } else {
+ // we go to the current date to force the ListView to query its
+ // adapter for the shown views since we have changed the adapter
+ // range and the base from which the later calculates item indices
+ // note that calling setDate will not work since the date is the same
+ goTo(date, false, true, false);
+ }
}
- /**
- * @return The selected day of month.
- */
- public Calendar getSelectedDay() {
- return mSelectedDate;
+ @Override
+ public long getMinDate() {
+ return mMinDate.getTimeInMillis();
}
@Override
- public int getCount() {
- return mTotalWeekCount;
+ public void setMaxDate(long maxDate) {
+ mTempDate.setTimeInMillis(maxDate);
+ if (isSameDate(mTempDate, mMaxDate)) {
+ return;
+ }
+ mMaxDate.setTimeInMillis(maxDate);
+ // reinitialize the adapter since its range depends on max date
+ mAdapter.init();
+ Calendar date = mAdapter.mSelectedDate;
+ if (date.after(mMaxDate)) {
+ setDate(mMaxDate.getTimeInMillis());
+ } else {
+ // we go to the current date to force the ListView to query its
+ // adapter for the shown views since we have changed the adapter
+ // range and the base from which the later calculates item indices
+ // note that calling setDate will not work since the date is the same
+ goTo(date, false, true, false);
+ }
}
@Override
- public Object getItem(int position) {
- return null;
+ public long getMaxDate() {
+ return mMaxDate.getTimeInMillis();
}
@Override
- public long getItemId(int position) {
- return position;
+ public void setShowWeekNumber(boolean showWeekNumber) {
+ if (mShowWeekNumber == showWeekNumber) {
+ return;
+ }
+ mShowWeekNumber = showWeekNumber;
+ mAdapter.notifyDataSetChanged();
+ setUpHeader();
}
@Override
- public View getView(int position, View convertView, ViewGroup parent) {
- WeekView weekView = null;
- if (convertView != null) {
- weekView = (WeekView) convertView;
- } else {
- weekView = new WeekView(mContext);
- android.widget.AbsListView.LayoutParams params =
- new android.widget.AbsListView.LayoutParams(LayoutParams.WRAP_CONTENT,
- LayoutParams.WRAP_CONTENT);
- weekView.setLayoutParams(params);
- weekView.setClickable(true);
- weekView.setOnTouchListener(this);
+ public boolean getShowWeekNumber() {
+ return mShowWeekNumber;
+ }
+
+ @Override
+ public void setFirstDayOfWeek(int firstDayOfWeek) {
+ if (mFirstDayOfWeek == firstDayOfWeek) {
+ return;
}
+ mFirstDayOfWeek = firstDayOfWeek;
+ mAdapter.init();
+ mAdapter.notifyDataSetChanged();
+ setUpHeader();
+ }
- int selectedWeekDay = (mSelectedWeek == position) ? mSelectedDate.get(
- Calendar.DAY_OF_WEEK) : -1;
- weekView.init(position, selectedWeekDay, mFocusedMonth);
+ @Override
+ public int getFirstDayOfWeek() {
+ return mFirstDayOfWeek;
+ }
- return weekView;
+ @Override
+ public void setDate(long date) {
+ setDate(date, false, false);
}
- /**
- * Changes which month is in focus and updates the view.
- *
- * @param month The month to show as in focus [0-11]
- */
- public void setFocusMonth(int month) {
- if (mFocusedMonth == month) {
+ @Override
+ public void setDate(long date, boolean animate, boolean center) {
+ mTempDate.setTimeInMillis(date);
+ if (isSameDate(mTempDate, mAdapter.mSelectedDate)) {
return;
}
- mFocusedMonth = month;
- notifyDataSetChanged();
+ goTo(mTempDate, animate, true, center);
}
@Override
- public boolean onTouch(View v, MotionEvent event) {
- if (mListView.isEnabled() && mGestureDetector.onTouchEvent(event)) {
- WeekView weekView = (WeekView) v;
- // if we cannot find a day for the given location we are done
- if (!weekView.getDayFromLocation(event.getX(), mTempDate)) {
- return true;
- }
- // it is possible that the touched day is outside the valid range
- // we draw whole weeks but range end can fall not on the week end
- if (mTempDate.before(mMinDate) || mTempDate.after(mMaxDate)) {
- return true;
- }
- onDateTapped(mTempDate);
- return true;
- }
- return false;
+ public long getDate() {
+ return mAdapter.mSelectedDate.getTimeInMillis();
+ }
+
+ @Override
+ public void setOnDateChangeListener(OnDateChangeListener listener) {
+ mOnDateChangeListener = listener;
+ }
+
+ @Override
+ public void onConfigurationChanged(Configuration newConfig) {
+ setCurrentLocale(newConfig.locale);
+ }
+
+ @Override
+ public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
+ event.setClassName(CalendarView.class.getName());
+ }
+
+ @Override
+ public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
+ info.setClassName(CalendarView.class.getName());
}
/**
- * Maintains the same hour/min/sec but moves the day to the tapped day.
+ * Sets the current locale.
*
- * @param day The day that was tapped
+ * @param locale The current locale.
*/
- private void onDateTapped(Calendar day) {
- setSelectedDay(day);
- setMonthDisplayed(day);
+ @Override
+ protected void setCurrentLocale(Locale locale) {
+ super.setCurrentLocale(locale);
+
+ mTempDate = getCalendarForLocale(mTempDate, locale);
+ mFirstDayOfMonth = getCalendarForLocale(mFirstDayOfMonth, locale);
+ mMinDate = getCalendarForLocale(mMinDate, locale);
+ mMaxDate = getCalendarForLocale(mMaxDate, locale);
+ }
+ private void updateDateTextSize() {
+ TypedArray dateTextAppearance = mDelegator.getContext().obtainStyledAttributes(
+ mDateTextAppearanceResId, R.styleable.TextAppearance);
+ mDateTextSize = dateTextAppearance.getDimensionPixelSize(
+ R.styleable.TextAppearance_textSize, DEFAULT_DATE_TEXT_SIZE);
+ dateTextAppearance.recycle();
}
/**
- * This is here so we can identify single tap events and set the
- * selected day correctly
+ * Invalidates all week views.
*/
- class CalendarGestureListener extends GestureDetector.SimpleOnGestureListener {
- @Override
- public boolean onSingleTapUp(MotionEvent e) {
- return true;
+ private void invalidateAllWeekViews() {
+ final int childCount = mListView.getChildCount();
+ for (int i = 0; i < childCount; i++) {
+ View view = mListView.getChildAt(i);
+ view.invalidate();
}
}
- }
- /**
- * <p>
- * This is a dynamic view for drawing a single week. It can be configured to
- * display the week number, start the week on a given day, or show a reduced
- * number of days. It is intended for use as a single view within a
- * ListView. See {@link WeeksAdapter} for usage.
- * </p>
- */
- private class WeekView extends View {
+ /**
+ * Gets a calendar for locale bootstrapped with the value of a given calendar.
+ *
+ * @param oldCalendar The old calendar.
+ * @param locale The locale.
+ */
+ private static Calendar getCalendarForLocale(Calendar oldCalendar, Locale locale) {
+ if (oldCalendar == null) {
+ return Calendar.getInstance(locale);
+ } else {
+ final long currentTimeMillis = oldCalendar.getTimeInMillis();
+ Calendar newCalendar = Calendar.getInstance(locale);
+ newCalendar.setTimeInMillis(currentTimeMillis);
+ return newCalendar;
+ }
+ }
- private final Rect mTempRect = new Rect();
+ /**
+ * @return True if the <code>firstDate</code> is the same as the <code>
+ * secondDate</code>.
+ */
+ private static boolean isSameDate(Calendar firstDate, Calendar secondDate) {
+ return (firstDate.get(Calendar.DAY_OF_YEAR) == secondDate.get(Calendar.DAY_OF_YEAR)
+ && firstDate.get(Calendar.YEAR) == secondDate.get(Calendar.YEAR));
+ }
- private final Paint mDrawPaint = new Paint();
+ /**
+ * Creates a new adapter if necessary and sets up its parameters.
+ */
+ private void setUpAdapter() {
+ if (mAdapter == null) {
+ mAdapter = new WeeksAdapter(mContext);
+ mAdapter.registerDataSetObserver(new DataSetObserver() {
+ @Override
+ public void onChanged() {
+ if (mOnDateChangeListener != null) {
+ Calendar selectedDay = mAdapter.getSelectedDay();
+ mOnDateChangeListener.onSelectedDayChange(mDelegator,
+ selectedDay.get(Calendar.YEAR),
+ selectedDay.get(Calendar.MONTH),
+ selectedDay.get(Calendar.DAY_OF_MONTH));
+ }
+ }
+ });
+ mListView.setAdapter(mAdapter);
+ }
- private final Paint mMonthNumDrawPaint = new Paint();
+ // refresh the view with the new parameters
+ mAdapter.notifyDataSetChanged();
+ }
- // Cache the number strings so we don't have to recompute them each time
- private String[] mDayNumbers;
+ /**
+ * Sets up the strings to be used by the header.
+ */
+ private void setUpHeader() {
+ mDayLabels = new String[mDaysPerWeek];
+ for (int i = mFirstDayOfWeek, count = mFirstDayOfWeek + mDaysPerWeek; i < count; i++) {
+ int calendarDay = (i > Calendar.SATURDAY) ? i - Calendar.SATURDAY : i;
+ mDayLabels[i - mFirstDayOfWeek] = DateUtils.getDayOfWeekString(calendarDay,
+ DateUtils.LENGTH_SHORTEST);
+ }
- // Quick lookup for checking which days are in the focus month
- private boolean[] mFocusDay;
+ TextView label = (TextView) mDayNamesHeader.getChildAt(0);
+ if (mShowWeekNumber) {
+ label.setVisibility(View.VISIBLE);
+ } else {
+ label.setVisibility(View.GONE);
+ }
+ for (int i = 1, count = mDayNamesHeader.getChildCount(); i < count; i++) {
+ label = (TextView) mDayNamesHeader.getChildAt(i);
+ if (mWeekDayTextAppearanceResId > -1) {
+ label.setTextAppearance(mContext, mWeekDayTextAppearanceResId);
+ }
+ if (i < mDaysPerWeek + 1) {
+ label.setText(mDayLabels[i - 1]);
+ label.setVisibility(View.VISIBLE);
+ } else {
+ label.setVisibility(View.GONE);
+ }
+ }
+ mDayNamesHeader.invalidate();
+ }
- // Whether this view has a focused day.
- private boolean mHasFocusedDay;
+ /**
+ * Sets all the required fields for the list view.
+ */
+ private void setUpListView() {
+ // Configure the listview
+ mListView.setDivider(null);
+ mListView.setItemsCanFocus(true);
+ mListView.setVerticalScrollBarEnabled(false);
+ mListView.setOnScrollListener(new OnScrollListener() {
+ public void onScrollStateChanged(AbsListView view, int scrollState) {
+ LegacyCalendarViewDelegate.this.onScrollStateChanged(view, scrollState);
+ }
- // Whether this view has only focused days.
- private boolean mHasUnfocusedDay;
+ public void onScroll(
+ AbsListView view, int firstVisibleItem, int visibleItemCount,
+ int totalItemCount) {
+ LegacyCalendarViewDelegate.this.onScroll(view, firstVisibleItem,
+ visibleItemCount, totalItemCount);
+ }
+ });
+ // Make the scrolling behavior nicer
+ mListView.setFriction(mFriction);
+ mListView.setVelocityScale(mVelocityScale);
+ }
- // The first day displayed by this item
- private Calendar mFirstDay;
+ /**
+ * This moves to the specified time in the view. If the time is not already
+ * in range it will move the list so that the first of the month containing
+ * the time is at the top of the view. If the new time is already in view
+ * the list will not be scrolled unless forceScroll is true. This time may
+ * optionally be highlighted as selected as well.
+ *
+ * @param date The time to move to.
+ * @param animate Whether to scroll to the given time or just redraw at the
+ * new location.
+ * @param setSelected Whether to set the given time as selected.
+ * @param forceScroll Whether to recenter even if the time is already
+ * visible.
+ *
+ * @throws IllegalArgumentException of the provided date is before the
+ * range start of after the range end.
+ */
+ private void goTo(Calendar date, boolean animate, boolean setSelected,
+ boolean forceScroll) {
+ if (date.before(mMinDate) || date.after(mMaxDate)) {
+ throw new IllegalArgumentException("Time not between " + mMinDate.getTime()
+ + " and " + mMaxDate.getTime());
+ }
+ // Find the first and last entirely visible weeks
+ int firstFullyVisiblePosition = mListView.getFirstVisiblePosition();
+ View firstChild = mListView.getChildAt(0);
+ if (firstChild != null && firstChild.getTop() < 0) {
+ firstFullyVisiblePosition++;
+ }
+ int lastFullyVisiblePosition = firstFullyVisiblePosition + mShownWeekCount - 1;
+ if (firstChild != null && firstChild.getTop() > mBottomBuffer) {
+ lastFullyVisiblePosition--;
+ }
+ if (setSelected) {
+ mAdapter.setSelectedDay(date);
+ }
+ // Get the week we're going to
+ int position = getWeeksSinceMinDate(date);
- // The month of the first day in this week
- private int mMonthOfFirstWeekDay = -1;
+ // Check if the selected day is now outside of our visible range
+ // and if so scroll to the month that contains it
+ if (position < firstFullyVisiblePosition || position > lastFullyVisiblePosition
+ || forceScroll) {
+ mFirstDayOfMonth.setTimeInMillis(date.getTimeInMillis());
+ mFirstDayOfMonth.set(Calendar.DAY_OF_MONTH, 1);
- // The month of the last day in this week
- private int mLastWeekDayMonth = -1;
+ setMonthDisplayed(mFirstDayOfMonth);
- // The position of this week, equivalent to weeks since the week of Jan
- // 1st, 1900
- private int mWeek = -1;
+ // the earliest time we can scroll to is the min date
+ if (mFirstDayOfMonth.before(mMinDate)) {
+ position = 0;
+ } else {
+ position = getWeeksSinceMinDate(mFirstDayOfMonth);
+ }
- // Quick reference to the width of this view, matches parent
- private int mWidth;
+ mPreviousScrollState = OnScrollListener.SCROLL_STATE_FLING;
+ if (animate) {
+ mListView.smoothScrollToPositionFromTop(position, mListScrollTopOffset,
+ GOTO_SCROLL_DURATION);
+ } else {
+ mListView.setSelectionFromTop(position, mListScrollTopOffset);
+ // Perform any after scroll operations that are needed
+ onScrollStateChanged(mListView, OnScrollListener.SCROLL_STATE_IDLE);
+ }
+ } else if (setSelected) {
+ // Otherwise just set the selection
+ setMonthDisplayed(date);
+ }
+ }
- // The height this view should draw at in pixels, set by height param
- private int mHeight;
+ /**
+ * Parses the given <code>date</code> and in case of success sets
+ * the result to the <code>outDate</code>.
+ *
+ * @return True if the date was parsed.
+ */
+ private boolean parseDate(String date, Calendar outDate) {
+ try {
+ outDate.setTime(mDateFormat.parse(date));
+ return true;
+ } catch (ParseException e) {
+ Log.w(LOG_TAG, "Date: " + date + " not in format: " + DATE_FORMAT);
+ return false;
+ }
+ }
- // If this view contains the selected day
- private boolean mHasSelectedDay = false;
+ /**
+ * Called when a <code>view</code> transitions to a new <code>scrollState
+ * </code>.
+ */
+ private void onScrollStateChanged(AbsListView view, int scrollState) {
+ mScrollStateChangedRunnable.doScrollStateChange(view, scrollState);
+ }
- // Which day is selected [0-6] or -1 if no day is selected
- private int mSelectedDay = -1;
+ /**
+ * Updates the title and selected month if the <code>view</code> has moved to a new
+ * month.
+ */
+ private void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount,
+ int totalItemCount) {
+ WeekView child = (WeekView) view.getChildAt(0);
+ if (child == null) {
+ return;
+ }
- // The number of days + a spot for week number if it is displayed
- private int mNumCells;
+ // Figure out where we are
+ long currScroll =
+ view.getFirstVisiblePosition() * child.getHeight() - child.getBottom();
- // The left edge of the selected day
- private int mSelectedLeft = -1;
+ // If we have moved since our last call update the direction
+ if (currScroll < mPreviousScrollPosition) {
+ mIsScrollingUp = true;
+ } else if (currScroll > mPreviousScrollPosition) {
+ mIsScrollingUp = false;
+ } else {
+ return;
+ }
- // The right edge of the selected day
- private int mSelectedRight = -1;
+ // Use some hysteresis for checking which month to highlight. This
+ // causes the month to transition when two full weeks of a month are
+ // visible when scrolling up, and when the first day in a month reaches
+ // the top of the screen when scrolling down.
+ int offset = child.getBottom() < mWeekMinVisibleHeight ? 1 : 0;
+ if (mIsScrollingUp) {
+ child = (WeekView) view.getChildAt(SCROLL_HYST_WEEKS + offset);
+ } else if (offset != 0) {
+ child = (WeekView) view.getChildAt(offset);
+ }
- public WeekView(Context context) {
- super(context);
+ // Find out which month we're moving into
+ int month;
+ if (mIsScrollingUp) {
+ month = child.getMonthOfFirstWeekDay();
+ } else {
+ month = child.getMonthOfLastWeekDay();
+ }
- // Sets up any standard paints that will be used
- initilaizePaints();
- }
+ // And how it relates to our current highlighted month
+ int monthDiff;
+ if (mCurrentMonthDisplayed == 11 && month == 0) {
+ monthDiff = 1;
+ } else if (mCurrentMonthDisplayed == 0 && month == 11) {
+ monthDiff = -1;
+ } else {
+ monthDiff = month - mCurrentMonthDisplayed;
+ }
- /**
- * Initializes this week view.
- *
- * @param weekNumber The number of the week this view represents. The
- * week number is a zero based index of the weeks since
- * {@link CalendarView#getMinDate()}.
- * @param selectedWeekDay The selected day of the week from 0 to 6, -1 if no
- * selected day.
- * @param focusedMonth The month that is currently in focus i.e.
- * highlighted.
- */
- public void init(int weekNumber, int selectedWeekDay, int focusedMonth) {
- mSelectedDay = selectedWeekDay;
- mHasSelectedDay = mSelectedDay != -1;
- mNumCells = mShowWeekNumber ? mDaysPerWeek + 1 : mDaysPerWeek;
- mWeek = weekNumber;
- mTempDate.setTimeInMillis(mMinDate.getTimeInMillis());
-
- mTempDate.add(Calendar.WEEK_OF_YEAR, mWeek);
- mTempDate.setFirstDayOfWeek(mFirstDayOfWeek);
-
- // Allocate space for caching the day numbers and focus values
- mDayNumbers = new String[mNumCells];
- mFocusDay = new boolean[mNumCells];
-
- // If we're showing the week number calculate it based on Monday
- int i = 0;
- if (mShowWeekNumber) {
- mDayNumbers[0] = String.format(Locale.getDefault(), "%d",
- mTempDate.get(Calendar.WEEK_OF_YEAR));
- i++;
- }
-
- // Now adjust our starting day based on the start day of the week
- int diff = mFirstDayOfWeek - mTempDate.get(Calendar.DAY_OF_WEEK);
- mTempDate.add(Calendar.DAY_OF_MONTH, diff);
-
- mFirstDay = (Calendar) mTempDate.clone();
- mMonthOfFirstWeekDay = mTempDate.get(Calendar.MONTH);
-
- mHasUnfocusedDay = true;
- for (; i < mNumCells; i++) {
- final boolean isFocusedDay = (mTempDate.get(Calendar.MONTH) == focusedMonth);
- mFocusDay[i] = isFocusedDay;
- mHasFocusedDay |= isFocusedDay;
- mHasUnfocusedDay &= !isFocusedDay;
- // do not draw dates outside the valid range to avoid user confusion
- if (mTempDate.before(mMinDate) || mTempDate.after(mMaxDate)) {
- mDayNumbers[i] = "";
+ // Only switch months if we're scrolling away from the currently
+ // selected month
+ if ((!mIsScrollingUp && monthDiff > 0) || (mIsScrollingUp && monthDiff < 0)) {
+ Calendar firstDay = child.getFirstDay();
+ if (mIsScrollingUp) {
+ firstDay.add(Calendar.DAY_OF_MONTH, -DAYS_PER_WEEK);
} else {
- mDayNumbers[i] = String.format(Locale.getDefault(), "%d",
- mTempDate.get(Calendar.DAY_OF_MONTH));
+ firstDay.add(Calendar.DAY_OF_MONTH, DAYS_PER_WEEK);
}
- mTempDate.add(Calendar.DAY_OF_MONTH, 1);
- }
- // We do one extra add at the end of the loop, if that pushed us to
- // new month undo it
- if (mTempDate.get(Calendar.DAY_OF_MONTH) == 1) {
- mTempDate.add(Calendar.DAY_OF_MONTH, -1);
+ setMonthDisplayed(firstDay);
}
- mLastWeekDayMonth = mTempDate.get(Calendar.MONTH);
-
- updateSelectionPositions();
+ mPreviousScrollPosition = currScroll;
+ mPreviousScrollState = mCurrentScrollState;
}
/**
- * Initialize the paint instances.
- */
- private void initilaizePaints() {
- mDrawPaint.setFakeBoldText(false);
- mDrawPaint.setAntiAlias(true);
- mDrawPaint.setStyle(Style.FILL);
-
- mMonthNumDrawPaint.setFakeBoldText(true);
- mMonthNumDrawPaint.setAntiAlias(true);
- mMonthNumDrawPaint.setStyle(Style.FILL);
- mMonthNumDrawPaint.setTextAlign(Align.CENTER);
- mMonthNumDrawPaint.setTextSize(mDateTextSize);
- }
-
- /**
- * Returns the month of the first day in this week.
+ * Sets the month displayed at the top of this view based on time. Override
+ * to add custom events when the title is changed.
*
- * @return The month the first day of this view is in.
+ * @param calendar A day in the new focus month.
*/
- public int getMonthOfFirstWeekDay() {
- return mMonthOfFirstWeekDay;
+ private void setMonthDisplayed(Calendar calendar) {
+ mCurrentMonthDisplayed = calendar.get(Calendar.MONTH);
+ mAdapter.setFocusMonth(mCurrentMonthDisplayed);
+ final int flags = DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_NO_MONTH_DAY
+ | DateUtils.FORMAT_SHOW_YEAR;
+ final long millis = calendar.getTimeInMillis();
+ String newMonthName = DateUtils.formatDateRange(mContext, millis, millis, flags);
+ mMonthName.setText(newMonthName);
+ mMonthName.invalidate();
}
/**
- * Returns the month of the last day in this week
- *
- * @return The month the last day of this view is in
+ * @return Returns the number of weeks between the current <code>date</code>
+ * and the <code>mMinDate</code>.
*/
- public int getMonthOfLastWeekDay() {
- return mLastWeekDayMonth;
+ private int getWeeksSinceMinDate(Calendar date) {
+ if (date.before(mMinDate)) {
+ throw new IllegalArgumentException("fromDate: " + mMinDate.getTime()
+ + " does not precede toDate: " + date.getTime());
+ }
+ long endTimeMillis = date.getTimeInMillis()
+ + date.getTimeZone().getOffset(date.getTimeInMillis());
+ long startTimeMillis = mMinDate.getTimeInMillis()
+ + mMinDate.getTimeZone().getOffset(mMinDate.getTimeInMillis());
+ long dayOffsetMillis = (mMinDate.get(Calendar.DAY_OF_WEEK) - mFirstDayOfWeek)
+ * MILLIS_IN_DAY;
+ return (int) ((endTimeMillis - startTimeMillis + dayOffsetMillis) / MILLIS_IN_WEEK);
}
/**
- * Returns the first day in this view.
- *
- * @return The first day in the view.
+ * Command responsible for acting upon scroll state changes.
*/
- public Calendar getFirstDay() {
- return mFirstDay;
+ private class ScrollStateRunnable implements Runnable {
+ private AbsListView mView;
+
+ private int mNewState;
+
+ /**
+ * Sets up the runnable with a short delay in case the scroll state
+ * immediately changes again.
+ *
+ * @param view The list view that changed state
+ * @param scrollState The new state it changed to
+ */
+ public void doScrollStateChange(AbsListView view, int scrollState) {
+ mView = view;
+ mNewState = scrollState;
+ mDelegator.removeCallbacks(this);
+ mDelegator.postDelayed(this, SCROLL_CHANGE_DELAY);
+ }
+
+ public void run() {
+ mCurrentScrollState = mNewState;
+ // Fix the position after a scroll or a fling ends
+ if (mNewState == OnScrollListener.SCROLL_STATE_IDLE
+ && mPreviousScrollState != OnScrollListener.SCROLL_STATE_IDLE) {
+ View child = mView.getChildAt(0);
+ if (child == null) {
+ // The view is no longer visible, just return
+ return;
+ }
+ int dist = child.getBottom() - mListScrollTopOffset;
+ if (dist > mListScrollTopOffset) {
+ if (mIsScrollingUp) {
+ mView.smoothScrollBy(dist - child.getHeight(),
+ ADJUSTMENT_SCROLL_DURATION);
+ } else {
+ mView.smoothScrollBy(dist, ADJUSTMENT_SCROLL_DURATION);
+ }
+ }
+ }
+ mPreviousScrollState = mNewState;
+ }
}
/**
- * Calculates the day that the given x position is in, accounting for
- * week number.
- *
- * @param x The x position of the touch event.
- * @return True if a day was found for the given location.
+ * <p>
+ * This is a specialized adapter for creating a list of weeks with
+ * selectable days. It can be configured to display the week number, start
+ * the week on a given day, show a reduced number of days, or display an
+ * arbitrary number of weeks at a time.
+ * </p>
*/
- public boolean getDayFromLocation(float x, Calendar outCalendar) {
- final boolean isLayoutRtl = isLayoutRtl();
+ private class WeeksAdapter extends BaseAdapter implements OnTouchListener {
- int start;
- int end;
+ private int mSelectedWeek;
- if (isLayoutRtl) {
- start = 0;
- end = mShowWeekNumber ? mWidth - mWidth / mNumCells : mWidth;
- } else {
- start = mShowWeekNumber ? mWidth / mNumCells : 0;
- end = mWidth;
+ private GestureDetector mGestureDetector;
+
+ private int mFocusedMonth;
+
+ private final Calendar mSelectedDate = Calendar.getInstance();
+
+ private int mTotalWeekCount;
+
+ public WeeksAdapter(Context context) {
+ mContext = context;
+ mGestureDetector = new GestureDetector(mContext, new CalendarGestureListener());
+ init();
}
- if (x < start || x > end) {
- outCalendar.clear();
- return false;
+ /**
+ * Set up the gesture detector and selected time
+ */
+ private void init() {
+ mSelectedWeek = getWeeksSinceMinDate(mSelectedDate);
+ mTotalWeekCount = getWeeksSinceMinDate(mMaxDate);
+ if (mMinDate.get(Calendar.DAY_OF_WEEK) != mFirstDayOfWeek
+ || mMaxDate.get(Calendar.DAY_OF_WEEK) != mFirstDayOfWeek) {
+ mTotalWeekCount++;
+ }
+ }
+
+ /**
+ * Updates the selected day and related parameters.
+ *
+ * @param selectedDay The time to highlight
+ */
+ public void setSelectedDay(Calendar selectedDay) {
+ if (selectedDay.get(Calendar.DAY_OF_YEAR) == mSelectedDate.get(Calendar.DAY_OF_YEAR)
+ && selectedDay.get(Calendar.YEAR) == mSelectedDate.get(Calendar.YEAR)) {
+ return;
+ }
+ mSelectedDate.setTimeInMillis(selectedDay.getTimeInMillis());
+ mSelectedWeek = getWeeksSinceMinDate(mSelectedDate);
+ mFocusedMonth = mSelectedDate.get(Calendar.MONTH);
+ notifyDataSetChanged();
+ }
+
+ /**
+ * @return The selected day of month.
+ */
+ public Calendar getSelectedDay() {
+ return mSelectedDate;
}
- // Selection is (x - start) / (pixels/day) which is (x - start) * day / pixels
- int dayPosition = (int) ((x - start) * mDaysPerWeek / (end - start));
+ @Override
+ public int getCount() {
+ return mTotalWeekCount;
+ }
- if (isLayoutRtl) {
- dayPosition = mDaysPerWeek - 1 - dayPosition;
+ @Override
+ public Object getItem(int position) {
+ return null;
}
- outCalendar.setTimeInMillis(mFirstDay.getTimeInMillis());
- outCalendar.add(Calendar.DAY_OF_MONTH, dayPosition);
+ @Override
+ public long getItemId(int position) {
+ return position;
+ }
- return true;
- }
+ @Override
+ public View getView(int position, View convertView, ViewGroup parent) {
+ WeekView weekView = null;
+ if (convertView != null) {
+ weekView = (WeekView) convertView;
+ } else {
+ weekView = new WeekView(mContext);
+ android.widget.AbsListView.LayoutParams params =
+ new android.widget.AbsListView.LayoutParams(LayoutParams.WRAP_CONTENT,
+ LayoutParams.WRAP_CONTENT);
+ weekView.setLayoutParams(params);
+ weekView.setClickable(true);
+ weekView.setOnTouchListener(this);
+ }
- @Override
- protected void onDraw(Canvas canvas) {
- drawBackground(canvas);
- drawWeekNumbersAndDates(canvas);
- drawWeekSeparators(canvas);
- drawSelectedDateVerticalBars(canvas);
- }
+ int selectedWeekDay = (mSelectedWeek == position) ? mSelectedDate.get(
+ Calendar.DAY_OF_WEEK) : -1;
+ weekView.init(position, selectedWeekDay, mFocusedMonth);
- /**
- * This draws the selection highlight if a day is selected in this week.
- *
- * @param canvas The canvas to draw on
- */
- private void drawBackground(Canvas canvas) {
- if (!mHasSelectedDay) {
- return;
+ return weekView;
}
- mDrawPaint.setColor(mSelectedWeekBackgroundColor);
- mTempRect.top = mWeekSeperatorLineWidth;
- mTempRect.bottom = mHeight;
+ /**
+ * Changes which month is in focus and updates the view.
+ *
+ * @param month The month to show as in focus [0-11]
+ */
+ public void setFocusMonth(int month) {
+ if (mFocusedMonth == month) {
+ return;
+ }
+ mFocusedMonth = month;
+ notifyDataSetChanged();
+ }
- final boolean isLayoutRtl = isLayoutRtl();
+ @Override
+ public boolean onTouch(View v, MotionEvent event) {
+ if (mListView.isEnabled() && mGestureDetector.onTouchEvent(event)) {
+ WeekView weekView = (WeekView) v;
+ // if we cannot find a day for the given location we are done
+ if (!weekView.getDayFromLocation(event.getX(), mTempDate)) {
+ return true;
+ }
+ // it is possible that the touched day is outside the valid range
+ // we draw whole weeks but range end can fall not on the week end
+ if (mTempDate.before(mMinDate) || mTempDate.after(mMaxDate)) {
+ return true;
+ }
+ onDateTapped(mTempDate);
+ return true;
+ }
+ return false;
+ }
- if (isLayoutRtl) {
- mTempRect.left = 0;
- mTempRect.right = mSelectedLeft - 2;
- } else {
- mTempRect.left = mShowWeekNumber ? mWidth / mNumCells : 0;
- mTempRect.right = mSelectedLeft - 2;
+ /**
+ * Maintains the same hour/min/sec but moves the day to the tapped day.
+ *
+ * @param day The day that was tapped
+ */
+ private void onDateTapped(Calendar day) {
+ setSelectedDay(day);
+ setMonthDisplayed(day);
}
- canvas.drawRect(mTempRect, mDrawPaint);
- if (isLayoutRtl) {
- mTempRect.left = mSelectedRight + 3;
- mTempRect.right = mShowWeekNumber ? mWidth - mWidth / mNumCells : mWidth;
- } else {
- mTempRect.left = mSelectedRight + 3;
- mTempRect.right = mWidth;
+ /**
+ * This is here so we can identify single tap events and set the
+ * selected day correctly
+ */
+ class CalendarGestureListener extends GestureDetector.SimpleOnGestureListener {
+ @Override
+ public boolean onSingleTapUp(MotionEvent e) {
+ return true;
+ }
}
- canvas.drawRect(mTempRect, mDrawPaint);
}
/**
- * Draws the week and month day numbers for this week.
- *
- * @param canvas The canvas to draw on
+ * <p>
+ * This is a dynamic view for drawing a single week. It can be configured to
+ * display the week number, start the week on a given day, or show a reduced
+ * number of days. It is intended for use as a single view within a
+ * ListView. See {@link WeeksAdapter} for usage.
+ * </p>
*/
- private void drawWeekNumbersAndDates(Canvas canvas) {
- final float textHeight = mDrawPaint.getTextSize();
- final int y = (int) ((mHeight + textHeight) / 2) - mWeekSeperatorLineWidth;
- final int nDays = mNumCells;
- final int divisor = 2 * nDays;
-
- mDrawPaint.setTextAlign(Align.CENTER);
- mDrawPaint.setTextSize(mDateTextSize);
-
- int i = 0;
-
- if (isLayoutRtl()) {
- for (; i < nDays - 1; i++) {
- mMonthNumDrawPaint.setColor(mFocusDay[i] ? mFocusedMonthDateColor
- : mUnfocusedMonthDateColor);
- int x = (2 * i + 1) * mWidth / divisor;
- canvas.drawText(mDayNumbers[nDays - 1 - i], x, y, mMonthNumDrawPaint);
- }
- if (mShowWeekNumber) {
- mDrawPaint.setColor(mWeekNumberColor);
- int x = mWidth - mWidth / divisor;
- canvas.drawText(mDayNumbers[0], x, y, mDrawPaint);
- }
- } else {
+ private class WeekView extends View {
+
+ private final Rect mTempRect = new Rect();
+
+ private final Paint mDrawPaint = new Paint();
+
+ private final Paint mMonthNumDrawPaint = new Paint();
+
+ // Cache the number strings so we don't have to recompute them each time
+ private String[] mDayNumbers;
+
+ // Quick lookup for checking which days are in the focus month
+ private boolean[] mFocusDay;
+
+ // Whether this view has a focused day.
+ private boolean mHasFocusedDay;
+
+ // Whether this view has only focused days.
+ private boolean mHasUnfocusedDay;
+
+ // The first day displayed by this item
+ private Calendar mFirstDay;
+
+ // The month of the first day in this week
+ private int mMonthOfFirstWeekDay = -1;
+
+ // The month of the last day in this week
+ private int mLastWeekDayMonth = -1;
+
+ // The position of this week, equivalent to weeks since the week of Jan
+ // 1st, 1900
+ private int mWeek = -1;
+
+ // Quick reference to the width of this view, matches parent
+ private int mWidth;
+
+ // The height this view should draw at in pixels, set by height param
+ private int mHeight;
+
+ // If this view contains the selected day
+ private boolean mHasSelectedDay = false;
+
+ // Which day is selected [0-6] or -1 if no day is selected
+ private int mSelectedDay = -1;
+
+ // The number of days + a spot for week number if it is displayed
+ private int mNumCells;
+
+ // The left edge of the selected day
+ private int mSelectedLeft = -1;
+
+ // The right edge of the selected day
+ private int mSelectedRight = -1;
+
+ public WeekView(Context context) {
+ super(context);
+
+ // Sets up any standard paints that will be used
+ initilaizePaints();
+ }
+
+ /**
+ * Initializes this week view.
+ *
+ * @param weekNumber The number of the week this view represents. The
+ * week number is a zero based index of the weeks since
+ * {@link CalendarView#getMinDate()}.
+ * @param selectedWeekDay The selected day of the week from 0 to 6, -1 if no
+ * selected day.
+ * @param focusedMonth The month that is currently in focus i.e.
+ * highlighted.
+ */
+ public void init(int weekNumber, int selectedWeekDay, int focusedMonth) {
+ mSelectedDay = selectedWeekDay;
+ mHasSelectedDay = mSelectedDay != -1;
+ mNumCells = mShowWeekNumber ? mDaysPerWeek + 1 : mDaysPerWeek;
+ mWeek = weekNumber;
+ mTempDate.setTimeInMillis(mMinDate.getTimeInMillis());
+
+ mTempDate.add(Calendar.WEEK_OF_YEAR, mWeek);
+ mTempDate.setFirstDayOfWeek(mFirstDayOfWeek);
+
+ // Allocate space for caching the day numbers and focus values
+ mDayNumbers = new String[mNumCells];
+ mFocusDay = new boolean[mNumCells];
+
+ // If we're showing the week number calculate it based on Monday
+ int i = 0;
if (mShowWeekNumber) {
- mDrawPaint.setColor(mWeekNumberColor);
- int x = mWidth / divisor;
- canvas.drawText(mDayNumbers[0], x, y, mDrawPaint);
+ mDayNumbers[0] = String.format(Locale.getDefault(), "%d",
+ mTempDate.get(Calendar.WEEK_OF_YEAR));
i++;
}
- for (; i < nDays; i++) {
- mMonthNumDrawPaint.setColor(mFocusDay[i] ? mFocusedMonthDateColor
- : mUnfocusedMonthDateColor);
- int x = (2 * i + 1) * mWidth / divisor;
- canvas.drawText(mDayNumbers[i], x, y, mMonthNumDrawPaint);
+
+ // Now adjust our starting day based on the start day of the week
+ int diff = mFirstDayOfWeek - mTempDate.get(Calendar.DAY_OF_WEEK);
+ mTempDate.add(Calendar.DAY_OF_MONTH, diff);
+
+ mFirstDay = (Calendar) mTempDate.clone();
+ mMonthOfFirstWeekDay = mTempDate.get(Calendar.MONTH);
+
+ mHasUnfocusedDay = true;
+ for (; i < mNumCells; i++) {
+ final boolean isFocusedDay = (mTempDate.get(Calendar.MONTH) == focusedMonth);
+ mFocusDay[i] = isFocusedDay;
+ mHasFocusedDay |= isFocusedDay;
+ mHasUnfocusedDay &= !isFocusedDay;
+ // do not draw dates outside the valid range to avoid user confusion
+ if (mTempDate.before(mMinDate) || mTempDate.after(mMaxDate)) {
+ mDayNumbers[i] = "";
+ } else {
+ mDayNumbers[i] = String.format(Locale.getDefault(), "%d",
+ mTempDate.get(Calendar.DAY_OF_MONTH));
+ }
+ mTempDate.add(Calendar.DAY_OF_MONTH, 1);
}
- }
- }
+ // We do one extra add at the end of the loop, if that pushed us to
+ // new month undo it
+ if (mTempDate.get(Calendar.DAY_OF_MONTH) == 1) {
+ mTempDate.add(Calendar.DAY_OF_MONTH, -1);
+ }
+ mLastWeekDayMonth = mTempDate.get(Calendar.MONTH);
- /**
- * Draws a horizontal line for separating the weeks.
- *
- * @param canvas The canvas to draw on.
- */
- private void drawWeekSeparators(Canvas canvas) {
- // If it is the topmost fully visible child do not draw separator line
- int firstFullyVisiblePosition = mListView.getFirstVisiblePosition();
- if (mListView.getChildAt(0).getTop() < 0) {
- firstFullyVisiblePosition++;
+ updateSelectionPositions();
}
- if (firstFullyVisiblePosition == mWeek) {
- return;
+
+ /**
+ * Initialize the paint instances.
+ */
+ private void initilaizePaints() {
+ mDrawPaint.setFakeBoldText(false);
+ mDrawPaint.setAntiAlias(true);
+ mDrawPaint.setStyle(Style.FILL);
+
+ mMonthNumDrawPaint.setFakeBoldText(true);
+ mMonthNumDrawPaint.setAntiAlias(true);
+ mMonthNumDrawPaint.setStyle(Style.FILL);
+ mMonthNumDrawPaint.setTextAlign(Align.CENTER);
+ mMonthNumDrawPaint.setTextSize(mDateTextSize);
}
- mDrawPaint.setColor(mWeekSeparatorLineColor);
- mDrawPaint.setStrokeWidth(mWeekSeperatorLineWidth);
- float startX;
- float stopX;
- if (isLayoutRtl()) {
- startX = 0;
- stopX = mShowWeekNumber ? mWidth - mWidth / mNumCells : mWidth;
- } else {
- startX = mShowWeekNumber ? mWidth / mNumCells : 0;
- stopX = mWidth;
+
+ /**
+ * Returns the month of the first day in this week.
+ *
+ * @return The month the first day of this view is in.
+ */
+ public int getMonthOfFirstWeekDay() {
+ return mMonthOfFirstWeekDay;
}
- canvas.drawLine(startX, 0, stopX, 0, mDrawPaint);
- }
- /**
- * Draws the selected date bars if this week has a selected day.
- *
- * @param canvas The canvas to draw on
- */
- private void drawSelectedDateVerticalBars(Canvas canvas) {
- if (!mHasSelectedDay) {
- return;
+ /**
+ * Returns the month of the last day in this week
+ *
+ * @return The month the last day of this view is in
+ */
+ public int getMonthOfLastWeekDay() {
+ return mLastWeekDayMonth;
}
- mSelectedDateVerticalBar.setBounds(mSelectedLeft - mSelectedDateVerticalBarWidth / 2,
- mWeekSeperatorLineWidth,
- mSelectedLeft + mSelectedDateVerticalBarWidth / 2, mHeight);
- mSelectedDateVerticalBar.draw(canvas);
- mSelectedDateVerticalBar.setBounds(mSelectedRight - mSelectedDateVerticalBarWidth / 2,
- mWeekSeperatorLineWidth,
- mSelectedRight + mSelectedDateVerticalBarWidth / 2, mHeight);
- mSelectedDateVerticalBar.draw(canvas);
- }
- @Override
- protected void onSizeChanged(int w, int h, int oldw, int oldh) {
- mWidth = w;
- updateSelectionPositions();
- }
+ /**
+ * Returns the first day in this view.
+ *
+ * @return The first day in the view.
+ */
+ public Calendar getFirstDay() {
+ return mFirstDay;
+ }
- /**
- * This calculates the positions for the selected day lines.
- */
- private void updateSelectionPositions() {
- if (mHasSelectedDay) {
+ /**
+ * Calculates the day that the given x position is in, accounting for
+ * week number.
+ *
+ * @param x The x position of the touch event.
+ * @return True if a day was found for the given location.
+ */
+ public boolean getDayFromLocation(float x, Calendar outCalendar) {
final boolean isLayoutRtl = isLayoutRtl();
- int selectedPosition = mSelectedDay - mFirstDayOfWeek;
- if (selectedPosition < 0) {
- selectedPosition += 7;
+
+ int start;
+ int end;
+
+ if (isLayoutRtl) {
+ start = 0;
+ end = mShowWeekNumber ? mWidth - mWidth / mNumCells : mWidth;
+ } else {
+ start = mShowWeekNumber ? mWidth / mNumCells : 0;
+ end = mWidth;
}
- if (mShowWeekNumber && !isLayoutRtl) {
- selectedPosition++;
+
+ if (x < start || x > end) {
+ outCalendar.clear();
+ return false;
}
+
+ // Selection is (x - start) / (pixels/day) which is (x - start) * day / pixels
+ int dayPosition = (int) ((x - start) * mDaysPerWeek / (end - start));
+
if (isLayoutRtl) {
- mSelectedLeft = (mDaysPerWeek - 1 - selectedPosition) * mWidth / mNumCells;
+ dayPosition = mDaysPerWeek - 1 - dayPosition;
+ }
+ outCalendar.setTimeInMillis(mFirstDay.getTimeInMillis());
+ outCalendar.add(Calendar.DAY_OF_MONTH, dayPosition);
+
+ return true;
+ }
+
+ @Override
+ protected void onDraw(Canvas canvas) {
+ drawBackground(canvas);
+ drawWeekNumbersAndDates(canvas);
+ drawWeekSeparators(canvas);
+ drawSelectedDateVerticalBars(canvas);
+ }
+
+ /**
+ * This draws the selection highlight if a day is selected in this week.
+ *
+ * @param canvas The canvas to draw on
+ */
+ private void drawBackground(Canvas canvas) {
+ if (!mHasSelectedDay) {
+ return;
+ }
+ mDrawPaint.setColor(mSelectedWeekBackgroundColor);
+
+ mTempRect.top = mWeekSeperatorLineWidth;
+ mTempRect.bottom = mHeight;
+
+ final boolean isLayoutRtl = isLayoutRtl();
+
+ if (isLayoutRtl) {
+ mTempRect.left = 0;
+ mTempRect.right = mSelectedLeft - 2;
+ } else {
+ mTempRect.left = mShowWeekNumber ? mWidth / mNumCells : 0;
+ mTempRect.right = mSelectedLeft - 2;
+ }
+ canvas.drawRect(mTempRect, mDrawPaint);
+
+ if (isLayoutRtl) {
+ mTempRect.left = mSelectedRight + 3;
+ mTempRect.right = mShowWeekNumber ? mWidth - mWidth / mNumCells : mWidth;
} else {
- mSelectedLeft = selectedPosition * mWidth / mNumCells;
+ mTempRect.left = mSelectedRight + 3;
+ mTempRect.right = mWidth;
}
- mSelectedRight = mSelectedLeft + mWidth / mNumCells;
+ canvas.drawRect(mTempRect, mDrawPaint);
}
- }
- @Override
- protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- mHeight = (mListView.getHeight() - mListView.getPaddingTop() - mListView
- .getPaddingBottom()) / mShownWeekCount;
- setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), mHeight);
+ /**
+ * Draws the week and month day numbers for this week.
+ *
+ * @param canvas The canvas to draw on
+ */
+ private void drawWeekNumbersAndDates(Canvas canvas) {
+ final float textHeight = mDrawPaint.getTextSize();
+ final int y = (int) ((mHeight + textHeight) / 2) - mWeekSeperatorLineWidth;
+ final int nDays = mNumCells;
+ final int divisor = 2 * nDays;
+
+ mDrawPaint.setTextAlign(Align.CENTER);
+ mDrawPaint.setTextSize(mDateTextSize);
+
+ int i = 0;
+
+ if (isLayoutRtl()) {
+ for (; i < nDays - 1; i++) {
+ mMonthNumDrawPaint.setColor(mFocusDay[i] ? mFocusedMonthDateColor
+ : mUnfocusedMonthDateColor);
+ int x = (2 * i + 1) * mWidth / divisor;
+ canvas.drawText(mDayNumbers[nDays - 1 - i], x, y, mMonthNumDrawPaint);
+ }
+ if (mShowWeekNumber) {
+ mDrawPaint.setColor(mWeekNumberColor);
+ int x = mWidth - mWidth / divisor;
+ canvas.drawText(mDayNumbers[0], x, y, mDrawPaint);
+ }
+ } else {
+ if (mShowWeekNumber) {
+ mDrawPaint.setColor(mWeekNumberColor);
+ int x = mWidth / divisor;
+ canvas.drawText(mDayNumbers[0], x, y, mDrawPaint);
+ i++;
+ }
+ for (; i < nDays; i++) {
+ mMonthNumDrawPaint.setColor(mFocusDay[i] ? mFocusedMonthDateColor
+ : mUnfocusedMonthDateColor);
+ int x = (2 * i + 1) * mWidth / divisor;
+ canvas.drawText(mDayNumbers[i], x, y, mMonthNumDrawPaint);
+ }
+ }
+ }
+
+ /**
+ * Draws a horizontal line for separating the weeks.
+ *
+ * @param canvas The canvas to draw on.
+ */
+ private void drawWeekSeparators(Canvas canvas) {
+ // If it is the topmost fully visible child do not draw separator line
+ int firstFullyVisiblePosition = mListView.getFirstVisiblePosition();
+ if (mListView.getChildAt(0).getTop() < 0) {
+ firstFullyVisiblePosition++;
+ }
+ if (firstFullyVisiblePosition == mWeek) {
+ return;
+ }
+ mDrawPaint.setColor(mWeekSeparatorLineColor);
+ mDrawPaint.setStrokeWidth(mWeekSeperatorLineWidth);
+ float startX;
+ float stopX;
+ if (isLayoutRtl()) {
+ startX = 0;
+ stopX = mShowWeekNumber ? mWidth - mWidth / mNumCells : mWidth;
+ } else {
+ startX = mShowWeekNumber ? mWidth / mNumCells : 0;
+ stopX = mWidth;
+ }
+ canvas.drawLine(startX, 0, stopX, 0, mDrawPaint);
+ }
+
+ /**
+ * Draws the selected date bars if this week has a selected day.
+ *
+ * @param canvas The canvas to draw on
+ */
+ private void drawSelectedDateVerticalBars(Canvas canvas) {
+ if (!mHasSelectedDay) {
+ return;
+ }
+ mSelectedDateVerticalBar.setBounds(
+ mSelectedLeft - mSelectedDateVerticalBarWidth / 2,
+ mWeekSeperatorLineWidth,
+ mSelectedLeft + mSelectedDateVerticalBarWidth / 2,
+ mHeight);
+ mSelectedDateVerticalBar.draw(canvas);
+ mSelectedDateVerticalBar.setBounds(
+ mSelectedRight - mSelectedDateVerticalBarWidth / 2,
+ mWeekSeperatorLineWidth,
+ mSelectedRight + mSelectedDateVerticalBarWidth / 2,
+ mHeight);
+ mSelectedDateVerticalBar.draw(canvas);
+ }
+
+ @Override
+ protected void onSizeChanged(int w, int h, int oldw, int oldh) {
+ mWidth = w;
+ updateSelectionPositions();
+ }
+
+ /**
+ * This calculates the positions for the selected day lines.
+ */
+ private void updateSelectionPositions() {
+ if (mHasSelectedDay) {
+ final boolean isLayoutRtl = isLayoutRtl();
+ int selectedPosition = mSelectedDay - mFirstDayOfWeek;
+ if (selectedPosition < 0) {
+ selectedPosition += 7;
+ }
+ if (mShowWeekNumber && !isLayoutRtl) {
+ selectedPosition++;
+ }
+ if (isLayoutRtl) {
+ mSelectedLeft = (mDaysPerWeek - 1 - selectedPosition) * mWidth / mNumCells;
+
+ } else {
+ mSelectedLeft = selectedPosition * mWidth / mNumCells;
+ }
+ mSelectedRight = mSelectedLeft + mWidth / mNumCells;
+ }
+ }
+
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ mHeight = (mListView.getHeight() - mListView.getPaddingTop() - mListView
+ .getPaddingBottom()) / mShownWeekCount;
+ setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), mHeight);
+ }
}
+
}
+
}
diff --git a/core/java/android/widget/CheckBox.java b/core/java/android/widget/CheckBox.java
index f1804f8..71438c9 100644
--- a/core/java/android/widget/CheckBox.java
+++ b/core/java/android/widget/CheckBox.java
@@ -64,8 +64,12 @@ public class CheckBox extends CompoundButton {
this(context, attrs, com.android.internal.R.attr.checkboxStyle);
}
- public CheckBox(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
+ public CheckBox(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
+ public CheckBox(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
}
@Override
diff --git a/core/java/android/widget/CheckedTextView.java b/core/java/android/widget/CheckedTextView.java
index 5c10a77..78b1b75 100644
--- a/core/java/android/widget/CheckedTextView.java
+++ b/core/java/android/widget/CheckedTextView.java
@@ -58,11 +58,15 @@ public class CheckedTextView extends TextView implements Checkable {
this(context, attrs, R.attr.checkedTextViewStyle);
}
- public CheckedTextView(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
+ public CheckedTextView(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
+ public CheckedTextView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
- TypedArray a = context.obtainStyledAttributes(attrs,
- R.styleable.CheckedTextView, defStyle, 0);
+ final TypedArray a = context.obtainStyledAttributes(
+ attrs, R.styleable.CheckedTextView, defStyleAttr, defStyleRes);
Drawable d = a.getDrawable(R.styleable.CheckedTextView_checkMark);
if (d != null) {
diff --git a/core/java/android/widget/Chronometer.java b/core/java/android/widget/Chronometer.java
index b7a126e..f8d482d 100644
--- a/core/java/android/widget/Chronometer.java
+++ b/core/java/android/widget/Chronometer.java
@@ -96,12 +96,15 @@ public class Chronometer extends TextView {
* Initialize with standard view layout information and style.
* Sets the base to the current time.
*/
- public Chronometer(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
+ public Chronometer(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
+ public Chronometer(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
- TypedArray a = context.obtainStyledAttributes(
- attrs,
- com.android.internal.R.styleable.Chronometer, defStyle, 0);
+ final TypedArray a = context.obtainStyledAttributes(
+ attrs, com.android.internal.R.styleable.Chronometer, defStyleAttr, defStyleRes);
setFormat(a.getString(com.android.internal.R.styleable.Chronometer_format));
a.recycle();
diff --git a/core/java/android/widget/CompoundButton.java b/core/java/android/widget/CompoundButton.java
index 082ff3d..bdb5046 100644
--- a/core/java/android/widget/CompoundButton.java
+++ b/core/java/android/widget/CompoundButton.java
@@ -64,12 +64,15 @@ public abstract class CompoundButton extends Button implements Checkable {
this(context, attrs, 0);
}
- public CompoundButton(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
+ public CompoundButton(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
+ public CompoundButton(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
- TypedArray a =
- context.obtainStyledAttributes(
- attrs, com.android.internal.R.styleable.CompoundButton, defStyle, 0);
+ final TypedArray a = context.obtainStyledAttributes(
+ attrs, com.android.internal.R.styleable.CompoundButton, defStyleAttr, defStyleRes);
Drawable d = a.getDrawable(com.android.internal.R.styleable.CompoundButton_button);
if (d != null) {
diff --git a/core/java/android/widget/DatePicker.java b/core/java/android/widget/DatePicker.java
index d03161e..265dbcd 100644
--- a/core/java/android/widget/DatePicker.java
+++ b/core/java/android/widget/DatePicker.java
@@ -24,7 +24,6 @@ import android.os.Parcel;
import android.os.Parcelable;
import android.text.TextUtils;
import android.text.InputType;
-import android.text.format.DateFormat;
import android.text.format.DateUtils;
import android.util.AttributeSet;
import android.util.Log;
@@ -76,53 +75,7 @@ public class DatePicker extends FrameLayout {
private static final String LOG_TAG = DatePicker.class.getSimpleName();
- private static final String DATE_FORMAT = "MM/dd/yyyy";
-
- private static final int DEFAULT_START_YEAR = 1900;
-
- private static final int DEFAULT_END_YEAR = 2100;
-
- private static final boolean DEFAULT_CALENDAR_VIEW_SHOWN = true;
-
- private static final boolean DEFAULT_SPINNERS_SHOWN = true;
-
- private static final boolean DEFAULT_ENABLED_STATE = true;
-
- private final LinearLayout mSpinners;
-
- private final NumberPicker mDaySpinner;
-
- private final NumberPicker mMonthSpinner;
-
- private final NumberPicker mYearSpinner;
-
- private final EditText mDaySpinnerInput;
-
- private final EditText mMonthSpinnerInput;
-
- private final EditText mYearSpinnerInput;
-
- private final CalendarView mCalendarView;
-
- private Locale mCurrentLocale;
-
- private OnDateChangedListener mOnDateChangedListener;
-
- private String[] mShortMonths;
-
- private final java.text.DateFormat mDateFormat = new SimpleDateFormat(DATE_FORMAT);
-
- private int mNumberOfMonths;
-
- private Calendar mTempDate;
-
- private Calendar mMinDate;
-
- private Calendar mMaxDate;
-
- private Calendar mCurrentDate;
-
- private boolean mIsEnabled = DEFAULT_ENABLED_STATE;
+ private DatePickerDelegate mDelegate;
/**
* The callback used to indicate the user changes\d the date.
@@ -149,147 +102,61 @@ public class DatePicker extends FrameLayout {
this(context, attrs, R.attr.datePickerStyle);
}
- public DatePicker(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
-
- // initialization based on locale
- setCurrentLocale(Locale.getDefault());
-
- TypedArray attributesArray = context.obtainStyledAttributes(attrs, R.styleable.DatePicker,
- defStyle, 0);
- boolean spinnersShown = attributesArray.getBoolean(R.styleable.DatePicker_spinnersShown,
- DEFAULT_SPINNERS_SHOWN);
- boolean calendarViewShown = attributesArray.getBoolean(
- R.styleable.DatePicker_calendarViewShown, DEFAULT_CALENDAR_VIEW_SHOWN);
- int startYear = attributesArray.getInt(R.styleable.DatePicker_startYear,
- DEFAULT_START_YEAR);
- int endYear = attributesArray.getInt(R.styleable.DatePicker_endYear, DEFAULT_END_YEAR);
- String minDate = attributesArray.getString(R.styleable.DatePicker_minDate);
- String maxDate = attributesArray.getString(R.styleable.DatePicker_maxDate);
- int layoutResourceId = attributesArray.getResourceId(R.styleable.DatePicker_internalLayout,
- R.layout.date_picker);
- attributesArray.recycle();
-
- LayoutInflater inflater = (LayoutInflater) context
- .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
- inflater.inflate(layoutResourceId, this, true);
-
- OnValueChangeListener onChangeListener = new OnValueChangeListener() {
- public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
- updateInputState();
- mTempDate.setTimeInMillis(mCurrentDate.getTimeInMillis());
- // take care of wrapping of days and months to update greater fields
- if (picker == mDaySpinner) {
- int maxDayOfMonth = mTempDate.getActualMaximum(Calendar.DAY_OF_MONTH);
- if (oldVal == maxDayOfMonth && newVal == 1) {
- mTempDate.add(Calendar.DAY_OF_MONTH, 1);
- } else if (oldVal == 1 && newVal == maxDayOfMonth) {
- mTempDate.add(Calendar.DAY_OF_MONTH, -1);
- } else {
- mTempDate.add(Calendar.DAY_OF_MONTH, newVal - oldVal);
- }
- } else if (picker == mMonthSpinner) {
- if (oldVal == 11 && newVal == 0) {
- mTempDate.add(Calendar.MONTH, 1);
- } else if (oldVal == 0 && newVal == 11) {
- mTempDate.add(Calendar.MONTH, -1);
- } else {
- mTempDate.add(Calendar.MONTH, newVal - oldVal);
- }
- } else if (picker == mYearSpinner) {
- mTempDate.set(Calendar.YEAR, newVal);
- } else {
- throw new IllegalArgumentException();
- }
- // now set the date to the adjusted one
- setDate(mTempDate.get(Calendar.YEAR), mTempDate.get(Calendar.MONTH),
- mTempDate.get(Calendar.DAY_OF_MONTH));
- updateSpinners();
- updateCalendarView();
- notifyDateChanged();
- }
- };
+ public DatePicker(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
- mSpinners = (LinearLayout) findViewById(R.id.pickers);
+ public DatePicker(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
- // calendar view day-picker
- mCalendarView = (CalendarView) findViewById(R.id.calendar_view);
- mCalendarView.setOnDateChangeListener(new CalendarView.OnDateChangeListener() {
- public void onSelectedDayChange(CalendarView view, int year, int month, int monthDay) {
- setDate(year, month, monthDay);
- updateSpinners();
- notifyDateChanged();
- }
- });
-
- // day
- mDaySpinner = (NumberPicker) findViewById(R.id.day);
- mDaySpinner.setFormatter(NumberPicker.getTwoDigitFormatter());
- mDaySpinner.setOnLongPressUpdateInterval(100);
- mDaySpinner.setOnValueChangedListener(onChangeListener);
- mDaySpinnerInput = (EditText) mDaySpinner.findViewById(R.id.numberpicker_input);
-
- // month
- mMonthSpinner = (NumberPicker) findViewById(R.id.month);
- mMonthSpinner.setMinValue(0);
- mMonthSpinner.setMaxValue(mNumberOfMonths - 1);
- mMonthSpinner.setDisplayedValues(mShortMonths);
- mMonthSpinner.setOnLongPressUpdateInterval(200);
- mMonthSpinner.setOnValueChangedListener(onChangeListener);
- mMonthSpinnerInput = (EditText) mMonthSpinner.findViewById(R.id.numberpicker_input);
-
- // year
- mYearSpinner = (NumberPicker) findViewById(R.id.year);
- mYearSpinner.setOnLongPressUpdateInterval(100);
- mYearSpinner.setOnValueChangedListener(onChangeListener);
- mYearSpinnerInput = (EditText) mYearSpinner.findViewById(R.id.numberpicker_input);
-
- // show only what the user required but make sure we
- // show something and the spinners have higher priority
- if (!spinnersShown && !calendarViewShown) {
- setSpinnersShown(true);
- } else {
- setSpinnersShown(spinnersShown);
- setCalendarViewShown(calendarViewShown);
- }
-
- // set the min date giving priority of the minDate over startYear
- mTempDate.clear();
- if (!TextUtils.isEmpty(minDate)) {
- if (!parseDate(minDate, mTempDate)) {
- mTempDate.set(startYear, 0, 1);
- }
- } else {
- mTempDate.set(startYear, 0, 1);
- }
- setMinDate(mTempDate.getTimeInMillis());
+ mDelegate = new LegacyDatePickerDelegate(this, context, attrs, defStyleAttr, defStyleRes);
+ }
- // set the max date giving priority of the maxDate over endYear
- mTempDate.clear();
- if (!TextUtils.isEmpty(maxDate)) {
- if (!parseDate(maxDate, mTempDate)) {
- mTempDate.set(endYear, 11, 31);
- }
- } else {
- mTempDate.set(endYear, 11, 31);
- }
- setMaxDate(mTempDate.getTimeInMillis());
+ /**
+ * Initialize the state. If the provided values designate an inconsistent
+ * date the values are normalized before updating the spinners.
+ *
+ * @param year The initial year.
+ * @param monthOfYear The initial month <strong>starting from zero</strong>.
+ * @param dayOfMonth The initial day of the month.
+ * @param onDateChangedListener How user is notified date is changed by
+ * user, can be null.
+ */
+ public void init(int year, int monthOfYear, int dayOfMonth,
+ OnDateChangedListener onDateChangedListener) {
+ mDelegate.init(year, monthOfYear, dayOfMonth, onDateChangedListener);
+ }
- // initialize to current date
- mCurrentDate.setTimeInMillis(System.currentTimeMillis());
- init(mCurrentDate.get(Calendar.YEAR), mCurrentDate.get(Calendar.MONTH), mCurrentDate
- .get(Calendar.DAY_OF_MONTH), null);
+ /**
+ * Updates the current date.
+ *
+ * @param year The year.
+ * @param month The month which is <strong>starting from zero</strong>.
+ * @param dayOfMonth The day of the month.
+ */
+ public void updateDate(int year, int month, int dayOfMonth) {
+ mDelegate.updateDate(year, month, dayOfMonth);
+ }
- // re-order the number spinners to match the current date format
- reorderSpinners();
+ /**
+ * @return The selected year.
+ */
+ public int getYear() {
+ return mDelegate.getYear();
+ }
- // accessibility
- setContentDescriptions();
+ /**
+ * @return The selected month.
+ */
+ public int getMonth() {
+ return mDelegate.getMonth();
+ }
- // If not explicitly specified this view is important for accessibility.
- if (getImportantForAccessibility() == IMPORTANT_FOR_ACCESSIBILITY_AUTO) {
- setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_YES);
- }
+ /**
+ * @return The selected day of month.
+ */
+ public int getDayOfMonth() {
+ return mDelegate.getDayOfMonth();
}
/**
@@ -303,7 +170,7 @@ public class DatePicker extends FrameLayout {
* @return The minimal supported date.
*/
public long getMinDate() {
- return mCalendarView.getMinDate();
+ return mDelegate.getMinDate();
}
/**
@@ -314,18 +181,7 @@ public class DatePicker extends FrameLayout {
* @param minDate The minimal supported date.
*/
public void setMinDate(long minDate) {
- mTempDate.setTimeInMillis(minDate);
- if (mTempDate.get(Calendar.YEAR) == mMinDate.get(Calendar.YEAR)
- && mTempDate.get(Calendar.DAY_OF_YEAR) != mMinDate.get(Calendar.DAY_OF_YEAR)) {
- return;
- }
- mMinDate.setTimeInMillis(minDate);
- mCalendarView.setMinDate(minDate);
- if (mCurrentDate.before(mMinDate)) {
- mCurrentDate.setTimeInMillis(mMinDate.getTimeInMillis());
- updateCalendarView();
- }
- updateSpinners();
+ mDelegate.setMinDate(minDate);
}
/**
@@ -339,7 +195,7 @@ public class DatePicker extends FrameLayout {
* @return The maximal supported date.
*/
public long getMaxDate() {
- return mCalendarView.getMaxDate();
+ return mDelegate.getMaxDate();
}
/**
@@ -350,70 +206,50 @@ public class DatePicker extends FrameLayout {
* @param maxDate The maximal supported date.
*/
public void setMaxDate(long maxDate) {
- mTempDate.setTimeInMillis(maxDate);
- if (mTempDate.get(Calendar.YEAR) == mMaxDate.get(Calendar.YEAR)
- && mTempDate.get(Calendar.DAY_OF_YEAR) != mMaxDate.get(Calendar.DAY_OF_YEAR)) {
- return;
- }
- mMaxDate.setTimeInMillis(maxDate);
- mCalendarView.setMaxDate(maxDate);
- if (mCurrentDate.after(mMaxDate)) {
- mCurrentDate.setTimeInMillis(mMaxDate.getTimeInMillis());
- updateCalendarView();
- }
- updateSpinners();
+ mDelegate.setMaxDate(maxDate);
}
@Override
public void setEnabled(boolean enabled) {
- if (mIsEnabled == enabled) {
+ if (mDelegate.isEnabled() == enabled) {
return;
}
super.setEnabled(enabled);
- mDaySpinner.setEnabled(enabled);
- mMonthSpinner.setEnabled(enabled);
- mYearSpinner.setEnabled(enabled);
- mCalendarView.setEnabled(enabled);
- mIsEnabled = enabled;
+ mDelegate.setEnabled(enabled);
}
@Override
public boolean isEnabled() {
- return mIsEnabled;
+ return mDelegate.isEnabled();
}
@Override
public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {
- onPopulateAccessibilityEvent(event);
- return true;
+ return mDelegate.dispatchPopulateAccessibilityEvent(event);
}
@Override
public void onPopulateAccessibilityEvent(AccessibilityEvent event) {
super.onPopulateAccessibilityEvent(event);
-
- final int flags = DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_SHOW_YEAR;
- String selectedDateUtterance = DateUtils.formatDateTime(mContext,
- mCurrentDate.getTimeInMillis(), flags);
- event.getText().add(selectedDateUtterance);
+ mDelegate.onPopulateAccessibilityEvent(event);
}
@Override
public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
super.onInitializeAccessibilityEvent(event);
- event.setClassName(DatePicker.class.getName());
+ mDelegate.onInitializeAccessibilityEvent(event);
}
@Override
public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
super.onInitializeAccessibilityNodeInfo(info);
- info.setClassName(DatePicker.class.getName());
+ mDelegate.onInitializeAccessibilityNodeInfo(info);
}
@Override
protected void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
- setCurrentLocale(newConfig.locale);
+ mDelegate.onConfigurationChanged(newConfig);
}
/**
@@ -423,7 +259,7 @@ public class DatePicker extends FrameLayout {
* @see #getCalendarView()
*/
public boolean getCalendarViewShown() {
- return (mCalendarView.getVisibility() == View.VISIBLE);
+ return mDelegate.getCalendarViewShown();
}
/**
@@ -433,7 +269,7 @@ public class DatePicker extends FrameLayout {
* @see #getCalendarViewShown()
*/
public CalendarView getCalendarView () {
- return mCalendarView;
+ return mDelegate.getCalendarView();
}
/**
@@ -442,7 +278,7 @@ public class DatePicker extends FrameLayout {
* @param shown True if the calendar view is to be shown.
*/
public void setCalendarViewShown(boolean shown) {
- mCalendarView.setVisibility(shown ? VISIBLE : GONE);
+ mDelegate.setCalendarViewShown(shown);
}
/**
@@ -451,7 +287,7 @@ public class DatePicker extends FrameLayout {
* @return True if the spinners are shown.
*/
public boolean getSpinnersShown() {
- return mSpinners.isShown();
+ return mDelegate.getSpinnersShown();
}
/**
@@ -460,330 +296,708 @@ public class DatePicker extends FrameLayout {
* @param shown True if the spinners are to be shown.
*/
public void setSpinnersShown(boolean shown) {
- mSpinners.setVisibility(shown ? VISIBLE : GONE);
+ mDelegate.setSpinnersShown(shown);
+ }
+
+ // Override so we are in complete control of save / restore for this widget.
+ @Override
+ protected void dispatchRestoreInstanceState(SparseArray<Parcelable> container) {
+ mDelegate.dispatchRestoreInstanceState(container);
+ }
+
+ @Override
+ protected Parcelable onSaveInstanceState() {
+ Parcelable superState = super.onSaveInstanceState();
+ return mDelegate.onSaveInstanceState(superState);
+ }
+
+ @Override
+ protected void onRestoreInstanceState(Parcelable state) {
+ SavedState ss = (SavedState) state;
+ super.onRestoreInstanceState(ss.getSuperState());
+ mDelegate.onRestoreInstanceState(ss);
}
/**
- * Sets the current locale.
- *
- * @param locale The current locale.
+ * A delegate interface that defined the public API of the DatePicker. Allows different
+ * DatePicker implementations. This would need to be implemented by the DatePicker delegates
+ * for the real behavior.
*/
- private void setCurrentLocale(Locale locale) {
- if (locale.equals(mCurrentLocale)) {
- return;
- }
+ interface DatePickerDelegate {
+ void init(int year, int monthOfYear, int dayOfMonth,
+ OnDateChangedListener onDateChangedListener);
- mCurrentLocale = locale;
+ void updateDate(int year, int month, int dayOfMonth);
- mTempDate = getCalendarForLocale(mTempDate, locale);
- mMinDate = getCalendarForLocale(mMinDate, locale);
- mMaxDate = getCalendarForLocale(mMaxDate, locale);
- mCurrentDate = getCalendarForLocale(mCurrentDate, locale);
+ int getYear();
+ int getMonth();
+ int getDayOfMonth();
- mNumberOfMonths = mTempDate.getActualMaximum(Calendar.MONTH) + 1;
- mShortMonths = new DateFormatSymbols().getShortMonths();
+ void setMinDate(long minDate);
+ long getMinDate();
- if (usingNumericMonths()) {
- // We're in a locale where a date should either be all-numeric, or all-text.
- // All-text would require custom NumberPicker formatters for day and year.
- mShortMonths = new String[mNumberOfMonths];
- for (int i = 0; i < mNumberOfMonths; ++i) {
- mShortMonths[i] = String.format("%d", i + 1);
- }
- }
- }
+ void setMaxDate(long maxDate);
+ long getMaxDate();
- /**
- * Tests whether the current locale is one where there are no real month names,
- * such as Chinese, Japanese, or Korean locales.
- */
- private boolean usingNumericMonths() {
- return Character.isDigit(mShortMonths[Calendar.JANUARY].charAt(0));
+ void setEnabled(boolean enabled);
+ boolean isEnabled();
+
+ CalendarView getCalendarView ();
+
+ void setCalendarViewShown(boolean shown);
+ boolean getCalendarViewShown();
+
+ void setSpinnersShown(boolean shown);
+ boolean getSpinnersShown();
+
+ void onConfigurationChanged(Configuration newConfig);
+
+ void dispatchRestoreInstanceState(SparseArray<Parcelable> container);
+ Parcelable onSaveInstanceState(Parcelable superState);
+ void onRestoreInstanceState(Parcelable state);
+
+ boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event);
+ void onPopulateAccessibilityEvent(AccessibilityEvent event);
+ void onInitializeAccessibilityEvent(AccessibilityEvent event);
+ void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info);
}
/**
- * Gets a calendar for locale bootstrapped with the value of a given calendar.
- *
- * @param oldCalendar The old calendar.
- * @param locale The locale.
+ * An abstract class which can be used as a start for DatePicker implementations
*/
- private Calendar getCalendarForLocale(Calendar oldCalendar, Locale locale) {
- if (oldCalendar == null) {
- return Calendar.getInstance(locale);
- } else {
- final long currentTimeMillis = oldCalendar.getTimeInMillis();
- Calendar newCalendar = Calendar.getInstance(locale);
- newCalendar.setTimeInMillis(currentTimeMillis);
- return newCalendar;
+ abstract static class AbstractTimePickerDelegate implements DatePickerDelegate {
+ // The delegator
+ protected DatePicker mDelegator;
+
+ // The context
+ protected Context mContext;
+
+ // The current locale
+ protected Locale mCurrentLocale;
+
+ // Callbacks
+ protected OnDateChangedListener mOnDateChangedListener;
+
+ public AbstractTimePickerDelegate(DatePicker delegator, Context context) {
+ mDelegator = delegator;
+ mContext = context;
+
+ // initialization based on locale
+ setCurrentLocale(Locale.getDefault());
}
- }
- /**
- * Reorders the spinners according to the date format that is
- * explicitly set by the user and if no such is set fall back
- * to the current locale's default format.
- */
- private void reorderSpinners() {
- mSpinners.removeAllViews();
- // We use numeric spinners for year and day, but textual months. Ask icu4c what
- // order the user's locale uses for that combination. http://b/7207103.
- String pattern = ICU.getBestDateTimePattern("yyyyMMMdd", Locale.getDefault().toString());
- char[] order = ICU.getDateFormatOrder(pattern);
- final int spinnerCount = order.length;
- for (int i = 0; i < spinnerCount; i++) {
- switch (order[i]) {
- case 'd':
- mSpinners.addView(mDaySpinner);
- setImeOptions(mDaySpinner, spinnerCount, i);
- break;
- case 'M':
- mSpinners.addView(mMonthSpinner);
- setImeOptions(mMonthSpinner, spinnerCount, i);
- break;
- case 'y':
- mSpinners.addView(mYearSpinner);
- setImeOptions(mYearSpinner, spinnerCount, i);
- break;
- default:
- throw new IllegalArgumentException(Arrays.toString(order));
+ protected void setCurrentLocale(Locale locale) {
+ if (locale.equals(mCurrentLocale)) {
+ return;
}
+ mCurrentLocale = locale;
}
}
/**
- * Updates the current date.
- *
- * @param year The year.
- * @param month The month which is <strong>starting from zero</strong>.
- * @param dayOfMonth The day of the month.
+ * A delegate implementing the basic DatePicker
*/
- public void updateDate(int year, int month, int dayOfMonth) {
- if (!isNewDate(year, month, dayOfMonth)) {
- return;
+ private static class LegacyDatePickerDelegate extends AbstractTimePickerDelegate {
+
+ private static final String DATE_FORMAT = "MM/dd/yyyy";
+
+ private static final int DEFAULT_START_YEAR = 1900;
+
+ private static final int DEFAULT_END_YEAR = 2100;
+
+ private static final boolean DEFAULT_CALENDAR_VIEW_SHOWN = true;
+
+ private static final boolean DEFAULT_SPINNERS_SHOWN = true;
+
+ private static final boolean DEFAULT_ENABLED_STATE = true;
+
+ private final LinearLayout mSpinners;
+
+ private final NumberPicker mDaySpinner;
+
+ private final NumberPicker mMonthSpinner;
+
+ private final NumberPicker mYearSpinner;
+
+ private final EditText mDaySpinnerInput;
+
+ private final EditText mMonthSpinnerInput;
+
+ private final EditText mYearSpinnerInput;
+
+ private final CalendarView mCalendarView;
+
+ private String[] mShortMonths;
+
+ private final java.text.DateFormat mDateFormat = new SimpleDateFormat(DATE_FORMAT);
+
+ private int mNumberOfMonths;
+
+ private Calendar mTempDate;
+
+ private Calendar mMinDate;
+
+ private Calendar mMaxDate;
+
+ private Calendar mCurrentDate;
+
+ private boolean mIsEnabled = DEFAULT_ENABLED_STATE;
+
+ LegacyDatePickerDelegate(DatePicker delegator, Context context, AttributeSet attrs,
+ int defStyleAttr, int defStyleRes) {
+ super(delegator, context);
+
+ mDelegator = delegator;
+ mContext = context;
+
+ // initialization based on locale
+ setCurrentLocale(Locale.getDefault());
+
+ final TypedArray attributesArray = context.obtainStyledAttributes(attrs,
+ R.styleable.DatePicker, defStyleAttr, defStyleRes);
+ boolean spinnersShown = attributesArray.getBoolean(R.styleable.DatePicker_spinnersShown,
+ DEFAULT_SPINNERS_SHOWN);
+ boolean calendarViewShown = attributesArray.getBoolean(
+ R.styleable.DatePicker_calendarViewShown, DEFAULT_CALENDAR_VIEW_SHOWN);
+ int startYear = attributesArray.getInt(R.styleable.DatePicker_startYear,
+ DEFAULT_START_YEAR);
+ int endYear = attributesArray.getInt(R.styleable.DatePicker_endYear, DEFAULT_END_YEAR);
+ String minDate = attributesArray.getString(R.styleable.DatePicker_minDate);
+ String maxDate = attributesArray.getString(R.styleable.DatePicker_maxDate);
+ int layoutResourceId = attributesArray.getResourceId(
+ R.styleable.DatePicker_internalLayout, R.layout.date_picker);
+ attributesArray.recycle();
+
+ LayoutInflater inflater = (LayoutInflater) context
+ .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+ inflater.inflate(layoutResourceId, mDelegator, true);
+
+ OnValueChangeListener onChangeListener = new OnValueChangeListener() {
+ public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
+ updateInputState();
+ mTempDate.setTimeInMillis(mCurrentDate.getTimeInMillis());
+ // take care of wrapping of days and months to update greater fields
+ if (picker == mDaySpinner) {
+ int maxDayOfMonth = mTempDate.getActualMaximum(Calendar.DAY_OF_MONTH);
+ if (oldVal == maxDayOfMonth && newVal == 1) {
+ mTempDate.add(Calendar.DAY_OF_MONTH, 1);
+ } else if (oldVal == 1 && newVal == maxDayOfMonth) {
+ mTempDate.add(Calendar.DAY_OF_MONTH, -1);
+ } else {
+ mTempDate.add(Calendar.DAY_OF_MONTH, newVal - oldVal);
+ }
+ } else if (picker == mMonthSpinner) {
+ if (oldVal == 11 && newVal == 0) {
+ mTempDate.add(Calendar.MONTH, 1);
+ } else if (oldVal == 0 && newVal == 11) {
+ mTempDate.add(Calendar.MONTH, -1);
+ } else {
+ mTempDate.add(Calendar.MONTH, newVal - oldVal);
+ }
+ } else if (picker == mYearSpinner) {
+ mTempDate.set(Calendar.YEAR, newVal);
+ } else {
+ throw new IllegalArgumentException();
+ }
+ // now set the date to the adjusted one
+ setDate(mTempDate.get(Calendar.YEAR), mTempDate.get(Calendar.MONTH),
+ mTempDate.get(Calendar.DAY_OF_MONTH));
+ updateSpinners();
+ updateCalendarView();
+ notifyDateChanged();
+ }
+ };
+
+ mSpinners = (LinearLayout) mDelegator.findViewById(R.id.pickers);
+
+ // calendar view day-picker
+ mCalendarView = (CalendarView) mDelegator.findViewById(R.id.calendar_view);
+ mCalendarView.setOnDateChangeListener(new CalendarView.OnDateChangeListener() {
+ public void onSelectedDayChange(CalendarView view, int year, int month, int monthDay) {
+ setDate(year, month, monthDay);
+ updateSpinners();
+ notifyDateChanged();
+ }
+ });
+
+ // day
+ mDaySpinner = (NumberPicker) mDelegator.findViewById(R.id.day);
+ mDaySpinner.setFormatter(NumberPicker.getTwoDigitFormatter());
+ mDaySpinner.setOnLongPressUpdateInterval(100);
+ mDaySpinner.setOnValueChangedListener(onChangeListener);
+ mDaySpinnerInput = (EditText) mDaySpinner.findViewById(R.id.numberpicker_input);
+
+ // month
+ mMonthSpinner = (NumberPicker) mDelegator.findViewById(R.id.month);
+ mMonthSpinner.setMinValue(0);
+ mMonthSpinner.setMaxValue(mNumberOfMonths - 1);
+ mMonthSpinner.setDisplayedValues(mShortMonths);
+ mMonthSpinner.setOnLongPressUpdateInterval(200);
+ mMonthSpinner.setOnValueChangedListener(onChangeListener);
+ mMonthSpinnerInput = (EditText) mMonthSpinner.findViewById(R.id.numberpicker_input);
+
+ // year
+ mYearSpinner = (NumberPicker) mDelegator.findViewById(R.id.year);
+ mYearSpinner.setOnLongPressUpdateInterval(100);
+ mYearSpinner.setOnValueChangedListener(onChangeListener);
+ mYearSpinnerInput = (EditText) mYearSpinner.findViewById(R.id.numberpicker_input);
+
+ // show only what the user required but make sure we
+ // show something and the spinners have higher priority
+ if (!spinnersShown && !calendarViewShown) {
+ setSpinnersShown(true);
+ } else {
+ setSpinnersShown(spinnersShown);
+ setCalendarViewShown(calendarViewShown);
+ }
+
+ // set the min date giving priority of the minDate over startYear
+ mTempDate.clear();
+ if (!TextUtils.isEmpty(minDate)) {
+ if (!parseDate(minDate, mTempDate)) {
+ mTempDate.set(startYear, 0, 1);
+ }
+ } else {
+ mTempDate.set(startYear, 0, 1);
+ }
+ setMinDate(mTempDate.getTimeInMillis());
+
+ // set the max date giving priority of the maxDate over endYear
+ mTempDate.clear();
+ if (!TextUtils.isEmpty(maxDate)) {
+ if (!parseDate(maxDate, mTempDate)) {
+ mTempDate.set(endYear, 11, 31);
+ }
+ } else {
+ mTempDate.set(endYear, 11, 31);
+ }
+ setMaxDate(mTempDate.getTimeInMillis());
+
+ // initialize to current date
+ mCurrentDate.setTimeInMillis(System.currentTimeMillis());
+ init(mCurrentDate.get(Calendar.YEAR), mCurrentDate.get(Calendar.MONTH), mCurrentDate
+ .get(Calendar.DAY_OF_MONTH), null);
+
+ // re-order the number spinners to match the current date format
+ reorderSpinners();
+
+ // accessibility
+ setContentDescriptions();
+
+ // If not explicitly specified this view is important for accessibility.
+ if (mDelegator.getImportantForAccessibility() == IMPORTANT_FOR_ACCESSIBILITY_AUTO) {
+ mDelegator.setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_YES);
+ }
}
- setDate(year, month, dayOfMonth);
- updateSpinners();
- updateCalendarView();
- notifyDateChanged();
- }
- // Override so we are in complete control of save / restore for this widget.
- @Override
- protected void dispatchRestoreInstanceState(SparseArray<Parcelable> container) {
- dispatchThawSelfOnly(container);
- }
+ @Override
+ public void init(int year, int monthOfYear, int dayOfMonth,
+ OnDateChangedListener onDateChangedListener) {
+ setDate(year, monthOfYear, dayOfMonth);
+ updateSpinners();
+ updateCalendarView();
+ mOnDateChangedListener = onDateChangedListener;
+ }
- @Override
- protected Parcelable onSaveInstanceState() {
- Parcelable superState = super.onSaveInstanceState();
- return new SavedState(superState, getYear(), getMonth(), getDayOfMonth());
- }
+ @Override
+ public void updateDate(int year, int month, int dayOfMonth) {
+ if (!isNewDate(year, month, dayOfMonth)) {
+ return;
+ }
+ setDate(year, month, dayOfMonth);
+ updateSpinners();
+ updateCalendarView();
+ notifyDateChanged();
+ }
- @Override
- protected void onRestoreInstanceState(Parcelable state) {
- SavedState ss = (SavedState) state;
- super.onRestoreInstanceState(ss.getSuperState());
- setDate(ss.mYear, ss.mMonth, ss.mDay);
- updateSpinners();
- updateCalendarView();
- }
+ @Override
+ public int getYear() {
+ return mCurrentDate.get(Calendar.YEAR);
+ }
- /**
- * Initialize the state. If the provided values designate an inconsistent
- * date the values are normalized before updating the spinners.
- *
- * @param year The initial year.
- * @param monthOfYear The initial month <strong>starting from zero</strong>.
- * @param dayOfMonth The initial day of the month.
- * @param onDateChangedListener How user is notified date is changed by
- * user, can be null.
- */
- public void init(int year, int monthOfYear, int dayOfMonth,
- OnDateChangedListener onDateChangedListener) {
- setDate(year, monthOfYear, dayOfMonth);
- updateSpinners();
- updateCalendarView();
- mOnDateChangedListener = onDateChangedListener;
- }
+ @Override
+ public int getMonth() {
+ return mCurrentDate.get(Calendar.MONTH);
+ }
- /**
- * Parses the given <code>date</code> and in case of success sets the result
- * to the <code>outDate</code>.
- *
- * @return True if the date was parsed.
- */
- private boolean parseDate(String date, Calendar outDate) {
- try {
- outDate.setTime(mDateFormat.parse(date));
+ @Override
+ public int getDayOfMonth() {
+ return mCurrentDate.get(Calendar.DAY_OF_MONTH);
+ }
+
+ @Override
+ public void setMinDate(long minDate) {
+ mTempDate.setTimeInMillis(minDate);
+ if (mTempDate.get(Calendar.YEAR) == mMinDate.get(Calendar.YEAR)
+ && mTempDate.get(Calendar.DAY_OF_YEAR) != mMinDate.get(Calendar.DAY_OF_YEAR)) {
+ return;
+ }
+ mMinDate.setTimeInMillis(minDate);
+ mCalendarView.setMinDate(minDate);
+ if (mCurrentDate.before(mMinDate)) {
+ mCurrentDate.setTimeInMillis(mMinDate.getTimeInMillis());
+ updateCalendarView();
+ }
+ updateSpinners();
+ }
+
+ @Override
+ public long getMinDate() {
+ return mCalendarView.getMinDate();
+ }
+
+ @Override
+ public void setMaxDate(long maxDate) {
+ mTempDate.setTimeInMillis(maxDate);
+ if (mTempDate.get(Calendar.YEAR) == mMaxDate.get(Calendar.YEAR)
+ && mTempDate.get(Calendar.DAY_OF_YEAR) != mMaxDate.get(Calendar.DAY_OF_YEAR)) {
+ return;
+ }
+ mMaxDate.setTimeInMillis(maxDate);
+ mCalendarView.setMaxDate(maxDate);
+ if (mCurrentDate.after(mMaxDate)) {
+ mCurrentDate.setTimeInMillis(mMaxDate.getTimeInMillis());
+ updateCalendarView();
+ }
+ updateSpinners();
+ }
+
+ @Override
+ public long getMaxDate() {
+ return mCalendarView.getMaxDate();
+ }
+
+ @Override
+ public void setEnabled(boolean enabled) {
+ mDaySpinner.setEnabled(enabled);
+ mMonthSpinner.setEnabled(enabled);
+ mYearSpinner.setEnabled(enabled);
+ mCalendarView.setEnabled(enabled);
+ mIsEnabled = enabled;
+ }
+
+ @Override
+ public boolean isEnabled() {
+ return mIsEnabled;
+ }
+
+ @Override
+ public CalendarView getCalendarView() {
+ return mCalendarView;
+ }
+
+ @Override
+ public void setCalendarViewShown(boolean shown) {
+ mCalendarView.setVisibility(shown ? VISIBLE : GONE);
+ }
+
+ @Override
+ public boolean getCalendarViewShown() {
+ return (mCalendarView.getVisibility() == View.VISIBLE);
+ }
+
+ @Override
+ public void setSpinnersShown(boolean shown) {
+ mSpinners.setVisibility(shown ? VISIBLE : GONE);
+ }
+
+ @Override
+ public boolean getSpinnersShown() {
+ return mSpinners.isShown();
+ }
+
+ @Override
+ public void onConfigurationChanged(Configuration newConfig) {
+ setCurrentLocale(newConfig.locale);
+ }
+
+ @Override
+ public void dispatchRestoreInstanceState(SparseArray<Parcelable> container) {
+ mDelegator.dispatchThawSelfOnly(container);
+ }
+
+ @Override
+ public Parcelable onSaveInstanceState(Parcelable superState) {
+ return new SavedState(superState, getYear(), getMonth(), getDayOfMonth());
+ }
+
+ @Override
+ public void onRestoreInstanceState(Parcelable state) {
+ SavedState ss = (SavedState) state;
+ setDate(ss.mYear, ss.mMonth, ss.mDay);
+ updateSpinners();
+ updateCalendarView();
+ }
+
+ @Override
+ public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {
+ onPopulateAccessibilityEvent(event);
return true;
- } catch (ParseException e) {
- Log.w(LOG_TAG, "Date: " + date + " not in format: " + DATE_FORMAT);
- return false;
- }
- }
-
- private boolean isNewDate(int year, int month, int dayOfMonth) {
- return (mCurrentDate.get(Calendar.YEAR) != year
- || mCurrentDate.get(Calendar.MONTH) != dayOfMonth
- || mCurrentDate.get(Calendar.DAY_OF_MONTH) != month);
- }
-
- private void setDate(int year, int month, int dayOfMonth) {
- mCurrentDate.set(year, month, dayOfMonth);
- if (mCurrentDate.before(mMinDate)) {
- mCurrentDate.setTimeInMillis(mMinDate.getTimeInMillis());
- } else if (mCurrentDate.after(mMaxDate)) {
- mCurrentDate.setTimeInMillis(mMaxDate.getTimeInMillis());
- }
- }
-
- private void updateSpinners() {
- // set the spinner ranges respecting the min and max dates
- if (mCurrentDate.equals(mMinDate)) {
- mDaySpinner.setMinValue(mCurrentDate.get(Calendar.DAY_OF_MONTH));
- mDaySpinner.setMaxValue(mCurrentDate.getActualMaximum(Calendar.DAY_OF_MONTH));
- mDaySpinner.setWrapSelectorWheel(false);
- mMonthSpinner.setDisplayedValues(null);
- mMonthSpinner.setMinValue(mCurrentDate.get(Calendar.MONTH));
- mMonthSpinner.setMaxValue(mCurrentDate.getActualMaximum(Calendar.MONTH));
- mMonthSpinner.setWrapSelectorWheel(false);
- } else if (mCurrentDate.equals(mMaxDate)) {
- mDaySpinner.setMinValue(mCurrentDate.getActualMinimum(Calendar.DAY_OF_MONTH));
- mDaySpinner.setMaxValue(mCurrentDate.get(Calendar.DAY_OF_MONTH));
- mDaySpinner.setWrapSelectorWheel(false);
- mMonthSpinner.setDisplayedValues(null);
- mMonthSpinner.setMinValue(mCurrentDate.getActualMinimum(Calendar.MONTH));
- mMonthSpinner.setMaxValue(mCurrentDate.get(Calendar.MONTH));
- mMonthSpinner.setWrapSelectorWheel(false);
- } else {
- mDaySpinner.setMinValue(1);
- mDaySpinner.setMaxValue(mCurrentDate.getActualMaximum(Calendar.DAY_OF_MONTH));
- mDaySpinner.setWrapSelectorWheel(true);
- mMonthSpinner.setDisplayedValues(null);
- mMonthSpinner.setMinValue(0);
- mMonthSpinner.setMaxValue(11);
- mMonthSpinner.setWrapSelectorWheel(true);
}
- // make sure the month names are a zero based array
- // with the months in the month spinner
- String[] displayedValues = Arrays.copyOfRange(mShortMonths,
- mMonthSpinner.getMinValue(), mMonthSpinner.getMaxValue() + 1);
- mMonthSpinner.setDisplayedValues(displayedValues);
+ @Override
+ public void onPopulateAccessibilityEvent(AccessibilityEvent event) {
+ final int flags = DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_SHOW_YEAR;
+ String selectedDateUtterance = DateUtils.formatDateTime(mContext,
+ mCurrentDate.getTimeInMillis(), flags);
+ event.getText().add(selectedDateUtterance);
+ }
- // year spinner range does not change based on the current date
- mYearSpinner.setMinValue(mMinDate.get(Calendar.YEAR));
- mYearSpinner.setMaxValue(mMaxDate.get(Calendar.YEAR));
- mYearSpinner.setWrapSelectorWheel(false);
+ @Override
+ public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
+ event.setClassName(DatePicker.class.getName());
+ }
- // set the spinner values
- mYearSpinner.setValue(mCurrentDate.get(Calendar.YEAR));
- mMonthSpinner.setValue(mCurrentDate.get(Calendar.MONTH));
- mDaySpinner.setValue(mCurrentDate.get(Calendar.DAY_OF_MONTH));
+ @Override
+ public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
+ info.setClassName(DatePicker.class.getName());
+ }
- if (usingNumericMonths()) {
- mMonthSpinnerInput.setRawInputType(InputType.TYPE_CLASS_NUMBER);
+ /**
+ * Sets the current locale.
+ *
+ * @param locale The current locale.
+ */
+ @Override
+ protected void setCurrentLocale(Locale locale) {
+ super.setCurrentLocale(locale);
+
+ mTempDate = getCalendarForLocale(mTempDate, locale);
+ mMinDate = getCalendarForLocale(mMinDate, locale);
+ mMaxDate = getCalendarForLocale(mMaxDate, locale);
+ mCurrentDate = getCalendarForLocale(mCurrentDate, locale);
+
+ mNumberOfMonths = mTempDate.getActualMaximum(Calendar.MONTH) + 1;
+ mShortMonths = new DateFormatSymbols().getShortMonths();
+
+ if (usingNumericMonths()) {
+ // We're in a locale where a date should either be all-numeric, or all-text.
+ // All-text would require custom NumberPicker formatters for day and year.
+ mShortMonths = new String[mNumberOfMonths];
+ for (int i = 0; i < mNumberOfMonths; ++i) {
+ mShortMonths[i] = String.format("%d", i + 1);
+ }
+ }
}
- }
- /**
- * Updates the calendar view with the current date.
- */
- private void updateCalendarView() {
- mCalendarView.setDate(mCurrentDate.getTimeInMillis(), false, false);
- }
+ /**
+ * Tests whether the current locale is one where there are no real month names,
+ * such as Chinese, Japanese, or Korean locales.
+ */
+ private boolean usingNumericMonths() {
+ return Character.isDigit(mShortMonths[Calendar.JANUARY].charAt(0));
+ }
- /**
- * @return The selected year.
- */
- public int getYear() {
- return mCurrentDate.get(Calendar.YEAR);
- }
+ /**
+ * Gets a calendar for locale bootstrapped with the value of a given calendar.
+ *
+ * @param oldCalendar The old calendar.
+ * @param locale The locale.
+ */
+ private Calendar getCalendarForLocale(Calendar oldCalendar, Locale locale) {
+ if (oldCalendar == null) {
+ return Calendar.getInstance(locale);
+ } else {
+ final long currentTimeMillis = oldCalendar.getTimeInMillis();
+ Calendar newCalendar = Calendar.getInstance(locale);
+ newCalendar.setTimeInMillis(currentTimeMillis);
+ return newCalendar;
+ }
+ }
- /**
- * @return The selected month.
- */
- public int getMonth() {
- return mCurrentDate.get(Calendar.MONTH);
- }
+ /**
+ * Reorders the spinners according to the date format that is
+ * explicitly set by the user and if no such is set fall back
+ * to the current locale's default format.
+ */
+ private void reorderSpinners() {
+ mSpinners.removeAllViews();
+ // We use numeric spinners for year and day, but textual months. Ask icu4c what
+ // order the user's locale uses for that combination. http://b/7207103.
+ String pattern = ICU.getBestDateTimePattern("yyyyMMMdd",
+ Locale.getDefault().toString());
+ char[] order = ICU.getDateFormatOrder(pattern);
+ final int spinnerCount = order.length;
+ for (int i = 0; i < spinnerCount; i++) {
+ switch (order[i]) {
+ case 'd':
+ mSpinners.addView(mDaySpinner);
+ setImeOptions(mDaySpinner, spinnerCount, i);
+ break;
+ case 'M':
+ mSpinners.addView(mMonthSpinner);
+ setImeOptions(mMonthSpinner, spinnerCount, i);
+ break;
+ case 'y':
+ mSpinners.addView(mYearSpinner);
+ setImeOptions(mYearSpinner, spinnerCount, i);
+ break;
+ default:
+ throw new IllegalArgumentException(Arrays.toString(order));
+ }
+ }
+ }
- /**
- * @return The selected day of month.
- */
- public int getDayOfMonth() {
- return mCurrentDate.get(Calendar.DAY_OF_MONTH);
- }
+ /**
+ * Parses the given <code>date</code> and in case of success sets the result
+ * to the <code>outDate</code>.
+ *
+ * @return True if the date was parsed.
+ */
+ private boolean parseDate(String date, Calendar outDate) {
+ try {
+ outDate.setTime(mDateFormat.parse(date));
+ return true;
+ } catch (ParseException e) {
+ Log.w(LOG_TAG, "Date: " + date + " not in format: " + DATE_FORMAT);
+ return false;
+ }
+ }
- /**
- * Notifies the listener, if such, for a change in the selected date.
- */
- private void notifyDateChanged() {
- sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_SELECTED);
- if (mOnDateChangedListener != null) {
- mOnDateChangedListener.onDateChanged(this, getYear(), getMonth(), getDayOfMonth());
+ private boolean isNewDate(int year, int month, int dayOfMonth) {
+ return (mCurrentDate.get(Calendar.YEAR) != year
+ || mCurrentDate.get(Calendar.MONTH) != dayOfMonth
+ || mCurrentDate.get(Calendar.DAY_OF_MONTH) != month);
}
- }
- /**
- * Sets the IME options for a spinner based on its ordering.
- *
- * @param spinner The spinner.
- * @param spinnerCount The total spinner count.
- * @param spinnerIndex The index of the given spinner.
- */
- private void setImeOptions(NumberPicker spinner, int spinnerCount, int spinnerIndex) {
- final int imeOptions;
- if (spinnerIndex < spinnerCount - 1) {
- imeOptions = EditorInfo.IME_ACTION_NEXT;
- } else {
- imeOptions = EditorInfo.IME_ACTION_DONE;
- }
- TextView input = (TextView) spinner.findViewById(R.id.numberpicker_input);
- input.setImeOptions(imeOptions);
- }
-
- private void setContentDescriptions() {
- // Day
- trySetContentDescription(mDaySpinner, R.id.increment,
- R.string.date_picker_increment_day_button);
- trySetContentDescription(mDaySpinner, R.id.decrement,
- R.string.date_picker_decrement_day_button);
- // Month
- trySetContentDescription(mMonthSpinner, R.id.increment,
- R.string.date_picker_increment_month_button);
- trySetContentDescription(mMonthSpinner, R.id.decrement,
- R.string.date_picker_decrement_month_button);
- // Year
- trySetContentDescription(mYearSpinner, R.id.increment,
- R.string.date_picker_increment_year_button);
- trySetContentDescription(mYearSpinner, R.id.decrement,
- R.string.date_picker_decrement_year_button);
- }
-
- private void trySetContentDescription(View root, int viewId, int contDescResId) {
- View target = root.findViewById(viewId);
- if (target != null) {
- target.setContentDescription(mContext.getString(contDescResId));
- }
- }
-
- private void updateInputState() {
- // Make sure that if the user changes the value and the IME is active
- // for one of the inputs if this widget, the IME is closed. If the user
- // changed the value via the IME and there is a next input the IME will
- // be shown, otherwise the user chose another means of changing the
- // value and having the IME up makes no sense.
- InputMethodManager inputMethodManager = InputMethodManager.peekInstance();
- if (inputMethodManager != null) {
- if (inputMethodManager.isActive(mYearSpinnerInput)) {
- mYearSpinnerInput.clearFocus();
- inputMethodManager.hideSoftInputFromWindow(getWindowToken(), 0);
- } else if (inputMethodManager.isActive(mMonthSpinnerInput)) {
- mMonthSpinnerInput.clearFocus();
- inputMethodManager.hideSoftInputFromWindow(getWindowToken(), 0);
- } else if (inputMethodManager.isActive(mDaySpinnerInput)) {
- mDaySpinnerInput.clearFocus();
- inputMethodManager.hideSoftInputFromWindow(getWindowToken(), 0);
+ private void setDate(int year, int month, int dayOfMonth) {
+ mCurrentDate.set(year, month, dayOfMonth);
+ if (mCurrentDate.before(mMinDate)) {
+ mCurrentDate.setTimeInMillis(mMinDate.getTimeInMillis());
+ } else if (mCurrentDate.after(mMaxDate)) {
+ mCurrentDate.setTimeInMillis(mMaxDate.getTimeInMillis());
+ }
+ }
+
+ private void updateSpinners() {
+ // set the spinner ranges respecting the min and max dates
+ if (mCurrentDate.equals(mMinDate)) {
+ mDaySpinner.setMinValue(mCurrentDate.get(Calendar.DAY_OF_MONTH));
+ mDaySpinner.setMaxValue(mCurrentDate.getActualMaximum(Calendar.DAY_OF_MONTH));
+ mDaySpinner.setWrapSelectorWheel(false);
+ mMonthSpinner.setDisplayedValues(null);
+ mMonthSpinner.setMinValue(mCurrentDate.get(Calendar.MONTH));
+ mMonthSpinner.setMaxValue(mCurrentDate.getActualMaximum(Calendar.MONTH));
+ mMonthSpinner.setWrapSelectorWheel(false);
+ } else if (mCurrentDate.equals(mMaxDate)) {
+ mDaySpinner.setMinValue(mCurrentDate.getActualMinimum(Calendar.DAY_OF_MONTH));
+ mDaySpinner.setMaxValue(mCurrentDate.get(Calendar.DAY_OF_MONTH));
+ mDaySpinner.setWrapSelectorWheel(false);
+ mMonthSpinner.setDisplayedValues(null);
+ mMonthSpinner.setMinValue(mCurrentDate.getActualMinimum(Calendar.MONTH));
+ mMonthSpinner.setMaxValue(mCurrentDate.get(Calendar.MONTH));
+ mMonthSpinner.setWrapSelectorWheel(false);
+ } else {
+ mDaySpinner.setMinValue(1);
+ mDaySpinner.setMaxValue(mCurrentDate.getActualMaximum(Calendar.DAY_OF_MONTH));
+ mDaySpinner.setWrapSelectorWheel(true);
+ mMonthSpinner.setDisplayedValues(null);
+ mMonthSpinner.setMinValue(0);
+ mMonthSpinner.setMaxValue(11);
+ mMonthSpinner.setWrapSelectorWheel(true);
+ }
+
+ // make sure the month names are a zero based array
+ // with the months in the month spinner
+ String[] displayedValues = Arrays.copyOfRange(mShortMonths,
+ mMonthSpinner.getMinValue(), mMonthSpinner.getMaxValue() + 1);
+ mMonthSpinner.setDisplayedValues(displayedValues);
+
+ // year spinner range does not change based on the current date
+ mYearSpinner.setMinValue(mMinDate.get(Calendar.YEAR));
+ mYearSpinner.setMaxValue(mMaxDate.get(Calendar.YEAR));
+ mYearSpinner.setWrapSelectorWheel(false);
+
+ // set the spinner values
+ mYearSpinner.setValue(mCurrentDate.get(Calendar.YEAR));
+ mMonthSpinner.setValue(mCurrentDate.get(Calendar.MONTH));
+ mDaySpinner.setValue(mCurrentDate.get(Calendar.DAY_OF_MONTH));
+
+ if (usingNumericMonths()) {
+ mMonthSpinnerInput.setRawInputType(InputType.TYPE_CLASS_NUMBER);
+ }
+ }
+
+ /**
+ * Updates the calendar view with the current date.
+ */
+ private void updateCalendarView() {
+ mCalendarView.setDate(mCurrentDate.getTimeInMillis(), false, false);
+ }
+
+
+ /**
+ * Notifies the listener, if such, for a change in the selected date.
+ */
+ private void notifyDateChanged() {
+ mDelegator.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_SELECTED);
+ if (mOnDateChangedListener != null) {
+ mOnDateChangedListener.onDateChanged(mDelegator, getYear(), getMonth(),
+ getDayOfMonth());
+ }
+ }
+
+ /**
+ * Sets the IME options for a spinner based on its ordering.
+ *
+ * @param spinner The spinner.
+ * @param spinnerCount The total spinner count.
+ * @param spinnerIndex The index of the given spinner.
+ */
+ private void setImeOptions(NumberPicker spinner, int spinnerCount, int spinnerIndex) {
+ final int imeOptions;
+ if (spinnerIndex < spinnerCount - 1) {
+ imeOptions = EditorInfo.IME_ACTION_NEXT;
+ } else {
+ imeOptions = EditorInfo.IME_ACTION_DONE;
+ }
+ TextView input = (TextView) spinner.findViewById(R.id.numberpicker_input);
+ input.setImeOptions(imeOptions);
+ }
+
+ private void setContentDescriptions() {
+ // Day
+ trySetContentDescription(mDaySpinner, R.id.increment,
+ R.string.date_picker_increment_day_button);
+ trySetContentDescription(mDaySpinner, R.id.decrement,
+ R.string.date_picker_decrement_day_button);
+ // Month
+ trySetContentDescription(mMonthSpinner, R.id.increment,
+ R.string.date_picker_increment_month_button);
+ trySetContentDescription(mMonthSpinner, R.id.decrement,
+ R.string.date_picker_decrement_month_button);
+ // Year
+ trySetContentDescription(mYearSpinner, R.id.increment,
+ R.string.date_picker_increment_year_button);
+ trySetContentDescription(mYearSpinner, R.id.decrement,
+ R.string.date_picker_decrement_year_button);
+ }
+
+ private void trySetContentDescription(View root, int viewId, int contDescResId) {
+ View target = root.findViewById(viewId);
+ if (target != null) {
+ target.setContentDescription(mContext.getString(contDescResId));
+ }
+ }
+
+ private void updateInputState() {
+ // Make sure that if the user changes the value and the IME is active
+ // for one of the inputs if this widget, the IME is closed. If the user
+ // changed the value via the IME and there is a next input the IME will
+ // be shown, otherwise the user chose another means of changing the
+ // value and having the IME up makes no sense.
+ InputMethodManager inputMethodManager = InputMethodManager.peekInstance();
+ if (inputMethodManager != null) {
+ if (inputMethodManager.isActive(mYearSpinnerInput)) {
+ mYearSpinnerInput.clearFocus();
+ inputMethodManager.hideSoftInputFromWindow(mDelegator.getWindowToken(), 0);
+ } else if (inputMethodManager.isActive(mMonthSpinnerInput)) {
+ mMonthSpinnerInput.clearFocus();
+ inputMethodManager.hideSoftInputFromWindow(mDelegator.getWindowToken(), 0);
+ } else if (inputMethodManager.isActive(mDaySpinnerInput)) {
+ mDaySpinnerInput.clearFocus();
+ inputMethodManager.hideSoftInputFromWindow(mDelegator.getWindowToken(), 0);
+ }
}
}
}
diff --git a/core/java/android/widget/EditText.java b/core/java/android/widget/EditText.java
index 57e51c2..3a7cc87 100644
--- a/core/java/android/widget/EditText.java
+++ b/core/java/android/widget/EditText.java
@@ -56,8 +56,12 @@ public class EditText extends TextView {
this(context, attrs, com.android.internal.R.attr.editTextStyle);
}
- public EditText(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
+ public EditText(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
+ public EditText(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
}
@Override
diff --git a/core/java/android/widget/Editor.java b/core/java/android/widget/Editor.java
index 9dab7b4..aa3a25d 100644
--- a/core/java/android/widget/Editor.java
+++ b/core/java/android/widget/Editor.java
@@ -2321,8 +2321,8 @@ public class Editor {
private final HashMap<SuggestionSpan, Integer> mSpansLengths;
private class CustomPopupWindow extends PopupWindow {
- public CustomPopupWindow(Context context, int defStyle) {
- super(context, null, defStyle);
+ public CustomPopupWindow(Context context, int defStyleAttr) {
+ super(context, null, defStyleAttr);
}
@Override
diff --git a/core/java/android/widget/ExpandableListView.java b/core/java/android/widget/ExpandableListView.java
index 7b81aa8..70089e0 100644
--- a/core/java/android/widget/ExpandableListView.java
+++ b/core/java/android/widget/ExpandableListView.java
@@ -227,12 +227,16 @@ public class ExpandableListView extends ListView {
this(context, attrs, com.android.internal.R.attr.expandableListViewStyle);
}
- public ExpandableListView(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
+ public ExpandableListView(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
+ public ExpandableListView(
+ Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
- TypedArray a =
- context.obtainStyledAttributes(attrs,
- com.android.internal.R.styleable.ExpandableListView, defStyle, 0);
+ final TypedArray a = context.obtainStyledAttributes(attrs,
+ com.android.internal.R.styleable.ExpandableListView, defStyleAttr, defStyleRes);
mGroupIndicator = a.getDrawable(
com.android.internal.R.styleable.ExpandableListView_groupIndicator);
diff --git a/core/java/android/widget/FastScroller.java b/core/java/android/widget/FastScroller.java
index 01ac8fd..6d38c8f 100644
--- a/core/java/android/widget/FastScroller.java
+++ b/core/java/android/widget/FastScroller.java
@@ -24,7 +24,6 @@ import android.animation.ObjectAnimator;
import android.animation.PropertyValuesHolder;
import android.content.Context;
import android.content.res.ColorStateList;
-import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
@@ -43,7 +42,7 @@ import android.view.ViewConfiguration;
import android.view.ViewGroup.LayoutParams;
import android.view.ViewGroupOverlay;
import android.widget.AbsListView.OnScrollListener;
-import com.android.internal.R;
+import android.widget.ImageView.ScaleType;
/**
* Helper class for AbsListView to draw and control the Fast Scroll thumb
@@ -76,24 +75,6 @@ class FastScroller {
/** Scroll thumb and preview being dragged by user. */
private static final int STATE_DRAGGING = 2;
- /** Styleable attributes. */
- private static final int[] ATTRS = new int[] {
- android.R.attr.fastScrollTextColor,
- android.R.attr.fastScrollThumbDrawable,
- android.R.attr.fastScrollTrackDrawable,
- android.R.attr.fastScrollPreviewBackgroundLeft,
- android.R.attr.fastScrollPreviewBackgroundRight,
- android.R.attr.fastScrollOverlayPosition
- };
-
- // Styleable attribute indices.
- private static final int TEXT_COLOR = 0;
- private static final int THUMB_DRAWABLE = 1;
- private static final int TRACK_DRAWABLE = 2;
- private static final int PREVIEW_BACKGROUND_LEFT = 3;
- private static final int PREVIEW_BACKGROUND_RIGHT = 4;
- private static final int OVERLAY_POSITION = 5;
-
// Positions for preview image and text.
private static final int OVERLAY_FLOATING = 0;
private static final int OVERLAY_AT_THUMB = 1;
@@ -115,7 +96,7 @@ class FastScroller {
private final TextView mSecondaryText;
private final ImageView mThumbImage;
private final ImageView mTrackImage;
- private final ImageView mPreviewImage;
+ private final View mPreviewImage;
/**
* Preview image resource IDs for left- and right-aligned layouts. See
@@ -127,13 +108,25 @@ class FastScroller {
* Padding in pixels around the preview text. Applied as layout margins to
* the preview text and padding to the preview image.
*/
- private final int mPreviewPadding;
+ private int mPreviewPadding;
+
+ private int mPreviewMinWidth;
+ private int mPreviewMinHeight;
+ private int mThumbMinWidth;
+ private int mThumbMinHeight;
+
+ /** Theme-specified text size. Used only if text appearance is not set. */
+ private float mTextSize;
- /** Whether there is a track image to display. */
- private final boolean mHasTrackImage;
+ /** Theme-specified text color. Used only if text appearance is not set. */
+ private ColorStateList mTextColor;
+
+ private Drawable mThumbDrawable;
+ private Drawable mTrackDrawable;
+ private int mTextAppearance;
/** Total width of decorations. */
- private final int mWidth;
+ private int mWidth;
/** Set containing decoration transition animations. */
private AnimatorSet mDecorAnimation;
@@ -245,89 +238,143 @@ class FastScroller {
}
};
- public FastScroller(AbsListView listView) {
+ public FastScroller(AbsListView listView, int styleResId) {
mList = listView;
- mOverlay = listView.getOverlay();
final Context context = listView.getContext();
mScaledTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
+ mScrollBarStyle = listView.getScrollBarStyle();
+
+ mScrollCompleted = true;
+ mState = STATE_VISIBLE;
+ mMatchDragPosition =
+ context.getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.HONEYCOMB;
+
+ mTrackImage = new ImageView(context);
+ mTrackImage.setScaleType(ScaleType.FIT_XY);
+ mThumbImage = new ImageView(context);
+ mThumbImage.setScaleType(ScaleType.FIT_XY);
+ mPreviewImage = new View(context);
+ mPreviewImage.setAlpha(0f);
+
+ mPrimaryText = createPreviewTextView(context);
+ mSecondaryText = createPreviewTextView(context);
+
+ setStyle(styleResId);
- final Resources res = context.getResources();
- final TypedArray ta = context.getTheme().obtainStyledAttributes(ATTRS);
+ final ViewGroupOverlay overlay = listView.getOverlay();
+ mOverlay = overlay;
+ overlay.add(mTrackImage);
+ overlay.add(mThumbImage);
+ overlay.add(mPreviewImage);
+ overlay.add(mPrimaryText);
+ overlay.add(mSecondaryText);
- final ImageView trackImage = new ImageView(context);
- mTrackImage = trackImage;
+ getSectionsFromIndexer();
+ updateLongList(listView.getChildCount(), listView.getCount());
+ setScrollbarPosition(listView.getVerticalScrollbarPosition());
+ postAutoHide();
+ }
+ private void updateAppearance() {
+ final Context context = mList.getContext();
int width = 0;
// Add track to overlay if it has an image.
- final Drawable trackDrawable = ta.getDrawable(TRACK_DRAWABLE);
- if (trackDrawable != null) {
- mHasTrackImage = true;
- trackImage.setBackground(trackDrawable);
- mOverlay.add(trackImage);
- width = Math.max(width, trackDrawable.getIntrinsicWidth());
- } else {
- mHasTrackImage = false;
+ mTrackImage.setImageDrawable(mTrackDrawable);
+ if (mTrackDrawable != null) {
+ width = Math.max(width, mTrackDrawable.getIntrinsicWidth());
}
- final ImageView thumbImage = new ImageView(context);
- mThumbImage = thumbImage;
-
// Add thumb to overlay if it has an image.
- final Drawable thumbDrawable = ta.getDrawable(THUMB_DRAWABLE);
- if (thumbDrawable != null) {
- thumbImage.setImageDrawable(thumbDrawable);
- mOverlay.add(thumbImage);
- width = Math.max(width, thumbDrawable.getIntrinsicWidth());
+ mThumbImage.setImageDrawable(mThumbDrawable);
+ mThumbImage.setMinimumWidth(mThumbMinWidth);
+ mThumbImage.setMinimumHeight(mThumbMinHeight);
+ if (mThumbDrawable != null) {
+ width = Math.max(width, mThumbDrawable.getIntrinsicWidth());
}
- // If necessary, apply minimum thumb width and height.
- if (thumbDrawable.getIntrinsicWidth() <= 0 || thumbDrawable.getIntrinsicHeight() <= 0) {
- final int minWidth = res.getDimensionPixelSize(R.dimen.fastscroll_thumb_width);
- thumbImage.setMinimumWidth(minWidth);
- thumbImage.setMinimumHeight(
- res.getDimensionPixelSize(R.dimen.fastscroll_thumb_height));
- width = Math.max(width, minWidth);
- }
+ // Account for minimum thumb width.
+ mWidth = Math.max(width, mThumbMinWidth);
- mWidth = width;
+ mPreviewImage.setMinimumWidth(mPreviewMinWidth);
+ mPreviewImage.setMinimumHeight(mPreviewMinHeight);
- final int previewSize = res.getDimensionPixelSize(R.dimen.fastscroll_overlay_size);
- mPreviewImage = new ImageView(context);
- mPreviewImage.setMinimumWidth(previewSize);
- mPreviewImage.setMinimumHeight(previewSize);
- mPreviewImage.setAlpha(0f);
- mOverlay.add(mPreviewImage);
+ if (mTextAppearance != 0) {
+ mPrimaryText.setTextAppearance(context, mTextAppearance);
+ mSecondaryText.setTextAppearance(context, mTextAppearance);
+ }
- mPreviewPadding = res.getDimensionPixelSize(R.dimen.fastscroll_overlay_padding);
+ if (mTextColor != null) {
+ mPrimaryText.setTextColor(mTextColor);
+ mSecondaryText.setTextColor(mTextColor);
+ }
+
+ if (mTextSize > 0) {
+ mPrimaryText.setTextSize(TypedValue.COMPLEX_UNIT_PX, mTextSize);
+ mSecondaryText.setTextSize(TypedValue.COMPLEX_UNIT_PX, mTextSize);
+ }
- final int textMinSize = Math.max(0, previewSize - mPreviewPadding);
- mPrimaryText = createPreviewTextView(context, ta);
+ final int textMinSize = Math.max(0, mPreviewMinHeight);
mPrimaryText.setMinimumWidth(textMinSize);
mPrimaryText.setMinimumHeight(textMinSize);
- mOverlay.add(mPrimaryText);
- mSecondaryText = createPreviewTextView(context, ta);
mSecondaryText.setMinimumWidth(textMinSize);
mSecondaryText.setMinimumHeight(textMinSize);
- mOverlay.add(mSecondaryText);
- mPreviewResId[PREVIEW_LEFT] = ta.getResourceId(PREVIEW_BACKGROUND_LEFT, 0);
- mPreviewResId[PREVIEW_RIGHT] = ta.getResourceId(PREVIEW_BACKGROUND_RIGHT, 0);
- mOverlayPosition = ta.getInt(OVERLAY_POSITION, OVERLAY_FLOATING);
- ta.recycle();
+ refreshDrawablePressedState();
+ }
- mScrollBarStyle = listView.getScrollBarStyle();
- mScrollCompleted = true;
- mState = STATE_VISIBLE;
- mMatchDragPosition = context.getApplicationInfo().targetSdkVersion
- >= Build.VERSION_CODES.HONEYCOMB;
+ public void setStyle(int resId) {
+ final Context context = mList.getContext();
+ final TypedArray ta = context.obtainStyledAttributes(null,
+ com.android.internal.R.styleable.FastScroll, android.R.attr.fastScrollStyle, resId);
+ final int N = ta.getIndexCount();
+ for (int i = 0; i < N; i++) {
+ final int index = ta.getIndex(i);
+ switch (index) {
+ case com.android.internal.R.styleable.FastScroll_position:
+ mOverlayPosition = ta.getInt(index, OVERLAY_FLOATING);
+ break;
+ case com.android.internal.R.styleable.FastScroll_backgroundLeft:
+ mPreviewResId[PREVIEW_LEFT] = ta.getResourceId(index, 0);
+ break;
+ case com.android.internal.R.styleable.FastScroll_backgroundRight:
+ mPreviewResId[PREVIEW_RIGHT] = ta.getResourceId(index, 0);
+ break;
+ case com.android.internal.R.styleable.FastScroll_thumbDrawable:
+ mThumbDrawable = ta.getDrawable(index);
+ break;
+ case com.android.internal.R.styleable.FastScroll_trackDrawable:
+ mTrackDrawable = ta.getDrawable(index);
+ break;
+ case com.android.internal.R.styleable.FastScroll_textAppearance:
+ mTextAppearance = ta.getResourceId(index, 0);
+ break;
+ case com.android.internal.R.styleable.FastScroll_textColor:
+ mTextColor = ta.getColorStateList(index);
+ break;
+ case com.android.internal.R.styleable.FastScroll_textSize:
+ mTextSize = ta.getDimensionPixelSize(index, 0);
+ break;
+ case com.android.internal.R.styleable.FastScroll_minWidth:
+ mPreviewMinWidth = ta.getDimensionPixelSize(index, 0);
+ break;
+ case com.android.internal.R.styleable.FastScroll_minHeight:
+ mPreviewMinHeight = ta.getDimensionPixelSize(index, 0);
+ break;
+ case com.android.internal.R.styleable.FastScroll_thumbMinWidth:
+ mThumbMinWidth = ta.getDimensionPixelSize(index, 0);
+ break;
+ case com.android.internal.R.styleable.FastScroll_thumbMinHeight:
+ mThumbMinHeight = ta.getDimensionPixelSize(index, 0);
+ break;
+ case com.android.internal.R.styleable.FastScroll_padding:
+ mPreviewPadding = ta.getDimensionPixelSize(index, 0);
+ break;
+ }
+ }
- getSectionsFromIndexer();
- refreshDrawablePressedState();
- updateLongList(listView.getChildCount(), listView.getCount());
- setScrollbarPosition(mList.getVerticalScrollbarPosition());
- postAutoHide();
+ updateAppearance();
}
/**
@@ -469,17 +516,11 @@ class FastScroller {
/**
* Creates a view into which preview text can be placed.
*/
- private TextView createPreviewTextView(Context context, TypedArray ta) {
+ private TextView createPreviewTextView(Context context) {
final LayoutParams params = new LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
- final Resources res = context.getResources();
- final int minSize = res.getDimensionPixelSize(R.dimen.fastscroll_overlay_size);
- final ColorStateList textColor = ta.getColorStateList(TEXT_COLOR);
- final float textSize = res.getDimensionPixelSize(R.dimen.fastscroll_overlay_text_size);
final TextView textView = new TextView(context);
textView.setLayoutParams(params);
- textView.setTextColor(textColor);
- textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize);
textView.setSingleLine(true);
textView.setEllipsize(TruncateAt.MIDDLE);
textView.setGravity(Gravity.CENTER);
@@ -603,7 +644,7 @@ class FastScroller {
view.measure(widthMeasureSpec, heightMeasureSpec);
// Align to the left or right.
- final int width = view.getMeasuredWidth();
+ final int width = Math.min(adjMaxWidth, view.getMeasuredWidth());
final int left;
final int right;
if (mLayoutFromRight) {
@@ -1020,7 +1061,7 @@ class FastScroller {
}
final Rect bounds = mTempBounds;
- final ImageView preview = mPreviewImage;
+ final View preview = mPreviewImage;
final TextView showing;
final TextView target;
if (mShowingPrimary) {
@@ -1046,10 +1087,10 @@ class FastScroller {
hideShowing.addListener(mSwitchPrimaryListener);
// Apply preview image padding and animate bounds, if necessary.
- bounds.left -= mPreviewImage.getPaddingLeft();
- bounds.top -= mPreviewImage.getPaddingTop();
- bounds.right += mPreviewImage.getPaddingRight();
- bounds.bottom += mPreviewImage.getPaddingBottom();
+ bounds.left -= preview.getPaddingLeft();
+ bounds.top -= preview.getPaddingTop();
+ bounds.right += preview.getPaddingRight();
+ bounds.bottom += preview.getPaddingBottom();
final Animator resizePreview = animateBounds(preview, bounds);
resizePreview.setDuration(DURATION_RESIZE);
@@ -1097,8 +1138,8 @@ class FastScroller {
final int top = container.top;
final int bottom = container.bottom;
- final ImageView trackImage = mTrackImage;
- final ImageView thumbImage = mThumbImage;
+ final View trackImage = mTrackImage;
+ final View thumbImage = mThumbImage;
final float min = trackImage.getTop();
final float max = trackImage.getBottom();
final float offset = min;
@@ -1109,7 +1150,7 @@ class FastScroller {
final float previewPos = mOverlayPosition == OVERLAY_AT_THUMB ? thumbMiddle : 0;
// Center the preview on the thumb, constrained to the list bounds.
- final ImageView previewImage = mPreviewImage;
+ final View previewImage = mPreviewImage;
final float previewHalfHeight = previewImage.getHeight() / 2f;
final float minP = top + previewHalfHeight;
final float maxP = bottom - previewHalfHeight;
@@ -1122,11 +1163,7 @@ class FastScroller {
}
private float getPosFromMotionEvent(float y) {
- final Rect container = mContainerRect;
- final int top = container.top;
- final int bottom = container.bottom;
-
- final ImageView trackImage = mTrackImage;
+ final View trackImage = mTrackImage;
final float min = trackImage.getTop();
final float max = trackImage.getBottom();
final float offset = min;
@@ -1393,7 +1430,7 @@ class FastScroller {
* @return Whether the coordinate is inside the scroller's activation area.
*/
private boolean isPointInside(float x, float y) {
- return isPointInsideX(x) && (mHasTrackImage || isPointInsideY(y));
+ return isPointInsideX(x) && (mTrackDrawable != null || isPointInsideY(y));
}
private boolean isPointInsideX(float x) {
diff --git a/core/java/android/widget/FrameLayout.java b/core/java/android/widget/FrameLayout.java
index d9d4ad7..b029328 100644
--- a/core/java/android/widget/FrameLayout.java
+++ b/core/java/android/widget/FrameLayout.java
@@ -97,11 +97,15 @@ public class FrameLayout extends ViewGroup {
this(context, attrs, 0);
}
- public FrameLayout(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
+ public FrameLayout(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
+ public FrameLayout(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
- TypedArray a = context.obtainStyledAttributes(attrs, com.android.internal.R.styleable.FrameLayout,
- defStyle, 0);
+ final TypedArray a = context.obtainStyledAttributes(
+ attrs, com.android.internal.R.styleable.FrameLayout, defStyleAttr, defStyleRes);
mForegroundGravity = a.getInt(
com.android.internal.R.styleable.FrameLayout_foregroundGravity, mForegroundGravity);
diff --git a/core/java/android/widget/Gallery.java b/core/java/android/widget/Gallery.java
index 78ba6e0..f7c839f 100644
--- a/core/java/android/widget/Gallery.java
+++ b/core/java/android/widget/Gallery.java
@@ -196,14 +196,18 @@ public class Gallery extends AbsSpinner implements GestureDetector.OnGestureList
this(context, attrs, R.attr.galleryStyle);
}
- public Gallery(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
+ public Gallery(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
+ public Gallery(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
mGestureDetector = new GestureDetector(context, this);
mGestureDetector.setIsLongpressEnabled(true);
-
- TypedArray a = context.obtainStyledAttributes(
- attrs, com.android.internal.R.styleable.Gallery, defStyle, 0);
+
+ final TypedArray a = context.obtainStyledAttributes(
+ attrs, com.android.internal.R.styleable.Gallery, defStyleAttr, defStyleRes);
int index = a.getInt(com.android.internal.R.styleable.Gallery_gravity, -1);
if (index >= 0) {
diff --git a/core/java/android/widget/GridLayout.java b/core/java/android/widget/GridLayout.java
index 54cc3f4..8511601 100644
--- a/core/java/android/widget/GridLayout.java
+++ b/core/java/android/widget/GridLayout.java
@@ -16,6 +16,7 @@
package android.widget;
+import android.annotation.IntDef;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
@@ -35,6 +36,8 @@ import android.view.accessibility.AccessibilityNodeInfo;
import android.widget.RemoteViews.RemoteView;
import com.android.internal.R;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;
@@ -165,6 +168,11 @@ public class GridLayout extends ViewGroup {
// Public constants
+ /** @hide */
+ @IntDef({HORIZONTAL, VERTICAL})
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface Orientation {}
+
/**
* The horizontal orientation.
*/
@@ -186,6 +194,11 @@ public class GridLayout extends ViewGroup {
*/
public static final int UNDEFINED = Integer.MIN_VALUE;
+ /** @hide */
+ @IntDef({ALIGN_BOUNDS, ALIGN_MARGINS})
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface AlignmentMode {}
+
/**
* This constant is an {@link #setAlignmentMode(int) alignmentMode}.
* When the {@code alignmentMode} is set to {@link #ALIGN_BOUNDS}, alignment
@@ -262,13 +275,23 @@ public class GridLayout extends ViewGroup {
// Constructors
- /**
- * {@inheritDoc}
- */
- public GridLayout(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
+ public GridLayout(Context context) {
+ this(context, null);
+ }
+
+ public GridLayout(Context context, AttributeSet attrs) {
+ this(context, attrs, 0);
+ }
+
+ public GridLayout(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
+ public GridLayout(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
mDefaultGap = context.getResources().getDimensionPixelOffset(R.dimen.default_gap);
- TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.GridLayout);
+ final TypedArray a = context.obtainStyledAttributes(
+ attrs, R.styleable.GridLayout, defStyleAttr, defStyleRes);
try {
setRowCount(a.getInt(ROW_COUNT, DEFAULT_COUNT));
setColumnCount(a.getInt(COLUMN_COUNT, DEFAULT_COUNT));
@@ -282,21 +305,6 @@ public class GridLayout extends ViewGroup {
}
}
- /**
- * {@inheritDoc}
- */
- public GridLayout(Context context, AttributeSet attrs) {
- this(context, attrs, 0);
- }
-
- /**
- * {@inheritDoc}
- */
- public GridLayout(Context context) {
- //noinspection NullableProblems
- this(context, null);
- }
-
// Implementation
/**
@@ -308,6 +316,7 @@ public class GridLayout extends ViewGroup {
*
* @attr ref android.R.styleable#GridLayout_orientation
*/
+ @Orientation
public int getOrientation() {
return mOrientation;
}
@@ -348,7 +357,7 @@ public class GridLayout extends ViewGroup {
*
* @attr ref android.R.styleable#GridLayout_orientation
*/
- public void setOrientation(int orientation) {
+ public void setOrientation(@Orientation int orientation) {
if (this.mOrientation != orientation) {
this.mOrientation = orientation;
invalidateStructure();
@@ -479,6 +488,7 @@ public class GridLayout extends ViewGroup {
*
* @attr ref android.R.styleable#GridLayout_alignmentMode
*/
+ @AlignmentMode
public int getAlignmentMode() {
return mAlignmentMode;
}
@@ -498,7 +508,7 @@ public class GridLayout extends ViewGroup {
*
* @attr ref android.R.styleable#GridLayout_alignmentMode
*/
- public void setAlignmentMode(int alignmentMode) {
+ public void setAlignmentMode(@AlignmentMode int alignmentMode) {
this.mAlignmentMode = alignmentMode;
requestLayout();
}
diff --git a/core/java/android/widget/GridView.java b/core/java/android/widget/GridView.java
index 15daf83..4f74108 100644
--- a/core/java/android/widget/GridView.java
+++ b/core/java/android/widget/GridView.java
@@ -16,12 +16,14 @@
package android.widget;
+import android.annotation.IntDef;
import android.content.Context;
import android.content.Intent;
import android.content.res.TypedArray;
import android.graphics.Rect;
import android.os.Trace;
import android.util.AttributeSet;
+import android.util.MathUtils;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.SoundEffectConstants;
@@ -36,6 +38,9 @@ import android.view.animation.GridLayoutAnimationController;
import android.widget.AbsListView.LayoutParams;
import android.widget.RemoteViews.RemoteView;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
/**
* A view that shows items in two-dimensional scrolling grid. The items in the
@@ -53,6 +58,11 @@ import android.widget.RemoteViews.RemoteView;
*/
@RemoteView
public class GridView extends AbsListView {
+ /** @hide */
+ @IntDef({NO_STRETCH, STRETCH_SPACING, STRETCH_COLUMN_WIDTH, STRETCH_SPACING_UNIFORM})
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface StretchMode {}
+
/**
* Disables stretching.
*
@@ -110,11 +120,15 @@ public class GridView extends AbsListView {
this(context, attrs, com.android.internal.R.attr.gridViewStyle);
}
- public GridView(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
+ public GridView(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
+ public GridView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
- TypedArray a = context.obtainStyledAttributes(attrs,
- com.android.internal.R.styleable.GridView, defStyle, 0);
+ final TypedArray a = context.obtainStyledAttributes(
+ attrs, com.android.internal.R.styleable.GridView, defStyleAttr, defStyleRes);
int hSpacing = a.getDimensionPixelOffset(
com.android.internal.R.styleable.GridView_horizontalSpacing, 0);
@@ -1202,6 +1216,24 @@ public class GridView extends AbsListView {
setSelectedPositionInt(mNextSelectedPosition);
+ // Remember which child, if any, had accessibility focus.
+ final int accessibilityFocusPosition;
+ final View accessFocusedChild = getAccessibilityFocusedChild();
+ if (accessFocusedChild != null) {
+ accessibilityFocusPosition = getPositionForView(accessFocusedChild);
+ accessFocusedChild.setHasTransientState(true);
+ } else {
+ accessibilityFocusPosition = INVALID_POSITION;
+ }
+
+ // Ensure the child containing focus, if any, has transient state.
+ // If the list data hasn't changed, or if the adapter has stable
+ // IDs, this will maintain focus.
+ final View focusedChild = getFocusedChild();
+ if (focusedChild != null) {
+ focusedChild.setHasTransientState(true);
+ }
+
// Pull all children into the RecycleBin.
// These views will be reused if possible
final int firstPosition = mFirstPosition;
@@ -1216,7 +1248,6 @@ public class GridView extends AbsListView {
}
// Clear out old views
- //removeAllViewsInLayout();
detachAllViewsFromParent();
recycleBin.removeSkippedScrap();
@@ -1287,6 +1318,27 @@ public class GridView extends AbsListView {
mSelectorRect.setEmpty();
}
+ if (accessFocusedChild != null) {
+ accessFocusedChild.setHasTransientState(false);
+
+ // If we failed to maintain accessibility focus on the previous
+ // view, attempt to restore it to the previous position.
+ if (!accessFocusedChild.isAccessibilityFocused()
+ && accessibilityFocusPosition != INVALID_POSITION) {
+ // Bound the position within the visible children.
+ final int position = MathUtils.constrain(
+ accessibilityFocusPosition - mFirstPosition, 0, getChildCount() - 1);
+ final View restoreView = getChildAt(position);
+ if (restoreView != null) {
+ restoreView.requestAccessibilityFocus();
+ }
+ }
+ }
+
+ if (focusedChild != null) {
+ focusedChild.setHasTransientState(false);
+ }
+
mLayoutMode = LAYOUT_NORMAL;
mDataChanged = false;
if (mPositionScrollAfterLayout != null) {
@@ -2056,13 +2108,14 @@ public class GridView extends AbsListView {
*
* @attr ref android.R.styleable#GridView_stretchMode
*/
- public void setStretchMode(int stretchMode) {
+ public void setStretchMode(@StretchMode int stretchMode) {
if (stretchMode != mStretchMode) {
mStretchMode = stretchMode;
requestLayoutIfNecessary();
}
}
+ @StretchMode
public int getStretchMode() {
return mStretchMode;
}
diff --git a/core/java/android/widget/HorizontalScrollView.java b/core/java/android/widget/HorizontalScrollView.java
index dab0962..25d4f42 100644
--- a/core/java/android/widget/HorizontalScrollView.java
+++ b/core/java/android/widget/HorizontalScrollView.java
@@ -146,12 +146,17 @@ public class HorizontalScrollView extends FrameLayout {
this(context, attrs, com.android.internal.R.attr.horizontalScrollViewStyle);
}
- public HorizontalScrollView(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
+ public HorizontalScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
+ public HorizontalScrollView(
+ Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
initScrollView();
- TypedArray a = context.obtainStyledAttributes(attrs,
- android.R.styleable.HorizontalScrollView, defStyle, 0);
+ final TypedArray a = context.obtainStyledAttributes(
+ attrs, android.R.styleable.HorizontalScrollView, defStyleAttr, defStyleRes);
setFillViewport(a.getBoolean(android.R.styleable.HorizontalScrollView_fillViewport, false));
diff --git a/core/java/android/widget/ImageButton.java b/core/java/android/widget/ImageButton.java
index 379354c..207f505 100644
--- a/core/java/android/widget/ImageButton.java
+++ b/core/java/android/widget/ImageButton.java
@@ -83,8 +83,12 @@ public class ImageButton extends ImageView {
this(context, attrs, com.android.internal.R.attr.imageButtonStyle);
}
- public ImageButton(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
+ public ImageButton(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
+ public ImageButton(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
setFocusable(true);
}
diff --git a/core/java/android/widget/ImageView.java b/core/java/android/widget/ImageView.java
index 9e35a23..cfd7e4a 100644
--- a/core/java/android/widget/ImageView.java
+++ b/core/java/android/widget/ImageView.java
@@ -119,12 +119,17 @@ public class ImageView extends View {
this(context, attrs, 0);
}
- public ImageView(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
+ public ImageView(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
+ public ImageView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+
initImageView();
- TypedArray a = context.obtainStyledAttributes(attrs,
- com.android.internal.R.styleable.ImageView, defStyle, 0);
+ final TypedArray a = context.obtainStyledAttributes(
+ attrs, com.android.internal.R.styleable.ImageView, defStyleAttr, defStyleRes);
Drawable d = a.getDrawable(com.android.internal.R.styleable.ImageView_src);
if (d != null) {
diff --git a/core/java/android/widget/LegacyTimePickerDelegate.java b/core/java/android/widget/LegacyTimePickerDelegate.java
new file mode 100644
index 0000000..1634d5f
--- /dev/null
+++ b/core/java/android/widget/LegacyTimePickerDelegate.java
@@ -0,0 +1,638 @@
+/*
+ * Copyright (C) 2013 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.content.Context;
+import android.content.res.Configuration;
+import android.content.res.TypedArray;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.text.format.DateFormat;
+import android.text.format.DateUtils;
+import android.util.AttributeSet;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.accessibility.AccessibilityEvent;
+import android.view.accessibility.AccessibilityNodeInfo;
+import android.view.inputmethod.EditorInfo;
+import android.view.inputmethod.InputMethodManager;
+import com.android.internal.R;
+
+import java.text.DateFormatSymbols;
+import java.util.Calendar;
+import java.util.Locale;
+
+import static android.view.View.IMPORTANT_FOR_ACCESSIBILITY_AUTO;
+import static android.view.View.IMPORTANT_FOR_ACCESSIBILITY_YES;
+
+/**
+ * A delegate implementing the basic TimePicker
+ */
+class LegacyTimePickerDelegate extends TimePicker.AbstractTimePickerDelegate {
+
+ private static final boolean DEFAULT_ENABLED_STATE = true;
+
+ private static final int HOURS_IN_HALF_DAY = 12;
+
+ // state
+ private boolean mIs24HourView;
+
+ private boolean mIsAm;
+
+ // ui components
+ private final NumberPicker mHourSpinner;
+
+ private final NumberPicker mMinuteSpinner;
+
+ private final NumberPicker mAmPmSpinner;
+
+ private final EditText mHourSpinnerInput;
+
+ private final EditText mMinuteSpinnerInput;
+
+ private final EditText mAmPmSpinnerInput;
+
+ private final TextView mDivider;
+
+ // Note that the legacy implementation of the TimePicker is
+ // using a button for toggling between AM/PM while the new
+ // version uses a NumberPicker spinner. Therefore the code
+ // accommodates these two cases to be backwards compatible.
+ private final Button mAmPmButton;
+
+ private final String[] mAmPmStrings;
+
+ private boolean mIsEnabled = DEFAULT_ENABLED_STATE;
+
+ private Calendar mTempCalendar;
+
+ private boolean mHourWithTwoDigit;
+ private char mHourFormat;
+
+ /**
+ * A no-op callback used in the constructor to avoid null checks later in
+ * the code.
+ */
+ private static final TimePicker.OnTimeChangedListener NO_OP_CHANGE_LISTENER =
+ new TimePicker.OnTimeChangedListener() {
+ public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {
+ }
+ };
+
+ public LegacyTimePickerDelegate(TimePicker delegator, Context context, AttributeSet attrs,
+ int defStyleAttr, int defStyleRes) {
+ super(delegator, context);
+
+ // process style attributes
+ final TypedArray attributesArray = mContext.obtainStyledAttributes(
+ attrs, R.styleable.TimePicker, defStyleAttr, defStyleRes);
+ final int layoutResourceId = attributesArray.getResourceId(
+ R.styleable.TimePicker_legacyLayout, R.layout.time_picker_legacy);
+ attributesArray.recycle();
+
+ final LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(
+ Context.LAYOUT_INFLATER_SERVICE);
+ inflater.inflate(layoutResourceId, mDelegator, true);
+
+ // hour
+ mHourSpinner = (NumberPicker) delegator.findViewById(R.id.hour);
+ mHourSpinner.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {
+ public void onValueChange(NumberPicker spinner, int oldVal, int newVal) {
+ updateInputState();
+ if (!is24HourView()) {
+ if ((oldVal == HOURS_IN_HALF_DAY - 1 && newVal == HOURS_IN_HALF_DAY) ||
+ (oldVal == HOURS_IN_HALF_DAY && newVal == HOURS_IN_HALF_DAY - 1)) {
+ mIsAm = !mIsAm;
+ updateAmPmControl();
+ }
+ }
+ onTimeChanged();
+ }
+ });
+ mHourSpinnerInput = (EditText) mHourSpinner.findViewById(R.id.numberpicker_input);
+ mHourSpinnerInput.setImeOptions(EditorInfo.IME_ACTION_NEXT);
+
+ // divider (only for the new widget style)
+ mDivider = (TextView) mDelegator.findViewById(R.id.divider);
+ if (mDivider != null) {
+ setDividerText();
+ }
+
+ // minute
+ mMinuteSpinner = (NumberPicker) mDelegator.findViewById(R.id.minute);
+ mMinuteSpinner.setMinValue(0);
+ mMinuteSpinner.setMaxValue(59);
+ mMinuteSpinner.setOnLongPressUpdateInterval(100);
+ mMinuteSpinner.setFormatter(NumberPicker.getTwoDigitFormatter());
+ mMinuteSpinner.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {
+ public void onValueChange(NumberPicker spinner, int oldVal, int newVal) {
+ updateInputState();
+ int minValue = mMinuteSpinner.getMinValue();
+ int maxValue = mMinuteSpinner.getMaxValue();
+ if (oldVal == maxValue && newVal == minValue) {
+ int newHour = mHourSpinner.getValue() + 1;
+ if (!is24HourView() && newHour == HOURS_IN_HALF_DAY) {
+ mIsAm = !mIsAm;
+ updateAmPmControl();
+ }
+ mHourSpinner.setValue(newHour);
+ } else if (oldVal == minValue && newVal == maxValue) {
+ int newHour = mHourSpinner.getValue() - 1;
+ if (!is24HourView() && newHour == HOURS_IN_HALF_DAY - 1) {
+ mIsAm = !mIsAm;
+ updateAmPmControl();
+ }
+ mHourSpinner.setValue(newHour);
+ }
+ onTimeChanged();
+ }
+ });
+ mMinuteSpinnerInput = (EditText) mMinuteSpinner.findViewById(R.id.numberpicker_input);
+ mMinuteSpinnerInput.setImeOptions(EditorInfo.IME_ACTION_NEXT);
+
+ /* Get the localized am/pm strings and use them in the spinner */
+ mAmPmStrings = new DateFormatSymbols().getAmPmStrings();
+
+ // am/pm
+ View amPmView = mDelegator.findViewById(R.id.amPm);
+ if (amPmView instanceof Button) {
+ mAmPmSpinner = null;
+ mAmPmSpinnerInput = null;
+ mAmPmButton = (Button) amPmView;
+ mAmPmButton.setOnClickListener(new View.OnClickListener() {
+ public void onClick(View button) {
+ button.requestFocus();
+ mIsAm = !mIsAm;
+ updateAmPmControl();
+ onTimeChanged();
+ }
+ });
+ } else {
+ mAmPmButton = null;
+ mAmPmSpinner = (NumberPicker) amPmView;
+ mAmPmSpinner.setMinValue(0);
+ mAmPmSpinner.setMaxValue(1);
+ mAmPmSpinner.setDisplayedValues(mAmPmStrings);
+ mAmPmSpinner.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {
+ public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
+ updateInputState();
+ picker.requestFocus();
+ mIsAm = !mIsAm;
+ updateAmPmControl();
+ onTimeChanged();
+ }
+ });
+ mAmPmSpinnerInput = (EditText) mAmPmSpinner.findViewById(R.id.numberpicker_input);
+ mAmPmSpinnerInput.setImeOptions(EditorInfo.IME_ACTION_DONE);
+ }
+
+ if (isAmPmAtStart()) {
+ // Move the am/pm view to the beginning
+ ViewGroup amPmParent = (ViewGroup) delegator.findViewById(R.id.timePickerLayout);
+ amPmParent.removeView(amPmView);
+ amPmParent.addView(amPmView, 0);
+ // Swap layout margins if needed. They may be not symmetrical (Old Standard Theme
+ // for example and not for Holo Theme)
+ ViewGroup.MarginLayoutParams lp =
+ (ViewGroup.MarginLayoutParams) amPmView.getLayoutParams();
+ final int startMargin = lp.getMarginStart();
+ final int endMargin = lp.getMarginEnd();
+ if (startMargin != endMargin) {
+ lp.setMarginStart(endMargin);
+ lp.setMarginEnd(startMargin);
+ }
+ }
+
+ getHourFormatData();
+
+ // update controls to initial state
+ updateHourControl();
+ updateMinuteControl();
+ updateAmPmControl();
+
+ setOnTimeChangedListener(NO_OP_CHANGE_LISTENER);
+
+ // set to current time
+ setCurrentHour(mTempCalendar.get(Calendar.HOUR_OF_DAY));
+ setCurrentMinute(mTempCalendar.get(Calendar.MINUTE));
+
+ if (!isEnabled()) {
+ setEnabled(false);
+ }
+
+ // set the content descriptions
+ setContentDescriptions();
+
+ // If not explicitly specified this view is important for accessibility.
+ if (mDelegator.getImportantForAccessibility() == IMPORTANT_FOR_ACCESSIBILITY_AUTO) {
+ mDelegator.setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_YES);
+ }
+ }
+
+ private void getHourFormatData() {
+ final String bestDateTimePattern = DateFormat.getBestDateTimePattern(mCurrentLocale,
+ (mIs24HourView) ? "Hm" : "hm");
+ final int lengthPattern = bestDateTimePattern.length();
+ mHourWithTwoDigit = false;
+ char hourFormat = '\0';
+ // Check if the returned pattern is single or double 'H', 'h', 'K', 'k'. We also save
+ // the hour format that we found.
+ for (int i = 0; i < lengthPattern; i++) {
+ final char c = bestDateTimePattern.charAt(i);
+ if (c == 'H' || c == 'h' || c == 'K' || c == 'k') {
+ mHourFormat = c;
+ if (i + 1 < lengthPattern && c == bestDateTimePattern.charAt(i + 1)) {
+ mHourWithTwoDigit = true;
+ }
+ break;
+ }
+ }
+ }
+
+ private boolean isAmPmAtStart() {
+ final String bestDateTimePattern = DateFormat.getBestDateTimePattern(mCurrentLocale,
+ "hm" /* skeleton */);
+
+ return bestDateTimePattern.startsWith("a");
+ }
+
+ /**
+ * The time separator is defined in the Unicode CLDR and cannot be supposed to be ":".
+ *
+ * See http://unicode.org/cldr/trac/browser/trunk/common/main
+ *
+ * We pass the correct "skeleton" depending on 12 or 24 hours view and then extract the
+ * separator as the character which is just after the hour marker in the returned pattern.
+ */
+ private void setDividerText() {
+ final String skeleton = (mIs24HourView) ? "Hm" : "hm";
+ final String bestDateTimePattern = DateFormat.getBestDateTimePattern(mCurrentLocale,
+ skeleton);
+ final String separatorText;
+ int hourIndex = bestDateTimePattern.lastIndexOf('H');
+ if (hourIndex == -1) {
+ hourIndex = bestDateTimePattern.lastIndexOf('h');
+ }
+ if (hourIndex == -1) {
+ // Default case
+ separatorText = ":";
+ } else {
+ int minuteIndex = bestDateTimePattern.indexOf('m', hourIndex + 1);
+ if (minuteIndex == -1) {
+ separatorText = Character.toString(bestDateTimePattern.charAt(hourIndex + 1));
+ } else {
+ separatorText = bestDateTimePattern.substring(hourIndex + 1, minuteIndex);
+ }
+ }
+ mDivider.setText(separatorText);
+ }
+
+ @Override
+ public void setCurrentHour(Integer currentHour) {
+ setCurrentHour(currentHour, true);
+ }
+
+ private void setCurrentHour(Integer currentHour, boolean notifyTimeChanged) {
+ // why was Integer used in the first place?
+ if (currentHour == null || currentHour == getCurrentHour()) {
+ return;
+ }
+ if (!is24HourView()) {
+ // convert [0,23] ordinal to wall clock display
+ if (currentHour >= HOURS_IN_HALF_DAY) {
+ mIsAm = false;
+ if (currentHour > HOURS_IN_HALF_DAY) {
+ currentHour = currentHour - HOURS_IN_HALF_DAY;
+ }
+ } else {
+ mIsAm = true;
+ if (currentHour == 0) {
+ currentHour = HOURS_IN_HALF_DAY;
+ }
+ }
+ updateAmPmControl();
+ }
+ mHourSpinner.setValue(currentHour);
+ if (notifyTimeChanged) {
+ onTimeChanged();
+ }
+ }
+
+ @Override
+ public Integer getCurrentHour() {
+ int currentHour = mHourSpinner.getValue();
+ if (is24HourView()) {
+ return currentHour;
+ } else if (mIsAm) {
+ return currentHour % HOURS_IN_HALF_DAY;
+ } else {
+ return (currentHour % HOURS_IN_HALF_DAY) + HOURS_IN_HALF_DAY;
+ }
+ }
+
+ @Override
+ public void setCurrentMinute(Integer currentMinute) {
+ if (currentMinute == getCurrentMinute()) {
+ return;
+ }
+ mMinuteSpinner.setValue(currentMinute);
+ onTimeChanged();
+ }
+
+ @Override
+ public Integer getCurrentMinute() {
+ return mMinuteSpinner.getValue();
+ }
+
+ @Override
+ public void setIs24HourView(Boolean is24HourView) {
+ if (mIs24HourView == is24HourView) {
+ return;
+ }
+ // cache the current hour since spinner range changes and BEFORE changing mIs24HourView!!
+ int currentHour = getCurrentHour();
+ // Order is important here.
+ mIs24HourView = is24HourView;
+ getHourFormatData();
+ updateHourControl();
+ // set value after spinner range is updated
+ setCurrentHour(currentHour, false);
+ updateMinuteControl();
+ updateAmPmControl();
+ }
+
+ @Override
+ public boolean is24HourView() {
+ return mIs24HourView;
+ }
+
+ @Override
+ public void setOnTimeChangedListener(TimePicker.OnTimeChangedListener onTimeChangedListener) {
+ mOnTimeChangedListener = onTimeChangedListener;
+ }
+
+ @Override
+ public void setEnabled(boolean enabled) {
+ mMinuteSpinner.setEnabled(enabled);
+ if (mDivider != null) {
+ mDivider.setEnabled(enabled);
+ }
+ mHourSpinner.setEnabled(enabled);
+ if (mAmPmSpinner != null) {
+ mAmPmSpinner.setEnabled(enabled);
+ } else {
+ mAmPmButton.setEnabled(enabled);
+ }
+ mIsEnabled = enabled;
+ }
+
+ @Override
+ public boolean isEnabled() {
+ return mIsEnabled;
+ }
+
+ @Override
+ public void setShowDoneButton(boolean showDoneButton) {
+ // Nothing to do
+ }
+
+ @Override
+ public void setDismissCallback(TimePicker.TimePickerDismissCallback callback) {
+ // Nothing to do
+ }
+
+ @Override
+ public int getBaseline() {
+ return mHourSpinner.getBaseline();
+ }
+
+ @Override
+ public void onConfigurationChanged(Configuration newConfig) {
+ setCurrentLocale(newConfig.locale);
+ }
+
+ @Override
+ public Parcelable onSaveInstanceState(Parcelable superState) {
+ return new SavedState(superState, getCurrentHour(), getCurrentMinute());
+ }
+
+ @Override
+ public void onRestoreInstanceState(Parcelable state) {
+ SavedState ss = (SavedState) state;
+ setCurrentHour(ss.getHour());
+ setCurrentMinute(ss.getMinute());
+ }
+
+ @Override
+ public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {
+ onPopulateAccessibilityEvent(event);
+ return true;
+ }
+
+ @Override
+ public void onPopulateAccessibilityEvent(AccessibilityEvent event) {
+ int flags = DateUtils.FORMAT_SHOW_TIME;
+ if (mIs24HourView) {
+ flags |= DateUtils.FORMAT_24HOUR;
+ } else {
+ flags |= DateUtils.FORMAT_12HOUR;
+ }
+ mTempCalendar.set(Calendar.HOUR_OF_DAY, getCurrentHour());
+ mTempCalendar.set(Calendar.MINUTE, getCurrentMinute());
+ String selectedDateUtterance = DateUtils.formatDateTime(mContext,
+ mTempCalendar.getTimeInMillis(), flags);
+ event.getText().add(selectedDateUtterance);
+ }
+
+ @Override
+ public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
+ event.setClassName(TimePicker.class.getName());
+ }
+
+ @Override
+ public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
+ info.setClassName(TimePicker.class.getName());
+ }
+
+ private void updateInputState() {
+ // Make sure that if the user changes the value and the IME is active
+ // for one of the inputs if this widget, the IME is closed. If the user
+ // changed the value via the IME and there is a next input the IME will
+ // be shown, otherwise the user chose another means of changing the
+ // value and having the IME up makes no sense.
+ InputMethodManager inputMethodManager = InputMethodManager.peekInstance();
+ if (inputMethodManager != null) {
+ if (inputMethodManager.isActive(mHourSpinnerInput)) {
+ mHourSpinnerInput.clearFocus();
+ inputMethodManager.hideSoftInputFromWindow(mDelegator.getWindowToken(), 0);
+ } else if (inputMethodManager.isActive(mMinuteSpinnerInput)) {
+ mMinuteSpinnerInput.clearFocus();
+ inputMethodManager.hideSoftInputFromWindow(mDelegator.getWindowToken(), 0);
+ } else if (inputMethodManager.isActive(mAmPmSpinnerInput)) {
+ mAmPmSpinnerInput.clearFocus();
+ inputMethodManager.hideSoftInputFromWindow(mDelegator.getWindowToken(), 0);
+ }
+ }
+ }
+
+ private void updateAmPmControl() {
+ if (is24HourView()) {
+ if (mAmPmSpinner != null) {
+ mAmPmSpinner.setVisibility(View.GONE);
+ } else {
+ mAmPmButton.setVisibility(View.GONE);
+ }
+ } else {
+ int index = mIsAm ? Calendar.AM : Calendar.PM;
+ if (mAmPmSpinner != null) {
+ mAmPmSpinner.setValue(index);
+ mAmPmSpinner.setVisibility(View.VISIBLE);
+ } else {
+ mAmPmButton.setText(mAmPmStrings[index]);
+ mAmPmButton.setVisibility(View.VISIBLE);
+ }
+ }
+ mDelegator.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_SELECTED);
+ }
+
+ /**
+ * Sets the current locale.
+ *
+ * @param locale The current locale.
+ */
+ @Override
+ public void setCurrentLocale(Locale locale) {
+ super.setCurrentLocale(locale);
+ mTempCalendar = Calendar.getInstance(locale);
+ }
+
+ private void onTimeChanged() {
+ mDelegator.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_SELECTED);
+ if (mOnTimeChangedListener != null) {
+ mOnTimeChangedListener.onTimeChanged(mDelegator, getCurrentHour(),
+ getCurrentMinute());
+ }
+ }
+
+ private void updateHourControl() {
+ if (is24HourView()) {
+ // 'k' means 1-24 hour
+ if (mHourFormat == 'k') {
+ mHourSpinner.setMinValue(1);
+ mHourSpinner.setMaxValue(24);
+ } else {
+ mHourSpinner.setMinValue(0);
+ mHourSpinner.setMaxValue(23);
+ }
+ } else {
+ // 'K' means 0-11 hour
+ if (mHourFormat == 'K') {
+ mHourSpinner.setMinValue(0);
+ mHourSpinner.setMaxValue(11);
+ } else {
+ mHourSpinner.setMinValue(1);
+ mHourSpinner.setMaxValue(12);
+ }
+ }
+ mHourSpinner.setFormatter(mHourWithTwoDigit ? NumberPicker.getTwoDigitFormatter() : null);
+ }
+
+ private void updateMinuteControl() {
+ if (is24HourView()) {
+ mMinuteSpinnerInput.setImeOptions(EditorInfo.IME_ACTION_DONE);
+ } else {
+ mMinuteSpinnerInput.setImeOptions(EditorInfo.IME_ACTION_NEXT);
+ }
+ }
+
+ private void setContentDescriptions() {
+ // Minute
+ trySetContentDescription(mMinuteSpinner, R.id.increment,
+ R.string.time_picker_increment_minute_button);
+ trySetContentDescription(mMinuteSpinner, R.id.decrement,
+ R.string.time_picker_decrement_minute_button);
+ // Hour
+ trySetContentDescription(mHourSpinner, R.id.increment,
+ R.string.time_picker_increment_hour_button);
+ trySetContentDescription(mHourSpinner, R.id.decrement,
+ R.string.time_picker_decrement_hour_button);
+ // AM/PM
+ if (mAmPmSpinner != null) {
+ trySetContentDescription(mAmPmSpinner, R.id.increment,
+ R.string.time_picker_increment_set_pm_button);
+ trySetContentDescription(mAmPmSpinner, R.id.decrement,
+ R.string.time_picker_decrement_set_am_button);
+ }
+ }
+
+ private void trySetContentDescription(View root, int viewId, int contDescResId) {
+ View target = root.findViewById(viewId);
+ if (target != null) {
+ target.setContentDescription(mContext.getString(contDescResId));
+ }
+ }
+
+ /**
+ * Used to save / restore state of time picker
+ */
+ private static class SavedState extends View.BaseSavedState {
+
+ private final int mHour;
+
+ private final int mMinute;
+
+ private SavedState(Parcelable superState, int hour, int minute) {
+ super(superState);
+ mHour = hour;
+ mMinute = minute;
+ }
+
+ private SavedState(Parcel in) {
+ super(in);
+ mHour = in.readInt();
+ mMinute = in.readInt();
+ }
+
+ public int getHour() {
+ return mHour;
+ }
+
+ public int getMinute() {
+ return mMinute;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ super.writeToParcel(dest, flags);
+ dest.writeInt(mHour);
+ dest.writeInt(mMinute);
+ }
+
+ @SuppressWarnings({"unused", "hiding"})
+ public static final Parcelable.Creator<SavedState> CREATOR = new Creator<SavedState>() {
+ public SavedState createFromParcel(Parcel in) {
+ return new SavedState(in);
+ }
+
+ public SavedState[] newArray(int size) {
+ return new SavedState[size];
+ }
+ };
+ }
+}
+
diff --git a/core/java/android/widget/LinearLayout.java b/core/java/android/widget/LinearLayout.java
index ad60a95..65f1ab7 100644
--- a/core/java/android/widget/LinearLayout.java
+++ b/core/java/android/widget/LinearLayout.java
@@ -18,6 +18,7 @@ package android.widget;
import com.android.internal.R;
+import android.annotation.IntDef;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
@@ -31,6 +32,9 @@ import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityNodeInfo;
import android.widget.RemoteViews.RemoteView;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
/**
* A Layout that arranges its children in a single column or a single row. The direction of
@@ -57,9 +61,25 @@ import android.widget.RemoteViews.RemoteView;
*/
@RemoteView
public class LinearLayout extends ViewGroup {
+ /** @hide */
+ @IntDef({HORIZONTAL, VERTICAL})
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface OrientationMode {}
+
public static final int HORIZONTAL = 0;
public static final int VERTICAL = 1;
+ /** @hide */
+ @IntDef(flag = true,
+ value = {
+ SHOW_DIVIDER_NONE,
+ SHOW_DIVIDER_BEGINNING,
+ SHOW_DIVIDER_MIDDLE,
+ SHOW_DIVIDER_END
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface DividerMode {}
+
/**
* Don't show any dividers.
*/
@@ -165,18 +185,22 @@ public class LinearLayout extends ViewGroup {
private int mDividerPadding;
public LinearLayout(Context context) {
- super(context);
+ this(context, null);
}
public LinearLayout(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
- public LinearLayout(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
+ public LinearLayout(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
+ public LinearLayout(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
- TypedArray a = context.obtainStyledAttributes(attrs,
- com.android.internal.R.styleable.LinearLayout, defStyle, 0);
+ final TypedArray a = context.obtainStyledAttributes(
+ attrs, com.android.internal.R.styleable.LinearLayout, defStyleAttr, defStyleRes);
int index = a.getInt(com.android.internal.R.styleable.LinearLayout_orientation, -1);
if (index >= 0) {
@@ -214,7 +238,7 @@ public class LinearLayout extends ViewGroup {
* {@link #SHOW_DIVIDER_MIDDLE}, or {@link #SHOW_DIVIDER_END},
* or {@link #SHOW_DIVIDER_NONE} to show no dividers.
*/
- public void setShowDividers(int showDividers) {
+ public void setShowDividers(@DividerMode int showDividers) {
if (showDividers != mShowDividers) {
requestLayout();
}
@@ -230,6 +254,7 @@ public class LinearLayout extends ViewGroup {
* @return A flag set indicating how dividers should be shown around items.
* @see #setShowDividers(int)
*/
+ @DividerMode
public int getShowDividers() {
return mShowDividers;
}
@@ -1673,12 +1698,12 @@ public class LinearLayout extends ViewGroup {
/**
* Should the layout be a column or a row.
- * @param orientation Pass HORIZONTAL or VERTICAL. Default
- * value is HORIZONTAL.
+ * @param orientation Pass {@link #HORIZONTAL} or {@link #VERTICAL}. Default
+ * value is {@link #HORIZONTAL}.
*
* @attr ref android.R.styleable#LinearLayout_orientation
*/
- public void setOrientation(int orientation) {
+ public void setOrientation(@OrientationMode int orientation) {
if (mOrientation != orientation) {
mOrientation = orientation;
requestLayout();
@@ -1690,6 +1715,7 @@ public class LinearLayout extends ViewGroup {
*
* @return either {@link #HORIZONTAL} or {@link #VERTICAL}
*/
+ @OrientationMode
public int getOrientation() {
return mOrientation;
}
diff --git a/core/java/android/widget/ListView.java b/core/java/android/widget/ListView.java
index 78237c3..81a17c5 100644
--- a/core/java/android/widget/ListView.java
+++ b/core/java/android/widget/ListView.java
@@ -142,11 +142,15 @@ public class ListView extends AbsListView {
this(context, attrs, com.android.internal.R.attr.listViewStyle);
}
- public ListView(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
+ public ListView(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
+ public ListView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
- TypedArray a = context.obtainStyledAttributes(attrs,
- com.android.internal.R.styleable.ListView, defStyle, 0);
+ final TypedArray a = context.obtainStyledAttributes(
+ attrs, com.android.internal.R.styleable.ListView, defStyleAttr, defStyleRes);
CharSequence[] entries = a.getTextArray(
com.android.internal.R.styleable.ListView_entries);
@@ -1729,34 +1733,6 @@ public class ListView extends AbsListView {
}
/**
- * @return the direct child that contains accessibility focus, or null if no
- * child contains accessibility focus
- */
- private View getAccessibilityFocusedChild() {
- final ViewRootImpl viewRootImpl = getViewRootImpl();
- if (viewRootImpl == null) {
- return null;
- }
-
- View focusedView = viewRootImpl.getAccessibilityFocusedHost();
- if (focusedView == null) {
- return null;
- }
-
- ViewParent viewParent = focusedView.getParent();
- while ((viewParent instanceof View) && (viewParent != this)) {
- focusedView = (View) viewParent;
- viewParent = viewParent.getParent();
- }
-
- if (!(viewParent instanceof View)) {
- return null;
- }
-
- return focusedView;
- }
-
- /**
* Obtain the view and add it to our list of children. The view can be made
* fresh, converted from an unused view, or used as is if it was in the
* recycle bin.
diff --git a/core/java/android/widget/MultiAutoCompleteTextView.java b/core/java/android/widget/MultiAutoCompleteTextView.java
index 0b30c84..cbd01b0 100644
--- a/core/java/android/widget/MultiAutoCompleteTextView.java
+++ b/core/java/android/widget/MultiAutoCompleteTextView.java
@@ -67,8 +67,13 @@ public class MultiAutoCompleteTextView extends AutoCompleteTextView {
this(context, attrs, com.android.internal.R.attr.autoCompleteTextViewStyle);
}
- public MultiAutoCompleteTextView(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
+ public MultiAutoCompleteTextView(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
+ public MultiAutoCompleteTextView(
+ Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
}
/* package */ void finishInit() { }
diff --git a/core/java/android/widget/NumberPicker.java b/core/java/android/widget/NumberPicker.java
index c0fde2e..44c4987 100644
--- a/core/java/android/widget/NumberPicker.java
+++ b/core/java/android/widget/NumberPicker.java
@@ -16,6 +16,7 @@
package android.widget;
+import android.annotation.IntDef;
import android.annotation.Widget;
import android.content.Context;
import android.content.res.ColorStateList;
@@ -53,6 +54,8 @@ import android.view.inputmethod.InputMethodManager;
import com.android.internal.R;
import libcore.icu.LocaleData;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
@@ -493,6 +496,10 @@ public class NumberPicker extends LinearLayout {
* Interface to listen for the picker scroll state.
*/
public interface OnScrollListener {
+ /** @hide */
+ @IntDef({SCROLL_STATE_IDLE, SCROLL_STATE_TOUCH_SCROLL, SCROLL_STATE_FLING})
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface ScrollState {}
/**
* The view is not scrolling.
@@ -518,7 +525,7 @@ public class NumberPicker extends LinearLayout {
* {@link #SCROLL_STATE_TOUCH_SCROLL} or
* {@link #SCROLL_STATE_IDLE}.
*/
- public void onScrollStateChange(NumberPicker view, int scrollState);
+ public void onScrollStateChange(NumberPicker view, @ScrollState int scrollState);
}
/**
@@ -559,14 +566,33 @@ public class NumberPicker extends LinearLayout {
*
* @param context the application environment.
* @param attrs a collection of attributes.
- * @param defStyle The default style to apply to this view.
+ * @param defStyleAttr An attribute in the current theme that contains a
+ * reference to a style resource that supplies default values for
+ * the view. Can be 0 to not look for defaults.
*/
- public NumberPicker(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
+ public NumberPicker(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
+ /**
+ * Create a new number picker
+ *
+ * @param context the application environment.
+ * @param attrs a collection of attributes.
+ * @param defStyleAttr An attribute in the current theme that contains a
+ * reference to a style resource that supplies default values for
+ * the view. Can be 0 to not look for defaults.
+ * @param defStyleRes A resource identifier of a style resource that
+ * supplies default values for the view, used only if
+ * defStyleAttr is 0 or can not be found in the theme. Can be 0
+ * to not look for defaults.
+ */
+ public NumberPicker(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
// process style attributes
- TypedArray attributesArray = context.obtainStyledAttributes(
- attrs, R.styleable.NumberPicker, defStyle, 0);
+ final TypedArray attributesArray = context.obtainStyledAttributes(
+ attrs, R.styleable.NumberPicker, defStyleAttr, defStyleRes);
final int layoutResId = attributesArray.getResourceId(
R.styleable.NumberPicker_internalLayout, DEFAULT_LAYOUT_RESOURCE_ID);
diff --git a/core/java/android/widget/OverScroller.java b/core/java/android/widget/OverScroller.java
index f218199..7b3dd31 100644
--- a/core/java/android/widget/OverScroller.java
+++ b/core/java/android/widget/OverScroller.java
@@ -70,7 +70,11 @@ public class OverScroller {
* @hide
*/
public OverScroller(Context context, Interpolator interpolator, boolean flywheel) {
- mInterpolator = interpolator;
+ if (interpolator == null) {
+ mInterpolator = new Scroller.ViscousFluidInterpolator();
+ } else {
+ mInterpolator = interpolator;
+ }
mFlywheel = flywheel;
mScrollerX = new SplineOverScroller(context);
mScrollerY = new SplineOverScroller(context);
@@ -112,7 +116,11 @@ public class OverScroller {
}
void setInterpolator(Interpolator interpolator) {
- mInterpolator = interpolator;
+ if (interpolator == null) {
+ mInterpolator = new Scroller.ViscousFluidInterpolator();
+ } else {
+ mInterpolator = interpolator;
+ }
}
/**
@@ -302,14 +310,7 @@ public class OverScroller {
final int duration = mScrollerX.mDuration;
if (elapsedTime < duration) {
- float q = (float) (elapsedTime) / duration;
-
- if (mInterpolator == null) {
- q = Scroller.viscousFluid(q);
- } else {
- q = mInterpolator.getInterpolation(q);
- }
-
+ final float q = mInterpolator.getInterpolation(elapsedTime / (float) duration);
mScrollerX.updateScroll(q);
mScrollerY.updateScroll(q);
} else {
diff --git a/core/java/android/widget/PopupWindow.java b/core/java/android/widget/PopupWindow.java
index 5663959..e77a810 100644
--- a/core/java/android/widget/PopupWindow.java
+++ b/core/java/android/widget/PopupWindow.java
@@ -170,8 +170,8 @@ public class PopupWindow {
*
* <p>The popup does provide a background.</p>
*/
- public PopupWindow(Context context, AttributeSet attrs, int defStyle) {
- this(context, attrs, defStyle, 0);
+ public PopupWindow(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
}
/**
@@ -183,8 +183,7 @@ public class PopupWindow {
mContext = context;
mWindowManager = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE);
- TypedArray a =
- context.obtainStyledAttributes(
+ final TypedArray a = context.obtainStyledAttributes(
attrs, com.android.internal.R.styleable.PopupWindow, defStyleAttr, defStyleRes);
mBackground = a.getDrawable(R.styleable.PopupWindow_popupBackground);
diff --git a/core/java/android/widget/ProgressBar.java b/core/java/android/widget/ProgressBar.java
index 5392a96..1fbcbcf 100644
--- a/core/java/android/widget/ProgressBar.java
+++ b/core/java/android/widget/ProgressBar.java
@@ -242,29 +242,26 @@ public class ProgressBar extends View {
this(context, attrs, com.android.internal.R.attr.progressBarStyle);
}
- public ProgressBar(Context context, AttributeSet attrs, int defStyle) {
- this(context, attrs, defStyle, 0);
+ public ProgressBar(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
}
- /**
- * @hide
- */
- public ProgressBar(Context context, AttributeSet attrs, int defStyle, int styleRes) {
- super(context, attrs, defStyle);
+ public ProgressBar(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+
mUiThreadId = Thread.currentThread().getId();
initProgressBar();
- TypedArray a =
- context.obtainStyledAttributes(attrs, R.styleable.ProgressBar, defStyle, styleRes);
+ final TypedArray a = context.obtainStyledAttributes(
+ attrs, R.styleable.ProgressBar, defStyleAttr, defStyleRes);
mNoInvalidate = true;
Drawable drawable = a.getDrawable(R.styleable.ProgressBar_progressDrawable);
if (drawable != null) {
- drawable = tileify(drawable, false);
// Calling this method can set mMaxHeight, make sure the corresponding
// XML attribute for mMaxHeight is read after calling this method
- setProgressDrawable(drawable);
+ setProgressDrawableTiled(drawable);
}
@@ -293,8 +290,7 @@ public class ProgressBar extends View {
drawable = a.getDrawable(R.styleable.ProgressBar_indeterminateDrawable);
if (drawable != null) {
- drawable = tileifyIndeterminate(drawable);
- setIndeterminateDrawable(drawable);
+ setIndeterminateDrawableTiled(drawable);
}
mOnlyIndeterminate = a.getBoolean(
@@ -467,11 +463,9 @@ public class ProgressBar extends View {
}
/**
- * <p>Define the drawable used to draw the progress bar in
- * indeterminate mode.</p>
+ * Define the drawable used to draw the progress bar in indeterminate mode.
*
* @param d the new drawable
- *
* @see #getIndeterminateDrawable()
* @see #setIndeterminate(boolean)
*/
@@ -488,6 +482,25 @@ public class ProgressBar extends View {
postInvalidate();
}
}
+
+ /**
+ * Define the tileable drawable used to draw the progress bar in
+ * indeterminate mode.
+ * <p>
+ * If the drawable is a BitmapDrawable or contains BitmapDrawables, a
+ * tiled copy will be generated for display as a progress bar.
+ *
+ * @param d the new drawable
+ * @see #getIndeterminateDrawable()
+ * @see #setIndeterminate(boolean)
+ */
+ public void setIndeterminateDrawableTiled(Drawable d) {
+ if (d != null) {
+ d = tileifyIndeterminate(d);
+ }
+
+ setIndeterminateDrawable(d);
+ }
/**
* <p>Get the drawable used to draw the progress bar in
@@ -503,11 +516,9 @@ public class ProgressBar extends View {
}
/**
- * <p>Define the drawable used to draw the progress bar in
- * progress mode.</p>
+ * Define the drawable used to draw the progress bar in progress mode.
*
* @param d the new drawable
- *
* @see #getProgressDrawable()
* @see #setIndeterminate(boolean)
*/
@@ -546,6 +557,25 @@ public class ProgressBar extends View {
doRefreshProgress(R.id.secondaryProgress, mSecondaryProgress, false, false);
}
}
+
+ /**
+ * Define the tileable drawable used to draw the progress bar in
+ * progress mode.
+ * <p>
+ * If the drawable is a BitmapDrawable or contains BitmapDrawables, a
+ * tiled copy will be generated for display as a progress bar.
+ *
+ * @param d the new drawable
+ * @see #getProgressDrawable()
+ * @see #setIndeterminate(boolean)
+ */
+ public void setProgressDrawableTiled(Drawable d) {
+ if (d != null) {
+ d = tileify(d, false);
+ }
+
+ setProgressDrawable(d);
+ }
/**
* @return The drawable currently used to draw the progress bar
diff --git a/core/java/android/widget/QuickContactBadge.java b/core/java/android/widget/QuickContactBadge.java
index fd2f754..a4f758c 100644
--- a/core/java/android/widget/QuickContactBadge.java
+++ b/core/java/android/widget/QuickContactBadge.java
@@ -84,8 +84,13 @@ public class QuickContactBadge extends ImageView implements OnClickListener {
this(context, attrs, 0);
}
- public QuickContactBadge(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
+ public QuickContactBadge(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
+ public QuickContactBadge(
+ Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
TypedArray styledAttributes = mContext.obtainStyledAttributes(R.styleable.Theme);
mOverlay = styledAttributes.getDrawable(
diff --git a/core/java/android/widget/RadialTimePickerView.java b/core/java/android/widget/RadialTimePickerView.java
new file mode 100644
index 0000000..1c9ab61
--- /dev/null
+++ b/core/java/android/widget/RadialTimePickerView.java
@@ -0,0 +1,1396 @@
+/*
+ * Copyright (C) 2013 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.animation.Animator;
+import android.animation.AnimatorSet;
+import android.animation.Keyframe;
+import android.animation.ObjectAnimator;
+import android.animation.PropertyValuesHolder;
+import android.animation.ValueAnimator;
+import android.annotation.SuppressLint;
+import android.content.Context;
+import android.content.res.Resources;
+import android.content.res.TypedArray;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Paint;
+import android.graphics.Typeface;
+import android.graphics.RectF;
+import android.os.Bundle;
+import android.text.format.DateUtils;
+import android.text.format.Time;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.HapticFeedbackConstants;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.accessibility.AccessibilityEvent;
+import android.view.accessibility.AccessibilityNodeInfo;
+import com.android.internal.R;
+
+import java.text.DateFormatSymbols;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Locale;
+
+/**
+ * View to show a clock circle picker (with one or two picking circles)
+ *
+ * @hide
+ */
+public class RadialTimePickerView extends View implements View.OnTouchListener {
+ private static final String TAG = "ClockView";
+
+ private static final boolean DEBUG = false;
+
+ private static final int DEBUG_COLOR = 0x20FF0000;
+ private static final int DEBUG_TEXT_COLOR = 0x60FF0000;
+ private static final int DEBUG_STROKE_WIDTH = 2;
+
+ private static final int HOURS = 0;
+ private static final int MINUTES = 1;
+ private static final int HOURS_INNER = 2;
+ private static final int AMPM = 3;
+
+ private static final int SELECTOR_CIRCLE = 0;
+ private static final int SELECTOR_DOT = 1;
+ private static final int SELECTOR_LINE = 2;
+
+ private static final int AM = 0;
+ private static final int PM = 1;
+
+ // Opaque alpha level
+ private static final int ALPHA_OPAQUE = 255;
+
+ // Transparent alpha level
+ private static final int ALPHA_TRANSPARENT = 0;
+
+ // Alpha level of color for selector.
+ private static final int ALPHA_SELECTOR = 51;
+
+ // Alpha level of color for selected circle.
+ private static final int ALPHA_AMPM_SELECTED = ALPHA_SELECTOR;
+
+ // Alpha level of color for pressed circle.
+ private static final int ALPHA_AMPM_PRESSED = 175;
+
+ private static final float COSINE_30_DEGREES = ((float) Math.sqrt(3)) * 0.5f;
+ private static final float SINE_30_DEGREES = 0.5f;
+
+ private static final int DEGREES_FOR_ONE_HOUR = 30;
+ private static final int DEGREES_FOR_ONE_MINUTE = 6;
+
+ private static final int[] HOURS_NUMBERS = {12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
+ private static final int[] HOURS_NUMBERS_24 = {0, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23};
+ private static final int[] MINUTES_NUMBERS = {0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55};
+
+ private static final int CENTER_RADIUS = 2;
+
+ private static int[] sSnapPrefer30sMap = new int[361];
+
+ private final String[] mHours12Texts = new String[12];
+ private final String[] mOuterHours24Texts = new String[12];
+ private final String[] mInnerHours24Texts = new String[12];
+ private final String[] mMinutesTexts = new String[12];
+
+ private final String[] mAmPmText = new String[2];
+
+ private final Paint[] mPaint = new Paint[2];
+ private final Paint mPaintCenter = new Paint();
+ private final Paint[][] mPaintSelector = new Paint[2][3];
+ private final Paint mPaintAmPmText = new Paint();
+ private final Paint[] mPaintAmPmCircle = new Paint[2];
+
+ private final Paint mPaintBackground = new Paint();
+ private final Paint mPaintDisabled = new Paint();
+ private final Paint mPaintDebug = new Paint();
+
+ private Typeface mTypeface;
+
+ private boolean mIs24HourMode;
+ private boolean mShowHours;
+ private boolean mIsOnInnerCircle;
+
+ private int mXCenter;
+ private int mYCenter;
+
+ private float[] mCircleRadius = new float[3];
+
+ private int mMinHypotenuseForInnerNumber;
+ private int mMaxHypotenuseForOuterNumber;
+ private int mHalfwayHypotenusePoint;
+
+ private float[] mTextSize = new float[2];
+ private float mInnerTextSize;
+
+ private float[][] mTextGridHeights = new float[2][7];
+ private float[][] mTextGridWidths = new float[2][7];
+
+ private float[] mInnerTextGridHeights = new float[7];
+ private float[] mInnerTextGridWidths = new float[7];
+
+ private String[] mOuterTextHours;
+ private String[] mInnerTextHours;
+ private String[] mOuterTextMinutes;
+
+ private float[] mCircleRadiusMultiplier = new float[2];
+ private float[] mNumbersRadiusMultiplier = new float[3];
+
+ private float[] mTextSizeMultiplier = new float[3];
+
+ private float[] mAnimationRadiusMultiplier = new float[3];
+
+ private float mTransitionMidRadiusMultiplier;
+ private float mTransitionEndRadiusMultiplier;
+
+ private AnimatorSet mTransition;
+ private InvalidateUpdateListener mInvalidateUpdateListener = new InvalidateUpdateListener();
+
+ private int[] mLineLength = new int[3];
+ private int[] mSelectionRadius = new int[3];
+ private float mSelectionRadiusMultiplier;
+ private int[] mSelectionDegrees = new int[3];
+
+ private int mAmPmCircleRadius;
+ private float mAmPmYCenter;
+
+ private float mAmPmCircleRadiusMultiplier;
+ private int mAmPmTextColor;
+
+ private float mLeftIndicatorXCenter;
+ private float mRightIndicatorXCenter;
+
+ private int mAmPmUnselectedColor;
+ private int mAmPmSelectedColor;
+
+ private int mAmOrPm;
+ private int mAmOrPmPressed;
+
+ private RectF mRectF = new RectF();
+ private boolean mInputEnabled = true;
+ private OnValueSelectedListener mListener;
+
+ private final ArrayList<Animator> mHoursToMinutesAnims = new ArrayList<Animator>();
+ private final ArrayList<Animator> mMinuteToHoursAnims = new ArrayList<Animator>();
+
+ public interface OnValueSelectedListener {
+ void onValueSelected(int pickerIndex, int newValue, boolean autoAdvance);
+ }
+
+ static {
+ // Prepare mapping to snap touchable degrees to selectable degrees.
+ preparePrefer30sMap();
+ }
+
+ /**
+ * Split up the 360 degrees of the circle among the 60 selectable values. Assigns a larger
+ * selectable area to each of the 12 visible values, such that the ratio of space apportioned
+ * to a visible value : space apportioned to a non-visible value will be 14 : 4.
+ * E.g. the output of 30 degrees should have a higher range of input associated with it than
+ * the output of 24 degrees, because 30 degrees corresponds to a visible number on the clock
+ * circle (5 on the minutes, 1 or 13 on the hours).
+ */
+ private static void preparePrefer30sMap() {
+ // We'll split up the visible output and the non-visible output such that each visible
+ // output will correspond to a range of 14 associated input degrees, and each non-visible
+ // output will correspond to a range of 4 associate input degrees, so visible numbers
+ // are more than 3 times easier to get than non-visible numbers:
+ // {354-359,0-7}:0, {8-11}:6, {12-15}:12, {16-19}:18, {20-23}:24, {24-37}:30, etc.
+ //
+ // If an output of 30 degrees should correspond to a range of 14 associated degrees, then
+ // we'll need any input between 24 - 37 to snap to 30. Working out from there, 20-23 should
+ // snap to 24, while 38-41 should snap to 36. This is somewhat counter-intuitive, that you
+ // can be touching 36 degrees but have the selection snapped to 30 degrees; however, this
+ // inconsistency isn't noticeable at such fine-grained degrees, and it affords us the
+ // ability to aggressively prefer the visible values by a factor of more than 3:1, which
+ // greatly contributes to the selectability of these values.
+
+ // The first output is 0, and each following output will increment by 6 {0, 6, 12, ...}.
+ int snappedOutputDegrees = 0;
+ // Count of how many inputs we've designated to the specified output.
+ int count = 1;
+ // How many input we expect for a specified output. This will be 14 for output divisible
+ // by 30, and 4 for the remaining output. We'll special case the outputs of 0 and 360, so
+ // the caller can decide which they need.
+ int expectedCount = 8;
+ // Iterate through the input.
+ for (int degrees = 0; degrees < 361; degrees++) {
+ // Save the input-output mapping.
+ sSnapPrefer30sMap[degrees] = snappedOutputDegrees;
+ // If this is the last input for the specified output, calculate the next output and
+ // the next expected count.
+ if (count == expectedCount) {
+ snappedOutputDegrees += 6;
+ if (snappedOutputDegrees == 360) {
+ expectedCount = 7;
+ } else if (snappedOutputDegrees % 30 == 0) {
+ expectedCount = 14;
+ } else {
+ expectedCount = 4;
+ }
+ count = 1;
+ } else {
+ count++;
+ }
+ }
+ }
+
+ /**
+ * Returns mapping of any input degrees (0 to 360) to one of 60 selectable output degrees,
+ * where the degrees corresponding to visible numbers (i.e. those divisible by 30) will be
+ * weighted heavier than the degrees corresponding to non-visible numbers.
+ * See {@link #preparePrefer30sMap()} documentation for the rationale and generation of the
+ * mapping.
+ */
+ private static int snapPrefer30s(int degrees) {
+ if (sSnapPrefer30sMap == null) {
+ return -1;
+ }
+ return sSnapPrefer30sMap[degrees];
+ }
+
+ /**
+ * Returns mapping of any input degrees (0 to 360) to one of 12 visible output degrees (all
+ * multiples of 30), where the input will be "snapped" to the closest visible degrees.
+ * @param degrees The input degrees
+ * @param forceHigherOrLower The output may be forced to either the higher or lower step, or may
+ * be allowed to snap to whichever is closer. Use 1 to force strictly higher, -1 to force
+ * strictly lower, and 0 to snap to the closer one.
+ * @return output degrees, will be a multiple of 30
+ */
+ private static int snapOnly30s(int degrees, int forceHigherOrLower) {
+ final int stepSize = DEGREES_FOR_ONE_HOUR;
+ int floor = (degrees / stepSize) * stepSize;
+ final int ceiling = floor + stepSize;
+ if (forceHigherOrLower == 1) {
+ degrees = ceiling;
+ } else if (forceHigherOrLower == -1) {
+ if (degrees == floor) {
+ floor -= stepSize;
+ }
+ degrees = floor;
+ } else {
+ if ((degrees - floor) < (ceiling - degrees)) {
+ degrees = floor;
+ } else {
+ degrees = ceiling;
+ }
+ }
+ return degrees;
+ }
+
+ public RadialTimePickerView(Context context, AttributeSet attrs) {
+ this(context, attrs, R.attr.timePickerStyle);
+ }
+
+ public RadialTimePickerView(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs);
+
+ // process style attributes
+ final TypedArray a = mContext.obtainStyledAttributes(attrs, R.styleable.TimePicker,
+ defStyle, 0);
+
+ final Resources res = getResources();
+
+ mAmPmUnselectedColor = a.getColor(R.styleable.TimePicker_amPmUnselectedBackgroundColor,
+ res.getColor(
+ R.color.timepicker_default_ampm_unselected_background_color_holo_light));
+
+ mAmPmSelectedColor = a.getColor(R.styleable.TimePicker_amPmSelectedBackgroundColor,
+ res.getColor(R.color.timepicker_default_ampm_selected_background_color_holo_light));
+
+ mAmPmTextColor = a.getColor(R.styleable.TimePicker_amPmTextColor,
+ res.getColor(R.color.timepicker_default_text_color_holo_light));
+
+ final int numbersTextColor = a.getColor(R.styleable.TimePicker_numbersTextColor,
+ res.getColor(R.color.timepicker_default_text_color_holo_light));
+
+ mTypeface = Typeface.create("sans-serif", Typeface.NORMAL);
+
+ mPaint[HOURS] = new Paint();
+ mPaint[HOURS].setColor(numbersTextColor);
+ mPaint[HOURS].setAntiAlias(true);
+ mPaint[HOURS].setTextAlign(Paint.Align.CENTER);
+
+ mPaint[MINUTES] = new Paint();
+ mPaint[MINUTES].setColor(numbersTextColor);
+ mPaint[MINUTES].setAntiAlias(true);
+ mPaint[MINUTES].setTextAlign(Paint.Align.CENTER);
+
+ mPaintCenter.setColor(numbersTextColor);
+ mPaintCenter.setAntiAlias(true);
+ mPaintCenter.setTextAlign(Paint.Align.CENTER);
+
+ mPaintSelector[HOURS][SELECTOR_CIRCLE] = new Paint();
+ mPaintSelector[HOURS][SELECTOR_CIRCLE].setColor(
+ a.getColor(R.styleable.TimePicker_numbersSelectorColor, R.color.holo_blue_light));
+ mPaintSelector[HOURS][SELECTOR_CIRCLE].setAntiAlias(true);
+
+ mPaintSelector[HOURS][SELECTOR_DOT] = new Paint();
+ mPaintSelector[HOURS][SELECTOR_DOT].setColor(
+ a.getColor(R.styleable.TimePicker_numbersSelectorColor, R.color.holo_blue_light));
+ mPaintSelector[HOURS][SELECTOR_DOT].setAntiAlias(true);
+
+ mPaintSelector[HOURS][SELECTOR_LINE] = new Paint();
+ mPaintSelector[HOURS][SELECTOR_LINE].setColor(
+ a.getColor(R.styleable.TimePicker_numbersSelectorColor, R.color.holo_blue_light));
+ mPaintSelector[HOURS][SELECTOR_LINE].setAntiAlias(true);
+ mPaintSelector[HOURS][SELECTOR_LINE].setStrokeWidth(2);
+
+ mPaintSelector[MINUTES][SELECTOR_CIRCLE] = new Paint();
+ mPaintSelector[MINUTES][SELECTOR_CIRCLE].setColor(
+ a.getColor(R.styleable.TimePicker_numbersSelectorColor, R.color.holo_blue_light));
+ mPaintSelector[MINUTES][SELECTOR_CIRCLE].setAntiAlias(true);
+
+ mPaintSelector[MINUTES][SELECTOR_DOT] = new Paint();
+ mPaintSelector[MINUTES][SELECTOR_DOT].setColor(
+ a.getColor(R.styleable.TimePicker_numbersSelectorColor, R.color.holo_blue_light));
+ mPaintSelector[MINUTES][SELECTOR_DOT].setAntiAlias(true);
+
+ mPaintSelector[MINUTES][SELECTOR_LINE] = new Paint();
+ mPaintSelector[MINUTES][SELECTOR_LINE].setColor(
+ a.getColor(R.styleable.TimePicker_numbersSelectorColor, R.color.holo_blue_light));
+ mPaintSelector[MINUTES][SELECTOR_LINE].setAntiAlias(true);
+ mPaintSelector[MINUTES][SELECTOR_LINE].setStrokeWidth(2);
+
+ mPaintAmPmText.setColor(mAmPmTextColor);
+ mPaintAmPmText.setTypeface(mTypeface);
+ mPaintAmPmText.setAntiAlias(true);
+ mPaintAmPmText.setTextAlign(Paint.Align.CENTER);
+
+ mPaintAmPmCircle[AM] = new Paint();
+ mPaintAmPmCircle[AM].setAntiAlias(true);
+ mPaintAmPmCircle[PM] = new Paint();
+ mPaintAmPmCircle[PM].setAntiAlias(true);
+
+ mPaintBackground.setColor(
+ a.getColor(R.styleable.TimePicker_numbersBackgroundColor, Color.WHITE));
+ mPaintBackground.setAntiAlias(true);
+
+ final int disabledColor = a.getColor(R.styleable.TimePicker_disabledColor,
+ res.getColor(R.color.timepicker_default_disabled_color_holo_light));
+ mPaintDisabled.setColor(disabledColor);
+ mPaintDisabled.setAntiAlias(true);
+
+ if (DEBUG) {
+ mPaintDebug.setColor(DEBUG_COLOR);
+ mPaintDebug.setAntiAlias(true);
+ mPaintDebug.setStrokeWidth(DEBUG_STROKE_WIDTH);
+ mPaintDebug.setStyle(Paint.Style.STROKE);
+ mPaintDebug.setTextAlign(Paint.Align.CENTER);
+ }
+
+ mShowHours = true;
+ mIs24HourMode = false;
+ mAmOrPm = AM;
+ mAmOrPmPressed = -1;
+
+ initHoursAndMinutesText();
+ initData();
+
+ mTransitionMidRadiusMultiplier = Float.parseFloat(
+ res.getString(R.string.timepicker_transition_mid_radius_multiplier));
+ mTransitionEndRadiusMultiplier = Float.parseFloat(
+ res.getString(R.string.timepicker_transition_end_radius_multiplier));
+
+ mTextGridHeights[HOURS] = new float[7];
+ mTextGridHeights[MINUTES] = new float[7];
+
+ mSelectionRadiusMultiplier = Float.parseFloat(
+ res.getString(R.string.timepicker_selection_radius_multiplier));
+
+ setOnTouchListener(this);
+
+ // Initial values
+ final Calendar calendar = Calendar.getInstance(Locale.getDefault());
+ final int currentHour = calendar.get(Calendar.HOUR_OF_DAY);
+ final int currentMinute = calendar.get(Calendar.MINUTE);
+
+ setCurrentHour(currentHour);
+ setCurrentMinute(currentMinute);
+
+ setHapticFeedbackEnabled(true);
+ }
+
+ /**
+ * Measure the view to end up as a square, based on the minimum of the height and width.
+ */
+ @Override
+ public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ int measuredWidth = MeasureSpec.getSize(widthMeasureSpec);
+ int widthMode = MeasureSpec.getMode(widthMeasureSpec);
+ int measuredHeight = MeasureSpec.getSize(heightMeasureSpec);
+ int heightMode = MeasureSpec.getMode(heightMeasureSpec);
+ int minDimension = Math.min(measuredWidth, measuredHeight);
+
+ super.onMeasure(MeasureSpec.makeMeasureSpec(minDimension, widthMode),
+ MeasureSpec.makeMeasureSpec(minDimension, heightMode));
+ }
+
+ public void initialize(int hour, int minute, boolean is24HourMode) {
+ mIs24HourMode = is24HourMode;
+ setCurrentHour(hour);
+ setCurrentMinute(minute);
+ }
+
+ public void setCurrentItemShowing(int item, boolean animate) {
+ switch (item){
+ case HOURS:
+ showHours(animate);
+ break;
+ case MINUTES:
+ showMinutes(animate);
+ break;
+ default:
+ Log.e(TAG, "ClockView does not support showing item " + item);
+ }
+ }
+
+ public int getCurrentItemShowing() {
+ return mShowHours ? HOURS : MINUTES;
+ }
+
+ public void setOnValueSelectedListener(OnValueSelectedListener listener) {
+ mListener = listener;
+ }
+
+ public void setCurrentHour(int hour) {
+ final int degrees = (hour % 12) * DEGREES_FOR_ONE_HOUR;
+ mSelectionDegrees[HOURS] = degrees;
+ mSelectionDegrees[HOURS_INNER] = degrees;
+ mAmOrPm = ((hour % 24) < 12) ? AM : PM;
+ if (mIs24HourMode) {
+ mIsOnInnerCircle = (mAmOrPm == AM);
+ } else {
+ mIsOnInnerCircle = false;
+ }
+ initData();
+ updateLayoutData();
+ invalidate();
+ }
+
+ // Return hours in 0-23 range
+ public int getCurrentHour() {
+ int hours =
+ mSelectionDegrees[mIsOnInnerCircle ? HOURS_INNER : HOURS] / DEGREES_FOR_ONE_HOUR;
+ if (mIs24HourMode) {
+ if (mIsOnInnerCircle) {
+ hours = hours % 12;
+ } else {
+ if (hours != 0) {
+ hours += 12;
+ }
+ }
+ } else {
+ hours = hours % 12;
+ if (hours == 0) {
+ if (mAmOrPm == PM) {
+ hours = 12;
+ }
+ } else {
+ if (mAmOrPm == PM) {
+ hours += 12;
+ }
+ }
+ }
+ return hours;
+ }
+
+ public void setCurrentMinute(int minute) {
+ mSelectionDegrees[MINUTES] = (minute % 60) * DEGREES_FOR_ONE_MINUTE;
+ invalidate();
+ }
+
+ // Returns minutes in 0-59 range
+ public int getCurrentMinute() {
+ return (mSelectionDegrees[MINUTES] / DEGREES_FOR_ONE_MINUTE);
+ }
+
+ public void setAmOrPm(int val) {
+ mAmOrPm = (val % 2);
+ invalidate();
+ }
+
+ public int getAmOrPm() {
+ return mAmOrPm;
+ }
+
+ public void swapAmPm() {
+ mAmOrPm = (mAmOrPm == AM) ? PM : AM;
+ invalidate();
+ }
+
+ public void showHours(boolean animate) {
+ if (mShowHours) return;
+ mShowHours = true;
+ if (animate) {
+ startMinutesToHoursAnimation();
+ }
+ initData();
+ updateLayoutData();
+ invalidate();
+ }
+
+ public void showMinutes(boolean animate) {
+ if (!mShowHours) return;
+ mShowHours = false;
+ if (animate) {
+ startHoursToMinutesAnimation();
+ }
+ initData();
+ updateLayoutData();
+ invalidate();
+ }
+
+ private void initHoursAndMinutesText() {
+ // Initialize the hours and minutes numbers.
+ for (int i = 0; i < 12; i++) {
+ mHours12Texts[i] = String.format("%d", HOURS_NUMBERS[i]);
+ mOuterHours24Texts[i] = String.format("%02d", HOURS_NUMBERS_24[i]);
+ mInnerHours24Texts[i] = String.format("%d", HOURS_NUMBERS[i]);
+ mMinutesTexts[i] = String.format("%02d", MINUTES_NUMBERS[i]);
+ }
+
+ String[] amPmTexts = new DateFormatSymbols().getAmPmStrings();
+ mAmPmText[AM] = amPmTexts[0];
+ mAmPmText[PM] = amPmTexts[1];
+ }
+
+ private void initData() {
+ if (mIs24HourMode) {
+ mOuterTextHours = mOuterHours24Texts;
+ mInnerTextHours = mInnerHours24Texts;
+ } else {
+ mOuterTextHours = mHours12Texts;
+ mInnerTextHours = null;
+ }
+
+ mOuterTextMinutes = mMinutesTexts;
+
+ final Resources res = getResources();
+
+ if (mShowHours) {
+ if (mIs24HourMode) {
+ mCircleRadiusMultiplier[HOURS] = Float.parseFloat(
+ res.getString(R.string.timepicker_circle_radius_multiplier_24HourMode));
+ mNumbersRadiusMultiplier[HOURS] = Float.parseFloat(
+ res.getString(R.string.timepicker_numbers_radius_multiplier_outer));
+ mTextSizeMultiplier[HOURS] = Float.parseFloat(
+ res.getString(R.string.timepicker_text_size_multiplier_outer));
+
+ mNumbersRadiusMultiplier[HOURS_INNER] = Float.parseFloat(
+ res.getString(R.string.timepicker_numbers_radius_multiplier_inner));
+ mTextSizeMultiplier[HOURS_INNER] = Float.parseFloat(
+ res.getString(R.string.timepicker_text_size_multiplier_inner));
+ } else {
+ mCircleRadiusMultiplier[HOURS] = Float.parseFloat(
+ res.getString(R.string.timepicker_circle_radius_multiplier));
+ mNumbersRadiusMultiplier[HOURS] = Float.parseFloat(
+ res.getString(R.string.timepicker_numbers_radius_multiplier_normal));
+ mTextSizeMultiplier[HOURS] = Float.parseFloat(
+ res.getString(R.string.timepicker_text_size_multiplier_normal));
+ }
+ } else {
+ mCircleRadiusMultiplier[MINUTES] = Float.parseFloat(
+ res.getString(R.string.timepicker_circle_radius_multiplier));
+ mNumbersRadiusMultiplier[MINUTES] = Float.parseFloat(
+ res.getString(R.string.timepicker_numbers_radius_multiplier_normal));
+ mTextSizeMultiplier[MINUTES] = Float.parseFloat(
+ res.getString(R.string.timepicker_text_size_multiplier_normal));
+ }
+
+ mAnimationRadiusMultiplier[HOURS] = 1;
+ mAnimationRadiusMultiplier[HOURS_INNER] = 1;
+ mAnimationRadiusMultiplier[MINUTES] = 1;
+
+ mAmPmCircleRadiusMultiplier = Float.parseFloat(
+ res.getString(R.string.timepicker_ampm_circle_radius_multiplier));
+
+ mPaint[HOURS].setAlpha(mShowHours ? ALPHA_OPAQUE : ALPHA_TRANSPARENT);
+ mPaint[MINUTES].setAlpha(mShowHours ? ALPHA_TRANSPARENT : ALPHA_OPAQUE);
+
+ mPaintSelector[HOURS][SELECTOR_CIRCLE].setAlpha(
+ mShowHours ?ALPHA_SELECTOR : ALPHA_TRANSPARENT);
+ mPaintSelector[HOURS][SELECTOR_DOT].setAlpha(
+ mShowHours ? ALPHA_OPAQUE : ALPHA_TRANSPARENT);
+ mPaintSelector[HOURS][SELECTOR_LINE].setAlpha(
+ mShowHours ? ALPHA_SELECTOR : ALPHA_TRANSPARENT);
+
+ mPaintSelector[MINUTES][SELECTOR_CIRCLE].setAlpha(
+ mShowHours ? ALPHA_TRANSPARENT : ALPHA_SELECTOR);
+ mPaintSelector[MINUTES][SELECTOR_DOT].setAlpha(
+ mShowHours ? ALPHA_TRANSPARENT : ALPHA_OPAQUE);
+ mPaintSelector[MINUTES][SELECTOR_LINE].setAlpha(
+ mShowHours ? ALPHA_TRANSPARENT : ALPHA_SELECTOR);
+ }
+
+ @Override
+ protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
+ updateLayoutData();
+ }
+
+ private void updateLayoutData() {
+ mXCenter = getWidth() / 2;
+ mYCenter = getHeight() / 2;
+
+ final int min = Math.min(mXCenter, mYCenter);
+
+ mCircleRadius[HOURS] = min * mCircleRadiusMultiplier[HOURS];
+ mCircleRadius[HOURS_INNER] = min * mCircleRadiusMultiplier[HOURS];
+ mCircleRadius[MINUTES] = min * mCircleRadiusMultiplier[MINUTES];
+
+ if (!mIs24HourMode) {
+ // We'll need to draw the AM/PM circles, so the main circle will need to have
+ // a slightly higher center. To keep the entire view centered vertically, we'll
+ // have to push it up by half the radius of the AM/PM circles.
+ int amPmCircleRadius = (int) (mCircleRadius[HOURS] * mAmPmCircleRadiusMultiplier);
+ mYCenter -= amPmCircleRadius / 2;
+ }
+
+ mMinHypotenuseForInnerNumber = (int) (mCircleRadius[HOURS]
+ * mNumbersRadiusMultiplier[HOURS_INNER]) - mSelectionRadius[HOURS];
+ mMaxHypotenuseForOuterNumber = (int) (mCircleRadius[HOURS]
+ * mNumbersRadiusMultiplier[HOURS]) + mSelectionRadius[HOURS];
+ mHalfwayHypotenusePoint = (int) (mCircleRadius[HOURS]
+ * ((mNumbersRadiusMultiplier[HOURS] + mNumbersRadiusMultiplier[HOURS_INNER]) / 2));
+
+ mTextSize[HOURS] = mCircleRadius[HOURS] * mTextSizeMultiplier[HOURS];
+ mTextSize[MINUTES] = mCircleRadius[MINUTES] * mTextSizeMultiplier[MINUTES];
+
+ if (mIs24HourMode) {
+ mInnerTextSize = mCircleRadius[HOURS] * mTextSizeMultiplier[HOURS_INNER];
+ }
+
+ calculateGridSizesHours();
+ calculateGridSizesMinutes();
+
+ mSelectionRadius[HOURS] = (int) (mCircleRadius[HOURS] * mSelectionRadiusMultiplier);
+ mSelectionRadius[HOURS_INNER] = mSelectionRadius[HOURS];
+ mSelectionRadius[MINUTES] = (int) (mCircleRadius[MINUTES] * mSelectionRadiusMultiplier);
+
+ mAmPmCircleRadius = (int) (mCircleRadius[HOURS] * mAmPmCircleRadiusMultiplier);
+ mPaintAmPmText.setTextSize(mAmPmCircleRadius * 3 / 4);
+
+ // Line up the vertical center of the AM/PM circles with the bottom of the main circle.
+ mAmPmYCenter = mYCenter + mCircleRadius[HOURS];
+
+ // Line up the horizontal edges of the AM/PM circles with the horizontal edges
+ // of the main circle
+ mLeftIndicatorXCenter = mXCenter - mCircleRadius[HOURS] + mAmPmCircleRadius;
+ mRightIndicatorXCenter = mXCenter + mCircleRadius[HOURS] - mAmPmCircleRadius;
+ }
+
+ @Override
+ public void onDraw(Canvas canvas) {
+ canvas.save();
+
+ calculateGridSizesHours();
+ calculateGridSizesMinutes();
+
+ drawCircleBackground(canvas);
+
+ drawTextElements(canvas, mTextSize[HOURS], mTypeface, mOuterTextHours,
+ mTextGridWidths[HOURS], mTextGridHeights[HOURS], mPaint[HOURS]);
+
+ if (mIs24HourMode && mInnerTextHours != null) {
+ drawTextElements(canvas, mInnerTextSize, mTypeface, mInnerTextHours,
+ mInnerTextGridWidths, mInnerTextGridHeights, mPaint[HOURS]);
+ }
+
+ drawTextElements(canvas, mTextSize[MINUTES], mTypeface, mOuterTextMinutes,
+ mTextGridWidths[MINUTES], mTextGridHeights[MINUTES], mPaint[MINUTES]);
+
+ drawCenter(canvas);
+ drawSelector(canvas);
+ if (!mIs24HourMode) {
+ drawAmPm(canvas);
+ }
+
+ if(!mInputEnabled) {
+ // Draw outer view rectangle
+ mRectF.set(0, 0, getWidth(), getHeight());
+ canvas.drawRect(mRectF, mPaintDisabled);
+ }
+
+ if (DEBUG) {
+ drawDebug(canvas);
+ }
+
+ canvas.restore();
+ }
+
+ private void drawCircleBackground(Canvas canvas) {
+ canvas.drawCircle(mXCenter, mYCenter, mCircleRadius[HOURS], mPaintBackground);
+ }
+
+ private void drawCenter(Canvas canvas) {
+ canvas.drawCircle(mXCenter, mYCenter, CENTER_RADIUS, mPaintCenter);
+ }
+
+ private void drawSelector(Canvas canvas) {
+ drawSelector(canvas, mIsOnInnerCircle ? HOURS_INNER : HOURS);
+ drawSelector(canvas, MINUTES);
+ }
+
+ private void drawAmPm(Canvas canvas) {
+ final boolean isLayoutRtl = isLayoutRtl();
+
+ int amColor = mAmPmUnselectedColor;
+ int amAlpha = ALPHA_OPAQUE;
+ int pmColor = mAmPmUnselectedColor;
+ int pmAlpha = ALPHA_OPAQUE;
+ if (mAmOrPm == AM) {
+ amColor = mAmPmSelectedColor;
+ amAlpha = ALPHA_AMPM_SELECTED;
+ } else if (mAmOrPm == PM) {
+ pmColor = mAmPmSelectedColor;
+ pmAlpha = ALPHA_AMPM_SELECTED;
+ }
+ if (mAmOrPmPressed == AM) {
+ amColor = mAmPmSelectedColor;
+ amAlpha = ALPHA_AMPM_PRESSED;
+ } else if (mAmOrPmPressed == PM) {
+ pmColor = mAmPmSelectedColor;
+ pmAlpha = ALPHA_AMPM_PRESSED;
+ }
+
+ // Draw the two circles
+ mPaintAmPmCircle[AM].setColor(amColor);
+ mPaintAmPmCircle[AM].setAlpha(amAlpha);
+ canvas.drawCircle(isLayoutRtl ? mRightIndicatorXCenter : mLeftIndicatorXCenter,
+ mAmPmYCenter, mAmPmCircleRadius, mPaintAmPmCircle[AM]);
+
+ mPaintAmPmCircle[PM].setColor(pmColor);
+ mPaintAmPmCircle[PM].setAlpha(pmAlpha);
+ canvas.drawCircle(isLayoutRtl ? mLeftIndicatorXCenter : mRightIndicatorXCenter,
+ mAmPmYCenter, mAmPmCircleRadius, mPaintAmPmCircle[PM]);
+
+ // Draw the AM/PM texts on top
+ mPaintAmPmText.setColor(mAmPmTextColor);
+ float textYCenter = mAmPmYCenter -
+ (int) (mPaintAmPmText.descent() + mPaintAmPmText.ascent()) / 2;
+
+ canvas.drawText(isLayoutRtl ? mAmPmText[PM] : mAmPmText[AM], mLeftIndicatorXCenter,
+ textYCenter, mPaintAmPmText);
+ canvas.drawText(isLayoutRtl ? mAmPmText[AM] : mAmPmText[PM], mRightIndicatorXCenter,
+ textYCenter, mPaintAmPmText);
+ }
+
+ private void drawSelector(Canvas canvas, int index) {
+ // Calculate the current radius at which to place the selection circle.
+ mLineLength[index] = (int) (mCircleRadius[index]
+ * mNumbersRadiusMultiplier[index] * mAnimationRadiusMultiplier[index]);
+
+ double selectionRadians = Math.toRadians(mSelectionDegrees[index]);
+
+ int pointX = mXCenter + (int) (mLineLength[index] * Math.sin(selectionRadians));
+ int pointY = mYCenter - (int) (mLineLength[index] * Math.cos(selectionRadians));
+
+ // Draw the selection circle
+ canvas.drawCircle(pointX, pointY, mSelectionRadius[index],
+ mPaintSelector[index % 2][SELECTOR_CIRCLE]);
+
+ // Draw the dot if needed
+ if (mSelectionDegrees[index] % 30 != 0) {
+ // We're not on a direct tick
+ canvas.drawCircle(pointX, pointY, (mSelectionRadius[index] * 2 / 7),
+ mPaintSelector[index % 2][SELECTOR_DOT]);
+ } else {
+ // We're not drawing the dot, so shorten the line to only go as far as the edge of the
+ // selection circle
+ int lineLength = mLineLength[index] - mSelectionRadius[index];
+ pointX = mXCenter + (int) (lineLength * Math.sin(selectionRadians));
+ pointY = mYCenter - (int) (lineLength * Math.cos(selectionRadians));
+ }
+
+ // Draw the line
+ canvas.drawLine(mXCenter, mYCenter, pointX, pointY,
+ mPaintSelector[index % 2][SELECTOR_LINE]);
+ }
+
+ private void drawDebug(Canvas canvas) {
+ // Draw outer numbers circle
+ final float outerRadius = mCircleRadius[HOURS] * mNumbersRadiusMultiplier[HOURS];
+ canvas.drawCircle(mXCenter, mYCenter, outerRadius, mPaintDebug);
+
+ // Draw inner numbers circle
+ final float innerRadius = mCircleRadius[HOURS] * mNumbersRadiusMultiplier[HOURS_INNER];
+ canvas.drawCircle(mXCenter, mYCenter, innerRadius, mPaintDebug);
+
+ // Draw outer background circle
+ canvas.drawCircle(mXCenter, mYCenter, mCircleRadius[HOURS], mPaintDebug);
+
+ // Draw outer rectangle for circles
+ float left = mXCenter - outerRadius;
+ float top = mYCenter - outerRadius;
+ float right = mXCenter + outerRadius;
+ float bottom = mYCenter + outerRadius;
+ mRectF = new RectF(left, top, right, bottom);
+ canvas.drawRect(mRectF, mPaintDebug);
+
+ // Draw outer rectangle for background
+ left = mXCenter - mCircleRadius[HOURS];
+ top = mYCenter - mCircleRadius[HOURS];
+ right = mXCenter + mCircleRadius[HOURS];
+ bottom = mYCenter + mCircleRadius[HOURS];
+ mRectF.set(left, top, right, bottom);
+ canvas.drawRect(mRectF, mPaintDebug);
+
+ // Draw outer view rectangle
+ mRectF.set(0, 0, getWidth(), getHeight());
+ canvas.drawRect(mRectF, mPaintDebug);
+
+ // Draw selected time
+ final String selected = String.format("%02d:%02d", getCurrentHour(), getCurrentMinute());
+
+ ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
+ ViewGroup.LayoutParams.WRAP_CONTENT);
+ TextView tv = new TextView(getContext());
+ tv.setLayoutParams(lp);
+ tv.setText(selected);
+ tv.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
+ Paint paint = tv.getPaint();
+ paint.setColor(DEBUG_TEXT_COLOR);
+
+ final int width = tv.getMeasuredWidth();
+
+ float height = paint.descent() - paint.ascent();
+ float x = mXCenter - width / 2;
+ float y = mYCenter + 1.5f * height;
+
+ canvas.drawText(selected.toString(), x, y, paint);
+ }
+
+ private void calculateGridSizesHours() {
+ // Calculate the text positions
+ float numbersRadius = mCircleRadius[HOURS]
+ * mNumbersRadiusMultiplier[HOURS] * mAnimationRadiusMultiplier[HOURS];
+
+ // Calculate the positions for the 12 numbers in the main circle.
+ calculateGridSizes(mPaint[HOURS], numbersRadius, mXCenter, mYCenter,
+ mTextSize[HOURS], mTextGridHeights[HOURS], mTextGridWidths[HOURS]);
+
+ // If we have an inner circle, calculate those positions too.
+ if (mIs24HourMode) {
+ float innerNumbersRadius = mCircleRadius[HOURS_INNER]
+ * mNumbersRadiusMultiplier[HOURS_INNER]
+ * mAnimationRadiusMultiplier[HOURS_INNER];
+
+ calculateGridSizes(mPaint[HOURS], innerNumbersRadius, mXCenter, mYCenter,
+ mInnerTextSize, mInnerTextGridHeights, mInnerTextGridWidths);
+ }
+ }
+
+ private void calculateGridSizesMinutes() {
+ // Calculate the text positions
+ float numbersRadius = mCircleRadius[MINUTES]
+ * mNumbersRadiusMultiplier[MINUTES] * mAnimationRadiusMultiplier[MINUTES];
+
+ // Calculate the positions for the 12 numbers in the main circle.
+ calculateGridSizes(mPaint[MINUTES], numbersRadius, mXCenter, mYCenter,
+ mTextSize[MINUTES], mTextGridHeights[MINUTES], mTextGridWidths[MINUTES]);
+ }
+
+
+ /**
+ * Using the trigonometric Unit Circle, calculate the positions that the text will need to be
+ * drawn at based on the specified circle radius. Place the values in the textGridHeights and
+ * textGridWidths parameters.
+ */
+ private static void calculateGridSizes(Paint paint, float numbersRadius, float xCenter,
+ float yCenter, float textSize, float[] textGridHeights, float[] textGridWidths) {
+ /*
+ * The numbers need to be drawn in a 7x7 grid, representing the points on the Unit Circle.
+ */
+ final float offset1 = numbersRadius;
+ // cos(30) = a / r => r * cos(30)
+ final float offset2 = numbersRadius * COSINE_30_DEGREES;
+ // sin(30) = o / r => r * sin(30)
+ final float offset3 = numbersRadius * SINE_30_DEGREES;
+
+ paint.setTextSize(textSize);
+ // We'll need yTextBase to be slightly lower to account for the text's baseline.
+ yCenter -= (paint.descent() + paint.ascent()) / 2;
+
+ textGridHeights[0] = yCenter - offset1;
+ textGridWidths[0] = xCenter - offset1;
+ textGridHeights[1] = yCenter - offset2;
+ textGridWidths[1] = xCenter - offset2;
+ textGridHeights[2] = yCenter - offset3;
+ textGridWidths[2] = xCenter - offset3;
+ textGridHeights[3] = yCenter;
+ textGridWidths[3] = xCenter;
+ textGridHeights[4] = yCenter + offset3;
+ textGridWidths[4] = xCenter + offset3;
+ textGridHeights[5] = yCenter + offset2;
+ textGridWidths[5] = xCenter + offset2;
+ textGridHeights[6] = yCenter + offset1;
+ textGridWidths[6] = xCenter + offset1;
+ }
+
+ /**
+ * Draw the 12 text values at the positions specified by the textGrid parameters.
+ */
+ private void drawTextElements(Canvas canvas, float textSize, Typeface typeface, String[] texts,
+ float[] textGridWidths, float[] textGridHeights, Paint paint) {
+ paint.setTextSize(textSize);
+ paint.setTypeface(typeface);
+ canvas.drawText(texts[0], textGridWidths[3], textGridHeights[0], paint);
+ canvas.drawText(texts[1], textGridWidths[4], textGridHeights[1], paint);
+ canvas.drawText(texts[2], textGridWidths[5], textGridHeights[2], paint);
+ canvas.drawText(texts[3], textGridWidths[6], textGridHeights[3], paint);
+ canvas.drawText(texts[4], textGridWidths[5], textGridHeights[4], paint);
+ canvas.drawText(texts[5], textGridWidths[4], textGridHeights[5], paint);
+ canvas.drawText(texts[6], textGridWidths[3], textGridHeights[6], paint);
+ canvas.drawText(texts[7], textGridWidths[2], textGridHeights[5], paint);
+ canvas.drawText(texts[8], textGridWidths[1], textGridHeights[4], paint);
+ canvas.drawText(texts[9], textGridWidths[0], textGridHeights[3], paint);
+ canvas.drawText(texts[10], textGridWidths[1], textGridHeights[2], paint);
+ canvas.drawText(texts[11], textGridWidths[2], textGridHeights[1], paint);
+ }
+
+ // Used for animating the hours by changing their radius
+ private void setAnimationRadiusMultiplierHours(float animationRadiusMultiplier) {
+ mAnimationRadiusMultiplier[HOURS] = animationRadiusMultiplier;
+ mAnimationRadiusMultiplier[HOURS_INNER] = animationRadiusMultiplier;
+ }
+
+ // Used for animating the minutes by changing their radius
+ private void setAnimationRadiusMultiplierMinutes(float animationRadiusMultiplier) {
+ mAnimationRadiusMultiplier[MINUTES] = animationRadiusMultiplier;
+ }
+
+ private static ObjectAnimator getRadiusDisappearAnimator(Object target,
+ String radiusPropertyName, InvalidateUpdateListener updateListener,
+ float midRadiusMultiplier, float endRadiusMultiplier) {
+ Keyframe kf0, kf1, kf2;
+ float midwayPoint = 0.2f;
+ int duration = 500;
+
+ kf0 = Keyframe.ofFloat(0f, 1);
+ kf1 = Keyframe.ofFloat(midwayPoint, midRadiusMultiplier);
+ kf2 = Keyframe.ofFloat(1f, endRadiusMultiplier);
+ PropertyValuesHolder radiusDisappear = PropertyValuesHolder.ofKeyframe(
+ radiusPropertyName, kf0, kf1, kf2);
+
+ ObjectAnimator animator = ObjectAnimator.ofPropertyValuesHolder(
+ target, radiusDisappear).setDuration(duration);
+ animator.addUpdateListener(updateListener);
+ return animator;
+ }
+
+ private static ObjectAnimator getRadiusReappearAnimator(Object target,
+ String radiusPropertyName, InvalidateUpdateListener updateListener,
+ float midRadiusMultiplier, float endRadiusMultiplier) {
+ Keyframe kf0, kf1, kf2, kf3;
+ float midwayPoint = 0.2f;
+ int duration = 500;
+
+ // Set up animator for reappearing.
+ float delayMultiplier = 0.25f;
+ float transitionDurationMultiplier = 1f;
+ float totalDurationMultiplier = transitionDurationMultiplier + delayMultiplier;
+ int totalDuration = (int) (duration * totalDurationMultiplier);
+ float delayPoint = (delayMultiplier * duration) / totalDuration;
+ midwayPoint = 1 - (midwayPoint * (1 - delayPoint));
+
+ kf0 = Keyframe.ofFloat(0f, endRadiusMultiplier);
+ kf1 = Keyframe.ofFloat(delayPoint, endRadiusMultiplier);
+ kf2 = Keyframe.ofFloat(midwayPoint, midRadiusMultiplier);
+ kf3 = Keyframe.ofFloat(1f, 1);
+ PropertyValuesHolder radiusReappear = PropertyValuesHolder.ofKeyframe(
+ radiusPropertyName, kf0, kf1, kf2, kf3);
+
+ ObjectAnimator animator = ObjectAnimator.ofPropertyValuesHolder(
+ target, radiusReappear).setDuration(totalDuration);
+ animator.addUpdateListener(updateListener);
+ return animator;
+ }
+
+ private static ObjectAnimator getFadeOutAnimator(Object target, int startAlpha, int endAlpha,
+ InvalidateUpdateListener updateListener) {
+ int duration = 500;
+ ObjectAnimator animator = ObjectAnimator.ofInt(target, "alpha", startAlpha, endAlpha);
+ animator.setDuration(duration);
+ animator.addUpdateListener(updateListener);
+
+ return animator;
+ }
+
+ private static ObjectAnimator getFadeInAnimator(Object target, int startAlpha, int endAlpha,
+ InvalidateUpdateListener updateListener) {
+ Keyframe kf0, kf1, kf2;
+ int duration = 500;
+
+ // Set up animator for reappearing.
+ float delayMultiplier = 0.25f;
+ float transitionDurationMultiplier = 1f;
+ float totalDurationMultiplier = transitionDurationMultiplier + delayMultiplier;
+ int totalDuration = (int) (duration * totalDurationMultiplier);
+ float delayPoint = (delayMultiplier * duration) / totalDuration;
+
+ kf0 = Keyframe.ofInt(0f, startAlpha);
+ kf1 = Keyframe.ofInt(delayPoint, startAlpha);
+ kf2 = Keyframe.ofInt(1f, endAlpha);
+ PropertyValuesHolder fadeIn = PropertyValuesHolder.ofKeyframe("alpha", kf0, kf1, kf2);
+
+ ObjectAnimator animator = ObjectAnimator.ofPropertyValuesHolder(
+ target, fadeIn).setDuration(totalDuration);
+ animator.addUpdateListener(updateListener);
+ return animator;
+ }
+
+ private class InvalidateUpdateListener implements ValueAnimator.AnimatorUpdateListener {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ RadialTimePickerView.this.invalidate();
+ }
+ }
+
+ private void startHoursToMinutesAnimation() {
+ if (mHoursToMinutesAnims.size() == 0) {
+ mHoursToMinutesAnims.add(getRadiusDisappearAnimator(this,
+ "animationRadiusMultiplierHours", mInvalidateUpdateListener,
+ mTransitionMidRadiusMultiplier, mTransitionEndRadiusMultiplier));
+ mHoursToMinutesAnims.add(getFadeOutAnimator(mPaint[HOURS],
+ ALPHA_OPAQUE, ALPHA_TRANSPARENT, mInvalidateUpdateListener));
+ mHoursToMinutesAnims.add(getFadeOutAnimator(mPaintSelector[HOURS][SELECTOR_CIRCLE],
+ ALPHA_SELECTOR, ALPHA_TRANSPARENT, mInvalidateUpdateListener));
+ mHoursToMinutesAnims.add(getFadeOutAnimator(mPaintSelector[HOURS][SELECTOR_DOT],
+ ALPHA_OPAQUE, ALPHA_TRANSPARENT, mInvalidateUpdateListener));
+ mHoursToMinutesAnims.add(getFadeOutAnimator(mPaintSelector[HOURS][SELECTOR_LINE],
+ ALPHA_SELECTOR, ALPHA_TRANSPARENT, mInvalidateUpdateListener));
+
+ mHoursToMinutesAnims.add(getRadiusReappearAnimator(this,
+ "animationRadiusMultiplierMinutes", mInvalidateUpdateListener,
+ mTransitionMidRadiusMultiplier, mTransitionEndRadiusMultiplier));
+ mHoursToMinutesAnims.add(getFadeInAnimator(mPaint[MINUTES],
+ ALPHA_TRANSPARENT, ALPHA_OPAQUE, mInvalidateUpdateListener));
+ mHoursToMinutesAnims.add(getFadeInAnimator(mPaintSelector[MINUTES][SELECTOR_CIRCLE],
+ ALPHA_TRANSPARENT, ALPHA_SELECTOR, mInvalidateUpdateListener));
+ mHoursToMinutesAnims.add(getFadeInAnimator(mPaintSelector[MINUTES][SELECTOR_DOT],
+ ALPHA_TRANSPARENT, ALPHA_OPAQUE, mInvalidateUpdateListener));
+ mHoursToMinutesAnims.add(getFadeInAnimator(mPaintSelector[MINUTES][SELECTOR_LINE],
+ ALPHA_TRANSPARENT, ALPHA_SELECTOR, mInvalidateUpdateListener));
+ }
+
+ if (mTransition != null && mTransition.isRunning()) {
+ mTransition.end();
+ }
+ mTransition = new AnimatorSet();
+ mTransition.playTogether(mHoursToMinutesAnims);
+ mTransition.start();
+ }
+
+ private void startMinutesToHoursAnimation() {
+ if (mMinuteToHoursAnims.size() == 0) {
+ mMinuteToHoursAnims.add(getRadiusDisappearAnimator(this,
+ "animationRadiusMultiplierMinutes", mInvalidateUpdateListener,
+ mTransitionMidRadiusMultiplier, mTransitionEndRadiusMultiplier));
+ mMinuteToHoursAnims.add(getFadeOutAnimator(mPaint[MINUTES],
+ ALPHA_OPAQUE, ALPHA_TRANSPARENT, mInvalidateUpdateListener));
+ mMinuteToHoursAnims.add(getFadeOutAnimator(mPaintSelector[MINUTES][SELECTOR_CIRCLE],
+ ALPHA_SELECTOR, ALPHA_TRANSPARENT, mInvalidateUpdateListener));
+ mMinuteToHoursAnims.add(getFadeOutAnimator(mPaintSelector[MINUTES][SELECTOR_DOT],
+ ALPHA_OPAQUE, ALPHA_TRANSPARENT, mInvalidateUpdateListener));
+ mMinuteToHoursAnims.add(getFadeOutAnimator(mPaintSelector[MINUTES][SELECTOR_LINE],
+ ALPHA_SELECTOR, ALPHA_TRANSPARENT, mInvalidateUpdateListener));
+
+ mMinuteToHoursAnims.add(getRadiusReappearAnimator(this,
+ "animationRadiusMultiplierHours", mInvalidateUpdateListener,
+ mTransitionMidRadiusMultiplier, mTransitionEndRadiusMultiplier));
+ mMinuteToHoursAnims.add(getFadeInAnimator(mPaint[HOURS],
+ ALPHA_TRANSPARENT, ALPHA_OPAQUE, mInvalidateUpdateListener));
+ mMinuteToHoursAnims.add(getFadeInAnimator(mPaintSelector[HOURS][SELECTOR_CIRCLE],
+ ALPHA_TRANSPARENT, ALPHA_SELECTOR, mInvalidateUpdateListener));
+ mMinuteToHoursAnims.add(getFadeInAnimator(mPaintSelector[HOURS][SELECTOR_DOT],
+ ALPHA_TRANSPARENT, ALPHA_OPAQUE, mInvalidateUpdateListener));
+ mMinuteToHoursAnims.add(getFadeInAnimator(mPaintSelector[HOURS][SELECTOR_LINE],
+ ALPHA_TRANSPARENT, ALPHA_SELECTOR, mInvalidateUpdateListener));
+ }
+
+ if (mTransition != null && mTransition.isRunning()) {
+ mTransition.end();
+ }
+ mTransition = new AnimatorSet();
+ mTransition.playTogether(mMinuteToHoursAnims);
+ mTransition.start();
+ }
+
+ private int getDegreesFromXY(float x, float y) {
+ final double hypotenuse = Math.sqrt(
+ (y - mYCenter) * (y - mYCenter) + (x - mXCenter) * (x - mXCenter));
+
+ // Basic check if we're outside the range of the disk
+ if (hypotenuse > mCircleRadius[HOURS]) {
+ return -1;
+ }
+ // Check
+ if (mIs24HourMode && mShowHours) {
+ if (hypotenuse >= mMinHypotenuseForInnerNumber
+ && hypotenuse <= mHalfwayHypotenusePoint) {
+ mIsOnInnerCircle = true;
+ } else if (hypotenuse <= mMaxHypotenuseForOuterNumber
+ && hypotenuse >= mHalfwayHypotenusePoint) {
+ mIsOnInnerCircle = false;
+ } else {
+ return -1;
+ }
+ } else {
+ final int index = (mShowHours) ? HOURS : MINUTES;
+ final float length = (mCircleRadius[index] * mNumbersRadiusMultiplier[index]);
+ final int distanceToNumber = (int) Math.abs(hypotenuse - length);
+ final int maxAllowedDistance =
+ (int) (mCircleRadius[index] * (1 - mNumbersRadiusMultiplier[index]));
+ if (distanceToNumber > maxAllowedDistance) {
+ return -1;
+ }
+ }
+
+ final float opposite = Math.abs(y - mYCenter);
+ double degrees = Math.toDegrees(Math.asin(opposite / hypotenuse));
+
+ // Now we have to translate to the correct quadrant.
+ boolean rightSide = (x > mXCenter);
+ boolean topSide = (y < mYCenter);
+ if (rightSide && topSide) {
+ degrees = 90 - degrees;
+ } else if (rightSide && !topSide) {
+ degrees = 90 + degrees;
+ } else if (!rightSide && !topSide) {
+ degrees = 270 - degrees;
+ } else if (!rightSide && topSide) {
+ degrees = 270 + degrees;
+ }
+ return (int) degrees;
+ }
+
+ private int getIsTouchingAmOrPm(float x, float y) {
+ final boolean isLayoutRtl = isLayoutRtl();
+ int squaredYDistance = (int) ((y - mAmPmYCenter) * (y - mAmPmYCenter));
+
+ int distanceToAmCenter = (int) Math.sqrt(
+ (x - mLeftIndicatorXCenter) * (x - mLeftIndicatorXCenter) + squaredYDistance);
+ if (distanceToAmCenter <= mAmPmCircleRadius) {
+ return (isLayoutRtl ? PM : AM);
+ }
+
+ int distanceToPmCenter = (int) Math.sqrt(
+ (x - mRightIndicatorXCenter) * (x - mRightIndicatorXCenter) + squaredYDistance);
+ if (distanceToPmCenter <= mAmPmCircleRadius) {
+ return (isLayoutRtl ? AM : PM);
+ }
+
+ // Neither was close enough.
+ return -1;
+ }
+
+ @Override
+ public boolean onTouch(View v, MotionEvent event) {
+ if(!mInputEnabled) {
+ return true;
+ }
+
+ final float eventX = event.getX();
+ final float eventY = event.getY();
+
+ int degrees;
+ int snapDegrees;
+ boolean result = false;
+
+ switch(event.getAction()) {
+ case MotionEvent.ACTION_DOWN:
+ case MotionEvent.ACTION_MOVE:
+ mAmOrPmPressed = getIsTouchingAmOrPm(eventX, eventY);
+ if (mAmOrPmPressed != -1) {
+ result = true;
+ } else {
+ degrees = getDegreesFromXY(eventX, eventY);
+ if (degrees != -1) {
+ snapDegrees = (mShowHours ?
+ snapOnly30s(degrees, 0) : snapPrefer30s(degrees)) % 360;
+ if (mShowHours) {
+ mSelectionDegrees[HOURS] = snapDegrees;
+ mSelectionDegrees[HOURS_INNER] = snapDegrees;
+ } else {
+ mSelectionDegrees[MINUTES] = snapDegrees;
+ }
+ performHapticFeedback(HapticFeedbackConstants.CLOCK_TICK);
+ if (mListener != null) {
+ if (mShowHours) {
+ mListener.onValueSelected(HOURS, getCurrentHour(), false);
+ } else {
+ mListener.onValueSelected(MINUTES, getCurrentMinute(), false);
+ }
+ }
+ result = true;
+ }
+ }
+ invalidate();
+ return result;
+
+ case MotionEvent.ACTION_UP:
+ mAmOrPmPressed = getIsTouchingAmOrPm(eventX, eventY);
+ if (mAmOrPmPressed != -1) {
+ if (mAmOrPm != mAmOrPmPressed) {
+ swapAmPm();
+ }
+ mAmOrPmPressed = -1;
+ if (mListener != null) {
+ mListener.onValueSelected(AMPM, getCurrentHour(), true);
+ }
+ result = true;
+ } else {
+ degrees = getDegreesFromXY(eventX, eventY);
+ if (degrees != -1) {
+ snapDegrees = (mShowHours ?
+ snapOnly30s(degrees, 0) : snapPrefer30s(degrees)) % 360;
+ if (mShowHours) {
+ mSelectionDegrees[HOURS] = snapDegrees;
+ mSelectionDegrees[HOURS_INNER] = snapDegrees;
+ } else {
+ mSelectionDegrees[MINUTES] = snapDegrees;
+ }
+ if (mListener != null) {
+ if (mShowHours) {
+ mListener.onValueSelected(HOURS, getCurrentHour(), true);
+ } else {
+ mListener.onValueSelected(MINUTES, getCurrentMinute(), true);
+ }
+ }
+ result = true;
+ }
+ }
+ if (result) {
+ invalidate();
+ }
+ return result;
+
+ default:
+ break;
+ }
+ return false;
+ }
+
+ /**
+ * Necessary for accessibility, to ensure we support "scrolling" forward and backward
+ * in the circle.
+ */
+ @Override
+ public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfo(info);
+ info.addAction(AccessibilityNodeInfo.ACTION_SCROLL_FORWARD);
+ info.addAction(AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD);
+ }
+
+ /**
+ * Announce the currently-selected time when launched.
+ */
+ @Override
+ public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {
+ if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) {
+ // Clear the event's current text so that only the current time will be spoken.
+ event.getText().clear();
+ Time time = new Time();
+ time.hour = getCurrentHour();
+ time.minute = getCurrentMinute();
+ long millis = time.normalize(true);
+ int flags = DateUtils.FORMAT_SHOW_TIME;
+ if (mIs24HourMode) {
+ flags |= DateUtils.FORMAT_24HOUR;
+ }
+ String timeString = DateUtils.formatDateTime(getContext(), millis, flags);
+ event.getText().add(timeString);
+ return true;
+ }
+ return super.dispatchPopulateAccessibilityEvent(event);
+ }
+
+ /**
+ * When scroll forward/backward events are received, jump the time to the higher/lower
+ * discrete, visible value on the circle.
+ */
+ @SuppressLint("NewApi")
+ @Override
+ public boolean performAccessibilityAction(int action, Bundle arguments) {
+ if (super.performAccessibilityAction(action, arguments)) {
+ return true;
+ }
+
+ int changeMultiplier = 0;
+ if (action == AccessibilityNodeInfo.ACTION_SCROLL_FORWARD) {
+ changeMultiplier = 1;
+ } else if (action == AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD) {
+ changeMultiplier = -1;
+ }
+ if (changeMultiplier != 0) {
+ int value = 0;
+ int stepSize = 0;
+ if (mShowHours) {
+ stepSize = DEGREES_FOR_ONE_HOUR;
+ value = getCurrentHour() % 12;
+ } else {
+ stepSize = DEGREES_FOR_ONE_MINUTE;
+ value = getCurrentMinute();
+ }
+
+ int degrees = value * stepSize;
+ degrees = snapOnly30s(degrees, changeMultiplier);
+ value = degrees / stepSize;
+ int maxValue = 0;
+ int minValue = 0;
+ if (mShowHours) {
+ if (mIs24HourMode) {
+ maxValue = 23;
+ } else {
+ maxValue = 12;
+ minValue = 1;
+ }
+ } else {
+ maxValue = 55;
+ }
+ if (value > maxValue) {
+ // If we scrolled forward past the highest number, wrap around to the lowest.
+ value = minValue;
+ } else if (value < minValue) {
+ // If we scrolled backward past the lowest number, wrap around to the highest.
+ value = maxValue;
+ }
+ if (mShowHours) {
+ setCurrentHour(value);
+ if (mListener != null) {
+ mListener.onValueSelected(HOURS, value, false);
+ }
+ } else {
+ setCurrentMinute(value);
+ if (mListener != null) {
+ mListener.onValueSelected(MINUTES, value, false);
+ }
+ }
+ return true;
+ }
+
+ return false;
+ }
+
+ public void setInputEnabled(boolean inputEnabled) {
+ mInputEnabled = inputEnabled;
+ invalidate();
+ }
+}
diff --git a/core/java/android/widget/RadioButton.java b/core/java/android/widget/RadioButton.java
index a0fef7d..46c6a54 100644
--- a/core/java/android/widget/RadioButton.java
+++ b/core/java/android/widget/RadioButton.java
@@ -59,8 +59,12 @@ public class RadioButton extends CompoundButton {
this(context, attrs, com.android.internal.R.attr.radioButtonStyle);
}
- public RadioButton(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
+ public RadioButton(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
+ public RadioButton(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
}
/**
diff --git a/core/java/android/widget/RatingBar.java b/core/java/android/widget/RatingBar.java
index 4d3c56c..82b490e 100644
--- a/core/java/android/widget/RatingBar.java
+++ b/core/java/android/widget/RatingBar.java
@@ -82,11 +82,15 @@ public class RatingBar extends AbsSeekBar {
private OnRatingBarChangeListener mOnRatingBarChangeListener;
- public RatingBar(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
-
- TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.RatingBar,
- defStyle, 0);
+ public RatingBar(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
+ public RatingBar(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+
+ final TypedArray a = context.obtainStyledAttributes(
+ attrs, R.styleable.RatingBar, defStyleAttr, defStyleRes);
final int numStars = a.getInt(R.styleable.RatingBar_numStars, mNumStars);
setIsIndicator(a.getBoolean(R.styleable.RatingBar_isIndicator, !mIsUserSeekable));
final float rating = a.getFloat(R.styleable.RatingBar_rating, -1);
diff --git a/core/java/android/widget/RelativeLayout.java b/core/java/android/widget/RelativeLayout.java
index e03e83d..70ef10b 100644
--- a/core/java/android/widget/RelativeLayout.java
+++ b/core/java/android/widget/RelativeLayout.java
@@ -228,24 +228,27 @@ public class RelativeLayout extends ViewGroup {
private static final int DEFAULT_WIDTH = 0x00010000;
public RelativeLayout(Context context) {
- super(context);
- queryCompatibilityModes(context);
+ this(context, null);
}
public RelativeLayout(Context context, AttributeSet attrs) {
- super(context, attrs);
- initFromAttributes(context, attrs);
- queryCompatibilityModes(context);
+ this(context, attrs, 0);
+ }
+
+ public RelativeLayout(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
}
- public RelativeLayout(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
- initFromAttributes(context, attrs);
+ public RelativeLayout(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+ initFromAttributes(context, attrs, defStyleAttr, defStyleRes);
queryCompatibilityModes(context);
}
- private void initFromAttributes(Context context, AttributeSet attrs) {
- TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.RelativeLayout);
+ private void initFromAttributes(
+ Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ final TypedArray a = context.obtainStyledAttributes(
+ attrs, R.styleable.RelativeLayout, defStyleAttr, defStyleRes);
mIgnoreGravity = a.getResourceId(R.styleable.RelativeLayout_ignoreGravity, View.NO_ID);
mGravity = a.getInt(R.styleable.RelativeLayout_gravity, mGravity);
a.recycle();
diff --git a/core/java/android/widget/ScrollView.java b/core/java/android/widget/ScrollView.java
index 6680393..082d728 100644
--- a/core/java/android/widget/ScrollView.java
+++ b/core/java/android/widget/ScrollView.java
@@ -162,12 +162,16 @@ public class ScrollView extends FrameLayout {
this(context, attrs, com.android.internal.R.attr.scrollViewStyle);
}
- public ScrollView(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
+ public ScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
+ public ScrollView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
initScrollView();
- TypedArray a =
- context.obtainStyledAttributes(attrs, com.android.internal.R.styleable.ScrollView, defStyle, 0);
+ final TypedArray a = context.obtainStyledAttributes(
+ attrs, com.android.internal.R.styleable.ScrollView, defStyleAttr, defStyleRes);
setFillViewport(a.getBoolean(R.styleable.ScrollView_fillViewport, false));
diff --git a/core/java/android/widget/Scroller.java b/core/java/android/widget/Scroller.java
index 3bfd39d..1a0ce9c 100644
--- a/core/java/android/widget/Scroller.java
+++ b/core/java/android/widget/Scroller.java
@@ -61,6 +61,8 @@ import android.view.animation.Interpolator;
* }</pre>
*/
public class Scroller {
+ private final Interpolator mInterpolator;
+
private int mMode;
private int mStartX;
@@ -81,7 +83,6 @@ public class Scroller {
private float mDeltaX;
private float mDeltaY;
private boolean mFinished;
- private Interpolator mInterpolator;
private boolean mFlywheel;
private float mVelocity;
@@ -142,18 +143,8 @@ public class Scroller {
SPLINE_TIME[i] = coef * ((1.0f - y) * P1 + y * P2) + y * y * y;
}
SPLINE_POSITION[NB_SAMPLES] = SPLINE_TIME[NB_SAMPLES] = 1.0f;
-
- // This controls the viscous fluid effect (how much of it)
- sViscousFluidScale = 8.0f;
- // must be set to 1.0 (used in viscousFluid())
- sViscousFluidNormalize = 1.0f;
- sViscousFluidNormalize = 1.0f / viscousFluid(1.0f);
-
}
- private static float sViscousFluidScale;
- private static float sViscousFluidNormalize;
-
/**
* Create a Scroller with the default duration and interpolator.
*/
@@ -178,7 +169,11 @@ public class Scroller {
*/
public Scroller(Context context, Interpolator interpolator, boolean flywheel) {
mFinished = true;
- mInterpolator = interpolator;
+ if (interpolator == null) {
+ mInterpolator = new ViscousFluidInterpolator();
+ } else {
+ mInterpolator = interpolator;
+ }
mPpi = context.getResources().getDisplayMetrics().density * 160.0f;
mDeceleration = computeDeceleration(ViewConfiguration.getScrollFriction());
mFlywheel = flywheel;
@@ -312,13 +307,7 @@ public class Scroller {
if (timePassed < mDuration) {
switch (mMode) {
case SCROLL_MODE:
- float x = timePassed * mDurationReciprocal;
-
- if (mInterpolator == null)
- x = viscousFluid(x);
- else
- x = mInterpolator.getInterpolation(x);
-
+ final float x = mInterpolator.getInterpolation(timePassed * mDurationReciprocal);
mCurrX = mStartX + Math.round(x * mDeltaX);
mCurrY = mStartY + Math.round(x * mDeltaY);
break;
@@ -499,20 +488,6 @@ public class Scroller {
return mFlingFriction * mPhysicalCoeff * Math.exp(DECELERATION_RATE / decelMinusOne * l);
}
- static float viscousFluid(float x)
- {
- x *= sViscousFluidScale;
- if (x < 1.0f) {
- x -= (1.0f - (float)Math.exp(-x));
- } else {
- float start = 0.36787944117f; // 1/e == exp(-1)
- x = 1.0f - (float)Math.exp(1.0f - x);
- x = start + x * (1.0f - start);
- }
- x *= sViscousFluidNormalize;
- return x;
- }
-
/**
* Stops the animation. Contrary to {@link #forceFinished(boolean)},
* aborting the animating cause the scroller to move to the final x and y
@@ -583,4 +558,41 @@ public class Scroller {
return !mFinished && Math.signum(xvel) == Math.signum(mFinalX - mStartX) &&
Math.signum(yvel) == Math.signum(mFinalY - mStartY);
}
+
+ static class ViscousFluidInterpolator implements Interpolator {
+ /** Controls the viscous fluid effect (how much of it). */
+ private static final float VISCOUS_FLUID_SCALE = 8.0f;
+
+ private static final float VISCOUS_FLUID_NORMALIZE;
+ private static final float VISCOUS_FLUID_OFFSET;
+
+ static {
+
+ // must be set to 1.0 (used in viscousFluid())
+ VISCOUS_FLUID_NORMALIZE = 1.0f / viscousFluid(1.0f);
+ // account for very small floating-point error
+ VISCOUS_FLUID_OFFSET = 1.0f - VISCOUS_FLUID_NORMALIZE * viscousFluid(1.0f);
+ }
+
+ private static float viscousFluid(float x) {
+ x *= VISCOUS_FLUID_SCALE;
+ if (x < 1.0f) {
+ x -= (1.0f - (float)Math.exp(-x));
+ } else {
+ float start = 0.36787944117f; // 1/e == exp(-1)
+ x = 1.0f - (float)Math.exp(1.0f - x);
+ x = start + x * (1.0f - start);
+ }
+ return x;
+ }
+
+ @Override
+ public float getInterpolation(float input) {
+ final float interpolated = VISCOUS_FLUID_NORMALIZE * viscousFluid(input);
+ if (input > 0) {
+ return input + VISCOUS_FLUID_OFFSET;
+ }
+ return input;
+ }
+ }
}
diff --git a/core/java/android/widget/SearchView.java b/core/java/android/widget/SearchView.java
index 0281602..3791258 100644
--- a/core/java/android/widget/SearchView.java
+++ b/core/java/android/widget/SearchView.java
@@ -242,7 +242,15 @@ public class SearchView extends LinearLayout implements CollapsibleActionView {
}
public SearchView(Context context, AttributeSet attrs) {
- super(context, attrs);
+ this(context, attrs, 0);
+ }
+
+ public SearchView(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
+ public SearchView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
@@ -281,7 +289,8 @@ public class SearchView extends LinearLayout implements CollapsibleActionView {
}
});
- TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.SearchView, 0, 0);
+ TypedArray a = context.obtainStyledAttributes(
+ attrs, R.styleable.SearchView, defStyleAttr, defStyleRes);
setIconifiedByDefault(a.getBoolean(R.styleable.SearchView_iconifiedByDefault, true));
int maxWidth = a.getDimensionPixelSize(R.styleable.SearchView_maxWidth, -1);
if (maxWidth != -1) {
@@ -304,7 +313,7 @@ public class SearchView extends LinearLayout implements CollapsibleActionView {
boolean focusable = true;
- a = context.obtainStyledAttributes(attrs, R.styleable.View, 0, 0);
+ a = context.obtainStyledAttributes(attrs, R.styleable.View, defStyleAttr, defStyleRes);
focusable = a.getBoolean(R.styleable.View_focusable, focusable);
a.recycle();
setFocusable(focusable);
@@ -1661,8 +1670,14 @@ public class SearchView extends LinearLayout implements CollapsibleActionView {
mThreshold = getThreshold();
}
- public SearchAutoComplete(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
+ public SearchAutoComplete(Context context, AttributeSet attrs, int defStyleAttrs) {
+ super(context, attrs, defStyleAttrs);
+ mThreshold = getThreshold();
+ }
+
+ public SearchAutoComplete(
+ Context context, AttributeSet attrs, int defStyleAttrs, int defStyleRes) {
+ super(context, attrs, defStyleAttrs, defStyleRes);
mThreshold = getThreshold();
}
diff --git a/core/java/android/widget/SeekBar.java b/core/java/android/widget/SeekBar.java
index 2737f94..dc7c04c 100644
--- a/core/java/android/widget/SeekBar.java
+++ b/core/java/android/widget/SeekBar.java
@@ -79,8 +79,12 @@ public class SeekBar extends AbsSeekBar {
this(context, attrs, com.android.internal.R.attr.seekBarStyle);
}
- public SeekBar(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
+ public SeekBar(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
+ public SeekBar(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
}
@Override
diff --git a/core/java/android/widget/SlidingDrawer.java b/core/java/android/widget/SlidingDrawer.java
index 517246b..ec06c02 100644
--- a/core/java/android/widget/SlidingDrawer.java
+++ b/core/java/android/widget/SlidingDrawer.java
@@ -192,11 +192,32 @@ public class SlidingDrawer extends ViewGroup {
*
* @param context The application's environment.
* @param attrs The attributes defined in XML.
- * @param defStyle The style to apply to this widget.
+ * @param defStyleAttr An attribute in the current theme that contains a
+ * reference to a style resource that supplies default values for
+ * the view. Can be 0 to not look for defaults.
*/
- public SlidingDrawer(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
- TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.SlidingDrawer, defStyle, 0);
+ public SlidingDrawer(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
+ /**
+ * Creates a new SlidingDrawer from a specified set of attributes defined in XML.
+ *
+ * @param context The application's environment.
+ * @param attrs The attributes defined in XML.
+ * @param defStyleAttr An attribute in the current theme that contains a
+ * reference to a style resource that supplies default values for
+ * the view. Can be 0 to not look for defaults.
+ * @param defStyleRes A resource identifier of a style resource that
+ * supplies default values for the view, used only if
+ * defStyleAttr is 0 or can not be found in the theme. Can be 0
+ * to not look for defaults.
+ */
+ public SlidingDrawer(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+
+ final TypedArray a = context.obtainStyledAttributes(
+ attrs, R.styleable.SlidingDrawer, defStyleAttr, defStyleRes);
int orientation = a.getInt(R.styleable.SlidingDrawer_orientation, ORIENTATION_VERTICAL);
mVertical = orientation == ORIENTATION_VERTICAL;
diff --git a/core/java/android/widget/Space.java b/core/java/android/widget/Space.java
index bb53a77..068cfa0 100644
--- a/core/java/android/widget/Space.java
+++ b/core/java/android/widget/Space.java
@@ -30,8 +30,8 @@ public final class Space extends View {
/**
* {@inheritDoc}
*/
- public Space(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
+ public Space(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
if (getVisibility() == VISIBLE) {
setVisibility(INVISIBLE);
}
@@ -40,6 +40,13 @@ public final class Space extends View {
/**
* {@inheritDoc}
*/
+ public Space(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
public Space(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
diff --git a/core/java/android/widget/Spinner.java b/core/java/android/widget/Spinner.java
index b75d36f..afe5804 100644
--- a/core/java/android/widget/Spinner.java
+++ b/core/java/android/widget/Spinner.java
@@ -130,18 +130,17 @@ public class Spinner extends AbsSpinner implements OnClickListener {
/**
* Construct a new spinner with the given context's theme, the supplied attribute set,
- * and default style.
+ * and default style attribute.
*
* @param context The Context the view is running in, through which it can
* access the current theme, resources, etc.
* @param attrs The attributes of the XML tag that is inflating the view.
- * @param defStyle The default style to apply to this view. If 0, no style
- * will be applied (beyond what is included in the theme). This may
- * either be an attribute resource, whose value will be retrieved
- * from the current theme, or an explicit style resource.
+ * @param defStyleAttr An attribute in the current theme that contains a
+ * reference to a style resource that supplies default values for
+ * the view. Can be 0 to not look for defaults.
*/
- public Spinner(Context context, AttributeSet attrs, int defStyle) {
- this(context, attrs, defStyle, MODE_THEME);
+ public Spinner(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0, MODE_THEME);
}
/**
@@ -152,20 +151,44 @@ public class Spinner extends AbsSpinner implements OnClickListener {
* @param context The Context the view is running in, through which it can
* access the current theme, resources, etc.
* @param attrs The attributes of the XML tag that is inflating the view.
- * @param defStyle The default style to apply to this view. If 0, no style
- * will be applied (beyond what is included in the theme). This may
- * either be an attribute resource, whose value will be retrieved
- * from the current theme, or an explicit style resource.
+ * @param defStyleAttr An attribute in the current theme that contains a
+ * reference to a style resource that supplies default values for
+ * the view. Can be 0 to not look for defaults.
* @param mode Constant describing how the user will select choices from the spinner.
- *
+ *
+ * @see #MODE_DIALOG
+ * @see #MODE_DROPDOWN
+ */
+ public Spinner(Context context, AttributeSet attrs, int defStyleAttr, int mode) {
+ this(context, attrs, defStyleAttr, 0, mode);
+ }
+
+ /**
+ * Construct a new spinner with the given context's theme, the supplied attribute set,
+ * and default style. <code>mode</code> may be one of {@link #MODE_DIALOG} or
+ * {@link #MODE_DROPDOWN} and determines how the user will select choices from the spinner.
+ *
+ * @param context The Context the view is running in, through which it can
+ * access the current theme, resources, etc.
+ * @param attrs The attributes of the XML tag that is inflating the view.
+ * @param defStyleAttr An attribute in the current theme that contains a
+ * reference to a style resource that supplies default values for
+ * the view. Can be 0 to not look for defaults.
+ * @param defStyleRes A resource identifier of a style resource that
+ * supplies default values for the view, used only if
+ * defStyleAttr is 0 or can not be found in the theme. Can be 0
+ * to not look for defaults.
+ * @param mode Constant describing how the user will select choices from the spinner.
+ *
* @see #MODE_DIALOG
* @see #MODE_DROPDOWN
*/
- public Spinner(Context context, AttributeSet attrs, int defStyle, int mode) {
- super(context, attrs, defStyle);
+ public Spinner(
+ Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes, int mode) {
+ super(context, attrs, defStyleAttr, defStyleRes);
- TypedArray a = context.obtainStyledAttributes(attrs,
- com.android.internal.R.styleable.Spinner, defStyle, 0);
+ final TypedArray a = context.obtainStyledAttributes(
+ attrs, com.android.internal.R.styleable.Spinner, defStyleAttr, defStyleRes);
if (mode == MODE_THEME) {
mode = a.getInt(com.android.internal.R.styleable.Spinner_spinnerMode, MODE_DIALOG);
@@ -178,7 +201,7 @@ public class Spinner extends AbsSpinner implements OnClickListener {
}
case MODE_DROPDOWN: {
- final DropdownPopup popup = new DropdownPopup(context, attrs, defStyle);
+ final DropdownPopup popup = new DropdownPopup(context, attrs, defStyleAttr, defStyleRes);
mDropDownWidth = a.getLayoutDimension(
com.android.internal.R.styleable.Spinner_dropDownWidth,
@@ -1031,8 +1054,9 @@ public class Spinner extends AbsSpinner implements OnClickListener {
private CharSequence mHintText;
private ListAdapter mAdapter;
- public DropdownPopup(Context context, AttributeSet attrs, int defStyleRes) {
- super(context, attrs, 0, defStyleRes);
+ public DropdownPopup(
+ Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
setAnchorView(Spinner.this);
setModal(true);
diff --git a/core/java/android/widget/StackView.java b/core/java/android/widget/StackView.java
index 6853660..d2e718c 100644
--- a/core/java/android/widget/StackView.java
+++ b/core/java/android/widget/StackView.java
@@ -168,9 +168,16 @@ public class StackView extends AdapterViewAnimator {
* {@inheritDoc}
*/
public StackView(Context context, AttributeSet attrs, int defStyleAttr) {
- super(context, attrs, defStyleAttr);
- TypedArray a = context.obtainStyledAttributes(attrs,
- com.android.internal.R.styleable.StackView, defStyleAttr, 0);
+ this(context, attrs, defStyleAttr, 0);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public StackView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+ final TypedArray a = context.obtainStyledAttributes(
+ attrs, com.android.internal.R.styleable.StackView, defStyleAttr, defStyleRes);
mResOutColor = a.getColor(
com.android.internal.R.styleable.StackView_resOutColor, 0);
diff --git a/core/java/android/widget/Switch.java b/core/java/android/widget/Switch.java
index e754c17..c9a1ca4 100644
--- a/core/java/android/widget/Switch.java
+++ b/core/java/android/widget/Switch.java
@@ -16,6 +16,7 @@
package android.widget;
+import android.animation.ObjectAnimator;
import android.content.Context;
import android.content.res.ColorStateList;
import android.content.res.Resources;
@@ -32,6 +33,8 @@ import android.text.TextUtils;
import android.text.method.AllCapsTransformationMethod;
import android.text.method.TransformationMethod2;
import android.util.AttributeSet;
+import android.util.FloatProperty;
+import android.util.MathUtils;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.VelocityTracker;
@@ -66,6 +69,8 @@ import com.android.internal.R;
* @attr ref android.R.styleable#Switch_track
*/
public class Switch extends CompoundButton {
+ private static final int THUMB_ANIMATION_DURATION = 250;
+
private static final int TOUCH_MODE_IDLE = 0;
private static final int TOUCH_MODE_DOWN = 1;
private static final int TOUCH_MODE_DRAGGING = 2;
@@ -105,6 +110,7 @@ public class Switch extends CompoundButton {
private Layout mOnLayout;
private Layout mOffLayout;
private TransformationMethod2 mSwitchTransformationMethod;
+ private ObjectAnimator mPositionAnimator;
@SuppressWarnings("hiding")
private final Rect mTempRect = new Rect();
@@ -139,19 +145,41 @@ public class Switch extends CompoundButton {
*
* @param context The Context that will determine this widget's theming.
* @param attrs Specification of attributes that should deviate from the default styling.
- * @param defStyle An attribute ID within the active theme containing a reference to the
- * default style for this widget. e.g. android.R.attr.switchStyle.
+ * @param defStyleAttr An attribute in the current theme that contains a
+ * reference to a style resource that supplies default values for
+ * the view. Can be 0 to not look for defaults.
*/
- public Switch(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
+ public Switch(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
+
+ /**
+ * Construct a new Switch with a default style determined by the given theme
+ * attribute or style resource, overriding specific style attributes as
+ * requested.
+ *
+ * @param context The Context that will determine this widget's theming.
+ * @param attrs Specification of attributes that should deviate from the
+ * default styling.
+ * @param defStyleAttr An attribute in the current theme that contains a
+ * reference to a style resource that supplies default values for
+ * the view. Can be 0 to not look for defaults.
+ * @param defStyleRes A resource identifier of a style resource that
+ * supplies default values for the view, used only if
+ * defStyleAttr is 0 or can not be found in the theme. Can be 0
+ * to not look for defaults.
+ */
+ public Switch(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
mTextPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG);
Resources res = getResources();
mTextPaint.density = res.getDisplayMetrics().density;
mTextPaint.setCompatibilityScaling(res.getCompatibilityInfo().applicationScale);
- TypedArray a = context.obtainStyledAttributes(attrs,
- com.android.internal.R.styleable.Switch, defStyle, 0);
+ final TypedArray a = context.obtainStyledAttributes(
+ attrs, com.android.internal.R.styleable.Switch, defStyleAttr, defStyleRes);
mThumbDrawable = a.getDrawable(com.android.internal.R.styleable.Switch_thumb);
mTrackDrawable = a.getDrawable(com.android.internal.R.styleable.Switch_track);
@@ -528,9 +556,12 @@ public class Switch extends CompoundButton {
* @return true if (x, y) is within the target area of the switch thumb
*/
private boolean hitThumb(float x, float y) {
+ // Relies on mTempRect, MUST be called first!
+ final int thumbOffset = getThumbOffset();
+
mThumbDrawable.getPadding(mTempRect);
final int thumbTop = mSwitchTop - mTouchSlop;
- final int thumbLeft = mSwitchLeft + (int) (mThumbPosition + 0.5f) - mTouchSlop;
+ final int thumbLeft = mSwitchLeft + thumbOffset - mTouchSlop;
final int thumbRight = thumbLeft + mThumbWidth +
mTempRect.left + mTempRect.right + mTouchSlop;
final int thumbBottom = mSwitchBottom + mTouchSlop;
@@ -575,13 +606,23 @@ public class Switch extends CompoundButton {
case TOUCH_MODE_DRAGGING: {
final float x = ev.getX();
- final float dx = x - mTouchX;
- float newPos = Math.max(0,
- Math.min(mThumbPosition + dx, getThumbScrollRange()));
+ final int thumbScrollRange = getThumbScrollRange();
+ final float thumbScrollOffset = x - mTouchX;
+ float dPos;
+ if (thumbScrollRange != 0) {
+ dPos = thumbScrollOffset / thumbScrollRange;
+ } else {
+ // If the thumb scroll range is empty, just use the
+ // movement direction to snap on or off.
+ dPos = thumbScrollOffset > 0 ? 1 : -1;
+ }
+ if (isLayoutRtl()) {
+ dPos = -dPos;
+ }
+ final float newPos = MathUtils.constrain(mThumbPosition + dPos, 0, 1);
if (newPos != mThumbPosition) {
- mThumbPosition = newPos;
mTouchX = x;
- invalidate();
+ setThumbPosition(newPos);
}
return true;
}
@@ -618,62 +659,77 @@ public class Switch extends CompoundButton {
*/
private void stopDrag(MotionEvent ev) {
mTouchMode = TOUCH_MODE_IDLE;
- // Up and not canceled, also checks the switch has not been disabled during the drag
- boolean commitChange = ev.getAction() == MotionEvent.ACTION_UP && isEnabled();
-
- cancelSuperTouch(ev);
+ // Commit the change if the event is up and not canceled and the switch
+ // has not been disabled during the drag.
+ final boolean commitChange = ev.getAction() == MotionEvent.ACTION_UP && isEnabled();
+ final boolean newState;
if (commitChange) {
- boolean newState;
mVelocityTracker.computeCurrentVelocity(1000);
- float xvel = mVelocityTracker.getXVelocity();
+ final float xvel = mVelocityTracker.getXVelocity();
if (Math.abs(xvel) > mMinFlingVelocity) {
newState = isLayoutRtl() ? (xvel < 0) : (xvel > 0);
} else {
newState = getTargetCheckedState();
}
- animateThumbToCheckedState(newState);
} else {
- animateThumbToCheckedState(isChecked());
+ newState = isChecked();
}
+
+ setChecked(newState);
+ cancelSuperTouch(ev);
}
private void animateThumbToCheckedState(boolean newCheckedState) {
- // TODO animate!
- //float targetPos = newCheckedState ? 0 : getThumbScrollRange();
- //mThumbPosition = targetPos;
- setChecked(newCheckedState);
+ final float targetPosition = newCheckedState ? 1 : 0;
+ mPositionAnimator = ObjectAnimator.ofFloat(this, THUMB_POS, targetPosition);
+ mPositionAnimator.setDuration(THUMB_ANIMATION_DURATION);
+ mPositionAnimator.setAutoCancel(true);
+ mPositionAnimator.start();
}
- private boolean getTargetCheckedState() {
- if (isLayoutRtl()) {
- return mThumbPosition <= getThumbScrollRange() / 2;
- } else {
- return mThumbPosition >= getThumbScrollRange() / 2;
+ private void cancelPositionAnimator() {
+ if (mPositionAnimator != null) {
+ mPositionAnimator.cancel();
}
}
- private void setThumbPosition(boolean checked) {
- if (isLayoutRtl()) {
- mThumbPosition = checked ? 0 : getThumbScrollRange();
- } else {
- mThumbPosition = checked ? getThumbScrollRange() : 0;
- }
+ private boolean getTargetCheckedState() {
+ return mThumbPosition > 0.5f;
+ }
+
+ /**
+ * Sets the thumb position as a decimal value between 0 (off) and 1 (on).
+ *
+ * @param position new position between [0,1]
+ */
+ private void setThumbPosition(float position) {
+ mThumbPosition = position;
+ invalidate();
+ }
+
+ @Override
+ public void toggle() {
+ setChecked(!isChecked());
}
@Override
public void setChecked(boolean checked) {
super.setChecked(checked);
- setThumbPosition(isChecked());
- invalidate();
+
+ if (isAttachedToWindow() && isLaidOut()) {
+ animateThumbToCheckedState(checked);
+ } else {
+ // Immediately move the thumb to the new position.
+ cancelPositionAnimator();
+ setThumbPosition(checked ? 1 : 0);
+ }
}
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
- setThumbPosition(isChecked());
-
int switchRight;
int switchLeft;
@@ -734,11 +790,12 @@ public class Switch extends CompoundButton {
int switchInnerBottom = switchBottom - mTempRect.bottom;
canvas.clipRect(switchInnerLeft, switchTop, switchInnerRight, switchBottom);
+ // Relies on mTempRect, MUST be called first!
+ final int thumbPos = getThumbOffset();
+
mThumbDrawable.getPadding(mTempRect);
- final int thumbPos = (int) (mThumbPosition + 0.5f);
int thumbLeft = switchInnerLeft - mTempRect.left + thumbPos;
int thumbRight = switchInnerLeft + thumbPos + mThumbWidth + mTempRect.right;
-
mThumbDrawable.setBounds(thumbLeft, switchTop, thumbRight, switchBottom);
mThumbDrawable.draw(canvas);
@@ -783,6 +840,22 @@ public class Switch extends CompoundButton {
return padding;
}
+ /**
+ * Translates thumb position to offset according to current RTL setting and
+ * thumb scroll range.
+ *
+ * @return thumb offset
+ */
+ private int getThumbOffset() {
+ final float thumbPosition;
+ if (isLayoutRtl()) {
+ thumbPosition = 1 - mThumbPosition;
+ } else {
+ thumbPosition = mThumbPosition;
+ }
+ return (int) (thumbPosition * getThumbScrollRange() + 0.5f);
+ }
+
private int getThumbScrollRange() {
if (mTrackDrawable == null) {
return 0;
@@ -848,4 +921,16 @@ public class Switch extends CompoundButton {
}
}
}
+
+ private static final FloatProperty<Switch> THUMB_POS = new FloatProperty<Switch>("thumbPos") {
+ @Override
+ public Float get(Switch object) {
+ return object.mThumbPosition;
+ }
+
+ @Override
+ public void setValue(Switch object, float value) {
+ object.setThumbPosition(value);
+ }
+ };
}
diff --git a/core/java/android/widget/TabHost.java b/core/java/android/widget/TabHost.java
index 238dc55..89df51a 100644
--- a/core/java/android/widget/TabHost.java
+++ b/core/java/android/widget/TabHost.java
@@ -77,11 +77,18 @@ public class TabHost extends FrameLayout implements ViewTreeObserver.OnTouchMode
}
public TabHost(Context context, AttributeSet attrs) {
+ this(context, attrs, com.android.internal.R.attr.tabWidgetStyle);
+ }
+
+ public TabHost(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
+ public TabHost(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs);
- TypedArray a = context.obtainStyledAttributes(attrs,
- com.android.internal.R.styleable.TabWidget,
- com.android.internal.R.attr.tabWidgetStyle, 0);
+ final TypedArray a = context.obtainStyledAttributes(
+ attrs, com.android.internal.R.styleable.TabWidget, defStyleAttr, defStyleRes);
mTabLayoutId = a.getResourceId(R.styleable.TabWidget_tabLayout, 0);
a.recycle();
diff --git a/core/java/android/widget/TabWidget.java b/core/java/android/widget/TabWidget.java
index 6bced1c..568b3e6 100644
--- a/core/java/android/widget/TabWidget.java
+++ b/core/java/android/widget/TabWidget.java
@@ -74,11 +74,15 @@ public class TabWidget extends LinearLayout implements OnFocusChangeListener {
this(context, attrs, com.android.internal.R.attr.tabWidgetStyle);
}
- public TabWidget(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
+ public TabWidget(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
+ public TabWidget(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
final TypedArray a = context.obtainStyledAttributes(
- attrs, com.android.internal.R.styleable.TabWidget, defStyle, 0);
+ attrs, com.android.internal.R.styleable.TabWidget, defStyleAttr, defStyleRes);
setStripEnabled(a.getBoolean(R.styleable.TabWidget_tabStripEnabled, true));
setLeftStripDrawable(a.getDrawable(R.styleable.TabWidget_tabStripLeft));
diff --git a/core/java/android/widget/TextClock.java b/core/java/android/widget/TextClock.java
index b3b95d9..4c5c71d 100644
--- a/core/java/android/widget/TextClock.java
+++ b/core/java/android/widget/TextClock.java
@@ -198,15 +198,19 @@ public class TextClock extends TextView {
* @param context The Context the view is running in, through which it can
* access the current theme, resources, etc.
* @param attrs The attributes of the XML tag that is inflating the view
- * @param defStyle The default style to apply to this view. If 0, no style
- * will be applied (beyond what is included in the theme). This may
- * either be an attribute resource, whose value will be retrieved
- * from the current theme, or an explicit style resource
+ * @param defStyleAttr An attribute in the current theme that contains a
+ * reference to a style resource that supplies default values for
+ * the view. Can be 0 to not look for defaults.
*/
- public TextClock(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
+ public TextClock(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
+ public TextClock(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
- TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.TextClock, defStyle, 0);
+ final TypedArray a = context.obtainStyledAttributes(
+ attrs, R.styleable.TextClock, defStyleAttr, defStyleRes);
try {
mFormat12 = a.getText(R.styleable.TextClock_format12Hour);
mFormat24 = a.getText(R.styleable.TextClock_format24Hour);
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java
index 7a9809f..fca62df 100644
--- a/core/java/android/widget/TextView.java
+++ b/core/java/android/widget/TextView.java
@@ -618,9 +618,14 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
this(context, attrs, com.android.internal.R.attr.textViewStyle);
}
+ public TextView(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
@SuppressWarnings("deprecation")
- public TextView(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
+ public TextView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+
mText = "";
final Resources res = getResources();
@@ -657,8 +662,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
* to be able to parse the appearance first and then let specific tags
* for this View override it.
*/
- TypedArray a = theme.obtainStyledAttributes(
- attrs, com.android.internal.R.styleable.TextViewAppearance, defStyle, 0);
+ TypedArray a = theme.obtainStyledAttributes(attrs,
+ com.android.internal.R.styleable.TextViewAppearance, defStyleAttr, defStyleRes);
TypedArray appearance = null;
int ap = a.getResourceId(
com.android.internal.R.styleable.TextViewAppearance_textAppearance, -1);
@@ -751,7 +756,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
int inputType = EditorInfo.TYPE_NULL;
a = theme.obtainStyledAttributes(
- attrs, com.android.internal.R.styleable.TextView, defStyle, 0);
+ attrs, com.android.internal.R.styleable.TextView, defStyleAttr, defStyleRes);
int n = a.getIndexCount();
for (int i = 0; i < n; i++) {
@@ -1275,9 +1280,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
* However, TextViews that have input or movement methods *are*
* focusable by default.
*/
- a = context.obtainStyledAttributes(attrs,
- com.android.internal.R.styleable.View,
- defStyle, 0);
+ a = context.obtainStyledAttributes(
+ attrs, com.android.internal.R.styleable.View, defStyleAttr, defStyleRes);
boolean focusable = mMovement != null || getKeyListener() != null;
boolean clickable = focusable;
diff --git a/core/java/android/widget/TimePicker.java b/core/java/android/widget/TimePicker.java
index c26cb24..485fecf 100644
--- a/core/java/android/widget/TimePicker.java
+++ b/core/java/android/widget/TimePicker.java
@@ -17,29 +17,22 @@
package android.widget;
import android.annotation.Widget;
+import android.app.Dialog;
import android.content.Context;
import android.content.res.Configuration;
import android.content.res.TypedArray;
-import android.os.Parcel;
import android.os.Parcelable;
-import android.text.format.DateFormat;
-import android.text.format.DateUtils;
import android.util.AttributeSet;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
+import android.view.KeyEvent;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityNodeInfo;
-import android.view.inputmethod.EditorInfo;
-import android.view.inputmethod.InputMethodManager;
-import android.widget.NumberPicker.OnValueChangeListener;
import com.android.internal.R;
-import java.text.DateFormatSymbols;
-import java.util.Calendar;
import java.util.Locale;
+import static android.os.Build.VERSION_CODES.KITKAT;
+
/**
* A view for selecting the time of day, in either 24 hour or AM/PM mode. The
* hour, each minute digit, and AM/PM (if applicable) can be conrolled by
@@ -57,58 +50,12 @@ import java.util.Locale;
@Widget
public class TimePicker extends FrameLayout {
- private static final boolean DEFAULT_ENABLED_STATE = true;
+ private TimePickerDelegate mDelegate;
- private static final int HOURS_IN_HALF_DAY = 12;
-
- /**
- * A no-op callback used in the constructor to avoid null checks later in
- * the code.
- */
- private static final OnTimeChangedListener NO_OP_CHANGE_LISTENER = new OnTimeChangedListener() {
- public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {
- }
- };
-
- // state
- private boolean mIs24HourView;
-
- private boolean mIsAm;
-
- // ui components
- private final NumberPicker mHourSpinner;
-
- private final NumberPicker mMinuteSpinner;
-
- private final NumberPicker mAmPmSpinner;
-
- private final EditText mHourSpinnerInput;
-
- private final EditText mMinuteSpinnerInput;
-
- private final EditText mAmPmSpinnerInput;
-
- private final TextView mDivider;
-
- // Note that the legacy implementation of the TimePicker is
- // using a button for toggling between AM/PM while the new
- // version uses a NumberPicker spinner. Therefore the code
- // accommodates these two cases to be backwards compatible.
- private final Button mAmPmButton;
-
- private final String[] mAmPmStrings;
-
- private boolean mIsEnabled = DEFAULT_ENABLED_STATE;
-
- // callbacks
- private OnTimeChangedListener mOnTimeChangedListener;
-
- private Calendar mTempCalendar;
-
- private Locale mCurrentLocale;
-
- private boolean mHourWithTwoDigit;
- private char mHourFormat;
+ private AttributeSet mAttrs;
+ private int mDefStyleAttr;
+ private int mDefStyleRes;
+ private Context mContext;
/**
* The callback interface used to indicate the time has been adjusted.
@@ -131,345 +78,79 @@ public class TimePicker extends FrameLayout {
this(context, attrs, R.attr.timePickerStyle);
}
- public TimePicker(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
-
- // initialization based on locale
- setCurrentLocale(Locale.getDefault());
-
- // process style attributes
- TypedArray attributesArray = context.obtainStyledAttributes(
- attrs, R.styleable.TimePicker, defStyle, 0);
- int layoutResourceId = attributesArray.getResourceId(
- R.styleable.TimePicker_internalLayout, R.layout.time_picker);
- attributesArray.recycle();
-
- LayoutInflater inflater = (LayoutInflater) context.getSystemService(
- Context.LAYOUT_INFLATER_SERVICE);
- inflater.inflate(layoutResourceId, this, true);
-
- // hour
- mHourSpinner = (NumberPicker) findViewById(R.id.hour);
- mHourSpinner.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {
- public void onValueChange(NumberPicker spinner, int oldVal, int newVal) {
- updateInputState();
- if (!is24HourView()) {
- if ((oldVal == HOURS_IN_HALF_DAY - 1 && newVal == HOURS_IN_HALF_DAY)
- || (oldVal == HOURS_IN_HALF_DAY && newVal == HOURS_IN_HALF_DAY - 1)) {
- mIsAm = !mIsAm;
- updateAmPmControl();
- }
- }
- onTimeChanged();
- }
- });
- mHourSpinnerInput = (EditText) mHourSpinner.findViewById(R.id.numberpicker_input);
- mHourSpinnerInput.setImeOptions(EditorInfo.IME_ACTION_NEXT);
-
- // divider (only for the new widget style)
- mDivider = (TextView) findViewById(R.id.divider);
- if (mDivider != null) {
- setDividerText();
- }
-
- // minute
- mMinuteSpinner = (NumberPicker) findViewById(R.id.minute);
- mMinuteSpinner.setMinValue(0);
- mMinuteSpinner.setMaxValue(59);
- mMinuteSpinner.setOnLongPressUpdateInterval(100);
- mMinuteSpinner.setFormatter(NumberPicker.getTwoDigitFormatter());
- mMinuteSpinner.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {
- public void onValueChange(NumberPicker spinner, int oldVal, int newVal) {
- updateInputState();
- int minValue = mMinuteSpinner.getMinValue();
- int maxValue = mMinuteSpinner.getMaxValue();
- if (oldVal == maxValue && newVal == minValue) {
- int newHour = mHourSpinner.getValue() + 1;
- if (!is24HourView() && newHour == HOURS_IN_HALF_DAY) {
- mIsAm = !mIsAm;
- updateAmPmControl();
- }
- mHourSpinner.setValue(newHour);
- } else if (oldVal == minValue && newVal == maxValue) {
- int newHour = mHourSpinner.getValue() - 1;
- if (!is24HourView() && newHour == HOURS_IN_HALF_DAY - 1) {
- mIsAm = !mIsAm;
- updateAmPmControl();
- }
- mHourSpinner.setValue(newHour);
- }
- onTimeChanged();
- }
- });
- mMinuteSpinnerInput = (EditText) mMinuteSpinner.findViewById(R.id.numberpicker_input);
- mMinuteSpinnerInput.setImeOptions(EditorInfo.IME_ACTION_NEXT);
-
- /* Get the localized am/pm strings and use them in the spinner */
- mAmPmStrings = new DateFormatSymbols().getAmPmStrings();
-
- // am/pm
- View amPmView = findViewById(R.id.amPm);
- if (amPmView instanceof Button) {
- mAmPmSpinner = null;
- mAmPmSpinnerInput = null;
- mAmPmButton = (Button) amPmView;
- mAmPmButton.setOnClickListener(new OnClickListener() {
- public void onClick(View button) {
- button.requestFocus();
- mIsAm = !mIsAm;
- updateAmPmControl();
- onTimeChanged();
- }
- });
- } else {
- mAmPmButton = null;
- mAmPmSpinner = (NumberPicker) amPmView;
- mAmPmSpinner.setMinValue(0);
- mAmPmSpinner.setMaxValue(1);
- mAmPmSpinner.setDisplayedValues(mAmPmStrings);
- mAmPmSpinner.setOnValueChangedListener(new OnValueChangeListener() {
- public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
- updateInputState();
- picker.requestFocus();
- mIsAm = !mIsAm;
- updateAmPmControl();
- onTimeChanged();
- }
- });
- mAmPmSpinnerInput = (EditText) mAmPmSpinner.findViewById(R.id.numberpicker_input);
- mAmPmSpinnerInput.setImeOptions(EditorInfo.IME_ACTION_DONE);
- }
-
- if (isAmPmAtStart()) {
- // Move the am/pm view to the beginning
- ViewGroup amPmParent = (ViewGroup) findViewById(R.id.timePickerLayout);
- amPmParent.removeView(amPmView);
- amPmParent.addView(amPmView, 0);
- // Swap layout margins if needed. They may be not symmetrical (Old Standard Theme for
- // example and not for Holo Theme)
- ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) amPmView.getLayoutParams();
- final int startMargin = lp.getMarginStart();
- final int endMargin = lp.getMarginEnd();
- if (startMargin != endMargin) {
- lp.setMarginStart(endMargin);
- lp.setMarginEnd(startMargin);
- }
- }
-
- getHourFormatData();
-
- // update controls to initial state
- updateHourControl();
- updateMinuteControl();
- updateAmPmControl();
-
- setOnTimeChangedListener(NO_OP_CHANGE_LISTENER);
-
- // set to current time
- setCurrentHour(mTempCalendar.get(Calendar.HOUR_OF_DAY));
- setCurrentMinute(mTempCalendar.get(Calendar.MINUTE));
-
- if (!isEnabled()) {
- setEnabled(false);
- }
-
- // set the content descriptions
- setContentDescriptions();
-
- // If not explicitly specified this view is important for accessibility.
- if (getImportantForAccessibility() == IMPORTANT_FOR_ACCESSIBILITY_AUTO) {
- setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_YES);
- }
+ public TimePicker(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
}
- private void getHourFormatData() {
- final Locale defaultLocale = Locale.getDefault();
- final String bestDateTimePattern = DateFormat.getBestDateTimePattern(defaultLocale,
- (mIs24HourView) ? "Hm" : "hm");
- final int lengthPattern = bestDateTimePattern.length();
- mHourWithTwoDigit = false;
- char hourFormat = '\0';
- // Check if the returned pattern is single or double 'H', 'h', 'K', 'k'. We also save
- // the hour format that we found.
- for (int i = 0; i < lengthPattern; i++) {
- final char c = bestDateTimePattern.charAt(i);
- if (c == 'H' || c == 'h' || c == 'K' || c == 'k') {
- mHourFormat = c;
- if (i + 1 < lengthPattern && c == bestDateTimePattern.charAt(i + 1)) {
- mHourWithTwoDigit = true;
- }
- break;
- }
- }
- }
+ public TimePicker(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
- private boolean isAmPmAtStart() {
- final Locale defaultLocale = Locale.getDefault();
- final String bestDateTimePattern = DateFormat.getBestDateTimePattern(defaultLocale,
- "hm" /* skeleton */);
+ mContext = context;
+ mAttrs = attrs;
+ mDefStyleAttr = defStyleAttr;
+ mDefStyleRes = defStyleRes;
- return bestDateTimePattern.startsWith("a");
- }
+ TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.TimePicker,
+ mDefStyleAttr, mDefStyleRes);
- @Override
- public void setEnabled(boolean enabled) {
- if (mIsEnabled == enabled) {
- return;
- }
- super.setEnabled(enabled);
- mMinuteSpinner.setEnabled(enabled);
- if (mDivider != null) {
- mDivider.setEnabled(enabled);
- }
- mHourSpinner.setEnabled(enabled);
- if (mAmPmSpinner != null) {
- mAmPmSpinner.setEnabled(enabled);
- } else {
- mAmPmButton.setEnabled(enabled);
- }
- mIsEnabled = enabled;
+ // Create the correct UI delegate. Default is the legacy one.
+ final boolean isLegacyMode = shouldForceLegacyMode() ?
+ true : a.getBoolean(R.styleable.TimePicker_legacyMode, true);
+ setLegacyMode(isLegacyMode);
}
- @Override
- public boolean isEnabled() {
- return mIsEnabled;
+ private boolean shouldForceLegacyMode() {
+ final int targetSdkVersion = getContext().getApplicationInfo().targetSdkVersion;
+ return targetSdkVersion < KITKAT;
}
- @Override
- protected void onConfigurationChanged(Configuration newConfig) {
- super.onConfigurationChanged(newConfig);
- setCurrentLocale(newConfig.locale);
+ private TimePickerDelegate createLegacyUIDelegate(Context context, AttributeSet attrs,
+ int defStyleAttr, int defStyleRes) {
+ return new LegacyTimePickerDelegate(this, context, attrs, defStyleAttr, defStyleRes);
}
- /**
- * Sets the current locale.
- *
- * @param locale The current locale.
- */
- private void setCurrentLocale(Locale locale) {
- if (locale.equals(mCurrentLocale)) {
- return;
- }
- mCurrentLocale = locale;
- mTempCalendar = Calendar.getInstance(locale);
+ private TimePickerDelegate createNewUIDelegate(Context context, AttributeSet attrs,
+ int defStyleAttr, int defStyleRes) {
+ return new android.widget.TimePickerDelegate(this, context, attrs, defStyleAttr,
+ defStyleRes);
}
/**
- * Used to save / restore state of time picker
+ * @hide
*/
- private static class SavedState extends BaseSavedState {
-
- private final int mHour;
-
- private final int mMinute;
-
- private SavedState(Parcelable superState, int hour, int minute) {
- super(superState);
- mHour = hour;
- mMinute = minute;
- }
-
- private SavedState(Parcel in) {
- super(in);
- mHour = in.readInt();
- mMinute = in.readInt();
- }
-
- public int getHour() {
- return mHour;
- }
-
- public int getMinute() {
- return mMinute;
- }
-
- @Override
- public void writeToParcel(Parcel dest, int flags) {
- super.writeToParcel(dest, flags);
- dest.writeInt(mHour);
- dest.writeInt(mMinute);
- }
-
- @SuppressWarnings({"unused", "hiding"})
- public static final Parcelable.Creator<SavedState> CREATOR = new Creator<SavedState>() {
- public SavedState createFromParcel(Parcel in) {
- return new SavedState(in);
- }
-
- public SavedState[] newArray(int size) {
- return new SavedState[size];
- }
- };
- }
-
- @Override
- protected Parcelable onSaveInstanceState() {
- Parcelable superState = super.onSaveInstanceState();
- return new SavedState(superState, getCurrentHour(), getCurrentMinute());
- }
-
- @Override
- protected void onRestoreInstanceState(Parcelable state) {
- SavedState ss = (SavedState) state;
- super.onRestoreInstanceState(ss.getSuperState());
- setCurrentHour(ss.getHour());
- setCurrentMinute(ss.getMinute());
+ public void setLegacyMode(boolean isLegacyMode) {
+ removeAllViewsInLayout();
+ mDelegate = isLegacyMode ?
+ createLegacyUIDelegate(mContext, mAttrs, mDefStyleAttr, mDefStyleRes) :
+ createNewUIDelegate(mContext, mAttrs, mDefStyleAttr, mDefStyleRes);
}
/**
- * Set the callback that indicates the time has been adjusted by the user.
- *
- * @param onTimeChangedListener the callback, should not be null.
+ * Set the current hour.
*/
- public void setOnTimeChangedListener(OnTimeChangedListener onTimeChangedListener) {
- mOnTimeChangedListener = onTimeChangedListener;
+ public void setCurrentHour(Integer currentHour) {
+ mDelegate.setCurrentHour(currentHour);
}
/**
* @return The current hour in the range (0-23).
*/
public Integer getCurrentHour() {
- int currentHour = mHourSpinner.getValue();
- if (is24HourView()) {
- return currentHour;
- } else if (mIsAm) {
- return currentHour % HOURS_IN_HALF_DAY;
- } else {
- return (currentHour % HOURS_IN_HALF_DAY) + HOURS_IN_HALF_DAY;
- }
+ return mDelegate.getCurrentHour();
}
/**
- * Set the current hour.
+ * Set the current minute (0-59).
*/
- public void setCurrentHour(Integer currentHour) {
- setCurrentHour(currentHour, true);
+ public void setCurrentMinute(Integer currentMinute) {
+ mDelegate.setCurrentMinute(currentMinute);
}
- private void setCurrentHour(Integer currentHour, boolean notifyTimeChanged) {
- // why was Integer used in the first place?
- if (currentHour == null || currentHour == getCurrentHour()) {
- return;
- }
- if (!is24HourView()) {
- // convert [0,23] ordinal to wall clock display
- if (currentHour >= HOURS_IN_HALF_DAY) {
- mIsAm = false;
- if (currentHour > HOURS_IN_HALF_DAY) {
- currentHour = currentHour - HOURS_IN_HALF_DAY;
- }
- } else {
- mIsAm = true;
- if (currentHour == 0) {
- currentHour = HOURS_IN_HALF_DAY;
- }
- }
- updateAmPmControl();
- }
- mHourSpinner.setValue(currentHour);
- if (notifyTimeChanged) {
- onTimeChanged();
- }
+ /**
+ * @return The current minute.
+ */
+ public Integer getCurrentMinute() {
+ return mDelegate.getCurrentMinute();
}
/**
@@ -478,223 +159,174 @@ public class TimePicker extends FrameLayout {
* @param is24HourView True = 24 hour mode. False = AM/PM.
*/
public void setIs24HourView(Boolean is24HourView) {
- if (mIs24HourView == is24HourView) {
- return;
- }
- // cache the current hour since spinner range changes and BEFORE changing mIs24HourView!!
- int currentHour = getCurrentHour();
- // Order is important here.
- mIs24HourView = is24HourView;
- getHourFormatData();
- updateHourControl();
- // set value after spinner range is updated - be aware that because mIs24HourView has
- // changed then getCurrentHour() is not equal to the currentHour we cached before so
- // explicitly ask for *not* propagating any onTimeChanged()
- setCurrentHour(currentHour, false /* no onTimeChanged() */);
- updateMinuteControl();
- updateAmPmControl();
+ mDelegate.setIs24HourView(is24HourView);
}
/**
* @return true if this is in 24 hour view else false.
*/
public boolean is24HourView() {
- return mIs24HourView;
+ return mDelegate.is24HourView();
}
/**
- * @return The current minute.
+ * Set the callback that indicates the time has been adjusted by the user.
+ *
+ * @param onTimeChangedListener the callback, should not be null.
*/
- public Integer getCurrentMinute() {
- return mMinuteSpinner.getValue();
+ public void setOnTimeChangedListener(OnTimeChangedListener onTimeChangedListener) {
+ mDelegate.setOnTimeChangedListener(onTimeChangedListener);
}
- /**
- * Set the current minute (0-59).
- */
- public void setCurrentMinute(Integer currentMinute) {
- if (currentMinute == getCurrentMinute()) {
+ @Override
+ public void setEnabled(boolean enabled) {
+ if (mDelegate.isEnabled() == enabled) {
return;
}
- mMinuteSpinner.setValue(currentMinute);
- onTimeChanged();
+ super.setEnabled(enabled);
+ mDelegate.setEnabled(enabled);
+ }
+
+ @Override
+ public boolean isEnabled() {
+ return mDelegate.isEnabled();
}
/**
- * The time separator is defined in the Unicode CLDR and cannot be supposed to be ":".
- *
- * See http://unicode.org/cldr/trac/browser/trunk/common/main
- *
- * We pass the correct "skeleton" depending on 12 or 24 hours view and then extract the
- * separator as the character which is just after the hour marker in the returned pattern.
+ * @hide
*/
- private void setDividerText() {
- final Locale defaultLocale = Locale.getDefault();
- final String skeleton = (mIs24HourView) ? "Hm" : "hm";
- final String bestDateTimePattern = DateFormat.getBestDateTimePattern(defaultLocale,
- skeleton);
- final String separatorText;
- int hourIndex = bestDateTimePattern.lastIndexOf('H');
- if (hourIndex == -1) {
- hourIndex = bestDateTimePattern.lastIndexOf('h');
- }
- if (hourIndex == -1) {
- // Default case
- separatorText = ":";
- } else {
- int minuteIndex = bestDateTimePattern.indexOf('m', hourIndex + 1);
- if (minuteIndex == -1) {
- separatorText = Character.toString(bestDateTimePattern.charAt(hourIndex + 1));
- } else {
- separatorText = bestDateTimePattern.substring(hourIndex + 1, minuteIndex);
- }
- }
- mDivider.setText(separatorText);
+ public void setShowDoneButton(boolean showDoneButton) {
+ mDelegate.setShowDoneButton(showDoneButton);
+ }
+
+ /**
+ * @hide
+ */
+ public void setDismissCallback(TimePickerDismissCallback callback) {
+ mDelegate.setDismissCallback(callback);
}
@Override
public int getBaseline() {
- return mHourSpinner.getBaseline();
+ return mDelegate.getBaseline();
+ }
+
+ @Override
+ protected void onConfigurationChanged(Configuration newConfig) {
+ super.onConfigurationChanged(newConfig);
+ mDelegate.onConfigurationChanged(newConfig);
+ }
+
+ @Override
+ protected Parcelable onSaveInstanceState() {
+ Parcelable superState = super.onSaveInstanceState();
+ return mDelegate.onSaveInstanceState(superState);
+ }
+
+ @Override
+ protected void onRestoreInstanceState(Parcelable state) {
+ BaseSavedState ss = (BaseSavedState) state;
+ super.onRestoreInstanceState(ss.getSuperState());
+ mDelegate.onRestoreInstanceState(ss);
}
@Override
public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {
- onPopulateAccessibilityEvent(event);
- return true;
+ return mDelegate.dispatchPopulateAccessibilityEvent(event);
}
@Override
public void onPopulateAccessibilityEvent(AccessibilityEvent event) {
super.onPopulateAccessibilityEvent(event);
-
- int flags = DateUtils.FORMAT_SHOW_TIME;
- if (mIs24HourView) {
- flags |= DateUtils.FORMAT_24HOUR;
- } else {
- flags |= DateUtils.FORMAT_12HOUR;
- }
- mTempCalendar.set(Calendar.HOUR_OF_DAY, getCurrentHour());
- mTempCalendar.set(Calendar.MINUTE, getCurrentMinute());
- String selectedDateUtterance = DateUtils.formatDateTime(mContext,
- mTempCalendar.getTimeInMillis(), flags);
- event.getText().add(selectedDateUtterance);
+ mDelegate.onPopulateAccessibilityEvent(event);
}
@Override
public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
super.onInitializeAccessibilityEvent(event);
- event.setClassName(TimePicker.class.getName());
+ mDelegate.onInitializeAccessibilityEvent(event);
}
@Override
public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
super.onInitializeAccessibilityNodeInfo(info);
- info.setClassName(TimePicker.class.getName());
+ mDelegate.onInitializeAccessibilityNodeInfo(info);
}
- private void updateHourControl() {
- if (is24HourView()) {
- // 'k' means 1-24 hour
- if (mHourFormat == 'k') {
- mHourSpinner.setMinValue(1);
- mHourSpinner.setMaxValue(24);
- } else {
- mHourSpinner.setMinValue(0);
- mHourSpinner.setMaxValue(23);
- }
- } else {
- // 'K' means 0-11 hour
- if (mHourFormat == 'K') {
- mHourSpinner.setMinValue(0);
- mHourSpinner.setMaxValue(11);
- } else {
- mHourSpinner.setMinValue(1);
- mHourSpinner.setMaxValue(12);
- }
- }
- mHourSpinner.setFormatter(mHourWithTwoDigit ? NumberPicker.getTwoDigitFormatter() : null);
- }
+ /**
+ * A delegate interface that defined the public API of the TimePicker. Allows different
+ * TimePicker implementations. This would need to be implemented by the TimePicker delegates
+ * for the real behavior.
+ */
+ interface TimePickerDelegate {
+ void setCurrentHour(Integer currentHour);
+ Integer getCurrentHour();
- private void updateMinuteControl() {
- if (is24HourView()) {
- mMinuteSpinnerInput.setImeOptions(EditorInfo.IME_ACTION_DONE);
- } else {
- mMinuteSpinnerInput.setImeOptions(EditorInfo.IME_ACTION_NEXT);
- }
- }
+ void setCurrentMinute(Integer currentMinute);
+ Integer getCurrentMinute();
- private void updateAmPmControl() {
- if (is24HourView()) {
- if (mAmPmSpinner != null) {
- mAmPmSpinner.setVisibility(View.GONE);
- } else {
- mAmPmButton.setVisibility(View.GONE);
- }
- } else {
- int index = mIsAm ? Calendar.AM : Calendar.PM;
- if (mAmPmSpinner != null) {
- mAmPmSpinner.setValue(index);
- mAmPmSpinner.setVisibility(View.VISIBLE);
- } else {
- mAmPmButton.setText(mAmPmStrings[index]);
- mAmPmButton.setVisibility(View.VISIBLE);
- }
- }
- sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_SELECTED);
- }
+ void setIs24HourView(Boolean is24HourView);
+ boolean is24HourView();
- private void onTimeChanged() {
- sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_SELECTED);
- if (mOnTimeChangedListener != null) {
- mOnTimeChangedListener.onTimeChanged(this, getCurrentHour(), getCurrentMinute());
- }
+ void setOnTimeChangedListener(OnTimeChangedListener onTimeChangedListener);
+
+ void setEnabled(boolean enabled);
+ boolean isEnabled();
+
+ void setShowDoneButton(boolean showDoneButton);
+ void setDismissCallback(TimePickerDismissCallback callback);
+
+ int getBaseline();
+
+ void onConfigurationChanged(Configuration newConfig);
+
+ Parcelable onSaveInstanceState(Parcelable superState);
+ void onRestoreInstanceState(Parcelable state);
+
+ boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event);
+ void onPopulateAccessibilityEvent(AccessibilityEvent event);
+ void onInitializeAccessibilityEvent(AccessibilityEvent event);
+ void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info);
}
- private void setContentDescriptions() {
- // Minute
- trySetContentDescription(mMinuteSpinner, R.id.increment,
- R.string.time_picker_increment_minute_button);
- trySetContentDescription(mMinuteSpinner, R.id.decrement,
- R.string.time_picker_decrement_minute_button);
- // Hour
- trySetContentDescription(mHourSpinner, R.id.increment,
- R.string.time_picker_increment_hour_button);
- trySetContentDescription(mHourSpinner, R.id.decrement,
- R.string.time_picker_decrement_hour_button);
- // AM/PM
- if (mAmPmSpinner != null) {
- trySetContentDescription(mAmPmSpinner, R.id.increment,
- R.string.time_picker_increment_set_pm_button);
- trySetContentDescription(mAmPmSpinner, R.id.decrement,
- R.string.time_picker_decrement_set_am_button);
- }
+ /**
+ * A callback interface for dismissing the TimePicker when included into a Dialog
+ *
+ * @hide
+ */
+ public static interface TimePickerDismissCallback {
+ void dismiss(TimePicker view, boolean isCancel, int hourOfDay, int minute);
}
- private void trySetContentDescription(View root, int viewId, int contDescResId) {
- View target = root.findViewById(viewId);
- if (target != null) {
- target.setContentDescription(mContext.getString(contDescResId));
+ /**
+ * An abstract class which can be used as a start for TimePicker implementations
+ */
+ abstract static class AbstractTimePickerDelegate implements TimePickerDelegate {
+ // The delegator
+ protected TimePicker mDelegator;
+
+ // The context
+ protected Context mContext;
+
+ // The current locale
+ protected Locale mCurrentLocale;
+
+ // Callbacks
+ protected OnTimeChangedListener mOnTimeChangedListener;
+
+ public AbstractTimePickerDelegate(TimePicker delegator, Context context) {
+ mDelegator = delegator;
+ mContext = context;
+
+ // initialization based on locale
+ setCurrentLocale(Locale.getDefault());
}
- }
- private void updateInputState() {
- // Make sure that if the user changes the value and the IME is active
- // for one of the inputs if this widget, the IME is closed. If the user
- // changed the value via the IME and there is a next input the IME will
- // be shown, otherwise the user chose another means of changing the
- // value and having the IME up makes no sense.
- InputMethodManager inputMethodManager = InputMethodManager.peekInstance();
- if (inputMethodManager != null) {
- if (inputMethodManager.isActive(mHourSpinnerInput)) {
- mHourSpinnerInput.clearFocus();
- inputMethodManager.hideSoftInputFromWindow(getWindowToken(), 0);
- } else if (inputMethodManager.isActive(mMinuteSpinnerInput)) {
- mMinuteSpinnerInput.clearFocus();
- inputMethodManager.hideSoftInputFromWindow(getWindowToken(), 0);
- } else if (inputMethodManager.isActive(mAmPmSpinnerInput)) {
- mAmPmSpinnerInput.clearFocus();
- inputMethodManager.hideSoftInputFromWindow(getWindowToken(), 0);
+ public void setCurrentLocale(Locale locale) {
+ if (locale.equals(mCurrentLocale)) {
+ return;
}
+ mCurrentLocale = locale;
}
}
}
diff --git a/core/java/android/widget/TimePickerDelegate.java b/core/java/android/widget/TimePickerDelegate.java
new file mode 100644
index 0000000..182d370
--- /dev/null
+++ b/core/java/android/widget/TimePickerDelegate.java
@@ -0,0 +1,1380 @@
+/*
+ * Copyright (C) 2013 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.animation.Keyframe;
+import android.animation.ObjectAnimator;
+import android.animation.PropertyValuesHolder;
+import android.content.Context;
+import android.content.res.Configuration;
+import android.content.res.Resources;
+import android.content.res.TypedArray;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.text.TextUtils;
+import android.text.format.DateFormat;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.util.TypedValue;
+import android.view.HapticFeedbackConstants;
+import android.view.KeyCharacterMap;
+import android.view.KeyEvent;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.accessibility.AccessibilityEvent;
+import android.view.accessibility.AccessibilityNodeInfo;
+
+import com.android.internal.R;
+
+import java.text.DateFormatSymbols;
+import java.util.ArrayList;
+import java.util.Calendar;
+
+/**
+ * A view for selecting the time of day, in either 24 hour or AM/PM mode.
+ */
+class TimePickerDelegate extends TimePicker.AbstractTimePickerDelegate implements
+ RadialTimePickerView.OnValueSelectedListener {
+
+ private static final String TAG = "TimePickerDelegate";
+
+ // Index used by RadialPickerLayout
+ private static final int HOUR_INDEX = 0;
+ private static final int MINUTE_INDEX = 1;
+
+ // NOT a real index for the purpose of what's showing.
+ private static final int AMPM_INDEX = 2;
+
+ // Also NOT a real index, just used for keyboard mode.
+ private static final int ENABLE_PICKER_INDEX = 3;
+
+ private static final int AM = 0;
+ private static final int PM = 1;
+
+ private static final boolean DEFAULT_ENABLED_STATE = true;
+ private boolean mIsEnabled = DEFAULT_ENABLED_STATE;
+
+ private static final int HOURS_IN_HALF_DAY = 12;
+
+ // Delay in ms before starting the pulse animation
+ private static final int PULSE_ANIMATOR_DELAY = 300;
+
+ // Duration in ms of the pulse animation
+ private static final int PULSE_ANIMATOR_DURATION = 544;
+
+ private static int[] TEXT_APPEARANCE_TIME_LABEL_ATTR =
+ new int[] { R.attr.timePickerHeaderTimeLabelTextAppearance };
+
+ private final View mMainView;
+ private TextView mHourView;
+ private TextView mMinuteView;
+ private TextView mAmPmTextView;
+ private RadialTimePickerView mRadialTimePickerView;
+ private TextView mSeparatorView;
+
+ private ViewGroup mLayoutButtons;
+
+ private int mHeaderSelectedColor;
+ private int mHeaderUnSelectedColor;
+ private String mAmText;
+ private String mPmText;
+
+ private boolean mAllowAutoAdvance;
+ private int mInitialHourOfDay;
+ private int mInitialMinute;
+ private boolean mIs24HourView;
+
+ // For hardware IME input.
+ private char mPlaceholderText;
+ private String mDoublePlaceholderText;
+ private String mDeletedKeyFormat;
+ private boolean mInKbMode;
+ private ArrayList<Integer> mTypedTimes = new ArrayList<Integer>();
+ private Node mLegalTimesTree;
+ private int mAmKeyCode;
+ private int mPmKeyCode;
+
+ // For showing the done button when in a Dialog
+ private Button mDoneButton;
+ private boolean mShowDoneButton;
+ private TimePicker.TimePickerDismissCallback mDismissCallback;
+
+ // Accessibility strings.
+ private String mHourPickerDescription;
+ private String mSelectHours;
+ private String mMinutePickerDescription;
+ private String mSelectMinutes;
+
+ public TimePickerDelegate(TimePicker delegator, Context context, AttributeSet attrs,
+ int defStyleAttr, int defStyleRes) {
+ super(delegator, context);
+
+ // process style attributes
+ final TypedArray a = mContext.obtainStyledAttributes(attrs,
+ R.styleable.TimePicker, defStyleAttr, defStyleRes);
+
+ final Resources res = mContext.getResources();
+
+ mHourPickerDescription = res.getString(R.string.hour_picker_description);
+ mSelectHours = res.getString(R.string.select_hours);
+ mMinutePickerDescription = res.getString(R.string.minute_picker_description);
+ mSelectMinutes = res.getString(R.string.select_minutes);
+
+ mHeaderSelectedColor = a.getColor(R.styleable.TimePicker_headerSelectedTextColor,
+ android.R.color.holo_blue_light);
+
+ mHeaderUnSelectedColor = getUnselectedColor(
+ R.color.timepicker_default_text_color_holo_light);
+ if (mHeaderUnSelectedColor == -1) {
+ mHeaderUnSelectedColor = a.getColor(R.styleable.TimePicker_headerUnselectedTextColor,
+ R.color.timepicker_default_text_color_holo_light);
+ }
+
+ final int headerBackgroundColor = a.getColor(
+ R.styleable.TimePicker_headerBackgroundColor, 0);
+
+ a.recycle();
+
+ final int layoutResourceId = a.getResourceId(
+ R.styleable.TimePicker_internalLayout, R.layout.time_picker_holo);
+
+ final LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(
+ Context.LAYOUT_INFLATER_SERVICE);
+
+ mMainView = inflater.inflate(layoutResourceId, null);
+ mDelegator.addView(mMainView);
+
+ if (headerBackgroundColor != 0) {
+ RelativeLayout header = (RelativeLayout) mMainView.findViewById(R.id.time_header);
+ header.setBackgroundColor(headerBackgroundColor);
+ }
+
+ mHourView = (TextView) mMainView.findViewById(R.id.hours);
+ mMinuteView = (TextView) mMainView.findViewById(R.id.minutes);
+ mAmPmTextView = (TextView) mMainView.findViewById(R.id.ampm_label);
+ mSeparatorView = (TextView) mMainView.findViewById(R.id.separator);
+ mRadialTimePickerView = (RadialTimePickerView) mMainView.findViewById(R.id.radial_picker);
+
+ mLayoutButtons = (ViewGroup) mMainView.findViewById(R.id.layout_buttons);
+ mDoneButton = (Button) mMainView.findViewById(R.id.done_button);
+
+ String[] amPmTexts = new DateFormatSymbols().getAmPmStrings();
+ mAmText = amPmTexts[0];
+ mPmText = amPmTexts[1];
+
+ setupListeners();
+
+ mAllowAutoAdvance = true;
+
+ // Set up for keyboard mode.
+ mDoublePlaceholderText = res.getString(R.string.time_placeholder);
+ mDeletedKeyFormat = res.getString(R.string.deleted_key);
+ mPlaceholderText = mDoublePlaceholderText.charAt(0);
+ mAmKeyCode = mPmKeyCode = -1;
+ generateLegalTimesTree();
+
+ // Initialize with current time
+ final Calendar calendar = Calendar.getInstance(mCurrentLocale);
+ final int currentHour = calendar.get(Calendar.HOUR_OF_DAY);
+ final int currentMinute = calendar.get(Calendar.MINUTE);
+ initialize(currentHour, currentMinute, false /* 12h */, HOUR_INDEX, false);
+ }
+
+ private int getUnselectedColor(int defColor) {
+ int result = -1;
+ final Resources.Theme theme = mContext.getTheme();
+ final TypedValue outValue = new TypedValue();
+ theme.resolveAttribute(R.attr.timePickerHeaderTimeLabelTextAppearance, outValue, true);
+ final int appearanceResId = outValue.resourceId;
+ TypedArray appearance = null;
+ if (appearanceResId != -1) {
+ appearance = theme.obtainStyledAttributes(appearanceResId,
+ com.android.internal.R.styleable.TextAppearance);
+ }
+ if (appearance != null) {
+ result = appearance.getColor(
+ com.android.internal.R.styleable.TextAppearance_textColor, defColor);
+ appearance.recycle();
+ }
+ return result;
+ }
+
+ private void initialize(int hourOfDay, int minute, boolean is24HourView, int index,
+ boolean showDoneButton) {
+ mInitialHourOfDay = hourOfDay;
+ mInitialMinute = minute;
+ mIs24HourView = is24HourView;
+ mInKbMode = false;
+ mShowDoneButton = showDoneButton;
+ updateUI(index);
+ }
+
+ private void setupListeners() {
+ KeyboardListener keyboardListener = new KeyboardListener();
+ mDelegator.setOnKeyListener(keyboardListener);
+
+ mHourView.setOnKeyListener(keyboardListener);
+ mMinuteView.setOnKeyListener(keyboardListener);
+ mAmPmTextView.setOnKeyListener(keyboardListener);
+ mRadialTimePickerView.setOnValueSelectedListener(this);
+ mRadialTimePickerView.setOnKeyListener(keyboardListener);
+
+ mHourView.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ setCurrentItemShowing(HOUR_INDEX, true, false, true);
+ tryVibrate();
+ }
+ });
+ mMinuteView.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ setCurrentItemShowing(MINUTE_INDEX, true, false, true);
+ tryVibrate();
+ }
+ });
+ mDoneButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ if (mInKbMode && isTypedTimeFullyLegal()) {
+ finishKbMode(false);
+ } else {
+ tryVibrate();
+ }
+ if (mDismissCallback != null) {
+ mDismissCallback.dismiss(mDelegator, false, getCurrentHour(),
+ getCurrentMinute());
+ }
+ }
+ });
+ mDoneButton.setOnKeyListener(keyboardListener);
+ }
+
+ private void updateUI(int index) {
+ // Update RadialPicker values
+ updateRadialPicker(index);
+ // Enable or disable the AM/PM view.
+ updateHeaderAmPm();
+ // Show or hide Done button
+ updateDoneButton();
+ // Update Hour and Minutes
+ updateHeaderHour(mInitialHourOfDay, true);
+ // Update time separator
+ updateHeaderSeparator();
+ // Update Minutes
+ updateHeaderMinute(mInitialMinute);
+ // Invalidate everything
+ mDelegator.invalidate();
+ }
+
+ private void updateRadialPicker(int index) {
+ mRadialTimePickerView.initialize(mInitialHourOfDay, mInitialMinute, mIs24HourView);
+ setCurrentItemShowing(index, false, true, true);
+ }
+
+ private int computeMaxWidthOfNumbers(int max) {
+ TextView tempView = new TextView(mContext);
+ TypedArray a = mContext.obtainStyledAttributes(TEXT_APPEARANCE_TIME_LABEL_ATTR);
+ final int textAppearanceResId = a.getResourceId(0, 0);
+ tempView.setTextAppearance(mContext, (textAppearanceResId != 0) ?
+ textAppearanceResId : R.style.TextAppearance_Holo_TimePicker_TimeLabel);
+ a.recycle();
+ ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
+ ViewGroup.LayoutParams.WRAP_CONTENT);
+ tempView.setLayoutParams(lp);
+ int maxWidth = 0;
+ for (int minutes = 0; minutes < max; minutes++) {
+ final String text = String.format("%02d", minutes);
+ tempView.setText(text);
+ tempView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
+ maxWidth = Math.max(maxWidth, tempView.getMeasuredWidth());
+ }
+ return maxWidth;
+ }
+
+ private void updateHeaderAmPm() {
+ if (mIs24HourView) {
+ mAmPmTextView.setVisibility(View.GONE);
+ } else {
+ mAmPmTextView.setVisibility(View.VISIBLE);
+ final String bestDateTimePattern = DateFormat.getBestDateTimePattern(mCurrentLocale,
+ "hm");
+
+ boolean amPmOnLeft = bestDateTimePattern.startsWith("a");
+ if (TextUtils.getLayoutDirectionFromLocale(mCurrentLocale) ==
+ View.LAYOUT_DIRECTION_RTL) {
+ amPmOnLeft = !amPmOnLeft;
+ }
+
+ RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams)
+ mAmPmTextView.getLayoutParams();
+
+ if (amPmOnLeft) {
+ layoutParams.rightMargin = computeMaxWidthOfNumbers(12 /* for hours */);
+ layoutParams.removeRule(RelativeLayout.RIGHT_OF);
+ layoutParams.addRule(RelativeLayout.LEFT_OF, R.id.separator);
+ } else {
+ layoutParams.leftMargin = computeMaxWidthOfNumbers(60 /* for minutes */);
+ layoutParams.removeRule(RelativeLayout.LEFT_OF);
+ layoutParams.addRule(RelativeLayout.RIGHT_OF, R.id.separator);
+ }
+
+ updateAmPmDisplay(mInitialHourOfDay < 12 ? AM : PM);
+ mAmPmTextView.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ tryVibrate();
+ int amOrPm = mRadialTimePickerView.getAmOrPm();
+ if (amOrPm == AM) {
+ amOrPm = PM;
+ } else if (amOrPm == PM){
+ amOrPm = AM;
+ }
+ updateAmPmDisplay(amOrPm);
+ mRadialTimePickerView.setAmOrPm(amOrPm);
+ }
+ });
+ }
+ }
+
+ private void updateDoneButton() {
+ mLayoutButtons.setVisibility(mShowDoneButton ? View.VISIBLE : View.GONE);
+ }
+
+ /**
+ * Set the current hour.
+ */
+ @Override
+ public void setCurrentHour(Integer currentHour) {
+ if (mInitialHourOfDay == currentHour) {
+ return;
+ }
+ mInitialHourOfDay = currentHour;
+ updateHeaderHour(currentHour, true /* accessibility announce */);
+ updateHeaderAmPm();
+ mRadialTimePickerView.setCurrentHour(currentHour);
+ mRadialTimePickerView.setAmOrPm(mInitialHourOfDay < 12 ? AM : PM);
+ mDelegator.invalidate();
+ onTimeChanged();
+ }
+
+ /**
+ * @return The current hour in the range (0-23).
+ */
+ @Override
+ public Integer getCurrentHour() {
+ int currentHour = mRadialTimePickerView.getCurrentHour();
+ if (mIs24HourView) {
+ return currentHour;
+ } else {
+ switch(mRadialTimePickerView.getAmOrPm()) {
+ case PM:
+ return (currentHour % HOURS_IN_HALF_DAY) + HOURS_IN_HALF_DAY;
+ case AM:
+ default:
+ return currentHour % HOURS_IN_HALF_DAY;
+ }
+ }
+ }
+
+ /**
+ * Set the current minute (0-59).
+ */
+ @Override
+ public void setCurrentMinute(Integer currentMinute) {
+ if (mInitialMinute == currentMinute) {
+ return;
+ }
+ mInitialMinute = currentMinute;
+ updateHeaderMinute(currentMinute);
+ mRadialTimePickerView.setCurrentMinute(currentMinute);
+ mDelegator.invalidate();
+ onTimeChanged();
+ }
+
+ /**
+ * @return The current minute.
+ */
+ @Override
+ public Integer getCurrentMinute() {
+ return mRadialTimePickerView.getCurrentMinute();
+ }
+
+ /**
+ * Set whether in 24 hour or AM/PM mode.
+ *
+ * @param is24HourView True = 24 hour mode. False = AM/PM.
+ */
+ @Override
+ public void setIs24HourView(Boolean is24HourView) {
+ if (is24HourView == mIs24HourView) {
+ return;
+ }
+ mIs24HourView = is24HourView;
+ generateLegalTimesTree();
+ int hour = mRadialTimePickerView.getCurrentHour();
+ mInitialHourOfDay = hour;
+ updateHeaderHour(hour, false /* no accessibility announce */);
+ updateHeaderAmPm();
+ updateRadialPicker(mRadialTimePickerView.getCurrentItemShowing());
+ mDelegator.invalidate();
+ }
+
+ /**
+ * @return true if this is in 24 hour view else false.
+ */
+ @Override
+ public boolean is24HourView() {
+ return mIs24HourView;
+ }
+
+ @Override
+ public void setOnTimeChangedListener(TimePicker.OnTimeChangedListener callback) {
+ mOnTimeChangedListener = callback;
+ }
+
+ @Override
+ public void setEnabled(boolean enabled) {
+ mHourView.setEnabled(enabled);
+ mMinuteView.setEnabled(enabled);
+ mAmPmTextView.setEnabled(enabled);
+ mRadialTimePickerView.setEnabled(enabled);
+ mIsEnabled = enabled;
+ }
+
+ @Override
+ public boolean isEnabled() {
+ return mIsEnabled;
+ }
+
+ @Override
+ public void setShowDoneButton(boolean showDoneButton) {
+ mShowDoneButton = showDoneButton;
+ updateDoneButton();
+ }
+
+ @Override
+ public void setDismissCallback(TimePicker.TimePickerDismissCallback callback) {
+ mDismissCallback = callback;
+ }
+
+ @Override
+ public int getBaseline() {
+ // does not support baseline alignment
+ return -1;
+ }
+
+ @Override
+ public void onConfigurationChanged(Configuration newConfig) {
+ updateUI(mRadialTimePickerView.getCurrentItemShowing());
+ }
+
+ @Override
+ public Parcelable onSaveInstanceState(Parcelable superState) {
+ return new SavedState(superState, getCurrentHour(), getCurrentMinute(),
+ is24HourView(), inKbMode(), getTypedTimes(), getCurrentItemShowing(),
+ isShowDoneButton());
+ }
+
+ @Override
+ public void onRestoreInstanceState(Parcelable state) {
+ SavedState ss = (SavedState) state;
+ setInKbMode(ss.inKbMode());
+ setTypedTimes(ss.getTypesTimes());
+ initialize(ss.getHour(), ss.getMinute(), ss.is24HourMode(), ss.getCurrentItemShowing(),
+ ss.isShowDoneButton());
+ mRadialTimePickerView.invalidate();
+ if (mInKbMode) {
+ tryStartingKbMode(-1);
+ mHourView.invalidate();
+ }
+ }
+
+ @Override
+ public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {
+ return mRadialTimePickerView.dispatchPopulateAccessibilityEvent(event);
+ }
+
+ @Override
+ public void onPopulateAccessibilityEvent(AccessibilityEvent event) {
+ mRadialTimePickerView.onPopulateAccessibilityEvent(event);
+ }
+
+ @Override
+ public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
+ mRadialTimePickerView.onInitializeAccessibilityEvent(event);
+ }
+
+ @Override
+ public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
+ mRadialTimePickerView.onInitializeAccessibilityNodeInfo(info);
+ }
+
+ /**
+ * Set whether in keyboard mode or not.
+ *
+ * @param inKbMode True means in keyboard mode.
+ */
+ private void setInKbMode(boolean inKbMode) {
+ mInKbMode = inKbMode;
+ }
+
+ /**
+ * @return true if in keyboard mode
+ */
+ private boolean inKbMode() {
+ return mInKbMode;
+ }
+
+ private void setTypedTimes(ArrayList<Integer> typeTimes) {
+ mTypedTimes = typeTimes;
+ }
+
+ /**
+ * @return an array of typed times
+ */
+ private ArrayList<Integer> getTypedTimes() {
+ return mTypedTimes;
+ }
+
+ /**
+ * @return the index of the current item showing
+ */
+ private int getCurrentItemShowing() {
+ return mRadialTimePickerView.getCurrentItemShowing();
+ }
+
+ private boolean isShowDoneButton() {
+ return mShowDoneButton;
+ }
+
+ /**
+ * Propagate the time change
+ */
+ private void onTimeChanged() {
+ mDelegator.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_SELECTED);
+ if (mOnTimeChangedListener != null) {
+ mOnTimeChangedListener.onTimeChanged(mDelegator,
+ getCurrentHour(), getCurrentMinute());
+ }
+ }
+
+ /**
+ * Used to save / restore state of time picker
+ */
+ private static class SavedState extends View.BaseSavedState {
+
+ private final int mHour;
+ private final int mMinute;
+ private final boolean mIs24HourMode;
+ private final boolean mInKbMode;
+ private final ArrayList<Integer> mTypedTimes;
+ private final int mCurrentItemShowing;
+ private final boolean mShowDoneButton;
+
+ private SavedState(Parcelable superState, int hour, int minute, boolean is24HourMode,
+ boolean isKbMode, ArrayList<Integer> typedTimes,
+ int currentItemShowing, boolean showDoneButton) {
+ super(superState);
+ mHour = hour;
+ mMinute = minute;
+ mIs24HourMode = is24HourMode;
+ mInKbMode = isKbMode;
+ mTypedTimes = typedTimes;
+ mCurrentItemShowing = currentItemShowing;
+ mShowDoneButton = showDoneButton;
+ }
+
+ private SavedState(Parcel in) {
+ super(in);
+ mHour = in.readInt();
+ mMinute = in.readInt();
+ mIs24HourMode = (in.readInt() == 1);
+ mInKbMode = (in.readInt() == 1);
+ mTypedTimes = in.readArrayList(getClass().getClassLoader());
+ mCurrentItemShowing = in.readInt();
+ mShowDoneButton = (in.readInt() == 1);
+ }
+
+ public int getHour() {
+ return mHour;
+ }
+
+ public int getMinute() {
+ return mMinute;
+ }
+
+ public boolean is24HourMode() {
+ return mIs24HourMode;
+ }
+
+ public boolean inKbMode() {
+ return mInKbMode;
+ }
+
+ public ArrayList<Integer> getTypesTimes() {
+ return mTypedTimes;
+ }
+
+ public int getCurrentItemShowing() {
+ return mCurrentItemShowing;
+ }
+
+ public boolean isShowDoneButton() {
+ return mShowDoneButton;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ super.writeToParcel(dest, flags);
+ dest.writeInt(mHour);
+ dest.writeInt(mMinute);
+ dest.writeInt(mIs24HourMode ? 1 : 0);
+ dest.writeInt(mInKbMode ? 1 : 0);
+ dest.writeList(mTypedTimes);
+ dest.writeInt(mCurrentItemShowing);
+ dest.writeInt(mShowDoneButton ? 1 : 0);
+ }
+
+ @SuppressWarnings({"unused", "hiding"})
+ public static final Parcelable.Creator<SavedState> CREATOR = new Creator<SavedState>() {
+ public SavedState createFromParcel(Parcel in) {
+ return new SavedState(in);
+ }
+
+ public SavedState[] newArray(int size) {
+ return new SavedState[size];
+ }
+ };
+ }
+
+ private void tryVibrate() {
+ mDelegator.performHapticFeedback(HapticFeedbackConstants.CLOCK_TICK);
+ }
+
+ private void updateAmPmDisplay(int amOrPm) {
+ if (amOrPm == AM) {
+ mAmPmTextView.setText(mAmText);
+ mRadialTimePickerView.announceForAccessibility(mAmText);
+ } else if (amOrPm == PM){
+ mAmPmTextView.setText(mPmText);
+ mRadialTimePickerView.announceForAccessibility(mPmText);
+ } else {
+ mAmPmTextView.setText(mDoublePlaceholderText);
+ }
+ }
+
+ /**
+ * Called by the picker for updating the header display.
+ */
+ @Override
+ public void onValueSelected(int pickerIndex, int newValue, boolean autoAdvance) {
+ if (pickerIndex == HOUR_INDEX) {
+ updateHeaderHour(newValue, false);
+ String announcement = String.format("%d", newValue);
+ if (mAllowAutoAdvance && autoAdvance) {
+ setCurrentItemShowing(MINUTE_INDEX, true, true, false);
+ announcement += ". " + mSelectMinutes;
+ } else {
+ mRadialTimePickerView.setContentDescription(
+ mHourPickerDescription + ": " + newValue);
+ }
+
+ mRadialTimePickerView.announceForAccessibility(announcement);
+ } else if (pickerIndex == MINUTE_INDEX){
+ updateHeaderMinute(newValue);
+ mRadialTimePickerView.setContentDescription(mMinutePickerDescription + ": " + newValue);
+ } else if (pickerIndex == AMPM_INDEX) {
+ updateAmPmDisplay(newValue);
+ } else if (pickerIndex == ENABLE_PICKER_INDEX) {
+ if (!isTypedTimeFullyLegal()) {
+ mTypedTimes.clear();
+ }
+ finishKbMode(true);
+ }
+ }
+
+ private void updateHeaderHour(int value, boolean announce) {
+ final String bestDateTimePattern = DateFormat.getBestDateTimePattern(mCurrentLocale,
+ (mIs24HourView) ? "Hm" : "hm");
+ final int lengthPattern = bestDateTimePattern.length();
+ boolean hourWithTwoDigit = false;
+ char hourFormat = '\0';
+ // Check if the returned pattern is single or double 'H', 'h', 'K', 'k'. We also save
+ // the hour format that we found.
+ for (int i = 0; i < lengthPattern; i++) {
+ final char c = bestDateTimePattern.charAt(i);
+ if (c == 'H' || c == 'h' || c == 'K' || c == 'k') {
+ hourFormat = c;
+ if (i + 1 < lengthPattern && c == bestDateTimePattern.charAt(i + 1)) {
+ hourWithTwoDigit = true;
+ }
+ break;
+ }
+ }
+ final String format;
+ if (hourWithTwoDigit) {
+ format = "%02d";
+ } else {
+ format = "%d";
+ }
+ if (mIs24HourView) {
+ // 'k' means 1-24 hour
+ if (hourFormat == 'k' && value == 0) {
+ value = 24;
+ }
+ } else {
+ // 'K' means 0-11 hour
+ value = modulo12(value, hourFormat == 'K');
+ }
+ CharSequence text = String.format(format, value);
+ mHourView.setText(text);
+ if (announce) {
+ mRadialTimePickerView.announceForAccessibility(text);
+ }
+ }
+
+ private static int modulo12(int n, boolean startWithZero) {
+ int value = n % 12;
+ if (value == 0 && !startWithZero) {
+ value = 12;
+ }
+ return value;
+ }
+
+ /**
+ * The time separator is defined in the Unicode CLDR and cannot be supposed to be ":".
+ *
+ * See http://unicode.org/cldr/trac/browser/trunk/common/main
+ *
+ * We pass the correct "skeleton" depending on 12 or 24 hours view and then extract the
+ * separator as the character which is just after the hour marker in the returned pattern.
+ */
+ private void updateHeaderSeparator() {
+ final String bestDateTimePattern = DateFormat.getBestDateTimePattern(mCurrentLocale,
+ (mIs24HourView) ? "Hm" : "hm");
+ final String separatorText;
+ // See http://www.unicode.org/reports/tr35/tr35-dates.html for hour formats
+ final char[] hourFormats = {'H', 'h', 'K', 'k'};
+ int hIndex = lastIndexOfAny(bestDateTimePattern, hourFormats);
+ if (hIndex == -1) {
+ // Default case
+ separatorText = ":";
+ } else {
+ separatorText = Character.toString(bestDateTimePattern.charAt(hIndex + 1));
+ }
+ mSeparatorView.setText(separatorText);
+ }
+
+ static private int lastIndexOfAny(String str, char[] any) {
+ final int lengthAny = any.length;
+ if (lengthAny > 0) {
+ for (int i = str.length() - 1; i >= 0; i--) {
+ char c = str.charAt(i);
+ for (int j = 0; j < lengthAny; j++) {
+ if (c == any[j]) {
+ return i;
+ }
+ }
+ }
+ }
+ return -1;
+ }
+
+ private void updateHeaderMinute(int value) {
+ if (value == 60) {
+ value = 0;
+ }
+ CharSequence text = String.format(mCurrentLocale, "%02d", value);
+ mRadialTimePickerView.announceForAccessibility(text);
+ mMinuteView.setText(text);
+ }
+
+ /**
+ * Show either Hours or Minutes.
+ */
+ private void setCurrentItemShowing(int index, boolean animateCircle, boolean delayLabelAnimate,
+ boolean announce) {
+ mRadialTimePickerView.setCurrentItemShowing(index, animateCircle);
+
+ TextView labelToAnimate;
+ if (index == HOUR_INDEX) {
+ int hours = mRadialTimePickerView.getCurrentHour();
+ if (!mIs24HourView) {
+ hours = hours % 12;
+ }
+ mRadialTimePickerView.setContentDescription(mHourPickerDescription + ": " + hours);
+ if (announce) {
+ mRadialTimePickerView.announceForAccessibility(mSelectHours);
+ }
+ labelToAnimate = mHourView;
+ } else {
+ int minutes = mRadialTimePickerView.getCurrentMinute();
+ mRadialTimePickerView.setContentDescription(mMinutePickerDescription + ": " + minutes);
+ if (announce) {
+ mRadialTimePickerView.announceForAccessibility(mSelectMinutes);
+ }
+ labelToAnimate = mMinuteView;
+ }
+
+ int hourColor = (index == HOUR_INDEX) ? mHeaderSelectedColor : mHeaderUnSelectedColor;
+ int minuteColor = (index == MINUTE_INDEX) ? mHeaderSelectedColor : mHeaderUnSelectedColor;
+ mHourView.setTextColor(hourColor);
+ mMinuteView.setTextColor(minuteColor);
+
+ ObjectAnimator pulseAnimator = getPulseAnimator(labelToAnimate, 0.85f, 1.1f);
+ if (delayLabelAnimate) {
+ pulseAnimator.setStartDelay(PULSE_ANIMATOR_DELAY);
+ }
+ pulseAnimator.start();
+ }
+
+ /**
+ * For keyboard mode, processes key events.
+ *
+ * @param keyCode the pressed key.
+ *
+ * @return true if the key was successfully processed, false otherwise.
+ */
+ private boolean processKeyUp(int keyCode) {
+ if (keyCode == KeyEvent.KEYCODE_ESCAPE || keyCode == KeyEvent.KEYCODE_BACK) {
+ if (mDismissCallback != null) {
+ mDismissCallback.dismiss(mDelegator, true, getCurrentHour(), getCurrentMinute());
+ }
+ return true;
+ } else if (keyCode == KeyEvent.KEYCODE_TAB) {
+ if(mInKbMode) {
+ if (isTypedTimeFullyLegal()) {
+ finishKbMode(true);
+ }
+ return true;
+ }
+ } else if (keyCode == KeyEvent.KEYCODE_ENTER) {
+ if (mInKbMode) {
+ if (!isTypedTimeFullyLegal()) {
+ return true;
+ }
+ finishKbMode(false);
+ }
+ if (mOnTimeChangedListener != null) {
+ mOnTimeChangedListener.onTimeChanged(mDelegator,
+ mRadialTimePickerView.getCurrentHour(),
+ mRadialTimePickerView.getCurrentMinute());
+ }
+ if (mDismissCallback != null) {
+ mDismissCallback.dismiss(mDelegator, false, getCurrentHour(), getCurrentMinute());
+ }
+ return true;
+ } else if (keyCode == KeyEvent.KEYCODE_DEL) {
+ if (mInKbMode) {
+ if (!mTypedTimes.isEmpty()) {
+ int deleted = deleteLastTypedKey();
+ String deletedKeyStr;
+ if (deleted == getAmOrPmKeyCode(AM)) {
+ deletedKeyStr = mAmText;
+ } else if (deleted == getAmOrPmKeyCode(PM)) {
+ deletedKeyStr = mPmText;
+ } else {
+ deletedKeyStr = String.format("%d", getValFromKeyCode(deleted));
+ }
+ mRadialTimePickerView.announceForAccessibility(
+ String.format(mDeletedKeyFormat, deletedKeyStr));
+ updateDisplay(true);
+ }
+ }
+ } else if (keyCode == KeyEvent.KEYCODE_0 || keyCode == KeyEvent.KEYCODE_1
+ || keyCode == KeyEvent.KEYCODE_2 || keyCode == KeyEvent.KEYCODE_3
+ || keyCode == KeyEvent.KEYCODE_4 || keyCode == KeyEvent.KEYCODE_5
+ || keyCode == KeyEvent.KEYCODE_6 || keyCode == KeyEvent.KEYCODE_7
+ || keyCode == KeyEvent.KEYCODE_8 || keyCode == KeyEvent.KEYCODE_9
+ || (!mIs24HourView &&
+ (keyCode == getAmOrPmKeyCode(AM) || keyCode == getAmOrPmKeyCode(PM)))) {
+ if (!mInKbMode) {
+ if (mRadialTimePickerView == null) {
+ // Something's wrong, because time picker should definitely not be null.
+ Log.e(TAG, "Unable to initiate keyboard mode, TimePicker was null.");
+ return true;
+ }
+ mTypedTimes.clear();
+ tryStartingKbMode(keyCode);
+ return true;
+ }
+ // We're already in keyboard mode.
+ if (addKeyIfLegal(keyCode)) {
+ updateDisplay(false);
+ }
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Try to start keyboard mode with the specified key.
+ *
+ * @param keyCode The key to use as the first press. Keyboard mode will not be started if the
+ * key is not legal to start with. Or, pass in -1 to get into keyboard mode without a starting
+ * key.
+ */
+ private void tryStartingKbMode(int keyCode) {
+ if (keyCode == -1 || addKeyIfLegal(keyCode)) {
+ mInKbMode = true;
+ mDoneButton.setEnabled(false);
+ updateDisplay(false);
+ mRadialTimePickerView.setInputEnabled(false);
+ }
+ }
+
+ private boolean addKeyIfLegal(int keyCode) {
+ // If we're in 24hour mode, we'll need to check if the input is full. If in AM/PM mode,
+ // we'll need to see if AM/PM have been typed.
+ if ((mIs24HourView && mTypedTimes.size() == 4) ||
+ (!mIs24HourView && isTypedTimeFullyLegal())) {
+ return false;
+ }
+
+ mTypedTimes.add(keyCode);
+ if (!isTypedTimeLegalSoFar()) {
+ deleteLastTypedKey();
+ return false;
+ }
+
+ int val = getValFromKeyCode(keyCode);
+ mRadialTimePickerView.announceForAccessibility(String.format("%d", val));
+ // Automatically fill in 0's if AM or PM was legally entered.
+ if (isTypedTimeFullyLegal()) {
+ if (!mIs24HourView && mTypedTimes.size() <= 3) {
+ mTypedTimes.add(mTypedTimes.size() - 1, KeyEvent.KEYCODE_0);
+ mTypedTimes.add(mTypedTimes.size() - 1, KeyEvent.KEYCODE_0);
+ }
+ mDoneButton.setEnabled(true);
+ }
+
+ return true;
+ }
+
+ /**
+ * Traverse the tree to see if the keys that have been typed so far are legal as is,
+ * or may become legal as more keys are typed (excluding backspace).
+ */
+ private boolean isTypedTimeLegalSoFar() {
+ Node node = mLegalTimesTree;
+ for (int keyCode : mTypedTimes) {
+ node = node.canReach(keyCode);
+ if (node == null) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Check if the time that has been typed so far is completely legal, as is.
+ */
+ private boolean isTypedTimeFullyLegal() {
+ if (mIs24HourView) {
+ // For 24-hour mode, the time is legal if the hours and minutes are each legal. Note:
+ // getEnteredTime() will ONLY call isTypedTimeFullyLegal() when NOT in 24hour mode.
+ int[] values = getEnteredTime(null);
+ return (values[0] >= 0 && values[1] >= 0 && values[1] < 60);
+ } else {
+ // For AM/PM mode, the time is legal if it contains an AM or PM, as those can only be
+ // legally added at specific times based on the tree's algorithm.
+ return (mTypedTimes.contains(getAmOrPmKeyCode(AM)) ||
+ mTypedTimes.contains(getAmOrPmKeyCode(PM)));
+ }
+ }
+
+ private int deleteLastTypedKey() {
+ int deleted = mTypedTimes.remove(mTypedTimes.size() - 1);
+ if (!isTypedTimeFullyLegal()) {
+ mDoneButton.setEnabled(false);
+ }
+ return deleted;
+ }
+
+ /**
+ * Get out of keyboard mode. If there is nothing in typedTimes, revert to TimePicker's time.
+ * @param updateDisplays If true, update the displays with the relevant time.
+ */
+ private void finishKbMode(boolean updateDisplays) {
+ mInKbMode = false;
+ if (!mTypedTimes.isEmpty()) {
+ int values[] = getEnteredTime(null);
+ mRadialTimePickerView.setCurrentHour(values[0]);
+ mRadialTimePickerView.setCurrentMinute(values[1]);
+ if (!mIs24HourView) {
+ mRadialTimePickerView.setAmOrPm(values[2]);
+ }
+ mTypedTimes.clear();
+ }
+ if (updateDisplays) {
+ updateDisplay(false);
+ mRadialTimePickerView.setInputEnabled(true);
+ }
+ }
+
+ /**
+ * Update the hours, minutes, and AM/PM displays with the typed times. If the typedTimes is
+ * empty, either show an empty display (filled with the placeholder text), or update from the
+ * timepicker's values.
+ *
+ * @param allowEmptyDisplay if true, then if the typedTimes is empty, use the placeholder text.
+ * Otherwise, revert to the timepicker's values.
+ */
+ private void updateDisplay(boolean allowEmptyDisplay) {
+ if (!allowEmptyDisplay && mTypedTimes.isEmpty()) {
+ int hour = mRadialTimePickerView.getCurrentHour();
+ int minute = mRadialTimePickerView.getCurrentMinute();
+ updateHeaderHour(hour, true);
+ updateHeaderMinute(minute);
+ if (!mIs24HourView) {
+ updateAmPmDisplay(hour < 12 ? AM : PM);
+ }
+ setCurrentItemShowing(mRadialTimePickerView.getCurrentItemShowing(), true, true, true);
+ mDoneButton.setEnabled(true);
+ } else {
+ boolean[] enteredZeros = {false, false};
+ int[] values = getEnteredTime(enteredZeros);
+ String hourFormat = enteredZeros[0] ? "%02d" : "%2d";
+ String minuteFormat = (enteredZeros[1]) ? "%02d" : "%2d";
+ String hourStr = (values[0] == -1) ? mDoublePlaceholderText :
+ String.format(hourFormat, values[0]).replace(' ', mPlaceholderText);
+ String minuteStr = (values[1] == -1) ? mDoublePlaceholderText :
+ String.format(minuteFormat, values[1]).replace(' ', mPlaceholderText);
+ mHourView.setText(hourStr);
+ mHourView.setTextColor(mHeaderUnSelectedColor);
+ mMinuteView.setText(minuteStr);
+ mMinuteView.setTextColor(mHeaderUnSelectedColor);
+ if (!mIs24HourView) {
+ updateAmPmDisplay(values[2]);
+ }
+ }
+ }
+
+ private int getValFromKeyCode(int keyCode) {
+ switch (keyCode) {
+ case KeyEvent.KEYCODE_0:
+ return 0;
+ case KeyEvent.KEYCODE_1:
+ return 1;
+ case KeyEvent.KEYCODE_2:
+ return 2;
+ case KeyEvent.KEYCODE_3:
+ return 3;
+ case KeyEvent.KEYCODE_4:
+ return 4;
+ case KeyEvent.KEYCODE_5:
+ return 5;
+ case KeyEvent.KEYCODE_6:
+ return 6;
+ case KeyEvent.KEYCODE_7:
+ return 7;
+ case KeyEvent.KEYCODE_8:
+ return 8;
+ case KeyEvent.KEYCODE_9:
+ return 9;
+ default:
+ return -1;
+ }
+ }
+
+ /**
+ * Get the currently-entered time, as integer values of the hours and minutes typed.
+ *
+ * @param enteredZeros A size-2 boolean array, which the caller should initialize, and which
+ * may then be used for the caller to know whether zeros had been explicitly entered as either
+ * hours of minutes. This is helpful for deciding whether to show the dashes, or actual 0's.
+ *
+ * @return A size-3 int array. The first value will be the hours, the second value will be the
+ * minutes, and the third will be either AM or PM.
+ */
+ private int[] getEnteredTime(boolean[] enteredZeros) {
+ int amOrPm = -1;
+ int startIndex = 1;
+ if (!mIs24HourView && isTypedTimeFullyLegal()) {
+ int keyCode = mTypedTimes.get(mTypedTimes.size() - 1);
+ if (keyCode == getAmOrPmKeyCode(AM)) {
+ amOrPm = AM;
+ } else if (keyCode == getAmOrPmKeyCode(PM)){
+ amOrPm = PM;
+ }
+ startIndex = 2;
+ }
+ int minute = -1;
+ int hour = -1;
+ for (int i = startIndex; i <= mTypedTimes.size(); i++) {
+ int val = getValFromKeyCode(mTypedTimes.get(mTypedTimes.size() - i));
+ if (i == startIndex) {
+ minute = val;
+ } else if (i == startIndex+1) {
+ minute += 10 * val;
+ if (enteredZeros != null && val == 0) {
+ enteredZeros[1] = true;
+ }
+ } else if (i == startIndex+2) {
+ hour = val;
+ } else if (i == startIndex+3) {
+ hour += 10 * val;
+ if (enteredZeros != null && val == 0) {
+ enteredZeros[0] = true;
+ }
+ }
+ }
+
+ int[] ret = {hour, minute, amOrPm};
+ return ret;
+ }
+
+ /**
+ * Get the keycode value for AM and PM in the current language.
+ */
+ private int getAmOrPmKeyCode(int amOrPm) {
+ // Cache the codes.
+ if (mAmKeyCode == -1 || mPmKeyCode == -1) {
+ // Find the first character in the AM/PM text that is unique.
+ KeyCharacterMap kcm = KeyCharacterMap.load(KeyCharacterMap.VIRTUAL_KEYBOARD);
+ char amChar;
+ char pmChar;
+ for (int i = 0; i < Math.max(mAmText.length(), mPmText.length()); i++) {
+ amChar = mAmText.toLowerCase(mCurrentLocale).charAt(i);
+ pmChar = mPmText.toLowerCase(mCurrentLocale).charAt(i);
+ if (amChar != pmChar) {
+ KeyEvent[] events = kcm.getEvents(new char[]{amChar, pmChar});
+ // There should be 4 events: a down and up for both AM and PM.
+ if (events != null && events.length == 4) {
+ mAmKeyCode = events[0].getKeyCode();
+ mPmKeyCode = events[2].getKeyCode();
+ } else {
+ Log.e(TAG, "Unable to find keycodes for AM and PM.");
+ }
+ break;
+ }
+ }
+ }
+ if (amOrPm == AM) {
+ return mAmKeyCode;
+ } else if (amOrPm == PM) {
+ return mPmKeyCode;
+ }
+
+ return -1;
+ }
+
+ /**
+ * Create a tree for deciding what keys can legally be typed.
+ */
+ private void generateLegalTimesTree() {
+ // Create a quick cache of numbers to their keycodes.
+ final int k0 = KeyEvent.KEYCODE_0;
+ final int k1 = KeyEvent.KEYCODE_1;
+ final int k2 = KeyEvent.KEYCODE_2;
+ final int k3 = KeyEvent.KEYCODE_3;
+ final int k4 = KeyEvent.KEYCODE_4;
+ final int k5 = KeyEvent.KEYCODE_5;
+ final int k6 = KeyEvent.KEYCODE_6;
+ final int k7 = KeyEvent.KEYCODE_7;
+ final int k8 = KeyEvent.KEYCODE_8;
+ final int k9 = KeyEvent.KEYCODE_9;
+
+ // The root of the tree doesn't contain any numbers.
+ mLegalTimesTree = new Node();
+ if (mIs24HourView) {
+ // We'll be re-using these nodes, so we'll save them.
+ Node minuteFirstDigit = new Node(k0, k1, k2, k3, k4, k5);
+ Node minuteSecondDigit = new Node(k0, k1, k2, k3, k4, k5, k6, k7, k8, k9);
+ // The first digit must be followed by the second digit.
+ minuteFirstDigit.addChild(minuteSecondDigit);
+
+ // The first digit may be 0-1.
+ Node firstDigit = new Node(k0, k1);
+ mLegalTimesTree.addChild(firstDigit);
+
+ // When the first digit is 0-1, the second digit may be 0-5.
+ Node secondDigit = new Node(k0, k1, k2, k3, k4, k5);
+ firstDigit.addChild(secondDigit);
+ // We may now be followed by the first minute digit. E.g. 00:09, 15:58.
+ secondDigit.addChild(minuteFirstDigit);
+
+ // When the first digit is 0-1, and the second digit is 0-5, the third digit may be 6-9.
+ Node thirdDigit = new Node(k6, k7, k8, k9);
+ // The time must now be finished. E.g. 0:55, 1:08.
+ secondDigit.addChild(thirdDigit);
+
+ // When the first digit is 0-1, the second digit may be 6-9.
+ secondDigit = new Node(k6, k7, k8, k9);
+ firstDigit.addChild(secondDigit);
+ // We must now be followed by the first minute digit. E.g. 06:50, 18:20.
+ secondDigit.addChild(minuteFirstDigit);
+
+ // The first digit may be 2.
+ firstDigit = new Node(k2);
+ mLegalTimesTree.addChild(firstDigit);
+
+ // When the first digit is 2, the second digit may be 0-3.
+ secondDigit = new Node(k0, k1, k2, k3);
+ firstDigit.addChild(secondDigit);
+ // We must now be followed by the first minute digit. E.g. 20:50, 23:09.
+ secondDigit.addChild(minuteFirstDigit);
+
+ // When the first digit is 2, the second digit may be 4-5.
+ secondDigit = new Node(k4, k5);
+ firstDigit.addChild(secondDigit);
+ // We must now be followd by the last minute digit. E.g. 2:40, 2:53.
+ secondDigit.addChild(minuteSecondDigit);
+
+ // The first digit may be 3-9.
+ firstDigit = new Node(k3, k4, k5, k6, k7, k8, k9);
+ mLegalTimesTree.addChild(firstDigit);
+ // We must now be followed by the first minute digit. E.g. 3:57, 8:12.
+ firstDigit.addChild(minuteFirstDigit);
+ } else {
+ // We'll need to use the AM/PM node a lot.
+ // Set up AM and PM to respond to "a" and "p".
+ Node ampm = new Node(getAmOrPmKeyCode(AM), getAmOrPmKeyCode(PM));
+
+ // The first hour digit may be 1.
+ Node firstDigit = new Node(k1);
+ mLegalTimesTree.addChild(firstDigit);
+ // We'll allow quick input of on-the-hour times. E.g. 1pm.
+ firstDigit.addChild(ampm);
+
+ // When the first digit is 1, the second digit may be 0-2.
+ Node secondDigit = new Node(k0, k1, k2);
+ firstDigit.addChild(secondDigit);
+ // Also for quick input of on-the-hour times. E.g. 10pm, 12am.
+ secondDigit.addChild(ampm);
+
+ // When the first digit is 1, and the second digit is 0-2, the third digit may be 0-5.
+ Node thirdDigit = new Node(k0, k1, k2, k3, k4, k5);
+ secondDigit.addChild(thirdDigit);
+ // The time may be finished now. E.g. 1:02pm, 1:25am.
+ thirdDigit.addChild(ampm);
+
+ // When the first digit is 1, the second digit is 0-2, and the third digit is 0-5,
+ // the fourth digit may be 0-9.
+ Node fourthDigit = new Node(k0, k1, k2, k3, k4, k5, k6, k7, k8, k9);
+ thirdDigit.addChild(fourthDigit);
+ // The time must be finished now. E.g. 10:49am, 12:40pm.
+ fourthDigit.addChild(ampm);
+
+ // When the first digit is 1, and the second digit is 0-2, the third digit may be 6-9.
+ thirdDigit = new Node(k6, k7, k8, k9);
+ secondDigit.addChild(thirdDigit);
+ // The time must be finished now. E.g. 1:08am, 1:26pm.
+ thirdDigit.addChild(ampm);
+
+ // When the first digit is 1, the second digit may be 3-5.
+ secondDigit = new Node(k3, k4, k5);
+ firstDigit.addChild(secondDigit);
+
+ // When the first digit is 1, and the second digit is 3-5, the third digit may be 0-9.
+ thirdDigit = new Node(k0, k1, k2, k3, k4, k5, k6, k7, k8, k9);
+ secondDigit.addChild(thirdDigit);
+ // The time must be finished now. E.g. 1:39am, 1:50pm.
+ thirdDigit.addChild(ampm);
+
+ // The hour digit may be 2-9.
+ firstDigit = new Node(k2, k3, k4, k5, k6, k7, k8, k9);
+ mLegalTimesTree.addChild(firstDigit);
+ // We'll allow quick input of on-the-hour-times. E.g. 2am, 5pm.
+ firstDigit.addChild(ampm);
+
+ // When the first digit is 2-9, the second digit may be 0-5.
+ secondDigit = new Node(k0, k1, k2, k3, k4, k5);
+ firstDigit.addChild(secondDigit);
+
+ // When the first digit is 2-9, and the second digit is 0-5, the third digit may be 0-9.
+ thirdDigit = new Node(k0, k1, k2, k3, k4, k5, k6, k7, k8, k9);
+ secondDigit.addChild(thirdDigit);
+ // The time must be finished now. E.g. 2:57am, 9:30pm.
+ thirdDigit.addChild(ampm);
+ }
+ }
+
+ /**
+ * Simple node class to be used for traversal to check for legal times.
+ * mLegalKeys represents the keys that can be typed to get to the node.
+ * mChildren are the children that can be reached from this node.
+ */
+ private class Node {
+ private int[] mLegalKeys;
+ private ArrayList<Node> mChildren;
+
+ public Node(int... legalKeys) {
+ mLegalKeys = legalKeys;
+ mChildren = new ArrayList<Node>();
+ }
+
+ public void addChild(Node child) {
+ mChildren.add(child);
+ }
+
+ public boolean containsKey(int key) {
+ for (int i = 0; i < mLegalKeys.length; i++) {
+ if (mLegalKeys[i] == key) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public Node canReach(int key) {
+ if (mChildren == null) {
+ return null;
+ }
+ for (Node child : mChildren) {
+ if (child.containsKey(key)) {
+ return child;
+ }
+ }
+ return null;
+ }
+ }
+
+ private class KeyboardListener implements View.OnKeyListener {
+ @Override
+ public boolean onKey(View v, int keyCode, KeyEvent event) {
+ if (event.getAction() == KeyEvent.ACTION_UP) {
+ return processKeyUp(keyCode);
+ }
+ return false;
+ }
+ }
+
+ /**
+ * Render an animator to pulsate a view in place.
+ *
+ * @param labelToAnimate the view to pulsate.
+ * @return The animator object. Use .start() to begin.
+ */
+ private static ObjectAnimator getPulseAnimator(View labelToAnimate, float decreaseRatio,
+ float increaseRatio) {
+ final Keyframe k0 = Keyframe.ofFloat(0f, 1f);
+ final Keyframe k1 = Keyframe.ofFloat(0.275f, decreaseRatio);
+ final Keyframe k2 = Keyframe.ofFloat(0.69f, increaseRatio);
+ final Keyframe k3 = Keyframe.ofFloat(1f, 1f);
+
+ PropertyValuesHolder scaleX = PropertyValuesHolder.ofKeyframe("scaleX", k0, k1, k2, k3);
+ PropertyValuesHolder scaleY = PropertyValuesHolder.ofKeyframe("scaleY", k0, k1, k2, k3);
+ ObjectAnimator pulseAnimator =
+ ObjectAnimator.ofPropertyValuesHolder(labelToAnimate, scaleX, scaleY);
+ pulseAnimator.setDuration(PULSE_ANIMATOR_DURATION);
+
+ return pulseAnimator;
+ }
+}
diff --git a/core/java/android/widget/Toast.java b/core/java/android/widget/Toast.java
index e38dfa7..371b2f1 100644
--- a/core/java/android/widget/Toast.java
+++ b/core/java/android/widget/Toast.java
@@ -16,6 +16,7 @@
package android.widget;
+import android.annotation.IntDef;
import android.app.INotificationManager;
import android.app.ITransientNotification;
import android.content.Context;
@@ -34,6 +35,9 @@ import android.view.WindowManager;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityManager;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
/**
* A toast is a view containing a quick little message for the user. The toast class
* helps you create and show those.
@@ -61,6 +65,11 @@ public class Toast {
static final String TAG = "Toast";
static final boolean localLOGV = false;
+ /** @hide */
+ @IntDef({LENGTH_SHORT, LENGTH_LONG})
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface Duration {}
+
/**
* Show the view or text notification for a short period of time. This time
* could be user-definable. This is the default.
@@ -152,7 +161,7 @@ public class Toast {
* @see #LENGTH_SHORT
* @see #LENGTH_LONG
*/
- public void setDuration(int duration) {
+ public void setDuration(@Duration int duration) {
mDuration = duration;
}
@@ -160,6 +169,7 @@ public class Toast {
* Return the duration.
* @see #setDuration
*/
+ @Duration
public int getDuration() {
return mDuration;
}
@@ -237,7 +247,7 @@ public class Toast {
* {@link #LENGTH_LONG}
*
*/
- public static Toast makeText(Context context, CharSequence text, int duration) {
+ public static Toast makeText(Context context, CharSequence text, @Duration int duration) {
Toast result = new Toast(context);
LayoutInflater inflate = (LayoutInflater)
@@ -263,7 +273,7 @@ public class Toast {
*
* @throws Resources.NotFoundException if the resource can't be found.
*/
- public static Toast makeText(Context context, int resId, int duration)
+ public static Toast makeText(Context context, int resId, @Duration int duration)
throws Resources.NotFoundException {
return makeText(context, context.getResources().getText(resId), duration);
}
diff --git a/core/java/android/widget/ToggleButton.java b/core/java/android/widget/ToggleButton.java
index cedc777..28519d1 100644
--- a/core/java/android/widget/ToggleButton.java
+++ b/core/java/android/widget/ToggleButton.java
@@ -16,7 +16,6 @@
package android.widget;
-
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.drawable.Drawable;
@@ -25,8 +24,6 @@ import android.util.AttributeSet;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityNodeInfo;
-import com.android.internal.R;
-
/**
* Displays checked/unchecked states as a button
* with a "light" indicator and by default accompanied with the text "ON" or "OFF".
@@ -46,13 +43,12 @@ public class ToggleButton extends CompoundButton {
private static final int NO_ALPHA = 0xFF;
private float mDisabledAlpha;
-
- public ToggleButton(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
-
- TypedArray a =
- context.obtainStyledAttributes(
- attrs, com.android.internal.R.styleable.ToggleButton, defStyle, 0);
+
+ public ToggleButton(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+
+ final TypedArray a = context.obtainStyledAttributes(
+ attrs, com.android.internal.R.styleable.ToggleButton, defStyleAttr, defStyleRes);
mTextOn = a.getText(com.android.internal.R.styleable.ToggleButton_textOn);
mTextOff = a.getText(com.android.internal.R.styleable.ToggleButton_textOff);
mDisabledAlpha = a.getFloat(com.android.internal.R.styleable.ToggleButton_disabledAlpha, 0.5f);
@@ -60,6 +56,10 @@ public class ToggleButton extends CompoundButton {
a.recycle();
}
+ public ToggleButton(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
public ToggleButton(Context context, AttributeSet attrs) {
this(context, attrs, com.android.internal.R.attr.buttonStyleToggle);
}
diff --git a/core/java/android/widget/TwoLineListItem.java b/core/java/android/widget/TwoLineListItem.java
index f7e5266..5606c60 100644
--- a/core/java/android/widget/TwoLineListItem.java
+++ b/core/java/android/widget/TwoLineListItem.java
@@ -56,11 +56,15 @@ public class TwoLineListItem extends RelativeLayout {
this(context, attrs, 0);
}
- public TwoLineListItem(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
+ public TwoLineListItem(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
+ public TwoLineListItem(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
- TypedArray a = context.obtainStyledAttributes(attrs,
- com.android.internal.R.styleable.TwoLineListItem, defStyle, 0);
+ final TypedArray a = context.obtainStyledAttributes(
+ attrs, com.android.internal.R.styleable.TwoLineListItem, defStyleAttr, defStyleRes);
a.recycle();
}
diff --git a/core/java/android/widget/VideoView.java b/core/java/android/widget/VideoView.java
index fbdf318..bb4116a 100644
--- a/core/java/android/widget/VideoView.java
+++ b/core/java/android/widget/VideoView.java
@@ -19,7 +19,6 @@ package android.widget;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
-import android.content.Intent;
import android.content.res.Resources;
import android.graphics.Canvas;
import android.media.AudioManager;
@@ -117,8 +116,12 @@ public class VideoView extends SurfaceView
initVideoView();
}
- public VideoView(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
+ public VideoView(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
+ public VideoView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
initVideoView();
}
@@ -287,11 +290,8 @@ public class VideoView extends SurfaceView
// not ready for playback just yet, will try again later
return;
}
- // Tell the music playback service to pause
- // TODO: these constants need to be published somewhere in the framework.
- Intent i = new Intent("com.android.music.musicservicecommand");
- i.putExtra("command", "pause");
- mContext.sendBroadcast(i);
+ AudioManager am = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
+ am.requestAudioFocus(null, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);
// we shouldn't clear the target state, because somebody might have
// called start() previously
diff --git a/core/java/android/widget/ZoomButton.java b/core/java/android/widget/ZoomButton.java
index af17c94..715e868 100644
--- a/core/java/android/widget/ZoomButton.java
+++ b/core/java/android/widget/ZoomButton.java
@@ -49,8 +49,12 @@ public class ZoomButton extends ImageButton implements OnLongClickListener {
this(context, attrs, 0);
}
- public ZoomButton(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
+ public ZoomButton(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
+ public ZoomButton(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
mHandler = new Handler();
setOnLongClickListener(this);
}
diff --git a/core/java/com/android/internal/app/AlertController.java b/core/java/com/android/internal/app/AlertController.java
index fe532b0..10b98d8 100644
--- a/core/java/com/android/internal/app/AlertController.java
+++ b/core/java/com/android/internal/app/AlertController.java
@@ -736,8 +736,13 @@ public class AlertController {
super(context, attrs);
}
- public RecycleListView(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
+ public RecycleListView(Context context, AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ }
+
+ public RecycleListView(
+ Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
}
@Override
diff --git a/core/java/com/android/internal/app/IBatteryStats.aidl b/core/java/com/android/internal/app/IBatteryStats.aidl
index 525517c..2363062 100644
--- a/core/java/com/android/internal/app/IBatteryStats.aidl
+++ b/core/java/com/android/internal/app/IBatteryStats.aidl
@@ -22,17 +22,15 @@ import android.os.WorkSource;
import android.telephony.SignalStrength;
interface IBatteryStats {
+ // These first methods are also called by native code, so must
+ // be kept in sync with frameworks/native/include/binder/IBatteryStats.h
+ void noteStartSensor(int uid, int sensor);
+ void noteStopSensor(int uid, int sensor);
+
+ // Remaining methods are only used in Java.
byte[] getStatistics();
void noteStartWakelock(int uid, int pid, String name, int type);
void noteStopWakelock(int uid, int pid, String name, int type);
-
- /* DO NOT CHANGE the position of noteStartSensor without updating
- SensorService.cpp */
- void noteStartSensor(int uid, int sensor);
-
- /* DO NOT CHANGE the position of noteStopSensor without updating
- SensorService.cpp */
- void noteStopSensor(int uid, int sensor);
void noteStartWakelockFromSource(in WorkSource ws, int pid, String name, int type);
void noteStopWakelockFromSource(in WorkSource ws, int pid, String name, int type);
diff --git a/core/java/com/android/internal/inputmethod/InputMethodSubtypeSwitchingController.java b/core/java/com/android/internal/inputmethod/InputMethodSubtypeSwitchingController.java
new file mode 100644
index 0000000..dcc0a4c
--- /dev/null
+++ b/core/java/com/android/internal/inputmethod/InputMethodSubtypeSwitchingController.java
@@ -0,0 +1,299 @@
+/*
+ * Copyright (C) 2013 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.internal.inputmethod;
+
+import com.android.internal.inputmethod.InputMethodUtils.InputMethodSettings;
+
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.text.TextUtils;
+import android.util.Slog;
+import android.view.inputmethod.InputMethodInfo;
+import android.view.inputmethod.InputMethodSubtype;
+
+import java.util.ArrayDeque;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Locale;
+import java.util.TreeMap;
+
+/**
+ * InputMethodSubtypeSwitchingController controls the switching behavior of the subtypes.
+ */
+public class InputMethodSubtypeSwitchingController {
+ private static final String TAG = InputMethodSubtypeSwitchingController.class.getSimpleName();
+ private static final boolean DEBUG = false;
+ // TODO: Turn on this flag and add CTS when the platform starts expecting that all IMEs return
+ // true for supportsSwitchingToNextInputMethod().
+ private static final boolean REQUIRE_SWITCHING_SUPPORT = false;
+ private static final int MAX_HISTORY_SIZE = 4;
+ private static final int NOT_A_SUBTYPE_ID = InputMethodUtils.NOT_A_SUBTYPE_ID;
+
+ private static class SubtypeParams {
+ public final InputMethodInfo mImi;
+ public final InputMethodSubtype mSubtype;
+ public final long mTime;
+
+ public SubtypeParams(InputMethodInfo imi, InputMethodSubtype subtype) {
+ mImi = imi;
+ mSubtype = subtype;
+ mTime = System.currentTimeMillis();
+ }
+ }
+
+ public static class ImeSubtypeListItem implements Comparable<ImeSubtypeListItem> {
+ public final CharSequence mImeName;
+ public final CharSequence mSubtypeName;
+ public final InputMethodInfo mImi;
+ public final int mSubtypeId;
+ private final boolean mIsSystemLocale;
+ private final boolean mIsSystemLanguage;
+
+ public ImeSubtypeListItem(CharSequence imeName, CharSequence subtypeName,
+ InputMethodInfo imi, int subtypeId, String subtypeLocale, String systemLocale) {
+ mImeName = imeName;
+ mSubtypeName = subtypeName;
+ mImi = imi;
+ mSubtypeId = subtypeId;
+ if (TextUtils.isEmpty(subtypeLocale)) {
+ mIsSystemLocale = false;
+ mIsSystemLanguage = false;
+ } else {
+ mIsSystemLocale = subtypeLocale.equals(systemLocale);
+ mIsSystemLanguage = mIsSystemLocale
+ || subtypeLocale.startsWith(systemLocale.substring(0, 2));
+ }
+ }
+
+ @Override
+ public int compareTo(ImeSubtypeListItem other) {
+ if (TextUtils.isEmpty(mImeName)) {
+ return 1;
+ }
+ if (TextUtils.isEmpty(other.mImeName)) {
+ return -1;
+ }
+ if (!TextUtils.equals(mImeName, other.mImeName)) {
+ return mImeName.toString().compareTo(other.mImeName.toString());
+ }
+ if (TextUtils.equals(mSubtypeName, other.mSubtypeName)) {
+ return 0;
+ }
+ if (mIsSystemLocale) {
+ return -1;
+ }
+ if (other.mIsSystemLocale) {
+ return 1;
+ }
+ if (mIsSystemLanguage) {
+ return -1;
+ }
+ if (other.mIsSystemLanguage) {
+ return 1;
+ }
+ if (TextUtils.isEmpty(mSubtypeName)) {
+ return 1;
+ }
+ if (TextUtils.isEmpty(other.mSubtypeName)) {
+ return -1;
+ }
+ return mSubtypeName.toString().compareTo(other.mSubtypeName.toString());
+ }
+ }
+
+ private static class InputMethodAndSubtypeCircularList {
+ private final Context mContext;
+ // Used to load label
+ private final PackageManager mPm;
+ private final String mSystemLocaleStr;
+ private final InputMethodSettings mSettings;
+
+ public InputMethodAndSubtypeCircularList(Context context, InputMethodSettings settings) {
+ mContext = context;
+ mSettings = settings;
+ mPm = context.getPackageManager();
+ final Locale locale = context.getResources().getConfiguration().locale;
+ mSystemLocaleStr = locale != null ? locale.toString() : "";
+ }
+
+ private final TreeMap<InputMethodInfo, List<InputMethodSubtype>> mSortedImmis =
+ new TreeMap<InputMethodInfo, List<InputMethodSubtype>>(
+ new Comparator<InputMethodInfo>() {
+ @Override
+ public int compare(InputMethodInfo imi1, InputMethodInfo imi2) {
+ if (imi2 == null)
+ return 0;
+ if (imi1 == null)
+ return 1;
+ if (mPm == null) {
+ return imi1.getId().compareTo(imi2.getId());
+ }
+ CharSequence imiId1 = imi1.loadLabel(mPm) + "/" + imi1.getId();
+ CharSequence imiId2 = imi2.loadLabel(mPm) + "/" + imi2.getId();
+ return imiId1.toString().compareTo(imiId2.toString());
+ }
+ });
+
+ public ImeSubtypeListItem getNextInputMethod(
+ boolean onlyCurrentIme, InputMethodInfo imi, InputMethodSubtype subtype) {
+ if (imi == null) {
+ return null;
+ }
+ final List<ImeSubtypeListItem> imList =
+ getSortedInputMethodAndSubtypeList();
+ if (imList.size() <= 1) {
+ return null;
+ }
+ final int N = imList.size();
+ final int currentSubtypeId =
+ subtype != null ? InputMethodUtils.getSubtypeIdFromHashCode(imi,
+ subtype.hashCode()) : NOT_A_SUBTYPE_ID;
+ for (int i = 0; i < N; ++i) {
+ final ImeSubtypeListItem isli = imList.get(i);
+ if (isli.mImi.equals(imi) && isli.mSubtypeId == currentSubtypeId) {
+ if (!onlyCurrentIme) {
+ return imList.get((i + 1) % N);
+ }
+ for (int j = 0; j < N - 1; ++j) {
+ final ImeSubtypeListItem candidate = imList.get((i + j + 1) % N);
+ if (candidate.mImi.equals(imi)) {
+ return candidate;
+ }
+ }
+ return null;
+ }
+ }
+ return null;
+ }
+
+ public List<ImeSubtypeListItem> getSortedInputMethodAndSubtypeList() {
+ return getSortedInputMethodAndSubtypeList(true, false, false);
+ }
+
+ public List<ImeSubtypeListItem> getSortedInputMethodAndSubtypeList(
+ boolean showSubtypes, boolean inputShown, boolean isScreenLocked) {
+ final ArrayList<ImeSubtypeListItem> imList =
+ new ArrayList<ImeSubtypeListItem>();
+ final HashMap<InputMethodInfo, List<InputMethodSubtype>> immis =
+ mSettings.getExplicitlyOrImplicitlyEnabledInputMethodsAndSubtypeListLocked(
+ mContext);
+ if (immis == null || immis.size() == 0) {
+ return Collections.emptyList();
+ }
+ mSortedImmis.clear();
+ mSortedImmis.putAll(immis);
+ for (InputMethodInfo imi : mSortedImmis.keySet()) {
+ if (imi == null) {
+ continue;
+ }
+ List<InputMethodSubtype> explicitlyOrImplicitlyEnabledSubtypeList = immis.get(imi);
+ HashSet<String> enabledSubtypeSet = new HashSet<String>();
+ for (InputMethodSubtype subtype : explicitlyOrImplicitlyEnabledSubtypeList) {
+ enabledSubtypeSet.add(String.valueOf(subtype.hashCode()));
+ }
+ final CharSequence imeLabel = imi.loadLabel(mPm);
+ if (showSubtypes && enabledSubtypeSet.size() > 0) {
+ final int subtypeCount = imi.getSubtypeCount();
+ if (DEBUG) {
+ Slog.v(TAG, "Add subtypes: " + subtypeCount + ", " + imi.getId());
+ }
+ for (int j = 0; j < subtypeCount; ++j) {
+ final InputMethodSubtype subtype = imi.getSubtypeAt(j);
+ final String subtypeHashCode = String.valueOf(subtype.hashCode());
+ // We show all enabled IMEs and subtypes when an IME is shown.
+ if (enabledSubtypeSet.contains(subtypeHashCode)
+ && ((inputShown && !isScreenLocked) || !subtype.isAuxiliary())) {
+ final CharSequence subtypeLabel =
+ subtype.overridesImplicitlyEnabledSubtype() ? null : subtype
+ .getDisplayName(mContext, imi.getPackageName(),
+ imi.getServiceInfo().applicationInfo);
+ imList.add(new ImeSubtypeListItem(imeLabel,
+ subtypeLabel, imi, j, subtype.getLocale(), mSystemLocaleStr));
+
+ // Removing this subtype from enabledSubtypeSet because we no
+ // longer need to add an entry of this subtype to imList to avoid
+ // duplicated entries.
+ enabledSubtypeSet.remove(subtypeHashCode);
+ }
+ }
+ } else {
+ imList.add(new ImeSubtypeListItem(imeLabel, null, imi, NOT_A_SUBTYPE_ID, null,
+ mSystemLocaleStr));
+ }
+ }
+ Collections.sort(imList);
+ return imList;
+ }
+ }
+
+ private final ArrayDeque<SubtypeParams> mTypedSubtypeHistory = new ArrayDeque<SubtypeParams>();
+ private final Object mLock = new Object();
+ private final InputMethodSettings mSettings;
+ private InputMethodAndSubtypeCircularList mSubtypeList;
+
+ public InputMethodSubtypeSwitchingController(InputMethodSettings settings) {
+ mSettings = settings;
+ }
+
+ // TODO: write unit tests for this method and the logic that determines the next subtype
+ public void onCommitText(InputMethodInfo imi, InputMethodSubtype subtype) {
+ synchronized (mTypedSubtypeHistory) {
+ if (subtype == null) {
+ Slog.w(TAG, "Invalid InputMethodSubtype: " + imi.getId() + ", " + subtype);
+ return;
+ }
+ if (DEBUG) {
+ Slog.d(TAG, "onCommitText: " + imi.getId() + ", " + subtype);
+ }
+ if (REQUIRE_SWITCHING_SUPPORT) {
+ if (!imi.supportsSwitchingToNextInputMethod()) {
+ Slog.w(TAG, imi.getId() + " doesn't support switching to next input method.");
+ return;
+ }
+ }
+ if (mTypedSubtypeHistory.size() >= MAX_HISTORY_SIZE) {
+ mTypedSubtypeHistory.poll();
+ }
+ mTypedSubtypeHistory.addFirst(new SubtypeParams(imi, subtype));
+ }
+ }
+
+ public void resetCircularListLocked(Context context) {
+ synchronized(mLock) {
+ mSubtypeList = new InputMethodAndSubtypeCircularList(context, mSettings);
+ }
+ }
+
+ public ImeSubtypeListItem getNextInputMethod(
+ boolean onlyCurrentIme, InputMethodInfo imi, InputMethodSubtype subtype) {
+ synchronized(mLock) {
+ return mSubtypeList.getNextInputMethod(onlyCurrentIme, imi, subtype);
+ }
+ }
+
+ public List<ImeSubtypeListItem> getSortedInputMethodAndSubtypeList(boolean showSubtypes,
+ boolean inputShown, boolean isScreenLocked) {
+ synchronized(mLock) {
+ return mSubtypeList.getSortedInputMethodAndSubtypeList(
+ showSubtypes, inputShown, isScreenLocked);
+ }
+ }
+}
diff --git a/core/java/com/android/internal/inputmethod/InputMethodUtils.java b/core/java/com/android/internal/inputmethod/InputMethodUtils.java
index 63d018f..bc051ce 100644
--- a/core/java/com/android/internal/inputmethod/InputMethodUtils.java
+++ b/core/java/com/android/internal/inputmethod/InputMethodUtils.java
@@ -959,5 +959,16 @@ public class InputMethodUtils {
addSubtypeToHistory(curMethodId, subtypeId);
}
}
+
+ public HashMap<InputMethodInfo, List<InputMethodSubtype>>
+ getExplicitlyOrImplicitlyEnabledInputMethodsAndSubtypeListLocked(Context context) {
+ HashMap<InputMethodInfo, List<InputMethodSubtype>> enabledInputMethodAndSubtypes =
+ new HashMap<InputMethodInfo, List<InputMethodSubtype>>();
+ for (InputMethodInfo imi: getEnabledInputMethodListLocked()) {
+ enabledInputMethodAndSubtypes.put(
+ imi, getEnabledInputMethodSubtypeListLocked(context, imi, true));
+ }
+ return enabledInputMethodAndSubtypes;
+ }
}
}
diff --git a/core/java/com/android/internal/os/ZygoteInit.java b/core/java/com/android/internal/os/ZygoteInit.java
index c44afae..a7faadf 100644
--- a/core/java/com/android/internal/os/ZygoteInit.java
+++ b/core/java/com/android/internal/os/ZygoteInit.java
@@ -489,6 +489,7 @@ public class ZygoteInit {
private static boolean startSystemServer()
throws MethodAndArgsCaller, RuntimeException {
long capabilities = posixCapabilitiesAsBits(
+ OsConstants.CAP_BLOCK_SUSPEND,
OsConstants.CAP_KILL,
OsConstants.CAP_NET_ADMIN,
OsConstants.CAP_NET_BIND_SERVICE,
diff --git a/core/java/com/android/internal/preference/YesNoPreference.java b/core/java/com/android/internal/preference/YesNoPreference.java
index cf68a58..7abf416 100644
--- a/core/java/com/android/internal/preference/YesNoPreference.java
+++ b/core/java/com/android/internal/preference/YesNoPreference.java
@@ -31,15 +31,19 @@ import android.util.AttributeSet;
*/
public class YesNoPreference extends DialogPreference {
private boolean mWasPositiveResult;
-
- public YesNoPreference(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
+
+ public YesNoPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+ }
+
+ public YesNoPreference(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
}
public YesNoPreference(Context context, AttributeSet attrs) {
this(context, attrs, com.android.internal.R.attr.yesNoPreferenceStyle);
}
-
+
public YesNoPreference(Context context) {
this(context, null);
}
diff --git a/core/java/com/android/internal/view/CheckableLinearLayout.java b/core/java/com/android/internal/view/CheckableLinearLayout.java
index 3fb7cec..1a57e4e 100644
--- a/core/java/com/android/internal/view/CheckableLinearLayout.java
+++ b/core/java/com/android/internal/view/CheckableLinearLayout.java
@@ -37,8 +37,14 @@ public class CheckableLinearLayout extends LinearLayout implements Checkable {
// TODO Auto-generated constructor stub
}
- public CheckableLinearLayout(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
+ public CheckableLinearLayout(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ // TODO Auto-generated constructor stub
+ }
+
+ public CheckableLinearLayout(
+ Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
// TODO Auto-generated constructor stub
}
diff --git a/core/java/com/android/internal/view/IInputMethodManager.aidl b/core/java/com/android/internal/view/IInputMethodManager.aidl
index 12ced68..325a27d 100644
--- a/core/java/com/android/internal/view/IInputMethodManager.aidl
+++ b/core/java/com/android/internal/view/IInputMethodManager.aidl
@@ -74,4 +74,6 @@ interface IInputMethodManager {
boolean shouldOfferSwitchingToNextInputMethod(in IBinder token);
boolean setInputMethodEnabled(String id, boolean enabled);
oneway void setAdditionalInputMethodSubtypes(String id, in InputMethodSubtype[] subtypes);
+ int getInputMethodWindowVisibleHeight();
+ oneway void notifyTextCommitted();
}
diff --git a/core/java/com/android/internal/view/menu/ActionMenuItemView.java b/core/java/com/android/internal/view/menu/ActionMenuItemView.java
index 238a9c0..c14d587 100644
--- a/core/java/com/android/internal/view/menu/ActionMenuItemView.java
+++ b/core/java/com/android/internal/view/menu/ActionMenuItemView.java
@@ -60,13 +60,17 @@ public class ActionMenuItemView extends TextView
this(context, attrs, 0);
}
- public ActionMenuItemView(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
+ public ActionMenuItemView(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
+ public ActionMenuItemView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
final Resources res = context.getResources();
mAllowTextWithIcon = res.getBoolean(
com.android.internal.R.bool.config_allowActionMenuItemTextWithIcon);
- TypedArray a = context.obtainStyledAttributes(attrs,
- com.android.internal.R.styleable.ActionMenuItemView, 0, 0);
+ final TypedArray a = context.obtainStyledAttributes(attrs,
+ com.android.internal.R.styleable.ActionMenuItemView, defStyleAttr, defStyleRes);
mMinWidth = a.getDimensionPixelSize(
com.android.internal.R.styleable.ActionMenuItemView_minWidth, 0);
a.recycle();
diff --git a/core/java/com/android/internal/view/menu/IconMenuItemView.java b/core/java/com/android/internal/view/menu/IconMenuItemView.java
index 5d0b25f..de5e279 100644
--- a/core/java/com/android/internal/view/menu/IconMenuItemView.java
+++ b/core/java/com/android/internal/view/menu/IconMenuItemView.java
@@ -57,8 +57,8 @@ public final class IconMenuItemView extends TextView implements MenuView.ItemVie
private static String sPrependShortcutLabel;
- public IconMenuItemView(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs);
+ public IconMenuItemView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
if (sPrependShortcutLabel == null) {
/*
@@ -68,10 +68,9 @@ public final class IconMenuItemView extends TextView implements MenuView.ItemVie
sPrependShortcutLabel = getResources().getString(
com.android.internal.R.string.prepend_shortcut_label);
}
-
- TypedArray a =
- context.obtainStyledAttributes(
- attrs, com.android.internal.R.styleable.MenuView, defStyle, 0);
+
+ final TypedArray a = context.obtainStyledAttributes(
+ attrs, com.android.internal.R.styleable.MenuView, defStyleAttr, defStyleRes);
mDisabledAlpha = a.getFloat(
com.android.internal.R.styleable.MenuView_itemIconDisabledAlpha, 0.8f);
@@ -81,7 +80,11 @@ public final class IconMenuItemView extends TextView implements MenuView.ItemVie
a.recycle();
}
-
+
+ public IconMenuItemView(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
public IconMenuItemView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
diff --git a/core/java/com/android/internal/view/menu/ListMenuItemView.java b/core/java/com/android/internal/view/menu/ListMenuItemView.java
index a2a4acc..692bdac 100644
--- a/core/java/com/android/internal/view/menu/ListMenuItemView.java
+++ b/core/java/com/android/internal/view/menu/ListMenuItemView.java
@@ -55,13 +55,13 @@ public class ListMenuItemView extends LinearLayout implements MenuView.ItemView
private boolean mForceShowIcon;
- public ListMenuItemView(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs);
-
- TypedArray a =
- context.obtainStyledAttributes(
- attrs, com.android.internal.R.styleable.MenuView, defStyle, 0);
-
+ public ListMenuItemView(
+ Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+
+ final TypedArray a = context.obtainStyledAttributes(
+ attrs, com.android.internal.R.styleable.MenuView, defStyleAttr, defStyleRes);
+
mBackground = a.getDrawable(com.android.internal.R.styleable.MenuView_itemBackground);
mTextAppearance = a.getResourceId(com.android.internal.R.styleable.
MenuView_itemTextAppearance, -1);
@@ -72,6 +72,10 @@ public class ListMenuItemView extends LinearLayout implements MenuView.ItemView
a.recycle();
}
+ public ListMenuItemView(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
public ListMenuItemView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
diff --git a/core/java/com/android/internal/widget/AbsActionBarView.java b/core/java/com/android/internal/widget/AbsActionBarView.java
index f3891c7..6ea7372 100644
--- a/core/java/com/android/internal/widget/AbsActionBarView.java
+++ b/core/java/com/android/internal/widget/AbsActionBarView.java
@@ -47,15 +47,20 @@ public abstract class AbsActionBarView extends ViewGroup {
private static final int FADE_DURATION = 200;
public AbsActionBarView(Context context) {
- super(context);
+ this(context, null);
}
public AbsActionBarView(Context context, AttributeSet attrs) {
- super(context, attrs);
+ this(context, attrs, 0);
}
- public AbsActionBarView(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
+ public AbsActionBarView(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
+ public AbsActionBarView(
+ Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
}
@Override
diff --git a/core/java/com/android/internal/widget/ActionBarContextView.java b/core/java/com/android/internal/widget/ActionBarContextView.java
index 8bc1081..b34b541 100644
--- a/core/java/com/android/internal/widget/ActionBarContextView.java
+++ b/core/java/com/android/internal/widget/ActionBarContextView.java
@@ -74,10 +74,16 @@ public class ActionBarContextView extends AbsActionBarView implements AnimatorLi
this(context, attrs, com.android.internal.R.attr.actionModeStyle);
}
- public ActionBarContextView(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
-
- TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ActionMode, defStyle, 0);
+ public ActionBarContextView(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
+ public ActionBarContextView(
+ Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+
+ final TypedArray a = context.obtainStyledAttributes(
+ attrs, R.styleable.ActionMode, defStyleAttr, defStyleRes);
setBackgroundDrawable(a.getDrawable(
com.android.internal.R.styleable.ActionMode_background));
mTitleStyleRes = a.getResourceId(
diff --git a/core/java/com/android/internal/widget/DialogTitle.java b/core/java/com/android/internal/widget/DialogTitle.java
index b86c438..7ea3d6b 100644
--- a/core/java/com/android/internal/widget/DialogTitle.java
+++ b/core/java/com/android/internal/widget/DialogTitle.java
@@ -28,10 +28,13 @@ import android.widget.TextView;
* the text to the available space.
*/
public class DialogTitle extends TextView {
-
- public DialogTitle(Context context, AttributeSet attrs,
- int defStyle) {
- super(context, attrs, defStyle);
+
+ public DialogTitle(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+ }
+
+ public DialogTitle(Context context, AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
}
public DialogTitle(Context context, AttributeSet attrs) {
diff --git a/core/java/com/android/internal/widget/PasswordEntryKeyboardView.java b/core/java/com/android/internal/widget/PasswordEntryKeyboardView.java
index b37adff..d27346b 100644
--- a/core/java/com/android/internal/widget/PasswordEntryKeyboardView.java
+++ b/core/java/com/android/internal/widget/PasswordEntryKeyboardView.java
@@ -29,11 +29,16 @@ public class PasswordEntryKeyboardView extends KeyboardView {
static final int KEYCODE_NEXT_LANGUAGE = -104;
public PasswordEntryKeyboardView(Context context, AttributeSet attrs) {
- super(context, attrs);
+ this(context, attrs, 0);
}
- public PasswordEntryKeyboardView(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
+ public PasswordEntryKeyboardView(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
+ public PasswordEntryKeyboardView(
+ Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
}
@Override
diff --git a/core/java/com/android/internal/widget/SizeAdaptiveLayout.java b/core/java/com/android/internal/widget/SizeAdaptiveLayout.java
index ba113a3..7260656 100644
--- a/core/java/com/android/internal/widget/SizeAdaptiveLayout.java
+++ b/core/java/com/android/internal/widget/SizeAdaptiveLayout.java
@@ -79,17 +79,20 @@ public class SizeAdaptiveLayout extends ViewGroup {
private int mModestyPanelTop;
public SizeAdaptiveLayout(Context context) {
- super(context);
- initialize();
+ this(context, null);
}
public SizeAdaptiveLayout(Context context, AttributeSet attrs) {
- super(context, attrs);
- initialize();
+ this(context, attrs, 0);
+ }
+
+ public SizeAdaptiveLayout(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
}
- public SizeAdaptiveLayout(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
+ public SizeAdaptiveLayout(
+ Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
initialize();
}
diff --git a/core/java/com/android/internal/widget/SubtitleView.java b/core/java/com/android/internal/widget/SubtitleView.java
index 071193c..063468d 100644
--- a/core/java/com/android/internal/widget/SubtitleView.java
+++ b/core/java/com/android/internal/widget/SubtitleView.java
@@ -79,12 +79,15 @@ public class SubtitleView extends View {
this(context, attrs, 0);
}
- public SubtitleView(Context context, AttributeSet attrs, int defStyle) {
+ public SubtitleView(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
+ public SubtitleView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs);
- final Theme theme = context.getTheme();
- final TypedArray a = theme.obtainStyledAttributes(
- attrs, android.R.styleable.TextView, defStyle, 0);
+ final TypedArray a = context.obtainStyledAttributes(
+ attrs, android.R.styleable.TextView, defStyleAttr, defStyleRes);
CharSequence text = "";
int textSize = 15;
diff --git a/core/java/com/android/internal/widget/TextProgressBar.java b/core/java/com/android/internal/widget/TextProgressBar.java
index e898aa4..48003c0 100644
--- a/core/java/com/android/internal/widget/TextProgressBar.java
+++ b/core/java/com/android/internal/widget/TextProgressBar.java
@@ -59,9 +59,13 @@ public class TextProgressBar extends RelativeLayout implements OnChronometerTick
boolean mChronometerFollow = false;
int mChronometerGravity = Gravity.NO_GRAVITY;
+
+ public TextProgressBar(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+ }
- public TextProgressBar(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
+ public TextProgressBar(Context context, AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
}
public TextProgressBar(Context context, AttributeSet attrs) {
diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp
index 09577da..1cce263 100644
--- a/core/jni/AndroidRuntime.cpp
+++ b/core/jni/AndroidRuntime.cpp
@@ -1022,7 +1022,8 @@ static int javaDetachThread(void)
void** args = (void**) malloc(3 * sizeof(void*)); // javaThreadShell must free
int result;
- assert(threadName != NULL);
+ if (!threadName)
+ threadName = "unnamed thread";
args[0] = (void*) entryFunction;
args[1] = userData;
diff --git a/core/jni/android/graphics/BitmapRegionDecoder.cpp b/core/jni/android/graphics/BitmapRegionDecoder.cpp
index ee47ac4..5b0ed0d 100644
--- a/core/jni/android/graphics/BitmapRegionDecoder.cpp
+++ b/core/jni/android/graphics/BitmapRegionDecoder.cpp
@@ -29,7 +29,6 @@
#include "CreateJavaOutputStreamAdaptor.h"
#include "Utils.h"
#include "JNIHelp.h"
-#include "SkTScopedPtr.h"
#include <android_runtime/AndroidRuntime.h>
#include "android_util_Binder.h"
@@ -215,7 +214,7 @@ static jobject nativeDecodeRegion(JNIEnv* env, jobject, SkBitmapRegionDecoder *b
region.fRight = start_x + width;
region.fBottom = start_y + height;
SkBitmap* bitmap = NULL;
- SkTScopedPtr<SkBitmap> adb;
+ SkAutoTDelete<SkBitmap> adb;
if (tileBitmap != NULL) {
// Re-use bitmap.
@@ -246,7 +245,7 @@ static jobject nativeDecodeRegion(JNIEnv* env, jobject, SkBitmapRegionDecoder *b
}
// detach bitmap from its autodeleter, since we want to own it now
- adb.release();
+ adb.detach();
JavaPixelAllocator* allocator = (JavaPixelAllocator*) decoder->getAllocator();
jbyteArray buff = allocator->getStorageObjAndReset();
diff --git a/core/jni/android/graphics/ColorFilter.cpp b/core/jni/android/graphics/ColorFilter.cpp
index dd1177b..26169e7 100644
--- a/core/jni/android/graphics/ColorFilter.cpp
+++ b/core/jni/android/graphics/ColorFilter.cpp
@@ -33,10 +33,10 @@ using namespace uirenderer;
class SkColorFilterGlue {
public:
static void finalizer(JNIEnv* env, jobject clazz, SkColorFilter* obj, SkiaColorFilter* f) {
- SkSafeUnref(obj);
+ if (obj) SkSafeUnref(obj);
// f == NULL when not !USE_OPENGL_RENDERER, so no need to delete outside the ifdef
#ifdef USE_OPENGL_RENDERER
- if (android::uirenderer::Caches::hasInstance()) {
+ if (f && android::uirenderer::Caches::hasInstance()) {
android::uirenderer::Caches::getInstance().resourceCache.destructor(f);
} else {
delete f;
@@ -112,7 +112,7 @@ public:
};
static JNINativeMethod colorfilter_methods[] = {
- {"finalizer", "(II)V", (void*) SkColorFilterGlue::finalizer}
+ {"destroyFilter", "(II)V", (void*) SkColorFilterGlue::finalizer}
};
static JNINativeMethod porterduff_methods[] = {
diff --git a/core/jni/android_animation_PropertyValuesHolder.cpp b/core/jni/android_animation_PropertyValuesHolder.cpp
index 5991805..73347ea 100644
--- a/core/jni/android_animation_PropertyValuesHolder.cpp
+++ b/core/jni/android_animation_PropertyValuesHolder.cpp
@@ -47,6 +47,32 @@ static jmethodID android_animation_PropertyValuesHolder_getFloatMethod(
return mid;
}
+static jmethodID getMultiparameterMethod(JNIEnv* env, jclass targetClass, jstring methodName,
+ jint parameterCount, char parameterType)
+{
+ const char *nativeString = env->GetStringUTFChars(methodName, 0);
+ char *signature = new char[parameterCount + 4];
+ signature[0] = '(';
+ memset(&(signature[1]), parameterType, parameterCount);
+ strcpy(&(signature[parameterCount + 1]), ")V");
+ jmethodID mid = env->GetMethodID(targetClass, nativeString, signature);
+ delete[] signature;
+ env->ReleaseStringUTFChars(methodName, nativeString);
+ return mid;
+}
+
+static jmethodID android_animation_PropertyValuesHolder_getMultipleFloatMethod(
+ JNIEnv* env, jclass pvhClass, jclass targetClass, jstring methodName, jint parameterCount)
+{
+ return getMultiparameterMethod(env, targetClass, methodName, parameterCount, 'F');
+}
+
+static jmethodID android_animation_PropertyValuesHolder_getMultipleIntMethod(
+ JNIEnv* env, jclass pvhClass, jclass targetClass, jstring methodName, jint parameterCount)
+{
+ return getMultiparameterMethod(env, targetClass, methodName, parameterCount, 'I');
+}
+
static void android_animation_PropertyValuesHolder_callIntMethod(
JNIEnv* env, jclass pvhObject, jobject target, jmethodID methodID, int arg)
{
@@ -59,15 +85,85 @@ static void android_animation_PropertyValuesHolder_callFloatMethod(
env->CallVoidMethod(target, methodID, arg);
}
+static void android_animation_PropertyValuesHolder_callTwoFloatMethod(
+ JNIEnv* env, jclass pvhObject, jobject target, jmethodID methodID, float arg1, float arg2)
+{
+ env->CallVoidMethod(target, methodID, arg1, arg2);
+}
+
+static void android_animation_PropertyValuesHolder_callFourFloatMethod(
+ JNIEnv* env, jclass pvhObject, jobject target, jmethodID methodID, float arg1, float arg2,
+ float arg3, float arg4)
+{
+ env->CallVoidMethod(target, methodID, arg1, arg2, arg3, arg4);
+}
+
+static void android_animation_PropertyValuesHolder_callMultipleFloatMethod(
+ JNIEnv* env, jclass pvhObject, jobject target, jmethodID methodID, jfloatArray arg)
+{
+ jsize parameterCount = env->GetArrayLength(arg);
+ jfloat *floatValues = env->GetFloatArrayElements(arg, NULL);
+ jvalue* values = new jvalue[parameterCount];
+ for (int i = 0; i < parameterCount; i++) {
+ values[i].f = floatValues[i];
+ }
+ env->CallVoidMethodA(target, methodID, values);
+ delete[] values;
+ env->ReleaseFloatArrayElements(arg, floatValues, JNI_ABORT);
+}
+
+static void android_animation_PropertyValuesHolder_callTwoIntMethod(
+ JNIEnv* env, jclass pvhObject, jobject target, jmethodID methodID, int arg1, int arg2)
+{
+ env->CallVoidMethod(target, methodID, arg1, arg2);
+}
+
+static void android_animation_PropertyValuesHolder_callFourIntMethod(
+ JNIEnv* env, jclass pvhObject, jobject target, jmethodID methodID, int arg1, int arg2,
+ int arg3, int arg4)
+{
+ env->CallVoidMethod(target, methodID, arg1, arg2, arg3, arg4);
+}
+
+static void android_animation_PropertyValuesHolder_callMultipleIntMethod(
+ JNIEnv* env, jclass pvhObject, jobject target, jmethodID methodID, jintArray arg)
+{
+ jsize parameterCount = env->GetArrayLength(arg);
+ jint *intValues = env->GetIntArrayElements(arg, NULL);
+ jvalue* values = new jvalue[parameterCount];
+ for (int i = 0; i < parameterCount; i++) {
+ values[i].i = intValues[i];
+ }
+ env->CallVoidMethodA(target, methodID, values);
+ delete[] values;
+ env->ReleaseIntArrayElements(arg, intValues, JNI_ABORT);
+}
+
static JNINativeMethod gMethods[] = {
{ "nGetIntMethod", "(Ljava/lang/Class;Ljava/lang/String;)I",
(void*)android_animation_PropertyValuesHolder_getIntMethod },
{ "nGetFloatMethod", "(Ljava/lang/Class;Ljava/lang/String;)I",
(void*)android_animation_PropertyValuesHolder_getFloatMethod },
+ { "nGetMultipleFloatMethod", "(Ljava/lang/Class;Ljava/lang/String;I)I",
+ (void*)android_animation_PropertyValuesHolder_getMultipleFloatMethod },
+ { "nGetMultipleIntMethod", "(Ljava/lang/Class;Ljava/lang/String;I)I",
+ (void*)android_animation_PropertyValuesHolder_getMultipleIntMethod },
{ "nCallIntMethod", "(Ljava/lang/Object;II)V",
(void*)android_animation_PropertyValuesHolder_callIntMethod },
{ "nCallFloatMethod", "(Ljava/lang/Object;IF)V",
- (void*)android_animation_PropertyValuesHolder_callFloatMethod }
+ (void*)android_animation_PropertyValuesHolder_callFloatMethod },
+ { "nCallTwoFloatMethod", "(Ljava/lang/Object;IFF)V",
+ (void*)android_animation_PropertyValuesHolder_callTwoFloatMethod },
+ { "nCallFourFloatMethod", "(Ljava/lang/Object;IFFFF)V",
+ (void*)android_animation_PropertyValuesHolder_callFourFloatMethod },
+ { "nCallMultipleFloatMethod", "(Ljava/lang/Object;I[F)V",
+ (void*)android_animation_PropertyValuesHolder_callMultipleFloatMethod },
+ { "nCallTwoIntMethod", "(Ljava/lang/Object;III)V",
+ (void*)android_animation_PropertyValuesHolder_callTwoIntMethod },
+ { "nCallFourIntMethod", "(Ljava/lang/Object;IIIII)V",
+ (void*)android_animation_PropertyValuesHolder_callFourIntMethod },
+ { "nCallMultipleIntMethod", "(Ljava/lang/Object;I[I)V",
+ (void*)android_animation_PropertyValuesHolder_callMultipleIntMethod },
};
int register_android_animation_PropertyValuesHolder(JNIEnv* env)
diff --git a/core/jni/android_util_Process.cpp b/core/jni/android_util_Process.cpp
index 601975a..cbed99f 100644
--- a/core/jni/android_util_Process.cpp
+++ b/core/jni/android_util_Process.cpp
@@ -344,23 +344,6 @@ jint android_os_Process_getThreadPriority(JNIEnv* env, jobject clazz,
return pri;
}
-jboolean android_os_Process_setOomAdj(JNIEnv* env, jobject clazz,
- jint pid, jint adj)
-{
-#ifdef HAVE_OOM_ADJ
- char text[64];
- sprintf(text, "/proc/%d/oom_adj", pid);
- int fd = open(text, O_WRONLY);
- if (fd >= 0) {
- sprintf(text, "%d", adj);
- write(fd, text, strlen(text));
- close(fd);
- }
- return true;
-#endif
- return false;
-}
-
jboolean android_os_Process_setSwappiness(JNIEnv *env, jobject clazz,
jint pid, jboolean is_increased)
{
@@ -1023,7 +1006,6 @@ static const JNINativeMethod methods[] = {
{"setThreadGroup", "(II)V", (void*)android_os_Process_setThreadGroup},
{"setProcessGroup", "(II)V", (void*)android_os_Process_setProcessGroup},
{"getProcessGroup", "(I)I", (void*)android_os_Process_getProcessGroup},
- {"setOomAdj", "(II)Z", (void*)android_os_Process_setOomAdj},
{"setSwappiness", "(IZ)Z", (void*)android_os_Process_setSwappiness},
{"setArgV0", "(Ljava/lang/String;)V", (void*)android_os_Process_setArgV0},
{"setUid", "(I)I", (void*)android_os_Process_setUid},
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index 6ddd3fe..f0fc9e3 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -2094,6 +2094,13 @@
android:description="@string/permdesc_readFrameBuffer"
android:protectionLevel="signature|system" />
+ <!-- Allows an application to use InputFlinger's low level features.
+ <p>Not for use by third-party applications. -->
+ <permission android:name="android.permission.ACCESS_INPUT_FLINGER"
+ android:label="@string/permlab_accessInputFlinger"
+ android:description="@string/permdesc_accessInputFlinger"
+ android:protectionLevel="signature" />
+
<!-- Allows an application to configure and connect to Wifi displays
@hide -->
<permission android:name="android.permission.CONFIGURE_WIFI_DISPLAY"
diff --git a/core/res/res/drawable-hdpi/scrollbar_handle_accelerated_anim2.9.png b/core/res/res/drawable-hdpi/scrollbar_handle_accelerated_anim2.9.png
index 6eddc3f..fb9e7aa 100644
--- a/core/res/res/drawable-hdpi/scrollbar_handle_accelerated_anim2.9.png
+++ b/core/res/res/drawable-hdpi/scrollbar_handle_accelerated_anim2.9.png
Binary files differ
diff --git a/core/res/res/drawable-ldpi/scrollbar_handle_accelerated_anim2.9.png b/core/res/res/drawable-ldpi/scrollbar_handle_accelerated_anim2.9.png
index 0562c03..a4ca3e0 100644
--- a/core/res/res/drawable-ldpi/scrollbar_handle_accelerated_anim2.9.png
+++ b/core/res/res/drawable-ldpi/scrollbar_handle_accelerated_anim2.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/scrollbar_handle_accelerated_anim2.9.png b/core/res/res/drawable-mdpi/scrollbar_handle_accelerated_anim2.9.png
index 766e4c0..6d83bb4 100644
--- a/core/res/res/drawable-mdpi/scrollbar_handle_accelerated_anim2.9.png
+++ b/core/res/res/drawable-mdpi/scrollbar_handle_accelerated_anim2.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/scrollbar_handle_accelerated_anim2.9.png b/core/res/res/drawable-xhdpi/scrollbar_handle_accelerated_anim2.9.png
index 3cf84a5..70856c0 100644
--- a/core/res/res/drawable-xhdpi/scrollbar_handle_accelerated_anim2.9.png
+++ b/core/res/res/drawable-xhdpi/scrollbar_handle_accelerated_anim2.9.png
Binary files differ
diff --git a/core/res/res/layout-land/time_picker_holo.xml b/core/res/res/layout-land/time_picker_holo.xml
new file mode 100644
index 0000000..f5ce1ec
--- /dev/null
+++ b/core/res/res/layout-land/time_picker_holo.xml
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+**
+** Copyright 2013, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="horizontal"
+ android:focusable="true"
+ android:layout_marginLeft="@dimen/timepicker_minimum_margin_sides"
+ android:layout_marginRight="@dimen/timepicker_minimum_margin_sides"
+ android:layout_marginTop="@dimen/timepicker_minimum_margin_top_bottom"
+ android:layout_marginBottom="@dimen/timepicker_minimum_margin_top_bottom">
+ <LinearLayout
+ android:layout_width="@dimen/timepicker_left_side_width"
+ android:layout_height="match_parent"
+ android:orientation="vertical">
+ <FrameLayout
+ android:layout_width="match_parent"
+ android:layout_height="0dip"
+ android:layout_weight="1"
+ android:background="?android:attr/timePickerHeaderBackgroundColor">
+ <include
+ layout="@layout/time_header_label"
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/timepicker_header_height"
+ android:layout_gravity="center" />
+ </FrameLayout>
+ <LinearLayout
+ android:id="@+id/layout_buttons"
+ style="?android:attr/buttonBarStyle"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ android:background="?android:attr/timePickerHeaderBackgroundColor"
+ android:divider="?android:attr/dividerHorizontal"
+ android:showDividers="beginning">
+ <Button
+ android:id="@+id/done_button"
+ style="?android:attr/buttonBarButtonStyle"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:minHeight="48dp"
+ android:text="@string/done_label"
+ android:textSize="@dimen/timepicker_done_label_size" />
+ </LinearLayout>
+ </LinearLayout>
+ <android.widget.RadialTimePickerView
+ android:id="@+id/radial_picker"
+ android:layout_width="@dimen/timepicker_radial_picker_dimen"
+ android:layout_height="match_parent"
+ android:layout_gravity="center"
+ android:focusable="true"
+ android:focusableInTouchMode="true" />
+</LinearLayout> \ No newline at end of file
diff --git a/core/res/res/layout/time_header_label.xml b/core/res/res/layout/time_header_label.xml
new file mode 100644
index 0000000..00cb81b
--- /dev/null
+++ b/core/res/res/layout/time_header_label.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/time_header"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_gravity="center" >
+
+ <TextView
+ android:id="@+id/hours"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_toLeftOf="@+id/separator"
+ android:layout_alignBaseline="@+id/separator"
+ android:textAppearance="?android:attr/timePickerHeaderTimeLabelTextAppearance"/>
+
+ <TextView
+ android:id="@+id/separator"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:paddingLeft="@dimen/timepicker_separator_padding"
+ android:paddingRight="@dimen/timepicker_separator_padding"
+ android:layout_centerInParent="true"
+ android:textAppearance="?android:attr/timePickerHeaderTimeLabelTextAppearance"
+ android:importantForAccessibility="no" />
+
+ <TextView
+ android:id="@+id/minutes"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_toRightOf="@+id/separator"
+ android:layout_alignBaseline="@+id/separator"
+ android:textAppearance="?android:attr/timePickerHeaderTimeLabelTextAppearance" />
+
+ <TextView
+ android:id="@+id/ampm_label"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:paddingLeft="@dimen/timepicker_ampm_left_padding"
+ android:paddingRight="@dimen/timepicker_ampm_left_padding"
+ android:layout_toRightOf="@+id/separator"
+ android:layout_alignBaseline="@+id/separator"
+ android:textAppearance="?android:attr/timePickerHeaderAmPmLabelTextAppearance"
+ android:importantForAccessibility="no" />
+
+</RelativeLayout>
diff --git a/core/res/res/layout/time_picker_holo.xml b/core/res/res/layout/time_picker_holo.xml
index c6b7d3a..0890fe5 100644
--- a/core/res/res/layout/time_picker_holo.xml
+++ b/core/res/res/layout/time_picker_holo.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
**
-** Copyright 2011, The Android Open Source Project
+** Copyright 2013, 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.
@@ -17,70 +17,38 @@
*/
-->
-<!-- Layout of time picker -->
-
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/timePickerLayout"
- android:orientation="horizontal"
- android:layout_gravity="center_horizontal"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:paddingStart="8dip"
- android:paddingEnd="8dip">
-
- <LinearLayout android:orientation="horizontal"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:paddingStart="8dip"
- android:paddingEnd="8dip"
- android:layoutDirection="ltr">
-
- <!-- hour -->
- <NumberPicker
- android:id="@+id/hour"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:orientation="vertical"
+ android:focusable="true" >
+ <include
+ layout="@layout/time_header_label"
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/timepicker_header_height"
+ android:layout_gravity="center" />
+ <android.widget.RadialTimePickerView
+ android:id="@+id/radial_picker"
android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginTop="16dip"
- android:layout_marginBottom="16dip"
+ android:layout_height="@dimen/timepicker_radial_picker_dimen"
+ android:layout_gravity="center"
android:focusable="true"
- android:focusableInTouchMode="true"
- />
-
- <!-- divider -->
- <TextView
- android:id="@+id/divider"
- android:layout_width="wrap_content"
+ android:focusableInTouchMode="true" />
+ <LinearLayout
+ android:id="@+id/layout_buttons"
+ style="?android:attr/buttonBarStyle"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_marginStart="6dip"
- android:layout_marginEnd="6dip"
- android:layout_gravity="center_vertical"
- android:importantForAccessibility="no"
- />
-
- <!-- minute -->
- <NumberPicker
- android:id="@+id/minute"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginTop="16dip"
- android:layout_marginBottom="16dip"
- android:focusable="true"
- android:focusableInTouchMode="true"
- />
-
+ android:orientation="vertical"
+ android:divider="?android:attr/dividerHorizontal"
+ android:showDividers="beginning">
+ <Button
+ android:id="@+id/done_button"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:minHeight="48dp"
+ android:text="@string/done_label"
+ android:textSize="@dimen/timepicker_done_label_size"
+ style="?android:attr/buttonBarButtonStyle" />
</LinearLayout>
-
- <!-- AM / PM -->
- <NumberPicker
- android:id="@+id/amPm"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginTop="16dip"
- android:layout_marginBottom="16dip"
- android:layout_marginStart="8dip"
- android:layout_marginEnd="8dip"
- android:focusable="true"
- android:focusableInTouchMode="true"
- />
-
</LinearLayout>
diff --git a/core/res/res/layout/time_picker.xml b/core/res/res/layout/time_picker_legacy.xml
index 4fa94f3..4fa94f3 100644
--- a/core/res/res/layout/time_picker.xml
+++ b/core/res/res/layout/time_picker_legacy.xml
diff --git a/core/res/res/layout/time_picker_legacy_holo.xml b/core/res/res/layout/time_picker_legacy_holo.xml
new file mode 100644
index 0000000..c6b7d3a
--- /dev/null
+++ b/core/res/res/layout/time_picker_legacy_holo.xml
@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+**
+** Copyright 2011, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<!-- Layout of time picker -->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/timePickerLayout"
+ android:orientation="horizontal"
+ android:layout_gravity="center_horizontal"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:paddingStart="8dip"
+ android:paddingEnd="8dip">
+
+ <LinearLayout android:orientation="horizontal"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:paddingStart="8dip"
+ android:paddingEnd="8dip"
+ android:layoutDirection="ltr">
+
+ <!-- hour -->
+ <NumberPicker
+ android:id="@+id/hour"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="16dip"
+ android:layout_marginBottom="16dip"
+ android:focusable="true"
+ android:focusableInTouchMode="true"
+ />
+
+ <!-- divider -->
+ <TextView
+ android:id="@+id/divider"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginStart="6dip"
+ android:layout_marginEnd="6dip"
+ android:layout_gravity="center_vertical"
+ android:importantForAccessibility="no"
+ />
+
+ <!-- minute -->
+ <NumberPicker
+ android:id="@+id/minute"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="16dip"
+ android:layout_marginBottom="16dip"
+ android:focusable="true"
+ android:focusableInTouchMode="true"
+ />
+
+ </LinearLayout>
+
+ <!-- AM / PM -->
+ <NumberPicker
+ android:id="@+id/amPm"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="16dip"
+ android:layout_marginBottom="16dip"
+ android:layout_marginStart="8dip"
+ android:layout_marginEnd="8dip"
+ android:focusable="true"
+ android:focusableInTouchMode="true"
+ />
+
+</LinearLayout>
diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml
index 1a9acd3..12b7e18 100644
--- a/core/res/res/values-af/strings.xml
+++ b/core/res/res/values-af/strings.xml
@@ -50,6 +50,11 @@
<string name="invalidPuk" msgid="8761456210898036513">"Voer \'n PUK van 8 syfers of langer in."</string>
<string name="needPuk" msgid="919668385956251611">"Jou SIM-kaart is PUK-gesluit. Voer die PUK-kode in om dit te ontsluit."</string>
<string name="needPuk2" msgid="4526033371987193070">"Sleutel PUK2 in om SIM-kaart oop te sluit."</string>
+ <string name="enablePin" msgid="209412020907207950">"Onsuksesvol, aktiveer SIM-/RUIM-slot."</string>
+ <plurals name="pinpuk_attempts">
+ <item quantity="one" msgid="6596245285809790142">"Jy het <xliff:g id="NUMBER">%d</xliff:g> oorblywende poging voordat SIM gesluit word."</item>
+ <item quantity="other" msgid="7530597808358774740">"Jy het <xliff:g id="NUMBER">%d</xliff:g> oorblywende pogings voordat SIM gesluit word."</item>
+ </plurals>
<string name="imei" msgid="2625429890869005782">"IMEI"</string>
<string name="meid" msgid="4841221237681254195">"MEID"</string>
<string name="ClipMmi" msgid="6952821216480289285">"Inkomender beller-ID"</string>
@@ -477,6 +482,8 @@
<string name="permdesc_accessSurfaceFlinger" msgid="1041619516733293551">"Laat die program toe om SurfaceFlinger se laevlak-kenmerke te gebruik."</string>
<string name="permlab_readFrameBuffer" msgid="6690504248178498136">"lees raambuffer"</string>
<string name="permdesc_readFrameBuffer" msgid="4937405521809454680">"Laat die program toe om die inhoud van die raambuffer te lees."</string>
+ <string name="permlab_accessInputFlinger" msgid="5348635270689553857">"kry toegang tot InputFlinger"</string>
+ <string name="permdesc_accessInputFlinger" msgid="2104864941201226616">"Laat die program toe om InputFlinger se laevlak-kenmerke te gebruik."</string>
<string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"stel Wi-Fi-skerms op"</string>
<string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"Laat die program toe om Wi-Fi-skerms op te stel en daaraan te koppel."</string>
<string name="permlab_controlWifiDisplay" msgid="393641276723695496">"beheer Wi-Fi-skerms"</string>
@@ -1414,6 +1421,7 @@
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Invoersleutel"</string>
<string name="activitychooserview_choose_application" msgid="2125168057199941199">"Kies \'n program"</string>
+ <string name="activitychooserview_choose_application_error" msgid="8624618365481126668">"Kon <xliff:g id="APPLICATION_NAME">%s</xliff:g> nie begin nie"</string>
<string name="shareactionprovider_share_with" msgid="806688056141131819">"Deel met"</string>
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Deel met <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Skyfievatsel. Raak en hou."</string>
@@ -1649,5 +1657,16 @@
<item quantity="other" msgid="4730868920742952817">"Probeer weer oor <xliff:g id="COUNT">%d</xliff:g> sekondes"</item>
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Probeer later weer"</string>
- <string name="immersive_mode_confirmation" msgid="7227416894979047467">"Sleep van bo af na onder om volskerm te verlaat."</string>
+ <string name="immersive_mode_confirmation" msgid="7227416894979047467">"Swiep van bo af na onder om volskerm te verlaat."</string>
+ <string name="done_label" msgid="2093726099505892398">"Klaar"</string>
+ <string name="hour_picker_description" msgid="6698199186859736512">"Ure se sirkelglyer"</string>
+ <string name="minute_picker_description" msgid="8606010966873791190">"Minute se sirkelglyer"</string>
+ <string name="select_hours" msgid="6043079511766008245">"Kies ure"</string>
+ <string name="select_minutes" msgid="3974345615920336087">"Kies minute"</string>
+ <string name="day_picker_description" msgid="8990847925961297968">"Maandrooster van dae"</string>
+ <string name="year_picker_description" msgid="5524331207436052403">"Jaarlys"</string>
+ <string name="select_day" msgid="7774759604701773332">"Kies maand en dag"</string>
+ <string name="select_year" msgid="7952052866994196170">"Kies jaar"</string>
+ <string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> gekies"</string>
+ <string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> uitgevee"</string>
</resources>
diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml
index e64b6f5..b22dd0f 100644
--- a/core/res/res/values-am/strings.xml
+++ b/core/res/res/values-am/strings.xml
@@ -50,6 +50,11 @@
<string name="invalidPuk" msgid="8761456210898036513">"8 ወይሠከዛ በላይ የሆኑ á‰áŒ¥áˆ®á‰½áŠ•PUK ተይብá¢"</string>
<string name="needPuk" msgid="919668385956251611">"SIM ካርድዎ PUK-የተቆለሠáŠá‹á¢á‹¨PUK ኮዱን በመተየብ ይክáˆá‰±á‰µá¢"</string>
<string name="needPuk2" msgid="4526033371987193070">" SIM ለመክáˆá‰µ PUK2 ተይብá¢"</string>
+ <string name="enablePin" msgid="209412020907207950">"አáˆá‰°áˆ³áŠ«áˆá£ የሲáˆ/RUIM á‰áˆáን አንቃá¢"</string>
+ <plurals name="pinpuk_attempts">
+ <item quantity="one" msgid="6596245285809790142">"ሲáˆá‹Ž ከመቆለበበáŠá‰µ <xliff:g id="NUMBER">%d</xliff:g> ሙከራ ይቀርዎታáˆá¢"</item>
+ <item quantity="other" msgid="7530597808358774740">"ሲáˆá‹Ž ከመቆለበበáŠá‰µ <xliff:g id="NUMBER">%d</xliff:g> ሙከራዎች ይቀሩዎታáˆá¢"</item>
+ </plurals>
<string name="imei" msgid="2625429890869005782">"IMEI"</string>
<string name="meid" msgid="4841221237681254195">"MEID"</string>
<string name="ClipMmi" msgid="6952821216480289285">"የገቢ ደዋይID"</string>
@@ -175,7 +180,7 @@
<string name="permgroupdesc_messages" msgid="7821999071003699236">"ኤስ ኤሠኤስህንᣠኢሜይáˆáˆ…ን እና ሌላ መáˆá‹•ክቶችህን አንብብና áƒáá¢"</string>
<string name="permgrouplab_personalInfo" msgid="3519163141070533474">"የáŒáˆ መረጃዎ"</string>
<string name="permgroupdesc_personalInfo" msgid="8426453129788861338">"በእá‹á‰‚á‹« ካርድህ ላይ ወደተከማቸ የአንተ መረጃ ቀጥተኛ መዳረሻá¢"</string>
- <string name="permgrouplab_socialInfo" msgid="5799096623412043791">"ማህበራዊ መረጃህ"</string>
+ <string name="permgrouplab_socialInfo" msgid="5799096623412043791">"ማህበራዊ መረጃዎ"</string>
<string name="permgroupdesc_socialInfo" msgid="7129842457611643493">"ወደ የእá‹á‰‚ያዎችህና የማህበራዊ áŒáŠ•áŠ™áŠá‰¶á‰½áˆ… መረጃ ቀጥተኛ መዳረሻá¢"</string>
<string name="permgrouplab_location" msgid="635149742436692049">"ስáራዎ"</string>
<string name="permgroupdesc_location" msgid="5704679763124170100">"ያለህበትን አካባቢ ተቆጣጠርá¢"</string>
@@ -205,7 +210,7 @@
<string name="permgroupdesc_camera" msgid="2933667372289567714">"ለካሜራ áˆáˆµáˆ ወይሠቪዲዮ ለመቅረጽ ቀጥተኛ መዳረሻá¢"</string>
<string name="permgrouplab_screenlock" msgid="8275500173330718168">"ማያ ገጽ ቆáˆá"</string>
<string name="permgroupdesc_screenlock" msgid="7067497128925499401">"በመሣሪያዎ ላይ ያለá‹áŠ• የመቆለáŠá‹« ማያ ገጽ ባህሪያት ላይ ተጽዕኖ የመáጠር ችሎታá¢"</string>
- <string name="permgrouplab_appInfo" msgid="8028789762634147725">"የመተáŒá‰ áˆªá‹«á‹Žá‰½áˆ… መረጃ"</string>
+ <string name="permgrouplab_appInfo" msgid="8028789762634147725">"የመተáŒá‰ áˆªá‹«á‹Žá‰½á‹Ž መረጃ"</string>
<string name="permgroupdesc_appInfo" msgid="3950378538049625907">"በመሣሪያህ ላይ ያሉ የሌሎች መተáŒá‰ áˆªá‹«á‹Žá‰½ ባህሪዎች ላይ ተá…ዕኖ የማሳረá ችሎታá¢"</string>
<string name="permgrouplab_wallpaper" msgid="3850280158041175998">"áˆáŒ£á"</string>
<string name="permgroupdesc_wallpaper" msgid="5630417854750540154">"የመሣሪያá‹áŠ• áˆáŒ£á ቅንብሮች ቀይርá¢"</string>
@@ -272,7 +277,7 @@
<string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"በስáˆáŠ­áˆ… ወይሠሲሠካርድህ ላይ ኤስ ኤሠኤስ መáˆá‹•ክቶችን ለመáƒá ለመተáŒá‰ áˆªá‹«á‹ á‹­áˆá‰…ዳሉá¡á¡áˆ˜áˆá‹•ክቶችህን ተንኮሠአዘሠመተáŒá‰ áˆªá‹«á‹Žá‰½ ሊሰርዙ ይችላሉá¡á¡"</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"የá…áˆá መáˆá‹•ክቶችን ተቀበሠ(WAP)"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"መተáŒá‰ áˆªá‹«á‹ የWAP መáˆáŠ¥áŠ­á‰¶á‰½áŠ• እንዲያáŠá‰¥ እና እንዲያካሂድ á‹­áˆá‰…ዳáˆá¢ ይህ áˆá‰ƒá‹µ የተላኩáˆáˆ…ን መáˆáŠ¥áŠ­á‰¶á‰½ ላንተ ሳያሳይህ የመቆጣጠር ወይሠየመሰረዠብቃትን ያጠቃáˆáˆ‹áˆá¢"</string>
- <string name="permlab_getTasks" msgid="6466095396623933906">"አሂድ መተáŒá‰ áˆªá‹«á‹Žá‰½áŠ• ሰርስረህ አá‹áŒ£"</string>
+ <string name="permlab_getTasks" msgid="6466095396623933906">"አሂድ መተáŒá‰ áˆªá‹«á‹Žá‰½áŠ• ሰርስረዠያá‹áŒ¡"</string>
<string name="permdesc_getTasks" msgid="7454215995847658102">"መተáŒá‰ áˆªá‹«á‹ በአáˆáŠ‘ ጊዜና በቅርቡ እየተካሄዱ ስላሉ ተáŒá‰£áˆ®á‰½áŠ• መረጃ ሰርስሮ እንዲያወጣ á‹­áˆá‰…ድለታáˆá¢ ይህ መተáŒá‰ áˆªá‹«á‹ በመሳሪያዠላይ የትኛዎቹ መተáŒá‰ áˆªá‹«á‹Žá‰½ ጥቅሠላይ ስለመዋላቸዠመረጃ እንዲያገአሊáˆá‰…ድለት ይችላáˆá¢"</string>
<string name="permlab_interactAcrossUsers" msgid="7114255281944211682">"በተለያዩ ተጠቃሚዎች መካከሠመስተጋብር መáጠር"</string>
<string name="permdesc_interactAcrossUsers" msgid="364670963623385786">"መተáŒá‰ áˆªá‹«á‹ በመሣሪያዠላይ በተለያዩ ተጠቃሚዎች ላይ እርáˆáŒƒá‹Žá‰½áŠ• እንዲáˆáŒ½áˆ á‹­áˆá‰…ድለታáˆá¢ ተንኮáˆ-አዘሠመተáŒá‰ áˆªá‹«á‹Žá‰½ ይህንን ተጠቅመዠበተጠቃሚዎች መካከሠያለá‹áŠ• ጥበቃ ሊጥሱ ይችላሉá¢"</string>
@@ -450,9 +455,9 @@
<string name="permdesc_writeCallLog" product="tablet" msgid="6661806062274119245">"ስለ ገቢ እና ወጪ ጥሪዎችን á‹áˆ‚ብ ጨáˆáˆ®á£ የጡባዊተኮህን áˆá‹áŒá‰¥ ማስታወሻ ለመቀየር ለመተáŒá‰ áˆªá‹«á‹ á‹­áˆá‰…ዳáˆá¢ ይሄንን ተንኮሠአዘሠመተáŒá‰ áˆªá‹«á‹Žá‰½ የስáˆáŠ­áˆ…áŠ• áˆá‹áŒá‰¥ ማስታወሻ ለመሰረዠወይሠለመለወጥ ሊጠቀሙበት ይችላሉá¢"</string>
<string name="permdesc_writeCallLog" product="default" msgid="683941736352787842">"ስለ ገቢ እና ወጪ ጥሪዎችን á‹áˆ‚ብ ጨáˆáˆ®á£ የስáˆáŠ­áˆ…áŠ• áˆá‹áŒá‰¥ ማስታወሻ ለመቀየር ለመተáŒá‰ áˆªá‹«á‹ á‹­áˆá‰…ዳáˆá¢ ይሄንን ተንኮሠአዘሠመተáŒá‰ áˆªá‹«á‹Žá‰½ የስáˆáŠ­áˆ…áŠ• áˆá‹áŒá‰¥ ማስታወሻ ለመሰረዠወይሠለመለወጥ ሊጠቀሙበት ይችላሉá¢"</string>
<string name="permlab_readProfile" msgid="4701889852612716678">"የራስህን የእá‹á‰‚á‹« ካርድ አንብብ"</string>
- <string name="permdesc_readProfile" product="default" msgid="5462475151849888848">"መተáŒá‰ áˆªá‹«á‹ áˆáŠ­ እንደ ስáˆáˆ… እና የእá‹á‰‚á‹« መረጃህ ያሉ በመሳሪያህ ላይ የተከማቹ የáŒáˆ መገለጫ መረጃዎችን እንዲያáŠá‰¥ á‹­áˆá‰…ድለታáˆá¢ ይህሠማለት መተáŒá‰ áˆªá‹«á‹ ለይቶ ሊያá‹á‰…ህ እና የመገለጫ መረጃህን ለሌሎች ሊáˆáŠ­ ይችላáˆá¢"</string>
+ <string name="permdesc_readProfile" product="default" msgid="5462475151849888848">"መተáŒá‰ áˆªá‹«á‹ áˆáŠ­ እንደ ስáˆá‹Ž እና የእá‹á‰‚á‹« መረጃዎ ያሉ በመሳሪያዎ ላይ የተከማቹ የáŒáˆ መገለጫ መረጃዎችን እንዲያáŠá‰¥ á‹­áˆá‰…ድለታáˆá¢ ይህሠማለት መተáŒá‰ áˆªá‹«á‹ ለይቶ ሊያá‹á‰á‹Ž እና የመገለጫ መረጃዎን ለሌሎች ሊáˆáŠ­ ይችላáˆá¢"</string>
<string name="permlab_writeProfile" msgid="907793628777397643">"የራስህን የዕá‹á‰‚á‹« ካርድ አስተካክáˆ"</string>
- <string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"መተáŒá‰ áˆªá‹«á‹ áˆáŠ­ እንደ ስáˆáˆ… እና የእá‹á‰‚á‹« መረጃህ ያሉ በመሳሪያህ ላይ የተከማቹ የáŒáˆ መገለጫ መረጃዎችን እንዲቀይር ወይሠእንዲያክáˆá‰£á‰¸á‹ á‹­áˆá‰…ድለታáˆá¢ ይህሠማለት መተáŒá‰ áˆªá‹«á‹ ለይቶ ሊያá‹á‰…ህ እና የመገለጫ መረጃህን ለሌሎች ሊáˆáŠ­ ይችላáˆá¢"</string>
+ <string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"መተáŒá‰ áˆªá‹«á‹ áˆáŠ­ እንደ ስáˆá‹Ž እና የእá‹á‰‚á‹« መረጃዎ ያሉ በመሳሪያዎ ላይ የተከማቹ የáŒáˆ መገለጫ መረጃዎችን እንዲቀይር ወይሠእንዲያክáˆá‰£á‰¸á‹ á‹­áˆá‰…ድለታáˆá¢ ይህሠማለት መተáŒá‰ áˆªá‹«á‹ ለይቶ ሊያá‹á‰…ዎ እና የመገለጫ መረጃዎን ለሌሎች ሊáˆáŠ­ ይችላáˆá¢"</string>
<string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"የአንተን ማህበራዊ የá‹á‹­á‹­á‰µ ክáሎች አንብብ"</string>
<string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"መተáŒá‰ áˆªá‹«á‹ የአንተንና የጓኞችህን ማህበራዊ á‹áˆ›áŠ”á‹Žá‰½áŠ• እንዲደርስባቸዠእና እንዲያመሳስላቸዠይáˆá‰…ድለታáˆá¢ መረጃ ስታጋራ ተጠንቀቅ -- ይህ መተáŒá‰ áˆªá‹«á‹ ሚስጥራዊáŠá‰µáŠ• ከáŒáˆá‰µ ሳያስገባ በማህበራዊ አá‹á‰³áˆ¨ መረቦች በአንተ እና በጓደኞችህ መካከሠየሚደረጉ áŒáŠ•áŠ™áŠá‰¶á‰½áŠ• እንዲያáŠá‰¥ á‹­áˆá‰…ድለታáˆá¢ ማስታወሻᦠይህ áˆá‰ƒá‹µ ለáˆáˆ‰áˆ ማህበራዊ አá‹á‰³áˆ­ መረቦች ላይ ላይáˆáŒ¸áˆ ይችላáˆá¢"</string>
<string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"ወደ የአንተ ማህበራዊ የá‹á‹­á‹­á‰µ ክáሎች ጻá"</string>
@@ -477,6 +482,8 @@
<string name="permdesc_accessSurfaceFlinger" msgid="1041619516733293551">"መተáŒá‰ áˆªá‹«á‹áŠ• የSurfaceFlinger á‹á‰…ተኛ ደረጃ ባህሪያትን ለመጠቀሠይáˆá‰…ዳáˆá¢"</string>
<string name="permlab_readFrameBuffer" msgid="6690504248178498136">"የንዑስ ክáˆá ቋት አንብብ"</string>
<string name="permdesc_readFrameBuffer" msgid="4937405521809454680">"የክáˆá ቋት ይዘት ለማንበብ ለመተáŒá‰ áˆªá‹«á‹ á‹­áˆá‰…ዳሉá¢"</string>
+ <string name="permlab_accessInputFlinger" msgid="5348635270689553857">"InputFlinger ን መድረስ"</string>
+ <string name="permdesc_accessInputFlinger" msgid="2104864941201226616">"መተáŒá‰ áˆªá‹«á‹ ባለአáŠáˆµá‰°áŠ› የInputFlinger ባህሪያት እንዲጠቀሠይáˆá‰…ድለታáˆá¢"</string>
<string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"የWifi ማሳያዎችን አዋቅር"</string>
<string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"መተáŒá‰ áˆªá‹«á‹ የWifi ማሳያዎችን እንዲያዋቅርና ከእáŠáˆ± ጋር እንዲገናአይáˆá‰…ድለታáˆá¢"</string>
<string name="permlab_controlWifiDisplay" msgid="393641276723695496">"የWifi ማሳያዎችን ተቆጣጠር"</string>
@@ -585,9 +592,9 @@
<string name="permdesc_authenticateAccounts" msgid="5472124296908977260">"የመለያ አረጋጋጭ መለያ መናጅ ችሎታን ለመጠቀáˆá£ መለያ መáጠር እና የይለá ቃሎችን ለማáŒáŠ˜á‰µ እና ለማቀናጀት አክሎ ለመተáŒá‰ áˆªá‹«á‹ á‹­áˆá‰…ዳሉ á¢"</string>
<string name="permlab_manageAccounts" msgid="4983126304757177305">"መለያዎችን አክሠወይሠአስወáŒá‹µ"</string>
<string name="permdesc_manageAccounts" msgid="8698295625488292506">"መለያዎችን እንደ ማከሠእና ማስወገድ ክወናዎችን እና የይለá ቃáˆáŠ• መሰረዠለማከናወን ለመተáŒá‰ áˆªá‹«á‹ á‹­áˆá‰…ዳሉá¡á¡"</string>
- <string name="permlab_useCredentials" msgid="235481396163877642">"በመሣሪያዠላይ ያሉ መለያዎችን ተጠቀáˆ"</string>
+ <string name="permlab_useCredentials" msgid="235481396163877642">"በመሣሪያዠላይ ያሉ መለያዎችን ይጠቀሙ"</string>
<string name="permdesc_useCredentials" msgid="7984227147403346422">"የማረጋገጫ የáˆáˆµáŒ‹áŠ“ የáˆáˆµáŠ­áˆ­ ወረቀትን ለመጠየቅ ለመተáŒá‰ áˆªá‹«á‹ á‹­áˆá‰…ዳሉá¡á¡"</string>
- <string name="permlab_accessNetworkState" msgid="4951027964348974773">"የአá‹á‰³áˆ¨ መረብ áŒáŠ‘áŠáŠá‰¶á‰½áŠ• እይ"</string>
+ <string name="permlab_accessNetworkState" msgid="4951027964348974773">"የአá‹á‰³áˆ¨ መረብ áŒáŠ•áŠ™áŠá‰¶á‰½áŠ• ይመáˆáŠ¨á‰±"</string>
<string name="permdesc_accessNetworkState" msgid="8318964424675960975">"መተáŒá‰ áˆªá‹«á‹ እንደ የትኛዎቹ አá‹á‰³áˆ¨ መረቦች እንዳሉ እና እንደተገናኙ ያሉ የአá‹á‰³áˆ¨ መረብ áŒáŠ•áŠ™áŠá‰¶á‰½ መረጃዎችን እንዲያይ á‹­áˆá‰…ድለታáˆá¢"</string>
<string name="permlab_createNetworkSockets" msgid="8018758136404323658">"ሙሉ የአá‹á‰³áˆ¨ መረብ መዳረሻ"</string>
<string name="permdesc_createNetworkSockets" msgid="3403062187779724185">"መተáŒá‰ áˆªá‹«á‹ የአá‹á‰³áˆ¨ መረብ መሰኪያዎችን እንዲáˆáŒ¥áˆ­ እና ብጠየአá‹á‰³áˆ¨ መረብ á•ሮቶኮሎችን እንዲጠቀሠይáˆá‰…ድለታáˆá¢ አሳሹ እና ሌሎች መተáŒá‰ áˆªá‹«á‹Žá‰½ á‹áˆ‚ብ ወደ በይáŠáˆ˜áˆ¨á‰¥ የመላኪያ መንገዶችን ስለሚያቀርቡá‹áˆ‚ብ ወደ በይáŠáˆ˜áˆ¨á‰¥ ለመላክ ይህ áቃድ አያስáˆáˆáŒáˆá¢"</string>
@@ -1414,6 +1421,7 @@
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"ቀይር"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"አስገባ"</string>
<string name="activitychooserview_choose_application" msgid="2125168057199941199">"መተáŒá‰ áˆªá‹« áˆáˆ¨áŒ¥"</string>
+ <string name="activitychooserview_choose_application_error" msgid="8624618365481126668">"<xliff:g id="APPLICATION_NAME">%s</xliff:g>ን ማስጀመር አáˆá‰°á‰»áˆˆáˆ"</string>
<string name="shareactionprovider_share_with" msgid="806688056141131819">"ተጋራ ከ"</string>
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"ከ <xliff:g id="APPLICATION_NAME">%s</xliff:g> ጋር ተጋራ"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"ባለስላይድ መያዣá¡á¡ ዳስ&amp;á‹«á‹á¡á¡"</string>
@@ -1650,4 +1658,15 @@
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"ቆይተዠእንደገና ይሞክሩ"</string>
<string name="immersive_mode_confirmation" msgid="7227416894979047467">"ከሙሉ ገጽ ማያ ለመá‹áŒ£á‰µ ጣትዎን ከላይ ወደታች ያንሸራትቱá¢"</string>
+ <string name="done_label" msgid="2093726099505892398">"ተከናá‹áŠ—áˆ"</string>
+ <string name="hour_picker_description" msgid="6698199186859736512">"የሰዓታት ክብ ተንሸራታች"</string>
+ <string name="minute_picker_description" msgid="8606010966873791190">"የደቂቃዎች ክብ ተንሸራታች"</string>
+ <string name="select_hours" msgid="6043079511766008245">"ሰዓታትን á‹­áˆáˆ¨áŒ¡"</string>
+ <string name="select_minutes" msgid="3974345615920336087">"ደቂቃዎችን á‹­áˆáˆ¨áŒ¡"</string>
+ <string name="day_picker_description" msgid="8990847925961297968">"የቀናት የወር áርáŒáˆ­áŒ"</string>
+ <string name="year_picker_description" msgid="5524331207436052403">"የዓመት á‹áˆ­á‹áˆ­"</string>
+ <string name="select_day" msgid="7774759604701773332">"ወር እና ቀን á‹­áˆáˆ¨áŒ¡"</string>
+ <string name="select_year" msgid="7952052866994196170">"ዓመት á‹­áˆáˆ¨áŒ¡"</string>
+ <string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> ተመርጧáˆ"</string>
+ <string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> ተሰርዟáˆ"</string>
</resources>
diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml
index 2d91e28..14c133f 100644
--- a/core/res/res/values-ar/strings.xml
+++ b/core/res/res/values-ar/strings.xml
@@ -27,14 +27,14 @@
<string name="terabyteShort" msgid="231613018159186962">"تيرابايت"</string>
<string name="petabyteShort" msgid="5637816680144990219">"بيتابايت"</string>
<string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
- <string name="untitled" msgid="4638956954852782576">"&lt;بلا عنوان&gt;"</string>
+ <string name="untitled" msgid="4638956954852782576">"â€&lt;بلا عنوان&gt;"</string>
<string name="ellipsis" msgid="7899829516048813237">"…"</string>
<string name="ellipsis_two_dots" msgid="1228078994866030736">"‥"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(ليس هناك رقم هاتÙ)"</string>
<string name="unknownName" msgid="2277556546742746522">"(غير معروÙ)"</string>
<string name="defaultVoiceMailAlphaTag" msgid="2660020990097733077">"البريد الصوتي"</string>
<string name="defaultMsisdnAlphaTag" msgid="2850889754919584674">"MSISDN1"</string>
- <string name="mmiError" msgid="5154499457739052907">"حدثت مشكلة ÙÙŠ الاتصال أو أن كود MMI غير صحيح."</string>
+ <string name="mmiError" msgid="5154499457739052907">"â€Ø­Ø¯Ø«Øª مشكلة ÙÙŠ الاتصال أو أن كود MMI غير صحيح."</string>
<string name="mmiFdnError" msgid="5224398216385316471">"تم تقييد التشغيل لأرقام الاتصال الثابت Ùقط."</string>
<string name="serviceEnabled" msgid="8147278346414714315">"تم تمكين الخدمة."</string>
<string name="serviceEnabledFor" msgid="6856228140453471041">"تم تمكين الخدمة لـ:"</string>
@@ -42,23 +42,28 @@
<string name="serviceRegistered" msgid="6275019082598102493">"تم التسجيل بنجاح."</string>
<string name="serviceErased" msgid="1288584695297200972">"لم يتم المسح بنجاح."</string>
<string name="passwordIncorrect" msgid="7612208839450128715">"كلمة مرور غير صحيحة."</string>
- <string name="mmiComplete" msgid="8232527495411698359">"اكتمل MMI."</string>
- <string name="badPin" msgid="9015277645546710014">"رقم التعري٠الشخصي القديم الذي كتبته غير صحيح."</string>
- <string name="badPuk" msgid="5487257647081132201">"رمز PUK الذي كتبته غير صحيح."</string>
+ <string name="mmiComplete" msgid="8232527495411698359">"â€Ø§ÙƒØªÙ…Ù„ MMI."</string>
+ <string name="badPin" msgid="9015277645546710014">"â€Ø±Ù…ز PIN القديم الذي كتبته غير صحيح."</string>
+ <string name="badPuk" msgid="5487257647081132201">"â€Ø±Ù…ز PUK الذي كتبته غير صحيح."</string>
<string name="mismatchPin" msgid="609379054496863419">"أرقام التعري٠الشخصية التي كتبتها غير مطابقة."</string>
<string name="invalidPin" msgid="3850018445187475377">"اكتب رقم تعري٠شخصيًا مكونًا من 4 إلى ثمانية أعداد."</string>
- <string name="invalidPuk" msgid="8761456210898036513">"اكتب رمز PUK مكونًا من 8 أرقام أو أكثر."</string>
- <string name="needPuk" msgid="919668385956251611">"بطاقة SIM مؤمّنة بكود PUK. اكتب كود PUK لإلغاء تأمينها."</string>
- <string name="needPuk2" msgid="4526033371987193070">"اكتب PUK2 لإلغاء تأمين بطاقة SIM."</string>
+ <string name="invalidPuk" msgid="8761456210898036513">"â€Ø§ÙƒØªØ¨ رمز PUK مكونًا من 8 أرقام أو أكثر."</string>
+ <string name="needPuk" msgid="919668385956251611">"â€Ø¨Ø·Ø§Ù‚Ø© SIM مؤمّنة بكود PUK. اكتب كود PUK لإلغاء تأمينها."</string>
+ <string name="needPuk2" msgid="4526033371987193070">"â€Ø§ÙƒØªØ¨ PUK2 لإلغاء تأمين بطاقة SIM."</string>
+ <string name="enablePin" msgid="209412020907207950">"â€Ù…حاولة غير ناجحة، مكّن Ù‚ÙÙ„ SIM/RUIM."</string>
+ <plurals name="pinpuk_attempts">
+ <item quantity="one" msgid="6596245285809790142">"â€ÙŠØªØ¨Ù‚Ù‰ لديك محاولة واحدة (<xliff:g id="NUMBER">%d</xliff:g>) يتم بعدها Ù‚ÙÙ„ بطاقة SIM."</item>
+ <item quantity="other" msgid="7530597808358774740">"â€ÙŠØªØ¨Ù‚Ù‰ لديك <xliff:g id="NUMBER">%d</xliff:g> من المحاولات يتم بعدها Ù‚ÙÙ„ بطاقة SIM."</item>
+ </plurals>
<string name="imei" msgid="2625429890869005782">"IMEI"</string>
<string name="meid" msgid="4841221237681254195">"MEID"</string>
<string name="ClipMmi" msgid="6952821216480289285">"معر٠المتصل الوارد"</string>
<string name="ClirMmi" msgid="7784673673446833091">"معر٠المتصل الصادر"</string>
- <string name="CfMmi" msgid="5123218989141573515">"إعادة توجيه الاتصال"</string>
+ <string name="CfMmi" msgid="5123218989141573515">"اعادة توجيه المكالمة"</string>
<string name="CwMmi" msgid="9129678056795016867">"انتظار المكالمة"</string>
<string name="BaMmi" msgid="455193067926770581">"حظر الاتصال"</string>
<string name="PwdMmi" msgid="7043715687905254199">"تغيير كلمة المرور"</string>
- <string name="PinMmi" msgid="3113117780361190304">"تغيير رقم التعري٠الشخصي"</string>
+ <string name="PinMmi" msgid="3113117780361190304">"â€ØªØºÙŠÙŠØ± رمز PIN"</string>
<string name="CnipMmi" msgid="3110534680557857162">"رقم الاتصال موجود"</string>
<string name="CnirMmi" msgid="3062102121430548731">"رقم الاتصال مقيّد"</string>
<string name="ThreeWCMmi" msgid="9051047170321190368">"اتصال ثلاثي"</string>
@@ -76,14 +81,14 @@
<string name="RestrictedOnEmergency" msgid="6581163779072833665">"خدمة الطوارئ محظورة."</string>
<string name="RestrictedOnNormal" msgid="4953867011389750673">"الخدمة الصوتية محظورة."</string>
<string name="RestrictedOnAllVoice" msgid="3396963652108151260">"جميع الخدمات الصوتية محظورة."</string>
- <string name="RestrictedOnSms" msgid="8314352327461638897">"خدمة الرسائل القصيرة SMS محظورة."</string>
+ <string name="RestrictedOnSms" msgid="8314352327461638897">"â€Ø®Ø¯Ù…Ø© الرسائل القصيرة SMS محظورة."</string>
<string name="RestrictedOnVoiceData" msgid="996636487106171320">"خدمات الصوت/البيانات محظورة."</string>
- <string name="RestrictedOnVoiceSms" msgid="1888588152792023873">"خدمات الصوت/الرسائل القصيرة SMS محظورة."</string>
- <string name="RestrictedOnAll" msgid="5643028264466092821">"جميع خدمات الصوت/البيانات/الرسائل القصيرة SMS محظورة."</string>
+ <string name="RestrictedOnVoiceSms" msgid="1888588152792023873">"â€Ø®Ø¯Ù…ات الصوت/الرسائل القصيرة SMS محظورة."</string>
+ <string name="RestrictedOnAll" msgid="5643028264466092821">"â€Ø¬Ù…يع خدمات الصوت/البيانات/الرسائل القصيرة SMS محظورة."</string>
<string name="serviceClassVoice" msgid="1258393812335258019">"الصوت"</string>
<string name="serviceClassData" msgid="872456782077937893">"البيانات"</string>
<string name="serviceClassFAX" msgid="5566624998840486475">"Ø§Ù„ÙØ§ÙƒØ³"</string>
- <string name="serviceClassSMS" msgid="2015460373701527489">"الرسائل القصيرة SMS"</string>
+ <string name="serviceClassSMS" msgid="2015460373701527489">"â€Ø§Ù„رسائل القصيرة SMS"</string>
<string name="serviceClassDataAsync" msgid="4523454783498551468">"غير متزامنة"</string>
<string name="serviceClassDataSync" msgid="7530000519646054776">"مزامنة"</string>
<string name="serviceClassPacket" msgid="6991006557993423453">"الحزمة"</string>
@@ -111,7 +116,7 @@
<string name="fcError" msgid="3327560126588500777">"حدثت مشكلة بالاتصال أو أن كود الميزة غير صحيح."</string>
<string name="httpErrorOk" msgid="1191919378083472204">"مواÙÙ‚"</string>
<string name="httpError" msgid="7956392511146698522">"حدث خطأ ÙÙŠ الشبكة."</string>
- <string name="httpErrorLookup" msgid="4711687456111963163">"تعذر العثور على عنوان URL."</string>
+ <string name="httpErrorLookup" msgid="4711687456111963163">"â€ØªØ¹Ø°Ø± العثور على عنوان URL."</string>
<string name="httpErrorUnsupportedAuthScheme" msgid="6299980280442076799">"نظام مصادقة الموقع غير معتمد."</string>
<string name="httpErrorAuth" msgid="1435065629438044534">"تعذرت المصادقة."</string>
<string name="httpErrorProxyAuth" msgid="1788207010559081331">"لم تتم المصادقة عبر الخادم الوكيل بنجاح."</string>
@@ -121,7 +126,7 @@
<string name="httpErrorRedirectLoop" msgid="8679596090392779516">"تحتوي هذه Ø§Ù„ØµÙØ­Ø© على عمليات إعادة توجيه خادم كثيرة للغاية."</string>
<string name="httpErrorUnsupportedScheme" msgid="5015730812906192208">"البروتوكول غير معتمد."</string>
<string name="httpErrorFailedSslHandshake" msgid="96549606000658641">"تعذر إنشاء اتصال آمن."</string>
- <string name="httpErrorBadUrl" msgid="3636929722728881972">"تعذر ÙØªØ­ Ø§Ù„ØµÙØ­Ø© لأن عنوان URL غير صالح."</string>
+ <string name="httpErrorBadUrl" msgid="3636929722728881972">"â€ØªØ¹Ø°Ø± ÙØªØ­ Ø§Ù„ØµÙØ­Ø© لأن عنوان URL غير صالح."</string>
<string name="httpErrorFile" msgid="2170788515052558676">"تعذر الدخول إلى الملÙ."</string>
<string name="httpErrorFileNotFound" msgid="6203856612042655084">"تعذر العثور على المل٠المطلوب."</string>
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"تتم الآن معالجة طلبات كثيرة للغاية. حاول مرة أخرى ÙÙŠ وقت لاحق."</string>
@@ -168,11 +173,11 @@
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"وضع الطائرة متوقÙ"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="safeMode" msgid="2788228061547930246">"الوضع الآمن"</string>
- <string name="android_system_label" msgid="6577375335728551336">"نظام Android"</string>
+ <string name="android_system_label" msgid="6577375335728551336">"â€Ù†Ø¸Ø§Ù… Android"</string>
<string name="permgrouplab_costMoney" msgid="5429808217861460401">"الخدمات التي تكلÙÙƒ المال"</string>
<string name="permgroupdesc_costMoney" msgid="3293301903409869495">"يمكنك تنÙيذ إجراءات يمكن أن تكلÙÙƒ مالاً."</string>
<string name="permgrouplab_messages" msgid="7521249148445456662">"رسائلك"</string>
- <string name="permgroupdesc_messages" msgid="7821999071003699236">"قراءة وكتابة الرسائل القصيرة SMS والرسائل الإلكترونية والرسائل الأخرى."</string>
+ <string name="permgroupdesc_messages" msgid="7821999071003699236">"â€Ù‚راءة وكتابة الرسائل القصيرة SMS والرسائل الإلكترونية والرسائل الأخرى."</string>
<string name="permgrouplab_personalInfo" msgid="3519163141070533474">"معلوماتك الشخصية"</string>
<string name="permgroupdesc_personalInfo" msgid="8426453129788861338">"الدخول المباشر إلى معلومات عنك، تم تخزينها ÙÙŠ بطاقة الاتصال."</string>
<string name="permgrouplab_socialInfo" msgid="5799096623412043791">"المعلومات الاجتماعية"</string>
@@ -228,8 +233,8 @@
<string name="permgrouplab_display" msgid="4279909676036402636">"واجهة مستخدم تطبيقات أخرى"</string>
<string name="permgroupdesc_display" msgid="6051002031933013714">"التأثير على واجهة المستخدم بالتطبيقات الأخرى."</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"التخزين"</string>
- <string name="permgroupdesc_storage" product="nosdcard" msgid="7442318502446874999">"الدخول إلى وحدة تخزين USB."</string>
- <string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"الدخول إلى بطاقة SD."</string>
+ <string name="permgroupdesc_storage" product="nosdcard" msgid="7442318502446874999">"â€Ø§Ù„دخول إلى وحدة تخزين USB."</string>
+ <string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"â€Ø§Ù„دخول إلى بطاقة SD."</string>
<string name="permgrouplab_accessibilityFeatures" msgid="7919025602283593907">"ميزات إمكانية الوصول"</string>
<string name="permgroupdesc_accessibilityFeatures" msgid="4205196881678144335">"الميزات التي يمكن للتقنية المساعدة طلبها"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"استرداد محتوى Ø§Ù„Ù†Ø§ÙØ°Ø©"</string>
@@ -252,26 +257,26 @@
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"للسماح للتطبيق بإزالة اختصارات من الشاشة الرئيسية بدون تدخل المستخدم."</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"إعادة توجيه المكالمات الصادرة"</string>
<string name="permdesc_processOutgoingCalls" msgid="5331318931937402040">"للسماح للتطبيق بمعالجة المكالمات الصادرة وتغيير الرقم المطلوب. يتيح هذا الإذن للتطبيق مراقبة المكالمات الصادرة أو إعادة توجيهها أو منعها."</string>
- <string name="permlab_receiveSms" msgid="8673471768947895082">"تلقي رسائل نصية (رسائل قصيرة SMS)"</string>
- <string name="permdesc_receiveSms" msgid="6424387754228766939">"للسماح للتطبيق بتلقي ومعالجة الرسائل القصيرة SMS. وهذا يعني أنه يمكن للتطبيق مراقبة الرسائل التي يتم إرسالها إلى جهازك أو حذÙها بدون عرضها لك."</string>
+ <string name="permlab_receiveSms" msgid="8673471768947895082">"â€ØªÙ„قي رسائل نصية (رسائل قصيرة SMS)"</string>
+ <string name="permdesc_receiveSms" msgid="6424387754228766939">"â€Ù„لسماح للتطبيق بتلقي ومعالجة الرسائل القصيرة SMS. وهذا يعني أنه يمكن للتطبيق مراقبة الرسائل التي يتم إرسالها إلى جهازك أو حذÙها بدون عرضها لك."</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"تلقي رسائل نصية (رسائل وسائط متعددة)"</string>
<string name="permdesc_receiveMms" msgid="533019437263212260">"للسماح للتطبيق بتلقي ومعالجة رسائل الوسائط المتعددة. وهذا يعني أنه يمكن للتطبيق مراقبة الرسائل التي يتم إرسالها لجهازك أو حذÙها بدون عرضها لك."</string>
<string name="permlab_receiveEmergencyBroadcast" msgid="1803477660846288089">"تلقي بث الطوارئ"</string>
<string name="permdesc_receiveEmergencyBroadcast" msgid="848524070262431974">"للسماح للتطبيق بتلقي رسائل بث الطوارئ ومعالجتها. لا ÙŠØªÙˆÙØ± هذا الإذن سوى لتطبيقات النظام."</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"قراءة رسائل بث الخلية"</string>
- <string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"السماح للتطبيق بقراءة رسائل بث الخلية التي يتلقاها هذا الجهاز. يتم تسليم تنبيهات بث الخلية ÙÙŠ بعض المواقع لتحذيرك من حالات طارئة. يمكن أن تتداخل التطبيقات الضارة مع أداء أو تشغيل الجهاز عندما يتم تلقي بث خلية طارئ."</string>
- <string name="permlab_sendSms" msgid="5600830612147671529">"إرسال رسائل قصيرة SMS"</string>
- <string name="permdesc_sendSms" msgid="7094729298204937667">"للسماح للتطبيق بإرسال رسائل قصيرة SMS. وقد يؤدي هذا إلى تحمل رسوم غير متوقعة. وقد تكلÙÙƒ التطبيقات الضارة أموالاً من خلال إرسال رسائل بدون مواÙقة منك."</string>
+ <string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"السماح للتطبيق بقراءة رسائل بث الخلية التي يتلقاها هذا الجهاز. يتم تسليم اشعارات بث الخلية ÙÙŠ بعض المواقع لتحذيرك من حالات طارئة. يمكن أن تتداخل التطبيقات الضارة مع أداء أو تشغيل الجهاز عندما يتم تلقي بث خلية طارئ."</string>
+ <string name="permlab_sendSms" msgid="5600830612147671529">"â€Ø¥Ø±Ø³Ø§Ù„ رسائل قصيرة SMS"</string>
+ <string name="permdesc_sendSms" msgid="7094729298204937667">"â€Ù„لسماح للتطبيق بإرسال رسائل قصيرة SMS. وقد يؤدي هذا إلى تحمل رسوم غير متوقعة. وقد تكلÙÙƒ التطبيقات الضارة أموالاً من خلال إرسال رسائل بدون مواÙقة منك."</string>
<string name="permlab_sendRespondViaMessageRequest" msgid="8713889105305943200">"إرسال أحداث يتم الرد عليها عبر رسالة"</string>
<string name="permdesc_sendRespondViaMessageRequest" msgid="7107648548468778734">"السماح للتطبيق بإرسال طلبات إلى تطبيقات المراسلة الأخرى للتعامل مع الأحداث التي يتم الرد عليها عبر الرسائل ÙÙŠ المكالمات الواردة."</string>
- <string name="permlab_readSms" msgid="8745086572213270480">"قراءة الرسائل النصية (الرسائل القصيرة SMS أو رسائل الوسائط المتعددة)"</string>
- <string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"للسماح للتطبيق بقراءة الرسائل القصيرة SMS المخزنة على الجهاز اللوحي أو على بطاقة SIM. ويتيح هذا للتطبيق قراءة جميع الرسائل القصيرة SMS، بغض النظر عن المحتوى أو مدى السرية."</string>
- <string name="permdesc_readSms" product="default" msgid="3695967533457240550">"للسماح للتطبيق بقراءة الرسائل القصيرة SMS المخزنة على هاتÙÙƒ أو على بطاقة SIM. ويتيح هذا للتطبيق قراءة جميع الرسائل القصيرة SMSØŒ بغض النظر عن المحتوى أو مدى السرية."</string>
- <string name="permlab_writeSms" msgid="3216950472636214774">"تعديل الرسائل النصية (الرسائل القصيرة SMS أو رسائل الوسائط المتعددة)"</string>
- <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"للسماح للتطبيق بالكتابة إلى الرسائل القصيرة SMS المخزّنة على الجهاز اللوحي أو بطاقة SIM. قد تحذ٠التطبيقات الضارة رسائلك."</string>
- <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"للسماح للتطبيق بالكتابة إلى الرسائل القصيرة SMS المخزّنة على الهات٠أو بطاقة SIM. قد تحذ٠التطبيقات الضارة رسائلك."</string>
- <string name="permlab_receiveWapPush" msgid="5991398711936590410">"تلقي رسائل نصية (WAP)"</string>
- <string name="permdesc_receiveWapPush" msgid="748232190220583385">"للسماح للتطبيق بتلقي رسائل WAP ومعالجتها. ويتضمن هذا الإذن إمكانية مراقبة الرسائل التي يتم إرسالها إليك أو حذÙها بدون عرضها لك."</string>
+ <string name="permlab_readSms" msgid="8745086572213270480">"â€Ù‚راءة الرسائل النصية (الرسائل القصيرة SMS أو رسائل الوسائط المتعددة)"</string>
+ <string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"â€Ù„لسماح للتطبيق بقراءة الرسائل القصيرة SMS المخزنة على الجهاز اللوحي أو على بطاقة SIM. ويتيح هذا للتطبيق قراءة جميع الرسائل القصيرة SMSØŒ بغض النظر عن المحتوى أو مدى السرية."</string>
+ <string name="permdesc_readSms" product="default" msgid="3695967533457240550">"â€Ù„لسماح للتطبيق بقراءة الرسائل القصيرة SMS المخزنة على هاتÙÙƒ أو على بطاقة SIM. ويتيح هذا للتطبيق قراءة جميع الرسائل القصيرة SMSØŒ بغض النظر عن المحتوى أو مدى السرية."</string>
+ <string name="permlab_writeSms" msgid="3216950472636214774">"â€ØªØ¹Ø¯ÙŠÙ„ الرسائل النصية (الرسائل القصيرة SMS أو رسائل الوسائط المتعددة)"</string>
+ <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"â€Ù„لسماح للتطبيق بالكتابة إلى الرسائل القصيرة SMS المخزّنة على الجهاز اللوحي أو بطاقة SIM. قد تحذ٠التطبيقات الضارة رسائلك."</string>
+ <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"â€Ù„لسماح للتطبيق بالكتابة إلى الرسائل القصيرة SMS المخزّنة على الهات٠أو بطاقة SIM. قد تحذ٠التطبيقات الضارة رسائلك."</string>
+ <string name="permlab_receiveWapPush" msgid="5991398711936590410">"â€ØªÙ„قي رسائل نصية (WAP)"</string>
+ <string name="permdesc_receiveWapPush" msgid="748232190220583385">"â€Ù„لسماح للتطبيق بتلقي رسائل WAP ومعالجتها. ويتضمن هذا الإذن إمكانية مراقبة الرسائل التي يتم إرسالها إليك أو حذÙها بدون عرضها لك."</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"استرداد التطبيقات التي قيد التشغيل"</string>
<string name="permdesc_getTasks" msgid="7454215995847658102">"للسماح للتطبيق باسترداد معلومات حول المهام التي يجري تشغيلها حاليًا والتي تم تشغيلها مؤخرًا. وقد يسمح هذا للتطبيق باكتشا٠معلومات حول التطبيقات المستخدمة على الجهاز."</string>
<string name="permlab_interactAcrossUsers" msgid="7114255281944211682">"التعامل بين المستخدمين"</string>
@@ -326,10 +331,10 @@
<string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"للسماح للتطبيق بمراقبة كيÙية بدء النظام للأنشطة والتحكم Ùيها. قد ØªÙØ¹Ø±Ùّض التطبيقات الضارة النظام للضرر بشكل كامل. لن تكون هناك حاجة لهذا الإذن سوى للتطوير Ùقط، وليس للاستخدام العادي على الإطلاق."</string>
<string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"إرسال بث الحزمة الذي تمت إزالته"</string>
<string name="permdesc_broadcastPackageRemoved" msgid="6621901216207931089">"للسماح للتطبيق ببث تنبيه ÙŠÙيد بإزالة حزمة أحد التطبيقات. قد تستخدم التطبيقات الضارة هذا لإنهاء أية تطبيقات أخرى قيد التشغيل."</string>
- <string name="permlab_broadcastSmsReceived" msgid="5689095009030336593">"إرسال بث SMS مستلم"</string>
- <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"للسماح للتطبيق ببث إشعار باستلام رسالة قصيرة SMS. قد تستخدم التطبيقات الضارة هذا لتزيي٠الرسائل القصيرة SMS الواردة."</string>
- <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"إرسال بث WAP-PUSH المستلم"</string>
- <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"للسماح للتطبيق ببث إشعار باستلام رسالة WAP PUSH. يمكن أن تستخدم التطبيقات الضارة هذا لتزي٠استلام رسالة وسائط متعددة أو لاستبدال محتوى أي ØµÙØ­Ø© ويب بمتغيرات ضارة بشكل غير ملحوظ."</string>
+ <string name="permlab_broadcastSmsReceived" msgid="5689095009030336593">"â€Ø¥Ø±Ø³Ø§Ù„ بث SMS مستلم"</string>
+ <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"â€Ù„لسماح للتطبيق ببث إشعار باستلام رسالة قصيرة SMS. قد تستخدم التطبيقات الضارة هذا لتزيي٠الرسائل القصيرة SMS الواردة."</string>
+ <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"â€Ø¥Ø±Ø³Ø§Ù„ بث WAP-PUSH المستلم"</string>
+ <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"â€Ù„لسماح للتطبيق ببث إشعار باستلام رسالة WAP PUSH. يمكن أن تستخدم التطبيقات الضارة هذا لتزي٠استلام رسالة وسائط متعددة أو لاستبدال محتوى أي ØµÙØ­Ø© ويب بمتغيرات ضارة بشكل غير ملحوظ."</string>
<string name="permlab_setProcessLimit" msgid="2451873664363662666">"تحديد عدد العمليات قيد التشغيل"</string>
<string name="permdesc_setProcessLimit" msgid="7318061314040879542">"للسماح للتطبيق بالتحكم ÙÙŠ الحد الأقصى لعدد العمليات التي سيتم تشغيلها. غير مطلوب على الإطلاق للتطبيقات العادية."</string>
<string name="permlab_setAlwaysFinish" msgid="550958507798796965">"ÙØ±Ø¶ إغلاق تطبيقات الخلÙية"</string>
@@ -353,7 +358,7 @@
<string name="permlab_setAnimationScale" msgid="2805103241153907174">"تعديل سرعة الرسوم المتحركة العمومية"</string>
<string name="permdesc_setAnimationScale" msgid="7690063428924343571">"للسماح للتطبيق بتغيير سرعة الرسوم المتحركة العمومية (رسوم متحركة أسرع أو أبطأ) ÙÙŠ أي وقت."</string>
<string name="permlab_manageAppTokens" msgid="1286505717050121370">"إدارة الرموز المميزة للتطبيقات"</string>
- <string name="permdesc_manageAppTokens" msgid="8043431713014395671">"للسماح للتطبيق بإنشاء وإدارة رموزه الخاصة، وتجاوز ترتيب Z العادي. لن تكون هناك حاجة إليه مطلقًا مع التطبيقات العادية."</string>
+ <string name="permdesc_manageAppTokens" msgid="8043431713014395671">"â€Ù„لسماح للتطبيق بإنشاء وإدارة رموزه الخاصة، وتجاوز ترتيب Z العادي. لن تكون هناك حاجة إليه مطلقًا مع التطبيقات العادية."</string>
<string name="permlab_freezeScreen" msgid="4708181184441880175">"تجميد الشاشة"</string>
<string name="permdesc_freezeScreen" msgid="8558923789222670064">"للسماح للتطبيق بتجميد الشاشة مؤقتًا لإجراء انتقال بملء الشاشة."</string>
<string name="permlab_injectEvents" msgid="1378746584023586600">"Ù…ÙØ§ØªÙŠØ­ الضغط وأزرار التحكم"</string>
@@ -369,12 +374,12 @@
<string name="permdesc_bindPrintService" msgid="7960067623209111135">"للسماح للمالك بالالتزام بواجهة المستوى العلوي لخدمة الطباعة. لن تكون هناك حاجة إليه مطلقًا مع التطبيقات العادية."</string>
<string name="permlab_bindPrintSpoolerService" msgid="6807762783744125954">"الالتزام بخدمة التخزين المؤقت للطباعة"</string>
<string name="permdesc_bindPrintSpoolerService" msgid="3680552285933318372">"للسماح للمالك بالالتزام بواجهة المستوى العلوي لخدمة التخزين المؤقت للطباعة. لن تكون هناك حاجة إليه مطلقًا مع التطبيقات العادية."</string>
- <string name="permlab_bindNfcService" msgid="2752731300419410724">"الربط بخدمة NFC"</string>
- <string name="permdesc_bindNfcService" msgid="6120647629174066862">"للسماح لحامل البطاقة بالربط بالتطبيقات التي تحاكي بطاقات NFC. لا يتوجب استخدامه على الإطلاق للتطبيقات العادية."</string>
+ <string name="permlab_bindNfcService" msgid="2752731300419410724">"â€Ø§Ù„ربط بخدمة NFC"</string>
+ <string name="permdesc_bindNfcService" msgid="6120647629174066862">"â€Ù„لسماح لحامل البطاقة بالربط بالتطبيقات التي تحاكي بطاقات NFC. لا يتوجب استخدامه على الإطلاق للتطبيقات العادية."</string>
<string name="permlab_bindTextService" msgid="7358378401915287938">"الالتزام بخدمة إدخال النصوص"</string>
- <string name="permdesc_bindTextService" msgid="8151968910973998670">"للسماح للمالك بالالتزام بواجهة المستوى العلوي لخدمة إدخال النصوص (على سبيل المثال، SpellCheckerService). لن تكون هناك حاجة إليه مطلقًا مع التطبيقات العادية."</string>
- <string name="permlab_bindVpnService" msgid="4708596021161473255">"الالتزام بخدمة VPN"</string>
- <string name="permdesc_bindVpnService" msgid="2067845564581693905">"للسماح للمالك بالالتزام بواجهة المستوى العلوي لخدمة الشبكة الظاهرية الخاصة (VPN). لن تكون هناك حاجة إليه مطلقًا مع التطبيقات العادية."</string>
+ <string name="permdesc_bindTextService" msgid="8151968910973998670">"â€Ù„لسماح للمالك بالالتزام بواجهة المستوى العلوي لخدمة إدخال النصوص (على سبيل المثال، SpellCheckerService). لن تكون هناك حاجة إليه مطلقًا مع التطبيقات العادية."</string>
+ <string name="permlab_bindVpnService" msgid="4708596021161473255">"â€Ø§Ù„التزام بخدمة VPN"</string>
+ <string name="permdesc_bindVpnService" msgid="2067845564581693905">"â€Ù„لسماح للمالك بالالتزام بواجهة المستوى العلوي لخدمة الشبكة الظاهرية الخاصة (VPN). لن تكون هناك حاجة إليه مطلقًا مع التطبيقات العادية."</string>
<string name="permlab_bindWallpaper" msgid="8716400279937856462">"الالتزام بخلÙية ما"</string>
<string name="permdesc_bindWallpaper" msgid="7108428692595491668">"للسماح للمالك بالالتزام بواجهة المستوى العلوي للخلÙية. لن تكون هناك حاجة إليه مطلقًا مع التطبيقات العادية."</string>
<string name="permlab_bindRemoteViews" msgid="5697987759897367099">"الالتزام بخدمة أداة"</string>
@@ -389,13 +394,13 @@
<string name="permdesc_setPointerSpeed" msgid="6866563234274104233">"للسماح للتطبيق بتغيير سرعة مؤشر الماوس أو لوحة التتبع ÙÙŠ أي وقت. لن تكون هناك حاجة إليه مطلقًا مع التطبيقات العادية."</string>
<string name="permlab_setKeyboardLayout" msgid="4778731703600909340">"تغيير تنسيق لوحة Ù…ÙØ§ØªÙŠØ­"</string>
<string name="permdesc_setKeyboardLayout" msgid="8480016771134175879">"للسماح للتطبيق بتغيير تنسيق لوحة Ø§Ù„Ù…ÙØ§ØªÙŠØ­. لن تكون هناك حاجة إليه مطلقًا مع التطبيقات العادية."</string>
- <string name="permlab_signalPersistentProcesses" msgid="4539002991947376659">"إرسال إشارات Linux للتطبيقات"</string>
+ <string name="permlab_signalPersistentProcesses" msgid="4539002991947376659">"â€Ø¥Ø±Ø³Ø§Ù„ إشارات Linux للتطبيقات"</string>
<string name="permdesc_signalPersistentProcesses" msgid="4896992079182649141">"للسماح للتطبيق بطلب إرسال الإشارة المزوّدة لجميع العمليات المستمرة."</string>
<string name="permlab_persistentActivity" msgid="8841113627955563938">"تشغيل التطبيق دائمًا"</string>
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"للسماح للتطبيق بجعل أجزاء منه ثابتة ÙÙŠ الذاكرة. وقد يؤدي هذا إلى تقييد الذاكرة المتاحة للتطبيقات الأخرى مما يؤدي إلى حدوث بطء ÙÙŠ الجهاز اللوحي."</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"للسماح للتطبيق بجعل أجزاء منه ثابتة ÙÙŠ الذاكرة. وقد يؤدي هذا إلى تقييد الذاكرة المتاحة للتطبيقات الأخرى مما يؤدي إلى حدوث بطء ÙÙŠ الهاتÙ."</string>
<string name="permlab_deletePackages" msgid="184385129537705938">"حذ٠التطبيقات"</string>
- <string name="permdesc_deletePackages" msgid="7411480275167205081">"للسماح للتطبيق بحذ٠حزم Android. يمكن أن تستخدم التطبيقات الضارة ذلك لحذ٠التطبيقات المهمة."</string>
+ <string name="permdesc_deletePackages" msgid="7411480275167205081">"â€Ù„لسماح للتطبيق بحذ٠حزم Android. يمكن أن تستخدم التطبيقات الضارة ذلك لحذ٠التطبيقات المهمة."</string>
<string name="permlab_clearAppUserData" msgid="274109191845842756">"حذ٠بيانات التطبيقات الأخرى"</string>
<string name="permdesc_clearAppUserData" msgid="4625323684125459488">"للسماح للتطبيق بمحو بيانات المستخدم."</string>
<string name="permlab_deleteCacheFiles" msgid="3128665571837408675">"حذ٠ذاكرات التخزين المؤقت للتطبيقات الأخرى"</string>
@@ -403,7 +408,7 @@
<string name="permlab_getPackageSize" msgid="7472921768357981986">"قياس مساحة تخزين التطبيق"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"للسماح للتطبيق باسترداد Ø´ÙØ±ØªÙ‡ وبياناته وأحجام ذاكرات التخزين المؤقت"</string>
<string name="permlab_installPackages" msgid="2199128482820306924">"تثبيت التطبيقات مباشرة"</string>
- <string name="permdesc_installPackages" msgid="5628530972548071284">"للسماح للتطبيق بتثبيت حزم Android الجديدة أو المحدّثة. يمكن أن تستخدم التطبيقات الضارة ذلك Ù„Ø¥Ø¶Ø§ÙØ© تطبيقات جديدة ذات أذونات قوية على نحو عشوائي."</string>
+ <string name="permdesc_installPackages" msgid="5628530972548071284">"â€Ù„لسماح للتطبيق بتثبيت حزم Android الجديدة أو المحدّثة. يمكن أن تستخدم التطبيقات الضارة ذلك Ù„Ø¥Ø¶Ø§ÙØ© تطبيقات جديدة ذات أذونات قوية على نحو عشوائي."</string>
<string name="permlab_clearAppCache" msgid="7487279391723526815">"حذ٠جميع بيانات ذاكرة التخزين المؤقت للتطبيق"</string>
<string name="permdesc_clearAppCache" product="tablet" msgid="8974640871945434565">"للسماح للتطبيق Ø¨ØªÙØ±ÙŠØº سعة تخزين الجهاز اللوحي من خلال Ø­Ø°Ù Ø§Ù„Ù…Ù„ÙØ§Øª من أدلة ذاكرة التخزين المؤقت للتطبيقات الأخرى. قد يتسبب هذا ÙÙŠ تشغيل التطبيقات الأخرى بشكل أكثر بطئًا حيث يلزمها إعادة استرداد بياناتها."</string>
<string name="permdesc_clearAppCache" product="default" msgid="2459441021956436779">"للسماح للتطبيق Ø¨ØªÙØ±ÙŠØº مساحة تخزين الهات٠من خلال Ø­Ø°Ù Ø§Ù„Ù…Ù„ÙØ§Øª من أدلة ذاكرة التخزين المؤقت للتطبيقات الأخرى. قد يتسبب هذا ÙÙŠ تشغيل التطبيقات الأخرى بشكل أكثر بطئًا حيث يلزمها إعادة استرداد بياناتها."</string>
@@ -415,9 +420,9 @@
<string name="permlab_anyCodecForPlayback" msgid="715805555823881818">"استخدام أي برنامج ÙÙƒ تشÙير وسائط من أجل التشغيل"</string>
<string name="permdesc_anyCodecForPlayback" msgid="8283912488433189010">"السماح للتطبيق باستخدام أي برنامج ÙÙƒ تشÙير وسائط مثبت Ù„ÙÙƒ التشÙير من أجل التشغيل."</string>
<string name="permlab_manageCaCertificates" msgid="1678391896786882014">"إدارة بيانات الاعتماد الموثوقة"</string>
- <string name="permdesc_manageCaCertificates" msgid="4015644047196937014">"السماح للتطبيق بتثبيت شهادات CA وإلغاء تثبيتها باعتبارها بيانات اعتماد محل ثقة."</string>
+ <string name="permdesc_manageCaCertificates" msgid="4015644047196937014">"â€Ø§Ù„سماح للتطبيق بتثبيت شهادات CA وإلغاء تثبيتها باعتبارها بيانات اعتماد محل ثقة."</string>
<string name="permlab_diagnostic" msgid="8076743953908000342">"قراءة/كتابة إلى الموارد المملوكة بواسطة التشخيص"</string>
- <string name="permdesc_diagnostic" msgid="6608295692002452283">"للسماح للتطبيق بالقراءة والكتابة إلى أي مورد مملوك بواسطة مجموعة التشخيصات؛ على سبيل المثال، Ø§Ù„Ù…Ù„ÙØ§Øª ÙÙŠ /dev. من المحتمل أن يؤثر ذلك ÙÙŠ استقرار النظام وأمانه. يجب ألا يستخدم ذلك سوى للتشخيصات الخاصة بالنظام من Ù‚ÙØ¨Ù„ المصنÙّع أو المشغÙّل."</string>
+ <string name="permdesc_diagnostic" msgid="6608295692002452283">"â€Ù„لسماح للتطبيق بالقراءة والكتابة إلى أي مورد مملوك بواسطة مجموعة التشخيصات؛ على سبيل المثال، Ø§Ù„Ù…Ù„ÙØ§Øª ÙÙŠ /dev. من المحتمل أن يؤثر ذلك ÙÙŠ استقرار النظام وأمانه. يجب ألا يستخدم ذلك سوى للتشخيصات الخاصة بالنظام من Ù‚ÙØ¨Ù„ المصنÙّع أو المشغÙّل."</string>
<string name="permlab_changeComponentState" msgid="6335576775711095931">"تمكين مكونات التطبيق أو تعطيلها"</string>
<string name="permdesc_changeComponentState" product="tablet" msgid="8887435740982237294">"للسماح للتطبيق بتغيير ما إذا كان سيتم تمكين مكون لتطبيق آخر أم لا. يمكن أن تستخدم التطبيقات الضارة ذلك لتعطيل قدرات الجهاز اللوحي المهمة. يجب توخي الحذر عند استخدام هذا الإذن، وذلك لأنه من الممكن أن يؤدي ذلك إلى جعل حالة مكونات التطبيق غير قابلة للاستخدام أو غير متناسقة أو غير مستقرة."</string>
<string name="permdesc_changeComponentState" product="default" msgid="1827232484416505615">"للسماح للتطبيق بتغيير ما إذا كان سيتم تمكين مكون لتطبيق آخر أم لا. يمكن أن تستخدم التطبيقات الضارة ذلك لتعطيل قدرات الهات٠المهمة. يجب توخي الحذر عند استخدام هذا الإذن، وذلك لأنه من الممكن أن يؤدي ذلك إلى جعل حالة مكونات التطبيق غير قابلة للاستخدام أو غير متناسقة أو غير مستقرة."</string>
@@ -429,8 +434,8 @@
<string name="permdesc_writeSettings" msgid="7775723441558907181">"للسماح للتطبيق بتعديل بيانات إعدادات النظام. يمكن أن تتل٠التطبيقات الضارة تهيئة نظامك."</string>
<string name="permlab_writeSecureSettings" msgid="204676251876718288">"تعديل إعدادات النظام الآمنة"</string>
<string name="permdesc_writeSecureSettings" msgid="8159535613020137391">"للسماح للتطبيق بتعديل بيانات الإعدادات الآمنة للنظام. لن تكون هناك حاجة إليه مطلقًا مع التطبيقات العادية."</string>
- <string name="permlab_writeGservices" msgid="2149426664226152185">"تعديل خريطة خدمات Google"</string>
- <string name="permdesc_writeGservices" msgid="1287309437638380229">"للسماح للتطبيق بتعديل خريطة خدمات Google. ليس للاستخدام بواسطة التطبيقات العادية."</string>
+ <string name="permlab_writeGservices" msgid="2149426664226152185">"â€ØªØ¹Ø¯ÙŠÙ„ خريطة خدمات Google"</string>
+ <string name="permdesc_writeGservices" msgid="1287309437638380229">"â€Ù„لسماح للتطبيق بتعديل خريطة خدمات Google. ليس للاستخدام بواسطة التطبيقات العادية."</string>
<string name="permlab_receiveBootCompleted" msgid="5312965565987800025">"العمل عند بدء التشغيل"</string>
<string name="permdesc_receiveBootCompleted" product="tablet" msgid="7390304664116880704">"للسماح للتطبيق ببدء تشغيل Ù†ÙØ³Ù‡ عقب انتهاء النظام من التشغيل. قد يؤدي ذلك إلى استغراق المزيد من الوقت عند بدء الجهاز اللوحي والسماح للتطبيق بإبطاء الأداء الإجمالي للجهاز اللوحي من خلال تشغيله دائمًا."</string>
<string name="permdesc_receiveBootCompleted" product="default" msgid="513950589102617504">"للسماح للتطبيق ببدء تشغيل Ù†ÙØ³Ù‡ عقب انتهاء النظام من التشغيل. قد يؤدي ذلك إلى استغراق المزيد من الوقت عن بدء الهات٠والسماح للتطبيق بإبطاء الأداء الإجمالي للهات٠حيث يتم تشغيله دائمًا."</string>
@@ -464,23 +469,25 @@
<string name="permdesc_writeCalendar" product="tablet" msgid="6679035520113668528">"للسماح للتطبيق Ø¨Ø¥Ø¶Ø§ÙØ© أو إزالة أو تغيير الأحداث التي يمكنك تعديلها على جهازك اللوحي، بما ÙÙŠ ذلك أحداث الأصدقاء أو زملاء العمل. وقد يتيح هذا للتطبيق إرسال رسائل يبدو أنها واردة من أصحاب التقويم أو تعديل الأحداث بدون Ù…Ø¹Ø±ÙØ© المالكين."</string>
<string name="permdesc_writeCalendar" product="default" msgid="2324469496327249376">"للسماح للتطبيق Ø¨Ø¥Ø¶Ø§ÙØ© أو إزالة أو تغيير الأحداث التي يمكنك تعديلها على هاتÙك، بما ÙÙŠ ذلك أحداث الأصدقاء أو زملاء العمل. وقد يتيح هذا للتطبيق إرسال رسائل يبدو أنها واردة من أصحاب التقويم أو تعديل الأحداث بدون Ù…Ø¹Ø±ÙØ© المالكين."</string>
<string name="permlab_accessMockLocation" msgid="8688334974036823330">"مصادر مواقع وهمية للاختبار"</string>
- <string name="permdesc_accessMockLocation" msgid="5808711039482051824">"لإنشاء مصادر مواقع Ø²Ø§Ø¦ÙØ© للاختبار أو تثبيت Ù…ÙˆÙØ± مواقع جديد. يتيح هذا للتطبيق إلغاء الموقع Ùˆ/أو الحالة التي تعرضها مصادر المواقع الأخرى مثل GPS أو Ù…ÙˆÙØ±ÙŠ Ø§Ù„Ù…ÙˆØ§Ù‚Ø¹."</string>
+ <string name="permdesc_accessMockLocation" msgid="5808711039482051824">"â€Ù„إنشاء مصادر مواقع Ø²Ø§Ø¦ÙØ© للاختبار أو تثبيت Ù…ÙˆÙØ± مواقع جديد. يتيح هذا للتطبيق إلغاء الموقع Ùˆ/أو الحالة التي تعرضها مصادر المواقع الأخرى مثل GPS أو Ù…ÙˆÙØ±ÙŠ Ø§Ù„Ù…ÙˆØ§Ù‚Ø¹."</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"الدخول إلى المزيد من أوامر Ù…ÙˆÙØ± الموقع"</string>
- <string name="permdesc_accessLocationExtraCommands" msgid="5945166642335800763">"للسماح للتطبيق بالدخول إلى المزيد من أوامر Ù…ÙˆÙØ± خدمة الموقع. وقد يتيح هذا للتطبيق التدخل ÙÙŠ عمل GPS أو مصادر المواقع الأخرى."</string>
+ <string name="permdesc_accessLocationExtraCommands" msgid="5945166642335800763">"â€Ù„لسماح للتطبيق بالدخول إلى المزيد من أوامر Ù…ÙˆÙØ± خدمة الموقع. وقد يتيح هذا للتطبيق التدخل ÙÙŠ عمل GPS أو مصادر المواقع الأخرى."</string>
<string name="permlab_installLocationProvider" msgid="6578101199825193873">"إذن لتثبيت Ù…ÙˆÙØ± خدمة موقع"</string>
- <string name="permdesc_installLocationProvider" msgid="9066146120470591509">"لإنشاء مصادر مواقع Ø²Ø§Ø¦ÙØ© للاختبار أو تثبيت Ù…ÙˆÙØ± مواقع جديد. يتيح هذا للتطبيق إلغاء الموقع Ùˆ/أو الحالة التي تعرضها مصادر المواقع الأخرى مثل GPS أو Ù…ÙˆÙØ±ÙŠ Ø§Ù„Ù…ÙˆØ§Ù‚Ø¹."</string>
+ <string name="permdesc_installLocationProvider" msgid="9066146120470591509">"â€Ù„إنشاء مصادر مواقع Ø²Ø§Ø¦ÙØ© للاختبار أو تثبيت Ù…ÙˆÙØ± مواقع جديد. يتيح هذا للتطبيق إلغاء الموقع Ùˆ/أو الحالة التي تعرضها مصادر المواقع الأخرى مثل GPS أو Ù…ÙˆÙØ±ÙŠ Ø§Ù„Ù…ÙˆØ§Ù‚Ø¹."</string>
<string name="permlab_accessFineLocation" msgid="1191898061965273372">"الموقع الدقيق (مستند إلى نظام تحديد المواقع العالمي والشبكة)"</string>
- <string name="permdesc_accessFineLocation" msgid="5295047563564981250">"للسماح للتطبيق بتحديد موقعك بدقة وهذا باستخدام نظام تحديد المواقع العالمي (GPS) أو مصادر المواقع التي تستخدم الشبكات مثل أبراج الجوال أو تقنية Wi-Fi. يتعين ØªÙˆÙØ± خدمات المواقع هذه وتشغيلها على جهازك للتطبيق كي يستخدمها. وقد تستخدم التطبيقات هذا لتحديد موقعك وقد تستهلك مزيدًا من طاقة البطارية."</string>
+ <string name="permdesc_accessFineLocation" msgid="5295047563564981250">"â€Ù„لسماح للتطبيق بتحديد موقعك بدقة وهذا باستخدام نظام تحديد المواقع العالمي (GPS) أو مصادر المواقع التي تستخدم الشبكات مثل أبراج الجوال أو تقنية Wi-Fi. يتعين ØªÙˆÙØ± خدمات المواقع هذه وتشغيلها على جهازك للتطبيق كي يستخدمها. وقد تستخدم التطبيقات هذا لتحديد موقعك وقد تستهلك مزيدًا من طاقة البطارية."</string>
<string name="permlab_accessCoarseLocation" msgid="4887895362354239628">"الموقع التقريبي (مستند إلى الشبكة)"</string>
- <string name="permdesc_accessCoarseLocation" msgid="2538200184373302295">"للسماح للتطبيق بتحديد موقعك التقريبي الذي يستمد من خدمات الموقع باستخدام مصادر المواقع التي تستخدم الشبكات مثل أبراج الجوال وتقنية Wi-Fi. يتعين ØªÙˆÙØ± خدمات المواقع هذه وتشغيلها على جهازك للتطبيق كي يستخدمها. وقد تستخدم التطبيقات هذا لتحديد موقعك التقريبي."</string>
- <string name="permlab_accessSurfaceFlinger" msgid="2363969641792388947">"الدخول إلى SurfaceFlinger"</string>
- <string name="permdesc_accessSurfaceFlinger" msgid="1041619516733293551">"للسماح للتطبيق باستخدام ميزات SurfaceFlinger ذات المستوى Ø§Ù„Ù…Ù†Ø®ÙØ¶."</string>
+ <string name="permdesc_accessCoarseLocation" msgid="2538200184373302295">"â€Ù„لسماح للتطبيق بتحديد موقعك التقريبي الذي يستمد من خدمات الموقع باستخدام مصادر المواقع التي تستخدم الشبكات مثل أبراج الجوال وتقنية Wi-Fi. يتعين ØªÙˆÙØ± خدمات المواقع هذه وتشغيلها على جهازك للتطبيق كي يستخدمها. وقد تستخدم التطبيقات هذا لتحديد موقعك التقريبي."</string>
+ <string name="permlab_accessSurfaceFlinger" msgid="2363969641792388947">"â€Ø§Ù„دخول إلى SurfaceFlinger"</string>
+ <string name="permdesc_accessSurfaceFlinger" msgid="1041619516733293551">"â€Ù„لسماح للتطبيق باستخدام ميزات SurfaceFlinger ذات المستوى Ø§Ù„Ù…Ù†Ø®ÙØ¶."</string>
<string name="permlab_readFrameBuffer" msgid="6690504248178498136">"قراءة المخزن المؤقت للإطارات"</string>
<string name="permdesc_readFrameBuffer" msgid="4937405521809454680">"للسماح للتطبيق بقراءة محتوى المخزن المؤقت للإطارات."</string>
- <string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"تهيئة شاشات Wi-Fi"</string>
- <string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"للسماح للتطبيق بتهيئة شاشات Wi-Fi والاتصال بها."</string>
- <string name="permlab_controlWifiDisplay" msgid="393641276723695496">"التحكم ÙÙŠ شاشات Wi-Fi"</string>
- <string name="permdesc_controlWifiDisplay" msgid="4543912292681826986">"للسماح للتطبيق بالتحكم ÙÙŠ الميزات ذات المستوى Ø§Ù„Ù…Ù†Ø®ÙØ¶ ÙÙŠ شاشات Wi-Fi."</string>
+ <string name="permlab_accessInputFlinger" msgid="5348635270689553857">"â€Ø§Ù„دخول إلى InputFlinger"</string>
+ <string name="permdesc_accessInputFlinger" msgid="2104864941201226616">"â€Ù„لسماح للتطبيق باستخدام ميزات InputFlinger ذات المستوى Ø§Ù„Ù…Ù†Ø®ÙØ¶."</string>
+ <string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"â€ØªÙ‡ÙŠØ¦Ø© شاشات Wi-Fi"</string>
+ <string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"â€Ù„لسماح للتطبيق بتهيئة شاشات Wi-Fi والاتصال بها."</string>
+ <string name="permlab_controlWifiDisplay" msgid="393641276723695496">"â€Ø§Ù„تحكم ÙÙŠ شاشات Wi-Fi"</string>
+ <string name="permdesc_controlWifiDisplay" msgid="4543912292681826986">"â€Ù„لسماح للتطبيق بالتحكم ÙÙŠ الميزات ذات المستوى Ø§Ù„Ù…Ù†Ø®ÙØ¶ ÙÙŠ شاشات Wi-Fi."</string>
<string name="permlab_captureAudioOutput" msgid="6857134498402346708">"التقاط إخراج الصوت"</string>
<string name="permdesc_captureAudioOutput" msgid="6210597754212208853">"السماح للتطبيق بالتقاط إخراج الصوت وإعادة توجيهه."</string>
<string name="permlab_captureAudioHotword" msgid="1890553935650349808">"اكتشا٠الكلمة المهمة"</string>
@@ -497,8 +504,8 @@
<string name="permdesc_recordAudio" msgid="4906839301087980680">"للسماح للتطبيق بتسجيل الصوت باستخدام الميكروÙون. ويتيح هذا الإذن للتطبيق تسجيل الصوت ÙÙŠ أي وقت وبدون مواÙقة منك."</string>
<string name="permlab_camera" msgid="3616391919559751192">"التقاط صور ومقاطع Ùيديو"</string>
<string name="permdesc_camera" msgid="8497216524735535009">"للسماح للتطبيق بالتقاط صور ومقاطع Ùيديو من خلال الكاميرا. ويتيح هذا الإذن للتطبيق استخدام الكاميرا ÙÙŠ أي وقت وبدون مواÙقة منك."</string>
- <string name="permlab_cameraDisableTransmitLed" msgid="2651072630501126222">"تعطيل مؤشر LED للإرسال عندما تكون الكاميرا قيد الاستخدام"</string>
- <string name="permdesc_cameraDisableTransmitLed" msgid="4764585465480295341">"للسماح لتطبيق نظام مثبت مسبقًا لتعطيل مؤشر LED لاستخدام الكاميرا."</string>
+ <string name="permlab_cameraDisableTransmitLed" msgid="2651072630501126222">"â€ØªØ¹Ø·ÙŠÙ„ مؤشر LED للإرسال عندما تكون الكاميرا قيد الاستخدام"</string>
+ <string name="permdesc_cameraDisableTransmitLed" msgid="4764585465480295341">"â€Ù„لسماح لتطبيق نظام مثبت مسبقًا لتعطيل مؤشر LED لاستخدام الكاميرا."</string>
<string name="permlab_brick" product="tablet" msgid="2961292205764488304">"تعطيل الجهاز اللوحي نهائيًا"</string>
<string name="permlab_brick" product="default" msgid="8337817093326370537">"تعطيل الهات٠على الدوام"</string>
<string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"للسماح للتطبيق بتعطيل الجهاز اللوحي بالكامل بشكل دائم. هذا خطير للغاية."</string>
@@ -507,11 +514,11 @@
<string name="permlab_reboot" product="default" msgid="2898560872462638242">"ÙØ±Ø¶ إعادة تشغيل الهاتÙ"</string>
<string name="permdesc_reboot" product="tablet" msgid="8172056180063700741">"للسماح للتطبيق Ø¨ÙØ±Ø¶ إعادة تشغيل الجهاز اللوحي."</string>
<string name="permdesc_reboot" product="default" msgid="5326008124289989969">"للسماح للتطبيق Ø¨ÙØ±Ø¶ إعادة تشغيل الهاتÙ."</string>
- <string name="permlab_mount_unmount_filesystems" product="nosdcard" msgid="2927361537942591841">"الدخول إلى نظام Ù…Ù„ÙØ§Øª وحدة تخزين USB"</string>
- <string name="permlab_mount_unmount_filesystems" product="default" msgid="4402305049890953810">"الدخول إلى نظام Ù…Ù„ÙØ§Øª بطاقة SD"</string>
+ <string name="permlab_mount_unmount_filesystems" product="nosdcard" msgid="2927361537942591841">"â€Ø§Ù„دخول إلى نظام Ù…Ù„ÙØ§Øª وحدة تخزين USB"</string>
+ <string name="permlab_mount_unmount_filesystems" product="default" msgid="4402305049890953810">"â€Ø§Ù„دخول إلى نظام Ù…Ù„ÙØ§Øª بطاقة SD"</string>
<string name="permdesc_mount_unmount_filesystems" msgid="1829290701658992347">"للسماح للتطبيق بتحميل أنظمة Ø§Ù„Ù…Ù„ÙØ§Øª وإلغاء تحميلها إلى وحدة التخزين القابلة للإزالة."</string>
- <string name="permlab_mount_format_filesystems" product="nosdcard" msgid="6227819582624904972">"محو وحدة تخزين USB"</string>
- <string name="permlab_mount_format_filesystems" product="default" msgid="262582698639274056">"محو بطاقة SD"</string>
+ <string name="permlab_mount_format_filesystems" product="nosdcard" msgid="6227819582624904972">"â€Ù…حو وحدة تخزين USB"</string>
+ <string name="permlab_mount_format_filesystems" product="default" msgid="262582698639274056">"â€Ù…حو بطاقة SD"</string>
<string name="permdesc_mount_format_filesystems" msgid="8784268246779198627">"للسماح للتطبيق بتنسيق وحدة التخزين القابلة للإزالة."</string>
<string name="permlab_asec_access" msgid="3411338632002193846">"الحصول على معلومات حول وحدة التخزين الداخلية"</string>
<string name="permdesc_asec_access" msgid="3094563844593878548">"للسماح للتطبيق بالحصول على معلومات حول سعة التخزين الداخلية."</string>
@@ -527,19 +534,19 @@
<string name="permdesc_vibrate" msgid="6284989245902300945">"للسماح للتطبيق بالتحكم ÙÙŠ الهزّاز."</string>
<string name="permlab_flashlight" msgid="2155920810121984215">"التحكم ÙÙŠ الضوء الوامض"</string>
<string name="permdesc_flashlight" msgid="6522284794568368310">"للسماح للتطبيق بالتحكم ÙÙŠ الضوء الوامض."</string>
- <string name="permlab_manageUsb" msgid="1113453430645402723">"إدارة Ø§Ù„ØªÙØ¶ÙŠÙ„ات والأذونات لأجهزة USB"</string>
- <string name="permdesc_manageUsb" msgid="7776155430218239833">"للسماح للتطبيق بإدارة Ø§Ù„ØªÙØ¶ÙŠÙ„ات والأذونات لأجهزة USB."</string>
- <string name="permlab_accessMtp" msgid="4953468676795917042">"تنÙيذ بروتوكول MTP"</string>
- <string name="permdesc_accessMtp" msgid="6532961200486791570">"لإتاحة الدخول إلى برنامج تشغيل kernel MTP لتنÙيذ بروتوكول MTP USB."</string>
+ <string name="permlab_manageUsb" msgid="1113453430645402723">"â€Ø¥Ø¯Ø§Ø±Ø© Ø§Ù„ØªÙØ¶ÙŠÙ„ات والأذونات لأجهزة USB"</string>
+ <string name="permdesc_manageUsb" msgid="7776155430218239833">"â€Ù„لسماح للتطبيق بإدارة Ø§Ù„ØªÙØ¶ÙŠÙ„ات والأذونات لأجهزة USB."</string>
+ <string name="permlab_accessMtp" msgid="4953468676795917042">"â€ØªÙ†Ùيذ بروتوكول MTP"</string>
+ <string name="permdesc_accessMtp" msgid="6532961200486791570">"â€Ù„إتاحة الدخول إلى برنامج تشغيل kernel MTP لتنÙيذ بروتوكول MTP USB."</string>
<string name="permlab_hardware_test" msgid="4148290860400659146">"اختبار الأجهزة"</string>
<string name="permdesc_hardware_test" msgid="6597964191208016605">"للسماح للتطبيق بالتحكم ÙÙŠ الأجهزة الطرÙية المتنوعة بغرض اختبار الأجهزة."</string>
<string name="permlab_callPhone" msgid="3925836347681847954">"اتصال مباشر بأرقام الهواتÙ"</string>
<string name="permdesc_callPhone" msgid="3740797576113760827">"للسماح للتطبيق بطلب أرقام هاتÙية بدون تدخل منك. وقد يؤدي ذلك إلى تحمل رسوم غير متوقعة أو إجراء مكالمات غير متوقعة. ومن الجدير بالذكر أن ذلك لا يتيح للتطبيق الاتصال بأرقام الطوارئ. وقد تؤدي التطبيقات الضارة إلى تحملك تكالي٠مالية من خلال إجراء مكالمات بدون مواÙقة منك."</string>
<string name="permlab_callPrivileged" msgid="4198349211108497879">"اتصال مباشر بأي رقم من أرقام الهواتÙ"</string>
<string name="permdesc_callPrivileged" msgid="1689024901509996810">"للسماح للتطبيق بالاتصال بأي رقم Ù‡Ø§ØªÙØŒ بما ÙÙŠ ذلك أرقام الطوارئ، بدون تدخل منك. قد تجري التطبيقات الضارة اتصالات غير ضرورية وغير قانونية بخدمات الطوارئ."</string>
- <string name="permlab_performCdmaProvisioning" product="tablet" msgid="4842576994144604821">"بدء إعداد الجهاز اللوحي CDMA مباشرةً"</string>
- <string name="permlab_performCdmaProvisioning" product="default" msgid="5604848095315421425">"بدء إعداد هات٠CDMA مباشرة"</string>
- <string name="permdesc_performCdmaProvisioning" msgid="1994193538802314186">"للسماح للتطبيق ببدء توÙير CDMA. قد تبدأ التطبيقات الضارة توÙير CDMA بدون الحاجة إلى ذلك."</string>
+ <string name="permlab_performCdmaProvisioning" product="tablet" msgid="4842576994144604821">"â€Ø¨Ø¯Ø¡ إعداد الجهاز اللوحي CDMA مباشرةً"</string>
+ <string name="permlab_performCdmaProvisioning" product="default" msgid="5604848095315421425">"â€Ø¨Ø¯Ø¡ إعداد هات٠CDMA مباشرة"</string>
+ <string name="permdesc_performCdmaProvisioning" msgid="1994193538802314186">"â€Ù„لسماح للتطبيق ببدء توÙير CDMA. قد تبدأ التطبيقات الضارة توÙير CDMA بدون الحاجة إلى ذلك."</string>
<string name="permlab_locationUpdates" msgid="7785408253364335740">"التحكم ÙÙŠ اشعارات تحديث الموقع"</string>
<string name="permdesc_locationUpdates" msgid="1120741557891438876">"للسماح للتطبيق بتمكين/تعطيل إشعارات تحديث الموقع من اللاسلكي. ليس للاستخدام بواسطة التطبيقات العادية."</string>
<string name="permlab_checkinProperties" msgid="7855259461268734914">"الدخول إلى خصائص الإيداع"</string>
@@ -582,7 +589,7 @@
<string name="permdesc_getAccounts" product="tablet" msgid="2741496534769660027">"للسماح للتطبيق بالحصول على قائمة بالحسابات التي يعرÙها الجهاز اللوحي. وقد يتضمن ذلك أية حسابات تم إنشاؤها بواسطة التطبيقات التي ثبتها."</string>
<string name="permdesc_getAccounts" product="default" msgid="3448316822451807382">"للسماح للتطبيق بالحصول على قائمة بالحسابات التي يعرÙها الهاتÙ. وقد يتضمن ذلك أية حسابات تم إنشاؤها بواسطة التطبيقات التي ثبتها."</string>
<string name="permlab_authenticateAccounts" msgid="5265908481172736933">"إنشاء حسابات وتعيين كلمات مرور"</string>
- <string name="permdesc_authenticateAccounts" msgid="5472124296908977260">"للسماح للتطبيق باستخدام إمكانيات مصدÙّق الحساب لـ AccountManagerØŒ بما ÙÙŠ ذلك إنشاء حسابات والحصول على كلمات مرورها وتعينها."</string>
+ <string name="permdesc_authenticateAccounts" msgid="5472124296908977260">"â€Ù„لسماح للتطبيق باستخدام إمكانيات مصدÙّق الحساب لـ AccountManagerØŒ بما ÙÙŠ ذلك إنشاء حسابات والحصول على كلمات مرورها وتعينها."</string>
<string name="permlab_manageAccounts" msgid="4983126304757177305">"Ø¥Ø¶Ø§ÙØ© حسابات أو إزالتها"</string>
<string name="permdesc_manageAccounts" msgid="8698295625488292506">"للسماح للتطبيق بإجراء عمليات مثل Ø¥Ø¶Ø§ÙØ© حسابات وإزالتها وحذ٠كلمات مرورها."</string>
<string name="permlab_useCredentials" msgid="235481396163877642">"استخدام الحسابات على الجهاز"</string>
@@ -592,36 +599,36 @@
<string name="permlab_createNetworkSockets" msgid="8018758136404323658">"إمكانية دخول كاملة إلى الشبكة"</string>
<string name="permdesc_createNetworkSockets" msgid="3403062187779724185">"للسماح للتطبيق بإنشاء مقابس شبكات واستخدام بروتوكولات شبكات مخصصة. ÙˆÙŠÙˆÙØ± Ø§Ù„Ù…ØªØµÙØ­ وتطبيقات أخرى طرقًا لإرسال البيانات إلى الإنترنت، ولذلك لا يعد هذا الإذن مطلوبًا لإرسال البيانات إلى الإنترنت."</string>
<string name="permlab_writeApnSettings" msgid="505660159675751896">"تغيير/اعتراض إعدادات الشبكة وحركة المرور"</string>
- <string name="permdesc_writeApnSettings" msgid="5333798886412714193">"للسماح للتطبيق بتغيير إعدادات الشبكة ومقاطعة ÙˆÙØ­Øµ جميع حركة المرور ÙÙŠ الشبكة، على سبيل المثال، تغيير الخادم الوكيل ÙˆÙ…Ù†ÙØ° أي APN. قد تراقب التطبيقات الضارة حزم الشبكة أو تعيد توجيهها أو تعدلها بدون Ù…Ø¹Ø±ÙØªÙƒ."</string>
+ <string name="permdesc_writeApnSettings" msgid="5333798886412714193">"â€Ù„لسماح للتطبيق بتغيير إعدادات الشبكة ومقاطعة ÙˆÙØ­Øµ جميع حركة المرور ÙÙŠ الشبكة، على سبيل المثال، تغيير الخادم الوكيل ÙˆÙ…Ù†ÙØ° أي APN. قد تراقب التطبيقات الضارة حزم الشبكة أو تعيد توجيهها أو تعدلها بدون Ù…Ø¹Ø±ÙØªÙƒ."</string>
<string name="permlab_changeNetworkState" msgid="958884291454327309">"تغيير اتصال الشبكة"</string>
<string name="permdesc_changeNetworkState" msgid="6789123912476416214">"للسماح للتطبيق بتغيير حالة اتصال الشبكة."</string>
<string name="permlab_changeTetherState" msgid="5952584964373017960">"تغيير الاتصال المربوط"</string>
<string name="permdesc_changeTetherState" msgid="1524441344412319780">"للسماح للتطبيق بتغيير حالة اتصال الشبكة المربوطة."</string>
<string name="permlab_changeBackgroundDataSetting" msgid="1400666012671648741">"تغيير إعداد استخدام بيانات الخلÙية"</string>
<string name="permdesc_changeBackgroundDataSetting" msgid="5347729578468744379">"للسماح للتطبيق بتغيير إعداد استخدام بيانات الخلÙية."</string>
- <string name="permlab_accessWifiState" msgid="5202012949247040011">"عرض اتصالات Wi-Fi"</string>
- <string name="permdesc_accessWifiState" msgid="5002798077387803726">"للسماح للتطبيق بعرض معلومات حول شبكات Wi-Fi، كعرض معلومات حول ما إذا تم تمكين Wi-Fi واسم أجهزة Wi-Fi المتصلة."</string>
- <string name="permlab_changeWifiState" msgid="6550641188749128035">"التوصيل ÙˆØ§Ù„ÙØµÙ„ من Wi-Fi"</string>
- <string name="permdesc_changeWifiState" msgid="7137950297386127533">"للسماح للتطبيق بالاتصال بنقاط الوصول إلى Wi-Fi وقطع الاتصال بها، وإجراء تغييرات على تهيئة الجهاز لشبكات Wi-Fi."</string>
- <string name="permlab_changeWifiMulticastState" msgid="1368253871483254784">"السماح باستقبال بث Wi-Fi متعدد"</string>
- <string name="permdesc_changeWifiMulticastState" product="tablet" msgid="7969774021256336548">"للسماح للتطبيق بتلقي الحزم التي يتم إرسالها إلى جميع الأجهزة على شبكة Wi-Fi باستخدام عناوين بث متعدد، وليس باستخدام جهازك اللوحي Ùقط. ويؤدي ذلك إلى استخدام قدر أكبر من الطاقة ÙŠÙوق وضع البث غير المتعدد."</string>
- <string name="permdesc_changeWifiMulticastState" product="default" msgid="6851949706025349926">"للسماح للتطبيق بتلقي الحزم التي يتم إرسالها إلى جميع الأجهزة على شبكة Wi-Fi باستخدام عناوين بث متعدد، وليس باستخدام هاتÙÙƒ Ùقط. ويؤدي ذلك إلى استخدام قدر أكبر من الطاقة ÙŠÙوق وضع البث غير المتعدد."</string>
+ <string name="permlab_accessWifiState" msgid="5202012949247040011">"â€Ø¹Ø±Ø¶ اتصالات Wi-Fi"</string>
+ <string name="permdesc_accessWifiState" msgid="5002798077387803726">"â€Ù„لسماح للتطبيق بعرض معلومات حول شبكات Wi-FiØŒ كعرض معلومات حول ما إذا تم تمكين Wi-Fi واسم أجهزة Wi-Fi المتصلة."</string>
+ <string name="permlab_changeWifiState" msgid="6550641188749128035">"â€Ø§Ù„توصيل ÙˆØ§Ù„ÙØµÙ„ من Wi-Fi"</string>
+ <string name="permdesc_changeWifiState" msgid="7137950297386127533">"â€Ù„لسماح للتطبيق بالاتصال بنقاط الوصول إلى Wi-Fi وقطع الاتصال بها، وإجراء تغييرات على تهيئة الجهاز لشبكات Wi-Fi."</string>
+ <string name="permlab_changeWifiMulticastState" msgid="1368253871483254784">"â€Ø§Ù„سماح باستقبال بث Wi-Fi متعدد"</string>
+ <string name="permdesc_changeWifiMulticastState" product="tablet" msgid="7969774021256336548">"â€Ù„لسماح للتطبيق بتلقي الحزم التي يتم إرسالها إلى جميع الأجهزة على شبكة Wi-Fi باستخدام عناوين بث متعدد، وليس باستخدام جهازك اللوحي Ùقط. ويؤدي ذلك إلى استخدام قدر أكبر من الطاقة ÙŠÙوق وضع البث غير المتعدد."</string>
+ <string name="permdesc_changeWifiMulticastState" product="default" msgid="6851949706025349926">"â€Ù„لسماح للتطبيق بتلقي الحزم التي يتم إرسالها إلى جميع الأجهزة على شبكة Wi-Fi باستخدام عناوين بث متعدد، وليس باستخدام هاتÙÙƒ Ùقط. ويؤدي ذلك إلى استخدام قدر أكبر من الطاقة ÙŠÙوق وضع البث غير المتعدد."</string>
<string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"الدخول إلى إعدادات بلوتوث"</string>
<string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"للسماح للتطبيق بتهيئة لوحة البلوتوث المحلي، واكتشا٠أجهزة التحكم عن بعد والاقتران بها."</string>
<string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"للسماح للتطبيق بتهيئة هات٠البلوتوث المحلي، واكتشا٠أجهزة التحكم عن بعد والاقتران بها."</string>
<string name="permlab_bluetoothPriv" msgid="4009494246009513828">"السماح بإقران البلوتوث مع التطبيق"</string>
<string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"للسماح بإقران لتطبيق مع الأجهزة البعيدة بدون تدخل المستخدم."</string>
<string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"للسماح بإقران لتطبيق مع الأجهزة البعيدة بدون تدخل المستخدم."</string>
- <string name="permlab_accessWimaxState" msgid="4195907010610205703">"الاتصال بـشبكة WiMAX وقطع الاتصال بها"</string>
- <string name="permdesc_accessWimaxState" msgid="6360102877261978887">"للسماح للتطبيق بتحديد ما إذا تم تمكين WiMAX وتحديد معلومات حول أية شبكات WiMAX متصلة."</string>
- <string name="permlab_changeWimaxState" msgid="2405042267131496579">"تغيير حالة WiMAX"</string>
- <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"للسماح للتطبيق بتوصيل الجهاز اللوحي بشبكات WiMAX وقطع اتصاله بها."</string>
- <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"للسماح للتطبيق بتوصيل الهات٠بشبكات WiMAX وقطع اتصاله بها."</string>
+ <string name="permlab_accessWimaxState" msgid="4195907010610205703">"â€Ø§Ù„اتصال بـشبكة WiMAX وقطع الاتصال بها"</string>
+ <string name="permdesc_accessWimaxState" msgid="6360102877261978887">"â€Ù„لسماح للتطبيق بتحديد ما إذا تم تمكين WiMAX وتحديد معلومات حول أية شبكات WiMAX متصلة."</string>
+ <string name="permlab_changeWimaxState" msgid="2405042267131496579">"â€ØªØºÙŠÙŠØ± حالة WiMAX"</string>
+ <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"â€Ù„لسماح للتطبيق بتوصيل الجهاز اللوحي بشبكات WiMAX وقطع اتصاله بها."</string>
+ <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"â€Ù„لسماح للتطبيق بتوصيل الهات٠بشبكات WiMAX وقطع اتصاله بها."</string>
<string name="permlab_bluetooth" msgid="6127769336339276828">"الاتصال بأجهزة بلوتوث"</string>
<string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"للسماح للتطبيق بعرض تهيئة البلوتوث على الجهاز اللوحي وإجراء اتصالات وقبولها مع الأجهزة المقترنة."</string>
<string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"للسماح للتطبيق بعرض تهيئة البلوتوث على الهات٠وإجراء اتصالات وقبولها مع الأجهزة المقترنة."</string>
<string name="permlab_nfc" msgid="4423351274757876953">"التحكم ÙÙŠ اتصال الحقل القريب"</string>
- <string name="permdesc_nfc" msgid="7120611819401789907">"للسماح للتطبيق بالاتصال بعلامات الاتصال قريب المدى (NFC)، والبطاقات وبرامج القراءة."</string>
+ <string name="permdesc_nfc" msgid="7120611819401789907">"â€Ù„لسماح للتطبيق بالاتصال بعلامات الاتصال قريب المدى (NFC)ØŒ والبطاقات وبرامج القراءة."</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"تعطيل Ù‚ÙÙ„ الشاشة"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"للسماح للتطبيق بتعطيل تأمين Ø§Ù„Ù…ÙØ§ØªÙŠØ­ وأي أمان لكلمة مرور مرتبطة. على سبيل المثال، يعطل الهات٠تأمين Ø§Ù„Ù…ÙØ§ØªÙŠØ­ عند استقبال مكالمة هاتÙية واردة، ثم يعيد تمكين تأمين Ø§Ù„Ù…ÙØ§ØªÙŠØ­ عند انتهاء المكالمة."</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"قراءة إعدادات المزامنة"</string>
@@ -638,14 +645,14 @@
<string name="permdesc_readDictionary" msgid="659614600338904243">"للسماح للتطبيق بقراءة جميع الكلمات والأسماء والعبارات التي ربما يكون المستخدم قد خزنها ÙÙŠ قاموس المستخدم."</string>
<string name="permlab_writeDictionary" msgid="2183110402314441106">"Ø¥Ø¶Ø§ÙØ© كلمات إلى القاموس المعرّ٠بواسطة المستخدم"</string>
<string name="permdesc_writeDictionary" msgid="8185385716255065291">"للسماح للتطبيق بكتابة كلمات جديدة ÙÙŠ قاموس المستخدم."</string>
- <string name="permlab_sdcardRead" product="nosdcard" msgid="367275095159405468">"قراءة محتويات وحدة تخزين USB"</string>
- <string name="permlab_sdcardRead" product="default" msgid="2188156462934977940">"قراءة محتويات بطاقة SD"</string>
- <string name="permdesc_sdcardRead" product="nosdcard" msgid="3446988712598386079">"للسماح للتطبيق بقراءة محتويات وحدة تخزين USB."</string>
- <string name="permdesc_sdcardRead" product="default" msgid="2607362473654975411">"للسماح للتطبيق بقراءة محتويات بطاقة SD."</string>
- <string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"تعديل محتويات وحدة تخزين USB أو حذÙها"</string>
- <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"تعديل محتويات بطاقة SD أو حذÙها"</string>
- <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"للسماح للتطبيق بالكتابة إلى وحدة تخزين USB."</string>
- <string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"للسماح للتطبيق بالكتابة إلى بطاقة SD."</string>
+ <string name="permlab_sdcardRead" product="nosdcard" msgid="367275095159405468">"â€Ù‚راءة محتويات وحدة تخزين USB"</string>
+ <string name="permlab_sdcardRead" product="default" msgid="2188156462934977940">"â€Ù‚راءة محتويات بطاقة SD"</string>
+ <string name="permdesc_sdcardRead" product="nosdcard" msgid="3446988712598386079">"â€Ù„لسماح للتطبيق بقراءة محتويات وحدة تخزين USB."</string>
+ <string name="permdesc_sdcardRead" product="default" msgid="2607362473654975411">"â€Ù„لسماح للتطبيق بقراءة محتويات بطاقة SD."</string>
+ <string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"â€ØªØ¹Ø¯ÙŠÙ„ محتويات وحدة تخزين USB أو حذÙها"</string>
+ <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"â€ØªØ¹Ø¯ÙŠÙ„ محتويات بطاقة SD أو حذÙها"</string>
+ <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"â€Ù„لسماح للتطبيق بالكتابة إلى وحدة تخزين USB."</string>
+ <string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"â€Ù„لسماح للتطبيق بالكتابة إلى بطاقة SD."</string>
<string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"تعديل/حذ٠محتويات وحدة تخزين الوسائط الداخلية"</string>
<string name="permdesc_mediaStorageWrite" product="default" msgid="8189160597698529185">"للسماح للتطبيق بتعديل محتويات وحدة تخزين الوسائط الداخلية."</string>
<string name="permlab_manageDocs" product="default" msgid="5778318598448849829">"إدارة السعة التخزينية للمستند"</string>
@@ -655,7 +662,7 @@
<string name="permlab_cache_filesystem" msgid="5656487264819669824">"الدخول إلى نظام Ù…Ù„ÙØ§Øª ذاكرة التخزين المؤقت"</string>
<string name="permdesc_cache_filesystem" msgid="5578967642265550955">"للسماح للتطبيق بقراءة نظام Ù…Ù„ÙØ§Øª ذاكرة التخزين المؤقت والكتابة به."</string>
<string name="permlab_use_sip" msgid="5986952362795870502">"إجراء/تلقي مكالمات عبر الإنترنت"</string>
- <string name="permdesc_use_sip" msgid="4717632000062674294">"للسماح للتطبيق باستخدام خدمة SIP لإجراء/تلقي مكالمات عبر الإنترنت."</string>
+ <string name="permdesc_use_sip" msgid="4717632000062674294">"â€Ù„لسماح للتطبيق باستخدام خدمة SIP لإجراء/تلقي مكالمات عبر الإنترنت."</string>
<string name="permlab_bind_call_service" msgid="6724009726671246551">"Ø§Ù„ØªÙØ§Ø¹Ù„ مع الشاشة أثناء الاتصال"</string>
<string name="permdesc_bind_call_service" msgid="8732547662442572435">"للسماح للتطبيق بالتحكم ÙÙŠ وقت وكيÙية مشاهدة المستخدم للشاشة أثناء الاتصال."</string>
<string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"قراءة بيانات الاستخدام السابقة للشبكة"</string>
@@ -809,14 +816,14 @@
<string name="sipAddressTypeHome" msgid="6093598181069359295">"المنزل"</string>
<string name="sipAddressTypeWork" msgid="6920725730797099047">"العمل"</string>
<string name="sipAddressTypeOther" msgid="4408436162950119849">"غير ذلك"</string>
- <string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"اكتب رمز رقم التعري٠الشخصي"</string>
- <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"اكتب رمز PUK ورمز رقم التعري٠الشخصي الجديد"</string>
- <string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"رمز PUK"</string>
- <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"رمز رقم التعري٠الشخصي الجديد"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"â€Ø§ÙƒØªØ¨ رمز رمز PIN"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"â€Ø§ÙƒØªØ¨ رمز PUK ورمز رمز PIN الجديد"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"â€Ø±Ù…ز PUK"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"â€Ø±Ù…ز رمز PIN الجديد"</string>
<string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"المس لكتابة كلمة المرور"</font></string>
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"اكتب كلمة المرور لإلغاء التأمين"</string>
- <string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"اكتب رقم التعري٠الشخصي لإلغاء التأمين"</string>
- <string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"رقم التعري٠الشخصي غير صحيح."</string>
+ <string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"â€Ø§ÙƒØªØ¨ رمز PIN لإلغاء التأمين"</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"â€Ø±Ù…ز PIN غير صحيح."</string>
<string name="keyguard_label_text" msgid="861796461028298424">"لإلغاء التأمين، اضغط على \"القائمة\" ثم على 0."</string>
<string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"رقم الطوارئ"</string>
<string name="lockscreen_carrier_default" msgid="8963839242565653192">"لا ØªØªÙˆÙØ± خدمة"</string>
@@ -834,13 +841,13 @@
<string name="lockscreen_charged" msgid="321635745684060624">"تم الشحن"</string>
<string name="lockscreen_battery_short" msgid="4477264849386850266">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
<string name="lockscreen_low_battery" msgid="1482873981919249740">"توصيل جهاز الشحن."</string>
- <string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"ليست هناك بطاقة SIM"</string>
- <string name="lockscreen_missing_sim_message" product="tablet" msgid="151659196095791474">"ليس هناك بطاقة SIM ÙÙŠ الجهاز اللوحي."</string>
- <string name="lockscreen_missing_sim_message" product="default" msgid="2186920585695169078">"ليس هناك بطاقة SIM ÙÙŠ الهاتÙ."</string>
- <string name="lockscreen_missing_sim_instructions" msgid="5372787138023272615">"أدخل بطاقة SIM."</string>
- <string name="lockscreen_missing_sim_instructions_long" msgid="3526573099019319472">"بطاقة SIM Ù…Ùقودة أو غير قابلة للقراءة. أدخل بطاقة SIM."</string>
- <string name="lockscreen_permanent_disabled_sim_message_short" msgid="5096149665138916184">"بطاقة SIM غير قابلة للاستخدام."</string>
- <string name="lockscreen_permanent_disabled_sim_instructions" msgid="910904643433151371">"تم تعطيل بطاقة SIM بشكل دائم.\n اتصل بمقدم خدمة اللاسلكي للحصول على بطاقة SIM أخرى."</string>
+ <string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"â€Ù„يست هناك بطاقة SIM"</string>
+ <string name="lockscreen_missing_sim_message" product="tablet" msgid="151659196095791474">"â€Ù„يس هناك بطاقة SIM ÙÙŠ الجهاز اللوحي."</string>
+ <string name="lockscreen_missing_sim_message" product="default" msgid="2186920585695169078">"â€Ù„يس هناك بطاقة SIM ÙÙŠ الهاتÙ."</string>
+ <string name="lockscreen_missing_sim_instructions" msgid="5372787138023272615">"â€Ø£Ø¯Ø®Ù„ بطاقة SIM."</string>
+ <string name="lockscreen_missing_sim_instructions_long" msgid="3526573099019319472">"â€Ø¨Ø·Ø§Ù‚Ø© SIM Ù…Ùقودة أو غير قابلة للقراءة. أدخل بطاقة SIM."</string>
+ <string name="lockscreen_permanent_disabled_sim_message_short" msgid="5096149665138916184">"â€Ø¨Ø·Ø§Ù‚Ø© SIM غير قابلة للاستخدام."</string>
+ <string name="lockscreen_permanent_disabled_sim_instructions" msgid="910904643433151371">"â€ØªÙ… تعطيل بطاقة SIM بشكل دائم.\n اتصل بمقدم خدمة اللاسلكي للحصول على بطاقة SIM أخرى."</string>
<string name="lockscreen_transport_prev_description" msgid="201594905152746886">"زر المقطع الصوتي السابق"</string>
<string name="lockscreen_transport_next_description" msgid="6089297650481292363">"زر المقطع الصوتي التالي"</string>
<string name="lockscreen_transport_pause_description" msgid="7659088786780128001">"زر الإيقا٠المؤقت"</string>
@@ -848,15 +855,15 @@
<string name="lockscreen_transport_stop_description" msgid="4562318378766987601">"زر الإيقاÙ"</string>
<string name="emergency_calls_only" msgid="6733978304386365407">"مكالمات طوارئ Ùقط"</string>
<string name="lockscreen_network_locked_message" msgid="143389224986028501">"الشبكة مؤمّنة"</string>
- <string name="lockscreen_sim_puk_locked_message" msgid="7441797339976230">"بطاقة SIM مؤمّنة بكود PUK."</string>
+ <string name="lockscreen_sim_puk_locked_message" msgid="7441797339976230">"â€Ø¨Ø·Ø§Ù‚Ø© SIM مؤمّنة بكود PUK."</string>
<string name="lockscreen_sim_puk_locked_instructions" msgid="8127916255245181063">"راجع دليل المستخدم أو اتصل بخدمة العملاء."</string>
- <string name="lockscreen_sim_locked_message" msgid="8066660129206001039">"بطاقة SIM مؤمّنة."</string>
- <string name="lockscreen_sim_unlock_progress_dialog_message" msgid="595323214052881264">"جار٠إلغاء تأمين بطاقة SIM…"</string>
+ <string name="lockscreen_sim_locked_message" msgid="8066660129206001039">"â€Ø¨Ø·Ø§Ù‚Ø© SIM مؤمّنة."</string>
+ <string name="lockscreen_sim_unlock_progress_dialog_message" msgid="595323214052881264">"â€Ø¬Ø§Ø±Ù إلغاء تأمين بطاقة SIM…"</string>
<string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="6481623830344107222">"لقد رسمت نقش إلغاء التأمين بطريقة غير صحيحة <xliff:g id="NUMBER_0">%d</xliff:g> مرة.\n\nالرجاء إعادة المحاولة خلال <xliff:g id="NUMBER_1">%d</xliff:g> ثانية."</string>
<string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="2725973286239344555">"لقد كتبت كلمة المرور <xliff:g id="NUMBER_0">%d</xliff:g> مرة بشكل غير صحيح. \n\nأعد المحاولة خلال <xliff:g id="NUMBER_1">%d</xliff:g> ثانية."</string>
- <string name="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="6216672706545696955">"لقد كتبت رقم التعري٠الشخصي <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" product="tablet" msgid="9191611984625460820">"لقد رسمت نقش إلغاء التأمين بشكل غير صحيح <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_failed_attempts_almost_glogin" product="default" msgid="2590227559763762751">"لقد رسمت نقش إلغاء التأمين بشكل غير صحيح <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_pin_attempts_dialog_message" msgid="6216672706545696955">"â€Ù„قد كتبت رمز PIN <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" product="tablet" msgid="9191611984625460820">"â€Ù„قد رسمت نقش إلغاء التأمين بشكل غير صحيح <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_failed_attempts_almost_glogin" product="default" msgid="2590227559763762751">"â€Ù„قد رسمت نقش إلغاء التأمين بشكل غير صحيح <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_failed_attempts_almost_at_wipe" product="tablet" msgid="6128106399745755604">"لقد حاولت إلغاء تأمين الجهاز اللوحي <xliff:g id="NUMBER_0">%d</xliff:g> من المرات. بعد <xliff:g id="NUMBER_1">%d</xliff:g> من المحاولات غير الناجحة، ستتم إعادة تعيين الجهاز اللوحي إلى الإعدادات Ø§Ù„Ø§ÙØªØ±Ø§Ø¶ÙŠØ© للمصنع وسيتم Ùقد جميع بيانات المستخدم."</string>
<string name="lockscreen_failed_attempts_almost_at_wipe" product="default" msgid="8603565142156826565">"لقد حاولت إلغاء تأمين الهات٠<xliff:g id="NUMBER_0">%d</xliff:g> من المرات. بعد <xliff:g id="NUMBER_1">%d</xliff:g> من المحاولات غير الناجحة، ستتم إعادة تعيين الهات٠إلى الإعدادات Ø§Ù„Ø§ÙØªØ±Ø§Ø¶ÙŠØ© للمصنع وسيتم Ùقد جميع بيانات المستخدم."</string>
<string name="lockscreen_failed_attempts_now_wiping" product="tablet" msgid="280873516493934365">"لقد حاولت إلغاء تأمين الجهاز اللوحي <xliff:g id="NUMBER">%d</xliff:g> من المرات بشكل غير صحيح. سيتم الآن إعادة تعيين الجهاز اللوحي إلى الإعدادات Ø§Ù„Ø§ÙØªØ±Ø§Ø¶ÙŠØ© للمصنع."</string>
@@ -865,12 +872,12 @@
<string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"هل نسيت النمط؟"</string>
<string name="lockscreen_glogin_forgot_pattern" msgid="2588521501166032747">"إلغاء تأمين الحساب"</string>
<string name="lockscreen_glogin_too_many_attempts" msgid="2751368605287288808">"محاولات النقش كثيرة جدًا"</string>
- <string name="lockscreen_glogin_instructions" msgid="3931816256100707784">"لإلغاء التأمين، سجّل الدخول بحسابك ÙÙŠ Google."</string>
+ <string name="lockscreen_glogin_instructions" msgid="3931816256100707784">"â€Ù„إلغاء التأمين، سجّل الدخول بحسابك ÙÙŠ Google."</string>
<string name="lockscreen_glogin_username_hint" msgid="8846881424106484447">"اسم المستخدم (البريد إلكتروني)"</string>
<string name="lockscreen_glogin_password_hint" msgid="5958028383954738528">"كلمة المرور"</string>
<string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"تسجيل الدخول"</string>
<string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"اسم المستخدم غير صحيح أو كلمة المرور غير صحيحة."</string>
- <string name="lockscreen_glogin_account_recovery_hint" msgid="1696924763690379073">"هل نسيت اسم المستخدم أو كلمة المرور؟\nانتقل إلى "<b>"google.com/accounts/recovery"</b></string>
+ <string name="lockscreen_glogin_account_recovery_hint" msgid="1696924763690379073">"â€Ù‡Ù„ نسيت اسم المستخدم أو كلمة المرور؟\nانتقل إلى "<b>"google.com/accounts/recovery"</b></string>
<string name="lockscreen_glogin_checking_password" msgid="7114627351286933867">"جار٠التحقق..."</string>
<string name="lockscreen_unlock_label" msgid="737440483220667054">"إلغاء تأمين"</string>
<string name="lockscreen_sound_on_label" msgid="9068877576513425970">"تشغيل الصوت"</string>
@@ -879,7 +886,7 @@
<string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"تم محو النمط"</string>
<string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"تمت Ø¥Ø¶Ø§ÙØ© الخلية"</string>
<string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"اكتمل النمط"</string>
- <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. الأداة %2$d من %3$d."</string>
+ <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"â€%1$s. الأداة %2$d من %3$d."</string>
<string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Ø¥Ø¶Ø§ÙØ© أداة."</string>
<string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"ÙØ§Ø±ØºØ©"</string>
<string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"تم توسيع منطقة إلغاء القÙÙ„."</string>
@@ -896,7 +903,7 @@
<string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"إلغاء القÙÙ„ باستخدام التمرير."</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"إلغاء القÙÙ„ باستخدام النقش."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"تأمين الجهاز بالوجه."</string>
- <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"إلغاء القÙÙ„ باستخدام رقم التعري٠الشخصي."</string>
+ <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"â€Ø¥Ù„غاء القÙÙ„ باستخدام رمز PIN."</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"إلغاء القÙÙ„ باستخدام كلمة المرور."</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"منطقة النقش."</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"منطقة التمرير."</string>
@@ -910,8 +917,8 @@
<string name="hour_ampm" msgid="4584338083529355982">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
<string name="hour_cap_ampm" msgid="2083465992940444366">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
<string name="factorytest_failed" msgid="5410270329114212041">"أخÙÙ‚ اختبار المصنع"</string>
- <string name="factorytest_not_system" msgid="4435201656767276723">"إجراء FACTORY_TEST غير متاح سوى للحزم المثبتة ÙÙŠ /system/app."</string>
- <string name="factorytest_no_action" msgid="872991874799998561">"لم يتم العثور على أية حزمة ØªÙˆÙØ± إجراء FACTORY_TEST."</string>
+ <string name="factorytest_not_system" msgid="4435201656767276723">"â€Ø¥Ø¬Ø±Ø§Ø¡ FACTORY_TEST غير متاح سوى للحزم المثبتة ÙÙŠ /system/app."</string>
+ <string name="factorytest_no_action" msgid="872991874799998561">"â€Ù„Ù… يتم العثور على أية حزمة ØªÙˆÙØ± إجراء FACTORY_TEST."</string>
<string name="factorytest_reboot" msgid="6320168203050791643">"إعادة تشغيل"</string>
<string name="js_dialog_title" msgid="1987483977834603872">"تعرض Ø§Ù„ØµÙØ­Ø© ÙÙŠ \"<xliff:g id="TITLE">%s</xliff:g>\":"</string>
<string name="js_dialog_title_default" msgid="6961903213729667573">"Ø¬Ø§ÙØ§ سكريبت"</string>
@@ -940,7 +947,7 @@
<string name="autofill_area" msgid="3547409050889952423">"المنطقة"</string>
<string name="autofill_emirate" msgid="2893880978835698818">"الإمارة"</string>
<string name="permlab_readHistoryBookmarks" msgid="3775265775405106983">"قراءة إشارات ويب والسجل"</string>
- <string name="permdesc_readHistoryBookmarks" msgid="8462378226600439658">"للسماح للتطبيق بقراءة سجل جميع عناوين URL التي زارها Ø§Ù„Ù…ØªØµÙØ­ØŒ وجميع الإشارات المرجعية ÙÙŠ Ø§Ù„Ù…ØªØµÙØ­. ملاحظة: لا يجوز ÙØ±Ø¶ هذا الإذن من Ù‚ÙØ¨Ù„ Ù…ØªØµÙØ­Ø§Øª جهة خارجية أو تطبيقات أخرى ØªØªÙˆÙØ± بها إمكانيات ØªØµÙØ­ الويب."</string>
+ <string name="permdesc_readHistoryBookmarks" msgid="8462378226600439658">"â€Ù„لسماح للتطبيق بقراءة سجل جميع عناوين URL التي زارها Ø§Ù„Ù…ØªØµÙØ­ØŒ وجميع الإشارات المرجعية ÙÙŠ Ø§Ù„Ù…ØªØµÙØ­. ملاحظة: لا يجوز ÙØ±Ø¶ هذا الإذن من Ù‚ÙØ¨Ù„ Ù…ØªØµÙØ­Ø§Øª جهة خارجية أو تطبيقات أخرى ØªØªÙˆÙØ± بها إمكانيات ØªØµÙØ­ الويب."</string>
<string name="permlab_writeHistoryBookmarks" msgid="3714785165273314490">"كتابة إشارات ويب والسجل"</string>
<string name="permdesc_writeHistoryBookmarks" product="tablet" msgid="6825527469145760922">"للسماح للتطبيق بتعديل سجل Ø§Ù„Ù…ØªØµÙØ­ أو الإشارات المرجعية المخزنة على جهازك اللوحي. وقد يتيح هذا للتطبيق محو بيانات Ø§Ù„Ù…ØªØµÙØ­ أو تعديلها. ملاحظة: لا يجوز ÙØ±Ø¶ هذا الإذن من Ù‚ÙØ¨Ù„ Ù…ØªØµÙØ­Ø§Øª جهات خارجية أو تطبيقات أخرى بها إمكانيات ØªØµÙØ­ الويب."</string>
<string name="permdesc_writeHistoryBookmarks" product="default" msgid="8497389531014185509">"للسماح للتطبيق بتعديل سجل Ø§Ù„Ù…ØªØµÙØ­ أو الإشارات المرجعية المخزنة على هاتÙÙƒ. وقد يتيح هذا للتطبيق محو بيانات Ø§Ù„Ù…ØªØµÙØ­ أو تعديلها. ملاحظة: لا يجوز ÙØ±Ø¶ هذا الإذن من Ù‚ÙØ¨Ù„ Ù…ØªØµÙØ­Ø§Øª جهات خارجية أو تطبيقات أخرى بها إمكانيات ØªØµÙØ­ الويب."</string>
@@ -977,9 +984,9 @@
<string name="searchview_description_clear" msgid="1330281990951833033">"محو طلب البحث"</string>
<string name="searchview_description_submit" msgid="2688450133297983542">"إرسال طلب البحث"</string>
<string name="searchview_description_voice" msgid="2453203695674994440">"البحث الصوتي"</string>
- <string name="enable_explore_by_touch_warning_title" msgid="7460694070309730149">"هل تريد تمكين ميزة Explore by Touch؟"</string>
- <string name="enable_explore_by_touch_warning_message" product="tablet" msgid="8655887539089910577">"يريد <xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> تمكين ميزة Explore by Touch. عند تشغيل ميزة Explore by TouchØŒ سيكون بإمكانك سماع أو مشاهدة أوصا٠لما تحت إصبعك أو إجراء إيماءات Ù„Ù„ØªÙØ§Ø¹Ù„ مع الجهاز اللوحي."</string>
- <string name="enable_explore_by_touch_warning_message" product="default" msgid="2708199672852373195">"يريد <xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> تمكين ميزة Explore by Touch. عند تشغيل ميزة Explore by TouchØŒ سيكون بإمكانك سماع أو مشاهدة أوصا٠لما تحت إصبعك أو إجراء إيماءات Ù„Ù„ØªÙØ§Ø¹Ù„ مع الهاتÙ."</string>
+ <string name="enable_explore_by_touch_warning_title" msgid="7460694070309730149">"â€Ù‡Ù„ تريد تمكين ميزة Explore by TouchØŸ"</string>
+ <string name="enable_explore_by_touch_warning_message" product="tablet" msgid="8655887539089910577">"â€ÙŠØ±ÙŠØ¯ <xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> تمكين ميزة Explore by Touch. عند تشغيل ميزة Explore by TouchØŒ سيكون بإمكانك سماع أو مشاهدة أوصا٠لما تحت إصبعك أو إجراء إيماءات Ù„Ù„ØªÙØ§Ø¹Ù„ مع الجهاز اللوحي."</string>
+ <string name="enable_explore_by_touch_warning_message" product="default" msgid="2708199672852373195">"â€ÙŠØ±ÙŠØ¯ <xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> تمكين ميزة Explore by Touch. عند تشغيل ميزة Explore by TouchØŒ سيكون بإمكانك سماع أو مشاهدة أوصا٠لما تحت إصبعك أو إجراء إيماءات Ù„Ù„ØªÙØ§Ø¹Ù„ مع الهاتÙ."</string>
<string name="oneMonthDurationPast" msgid="7396384508953779925">"قبل شهر واحد"</string>
<string name="beforeOneMonthDurationPast" msgid="909134546836499826">"قبل شهر واحد"</string>
<plurals name="num_seconds_ago">
@@ -1095,7 +1102,7 @@
<string name="paste" msgid="5629880836805036433">"لصق"</string>
<string name="replace" msgid="5781686059063148930">"استبدال..."</string>
<string name="delete" msgid="6098684844021697789">"حذÙ"</string>
- <string name="copyUrl" msgid="2538211579596067402">"نسخ عنوان URL"</string>
+ <string name="copyUrl" msgid="2538211579596067402">"â€Ù†Ø³Ø® عنوان URL"</string>
<string name="selectTextMode" msgid="1018691815143165326">"تحديد نص"</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"تحديد النص"</string>
<string name="addToDictionary" msgid="4352161534510057874">"Ø¥Ø¶Ø§ÙØ© إلى القاموس"</string>
@@ -1117,9 +1124,9 @@
<string name="whichApplication" msgid="4533185947064773386">"إكمال الإجراء باستخدام"</string>
<string name="whichHomeApplication" msgid="4616420172727326782">"تحديد تطبيق الشاشة الرئيسية"</string>
<string name="alwaysUse" msgid="4583018368000610438">"الاستخدام بشكل Ø§ÙØªØ±Ø§Ø¶ÙŠ Ù„Ù‡Ø°Ø§ الإجراء."</string>
- <string name="clearDefaultHintMsg" msgid="3252584689512077257">"يمكنك محو الإعدادات Ø§Ù„Ø§ÙØªØ±Ø§Ø¶ÙŠØ© ÙÙŠ إعدادات النظام &gt; التطبيقات &gt; ما تم تنزيله."</string>
+ <string name="clearDefaultHintMsg" msgid="3252584689512077257">"â€ÙŠÙ…كنك محو الإعدادات Ø§Ù„Ø§ÙØªØ±Ø§Ø¶ÙŠØ© ÙÙŠ إعدادات النظام &gt; التطبيقات &gt; ما تم تنزيله."</string>
<string name="chooseActivity" msgid="7486876147751803333">"اختيار إجراء"</string>
- <string name="chooseUsbActivity" msgid="6894748416073583509">"اختيار أحد التطبيقات لجهاز USB"</string>
+ <string name="chooseUsbActivity" msgid="6894748416073583509">"â€Ø§Ø®ØªÙŠØ§Ø± أحد التطبيقات لجهاز USB"</string>
<string name="noApplications" msgid="2991814273936504689">"ليست هناك تطبيقات يمكنها تنÙيذ هذا الإجراء."</string>
<string name="aerr_title" msgid="1905800560317137752"></string>
<string name="aerr_application" msgid="932628488013092776">"Ù„Ù„Ø£Ø³ÙØŒ توق٠<xliff:g id="APPLICATION">%1$s</xliff:g>."</string>
@@ -1138,10 +1145,10 @@
<string name="launch_warning_original" msgid="188102023021668683">"تم تشغيل <xliff:g id="APP_NAME">%1$s</xliff:g> من الأصل."</string>
<string name="screen_compat_mode_scale" msgid="3202955667675944499">"تدرج"</string>
<string name="screen_compat_mode_show" msgid="4013878876486655892">"الإظهار دائمًا"</string>
- <string name="screen_compat_mode_hint" msgid="1064524084543304459">"يمكنك إعادة تمكين هذا ÙÙŠ إعدادات النظام &gt; التطبيقات &gt; ما تم تنزيله."</string>
- <string name="smv_application" msgid="3307209192155442829">"انتهك التطبيق <xliff:g id="APPLICATION">%1$s</xliff:g> (العملية <xliff:g id="PROCESS">%2$s</xliff:g>) سياسة StrictMode Ø§Ù„Ù…ÙØ±ÙˆØ¶Ø© ذاتيًا."</string>
- <string name="smv_process" msgid="5120397012047462446">"انتهكت العملية <xliff:g id="PROCESS">%1$s</xliff:g> سياسة StrictMode Ø§Ù„Ù…ÙØ±ÙˆØ¶Ø© ذاتيًا."</string>
- <string name="android_upgrading_title" msgid="1584192285441405746">"جار٠ترقية Android..."</string>
+ <string name="screen_compat_mode_hint" msgid="1064524084543304459">"â€ÙŠÙ…كنك إعادة تمكين هذا ÙÙŠ إعدادات النظام &gt; التطبيقات &gt; ما تم تنزيله."</string>
+ <string name="smv_application" msgid="3307209192155442829">"â€Ø§Ù†ØªÙ‡Ùƒ التطبيق <xliff:g id="APPLICATION">%1$s</xliff:g> (العملية <xliff:g id="PROCESS">%2$s</xliff:g>) سياسة StrictMode Ø§Ù„Ù…ÙØ±ÙˆØ¶Ø© ذاتيًا."</string>
+ <string name="smv_process" msgid="5120397012047462446">"â€Ø§Ù†ØªÙ‡ÙƒØª العملية <xliff:g id="PROCESS">%1$s</xliff:g> سياسة StrictMode Ø§Ù„Ù…ÙØ±ÙˆØ¶Ø© ذاتيًا."</string>
+ <string name="android_upgrading_title" msgid="1584192285441405746">"â€Ø¬Ø§Ø±Ù ترقية Android..."</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"جار٠تحسين التطبيق <xliff:g id="NUMBER_0">%1$d</xliff:g> من <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"بدء التطبيقات."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"جار٠إعادة التشغيل."</string>
@@ -1174,23 +1181,23 @@
<string name="ringtone_picker_title" msgid="3515143939175119094">"نغمات الرنين"</string>
<string name="ringtone_unknown" msgid="5477919988701784788">"نغمة رنين غير Ù…Ø¹Ø±ÙˆÙØ©"</string>
<plurals name="wifi_available">
- <item quantity="one" msgid="6654123987418168693">"شبكة Wi-Fi متاحة"</item>
- <item quantity="other" msgid="4192424489168397386">"شبكات Wi-Fi متاحة"</item>
+ <item quantity="one" msgid="6654123987418168693">"â€Ø´Ø¨ÙƒØ© Wi-Fi متاحة"</item>
+ <item quantity="other" msgid="4192424489168397386">"â€Ø´Ø¨ÙƒØ§Øª Wi-Fi متاحة"</item>
</plurals>
<plurals name="wifi_available_detailed">
- <item quantity="one" msgid="1634101450343277345">"هناك شبكة Wi-Fi Ù…ÙØªÙˆØ­Ø© متاحة"</item>
- <item quantity="other" msgid="7915895323644292768">"هناك شبكات Wi-Fi Ù…ÙØªÙˆØ­Ø© متاحة"</item>
+ <item quantity="one" msgid="1634101450343277345">"â€Ù‡Ù†Ø§Ùƒ شبكة Wi-Fi Ù…ÙØªÙˆØ­Ø© متاحة"</item>
+ <item quantity="other" msgid="7915895323644292768">"â€Ù‡Ù†Ø§Ùƒ شبكات Wi-Fi Ù…ÙØªÙˆØ­Ø© متاحة"</item>
</plurals>
- <string name="wifi_available_sign_in" msgid="4029489716605255386">"تسجيل الدخول إلى شبكة Wi-Fi"</string>
+ <string name="wifi_available_sign_in" msgid="4029489716605255386">"â€ØªØ³Ø¬ÙŠÙ„ الدخول إلى شبكة Wi-Fi"</string>
<string name="network_available_sign_in" msgid="8495155593358054676">"تسجيل الدخول إلى الشبكة"</string>
<!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
<skip />
- <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"تعذر الاتصال بـ Wi-Fi"</string>
+ <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"â€ØªØ¹Ø°Ø± الاتصال بـ Wi-Fi"</string>
<string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" لديها اتصال إنترنت رديء."</string>
- <string name="wifi_p2p_dialog_title" msgid="97611782659324517">"اتصال Wi-Fi مباشر"</string>
- <string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"ابدأ Wi-Fi Direct. يؤدي هذا إلى إيقا٠عميل/نقطة اتصال Wi-Fi."</string>
- <string name="wifi_p2p_failed_message" msgid="3763669677935623084">"تعذر بدء Wi-Fi Direct."</string>
- <string name="wifi_p2p_enabled_notification_title" msgid="2068321881673734886">"تم تشغيل اتصال Wi-Fi المباشر"</string>
+ <string name="wifi_p2p_dialog_title" msgid="97611782659324517">"â€Ø§ØªØµØ§Ù„ Wi-Fi مباشر"</string>
+ <string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"â€Ø§Ø¨Ø¯Ø£ Wi-Fi Direct. يؤدي هذا إلى إيقا٠عميل/نقطة اتصال Wi-Fi."</string>
+ <string name="wifi_p2p_failed_message" msgid="3763669677935623084">"â€ØªØ¹Ø°Ø± بدء Wi-Fi Direct."</string>
+ <string name="wifi_p2p_enabled_notification_title" msgid="2068321881673734886">"â€ØªÙ… تشغيل اتصال Wi-Fi المباشر"</string>
<string name="wifi_p2p_enabled_notification_message" msgid="1638949953993894335">"المس للحصول على الإعدادات"</string>
<string name="accept" msgid="1645267259272829559">"قبول"</string>
<string name="decline" msgid="2112225451706137894">"Ø±ÙØ¶"</string>
@@ -1198,28 +1205,28 @@
<string name="wifi_p2p_invitation_to_connect_title" msgid="4958803948658533637">"دعوة للاتصال"</string>
<string name="wifi_p2p_from_message" msgid="570389174731951769">"من:"</string>
<string name="wifi_p2p_to_message" msgid="248968974522044099">"إلى:"</string>
- <string name="wifi_p2p_enter_pin_message" msgid="5920929550367828970">"اكتب رقم التعري٠الشخصي المطلوب:"</string>
- <string name="wifi_p2p_show_pin_message" msgid="8530563323880921094">"رقم التعري٠الشخصي:"</string>
- <string name="wifi_p2p_frequency_conflict_message" product="tablet" msgid="8012981257742232475">"سيتم قطع اتصال الجهاز اللوحي مؤقتًا بشبكة Wi-Fi ÙÙŠ الوقت الذي يكون Ùيه متصلاً بـ <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
- <string name="wifi_p2p_frequency_conflict_message" product="default" msgid="7363907213787469151">"سيتم قطع اتصال الهات٠مؤقتًا بشبكة Wi-Fi ÙÙŠ الوقت الذي يكون Ùيه متصلاً بـ <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+ <string name="wifi_p2p_enter_pin_message" msgid="5920929550367828970">"â€Ø§ÙƒØªØ¨ رمز PIN المطلوب:"</string>
+ <string name="wifi_p2p_show_pin_message" msgid="8530563323880921094">"â€Ø±Ù…ز PIN:"</string>
+ <string name="wifi_p2p_frequency_conflict_message" product="tablet" msgid="8012981257742232475">"â€Ø³ÙŠØªÙ… قطع اتصال الجهاز اللوحي مؤقتًا بشبكة Wi-Fi ÙÙŠ الوقت الذي يكون Ùيه متصلاً بـ <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+ <string name="wifi_p2p_frequency_conflict_message" product="default" msgid="7363907213787469151">"â€Ø³ÙŠØªÙ… قطع اتصال الهات٠مؤقتًا بشبكة Wi-Fi ÙÙŠ الوقت الذي يكون Ùيه متصلاً بـ <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
<string name="select_character" msgid="3365550120617701745">"إدراج حرÙ"</string>
- <string name="sms_control_title" msgid="7296612781128917719">"إرسال رسائل قصيرة SMS"</string>
- <string name="sms_control_message" msgid="3867899169651496433">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; يرسل عددًا كبيرًا من الرسائل القصيرة SMS. هل تريد السماح لهذا التطبيق بالاستمرار ÙÙŠ إرسال الرسائل؟"</string>
+ <string name="sms_control_title" msgid="7296612781128917719">"â€Ø¥Ø±Ø³Ø§Ù„ رسائل قصيرة SMS"</string>
+ <string name="sms_control_message" msgid="3867899169651496433">"â€&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; يرسل عددًا كبيرًا من الرسائل القصيرة SMS. هل تريد السماح لهذا التطبيق بالاستمرار ÙÙŠ إرسال الرسائل؟"</string>
<string name="sms_control_yes" msgid="3663725993855816807">"السماح"</string>
<string name="sms_control_no" msgid="625438561395534982">"Ø±ÙØ¶"</string>
- <string name="sms_short_code_confirm_message" msgid="1645436466285310855">"هناك رغبة من &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ÙÙŠ إرسال رسالة إلى &lt;b&gt;<xliff:g id="DEST_ADDRESS">%2$s</xliff:g>&lt;/b&gt;."</string>
+ <string name="sms_short_code_confirm_message" msgid="1645436466285310855">"â€Ù‡Ù†Ø§Ùƒ رغبة من &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ÙÙŠ إرسال رسالة إلى &lt;b&gt;<xliff:g id="DEST_ADDRESS">%2$s</xliff:g>&lt;/b&gt;."</string>
<string name="sms_short_code_details" msgid="3492025719868078457">"هذا "<font fgcolor="#ffffb060">"قد يؤدي إلى ÙØ±Ø¶ رسوم"</font>" على حسابك على الجوال."</string>
<string name="sms_premium_short_code_details" msgid="5523826349105123687"><font fgcolor="#ffffb060">"سيؤدي هذا إلى ÙØ±Ø¶ رسوم على حسابك على الجوال."</font></string>
<string name="sms_short_code_confirm_allow" msgid="4458878637111023413">"إرسال"</string>
<string name="sms_short_code_confirm_deny" msgid="2927389840209170706">"إلغاء"</string>
<string name="sms_short_code_remember_choice" msgid="5289538592272218136">"تذكر اختياري"</string>
- <string name="sms_short_code_remember_undo_instruction" msgid="4960944133052287484">"يمكنك تغيير ذلك لاحقًا من إعدادات &gt; تطبيقات"</string>
+ <string name="sms_short_code_remember_undo_instruction" msgid="4960944133052287484">"â€ÙŠÙ…كنك تغيير ذلك لاحقًا من إعدادات &gt; تطبيقات"</string>
<string name="sms_short_code_confirm_always_allow" msgid="3241181154869493368">"السماح دومًا"</string>
<string name="sms_short_code_confirm_never_allow" msgid="446992765774269673">"عدم السماح مطلقًا"</string>
- <string name="sim_removed_title" msgid="6227712319223226185">"تمت إزالة بطاقة SIM"</string>
- <string name="sim_removed_message" msgid="2333164559970958645">"لن تكون شبكة الجوال متاحة حتى تتم إعادة التشغيل وإدخال بطاقة SIM صالحة."</string>
+ <string name="sim_removed_title" msgid="6227712319223226185">"â€ØªÙ…ت إزالة بطاقة SIM"</string>
+ <string name="sim_removed_message" msgid="2333164559970958645">"â€Ù„Ù† تكون شبكة الجوال متاحة حتى تتم إعادة التشغيل وإدخال بطاقة SIM صالحة."</string>
<string name="sim_done_button" msgid="827949989369963775">"تم"</string>
- <string name="sim_added_title" msgid="3719670512889674693">"تمت Ø¥Ø¶Ø§ÙØ© بطاقة SIM"</string>
+ <string name="sim_added_title" msgid="3719670512889674693">"â€ØªÙ…ت Ø¥Ø¶Ø§ÙØ© بطاقة SIM"</string>
<string name="sim_added_message" msgid="6599945301141050216">"أعد تشغيل جهازك للدخول إلى شبكة الجوال."</string>
<string name="sim_restart_button" msgid="4722407842815232347">"إعادة التشغيل"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"تعيين الوقت"</string>
@@ -1230,38 +1237,38 @@
<string name="perms_description_app" msgid="5139836143293299417">"يقدمه <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="no_permissions" msgid="7283357728219338112">"لا أذونات مطلوبة"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"قد يكلÙÙƒ هذا مالاً."</string>
- <string name="usb_storage_activity_title" msgid="4465055157209648641">"تخزين USB كبير السعة"</string>
- <string name="usb_storage_title" msgid="5901459041398751495">"USB متصل"</string>
- <string name="usb_storage_message" product="nosdcard" msgid="3308538094316477839">"لقد اتصلت بجهاز الكمبيوتر من خلال USB. المس الزر أدناه إذا كنت تريد نسخ Ø§Ù„Ù…Ù„ÙØ§Øª بين جهاز الكمبيوتر ووحدة تخزين USB ÙÙŠ Android."</string>
- <string name="usb_storage_message" product="default" msgid="805351000446037811">"لقد اتصلت بجهاز الكمبيوتر من خلال USB. المس الزر أدناه إذا كنت تريد نسخ Ø§Ù„Ù…Ù„ÙØ§Øª بين جهاز الكمبيوتر وبطاقة SD لـ Android."</string>
- <string name="usb_storage_button_mount" msgid="1052259930369508235">"تشغيل سعة تخزين USB"</string>
- <string name="usb_storage_error_message" product="nosdcard" msgid="3017045217365540658">"حدثت مشكلة أثناء استخدام وحدة تخزين USB لتخزين كبير السعة عبر USB."</string>
- <string name="usb_storage_error_message" product="default" msgid="2876018512716970313">"حدثت مشكلة أثناء استخدام بطاقة SD لتخزين كبير السعة عبر USB."</string>
- <string name="usb_storage_notification_title" msgid="8175892554757216525">"USB متصل"</string>
+ <string name="usb_storage_activity_title" msgid="4465055157209648641">"â€ØªØ®Ø²ÙŠÙ† USB كبير السعة"</string>
+ <string name="usb_storage_title" msgid="5901459041398751495">"â€USB متصل"</string>
+ <string name="usb_storage_message" product="nosdcard" msgid="3308538094316477839">"â€Ù„قد اتصلت بجهاز الكمبيوتر من خلال USB. المس الزر أدناه إذا كنت تريد نسخ Ø§Ù„Ù…Ù„ÙØ§Øª بين جهاز الكمبيوتر ووحدة تخزين USB ÙÙŠ Android."</string>
+ <string name="usb_storage_message" product="default" msgid="805351000446037811">"â€Ù„قد اتصلت بجهاز الكمبيوتر من خلال USB. المس الزر أدناه إذا كنت تريد نسخ Ø§Ù„Ù…Ù„ÙØ§Øª بين جهاز الكمبيوتر وبطاقة SD لـ Android."</string>
+ <string name="usb_storage_button_mount" msgid="1052259930369508235">"â€ØªØ´ØºÙŠÙ„ سعة تخزين USB"</string>
+ <string name="usb_storage_error_message" product="nosdcard" msgid="3017045217365540658">"â€Ø­Ø¯Ø«Øª مشكلة أثناء استخدام وحدة تخزين USB لتخزين كبير السعة عبر USB."</string>
+ <string name="usb_storage_error_message" product="default" msgid="2876018512716970313">"â€Ø­Ø¯Ø«Øª مشكلة أثناء استخدام بطاقة SD لتخزين كبير السعة عبر USB."</string>
+ <string name="usb_storage_notification_title" msgid="8175892554757216525">"â€USB متصل"</string>
<string name="usb_storage_notification_message" msgid="939822783828183763">"المس لنسخ Ø§Ù„Ù…Ù„ÙØ§Øª إلى/من جهاز الكمبيوتر."</string>
- <string name="usb_storage_stop_notification_title" msgid="2336058396663516017">"إيقا٠تشغيل سعة تخزين USB"</string>
- <string name="usb_storage_stop_notification_message" msgid="1656852098555623822">"المس لإيقا٠وحدة تخزين USB."</string>
- <string name="usb_storage_stop_title" msgid="660129851708775853">"سعة USB التخزينية المستخدمة"</string>
- <string name="usb_storage_stop_message" product="nosdcard" msgid="4264025280777219521">"قبل إيقا٠وحدة تخزين USB، الغ تحميل (\"أخرج\") وحدة تخزين USB لـ Android من الكمبيوتر."</string>
- <string name="usb_storage_stop_message" product="default" msgid="8043969782460613114">"قبل إيقا٠وحدة تخزين USB، الغ تحميل (\"أخرج\") بطاقة SD لـ Android من الكمبيوتر."</string>
- <string name="usb_storage_stop_button_mount" msgid="7060218034900696029">"إيقا٠تشغيل سعة تخزين USB"</string>
- <string name="usb_storage_stop_error_message" msgid="1970374898263063836">"حدثت مشكلة أثناء إيقا٠وحدة تخزين USB. تحقق من إلغاء تحميل مضي٠USB، ثم أعد المحاولة."</string>
- <string name="dlg_confirm_kill_storage_users_title" msgid="963039033470478697">"تشغيل سعة تخزين USB"</string>
- <string name="dlg_confirm_kill_storage_users_text" msgid="5100428757107469454">"إذا تم تشغيل وحدة تخزين USBØŒ ÙØ³ØªØªÙˆÙ‚٠بعض التطبيقات التي تستخدمها وربما تصبح غير متاحة إلى أن يتم إيقا٠وحدة تخزين USB."</string>
- <string name="dlg_error_title" msgid="7323658469626514207">"لم تتم عملية USB بنجاح"</string>
+ <string name="usb_storage_stop_notification_title" msgid="2336058396663516017">"â€Ø¥ÙŠÙ‚ا٠تشغيل سعة تخزين USB"</string>
+ <string name="usb_storage_stop_notification_message" msgid="1656852098555623822">"â€Ø§Ù„مس لإيقا٠وحدة تخزين USB."</string>
+ <string name="usb_storage_stop_title" msgid="660129851708775853">"â€Ø³Ø¹Ø© USB التخزينية المستخدمة"</string>
+ <string name="usb_storage_stop_message" product="nosdcard" msgid="4264025280777219521">"â€Ù‚بل إيقا٠وحدة تخزين USBØŒ الغ تحميل (\"أخرج\") وحدة تخزين USB لـ Android من الكمبيوتر."</string>
+ <string name="usb_storage_stop_message" product="default" msgid="8043969782460613114">"â€Ù‚بل إيقا٠وحدة تخزين USBØŒ الغ تحميل (\"أخرج\") بطاقة SD لـ Android من الكمبيوتر."</string>
+ <string name="usb_storage_stop_button_mount" msgid="7060218034900696029">"â€Ø¥ÙŠÙ‚ا٠تشغيل سعة تخزين USB"</string>
+ <string name="usb_storage_stop_error_message" msgid="1970374898263063836">"â€Ø­Ø¯Ø«Øª مشكلة أثناء إيقا٠وحدة تخزين USB. تحقق من إلغاء تحميل مضي٠USBØŒ ثم أعد المحاولة."</string>
+ <string name="dlg_confirm_kill_storage_users_title" msgid="963039033470478697">"â€ØªØ´ØºÙŠÙ„ سعة تخزين USB"</string>
+ <string name="dlg_confirm_kill_storage_users_text" msgid="5100428757107469454">"â€Ø¥Ø°Ø§ تم تشغيل وحدة تخزين USBØŒ ÙØ³ØªØªÙˆÙ‚٠بعض التطبيقات التي تستخدمها وربما تصبح غير متاحة إلى أن يتم إيقا٠وحدة تخزين USB."</string>
+ <string name="dlg_error_title" msgid="7323658469626514207">"â€Ù„Ù… تتم عملية USB بنجاح"</string>
<string name="dlg_ok" msgid="7376953167039865701">"مواÙÙ‚"</string>
<string name="usb_mtp_notification_title" msgid="3699913097391550394">"التوصيل كجهاز وسائط"</string>
<string name="usb_ptp_notification_title" msgid="1960817192216064833">"التوصيل ككاميرا"</string>
<string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"التوصيل كأداة تثبيت"</string>
- <string name="usb_accessory_notification_title" msgid="7848236974087653666">"الاتصال بجهاز USB ملحق"</string>
- <string name="usb_notification_message" msgid="2290859399983720271">"المس للاطلاع على خيارات USB الأخرى."</string>
- <string name="extmedia_format_title" product="nosdcard" msgid="9020092196061007262">"تهيئة وحدة تخزين USB؟"</string>
- <string name="extmedia_format_title" product="default" msgid="3648415921526526069">"هل تريد تنسيق بطاقة SD؟"</string>
- <string name="extmedia_format_message" product="nosdcard" msgid="3934016853425761078">"سيتم مسح جميع Ø§Ù„Ù…Ù„ÙØ§Øª المخزنة على وحدة تخزين USB. لا يمكن عكس هذا الإجراء!"</string>
+ <string name="usb_accessory_notification_title" msgid="7848236974087653666">"â€Ø§Ù„اتصال بجهاز USB ملحق"</string>
+ <string name="usb_notification_message" msgid="2290859399983720271">"â€Ø§Ù„مس للاطلاع على خيارات USB الأخرى."</string>
+ <string name="extmedia_format_title" product="nosdcard" msgid="9020092196061007262">"â€ØªÙ‡ÙŠØ¦Ø© وحدة تخزين USBØŸ"</string>
+ <string name="extmedia_format_title" product="default" msgid="3648415921526526069">"â€Ù‡Ù„ تريد تنسيق بطاقة SDØŸ"</string>
+ <string name="extmedia_format_message" product="nosdcard" msgid="3934016853425761078">"â€Ø³ÙŠØªÙ… مسح جميع Ø§Ù„Ù…Ù„ÙØ§Øª المخزنة على وحدة تخزين USB. لا يمكن عكس هذا الإجراء!"</string>
<string name="extmedia_format_message" product="default" msgid="14131895027543830">"ستÙقد جميع البيانات على بطاقتك."</string>
<string name="extmedia_format_button_format" msgid="4131064560127478695">"تنسيق"</string>
- <string name="adb_active_notification_title" msgid="6729044778949189918">"تم توصيل تصحيح أخطاء USB"</string>
- <string name="adb_active_notification_message" msgid="1016654627626476142">"المس لتعطيل تصحيح أخطاء USB."</string>
+ <string name="adb_active_notification_title" msgid="6729044778949189918">"â€ØªÙ… توصيل تصحيح أخطاء USB"</string>
+ <string name="adb_active_notification_message" msgid="1016654627626476142">"â€Ø§Ù„مس لتعطيل تصحيح أخطاء USB."</string>
<string name="select_input_method" msgid="4653387336791222978">"اختيار أسلوب الإدخال"</string>
<string name="configure_input_methods" msgid="9091652157722495116">"إعداد أسلوب الإدخال"</string>
<string name="use_physical_keyboard" msgid="6203112478095117625">"لوحة Ù…ÙØ§ØªÙŠØ­ ÙØ¹Ù„ية"</string>
@@ -1271,29 +1278,29 @@
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" أ ب ت ث ج ح خ د ذ ر ز س ش ص ض ط ظ ع غ ٠ق ك ل م ن ه و ي"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789 أ ب ت ث ج ح خ د ذ ر ز س ش ص ض ط ظ ع غ ٠ق ك ل م ن ه و ي"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"العناصر المرشحة"</u></string>
- <string name="ext_media_checking_notification_title" product="nosdcard" msgid="3449816005351468560">"تحضير وحدة تخزين USB"</string>
- <string name="ext_media_checking_notification_title" product="default" msgid="5457603418970994050">"تحضير بطاقة SD"</string>
+ <string name="ext_media_checking_notification_title" product="nosdcard" msgid="3449816005351468560">"â€ØªØ­Ø¶ÙŠØ± وحدة تخزين USB"</string>
+ <string name="ext_media_checking_notification_title" product="default" msgid="5457603418970994050">"â€ØªØ­Ø¶ÙŠØ± بطاقة SD"</string>
<string name="ext_media_checking_notification_message" msgid="8287319882926737053">"التحقق من الأخطاء."</string>
- <string name="ext_media_nofs_notification_title" product="nosdcard" msgid="7788040745686229307">"وحدة تخزين USB ÙØ§Ø±ØºØ©"</string>
- <string name="ext_media_nofs_notification_title" product="default" msgid="780477838241212997">"بطاقة SD ÙØ§Ø±ØºØ©"</string>
- <string name="ext_media_nofs_notification_message" product="nosdcard" msgid="7840121067427269500">"وحدة تخزين USB ÙØ§Ø±ØºØ© أو تشتمل على نظام Ù…Ù„ÙØ§Øª غير معتمد."</string>
- <string name="ext_media_nofs_notification_message" product="default" msgid="8641065641786923604">"بطاقة SD ÙØ§Ø±ØºØ© أو تشتمل على نظام Ù…Ù„ÙØ§Øª غير معتمد."</string>
- <string name="ext_media_unmountable_notification_title" product="nosdcard" msgid="2090046769532713563">"وحدة تخزين USB ØªØ§Ù„ÙØ©"</string>
- <string name="ext_media_unmountable_notification_title" product="default" msgid="6410723906019100189">"بطاقة SD ØªØ§Ù„ÙØ©"</string>
- <string name="ext_media_unmountable_notification_message" product="nosdcard" msgid="1795917578395333280">"تعطلت وحدة تخزين USB. جرّب إعادة تنسيقها."</string>
- <string name="ext_media_unmountable_notification_message" product="default" msgid="1753898567525568253">"تعطلت بطاقة SD. جرّب إعادة تنسيقها."</string>
- <string name="ext_media_badremoval_notification_title" product="nosdcard" msgid="1661683031330951073">"تمت إزالة وحدة تخزين USB على غير المتوقع"</string>
- <string name="ext_media_badremoval_notification_title" product="default" msgid="6872152882604407837">"تمت إزالة بطاقة SD على نحو غير متوقع"</string>
- <string name="ext_media_badremoval_notification_message" product="nosdcard" msgid="4329848819865594241">"إلغاء تركيب وحدة تخزين USB قبل الإزالة لتجنب Ùقد البيانات."</string>
- <string name="ext_media_badremoval_notification_message" product="default" msgid="7260183293747448241">"ألغ تحميل بطاقة SD قبل الإزالة لتجنب Ùقدان البيانات."</string>
- <string name="ext_media_safe_unmount_notification_title" product="nosdcard" msgid="3967973893270360230">"يمكنك إزالة وحدة تخزين USB بشكل آمن"</string>
- <string name="ext_media_safe_unmount_notification_title" product="default" msgid="6729801130790616200">"يمكن إزالة بطاقة SD بأمان"</string>
- <string name="ext_media_safe_unmount_notification_message" product="nosdcard" msgid="6142195361606493530">"يمكنك إزالة وحدة تخزين USB بشكل آمن."</string>
- <string name="ext_media_safe_unmount_notification_message" product="default" msgid="568841278138377604">"يمكنك إزالة بطاقة SD بأمان."</string>
- <string name="ext_media_nomedia_notification_title" product="nosdcard" msgid="4486377230140227651">"تمت إزالة وحدة تخزين USB"</string>
- <string name="ext_media_nomedia_notification_title" product="default" msgid="8902518030404381318">"تمت إزالة بطاقة SD"</string>
- <string name="ext_media_nomedia_notification_message" product="nosdcard" msgid="6921126162580574143">"تمت إزالة وحدة تخزين USB. أدرج وسائط جديدة."</string>
- <string name="ext_media_nomedia_notification_message" product="default" msgid="3870120652983659641">"تمت إزالة بطاقة SD. أدخل بطاقة جديدة."</string>
+ <string name="ext_media_nofs_notification_title" product="nosdcard" msgid="7788040745686229307">"â€ÙˆØ­Ø¯Ø© تخزين USB ÙØ§Ø±ØºØ©"</string>
+ <string name="ext_media_nofs_notification_title" product="default" msgid="780477838241212997">"â€Ø¨Ø·Ø§Ù‚Ø© SD ÙØ§Ø±ØºØ©"</string>
+ <string name="ext_media_nofs_notification_message" product="nosdcard" msgid="7840121067427269500">"â€ÙˆØ­Ø¯Ø© تخزين USB ÙØ§Ø±ØºØ© أو تشتمل على نظام Ù…Ù„ÙØ§Øª غير معتمد."</string>
+ <string name="ext_media_nofs_notification_message" product="default" msgid="8641065641786923604">"â€Ø¨Ø·Ø§Ù‚Ø© SD ÙØ§Ø±ØºØ© أو تشتمل على نظام Ù…Ù„ÙØ§Øª غير معتمد."</string>
+ <string name="ext_media_unmountable_notification_title" product="nosdcard" msgid="2090046769532713563">"â€ÙˆØ­Ø¯Ø© تخزين USB ØªØ§Ù„ÙØ©"</string>
+ <string name="ext_media_unmountable_notification_title" product="default" msgid="6410723906019100189">"â€Ø¨Ø·Ø§Ù‚Ø© SD ØªØ§Ù„ÙØ©"</string>
+ <string name="ext_media_unmountable_notification_message" product="nosdcard" msgid="1795917578395333280">"â€ØªØ¹Ø·Ù„ت وحدة تخزين USB. جرّب إعادة تنسيقها."</string>
+ <string name="ext_media_unmountable_notification_message" product="default" msgid="1753898567525568253">"â€ØªØ¹Ø·Ù„ت بطاقة SD. جرّب إعادة تنسيقها."</string>
+ <string name="ext_media_badremoval_notification_title" product="nosdcard" msgid="1661683031330951073">"â€ØªÙ…ت إزالة وحدة تخزين USB على غير المتوقع"</string>
+ <string name="ext_media_badremoval_notification_title" product="default" msgid="6872152882604407837">"â€ØªÙ…ت إزالة بطاقة SD على نحو غير متوقع"</string>
+ <string name="ext_media_badremoval_notification_message" product="nosdcard" msgid="4329848819865594241">"â€Ø¥Ù„غاء تركيب وحدة تخزين USB قبل الإزالة لتجنب Ùقد البيانات."</string>
+ <string name="ext_media_badremoval_notification_message" product="default" msgid="7260183293747448241">"â€Ø£Ù„غ تحميل بطاقة SD قبل الإزالة لتجنب Ùقدان البيانات."</string>
+ <string name="ext_media_safe_unmount_notification_title" product="nosdcard" msgid="3967973893270360230">"â€ÙŠÙ…كنك إزالة وحدة تخزين USB بشكل آمن"</string>
+ <string name="ext_media_safe_unmount_notification_title" product="default" msgid="6729801130790616200">"â€ÙŠÙ…كن إزالة بطاقة SD بأمان"</string>
+ <string name="ext_media_safe_unmount_notification_message" product="nosdcard" msgid="6142195361606493530">"â€ÙŠÙ…كنك إزالة وحدة تخزين USB بشكل آمن."</string>
+ <string name="ext_media_safe_unmount_notification_message" product="default" msgid="568841278138377604">"â€ÙŠÙ…كنك إزالة بطاقة SD بأمان."</string>
+ <string name="ext_media_nomedia_notification_title" product="nosdcard" msgid="4486377230140227651">"â€ØªÙ…ت إزالة وحدة تخزين USB"</string>
+ <string name="ext_media_nomedia_notification_title" product="default" msgid="8902518030404381318">"â€ØªÙ…ت إزالة بطاقة SD"</string>
+ <string name="ext_media_nomedia_notification_message" product="nosdcard" msgid="6921126162580574143">"â€ØªÙ…ت إزالة وحدة تخزين USB. أدرج وسائط جديدة."</string>
+ <string name="ext_media_nomedia_notification_message" product="default" msgid="3870120652983659641">"â€ØªÙ…ت إزالة بطاقة SD. أدخل بطاقة جديدة."</string>
<string name="activity_list_empty" msgid="1675388330786841066">"لم يتم العثور على أي أنشطة متطابقة."</string>
<string name="permlab_pkgUsageStats" msgid="8787352074326748892">"تحديث إحصاءات استخدام المكون"</string>
<string name="permdesc_pkgUsageStats" msgid="1106612424254277630">"للسماح للتطبيق بتعديل إحصاءات استخدام المكون المجمّعة. ليس للاستخدام بواسطة التطبيقات العادية."</string>
@@ -1329,13 +1336,13 @@
<string name="wallpaper_binding_label" msgid="1240087844304687662">"الخلÙية"</string>
<string name="chooser_wallpaper" msgid="7873476199295190279">"تغيير الخلÙية"</string>
<string name="notification_listener_binding_label" msgid="2014162835481906429">"برنامج تلقّي الإشعارات الصوتية"</string>
- <string name="vpn_title" msgid="19615213552042827">"تم تنشيط الشبكة الظاهرية الخاصة (VPN)"</string>
- <string name="vpn_title_long" msgid="6400714798049252294">"تم تنشيط VPN بواسطة <xliff:g id="APP">%s</xliff:g>"</string>
+ <string name="vpn_title" msgid="19615213552042827">"â€ØªÙ… تنشيط الشبكة الظاهرية الخاصة (VPN)"</string>
+ <string name="vpn_title_long" msgid="6400714798049252294">"â€ØªÙ… تنشيط VPN بواسطة <xliff:g id="APP">%s</xliff:g>"</string>
<string name="vpn_text" msgid="3011306607126450322">"المس لإدارة الشبكة."</string>
<string name="vpn_text_long" msgid="6407351006249174473">"تم الاتصال بـ <xliff:g id="SESSION">%s</xliff:g>. المس لإدارة الشبكة."</string>
- <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"جار٠الاتصال بشبكة ظاهرية خاصة (VPN) دائمة التشغيل..."</string>
- <string name="vpn_lockdown_connected" msgid="8202679674819213931">"تم الاتصال بشبكة ظاهرية خاصة (VPN) دائمة التشغيل"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"خطأ بشبكة ظاهرية خاصة (VPN) دائمة التشغيل"</string>
+ <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"â€Ø¬Ø§Ø±Ù الاتصال بشبكة ظاهرية خاصة (VPN) دائمة التشغيل..."</string>
+ <string name="vpn_lockdown_connected" msgid="8202679674819213931">"â€ØªÙ… الاتصال بشبكة ظاهرية خاصة (VPN) دائمة التشغيل"</string>
+ <string name="vpn_lockdown_error" msgid="6009249814034708175">"â€Ø®Ø·Ø£ بشبكة ظاهرية خاصة (VPN) دائمة التشغيل"</string>
<string name="vpn_lockdown_config" msgid="6415899150671537970">"المس للتهيئة"</string>
<string name="upload_file" msgid="2897957172366730416">"اختيار ملÙ"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"لم يتم اختيار أي ملÙ"</string>
@@ -1359,18 +1366,18 @@
<item quantity="other" msgid="4641872797067609177">"<xliff:g id="INDEX">%d</xliff:g> من <xliff:g id="TOTAL">%d</xliff:g>"</item>
</plurals>
<string name="action_mode_done" msgid="7217581640461922289">"تم"</string>
- <string name="progress_unmounting" product="nosdcard" msgid="3923810448507612746">"جار٠إلغاء تحميل وحدة تخزين USB..."</string>
- <string name="progress_unmounting" product="default" msgid="1327894998409537190">"جار٠إلغاء تحميل بطاقة SD..."</string>
- <string name="progress_erasing" product="nosdcard" msgid="4521573321524340058">"جار٠محو وحدة تخزين USB..."</string>
- <string name="progress_erasing" product="default" msgid="6596988875507043042">"جار٠محو بطاقة SD..."</string>
- <string name="format_error" product="nosdcard" msgid="6299769563624776948">"تعذر مسح وحدة تخزين USB."</string>
- <string name="format_error" product="default" msgid="7315248696644510935">"تعذر مسح بطاقة SD."</string>
- <string name="media_bad_removal" msgid="7960864061016603281">"تمت إزالة بطاقة SD قبل أن يتم إلغاء تركيبها."</string>
- <string name="media_checking" product="nosdcard" msgid="418188720009569693">"يتم حاليًا التحقق من وحدة تخزين USB."</string>
- <string name="media_checking" product="default" msgid="7334762503904827481">"يتم الآن التحقق من بطاقة SD."</string>
- <string name="media_removed" msgid="7001526905057952097">"تمت إزالة بطاقة SD."</string>
- <string name="media_shared" product="nosdcard" msgid="5830814349250834225">"وحدة تخزين USB قيد الاستخدام بواسطة كمبيوتر حاليًا."</string>
- <string name="media_shared" product="default" msgid="5706130568133540435">"بطاقة SD قيد الاستخدام حاليًا بواسطة كمبيوتر."</string>
+ <string name="progress_unmounting" product="nosdcard" msgid="3923810448507612746">"â€Ø¬Ø§Ø±Ù إلغاء تحميل وحدة تخزين USB..."</string>
+ <string name="progress_unmounting" product="default" msgid="1327894998409537190">"â€Ø¬Ø§Ø±Ù إلغاء تحميل بطاقة SD..."</string>
+ <string name="progress_erasing" product="nosdcard" msgid="4521573321524340058">"â€Ø¬Ø§Ø±Ù محو وحدة تخزين USB..."</string>
+ <string name="progress_erasing" product="default" msgid="6596988875507043042">"â€Ø¬Ø§Ø±Ù محو بطاقة SD..."</string>
+ <string name="format_error" product="nosdcard" msgid="6299769563624776948">"â€ØªØ¹Ø°Ø± مسح وحدة تخزين USB."</string>
+ <string name="format_error" product="default" msgid="7315248696644510935">"â€ØªØ¹Ø°Ø± مسح بطاقة SD."</string>
+ <string name="media_bad_removal" msgid="7960864061016603281">"â€ØªÙ…ت إزالة بطاقة SD قبل أن يتم إلغاء تركيبها."</string>
+ <string name="media_checking" product="nosdcard" msgid="418188720009569693">"â€ÙŠØªÙ… حاليًا التحقق من وحدة تخزين USB."</string>
+ <string name="media_checking" product="default" msgid="7334762503904827481">"â€ÙŠØªÙ… الآن التحقق من بطاقة SD."</string>
+ <string name="media_removed" msgid="7001526905057952097">"â€ØªÙ…ت إزالة بطاقة SD."</string>
+ <string name="media_shared" product="nosdcard" msgid="5830814349250834225">"â€ÙˆØ­Ø¯Ø© تخزين USB قيد الاستخدام بواسطة كمبيوتر حاليًا."</string>
+ <string name="media_shared" product="default" msgid="5706130568133540435">"â€Ø¨Ø·Ø§Ù‚Ø© SD قيد الاستخدام حاليًا بواسطة كمبيوتر."</string>
<string name="media_unknown_state" msgid="729192782197290385">"وسائط خارجية ÙÙŠ حالة غير Ù…Ø¹Ø±ÙˆÙØ©."</string>
<string name="share" msgid="1778686618230011964">"مشاركة"</string>
<string name="find" msgid="4808270900322985960">"بحث"</string>
@@ -1414,6 +1421,7 @@
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"العالي"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
<string name="activitychooserview_choose_application" msgid="2125168057199941199">"اختيار تطبيق"</string>
+ <string name="activitychooserview_choose_application_error" msgid="8624618365481126668">"تعذر تشغيل <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="shareactionprovider_share_with" msgid="806688056141131819">"مشاركة مع"</string>
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"مشاركة مع <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"مقبض التمرير. المس مع الاستمرار."</string>
@@ -1435,20 +1443,20 @@
<string name="action_bar_home_description_format" msgid="7965984360903693903">"%1$s، %2$s"</string>
<string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s، %2$s، %3$s"</string>
<string name="storage_internal" msgid="4891916833657929263">"وحدة تخزين داخلية"</string>
- <string name="storage_sd_card" msgid="3282948861378286745">"بطاقة SD"</string>
- <string name="storage_usb" msgid="3017954059538517278">"وحدة تخزين USB"</string>
+ <string name="storage_sd_card" msgid="3282948861378286745">"â€Ø¨Ø·Ø§Ù‚Ø© SD"</string>
+ <string name="storage_usb" msgid="3017954059538517278">"â€ÙˆØ­Ø¯Ø© تخزين USB"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"تعديل"</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"تحذير استخدام البيانات"</string>
<string name="data_usage_warning_body" msgid="2814673551471969954">"المس لعرض الاستخدام والإعدادات."</string>
<string name="data_usage_3g_limit_title" msgid="7093334419518706686">"تم تعطيل بيانات شبكات الجيل الثاني والجيل الثالث"</string>
<string name="data_usage_4g_limit_title" msgid="7636489436819470761">"تم تعطيل بيانات شبكة الجيل الرابع"</string>
<string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"تم تعطيل بيانات الجوال"</string>
- <string name="data_usage_wifi_limit_title" msgid="8992154736441284865">"تم تعطيل بيانات Wi-Fi"</string>
+ <string name="data_usage_wifi_limit_title" msgid="8992154736441284865">"â€ØªÙ… تعطيل بيانات Wi-Fi"</string>
<string name="data_usage_limit_body" msgid="3317964706973601386">"المس للتمكين."</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"تم تجاوز حد بيانات شبكات 2G-3G"</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"تم تجاوز حد بيانات 4G"</string>
+ <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"â€ØªÙ… تجاوز حد بيانات شبكات 2G-3G"</string>
+ <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"â€ØªÙ… تجاوز حد بيانات 4G"</string>
<string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"تم تجاوز حد بيانات الجوال"</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"تم تجاوز حد بيانات شبكة Wi-Fi"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"â€ØªÙ… تجاوز حد بيانات شبكة Wi-Fi"</string>
<string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"<xliff:g id="SIZE">%s</xliff:g> Ùوق الحد المعين."</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"تم تقييد بيانات الخلÙية"</string>
<string name="data_usage_restricted_body" msgid="6741521330997452990">"المس لإزالة التقييد."</string>
@@ -1464,8 +1472,8 @@
<string name="expires_on" msgid="3676242949915959821">"تنتهي الصلاحية ÙÙŠ:"</string>
<string name="serial_number" msgid="758814067660862493">"الرقم المسلسل:"</string>
<string name="fingerprints" msgid="4516019619850763049">"بصمات الأصابع:"</string>
- <string name="sha256_fingerprint" msgid="4391271286477279263">"بصمة أصبع SHA-256:"</string>
- <string name="sha1_fingerprint" msgid="7930330235269404581">"بصمة أصبع SHA-1:"</string>
+ <string name="sha256_fingerprint" msgid="4391271286477279263">"â€Ø¨ØµÙ…Ø© أصبع SHA-256:"</string>
+ <string name="sha1_fingerprint" msgid="7930330235269404581">"â€Ø¨ØµÙ…Ø© أصبع SHA-1:"</string>
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"عرض الكل"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"اختيار نشاط"</string>
<string name="share_action_provider_share_with" msgid="5247684435979149216">"مشاركة مع"</string>
@@ -1491,9 +1499,9 @@
<string name="media_route_status_not_available" msgid="6739899962681886401">"غير متاح"</string>
<string name="media_route_status_in_use" msgid="4533786031090198063">"قيد الاستخدام"</string>
<string name="display_manager_built_in_display_name" msgid="2583134294292563941">"شاشة مدمجة"</string>
- <string name="display_manager_hdmi_display_name" msgid="1555264559227470109">"شاشة HDMI"</string>
+ <string name="display_manager_hdmi_display_name" msgid="1555264559227470109">"â€Ø´Ø§Ø´Ø© HDMI"</string>
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"المركب #<xliff:g id="ID">%1$d</xliff:g>"</string>
- <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>، <xliff:g id="DPI">%4$d</xliff:g> نقطة لكل بوصة"</string>
+ <string name="display_manager_overlay_display_title" msgid="652124517672257172">"â€<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>ØŒ <xliff:g id="DPI">%4$d</xliff:g> نقطة لكل بوصة"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">"آمن"</string>
<string name="wifi_display_notification_title" msgid="2223050649240326557">"تم التوصيل بشاشة لاسلكية"</string>
<string name="wifi_display_notification_message" msgid="4498802012464170685">"يتم عرض هذه الشاشة على جهاز آخر"</string>
@@ -1505,27 +1513,27 @@
<string name="kg_wrong_pin" msgid="1131306510833563801">"رقم تعري٠شخصي خاطئ"</string>
<string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"حاول مرة أخرى خلال <xliff:g id="NUMBER">%1$d</xliff:g> ثانية."</string>
<string name="kg_pattern_instructions" msgid="398978611683075868">"ارسم نقشك"</string>
- <string name="kg_sim_pin_instructions" msgid="2319508550934557331">"أدخل رقم التعري٠الشخصي لبطاقة SIM"</string>
- <string name="kg_pin_instructions" msgid="2377242233495111557">"أدخل رقم التعري٠الشخصي"</string>
+ <string name="kg_sim_pin_instructions" msgid="2319508550934557331">"â€Ø£Ø¯Ø®Ù„ رمز PIN لبطاقة SIM"</string>
+ <string name="kg_pin_instructions" msgid="2377242233495111557">"â€Ø£Ø¯Ø®Ù„ رمز PIN"</string>
<string name="kg_password_instructions" msgid="5753646556186936819">"أدخل كلمة المرور"</string>
- <string name="kg_puk_enter_puk_hint" msgid="453227143861735537">"بطاقة SIM معطلة الآن. أدخل رمز PUK للمتابعة. اتصل بمشغل شبكة الجوال للاطلاع على Ø§Ù„ØªÙØ§ØµÙŠÙ„."</string>
- <string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"إدخال رمز رقم التعري٠الشخصي المراد"</string>
- <string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"تأكيد رمز رقم التعري٠الشخصي المراد"</string>
- <string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"جار٠إلغاء تأمين بطاقة SIM…"</string>
- <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"رقم التعري٠الشخصي غير صحيح."</string>
- <string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"اكتب رقم التعري٠الشخصي المكون من 4 إلى 8 أرقام."</string>
- <string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"يجب أن يتضمن رمز PUK†8 أرقام أو أكثر."</string>
- <string name="kg_invalid_puk" msgid="3638289409676051243">"أعد إدخال رمز PUK الصحيح. وستؤدي المحاولات المتكررة إلى تعطيل بطاقة SIM نهائيًا."</string>
- <string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"لا يتطابق رمزا رقم التعري٠الشخصي"</string>
+ <string name="kg_puk_enter_puk_hint" msgid="453227143861735537">"â€Ø¨Ø·Ø§Ù‚Ø© SIM معطلة الآن. أدخل رمز PUK للمتابعة. اتصل بمشغل شبكة الجوال للاطلاع على Ø§Ù„ØªÙØ§ØµÙŠÙ„."</string>
+ <string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"â€Ø¥Ø¯Ø®Ø§Ù„ رمز رمز PIN المراد"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"â€ØªØ£ÙƒÙŠØ¯ رمز رمز PIN المراد"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"â€Ø¬Ø§Ø±Ù إلغاء تأمين بطاقة SIM…"</string>
+ <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"â€Ø±Ù…ز PIN غير صحيح."</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"â€Ø§ÙƒØªØ¨ رمز PIN المكون من 4 إلى 8 أرقام."</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"â€ÙŠØ¬Ø¨ أن يتضمن رمز PUK†8 أرقام أو أكثر."</string>
+ <string name="kg_invalid_puk" msgid="3638289409676051243">"â€Ø£Ø¹Ø¯ إدخال رمز PUK الصحيح. وستؤدي المحاولات المتكررة إلى تعطيل بطاقة SIM نهائيًا."</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"â€Ù„ا يتطابق رمزا رمز PIN"</string>
<string name="kg_login_too_many_attempts" msgid="6486842094005698475">"محاولات النقش كثيرة جدًا"</string>
- <string name="kg_login_instructions" msgid="1100551261265506448">"لإلغاء التأمين، سجّل الدخول بحسابك ÙÙŠ Google."</string>
+ <string name="kg_login_instructions" msgid="1100551261265506448">"â€Ù„إلغاء التأمين، سجّل الدخول بحسابك ÙÙŠ Google."</string>
<string name="kg_login_username_hint" msgid="5718534272070920364">"اسم المستخدم (البريد إلكتروني)"</string>
<string name="kg_login_password_hint" msgid="9057289103827298549">"كلمة المرور"</string>
<string name="kg_login_submit_button" msgid="5355904582674054702">"تسجيل الدخول"</string>
<string name="kg_login_invalid_input" msgid="5754664119319872197">"اسم مستخدم غير صحيح أو كلمة مرور غير صالحة."</string>
- <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"هل نسيت اسم المستخدم أو كلمة المرور؟\nانتقل إلى "<b>"google.com/accounts/recovery"</b>"."</string>
+ <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"â€Ù‡Ù„ نسيت اسم المستخدم أو كلمة المرور؟\nانتقل إلى "<b>"google.com/accounts/recovery"</b>"."</string>
<string name="kg_login_checking_password" msgid="1052685197710252395">"Ø¬Ø§Ø±Ù ÙØ­Øµ الحساب…"</string>
- <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"لقد كتبت رقم التعري٠الشخصي بشكل غير صحيح <xliff:g id="NUMBER_0">%d</xliff:g> مرة. \n\nأعد المحاولة خلال <xliff:g id="NUMBER_1">%d</xliff:g> ثانية."</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"â€Ù„قد كتبت رمز PIN بشكل غير صحيح <xliff:g id="NUMBER_0">%d</xliff:g> مرة. \n\nأعد المحاولة خلال <xliff:g id="NUMBER_1">%d</xliff:g> ثانية."</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"لقد كتبت كلمة المرور بشكل غير صحيح <xliff:g id="NUMBER_0">%d</xliff:g> مرة. \n\nأعد المحاولة خلال <xliff:g id="NUMBER_1">%d</xliff:g> ثانية."</string>
<string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"لقد رسمت نقش إلغاء التأمين بطريقة غير صحيحة <xliff:g id="NUMBER_0">%d</xliff:g> مرة. \n\nأعد المحاولة خلال <xliff:g id="NUMBER_1">%d</xliff:g> ثانية."</string>
<string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1575557200627128949">"لقد حاولت إلغاء تأمين الجهاز اللوحي بشكل غير صحيح <xliff:g id="NUMBER_0">%d</xliff:g> مرة. بعد إجراء <xliff:g id="NUMBER_1">%d</xliff:g> من المحاولات غير الناجحة الأخرى، ستتم إعادة تعيين الجهاز اللوحي على الإعدادات Ø§Ù„Ø§ÙØªØ±Ø§Ø¶ÙŠØ© للمصنع وسيتم Ùقد جميع بيانات المستخدم."</string>
@@ -1635,19 +1643,30 @@
<string name="reason_service_unavailable" msgid="7824008732243903268">"خدمة الطباعة ليست ممكّنة"</string>
<string name="print_service_installed_title" msgid="2246317169444081628">"تم تثبيت خدمة <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="print_service_installed_message" msgid="5897362931070459152">"انقر للتمكين."</string>
- <string name="restr_pin_enter_admin_pin" msgid="783643731895143970">"أدخل رقم التعري٠الشخصي للمشرÙ"</string>
- <string name="restr_pin_enter_pin" msgid="3395953421368476103">"إدخال رقم التعري٠الشخصي"</string>
+ <string name="restr_pin_enter_admin_pin" msgid="783643731895143970">"â€Ø£Ø¯Ø®Ù„ رمز PIN للمشرÙ"</string>
+ <string name="restr_pin_enter_pin" msgid="3395953421368476103">"â€Ø¥Ø¯Ø®Ø§Ù„ رمز PIN"</string>
<string name="restr_pin_incorrect" msgid="8571512003955077924">"غير صحيح"</string>
- <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"رقم التعري٠الشخصي الحالي"</string>
- <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"رقم التعري٠الشخصي الجديد"</string>
- <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"تأكيد رقم التعري٠الشخصي الجديد"</string>
+ <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"â€Ø±Ù…ز PIN الحالي"</string>
+ <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"â€Ø±Ù…ز PIN الجديد"</string>
+ <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"â€ØªØ£ÙƒÙŠØ¯ رمز PIN الجديد"</string>
<string name="restr_pin_create_pin" msgid="8017600000263450337">"إنشاء رقم تعري٠شخصي لتعديل القيود"</string>
<string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"أرقام التعري٠الشخصية لا تتطابق، أعد المحاولة."</string>
- <string name="restr_pin_error_too_short" msgid="8173982756265777792">"رقم التعري٠الشخصي أقصر مما يلزم، يجب ألا يقل عن 4 أرقام. "</string>
+ <string name="restr_pin_error_too_short" msgid="8173982756265777792">"â€Ø±Ù…ز PIN أقصر مما يلزم، يجب ألا يقل عن 4 أرقام. "</string>
<plurals name="restr_pin_countdown">
<item quantity="one" msgid="311050995198548675">"أعد المحاولة خلال ثانية واحدة."</item>
<item quantity="other" msgid="4730868920742952817">"أعد المحاولة خلال <xliff:g id="COUNT">%d</xliff:g> ثانية"</item>
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"أعد المحاولة لاحقًا"</string>
<string name="immersive_mode_confirmation" msgid="7227416894979047467">"مرر بسرعة من أعلى لأسÙÙ„ للخروج من وضع ملء الشاشة."</string>
+ <string name="done_label" msgid="2093726099505892398">"تم"</string>
+ <string name="hour_picker_description" msgid="6698199186859736512">"شريط التمرير الدائري للساعات"</string>
+ <string name="minute_picker_description" msgid="8606010966873791190">"شريط التمرير الدائري للدقائق"</string>
+ <string name="select_hours" msgid="6043079511766008245">"تحديد الساعات"</string>
+ <string name="select_minutes" msgid="3974345615920336087">"تحديد الدقائق"</string>
+ <string name="day_picker_description" msgid="8990847925961297968">"شبكة الشهر مكونة من الأيام"</string>
+ <string name="year_picker_description" msgid="5524331207436052403">"قائمة الأعوام"</string>
+ <string name="select_day" msgid="7774759604701773332">"تحديد الشهر واليوم"</string>
+ <string name="select_year" msgid="7952052866994196170">"تحديد العام"</string>
+ <string name="item_is_selected" msgid="949687401682476608">"تم تحديد <xliff:g id="ITEM">%1$s</xliff:g>"</string>
+ <string name="deleted_key" msgid="7659477886625566590">"تم حذ٠<xliff:g id="KEY">%1$s</xliff:g>"</string>
</resources>
diff --git a/core/res/res/values-az-rAZ/strings.xml b/core/res/res/values-az-rAZ/strings.xml
new file mode 100644
index 0000000..479cfcf
--- /dev/null
+++ b/core/res/res/values-az-rAZ/strings.xml
@@ -0,0 +1,1591 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="byteShort" msgid="8340973892742019101">"B"</string>
+ <string name="kilobyteShort" msgid="5973789783504771878">"KB"</string>
+ <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
+ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
+ <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
+ <string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
+ <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string>
+ <string name="untitled" msgid="4638956954852782576">"Başlıqsız"</string>
+ <string name="ellipsis" msgid="7899829516048813237">"..."</string>
+ <string name="ellipsis_two_dots" msgid="1228078994866030736">"‥"</string>
+ <string name="emptyPhoneNumber" msgid="7694063042079676517">"(Telefon nömrəsi yoxdur)"</string>
+ <string name="unknownName" msgid="2277556546742746522">"(Naməlum)"</string>
+ <string name="defaultVoiceMailAlphaTag" msgid="2660020990097733077">"Səsli poçt"</string>
+ <string name="defaultMsisdnAlphaTag" msgid="2850889754919584674">"MSISDN1"</string>
+ <string name="mmiError" msgid="5154499457739052907">"Bağlantı problemi və ya yalnış MM kodu."</string>
+ <string name="mmiFdnError" msgid="5224398216385316471">"ÆmÉ™liyyat yalnız sabit nömrÉ™lÉ™rÉ™ yığımla mÉ™hdudlaşıb."</string>
+ <string name="serviceEnabled" msgid="8147278346414714315">"Servis işə salındı."</string>
+ <string name="serviceEnabledFor" msgid="6856228140453471041">"Xidmət aktiv edilmişdir:"</string>
+ <string name="serviceDisabled" msgid="1937553226592516411">"Xidmət deaktiv edilib."</string>
+ <string name="serviceRegistered" msgid="6275019082598102493">"Qeydiyyat uÄŸurlu oldu."</string>
+ <string name="serviceErased" msgid="1288584695297200972">"SilinmÉ™ uÄŸurlu olmuÅŸdur."</string>
+ <string name="passwordIncorrect" msgid="7612208839450128715">"Yanlış parol"</string>
+ <string name="mmiComplete" msgid="8232527495411698359">"MMI tamamdır."</string>
+ <string name="badPin" msgid="9015277645546710014">"Daxil etdiyiniz köhnə PİN düzgün deyil."</string>
+ <string name="badPuk" msgid="5487257647081132201">"Daxil etdiyiniz PUK düzgün deyil."</string>
+ <string name="mismatchPin" msgid="609379054496863419">"Daxil etdiyiniz PİN kodlar uyğun gəlmir."</string>
+ <string name="invalidPin" msgid="3850018445187475377">"4-dən 8-ə qədər rəqəmi olan PIN yazın."</string>
+ <string name="invalidPuk" msgid="8761456210898036513">"8 və daha çox rəqəmi olan PUK yazın."</string>
+ <string name="needPuk" msgid="919668385956251611">"Sizin SİM kart PUK ilə kilidlənib. Onu açmaq üçün PUK kodu yazın."</string>
+ <string name="needPuk2" msgid="4526033371987193070">"SIM kartın kilidini açmaq üçün PUK2 yazın"</string>
+ <string name="imei" msgid="2625429890869005782">"IMEI"</string>
+ <string name="meid" msgid="4841221237681254195">"MEID"</string>
+ <string name="ClipMmi" msgid="6952821216480289285">"Daxil olan zəng edənin ID\'si"</string>
+ <string name="ClirMmi" msgid="7784673673446833091">"Gedən Zəng ID"</string>
+ <string name="CfMmi" msgid="5123218989141573515">"Zəng yönləndirmə"</string>
+ <string name="CwMmi" msgid="9129678056795016867">"Zəng gözləyir"</string>
+ <string name="BaMmi" msgid="455193067926770581">"Zəng qadağası"</string>
+ <string name="PwdMmi" msgid="7043715687905254199">"Parolu dəyiş"</string>
+ <string name="PinMmi" msgid="3113117780361190304">"PİN dəyişmək"</string>
+ <string name="CnipMmi" msgid="3110534680557857162">"Hazırdakı nömrəyə zəng edilir"</string>
+ <string name="CnirMmi" msgid="3062102121430548731">"Zənglərin sayı məhdudlaşdırılıb"</string>
+ <string name="ThreeWCMmi" msgid="9051047170321190368">"Üç yollu zəng"</string>
+ <string name="RuacMmi" msgid="7827887459138308886">"Xoşagəlməz zənglərdən imtina"</string>
+ <string name="CndMmi" msgid="3116446237081575808">"Çatdırılma zəngi"</string>
+ <string name="DndMmi" msgid="1265478932418334331">"Narahat etməyin"</string>
+ <string name="CLIRDefaultOnNextCallOn" msgid="429415409145781923">"Adətən zəng edənin ID\'si məhdudlaşdırılır. Növbəti zəng: Məhdudlaşdırılıb"</string>
+ <string name="CLIRDefaultOnNextCallOff" msgid="3092918006077864624">"Adətən zəng edənin ID\'si məhdudlaşdırılır. Növbəti zəng: Məhdudlaşdırılmayıb"</string>
+ <string name="CLIRDefaultOffNextCallOn" msgid="6179425182856418465">"Adətən zəng edənin ID\'si məhdudlaşdırılmır. Növbəti zəng: Məhdudlaşdırılıb"</string>
+ <string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"Adətən zəng edənin ID\'si məhdudlaşdırılmır. Növbəti zəng: Məhdudlaşdırılmayıb"</string>
+ <string name="serviceNotProvisioned" msgid="8614830180508686666">"Xidmət təmin edilməyib."</string>
+ <string name="CLIRPermanent" msgid="3377371145926835671">"Siz zəng edənin ID nizamlarını dəyişə bilməzsiz."</string>
+ <string name="RestrictedChangedTitle" msgid="5592189398956187498">"Məhdudlaşdırılmış keçid dəyişdi"</string>
+ <string name="RestrictedOnData" msgid="8653794784690065540">"Data xidmət bağlıdır."</string>
+ <string name="RestrictedOnEmergency" msgid="6581163779072833665">"Təcili xidmət bağlıdır."</string>
+ <string name="RestrictedOnNormal" msgid="4953867011389750673">"Səs xidməti bağlıdır."</string>
+ <string name="RestrictedOnAllVoice" msgid="3396963652108151260">"Bütün Səs xidmətləri bağlıdır"</string>
+ <string name="RestrictedOnSms" msgid="8314352327461638897">"SMS xidməti bloklanıb."</string>
+ <string name="RestrictedOnVoiceData" msgid="996636487106171320">"Səs/data xidmətləri bloklanıb."</string>
+ <string name="RestrictedOnVoiceSms" msgid="1888588152792023873">"Səs/SMS xidmətləri bloklanıb."</string>
+ <string name="RestrictedOnAll" msgid="5643028264466092821">"Bütün səs/data/SMS xidmətləri bağlıdır."</string>
+ <string name="serviceClassVoice" msgid="1258393812335258019">"Səs"</string>
+ <string name="serviceClassData" msgid="872456782077937893">"Məlumat"</string>
+ <string name="serviceClassFAX" msgid="5566624998840486475">"FAKS"</string>
+ <string name="serviceClassSMS" msgid="2015460373701527489">"SMS"</string>
+ <string name="serviceClassDataAsync" msgid="4523454783498551468">"Async"</string>
+ <string name="serviceClassDataSync" msgid="7530000519646054776">"Sinx"</string>
+ <string name="serviceClassPacket" msgid="6991006557993423453">"Paket"</string>
+ <string name="serviceClassPAD" msgid="3235259085648271037">"PAD"</string>
+ <string name="roamingText0" msgid="7170335472198694945">"Rominq göstəricisi işləkdir"</string>
+ <string name="roamingText1" msgid="5314861519752538922">"Rominq göstəricisi işlək deyil"</string>
+ <string name="roamingText2" msgid="8969929049081268115">"Rominq göstəricisi yanır"</string>
+ <string name="roamingText3" msgid="5148255027043943317">"Qonşuluqdan Kənar"</string>
+ <string name="roamingText4" msgid="8808456682550796530">"Binadan kənar"</string>
+ <string name="roamingText5" msgid="7604063252850354350">"Rominq - Arzuolunan sistem"</string>
+ <string name="roamingText6" msgid="2059440825782871513">"Rominq - Mümkün sistem"</string>
+ <string name="roamingText7" msgid="7112078724097233605">"Rominq - Alyans partnyoru"</string>
+ <string name="roamingText8" msgid="5989569778604089291">"Rominq - Premium partnyor"</string>
+ <string name="roamingText9" msgid="7969296811355152491">"Rouminq - Tam Xidmət Funksionallığı"</string>
+ <string name="roamingText10" msgid="3992906999815316417">"Rouminq - Qismən Xidmət Funksionallığı"</string>
+ <string name="roamingText11" msgid="4154476854426920970">"Rouminq Banneri Açıqdır"</string>
+ <string name="roamingText12" msgid="1189071119992726320">"Roaming Banner Off"</string>
+ <string name="roamingTextSearching" msgid="8360141885972279963">"Xidmət axtarılır"</string>
+ <string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Yönləndirilmədi"</string>
+ <string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
+ <string name="cfTemplateForwardedTime" msgid="9206251736527085256">"<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> saniyÉ™ sonra"</string>
+ <string name="cfTemplateRegistered" msgid="5073237827620166285">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Yönləndirilmədi"</string>
+ <string name="cfTemplateRegisteredTime" msgid="6781621964320635172">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Yönləndirilmədi"</string>
+ <string name="fcComplete" msgid="3118848230966886575">"Özəllik kodu tamamlandı."</string>
+ <string name="fcError" msgid="3327560126588500777">"ÆlaqÉ™ problemi vÉ™ ya yanlış funksiya kodu."</string>
+ <string name="httpErrorOk" msgid="1191919378083472204">"OK"</string>
+ <string name="httpError" msgid="7956392511146698522">"Şəbəkə xətası var idi."</string>
+ <string name="httpErrorLookup" msgid="4711687456111963163">"URL tapıla bilmədi."</string>
+ <string name="httpErrorUnsupportedAuthScheme" msgid="6299980280442076799">"Sayt autentifikasiya sxemi dəstəklənmir."</string>
+ <string name="httpErrorAuth" msgid="1435065629438044534">"Təsdiq edilə bilmədi."</string>
+ <string name="httpErrorProxyAuth" msgid="1788207010559081331">"Proksi server vasitəsilə təsdiqlənmə uğursuz oldu."</string>
+ <string name="httpErrorConnect" msgid="8714273236364640549">"Serverə qoşula bilmədi."</string>
+ <string name="httpErrorIO" msgid="2340558197489302188">"Serverlə əlaqə alınmadı. Sonra cəhd edin."</string>
+ <string name="httpErrorTimeout" msgid="4743403703762883954">"Server ilə olan əlaqə zaman aşımına məruz qaldı."</string>
+ <string name="httpErrorRedirectLoop" msgid="8679596090392779516">"Bu səhifədə həddindən çox server yönləndirilmələri var."</string>
+ <string name="httpErrorUnsupportedScheme" msgid="5015730812906192208">"Protokol dəstəklənmir."</string>
+ <string name="httpErrorFailedSslHandshake" msgid="96549606000658641">"Güvənli bağlantı yaradıla bilmədi."</string>
+ <string name="httpErrorBadUrl" msgid="3636929722728881972">"URL yanlış olduğu üçün səhifəni açmaq mümkün olmadı."</string>
+ <string name="httpErrorFile" msgid="2170788515052558676">"Fayla giriş baş tutmadı."</string>
+ <string name="httpErrorFileNotFound" msgid="6203856612042655084">"Tələb olunan fayl tapılmadı."</string>
+ <string name="httpErrorTooManyRequests" msgid="1235396927087188253">"Həddindən çox sorğu işlənilir. Daha sonra yoxlayın."</string>
+ <string name="notification_title" msgid="8967710025036163822">"<xliff:g id="ACCOUNT">%1$s</xliff:g> üçün giriş xətası"</string>
+ <string name="contentServiceSync" msgid="8353523060269335667">"Sinxronlaşdırma"</string>
+ <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Sinxronlaşdırma"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Həddindən çox <xliff:g id="CONTENT_TYPE">%s</xliff:g> silinmələri var."</string>
+ <string name="low_memory" product="tablet" msgid="6494019234102154896">"Planşetin yaddaşı doludur. Boş yer üçün bəzi faylları silin."</string>
+ <string name="low_memory" product="default" msgid="3475999286680000541">"Telefonun yaddaşı doludur. Boş yer üçün bəzi faylları silin."</string>
+ <string name="me" msgid="6545696007631404292">"Mən"</string>
+ <string name="power_dialog" product="tablet" msgid="8545351420865202853">"Planşet seçimləri"</string>
+ <string name="power_dialog" product="default" msgid="1319919075463988638">"Telefon seçimləri"</string>
+ <string name="silent_mode" msgid="7167703389802618663">"Səssiz rejim"</string>
+ <string name="turn_on_radio" msgid="3912793092339962371">"Simsizi işə salın"</string>
+ <string name="turn_off_radio" msgid="8198784949987062346">"Simsiz rabitəni söndürün"</string>
+ <string name="screen_lock" msgid="799094655496098153">"Ekran kilidi"</string>
+ <string name="power_off" msgid="4266614107412865048">"Söndür"</string>
+ <string name="silent_mode_silent" msgid="319298163018473078">"Zəng deaktivdir"</string>
+ <string name="silent_mode_vibrate" msgid="7072043388581551395">"Zəng vibrasiyadadır"</string>
+ <string name="silent_mode_ring" msgid="8592241816194074353">"Zəngvuran açıqdır"</string>
+ <string name="shutdown_progress" msgid="2281079257329981203">"Söndürülür..."</string>
+ <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Planşetiniz sönəcək."</string>
+ <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Telefonunuz sönəcək."</string>
+ <string name="shutdown_confirm_question" msgid="2906544768881136183">"Söndürmək istəyirsiz?"</string>
+ <string name="reboot_safemode_title" msgid="7054509914500140361">"Təhlükəsiz rejimdə yenidən başlayın"</string>
+ <string name="reboot_safemode_confirm" msgid="55293944502784668">"Təhlükəsiz rejimdə yenidən başlamaq istəyirsiniz mi? Bu, quraşdırdığınız bütün üçüncü tərəf tətbiqlərini deaktiv edəcək."</string>
+ <string name="recent_tasks_title" msgid="3691764623638127888">"Son"</string>
+ <string name="no_recent_tasks" msgid="8794906658732193473">"Heç bir son tətbiq yoxdur."</string>
+ <string name="global_actions" product="tablet" msgid="408477140088053665">"Planşet seçimləri"</string>
+ <string name="global_actions" product="default" msgid="2406416831541615258">"Telefon seçimləri"</string>
+ <string name="global_action_lock" msgid="2844945191792119712">"Ekran kilidi"</string>
+ <string name="global_action_power_off" msgid="4471879440839879722">"Söndür"</string>
+ <string name="global_action_bug_report" msgid="7934010578922304799">"Baq hesabatı"</string>
+ <string name="bugreport_title" msgid="2667494803742548533">"Baqı xəbər verin"</string>
+ <string name="bugreport_message" msgid="398447048750350456">"Bu, sizin hazırkı cihaz durumu haqqında məlumat toplayacaq ki, elektron məktub şəklində göndərsin. Baq raportuna başlamaq üçün bir az vaxt lazım ola bilər, bir az səbr edin."</string>
+ <string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Səssiz rejim"</string>
+ <string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"Səs qapalıdır"</string>
+ <string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"Səs Aktivdir"</string>
+ <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Təyyarə rejimi"</string>
+ <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Uçuş rejimi açıqdır"</string>
+ <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Təyyarə rejimi qapalıdır"</string>
+ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
+ <string name="safeMode" msgid="2788228061547930246">"Təhlükəsiz rejim"</string>
+ <string name="android_system_label" msgid="6577375335728551336">"Android sistemi"</string>
+ <string name="permgrouplab_costMoney" msgid="5429808217861460401">"Ödənişli xidmətlər"</string>
+ <string name="permgroupdesc_costMoney" msgid="3293301903409869495">"Xərc tutulacaq əməliyyatlar edir"</string>
+ <string name="permgrouplab_messages" msgid="7521249148445456662">"Sizin mesajlarınız"</string>
+ <string name="permgroupdesc_messages" msgid="7821999071003699236">"SMS, elektron poçt və digər mesajları oxuyur və yazır."</string>
+ <string name="permgrouplab_personalInfo" msgid="3519163141070533474">"Şəxsi məlumatınız"</string>
+ <string name="permgroupdesc_personalInfo" msgid="8426453129788861338">"Kontakt kartınızda saxlanılan məlumatlarınıza birbaşa giriş."</string>
+ <string name="permgrouplab_socialInfo" msgid="5799096623412043791">"Sosial məlumatınız"</string>
+ <string name="permgroupdesc_socialInfo" msgid="7129842457611643493">"Kontaktlarınız və sosial əlaqələriniz haqqında məlumata birbaşa giriş."</string>
+ <string name="permgrouplab_location" msgid="635149742436692049">"Yerləşməniz"</string>
+ <string name="permgroupdesc_location" msgid="5704679763124170100">"Fiziki adresinizi monitorinq edir."</string>
+ <string name="permgrouplab_network" msgid="5808983377727109831">"Şəbəkə kommunikasiyası"</string>
+ <string name="permgroupdesc_network" msgid="4478299413241861987">"Müxtəlif şəbəkə xüsusiyyətlərinə daxil ol."</string>
+ <string name="permgrouplab_bluetoothNetwork" msgid="1585403544162128109">"Bluetooth"</string>
+ <string name="permgroupdesc_bluetoothNetwork" msgid="5625288577164282391">"Bluetooth üzərindən cihazlara və şəbəkələrə daxil ol."</string>
+ <string name="permgrouplab_audioSettings" msgid="8329261670151871235">"Audio Ayarlar"</string>
+ <string name="permgroupdesc_audioSettings" msgid="2641515403347568130">"Audio ayarları dəyişin."</string>
+ <string name="permgrouplab_affectsBattery" msgid="6209246653424798033">"Batareyaya təsir edir"</string>
+ <string name="permgroupdesc_affectsBattery" msgid="6441275320638916947">"Batareyanızın tez qurtarmasına səbəb olan funksiyalar istifadə edir"</string>
+ <string name="permgrouplab_calendar" msgid="5863508437783683902">"Təqvim"</string>
+ <string name="permgroupdesc_calendar" msgid="5777534316982184416">"Təqvimə və tədbirlərə birbaşa giriş."</string>
+ <string name="permgrouplab_dictionary" msgid="4148597128843641379">"İstifadəçi Lüğətini Oxu"</string>
+ <string name="permgroupdesc_dictionary" msgid="7921166355964764490">"İstifadəçi lüğətindəki sözləri oxuyur."</string>
+ <string name="permgrouplab_writeDictionary" msgid="8090237702432576788">"İstifadəçi Lüğətini Yaz"</string>
+ <string name="permgroupdesc_writeDictionary" msgid="2711561994497361646">"İstifadəçi lüğətinə sözlər əlavə edin."</string>
+ <string name="permgrouplab_bookmarks" msgid="1949519673103968229">"ÆlfÉ™cinlÉ™r vÉ™ Tarixçə"</string>
+ <string name="permgroupdesc_bookmarks" msgid="4169771606257963028">"ÆlfÉ™cinlÉ™rÉ™ vÉ™ brauzer tarixinÉ™ birbaÅŸa icazÉ™."</string>
+ <string name="permgrouplab_deviceAlarms" msgid="6117704629728824101">"Zəng"</string>
+ <string name="permgroupdesc_deviceAlarms" msgid="4769356362251641175">"Alarm qur."</string>
+ <string name="permgrouplab_voicemail" msgid="4162237145027592133">"Səsli poçt"</string>
+ <string name="permgroupdesc_voicemail" msgid="2498403969862951393">"Səs poçtuna birbaşa çıxış."</string>
+ <string name="permgrouplab_microphone" msgid="171539900250043464">"Mikrofon"</string>
+ <string name="permgroupdesc_microphone" msgid="7106618286905738408">"Audio yazmaq üçün mikrofona birbaşa giriş."</string>
+ <string name="permgrouplab_camera" msgid="4820372495894586615">"Kamera"</string>
+ <string name="permgroupdesc_camera" msgid="2933667372289567714">"Şəkil və ya video çəkmək üçün kameraya birbaşa çıxış."</string>
+ <string name="permgrouplab_screenlock" msgid="8275500173330718168">"Ekran kilidi"</string>
+ <string name="permgroupdesc_screenlock" msgid="7067497128925499401">"Cihazınızdakı kilid ekranının hərəkətinə təsir etmə bacarığı"</string>
+ <string name="permgrouplab_appInfo" msgid="8028789762634147725">"Tətbiq məlumatlarınız"</string>
+ <string name="permgroupdesc_appInfo" msgid="3950378538049625907">"Cihazınızdakı digər tətbiqlərin davranışına təsir etmək bacarığı."</string>
+ <string name="permgrouplab_wallpaper" msgid="3850280158041175998">"Divar kağızı"</string>
+ <string name="permgroupdesc_wallpaper" msgid="5630417854750540154">"Cihazın divar kağızı ayarlarını dəyişin."</string>
+ <string name="permgrouplab_systemClock" msgid="406535759236612992">"Saat"</string>
+ <string name="permgroupdesc_systemClock" msgid="3944359833624094992">"Cihazın vaxt və zaman zolağını dəyişir."</string>
+ <string name="permgrouplab_statusBar" msgid="2095862568113945398">"Status paneli"</string>
+ <string name="permgroupdesc_statusBar" msgid="6242593432226807171">"Cihazın status paneli ayarlarınızı dəyişir."</string>
+ <string name="permgrouplab_syncSettings" msgid="3341990986147826541">"Sinx Ayarları"</string>
+ <string name="permgroupdesc_syncSettings" msgid="7603195265129031797">"Sinxronizasiya nizamlarına çıxış."</string>
+ <string name="permgrouplab_accounts" msgid="3359646291125325519">"Hesablarınız"</string>
+ <string name="permgroupdesc_accounts" msgid="4948732641827091312">"Ælçatımlı hesablara daxil olun."</string>
+ <string name="permgrouplab_hardwareControls" msgid="7998214968791599326">"Hardware kontrolları"</string>
+ <string name="permgroupdesc_hardwareControls" msgid="4357057861225462702">"Dəstəkdəki avadanlığa birbaşa giriş."</string>
+ <string name="permgrouplab_phoneCalls" msgid="9067173988325865923">"Telefon zəngləri"</string>
+ <string name="permgroupdesc_phoneCalls" msgid="7489701620446183770">"Telefon zənglərinə nəzarət edin, qeydə alın və idarə edin."</string>
+ <string name="permgrouplab_systemTools" msgid="4652191644082714048">"Sistem alətləri"</string>
+ <string name="permgroupdesc_systemTools" msgid="8162102602190734305">"Aşağı səviyyəli çıxış və sistem idarəetməsi."</string>
+ <string name="permgrouplab_developmentTools" msgid="3446164584710596513">"İnkişaf alətləri"</string>
+ <string name="permgroupdesc_developmentTools" msgid="7058828032358142018">"Özəlliklər yalnız tətbiq developerləri üçün lazımdır."</string>
+ <string name="permgrouplab_display" msgid="4279909676036402636">"Digər tətbiq İstifadəçi İnterfeysi"</string>
+ <string name="permgroupdesc_display" msgid="6051002031933013714">"Digər tətbiqlərin İstifadəçi İnterfeysinə təsir edir."</string>
+ <string name="permgrouplab_storage" msgid="1971118770546336966">"YaddaÅŸ"</string>
+ <string name="permgroupdesc_storage" product="nosdcard" msgid="7442318502446874999">"USB yaddaÅŸa daxil ol."</string>
+ <string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"SD karta daxil ol."</string>
+ <string name="permgrouplab_accessibilityFeatures" msgid="7919025602283593907">"Ælçatımlılıq funksiyaları"</string>
+ <string name="permgroupdesc_accessibilityFeatures" msgid="4205196881678144335">"Yardımçı texnologiya tələb edə biləcəyi funksiyalar."</string>
+ <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Pəncərənin məzmununu əldə edin"</string>
+ <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"ÆlaqÉ™dÉ™ olduÄŸunuz pÉ™ncÉ™rÉ™nin mÉ™zmununu nÉ™zÉ™rdÉ™n keçirin."</string>
+ <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Toxunaraq Kəşf et funksiyasını yandırın"</string>
+ <string name="capability_desc_canRequestTouchExploration" msgid="5800552516779249356">"Toxunulan hissələr səsləndiriləcək və ekran jestlərlə idarə oluna biləcək."</string>
+ <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"İnkişaf etmiş veb əlçatımlılığı yandırın"</string>
+ <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Skriptlər tətbiq məzmununun daha əlçatımlı olması üçün quraşdırıla bilər."</string>
+ <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Yazdığınız mətni izləyin"</string>
+ <string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Kredit kartı nömrələri və parollar kimi şəxsi məlumatlar daxildir."</string>
+ <string name="permlab_statusBar" msgid="7417192629601890791">"status panelini deaktivləşdir və ya dəyişdir"</string>
+ <string name="permdesc_statusBar" msgid="8434669549504290975">"Tətbiqə status panelini deaktiv etməyə və ya sistem ikonalarını əlavə etmək və ya silmək imkanı verir."</string>
+ <string name="permlab_statusBarService" msgid="7247281911387931485">"status paneli"</string>
+ <string name="permdesc_statusBarService" msgid="716113660795976060">"Tətbiqə status paneli olmağa imkan verir."</string>
+ <string name="permlab_expandStatusBar" msgid="1148198785937489264">"status panelini genişlətmək və ya yığmaq"</string>
+ <string name="permdesc_expandStatusBar" msgid="6917549437129401132">"Tətbiqə status panelini genişləndirməyə və ya yox etməyə imkan verir."</string>
+ <string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"gedən zənglərin marşrutunu dəyişmək"</string>
+ <string name="permdesc_processOutgoingCalls" msgid="5331318931937402040">"Tətbiqə zəng etməyə və zəng edilən nömrəni dəyişməyə imkan verir. Zərərli tətbiqlər bundan istifadə edərək gedən zəngləri izləyə, yönləndirə və ya qarşısını ala bilər."</string>
+ <string name="permlab_receiveSms" msgid="8673471768947895082">"SMS qəbul etmək"</string>
+ <string name="permdesc_receiveSms" msgid="6424387754228766939">"Tətbiqə MMS mesajlarını almaq və emal etmək icazəsi verir. Bu o deməkdir ki, tətbiq sizin mesajlarınızı sizə göstərmədən monitorinq edə və ya silə bilər."</string>
+ <string name="permlab_receiveMms" msgid="1821317344668257098">"mətn mesajlarını qəbul edir (MMS)"</string>
+ <string name="permdesc_receiveMms" msgid="533019437263212260">"Tətbiqə MMS mesajlarını qəbul və emal üçün imkan verir. Bu o deməkdir ki, bu tətbiq sizə göstərmədən cihazınıza göndərilən mesajları silə bilər."</string>
+ <string name="permlab_receiveEmergencyBroadcast" msgid="1803477660846288089">"təcili yayımları qəbul edir"</string>
+ <string name="permdesc_receiveEmergencyBroadcast" msgid="848524070262431974">"Tətbiqə təcili yayım mesajlarını qəbul və emal etmək icazəsi verir. Bu icazə ancaq sistem tətbiqləri üçün mümkündür."</string>
+ <string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"mobil yayım mesajlarını oxuyur"</string>
+ <string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"Tətbiqə sizin telefonunuz tərəfindən alınmış yayım mesajlarını oxuma icazəsi verir. Telefon yayımı bəzi məkanlarda olan fövqəladə hadisələrlə bağlı sizi xəbərdar etmək üçün qəbul edilir. Zərərli tətbiqlər fövqəladə mobil yayım qəbul edildiyi zaman telefonunun performansına və əməliyyatına müdaxilə edə bilər."</string>
+ <string name="permlab_sendSms" msgid="5600830612147671529">"SMS mesajlarını göndərir"</string>
+ <string name="permdesc_sendSms" msgid="7094729298204937667">"Tətbiqə SMS mesajı göndərmə icazəsi verir. Bu gözlənilməyən ödənişlərə səbəb ola bilər. Zərərli tətbiqlər sizin təsdiqiniz olmadan mesaj göndərməklə sizə ödənişə səbəb ola bilərlər."</string>
+ <string name="permlab_sendRespondViaMessageRequest" msgid="8713889105305943200">"mesajla cavab verilməli tədbirlər göndərmək"</string>
+ <string name="permdesc_sendRespondViaMessageRequest" msgid="7107648548468778734">"Tətbiqə zənglər üçün \"mesajla cavabla\" hadisələrini idarə etmək üçün digər mesajlaşma tətbiqlərinə sorğuların göndərilməsi icazəsi verir."</string>
+ <string name="permlab_readSms" msgid="8745086572213270480">"tekst mesajlarınızı oxuyur (SMS və ya MMS)"</string>
+ <string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"Tətbiqə planşetinizdə və ya SIM kartınızda saxlanan SMS mesajları oxumağa imkan verir. Bu bütün SMS mesajların, onların məzmunundan və konfidensiallığından asılı olmadan oxunması imkanı deməkdir."</string>
+ <string name="permdesc_readSms" product="default" msgid="3695967533457240550">"Tətbiqə telefonunuzda və ya SIM kartınızda saxlanan SMS mesajları oxumağa imkan verir. Bu bütün SMS mesajların, onların məzmunundan və konfidensiallığından asılı olmadan oxunması imkanı deməkdir."</string>
+ <string name="permlab_writeSms" msgid="3216950472636214774">"mətn mesajlarınızı redaktə edir (SMS və ya MMS)"</string>
+ <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"Tətbiqə telefonunuzda və ya SİM kartınızda yerləşən SMS mesajlara yazma icazəsi verir. Zərərli tətbiqlər sizin mesajlarınızı silə bilər."</string>
+ <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"Tətbiqə telefonunuzda və ya SİM kartınızda yerləşən SMS mesajlara yazma icazəsi verir. Zərərli tətbiqlər sizin mesajlarınızı silə bilər."</string>
+ <string name="permlab_receiveWapPush" msgid="5991398711936590410">"mətn mesajları qəbul etmək (WAP)"</string>
+ <string name="permdesc_receiveWapPush" msgid="748232190220583385">"Tətbiqə WAP mesajlar göndərmək və ya qəbul etmək imkanı verir. Buna mesajları izləmək və Sizə xəbər vermədən silmək imkanları da daxildir."</string>
+ <string name="permlab_getTasks" msgid="6466095396623933906">"işlənən tətbiqlər əldə etmək"</string>
+ <string name="permdesc_getTasks" msgid="7454215995847658102">"Tətbiqə hazırda və az öncə işləyən tapşırıqlar haqqında ətraflı məlumat əldə etməyə imkan verir. Bu da cihazda hansı tətbiqlərin istifadə olunması haqqında məlumatların əldə edilməsinə imkan verir."</string>
+ <string name="permlab_interactAcrossUsers" msgid="7114255281944211682">"istifadəçilər arasında əlaqə qurur"</string>
+ <string name="permdesc_interactAcrossUsers" msgid="364670963623385786">"Tətbiqə bu cihazdakı digər istifadəçilərlə müxtəlif işləri görməyə icazə verir. Zərərli tətbiqlər bundan istifadəçilər arasındakı qorunmanı pozmaq üçün istifadə edə bilər."</string>
+ <string name="permlab_interactAcrossUsersFull" msgid="2567734285545074105">"bütün istifadəçilər ilə əlaqə saxlamaq üçün tam hüquq"</string>
+ <string name="permdesc_interactAcrossUsersFull" msgid="376841368395502366">"İstifadəçilər arasında bütün mümkün əlaqələrə imkan verir."</string>
+ <string name="permlab_manageUsers" msgid="1676150911672282428">"istifadəçiləri idarə edir"</string>
+ <string name="permdesc_manageUsers" msgid="8409306667645355638">"Tətbiqlərə cihazda olan istifadəçiləri, habelə sorğu göndərmə, yaratma və silmə izni verir."</string>
+ <string name="permlab_getDetailedTasks" msgid="6229468674753529501">"işlənən tətbiqlərin detallarını əldə etmək"</string>
+ <string name="permdesc_getDetailedTasks" msgid="153824741440717599">"Tətbiqə hazırda və az öncə işləyən tapşırıqlar haqqında ətraflı məlumat əldə etməyə imkan verir. Zərərli tətbiqlər bundan istifadə edərək şəxsi məlumatları oğurlaya bilər."</string>
+ <string name="permlab_reorderTasks" msgid="2018575526934422779">"işlənən tətbiqlərin sırasını dəyişmək"</string>
+ <string name="permdesc_reorderTasks" msgid="7734217754877439351">"Tətbiqə tapşırıqları ön plandan arxa plana keçirməyə imkan verir. Tətbiq bunu Sizin daxiletməniz olmadan da edə bilər."</string>
+ <string name="permlab_removeTasks" msgid="6821513401870377403">"işlək tətbiqləri dayandırır"</string>
+ <string name="permdesc_removeTasks" msgid="1394714352062635493">"Tətbiqə tapşırıqları silməyə və onların tətbiqlərini məhv etməyə imkan verir. Zərərli tətbiqlər bundan istifadə edərək digər tətbiqlərin işlərini dayandıra bilər."</string>
+ <string name="permlab_manageActivityStacks" msgid="7391191384027303065">"fəaliyyət toplularını idarə edin"</string>
+ <string name="permdesc_manageActivityStacks" msgid="1615881933034084440">"Tətbiqə digər tətbiqlərin fəaliyyəti daxilində fəaliyyət toplularını əlavə etmək, silmək və dəyişmək imkanı verir."</string>
+ <string name="permlab_startAnyActivity" msgid="2918768238045206456">"hər hansı bir fəaliyyət başlat"</string>
+ <string name="permdesc_startAnyActivity" msgid="997823695343584001">"İcazə qorunması və ya eksport edilmiş statusdan asılı olmayaraq, tətbiqə hər hansı fəaliyyəti başlatmağa imkan verir."</string>
+ <string name="permlab_setScreenCompatibility" msgid="6975387118861842061">"ekran uyğunluğunu yerləşdirir"</string>
+ <string name="permdesc_setScreenCompatibility" msgid="692043618693917374">"Tətbiqə digər tətbiqlərin ekran uyğunluğunu yoxlamaq imkanı verir. Zərərli tətbiqlər digər tətbiqlərin fəaliyyətini poza bilər."</string>
+ <string name="permlab_setDebugApp" msgid="3022107198686584052">"tətbiq sazlanmasını aktiv edir"</string>
+ <string name="permdesc_setDebugApp" msgid="4474512416299013256">"Tətbiqə digər bir tətbiq üçün sazlamanı açmaq üçün imkan verir. Zərərli tətbiqlər bunu digər tətbiqləri yox etmək üçün istifadə edə bilər."</string>
+ <string name="permlab_changeConfiguration" msgid="4162092185124234480">"sistem ekran nizamlarını dəyiş"</string>
+ <string name="permdesc_changeConfiguration" msgid="4372223873154296076">"Tətbiqə yerli parametrlər və ya şriftin ölçüsü kimi cari konfiqurasiyanı dəyişməyə imkan verir."</string>
+ <string name="permlab_enableCarMode" msgid="5684504058192921098">"avtomobil rejimini aktivləşdirir"</string>
+ <string name="permdesc_enableCarMode" msgid="4853187425751419467">"Tətbiqə avtomobil rejimini aktivləşdirməyə imkan verir."</string>
+ <string name="permlab_killBackgroundProcesses" msgid="3914026687420177202">"digər tətbiqləri qapatmaq"</string>
+ <string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"Tətbiqə başqa tətbiqlərin arxafon proseslərini dayandırmaq icazəsi verir. Bu digər tətbiqlərin dayanmasına səbəb ola bilər."</string>
+ <string name="permlab_forceStopPackages" msgid="2329627428832067700">"Digər tətbiqləri dayanmağa məcbur et"</string>
+ <string name="permdesc_forceStopPackages" msgid="5253157296183940812">"Tətbiqə digər tətbiqləri məcburi şəkildə dayandırmağa imkan verir."</string>
+ <string name="permlab_forceBack" msgid="652935204072584616">"tətbiqi qapanmağa məcbur etmək"</string>
+ <string name="permdesc_forceBack" msgid="3892295830419513623">"Tətbiqə ön planda olan istənilən tətbiqi bağlayaraq geriyə dönməyə imkan verir. Normal tətbiqlər tərəfindən heç vaxt istifadə olunmamalıdır."</string>
+ <string name="permlab_dump" msgid="1681799862438954752">"sistemin daxili durumunu bərpa et"</string>
+ <string name="permdesc_dump" msgid="1778299088692290329">"Tətbiqə sistemin daxili statusunu bərpa etməyə imkan verir. Zərərli tətbiqlər lazım olmadığı halda müxtəlif şəxsi və güvənli məlumatları bərpa edə bilər."</string>
+ <string name="permlab_retrieve_window_content" msgid="8022588608994589938">"ekran kontentini bərpa edir"</string>
+ <string name="permdesc_retrieve_window_content" msgid="3193269069469700265">"Tətbiqə aktiv pəncərənin məzmununu əldə etməyə imkan verir. Zərərli tətbiqlər bundan istifadə edərək pəncərə məzmununu ələ keçirib parollları oxuya bilər."</string>
+ <string name="permlab_temporary_enable_accessibility" msgid="2312612135127310254">"giriş imkanını müvəqqəti açmaq"</string>
+ <string name="permdesc_temporary_enable_accessibility" msgid="8079456293182975464">"Tətbiqə cihaza girişi müvəqqəti olaraq aktivləşdirməyə imkan verir. Zərərli tətbiqlər istifadəçi razılığı olmadan girişi aktivləşdirə bilər."</string>
+ <string name="permlab_retrieve_window_info" msgid="8532295199112519378">"pəncərə infosunu bərpa edir"</string>
+ <string name="permdesc_retrieve_window_info" msgid="4998836370424186849">"Tətbiqə pəncərə idarəçisindən gələn windows haqqında olan məlumatı bərpa etməyə imkan verir. Zərərli tətbiqlər daxili sistem istifadəsi üçün nəzərdə tutulan məlumatı bərpa edə bilər."</string>
+ <string name="permlab_filter_events" msgid="8675535648807427389">"tədbirləri filtr edir"</string>
+ <string name="permdesc_filter_events" msgid="8006236315888347680">"Tətbiqə daxiletmə filtrini qeydiyyat etdirməyə imkan verir, bu filtr bütün istifadəçi tədbirlərini göndərilməmişdən əvvəl filtrdən keçirir. Zərərli tətbiq istifadəçi müdaxiləsi olmadan İstifadəçi İnterfeysi sisteminə nəzarət edə bilər."</string>
+ <string name="permlab_magnify_display" msgid="5973626738170618775">"ekranı böyüdür"</string>
+ <string name="permdesc_magnify_display" msgid="7121235684515003792">"Tətbiqə ekran kontentini böyütmək icazəsi verir. Zərərli tətbiqlər bundan istifadə edərək ekranda kontenti böyüdərək cihazın qeyri-stabilliyinə səbəb ola bilər."</string>
+ <string name="permlab_shutdown" msgid="7185747824038909016">"qismən söndürür"</string>
+ <string name="permdesc_shutdown" msgid="7046500838746291775">"Aktivlik idarəçiliyini qapanmış hala gətirir. Tam qapanmanı həyata keçirmir."</string>
+ <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"tətbiqdən tətbiqə keçidin qarşısını almaq"</string>
+ <string name="permdesc_stopAppSwitches" msgid="8262195802582255021">"İstifadəçinin başqa tətbiqə keçməsinin qarşısını alır."</string>
+ <string name="permlab_getTopActivityInfo" msgid="2537922311411546016">"cari tətbiq informasiyası əldə etmək"</string>
+ <string name="permdesc_getTopActivityInfo" msgid="8153651434145132505">"Sahibə ekran önündə cari tətbiq və xidmətlər haqqında şəxsi məlumat əldə etməyə imkan verir."</string>
+ <string name="permlab_runSetActivityWatcher" msgid="892239094867182656">"işə salınan bütün tətbiqləri izləyir və idarə edir"</string>
+ <string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"Tətbiqə sistemin fəaliyyətləri necə başlatdığını nəzarət və kontrol etməyə imkan verir. Zərərli tətbiqlər sistemi tamamilə kompromis edə bilər. Bu icazə yalnız inkişaf üçündür, heç vaxt normal istifadə üçün deyil."</string>
+ <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"qaldırılmış yayım paketini göndər"</string>
+ <string name="permdesc_broadcastPackageRemoved" msgid="6621901216207931089">"Tətbiqə tətbiq paketinin silinməsi haqqında bildiriş translasiya etmə icazəsi verir. Zərərli tətbiqlər bundan digər işlək tətbiqləri dayandırmaq üçün istifadə edə bilər."</string>
+ <string name="permlab_broadcastSmsReceived" msgid="5689095009030336593">"SMS tərəfindən qəbul edilən yayım göndər"</string>
+ <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"Tətbiqə mesaj gəlməsi haqqında bildirişi yayımlamaq imkanı verir. Zərərli tətbiqlər bundan gələn SMS mesajlarını saxtalaşdırmaq üçün istifadə edə bilər."</string>
+ <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"WAP-PUSH tərəfindən qəbul edilən yayım göndər"</string>
+ <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"Tətbiqə WAP PUSH mesajın alındığı haqda bildiriş translasiya etməyə icazə verir. Zərərli tətbiqlər bundan istifadə edərək saxta MMS mesaj alışı və ya səssizcə istənilən veb səhifəni zərərverici variantlarla dəyişmək üçün istifadə edə bilər."</string>
+ <string name="permlab_setProcessLimit" msgid="2451873664363662666">"çalışan proseslərin sayını məhdudlaşdırır"</string>
+ <string name="permdesc_setProcessLimit" msgid="7318061314040879542">"Tətbiqə işlədiləcək maksimum proses sayını idarə etmə izni verir. Normal tətbiqlər tərəfindən tələb olunmur."</string>
+ <string name="permlab_setAlwaysFinish" msgid="550958507798796965">"arxafon tətbiqlərini dayanmağa məcbur edir"</string>
+ <string name="permdesc_setAlwaysFinish" msgid="7471310652868841499">"Tətbiqə aktivitilərin arxa fona getdiyi zaman bitməsini yoxlayır. Normal tətbiqlər tərəfindən tələn olunmur."</string>
+ <string name="permlab_batteryStats" msgid="2789610673514103364">"batareya statistikalarını oxumaq"</string>
+ <string name="permdesc_batteryStats" msgid="5897346582882915114">"Tətbiqə cari aşağı səviyyəli data sitifadəsini oxumaq imkanı verir. Tətbiqə hansı tətbiqi istifadə etdiyiniz haqqında ətraflı məlumat tapmağa imkan verə bilər."</string>
+ <string name="permlab_updateBatteryStats" msgid="3719689764536379557">"batareya statistikalarını dəyişmək"</string>
+ <string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Tətbiqə yığılmış batareya statistikasını redaktə etmə icazəsi verir. Normal tətbiqlər tərəfindən istifadə edilmir."</string>
+ <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"tətbiq əməliyyat statistikalarını əldə etmək"</string>
+ <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Toplanmış tətbiq əməliyyat statistikalarının bərpa edilməsinə imkan verir. Normal tətbiqlər tərəfindən istifadə üçün deyil."</string>
+ <string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"tətbiq əməliyyat statistikasını dəyişmək"</string>
+ <string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Tətbiqə toplanmış tətbiq əməliyyat statistikasını dəyişməyə imkan verir. Normal tətbiqlər tərəfindən istifadə olunmur."</string>
+ <string name="permlab_backup" msgid="470013022865453920">"sistem yedəkləməsi və bərpasını idarə edir"</string>
+ <string name="permdesc_backup" msgid="6912230525140589891">"Tətbiqə sistemi rezerv etməyə və mexanizmi bərpa etməyə imkan verir. Normal tətbiqlər tərəfindən istifadə edilmək üçün nəzərdə tutulmayıb.."</string>
+ <string name="permlab_confirm_full_backup" msgid="5557071325804469102">"tam rezervi təsdiq etmək və ya əməliyyatı bərpa etmək"</string>
+ <string name="permdesc_confirm_full_backup" msgid="1748762171637699562">"Tətbiqə İstifadəçi İnterfeysi tam rezerv təsdiqini işə salmağa imkan verir. Heç bir tətbiq tərəfindən istifadə olunmamalıdır."</string>
+ <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"icazəsiz pəncərələri görüntüləyir"</string>
+ <string name="permdesc_internalSystemWindow" msgid="7458387759461466397">"Tətbiqə daxili sistem interfeysi tərəfindən istifadə edilməsi üçün nəzərdə tutulmuş pəncərələri yaratmağa icazə verir. Normal tətbiqlər tərəfindən istifadə edilmir."</string>
+ <string name="permlab_systemAlertWindow" msgid="3543347980839518613">"digər tətbiqlər üzərində çəkmək"</string>
+ <string name="permdesc_systemAlertWindow" msgid="8584678381972820118">"Tətbiqə digər tətbiqlərin və ya onların hissələrinin yuxarısında şəkil çəkməyə imkan verir. Onlar istənilən tətbiqin interfeysinin istifadəsinə müdaxilə edə və ya digər tətbiqlərdə axtardıqlarınızı dəyişə bilər."</string>
+ <string name="permlab_setAnimationScale" msgid="2805103241153907174">"qlobal animasiya sürətini dəyişir"</string>
+ <string name="permdesc_setAnimationScale" msgid="7690063428924343571">"Tətbiqə istənilən vaxt qlobal animasiya sürətini (sürətli və ya yavaş animasiyalar) dəyişdirmək imkanı verir."</string>
+ <string name="permlab_manageAppTokens" msgid="1286505717050121370">"tətbiq nişanlarını idarə etmək"</string>
+ <string name="permdesc_manageAppTokens" msgid="8043431713014395671">"Tətbiqlərə onların normal Z-orderinqi keçərək markerlərini yaratma və idarəetmə icazəsi verir. Normal tətbiqlər tərəfindən istifadə olunmur."</string>
+ <string name="permlab_freezeScreen" msgid="4708181184441880175">"ekranı dondurur"</string>
+ <string name="permdesc_freezeScreen" msgid="8558923789222670064">"Tətbiqə tam ekranlı yayım üçün ekranı müvəqqəti olaraq dondurma icazəsi verir."</string>
+ <string name="permlab_injectEvents" msgid="1378746584023586600">"düymələri və idarəetmə düymələrini basır"</string>
+ <string name="permdesc_injectEvents" product="tablet" msgid="206352565599968632">"Tətbiqə özünün daxiletmə tədbirlərini digər tətbiqlərə çatdırmağa imkan verir. Zərərli tətbiqlər planşeti ələ keçirmək üçün bundan istifadə edə bilər."</string>
+ <string name="permdesc_injectEvents" product="default" msgid="653128057572326253">"Tətbiqə özünün daxiletmə tədbirlərini digər tətbiqlərə çatdırmağa imkan verir. Zərərli tətbiqlər telefonu ələ keçirmək üçün bundan istifadə edə bilər."</string>
+ <string name="permlab_readInputState" msgid="469428900041249234">"yazdıqlarınızı və etdiklərinizi izləyir"</string>
+ <string name="permdesc_readInputState" msgid="8387754901688728043">"Tətbiqə basdığınız düymələri izləmək imkanı verilir. Buna parolların və kredit kartı nömrələrinin yazılması da aiddir. Normal tətbiqlər tərəfindən istifadə olunmur."</string>
+ <string name="permlab_bindInputMethod" msgid="3360064620230515776">"daxiletmə metoduna bağlanır"</string>
+ <string name="permdesc_bindInputMethod" msgid="3250440322807286331">"Sahibinə daxiletmə metodunun ən üst səviyyə interfeysinə bağlamaq imkanı verir. Normal tətbiqlər üçün heç vaxt lazım olmamalıdır."</string>
+ <string name="permlab_bindAccessibilityService" msgid="5357733942556031593">"giriş xidmətinə bağlı qal"</string>
+ <string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Sahibə giriş xidmətin ən üst səviyyə interfeysi bağlamağa imkan verir. Normal tətbiqlər üçün heç vaxt lazım olmamalıdır."</string>
+ <string name="permlab_bindPrintService" msgid="8462815179572748761">"çap servisini qoşma"</string>
+ <string name="permdesc_bindPrintService" msgid="7960067623209111135">"Sahibinə bir çap xidmətinin ən üst səviyə araüzünü bağlamağa imkan verir. Normal tətbiqlər üçün heç vaxt lazım olmamalıdır."</string>
+ <string name="permlab_bindPrintSpoolerService" msgid="6807762783744125954">"çap spuler servisinə qoş"</string>
+ <string name="permdesc_bindPrintSpoolerService" msgid="3680552285933318372">"Sahibinə çap spuler xidmətinin ən üst səviyyə interfeysinə bağlamağa imkan verir. Normal tətbiqlər üçün heç vaxt lazım olmamalıdır."</string>
+ <string name="permlab_bindNfcService" msgid="2752731300419410724">"NFC xidmətlərinə qoşun"</string>
+ <string name="permdesc_bindNfcService" msgid="6120647629174066862">"Sahibinə NFC kartlarını emulyasiya edən tətbiqləri bir-birinə qoşmağa icazə verin. Normal tətbiqlər üçün lazım deyil."</string>
+ <string name="permlab_bindTextService" msgid="7358378401915287938">"mətn servisini qoşma"</string>
+ <string name="permdesc_bindTextService" msgid="8151968910973998670">"Sahibinə bir mətn xidmətinin ən üst səviyyə araüzünü bağlamağa imkan verir(məsələn, SpellCheckerService). Normal tətbiqlər üçün heç vaxt lazım olmamalıdır."</string>
+ <string name="permlab_bindVpnService" msgid="4708596021161473255">"VPN xidmətə əlaqələndirmək"</string>
+ <string name="permdesc_bindVpnService" msgid="2067845564581693905">"Sahibinə bir Vpn xidmətinin ən üst səviyyə araüzünü bağlamağa imkan verir. Normal tətbiqlər üçün heç vaxt lazım olmamalıdır."</string>
+ <string name="permlab_bindWallpaper" msgid="8716400279937856462">"divar kağızına bağlanır"</string>
+ <string name="permdesc_bindWallpaper" msgid="7108428692595491668">"Cihaz sahibinə yuxarı səviyyəli divar kağızı interfeysini cildləməyə imkan verir. Normal tətbiqlər tərəfindən istifadə olunmamalıdır."</string>
+ <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"widget servisini qoÅŸma"</string>
+ <string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"Sahibinə vidcet servisin yüksək səviyyəli interfeysi ilə əlaqə saxlamaq icazəsi verir. Normal tətbiqlər tərəfindən heç vaxt istənilməməlidir."</string>
+ <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"cihaz admini ilə ünsiyyət qurmaq"</string>
+ <string name="permdesc_bindDeviceAdmin" msgid="569715419543907930">"Sahibinə bir cihaz idarəçisinə planlar göndərmək üçün imkan verir. Normal tətbiqlər üçün heç vaxt lazım olmamalıdır."</string>
+ <string name="permlab_manageDeviceAdmins" msgid="4248828900045808722">"cihaz admini əlavə edin və ya silin"</string>
+ <string name="permdesc_manageDeviceAdmins" msgid="5025608167709942485">"Sahibinə aktiv cihaz administratorlarını əlavə etməyə və ya silməyə icazə verir. Normal tətbiqlər üçün tələb olunmamalıdır."</string>
+ <string name="permlab_setOrientation" msgid="3365947717163866844">"ekran oriyentasiyasını dəyişir"</string>
+ <string name="permdesc_setOrientation" msgid="3046126619316671476">"Tətbiqə istənilən zaman ekranın vəziyyətini dəyişmə icazəsi verir. Normal tətbiqlər tərəfindən tələb olunmur."</string>
+ <string name="permlab_setPointerSpeed" msgid="9175371613322562934">"kursor sürətini dəyişmək"</string>
+ <string name="permdesc_setPointerSpeed" msgid="6866563234274104233">"Tətbiqə mausun və ya trekpedin kursor sürətini istənilən zaman dəyişməyə imkan verir. Normal tətbiqlər tərəfindən istifadə olunmamalıdır."</string>
+ <string name="permlab_setKeyboardLayout" msgid="4778731703600909340">"klaviatura sxemini dəyişir"</string>
+ <string name="permdesc_setKeyboardLayout" msgid="8480016771134175879">"Tətbiqə klaviatura sxemini dəyişmək imkanı verir. Normal tətbiqlər tərəfindən tələb olunmur."</string>
+ <string name="permlab_signalPersistentProcesses" msgid="4539002991947376659">"tətbiqlərə Linux siqnalları göndərir"</string>
+ <string name="permdesc_signalPersistentProcesses" msgid="4896992079182649141">"Tətbiqə bütün davamlı proseslərə siqnal soğrusu göndərməyə imkan verir."</string>
+ <string name="permlab_persistentActivity" msgid="8841113627955563938">"təbiqi həmişə çalışdır"</string>
+ <string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Tətbiqə öz komponentlərini yaddaşda saxlama icazəsi verir. Bu planşetin sürətini zəiflətməklə, digər tətbiqlər üçün mövcud olan yaddaşı limitləyə bilər."</string>
+ <string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"Tətbiqə öz komponentlərini yaddaşda saxlama icazəsi verir. Bu digər tətbiqlər üçün mövcud olan yaddaşı limitləyə bilər."</string>
+ <string name="permlab_deletePackages" msgid="184385129537705938">"tətbiqləri sil"</string>
+ <string name="permdesc_deletePackages" msgid="7411480275167205081">"Tətbiqə Android paketləri silmə icazəsi verir. Zərərli tətbiqlər bundan digər vacib tətbiqləri silmək üçün istifadə edə bilər."</string>
+ <string name="permlab_clearAppUserData" msgid="274109191845842756">"digər tətbiqlərin məlumatını silir"</string>
+ <string name="permdesc_clearAppUserData" msgid="4625323684125459488">"Tətbiqə istifadəçi datasını təmizləməyə imkan verir."</string>
+ <string name="permlab_deleteCacheFiles" msgid="3128665571837408675">"digər tətbiqlərin keşini sil"</string>
+ <string name="permdesc_deleteCacheFiles" msgid="3812998599006730196">"Tətbiqə keş faylları silmə icazəsi verir."</string>
+ <string name="permlab_getPackageSize" msgid="7472921768357981986">"tətbiq saxlama yaddaşını ölçmək"</string>
+ <string name="permdesc_getPackageSize" msgid="3921068154420738296">"Tətbiqə özünün kodunu, məlumatını və keş ölçüsünü alma icazəsi verir."</string>
+ <string name="permlab_installPackages" msgid="2199128482820306924">"birbaşa tətbiqlər quraşdırmaq"</string>
+ <string name="permdesc_installPackages" msgid="5628530972548071284">"Tətbiqə yeni və ya güncəllənmiş Android paketlərini quraşdırmağa imkan verir. Zərərli tətbiqlər bundan istifadə edərək güclü səlahiyyətlərə malik tətbiqləri endirə bilər."</string>
+ <string name="permlab_clearAppCache" msgid="7487279391723526815">"bütün tətbiq keş datasını silir"</string>
+ <string name="permdesc_clearAppCache" product="tablet" msgid="8974640871945434565">"Tətbiqə planşetin yaddaşını boşaltmaq üçün digər tətbiqlərin keş fayllarını silmək imkanı verir. Bu da digər tətbiqlərin dataları yenidən əldə etmələri səbəbindən daha yavaş işləmələrinə səbəb ola bilər."</string>
+ <string name="permdesc_clearAppCache" product="default" msgid="2459441021956436779">"Tətbiqə digər tətbiqlərin keş qovluğunu təmizləyərək telefonun yaddaşını boşaltmaq icazəsi verir. Bu digər tətbiqlərin məlumatlarını yenidən əldə etməli olduqlarına görə daha yavaş başlamasına səbəb olur."</string>
+ <string name="permlab_movePackage" msgid="3289890271645921411">"tətbiq resurslarının yerini dəyişir"</string>
+ <string name="permdesc_movePackage" msgid="319562217778244524">"Tətbiqə tətbiq resurslarını daxili mediadan xarici mediaya və əksinə daşımağa imkan verir."</string>
+ <string name="permlab_readLogs" msgid="6615778543198967614">"məxfi loq datasını oxuyur"</string>
+ <string name="permdesc_readLogs" product="tablet" msgid="82061313293455151">"Tətbiqə sistemin müxtəlif jurnal fayllarını oxumağa imkan verir. Bu da Sizin planşetdə etdikləriniz haqqında məlumatlar, həmçinin şəxsi və konfidensial məlumatlar ola bilər."</string>
+ <string name="permdesc_readLogs" product="default" msgid="2063438140241560443">"Tətbiqə sistemin müxtəlif jurnal fayllarını oxumağa imkan verir. Bu da Sizin planşetdə etdikləriniz haqqında məlumatlar, həmçinin şəxsi və konfidensial məlumatlar ola bilər."</string>
+ <string name="permlab_anyCodecForPlayback" msgid="715805555823881818">"oxutmaq üçün istənilən media dekoderi istifadə edir"</string>
+ <string name="permdesc_anyCodecForPlayback" msgid="8283912488433189010">"Tətbiqə playback\'i deşifrə etmək üçün hər hansı bir quraşdırılmış media deşifrələyicisini istifadə etmık imkanı verir."</string>
+ <string name="permlab_manageCaCertificates" msgid="1678391896786882014">"etibarlı etimadnamələri idarə et"</string>
+ <string name="permdesc_manageCaCertificates" msgid="4015644047196937014">"Tətbiqə etibarlı etimadnamələr kimi CA sertifikatlarını quraşdırmaq və sistemdən silməyə icazə verir."</string>
+ <string name="permlab_diagnostic" msgid="8076743953908000342">"diaga məxsus olan mənbələri yaz/oxu"</string>
+ <string name="permdesc_diagnostic" msgid="6608295692002452283">"Tətbiqə diag qrupa məsus olan resursları yazmaq və oxumaq icazəsi verir; məsələn /dev qovluğundakı fayllar. Bu sistemin stabilliyinə və təhlükəsizliyinə təsir edə bilər. Bu ancaq istehsalçı və ya operator tərəfindən avadanlığa xas diaqnostika üçün olmalıdır."</string>
+ <string name="permlab_changeComponentState" msgid="6335576775711095931">"tətbiq komponentlərini aktivləşdirmə və ya deaktivləşdirmə"</string>
+ <string name="permdesc_changeComponentState" product="tablet" msgid="8887435740982237294">"Tətbiqə digər tətbiq komponentinin aktiv olub-olmadığını dəyişmək imkanı verir. Zərərli tətbiqlər bundan əhəmiyyətli planşet imkanlarını deaktiv etmək üçün istifadə edə bilər. Bu icazə ilə ehtiyatlı olmaq lazımdır, çünki tətbiq komponentləri yararsız, ziddiyyətli, və ya qeyri-sabit statusa çevrilə bilər."</string>
+ <string name="permdesc_changeComponentState" product="default" msgid="1827232484416505615">"Tətbiqə digər tətbiq komponentinin aktiv olub-olmadığını dəyişmək imkanı verir. Zərərli tətbiqlər bundan əhəmiyyətli telefon imkanlarını deaktiv etmək üçün istifadə edə bilər. Bu icazə ilə ehtiyatlı olmaq lazımdır, çünki tətbiq komponentləri yararsız, ziddiyyətli, və ya qeyri-sabit statusa çevrilə bilər."</string>
+ <string name="permlab_grantRevokePermissions" msgid="4627315351093508795">"icazələr vermək və ya ləğv etmək"</string>
+ <string name="permdesc_grantRevokePermissions" msgid="4088642654085850662">"Tətbiqə bu və ya digər tətbiqlərə xüsusi iznlər verməyə icazə verir. Zərərli tətbiqlər bundan izin vermədiyiniz özəllikləri özlərinə vermək üçün istifadə edə bilər."</string>
+ <string name="permlab_setPreferredApplications" msgid="8463181628695396391">"tərcih edilən tətbiqlər qur"</string>
+ <string name="permdesc_setPreferredApplications" msgid="4973986762241783712">"Tətbiqə tərcih etdiyiniz tətbiqləri dəyişmək imkanı verir. Zərərli tətbiqlər şəxsi məlumatlarınızı toplamaq üçün cari tətbiqlərinizi aldadaraq işləyən tətbiqləri xəbərsiz dəyişə bilər."</string>
+ <string name="permlab_writeSettings" msgid="2226195290955224730">"sistem ayarlarında dəyişiklik etmək"</string>
+ <string name="permdesc_writeSettings" msgid="7775723441558907181">"Tətbiqə sistem ayarları datasını redaktə etmə icazəsi verir. Zərərli tətbiqlər sistem ayarlarını korlaya bilər."</string>
+ <string name="permlab_writeSecureSettings" msgid="204676251876718288">"təhlükəsiz sistem nizamlarını dəyişir"</string>
+ <string name="permdesc_writeSecureSettings" msgid="8159535613020137391">"Tətbiqə sistemin təhlükəsiz ayarlar datasını dəyişməyə imkan verir. Normal tətbiqlər tərəfindən istifadə üçün deyil."</string>
+ <string name="permlab_writeGservices" msgid="2149426664226152185">"Google xidmətlər xəritəsini dəyişdir"</string>
+ <string name="permdesc_writeGservices" msgid="1287309437638380229">"Tətbiqə Google xidmətlər xəritəsini dəyişdirmək imkanı verir. Normal tətbiqlərin istifadəsi üçün deyil."</string>
+ <string name="permlab_receiveBootCompleted" msgid="5312965565987800025">"başlanğıcda işləyir"</string>
+ <string name="permdesc_receiveBootCompleted" product="tablet" msgid="7390304664116880704">"Tətbiqə sistem yükləməni bitirdiyi zaman dərhal özünü başlatmağa imkan verir. Bu planşeti başlatmağın uzun çəkməsinə səbəb ola bilər və tətbiqə həmişə çalışdıraraq bütün planşeti yavaşlatmağa imkan verir."</string>
+ <string name="permdesc_receiveBootCompleted" product="default" msgid="513950589102617504">"Tətbiqə sistem bootinqi bitirdikdən dərhal sonra özünü başlatmaq icazəsi verir. Bu telefonun açılmasını ləngidə və daima işlək qalaraq telefonun sürətini aşağı sala bilər."</string>
+ <string name="permlab_broadcastSticky" msgid="7919126372606881614">"daimi siqnal göndərmək"</string>
+ <string name="permdesc_broadcastSticky" product="tablet" msgid="7749760494399915651">"Tətbiqə yayım bitdikdən sonra da qalan çətin yayımlar göndərməyə imkan verir. Hədsiz istifadə çox yaddaş istifadəsinə səbəb olmaqla planşeti yavaş və qeyri-stabil edə bilər."</string>
+ <string name="permdesc_broadcastSticky" product="default" msgid="2825803764232445091">"Tətbiqə yayım bitdikdən sonra da qalan çətin yayımlar göndərməyə imkan verir. Hədsiz istifadə çox yaddaş istifadəsinə səbəb olmaqla telefonu yavaş və qeyri-stabil edə bilər."</string>
+ <string name="permlab_readContacts" msgid="8348481131899886131">"kontakrlatınızı oxumaq"</string>
+ <string name="permdesc_readContacts" product="tablet" msgid="5294866856941149639">"Tətbiqə planşetinizdə yerləşən kontaktları oxumaq icazəsi verir, tez-tez zəng elədiyiniz, emailləşdiyiniz və ya əlaqə saxladığınız xüsusi individuallar daxil olmaqla. Bu icazə tətbiqlərə kontakt məlumatlarınızı saxlamağa və zərərli tətbiqlərə kontakt məlumatlarını sizin bilginiz olmada paylaşma imkanı yaradır."</string>
+ <string name="permdesc_readContacts" product="default" msgid="8440654152457300662">"Tətbiqə tez-tez zəng elədiyiniz, e-məktub göndərdiyiniz və ya əlaqə saxladığınız xüsusi individuallar daxil olmaqla telefonunuzda yerləşən kontaktları oxumaq icazəsi verir. Bu icazə tətbiqlərə kontakt məlumatlarınızı saxlamağa və zərərli tətbiqlərə kontakt məlumatlarını sizin xəbəriniz olmada paylaşma imkanı yaradır."</string>
+ <string name="permlab_writeContacts" msgid="5107492086416793544">"kontaktlarınızı dəyişdirir"</string>
+ <string name="permdesc_writeContacts" product="tablet" msgid="897243932521953602">"Tətbiqə planşetinizdəki zəng etmək tezliyiniz, elektron poçtlarınız, ünsiyyətləriniz haqqında məlumatları dəyişməyə imkan verir. Bu icazə kontakt məlumatlarının silinməsinə də imkan verir."</string>
+ <string name="permdesc_writeContacts" product="default" msgid="589869224625163558">"Tətbiqə Sizin zəng etmək tezliyiniz, elektron poçtlarınız, ünsiyyətləriniz haqqında məlumatları dəyişməyə imkan verir. Buna kontaktların silinməsi imkanı də daxildir."</string>
+ <string name="permlab_readCallLog" msgid="3478133184624102739">"zəng qeydiyyatını oxu"</string>
+ <string name="permdesc_readCallLog" product="tablet" msgid="3700645184870760285">"Tətbiqə gələn və gedən zənglər haqqında olan data daxil olmaqla bərabər planşetinizin zəng qeydiyyatını oxumağa imkan verir. Bu icazə tətbiqlərə zəng qeydiyyatınızı saxlamağa imkan verir və zərərli tətbiqlər zəng qeydiyyat datasını sizdən xəbərsiz paylaşa bilər."</string>
+ <string name="permdesc_readCallLog" product="default" msgid="5777725796813217244">"Tətbiqə telefon jurnalınızı oxumağa imkan verir, buna gələn və gedən zənglər haqqında məlumatlar da daxildir. Bu icazə tətbiqə zəng jurnalı datasını saxlamağa imkan verir ki, Zərərli tətbiqlər bundan istifadə edərək Sizdən xəbərsiz bütün məlumatlarnızı paylaşa bilər."</string>
+ <string name="permlab_writeCallLog" msgid="8552045664743499354">"zəng loqu yazır"</string>
+ <string name="permdesc_writeCallLog" product="tablet" msgid="6661806062274119245">"Tətbiqə planşetinizdəki zəng jurnalını, həmçinin gedən və gələn zənglərin siyahısını dəyişməyə imkan verir. Zərərli tətbiqlər bundan istifadə edərək, zəng jurnalınıza dəyişiklik edə bilər."</string>
+ <string name="permdesc_writeCallLog" product="default" msgid="683941736352787842">"Tətbiqə sizin daxil olan və gedən zənglər daxil olmaqla telefon zəngi loqlarınızı redaktə etmək icazəsi verir. Zərərli tətbiqlər bundan telefon loqlarınızı silmək və ya redaktə etmək üçün istifadə edə bilər."</string>
+ <string name="permlab_readProfile" msgid="4701889852612716678">"öz kontakt kartınızı oxuyun"</string>
+ <string name="permdesc_readProfile" product="default" msgid="5462475151849888848">"Tətbiqə cihazınızda yerləşən adınız və kontakt məlumatlarınız kimi şəxsi profil məlumatlarını oxuma icazəsi verir. Bu o deməkdir ki, tətbiq sizi tanıya və sizin profil məlumatlarınızı başqalarına göndərə bilər."</string>
+ <string name="permlab_writeProfile" msgid="907793628777397643">"sizin kontakt kartınızda dəyişiklik etmək"</string>
+ <string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"Tətbiqə cihazınızda yerləşən adınız və kontakt məlumatlarınız kimi şəxsi profil məlumatlarını dəyişmək və ya əlavə etmək icazəsi verir. Bu o deməkdir ki, tətbiq sizi tanıya və sizin profil məlumatlarınızı başqalarına göndərə bilər."</string>
+ <string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"sosial lentinizi oxuyur"</string>
+ <string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"Tətbiqə Sizin və dostlarınızın sosial güncəllərini əldə etmək və sinxronizə etmək icazəsi verir. Məlumat paylaşarkən diqqətli olun - konfidensiallıqdan asılı olmayaraq bu, Siz və dostlarınız arasında sosial şəbəkələrdəki danışığı oxumaq imkanı verir. Qeyd: bu icazə bütün sosial şəbəkələrdə icra edilə bilməz."</string>
+ <string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"sosial axınınıza yazır"</string>
+ <string name="permdesc_writeSocialStream" product="default" msgid="3086557552204114849">"Tətbiqə dostlarınızdan sosial yenilənmələri göstərmə icazəsi verir. Məlumat paylaşarkən diqqətli olun - bu dostlarınızdan gələn mesajı emal etməyə izn verir. Qeyd: bu icazə bütün sosial şəbəkələrə şamil olunmaya bilər."</string>
+ <string name="permlab_readCalendar" msgid="5972727560257612398">"təqvim tədbirlərini və konfidensial məlumatları oxuyur"</string>
+ <string name="permdesc_readCalendar" product="tablet" msgid="4216462049057658723">"Tətbiqə dostlarınızın və əməkdaşlarınızın planşetinizdə yerləşən kalendar tədbirlərini oxumağa icazə verir. Bu tətbiqə konfidensiallıq və ya həssaslıqdan asılı olmayaraq sizin kalendar məlumatlarınızı paylaşmaq və ya saxlamağa imkan yaradır."</string>
+ <string name="permdesc_readCalendar" product="default" msgid="7434548682470851583">"Tətbiqə dost və əməkdaşlara məxsus olanlar daxil olmaqla planşetdə yerləşən bütün kalendar tətbiqlərini oxumaq icazəsi verir. Bu tətbiqə konfidensiallıq və ya həssaslıqdan asılı olmayaraq, Sizin kalendar məlumatlarınızı paylaşmaq və ya saxlamaq imkanı yaradır."</string>
+ <string name="permlab_writeCalendar" msgid="8438874755193825647">"cihaz sahibinin icazəsi olmadan təqvim tədbirləri əlavə etmək və ya dəyişmək, bunun haqqında bildirişlər göndərmək"</string>
+ <string name="permdesc_writeCalendar" product="tablet" msgid="6679035520113668528">"Tətbiqə planşetinizdəki tədbirləri dəyişməyə, tədbir əlavə etməyə və ya silməyə imkan verir. Buna Sizin dostlarınızla və həmkarlarınızla birlikdə hazırladığınız tədbirlər də daxildir. Bu, tədbirə Sizin adınızdan və Sizdən xəbərsiz, təqvim sahibi kimi mesaj göndərmək imkanını verir."</string>
+ <string name="permdesc_writeCalendar" product="default" msgid="2324469496327249376">"Dostlarınız və həmkarlarınıza məxsus olanlar da daxil olmaqla, tətbiqə telefonunuzdakı tədbirləri dəyişməyə, tədbir əlavə etməyə və ya silməyə imkan verir. Bu, tədbirə Sizin adınızdan və Sizdən xəbərsiz, təqvim sahibi kimi mesaj göndərmək imkanı verir."</string>
+ <string name="permlab_accessMockLocation" msgid="8688334974036823330">"test üçün saxta məkan mənbələri"</string>
+ <string name="permdesc_accessMockLocation" msgid="5808711039482051824">"Test üçün saxta məkan mənbələri yaradın və ya yeni məkan provayderi quraşdırın. Bu tətbiqlərə GPS və məkan provayderləri kimi məkan mənbələrindən alınan məkan və/ya statusları yenidən yazmağa icazə verir."</string>
+ <string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"əlavə məkan provayderi əmrlərinə çıxış"</string>
+ <string name="permdesc_accessLocationExtraCommands" msgid="5945166642335800763">"Tətbiqə əlavə məkan provayderi əmrlərinə daxil olmaq imkanı verir. Bu tətbiqə GPS əməliyyatına və ya digər məkan mənbələrinə mane olmaq imkanı verə bilər."</string>
+ <string name="permlab_installLocationProvider" msgid="6578101199825193873">"Məkan provayderini quraşdırmaq icazəsi"</string>
+ <string name="permdesc_installLocationProvider" msgid="9066146120470591509">"Yeni yerləşmə təchizatçısını test etmək və ya quraşdırmaq üçün mock yerləşmə mənbələri yarat. Bu tətbiqə yerləşmənin və/ya digər yerləşmə mənbələrindən GPS və ya yerləşmə təchizatçıları qayıtmış statusların ləğv etməsinə imkan verir."</string>
+ <string name="permlab_accessFineLocation" msgid="1191898061965273372">"dəqiq yeri (GPS və şəbəkə-əsaslı)"</string>
+ <string name="permdesc_accessFineLocation" msgid="5295047563564981250">"Qlobal Pozisiya Sistemini və ya şəbəkə qüllələri və Wi-Fi kimi şəbəkə məkanını istifadə edərək tətbiqə Sizin dəqiq yerinizi təyin etməyə imkan verir. Bu məkan xidmətləri aktivləşdirilməlidirlər ki, Siz tətbiqi istifadə edən zaman tətbiq onları istifadə edə bilsin. Tətbiqlər Sizin harada olmağınızı bunun vasitəsilə təyin edəcək, eyni zamanda, bu xidmət əlavə batareya enerjisi apara bilər."</string>
+ <string name="permlab_accessCoarseLocation" msgid="4887895362354239628">"təxmini məkan (şəbəkə əsaslı)"</string>
+ <string name="permdesc_accessCoarseLocation" msgid="2538200184373302295">"Tətbiqə təxmini yerinizi almaq üçün imkan verir. Bu yer, yerləşmə xidmətləri tərəfindən mobil qüllələr və Wi-Fi kimi şəbəkə yerləşmə mənbələrdən istifadə etməklə əldə edilir. Bu yerləşmə xidmətləri tətbiqin onlardan istifadəsi üçün açıq və cihazınızın onları istifadəsi üçün mövcud olmalıdır. Tətbiqlər bundan sizin təxminən harada olduğunuzu müəyyənləşdirmək üçün istifadə edə bilər."</string>
+ <string name="permlab_accessSurfaceFlinger" msgid="2363969641792388947">"SurfaceFlinger\'É™ daxil olmaq"</string>
+ <string name="permdesc_accessSurfaceFlinger" msgid="1041619516733293551">"Tətbiqə aşağı səviyyəli SurfaceFnger özəlliklərini istifadə etməyə icazə verir."</string>
+ <string name="permlab_readFrameBuffer" msgid="6690504248178498136">"freym buferi oxuyur"</string>
+ <string name="permdesc_readFrameBuffer" msgid="4937405521809454680">"Tətbiqə freym buferinin kontentini oxumaq icazəsi verir."</string>
+ <string name="permlab_accessInputFlinger" msgid="5348635270689553857">"InputFlinger keçidi"</string>
+ <string name="permdesc_accessInputFlinger" msgid="2104864941201226616">"Tətbiqə aşağı səviyyəli InputFlinger funksiyalarını istifadə etməyə icazə verir."</string>
+ <string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"Wifi görüntülərini quraşdır"</string>
+ <string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"Tətbiqə Wifi görüntülərini quraşdırmağa və onlara qoşulmağa imkan verir."</string>
+ <string name="permlab_controlWifiDisplay" msgid="393641276723695496">"WiFi görüntülərini dəyişir"</string>
+ <string name="permdesc_controlWifiDisplay" msgid="4543912292681826986">"Tətbiqə Wifi displeylərinin aşağı səviyyəli funksiyalarını idarə etmək imkanı verir."</string>
+ <string name="permlab_captureAudioOutput" msgid="6857134498402346708">"audio çıxışı alın"</string>
+ <string name="permdesc_captureAudioOutput" msgid="6210597754212208853">"Tətbiqə audio çıxışı almaq və yenidən yönləndirmək imkanı verir."</string>
+ <string name="permlab_captureVideoOutput" msgid="2246828773589094023">"video çıxışı alın"</string>
+ <string name="permdesc_captureVideoOutput" msgid="359481658034149860">"Tətbiqə video çıxışı almaq və yenidən yönləndirmək imkanı verir."</string>
+ <string name="permlab_captureSecureVideoOutput" msgid="7815398969303382016">"təhlükəsiz video çıxışı alın"</string>
+ <string name="permdesc_captureSecureVideoOutput" msgid="2779793064709350289">"Tətbiqə güvənli video çıxışı almaq və yenidən yönləndirmək imkanı verir."</string>
+ <string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"audio ayarlarınızı dəyişir"</string>
+ <string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"Tətbiqə səs və hansı spikerin çıxış üçün istifadə olunduğu kimi qlobal səs ayarlarını dəyişdirməyə imkan verir."</string>
+ <string name="permlab_recordAudio" msgid="3876049771427466323">"səs yaz"</string>
+ <string name="permdesc_recordAudio" msgid="4906839301087980680">"Tətbiqə mikrofonla audio yazmaq icazəsi verir. İcazə tətbiqə sizin təsdiqiniz olmadan istənilən zaman səs yazma izni verir."</string>
+ <string name="permlab_camera" msgid="3616391919559751192">"şəkil və video çəkmək"</string>
+ <string name="permdesc_camera" msgid="8497216524735535009">"Tətbiqə kamera ilə şəkil və video çəkməyə imkan yaradır. Bu icazə tətbiqə sizin təsdiqiniz olmadan kameradan istifadə icazəsi verir."</string>
+ <string name="permlab_cameraDisableTransmitLed" msgid="2651072630501126222">"kamera istifadə edildikdə LED göstərici ötürülməsini deaktiv edir"</string>
+ <string name="permdesc_cameraDisableTransmitLed" msgid="4764585465480295341">"Öncədən quraşdırılmış sistem tətbiqinə kamera tərəfindən istifadə edilən LED indikatorunu söndürmək icazəsi verir."</string>
+ <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"planşeti daimi olaraq aradan qaldır"</string>
+ <string name="permlab_brick" product="default" msgid="8337817093326370537">"telefonu həmişəlik deaktiv etmək"</string>
+ <string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Tətbiqə planşeti birdəfəlik deaktiv etməyə imkan verir. Bu da çox təhlükəlidir."</string>
+ <string name="permdesc_brick" product="default" msgid="5788903297627283099">"Tətbiqə bütün telefonu birdəfəlik deaktivləşdirməyə imkan verir. Bu çox təhlükəlidir."</string>
+ <string name="permlab_reboot" product="tablet" msgid="3436634972561795002">"planşeti yenidən yüklənməyə məcbur edir"</string>
+ <string name="permlab_reboot" product="default" msgid="2898560872462638242">"telefonu yenidən yüklənməyə məcbur edir"</string>
+ <string name="permdesc_reboot" product="tablet" msgid="8172056180063700741">"Tətbiqə planşeti yenidən yükləməyə məcbur etmək imkanı verir."</string>
+ <string name="permdesc_reboot" product="default" msgid="5326008124289989969">"Tətbiqə telefonu yenidən yükləməyə məcbur etmək üçün imkan verir."</string>
+ <string name="permlab_mount_unmount_filesystems" product="nosdcard" msgid="2927361537942591841">"USB yaddaÅŸ fayl sisteminÉ™ daxil olmaq"</string>
+ <string name="permlab_mount_unmount_filesystems" product="default" msgid="4402305049890953810">"SD Kart fayl sisteminÉ™ daxil olmaq"</string>
+ <string name="permdesc_mount_unmount_filesystems" msgid="1829290701658992347">"Tətbiqə silinəbilən yaddaşları və ya fayl sistemini quraşdırma və ayırma icazəsi verir."</string>
+ <string name="permlab_mount_format_filesystems" product="nosdcard" msgid="6227819582624904972">"USB yaddaşı silir"</string>
+ <string name="permlab_mount_format_filesystems" product="default" msgid="262582698639274056">"SD kartı silir"</string>
+ <string name="permdesc_mount_format_filesystems" msgid="8784268246779198627">"Tətbiqə çıxarıla bilən yaddaşı format etməyə imkan verir."</string>
+ <string name="permlab_asec_access" msgid="3411338632002193846">"daxili yaddaşınız haqqında məlumat əldə etmək"</string>
+ <string name="permdesc_asec_access" msgid="3094563844593878548">"Tətbiqə daxili yaddaş haqqında məlumat almağa imkan verir."</string>
+ <string name="permlab_asec_create" msgid="6414757234789336327">"daxili yaddaÅŸ yaratmaq"</string>
+ <string name="permdesc_asec_create" msgid="4558869273585856876">"Tətbiqə daxili yaddaş yaratmaq üçün imkan verir."</string>
+ <string name="permlab_asec_destroy" msgid="526928328301618022">"daxili yaddaşı məhv etmə"</string>
+ <string name="permdesc_asec_destroy" msgid="7218749286145526537">"Tətbiqə daxili yaddaşı məhv etmə icazəsi verir."</string>
+ <string name="permlab_asec_mount_unmount" msgid="8877998101944999386">"daxili yaddaşı montaj və ya demontaj etmək"</string>
+ <string name="permdesc_asec_mount_unmount" msgid="3451360114902490929">"Tətbiqə daxili yaddaşı quraşdırma/ayırma icazəsi verir."</string>
+ <string name="permlab_asec_rename" msgid="7496633954080472417">"daxili yaddaşın adını dəyiş"</string>
+ <string name="permdesc_asec_rename" msgid="1794757588472127675">"Tətbiqə daxili yaddaşın adını dəyişmək imkanı verir."</string>
+ <string name="permlab_vibrate" msgid="7696427026057705834">"vibrasiyaya nəzarət edir"</string>
+ <string name="permdesc_vibrate" msgid="6284989245902300945">"Tətbiqə vibratoru idarə etmə icazəsi verir."</string>
+ <string name="permlab_flashlight" msgid="2155920810121984215">"Flash işığını idarə edir"</string>
+ <string name="permdesc_flashlight" msgid="6522284794568368310">"Tətbiqə siqnal işığı na nəzarət etməyə imkan verir."</string>
+ <string name="permlab_manageUsb" msgid="1113453430645402723">"USB cihazlar üçün tərcihləri və icazələri idarə etmək"</string>
+ <string name="permdesc_manageUsb" msgid="7776155430218239833">"Tətbiqə USB cihazlar üçün olan tərcihləri və icazələri idarə etməyə imkan verir."</string>
+ <string name="permlab_accessMtp" msgid="4953468676795917042">"MTP protokol həyata keçirmək"</string>
+ <string name="permdesc_accessMtp" msgid="6532961200486791570">"Kernel MTP drayverə girişə imkan verir ki, MTP USB protokolunu həyata keçirsin."</string>
+ <string name="permlab_hardware_test" msgid="4148290860400659146">"avadanlığı sınaq edir"</string>
+ <string name="permdesc_hardware_test" msgid="6597964191208016605">"Tətbiqə avadanlığı yoxlamaq üçün müxtəlif periferiyaları kontrol etməyə imkan verir."</string>
+ <string name="permlab_callPhone" msgid="3925836347681847954">"telefon nömrələrinə birbaşa zəng edir"</string>
+ <string name="permdesc_callPhone" msgid="3740797576113760827">"Tətbiqə Sizin müdaxiləniz olmadan telefon zəngləri etməyə imkan verir. Zərərli tətbiqlər Sizdən xəbərsiz şəkildə müxtəlif zənglər edərək, Sizə maddi ziyan vura bilər. Qeyd: Bu, tətbiqlərə təcili nömrələrə zəng etməyə icazə vermir."</string>
+ <string name="permlab_callPrivileged" msgid="4198349211108497879">"istənilən nömrəyə birbaşa zəng edir"</string>
+ <string name="permdesc_callPrivileged" msgid="1689024901509996810">"Tətbiqə Sizin müdaxiləniz olmadan, təcili zənglər də daxil olmaqla, istənilən telefon zəngini etməyə imkan verir. Zərərli tətbiqlər bundan istifadə edərək, təcili nömrələrə qanunsuz zəng vurmaqla Sizin üçün hüquqi problemlər yarada bilər."</string>
+ <string name="permlab_performCdmaProvisioning" product="tablet" msgid="4842576994144604821">"CDMA planşet ayarlarına birbaşa başlamaq"</string>
+ <string name="permlab_performCdmaProvisioning" product="default" msgid="5604848095315421425">"CDMA telefon quraşdırmalarına birbaşa başlamaq"</string>
+ <string name="permdesc_performCdmaProvisioning" msgid="1994193538802314186">"Tətbiqə CDMA hazırlığını başlatma icazəsi verir. Zərərli tətbiqlər ehtiyac olmadıqda CDMA hazırlığını başlada bilərlər."</string>
+ <string name="permlab_locationUpdates" msgid="7785408253364335740">"məkan güncəlləmə bildirişlərini idarə edir"</string>
+ <string name="permdesc_locationUpdates" msgid="1120741557891438876">"Tətbiqə radiodan gələn məkan güncəllənmələrini aktiv və ya deaktiv etməyə imkan verir. Normal tətbiqlər tərəfindən istifadə olunmur."</string>
+ <string name="permlab_checkinProperties" msgid="7855259461268734914">"qeydiyyat xüsusiyyətlərini əldə edir"</string>
+ <string name="permdesc_checkinProperties" msgid="4024526968630194128">"Tətbiqə giriş qeydi servisi tərəfindən yüklənmiş mülkiyyətə girişi oxumaq/yazmaq imkanl verir. Normal tətbiqlər üçün nəzərdə tutulmayıb."</string>
+ <string name="permlab_bindGadget" msgid="776905339015863471">"vidcetlər seç"</string>
+ <string name="permdesc_bindGadget" msgid="8261326938599049290">"Tətbiqə sistemə hansı vidcetin hansı tətbiq tərəfindən istifadə edilə bilməsini deməyə icazə verir. Bu icazəli tətbiqlər şəxsi məlumatlara və digər tətbiqlərə çıxış verə bilər. Normal tətbiqlər tərəfindən istifadə üçün deyil."</string>
+ <string name="permlab_modifyPhoneState" msgid="8423923777659292228">"telefon statusunu dəyişmək"</string>
+ <string name="permdesc_modifyPhoneState" msgid="1029877529007686732">"Tətbiqə cihazın telefon funksiyalarını idarə etmək imkanı verir. Belə icazəli tətbiq Sizi xəbərdar etmədən şəbəkələri qoşa, telefon radiosunu yandırıb-söndürə bilər."</string>
+ <string name="permlab_readPhoneState" msgid="9178228524507610486">"telefon statusunu və identifikasiyanı oxuyur"</string>
+ <string name="permdesc_readPhoneState" msgid="1639212771826125528">"Tətbiqə cihazın telefon funksiyalarına giriş icazəsi verir. Belə icazəli tətbiq bu telefonun nömrəsini və cihaz İD\'ni, zəngin aktiv olub-olmadığını və zəng edilən nömrəni müəyyən edə bilər."</string>
+ <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"planşetin yuxu rejiminin qarşısını almaq"</string>
+ <string name="permlab_wakeLock" product="default" msgid="573480187941496130">"telefonun yuxu rejiminə keçməsini əngəllə"</string>
+ <string name="permdesc_wakeLock" product="tablet" msgid="7311319824400447868">"Tətbiqə planşetin yuxu rejimini qadağan etməyə imkan verir."</string>
+ <string name="permdesc_wakeLock" product="default" msgid="8559100677372928754">"Tətbiqə telefonun yuxu rejimini qadağan etmək imkanı verir."</string>
+ <string name="permlab_devicePower" product="tablet" msgid="2787034722616350417">"planşeti yandırma və ya söndürmə"</string>
+ <string name="permlab_devicePower" product="default" msgid="4928622470980943206">"telefonu yandırmaq və ya söndürmək"</string>
+ <string name="permdesc_devicePower" product="tablet" msgid="6689862878984631831">"Tətbiqə planşeti yandırmağa və söndürməyə imkan verir."</string>
+ <string name="permdesc_devicePower" product="default" msgid="6037057348463131032">"Tətbiqə telefonu yandırıb söndürmə icazəsi verir."</string>
+ <string name="permlab_factoryTest" msgid="3715225492696416187">"zavod test rejimində işləyir"</string>
+ <string name="permdesc_factoryTest" product="tablet" msgid="3952059318359653091">"Planşet avadanlığına tam girişə imkan verməklə aşağı səviyyəli istehsalçı sınağı kimi işləyir. Yalnız planşet istehsalçı sınaq rejimində olduqda işləyir."</string>
+ <string name="permdesc_factoryTest" product="default" msgid="8136644990319244802">"Bir aşağı səviyyəli istehsalçı testi kimi çalışdırın, telefon hardware üçün tam giriş imkanı verir. Ancaq telefon, istehsalçı test rejimində çalışdığı zaman aktivdir."</string>
+ <string name="permlab_setWallpaper" msgid="6627192333373465143">"divar kağızı yerləşdirir"</string>
+ <string name="permdesc_setWallpaper" msgid="7373447920977624745">"Tətbiqə sistemə divar kağızı yerləşdirmək icazəsi verir."</string>
+ <string name="permlab_setWallpaperHints" msgid="3278608165977736538">"divar kağızı ölçüsünü verir"</string>
+ <string name="permdesc_setWallpaperHints" msgid="8235784384223730091">"Tətbiqə sistem divar kağızı ölçüsü göstərişlərini müəyyən etməyə imkan verir."</string>
+ <string name="permlab_masterClear" msgid="2315750423139697397">"fabrik defoltuna sıfırlamaq"</string>
+ <string name="permdesc_masterClear" msgid="3665380492633910226">"Tətbiqə bütün məlumatları, nizamları və quraşdırılmış tətbiqləri silərək sistemi fabrik nizamlarına qaytarmaq imkanı verir."</string>
+ <string name="permlab_setTime" msgid="2021614829591775646">"vaxtı təyin edir"</string>
+ <string name="permdesc_setTime" product="tablet" msgid="1896341438151152881">"Tətbiqə planşetin saat vaxtını dəyişməyə imkan verir."</string>
+ <string name="permdesc_setTime" product="default" msgid="1855702730738020">"Tətbiqə telefonun saat vaxtını dəyişməyə imkan verir."</string>
+ <string name="permlab_setTimeZone" msgid="2945079801013077340">"vaxt zonasını quraşdırır"</string>
+ <string name="permdesc_setTimeZone" product="tablet" msgid="1676983712315827645">"Tətbiqə planşetin vaxt zonasını dəyişmə icazəsi verir."</string>
+ <string name="permdesc_setTimeZone" product="default" msgid="4499943488436633398">"Tətbiqə telefon saat zolağını dəyişmək üçün imkan verir."</string>
+ <string name="permlab_accountManagerService" msgid="4829262349691386986">"AccountManagerService kimi davranır"</string>
+ <string name="permdesc_accountManagerService" msgid="1948455552333615954">"Tətbiqə AccountAuthenticators\'ə zəng etməyə imkan verir."</string>
+ <string name="permlab_getAccounts" msgid="1086795467760122114">"cihazda hesabları tapır"</string>
+ <string name="permdesc_getAccounts" product="tablet" msgid="2741496534769660027">"Tətbiqə planşet tərəfindən bilinən hesabların siyahısını alma icazəsi verir. Bu quraşdırdığınız tətbiqlər tərəfindən yaradılmış istənilən hesab ola bilər."</string>
+ <string name="permdesc_getAccounts" product="default" msgid="3448316822451807382">"Tətbiqə telefonda olan hesabların siyahısını əldə etməyə imkan verir. Buna quraşdırdığınız istənilən tətbiq tərəfindən yaradılan hesablar da aiddir."</string>
+ <string name="permlab_authenticateAccounts" msgid="5265908481172736933">"hesablar yaradır və parollar təyin edir"</string>
+ <string name="permdesc_authenticateAccounts" msgid="5472124296908977260">"Tətbiqə AccountManager\'in hesab yaratmaq və parol almaq və açmaq daxil olmaqla bərabər, hesab təsdiqləyici imkanlarını istifadə etməyə icazə verir."</string>
+ <string name="permlab_manageAccounts" msgid="4983126304757177305">"hesabları əlavə edir və ya silir"</string>
+ <string name="permdesc_manageAccounts" msgid="8698295625488292506">"Tətbiqə hesabların əlavə olunması və ya silinməsi, həmçinin onların parollarının silinməsi kimi əməliyyatları icra etməyə imkan verir."</string>
+ <string name="permlab_useCredentials" msgid="235481396163877642">"cihazda hesablar istifadə etmək"</string>
+ <string name="permdesc_useCredentials" msgid="7984227147403346422">"Tətbiqə autentifikasiya tokenləri sorğularını göndərməyə icazə verir."</string>
+ <string name="permlab_accessNetworkState" msgid="4951027964348974773">"şəbəkə bağlantılarına baxmaq"</string>
+ <string name="permdesc_accessNetworkState" msgid="8318964424675960975">"Tətbiqə mövcud olan və qoşulan şəbəkələr kimi qoşulmalar haqqında məlumatı görməyə icazə verir."</string>
+ <string name="permlab_createNetworkSockets" msgid="8018758136404323658">"tam şəbəkə girişi"</string>
+ <string name="permdesc_createNetworkSockets" msgid="3403062187779724185">"Tətbiqə şəbəkə soketlərini yaratmağa və fərdi şəbəkə protokollarını istifadə etməyə imkan verir. Brauzer və digər tətbiqlər datanın internetə ötürülməsini təmin edən vəsaitlər verir, ona görə də datanın internetə gönrədilməsi üçün bu icazə tələb olunmur."</string>
+ <string name="permlab_writeApnSettings" msgid="505660159675751896">"şəbəkə nizamlarını və trafiki dəyişdirir/qarşısını alır"</string>
+ <string name="permdesc_writeApnSettings" msgid="5333798886412714193">"Tətbiqə şəbəkə trafikinin qarşısını almaq üçün şəbəkə nizamlarını dəyişmə icazəsi verir, məsələn proksini və ya istənilən APN-in portunu. Zərərli tətbiqlər şəbəkə paketlərini sizin bilginiz olmadan monitorinq edə, yönləndirə və ya redaktə edə bilər."</string>
+ <string name="permlab_changeNetworkState" msgid="958884291454327309">"şəbəkə bağlantısını dəyişir"</string>
+ <string name="permdesc_changeNetworkState" msgid="6789123912476416214">"Tətbiqə şəbəkə vəziyyətini dəyişməyə icazə verir."</string>
+ <string name="permlab_changeTetherState" msgid="5952584964373017960">"Sərhədli bağlantını dəyişir"</string>
+ <string name="permdesc_changeTetherState" msgid="1524441344412319780">"Tətbiqə birləşilmiş şəbəkə bağlantısının statusunu dəyişməyə imkan verir."</string>
+ <string name="permlab_changeBackgroundDataSetting" msgid="1400666012671648741">"arxafon data istifadəsi ayarını dəyişir"</string>
+ <string name="permdesc_changeBackgroundDataSetting" msgid="5347729578468744379">"Tətbiqə fon rejimi nizamlarını dəyişməyə icazə verir."</string>
+ <string name="permlab_accessWifiState" msgid="5202012949247040011">"Wi-Fi bağlantılarına baxmaq"</string>
+ <string name="permdesc_accessWifiState" msgid="5002798077387803726">"Tətbiqə Wi-Fi şəbəkələri haqqında məlumatı görməyə icazə verir, məsələn, Wi-Fi mövcudluğu və qoşulmuş Wi-Fi cihazlarının adları."</string>
+ <string name="permlab_changeWifiState" msgid="6550641188749128035">"Wi-Fi şəbəkəsinə qoşulmaq və ya ayrılmaq"</string>
+ <string name="permdesc_changeWifiState" msgid="7137950297386127533">"Tətbiqə Wi-Fi çıxış nöqtəsinə qoşulmaq və ondan ayrılmaq və cihazın Wi-Fi şəbəkə nizamlarını dəyişməyə icazə verir."</string>
+ <string name="permlab_changeWifiMulticastState" msgid="1368253871483254784">"Wi-Fi Multicast qəbuluna icazə ver"</string>
+ <string name="permdesc_changeWifiMulticastState" product="tablet" msgid="7969774021256336548">"Tətbiqə Wi-Fi şəbəkədə sizin planşetdən başqa digər multikast adreslərə yönləndirilmiş paketləri almaq icazəsi verir. Bu qeyri-çoxadresli rejimdən fəqli olaraq daha çox enerji işlədir."</string>
+ <string name="permdesc_changeWifiMulticastState" product="default" msgid="6851949706025349926">"Tətbiqə qrup ünvanlar istifadə etməklə, Wi-Fi şəbəkəsində olan bütün cihazlara göndərilmiş paketləri qəbul etməyə imkan verir. Buna daha çox enerji sərf olunur."</string>
+ <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"Bluetooth ayarlarını əldə edir"</string>
+ <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Tətbiqə yerli Bluetooth planşetinin konfiqurasiyasını görməyə və məsafədən cihazları tapmağa və cütləməyə imkan verir."</string>
+ <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Tətbiqə lokal Bluetooth telefonunu konfiqurə etməyə və uzaq cihazları kəşf etmək və onlara qoşulmaq icazəsi verir."</string>
+ <string name="permlab_accessWimaxState" msgid="4195907010610205703">"WiMAX\'a qoşul və bağlantını kəs"</string>
+ <string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Tətbiqə WiMAX mövcudluğu və qoşulmuş WiMAX şəbəkələrini təyin etməyə icazə verir."</string>
+ <string name="permlab_changeWimaxState" msgid="2405042267131496579">"WiMAX vəziyyətini dəyişir"</string>
+ <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"Tətbiqə planşeti WiMAX şəbəkələrinə qoşmaq və onlardan ayırmaq icazəsi verir."</string>
+ <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"Tətbiqə telefonu WiMAX şəbəkəsinə qoşmağa və ya WiMAX şəbəkəsindən ayırmağa imkan verir."</string>
+ <string name="permlab_bluetooth" msgid="6127769336339276828">"Bluetooth cihazları ilə cütləndirmək"</string>
+ <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"Tətbiqə yerli Bluetooth planşetinin konfiqurasiyasını görməyə və cütlənmiş cihazlarla bağlantılar etməyə və qəbul etməyə imkan verir."</string>
+ <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"Tətbiqə Bluetooth və ya telefon konfiqurasiyalarını görməyə və qoşulmuş cihazlarla əlaqə qurmağa və qəbul etməyə icazə verir."</string>
+ <string name="permlab_nfc" msgid="4423351274757876953">"Near Field Communication\'ı kontrol et"</string>
+ <string name="permdesc_nfc" msgid="7120611819401789907">"Tətbiqə Yaxın Məsafə Kommunikasiyası (NFC) teqləri, kartları və oxuyucuları ilə əlaqə qurmağa icazə verir."</string>
+ <string name="permlab_disableKeyguard" msgid="3598496301486439258">"Ekran kilidini deaktiv edir"</string>
+ <string name="permdesc_disableKeyguard" msgid="6034203065077122992">"Tətbiqə kilid açarını və təhlükəsizlik parolunu deaktiv etməyə imkan verir. Qanuni misal budur ki, telefon zəng qəbul edən zaman kilidi açır və zəng qurtarandan sonra kilidi bağlayır."</string>
+ <string name="permlab_readSyncSettings" msgid="6201810008230503052">"sinx ayarlarını oxu"</string>
+ <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Tətbiqə hesablar üçün sinxronizasiya nizamlarını oxuma icazəsi verir. Məsələn, bu Şəxslər tətbiqinin sinxronizə olunub-olunmadığını təyin edə bilər."</string>
+ <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"sinxronizasiyaya davam edir və onu söndürür"</string>
+ <string name="permdesc_writeSyncSettings" msgid="8956262591306369868">"Tətbiqə hesab üçün sinxronizasiya nizamlarını dəyişməyə icazə verir. Məsələn, bu istifadəçi hesablı Şəxslər tətbiqinin sinxronizasiyasını başlamaq üçün istifadə edilə bilər."</string>
+ <string name="permlab_readSyncStats" msgid="7396577451360202448">"sinxronizasiya statistikasını oxumaq"</string>
+ <string name="permdesc_readSyncStats" msgid="1510143761757606156">"Tətbiqə sync tədbirlərinin tarixçəsi və nə qədər datanın sinx olduğu da daxil olmaqla bərabər, hər hansı bir hesab üçün olan sinx statlarını oxumağa imkan verir."</string>
+ <string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"abunə olunmuş xəbərləri oxuyur"</string>
+ <string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"Tətbiqə hazırda sinxron lentlər haqqında ətraflı məlumat almaq üçün imkan verir."</string>
+ <string name="permlab_subscribedFeedsWrite" msgid="9015246325408209296">"abunə olunmuş xəbərləri yazır"</string>
+ <string name="permdesc_subscribedFeedsWrite" msgid="6928930188826089413">"Tətbiqə cari sinxronlaşmış lentlərinizə dəyişiklik etmək imkanı verir. Zərərli tətbiqlər sixronlaşmış lentlərinizi dəyişə bilər."</string>
+ <string name="permlab_readDictionary" msgid="4107101525746035718">"lüğətə əlavə etdiyiniz şərtləri oxumaq"</string>
+ <string name="permdesc_readDictionary" msgid="659614600338904243">"Tətbiqə istifadəçinin lüğətdə saxladığı bütün sözləri, adları və frazaları oxumaq icazəsi verir."</string>
+ <string name="permlab_writeDictionary" msgid="2183110402314441106">"istifadəçi lüğətinə sözlər əlavə etmək"</string>
+ <string name="permdesc_writeDictionary" msgid="8185385716255065291">"Tətbiqə istifadəçi lüğətinə yeni sözlər yazmağa imkan verir."</string>
+ <string name="permlab_sdcardRead" product="nosdcard" msgid="8235341515605559677">"qorunmuş yaddaşa daxil olmağa cəhd etmək"</string>
+ <string name="permlab_sdcardRead" product="default" msgid="8235341515605559677">"qorunmuş yaddaşa daxil olmağa cəhd etmək"</string>
+ <string name="permdesc_sdcardRead" product="nosdcard" msgid="3642473292348132072">"Tətbiqə gələcək cihazlarda əlçatımlı olacaq USB yaddaş üçün icazə testi etməyə imkan verir."</string>
+ <string name="permdesc_sdcardRead" product="default" msgid="5914402684685848828">"Tətbiqə gələcək cihazlarda mövcud olacaq SD kart üçün icazəni test etmək üçün imkan verir."</string>
+ <string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"USB yaddaşınızın məzmununu dəyişmək və ya silmək"</string>
+ <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"SD kart kontentlərini dəyişir və ya silir"</string>
+ <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"Tətbiqə USB yaddaşa yazmağa imkan verir."</string>
+ <string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Tətbiqə SD karta yazma icazəsi verir."</string>
+ <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"daxili media yaddaşı kontentini dəyişir/silir"</string>
+ <string name="permdesc_mediaStorageWrite" product="default" msgid="8189160597698529185">"Tətbiqə daxili media yaddaşdakı kontenti redaktə etmək icazəsi verir."</string>
+ <string name="permlab_manageDocs" product="default" msgid="5778318598448849829">"sənəd yaddaşını nizamlayır"</string>
+ <string name="permdesc_manageDocs" product="default" msgid="8704323176914121484">"Tətbiqə sənəd yaddaşını idarə etməyə imkan verir."</string>
+ <string name="permlab_sdcardAccessAll" msgid="8150613823900460576">"bütün istifadəçilərin xarici yaddaşına daxil ol"</string>
+ <string name="permdesc_sdcardAccessAll" msgid="3215208357415891320">"Tətbiqə bütün istifadəçilər üçün olan xarici yaddaşa giriş imkanı verir."</string>
+ <string name="permlab_cache_filesystem" msgid="5656487264819669824">"keş fayl sisteminə girmək"</string>
+ <string name="permdesc_cache_filesystem" msgid="5578967642265550955">"Tətbiqə keş fayl sistemini oxumağa və yazmağa icazə verir."</string>
+ <string name="permlab_use_sip" msgid="5986952362795870502">"İnternet zəngləri etmək və ya qəbul etmək"</string>
+ <string name="permdesc_use_sip" msgid="4717632000062674294">"Tətbiqə internet zənglərinin göndərilməsi və qəbul edilməsi üçün SIP servisindən istifadə icazəsi verir."</string>
+ <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"tarixi şəbəkə istifadəsini oxu"</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"Tətbiqə xüsusi şəbəkələr və tətbiqlər üçün tarixi şəbəkə istifadəsini oxumağa icazə verir."</string>
+ <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"şəbəkə siyasətini idarə etmək"</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"Tətbiqə şəbəkə qanunlarını və tətbiqin xüsusi qaydalarını idarə etmək imkanı verir."</string>
+ <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"şəbəkə istifadə hesabını dəyişmək"</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"Tətbiqə şəbəkə istifadəsinin tətbiqlərə qarşı nizamlarını redaktə etməyə icazə verir. Normal tətbiqlər tərəfindən istifadə edilmir."</string>
+ <string name="permlab_markNetworkSocket" msgid="3658527214914959749">"soket işarələrini dəyişin"</string>
+ <string name="permdesc_markNetworkSocket" msgid="7655568433696356578">"Tətbiqə araşdırma üçün soket işarələrini dəyişmək imkanı verir"</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"bildirişlərə daxil ol"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"Tətbiqə bildirişləri əldə etməyə, sınamağa və təmizləməyə imkan verir, buna digər tətbiqlər tərəfindən verilmiş bildirişlər də daxildir."</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"bildiriş dinləmə xidmətinə bağlanır"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"Sahibinə yüksək səviyyəli bildiriş dinləmə servisi ilə əlaqə saxlamağa icazə verir. Normal tətbiqlər tərəfindən heç vaxt istənilməməlidir."</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"operator xidmətli konfiurasiya tətbiqinə müraciət edin"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"Sahibinə operator xidmətli tətbiq konfiqurasiyasına müraciət imkanı verir. Normal tətbiqlər üçün tələb olunmamalıdır."</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"şəbəkə şəraiti haqqında müşahidələr üçün qulaq asmaq"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"Tətbiqə şəbəkə şəraiti üzrə müşahidələr üçün qulaq asmaq imkanı verir. Normal tətbiqlər üçün heç vaxt lazım olmamalıdır."</string>
+ <string name="permlab_hotwordRecognition" msgid="3225080408746361313">"isti söz tanınması tələb et"</string>
+ <string name="permdesc_hotwordRecognition" msgid="3716741260195364252">"Tətbiqə isti söz tanınması tələb etməyə imkan verir. Normal tətbiq üçün lazım ola bilməz."</string>
+ <string name="policylab_limitPassword" msgid="4497420728857585791">"Parol qaydalarını təyin edin"</string>
+ <string name="policydesc_limitPassword" msgid="3252114203919510394">"Ekran kilidini açan şifrələrin uzunluğunu və onlardakı icazə verilən işarələrə nəzarət edir."</string>
+ <string name="policylab_watchLogin" msgid="914130646942199503">"Ekran kilidi cəhdlərini monitorinq et"</string>
+ <string name="policydesc_watchLogin" product="tablet" msgid="3215729294215070072">"Ekan kilidini açarkən daxil edilmiş yanlış parollara baxın və əgər həddindən çox yanlış parollar daxil edilibsə, planşeti kilidləyin və ya bütün planşet datasını silin."</string>
+ <string name="policydesc_watchLogin" product="default" msgid="5712323091846761073">"Ekan kilidini açarkən daxil edilmiş yanlış parollara baxın və əgər həddindən çox yanlış parollar daxil edilibsə, telefonu kilidləyin və ya bütün telefon datasını silin."</string>
+ <string name="policylab_resetPassword" msgid="2620077191242688955">"Ekran kilid parolunu dəyişin"</string>
+ <string name="policydesc_resetPassword" msgid="605963962301904458">"Ekran kilidini açan şifrəni dəyişdirin."</string>
+ <string name="policylab_forceLock" msgid="2274085384704248431">"Ekranı kilidləyin"</string>
+ <string name="policydesc_forceLock" msgid="1141797588403827138">"Ekranın nə vaxt və necə kilidlənməsinə nəzarət edir."</string>
+ <string name="policylab_wipeData" msgid="3910545446758639713">"Bütün məlumatları silin"</string>
+ <string name="policydesc_wipeData" product="tablet" msgid="4306184096067756876">"Planşetin datasını xəbərdarlıq olmadan, zavod data sıfırlaması ilə silin."</string>
+ <string name="policydesc_wipeData" product="default" msgid="5096895604574188391">"Telefonun datasını xəbərdarlıq olmadan, zavod data sıfırlaması ilə silin"</string>
+ <string name="policylab_setGlobalProxy" msgid="2784828293747791446">"Cihazın qlobal proksisini ayarlayın"</string>
+ <string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"Siyasət aktiv olarkən cihazın qlobal proksisini istifadə üçün qurun. Yalnız ilk cihaz admini effektiv qlobal proksini təyin edir."</string>
+ <string name="policylab_expirePassword" msgid="885279151847254056">"Ekran kilidi şifrəsinə son zaman seç"</string>
+ <string name="policydesc_expirePassword" msgid="1729725226314691591">"Ekran kilidi parolunun nə qədər tez-tez dəyişməsini kontrol edin."</string>
+ <string name="policylab_encryptedStorage" msgid="8901326199909132915">"Yaddaş şifrələnməsini ayarlayın"</string>
+ <string name="policydesc_encryptedStorage" msgid="2637732115325316992">"Tətbiq məlumatlarının şifrələnməsini tələb edir."</string>
+ <string name="policylab_disableCamera" msgid="6395301023152297826">"Kameraları dekativ edin"</string>
+ <string name="policydesc_disableCamera" msgid="2306349042834754597">"Bütün cihaz kameralarının istifadəsini əngəllə."</string>
+ <string name="policylab_disableKeyguardFeatures" msgid="266329104542638802">"Klaviatura kilidində funksiyaları deaktiv edin"</string>
+ <string name="policydesc_disableKeyguardFeatures" msgid="3467082272186534614">"Klaviatura kilidində bəzi funksiyaların qarşısını alın."</string>
+ <string-array name="phoneTypes">
+ <item msgid="8901098336658710359">"Æsas sÉ™hifÉ™"</item>
+ <item msgid="869923650527136615">"Mobil"</item>
+ <item msgid="7897544654242874543">"İş"</item>
+ <item msgid="1103601433382158155">"İş Faksı"</item>
+ <item msgid="1735177144948329370">"Ev Faksı"</item>
+ <item msgid="603878674477207394">"Peycer"</item>
+ <item msgid="1650824275177931637">"Digər"</item>
+ <item msgid="9192514806975898961">"Şəxsi"</item>
+ </string-array>
+ <string-array name="emailAddressTypes">
+ <item msgid="8073994352956129127">"Ana səhifə"</item>
+ <item msgid="7084237356602625604">"İş"</item>
+ <item msgid="1112044410659011023">"Digər"</item>
+ <item msgid="2374913952870110618">"Fərdi"</item>
+ </string-array>
+ <string-array name="postalAddressTypes">
+ <item msgid="6880257626740047286">"Æsas sÉ™hifÉ™"</item>
+ <item msgid="5629153956045109251">"İş"</item>
+ <item msgid="4966604264500343469">"Digər"</item>
+ <item msgid="4932682847595299369">"Düzənləyin"</item>
+ </string-array>
+ <string-array name="imAddressTypes">
+ <item msgid="1738585194601476694">"Æsas sÉ™hifÉ™"</item>
+ <item msgid="1359644565647383708">"İş"</item>
+ <item msgid="7868549401053615677">"Digər"</item>
+ <item msgid="3145118944639869809">"Fərdi"</item>
+ </string-array>
+ <string-array name="organizationTypes">
+ <item msgid="7546335612189115615">"İş"</item>
+ <item msgid="4378074129049520373">"Digər"</item>
+ <item msgid="3455047468583965104">"Fərdi"</item>
+ </string-array>
+ <string-array name="imProtocols">
+ <item msgid="8595261363518459565">"AIM"</item>
+ <item msgid="7390473628275490700">"Windows Live"</item>
+ <item msgid="7882877134931458217">"Yahoo"</item>
+ <item msgid="5035376313200585242">"Skype"</item>
+ <item msgid="7532363178459444943">"QQ"</item>
+ <item msgid="3713441034299660749">"Google Söhbət"</item>
+ <item msgid="2506857312718630823">"ICQ"</item>
+ <item msgid="1648797903785279353">"Jabber"</item>
+ </string-array>
+ <string name="phoneTypeCustom" msgid="1644738059053355820">"Şəxsi"</string>
+ <string name="phoneTypeHome" msgid="2570923463033985887">"Ev"</string>
+ <string name="phoneTypeMobile" msgid="6501463557754751037">"Mobil"</string>
+ <string name="phoneTypeWork" msgid="8863939667059911633">"İş"</string>
+ <string name="phoneTypeFaxWork" msgid="3517792160008890912">"İş Faksı"</string>
+ <string name="phoneTypeFaxHome" msgid="2067265972322971467">"Ev Faksı"</string>
+ <string name="phoneTypePager" msgid="7582359955394921732">"Peycer"</string>
+ <string name="phoneTypeOther" msgid="1544425847868765990">"Digər"</string>
+ <string name="phoneTypeCallback" msgid="2712175203065678206">"Geriyə zəng"</string>
+ <string name="phoneTypeCar" msgid="8738360689616716982">"Avtomobil"</string>
+ <string name="phoneTypeCompanyMain" msgid="540434356461478916">"Şirkət"</string>
+ <string name="phoneTypeIsdn" msgid="8022453193171370337">"ISDN"</string>
+ <string name="phoneTypeMain" msgid="6766137010628326916">"Æsas"</string>
+ <string name="phoneTypeOtherFax" msgid="8587657145072446565">"Digər faks"</string>
+ <string name="phoneTypeRadio" msgid="4093738079908667513">"Radio"</string>
+ <string name="phoneTypeTelex" msgid="3367879952476250512">"Teleks"</string>
+ <string name="phoneTypeTtyTdd" msgid="8606514378585000044">"TTY TDD"</string>
+ <string name="phoneTypeWorkMobile" msgid="1311426989184065709">"Mobil iÅŸ telefonu"</string>
+ <string name="phoneTypeWorkPager" msgid="649938731231157056">"İş Peyceri"</string>
+ <string name="phoneTypeAssistant" msgid="5596772636128562884">"Köməkçi"</string>
+ <string name="phoneTypeMms" msgid="7254492275502768992">"MMS"</string>
+ <string name="eventTypeCustom" msgid="7837586198458073404">"Fərdi"</string>
+ <string name="eventTypeBirthday" msgid="2813379844211390740">"Doğum günü"</string>
+ <string name="eventTypeAnniversary" msgid="3876779744518284000">"İldönümü"</string>
+ <string name="eventTypeOther" msgid="7388178939010143077">"Digər"</string>
+ <string name="emailTypeCustom" msgid="8525960257804213846">"Fərdi"</string>
+ <string name="emailTypeHome" msgid="449227236140433919">"Æsas sÉ™hifÉ™"</string>
+ <string name="emailTypeWork" msgid="3548058059601149973">"İş"</string>
+ <string name="emailTypeOther" msgid="2923008695272639549">"Digər"</string>
+ <string name="emailTypeMobile" msgid="119919005321166205">"Mobil"</string>
+ <string name="postalTypeCustom" msgid="8903206903060479902">"Fərdi"</string>
+ <string name="postalTypeHome" msgid="8165756977184483097">"Æsas sÉ™hifÉ™"</string>
+ <string name="postalTypeWork" msgid="5268172772387694495">"İş"</string>
+ <string name="postalTypeOther" msgid="2726111966623584341">"Digər"</string>
+ <string name="imTypeCustom" msgid="2074028755527826046">"Fərdi"</string>
+ <string name="imTypeHome" msgid="6241181032954263892">"Ana səhifə"</string>
+ <string name="imTypeWork" msgid="1371489290242433090">"İş"</string>
+ <string name="imTypeOther" msgid="5377007495735915478">"Digər"</string>
+ <string name="imProtocolCustom" msgid="6919453836618749992">"Şəxsi"</string>
+ <string name="imProtocolAim" msgid="7050360612368383417">"AIM"</string>
+ <string name="imProtocolMsn" msgid="144556545420769442">"Windows Live"</string>
+ <string name="imProtocolYahoo" msgid="8271439408469021273">"Yahoo"</string>
+ <string name="imProtocolSkype" msgid="9019296744622832951">"Skype"</string>
+ <string name="imProtocolQq" msgid="8887484379494111884">"QQ"</string>
+ <string name="imProtocolGoogleTalk" msgid="493902321140277304">"Görüşlər"</string>
+ <string name="imProtocolIcq" msgid="1574870433606517315">"ICQ"</string>
+ <string name="imProtocolJabber" msgid="2279917630875771722">"Jabber"</string>
+ <string name="imProtocolNetMeeting" msgid="8287625655986827971">"NetMeeting"</string>
+ <string name="orgTypeWork" msgid="29268870505363872">"İş"</string>
+ <string name="orgTypeOther" msgid="3951781131570124082">"Digər"</string>
+ <string name="orgTypeCustom" msgid="225523415372088322">"Fərdi"</string>
+ <string name="relationTypeCustom" msgid="3542403679827297300">"Şəxsi"</string>
+ <string name="relationTypeAssistant" msgid="6274334825195379076">"Köməkçi"</string>
+ <string name="relationTypeBrother" msgid="8757913506784067713">"QardaÅŸ"</string>
+ <string name="relationTypeChild" msgid="1890746277276881626">"UÅŸaq"</string>
+ <string name="relationTypeDomesticPartner" msgid="6904807112121122133">"Ev yoldaşı"</string>
+ <string name="relationTypeFather" msgid="5228034687082050725">"Ata"</string>
+ <string name="relationTypeFriend" msgid="7313106762483391262">"Dost"</string>
+ <string name="relationTypeManager" msgid="6365677861610137895">"Müdir"</string>
+ <string name="relationTypeMother" msgid="4578571352962758304">"Ana"</string>
+ <string name="relationTypeParent" msgid="4755635567562925226">"Valideyn"</string>
+ <string name="relationTypePartner" msgid="7266490285120262781">"Ortaq"</string>
+ <string name="relationTypeReferredBy" msgid="101573059844135524">"Dəvət edən"</string>
+ <string name="relationTypeRelative" msgid="1799819930085610271">"Qohum"</string>
+ <string name="relationTypeSister" msgid="1735983554479076481">"Bacı"</string>
+ <string name="relationTypeSpouse" msgid="394136939428698117">"Həyat yoldaşı"</string>
+ <string name="sipAddressTypeCustom" msgid="2473580593111590945">"Fərdi"</string>
+ <string name="sipAddressTypeHome" msgid="6093598181069359295">"Æsas sÉ™hifÉ™"</string>
+ <string name="sipAddressTypeWork" msgid="6920725730797099047">"İş"</string>
+ <string name="sipAddressTypeOther" msgid="4408436162950119849">"Digər"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"PİN kodu daxil edin"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"PUK və yeni PİN kod daxil edin"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"PUK kod"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"Yeni PIN kodu"</string>
+ <string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"Şifrə daxil etmək üçün toxunun"</font></string>
+ <string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Kilidi açmaq üçün parol yazın"</string>
+ <string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Kilidi açmaq üçün PIN daxil edin"</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"Yanlış PIN kodu."</string>
+ <string name="keyguard_label_text" msgid="861796461028298424">"Kilidi açmaq üçün Menyu, sonra 0 basın."</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"Təcili nömrə"</string>
+ <string name="lockscreen_carrier_default" msgid="8963839242565653192">"Xidmət yoxdur."</string>
+ <string name="lockscreen_screen_locked" msgid="7288443074806832904">"Ekran kilidlənib."</string>
+ <string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Təcili zəng kilidini açmaq və ya yerləşdirmək üçün Menyu düyməsinə basın."</string>
+ <string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Kilidi açmaq üçün Menyu düyməsinə basın."</string>
+ <string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"Kilidi açmaq üçün model çəkin"</string>
+ <string name="lockscreen_emergency_call" msgid="5347633784401285225">"Təcili zəng"</string>
+ <string name="lockscreen_return_to_call" msgid="5244259785500040021">"Zəngə qayıt"</string>
+ <string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Düzdür!"</string>
+ <string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"Bir də cəhd edin"</string>
+ <string name="lockscreen_password_wrong" msgid="5737815393253165301">"Bir daha cəhd et"</string>
+ <string name="faceunlock_multiple_failures" msgid="754137583022792429">"Sifət kilidi cəhdləriniz bitdi"</string>
+ <string name="lockscreen_plugged_in" msgid="8057762828355572315">"Batareya yığılır, <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+ <string name="lockscreen_charged" msgid="321635745684060624">"Dolub"</string>
+ <string name="lockscreen_battery_short" msgid="4477264849386850266">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+ <string name="lockscreen_low_battery" msgid="1482873981919249740">"ElektrikÉ™ qoÅŸun."</string>
+ <string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"SIM kart yoxdur."</string>
+ <string name="lockscreen_missing_sim_message" product="tablet" msgid="151659196095791474">"PlanÅŸetdÉ™ SIM kart yoxdur."</string>
+ <string name="lockscreen_missing_sim_message" product="default" msgid="2186920585695169078">"Telefonda SİM kart yoxdur."</string>
+ <string name="lockscreen_missing_sim_instructions" msgid="5372787138023272615">"SİM kart daxil edin."</string>
+ <string name="lockscreen_missing_sim_instructions_long" msgid="3526573099019319472">"SİM kart yoxdur və ya oxuna bilinmir. SİM kart daxil edin."</string>
+ <string name="lockscreen_permanent_disabled_sim_message_short" msgid="5096149665138916184">"Yararsız SIM kart."</string>
+ <string name="lockscreen_permanent_disabled_sim_instructions" msgid="910904643433151371">"Sizin SİM kartınız daimi olaraq deaktivləşib.\n Başqa SİM kart üçün simsiz xidmət provayderinizə müraciət edin."</string>
+ <string name="lockscreen_transport_prev_description" msgid="201594905152746886">"ÆvvÉ™lki trek düymÉ™si"</string>
+ <string name="lockscreen_transport_next_description" msgid="6089297650481292363">"Növbəti trek düyməsi"</string>
+ <string name="lockscreen_transport_pause_description" msgid="7659088786780128001">"Pauza düyməsi"</string>
+ <string name="lockscreen_transport_play_description" msgid="5888422938351019426">"Oxutma düyməsi"</string>
+ <string name="lockscreen_transport_stop_description" msgid="4562318378766987601">"Dayandırma düyməsi"</string>
+ <string name="emergency_calls_only" msgid="6733978304386365407">"Yalnız təcili zənglər"</string>
+ <string name="lockscreen_network_locked_message" msgid="143389224986028501">"Şəbəkə kilidlidir"</string>
+ <string name="lockscreen_sim_puk_locked_message" msgid="7441797339976230">"SIM kart PUK ilə kilidlənib."</string>
+ <string name="lockscreen_sim_puk_locked_instructions" msgid="8127916255245181063">"İstifadəçi Təlimatlarına baxın və ya Müştəri Xidmətlərinə müraciət edin."</string>
+ <string name="lockscreen_sim_locked_message" msgid="8066660129206001039">"SIM kart kilidlənib."</string>
+ <string name="lockscreen_sim_unlock_progress_dialog_message" msgid="595323214052881264">"SİM kartın kilidi açılır..."</string>
+ <string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="6481623830344107222">"Siz kilid modelini <xliff:g id="NUMBER_0">%d</xliff:g> dəfə yanlış çəkdiniz. \n\n <xliff:g id="NUMBER_1">%d</xliff:g> saniyə içində yenidən sınayın."</string>
+ <string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="2725973286239344555">"Şifrənizi <xliff:g id="NUMBER_0">%d</xliff:g> dəfə yanlış daxil etdiniz.\n\n <xliff:g id="NUMBER_1">%d</xliff:g> saniyə ərzində yenidən yoxlayın"</string>
+ <string name="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="6216672706545696955">"Siz PIN nömrənizi <xliff:g id="NUMBER_0">%d</xliff:g> dəfə yanlış daxil etdiniz. \n \n <xliff:g id="NUMBER_1">%d</xliff:g> saniyə içində təkrar sınayın."</string>
+ <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="9191611984625460820">"Siz kilidi açmaq üçün şablonu <xliff:g id="NUMBER_0">%d</xliff:g> dəfə səhv çəkdiniz. <xliff:g id="NUMBER_1">%d</xliff:g> daha uğursuz cəhddən sonra planşetin kilidini Google hesabınıza daxil olmaqla açmağınız istəniləcək.\n\n <xliff:g id="NUMBER_2">%d</xliff:g> saniyə ərzində bir daha yoxlayın."</string>
+ <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="2590227559763762751">"Siz kilidi açmaq üçün şablonu <xliff:g id="NUMBER_0">%d</xliff:g> dəfə səhv çəkdiniz. <xliff:g id="NUMBER_1">%d</xliff:g> daha uğursuz cəhddən sonra planşetin kilidini Google hesabınıza daxil olmaqla açmağınız tələb olunacaq.\n\n <xliff:g id="NUMBER_2">%d</xliff:g> saniyə ərzində bir daha yoxlayın."</string>
+ <string name="lockscreen_failed_attempts_almost_at_wipe" product="tablet" msgid="6128106399745755604">"Siz planşet kilidini açmaq üçün <xliff:g id="NUMBER_0">%d</xliff:g> dəfə uğursuz cəhd etmisiniz. <xliff:g id="NUMBER_1">%d</xliff:g> dəfə də uğursuz cəhd etsəniz, planşet fabrik ayarlarına sıfırlanacaq və bütün məlumatlarınız itəcək."</string>
+ <string name="lockscreen_failed_attempts_almost_at_wipe" product="default" msgid="8603565142156826565">"Siz telefon kilidini açmaq üçün <xliff:g id="NUMBER_0">%d</xliff:g> dəfə uğursuz cəhd etmisiniz. <xliff:g id="NUMBER_1">%d</xliff:g> dəfə də uğursuz cəhd etsəniz, telefon zavod ayarlarına sıfırlanacaq və bütün məlumatlarınız itəcək."</string>
+ <string name="lockscreen_failed_attempts_now_wiping" product="tablet" msgid="280873516493934365">"Siz planşetin kilidini açmaq üçün <xliff:g id="NUMBER">%d</xliff:g> yanlış cəhd etmisiniz. Planşet artıq defolt zavod halına sıfırlanacaq."</string>
+ <string name="lockscreen_failed_attempts_now_wiping" product="default" msgid="3025504721764922246">"Siz telefonun kilidini açmaq üçün <xliff:g id="NUMBER">%d</xliff:g> dəfə səhv cəhd etdiniz. Telefonunuz indi zavod nizamlarına yenilənəcək."</string>
+ <string name="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"<xliff:g id="NUMBER">%d</xliff:g> saniyə ərzində bir daha cəhd edin."</string>
+ <string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"Åžablonu unutdunuz?"</string>
+ <string name="lockscreen_glogin_forgot_pattern" msgid="2588521501166032747">"Hesab kilid açma"</string>
+ <string name="lockscreen_glogin_too_many_attempts" msgid="2751368605287288808">"Həddindən çox cəhd edildi!"</string>
+ <string name="lockscreen_glogin_instructions" msgid="3931816256100707784">"Kilidi açmaq üçün Google hesabınız ilə daxil olun."</string>
+ <string name="lockscreen_glogin_username_hint" msgid="8846881424106484447">"İstifadəçi adı (e-poçt)"</string>
+ <string name="lockscreen_glogin_password_hint" msgid="5958028383954738528">"ÅžifrÉ™"</string>
+ <string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"Daxil olun"</string>
+ <string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"Yanlış istifadəçi adı və parol."</string>
+ <string name="lockscreen_glogin_account_recovery_hint" msgid="1696924763690379073">"İstifadəçi adınızı və ya parolunuzu unutmusunuz?\n "<b>"google.com/accounts/recovery"</b>" linkinə daxil olun."</string>
+ <string name="lockscreen_glogin_checking_password" msgid="7114627351286933867">"Yoxlanır..."</string>
+ <string name="lockscreen_unlock_label" msgid="737440483220667054">"Kilidi aç"</string>
+ <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"Səs açıqdır"</string>
+ <string name="lockscreen_sound_off_label" msgid="996822825154319026">"Səs sönülüdür"</string>
+ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"Model başlandı"</string>
+ <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Model təmizləndi"</string>
+ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Xana əlavə edildi"</string>
+ <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Model tamamlandı"</string>
+ <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d of %3$d."</string>
+ <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Widget əlavə edin."</string>
+ <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"BoÅŸ"</string>
+ <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Kilidi açma sahəsi genişləndi."</string>
+ <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Kilidi açma sahəsi çökdü."</string>
+ <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> vidcet."</string>
+ <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"İstifadəçi selektoru"</string>
+ <string name="keyguard_accessibility_status" msgid="8008264603935930611">"Status"</string>
+ <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Kamera"</string>
+ <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Media kontrolları"</string>
+ <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Yenidən sıralama vidceti başladıldı."</string>
+ <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Vidcetin təkrar sifarişi sona çatdı."</string>
+ <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Vidcet <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> silindi."</string>
+ <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Kilidi açma sahəsini genişləndir."</string>
+ <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Sürüşdürmə kilidi."</string>
+ <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Kild açma modeli."</string>
+ <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Sifət Kilidi"</string>
+ <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Pin kilid açması."</string>
+ <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"ÅžifrÉ™ kilidi."</string>
+ <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Model sahəsi."</string>
+ <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Sürüşdürmə sahəsi."</string>
+ <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
+ <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
+ <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
+ <string name="granularity_label_character" msgid="7336470535385009523">"simvol"</string>
+ <string name="granularity_label_word" msgid="7075570328374918660">"söz"</string>
+ <string name="granularity_label_link" msgid="5815508880782488267">"link"</string>
+ <string name="granularity_label_line" msgid="5764267235026120888">"xətt"</string>
+ <string name="hour_ampm" msgid="4584338083529355982">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
+ <string name="hour_cap_ampm" msgid="2083465992940444366">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
+ <string name="factorytest_failed" msgid="5410270329114212041">"Zavod testi alınmadı"</string>
+ <string name="factorytest_not_system" msgid="4435201656767276723">"Bu FACTORY_TEST fəaliyyəti yalnızca/sistemdə/tətbiqdə quraşdırılmış paketlər üçün dəstəklənir."</string>
+ <string name="factorytest_no_action" msgid="872991874799998561">"FACTORY_TEST əməliyyatını təsdiqləyən heç bir paket tapılmadı."</string>
+ <string name="factorytest_reboot" msgid="6320168203050791643">"Yenidən yükləyin"</string>
+ <string name="js_dialog_title" msgid="1987483977834603872">"\"<xliff:g id="TITLE">%s</xliff:g>\"dakı səhifədə deyilir:"</string>
+ <string name="js_dialog_title_default" msgid="6961903213729667573">"JavaScript"</string>
+ <string name="js_dialog_before_unload_title" msgid="2619376555525116593">"Naviqasiyanı Təsdiq edin"</string>
+ <string name="js_dialog_before_unload_positive_button" msgid="3112752010600484130">"Bu Səhifəni Tərk edin"</string>
+ <string name="js_dialog_before_unload_negative_button" msgid="5614861293026099715">"Bu səhifədə qalın"</string>
+ <string name="js_dialog_before_unload" msgid="3468816357095378590">"<xliff:g id="MESSAGE">%s</xliff:g>\n\nBu səhifədən kənara naviqasiya etmək istədiyinizə əminsiniz mi?"</string>
+ <string name="save_password_label" msgid="6860261758665825069">"Təsdiqlə"</string>
+ <string name="double_tap_toast" msgid="4595046515400268881">"Məsləhət: Böyütmək və kiçiltmək üçün iki dəfə tıklayın."</string>
+ <string name="autofill_this_form" msgid="4616758841157816676">"Avtodoldurma"</string>
+ <string name="setup_autofill" msgid="7103495070180590814">"AvtoDoldurmanı ayarla"</string>
+ <string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
+ <string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
+ <string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
+ <string name="autofill_address_summary_format" msgid="4874459455786827344">"$1$2$3"</string>
+ <string name="autofill_province" msgid="2231806553863422300">"Vilayət"</string>
+ <string name="autofill_postal_code" msgid="4696430407689377108">"Poçt kodu"</string>
+ <string name="autofill_state" msgid="6988894195520044613">"Dövlət"</string>
+ <string name="autofill_zip_code" msgid="8697544592627322946">"Poçt indeksi"</string>
+ <string name="autofill_county" msgid="237073771020362891">"Ölkə"</string>
+ <string name="autofill_island" msgid="4020100875984667025">"Ada"</string>
+ <string name="autofill_district" msgid="8400735073392267672">"SahÉ™"</string>
+ <string name="autofill_department" msgid="5343279462564453309">"Departament"</string>
+ <string name="autofill_prefecture" msgid="2028499485065800419">"Prefektura"</string>
+ <string name="autofill_parish" msgid="8202206105468820057">"PariÅŸ"</string>
+ <string name="autofill_area" msgid="3547409050889952423">"SahÉ™"</string>
+ <string name="autofill_emirate" msgid="2893880978835698818">"Æmirlik"</string>
+ <string name="permlab_readHistoryBookmarks" msgid="3775265775405106983">"Veb əlfəcinlərinizi və tarixçələrinizi oxumaq"</string>
+ <string name="permdesc_readHistoryBookmarks" msgid="8462378226600439658">"Tətbiqə Brauzerin daxil olduğu bütün linkləri və bütün Brauzer əlfəcinlərini oxumaq imkanı verir. Qeyd: bu icazə veb brauzer imkanları olan üçüncü tərəf brazuerləri və digər tətbiqlər tərəfindən yerinə yetirilə bilməz."</string>
+ <string name="permlab_writeHistoryBookmarks" msgid="3714785165273314490">"veb əlfəcinləri və tarixçəsi yazmaq"</string>
+ <string name="permdesc_writeHistoryBookmarks" product="tablet" msgid="6825527469145760922">"Tətbiqə planşetinizdəki brauzer tarixini və əlfəcinləri redaktə etmək icazəsi verir. Bu tətbizə brauzer məlumatlarını silmək və ya redaktə etmək imkanı verə bilər. Qeyd: Bu icazə 3-cü partiya brauzerlərə və ya veb brauzing xüsusiyyətli digər tətbiqlərə şamil olunmaya bilər."</string>
+ <string name="permdesc_writeHistoryBookmarks" product="default" msgid="8497389531014185509">"Tətbiqə Brauzer tarixçəsi və telefonunuzda saxlanılan əlfəcinlərə dəyişiklik etmək imkanı verir. Bununla tətbiqlə Brauzer datanızı silə və ya dəyişdirə bilər. Qeyd: bu icazə veb brauzer imkanları olan üçüncü tərəf brazuerləri və digər tətbiqlər tərəfindən yerinə yetirilə bilməz."</string>
+ <string name="permlab_setAlarm" msgid="1379294556362091814">"siqnal qurur"</string>
+ <string name="permdesc_setAlarm" msgid="316392039157473848">"Tətbiqə quraşdırlmış zəngli saata alarm ayarlamağa imkan verir. Bəzi zəngli saat tətbiqləri bu özəlliyi dəstəkləməyə bilər."</string>
+ <string name="permlab_addVoicemail" msgid="5525660026090959044">"Səsli poçt əlavə et"</string>
+ <string name="permdesc_addVoicemail" msgid="6604508651428252437">"Tətbiqə səsli poçt qutunuza mesaj əlavə etməyə imkan verir."</string>
+ <string name="permlab_writeGeolocationPermissions" msgid="5962224158955273932">"Brauzerin geolokasiya icazələrini dəyişir"</string>
+ <string name="permdesc_writeGeolocationPermissions" msgid="1083743234522638747">"Tətbiqə Brauzerin geolokasiya icazələrini dəyişməyə imkan verir. Zərərli tətbiqlər bundan istifadə edərək məkan məlumatlarını təsadüfi saytlara göndərə bilər."</string>
+ <string name="permlab_packageVerificationAgent" msgid="5568139100645829117">"paketləri təsdiqlə"</string>
+ <string name="permdesc_packageVerificationAgent" msgid="8437590190990843381">"Tətbiqə paketin quraşdırılabilən olmasını yoxlamağa imkan verir."</string>
+ <string name="permlab_bindPackageVerifier" msgid="4187786793360326654">"paket doğrulayıcıya bağlanır"</string>
+ <string name="permdesc_bindPackageVerifier" msgid="3180741773233862126">"Sahibinə paket yoxlayıcılarına sorğu göndərmək icazəsi verir. Normal tətbiqlər tərəfindən heç vaxt istənilməməlidir."</string>
+ <string name="permlab_serialPort" msgid="546083327654631076">"serial porta çıxır"</string>
+ <string name="permdesc_serialPort" msgid="2991639985224598193">"Sahibinə SerialManager API vasitəsilə serial portlara icazə izni verir."</string>
+ <string name="permlab_accessContentProvidersExternally" msgid="5077774297943409285">"xarici kontent provayderlərinə giriş"</string>
+ <string name="permdesc_accessContentProvidersExternally" msgid="4544346486697853685">"Məzmun provayderlərinə örtükdən daxil olmaq üçün cihaz sahibinə imkan verir. Normal tətbiqlər üçün lazım deyil."</string>
+ <string name="permlab_updateLock" msgid="3527558366616680889">"avtomatik cihaz yenilənmələrini pozur"</string>
+ <string name="permdesc_updateLock" msgid="1655625832166778492">"Sahibinə yeni versiyaya yenilənmək üçün nə vaxt qeyri-interaktiv reboot məlumatını sistemə təklif etmə icazəsi verir."</string>
+ <string name="save_password_message" msgid="767344687139195790">"Brauzerin bu şifrəni yadda saxlamasını istəyirsiz?"</string>
+ <string name="save_password_notnow" msgid="6389675316706699758">"İndi yox"</string>
+ <string name="save_password_remember" msgid="6491879678996749466">"Yadda saxla"</string>
+ <string name="save_password_never" msgid="8274330296785855105">"Heç vaxt"</string>
+ <string name="open_permission_deny" msgid="7374036708316629800">"Bu səhifəni açmaq üçün icazəniz yoxdur."</string>
+ <string name="text_copied" msgid="4985729524670131385">"Mətn panoya kopyalandı."</string>
+ <string name="more_item_label" msgid="4650918923083320495">"Daha çox"</string>
+ <string name="prepend_shortcut_label" msgid="2572214461676015642">"Menyu+"</string>
+ <string name="menu_space_shortcut_label" msgid="2410328639272162537">"boÅŸluq"</string>
+ <string name="menu_enter_shortcut_label" msgid="2743362785111309668">"daxil olun"</string>
+ <string name="menu_delete_shortcut_label" msgid="3658178007202748164">"sil"</string>
+ <string name="search_go" msgid="8298016669822141719">"Axtar"</string>
+ <string name="searchview_description_search" msgid="6749826639098512120">"Axtarış"</string>
+ <string name="searchview_description_query" msgid="5911778593125355124">"Axtarış sorğusu"</string>
+ <string name="searchview_description_clear" msgid="1330281990951833033">"Sorğunu təmizlə"</string>
+ <string name="searchview_description_submit" msgid="2688450133297983542">"Sorğunu göndərin"</string>
+ <string name="searchview_description_voice" msgid="2453203695674994440">"Səsli axtarış"</string>
+ <string name="enable_explore_by_touch_warning_title" msgid="7460694070309730149">"Toxunaraq Kəşf et funksiyası aktiv edilsin?"</string>
+ <string name="enable_explore_by_touch_warning_message" product="tablet" msgid="8655887539089910577">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> Toxunaraq Kəşf Et rejimini aktivləşdirmək istəyir. Toxunaraq Kəşf Et açıldığı zaman, barmağınızın altında nə olduğu haqda olan təsvirləri eşidə və ya görə bilərsiniz və yaplanşetdə insanlarla əlaqəyə keçmək üçün jestlər həyata keçirə bilərsiniz."</string>
+ <string name="enable_explore_by_touch_warning_message" product="default" msgid="2708199672852373195">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> Toxunaraq Kəşf Et rejimini aktivləşdirmək istəyir. Toxunaraq Kəşf Et açıldığı zaman, barmağınızın altında nə olduğu haqda olan təsvirləri eşidə və ya görə bilərsiniz və ya telefonda insanlarla əlaqəyə keçmək üçün jestlər həyata keçirə bilərsiniz"</string>
+ <string name="oneMonthDurationPast" msgid="7396384508953779925">"1 ay öncə"</string>
+ <string name="beforeOneMonthDurationPast" msgid="909134546836499826">"1 ay əvvəl"</string>
+ <plurals name="num_seconds_ago">
+ <item quantity="one" msgid="4869870056547896011">"1 saniyə əvvəl"</item>
+ <item quantity="other" msgid="3903706804349556379">"<xliff:g id="COUNT">%d</xliff:g> saniyə əvvəl"</item>
+ </plurals>
+ <plurals name="num_minutes_ago">
+ <item quantity="one" msgid="3306787433088810191">"1 dəqiqə əvvəl"</item>
+ <item quantity="other" msgid="2176942008915455116">"<xliff:g id="COUNT">%d</xliff:g> dəqiqə əvvəl"</item>
+ </plurals>
+ <plurals name="num_hours_ago">
+ <item quantity="one" msgid="9150797944610821849">"1 saat əvvəl"</item>
+ <item quantity="other" msgid="2467273239587587569">"<xliff:g id="COUNT">%d</xliff:g> saat əvvəl"</item>
+ </plurals>
+ <plurals name="last_num_days">
+ <item quantity="other" msgid="3069992808164318268">"Son <xliff:g id="COUNT">%d</xliff:g> gün"</item>
+ </plurals>
+ <string name="last_month" msgid="3959346739979055432">"Keçən ay"</string>
+ <string name="older" msgid="5211975022815554840">"Köhnə"</string>
+ <plurals name="num_days_ago">
+ <item quantity="one" msgid="861358534398115820">"dünən"</item>
+ <item quantity="other" msgid="2479586466153314633">"<xliff:g id="COUNT">%d</xliff:g> gün əvvəl"</item>
+ </plurals>
+ <plurals name="in_num_seconds">
+ <item quantity="one" msgid="2729745560954905102">"1 saniyə ərzində"</item>
+ <item quantity="other" msgid="1241926116443974687">"<xliff:g id="COUNT">%d</xliff:g> saniyə içində"</item>
+ </plurals>
+ <plurals name="in_num_minutes">
+ <item quantity="one" msgid="8793095251325200395">"1 dəqiqə içində"</item>
+ <item quantity="other" msgid="3330713936399448749">"<xliff:g id="COUNT">%d</xliff:g> dəqiqə ərzində"</item>
+ </plurals>
+ <plurals name="in_num_hours">
+ <item quantity="one" msgid="7164353342477769999">"1 saata"</item>
+ <item quantity="other" msgid="547290677353727389">"<xliff:g id="COUNT">%d</xliff:g> saata"</item>
+ </plurals>
+ <plurals name="in_num_days">
+ <item quantity="one" msgid="5413088743009839518">"sabah"</item>
+ <item quantity="other" msgid="5109449375100953247">"<xliff:g id="COUNT">%d</xliff:g> gün ərzində"</item>
+ </plurals>
+ <plurals name="abbrev_num_seconds_ago">
+ <item quantity="one" msgid="1849036840200069118">"1 saniyə əvvəl"</item>
+ <item quantity="other" msgid="3699169366650930415">"<xliff:g id="COUNT">%d</xliff:g> san əvvəl"</item>
+ </plurals>
+ <plurals name="abbrev_num_minutes_ago">
+ <item quantity="one" msgid="6361490147113871545">"1 dəqiqə əvvəl"</item>
+ <item quantity="other" msgid="851164968597150710">"<xliff:g id="COUNT">%d</xliff:g> dəqiqə əvvəl"</item>
+ </plurals>
+ <plurals name="abbrev_num_hours_ago">
+ <item quantity="one" msgid="4796212039724722116">"1 saat əvvəl"</item>
+ <item quantity="other" msgid="6889970745748538901">"<xliff:g id="COUNT">%d</xliff:g> saat əvvəl"</item>
+ </plurals>
+ <plurals name="abbrev_num_days_ago">
+ <item quantity="one" msgid="8463161711492680309">"dünən"</item>
+ <item quantity="other" msgid="3453342639616481191">"<xliff:g id="COUNT">%d</xliff:g> gün əvvəl"</item>
+ </plurals>
+ <plurals name="abbrev_in_num_seconds">
+ <item quantity="one" msgid="5842225370795066299">"1 san ərzində"</item>
+ <item quantity="other" msgid="5495880108825805108">"<xliff:g id="COUNT">%d</xliff:g> san ərzində"</item>
+ </plurals>
+ <plurals name="abbrev_in_num_minutes">
+ <item quantity="one" msgid="562786149928284878">"1 dəq ərzində"</item>
+ <item quantity="other" msgid="4216113292706568726">"<xliff:g id="COUNT">%d</xliff:g> dəqiqəyə"</item>
+ </plurals>
+ <plurals name="abbrev_in_num_hours">
+ <item quantity="one" msgid="3274708118124045246">"1 saat ərzində"</item>
+ <item quantity="other" msgid="3705373766798013406">"<xliff:g id="COUNT">%d</xliff:g> saata"</item>
+ </plurals>
+ <plurals name="abbrev_in_num_days">
+ <item quantity="one" msgid="2178576254385739855">"sabah"</item>
+ <item quantity="other" msgid="2973062968038355991">"<xliff:g id="COUNT">%d</xliff:g> günə"</item>
+ </plurals>
+ <string name="preposition_for_date" msgid="9093949757757445117">"<xliff:g id="DATE">%s</xliff:g> tarixindÉ™"</string>
+ <string name="preposition_for_time" msgid="5506831244263083793">"saat <xliff:g id="TIME">%s</xliff:g>"</string>
+ <string name="preposition_for_year" msgid="5040395640711867177">"<xliff:g id="YEAR">%s</xliff:g> ilindÉ™"</string>
+ <string name="day" msgid="8144195776058119424">"gün"</string>
+ <string name="days" msgid="4774547661021344602">"günlər"</string>
+ <string name="hour" msgid="2126771916426189481">"saat"</string>
+ <string name="hours" msgid="894424005266852993">"saatlar"</string>
+ <string name="minute" msgid="9148878657703769868">"dəq."</string>
+ <string name="minutes" msgid="5646001005827034509">"dəqiqə"</string>
+ <string name="second" msgid="3184235808021478">"sn"</string>
+ <string name="seconds" msgid="3161515347216589235">"san"</string>
+ <string name="week" msgid="5617961537173061583">"həftə"</string>
+ <string name="weeks" msgid="6509623834583944518">"həftə"</string>
+ <string name="year" msgid="4001118221013892076">"il"</string>
+ <string name="years" msgid="6881577717993213522">"il"</string>
+ <plurals name="duration_seconds">
+ <item quantity="one" msgid="6962015528372969481">"1 saniyÉ™"</item>
+ <item quantity="other" msgid="1886107766577166786">"<xliff:g id="COUNT">%d</xliff:g> saniyÉ™"</item>
+ </plurals>
+ <plurals name="duration_minutes">
+ <item quantity="one" msgid="4915414002546085617">"1 dəqiqə"</item>
+ <item quantity="other" msgid="3165187169224908775">"<xliff:g id="COUNT">%d</xliff:g> dəqiqə"</item>
+ </plurals>
+ <plurals name="duration_hours">
+ <item quantity="one" msgid="8917467491248809972">"1 saat"</item>
+ <item quantity="other" msgid="3863962854246773930">"<xliff:g id="COUNT">%d</xliff:g> saat"</item>
+ </plurals>
+ <string name="VideoView_error_title" msgid="3534509135438353077">"Video problemi"</string>
+ <string name="VideoView_error_text_invalid_progressive_playback" msgid="3186670335938670444">"Bu video bu cihaza strim olunmaq üçün uyğun deyil."</string>
+ <string name="VideoView_error_text_unknown" msgid="3450439155187810085">"Bu video oxumur"</string>
+ <string name="VideoView_error_button" msgid="2822238215100679592">"OK"</string>
+ <string name="relative_time" msgid="1818557177829411417">"<xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="noon" msgid="7245353528818587908">"günorta"</string>
+ <string name="Noon" msgid="3342127745230013127">"Günorta"</string>
+ <string name="midnight" msgid="7166259508850457595">"gecəyarı"</string>
+ <string name="Midnight" msgid="5630806906897892201">"Gecəyarı"</string>
+ <string name="elapsed_time_short_format_mm_ss" msgid="4431555943828711473">"<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" msgid="1846071997616654124">"<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" msgid="6876518925844129331">"Hamısını seç"</string>
+ <string name="cut" msgid="3092569408438626261">"Kəs"</string>
+ <string name="copy" msgid="2681946229533511987">"Kopyala"</string>
+ <string name="paste" msgid="5629880836805036433">"Yerləşdir"</string>
+ <string name="replace" msgid="5781686059063148930">"ÆvÉ™z et..."</string>
+ <string name="delete" msgid="6098684844021697789">"Sil"</string>
+ <string name="copyUrl" msgid="2538211579596067402">"URL kopyala"</string>
+ <string name="selectTextMode" msgid="1018691815143165326">"Mətn seçin"</string>
+ <string name="textSelectionCABTitle" msgid="5236850394370820357">"Mətn seçimi"</string>
+ <string name="addToDictionary" msgid="4352161534510057874">"Lüğətə əlavə et"</string>
+ <string name="deleteText" msgid="6979668428458199034">"Sil"</string>
+ <string name="inputMethod" msgid="1653630062304567879">"DaxiletmÉ™ metodu"</string>
+ <string name="editTextMenuTitle" msgid="4909135564941815494">"Mətn əməliyyatları"</string>
+ <string name="low_internal_storage_view_title" msgid="5576272496365684834">"YaddaÅŸ yeri bitir"</string>
+ <string name="low_internal_storage_view_text" msgid="6640505817617414371">"Bəzi sistem funksiyaları işləməyə bilər"</string>
+ <string name="app_running_notification_title" msgid="8718335121060787914">"<xliff:g id="APP_NAME">%1$s</xliff:g> işlənir"</string>
+ <string name="app_running_notification_text" msgid="4653586947747330058">"Daha çox məlumat üçün və ya tətbiqi dayandırmaq üçün toxunun."</string>
+ <string name="ok" msgid="5970060430562524910">"OK"</string>
+ <string name="cancel" msgid="6442560571259935130">"Ləğv et"</string>
+ <string name="yes" msgid="5362982303337969312">"OK"</string>
+ <string name="no" msgid="5141531044935541497">"Ləğv et"</string>
+ <string name="dialog_alert_title" msgid="2049658708609043103">"Diqqət"</string>
+ <string name="loading" msgid="7933681260296021180">"Yüklənir…"</string>
+ <string name="capital_on" msgid="1544682755514494298">"AÇIQ"</string>
+ <string name="capital_off" msgid="6815870386972805832">"QAPALI"</string>
+ <string name="whichApplication" msgid="4533185947064773386">"ÆmÉ™liyyatı tamamlayın:"</string>
+ <string name="alwaysUse" msgid="4583018368000610438">"Bu fəaliyyət üçün defolt istifadə edin"</string>
+ <string name="clearDefaultHintMsg" msgid="3252584689512077257">"Sistem ayarlarında, Tətbiqlərdə və Endirilmişlərdə defoltu təmizləyin."</string>
+ <string name="chooseActivity" msgid="7486876147751803333">"Fəaliyyət seçin"</string>
+ <string name="chooseUsbActivity" msgid="6894748416073583509">"USB cihaz üçün tətbiq seçin"</string>
+ <string name="noApplications" msgid="2991814273936504689">"Heç bir tətbiq bu əməliyyatı apara bilmir."</string>
+ <string name="aerr_title" msgid="1905800560317137752"></string>
+ <string name="aerr_application" msgid="932628488013092776">"Təəssüf ki, <xliff:g id="APPLICATION">%1$s</xliff:g> dayandı."</string>
+ <string name="aerr_process" msgid="4507058997035697579">"Təəssüf ki, <xliff:g id="PROCESS">%1$s</xliff:g> prosesi dayandı."</string>
+ <string name="anr_title" msgid="4351948481459135709"></string>
+ <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> cavab vermir.\n\nOnu bağlamaq istəyirsiniz?"</string>
+ <string name="anr_activity_process" msgid="5776209883299089767">"<xliff:g id="ACTIVITY">%1$s</xliff:g> aktivitisi cavab vermir. \n\nOnu bağlamaq istəyirsiniz?"</string>
+ <string name="anr_application_process" msgid="8941757607340481057">"<xliff:g id="APPLICATION">%1$s</xliff:g> cavab vermir. Onu bağlamaq istəyirsiniz?"</string>
+ <string name="anr_process" msgid="6513209874880517125">"Proses <xliff:g id="PROCESS">%1$s</xliff:g> cavab vermir. \n \n Onu bağlamaq istəyirsiniz?"</string>
+ <string name="force_close" msgid="8346072094521265605">"OK"</string>
+ <string name="report" msgid="4060218260984795706">"Şikayət edin"</string>
+ <string name="wait" msgid="7147118217226317732">"Gözlə"</string>
+ <string name="webpage_unresponsive" msgid="3272758351138122503">"Bu səhifə yararsızlaşıb.\n\nBağlamaq istəyirsiz?"</string>
+ <string name="launch_warning_title" msgid="1547997780506713581">"Tətbiq yönləndirildi"</string>
+ <string name="launch_warning_replace" msgid="6202498949970281412">"<xliff:g id="APP_NAME">%1$s</xliff:g> indi çalışır."</string>
+ <string name="launch_warning_original" msgid="188102023021668683">"<xliff:g id="APP_NAME">%1$s</xliff:g> ilk başladıldı."</string>
+ <string name="screen_compat_mode_scale" msgid="3202955667675944499">"Miqyas"</string>
+ <string name="screen_compat_mode_show" msgid="4013878876486655892">"Həmişə göstər"</string>
+ <string name="screen_compat_mode_hint" msgid="1064524084543304459">"Bunları Sistem ayarlarında yenidən aktivləşdir Yüklənmiş &gt; Tətbiqlər &gt;."</string>
+ <string name="smv_application" msgid="3307209192155442829">"Tətbiq <xliff:g id="APPLICATION">%1$s</xliff:g> (proses <xliff:g id="PROCESS">%2$s</xliff:g>) StrictMode siyasətini pozdu."</string>
+ <string name="smv_process" msgid="5120397012047462446">"<xliff:g id="PROCESS">%1$s</xliff:g> prosesi StrictMode siyasətini pozdu."</string>
+ <string name="android_upgrading_title" msgid="1584192285441405746">"Android təkmilləşdirilir..."</string>
+ <string name="android_upgrading_apk" msgid="7904042682111526169">"<xliff:g id="NUMBER_1">%2$d</xliff:g> əddədən <xliff:g id="NUMBER_0">%1$d</xliff:g> tətbiq optimallaşır."</string>
+ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Tətbiqlər başladılır."</string>
+ <string name="android_upgrading_complete" msgid="1405954754112999229">"Yükləmə başa çatır."</string>
+ <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> çalışır"</string>
+ <string name="heavy_weight_notification_detail" msgid="1721681741617898865">"Tətbiqə keçmək üçün toxunun"</string>
+ <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Tətbiqlərə keçilsin?"</string>
+ <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Bir tətbiq artıq işləyir. Digərini başlatmaq üçün onu dayandırmalısınız."</string>
+ <string name="old_app_action" msgid="493129172238566282">"<xliff:g id="OLD_APP">%1$s</xliff:g> bölməsinə qayıdın"</string>
+ <string name="old_app_description" msgid="2082094275580358049">"Yeni tətbiqi başlatmayın."</string>
+ <string name="new_app_action" msgid="5472756926945440706">"<xliff:g id="OLD_APP">%1$s</xliff:g> tətbiqini başladın"</string>
+ <string name="new_app_description" msgid="1932143598371537340">"Köhnə tətbiqi yadda saxlamadan dayandırın."</string>
+ <string name="sendText" msgid="5209874571959469142">"Mətn üçün əməliyyat seçin"</string>
+ <string name="volume_ringtone" msgid="6885421406845734650">"Zəngin səs gücü"</string>
+ <string name="volume_music" msgid="5421651157138628171">"Media həcmi"</string>
+ <string name="volume_music_hint_playing_through_bluetooth" msgid="9165984379394601533">"Bluetooth vasitəsilə oynadılır"</string>
+ <string name="volume_music_hint_silent_ringtone_selected" msgid="8310739960973156272">"Səssiz zəng"</string>
+ <string name="volume_call" msgid="3941680041282788711">"Daxili zəng səsi"</string>
+ <string name="volume_bluetooth_call" msgid="2002891926351151534">"Bluetooth zəng həcmi"</string>
+ <string name="volume_alarm" msgid="1985191616042689100">"Siqnal səsi"</string>
+ <string name="volume_notification" msgid="2422265656744276715">"Bildiriş səsi"</string>
+ <string name="volume_unknown" msgid="1400219669770445902">"Həcm"</string>
+ <string name="volume_icon_description_bluetooth" msgid="6538894177255964340">"Bluetooth həcmi"</string>
+ <string name="volume_icon_description_ringer" msgid="3326003847006162496">"Zəng səsi gücü"</string>
+ <string name="volume_icon_description_incall" msgid="8890073218154543397">"Zəng həcmi"</string>
+ <string name="volume_icon_description_media" msgid="4217311719665194215">"Media həcmi"</string>
+ <string name="volume_icon_description_notification" msgid="7044986546477282274">"Bildiriş səsi"</string>
+ <string name="ringtone_default" msgid="3789758980357696936">"Defolt rinqton"</string>
+ <string name="ringtone_default_with_actual" msgid="8129563480895990372">"Defolt rinqton (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_silent" msgid="7937634392408977062">"Heç biri"</string>
+ <string name="ringtone_picker_title" msgid="3515143939175119094">"Zəng səsləri"</string>
+ <string name="ringtone_unknown" msgid="5477919988701784788">"Naməlum rinqton"</string>
+ <plurals name="wifi_available">
+ <item quantity="one" msgid="6654123987418168693">"Wi-Fi şəbəkəsi mövcuddur"</item>
+ <item quantity="other" msgid="4192424489168397386">"Wi-Fi şəbəkələri mövcuddur"</item>
+ </plurals>
+ <plurals name="wifi_available_detailed">
+ <item quantity="one" msgid="1634101450343277345">"Wi-Fi şəbəkəni açın"</item>
+ <item quantity="other" msgid="7915895323644292768">"Açıq Wi-Fi şəbəkələri mövcuddur"</item>
+ </plurals>
+ <string name="wifi_available_sign_in" msgid="4029489716605255386">"Wi-Fi şəbəkəsinə daxil ol"</string>
+ <string name="network_available_sign_in" msgid="8495155593358054676">"Şəbəkəyə daxil olun"</string>
+ <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
+ <skip />
+ <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Wi-Fi\'a qoşulmaq alınmadı"</string>
+ <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" internet bağlantısı keyfiyyətsizdir."</string>
+ <string name="wifi_p2p_dialog_title" msgid="97611782659324517">"Wi-Fi Direct"</string>
+ <string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"Wi-Fi Direct əməliyyatını başlat. Bu Wi-Fi müştəri/hotspotu bağlayacaq."</string>
+ <string name="wifi_p2p_failed_message" msgid="3763669677935623084">"Wi-Fi Direct başladıla bilmədi."</string>
+ <string name="wifi_p2p_enabled_notification_title" msgid="2068321881673734886">"Wi-Fi Direct aktivdir"</string>
+ <string name="wifi_p2p_enabled_notification_message" msgid="1638949953993894335">"Ayarlar üçün toxunun"</string>
+ <string name="accept" msgid="1645267259272829559">"Qəbul edin"</string>
+ <string name="decline" msgid="2112225451706137894">"İmtina edin"</string>
+ <string name="wifi_p2p_invitation_sent_title" msgid="1318975185112070734">"Dəvətnamə göndərildi"</string>
+ <string name="wifi_p2p_invitation_to_connect_title" msgid="4958803948658533637">"Qoşulmaq üçün dəvət"</string>
+ <string name="wifi_p2p_from_message" msgid="570389174731951769">"Kimdən:"</string>
+ <string name="wifi_p2p_to_message" msgid="248968974522044099">"KimÉ™:"</string>
+ <string name="wifi_p2p_enter_pin_message" msgid="5920929550367828970">"Tələb olunan PİN kodu daxil edin:"</string>
+ <string name="wifi_p2p_show_pin_message" msgid="8530563323880921094">"PİN:"</string>
+ <string name="wifi_p2p_frequency_conflict_message" product="tablet" msgid="8012981257742232475">"Bu planşet <xliff:g id="DEVICE_NAME">%1$s</xliff:g> cihazına qoşulan zaman Wi-Fi şəbəkəsindən müvəqqəti ayrılmış olacaq"</string>
+ <string name="wifi_p2p_frequency_conflict_message" product="default" msgid="7363907213787469151">"Bu telefon <xliff:g id="DEVICE_NAME">%1$s</xliff:g> cihazına qoşulan zaman Wi-Fi şəbəkəsindən müvəqqəti ayrılmış olacaq"</string>
+ <string name="select_character" msgid="3365550120617701745">"Simvol daxil edin"</string>
+ <string name="sms_control_title" msgid="7296612781128917719">"SMS mesaj göndərilir"</string>
+ <string name="sms_control_message" msgid="3867899169651496433">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; çox sayda SMS mesaj göndərir. Bu tətbiqin mesaj göndərməyə davam etməsinə icazə verirsiniz?"</string>
+ <string name="sms_control_yes" msgid="3663725993855816807">"İcazə verin"</string>
+ <string name="sms_control_no" msgid="625438561395534982">"Rədd edin"</string>
+ <string name="sms_short_code_confirm_message" msgid="1645436466285310855">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; &lt;b&gt;<xliff:g id="DEST_ADDRESS">%2$s</xliff:g>&lt;/b&gt; ünvanına mesaj göndərmək istəyir."</string>
+ <string name="sms_short_code_details" msgid="3492025719868078457">"Bu, mobil hesabınıza "<font fgcolor="#ffffb060">"əlavə tariflərin tətbiq olunması"</font>" ilə nəticələnə bilər."</string>
+ <string name="sms_premium_short_code_details" msgid="5523826349105123687"><font fgcolor="#ffffb060">"Bu mobil hesabınızda ödənişlərə səbəb olacaq."</font></string>
+ <string name="sms_short_code_confirm_allow" msgid="4458878637111023413">"Göndər"</string>
+ <string name="sms_short_code_confirm_deny" msgid="2927389840209170706">"Ləğv et"</string>
+ <string name="sms_short_code_remember_choice" msgid="5289538592272218136">"Mənim seçimimi yadda saxla"</string>
+ <string name="sms_short_code_remember_undo_instruction" msgid="4960944133052287484">"Bunu sonra Ayarlarda dəyişə bilərsiniz &gt; Tətbiqlər"</string>
+ <string name="sms_short_code_confirm_always_allow" msgid="3241181154869493368">"Həmişə icazə ver"</string>
+ <string name="sms_short_code_confirm_never_allow" msgid="446992765774269673">"Heç vaxt icazə verməyin"</string>
+ <string name="sim_removed_title" msgid="6227712319223226185">"SIM kart çıxarıldı"</string>
+ <string name="sim_removed_message" msgid="2333164559970958645">"Cihazınızı etibarlı SIM kart ilə başladana kimi mobil şəbəkə əlçatmaz olacaq."</string>
+ <string name="sim_done_button" msgid="827949989369963775">"Bitdi"</string>
+ <string name="sim_added_title" msgid="3719670512889674693">"SİM kart əlavə edildi"</string>
+ <string name="sim_added_message" msgid="6599945301141050216">"Mobil şəbəkəyə qoşulmaq üçün cihazınızı yenidən başladın."</string>
+ <string name="sim_restart_button" msgid="4722407842815232347">"Yenidən başlat"</string>
+ <string name="time_picker_dialog_title" msgid="8349362623068819295">"Vaxt ayarlayın"</string>
+ <string name="date_picker_dialog_title" msgid="5879450659453782278">"Tarixi quraşdır"</string>
+ <string name="date_time_set" msgid="5777075614321087758">"Ayarlayın"</string>
+ <string name="date_time_done" msgid="2507683751759308828">"Hazırdır"</string>
+ <string name="perms_new_perm_prefix" msgid="8257740710754301407"><font size="12" fgcolor="#ff33b5e5">"YENİ: "</font></string>
+ <string name="perms_description_app" msgid="5139836143293299417">"<xliff:g id="APP_NAME">%1$s</xliff:g> tərəfindən təmin edilib."</string>
+ <string name="no_permissions" msgid="7283357728219338112">"Heç bir icazə tələb olunmur"</string>
+ <string name="perm_costs_money" msgid="4902470324142151116">"bununla sizdən xərc tutula bilər"</string>
+ <string name="usb_storage_activity_title" msgid="4465055157209648641">"USB toplu yaddaÅŸ"</string>
+ <string name="usb_storage_title" msgid="5901459041398751495">"USB qoÅŸuludur"</string>
+ <string name="usb_storage_message" product="nosdcard" msgid="3308538094316477839">"Siz USB vasitəsilə kompütere bağlandınız. Kompüter və Androidinizin USB yaddaşı arasında faylları kopyalamaq istəyirsinizsə, aşağıdakı düyməyə toxunun."</string>
+ <string name="usb_storage_message" product="default" msgid="805351000446037811">"Kompüterinizə USB ilə qoşulmusunuz. Faylları Androidinizin SD kartı ilə kompüteriniz arasında kopyalamaq istəyirsinizsə aşağıdakı düyməyə toxunun."</string>
+ <string name="usb_storage_button_mount" msgid="1052259930369508235">"USB yaddaşı aktivləşdirin"</string>
+ <string name="usb_storage_error_message" product="nosdcard" msgid="3017045217365540658">"USB yaddaşınızı USB kütləvi yaddaşı üçün istifadə edən zaman problem yarandı."</string>
+ <string name="usb_storage_error_message" product="default" msgid="2876018512716970313">"SD kartınızı USB kütləvi yaddaşı üçün istifadə edən zaman problem yarandı."</string>
+ <string name="usb_storage_notification_title" msgid="8175892554757216525">"USB qoÅŸuludur"</string>
+ <string name="usb_storage_notification_message" msgid="939822783828183763">"Faylları kompüterinizə kopyalamaq və ya kompüterinizdən kopyalamaq üçün toxunun."</string>
+ <string name="usb_storage_stop_notification_title" msgid="2336058396663516017">"USB yaddaşı söndürün"</string>
+ <string name="usb_storage_stop_notification_message" msgid="1656852098555623822">"USB yaddaşı söndürmək üçün toxunun."</string>
+ <string name="usb_storage_stop_title" msgid="660129851708775853">"USB yaddaÅŸ istifadÉ™ olunur"</string>
+ <string name="usb_storage_stop_message" product="nosdcard" msgid="4264025280777219521">"USB yaddaşı söndürmədən öncə Android\'in USB yaddaşını kompüterdən demontaj etdiyinizə (çıxardığınıza) əmin olun."</string>
+ <string name="usb_storage_stop_message" product="default" msgid="8043969782460613114">"USB yaddaşı söndürmədən öncə Android\'in USB yaddaşını kompüterdən demontaj etdiyinizə (çıxardığınıza) əmin olun."</string>
+ <string name="usb_storage_stop_button_mount" msgid="7060218034900696029">"USB yaddaşını söndür"</string>
+ <string name="usb_storage_stop_error_message" msgid="1970374898263063836">"USB yaddaşı söndürən zaman problem oldu. USB hostu demontaj etmənizi yoxlayın və yenidən cəhd edin."</string>
+ <string name="dlg_confirm_kill_storage_users_title" msgid="963039033470478697">"USB yaddaşı aktivləşdirin"</string>
+ <string name="dlg_confirm_kill_storage_users_text" msgid="5100428757107469454">"USB yaddaşı aktivləşdirsəniz, istifadə etdiyiniz bəzi tətbiqlər dayana bilər və USB yaddaş deaktiv edilənə qədər işləməyə bilər."</string>
+ <string name="dlg_error_title" msgid="7323658469626514207">"USB əməliyyatı uğursuzdur"</string>
+ <string name="dlg_ok" msgid="7376953167039865701">"OK"</string>
+ <string name="usb_mtp_notification_title" msgid="3699913097391550394">"Media cihazı kimi qoşuldu"</string>
+ <string name="usb_ptp_notification_title" msgid="1960817192216064833">"Kamera kimi bağlanıldı"</string>
+ <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"Quraşdırıcı kimi qoşulub"</string>
+ <string name="usb_accessory_notification_title" msgid="7848236974087653666">"USB aksesuara qoÅŸuldu"</string>
+ <string name="usb_notification_message" msgid="2290859399983720271">"Digər USB seçimləri üçün toxunun."</string>
+ <string name="extmedia_format_title" product="nosdcard" msgid="9020092196061007262">"USB yaddaşına format atılsın?"</string>
+ <string name="extmedia_format_title" product="default" msgid="3648415921526526069">"SD kart format edilsin?"</string>
+ <string name="extmedia_format_message" product="nosdcard" msgid="3934016853425761078">"USB yaddaşınızda yerləşdirilmiş bütün fayllar silinəcək. Bu addım geri dönülməzdir."</string>
+ <string name="extmedia_format_message" product="default" msgid="14131895027543830">"Kartınızdakı bütün məlumatlar itəcək."</string>
+ <string name="extmedia_format_button_format" msgid="4131064560127478695">"Format"</string>
+ <string name="adb_active_notification_title" msgid="6729044778949189918">"USB sazlama qoÅŸuludur"</string>
+ <string name="adb_active_notification_message" msgid="1016654627626476142">"USB debaqı deaktivasiya etmək üçün toxunun."</string>
+ <string name="select_input_method" msgid="4653387336791222978">"Daxiletmə metodunu seçin"</string>
+ <string name="configure_input_methods" msgid="9091652157722495116">"Daxiletmə üsullarını ayarlayın"</string>
+ <string name="use_physical_keyboard" msgid="6203112478095117625">"Fiziki klaviatura"</string>
+ <string name="hardware" msgid="7517821086888990278">"Hardware"</string>
+ <string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Klaviatura sxemi seçin"</string>
+ <string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"Klaviatura tərtibatı seçmək üçün toxunun."</string>
+ <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCÇDEÆFGÄžHXIİJKQLMNOÖPRSÅžTUÜVYZ"</string>
+ <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCÇDEÆFGÄžHİIJKLMNOÖPQRSÅžTUÜVWXYZ"</string>
+ <string name="candidates_style" msgid="4333913089637062257"><u>"namizədlər"</u></string>
+ <string name="ext_media_checking_notification_title" product="nosdcard" msgid="3449816005351468560">"USB yaddaş hazırlanır"</string>
+ <string name="ext_media_checking_notification_title" product="default" msgid="5457603418970994050">"SD kart hazırlanır"</string>
+ <string name="ext_media_checking_notification_message" msgid="8287319882926737053">"Səhvlər yoxlanılır."</string>
+ <string name="ext_media_nofs_notification_title" product="nosdcard" msgid="7788040745686229307">"Boş USB yaddaşı"</string>
+ <string name="ext_media_nofs_notification_title" product="default" msgid="780477838241212997">"BoÅŸ SD kart"</string>
+ <string name="ext_media_nofs_notification_message" product="nosdcard" msgid="7840121067427269500">"USB yaddaş boşdur və ya sistem tərəfindən dəstəklənməyən fayl sisteminə malikdir."</string>
+ <string name="ext_media_nofs_notification_message" product="default" msgid="8641065641786923604">"SD kart boşdur və ya sistem tərəfindən dəstəklənməyən fayl sisteminə malikdir."</string>
+ <string name="ext_media_unmountable_notification_title" product="nosdcard" msgid="2090046769532713563">"Zədəli USB yaddaş"</string>
+ <string name="ext_media_unmountable_notification_title" product="default" msgid="6410723906019100189">"Zədəli SD kart"</string>
+ <string name="ext_media_unmountable_notification_message" product="nosdcard" msgid="1795917578395333280">"SD yaddaş zədələnib. Onu format etməyə çalışın."</string>
+ <string name="ext_media_unmountable_notification_message" product="default" msgid="1753898567525568253">"SD kart zədələnib. Onu format etməyə çalışın."</string>
+ <string name="ext_media_badremoval_notification_title" product="nosdcard" msgid="1661683031330951073">"USB yaddaşı gözlənilmədən çıxarıldı"</string>
+ <string name="ext_media_badremoval_notification_title" product="default" msgid="6872152882604407837">"SD kart gözlənilmədən çıxarıldı"</string>
+ <string name="ext_media_badremoval_notification_message" product="nosdcard" msgid="4329848819865594241">"Məlumat itkisinin qarşısını almaq üçün USB yaddaşı çıxarmazdan əvvəl onu demontaj edin."</string>
+ <string name="ext_media_badremoval_notification_message" product="default" msgid="7260183293747448241">"Data itkisinin qarşısını almaq üçün SD kartı çıxarmadan öncə demontaj edin."</string>
+ <string name="ext_media_safe_unmount_notification_title" product="nosdcard" msgid="3967973893270360230">"USB yaddaş çıxarmaq üçün təhlükəsizdir"</string>
+ <string name="ext_media_safe_unmount_notification_title" product="default" msgid="6729801130790616200">"SD kart təhlükəsiz çıxarıla bilər"</string>
+ <string name="ext_media_safe_unmount_notification_message" product="nosdcard" msgid="6142195361606493530">"Siz USB yaddaşı təhlükəsiz çıxara bilərsiniz."</string>
+ <string name="ext_media_safe_unmount_notification_message" product="default" msgid="568841278138377604">"Siz SD kartı təhlükəsiz çıxara bilərsiniz."</string>
+ <string name="ext_media_nomedia_notification_title" product="nosdcard" msgid="4486377230140227651">"SilinmiÅŸ USB yaddaÅŸ"</string>
+ <string name="ext_media_nomedia_notification_title" product="default" msgid="8902518030404381318">"SD kart çıxarıldı"</string>
+ <string name="ext_media_nomedia_notification_message" product="nosdcard" msgid="6921126162580574143">"USB yaddaş çıxarıldı. Yeni media əlavə edin."</string>
+ <string name="ext_media_nomedia_notification_message" product="default" msgid="3870120652983659641">"SD kart çıxarıldı. Yenisini daxil edin."</string>
+ <string name="activity_list_empty" msgid="1675388330786841066">"Uyğun gələn fəaliyyət tapılmadı."</string>
+ <string name="permlab_pkgUsageStats" msgid="8787352074326748892">"komponent istifadəsi statistikasını güncəlləyir"</string>
+ <string name="permdesc_pkgUsageStats" msgid="1106612424254277630">"Tətbiqə toplanmış istifadə statistikasını dəyişməyə imkan verir. Normal tətbiqlər tərəfindən istifadə olunmur."</string>
+ <string name="permlab_copyProtectedData" msgid="4341036311211406692">"məzmunu kopyala"</string>
+ <string name="permdesc_copyProtectedData" msgid="4390697124288317831">"Tətbiqə kontenti kopyalamaq üçün defolt konteyner servisini çağırmaq icazəsi verir. Normal tətbiqlər tərəfindən istifadə edilmir."</string>
+ <string name="permlab_route_media_output" msgid="1642024455750414694">"Media çıxışını yönləndirir"</string>
+ <string name="permdesc_route_media_output" msgid="4932818749547244346">"Tətbiqə media çıxışını digər xarici cihazlara yönləndirmək imkanı verir."</string>
+ <string name="permlab_access_keyguard_secure_storage" msgid="7565552237977815047">"Keyguard təhlükəsiz yaddaşa çıxış"</string>
+ <string name="permdesc_access_keyguard_secure_storage" msgid="5866245484303285762">"Tətbiqə keguard təhlükəsiz yaddaşa çatmağa icazə verir."</string>
+ <string name="permlab_control_keyguard" msgid="172195184207828387">"Klaviatura kilidinin görülməsini və gizlədilməsini idarə edir"</string>
+ <string name="permdesc_control_keyguard" msgid="3043732290518629061">"Tətbiqə keguardı idarə etmək icazəsi verir."</string>
+ <string name="tutorial_double_tap_to_zoom_message_short" msgid="4070433208160063538">"Zoom nəzarəti üçün iki dəfə toxunun"</string>
+ <string name="gadget_host_error_inflating" msgid="4882004314906466162">"Widget əlavə edilə bilmədi."</string>
+ <string name="ime_action_go" msgid="8320845651737369027">"Get"</string>
+ <string name="ime_action_search" msgid="658110271822807811">"Axtar"</string>
+ <string name="ime_action_send" msgid="2316166556349314424">"Göndər"</string>
+ <string name="ime_action_next" msgid="3138843904009813834">"Növbəti"</string>
+ <string name="ime_action_done" msgid="8971516117910934605">"Tamam"</string>
+ <string name="ime_action_previous" msgid="1443550039250105948">"ÆvvÉ™lki"</string>
+ <string name="ime_action_default" msgid="2840921885558045721">"İcra edin"</string>
+ <string name="dial_number_using" msgid="5789176425167573586">"<xliff:g id="NUMBER">%s</xliff:g> istifadə etməklə\nnömrə yığın"</string>
+ <string name="create_contact_using" msgid="4947405226788104538">"<xliff:g id="NUMBER">%s</xliff:g>istifadə edərək kontakt yaradın\n"</string>
+ <string name="grant_credentials_permission_message_header" msgid="2106103817937859662">"Aşağıdakı bir və ya daha çox tətbiqlər indi və gələcəkdə hesabınıza daxil olmaq üçün icazə istəyir."</string>
+ <string name="grant_credentials_permission_message_footer" msgid="3125211343379376561">"Bu istəyə izn vermək istəyirsiniz?"</string>
+ <string name="grant_permissions_header_text" msgid="6874497408201826708">"GiriÅŸ sorÄŸusu"</string>
+ <string name="allow" msgid="7225948811296386551">"İcazə verin"</string>
+ <string name="deny" msgid="2081879885755434506">"Rədd et"</string>
+ <string name="permission_request_notification_title" msgid="6486759795926237907">"İcazə tələb olunur"</string>
+ <string name="permission_request_notification_with_subtitle" msgid="8530393139639560189">\n" hesabı üçün<xliff:g id="ACCOUNT">%s</xliff:g> icazə sorğusu göndərildi."</string>
+ <string name="input_method_binding_label" msgid="1283557179944992649">"DaxiletmÉ™ metodu"</string>
+ <string name="sync_binding_label" msgid="3687969138375092423">"Sinxronizasiya"</string>
+ <string name="accessibility_binding_label" msgid="4148120742096474641">"Ælçatımlılıq"</string>
+ <string name="wallpaper_binding_label" msgid="1240087844304687662">"Divar kağızı"</string>
+ <string name="chooser_wallpaper" msgid="7873476199295190279">"Divar kağızını dəyişin"</string>
+ <string name="notification_listener_binding_label" msgid="2014162835481906429">"Bildiriş dinləyən"</string>
+ <string name="vpn_title" msgid="19615213552042827">"VPN aktivləşdirildi"</string>
+ <string name="vpn_title_long" msgid="6400714798049252294">"VPN <xliff:g id="APP">%s</xliff:g> tərəfindən aktivləşdirilib"</string>
+ <string name="vpn_text" msgid="3011306607126450322">"Şəbəkəni idarə etmək üçün toxunun."</string>
+ <string name="vpn_text_long" msgid="6407351006249174473">"<xliff:g id="SESSION">%s</xliff:g> sessiyaya qoşuludur. Şəbəkəni idarə etmək üçün toxunun."</string>
+ <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Həmişə aktiv VPN bağlanır..."</string>
+ <string name="vpn_lockdown_connected" msgid="8202679674819213931">"VPN bağlantısı həmişə aktiv"</string>
+ <string name="vpn_lockdown_error" msgid="6009249814034708175">"Həmişə aktiv VPN xətası"</string>
+ <string name="vpn_lockdown_config" msgid="6415899150671537970">"Konfiqurə etmək üçün toxun"</string>
+ <string name="upload_file" msgid="2897957172366730416">"Fayl seçin"</string>
+ <string name="no_file_chosen" msgid="6363648562170759465">"Heç bir fayl seçilməyib"</string>
+ <string name="reset" msgid="2448168080964209908">"Sıfırlayın"</string>
+ <string name="submit" msgid="1602335572089911941">"Göndər"</string>
+ <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Avtomobil rejimi aktivdir"</string>
+ <string name="car_mode_disable_notification_message" msgid="8035230537563503262">"Avtomobil rejimindən çıxmaq üçün toxunun."</string>
+ <string name="tethered_notification_title" msgid="3146694234398202601">"Tezerinq vÉ™ ya hotspot aktivdir"</string>
+ <string name="tethered_notification_message" msgid="6857031760103062982">"Quraşdırmaq üçün toxunun."</string>
+ <string name="back_button_label" msgid="2300470004503343439">"Geri"</string>
+ <string name="next_button_label" msgid="1080555104677992408">"Növbəti"</string>
+ <string name="skip_button_label" msgid="1275362299471631819">"Keç"</string>
+ <string name="throttle_warning_notification_title" msgid="4890894267454867276">"Yüksək mobil data istifadəsi"</string>
+ <string name="throttle_warning_notification_message" msgid="3340822228599337743">"Mobil data istifadəsi haqqında daha çox öyrənmək üçün toxunun."</string>
+ <string name="throttled_notification_title" msgid="6269541897729781332">"Mobil data limiti keçildi"</string>
+ <string name="throttled_notification_message" msgid="5443457321354907181">"Mobil data istifadəsi haqqında daha çox öyrənmək üçün toxunun."</string>
+ <string name="no_matches" msgid="8129421908915840737">"UyÄŸunluq yoxdur"</string>
+ <string name="find_on_page" msgid="1946799233822820384">"Səhifədə tap"</string>
+ <plurals name="matches_found">
+ <item quantity="one" msgid="8167147081136579439">"1 uyÄŸunluq"</item>
+ <item quantity="other" msgid="4641872797067609177">"<xliff:g id="INDEX">%d</xliff:g> ədəddən <xliff:g id="TOTAL">%d</xliff:g>"</item>
+ </plurals>
+ <string name="action_mode_done" msgid="7217581640461922289">"Hazırdır"</string>
+ <string name="progress_unmounting" product="nosdcard" msgid="3923810448507612746">"USB yaddaşı qaldırılır..."</string>
+ <string name="progress_unmounting" product="default" msgid="1327894998409537190">"SD kart demontaj edilir..."</string>
+ <string name="progress_erasing" product="nosdcard" msgid="4521573321524340058">"USB yaddaÅŸ silinir..."</string>
+ <string name="progress_erasing" product="default" msgid="6596988875507043042">"SD kart silinir..."</string>
+ <string name="format_error" product="nosdcard" msgid="6299769563624776948">"USB yaddaşı silinə bilmədi."</string>
+ <string name="format_error" product="default" msgid="7315248696644510935">"SD kartı silmək mümkün olmadı."</string>
+ <string name="media_bad_removal" msgid="7960864061016603281">"SD kart demontaj edilmədən öncə çıxarıldı."</string>
+ <string name="media_checking" product="nosdcard" msgid="418188720009569693">"USB yaddaş hazırda yoxlanılır."</string>
+ <string name="media_checking" product="default" msgid="7334762503904827481">"SD kart hazırda yoxlanılır."</string>
+ <string name="media_removed" msgid="7001526905057952097">"SD kart çıxarılıb."</string>
+ <string name="media_shared" product="nosdcard" msgid="5830814349250834225">"SD kart hazırda kompüter tərəfindən istifadə edilir."</string>
+ <string name="media_shared" product="default" msgid="5706130568133540435">"SD kart hal-hazırda kompüter tərəfindən istifadə edilir."</string>
+ <string name="media_unknown_state" msgid="729192782197290385">"Naməlum vəziyyətdə xarici media."</string>
+ <string name="share" msgid="1778686618230011964">"Paylaşın"</string>
+ <string name="find" msgid="4808270900322985960">"Tapın"</string>
+ <string name="websearch" msgid="4337157977400211589">"Veb Axtarış"</string>
+ <string name="find_next" msgid="5742124618942193978">"Sonrakını tap"</string>
+ <string name="find_previous" msgid="2196723669388360506">"ÆvvÉ™lkini tap"</string>
+ <string name="gpsNotifTicker" msgid="5622683912616496172">"<xliff:g id="NAME">%s</xliff:g> tərəfindən məkan sorğusu"</string>
+ <string name="gpsNotifTitle" msgid="5446858717157416839">"Məkan sorğusu"</string>
+ <string name="gpsNotifMessage" msgid="1374718023224000702">"<xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>) tərəfindən tələb edilib"</string>
+ <string name="gpsVerifYes" msgid="2346566072867213563">"Bəli"</string>
+ <string name="gpsVerifNo" msgid="1146564937346454865">"Xeyr"</string>
+ <string name="sync_too_many_deletes" msgid="5296321850662746890">"Limiti keçəni silin"</string>
+ <string name="sync_too_many_deletes_desc" msgid="496551671008694245">"<xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g> üçün <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> silinmiş fayl var, <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g> hesabı. Nə etmək istəyirsiniz?"</string>
+ <string name="sync_really_delete" msgid="2572600103122596243">"Elementləri sil"</string>
+ <string name="sync_undo_deletes" msgid="2941317360600338602">"Silinənləri geri qaytar"</string>
+ <string name="sync_do_nothing" msgid="3743764740430821845">"İndilik heç nə etmə"</string>
+ <string name="choose_account_label" msgid="5655203089746423927">"Hesab seçin"</string>
+ <string name="add_account_label" msgid="2935267344849993553">"Hesab əlavə et"</string>
+ <string name="add_account_button_label" msgid="3611982894853435874">"Hesab əlavə edin"</string>
+ <string name="number_picker_increment_button" msgid="2412072272832284313">"Artır"</string>
+ <string name="number_picker_decrement_button" msgid="476050778386779067">"Azaldın"</string>
+ <string name="number_picker_increment_scroll_mode" msgid="3073101067441638428">"<xliff:g id="VALUE">%s</xliff:g> toxunun və basaraq saxlayın."</string>
+ <string name="number_picker_increment_scroll_action" msgid="9101473045891835490">"Artırmaq üçün yuxarı, azaltmaq üçün aşağı sürüşdürün."</string>
+ <string name="time_picker_increment_minute_button" msgid="8865885114028614321">"Dəqiqə artırın"</string>
+ <string name="time_picker_decrement_minute_button" msgid="6246834937080684791">"Dəqiqəni azalt"</string>
+ <string name="time_picker_increment_hour_button" msgid="3652056055810223139">"Saatı artırın"</string>
+ <string name="time_picker_decrement_hour_button" msgid="1377479863429214792">"Saatı azaldın"</string>
+ <string name="time_picker_increment_set_pm_button" msgid="4147590696151230863">"PM qurun"</string>
+ <string name="time_picker_decrement_set_am_button" msgid="8302140353539486752">"AM qurun"</string>
+ <string name="date_picker_increment_month_button" msgid="5369998479067934110">"Artma ayı"</string>
+ <string name="date_picker_decrement_month_button" msgid="1832698995541726019">"Ayı azaldın"</string>
+ <string name="date_picker_increment_day_button" msgid="7130465412308173903">"Artma günü"</string>
+ <string name="date_picker_decrement_day_button" msgid="4131881521818750031">"Azalma günü"</string>
+ <string name="date_picker_increment_year_button" msgid="6318697384310808899">"Artım ili"</string>
+ <string name="date_picker_decrement_year_button" msgid="4482021813491121717">"Azalma ili"</string>
+ <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
+ <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"Ləğv et"</string>
+ <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Sil"</string>
+ <string name="keyboardview_keycode_done" msgid="1992571118466679775">"Hazırdır"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Rejim dəyişikliyi"</string>
+ <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
+ <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Daxil olun"</string>
+ <string name="activitychooserview_choose_application" msgid="2125168057199941199">"Tətbiq seçin"</string>
+ <string name="shareactionprovider_share_with" msgid="806688056141131819">"Bununla paylaşın"</string>
+ <string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> ilə paylaşın"</string>
+ <string name="content_description_sliding_handle" msgid="415975056159262248">"Sürüşən qulp. Toxunaraq basılı tutun."</string>
+ <string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> üçün yuxarı sürüşdürün."</string>
+ <string name="description_direction_down" msgid="5087739728639014595">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> üçün aşağı sürüşdürün."</string>
+ <string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> üçün sola sürüşdür."</string>
+ <string name="description_direction_right" msgid="8034433242579600980">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> üçün sağa sürüşdür."</string>
+ <string name="description_target_unlock" msgid="2228524900439801453">"Kilidi aç"</string>
+ <string name="description_target_camera" msgid="969071997552486814">"Kamera"</string>
+ <string name="description_target_silent" msgid="893551287746522182">"Səssiz"</string>
+ <string name="description_target_soundon" msgid="30052466675500172">"Səs açıqdır"</string>
+ <string name="description_target_search" msgid="3091587249776033139">"Axtar"</string>
+ <string name="description_target_unlock_tablet" msgid="3833195335629795055">"Kilidi açmaq üçün vurun."</string>
+ <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Parolların səsləndirilməsi üçün qulaqlıqları taxın."</string>
+ <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Nöqtə."</string>
+ <string name="action_bar_home_description" msgid="5293600496601490216">"EvÉ™ gedin"</string>
+ <string name="action_bar_up_description" msgid="2237496562952152589">"Yuxarı gedin"</string>
+ <string name="action_menu_overflow_description" msgid="2295659037509008453">"ÆlavÉ™ seçimlÉ™r"</string>
+ <string name="action_bar_home_description_format" msgid="7965984360903693903">"%1$s, %2$s"</string>
+ <string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string>
+ <string name="storage_internal" msgid="4891916833657929263">"Daxili yaddaÅŸ"</string>
+ <string name="storage_sd_card" msgid="3282948861378286745">"SD kart"</string>
+ <string name="storage_usb" msgid="3017954059538517278">"USB yaddaÅŸ"</string>
+ <string name="extract_edit_menu_button" msgid="8940478730496610137">"RedaktÉ™ et"</string>
+ <string name="data_usage_warning_title" msgid="1955638862122232342">"Data istifadə xəbərdarlığı"</string>
+ <string name="data_usage_warning_body" msgid="2814673551471969954">"İstifadə və ayarları görmək üçün toxunun"</string>
+ <string name="data_usage_3g_limit_title" msgid="7093334419518706686">"2G-3G data deaktivdir"</string>
+ <string name="data_usage_4g_limit_title" msgid="7636489436819470761">"4G data deaktiv edildi"</string>
+ <string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"Mobil data deaktivdir"</string>
+ <string name="data_usage_wifi_limit_title" msgid="8992154736441284865">"Wi-Fi data deaktiv edildi"</string>
+ <string name="data_usage_limit_body" msgid="3317964706973601386">"Aktivləşdirmək üçün toxunun."</string>
+ <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"2G-3G data limiti aşılıb"</string>
+ <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"4G data limiti keçildi"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"Mobil data limiti keçildi"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"Wi-Fi data limiti keçildi"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"<xliff:g id="SIZE">%s</xliff:g> müəyyən edilmiş limit aşır."</string>
+ <string name="data_usage_restricted_title" msgid="5965157361036321914">"Arxaplan datası məhdudlaşdırıldı"</string>
+ <string name="data_usage_restricted_body" msgid="6741521330997452990">"Məhdudiyyəti aradan qaldırmaq üçün toxunun"</string>
+ <string name="ssl_certificate" msgid="6510040486049237639">"Təhlükəsizlik sertifikatı"</string>
+ <string name="ssl_certificate_is_valid" msgid="6825263250774569373">"Bu sertifikat etibarlıdır."</string>
+ <string name="issued_to" msgid="454239480274921032">"Verilib:"</string>
+ <string name="common_name" msgid="2233209299434172646">"Ümumi ad:"</string>
+ <string name="org_name" msgid="6973561190762085236">"Təşkilat:"</string>
+ <string name="org_unit" msgid="7265981890422070383">"Təşkilati vahid:"</string>
+ <string name="issued_by" msgid="2647584988057481566">"Tərəfindən verilib:"</string>
+ <string name="validity_period" msgid="8818886137545983110">"Keçərlilik:"</string>
+ <string name="issued_on" msgid="5895017404361397232">"Dərc olunub:"</string>
+ <string name="expires_on" msgid="3676242949915959821">"Bitmə vaxtı:"</string>
+ <string name="serial_number" msgid="758814067660862493">"Seriya nömrəsi:"</string>
+ <string name="fingerprints" msgid="4516019619850763049">"Barmaq izləri:"</string>
+ <string name="sha256_fingerprint" msgid="4391271286477279263">"SHA-256 barmaq izi:"</string>
+ <string name="sha1_fingerprint" msgid="7930330235269404581">"SHA-1 barmaq izi:"</string>
+ <string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Hamısını seçın"</string>
+ <string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Fəaliyyəti seçin"</string>
+ <string name="share_action_provider_share_with" msgid="5247684435979149216">"Bununla paylaşın"</string>
+ <string name="list_delimeter" msgid="3975117572185494152">", "</string>
+ <string name="sending" msgid="3245653681008218030">"Göndərilir..."</string>
+ <string name="launchBrowserDefault" msgid="2057951947297614725">"Brauzer işə salınsın?"</string>
+ <string name="SetupCallDefault" msgid="5834948469253758575">"Zəngi qəbul edək?"</string>
+ <string name="activity_resolver_use_always" msgid="8017770747801494933">"Həmişə"</string>
+ <string name="activity_resolver_use_once" msgid="2404644797149173758">"Sadəcə bir dəfə"</string>
+ <string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"PlanÅŸet"</string>
+ <string name="default_audio_route_name" product="default" msgid="4239291273420140123">"Telefon"</string>
+ <string name="default_audio_route_name_headphones" msgid="8119971843803439110">"Qulaqlıq"</string>
+ <string name="default_audio_route_name_dock_speakers" msgid="6240602982276591864">"Dok spikerlər"</string>
+ <string name="default_media_route_name_hdmi" msgid="2450970399023478055">"HDMI"</string>
+ <string name="default_audio_route_category_name" msgid="3722811174003886946">"Sistem"</string>
+ <string name="bluetooth_a2dp_audio_route_name" msgid="8575624030406771015">"Bluetooth audio"</string>
+ <string name="wireless_display_route_description" msgid="9070346425023979651">"Simsiz ekran"</string>
+ <string name="media_route_chooser_grouping_done" msgid="7966438307723317169">"Hazırdır"</string>
+ <string name="media_route_button_content_description" msgid="5758553567065145276">"Media çıxışı"</string>
+ <string name="media_route_status_scanning" msgid="7279908761758293783">"Skan edilir..."</string>
+ <string name="media_route_status_connecting" msgid="6422571716007825440">"QoÅŸulur..."</string>
+ <string name="media_route_status_available" msgid="6983258067194649391">"Ælçatımlı"</string>
+ <string name="media_route_status_not_available" msgid="6739899962681886401">"Ælçatımlı deyil"</string>
+ <string name="media_route_status_in_use" msgid="4533786031090198063">"İstifadə olunur"</string>
+ <string name="display_manager_built_in_display_name" msgid="2583134294292563941">"Daxili ekran"</string>
+ <string name="display_manager_hdmi_display_name" msgid="1555264559227470109">"HDMI Ekran"</string>
+ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Örtük #<xliff:g id="ID">%1$d</xliff:g>"</string>
+ <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
+ <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", təhlükəsiz"</string>
+ <string name="wifi_display_notification_title" msgid="2223050649240326557">"Simsiz ekran qoÅŸulub"</string>
+ <string name="wifi_display_notification_message" msgid="4498802012464170685">"Bu ekran digər cihazda göstərir"</string>
+ <string name="wifi_display_notification_disconnect" msgid="6183754463561153372">"Bağlantını kəsin"</string>
+ <string name="kg_emergency_call_label" msgid="684946192523830531">"Təcili zəng"</string>
+ <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Åžablonu unutmuÅŸam"</string>
+ <string name="kg_wrong_pattern" msgid="1850806070801358830">"Yanlış Model"</string>
+ <string name="kg_wrong_password" msgid="2333281762128113157">"Yanlış Şifrə"</string>
+ <string name="kg_wrong_pin" msgid="1131306510833563801">"PIN səhvdir"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"<xliff:g id="NUMBER">%1$d</xliff:g> saniyə sonra yenidən cəhd edin."</string>
+ <string name="kg_pattern_instructions" msgid="398978611683075868">"Şablonunuzu çəkin"</string>
+ <string name="kg_sim_pin_instructions" msgid="2319508550934557331">"SIM PIN kodu daxil edin"</string>
+ <string name="kg_pin_instructions" msgid="2377242233495111557">"PİN kodu daxil edin"</string>
+ <string name="kg_password_instructions" msgid="5753646556186936819">"Parol daxil edin"</string>
+ <string name="kg_puk_enter_puk_hint" msgid="453227143861735537">"SIM indi deaktivdir. Davam etmÉ™k üçün PUK kodu daxil edin. ÆlavÉ™ mÉ™lumat üçün operatora müraciÉ™t edin."</string>
+ <string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"İstədiyiniz PİN kodu daxil edin"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"İstədiyiniz PIN kodu təsdiqləyin"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"SİM kartın kilidi açılır..."</string>
+ <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"Yanlış PİN kod."</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"4-dən 8-ə qədər rəqəmi olan PIN yazın."</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"PUK kod 8 rəqəm və ya daha çox olmalıdır."</string>
+ <string name="kg_invalid_puk" msgid="3638289409676051243">"Düzgün PUK kodu yenidən daxil edin. Təkrarlanan cəhdlər SIM\'i birdəfəlik sıradan çıxaracaq."</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"PIN kodları uyğun deyil"</string>
+ <string name="kg_login_too_many_attempts" msgid="6486842094005698475">"Həddindən çox cəhd edildi!"</string>
+ <string name="kg_login_instructions" msgid="1100551261265506448">"Kilidi açmaq üçün Google hesabınız ilə daxil olun."</string>
+ <string name="kg_login_username_hint" msgid="5718534272070920364">"İstifadəçi adı (e-poçt)"</string>
+ <string name="kg_login_password_hint" msgid="9057289103827298549">"ÅžifrÉ™"</string>
+ <string name="kg_login_submit_button" msgid="5355904582674054702">"Daxil ol"</string>
+ <string name="kg_login_invalid_input" msgid="5754664119319872197">"Yanlış istifadəçi adı və ya parol."</string>
+ <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"İstifadəçi adınızı və ya parolunuzu unutmusunuz?\n "<b>"google.com/accounts/recovery"</b>" linkinə daxil olun."</string>
+ <string name="kg_login_checking_password" msgid="1052685197710252395">"Hesab yoxlanılır..."</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"PIN kodunuzu <xliff:g id="NUMBER_0">%d</xliff:g> dəfə yanlış daxil etdiniz.\n\n <xliff:g id="NUMBER_1">%d</xliff:g> saniyə ərzində yenidən yoxlayın"</string>
+ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"Şifrənizi <xliff:g id="NUMBER_0">%d</xliff:g> dəfə yanlış daxil etdiniz. \n\n <xliff:g id="NUMBER_1">%d</xliff:g> saniyə ərzində yenidən yoxlayın."</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"Modelinizi <xliff:g id="NUMBER_0">%d</xliff:g> dəfə yanlış çəkmisiniz.\n\n <xliff:g id="NUMBER_1">%d</xliff:g> saniyə ərzində yenidən yoxlayın"</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1575557200627128949">"Siz planşet kilidini açmaq üçün <xliff:g id="NUMBER_0">%d</xliff:g> dəfə uğursuz cəhd etmisiniz. <xliff:g id="NUMBER_1">%d</xliff:g> dəfə də uğursuz cəhd etsəniz, planşet fabrik ayarlarına sıfırlanacaq və bütün məlumatlarınız itəcək."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="4051015943038199910">"Siz telefon kilidini açmaq üçün <xliff:g id="NUMBER_0">%d</xliff:g> dəfə uğursuz cəhd etmisiniz. <xliff:g id="NUMBER_1">%d</xliff:g> dəfə də uğursuz cəhd etsəniz, telefon fabrik ayarlarına sıfırlanacaq və bütün məlumatlarınız itəcək."</string>
+ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="2072996269148483637">"Siz planşet kilidini açmaq üçün <xliff:g id="NUMBER">%d</xliff:g> dəfə uğursuz cəhd etmisiniz. Planşet fabrik ayarlarına sıfırlanacaq."</string>
+ <string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"Siz telefonun kilidini açmaq üçün <xliff:g id="NUMBER">%d</xliff:g> yanlış cəhd etmisiniz. Telefon artıq defolt zavod halına sıfırlanacaq."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Siz kilidi açmaq üçün şablonu <xliff:g id="NUMBER_0">%d</xliff:g> dəfə səhv çəkdiniz. <xliff:g id="NUMBER_1">%d</xliff:g> daha uğursuz cəhddən sonra planşetinizin kilidini e-poçt hesabınızla açmaq tələb olunacaq.\n\n <xliff:g id="NUMBER_2">%d</xliff:g> saniyə ərzində bir daha yoxlayın."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Siz artıq modeli <xliff:g id="NUMBER_0">%d</xliff:g> dəfə yanlış daxil etmisiniz.<xliff:g id="NUMBER_1">%d</xliff:g> dəfə də yanlış daxil etsəniz, telefonun kilidinin açılması üçün elektron poçt ünvanınız tələb olunacaq.\n\n <xliff:g id="NUMBER_2">%d</xliff:g> saniyə ərzində yenidən cəhd edin."</string>
+ <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" - "</string>
+ <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Yığışdır"</string>
+ <string name="safe_media_volume_warning" product="default" msgid="7324161939475478066">"Səs gücü tövsiyə edilən səviyyədən artırılsın?\nUzun müddət yüksək səs gücü ilə dinləmə Sizin eşitmə qabiliyyətinizə mənfi təsir edə bilər."</string>
+ <string name="continue_to_enable_accessibility" msgid="1626427372316070258">"Ælçatımlığı aktivləşdirmÉ™k üçün iki barmağınızı basılı saxlayın."</string>
+ <string name="accessibility_enabled" msgid="1381972048564547685">"Ælçatımlılıq aktivləşdirildi"</string>
+ <string name="enable_accessibility_canceled" msgid="3833923257966635673">"Giriş imkanı ləğv edilib."</string>
+ <string name="user_switched" msgid="3768006783166984410">"Cari istifadəçi <xliff:g id="NAME">%1$s</xliff:g>."</string>
+ <string name="owner_name" msgid="2716755460376028154">"Sahib"</string>
+ <string name="error_message_title" msgid="4510373083082500195">"Xəta"</string>
+ <string name="app_no_restricted_accounts" msgid="5739463249673727736">"Bu tətbiq məhdud profillər üçün hesabları dəstəkləmir."</string>
+ <string name="app_not_found" msgid="3429141853498927379">"Bu əməliyyatı idarə etmək üçün heç bir tətbiq tapılmadı."</string>
+ <string name="revoke" msgid="5404479185228271586">"Ləğv edin"</string>
+ <string name="mediaSize_iso_a0" msgid="7875427489420821793">"ISO A0"</string>
+ <string name="mediaSize_iso_a1" msgid="3760734499050875356">"ISO A1"</string>
+ <string name="mediaSize_iso_a2" msgid="5973266378020144382">"ISO A2"</string>
+ <string name="mediaSize_iso_a3" msgid="1373407105687300884">"ISO A3"</string>
+ <string name="mediaSize_iso_a4" msgid="6689772807982597254">"ISO A4"</string>
+ <string name="mediaSize_iso_a5" msgid="5353549652015741040">"ISO A5"</string>
+ <string name="mediaSize_iso_a6" msgid="8585038048674911907">"ISO A6"</string>
+ <string name="mediaSize_iso_a7" msgid="6641836716963839119">"ISO A7"</string>
+ <string name="mediaSize_iso_a8" msgid="7571139437465693355">"ISO A8"</string>
+ <string name="mediaSize_iso_a9" msgid="1378455891957115079">"ISO A9"</string>
+ <string name="mediaSize_iso_a10" msgid="2480747457429475344">"ISO A10"</string>
+ <string name="mediaSize_iso_b0" msgid="3965935097661108039">"ISO B0"</string>
+ <string name="mediaSize_iso_b1" msgid="2505753285010115437">"ISO B1"</string>
+ <string name="mediaSize_iso_b2" msgid="8763874709859458453">"ISO B2"</string>
+ <string name="mediaSize_iso_b3" msgid="4210506688191764076">"ISO B3"</string>
+ <string name="mediaSize_iso_b4" msgid="5749404165888526034">"B4 ISO"</string>
+ <string name="mediaSize_iso_b5" msgid="7640627414621904733">"ISO B5"</string>
+ <string name="mediaSize_iso_b6" msgid="7342988864712748544">"ISO B6"</string>
+ <string name="mediaSize_iso_b7" msgid="5069844065235382429">"ISO B7"</string>
+ <string name="mediaSize_iso_b8" msgid="7316818922278779774">"ISO B8"</string>
+ <string name="mediaSize_iso_b9" msgid="5414727094026532341">"ISO B9"</string>
+ <string name="mediaSize_iso_b10" msgid="5251253731832048185">"ISO B10"</string>
+ <string name="mediaSize_iso_c0" msgid="4003138342671964217">"ISO C0"</string>
+ <string name="mediaSize_iso_c1" msgid="1935188063393553008">"ISO C1"</string>
+ <string name="mediaSize_iso_c2" msgid="3197307969712069904">"ISO C2"</string>
+ <string name="mediaSize_iso_c3" msgid="4335826087321913508">"ISO C3"</string>
+ <string name="mediaSize_iso_c4" msgid="3745639598281015005">"ISO C4"</string>
+ <string name="mediaSize_iso_c5" msgid="8269457765822791013">"ISO C5"</string>
+ <string name="mediaSize_iso_c6" msgid="566666105260346930">"ISO C6"</string>
+ <string name="mediaSize_iso_c7" msgid="8678413180782608498">"ISO C7"</string>
+ <string name="mediaSize_iso_c8" msgid="8392376206627041730">"ISO C8"</string>
+ <string name="mediaSize_iso_c9" msgid="9191613372324845405">"ISO C9"</string>
+ <string name="mediaSize_iso_c10" msgid="7327709699184920822">"ISO C10"</string>
+ <string name="mediaSize_na_letter" msgid="4191805615829472953">"Məktub"</string>
+ <string name="mediaSize_na_gvrnmt_letter" msgid="7853382192649405507">"Hökumət Məktubu"</string>
+ <string name="mediaSize_na_legal" msgid="6697982988283823150">"Hüquqi"</string>
+ <string name="mediaSize_na_junior_legal" msgid="3727743969902758948">"Kiçik Hüquq"</string>
+ <string name="mediaSize_na_ledger" msgid="281871464896601236">"Qovluq"</string>
+ <string name="mediaSize_na_tabloid" msgid="5775966416333578127">"Qısa"</string>
+ <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Ləğv edildi"</string>
+ <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Kontent yazmna xətası"</string>
+ <string name="reason_unknown" msgid="6048913880184628119">"naməlum"</string>
+ <string name="restr_pin_enter_admin_pin" msgid="783643731895143970">"Administrator PIN kodunu daxil edin"</string>
+ <string name="restr_pin_enter_pin" msgid="3395953421368476103">"PIN daxil edin"</string>
+ <string name="restr_pin_incorrect" msgid="8571512003955077924">"Səhv"</string>
+ <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"Cari PIN"</string>
+ <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"Yeni PIN"</string>
+ <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"Yeni PIN\'i təsdiq edin"</string>
+ <string name="restr_pin_create_pin" msgid="8017600000263450337">"Dəyişmə məhdudiyyətləri üçün PİN yaradın"</string>
+ <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"PİN uyğun gəlmir. Yenidən cəhd edin."</string>
+ <string name="restr_pin_error_too_short" msgid="8173982756265777792">"PİN çox qısadır. Æn azı 4 rÉ™qÉ™m olmalıdır."</string>
+ <plurals name="restr_pin_countdown">
+ <item quantity="one" msgid="311050995198548675">"1 saniyə sonra təkrar yoxlayın"</item>
+ <item quantity="other" msgid="4730868920742952817">"<xliff:g id="COUNT">%d</xliff:g> saniyə sonra təkrar yoxlayın"</item>
+ </plurals>
+ <string name="restr_pin_try_later" msgid="973144472490532377">"Daha sonra yenidən yoxlayın."</string>
+ <string name="transient_navigation_confirmation" msgid="4907844043611123426">"Paneli göstərmək üçün ekranın küncünü sürüşdürün"</string>
+ <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"Sistem panelini göstərmək üçün ekranın küncündən sürüşdürün"</string>
+</resources>
diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml
new file mode 100644
index 0000000..08e79bb
--- /dev/null
+++ b/core/res/res/values-az/strings.xml
@@ -0,0 +1,1586 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="byteShort" msgid="8340973892742019101">"B"</string>
+ <string name="kilobyteShort" msgid="5973789783504771878">"KB"</string>
+ <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
+ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
+ <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
+ <string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
+ <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string>
+ <string name="untitled" msgid="4638956954852782576">"Başlıqsız"</string>
+ <string name="ellipsis" msgid="7899829516048813237">"..."</string>
+ <string name="ellipsis_two_dots" msgid="1228078994866030736">"‥"</string>
+ <string name="emptyPhoneNumber" msgid="7694063042079676517">"(Telefon nömrəsi yoxdur)"</string>
+ <string name="unknownName" msgid="2277556546742746522">"(Naməlum)"</string>
+ <string name="defaultVoiceMailAlphaTag" msgid="2660020990097733077">"Səsli poçt"</string>
+ <string name="defaultMsisdnAlphaTag" msgid="2850889754919584674">"MSISDN1"</string>
+ <string name="mmiError" msgid="5154499457739052907">"Bağlantı problemi və ya yalnış MM kodu."</string>
+ <string name="mmiFdnError" msgid="5224398216385316471">"ÆmÉ™liyyat yalnız sabit nömrÉ™lÉ™rÉ™ yığımla mÉ™hdudlaşıb."</string>
+ <string name="serviceEnabled" msgid="8147278346414714315">"Servis işə salındı."</string>
+ <string name="serviceEnabledFor" msgid="6856228140453471041">"Xidmət aktiv edilmişdir:"</string>
+ <string name="serviceDisabled" msgid="1937553226592516411">"Xidmət deaktiv edilib."</string>
+ <string name="serviceRegistered" msgid="6275019082598102493">"Qeydiyyat uÄŸurlu oldu."</string>
+ <string name="serviceErased" msgid="1288584695297200972">"SilinmÉ™ uÄŸurlu olmuÅŸdur."</string>
+ <string name="passwordIncorrect" msgid="7612208839450128715">"Yanlış parol"</string>
+ <string name="mmiComplete" msgid="8232527495411698359">"MMI tamamdır."</string>
+ <string name="badPin" msgid="9015277645546710014">"Daxil etdiyiniz köhnə PİN düzgün deyil."</string>
+ <string name="badPuk" msgid="5487257647081132201">"Daxil etdiyiniz PUK düzgün deyil."</string>
+ <string name="mismatchPin" msgid="609379054496863419">"Daxil etdiyiniz PİN kodlar uyğun gəlmir."</string>
+ <string name="invalidPin" msgid="3850018445187475377">"4-dən 8-ə qədər rəqəmi olan PIN yazın."</string>
+ <string name="invalidPuk" msgid="8761456210898036513">"8 və daha çox rəqəmi olan PUK yazın."</string>
+ <string name="needPuk" msgid="919668385956251611">"Sizin SİM kart PUK ilə kilidlənib. Onu açmaq üçün PUK kodu yazın."</string>
+ <string name="needPuk2" msgid="4526033371987193070">"SIM kartın kilidini açmaq üçün PUK2 yazın"</string>
+ <string name="imei" msgid="2625429890869005782">"IMEI"</string>
+ <string name="meid" msgid="4841221237681254195">"MEID"</string>
+ <string name="ClipMmi" msgid="6952821216480289285">"Daxil olan zəng edənin ID\'si"</string>
+ <string name="ClirMmi" msgid="7784673673446833091">"Gedən Zəng ID"</string>
+ <string name="CfMmi" msgid="5123218989141573515">"Zəng yönləndirmə"</string>
+ <string name="CwMmi" msgid="9129678056795016867">"Zəng gözləyir"</string>
+ <string name="BaMmi" msgid="455193067926770581">"Zəng qadağası"</string>
+ <string name="PwdMmi" msgid="7043715687905254199">"Parolu dəyiş"</string>
+ <string name="PinMmi" msgid="3113117780361190304">"PİN dəyişmək"</string>
+ <string name="CnipMmi" msgid="3110534680557857162">"Hazırdakı nömrəyə zəng edilir"</string>
+ <string name="CnirMmi" msgid="3062102121430548731">"Zənglərin sayı məhdudlaşdırılıb"</string>
+ <string name="ThreeWCMmi" msgid="9051047170321190368">"Üç yollu zəng"</string>
+ <string name="RuacMmi" msgid="7827887459138308886">"Xoşagəlməz zənglərdən imtina"</string>
+ <string name="CndMmi" msgid="3116446237081575808">"Çatdırılma zəngi"</string>
+ <string name="DndMmi" msgid="1265478932418334331">"Narahat etməyin"</string>
+ <string name="CLIRDefaultOnNextCallOn" msgid="429415409145781923">"Adətən zəng edənin ID\'si məhdudlaşdırılır. Növbəti zəng: Məhdudlaşdırılıb"</string>
+ <string name="CLIRDefaultOnNextCallOff" msgid="3092918006077864624">"Adətən zəng edənin ID\'si məhdudlaşdırılır. Növbəti zəng: Məhdudlaşdırılmayıb"</string>
+ <string name="CLIRDefaultOffNextCallOn" msgid="6179425182856418465">"Adətən zəng edənin ID\'si məhdudlaşdırılmır. Növbəti zəng: Məhdudlaşdırılıb"</string>
+ <string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"Adətən zəng edənin ID\'si məhdudlaşdırılmır. Növbəti zəng: Məhdudlaşdırılmayıb"</string>
+ <string name="serviceNotProvisioned" msgid="8614830180508686666">"Xidmət təmin edilməyib."</string>
+ <string name="CLIRPermanent" msgid="3377371145926835671">"Siz zəng edənin ID nizamlarını dəyişə bilməzsiz."</string>
+ <string name="RestrictedChangedTitle" msgid="5592189398956187498">"Məhdudlaşdırılmış keçid dəyişdi"</string>
+ <string name="RestrictedOnData" msgid="8653794784690065540">"Data xidmət bağlıdır."</string>
+ <string name="RestrictedOnEmergency" msgid="6581163779072833665">"Təcili xidmət bağlıdır."</string>
+ <string name="RestrictedOnNormal" msgid="4953867011389750673">"Səs xidməti bağlıdır."</string>
+ <string name="RestrictedOnAllVoice" msgid="3396963652108151260">"Bütün Səs xidmətləri bağlıdır"</string>
+ <string name="RestrictedOnSms" msgid="8314352327461638897">"SMS xidməti bloklanıb."</string>
+ <string name="RestrictedOnVoiceData" msgid="996636487106171320">"Səs/data xidmətləri bloklanıb."</string>
+ <string name="RestrictedOnVoiceSms" msgid="1888588152792023873">"Səs/SMS xidmətləri bloklanıb."</string>
+ <string name="RestrictedOnAll" msgid="5643028264466092821">"Bütün səs/data/SMS xidmətləri bağlıdır."</string>
+ <string name="serviceClassVoice" msgid="1258393812335258019">"Səs"</string>
+ <string name="serviceClassData" msgid="872456782077937893">"Məlumat"</string>
+ <string name="serviceClassFAX" msgid="5566624998840486475">"FAKS"</string>
+ <string name="serviceClassSMS" msgid="2015460373701527489">"SMS"</string>
+ <string name="serviceClassDataAsync" msgid="4523454783498551468">"Async"</string>
+ <string name="serviceClassDataSync" msgid="7530000519646054776">"Sinx"</string>
+ <string name="serviceClassPacket" msgid="6991006557993423453">"Paket"</string>
+ <string name="serviceClassPAD" msgid="3235259085648271037">"PAD"</string>
+ <string name="roamingText0" msgid="7170335472198694945">"Rominq göstəricisi işləkdir"</string>
+ <string name="roamingText1" msgid="5314861519752538922">"Rominq göstəricisi işlək deyil"</string>
+ <string name="roamingText2" msgid="8969929049081268115">"Rominq göstəricisi yanır"</string>
+ <string name="roamingText3" msgid="5148255027043943317">"Qonşuluqdan Kənar"</string>
+ <string name="roamingText4" msgid="8808456682550796530">"Binadan kənar"</string>
+ <string name="roamingText5" msgid="7604063252850354350">"Rominq - Arzuolunan sistem"</string>
+ <string name="roamingText6" msgid="2059440825782871513">"Rominq - Mümkün sistem"</string>
+ <string name="roamingText7" msgid="7112078724097233605">"Rominq - Alyans partnyoru"</string>
+ <string name="roamingText8" msgid="5989569778604089291">"Rominq - Premium partnyor"</string>
+ <string name="roamingText9" msgid="7969296811355152491">"Rouminq - Tam Xidmət Funksionallığı"</string>
+ <string name="roamingText10" msgid="3992906999815316417">"Rouminq - Qismən Xidmət Funksionallığı"</string>
+ <string name="roamingText11" msgid="4154476854426920970">"Rouminq Banneri Açıqdır"</string>
+ <string name="roamingText12" msgid="1189071119992726320">"Roaming Banner Off"</string>
+ <string name="roamingTextSearching" msgid="8360141885972279963">"Xidmət axtarılır"</string>
+ <string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Yönləndirilmədi"</string>
+ <string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
+ <string name="cfTemplateForwardedTime" msgid="9206251736527085256">"<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> saniyÉ™ sonra"</string>
+ <string name="cfTemplateRegistered" msgid="5073237827620166285">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Yönləndirilmədi"</string>
+ <string name="cfTemplateRegisteredTime" msgid="6781621964320635172">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Yönləndirilmədi"</string>
+ <string name="fcComplete" msgid="3118848230966886575">"Özəllik kodu tamamlandı."</string>
+ <string name="fcError" msgid="3327560126588500777">"ÆlaqÉ™ problemi vÉ™ ya yanlış funksiya kodu."</string>
+ <string name="httpErrorOk" msgid="1191919378083472204">"OK"</string>
+ <string name="httpError" msgid="7956392511146698522">"Şəbəkə xətası var idi."</string>
+ <string name="httpErrorLookup" msgid="4711687456111963163">"URL tapıla bilmədi."</string>
+ <string name="httpErrorUnsupportedAuthScheme" msgid="6299980280442076799">"Sayt autentifikasiya sxemi dəstəklənmir."</string>
+ <string name="httpErrorAuth" msgid="1435065629438044534">"Təsdiq edilə bilmədi."</string>
+ <string name="httpErrorProxyAuth" msgid="1788207010559081331">"Proksi server vasitəsilə təsdiqlənmə uğursuz oldu."</string>
+ <string name="httpErrorConnect" msgid="8714273236364640549">"Serverə qoşula bilmədi."</string>
+ <string name="httpErrorIO" msgid="2340558197489302188">"Serverlə əlaqə alınmadı. Sonra cəhd edin."</string>
+ <string name="httpErrorTimeout" msgid="4743403703762883954">"Server ilə olan əlaqə zaman aşımına məruz qaldı."</string>
+ <string name="httpErrorRedirectLoop" msgid="8679596090392779516">"Bu səhifədə həddindən çox server yönləndirilmələri var."</string>
+ <string name="httpErrorUnsupportedScheme" msgid="5015730812906192208">"Protokol dəstəklənmir."</string>
+ <string name="httpErrorFailedSslHandshake" msgid="96549606000658641">"Güvənli bağlantı yaradıla bilmədi."</string>
+ <string name="httpErrorBadUrl" msgid="3636929722728881972">"URL yanlış olduğu üçün səhifəni açmaq mümkün olmadı."</string>
+ <string name="httpErrorFile" msgid="2170788515052558676">"Fayla giriş baş tutmadı."</string>
+ <string name="httpErrorFileNotFound" msgid="6203856612042655084">"Tələb olunan fayl tapılmadı."</string>
+ <string name="httpErrorTooManyRequests" msgid="1235396927087188253">"Həddindən çox sorğu işlənilir. Daha sonra yoxlayın."</string>
+ <string name="notification_title" msgid="8967710025036163822">"<xliff:g id="ACCOUNT">%1$s</xliff:g> üçün giriş xətası"</string>
+ <string name="contentServiceSync" msgid="8353523060269335667">"Sinxronlaşdırma"</string>
+ <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Sinxronlaşdırma"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Həddindən çox <xliff:g id="CONTENT_TYPE">%s</xliff:g> silinmələri var."</string>
+ <string name="low_memory" product="tablet" msgid="6494019234102154896">"Planşetin yaddaşı doludur. Boş yer üçün bəzi faylları silin."</string>
+ <string name="low_memory" product="default" msgid="3475999286680000541">"Telefonun yaddaşı doludur. Boş yer üçün bəzi faylları silin."</string>
+ <string name="me" msgid="6545696007631404292">"Mən"</string>
+ <string name="power_dialog" product="tablet" msgid="8545351420865202853">"Planşet seçimləri"</string>
+ <string name="power_dialog" product="default" msgid="1319919075463988638">"Telefon seçimləri"</string>
+ <string name="silent_mode" msgid="7167703389802618663">"Səssiz rejim"</string>
+ <string name="turn_on_radio" msgid="3912793092339962371">"Simsizi işə salın"</string>
+ <string name="turn_off_radio" msgid="8198784949987062346">"Simsiz rabitəni söndürün"</string>
+ <string name="screen_lock" msgid="799094655496098153">"Ekran kilidi"</string>
+ <string name="power_off" msgid="4266614107412865048">"Söndür"</string>
+ <string name="silent_mode_silent" msgid="319298163018473078">"Zəng deaktivdir"</string>
+ <string name="silent_mode_vibrate" msgid="7072043388581551395">"Zəng vibrasiyadadır"</string>
+ <string name="silent_mode_ring" msgid="8592241816194074353">"Zəngvuran açıqdır"</string>
+ <string name="shutdown_progress" msgid="2281079257329981203">"Söndürülür..."</string>
+ <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Planşetiniz sönəcək."</string>
+ <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Telefonunuz sönəcək."</string>
+ <string name="shutdown_confirm_question" msgid="2906544768881136183">"Söndürmək istəyirsiz?"</string>
+ <string name="reboot_safemode_title" msgid="7054509914500140361">"Təhlükəsiz rejimdə yenidən başlayın"</string>
+ <string name="reboot_safemode_confirm" msgid="55293944502784668">"Təhlükəsiz rejimdə yenidən başlamaq istəyirsiniz mi? Bu, quraşdırdığınız bütün üçüncü tərəf tətbiqlərini deaktiv edəcək."</string>
+ <string name="recent_tasks_title" msgid="3691764623638127888">"Son"</string>
+ <string name="no_recent_tasks" msgid="8794906658732193473">"Heç bir son tətbiq yoxdur."</string>
+ <string name="global_actions" product="tablet" msgid="408477140088053665">"Planşet seçimləri"</string>
+ <string name="global_actions" product="default" msgid="2406416831541615258">"Telefon seçimləri"</string>
+ <string name="global_action_lock" msgid="2844945191792119712">"Ekran kilidi"</string>
+ <string name="global_action_power_off" msgid="4471879440839879722">"Söndür"</string>
+ <string name="global_action_bug_report" msgid="7934010578922304799">"Baq hesabatı"</string>
+ <string name="bugreport_title" msgid="2667494803742548533">"Baqı xəbər verin"</string>
+ <string name="bugreport_message" msgid="398447048750350456">"Bu, sizin hazırkı cihaz durumu haqqında məlumat toplayacaq ki, elektron məktub şəklində göndərsin. Baq raportuna başlamaq üçün bir az vaxt lazım ola bilər, bir az səbr edin."</string>
+ <string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Səssiz rejim"</string>
+ <string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"Səs qapalıdır"</string>
+ <string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"Səs Aktivdir"</string>
+ <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Təyyarə rejimi"</string>
+ <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Uçuş rejimi açıqdır"</string>
+ <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Təyyarə rejimi qapalıdır"</string>
+ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
+ <string name="safeMode" msgid="2788228061547930246">"Təhlükəsiz rejim"</string>
+ <string name="android_system_label" msgid="6577375335728551336">"Android sistemi"</string>
+ <string name="permgrouplab_costMoney" msgid="5429808217861460401">"Ödənişli xidmətlər"</string>
+ <string name="permgroupdesc_costMoney" msgid="3293301903409869495">"Xərc tutulacaq əməliyyatlar edir"</string>
+ <string name="permgrouplab_messages" msgid="7521249148445456662">"Sizin mesajlarınız"</string>
+ <string name="permgroupdesc_messages" msgid="7821999071003699236">"SMS, elektron poçt və digər mesajları oxuyur və yazır."</string>
+ <string name="permgrouplab_personalInfo" msgid="3519163141070533474">"Şəxsi məlumatınız"</string>
+ <string name="permgroupdesc_personalInfo" msgid="8426453129788861338">"Kontakt kartınızda saxlanılan məlumatlarınıza birbaşa giriş."</string>
+ <string name="permgrouplab_socialInfo" msgid="5799096623412043791">"Sosial məlumatınız"</string>
+ <string name="permgroupdesc_socialInfo" msgid="7129842457611643493">"Kontaktlarınız və sosial əlaqələriniz haqqında məlumata birbaşa giriş."</string>
+ <string name="permgrouplab_location" msgid="635149742436692049">"Yerləşməniz"</string>
+ <string name="permgroupdesc_location" msgid="5704679763124170100">"Fiziki adresinizi monitorinq edir."</string>
+ <string name="permgrouplab_network" msgid="5808983377727109831">"Şəbəkə kommunikasiyası"</string>
+ <string name="permgroupdesc_network" msgid="4478299413241861987">"Müxtəlif şəbəkə xüsusiyyətlərinə daxil ol."</string>
+ <string name="permgrouplab_bluetoothNetwork" msgid="1585403544162128109">"Bluetooth"</string>
+ <string name="permgroupdesc_bluetoothNetwork" msgid="5625288577164282391">"Bluetooth üzərindən cihazlara və şəbəkələrə daxil ol."</string>
+ <string name="permgrouplab_audioSettings" msgid="8329261670151871235">"Audio Ayarlar"</string>
+ <string name="permgroupdesc_audioSettings" msgid="2641515403347568130">"Audio ayarları dəyişin."</string>
+ <string name="permgrouplab_affectsBattery" msgid="6209246653424798033">"Batareyaya təsir edir"</string>
+ <string name="permgroupdesc_affectsBattery" msgid="6441275320638916947">"Batareyanızın tez qurtarmasına səbəb olan funksiyalar istifadə edir"</string>
+ <string name="permgrouplab_calendar" msgid="5863508437783683902">"Təqvim"</string>
+ <string name="permgroupdesc_calendar" msgid="5777534316982184416">"Təqvimə və tədbirlərə birbaşa giriş."</string>
+ <string name="permgrouplab_dictionary" msgid="4148597128843641379">"İstifadəçi Lüğətini Oxu"</string>
+ <string name="permgroupdesc_dictionary" msgid="7921166355964764490">"İstifadəçi lüğətindəki sözləri oxuyur."</string>
+ <string name="permgrouplab_writeDictionary" msgid="8090237702432576788">"İstifadəçi Lüğətini Yaz"</string>
+ <string name="permgroupdesc_writeDictionary" msgid="2711561994497361646">"İstifadəçi lüğətinə sözlər əlavə edin."</string>
+ <string name="permgrouplab_bookmarks" msgid="1949519673103968229">"ÆlfÉ™cinlÉ™r vÉ™ Tarixçə"</string>
+ <string name="permgroupdesc_bookmarks" msgid="4169771606257963028">"ÆlfÉ™cinlÉ™rÉ™ vÉ™ brauzer tarixinÉ™ birbaÅŸa icazÉ™."</string>
+ <string name="permgrouplab_deviceAlarms" msgid="6117704629728824101">"Zəng"</string>
+ <string name="permgroupdesc_deviceAlarms" msgid="4769356362251641175">"Alarm qur."</string>
+ <string name="permgrouplab_voicemail" msgid="4162237145027592133">"Səsli poçt"</string>
+ <string name="permgroupdesc_voicemail" msgid="2498403969862951393">"Səs poçtuna birbaşa çıxış."</string>
+ <string name="permgrouplab_microphone" msgid="171539900250043464">"Mikrofon"</string>
+ <string name="permgroupdesc_microphone" msgid="7106618286905738408">"Audio yazmaq üçün mikrofona birbaşa giriş."</string>
+ <string name="permgrouplab_camera" msgid="4820372495894586615">"Kamera"</string>
+ <string name="permgroupdesc_camera" msgid="2933667372289567714">"Şəkil və ya video çəkmək üçün kameraya birbaşa çıxış."</string>
+ <string name="permgrouplab_screenlock" msgid="8275500173330718168">"Ekran kilidi"</string>
+ <string name="permgroupdesc_screenlock" msgid="7067497128925499401">"Cihazınızdakı kilid ekranının hərəkətinə təsir etmə bacarığı"</string>
+ <string name="permgrouplab_appInfo" msgid="8028789762634147725">"Tətbiq məlumatlarınız"</string>
+ <string name="permgroupdesc_appInfo" msgid="3950378538049625907">"Cihazınızdakı digər tətbiqlərin davranışına təsir etmək bacarığı."</string>
+ <string name="permgrouplab_wallpaper" msgid="3850280158041175998">"Divar kağızı"</string>
+ <string name="permgroupdesc_wallpaper" msgid="5630417854750540154">"Cihazın divar kağızı ayarlarını dəyişin."</string>
+ <string name="permgrouplab_systemClock" msgid="406535759236612992">"Saat"</string>
+ <string name="permgroupdesc_systemClock" msgid="3944359833624094992">"Cihazın vaxt və zaman zolağını dəyişir."</string>
+ <string name="permgrouplab_statusBar" msgid="2095862568113945398">"Status paneli"</string>
+ <string name="permgroupdesc_statusBar" msgid="6242593432226807171">"Cihazın status paneli ayarlarınızı dəyişir."</string>
+ <string name="permgrouplab_syncSettings" msgid="3341990986147826541">"Sinx Ayarları"</string>
+ <string name="permgroupdesc_syncSettings" msgid="7603195265129031797">"Sinxronizasiya nizamlarına çıxış."</string>
+ <string name="permgrouplab_accounts" msgid="3359646291125325519">"Hesablarınız"</string>
+ <string name="permgroupdesc_accounts" msgid="4948732641827091312">"Ælçatımlı hesablara daxil olun."</string>
+ <string name="permgrouplab_hardwareControls" msgid="7998214968791599326">"Hardware kontrolları"</string>
+ <string name="permgroupdesc_hardwareControls" msgid="4357057861225462702">"Dəstəkdəki avadanlığa birbaşa giriş."</string>
+ <string name="permgrouplab_phoneCalls" msgid="9067173988325865923">"Telefon zəngləri"</string>
+ <string name="permgroupdesc_phoneCalls" msgid="7489701620446183770">"Telefon zənglərinə nəzarət edin, qeydə alın və idarə edin."</string>
+ <string name="permgrouplab_systemTools" msgid="4652191644082714048">"Sistem alətləri"</string>
+ <string name="permgroupdesc_systemTools" msgid="8162102602190734305">"Aşağı səviyyəli çıxış və sistem idarəetməsi."</string>
+ <string name="permgrouplab_developmentTools" msgid="3446164584710596513">"İnkişaf alətləri"</string>
+ <string name="permgroupdesc_developmentTools" msgid="7058828032358142018">"Özəlliklər yalnız tətbiq developerləri üçün lazımdır."</string>
+ <string name="permgrouplab_display" msgid="4279909676036402636">"Digər tətbiq İstifadəçi İnterfeysi"</string>
+ <string name="permgroupdesc_display" msgid="6051002031933013714">"Digər tətbiqlərin İstifadəçi İnterfeysinə təsir edir."</string>
+ <string name="permgrouplab_storage" msgid="1971118770546336966">"YaddaÅŸ"</string>
+ <string name="permgroupdesc_storage" product="nosdcard" msgid="7442318502446874999">"USB yaddaÅŸa daxil ol."</string>
+ <string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"SD karta daxil ol."</string>
+ <string name="permgrouplab_accessibilityFeatures" msgid="7919025602283593907">"Ælçatımlılıq funksiyaları"</string>
+ <string name="permgroupdesc_accessibilityFeatures" msgid="4205196881678144335">"Yardımçı texnologiya tələb edə biləcəyi funksiyalar."</string>
+ <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Pəncərənin məzmununu əldə edin"</string>
+ <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"ÆlaqÉ™dÉ™ olduÄŸunuz pÉ™ncÉ™rÉ™nin mÉ™zmununu nÉ™zÉ™rdÉ™n keçirin."</string>
+ <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Toxunaraq Kəşf et funksiyasını yandırın"</string>
+ <string name="capability_desc_canRequestTouchExploration" msgid="5800552516779249356">"Toxunulan hissələr səsləndiriləcək və ekran jestlərlə idarə oluna biləcək."</string>
+ <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"İnkişaf etmiş veb əlçatımlılığı yandırın"</string>
+ <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Skriptlər tətbiq məzmununun daha əlçatımlı olması üçün quraşdırıla bilər."</string>
+ <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Yazdığınız mətni izləyin"</string>
+ <string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Kredit kartı nömrələri və parollar kimi şəxsi məlumatlar daxildir."</string>
+ <string name="permlab_statusBar" msgid="7417192629601890791">"status panelini deaktivləşdir və ya dəyişdir"</string>
+ <string name="permdesc_statusBar" msgid="8434669549504290975">"Tətbiqə status panelini deaktiv etməyə və ya sistem ikonalarını əlavə etmək və ya silmək imkanı verir."</string>
+ <string name="permlab_statusBarService" msgid="7247281911387931485">"status paneli"</string>
+ <string name="permdesc_statusBarService" msgid="716113660795976060">"Tətbiqə status paneli olmağa imkan verir."</string>
+ <string name="permlab_expandStatusBar" msgid="1148198785937489264">"status panelini genişlətmək və ya yığmaq"</string>
+ <string name="permdesc_expandStatusBar" msgid="6917549437129401132">"Tətbiqə status panelini genişləndirməyə və ya yox etməyə imkan verir."</string>
+ <string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"gedən zənglərin marşrutunu dəyişmək"</string>
+ <string name="permdesc_processOutgoingCalls" msgid="5331318931937402040">"Tətbiqə zəng etməyə və zəng edilən nömrəni dəyişməyə imkan verir. Zərərli tətbiqlər bundan istifadə edərək gedən zəngləri izləyə, yönləndirə və ya qarşısını ala bilər."</string>
+ <string name="permlab_receiveSms" msgid="8673471768947895082">"SMS qəbul etmək"</string>
+ <string name="permdesc_receiveSms" msgid="6424387754228766939">"Tətbiqə MMS mesajlarını almaq və emal etmək icazəsi verir. Bu o deməkdir ki, tətbiq sizin mesajlarınızı sizə göstərmədən monitorinq edə və ya silə bilər."</string>
+ <string name="permlab_receiveMms" msgid="1821317344668257098">"mətn mesajlarını qəbul edir (MMS)"</string>
+ <string name="permdesc_receiveMms" msgid="533019437263212260">"Tətbiqə MMS mesajlarını qəbul və emal üçün imkan verir. Bu o deməkdir ki, bu tətbiq sizə göstərmədən cihazınıza göndərilən mesajları silə bilər."</string>
+ <string name="permlab_receiveEmergencyBroadcast" msgid="1803477660846288089">"təcili yayımları qəbul edir"</string>
+ <string name="permdesc_receiveEmergencyBroadcast" msgid="848524070262431974">"Tətbiqə təcili yayım mesajlarını qəbul və emal etmək icazəsi verir. Bu icazə ancaq sistem tətbiqləri üçün mümkündür."</string>
+ <string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"mobil yayım mesajlarını oxuyur"</string>
+ <string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"Tətbiqə sizin telefonunuz tərəfindən alınmış yayım mesajlarını oxuma icazəsi verir. Telefon yayımı bəzi məkanlarda olan fövqəladə hadisələrlə bağlı sizi xəbərdar etmək üçün qəbul edilir. Zərərli tətbiqlər fövqəladə mobil yayım qəbul edildiyi zaman telefonunun performansına və əməliyyatına müdaxilə edə bilər."</string>
+ <string name="permlab_sendSms" msgid="5600830612147671529">"SMS mesajlarını göndərir"</string>
+ <string name="permdesc_sendSms" msgid="7094729298204937667">"Tətbiqə SMS mesajı göndərmə icazəsi verir. Bu gözlənilməyən ödənişlərə səbəb ola bilər. Zərərli tətbiqlər sizin təsdiqiniz olmadan mesaj göndərməklə sizə ödənişə səbəb ola bilərlər."</string>
+ <string name="permlab_sendRespondViaMessageRequest" msgid="8713889105305943200">"mesajla cavab verilməli tədbirlər göndərmək"</string>
+ <string name="permdesc_sendRespondViaMessageRequest" msgid="7107648548468778734">"Tətbiqə zənglər üçün \"mesajla cavabla\" hadisələrini idarə etmək üçün digər mesajlaşma tətbiqlərinə sorğuların göndərilməsi icazəsi verir."</string>
+ <string name="permlab_readSms" msgid="8745086572213270480">"tekst mesajlarınızı oxuyur (SMS və ya MMS)"</string>
+ <string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"Tətbiqə planşetinizdə və ya SIM kartınızda saxlanan SMS mesajları oxumağa imkan verir. Bu bütün SMS mesajların, onların məzmunundan və konfidensiallığından asılı olmadan oxunması imkanı deməkdir."</string>
+ <string name="permdesc_readSms" product="default" msgid="3695967533457240550">"Tətbiqə telefonunuzda və ya SIM kartınızda saxlanan SMS mesajları oxumağa imkan verir. Bu bütün SMS mesajların, onların məzmunundan və konfidensiallığından asılı olmadan oxunması imkanı deməkdir."</string>
+ <string name="permlab_writeSms" msgid="3216950472636214774">"mətn mesajlarınızı redaktə edir (SMS və ya MMS)"</string>
+ <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"Tətbiqə telefonunuzda və ya SİM kartınızda yerləşən SMS mesajlara yazma icazəsi verir. Zərərli tətbiqlər sizin mesajlarınızı silə bilər."</string>
+ <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"Tətbiqə telefonunuzda və ya SİM kartınızda yerləşən SMS mesajlara yazma icazəsi verir. Zərərli tətbiqlər sizin mesajlarınızı silə bilər."</string>
+ <string name="permlab_receiveWapPush" msgid="5991398711936590410">"mətn mesajları qəbul etmək (WAP)"</string>
+ <string name="permdesc_receiveWapPush" msgid="748232190220583385">"Tətbiqə WAP mesajlar göndərmək və ya qəbul etmək imkanı verir. Buna mesajları izləmək və Sizə xəbər vermədən silmək imkanları da daxildir."</string>
+ <string name="permlab_getTasks" msgid="6466095396623933906">"işlənən tətbiqlər əldə etmək"</string>
+ <string name="permdesc_getTasks" msgid="7454215995847658102">"Tətbiqə hazırda və az öncə işləyən tapşırıqlar haqqında ətraflı məlumat əldə etməyə imkan verir. Bu da cihazda hansı tətbiqlərin istifadə olunması haqqında məlumatların əldə edilməsinə imkan verir."</string>
+ <string name="permlab_interactAcrossUsers" msgid="7114255281944211682">"istifadəçilər arasında əlaqə qurur"</string>
+ <string name="permdesc_interactAcrossUsers" msgid="364670963623385786">"Tətbiqə bu cihazdakı digər istifadəçilərlə müxtəlif işləri görməyə icazə verir. Zərərli tətbiqlər bundan istifadəçilər arasındakı qorunmanı pozmaq üçün istifadə edə bilər."</string>
+ <string name="permlab_interactAcrossUsersFull" msgid="2567734285545074105">"bütün istifadəçilər ilə əlaqə saxlamaq üçün tam hüquq"</string>
+ <string name="permdesc_interactAcrossUsersFull" msgid="376841368395502366">"İstifadəçilər arasında bütün mümkün əlaqələrə imkan verir."</string>
+ <string name="permlab_manageUsers" msgid="1676150911672282428">"istifadəçiləri idarə edir"</string>
+ <string name="permdesc_manageUsers" msgid="8409306667645355638">"Tətbiqlərə cihazda olan istifadəçiləri, habelə sorğu göndərmə, yaratma və silmə izni verir."</string>
+ <string name="permlab_getDetailedTasks" msgid="6229468674753529501">"işlənən tətbiqlərin detallarını əldə etmək"</string>
+ <string name="permdesc_getDetailedTasks" msgid="153824741440717599">"Tətbiqə hazırda və az öncə işləyən tapşırıqlar haqqında ətraflı məlumat əldə etməyə imkan verir. Zərərli tətbiqlər bundan istifadə edərək şəxsi məlumatları oğurlaya bilər."</string>
+ <string name="permlab_reorderTasks" msgid="2018575526934422779">"işlənən tətbiqlərin sırasını dəyişmək"</string>
+ <string name="permdesc_reorderTasks" msgid="7734217754877439351">"Tətbiqə tapşırıqları ön plandan arxa plana keçirməyə imkan verir. Tətbiq bunu Sizin daxiletməniz olmadan da edə bilər."</string>
+ <string name="permlab_removeTasks" msgid="6821513401870377403">"işlək tətbiqləri dayandırır"</string>
+ <string name="permdesc_removeTasks" msgid="1394714352062635493">"Tətbiqə tapşırıqları silməyə və onların tətbiqlərini məhv etməyə imkan verir. Zərərli tətbiqlər bundan istifadə edərək digər tətbiqlərin işlərini dayandıra bilər."</string>
+ <string name="permlab_manageActivityStacks" msgid="7391191384027303065">"fəaliyyət toplularını idarə edin"</string>
+ <string name="permdesc_manageActivityStacks" msgid="1615881933034084440">"Tətbiqə digər tətbiqlərin fəaliyyəti daxilində fəaliyyət toplularını əlavə etmək, silmək və dəyişmək imkanı verir."</string>
+ <string name="permlab_startAnyActivity" msgid="2918768238045206456">"hər hansı bir fəaliyyət başlat"</string>
+ <string name="permdesc_startAnyActivity" msgid="997823695343584001">"İcazə qorunması və ya eksport edilmiş statusdan asılı olmayaraq, tətbiqə hər hansı fəaliyyəti başlatmağa imkan verir."</string>
+ <string name="permlab_setScreenCompatibility" msgid="6975387118861842061">"ekran uyğunluğunu yerləşdirir"</string>
+ <string name="permdesc_setScreenCompatibility" msgid="692043618693917374">"Tətbiqə digər tətbiqlərin ekran uyğunluğunu yoxlamaq imkanı verir. Zərərli tətbiqlər digər tətbiqlərin fəaliyyətini poza bilər."</string>
+ <string name="permlab_setDebugApp" msgid="3022107198686584052">"tətbiq sazlanmasını aktiv edir"</string>
+ <string name="permdesc_setDebugApp" msgid="4474512416299013256">"Tətbiqə digər bir tətbiq üçün sazlamanı açmaq üçün imkan verir. Zərərli tətbiqlər bunu digər tətbiqləri yox etmək üçün istifadə edə bilər."</string>
+ <string name="permlab_changeConfiguration" msgid="4162092185124234480">"sistem ekran nizamlarını dəyiş"</string>
+ <string name="permdesc_changeConfiguration" msgid="4372223873154296076">"Tətbiqə yerli parametrlər və ya şriftin ölçüsü kimi cari konfiqurasiyanı dəyişməyə imkan verir."</string>
+ <string name="permlab_enableCarMode" msgid="5684504058192921098">"avtomobil rejimini aktivləşdirir"</string>
+ <string name="permdesc_enableCarMode" msgid="4853187425751419467">"Tətbiqə avtomobil rejimini aktivləşdirməyə imkan verir."</string>
+ <string name="permlab_killBackgroundProcesses" msgid="3914026687420177202">"digər tətbiqləri qapatmaq"</string>
+ <string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"Tətbiqə başqa tətbiqlərin arxafon proseslərini dayandırmaq icazəsi verir. Bu digər tətbiqlərin dayanmasına səbəb ola bilər."</string>
+ <string name="permlab_forceStopPackages" msgid="2329627428832067700">"Digər tətbiqləri dayanmağa məcbur et"</string>
+ <string name="permdesc_forceStopPackages" msgid="5253157296183940812">"Tətbiqə digər tətbiqləri məcburi şəkildə dayandırmağa imkan verir."</string>
+ <string name="permlab_forceBack" msgid="652935204072584616">"tətbiqi qapanmağa məcbur etmək"</string>
+ <string name="permdesc_forceBack" msgid="3892295830419513623">"Tətbiqə ön planda olan istənilən tətbiqi bağlayaraq geriyə dönməyə imkan verir. Normal tətbiqlər tərəfindən heç vaxt istifadə olunmamalıdır."</string>
+ <string name="permlab_dump" msgid="1681799862438954752">"sistemin daxili durumunu bərpa et"</string>
+ <string name="permdesc_dump" msgid="1778299088692290329">"Tətbiqə sistemin daxili statusunu bərpa etməyə imkan verir. Zərərli tətbiqlər lazım olmadığı halda müxtəlif şəxsi və güvənli məlumatları bərpa edə bilər."</string>
+ <string name="permlab_retrieve_window_content" msgid="8022588608994589938">"ekran kontentini bərpa edir"</string>
+ <string name="permdesc_retrieve_window_content" msgid="3193269069469700265">"Tətbiqə aktiv pəncərənin məzmununu əldə etməyə imkan verir. Zərərli tətbiqlər bundan istifadə edərək pəncərə məzmununu ələ keçirib parollları oxuya bilər."</string>
+ <string name="permlab_temporary_enable_accessibility" msgid="2312612135127310254">"giriş imkanını müvəqqəti açmaq"</string>
+ <string name="permdesc_temporary_enable_accessibility" msgid="8079456293182975464">"Tətbiqə cihaza girişi müvəqqəti olaraq aktivləşdirməyə imkan verir. Zərərli tətbiqlər istifadəçi razılığı olmadan girişi aktivləşdirə bilər."</string>
+ <string name="permlab_retrieve_window_info" msgid="8532295199112519378">"pəncərə infosunu bərpa edir"</string>
+ <string name="permdesc_retrieve_window_info" msgid="4998836370424186849">"Tətbiqə pəncərə idarəçisindən gələn windows haqqında olan məlumatı bərpa etməyə imkan verir. Zərərli tətbiqlər daxili sistem istifadəsi üçün nəzərdə tutulan məlumatı bərpa edə bilər."</string>
+ <string name="permlab_filter_events" msgid="8675535648807427389">"tədbirləri filtr edir"</string>
+ <string name="permdesc_filter_events" msgid="8006236315888347680">"Tətbiqə daxiletmə filtrini qeydiyyat etdirməyə imkan verir, bu filtr bütün istifadəçi tədbirlərini göndərilməmişdən əvvəl filtrdən keçirir. Zərərli tətbiq istifadəçi müdaxiləsi olmadan İstifadəçi İnterfeysi sisteminə nəzarət edə bilər."</string>
+ <string name="permlab_magnify_display" msgid="5973626738170618775">"ekranı böyüdür"</string>
+ <string name="permdesc_magnify_display" msgid="7121235684515003792">"Tətbiqə ekran kontentini böyütmək icazəsi verir. Zərərli tətbiqlər bundan istifadə edərək ekranda kontenti böyüdərək cihazın qeyri-stabilliyinə səbəb ola bilər."</string>
+ <string name="permlab_shutdown" msgid="7185747824038909016">"qismən söndürür"</string>
+ <string name="permdesc_shutdown" msgid="7046500838746291775">"Aktivlik idarəçiliyini qapanmış hala gətirir. Tam qapanmanı həyata keçirmir."</string>
+ <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"tətbiqdən tətbiqə keçidin qarşısını almaq"</string>
+ <string name="permdesc_stopAppSwitches" msgid="8262195802582255021">"İstifadəçinin başqa tətbiqə keçməsinin qarşısını alır."</string>
+ <string name="permlab_getTopActivityInfo" msgid="2537922311411546016">"cari tətbiq informasiyası əldə etmək"</string>
+ <string name="permdesc_getTopActivityInfo" msgid="8153651434145132505">"Sahibə ekran önündə cari tətbiq və xidmətlər haqqında şəxsi məlumat əldə etməyə imkan verir."</string>
+ <string name="permlab_runSetActivityWatcher" msgid="892239094867182656">"işə salınan bütün tətbiqləri izləyir və idarə edir"</string>
+ <string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"Tətbiqə sistemin fəaliyyətləri necə başlatdığını nəzarət və kontrol etməyə imkan verir. Zərərli tətbiqlər sistemi tamamilə kompromis edə bilər. Bu icazə yalnız inkişaf üçündür, heç vaxt normal istifadə üçün deyil."</string>
+ <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"qaldırılmış yayım paketini göndər"</string>
+ <string name="permdesc_broadcastPackageRemoved" msgid="6621901216207931089">"Tətbiqə tətbiq paketinin silinməsi haqqında bildiriş translasiya etmə icazəsi verir. Zərərli tətbiqlər bundan digər işlək tətbiqləri dayandırmaq üçün istifadə edə bilər."</string>
+ <string name="permlab_broadcastSmsReceived" msgid="5689095009030336593">"SMS tərəfindən qəbul edilən yayım göndər"</string>
+ <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"Tətbiqə mesaj gəlməsi haqqında bildirişi yayımlamaq imkanı verir. Zərərli tətbiqlər bundan gələn SMS mesajlarını saxtalaşdırmaq üçün istifadə edə bilər."</string>
+ <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"WAP-PUSH tərəfindən qəbul edilən yayım göndər"</string>
+ <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"Tətbiqə WAP PUSH mesajın alındığı haqda bildiriş translasiya etməyə icazə verir. Zərərli tətbiqlər bundan istifadə edərək saxta MMS mesaj alışı və ya səssizcə istənilən veb səhifəni zərərverici variantlarla dəyişmək üçün istifadə edə bilər."</string>
+ <string name="permlab_setProcessLimit" msgid="2451873664363662666">"çalışan proseslərin sayını məhdudlaşdırır"</string>
+ <string name="permdesc_setProcessLimit" msgid="7318061314040879542">"Tətbiqə işlədiləcək maksimum proses sayını idarə etmə izni verir. Normal tətbiqlər tərəfindən tələb olunmur."</string>
+ <string name="permlab_setAlwaysFinish" msgid="550958507798796965">"arxafon tətbiqlərini dayanmağa məcbur edir"</string>
+ <string name="permdesc_setAlwaysFinish" msgid="7471310652868841499">"Tətbiqə aktivitilərin arxa fona getdiyi zaman bitməsini yoxlayır. Normal tətbiqlər tərəfindən tələn olunmur."</string>
+ <string name="permlab_batteryStats" msgid="2789610673514103364">"batareya statistikalarını oxumaq"</string>
+ <string name="permdesc_batteryStats" msgid="5897346582882915114">"Tətbiqə cari aşağı səviyyəli data sitifadəsini oxumaq imkanı verir. Tətbiqə hansı tətbiqi istifadə etdiyiniz haqqında ətraflı məlumat tapmağa imkan verə bilər."</string>
+ <string name="permlab_updateBatteryStats" msgid="3719689764536379557">"batareya statistikalarını dəyişmək"</string>
+ <string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Tətbiqə yığılmış batareya statistikasını redaktə etmə icazəsi verir. Normal tətbiqlər tərəfindən istifadə edilmir."</string>
+ <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"tətbiq əməliyyat statistikalarını əldə etmək"</string>
+ <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Toplanmış tətbiq əməliyyat statistikalarının bərpa edilməsinə imkan verir. Normal tətbiqlər tərəfindən istifadə üçün deyil."</string>
+ <string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"tətbiq əməliyyat statistikasını dəyişmək"</string>
+ <string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Tətbiqə toplanmış tətbiq əməliyyat statistikasını dəyişməyə imkan verir. Normal tətbiqlər tərəfindən istifadə olunmur."</string>
+ <string name="permlab_backup" msgid="470013022865453920">"sistem yedəkləməsi və bərpasını idarə edir"</string>
+ <string name="permdesc_backup" msgid="6912230525140589891">"Tətbiqə sistemi rezerv etməyə və mexanizmi bərpa etməyə imkan verir. Normal tətbiqlər tərəfindən istifadə edilmək üçün nəzərdə tutulmayıb.."</string>
+ <string name="permlab_confirm_full_backup" msgid="5557071325804469102">"tam rezervi təsdiq etmək və ya əməliyyatı bərpa etmək"</string>
+ <string name="permdesc_confirm_full_backup" msgid="1748762171637699562">"Tətbiqə İstifadəçi İnterfeysi tam rezerv təsdiqini işə salmağa imkan verir. Heç bir tətbiq tərəfindən istifadə olunmamalıdır."</string>
+ <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"icazəsiz pəncərələri görüntüləyir"</string>
+ <string name="permdesc_internalSystemWindow" msgid="7458387759461466397">"Tətbiqə daxili sistem interfeysi tərəfindən istifadə edilməsi üçün nəzərdə tutulmuş pəncərələri yaratmağa icazə verir. Normal tətbiqlər tərəfindən istifadə edilmir."</string>
+ <string name="permlab_systemAlertWindow" msgid="3543347980839518613">"digər tətbiqlər üzərində çəkmək"</string>
+ <string name="permdesc_systemAlertWindow" msgid="8584678381972820118">"Tətbiqə digər tətbiqlərin və ya onların hissələrinin yuxarısında şəkil çəkməyə imkan verir. Onlar istənilən tətbiqin interfeysinin istifadəsinə müdaxilə edə və ya digər tətbiqlərdə axtardıqlarınızı dəyişə bilər."</string>
+ <string name="permlab_setAnimationScale" msgid="2805103241153907174">"qlobal animasiya sürətini dəyişir"</string>
+ <string name="permdesc_setAnimationScale" msgid="7690063428924343571">"Tətbiqə istənilən vaxt qlobal animasiya sürətini (sürətli və ya yavaş animasiyalar) dəyişdirmək imkanı verir."</string>
+ <string name="permlab_manageAppTokens" msgid="1286505717050121370">"tətbiq nişanlarını idarə etmək"</string>
+ <string name="permdesc_manageAppTokens" msgid="8043431713014395671">"Tətbiqlərə onların normal Z-orderinqi keçərək markerlərini yaratma və idarəetmə icazəsi verir. Normal tətbiqlər tərəfindən istifadə olunmur."</string>
+ <string name="permlab_freezeScreen" msgid="4708181184441880175">"ekranı dondurur"</string>
+ <string name="permdesc_freezeScreen" msgid="8558923789222670064">"Tətbiqə tam ekranlı yayım üçün ekranı müvəqqəti olaraq dondurma icazəsi verir."</string>
+ <string name="permlab_injectEvents" msgid="1378746584023586600">"düymələri və idarəetmə düymələrini basır"</string>
+ <string name="permdesc_injectEvents" product="tablet" msgid="206352565599968632">"Tətbiqə özünün daxiletmə tədbirlərini digər tətbiqlərə çatdırmağa imkan verir. Zərərli tətbiqlər planşeti ələ keçirmək üçün bundan istifadə edə bilər."</string>
+ <string name="permdesc_injectEvents" product="default" msgid="653128057572326253">"Tətbiqə özünün daxiletmə tədbirlərini digər tətbiqlərə çatdırmağa imkan verir. Zərərli tətbiqlər telefonu ələ keçirmək üçün bundan istifadə edə bilər."</string>
+ <string name="permlab_readInputState" msgid="469428900041249234">"yazdıqlarınızı və etdiklərinizi izləyir"</string>
+ <string name="permdesc_readInputState" msgid="8387754901688728043">"Tətbiqə basdığınız düymələri izləmək imkanı verilir. Buna parolların və kredit kartı nömrələrinin yazılması da aiddir. Normal tətbiqlər tərəfindən istifadə olunmur."</string>
+ <string name="permlab_bindInputMethod" msgid="3360064620230515776">"daxiletmə metoduna bağlanır"</string>
+ <string name="permdesc_bindInputMethod" msgid="3250440322807286331">"Sahibinə daxiletmə metodunun ən üst səviyyə interfeysinə bağlamaq imkanı verir. Normal tətbiqlər üçün heç vaxt lazım olmamalıdır."</string>
+ <string name="permlab_bindAccessibilityService" msgid="5357733942556031593">"giriş xidmətinə bağlı qal"</string>
+ <string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Sahibə giriş xidmətin ən üst səviyyə interfeysi bağlamağa imkan verir. Normal tətbiqlər üçün heç vaxt lazım olmamalıdır."</string>
+ <string name="permlab_bindPrintService" msgid="8462815179572748761">"çap servisini qoşma"</string>
+ <string name="permdesc_bindPrintService" msgid="7960067623209111135">"Sahibinə bir çap xidmətinin ən üst səviyə araüzünü bağlamağa imkan verir. Normal tətbiqlər üçün heç vaxt lazım olmamalıdır."</string>
+ <string name="permlab_accessAllPrintJobs" msgid="1120792468465711159">"bütün çap işlərinə giriş əldə et"</string>
+ <string name="permdesc_accessAllPrintJobs" msgid="2978185311041864762">"Sahibinə digər tətbiqlər tərəfindən yaradılan çap işlərinə giriş hüququ verir. Normal tətbiqlər üçün tələb olunmamalıdır."</string>
+ <string name="permlab_bindNfcService" msgid="2752731300419410724">"NFC xidmətlərinə qoşun"</string>
+ <string name="permdesc_bindNfcService" msgid="6120647629174066862">"Sahibinə NFC kartlarını emulyasiya edən tətbiqləri bir-birinə qoşmağa icazə verin. Normal tətbiqlər üçün lazım deyil."</string>
+ <string name="permlab_bindTextService" msgid="7358378401915287938">"mətn servisini qoşma"</string>
+ <string name="permdesc_bindTextService" msgid="8151968910973998670">"Sahibinə bir mətn xidmətinin ən üst səviyyə araüzünü bağlamağa imkan verir(məsələn, SpellCheckerService). Normal tətbiqlər üçün heç vaxt lazım olmamalıdır."</string>
+ <string name="permlab_bindVpnService" msgid="4708596021161473255">"VPN xidmətə əlaqələndirmək"</string>
+ <string name="permdesc_bindVpnService" msgid="2067845564581693905">"Sahibinə bir Vpn xidmətinin ən üst səviyyə araüzünü bağlamağa imkan verir. Normal tətbiqlər üçün heç vaxt lazım olmamalıdır."</string>
+ <string name="permlab_bindWallpaper" msgid="8716400279937856462">"divar kağızına bağlanır"</string>
+ <string name="permdesc_bindWallpaper" msgid="7108428692595491668">"Cihaz sahibinə yuxarı səviyyəli divar kağızı interfeysini cildləməyə imkan verir. Normal tətbiqlər tərəfindən istifadə olunmamalıdır."</string>
+ <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"widget servisini qoÅŸma"</string>
+ <string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"Sahibinə vidcet servisin yüksək səviyyəli interfeysi ilə əlaqə saxlamaq icazəsi verir. Normal tətbiqlər tərəfindən heç vaxt istənilməməlidir."</string>
+ <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"cihaz admini ilə ünsiyyət qurmaq"</string>
+ <string name="permdesc_bindDeviceAdmin" msgid="569715419543907930">"Sahibinə bir cihaz idarəçisinə planlar göndərmək üçün imkan verir. Normal tətbiqlər üçün heç vaxt lazım olmamalıdır."</string>
+ <string name="permlab_manageDeviceAdmins" msgid="4248828900045808722">"cihaz admini əlavə edin və ya silin"</string>
+ <string name="permdesc_manageDeviceAdmins" msgid="5025608167709942485">"Sahibinə aktiv cihaz administratorlarını əlavə etməyə və ya silməyə icazə verir. Normal tətbiqlər üçün tələb olunmamalıdır."</string>
+ <string name="permlab_setOrientation" msgid="3365947717163866844">"ekran oriyentasiyasını dəyişir"</string>
+ <string name="permdesc_setOrientation" msgid="3046126619316671476">"Tətbiqə istənilən zaman ekranın vəziyyətini dəyişmə icazəsi verir. Normal tətbiqlər tərəfindən tələb olunmur."</string>
+ <string name="permlab_setPointerSpeed" msgid="9175371613322562934">"kursor sürətini dəyişmək"</string>
+ <string name="permdesc_setPointerSpeed" msgid="6866563234274104233">"Tətbiqə mausun və ya trekpedin kursor sürətini istənilən zaman dəyişməyə imkan verir. Normal tətbiqlər tərəfindən istifadə olunmamalıdır."</string>
+ <string name="permlab_setKeyboardLayout" msgid="4778731703600909340">"klaviatura sxemini dəyişir"</string>
+ <string name="permdesc_setKeyboardLayout" msgid="8480016771134175879">"Tətbiqə klaviatura sxemini dəyişmək imkanı verir. Normal tətbiqlər tərəfindən tələb olunmur."</string>
+ <string name="permlab_signalPersistentProcesses" msgid="4539002991947376659">"tətbiqlərə Linux siqnalları göndərir"</string>
+ <string name="permdesc_signalPersistentProcesses" msgid="4896992079182649141">"Tətbiqə bütün davamlı proseslərə siqnal soğrusu göndərməyə imkan verir."</string>
+ <string name="permlab_persistentActivity" msgid="8841113627955563938">"təbiqi həmişə çalışdır"</string>
+ <string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Tətbiqə öz komponentlərini yaddaşda saxlama icazəsi verir. Bu planşetin sürətini zəiflətməklə, digər tətbiqlər üçün mövcud olan yaddaşı limitləyə bilər."</string>
+ <string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"Tətbiqə öz komponentlərini yaddaşda saxlama icazəsi verir. Bu digər tətbiqlər üçün mövcud olan yaddaşı limitləyə bilər."</string>
+ <string name="permlab_deletePackages" msgid="184385129537705938">"tətbiqləri sil"</string>
+ <string name="permdesc_deletePackages" msgid="7411480275167205081">"Tətbiqə Android paketləri silmə icazəsi verir. Zərərli tətbiqlər bundan digər vacib tətbiqləri silmək üçün istifadə edə bilər."</string>
+ <string name="permlab_clearAppUserData" msgid="274109191845842756">"digər tətbiqlərin məlumatını silir"</string>
+ <string name="permdesc_clearAppUserData" msgid="4625323684125459488">"Tətbiqə istifadəçi datasını təmizləməyə imkan verir."</string>
+ <string name="permlab_deleteCacheFiles" msgid="3128665571837408675">"digər tətbiqlərin keşini sil"</string>
+ <string name="permdesc_deleteCacheFiles" msgid="3812998599006730196">"Tətbiqə keş faylları silmə icazəsi verir."</string>
+ <string name="permlab_getPackageSize" msgid="7472921768357981986">"tətbiq saxlama yaddaşını ölçmək"</string>
+ <string name="permdesc_getPackageSize" msgid="3921068154420738296">"Tətbiqə özünün kodunu, məlumatını və keş ölçüsünü alma icazəsi verir."</string>
+ <string name="permlab_installPackages" msgid="2199128482820306924">"birbaşa tətbiqlər quraşdırmaq"</string>
+ <string name="permdesc_installPackages" msgid="5628530972548071284">"Tətbiqə yeni və ya güncəllənmiş Android paketlərini quraşdırmağa imkan verir. Zərərli tətbiqlər bundan istifadə edərək güclü səlahiyyətlərə malik tətbiqləri endirə bilər."</string>
+ <string name="permlab_clearAppCache" msgid="7487279391723526815">"bütün tətbiq keş datasını silir"</string>
+ <string name="permdesc_clearAppCache" product="tablet" msgid="8974640871945434565">"Tətbiqə planşetin yaddaşını boşaltmaq üçün digər tətbiqlərin keş fayllarını silmək imkanı verir. Bu da digər tətbiqlərin dataları yenidən əldə etmələri səbəbindən daha yavaş işləmələrinə səbəb ola bilər."</string>
+ <string name="permdesc_clearAppCache" product="default" msgid="2459441021956436779">"Tətbiqə digər tətbiqlərin keş qovluğunu təmizləyərək telefonun yaddaşını boşaltmaq icazəsi verir. Bu digər tətbiqlərin məlumatlarını yenidən əldə etməli olduqlarına görə daha yavaş başlamasına səbəb olur."</string>
+ <string name="permlab_movePackage" msgid="3289890271645921411">"tətbiq resurslarının yerini dəyişir"</string>
+ <string name="permdesc_movePackage" msgid="319562217778244524">"Tətbiqə tətbiq resurslarını daxili mediadan xarici mediaya və əksinə daşımağa imkan verir."</string>
+ <string name="permlab_readLogs" msgid="6615778543198967614">"məxfi loq datasını oxuyur"</string>
+ <string name="permdesc_readLogs" product="tablet" msgid="82061313293455151">"Tətbiqə sistemin müxtəlif jurnal fayllarını oxumağa imkan verir. Bu da Sizin planşetdə etdikləriniz haqqında məlumatlar, həmçinin şəxsi və konfidensial məlumatlar ola bilər."</string>
+ <string name="permdesc_readLogs" product="default" msgid="2063438140241560443">"Tətbiqə sistemin müxtəlif jurnal fayllarını oxumağa imkan verir. Bu da Sizin planşetdə etdikləriniz haqqında məlumatlar, həmçinin şəxsi və konfidensial məlumatlar ola bilər."</string>
+ <string name="permlab_anyCodecForPlayback" msgid="715805555823881818">"oxutmaq üçün istənilən media dekoderi istifadə edir"</string>
+ <string name="permdesc_anyCodecForPlayback" msgid="8283912488433189010">"Tətbiqə playback\'i deşifrə etmək üçün hər hansı bir quraşdırılmış media deşifrələyicisini istifadə etmık imkanı verir."</string>
+ <string name="permlab_manageCaCertificates" msgid="1678391896786882014">"etibarlı etimadnamələri idarə et"</string>
+ <string name="permdesc_manageCaCertificates" msgid="4015644047196937014">"Tətbiqə etibarlı etimadnamələr kimi CA sertifikatlarını quraşdırmaq və sistemdən silməyə icazə verir."</string>
+ <string name="permlab_diagnostic" msgid="8076743953908000342">"diaga məxsus olan mənbələri yaz/oxu"</string>
+ <string name="permdesc_diagnostic" msgid="6608295692002452283">"Tətbiqə diag qrupa məsus olan resursları yazmaq və oxumaq icazəsi verir; məsələn /dev qovluğundakı fayllar. Bu sistemin stabilliyinə və təhlükəsizliyinə təsir edə bilər. Bu ancaq istehsalçı və ya operator tərəfindən avadanlığa xas diaqnostika üçün olmalıdır."</string>
+ <string name="permlab_changeComponentState" msgid="6335576775711095931">"tətbiq komponentlərini aktivləşdirmə və ya deaktivləşdirmə"</string>
+ <string name="permdesc_changeComponentState" product="tablet" msgid="8887435740982237294">"Tətbiqə digər tətbiq komponentinin aktiv olub-olmadığını dəyişmək imkanı verir. Zərərli tətbiqlər bundan əhəmiyyətli planşet imkanlarını deaktiv etmək üçün istifadə edə bilər. Bu icazə ilə ehtiyatlı olmaq lazımdır, çünki tətbiq komponentləri yararsız, ziddiyyətli, və ya qeyri-sabit statusa çevrilə bilər."</string>
+ <string name="permdesc_changeComponentState" product="default" msgid="1827232484416505615">"Tətbiqə digər tətbiq komponentinin aktiv olub-olmadığını dəyişmək imkanı verir. Zərərli tətbiqlər bundan əhəmiyyətli telefon imkanlarını deaktiv etmək üçün istifadə edə bilər. Bu icazə ilə ehtiyatlı olmaq lazımdır, çünki tətbiq komponentləri yararsız, ziddiyyətli, və ya qeyri-sabit statusa çevrilə bilər."</string>
+ <string name="permlab_grantRevokePermissions" msgid="4627315351093508795">"icazələr vermək və ya ləğv etmək"</string>
+ <string name="permdesc_grantRevokePermissions" msgid="4088642654085850662">"Tətbiqə bu və ya digər tətbiqlərə xüsusi iznlər verməyə icazə verir. Zərərli tətbiqlər bundan izin vermədiyiniz özəllikləri özlərinə vermək üçün istifadə edə bilər."</string>
+ <string name="permlab_setPreferredApplications" msgid="8463181628695396391">"tərcih edilən tətbiqlər qur"</string>
+ <string name="permdesc_setPreferredApplications" msgid="4973986762241783712">"Tətbiqə tərcih etdiyiniz tətbiqləri dəyişmək imkanı verir. Zərərli tətbiqlər şəxsi məlumatlarınızı toplamaq üçün cari tətbiqlərinizi aldadaraq işləyən tətbiqləri xəbərsiz dəyişə bilər."</string>
+ <string name="permlab_writeSettings" msgid="2226195290955224730">"sistem ayarlarında dəyişiklik etmək"</string>
+ <string name="permdesc_writeSettings" msgid="7775723441558907181">"Tətbiqə sistem ayarları datasını redaktə etmə icazəsi verir. Zərərli tətbiqlər sistem ayarlarını korlaya bilər."</string>
+ <string name="permlab_writeSecureSettings" msgid="204676251876718288">"təhlükəsiz sistem nizamlarını dəyişir"</string>
+ <string name="permdesc_writeSecureSettings" msgid="8159535613020137391">"Tətbiqə sistemin təhlükəsiz ayarlar datasını dəyişməyə imkan verir. Normal tətbiqlər tərəfindən istifadə üçün deyil."</string>
+ <string name="permlab_writeGservices" msgid="2149426664226152185">"Google xidmətlər xəritəsini dəyişdir"</string>
+ <string name="permdesc_writeGservices" msgid="1287309437638380229">"Tətbiqə Google xidmətlər xəritəsini dəyişdirmək imkanı verir. Normal tətbiqlərin istifadəsi üçün deyil."</string>
+ <string name="permlab_receiveBootCompleted" msgid="5312965565987800025">"başlanğıcda işləyir"</string>
+ <string name="permdesc_receiveBootCompleted" product="tablet" msgid="7390304664116880704">"Tətbiqə sistem yükləməni bitirdiyi zaman dərhal özünü başlatmağa imkan verir. Bu planşeti başlatmağın uzun çəkməsinə səbəb ola bilər və tətbiqə həmişə çalışdıraraq bütün planşeti yavaşlatmağa imkan verir."</string>
+ <string name="permdesc_receiveBootCompleted" product="default" msgid="513950589102617504">"Tətbiqə sistem bootinqi bitirdikdən dərhal sonra özünü başlatmaq icazəsi verir. Bu telefonun açılmasını ləngidə və daima işlək qalaraq telefonun sürətini aşağı sala bilər."</string>
+ <string name="permlab_broadcastSticky" msgid="7919126372606881614">"daimi siqnal göndərmək"</string>
+ <string name="permdesc_broadcastSticky" product="tablet" msgid="7749760494399915651">"Tətbiqə yayım bitdikdən sonra da qalan çətin yayımlar göndərməyə imkan verir. Hədsiz istifadə çox yaddaş istifadəsinə səbəb olmaqla planşeti yavaş və qeyri-stabil edə bilər."</string>
+ <string name="permdesc_broadcastSticky" product="default" msgid="2825803764232445091">"Tətbiqə yayım bitdikdən sonra da qalan çətin yayımlar göndərməyə imkan verir. Hədsiz istifadə çox yaddaş istifadəsinə səbəb olmaqla telefonu yavaş və qeyri-stabil edə bilər."</string>
+ <string name="permlab_readContacts" msgid="8348481131899886131">"kontakrlatınızı oxumaq"</string>
+ <string name="permdesc_readContacts" product="tablet" msgid="5294866856941149639">"Tətbiqə planşetinizdə yerləşən kontaktları oxumaq icazəsi verir, tez-tez zəng elədiyiniz, emailləşdiyiniz və ya əlaqə saxladığınız xüsusi individuallar daxil olmaqla. Bu icazə tətbiqlərə kontakt məlumatlarınızı saxlamağa və zərərli tətbiqlərə kontakt məlumatlarını sizin bilginiz olmada paylaşma imkanı yaradır."</string>
+ <string name="permdesc_readContacts" product="default" msgid="8440654152457300662">"Tətbiqə tez-tez zəng elədiyiniz, e-məktub göndərdiyiniz və ya əlaqə saxladığınız xüsusi individuallar daxil olmaqla telefonunuzda yerləşən kontaktları oxumaq icazəsi verir. Bu icazə tətbiqlərə kontakt məlumatlarınızı saxlamağa və zərərli tətbiqlərə kontakt məlumatlarını sizin xəbəriniz olmada paylaşma imkanı yaradır."</string>
+ <string name="permlab_writeContacts" msgid="5107492086416793544">"kontaktlarınızı dəyişdirir"</string>
+ <string name="permdesc_writeContacts" product="tablet" msgid="897243932521953602">"Tətbiqə planşetinizdəki zəng etmək tezliyiniz, elektron poçtlarınız, ünsiyyətləriniz haqqında məlumatları dəyişməyə imkan verir. Bu icazə kontakt məlumatlarının silinməsinə də imkan verir."</string>
+ <string name="permdesc_writeContacts" product="default" msgid="589869224625163558">"Tətbiqə Sizin zəng etmək tezliyiniz, elektron poçtlarınız, ünsiyyətləriniz haqqında məlumatları dəyişməyə imkan verir. Buna kontaktların silinməsi imkanı də daxildir."</string>
+ <string name="permlab_readCallLog" msgid="3478133184624102739">"zəng qeydiyyatını oxu"</string>
+ <string name="permdesc_readCallLog" product="tablet" msgid="3700645184870760285">"Tətbiqə gələn və gedən zənglər haqqında olan data daxil olmaqla bərabər planşetinizin zəng qeydiyyatını oxumağa imkan verir. Bu icazə tətbiqlərə zəng qeydiyyatınızı saxlamağa imkan verir və zərərli tətbiqlər zəng qeydiyyat datasını sizdən xəbərsiz paylaşa bilər."</string>
+ <string name="permdesc_readCallLog" product="default" msgid="5777725796813217244">"Tətbiqə telefon jurnalınızı oxumağa imkan verir, buna gələn və gedən zənglər haqqında məlumatlar da daxildir. Bu icazə tətbiqə zəng jurnalı datasını saxlamağa imkan verir ki, Zərərli tətbiqlər bundan istifadə edərək Sizdən xəbərsiz bütün məlumatlarnızı paylaşa bilər."</string>
+ <string name="permlab_writeCallLog" msgid="8552045664743499354">"zəng loqu yazır"</string>
+ <string name="permdesc_writeCallLog" product="tablet" msgid="6661806062274119245">"Tətbiqə planşetinizdəki zəng jurnalını, həmçinin gedən və gələn zənglərin siyahısını dəyişməyə imkan verir. Zərərli tətbiqlər bundan istifadə edərək, zəng jurnalınıza dəyişiklik edə bilər."</string>
+ <string name="permdesc_writeCallLog" product="default" msgid="683941736352787842">"Tətbiqə sizin daxil olan və gedən zənglər daxil olmaqla telefon zəngi loqlarınızı redaktə etmək icazəsi verir. Zərərli tətbiqlər bundan telefon loqlarınızı silmək və ya redaktə etmək üçün istifadə edə bilər."</string>
+ <string name="permlab_readProfile" msgid="4701889852612716678">"öz kontakt kartınızı oxuyun"</string>
+ <string name="permdesc_readProfile" product="default" msgid="5462475151849888848">"Tətbiqə cihazınızda yerləşən adınız və kontakt məlumatlarınız kimi şəxsi profil məlumatlarını oxuma icazəsi verir. Bu o deməkdir ki, tətbiq sizi tanıya və sizin profil məlumatlarınızı başqalarına göndərə bilər."</string>
+ <string name="permlab_writeProfile" msgid="907793628777397643">"sizin kontakt kartınızda dəyişiklik etmək"</string>
+ <string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"Tətbiqə cihazınızda yerləşən adınız və kontakt məlumatlarınız kimi şəxsi profil məlumatlarını dəyişmək və ya əlavə etmək icazəsi verir. Bu o deməkdir ki, tətbiq sizi tanıya və sizin profil məlumatlarınızı başqalarına göndərə bilər."</string>
+ <string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"sosial lentinizi oxuyur"</string>
+ <string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"Tətbiqə Sizin və dostlarınızın sosial güncəllərini əldə etmək və sinxronizə etmək icazəsi verir. Məlumat paylaşarkən diqqətli olun - konfidensiallıqdan asılı olmayaraq bu, Siz və dostlarınız arasında sosial şəbəkələrdəki danışığı oxumaq imkanı verir. Qeyd: bu icazə bütün sosial şəbəkələrdə icra edilə bilməz."</string>
+ <string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"sosial axınınıza yazır"</string>
+ <string name="permdesc_writeSocialStream" product="default" msgid="3086557552204114849">"Tətbiqə dostlarınızdan sosial yenilənmələri göstərmə icazəsi verir. Məlumat paylaşarkən diqqətli olun - bu dostlarınızdan gələn mesajı emal etməyə izn verir. Qeyd: bu icazə bütün sosial şəbəkələrə şamil olunmaya bilər."</string>
+ <string name="permlab_readCalendar" msgid="5972727560257612398">"təqvim tədbirlərini və konfidensial məlumatları oxuyur"</string>
+ <string name="permdesc_readCalendar" product="tablet" msgid="4216462049057658723">"Tətbiqə dostlarınızın və əməkdaşlarınızın planşetinizdə yerləşən kalendar tədbirlərini oxumağa icazə verir. Bu tətbiqə konfidensiallıq və ya həssaslıqdan asılı olmayaraq sizin kalendar məlumatlarınızı paylaşmaq və ya saxlamağa imkan yaradır."</string>
+ <string name="permdesc_readCalendar" product="default" msgid="7434548682470851583">"Tətbiqə dost və əməkdaşlara məxsus olanlar daxil olmaqla planşetdə yerləşən bütün kalendar tətbiqlərini oxumaq icazəsi verir. Bu tətbiqə konfidensiallıq və ya həssaslıqdan asılı olmayaraq, Sizin kalendar məlumatlarınızı paylaşmaq və ya saxlamaq imkanı yaradır."</string>
+ <string name="permlab_writeCalendar" msgid="8438874755193825647">"cihaz sahibinin icazəsi olmadan təqvim tədbirləri əlavə etmək və ya dəyişmək, bunun haqqında bildirişlər göndərmək"</string>
+ <string name="permdesc_writeCalendar" product="tablet" msgid="6679035520113668528">"Tətbiqə planşetinizdəki tədbirləri dəyişməyə, tədbir əlavə etməyə və ya silməyə imkan verir. Buna Sizin dostlarınızla və həmkarlarınızla birlikdə hazırladığınız tədbirlər də daxildir. Bu, tədbirə Sizin adınızdan və Sizdən xəbərsiz, təqvim sahibi kimi mesaj göndərmək imkanını verir."</string>
+ <string name="permdesc_writeCalendar" product="default" msgid="2324469496327249376">"Dostlarınız və həmkarlarınıza məxsus olanlar da daxil olmaqla, tətbiqə telefonunuzdakı tədbirləri dəyişməyə, tədbir əlavə etməyə və ya silməyə imkan verir. Bu, tədbirə Sizin adınızdan və Sizdən xəbərsiz, təqvim sahibi kimi mesaj göndərmək imkanı verir."</string>
+ <string name="permlab_accessMockLocation" msgid="8688334974036823330">"test üçün saxta məkan mənbələri"</string>
+ <string name="permdesc_accessMockLocation" msgid="5808711039482051824">"Test üçün saxta məkan mənbələri yaradın və ya yeni məkan provayderi quraşdırın. Bu tətbiqlərə GPS və məkan provayderləri kimi məkan mənbələrindən alınan məkan və/ya statusları yenidən yazmağa icazə verir."</string>
+ <string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"əlavə məkan provayderi əmrlərinə çıxış"</string>
+ <string name="permdesc_accessLocationExtraCommands" msgid="5945166642335800763">"Tətbiqə əlavə məkan provayderi əmrlərinə daxil olmaq imkanı verir. Bu tətbiqə GPS əməliyyatına və ya digər məkan mənbələrinə mane olmaq imkanı verə bilər."</string>
+ <string name="permlab_installLocationProvider" msgid="6578101199825193873">"Məkan provayderini quraşdırmaq icazəsi"</string>
+ <string name="permdesc_installLocationProvider" msgid="9066146120470591509">"Yeni yerləşmə təchizatçısını test etmək və ya quraşdırmaq üçün mock yerləşmə mənbələri yarat. Bu tətbiqə yerləşmənin və/ya digər yerləşmə mənbələrindən GPS və ya yerləşmə təchizatçıları qayıtmış statusların ləğv etməsinə imkan verir."</string>
+ <string name="permlab_accessFineLocation" msgid="1191898061965273372">"dəqiq yeri (GPS və şəbəkə-əsaslı)"</string>
+ <string name="permdesc_accessFineLocation" msgid="5295047563564981250">"Qlobal Pozisiya Sistemini və ya şəbəkə qüllələri və Wi-Fi kimi şəbəkə məkanını istifadə edərək tətbiqə Sizin dəqiq yerinizi təyin etməyə imkan verir. Bu məkan xidmətləri aktivləşdirilməlidirlər ki, Siz tətbiqi istifadə edən zaman tətbiq onları istifadə edə bilsin. Tətbiqlər Sizin harada olmağınızı bunun vasitəsilə təyin edəcək, eyni zamanda, bu xidmət əlavə batareya enerjisi apara bilər."</string>
+ <string name="permlab_accessCoarseLocation" msgid="4887895362354239628">"təxmini məkan (şəbəkə əsaslı)"</string>
+ <string name="permdesc_accessCoarseLocation" msgid="2538200184373302295">"Tətbiqə təxmini yerinizi almaq üçün imkan verir. Bu yer, yerləşmə xidmətləri tərəfindən mobil qüllələr və Wi-Fi kimi şəbəkə yerləşmə mənbələrdən istifadə etməklə əldə edilir. Bu yerləşmə xidmətləri tətbiqin onlardan istifadəsi üçün açıq və cihazınızın onları istifadəsi üçün mövcud olmalıdır. Tətbiqlər bundan sizin təxminən harada olduğunuzu müəyyənləşdirmək üçün istifadə edə bilər."</string>
+ <string name="permlab_accessSurfaceFlinger" msgid="2363969641792388947">"SurfaceFlinger\'É™ daxil olmaq"</string>
+ <string name="permdesc_accessSurfaceFlinger" msgid="1041619516733293551">"Tətbiqə aşağı səviyyəli SurfaceFnger özəlliklərini istifadə etməyə icazə verir."</string>
+ <string name="permlab_readFrameBuffer" msgid="6690504248178498136">"freym buferi oxuyur"</string>
+ <string name="permdesc_readFrameBuffer" msgid="4937405521809454680">"Tətbiqə freym buferinin kontentini oxumaq icazəsi verir."</string>
+ <string name="permlab_accessInputFlinger" msgid="5348635270689553857">"InputFlinger keçidi"</string>
+ <string name="permdesc_accessInputFlinger" msgid="2104864941201226616">"Tətbiqə aşağı səviyyəli InputFlinger funksiyalarını istifadə etməyə icazə verir."</string>
+ <string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"Wifi görüntülərini quraşdır"</string>
+ <string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"Tətbiqə Wifi görüntülərini quraşdırmağa və onlara qoşulmağa imkan verir."</string>
+ <string name="permlab_controlWifiDisplay" msgid="393641276723695496">"WiFi görüntülərini dəyişir"</string>
+ <string name="permdesc_controlWifiDisplay" msgid="4543912292681826986">"Tətbiqə Wifi displeylərinin aşağı səviyyəli funksiyalarını idarə etmək imkanı verir."</string>
+ <string name="permlab_captureAudioOutput" msgid="6857134498402346708">"audio çıxışı alın"</string>
+ <string name="permdesc_captureAudioOutput" msgid="6210597754212208853">"Tətbiqə audio çıxışı almaq və yenidən yönləndirmək imkanı verir."</string>
+ <string name="permlab_captureVideoOutput" msgid="2246828773589094023">"video çıxışı alın"</string>
+ <string name="permdesc_captureVideoOutput" msgid="359481658034149860">"Tətbiqə video çıxışı almaq və yenidən yönləndirmək imkanı verir."</string>
+ <string name="permlab_captureSecureVideoOutput" msgid="7815398969303382016">"təhlükəsiz video çıxışı alın"</string>
+ <string name="permdesc_captureSecureVideoOutput" msgid="2779793064709350289">"Tətbiqə güvənli video çıxışı almaq və yenidən yönləndirmək imkanı verir."</string>
+ <string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"audio ayarlarınızı dəyişir"</string>
+ <string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"Tətbiqə səs və hansı spikerin çıxış üçün istifadə olunduğu kimi qlobal səs ayarlarını dəyişdirməyə imkan verir."</string>
+ <string name="permlab_recordAudio" msgid="3876049771427466323">"səs yaz"</string>
+ <string name="permdesc_recordAudio" msgid="4906839301087980680">"Tətbiqə mikrofonla audio yazmaq icazəsi verir. İcazə tətbiqə sizin təsdiqiniz olmadan istənilən zaman səs yazma izni verir."</string>
+ <string name="permlab_camera" msgid="3616391919559751192">"şəkil və video çəkmək"</string>
+ <string name="permdesc_camera" msgid="8497216524735535009">"Tətbiqə kamera ilə şəkil və video çəkməyə imkan yaradır. Bu icazə tətbiqə sizin təsdiqiniz olmadan kameradan istifadə icazəsi verir."</string>
+ <string name="permlab_cameraDisableTransmitLed" msgid="2651072630501126222">"kamera istifadə edildikdə LED göstərici ötürülməsini deaktiv edir"</string>
+ <string name="permdesc_cameraDisableTransmitLed" msgid="4764585465480295341">"Öncədən quraşdırılmış sistem tətbiqinə kamera tərəfindən istifadə edilən LED indikatorunu söndürmək icazəsi verir."</string>
+ <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"planşeti daimi olaraq aradan qaldır"</string>
+ <string name="permlab_brick" product="default" msgid="8337817093326370537">"telefonu həmişəlik deaktiv etmək"</string>
+ <string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Tətbiqə planşeti birdəfəlik deaktiv etməyə imkan verir. Bu da çox təhlükəlidir."</string>
+ <string name="permdesc_brick" product="default" msgid="5788903297627283099">"Tətbiqə bütün telefonu birdəfəlik deaktivləşdirməyə imkan verir. Bu çox təhlükəlidir."</string>
+ <string name="permlab_reboot" product="tablet" msgid="3436634972561795002">"planşeti yenidən yüklənməyə məcbur edir"</string>
+ <string name="permlab_reboot" product="default" msgid="2898560872462638242">"telefonu yenidən yüklənməyə məcbur edir"</string>
+ <string name="permdesc_reboot" product="tablet" msgid="8172056180063700741">"Tətbiqə planşeti yenidən yükləməyə məcbur etmək imkanı verir."</string>
+ <string name="permdesc_reboot" product="default" msgid="5326008124289989969">"Tətbiqə telefonu yenidən yükləməyə məcbur etmək üçün imkan verir."</string>
+ <string name="permlab_mount_unmount_filesystems" product="nosdcard" msgid="2927361537942591841">"USB yaddaÅŸ fayl sisteminÉ™ daxil olmaq"</string>
+ <string name="permlab_mount_unmount_filesystems" product="default" msgid="4402305049890953810">"SD Kart fayl sisteminÉ™ daxil olmaq"</string>
+ <string name="permdesc_mount_unmount_filesystems" msgid="1829290701658992347">"Tətbiqə silinəbilən yaddaşları və ya fayl sistemini quraşdırma və ayırma icazəsi verir."</string>
+ <string name="permlab_mount_format_filesystems" product="nosdcard" msgid="6227819582624904972">"USB yaddaşı silir"</string>
+ <string name="permlab_mount_format_filesystems" product="default" msgid="262582698639274056">"SD kartı silir"</string>
+ <string name="permdesc_mount_format_filesystems" msgid="8784268246779198627">"Tətbiqə çıxarıla bilən yaddaşı format etməyə imkan verir."</string>
+ <string name="permlab_asec_access" msgid="3411338632002193846">"daxili yaddaşınız haqqında məlumat əldə etmək"</string>
+ <string name="permdesc_asec_access" msgid="3094563844593878548">"Tətbiqə daxili yaddaş haqqında məlumat almağa imkan verir."</string>
+ <string name="permlab_asec_create" msgid="6414757234789336327">"daxili yaddaÅŸ yaratmaq"</string>
+ <string name="permdesc_asec_create" msgid="4558869273585856876">"Tətbiqə daxili yaddaş yaratmaq üçün imkan verir."</string>
+ <string name="permlab_asec_destroy" msgid="526928328301618022">"daxili yaddaşı məhv etmə"</string>
+ <string name="permdesc_asec_destroy" msgid="7218749286145526537">"Tətbiqə daxili yaddaşı məhv etmə icazəsi verir."</string>
+ <string name="permlab_asec_mount_unmount" msgid="8877998101944999386">"daxili yaddaşı montaj və ya demontaj etmək"</string>
+ <string name="permdesc_asec_mount_unmount" msgid="3451360114902490929">"Tətbiqə daxili yaddaşı quraşdırma/ayırma icazəsi verir."</string>
+ <string name="permlab_asec_rename" msgid="7496633954080472417">"daxili yaddaşın adını dəyiş"</string>
+ <string name="permdesc_asec_rename" msgid="1794757588472127675">"Tətbiqə daxili yaddaşın adını dəyişmək imkanı verir."</string>
+ <string name="permlab_vibrate" msgid="7696427026057705834">"vibrasiyaya nəzarət edir"</string>
+ <string name="permdesc_vibrate" msgid="6284989245902300945">"Tətbiqə vibratoru idarə etmə icazəsi verir."</string>
+ <string name="permlab_flashlight" msgid="2155920810121984215">"Flash işığını idarə edir"</string>
+ <string name="permdesc_flashlight" msgid="6522284794568368310">"Tətbiqə siqnal işığı na nəzarət etməyə imkan verir."</string>
+ <string name="permlab_manageUsb" msgid="1113453430645402723">"USB cihazlar üçün tərcihləri və icazələri idarə etmək"</string>
+ <string name="permdesc_manageUsb" msgid="7776155430218239833">"Tətbiqə USB cihazlar üçün olan tərcihləri və icazələri idarə etməyə imkan verir."</string>
+ <string name="permlab_accessMtp" msgid="4953468676795917042">"MTP protokol həyata keçirmək"</string>
+ <string name="permdesc_accessMtp" msgid="6532961200486791570">"Kernel MTP drayverə girişə imkan verir ki, MTP USB protokolunu həyata keçirsin."</string>
+ <string name="permlab_hardware_test" msgid="4148290860400659146">"avadanlığı sınaq edir"</string>
+ <string name="permdesc_hardware_test" msgid="6597964191208016605">"Tətbiqə avadanlığı yoxlamaq üçün müxtəlif periferiyaları kontrol etməyə imkan verir."</string>
+ <string name="permlab_callPhone" msgid="3925836347681847954">"telefon nömrələrinə birbaşa zəng edir"</string>
+ <string name="permdesc_callPhone" msgid="3740797576113760827">"Tətbiqə Sizin müdaxiləniz olmadan telefon zəngləri etməyə imkan verir. Zərərli tətbiqlər Sizdən xəbərsiz şəkildə müxtəlif zənglər edərək, Sizə maddi ziyan vura bilər. Qeyd: Bu, tətbiqlərə təcili nömrələrə zəng etməyə icazə vermir."</string>
+ <string name="permlab_callPrivileged" msgid="4198349211108497879">"istənilən nömrəyə birbaşa zəng edir"</string>
+ <string name="permdesc_callPrivileged" msgid="1689024901509996810">"Tətbiqə Sizin müdaxiləniz olmadan, təcili zənglər də daxil olmaqla, istənilən telefon zəngini etməyə imkan verir. Zərərli tətbiqlər bundan istifadə edərək, təcili nömrələrə qanunsuz zəng vurmaqla Sizin üçün hüquqi problemlər yarada bilər."</string>
+ <string name="permlab_performCdmaProvisioning" product="tablet" msgid="4842576994144604821">"CDMA planşet ayarlarına birbaşa başlamaq"</string>
+ <string name="permlab_performCdmaProvisioning" product="default" msgid="5604848095315421425">"CDMA telefon quraşdırmalarına birbaşa başlamaq"</string>
+ <string name="permdesc_performCdmaProvisioning" msgid="1994193538802314186">"Tətbiqə CDMA hazırlığını başlatma icazəsi verir. Zərərli tətbiqlər ehtiyac olmadıqda CDMA hazırlığını başlada bilərlər."</string>
+ <string name="permlab_locationUpdates" msgid="7785408253364335740">"məkan güncəlləmə bildirişlərini idarə edir"</string>
+ <string name="permdesc_locationUpdates" msgid="1120741557891438876">"Tətbiqə radiodan gələn məkan güncəllənmələrini aktiv və ya deaktiv etməyə imkan verir. Normal tətbiqlər tərəfindən istifadə olunmur."</string>
+ <string name="permlab_checkinProperties" msgid="7855259461268734914">"qeydiyyat xüsusiyyətlərini əldə edir"</string>
+ <string name="permdesc_checkinProperties" msgid="4024526968630194128">"Tətbiqə giriş qeydi servisi tərəfindən yüklənmiş mülkiyyətə girişi oxumaq/yazmaq imkanl verir. Normal tətbiqlər üçün nəzərdə tutulmayıb."</string>
+ <string name="permlab_bindGadget" msgid="776905339015863471">"vidcetlər seç"</string>
+ <string name="permdesc_bindGadget" msgid="8261326938599049290">"Tətbiqə sistemə hansı vidcetin hansı tətbiq tərəfindən istifadə edilə bilməsini deməyə icazə verir. Bu icazəli tətbiqlər şəxsi məlumatlara və digər tətbiqlərə çıxış verə bilər. Normal tətbiqlər tərəfindən istifadə üçün deyil."</string>
+ <string name="permlab_modifyPhoneState" msgid="8423923777659292228">"telefon statusunu dəyişmək"</string>
+ <string name="permdesc_modifyPhoneState" msgid="1029877529007686732">"Tətbiqə cihazın telefon funksiyalarını idarə etmək imkanı verir. Belə icazəli tətbiq Sizi xəbərdar etmədən şəbəkələri qoşa, telefon radiosunu yandırıb-söndürə bilər."</string>
+ <string name="permlab_readPhoneState" msgid="9178228524507610486">"telefon statusunu və identifikasiyanı oxuyur"</string>
+ <string name="permdesc_readPhoneState" msgid="1639212771826125528">"Tətbiqə cihazın telefon funksiyalarına giriş icazəsi verir. Belə icazəli tətbiq bu telefonun nömrəsini və cihaz İD\'ni, zəngin aktiv olub-olmadığını və zəng edilən nömrəni müəyyən edə bilər."</string>
+ <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"planşetin yuxu rejiminin qarşısını almaq"</string>
+ <string name="permlab_wakeLock" product="default" msgid="573480187941496130">"telefonun yuxu rejiminə keçməsini əngəllə"</string>
+ <string name="permdesc_wakeLock" product="tablet" msgid="7311319824400447868">"Tətbiqə planşetin yuxu rejimini qadağan etməyə imkan verir."</string>
+ <string name="permdesc_wakeLock" product="default" msgid="8559100677372928754">"Tətbiqə telefonun yuxu rejimini qadağan etmək imkanı verir."</string>
+ <string name="permlab_devicePower" product="tablet" msgid="2787034722616350417">"planşeti yandırma və ya söndürmə"</string>
+ <string name="permlab_devicePower" product="default" msgid="4928622470980943206">"telefonu yandırmaq və ya söndürmək"</string>
+ <string name="permdesc_devicePower" product="tablet" msgid="6689862878984631831">"Tətbiqə planşeti yandırmağa və söndürməyə imkan verir."</string>
+ <string name="permdesc_devicePower" product="default" msgid="6037057348463131032">"Tətbiqə telefonu yandırıb söndürmə icazəsi verir."</string>
+ <string name="permlab_factoryTest" msgid="3715225492696416187">"zavod test rejimində işləyir"</string>
+ <string name="permdesc_factoryTest" product="tablet" msgid="3952059318359653091">"Planşet avadanlığına tam girişə imkan verməklə aşağı səviyyəli istehsalçı sınağı kimi işləyir. Yalnız planşet istehsalçı sınaq rejimində olduqda işləyir."</string>
+ <string name="permdesc_factoryTest" product="default" msgid="8136644990319244802">"Bir aşağı səviyyəli istehsalçı testi kimi çalışdırın, telefon hardware üçün tam giriş imkanı verir. Ancaq telefon, istehsalçı test rejimində çalışdığı zaman aktivdir."</string>
+ <string name="permlab_setWallpaper" msgid="6627192333373465143">"divar kağızı yerləşdirir"</string>
+ <string name="permdesc_setWallpaper" msgid="7373447920977624745">"Tətbiqə sistemə divar kağızı yerləşdirmək icazəsi verir."</string>
+ <string name="permlab_setWallpaperHints" msgid="3278608165977736538">"divar kağızı ölçüsünü verir"</string>
+ <string name="permdesc_setWallpaperHints" msgid="8235784384223730091">"Tətbiqə sistem divar kağızı ölçüsü göstərişlərini müəyyən etməyə imkan verir."</string>
+ <string name="permlab_masterClear" msgid="2315750423139697397">"fabrik defoltuna sıfırlamaq"</string>
+ <string name="permdesc_masterClear" msgid="3665380492633910226">"Tətbiqə bütün məlumatları, nizamları və quraşdırılmış tətbiqləri silərək sistemi fabrik nizamlarına qaytarmaq imkanı verir."</string>
+ <string name="permlab_setTime" msgid="2021614829591775646">"vaxtı təyin edir"</string>
+ <string name="permdesc_setTime" product="tablet" msgid="1896341438151152881">"Tətbiqə planşetin saat vaxtını dəyişməyə imkan verir."</string>
+ <string name="permdesc_setTime" product="default" msgid="1855702730738020">"Tətbiqə telefonun saat vaxtını dəyişməyə imkan verir."</string>
+ <string name="permlab_setTimeZone" msgid="2945079801013077340">"vaxt zonasını quraşdırır"</string>
+ <string name="permdesc_setTimeZone" product="tablet" msgid="1676983712315827645">"Tətbiqə planşetin vaxt zonasını dəyişmə icazəsi verir."</string>
+ <string name="permdesc_setTimeZone" product="default" msgid="4499943488436633398">"Tətbiqə telefon saat zolağını dəyişmək üçün imkan verir."</string>
+ <string name="permlab_accountManagerService" msgid="4829262349691386986">"AccountManagerService kimi davranır"</string>
+ <string name="permdesc_accountManagerService" msgid="1948455552333615954">"Tətbiqə AccountAuthenticators\'ə zəng etməyə imkan verir."</string>
+ <string name="permlab_getAccounts" msgid="1086795467760122114">"cihazda hesabları tapır"</string>
+ <string name="permdesc_getAccounts" product="tablet" msgid="2741496534769660027">"Tətbiqə planşet tərəfindən bilinən hesabların siyahısını alma icazəsi verir. Bu quraşdırdığınız tətbiqlər tərəfindən yaradılmış istənilən hesab ola bilər."</string>
+ <string name="permdesc_getAccounts" product="default" msgid="3448316822451807382">"Tətbiqə telefonda olan hesabların siyahısını əldə etməyə imkan verir. Buna quraşdırdığınız istənilən tətbiq tərəfindən yaradılan hesablar da aiddir."</string>
+ <string name="permlab_authenticateAccounts" msgid="5265908481172736933">"hesablar yaradır və parollar təyin edir"</string>
+ <string name="permdesc_authenticateAccounts" msgid="5472124296908977260">"Tətbiqə AccountManager\'in hesab yaratmaq və parol almaq və açmaq daxil olmaqla bərabər, hesab təsdiqləyici imkanlarını istifadə etməyə icazə verir."</string>
+ <string name="permlab_manageAccounts" msgid="4983126304757177305">"hesabları əlavə edir və ya silir"</string>
+ <string name="permdesc_manageAccounts" msgid="8698295625488292506">"Tətbiqə hesabların əlavə olunması və ya silinməsi, həmçinin onların parollarının silinməsi kimi əməliyyatları icra etməyə imkan verir."</string>
+ <string name="permlab_useCredentials" msgid="235481396163877642">"cihazda hesablar istifadə etmək"</string>
+ <string name="permdesc_useCredentials" msgid="7984227147403346422">"Tətbiqə autentifikasiya tokenləri sorğularını göndərməyə icazə verir."</string>
+ <string name="permlab_accessNetworkState" msgid="4951027964348974773">"şəbəkə bağlantılarına baxmaq"</string>
+ <string name="permdesc_accessNetworkState" msgid="8318964424675960975">"Tətbiqə mövcud olan və qoşulan şəbəkələr kimi qoşulmalar haqqında məlumatı görməyə icazə verir."</string>
+ <string name="permlab_createNetworkSockets" msgid="8018758136404323658">"tam şəbəkə girişi"</string>
+ <string name="permdesc_createNetworkSockets" msgid="3403062187779724185">"Tətbiqə şəbəkə soketlərini yaratmağa və fərdi şəbəkə protokollarını istifadə etməyə imkan verir. Brauzer və digər tətbiqlər datanın internetə ötürülməsini təmin edən vəsaitlər verir, ona görə də datanın internetə gönrədilməsi üçün bu icazə tələb olunmur."</string>
+ <string name="permlab_writeApnSettings" msgid="505660159675751896">"şəbəkə nizamlarını və trafiki dəyişdirir/qarşısını alır"</string>
+ <string name="permdesc_writeApnSettings" msgid="5333798886412714193">"Tətbiqə şəbəkə trafikinin qarşısını almaq üçün şəbəkə nizamlarını dəyişmə icazəsi verir, məsələn proksini və ya istənilən APN-in portunu. Zərərli tətbiqlər şəbəkə paketlərini sizin bilginiz olmadan monitorinq edə, yönləndirə və ya redaktə edə bilər."</string>
+ <string name="permlab_changeNetworkState" msgid="958884291454327309">"şəbəkə bağlantısını dəyişir"</string>
+ <string name="permdesc_changeNetworkState" msgid="6789123912476416214">"Tətbiqə şəbəkə vəziyyətini dəyişməyə icazə verir."</string>
+ <string name="permlab_changeTetherState" msgid="5952584964373017960">"Sərhədli bağlantını dəyişir"</string>
+ <string name="permdesc_changeTetherState" msgid="1524441344412319780">"Tətbiqə birləşilmiş şəbəkə bağlantısının statusunu dəyişməyə imkan verir."</string>
+ <string name="permlab_changeBackgroundDataSetting" msgid="1400666012671648741">"arxafon data istifadəsi ayarını dəyişir"</string>
+ <string name="permdesc_changeBackgroundDataSetting" msgid="5347729578468744379">"Tətbiqə fon rejimi nizamlarını dəyişməyə icazə verir."</string>
+ <string name="permlab_accessWifiState" msgid="5202012949247040011">"Wi-Fi bağlantılarına baxmaq"</string>
+ <string name="permdesc_accessWifiState" msgid="5002798077387803726">"Tətbiqə Wi-Fi şəbəkələri haqqında məlumatı görməyə icazə verir, məsələn, Wi-Fi mövcudluğu və qoşulmuş Wi-Fi cihazlarının adları."</string>
+ <string name="permlab_changeWifiState" msgid="6550641188749128035">"Wi-Fi şəbəkəsinə qoşulmaq və ya ayrılmaq"</string>
+ <string name="permdesc_changeWifiState" msgid="7137950297386127533">"Tətbiqə Wi-Fi çıxış nöqtəsinə qoşulmaq və ondan ayrılmaq və cihazın Wi-Fi şəbəkə nizamlarını dəyişməyə icazə verir."</string>
+ <string name="permlab_changeWifiMulticastState" msgid="1368253871483254784">"Wi-Fi Multicast qəbuluna icazə ver"</string>
+ <string name="permdesc_changeWifiMulticastState" product="tablet" msgid="7969774021256336548">"Tətbiqə Wi-Fi şəbəkədə sizin planşetdən başqa digər multikast adreslərə yönləndirilmiş paketləri almaq icazəsi verir. Bu qeyri-çoxadresli rejimdən fəqli olaraq daha çox enerji işlədir."</string>
+ <string name="permdesc_changeWifiMulticastState" product="default" msgid="6851949706025349926">"Tətbiqə qrup ünvanlar istifadə etməklə, Wi-Fi şəbəkəsində olan bütün cihazlara göndərilmiş paketləri qəbul etməyə imkan verir. Buna daha çox enerji sərf olunur."</string>
+ <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"Bluetooth ayarlarını əldə edir"</string>
+ <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Tətbiqə yerli Bluetooth planşetinin konfiqurasiyasını görməyə və məsafədən cihazları tapmağa və cütləməyə imkan verir."</string>
+ <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Tətbiqə lokal Bluetooth telefonunu konfiqurə etməyə və uzaq cihazları kəşf etmək və onlara qoşulmaq icazəsi verir."</string>
+ <string name="permlab_accessWimaxState" msgid="4195907010610205703">"WiMAX\'a qoşul və bağlantını kəs"</string>
+ <string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Tətbiqə WiMAX mövcudluğu və qoşulmuş WiMAX şəbəkələrini təyin etməyə icazə verir."</string>
+ <string name="permlab_changeWimaxState" msgid="2405042267131496579">"WiMAX vəziyyətini dəyişir"</string>
+ <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"Tətbiqə planşeti WiMAX şəbəkələrinə qoşmaq və onlardan ayırmaq icazəsi verir."</string>
+ <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"Tətbiqə telefonu WiMAX şəbəkəsinə qoşmağa və ya WiMAX şəbəkəsindən ayırmağa imkan verir."</string>
+ <string name="permlab_bluetooth" msgid="6127769336339276828">"Bluetooth cihazları ilə cütləndirmək"</string>
+ <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"Tətbiqə yerli Bluetooth planşetinin konfiqurasiyasını görməyə və cütlənmiş cihazlarla bağlantılar etməyə və qəbul etməyə imkan verir."</string>
+ <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"Tətbiqə Bluetooth və ya telefon konfiqurasiyalarını görməyə və qoşulmuş cihazlarla əlaqə qurmağa və qəbul etməyə icazə verir."</string>
+ <string name="permlab_nfc" msgid="4423351274757876953">"Near Field Communication\'ı kontrol et"</string>
+ <string name="permdesc_nfc" msgid="7120611819401789907">"Tətbiqə Yaxın Məsafə Kommunikasiyası (NFC) teqləri, kartları və oxuyucuları ilə əlaqə qurmağa icazə verir."</string>
+ <string name="permlab_disableKeyguard" msgid="3598496301486439258">"Ekran kilidini deaktiv edir"</string>
+ <string name="permdesc_disableKeyguard" msgid="6034203065077122992">"Tətbiqə kilid açarını və təhlükəsizlik parolunu deaktiv etməyə imkan verir. Qanuni misal budur ki, telefon zəng qəbul edən zaman kilidi açır və zəng qurtarandan sonra kilidi bağlayır."</string>
+ <string name="permlab_readSyncSettings" msgid="6201810008230503052">"sinx ayarlarını oxu"</string>
+ <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Tətbiqə hesablar üçün sinxronizasiya nizamlarını oxuma icazəsi verir. Məsələn, bu Şəxslər tətbiqinin sinxronizə olunub-olunmadığını təyin edə bilər."</string>
+ <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"sinxronizasiyaya davam edir və onu söndürür"</string>
+ <string name="permdesc_writeSyncSettings" msgid="8956262591306369868">"Tətbiqə hesab üçün sinxronizasiya nizamlarını dəyişməyə icazə verir. Məsələn, bu istifadəçi hesablı Şəxslər tətbiqinin sinxronizasiyasını başlamaq üçün istifadə edilə bilər."</string>
+ <string name="permlab_readSyncStats" msgid="7396577451360202448">"sinxronizasiya statistikasını oxumaq"</string>
+ <string name="permdesc_readSyncStats" msgid="1510143761757606156">"Tətbiqə sync tədbirlərinin tarixçəsi və nə qədər datanın sinx olduğu da daxil olmaqla bərabər, hər hansı bir hesab üçün olan sinx statlarını oxumağa imkan verir."</string>
+ <string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"abunə olunmuş xəbərləri oxuyur"</string>
+ <string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"Tətbiqə hazırda sinxron lentlər haqqında ətraflı məlumat almaq üçün imkan verir."</string>
+ <string name="permlab_subscribedFeedsWrite" msgid="9015246325408209296">"abunə olunmuş xəbərləri yazır"</string>
+ <string name="permdesc_subscribedFeedsWrite" msgid="6928930188826089413">"Tətbiqə cari sinxronlaşmış lentlərinizə dəyişiklik etmək imkanı verir. Zərərli tətbiqlər sixronlaşmış lentlərinizi dəyişə bilər."</string>
+ <string name="permlab_readDictionary" msgid="4107101525746035718">"lüğətə əlavə etdiyiniz şərtləri oxumaq"</string>
+ <string name="permdesc_readDictionary" msgid="659614600338904243">"Tətbiqə istifadəçinin lüğətdə saxladığı bütün sözləri, adları və frazaları oxumaq icazəsi verir."</string>
+ <string name="permlab_writeDictionary" msgid="2183110402314441106">"istifadəçi lüğətinə sözlər əlavə etmək"</string>
+ <string name="permdesc_writeDictionary" msgid="8185385716255065291">"Tətbiqə istifadəçi lüğətinə yeni sözlər yazmağa imkan verir."</string>
+ <string name="permlab_sdcardRead" product="nosdcard" msgid="8235341515605559677">"qorunmuş yaddaşa daxil olmağa cəhd etmək"</string>
+ <string name="permlab_sdcardRead" product="default" msgid="8235341515605559677">"qorunmuş yaddaşa daxil olmağa cəhd etmək"</string>
+ <string name="permdesc_sdcardRead" product="nosdcard" msgid="3642473292348132072">"Tətbiqə gələcək cihazlarda əlçatımlı olacaq USB yaddaş üçün icazə testi etməyə imkan verir."</string>
+ <string name="permdesc_sdcardRead" product="default" msgid="5914402684685848828">"Tətbiqə gələcək cihazlarda mövcud olacaq SD kart üçün icazəni test etmək üçün imkan verir."</string>
+ <string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"USB yaddaşınızın məzmununu dəyişmək və ya silmək"</string>
+ <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"SD kart kontentlərini dəyişir və ya silir"</string>
+ <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"Tətbiqə USB yaddaşa yazmağa imkan verir."</string>
+ <string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Tətbiqə SD karta yazma icazəsi verir."</string>
+ <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"daxili media yaddaşı kontentini dəyişir/silir"</string>
+ <string name="permdesc_mediaStorageWrite" product="default" msgid="8189160597698529185">"Tətbiqə daxili media yaddaşdakı kontenti redaktə etmək icazəsi verir."</string>
+ <string name="permlab_manageDocs" product="default" msgid="5778318598448849829">"sənəd yaddaşını nizamlayır"</string>
+ <string name="permdesc_manageDocs" product="default" msgid="8704323176914121484">"Tətbiqə sənəd yaddaşını idarə etməyə imkan verir."</string>
+ <string name="permlab_sdcardAccessAll" msgid="8150613823900460576">"bütün istifadəçilərin xarici yaddaşına daxil ol"</string>
+ <string name="permdesc_sdcardAccessAll" msgid="3215208357415891320">"Tətbiqə bütün istifadəçilər üçün olan xarici yaddaşa giriş imkanı verir."</string>
+ <string name="permlab_cache_filesystem" msgid="5656487264819669824">"keş fayl sisteminə girmək"</string>
+ <string name="permdesc_cache_filesystem" msgid="5578967642265550955">"Tətbiqə keş fayl sistemini oxumağa və yazmağa icazə verir."</string>
+ <string name="permlab_use_sip" msgid="5986952362795870502">"İnternet zəngləri etmək və ya qəbul etmək"</string>
+ <string name="permdesc_use_sip" msgid="4717632000062674294">"Tətbiqə internet zənglərinin göndərilməsi və qəbul edilməsi üçün SIP servisindən istifadə icazəsi verir."</string>
+ <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"tarixi şəbəkə istifadəsini oxu"</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"Tətbiqə xüsusi şəbəkələr və tətbiqlər üçün tarixi şəbəkə istifadəsini oxumağa icazə verir."</string>
+ <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"şəbəkə siyasətini idarə etmək"</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"Tətbiqə şəbəkə qanunlarını və tətbiqin xüsusi qaydalarını idarə etmək imkanı verir."</string>
+ <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"şəbəkə istifadə hesabını dəyişmək"</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"Tətbiqə şəbəkə istifadəsinin tətbiqlərə qarşı nizamlarını redaktə etməyə icazə verir. Normal tətbiqlər tərəfindən istifadə edilmir."</string>
+ <string name="permlab_markNetworkSocket" msgid="3658527214914959749">"soket işarələrini dəyişin"</string>
+ <string name="permdesc_markNetworkSocket" msgid="7655568433696356578">"Tətbiqə araşdırma üçün soket işarələrini dəyişmək imkanı verir"</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"bildirişlərə daxil ol"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"Tətbiqə bildirişləri əldə etməyə, sınamağa və təmizləməyə imkan verir, buna digər tətbiqlər tərəfindən verilmiş bildirişlər də daxildir."</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"bildiriş dinləmə xidmətinə bağlanır"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"Sahibinə yüksək səviyyəli bildiriş dinləmə servisi ilə əlaqə saxlamağa icazə verir. Normal tətbiqlər tərəfindən heç vaxt istənilməməlidir."</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"operator xidmətli konfiurasiya tətbiqinə müraciət edin"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"Sahibinə operator xidmətli tətbiq konfiqurasiyasına müraciət imkanı verir. Normal tətbiqlər üçün tələb olunmamalıdır."</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"şəbəkə şəraiti haqqında müşahidələr üçün qulaq asmaq"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"Tətbiqə şəbəkə şəraiti üzrə müşahidələr üçün qulaq asmaq imkanı verir. Normal tətbiqlər üçün heç vaxt lazım olmamalıdır."</string>
+ <string name="policylab_limitPassword" msgid="4497420728857585791">"Parol qaydalarını təyin edin"</string>
+ <string name="policydesc_limitPassword" msgid="3252114203919510394">"Ekran kilidini açan şifrələrin uzunluğunu və onlardakı icazə verilən işarələrə nəzarət edir."</string>
+ <string name="policylab_watchLogin" msgid="914130646942199503">"Ekran kilidi cəhdlərini monitorinq et"</string>
+ <string name="policydesc_watchLogin" product="tablet" msgid="3215729294215070072">"Ekan kilidini açarkən daxil edilmiş yanlış parollara baxın və əgər həddindən çox yanlış parollar daxil edilibsə, planşeti kilidləyin və ya bütün planşet datasını silin."</string>
+ <string name="policydesc_watchLogin" product="default" msgid="5712323091846761073">"Ekan kilidini açarkən daxil edilmiş yanlış parollara baxın və əgər həddindən çox yanlış parollar daxil edilibsə, telefonu kilidləyin və ya bütün telefon datasını silin."</string>
+ <string name="policylab_resetPassword" msgid="2620077191242688955">"Ekran kilid parolunu dəyişin"</string>
+ <string name="policydesc_resetPassword" msgid="605963962301904458">"Ekran kilidini açan şifrəni dəyişdirin."</string>
+ <string name="policylab_forceLock" msgid="2274085384704248431">"Ekranı kilidləyin"</string>
+ <string name="policydesc_forceLock" msgid="1141797588403827138">"Ekranın nə vaxt və necə kilidlənməsinə nəzarət edir."</string>
+ <string name="policylab_wipeData" msgid="3910545446758639713">"Bütün məlumatları silin"</string>
+ <string name="policydesc_wipeData" product="tablet" msgid="4306184096067756876">"Planşetin datasını xəbərdarlıq olmadan, zavod data sıfırlaması ilə silin."</string>
+ <string name="policydesc_wipeData" product="default" msgid="5096895604574188391">"Telefonun datasını xəbərdarlıq olmadan, zavod data sıfırlaması ilə silin"</string>
+ <string name="policylab_setGlobalProxy" msgid="2784828293747791446">"Cihazın qlobal proksisini ayarlayın"</string>
+ <string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"Siyasət aktiv olarkən cihazın qlobal proksisini istifadə üçün qurun. Yalnız ilk cihaz admini effektiv qlobal proksini təyin edir."</string>
+ <string name="policylab_expirePassword" msgid="885279151847254056">"Ekran kilidi şifrəsinə son zaman seç"</string>
+ <string name="policydesc_expirePassword" msgid="1729725226314691591">"Ekran kilidi parolunun nə qədər tez-tez dəyişməsini kontrol edin."</string>
+ <string name="policylab_encryptedStorage" msgid="8901326199909132915">"Yaddaş şifrələnməsini ayarlayın"</string>
+ <string name="policydesc_encryptedStorage" msgid="2637732115325316992">"Tətbiq məlumatlarının şifrələnməsini tələb edir."</string>
+ <string name="policylab_disableCamera" msgid="6395301023152297826">"Kameraları dekativ edin"</string>
+ <string name="policydesc_disableCamera" msgid="2306349042834754597">"Bütün cihaz kameralarının istifadəsini əngəllə."</string>
+ <string name="policylab_disableKeyguardFeatures" msgid="266329104542638802">"Klaviatura kilidində funksiyaları deaktiv edin"</string>
+ <string name="policydesc_disableKeyguardFeatures" msgid="3467082272186534614">"Klaviatura kilidində bəzi funksiyaların qarşısını alın."</string>
+ <string-array name="phoneTypes">
+ <item msgid="8901098336658710359">"Æsas sÉ™hifÉ™"</item>
+ <item msgid="869923650527136615">"Mobil"</item>
+ <item msgid="7897544654242874543">"İş"</item>
+ <item msgid="1103601433382158155">"İş Faksı"</item>
+ <item msgid="1735177144948329370">"Ev Faksı"</item>
+ <item msgid="603878674477207394">"Peycer"</item>
+ <item msgid="1650824275177931637">"Digər"</item>
+ <item msgid="9192514806975898961">"Şəxsi"</item>
+ </string-array>
+ <string-array name="emailAddressTypes">
+ <item msgid="8073994352956129127">"Ana səhifə"</item>
+ <item msgid="7084237356602625604">"İş"</item>
+ <item msgid="1112044410659011023">"Digər"</item>
+ <item msgid="2374913952870110618">"Fərdi"</item>
+ </string-array>
+ <string-array name="postalAddressTypes">
+ <item msgid="6880257626740047286">"Æsas sÉ™hifÉ™"</item>
+ <item msgid="5629153956045109251">"İş"</item>
+ <item msgid="4966604264500343469">"Digər"</item>
+ <item msgid="4932682847595299369">"Düzənləyin"</item>
+ </string-array>
+ <string-array name="imAddressTypes">
+ <item msgid="1738585194601476694">"Æsas sÉ™hifÉ™"</item>
+ <item msgid="1359644565647383708">"İş"</item>
+ <item msgid="7868549401053615677">"Digər"</item>
+ <item msgid="3145118944639869809">"Fərdi"</item>
+ </string-array>
+ <string-array name="organizationTypes">
+ <item msgid="7546335612189115615">"İş"</item>
+ <item msgid="4378074129049520373">"Digər"</item>
+ <item msgid="3455047468583965104">"Fərdi"</item>
+ </string-array>
+ <string-array name="imProtocols">
+ <item msgid="8595261363518459565">"AIM"</item>
+ <item msgid="7390473628275490700">"Windows Live"</item>
+ <item msgid="7882877134931458217">"Yahoo"</item>
+ <item msgid="5035376313200585242">"Skype"</item>
+ <item msgid="7532363178459444943">"QQ"</item>
+ <item msgid="3713441034299660749">"Google Söhbət"</item>
+ <item msgid="2506857312718630823">"ICQ"</item>
+ <item msgid="1648797903785279353">"Jabber"</item>
+ </string-array>
+ <string name="phoneTypeCustom" msgid="1644738059053355820">"Şəxsi"</string>
+ <string name="phoneTypeHome" msgid="2570923463033985887">"Ev"</string>
+ <string name="phoneTypeMobile" msgid="6501463557754751037">"Mobil"</string>
+ <string name="phoneTypeWork" msgid="8863939667059911633">"İş"</string>
+ <string name="phoneTypeFaxWork" msgid="3517792160008890912">"İş Faksı"</string>
+ <string name="phoneTypeFaxHome" msgid="2067265972322971467">"Ev Faksı"</string>
+ <string name="phoneTypePager" msgid="7582359955394921732">"Peycer"</string>
+ <string name="phoneTypeOther" msgid="1544425847868765990">"Digər"</string>
+ <string name="phoneTypeCallback" msgid="2712175203065678206">"Geriyə zəng"</string>
+ <string name="phoneTypeCar" msgid="8738360689616716982">"Avtomobil"</string>
+ <string name="phoneTypeCompanyMain" msgid="540434356461478916">"Şirkət"</string>
+ <string name="phoneTypeIsdn" msgid="8022453193171370337">"ISDN"</string>
+ <string name="phoneTypeMain" msgid="6766137010628326916">"Æsas"</string>
+ <string name="phoneTypeOtherFax" msgid="8587657145072446565">"Digər faks"</string>
+ <string name="phoneTypeRadio" msgid="4093738079908667513">"Radio"</string>
+ <string name="phoneTypeTelex" msgid="3367879952476250512">"Teleks"</string>
+ <string name="phoneTypeTtyTdd" msgid="8606514378585000044">"TTY TDD"</string>
+ <string name="phoneTypeWorkMobile" msgid="1311426989184065709">"Mobil iÅŸ telefonu"</string>
+ <string name="phoneTypeWorkPager" msgid="649938731231157056">"İş Peyceri"</string>
+ <string name="phoneTypeAssistant" msgid="5596772636128562884">"Köməkçi"</string>
+ <string name="phoneTypeMms" msgid="7254492275502768992">"MMS"</string>
+ <string name="eventTypeCustom" msgid="7837586198458073404">"Fərdi"</string>
+ <string name="eventTypeBirthday" msgid="2813379844211390740">"Doğum günü"</string>
+ <string name="eventTypeAnniversary" msgid="3876779744518284000">"İldönümü"</string>
+ <string name="eventTypeOther" msgid="7388178939010143077">"Digər"</string>
+ <string name="emailTypeCustom" msgid="8525960257804213846">"Fərdi"</string>
+ <string name="emailTypeHome" msgid="449227236140433919">"Æsas sÉ™hifÉ™"</string>
+ <string name="emailTypeWork" msgid="3548058059601149973">"İş"</string>
+ <string name="emailTypeOther" msgid="2923008695272639549">"Digər"</string>
+ <string name="emailTypeMobile" msgid="119919005321166205">"Mobil"</string>
+ <string name="postalTypeCustom" msgid="8903206903060479902">"Fərdi"</string>
+ <string name="postalTypeHome" msgid="8165756977184483097">"Æsas sÉ™hifÉ™"</string>
+ <string name="postalTypeWork" msgid="5268172772387694495">"İş"</string>
+ <string name="postalTypeOther" msgid="2726111966623584341">"Digər"</string>
+ <string name="imTypeCustom" msgid="2074028755527826046">"Fərdi"</string>
+ <string name="imTypeHome" msgid="6241181032954263892">"Ana səhifə"</string>
+ <string name="imTypeWork" msgid="1371489290242433090">"İş"</string>
+ <string name="imTypeOther" msgid="5377007495735915478">"Digər"</string>
+ <string name="imProtocolCustom" msgid="6919453836618749992">"Şəxsi"</string>
+ <string name="imProtocolAim" msgid="7050360612368383417">"AIM"</string>
+ <string name="imProtocolMsn" msgid="144556545420769442">"Windows Live"</string>
+ <string name="imProtocolYahoo" msgid="8271439408469021273">"Yahoo"</string>
+ <string name="imProtocolSkype" msgid="9019296744622832951">"Skype"</string>
+ <string name="imProtocolQq" msgid="8887484379494111884">"QQ"</string>
+ <string name="imProtocolGoogleTalk" msgid="493902321140277304">"Görüşlər"</string>
+ <string name="imProtocolIcq" msgid="1574870433606517315">"ICQ"</string>
+ <string name="imProtocolJabber" msgid="2279917630875771722">"Jabber"</string>
+ <string name="imProtocolNetMeeting" msgid="8287625655986827971">"NetMeeting"</string>
+ <string name="orgTypeWork" msgid="29268870505363872">"İş"</string>
+ <string name="orgTypeOther" msgid="3951781131570124082">"Digər"</string>
+ <string name="orgTypeCustom" msgid="225523415372088322">"Fərdi"</string>
+ <string name="relationTypeCustom" msgid="3542403679827297300">"Şəxsi"</string>
+ <string name="relationTypeAssistant" msgid="6274334825195379076">"Köməkçi"</string>
+ <string name="relationTypeBrother" msgid="8757913506784067713">"QardaÅŸ"</string>
+ <string name="relationTypeChild" msgid="1890746277276881626">"UÅŸaq"</string>
+ <string name="relationTypeDomesticPartner" msgid="6904807112121122133">"Ev yoldaşı"</string>
+ <string name="relationTypeFather" msgid="5228034687082050725">"Ata"</string>
+ <string name="relationTypeFriend" msgid="7313106762483391262">"Dost"</string>
+ <string name="relationTypeManager" msgid="6365677861610137895">"Müdir"</string>
+ <string name="relationTypeMother" msgid="4578571352962758304">"Ana"</string>
+ <string name="relationTypeParent" msgid="4755635567562925226">"Valideyn"</string>
+ <string name="relationTypePartner" msgid="7266490285120262781">"Ortaq"</string>
+ <string name="relationTypeReferredBy" msgid="101573059844135524">"Dəvət edən"</string>
+ <string name="relationTypeRelative" msgid="1799819930085610271">"Qohum"</string>
+ <string name="relationTypeSister" msgid="1735983554479076481">"Bacı"</string>
+ <string name="relationTypeSpouse" msgid="394136939428698117">"Həyat yoldaşı"</string>
+ <string name="sipAddressTypeCustom" msgid="2473580593111590945">"Fərdi"</string>
+ <string name="sipAddressTypeHome" msgid="6093598181069359295">"Æsas sÉ™hifÉ™"</string>
+ <string name="sipAddressTypeWork" msgid="6920725730797099047">"İş"</string>
+ <string name="sipAddressTypeOther" msgid="4408436162950119849">"Digər"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"PİN kodu daxil edin"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"PUK və yeni PİN kod daxil edin"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"PUK kod"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"Yeni PIN kodu"</string>
+ <string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"Şifrə daxil etmək üçün toxunun"</font></string>
+ <string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Kilidi açmaq üçün parol yazın"</string>
+ <string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Kilidi açmaq üçün PIN daxil edin"</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"Yanlış PIN kodu."</string>
+ <string name="keyguard_label_text" msgid="861796461028298424">"Kilidi açmaq üçün Menyu, sonra 0 basın."</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"Təcili nömrə"</string>
+ <string name="lockscreen_carrier_default" msgid="8963839242565653192">"Xidmət yoxdur."</string>
+ <string name="lockscreen_screen_locked" msgid="7288443074806832904">"Ekran kilidlənib."</string>
+ <string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Təcili zəng kilidini açmaq və ya yerləşdirmək üçün Menyu düyməsinə basın."</string>
+ <string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Kilidi açmaq üçün Menyu düyməsinə basın."</string>
+ <string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"Kilidi açmaq üçün model çəkin"</string>
+ <string name="lockscreen_emergency_call" msgid="5347633784401285225">"Təcili zəng"</string>
+ <string name="lockscreen_return_to_call" msgid="5244259785500040021">"Zəngə qayıt"</string>
+ <string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Düzdür!"</string>
+ <string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"Bir də cəhd edin"</string>
+ <string name="lockscreen_password_wrong" msgid="5737815393253165301">"Bir daha cəhd et"</string>
+ <string name="faceunlock_multiple_failures" msgid="754137583022792429">"Sifət kilidi cəhdləriniz bitdi"</string>
+ <string name="lockscreen_plugged_in" msgid="8057762828355572315">"Batareya yığılır, <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+ <string name="lockscreen_charged" msgid="321635745684060624">"Dolub"</string>
+ <string name="lockscreen_battery_short" msgid="4477264849386850266">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+ <string name="lockscreen_low_battery" msgid="1482873981919249740">"ElektrikÉ™ qoÅŸun."</string>
+ <string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"SIM kart yoxdur."</string>
+ <string name="lockscreen_missing_sim_message" product="tablet" msgid="151659196095791474">"PlanÅŸetdÉ™ SIM kart yoxdur."</string>
+ <string name="lockscreen_missing_sim_message" product="default" msgid="2186920585695169078">"Telefonda SİM kart yoxdur."</string>
+ <string name="lockscreen_missing_sim_instructions" msgid="5372787138023272615">"SİM kart daxil edin."</string>
+ <string name="lockscreen_missing_sim_instructions_long" msgid="3526573099019319472">"SİM kart yoxdur və ya oxuna bilinmir. SİM kart daxil edin."</string>
+ <string name="lockscreen_permanent_disabled_sim_message_short" msgid="5096149665138916184">"Yararsız SIM kart."</string>
+ <string name="lockscreen_permanent_disabled_sim_instructions" msgid="910904643433151371">"Sizin SİM kartınız daimi olaraq deaktivləşib.\n Başqa SİM kart üçün simsiz xidmət provayderinizə müraciət edin."</string>
+ <string name="lockscreen_transport_prev_description" msgid="201594905152746886">"ÆvvÉ™lki trek düymÉ™si"</string>
+ <string name="lockscreen_transport_next_description" msgid="6089297650481292363">"Növbəti trek düyməsi"</string>
+ <string name="lockscreen_transport_pause_description" msgid="7659088786780128001">"Pauza düyməsi"</string>
+ <string name="lockscreen_transport_play_description" msgid="5888422938351019426">"Oxutma düyməsi"</string>
+ <string name="lockscreen_transport_stop_description" msgid="4562318378766987601">"Dayandırma düyməsi"</string>
+ <string name="emergency_calls_only" msgid="6733978304386365407">"Yalnız təcili zənglər"</string>
+ <string name="lockscreen_network_locked_message" msgid="143389224986028501">"Şəbəkə kilidlidir"</string>
+ <string name="lockscreen_sim_puk_locked_message" msgid="7441797339976230">"SIM kart PUK ilə kilidlənib."</string>
+ <string name="lockscreen_sim_puk_locked_instructions" msgid="8127916255245181063">"İstifadəçi Təlimatlarına baxın və ya Müştəri Xidmətlərinə müraciət edin."</string>
+ <string name="lockscreen_sim_locked_message" msgid="8066660129206001039">"SIM kart kilidlənib."</string>
+ <string name="lockscreen_sim_unlock_progress_dialog_message" msgid="595323214052881264">"SİM kartın kilidi açılır..."</string>
+ <string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="6481623830344107222">"Siz kilid modelini <xliff:g id="NUMBER_0">%d</xliff:g> dəfə yanlış çəkdiniz. \n\n <xliff:g id="NUMBER_1">%d</xliff:g> saniyə içində yenidən sınayın."</string>
+ <string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="2725973286239344555">"Şifrənizi <xliff:g id="NUMBER_0">%d</xliff:g> dəfə yanlış daxil etdiniz.\n\n <xliff:g id="NUMBER_1">%d</xliff:g> saniyə ərzində yenidən yoxlayın"</string>
+ <string name="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="6216672706545696955">"Siz PIN nömrənizi <xliff:g id="NUMBER_0">%d</xliff:g> dəfə yanlış daxil etdiniz. \n \n <xliff:g id="NUMBER_1">%d</xliff:g> saniyə içində təkrar sınayın."</string>
+ <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="9191611984625460820">"Siz kilidi açmaq üçün şablonu <xliff:g id="NUMBER_0">%d</xliff:g> dəfə səhv çəkdiniz. <xliff:g id="NUMBER_1">%d</xliff:g> daha uğursuz cəhddən sonra planşetin kilidini Google hesabınıza daxil olmaqla açmağınız istəniləcək.\n\n <xliff:g id="NUMBER_2">%d</xliff:g> saniyə ərzində bir daha yoxlayın."</string>
+ <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="2590227559763762751">"Siz kilidi açmaq üçün şablonu <xliff:g id="NUMBER_0">%d</xliff:g> dəfə səhv çəkdiniz. <xliff:g id="NUMBER_1">%d</xliff:g> daha uğursuz cəhddən sonra planşetin kilidini Google hesabınıza daxil olmaqla açmağınız tələb olunacaq.\n\n <xliff:g id="NUMBER_2">%d</xliff:g> saniyə ərzində bir daha yoxlayın."</string>
+ <string name="lockscreen_failed_attempts_almost_at_wipe" product="tablet" msgid="6128106399745755604">"Siz planşet kilidini açmaq üçün <xliff:g id="NUMBER_0">%d</xliff:g> dəfə uğursuz cəhd etmisiniz. <xliff:g id="NUMBER_1">%d</xliff:g> dəfə də uğursuz cəhd etsəniz, planşet fabrik ayarlarına sıfırlanacaq və bütün məlumatlarınız itəcək."</string>
+ <string name="lockscreen_failed_attempts_almost_at_wipe" product="default" msgid="8603565142156826565">"Siz telefon kilidini açmaq üçün <xliff:g id="NUMBER_0">%d</xliff:g> dəfə uğursuz cəhd etmisiniz. <xliff:g id="NUMBER_1">%d</xliff:g> dəfə də uğursuz cəhd etsəniz, telefon zavod ayarlarına sıfırlanacaq və bütün məlumatlarınız itəcək."</string>
+ <string name="lockscreen_failed_attempts_now_wiping" product="tablet" msgid="280873516493934365">"Siz planşetin kilidini açmaq üçün <xliff:g id="NUMBER">%d</xliff:g> yanlış cəhd etmisiniz. Planşet artıq defolt zavod halına sıfırlanacaq."</string>
+ <string name="lockscreen_failed_attempts_now_wiping" product="default" msgid="3025504721764922246">"Siz telefonun kilidini açmaq üçün <xliff:g id="NUMBER">%d</xliff:g> dəfə səhv cəhd etdiniz. Telefonunuz indi zavod nizamlarına yenilənəcək."</string>
+ <string name="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"<xliff:g id="NUMBER">%d</xliff:g> saniyə ərzində bir daha cəhd edin."</string>
+ <string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"Åžablonu unutdunuz?"</string>
+ <string name="lockscreen_glogin_forgot_pattern" msgid="2588521501166032747">"Hesab kilid açma"</string>
+ <string name="lockscreen_glogin_too_many_attempts" msgid="2751368605287288808">"Həddindən çox cəhd edildi!"</string>
+ <string name="lockscreen_glogin_instructions" msgid="3931816256100707784">"Kilidi açmaq üçün Google hesabınız ilə daxil olun."</string>
+ <string name="lockscreen_glogin_username_hint" msgid="8846881424106484447">"İstifadəçi adı (e-poçt)"</string>
+ <string name="lockscreen_glogin_password_hint" msgid="5958028383954738528">"ÅžifrÉ™"</string>
+ <string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"Daxil olun"</string>
+ <string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"Yanlış istifadəçi adı və parol."</string>
+ <string name="lockscreen_glogin_account_recovery_hint" msgid="1696924763690379073">"İstifadəçi adınızı və ya parolunuzu unutmusunuz?\n "<b>"google.com/accounts/recovery"</b>" linkinə daxil olun."</string>
+ <string name="lockscreen_glogin_checking_password" msgid="7114627351286933867">"Yoxlanır..."</string>
+ <string name="lockscreen_unlock_label" msgid="737440483220667054">"Kilidi aç"</string>
+ <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"Səs açıqdır"</string>
+ <string name="lockscreen_sound_off_label" msgid="996822825154319026">"Səs sönülüdür"</string>
+ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"Model başlandı"</string>
+ <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Model təmizləndi"</string>
+ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Xana əlavə edildi"</string>
+ <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Model tamamlandı"</string>
+ <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d of %3$d."</string>
+ <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Widget əlavə edin."</string>
+ <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"BoÅŸ"</string>
+ <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Kilidi açma sahəsi genişləndi."</string>
+ <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Kilidi açma sahəsi çökdü."</string>
+ <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> vidcet."</string>
+ <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"İstifadəçi selektoru"</string>
+ <string name="keyguard_accessibility_status" msgid="8008264603935930611">"Status"</string>
+ <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Kamera"</string>
+ <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Media kontrolları"</string>
+ <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Yenidən sıralama vidceti başladıldı."</string>
+ <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Vidcetin təkrar sifarişi sona çatdı."</string>
+ <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Vidcet <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> silindi."</string>
+ <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Kilidi açma sahəsini genişləndir."</string>
+ <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Sürüşdürmə kilidi."</string>
+ <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Kild açma modeli."</string>
+ <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Sifət Kilidi"</string>
+ <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Pin kilid açması."</string>
+ <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"ÅžifrÉ™ kilidi."</string>
+ <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Model sahəsi."</string>
+ <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Sürüşdürmə sahəsi."</string>
+ <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
+ <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
+ <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
+ <string name="granularity_label_character" msgid="7336470535385009523">"simvol"</string>
+ <string name="granularity_label_word" msgid="7075570328374918660">"söz"</string>
+ <string name="granularity_label_link" msgid="5815508880782488267">"link"</string>
+ <string name="granularity_label_line" msgid="5764267235026120888">"xətt"</string>
+ <string name="hour_ampm" msgid="4584338083529355982">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
+ <string name="hour_cap_ampm" msgid="2083465992940444366">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
+ <string name="factorytest_failed" msgid="5410270329114212041">"Zavod testi alınmadı"</string>
+ <string name="factorytest_not_system" msgid="4435201656767276723">"Bu FACTORY_TEST fəaliyyəti yalnızca/sistemdə/tətbiqdə quraşdırılmış paketlər üçün dəstəklənir."</string>
+ <string name="factorytest_no_action" msgid="872991874799998561">"FACTORY_TEST əməliyyatını təsdiqləyən heç bir paket tapılmadı."</string>
+ <string name="factorytest_reboot" msgid="6320168203050791643">"Yenidən yükləyin"</string>
+ <string name="js_dialog_title" msgid="1987483977834603872">"\"<xliff:g id="TITLE">%s</xliff:g>\"dakı səhifədə deyilir:"</string>
+ <string name="js_dialog_title_default" msgid="6961903213729667573">"JavaScript"</string>
+ <string name="js_dialog_before_unload_title" msgid="2619376555525116593">"Naviqasiyanı Təsdiq edin"</string>
+ <string name="js_dialog_before_unload_positive_button" msgid="3112752010600484130">"Bu Səhifəni Tərk edin"</string>
+ <string name="js_dialog_before_unload_negative_button" msgid="5614861293026099715">"Bu səhifədə qalın"</string>
+ <string name="js_dialog_before_unload" msgid="3468816357095378590">"<xliff:g id="MESSAGE">%s</xliff:g>\n\nBu səhifədən kənara naviqasiya etmək istədiyinizə əminsiniz mi?"</string>
+ <string name="save_password_label" msgid="6860261758665825069">"Təsdiqlə"</string>
+ <string name="double_tap_toast" msgid="4595046515400268881">"Məsləhət: Böyütmək və kiçiltmək üçün iki dəfə tıklayın."</string>
+ <string name="autofill_this_form" msgid="4616758841157816676">"Avtodoldurma"</string>
+ <string name="setup_autofill" msgid="7103495070180590814">"AvtoDoldurmanı ayarla"</string>
+ <string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
+ <string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
+ <string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
+ <string name="autofill_address_summary_format" msgid="4874459455786827344">"$1$2$3"</string>
+ <string name="autofill_province" msgid="2231806553863422300">"Vilayət"</string>
+ <string name="autofill_postal_code" msgid="4696430407689377108">"Poçt kodu"</string>
+ <string name="autofill_state" msgid="6988894195520044613">"Dövlət"</string>
+ <string name="autofill_zip_code" msgid="8697544592627322946">"Poçt indeksi"</string>
+ <string name="autofill_county" msgid="237073771020362891">"Ölkə"</string>
+ <string name="autofill_island" msgid="4020100875984667025">"Ada"</string>
+ <string name="autofill_district" msgid="8400735073392267672">"SahÉ™"</string>
+ <string name="autofill_department" msgid="5343279462564453309">"Departament"</string>
+ <string name="autofill_prefecture" msgid="2028499485065800419">"Prefektura"</string>
+ <string name="autofill_parish" msgid="8202206105468820057">"PariÅŸ"</string>
+ <string name="autofill_area" msgid="3547409050889952423">"SahÉ™"</string>
+ <string name="autofill_emirate" msgid="2893880978835698818">"Æmirlik"</string>
+ <string name="permlab_readHistoryBookmarks" msgid="3775265775405106983">"Veb əlfəcinlərinizi və tarixçələrinizi oxumaq"</string>
+ <string name="permdesc_readHistoryBookmarks" msgid="8462378226600439658">"Tətbiqə Brauzerin daxil olduğu bütün linkləri və bütün Brauzer əlfəcinlərini oxumaq imkanı verir. Qeyd: bu icazə veb brauzer imkanları olan üçüncü tərəf brazuerləri və digər tətbiqlər tərəfindən yerinə yetirilə bilməz."</string>
+ <string name="permlab_writeHistoryBookmarks" msgid="3714785165273314490">"veb əlfəcinləri və tarixçəsi yazmaq"</string>
+ <string name="permdesc_writeHistoryBookmarks" product="tablet" msgid="6825527469145760922">"Tətbiqə planşetinizdəki brauzer tarixini və əlfəcinləri redaktə etmək icazəsi verir. Bu tətbizə brauzer məlumatlarını silmək və ya redaktə etmək imkanı verə bilər. Qeyd: Bu icazə 3-cü partiya brauzerlərə və ya veb brauzing xüsusiyyətli digər tətbiqlərə şamil olunmaya bilər."</string>
+ <string name="permdesc_writeHistoryBookmarks" product="default" msgid="8497389531014185509">"Tətbiqə Brauzer tarixçəsi və telefonunuzda saxlanılan əlfəcinlərə dəyişiklik etmək imkanı verir. Bununla tətbiqlə Brauzer datanızı silə və ya dəyişdirə bilər. Qeyd: bu icazə veb brauzer imkanları olan üçüncü tərəf brazuerləri və digər tətbiqlər tərəfindən yerinə yetirilə bilməz."</string>
+ <string name="permlab_setAlarm" msgid="1379294556362091814">"siqnal qurur"</string>
+ <string name="permdesc_setAlarm" msgid="316392039157473848">"Tətbiqə quraşdırlmış zəngli saata alarm ayarlamağa imkan verir. Bəzi zəngli saat tətbiqləri bu özəlliyi dəstəkləməyə bilər."</string>
+ <string name="permlab_addVoicemail" msgid="5525660026090959044">"Səsli poçt əlavə et"</string>
+ <string name="permdesc_addVoicemail" msgid="6604508651428252437">"Tətbiqə səsli poçt qutunuza mesaj əlavə etməyə imkan verir."</string>
+ <string name="permlab_writeGeolocationPermissions" msgid="5962224158955273932">"Brauzerin geolokasiya icazələrini dəyişir"</string>
+ <string name="permdesc_writeGeolocationPermissions" msgid="1083743234522638747">"Tətbiqə Brauzerin geolokasiya icazələrini dəyişməyə imkan verir. Zərərli tətbiqlər bundan istifadə edərək məkan məlumatlarını təsadüfi saytlara göndərə bilər."</string>
+ <string name="permlab_packageVerificationAgent" msgid="5568139100645829117">"paketləri təsdiqlə"</string>
+ <string name="permdesc_packageVerificationAgent" msgid="8437590190990843381">"Tətbiqə paketin quraşdırılabilən olmasını yoxlamağa imkan verir."</string>
+ <string name="permlab_bindPackageVerifier" msgid="4187786793360326654">"paket doğrulayıcıya bağlanır"</string>
+ <string name="permdesc_bindPackageVerifier" msgid="3180741773233862126">"Sahibinə paket yoxlayıcılarına sorğu göndərmək icazəsi verir. Normal tətbiqlər tərəfindən heç vaxt istənilməməlidir."</string>
+ <string name="permlab_serialPort" msgid="546083327654631076">"serial porta çıxır"</string>
+ <string name="permdesc_serialPort" msgid="2991639985224598193">"Sahibinə SerialManager API vasitəsilə serial portlara icazə izni verir."</string>
+ <string name="permlab_accessContentProvidersExternally" msgid="5077774297943409285">"xarici kontent provayderlərinə giriş"</string>
+ <string name="permdesc_accessContentProvidersExternally" msgid="4544346486697853685">"Məzmun provayderlərinə örtükdən daxil olmaq üçün cihaz sahibinə imkan verir. Normal tətbiqlər üçün lazım deyil."</string>
+ <string name="permlab_updateLock" msgid="3527558366616680889">"avtomatik cihaz yenilənmələrini pozur"</string>
+ <string name="permdesc_updateLock" msgid="1655625832166778492">"Sahibinə yeni versiyaya yenilənmək üçün nə vaxt qeyri-interaktiv reboot məlumatını sistemə təklif etmə icazəsi verir."</string>
+ <string name="save_password_message" msgid="767344687139195790">"Brauzerin bu şifrəni yadda saxlamasını istəyirsiz?"</string>
+ <string name="save_password_notnow" msgid="6389675316706699758">"İndi yox"</string>
+ <string name="save_password_remember" msgid="6491879678996749466">"Yadda saxla"</string>
+ <string name="save_password_never" msgid="8274330296785855105">"Heç vaxt"</string>
+ <string name="open_permission_deny" msgid="7374036708316629800">"Bu səhifəni açmaq üçün icazəniz yoxdur."</string>
+ <string name="text_copied" msgid="4985729524670131385">"Mətn panoya kopyalandı."</string>
+ <string name="more_item_label" msgid="4650918923083320495">"Daha çox"</string>
+ <string name="prepend_shortcut_label" msgid="2572214461676015642">"Menyu+"</string>
+ <string name="menu_space_shortcut_label" msgid="2410328639272162537">"boÅŸluq"</string>
+ <string name="menu_enter_shortcut_label" msgid="2743362785111309668">"daxil olun"</string>
+ <string name="menu_delete_shortcut_label" msgid="3658178007202748164">"sil"</string>
+ <string name="search_go" msgid="8298016669822141719">"Axtar"</string>
+ <string name="searchview_description_search" msgid="6749826639098512120">"Axtarış"</string>
+ <string name="searchview_description_query" msgid="5911778593125355124">"Axtarış sorğusu"</string>
+ <string name="searchview_description_clear" msgid="1330281990951833033">"Sorğunu təmizlə"</string>
+ <string name="searchview_description_submit" msgid="2688450133297983542">"Sorğunu göndərin"</string>
+ <string name="searchview_description_voice" msgid="2453203695674994440">"Səsli axtarış"</string>
+ <string name="enable_explore_by_touch_warning_title" msgid="7460694070309730149">"Toxunaraq Kəşf et funksiyası aktiv edilsin?"</string>
+ <string name="enable_explore_by_touch_warning_message" product="tablet" msgid="8655887539089910577">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> Toxunaraq Kəşf Et rejimini aktivləşdirmək istəyir. Toxunaraq Kəşf Et açıldığı zaman, barmağınızın altında nə olduğu haqda olan təsvirləri eşidə və ya görə bilərsiniz və yaplanşetdə insanlarla əlaqəyə keçmək üçün jestlər həyata keçirə bilərsiniz."</string>
+ <string name="enable_explore_by_touch_warning_message" product="default" msgid="2708199672852373195">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> Toxunaraq Kəşf Et rejimini aktivləşdirmək istəyir. Toxunaraq Kəşf Et açıldığı zaman, barmağınızın altında nə olduğu haqda olan təsvirləri eşidə və ya görə bilərsiniz və ya telefonda insanlarla əlaqəyə keçmək üçün jestlər həyata keçirə bilərsiniz"</string>
+ <string name="oneMonthDurationPast" msgid="7396384508953779925">"1 ay öncə"</string>
+ <string name="beforeOneMonthDurationPast" msgid="909134546836499826">"1 ay əvvəl"</string>
+ <plurals name="num_seconds_ago">
+ <item quantity="one" msgid="4869870056547896011">"1 saniyə əvvəl"</item>
+ <item quantity="other" msgid="3903706804349556379">"<xliff:g id="COUNT">%d</xliff:g> saniyə əvvəl"</item>
+ </plurals>
+ <plurals name="num_minutes_ago">
+ <item quantity="one" msgid="3306787433088810191">"1 dəqiqə əvvəl"</item>
+ <item quantity="other" msgid="2176942008915455116">"<xliff:g id="COUNT">%d</xliff:g> dəqiqə əvvəl"</item>
+ </plurals>
+ <plurals name="num_hours_ago">
+ <item quantity="one" msgid="9150797944610821849">"1 saat əvvəl"</item>
+ <item quantity="other" msgid="2467273239587587569">"<xliff:g id="COUNT">%d</xliff:g> saat əvvəl"</item>
+ </plurals>
+ <plurals name="last_num_days">
+ <item quantity="other" msgid="3069992808164318268">"Son <xliff:g id="COUNT">%d</xliff:g> gün"</item>
+ </plurals>
+ <string name="last_month" msgid="3959346739979055432">"Keçən ay"</string>
+ <string name="older" msgid="5211975022815554840">"Köhnə"</string>
+ <plurals name="num_days_ago">
+ <item quantity="one" msgid="861358534398115820">"dünən"</item>
+ <item quantity="other" msgid="2479586466153314633">"<xliff:g id="COUNT">%d</xliff:g> gün əvvəl"</item>
+ </plurals>
+ <plurals name="in_num_seconds">
+ <item quantity="one" msgid="2729745560954905102">"1 saniyə ərzində"</item>
+ <item quantity="other" msgid="1241926116443974687">"<xliff:g id="COUNT">%d</xliff:g> saniyə içində"</item>
+ </plurals>
+ <plurals name="in_num_minutes">
+ <item quantity="one" msgid="8793095251325200395">"1 dəqiqə içində"</item>
+ <item quantity="other" msgid="3330713936399448749">"<xliff:g id="COUNT">%d</xliff:g> dəqiqə ərzində"</item>
+ </plurals>
+ <plurals name="in_num_hours">
+ <item quantity="one" msgid="7164353342477769999">"1 saata"</item>
+ <item quantity="other" msgid="547290677353727389">"<xliff:g id="COUNT">%d</xliff:g> saata"</item>
+ </plurals>
+ <plurals name="in_num_days">
+ <item quantity="one" msgid="5413088743009839518">"sabah"</item>
+ <item quantity="other" msgid="5109449375100953247">"<xliff:g id="COUNT">%d</xliff:g> gün ərzində"</item>
+ </plurals>
+ <plurals name="abbrev_num_seconds_ago">
+ <item quantity="one" msgid="1849036840200069118">"1 saniyə əvvəl"</item>
+ <item quantity="other" msgid="3699169366650930415">"<xliff:g id="COUNT">%d</xliff:g> san əvvəl"</item>
+ </plurals>
+ <plurals name="abbrev_num_minutes_ago">
+ <item quantity="one" msgid="6361490147113871545">"1 dəqiqə əvvəl"</item>
+ <item quantity="other" msgid="851164968597150710">"<xliff:g id="COUNT">%d</xliff:g> dəqiqə əvvəl"</item>
+ </plurals>
+ <plurals name="abbrev_num_hours_ago">
+ <item quantity="one" msgid="4796212039724722116">"1 saat əvvəl"</item>
+ <item quantity="other" msgid="6889970745748538901">"<xliff:g id="COUNT">%d</xliff:g> saat əvvəl"</item>
+ </plurals>
+ <plurals name="abbrev_num_days_ago">
+ <item quantity="one" msgid="8463161711492680309">"dünən"</item>
+ <item quantity="other" msgid="3453342639616481191">"<xliff:g id="COUNT">%d</xliff:g> gün əvvəl"</item>
+ </plurals>
+ <plurals name="abbrev_in_num_seconds">
+ <item quantity="one" msgid="5842225370795066299">"1 san ərzində"</item>
+ <item quantity="other" msgid="5495880108825805108">"<xliff:g id="COUNT">%d</xliff:g> san ərzində"</item>
+ </plurals>
+ <plurals name="abbrev_in_num_minutes">
+ <item quantity="one" msgid="562786149928284878">"1 dəq ərzində"</item>
+ <item quantity="other" msgid="4216113292706568726">"<xliff:g id="COUNT">%d</xliff:g> dəqiqəyə"</item>
+ </plurals>
+ <plurals name="abbrev_in_num_hours">
+ <item quantity="one" msgid="3274708118124045246">"1 saat ərzində"</item>
+ <item quantity="other" msgid="3705373766798013406">"<xliff:g id="COUNT">%d</xliff:g> saata"</item>
+ </plurals>
+ <plurals name="abbrev_in_num_days">
+ <item quantity="one" msgid="2178576254385739855">"sabah"</item>
+ <item quantity="other" msgid="2973062968038355991">"<xliff:g id="COUNT">%d</xliff:g> günə"</item>
+ </plurals>
+ <string name="preposition_for_date" msgid="9093949757757445117">"<xliff:g id="DATE">%s</xliff:g> tarixindÉ™"</string>
+ <string name="preposition_for_time" msgid="5506831244263083793">"saat <xliff:g id="TIME">%s</xliff:g>"</string>
+ <string name="preposition_for_year" msgid="5040395640711867177">"<xliff:g id="YEAR">%s</xliff:g> ilindÉ™"</string>
+ <string name="day" msgid="8144195776058119424">"gün"</string>
+ <string name="days" msgid="4774547661021344602">"günlər"</string>
+ <string name="hour" msgid="2126771916426189481">"saat"</string>
+ <string name="hours" msgid="894424005266852993">"saatlar"</string>
+ <string name="minute" msgid="9148878657703769868">"dəq."</string>
+ <string name="minutes" msgid="5646001005827034509">"dəqiqə"</string>
+ <string name="second" msgid="3184235808021478">"sn"</string>
+ <string name="seconds" msgid="3161515347216589235">"san"</string>
+ <string name="week" msgid="5617961537173061583">"həftə"</string>
+ <string name="weeks" msgid="6509623834583944518">"həftə"</string>
+ <string name="year" msgid="4001118221013892076">"il"</string>
+ <string name="years" msgid="6881577717993213522">"il"</string>
+ <plurals name="duration_seconds">
+ <item quantity="one" msgid="6962015528372969481">"1 saniyÉ™"</item>
+ <item quantity="other" msgid="1886107766577166786">"<xliff:g id="COUNT">%d</xliff:g> saniyÉ™"</item>
+ </plurals>
+ <plurals name="duration_minutes">
+ <item quantity="one" msgid="4915414002546085617">"1 dəqiqə"</item>
+ <item quantity="other" msgid="3165187169224908775">"<xliff:g id="COUNT">%d</xliff:g> dəqiqə"</item>
+ </plurals>
+ <plurals name="duration_hours">
+ <item quantity="one" msgid="8917467491248809972">"1 saat"</item>
+ <item quantity="other" msgid="3863962854246773930">"<xliff:g id="COUNT">%d</xliff:g> saat"</item>
+ </plurals>
+ <string name="VideoView_error_title" msgid="3534509135438353077">"Video problemi"</string>
+ <string name="VideoView_error_text_invalid_progressive_playback" msgid="3186670335938670444">"Bu video bu cihaza strim olunmaq üçün uyğun deyil."</string>
+ <string name="VideoView_error_text_unknown" msgid="3450439155187810085">"Bu video oxumur"</string>
+ <string name="VideoView_error_button" msgid="2822238215100679592">"OK"</string>
+ <string name="relative_time" msgid="1818557177829411417">"<xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="noon" msgid="7245353528818587908">"günorta"</string>
+ <string name="Noon" msgid="3342127745230013127">"Günorta"</string>
+ <string name="midnight" msgid="7166259508850457595">"gecəyarı"</string>
+ <string name="Midnight" msgid="5630806906897892201">"Gecəyarı"</string>
+ <string name="elapsed_time_short_format_mm_ss" msgid="4431555943828711473">"<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" msgid="1846071997616654124">"<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" msgid="6876518925844129331">"Hamısını seç"</string>
+ <string name="cut" msgid="3092569408438626261">"Kəs"</string>
+ <string name="copy" msgid="2681946229533511987">"Kopyala"</string>
+ <string name="paste" msgid="5629880836805036433">"Yerləşdir"</string>
+ <string name="replace" msgid="5781686059063148930">"ÆvÉ™z et..."</string>
+ <string name="delete" msgid="6098684844021697789">"Sil"</string>
+ <string name="copyUrl" msgid="2538211579596067402">"URL kopyala"</string>
+ <string name="selectTextMode" msgid="1018691815143165326">"Mətn seçin"</string>
+ <string name="textSelectionCABTitle" msgid="5236850394370820357">"Mətn seçimi"</string>
+ <string name="addToDictionary" msgid="4352161534510057874">"Lüğətə əlavə et"</string>
+ <string name="deleteText" msgid="6979668428458199034">"Sil"</string>
+ <string name="inputMethod" msgid="1653630062304567879">"DaxiletmÉ™ metodu"</string>
+ <string name="editTextMenuTitle" msgid="4909135564941815494">"Mətn əməliyyatları"</string>
+ <string name="low_internal_storage_view_title" msgid="5576272496365684834">"YaddaÅŸ yeri bitir"</string>
+ <string name="low_internal_storage_view_text" msgid="6640505817617414371">"Bəzi sistem funksiyaları işləməyə bilər"</string>
+ <string name="app_running_notification_title" msgid="8718335121060787914">"<xliff:g id="APP_NAME">%1$s</xliff:g> işlənir"</string>
+ <string name="app_running_notification_text" msgid="4653586947747330058">"Daha çox məlumat üçün və ya tətbiqi dayandırmaq üçün toxunun."</string>
+ <string name="ok" msgid="5970060430562524910">"OK"</string>
+ <string name="cancel" msgid="6442560571259935130">"Ləğv et"</string>
+ <string name="yes" msgid="5362982303337969312">"OK"</string>
+ <string name="no" msgid="5141531044935541497">"Ləğv et"</string>
+ <string name="dialog_alert_title" msgid="2049658708609043103">"Diqqət"</string>
+ <string name="loading" msgid="7933681260296021180">"Yüklənir…"</string>
+ <string name="capital_on" msgid="1544682755514494298">"AÇIQ"</string>
+ <string name="capital_off" msgid="6815870386972805832">"QAPALI"</string>
+ <string name="whichApplication" msgid="4533185947064773386">"ÆmÉ™liyyatı tamamlayın:"</string>
+ <string name="alwaysUse" msgid="4583018368000610438">"Bu fəaliyyət üçün defolt istifadə edin"</string>
+ <string name="clearDefaultHintMsg" msgid="3252584689512077257">"Sistem ayarlarında, Tətbiqlərdə və Endirilmişlərdə defoltu təmizləyin."</string>
+ <string name="chooseActivity" msgid="7486876147751803333">"Fəaliyyət seçin"</string>
+ <string name="chooseUsbActivity" msgid="6894748416073583509">"USB cihaz üçün tətbiq seçin"</string>
+ <string name="noApplications" msgid="2991814273936504689">"Heç bir tətbiq bu əməliyyatı apara bilmir."</string>
+ <string name="aerr_title" msgid="1905800560317137752"></string>
+ <string name="aerr_application" msgid="932628488013092776">"Təəssüf ki, <xliff:g id="APPLICATION">%1$s</xliff:g> dayandı."</string>
+ <string name="aerr_process" msgid="4507058997035697579">"Təəssüf ki, <xliff:g id="PROCESS">%1$s</xliff:g> prosesi dayandı."</string>
+ <string name="anr_title" msgid="4351948481459135709"></string>
+ <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> cavab vermir.\n\nOnu bağlamaq istəyirsiniz?"</string>
+ <string name="anr_activity_process" msgid="5776209883299089767">"<xliff:g id="ACTIVITY">%1$s</xliff:g> aktivitisi cavab vermir. \n\nOnu bağlamaq istəyirsiniz?"</string>
+ <string name="anr_application_process" msgid="8941757607340481057">"<xliff:g id="APPLICATION">%1$s</xliff:g> cavab vermir. Onu bağlamaq istəyirsiniz?"</string>
+ <string name="anr_process" msgid="6513209874880517125">"Proses <xliff:g id="PROCESS">%1$s</xliff:g> cavab vermir. \n \n Onu bağlamaq istəyirsiniz?"</string>
+ <string name="force_close" msgid="8346072094521265605">"OK"</string>
+ <string name="report" msgid="4060218260984795706">"Şikayət edin"</string>
+ <string name="wait" msgid="7147118217226317732">"Gözlə"</string>
+ <string name="webpage_unresponsive" msgid="3272758351138122503">"Bu səhifə yararsızlaşıb.\n\nBağlamaq istəyirsiz?"</string>
+ <string name="launch_warning_title" msgid="1547997780506713581">"Tətbiq yönləndirildi"</string>
+ <string name="launch_warning_replace" msgid="6202498949970281412">"<xliff:g id="APP_NAME">%1$s</xliff:g> indi çalışır."</string>
+ <string name="launch_warning_original" msgid="188102023021668683">"<xliff:g id="APP_NAME">%1$s</xliff:g> ilk başladıldı."</string>
+ <string name="screen_compat_mode_scale" msgid="3202955667675944499">"Miqyas"</string>
+ <string name="screen_compat_mode_show" msgid="4013878876486655892">"Həmişə göstər"</string>
+ <string name="screen_compat_mode_hint" msgid="1064524084543304459">"Bunları Sistem ayarlarında yenidən aktivləşdir Yüklənmiş &gt; Tətbiqlər &gt;."</string>
+ <string name="smv_application" msgid="3307209192155442829">"Tətbiq <xliff:g id="APPLICATION">%1$s</xliff:g> (proses <xliff:g id="PROCESS">%2$s</xliff:g>) StrictMode siyasətini pozdu."</string>
+ <string name="smv_process" msgid="5120397012047462446">"<xliff:g id="PROCESS">%1$s</xliff:g> prosesi StrictMode siyasətini pozdu."</string>
+ <string name="android_upgrading_title" msgid="1584192285441405746">"Android təkmilləşdirilir..."</string>
+ <string name="android_upgrading_apk" msgid="7904042682111526169">"<xliff:g id="NUMBER_1">%2$d</xliff:g> əddədən <xliff:g id="NUMBER_0">%1$d</xliff:g> tətbiq optimallaşır."</string>
+ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Tətbiqlər başladılır."</string>
+ <string name="android_upgrading_complete" msgid="1405954754112999229">"Yükləmə başa çatır."</string>
+ <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> çalışır"</string>
+ <string name="heavy_weight_notification_detail" msgid="1721681741617898865">"Tətbiqə keçmək üçün toxunun"</string>
+ <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Tətbiqlərə keçilsin?"</string>
+ <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Bir tətbiq artıq işləyir. Digərini başlatmaq üçün onu dayandırmalısınız."</string>
+ <string name="old_app_action" msgid="493129172238566282">"<xliff:g id="OLD_APP">%1$s</xliff:g> bölməsinə qayıdın"</string>
+ <string name="old_app_description" msgid="2082094275580358049">"Yeni tətbiqi başlatmayın."</string>
+ <string name="new_app_action" msgid="5472756926945440706">"<xliff:g id="OLD_APP">%1$s</xliff:g> tətbiqini başladın"</string>
+ <string name="new_app_description" msgid="1932143598371537340">"Köhnə tətbiqi yadda saxlamadan dayandırın."</string>
+ <string name="sendText" msgid="5209874571959469142">"Mətn üçün əməliyyat seçin"</string>
+ <string name="volume_ringtone" msgid="6885421406845734650">"Zəngin səs gücü"</string>
+ <string name="volume_music" msgid="5421651157138628171">"Media həcmi"</string>
+ <string name="volume_music_hint_playing_through_bluetooth" msgid="9165984379394601533">"Bluetooth vasitəsilə oynadılır"</string>
+ <string name="volume_music_hint_silent_ringtone_selected" msgid="8310739960973156272">"Səssiz zəng"</string>
+ <string name="volume_call" msgid="3941680041282788711">"Daxili zəng səsi"</string>
+ <string name="volume_bluetooth_call" msgid="2002891926351151534">"Bluetooth zəng həcmi"</string>
+ <string name="volume_alarm" msgid="1985191616042689100">"Siqnal səsi"</string>
+ <string name="volume_notification" msgid="2422265656744276715">"Bildiriş səsi"</string>
+ <string name="volume_unknown" msgid="1400219669770445902">"Həcm"</string>
+ <string name="volume_icon_description_bluetooth" msgid="6538894177255964340">"Bluetooth həcmi"</string>
+ <string name="volume_icon_description_ringer" msgid="3326003847006162496">"Zəng səsi gücü"</string>
+ <string name="volume_icon_description_incall" msgid="8890073218154543397">"Zəng həcmi"</string>
+ <string name="volume_icon_description_media" msgid="4217311719665194215">"Media həcmi"</string>
+ <string name="volume_icon_description_notification" msgid="7044986546477282274">"Bildiriş səsi"</string>
+ <string name="ringtone_default" msgid="3789758980357696936">"Defolt rinqton"</string>
+ <string name="ringtone_default_with_actual" msgid="8129563480895990372">"Defolt rinqton (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_silent" msgid="7937634392408977062">"Heç biri"</string>
+ <string name="ringtone_picker_title" msgid="3515143939175119094">"Zəng səsləri"</string>
+ <string name="ringtone_unknown" msgid="5477919988701784788">"Naməlum rinqton"</string>
+ <plurals name="wifi_available">
+ <item quantity="one" msgid="6654123987418168693">"Wi-Fi şəbəkəsi mövcuddur"</item>
+ <item quantity="other" msgid="4192424489168397386">"Wi-Fi şəbəkələri mövcuddur"</item>
+ </plurals>
+ <plurals name="wifi_available_detailed">
+ <item quantity="one" msgid="1634101450343277345">"Wi-Fi şəbəkəni açın"</item>
+ <item quantity="other" msgid="7915895323644292768">"Açıq Wi-Fi şəbəkələri mövcuddur"</item>
+ </plurals>
+ <string name="wifi_available_sign_in" msgid="4029489716605255386">"Wi-Fi şəbəkəsinə daxil ol"</string>
+ <string name="network_available_sign_in" msgid="8495155593358054676">"Şəbəkəyə daxil olun"</string>
+ <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
+ <skip />
+ <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Wi-Fi\'a qoşulmaq alınmadı"</string>
+ <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" internet bağlantısı keyfiyyətsizdir."</string>
+ <string name="wifi_p2p_dialog_title" msgid="97611782659324517">"Wi-Fi Direct"</string>
+ <string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"Wi-Fi Direct əməliyyatını başlat. Bu Wi-Fi müştəri/hotspotu bağlayacaq."</string>
+ <string name="wifi_p2p_failed_message" msgid="3763669677935623084">"Wi-Fi Direct başladıla bilmədi."</string>
+ <string name="wifi_p2p_enabled_notification_title" msgid="2068321881673734886">"Wi-Fi Direct aktivdir"</string>
+ <string name="wifi_p2p_enabled_notification_message" msgid="1638949953993894335">"Ayarlar üçün toxunun"</string>
+ <string name="accept" msgid="1645267259272829559">"Qəbul edin"</string>
+ <string name="decline" msgid="2112225451706137894">"İmtina edin"</string>
+ <string name="wifi_p2p_invitation_sent_title" msgid="1318975185112070734">"Dəvətnamə göndərildi"</string>
+ <string name="wifi_p2p_invitation_to_connect_title" msgid="4958803948658533637">"Qoşulmaq üçün dəvət"</string>
+ <string name="wifi_p2p_from_message" msgid="570389174731951769">"Kimdən:"</string>
+ <string name="wifi_p2p_to_message" msgid="248968974522044099">"KimÉ™:"</string>
+ <string name="wifi_p2p_enter_pin_message" msgid="5920929550367828970">"Tələb olunan PİN kodu daxil edin:"</string>
+ <string name="wifi_p2p_show_pin_message" msgid="8530563323880921094">"PİN:"</string>
+ <string name="wifi_p2p_frequency_conflict_message" product="tablet" msgid="8012981257742232475">"Bu planşet <xliff:g id="DEVICE_NAME">%1$s</xliff:g> cihazına qoşulan zaman Wi-Fi şəbəkəsindən müvəqqəti ayrılmış olacaq"</string>
+ <string name="wifi_p2p_frequency_conflict_message" product="default" msgid="7363907213787469151">"Bu telefon <xliff:g id="DEVICE_NAME">%1$s</xliff:g> cihazına qoşulan zaman Wi-Fi şəbəkəsindən müvəqqəti ayrılmış olacaq"</string>
+ <string name="select_character" msgid="3365550120617701745">"Simvol daxil edin"</string>
+ <string name="sms_control_title" msgid="7296612781128917719">"SMS mesaj göndərilir"</string>
+ <string name="sms_control_message" msgid="3867899169651496433">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; çox sayda SMS mesaj göndərir. Bu tətbiqin mesaj göndərməyə davam etməsinə icazə verirsiniz?"</string>
+ <string name="sms_control_yes" msgid="3663725993855816807">"İcazə verin"</string>
+ <string name="sms_control_no" msgid="625438561395534982">"Rədd edin"</string>
+ <string name="sms_short_code_confirm_message" msgid="1645436466285310855">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; &lt;b&gt;<xliff:g id="DEST_ADDRESS">%2$s</xliff:g>&lt;/b&gt; ünvanına mesaj göndərmək istəyir."</string>
+ <string name="sms_short_code_details" msgid="3492025719868078457">"Bu, mobil hesabınıza "<font fgcolor="#ffffb060">"əlavə tariflərin tətbiq olunması"</font>" ilə nəticələnə bilər."</string>
+ <string name="sms_premium_short_code_details" msgid="5523826349105123687"><font fgcolor="#ffffb060">"Bu mobil hesabınızda ödənişlərə səbəb olacaq."</font></string>
+ <string name="sms_short_code_confirm_allow" msgid="4458878637111023413">"Göndər"</string>
+ <string name="sms_short_code_confirm_deny" msgid="2927389840209170706">"Ləğv et"</string>
+ <string name="sms_short_code_remember_choice" msgid="5289538592272218136">"Mənim seçimimi yadda saxla"</string>
+ <string name="sms_short_code_remember_undo_instruction" msgid="4960944133052287484">"Bunu sonra Ayarlarda dəyişə bilərsiniz &gt; Tətbiqlər"</string>
+ <string name="sms_short_code_confirm_always_allow" msgid="3241181154869493368">"Həmişə icazə ver"</string>
+ <string name="sms_short_code_confirm_never_allow" msgid="446992765774269673">"Heç vaxt icazə verməyin"</string>
+ <string name="sim_removed_title" msgid="6227712319223226185">"SIM kart çıxarıldı"</string>
+ <string name="sim_removed_message" msgid="2333164559970958645">"Cihazınızı etibarlı SIM kart ilə başladana kimi mobil şəbəkə əlçatmaz olacaq."</string>
+ <string name="sim_done_button" msgid="827949989369963775">"Bitdi"</string>
+ <string name="sim_added_title" msgid="3719670512889674693">"SİM kart əlavə edildi"</string>
+ <string name="sim_added_message" msgid="6599945301141050216">"Mobil şəbəkəyə qoşulmaq üçün cihazınızı yenidən başladın."</string>
+ <string name="sim_restart_button" msgid="4722407842815232347">"Yenidən başlat"</string>
+ <string name="time_picker_dialog_title" msgid="8349362623068819295">"Vaxt ayarlayın"</string>
+ <string name="date_picker_dialog_title" msgid="5879450659453782278">"Tarixi quraşdır"</string>
+ <string name="date_time_set" msgid="5777075614321087758">"Ayarlayın"</string>
+ <string name="date_time_done" msgid="2507683751759308828">"Hazırdır"</string>
+ <string name="perms_new_perm_prefix" msgid="8257740710754301407"><font size="12" fgcolor="#ff33b5e5">"YENİ: "</font></string>
+ <string name="perms_description_app" msgid="5139836143293299417">"<xliff:g id="APP_NAME">%1$s</xliff:g> tərəfindən təmin edilib."</string>
+ <string name="no_permissions" msgid="7283357728219338112">"Heç bir icazə tələb olunmur"</string>
+ <string name="perm_costs_money" msgid="4902470324142151116">"bununla sizdən xərc tutula bilər"</string>
+ <string name="usb_storage_activity_title" msgid="4465055157209648641">"USB toplu yaddaÅŸ"</string>
+ <string name="usb_storage_title" msgid="5901459041398751495">"USB qoÅŸuludur"</string>
+ <string name="usb_storage_message" product="nosdcard" msgid="3308538094316477839">"Siz USB vasitəsilə kompütere bağlandınız. Kompüter və Androidinizin USB yaddaşı arasında faylları kopyalamaq istəyirsinizsə, aşağıdakı düyməyə toxunun."</string>
+ <string name="usb_storage_message" product="default" msgid="805351000446037811">"Kompüterinizə USB ilə qoşulmusunuz. Faylları Androidinizin SD kartı ilə kompüteriniz arasında kopyalamaq istəyirsinizsə aşağıdakı düyməyə toxunun."</string>
+ <string name="usb_storage_button_mount" msgid="1052259930369508235">"USB yaddaşı aktivləşdirin"</string>
+ <string name="usb_storage_error_message" product="nosdcard" msgid="3017045217365540658">"USB yaddaşınızı USB kütləvi yaddaşı üçün istifadə edən zaman problem yarandı."</string>
+ <string name="usb_storage_error_message" product="default" msgid="2876018512716970313">"SD kartınızı USB kütləvi yaddaşı üçün istifadə edən zaman problem yarandı."</string>
+ <string name="usb_storage_notification_title" msgid="8175892554757216525">"USB qoÅŸuludur"</string>
+ <string name="usb_storage_notification_message" msgid="939822783828183763">"Faylları kompüterinizə kopyalamaq və ya kompüterinizdən kopyalamaq üçün toxunun."</string>
+ <string name="usb_storage_stop_notification_title" msgid="2336058396663516017">"USB yaddaşı söndürün"</string>
+ <string name="usb_storage_stop_notification_message" msgid="1656852098555623822">"USB yaddaşı söndürmək üçün toxunun."</string>
+ <string name="usb_storage_stop_title" msgid="660129851708775853">"USB yaddaÅŸ istifadÉ™ olunur"</string>
+ <string name="usb_storage_stop_message" product="nosdcard" msgid="4264025280777219521">"USB yaddaşı söndürmədən öncə Android\'in USB yaddaşını kompüterdən demontaj etdiyinizə (çıxardığınıza) əmin olun."</string>
+ <string name="usb_storage_stop_message" product="default" msgid="8043969782460613114">"USB yaddaşı söndürmədən öncə Android\'in USB yaddaşını kompüterdən demontaj etdiyinizə (çıxardığınıza) əmin olun."</string>
+ <string name="usb_storage_stop_button_mount" msgid="7060218034900696029">"USB yaddaşını söndür"</string>
+ <string name="usb_storage_stop_error_message" msgid="1970374898263063836">"USB yaddaşı söndürən zaman problem oldu. USB hostu demontaj etmənizi yoxlayın və yenidən cəhd edin."</string>
+ <string name="dlg_confirm_kill_storage_users_title" msgid="963039033470478697">"USB yaddaşı aktivləşdirin"</string>
+ <string name="dlg_confirm_kill_storage_users_text" msgid="5100428757107469454">"USB yaddaşı aktivləşdirsəniz, istifadə etdiyiniz bəzi tətbiqlər dayana bilər və USB yaddaş deaktiv edilənə qədər işləməyə bilər."</string>
+ <string name="dlg_error_title" msgid="7323658469626514207">"USB əməliyyatı uğursuzdur"</string>
+ <string name="dlg_ok" msgid="7376953167039865701">"OK"</string>
+ <string name="usb_mtp_notification_title" msgid="3699913097391550394">"Media cihazı kimi qoşuldu"</string>
+ <string name="usb_ptp_notification_title" msgid="1960817192216064833">"Kamera kimi bağlanıldı"</string>
+ <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"Quraşdırıcı kimi qoşulub"</string>
+ <string name="usb_accessory_notification_title" msgid="7848236974087653666">"USB aksesuara qoÅŸuldu"</string>
+ <string name="usb_notification_message" msgid="2290859399983720271">"Digər USB seçimləri üçün toxunun."</string>
+ <string name="extmedia_format_title" product="nosdcard" msgid="9020092196061007262">"USB yaddaşına format atılsın?"</string>
+ <string name="extmedia_format_title" product="default" msgid="3648415921526526069">"SD kart format edilsin?"</string>
+ <string name="extmedia_format_message" product="nosdcard" msgid="3934016853425761078">"USB yaddaşınızda yerləşdirilmiş bütün fayllar silinəcək. Bu addım geri dönülməzdir."</string>
+ <string name="extmedia_format_message" product="default" msgid="14131895027543830">"Kartınızdakı bütün məlumatlar itəcək."</string>
+ <string name="extmedia_format_button_format" msgid="4131064560127478695">"Format"</string>
+ <string name="adb_active_notification_title" msgid="6729044778949189918">"USB sazlama qoÅŸuludur"</string>
+ <string name="adb_active_notification_message" msgid="1016654627626476142">"USB debaqı deaktivasiya etmək üçün toxunun."</string>
+ <string name="select_input_method" msgid="4653387336791222978">"Daxiletmə metodunu seçin"</string>
+ <string name="configure_input_methods" msgid="9091652157722495116">"Daxiletmə üsullarını ayarlayın"</string>
+ <string name="use_physical_keyboard" msgid="6203112478095117625">"Fiziki klaviatura"</string>
+ <string name="hardware" msgid="7517821086888990278">"Hardware"</string>
+ <string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Klaviatura sxemi seçin"</string>
+ <string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"Klaviatura tərtibatı seçmək üçün toxunun."</string>
+ <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCÇDEÆFGÄžHXIİJKQLMNOÖPRSÅžTUÜVYZ"</string>
+ <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCÇDEÆFGÄžHİIJKLMNOÖPQRSÅžTUÜVWXYZ"</string>
+ <string name="candidates_style" msgid="4333913089637062257"><u>"namizədlər"</u></string>
+ <string name="ext_media_checking_notification_title" product="nosdcard" msgid="3449816005351468560">"USB yaddaş hazırlanır"</string>
+ <string name="ext_media_checking_notification_title" product="default" msgid="5457603418970994050">"SD kart hazırlanır"</string>
+ <string name="ext_media_checking_notification_message" msgid="8287319882926737053">"Səhvlər yoxlanılır."</string>
+ <string name="ext_media_nofs_notification_title" product="nosdcard" msgid="7788040745686229307">"Boş USB yaddaşı"</string>
+ <string name="ext_media_nofs_notification_title" product="default" msgid="780477838241212997">"BoÅŸ SD kart"</string>
+ <string name="ext_media_nofs_notification_message" product="nosdcard" msgid="7840121067427269500">"USB yaddaş boşdur və ya sistem tərəfindən dəstəklənməyən fayl sisteminə malikdir."</string>
+ <string name="ext_media_nofs_notification_message" product="default" msgid="8641065641786923604">"SD kart boşdur və ya sistem tərəfindən dəstəklənməyən fayl sisteminə malikdir."</string>
+ <string name="ext_media_unmountable_notification_title" product="nosdcard" msgid="2090046769532713563">"Zədəli USB yaddaş"</string>
+ <string name="ext_media_unmountable_notification_title" product="default" msgid="6410723906019100189">"Zədəli SD kart"</string>
+ <string name="ext_media_unmountable_notification_message" product="nosdcard" msgid="1795917578395333280">"SD yaddaş zədələnib. Onu format etməyə çalışın."</string>
+ <string name="ext_media_unmountable_notification_message" product="default" msgid="1753898567525568253">"SD kart zədələnib. Onu format etməyə çalışın."</string>
+ <string name="ext_media_badremoval_notification_title" product="nosdcard" msgid="1661683031330951073">"USB yaddaşı gözlənilmədən çıxarıldı"</string>
+ <string name="ext_media_badremoval_notification_title" product="default" msgid="6872152882604407837">"SD kart gözlənilmədən çıxarıldı"</string>
+ <string name="ext_media_badremoval_notification_message" product="nosdcard" msgid="4329848819865594241">"Məlumat itkisinin qarşısını almaq üçün USB yaddaşı çıxarmazdan əvvəl onu demontaj edin."</string>
+ <string name="ext_media_badremoval_notification_message" product="default" msgid="7260183293747448241">"Data itkisinin qarşısını almaq üçün SD kartı çıxarmadan öncə demontaj edin."</string>
+ <string name="ext_media_safe_unmount_notification_title" product="nosdcard" msgid="3967973893270360230">"USB yaddaş çıxarmaq üçün təhlükəsizdir"</string>
+ <string name="ext_media_safe_unmount_notification_title" product="default" msgid="6729801130790616200">"SD kart təhlükəsiz çıxarıla bilər"</string>
+ <string name="ext_media_safe_unmount_notification_message" product="nosdcard" msgid="6142195361606493530">"Siz USB yaddaşı təhlükəsiz çıxara bilərsiniz."</string>
+ <string name="ext_media_safe_unmount_notification_message" product="default" msgid="568841278138377604">"Siz SD kartı təhlükəsiz çıxara bilərsiniz."</string>
+ <string name="ext_media_nomedia_notification_title" product="nosdcard" msgid="4486377230140227651">"SilinmiÅŸ USB yaddaÅŸ"</string>
+ <string name="ext_media_nomedia_notification_title" product="default" msgid="8902518030404381318">"SD kart çıxarıldı"</string>
+ <string name="ext_media_nomedia_notification_message" product="nosdcard" msgid="6921126162580574143">"USB yaddaş çıxarıldı. Yeni media əlavə edin."</string>
+ <string name="ext_media_nomedia_notification_message" product="default" msgid="3870120652983659641">"SD kart çıxarıldı. Yenisini daxil edin."</string>
+ <string name="activity_list_empty" msgid="1675388330786841066">"Uyğun gələn fəaliyyət tapılmadı."</string>
+ <string name="permlab_pkgUsageStats" msgid="8787352074326748892">"komponent istifadəsi statistikasını güncəlləyir"</string>
+ <string name="permdesc_pkgUsageStats" msgid="1106612424254277630">"Tətbiqə toplanmış istifadə statistikasını dəyişməyə imkan verir. Normal tətbiqlər tərəfindən istifadə olunmur."</string>
+ <string name="permlab_copyProtectedData" msgid="4341036311211406692">"məzmunu kopyala"</string>
+ <string name="permdesc_copyProtectedData" msgid="4390697124288317831">"Tətbiqə kontenti kopyalamaq üçün defolt konteyner servisini çağırmaq icazəsi verir. Normal tətbiqlər tərəfindən istifadə edilmir."</string>
+ <string name="permlab_route_media_output" msgid="1642024455750414694">"Media çıxışını yönləndirir"</string>
+ <string name="permdesc_route_media_output" msgid="4932818749547244346">"Tətbiqə media çıxışını digər xarici cihazlara yönləndirmək imkanı verir."</string>
+ <string name="permlab_access_keyguard_secure_storage" msgid="7565552237977815047">"Keyguard təhlükəsiz yaddaşa çıxış"</string>
+ <string name="permdesc_access_keyguard_secure_storage" msgid="5866245484303285762">"Tətbiqə keguard təhlükəsiz yaddaşa çatmağa icazə verir."</string>
+ <string name="permlab_control_keyguard" msgid="172195184207828387">"Klaviatura kilidinin görülməsini və gizlədilməsini idarə edir"</string>
+ <string name="permdesc_control_keyguard" msgid="3043732290518629061">"Tətbiqə keguardı idarə etmək icazəsi verir."</string>
+ <string name="tutorial_double_tap_to_zoom_message_short" msgid="4070433208160063538">"Zoom nəzarəti üçün iki dəfə toxunun"</string>
+ <string name="gadget_host_error_inflating" msgid="4882004314906466162">"Widget əlavə edilə bilmədi."</string>
+ <string name="ime_action_go" msgid="8320845651737369027">"Get"</string>
+ <string name="ime_action_search" msgid="658110271822807811">"Axtar"</string>
+ <string name="ime_action_send" msgid="2316166556349314424">"Göndər"</string>
+ <string name="ime_action_next" msgid="3138843904009813834">"Növbəti"</string>
+ <string name="ime_action_done" msgid="8971516117910934605">"Tamam"</string>
+ <string name="ime_action_previous" msgid="1443550039250105948">"ÆvvÉ™lki"</string>
+ <string name="ime_action_default" msgid="2840921885558045721">"İcra edin"</string>
+ <string name="dial_number_using" msgid="5789176425167573586">"<xliff:g id="NUMBER">%s</xliff:g> istifadə etməklə\nnömrə yığın"</string>
+ <string name="create_contact_using" msgid="4947405226788104538">"<xliff:g id="NUMBER">%s</xliff:g>istifadə edərək kontakt yaradın\n"</string>
+ <string name="grant_credentials_permission_message_header" msgid="2106103817937859662">"Aşağıdakı bir və ya daha çox tətbiqlər indi və gələcəkdə hesabınıza daxil olmaq üçün icazə istəyir."</string>
+ <string name="grant_credentials_permission_message_footer" msgid="3125211343379376561">"Bu istəyə izn vermək istəyirsiniz?"</string>
+ <string name="grant_permissions_header_text" msgid="6874497408201826708">"GiriÅŸ sorÄŸusu"</string>
+ <string name="allow" msgid="7225948811296386551">"İcazə verin"</string>
+ <string name="deny" msgid="2081879885755434506">"Rədd et"</string>
+ <string name="permission_request_notification_title" msgid="6486759795926237907">"İcazə tələb olunur"</string>
+ <string name="permission_request_notification_with_subtitle" msgid="8530393139639560189">\n" hesabı üçün<xliff:g id="ACCOUNT">%s</xliff:g> icazə sorğusu göndərildi."</string>
+ <string name="input_method_binding_label" msgid="1283557179944992649">"DaxiletmÉ™ metodu"</string>
+ <string name="sync_binding_label" msgid="3687969138375092423">"Sinxronizasiya"</string>
+ <string name="accessibility_binding_label" msgid="4148120742096474641">"Ælçatımlılıq"</string>
+ <string name="wallpaper_binding_label" msgid="1240087844304687662">"Divar kağızı"</string>
+ <string name="chooser_wallpaper" msgid="7873476199295190279">"Divar kağızını dəyişin"</string>
+ <string name="notification_listener_binding_label" msgid="2014162835481906429">"Bildiriş dinləyən"</string>
+ <string name="vpn_title" msgid="19615213552042827">"VPN aktivləşdirildi"</string>
+ <string name="vpn_title_long" msgid="6400714798049252294">"VPN <xliff:g id="APP">%s</xliff:g> tərəfindən aktivləşdirilib"</string>
+ <string name="vpn_text" msgid="3011306607126450322">"Şəbəkəni idarə etmək üçün toxunun."</string>
+ <string name="vpn_text_long" msgid="6407351006249174473">"<xliff:g id="SESSION">%s</xliff:g> sessiyaya qoşuludur. Şəbəkəni idarə etmək üçün toxunun."</string>
+ <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Həmişə aktiv VPN bağlanır..."</string>
+ <string name="vpn_lockdown_connected" msgid="8202679674819213931">"VPN bağlantısı həmişə aktiv"</string>
+ <string name="vpn_lockdown_error" msgid="6009249814034708175">"Həmişə aktiv VPN xətası"</string>
+ <string name="vpn_lockdown_config" msgid="6415899150671537970">"Konfiqurə etmək üçün toxun"</string>
+ <string name="upload_file" msgid="2897957172366730416">"Fayl seçin"</string>
+ <string name="no_file_chosen" msgid="6363648562170759465">"Heç bir fayl seçilməyib"</string>
+ <string name="reset" msgid="2448168080964209908">"Sıfırlayın"</string>
+ <string name="submit" msgid="1602335572089911941">"Göndər"</string>
+ <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Avtomobil rejimi aktivdir"</string>
+ <string name="car_mode_disable_notification_message" msgid="8035230537563503262">"Avtomobil rejimindən çıxmaq üçün toxunun."</string>
+ <string name="tethered_notification_title" msgid="3146694234398202601">"Tezerinq vÉ™ ya hotspot aktivdir"</string>
+ <string name="tethered_notification_message" msgid="6857031760103062982">"Quraşdırmaq üçün toxunun."</string>
+ <string name="back_button_label" msgid="2300470004503343439">"Geri"</string>
+ <string name="next_button_label" msgid="1080555104677992408">"Növbəti"</string>
+ <string name="skip_button_label" msgid="1275362299471631819">"Keç"</string>
+ <string name="throttle_warning_notification_title" msgid="4890894267454867276">"Yüksək mobil data istifadəsi"</string>
+ <string name="throttle_warning_notification_message" msgid="3340822228599337743">"Mobil data istifadəsi haqqında daha çox öyrənmək üçün toxunun."</string>
+ <string name="throttled_notification_title" msgid="6269541897729781332">"Mobil data limiti keçildi"</string>
+ <string name="throttled_notification_message" msgid="5443457321354907181">"Mobil data istifadəsi haqqında daha çox öyrənmək üçün toxunun."</string>
+ <string name="no_matches" msgid="8129421908915840737">"UyÄŸunluq yoxdur"</string>
+ <string name="find_on_page" msgid="1946799233822820384">"Səhifədə tap"</string>
+ <plurals name="matches_found">
+ <item quantity="one" msgid="8167147081136579439">"1 uyÄŸunluq"</item>
+ <item quantity="other" msgid="4641872797067609177">"<xliff:g id="INDEX">%d</xliff:g> ədəddən <xliff:g id="TOTAL">%d</xliff:g>"</item>
+ </plurals>
+ <string name="action_mode_done" msgid="7217581640461922289">"Hazırdır"</string>
+ <string name="progress_unmounting" product="nosdcard" msgid="3923810448507612746">"USB yaddaşı qaldırılır..."</string>
+ <string name="progress_unmounting" product="default" msgid="1327894998409537190">"SD kart demontaj edilir..."</string>
+ <string name="progress_erasing" product="nosdcard" msgid="4521573321524340058">"USB yaddaÅŸ silinir..."</string>
+ <string name="progress_erasing" product="default" msgid="6596988875507043042">"SD kart silinir..."</string>
+ <string name="format_error" product="nosdcard" msgid="6299769563624776948">"USB yaddaşı silinə bilmədi."</string>
+ <string name="format_error" product="default" msgid="7315248696644510935">"SD kartı silmək mümkün olmadı."</string>
+ <string name="media_bad_removal" msgid="7960864061016603281">"SD kart demontaj edilmədən öncə çıxarıldı."</string>
+ <string name="media_checking" product="nosdcard" msgid="418188720009569693">"USB yaddaş hazırda yoxlanılır."</string>
+ <string name="media_checking" product="default" msgid="7334762503904827481">"SD kart hazırda yoxlanılır."</string>
+ <string name="media_removed" msgid="7001526905057952097">"SD kart çıxarılıb."</string>
+ <string name="media_shared" product="nosdcard" msgid="5830814349250834225">"SD kart hazırda kompüter tərəfindən istifadə edilir."</string>
+ <string name="media_shared" product="default" msgid="5706130568133540435">"SD kart hal-hazırda kompüter tərəfindən istifadə edilir."</string>
+ <string name="media_unknown_state" msgid="729192782197290385">"Naməlum vəziyyətdə xarici media."</string>
+ <string name="share" msgid="1778686618230011964">"Paylaşın"</string>
+ <string name="find" msgid="4808270900322985960">"Tapın"</string>
+ <string name="websearch" msgid="4337157977400211589">"Veb Axtarış"</string>
+ <string name="find_next" msgid="5742124618942193978">"Sonrakını tap"</string>
+ <string name="find_previous" msgid="2196723669388360506">"ÆvvÉ™lkini tap"</string>
+ <string name="gpsNotifTicker" msgid="5622683912616496172">"<xliff:g id="NAME">%s</xliff:g> tərəfindən məkan sorğusu"</string>
+ <string name="gpsNotifTitle" msgid="5446858717157416839">"Məkan sorğusu"</string>
+ <string name="gpsNotifMessage" msgid="1374718023224000702">"<xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>) tərəfindən tələb edilib"</string>
+ <string name="gpsVerifYes" msgid="2346566072867213563">"Bəli"</string>
+ <string name="gpsVerifNo" msgid="1146564937346454865">"Xeyr"</string>
+ <string name="sync_too_many_deletes" msgid="5296321850662746890">"Limiti keçəni silin"</string>
+ <string name="sync_too_many_deletes_desc" msgid="496551671008694245">"<xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g> üçün <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> silinmiş fayl var, <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g> hesabı. Nə etmək istəyirsiniz?"</string>
+ <string name="sync_really_delete" msgid="2572600103122596243">"Elementləri sil"</string>
+ <string name="sync_undo_deletes" msgid="2941317360600338602">"Silinənləri geri qaytar"</string>
+ <string name="sync_do_nothing" msgid="3743764740430821845">"İndilik heç nə etmə"</string>
+ <string name="choose_account_label" msgid="5655203089746423927">"Hesab seçin"</string>
+ <string name="add_account_label" msgid="2935267344849993553">"Hesab əlavə et"</string>
+ <string name="add_account_button_label" msgid="3611982894853435874">"Hesab əlavə edin"</string>
+ <string name="number_picker_increment_button" msgid="2412072272832284313">"Artır"</string>
+ <string name="number_picker_decrement_button" msgid="476050778386779067">"Azaldın"</string>
+ <string name="number_picker_increment_scroll_mode" msgid="3073101067441638428">"<xliff:g id="VALUE">%s</xliff:g> toxunun və basaraq saxlayın."</string>
+ <string name="number_picker_increment_scroll_action" msgid="9101473045891835490">"Artırmaq üçün yuxarı, azaltmaq üçün aşağı sürüşdürün."</string>
+ <string name="time_picker_increment_minute_button" msgid="8865885114028614321">"Dəqiqə artırın"</string>
+ <string name="time_picker_decrement_minute_button" msgid="6246834937080684791">"Dəqiqəni azalt"</string>
+ <string name="time_picker_increment_hour_button" msgid="3652056055810223139">"Saatı artırın"</string>
+ <string name="time_picker_decrement_hour_button" msgid="1377479863429214792">"Saatı azaldın"</string>
+ <string name="time_picker_increment_set_pm_button" msgid="4147590696151230863">"PM qurun"</string>
+ <string name="time_picker_decrement_set_am_button" msgid="8302140353539486752">"AM qurun"</string>
+ <string name="date_picker_increment_month_button" msgid="5369998479067934110">"Artma ayı"</string>
+ <string name="date_picker_decrement_month_button" msgid="1832698995541726019">"Ayı azaldın"</string>
+ <string name="date_picker_increment_day_button" msgid="7130465412308173903">"Artma günü"</string>
+ <string name="date_picker_decrement_day_button" msgid="4131881521818750031">"Azalma günü"</string>
+ <string name="date_picker_increment_year_button" msgid="6318697384310808899">"Artım ili"</string>
+ <string name="date_picker_decrement_year_button" msgid="4482021813491121717">"Azalma ili"</string>
+ <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
+ <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"Ləğv et"</string>
+ <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Sil"</string>
+ <string name="keyboardview_keycode_done" msgid="1992571118466679775">"Hazırdır"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Rejim dəyişikliyi"</string>
+ <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
+ <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Daxil olun"</string>
+ <string name="activitychooserview_choose_application" msgid="2125168057199941199">"Tətbiq seçin"</string>
+ <string name="shareactionprovider_share_with" msgid="806688056141131819">"Bununla paylaşın"</string>
+ <string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> ilə paylaşın"</string>
+ <string name="content_description_sliding_handle" msgid="415975056159262248">"Sürüşən qulp. Toxunaraq basılı tutun."</string>
+ <string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> üçün yuxarı sürüşdürün."</string>
+ <string name="description_direction_down" msgid="5087739728639014595">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> üçün aşağı sürüşdürün."</string>
+ <string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> üçün sola sürüşdür."</string>
+ <string name="description_direction_right" msgid="8034433242579600980">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> üçün sağa sürüşdür."</string>
+ <string name="description_target_unlock" msgid="2228524900439801453">"Kilidi aç"</string>
+ <string name="description_target_camera" msgid="969071997552486814">"Kamera"</string>
+ <string name="description_target_silent" msgid="893551287746522182">"Səssiz"</string>
+ <string name="description_target_soundon" msgid="30052466675500172">"Səs açıqdır"</string>
+ <string name="description_target_search" msgid="3091587249776033139">"Axtar"</string>
+ <string name="description_target_unlock_tablet" msgid="3833195335629795055">"Kilidi açmaq üçün vurun."</string>
+ <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Parolların səsləndirilməsi üçün qulaqlıqları taxın."</string>
+ <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Nöqtə."</string>
+ <string name="action_bar_home_description" msgid="5293600496601490216">"EvÉ™ gedin"</string>
+ <string name="action_bar_up_description" msgid="2237496562952152589">"Yuxarı gedin"</string>
+ <string name="action_menu_overflow_description" msgid="2295659037509008453">"ÆlavÉ™ seçimlÉ™r"</string>
+ <string name="action_bar_home_description_format" msgid="7965984360903693903">"%1$s, %2$s"</string>
+ <string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string>
+ <string name="storage_internal" msgid="4891916833657929263">"Daxili yaddaÅŸ"</string>
+ <string name="storage_sd_card" msgid="3282948861378286745">"SD kart"</string>
+ <string name="storage_usb" msgid="3017954059538517278">"USB yaddaÅŸ"</string>
+ <string name="extract_edit_menu_button" msgid="8940478730496610137">"RedaktÉ™ et"</string>
+ <string name="data_usage_warning_title" msgid="1955638862122232342">"Data istifadə xəbərdarlığı"</string>
+ <string name="data_usage_warning_body" msgid="2814673551471969954">"İstifadə və ayarları görmək üçün toxunun"</string>
+ <string name="data_usage_3g_limit_title" msgid="7093334419518706686">"2G-3G data deaktivdir"</string>
+ <string name="data_usage_4g_limit_title" msgid="7636489436819470761">"4G data deaktiv edildi"</string>
+ <string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"Mobil data deaktivdir"</string>
+ <string name="data_usage_wifi_limit_title" msgid="8992154736441284865">"Wi-Fi data deaktiv edildi"</string>
+ <string name="data_usage_limit_body" msgid="3317964706973601386">"Aktivləşdirmək üçün toxunun."</string>
+ <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"2G-3G data limiti aşılıb"</string>
+ <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"4G data limiti keçildi"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"Mobil data limiti keçildi"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"Wi-Fi data limiti keçildi"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"<xliff:g id="SIZE">%s</xliff:g> müəyyən edilmiş limit aşır."</string>
+ <string name="data_usage_restricted_title" msgid="5965157361036321914">"Arxaplan datası məhdudlaşdırıldı"</string>
+ <string name="data_usage_restricted_body" msgid="6741521330997452990">"Məhdudiyyəti aradan qaldırmaq üçün toxunun"</string>
+ <string name="ssl_certificate" msgid="6510040486049237639">"Təhlükəsizlik sertifikatı"</string>
+ <string name="ssl_certificate_is_valid" msgid="6825263250774569373">"Bu sertifikat etibarlıdır."</string>
+ <string name="issued_to" msgid="454239480274921032">"Verilib:"</string>
+ <string name="common_name" msgid="2233209299434172646">"Ümumi ad:"</string>
+ <string name="org_name" msgid="6973561190762085236">"Təşkilat:"</string>
+ <string name="org_unit" msgid="7265981890422070383">"Təşkilati vahid:"</string>
+ <string name="issued_by" msgid="2647584988057481566">"Tərəfindən verilib:"</string>
+ <string name="validity_period" msgid="8818886137545983110">"Keçərlilik:"</string>
+ <string name="issued_on" msgid="5895017404361397232">"Dərc olunub:"</string>
+ <string name="expires_on" msgid="3676242949915959821">"Bitmə vaxtı:"</string>
+ <string name="serial_number" msgid="758814067660862493">"Seriya nömrəsi:"</string>
+ <string name="fingerprints" msgid="4516019619850763049">"Barmaq izləri:"</string>
+ <string name="sha256_fingerprint" msgid="4391271286477279263">"SHA-256 barmaq izi:"</string>
+ <string name="sha1_fingerprint" msgid="7930330235269404581">"SHA-1 barmaq izi:"</string>
+ <string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Hamısını seçın"</string>
+ <string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Fəaliyyəti seçin"</string>
+ <string name="share_action_provider_share_with" msgid="5247684435979149216">"Bununla paylaşın"</string>
+ <string name="status_bar_device_locked" msgid="3092703448690669768">"Cihaz kilidləndi."</string>
+ <string name="list_delimeter" msgid="3975117572185494152">", "</string>
+ <string name="sending" msgid="3245653681008218030">"Göndərilir..."</string>
+ <string name="launchBrowserDefault" msgid="2057951947297614725">"Brauzer işə salınsın?"</string>
+ <string name="SetupCallDefault" msgid="5834948469253758575">"Zəngi qəbul edək?"</string>
+ <string name="activity_resolver_use_always" msgid="8017770747801494933">"Həmişə"</string>
+ <string name="activity_resolver_use_once" msgid="2404644797149173758">"Sadəcə bir dəfə"</string>
+ <string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"PlanÅŸet"</string>
+ <string name="default_audio_route_name" product="default" msgid="4239291273420140123">"Telefon"</string>
+ <string name="default_audio_route_name_headphones" msgid="8119971843803439110">"Qulaqlıq"</string>
+ <string name="default_audio_route_name_dock_speakers" msgid="6240602982276591864">"Dok spikerlər"</string>
+ <string name="default_media_route_name_hdmi" msgid="2450970399023478055">"HDMI"</string>
+ <string name="default_audio_route_category_name" msgid="3722811174003886946">"Sistem"</string>
+ <string name="bluetooth_a2dp_audio_route_name" msgid="8575624030406771015">"Bluetooth audio"</string>
+ <string name="wireless_display_route_description" msgid="9070346425023979651">"Simsiz ekran"</string>
+ <string name="media_route_chooser_grouping_done" msgid="7966438307723317169">"Hazırdır"</string>
+ <string name="media_route_button_content_description" msgid="5758553567065145276">"Media çıxışı"</string>
+ <string name="media_route_status_scanning" msgid="7279908761758293783">"Skan edilir..."</string>
+ <string name="media_route_status_connecting" msgid="6422571716007825440">"QoÅŸulur..."</string>
+ <string name="media_route_status_available" msgid="6983258067194649391">"Ælçatımlı"</string>
+ <string name="media_route_status_not_available" msgid="6739899962681886401">"Ælçatımlı deyil"</string>
+ <string name="media_route_status_in_use" msgid="4533786031090198063">"İstifadə olunur"</string>
+ <string name="display_manager_built_in_display_name" msgid="2583134294292563941">"Daxili ekran"</string>
+ <string name="display_manager_hdmi_display_name" msgid="1555264559227470109">"HDMI Ekran"</string>
+ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Örtük #<xliff:g id="ID">%1$d</xliff:g>"</string>
+ <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
+ <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", təhlükəsiz"</string>
+ <string name="wifi_display_notification_title" msgid="2223050649240326557">"Simsiz ekran qoÅŸulub"</string>
+ <string name="wifi_display_notification_message" msgid="4498802012464170685">"Bu ekran digər cihazda göstərir"</string>
+ <string name="wifi_display_notification_disconnect" msgid="6183754463561153372">"Bağlantını kəsin"</string>
+ <string name="kg_emergency_call_label" msgid="684946192523830531">"Təcili zəng"</string>
+ <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Åžablonu unutmuÅŸam"</string>
+ <string name="kg_wrong_pattern" msgid="1850806070801358830">"Yanlış Model"</string>
+ <string name="kg_wrong_password" msgid="2333281762128113157">"Yanlış Şifrə"</string>
+ <string name="kg_wrong_pin" msgid="1131306510833563801">"PIN səhvdir"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"<xliff:g id="NUMBER">%1$d</xliff:g> saniyə sonra yenidən cəhd edin."</string>
+ <string name="kg_pattern_instructions" msgid="398978611683075868">"Şablonunuzu çəkin"</string>
+ <string name="kg_sim_pin_instructions" msgid="2319508550934557331">"SIM PIN kodu daxil edin"</string>
+ <string name="kg_pin_instructions" msgid="2377242233495111557">"PİN kodu daxil edin"</string>
+ <string name="kg_password_instructions" msgid="5753646556186936819">"Parol daxil edin"</string>
+ <string name="kg_puk_enter_puk_hint" msgid="453227143861735537">"SIM indi deaktivdir. Davam etmÉ™k üçün PUK kodu daxil edin. ÆlavÉ™ mÉ™lumat üçün operatora müraciÉ™t edin."</string>
+ <string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"İstədiyiniz PİN kodu daxil edin"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"İstədiyiniz PIN kodu təsdiqləyin"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"SİM kartın kilidi açılır..."</string>
+ <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"Yanlış PİN kod."</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"4-dən 8-ə qədər rəqəmi olan PIN yazın."</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"PUK kod 8 rəqəm və ya daha çox olmalıdır."</string>
+ <string name="kg_invalid_puk" msgid="3638289409676051243">"Düzgün PUK kodu yenidən daxil edin. Təkrarlanan cəhdlər SIM\'i birdəfəlik sıradan çıxaracaq."</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"PIN kodları uyğun deyil"</string>
+ <string name="kg_login_too_many_attempts" msgid="6486842094005698475">"Həddindən çox cəhd edildi!"</string>
+ <string name="kg_login_instructions" msgid="1100551261265506448">"Kilidi açmaq üçün Google hesabınız ilə daxil olun."</string>
+ <string name="kg_login_username_hint" msgid="5718534272070920364">"İstifadəçi adı (e-poçt)"</string>
+ <string name="kg_login_password_hint" msgid="9057289103827298549">"ÅžifrÉ™"</string>
+ <string name="kg_login_submit_button" msgid="5355904582674054702">"Daxil ol"</string>
+ <string name="kg_login_invalid_input" msgid="5754664119319872197">"Yanlış istifadəçi adı və ya parol."</string>
+ <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"İstifadəçi adınızı və ya parolunuzu unutmusunuz?\n "<b>"google.com/accounts/recovery"</b>" linkinə daxil olun."</string>
+ <string name="kg_login_checking_password" msgid="1052685197710252395">"Hesab yoxlanılır..."</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"PIN kodunuzu <xliff:g id="NUMBER_0">%d</xliff:g> dəfə yanlış daxil etdiniz.\n\n <xliff:g id="NUMBER_1">%d</xliff:g> saniyə ərzində yenidən yoxlayın"</string>
+ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"Şifrənizi <xliff:g id="NUMBER_0">%d</xliff:g> dəfə yanlış daxil etdiniz. \n\n <xliff:g id="NUMBER_1">%d</xliff:g> saniyə ərzində yenidən yoxlayın."</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"Modelinizi <xliff:g id="NUMBER_0">%d</xliff:g> dəfə yanlış çəkmisiniz.\n\n <xliff:g id="NUMBER_1">%d</xliff:g> saniyə ərzində yenidən yoxlayın"</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1575557200627128949">"Siz planşet kilidini açmaq üçün <xliff:g id="NUMBER_0">%d</xliff:g> dəfə uğursuz cəhd etmisiniz. <xliff:g id="NUMBER_1">%d</xliff:g> dəfə də uğursuz cəhd etsəniz, planşet fabrik ayarlarına sıfırlanacaq və bütün məlumatlarınız itəcək."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="4051015943038199910">"Siz telefon kilidini açmaq üçün <xliff:g id="NUMBER_0">%d</xliff:g> dəfə uğursuz cəhd etmisiniz. <xliff:g id="NUMBER_1">%d</xliff:g> dəfə də uğursuz cəhd etsəniz, telefon fabrik ayarlarına sıfırlanacaq və bütün məlumatlarınız itəcək."</string>
+ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="2072996269148483637">"Siz planşet kilidini açmaq üçün <xliff:g id="NUMBER">%d</xliff:g> dəfə uğursuz cəhd etmisiniz. Planşet fabrik ayarlarına sıfırlanacaq."</string>
+ <string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"Siz telefonun kilidini açmaq üçün <xliff:g id="NUMBER">%d</xliff:g> yanlış cəhd etmisiniz. Telefon artıq defolt zavod halına sıfırlanacaq."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Siz kilidi açmaq üçün şablonu <xliff:g id="NUMBER_0">%d</xliff:g> dəfə səhv çəkdiniz. <xliff:g id="NUMBER_1">%d</xliff:g> daha uğursuz cəhddən sonra planşetinizin kilidini e-poçt hesabınızla açmaq tələb olunacaq.\n\n <xliff:g id="NUMBER_2">%d</xliff:g> saniyə ərzində bir daha yoxlayın."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Siz artıq modeli <xliff:g id="NUMBER_0">%d</xliff:g> dəfə yanlış daxil etmisiniz.<xliff:g id="NUMBER_1">%d</xliff:g> dəfə də yanlış daxil etsəniz, telefonun kilidinin açılması üçün elektron poçt ünvanınız tələb olunacaq.\n\n <xliff:g id="NUMBER_2">%d</xliff:g> saniyə ərzində yenidən cəhd edin."</string>
+ <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" - "</string>
+ <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Yığışdır"</string>
+ <string name="safe_media_volume_warning" product="default" msgid="7324161939475478066">"Səs gücü tövsiyə edilən səviyyədən artırılsın?\nUzun müddət yüksək səs gücü ilə dinləmə Sizin eşitmə qabiliyyətinizə mənfi təsir edə bilər."</string>
+ <string name="continue_to_enable_accessibility" msgid="1626427372316070258">"Ælçatımlığı aktivləşdirmÉ™k üçün iki barmağınızı basılı saxlayın."</string>
+ <string name="accessibility_enabled" msgid="1381972048564547685">"Ælçatımlılıq aktivləşdirildi"</string>
+ <string name="enable_accessibility_canceled" msgid="3833923257966635673">"Giriş imkanı ləğv edilib."</string>
+ <string name="user_switched" msgid="3768006783166984410">"Cari istifadəçi <xliff:g id="NAME">%1$s</xliff:g>."</string>
+ <string name="owner_name" msgid="2716755460376028154">"Sahib"</string>
+ <string name="error_message_title" msgid="4510373083082500195">"Xəta"</string>
+ <string name="app_no_restricted_accounts" msgid="5739463249673727736">"Bu tətbiq məhdud profillər üçün hesabları dəstəkləmir."</string>
+ <string name="app_not_found" msgid="3429141853498927379">"Bu əməliyyatı idarə etmək üçün heç bir tətbiq tapılmadı."</string>
+ <string name="revoke" msgid="5404479185228271586">"Ləğv edin"</string>
+ <string name="mediaSize_iso_a0" msgid="7875427489420821793">"ISO A0"</string>
+ <string name="mediaSize_iso_a1" msgid="3760734499050875356">"ISO A1"</string>
+ <string name="mediaSize_iso_a2" msgid="5973266378020144382">"ISO A2"</string>
+ <string name="mediaSize_iso_a3" msgid="1373407105687300884">"ISO A3"</string>
+ <string name="mediaSize_iso_a4" msgid="6689772807982597254">"ISO A4"</string>
+ <string name="mediaSize_iso_a5" msgid="5353549652015741040">"ISO A5"</string>
+ <string name="mediaSize_iso_a6" msgid="8585038048674911907">"ISO A6"</string>
+ <string name="mediaSize_iso_a7" msgid="6641836716963839119">"ISO A7"</string>
+ <string name="mediaSize_iso_a8" msgid="7571139437465693355">"ISO A8"</string>
+ <string name="mediaSize_iso_a9" msgid="1378455891957115079">"ISO A9"</string>
+ <string name="mediaSize_iso_a10" msgid="2480747457429475344">"ISO A10"</string>
+ <string name="mediaSize_iso_b0" msgid="3965935097661108039">"ISO B0"</string>
+ <string name="mediaSize_iso_b1" msgid="2505753285010115437">"ISO B1"</string>
+ <string name="mediaSize_iso_b2" msgid="8763874709859458453">"ISO B2"</string>
+ <string name="mediaSize_iso_b3" msgid="4210506688191764076">"ISO B3"</string>
+ <string name="mediaSize_iso_b4" msgid="5749404165888526034">"B4 ISO"</string>
+ <string name="mediaSize_iso_b5" msgid="7640627414621904733">"ISO B5"</string>
+ <string name="mediaSize_iso_b6" msgid="7342988864712748544">"ISO B6"</string>
+ <string name="mediaSize_iso_b7" msgid="5069844065235382429">"ISO B7"</string>
+ <string name="mediaSize_iso_b8" msgid="7316818922278779774">"ISO B8"</string>
+ <string name="mediaSize_iso_b9" msgid="5414727094026532341">"ISO B9"</string>
+ <string name="mediaSize_iso_b10" msgid="5251253731832048185">"ISO B10"</string>
+ <string name="mediaSize_iso_c0" msgid="4003138342671964217">"ISO C0"</string>
+ <string name="mediaSize_iso_c1" msgid="1935188063393553008">"ISO C1"</string>
+ <string name="mediaSize_iso_c2" msgid="3197307969712069904">"ISO C2"</string>
+ <string name="mediaSize_iso_c3" msgid="4335826087321913508">"ISO C3"</string>
+ <string name="mediaSize_iso_c4" msgid="3745639598281015005">"ISO C4"</string>
+ <string name="mediaSize_iso_c5" msgid="8269457765822791013">"ISO C5"</string>
+ <string name="mediaSize_iso_c6" msgid="566666105260346930">"ISO C6"</string>
+ <string name="mediaSize_iso_c7" msgid="8678413180782608498">"ISO C7"</string>
+ <string name="mediaSize_iso_c8" msgid="8392376206627041730">"ISO C8"</string>
+ <string name="mediaSize_iso_c9" msgid="9191613372324845405">"ISO C9"</string>
+ <string name="mediaSize_iso_c10" msgid="7327709699184920822">"ISO C10"</string>
+ <string name="mediaSize_na_letter" msgid="4191805615829472953">"Məktub"</string>
+ <string name="mediaSize_na_gvrnmt_letter" msgid="7853382192649405507">"Hökumət Məktubu"</string>
+ <string name="mediaSize_na_legal" msgid="6697982988283823150">"Hüquqi"</string>
+ <string name="mediaSize_na_junior_legal" msgid="3727743969902758948">"Kiçik Hüquq"</string>
+ <string name="mediaSize_na_ledger" msgid="281871464896601236">"Qovluq"</string>
+ <string name="mediaSize_na_tabloid" msgid="5775966416333578127">"Qısa"</string>
+ <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Ləğv edildi"</string>
+ <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Kontent yazmna xətası"</string>
+ <string name="restr_pin_enter_pin" msgid="3395953421368476103">"PIN daxil edin"</string>
+ <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"Cari PIN"</string>
+ <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"Yeni PIN"</string>
+ <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"Yeni PIN\'i təsdiq edin"</string>
+ <string name="restr_pin_create_pin" msgid="8017600000263450337">"Dəyişmə məhdudiyyətləri üçün PİN yaradın"</string>
+ <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"PİN uyğun gəlmir. Yenidən cəhd edin."</string>
+ <string name="restr_pin_error_too_short" msgid="8173982756265777792">"PİN çox qısadır. Æn azı 4 rÉ™qÉ™m olmalıdır."</string>
+ <plurals name="restr_pin_countdown">
+ <item quantity="one" msgid="4835639969503729874">"Yanlış PİN. 1 saniyə sonra təkrar sınayın."</item>
+ <item quantity="other" msgid="8030607343223287654">"Yanlış PİN. <xliff:g id="COUNT">%d</xliff:g> saniyə sonra təkrar sınayın."</item>
+ </plurals>
+ <string name="transient_navigation_confirmation" msgid="4907844043611123426">"Paneli göstərmək üçün ekranın küncünü sürüşdürün"</string>
+ <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"Sistem panelini göstərmək üçün ekranın küncündən sürüşdürün"</string>
+</resources>
diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml
index ccc2986..4be2487 100644
--- a/core/res/res/values-be/strings.xml
+++ b/core/res/res/values-be/strings.xml
@@ -50,6 +50,10 @@
<string name="invalidPuk" msgid="8761456210898036513">"УвÑдзіце PUK з 8 лічбаў ці больш."</string>
<string name="needPuk" msgid="919668385956251611">"Ваша SIM-карта заблакавана PUK-кодам. УвÑдзіце PUK, каб разблакаваць карту."</string>
<string name="needPuk2" msgid="4526033371987193070">"УвÑдзіце PUK2 Ð´Ð»Ñ Ñ€Ð°Ð·Ð±Ð»Ð°ÐºÐ°Ð²Ð°Ð½Ð½Ñ SIM-карты."</string>
+ <!-- no translation found for enablePin (209412020907207950) -->
+ <skip />
+ <!-- no translation found for pinpuk_attempts:one (6596245285809790142) -->
+ <!-- no translation found for pinpuk_attempts:other (7530597808358774740) -->
<string name="imei" msgid="2625429890869005782">"IMEI"</string>
<string name="meid" msgid="4841221237681254195">"MEID"</string>
<string name="ClipMmi" msgid="6952821216480289285">"ІдÑнтыфікатар ÐÐ’Ð"</string>
@@ -496,6 +500,10 @@
<string name="permdesc_accessSurfaceFlinger" msgid="1041619516733293551">"ДазвалÑе прыкладаннÑм выкарыÑтоўваць Ð½Ñ–Ð·ÐºÐ°ÑžÐ·Ñ€Ð¾ÑžÐ½ÐµÐ²Ñ‹Ñ Ñ„ÑƒÐ½ÐºÑ†Ñ‹Ñ– SurfaceFlinger."</string>
<string name="permlab_readFrameBuffer" msgid="6690504248178498136">"чытаць буфер кадраў"</string>
<string name="permdesc_readFrameBuffer" msgid="4937405521809454680">"ДазвалÑе прыкладаннÑм Ñчытваць змеÑціва буферу кадра."</string>
+ <!-- no translation found for permlab_accessInputFlinger (5348635270689553857) -->
+ <skip />
+ <!-- no translation found for permdesc_accessInputFlinger (2104864941201226616) -->
+ <skip />
<string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"налада дыÑплеÑÑž Wi-Fi"</string>
<string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"Дазволiць прыкладанню наладжвацца i падключацца да дыÑплеÑÑž Wi-Fi."</string>
<string name="permlab_controlWifiDisplay" msgid="393641276723695496">"кіраванне дыÑплеÑмi Wi-Fi"</string>
@@ -1461,6 +1469,8 @@
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
<string name="activitychooserview_choose_application" msgid="2125168057199941199">"Выберыце прыкладанне"</string>
+ <!-- no translation found for activitychooserview_choose_application_error (8624618365481126668) -->
+ <skip />
<string name="shareactionprovider_share_with" msgid="806688056141131819">"Ðпублікаваць з дапамогай"</string>
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Ðдправiць з дапамогай Ð¿Ñ€Ñ‹ÐºÐ»Ð°Ð´Ð°Ð½Ð½Ñ <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Ручка Ð´Ð»Ñ Ð¿ÐµÑ€Ð°ÑоўваннÑ. ÐаціÑніце Ñ– ўтрымлівайце."</string>
@@ -1798,4 +1808,26 @@
<!-- no translation found for immersive_mode_confirmation (7227416894979047467) -->
<!-- no translation found for immersive_mode_confirmation (8554991488096662508) -->
<skip />
+ <!-- no translation found for done_label (2093726099505892398) -->
+ <skip />
+ <!-- no translation found for hour_picker_description (6698199186859736512) -->
+ <skip />
+ <!-- no translation found for minute_picker_description (8606010966873791190) -->
+ <skip />
+ <!-- no translation found for select_hours (6043079511766008245) -->
+ <skip />
+ <!-- no translation found for select_minutes (3974345615920336087) -->
+ <skip />
+ <!-- no translation found for day_picker_description (8990847925961297968) -->
+ <skip />
+ <!-- no translation found for year_picker_description (5524331207436052403) -->
+ <skip />
+ <!-- no translation found for select_day (7774759604701773332) -->
+ <skip />
+ <!-- no translation found for select_year (7952052866994196170) -->
+ <skip />
+ <!-- no translation found for item_is_selected (949687401682476608) -->
+ <skip />
+ <!-- no translation found for deleted_key (7659477886625566590) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml
index 99ba922..1a345af 100644
--- a/core/res/res/values-bg/strings.xml
+++ b/core/res/res/values-bg/strings.xml
@@ -50,6 +50,11 @@
<string name="invalidPuk" msgid="8761456210898036513">"Въведете PUK код Ñ Ð¿Ð¾Ð½Ðµ оÑем цифри."</string>
<string name="needPuk" msgid="919668385956251611">"SIM картата ви е заключена Ñ PUK. Въведете PUK кода, за да Ñ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡Ð¸Ñ‚Ðµ."</string>
<string name="needPuk2" msgid="4526033371987193070">"Въведете PUK2, за да отблокирате SIM картата."</string>
+ <string name="enablePin" msgid="209412020907207950">"ÐеуÑпешно – активирайте заключването на SIM/RUIM картата."</string>
+ <plurals name="pinpuk_attempts">
+ <item quantity="one" msgid="6596245285809790142">"ОÑтава ви <xliff:g id="NUMBER">%d</xliff:g> опит, преди SIM картата да бъде заключена."</item>
+ <item quantity="other" msgid="7530597808358774740">"ОÑтават ви <xliff:g id="NUMBER">%d</xliff:g> опита, преди SIM картата да бъде заключена."</item>
+ </plurals>
<string name="imei" msgid="2625429890869005782">"IMEI"</string>
<string name="meid" msgid="4841221237681254195">"MEID"</string>
<string name="ClipMmi" msgid="6952821216480289285">"Ð˜Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Ð½Ð° вх. обажданиÑ"</string>
@@ -477,6 +482,8 @@
<string name="permdesc_accessSurfaceFlinger" msgid="1041619516733293551">"Разрешава на приложението да използва функциите на SurfaceFlinger от ниÑко ниво."</string>
<string name="permlab_readFrameBuffer" msgid="6690504248178498136">"четене на ÐºÐ°Ð´Ñ€Ð¾Ð²Ð¸Ñ Ð±ÑƒÑ„ÐµÑ€"</string>
<string name="permdesc_readFrameBuffer" msgid="4937405521809454680">"Разрешава на приложението да чете Ñъдържанието на ÐºÐ°Ð´Ñ€Ð¾Ð²Ð¸Ñ Ð±ÑƒÑ„ÐµÑ€."</string>
+ <string name="permlab_accessInputFlinger" msgid="5348635270689553857">"доÑтъп до InputFlinger"</string>
+ <string name="permdesc_accessInputFlinger" msgid="2104864941201226616">"Разрешава на приложението да използва функциите на InputFlinger от ниÑко ниво."</string>
<string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"конфигуриране на диÑплеите през WiFi"</string>
<string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"Разрешава на приложението да конфигурира и да Ñе Ñвързва Ñ Ð´Ð¸Ñплеите през WiFi."</string>
<string name="permlab_controlWifiDisplay" msgid="393641276723695496">"контролиране на диÑплеите през WiFi"</string>
@@ -1414,6 +1421,7 @@
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
<string name="activitychooserview_choose_application" msgid="2125168057199941199">"Изберете приложение"</string>
+ <string name="activitychooserview_choose_application_error" msgid="8624618365481126668">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> не можа да Ñе Ñтартира"</string>
<string name="shareactionprovider_share_with" msgid="806688056141131819">"СподелÑне ÑÑŠÑ"</string>
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"СподелÑне ÑÑŠÑ: <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Плъзгаща Ñе дръжка. ДокоÑнете и задръжте."</string>
@@ -1650,4 +1658,15 @@
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Опитайте отново по-къÑно"</string>
<string name="immersive_mode_confirmation" msgid="7227416894979047467">"За изход от цÑл екран прекарайте пръÑÑ‚ отгоре надолу."</string>
+ <string name="done_label" msgid="2093726099505892398">"Готово"</string>
+ <string name="hour_picker_description" msgid="6698199186859736512">"Кръгов плъзгач за чаÑовете"</string>
+ <string name="minute_picker_description" msgid="8606010966873791190">"Кръгов плъзгач за минутите"</string>
+ <string name="select_hours" msgid="6043079511766008245">"Избиране на чаÑове"</string>
+ <string name="select_minutes" msgid="3974345615920336087">"Избиране на минути"</string>
+ <string name="day_picker_description" msgid="8990847925961297968">"МеÑечна таблица на дните"</string>
+ <string name="year_picker_description" msgid="5524331207436052403">"СпиÑък Ñ Ð³Ð¾Ð´Ð¸Ð½Ð¸"</string>
+ <string name="select_day" msgid="7774759604701773332">"Избиране на меÑец и ден"</string>
+ <string name="select_year" msgid="7952052866994196170">"Избиране на година"</string>
+ <string name="item_is_selected" msgid="949687401682476608">"Избрахте <xliff:g id="ITEM">%1$s</xliff:g>"</string>
+ <string name="deleted_key" msgid="7659477886625566590">"Изтрихте <xliff:g id="KEY">%1$s</xliff:g>"</string>
</resources>
diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml
index 8b46e84..c59cc5f 100644
--- a/core/res/res/values-ca/strings.xml
+++ b/core/res/res/values-ca/strings.xml
@@ -50,6 +50,11 @@
<string name="invalidPuk" msgid="8761456210898036513">"Introdueix un PUK compost com a mínim de 8 nombres."</string>
<string name="needPuk" msgid="919668385956251611">"La targeta SIM està bloquejada pel PUK. Escriviu el codi PUK per desbloquejar-la."</string>
<string name="needPuk2" msgid="4526033371987193070">"Escriviu el PUK2 per desbloquejar la targeta SIM."</string>
+ <string name="enablePin" msgid="209412020907207950">"No és correcte; activa el bloqueig de RUIM/SIM."</string>
+ <plurals name="pinpuk_attempts">
+ <item quantity="one" msgid="6596245285809790142">"Et queda <xliff:g id="NUMBER">%d</xliff:g> intent; si no l\'encertes, la SIM es bloquejarà."</item>
+ <item quantity="other" msgid="7530597808358774740">"Et queden <xliff:g id="NUMBER">%d</xliff:g> intents; si no l\'encertes, la SIM es bloquejarà."</item>
+ </plurals>
<string name="imei" msgid="2625429890869005782">"IMEI"</string>
<string name="meid" msgid="4841221237681254195">"MEID"</string>
<string name="ClipMmi" msgid="6952821216480289285">"Identificació de trucada entrant"</string>
@@ -477,6 +482,8 @@
<string name="permdesc_accessSurfaceFlinger" msgid="1041619516733293551">"Permet que l\'aplicació utilitzi funcions SurfaceFlinger de baix nivell."</string>
<string name="permlab_readFrameBuffer" msgid="6690504248178498136">"llegir la memòria intermèdia de marcs"</string>
<string name="permdesc_readFrameBuffer" msgid="4937405521809454680">"Permet que l\'aplicació llegeixi el contingut de la memòria intermèdia de marcs."</string>
+ <string name="permlab_accessInputFlinger" msgid="5348635270689553857">"accedeix a InputFlinger"</string>
+ <string name="permdesc_accessInputFlinger" msgid="2104864941201226616">"Permet que l\'aplicació utilitzi funcions de baix nivell d\'InputFlinger."</string>
<string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"configuració de les pantalles Wi-Fi"</string>
<string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"Permet a l\'aplicació configurar-se i connectar-se a les pantalles Wi-Fi."</string>
<string name="permlab_controlWifiDisplay" msgid="393641276723695496">"control de les pantalles Wi-Fi"</string>
@@ -1414,6 +1421,7 @@
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Maj"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Retorn"</string>
<string name="activitychooserview_choose_application" msgid="2125168057199941199">"Selecciona una aplicació"</string>
+ <string name="activitychooserview_choose_application_error" msgid="8624618365481126668">"No s\'ha pogut iniciar <xliff:g id="APPLICATION_NAME">%s</xliff:g>."</string>
<string name="shareactionprovider_share_with" msgid="806688056141131819">"Comparteix amb"</string>
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Comparteix amb <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Llisca el dit. Mantén premut."</string>
@@ -1485,7 +1493,7 @@
<string name="wireless_display_route_description" msgid="9070346425023979651">"Pantalla sense fil"</string>
<string name="media_route_chooser_grouping_done" msgid="7966438307723317169">"Fet"</string>
<string name="media_route_button_content_description" msgid="5758553567065145276">"Sortida de contingut multimèdia"</string>
- <string name="media_route_status_scanning" msgid="7279908761758293783">"S\'està explorant..."</string>
+ <string name="media_route_status_scanning" msgid="7279908761758293783">"S\'està cercant…"</string>
<string name="media_route_status_connecting" msgid="6422571716007825440">"S\'està connectant..."</string>
<string name="media_route_status_available" msgid="6983258067194649391">"Disponible"</string>
<string name="media_route_status_not_available" msgid="6739899962681886401">"No disponible"</string>
@@ -1650,4 +1658,15 @@
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Torna-ho a provar més tard"</string>
<string name="immersive_mode_confirmation" msgid="7227416894979047467">"Fes lliscar el dit cap avall per sortir de la pantalla completa."</string>
+ <string name="done_label" msgid="2093726099505892398">"Fet"</string>
+ <string name="hour_picker_description" msgid="6698199186859736512">"Control circular de les hores"</string>
+ <string name="minute_picker_description" msgid="8606010966873791190">"Control circular dels minuts"</string>
+ <string name="select_hours" msgid="6043079511766008245">"Selecciona les hores"</string>
+ <string name="select_minutes" msgid="3974345615920336087">"Selecciona els minuts"</string>
+ <string name="day_picker_description" msgid="8990847925961297968">"Graella mensual de dies"</string>
+ <string name="year_picker_description" msgid="5524331207436052403">"Llista anual"</string>
+ <string name="select_day" msgid="7774759604701773332">"Selecciona un mes i un dia"</string>
+ <string name="select_year" msgid="7952052866994196170">"Selecciona un any"</string>
+ <string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> seleccionat"</string>
+ <string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> suprimit"</string>
</resources>
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index 73ca02b..cd42a82 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -50,6 +50,11 @@
<string name="invalidPuk" msgid="8761456210898036513">"Zadejte osmimístný nebo delší kód PUK."</string>
<string name="needPuk" msgid="919668385956251611">"SIM karta je blokována pomocí kódu PUK. Odblokujete ji zadáním kódu PUK."</string>
<string name="needPuk2" msgid="4526033371987193070">"Chcete-li odblokovat SIM kartu, zadejte kód PUK2."</string>
+ <string name="enablePin" msgid="209412020907207950">"Operace nebyla úspěšná, povolte zámek SIM/RUIM karty."</string>
+ <plurals name="pinpuk_attempts">
+ <item quantity="one" msgid="6596245285809790142">"Máte jeÅ¡tÄ› <xliff:g id="NUMBER">%d</xliff:g> pokus. Poté bude SIM karta uzamÄena."</item>
+ <item quantity="other" msgid="7530597808358774740">"PoÄet zbývajících pokusů, po jejichž vyÄerpání bude SIM karta uzamÄena: <xliff:g id="NUMBER">%d</xliff:g>."</item>
+ </plurals>
<string name="imei" msgid="2625429890869005782">"IMEI"</string>
<string name="meid" msgid="4841221237681254195">"MEID"</string>
<string name="ClipMmi" msgid="6952821216480289285">"Příchozí identifikace volajícího"</string>
@@ -477,6 +482,8 @@
<string name="permdesc_accessSurfaceFlinger" msgid="1041619516733293551">"Umožňuje aplikaci používat nízkoúrovňové funkce SurfaceFlinger."</string>
<string name="permlab_readFrameBuffer" msgid="6690504248178498136">"Ätení vyrovnávací pamÄ›ti snímků"</string>
<string name="permdesc_readFrameBuffer" msgid="4937405521809454680">"Umožňuje aplikaci Äíst obsah vyrovnávací pamÄ›ti snímků."</string>
+ <string name="permlab_accessInputFlinger" msgid="5348635270689553857">"přístup k funkci InputFlinger"</string>
+ <string name="permdesc_accessInputFlinger" msgid="2104864941201226616">"Umožňuje aplikaci používat nízkoúrovňové funkce InputFlinger."</string>
<string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"konfigurovat displeje přes Wi-Fi"</string>
<string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"Povoluje aplikaci připojit a konfigurovat displeje přes Wi-Fi."</string>
<string name="permlab_controlWifiDisplay" msgid="393641276723695496">"ovládat displeje přes Wi-Fi"</string>
@@ -1414,6 +1421,7 @@
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
<string name="activitychooserview_choose_application" msgid="2125168057199941199">"Vybrat aplikaci"</string>
+ <string name="activitychooserview_choose_application_error" msgid="8624618365481126668">"Aplikaci <xliff:g id="APPLICATION_NAME">%s</xliff:g> nelze spustit."</string>
<string name="shareactionprovider_share_with" msgid="806688056141131819">"Sdílet s"</string>
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Sdílet s aplikací <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Posuvník. Dotkněte se a podržte."</string>
@@ -1650,4 +1658,15 @@
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Zkuste to znovu později"</string>
<string name="immersive_mode_confirmation" msgid="7227416894979047467">"Režim celé obrazovky ukonÄíte pÅ™ejetím dolů."</string>
+ <string name="done_label" msgid="2093726099505892398">"Hotovo"</string>
+ <string name="hour_picker_description" msgid="6698199186859736512">"Kruhový posuvník hodin"</string>
+ <string name="minute_picker_description" msgid="8606010966873791190">"Kruhový posuvník minut"</string>
+ <string name="select_hours" msgid="6043079511766008245">"Zvolte hodiny"</string>
+ <string name="select_minutes" msgid="3974345615920336087">"Zvolte minuty"</string>
+ <string name="day_picker_description" msgid="8990847925961297968">"Dny uspořádané po měsících"</string>
+ <string name="year_picker_description" msgid="5524331207436052403">"Seznam roků"</string>
+ <string name="select_day" msgid="7774759604701773332">"Vyberte měsíc a den"</string>
+ <string name="select_year" msgid="7952052866994196170">"Vyberte rok"</string>
+ <string name="item_is_selected" msgid="949687401682476608">"Vybrána položka <xliff:g id="ITEM">%1$s</xliff:g>"</string>
+ <string name="deleted_key" msgid="7659477886625566590">"Číslice <xliff:g id="KEY">%1$s</xliff:g> byla smazána"</string>
</resources>
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index 0cf5bc5..bfca8cd 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -50,6 +50,11 @@
<string name="invalidPuk" msgid="8761456210898036513">"Angiv en PUK-kode på 8 eller flere cifre."</string>
<string name="needPuk" msgid="919668385956251611">"Dit SIM-kort er låst med PUK-koden. Indtast PUK-koden for at låse den op."</string>
<string name="needPuk2" msgid="4526033371987193070">"Indtast PUK2-koden for at låse op for SIM-kortet."</string>
+ <string name="enablePin" msgid="209412020907207950">"Mislykkedes. Aktivér SIM-/RUIM-lås."</string>
+ <plurals name="pinpuk_attempts">
+ <item quantity="one" msgid="6596245285809790142">"Du har <xliff:g id="NUMBER">%d</xliff:g> forsøg tilbage, før SIM-kortet bliver låst."</item>
+ <item quantity="other" msgid="7530597808358774740">"Du har <xliff:g id="NUMBER">%d</xliff:g> forsøg tilbage, før SIM-kortet bliver låst."</item>
+ </plurals>
<string name="imei" msgid="2625429890869005782">"IMEI-nummer"</string>
<string name="meid" msgid="4841221237681254195">"MEID"</string>
<string name="ClipMmi" msgid="6952821216480289285">"Indgående opkalds-id"</string>
@@ -440,7 +445,7 @@
<string name="permlab_readContacts" msgid="8348481131899886131">"læse dine kontaktpersoner"</string>
<string name="permdesc_readContacts" product="tablet" msgid="5294866856941149639">"Tillader, at appen kan læse data om de kontaktpersoner, der er gemt på din tablet, f.eks. hvor ofte du har ringet til, sendt e-mail til eller på anden måde kommunikeret med bestemte personer. Med denne tilladelse kan apps gemme dine kontaktdata, og skadelige apps kan dele kontaktdata uden din viden."</string>
<string name="permdesc_readContacts" product="default" msgid="8440654152457300662">"Tillader, at appen kan læse data om de kontaktpersoner, der er gemt på din telefon, f.eks. hvor ofte du har ringet til, sendt e-mail til eller på anden måde kommunikeret med bestemte personer. Med denne tilladelse kan apps gemme dine kontaktdata, og skadelige apps kan dele kontaktdata uden din viden."</string>
- <string name="permlab_writeContacts" msgid="5107492086416793544">"ændre dine kontaktpersoner"</string>
+ <string name="permlab_writeContacts" msgid="5107492086416793544">"at ændre dine kontaktpersoner"</string>
<string name="permdesc_writeContacts" product="tablet" msgid="897243932521953602">"Tillader, at appen kan ændre data om de kontaktpersoner, der er gemt på din tablet, f.eks. hvor ofte du har ringet til dem, sendt dem en e-mail eller på anden måde kommunikeret med bestemte kontaktpersoner. Med denne tilladelse kan apps slette kontaktoplysninger."</string>
<string name="permdesc_writeContacts" product="default" msgid="589869224625163558">"Tillader, at appen kan ændre data om de kontaktpersoner, der er gemt på din telefon, f.eks. hvor ofte du har ringet til dem, sendt en e-mail til dem eller på anden måde kommunikeret med bestemte kontaktpersoner. Med denne tilladelse kan apps slette kontaktoplysninger."</string>
<string name="permlab_readCallLog" msgid="3478133184624102739">"læs opkaldsliste"</string>
@@ -477,6 +482,8 @@
<string name="permdesc_accessSurfaceFlinger" msgid="1041619516733293551">"Tillader, at appen kan bruge SurfaceFlinger-funktioner på lavt niveau."</string>
<string name="permlab_readFrameBuffer" msgid="6690504248178498136">"læs rammebuffer"</string>
<string name="permdesc_readFrameBuffer" msgid="4937405521809454680">"Tillader, at appen kan læse indholdet fra rammebufferen."</string>
+ <string name="permlab_accessInputFlinger" msgid="5348635270689553857">"få adgang til InputFlinger"</string>
+ <string name="permdesc_accessInputFlinger" msgid="2104864941201226616">"Giver appen tilladelse til at bruge SurfaceFlinger-funktioner på lavt niveau."</string>
<string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"konfigurer Wi-Fi-skærme"</string>
<string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"Tillader, at appen konfigurerer og opretter forbindelse til Wi-Fi-skærme."</string>
<string name="permlab_controlWifiDisplay" msgid="393641276723695496">"kontrollér Wi-Fi-skærme"</string>
@@ -1414,6 +1421,7 @@
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Angiv"</string>
<string name="activitychooserview_choose_application" msgid="2125168057199941199">"Vælg en app"</string>
+ <string name="activitychooserview_choose_application_error" msgid="8624618365481126668">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> kunne ikke startes"</string>
<string name="shareactionprovider_share_with" msgid="806688056141131819">"Del med"</string>
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Del med <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Glidende håndtag. Tryk og hold nede."</string>
@@ -1650,4 +1658,15 @@
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Prøv igen senere"</string>
<string name="immersive_mode_confirmation" msgid="7227416894979047467">"Stryg ned fra toppen for at afslutte fuld skærm"</string>
+ <string name="done_label" msgid="2093726099505892398">"Udfør"</string>
+ <string name="hour_picker_description" msgid="6698199186859736512">"Cirkulær timevælger"</string>
+ <string name="minute_picker_description" msgid="8606010966873791190">"Cirkulær minutvælger"</string>
+ <string name="select_hours" msgid="6043079511766008245">"Vælg timer"</string>
+ <string name="select_minutes" msgid="3974345615920336087">"Vælg minutter"</string>
+ <string name="day_picker_description" msgid="8990847925961297968">"MÃ¥nedsgitter med dage"</string>
+ <string name="year_picker_description" msgid="5524331207436052403">"Liste over år"</string>
+ <string name="select_day" msgid="7774759604701773332">"Vælg måned og dag"</string>
+ <string name="select_year" msgid="7952052866994196170">"Vælg år"</string>
+ <string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> er valgt"</string>
+ <string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> er slettet"</string>
</resources>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index f799be4..c09b820 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -50,6 +50,11 @@
<string name="invalidPuk" msgid="8761456210898036513">"Geben Sie eine mindestens achtstellige PUK ein."</string>
<string name="needPuk" msgid="919668385956251611">"Ihre SIM-Karte ist mit einem PUK gesperrt. Geben Sie zum Entsperren den PUK-Code ein."</string>
<string name="needPuk2" msgid="4526033371987193070">"Geben Sie zum Entsperren der SIM-Karte den PUK2 ein."</string>
+ <string name="enablePin" msgid="209412020907207950">"Fehler. SIM-/RUIM-Sperre aktivieren."</string>
+ <plurals name="pinpuk_attempts">
+ <item quantity="one" msgid="6596245285809790142">"Sie haben noch <xliff:g id="NUMBER">%d</xliff:g> Versuch, bevor Ihre SIM-Karte gesperrt wird."</item>
+ <item quantity="other" msgid="7530597808358774740">"Sie haben noch <xliff:g id="NUMBER">%d</xliff:g> Versuche, bevor Ihre SIM-Karte gesperrt wird."</item>
+ </plurals>
<string name="imei" msgid="2625429890869005782">"IMEI"</string>
<string name="meid" msgid="4841221237681254195">"MEID"</string>
<string name="ClipMmi" msgid="6952821216480289285">"Anrufer-ID für eingehenden Anruf"</string>
@@ -477,6 +482,8 @@
<string name="permdesc_accessSurfaceFlinger" msgid="1041619516733293551">"Ermöglicht der App, die systemnahen SurfaceFlinger-Funktionen zu verwenden"</string>
<string name="permlab_readFrameBuffer" msgid="6690504248178498136">"Frame-Puffer lesen"</string>
<string name="permdesc_readFrameBuffer" msgid="4937405521809454680">"Ermöglicht der App, den Inhalt des Frame-Puffers zu lesen"</string>
+ <string name="permlab_accessInputFlinger" msgid="5348635270689553857">"Auf InputFlinger zugreifen"</string>
+ <string name="permdesc_accessInputFlinger" msgid="2104864941201226616">"Ermöglicht der App, die systemnahen InputFlinger-Funktionen zu verwenden"</string>
<string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"WLAN-Anzeigen konfigurieren"</string>
<string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"Erlaubt der App, WLAN-Anzeigen zu konfigurieren und eine Verbindung zu diesen herzustellen"</string>
<string name="permlab_controlWifiDisplay" msgid="393641276723695496">"WLAN-Anzeigen steuern"</string>
@@ -1414,6 +1421,7 @@
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Umschalttaste"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Eingabetaste"</string>
<string name="activitychooserview_choose_application" msgid="2125168057199941199">"App auswählen"</string>
+ <string name="activitychooserview_choose_application_error" msgid="8624618365481126668">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> konnte nicht gestartet werden."</string>
<string name="shareactionprovider_share_with" msgid="806688056141131819">"Teilen mit"</string>
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Mit <xliff:g id="APPLICATION_NAME">%s</xliff:g> teilen"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Schieberegler: Berühren und halten"</string>
@@ -1650,4 +1658,15 @@
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Später erneut versuchen"</string>
<string name="immersive_mode_confirmation" msgid="7227416894979047467">"Zum Schließen des Vollbilds von oben nach unten wischen"</string>
+ <string name="done_label" msgid="2093726099505892398">"Fertig"</string>
+ <string name="hour_picker_description" msgid="6698199186859736512">"Kreisförmiger Schieberegler für Stunden"</string>
+ <string name="minute_picker_description" msgid="8606010966873791190">"Kreisförmiger Schieberegler für Minuten"</string>
+ <string name="select_hours" msgid="6043079511766008245">"Stunden auswählen"</string>
+ <string name="select_minutes" msgid="3974345615920336087">"Minuten auswählen"</string>
+ <string name="day_picker_description" msgid="8990847925961297968">"Monatsraster mit einzelnen Tagen"</string>
+ <string name="year_picker_description" msgid="5524331207436052403">"Jahresliste"</string>
+ <string name="select_day" msgid="7774759604701773332">"Monat und Tag auswählen"</string>
+ <string name="select_year" msgid="7952052866994196170">"Jahr auswählen"</string>
+ <string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> ausgewählt"</string>
+ <string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> gelöscht"</string>
</resources>
diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml
index 605d845..83e27a7 100644
--- a/core/res/res/values-el/strings.xml
+++ b/core/res/res/values-el/strings.xml
@@ -50,6 +50,11 @@
<string name="invalidPuk" msgid="8761456210898036513">"ΠληκτÏολογήστε έναν κωδικό PUK με 8 αÏιθμοÏÏ‚ ή πεÏισσότεÏους."</string>
<string name="needPuk" msgid="919668385956251611">"Η κάÏτα SIM έχει κλειδωθεί με κωδικό PUK. ΠληκτÏολογήστε τον κωδικό PUK για να την ξεκλειδώσετε."</string>
<string name="needPuk2" msgid="4526033371987193070">"ΠληκτÏολογήστε τον κωδικό PUK2 για την κατάÏγηση Î±Ï€Î¿ÎºÎ»ÎµÎ¹ÏƒÎ¼Î¿Ï Ï„Î·Ï‚ κάÏτας SIM."</string>
+ <string name="enablePin" msgid="209412020907207950">"Ανεπιτυχής Ï€Ïοσπάθεια. ΕνεÏγοποιήστε το Κλείδωμα SIM/RUIM."</string>
+ <plurals name="pinpuk_attempts">
+ <item quantity="one" msgid="6596245285809790142">"Απομένει άλλη <xliff:g id="NUMBER">%d</xliff:g> Ï€Ïοσπάθεια Ï€ÏÎ¿Ï„Î¿Ï Î· κάÏτα SIM κλειδωθεί."</item>
+ <item quantity="other" msgid="7530597808358774740">"Απομένουν <xliff:g id="NUMBER">%d</xliff:g> Ï€Ïοσπάθειες Ï€ÏÎ¿Ï„Î¿Ï Î· κάÏτα SIM κλειδωθεί."</item>
+ </plurals>
<string name="imei" msgid="2625429890869005782">"IMEI"</string>
<string name="meid" msgid="4841221237681254195">"MEID"</string>
<string name="ClipMmi" msgid="6952821216480289285">"ΕισεÏχόμενη αναγνώÏιση κλήσης"</string>
@@ -477,6 +482,8 @@
<string name="permdesc_accessSurfaceFlinger" msgid="1041619516733293551">"ΕπιτÏέπει σε μια εφαÏμογή να χÏησιμοποιεί λειτουÏγίες SurfaceFlinger Ï‡Î±Î¼Î·Î»Î¿Ï ÎµÏ€Î¹Ï€Î­Î´Î¿Ï…."</string>
<string name="permlab_readFrameBuffer" msgid="6690504248178498136">"ανάγνωση Ï€ÏοσωÏινής μνήμης πλαισίου"</string>
<string name="permdesc_readFrameBuffer" msgid="4937405521809454680">"ΕπιτÏέπει στην εφαÏμογή την ανάγνωση του πεÏιεχομένου της Ï€ÏοσωÏινής μνήμης πλαισίου."</string>
+ <string name="permlab_accessInputFlinger" msgid="5348635270689553857">"Ï€Ïόσβαση στο InputFlinger"</string>
+ <string name="permdesc_accessInputFlinger" msgid="2104864941201226616">"ΕπιτÏέπει σε μια εφαÏμογή να χÏησιμοποιεί λειτουÏγίες InputFlinger Ï‡Î±Î¼Î·Î»Î¿Ï ÎµÏ€Î¹Ï€Î­Î´Î¿Ï…."</string>
<string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"διαμόÏφωση οθονών Wifi"</string>
<string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"ΕπιτÏέπει τη διαμόÏφωση της εφαÏμογής και τη σÏνδεσης σε οθόνες Wifi."</string>
<string name="permlab_controlWifiDisplay" msgid="393641276723695496">"έλεγχος οθονών Wifi"</string>
@@ -642,7 +649,7 @@
<string name="permlab_sdcardRead" product="default" msgid="2188156462934977940">"ανάγνωση του πεÏιεχομένου της κάÏτας SD"</string>
<string name="permdesc_sdcardRead" product="nosdcard" msgid="3446988712598386079">"ΕπιτÏέπει στην εφαÏμογή την ανάγνωση του πεÏιεχομένου του Î±Ï€Î¿Î¸Î·ÎºÎµÏ…Ï„Î¹ÎºÎ¿Ï ÏƒÎ±Ï‚ χώÏου USB."</string>
<string name="permdesc_sdcardRead" product="default" msgid="2607362473654975411">"ΕπιτÏέπει στην εφαÏμογή την ανάγνωση του πεÏιεχομένου της κάÏτας SD."</string>
- <string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"Ï„Ïοπ. ή διαγÏ. του USB"</string>
+ <string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"Ï„Ïοποποίηση ή διαγÏαφή του USB"</string>
<string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"Ï„Ïοποποίηση ή διαγÏαφή των πεÏιεχομένων της κάÏτας SD"</string>
<string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"ΕπιτÏέπει στην εφαÏμογή την εγγÏαφή στον αποθηκευτικό χώÏο USB."</string>
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"ΕπιτÏέπει στην εφαÏμογή την εγγÏαφή στην κάÏτα SD."</string>
@@ -1414,6 +1421,7 @@
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
<string name="activitychooserview_choose_application" msgid="2125168057199941199">"Επιλέξτε κάποια εφαÏμογή"</string>
+ <string name="activitychooserview_choose_application_error" msgid="8624618365481126668">"Δεν ήταν δυνατή η εκκίνηση του <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="shareactionprovider_share_with" msgid="806688056141131819">"Κοινή χÏήση με"</string>
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Κοινή χÏήση με <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Στοιχείο χειÏÎ¹ÏƒÎ¼Î¿Ï Î¼Îµ δυνατότητα ολίσθησης. Αγγίξτε και πατήστε παÏατεταμένα."</string>
@@ -1650,4 +1658,15 @@
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Δοκιμάστε ξανά αÏγότεÏα"</string>
<string name="immersive_mode_confirmation" msgid="7227416894979047467">"ΣάÏωση Ï€Ïος τα κάτω για έξοδο από πλήÏη οθόνη"</string>
+ <string name="done_label" msgid="2093726099505892398">"Τέλος"</string>
+ <string name="hour_picker_description" msgid="6698199186859736512">"Κυκλικό Ïυθμιστικό ωÏών"</string>
+ <string name="minute_picker_description" msgid="8606010966873791190">"Κυκλικό Ïυθμιστικό λεπτών"</string>
+ <string name="select_hours" msgid="6043079511766008245">"Επιλογή ωÏών"</string>
+ <string name="select_minutes" msgid="3974345615920336087">"Επιλογή λεπτών"</string>
+ <string name="day_picker_description" msgid="8990847925961297968">"Πλέγμα ημεÏών του μήνα"</string>
+ <string name="year_picker_description" msgid="5524331207436052403">"Λίστα ετών"</string>
+ <string name="select_day" msgid="7774759604701773332">"Επιλογή μήνα και ημέÏας"</string>
+ <string name="select_year" msgid="7952052866994196170">"Επιλογή έτους"</string>
+ <string name="item_is_selected" msgid="949687401682476608">"Επιλέχτηκε το στοιχείο <xliff:g id="ITEM">%1$s</xliff:g>"</string>
+ <string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> διαγÏάφηκε"</string>
</resources>
diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml
index ca8509a..6e9af59 100644
--- a/core/res/res/values-en-rGB/strings.xml
+++ b/core/res/res/values-en-rGB/strings.xml
@@ -50,6 +50,11 @@
<string name="invalidPuk" msgid="8761456210898036513">"Type a PUK that is 8 numbers or longer."</string>
<string name="needPuk" msgid="919668385956251611">"Your SIM card is PUK-locked. Type the PUK code to unlock it."</string>
<string name="needPuk2" msgid="4526033371987193070">"Type PUK2 to unblock SIM card."</string>
+ <string name="enablePin" msgid="209412020907207950">"Unsuccessful, enable SIM/RUIM Lock."</string>
+ <plurals name="pinpuk_attempts">
+ <item quantity="one" msgid="6596245285809790142">"You have <xliff:g id="NUMBER">%d</xliff:g> remaining attempt/s before SIM is locked."</item>
+ <item quantity="other" msgid="7530597808358774740">"You have <xliff:g id="NUMBER">%d</xliff:g> remaining attempt/s before SIM is locked."</item>
+ </plurals>
<string name="imei" msgid="2625429890869005782">"IMEI"</string>
<string name="meid" msgid="4841221237681254195">"MEID"</string>
<string name="ClipMmi" msgid="6952821216480289285">"Incoming Caller ID"</string>
@@ -477,6 +482,8 @@
<string name="permdesc_accessSurfaceFlinger" msgid="1041619516733293551">"Allows the app to use SurfaceFlinger low-level features."</string>
<string name="permlab_readFrameBuffer" msgid="6690504248178498136">"read frame buffer"</string>
<string name="permdesc_readFrameBuffer" msgid="4937405521809454680">"Allows the app to read the content of the frame buffer."</string>
+ <string name="permlab_accessInputFlinger" msgid="5348635270689553857">"access InputFlinger"</string>
+ <string name="permdesc_accessInputFlinger" msgid="2104864941201226616">"Allows the app to use InputFlinger low-level features."</string>
<string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"configure Wi-Fi displays"</string>
<string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"Allows the app to configure and connect to Wi-Fi displays."</string>
<string name="permlab_controlWifiDisplay" msgid="393641276723695496">"control Wi-Fi displays"</string>
@@ -1414,6 +1421,7 @@
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
<string name="activitychooserview_choose_application" msgid="2125168057199941199">"Choose an app"</string>
+ <string name="activitychooserview_choose_application_error" msgid="8624618365481126668">"Couldn\'t launch <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="shareactionprovider_share_with" msgid="806688056141131819">"Share with"</string>
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Share with <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Sliding handle. Touch &amp; hold."</string>
@@ -1650,4 +1658,15 @@
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Try again later"</string>
<string name="immersive_mode_confirmation" msgid="7227416894979047467">"Swipe down from the top to exit full screen."</string>
+ <string name="done_label" msgid="2093726099505892398">"Finished"</string>
+ <string name="hour_picker_description" msgid="6698199186859736512">"Hours circular slider"</string>
+ <string name="minute_picker_description" msgid="8606010966873791190">"Minutes circular slider"</string>
+ <string name="select_hours" msgid="6043079511766008245">"Select hours"</string>
+ <string name="select_minutes" msgid="3974345615920336087">"Select minutes"</string>
+ <string name="day_picker_description" msgid="8990847925961297968">"Month grid of days"</string>
+ <string name="year_picker_description" msgid="5524331207436052403">"Year list"</string>
+ <string name="select_day" msgid="7774759604701773332">"Select month and day"</string>
+ <string name="select_year" msgid="7952052866994196170">"Select year"</string>
+ <string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> selected"</string>
+ <string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> deleted"</string>
</resources>
diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml
index ca8509a..6e9af59 100644
--- a/core/res/res/values-en-rIN/strings.xml
+++ b/core/res/res/values-en-rIN/strings.xml
@@ -50,6 +50,11 @@
<string name="invalidPuk" msgid="8761456210898036513">"Type a PUK that is 8 numbers or longer."</string>
<string name="needPuk" msgid="919668385956251611">"Your SIM card is PUK-locked. Type the PUK code to unlock it."</string>
<string name="needPuk2" msgid="4526033371987193070">"Type PUK2 to unblock SIM card."</string>
+ <string name="enablePin" msgid="209412020907207950">"Unsuccessful, enable SIM/RUIM Lock."</string>
+ <plurals name="pinpuk_attempts">
+ <item quantity="one" msgid="6596245285809790142">"You have <xliff:g id="NUMBER">%d</xliff:g> remaining attempt/s before SIM is locked."</item>
+ <item quantity="other" msgid="7530597808358774740">"You have <xliff:g id="NUMBER">%d</xliff:g> remaining attempt/s before SIM is locked."</item>
+ </plurals>
<string name="imei" msgid="2625429890869005782">"IMEI"</string>
<string name="meid" msgid="4841221237681254195">"MEID"</string>
<string name="ClipMmi" msgid="6952821216480289285">"Incoming Caller ID"</string>
@@ -477,6 +482,8 @@
<string name="permdesc_accessSurfaceFlinger" msgid="1041619516733293551">"Allows the app to use SurfaceFlinger low-level features."</string>
<string name="permlab_readFrameBuffer" msgid="6690504248178498136">"read frame buffer"</string>
<string name="permdesc_readFrameBuffer" msgid="4937405521809454680">"Allows the app to read the content of the frame buffer."</string>
+ <string name="permlab_accessInputFlinger" msgid="5348635270689553857">"access InputFlinger"</string>
+ <string name="permdesc_accessInputFlinger" msgid="2104864941201226616">"Allows the app to use InputFlinger low-level features."</string>
<string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"configure Wi-Fi displays"</string>
<string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"Allows the app to configure and connect to Wi-Fi displays."</string>
<string name="permlab_controlWifiDisplay" msgid="393641276723695496">"control Wi-Fi displays"</string>
@@ -1414,6 +1421,7 @@
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
<string name="activitychooserview_choose_application" msgid="2125168057199941199">"Choose an app"</string>
+ <string name="activitychooserview_choose_application_error" msgid="8624618365481126668">"Couldn\'t launch <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="shareactionprovider_share_with" msgid="806688056141131819">"Share with"</string>
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Share with <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Sliding handle. Touch &amp; hold."</string>
@@ -1650,4 +1658,15 @@
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Try again later"</string>
<string name="immersive_mode_confirmation" msgid="7227416894979047467">"Swipe down from the top to exit full screen."</string>
+ <string name="done_label" msgid="2093726099505892398">"Finished"</string>
+ <string name="hour_picker_description" msgid="6698199186859736512">"Hours circular slider"</string>
+ <string name="minute_picker_description" msgid="8606010966873791190">"Minutes circular slider"</string>
+ <string name="select_hours" msgid="6043079511766008245">"Select hours"</string>
+ <string name="select_minutes" msgid="3974345615920336087">"Select minutes"</string>
+ <string name="day_picker_description" msgid="8990847925961297968">"Month grid of days"</string>
+ <string name="year_picker_description" msgid="5524331207436052403">"Year list"</string>
+ <string name="select_day" msgid="7774759604701773332">"Select month and day"</string>
+ <string name="select_year" msgid="7952052866994196170">"Select year"</string>
+ <string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> selected"</string>
+ <string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> deleted"</string>
</resources>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index eb731a3..7044403 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -50,6 +50,11 @@
<string name="invalidPuk" msgid="8761456210898036513">"Ingresa un código PUK de ocho números o más."</string>
<string name="needPuk" msgid="919668385956251611">"Tu tarjeta SIM está bloqueada con PUK. Escribe el código PUK para desbloquearla."</string>
<string name="needPuk2" msgid="4526033371987193070">"Escribir PUK2 para desbloquear la tarjeta SIM."</string>
+ <string name="enablePin" msgid="209412020907207950">"Error; habilita el bloqueo de SIM/RUIM."</string>
+ <plurals name="pinpuk_attempts">
+ <item quantity="one" msgid="6596245285809790142">"Te queda <xliff:g id="NUMBER">%d</xliff:g> intento antes de que se bloquee la tarjeta SIM."</item>
+ <item quantity="other" msgid="7530597808358774740">"Te quedan <xliff:g id="NUMBER">%d</xliff:g> intentos antes de que se bloquee la tarjeta SIM."</item>
+ </plurals>
<string name="imei" msgid="2625429890869005782">"IMEI"</string>
<string name="meid" msgid="4841221237681254195">"MEID"</string>
<string name="ClipMmi" msgid="6952821216480289285">"Identificador de llamadas entrantes"</string>
@@ -477,6 +482,8 @@
<string name="permdesc_accessSurfaceFlinger" msgid="1041619516733293551">"Permite que la aplicación utilice funciones de SurfaceFlinger de bajo nivel."</string>
<string name="permlab_readFrameBuffer" msgid="6690504248178498136">"leer el búfer de tramas"</string>
<string name="permdesc_readFrameBuffer" msgid="4937405521809454680">"Permite que la aplicación lea el contenido del búfer de tramas."</string>
+ <string name="permlab_accessInputFlinger" msgid="5348635270689553857">"acceder a InputFlinger"</string>
+ <string name="permdesc_accessInputFlinger" msgid="2104864941201226616">"Permite que la aplicación utilice funciones de InputFlinger de bajo nivel."</string>
<string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"configurar pantallas Wi-Fi"</string>
<string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"Permite que la aplicación configure y se conecte a pantallas Wi-Fi."</string>
<string name="permlab_controlWifiDisplay" msgid="393641276723695496">"controlar pantallas Wi-Fi"</string>
@@ -1414,6 +1421,7 @@
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Mayúscula"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Ingresar"</string>
<string name="activitychooserview_choose_application" msgid="2125168057199941199">"Elige una aplicación."</string>
+ <string name="activitychooserview_choose_application_error" msgid="8624618365481126668">"No se pudo abrir <xliff:g id="APPLICATION_NAME">%s</xliff:g>."</string>
<string name="shareactionprovider_share_with" msgid="806688056141131819">"Compartir con"</string>
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Compartir con <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Mantén presionado el controlador deslizante."</string>
@@ -1649,5 +1657,16 @@
<item quantity="other" msgid="4730868920742952817">"Intentar en <xliff:g id="COUNT">%d</xliff:g> s"</item>
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Vuelve a intentar más tarde."</string>
- <string name="immersive_mode_confirmation" msgid="7227416894979047467">"Salir de pantalla completa: deslizar abajo"</string>
+ <string name="immersive_mode_confirmation" msgid="7227416894979047467">"Desliza el dedo hacia abajo para salir de la pantalla completa."</string>
+ <string name="done_label" msgid="2093726099505892398">"Listo"</string>
+ <string name="hour_picker_description" msgid="6698199186859736512">"Control deslizante circular de horas"</string>
+ <string name="minute_picker_description" msgid="8606010966873791190">"Control deslizante circular de minutos"</string>
+ <string name="select_hours" msgid="6043079511766008245">"Seleccionar horas"</string>
+ <string name="select_minutes" msgid="3974345615920336087">"Seleccionar minutos"</string>
+ <string name="day_picker_description" msgid="8990847925961297968">"Cuadrícula mensual de días"</string>
+ <string name="year_picker_description" msgid="5524331207436052403">"Lista de años"</string>
+ <string name="select_day" msgid="7774759604701773332">"Seleccionar mes y día"</string>
+ <string name="select_year" msgid="7952052866994196170">"Seleccionar año"</string>
+ <string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> seleccionado"</string>
+ <string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> borrado"</string>
</resources>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index a89f35a..1516286 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -50,6 +50,11 @@
<string name="invalidPuk" msgid="8761456210898036513">"Escribe un código PUK de ocho caracteres o más."</string>
<string name="needPuk" msgid="919668385956251611">"La tarjeta SIM está bloqueada con el código PUK. Introduce el código PUK para desbloquearla."</string>
<string name="needPuk2" msgid="4526033371987193070">"Introduce el código PUK2 para desbloquear la tarjeta SIM."</string>
+ <string name="enablePin" msgid="209412020907207950">"Error, habilitar bloqueo de SIM/RUIM."</string>
+ <plurals name="pinpuk_attempts">
+ <item quantity="one" msgid="6596245285809790142">"Te queda <xliff:g id="NUMBER">%d</xliff:g> intento para bloquear la tarjeta SIM."</item>
+ <item quantity="other" msgid="7530597808358774740">"Quedan <xliff:g id="NUMBER">%d</xliff:g> intentos para bloquear la tarjeta SIM."</item>
+ </plurals>
<string name="imei" msgid="2625429890869005782">"IMEI"</string>
<string name="meid" msgid="4841221237681254195">"MEID"</string>
<string name="ClipMmi" msgid="6952821216480289285">"ID de emisor de llamada entrante"</string>
@@ -477,6 +482,8 @@
<string name="permdesc_accessSurfaceFlinger" msgid="1041619516733293551">"Permite que la aplicación use funciones de SurfaceFlinger de nivel inferior."</string>
<string name="permlab_readFrameBuffer" msgid="6690504248178498136">"leer memoria de almacenamiento intermedio"</string>
<string name="permdesc_readFrameBuffer" msgid="4937405521809454680">"Permite que la aplicación lea el contenido de la memoria de almacenamiento intermedio."</string>
+ <string name="permlab_accessInputFlinger" msgid="5348635270689553857">"acceder a InputFlinger"</string>
+ <string name="permdesc_accessInputFlinger" msgid="2104864941201226616">"Permite que la aplicación utilice funciones de bajo nivel de SurfaceFlinger."</string>
<string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"configurar pantallas Wi-Fi"</string>
<string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"Permite que la aplicación configure pantallas Wi-Fi y se conecte a ellas."</string>
<string name="permlab_controlWifiDisplay" msgid="393641276723695496">"controlar pantallas Wi-Fi"</string>
@@ -1414,6 +1421,7 @@
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Mayús"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Intro"</string>
<string name="activitychooserview_choose_application" msgid="2125168057199941199">"Seleccionar una aplicación"</string>
+ <string name="activitychooserview_choose_application_error" msgid="8624618365481126668">"No se ha podido abrir <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="shareactionprovider_share_with" msgid="806688056141131819">"Compartir con"</string>
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Compartir con <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Mantén pulsado el icono de desbloqueo y deslízalo."</string>
@@ -1650,4 +1658,15 @@
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Volver a intentar más tarde"</string>
<string name="immersive_mode_confirmation" msgid="7227416894979047467">"Desliza el dedo hacia abajo para salir de la pantalla completa"</string>
+ <string name="done_label" msgid="2093726099505892398">"Listo"</string>
+ <string name="hour_picker_description" msgid="6698199186859736512">"Control deslizante circular de horas"</string>
+ <string name="minute_picker_description" msgid="8606010966873791190">"Control deslizante circular de minutos"</string>
+ <string name="select_hours" msgid="6043079511766008245">"Seleccionar horas"</string>
+ <string name="select_minutes" msgid="3974345615920336087">"Seleccionar minutos"</string>
+ <string name="day_picker_description" msgid="8990847925961297968">"Cuadrícula mensual de días"</string>
+ <string name="year_picker_description" msgid="5524331207436052403">"Lista de años"</string>
+ <string name="select_day" msgid="7774759604701773332">"Seleccionar mes y día"</string>
+ <string name="select_year" msgid="7952052866994196170">"Seleccionar año"</string>
+ <string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> seleccionado"</string>
+ <string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> eliminado"</string>
</resources>
diff --git a/core/res/res/values-et-rEE/strings.xml b/core/res/res/values-et-rEE/strings.xml
index 742d3da..3b65e35 100644
--- a/core/res/res/values-et-rEE/strings.xml
+++ b/core/res/res/values-et-rEE/strings.xml
@@ -50,6 +50,11 @@
<string name="invalidPuk" msgid="8761456210898036513">"Sisestage 8- või enamanumbriline PUK-kood."</string>
<string name="needPuk" msgid="919668385956251611">"SIM-kaart on PUK-lukustatud. Avamiseks sisestage PUK-kood."</string>
<string name="needPuk2" msgid="4526033371987193070">"Sisestage SIM-kaardi blokeeringu tühistamiseks PUK2-kood."</string>
+ <string name="enablePin" msgid="209412020907207950">"Ebaõnnestus, SIM-i/RUIM-i lukustuse lubamine."</string>
+ <plurals name="pinpuk_attempts">
+ <item quantity="one" msgid="6596245285809790142">"Teil on enne SIM-i lukustumist jäänud veel <xliff:g id="NUMBER">%d</xliff:g> katse."</item>
+ <item quantity="other" msgid="7530597808358774740">"Teil on enne SIM-i lukustumist jäänud veel <xliff:g id="NUMBER">%d</xliff:g> katset."</item>
+ </plurals>
<string name="imei" msgid="2625429890869005782">"IMEI"</string>
<string name="meid" msgid="4841221237681254195">"MEID"</string>
<string name="ClipMmi" msgid="6952821216480289285">"Sissetuleva kõne helistaja ID"</string>
@@ -477,6 +482,8 @@
<string name="permdesc_accessSurfaceFlinger" msgid="1041619516733293551">"Võimaldab rakendusel kasutada SurfaceFlingeri madalatasemelisi funktsioone."</string>
<string name="permlab_readFrameBuffer" msgid="6690504248178498136">"loe kaadripuhvrit"</string>
<string name="permdesc_readFrameBuffer" msgid="4937405521809454680">"Võimaldab rakendusel kaadripuhvri sisu lugeda."</string>
+ <string name="permlab_accessInputFlinger" msgid="5348635270689553857">"juurdepääs InputFlingerile"</string>
+ <string name="permdesc_accessInputFlinger" msgid="2104864941201226616">"Lubab rakendusel kasutada InputFlingeri madalatasemelisi funktsioone."</string>
<string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"WiFi-ekraanide seadistamine"</string>
<string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"Lubab rakendusel seadistada WiFi-ekraane ja nendega ühendus luua."</string>
<string name="permlab_controlWifiDisplay" msgid="393641276723695496">"WiFi-ekraanide juhtimine"</string>
@@ -1414,6 +1421,7 @@
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Tõstuklahv"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Sisestusklahv"</string>
<string name="activitychooserview_choose_application" msgid="2125168057199941199">"Valige rakendus"</string>
+ <string name="activitychooserview_choose_application_error" msgid="8624618365481126668">"Rakendust <xliff:g id="APPLICATION_NAME">%s</xliff:g> ei õnnestunud käivitada"</string>
<string name="shareactionprovider_share_with" msgid="806688056141131819">"Jaga:"</string>
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Jaga rakendusega <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Libistamispide. Puudutage ja hoidke all."</string>
@@ -1649,5 +1657,16 @@
<item quantity="other" msgid="4730868920742952817">"Proovige uuesti <xliff:g id="COUNT">%d</xliff:g> sekundi pärast"</item>
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Proovige hiljem uuesti"</string>
- <string name="immersive_mode_confirmation" msgid="7227416894979047467">"Täisekraani sulgemiseks pühkige ülevalt alla"</string>
+ <string name="immersive_mode_confirmation" msgid="7227416894979047467">"Täisekraanilt väljumiseks pühkige ülevalt alla."</string>
+ <string name="done_label" msgid="2093726099505892398">"Valmis"</string>
+ <string name="hour_picker_description" msgid="6698199186859736512">"Ringikujuline tunniliugur"</string>
+ <string name="minute_picker_description" msgid="8606010966873791190">"Ringikujuline minutiliugur"</string>
+ <string name="select_hours" msgid="6043079511766008245">"Tundide valimine"</string>
+ <string name="select_minutes" msgid="3974345615920336087">"Minutite valimine"</string>
+ <string name="day_picker_description" msgid="8990847925961297968">"Päevad kuu ruudustikus"</string>
+ <string name="year_picker_description" msgid="5524331207436052403">"Aastate loend"</string>
+ <string name="select_day" msgid="7774759604701773332">"Kuu ja päeva valimine"</string>
+ <string name="select_year" msgid="7952052866994196170">"Aasta valimine"</string>
+ <string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> on valitud"</string>
+ <string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> on kustutatud"</string>
</resources>
diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml
index 71832c8..0694744 100644
--- a/core/res/res/values-et/strings.xml
+++ b/core/res/res/values-et/strings.xml
@@ -314,7 +314,7 @@
<string name="permlab_stopAppSwitches" msgid="4138608610717425573">"väldi rakenduste ümberlülitamist"</string>
<string name="permdesc_stopAppSwitches" msgid="8262195802582255021">"Takistab kasutaja lülitumist teisele rakendusele."</string>
<string name="permlab_getTopActivityInfo" msgid="2537922311411546016">"aktiivse rakenduse teabe hankimine"</string>
- <string name="permdesc_getTopActivityInfo" msgid="2512448855496067131">"Lubab õiguste saajal hankida privaatset teavet ekraanil esiplaanil oleva aktiivse rakenduse kohta."</string>
+ <string name="permdesc_getTopActivityInfo" msgid="8153651434145132505">"Lubab õiguse omanikul hankida privaatset teavet ekraani esiplaanil oleva aktiivse rakenduse ja teenuste kohta."</string>
<string name="permlab_runSetActivityWatcher" msgid="892239094867182656">"Kõigi rakenduste käivitumise jälgimine ja juhtimine"</string>
<string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"Võimaldab rakendusel jälgida ja juhtida, kuidas süsteem tegevusi käivitab. Pahatahtlikud rakendused võivad süsteemi täielikult rikkuda. Seda õigust on vaja ainult arenduseks, mitte tavakasutuse korral."</string>
<string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"saada paketist eemaldatud saade"</string>
@@ -363,7 +363,7 @@
<string name="permlab_accessAllPrintJobs" msgid="1120792468465711159">"juurdepääs kõikidele printimistöödele"</string>
<string name="permdesc_accessAllPrintJobs" msgid="2978185311041864762">"Lubab omanikule juurdepääsu teise rakenduse loodud printimistöödele. Tavarakenduste puhul ei peaks seda kunagi vaja minema."</string>
<string name="permlab_bindNfcService" msgid="2752731300419410724">"NFC-teenusega sidumine"</string>
- <string name="permdesc_bindNfcService" msgid="6120647629174066862">"Lubab kasutajal luua seosed rakendustega, mis jäljendavad NFC-kaarte. Pole kunagi vajalik tavaliste rakenduste korral."</string>
+ <string name="permdesc_bindNfcService" msgid="6120647629174066862">"Lubab õiguste omajal luua seosed rakendustega, mis emuleerivad NFC-kaarte. Pole kunagi vajalik tavaliste rakenduste korral."</string>
<string name="permlab_bindTextService" msgid="7358378401915287938">"tekstiteenusega sidumine"</string>
<string name="permdesc_bindTextService" msgid="8151968910973998670">"Võimaldab omanikul siduda tekstiteenuse (nt SpellCheckerService) ülataseme liidesega. Tavarakenduste puhul ei peaks seda kunagi vaja minema."</string>
<string name="permlab_bindVpnService" msgid="4708596021161473255">"seo VPN-teenusega"</string>
@@ -407,6 +407,10 @@
<string name="permdesc_readLogs" product="default" msgid="2063438140241560443">"Võimaldab rakendusel lugeda süsteemi erinevaid logifaile. Nii on võimalik avastada üldist teavet selle kohta, mida te telefoniga teete, mis võib kaasata ka isiklikku või privaatset teavet."</string>
<string name="permlab_anyCodecForPlayback" msgid="715805555823881818">"Mis tahes meediumidekooderi kasutamine taasesituseks"</string>
<string name="permdesc_anyCodecForPlayback" msgid="8283912488433189010">"Võimaldab rakendusel taasesituseks kasutada mis tahes installitud meediumidekooderit."</string>
+ <!-- no translation found for permlab_manageCaCertificates (1678391896786882014) -->
+ <skip />
+ <!-- no translation found for permdesc_manageCaCertificates (4015644047196937014) -->
+ <skip />
<string name="permlab_diagnostic" msgid="8076743953908000342">"loe/kirjuta valija allikaid"</string>
<string name="permdesc_diagnostic" msgid="6608295692002452283">"Võimaldab rakendusel lugeda valimisrühma mis tahes ressurssi ja sellesse kirjutada (näiteks kaustas /dev olevad failid). See võib mõjutada süsteemi stabiilsust ja turvet. Seda tohiks kasutada tootja või operaator AINULT riistvaraspetsiifiliseks diagnostikaks."</string>
<string name="permlab_changeComponentState" msgid="6335576775711095931">"Rakenduse komponentide lubamine või keelamine"</string>
@@ -472,18 +476,14 @@
<string name="permdesc_accessInputFlinger" msgid="2104864941201226616">"Lubab rakendusel kasutada InputFlingeri madalatasemelisi funktsioone."</string>
<string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"WiFi-ekraanide seadistamine"</string>
<string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"Lubab rakendusel seadistada WiFi-ekraane ja nendega ühendus luua."</string>
- <!-- no translation found for permlab_captureAudioOutput (6857134498402346708) -->
- <skip />
- <!-- no translation found for permdesc_captureAudioOutput (6210597754212208853) -->
- <skip />
- <!-- no translation found for permlab_captureVideoOutput (2246828773589094023) -->
- <skip />
- <!-- no translation found for permdesc_captureVideoOutput (359481658034149860) -->
- <skip />
- <!-- no translation found for permlab_captureSecureVideoOutput (7815398969303382016) -->
- <skip />
- <!-- no translation found for permdesc_captureSecureVideoOutput (2779793064709350289) -->
- <skip />
+ <string name="permlab_controlWifiDisplay" msgid="393641276723695496">"WiFi-ekraanide juhtimine"</string>
+ <string name="permdesc_controlWifiDisplay" msgid="4543912292681826986">"Lubab rakendusel juhtida WiFi-ekraanide madala taseme funktsioone."</string>
+ <string name="permlab_captureAudioOutput" msgid="6857134498402346708">"heliväljundi jäädvustamine"</string>
+ <string name="permdesc_captureAudioOutput" msgid="6210597754212208853">"Lubab rakendusel jäädvustada ja ümber suunata heliväljundit."</string>
+ <string name="permlab_captureVideoOutput" msgid="2246828773589094023">"videoväljundi jäädvustamine"</string>
+ <string name="permdesc_captureVideoOutput" msgid="359481658034149860">"Lubab rakendusel jäädvustada ja ümber suunata videoväljundit."</string>
+ <string name="permlab_captureSecureVideoOutput" msgid="7815398969303382016">"kaitstud videoväljundi jäädvustamine"</string>
+ <string name="permdesc_captureSecureVideoOutput" msgid="2779793064709350289">"Lubab rakendusel jäädvustada ja ümber suunata kaitstud videoväljundit."</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"muuda heliseadeid"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"Võimaldab rakendusel muuta üldiseid heliseadeid, näiteks helitugevust ja seda, millist kõlarit kasutatakse väljundiks."</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"salvesta heli"</string>
@@ -657,6 +657,8 @@
<string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"Võimaldab omanikul siduda märguannete kuulamisteenuse ülemise taseme kasutajaliidese. Seda ei tohiks tavarakenduste puhul kunagi vaja olla."</string>
<string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"operaatoripoolse konfiguratsioonirakenduse aktiveerimine"</string>
<string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"Lubab omanikul aktiveerida operaatoripoolse konfiguratsioonirakenduse. Tavarakenduste puhul ei peaks seda kunagi vaja minema."</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"võrgutingimuste teabe kuulamine"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"Lubab rakendusel kuulata võrgutingimuste teavet. Ei ole kunagi vajalik tavaliste rakenduste puhul."</string>
<string name="policylab_limitPassword" msgid="4497420728857585791">"Parooli reeglite määramine"</string>
<string name="policydesc_limitPassword" msgid="3252114203919510394">"Kontrollige ekraaniluku avamise paroolide pikkust ja tähemärke."</string>
<string name="policylab_watchLogin" msgid="914130646942199503">"Ekraani avamiskatsed"</string>
@@ -1581,4 +1583,6 @@
<item quantity="one" msgid="4835639969503729874">"Vale PIN-kood. Proovige 1 s pärast."</item>
<item quantity="other" msgid="8030607343223287654">"Vale PIN-kood. Proovige <xliff:g id="COUNT">%d</xliff:g> s pärast."</item>
</plurals>
+ <string name="transient_navigation_confirmation" msgid="4907844043611123426">"Riba kuvam. pühkige ekraani serva"</string>
+ <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"Süsteemiriba kuvamiseks pühkige ekraani servast"</string>
</resources>
diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml
index 92d687f..9c508c0 100644
--- a/core/res/res/values-fa/strings.xml
+++ b/core/res/res/values-fa/strings.xml
@@ -27,14 +27,14 @@
<string name="terabyteShort" msgid="231613018159186962">"ترابایت"</string>
<string name="petabyteShort" msgid="5637816680144990219">"پتابایت"</string>
<string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
- <string name="untitled" msgid="4638956954852782576">"&lt;بدون عنوان&gt;"</string>
+ <string name="untitled" msgid="4638956954852782576">"â€&lt;بدون عنوان&gt;"</string>
<string name="ellipsis" msgid="7899829516048813237">"…"</string>
<string name="ellipsis_two_dots" msgid="1228078994866030736">".."</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(بدون شماره تلÙÙ†)"</string>
<string name="unknownName" msgid="2277556546742746522">"(ناشناس)"</string>
<string name="defaultVoiceMailAlphaTag" msgid="2660020990097733077">"پست صوتی"</string>
<string name="defaultMsisdnAlphaTag" msgid="2850889754919584674">"MSISDN1"</string>
- <string name="mmiError" msgid="5154499457739052907">"مشکل در اتصال یا کد MMI نامعتبر."</string>
+ <string name="mmiError" msgid="5154499457739052907">"â€Ù…Ø´Ú©Ù„ در اتصال یا کد MMI نامعتبر."</string>
<string name="mmiFdnError" msgid="5224398216385316471">"عملکرد Ùقط به شماره‌های شماره گیری ثابت محدود است."</string>
<string name="serviceEnabled" msgid="8147278346414714315">"سرویس ÙØ¹Ø§Ù„ شد."</string>
<string name="serviceEnabledFor" msgid="6856228140453471041">"سرویس ÙØ¹Ø§Ù„ شد برای:"</string>
@@ -42,14 +42,19 @@
<string name="serviceRegistered" msgid="6275019082598102493">"ثبت با موÙقیت انجام شد"</string>
<string name="serviceErased" msgid="1288584695297200972">"پاک کردن با موÙقیت انجام شد."</string>
<string name="passwordIncorrect" msgid="7612208839450128715">"رمز ورود اشتباه است."</string>
- <string name="mmiComplete" msgid="8232527495411698359">"MMI کامل شد."</string>
- <string name="badPin" msgid="9015277645546710014">"پین قدیمی که نوشته‎اید صحیح نیست."</string>
- <string name="badPuk" msgid="5487257647081132201">"PUK که نوشته‌اید صحیح نیست."</string>
- <string name="mismatchPin" msgid="609379054496863419">"پین‎هایی که وارد کرده‎اید با یکدیگر مطابقت ندارند."</string>
+ <string name="mmiComplete" msgid="8232527495411698359">"â€MMI کامل شد."</string>
+ <string name="badPin" msgid="9015277645546710014">"â€Ù¾ÛŒÙ† قدیمی Ú©Ù‡ نوشته‎اید صحیح نیست."</string>
+ <string name="badPuk" msgid="5487257647081132201">"â€PUK Ú©Ù‡ نوشته‌اید صحیح نیست."</string>
+ <string name="mismatchPin" msgid="609379054496863419">"â€Ù¾ÛŒÙ†â€ŽÙ‡Ø§ÛŒÛŒ Ú©Ù‡ وارد کرده‎اید با یکدیگر مطابقت ندارند."</string>
<string name="invalidPin" msgid="3850018445187475377">"یک پین بنویسید که 4 تا 8 رقم باشد."</string>
- <string name="invalidPuk" msgid="8761456210898036513">"یک PUK با 8 رقم یا بیشتر تایپ کنید."</string>
- <string name="needPuk" msgid="919668385956251611">"سیم کارت شما با PUK Ù‚ÙÙ„ شده است. کد PUK را برای بازگشایی آن بنویسید."</string>
- <string name="needPuk2" msgid="4526033371987193070">"PUK2 را برای بازگشایی Ù‚ÙÙ„ سیم کارت بنویسید."</string>
+ <string name="invalidPuk" msgid="8761456210898036513">"â€ÛŒÚ© PUK با 8 رقم یا بیشتر تایپ کنید."</string>
+ <string name="needPuk" msgid="919668385956251611">"â€Ø³ÛŒÙ… کارت شما با PUK Ù‚ÙÙ„ شده است. کد PUK را برای بازگشایی آن بنویسید."</string>
+ <string name="needPuk2" msgid="4526033371987193070">"â€PUK2 را برای بازگشایی Ù‚ÙÙ„ سیم کارت بنویسید."</string>
+ <string name="enablePin" msgid="209412020907207950">"â€Ù†Ø§Ù…ÙˆÙÙ‚ بود، Ù‚ÙÙ„ سیم/RUIM را ÙØ¹Ø§Ù„ کنید."</string>
+ <plurals name="pinpuk_attempts">
+ <item quantity="one" msgid="6596245285809790142">"<xliff:g id="NUMBER">%d</xliff:g> بار دیگر می‌توانید تلاش کنید Ùˆ پس از آن سیم کارت Ù‚ÙÙ„ می‌شود."</item>
+ <item quantity="other" msgid="7530597808358774740">"<xliff:g id="NUMBER">%d</xliff:g> بار دیگر می‌توانید تلاش کنید Ùˆ پس از آن سیم کارت Ù‚ÙÙ„ می‌شود."</item>
+ </plurals>
<string name="imei" msgid="2625429890869005782">"IMEI"</string>
<string name="meid" msgid="4841221237681254195">"MEID"</string>
<string name="ClipMmi" msgid="6952821216480289285">"شناسه تماس گیرنده ورودی"</string>
@@ -70,14 +75,14 @@
<string name="CLIRDefaultOffNextCallOn" msgid="6179425182856418465">"Ù¾ÛŒØ´â€ŒÙØ±Ø¶ شناسه تماس گیرنده روی غیر محدود است. تماس بعدی: محدود"</string>
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"Ù¾ÛŒØ´â€ŒÙØ±Ø¶ شناسه تماس گیرنده روی غیر محدود است. تماس بعدی: بدون محدودیت"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"سرویس دارای مجوز نیست."</string>
- <string name="CLIRPermanent" msgid="3377371145926835671">"شما می‎توانید تنظیم شناسه تماس گیرنده را تغییر دهید."</string>
+ <string name="CLIRPermanent" msgid="3377371145926835671">"â€Ø´Ù…ا می‎توانید تنظیم شناسه تماس گیرنده را تغییر دهید."</string>
<string name="RestrictedChangedTitle" msgid="5592189398956187498">"دسترسی محدود تغییر ÛŒØ§ÙØª"</string>
<string name="RestrictedOnData" msgid="8653794784690065540">"سرویس داده مسدود است."</string>
<string name="RestrictedOnEmergency" msgid="6581163779072833665">"سرویس اضطراری مسدود است."</string>
<string name="RestrictedOnNormal" msgid="4953867011389750673">"سرویس صوتی مسدود شده است."</string>
- <string name="RestrictedOnAllVoice" msgid="3396963652108151260">"تمام سرویس‎های صدا مسدود هستند."</string>
+ <string name="RestrictedOnAllVoice" msgid="3396963652108151260">"â€ØªÙ…ام سرویس‎های صدا مسدود هستند."</string>
<string name="RestrictedOnSms" msgid="8314352327461638897">"سرویس پیامک مسدود شده است."</string>
- <string name="RestrictedOnVoiceData" msgid="996636487106171320">"سرویس‎‎های صدا/داده مسدود شدند."</string>
+ <string name="RestrictedOnVoiceData" msgid="996636487106171320">"â€Ø³Ø±ÙˆÛŒØ³â€Žâ€ŽÙ‡Ø§ÛŒ صدا/داده مسدود شدند."</string>
<string name="RestrictedOnVoiceSms" msgid="1888588152792023873">"سرویس‌های صوتی/پیامک مسدود شده‌اند"</string>
<string name="RestrictedOnAll" msgid="5643028264466092821">"تمام سرویس‌های صدا/داده/ پیامک مسدود هستند."</string>
<string name="serviceClassVoice" msgid="1258393812335258019">"صوتی"</string>
@@ -111,17 +116,17 @@
<string name="fcError" msgid="3327560126588500777">"مشکل در اتصال یا کد ویژگی نامعتبر."</string>
<string name="httpErrorOk" msgid="1191919378083472204">"تأیید"</string>
<string name="httpError" msgid="7956392511146698522">"خطایی در شبکه وجود داشت."</string>
- <string name="httpErrorLookup" msgid="4711687456111963163">"URL پیدا نشد."</string>
- <string name="httpErrorUnsupportedAuthScheme" msgid="6299980280442076799">"طرح کلی تأیید اعتبار سایت پشتیبانی نمی‎شود."</string>
+ <string name="httpErrorLookup" msgid="4711687456111963163">"â€URL پیدا نشد."</string>
+ <string name="httpErrorUnsupportedAuthScheme" msgid="6299980280442076799">"â€Ø·Ø±Ø­ Ú©Ù„ÛŒ تأیید اعتبار سایت پشتیبانی نمی‎شود."</string>
<string name="httpErrorAuth" msgid="1435065629438044534">"تأیید اعتبار انجام نشد."</string>
<string name="httpErrorProxyAuth" msgid="1788207010559081331">"تأیید اعتبار از طریق سرور پروکسی انجام نشد."</string>
<string name="httpErrorConnect" msgid="8714273236364640549">"اتصال به سرور انجام نشد."</string>
<string name="httpErrorIO" msgid="2340558197489302188">"برقراری ارتباط با سرور ممکن نبود. بعداً دوباره امتحان کنید."</string>
<string name="httpErrorTimeout" msgid="4743403703762883954">"زمان اتصال به سرور تمام شده است."</string>
<string name="httpErrorRedirectLoop" msgid="8679596090392779516">"این ØµÙØ­Ù‡ دارای تعداد بسیار زیادی تغییر مسیر سرور است."</string>
- <string name="httpErrorUnsupportedScheme" msgid="5015730812906192208">"پروتکل پشتیبانی نمی‎شود."</string>
+ <string name="httpErrorUnsupportedScheme" msgid="5015730812906192208">"â€Ù¾Ø±ÙˆØªÚ©Ù„ پشتیبانی نمی‎شود."</string>
<string name="httpErrorFailedSslHandshake" msgid="96549606000658641">"اتصال امن ایجاد نشد."</string>
- <string name="httpErrorBadUrl" msgid="3636929722728881972">"بدلیل نامعتبر بودن URLØŒ باز کردن ØµÙØ­Ù‡ ممکن نیست."</string>
+ <string name="httpErrorBadUrl" msgid="3636929722728881972">"â€Ø¨Ø¯Ù„یل نامعتبر بودن URLØŒ باز کردن ØµÙØ­Ù‡ ممکن نیست."</string>
<string name="httpErrorFile" msgid="2170788515052558676">"دسترسی به ÙØ§ÛŒÙ„ انجام نشد."</string>
<string name="httpErrorFileNotFound" msgid="6203856612042655084">"ÙØ§ÛŒÙ„ درخواستی پیدا نشد."</string>
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"درخواست‌های زیادی در حال پردازش است. بعداً دوباره امتحان کنید."</string>
@@ -129,7 +134,7 @@
<string name="contentServiceSync" msgid="8353523060269335667">"همگام‌سازی"</string>
<string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"همگام‌سازی"</string>
<string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"تعداد موارد حذ٠شده <xliff:g id="CONTENT_TYPE">%s</xliff:g> بسیار زیاد است."</string>
- <string name="low_memory" product="tablet" msgid="6494019234102154896">"Ø­Ø§ÙØ¸Ù‡ رایانهٔ لوحی پر است! برخی از ÙØ§ÛŒÙ„‎ها را حذ٠کنید تا ÙØ¶Ø§ آزاد شود."</string>
+ <string name="low_memory" product="tablet" msgid="6494019234102154896">"â€Ø­Ø§Ùظه رایانهٔ لوحی پر است! برخی از ÙØ§ÛŒÙ„‎ها را حذ٠کنید تا ÙØ¶Ø§ آزاد شود."</string>
<string name="low_memory" product="default" msgid="3475999286680000541">"Ø­Ø§ÙØ¸Ù‡ تلÙÙ† پر است. بعضی از ÙØ§ÛŒÙ„‌ها را حذ٠کنید تا ÙØ¶Ø§ آزاد شود."</string>
<string name="ssl_ca_cert_warning" msgid="5848402127455021714">"ممکن است شبکه نظارت شده باشد"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"توسط یک شخص ثالث ناشناس"</string>
@@ -148,11 +153,11 @@
<string name="shutdown_progress" msgid="2281079257329981203">"در حال خاموش شدن…"</string>
<string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"رایانهٔ لوحی شما خاموش می‌شود."</string>
<string name="shutdown_confirm" product="default" msgid="649792175242821353">"گوشی شما خاموش می‌شود."</string>
- <string name="shutdown_confirm_question" msgid="2906544768881136183">"آیا می‎خواهید تلÙÙ† خاموش شود؟"</string>
+ <string name="shutdown_confirm_question" msgid="2906544768881136183">"â€Ø¢ÛŒØ§ می‎خواهید تلÙÙ† خاموش شود؟"</string>
<string name="reboot_safemode_title" msgid="7054509914500140361">"راه‌اندازی مجدد در حالت امن"</string>
<string name="reboot_safemode_confirm" msgid="55293944502784668">"آیا می‌خواهید با حالت امن راه‌اندازی مجدد کنید؟ با این کار همهٔ برنامه‌های شخص ثالثی Ú©Ù‡ نصب کرده‌اید ØºÛŒØ±ÙØ¹Ø§Ù„ می‌شوند. با راه‌اندازی دوباره سیستم این برنامه‌ها دوباره بازیابی می‌شوند."</string>
<string name="recent_tasks_title" msgid="3691764623638127888">"اخیر"</string>
- <string name="no_recent_tasks" msgid="8794906658732193473">"برنامه‎های جدید موجود نیست."</string>
+ <string name="no_recent_tasks" msgid="8794906658732193473">"â€Ø¨Ø±Ù†Ø§Ù…ه‎های جدید موجود نیست."</string>
<string name="global_actions" product="tablet" msgid="408477140088053665">"گزینه‌های رایانهٔ لوحی"</string>
<string name="global_actions" product="default" msgid="2406416831541615258">"گزینه‌های تلÙÙ†"</string>
<string name="global_action_lock" msgid="2844945191792119712">"Ù‚ÙÙ„ ØµÙØ­Ù‡"</string>
@@ -168,7 +173,7 @@
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"حالت هواپیما خاموش است"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"بیشتر از 999"</string>
<string name="safeMode" msgid="2788228061547930246">"حالت ایمن"</string>
- <string name="android_system_label" msgid="6577375335728551336">"سیستم Android"</string>
+ <string name="android_system_label" msgid="6577375335728551336">"â€Ø³ÛŒØ³ØªÙ… Android"</string>
<string name="permgrouplab_costMoney" msgid="5429808217861460401">"سرویس‌های غیر رایگان"</string>
<string name="permgroupdesc_costMoney" msgid="3293301903409869495">"انجام کارهایی که برای شما هزینه دارد."</string>
<string name="permgrouplab_messages" msgid="7521249148445456662">"پیام‌های شما"</string>
@@ -180,7 +185,7 @@
<string name="permgrouplab_location" msgid="635149742436692049">"موقعیت مکانی شما"</string>
<string name="permgroupdesc_location" msgid="5704679763124170100">"بر موقعیت مکانی Ùیزیکی خود نظارت داشته باشید."</string>
<string name="permgrouplab_network" msgid="5808983377727109831">"ارتباط شبکه‌ای"</string>
- <string name="permgroupdesc_network" msgid="4478299413241861987">"به ویژگی‎های مختل٠شبکه دسترسی داشته باشید."</string>
+ <string name="permgroupdesc_network" msgid="4478299413241861987">"â€Ø¨Ù‡ ویژگی‎های مختل٠شبکه دسترسی داشته باشید."</string>
<string name="permgrouplab_bluetoothNetwork" msgid="1585403544162128109">"بلوتوث"</string>
<string name="permgroupdesc_bluetoothNetwork" msgid="5625288577164282391">"از طریق بلوتوث به دستگاه‌ها و شبکه‌ها دسترسی داشته باشد."</string>
<string name="permgrouplab_audioSettings" msgid="8329261670151871235">"تنظیمات صدا"</string>
@@ -228,8 +233,8 @@
<string name="permgrouplab_display" msgid="4279909676036402636">"رابط برنامهٔ دیگر"</string>
<string name="permgroupdesc_display" msgid="6051002031933013714">"روی رابط برنامه‌های دیگر اثر دارد."</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"Ø­Ø§ÙØ¸Ù‡"</string>
- <string name="permgroupdesc_storage" product="nosdcard" msgid="7442318502446874999">"به Ø­Ø§ÙØ¸Ù‡Ù” USB دسترسی پیدا کنید."</string>
- <string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"به کارت SD دسترسی داشته باشید."</string>
+ <string name="permgroupdesc_storage" product="nosdcard" msgid="7442318502446874999">"â€Ø¨Ù‡ Ø­Ø§ÙØ¸Ù‡Ù” USB دسترسی پیدا کنید."</string>
+ <string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"â€Ø¨Ù‡ کارت SD دسترسی داشته باشید."</string>
<string name="permgrouplab_accessibilityFeatures" msgid="7919025602283593907">"ویژگی‌های قابلیت دسترسی"</string>
<string name="permgroupdesc_accessibilityFeatures" msgid="4205196881678144335">"ویژگی‌هایی Ú©Ù‡ Ùناوری Ù…Ùید می‌تواند درخواست کند."</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"بازیابی محتوای پنجره"</string>
@@ -241,38 +246,38 @@
<string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"نوشتاری را که تایپ می‌کنید مشاهده نمایید"</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"اطلاعات شخصی مانند شماره کارت اعتباری و گذرواژه‌ها را شامل می‌شود."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"ØºÛŒØ±ÙØ¹Ø§Ù„ کردن یا تغییر نوار وضعیت"</string>
- <string name="permdesc_statusBar" msgid="8434669549504290975">"به برنامه اجازه می‎دهد تا نوار وضعیت را ØºÛŒØ±ÙØ¹Ø§Ù„ کند یا نمادهای سیستم را اضاÙÙ‡ یا حذ٠کند."</string>
+ <string name="permdesc_statusBar" msgid="8434669549504290975">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا نوار وضعیت را ØºÛŒØ±ÙØ¹Ø§Ù„ کند یا نمادهای سیستم را اضاÙÙ‡ یا حذ٠کند."</string>
<string name="permlab_statusBarService" msgid="7247281911387931485">"نوار وضعیت"</string>
- <string name="permdesc_statusBarService" msgid="716113660795976060">"به برنامه اجازه می‎دهد که تبدیل به نوار وضعیت شود."</string>
+ <string name="permdesc_statusBarService" msgid="716113660795976060">"â€Ø¨Ù‡ برنامه اجازه می‎دهد Ú©Ù‡ تبدیل به نوار وضعیت شود."</string>
<string name="permlab_expandStatusBar" msgid="1148198785937489264">"گسترش دادن/جمع کردن نوار وضعیت"</string>
- <string name="permdesc_expandStatusBar" msgid="6917549437129401132">"به برنامه اجازه می‎دهد تا نوار ابزار را جمع کند یا باز کند."</string>
+ <string name="permdesc_expandStatusBar" msgid="6917549437129401132">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا نوار ابزار را جمع کند یا باز کند."</string>
<string name="permlab_install_shortcut" msgid="4279070216371564234">"نصب میان‌برها"</string>
<string name="permdesc_install_shortcut" msgid="8341295916286736996">"به برنامه اجازه می‌دهد میان‌برهای ØµÙØ­Ù‡ اصلی را بدون دخالت کاربر اضاÙÙ‡ کند."</string>
<string name="permlab_uninstall_shortcut" msgid="4729634524044003699">"حذ٠نصب میان‌برها"</string>
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"به برنامه اجازه می‌دهد میان‌برهای ØµÙØ­Ù‡ اصلی را بدون دخالت کاربر حذ٠کند."</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"ترسیم مجدد مسیر تماس‌های خروجی"</string>
- <string name="permdesc_processOutgoingCalls" msgid="5331318931937402040">"به برنامه اجازه می‎دهد تماس‌های خروجی را پردازش کند Ùˆ شماره‎هایی Ú©Ù‡ باید Ú¯Ø±ÙØªÙ‡ شوند را تغییر دهد. این مجوز به برنامه امکان می‌دهد به کنترل، هدایت مجدد یا جلوگیری از تماس‌های خروجی بپردازد."</string>
+ <string name="permdesc_processOutgoingCalls" msgid="5331318931937402040">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تماس‌های خروجی را پردازش کند Ùˆ شماره‎هایی Ú©Ù‡ باید Ú¯Ø±ÙØªÙ‡ شوند را تغییر دهد. این مجوز به برنامه امکان می‌دهد به کنترل، هدایت مجدد یا جلوگیری از تماس‌های خروجی بپردازد."</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"Ø¯Ø±ÛŒØ§ÙØª پیام‌های نوشتاری (پیامک)"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"به برنامه اجازه می‌دهد پیامک‌ها را Ø¯Ø±ÛŒØ§ÙØª Ùˆ پردازش کند. این یعنی برنامه می‌تواند پیام‌های ارسالی به دستگاه شما را بدون نمایش آن‌ها به شما حذ٠یا کنترل کند."</string>
- <string name="permlab_receiveMms" msgid="1821317344668257098">"Ø¯Ø±ÛŒØ§ÙØª پیام‌های نوشتاری (MMS)"</string>
- <string name="permdesc_receiveMms" msgid="533019437263212260">"به برنامه اجازه می‌دهد پیام‌های MMS را Ø¯Ø±ÛŒØ§ÙØª Ùˆ پردازش کند. این یعنی برنامه می‌تواند پیام‌های ارسالی به دستگاه شما را بدون نمایش آن‌ها به شما حذ٠یا کنترل کند."</string>
+ <string name="permlab_receiveMms" msgid="1821317344668257098">"â€Ø¯Ø±ÛŒØ§Ùت پیام‌های نوشتاری (MMS)"</string>
+ <string name="permdesc_receiveMms" msgid="533019437263212260">"â€Ø¨Ù‡ برنامه اجازه می‌دهد پیام‌های MMS را Ø¯Ø±ÛŒØ§ÙØª Ùˆ پردازش کند. این یعنی برنامه می‌تواند پیام‌های ارسالی به دستگاه شما را بدون نمایش آن‌ها به شما حذ٠یا کنترل کند."</string>
<string name="permlab_receiveEmergencyBroadcast" msgid="1803477660846288089">"Ø¯Ø±ÛŒØ§ÙØª پخش‌های اضطراری"</string>
- <string name="permdesc_receiveEmergencyBroadcast" msgid="848524070262431974">"به برنامه اجازه می‎دهد تا پیام‌های پخش اضطراری را Ø¯Ø±ÛŒØ§ÙØª Ùˆ پردازش کند. این مجوز Ùقط برای برنامه‎های سیستم در دسترس است."</string>
+ <string name="permdesc_receiveEmergencyBroadcast" msgid="848524070262431974">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا پیام‌های پخش اضطراری را Ø¯Ø±ÛŒØ§ÙØª Ùˆ پردازش کند. این مجوز Ùقط برای برنامه‎های سیستم در دسترس است."</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"خواندن پیام‌های پخش سلولی"</string>
- <string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"به برنامه اجازه می‎دهد پیام‌های پخش سلولی دستگاه شما را بخواند. هشدارهای پخش سلولی در برخی از موقعیت‌های مکانی تحویل داده می‎شوند تا موقعیت‌های اضطراری را به شما اعلام کنند. وقتی پخش سلولی Ø¯Ø±ÛŒØ§ÙØª می‎شود، ممکن است برنامه‎های مخرب در عملکرد یا کارکرد دستگاه شما اختلال ایجاد کنند."</string>
+ <string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"â€Ø¨Ù‡ برنامه اجازه می‎دهد پیام‌های پخش سلولی دستگاه شما را بخواند. هشدارهای پخش سلولی در برخی از موقعیت‌های مکانی تحویل داده می‎شوند تا موقعیت‌های اضطراری را به شما اعلام کنند. وقتی پخش سلولی Ø¯Ø±ÛŒØ§ÙØª می‎شود، ممکن است برنامه‎های مخرب در عملکرد یا کارکرد دستگاه شما اختلال ایجاد کنند."</string>
<string name="permlab_sendSms" msgid="5600830612147671529">"ارسال پیامک ها"</string>
<string name="permdesc_sendSms" msgid="7094729298204937667">"به برنامه اجازه می‌دهد پیامک‌ها را ارسال کند. این باعث ایجاد هزینه‌های پیش‌بینی نشده می‌شود. برنامه‌های مخرب ممکن است با ارسال پیام بدون تأیید شما هزینه‌هایی را برای شما ایجاد کنند."</string>
<string name="permlab_sendRespondViaMessageRequest" msgid="8713889105305943200">"ارسال رویدادهای «پاسخ‌ از طریق پیام»"</string>
<string name="permdesc_sendRespondViaMessageRequest" msgid="7107648548468778734">"به برنامه اجازه می‌دهد درخواست‌ها را برای دیگر برنامه‌های پیام‌رسانی Ø¨ÙØ±Ø³ØªØ¯ تا به رویدادهای «پاسخ‌ از طریق پیام» برای تماس‌های Ø¯Ø±ÛŒØ§ÙØªÛŒ رسیدگی کند."</string>
- <string name="permlab_readSms" msgid="8745086572213270480">"خواندن پیام‌های نوشتاری شما (پیامک یا MMS)"</string>
+ <string name="permlab_readSms" msgid="8745086572213270480">"â€Ø®ÙˆØ§Ù†Ø¯Ù† پیام‌های نوشتاری شما (پیامک یا MMS)"</string>
<string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"به برنامه اجازه می‌دهد پیامک‌های ذخیره شده در رایانهٔ لوحی یا سیم کارت شما را بخواند. این ویژگی به برنامه امکان می‌دهد همه پیامک‌ها را صرÙنظر از محتوا یا محرمانه بودن آن‌ها بخواند."</string>
<string name="permdesc_readSms" product="default" msgid="3695967533457240550">"به برنامه اجازه می‌دهد پیامک‌های ذخیره شده در تلÙÙ† یا سیم کارت شما را بخواند. این ویژگی به برنامه امکان می‌دهد همه پیامک‌ها را صرÙنظر از محتوا یا محرمانه بودن آن‌ها بخواند."</string>
- <string name="permlab_writeSms" msgid="3216950472636214774">"ویرایش پیام‌های نوشتاری شما (پیامک یا MMS)"</string>
- <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"به برنامه اجازه می‎دهد تا در پیام‌های کوتاه ذخیره شده در رایانهٔ لوحی یا سیم کارت بنویسد. برنامه‎های مخرب پیام‌های شما را حذ٠می‎کنند."</string>
- <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"به برنامه اجازه می‎دهد تا در پیام‌های کوتاه ذخیره شده در تلÙÙ† یا سیم کارت بنویسد. برنامه‎های مخرب می‎توانند پیام‌های شما را حذ٠کنند."</string>
- <string name="permlab_receiveWapPush" msgid="5991398711936590410">"Ø¯Ø±ÛŒØ§ÙØª پیام‌های نوشتاری (WAP)"</string>
- <string name="permdesc_receiveWapPush" msgid="748232190220583385">"به برنامه اجازه می‌دهد پیام‌های WAP را Ø¯Ø±ÛŒØ§ÙØª Ùˆ پردازش کند. این مجوز می‌تواند پیام‌های ارسالی به شما را بدون نمایش آن‌ها به شما حذ٠یا کنترل کند."</string>
- <string name="permlab_getTasks" msgid="6466095396623933906">"بازیابی برنامه‎های در حال اجرا"</string>
+ <string name="permlab_writeSms" msgid="3216950472636214774">"â€ÙˆÛŒØ±Ø§ÛŒØ´ پیام‌های نوشتاری شما (پیامک یا MMS)"</string>
+ <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا در پیام‌های کوتاه ذخیره شده در رایانهٔ لوحی یا سیم کارت بنویسد. برنامه‎های مخرب پیام‌های شما را حذ٠می‎کنند."</string>
+ <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا در پیام‌های کوتاه ذخیره شده در تلÙÙ† یا سیم کارت بنویسد. برنامه‎های مخرب می‎توانند پیام‌های شما را حذ٠کنند."</string>
+ <string name="permlab_receiveWapPush" msgid="5991398711936590410">"â€Ø¯Ø±ÛŒØ§Ùت پیام‌های نوشتاری (WAP)"</string>
+ <string name="permdesc_receiveWapPush" msgid="748232190220583385">"â€Ø¨Ù‡ برنامه اجازه می‌دهد پیام‌های WAP را Ø¯Ø±ÛŒØ§ÙØª Ùˆ پردازش کند. این مجوز می‌تواند پیام‌های ارسالی به شما را بدون نمایش آن‌ها به شما حذ٠یا کنترل کند."</string>
+ <string name="permlab_getTasks" msgid="6466095396623933906">"â€Ø¨Ø§Ø²ÛŒØ§Ø¨ÛŒ برنامه‎های در حال اجرا"</string>
<string name="permdesc_getTasks" msgid="7454215995847658102">"به برنامه امکان می‌دهد اطلاعات مربوط به کارهای در حال اجرای اخیر Ùˆ کنونی را بازیابی کند. این ممکن است به برنامه امکان دهد به اطلاعات مربوط به برنامه‌هایی Ú©Ù‡ در دستگاه Ø§Ø³ØªÙØ§Ø¯Ù‡ می‌شوند دست یابد."</string>
<string name="permlab_interactAcrossUsers" msgid="7114255281944211682">"ارتباط بین کاربران"</string>
<string name="permdesc_interactAcrossUsers" msgid="364670963623385786">"به برنامه اجازه می‌دهد اقداماتی در بین کاربران مختل٠در دستگاه انجام دهد. ممکن است برنامه‌های مخرب از این قابلیت برای نقض Ø­ÙØ§Ø¸Øª موجود در بین کاربران Ø§Ø³ØªÙØ§Ø¯Ù‡ کنند."</string>
@@ -281,33 +286,33 @@
<string name="permlab_manageUsers" msgid="1676150911672282428">"مدیریت کاربران"</string>
<string name="permdesc_manageUsers" msgid="8409306667645355638">"به برنامه‌ها اجازه می‌دهد مدیریت کاربران، از قبیل پرسش، ایجاد و حذ٠کاربران، را در دستگاه انجام دهند."</string>
<string name="permlab_getDetailedTasks" msgid="6229468674753529501">"بازیابی جزئیات برنامه‌های در حال اجرا"</string>
- <string name="permdesc_getDetailedTasks" msgid="153824741440717599">"به برنامه اجازه می‎دهد تا اطلاعات Ù…ÙØµÙ„ÛŒ مربوط به کارهایی Ú©Ù‡ در حال حاضر Ùˆ اخیراً اجرا می‎شوند را بازیابی کند. برنامه‎های مخرب می‎توانند اطلاعات شخصی مربوط به برنامه‎های دیگر را پیدا کنند."</string>
- <string name="permlab_reorderTasks" msgid="2018575526934422779">"تنظیم مجدد ترتیب برنامه‎های در حال اجرا"</string>
- <string name="permdesc_reorderTasks" msgid="7734217754877439351">"به برنامه اجازه می‎دهد تا کارها را به پیش‌زمینه و پس‌زمینه منتقل کند. برنامه‎ ممکن است بدون دخالت شما این کار را انجام دهد."</string>
- <string name="permlab_removeTasks" msgid="6821513401870377403">"متوق٠کردن برنامه‎های در حال اجرا"</string>
- <string name="permdesc_removeTasks" msgid="1394714352062635493">"به برنامه اجازه می‎دهد تا کارها را حذ٠کند و برنامه‎های آن‌ها را متوق٠کند. برنامه‎های مخرب می‌توانند در اجرای برنامه‎های دیگر اختلال ایجاد ‎کنند."</string>
+ <string name="permdesc_getDetailedTasks" msgid="153824741440717599">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا اطلاعات Ù…ÙØµÙ„ÛŒ مربوط به کارهایی Ú©Ù‡ در حال حاضر Ùˆ اخیراً اجرا می‎شوند را بازیابی کند. برنامه‎های مخرب می‎توانند اطلاعات شخصی مربوط به برنامه‎های دیگر را پیدا کنند."</string>
+ <string name="permlab_reorderTasks" msgid="2018575526934422779">"â€ØªÙ†Ø¸ÛŒÙ… مجدد ترتیب برنامه‎های در حال اجرا"</string>
+ <string name="permdesc_reorderTasks" msgid="7734217754877439351">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا کارها را به پیش‌زمینه Ùˆ پس‌زمینه منتقل کند. برنامه‎ ممکن است بدون دخالت شما این کار را انجام دهد."</string>
+ <string name="permlab_removeTasks" msgid="6821513401870377403">"â€Ù…توق٠کردن برنامه‎های در حال اجرا"</string>
+ <string name="permdesc_removeTasks" msgid="1394714352062635493">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا کارها را حذ٠کند Ùˆ برنامه‎های آن‌ها را متوق٠کند. برنامه‎های مخرب می‌توانند در اجرای برنامه‎های دیگر اختلال ایجاد ‎کنند."</string>
<string name="permlab_manageActivityStacks" msgid="7391191384027303065">"مدیریت پشته‌های ÙØ¹Ø§Ù„یت"</string>
<string name="permdesc_manageActivityStacks" msgid="1615881933034084440">"به برنامه اجازه می‌دهد پشته‌های ÙØ¹Ø§Ù„یتی Ú©Ù‡ سایر برنامه‌ها در آنها اجرا می‌شوند را اضاÙÙ‡ یا حذ٠کند Ùˆ تغییر دهد. برنامه‌های مخرب ممکن است ÙØ¹Ø§Ù„یت برنامه‌های دیگر را مختل کنند."</string>
<string name="permlab_startAnyActivity" msgid="2918768238045206456">"شروع هر نوع ÙØ¹Ø§Ù„یت"</string>
- <string name="permdesc_startAnyActivity" msgid="997823695343584001">"به برنامه اجازه می‎دهد هر ÙØ¹Ø§Ù„یتی را شروع کند بدون اینکه وضعیت صادرشده یا Ø­ÙØ§Ø¸Øª با مجوز در نظر Ú¯Ø±ÙØªÙ‡ شود."</string>
+ <string name="permdesc_startAnyActivity" msgid="997823695343584001">"â€Ø¨Ù‡ برنامه اجازه می‎دهد هر ÙØ¹Ø§Ù„یتی را شروع کند بدون اینکه وضعیت صادرشده یا Ø­ÙØ§Ø¸Øª با مجوز در نظر Ú¯Ø±ÙØªÙ‡ شود."</string>
<string name="permlab_setScreenCompatibility" msgid="6975387118861842061">"تنظیم سازگاری با ØµÙØ­Ù‡Ù” نمایش"</string>
<string name="permdesc_setScreenCompatibility" msgid="692043618693917374">"به برنامهٔ کاربردی اجازه کنترل حالت سازگاری ØµÙØ­Ù‡Ù” نمایش برای برنامه‌های دیگر را می‌دهد. برنامه‌های خرابکار ممکن است باعث کارکرد نادرست دیگر برنامه‌ها شوند."</string>
<string name="permlab_setDebugApp" msgid="3022107198686584052">"ÙØ¹Ø§Ù„ کردن عیب‌یابی برنامه"</string>
- <string name="permdesc_setDebugApp" msgid="4474512416299013256">"به برنامه اجازه می‎دهد تا عیب‌یابی را برای برنامه‌ای دیگر ÙØ¹Ø§Ù„ کند. برنامه‎های مخرب می‎توانند از آن Ø§Ø³ØªÙØ§Ø¯Ù‡ کنند تا اجرای برنامه‎های دیگر را متوق٠کنند."</string>
+ <string name="permdesc_setDebugApp" msgid="4474512416299013256">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا عیب‌یابی را برای برنامه‌ای دیگر ÙØ¹Ø§Ù„ کند. برنامه‎های مخرب می‎توانند از آن Ø§Ø³ØªÙØ§Ø¯Ù‡ کنند تا اجرای برنامه‎های دیگر را متوق٠کنند."</string>
<string name="permlab_changeConfiguration" msgid="4162092185124234480">"تغییر تنظیمات نمایشگر سیستم"</string>
- <string name="permdesc_changeConfiguration" msgid="4372223873154296076">"به برنامه اجازه می‎دهد تا پیکربندی ÙØ¹Ù„ی، از قبیل اندازه Ú©Ù„ÛŒ قلم یا محل، را تغییر دهد."</string>
+ <string name="permdesc_changeConfiguration" msgid="4372223873154296076">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا پیکربندی ÙØ¹Ù„ی، از قبیل اندازه Ú©Ù„ÛŒ قلم یا محل، را تغییر دهد."</string>
<string name="permlab_enableCarMode" msgid="5684504058192921098">"ÙØ¹Ø§Ù„ کردن حالت خودرو"</string>
- <string name="permdesc_enableCarMode" msgid="4853187425751419467">"به برنامه اجازه می‎دهد تا حالت خودرو را ÙØ¹Ø§Ù„ کند."</string>
+ <string name="permdesc_enableCarMode" msgid="4853187425751419467">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا حالت خودرو را ÙØ¹Ø§Ù„ کند."</string>
<string name="permlab_killBackgroundProcesses" msgid="3914026687420177202">"بستن سایر برنامه‌ها"</string>
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"به برنامه امکان می‌دهد به ÙØ±Ø¢ÛŒÙ†Ø¯Ù‡Ø§ÛŒ پس‌زمینه سایر برنامه‌ها پایان دهد. این ممکن است باعث شود سایر برنامه‌ها متوق٠شوند."</string>
- <string name="permlab_forceStopPackages" msgid="2329627428832067700">"توق٠اجباری برنامه‎های دیگر"</string>
- <string name="permdesc_forceStopPackages" msgid="5253157296183940812">"به برنامه اجازه می‎دهد تا به اجبار برنامه‎های دیگر را متوق٠کند."</string>
+ <string name="permlab_forceStopPackages" msgid="2329627428832067700">"â€ØªÙˆÙ‚٠اجباری برنامه‎های دیگر"</string>
+ <string name="permdesc_forceStopPackages" msgid="5253157296183940812">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا به اجبار برنامه‎های دیگر را متوق٠کند."</string>
<string name="permlab_forceBack" msgid="652935204072584616">"بستن اجباری برنامه"</string>
- <string name="permdesc_forceBack" msgid="3892295830419513623">"به برنامه اجازه می‎دهد تا برنامه‌ای را که در پیش زمینه است ببندد و برگردد. برای برنامه‎های عادی مورد نیاز نیست."</string>
+ <string name="permdesc_forceBack" msgid="3892295830419513623">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا برنامه‌ای را Ú©Ù‡ در پیش زمینه است ببندد Ùˆ برگردد. برای برنامه‎های عادی مورد نیاز نیست."</string>
<string name="permlab_dump" msgid="1681799862438954752">"بازیابی وضعیت داخلی سیستم"</string>
- <string name="permdesc_dump" msgid="1778299088692290329">"به برنامه اجازه می‎دهد تا وضعیت داخلی سیستم را بازیابی کند. برنامه‎های مخرب می‎توانند انواع مختلÙÛŒ از اطلاعات خصوصی Ùˆ امن را Ú©Ù‡ معمولا به آن‌ها نیاز ندارند، بازیابی کنند."</string>
+ <string name="permdesc_dump" msgid="1778299088692290329">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا وضعیت داخلی سیستم را بازیابی کند. برنامه‎های مخرب می‎توانند انواع مختلÙÛŒ از اطلاعات خصوصی Ùˆ امن را Ú©Ù‡ معمولا به آن‌ها نیاز ندارند، بازیابی کنند."</string>
<string name="permlab_retrieve_window_content" msgid="8022588608994589938">"بازیابی محتوای ØµÙØ­Ù‡"</string>
- <string name="permdesc_retrieve_window_content" msgid="3193269069469700265">"به برنامه اجازه می‎دهد تا محتوای پنجره ÙØ¹Ø§Ù„ را بازیابی کند. برنامه‎های مخرب می‎توانند Ú©Ù„ محتوای پنجره را بازیابی کنند Ùˆ همه متن آنرا به غیر از گذرواژه‎ها امتحان کنند."</string>
+ <string name="permdesc_retrieve_window_content" msgid="3193269069469700265">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا محتوای پنجره ÙØ¹Ø§Ù„ را بازیابی کند. برنامه‎های مخرب می‎توانند Ú©Ù„ محتوای پنجره را بازیابی کنند Ùˆ همه متن آنرا به غیر از گذرواژه‎ها امتحان کنند."</string>
<string name="permlab_temporary_enable_accessibility" msgid="2312612135127310254">"قابلیت دسترسی به طور موقت ÙØ¹Ø§Ù„ شود"</string>
<string name="permdesc_temporary_enable_accessibility" msgid="8079456293182975464">"به یک برنامه اجازه می‌دهد به صورت موقت قابلیت دسترسی را در دستگاه ÙØ¹Ø§Ù„ کند. برنامه‌های مخرب می‌توانند قابلیت دسترسی را بدون رضایت کاربر ÙØ¹Ø§Ù„ کنند."</string>
<string name="permlab_retrieve_window_info" msgid="8532295199112519378">"بازیابی اطلاعات پنجره"</string>
@@ -319,124 +324,124 @@
<string name="permlab_shutdown" msgid="7185747824038909016">"خاموش شدن جزئی"</string>
<string name="permdesc_shutdown" msgid="7046500838746291775">"مدیر ÙØ¹Ø§Ù„یت را در حالت خاموشی قرار می‌دهد. خاموشی را به صورت کامل انجام نمی‌دهد."</string>
<string name="permlab_stopAppSwitches" msgid="4138608610717425573">"ممانعت از جابجایی برنامه"</string>
- <string name="permdesc_stopAppSwitches" msgid="8262195802582255021">"اجازه نمی‎دهد کاربر به برنامه دیگری برود."</string>
+ <string name="permdesc_stopAppSwitches" msgid="8262195802582255021">"â€Ø§Ø¬Ø§Ø²Ù‡ نمی‎دهد کاربر به برنامه دیگری برود."</string>
<string name="permlab_getTopActivityInfo" msgid="2537922311411546016">"Ø¯Ø±ÛŒØ§ÙØª اطلاعات برنامه ÙØ¹Ù„ÛŒ"</string>
<string name="permdesc_getTopActivityInfo" msgid="2512448855496067131">"به دارنده اجازه می‌دهد اطلاعات خصوصی مربوط به برنامه ÙØ¹Ù„ÛŒ را در پیش زمینه ØµÙØ­Ù‡ بازیابی کند."</string>
<string name="permlab_runSetActivityWatcher" msgid="892239094867182656">"نظارت و کنترل راه‌اندازی همه برنامه"</string>
- <string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"به برنامه اجازه می‎دهد تا نحوه راه‌اندازی ÙØ¹Ø§Ù„یت‌های سیستم را کنترل کند. برنامه‎های مخرب می‎توانند کاملا با سیستم سازگار شوند. این مجوز Ùقط برای توسعه نیاز است Ùˆ برای Ø§Ø³ØªÙØ§Ø¯Ù‡ عادی نیست."</string>
+ <string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا نحوه راه‌اندازی ÙØ¹Ø§Ù„یت‌های سیستم را کنترل کند. برنامه‎های مخرب می‎توانند کاملا با سیستم سازگار شوند. این مجوز Ùقط برای توسعه نیاز است Ùˆ برای Ø§Ø³ØªÙØ§Ø¯Ù‡ عادی نیست."</string>
<string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"ارسال پخش بسته حذ٠شده"</string>
- <string name="permdesc_broadcastPackageRemoved" msgid="6621901216207931089">"به برنامه اجازه می‎دهد تا اعلان حذ٠بسته برنامه را پخش کند. برنامه‎های مخرب می‎توانند از آن Ø§Ø³ØªÙØ§Ø¯Ù‡ کنند تا هر برنامه در حال اجرای دیگر را از بین ببرد."</string>
+ <string name="permdesc_broadcastPackageRemoved" msgid="6621901216207931089">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا اعلان حذ٠بسته برنامه را پخش کند. برنامه‎های مخرب می‎توانند از آن Ø§Ø³ØªÙØ§Ø¯Ù‡ کنند تا هر برنامه در حال اجرای دیگر را از بین ببرد."</string>
<string name="permlab_broadcastSmsReceived" msgid="5689095009030336593">"ارسال پخش Ø¯Ø±ÛŒØ§ÙØª شده توسط پیامک"</string>
- <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"به برنامه اجازه می‎دهد تا اعلان Ø¯Ø±ÛŒØ§ÙØª پیام کوتاه را پخش کند. برنامه‎های مخرب می‎توانند از این برای جعل پیام‌های کوتاه ورودی Ø§Ø³ØªÙØ§Ø¯Ù‡ کنند."</string>
- <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"ارسال پخش Ø¯Ø±ÛŒØ§ÙØª شده توسط WAP-PUSH"</string>
- <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"به برنامه اجازه می‎دهد تا اعلانی را پخش کند Ú©Ù‡ پیام WAP PUSH Ø¯Ø±ÛŒØ§ÙØª کرده است. برنامه‎های مخرب می‎توانند از آن Ø§Ø³ØªÙØ§Ø¯Ù‡ کنند تا Ø¯Ø±ÛŒØ§ÙØª پیام MMS را جعل کنند یا محتوای هر ØµÙØ­Ù‡Ù” وب را با انواع مخرب جایگزین کنند."</string>
+ <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا اعلان Ø¯Ø±ÛŒØ§ÙØª پیام کوتاه را پخش کند. برنامه‎های مخرب می‎توانند از این برای جعل پیام‌های کوتاه ورودی Ø§Ø³ØªÙØ§Ø¯Ù‡ کنند."</string>
+ <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"â€Ø§Ø±Ø³Ø§Ù„ پخش Ø¯Ø±ÛŒØ§ÙØª شده توسط WAP-PUSH"</string>
+ <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا اعلانی را پخش کند Ú©Ù‡ پیام WAP PUSH Ø¯Ø±ÛŒØ§ÙØª کرده است. برنامه‎های مخرب می‎توانند از آن Ø§Ø³ØªÙØ§Ø¯Ù‡ کنند تا Ø¯Ø±ÛŒØ§ÙØª پیام MMS را جعل کنند یا محتوای هر ØµÙØ­Ù‡Ù” وب را با انواع مخرب جایگزین کنند."</string>
<string name="permlab_setProcessLimit" msgid="2451873664363662666">"محدود کردن تعداد ÙØ±Ø¢ÛŒÙ†Ø¯Ù‡Ø§ÛŒ در حال اجرا"</string>
- <string name="permdesc_setProcessLimit" msgid="7318061314040879542">"به برنامه اجازه می‎دهد تا حداکثر تعداد پردازشهایی را که اجرا خواهد شد کنترل کند. هرگز برای برنامه‎های عادی لازم نیست."</string>
+ <string name="permdesc_setProcessLimit" msgid="7318061314040879542">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا حداکثر تعداد پردازشهایی را Ú©Ù‡ اجرا خواهد شد کنترل کند. هرگز برای برنامه‎های عادی لازم نیست."</string>
<string name="permlab_setAlwaysFinish" msgid="550958507798796965">"بستن اجباری برنامه‌های پس‌زمینه"</string>
- <string name="permdesc_setAlwaysFinish" msgid="7471310652868841499">"به برنامه اجازه می‎دهد تا به محض اینکه ÙØ¹Ø§Ù„یتها به پس‌زمینه Ø±ÙØªÙ†Ø¯ تمام شوند. برای برنامه‎های عادی نیازی نیست."</string>
+ <string name="permdesc_setAlwaysFinish" msgid="7471310652868841499">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا به محض اینکه ÙØ¹Ø§Ù„یتها به پس‌زمینه Ø±ÙØªÙ†Ø¯ تمام شوند. برای برنامه‎های عادی نیازی نیست."</string>
<string name="permlab_batteryStats" msgid="2789610673514103364">"خواندن آمار باتری"</string>
<string name="permdesc_batteryStats" msgid="5897346582882915114">"به یک برنامه کاربردی اجازه می‌دهد Ú©Ù‡ داده‌های Ø§Ø³ØªÙØ§Ø¯Ù‡ کننده از میزان باتری Ú©Ù… کنونی را بخواند. این کار ممکن است به برنامه این امکان را بدهد Ú©Ù‡ اطلاعات جزئی درباره برنامه‌هایی Ú©Ù‡ Ø§Ø³ØªÙØ§Ø¯Ù‡ می‌کنید، بدست آورد."</string>
<string name="permlab_updateBatteryStats" msgid="3719689764536379557">"اصلاح آمار باتری"</string>
- <string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"به برنامه اجازه می‎دهد تا آمار جمع‌آوری شده باتری را تغییر دهد. برای Ø§Ø³ØªÙØ§Ø¯Ù‡ برنامه‎های عادی نیست."</string>
+ <string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا آمار جمع‌آوری شده باتری را تغییر دهد. برای Ø§Ø³ØªÙØ§Ø¯Ù‡ برنامه‎های عادی نیست."</string>
<string name="permlab_getAppOpsStats" msgid="1508779687436585744">"بازیابی آمار مربوط به کارکرد برنامه"</string>
<string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"به برنامه امکان می‌دهد آمار جمع‌آوری شده مربوط به عملکرد برنامه را بازیابی کند. برای Ø§Ø³ØªÙØ§Ø¯Ù‡ توسط برنامه‌های معمولی، در نظر Ú¯Ø±ÙØªÙ‡ نشده است."</string>
<string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"تغییر آمار کارکرد برنامه"</string>
<string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"به برنامه اجازه تغییر آمار کارکرد جمع‌آوری شده از برنامه را می‌دهد. برای Ø§Ø³ØªÙØ§Ø¯Ù‡ توسط برنامه‌های معمولی نیست."</string>
<string name="permlab_backup" msgid="470013022865453920">"کنترل نسخهٔ پشتیبان سیستم و بازیابی"</string>
- <string name="permdesc_backup" msgid="6912230525140589891">"به برنامه اجازه می‎دهد پشتیبان سیستم را کنترل کند Ùˆ مکانیستم را بازیابی کند. برای Ø§Ø³ØªÙØ§Ø¯Ù‡ برنامه‎های عادی نیست."</string>
+ <string name="permdesc_backup" msgid="6912230525140589891">"â€Ø¨Ù‡ برنامه اجازه می‎دهد پشتیبان سیستم را کنترل کند Ùˆ مکانیستم را بازیابی کند. برای Ø§Ø³ØªÙØ§Ø¯Ù‡ برنامه‎های عادی نیست."</string>
<string name="permlab_confirm_full_backup" msgid="5557071325804469102">"تهیهٔ نسخهٔ پشتیبان کامل را تأیید کرده یا عملیات را بازیابی کنید"</string>
- <string name="permdesc_confirm_full_backup" msgid="1748762171637699562">"به برنامه اجازه می‎دهد تا رابط کاربر تایید نسخه کامل پشتیبان را راه‌اندازی کند. هر برنامه‌ای نمی‎تواند از آن Ø§Ø³ØªÙØ§Ø¯Ù‡ کند."</string>
+ <string name="permdesc_confirm_full_backup" msgid="1748762171637699562">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا رابط کاربر تایید نسخه کامل پشتیبان را راه‌اندازی کند. هر برنامه‌ای نمی‎تواند از آن Ø§Ø³ØªÙØ§Ø¯Ù‡ کند."</string>
<string name="permlab_internalSystemWindow" msgid="2148563628140193231">"نمایش پنجره‌های غیرمجاز"</string>
- <string name="permdesc_internalSystemWindow" msgid="7458387759461466397">"به برنامه اجازه می‎دهد پنجره‎هایی را ایجاد کند Ú©Ù‡ می‎خواهد توسط رابط کاربر سیستم داخلی Ø§Ø³ØªÙØ§Ø¯Ù‡ شود. برای Ø§Ø³ØªÙØ§Ø¯Ù‡ برنامه‎های عادی نیست."</string>
+ <string name="permdesc_internalSystemWindow" msgid="7458387759461466397">"â€Ø¨Ù‡ برنامه اجازه می‎دهد پنجره‎هایی را ایجاد کند Ú©Ù‡ می‎خواهد توسط رابط کاربر سیستم داخلی Ø§Ø³ØªÙØ§Ø¯Ù‡ شود. برای Ø§Ø³ØªÙØ§Ø¯Ù‡ برنامه‎های عادی نیست."</string>
<string name="permlab_systemAlertWindow" msgid="3543347980839518613">"ترسیم روی برنامه‌های دیگر"</string>
<string name="permdesc_systemAlertWindow" msgid="8584678381972820118">"به برنامه اجازه می‌دهد Ú©Ù‡ در بالا یا بخش‌هایی از رابط کاربری دیگر برنامه‌های کاربردی متصل شود. این کار می‌تواند در Ø§Ø³ØªÙØ§Ø¯Ù‡ شما از رابط هر برنامه کاربردی تداخل ایجاد کند یا آنچه را Ú©Ù‡ به نظر خود در دیگر برنامه‌های کاربردی می‌بینید، تغییر دهد."</string>
<string name="permlab_setAnimationScale" msgid="2805103241153907174">"اصلاح سرعت انیمیشن کلی"</string>
- <string name="permdesc_setAnimationScale" msgid="7690063428924343571">"به برنامه اجازه می‎دهد سرعت کلی انیمیشن را هر زمان که بخواهد تغییر دهد (انیمیشن‎های سریعتر یا آهسته‎تر)."</string>
- <string name="permlab_manageAppTokens" msgid="1286505717050121370">"مدیریت نشانه‎های برنامه"</string>
- <string name="permdesc_manageAppTokens" msgid="8043431713014395671">"به برنامه اجازه می‎دهد با ایجاد کنارگذر از Ø³ÙØ§Ø±Ø´ عادی ZØŒ نشانه‎های خود را ایجاد Ùˆ مدیریت کند. برای برنامه‎های عادی مورد نیاز است."</string>
+ <string name="permdesc_setAnimationScale" msgid="7690063428924343571">"â€Ø¨Ù‡ برنامه اجازه می‎دهد سرعت Ú©Ù„ÛŒ انیمیشن را هر زمان Ú©Ù‡ بخواهد تغییر دهد (انیمیشن‎های سریعتر یا آهسته‎تر)."</string>
+ <string name="permlab_manageAppTokens" msgid="1286505717050121370">"â€Ù…دیریت نشانه‎های برنامه"</string>
+ <string name="permdesc_manageAppTokens" msgid="8043431713014395671">"â€Ø¨Ù‡ برنامه اجازه می‎دهد با ایجاد کنارگذر از Ø³ÙØ§Ø±Ø´ عادی ZØŒ نشانه‎های خود را ایجاد Ùˆ مدیریت کند. برای برنامه‎های عادی مورد نیاز است."</string>
<string name="permlab_freezeScreen" msgid="4708181184441880175">"ثابت Ù†Ú¯Ù‡ داشتن ØµÙØ­Ù‡"</string>
<string name="permdesc_freezeScreen" msgid="8558923789222670064">"به برنامه کاربردی اجازه می‌دهد Ú©Ù‡ موقتاً ØµÙØ­Ù‡ را برای یک انتقال تمام ØµÙØ­Ù‡ ثابت Ù†Ú¯Ù‡ دارد."</string>
<string name="permlab_injectEvents" msgid="1378746584023586600">"کلیدها Ùˆ دکمه‌های کنترل را ÙØ´Ø§Ø± دهید"</string>
- <string name="permdesc_injectEvents" product="tablet" msgid="206352565599968632">"به برنامه اجازه می‎دهد تا رویدادهای ورودی خود (ÙØ´Ø±Ø¯Ù† کلیدها Ùˆ غیره) را تحویل دهد. برنامه‎های مخرب می‎توانند از آن Ø§Ø³ØªÙØ§Ø¯Ù‡ کنند تا کارکرد رایانهٔ لوحی را کنترل کنند."</string>
- <string name="permdesc_injectEvents" product="default" msgid="653128057572326253">"به برنامه اجازه می‎دهد تا رویدادهای ورودی خود را به برنامه‎های دیگر تحویل دهد (ÙØ´Ø±Ø¯Ù† کلیدها Ùˆ غیره). برنامه‎های مخرب می‎توانند از آن برای کنترل کارکرد تلÙÙ† Ø§Ø³ØªÙØ§Ø¯Ù‡ کنند."</string>
+ <string name="permdesc_injectEvents" product="tablet" msgid="206352565599968632">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا رویدادهای ورودی خود (ÙØ´Ø±Ø¯Ù† کلیدها Ùˆ غیره) را تحویل دهد. برنامه‎های مخرب می‎توانند از آن Ø§Ø³ØªÙØ§Ø¯Ù‡ کنند تا کارکرد رایانهٔ لوحی را کنترل کنند."</string>
+ <string name="permdesc_injectEvents" product="default" msgid="653128057572326253">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا رویدادهای ورودی خود را به برنامه‎های دیگر تحویل دهد (ÙØ´Ø±Ø¯Ù† کلیدها Ùˆ غیره). برنامه‎های مخرب می‎توانند از آن برای کنترل کارکرد تلÙÙ† Ø§Ø³ØªÙØ§Ø¯Ù‡ کنند."</string>
<string name="permlab_readInputState" msgid="469428900041249234">"مواردی که می‌نویسید و کارهایی که انجام می‌دهید را ضبط کنید"</string>
- <string name="permdesc_readInputState" msgid="8387754901688728043">"به برنامه اجازه می‎دهد تا کلیدهایی را Ú©Ù‡ هنگام تعامل با برنامهٔ دیگر ÙØ´Ø§Ø± می‎دهید ببیند (مانند تایپ کردن گذرواژه). برای برنامه‎های عادی مورد نیاز نیست."</string>
+ <string name="permdesc_readInputState" msgid="8387754901688728043">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا کلیدهایی را Ú©Ù‡ هنگام تعامل با برنامهٔ دیگر ÙØ´Ø§Ø± می‎دهید ببیند (مانند تایپ کردن گذرواژه). برای برنامه‎های عادی مورد نیاز نیست."</string>
<string name="permlab_bindInputMethod" msgid="3360064620230515776">"پیوند شده به روش ورودی"</string>
- <string name="permdesc_bindInputMethod" msgid="3250440322807286331">"به دارنده این دستگاه اجازه می‎دهد تا به رابط سطح بالای یک روش ورودی متصل شود. این ویژگی هیچگاه برای برنامه‎های معمولی ضروری نمی‎باشد."</string>
+ <string name="permdesc_bindInputMethod" msgid="3250440322807286331">"â€Ø¨Ù‡ دارنده این دستگاه اجازه می‎دهد تا به رابط سطح بالای یک روش ورودی متصل شود. این ویژگی هیچگاه برای برنامه‎های معمولی ضروری نمی‎باشد."</string>
<string name="permlab_bindAccessibilityService" msgid="5357733942556031593">"اتصال به سرویس دسترسی"</string>
<string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"به دارنده اجازه می‌دهد که به رابط سطح بالای سرویس دسترسی متصل شود. هرگز برای برنامه‌های معمولی مورد نیاز نیست."</string>
<string name="permlab_bindPrintService" msgid="8462815179572748761">"اتصال به یک سرویس چاپ"</string>
<string name="permdesc_bindPrintService" msgid="7960067623209111135">"به برنامه اجازه می‌دهد که به رابط سطح بالای سرویس چاپ متصل شود. هرگز برای برنامه‌های معمولی مورد نیاز نیست."</string>
<string name="permlab_bindPrintSpoolerService" msgid="6807762783744125954">"اتصال به سرویس هماهنگ‌کننده چاپ"</string>
<string name="permdesc_bindPrintSpoolerService" msgid="3680552285933318372">"به دارنده اجازه می‌دهد که به واسط سطح بالای سرویس هماهنگ‌کننده چاپ متصل شود. هرگز برای برنامه‌های معمولی مورد نیاز نیست."</string>
- <string name="permlab_bindNfcService" msgid="2752731300419410724">"اتصال به سرویس NFC"</string>
- <string name="permdesc_bindNfcService" msgid="6120647629174066862">"به دارنده اجازه می‌دهد به برنامه‌هایی متصل شود که مشابه با کارت‌های NFC عمل می‌کنند. هرگز نباید برای برنامه‌های عادی مورد نیاز باشد."</string>
+ <string name="permlab_bindNfcService" msgid="2752731300419410724">"â€Ø§ØªØµØ§Ù„ به سرویس NFC"</string>
+ <string name="permdesc_bindNfcService" msgid="6120647629174066862">"â€Ø¨Ù‡ دارنده اجازه می‌دهد به برنامه‌هایی متصل شود Ú©Ù‡ مشابه با کارت‌های NFC عمل می‌کنند. هرگز نباید برای برنامه‌های عادی مورد نیاز باشد."</string>
<string name="permlab_bindTextService" msgid="7358378401915287938">"اتصال به یک سرویس متنی"</string>
- <string name="permdesc_bindTextService" msgid="8151968910973998670">"به دارنده اجازه می‌دهد خود را به یک رابط سطح بالای خدمات متنی مرتبط کند (برای مثال SpellCheckerService). هرگز برای برنامه‌های عادی لازم نیست."</string>
- <string name="permlab_bindVpnService" msgid="4708596021161473255">"اتصال به یک سرویس VPN"</string>
- <string name="permdesc_bindVpnService" msgid="2067845564581693905">"به دارنده اجازه می‌دهد که به رابط سطح بالای سرویس Vpn متصل شود. هرگز برای برنامه‌های معمولی مورد نیاز نیست."</string>
+ <string name="permdesc_bindTextService" msgid="8151968910973998670">"â€Ø¨Ù‡ دارنده اجازه می‌دهد خود را به یک رابط سطح بالای خدمات متنی مرتبط کند (برای مثال SpellCheckerService). هرگز برای برنامه‌های عادی لازم نیست."</string>
+ <string name="permlab_bindVpnService" msgid="4708596021161473255">"â€Ø§ØªØµØ§Ù„ به یک سرویس VPN"</string>
+ <string name="permdesc_bindVpnService" msgid="2067845564581693905">"â€Ø¨Ù‡ دارنده اجازه می‌دهد Ú©Ù‡ به رابط سطح بالای سرویس Vpn متصل شود. هرگز برای برنامه‌های معمولی مورد نیاز نیست."</string>
<string name="permlab_bindWallpaper" msgid="8716400279937856462">"پیوند شده به تصویر زمینه"</string>
- <string name="permdesc_bindWallpaper" msgid="7108428692595491668">"به دارنده اجازه می‎دهد تا به رابط سطح بالای تصویر زمینه متصل شود. برنامه‎های معمولی هرگز به این ویژگی نیاز ندارند."</string>
+ <string name="permdesc_bindWallpaper" msgid="7108428692595491668">"â€Ø¨Ù‡ دارنده اجازه می‎دهد تا به رابط سطح بالای تصویر زمینه متصل شود. برنامه‎های معمولی هرگز به این ویژگی نیاز ندارند."</string>
<string name="permlab_bindRemoteViews" msgid="5697987759897367099">"اتصال به یک سرویس ابزارک"</string>
<string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"به دارنده اجازه می‌دهد که به رابط سطح بالای سرویس ابزارک متصل شود. هرگز برای برنامه‌های معمولی مورد نیاز نیست."</string>
<string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"تعامل با یک سرپرست دستگاه"</string>
- <string name="permdesc_bindDeviceAdmin" msgid="569715419543907930">"به دارنده اجازه می‎دهد اهدا٠خود را به سرپرست دستگاه ارسال کند. برنامه‎های معمولی هیچگاه به این ویژگی نیازی ندارند."</string>
+ <string name="permdesc_bindDeviceAdmin" msgid="569715419543907930">"â€Ø¨Ù‡ دارنده اجازه می‎دهد اهدا٠خود را به سرپرست دستگاه ارسال کند. برنامه‎های معمولی هیچگاه به این ویژگی نیازی ندارند."</string>
<string name="permlab_manageDeviceAdmins" msgid="4248828900045808722">"اضاÙÙ‡ یا حذ٠سرپرست دستگاه"</string>
<string name="permdesc_manageDeviceAdmins" msgid="5025608167709942485">"به دارنده اجازه می‌دهد سرپرستان دستگاه ÙØ¹Ø§Ù„ را اضاÙÙ‡ یا حذ٠کند.هرگز نباید برای برنامه‌های عادی مورد نیاز باشد."</string>
<string name="permlab_setOrientation" msgid="3365947717163866844">"تغییر جهت ØµÙØ­Ù‡"</string>
- <string name="permdesc_setOrientation" msgid="3046126619316671476">"به برنامه اجازه می‎دهد تا چرخش ØµÙØ­Ù‡ را هر وقت بخواهد تغییر دهد. برای برنامه‎های عادی نیاز نیست."</string>
+ <string name="permdesc_setOrientation" msgid="3046126619316671476">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا چرخش ØµÙØ­Ù‡ را هر وقت بخواهد تغییر دهد. برای برنامه‎های عادی نیاز نیست."</string>
<string name="permlab_setPointerSpeed" msgid="9175371613322562934">"تغییر سرعت اشاره‌گر"</string>
- <string name="permdesc_setPointerSpeed" msgid="6866563234274104233">"به برنامه اجازه می‎دهد تا سرعت ماوس و پد کنترل را هر وقت خواست تغییر دهد. برای برنامه‎های عادی نیاز نیست."</string>
+ <string name="permdesc_setPointerSpeed" msgid="6866563234274104233">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا سرعت ماوس Ùˆ پد کنترل را هر وقت خواست تغییر دهد. برای برنامه‎های عادی نیاز نیست."</string>
<string name="permlab_setKeyboardLayout" msgid="4778731703600909340">"تغییر چیدمان ØµÙØ­Ù‡â€ŒÚ©Ù„ید"</string>
<string name="permdesc_setKeyboardLayout" msgid="8480016771134175879">"به برنامه اجازه می‌دهد تا چیدمان ØµÙØ­Ù‡â€ŒÚ©Ù„ید را تغییر دهد. این کار هیچ‌گاه برای برنامه‌های عادی نیاز نیست."</string>
- <string name="permlab_signalPersistentProcesses" msgid="4539002991947376659">"ارسال سیگنالهای Linux به برنامه‎ها"</string>
- <string name="permdesc_signalPersistentProcesses" msgid="4896992079182649141">"به برنامه اجازه می‎دهد تا درخواست کند سیگنال ارائه شده به همه مراحل دائم ارسال شود."</string>
+ <string name="permlab_signalPersistentProcesses" msgid="4539002991947376659">"â€Ø§Ø±Ø³Ø§Ù„ سیگنالهای Linux به برنامه‎ها"</string>
+ <string name="permdesc_signalPersistentProcesses" msgid="4896992079182649141">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا درخواست کند سیگنال ارائه شده به همه مراحل دائم ارسال شود."</string>
<string name="permlab_persistentActivity" msgid="8841113627955563938">"همیشه برنامه اجرا شود"</string>
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"به برنامه امکان می‌دهد قسمت‌هایی از خود را در Ø­Ø§ÙØ¸Ù‡ دائمی کند. این کار Ø­Ø§ÙØ¸Ù‡ موجود را برای سایر برنامه‌ها محدود کرده Ùˆ باعث کندی رایانهٔ لوحی می‌شود."</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"به برنامه امکان می‌دهد قسمت‌هایی از خود را در Ø­Ø§ÙØ¸Ù‡ دائمی کند. این کار Ø­Ø§ÙØ¸Ù‡ موجود را برای سایر برنامه‌ها محدود کرده Ùˆ باعث کندی تلÙÙ† می‌شود."</string>
- <string name="permlab_deletePackages" msgid="184385129537705938">"حذ٠برنامه‎ها"</string>
- <string name="permdesc_deletePackages" msgid="7411480275167205081">"به برنامه اجازه می‎دهد تا بسته‎های Android را پاک کند. برنامه‎های مخرب می‎توانند از آن Ø§Ø³ØªÙØ§Ø¯Ù‡ کنند تا برنامه‎های مهم را حذ٠کنند."</string>
- <string name="permlab_clearAppUserData" msgid="274109191845842756">"حذ٠داده‎های برنامه‎های دیگر"</string>
- <string name="permdesc_clearAppUserData" msgid="4625323684125459488">"به برنامه اجازه می‎دهد تا داده‎های کاربر را پاک کند."</string>
- <string name="permlab_deleteCacheFiles" msgid="3128665571837408675">"Ø­Ø°Ù Ø­Ø§ÙØ¸Ù‡Ù” پنهان برنامه‎های دیگر"</string>
- <string name="permdesc_deleteCacheFiles" msgid="3812998599006730196">"به برنامه اجازه می‎دهد تا ÙØ§ÛŒÙ„‌های Ø­Ø§ÙØ¸Ù‡Ù” پنهان را پاک کند."</string>
+ <string name="permlab_deletePackages" msgid="184385129537705938">"â€Ø­Ø°Ù برنامه‎ها"</string>
+ <string name="permdesc_deletePackages" msgid="7411480275167205081">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا بسته‎های Android را پاک کند. برنامه‎های مخرب می‎توانند از آن Ø§Ø³ØªÙØ§Ø¯Ù‡ کنند تا برنامه‎های مهم را حذ٠کنند."</string>
+ <string name="permlab_clearAppUserData" msgid="274109191845842756">"â€Ø­Ø°Ù داده‎های برنامه‎های دیگر"</string>
+ <string name="permdesc_clearAppUserData" msgid="4625323684125459488">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا داده‎های کاربر را پاک کند."</string>
+ <string name="permlab_deleteCacheFiles" msgid="3128665571837408675">"â€Ø­Ø°Ù Ø­Ø§ÙØ¸Ù‡Ù” پنهان برنامه‎های دیگر"</string>
+ <string name="permdesc_deleteCacheFiles" msgid="3812998599006730196">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا ÙØ§ÛŒÙ„‌های Ø­Ø§ÙØ¸Ù‡Ù” پنهان را پاک کند."</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"اندازه گیری ÙØ¶Ø§ÛŒ Ø­Ø§ÙØ¸Ù‡ برنامه"</string>
- <string name="permdesc_getPackageSize" msgid="3921068154420738296">"به برنامه اجازه می‎دهد تا کدها، داده‎ها Ùˆ اندازه‎های Ø­Ø§ÙØ¸Ù‡Ù” پنهان خود را بازیابی کند"</string>
+ <string name="permdesc_getPackageSize" msgid="3921068154420738296">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا کدها، داده‎ها Ùˆ اندازه‎های Ø­Ø§ÙØ¸Ù‡Ù” پنهان خود را بازیابی کند"</string>
<string name="permlab_installPackages" msgid="2199128482820306924">"نصب مستقیم برنامه"</string>
- <string name="permdesc_installPackages" msgid="5628530972548071284">"به برنامه اجازه می‎دهد تا بسته‎های Android به روز شده یا جدید را نصب کند. برنامه‎های مخرب می‎توانند از این Ø§Ø³ØªÙØ§Ø¯Ù‡ کنند تا برنامه‎های جدید را با مجوزهای قوی اختیاری اضاÙÙ‡ کنند."</string>
- <string name="permlab_clearAppCache" msgid="7487279391723526815">"حذ٠تمام داده‎های Ø­Ø§ÙØ¸Ù‡Ù” پنهان برنامه"</string>
+ <string name="permdesc_installPackages" msgid="5628530972548071284">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا بسته‎های Android به روز شده یا جدید را نصب کند. برنامه‎های مخرب می‎توانند از این Ø§Ø³ØªÙØ§Ø¯Ù‡ کنند تا برنامه‎های جدید را با مجوزهای قوی اختیاری اضاÙÙ‡ کنند."</string>
+ <string name="permlab_clearAppCache" msgid="7487279391723526815">"â€Ø­Ø°Ù تمام داده‎های Ø­Ø§ÙØ¸Ù‡Ù” پنهان برنامه"</string>
<string name="permdesc_clearAppCache" product="tablet" msgid="8974640871945434565">"به برنامه اجازه می‌دهد Ú©Ù‡ ÙØ¶Ø§ÛŒ رایانه لوحی را از طریق حذ٠کردن ÙØ§ÛŒÙ„‌ها در دایرکتوری Ø­Ø§ÙØ¸Ù‡ پنهان دیگر برنامه‌های کاربردی، آزاد کند. این کار ممکن است باعث کندی دیگر برنامه‌های کاربردی در هنگام راه‌اندازی شود زیرا آنها باید دوباره داده‌های خود را بازیابی کنند."</string>
<string name="permdesc_clearAppCache" product="default" msgid="2459441021956436779">"به برنامه اجازه می‌دهد Ú©Ù‡ ÙØ¶Ø§ÛŒ تلÙÙ† را از طریق حذ٠کردن ÙØ§ÛŒÙ„‌ها در دایرکتوری Ø­Ø§ÙØ¸Ù‡ پنهان دیگر برنامه‌های کاربردی، آزاد کند. این کار ممکن است باعث راه اندازی آهسته دیگر برنامه‌های کاربردی در نتیجه نیاز آنها به بازیابی داده‌های خود، شود."</string>
<string name="permlab_movePackage" msgid="3289890271645921411">"انتقال منابع برنامه"</string>
- <string name="permdesc_movePackage" msgid="319562217778244524">"به برنامه اجازه می‎دهد تا منابع برنامه را از رسانه داخلی به رسانه خارجی و بالعکس منتقل کند."</string>
+ <string name="permdesc_movePackage" msgid="319562217778244524">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا منابع برنامه را از رسانه داخلی به رسانه خارجی Ùˆ بالعکس منتقل کند."</string>
<string name="permlab_readLogs" msgid="6615778543198967614">"مطالعه داده‌های گزارش حساس"</string>
- <string name="permdesc_readLogs" product="tablet" msgid="82061313293455151">"به برنامه اجازه می‎دهد ÙØ§ÛŒÙ„‌های مختل٠گزارش سیستم را بخواند. با این کار، برنامه اطلاعات Ú©Ù„ÛŒ مربوط به کاری Ú©Ù‡ با رایانهٔ لوحی انجام می‎دهید را کش٠می‌کند، Ú©Ù‡ ممکن است حاوی اطلاعات شخصی Ùˆ خصوصی باشند."</string>
- <string name="permdesc_readLogs" product="default" msgid="2063438140241560443">"به برنامه اجازه می‎دهد تا ÙØ§ÛŒÙ„‌های گزارش مختل٠سیستم را بخواند. این کار به برنامه اجازه می‎دهد اطلاعات عمومی کاری Ú©Ù‡ با تلÙÙ† انجام می‎دهید مثلا اطلاعات خصوصی Ùˆ شخصی را کش٠کند."</string>
- <string name="permlab_anyCodecForPlayback" msgid="715805555823881818">"Ø§Ø³ØªÙØ§Ø¯Ù‡ از هر رمزگشای رسانه‎ای برای بازپخش"</string>
- <string name="permdesc_anyCodecForPlayback" msgid="8283912488433189010">"اجازه می‎دهد برنامه از هر رمزگشای رسانه نصب شده‌ای Ø§Ø³ØªÙØ§Ø¯Ù‡ کند تا برای پخش رمزگشایی شود."</string>
+ <string name="permdesc_readLogs" product="tablet" msgid="82061313293455151">"â€Ø¨Ù‡ برنامه اجازه می‎دهد ÙØ§ÛŒÙ„‌های مختل٠گزارش سیستم را بخواند. با این کار، برنامه اطلاعات Ú©Ù„ÛŒ مربوط به کاری Ú©Ù‡ با رایانهٔ لوحی انجام می‎دهید را کش٠می‌کند، Ú©Ù‡ ممکن است حاوی اطلاعات شخصی Ùˆ خصوصی باشند."</string>
+ <string name="permdesc_readLogs" product="default" msgid="2063438140241560443">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا ÙØ§ÛŒÙ„‌های گزارش مختل٠سیستم را بخواند. این کار به برنامه اجازه می‎دهد اطلاعات عمومی کاری Ú©Ù‡ با تلÙÙ† انجام می‎دهید مثلا اطلاعات خصوصی Ùˆ شخصی را کش٠کند."</string>
+ <string name="permlab_anyCodecForPlayback" msgid="715805555823881818">"â€Ø§Ø³ØªÙاده از هر رمزگشای رسانه‎ای برای بازپخش"</string>
+ <string name="permdesc_anyCodecForPlayback" msgid="8283912488433189010">"â€Ø§Ø¬Ø§Ø²Ù‡ می‎دهد برنامه از هر رمزگشای رسانه نصب شده‌ای Ø§Ø³ØªÙØ§Ø¯Ù‡ کند تا برای پخش رمزگشایی شود."</string>
<string name="permlab_manageCaCertificates" msgid="1678391896786882014">"مدیریت اطلاعات کاربری مورد اعتماد"</string>
- <string name="permdesc_manageCaCertificates" msgid="4015644047196937014">"به برنامه امکان می‌دهد گواهینامه‌های CA را به عنوان اطلاعات کاربری مورد اعتماد نصب یا حذ٠نصب کند."</string>
+ <string name="permdesc_manageCaCertificates" msgid="4015644047196937014">"â€Ø¨Ù‡ برنامه امکان می‌دهد گواهینامه‌های CA را به عنوان اطلاعات کاربری مورد اعتماد نصب یا حذ٠نصب کند."</string>
<string name="permlab_diagnostic" msgid="8076743953908000342">"خواندن/نوشتن منابع متعلق به تشخیص"</string>
- <string name="permdesc_diagnostic" msgid="6608295692002452283">"به برنامه اجازه می‌دهد هر منبعی را Ú©Ù‡ متعلق به گروه تشخیص است بخواند Ùˆ در آن بنویسد؛ به‌عنوان مثال، ÙØ§ÛŒÙ„‌های /dev. این امر به‌صورت بالقوه می‌تواند بر پایدار بودن Ùˆ امنیت سیستم تأثیر بگذارد. این تنها باید برای تشخیص‎‌های مختص Ø³Ø®Øªâ€ŒØ§ÙØ²Ø§Ø± توسط تولیدکننده یا اپراتور Ø§Ø³ØªÙØ§Ø¯Ù‡ شود."</string>
+ <string name="permdesc_diagnostic" msgid="6608295692002452283">"â€Ø¨Ù‡ برنامه اجازه می‌دهد هر منبعی را Ú©Ù‡ متعلق به گروه تشخیص است بخواند Ùˆ در آن بنویسد؛ به‌عنوان مثال، ÙØ§ÛŒÙ„‌های /dev. این امر به‌صورت بالقوه می‌تواند بر پایدار بودن Ùˆ امنیت سیستم تأثیر بگذارد. این تنها باید برای تشخیص‎‌های مختص Ø³Ø®Øªâ€ŒØ§ÙØ²Ø§Ø± توسط تولیدکننده یا اپراتور Ø§Ø³ØªÙØ§Ø¯Ù‡ شود."</string>
<string name="permlab_changeComponentState" msgid="6335576775711095931">"ÙØ¹Ø§Ù„ یا غیر ÙØ¹Ø§Ù„ کردن اجزای برنامه"</string>
- <string name="permdesc_changeComponentState" product="tablet" msgid="8887435740982237294">"به برنامه اجازه می‎دهد تا ÙØ¹Ø§Ù„ بودن یا نبودن اجزای برنامهٔ دیگر را تغییر دهد. برنامه‎های مخرب می‎توانند از آن Ø§Ø³ØªÙØ§Ø¯Ù‡ کنند تا قابلیتهای مهم رایانهٔ لوحی را ØºÛŒØ±ÙØ¹Ø§Ù„ کنند. باید دقت کرد Ú©Ù‡ با این مجوز ممکن است وضعیت اجزای برنامه ناپایدار، ناهماهنگ یا غیرقابل Ø§Ø³ØªÙØ§Ø¯Ù‡ شود."</string>
- <string name="permdesc_changeComponentState" product="default" msgid="1827232484416505615">"به برنامه اجازه می‎دهد تا ÙØ¹Ø§Ù„ بودن یا ØºÛŒØ±ÙØ¹Ø§Ù„ بودن جزئیات برنامهٔ دیگر را تغییر دهد. برنامه‎های مخرب می‎توانند از آن Ø§Ø³ØªÙØ§Ø¯Ù‡ کنند تا ویژگی‌های مهم را ØºÛŒØ±ÙØ¹Ø§Ù„ کنند. برای این مجوز باید دقت کنید چون ممکن است وضعیت جزئیات برنامه ناپایدار، بی‎ثبات یا غیرقابل Ø§Ø³ØªÙØ§Ø¯Ù‡ شود."</string>
+ <string name="permdesc_changeComponentState" product="tablet" msgid="8887435740982237294">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا ÙØ¹Ø§Ù„ بودن یا نبودن اجزای برنامهٔ دیگر را تغییر دهد. برنامه‎های مخرب می‎توانند از آن Ø§Ø³ØªÙØ§Ø¯Ù‡ کنند تا قابلیتهای مهم رایانهٔ لوحی را ØºÛŒØ±ÙØ¹Ø§Ù„ کنند. باید دقت کرد Ú©Ù‡ با این مجوز ممکن است وضعیت اجزای برنامه ناپایدار، ناهماهنگ یا غیرقابل Ø§Ø³ØªÙØ§Ø¯Ù‡ شود."</string>
+ <string name="permdesc_changeComponentState" product="default" msgid="1827232484416505615">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا ÙØ¹Ø§Ù„ بودن یا ØºÛŒØ±ÙØ¹Ø§Ù„ بودن جزئیات برنامهٔ دیگر را تغییر دهد. برنامه‎های مخرب می‎توانند از آن Ø§Ø³ØªÙØ§Ø¯Ù‡ کنند تا ویژگی‌های مهم را ØºÛŒØ±ÙØ¹Ø§Ù„ کنند. برای این مجوز باید دقت کنید چون ممکن است وضعیت جزئیات برنامه ناپایدار، بی‎ثبات یا غیرقابل Ø§Ø³ØªÙØ§Ø¯Ù‡ شود."</string>
<string name="permlab_grantRevokePermissions" msgid="4627315351093508795">"ارائه یا لغو مجوزها"</string>
<string name="permdesc_grantRevokePermissions" msgid="4088642654085850662">"به یک برنامهٔ کاربردی اجازه می‌دهد تا مجوزهای خاصی را برای خود یا دیگر برنامه‌ها ارائه کرده یا آن‌ها را لغو کند. برنامه‌های مضر از این حالت برای دسترسی به ویژگی‌هایی Ø§Ø³ØªÙØ§Ø¯Ù‡ می‌کنند Ú©Ù‡ شما اجازه آن را در اختیارشان قرار نداده‌اید."</string>
- <string name="permlab_setPreferredApplications" msgid="8463181628695396391">"تنظیم برنامه‎های ترجیحی"</string>
- <string name="permdesc_setPreferredApplications" msgid="4973986762241783712">"به برنامه اجازه می‎دهد تا برنامه‎های ترجیحی شما را تغییر دهد. برنامه‎های مخرب می‎توانند بدون اعلان برنامه‎هایی را که اجرا می‎شوند، تغییر دهند خود را به جای برنامه‎های کنونی قلمداد کنند تا داده‎های شخصی را از شما جمع‌آوری کنند."</string>
+ <string name="permlab_setPreferredApplications" msgid="8463181628695396391">"â€ØªÙ†Ø¸ÛŒÙ… برنامه‎های ترجیحی"</string>
+ <string name="permdesc_setPreferredApplications" msgid="4973986762241783712">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا برنامه‎های ترجیحی شما را تغییر دهد. برنامه‎های مخرب می‎توانند بدون اعلان برنامه‎هایی را Ú©Ù‡ اجرا می‎شوند، تغییر دهند خود را به جای برنامه‎های کنونی قلمداد کنند تا داده‎های شخصی را از شما جمع‌آوری کنند."</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"اصلاح تنظیمات سیستم"</string>
- <string name="permdesc_writeSettings" msgid="7775723441558907181">"به برنامه اجازه می‎دهد تا داده‎های تنظیم سیستم را تغییر دهد. برنامه‎های مخرب می‎توانند پیکربندی سیستم شما را خراب کنند."</string>
+ <string name="permdesc_writeSettings" msgid="7775723441558907181">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا داده‎های تنظیم سیستم را تغییر دهد. برنامه‎های مخرب می‎توانند پیکربندی سیستم شما را خراب کنند."</string>
<string name="permlab_writeSecureSettings" msgid="204676251876718288">"اصلاح کردن تنظیمات سیستم ایمن"</string>
- <string name="permdesc_writeSecureSettings" msgid="8159535613020137391">"به برنامه اجازه می‎دهد داده‎های تنظیمات امنیتی سیستم را تغییر دهد. برای Ø§Ø³ØªÙØ§Ø¯Ù‡ برنامه‎های عادی نیست."</string>
- <string name="permlab_writeGservices" msgid="2149426664226152185">"اصلاح کردن نقشه سرویس‌های Google"</string>
- <string name="permdesc_writeGservices" msgid="1287309437638380229">"به برنامه اجازه می‎دهد تا نقشه سرویس‌های Google را تغییر دهد. برای Ø§Ø³ØªÙØ§Ø¯Ù‡ برنامه‎های عادی نیست."</string>
+ <string name="permdesc_writeSecureSettings" msgid="8159535613020137391">"â€Ø¨Ù‡ برنامه اجازه می‎دهد داده‎های تنظیمات امنیتی سیستم را تغییر دهد. برای Ø§Ø³ØªÙØ§Ø¯Ù‡ برنامه‎های عادی نیست."</string>
+ <string name="permlab_writeGservices" msgid="2149426664226152185">"â€Ø§ØµÙ„اح کردن نقشه سرویس‌های Google"</string>
+ <string name="permdesc_writeGservices" msgid="1287309437638380229">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا نقشه سرویس‌های Google را تغییر دهد. برای Ø§Ø³ØªÙØ§Ø¯Ù‡ برنامه‎های عادی نیست."</string>
<string name="permlab_receiveBootCompleted" msgid="5312965565987800025">"اجرا شدن در هنگام راه‌اندازی"</string>
- <string name="permdesc_receiveBootCompleted" product="tablet" msgid="7390304664116880704">"به برنامه اجازه می‎دهد تا به محض اتمام راه‎اندازی سیستم خودبخود شروع به کار کند. این کار ممکن است باعث شود مدت زمان بیشتری صر٠شدوع به کار رایانهٔ لوحی شود و به برنامه اجازه می‎دهد تا با اجرای همیشگی رایانهٔ لوحی را کند کند."</string>
- <string name="permdesc_receiveBootCompleted" product="default" msgid="513950589102617504">"به برنامه اجازه می‎دهد تا به محض اینکه سیستم راه‎اندازی شد خودبخود شروع به کار کند. این کار باعث می‎شود مدت زمان بیشتری صر٠شود تا تلÙÙ† شروع به کار کند Ùˆ به برنامه اجازه می‎دهد تا Ú©Ù„ تلÙÙ† کند شود چون همیشه در حال اجرا شدن است."</string>
+ <string name="permdesc_receiveBootCompleted" product="tablet" msgid="7390304664116880704">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا به محض اتمام راه‎اندازی سیستم خودبخود شروع به کار کند. این کار ممکن است باعث شود مدت زمان بیشتری صر٠شدوع به کار رایانهٔ لوحی شود Ùˆ به برنامه اجازه می‎دهد تا با اجرای همیشگی رایانهٔ لوحی را کند کند."</string>
+ <string name="permdesc_receiveBootCompleted" product="default" msgid="513950589102617504">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا به محض اینکه سیستم راه‎اندازی شد خودبخود شروع به کار کند. این کار باعث می‎شود مدت زمان بیشتری صر٠شود تا تلÙÙ† شروع به کار کند Ùˆ به برنامه اجازه می‎دهد تا Ú©Ù„ تلÙÙ† کند شود چون همیشه در حال اجرا شدن است."</string>
<string name="permlab_broadcastSticky" msgid="7919126372606881614">"ارسال پخش چسبنده"</string>
- <string name="permdesc_broadcastSticky" product="tablet" msgid="7749760494399915651">"به برنامه اجازه می‎دهد تا پخش‌های ماندگار را Ú©Ù‡ پس از اتمام پخش باقی می‎مانند ارسال کند. Ø§Ø³ØªÙØ§Ø¯Ù‡ بیش از حد این ویژگی ممکن است باعث مصر٠بیش از حد Ø­Ø§ÙØ¸Ù‡ Ùˆ در نتیجه کندی یا ناپایداری رایانهٔ لوحی شود."</string>
- <string name="permdesc_broadcastSticky" product="default" msgid="2825803764232445091">"به برنامه اجازه می‎دهد تا پخش‌های ماندگار را Ú©Ù‡ پس از اتمام پخش باقی می‎مانند ارسال کند. Ø§Ø³ØªÙØ§Ø¯Ù‡ بیش از حد این ویژگی ممکن است باعث مصر٠بیش از حد Ø­Ø§ÙØ¸Ù‡ Ùˆ در نتیجه کندی یا ناپایداری تلÙÙ† شود."</string>
+ <string name="permdesc_broadcastSticky" product="tablet" msgid="7749760494399915651">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا پخش‌های ماندگار را Ú©Ù‡ پس از اتمام پخش باقی می‎مانند ارسال کند. Ø§Ø³ØªÙØ§Ø¯Ù‡ بیش از حد این ویژگی ممکن است باعث مصر٠بیش از حد Ø­Ø§ÙØ¸Ù‡ Ùˆ در نتیجه کندی یا ناپایداری رایانهٔ لوحی شود."</string>
+ <string name="permdesc_broadcastSticky" product="default" msgid="2825803764232445091">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا پخش‌های ماندگار را Ú©Ù‡ پس از اتمام پخش باقی می‎مانند ارسال کند. Ø§Ø³ØªÙØ§Ø¯Ù‡ بیش از حد این ویژگی ممکن است باعث مصر٠بیش از حد Ø­Ø§ÙØ¸Ù‡ Ùˆ در نتیجه کندی یا ناپایداری تلÙÙ† شود."</string>
<string name="permlab_readContacts" msgid="8348481131899886131">"خواندن مخاطبین شما"</string>
<string name="permdesc_readContacts" product="tablet" msgid="5294866856941149639">"به برنامه اجازه می‌دهد داده‌های مربوط به مخاطبین ذخیره شده در رایانهٔ لوحی شما را بخواند از جمله، تعداد Ø¯ÙØ¹Ø§Øª تماس‌هایی Ú©Ù‡ برقرار کرده‌اید، ایمیل‌هایی Ú©Ù‡ ارسال کرده‌اید یا به روش‌های دیگری به Ø§ÙØ±Ø§Ø¯ خاصی ارتباط برقرار کرده‌اید. این با برنامه‌ها امکان می‌دهد داده‌های مخاطب شما را ذخیره کنند Ùˆ برنامه‌های مخرب ممکن است داده‌های مخاطب را بدون اطلاع شما به اشتراک بگذارند."</string>
<string name="permdesc_readContacts" product="default" msgid="8440654152457300662">"به برنامه اجازه می‌دهد داده‌های مربوط به مخاطبین ذخیره شده در تلÙÙ† شما را بخواند از جمله، تعداد Ø¯ÙØ¹Ø§Øª تماس‌هایی Ú©Ù‡ برقرار کرده‌اید، ایمیل‌هایی Ú©Ù‡ ارسال کرده‌اید یا به روش‌های دیگری با Ø§ÙØ±Ø§Ø¯ خاصی ارتباط برقرار کرده‌اید. این به برنامه‌ها امکان می‌دهد داده‌های مخاطب شما را ذخیره کنند Ùˆ برنامه‌های مخرب ممکن است داده‌های مخاطب را بدون اطلاع شما به اشتراک بگذارند."</string>
@@ -447,12 +452,12 @@
<string name="permdesc_readCallLog" product="tablet" msgid="3700645184870760285">"به برنامه اجازه می‌دهد گزارش تماس رایانهٔ لوحی شما را بخواند از جمله داده‌های مربوط به تماس‌های ورودی و خروجی. این مجوز به برنامه‌ها اجازه می‌دهد داده‌های گزارش تماس شما را ذخیره کنند و برنامه‌های مخرب ممکن است داده‌های گزارش تماس شما را بدون اطلاع شما به اشتراک بگذارند."</string>
<string name="permdesc_readCallLog" product="default" msgid="5777725796813217244">"به برنامه اجازه می‌دهد گزارش تماس تلÙÙ†ÛŒ شما را بخواند از جمله داده‌های مربوط به تماس‌های ورودی Ùˆ خروجی. این مجوز به برنامه‌ها اجازه می‌دهد داده‌های گزارش تماس شما را ذخیره کنند Ùˆ برنامه‌های مخرب ممکن است داده‌های گزارش تماس شما را بدون اطلاع شما به اشتراک بگذارند."</string>
<string name="permlab_writeCallLog" msgid="8552045664743499354">"نوشتن گزارش تماس"</string>
- <string name="permdesc_writeCallLog" product="tablet" msgid="6661806062274119245">"به برنامه اجازه می‌دهد گزارشات تماس رایانهٔ لوحی شما، از جمله داده‌هایی درمورد تماس‎های ورودی Ùˆ خروجی را تغییر دهد. برنامه‌های مخرب ممکن است از این ویژگی برای پاک کردن یا تغییر گزارش تماس شما Ø§Ø³ØªÙØ§Ø¯Ù‡ کنند."</string>
- <string name="permdesc_writeCallLog" product="default" msgid="683941736352787842">"به برنامه اجازه می‌دهد گزارشات تماس تلÙÙ†ÛŒ شما، از جمله داده‌هایی درمورد تماس‎های ورودی Ùˆ خروجی را تغییر دهد. برنامه‌های مخرب ممکن است از این ویژگی برای پاک کردن یا تغییر گزارش تماس شما Ø§Ø³ØªÙØ§Ø¯Ù‡ کنند."</string>
+ <string name="permdesc_writeCallLog" product="tablet" msgid="6661806062274119245">"â€Ø¨Ù‡ برنامه اجازه می‌دهد گزارشات تماس رایانهٔ لوحی شما، از جمله داده‌هایی درمورد تماس‎های ورودی Ùˆ خروجی را تغییر دهد. برنامه‌های مخرب ممکن است از این ویژگی برای پاک کردن یا تغییر گزارش تماس شما Ø§Ø³ØªÙØ§Ø¯Ù‡ کنند."</string>
+ <string name="permdesc_writeCallLog" product="default" msgid="683941736352787842">"â€Ø¨Ù‡ برنامه اجازه می‌دهد گزارشات تماس تلÙÙ†ÛŒ شما، از جمله داده‌هایی درمورد تماس‎های ورودی Ùˆ خروجی را تغییر دهد. برنامه‌های مخرب ممکن است از این ویژگی برای پاک کردن یا تغییر گزارش تماس شما Ø§Ø³ØªÙØ§Ø¯Ù‡ کنند."</string>
<string name="permlab_readProfile" msgid="4701889852612716678">"خواندن کارت تماس شما"</string>
- <string name="permdesc_readProfile" product="default" msgid="5462475151849888848">"به برنامه اجازه می‎دهد اطلاعات نمایه شخصی ذخیره شده در دستگاه شما، مانند نام و اطلاعات تماس شما را بخواند. یعنی برنامه می‎تواند شما را شناسایی کند و ممکن است اطلاعات نمایهٔ شما را به دیگران ارسال کند."</string>
+ <string name="permdesc_readProfile" product="default" msgid="5462475151849888848">"â€Ø¨Ù‡ برنامه اجازه می‎دهد اطلاعات نمایه شخصی ذخیره شده در دستگاه شما، مانند نام Ùˆ اطلاعات تماس شما را بخواند. یعنی برنامه می‎تواند شما را شناسایی کند Ùˆ ممکن است اطلاعات نمایهٔ شما را به دیگران ارسال کند."</string>
<string name="permlab_writeProfile" msgid="907793628777397643">"اصلاح کارت تماس شما"</string>
- <string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"به برنامه اجازه می‎دهد تا اطلاعات نمایه شخصی ذخیره شده در دستگاه شما، مانند نام Ùˆ اطلاعات تماس شما را تغییر دهد یا اضاÙÙ‡ کند. یعنی برنامه‎ می‎تواند شما را شناسایی کند Ùˆ ممکن است اطلاعات نمایهٔ شما را برای دیگران ارسال کند."</string>
+ <string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا اطلاعات نمایه شخصی ذخیره شده در دستگاه شما، مانند نام Ùˆ اطلاعات تماس شما را تغییر دهد یا اضاÙÙ‡ کند. یعنی برنامه‎ می‎تواند شما را شناسایی کند Ùˆ ممکن است اطلاعات نمایهٔ شما را برای دیگران ارسال کند."</string>
<string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"خواندن جریان اجتماعی شما"</string>
<string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"به برنامه اجازه می‌دهد به به‌روزرسانی‌های اجتماعی از طر٠شما Ùˆ دوستان شما دسترسی پیدا کرده Ùˆ آن‌ها را همگام‌سازی کند. دقت کنید Ú©Ù‡ هنگام اشتراک‌گذاری -- این ویژگی به برنامه اجازه می‌دهد ارتباطات بین شما Ùˆ دوستان شما را در شبکه‌های اجتماعی، صرÙنظر از محرمانه بودن آن‌ها بخواند. توجه: این مجوز ممکن است در همه شبکه‌های اجتماعی اجرا نشود."</string>
<string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"نوشتن در جریان اجتماعی شما"</string>
@@ -464,23 +469,25 @@
<string name="permdesc_writeCalendar" product="tablet" msgid="6679035520113668528">"به برنامه اجازه می‌دهد رویدادهایی را Ú©Ù‡ می‌توانید در رایانهٔ لوحی خود اصلاح نمایید، از جمله رویدادهای دوستان یا همکاران خود را، اضاÙÙ‡ یا حذ٠کرده یا تغییر دهد. این ویژگی ممکن است به برنامه اجازه دهد پیام‌هایی را Ú©Ù‡ به نظر می‌رسد از مالکین تقویم رسیده است ارسال نموده یا رویدادها را بدون اطلاع مالک اصلاح کنند."</string>
<string name="permdesc_writeCalendar" product="default" msgid="2324469496327249376">"به برنامه اجازه می‌دهد رویدادهایی را Ú©Ù‡ می‌توانید در تلÙÙ† خود اصلاح نمایید، از جمله رویدادهای دوستان یا همکاران خود را، اضاÙÙ‡ یا حذ٠کرده یا تغییر دهد. این ویژگی ممکن است به برنامه اجازه دهد پیام‌هایی را Ú©Ù‡ به نظر می‌رسد از مالکین تقویم رسیده است ارسال نموده یا رویدادها را بدون اطلاع مالک اصلاح کنند."</string>
<string name="permlab_accessMockLocation" msgid="8688334974036823330">"منابع مکان کاذب برای تست"</string>
- <string name="permdesc_accessMockLocation" msgid="5808711039482051824">"منابع موقعیت مکانی کاذب را برای تست کردن یا نصب یک ارائه‌دهنده موقعیت مکانی جدید ایجاد نمایید. این کار به برنامه امکان می‌دهد موقعیت مکانی و/یا وضعیت گزارش داده شده توسط سایر منابع موقعیت مکانی مانند GPS یا ارائه‌دهندگان موقعیت مکانی را نادیده بگیرد."</string>
+ <string name="permdesc_accessMockLocation" msgid="5808711039482051824">"â€Ù…نابع موقعیت مکانی کاذب را برای تست کردن یا نصب یک ارائه‌دهنده موقعیت مکانی جدید ایجاد نمایید. این کار به برنامه امکان می‌دهد موقعیت مکانی Ùˆ/یا وضعیت گزارش داده شده توسط سایر منابع موقعیت مکانی مانند GPS یا ارائه‌دهندگان موقعیت مکانی را نادیده بگیرد."</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"دسترسی به ÙØ±Ù…ان‌های بیشتر ارائه دهنده مکان"</string>
- <string name="permdesc_accessLocationExtraCommands" msgid="5945166642335800763">"به برنامه اجازه می‎دهد تا به ÙØ±Ù…ان‌های ارائه‎دهنده موقعیت مکانی دیگری دسترسی داشته باشد. این ویژگی ممکن است باعث مختل شدن عملکرد GPS یا دیگر منابع موقعیت مکانی توسط این برنامه شود."</string>
+ <string name="permdesc_accessLocationExtraCommands" msgid="5945166642335800763">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا به ÙØ±Ù…ان‌های ارائه‎دهنده موقعیت مکانی دیگری دسترسی داشته باشد. این ویژگی ممکن است باعث مختل شدن عملکرد GPS یا دیگر منابع موقعیت مکانی توسط این برنامه شود."</string>
<string name="permlab_installLocationProvider" msgid="6578101199825193873">"مجوز برای نصب یک ارائه دهنده مکان"</string>
- <string name="permdesc_installLocationProvider" msgid="9066146120470591509">"منابع موقعیت مکانی کاذب را برای تست کردن یا نصب یک ارائه‌دهنده موقعیت مکانی جدید ایجاد نمایید. این کار به برنامه امکان می‌دهد موقعیت مکانی و/یا وضعیت گزارش داده شده توسط سایر منابع موقعیت مکانی مانند GPS یا ارائه‌دهندگان موقعیت مکانی را نادیده بگیرد."</string>
- <string name="permlab_accessFineLocation" msgid="1191898061965273372">"موقعیت مکانی دقیق (مبتنی بر GPS و شبکه)"</string>
- <string name="permdesc_accessFineLocation" msgid="5295047563564981250">"به برنامه اجازه می‌دهد Ú©Ù‡ موقعیت مکانی دقیق شما را با Ø§Ø³ØªÙØ§Ø¯Ù‡ از سیستم موقعیت‌یاب جهانی (GPS) یا منابع موقعیت مکانی شبکه‌ای مانند برج‌های سلولی یا Wi-Fi Ø¯Ø±ÛŒØ§ÙØª کند. این سرویس‌های موقعیت مکانی باید در دستگاه شما برای برنامه‌ای Ú©Ù‡ از آنها Ø§Ø³ØªÙØ§Ø¯Ù‡ می‌کند، ÙØ¹Ø§Ù„ Ùˆ در دسترس باشد. برنامه‌ها ممکن است از آن برای تعیین جایی Ú©Ù‡ هستید، Ø§Ø³ØªÙØ§Ø¯Ù‡ کنند Ùˆ ممکن است نیروی باتری بیشتری مصر٠کنند."</string>
+ <string name="permdesc_installLocationProvider" msgid="9066146120470591509">"â€Ù…نابع موقعیت مکانی کاذب را برای تست کردن یا نصب یک ارائه‌دهنده موقعیت مکانی جدید ایجاد نمایید. این کار به برنامه امکان می‌دهد موقعیت مکانی Ùˆ/یا وضعیت گزارش داده شده توسط سایر منابع موقعیت مکانی مانند GPS یا ارائه‌دهندگان موقعیت مکانی را نادیده بگیرد."</string>
+ <string name="permlab_accessFineLocation" msgid="1191898061965273372">"â€Ù…وقعیت مکانی دقیق (مبتنی بر GPS Ùˆ شبکه)"</string>
+ <string name="permdesc_accessFineLocation" msgid="5295047563564981250">"â€Ø¨Ù‡ برنامه اجازه می‌دهد Ú©Ù‡ موقعیت مکانی دقیق شما را با Ø§Ø³ØªÙØ§Ø¯Ù‡ از سیستم موقعیت‌یاب جهانی (GPS) یا منابع موقعیت مکانی شبکه‌ای مانند برج‌های سلولی یا Wi-Fi Ø¯Ø±ÛŒØ§ÙØª کند. این سرویس‌های موقعیت مکانی باید در دستگاه شما برای برنامه‌ای Ú©Ù‡ از آنها Ø§Ø³ØªÙØ§Ø¯Ù‡ می‌کند، ÙØ¹Ø§Ù„ Ùˆ در دسترس باشد. برنامه‌ها ممکن است از آن برای تعیین جایی Ú©Ù‡ هستید، Ø§Ø³ØªÙØ§Ø¯Ù‡ کنند Ùˆ ممکن است نیروی باتری بیشتری مصر٠کنند."</string>
<string name="permlab_accessCoarseLocation" msgid="4887895362354239628">"موقعیت مکانی تقریبی (مبتنی بر شبکه)"</string>
- <string name="permdesc_accessCoarseLocation" msgid="2538200184373302295">"به برنامه اجازه می‌دهد Ú©Ù‡ موقعیت مکانی تقریبی شما را بدست آورد. این موقعیت مکانی از سرویس‌های موقعیت مکانی Ú©Ù‡ از منابع موقعیت مکانی شبکه‌ای مانند برج‌های سلولی Ùˆ Wi-Fi Ø§Ø³ØªÙØ§Ø¯Ù‡ می‌کنند، بدست می‌آید. این سرویس‌های موقعیت مکانی باید در دستگاه شما برای برنامه‌ای Ú©Ù‡ از آنها Ø§Ø³ØªÙØ§Ø¯Ù‡ می‌کند، ÙØ¹Ø§Ù„ Ùˆ در دسترس باشد. برنامه‌ها ممکن است از آن برای تعیین تقریبی جایی Ú©Ù‡ هستید، Ø§Ø³ØªÙØ§Ø¯Ù‡ کنند."</string>
- <string name="permlab_accessSurfaceFlinger" msgid="2363969641792388947">"دسترسی به SurfaceFlinger"</string>
- <string name="permdesc_accessSurfaceFlinger" msgid="1041619516733293551">"اجازه می‎دهد برنامه از ویژگی‌های سطح پایین SurfaceFlinger Ø§Ø³ØªÙØ§Ø¯Ù‡ کند."</string>
+ <string name="permdesc_accessCoarseLocation" msgid="2538200184373302295">"â€Ø¨Ù‡ برنامه اجازه می‌دهد Ú©Ù‡ موقعیت مکانی تقریبی شما را بدست آورد. این موقعیت مکانی از سرویس‌های موقعیت مکانی Ú©Ù‡ از منابع موقعیت مکانی شبکه‌ای مانند برج‌های سلولی Ùˆ Wi-Fi Ø§Ø³ØªÙØ§Ø¯Ù‡ می‌کنند، بدست می‌آید. این سرویس‌های موقعیت مکانی باید در دستگاه شما برای برنامه‌ای Ú©Ù‡ از آنها Ø§Ø³ØªÙØ§Ø¯Ù‡ می‌کند، ÙØ¹Ø§Ù„ Ùˆ در دسترس باشد. برنامه‌ها ممکن است از آن برای تعیین تقریبی جایی Ú©Ù‡ هستید، Ø§Ø³ØªÙØ§Ø¯Ù‡ کنند."</string>
+ <string name="permlab_accessSurfaceFlinger" msgid="2363969641792388947">"â€Ø¯Ø³ØªØ±Ø³ÛŒ به SurfaceFlinger"</string>
+ <string name="permdesc_accessSurfaceFlinger" msgid="1041619516733293551">"â€Ø§Ø¬Ø§Ø²Ù‡ می‎دهد برنامه از ویژگی‌های سطح پایین SurfaceFlinger Ø§Ø³ØªÙØ§Ø¯Ù‡ کند."</string>
<string name="permlab_readFrameBuffer" msgid="6690504248178498136">"خواندن Ø¨Ø§ÙØ± قاب"</string>
- <string name="permdesc_readFrameBuffer" msgid="4937405521809454680">"به برنامه اجازه می‎دهد تا محتوای Ø¨Ø§ÙØ± کادر را بخواند."</string>
- <string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"پیکربندی ØµÙØ­Ù‡ نمایش‌های Wi‑Fi"</string>
- <string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"به برنامه اجازه می‌دهد تا اتصال به ØµÙØ­Ø§Øª نمایش Wi‑Fi را پیکربندی کند."</string>
- <string name="permlab_controlWifiDisplay" msgid="393641276723695496">"کنترل ØµÙØ­Ù‡ نمایش‌های Wi‑Fi"</string>
- <string name="permdesc_controlWifiDisplay" msgid="4543912292681826986">"به برنامه اجازه می‌دهد Ú©Ù‡ ویژگی‌های سطح پایین ØµÙØ­Ù‡â€ŒÙ‡Ø§ÛŒ نمایش Wi‑Fi را کنترل کند."</string>
+ <string name="permdesc_readFrameBuffer" msgid="4937405521809454680">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا محتوای Ø¨Ø§ÙØ± کادر را بخواند."</string>
+ <string name="permlab_accessInputFlinger" msgid="5348635270689553857">"â€Ø¯Ø³ØªØ±Ø³ÛŒ به InputFlinger"</string>
+ <string name="permdesc_accessInputFlinger" msgid="2104864941201226616">"â€Ø§Ø¬Ø§Ø²Ù‡ می‎دهد برنامه از قابلیت‌های سطح پایین InputFlinger Ø§Ø³ØªÙØ§Ø¯Ù‡ کند."</string>
+ <string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"â€Ù¾ÛŒÚ©Ø±Ø¨Ù†Ø¯ÛŒ ØµÙØ­Ù‡ نمایش‌های Wi‑Fi"</string>
+ <string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"â€Ø¨Ù‡ برنامه اجازه می‌دهد تا اتصال به ØµÙØ­Ø§Øª نمایش Wi‑Fi را پیکربندی کند."</string>
+ <string name="permlab_controlWifiDisplay" msgid="393641276723695496">"â€Ú©Ù†ØªØ±Ù„ ØµÙØ­Ù‡ نمایش‌های Wi‑Fi"</string>
+ <string name="permdesc_controlWifiDisplay" msgid="4543912292681826986">"â€Ø¨Ù‡ برنامه اجازه می‌دهد Ú©Ù‡ ویژگی‌های سطح پایین ØµÙØ­Ù‡â€ŒÙ‡Ø§ÛŒ نمایش Wi‑Fi را کنترل کند."</string>
<string name="permlab_captureAudioOutput" msgid="6857134498402346708">"ضبط خروجی صدا"</string>
<string name="permdesc_captureAudioOutput" msgid="6210597754212208853">"به برنامه امکان می‌دهد خروجی صدا را ضبط و هدایت کند."</string>
<string name="permlab_captureAudioHotword" msgid="1890553935650349808">"تشخیص Ú©Ù„ÛŒØ¯Ú¯ÙØªÙ‡"</string>
@@ -497,131 +504,131 @@
<string name="permdesc_recordAudio" msgid="4906839301087980680">"به برنامه اجازه می‌دهد صدا را با میکروÙÙ† ضبط کند. این مجوز به برنامه اجازه می‌دهد صدا را در هر زمان Ú©Ù‡ بخواهید بدون تأیید شما ضبط کند."</string>
<string name="permlab_camera" msgid="3616391919559751192">"عکسبرداری Ùˆ Ùیلمبرداری"</string>
<string name="permdesc_camera" msgid="8497216524735535009">"به برنامه اجازه می‌دهد با دوربین به عکسبرداری Ùˆ Ùیلمبرداری بپردازد. این مجوز به برنامه اجازه می‌‌دهد از دوربین در هر زمانی بدون تأیید شما Ø§Ø³ØªÙØ§Ø¯Ù‡ کند."</string>
- <string name="permlab_cameraDisableTransmitLed" msgid="2651072630501126222">"LED نشانگر انتقال داده، هنگام Ø§Ø³ØªÙØ§Ø¯Ù‡ از دوربین ØºÛŒØ±ÙØ¹Ø§Ù„ شود"</string>
- <string name="permdesc_cameraDisableTransmitLed" msgid="4764585465480295341">"به یک برنامه سیستم از قبل نصب شده اجازه می‌دهد LED نشانگر Ø§Ø³ØªÙØ§Ø¯Ù‡ از دوربین را ØºÛŒØ±ÙØ¹Ø§Ù„ کند."</string>
+ <string name="permlab_cameraDisableTransmitLed" msgid="2651072630501126222">"â€LED نشانگر انتقال داده، هنگام Ø§Ø³ØªÙØ§Ø¯Ù‡ از دوربین ØºÛŒØ±ÙØ¹Ø§Ù„ شود"</string>
+ <string name="permdesc_cameraDisableTransmitLed" msgid="4764585465480295341">"â€Ø¨Ù‡ یک برنامه سیستم از قبل نصب شده اجازه می‌دهد LED نشانگر Ø§Ø³ØªÙØ§Ø¯Ù‡ از دوربین را ØºÛŒØ±ÙØ¹Ø§Ù„ کند."</string>
<string name="permlab_brick" product="tablet" msgid="2961292205764488304">"غیر ÙØ¹Ø§Ù„ کردن دائم رایانهٔ لوحی"</string>
<string name="permlab_brick" product="default" msgid="8337817093326370537">"تلÙÙ† بطور دائمی ØºÛŒØ±ÙØ¹Ø§Ù„ شود"</string>
- <string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"به برنامه اجازه می‎دهد تا رایانهٔ لوحی را به طور Ú©Ù„ÛŒ Ùˆ دائمی ØºÛŒØ±ÙØ¹Ø§Ù„ کند. این کار بسیار خطرناک است."</string>
- <string name="permdesc_brick" product="default" msgid="5788903297627283099">"به برنامه اجازه می‎دهد تا گوشی را به طور Ú©Ù„ÛŒ Ùˆ دائمی ØºÛŒØ±ÙØ¹Ø§Ù„ کند. این کار بسیار خطرناک است."</string>
+ <string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا رایانهٔ لوحی را به طور Ú©Ù„ÛŒ Ùˆ دائمی ØºÛŒØ±ÙØ¹Ø§Ù„ کند. این کار بسیار خطرناک است."</string>
+ <string name="permdesc_brick" product="default" msgid="5788903297627283099">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا گوشی را به طور Ú©Ù„ÛŒ Ùˆ دائمی ØºÛŒØ±ÙØ¹Ø§Ù„ کند. این کار بسیار خطرناک است."</string>
<string name="permlab_reboot" product="tablet" msgid="3436634972561795002">"راه‌اندازی مجدد اجباری رایانهٔ لوحی"</string>
<string name="permlab_reboot" product="default" msgid="2898560872462638242">"اجبار برنامه برای راه‌اندازی مجدد"</string>
- <string name="permdesc_reboot" product="tablet" msgid="8172056180063700741">"به برنامه اجازه می‎دهد تا سبب راه‌اندازی مجدد رایانهٔ لوحی شود."</string>
- <string name="permdesc_reboot" product="default" msgid="5326008124289989969">"به برنامه اجازه می‎دهد تا سبب راه‌اندازی مجدد گوشی شود."</string>
- <string name="permlab_mount_unmount_filesystems" product="nosdcard" msgid="2927361537942591841">"دسترسی به سیستم ÙØ§ÛŒÙ„ Ø­Ø§ÙØ¸Ù‡Ù” USB"</string>
- <string name="permlab_mount_unmount_filesystems" product="default" msgid="4402305049890953810">"دسترسی به سیستم ÙØ§ÛŒÙ„ کارت SD"</string>
- <string name="permdesc_mount_unmount_filesystems" msgid="1829290701658992347">"به برنامه اجازه می‎دهد تا ÙØ§ÛŒÙ„‌های سیستمی در Ø­Ø§ÙØ¸Ù‡ جداشدنی نصب شود یا نصب آن لغو شود."</string>
- <string name="permlab_mount_format_filesystems" product="nosdcard" msgid="6227819582624904972">"پاک کردن Ø­Ø§ÙØ¸Ù‡Ù” USB"</string>
- <string name="permlab_mount_format_filesystems" product="default" msgid="262582698639274056">"پاک کردن کارت SD"</string>
- <string name="permdesc_mount_format_filesystems" msgid="8784268246779198627">"به برنامه اجازه می‎دهد تا Ø­Ø§ÙØ¸Ù‡ جداشدنی را ÙØ±Ù…ت کند."</string>
+ <string name="permdesc_reboot" product="tablet" msgid="8172056180063700741">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا سبب راه‌اندازی مجدد رایانهٔ لوحی شود."</string>
+ <string name="permdesc_reboot" product="default" msgid="5326008124289989969">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا سبب راه‌اندازی مجدد گوشی شود."</string>
+ <string name="permlab_mount_unmount_filesystems" product="nosdcard" msgid="2927361537942591841">"â€Ø¯Ø³ØªØ±Ø³ÛŒ به سیستم ÙØ§ÛŒÙ„ Ø­Ø§ÙØ¸Ù‡Ù” USB"</string>
+ <string name="permlab_mount_unmount_filesystems" product="default" msgid="4402305049890953810">"â€Ø¯Ø³ØªØ±Ø³ÛŒ به سیستم ÙØ§ÛŒÙ„ کارت SD"</string>
+ <string name="permdesc_mount_unmount_filesystems" msgid="1829290701658992347">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا ÙØ§ÛŒÙ„‌های سیستمی در Ø­Ø§ÙØ¸Ù‡ جداشدنی نصب شود یا نصب آن لغو شود."</string>
+ <string name="permlab_mount_format_filesystems" product="nosdcard" msgid="6227819582624904972">"â€Ù¾Ø§Ú© کردن Ø­Ø§ÙØ¸Ù‡Ù” USB"</string>
+ <string name="permlab_mount_format_filesystems" product="default" msgid="262582698639274056">"â€Ù¾Ø§Ú© کردن کارت SD"</string>
+ <string name="permdesc_mount_format_filesystems" msgid="8784268246779198627">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا Ø­Ø§ÙØ¸Ù‡ جداشدنی را ÙØ±Ù…ت کند."</string>
<string name="permlab_asec_access" msgid="3411338632002193846">"Ø¯Ø±ÛŒØ§ÙØª اطلاعات مربوط به Ø­Ø§ÙØ¸Ù‡Ù” داخلی"</string>
- <string name="permdesc_asec_access" msgid="3094563844593878548">"به برنامه اجازه می‎دهد تا اطلاعات مربوط به Ø­Ø§ÙØ¸Ù‡Ù” داخلی را Ø¯Ø±ÛŒØ§ÙØª کند."</string>
+ <string name="permdesc_asec_access" msgid="3094563844593878548">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا اطلاعات مربوط به Ø­Ø§ÙØ¸Ù‡Ù” داخلی را Ø¯Ø±ÛŒØ§ÙØª کند."</string>
<string name="permlab_asec_create" msgid="6414757234789336327">"ایجاد Ø­Ø§ÙØ¸Ù‡Ù” داخلی"</string>
- <string name="permdesc_asec_create" msgid="4558869273585856876">"به برنامه اجازه می‎دهد تا Ø­Ø§ÙØ¸Ù‡Ù” داخلی ایجاد کند."</string>
+ <string name="permdesc_asec_create" msgid="4558869273585856876">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا Ø­Ø§ÙØ¸Ù‡Ù” داخلی ایجاد کند."</string>
<string name="permlab_asec_destroy" msgid="526928328301618022">"خراب کردن Ø­Ø§ÙØ¸Ù‡Ù” داخلی"</string>
- <string name="permdesc_asec_destroy" msgid="7218749286145526537">"به برنامه اجازه می‎دهد تا Ø­Ø§ÙØ¸Ù‡Ù” داخلی را از بین ببرد."</string>
+ <string name="permdesc_asec_destroy" msgid="7218749286145526537">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا Ø­Ø§ÙØ¸Ù‡Ù” داخلی را از بین ببرد."</string>
<string name="permlab_asec_mount_unmount" msgid="8877998101944999386">"نصب/لغو نصب Ø­Ø§ÙØ¸Ù‡Ù” داخلی"</string>
- <string name="permdesc_asec_mount_unmount" msgid="3451360114902490929">"به برنامه اجازه می‎دهد Ø­Ø§ÙØ¸Ù‡Ù” داخلی را نصب کرده/نصب آنرا لغو کند."</string>
+ <string name="permdesc_asec_mount_unmount" msgid="3451360114902490929">"â€Ø¨Ù‡ برنامه اجازه می‎دهد Ø­Ø§ÙØ¸Ù‡Ù” داخلی را نصب کرده/نصب آنرا لغو کند."</string>
<string name="permlab_asec_rename" msgid="7496633954080472417">"نامگذاری مجدد دستگاه ذخیره داخلی"</string>
- <string name="permdesc_asec_rename" msgid="1794757588472127675">"به برنامه اجازه می‎دهد تا نام Ø­Ø§ÙØ¸Ù‡Ù” داخلی را تغییر دهد."</string>
+ <string name="permdesc_asec_rename" msgid="1794757588472127675">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا نام Ø­Ø§ÙØ¸Ù‡Ù” داخلی را تغییر دهد."</string>
<string name="permlab_vibrate" msgid="7696427026057705834">"کنترل لرزش"</string>
- <string name="permdesc_vibrate" msgid="6284989245902300945">"به برنامه اجازه می‎دهد تا لرزاننده را کنترل کند."</string>
+ <string name="permdesc_vibrate" msgid="6284989245902300945">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا لرزاننده را کنترل کند."</string>
<string name="permlab_flashlight" msgid="2155920810121984215">"کنترل چراغ قوه"</string>
- <string name="permdesc_flashlight" msgid="6522284794568368310">"به برنامه اجازه می‎دهد تا چراغ قوه را کنترل کند."</string>
- <string name="permlab_manageUsb" msgid="1113453430645402723">"مدیریت تنظیمات برگزیده و مجوزها برای دستگاه‌های USB"</string>
- <string name="permdesc_manageUsb" msgid="7776155430218239833">"به برنامه اجازه می‎دهد تا تنظیمات برگزیده و مجوزهای دستگاه‌های USB را مدیریت کند."</string>
- <string name="permlab_accessMtp" msgid="4953468676795917042">"اعمال پروتکل MTP"</string>
- <string name="permdesc_accessMtp" msgid="6532961200486791570">"دسترسی به درایور کرنل MTP جهت اعمال پروتکل MTP USB را اجازه می‌دهد."</string>
+ <string name="permdesc_flashlight" msgid="6522284794568368310">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا چراغ قوه را کنترل کند."</string>
+ <string name="permlab_manageUsb" msgid="1113453430645402723">"â€Ù…دیریت تنظیمات برگزیده Ùˆ مجوزها برای دستگاه‌های USB"</string>
+ <string name="permdesc_manageUsb" msgid="7776155430218239833">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا تنظیمات برگزیده Ùˆ مجوزهای دستگاه‌های USB را مدیریت کند."</string>
+ <string name="permlab_accessMtp" msgid="4953468676795917042">"â€Ø§Ø¹Ù…ال پروتکل MTP"</string>
+ <string name="permdesc_accessMtp" msgid="6532961200486791570">"â€Ø¯Ø³ØªØ±Ø³ÛŒ به درایور کرنل MTP جهت اعمال پروتکل MTP USB را اجازه می‌دهد."</string>
<string name="permlab_hardware_test" msgid="4148290860400659146">"تست Ø³Ø®Øªâ€ŒØ§ÙØ²Ø§Ø±"</string>
- <string name="permdesc_hardware_test" msgid="6597964191208016605">"به برنامه اجازه می‎دهد به منظور تست Ø³Ø®Øªâ€ŒØ§ÙØ²Ø§Ø±ØŒ قسمت‌های جانبی مختل٠را کنترل کنند."</string>
+ <string name="permdesc_hardware_test" msgid="6597964191208016605">"â€Ø¨Ù‡ برنامه اجازه می‎دهد به منظور تست Ø³Ø®Øªâ€ŒØ§ÙØ²Ø§Ø±ØŒ قسمت‌های جانبی مختل٠را کنترل کنند."</string>
<string name="permlab_callPhone" msgid="3925836347681847954">"تماس مستقیم با شماره تلÙن‌ها"</string>
<string name="permdesc_callPhone" msgid="3740797576113760827">"به برنامه اجازه می‌دهد بدون دخالت شما با شماره‌های تلÙÙ† تماس بگیرد. این ممکن است باعث ایجاد هزینه یا تماس‌های پیش‌بینی نشده شود. توجه داشته باشید Ú©Ù‡ این به برنامه اجازه نمی‌دهد به برقراری تماس‌های اضطراری بپردازد. برنامه‌های مخرب ممکن است با برقراری تماس بدون تأیید شما هزینه‌هایی را برای شما ایجاد کنند."</string>
<string name="permlab_callPrivileged" msgid="4198349211108497879">"تماس مستقیم با هر شماره تلÙÙ†ÛŒ"</string>
- <string name="permdesc_callPrivileged" msgid="1689024901509996810">"به برنامه اجازه می‎دهد تا بدون دخالت با هر شماره تلÙÙ†ÛŒ تماس بگیرد، از جمله شماره‎های اضطراری. برنامه‎های مخرب می‎توانند تماس‌های غیرضروری Ùˆ غیر قانونی با خدمات اضطراری بگیرند."</string>
- <string name="permlab_performCdmaProvisioning" product="tablet" msgid="4842576994144604821">"راه‌اندازی مستقیم تنظیم رایانهٔ لوحی CDMA"</string>
- <string name="permlab_performCdmaProvisioning" product="default" msgid="5604848095315421425">"شروع مستقیم راه‌اندازی تلÙÙ† CDMA"</string>
- <string name="permdesc_performCdmaProvisioning" msgid="1994193538802314186">"به برنامه اجازه می‎دهد تا شرایط مقررات CDMA را شروع کند. برنامه‎های مخرب می‎توانند شرایط مقررات CDMA را در مواقع غیرضروری شروع کند."</string>
+ <string name="permdesc_callPrivileged" msgid="1689024901509996810">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا بدون دخالت با هر شماره تلÙÙ†ÛŒ تماس بگیرد، از جمله شماره‎های اضطراری. برنامه‎های مخرب می‎توانند تماس‌های غیرضروری Ùˆ غیر قانونی با خدمات اضطراری بگیرند."</string>
+ <string name="permlab_performCdmaProvisioning" product="tablet" msgid="4842576994144604821">"â€Ø±Ø§Ù‡â€ŒØ§Ù†Ø¯Ø§Ø²ÛŒ مستقیم تنظیم رایانهٔ لوحی CDMA"</string>
+ <string name="permlab_performCdmaProvisioning" product="default" msgid="5604848095315421425">"â€Ø´Ø±ÙˆØ¹ مستقیم راه‌اندازی تلÙÙ† CDMA"</string>
+ <string name="permdesc_performCdmaProvisioning" msgid="1994193538802314186">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا شرایط مقررات CDMA را شروع کند. برنامه‎های مخرب می‎توانند شرایط مقررات CDMA را در مواقع غیرضروری شروع کند."</string>
<string name="permlab_locationUpdates" msgid="7785408253364335740">"کنترل اعلان‌های به‌روزرسانی مکان"</string>
- <string name="permdesc_locationUpdates" msgid="1120741557891438876">"به برنامه اجازه می‎دهد اعلانهای به‎روزرسانی موقعیت مکانی را از رادیو ÙØ¹Ø§Ù„/ØºÛŒØ±ÙØ¹Ø§Ù„ کند. برای Ø§Ø³ØªÙØ§Ø¯Ù‡ برنامه‎های عادی نیست."</string>
+ <string name="permdesc_locationUpdates" msgid="1120741557891438876">"â€Ø¨Ù‡ برنامه اجازه می‎دهد اعلانهای به‎روزرسانی موقعیت مکانی را از رادیو ÙØ¹Ø§Ù„/ØºÛŒØ±ÙØ¹Ø§Ù„ کند. برای Ø§Ø³ØªÙØ§Ø¯Ù‡ برنامه‎های عادی نیست."</string>
<string name="permlab_checkinProperties" msgid="7855259461268734914">"دسترسی به مشخصات اعلام ورود"</string>
- <string name="permdesc_checkinProperties" msgid="4024526968630194128">"به برنامه اجازه می‎دهد دسترسی به ویژگی‌های بارگذاری شده توسط سرویس‌های ورود را بخواند/بنویسد. برای Ø§Ø³ØªÙØ§Ø¯Ù‡ برنامه‎های عادی مورد نیاز نیست."</string>
+ <string name="permdesc_checkinProperties" msgid="4024526968630194128">"â€Ø¨Ù‡ برنامه اجازه می‎دهد دسترسی به ویژگی‌های بارگذاری شده توسط سرویس‌های ورود را بخواند/بنویسد. برای Ø§Ø³ØªÙØ§Ø¯Ù‡ برنامه‎های عادی مورد نیاز نیست."</string>
<string name="permlab_bindGadget" msgid="776905339015863471">"انتخاب ابزارک‌ها"</string>
- <string name="permdesc_bindGadget" msgid="8261326938599049290">"به برنامه اجازه می‎دهد تا به سیستم اعلام کند کدام ویجت را کدام برنامه می‎تواند Ø§Ø³ØªÙØ§Ø¯Ù‡ کند. برنامه‎ای Ú©Ù‡ این مجوز را دارد می‎تواند به داده‎های شخصی دیگر برنامه‎ها دسترسی داشته باشد. برای Ø§Ø³ØªÙØ§Ø¯Ù‡ برنامه‎های عادی نیست."</string>
+ <string name="permdesc_bindGadget" msgid="8261326938599049290">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا به سیستم اعلام کند کدام ویجت را کدام برنامه می‎تواند Ø§Ø³ØªÙØ§Ø¯Ù‡ کند. برنامه‎ای Ú©Ù‡ این مجوز را دارد می‎تواند به داده‎های شخصی دیگر برنامه‎ها دسترسی داشته باشد. برای Ø§Ø³ØªÙØ§Ø¯Ù‡ برنامه‎های عادی نیست."</string>
<string name="permlab_modifyPhoneState" msgid="8423923777659292228">"اصلاح کردن حالت تلÙÙ†"</string>
- <string name="permdesc_modifyPhoneState" msgid="1029877529007686732">"به برنامه اجازه می‎دهد ویژگی‌های دستگاه را کنترل کند. برنامه‎ای Ú©Ù‡ این مجوز را دارد می‎تواند بدون اطلاع شما تعویض شبکه داشته باشد، رادیوی تلÙÙ† را روشن یا خاموش کند Ùˆ کارهایی از این قبیل را انجام دهد."</string>
+ <string name="permdesc_modifyPhoneState" msgid="1029877529007686732">"â€Ø¨Ù‡ برنامه اجازه می‎دهد ویژگی‌های دستگاه را کنترل کند. برنامه‎ای Ú©Ù‡ این مجوز را دارد می‎تواند بدون اطلاع شما تعویض شبکه داشته باشد، رادیوی تلÙÙ† را روشن یا خاموش کند Ùˆ کارهایی از این قبیل را انجام دهد."</string>
<string name="permlab_readPhoneState" msgid="9178228524507610486">"خواندن وضعیت تلÙÙ† Ùˆ شناسه"</string>
<string name="permdesc_readPhoneState" msgid="1639212771826125528">"به برنامه اجازه می‌دهد به ویژگی‌های تلÙÙ† دستگاه شما دسترسی پیدا کند. این مجوز به برنامه اجازه می‌دهد شماره تلÙÙ† Ùˆ شناسه‌های دستگاه، ÙØ¹Ø§Ù„ بودن یک تماس Ùˆ شماره راه دوری Ú©Ù‡ با یک تماس متصل شده است را مشخص کند."</string>
<string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"ممانعت از به خواب Ø±ÙØªÙ† رایانهٔ لوحی"</string>
<string name="permlab_wakeLock" product="default" msgid="573480187941496130">"ممانعت از به خواب Ø±ÙØªÙ† تلÙÙ†"</string>
- <string name="permdesc_wakeLock" product="tablet" msgid="7311319824400447868">"به برنامه اجازه می‎دهد تا از ØºÛŒØ±ÙØ¹Ø§Ù„ شدن رایانهٔ لوحی جلوگیری کند."</string>
- <string name="permdesc_wakeLock" product="default" msgid="8559100677372928754">"به برنامه اجازه می‎دهد تا از ØºÛŒØ±ÙØ¹Ø§Ù„ شدن تلÙÙ† جلوگیری کند."</string>
+ <string name="permdesc_wakeLock" product="tablet" msgid="7311319824400447868">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا از ØºÛŒØ±ÙØ¹Ø§Ù„ شدن رایانهٔ لوحی جلوگیری کند."</string>
+ <string name="permdesc_wakeLock" product="default" msgid="8559100677372928754">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا از ØºÛŒØ±ÙØ¹Ø§Ù„ شدن تلÙÙ† جلوگیری کند."</string>
<string name="permlab_transmitIr" msgid="7545858504238530105">"ارسال مادون قرمز"</string>
<string name="permdesc_transmitIr" product="tablet" msgid="5358308854306529170">"به برنامه اجازه می‌دهد تا از ÙØ±Ø³ØªÙ†Ø¯Ù‡ مادون قرمز رایانه Ù„ÙˆØ­ÛŒÂ Ø§Ø³ØªÙØ§Ø¯Ù‡ کند."</string>
<string name="permdesc_transmitIr" product="default" msgid="7957763745020300725">"به برنامه اجازه می‌دهد تا از ÙØ±Ø³ØªÙ†Ø¯Ù‡ مادون قرمز تلÙÙ† Ø§Ø³ØªÙØ§Ø¯Ù‡ کند."</string>
<string name="permlab_devicePower" product="tablet" msgid="2787034722616350417">"روشن/خاموش کردن رایانهٔ لوحی"</string>
<string name="permlab_devicePower" product="default" msgid="4928622470980943206">"روشن/خاموش کردن تلÙÙ†"</string>
- <string name="permdesc_devicePower" product="tablet" msgid="6689862878984631831">"به برنامه اجازه می‎دهد رایانهٔ لوحی را روشن یا خاموش کند."</string>
- <string name="permdesc_devicePower" product="default" msgid="6037057348463131032">"به برنامه اجازه می‎دهد گوشی را روشن یا خاموش کند."</string>
+ <string name="permdesc_devicePower" product="tablet" msgid="6689862878984631831">"â€Ø¨Ù‡ برنامه اجازه می‎دهد رایانهٔ لوحی را روشن یا خاموش کند."</string>
+ <string name="permdesc_devicePower" product="default" msgid="6037057348463131032">"â€Ø¨Ù‡ برنامه اجازه می‎دهد گوشی را روشن یا خاموش کند."</string>
<string name="permlab_factoryTest" msgid="3715225492696416187">"اجرا در حالت تست کارخانه"</string>
<string name="permdesc_factoryTest" product="tablet" msgid="3952059318359653091">"اجرا به‌عنوان تست سازنده سطح پایین، امکان دسترسی کامل به Ø³Ø®Øªâ€ŒØ§ÙØ²Ø§Ø± رایانهٔ لوحی شما را ÙØ±Ø§Ù‡Ù… می‌آورد. Ùقط زمانی Ú©Ù‡ رایانهٔ لوحی در حالت تست سازنده در حال اجراست قابل دسترسی است."</string>
<string name="permdesc_factoryTest" product="default" msgid="8136644990319244802">"اجرا به‌عنوان تست سازنده سطح پایین، امکان دسترسی کامل به Ø³Ø®Øªâ€ŒØ§ÙØ²Ø§Ø± تلÙÙ† شما را ÙØ±Ø§Ù‡Ù… می‌آورد. Ùقط زمانی Ú©Ù‡ تلÙÙ† در حالت تست سازنده در حال اجراست قابل دسترسی است."</string>
<string name="permlab_setWallpaper" msgid="6627192333373465143">"تنظیم تصویر زمینه"</string>
- <string name="permdesc_setWallpaper" msgid="7373447920977624745">"به برنامه اجازه می‎دهد تا تصویر زمینه سیستم را تنظیم کند."</string>
+ <string name="permdesc_setWallpaper" msgid="7373447920977624745">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا تصویر زمینه سیستم را تنظیم کند."</string>
<string name="permlab_setWallpaperHints" msgid="3278608165977736538">"تنظیم اندازه تصویر زمینه"</string>
- <string name="permdesc_setWallpaperHints" msgid="8235784384223730091">"به برنامه اجازه می‎دهد تا نکات اندازه تصویر زمینه سیستم را تنظیم کند."</string>
+ <string name="permdesc_setWallpaperHints" msgid="8235784384223730091">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا نکات اندازه تصویر زمینه سیستم را تنظیم کند."</string>
<string name="permlab_masterClear" msgid="2315750423139697397">"بازنشانی سیستم به موارد Ù¾ÛŒØ´â€ŒÙØ±Ø¶ کارخانه"</string>
- <string name="permdesc_masterClear" msgid="3665380492633910226">"به برنامه اجازه می‎دهد تا بطور کامل سیستم را روی تنظیمات کارخانه بازنشانی کند، همه داده‎ها، پیکربندی و برنامه‎های نصب شده را پاک کند."</string>
+ <string name="permdesc_masterClear" msgid="3665380492633910226">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا بطور کامل سیستم را روی تنظیمات کارخانه بازنشانی کند، همه داده‎ها، پیکربندی Ùˆ برنامه‎های نصب شده را پاک کند."</string>
<string name="permlab_setTime" msgid="2021614829591775646">"تنظیم ساعت"</string>
- <string name="permdesc_setTime" product="tablet" msgid="1896341438151152881">"به برنامه اجازه می‎دهد تا زمان ساعت رایانهٔ لوحی را تغییر دهد."</string>
- <string name="permdesc_setTime" product="default" msgid="1855702730738020">"به برنامه اجازه می‎دهد تا زمان ساعت تلÙÙ† را تغییر دهد."</string>
+ <string name="permdesc_setTime" product="tablet" msgid="1896341438151152881">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا زمان ساعت رایانهٔ لوحی را تغییر دهد."</string>
+ <string name="permdesc_setTime" product="default" msgid="1855702730738020">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا زمان ساعت تلÙÙ† را تغییر دهد."</string>
<string name="permlab_setTimeZone" msgid="2945079801013077340">"تنظیم منطقهٔ زمانی"</string>
- <string name="permdesc_setTimeZone" product="tablet" msgid="1676983712315827645">"به برنامه اجازه می‎دهد تا منطقهٔ زمانی رایانهٔ لوحی را تغییر دهد."</string>
- <string name="permdesc_setTimeZone" product="default" msgid="4499943488436633398">"به برنامه اجازه می‎دهد تا منطقهٔ زمانی تلÙÙ† را تغییر دهد."</string>
- <string name="permlab_accountManagerService" msgid="4829262349691386986">"عملکرد به‌عنوان AccountManagerService"</string>
- <string name="permdesc_accountManagerService" msgid="1948455552333615954">"به برنامه اجازه می‎دهد با AccountAuthenticators تماس برقرار کند."</string>
+ <string name="permdesc_setTimeZone" product="tablet" msgid="1676983712315827645">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا منطقهٔ زمانی رایانهٔ لوحی را تغییر دهد."</string>
+ <string name="permdesc_setTimeZone" product="default" msgid="4499943488436633398">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا منطقهٔ زمانی تلÙÙ† را تغییر دهد."</string>
+ <string name="permlab_accountManagerService" msgid="4829262349691386986">"â€Ø¹Ù…لکرد به‌عنوان AccountManagerService"</string>
+ <string name="permdesc_accountManagerService" msgid="1948455552333615954">"â€Ø¨Ù‡ برنامه اجازه می‎دهد با AccountAuthenticators تماس برقرار کند."</string>
<string name="permlab_getAccounts" msgid="1086795467760122114">"ÛŒØ§ÙØªÙ† حساب‌ها در دستگاه"</string>
<string name="permdesc_getAccounts" product="tablet" msgid="2741496534769660027">"به برنامه اجازه می‌دهد به لیست حساب‌های شناخته شده توسط رایانهٔ لوحی دسترسی پیدا کند. این ممکن است حسا‌ب‌های ایجاد شده توسط برنامه‌هایی را که نصب کرده‌اید، شامل شود."</string>
<string name="permdesc_getAccounts" product="default" msgid="3448316822451807382">"به برنامه اجازه می‌دهد به لیست حساب‌های شناخته شده توسط تلÙÙ† دسترسی پیدا کند. این ممکن است حسا‌ب‌های ایجاد شده توسط برنامه‌هایی را Ú©Ù‡ نصب کرده‌اید، شامل شود."</string>
<string name="permlab_authenticateAccounts" msgid="5265908481172736933">"ایجاد حساب‌ها و تنظیم گذرواژ‌ه‌ها"</string>
- <string name="permdesc_authenticateAccounts" msgid="5472124296908977260">"به برنامه اجازه می‎دهد از امکانات تأیید کننده اعتبار حساب AccountManager از جمله ایجاد حساب Ùˆ Ø¯Ø±ÛŒØ§ÙØª Ùˆ تنظیم گذرواژه‎ها Ø§Ø³ØªÙØ§Ø¯Ù‡ کند."</string>
+ <string name="permdesc_authenticateAccounts" msgid="5472124296908977260">"â€Ø¨Ù‡ برنامه اجازه می‎دهد از امکانات تأیید کننده اعتبار حساب AccountManager از جمله ایجاد حساب Ùˆ Ø¯Ø±ÛŒØ§ÙØª Ùˆ تنظیم گذرواژه‎ها Ø§Ø³ØªÙØ§Ø¯Ù‡ کند."</string>
<string name="permlab_manageAccounts" msgid="4983126304757177305">"Ø§ÙØ²ÙˆØ¯Ù† یا حذ٠حساب‌ها"</string>
- <string name="permdesc_manageAccounts" msgid="8698295625488292506">"به برنامه اجازه می‎دهد تا عملکردهایی مانند Ø§ÙØ²ÙˆØ¯Ù† Ùˆ حذ٠حساب‌ها Ùˆ حذ٠گذرواژه‎ها را انجام دهد."</string>
+ <string name="permdesc_manageAccounts" msgid="8698295625488292506">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا عملکردهایی مانند Ø§ÙØ²ÙˆØ¯Ù† Ùˆ حذ٠حساب‌ها Ùˆ حذ٠گذرواژه‎ها را انجام دهد."</string>
<string name="permlab_useCredentials" msgid="235481396163877642">"Ø§Ø³ØªÙØ§Ø¯Ù‡ از حساب‌ها در دستگاه"</string>
- <string name="permdesc_useCredentials" msgid="7984227147403346422">"به برنامه اجازه می‎دهد نشانه‎های تایید اعتبار را درخواست کند."</string>
+ <string name="permdesc_useCredentials" msgid="7984227147403346422">"â€Ø¨Ù‡ برنامه اجازه می‎دهد نشانه‎های تایید اعتبار را درخواست کند."</string>
<string name="permlab_accessNetworkState" msgid="4951027964348974773">"مشاهدهٔ اتصالات شبکه"</string>
<string name="permdesc_accessNetworkState" msgid="8318964424675960975">"به برنامه امکان می‌دهد اطلاعات مربوط به اتصالات شبکه مانند شبکه‌های موجود و متصل را مشاهده کند."</string>
<string name="permlab_createNetworkSockets" msgid="8018758136404323658">"دسترسی کامل به شبکه"</string>
<string name="permdesc_createNetworkSockets" msgid="3403062187779724185">"به برنامه امکان می‌دهد سوکت‌های شبکه را ایجاد کند Ùˆ از پروتکل‌های شبکه Ø³ÙØ§Ø±Ø´ÛŒ Ø§Ø³ØªÙØ§Ø¯Ù‡ نماید. مرورگر Ùˆ سایر برنامه‌ها روشی را برای ارسال داده‌ها به اینترنت ارائه می‌کنند بنابراین این مجوز برای ارسال داده به اینترنت ضروری نیست."</string>
<string name="permlab_writeApnSettings" msgid="505660159675751896">"تغییر/رهگیری تنظیمات شبکه Ùˆ تراÙیک"</string>
- <string name="permdesc_writeApnSettings" msgid="5333798886412714193">"به برنامه اجازه می‎دهد تا تنظیمات شبکه را تغییر دهد Ùˆ در Ú©Ù„ تراÙیک شبکه مداخله کند Ùˆ آن را زیر نظر داشته باشد، برای مثال پراکسی Ùˆ پورت هر APN را تغییر دهد. برنامه‎های مخرب می‎توانند بسته‎های شبکه را بدون اطلاع شما کنترل کنند، مجددا هدایت کنند یا تغییر دهند."</string>
+ <string name="permdesc_writeApnSettings" msgid="5333798886412714193">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا تنظیمات شبکه را تغییر دهد Ùˆ در Ú©Ù„ تراÙیک شبکه مداخله کند Ùˆ آن را زیر نظر داشته باشد، برای مثال پراکسی Ùˆ پورت هر APN را تغییر دهد. برنامه‎های مخرب می‎توانند بسته‎های شبکه را بدون اطلاع شما کنترل کنند، مجددا هدایت کنند یا تغییر دهند."</string>
<string name="permlab_changeNetworkState" msgid="958884291454327309">"تغییر قابلیت اتصال شبکه"</string>
- <string name="permdesc_changeNetworkState" msgid="6789123912476416214">"به برنامه اجازه می‎دهد تا وضعیت اتصال شبکه را تغییر دهد."</string>
+ <string name="permdesc_changeNetworkState" msgid="6789123912476416214">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا وضعیت اتصال شبکه را تغییر دهد."</string>
<string name="permlab_changeTetherState" msgid="5952584964373017960">"تغییر قابلیت اتصال داده با سیم"</string>
- <string name="permdesc_changeTetherState" msgid="1524441344412319780">"به برنامه اجازه می‎دهد تا وضعیت اتصال شبکه اتصال داده با سیم را تغییر دهد."</string>
+ <string name="permdesc_changeTetherState" msgid="1524441344412319780">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا وضعیت اتصال شبکه اتصال داده با سیم را تغییر دهد."</string>
<string name="permlab_changeBackgroundDataSetting" msgid="1400666012671648741">"تغییر تنظیمات میزان Ø§Ø³ØªÙØ§Ø¯Ù‡ داده در پس‌زمینه"</string>
- <string name="permdesc_changeBackgroundDataSetting" msgid="5347729578468744379">"به برنامه اجازه می‎دهد تا تنظیم کاربرد داده‎های پس‌زمینه را تغییر دهد."</string>
- <string name="permlab_accessWifiState" msgid="5202012949247040011">"مشاهدهٔ اتصالات Wi-Fi"</string>
- <string name="permdesc_accessWifiState" msgid="5002798077387803726">"به برنامه امکان می‌دهد اطلاعات مربوط به شبکه Wi-Fi را مشاهده کند، به‌عنوان مثال ÙØ¹Ø§Ù„ بودن Wi-Fi Ùˆ نام دستگاه‌های Wi-Fi متصل."</string>
- <string name="permlab_changeWifiState" msgid="6550641188749128035">"اتصال به Wi-Fi و قطع اتصال از آن"</string>
- <string name="permdesc_changeWifiState" msgid="7137950297386127533">"به برنامه اجازه می‎دهد تا به نقاط دسترسی Wi-Fi وصل شود و ارتباط خود را با آن‌ها قطع کند و تغییراتی را در پیکربندی دستگاه برای شبکه‎های Wi-Fi ایجاد کند."</string>
- <string name="permlab_changeWifiMulticastState" msgid="1368253871483254784">"Ø¯Ø±ÛŒØ§ÙØª چندگانه Wi-Fi را مجاز می‌کند"</string>
- <string name="permdesc_changeWifiMulticastState" product="tablet" msgid="7969774021256336548">"به برنامه اجازه می‌دهد به Ø¯Ø±ÛŒØ§ÙØª بسته‌های ارسالی به همه دستگاه‌های موجود در شبکه Wi-Fi با Ø§Ø³ØªÙØ§Ø¯Ù‡ از آدرس‌های پخش چندگانه Ùˆ نه Ùقط به رایانهٔ لوحی شما بپردازند. این از توان مصر٠بیشتری نسبت به حالت پخش غیرچندگانه Ø§Ø³ØªÙØ§Ø¯Ù‡ می‌کند."</string>
- <string name="permdesc_changeWifiMulticastState" product="default" msgid="6851949706025349926">"به برنامه اجازه می‌دهد به Ø¯Ø±ÛŒØ§ÙØª بسته‌های ارسالی به همه دستگاه‌های موجود در شبکه Wi-Fi با Ø§Ø³ØªÙØ§Ø¯Ù‡ از آدرس‌های پخش چندگانه Ùˆ نه Ùقط به تلÙÙ† شما بپردازند. این از توان مصر٠بیشتری نسبت به حالت پخش غیرچندگانه Ø§Ø³ØªÙØ§Ø¯Ù‡ می‌کند."</string>
+ <string name="permdesc_changeBackgroundDataSetting" msgid="5347729578468744379">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا تنظیم کاربرد داده‎های پس‌زمینه را تغییر دهد."</string>
+ <string name="permlab_accessWifiState" msgid="5202012949247040011">"â€Ù…شاهدهٔ اتصالات Wi-Fi"</string>
+ <string name="permdesc_accessWifiState" msgid="5002798077387803726">"â€Ø¨Ù‡ برنامه امکان می‌دهد اطلاعات مربوط به شبکه Wi-Fi را مشاهده کند، به‌عنوان مثال ÙØ¹Ø§Ù„ بودن Wi-Fi Ùˆ نام دستگاه‌های Wi-Fi متصل."</string>
+ <string name="permlab_changeWifiState" msgid="6550641188749128035">"â€Ø§ØªØµØ§Ù„ به Wi-Fi Ùˆ قطع اتصال از آن"</string>
+ <string name="permdesc_changeWifiState" msgid="7137950297386127533">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا به نقاط دسترسی Wi-Fi وصل شود Ùˆ ارتباط خود را با آن‌ها قطع کند Ùˆ تغییراتی را در پیکربندی دستگاه برای شبکه‎های Wi-Fi ایجاد کند."</string>
+ <string name="permlab_changeWifiMulticastState" msgid="1368253871483254784">"â€Ø¯Ø±ÛŒØ§Ùت چندگانه Wi-Fi را مجاز می‌کند"</string>
+ <string name="permdesc_changeWifiMulticastState" product="tablet" msgid="7969774021256336548">"â€Ø¨Ù‡ برنامه اجازه می‌دهد به Ø¯Ø±ÛŒØ§ÙØª بسته‌های ارسالی به همه دستگاه‌های موجود در شبکه Wi-Fi با Ø§Ø³ØªÙØ§Ø¯Ù‡ از آدرس‌های پخش چندگانه Ùˆ نه Ùقط به رایانهٔ لوحی شما بپردازند. این از توان مصر٠بیشتری نسبت به حالت پخش غیرچندگانه Ø§Ø³ØªÙØ§Ø¯Ù‡ می‌کند."</string>
+ <string name="permdesc_changeWifiMulticastState" product="default" msgid="6851949706025349926">"â€Ø¨Ù‡ برنامه اجازه می‌دهد به Ø¯Ø±ÛŒØ§ÙØª بسته‌های ارسالی به همه دستگاه‌های موجود در شبکه Wi-Fi با Ø§Ø³ØªÙØ§Ø¯Ù‡ از آدرس‌های پخش چندگانه Ùˆ نه Ùقط به تلÙÙ† شما بپردازند. این از توان مصر٠بیشتری نسبت به حالت پخش غیرچندگانه Ø§Ø³ØªÙØ§Ø¯Ù‡ می‌کند."</string>
<string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"دسترسی به تنظیمات بلوتوث"</string>
- <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"به برنامه اجازه می‎دهد تا رایانهٔ لوحی بلوتوث محلی را پیکربندی کرده، دستگاه‌های راه دور را شناسایی کرده Ùˆ با آن‌ها Ø¬ÙØª شود."</string>
- <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"به برنامه اجازه می‎دهد تا تلÙÙ† بلوتوث محلی را پیکربندی کند Ùˆ دستگاه‌های راه دور را پیدا کند Ùˆ با آن‌ها Ø¬ÙØª شود."</string>
+ <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا رایانهٔ لوحی بلوتوث محلی را پیکربندی کرده، دستگاه‌های راه دور را شناسایی کرده Ùˆ با آن‌ها Ø¬ÙØª شود."</string>
+ <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا تلÙÙ† بلوتوث محلی را پیکربندی کند Ùˆ دستگاه‌های راه دور را پیدا کند Ùˆ با آن‌ها Ø¬ÙØª شود."</string>
<string name="permlab_bluetoothPriv" msgid="4009494246009513828">"اجازه ارتباط با بلوتوث از طریق برنامه"</string>
<string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"به برنامه امکان می‌دهد بدون تعامل کاربر با دستگاه‌های راه دور مرتبط شود."</string>
<string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"به برنامه امکان می‌دهد بدون تعامل کاربر با دستگاه‌های راه دور مرتبط شود."</string>
- <string name="permlab_accessWimaxState" msgid="4195907010610205703">"اتصال و قطع اتصال از WiMAX"</string>
+ <string name="permlab_accessWimaxState" msgid="4195907010610205703">"â€Ø§ØªØµØ§Ù„ Ùˆ قطع اتصال از WiMAX"</string>
<string name="permdesc_accessWimaxState" msgid="6360102877261978887">"به برنامه امکان می‌دهد ÙØ¹Ø§Ù„ بودن وایمکس Ùˆ اطلاعات مربوط به هر یک از شبکه‌های وایمکس متصل را مشخص کند."</string>
- <string name="permlab_changeWimaxState" msgid="2405042267131496579">"تغییر وضعیت WiMAX"</string>
+ <string name="permlab_changeWimaxState" msgid="2405042267131496579">"â€ØªØºÛŒÛŒØ± وضعیت WiMAX"</string>
<string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"به برنامه امکان می‌دهد رایانهٔ لوحی را به شبکه‌های وایمکس متصل کرده یا اتصال آن را از این شبکه‌ها قطع کند."</string>
- <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"به برنامه امکان می‎دهد تا تلÙÙ† را به شبکه‌های وایمکس متصل کرده یا اتصال آنرا از این شبکه‌ها قطع کند."</string>
+ <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"â€Ø¨Ù‡ برنامه امکان می‎دهد تا تلÙÙ† را به شبکه‌های وایمکس متصل کرده یا اتصال آنرا از این شبکه‌ها قطع کند."</string>
<string name="permlab_bluetooth" msgid="6127769336339276828">"Ø¬ÙØª کردن با دستگاه‌های بلوتوث"</string>
- <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"به برنامه اجازه می‎دهد تا پیکربندی بلوتوث در رایانهٔ لوحی را مشاهده کند و اتصال با دستگاه‌های مرتبط را برقرار کرده و بپذیرد."</string>
- <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"به برنامه اجازه می‎دهد تا پیکربندی بلوتوث در تلÙÙ† را مشاهده کند، Ùˆ اتصالات دستگاه‌های مرتبط را برقرار کرده Ùˆ بپذیرد."</string>
+ <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا پیکربندی بلوتوث در رایانهٔ لوحی را مشاهده کند Ùˆ اتصال با دستگاه‌های مرتبط را برقرار کرده Ùˆ بپذیرد."</string>
+ <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا پیکربندی بلوتوث در تلÙÙ† را مشاهده کند، Ùˆ اتصالات دستگاه‌های مرتبط را برقرار کرده Ùˆ بپذیرد."</string>
<string name="permlab_nfc" msgid="4423351274757876953">"کنترل ارتباط راه نزدیک"</string>
- <string name="permdesc_nfc" msgid="7120611819401789907">"به برنامه اجازه می‎دهد تا با تگهای ارتباط میدان نزدیک (NFC)ØŒ کارتها Ùˆ ÙØ§ÛŒÙ„ خوان ارتباط برقرار کند."</string>
+ <string name="permdesc_nfc" msgid="7120611819401789907">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا با تگهای ارتباط میدان نزدیک (NFC)ØŒ کارتها Ùˆ ÙØ§ÛŒÙ„ خوان ارتباط برقرار کند."</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"ØºÛŒØ±ÙØ¹Ø§Ù„ کردن Ù‚ÙÙ„ ØµÙØ­Ù‡ شما"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"به برنامه امکان می‌دهد Ù‚ÙÙ„ کلید Ùˆ هر گونه امنیت گذرواژه مرتبط را ØºÛŒØ±ÙØ¹Ø§Ù„ کند. به‌عنوان مثال تلÙÙ† هنگام Ø¯Ø±ÛŒØ§ÙØª یک تماس تلÙÙ†ÛŒ ورودی Ù‚ÙÙ„ کلید را ØºÛŒØ±ÙØ¹Ø§Ù„ می‌کند Ùˆ بعد از پایان تماس، Ù‚ÙÙ„ کلید را دوباره ÙØ¹Ø§Ù„ می‌کند."</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"خواندن تنظیمات همگام‌سازی"</string>
@@ -631,39 +638,39 @@
<string name="permlab_readSyncStats" msgid="7396577451360202448">"خواندن اطلاعات آماری همگام‌سازی"</string>
<string name="permdesc_readSyncStats" msgid="1510143761757606156">"به یک برنامه اجازه می‌دهد وضعیت همگام‌سازی یک حساب را بخواند، از جمله سابقه رویدادهای همگام‌سازی و میزان داده‌های همگام‌سازی شده."</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"خواندن Ùیدهای مشترک"</string>
- <string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"به برنامه اجازه می‎دهد تا جزئیات مربوط به Ùیدهای همگام شده کنونی را Ø¯Ø±ÛŒØ§ÙØª کند."</string>
+ <string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا جزئیات مربوط به Ùیدهای همگام شده کنونی را Ø¯Ø±ÛŒØ§ÙØª کند."</string>
<string name="permlab_subscribedFeedsWrite" msgid="9015246325408209296">"نوشتن Ùیدهای مشترک"</string>
- <string name="permdesc_subscribedFeedsWrite" msgid="6928930188826089413">"به برنامه اجازه می‎دهد تا Ùیدهای همگام شده کنونی را تغییر دهد. برنامه‎های مخرب می‎توانند Ùیدهای همگام شده را تغییر دهند."</string>
+ <string name="permdesc_subscribedFeedsWrite" msgid="6928930188826089413">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا Ùیدهای همگام شده کنونی را تغییر دهد. برنامه‎های مخرب می‎توانند Ùیدهای همگام شده را تغییر دهند."</string>
<string name="permlab_readDictionary" msgid="4107101525746035718">"خواندن واژه‌هایی Ú©Ù‡ به ÙØ±Ù‡Ù†Ú¯â€Œ لغت اضاÙÙ‡ کردید"</string>
- <string name="permdesc_readDictionary" msgid="659614600338904243">"به برنامه اجازه می‎دهد همه کلمه، نام Ùˆ عباراتی را Ú©Ù‡ کاربر در ÙØ±Ù‡Ù†Ú¯ لغت خود ذخیره کرده است بخواند."</string>
+ <string name="permdesc_readDictionary" msgid="659614600338904243">"â€Ø¨Ù‡ برنامه اجازه می‎دهد همه کلمه، نام Ùˆ عباراتی را Ú©Ù‡ کاربر در ÙØ±Ù‡Ù†Ú¯ لغت خود ذخیره کرده است بخواند."</string>
<string name="permlab_writeDictionary" msgid="2183110402314441106">"Ø§ÙØ²ÙˆØ¯Ù† کلمات به ÙØ±Ù‡Ù†Ú¯ لغت تعریÙ‌ شده توسط کاربر"</string>
- <string name="permdesc_writeDictionary" msgid="8185385716255065291">"به برنامه اجازه می‎دهد تا کلمات جدید را در Ùهرست کاربر بنویسد."</string>
- <string name="permlab_sdcardRead" product="nosdcard" msgid="367275095159405468">"خواندن محتویات Ø­Ø§ÙØ¸Ù‡Ù” USB شما"</string>
- <string name="permlab_sdcardRead" product="default" msgid="2188156462934977940">"خواندن محتویات کارت SD شما"</string>
- <string name="permdesc_sdcardRead" product="nosdcard" msgid="3446988712598386079">"به برنامه اجازه می‌دهد محتواهای ÙØ¶Ø§ÛŒ ذخیره USB را بخواند."</string>
- <string name="permdesc_sdcardRead" product="default" msgid="2607362473654975411">"به برنامه اجازه می‌دهد محتواهای کارت SD شما را بخواند."</string>
- <string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"اصلاح یا حذ٠محتویات Ø­Ø§ÙØ¸Ù‡Ù” USB شما"</string>
- <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"محتوای کارت SD شما را اصلاح کرده یا تغییر دهد"</string>
- <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"به برنامه اجازه می‎دهد تا در Ø­Ø§ÙØ¸Ù‡Ù” USB بنویسد."</string>
- <string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"به برنامه اجازه می‎دهد تا در کارت SD بنویسد."</string>
+ <string name="permdesc_writeDictionary" msgid="8185385716255065291">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا کلمات جدید را در Ùهرست کاربر بنویسد."</string>
+ <string name="permlab_sdcardRead" product="nosdcard" msgid="367275095159405468">"â€Ø®ÙˆØ§Ù†Ø¯Ù† محتویات Ø­Ø§ÙØ¸Ù‡Ù” USB شما"</string>
+ <string name="permlab_sdcardRead" product="default" msgid="2188156462934977940">"â€Ø®ÙˆØ§Ù†Ø¯Ù† محتویات کارت SD شما"</string>
+ <string name="permdesc_sdcardRead" product="nosdcard" msgid="3446988712598386079">"â€Ø¨Ù‡ برنامه اجازه می‌دهد محتواهای ÙØ¶Ø§ÛŒ ذخیره USB را بخواند."</string>
+ <string name="permdesc_sdcardRead" product="default" msgid="2607362473654975411">"â€Ø¨Ù‡ برنامه اجازه می‌دهد محتواهای کارت SD شما را بخواند."</string>
+ <string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"â€Ø§ØµÙ„اح یا حذ٠محتویات Ø­Ø§ÙØ¸Ù‡Ù” USB شما"</string>
+ <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"â€Ù…حتوای کارت SD شما را اصلاح کرده یا تغییر دهد"</string>
+ <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا در Ø­Ø§ÙØ¸Ù‡Ù” USB بنویسد."</string>
+ <string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا در کارت SD بنویسد."</string>
<string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"تغییر/حذ٠محتواهای Ø­Ø§ÙØ¸Ù‡ رسانه داخلی"</string>
- <string name="permdesc_mediaStorageWrite" product="default" msgid="8189160597698529185">"به برنامه اجازه می‎دهد تا محتویات Ø­Ø§ÙØ¸Ù‡ رسانه داخلی را تغییر دهد."</string>
+ <string name="permdesc_mediaStorageWrite" product="default" msgid="8189160597698529185">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا محتویات Ø­Ø§ÙØ¸Ù‡ رسانه داخلی را تغییر دهد."</string>
<string name="permlab_manageDocs" product="default" msgid="5778318598448849829">"مدیریت ÙØ¶Ø§ÛŒ ذخیره‌سازی اسناد"</string>
<string name="permdesc_manageDocs" product="default" msgid="8704323176914121484">"به برنامه اجازه می‌دهد ÙØ¶Ø§ÛŒ ذخیره‌سازی اسناد را مدیریت کند."</string>
<string name="permlab_sdcardAccessAll" msgid="8150613823900460576">"دسترسی به دستگاه ذخیره خارجی تمام کاربران"</string>
<string name="permdesc_sdcardAccessAll" msgid="3215208357415891320">"به برنامه اجازه می‌دهد به دستگاه ذخیره خارجی برای همه کاربران دسترسی داشته باشد."</string>
<string name="permlab_cache_filesystem" msgid="5656487264819669824">"دسترسی به سیستم ÙØ§ÛŒÙ„ Ø­Ø§ÙØ¸Ù‡Ù” پنهان"</string>
- <string name="permdesc_cache_filesystem" msgid="5578967642265550955">"به برنامه اجازه می‎دهد تا سیستم ÙØ§ÛŒÙ„ Ø­Ø§ÙØ¸Ù‡Ù” پنهان را بخواند Ùˆ بنویسد."</string>
+ <string name="permdesc_cache_filesystem" msgid="5578967642265550955">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا سیستم ÙØ§ÛŒÙ„ Ø­Ø§ÙØ¸Ù‡Ù” پنهان را بخواند Ùˆ بنویسد."</string>
<string name="permlab_use_sip" msgid="5986952362795870502">"علامت‌گذاری/Ø¯Ø±ÛŒØ§ÙØª تماس‌های اینترنتی"</string>
- <string name="permdesc_use_sip" msgid="4717632000062674294">"به برنامه اجازه می‎دهد تا از خدمات SIP Ø§Ø³ØªÙØ§Ø¯Ù‡ کند Ùˆ تماس‌های اینترنتی بگیرد/Ø¯Ø±ÛŒØ§ÙØª کند."</string>
+ <string name="permdesc_use_sip" msgid="4717632000062674294">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا از خدمات SIP Ø§Ø³ØªÙØ§Ø¯Ù‡ کند Ùˆ تماس‌های اینترنتی بگیرد/Ø¯Ø±ÛŒØ§ÙØª کند."</string>
<string name="permlab_bind_call_service" msgid="6724009726671246551">"تعامل با ØµÙØ­Ù‡â€ŒÙ†Ù…ایش هنگام تماس"</string>
<string name="permdesc_bind_call_service" msgid="8732547662442572435">"به برنامه امکان می‌دهد کنترل کند Ú©Ù‡ کاربر Ú†Ù‡ زمانی Ùˆ چگونه ØµÙØ­Ù‡â€ŒÙ†Ù…ایش هنگام تماس را مشاهده کند."</string>
<string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"خواندن سابقه Ø§Ø³ØªÙØ§Ø¯Ù‡ از شبکه"</string>
- <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"به برنامه اجازه می‎دهد تا کاربرد شبکه را در طول زمان برای برنامه‎ها و شبکه‎های خاص بخواند."</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا کاربرد شبکه را در طول زمان برای برنامه‎ها Ùˆ شبکه‎های خاص بخواند."</string>
<string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"مدیریت خط مشی شبکه"</string>
- <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"به برنامه اجازه می‎دهد تا خط مشی‎های شبکه را مدیریت کند و قوانین خاص برنامه را تعیین کند."</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا خط مشی‎های شبکه را مدیریت کند Ùˆ قوانین خاص برنامه را تعیین کند."</string>
<string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"اصلاح محاسبه Ø§Ø³ØªÙØ§Ø¯Ù‡ از شبکه"</string>
- <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"به برنامه اجازه می‎دهد تا نحوه محاسبه کاربرد شبکه در برنامه را تغییر دهد. برای Ø§Ø³ØªÙØ§Ø¯Ù‡ برنامه‎های عادی نیست."</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا نحوه محاسبه کاربرد شبکه در برنامه را تغییر دهد. برای Ø§Ø³ØªÙØ§Ø¯Ù‡ برنامه‎های عادی نیست."</string>
<string name="permlab_markNetworkSocket" msgid="3658527214914959749">"تغییر علائم سوکت"</string>
<string name="permdesc_markNetworkSocket" msgid="7655568433696356578">"به برنامه اجازه می‌دهد برای مسیریابی علائم سوکت را تغییر دهد."</string>
<string name="permlab_accessNotifications" msgid="7673416487873432268">"اعلان‌های دسترسی"</string>
@@ -675,10 +682,10 @@
<string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"گوش دادن برای بررسی شرایط شبکه"</string>
<string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"به برنامه امکان می‌دهد برای بررسی شرایط شبکه گوش دهد. این امکان هرگز نباید برای برنامه‌های معمولی مورد نیاز باشد."</string>
<string name="policylab_limitPassword" msgid="4497420728857585791">"تنظیم قوانین رمز ورود"</string>
- <string name="policydesc_limitPassword" msgid="3252114203919510394">"طول Ùˆ نویسه‎های مجاز در گذرواژه‌های بازکردن Ù‚ÙÙ„ ØµÙØ­Ù‡ را کنترل کنید."</string>
+ <string name="policydesc_limitPassword" msgid="3252114203919510394">"â€Ø·ÙˆÙ„ Ùˆ نویسه‎های مجاز در گذرواژه‌های بازکردن Ù‚ÙÙ„ ØµÙØ­Ù‡ را کنترل کنید."</string>
<string name="policylab_watchLogin" msgid="914130646942199503">"نمایش تلاش‌های Ù‚ÙÙ„ گشایی ØµÙØ­Ù‡"</string>
- <string name="policydesc_watchLogin" product="tablet" msgid="3215729294215070072">"تعداد گذرواژه‎های اشتباه تایپ شده را هنگام بازکردن Ù‚ÙÙ„ ØµÙØ­Ù‡ کنترل می‌کند، Ùˆ یا اگر Ø¯ÙØ¹Ø§Øª زیادی گذرواژه اشتباه تایپ شود رایانهٔ لوحی را Ù‚ÙÙ„ می‎کند Ùˆ همه داده‎های رایانهٔ لوحی را پاک می‎کند."</string>
- <string name="policydesc_watchLogin" product="default" msgid="5712323091846761073">"تعداد گذرواژه‎های نادرست تایپ شده را کنترل می‎کند. هنگام بازکردن Ù‚ÙÙ„ ØµÙØ­Ù‡ اگر Ø¯ÙØ¹Ø§Øª زیادی گذرواژه نادرست تایپ کرده‎اید، تلÙÙ† را Ù‚ÙÙ„ کنید یا همه داده‎های تلÙÙ† را پاک کنید."</string>
+ <string name="policydesc_watchLogin" product="tablet" msgid="3215729294215070072">"â€ØªØ¹Ø¯Ø§Ø¯ گذرواژه‎های اشتباه تایپ شده را هنگام بازکردن Ù‚ÙÙ„ ØµÙØ­Ù‡ کنترل می‌کند، Ùˆ یا اگر Ø¯ÙØ¹Ø§Øª زیادی گذرواژه اشتباه تایپ شود رایانهٔ لوحی را Ù‚ÙÙ„ می‎کند Ùˆ همه داده‎های رایانهٔ لوحی را پاک می‎کند."</string>
+ <string name="policydesc_watchLogin" product="default" msgid="5712323091846761073">"â€ØªØ¹Ø¯Ø§Ø¯ گذرواژه‎های نادرست تایپ شده را کنترل می‎کند. هنگام بازکردن Ù‚ÙÙ„ ØµÙØ­Ù‡ اگر Ø¯ÙØ¹Ø§Øª زیادی گذرواژه نادرست تایپ کرده‎اید، تلÙÙ† را Ù‚ÙÙ„ کنید یا همه داده‎های تلÙÙ† را پاک کنید."</string>
<string name="policylab_resetPassword" msgid="2620077191242688955">"تغییر رمز ورود Ù‚ÙÙ„ گشایی ØµÙØ­Ù‡"</string>
<string name="policydesc_resetPassword" msgid="605963962301904458">"گذرواژه بازگشایی Ù‚ÙÙ„ ØµÙØ­Ù‡ را تغییر دهید."</string>
<string name="policylab_forceLock" msgid="2274085384704248431">"Ù‚ÙÙ„ کردن ØµÙØ­Ù‡"</string>
@@ -693,7 +700,7 @@
<string name="policylab_encryptedStorage" msgid="8901326199909132915">"تنظیم رمزگذاری Ø­Ø§ÙØ¸Ù‡"</string>
<string name="policydesc_encryptedStorage" msgid="2637732115325316992">"باید اطلاعات ذخیره شده برنامه رمزگذاری شود."</string>
<string name="policylab_disableCamera" msgid="6395301023152297826">"غیر ÙØ¹Ø§Ù„ کردن دوربین ها"</string>
- <string name="policydesc_disableCamera" msgid="2306349042834754597">"از Ø§Ø³ØªÙØ§Ø¯Ù‡ از تمام دوربین‎های دستگاه جلوگیری کنید."</string>
+ <string name="policydesc_disableCamera" msgid="2306349042834754597">"â€Ø§Ø² Ø§Ø³ØªÙØ§Ø¯Ù‡ از تمام دوربین‎های دستگاه جلوگیری کنید."</string>
<string name="policylab_disableKeyguardFeatures" msgid="266329104542638802">"ØºÛŒØ±ÙØ¹Ø§Ù„ کردن ویژگی‌‌ها در Ù…Ø­Ø§ÙØ¸ کلید"</string>
<string name="policydesc_disableKeyguardFeatures" msgid="3467082272186534614">"از Ø§Ø³ØªÙØ§Ø¯Ù‡ از برخی ویژگی‌ها در Ù…Ø­Ø§ÙØ¸ کلید جلوگیری شود."</string>
<string-array name="phoneTypes">
@@ -810,8 +817,8 @@
<string name="sipAddressTypeWork" msgid="6920725730797099047">"محل کار"</string>
<string name="sipAddressTypeOther" msgid="4408436162950119849">"سایر موارد"</string>
<string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"پین کد را وارد کنید"</string>
- <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"PUK و پین کد جدید را تایپ کنید"</string>
- <string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"کد PUK"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"â€PUK Ùˆ پین کد جدید را تایپ کنید"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"â€Ú©Ø¯ PUK"</string>
<string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"پین کد جدید"</string>
<string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"برای تایپ گذرواژه لمس کنید"</font></string>
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"برای بازکردن Ù‚ÙÙ„ØŒ گذرواژه را وارد کنید"</string>
@@ -829,7 +836,7 @@
<string name="lockscreen_pattern_correct" msgid="9039008650362261237">"صحیح است!"</string>
<string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"دوباره امتحان کنید"</string>
<string name="lockscreen_password_wrong" msgid="5737815393253165301">"دوباره امتحان کنید"</string>
- <string name="faceunlock_multiple_failures" msgid="754137583022792429">"Ø¯ÙØ¹Ø§Øª تلاش برای Face Unlock از حداکثر مجاز بیشتر شد"</string>
+ <string name="faceunlock_multiple_failures" msgid="754137583022792429">"â€Ø¯Ùعات تلاش برای Face Unlock از حداکثر مجاز بیشتر شد"</string>
<string name="lockscreen_plugged_in" msgid="8057762828355572315">"در حال شارژ، <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
<string name="lockscreen_charged" msgid="321635745684060624">"شارژ شد"</string>
<string name="lockscreen_battery_short" msgid="4477264849386850266">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
@@ -840,7 +847,7 @@
<string name="lockscreen_missing_sim_instructions" msgid="5372787138023272615">"سیم کارت را وارد کنید."</string>
<string name="lockscreen_missing_sim_instructions_long" msgid="3526573099019319472">"سیم کارت موجود نیست یا قابل خواندن نیست. یک سیم کارت وارد کنید."</string>
<string name="lockscreen_permanent_disabled_sim_message_short" msgid="5096149665138916184">"سیم کارت غیرقابل Ø§Ø³ØªÙØ§Ø¯Ù‡ است."</string>
- <string name="lockscreen_permanent_disabled_sim_instructions" msgid="910904643433151371">"سیم کارت شما به طور دائم غیر ÙØ¹Ø§Ù„ شده است. \nبرای داشتن سیم کارت دیگر با ارائه‎دهنده سرویس بی‎سیم خود تماس بگیرید."</string>
+ <string name="lockscreen_permanent_disabled_sim_instructions" msgid="910904643433151371">"â€Ø³ÛŒÙ… کارت شما به طور دائم غیر ÙØ¹Ø§Ù„ شده است. \nبرای داشتن سیم کارت دیگر با ارائه‎دهنده سرویس بی‎سیم خود تماس بگیرید."</string>
<string name="lockscreen_transport_prev_description" msgid="201594905152746886">"دکمه تراک قبلی"</string>
<string name="lockscreen_transport_next_description" msgid="6089297650481292363">"دکمه تراک بعدی"</string>
<string name="lockscreen_transport_pause_description" msgid="7659088786780128001">"دکمه مکث"</string>
@@ -848,15 +855,15 @@
<string name="lockscreen_transport_stop_description" msgid="4562318378766987601">"دکمه توقÙ"</string>
<string name="emergency_calls_only" msgid="6733978304386365407">"Ùقط تماس‌های اضطراری"</string>
<string name="lockscreen_network_locked_message" msgid="143389224986028501">"شبکه Ù‚ÙÙ„ شد"</string>
- <string name="lockscreen_sim_puk_locked_message" msgid="7441797339976230">"سیم کارت با PUK Ù‚ÙÙ„ شده است."</string>
+ <string name="lockscreen_sim_puk_locked_message" msgid="7441797339976230">"â€Ø³ÛŒÙ… کارت با PUK Ù‚ÙÙ„ شده است."</string>
<string name="lockscreen_sim_puk_locked_instructions" msgid="8127916255245181063">"Ù„Ø·ÙØ§Ù‹ به راهنمای کاربر مراجعه کرده یا با مرکز پشتیبانی از مشتریان تماس بگیرید."</string>
<string name="lockscreen_sim_locked_message" msgid="8066660129206001039">"سیم کارت Ù‚ÙÙ„ شد."</string>
<string name="lockscreen_sim_unlock_progress_dialog_message" msgid="595323214052881264">"بازگشایی Ù‚ÙÙ„ سیم کارت..."</string>
- <string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="6481623830344107222">"الگوی بازگشایی Ù‚ÙÙ„ خود را <xliff:g id="NUMBER_0">%d</xliff:g> بار اشتباه کشیده‎اید. \n\nÙ„Ø·ÙØ§Ù‹ پس از <xliff:g id="NUMBER_1">%d</xliff:g> ثانیه دوباره امتحان کنید."</string>
+ <string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="6481623830344107222">"â€Ø§Ù„Ú¯ÙˆÛŒ بازگشایی Ù‚ÙÙ„ خود را <xliff:g id="NUMBER_0">%d</xliff:g> بار اشتباه کشیده‎اید. \n\nÙ„Ø·ÙØ§Ù‹ پس از <xliff:g id="NUMBER_1">%d</xliff:g> ثانیه دوباره امتحان کنید."</string>
<string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="2725973286239344555">"گذرواژهٔ خود را <xliff:g id="NUMBER_0">%d</xliff:g> بار اشتباه تایپ کرده‌اید. \n\nپس از <xliff:g id="NUMBER_1">%d</xliff:g> ثانیه دوباره امتحان کنید."</string>
- <string name="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="6216672706545696955">"پین را<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" product="tablet" msgid="9191611984625460820">"شما الگوی بازگشایی Ù‚ÙÙ„ خود را <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_failed_attempts_almost_glogin" product="default" msgid="2590227559763762751">"شما الگوی بازگشایی Ù‚ÙÙ„ خود را <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_pin_attempts_dialog_message" msgid="6216672706545696955">"â€Ù¾ÛŒÙ† را<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" product="tablet" msgid="9191611984625460820">"â€Ø´Ù…ا الگوی بازگشایی Ù‚ÙÙ„ خود را <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_failed_attempts_almost_glogin" product="default" msgid="2590227559763762751">"â€Ø´Ù…ا الگوی بازگشایی Ù‚ÙÙ„ خود را <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_failed_attempts_almost_at_wipe" product="tablet" msgid="6128106399745755604">"شما به اشتباه <xliff:g id="NUMBER_0">%d</xliff:g> بار اقدام به باز کردن Ù‚ÙÙ„ رایانهٔ لوحی کرده‌اید. پس از <xliff:g id="NUMBER_1">%d</xliff:g> تلاش ناموÙÙ‚ دیگر، رایانهٔ لوحی به Ù¾ÛŒØ´â€ŒÙØ±Ø¶ کارخانه بازنشانی می‌شود Ùˆ تمام داده‌های کاربر از دست خواهد Ø±ÙØª."</string>
<string name="lockscreen_failed_attempts_almost_at_wipe" product="default" msgid="8603565142156826565">"شما به اشتباه <xliff:g id="NUMBER_0">%d</xliff:g> بار اقدام به باز کردن Ù‚ÙÙ„ تلÙÙ† کرده‌اید. پس از<xliff:g id="NUMBER_1">%d</xliff:g> تلاش ناموÙÙ‚ دیگر، تلÙÙ† به Ù¾ÛŒØ´â€ŒÙØ±Ø¶ کارخانه بازنشانی می‌شود Ùˆ تمام داده‌های کاربر از دست خواهد Ø±ÙØª."</string>
<string name="lockscreen_failed_attempts_now_wiping" product="tablet" msgid="280873516493934365">"شما به اشتباه اقدام به باز کردن Ù‚ÙÙ„ <xliff:g id="NUMBER">%d</xliff:g> رایانهٔ لوحی کرده‌اید. رایانهٔ لوحی در حال حاضر به Ù¾ÛŒØ´â€ŒÙØ±Ø¶ کارخانه بازنشانی می‌شود."</string>
@@ -864,13 +871,13 @@
<string name="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"در <xliff:g id="NUMBER">%d</xliff:g> ثانیه دوباره امتحان کنید."</string>
<string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"الگو را ÙØ±Ø§Ù…وش کرده‌اید؟"</string>
<string name="lockscreen_glogin_forgot_pattern" msgid="2588521501166032747">"بازگشایی Ù‚ÙÙ„ حساب"</string>
- <string name="lockscreen_glogin_too_many_attempts" msgid="2751368605287288808">"تلاش‎های زیادی برای کشیدن الگو صورت Ú¯Ø±ÙØªÙ‡ است"</string>
- <string name="lockscreen_glogin_instructions" msgid="3931816256100707784">"برای بازگشایی Ù‚ÙÙ„ØŒ با حساب Google خود وارد سیستم شوید."</string>
+ <string name="lockscreen_glogin_too_many_attempts" msgid="2751368605287288808">"â€ØªÙ„اش‎های زیادی برای کشیدن الگو صورت Ú¯Ø±ÙØªÙ‡ است"</string>
+ <string name="lockscreen_glogin_instructions" msgid="3931816256100707784">"â€Ø¨Ø±Ø§ÛŒ بازگشایی Ù‚ÙÙ„ØŒ با حساب Google خود وارد سیستم شوید."</string>
<string name="lockscreen_glogin_username_hint" msgid="8846881424106484447">"نام کاربری (ایمیل)"</string>
<string name="lockscreen_glogin_password_hint" msgid="5958028383954738528">"رمز ورود"</string>
<string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"ورود به سیستم"</string>
<string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"نام کاربر یا رمز ورود نامعتبر است."</string>
- <string name="lockscreen_glogin_account_recovery_hint" msgid="1696924763690379073">"نام کاربری یا گذرواژهٔ خود را ÙØ±Ø§Ù…وش کردید؟\nاز "<b>"google.com/accounts/recovery"</b>" بازدید کنید."</string>
+ <string name="lockscreen_glogin_account_recovery_hint" msgid="1696924763690379073">"â€Ù†Ø§Ù… کاربری یا گذرواژهٔ خود را ÙØ±Ø§Ù…وش کردید؟\nاز "<b>"google.com/accounts/recovery"</b>" بازدید کنید."</string>
<string name="lockscreen_glogin_checking_password" msgid="7114627351286933867">"در حال بررسی..."</string>
<string name="lockscreen_unlock_label" msgid="737440483220667054">"بازگشایی Ù‚ÙÙ„"</string>
<string name="lockscreen_sound_on_label" msgid="9068877576513425970">"صدا روشن"</string>
@@ -879,7 +886,7 @@
<string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"الگو پاک شد"</string>
<string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"سلول اضاÙÙ‡ شد"</string>
<string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"الگو تکمیل شد"</string>
- <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. ابزارک %2$d از %3$d."</string>
+ <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"â€%1$s. ابزارک %2$d از %3$d."</string>
<string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"ابزارک اضاÙÙ‡ کنید."</string>
<string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"خالی"</string>
<string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"منطقه بازگشایی گسترده شد."</string>
@@ -910,10 +917,10 @@
<string name="hour_ampm" msgid="4584338083529355982">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
<string name="hour_cap_ampm" msgid="2083465992940444366">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
<string name="factorytest_failed" msgid="5410270329114212041">"تست کارخانه انجام نشد"</string>
- <string name="factorytest_not_system" msgid="4435201656767276723">"عملکرد FACTORY_TEST تنها برای بسته‌های نصب شده در /system/app پشتیبانی می‌شود."</string>
- <string name="factorytest_no_action" msgid="872991874799998561">"بسته‌ای ÛŒØ§ÙØª نشد Ú©Ù‡ عملکرد FACTORY_TEST را ارائه کند."</string>
+ <string name="factorytest_not_system" msgid="4435201656767276723">"â€Ø¹Ù…لکرد FACTORY_TEST تنها برای بسته‌های نصب شده در /system/app پشتیبانی می‌شود."</string>
+ <string name="factorytest_no_action" msgid="872991874799998561">"â€Ø¨Ø³ØªÙ‡â€ŒØ§ÛŒ ÛŒØ§ÙØª نشد Ú©Ù‡ عملکرد FACTORY_TEST را ارائه کند."</string>
<string name="factorytest_reboot" msgid="6320168203050791643">"راه‌اندازی مجدد"</string>
- <string name="js_dialog_title" msgid="1987483977834603872">"ØµÙØ­Ù‡ در \"<xliff:g id="TITLE">%s</xliff:g>\" می‎گوید:"</string>
+ <string name="js_dialog_title" msgid="1987483977834603872">"â€ØµÙحه در \"<xliff:g id="TITLE">%s</xliff:g>\" می‎گوید:"</string>
<string name="js_dialog_title_default" msgid="6961903213729667573">"جاوا اسکریپت"</string>
<string name="js_dialog_before_unload_title" msgid="2619376555525116593">"تأیید پیمایش"</string>
<string name="js_dialog_before_unload_positive_button" msgid="3112752010600484130">"ترک این ØµÙØ­Ù‡"</string>
@@ -945,17 +952,17 @@
<string name="permdesc_writeHistoryBookmarks" product="tablet" msgid="6825527469145760922">"به برنامه اجازه می‌دهد سابقه مرورگر یا نشانک‌های ذخیره شده در رایانهٔ لوحی شما را اصلاح کند. این ویژگی ممکن است به برنامه اجازه دهد داده‌های مرورگر را حذ٠یا اصلاح کند. توجه: این مجوز ممکن است توسط مرورگرهای شخص ثالث یا سایر برنامه‌های دارای قابلیت مرور وب قابل اجرا نباشد."</string>
<string name="permdesc_writeHistoryBookmarks" product="default" msgid="8497389531014185509">"به برنامه اجازه می‌دهد سابقه مرورگر یا نشانک‌های ذخیره شده در تلÙÙ† شما را اصلاح کند. این ویژگی ممکن است به برنامه اجازه دهد داده‌های مرورگر را حذ٠یا اصلاح کند. توجه: این مجوز ممکن است توسط مرورگرهای شخص ثالث یا سایر برنامه‌های دارای قابلیت مرور وب قابل اجرا نباشد."</string>
<string name="permlab_setAlarm" msgid="1379294556362091814">"تنظیم یک هشدار"</string>
- <string name="permdesc_setAlarm" msgid="316392039157473848">"به برنامه اجازه می‎دهد تا هشداری را در برنامه ساعت زنگدار نصب شده تنظیم کند. برخی از برنامه‎های ساعت زنگدار نمی‎توانند این ویژگی را اعمال کنند."</string>
+ <string name="permdesc_setAlarm" msgid="316392039157473848">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا هشداری را در برنامه ساعت زنگدار نصب شده تنظیم کند. برخی از برنامه‎های ساعت زنگدار نمی‎توانند این ویژگی را اعمال کنند."</string>
<string name="permlab_addVoicemail" msgid="5525660026090959044">"Ø§ÙØ²ÙˆØ¯Ù† پست صوتی"</string>
<string name="permdesc_addVoicemail" msgid="6604508651428252437">"به برنامه اجازه می‌دهد تا پیام‌ها را به صندوق Ø¯Ø±ÛŒØ§ÙØª پست صوتی شما اضاÙÙ‡ کند."</string>
<string name="permlab_writeGeolocationPermissions" msgid="5962224158955273932">"تغییر مجوزهای مکان جغراÙیایی مرورگر"</string>
- <string name="permdesc_writeGeolocationPermissions" msgid="1083743234522638747">"به برنامه اجازه می‎دهد تا مجوزهای جغراÙیایی مرورگر را تغییر دهد. برنامه‎های مخرب می‎توانند از آن Ø§Ø³ØªÙØ§Ø¯Ù‡ کنند تا اطلاعات موقعیت مکانی را به سایت‌های وب کتابخانه Ø¨ÙØ±Ø³ØªÙ†Ø¯."</string>
+ <string name="permdesc_writeGeolocationPermissions" msgid="1083743234522638747">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا مجوزهای جغراÙیایی مرورگر را تغییر دهد. برنامه‎های مخرب می‎توانند از آن Ø§Ø³ØªÙØ§Ø¯Ù‡ کنند تا اطلاعات موقعیت مکانی را به سایت‌های وب کتابخانه Ø¨ÙØ±Ø³ØªÙ†Ø¯."</string>
<string name="permlab_packageVerificationAgent" msgid="5568139100645829117">"تأیید بسته‌ها"</string>
<string name="permdesc_packageVerificationAgent" msgid="8437590190990843381">"به برنامه اجازه می‌دهد قابل نصب بودن بسته را تأیید کند."</string>
<string name="permlab_bindPackageVerifier" msgid="4187786793360326654">"اتصال به یک تأیید کننده بسته"</string>
- <string name="permdesc_bindPackageVerifier" msgid="3180741773233862126">"به دارنده اجازه می‎دهد تا تاییدکنندگان بسته را درخواست کند. برای برنامه‎های عادی نیاز نیست."</string>
+ <string name="permdesc_bindPackageVerifier" msgid="3180741773233862126">"â€Ø¨Ù‡ دارنده اجازه می‎دهد تا تاییدکنندگان بسته را درخواست کند. برای برنامه‎های عادی نیاز نیست."</string>
<string name="permlab_serialPort" msgid="546083327654631076">"دسترسی به درگاه‌های سریال"</string>
- <string name="permdesc_serialPort" msgid="2991639985224598193">"به دارنده اجازه می‌دهد با Ø§Ø³ØªÙØ§Ø¯Ù‡ از SerialManager API به درگاه‌های سریال دسترسی داشته باشد."</string>
+ <string name="permdesc_serialPort" msgid="2991639985224598193">"â€Ø¨Ù‡ دارنده اجازه می‌دهد با Ø§Ø³ØªÙØ§Ø¯Ù‡ از SerialManager API به درگاه‌های سریال دسترسی داشته باشد."</string>
<string name="permlab_accessContentProvidersExternally" msgid="5077774297943409285">"دسترسی خارجی به ارائه‌دهندگان محتوا"</string>
<string name="permdesc_accessContentProvidersExternally" msgid="4544346486697853685">"به دارنده اجازه می‌دهد تا از خارج برنامه به ارائه‌دهندگان محتوا دسترسی داشته باشد. هرگز برای برنامه‌های معمولی به آن نیازی نیست."</string>
<string name="permlab_updateLock" msgid="3527558366616680889">"ترغیب به انجام ندادن به‌روزرسانی‌های خودکار دستگاه"</string>
@@ -1095,7 +1102,7 @@
<string name="paste" msgid="5629880836805036433">"جای گذاری"</string>
<string name="replace" msgid="5781686059063148930">"جایگزین شود..."</string>
<string name="delete" msgid="6098684844021697789">"حذÙ"</string>
- <string name="copyUrl" msgid="2538211579596067402">"کپی URL"</string>
+ <string name="copyUrl" msgid="2538211579596067402">"â€Ú©Ù¾ÛŒ URL"</string>
<string name="selectTextMode" msgid="1018691815143165326">"انتخاب متن"</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"انتخاب متن"</string>
<string name="addToDictionary" msgid="4352161534510057874">"Ø§ÙØ²ÙˆØ¯Ù† به ÙØ±Ù‡Ù†Ú¯â€ŒÙ„غت"</string>
@@ -1117,18 +1124,18 @@
<string name="whichApplication" msgid="4533185947064773386">"تکمیل عملکرد با Ø§Ø³ØªÙØ§Ø¯Ù‡ از"</string>
<string name="whichHomeApplication" msgid="4616420172727326782">"انتخاب یک برنامه ØµÙØ­Ù‡ اصلی"</string>
<string name="alwaysUse" msgid="4583018368000610438">"Ø§Ø³ØªÙØ§Ø¯Ù‡ به صورت Ù¾ÛŒØ´â€ŒÙØ±Ø¶ برای این عملکرد."</string>
- <string name="clearDefaultHintMsg" msgid="3252584689512077257">"Ù¾ÛŒØ´â€ŒÙØ±Ø¶ را در تنظیمات سیستم&gt; برنامه‎ها&gt; مورد دانلود شده پاک کنید."</string>
+ <string name="clearDefaultHintMsg" msgid="3252584689512077257">"â€Ù¾ÛŒØ´â€ŒÙرض را در تنظیمات سیستم&gt; برنامه‎ها&gt; مورد دانلود شده پاک کنید."</string>
<string name="chooseActivity" msgid="7486876147751803333">"انتخاب عملکرد"</string>
- <string name="chooseUsbActivity" msgid="6894748416073583509">"انتخاب برنامه برای دستگاه USB"</string>
- <string name="noApplications" msgid="2991814273936504689">"هیچ برنامه‌ای نمی‎تواند این کار را انجام دهد."</string>
+ <string name="chooseUsbActivity" msgid="6894748416073583509">"â€Ø§Ù†ØªØ®Ø§Ø¨ برنامه برای دستگاه USB"</string>
+ <string name="noApplications" msgid="2991814273936504689">"â€Ù‡ÛŒÚ† برنامه‌ای نمی‎تواند این کار را انجام دهد."</string>
<string name="aerr_title" msgid="1905800560317137752"></string>
<string name="aerr_application" msgid="932628488013092776">"Ù…ØªØ£Ø³ÙØ§Ù†Ù‡ØŒ <xliff:g id="APPLICATION">%1$s</xliff:g> متوق٠شده است."</string>
<string name="aerr_process" msgid="4507058997035697579">"Ù…ØªØ£Ø³ÙØ§Ù†Ù‡ØŒ پردازش <xliff:g id="PROCESS">%1$s</xliff:g> متوق٠شده است."</string>
<string name="anr_title" msgid="4351948481459135709"></string>
- <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> پاسخ نمی‎دهد.\n\nآیا می‎خواهید آنرا ببندید؟"</string>
- <string name="anr_activity_process" msgid="5776209883299089767">"ÙØ¹Ø§Ù„یت <xliff:g id="ACTIVITY">%1$s</xliff:g> پاسخ نمی‎دهد.\n\nآیا می‎خواهید آن را ببندید؟"</string>
- <string name="anr_application_process" msgid="8941757607340481057">"<xliff:g id="APPLICATION">%1$s</xliff:g> پاسخ نمی‎دهد. آیا می‎خواهید آن را ببندید؟"</string>
- <string name="anr_process" msgid="6513209874880517125">"روند <xliff:g id="PROCESS">%1$s</xliff:g> پاسخ نمی‎دهد. \n\nآیا می‎خواهید آن را ببندید؟"</string>
+ <string name="anr_activity_application" msgid="1904477189057199066">"â€<xliff:g id="APPLICATION">%2$s</xliff:g> پاسخ نمی‎دهد.\n\nآیا می‎خواهید آنرا ببندید؟"</string>
+ <string name="anr_activity_process" msgid="5776209883299089767">"â€Ùعالیت <xliff:g id="ACTIVITY">%1$s</xliff:g> پاسخ نمی‎دهد.\n\nآیا می‎خواهید آن را ببندید؟"</string>
+ <string name="anr_application_process" msgid="8941757607340481057">"â€<xliff:g id="APPLICATION">%1$s</xliff:g> پاسخ نمی‎دهد. آیا می‎خواهید آن را ببندید؟"</string>
+ <string name="anr_process" msgid="6513209874880517125">"â€Ø±ÙˆÙ†Ø¯ <xliff:g id="PROCESS">%1$s</xliff:g> پاسخ نمی‎دهد. \n\nآیا می‎خواهید آن را ببندید؟"</string>
<string name="force_close" msgid="8346072094521265605">"تأیید"</string>
<string name="report" msgid="4060218260984795706">"گزارش"</string>
<string name="wait" msgid="7147118217226317732">"منتظر بمانید"</string>
@@ -1138,9 +1145,9 @@
<string name="launch_warning_original" msgid="188102023021668683">"<xliff:g id="APP_NAME">%1$s</xliff:g> از ابتدا راه‌اندازی شد."</string>
<string name="screen_compat_mode_scale" msgid="3202955667675944499">"مقیاس"</string>
<string name="screen_compat_mode_show" msgid="4013878876486655892">"همیشه نشان داده شود"</string>
- <string name="screen_compat_mode_hint" msgid="1064524084543304459">"در تنظیمات سیستم &gt;برنامه‎ها &gt; مورد دانلود شده آن را دوباره ÙØ¹Ø§Ù„ کنید."</string>
- <string name="smv_application" msgid="3307209192155442829">"برنامه <xliff:g id="APPLICATION">%1$s</xliff:g> (پردازش <xliff:g id="PROCESS">%2$s</xliff:g>) خط مشی StrictMode اجرایی خود را نقض کرده است."</string>
- <string name="smv_process" msgid="5120397012047462446">"ÙØ±Ø¢ÛŒÙ†Ø¯ <xliff:g id="PROCESS">%1$s</xliff:g> خط مشی StrictMode اجرای خودکار خود را نقض کرده است."</string>
+ <string name="screen_compat_mode_hint" msgid="1064524084543304459">"â€Ø¯Ø± تنظیمات سیستم &gt;برنامه‎ها &gt; مورد دانلود شده آن را دوباره ÙØ¹Ø§Ù„ کنید."</string>
+ <string name="smv_application" msgid="3307209192155442829">"â€Ø¨Ø±Ù†Ø§Ù…Ù‡ <xliff:g id="APPLICATION">%1$s</xliff:g> (پردازش <xliff:g id="PROCESS">%2$s</xliff:g>) خط مشی StrictMode اجرایی خود را نقض کرده است."</string>
+ <string name="smv_process" msgid="5120397012047462446">"â€Ùرآیند <xliff:g id="PROCESS">%1$s</xliff:g> خط مشی StrictMode اجرای خودکار خود را نقض کرده است."</string>
<string name="android_upgrading_title" msgid="1584192285441405746">"â€Android در حال ارتقا است..."</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"در حال بهینه‌سازی برنامهٔ <xliff:g id="NUMBER_0">%1$d</xliff:g> از <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"در حال آغاز برنامه‌ها."</string>
@@ -1174,23 +1181,23 @@
<string name="ringtone_picker_title" msgid="3515143939175119094">"آهنگ‌های زنگ"</string>
<string name="ringtone_unknown" msgid="5477919988701784788">"آهنگ زنگ ناشناس"</string>
<plurals name="wifi_available">
- <item quantity="one" msgid="6654123987418168693">"شبکه Wi-Fi موجود است"</item>
- <item quantity="other" msgid="4192424489168397386">"شبکه‌های Wi-Fi موجود هستند"</item>
+ <item quantity="one" msgid="6654123987418168693">"â€Ø´Ø¨Ú©Ù‡ Wi-Fi موجود است"</item>
+ <item quantity="other" msgid="4192424489168397386">"â€Ø´Ø¨Ú©Ù‡â€ŒÙ‡Ø§ÛŒ Wi-Fi موجود هستند"</item>
</plurals>
<plurals name="wifi_available_detailed">
- <item quantity="one" msgid="1634101450343277345">"شبکه Wi-Fi موجود را باز کنید"</item>
- <item quantity="other" msgid="7915895323644292768">"شبکه‌های Wi-Fi موجود را باز کنید"</item>
+ <item quantity="one" msgid="1634101450343277345">"â€Ø´Ø¨Ú©Ù‡ Wi-Fi موجود را باز کنید"</item>
+ <item quantity="other" msgid="7915895323644292768">"â€Ø´Ø¨Ú©Ù‡â€ŒÙ‡Ø§ÛŒ Wi-Fi موجود را باز کنید"</item>
</plurals>
- <string name="wifi_available_sign_in" msgid="4029489716605255386">"ورود به شبکه Wi-Fi"</string>
+ <string name="wifi_available_sign_in" msgid="4029489716605255386">"â€ÙˆØ±ÙˆØ¯ به شبکه Wi-Fi"</string>
<string name="network_available_sign_in" msgid="8495155593358054676">"ورود به شبکه"</string>
<!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
<skip />
- <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"اتصال به Wi-Fi ممکن نیست"</string>
+ <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"â€Ø§ØªØµØ§Ù„ به Wi-Fi ممکن نیست"</string>
<string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" اتصال اینترنتی ضعیÙÛŒ دارد."</string>
<string name="wifi_p2p_dialog_title" msgid="97611782659324517">"Wi-Fi Direct"</string>
- <string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"Wi-Fi Direct را شروع کنید. این کار نقطه اتصال/سرویس گیرنده Wi-Fi را ØºÛŒØ±ÙØ¹Ø§Ù„ خواهد کرد."</string>
- <string name="wifi_p2p_failed_message" msgid="3763669677935623084">"Wi-Fi Direct شروع نشد."</string>
- <string name="wifi_p2p_enabled_notification_title" msgid="2068321881673734886">"Wi-Fi Direct روشن است"</string>
+ <string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"â€Wi-Fi Direct را شروع کنید. این کار نقطه اتصال/سرویس گیرنده Wi-Fi را ØºÛŒØ±ÙØ¹Ø§Ù„ خواهد کرد."</string>
+ <string name="wifi_p2p_failed_message" msgid="3763669677935623084">"â€Wi-Fi Direct شروع نشد."</string>
+ <string name="wifi_p2p_enabled_notification_title" msgid="2068321881673734886">"â€Wi-Fi Direct روشن است"</string>
<string name="wifi_p2p_enabled_notification_message" msgid="1638949953993894335">"لمس کردن برای تنظیمات"</string>
<string name="accept" msgid="1645267259272829559">"پذیرش"</string>
<string name="decline" msgid="2112225451706137894">"عدم پذیرش"</string>
@@ -1200,20 +1207,20 @@
<string name="wifi_p2p_to_message" msgid="248968974522044099">"به:"</string>
<string name="wifi_p2p_enter_pin_message" msgid="5920929550367828970">"پین لازم را تایپ کنید:"</string>
<string name="wifi_p2p_show_pin_message" msgid="8530563323880921094">"پین:"</string>
- <string name="wifi_p2p_frequency_conflict_message" product="tablet" msgid="8012981257742232475">"در حین اتصال به <xliff:g id="DEVICE_NAME">%1$s</xliff:g> ارتباط این رایانه لوحی با Wi-Fi موقتاً قطع خواهد شد."</string>
- <string name="wifi_p2p_frequency_conflict_message" product="default" msgid="7363907213787469151">"این گوشی به‌طور موقت از Wi-Fi قطع خواهد شد، در حالی که به <xliff:g id="DEVICE_NAME">%1$s</xliff:g> وصل است"</string>
+ <string name="wifi_p2p_frequency_conflict_message" product="tablet" msgid="8012981257742232475">"â€Ø¯Ø± حین اتصال به <xliff:g id="DEVICE_NAME">%1$s</xliff:g> ارتباط این رایانه لوحی با Wi-Fi موقتاً قطع خواهد شد."</string>
+ <string name="wifi_p2p_frequency_conflict_message" product="default" msgid="7363907213787469151">"â€Ø§ÛŒÙ† گوشی به‌طور موقت از Wi-Fi قطع خواهد شد، در حالی Ú©Ù‡ به <xliff:g id="DEVICE_NAME">%1$s</xliff:g> وصل است"</string>
<string name="select_character" msgid="3365550120617701745">"درج نویسه"</string>
<string name="sms_control_title" msgid="7296612781128917719">"ارسال پیامک ها"</string>
- <string name="sms_control_message" msgid="3867899169651496433">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; در حال ارسال تعداد زیادی پیامک است. آیا اجازه می‌دهید این برنامه همچنان پیامک ارسال کند؟"</string>
+ <string name="sms_control_message" msgid="3867899169651496433">"â€&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; در حال ارسال تعداد زیادی پیامک است. آیا اجازه می‌دهید این برنامه همچنان پیامک ارسال کند؟"</string>
<string name="sms_control_yes" msgid="3663725993855816807">"اجازه دادن"</string>
<string name="sms_control_no" msgid="625438561395534982">"ردکردن"</string>
- <string name="sms_short_code_confirm_message" msgid="1645436466285310855">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; مایل است پیامی به &lt;b&gt;<xliff:g id="DEST_ADDRESS">%2$s</xliff:g>&lt;/b&gt; ارسال کند."</string>
+ <string name="sms_short_code_confirm_message" msgid="1645436466285310855">"â€&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; مایل است پیامی به &lt;b&gt;<xliff:g id="DEST_ADDRESS">%2$s</xliff:g>&lt;/b&gt; ارسال کند."</string>
<string name="sms_short_code_details" msgid="3492025719868078457">"این کار "<font fgcolor="#ffffb060">"می‌تواند منجر به شارژ"</font>" حساب تلÙÙ† همراه شما شود."</string>
<string name="sms_premium_short_code_details" msgid="5523826349105123687"><font fgcolor="#ffffb060">"این کار حساب تلÙÙ† همراه شما را شارژ خواهد کرد."</font></string>
<string name="sms_short_code_confirm_allow" msgid="4458878637111023413">"ارسال"</string>
<string name="sms_short_code_confirm_deny" msgid="2927389840209170706">"لغو"</string>
<string name="sms_short_code_remember_choice" msgid="5289538592272218136">"این انتخاب را به خاطر بسپار"</string>
- <string name="sms_short_code_remember_undo_instruction" msgid="4960944133052287484">"می‌توانید بعداً آن را در تنظیمات &gt; برنامه‌ها تغییر دهید"</string>
+ <string name="sms_short_code_remember_undo_instruction" msgid="4960944133052287484">"â€Ù…ی‌توانید بعداً آن را در تنظیمات &gt; برنامه‌ها تغییر دهید"</string>
<string name="sms_short_code_confirm_always_allow" msgid="3241181154869493368">"همیشه مجاز"</string>
<string name="sms_short_code_confirm_never_allow" msgid="446992765774269673">"همیشه غیرمجاز"</string>
<string name="sim_removed_title" msgid="6227712319223226185">"سیم کارت برداشته شد"</string>
@@ -1230,38 +1237,38 @@
<string name="perms_description_app" msgid="5139836143293299417">"ارائه شده توسط <xliff:g id="APP_NAME">%1$s</xliff:g> ."</string>
<string name="no_permissions" msgid="7283357728219338112">"مجوزی لازم نیست"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"ممکن است برای شما هزینه داشته باشد"</string>
- <string name="usb_storage_activity_title" msgid="4465055157209648641">"Ø­Ø§ÙØ¸Ù‡ انبوه USB"</string>
- <string name="usb_storage_title" msgid="5901459041398751495">"USB متصل شد"</string>
- <string name="usb_storage_message" product="nosdcard" msgid="3308538094316477839">"شما از طریق USB به رایانهٔ خود متصل شده‎اید. اگر می‎خواهید ÙØ§ÛŒÙ„‎ها را بین رایانهٔ خود Ùˆ Ø­Ø§ÙØ¸Ù‡Ù” USB در Android Ú©Ù¾ÛŒ کنید، دکمه زیر را لمس کنید."</string>
- <string name="usb_storage_message" product="default" msgid="805351000446037811">"شما از طریق USB به رایانهٔ خود متصل شده‎اید. اگر می‎خواهید ÙØ§ÛŒÙ„‎ها را بین رایانهٔ خود Ùˆ کارت SD در Android Ú©Ù¾ÛŒ کنید، دکمه زیر را لمس کنید."</string>
- <string name="usb_storage_button_mount" msgid="1052259930369508235">"روشن کردن دستگاه ذخیره‌سازی USB"</string>
- <string name="usb_storage_error_message" product="nosdcard" msgid="3017045217365540658">"هنگام Ø§Ø³ØªÙØ§Ø¯Ù‡ از Ø­Ø§ÙØ¸Ù‡Ù” USB برای Ø­Ø§ÙØ¸Ù‡ انبوه USB مشکلی بوجود آمد."</string>
- <string name="usb_storage_error_message" product="default" msgid="2876018512716970313">"هنگام Ø§Ø³ØªÙØ§Ø¯Ù‡ از کارت SD برای Ø­Ø§ÙØ¸Ù‡ ذخیره انبوه USB مشکلی بوجود آمد."</string>
- <string name="usb_storage_notification_title" msgid="8175892554757216525">"USB متصل شد"</string>
+ <string name="usb_storage_activity_title" msgid="4465055157209648641">"â€Ø­Ø§Ùظه انبوه USB"</string>
+ <string name="usb_storage_title" msgid="5901459041398751495">"â€USB متصل شد"</string>
+ <string name="usb_storage_message" product="nosdcard" msgid="3308538094316477839">"â€Ø´Ù…ا از طریق USB به رایانهٔ خود متصل شده‎اید. اگر می‎خواهید ÙØ§ÛŒÙ„‎ها را بین رایانهٔ خود Ùˆ Ø­Ø§ÙØ¸Ù‡Ù” USB در Android Ú©Ù¾ÛŒ کنید، دکمه زیر را لمس کنید."</string>
+ <string name="usb_storage_message" product="default" msgid="805351000446037811">"â€Ø´Ù…ا از طریق USB به رایانهٔ خود متصل شده‎اید. اگر می‎خواهید ÙØ§ÛŒÙ„‎ها را بین رایانهٔ خود Ùˆ کارت SD در Android Ú©Ù¾ÛŒ کنید، دکمه زیر را لمس کنید."</string>
+ <string name="usb_storage_button_mount" msgid="1052259930369508235">"â€Ø±ÙˆØ´Ù† کردن دستگاه ذخیره‌سازی USB"</string>
+ <string name="usb_storage_error_message" product="nosdcard" msgid="3017045217365540658">"â€Ù‡Ù†Ú¯Ø§Ù… Ø§Ø³ØªÙØ§Ø¯Ù‡ از Ø­Ø§ÙØ¸Ù‡Ù” USB برای Ø­Ø§ÙØ¸Ù‡ انبوه USB مشکلی بوجود آمد."</string>
+ <string name="usb_storage_error_message" product="default" msgid="2876018512716970313">"â€Ù‡Ù†Ú¯Ø§Ù… Ø§Ø³ØªÙØ§Ø¯Ù‡ از کارت SD برای Ø­Ø§ÙØ¸Ù‡ ذخیره انبوه USB مشکلی بوجود آمد."</string>
+ <string name="usb_storage_notification_title" msgid="8175892554757216525">"â€USB متصل شد"</string>
<string name="usb_storage_notification_message" msgid="939822783828183763">"برای Ú©Ù¾ÛŒ کردن ÙØ§ÛŒÙ„‌ها از/به رایانهٔ خود لمس کنید."</string>
- <string name="usb_storage_stop_notification_title" msgid="2336058396663516017">"خاموش کردن دستگاه ذخیره‌سازی USB"</string>
- <string name="usb_storage_stop_notification_message" msgid="1656852098555623822">"برای ØºÛŒØ±ÙØ¹Ø§Ù„ کردن Ø­Ø§ÙØ¸Ù‡Ù” USBØŒ لمس کنید."</string>
- <string name="usb_storage_stop_title" msgid="660129851708775853">"دستگاه ذخیره‌سازی USB در حال Ø§Ø³ØªÙØ§Ø¯Ù‡ است"</string>
- <string name="usb_storage_stop_message" product="nosdcard" msgid="4264025280777219521">"قبل از ØºÛŒØ±ÙØ¹Ø§Ù„ کردن Ø­Ø§ÙØ¸Ù‡Ù” USBØŒ Ø­Ø§ÙØ¸Ù‡Ù” USB مربوط به Android را در رایانهٔ خود لغو نصب کنید (\"خارج کنید\")."</string>
- <string name="usb_storage_stop_message" product="default" msgid="8043969782460613114">"قبل از ØºÛŒØ±ÙØ¹Ø§Ù„ کردن Ø­Ø§ÙØ¸Ù‡Ù” USBØŒ کارت SD مربوط به Android را در رایانه لغو نصب کنید (\"خارج کنید\")."</string>
- <string name="usb_storage_stop_button_mount" msgid="7060218034900696029">"خاموش کردن دستگاه ذخیره‌سازی USB"</string>
- <string name="usb_storage_stop_error_message" msgid="1970374898263063836">"هنگام ØºÛŒØ±ÙØ¹Ø§Ù„ کردن Ø­Ø§ÙØ¸Ù‡Ù” USB مشکلی بوجود آمد. بررسی کنید میزبان USB را لغو نصب کرده باشید، سپس دوباره امتحان کنید."</string>
- <string name="dlg_confirm_kill_storage_users_title" msgid="963039033470478697">"روشن کردن دستگاه ذخیره‌سازی USB"</string>
- <string name="dlg_confirm_kill_storage_users_text" msgid="5100428757107469454">"در صورت ÙØ¹Ø§Ù„ کردن Ø­Ø§ÙØ¸Ù‡Ù” USBØŒ برخی از برنامه‎هایی Ú©Ù‡ از آن‌ها Ø§Ø³ØªÙØ§Ø¯Ù‡ می‎کنید متوق٠می‎شوند Ùˆ تا زمانی Ú©Ù‡ Ø­Ø§ÙØ¸Ù‡Ù” USB را ØºÛŒØ±ÙØ¹Ø§Ù„ نکنید امکان Ø§Ø³ØªÙØ§Ø¯Ù‡ از آن‌ها وجود نخواهد داشت."</string>
- <string name="dlg_error_title" msgid="7323658469626514207">"راه‌اندازی USB ناموÙÙ‚ بود."</string>
+ <string name="usb_storage_stop_notification_title" msgid="2336058396663516017">"â€Ø®Ø§Ù…وش کردن دستگاه ذخیره‌سازی USB"</string>
+ <string name="usb_storage_stop_notification_message" msgid="1656852098555623822">"â€Ø¨Ø±Ø§ÛŒ ØºÛŒØ±ÙØ¹Ø§Ù„ کردن Ø­Ø§ÙØ¸Ù‡Ù” USBØŒ لمس کنید."</string>
+ <string name="usb_storage_stop_title" msgid="660129851708775853">"â€Ø¯Ø³ØªÚ¯Ø§Ù‡ ذخیره‌سازی USB در حال Ø§Ø³ØªÙØ§Ø¯Ù‡ است"</string>
+ <string name="usb_storage_stop_message" product="nosdcard" msgid="4264025280777219521">"â€Ù‚بل از ØºÛŒØ±ÙØ¹Ø§Ù„ کردن Ø­Ø§ÙØ¸Ù‡Ù” USBØŒ Ø­Ø§ÙØ¸Ù‡Ù” USB مربوط به Android را در رایانهٔ خود لغو نصب کنید (\"خارج کنید\")."</string>
+ <string name="usb_storage_stop_message" product="default" msgid="8043969782460613114">"â€Ù‚بل از ØºÛŒØ±ÙØ¹Ø§Ù„ کردن Ø­Ø§ÙØ¸Ù‡Ù” USBØŒ کارت SD مربوط به Android را در رایانه لغو نصب کنید (\"خارج کنید\")."</string>
+ <string name="usb_storage_stop_button_mount" msgid="7060218034900696029">"â€Ø®Ø§Ù…وش کردن دستگاه ذخیره‌سازی USB"</string>
+ <string name="usb_storage_stop_error_message" msgid="1970374898263063836">"â€Ù‡Ù†Ú¯Ø§Ù… ØºÛŒØ±ÙØ¹Ø§Ù„ کردن Ø­Ø§ÙØ¸Ù‡Ù” USB مشکلی بوجود آمد. بررسی کنید میزبان USB را لغو نصب کرده باشید، سپس دوباره امتحان کنید."</string>
+ <string name="dlg_confirm_kill_storage_users_title" msgid="963039033470478697">"â€Ø±ÙˆØ´Ù† کردن دستگاه ذخیره‌سازی USB"</string>
+ <string name="dlg_confirm_kill_storage_users_text" msgid="5100428757107469454">"â€Ø¯Ø± صورت ÙØ¹Ø§Ù„ کردن Ø­Ø§ÙØ¸Ù‡Ù” USBØŒ برخی از برنامه‎هایی Ú©Ù‡ از آن‌ها Ø§Ø³ØªÙØ§Ø¯Ù‡ می‎کنید متوق٠می‎شوند Ùˆ تا زمانی Ú©Ù‡ Ø­Ø§ÙØ¸Ù‡Ù” USB را ØºÛŒØ±ÙØ¹Ø§Ù„ نکنید امکان Ø§Ø³ØªÙØ§Ø¯Ù‡ از آن‌ها وجود نخواهد داشت."</string>
+ <string name="dlg_error_title" msgid="7323658469626514207">"â€Ø±Ø§Ù‡â€ŒØ§Ù†Ø¯Ø§Ø²ÛŒ USB ناموÙÙ‚ بود."</string>
<string name="dlg_ok" msgid="7376953167039865701">"تأیید"</string>
<string name="usb_mtp_notification_title" msgid="3699913097391550394">"متصل شده به‌عنوان دستگاه رسانه‌ای"</string>
<string name="usb_ptp_notification_title" msgid="1960817192216064833">"متصل شده به‌عنوان دوربین"</string>
<string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"متصل شده به‌عنوان نصب کننده"</string>
- <string name="usb_accessory_notification_title" msgid="7848236974087653666">"به یک وسیله جانبی USB وصل شده است"</string>
- <string name="usb_notification_message" msgid="2290859399983720271">"برای سایر گزینه‌های USB لمس کنید."</string>
- <string name="extmedia_format_title" product="nosdcard" msgid="9020092196061007262">"Ø­Ø§ÙØ¸Ù‡Ù” USB ÙØ±Ù…ت شود؟"</string>
- <string name="extmedia_format_title" product="default" msgid="3648415921526526069">"کارت SD ÙØ±Ù…ت شود؟"</string>
- <string name="extmedia_format_message" product="nosdcard" msgid="3934016853425761078">"همه ÙØ§ÛŒÙ„‌های ذخیره شده در Ø­Ø§ÙØ¸Ù‡Ù” USB پاک خواهد شد. این عمل را نمی‎توان برگرداند!"</string>
- <string name="extmedia_format_message" product="default" msgid="14131895027543830">"تمام اطلاعات روی کارت شما از بین می‎رود."</string>
+ <string name="usb_accessory_notification_title" msgid="7848236974087653666">"â€Ø¨Ù‡ یک وسیله جانبی USB وصل شده است"</string>
+ <string name="usb_notification_message" msgid="2290859399983720271">"â€Ø¨Ø±Ø§ÛŒ سایر گزینه‌های USB لمس کنید."</string>
+ <string name="extmedia_format_title" product="nosdcard" msgid="9020092196061007262">"â€Ø­Ø§Ùظهٔ USB ÙØ±Ù…ت شود؟"</string>
+ <string name="extmedia_format_title" product="default" msgid="3648415921526526069">"â€Ú©Ø§Ø±Øª SD ÙØ±Ù…ت شود؟"</string>
+ <string name="extmedia_format_message" product="nosdcard" msgid="3934016853425761078">"â€Ù‡Ù…Ù‡ ÙØ§ÛŒÙ„‌های ذخیره شده در Ø­Ø§ÙØ¸Ù‡Ù” USB پاک خواهد شد. این عمل را نمی‎توان برگرداند!"</string>
+ <string name="extmedia_format_message" product="default" msgid="14131895027543830">"â€ØªÙ…ام اطلاعات روی کارت شما از بین می‎رود."</string>
<string name="extmedia_format_button_format" msgid="4131064560127478695">"قالب"</string>
- <string name="adb_active_notification_title" msgid="6729044778949189918">"اتصال Ø±ÙØ¹ عیب USB"</string>
- <string name="adb_active_notification_message" msgid="1016654627626476142">"برای ØºÛŒØ±ÙØ¹Ø§Ù„ کردن اشکال زدایی USB لمس کنید."</string>
+ <string name="adb_active_notification_title" msgid="6729044778949189918">"â€Ø§ØªØµØ§Ù„ Ø±ÙØ¹ عیب USB"</string>
+ <string name="adb_active_notification_message" msgid="1016654627626476142">"â€Ø¨Ø±Ø§ÛŒ ØºÛŒØ±ÙØ¹Ø§Ù„ کردن اشکال زدایی USB لمس کنید."</string>
<string name="select_input_method" msgid="4653387336791222978">"انتخاب روش ورودی"</string>
<string name="configure_input_methods" msgid="9091652157722495116">"تنظیم روش‌های ورودی"</string>
<string name="use_physical_keyboard" msgid="6203112478095117625">"ØµÙØ­Ù‡â€ŒÚ©Ù„ید Ùیزیکی"</string>
@@ -1271,34 +1278,34 @@
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"داوطلبین"</u></string>
- <string name="ext_media_checking_notification_title" product="nosdcard" msgid="3449816005351468560">"آماده سازی Ø­Ø§ÙØ¸Ù‡Ù” USB"</string>
- <string name="ext_media_checking_notification_title" product="default" msgid="5457603418970994050">"آماده کردن کارت SD"</string>
+ <string name="ext_media_checking_notification_title" product="nosdcard" msgid="3449816005351468560">"â€Ø¢Ù…اده سازی Ø­Ø§ÙØ¸Ù‡Ù” USB"</string>
+ <string name="ext_media_checking_notification_title" product="default" msgid="5457603418970994050">"â€Ø¢Ù…اده کردن کارت SD"</string>
<string name="ext_media_checking_notification_message" msgid="8287319882926737053">"بررسی خطاها."</string>
- <string name="ext_media_nofs_notification_title" product="nosdcard" msgid="7788040745686229307">"Ø­Ø§ÙØ¸Ù‡Ù” USB خالی"</string>
- <string name="ext_media_nofs_notification_title" product="default" msgid="780477838241212997">"کارت SD خالی"</string>
- <string name="ext_media_nofs_notification_message" product="nosdcard" msgid="7840121067427269500">"Ø­Ø§ÙØ¸Ù‡Ù” USB خالی است یا دارای سیستم ÙØ§ÛŒÙ„ پشتیبانی نشده است."</string>
- <string name="ext_media_nofs_notification_message" product="default" msgid="8641065641786923604">"کارت SD خالی است یا دارای سیستم ÙØ§ÛŒÙ„ پشتیبانی نشده است."</string>
- <string name="ext_media_unmountable_notification_title" product="nosdcard" msgid="2090046769532713563">"Ø­Ø§ÙØ¸Ù‡Ù” USB خراب شده"</string>
- <string name="ext_media_unmountable_notification_title" product="default" msgid="6410723906019100189">"کارت SD آسیب دیده"</string>
- <string name="ext_media_unmountable_notification_message" product="nosdcard" msgid="1795917578395333280">"Ø­Ø§ÙØ¸Ù‡Ù” USB خراب است. سعی کنید آنرا دوباره ÙØ±Ù…ت کنید."</string>
- <string name="ext_media_unmountable_notification_message" product="default" msgid="1753898567525568253">"کارت SD خراب است. سعی کنید آنرا دوباره ÙØ±Ù…ت کنید."</string>
- <string name="ext_media_badremoval_notification_title" product="nosdcard" msgid="1661683031330951073">"Ø­Ø§ÙØ¸Ù‡Ù” USB به صورت غیرمنتظره جدا شد"</string>
- <string name="ext_media_badremoval_notification_title" product="default" msgid="6872152882604407837">"کارت SD به صورت غیرمنتظره‌ای جدا شد"</string>
- <string name="ext_media_badremoval_notification_message" product="nosdcard" msgid="4329848819865594241">"اتصال Ø­Ø§ÙØ¸Ù‡Ù” USB را قبل از بیرون آوردن قطع کنید تا سبب از بین Ø±ÙØªÙ† داده‌ها نشود."</string>
- <string name="ext_media_badremoval_notification_message" product="default" msgid="7260183293747448241">"کارت SD را قبل از بیرون آوردن جدا کنید تا سبب از بین Ø±ÙØªÙ† داده‌ها نشود."</string>
- <string name="ext_media_safe_unmount_notification_title" product="nosdcard" msgid="3967973893270360230">"Ø­Ø§ÙØ¸Ù‡Ù” USB را می‌توانید با ایمنی جدا کنید"</string>
- <string name="ext_media_safe_unmount_notification_title" product="default" msgid="6729801130790616200">"کارت SD را می‌توان با امنیت کامل جدا کرد"</string>
- <string name="ext_media_safe_unmount_notification_message" product="nosdcard" msgid="6142195361606493530">"شما می‌توانید Ø­Ø§ÙØ¸Ù‡Ù” USB را با اطمینان جدا کنید."</string>
- <string name="ext_media_safe_unmount_notification_message" product="default" msgid="568841278138377604">"کارت SD را می‌توانید با امنیت کامل خارج کنید."</string>
- <string name="ext_media_nomedia_notification_title" product="nosdcard" msgid="4486377230140227651">"جدا کردن Ø­Ø§ÙØ¸Ù‡Ù” USB"</string>
- <string name="ext_media_nomedia_notification_title" product="default" msgid="8902518030404381318">"کارت SD حذ٠شده"</string>
- <string name="ext_media_nomedia_notification_message" product="nosdcard" msgid="6921126162580574143">"Ø­Ø§ÙØ¸Ù‡Ù” USB جدا شد. یک رسانه جدید متصل کنید."</string>
- <string name="ext_media_nomedia_notification_message" product="default" msgid="3870120652983659641">"کارت SD جدا شد. یک کارت جدید وارد کنید."</string>
+ <string name="ext_media_nofs_notification_title" product="nosdcard" msgid="7788040745686229307">"â€Ø­Ø§Ùظهٔ USB خالی"</string>
+ <string name="ext_media_nofs_notification_title" product="default" msgid="780477838241212997">"â€Ú©Ø§Ø±Øª SD خالی"</string>
+ <string name="ext_media_nofs_notification_message" product="nosdcard" msgid="7840121067427269500">"â€Ø­Ø§Ùظهٔ USB خالی است یا دارای سیستم ÙØ§ÛŒÙ„ پشتیبانی نشده است."</string>
+ <string name="ext_media_nofs_notification_message" product="default" msgid="8641065641786923604">"â€Ú©Ø§Ø±Øª SD خالی است یا دارای سیستم ÙØ§ÛŒÙ„ پشتیبانی نشده است."</string>
+ <string name="ext_media_unmountable_notification_title" product="nosdcard" msgid="2090046769532713563">"â€Ø­Ø§Ùظهٔ USB خراب شده"</string>
+ <string name="ext_media_unmountable_notification_title" product="default" msgid="6410723906019100189">"â€Ú©Ø§Ø±Øª SD آسیب دیده"</string>
+ <string name="ext_media_unmountable_notification_message" product="nosdcard" msgid="1795917578395333280">"â€Ø­Ø§Ùظهٔ USB خراب است. سعی کنید آنرا دوباره ÙØ±Ù…ت کنید."</string>
+ <string name="ext_media_unmountable_notification_message" product="default" msgid="1753898567525568253">"â€Ú©Ø§Ø±Øª SD خراب است. سعی کنید آنرا دوباره ÙØ±Ù…ت کنید."</string>
+ <string name="ext_media_badremoval_notification_title" product="nosdcard" msgid="1661683031330951073">"â€Ø­Ø§Ùظهٔ USB به صورت غیرمنتظره جدا شد"</string>
+ <string name="ext_media_badremoval_notification_title" product="default" msgid="6872152882604407837">"â€Ú©Ø§Ø±Øª SD به صورت غیرمنتظره‌ای جدا شد"</string>
+ <string name="ext_media_badremoval_notification_message" product="nosdcard" msgid="4329848819865594241">"â€Ø§ØªØµØ§Ù„ Ø­Ø§ÙØ¸Ù‡Ù” USB را قبل از بیرون آوردن قطع کنید تا سبب از بین Ø±ÙØªÙ† داده‌ها نشود."</string>
+ <string name="ext_media_badremoval_notification_message" product="default" msgid="7260183293747448241">"â€Ú©Ø§Ø±Øª SD را قبل از بیرون آوردن جدا کنید تا سبب از بین Ø±ÙØªÙ† داده‌ها نشود."</string>
+ <string name="ext_media_safe_unmount_notification_title" product="nosdcard" msgid="3967973893270360230">"â€Ø­Ø§Ùظهٔ USB را می‌توانید با ایمنی جدا کنید"</string>
+ <string name="ext_media_safe_unmount_notification_title" product="default" msgid="6729801130790616200">"â€Ú©Ø§Ø±Øª SD را می‌توان با امنیت کامل جدا کرد"</string>
+ <string name="ext_media_safe_unmount_notification_message" product="nosdcard" msgid="6142195361606493530">"â€Ø´Ù…ا می‌توانید Ø­Ø§ÙØ¸Ù‡Ù” USB را با اطمینان جدا کنید."</string>
+ <string name="ext_media_safe_unmount_notification_message" product="default" msgid="568841278138377604">"â€Ú©Ø§Ø±Øª SD را می‌توانید با امنیت کامل خارج کنید."</string>
+ <string name="ext_media_nomedia_notification_title" product="nosdcard" msgid="4486377230140227651">"â€Ø¬Ø¯Ø§ کردن Ø­Ø§ÙØ¸Ù‡Ù” USB"</string>
+ <string name="ext_media_nomedia_notification_title" product="default" msgid="8902518030404381318">"â€Ú©Ø§Ø±Øª SD حذ٠شده"</string>
+ <string name="ext_media_nomedia_notification_message" product="nosdcard" msgid="6921126162580574143">"â€Ø­Ø§Ùظهٔ USB جدا شد. یک رسانه جدید متصل کنید."</string>
+ <string name="ext_media_nomedia_notification_message" product="default" msgid="3870120652983659641">"â€Ú©Ø§Ø±Øª SD جدا شد. یک کارت جدید وارد کنید."</string>
<string name="activity_list_empty" msgid="1675388330786841066">"ÙØ¹Ø§Ù„یتی مطابق با این مورد ÛŒØ§ÙØª نشد."</string>
<string name="permlab_pkgUsageStats" msgid="8787352074326748892">"به‌روزرسانی آمار مربوط به Ø§Ø³ØªÙØ§Ø¯Ù‡ مؤلÙÙ‡"</string>
- <string name="permdesc_pkgUsageStats" msgid="1106612424254277630">"به برنامه اجازه می‎دهد آمار جمع‎آوری شده کاربرد قطعه را تغییر دهد. برای Ø§Ø³ØªÙØ§Ø¯Ù‡ برنامه‎های عادی نیست."</string>
+ <string name="permdesc_pkgUsageStats" msgid="1106612424254277630">"â€Ø¨Ù‡ برنامه اجازه می‎دهد آمار جمع‎آوری شده کاربرد قطعه را تغییر دهد. برای Ø§Ø³ØªÙØ§Ø¯Ù‡ برنامه‎های عادی نیست."</string>
<string name="permlab_copyProtectedData" msgid="4341036311211406692">"کپی کردن محتوا"</string>
- <string name="permdesc_copyProtectedData" msgid="4390697124288317831">"به برنامه اجازه می‎دهد تا سرویس Ù¾ÛŒØ´â€ŒÙØ±Ø¶ را ÙØ±Ø§Ø®ÙˆØ§Ù†ÛŒ کند Ùˆ محتوا را Ú©Ù¾ÛŒ کند. برای Ø§Ø³ØªÙØ§Ø¯Ù‡ برنامه‎های عادی مورد نیاز نیست."</string>
+ <string name="permdesc_copyProtectedData" msgid="4390697124288317831">"â€Ø¨Ù‡ برنامه اجازه می‎دهد تا سرویس Ù¾ÛŒØ´â€ŒÙØ±Ø¶ را ÙØ±Ø§Ø®ÙˆØ§Ù†ÛŒ کند Ùˆ محتوا را Ú©Ù¾ÛŒ کند. برای Ø§Ø³ØªÙØ§Ø¯Ù‡ برنامه‎های عادی مورد نیاز نیست."</string>
<string name="permlab_route_media_output" msgid="1642024455750414694">"تعیین مسیر خروجی رسانه"</string>
<string name="permdesc_route_media_output" msgid="4932818749547244346">"به یک برنامه اجازه می‌دهد خروجی رسانه را به دستگاه‌های خارجی دیگر تعیین مسیر کند."</string>
<string name="permlab_access_keyguard_secure_storage" msgid="7565552237977815047">"دسترسی به ÙØ¶Ø§ÛŒ ذخیره‌سازی ایمن Ù…Ø­Ø§ÙØ¸ کلید"</string>
@@ -1329,13 +1336,13 @@
<string name="wallpaper_binding_label" msgid="1240087844304687662">"تصویر زمینه"</string>
<string name="chooser_wallpaper" msgid="7873476199295190279">"تغییر تصویر زمینه"</string>
<string name="notification_listener_binding_label" msgid="2014162835481906429">"شنونده اعلان"</string>
- <string name="vpn_title" msgid="19615213552042827">"VPN ÙØ¹Ø§Ù„ شد"</string>
- <string name="vpn_title_long" msgid="6400714798049252294">"VPN توسط <xliff:g id="APP">%s</xliff:g> ÙØ¹Ø§Ù„ شده است"</string>
+ <string name="vpn_title" msgid="19615213552042827">"â€VPN ÙØ¹Ø§Ù„ شد"</string>
+ <string name="vpn_title_long" msgid="6400714798049252294">"â€VPN توسط <xliff:g id="APP">%s</xliff:g> ÙØ¹Ø§Ù„ شده است"</string>
<string name="vpn_text" msgid="3011306607126450322">"برای مدیریت شبکه لمس کنید."</string>
<string name="vpn_text_long" msgid="6407351006249174473">"به <xliff:g id="SESSION">%s</xliff:g> وصل شد. برای مدیریت شبکه لمس کنید."</string>
- <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"در حال اتصال VPN همیشه ÙØ¹Ø§Ù„…"</string>
- <string name="vpn_lockdown_connected" msgid="8202679674819213931">"VPN همیشه ÙØ¹Ø§Ù„ متصل شد"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"خطای VPN همیشه ÙØ¹Ø§Ù„"</string>
+ <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"â€Ø¯Ø± حال اتصال VPN همیشه ÙØ¹Ø§Ù„…"</string>
+ <string name="vpn_lockdown_connected" msgid="8202679674819213931">"â€VPN همیشه ÙØ¹Ø§Ù„ متصل شد"</string>
+ <string name="vpn_lockdown_error" msgid="6009249814034708175">"â€Ø®Ø·Ø§ÛŒ VPN همیشه ÙØ¹Ø§Ù„"</string>
<string name="vpn_lockdown_config" msgid="6415899150671537970">"برای پیکربندی لمس کنید"</string>
<string name="upload_file" msgid="2897957172366730416">"انتخاب ÙØ§ÛŒÙ„"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"هیچ ÙØ§ÛŒÙ„ÛŒ انتخاب نشد"</string>
@@ -1359,18 +1366,18 @@
<item quantity="other" msgid="4641872797067609177">"<xliff:g id="INDEX">%d</xliff:g> از <xliff:g id="TOTAL">%d</xliff:g>"</item>
</plurals>
<string name="action_mode_done" msgid="7217581640461922289">"انجام شد"</string>
- <string name="progress_unmounting" product="nosdcard" msgid="3923810448507612746">"در حال لغو نصب Ø­Ø§ÙØ¸Ù‡Ù” USB..."</string>
- <string name="progress_unmounting" product="default" msgid="1327894998409537190">"در حال لغو نصب کارت SD..."</string>
- <string name="progress_erasing" product="nosdcard" msgid="4521573321524340058">"در حال پاک کردن Ø­Ø§ÙØ¸Ù‡Ù” USB..."</string>
- <string name="progress_erasing" product="default" msgid="6596988875507043042">"در حال پاک کردن کارت SD..."</string>
- <string name="format_error" product="nosdcard" msgid="6299769563624776948">"پاک کردن محل ذخیره USB ممکن نیست."</string>
- <string name="format_error" product="default" msgid="7315248696644510935">"پاک کردن کارت SD ممکن نیست."</string>
- <string name="media_bad_removal" msgid="7960864061016603281">"کارت SD قبل از قطع اتصال از دستگاه خارج شد."</string>
- <string name="media_checking" product="nosdcard" msgid="418188720009569693">"Ø­Ø§ÙØ¸Ù‡Ù” USB اکنون در حال بررسی شدن است."</string>
- <string name="media_checking" product="default" msgid="7334762503904827481">"کارت SD در حال حاضر در حال بررسی است."</string>
- <string name="media_removed" msgid="7001526905057952097">"کارت SD حذ٠شده است."</string>
+ <string name="progress_unmounting" product="nosdcard" msgid="3923810448507612746">"â€Ø¯Ø± حال لغو نصب Ø­Ø§ÙØ¸Ù‡Ù” USB..."</string>
+ <string name="progress_unmounting" product="default" msgid="1327894998409537190">"â€Ø¯Ø± حال لغو نصب کارت SD..."</string>
+ <string name="progress_erasing" product="nosdcard" msgid="4521573321524340058">"â€Ø¯Ø± حال پاک کردن Ø­Ø§ÙØ¸Ù‡Ù” USB..."</string>
+ <string name="progress_erasing" product="default" msgid="6596988875507043042">"â€Ø¯Ø± حال پاک کردن کارت SD..."</string>
+ <string name="format_error" product="nosdcard" msgid="6299769563624776948">"â€Ù¾Ø§Ú© کردن محل ذخیره USB ممکن نیست."</string>
+ <string name="format_error" product="default" msgid="7315248696644510935">"â€Ù¾Ø§Ú© کردن کارت SD ممکن نیست."</string>
+ <string name="media_bad_removal" msgid="7960864061016603281">"â€Ú©Ø§Ø±Øª SD قبل از قطع اتصال از دستگاه خارج شد."</string>
+ <string name="media_checking" product="nosdcard" msgid="418188720009569693">"â€Ø­Ø§Ùظهٔ USB اکنون در حال بررسی شدن است."</string>
+ <string name="media_checking" product="default" msgid="7334762503904827481">"â€Ú©Ø§Ø±Øª SD در حال حاضر در حال بررسی است."</string>
+ <string name="media_removed" msgid="7001526905057952097">"â€Ú©Ø§Ø±Øª SD حذ٠شده است."</string>
<string name="media_shared" product="nosdcard" msgid="5830814349250834225">"Ø­Ø§ÙØ¸Ù‡ در حال حاضر توسط رایانه دیگری Ø§Ø³ØªÙØ§Ø¯Ù‡ می‌شود."</string>
- <string name="media_shared" product="default" msgid="5706130568133540435">"کارت SD در حال حاضر توسط یک رایانه در حال Ø§Ø³ØªÙØ§Ø¯Ù‡ است."</string>
+ <string name="media_shared" product="default" msgid="5706130568133540435">"â€Ú©Ø§Ø±Øª SD در حال حاضر توسط یک رایانه در حال Ø§Ø³ØªÙØ§Ø¯Ù‡ است."</string>
<string name="media_unknown_state" msgid="729192782197290385">"رسانه خارجی در حالت ناشناس است."</string>
<string name="share" msgid="1778686618230011964">"اشتراک‌گذاری"</string>
<string name="find" msgid="4808270900322985960">"ÛŒØ§ÙØªÙ†"</string>
@@ -1383,7 +1390,7 @@
<string name="gpsVerifYes" msgid="2346566072867213563">"بله"</string>
<string name="gpsVerifNo" msgid="1146564937346454865">"خیر"</string>
<string name="sync_too_many_deletes" msgid="5296321850662746890">"از حد مجاز Ø­Ø°Ù ÙØ±Ø§ØªØ± Ø±ÙØª"</string>
- <string name="sync_too_many_deletes_desc" msgid="496551671008694245">"<xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> مورد حذ٠شده برای <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>، حساب <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g> وجود دارد. می‎خواهید چه کاری انجام دهید؟"</string>
+ <string name="sync_too_many_deletes_desc" msgid="496551671008694245">"â€<xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> مورد حذ٠شده برای <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>ØŒ حساب <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g> وجود دارد. می‎خواهید Ú†Ù‡ کاری انجام دهید؟"</string>
<string name="sync_really_delete" msgid="2572600103122596243">"حذ٠موارد"</string>
<string name="sync_undo_deletes" msgid="2941317360600338602">"لغو موارد حذ٠شده"</string>
<string name="sync_do_nothing" msgid="3743764740430821845">"اکنون کاری انجام نشود"</string>
@@ -1414,6 +1421,7 @@
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
<string name="activitychooserview_choose_application" msgid="2125168057199941199">"انتخاب برنامه"</string>
+ <string name="activitychooserview_choose_application_error" msgid="8624618365481126668">"راه‌اندازی <xliff:g id="APPLICATION_NAME">%s</xliff:g> انجام نشد"</string>
<string name="shareactionprovider_share_with" msgid="806688056141131819">"اشتراک‌گذاری با"</string>
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"اشتراک‌گذاری با <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"اهرم کنترل حرکت. لمس کرده و نگهدارید."</string>
@@ -1435,20 +1443,20 @@
<string name="action_bar_home_description_format" msgid="7965984360903693903">"‎%1$s, %2$s"</string>
<string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"‎%1$s, %2$s, %3$s"</string>
<string name="storage_internal" msgid="4891916833657929263">"Ø­Ø§ÙØ¸Ù‡Ù” داخلی"</string>
- <string name="storage_sd_card" msgid="3282948861378286745">"کارت SD"</string>
- <string name="storage_usb" msgid="3017954059538517278">"Ø­Ø§ÙØ¸Ù‡Ù” USB"</string>
+ <string name="storage_sd_card" msgid="3282948861378286745">"â€Ú©Ø§Ø±Øª SD"</string>
+ <string name="storage_usb" msgid="3017954059538517278">"â€Ø­Ø§Ùظهٔ USB"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"ویرایش"</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"هشدار میزان Ø§Ø³ØªÙØ§Ø¯Ù‡ از داده"</string>
<string name="data_usage_warning_body" msgid="2814673551471969954">"برای مشاهده کاربرد و تنظیمات لمس کنید."</string>
- <string name="data_usage_3g_limit_title" msgid="7093334419518706686">"داده‌های 2G-3G ØºÛŒØ±ÙØ¹Ø§Ù„ شد"</string>
- <string name="data_usage_4g_limit_title" msgid="7636489436819470761">"داده 4G غیر ÙØ¹Ø§Ù„ شده است"</string>
+ <string name="data_usage_3g_limit_title" msgid="7093334419518706686">"â€Ø¯Ø§Ø¯Ù‡â€ŒÙ‡Ø§ÛŒ 2G-3G ØºÛŒØ±ÙØ¹Ø§Ù„ شد"</string>
+ <string name="data_usage_4g_limit_title" msgid="7636489436819470761">"â€Ø¯Ø§Ø¯Ù‡ 4G غیر ÙØ¹Ø§Ù„ شده است"</string>
<string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"داده‌های تلÙÙ† همراه ØºÛŒØ±ÙØ¹Ø§Ù„ شد"</string>
- <string name="data_usage_wifi_limit_title" msgid="8992154736441284865">"داده‌های Wi-Fi ØºÛŒØ±ÙØ¹Ø§Ù„ شد"</string>
+ <string name="data_usage_wifi_limit_title" msgid="8992154736441284865">"â€Ø¯Ø§Ø¯Ù‡â€ŒÙ‡Ø§ÛŒ Wi-Fi ØºÛŒØ±ÙØ¹Ø§Ù„ شد"</string>
<string name="data_usage_limit_body" msgid="3317964706973601386">"برای ÙØ¹Ø§Ù„ کردن لمس کنید."</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"اطلاعات 2G-3G بیش از حد مجاز است"</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"بیش از حد مجاز 4G است"</string>
+ <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"â€Ø§Ø·Ù„اعات 2G-3G بیش از حد مجاز است"</string>
+ <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"â€Ø¨ÛŒØ´ از حد مجاز 4G است"</string>
<string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"داده‌های تلÙÙ† همراه از مقدار مجاز بیشتر است"</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"از محدوده مجاز داده‌های Wi-Fi بیشتر شد"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"â€Ø§Ø² محدوده مجاز داده‌های Wi-Fi بیشتر شد"</string>
<string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"<xliff:g id="SIZE">%s</xliff:g> از حد تعیین شده بیشتر شد."</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"داده پس‌زمینه محدود شد"</string>
<string name="data_usage_restricted_body" msgid="6741521330997452990">"برای حذ٠محدودیت، لمس کنید."</string>
@@ -1464,8 +1472,8 @@
<string name="expires_on" msgid="3676242949915959821">"تاریخ انقضا:"</string>
<string name="serial_number" msgid="758814067660862493">"شمارهٔ سریال:"</string>
<string name="fingerprints" msgid="4516019619850763049">"اثر انگشت:"</string>
- <string name="sha256_fingerprint" msgid="4391271286477279263">"اثر انگشت SHA-256:"</string>
- <string name="sha1_fingerprint" msgid="7930330235269404581">"اثر انگشت SHA-1"</string>
+ <string name="sha256_fingerprint" msgid="4391271286477279263">"â€Ø§Ø«Ø± انگشت SHA-256:"</string>
+ <string name="sha1_fingerprint" msgid="7930330235269404581">"â€Ø§Ø«Ø± انگشت SHA-1"</string>
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"مشاهدهٔ همه"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"انتخاب ÙØ¹Ø§Ù„یت"</string>
<string name="share_action_provider_share_with" msgid="5247684435979149216">"اشتراک‌گذاری با"</string>
@@ -1491,7 +1499,7 @@
<string name="media_route_status_not_available" msgid="6739899962681886401">"در دسترس نیست"</string>
<string name="media_route_status_in_use" msgid="4533786031090198063">"در حال Ø§Ø³ØªÙØ§Ø¯Ù‡"</string>
<string name="display_manager_built_in_display_name" msgid="2583134294292563941">"ØµÙØ­Ù‡ نمایش از خود"</string>
- <string name="display_manager_hdmi_display_name" msgid="1555264559227470109">"ØµÙØ­Ù‡ HDMI"</string>
+ <string name="display_manager_hdmi_display_name" msgid="1555264559227470109">"â€ØµÙحه HDMI"</string>
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"همپوشانی #<xliff:g id="ID">%1$d</xliff:g>"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">"، امن"</string>
@@ -1517,13 +1525,13 @@
<string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"پین کد باید ۸ عدد یا بیشتر باشد."</string>
<string name="kg_invalid_puk" msgid="3638289409676051243">"پین کد صحیح را دوباره وارد کنید. تلاش‌های مکرر به‌طور دائم سیم کارت را ØºÛŒØ±ÙØ¹Ø§Ù„ خواهد کرد."</string>
<string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"پین کدها منطبق نیستند"</string>
- <string name="kg_login_too_many_attempts" msgid="6486842094005698475">"تلاش‎های زیادی برای کشیدن الگو صورت Ú¯Ø±ÙØªÙ‡ است"</string>
- <string name="kg_login_instructions" msgid="1100551261265506448">"برای بازگشایی Ù‚ÙÙ„ØŒ با حساب Google خود وارد سیستم شوید."</string>
+ <string name="kg_login_too_many_attempts" msgid="6486842094005698475">"â€ØªÙ„اش‎های زیادی برای کشیدن الگو صورت Ú¯Ø±ÙØªÙ‡ است"</string>
+ <string name="kg_login_instructions" msgid="1100551261265506448">"â€Ø¨Ø±Ø§ÛŒ بازگشایی Ù‚ÙÙ„ØŒ با حساب Google خود وارد سیستم شوید."</string>
<string name="kg_login_username_hint" msgid="5718534272070920364">"نام کاربری (ایمیل)"</string>
<string name="kg_login_password_hint" msgid="9057289103827298549">"گذرواژه"</string>
<string name="kg_login_submit_button" msgid="5355904582674054702">"ورود به سیستم"</string>
<string name="kg_login_invalid_input" msgid="5754664119319872197">"نام کاربری یا گذرواژه نامعتبر."</string>
- <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"نام کاربری یا گذرواژه خود را ÙØ±Ø§Ù…وش کردید؟\nاز "<b>"google.com/accounts/recovery"</b>" بازدید کنید."</string>
+ <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"â€Ù†Ø§Ù… کاربری یا گذرواژه خود را ÙØ±Ø§Ù…وش کردید؟\nاز "<b>"google.com/accounts/recovery"</b>" بازدید کنید."</string>
<string name="kg_login_checking_password" msgid="1052685197710252395">"درحال بررسی حساب..."</string>
<string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"پین خود را <xliff:g id="NUMBER_0">%d</xliff:g> بار اشتباه تایپ کردید. \n\nپس از <xliff:g id="NUMBER_1">%d</xliff:g> ثانیه دوباره امتحان کنید."</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"گذرواژه خود را <xliff:g id="NUMBER_0">%d</xliff:g> بار اشتباه تایپ کردید. \n\nپس از <xliff:g id="NUMBER_1">%d</xliff:g> ثانیه دوباره امتحان کنید."</string>
@@ -1532,8 +1540,8 @@
<string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="4051015943038199910">"شما به اشتباه <xliff:g id="NUMBER_0">%d</xliff:g> بار اقدام به باز کردن Ù‚ÙÙ„ تلÙÙ† کرده‌اید. پس از <xliff:g id="NUMBER_1">%d</xliff:g> تلاش ناموÙÙ‚ دیگر، تلÙÙ† به Ù¾ÛŒØ´â€ŒÙØ±Ø¶ کارخانه بازنشانی می‌شود Ùˆ تمام داده‌های کاربر از دست خواهد Ø±ÙØª."</string>
<string name="kg_failed_attempts_now_wiping" product="tablet" msgid="2072996269148483637">"شما به اشتباه <xliff:g id="NUMBER">%d</xliff:g> بار اقدام به باز کردن Ù‚ÙÙ„ رایانه لوحی کرده‌اید. رایانه لوحی اکنون به Ù¾ÛŒØ´â€ŒÙØ±Ø¶ کارخانه بازنشانی می‌شود."</string>
<string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"شما به اشتباه <xliff:g id="NUMBER">%d</xliff:g> بار اقدام به باز کردن Ù‚ÙÙ„ تلÙÙ† کرده‌اید. این تلÙÙ† اکنون به Ù¾ÛŒØ´â€ŒÙØ±Ø¶ کارخانه بازنشانی می‌شود."</string>
- <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"شما الگوی بازگشایی Ù‚ÙÙ„ خود را <xliff:g id="NUMBER_0">%d</xliff:g> بار اشتباه کشیده‎اید. بعد از <xliff:g id="NUMBER_1">%d</xliff:g> تلاش ناموÙÙ‚ØŒ از شما خواسته می‎شود Ú©Ù‡ با Ø§Ø³ØªÙØ§Ø¯Ù‡ از یک حساب ایمیل Ù‚ÙÙ„ رایانه لوحی خود را باز کنید.\n\n Ù„Ø·ÙØ§Ù‹ پس از <xliff:g id="NUMBER_2">%d</xliff:g> ثانیه دوباره امتحان کنید."</string>
- <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"شما الگوی بازگشایی Ù‚ÙÙ„ خود را <xliff:g id="NUMBER_0">%d</xliff:g> بار اشتباه کشیده‌اید. پس از <xliff:g id="NUMBER_1">%d</xliff:g> تلاش ناموÙÙ‚ØŒ از شما خواسته می‎شود Ú©Ù‡ با Ø§Ø³ØªÙØ§Ø¯Ù‡ از یک حساب ایمیل Ù‚ÙÙ„ تلÙÙ† خود را باز کنید.\n\n Ù„Ø·ÙØ§Ù‹ پس از <xliff:g id="NUMBER_2">%d</xliff:g> ثانیه دوباره امتحان کنید."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"â€Ø´Ù…ا الگوی بازگشایی Ù‚ÙÙ„ خود را <xliff:g id="NUMBER_0">%d</xliff:g> بار اشتباه کشیده‎اید. بعد از <xliff:g id="NUMBER_1">%d</xliff:g> تلاش ناموÙÙ‚ØŒ از شما خواسته می‎شود Ú©Ù‡ با Ø§Ø³ØªÙØ§Ø¯Ù‡ از یک حساب ایمیل Ù‚ÙÙ„ رایانه لوحی خود را باز کنید.\n\n Ù„Ø·ÙØ§Ù‹ پس از <xliff:g id="NUMBER_2">%d</xliff:g> ثانیه دوباره امتحان کنید."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"â€Ø´Ù…ا الگوی بازگشایی Ù‚ÙÙ„ خود را <xliff:g id="NUMBER_0">%d</xliff:g> بار اشتباه کشیده‌اید. پس از <xliff:g id="NUMBER_1">%d</xliff:g> تلاش ناموÙÙ‚ØŒ از شما خواسته می‎شود Ú©Ù‡ با Ø§Ø³ØªÙØ§Ø¯Ù‡ از یک حساب ایمیل Ù‚ÙÙ„ تلÙÙ† خود را باز کنید.\n\n Ù„Ø·ÙØ§Ù‹ پس از <xliff:g id="NUMBER_2">%d</xliff:g> ثانیه دوباره امتحان کنید."</string>
<string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
<string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"حذÙ"</string>
<string name="safe_media_volume_warning" product="default" msgid="7324161939475478066">"صدا به بالاتر از سطح توصیه شده Ø§ÙØ²Ø§ÛŒØ´ یابد؟\nگوش دادن به صدای بلند برای مدت طولانی می‌تواند به شنوایی شما آسیب برساند."</string>
@@ -1649,5 +1657,16 @@
<item quantity="other" msgid="4730868920742952817">"امتحان پس از <xliff:g id="COUNT">%d</xliff:g> ثانیه"</item>
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"بعداً دوباره امتحان کنید"</string>
- <string name="immersive_mode_confirmation" msgid="7227416894979047467">"برای خروج از تمام ØµÙØ­Ù‡ از بالا به پایین بکشید"</string>
+ <string name="immersive_mode_confirmation" msgid="7227416894979047467">"برای خروج از حالت تمام ØµÙØ­Ù‡ØŒ انگشت خود را به تندی از بالای ØµÙØ­Ù‡Â Ø¨Ù‡ پایین بکشید."</string>
+ <string name="done_label" msgid="2093726099505892398">"انجام شد"</string>
+ <string name="hour_picker_description" msgid="6698199186859736512">"لغزنده دایره‌ای ساعت"</string>
+ <string name="minute_picker_description" msgid="8606010966873791190">"لغزنده دایره‌ای دقیقه"</string>
+ <string name="select_hours" msgid="6043079511766008245">"انتخاب ساعت"</string>
+ <string name="select_minutes" msgid="3974345615920336087">"انتخاب دقیقه"</string>
+ <string name="day_picker_description" msgid="8990847925961297968">"جدول روزها براساس ماه"</string>
+ <string name="year_picker_description" msgid="5524331207436052403">"لیست سال‌ها"</string>
+ <string name="select_day" msgid="7774759604701773332">"انتخاب ماه و روز"</string>
+ <string name="select_year" msgid="7952052866994196170">"انتخاب سال"</string>
+ <string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> انتخاب شد"</string>
+ <string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> حذ٠شد"</string>
</resources>
diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml
index 3130cba..50ec4db 100644
--- a/core/res/res/values-fi/strings.xml
+++ b/core/res/res/values-fi/strings.xml
@@ -50,6 +50,11 @@
<string name="invalidPuk" msgid="8761456210898036513">"Kirjoita vähintään 8 numeron pituinen PUK-koodi."</string>
<string name="needPuk" msgid="919668385956251611">"SIM-korttisi on PUK-lukittu. Poista lukitus antamalla PUK-koodi."</string>
<string name="needPuk2" msgid="4526033371987193070">"Pura SIM-kortin esto antamalla PUK2-koodi."</string>
+ <string name="enablePin" msgid="209412020907207950">"Epäonnistui, ota SIM-/RUIM-lukitus käyttöön."</string>
+ <plurals name="pinpuk_attempts">
+ <item quantity="one" msgid="6596245285809790142">"Sinulla on <xliff:g id="NUMBER">%d</xliff:g> yritys jäljellä, ennen kuin SIM-kortti lukitaan."</item>
+ <item quantity="other" msgid="7530597808358774740">"Sinulla on <xliff:g id="NUMBER">%d</xliff:g> yritystä jäljellä, ennen kuin SIM-kortti lukitaan."</item>
+ </plurals>
<string name="imei" msgid="2625429890869005782">"IMEI-koodi"</string>
<string name="meid" msgid="4841221237681254195">"MEID"</string>
<string name="ClipMmi" msgid="6952821216480289285">"Soittajan tunnus"</string>
@@ -477,6 +482,8 @@
<string name="permdesc_accessSurfaceFlinger" msgid="1041619516733293551">"Antaa sovelluksen käyttää SurfaceFlingerin matalan tason ominaisuuksia."</string>
<string name="permlab_readFrameBuffer" msgid="6690504248178498136">"lue kehyspuskuria"</string>
<string name="permdesc_readFrameBuffer" msgid="4937405521809454680">"Antaa sovelluksen lukea kehyspuskurin sisältöä."</string>
+ <string name="permlab_accessInputFlinger" msgid="5348635270689553857">"InputFlingerin käyttäminen"</string>
+ <string name="permdesc_accessInputFlinger" msgid="2104864941201226616">"Antaa sovelluksen käyttää InputFlingerin matalan tason ominaisuuksia."</string>
<string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"määritä wifi-näyttöjen asetukset"</string>
<string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"Antaa sovelluksen määrittää wifi-näyttöjä ja muodostaa yhteyden niihin."</string>
<string name="permlab_controlWifiDisplay" msgid="393641276723695496">"hallitse wifi-näyttöjä"</string>
@@ -1414,6 +1421,7 @@
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
<string name="activitychooserview_choose_application" msgid="2125168057199941199">"Valitse sovellus"</string>
+ <string name="activitychooserview_choose_application_error" msgid="8624618365481126668">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> ei käynnisty"</string>
<string name="shareactionprovider_share_with" msgid="806688056141131819">"Jaa seuraavien kanssa:"</string>
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Jaa sovelluksessa <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Liukuva valitsin. Kosketa pitkään."</string>
@@ -1649,5 +1657,16 @@
<item quantity="other" msgid="4730868920742952817">"Yritä uud. <xliff:g id="COUNT">%d</xliff:g> s kul."</item>
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Yritä myöhemmin uudelleen"</string>
- <string name="immersive_mode_confirmation" msgid="7227416894979047467">"Poistu koko näytön tilasta liu\'uttamalla alas."</string>
+ <string name="immersive_mode_confirmation" msgid="7227416894979047467">"Poistu koko näytön tilasta pyyhkäisemällä alas."</string>
+ <string name="done_label" msgid="2093726099505892398">"Valmis"</string>
+ <string name="hour_picker_description" msgid="6698199186859736512">"Tuntien ympyränmuotoinen liukusäädin"</string>
+ <string name="minute_picker_description" msgid="8606010966873791190">"Minuuttien ympyränmuotoinen liukusäädin"</string>
+ <string name="select_hours" msgid="6043079511766008245">"Valitse tunnit"</string>
+ <string name="select_minutes" msgid="3974345615920336087">"Valitse minuutit"</string>
+ <string name="day_picker_description" msgid="8990847925961297968">"Päiväruudukko kuukausittain"</string>
+ <string name="year_picker_description" msgid="5524331207436052403">"Vuosiluettelo"</string>
+ <string name="select_day" msgid="7774759604701773332">"Valitse kuukausi ja päivä"</string>
+ <string name="select_year" msgid="7952052866994196170">"Valitse vuosi"</string>
+ <string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> on valittu"</string>
+ <string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> poistettiin"</string>
</resources>
diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml
index 385ed4b..0b94a2a 100644
--- a/core/res/res/values-fr-rCA/strings.xml
+++ b/core/res/res/values-fr-rCA/strings.xml
@@ -50,6 +50,11 @@
<string name="invalidPuk" msgid="8761456210898036513">"Veuillez saisir une clé PUK comportant au moins huit chiffres."</string>
<string name="needPuk" msgid="919668385956251611">"Votre carte SIM est verrouillée par clé PUK. Saisissez la clé PUK pour la déverrouiller."</string>
<string name="needPuk2" msgid="4526033371987193070">"Saisissez la clé PUK2 pour débloquer la carte SIM."</string>
+ <string name="enablePin" msgid="209412020907207950">"Opération infructueuse. Activez le verrouillage SIM/RUIM."</string>
+ <plurals name="pinpuk_attempts">
+ <item quantity="one" msgid="6596245285809790142">"Il vous reste <xliff:g id="NUMBER">%d</xliff:g> tentative avant que votre carte SIM soit verrouillée."</item>
+ <item quantity="other" msgid="7530597808358774740">"Il vous reste <xliff:g id="NUMBER">%d</xliff:g> tentative(s) avant que votre carte SIM soit verrouillée."</item>
+ </plurals>
<string name="imei" msgid="2625429890869005782">"Code IMEI"</string>
<string name="meid" msgid="4841221237681254195">"MEID"</string>
<string name="ClipMmi" msgid="6952821216480289285">"Numéro de l\'appelant (entrant)"</string>
@@ -477,6 +482,8 @@
<string name="permdesc_accessSurfaceFlinger" msgid="1041619516733293551">"Permet à l\'application d\'utiliser les fonctionnalités de bas niveau de SurfaceFlinger."</string>
<string name="permlab_readFrameBuffer" msgid="6690504248178498136">"lire la mémoire tampon graphique"</string>
<string name="permdesc_readFrameBuffer" msgid="4937405521809454680">"Permet à l\'application de lire le contenu de la mémoire tampon graphique."</string>
+ <string name="permlab_accessInputFlinger" msgid="5348635270689553857">"accéder à InputFlinger"</string>
+ <string name="permdesc_accessInputFlinger" msgid="2104864941201226616">"Permet à l\'application d\'utiliser les fonctionnalités de bas niveau de SurfaceFlinger."</string>
<string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"configurer les écrans Wi-Fi"</string>
<string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"Permet à l\'application de configurer des écrans Wi-Fi et de s\'y connecter."</string>
<string name="permlab_controlWifiDisplay" msgid="393641276723695496">"contrôler les écrans Wi-Fi"</string>
@@ -1414,6 +1421,7 @@
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Maj"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Entrée"</string>
<string name="activitychooserview_choose_application" msgid="2125168057199941199">"Sélectionnez une application"</string>
+ <string name="activitychooserview_choose_application_error" msgid="8624618365481126668">"Impossible de lancer l\'application <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="shareactionprovider_share_with" msgid="806688056141131819">"Partagez avec"</string>
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Partager avec <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Poignée coulissante. Appuyez de manière prolongée."</string>
@@ -1649,5 +1657,16 @@
<item quantity="other" msgid="4730868920742952817">"Réessayer dans <xliff:g id="COUNT">%d</xliff:g> s"</item>
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Réessayez plus tard"</string>
- <string name="immersive_mode_confirmation" msgid="7227416894979047467">"Balayez vers le bas pour quitter plein écran"</string>
+ <string name="immersive_mode_confirmation" msgid="7227416894979047467">"Balayez vers le bas pour quitter le mode plein écran"</string>
+ <string name="done_label" msgid="2093726099505892398">"Terminé"</string>
+ <string name="hour_picker_description" msgid="6698199186859736512">"Curseur circulaire des heures"</string>
+ <string name="minute_picker_description" msgid="8606010966873791190">"Curseur circulaire des minutes"</string>
+ <string name="select_hours" msgid="6043079511766008245">"Sélectionnez les heures"</string>
+ <string name="select_minutes" msgid="3974345615920336087">"Sélectionnez les minutes"</string>
+ <string name="day_picker_description" msgid="8990847925961297968">"Calendrier mensuel sous forme de grille"</string>
+ <string name="year_picker_description" msgid="5524331207436052403">"Liste des années"</string>
+ <string name="select_day" msgid="7774759604701773332">"Sélectionnez un mois et un jour"</string>
+ <string name="select_year" msgid="7952052866994196170">"Sélectionnez une année"</string>
+ <string name="item_is_selected" msgid="949687401682476608">"« <xliff:g id="ITEM">%1$s</xliff:g> » a été sélectionné"</string>
+ <string name="deleted_key" msgid="7659477886625566590">"« <xliff:g id="KEY">%1$s</xliff:g> » a été supprimé"</string>
</resources>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index 9a44a31..02a4f54 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -50,6 +50,11 @@
<string name="invalidPuk" msgid="8761456210898036513">"Saisissez un code PUK comportant au moins huit chiffres."</string>
<string name="needPuk" msgid="919668385956251611">"Votre carte SIM est verrouillée par clé PUK. Saisissez la clé PUK pour la déverrouiller."</string>
<string name="needPuk2" msgid="4526033371987193070">"Saisissez la clé PUK2 pour débloquer la carte SIM."</string>
+ <string name="enablePin" msgid="209412020907207950">"Échec de l\'opération. Veuillez activer le verrouillage de la carte SIM/RUIM."</string>
+ <plurals name="pinpuk_attempts">
+ <item quantity="one" msgid="6596245285809790142">"Il vous reste <xliff:g id="NUMBER">%d</xliff:g> tentative avant que votre carte SIM ne soit verrouillée."</item>
+ <item quantity="other" msgid="7530597808358774740">"Il vous reste <xliff:g id="NUMBER">%d</xliff:g> tentatives avant que votre carte SIM ne soit verrouillée."</item>
+ </plurals>
<string name="imei" msgid="2625429890869005782">"Code IMEI"</string>
<string name="meid" msgid="4841221237681254195">"Code MEID"</string>
<string name="ClipMmi" msgid="6952821216480289285">"Numéro de l\'appelant (entrant)"</string>
@@ -477,6 +482,8 @@
<string name="permdesc_accessSurfaceFlinger" msgid="1041619516733293551">"Permet à l\'application d\'utiliser les fonctionnalités de bas niveau de SurfaceFlinger."</string>
<string name="permlab_readFrameBuffer" msgid="6690504248178498136">"Lecture de la mémoire tampon graphique"</string>
<string name="permdesc_readFrameBuffer" msgid="4937405521809454680">"Permet à l\'application de lire le contenu de la mémoire tampon graphique."</string>
+ <string name="permlab_accessInputFlinger" msgid="5348635270689553857">"accéder à InputFlinger"</string>
+ <string name="permdesc_accessInputFlinger" msgid="2104864941201226616">"Permet à l\'application d\'utiliser les fonctionnalités de base d\'InputFlinger."</string>
<string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"configurer les écrans Wi-Fi"</string>
<string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"Permet à l\'application de configurer des écrans Wi-Fi et de s\'y connecter."</string>
<string name="permlab_controlWifiDisplay" msgid="393641276723695496">"contrôler les écrans Wi-Fi"</string>
@@ -1414,6 +1421,7 @@
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Maj"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Entrée"</string>
<string name="activitychooserview_choose_application" msgid="2125168057199941199">"Sélectionnez une application"</string>
+ <string name="activitychooserview_choose_application_error" msgid="8624618365481126668">"Impossible de lancer l\'application <xliff:g id="APPLICATION_NAME">%s</xliff:g>."</string>
<string name="shareactionprovider_share_with" msgid="806688056141131819">"Partager avec"</string>
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Partager avec <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Poignée coulissante. Appuyez de manière prolongée."</string>
@@ -1649,5 +1657,16 @@
<item quantity="other" msgid="4730868920742952817">"Réessayer dans <xliff:g id="COUNT">%d</xliff:g> s"</item>
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Veuillez réessayer ultérieurement."</string>
- <string name="immersive_mode_confirmation" msgid="7227416894979047467">"Balayer vers le bas pour quitter le plein écran"</string>
+ <string name="immersive_mode_confirmation" msgid="7227416894979047467">"Faites glisser le doigt vers le bas pour quitter le mode plein écran."</string>
+ <string name="done_label" msgid="2093726099505892398">"OK"</string>
+ <string name="hour_picker_description" msgid="6698199186859736512">"Curseur circulaire des heures"</string>
+ <string name="minute_picker_description" msgid="8606010966873791190">"Curseur circulaire des minutes"</string>
+ <string name="select_hours" msgid="6043079511766008245">"Sélectionner une heure"</string>
+ <string name="select_minutes" msgid="3974345615920336087">"Sélectionner des minutes"</string>
+ <string name="day_picker_description" msgid="8990847925961297968">"Calendrier mensuel sous forme de grille"</string>
+ <string name="year_picker_description" msgid="5524331207436052403">"Liste des années"</string>
+ <string name="select_day" msgid="7774759604701773332">"Sélectionner un mois et un jour"</string>
+ <string name="select_year" msgid="7952052866994196170">"Sélectionner une année"</string>
+ <string name="item_is_selected" msgid="949687401682476608">"\"<xliff:g id="ITEM">%1$s</xliff:g>\" sélectionné"</string>
+ <string name="deleted_key" msgid="7659477886625566590">"\"<xliff:g id="KEY">%1$s</xliff:g>\" supprimé"</string>
</resources>
diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml
index 73575bd..d18ed81 100644
--- a/core/res/res/values-hi/strings.xml
+++ b/core/res/res/values-hi/strings.xml
@@ -50,6 +50,11 @@
<string name="invalidPuk" msgid="8761456210898036513">"à¤à¤¸à¤¾ PUK लिखें जो 8 अंकों या अधिक का हो."</string>
<string name="needPuk" msgid="919668385956251611">"आपका सिम कारà¥à¤¡ PUK लॉक किया गया है. इसे अनलॉक करने के लिठPUK कोड लिखें."</string>
<string name="needPuk2" msgid="4526033371987193070">"सिम कारà¥à¤¡ अनबà¥â€à¤²à¥‰à¤• करने के लिठPUK2 लिखें."</string>
+ <string name="enablePin" msgid="209412020907207950">"असफल, सिम//RUIM लॉक सकà¥à¤·à¤® करें."</string>
+ <plurals name="pinpuk_attempts">
+ <item quantity="one" msgid="6596245285809790142">"सिम के लॉक हो जाने से पहले आपके पास <xliff:g id="NUMBER">%d</xliff:g> पà¥à¤°à¤¯à¤¾à¤¸ शेष है."</item>
+ <item quantity="other" msgid="7530597808358774740">"सिम के लॉक हो जाने से पहले आपके पास <xliff:g id="NUMBER">%d</xliff:g> पà¥à¤°à¤¯à¤¾à¤¸ शेष हैं."</item>
+ </plurals>
<string name="imei" msgid="2625429890869005782">"IMEI"</string>
<string name="meid" msgid="4841221237681254195">"MEID"</string>
<string name="ClipMmi" msgid="6952821216480289285">"इनकमिंग कॉलर ID"</string>
@@ -150,9 +155,9 @@
<string name="shutdown_confirm" product="default" msgid="649792175242821353">"आपका फ़ोन शट डाउन हो जाà¤à¤—ा."</string>
<string name="shutdown_confirm_question" msgid="2906544768881136183">"कà¥â€à¤¯à¤¾ आप शट डाउन करना चाहते हैं?"</string>
<string name="reboot_safemode_title" msgid="7054509914500140361">"सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ मोड में रीबूट करें"</string>
- <string name="reboot_safemode_confirm" msgid="55293944502784668">"कà¥à¤¯à¤¾ आप सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ मोड में रीबूट करना चाहते हैं? इससे आपके इंसà¥à¤Ÿà¥‰à¤² किठहà¥à¤ सभी तृतीय पकà¥à¤· à¤à¤ªà¥à¤¸ अकà¥à¤·à¤® हो जाà¤à¤‚गे. जब आप फिर से रीबूट करेंगे तो वे पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤ हो जाà¤à¤‚गे."</string>
+ <string name="reboot_safemode_confirm" msgid="55293944502784668">"कà¥à¤¯à¤¾ आप सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ मोड में रीबूट करना चाहते हैं? इससे आपके इंसà¥à¤Ÿà¥‰à¤² किठहà¥à¤ सभी तृतीय पकà¥à¤· à¤à¤ªà¥à¤¸ अकà¥à¤·à¤® हो जाà¤à¤‚गे. जब आप फिर से रीबूट करेंगे तो वे पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤ हो जाà¤à¤‚गे."</string>
<string name="recent_tasks_title" msgid="3691764623638127888">"हाल के"</string>
- <string name="no_recent_tasks" msgid="8794906658732193473">"कोई हाल ही के à¤à¤ªà¥à¤¸ नहीं."</string>
+ <string name="no_recent_tasks" msgid="8794906658732193473">"कोई हाल ही के à¤à¤ªà¥à¤¸ नहीं."</string>
<string name="global_actions" product="tablet" msgid="408477140088053665">"टेबलेट विकलà¥â€à¤ª"</string>
<string name="global_actions" product="default" msgid="2406416831541615258">"फ़ोन विकलà¥â€à¤ª"</string>
<string name="global_action_lock" msgid="2844945191792119712">"सà¥â€à¤•à¥à¤°à¥€à¤¨ लॉक"</string>
@@ -205,8 +210,8 @@
<string name="permgroupdesc_camera" msgid="2933667372289567714">"चितà¥à¤° या वीडियो कैपà¥â€à¤šà¤° के लिठकैमरे पर सीधी पहà¥à¤‚च."</string>
<string name="permgrouplab_screenlock" msgid="8275500173330718168">"सà¥â€à¤•à¥à¤°à¥€à¤¨ लॉक करें"</string>
<string name="permgroupdesc_screenlock" msgid="7067497128925499401">"आपके उपकरण की लॉक सà¥à¤•à¥à¤°à¥€à¤¨ का वà¥à¤¯à¤µà¤¹à¤¾à¤° पà¥à¤°à¤­à¤¾à¤µà¤¿à¤¤ करने की कà¥à¤·à¤®à¤¤à¤¾."</string>
- <string name="permgrouplab_appInfo" msgid="8028789762634147725">"आपके à¤à¤ªà¥â€à¤¸ की जानकारी"</string>
- <string name="permgroupdesc_appInfo" msgid="3950378538049625907">"अपने उपकरण पर अनà¥â€à¤¯ à¤à¤ªà¥â€à¤¸ के वà¥â€à¤¯à¤µà¤¹à¤¾à¤° को पà¥à¤°à¤­à¤¾à¤µà¤¿à¤¤ करने की कà¥à¤·à¤®à¤¤à¤¾."</string>
+ <string name="permgrouplab_appInfo" msgid="8028789762634147725">"आपके à¤à¤ªà¥à¤¸ की जानकारी"</string>
+ <string name="permgroupdesc_appInfo" msgid="3950378538049625907">"अपने उपकरण पर अनà¥â€à¤¯ à¤à¤ªà¥à¤¸ के वà¥â€à¤¯à¤µà¤¹à¤¾à¤° को पà¥à¤°à¤­à¤¾à¤µà¤¿à¤¤ करने की कà¥à¤·à¤®à¤¤à¤¾."</string>
<string name="permgrouplab_wallpaper" msgid="3850280158041175998">"वॉलपेपर"</string>
<string name="permgroupdesc_wallpaper" msgid="5630417854750540154">"उपकरण की वॉलपेपर सेटिंग बदलें."</string>
<string name="permgrouplab_systemClock" msgid="406535759236612992">"घड़ी"</string>
@@ -224,9 +229,9 @@
<string name="permgrouplab_systemTools" msgid="4652191644082714048">"सिसà¥â€à¤Ÿà¤® टूल"</string>
<string name="permgroupdesc_systemTools" msgid="8162102602190734305">"सिसà¥â€à¤Ÿà¤® का निमà¥â€à¤¨-सà¥â€à¤¤à¤° पहà¥à¤‚च और नियंतà¥à¤°à¤£."</string>
<string name="permgrouplab_developmentTools" msgid="3446164584710596513">"डेवलपमेंट टूल"</string>
- <string name="permgroupdesc_developmentTools" msgid="7058828032358142018">"सà¥à¤µà¤¿à¤§à¤¾à¤à¤‚ जो केवल à¤à¤ªà¥à¤¸ डेवलपर के लिठआवशà¥à¤¯à¤• हैं."</string>
- <string name="permgrouplab_display" msgid="4279909676036402636">"अनà¥â€à¤¯ à¤à¤ªà¥â€à¤¸ UI"</string>
- <string name="permgroupdesc_display" msgid="6051002031933013714">"अनà¥â€à¤¯ à¤à¤ªà¥â€à¤¸ के UI को पà¥à¤°à¤­à¤¾à¤µà¤¿à¤¤ करें."</string>
+ <string name="permgroupdesc_developmentTools" msgid="7058828032358142018">"सà¥à¤µà¤¿à¤§à¤¾à¤à¤‚ जो केवल à¤à¤ªà¥à¤¸ डेवलपर के लिठआवशà¥à¤¯à¤• हैं."</string>
+ <string name="permgrouplab_display" msgid="4279909676036402636">"अनà¥â€à¤¯ à¤à¤ªà¥à¤¸ UI"</string>
+ <string name="permgroupdesc_display" msgid="6051002031933013714">"अनà¥â€à¤¯ à¤à¤ªà¥à¤¸ के UI को पà¥à¤°à¤­à¤¾à¤µà¤¿à¤¤ करें."</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"संगà¥à¤°à¤¹à¤£"</string>
<string name="permgroupdesc_storage" product="nosdcard" msgid="7442318502446874999">"USB संगà¥à¤°à¤¹à¤£ में पहà¥à¤‚चें."</string>
<string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"SD कारà¥à¤¡ में पहà¥à¤‚चें."</string>
@@ -237,443 +242,445 @@
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"सà¥à¤ªà¤°à¥à¤¶ दà¥à¤µà¤¾à¤°à¤¾ à¤à¤•à¥à¤¸à¤ªà¥à¤²à¥‹à¤° करें को चालू करें"</string>
<string name="capability_desc_canRequestTouchExploration" msgid="5800552516779249356">"सà¥à¤ªà¤°à¥à¤¶ किठगठआइटम ज़ोर से बोले जाà¤à¤‚गे और सà¥à¤•à¥à¤°à¥€à¤¨ को जेसà¥à¤šà¤° के उपयोग से à¤à¤•à¥à¤¸à¤ªà¥à¤²à¥‹à¤° किया जा सकेगा."</string>
<string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"à¤à¤¨à¥à¤¹à¤¾à¤‚स की गई वेब आसान तरीका चालू करें"</string>
- <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"à¤à¤ªà¥à¤¸ सामगà¥à¤°à¥€ को अधिक पहà¥à¤‚च-योगà¥à¤¯ बनाने के लिठसà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ इंसà¥à¤Ÿà¥‰à¤² किठजा सकते हैं."</string>
+ <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"à¤à¤ªà¥à¤¸ सामगà¥à¤°à¥€ को अधिक पहà¥à¤‚च-योगà¥à¤¯ बनाने के लिठसà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ इंसà¥à¤Ÿà¥‰à¤² किठजा सकते हैं."</string>
<string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"आपके दà¥à¤µà¤¾à¤°à¤¾ लिखे हà¥à¤ पाठ को धà¥à¤¯à¤¾à¤¨ से देखें"</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"कà¥à¤°à¥‡à¤¡à¤¿à¤Ÿ कारà¥à¤¡ नंबर और पासवरà¥à¤¡ जैसा वà¥à¤¯à¤•à¥à¤¤à¤¿à¤—त डेटा शामिल होता है."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"सà¥â€à¤¥à¤¿à¤¤à¤¿ बार अकà¥à¤·à¤® या बदलें"</string>
- <string name="permdesc_statusBar" msgid="8434669549504290975">"à¤à¤ªà¥à¤¸ को सà¥à¤¥à¤¿à¤¤à¤¿ बार अकà¥à¤·à¤® करने या सिसà¥â€à¤Ÿà¤® आइकन को जोड़ने या निकालने देता है."</string>
+ <string name="permdesc_statusBar" msgid="8434669549504290975">"à¤à¤ªà¥à¤¸ को सà¥à¤¥à¤¿à¤¤à¤¿ बार अकà¥à¤·à¤® करने या सिसà¥â€à¤Ÿà¤® आइकन को जोड़ने या निकालने देता है."</string>
<string name="permlab_statusBarService" msgid="7247281911387931485">"सà¥â€à¤¥à¤¿à¤¤à¤¿ बार"</string>
- <string name="permdesc_statusBarService" msgid="716113660795976060">"à¤à¤ªà¥â€à¤¸ को सà¥â€à¤¥à¤¿à¤¤à¤¿ बार होने देता है."</string>
+ <string name="permdesc_statusBarService" msgid="716113660795976060">"à¤à¤ªà¥à¤¸ को सà¥â€à¤¥à¤¿à¤¤à¤¿ बार होने देता है."</string>
<string name="permlab_expandStatusBar" msgid="1148198785937489264">"सà¥â€à¤¥à¤¿à¤¤à¤¿ बार विसà¥â€à¤¤à¥ƒà¤¤/संकà¥à¤·à¤¿à¤ªà¥à¤¤ करें"</string>
- <string name="permdesc_expandStatusBar" msgid="6917549437129401132">"à¤à¤ªà¥à¤¸ को सà¥à¤¥à¤¿à¤¤à¤¿ बार को विसà¥à¤¤à¥ƒà¤¤ या संकà¥à¤·à¤¿à¤ªà¥à¤¤ करने देता है."</string>
+ <string name="permdesc_expandStatusBar" msgid="6917549437129401132">"à¤à¤ªà¥à¤¸ को सà¥à¤¥à¤¿à¤¤à¤¿ बार को विसà¥à¤¤à¥ƒà¤¤ या संकà¥à¤·à¤¿à¤ªà¥à¤¤ करने देता है."</string>
<string name="permlab_install_shortcut" msgid="4279070216371564234">"शॉरà¥à¤Ÿà¤•ट इंसà¥â€à¤Ÿà¥‰à¤² करें"</string>
<string name="permdesc_install_shortcut" msgid="8341295916286736996">"à¤à¤ªà¥â€à¤²à¤¿à¤•ेशन को उपयोगकरà¥à¤¤à¤¾ के हसà¥â€à¤¤à¤•à¥à¤·à¥‡à¤ª के बिना होमसà¥â€à¤•à¥à¤°à¥€à¤¨ शॉरà¥à¤Ÿà¤•ट जोड़ने की अनà¥à¤®à¤¤à¤¿ देता है."</string>
<string name="permlab_uninstall_shortcut" msgid="4729634524044003699">"शॉरà¥à¤Ÿà¤•ट अनइंसà¥à¤Ÿà¥‰à¤² करें"</string>
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"à¤à¤ªà¥â€à¤²à¤¿à¤•ेशन को उपयोगकरà¥à¤¤à¤¾ के हसà¥â€à¤¤à¤•à¥à¤·à¥‡à¤ª के बिना होमसà¥â€à¤•à¥à¤°à¥€à¤¨ शॉरà¥à¤Ÿà¤•ट निकालने की अनà¥à¤®à¤¤à¤¿ देता है."</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"आउटगोइंग कॉल को कहीं और भेजें"</string>
- <string name="permdesc_processOutgoingCalls" msgid="5331318931937402040">"à¤à¤ªà¥â€à¤¸ को आउटगोइंग कॉल संसाधित करने और डायल किठजाने वाला नंबर बदलने देता है. यह अनà¥à¤®à¤¤à¤¿ à¤à¤ªà¥â€à¤¸ को आउटगोइंग कॉल की निगरानी करने, रीडायरेकà¥â€à¤Ÿ करने, या उनà¥â€à¤¹à¥‡à¤‚ रोकने देती है."</string>
+ <string name="permdesc_processOutgoingCalls" msgid="5331318931937402040">"à¤à¤ªà¥à¤¸ को आउटगोइंग कॉल संसाधित करने और डायल किठजाने वाला नंबर बदलने देता है. यह अनà¥à¤®à¤¤à¤¿ à¤à¤ªà¥à¤¸ को आउटगोइंग कॉल की निगरानी करने, रीडायरेकà¥â€à¤Ÿ करने, या उनà¥â€à¤¹à¥‡à¤‚ रोकने देती है."</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"पाठ संदेश (SMS) पà¥à¤°à¤¾à¤ªà¥à¤¤ करें"</string>
- <string name="permdesc_receiveSms" msgid="6424387754228766939">"à¤à¤ªà¥à¤¸ को SMS संदेशों को पà¥à¤°à¤¾à¤ªà¥â€à¤¤ और संसाधित करने देता है. इसका अरà¥à¤¥ है कि à¤à¤ªà¥à¤¸ आपके उपकरण पर भेजे गठसंदेशों की निगरानी आपको दिखाठबिना कर सकता है और उनà¥â€à¤¹à¥‡à¤‚ हटा सकता है."</string>
+ <string name="permdesc_receiveSms" msgid="6424387754228766939">"à¤à¤ªà¥à¤¸ को SMS संदेशों को पà¥à¤°à¤¾à¤ªà¥â€à¤¤ और संसाधित करने देता है. इसका अरà¥à¤¥ है कि à¤à¤ªà¥à¤¸ आपके उपकरण पर भेजे गठसंदेशों की निगरानी आपको दिखाठबिना कर सकता है और उनà¥â€à¤¹à¥‡à¤‚ हटा सकता है."</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"पाठ संदेश (MMS) पà¥à¤°à¤¾à¤ªà¥à¤¤ करें"</string>
- <string name="permdesc_receiveMms" msgid="533019437263212260">"à¤à¤ªà¥à¤¸ को MMS संदेशों को पà¥à¤°à¤¾à¤ªà¥â€à¤¤ और संसाधित करने देता है. इसका अरà¥à¤¥ है कि à¤à¤ªà¥à¤¸ आपके उपकरण पर भेजे गठसंदेशों की निगरानी आपको दिखाठबिना कर सकता है और उनà¥â€à¤¹à¥‡à¤‚ हटा सकता है."</string>
+ <string name="permdesc_receiveMms" msgid="533019437263212260">"à¤à¤ªà¥à¤¸ को MMS संदेशों को पà¥à¤°à¤¾à¤ªà¥â€à¤¤ और संसाधित करने देता है. इसका अरà¥à¤¥ है कि à¤à¤ªà¥à¤¸ आपके उपकरण पर भेजे गठसंदेशों की निगरानी आपको दिखाठबिना कर सकता है और उनà¥â€à¤¹à¥‡à¤‚ हटा सकता है."</string>
<string name="permlab_receiveEmergencyBroadcast" msgid="1803477660846288089">"आपातकालीन पà¥à¤°à¤¸à¤¾à¤°à¤£ पà¥à¤°à¤¾à¤ªà¥à¤¤ करें"</string>
- <string name="permdesc_receiveEmergencyBroadcast" msgid="848524070262431974">"à¤à¤ªà¥à¤¸ को आपातकालीन पà¥à¤°à¤¸à¤¾à¤°à¤£ संदेशों को पà¥à¤°à¤¾à¤ªà¥à¤¤ करने और संसाधित करने देता है. यह अनà¥à¤®à¤¤à¤¿ केवल सिसà¥à¤Ÿà¤® à¤à¤ªà¥à¤¸ में उपलबà¥à¤§ है."</string>
+ <string name="permdesc_receiveEmergencyBroadcast" msgid="848524070262431974">"à¤à¤ªà¥à¤¸ को आपातकालीन पà¥à¤°à¤¸à¤¾à¤°à¤£ संदेशों को पà¥à¤°à¤¾à¤ªà¥à¤¤ करने और संसाधित करने देता है. यह अनà¥à¤®à¤¤à¤¿ केवल सिसà¥à¤Ÿà¤® à¤à¤ªà¥à¤¸ में उपलबà¥à¤§ है."</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"सेल पà¥à¤°à¤¸à¤¾à¤°à¤£ संदेश पढ़ें"</string>
- <string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"à¤à¤ªà¥â€à¤¸ को आपके उपकरण दà¥à¤µà¤¾à¤°à¤¾ पà¥à¤°à¤¾à¤ªà¥à¤¤ सेल पà¥à¤°à¤¸à¤¾à¤°à¤£ संदेशों को पढ़ने देता है. कà¥à¤› सà¥â€à¤¥à¤¾à¤¨à¥‹à¤‚ पर आपको आपातकालीन सà¥â€à¤¥à¤¿à¤¤à¤¿à¤¯à¥‹à¤‚ की चेतावनी देने के लिठसेल पà¥à¤°à¤¸à¤¾à¤°à¤£ अलरà¥à¤Ÿ वितरित किठजाते हैं. आपातकालीन सेल पà¥à¤°à¤¸à¤¾à¤°à¤£ पà¥à¤°à¤¾à¤ªà¥à¤¤ होने पर दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ à¤à¤ªà¥â€à¤¸ आपके उपकरण के निषà¥â€à¤ªà¤¾à¤¦à¤¨ या संचालन में हसà¥â€à¤¤à¤•à¥à¤·à¥‡à¤ª कर सकते हैं."</string>
+ <string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"à¤à¤ªà¥à¤¸ को आपके उपकरण दà¥à¤µà¤¾à¤°à¤¾ पà¥à¤°à¤¾à¤ªà¥à¤¤ सेल पà¥à¤°à¤¸à¤¾à¤°à¤£ संदेशों को पढ़ने देता है. कà¥à¤› सà¥â€à¤¥à¤¾à¤¨à¥‹à¤‚ पर आपको आपातकालीन सà¥â€à¤¥à¤¿à¤¤à¤¿à¤¯à¥‹à¤‚ की चेतावनी देने के लिठसेल पà¥à¤°à¤¸à¤¾à¤°à¤£ अलरà¥à¤Ÿ वितरित किठजाते हैं. आपातकालीन सेल पà¥à¤°à¤¸à¤¾à¤°à¤£ पà¥à¤°à¤¾à¤ªà¥à¤¤ होने पर दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ à¤à¤ªà¥à¤¸ आपके उपकरण के निषà¥â€à¤ªà¤¾à¤¦à¤¨ या संचालन में हसà¥â€à¤¤à¤•à¥à¤·à¥‡à¤ª कर सकते हैं."</string>
<string name="permlab_sendSms" msgid="5600830612147671529">"SMS संदेश भेजें"</string>
- <string name="permdesc_sendSms" msgid="7094729298204937667">"à¤à¤ªà¥à¤¸ को SMS संदेशों को भेजने देता है. इसके परिणामसà¥à¤µà¤°à¥‚प अपà¥à¤°à¤¤à¥â€à¤¯à¤¾à¤¶à¤¿à¤¤ शà¥à¤²à¥â€à¤• लागू हो सकते हैं. दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ à¤à¤ªà¥à¤¸ आपकी पà¥à¤·à¥à¤Ÿà¤¿ के बिना संदेश भेजकर आपका धन वà¥â€à¤¯à¤¯ कर सकते हैं."</string>
+ <string name="permdesc_sendSms" msgid="7094729298204937667">"à¤à¤ªà¥à¤¸ को SMS संदेशों को भेजने देता है. इसके परिणामसà¥à¤µà¤°à¥‚प अपà¥à¤°à¤¤à¥â€à¤¯à¤¾à¤¶à¤¿à¤¤ शà¥à¤²à¥â€à¤• लागू हो सकते हैं. दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ à¤à¤ªà¥à¤¸ आपकी पà¥à¤·à¥à¤Ÿà¤¿ के बिना संदेश भेजकर आपका धन वà¥â€à¤¯à¤¯ कर सकते हैं."</string>
<string name="permlab_sendRespondViaMessageRequest" msgid="8713889105305943200">"संदेश-दà¥à¤µà¤¾à¤°à¤¾-जवाब भेजें ईवेंट"</string>
- <string name="permdesc_sendRespondViaMessageRequest" msgid="7107648548468778734">"इनकमिंग कॉल के संदेश-दà¥à¤µà¤¾à¤°à¤¾-जवाब देने के ईवेंट पà¥à¤°à¤¬à¤‚धित करने के लिà¤, à¤à¤ªà¥à¤¸ को अनà¥à¤¯ संदेश सेवा à¤à¤ªà¥à¤¸ को अनà¥à¤°à¥‹à¤§ भेजने देती है."</string>
+ <string name="permdesc_sendRespondViaMessageRequest" msgid="7107648548468778734">"इनकमिंग कॉल के संदेश-दà¥à¤µà¤¾à¤°à¤¾-जवाब देने के ईवेंट पà¥à¤°à¤¬à¤‚धित करने के लिà¤, à¤à¤ªà¥à¤¸ को अनà¥à¤¯ संदेश सेवा à¤à¤ªà¥à¤¸ को अनà¥à¤°à¥‹à¤§ भेजने देती है."</string>
<string name="permlab_readSms" msgid="8745086572213270480">"अपने पाठ संदेश (SMS या MMS) पढ़ें"</string>
- <string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"à¤à¤ªà¥à¤¸ को आपके टेबलेट या SIM कारà¥à¤¡ में संगà¥à¤°à¤¹à¥€à¤¤ SMS संदेश पढ़ने देता है. इससे सामगà¥à¤°à¥€ या गोपनीयता पर धà¥à¤¯à¤¾à¤¨ दिठबिना, à¤à¤ªà¥à¤¸ सभी SMS संदेश पढ़ सकता है."</string>
- <string name="permdesc_readSms" product="default" msgid="3695967533457240550">"à¤à¤ªà¥à¤¸ को आपके फ़ोन या SIM कारà¥à¤¡ में संगà¥à¤°à¤¹à¥€à¤¤ SMS संदेश पढ़ने देता है. इससे सामगà¥à¤°à¥€ या गोपनीयता पर धà¥à¤¯à¤¾à¤¨ दिठबिना, à¤à¤ªà¥à¤¸ सभी SMS संदेश पढ़ सकता है."</string>
+ <string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"à¤à¤ªà¥à¤¸ को आपके टेबलेट या SIM कारà¥à¤¡ में संगà¥à¤°à¤¹à¥€à¤¤ SMS संदेश पढ़ने देता है. इससे सामगà¥à¤°à¥€ या गोपनीयता पर धà¥à¤¯à¤¾à¤¨ दिठबिना, à¤à¤ªà¥à¤¸ सभी SMS संदेश पढ़ सकता है."</string>
+ <string name="permdesc_readSms" product="default" msgid="3695967533457240550">"à¤à¤ªà¥à¤¸ को आपके फ़ोन या SIM कारà¥à¤¡ में संगà¥à¤°à¤¹à¥€à¤¤ SMS संदेश पढ़ने देता है. इससे सामगà¥à¤°à¥€ या गोपनीयता पर धà¥à¤¯à¤¾à¤¨ दिठबिना, à¤à¤ªà¥à¤¸ सभी SMS संदेश पढ़ सकता है."</string>
<string name="permlab_writeSms" msgid="3216950472636214774">"अपने पाठ संदेश (SMS या MMS) संपादित करें"</string>
- <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"à¤à¤ªà¥à¤¸ को आपके टेबलेट या सिम कारà¥à¤¡ में संगà¥à¤°à¤¹à¥€à¤¤ SMS संदेशों में लिखने देता है. दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ à¤à¤ªà¥à¤¸ आपके संदेशों को हटा सकते हैं."</string>
- <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"à¤à¤ªà¥à¤¸ को आपके फ़ोन या सिम कारà¥à¤¡ में संगà¥à¤°à¤¹à¥€à¤¤ SMS संदेशों को लिखने देता है. दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ à¤à¤ªà¥à¤¸ आपके संदेशों को हटा सकते हैं."</string>
+ <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"à¤à¤ªà¥à¤¸ को आपके टेबलेट या सिम कारà¥à¤¡ में संगà¥à¤°à¤¹à¥€à¤¤ SMS संदेशों में लिखने देता है. दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ à¤à¤ªà¥à¤¸ आपके संदेशों को हटा सकते हैं."</string>
+ <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"à¤à¤ªà¥à¤¸ को आपके फ़ोन या सिम कारà¥à¤¡ में संगà¥à¤°à¤¹à¥€à¤¤ SMS संदेशों को लिखने देता है. दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ à¤à¤ªà¥à¤¸ आपके संदेशों को हटा सकते हैं."</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"पाठ संदेश (WAP) पà¥à¤°à¤¾à¤ªà¥à¤¤ करें"</string>
- <string name="permdesc_receiveWapPush" msgid="748232190220583385">"à¤à¤ªà¥à¤¸ को WAP संदेशों को पà¥à¤°à¤¾à¤ªà¥â€à¤¤ और संसाधित करने देता है. इस अनà¥à¤®à¤¤à¤¿ में आपको भेजे गठसंदेशों की निगरानी आपको दिखाठबिना करने और हटाने की कà¥à¤·à¤®à¤¤à¤¾ शामिल है."</string>
- <string name="permlab_getTasks" msgid="6466095396623933906">"चल रहे à¤à¤ªà¥â€à¤¸ पà¥à¤¨à¤°à¥à¤ªà¥à¤°à¤¾à¤ªà¥à¤¤ करें"</string>
- <string name="permdesc_getTasks" msgid="7454215995847658102">"à¤à¤ªà¥à¤¸ को वरà¥à¤¤à¤®à¤¾à¤¨ में और हाल ही में चल रहे कारà¥à¤¯à¥‹à¤‚ के बारे में जानकारी को पà¥à¤¨: पà¥à¤°à¤¾à¤ªà¥â€à¤¤ करने देता है. इससे à¤à¤ªà¥à¤¸ उपकरण पर उपयोग किठगठà¤à¤ªà¥à¤¸ के बारे में जानकारी खोज सकता है."</string>
+ <string name="permdesc_receiveWapPush" msgid="748232190220583385">"à¤à¤ªà¥à¤¸ को WAP संदेशों को पà¥à¤°à¤¾à¤ªà¥â€à¤¤ और संसाधित करने देता है. इस अनà¥à¤®à¤¤à¤¿ में आपको भेजे गठसंदेशों की निगरानी आपको दिखाठबिना करने और हटाने की कà¥à¤·à¤®à¤¤à¤¾ शामिल है."</string>
+ <string name="permlab_getTasks" msgid="6466095396623933906">"चल रहे à¤à¤ªà¥à¤¸ पà¥à¤¨à¤°à¥à¤ªà¥à¤°à¤¾à¤ªà¥à¤¤ करें"</string>
+ <string name="permdesc_getTasks" msgid="7454215995847658102">"à¤à¤ªà¥à¤¸ को वरà¥à¤¤à¤®à¤¾à¤¨ में और हाल ही में चल रहे कारà¥à¤¯à¥‹à¤‚ के बारे में जानकारी को पà¥à¤¨: पà¥à¤°à¤¾à¤ªà¥â€à¤¤ करने देता है. इससे à¤à¤ªà¥à¤¸ उपकरण पर उपयोग किठगठà¤à¤ªà¥à¤¸ के बारे में जानकारी खोज सकता है."</string>
<string name="permlab_interactAcrossUsers" msgid="7114255281944211682">"उपयोगकरà¥à¤¤à¤¾à¤“ं के बीच सहभागिता करें"</string>
- <string name="permdesc_interactAcrossUsers" msgid="364670963623385786">"à¤à¤ªà¥à¤¸ को उपकरण पर भिनà¥à¤¨ उपयोगकरà¥à¤¤à¤¾à¤“ं के बीच कारà¥à¤¯ निषà¥à¤ªà¤¾à¤¦à¤¿à¤¤ करने देता है. दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ à¤à¤ªà¥à¤¸ उपयोगकरà¥à¤¤à¤¾à¤“ं के बीच सà¥à¤°à¤•à¥à¤·à¤¾ का उलà¥à¤²à¤‚घन करने के लिठइसका उपयोग कर सकते हैं."</string>
+ <string name="permdesc_interactAcrossUsers" msgid="364670963623385786">"à¤à¤ªà¥à¤¸ को उपकरण पर भिनà¥à¤¨ उपयोगकरà¥à¤¤à¤¾à¤“ं के बीच कारà¥à¤¯ निषà¥à¤ªà¤¾à¤¦à¤¿à¤¤ करने देता है. दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ à¤à¤ªà¥à¤¸ उपयोगकरà¥à¤¤à¤¾à¤“ं के बीच सà¥à¤°à¤•à¥à¤·à¤¾ का उलà¥à¤²à¤‚घन करने के लिठइसका उपयोग कर सकते हैं."</string>
<string name="permlab_interactAcrossUsersFull" msgid="2567734285545074105">"उपयोगकरà¥à¤¤à¤¾à¤“ं के बीच सहभागिता करने के लिठपूरà¥à¤£ लाइसेंस"</string>
<string name="permdesc_interactAcrossUsersFull" msgid="376841368395502366">"उपयोगकरà¥à¤¤à¤¾à¤“ं के बीच सभी संभव सहभागिता करने देता है."</string>
<string name="permlab_manageUsers" msgid="1676150911672282428">"उपयोगकरà¥à¤¤à¤¾ पà¥à¤°à¤¬à¤‚धित करें"</string>
- <string name="permdesc_manageUsers" msgid="8409306667645355638">"à¤à¤ªà¥à¤¸ को उपकरण पर कà¥à¤µà¥‡à¤°à¥€, निरà¥à¤®à¤¾à¤£ और हटाने सहित उपयोगकरà¥à¤¤à¤¾à¤“ं को पà¥à¤°à¤¬à¤‚धित करने की सà¥à¤µà¤¿à¤§à¤¾ देता है."</string>
- <string name="permlab_getDetailedTasks" msgid="6229468674753529501">"चल रहे à¤à¤ªà¥â€à¤¸ के विवरण पà¥à¤°à¤¾à¤ªà¥à¤¤ करें"</string>
- <string name="permdesc_getDetailedTasks" msgid="153824741440717599">"à¤à¤ªà¥à¤¸ को वरà¥à¤¤à¤®à¤¾à¤¨ में और हाल ही में चल रहे कारà¥à¤¯à¥‹à¤‚ की जानकारी पà¥à¤°à¤¾à¤ªà¥à¤¤ करने देता है. दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ à¤à¤ªà¥à¤¸ अनà¥à¤¯ à¤à¤ªà¥à¤¸ के बारे में निजी जानकारी खोज सकते हैं."</string>
- <string name="permlab_reorderTasks" msgid="2018575526934422779">"चल रहे à¤à¤ªà¥â€à¤¸ पà¥à¤¨: कà¥à¤°à¤®à¤¿à¤¤ करें"</string>
- <string name="permdesc_reorderTasks" msgid="7734217754877439351">"à¤à¤ªà¥à¤¸ को कारà¥à¤¯à¥‹à¤‚ को अगà¥à¤°à¤­à¥‚मि और पृषà¥â€à¤ à¤­à¥‚मि पर ले जाने देता है. à¤à¤ªà¥à¤¸ आपके इनपà¥à¤Ÿ के बिना यह कर सकता है."</string>
- <string name="permlab_removeTasks" msgid="6821513401870377403">"चलने वाले à¤à¤ªà¥à¤¸ रोकें"</string>
- <string name="permdesc_removeTasks" msgid="1394714352062635493">"किसी à¤à¤ªà¥â€à¤¸ को कारà¥à¤¯à¥‹à¤‚ को निकालने और उनके à¤à¤ªà¥â€à¤¸ समापà¥à¤¤ करने देता है. दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ à¤à¤ªà¥â€à¤¸ अनà¥â€à¤¯ à¤à¤ªà¥â€à¤¸ का वà¥â€à¤¯à¤µà¤¹à¤¾à¤° बाधित कर सकते हैं."</string>
+ <string name="permdesc_manageUsers" msgid="8409306667645355638">"à¤à¤ªà¥à¤¸ को उपकरण पर कà¥à¤µà¥‡à¤°à¥€, निरà¥à¤®à¤¾à¤£ और हटाने सहित उपयोगकरà¥à¤¤à¤¾à¤“ं को पà¥à¤°à¤¬à¤‚धित करने की सà¥à¤µà¤¿à¤§à¤¾ देता है."</string>
+ <string name="permlab_getDetailedTasks" msgid="6229468674753529501">"चल रहे à¤à¤ªà¥à¤¸ के विवरण पà¥à¤°à¤¾à¤ªà¥à¤¤ करें"</string>
+ <string name="permdesc_getDetailedTasks" msgid="153824741440717599">"à¤à¤ªà¥à¤¸ को वरà¥à¤¤à¤®à¤¾à¤¨ में और हाल ही में चल रहे कारà¥à¤¯à¥‹à¤‚ की जानकारी पà¥à¤°à¤¾à¤ªà¥à¤¤ करने देता है. दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ à¤à¤ªà¥à¤¸ अनà¥à¤¯ à¤à¤ªà¥à¤¸ के बारे में निजी जानकारी खोज सकते हैं."</string>
+ <string name="permlab_reorderTasks" msgid="2018575526934422779">"चल रहे à¤à¤ªà¥à¤¸ पà¥à¤¨: कà¥à¤°à¤®à¤¿à¤¤ करें"</string>
+ <string name="permdesc_reorderTasks" msgid="7734217754877439351">"à¤à¤ªà¥à¤¸ को कारà¥à¤¯à¥‹à¤‚ को अगà¥à¤°à¤­à¥‚मि और पृषà¥â€à¤ à¤­à¥‚मि पर ले जाने देता है. à¤à¤ªà¥à¤¸ आपके इनपà¥à¤Ÿ के बिना यह कर सकता है."</string>
+ <string name="permlab_removeTasks" msgid="6821513401870377403">"चलने वाले à¤à¤ªà¥à¤¸ रोकें"</string>
+ <string name="permdesc_removeTasks" msgid="1394714352062635493">"किसी à¤à¤ªà¥à¤¸ को कारà¥à¤¯à¥‹à¤‚ को निकालने और उनके à¤à¤ªà¥à¤¸ समापà¥à¤¤ करने देता है. दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ à¤à¤ªà¥à¤¸ अनà¥â€à¤¯ à¤à¤ªà¥à¤¸ का वà¥â€à¤¯à¤µà¤¹à¤¾à¤° बाधित कर सकते हैं."</string>
<string name="permlab_manageActivityStacks" msgid="7391191384027303065">"गतिविधि सà¥à¤Ÿà¥ˆà¤• पà¥à¤°à¤¬à¤‚धित करें"</string>
- <string name="permdesc_manageActivityStacks" msgid="1615881933034084440">"à¤à¤ªà¥à¤¸ को à¤à¤¸à¥‡ गतिविधि सà¥à¤Ÿà¥ˆà¤• जोड़ने, निकालने, और बदलने देता है जिनमें अनà¥à¤¯ à¤à¤ªà¥à¤¸ चलते हों. दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ à¤à¤ªà¥à¤¸ अनà¥à¤¯ à¤à¤ªà¥à¤¸ के वà¥à¤¯à¤µà¤¹à¤¾à¤° में बाधा डाल सकते हैं."</string>
+ <string name="permdesc_manageActivityStacks" msgid="1615881933034084440">"à¤à¤ªà¥à¤¸ को à¤à¤¸à¥‡ गतिविधि सà¥à¤Ÿà¥ˆà¤• जोड़ने, निकालने, और बदलने देता है जिनमें अनà¥à¤¯ à¤à¤ªà¥à¤¸ चलते हों. दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ à¤à¤ªà¥à¤¸ अनà¥à¤¯ à¤à¤ªà¥à¤¸ के वà¥à¤¯à¤µà¤¹à¤¾à¤° में बाधा डाल सकते हैं."</string>
<string name="permlab_startAnyActivity" msgid="2918768238045206456">"कोई गतिविधि पà¥à¤°à¤¾à¤°à¤‚भ करें"</string>
- <string name="permdesc_startAnyActivity" msgid="997823695343584001">"अनà¥à¤®à¤¤à¤¿ सà¥à¤°à¤•à¥à¤·à¤¾ या निरà¥à¤¯à¤¾à¤¤ की सà¥â€à¤¥à¤¿à¤¤à¤¿ पर धà¥â€à¤¯à¤¾à¤¨ दिठबिना, à¤à¤ªà¥â€à¤¸ को कोई गतिविधि पà¥à¤°à¤¾à¤°à¤‚भ करने देता है."</string>
+ <string name="permdesc_startAnyActivity" msgid="997823695343584001">"अनà¥à¤®à¤¤à¤¿ सà¥à¤°à¤•à¥à¤·à¤¾ या निरà¥à¤¯à¤¾à¤¤ की सà¥â€à¤¥à¤¿à¤¤à¤¿ पर धà¥â€à¤¯à¤¾à¤¨ दिठबिना, à¤à¤ªà¥à¤¸ को कोई गतिविधि पà¥à¤°à¤¾à¤°à¤‚भ करने देता है."</string>
<string name="permlab_setScreenCompatibility" msgid="6975387118861842061">"सà¥â€à¤•à¥à¤°à¥€à¤¨ संगतता सेट करें"</string>
- <string name="permdesc_setScreenCompatibility" msgid="692043618693917374">"à¤à¤ªà¥â€à¤¸ को अनà¥â€à¤¯ à¤à¤ªà¥â€à¤¸ के सà¥â€à¤•à¥à¤°à¥€à¤¨ संगतता मोड को नियंतà¥à¤°à¤¿à¤¤ करने देता है. दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ à¤à¤ªà¥â€à¤¸ अनà¥â€à¤¯ à¤à¤ªà¥â€à¤¸ का वà¥â€à¤¯à¤µà¤¹à¤¾à¤° बाधित कर सकते हैं."</string>
- <string name="permlab_setDebugApp" msgid="3022107198686584052">"à¤à¤ªà¥â€à¤¸ डीबग करना सकà¥à¤·à¤® करें"</string>
- <string name="permdesc_setDebugApp" msgid="4474512416299013256">"à¤à¤ªà¥à¤¸ को अनà¥à¤¯ à¤à¤ªà¥à¤¸ के लिठडीबग किया जाना चालू करने देता है. दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ à¤à¤ªà¥à¤¸ इसका उपयोग अनà¥à¤¯ à¤à¤ªà¥à¤¸ को समापà¥à¤¤ करने के लिठकर सकते हैं."</string>
+ <string name="permdesc_setScreenCompatibility" msgid="692043618693917374">"à¤à¤ªà¥à¤¸ को अनà¥â€à¤¯ à¤à¤ªà¥à¤¸ के सà¥â€à¤•à¥à¤°à¥€à¤¨ संगतता मोड को नियंतà¥à¤°à¤¿à¤¤ करने देता है. दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ à¤à¤ªà¥à¤¸ अनà¥â€à¤¯ à¤à¤ªà¥à¤¸ का वà¥â€à¤¯à¤µà¤¹à¤¾à¤° बाधित कर सकते हैं."</string>
+ <string name="permlab_setDebugApp" msgid="3022107198686584052">"à¤à¤ªà¥à¤¸ डीबग करना सकà¥à¤·à¤® करें"</string>
+ <string name="permdesc_setDebugApp" msgid="4474512416299013256">"à¤à¤ªà¥à¤¸ को अनà¥à¤¯ à¤à¤ªà¥à¤¸ के लिठडीबग किया जाना चालू करने देता है. दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ à¤à¤ªà¥à¤¸ इसका उपयोग अनà¥à¤¯ à¤à¤ªà¥à¤¸ को समापà¥à¤¤ करने के लिठकर सकते हैं."</string>
<string name="permlab_changeConfiguration" msgid="4162092185124234480">"सिसà¥â€à¤Ÿà¤® पà¥à¤°à¤¦à¤°à¥à¤¶à¤¨ सेटिंग बदलें"</string>
- <string name="permdesc_changeConfiguration" msgid="4372223873154296076">"à¤à¤ªà¥à¤¸ को वरà¥à¤¤à¤®à¤¾à¤¨ कॉनà¥à¤«à¤¼à¤¿à¤—रेशन, जैसे सà¥à¤¥à¤¾à¤¨ या समगà¥à¤° अकà¥à¤·à¤°à¥‹à¤‚ का आकार, बदलने देता है."</string>
+ <string name="permdesc_changeConfiguration" msgid="4372223873154296076">"à¤à¤ªà¥à¤¸ को वरà¥à¤¤à¤®à¤¾à¤¨ कॉनà¥à¤«à¤¼à¤¿à¤—रेशन, जैसे सà¥à¤¥à¤¾à¤¨ या समगà¥à¤° अकà¥à¤·à¤°à¥‹à¤‚ का आकार, बदलने देता है."</string>
<string name="permlab_enableCarMode" msgid="5684504058192921098">"कार मोड सकà¥à¤·à¤® करें"</string>
- <string name="permdesc_enableCarMode" msgid="4853187425751419467">"à¤à¤ªà¥à¤¸ को कार मोड सकà¥à¤·à¤® करने देता है."</string>
- <string name="permlab_killBackgroundProcesses" msgid="3914026687420177202">"अनà¥â€à¤¯ à¤à¤ªà¥â€à¤¸ बंद करें"</string>
- <string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"à¤à¤ªà¥à¤¸ को अनà¥â€à¤¯ à¤à¤ªà¥â€à¤¸ की पृषà¥à¤ à¤­à¥‚मि पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾à¤“ं को समापà¥à¤¤ करने देता है. यह अनà¥à¤¯ à¤à¤ªà¥à¤¸ का चलना रोक सकता है."</string>
- <string name="permlab_forceStopPackages" msgid="2329627428832067700">"अनà¥â€à¤¯ à¤à¤ªà¥â€à¤¸ बलपूरà¥à¤µà¤• बंद करें"</string>
- <string name="permdesc_forceStopPackages" msgid="5253157296183940812">"à¤à¤ªà¥à¤¸ को अनà¥à¤¯ à¤à¤ªà¥à¤¸ बलपूरà¥à¤µà¤• बंद करने देता है."</string>
- <string name="permlab_forceBack" msgid="652935204072584616">"à¤à¤ªà¥â€à¤¸ को बलपूरà¥à¤µà¤• बंद करें"</string>
- <string name="permdesc_forceBack" msgid="3892295830419513623">"à¤à¤ªà¥à¤¸ को अगà¥à¤°à¤­à¥‚मि में चल रही कोई भी गतिविधि बलपूरà¥à¤µà¤• बंद करने और वापस जाने देता है. सामानà¥â€à¤¯ à¤à¤ªà¥â€à¤¸ के लिठकभी भी आवशà¥â€à¤¯à¤• नहीं होना चाहिà¤."</string>
+ <string name="permdesc_enableCarMode" msgid="4853187425751419467">"à¤à¤ªà¥à¤¸ को कार मोड सकà¥à¤·à¤® करने देता है."</string>
+ <string name="permlab_killBackgroundProcesses" msgid="3914026687420177202">"अनà¥â€à¤¯ à¤à¤ªà¥à¤¸ बंद करें"</string>
+ <string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"à¤à¤ªà¥à¤¸ को अनà¥â€à¤¯ à¤à¤ªà¥à¤¸ की पृषà¥à¤ à¤­à¥‚मि पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾à¤“ं को समापà¥à¤¤ करने देता है. यह अनà¥à¤¯ à¤à¤ªà¥à¤¸ का चलना रोक सकता है."</string>
+ <string name="permlab_forceStopPackages" msgid="2329627428832067700">"अनà¥â€à¤¯ à¤à¤ªà¥à¤¸ बलपूरà¥à¤µà¤• बंद करें"</string>
+ <string name="permdesc_forceStopPackages" msgid="5253157296183940812">"à¤à¤ªà¥à¤¸ को अनà¥à¤¯ à¤à¤ªà¥à¤¸ बलपूरà¥à¤µà¤• बंद करने देता है."</string>
+ <string name="permlab_forceBack" msgid="652935204072584616">"à¤à¤ªà¥à¤¸ को बलपूरà¥à¤µà¤• बंद करें"</string>
+ <string name="permdesc_forceBack" msgid="3892295830419513623">"à¤à¤ªà¥à¤¸ को अगà¥à¤°à¤­à¥‚मि में चल रही कोई भी गतिविधि बलपूरà¥à¤µà¤• बंद करने और वापस जाने देता है. सामानà¥â€à¤¯ à¤à¤ªà¥à¤¸ के लिठकभी भी आवशà¥â€à¤¯à¤• नहीं होना चाहिà¤."</string>
<string name="permlab_dump" msgid="1681799862438954752">"सिसà¥â€à¤Ÿà¤® की आंतरिक सà¥â€à¤¥à¤¿à¤¤à¤¿ पà¥à¤¨à¤°à¥à¤ªà¥à¤°à¤¾à¤ªà¥à¤¤ करें"</string>
- <string name="permdesc_dump" msgid="1778299088692290329">"à¤à¤ªà¥â€à¤¸ को सिसà¥â€à¤Ÿà¤® की आंतरिक सà¥â€à¤¥à¤¿à¤¤à¤¿ पà¥à¤¨à¤°à¥à¤ªà¥à¤°à¤¾à¤ªà¥à¤¤ करने देता है. दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ à¤à¤ªà¥â€à¤¸ विभिनà¥â€à¤¨ पà¥à¤°à¤•ार की निजी और सà¥à¤°à¤•à¥à¤·à¤¾ जानकारी पà¥à¤°à¤¾à¤ªà¥à¤¤ कर सकते हैं जिनकी उनà¥â€à¤¹à¥‡à¤‚ सामानà¥â€à¤¯à¤¤: आवशà¥â€à¤¯à¤•ता नहीं होती."</string>
+ <string name="permdesc_dump" msgid="1778299088692290329">"à¤à¤ªà¥à¤¸ को सिसà¥â€à¤Ÿà¤® की आंतरिक सà¥â€à¤¥à¤¿à¤¤à¤¿ पà¥à¤¨à¤°à¥à¤ªà¥à¤°à¤¾à¤ªà¥à¤¤ करने देता है. दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ à¤à¤ªà¥à¤¸ विभिनà¥â€à¤¨ पà¥à¤°à¤•ार की निजी और सà¥à¤°à¤•à¥à¤·à¤¾ जानकारी पà¥à¤°à¤¾à¤ªà¥à¤¤ कर सकते हैं जिनकी उनà¥â€à¤¹à¥‡à¤‚ सामानà¥â€à¤¯à¤¤: आवशà¥â€à¤¯à¤•ता नहीं होती."</string>
<string name="permlab_retrieve_window_content" msgid="8022588608994589938">"सà¥â€à¤•à¥à¤°à¥€à¤¨ सामगà¥à¤°à¥€ पà¥à¤¨à¤°à¥à¤ªà¥à¤°à¤¾à¤ªà¥à¤¤ करें"</string>
- <string name="permdesc_retrieve_window_content" msgid="3193269069469700265">"à¤à¤ªà¥â€à¤¸ को सकà¥à¤°à¤¿à¤¯ विंडो की सामगà¥à¤°à¥€ पà¥à¤¨à¤°à¥à¤ªà¥à¤°à¤¾à¤ªà¥à¤¤ करने देता है. दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ à¤à¤ªà¥â€à¤¸ विंडो की संपूरà¥à¤£ सामगà¥à¤°à¥€ पà¥à¤°à¤¾à¤ªà¥à¤¤ कर सकते हैं और पासवरà¥à¤¡ को छोड़कर इसके सभी पाठ जांच सकते हैं."</string>
+ <string name="permdesc_retrieve_window_content" msgid="3193269069469700265">"à¤à¤ªà¥à¤¸ को सकà¥à¤°à¤¿à¤¯ विंडो की सामगà¥à¤°à¥€ पà¥à¤¨à¤°à¥à¤ªà¥à¤°à¤¾à¤ªà¥à¤¤ करने देता है. दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ à¤à¤ªà¥à¤¸ विंडो की संपूरà¥à¤£ सामगà¥à¤°à¥€ पà¥à¤°à¤¾à¤ªà¥à¤¤ कर सकते हैं और पासवरà¥à¤¡ को छोड़कर इसके सभी पाठ जांच सकते हैं."</string>
<string name="permlab_temporary_enable_accessibility" msgid="2312612135127310254">"आसान तरीका को असà¥à¤¥à¤¾à¤¯à¥€ रूप से सकà¥à¤·à¤® करें"</string>
- <string name="permdesc_temporary_enable_accessibility" msgid="8079456293182975464">"à¤à¤ªà¥à¤¸ को उपकरण पर आसान तरीका को असà¥à¤¥à¤¾à¤¯à¥€ रूप से सकà¥à¤·à¤® करने देता है. दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ à¤à¤ªà¥à¤¸ उपयोगकरà¥à¤¤à¤¾ की सहमति के बिना आसान तरीका को सकà¥à¤·à¤® कर सकते हैं."</string>
+ <string name="permdesc_temporary_enable_accessibility" msgid="8079456293182975464">"à¤à¤ªà¥à¤¸ को उपकरण पर आसान तरीका को असà¥à¤¥à¤¾à¤¯à¥€ रूप से सकà¥à¤·à¤® करने देता है. दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ à¤à¤ªà¥à¤¸ उपयोगकरà¥à¤¤à¤¾ की सहमति के बिना आसान तरीका को सकà¥à¤·à¤® कर सकते हैं."</string>
<string name="permlab_retrieve_window_info" msgid="8532295199112519378">"विंडो जानकारी पà¥à¤°à¤¾à¤ªà¥à¤¤ करें"</string>
- <string name="permdesc_retrieve_window_info" msgid="4998836370424186849">"à¤à¤ªà¥â€à¤¸ को विंडो पà¥à¤°à¤¬à¤‚धक से windows के बारे में जानकारी पà¥à¤°à¤¾à¤ªà¥à¤¤ करने देता है. दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ à¤à¤ªà¥â€à¤¸ आंतरिक सिसà¥à¤Ÿà¤® उपयोग के लिठअभिपà¥à¤°à¥‡à¤¤ जानकारी को पà¥à¤°à¤¾à¤ªà¥à¤¤ कर सकते हैं."</string>
+ <string name="permdesc_retrieve_window_info" msgid="4998836370424186849">"à¤à¤ªà¥à¤¸ को विंडो पà¥à¤°à¤¬à¤‚धक से windows के बारे में जानकारी पà¥à¤°à¤¾à¤ªà¥à¤¤ करने देता है. दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ à¤à¤ªà¥à¤¸ आंतरिक सिसà¥à¤Ÿà¤® उपयोग के लिठअभिपà¥à¤°à¥‡à¤¤ जानकारी को पà¥à¤°à¤¾à¤ªà¥à¤¤ कर सकते हैं."</string>
<string name="permlab_filter_events" msgid="8675535648807427389">"ईवेंट फ़िलà¥à¤Ÿà¤° करें"</string>
- <string name="permdesc_filter_events" msgid="8006236315888347680">"à¤à¤ªà¥â€à¤¸ को इनपà¥à¤Ÿ फ़िलà¥â€à¤Ÿà¤° पंजीकृत करने देता है, जो सभी उपयोगकरà¥à¤¤à¤¾ ईवेंट के सà¥â€à¤Ÿà¥à¤°à¥€à¤® को भेजे जाने से पहले फ़िलà¥â€à¤Ÿà¤° करता है. दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ à¤à¤ªà¥â€à¤¸ उपयोगकरà¥à¤¤à¤¾ के हसà¥â€à¤¤à¤•à¥à¤·à¥‡à¤ª के बिना सिसà¥â€à¤Ÿà¤® UI को नियंतà¥à¤°à¤¿à¤¤ कर सकता है."</string>
+ <string name="permdesc_filter_events" msgid="8006236315888347680">"à¤à¤ªà¥à¤¸ को इनपà¥à¤Ÿ फ़िलà¥â€à¤Ÿà¤° पंजीकृत करने देता है, जो सभी उपयोगकरà¥à¤¤à¤¾ ईवेंट के सà¥â€à¤Ÿà¥à¤°à¥€à¤® को भेजे जाने से पहले फ़िलà¥â€à¤Ÿà¤° करता है. दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ à¤à¤ªà¥à¤¸ उपयोगकरà¥à¤¤à¤¾ के हसà¥â€à¤¤à¤•à¥à¤·à¥‡à¤ª के बिना सिसà¥â€à¤Ÿà¤® UI को नियंतà¥à¤°à¤¿à¤¤ कर सकता है."</string>
<string name="permlab_magnify_display" msgid="5973626738170618775">"डिसà¥à¤ªà¥à¤²à¥‡ को आवरà¥à¤§à¤¿à¤¤ करें"</string>
- <string name="permdesc_magnify_display" msgid="7121235684515003792">"à¤à¤ªà¥à¤¸ को डिसà¥à¤ªà¥à¤²à¥‡ की सामगà¥à¤°à¥€ आवरà¥à¤§à¤¿à¤¤ करने देता है. दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ à¤à¤ªà¥à¤¸ डिसà¥à¤ªà¥à¤²à¥‡ सामगà¥à¤°à¥€ को इस तरह से बदल सकते हैं कि उपकरण अनà¥à¤ªà¤¯à¥‹à¤—ी रेंडर होता है."</string>
+ <string name="permdesc_magnify_display" msgid="7121235684515003792">"à¤à¤ªà¥à¤¸ को डिसà¥à¤ªà¥à¤²à¥‡ की सामगà¥à¤°à¥€ आवरà¥à¤§à¤¿à¤¤ करने देता है. दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ à¤à¤ªà¥à¤¸ डिसà¥à¤ªà¥à¤²à¥‡ सामगà¥à¤°à¥€ को इस तरह से बदल सकते हैं कि उपकरण अनà¥à¤ªà¤¯à¥‹à¤—ी रेंडर होता है."</string>
<string name="permlab_shutdown" msgid="7185747824038909016">"आंशिक शटडाउन"</string>
<string name="permdesc_shutdown" msgid="7046500838746291775">"गतिविधि पà¥à¤°à¤¬à¤‚धक को शटडाउन सà¥â€à¤¥à¤¿à¤¤à¤¿ में रखता है. पूरà¥à¤£ शटडाउन निषà¥â€à¤ªà¤¾à¤¦à¤¿à¤¤ नहीं करता है."</string>
- <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"à¤à¤ªà¥â€à¤¸ सà¥â€à¤µà¤¿à¤š करने से रोकता है"</string>
- <string name="permdesc_stopAppSwitches" msgid="8262195802582255021">"उपयोगकरà¥à¤¤à¤¾ को दूसरे à¤à¤ªà¥â€à¤¸ पर सà¥â€à¤µà¤¿à¤š करने से रोकता है."</string>
- <string name="permlab_getTopActivityInfo" msgid="2537922311411546016">"वरà¥à¤¤à¤®à¤¾à¤¨ à¤à¤ªà¥à¤¸ की जानकारी पà¥à¤°à¤¾à¤ªà¥à¤¤ करें"</string>
- <string name="permdesc_getTopActivityInfo" msgid="2512448855496067131">"धारक को सà¥à¤•à¥à¤°à¥€à¤¨ के अगà¥à¤°à¤­à¤¾à¤— में सà¥à¤¥à¤¿à¤¤ वरà¥à¤¤à¤®à¤¾à¤¨ à¤à¤ªà¥à¤¸ के बारे में निजी जानकारी पà¥à¤°à¤¾à¤ªà¥à¤¤ करने देती है."</string>
- <string name="permlab_runSetActivityWatcher" msgid="892239094867182656">"सभी à¤à¤ªà¥â€à¤¸ की लॉनà¥â€à¤šà¤¿à¤‚ग की निगरानी करें और उसे नियंतà¥à¤°à¤¿à¤¤ करें"</string>
- <string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"à¤à¤ªà¥à¤¸ को यह निगरानी और नियंतà¥à¤°à¤¿à¤¤ करने देता है कि सिसà¥à¤Ÿà¤® कैसे गतिविधियां लॉनà¥à¤š करता है. दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ à¤à¤ªà¥à¤¸ सिसà¥à¤Ÿà¤® को पूरी तरह से जोखिम में डाल सकते हैं. इस अनà¥à¤®à¤¤à¤¿ की आवशà¥à¤¯à¤•ता केवल विकास के लिठहै, सामानà¥à¤¯ उपयोग के लिठकभी नहीं."</string>
+ <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"à¤à¤ªà¥à¤¸ सà¥â€à¤µà¤¿à¤š करने से रोकता है"</string>
+ <string name="permdesc_stopAppSwitches" msgid="8262195802582255021">"उपयोगकरà¥à¤¤à¤¾ को दूसरे à¤à¤ªà¥à¤¸ पर सà¥â€à¤µà¤¿à¤š करने से रोकता है."</string>
+ <string name="permlab_getTopActivityInfo" msgid="2537922311411546016">"वरà¥à¤¤à¤®à¤¾à¤¨ à¤à¤ªà¥à¤¸ की जानकारी पà¥à¤°à¤¾à¤ªà¥à¤¤ करें"</string>
+ <string name="permdesc_getTopActivityInfo" msgid="2512448855496067131">"धारक को सà¥à¤•à¥à¤°à¥€à¤¨ के अगà¥à¤°à¤­à¤¾à¤— में सà¥à¤¥à¤¿à¤¤ वरà¥à¤¤à¤®à¤¾à¤¨ à¤à¤ªà¥à¤¸ के बारे में निजी जानकारी पà¥à¤°à¤¾à¤ªà¥à¤¤ करने देती है."</string>
+ <string name="permlab_runSetActivityWatcher" msgid="892239094867182656">"सभी à¤à¤ªà¥à¤¸ की लॉनà¥â€à¤šà¤¿à¤‚ग की निगरानी करें और उसे नियंतà¥à¤°à¤¿à¤¤ करें"</string>
+ <string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"à¤à¤ªà¥à¤¸ को यह निगरानी और नियंतà¥à¤°à¤¿à¤¤ करने देता है कि सिसà¥à¤Ÿà¤® कैसे गतिविधियां लॉनà¥à¤š करता है. दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ à¤à¤ªà¥à¤¸ सिसà¥à¤Ÿà¤® को पूरी तरह से जोखिम में डाल सकते हैं. इस अनà¥à¤®à¤¤à¤¿ की आवशà¥à¤¯à¤•ता केवल विकास के लिठहै, सामानà¥à¤¯ उपयोग के लिठकभी नहीं."</string>
<string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"पैकेज निकाले गठपà¥à¤°à¤¸à¤¾à¤°à¤£ भेजें"</string>
- <string name="permdesc_broadcastPackageRemoved" msgid="6621901216207931089">"à¤à¤ªà¥à¤¸ को कोई à¤à¤¸à¥€ सूचना पà¥à¤°à¤¸à¤¾à¤°à¤¿à¤¤ करने देता है जिसे किसी à¤à¤ªà¥à¤¸ पैकेज ने निकाल दिया गया हो. दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ à¤à¤ªà¥à¤¸ इसका उपयोग चल रहे अनà¥à¤¯ à¤à¤ªà¥à¤¸ को समापà¥à¤¤ करने के लिठकर सकते हैं."</string>
+ <string name="permdesc_broadcastPackageRemoved" msgid="6621901216207931089">"à¤à¤ªà¥à¤¸ को कोई à¤à¤¸à¥€ सूचना पà¥à¤°à¤¸à¤¾à¤°à¤¿à¤¤ करने देता है जिसे किसी à¤à¤ªà¥à¤¸ पैकेज ने निकाल दिया गया हो. दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ à¤à¤ªà¥à¤¸ इसका उपयोग चल रहे अनà¥à¤¯ à¤à¤ªà¥à¤¸ को समापà¥à¤¤ करने के लिठकर सकते हैं."</string>
<string name="permlab_broadcastSmsReceived" msgid="5689095009030336593">"SMS-पà¥à¤°à¤¾à¤ªà¥à¤¤ पà¥à¤°à¤¸à¤¾à¤° भेजें"</string>
- <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"à¤à¤ªà¥à¤¸ को वह सूचना पà¥à¤°à¤¸à¤¾à¤°à¤¿à¤¤ करने देता है जो SMS संदेश ने पà¥à¤°à¤¾à¤ªà¥à¤¤ की है. दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ à¤à¤ªà¥à¤¸ इसका उपयोग नकली इनकमिंग संदेश गढ़ने के लिठकर सकते हैं."</string>
+ <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"à¤à¤ªà¥à¤¸ को वह सूचना पà¥à¤°à¤¸à¤¾à¤°à¤¿à¤¤ करने देता है जो SMS संदेश ने पà¥à¤°à¤¾à¤ªà¥à¤¤ की है. दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ à¤à¤ªà¥à¤¸ इसका उपयोग नकली इनकमिंग संदेश गढ़ने के लिठकर सकते हैं."</string>
<string name="permlab_broadcastWapPush" msgid="3145347413028582371">"WAP-PUSH-पà¥à¤°à¤¾à¤ªà¥à¤¤ पà¥à¤°à¤¸à¤¾à¤°à¤£ भेजें"</string>
- <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"à¤à¤ªà¥à¤¸ को वह सूचना पà¥à¤°à¤¸à¤¾à¤°à¤¿à¤¤ करने देता है जो WAP PUSH संदेश को पà¥à¤°à¤¾à¤ªà¥à¤¤ हà¥à¤† है. दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ à¤à¤ªà¥à¤¸ इसका उपयोग नकली MMS संदेश पà¥à¤°à¤¾à¤ªà¥à¤¤ करने या किसी वेबपृषà¥à¤  की सामगà¥à¤°à¥€ को दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ दूसरे रूप से चà¥à¤ªà¤šà¤¾à¤ª पà¥à¤°à¤¤à¤¿à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤ करने के लिठकर सकते हैं."</string>
+ <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"à¤à¤ªà¥à¤¸ को वह सूचना पà¥à¤°à¤¸à¤¾à¤°à¤¿à¤¤ करने देता है जो WAP PUSH संदेश को पà¥à¤°à¤¾à¤ªà¥à¤¤ हà¥à¤† है. दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ à¤à¤ªà¥à¤¸ इसका उपयोग नकली MMS संदेश पà¥à¤°à¤¾à¤ªà¥à¤¤ करने या किसी वेबपृषà¥à¤  की सामगà¥à¤°à¥€ को दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ दूसरे रूप से चà¥à¤ªà¤šà¤¾à¤ª पà¥à¤°à¤¤à¤¿à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤ करने के लिठकर सकते हैं."</string>
<string name="permlab_setProcessLimit" msgid="2451873664363662666">"चल रही पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾à¤“ं की संखà¥â€à¤¯à¤¾ सीमित करें"</string>
- <string name="permdesc_setProcessLimit" msgid="7318061314040879542">"à¤à¤ªà¥à¤¸ को चलाई जाने वाली अधिकतम पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾à¤“ं को नियंतà¥à¤°à¤¿à¤¤ करने देता है. सामानà¥à¤¯ à¤à¤ªà¥à¤¸ के लिठकभी आवशà¥à¤¯à¤• नहीं होती."</string>
- <string name="permlab_setAlwaysFinish" msgid="550958507798796965">"पृषà¥à¤ à¤­à¥‚मि à¤à¤ªà¥â€à¤¸ को बलपूरà¥à¤µà¤• बंद करें"</string>
- <string name="permdesc_setAlwaysFinish" msgid="7471310652868841499">"à¤à¤ªà¥à¤¸ को यह नियंतà¥à¤°à¤¿à¤¤ करने देता है कि पृषà¥à¤ à¤­à¥‚मि में जाते ही गतिविधियां पूरà¥à¤£ हो जाती है या नही. सामानà¥à¤¯ à¤à¤ªà¥à¤¸ के लिठकभी आवशà¥à¤¯à¤•ता नहीं होती."</string>
+ <string name="permdesc_setProcessLimit" msgid="7318061314040879542">"à¤à¤ªà¥à¤¸ को चलाई जाने वाली अधिकतम पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾à¤“ं को नियंतà¥à¤°à¤¿à¤¤ करने देता है. सामानà¥à¤¯ à¤à¤ªà¥à¤¸ के लिठकभी आवशà¥à¤¯à¤• नहीं होती."</string>
+ <string name="permlab_setAlwaysFinish" msgid="550958507798796965">"पृषà¥à¤ à¤­à¥‚मि à¤à¤ªà¥à¤¸ को बलपूरà¥à¤µà¤• बंद करें"</string>
+ <string name="permdesc_setAlwaysFinish" msgid="7471310652868841499">"à¤à¤ªà¥à¤¸ को यह नियंतà¥à¤°à¤¿à¤¤ करने देता है कि पृषà¥à¤ à¤­à¥‚मि में जाते ही गतिविधियां पूरà¥à¤£ हो जाती है या नही. सामानà¥à¤¯ à¤à¤ªà¥à¤¸ के लिठकभी आवशà¥à¤¯à¤•ता नहीं होती."</string>
<string name="permlab_batteryStats" msgid="2789610673514103364">"बैटरी के आंकड़े पढ़ें"</string>
- <string name="permdesc_batteryStats" msgid="5897346582882915114">"à¤à¤ªà¥à¤¸ को वरà¥à¤¤à¤®à¤¾à¤¨ निमà¥à¤¨-सà¥à¤¤à¤°à¥€à¤¯ बैटरी उपयोग डेटा पढ़ने देती है. à¤à¤ªà¥à¤¸ को आपके दà¥à¤µà¤¾à¤°à¤¾ उपयोग किठजाने वाले à¤à¤ªà¥à¤¸ के बारे में विसà¥à¤¤à¥ƒà¤¤ जानकारी ढूंढने दे सकती है."</string>
+ <string name="permdesc_batteryStats" msgid="5897346582882915114">"à¤à¤ªà¥à¤¸ को वरà¥à¤¤à¤®à¤¾à¤¨ निमà¥à¤¨-सà¥à¤¤à¤°à¥€à¤¯ बैटरी उपयोग डेटा पढ़ने देती है. à¤à¤ªà¥à¤¸ को आपके दà¥à¤µà¤¾à¤°à¤¾ उपयोग किठजाने वाले à¤à¤ªà¥à¤¸ के बारे में विसà¥à¤¤à¥ƒà¤¤ जानकारी ढूंढने दे सकती है."</string>
<string name="permlab_updateBatteryStats" msgid="3719689764536379557">"बैटरी के आंकड़े संशोधित करें"</string>
- <string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"à¤à¤ªà¥â€à¤¸ को बैटरी के संकलित आंकड़ों को संशोधित करने देती है. सामानà¥â€à¤¯ à¤à¤ªà¥â€à¤¸ के दà¥à¤µà¤¾à¤°à¤¾ उपयोग करने के लिठनहीं."</string>
- <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"à¤à¤ªà¥à¤¸ संचालन आंकड़े पà¥à¤°à¤¾à¤ªà¥à¤¤ करें"</string>
- <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"à¤à¤ªà¥à¤¸ को संकलित à¤à¤ªà¥à¤¸ संचालन आंकड़े पà¥à¤°à¤¾à¤ªà¥à¤¤ करने देता है. सामानà¥à¤¯ à¤à¤ªà¥à¤¸ के दà¥à¤µà¤¾à¤°à¤¾ उपयोग के लिठनहीं."</string>
- <string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"à¤à¤ªà¥à¤¸ कारà¥à¤¯à¤µà¤¾à¤¹à¥€ के आंकड़े बदलें"</string>
- <string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"à¤à¤ªà¥à¤¸ को à¤à¤ªà¥à¤¸ कारà¥à¤¯à¤µà¤¾à¤¹à¥€ के à¤à¤•तà¥à¤°à¤¿à¤¤ आंकड़े बदलने देता है. सामानà¥à¤¯ à¤à¤ªà¥à¤¸ के दà¥à¤µà¤¾à¤°à¤¾ उपयोग करने के लिठनहीं."</string>
+ <string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"à¤à¤ªà¥à¤¸ को बैटरी के संकलित आंकड़ों को संशोधित करने देती है. सामानà¥â€à¤¯ à¤à¤ªà¥à¤¸ के दà¥à¤µà¤¾à¤°à¤¾ उपयोग करने के लिठनहीं."</string>
+ <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"à¤à¤ªà¥à¤¸ संचालन आंकड़े पà¥à¤°à¤¾à¤ªà¥à¤¤ करें"</string>
+ <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"à¤à¤ªà¥à¤¸ को संकलित à¤à¤ªà¥à¤¸ संचालन आंकड़े पà¥à¤°à¤¾à¤ªà¥à¤¤ करने देता है. सामानà¥à¤¯ à¤à¤ªà¥à¤¸ के दà¥à¤µà¤¾à¤°à¤¾ उपयोग के लिठनहीं."</string>
+ <string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"à¤à¤ªà¥à¤¸ कारà¥à¤¯à¤µà¤¾à¤¹à¥€ के आंकड़े बदलें"</string>
+ <string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"à¤à¤ªà¥à¤¸ को à¤à¤ªà¥à¤¸ कारà¥à¤¯à¤µà¤¾à¤¹à¥€ के à¤à¤•तà¥à¤°à¤¿à¤¤ आंकड़े बदलने देता है. सामानà¥à¤¯ à¤à¤ªà¥à¤¸ के दà¥à¤µà¤¾à¤°à¤¾ उपयोग करने के लिठनहीं."</string>
<string name="permlab_backup" msgid="470013022865453920">"सिसà¥â€à¤Ÿà¤® सà¥à¤°à¤•à¥à¤·à¤¾ नियंतà¥à¤°à¤¿à¤¤ और पà¥à¤¨à¤°à¥à¤¸à¥â€à¤¥à¤¾à¤ªà¤¿à¤¤ करें"</string>
- <string name="permdesc_backup" msgid="6912230525140589891">"à¤à¤ªà¥à¤¸ को सिसà¥à¤Ÿà¤® के बैकअप को नियंतà¥à¤°à¤¿à¤¤ और कà¥à¤°à¤¿à¤¯à¤¾à¤µà¤¿à¤§à¤¿ को पà¥à¤°à¥à¤¨à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤ करने देता है. सामानà¥â€à¤¯ à¤à¤ªà¥â€à¤¸ दà¥à¤µà¤¾à¤°à¤¾ उपयोग करने के लिठनहीं."</string>
+ <string name="permdesc_backup" msgid="6912230525140589891">"à¤à¤ªà¥à¤¸ को सिसà¥à¤Ÿà¤® के बैकअप को नियंतà¥à¤°à¤¿à¤¤ और कà¥à¤°à¤¿à¤¯à¤¾à¤µà¤¿à¤§à¤¿ को पà¥à¤°à¥à¤¨à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤ करने देता है. सामानà¥â€à¤¯ à¤à¤ªà¥à¤¸ दà¥à¤µà¤¾à¤°à¤¾ उपयोग करने के लिठनहीं."</string>
<string name="permlab_confirm_full_backup" msgid="5557071325804469102">"पूरà¥à¤£ सà¥à¤°à¤•à¥à¤·à¤¾ या पà¥à¤¨à¤°à¥à¤¸à¥â€à¤¥à¤¾à¤ªà¤¨à¤¾ कारà¥à¤¯à¤µà¤¾à¤¹à¥€ की पà¥à¤·à¥à¤Ÿà¤¿ करें"</string>
- <string name="permdesc_confirm_full_backup" msgid="1748762171637699562">"à¤à¤ªà¥â€à¤¸ को पूरà¥à¤£ बैकअप पà¥à¤·à¥à¤Ÿà¤¿à¤•रण UI लॉनà¥â€à¤š करने देता है. किसी à¤à¤ªà¥â€à¤¸ दà¥à¤µà¤¾à¤°à¤¾ उपयोग के लिठनहीं."</string>
+ <string name="permdesc_confirm_full_backup" msgid="1748762171637699562">"à¤à¤ªà¥à¤¸ को पूरà¥à¤£ बैकअप पà¥à¤·à¥à¤Ÿà¤¿à¤•रण UI लॉनà¥â€à¤š करने देता है. किसी à¤à¤ªà¥à¤¸ दà¥à¤µà¤¾à¤°à¤¾ उपयोग के लिठनहीं."</string>
<string name="permlab_internalSystemWindow" msgid="2148563628140193231">"अनधिकृत विंडो दिखाà¤à¤‚"</string>
- <string name="permdesc_internalSystemWindow" msgid="7458387759461466397">"किसी à¤à¤ªà¥â€à¤¸ को à¤à¤¸à¥€ विंडो बनाने देता है जिनका उपयोग आंतरिक सिसà¥â€à¤Ÿà¤® उपयोगकरà¥à¤¤à¤¾ इंटरफ़ेस दà¥à¤µà¤¾à¤°à¤¾ किया जाना है. सामानà¥â€à¤¯ à¤à¤ªà¥â€à¤¸ दà¥à¤µà¤¾à¤°à¤¾ उपयोग करने के लिठनहीं."</string>
- <string name="permlab_systemAlertWindow" msgid="3543347980839518613">"अनà¥â€à¤¯ à¤à¤ªà¥â€à¤¸ पर खींचें"</string>
- <string name="permdesc_systemAlertWindow" msgid="8584678381972820118">"à¤à¤ªà¥à¤¸ को अनà¥à¤¯ à¤à¤ªà¥à¤¸ के शीरà¥à¤· पर या उपयोगकरà¥à¤¤à¤¾ इंटरफ़ेस के हिसà¥à¤¸à¥‹à¤‚ पर आने देती है. वे किसी भी à¤à¤ªà¥à¤¸ में इंटरफ़ेस के आपके उपयोग में हसà¥à¤¤à¤•à¥à¤·à¥‡à¤ª कर सकते हैं, या उस चीज को बदल सकती है जिसके बारे में आपको लगता है कि आप उसे अनà¥à¤¯ à¤à¤ªà¥à¤¸ में देख रहे हैं."</string>
+ <string name="permdesc_internalSystemWindow" msgid="7458387759461466397">"किसी à¤à¤ªà¥à¤¸ को à¤à¤¸à¥€ विंडो बनाने देता है जिनका उपयोग आंतरिक सिसà¥â€à¤Ÿà¤® उपयोगकरà¥à¤¤à¤¾ इंटरफ़ेस दà¥à¤µà¤¾à¤°à¤¾ किया जाना है. सामानà¥â€à¤¯ à¤à¤ªà¥à¤¸ दà¥à¤µà¤¾à¤°à¤¾ उपयोग करने के लिठनहीं."</string>
+ <string name="permlab_systemAlertWindow" msgid="3543347980839518613">"अनà¥â€à¤¯ à¤à¤ªà¥à¤¸ पर खींचें"</string>
+ <string name="permdesc_systemAlertWindow" msgid="8584678381972820118">"à¤à¤ªà¥à¤¸ को अनà¥à¤¯ à¤à¤ªà¥à¤¸ के शीरà¥à¤· पर या उपयोगकरà¥à¤¤à¤¾ इंटरफ़ेस के हिसà¥à¤¸à¥‹à¤‚ पर आने देती है. वे किसी भी à¤à¤ªà¥à¤¸ में इंटरफ़ेस के आपके उपयोग में हसà¥à¤¤à¤•à¥à¤·à¥‡à¤ª कर सकते हैं, या उस चीज को बदल सकती है जिसके बारे में आपको लगता है कि आप उसे अनà¥à¤¯ à¤à¤ªà¥à¤¸ में देख रहे हैं."</string>
<string name="permlab_setAnimationScale" msgid="2805103241153907174">"वैशà¥à¤µà¤¿à¤• à¤à¤¨à¤¿à¤®à¥‡à¤¶à¤¨ गति बदलें"</string>
- <string name="permdesc_setAnimationScale" msgid="7690063428924343571">"à¤à¤ªà¥â€à¤¸ को किसी भी समय वैशà¥à¤µà¤¿à¤• à¤à¤¨à¤¿à¤®à¥‡à¤¶à¤¨ गति (तेज़ या धीमे à¤à¤¨à¤¿à¤®à¥‡à¤¶à¤¨) बदलने देता है."</string>
- <string name="permlab_manageAppTokens" msgid="1286505717050121370">"à¤à¤ªà¥â€à¤¸ टोकन पà¥à¤°à¤¬à¤‚धित करें"</string>
- <string name="permdesc_manageAppTokens" msgid="8043431713014395671">"à¤à¤ªà¥à¤¸ को उनके सामानà¥à¤¯ Z-कà¥à¤°à¤®à¥‹à¤‚ पर न पहà¥à¤‚चते हà¥à¤ उनके सà¥à¤µà¤¯à¤‚ के टोकन बनाने और पà¥à¤°à¤¬à¤‚धित करने देता है. सामानà¥â€à¤¯ à¤à¤ªà¥â€à¤¸ के लिठकभी भी आवशà¥â€à¤¯à¤• नहीं होना चाहिà¤."</string>
+ <string name="permdesc_setAnimationScale" msgid="7690063428924343571">"à¤à¤ªà¥à¤¸ को किसी भी समय वैशà¥à¤µà¤¿à¤• à¤à¤¨à¤¿à¤®à¥‡à¤¶à¤¨ गति (तेज़ या धीमे à¤à¤¨à¤¿à¤®à¥‡à¤¶à¤¨) बदलने देता है."</string>
+ <string name="permlab_manageAppTokens" msgid="1286505717050121370">"à¤à¤ªà¥à¤¸ टोकन पà¥à¤°à¤¬à¤‚धित करें"</string>
+ <string name="permdesc_manageAppTokens" msgid="8043431713014395671">"à¤à¤ªà¥à¤¸ को उनके सामानà¥à¤¯ Z-कà¥à¤°à¤®à¥‹à¤‚ पर न पहà¥à¤‚चते हà¥à¤ उनके सà¥à¤µà¤¯à¤‚ के टोकन बनाने और पà¥à¤°à¤¬à¤‚धित करने देता है. सामानà¥â€à¤¯ à¤à¤ªà¥à¤¸ के लिठकभी भी आवशà¥â€à¤¯à¤• नहीं होना चाहिà¤."</string>
<string name="permlab_freezeScreen" msgid="4708181184441880175">"सà¥à¤•à¥à¤°à¥€à¤¨ को सà¥à¤¥à¤¿à¤° करें"</string>
- <string name="permdesc_freezeScreen" msgid="8558923789222670064">"पूरà¥à¤£-सà¥à¤•à¥à¤°à¥€à¤¨ संकà¥à¤°à¤®à¤£ के लिठà¤à¤ªà¥à¤¸ को असà¥à¤¥à¤¾à¤¯à¥€ रूप से सà¥à¤•à¥à¤°à¥€à¤¨ को सà¥à¤¥à¤¿à¤° करने देता है."</string>
+ <string name="permdesc_freezeScreen" msgid="8558923789222670064">"पूरà¥à¤£-सà¥à¤•à¥à¤°à¥€à¤¨ संकà¥à¤°à¤®à¤£ के लिठà¤à¤ªà¥à¤¸ को असà¥à¤¥à¤¾à¤¯à¥€ रूप से सà¥à¤•à¥à¤°à¥€à¤¨ को सà¥à¤¥à¤¿à¤° करने देता है."</string>
<string name="permlab_injectEvents" msgid="1378746584023586600">"कà¥à¤‚जियों और नियंतà¥à¤°à¤£ बटन को दबाà¤à¤‚"</string>
- <string name="permdesc_injectEvents" product="tablet" msgid="206352565599968632">"à¤à¤ªà¥â€à¤¸ को सà¥â€à¤µà¤¯à¤‚ के इनपà¥à¤Ÿ ईवेंट (कà¥à¤‚जी दबाना, आदि) को अनà¥â€à¤¯ à¤à¤ªà¥â€à¤¸ को वितरित करने देता है. दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ à¤à¤ªà¥â€à¤¸ टेबलेट को टेक ओवर करने में इसका उपयोग कर सकते हैं."</string>
- <string name="permdesc_injectEvents" product="default" msgid="653128057572326253">"à¤à¤ªà¥â€à¤¸ को सà¥â€à¤µà¤¯à¤‚ के इनपà¥à¤Ÿ ईवेंट (कà¥à¤‚जी दबाना, आदि) अनà¥â€à¤¯ à¤à¤ªà¥â€à¤¸ को वितरित करने देता है. दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ à¤à¤ªà¥â€à¤¸ इसका उपयोग फ़ोन को टेक ओवर करने में कर सकते हैं."</string>
+ <string name="permdesc_injectEvents" product="tablet" msgid="206352565599968632">"à¤à¤ªà¥à¤¸ को सà¥â€à¤µà¤¯à¤‚ के इनपà¥à¤Ÿ ईवेंट (कà¥à¤‚जी दबाना, आदि) को अनà¥â€à¤¯ à¤à¤ªà¥à¤¸ को वितरित करने देता है. दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ à¤à¤ªà¥à¤¸ टेबलेट को टेक ओवर करने में इसका उपयोग कर सकते हैं."</string>
+ <string name="permdesc_injectEvents" product="default" msgid="653128057572326253">"à¤à¤ªà¥à¤¸ को सà¥â€à¤µà¤¯à¤‚ के इनपà¥à¤Ÿ ईवेंट (कà¥à¤‚जी दबाना, आदि) अनà¥â€à¤¯ à¤à¤ªà¥à¤¸ को वितरित करने देता है. दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ à¤à¤ªà¥à¤¸ इसका उपयोग फ़ोन को टेक ओवर करने में कर सकते हैं."</string>
<string name="permlab_readInputState" msgid="469428900041249234">"आप जो भी लिखते हैं और जो कारà¥à¤¯à¤µà¤¾à¤¹à¤¿à¤¯à¤¾à¤‚ करते हैं उनà¥â€à¤¹à¥‡à¤‚ रिकॉरà¥à¤¡ करें"</string>
- <string name="permdesc_readInputState" msgid="8387754901688728043">"à¤à¤ªà¥à¤¸ को अनà¥à¤¯ à¤à¤ªà¥à¤¸ के साथ सहभागिता करते समय भी आपके दà¥à¤µà¤¾à¤°à¤¾ दबाई जाने वाली कà¥à¤‚जियां देखने देता है (जैसे कोई पासवरà¥à¤¡ लिखना). सामानà¥â€à¤¯ à¤à¤ªà¥â€à¤¸ के लिठकभी भी आवशà¥â€à¤¯à¤• नहीं होना चाहिà¤."</string>
+ <string name="permdesc_readInputState" msgid="8387754901688728043">"à¤à¤ªà¥à¤¸ को अनà¥à¤¯ à¤à¤ªà¥à¤¸ के साथ सहभागिता करते समय भी आपके दà¥à¤µà¤¾à¤°à¤¾ दबाई जाने वाली कà¥à¤‚जियां देखने देता है (जैसे कोई पासवरà¥à¤¡ लिखना). सामानà¥â€à¤¯ à¤à¤ªà¥à¤¸ के लिठकभी भी आवशà¥â€à¤¯à¤• नहीं होना चाहिà¤."</string>
<string name="permlab_bindInputMethod" msgid="3360064620230515776">"किसी इनपà¥à¤Ÿ विधि से आबदà¥à¤§ करें"</string>
- <string name="permdesc_bindInputMethod" msgid="3250440322807286331">"धारक को किसी इनपà¥à¤Ÿ विधि के शीरà¥à¤·-सà¥â€à¤¤à¤° इंटरफ़ेस से आबदà¥à¤§ होने देता है. सामानà¥â€à¤¯ à¤à¤ªà¥â€à¤¸ के लिठकभी भी आवशà¥â€à¤¯à¤• नहीं होना चाहिà¤."</string>
+ <string name="permdesc_bindInputMethod" msgid="3250440322807286331">"धारक को किसी इनपà¥à¤Ÿ विधि के शीरà¥à¤·-सà¥â€à¤¤à¤° इंटरफ़ेस से आबदà¥à¤§ होने देता है. सामानà¥â€à¤¯ à¤à¤ªà¥à¤¸ के लिठकभी भी आवशà¥â€à¤¯à¤• नहीं होना चाहिà¤."</string>
<string name="permlab_bindAccessibilityService" msgid="5357733942556031593">"आसान तरीका सेवा से आबदà¥à¤§ करें"</string>
- <string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"धारक को किसी आसान तरीका सेवा के शीरà¥à¤·-सà¥â€à¤¤à¤° इंटरफ़ेस से आबदà¥à¤§ होने देता है. सामानà¥â€à¤¯ à¤à¤ªà¥â€à¤¸ के लिठकभी भी आवशà¥â€à¤¯à¤• नहीं होना चाहिà¤."</string>
+ <string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"धारक को किसी आसान तरीका सेवा के शीरà¥à¤·-सà¥â€à¤¤à¤° इंटरफ़ेस से आबदà¥à¤§ होने देता है. सामानà¥â€à¤¯ à¤à¤ªà¥à¤¸ के लिठकभी भी आवशà¥â€à¤¯à¤• नहीं होना चाहिà¤."</string>
<string name="permlab_bindPrintService" msgid="8462815179572748761">"पà¥à¤°à¤¿à¤‚ट सेवा से आबदà¥à¤§ करें"</string>
- <string name="permdesc_bindPrintService" msgid="7960067623209111135">"धारक को किसी पà¥à¤°à¤¿à¤‚ट सेवा के शीरà¥à¤·-सà¥â€à¤¤à¤° इंटरफ़ेस से आबदà¥à¤§ होने देता है. सामानà¥â€à¤¯ à¤à¤ªà¥â€à¤¸ के लिठकभी भी आवशà¥â€à¤¯à¤• नहीं होना चाहिà¤."</string>
+ <string name="permdesc_bindPrintService" msgid="7960067623209111135">"धारक को किसी पà¥à¤°à¤¿à¤‚ट सेवा के शीरà¥à¤·-सà¥â€à¤¤à¤° इंटरफ़ेस से आबदà¥à¤§ होने देता है. सामानà¥â€à¤¯ à¤à¤ªà¥à¤¸ के लिठकभी भी आवशà¥â€à¤¯à¤• नहीं होना चाहिà¤."</string>
<string name="permlab_bindPrintSpoolerService" msgid="6807762783744125954">"पà¥à¤°à¤¿à¤‚ट सà¥à¤ªà¥‚लर सेवा से आबदà¥à¤§ करें"</string>
- <string name="permdesc_bindPrintSpoolerService" msgid="3680552285933318372">"धारक को पà¥à¤°à¤¿à¤‚ट सà¥à¤ªà¥‚लर सेवा के शीरà¥à¤·-सà¥â€à¤¤à¤° इंटरफ़ेस से आबदà¥à¤§ होने देता है. सामानà¥â€à¤¯ à¤à¤ªà¥â€à¤¸ के लिठकभी भी आवशà¥â€à¤¯à¤• नहीं होना चाहिà¤."</string>
+ <string name="permdesc_bindPrintSpoolerService" msgid="3680552285933318372">"धारक को पà¥à¤°à¤¿à¤‚ट सà¥à¤ªà¥‚लर सेवा के शीरà¥à¤·-सà¥â€à¤¤à¤° इंटरफ़ेस से आबदà¥à¤§ होने देता है. सामानà¥â€à¤¯ à¤à¤ªà¥à¤¸ के लिठकभी भी आवशà¥â€à¤¯à¤• नहीं होना चाहिà¤."</string>
<string name="permlab_bindNfcService" msgid="2752731300419410724">"NFC सेवा से आबदà¥à¤§ रहें"</string>
- <string name="permdesc_bindNfcService" msgid="6120647629174066862">"धारक को à¤à¤¸à¥‡ à¤à¤ªà¥à¤¸ से आबदà¥à¤§ रहने देता है जो NFC कारà¥à¤¡ का अनà¥à¤•रण कर रहे हैं. सामानà¥à¤¯ à¤à¤ªà¥à¤¸ के लिठकभी भी आवशà¥à¤¯à¤• नहीं होना चाहिà¤."</string>
+ <string name="permdesc_bindNfcService" msgid="6120647629174066862">"धारक को à¤à¤¸à¥‡ à¤à¤ªà¥à¤¸ से आबदà¥à¤§ रहने देता है जो NFC कारà¥à¤¡ का अनà¥à¤•रण कर रहे हैं. सामानà¥à¤¯ à¤à¤ªà¥à¤¸ के लिठकभी भी आवशà¥à¤¯à¤• नहीं होना चाहिà¤."</string>
<string name="permlab_bindTextService" msgid="7358378401915287938">"किसी पाठ सेवा पर बने रहें"</string>
- <string name="permdesc_bindTextService" msgid="8151968910973998670">"धारक को किसी पाठ सेवा (उदा. SpellCheckerService) के शीरà¥à¤·-सà¥â€à¤¤à¤° इंटरफ़ेस पर आबदà¥à¤§ होने देता है. सामानà¥â€à¤¯ à¤à¤ªà¥â€à¤¸ के लिठकभी भी आवशà¥â€à¤¯à¤• नहीं होना चाहिà¤."</string>
+ <string name="permdesc_bindTextService" msgid="8151968910973998670">"धारक को किसी पाठ सेवा (उदा. SpellCheckerService) के शीरà¥à¤·-सà¥â€à¤¤à¤° इंटरफ़ेस पर आबदà¥à¤§ होने देता है. सामानà¥â€à¤¯ à¤à¤ªà¥à¤¸ के लिठकभी भी आवशà¥â€à¤¯à¤• नहीं होना चाहिà¤."</string>
<string name="permlab_bindVpnService" msgid="4708596021161473255">"किसी VPN सेवा से आबदà¥à¤§ करें"</string>
- <string name="permdesc_bindVpnService" msgid="2067845564581693905">"धारक को किसी Vpn सेवा के शीरà¥à¤·-सà¥â€à¤¤à¤° इंटरफ़ेस से आबदà¥à¤§ होने देता है. सामानà¥â€à¤¯ à¤à¤ªà¥â€à¤¸ के लिठकभी भी आवशà¥â€à¤¯à¤• नहीं होना चाहिà¤."</string>
+ <string name="permdesc_bindVpnService" msgid="2067845564581693905">"धारक को किसी Vpn सेवा के शीरà¥à¤·-सà¥â€à¤¤à¤° इंटरफ़ेस से आबदà¥à¤§ होने देता है. सामानà¥â€à¤¯ à¤à¤ªà¥à¤¸ के लिठकभी भी आवशà¥â€à¤¯à¤• नहीं होना चाहिà¤."</string>
<string name="permlab_bindWallpaper" msgid="8716400279937856462">"वॉलपेपर से आबदà¥à¤§ करें"</string>
- <string name="permdesc_bindWallpaper" msgid="7108428692595491668">"धारक को किसी वॉलपेपर के शीरà¥à¤·-सà¥â€à¤¤à¤° इंटरफ़ेस से आबदà¥à¤§ होने देता है. सामानà¥â€à¤¯ à¤à¤ªà¥â€à¤¸ के लिठकभी भी आवशà¥â€à¤¯à¤• नहीं होना चाहिà¤."</string>
+ <string name="permdesc_bindWallpaper" msgid="7108428692595491668">"धारक को किसी वॉलपेपर के शीरà¥à¤·-सà¥â€à¤¤à¤° इंटरफ़ेस से आबदà¥à¤§ होने देता है. सामानà¥â€à¤¯ à¤à¤ªà¥à¤¸ के लिठकभी भी आवशà¥â€à¤¯à¤• नहीं होना चाहिà¤."</string>
<string name="permlab_bindRemoteViews" msgid="5697987759897367099">"किसी विजेट सेवा से आबदà¥à¤§ करें"</string>
- <string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"धारक को किसी विजेट सेवा के शीरà¥à¤·-सà¥â€à¤¤à¤° इंटरफ़ेस से आबदà¥à¤§ होने देता है. सामानà¥â€à¤¯ à¤à¤ªà¥â€à¤¸ के लिठकभी भी आवशà¥â€à¤¯à¤• नहीं होना चाहिà¤."</string>
+ <string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"धारक को किसी विजेट सेवा के शीरà¥à¤·-सà¥â€à¤¤à¤° इंटरफ़ेस से आबदà¥à¤§ होने देता है. सामानà¥â€à¤¯ à¤à¤ªà¥à¤¸ के लिठकभी भी आवशà¥â€à¤¯à¤• नहीं होना चाहिà¤."</string>
<string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"किसी उपकरण वà¥â€à¤¯à¤µà¤¸à¥â€à¤¥à¤¾à¤ªà¤• के साथ सहभागिता करें"</string>
- <string name="permdesc_bindDeviceAdmin" msgid="569715419543907930">"धारक को किसी उपकरण वà¥â€à¤¯à¤µà¤¸à¥â€à¤¥à¤¾à¤ªà¤• को उदà¥à¤¦à¥‡à¤¶à¥à¤¯ भेजने देता है. सामानà¥â€à¤¯ à¤à¤ªà¥â€à¤¸ के लिठकभी भी आवशà¥â€à¤¯à¤• नहीं होना चाहिà¤."</string>
+ <string name="permdesc_bindDeviceAdmin" msgid="569715419543907930">"धारक को किसी उपकरण वà¥â€à¤¯à¤µà¤¸à¥â€à¤¥à¤¾à¤ªà¤• को उदà¥à¤¦à¥‡à¤¶à¥à¤¯ भेजने देता है. सामानà¥â€à¤¯ à¤à¤ªà¥à¤¸ के लिठकभी भी आवशà¥â€à¤¯à¤• नहीं होना चाहिà¤."</string>
<string name="permlab_manageDeviceAdmins" msgid="4248828900045808722">"उपकरण उपकरण सà¥à¤šà¤¾à¤°à¥‚ ढ़ंग से चलाने वाले को जोड़ें या निकालें"</string>
- <string name="permdesc_manageDeviceAdmins" msgid="5025608167709942485">"धारक को सकà¥à¤°à¤¿à¤¯ डिवाइस वà¥à¤¯à¤µà¤¸à¥à¤¥à¤¾à¤ªà¤•ों को जोड़ने या निकालने देता है. सामानà¥à¤¯ à¤à¤ªà¥à¤¸ के लिठकभी भी आवशà¥à¤¯à¤• नहीं होना चाहिà¤."</string>
+ <string name="permdesc_manageDeviceAdmins" msgid="5025608167709942485">"धारक को सकà¥à¤°à¤¿à¤¯ डिवाइस वà¥à¤¯à¤µà¤¸à¥à¤¥à¤¾à¤ªà¤•ों को जोड़ने या निकालने देता है. सामानà¥à¤¯ à¤à¤ªà¥à¤¸ के लिठकभी भी आवशà¥à¤¯à¤• नहीं होना चाहिà¤."</string>
<string name="permlab_setOrientation" msgid="3365947717163866844">"सà¥â€à¤•à¥à¤°à¥€à¤¨ अभिविनà¥â€à¤¯à¤¾à¤¸ बदलें"</string>
- <string name="permdesc_setOrientation" msgid="3046126619316671476">"à¤à¤ªà¥â€à¤¸ को किसी भी समय सà¥â€à¤•à¥à¤°à¥€à¤¨ का रोटेशन बदलने देता है. सामानà¥â€à¤¯ à¤à¤ªà¥â€à¤¸ के लिठकभी भी आवशà¥â€à¤¯à¤• नहीं होना चाहिà¤."</string>
+ <string name="permdesc_setOrientation" msgid="3046126619316671476">"à¤à¤ªà¥à¤¸ को किसी भी समय सà¥â€à¤•à¥à¤°à¥€à¤¨ का रोटेशन बदलने देता है. सामानà¥â€à¤¯ à¤à¤ªà¥à¤¸ के लिठकभी भी आवशà¥â€à¤¯à¤• नहीं होना चाहिà¤."</string>
<string name="permlab_setPointerSpeed" msgid="9175371613322562934">"सूचक गति बदलें"</string>
- <string name="permdesc_setPointerSpeed" msgid="6866563234274104233">"à¤à¤ªà¥à¤¸ को माउस या टà¥à¤°à¥ˆà¤•पैड सूचक गति को किसी भी समय बदलने देता है. सामानà¥â€à¤¯ à¤à¤ªà¥â€à¤¸ के लिठकभी भी आवशà¥â€à¤¯à¤• नहीं होना चाहिà¤."</string>
+ <string name="permdesc_setPointerSpeed" msgid="6866563234274104233">"à¤à¤ªà¥à¤¸ को माउस या टà¥à¤°à¥ˆà¤•पैड सूचक गति को किसी भी समय बदलने देता है. सामानà¥â€à¤¯ à¤à¤ªà¥à¤¸ के लिठकभी भी आवशà¥â€à¤¯à¤• नहीं होना चाहिà¤."</string>
<string name="permlab_setKeyboardLayout" msgid="4778731703600909340">"कीबोरà¥à¤¡ लेआउट बदलें"</string>
- <string name="permdesc_setKeyboardLayout" msgid="8480016771134175879">"à¤à¤ªà¥â€à¤¸ को कीबोरà¥à¤¡ लेआउट बदलने देता है. सामानà¥â€à¤¯ à¤à¤ªà¥â€à¤¸ के लिठकभी आवशà¥â€à¤¯à¤• नहीं है."</string>
- <string name="permlab_signalPersistentProcesses" msgid="4539002991947376659">"à¤à¤ªà¥à¤¸ को Linux सिगà¥à¤¨à¤² भेजें"</string>
- <string name="permdesc_signalPersistentProcesses" msgid="4896992079182649141">"à¤à¤ªà¥â€à¤¸ को यह अनà¥à¤°à¥‹à¤§ करने देता है कि दिया गया सिगà¥à¤¨à¤² सभी जारी पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾à¤“ं को भेजा जाà¤."</string>
- <string name="permlab_persistentActivity" msgid="8841113627955563938">"à¤à¤ªà¥â€à¤¸ को हमेशा चलने वाला बनाà¤à¤‚"</string>
- <string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"à¤à¤ªà¥â€à¤¸ को सà¥à¤®à¥ƒà¤¤à¤¿ में सà¥â€à¤µà¤¯à¤‚ के कà¥à¤› हिसà¥à¤¸à¥‹à¤‚ को लगातार बनाने की अनà¥à¤®à¤¤à¤¿ देता है. यह अनà¥â€à¤¯ à¤à¤ªà¥à¤¸ के लिठउपलबà¥â€à¤§ सà¥â€à¤®à¥ƒà¤¤à¤¿ को सीमित कर टेबलेट को धीमा कर सकता है."</string>
- <string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"à¤à¤ªà¥â€à¤¸ को सà¥à¤®à¥ƒà¤¤à¤¿ में सà¥â€à¤µà¤¯à¤‚ के कà¥à¤› हिसà¥à¤¸à¥‹à¤‚ को लगातार बनाने देता है. यह अनà¥â€à¤¯ à¤à¤ªà¥à¤¸ के लिठउपलबà¥â€à¤§ सà¥â€à¤®à¥ƒà¤¤à¤¿ को सीमित कर फ़ोन को धीमा कर सकता है."</string>
- <string name="permlab_deletePackages" msgid="184385129537705938">"à¤à¤ªà¥â€à¤¸ हटाà¤à¤‚"</string>
- <string name="permdesc_deletePackages" msgid="7411480275167205081">"à¤à¤ªà¥à¤¸ को Android पैकेज हटाने देता है. दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ à¤à¤ªà¥à¤¸ इसका उपयोग महतà¥à¤µà¤ªà¥‚रà¥à¤£ à¤à¤ªà¥à¤¸ हटाने के लिठकर सकते हैं."</string>
- <string name="permlab_clearAppUserData" msgid="274109191845842756">"अनà¥â€à¤¯ à¤à¤ªà¥â€à¤¸ का डेटा हटाà¤à¤‚"</string>
- <string name="permdesc_clearAppUserData" msgid="4625323684125459488">"à¤à¤ªà¥à¤¸ को उपयोगकरà¥à¤¤à¤¾ डेटा साफ़ करने देता है."</string>
- <string name="permlab_deleteCacheFiles" msgid="3128665571837408675">"अनà¥â€à¤¯ à¤à¤ªà¥â€à¤¸ के संचय हटाà¤à¤‚"</string>
- <string name="permdesc_deleteCacheFiles" msgid="3812998599006730196">"à¤à¤ªà¥à¤¸ को संचय फ़ाइलें हटाने देता है."</string>
- <string name="permlab_getPackageSize" msgid="7472921768357981986">"à¤à¤ªà¥à¤¸ संगà¥à¤°à¤¹à¤£ सà¥à¤¥à¤¾à¤¨ मापें"</string>
- <string name="permdesc_getPackageSize" msgid="3921068154420738296">"à¤à¤ªà¥à¤¸ को उसका कोड, डेटा, और संचय आकारों को पà¥à¤°à¤¾à¤ªà¥à¤¤ करने देता है"</string>
- <string name="permlab_installPackages" msgid="2199128482820306924">"सीधे à¤à¤ªà¥â€à¤¸ इंसà¥â€à¤Ÿà¥‰à¤² करें"</string>
- <string name="permdesc_installPackages" msgid="5628530972548071284">"à¤à¤ª को नठया नई जानकारी वाले Android पैकेज इंसà¥à¤Ÿà¥‰à¤² करने देता है. दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ à¤à¤ªà¥à¤¸ इसका उपयोग अनियंतà¥à¤°à¤¿à¤¤ रूप से सशकà¥à¤¤ अनà¥à¤®à¤¤à¤¿à¤¯à¥‹à¤‚ वाले नठà¤à¤ªà¥à¤¸ जोड़ने में कर सकते हैं."</string>
- <string name="permlab_clearAppCache" msgid="7487279391723526815">"सभी à¤à¤ªà¥à¤¸ संचय डेटा हटाà¤à¤‚"</string>
- <string name="permdesc_clearAppCache" product="tablet" msgid="8974640871945434565">"à¤à¤ªà¥à¤¸ को अनà¥à¤¯ à¤à¤ªà¥à¤¸ की संचय निरà¥à¤¦à¥‡à¤¶à¤¿à¤•ाओं में से फ़ाइलें हटाकर टेबलेट संगà¥à¤°à¤¹à¤£ को खाली करने देती है. इससे अनà¥à¤¯ à¤à¤ªà¥à¤¸ अधिक धीमे पà¥à¤°à¤¾à¤°à¤‚भ हो सकते हैं कà¥à¤¯à¥‹à¤‚कि उनà¥à¤¹à¥‡à¤‚ अपना डेटा पà¥à¤¨à¤°à¥à¤ªà¥à¤°à¤¾à¤ªà¥à¤¤ करने की आवशà¥à¤¯à¤•ता होती है."</string>
- <string name="permdesc_clearAppCache" product="default" msgid="2459441021956436779">"à¤à¤ªà¥à¤¸ को अनà¥à¤¯ à¤à¤ªà¥à¤¸ की संचय निरà¥à¤¦à¥‡à¤¶à¤¿à¤•ाओं में से फ़ाइलें हटाकर फ़ोन संगà¥à¤°à¤¹à¤£ को खाली करने देती है. इससे अनà¥à¤¯ à¤à¤ªà¥à¤¸ अधिक धीमे पà¥à¤°à¤¾à¤°à¤‚भ हो सकते हैं कà¥à¤¯à¥‹à¤‚कि उनà¥à¤¹à¥‡à¤‚ अपना डेटा पà¥à¤¨à¤°à¥à¤ªà¥à¤°à¤¾à¤ªà¥à¤¤ करने की आवशà¥à¤¯à¤•ता होती है."</string>
- <string name="permlab_movePackage" msgid="3289890271645921411">"à¤à¤ªà¥â€à¤¸ संसाधनों को ले जाà¤à¤‚"</string>
- <string name="permdesc_movePackage" msgid="319562217778244524">"à¤à¤ªà¥â€à¤¸ को à¤à¤ªà¥â€à¤¸ संसाधनों को आंतरिक से बाहरी मीडिया में और इसके विपरीत ले जाने देता है."</string>
+ <string name="permdesc_setKeyboardLayout" msgid="8480016771134175879">"à¤à¤ªà¥à¤¸ को कीबोरà¥à¤¡ लेआउट बदलने देता है. सामानà¥â€à¤¯ à¤à¤ªà¥à¤¸ के लिठकभी आवशà¥â€à¤¯à¤• नहीं है."</string>
+ <string name="permlab_signalPersistentProcesses" msgid="4539002991947376659">"à¤à¤ªà¥à¤¸ को Linux सिगà¥à¤¨à¤² भेजें"</string>
+ <string name="permdesc_signalPersistentProcesses" msgid="4896992079182649141">"à¤à¤ªà¥à¤¸ को यह अनà¥à¤°à¥‹à¤§ करने देता है कि दिया गया सिगà¥à¤¨à¤² सभी जारी पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾à¤“ं को भेजा जाà¤."</string>
+ <string name="permlab_persistentActivity" msgid="8841113627955563938">"à¤à¤ªà¥à¤¸ को हमेशा चलने वाला बनाà¤à¤‚"</string>
+ <string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"à¤à¤ªà¥à¤¸ को सà¥à¤®à¥ƒà¤¤à¤¿ में सà¥â€à¤µà¤¯à¤‚ के कà¥à¤› हिसà¥à¤¸à¥‹à¤‚ को लगातार बनाने की अनà¥à¤®à¤¤à¤¿ देता है. यह अनà¥â€à¤¯ à¤à¤ªà¥à¤¸ के लिठउपलबà¥â€à¤§ सà¥â€à¤®à¥ƒà¤¤à¤¿ को सीमित कर टेबलेट को धीमा कर सकता है."</string>
+ <string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"à¤à¤ªà¥à¤¸ को सà¥à¤®à¥ƒà¤¤à¤¿ में सà¥â€à¤µà¤¯à¤‚ के कà¥à¤› हिसà¥à¤¸à¥‹à¤‚ को लगातार बनाने देता है. यह अनà¥â€à¤¯ à¤à¤ªà¥à¤¸ के लिठउपलबà¥â€à¤§ सà¥â€à¤®à¥ƒà¤¤à¤¿ को सीमित कर फ़ोन को धीमा कर सकता है."</string>
+ <string name="permlab_deletePackages" msgid="184385129537705938">"à¤à¤ªà¥à¤¸ हटाà¤à¤‚"</string>
+ <string name="permdesc_deletePackages" msgid="7411480275167205081">"à¤à¤ªà¥à¤¸ को Android पैकेज हटाने देता है. दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ à¤à¤ªà¥à¤¸ इसका उपयोग महतà¥à¤µà¤ªà¥‚रà¥à¤£ à¤à¤ªà¥à¤¸ हटाने के लिठकर सकते हैं."</string>
+ <string name="permlab_clearAppUserData" msgid="274109191845842756">"अनà¥â€à¤¯ à¤à¤ªà¥à¤¸ का डेटा हटाà¤à¤‚"</string>
+ <string name="permdesc_clearAppUserData" msgid="4625323684125459488">"à¤à¤ªà¥à¤¸ को उपयोगकरà¥à¤¤à¤¾ डेटा साफ़ करने देता है."</string>
+ <string name="permlab_deleteCacheFiles" msgid="3128665571837408675">"अनà¥â€à¤¯ à¤à¤ªà¥à¤¸ के संचय हटाà¤à¤‚"</string>
+ <string name="permdesc_deleteCacheFiles" msgid="3812998599006730196">"à¤à¤ªà¥à¤¸ को संचय फ़ाइलें हटाने देता है."</string>
+ <string name="permlab_getPackageSize" msgid="7472921768357981986">"à¤à¤ªà¥à¤¸ संगà¥à¤°à¤¹à¤£ सà¥à¤¥à¤¾à¤¨ मापें"</string>
+ <string name="permdesc_getPackageSize" msgid="3921068154420738296">"à¤à¤ªà¥à¤¸ को उसका कोड, डेटा, और संचय आकारों को पà¥à¤°à¤¾à¤ªà¥à¤¤ करने देता है"</string>
+ <string name="permlab_installPackages" msgid="2199128482820306924">"सीधे à¤à¤ªà¥à¤¸ इंसà¥â€à¤Ÿà¥‰à¤² करें"</string>
+ <string name="permdesc_installPackages" msgid="5628530972548071284">"à¤à¤ª को नठया नई जानकारी वाले Android पैकेज इंसà¥à¤Ÿà¥‰à¤² करने देता है. दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ à¤à¤ªà¥à¤¸ इसका उपयोग अनियंतà¥à¤°à¤¿à¤¤ रूप से सशकà¥à¤¤ अनà¥à¤®à¤¤à¤¿à¤¯à¥‹à¤‚ वाले नठà¤à¤ªà¥à¤¸ जोड़ने में कर सकते हैं."</string>
+ <string name="permlab_clearAppCache" msgid="7487279391723526815">"सभी à¤à¤ªà¥à¤¸ संचय डेटा हटाà¤à¤‚"</string>
+ <string name="permdesc_clearAppCache" product="tablet" msgid="8974640871945434565">"à¤à¤ªà¥à¤¸ को अनà¥à¤¯ à¤à¤ªà¥à¤¸ की संचय निरà¥à¤¦à¥‡à¤¶à¤¿à¤•ाओं में से फ़ाइलें हटाकर टेबलेट संगà¥à¤°à¤¹à¤£ को खाली करने देती है. इससे अनà¥à¤¯ à¤à¤ªà¥à¤¸ अधिक धीमे पà¥à¤°à¤¾à¤°à¤‚भ हो सकते हैं कà¥à¤¯à¥‹à¤‚कि उनà¥à¤¹à¥‡à¤‚ अपना डेटा पà¥à¤¨à¤°à¥à¤ªà¥à¤°à¤¾à¤ªà¥à¤¤ करने की आवशà¥à¤¯à¤•ता होती है."</string>
+ <string name="permdesc_clearAppCache" product="default" msgid="2459441021956436779">"à¤à¤ªà¥à¤¸ को अनà¥à¤¯ à¤à¤ªà¥à¤¸ की संचय निरà¥à¤¦à¥‡à¤¶à¤¿à¤•ाओं में से फ़ाइलें हटाकर फ़ोन संगà¥à¤°à¤¹à¤£ को खाली करने देती है. इससे अनà¥à¤¯ à¤à¤ªà¥à¤¸ अधिक धीमे पà¥à¤°à¤¾à¤°à¤‚भ हो सकते हैं कà¥à¤¯à¥‹à¤‚कि उनà¥à¤¹à¥‡à¤‚ अपना डेटा पà¥à¤¨à¤°à¥à¤ªà¥à¤°à¤¾à¤ªà¥à¤¤ करने की आवशà¥à¤¯à¤•ता होती है."</string>
+ <string name="permlab_movePackage" msgid="3289890271645921411">"à¤à¤ªà¥à¤¸ संसाधनों को ले जाà¤à¤‚"</string>
+ <string name="permdesc_movePackage" msgid="319562217778244524">"à¤à¤ªà¥à¤¸ को à¤à¤ªà¥à¤¸ संसाधनों को आंतरिक से बाहरी मीडिया में और इसके विपरीत ले जाने देता है."</string>
<string name="permlab_readLogs" msgid="6615778543198967614">"संवेदनशील लॉग डेटा पढ़ें"</string>
- <string name="permdesc_readLogs" product="tablet" msgid="82061313293455151">"किसी à¤à¤ªà¥â€à¤¸ को सिसà¥â€à¤Ÿà¤® की विभिनà¥â€à¤¨ लॉग फ़ाइलों से पढ़ने देता है. संभावित रूप से वà¥à¤¯à¤•à¥à¤¤à¤¿à¤—त या निजी जानकारी शामिल करते हà¥à¤, टेबलेट के साथ आप कà¥â€à¤¯à¤¾ कर रहे हैं इस बारे में सामानà¥â€à¤¯ जानकारी खोजने देता है."</string>
- <string name="permdesc_readLogs" product="default" msgid="2063438140241560443">"à¤à¤ªà¥â€à¤¸ को सिसà¥â€à¤Ÿà¤® की विभिनà¥â€à¤¨ लॉग फ़ाइलें पढ़ने देता है. संभावित रूप से वà¥à¤¯à¤•à¥à¤¤à¤¿à¤—त या निजी जानकारी सहित, यह इसे इस बारे में सामानà¥à¤¯ जानकारी खोजने देता है कि आप फ़ोन से कà¥â€à¤¯à¤¾ कर रहे हैं."</string>
+ <string name="permdesc_readLogs" product="tablet" msgid="82061313293455151">"किसी à¤à¤ªà¥à¤¸ को सिसà¥â€à¤Ÿà¤® की विभिनà¥â€à¤¨ लॉग फ़ाइलों से पढ़ने देता है. संभावित रूप से वà¥à¤¯à¤•à¥à¤¤à¤¿à¤—त या निजी जानकारी शामिल करते हà¥à¤, टेबलेट के साथ आप कà¥â€à¤¯à¤¾ कर रहे हैं इस बारे में सामानà¥â€à¤¯ जानकारी खोजने देता है."</string>
+ <string name="permdesc_readLogs" product="default" msgid="2063438140241560443">"à¤à¤ªà¥à¤¸ को सिसà¥â€à¤Ÿà¤® की विभिनà¥â€à¤¨ लॉग फ़ाइलें पढ़ने देता है. संभावित रूप से वà¥à¤¯à¤•à¥à¤¤à¤¿à¤—त या निजी जानकारी सहित, यह इसे इस बारे में सामानà¥à¤¯ जानकारी खोजने देता है कि आप फ़ोन से कà¥â€à¤¯à¤¾ कर रहे हैं."</string>
<string name="permlab_anyCodecForPlayback" msgid="715805555823881818">"पà¥à¤²à¥‡à¤¬à¥ˆà¤• के लिठकिसी भी मीडिया डीकोडर का उपयोग करें"</string>
- <string name="permdesc_anyCodecForPlayback" msgid="8283912488433189010">"à¤à¤ªà¥à¤¸ को पà¥à¤²à¥‡à¤¬à¥ˆà¤• डीकोड करने के लिठकिसी भी इंसà¥à¤Ÿà¥‰à¤² किठगठडीकोडर का उपयोग करने देता है."</string>
+ <string name="permdesc_anyCodecForPlayback" msgid="8283912488433189010">"à¤à¤ªà¥à¤¸ को पà¥à¤²à¥‡à¤¬à¥ˆà¤• डीकोड करने के लिठकिसी भी इंसà¥à¤Ÿà¥‰à¤² किठगठडीकोडर का उपयोग करने देता है."</string>
<string name="permlab_manageCaCertificates" msgid="1678391896786882014">"विशà¥à¤µà¤¸à¤¨à¥€à¤¯ कà¥à¤°à¥‡à¤¡à¥‡à¤‚शियल पà¥à¤°à¤¬à¤‚धित करें"</string>
- <string name="permdesc_manageCaCertificates" msgid="4015644047196937014">"à¤à¤ªà¥à¤¸ को CA पà¥à¤°à¤®à¤¾à¤£à¤ªà¤¤à¥à¤°à¥‹à¤‚ को विशà¥à¤µà¤¸à¤¨à¥€à¤¯ कà¥à¤°à¥‡à¤¡à¥‡à¤‚शियल के रूप में इंसà¥à¤Ÿà¥‰à¤² और अनइंसà¥à¤Ÿà¥‰à¤² करने दें"</string>
+ <string name="permdesc_manageCaCertificates" msgid="4015644047196937014">"à¤à¤ªà¥à¤¸ को CA पà¥à¤°à¤®à¤¾à¤£à¤ªà¤¤à¥à¤°à¥‹à¤‚ को विशà¥à¤µà¤¸à¤¨à¥€à¤¯ कà¥à¤°à¥‡à¤¡à¥‡à¤‚शियल के रूप में इंसà¥à¤Ÿà¥‰à¤² और अनइंसà¥à¤Ÿà¥‰à¤² करने दें"</string>
<string name="permlab_diagnostic" msgid="8076743953908000342">"निदान के सà¥â€à¤µà¤¾à¤®à¤¿à¤¤à¥â€à¤µ वाले संसाधनों को पढ़ें/लिखें"</string>
- <string name="permdesc_diagnostic" msgid="6608295692002452283">"à¤à¤ªà¥â€à¤¸ को diag समूह के सà¥â€à¤µà¤¾à¤®à¤¿à¤¤à¥â€à¤µ वाले किसी संसाधन को पढ़ने और उसमें लिखने देता है; उदाहरण के लिà¤, /dev की फ़ाइलें. यह सिसà¥â€à¤Ÿà¤® की सà¥â€à¤¥à¤¿à¤°à¤¤à¤¾ और सà¥à¤°à¤•à¥à¤·à¤¾ को संभावित रूप से पà¥à¤°à¤­à¤¾à¤µà¤¿à¤¤ कर सकता है. इसका उपयोग निरà¥à¤®à¤¾à¤¤à¤¾ या ऑपरेटर दà¥à¤µà¤¾à¤°à¤¾ केवल हारà¥à¤¡à¤µà¥‡à¤¯à¤°-विशिषà¥à¤Ÿ निदान के लिठकिया जाना चाहिà¤."</string>
- <string name="permlab_changeComponentState" msgid="6335576775711095931">"à¤à¤ªà¥â€à¤¸ घटकों को सकà¥à¤·à¤® या अकà¥à¤·à¤® करें"</string>
- <string name="permdesc_changeComponentState" product="tablet" msgid="8887435740982237294">"à¤à¤ªà¥â€à¤¸ को यह बदलने देता है कि किसी अनà¥â€à¤¯ à¤à¤ªà¥â€à¤¸ का घटक सकà¥à¤·à¤® है या नहीं. दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ à¤à¤ªà¥â€à¤¸ महतà¥â€à¤µà¤ªà¥‚रà¥à¤£ फ़ोन कà¥à¤·à¤®à¤¤à¤¾à¤“ं को अकà¥à¤·à¤® करने में इसका उपयोग कर सकते हैं. इस अनà¥à¤®à¤¤à¤¿ का उपयोग सावधानी के साथ करना चाहिà¤, कà¥à¤¯à¥‹à¤‚कि इससे à¤à¤ªà¥â€à¤¸ घटकों के अनà¥à¤ªà¤¯à¥‹à¤—ी, असंगत, या असà¥â€à¤¥à¤¿à¤° सà¥â€à¤¥à¤¿à¤¤à¤¿ में जाने की संभावना है."</string>
- <string name="permdesc_changeComponentState" product="default" msgid="1827232484416505615">"à¤à¤ªà¥â€à¤¸ को यह बदलने देता है कि किसी अनà¥â€à¤¯ à¤à¤ªà¥â€à¤¸ का घटक सकà¥à¤·à¤® है या नहीं. दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ à¤à¤ªà¥â€à¤¸ महतà¥â€à¤µà¤ªà¥‚रà¥à¤£ फ़ोन कà¥à¤·à¤®à¤¤à¤¾à¤“ं को अकà¥à¤·à¤® करने में इसका उपयोग कर सकते हैं. इस अनà¥à¤®à¤¤à¤¿ का उपयोग सावधानी के साथ करना चाहिà¤, कà¥à¤¯à¥‹à¤‚कि इससे à¤à¤ªà¥â€à¤¸ घटकों के अनà¥à¤ªà¤¯à¥‹à¤—ी, असंगत, या असà¥â€à¤¥à¤¿à¤° सà¥â€à¤¥à¤¿à¤¤à¤¿ में जाने की संभावना है."</string>
+ <string name="permdesc_diagnostic" msgid="6608295692002452283">"à¤à¤ªà¥à¤¸ को diag समूह के सà¥â€à¤µà¤¾à¤®à¤¿à¤¤à¥â€à¤µ वाले किसी संसाधन को पढ़ने और उसमें लिखने देता है; उदाहरण के लिà¤, /dev की फ़ाइलें. यह सिसà¥â€à¤Ÿà¤® की सà¥â€à¤¥à¤¿à¤°à¤¤à¤¾ और सà¥à¤°à¤•à¥à¤·à¤¾ को संभावित रूप से पà¥à¤°à¤­à¤¾à¤µà¤¿à¤¤ कर सकता है. इसका उपयोग निरà¥à¤®à¤¾à¤¤à¤¾ या ऑपरेटर दà¥à¤µà¤¾à¤°à¤¾ केवल हारà¥à¤¡à¤µà¥‡à¤¯à¤°-विशिषà¥à¤Ÿ निदान के लिठकिया जाना चाहिà¤."</string>
+ <string name="permlab_changeComponentState" msgid="6335576775711095931">"à¤à¤ªà¥à¤¸ घटकों को सकà¥à¤·à¤® या अकà¥à¤·à¤® करें"</string>
+ <string name="permdesc_changeComponentState" product="tablet" msgid="8887435740982237294">"à¤à¤ªà¥à¤¸ को यह बदलने देता है कि किसी अनà¥â€à¤¯ à¤à¤ªà¥à¤¸ का घटक सकà¥à¤·à¤® है या नहीं. दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ à¤à¤ªà¥à¤¸ महतà¥â€à¤µà¤ªà¥‚रà¥à¤£ फ़ोन कà¥à¤·à¤®à¤¤à¤¾à¤“ं को अकà¥à¤·à¤® करने में इसका उपयोग कर सकते हैं. इस अनà¥à¤®à¤¤à¤¿ का उपयोग सावधानी के साथ करना चाहिà¤, कà¥à¤¯à¥‹à¤‚कि इससे à¤à¤ªà¥à¤¸ घटकों के अनà¥à¤ªà¤¯à¥‹à¤—ी, असंगत, या असà¥â€à¤¥à¤¿à¤° सà¥â€à¤¥à¤¿à¤¤à¤¿ में जाने की संभावना है."</string>
+ <string name="permdesc_changeComponentState" product="default" msgid="1827232484416505615">"à¤à¤ªà¥à¤¸ को यह बदलने देता है कि किसी अनà¥â€à¤¯ à¤à¤ªà¥à¤¸ का घटक सकà¥à¤·à¤® है या नहीं. दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ à¤à¤ªà¥à¤¸ महतà¥â€à¤µà¤ªà¥‚रà¥à¤£ फ़ोन कà¥à¤·à¤®à¤¤à¤¾à¤“ं को अकà¥à¤·à¤® करने में इसका उपयोग कर सकते हैं. इस अनà¥à¤®à¤¤à¤¿ का उपयोग सावधानी के साथ करना चाहिà¤, कà¥à¤¯à¥‹à¤‚कि इससे à¤à¤ªà¥à¤¸ घटकों के अनà¥à¤ªà¤¯à¥‹à¤—ी, असंगत, या असà¥â€à¤¥à¤¿à¤° सà¥â€à¤¥à¤¿à¤¤à¤¿ में जाने की संभावना है."</string>
<string name="permlab_grantRevokePermissions" msgid="4627315351093508795">"अनà¥à¤®à¤¤à¤¿ दें या रदà¥à¤¦ करें"</string>
- <string name="permdesc_grantRevokePermissions" msgid="4088642654085850662">"à¤à¤ªà¥à¤¸ को उसके या अनà¥à¤¯ à¤à¤ªà¥à¤¸ के लिठविशेष अनà¥à¤®à¤¤à¤¿à¤¯à¤¾à¤‚ देने या रदà¥à¤¦ करने देता है. दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ à¤à¤ªà¥à¤¸ इसका उपयोग उन सà¥à¤µà¤¿à¤§à¤¾à¤“ं तक पहà¥à¤‚चने के लिठकर सकते हैं जो आपने उनà¥à¤¹à¥‡à¤‚ नहीं दी हैं."</string>
- <string name="permlab_setPreferredApplications" msgid="8463181628695396391">"पसंदीदा à¤à¤ªà¥â€à¤¸ सेट करें"</string>
- <string name="permdesc_setPreferredApplications" msgid="4973986762241783712">"à¤à¤ªà¥à¤¸ को आपके पसंदीदा à¤à¤ªà¥à¤¸ को संशोधित करने देता है. दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ à¤à¤ªà¥à¤¸ आपसे निजी डेटा à¤à¤•तà¥à¤°à¤¿à¤¤ करने के लिठआपके मौजूदा à¤à¤ªà¥à¤¸ को सà¥à¤ªà¥‚फ़ करके, चलाठजाने वाले à¤à¤ªà¥à¤¸ को चà¥à¤ªà¤šà¤¾à¤ª बदल सकते हैं."</string>
+ <string name="permdesc_grantRevokePermissions" msgid="4088642654085850662">"à¤à¤ªà¥à¤¸ को उसके या अनà¥à¤¯ à¤à¤ªà¥à¤¸ के लिठविशेष अनà¥à¤®à¤¤à¤¿à¤¯à¤¾à¤‚ देने या रदà¥à¤¦ करने देता है. दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ à¤à¤ªà¥à¤¸ इसका उपयोग उन सà¥à¤µà¤¿à¤§à¤¾à¤“ं तक पहà¥à¤‚चने के लिठकर सकते हैं जो आपने उनà¥à¤¹à¥‡à¤‚ नहीं दी हैं."</string>
+ <string name="permlab_setPreferredApplications" msgid="8463181628695396391">"पसंदीदा à¤à¤ªà¥à¤¸ सेट करें"</string>
+ <string name="permdesc_setPreferredApplications" msgid="4973986762241783712">"à¤à¤ªà¥à¤¸ को आपके पसंदीदा à¤à¤ªà¥à¤¸ को संशोधित करने देता है. दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ à¤à¤ªà¥à¤¸ आपसे निजी डेटा à¤à¤•तà¥à¤°à¤¿à¤¤ करने के लिठआपके मौजूदा à¤à¤ªà¥à¤¸ को सà¥à¤ªà¥‚फ़ करके, चलाठजाने वाले à¤à¤ªà¥à¤¸ को चà¥à¤ªà¤šà¤¾à¤ª बदल सकते हैं."</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"सिसà¥â€à¤Ÿà¤® सेटिंग बदलें"</string>
- <string name="permdesc_writeSettings" msgid="7775723441558907181">"à¤à¤ªà¥à¤¸ को सिसà¥à¤Ÿà¤® सेटिंग डेटा संशोधित करने देता है. दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ à¤à¤ªà¥à¤¸ आपके सिसà¥à¤Ÿà¤® के कॉनà¥à¤«à¤¼à¤¿à¤—रेशन को दूषित कर सकते हैं."</string>
+ <string name="permdesc_writeSettings" msgid="7775723441558907181">"à¤à¤ªà¥à¤¸ को सिसà¥à¤Ÿà¤® सेटिंग डेटा संशोधित करने देता है. दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ à¤à¤ªà¥à¤¸ आपके सिसà¥à¤Ÿà¤® के कॉनà¥à¤«à¤¼à¤¿à¤—रेशन को दूषित कर सकते हैं."</string>
<string name="permlab_writeSecureSettings" msgid="204676251876718288">"सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ सिसà¥â€à¤Ÿà¤® सेटिंग बदलें"</string>
- <string name="permdesc_writeSecureSettings" msgid="8159535613020137391">"à¤à¤ªà¥à¤¸ को सिसà¥à¤Ÿà¤® के सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ सेटिंग डेटा को संशोधित करने देता है. सामानà¥â€à¤¯ à¤à¤ªà¥â€à¤¸ दà¥à¤µà¤¾à¤°à¤¾ उपयोग करने के लिठनहीं."</string>
+ <string name="permdesc_writeSecureSettings" msgid="8159535613020137391">"à¤à¤ªà¥à¤¸ को सिसà¥à¤Ÿà¤® के सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ सेटिंग डेटा को संशोधित करने देता है. सामानà¥â€à¤¯ à¤à¤ªà¥à¤¸ दà¥à¤µà¤¾à¤°à¤¾ उपयोग करने के लिठनहीं."</string>
<string name="permlab_writeGservices" msgid="2149426664226152185">"Google सेवाà¤à¤‚ नकà¥à¤¶à¤¾ बदलें"</string>
- <string name="permdesc_writeGservices" msgid="1287309437638380229">"à¤à¤ªà¥â€à¤¸ को Google सेवाओं का नकà¥à¤¶à¥‡ संशोधित करने देता है. सामानà¥â€à¤¯ à¤à¤ªà¥â€à¤¸ दà¥à¤µà¤¾à¤°à¤¾ उपयोग करने के लिठनहीं."</string>
+ <string name="permdesc_writeGservices" msgid="1287309437638380229">"à¤à¤ªà¥à¤¸ को Google सेवाओं का नकà¥à¤¶à¥‡ संशोधित करने देता है. सामानà¥â€à¤¯ à¤à¤ªà¥à¤¸ दà¥à¤µà¤¾à¤°à¤¾ उपयोग करने के लिठनहीं."</string>
<string name="permlab_receiveBootCompleted" msgid="5312965565987800025">"पà¥à¤°à¤¾à¤°à¤‚भ होने पर चलाà¤à¤‚"</string>
- <string name="permdesc_receiveBootCompleted" product="tablet" msgid="7390304664116880704">"à¤à¤ªà¥à¤¸ को सिसà¥à¤Ÿà¤® दà¥à¤µà¤¾à¤°à¤¾ बूटिंग पूरà¥à¤£ करते ही सà¥à¤µà¤¤à¤ƒ आरंभ करने देता है. इससे टेबलेट को आरंभ होने में अधिक समय लग सकता है और à¤à¤ªà¥à¤¸ को निरंतर चलाकर संपूरà¥à¤£ टेबलेट को धीमा करने देता है."</string>
- <string name="permdesc_receiveBootCompleted" product="default" msgid="513950589102617504">"à¤à¤ªà¥à¤¸ को सिसà¥à¤Ÿà¤® दà¥à¤µà¤¾à¤°à¤¾ बूटिंग पूरà¥à¤£ करते ही सà¥à¤µà¤¤à¤ƒ पà¥à¤°à¤¾à¤°à¤‚भ होने देता है. इससे फ़ोन को पà¥à¤°à¤¾à¤°à¤‚भ होने में अधिक समय लग सकता है और à¤à¤ªà¥à¤¸ के निरंतर चलते रहने से संपूरà¥à¤£ फ़ोन पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾à¤à¤‚ धीमी हो सकती हैं."</string>
+ <string name="permdesc_receiveBootCompleted" product="tablet" msgid="7390304664116880704">"à¤à¤ªà¥à¤¸ को सिसà¥à¤Ÿà¤® दà¥à¤µà¤¾à¤°à¤¾ बूटिंग पूरà¥à¤£ करते ही सà¥à¤µà¤¤à¤ƒ आरंभ करने देता है. इससे टेबलेट को आरंभ होने में अधिक समय लग सकता है और à¤à¤ªà¥à¤¸ को निरंतर चलाकर संपूरà¥à¤£ टेबलेट को धीमा करने देता है."</string>
+ <string name="permdesc_receiveBootCompleted" product="default" msgid="513950589102617504">"à¤à¤ªà¥à¤¸ को सिसà¥à¤Ÿà¤® दà¥à¤µà¤¾à¤°à¤¾ बूटिंग पूरà¥à¤£ करते ही सà¥à¤µà¤¤à¤ƒ पà¥à¤°à¤¾à¤°à¤‚भ होने देता है. इससे फ़ोन को पà¥à¤°à¤¾à¤°à¤‚भ होने में अधिक समय लग सकता है और à¤à¤ªà¥à¤¸ के निरंतर चलते रहने से संपूरà¥à¤£ फ़ोन पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾à¤à¤‚ धीमी हो सकती हैं."</string>
<string name="permlab_broadcastSticky" msgid="7919126372606881614">"सà¥à¤Ÿà¤¿à¤•ी पà¥à¤°à¤¸à¤¾à¤°à¤£ भेजें"</string>
- <string name="permdesc_broadcastSticky" product="tablet" msgid="7749760494399915651">"à¤à¤ªà¥â€à¤¸ को सà¥â€à¤Ÿà¤¿à¤•ी पà¥à¤°à¤¸à¤¾à¤°à¤£ भेजने देता है, जो पà¥à¤°à¤¸à¤¾à¤°à¤£ समापà¥à¤¤ होने के बाद भी बने रहते हैं. अतà¥à¤¯à¤§à¤¿à¤• उपयोग, टेबलेट की बहà¥à¤¤ अधिक सà¥à¤®à¥ƒà¤¤à¤¿ का उपयोग करके उसे धीमा या असà¥â€à¤¥à¤¿à¤° कर सकता है."</string>
- <string name="permdesc_broadcastSticky" product="default" msgid="2825803764232445091">"à¤à¤ªà¥â€à¤¸ को सà¥â€à¤Ÿà¤¿à¤•ी पà¥à¤°à¤¸à¤¾à¤°à¤£ भेजने देता है, जो पà¥à¤°à¤¸à¤¾à¤°à¤£ समापà¥à¤¤ होने के बाद भी बने रहते हैं. अतà¥à¤¯à¤§à¤¿à¤• उपयोग, फ़ोन की बहà¥à¤¤ अधिक सà¥à¤®à¥ƒà¤¤à¤¿ का उपयोग करके उसे धीमा या असà¥â€à¤¥à¤¿à¤° कर सकता है."</string>
+ <string name="permdesc_broadcastSticky" product="tablet" msgid="7749760494399915651">"à¤à¤ªà¥à¤¸ को सà¥â€à¤Ÿà¤¿à¤•ी पà¥à¤°à¤¸à¤¾à¤°à¤£ भेजने देता है, जो पà¥à¤°à¤¸à¤¾à¤°à¤£ समापà¥à¤¤ होने के बाद भी बने रहते हैं. अतà¥à¤¯à¤§à¤¿à¤• उपयोग, टेबलेट की बहà¥à¤¤ अधिक सà¥à¤®à¥ƒà¤¤à¤¿ का उपयोग करके उसे धीमा या असà¥â€à¤¥à¤¿à¤° कर सकता है."</string>
+ <string name="permdesc_broadcastSticky" product="default" msgid="2825803764232445091">"à¤à¤ªà¥à¤¸ को सà¥â€à¤Ÿà¤¿à¤•ी पà¥à¤°à¤¸à¤¾à¤°à¤£ भेजने देता है, जो पà¥à¤°à¤¸à¤¾à¤°à¤£ समापà¥à¤¤ होने के बाद भी बने रहते हैं. अतà¥à¤¯à¤§à¤¿à¤• उपयोग, फ़ोन की बहà¥à¤¤ अधिक सà¥à¤®à¥ƒà¤¤à¤¿ का उपयोग करके उसे धीमा या असà¥â€à¤¥à¤¿à¤° कर सकता है."</string>
<string name="permlab_readContacts" msgid="8348481131899886131">"अपने संपरà¥à¤• पढ़ें"</string>
- <string name="permdesc_readContacts" product="tablet" msgid="5294866856941149639">"à¤à¤ªà¥à¤¸ को आपके टेबलेट में संगà¥à¤°à¤¹à¥€à¤¤ संपरà¥à¤•ों के डेटा को, साथ ही आपके दà¥à¤µà¤¾à¤°à¤¾ विशिषà¥à¤Ÿ वà¥à¤¯à¤•à¥à¤¤à¤¿à¤¯à¥‹à¤‚ को कॉल करने, ईमेल करने, या अनà¥â€à¤¯ तरीके से संवाद करने की आवृतà¥à¤¤à¤¿ को पढ़ने देता है. यह अनà¥à¤®à¤¤à¤¿ à¤à¤ªà¥à¤¸ को आपके संपरà¥à¤• डेटा को सहेजने देती है, और दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ à¤à¤ªà¥à¤¸ आपकी जानकारी के बिना संपरà¥à¤• डेटा को साà¤à¤¾ कर सकते हैं."</string>
- <string name="permdesc_readContacts" product="default" msgid="8440654152457300662">"à¤à¤ªà¥à¤¸ को आपके फ़ोन में संगà¥à¤°à¤¹à¥€à¤¤ संपरà¥à¤•ों के डेटा को, साथ ही आपके दà¥à¤µà¤¾à¤°à¤¾ विशिषà¥à¤Ÿ वà¥à¤¯à¤•à¥à¤¤à¤¿à¤¯à¥‹à¤‚ को कॉल करने, ईमेल करने, या अनà¥â€à¤¯ तरीके से संवाद करने की आवृतà¥à¤¤à¤¿ को पढ़ने देता है. यह अनà¥à¤®à¤¤à¤¿ à¤à¤ªà¥à¤¸ को आपके संपरà¥à¤• डेटा को सहेजने देती है, और दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ à¤à¤ªà¥à¤¸ आपकी जानकारी के बिना संपरà¥à¤• डेटा को साà¤à¤¾ कर सकते हैं."</string>
+ <string name="permdesc_readContacts" product="tablet" msgid="5294866856941149639">"à¤à¤ªà¥à¤¸ को आपके टेबलेट में संगà¥à¤°à¤¹à¥€à¤¤ संपरà¥à¤•ों के डेटा को, साथ ही आपके दà¥à¤µà¤¾à¤°à¤¾ विशिषà¥à¤Ÿ वà¥à¤¯à¤•à¥à¤¤à¤¿à¤¯à¥‹à¤‚ को कॉल करने, ईमेल करने, या अनà¥â€à¤¯ तरीके से संवाद करने की आवृतà¥à¤¤à¤¿ को पढ़ने देता है. यह अनà¥à¤®à¤¤à¤¿ à¤à¤ªà¥à¤¸ को आपके संपरà¥à¤• डेटा को सहेजने देती है, और दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ à¤à¤ªà¥à¤¸ आपकी जानकारी के बिना संपरà¥à¤• डेटा को साà¤à¤¾ कर सकते हैं."</string>
+ <string name="permdesc_readContacts" product="default" msgid="8440654152457300662">"à¤à¤ªà¥à¤¸ को आपके फ़ोन में संगà¥à¤°à¤¹à¥€à¤¤ संपरà¥à¤•ों के डेटा को, साथ ही आपके दà¥à¤µà¤¾à¤°à¤¾ विशिषà¥à¤Ÿ वà¥à¤¯à¤•à¥à¤¤à¤¿à¤¯à¥‹à¤‚ को कॉल करने, ईमेल करने, या अनà¥â€à¤¯ तरीके से संवाद करने की आवृतà¥à¤¤à¤¿ को पढ़ने देता है. यह अनà¥à¤®à¤¤à¤¿ à¤à¤ªà¥à¤¸ को आपके संपरà¥à¤• डेटा को सहेजने देती है, और दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ à¤à¤ªà¥à¤¸ आपकी जानकारी के बिना संपरà¥à¤• डेटा को साà¤à¤¾ कर सकते हैं."</string>
<string name="permlab_writeContacts" msgid="5107492086416793544">"अपने संपरà¥à¤• बदलें"</string>
- <string name="permdesc_writeContacts" product="tablet" msgid="897243932521953602">"à¤à¤ªà¥à¤¸ को आपके टेबलेट में संगà¥à¤°à¤¹à¥€à¤¤ संपरà¥à¤•ों के डेटा को, साथ ही आपके दà¥à¤µà¤¾à¤°à¤¾ विशिषà¥à¤Ÿ वà¥à¤¯à¤•à¥à¤¤à¤¿à¤¯à¥‹à¤‚ को कॉल करने, ईमेल करने, या अनà¥â€à¤¯ तरीके से संवाद करने की आवृतà¥à¤¤à¤¿ को संशोधित करने देता है. यह अनà¥à¤®à¤¤à¤¿ à¤à¤ªà¥à¤¸ को आपके संपरà¥à¤• डेटा को हटाने देती है."</string>
- <string name="permdesc_writeContacts" product="default" msgid="589869224625163558">"à¤à¤ªà¥à¤¸ को आपके फ़ोन में संगà¥à¤°à¤¹à¥€à¤¤ संपरà¥à¤•ों के डेटा को, साथ ही आपके दà¥à¤µà¤¾à¤°à¤¾ विशिषà¥à¤Ÿ वà¥à¤¯à¤•à¥à¤¤à¤¿à¤¯à¥‹à¤‚ को कॉल करने, ईमेल करने, या अनà¥â€à¤¯ तरीके से संवाद करने की आवृतà¥à¤¤à¤¿ को संशोधित करने देता है. यह अनà¥à¤®à¤¤à¤¿ à¤à¤ªà¥à¤¸ को आपके संपरà¥à¤• डेटा को हटाने देती है."</string>
+ <string name="permdesc_writeContacts" product="tablet" msgid="897243932521953602">"à¤à¤ªà¥à¤¸ को आपके टेबलेट में संगà¥à¤°à¤¹à¥€à¤¤ संपरà¥à¤•ों के डेटा को, साथ ही आपके दà¥à¤µà¤¾à¤°à¤¾ विशिषà¥à¤Ÿ वà¥à¤¯à¤•à¥à¤¤à¤¿à¤¯à¥‹à¤‚ को कॉल करने, ईमेल करने, या अनà¥â€à¤¯ तरीके से संवाद करने की आवृतà¥à¤¤à¤¿ को संशोधित करने देता है. यह अनà¥à¤®à¤¤à¤¿ à¤à¤ªà¥à¤¸ को आपके संपरà¥à¤• डेटा को हटाने देती है."</string>
+ <string name="permdesc_writeContacts" product="default" msgid="589869224625163558">"à¤à¤ªà¥à¤¸ को आपके फ़ोन में संगà¥à¤°à¤¹à¥€à¤¤ संपरà¥à¤•ों के डेटा को, साथ ही आपके दà¥à¤µà¤¾à¤°à¤¾ विशिषà¥à¤Ÿ वà¥à¤¯à¤•à¥à¤¤à¤¿à¤¯à¥‹à¤‚ को कॉल करने, ईमेल करने, या अनà¥â€à¤¯ तरीके से संवाद करने की आवृतà¥à¤¤à¤¿ को संशोधित करने देता है. यह अनà¥à¤®à¤¤à¤¿ à¤à¤ªà¥à¤¸ को आपके संपरà¥à¤• डेटा को हटाने देती है."</string>
<string name="permlab_readCallLog" msgid="3478133184624102739">"कॉल लॉग पढ़ें"</string>
- <string name="permdesc_readCallLog" product="tablet" msgid="3700645184870760285">"à¤à¤ªà¥à¤¸ को आपके फ़ोन का कॉल लॉग पढ़ने देता है, जिसमें इनकमिंग और आउटगोइंग कॉल का डेटा शामिल है. यह अनà¥à¤®à¤¤à¤¿ à¤à¤ªà¥à¤¸ को आपके कॉल लॉग डेटा को सहेजने देती है, और दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ à¤à¤ªà¥à¤¸ आपकी जानकारी के बिना कॉल लॉग डेटा को साà¤à¤¾ कर सकते हैं."</string>
- <string name="permdesc_readCallLog" product="default" msgid="5777725796813217244">"à¤à¤ªà¥à¤¸ को आपके फ़ोन का कॉल लॉग पढ़ने देता है, जिसमें इनकमिंग और आउटगोइंग कॉल का डेटा शामिल है. यह अनà¥à¤®à¤¤à¤¿ à¤à¤ªà¥à¤¸ को आपके कॉल लॉग डेटा को सहेजने देती है, और दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ à¤à¤ªà¥à¤¸ आपकी जानकारी के बिना कॉल लॉग डेटा को साà¤à¤¾ कर सकते हैं."</string>
+ <string name="permdesc_readCallLog" product="tablet" msgid="3700645184870760285">"à¤à¤ªà¥à¤¸ को आपके फ़ोन का कॉल लॉग पढ़ने देता है, जिसमें इनकमिंग और आउटगोइंग कॉल का डेटा शामिल है. यह अनà¥à¤®à¤¤à¤¿ à¤à¤ªà¥à¤¸ को आपके कॉल लॉग डेटा को सहेजने देती है, और दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ à¤à¤ªà¥à¤¸ आपकी जानकारी के बिना कॉल लॉग डेटा को साà¤à¤¾ कर सकते हैं."</string>
+ <string name="permdesc_readCallLog" product="default" msgid="5777725796813217244">"à¤à¤ªà¥à¤¸ को आपके फ़ोन का कॉल लॉग पढ़ने देता है, जिसमें इनकमिंग और आउटगोइंग कॉल का डेटा शामिल है. यह अनà¥à¤®à¤¤à¤¿ à¤à¤ªà¥à¤¸ को आपके कॉल लॉग डेटा को सहेजने देती है, और दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ à¤à¤ªà¥à¤¸ आपकी जानकारी के बिना कॉल लॉग डेटा को साà¤à¤¾ कर सकते हैं."</string>
<string name="permlab_writeCallLog" msgid="8552045664743499354">"कॉल लॉग लिखें"</string>
- <string name="permdesc_writeCallLog" product="tablet" msgid="6661806062274119245">"à¤à¤ªà¥â€à¤¸ को इनकमिंग और आउटगोइंग कॉल के डेटा सहित, आपके टेबलेट का कॉल लॉग संशोधित करने देता है. दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ à¤à¤ªà¥â€à¤¸ आपके कॉल लॉग को मिटाने या संशोधित करने के लिठइसका उपयोग कर सकते हैं."</string>
- <string name="permdesc_writeCallLog" product="default" msgid="683941736352787842">"à¤à¤ªà¥â€à¤¸ को इनकमिंग और आउटगोइंग कॉल के डेटा सहित, आपके फ़ोन का कॉल लॉग संशोधित करने देता है. दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ à¤à¤ªà¥â€à¤¸ आपके कॉल लॉग को मिटाने या संशोधित करने के लिठइसका उपयोग कर सकते हैं."</string>
+ <string name="permdesc_writeCallLog" product="tablet" msgid="6661806062274119245">"à¤à¤ªà¥à¤¸ को इनकमिंग और आउटगोइंग कॉल के डेटा सहित, आपके टेबलेट का कॉल लॉग संशोधित करने देता है. दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ à¤à¤ªà¥à¤¸ आपके कॉल लॉग को मिटाने या संशोधित करने के लिठइसका उपयोग कर सकते हैं."</string>
+ <string name="permdesc_writeCallLog" product="default" msgid="683941736352787842">"à¤à¤ªà¥à¤¸ को इनकमिंग और आउटगोइंग कॉल के डेटा सहित, आपके फ़ोन का कॉल लॉग संशोधित करने देता है. दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ à¤à¤ªà¥à¤¸ आपके कॉल लॉग को मिटाने या संशोधित करने के लिठइसका उपयोग कर सकते हैं."</string>
<string name="permlab_readProfile" msgid="4701889852612716678">"सà¥â€à¤µà¤¯à¤‚ का संपरà¥à¤• कारà¥à¤¡ पढ़ें"</string>
- <string name="permdesc_readProfile" product="default" msgid="5462475151849888848">"à¤à¤ªà¥à¤¸ को आपके उपकरण में संगà¥à¤°à¤¹à¥€à¤¤ वà¥à¤¯à¤•à¥à¤¤à¤¿à¤—त पà¥à¤°à¥‹à¤«à¤¼à¤¾à¤‡à¤² जानकारी, जैसे आपका नाम और संपरà¥à¤• जानकारी, पढ़ने देता है. इसका अरà¥à¤¥ है कि à¤à¤ªà¥à¤¸ आपको पहचान सकता है और आपकी पà¥à¤°à¥‹à¤«à¤¼à¤¾à¤‡à¤² जानकारी अनà¥à¤¯ लोगों को भेज सकता है."</string>
+ <string name="permdesc_readProfile" product="default" msgid="5462475151849888848">"à¤à¤ªà¥à¤¸ को आपके उपकरण में संगà¥à¤°à¤¹à¥€à¤¤ वà¥à¤¯à¤•à¥à¤¤à¤¿à¤—त पà¥à¤°à¥‹à¤«à¤¼à¤¾à¤‡à¤² जानकारी, जैसे आपका नाम और संपरà¥à¤• जानकारी, पढ़ने देता है. इसका अरà¥à¤¥ है कि à¤à¤ªà¥à¤¸ आपको पहचान सकता है और आपकी पà¥à¤°à¥‹à¤«à¤¼à¤¾à¤‡à¤² जानकारी अनà¥à¤¯ लोगों को भेज सकता है."</string>
<string name="permlab_writeProfile" msgid="907793628777397643">"सà¥â€à¤µà¤¯à¤‚ का संपरà¥à¤• कारà¥à¤¡ बदलें"</string>
- <string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"à¤à¤ªà¥à¤¸ को आपके उपकरण में संगà¥à¤°à¤¹à¥€à¤¤ निजी पà¥à¤°à¥‹à¤«à¤¼à¤¾à¤‡à¤² जानकारी, जैसे आपका नाम और संपरà¥à¤• जानकारी को बदलने या उसमें कà¥à¤› जोड़ने देता है. इसका अरà¥à¤¥ है कि à¤à¤ªà¥à¤¸ आपको पहचान सकता है और आपकी पà¥à¤°à¥‹à¤«à¤¼à¤¾à¤‡à¤² जानकारी अनà¥à¤¯ लोगों को भेज सकता है."</string>
+ <string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"à¤à¤ªà¥à¤¸ को आपके उपकरण में संगà¥à¤°à¤¹à¥€à¤¤ निजी पà¥à¤°à¥‹à¤«à¤¼à¤¾à¤‡à¤² जानकारी, जैसे आपका नाम और संपरà¥à¤• जानकारी को बदलने या उसमें कà¥à¤› जोड़ने देता है. इसका अरà¥à¤¥ है कि à¤à¤ªà¥à¤¸ आपको पहचान सकता है और आपकी पà¥à¤°à¥‹à¤«à¤¼à¤¾à¤‡à¤² जानकारी अनà¥à¤¯ लोगों को भेज सकता है."</string>
<string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"अपनी सामाजिक सà¥â€à¤Ÿà¥à¤°à¥€à¤® पढ़ें"</string>
<string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"à¤à¤ª को आपके और आपके मितà¥à¤°à¥‹à¤‚ की नई सामाजिक जानकारी तक पहà¥à¤‚चने और उनà¥à¤¹à¥‡à¤‚ समनà¥â€à¤µà¤¯à¤¿à¤¤ करने देता है. जानकारी साà¤à¤¾ करते समय सावधान रहें - इससे गोपनीयता पर धà¥à¤¯à¤¾à¤¨ दिठबिना, à¤à¤ª सामाजिक नेटवरà¥à¤• पर आपके और आपके मितà¥à¤°à¥‹à¤‚ के बीच संचारों को पढ़ सकता है. धà¥â€à¤¯à¤¾à¤¨ दें: यह अनà¥à¤®à¤¤à¤¿ सभी सामाजिक नेटवरà¥à¤• पर लागू नहीं की जा सकती."</string>
<string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"सामाजिक सà¥â€à¤Ÿà¥à¤°à¥€à¤® में लिखें"</string>
- <string name="permdesc_writeSocialStream" product="default" msgid="3086557552204114849">"à¤à¤ª को आपके मितà¥à¤°à¥‹à¤‚ की नई सामाजिक जानकारी पà¥à¤°à¤¦à¤°à¥à¤¶à¤¿à¤¤ करने देता है. जानकारी साà¤à¤¾ करते समय सावधान रहें - इससे à¤à¤ªà¥à¤¸ à¤à¤¸à¥‡ संदेश बना सकता है जो किसी मितà¥à¤° की ओर से आते दिखाई देते हैं. धà¥â€à¤¯à¤¾à¤¨ दें: यह अनà¥à¤®à¤¤à¤¿ सभी सामाजिक नेटवरà¥à¤• पर लागू नहीं की जा सकती."</string>
+ <string name="permdesc_writeSocialStream" product="default" msgid="3086557552204114849">"à¤à¤ª को आपके मितà¥à¤°à¥‹à¤‚ की नई सामाजिक जानकारी पà¥à¤°à¤¦à¤°à¥à¤¶à¤¿à¤¤ करने देता है. जानकारी साà¤à¤¾ करते समय सावधान रहें - इससे à¤à¤ªà¥à¤¸ à¤à¤¸à¥‡ संदेश बना सकता है जो किसी मितà¥à¤° की ओर से आते दिखाई देते हैं. धà¥â€à¤¯à¤¾à¤¨ दें: यह अनà¥à¤®à¤¤à¤¿ सभी सामाजिक नेटवरà¥à¤• पर लागू नहीं की जा सकती."</string>
<string name="permlab_readCalendar" msgid="5972727560257612398">"केलैंडर ईवेंट के साथ-साथ गोपनीय जानकारी पढ़ें"</string>
- <string name="permdesc_readCalendar" product="tablet" msgid="4216462049057658723">"à¤à¤ªà¥à¤¸ को मितà¥à¤°à¥‹à¤‚ या सहकरà¥à¤®à¤¿à¤¯à¥‹à¤‚ के कैलेंडर इवेंट सहित, आपके टेबलेट पर संगà¥à¤°à¤¹à¥€à¤¤ कैलेंडर इवेंट पढ़ने देता है. इससे गोपनीयता या संवेदनशीलता पर धà¥à¤¯à¤¾à¤¨ दिठबिना, à¤à¤ªà¥à¤¸ आपके कैलेंडर डेटा को साà¤à¤¾ कर सकता है या सहेज सकता है."</string>
- <string name="permdesc_readCalendar" product="default" msgid="7434548682470851583">"à¤à¤ªà¥à¤¸ को मितà¥à¤°à¥‹à¤‚ या सहकरà¥à¤®à¤¿à¤¯à¥‹à¤‚ के कैलेंडर इवेंट सहित, आपके फ़ोन पर संगà¥à¤°à¤¹à¥€à¤¤ कैलेंडर इवेंट पढ़ने देता है. इससे गोपनीयता या संवेदनशीलता पर धà¥à¤¯à¤¾à¤¨ दिठबिना, à¤à¤ªà¥à¤¸ आपके कैलेंडर डेटा को साà¤à¤¾ कर सकता है या सहेज सकता है."</string>
+ <string name="permdesc_readCalendar" product="tablet" msgid="4216462049057658723">"à¤à¤ªà¥à¤¸ को मितà¥à¤°à¥‹à¤‚ या सहकरà¥à¤®à¤¿à¤¯à¥‹à¤‚ के कैलेंडर इवेंट सहित, आपके टेबलेट पर संगà¥à¤°à¤¹à¥€à¤¤ कैलेंडर इवेंट पढ़ने देता है. इससे गोपनीयता या संवेदनशीलता पर धà¥à¤¯à¤¾à¤¨ दिठबिना, à¤à¤ªà¥à¤¸ आपके कैलेंडर डेटा को साà¤à¤¾ कर सकता है या सहेज सकता है."</string>
+ <string name="permdesc_readCalendar" product="default" msgid="7434548682470851583">"à¤à¤ªà¥à¤¸ को मितà¥à¤°à¥‹à¤‚ या सहकरà¥à¤®à¤¿à¤¯à¥‹à¤‚ के कैलेंडर इवेंट सहित, आपके फ़ोन पर संगà¥à¤°à¤¹à¥€à¤¤ कैलेंडर इवेंट पढ़ने देता है. इससे गोपनीयता या संवेदनशीलता पर धà¥à¤¯à¤¾à¤¨ दिठबिना, à¤à¤ªà¥à¤¸ आपके कैलेंडर डेटा को साà¤à¤¾ कर सकता है या सहेज सकता है."</string>
<string name="permlab_writeCalendar" msgid="8438874755193825647">"अपनी जानकारी के बिâ€à¤¨à¤¾ कैलेंडर ईवेंट जोड़ें या संशोधिâ€à¤¤ करें और अतिâ€à¤¥à¤¿â€à¤¯à¥‹à¤‚ को ईमेल भेजें"</string>
- <string name="permdesc_writeCalendar" product="tablet" msgid="6679035520113668528">"à¤à¤ªà¥à¤¸ को मितà¥à¤°à¥‹à¤‚ या सहकरà¥à¤®à¤¿à¤¯à¥‹à¤‚ के ईवेंट के साथ ही वे ईवेंट जोड़ने, निकालने, बदलने देता है जिनà¥à¤¹à¥‡à¤‚ आप अपने टेबलेट पर संशोधित कर सकते हैं. इससे à¤à¤ªà¥à¤¸,अपनी जानकारी के बिना उन संदेशों को भेज सकता है जो कैलेंडर सà¥à¤µà¤¾à¤®à¤¿à¤¯à¥‹à¤‚ की ओर से आते दिखाई देते हैं, या ईवेंट संशोधित कर सकता है."</string>
- <string name="permdesc_writeCalendar" product="default" msgid="2324469496327249376">"à¤à¤ªà¥à¤¸ को मितà¥à¤°à¥‹à¤‚ या सहकरà¥à¤®à¤¿à¤¯à¥‹à¤‚ के ईवेंट के साथ ही वे ईवेंट जोड़ने, निकालने, बदलने देता है जिनà¥à¤¹à¥‡à¤‚ आप अपने फ़ोन पर संशोधित कर सकते हैं. इससे à¤à¤ªà¥à¤¸, अपनी जानकारी के बिना उन संदेशों को भेज सकता है जो कैलेंडर सà¥à¤µà¤¾à¤®à¤¿à¤¯à¥‹à¤‚ की ओर से आते दिखाई देते हैं, या ईवेंट संशोधित कर सकता है."</string>
+ <string name="permdesc_writeCalendar" product="tablet" msgid="6679035520113668528">"à¤à¤ªà¥à¤¸ को मितà¥à¤°à¥‹à¤‚ या सहकरà¥à¤®à¤¿à¤¯à¥‹à¤‚ के ईवेंट के साथ ही वे ईवेंट जोड़ने, निकालने, बदलने देता है जिनà¥à¤¹à¥‡à¤‚ आप अपने टेबलेट पर संशोधित कर सकते हैं. इससे à¤à¤ªà¥à¤¸ ,अपनी जानकारी के बिना उन संदेशों को भेज सकता है जो कैलेंडर सà¥à¤µà¤¾à¤®à¤¿à¤¯à¥‹à¤‚ की ओर से आते दिखाई देते हैं, या ईवेंट संशोधित कर सकता है."</string>
+ <string name="permdesc_writeCalendar" product="default" msgid="2324469496327249376">"à¤à¤ªà¥à¤¸ को मितà¥à¤°à¥‹à¤‚ या सहकरà¥à¤®à¤¿à¤¯à¥‹à¤‚ के ईवेंट के साथ ही वे ईवेंट जोड़ने, निकालने, बदलने देता है जिनà¥à¤¹à¥‡à¤‚ आप अपने फ़ोन पर संशोधित कर सकते हैं. इससे à¤à¤ªà¥à¤¸ , अपनी जानकारी के बिना उन संदेशों को भेज सकता है जो कैलेंडर सà¥à¤µà¤¾à¤®à¤¿à¤¯à¥‹à¤‚ की ओर से आते दिखाई देते हैं, या ईवेंट संशोधित कर सकता है."</string>
<string name="permlab_accessMockLocation" msgid="8688334974036823330">"परीकà¥à¤·à¤£ के लिठनकली सà¥â€à¤¥à¤¾à¤¨ सà¥à¤°à¥‹à¤¤"</string>
- <string name="permdesc_accessMockLocation" msgid="5808711039482051824">"परीकà¥à¤·à¤£ के लिठकृतà¥à¤°à¤¿à¤® सà¥à¤¥à¤¾à¤¨ सà¥à¤°à¥‹à¤¤ बनाà¤à¤‚ या à¤à¤• नया सà¥à¤¥à¤¾à¤¨ पà¥à¤°à¤¦à¤¾à¤¤à¤¾ इंसà¥â€à¤Ÿà¥‰à¤² करें. यह à¤à¤ªà¥à¤¸ को सà¥â€à¤¥à¤¾à¤¨ और/या अनà¥â€à¤¯ सà¥à¤¥à¤¾à¤¨ सà¥à¤°à¥‹à¤¤à¥‹à¤‚ जैसे GPS या सà¥â€à¤¥à¤¾à¤¨ पà¥à¤°à¤¦à¤¾à¤¤à¤¾à¤“ं दà¥à¤µà¤¾à¤°à¤¾ लौटाई गई सà¥à¤¥à¤¿à¤¤à¤¿ को ओवरराइड करने देता है."</string>
+ <string name="permdesc_accessMockLocation" msgid="5808711039482051824">"परीकà¥à¤·à¤£ के लिठकृतà¥à¤°à¤¿à¤® सà¥à¤¥à¤¾à¤¨ सà¥à¤°à¥‹à¤¤ बनाà¤à¤‚ या à¤à¤• नया सà¥à¤¥à¤¾à¤¨ पà¥à¤°à¤¦à¤¾à¤¤à¤¾ इंसà¥â€à¤Ÿà¥‰à¤² करें. यह à¤à¤ªà¥à¤¸ को सà¥â€à¤¥à¤¾à¤¨ और/या अनà¥â€à¤¯ सà¥à¤¥à¤¾à¤¨ सà¥à¤°à¥‹à¤¤à¥‹à¤‚ जैसे GPS या सà¥â€à¤¥à¤¾à¤¨ पà¥à¤°à¤¦à¤¾à¤¤à¤¾à¤“ं दà¥à¤µà¤¾à¤°à¤¾ लौटाई गई सà¥à¤¥à¤¿à¤¤à¤¿ को ओवरराइड करने देता है."</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"अतिरिकà¥à¤¤ सà¥â€à¤¥à¤¾à¤¨ पà¥à¤°à¤¦à¤¾à¤¤à¤¾ आदेशों में पहà¥à¤‚चे"</string>
- <string name="permdesc_accessLocationExtraCommands" msgid="5945166642335800763">"à¤à¤ªà¥à¤¸ को अतिरिकà¥à¤¤ सà¥à¤¥à¤¾à¤¨ पà¥à¤°à¤¦à¤¾à¤¤à¤¾ आदेशों पर पहà¥à¤‚चने देता है. यह à¤à¤ªà¥à¤¸ को GPS या अनà¥à¤¯ सà¥à¤¥à¤¾à¤¨ सà¥à¤°à¥‹à¤¤à¥‹à¤‚ के संचालन में बाधा पहà¥à¤‚चाने दे सकता है."</string>
+ <string name="permdesc_accessLocationExtraCommands" msgid="5945166642335800763">"à¤à¤ªà¥à¤¸ को अतिरिकà¥à¤¤ सà¥à¤¥à¤¾à¤¨ पà¥à¤°à¤¦à¤¾à¤¤à¤¾ आदेशों पर पहà¥à¤‚चने देता है. यह à¤à¤ªà¥à¤¸ को GPS या अनà¥à¤¯ सà¥à¤¥à¤¾à¤¨ सà¥à¤°à¥‹à¤¤à¥‹à¤‚ के संचालन में बाधा पहà¥à¤‚चाने दे सकता है."</string>
<string name="permlab_installLocationProvider" msgid="6578101199825193873">"किसी सà¥â€à¤¥à¤¾à¤¨ पà¥à¤°à¤¦à¤¾à¤¤à¤¾ को इंसà¥â€à¤Ÿà¥‰à¤² करने की अनà¥à¤®à¤¤à¤¿"</string>
- <string name="permdesc_installLocationProvider" msgid="9066146120470591509">"परीकà¥à¤·à¤£ के लिठकृतà¥à¤°à¤¿à¤® सà¥à¤¥à¤¾à¤¨ सà¥à¤°à¥‹à¤¤ बनाà¤à¤‚ या à¤à¤• नठसà¥à¤¥à¤¾à¤¨ पà¥à¤°à¤¦à¤¾à¤¤à¤¾ को इंसà¥â€à¤Ÿà¥‰à¤² करें. यह à¤à¤ªà¥à¤¸ को सà¥â€à¤¥à¤¾à¤¨ और/या अनà¥â€à¤¯ सà¥à¤¥à¤¾à¤¨ सà¥à¤°à¥‹à¤¤à¥‹à¤‚ जैसे GPS या सà¥â€à¤¥à¤¾à¤¨ पà¥à¤°à¤¦à¤¾à¤¤à¤¾à¤“ं दà¥à¤µà¤¾à¤°à¤¾ लौटाई गई सà¥à¤¥à¤¿à¤¤à¤¿ को ओवरराइड करने देता है."</string>
+ <string name="permdesc_installLocationProvider" msgid="9066146120470591509">"परीकà¥à¤·à¤£ के लिठकृतà¥à¤°à¤¿à¤® सà¥à¤¥à¤¾à¤¨ सà¥à¤°à¥‹à¤¤ बनाà¤à¤‚ या à¤à¤• नठसà¥à¤¥à¤¾à¤¨ पà¥à¤°à¤¦à¤¾à¤¤à¤¾ को इंसà¥â€à¤Ÿà¥‰à¤² करें. यह à¤à¤ªà¥à¤¸ को सà¥â€à¤¥à¤¾à¤¨ और/या अनà¥â€à¤¯ सà¥à¤¥à¤¾à¤¨ सà¥à¤°à¥‹à¤¤à¥‹à¤‚ जैसे GPS या सà¥â€à¤¥à¤¾à¤¨ पà¥à¤°à¤¦à¤¾à¤¤à¤¾à¤“ं दà¥à¤µà¤¾à¤°à¤¾ लौटाई गई सà¥à¤¥à¤¿à¤¤à¤¿ को ओवरराइड करने देता है."</string>
<string name="permlab_accessFineLocation" msgid="1191898061965273372">"सटीक सà¥à¤¥à¤¾à¤¨ (GPS और नेटवरà¥à¤•-आधारित)"</string>
- <string name="permdesc_accessFineLocation" msgid="5295047563564981250">"à¤à¤ªà¥à¤¸ को गà¥à¤²à¥‹à¤¬à¤² पोज़िशनिंग सिसà¥à¤Ÿà¤® (GPS) या सेल टॉवर और Wi-Fi जैसे नेटवरà¥à¤• सà¥à¤¥à¤¾à¤¨ सà¥à¤°à¥‹à¤¤à¥‹à¤‚ का उपयोग करके आपका सटीक सà¥à¤¥à¤¾à¤¨ पà¥à¤°à¤¾à¤ªà¥à¤¤ करने देती है. à¤à¤ªà¥à¤¸ दà¥à¤µà¤¾à¤°à¤¾ इन सà¥à¤¥à¤¾à¤¨ सेवाओं का उपयोग किठजाने के लिठइनà¥à¤¹à¥‡à¤‚ चालू होना चाहिठऔर आपके उपकरण पर उपलबà¥à¤§ होना चाहिà¤. à¤à¤ªà¥à¤¸ इसका उपयोग यह पता करने में कर सकते हैं कि आप कहां पर हैं, और अतिरिकà¥à¤¤ बैटरी की खपत कर सकते हैं."</string>
+ <string name="permdesc_accessFineLocation" msgid="5295047563564981250">"à¤à¤ªà¥à¤¸ को गà¥à¤²à¥‹à¤¬à¤² पोज़िशनिंग सिसà¥à¤Ÿà¤® (GPS) या सेल टॉवर और Wi-Fi जैसे नेटवरà¥à¤• सà¥à¤¥à¤¾à¤¨ सà¥à¤°à¥‹à¤¤à¥‹à¤‚ का उपयोग करके आपका सटीक सà¥à¤¥à¤¾à¤¨ पà¥à¤°à¤¾à¤ªà¥à¤¤ करने देती है. à¤à¤ªà¥à¤¸ दà¥à¤µà¤¾à¤°à¤¾ इन सà¥à¤¥à¤¾à¤¨ सेवाओं का उपयोग किठजाने के लिठइनà¥à¤¹à¥‡à¤‚ चालू होना चाहिठऔर आपके उपकरण पर उपलबà¥à¤§ होना चाहिà¤. à¤à¤ªà¥à¤¸ इसका उपयोग यह पता करने में कर सकते हैं कि आप कहां पर हैं, और अतिरिकà¥à¤¤ बैटरी की खपत कर सकते हैं."</string>
<string name="permlab_accessCoarseLocation" msgid="4887895362354239628">"अनà¥à¤®à¤¾à¤¨à¤¿à¤¤ सà¥à¤¥à¤¾à¤¨ (नेटवरà¥à¤•-आधारित)"</string>
- <string name="permdesc_accessCoarseLocation" msgid="2538200184373302295">"à¤à¤ªà¥à¤¸ को आपका अनà¥à¤®à¤¾à¤¨à¤¿à¤¤ सà¥à¤¥à¤¾à¤¨ पà¥à¤°à¤¾à¤ªà¥à¤¤ करने देती है. इस सà¥à¤¥à¤¾à¤¨ को सेल टॉवर और Wi-Fi जैसे नेटवरà¥à¤• सà¥à¤¥à¤¾à¤¨ सà¥à¤°à¥‹à¤¤à¥‹à¤‚ का उपयोग करके सà¥à¤¥à¤¾à¤¨ सेवाओं दà¥à¤µà¤¾à¤°à¤¾ पà¥à¤°à¤¾à¤ªà¥à¤¤ किया गया है. à¤à¤ªà¥à¤¸ दà¥à¤µà¤¾à¤°à¤¾ इन सà¥à¤¥à¤¾à¤¨ सेवाओं का उपयोग करने के लिठइनà¥à¤¹à¥‡à¤‚ चालू होना चाहिठऔर आपके उपकरण में उपलबà¥à¤§ होना चाहिà¤. à¤à¤ªà¥à¤¸ इसका उपयोग यह पता लगाने में कर सकते हैं कि आप लगभग कहां पर हैं."</string>
+ <string name="permdesc_accessCoarseLocation" msgid="2538200184373302295">"à¤à¤ªà¥à¤¸ को आपका अनà¥à¤®à¤¾à¤¨à¤¿à¤¤ सà¥à¤¥à¤¾à¤¨ पà¥à¤°à¤¾à¤ªà¥à¤¤ करने देती है. इस सà¥à¤¥à¤¾à¤¨ को सेल टॉवर और Wi-Fi जैसे नेटवरà¥à¤• सà¥à¤¥à¤¾à¤¨ सà¥à¤°à¥‹à¤¤à¥‹à¤‚ का उपयोग करके सà¥à¤¥à¤¾à¤¨ सेवाओं दà¥à¤µà¤¾à¤°à¤¾ पà¥à¤°à¤¾à¤ªà¥à¤¤ किया गया है. à¤à¤ªà¥à¤¸ दà¥à¤µà¤¾à¤°à¤¾ इन सà¥à¤¥à¤¾à¤¨ सेवाओं का उपयोग करने के लिठइनà¥à¤¹à¥‡à¤‚ चालू होना चाहिठऔर आपके उपकरण में उपलबà¥à¤§ होना चाहिà¤. à¤à¤ªà¥à¤¸ इसका उपयोग यह पता लगाने में कर सकते हैं कि आप लगभग कहां पर हैं."</string>
<string name="permlab_accessSurfaceFlinger" msgid="2363969641792388947">"SurfaceFlinger में पहà¥à¤‚चें"</string>
- <string name="permdesc_accessSurfaceFlinger" msgid="1041619516733293551">"à¤à¤ªà¥â€à¤¸ को SurfaceFlinger निमà¥â€à¤¨-सà¥â€à¤¤à¤° सà¥à¤µà¤¿à¤§à¤¾à¤à¤‚ उपयोग करने देता है."</string>
+ <string name="permdesc_accessSurfaceFlinger" msgid="1041619516733293551">"à¤à¤ªà¥à¤¸ को SurfaceFlinger निमà¥â€à¤¨-सà¥â€à¤¤à¤° सà¥à¤µà¤¿à¤§à¤¾à¤à¤‚ उपयोग करने देता है."</string>
<string name="permlab_readFrameBuffer" msgid="6690504248178498136">"फ़à¥à¤°à¥‡à¤® बफ़र पढ़ें"</string>
- <string name="permdesc_readFrameBuffer" msgid="4937405521809454680">"à¤à¤ªà¥â€à¤¸ को फ़à¥à¤°à¥‡à¤® बफ़र की सामगà¥à¤°à¥€ पढ़ने देता है."</string>
+ <string name="permdesc_readFrameBuffer" msgid="4937405521809454680">"à¤à¤ªà¥à¤¸ को फ़à¥à¤°à¥‡à¤® बफ़र की सामगà¥à¤°à¥€ पढ़ने देता है."</string>
+ <string name="permlab_accessInputFlinger" msgid="5348635270689553857">"InputFlinger à¤à¤•à¥à¤¸à¥‡à¤¸ करें"</string>
+ <string name="permdesc_accessInputFlinger" msgid="2104864941201226616">"à¤à¤ªà¥à¤¸ को InputFlinger निमà¥â€à¤¨-सà¥â€à¤¤à¤° सà¥à¤µà¤¿à¤§à¤¾à¤“ं का उपयोग करने देता है."</string>
<string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"Wifi डिसà¥à¤ªà¥à¤²à¥‡ को कॉनà¥à¤«à¤¼à¤¿à¤—र करें"</string>
- <string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"à¤à¤ªà¥à¤¸ को कॉनà¥à¤«à¤¼à¤¿à¤—र करने देता है और Wifi डिसà¥à¤ªà¥à¤²à¥‡ से कनेकà¥à¤Ÿ करता है."</string>
+ <string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"à¤à¤ªà¥à¤¸ को कॉनà¥à¤«à¤¼à¤¿à¤—र करने देता है और Wifi डिसà¥à¤ªà¥à¤²à¥‡ से कनेकà¥à¤Ÿ करता है."</string>
<string name="permlab_controlWifiDisplay" msgid="393641276723695496">"Wifi डिसà¥à¤ªà¥à¤²à¥‡ को नियंतà¥à¤°à¤¿à¤¤ करें"</string>
- <string name="permdesc_controlWifiDisplay" msgid="4543912292681826986">"à¤à¤ªà¥à¤¸ को Wifi डिसà¥à¤ªà¥à¤²à¥‡ की निमà¥à¤¨-सà¥à¤¤à¤° की सà¥à¤µà¤¿à¤§à¤¾à¤à¤‚ नियंतà¥à¤°à¤¿à¤¤ करने देता है."</string>
+ <string name="permdesc_controlWifiDisplay" msgid="4543912292681826986">"à¤à¤ªà¥à¤¸ को Wifi डिसà¥à¤ªà¥à¤²à¥‡ की निमà¥à¤¨-सà¥à¤¤à¤° की सà¥à¤µà¤¿à¤§à¤¾à¤à¤‚ नियंतà¥à¤°à¤¿à¤¤ करने देता है."</string>
<string name="permlab_captureAudioOutput" msgid="6857134498402346708">"ऑडियो आउटपà¥à¤Ÿ को कैपà¥â€à¤šà¤° करें"</string>
- <string name="permdesc_captureAudioOutput" msgid="6210597754212208853">"à¤à¤ªà¥â€à¤¸ को ऑडियो आउटपà¥à¤Ÿ को कैपà¥â€à¤šà¤° और रीडायरेकà¥â€à¤Ÿ करने देता है."</string>
+ <string name="permdesc_captureAudioOutput" msgid="6210597754212208853">"à¤à¤ªà¥à¤¸ को ऑडियो आउटपà¥à¤Ÿ को कैपà¥â€à¤šà¤° और रीडायरेकà¥â€à¤Ÿ करने देता है."</string>
<string name="permlab_captureAudioHotword" msgid="1890553935650349808">"हॉटवरà¥à¤¡ पहचान"</string>
<string name="permdesc_captureAudioHotword" msgid="9151807958153056810">"à¤à¤ªà¥à¤²à¤¿à¤•ेशन को हॉटवरà¥à¤¡ पहचान के लिठऑडियो कैपà¥à¤šà¤° करने देती है. कैपà¥à¤šà¤° पृषà¥à¤ à¤­à¥‚मि में हो सकता है लेकिन वह अनà¥à¤¯ ऑडियो कैपà¥à¤šà¤° (उदा. कैमकॉरà¥à¤¡à¤°) को नहीं रोकता."</string>
<string name="permlab_captureVideoOutput" msgid="2246828773589094023">"वीडियो आउटपà¥à¤Ÿ को कैपà¥â€à¤šà¤° करें"</string>
- <string name="permdesc_captureVideoOutput" msgid="359481658034149860">"à¤à¤ªà¥â€à¤¸ को वीडियो आउटपà¥à¤Ÿ को कैपà¥â€à¤šà¤° और रीडायरेकà¥â€à¤Ÿ करने देता है."</string>
+ <string name="permdesc_captureVideoOutput" msgid="359481658034149860">"à¤à¤ªà¥à¤¸ को वीडियो आउटपà¥à¤Ÿ को कैपà¥â€à¤šà¤° और रीडायरेकà¥â€à¤Ÿ करने देता है."</string>
<string name="permlab_captureSecureVideoOutput" msgid="7815398969303382016">"सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ वीडियो आउटपà¥à¤Ÿ को कैपà¥â€à¤šà¤° करें"</string>
- <string name="permdesc_captureSecureVideoOutput" msgid="2779793064709350289">"à¤à¤ªà¥â€à¤¸ को सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ वीडियो आउटपà¥à¤Ÿ को कैपà¥â€à¤šà¤° और रीडायरेकà¥â€à¤Ÿ करने देता है."</string>
+ <string name="permdesc_captureSecureVideoOutput" msgid="2779793064709350289">"à¤à¤ªà¥à¤¸ को सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ वीडियो आउटपà¥à¤Ÿ को कैपà¥â€à¤šà¤° और रीडायरेकà¥â€à¤Ÿ करने देता है."</string>
<string name="permlab_mediaContentControl" msgid="8749790560720562511">"मीडिया पà¥à¤²à¥‡à¤¬à¥ˆà¤• और मेटाडेटा à¤à¤•à¥à¤¸à¥‡à¤¸ नियंतà¥à¤°à¤¿à¤¤ करें"</string>
<string name="permdesc_mediaContentControl" msgid="1637478200272062">"à¤à¤ªà¥à¤²à¤¿à¤•ेशन को मीडिया पà¥à¤²à¥‡à¤¬à¥ˆà¤• नियंतà¥à¤°à¤¿à¤¤ करने देती है और मीडिया जानकारी (शीरà¥à¤·à¤•, लेखक...) à¤à¤•à¥à¤¸à¥‡à¤¸ करने देती है."</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"अपनी ऑडियो सेटिंग बदलें"</string>
- <string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"à¤à¤ªà¥à¤¸ को वैशà¥à¤µà¤¿à¤• ऑडियो सेटिंग, जैसे वॉलà¥â€à¤¯à¥‚म और कौन-सा सà¥à¤ªà¥€à¤•र आउटपà¥à¤Ÿ के लिठउपयोग किया गया, संशोधित करने देता है."</string>
+ <string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"à¤à¤ªà¥à¤¸ को वैशà¥à¤µà¤¿à¤• ऑडियो सेटिंग, जैसे वॉलà¥â€à¤¯à¥‚म और कौन-सा सà¥à¤ªà¥€à¤•र आउटपà¥à¤Ÿ के लिठउपयोग किया गया, संशोधित करने देता है."</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"ऑडियो रिकॉरà¥à¤¡ करें"</string>
- <string name="permdesc_recordAudio" msgid="4906839301087980680">"à¤à¤ªà¥à¤¸ को माइकà¥à¤°à¥‹à¤«à¤¼à¥‹à¤¨ दà¥à¤µà¤¾à¤°à¤¾ ऑडियो रिकारà¥à¤¡ करने देता है. यह अनà¥à¤®à¤¤à¤¿ à¤à¤ªà¥à¤¸ को आपकी पà¥à¤·à¥à¤Ÿà¤¿ के बिना किसी भी समय ऑडियो रिकारà¥à¤¡ करने देती है."</string>
+ <string name="permdesc_recordAudio" msgid="4906839301087980680">"à¤à¤ªà¥à¤¸ को माइकà¥à¤°à¥‹à¤«à¤¼à¥‹à¤¨ दà¥à¤µà¤¾à¤°à¤¾ ऑडियो रिकारà¥à¤¡ करने देता है. यह अनà¥à¤®à¤¤à¤¿ à¤à¤ªà¥à¤¸ को आपकी पà¥à¤·à¥à¤Ÿà¤¿ के बिना किसी भी समय ऑडियो रिकारà¥à¤¡ करने देती है."</string>
<string name="permlab_camera" msgid="3616391919559751192">"चितà¥à¤° और वीडियो लें"</string>
- <string name="permdesc_camera" msgid="8497216524735535009">"à¤à¤ªà¥à¤¸ को कैमरे से चितà¥à¤° और वीडियो लेने देता है. यह अनà¥à¤®à¤¤à¤¿ à¤à¤ªà¥à¤¸ को किसी भी समय आपकी पà¥à¤·à¥à¤Ÿà¤¿ के बिना कैमरे का उपयोग करने देती है."</string>
+ <string name="permdesc_camera" msgid="8497216524735535009">"à¤à¤ªà¥à¤¸ को कैमरे से चितà¥à¤° और वीडियो लेने देता है. यह अनà¥à¤®à¤¤à¤¿ à¤à¤ªà¥à¤¸ को किसी भी समय आपकी पà¥à¤·à¥à¤Ÿà¤¿ के बिना कैमरे का उपयोग करने देती है."</string>
<string name="permlab_cameraDisableTransmitLed" msgid="2651072630501126222">"कैमरा उपयोग में होने पर संचारण संकेतक LED अकà¥à¤·à¤® करें"</string>
- <string name="permdesc_cameraDisableTransmitLed" msgid="4764585465480295341">"पहले से इंसà¥à¤Ÿà¥‰à¤² किठगठसिसà¥à¤Ÿà¤® à¤à¤ªà¥à¤¸ को कैमरे को संकेतक LED का उपयोग करने से अकà¥à¤·à¤® करती है."</string>
+ <string name="permdesc_cameraDisableTransmitLed" msgid="4764585465480295341">"पहले से इंसà¥à¤Ÿà¥‰à¤² किठगठसिसà¥à¤Ÿà¤® à¤à¤ªà¥à¤¸ को कैमरे को संकेतक LED का उपयोग करने से अकà¥à¤·à¤® करती है."</string>
<string name="permlab_brick" product="tablet" msgid="2961292205764488304">"सà¥â€à¤¥à¤¾à¤¯à¥€ रूप से टेबलेट अकà¥à¤·à¤® करें"</string>
<string name="permlab_brick" product="default" msgid="8337817093326370537">"फ़ोन को सà¥â€à¤¥à¤¾à¤¯à¥€ रूप से अकà¥à¤·à¤® करें"</string>
- <string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"à¤à¤ªà¥â€à¤¸ को संपूरà¥à¤£ टेबलेट को सà¥â€à¤¥à¤¾à¤¯à¥€ रूप से अकà¥à¤·à¤® करने देता है. यह बहà¥à¤¤ खतरनाक है."</string>
- <string name="permdesc_brick" product="default" msgid="5788903297627283099">"à¤à¤ªà¥â€à¤¸ को संपूरà¥à¤£ फ़ोन को सà¥â€à¤¥à¤¾à¤¯à¥€ रूप से अकà¥à¤·à¤® करने देता है. यह बहà¥à¤¤ खतरनाक है."</string>
+ <string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"à¤à¤ªà¥à¤¸ को संपूरà¥à¤£ टेबलेट को सà¥â€à¤¥à¤¾à¤¯à¥€ रूप से अकà¥à¤·à¤® करने देता है. यह बहà¥à¤¤ खतरनाक है."</string>
+ <string name="permdesc_brick" product="default" msgid="5788903297627283099">"à¤à¤ªà¥à¤¸ को संपूरà¥à¤£ फ़ोन को सà¥â€à¤¥à¤¾à¤¯à¥€ रूप से अकà¥à¤·à¤® करने देता है. यह बहà¥à¤¤ खतरनाक है."</string>
<string name="permlab_reboot" product="tablet" msgid="3436634972561795002">"टेबलेट रीबूट के लिठबाधà¥â€à¤¯ करें"</string>
<string name="permlab_reboot" product="default" msgid="2898560872462638242">"फ़ोन रीबूट के लिठबाधà¥â€à¤¯ करें"</string>
- <string name="permdesc_reboot" product="tablet" msgid="8172056180063700741">"à¤à¤ªà¥â€à¤¸ को टेबलेट रीबूट करने के लिठबाधà¥â€à¤¯ करने देता है."</string>
- <string name="permdesc_reboot" product="default" msgid="5326008124289989969">"à¤à¤ªà¥â€à¤¸ को फ़ोन बलपूरà¥à¤µà¤• रीबूट करने देता है."</string>
+ <string name="permdesc_reboot" product="tablet" msgid="8172056180063700741">"à¤à¤ªà¥à¤¸ को टेबलेट रीबूट करने के लिठबाधà¥â€à¤¯ करने देता है."</string>
+ <string name="permdesc_reboot" product="default" msgid="5326008124289989969">"à¤à¤ªà¥à¤¸ को फ़ोन बलपूरà¥à¤µà¤• रीबूट करने देता है."</string>
<string name="permlab_mount_unmount_filesystems" product="nosdcard" msgid="2927361537942591841">"USB संगà¥à¤°à¤¹à¤£ फ़ाइल सिसà¥â€à¤Ÿà¤® पर पहà¥à¤‚चें"</string>
<string name="permlab_mount_unmount_filesystems" product="default" msgid="4402305049890953810">"SD कारà¥à¤¡ फ़ाइल सिसà¥â€à¤Ÿà¤® पर पहà¥à¤‚चें"</string>
- <string name="permdesc_mount_unmount_filesystems" msgid="1829290701658992347">"à¤à¤ªà¥â€à¤¸ को निकाले जाने योगà¥â€à¤¯ संगà¥à¤°à¤¹à¤£ के लिठफ़ाइल सिसà¥â€à¤Ÿà¤® माउंट और अनमाउंट करने देता है."</string>
+ <string name="permdesc_mount_unmount_filesystems" msgid="1829290701658992347">"à¤à¤ªà¥à¤¸ को निकाले जाने योगà¥â€à¤¯ संगà¥à¤°à¤¹à¤£ के लिठफ़ाइल सिसà¥â€à¤Ÿà¤® माउंट और अनमाउंट करने देता है."</string>
<string name="permlab_mount_format_filesystems" product="nosdcard" msgid="6227819582624904972">"USB संगà¥à¤°à¤¹à¤£ मिटाà¤à¤‚"</string>
<string name="permlab_mount_format_filesystems" product="default" msgid="262582698639274056">"SD कारà¥à¤¡ मिटाà¤à¤‚"</string>
- <string name="permdesc_mount_format_filesystems" msgid="8784268246779198627">"à¤à¤ªà¥â€à¤¸ को निकालने योगà¥â€à¤¯ संगà¥à¤°à¤¹à¤£ फ़ॉरà¥à¤®à¥‡à¤Ÿ करने देता है."</string>
+ <string name="permdesc_mount_format_filesystems" msgid="8784268246779198627">"à¤à¤ªà¥à¤¸ को निकालने योगà¥â€à¤¯ संगà¥à¤°à¤¹à¤£ फ़ॉरà¥à¤®à¥‡à¤Ÿ करने देता है."</string>
<string name="permlab_asec_access" msgid="3411338632002193846">"मोबाइल संगà¥à¤°à¤¹à¤£ पर जानकारी पà¥à¤°à¤¾à¤ªà¥à¤¤ करें"</string>
- <string name="permdesc_asec_access" msgid="3094563844593878548">"à¤à¤ªà¥à¤¸ को मोबाइल संगà¥à¤°à¤¹à¤£ की जानकारी पà¥à¤°à¤¾à¤ªà¥â€à¤¤ करने देता है."</string>
+ <string name="permdesc_asec_access" msgid="3094563844593878548">"à¤à¤ªà¥à¤¸ को मोबाइल संगà¥à¤°à¤¹à¤£ की जानकारी पà¥à¤°à¤¾à¤ªà¥â€à¤¤ करने देता है."</string>
<string name="permlab_asec_create" msgid="6414757234789336327">"मोबाइल संगà¥à¤°à¤¹à¤£ बनाà¤à¤‚"</string>
- <string name="permdesc_asec_create" msgid="4558869273585856876">"à¤à¤ªà¥â€à¤¸ को मोबाइल संगà¥à¤°à¤¹à¤£ बनाने देता है."</string>
+ <string name="permdesc_asec_create" msgid="4558869273585856876">"à¤à¤ªà¥à¤¸ को मोबाइल संगà¥à¤°à¤¹à¤£ बनाने देता है."</string>
<string name="permlab_asec_destroy" msgid="526928328301618022">"मोबाइल संगà¥à¤°à¤¹à¤£ नषà¥à¤Ÿ करें"</string>
- <string name="permdesc_asec_destroy" msgid="7218749286145526537">"à¤à¤ªà¥â€à¤¸ को मोबाइल संगà¥à¤°à¤¹à¤£ नषà¥à¤Ÿ करने देता है."</string>
+ <string name="permdesc_asec_destroy" msgid="7218749286145526537">"à¤à¤ªà¥à¤¸ को मोबाइल संगà¥à¤°à¤¹à¤£ नषà¥à¤Ÿ करने देता है."</string>
<string name="permlab_asec_mount_unmount" msgid="8877998101944999386">"मोबाइल संगà¥à¤°à¤¹à¤£ माउंट/अनमाउंट करें"</string>
- <string name="permdesc_asec_mount_unmount" msgid="3451360114902490929">"à¤à¤ªà¥â€à¤¸ को मोबाइल संगà¥à¤°à¤¹à¤£ माउंट/अनमाउंट करने देता है."</string>
+ <string name="permdesc_asec_mount_unmount" msgid="3451360114902490929">"à¤à¤ªà¥à¤¸ को मोबाइल संगà¥à¤°à¤¹à¤£ माउंट/अनमाउंट करने देता है."</string>
<string name="permlab_asec_rename" msgid="7496633954080472417">"मोबाइल संगà¥à¤°à¤¹à¤£ का नाम बदलें"</string>
- <string name="permdesc_asec_rename" msgid="1794757588472127675">"à¤à¤ªà¥â€à¤¸ को मोबाइल संगà¥à¤°à¤¹à¤£ का नाम बदलने देता है."</string>
+ <string name="permdesc_asec_rename" msgid="1794757588472127675">"à¤à¤ªà¥à¤¸ को मोबाइल संगà¥à¤°à¤¹à¤£ का नाम बदलने देता है."</string>
<string name="permlab_vibrate" msgid="7696427026057705834">"कंपन नियंतà¥à¤°à¤¿à¤¤ करें"</string>
- <string name="permdesc_vibrate" msgid="6284989245902300945">"à¤à¤ªà¥â€à¤¸ को कंपनकरà¥à¤¤à¤¾ नियंतà¥à¤°à¤¿à¤¤ करने देता है."</string>
+ <string name="permdesc_vibrate" msgid="6284989245902300945">"à¤à¤ªà¥à¤¸ को कंपनकरà¥à¤¤à¤¾ नियंतà¥à¤°à¤¿à¤¤ करने देता है."</string>
<string name="permlab_flashlight" msgid="2155920810121984215">"फ़à¥à¤²à¥ˆà¤¶à¤²à¤¾à¤‡à¤Ÿ नियंतà¥à¤°à¤¿à¤¤ करें"</string>
- <string name="permdesc_flashlight" msgid="6522284794568368310">"à¤à¤ªà¥â€à¤¸ को फ़à¥à¤²à¥ˆà¤¶à¤²à¤¾à¤‡à¤Ÿ नियंतà¥à¤°à¤¿à¤¤ करने देता है."</string>
+ <string name="permdesc_flashlight" msgid="6522284794568368310">"à¤à¤ªà¥à¤¸ को फ़à¥à¤²à¥ˆà¤¶à¤²à¤¾à¤‡à¤Ÿ नियंतà¥à¤°à¤¿à¤¤ करने देता है."</string>
<string name="permlab_manageUsb" msgid="1113453430645402723">"USB उपकरणों की पà¥à¤°à¤¾à¤¥à¤®à¤¿à¤•ताà¤à¤‚ और अनà¥à¤®à¤¤à¤¿à¤¯à¤¾à¤‚ पà¥à¤°à¤¬à¤‚धित करें"</string>
- <string name="permdesc_manageUsb" msgid="7776155430218239833">"à¤à¤ªà¥â€à¤¸ को USB उपकरणों की पà¥à¤°à¤¾à¤¥à¤®à¤¿à¤•ताओं और अनà¥à¤®à¤¤à¤¿à¤¯à¥‹à¤‚ को पà¥à¤°à¤¬à¤‚धित करने देता है."</string>
+ <string name="permdesc_manageUsb" msgid="7776155430218239833">"à¤à¤ªà¥à¤¸ को USB उपकरणों की पà¥à¤°à¤¾à¤¥à¤®à¤¿à¤•ताओं और अनà¥à¤®à¤¤à¤¿à¤¯à¥‹à¤‚ को पà¥à¤°à¤¬à¤‚धित करने देता है."</string>
<string name="permlab_accessMtp" msgid="4953468676795917042">"MTP पà¥à¤°à¥‹à¤Ÿà¥‹à¤•ॉल लागू करें"</string>
<string name="permdesc_accessMtp" msgid="6532961200486791570">"MTP USB पà¥à¤°à¥‹à¤Ÿà¥‹à¤•ॉल लागू करने के लिठकरà¥à¤¨à¥‡à¤² MTP डà¥à¤°à¤¾à¤‡à¤µà¤° में पहà¥à¤‚च की अनà¥à¤®à¤¤à¤¿ देता है."</string>
<string name="permlab_hardware_test" msgid="4148290860400659146">"परीकà¥à¤·à¤£ हारà¥à¤¡à¤µà¥‡à¤¯à¤°"</string>
- <string name="permdesc_hardware_test" msgid="6597964191208016605">"à¤à¤ªà¥â€à¤¸ को हारà¥à¤¡à¤µà¥‡à¤¯à¤° परीकà¥à¤·à¤£ के लिठविविध सहायक उपकरणों को नियंतà¥à¤°à¤¿à¤¤ करने देता है."</string>
+ <string name="permdesc_hardware_test" msgid="6597964191208016605">"à¤à¤ªà¥à¤¸ को हारà¥à¤¡à¤µà¥‡à¤¯à¤° परीकà¥à¤·à¤£ के लिठविविध सहायक उपकरणों को नियंतà¥à¤°à¤¿à¤¤ करने देता है."</string>
<string name="permlab_callPhone" msgid="3925836347681847954">"फ़ोन नंबर पर सीधे कॉल करें"</string>
- <string name="permdesc_callPhone" msgid="3740797576113760827">"à¤à¤ªà¥à¤¸ को आपके हसà¥â€à¤¤à¤•à¥à¤·à¥‡à¤ª के बिना फ़ोन नंबर पर कॉल करने देता है. इसके परिणाम अपà¥à¤°à¤¤à¥â€à¤¯à¤¾à¤¶à¤¿à¤¤ शà¥à¤²à¥â€à¤• या कॉल हो सकते हैं. धà¥à¤¯à¤¾à¤¨ दें कि यह à¤à¤ªà¥à¤¸ को आपातकालीन नंबर पर कॉल नहीं करने देता. दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ à¤à¤ªà¥à¤¸ आपकी पà¥à¤·à¥à¤Ÿà¤¿ के बिना कॉल करके आपका धन वà¥â€à¤¯à¤¯ कर सकते हैं."</string>
+ <string name="permdesc_callPhone" msgid="3740797576113760827">"à¤à¤ªà¥à¤¸ को आपके हसà¥â€à¤¤à¤•à¥à¤·à¥‡à¤ª के बिना फ़ोन नंबर पर कॉल करने देता है. इसके परिणाम अपà¥à¤°à¤¤à¥â€à¤¯à¤¾à¤¶à¤¿à¤¤ शà¥à¤²à¥â€à¤• या कॉल हो सकते हैं. धà¥à¤¯à¤¾à¤¨ दें कि यह à¤à¤ªà¥à¤¸ को आपातकालीन नंबर पर कॉल नहीं करने देता. दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ à¤à¤ªà¥à¤¸ आपकी पà¥à¤·à¥à¤Ÿà¤¿ के बिना कॉल करके आपका धन वà¥â€à¤¯à¤¯ कर सकते हैं."</string>
<string name="permlab_callPrivileged" msgid="4198349211108497879">"किसी भी फ़ोन नंबर पर सीधे कॉल करें"</string>
- <string name="permdesc_callPrivileged" msgid="1689024901509996810">"à¤à¤ªà¥â€à¤¸ को आपके हसà¥â€à¤¤à¤•à¥à¤·à¥‡à¤ª के बिना आपातकालीन नंबरों सहित, किसी भी फ़ोन नंबर पर कॉल करने देता है. दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ à¤à¤ªà¥â€à¤¸ आपातकालीन सेवाओं पर अनावशà¥â€à¤¯à¤• और अवैध कॉल कर सकते हैं."</string>
+ <string name="permdesc_callPrivileged" msgid="1689024901509996810">"à¤à¤ªà¥à¤¸ को आपके हसà¥â€à¤¤à¤•à¥à¤·à¥‡à¤ª के बिना आपातकालीन नंबरों सहित, किसी भी फ़ोन नंबर पर कॉल करने देता है. दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ à¤à¤ªà¥à¤¸ आपातकालीन सेवाओं पर अनावशà¥â€à¤¯à¤• और अवैध कॉल कर सकते हैं."</string>
<string name="permlab_performCdmaProvisioning" product="tablet" msgid="4842576994144604821">"सीधे CDMA टेबलेट सेटअप पà¥à¤°à¤¾à¤°à¤‚भ करें"</string>
<string name="permlab_performCdmaProvisioning" product="default" msgid="5604848095315421425">"सीधे CDMA फ़ोन सेटअप पà¥à¤°à¤¾à¤°à¤‚भ करें"</string>
- <string name="permdesc_performCdmaProvisioning" msgid="1994193538802314186">"à¤à¤ªà¥â€à¤¸ को CDMA पà¥à¤°à¤¾à¤µà¤§à¤¾à¤¨ पà¥à¤°à¤¾à¤°à¤‚भ करने देता है. दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ à¤à¤ªà¥â€à¤¸ अनावशà¥â€à¤¯à¤• रूप से CDMA पà¥à¤°à¤¾à¤µà¤§à¤¾à¤¨ पà¥à¤°à¤¾à¤°à¤‚भ कर सकते हैं."</string>
+ <string name="permdesc_performCdmaProvisioning" msgid="1994193538802314186">"à¤à¤ªà¥à¤¸ को CDMA पà¥à¤°à¤¾à¤µà¤§à¤¾à¤¨ पà¥à¤°à¤¾à¤°à¤‚भ करने देता है. दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ à¤à¤ªà¥à¤¸ अनावशà¥â€à¤¯à¤• रूप से CDMA पà¥à¤°à¤¾à¤µà¤§à¤¾à¤¨ पà¥à¤°à¤¾à¤°à¤‚भ कर सकते हैं."</string>
<string name="permlab_locationUpdates" msgid="7785408253364335740">"सà¥â€à¤¥à¤¾à¤¨ के बारे में नई जानकारी की सूचनाओं को नियंतà¥à¤°à¤¿à¤¤ करें"</string>
- <string name="permdesc_locationUpdates" msgid="1120741557891438876">"à¤à¤ª को रेडियो से सà¥â€à¤¥à¤¾à¤¨ के बारे में नई जानकारी की सूचनाà¤à¤‚ सकà¥à¤·à¤®/अकà¥à¤·à¤® करने देता है. सामानà¥â€à¤¯ à¤à¤ªà¥â€à¤¸ दà¥à¤µà¤¾à¤°à¤¾ उपयोग करने के लिठनहीं."</string>
+ <string name="permdesc_locationUpdates" msgid="1120741557891438876">"à¤à¤ª को रेडियो से सà¥â€à¤¥à¤¾à¤¨ के बारे में नई जानकारी की सूचनाà¤à¤‚ सकà¥à¤·à¤®/अकà¥à¤·à¤® करने देता है. सामानà¥â€à¤¯ à¤à¤ªà¥à¤¸ दà¥à¤µà¤¾à¤°à¤¾ उपयोग करने के लिठनहीं."</string>
<string name="permlab_checkinProperties" msgid="7855259461268734914">"चेकइन गà¥à¤£à¥‹à¤‚ में पहà¥à¤‚चें"</string>
- <string name="permdesc_checkinProperties" msgid="4024526968630194128">"à¤à¤ªà¥à¤¸ को चेकइन सेवा दà¥à¤µà¤¾à¤°à¤¾ अपलोड किठगठगà¥à¤£à¥‹à¤‚ पर पढ़ें/लिखें पहà¥à¤‚च देता है. सामानà¥â€à¤¯ à¤à¤ªà¥â€à¤¸ दà¥à¤µà¤¾à¤°à¤¾ उपयोग करने के लिठनहीं."</string>
+ <string name="permdesc_checkinProperties" msgid="4024526968630194128">"à¤à¤ªà¥à¤¸ को चेकइन सेवा दà¥à¤µà¤¾à¤°à¤¾ अपलोड किठगठगà¥à¤£à¥‹à¤‚ पर पढ़ें/लिखें पहà¥à¤‚च देता है. सामानà¥â€à¤¯ à¤à¤ªà¥à¤¸ दà¥à¤µà¤¾à¤°à¤¾ उपयोग करने के लिठनहीं."</string>
<string name="permlab_bindGadget" msgid="776905339015863471">"विजेट चà¥à¤¨à¥‡à¤‚"</string>
- <string name="permdesc_bindGadget" msgid="8261326938599049290">"à¤à¤ªà¥à¤¸ को सिसà¥à¤Ÿà¤® को यह बताने देता है कि किस à¤à¤ªà¥à¤¸ दà¥à¤µà¤¾à¤°à¤¾ कौन से विजेट का उपयोग किया जा सकता है. कोई à¤à¤ªà¥à¤¸, इस अनà¥à¤®à¤¤à¤¿ के साथ अनà¥à¤¯ à¤à¤ªà¥à¤¸ के निजी डेटा पर पहà¥à¤‚च सकते हैं. सामानà¥â€à¤¯ à¤à¤ªà¥â€à¤¸ दà¥à¤µà¤¾à¤°à¤¾ उपयोग करने के लिठनहीं."</string>
+ <string name="permdesc_bindGadget" msgid="8261326938599049290">"à¤à¤ªà¥à¤¸ को सिसà¥à¤Ÿà¤® को यह बताने देता है कि किस à¤à¤ªà¥à¤¸ दà¥à¤µà¤¾à¤°à¤¾ कौन से विजेट का उपयोग किया जा सकता है. कोई à¤à¤ªà¥à¤¸ , इस अनà¥à¤®à¤¤à¤¿ के साथ अनà¥à¤¯ à¤à¤ªà¥à¤¸ के निजी डेटा पर पहà¥à¤‚च सकते हैं. सामानà¥â€à¤¯ à¤à¤ªà¥à¤¸ दà¥à¤µà¤¾à¤°à¤¾ उपयोग करने के लिठनहीं."</string>
<string name="permlab_modifyPhoneState" msgid="8423923777659292228">"फ़ोन सà¥â€à¤¥à¤¿à¤¤à¤¿ बदलें"</string>
- <string name="permdesc_modifyPhoneState" msgid="1029877529007686732">"à¤à¤ªà¥â€à¤¸ को उपकरण की फ़ोन सà¥à¤µà¤¿à¤§à¤¾à¤à¤‚ नियंतà¥à¤°à¤¿à¤¤ करने देता है. इस अनà¥à¤®à¤¤à¤¿ वाला कोई à¤à¤ªà¥â€à¤¸ आपको सूचित किठबिना नेटवरà¥à¤• सà¥â€à¤µà¤¿à¤š कर सकता है, फ़ोन का रेडियो चालू और बंद कर सकता है और à¤à¤¸à¥‡ ही अनà¥à¤¯ कारà¥à¤¯ कर सकता है."</string>
+ <string name="permdesc_modifyPhoneState" msgid="1029877529007686732">"à¤à¤ªà¥à¤¸ को उपकरण की फ़ोन सà¥à¤µà¤¿à¤§à¤¾à¤à¤‚ नियंतà¥à¤°à¤¿à¤¤ करने देता है. इस अनà¥à¤®à¤¤à¤¿ वाला कोई à¤à¤ªà¥à¤¸ आपको सूचित किठबिना नेटवरà¥à¤• सà¥â€à¤µà¤¿à¤š कर सकता है, फ़ोन का रेडियो चालू और बंद कर सकता है और à¤à¤¸à¥‡ ही अनà¥à¤¯ कारà¥à¤¯ कर सकता है."</string>
<string name="permlab_readPhoneState" msgid="9178228524507610486">"फ़ोन की सà¥â€à¤¥à¤¿à¤¤à¤¿ और पहचान पढ़ें"</string>
- <string name="permdesc_readPhoneState" msgid="1639212771826125528">"à¤à¤ªà¥à¤¸ को उपकरण की फ़ोन सà¥à¤µà¤¿à¤§à¤¾à¤“ं तक पहà¥à¤‚चने देता है. यह अनà¥à¤®à¤¤à¤¿ à¤à¤ªà¥à¤¸ को फ़ोन नंबर और उपकरण आईडी, कॉल सकà¥à¤°à¤¿à¤¯ है या नहीं, और कॉल दà¥à¤µà¤¾à¤°à¤¾ कनेकà¥à¤Ÿ किया गया दूरसà¥â€à¤¥ नंबर निरà¥à¤§à¤¾à¤°à¤¿à¤¤ करने देती है."</string>
+ <string name="permdesc_readPhoneState" msgid="1639212771826125528">"à¤à¤ªà¥à¤¸ को उपकरण की फ़ोन सà¥à¤µà¤¿à¤§à¤¾à¤“ं तक पहà¥à¤‚चने देता है. यह अनà¥à¤®à¤¤à¤¿ à¤à¤ªà¥à¤¸ को फ़ोन नंबर और उपकरण आईडी, कॉल सकà¥à¤°à¤¿à¤¯ है या नहीं, और कॉल दà¥à¤µà¤¾à¤°à¤¾ कनेकà¥à¤Ÿ किया गया दूरसà¥â€à¤¥ नंबर निरà¥à¤§à¤¾à¤°à¤¿à¤¤ करने देती है."</string>
<string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"टेबलेट को निषà¥â€à¤•à¥à¤°à¤¿à¤¯ होने से रोकें"</string>
<string name="permlab_wakeLock" product="default" msgid="573480187941496130">"फ़ोन को निषà¥â€à¤•à¥à¤°à¤¿à¤¯ होने से रोकें"</string>
- <string name="permdesc_wakeLock" product="tablet" msgid="7311319824400447868">"à¤à¤ªà¥à¤¸ को टेबलेट को पà¥à¤°à¤¯à¥‹à¤— में नहीं हो जाने से रोकता है."</string>
- <string name="permdesc_wakeLock" product="default" msgid="8559100677372928754">"à¤à¤ªà¥à¤¸ को फ़ोन को पà¥à¤°à¤¯à¥‹à¤— में नहीं होने से रोकता है."</string>
+ <string name="permdesc_wakeLock" product="tablet" msgid="7311319824400447868">"à¤à¤ªà¥à¤¸ को टेबलेट को पà¥à¤°à¤¯à¥‹à¤— में नहीं हो जाने से रोकता है."</string>
+ <string name="permdesc_wakeLock" product="default" msgid="8559100677372928754">"à¤à¤ªà¥à¤¸ को फ़ोन को पà¥à¤°à¤¯à¥‹à¤— में नहीं होने से रोकता है."</string>
<string name="permlab_transmitIr" msgid="7545858504238530105">"इंफ़à¥à¤°à¤¾à¤°à¥‡à¤¡ संचारित करें"</string>
<string name="permdesc_transmitIr" product="tablet" msgid="5358308854306529170">"à¤à¤ªà¥à¤²à¤¿à¤•ेशन को टेबलेट के इंफ़à¥à¤°à¤¾à¤°à¥‡à¤¡ टà¥à¤°à¤¾à¤‚समीटर का उपयोग करने देती है."</string>
<string name="permdesc_transmitIr" product="default" msgid="7957763745020300725">"à¤à¤ªà¥à¤²à¤¿à¤•ेशन को फ़ोन के इंफ़à¥à¤°à¤¾à¤°à¥‡à¤¡ टà¥à¤°à¤¾à¤‚समीटर का उपयोग करने देती है."</string>
<string name="permlab_devicePower" product="tablet" msgid="2787034722616350417">"टेबलेट चालू या बंद करें"</string>
<string name="permlab_devicePower" product="default" msgid="4928622470980943206">"फ़ोन चालू या बंद करें"</string>
- <string name="permdesc_devicePower" product="tablet" msgid="6689862878984631831">"à¤à¤ªà¥â€à¤¸ को टेबलेट चालू या बंद करने देता है."</string>
- <string name="permdesc_devicePower" product="default" msgid="6037057348463131032">"à¤à¤ªà¥â€à¤¸ को फ़ोन चालू या बंद करने देता है."</string>
+ <string name="permdesc_devicePower" product="tablet" msgid="6689862878984631831">"à¤à¤ªà¥à¤¸ को टेबलेट चालू या बंद करने देता है."</string>
+ <string name="permdesc_devicePower" product="default" msgid="6037057348463131032">"à¤à¤ªà¥à¤¸ को फ़ोन चालू या बंद करने देता है."</string>
<string name="permlab_factoryTest" msgid="3715225492696416187">"फ़ैकà¥â€à¤Ÿà¥à¤°à¥€ परीकà¥à¤·à¤£ मोड में चलाà¤à¤‚"</string>
<string name="permdesc_factoryTest" product="tablet" msgid="3952059318359653091">"टेबलेट हारà¥à¤¡à¤µà¥‡à¤¯à¤° में पूरà¥à¤£ पहà¥à¤‚च की अनà¥à¤®à¤¤à¤¿ देते हà¥à¤ निमà¥â€à¤¨-सà¥â€à¤¤à¤° निरà¥à¤®à¤¾à¤¤à¤¾ परीकà¥à¤·à¤£ के रूप में चलाà¤à¤‚. केवल तभी उपलबà¥â€à¤§ जब कोई टेबलेट निरà¥à¤®à¤¾à¤¤à¤¾ परीकà¥à¤·à¤£ मोड में चल रहा हो."</string>
<string name="permdesc_factoryTest" product="default" msgid="8136644990319244802">"फ़ोन हारà¥à¤¡à¤µà¥‡à¤¯à¤° में पूरà¥à¤£ पहà¥à¤‚च की अनà¥à¤®à¤¤à¤¿ देते हà¥à¤ निमà¥â€à¤¨-सà¥â€à¤¤à¤° निरà¥à¤®à¤¾à¤¤à¤¾ परीकà¥à¤·à¤£ के रूप में चलाà¤à¤‚. केवल तभी उपलबà¥â€à¤§ जब कोई फ़ोन निरà¥à¤®à¤¾à¤¤à¤¾ परीकà¥à¤·à¤£ मोड में चल रहा हो."</string>
<string name="permlab_setWallpaper" msgid="6627192333373465143">"वॉलपेपर सेट करें"</string>
- <string name="permdesc_setWallpaper" msgid="7373447920977624745">"à¤à¤ªà¥â€à¤¸ को सिसà¥â€à¤Ÿà¤® वॉलपेपर सेट करने देता है."</string>
+ <string name="permdesc_setWallpaper" msgid="7373447920977624745">"à¤à¤ªà¥à¤¸ को सिसà¥â€à¤Ÿà¤® वॉलपेपर सेट करने देता है."</string>
<string name="permlab_setWallpaperHints" msgid="3278608165977736538">"अपने वॉलपेपर का आकार à¤à¤¡à¤œà¤¸à¥à¤Ÿ करें"</string>
- <string name="permdesc_setWallpaperHints" msgid="8235784384223730091">"à¤à¤ªà¥â€à¤¸ को सिसà¥â€à¤Ÿà¤® वॉलपेपर आकार संकेत सेट करने देता है."</string>
+ <string name="permdesc_setWallpaperHints" msgid="8235784384223730091">"à¤à¤ªà¥à¤¸ को सिसà¥â€à¤Ÿà¤® वॉलपेपर आकार संकेत सेट करने देता है."</string>
<string name="permlab_masterClear" msgid="2315750423139697397">"फ़ैकà¥â€à¤Ÿà¥à¤°à¥€ डिफ़ॉलà¥â€à¤Ÿ पर सिसà¥â€à¤Ÿà¤® रीसेट करें"</string>
- <string name="permdesc_masterClear" msgid="3665380492633910226">"à¤à¤ªà¥à¤¸ को सभी डेटा, कॉनà¥à¤«à¤¼à¤¿à¤—रेशन, और इंसà¥à¤Ÿà¥‰à¤² à¤à¤ªà¥à¤¸ मिटाकर, सिसà¥à¤Ÿà¤® को पूरी तरह उसकी फ़ैकà¥à¤Ÿà¤°à¥€ सेटिंग पर रीसेट करने देता है."</string>
+ <string name="permdesc_masterClear" msgid="3665380492633910226">"à¤à¤ªà¥à¤¸ को सभी डेटा, कॉनà¥à¤«à¤¼à¤¿à¤—रेशन, और इंसà¥à¤Ÿà¥‰à¤² à¤à¤ªà¥à¤¸ मिटाकर, सिसà¥à¤Ÿà¤® को पूरी तरह उसकी फ़ैकà¥à¤Ÿà¤°à¥€ सेटिंग पर रीसेट करने देता है."</string>
<string name="permlab_setTime" msgid="2021614829591775646">"समय सेट करें"</string>
- <string name="permdesc_setTime" product="tablet" msgid="1896341438151152881">"à¤à¤ªà¥â€à¤¸ को टेबलेट की घड़ी का समय बदलने देता है."</string>
- <string name="permdesc_setTime" product="default" msgid="1855702730738020">"à¤à¤ªà¥â€à¤¸ को फ़ोन की घड़ी का समय बदलने देता है."</string>
+ <string name="permdesc_setTime" product="tablet" msgid="1896341438151152881">"à¤à¤ªà¥à¤¸ को टेबलेट की घड़ी का समय बदलने देता है."</string>
+ <string name="permdesc_setTime" product="default" msgid="1855702730738020">"à¤à¤ªà¥à¤¸ को फ़ोन की घड़ी का समय बदलने देता है."</string>
<string name="permlab_setTimeZone" msgid="2945079801013077340">"समय कà¥à¤·à¥‡à¤¤à¥à¤° सेट करें"</string>
- <string name="permdesc_setTimeZone" product="tablet" msgid="1676983712315827645">"à¤à¤ªà¥â€à¤¸ को टेबलेट का समय कà¥à¤·à¥‡à¤¤à¥à¤° बदलने देता है."</string>
- <string name="permdesc_setTimeZone" product="default" msgid="4499943488436633398">"à¤à¤ªà¥â€à¤¸ को टेबलेट का समय कà¥à¤·à¥‡à¤¤à¥à¤° बदलने देता है."</string>
+ <string name="permdesc_setTimeZone" product="tablet" msgid="1676983712315827645">"à¤à¤ªà¥à¤¸ को टेबलेट का समय कà¥à¤·à¥‡à¤¤à¥à¤° बदलने देता है."</string>
+ <string name="permdesc_setTimeZone" product="default" msgid="4499943488436633398">"à¤à¤ªà¥à¤¸ को टेबलेट का समय कà¥à¤·à¥‡à¤¤à¥à¤° बदलने देता है."</string>
<string name="permlab_accountManagerService" msgid="4829262349691386986">"खाता पà¥à¤°à¤¬à¤‚धक सेवा के रूप में कारà¥à¤¯ करें"</string>
- <string name="permdesc_accountManagerService" msgid="1948455552333615954">"à¤à¤ªà¥â€à¤¸ को खाता पà¥à¤°à¤®à¤¾à¤£à¤•ों को कॉल करने देता है."</string>
+ <string name="permdesc_accountManagerService" msgid="1948455552333615954">"à¤à¤ªà¥à¤¸ को खाता पà¥à¤°à¤®à¤¾à¤£à¤•ों को कॉल करने देता है."</string>
<string name="permlab_getAccounts" msgid="1086795467760122114">"उपकरण पर खाते ढूंढें"</string>
- <string name="permdesc_getAccounts" product="tablet" msgid="2741496534769660027">"à¤à¤ªà¥à¤¸ को टेबलेट दà¥à¤µà¤¾à¤°à¤¾ जà¥à¤žà¤¾à¤¤ खातों की सूची पà¥à¤°à¤¾à¤ªà¥â€à¤¤ करने देता है. इसमें वे खाते शामिल हो सकते हैं जिनà¥â€à¤¹à¥‡à¤‚ आपके दà¥à¤µà¤¾à¤°à¤¾ इंसà¥â€à¤Ÿà¥‰à¤² किठगठà¤à¤ªà¥à¤¸ ने बनाया है."</string>
- <string name="permdesc_getAccounts" product="default" msgid="3448316822451807382">"à¤à¤ªà¥à¤¸ को फ़ोन दà¥à¤µà¤¾à¤°à¤¾ जà¥à¤žà¤¾à¤¤ खातों की सूची पà¥à¤°à¤¾à¤ªà¥â€à¤¤ करने देता है. इसमें वे खाते शामिल हो सकते हैं जिनà¥â€à¤¹à¥‡à¤‚ आपके दà¥à¤µà¤¾à¤°à¤¾ इंसà¥â€à¤Ÿà¥‰à¤² किठगठà¤à¤ªà¥à¤¸ ने बनाया है."</string>
+ <string name="permdesc_getAccounts" product="tablet" msgid="2741496534769660027">"à¤à¤ªà¥à¤¸ को टेबलेट दà¥à¤µà¤¾à¤°à¤¾ जà¥à¤žà¤¾à¤¤ खातों की सूची पà¥à¤°à¤¾à¤ªà¥â€à¤¤ करने देता है. इसमें वे खाते शामिल हो सकते हैं जिनà¥â€à¤¹à¥‡à¤‚ आपके दà¥à¤µà¤¾à¤°à¤¾ इंसà¥â€à¤Ÿà¥‰à¤² किठगठà¤à¤ªà¥à¤¸ ने बनाया है."</string>
+ <string name="permdesc_getAccounts" product="default" msgid="3448316822451807382">"à¤à¤ªà¥à¤¸ को फ़ोन दà¥à¤µà¤¾à¤°à¤¾ जà¥à¤žà¤¾à¤¤ खातों की सूची पà¥à¤°à¤¾à¤ªà¥â€à¤¤ करने देता है. इसमें वे खाते शामिल हो सकते हैं जिनà¥â€à¤¹à¥‡à¤‚ आपके दà¥à¤µà¤¾à¤°à¤¾ इंसà¥â€à¤Ÿà¥‰à¤² किठगठà¤à¤ªà¥à¤¸ ने बनाया है."</string>
<string name="permlab_authenticateAccounts" msgid="5265908481172736933">"खाते बनाà¤à¤‚ और पासवरà¥à¤¡ सेट करें"</string>
<string name="permdesc_authenticateAccounts" msgid="5472124296908977260">"à¤à¤ªà¥â€à¤¿à¤²à¤•ेशन को खाता बनाने और उनके पासवरà¥à¤¡ पà¥à¤°à¤¾à¤ªà¥à¤¤ करने और सेट करने सहित, खाता पà¥à¤°à¤¬à¤‚धक की खाता पà¥à¤°à¤®à¤¾à¤£à¤• कà¥à¤·à¤®à¤¤à¤¾à¤“ं का उपयोग करने देता है."</string>
<string name="permlab_manageAccounts" msgid="4983126304757177305">"खाते जोडें या निकालें"</string>
- <string name="permdesc_manageAccounts" msgid="8698295625488292506">"à¤à¤ªà¥â€à¤¸ को खाते जोड़ना और निकालना और उनके पासवरà¥à¤¡ हटाने जैसे कारà¥à¤¯ करने देता है."</string>
+ <string name="permdesc_manageAccounts" msgid="8698295625488292506">"à¤à¤ªà¥à¤¸ को खाते जोड़ना और निकालना और उनके पासवरà¥à¤¡ हटाने जैसे कारà¥à¤¯ करने देता है."</string>
<string name="permlab_useCredentials" msgid="235481396163877642">"उपकरण पर खातों का उपयोग करें"</string>
- <string name="permdesc_useCredentials" msgid="7984227147403346422">"à¤à¤ªà¥à¤¸ को पà¥à¤°à¤®à¤¾à¤£à¥€à¤•रण टोकन का अनà¥à¤°à¥‹à¤§ करने देता है."</string>
+ <string name="permdesc_useCredentials" msgid="7984227147403346422">"à¤à¤ªà¥à¤¸ को पà¥à¤°à¤®à¤¾à¤£à¥€à¤•रण टोकन का अनà¥à¤°à¥‹à¤§ करने देता है."</string>
<string name="permlab_accessNetworkState" msgid="4951027964348974773">"नेटवरà¥à¤• कनेकà¥â€à¤¶à¤¨ देखें"</string>
- <string name="permdesc_accessNetworkState" msgid="8318964424675960975">"à¤à¤ªà¥à¤¸ को नेटवरà¥à¤• कनेकà¥â€à¤¶à¤¨ के बारे में जानकारी देखने देता है जैसे कौन से नेटवरà¥à¤• मौजूद हैं और कनेकà¥â€à¤Ÿ हैं."</string>
+ <string name="permdesc_accessNetworkState" msgid="8318964424675960975">"à¤à¤ªà¥à¤¸ को नेटवरà¥à¤• कनेकà¥â€à¤¶à¤¨ के बारे में जानकारी देखने देता है जैसे कौन से नेटवरà¥à¤• मौजूद हैं और कनेकà¥â€à¤Ÿ हैं."</string>
<string name="permlab_createNetworkSockets" msgid="8018758136404323658">"पूरà¥à¤£ नेटवरà¥à¤• पहà¥à¤‚च"</string>
- <string name="permdesc_createNetworkSockets" msgid="3403062187779724185">"à¤à¤ªà¥à¤¸ को नेटवरà¥à¤• सॉकेट बनाने और कसà¥â€à¤Ÿà¤® नेटवरà¥à¤• पà¥à¤°à¥‹à¤Ÿà¥‹à¤•ॉल का उपयोग करने देता है. बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° और अनà¥â€à¤¯ à¤à¤ªà¥à¤¸ इंटरनेट को डेटा भेजने के साधन उपलबà¥â€à¤§ कराते हैं, ताकि इंटरनेट को डेटा भेजने के लिठइस अनà¥à¤®à¤¤à¤¿ की आवशà¥â€à¤¯à¤•ता नहीं हो."</string>
+ <string name="permdesc_createNetworkSockets" msgid="3403062187779724185">"à¤à¤ªà¥à¤¸ को नेटवरà¥à¤• सॉकेट बनाने और कसà¥â€à¤Ÿà¤® नेटवरà¥à¤• पà¥à¤°à¥‹à¤Ÿà¥‹à¤•ॉल का उपयोग करने देता है. बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° और अनà¥â€à¤¯ à¤à¤ªà¥à¤¸ इंटरनेट को डेटा भेजने के साधन उपलबà¥â€à¤§ कराते हैं, ताकि इंटरनेट को डेटा भेजने के लिठइस अनà¥à¤®à¤¤à¤¿ की आवशà¥â€à¤¯à¤•ता नहीं हो."</string>
<string name="permlab_writeApnSettings" msgid="505660159675751896">"नेटवरà¥à¤• सेटिंग और टà¥à¤°à¥ˆà¤«à¤¼à¤¿à¤• बदलें/रोकें"</string>
- <string name="permdesc_writeApnSettings" msgid="5333798886412714193">"à¤à¤ªà¥à¤¸ को नेटवरà¥à¤• सेटिंग बदलने और सभी टà¥à¤°à¥ˆà¤«à¤¼à¤¿à¤• नेटवरà¥à¤• को बाधित और निरीकà¥à¤·à¤£ करने देता है, उदाहरण के लिठकिसी APN का पà¥à¤°à¥‰à¤•à¥à¤¸à¥€ और पोरà¥à¤Ÿ बदलना. दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ à¤à¤ªà¥à¤¸ आपकी जानकारी के बिना नेटवरà¥à¤• पैकेट की निगरानी कर सकते हैं, उनà¥à¤¹à¥‡à¤‚ रीडायरेकà¥à¤Ÿ, या संशोधित कर सकते हैं."</string>
+ <string name="permdesc_writeApnSettings" msgid="5333798886412714193">"à¤à¤ªà¥à¤¸ को नेटवरà¥à¤• सेटिंग बदलने और सभी टà¥à¤°à¥ˆà¤«à¤¼à¤¿à¤• नेटवरà¥à¤• को बाधित और निरीकà¥à¤·à¤£ करने देता है, उदाहरण के लिठकिसी APN का पà¥à¤°à¥‰à¤•à¥à¤¸à¥€ और पोरà¥à¤Ÿ बदलना. दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ à¤à¤ªà¥à¤¸ आपकी जानकारी के बिना नेटवरà¥à¤• पैकेट की निगरानी कर सकते हैं, उनà¥à¤¹à¥‡à¤‚ रीडायरेकà¥à¤Ÿ, या संशोधित कर सकते हैं."</string>
<string name="permlab_changeNetworkState" msgid="958884291454327309">"नेटवरà¥à¤• कनेकà¥â€à¤Ÿà¤¿à¤µà¤¿à¤Ÿà¥€ बदलें"</string>
- <string name="permdesc_changeNetworkState" msgid="6789123912476416214">"à¤à¤ªà¥à¤¸ को नेटवरà¥à¤• कनेकà¥à¤Ÿà¤¿à¤µà¤¿à¤Ÿà¥€ की सà¥à¤¥à¤¿à¤¤à¤¿ बदलने देता है."</string>
+ <string name="permdesc_changeNetworkState" msgid="6789123912476416214">"à¤à¤ªà¥à¤¸ को नेटवरà¥à¤• कनेकà¥à¤Ÿà¤¿à¤µà¤¿à¤Ÿà¥€ की सà¥à¤¥à¤¿à¤¤à¤¿ बदलने देता है."</string>
<string name="permlab_changeTetherState" msgid="5952584964373017960">"टेदर की गई कनेकà¥â€à¤Ÿà¤¿à¤µà¤¿à¤Ÿà¥€ बदलें"</string>
- <string name="permdesc_changeTetherState" msgid="1524441344412319780">"à¤à¤ªà¥â€à¤¸ को टेदर की गई नेटवरà¥à¤• कनेकà¥â€à¤Ÿà¤¿à¤µà¤¿à¤Ÿà¥€ की सà¥â€à¤¥à¤¿à¤¤à¤¿ बदलने देता है."</string>
+ <string name="permdesc_changeTetherState" msgid="1524441344412319780">"à¤à¤ªà¥à¤¸ को टेदर की गई नेटवरà¥à¤• कनेकà¥â€à¤Ÿà¤¿à¤µà¤¿à¤Ÿà¥€ की सà¥â€à¤¥à¤¿à¤¤à¤¿ बदलने देता है."</string>
<string name="permlab_changeBackgroundDataSetting" msgid="1400666012671648741">"पृषà¥à¤ à¤­à¥‚मि डेटा उपयोग सेटिंग बदलें"</string>
- <string name="permdesc_changeBackgroundDataSetting" msgid="5347729578468744379">"à¤à¤ªà¥â€à¤¸ को पृषà¥à¤ à¤­à¥‚मि डेटा उपयोग सेटिंग बदलने देता है."</string>
+ <string name="permdesc_changeBackgroundDataSetting" msgid="5347729578468744379">"à¤à¤ªà¥à¤¸ को पृषà¥à¤ à¤­à¥‚मि डेटा उपयोग सेटिंग बदलने देता है."</string>
<string name="permlab_accessWifiState" msgid="5202012949247040011">"Wi-Fi कनेकà¥â€à¤¶à¤¨ देखें"</string>
- <string name="permdesc_accessWifiState" msgid="5002798077387803726">"à¤à¤ªà¥à¤¸ को Wi-Fi नेटवरà¥à¤• के बारे में जानकारी, जैसे WI-Fi सकà¥à¤·à¤® है या नहीं और कनेकà¥â€à¤Ÿ किठगठWi-Fi उपकरणों के नाम, देखने देता है."</string>
+ <string name="permdesc_accessWifiState" msgid="5002798077387803726">"à¤à¤ªà¥à¤¸ को Wi-Fi नेटवरà¥à¤• के बारे में जानकारी, जैसे WI-Fi सकà¥à¤·à¤® है या नहीं और कनेकà¥â€à¤Ÿ किठगठWi-Fi उपकरणों के नाम, देखने देता है."</string>
<string name="permlab_changeWifiState" msgid="6550641188749128035">"Wi-Fi से कनेकà¥â€à¤Ÿ और डिसà¥â€à¤•नेकà¥â€à¤Ÿ करें"</string>
- <string name="permdesc_changeWifiState" msgid="7137950297386127533">"à¤à¤ªà¥à¤¸ को Wi-Fi पहà¥à¤‚च बिंदà¥à¤“ं से कनेकà¥à¤Ÿ और डिसà¥à¤•नेकà¥à¤Ÿ करने और Wi-Fi नेटवरà¥à¤• के लिठउपकरण कॉनà¥à¤«à¤¼à¤¿à¤—रेशन में परिवरà¥à¤¤à¤¨ करने देता है."</string>
+ <string name="permdesc_changeWifiState" msgid="7137950297386127533">"à¤à¤ªà¥à¤¸ को Wi-Fi पहà¥à¤‚च बिंदà¥à¤“ं से कनेकà¥à¤Ÿ और डिसà¥à¤•नेकà¥à¤Ÿ करने और Wi-Fi नेटवरà¥à¤• के लिठउपकरण कॉनà¥à¤«à¤¼à¤¿à¤—रेशन में परिवरà¥à¤¤à¤¨ करने देता है."</string>
<string name="permlab_changeWifiMulticastState" msgid="1368253871483254784">"Wi-Fi मलà¥â€à¤Ÿà¥€à¤•ासà¥â€à¤Ÿ पà¥à¤°à¤¾à¤ªà¥à¤¤à¤¿ को अनà¥à¤®à¤¤à¤¿ दें"</string>
- <string name="permdesc_changeWifiMulticastState" product="tablet" msgid="7969774021256336548">"à¤à¤ªà¥à¤¸ को Wi-Fi नेटवरà¥à¤• पर मलà¥à¤Ÿà¥€à¤•ासà¥à¤Ÿ पते के उपयोग से केवल आपके टेबलेट पर ही नहीं, बलà¥à¤•ि सभी उपकरणों पर भेजे गठपैकेट पà¥à¤°à¤¾à¤ªà¥â€à¤¤ करने देता है. यह गैर-मलà¥à¤Ÿà¥€à¤•ासà¥à¤Ÿ मोड से अधिक पावर का उपयोग करता है."</string>
- <string name="permdesc_changeWifiMulticastState" product="default" msgid="6851949706025349926">"à¤à¤ªà¥à¤¸ को Wi-Fi नेटवरà¥à¤• पर मलà¥à¤Ÿà¥€à¤•ासà¥à¤Ÿ पते के उपयोग से केवल आपके फ़ोन पर ही नहीं, बलà¥à¤•ि सभी उपकरणों पर भेजे गठपैकेट पà¥à¤°à¤¾à¤ªà¥â€à¤¤ करने देता है. यह गैर-मलà¥à¤Ÿà¥€à¤•ासà¥à¤Ÿ मोड से अधिक पावर का उपयोग करता है."</string>
+ <string name="permdesc_changeWifiMulticastState" product="tablet" msgid="7969774021256336548">"à¤à¤ªà¥à¤¸ को Wi-Fi नेटवरà¥à¤• पर मलà¥à¤Ÿà¥€à¤•ासà¥à¤Ÿ पते के उपयोग से केवल आपके टेबलेट पर ही नहीं, बलà¥à¤•ि सभी उपकरणों पर भेजे गठपैकेट पà¥à¤°à¤¾à¤ªà¥â€à¤¤ करने देता है. यह गैर-मलà¥à¤Ÿà¥€à¤•ासà¥à¤Ÿ मोड से अधिक पावर का उपयोग करता है."</string>
+ <string name="permdesc_changeWifiMulticastState" product="default" msgid="6851949706025349926">"à¤à¤ªà¥à¤¸ को Wi-Fi नेटवरà¥à¤• पर मलà¥à¤Ÿà¥€à¤•ासà¥à¤Ÿ पते के उपयोग से केवल आपके फ़ोन पर ही नहीं, बलà¥à¤•ि सभी उपकरणों पर भेजे गठपैकेट पà¥à¤°à¤¾à¤ªà¥â€à¤¤ करने देता है. यह गैर-मलà¥à¤Ÿà¥€à¤•ासà¥à¤Ÿ मोड से अधिक पावर का उपयोग करता है."</string>
<string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"Bluetooth सेटिंग पर पहà¥à¤‚चें"</string>
- <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"किसी à¤à¤ªà¥â€à¤¸ को सà¥â€à¤¥à¤¾à¤¨à¥€à¤¯ Bluetooth टेबलेट कॉनà¥â€à¤«à¤¼à¤¿à¤—र करने की और रिमोट उपकरणों के साथ खोजने और यà¥à¤—à¥â€à¤®à¤¿à¤¤ करने देता है."</string>
- <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"à¤à¤ªà¥â€à¤¸ को सà¥â€à¤¥à¤¾à¤¨à¥€à¤¯ Bluetooth फ़ोन कॉनà¥â€à¤«à¤¼à¤¿à¤—र करने देता है, और रिमोट उपकरणों के साथ खोजने और यà¥à¤—à¥â€à¤®à¤¿à¤¤ करने देता है."</string>
+ <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"किसी à¤à¤ªà¥à¤¸ को सà¥â€à¤¥à¤¾à¤¨à¥€à¤¯ Bluetooth टेबलेट कॉनà¥â€à¤«à¤¼à¤¿à¤—र करने की और रिमोट उपकरणों के साथ खोजने और यà¥à¤—à¥â€à¤®à¤¿à¤¤ करने देता है."</string>
+ <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"à¤à¤ªà¥à¤¸ को सà¥â€à¤¥à¤¾à¤¨à¥€à¤¯ Bluetooth फ़ोन कॉनà¥â€à¤«à¤¼à¤¿à¤—र करने देता है, और रिमोट उपकरणों के साथ खोजने और यà¥à¤—à¥â€à¤®à¤¿à¤¤ करने देता है."</string>
<string name="permlab_bluetoothPriv" msgid="4009494246009513828">"à¤à¤ªà¥â€à¤²à¤¿à¤•ेशन के दà¥à¤µà¤¾à¤°à¤¾ Bluetooth यà¥à¤—à¥â€à¤®à¤¨ करने देती है"</string>
<string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"à¤à¤ªà¥â€à¤²à¤¿à¤•ेशन को उपयोगकरà¥à¤¤à¤¾ के इंटरैकà¥à¤¶à¤¨ के बिना दूरसà¥â€à¤¥ उपकरणों के साथ यà¥à¤—à¥â€à¤®à¤¿à¤¤ करने देती है."</string>
<string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"à¤à¤ªà¥â€à¤²à¤¿à¤•ेशन को उपयोगकरà¥à¤¤à¤¾ के इंटरैकà¥à¤¶à¤¨ के बिना दूरसà¥â€à¤¥ उपकरणों के साथ यà¥à¤—à¥â€à¤®à¤¿à¤¤ करने देती है."</string>
<string name="permlab_accessWimaxState" msgid="4195907010610205703">"WiMAX से कनेकà¥à¤Ÿ और डिसà¥à¤•नेकà¥à¤Ÿ करें"</string>
- <string name="permdesc_accessWimaxState" msgid="6360102877261978887">"à¤à¤ªà¥à¤¸ को WiMAX सकà¥à¤·à¤® है या नहीं और कनेकà¥â€à¤Ÿ किठगठकिसी WiMAX नेटवरà¥à¤• के बारे में जानकारी निरà¥à¤§à¤¾à¤°à¤¿à¤¤ करने देता है."</string>
+ <string name="permdesc_accessWimaxState" msgid="6360102877261978887">"à¤à¤ªà¥à¤¸ को WiMAX सकà¥à¤·à¤® है या नहीं और कनेकà¥â€à¤Ÿ किठगठकिसी WiMAX नेटवरà¥à¤• के बारे में जानकारी निरà¥à¤§à¤¾à¤°à¤¿à¤¤ करने देता है."</string>
<string name="permlab_changeWimaxState" msgid="2405042267131496579">"WiMAX सà¥â€à¤¥à¤¿à¤¤à¤¿ बदलें"</string>
- <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"à¤à¤ªà¥â€à¤¸ को WiMAX नेटवरà¥à¤• से टेबलेट को कनेकà¥â€à¤Ÿ और डिसà¥â€à¤•नेकà¥â€à¤Ÿ करने देता है."</string>
- <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"à¤à¤ªà¥â€à¤¸ को WiMAX नेटवरà¥à¤• से फ़ोन को कनेकà¥â€à¤Ÿ और डिसà¥â€à¤•नेकà¥â€à¤Ÿ करने देता है."</string>
+ <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"à¤à¤ªà¥à¤¸ को WiMAX नेटवरà¥à¤• से टेबलेट को कनेकà¥â€à¤Ÿ और डिसà¥â€à¤•नेकà¥â€à¤Ÿ करने देता है."</string>
+ <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"à¤à¤ªà¥à¤¸ को WiMAX नेटवरà¥à¤• से फ़ोन को कनेकà¥â€à¤Ÿ और डिसà¥â€à¤•नेकà¥â€à¤Ÿ करने देता है."</string>
<string name="permlab_bluetooth" msgid="6127769336339276828">"Bluetooth उपकरणों के साथ यà¥à¤—à¥à¤®à¤¿à¤¤ करें"</string>
- <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"à¤à¤ªà¥â€à¤¸ को टेबलेट पर Bluetooth का कॉनà¥â€à¤«à¤¼à¤¿à¤—रेशन देखने, और यà¥à¤—à¥â€à¤®à¤¿à¤¤ उपकरणों के साथ कनेकà¥â€à¤¶à¤¨ बनाने और सà¥â€à¤µà¥€à¤•ार करने देता है."</string>
- <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"à¤à¤ªà¥â€à¤¸ को फ़ोन पर Bluetooth का कॉनà¥â€à¤«à¤¼à¤¿à¤—रेशन देखने, और यà¥à¤—à¥â€à¤®à¤¿à¤¤ उपकरणों के साथ कनेकà¥â€à¤¶à¤¨ बनाने और सà¥â€à¤µà¥€à¤•ार करने देता है."</string>
+ <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"à¤à¤ªà¥à¤¸ को टेबलेट पर Bluetooth का कॉनà¥â€à¤«à¤¼à¤¿à¤—रेशन देखने, और यà¥à¤—à¥â€à¤®à¤¿à¤¤ उपकरणों के साथ कनेकà¥â€à¤¶à¤¨ बनाने और सà¥â€à¤µà¥€à¤•ार करने देता है."</string>
+ <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"à¤à¤ªà¥à¤¸ को फ़ोन पर Bluetooth का कॉनà¥â€à¤«à¤¼à¤¿à¤—रेशन देखने, और यà¥à¤—à¥â€à¤®à¤¿à¤¤ उपकरणों के साथ कनेकà¥â€à¤¶à¤¨ बनाने और सà¥â€à¤µà¥€à¤•ार करने देता है."</string>
<string name="permlab_nfc" msgid="4423351274757876953">"नियर फ़ीलà¥â€à¤¡ कमà¥â€à¤¯à¥‚निकेशन नियंतà¥à¤°à¤¿à¤¤ करें"</string>
- <string name="permdesc_nfc" msgid="7120611819401789907">"à¤à¤ªà¥à¤¸ को नियर फ़ीलà¥à¤¡ कमà¥à¤¯à¥‚निकेशन (NFC) टैग, कारà¥à¤¡, और रीडर के साथ संचार करने देता है."</string>
+ <string name="permdesc_nfc" msgid="7120611819401789907">"à¤à¤ªà¥à¤¸ को नियर फ़ीलà¥à¤¡ कमà¥à¤¯à¥‚निकेशन (NFC) टैग, कारà¥à¤¡, और रीडर के साथ संचार करने देता है."</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"अपना सà¥â€à¤•à¥à¤°à¥€à¤¨ लॉक अकà¥à¤·à¤® करें"</string>
- <string name="permdesc_disableKeyguard" msgid="6034203065077122992">"à¤à¤ªà¥â€à¤¸ को कीलॉक और कोई भी संबदà¥à¤§ पासवरà¥à¤¡ सà¥à¤°à¤•à¥à¤·à¤¾ अकà¥à¤·à¤® करने देता है. उदाहरण के लिà¤, इनकमिंग फ़ोन कॉल पà¥à¤°à¤¾à¤ªà¥à¤¤ करते समय फ़ोन, कीलॉक को अकà¥à¤·à¤® कर देता है, फिर कॉल समापà¥à¤¤ होने पर कीलॉक को पà¥à¤¨: सकà¥à¤·à¤® कर देता है."</string>
+ <string name="permdesc_disableKeyguard" msgid="6034203065077122992">"à¤à¤ªà¥à¤¸ को कीलॉक और कोई भी संबदà¥à¤§ पासवरà¥à¤¡ सà¥à¤°à¤•à¥à¤·à¤¾ अकà¥à¤·à¤® करने देता है. उदाहरण के लिà¤, इनकमिंग फ़ोन कॉल पà¥à¤°à¤¾à¤ªà¥à¤¤ करते समय फ़ोन, कीलॉक को अकà¥à¤·à¤® कर देता है, फिर कॉल समापà¥à¤¤ होने पर कीलॉक को पà¥à¤¨: सकà¥à¤·à¤® कर देता है."</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"समनà¥à¤µà¤¯à¤¨ सेटिंग पढ़ें"</string>
- <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"à¤à¤ªà¥à¤¸ को किसी खाते की समनà¥à¤µà¤¯à¤¨ सेटिंग पढ़ने देता है. उदाहरण के लिà¤, इससे यह निरà¥à¤§à¤¾à¤°à¤¿à¤¤ किया जा सकता है कि लोग à¤à¤ªà¥à¤¸ किसी खाते के साथ समनà¥â€à¤µà¤¯à¤¿à¤¤ है या नहीं."</string>
+ <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"à¤à¤ªà¥à¤¸ को किसी खाते की समनà¥à¤µà¤¯à¤¨ सेटिंग पढ़ने देता है. उदाहरण के लिà¤, इससे यह निरà¥à¤§à¤¾à¤°à¤¿à¤¤ किया जा सकता है कि लोग à¤à¤ªà¥à¤¸ किसी खाते के साथ समनà¥â€à¤µà¤¯à¤¿à¤¤ है या नहीं."</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"समनà¥â€à¤µà¤¯à¤¨ बंद या चालू टॉगल करें"</string>
- <string name="permdesc_writeSyncSettings" msgid="8956262591306369868">"à¤à¤ªà¥à¤¸ को किसी खाते की समनà¥à¤µà¤¯à¤¨ सेटिंग संशोधित करने देता है. उदाहरण के लिà¤, इसका उपयोग लोग à¤à¤ªà¥à¤¸ का समनà¥â€à¤µà¤¯à¤¨ किसी खाते से सकà¥à¤·à¤® करने में हो सकता है."</string>
+ <string name="permdesc_writeSyncSettings" msgid="8956262591306369868">"à¤à¤ªà¥à¤¸ को किसी खाते की समनà¥à¤µà¤¯à¤¨ सेटिंग संशोधित करने देता है. उदाहरण के लिà¤, इसका उपयोग लोग à¤à¤ªà¥à¤¸ का समनà¥â€à¤µà¤¯à¤¨ किसी खाते से सकà¥à¤·à¤® करने में हो सकता है."</string>
<string name="permlab_readSyncStats" msgid="7396577451360202448">"समनà¥à¤µà¤¯à¤¨ आंकड़े पढ़ें"</string>
- <string name="permdesc_readSyncStats" msgid="1510143761757606156">"à¤à¤ªà¥à¤¸ को किसी खाते के समनà¥à¤µà¤¯à¤¨ आंकड़े, साथ ही समनà¥â€à¤µà¤¯à¤¿à¤¤ ईवेंट का इतिहास और समनà¥â€à¤µà¤¯à¤¿à¤¤ डेटा की मातà¥à¤°à¤¾ पढ़ने देता है."</string>
+ <string name="permdesc_readSyncStats" msgid="1510143761757606156">"à¤à¤ªà¥à¤¸ को किसी खाते के समनà¥à¤µà¤¯à¤¨ आंकड़े, साथ ही समनà¥â€à¤µà¤¯à¤¿à¤¤ ईवेंट का इतिहास और समनà¥â€à¤µà¤¯à¤¿à¤¤ डेटा की मातà¥à¤°à¤¾ पढ़ने देता है."</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"गà¥à¤°à¤¾à¤¹à¤•ी-पà¥à¤°à¤¾à¤ªà¥à¤¤ फ़ीड पढ़ें"</string>
- <string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"à¤à¤ªà¥â€à¤¸ को वरà¥à¤¤à¤®à¤¾à¤¨ में समनà¥à¤µà¤¯à¤¿à¤¤ फ़ीड के बारे में विवरण पà¥à¤°à¤¾à¤ªà¥à¤¤ करने देता है."</string>
+ <string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"à¤à¤ªà¥à¤¸ को वरà¥à¤¤à¤®à¤¾à¤¨ में समनà¥à¤µà¤¯à¤¿à¤¤ फ़ीड के बारे में विवरण पà¥à¤°à¤¾à¤ªà¥à¤¤ करने देता है."</string>
<string name="permlab_subscribedFeedsWrite" msgid="9015246325408209296">"गà¥à¤°à¤¾à¤¹à¤•ी-पà¥à¤°à¤¾à¤ªà¥à¤¤ फ़ीड लिखें"</string>
- <string name="permdesc_subscribedFeedsWrite" msgid="6928930188826089413">"à¤à¤ªà¥à¤¸ को आपके वरà¥à¤¤à¤®à¤¾à¤¨ समनà¥à¤µà¤¯à¤¿à¤¤ फ़ीड को संशोधित करने देता है. दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ à¤à¤ªà¥à¤¸ आपके समनà¥à¤µà¤¯à¤¿à¤¤ फ़ीड को बदल सकते है."</string>
+ <string name="permdesc_subscribedFeedsWrite" msgid="6928930188826089413">"à¤à¤ªà¥à¤¸ को आपके वरà¥à¤¤à¤®à¤¾à¤¨ समनà¥à¤µà¤¯à¤¿à¤¤ फ़ीड को संशोधित करने देता है. दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ à¤à¤ªà¥à¤¸ आपके समनà¥à¤µà¤¯à¤¿à¤¤ फ़ीड को बदल सकते है."</string>
<string name="permlab_readDictionary" msgid="4107101525746035718">"शबà¥à¤¦à¤•ोश में आपके दà¥à¤µà¤¾à¤°à¤¾ जोड़े गठशबà¥â€à¤¦à¥‹à¤‚ को पढ़ें"</string>
- <string name="permdesc_readDictionary" msgid="659614600338904243">"à¤à¤ªà¥â€à¤¸ को à¤à¤¸à¥‡ सभी शबà¥â€à¤¦à¥‹à¤‚, नामों और वाकà¥à¤¯à¤¾à¤‚शों को पढ़ने देता है जो संभवत: उपयोगकरà¥à¤¤à¤¾ दà¥à¤µà¤¾à¤°à¤¾ उपयोगकरà¥à¤¤à¤¾ â€à¤¶à¤¬à¥à¤¦à¤•ोश में संगà¥à¤°à¤¹à¥€à¤¤ किठगठहों."</string>
+ <string name="permdesc_readDictionary" msgid="659614600338904243">"à¤à¤ªà¥à¤¸ को à¤à¤¸à¥‡ सभी शबà¥â€à¤¦à¥‹à¤‚, नामों और वाकà¥à¤¯à¤¾à¤‚शों को पढ़ने देता है जो संभवत: उपयोगकरà¥à¤¤à¤¾ दà¥à¤µà¤¾à¤°à¤¾ उपयोगकरà¥à¤¤à¤¾ â€à¤¶à¤¬à¥à¤¦à¤•ोश में संगà¥à¤°à¤¹à¥€à¤¤ किठगठहों."</string>
<string name="permlab_writeDictionary" msgid="2183110402314441106">"उपयोगकरà¥à¤¤à¤¾ दà¥à¤µà¤¾à¤°à¤¾ परिभाषित शबà¥à¤¦à¤•ोश में शबà¥à¤¦ जोड़ें"</string>
- <string name="permdesc_writeDictionary" msgid="8185385716255065291">"à¤à¤ªà¥à¤¸ को उपयोगकरà¥à¤¤à¤¾ शबà¥à¤¦à¤•ोश में नठशबà¥à¤¦ लिखने देता है."</string>
+ <string name="permdesc_writeDictionary" msgid="8185385716255065291">"à¤à¤ªà¥à¤¸ को उपयोगकरà¥à¤¤à¤¾ शबà¥à¤¦à¤•ोश में नठशबà¥à¤¦ लिखने देता है."</string>
<string name="permlab_sdcardRead" product="nosdcard" msgid="367275095159405468">"अपने USB संगà¥à¤°à¤¹à¤£ की सामगà¥à¤°à¥€ पढ़ें"</string>
<string name="permlab_sdcardRead" product="default" msgid="2188156462934977940">"अपने SD कारà¥à¤¡ की सामगà¥à¤°à¥€ पढ़ें"</string>
<string name="permdesc_sdcardRead" product="nosdcard" msgid="3446988712598386079">"à¤à¤ªà¥â€à¤²à¤¿à¤•ेशन को आपके USB संगà¥à¤°à¤¹à¤£ की सामगà¥à¤°à¥€ पढ़ने की अनà¥à¤®à¤¤à¤¿ देता है."</string>
<string name="permdesc_sdcardRead" product="default" msgid="2607362473654975411">"à¤à¤ªà¥â€à¤²à¤¿à¤•ेशन को आपके SD कारà¥à¤¡ की सामगà¥à¤°à¥€ पढ़ने की अनà¥à¤®à¤¤à¤¿ देता है."</string>
<string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"अपने USB संगà¥à¤°à¤¹à¤£ की सामगà¥à¤°à¥€ बदलें या हटाà¤à¤‚"</string>
<string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"अपने SD कारà¥à¤¡ की सामगà¥à¤°à¥€ बदलें या हटाà¤à¤‚"</string>
- <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"à¤à¤ªà¥à¤²à¤¿. को USB संगà¥à¤°à¤¹à¤£ में लिखने देता है."</string>
- <string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"à¤à¤ªà¥à¤¸ को SD कारà¥à¤¡ पर लिखने देता है."</string>
+ <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"à¤à¤ªà¥à¤¸ को USB संगà¥à¤°à¤¹à¤£ में लिखने देता है."</string>
+ <string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"à¤à¤ªà¥à¤¸ को SD कारà¥à¤¡ पर लिखने देता है."</string>
<string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"आंतरिक मीडिया संगà¥à¤°à¤¹à¤£ सामगà¥à¤°à¤¿à¤¯à¥‹à¤‚ को बदलें/हटाà¤à¤‚"</string>
- <string name="permdesc_mediaStorageWrite" product="default" msgid="8189160597698529185">"à¤à¤ªà¥à¤¸ को आंतरिक मीडिया संगà¥à¤°à¤¹à¤£ की सामगà¥à¤°à¥€ को संशोधित करने देता है."</string>
+ <string name="permdesc_mediaStorageWrite" product="default" msgid="8189160597698529185">"à¤à¤ªà¥à¤¸ को आंतरिक मीडिया संगà¥à¤°à¤¹à¤£ की सामगà¥à¤°à¥€ को संशोधित करने देता है."</string>
<string name="permlab_manageDocs" product="default" msgid="5778318598448849829">"दसà¥à¤¤à¤¾à¤µà¥‡à¤œà¤¼ संगà¥à¤°à¤¹à¤£ पà¥à¤°à¤¬à¤‚धित करें"</string>
- <string name="permdesc_manageDocs" product="default" msgid="8704323176914121484">"à¤à¤ªà¥à¤¸ को दसà¥à¤¤à¤¾à¤µà¥‡à¤œà¤¼ संगà¥à¤°à¤¹à¤£ पà¥à¤°à¤¬à¤‚धित करने की अनà¥à¤®à¤¤à¤¿ दें."</string>
+ <string name="permdesc_manageDocs" product="default" msgid="8704323176914121484">"à¤à¤ªà¥à¤¸ को दसà¥à¤¤à¤¾à¤µà¥‡à¤œà¤¼ संगà¥à¤°à¤¹à¤£ पà¥à¤°à¤¬à¤‚धित करने की अनà¥à¤®à¤¤à¤¿ दें."</string>
<string name="permlab_sdcardAccessAll" msgid="8150613823900460576">"सभी उपयोगकरà¥à¤¤à¤¾à¤“ं के बाहरी संगà¥à¤°à¤¹à¤£ तक पहà¥à¤‚चें"</string>
- <string name="permdesc_sdcardAccessAll" msgid="3215208357415891320">"à¤à¤ªà¥à¤¸ को सभी उपयोगकरà¥à¤¤à¤¾à¤“ं के बाहरी संगà¥à¤°à¤¹à¤£ तक पहà¥à¤‚चने दें."</string>
+ <string name="permdesc_sdcardAccessAll" msgid="3215208357415891320">"à¤à¤ªà¥à¤¸ को सभी उपयोगकरà¥à¤¤à¤¾à¤“ं के बाहरी संगà¥à¤°à¤¹à¤£ तक पहà¥à¤‚चने दें."</string>
<string name="permlab_cache_filesystem" msgid="5656487264819669824">"कैश फ़ाइल सिसà¥â€à¤Ÿà¤® में पहंचे"</string>
- <string name="permdesc_cache_filesystem" msgid="5578967642265550955">"à¤à¤ªà¥â€à¤¸ को संचय फ़ाइल सिसà¥â€à¤Ÿà¤® पढ़ने और लिखने देता है."</string>
+ <string name="permdesc_cache_filesystem" msgid="5578967642265550955">"à¤à¤ªà¥à¤¸ को संचय फ़ाइल सिसà¥â€à¤Ÿà¤® पढ़ने और लिखने देता है."</string>
<string name="permlab_use_sip" msgid="5986952362795870502">"इंटरनेट कॉल करें/पà¥à¤°à¤¾à¤ªà¥à¤¤ करें"</string>
- <string name="permdesc_use_sip" msgid="4717632000062674294">"à¤à¤ªà¥à¤¸ को इंटरनेट कॉल करने/पà¥à¤°à¤¾à¤ªà¥à¤¤ करने के लिठSIP सेवा का उपयोग करने देता है."</string>
+ <string name="permdesc_use_sip" msgid="4717632000062674294">"à¤à¤ªà¥à¤¸ को इंटरनेट कॉल करने/पà¥à¤°à¤¾à¤ªà¥à¤¤ करने के लिठSIP सेवा का उपयोग करने देता है."</string>
<string name="permlab_bind_call_service" msgid="6724009726671246551">"इन-कॉल सà¥à¤•à¥à¤°à¥€à¤¨ से सहभागिता करें"</string>
<string name="permdesc_bind_call_service" msgid="8732547662442572435">"à¤à¤ªà¥à¤²à¤¿à¤•ेशन को यह नियंतà¥à¤°à¤¿à¤¤ करने देती है कि उपयोगकरà¥à¤¤à¤¾ को इन-कॉल सà¥à¤•à¥à¤°à¥€à¤¨ कब और कैसी दिखाई देती है."</string>
<string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"à¤à¤¤à¤¿à¤¹à¤¾à¤¸à¤¿à¤• नेटवरà¥à¤• उपयोग पढें"</string>
- <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"किसी à¤à¤ªà¥à¤¸ को विशिषà¥à¤Ÿ नेटवरà¥à¤• और à¤à¤ªà¥â€à¤¸ के लिठà¤à¤¤à¤¿à¤¹à¤¾à¤¸à¤¿à¤• नेटवरà¥à¤• उपयोग को पढ़ने देता है."</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"किसी à¤à¤ªà¥à¤¸ को विशिषà¥à¤Ÿ नेटवरà¥à¤• और à¤à¤ªà¥à¤¸ के लिठà¤à¤¤à¤¿à¤¹à¤¾à¤¸à¤¿à¤• नेटवरà¥à¤• उपयोग को पढ़ने देता है."</string>
<string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"नेटवरà¥à¤• नीति पà¥à¤°à¤¬à¤‚धित करें"</string>
- <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"à¤à¤ªà¥â€à¤¸ को नेटवरà¥à¤• नीतियां पà¥à¤°à¤¬à¤‚धित करने और à¤à¤ªà¥â€à¤¸-विशिषà¥â€à¤Ÿ नियमों को परिभाषित करने देता है."</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"à¤à¤ªà¥à¤¸ को नेटवरà¥à¤• नीतियां पà¥à¤°à¤¬à¤‚धित करने और à¤à¤ªà¥à¤¸-विशिषà¥â€à¤Ÿ नियमों को परिभाषित करने देता है."</string>
<string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"नेटवरà¥à¤• उपयोग हिसाब बदलें"</string>
- <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"à¤à¤ªà¥à¤¸ को यह संशोधित करने देता है कि à¤à¤ªà¥â€à¤¸ की तà¥à¤²à¤¨à¤¾ में नेटवरà¥à¤• उपयोग का मूलà¥à¤¯à¤¾à¤‚कन कैसे किया जाता है. सामानà¥â€à¤¯ à¤à¤ªà¥â€à¤¸ दà¥à¤µà¤¾à¤°à¤¾ उपयोग करने के लिठनहीं."</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"à¤à¤ªà¥à¤¸ को यह संशोधित करने देता है कि à¤à¤ªà¥à¤¸ की तà¥à¤²à¤¨à¤¾ में नेटवरà¥à¤• उपयोग का मूलà¥à¤¯à¤¾à¤‚कन कैसे किया जाता है. सामानà¥â€à¤¯ à¤à¤ªà¥à¤¸ दà¥à¤µà¤¾à¤°à¤¾ उपयोग करने के लिठनहीं."</string>
<string name="permlab_markNetworkSocket" msgid="3658527214914959749">"सॉकेट मारà¥à¤• बदलें"</string>
- <string name="permdesc_markNetworkSocket" msgid="7655568433696356578">"à¤à¤ªà¥à¤¸ को रूटिंग के लिठसॉकेट मारà¥à¤• बदलने देता है"</string>
+ <string name="permdesc_markNetworkSocket" msgid="7655568433696356578">"à¤à¤ªà¥à¤¸ को रूटिंग के लिठसॉकेट मारà¥à¤• बदलने देता है"</string>
<string name="permlab_accessNotifications" msgid="7673416487873432268">"सूचनाओं तक पहà¥à¤‚चें"</string>
- <string name="permdesc_accessNotifications" msgid="458457742683431387">"à¤à¤ªà¥à¤¸ को सूचनाओं को पà¥à¤°à¤¾à¤ªà¥à¤¤ करने, जांच करने, और साफ़ करने देता है, जिनमें अनà¥à¤¯ à¤à¤ªà¥à¤¸ के दà¥à¤µà¤¾à¤°à¤¾ पोसà¥à¤Ÿ की गई सूचनाà¤à¤‚ भी शामिल हैं."</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"à¤à¤ªà¥à¤¸ को सूचनाओं को पà¥à¤°à¤¾à¤ªà¥à¤¤ करने, जांच करने, और साफ़ करने देता है, जिनमें अनà¥à¤¯ à¤à¤ªà¥à¤¸ के दà¥à¤µà¤¾à¤°à¤¾ पोसà¥à¤Ÿ की गई सूचनाà¤à¤‚ भी शामिल हैं."</string>
<string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"सूचना शà¥à¤°à¤µà¤£à¤•रà¥à¤¤à¤¾ सेवा से जà¥à¤¡à¤¼à¥‡à¤‚"</string>
- <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"धारक को सूचना शà¥à¤°à¤µà¤£à¤•रà¥à¤¤à¤¾ सेवा के शीरà¥à¤· सà¥à¤¤à¤°à¥€à¤¯ इंटरफ़ेस से जà¥à¤¡à¤¼à¤¨à¥‡ देती है. सामानà¥à¤¯ à¤à¤ªà¥à¤¸ के लिठकभी भी आवशà¥à¤¯à¤• नहीं होनी चाहिà¤."</string>
- <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"वाहक के दà¥à¤µà¤¾à¤°à¤¾ उपलबà¥à¤§ कराया गया कॉनà¥à¤«à¤¼à¤¿à¤—रेशन à¤à¤ªà¥à¤¸ पà¥à¤°à¤¾à¤°à¤‚भ करें"</string>
- <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"धारक को वाहक के दà¥à¤µà¤¾à¤°à¤¾ उपलबà¥à¤§ कराया गया कॉनà¥à¤«à¤¼à¤¿à¤—रेशन à¤à¤ªà¥à¤¸ पà¥à¤°à¤¾à¤°à¤‚भ करने देता है. सामानà¥â€à¤¯ à¤à¤ªà¥â€à¤¸ के लिठकभी भी आवशà¥â€à¤¯à¤• नहीं होना चाहिà¤."</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"धारक को सूचना शà¥à¤°à¤µà¤£à¤•रà¥à¤¤à¤¾ सेवा के शीरà¥à¤· सà¥à¤¤à¤°à¥€à¤¯ इंटरफ़ेस से जà¥à¤¡à¤¼à¤¨à¥‡ देती है. सामानà¥à¤¯ à¤à¤ªà¥à¤¸ के लिठकभी भी आवशà¥à¤¯à¤• नहीं होनी चाहिà¤."</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"वाहक के दà¥à¤µà¤¾à¤°à¤¾ उपलबà¥à¤§ कराया गया कॉनà¥à¤«à¤¼à¤¿à¤—रेशन à¤à¤ªà¥à¤¸ पà¥à¤°à¤¾à¤°à¤‚भ करें"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"धारक को वाहक के दà¥à¤µà¤¾à¤°à¤¾ उपलबà¥à¤§ कराया गया कॉनà¥à¤«à¤¼à¤¿à¤—रेशन à¤à¤ªà¥à¤¸ पà¥à¤°à¤¾à¤°à¤‚भ करने देता है. सामानà¥â€à¤¯ à¤à¤ªà¥à¤¸ के लिठकभी भी आवशà¥â€à¤¯à¤• नहीं होना चाहिà¤."</string>
<string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"नेटवरà¥à¤• सà¥à¤¥à¤¿à¤¤à¤¿à¤¯à¥‹à¤‚ के अवलोकनों को सà¥à¤¨à¥‡à¤‚"</string>
- <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"à¤à¤ªà¥à¤¸ को नेटवरà¥à¤• सà¥à¤¥à¤¿à¤¤à¤¿à¤¯à¥‹à¤‚ के अवलोकनों को सà¥à¤¨à¤¨à¥‡Â à¤¦à¥‡à¤¤à¤¾ है. सामानà¥à¤¯ à¤à¤ªà¥à¤¸ के लिठकभी भी आवशà¥à¤¯à¤• नहीं होना चाहिà¤."</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"à¤à¤ªà¥à¤¸ को नेटवरà¥à¤• सà¥à¤¥à¤¿à¤¤à¤¿à¤¯à¥‹à¤‚ के अवलोकनों को सà¥à¤¨à¤¨à¥‡Â à¤¦à¥‡à¤¤à¤¾ है. सामानà¥à¤¯ à¤à¤ªà¥à¤¸ के लिठकभी भी आवशà¥à¤¯à¤• नहीं होना चाहिà¤."</string>
<string name="policylab_limitPassword" msgid="4497420728857585791">"पासवरà¥à¤¡ नियम सेट करें"</string>
<string name="policydesc_limitPassword" msgid="3252114203919510394">"सà¥â€à¤•à¥à¤°à¥€à¤¨-अनलॉक पासवरà¥à¤¡ में अनà¥à¤®à¤¤à¤¿ पà¥à¤°à¤¾à¤ªà¥à¤¤ लंबाई और वरà¥à¤£à¥‹à¤‚ को नियंतà¥à¤°à¤¿à¤¤ करें."</string>
<string name="policylab_watchLogin" msgid="914130646942199503">"सà¥â€à¤•à¥à¤°à¥€à¤¨-अनलॉक के पà¥à¤°à¤¯à¤¾à¤¸à¥‹à¤‚ पर निगरानी रखें"</string>
@@ -691,7 +698,7 @@
<string name="policylab_expirePassword" msgid="885279151847254056">"सà¥â€à¤•à¥à¤°à¥€à¤¨ लॉक करें पासवरà¥à¤¡ समापà¥à¤¤à¤¿ सेट करें"</string>
<string name="policydesc_expirePassword" msgid="1729725226314691591">"नियंतà¥à¤°à¤¿à¤¤ करें कि कितने समय में लॉक-सà¥â€à¤•à¥à¤°à¥€à¤¨ पासवरà¥à¤¡ बदला जाना चाहिà¤."</string>
<string name="policylab_encryptedStorage" msgid="8901326199909132915">"संगà¥à¤°à¤¹à¤£ à¤à¤¨à¥â€à¤•à¥à¤°à¤¿à¤ªà¥â€à¤¶à¤¨ सेट करें"</string>
- <string name="policydesc_encryptedStorage" msgid="2637732115325316992">"संगà¥à¤°à¤¹à¥€à¤¤ à¤à¤ªà¥â€à¤¸ डेटा को à¤à¤¨à¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ किया जाना आवशà¥â€à¤¯à¤• है."</string>
+ <string name="policydesc_encryptedStorage" msgid="2637732115325316992">"संगà¥à¤°à¤¹à¥€à¤¤ à¤à¤ªà¥à¤¸ डेटा को à¤à¤¨à¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ किया जाना आवशà¥â€à¤¯à¤• है."</string>
<string name="policylab_disableCamera" msgid="6395301023152297826">"कैमरों को अकà¥à¤·à¤® करें"</string>
<string name="policydesc_disableCamera" msgid="2306349042834754597">"सभी उपकरण कैमरों का उपयोग रोकें."</string>
<string name="policylab_disableKeyguardFeatures" msgid="266329104542638802">"कीगारà¥à¤¡ में सà¥à¤µà¤¿à¤§à¤¾à¤à¤‚ अकà¥à¤·à¤® करें"</string>
@@ -940,24 +947,24 @@
<string name="autofill_area" msgid="3547409050889952423">"कà¥à¤·à¥‡à¤¤à¥à¤°"</string>
<string name="autofill_emirate" msgid="2893880978835698818">"अमीरात"</string>
<string name="permlab_readHistoryBookmarks" msgid="3775265775405106983">"अपने वेब बà¥à¤•मारà¥à¤• और इतिहास पढ़ें"</string>
- <string name="permdesc_readHistoryBookmarks" msgid="8462378226600439658">"à¤à¤ªà¥à¤¸ को बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° दà¥à¤µà¤¾à¤°à¤¾ विज़िट किठगठसभी URL के इतिहास, और सभी बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° बà¥à¤•मारà¥à¤• पढ़ने देता है. धà¥â€à¤¯à¤¾à¤¨ दें: यह अनà¥à¤®à¤¤à¤¿ तृतीय-पकà¥à¤· बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° या वेब बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤¿à¤‚ग कà¥à¤·à¤®à¤¤à¤¾à¤“ं वाले अनà¥â€à¤¯ à¤à¤ªà¥à¤¸ दà¥à¤µà¤¾à¤°à¤¾ लागू नहीं की जा सकती."</string>
+ <string name="permdesc_readHistoryBookmarks" msgid="8462378226600439658">"à¤à¤ªà¥à¤¸ को बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° दà¥à¤µà¤¾à¤°à¤¾ विज़िट किठगठसभी URL के इतिहास, और सभी बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° बà¥à¤•मारà¥à¤• पढ़ने देता है. धà¥â€à¤¯à¤¾à¤¨ दें: यह अनà¥à¤®à¤¤à¤¿ तृतीय-पकà¥à¤· बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° या वेब बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤¿à¤‚ग कà¥à¤·à¤®à¤¤à¤¾à¤“ं वाले अनà¥â€à¤¯ à¤à¤ªà¥à¤¸ दà¥à¤µà¤¾à¤°à¤¾ लागू नहीं की जा सकती."</string>
<string name="permlab_writeHistoryBookmarks" msgid="3714785165273314490">"वेब बà¥à¤•मारà¥à¤• और इतिहास लिखें"</string>
- <string name="permdesc_writeHistoryBookmarks" product="tablet" msgid="6825527469145760922">"à¤à¤ªà¥à¤¸ को आपके टेबलेट में संगà¥à¤°à¤¹à¥€à¤¤ बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° के इतिहास या बà¥à¤•मारà¥à¤• को संशोधित करने देता है. इससे à¤à¤ªà¥à¤¸ बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° डेटा को मिटा सकता है या संशोधित कर सकता है. धà¥â€à¤¯à¤¾à¤¨ दें: यह अनà¥à¤®à¤¤à¤¿ तृतीय-पकà¥à¤· बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° या वेब बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤¿à¤‚ग कà¥à¤·à¤®à¤¤à¤¾à¤“ं वाले अनà¥â€à¤¯ à¤à¤ªà¥à¤¸ दà¥à¤µà¤¾à¤°à¤¾ लागू नहीं की जा सकती."</string>
- <string name="permdesc_writeHistoryBookmarks" product="default" msgid="8497389531014185509">"à¤à¤ªà¥à¤¸ को आपके फ़ोन में संगà¥à¤°à¤¹à¥€à¤¤ बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° के इतिहास या बà¥à¤•मारà¥à¤• को संशोधित करने देता है. इससे à¤à¤ªà¥à¤¸ बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° डेटा को मिटा सकता है या संशोधित कर सकता है. धà¥â€à¤¯à¤¾à¤¨ दें: यह अनà¥à¤®à¤¤à¤¿ तृतीय-पकà¥à¤· बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° या वेब बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤¿à¤‚ग कà¥à¤·à¤®à¤¤à¤¾à¤“ं वाले अनà¥â€à¤¯ à¤à¤ªà¥à¤¸ दà¥à¤µà¤¾à¤°à¤¾ लागू नहीं की जा सकती."</string>
+ <string name="permdesc_writeHistoryBookmarks" product="tablet" msgid="6825527469145760922">"à¤à¤ªà¥à¤¸ को आपके टेबलेट में संगà¥à¤°à¤¹à¥€à¤¤ बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° के इतिहास या बà¥à¤•मारà¥à¤• को संशोधित करने देता है. इससे à¤à¤ªà¥à¤¸ बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° डेटा को मिटा सकता है या संशोधित कर सकता है. धà¥â€à¤¯à¤¾à¤¨ दें: यह अनà¥à¤®à¤¤à¤¿ तृतीय-पकà¥à¤· बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° या वेब बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤¿à¤‚ग कà¥à¤·à¤®à¤¤à¤¾à¤“ं वाले अनà¥â€à¤¯ à¤à¤ªà¥à¤¸ दà¥à¤µà¤¾à¤°à¤¾ लागू नहीं की जा सकती."</string>
+ <string name="permdesc_writeHistoryBookmarks" product="default" msgid="8497389531014185509">"à¤à¤ªà¥à¤¸ को आपके फ़ोन में संगà¥à¤°à¤¹à¥€à¤¤ बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° के इतिहास या बà¥à¤•मारà¥à¤• को संशोधित करने देता है. इससे à¤à¤ªà¥à¤¸ बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° डेटा को मिटा सकता है या संशोधित कर सकता है. धà¥â€à¤¯à¤¾à¤¨ दें: यह अनà¥à¤®à¤¤à¤¿ तृतीय-पकà¥à¤· बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° या वेब बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤¿à¤‚ग कà¥à¤·à¤®à¤¤à¤¾à¤“ं वाले अनà¥â€à¤¯ à¤à¤ªà¥à¤¸ दà¥à¤µà¤¾à¤°à¤¾ लागू नहीं की जा सकती."</string>
<string name="permlab_setAlarm" msgid="1379294556362091814">"अलारà¥à¤® सेट करें"</string>
- <string name="permdesc_setAlarm" msgid="316392039157473848">"à¤à¤ªà¥â€à¤¸ को इंसà¥â€à¤Ÿà¥‰à¤² किठगठअलारà¥à¤® घड़ी à¤à¤ªà¥â€à¤¸ में अलारà¥à¤® सेट करने देता है. हो सकता है कà¥à¤› अलारà¥à¤® घड़ी à¤à¤ªà¥â€à¤¸ में यह सà¥à¤µà¤¿à¤§à¤¾ न हो."</string>
+ <string name="permdesc_setAlarm" msgid="316392039157473848">"à¤à¤ªà¥à¤¸ को इंसà¥â€à¤Ÿà¥‰à¤² किठगठअलारà¥à¤® घड़ी à¤à¤ªà¥à¤¸ में अलारà¥à¤® सेट करने देता है. हो सकता है कà¥à¤› अलारà¥à¤® घड़ी à¤à¤ªà¥à¤¸ में यह सà¥à¤µà¤¿à¤§à¤¾ न हो."</string>
<string name="permlab_addVoicemail" msgid="5525660026090959044">"धà¥â€à¤µà¤¨à¤¿à¤®à¥‡à¤² जोड़ें"</string>
- <string name="permdesc_addVoicemail" msgid="6604508651428252437">"à¤à¤ªà¥à¤¸ को आपके धà¥â€à¤µà¤¨à¤¿à¤®à¥‡à¤² इनबॉकà¥â€à¤¸ में संदेश जोड़ने देता है."</string>
+ <string name="permdesc_addVoicemail" msgid="6604508651428252437">"à¤à¤ªà¥à¤¸ को आपके धà¥â€à¤µà¤¨à¤¿à¤®à¥‡à¤² इनबॉकà¥â€à¤¸ में संदेश जोड़ने देता है."</string>
<string name="permlab_writeGeolocationPermissions" msgid="5962224158955273932">"बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° भौगोलिक-सà¥à¤¥à¤¾à¤¨ अनà¥à¤®à¤¤à¤¿à¤¯à¥‹à¤‚ को बदलें"</string>
- <string name="permdesc_writeGeolocationPermissions" msgid="1083743234522638747">"à¤à¤ªà¥â€à¤¸ को बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° के भौगोलिक-सà¥â€à¤¥à¤¾à¤¨ की अनà¥à¤®à¤¤à¤¿à¤¯à¤¾à¤‚ संशोधित करने देता है. दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ à¤à¤ªà¥â€à¤¸ इसका उपयोग à¤à¤•पकà¥à¤·à¥€à¤¯ वेबसाइट को सà¥â€à¤¥à¤¾à¤¨ जानकारी भेजने में कर सकते हैं."</string>
+ <string name="permdesc_writeGeolocationPermissions" msgid="1083743234522638747">"à¤à¤ªà¥à¤¸ को बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° के भौगोलिक-सà¥â€à¤¥à¤¾à¤¨ की अनà¥à¤®à¤¤à¤¿à¤¯à¤¾à¤‚ संशोधित करने देता है. दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ à¤à¤ªà¥à¤¸ इसका उपयोग à¤à¤•पकà¥à¤·à¥€à¤¯ वेबसाइट को सà¥â€à¤¥à¤¾à¤¨ जानकारी भेजने में कर सकते हैं."</string>
<string name="permlab_packageVerificationAgent" msgid="5568139100645829117">"पैकेज सतà¥â€à¤¯à¤¾à¤ªà¤¿â€à¤¤ करें"</string>
<string name="permdesc_packageVerificationAgent" msgid="8437590190990843381">"à¤à¤ªà¥â€à¤²à¤¿â€à¤•ेशन को इंसà¥â€à¤Ÿà¥‰à¤² करने योगà¥â€à¤¯ पैकेज सतà¥â€à¤¯à¤¾à¤ªà¤¿â€à¤¤ करने देता है."</string>
<string name="permlab_bindPackageVerifier" msgid="4187786793360326654">"पैकेज पà¥à¤°à¤®à¤¾à¤£à¤• से आबदà¥à¤§ करें"</string>
- <string name="permdesc_bindPackageVerifier" msgid="3180741773233862126">"धारक को पैकेज पà¥à¤°à¤®à¤¾à¤£à¤• के अनà¥à¤°à¥‹à¤§ की अनà¥à¤®à¤¤à¤¿â€ देता है. सामानà¥â€à¤¯ à¤à¤ªà¥â€à¤¸ के लिठकभी भी आवशà¥â€à¤¯à¤• नहीं होना चाहिà¤."</string>
+ <string name="permdesc_bindPackageVerifier" msgid="3180741773233862126">"धारक को पैकेज पà¥à¤°à¤®à¤¾à¤£à¤• के अनà¥à¤°à¥‹à¤§ की अनà¥à¤®à¤¤à¤¿â€ देता है. सामानà¥â€à¤¯ à¤à¤ªà¥à¤¸ के लिठकभी भी आवशà¥â€à¤¯à¤• नहीं होना चाहिà¤."</string>
<string name="permlab_serialPort" msgid="546083327654631076">"सीरियल पोरà¥à¤Ÿ पर पहà¥à¤‚चें"</string>
<string name="permdesc_serialPort" msgid="2991639985224598193">"SerialManager API का उपयोग करके धारक को सीरियल पोरà¥à¤Ÿ पर पहà¥à¤‚च पà¥à¤°à¤¦à¤¾à¤¨ करता है."</string>
<string name="permlab_accessContentProvidersExternally" msgid="5077774297943409285">"बाहà¥à¤¯ रूप से सामगà¥à¤°à¥€ पà¥à¤°à¤¦à¤¾à¤¤à¤¾à¤“ं पर पहà¥à¤‚च"</string>
- <string name="permdesc_accessContentProvidersExternally" msgid="4544346486697853685">"धारक को शेल से सामगà¥à¤°à¥€ पà¥à¤°à¤¦à¤¾à¤¤à¤¾à¤“ं तक पहà¥à¤‚चने देता है. सामानà¥à¤¯ à¤à¤ªà¥à¤¸ के लिठकभी भी आवशà¥à¤¯à¤•ता नहीं होनी चाहिà¤."</string>
+ <string name="permdesc_accessContentProvidersExternally" msgid="4544346486697853685">"धारक को शेल से सामगà¥à¤°à¥€ पà¥à¤°à¤¦à¤¾à¤¤à¤¾à¤“ं तक पहà¥à¤‚चने देता है. सामानà¥à¤¯ à¤à¤ªà¥à¤¸ के लिठकभी भी आवशà¥à¤¯à¤•ता नहीं होनी चाहिà¤."</string>
<string name="permlab_updateLock" msgid="3527558366616680889">"अपनेआप उपकरण की नई जानकारी न लें"</string>
<string name="permdesc_updateLock" msgid="1655625832166778492">"धारक को उपकरण अपगà¥à¤°à¥‡à¤¡ करने के लिà¤, गैर-सहभागी रीबूट के ठीक समय के बारे में सिसà¥à¤Ÿà¤® पर जानकारी पà¥à¤°à¤¸à¥à¤¤à¥à¤¤ करने देता है."</string>
<string name="save_password_message" msgid="767344687139195790">"कà¥â€à¤¯à¤¾ आप चाहते हैं कि बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° पासवरà¥à¤¡ को याद रखे?"</string>
@@ -1105,7 +1112,7 @@
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"संगà¥à¤°à¤¹à¤£ सà¥â€à¤¥à¤¾à¤¨ समापà¥â€à¤¤ हो रहा है"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"हो सकता है कà¥à¤› सिसà¥à¤Ÿà¤® फ़ंकà¥à¤¶à¤¨ कारà¥à¤¯ न करें"</string>
<string name="app_running_notification_title" msgid="8718335121060787914">"<xliff:g id="APP_NAME">%1$s</xliff:g> चल रहा है"</string>
- <string name="app_running_notification_text" msgid="4653586947747330058">"अधिक जानकारी के लिठया à¤à¤ªà¥à¤¸ रोकने के लिठसà¥à¤ªà¤°à¥à¤¶ करें."</string>
+ <string name="app_running_notification_text" msgid="4653586947747330058">"अधिक जानकारी के लिठया à¤à¤ªà¥à¤¸ रोकने के लिठसà¥à¤ªà¤°à¥à¤¶ करें."</string>
<string name="ok" msgid="5970060430562524910">"ठीक है"</string>
<string name="cancel" msgid="6442560571259935130">"रदà¥à¤¦ करें"</string>
<string name="yes" msgid="5362982303337969312">"ठीक है"</string>
@@ -1119,8 +1126,8 @@
<string name="alwaysUse" msgid="4583018368000610438">"इस कà¥à¤°à¤¿à¤¯à¤¾ के लिठडिफ़ॉलà¥â€à¤Ÿ रूप से उपयोग करें."</string>
<string name="clearDefaultHintMsg" msgid="3252584689512077257">"सिसà¥â€à¤Ÿà¤® सेटिंग &gt; Apps &gt; डाउनलोड किठगठमें डिफ़ॉलà¥â€à¤Ÿ साफ करें."</string>
<string name="chooseActivity" msgid="7486876147751803333">"कोई कà¥à¤°à¤¿à¤¯à¤¾ चà¥à¤¨à¥‡à¤‚"</string>
- <string name="chooseUsbActivity" msgid="6894748416073583509">"USB उपकरण के लिठकोई à¤à¤ªà¥à¤¸ चà¥à¤¨à¥‡à¤‚"</string>
- <string name="noApplications" msgid="2991814273936504689">"कोई भी à¤à¤ªà¥â€à¤¸ यह कारà¥à¤¯à¤µà¤¾à¤¹à¥€ नहीं कर सकता."</string>
+ <string name="chooseUsbActivity" msgid="6894748416073583509">"USB उपकरण के लिठकोई à¤à¤ªà¥à¤¸ चà¥à¤¨à¥‡à¤‚"</string>
+ <string name="noApplications" msgid="2991814273936504689">"कोई भी à¤à¤ªà¥à¤¸ यह कारà¥à¤¯à¤µà¤¾à¤¹à¥€ नहीं कर सकता."</string>
<string name="aerr_title" msgid="1905800560317137752"></string>
<string name="aerr_application" msgid="932628488013092776">"दà¥à¤°à¥à¤­à¤¾à¤—à¥â€à¤¯à¤µà¤¶, <xliff:g id="APPLICATION">%1$s</xliff:g> रà¥à¤• गया है."</string>
<string name="aerr_process" msgid="4507058997035697579">"दà¥à¤°à¥à¤­à¤¾à¤—à¥â€à¤¯à¤µà¤¶, <xliff:g id="PROCESS">%1$s</xliff:g> पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ रà¥à¤• गई है."</string>
@@ -1139,20 +1146,20 @@
<string name="screen_compat_mode_scale" msgid="3202955667675944499">"सà¥à¤•ेल"</string>
<string name="screen_compat_mode_show" msgid="4013878876486655892">"हमेशा दिखाà¤à¤‚"</string>
<string name="screen_compat_mode_hint" msgid="1064524084543304459">"इसे सिसà¥â€à¤Ÿà¤® सेटिंग &gt; Apps &gt; डाउनलोड किठगठमें पà¥à¤¨: सकà¥à¤·à¤® करें."</string>
- <string name="smv_application" msgid="3307209192155442829">"à¤à¤ªà¥â€à¤¸ <xliff:g id="APPLICATION">%1$s</xliff:g> (पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ <xliff:g id="PROCESS">%2$s</xliff:g>) ने उसकी सà¥â€à¤µà¤¯à¤‚ लागू होने वाली StrictMode नीति का उलà¥â€à¤²à¤‚घन किया है."</string>
+ <string name="smv_application" msgid="3307209192155442829">"à¤à¤ªà¥à¤¸ <xliff:g id="APPLICATION">%1$s</xliff:g> (पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ <xliff:g id="PROCESS">%2$s</xliff:g>) ने उसकी सà¥â€à¤µà¤¯à¤‚ लागू होने वाली StrictMode नीति का उलà¥â€à¤²à¤‚घन किया है."</string>
<string name="smv_process" msgid="5120397012047462446">"पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ <xliff:g id="PROCESS">%1$s</xliff:g> ने उसकी सà¥â€à¤µ-पà¥à¤°à¤µà¤°à¥à¤¤à¤¿à¤¤ StrictMode नीति का उलà¥â€à¤²à¤‚घन किया है."</string>
<string name="android_upgrading_title" msgid="1584192285441405746">"Android अपगà¥à¤°à¥‡à¤¡ हो रहा है..."</string>
- <string name="android_upgrading_apk" msgid="7904042682111526169">"<xliff:g id="NUMBER_1">%2$d</xliff:g> में से <xliff:g id="NUMBER_0">%1$d</xliff:g> à¤à¤ªà¥à¤¸ अनà¥à¤•ूलित हो रहा है."</string>
- <string name="android_upgrading_starting_apps" msgid="451464516346926713">"à¤à¤ªà¥à¤¸ पà¥à¤°à¤¾à¤°à¤‚भ होने वाले हैं"</string>
+ <string name="android_upgrading_apk" msgid="7904042682111526169">"<xliff:g id="NUMBER_1">%2$d</xliff:g> में से <xliff:g id="NUMBER_0">%1$d</xliff:g> à¤à¤ªà¥à¤¸ अनà¥à¤•ूलित हो रहा है."</string>
+ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"à¤à¤ªà¥à¤¸ पà¥à¤°à¤¾à¤°à¤‚भ होने वाले हैं"</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"बूट समापà¥â€à¤¤ हो रहा है."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> चल रही है"</string>
- <string name="heavy_weight_notification_detail" msgid="1721681741617898865">"à¤à¤ªà¥â€à¤¸ पर सà¥â€à¤µà¤¿à¤š करने के लिठसà¥â€à¤ªà¤°à¥à¤¶ करें"</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"à¤à¤ªà¥à¤¸ सà¥à¤µà¤¿à¤š करें?"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"दूसरा à¤à¤ªà¥à¤¸ पहले से चल रहा है जिसे किसी नठà¤à¤ªà¥â€à¤¸ को पà¥à¤°à¤¾à¤°à¤‚भ करने के पहले बंद किया जाना आवशà¥â€à¤¯à¤• है."</string>
+ <string name="heavy_weight_notification_detail" msgid="1721681741617898865">"à¤à¤ªà¥à¤¸ पर सà¥â€à¤µà¤¿à¤š करने के लिठसà¥â€à¤ªà¤°à¥à¤¶ करें"</string>
+ <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"à¤à¤ªà¥à¤¸ सà¥à¤µà¤¿à¤š करें?"</string>
+ <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"दूसरा à¤à¤ªà¥à¤¸ पहले से चल रहा है जिसे किसी नठà¤à¤ªà¥à¤¸ को पà¥à¤°à¤¾à¤°à¤‚भ करने के पहले बंद किया जाना आवशà¥â€à¤¯à¤• है."</string>
<string name="old_app_action" msgid="493129172238566282">"<xliff:g id="OLD_APP">%1$s</xliff:g> पर वापस लौटें"</string>
- <string name="old_app_description" msgid="2082094275580358049">"नया à¤à¤ªà¥â€à¤¸ पà¥à¤°à¤¾à¤°à¤‚भ न करें."</string>
+ <string name="old_app_description" msgid="2082094275580358049">"नया à¤à¤ªà¥à¤¸ पà¥à¤°à¤¾à¤°à¤‚भ न करें."</string>
<string name="new_app_action" msgid="5472756926945440706">"<xliff:g id="OLD_APP">%1$s</xliff:g> पà¥à¤°à¤¾à¤°à¤‚भ करें"</string>
- <string name="new_app_description" msgid="1932143598371537340">"पà¥à¤°à¤¾à¤¨à¥‡ à¤à¤ªà¥â€à¤¸ को बिना सहेजे बंद करें."</string>
+ <string name="new_app_description" msgid="1932143598371537340">"पà¥à¤°à¤¾à¤¨à¥‡ à¤à¤ªà¥à¤¸ को बिना सहेजे बंद करें."</string>
<string name="sendText" msgid="5209874571959469142">"पाठ के लिठकिसी कà¥à¤°à¤¿à¤¯à¤¾ को चà¥à¤¨à¥‡à¤‚"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"रिंगर वॉलà¥â€à¤¯à¥‚म"</string>
<string name="volume_music" msgid="5421651157138628171">"मीडिया वॉलà¥â€à¤¯à¥‚म"</string>
@@ -1204,7 +1211,7 @@
<string name="wifi_p2p_frequency_conflict_message" product="default" msgid="7363907213787469151">"फ़ोन <xliff:g id="DEVICE_NAME">%1$s</xliff:g> से कनेकà¥à¤Ÿ रहते समय Wi-Fi से असà¥à¤¥à¤¾à¤¯à¥€ रूप से डिसà¥à¤•नेकà¥à¤Ÿ हो जाà¤à¤—ा"</string>
<string name="select_character" msgid="3365550120617701745">"वरà¥à¤£ समà¥â€à¤®à¤¿à¤²à¤¿à¤¤ करें"</string>
<string name="sms_control_title" msgid="7296612781128917719">"SMS संदेश भेज रहा है"</string>
- <string name="sms_control_message" msgid="3867899169651496433">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; बड़ी संखà¥à¤¯à¤¾ में SMS संदेश भेज रहा है. कà¥à¤¯à¤¾ आप इस à¤à¤ªà¥à¤¸ को संदेश भेजना जारी रखने देना चाहते हैं?"</string>
+ <string name="sms_control_message" msgid="3867899169651496433">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; बड़ी संखà¥à¤¯à¤¾ में SMS संदेश भेज रहा है. कà¥à¤¯à¤¾ आप इस à¤à¤ªà¥à¤¸ को संदेश भेजना जारी रखने देना चाहते हैं?"</string>
<string name="sms_control_yes" msgid="3663725993855816807">"अनà¥à¤®à¤¤à¤¿ दें"</string>
<string name="sms_control_no" msgid="625438561395534982">"असà¥à¤µà¥€à¤•ार करें"</string>
<string name="sms_short_code_confirm_message" msgid="1645436466285310855">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;, &lt;b&gt;<xliff:g id="DEST_ADDRESS">%2$s</xliff:g>&lt;/b&gt; पर संदेश भेजना चाहता है."</string>
@@ -1213,7 +1220,7 @@
<string name="sms_short_code_confirm_allow" msgid="4458878637111023413">"भेजें"</string>
<string name="sms_short_code_confirm_deny" msgid="2927389840209170706">"रदà¥à¤¦ करें"</string>
<string name="sms_short_code_remember_choice" msgid="5289538592272218136">"मेरी पसंद को याद रखें"</string>
- <string name="sms_short_code_remember_undo_instruction" msgid="4960944133052287484">"आप इसे बाद में सेटिंग &gt; à¤à¤ªà¥à¤¸ में बदल सकते हैं"</string>
+ <string name="sms_short_code_remember_undo_instruction" msgid="4960944133052287484">"आप इसे बाद में सेटिंग &gt; à¤à¤ªà¥à¤¸ में बदल सकते हैं"</string>
<string name="sms_short_code_confirm_always_allow" msgid="3241181154869493368">"हमेशा अनà¥à¤®à¤¤à¤¿ दें"</string>
<string name="sms_short_code_confirm_never_allow" msgid="446992765774269673">"कभी भी अनà¥à¤®à¤¤à¤¿ न दें"</string>
<string name="sim_removed_title" msgid="6227712319223226185">"सिमकारà¥à¤¡ निकाला गया"</string>
@@ -1247,7 +1254,7 @@
<string name="usb_storage_stop_button_mount" msgid="7060218034900696029">"USB संगà¥à¤°à¤¹à¤£ बंद करें"</string>
<string name="usb_storage_stop_error_message" msgid="1970374898263063836">"USB संगà¥à¤°à¤¹à¤£ बंद करने में कोई समसà¥â€à¤¯à¤¾ हà¥à¤ˆ थी. जांचें कि आपने USB होसà¥â€à¤Ÿ अनमाउंट किया है या नहीं, तब पà¥à¤¨: पà¥à¤°à¤¯à¤¾à¤¸ करें."</string>
<string name="dlg_confirm_kill_storage_users_title" msgid="963039033470478697">"USB संगà¥à¤°à¤¹à¤£ चालू करें"</string>
- <string name="dlg_confirm_kill_storage_users_text" msgid="5100428757107469454">"यदि आप USB संगà¥à¤°à¤¹à¤£ चालू करते हैं, तो आपके दà¥à¤µà¤¾à¤°à¤¾ उपयोग किठजा रहे कà¥à¤› à¤à¤ªà¥â€à¤¸ रà¥à¤• जाà¤à¤‚गे और हो सकता है कि वे तब तक अनà¥à¤ªà¤²à¤¬à¥â€à¤§ रहें जब तक कि आप USB संगà¥à¤°à¤¹à¤£ बंद नहीं कर देते."</string>
+ <string name="dlg_confirm_kill_storage_users_text" msgid="5100428757107469454">"यदि आप USB संगà¥à¤°à¤¹à¤£ चालू करते हैं, तो आपके दà¥à¤µà¤¾à¤°à¤¾ उपयोग किठजा रहे कà¥à¤› à¤à¤ªà¥à¤¸ रà¥à¤• जाà¤à¤‚गे और हो सकता है कि वे तब तक अनà¥à¤ªà¤²à¤¬à¥â€à¤§ रहें जब तक कि आप USB संगà¥à¤°à¤¹à¤£ बंद नहीं कर देते."</string>
<string name="dlg_error_title" msgid="7323658469626514207">"USB कारà¥à¤¯à¤µà¤¾à¤¹à¥€ विफल"</string>
<string name="dlg_ok" msgid="7376953167039865701">"ठीक है"</string>
<string name="usb_mtp_notification_title" msgid="3699913097391550394">"किसी मीडिया उपकरण के रूप में कनेकà¥â€à¤Ÿ किया गया"</string>
@@ -1296,15 +1303,15 @@
<string name="ext_media_nomedia_notification_message" product="default" msgid="3870120652983659641">"SD कारà¥à¤¡ निकाला गया. à¤à¤• नया समà¥â€à¤®à¤¿à¤²à¤¿à¤¤ करें."</string>
<string name="activity_list_empty" msgid="1675388330786841066">"कोई मिलती-जà¥à¤²à¤¤à¥€ गतिविधि नहीं मिली."</string>
<string name="permlab_pkgUsageStats" msgid="8787352074326748892">"घटक उपयोग आंकड़ों की नई जानकारी पाà¤à¤‚"</string>
- <string name="permdesc_pkgUsageStats" msgid="1106612424254277630">"à¤à¤ªà¥â€à¤¸ को घटक उपयोग के संकलित आंकड़े संशोधित करने देता है. सामानà¥â€à¤¯ à¤à¤ªà¥â€à¤¸ दà¥à¤µà¤¾à¤°à¤¾ उपयोग करने के लिठनहीं."</string>
+ <string name="permdesc_pkgUsageStats" msgid="1106612424254277630">"à¤à¤ªà¥à¤¸ को घटक उपयोग के संकलित आंकड़े संशोधित करने देता है. सामानà¥â€à¤¯ à¤à¤ªà¥à¤¸ दà¥à¤µà¤¾à¤°à¤¾ उपयोग करने के लिठनहीं."</string>
<string name="permlab_copyProtectedData" msgid="4341036311211406692">"सामगà¥à¤°à¥€ की पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿ बनाà¤à¤‚"</string>
- <string name="permdesc_copyProtectedData" msgid="4390697124288317831">"à¤à¤ªà¥à¤¸ को सामगà¥à¤°à¥€ की पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿ बनाने के लिठडिफ़ॉलà¥à¤Ÿ कंटेनर सेवा शà¥à¤°à¥‚ करने देता है. सामानà¥â€à¤¯ à¤à¤ªà¥â€à¤¸ दà¥à¤µà¤¾à¤°à¤¾ उपयोग करने के लिठनहीं."</string>
+ <string name="permdesc_copyProtectedData" msgid="4390697124288317831">"à¤à¤ªà¥à¤¸ को सामगà¥à¤°à¥€ की पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿ बनाने के लिठडिफ़ॉलà¥à¤Ÿ कंटेनर सेवा शà¥à¤°à¥‚ करने देता है. सामानà¥â€à¤¯ à¤à¤ªà¥à¤¸ दà¥à¤µà¤¾à¤°à¤¾ उपयोग करने के लिठनहीं."</string>
<string name="permlab_route_media_output" msgid="1642024455750414694">"मीडिया आउटपà¥à¤Ÿ को रूट करें"</string>
- <string name="permdesc_route_media_output" msgid="4932818749547244346">"à¤à¤ªà¥à¤¸ को मीडिया आउटपà¥à¤Ÿ को अनà¥à¤¯ बाहरी उपकरणों पर रूट करने देता है."</string>
+ <string name="permdesc_route_media_output" msgid="4932818749547244346">"à¤à¤ªà¥à¤¸ को मीडिया आउटपà¥à¤Ÿ को अनà¥à¤¯ बाहरी उपकरणों पर रूट करने देता है."</string>
<string name="permlab_access_keyguard_secure_storage" msgid="7565552237977815047">"कीगारà¥à¤¡ सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ संगà¥à¤°à¤¹à¤£ à¤à¤•à¥à¤¸à¥‡à¤¸ करें"</string>
- <string name="permdesc_access_keyguard_secure_storage" msgid="5866245484303285762">"à¤à¤ªà¥à¤¸ को कीगारà¥à¤¡ सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ संगà¥à¤°à¤¹à¤£ à¤à¤•à¥à¤¸à¥‡à¤¸ करने देती है."</string>
+ <string name="permdesc_access_keyguard_secure_storage" msgid="5866245484303285762">"à¤à¤ªà¥à¤¸ को कीगारà¥à¤¡ सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ संगà¥à¤°à¤¹à¤£ à¤à¤•à¥à¤¸à¥‡à¤¸ करने देती है."</string>
<string name="permlab_control_keyguard" msgid="172195184207828387">"कीगारà¥à¤¡ दिखाना और छिपाना नियंतà¥à¤°à¤¿à¤¤ करें"</string>
- <string name="permdesc_control_keyguard" msgid="3043732290518629061">"à¤à¤ªà¥à¤¸ को कीगारà¥à¤¡ नियंतà¥à¤°à¤¿à¤¤ करने देती है."</string>
+ <string name="permdesc_control_keyguard" msgid="3043732290518629061">"à¤à¤ªà¥à¤¸ को कीगारà¥à¤¡ नियंतà¥à¤°à¤¿à¤¤ करने देती है."</string>
<string name="tutorial_double_tap_to_zoom_message_short" msgid="4070433208160063538">"ज़ूम नियंतà¥à¤°à¤£ के लिठदो बार सà¥à¤ªà¤°à¥à¤¶ करें"</string>
<string name="gadget_host_error_inflating" msgid="4882004314906466162">"विजेट नहीं जोड़ा जा सका."</string>
<string name="ime_action_go" msgid="8320845651737369027">"जाà¤à¤‚"</string>
@@ -1316,7 +1323,7 @@
<string name="ime_action_default" msgid="2840921885558045721">"निषà¥â€à¤ªà¤¾à¤¦à¤¿à¤¤ करें"</string>
<string name="dial_number_using" msgid="5789176425167573586">"<xliff:g id="NUMBER">%s</xliff:g> के उपयोग दà¥à¤µà¤¾à¤°à¤¾ \n नंबर डायल करें"</string>
<string name="create_contact_using" msgid="4947405226788104538">"<xliff:g id="NUMBER">%s</xliff:g> का उपयोग करके\n संपरà¥à¤• बनाà¤à¤‚"</string>
- <string name="grant_credentials_permission_message_header" msgid="2106103817937859662">"निमà¥â€à¤¨ à¤à¤• या अधिक à¤à¤ªà¥â€à¤¸ अभी और भविषà¥â€à¤¯ में आपके खाते में पहà¥à¤‚च की अनà¥à¤®à¤¤à¤¿ का अनà¥à¤°à¥‹à¤§ करते हैं."</string>
+ <string name="grant_credentials_permission_message_header" msgid="2106103817937859662">"निमà¥â€à¤¨ à¤à¤• या अधिक à¤à¤ªà¥à¤¸ अभी और भविषà¥â€à¤¯ में आपके खाते में पहà¥à¤‚च की अनà¥à¤®à¤¤à¤¿ का अनà¥à¤°à¥‹à¤§ करते हैं."</string>
<string name="grant_credentials_permission_message_footer" msgid="3125211343379376561">"कà¥à¤¯à¤¾ आप इस अनà¥à¤°à¥‹à¤§ को अनà¥à¤®à¤¤à¤¿ देना चाहते हैं?"</string>
<string name="grant_permissions_header_text" msgid="6874497408201826708">"पहà¥à¤‚च अनà¥à¤°à¥‹à¤§"</string>
<string name="allow" msgid="7225948811296386551">"अनà¥à¤®à¤¤à¤¿ दें"</string>
@@ -1413,7 +1420,8 @@
<string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Mode change"</string>
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
- <string name="activitychooserview_choose_application" msgid="2125168057199941199">"कोई à¤à¤ªà¥â€à¤¸ चà¥à¤¨à¥‡à¤‚"</string>
+ <string name="activitychooserview_choose_application" msgid="2125168057199941199">"कोई à¤à¤ªà¥à¤¸ चà¥à¤¨à¥‡à¤‚"</string>
+ <string name="activitychooserview_choose_application_error" msgid="8624618365481126668">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> को लॉनà¥à¤š नहीं किया जा सका"</string>
<string name="shareactionprovider_share_with" msgid="806688056141131819">"इसके साथ साà¤à¤¾ करें:"</string>
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> के साथ साà¤à¤¾ करें"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"सà¥à¤²à¤¾à¤‡à¤¡à¤¿à¤‚ग हैंडल. सà¥à¤ªà¤°à¥à¤¶ करके रखें."</string>
@@ -1543,8 +1551,8 @@
<string name="user_switched" msgid="3768006783166984410">"वरà¥à¤¤à¤®à¤¾à¤¨ उपयोगकरà¥à¤¤à¤¾ <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="owner_name" msgid="2716755460376028154">"सà¥à¤µà¤¾à¤®à¥€"</string>
<string name="error_message_title" msgid="4510373083082500195">"तà¥à¤°à¥à¤Ÿà¤¿"</string>
- <string name="app_no_restricted_accounts" msgid="5739463249673727736">"यह à¤à¤ªà¥à¤¸ पà¥à¤°à¤¤à¤¿à¤¬à¤‚धित पà¥à¤°à¥‹à¤«à¤¼à¤¾à¤‡à¤² के खातों का समरà¥à¤¥à¤¨ नहीं करता है"</string>
- <string name="app_not_found" msgid="3429141853498927379">"इस कारà¥à¤¯à¤µà¤¾à¤¹à¥€ को पà¥à¤°à¤¬à¤‚धित करने के लिठकोई à¤à¤ªà¥à¤¸ नहीं मिला"</string>
+ <string name="app_no_restricted_accounts" msgid="5739463249673727736">"यह à¤à¤ªà¥à¤¸ पà¥à¤°à¤¤à¤¿à¤¬à¤‚धित पà¥à¤°à¥‹à¤«à¤¼à¤¾à¤‡à¤² के खातों का समरà¥à¤¥à¤¨ नहीं करता है"</string>
+ <string name="app_not_found" msgid="3429141853498927379">"इस कारà¥à¤¯à¤µà¤¾à¤¹à¥€ को पà¥à¤°à¤¬à¤‚धित करने के लिठकोई à¤à¤ªà¥à¤¸ नहीं मिला"</string>
<string name="revoke" msgid="5404479185228271586">"निरसà¥â€à¤¤ करें"</string>
<string name="mediasize_iso_a0" msgid="1994474252931294172">"ISO A0"</string>
<string name="mediasize_iso_a1" msgid="3333060421529791786">"ISO A1"</string>
@@ -1650,4 +1658,15 @@
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"बाद में पà¥à¤¨à¤ƒ पà¥à¤°à¤¯à¤¾à¤¸ करें"</string>
<string name="immersive_mode_confirmation" msgid="7227416894979047467">"पूरà¥à¤£ सà¥à¤•à¥à¤°à¥€à¤¨ से बाहर आने के लिठऊपर से नीचे सà¥à¤µà¤¾à¤‡à¤ª करें."</string>
+ <string name="done_label" msgid="2093726099505892398">"पूरà¥à¤£"</string>
+ <string name="hour_picker_description" msgid="6698199186859736512">"घंटो का चकà¥à¤°à¤¾à¤•ार सà¥à¤²à¤¾à¤‡à¤¡à¤°"</string>
+ <string name="minute_picker_description" msgid="8606010966873791190">"मिनटों का चकà¥à¤°à¤¾à¤•ार सà¥à¤²à¤¾à¤‡à¤¡à¤°"</string>
+ <string name="select_hours" msgid="6043079511766008245">"घंटे चà¥à¤¨à¥‡à¤‚"</string>
+ <string name="select_minutes" msgid="3974345615920336087">"मिनट चà¥à¤¨à¥‡à¤‚"</string>
+ <string name="day_picker_description" msgid="8990847925961297968">"दिनों की माह गà¥à¤°à¤¿à¤¡"</string>
+ <string name="year_picker_description" msgid="5524331207436052403">"वरà¥à¤· की सूची"</string>
+ <string name="select_day" msgid="7774759604701773332">"माह और दिन चà¥à¤¨à¥‡à¤‚"</string>
+ <string name="select_year" msgid="7952052866994196170">"वरà¥à¤· चà¥à¤¨à¥‡à¤‚"</string>
+ <string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> चयनित"</string>
+ <string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> को हटा दिया गया"</string>
</resources>
diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml
index 37dc141..e91a773 100644
--- a/core/res/res/values-hr/strings.xml
+++ b/core/res/res/values-hr/strings.xml
@@ -50,6 +50,11 @@
<string name="invalidPuk" msgid="8761456210898036513">"Upišite PUK koji se sastoji od barem 8 brojeva."</string>
<string name="needPuk" msgid="919668385956251611">"VaÅ¡a je SIM kartica zakljuÄana PUK-om. Unesite PUK kôd da biste je otkljuÄali."</string>
<string name="needPuk2" msgid="4526033371987193070">"Unesite PUK2 da biste odblokirali SIM karticu."</string>
+ <string name="enablePin" msgid="209412020907207950">"NeuspjeÅ¡no; omogući zakljuÄavanje SIM/RUIM."</string>
+ <plurals name="pinpuk_attempts">
+ <item quantity="one" msgid="6596245285809790142">"Imate joÅ¡ <xliff:g id="NUMBER">%d</xliff:g> pokuÅ¡aj prije zakljuÄavanja SIM kartice."</item>
+ <item quantity="other" msgid="7530597808358774740">"Imate joÅ¡ nekoliko preostalih pokuÅ¡aja (<xliff:g id="NUMBER">%d</xliff:g>) prije zakljuÄavanja SIM kartice."</item>
+ </plurals>
<string name="imei" msgid="2625429890869005782">"IMEI"</string>
<string name="meid" msgid="4841221237681254195">"MEID"</string>
<string name="ClipMmi" msgid="6952821216480289285">"ID dolaznog pozivatelja"</string>
@@ -477,6 +482,8 @@
<string name="permdesc_accessSurfaceFlinger" msgid="1041619516733293551">"Aplikaciji omogućuje upotrebu znaÄajki niske razine SurfaceFlinger."</string>
<string name="permlab_readFrameBuffer" msgid="6690504248178498136">"Äitanje meÄ‘uspremnika okvira"</string>
<string name="permdesc_readFrameBuffer" msgid="4937405521809454680">"Aplikaciji omogućuje Äitanje sadržaja meÄ‘uspremnika okvira."</string>
+ <string name="permlab_accessInputFlinger" msgid="5348635270689553857">"pristupi InputFlingeru"</string>
+ <string name="permdesc_accessInputFlinger" msgid="2104864941201226616">"DopuÅ¡ta aplikaciji upotrebu znaÄajki niske razine InputFlingera."</string>
<string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"konfiguriraj Wifi zaslone"</string>
<string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"Omogućuje aplikaciji konfiguriranje i povezivanje s Wi-Fi zaslonima."</string>
<string name="permlab_controlWifiDisplay" msgid="393641276723695496">"upravljaj Wifi zaslonima"</string>
@@ -1414,6 +1421,7 @@
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
<string name="activitychooserview_choose_application" msgid="2125168057199941199">"Odabir aplikacije"</string>
+ <string name="activitychooserview_choose_application_error" msgid="8624618365481126668">"Nije moguće pokrenuti aplikaciju <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="shareactionprovider_share_with" msgid="806688056141131819">"Dijeljenje sa"</string>
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Dijeli s aplikacijom <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Klizna ruÄka. Dodirnite i držite."</string>
@@ -1650,4 +1658,15 @@
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Pokušajte ponovo kasnije"</string>
<string name="immersive_mode_confirmation" msgid="7227416894979047467">"Prijeđite prstom s vrha prema dolje za izlaz iz cijelog zaslona."</string>
+ <string name="done_label" msgid="2093726099505892398">"Gotovo"</string>
+ <string name="hour_picker_description" msgid="6698199186859736512">"Kružni klizaÄ sati"</string>
+ <string name="minute_picker_description" msgid="8606010966873791190">"Kružni klizaÄ minuta"</string>
+ <string name="select_hours" msgid="6043079511766008245">"Odaberite sate"</string>
+ <string name="select_minutes" msgid="3974345615920336087">"Odaberite minute"</string>
+ <string name="day_picker_description" msgid="8990847925961297968">"Mreža dana u mjesecu"</string>
+ <string name="year_picker_description" msgid="5524331207436052403">"Popis godina"</string>
+ <string name="select_day" msgid="7774759604701773332">"Odaberite mjesec i dan"</string>
+ <string name="select_year" msgid="7952052866994196170">"Odaberite godinu"</string>
+ <string name="item_is_selected" msgid="949687401682476608">"Odabrana je stavka <xliff:g id="ITEM">%1$s</xliff:g>"</string>
+ <string name="deleted_key" msgid="7659477886625566590">"Izbrisan je broj <xliff:g id="KEY">%1$s</xliff:g>"</string>
</resources>
diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml
index 4ae5938..8cf6f74 100644
--- a/core/res/res/values-hu/strings.xml
+++ b/core/res/res/values-hu/strings.xml
@@ -50,6 +50,11 @@
<string name="invalidPuk" msgid="8761456210898036513">"8 számjegyű vagy hosszabb PUK kódot írjon be."</string>
<string name="needPuk" msgid="919668385956251611">"A SIM-kártya le van zárva a PUK-kóddal. A feloldáshoz adja meg a PUK-kódot."</string>
<string name="needPuk2" msgid="4526033371987193070">"A SIM-kártya feloldásához adja meg a PUK2-kódot."</string>
+ <string name="enablePin" msgid="209412020907207950">"Sikertelen, engedélyezze a SIM-/RUIM-zárolást."</string>
+ <plurals name="pinpuk_attempts">
+ <item quantity="one" msgid="6596245285809790142">"Még <xliff:g id="NUMBER">%d</xliff:g> próbálkozása van, mielőtt zároljuk a SIM kártyát."</item>
+ <item quantity="other" msgid="7530597808358774740">"Még <xliff:g id="NUMBER">%d</xliff:g> próbálkozása van, mielőtt zároljuk a SIM kártyát."</item>
+ </plurals>
<string name="imei" msgid="2625429890869005782">"IMEI"</string>
<string name="meid" msgid="4841221237681254195">"MEID"</string>
<string name="ClipMmi" msgid="6952821216480289285">"Beérkező hívóazonosító"</string>
@@ -477,6 +482,8 @@
<string name="permdesc_accessSurfaceFlinger" msgid="1041619516733293551">"Lehetővé teszi az alkalmazás számára a SurfaceFlinger alacsony szintű funkciók használatát."</string>
<string name="permlab_readFrameBuffer" msgid="6690504248178498136">"keretpuffer olvasása"</string>
<string name="permdesc_readFrameBuffer" msgid="4937405521809454680">"Lehetővé teszi az alkalmazás számára a keretpuffer tartalmának olvasását."</string>
+ <string name="permlab_accessInputFlinger" msgid="5348635270689553857">"hozzáférés az InputFlingerhez"</string>
+ <string name="permdesc_accessInputFlinger" msgid="2104864941201226616">"Lehetővé teszi az alkalmazás számára az InputFlinger alacsony szintű funkciók használatát."</string>
<string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"Wi-Fi kijelzők konfigurálása"</string>
<string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"Lehetővé teszi, hogy az alkalmazás Wi-Fi kijelzőket konfiguráljon, és csatlakozzon hozzájuk."</string>
<string name="permlab_controlWifiDisplay" msgid="393641276723695496">"Wi-Fi kijelzők irányítása"</string>
@@ -1414,6 +1421,7 @@
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
<string name="activitychooserview_choose_application" msgid="2125168057199941199">"Válasszon ki egy alkalmazást"</string>
+ <string name="activitychooserview_choose_application_error" msgid="8624618365481126668">"A(z) <xliff:g id="APPLICATION_NAME">%s</xliff:g> alkalmazást indítása nem sikerült"</string>
<string name="shareactionprovider_share_with" msgid="806688056141131819">"Megosztás a következővel:"</string>
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Ossza meg a következő alkalmazással: <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Csúsztatható fogantyú. Érintse meg és tartsa."</string>
@@ -1649,5 +1657,16 @@
<item quantity="other" msgid="4730868920742952817">"Próbálja újra <xliff:g id="COUNT">%d</xliff:g> másodperc múlva"</item>
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Próbálkozzon később"</string>
- <string name="immersive_mode_confirmation" msgid="7227416894979047467">"A teljes képernyős nézetből való kilépéshez húzza ujját a tetejétől lefelé."</string>
+ <string name="immersive_mode_confirmation" msgid="7227416894979047467">"A teljes képernyős nézetből való kilépéshez húzza ujját a képernyő tetejétől lefelé."</string>
+ <string name="done_label" msgid="2093726099505892398">"Kész"</string>
+ <string name="hour_picker_description" msgid="6698199186859736512">"Óra kör alakú csúszkája"</string>
+ <string name="minute_picker_description" msgid="8606010966873791190">"Perc kör alakú csúszkája"</string>
+ <string name="select_hours" msgid="6043079511766008245">"Óra kiválasztása"</string>
+ <string name="select_minutes" msgid="3974345615920336087">"Perc kiválasztása"</string>
+ <string name="day_picker_description" msgid="8990847925961297968">"Napok havi leosztásban"</string>
+ <string name="year_picker_description" msgid="5524331207436052403">"Évek listája"</string>
+ <string name="select_day" msgid="7774759604701773332">"Válassza ki a hónapot és a napot"</string>
+ <string name="select_year" msgid="7952052866994196170">"Válassza ki az évet"</string>
+ <string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> kiválasztva"</string>
+ <string name="deleted_key" msgid="7659477886625566590">"A(z) <xliff:g id="KEY">%1$s</xliff:g> érték törölve"</string>
</resources>
diff --git a/core/res/res/values-hy-rAM/strings.xml b/core/res/res/values-hy-rAM/strings.xml
index 96ff31e..6bfa7f5 100644
--- a/core/res/res/values-hy-rAM/strings.xml
+++ b/core/res/res/values-hy-rAM/strings.xml
@@ -50,6 +50,11 @@
<string name="invalidPuk" msgid="8761456210898036513">"Մուտքագրեք PUK, որն 8 կամ ավել թիվ ունի:"</string>
<string name="needPuk" msgid="919668385956251611">"ÕÕ¥Ö€ SIM Ö„Õ¡Ö€Õ¿Õ¨ PUK-Õ¸Õ¾ Õ¯Õ¸Õ²ÕºÕ¾Õ¡Õ® Õ§: Õ„Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ¥Ö„ PUK Õ¯Õ¸Õ¤Õ¨ Õ¡ÕµÕ¶ Õ¡ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€:"</string>
<string name="needPuk2" msgid="4526033371987193070">"Õ„Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ¥Ö„ PUK2-Õ¨` SIM Ö„Õ¡Ö€Õ¿Õ¶ Õ¡Ö€Õ£Õ¥Õ¬Õ¡Õ¢Õ¡ÖÕ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€:"</string>
+ <string name="enablePin" msgid="209412020907207950">"ÕÕ¡Õ­Õ¸Õ²Õ¾Õ¥Ö: Õ„Õ«Õ¡ÖÖ€Õ¥Ö„ SIM/RUIM Õ¯Õ¸Õ²ÕºÕ¸Ö‚Õ´Õ¨:"</string>
+ <plurals name="pinpuk_attempts">
+ <item quantity="one" msgid="6596245285809790142">"Õ„Õ¶Õ¡Ö <xliff:g id="NUMBER">%d</xliff:g> ÖƒÕ¸Ö€Õ±Õ Õ´Õ«Õ¶Õ¹Ö‡ SIM-Õ« Õ¡Ö€Õ£Õ¥Õ¬Õ¡ÖƒÕ¡Õ¯Õ¸Ö‚Õ´Õ¨:"</item>
+ <item quantity="other" msgid="7530597808358774740">"Õ„Õ¶Õ¡Ö <xliff:g id="NUMBER">%d</xliff:g> ÖƒÕ¸Ö€Õ±Õ Õ´Õ«Õ¶Õ¹Ö‡ SIM-Õ« Õ¡Ö€Õ£Õ¥Õ¬Õ¡ÖƒÕ¡Õ¯Õ¸Ö‚Õ´Õ¨:"</item>
+ </plurals>
<string name="imei" msgid="2625429890869005782">"IMEI"</string>
<string name="meid" msgid="4841221237681254195">"MEID"</string>
<string name="ClipMmi" msgid="6952821216480289285">"Õ„Õ¸Ö‚Õ¿Ö„Õ¡ÕµÕ«Õ¶ Õ¦Õ¡Õ¶Õ£Õ¸Õ²Õ« ID"</string>
@@ -477,6 +482,8 @@
<string name="permdesc_accessSurfaceFlinger" msgid="1041619516733293551">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¥Õ¬ SurfaceFlinger ÖÕ¡Õ®Ö€ Õ´Õ¡Õ¯Õ¡Ö€Õ¤Õ¡Õ¯Õ« Õ£Õ¸Ö€Õ®Õ¡Õ¼Õ¸Ö‚ÕµÕ©Õ¶Õ¥Ö€Õ¨:"</string>
<string name="permlab_readFrameBuffer" msgid="6690504248178498136">"Õ¯Õ¡Ö€Õ¤Õ¡Õ¬ Õ·Ö€Õ»Õ¡Õ¶Õ¡Õ¯Õ« ÕºÕ¡Õ°Õ¶Õ¡Õ¯Õ¨"</string>
<string name="permdesc_readFrameBuffer" msgid="4937405521809454680">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¯Õ¡Ö€Õ¤Õ¡Õ¬ Õ·Ö€Õ»Õ¡Õ¶Õ¡Õ¯Õ« ÕºÕ¡Õ°Õ¶Õ¡Õ¯Õ« Õ¢Õ¸Õ¾Õ¡Õ¶Õ¤Õ¡Õ¯Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨:"</string>
+ <string name="permlab_accessInputFlinger" msgid="5348635270689553857">"Õ´Õ¸Ö‚Õ¿Ö„ Õ£Õ¸Ö€Õ®Õ¥Õ¬ InputFlinger"</string>
+ <string name="permdesc_accessInputFlinger" msgid="2104864941201226616">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ®Ö€Õ¡Õ£Ö€Õ«Õ¶ Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¥Õ¬ InputFlinger ÖÕ¡Õ®Ö€ Õ´Õ¡Õ¯Õ¡Ö€Õ¤Õ¡Õ¯Õ« Õ£Õ¸Ö€Õ®Õ¡Õ¼Õ¸Ö‚ÕµÕ©Õ¶Õ¥Ö€Õ¨:"</string>
<string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¥Õ¬ WiFi-Õ« ÖÕ¸Ö‚ÖÕ¡Õ¤Ö€Õ¸Ö‚Õ´Õ¨"</string>
<string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¥Õ¬ Ö‡ Õ´Õ«Õ¡Õ¶Õ¡Õ¬ WiFi ÖÕ¸Ö‚ÖÕ¡Õ¤Ö€Õ«Õ¹Õ¶Õ¥Ö€Õ«Õ¶:"</string>
<string name="permlab_controlWifiDisplay" msgid="393641276723695496">"Õ¯Õ¡Õ¼Õ¡Õ¾Õ¡Ö€Õ¥Õ¬ Wifi-Õ« ÖÕ¸Ö‚ÖÕ¡Õ¤Ö€Õ¸Ö‚Õ´Õ¨"</string>
@@ -1414,6 +1421,7 @@
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Õ„Õ¸Ö‚Õ¿Ö„"</string>
<string name="activitychooserview_choose_application" msgid="2125168057199941199">"Ô¸Õ¶Õ¿Ö€Õ¥Õ¬ Õ®Ö€Õ¡Õ£Õ«Ö€"</string>
+ <string name="activitychooserview_choose_application_error" msgid="8624618365481126668">"Õ‰Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Ö Õ£Õ¸Ö€Õ®Õ¡Ö€Õ¯Õ¥Õ¬ <xliff:g id="APPLICATION_NAME">%s</xliff:g> Õ®Ö€Õ¡Õ£Õ«Ö€Õ¨"</string>
<string name="shareactionprovider_share_with" msgid="806688056141131819">"ÕÕ¡Ö€Õ¡Õ®Õ¥Õ¬"</string>
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Õ€Õ¡Õ´Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¥Õ¬ <xliff:g id="APPLICATION_NAME">%s</xliff:g>-Õ« Õ°Õ¥Õ¿"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"ÕÕ¡Õ°Õ¸Õ² Õ¢Õ¼Õ¶Õ¡Õ¯: Հպել &amp; ÕºÕ¡Õ°Õ¥Õ¬:"</string>
@@ -1650,4 +1658,15 @@
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Ô¿Ö€Õ¯Õ«Õ¶ ÖƒÕ¸Ö€Õ±Õ¥Ö„ Õ´Õ« ÖƒÕ¸Ö„Ö€ Õ¸Ö‚Õ·"</string>
<string name="immersive_mode_confirmation" msgid="7227416894979047467">"ÕÕ¡Õ°Õ¡Õ°Õ¡Ö€Õ¾Õ¡Õ®Õ¥Ö„ Õ¾Õ¥Ö€Õ«Ö Õ¾Õ¡Ö€Õ Õ¡Õ´Õ¢Õ¸Õ²Õ»Õ¡Õ¯Õ¡Õ¶ Õ§Õ¯Ö€Õ¡Õ¶Õ«Ö Õ¤Õ¸Ö‚Ö€Õ½ Õ£Õ¡Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€:"</string>
+ <string name="done_label" msgid="2093726099505892398">"ÕŠÕ¡Õ¿Ö€Õ¡Õ½Õ¿ Õ§"</string>
+ <string name="hour_picker_description" msgid="6698199186859736512">"ÔºÕ¡Õ´Õ¥Ö€Õ« Õ¨Õ¶Õ¿Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶ Õ©Õ¾Õ¡Õ¿Õ¡Õ­Õ¿Õ¡Õ¯Õ«Ö"</string>
+ <string name="minute_picker_description" msgid="8606010966873791190">"ÕÕ¸ÕºÕ¥Õ¶Õ¥Ö€Õ« Õ¨Õ¶Õ¿Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶ Õ©Õ¾Õ¡Õ¿Õ¡Õ­Õ¿Õ¡Õ¯Õ«Ö"</string>
+ <string name="select_hours" msgid="6043079511766008245">"Ô¸Õ¶Õ¿Ö€Õ¥Ö„ ÕªÕ¡Õ´Õ¨"</string>
+ <string name="select_minutes" msgid="3974345615920336087">"Ô¸Õ¶Õ¿Ö€Õ¥Ö„ Ö€Õ¸ÕºÕ¥Õ¶"</string>
+ <string name="day_picker_description" msgid="8990847925961297968">"Ô±Õ´Õ½Õ¡Õ©Õ¾Õ« Õ¨Õ¶Õ¿Ö€Õ¸Ö‚Õ©ÕµÕ¡Õ¶ ÕºÕ¡Õ¿Õ¸Ö‚Õ°Õ¡Õ¶"</string>
+ <string name="year_picker_description" msgid="5524331207436052403">"ÕÕ¡Ö€Õ«Õ¶Õ¥Ö€Õ« ÖÕ¡Õ¶Õ¯"</string>
+ <string name="select_day" msgid="7774759604701773332">"Ô¸Õ¶Õ¿Ö€Õ¥Ö„ Õ¡Õ´Õ«Õ½Õ¶ Õ¸Ö‚ Ö…Ö€Õ¨"</string>
+ <string name="select_year" msgid="7952052866994196170">"Ô¸Õ¶Õ¿Ö€Õ¥Ö„ Õ¿Õ¡Ö€Õ«Õ¶"</string>
+ <string name="item_is_selected" msgid="949687401682476608">"Ô¸Õ¶Õ¿Ö€Õ¾Õ¡Õ® Õ§ <xliff:g id="ITEM">%1$s</xliff:g> Õ¿Õ¡Ö€Ö€Õ¨"</string>
+ <string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> Õ©Õ«Õ¾Õ¨ Õ»Õ¶Õ»Õ¾Õ¡Õ® Õ§"</string>
</resources>
diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml
new file mode 100644
index 0000000..60c5c55
--- /dev/null
+++ b/core/res/res/values-hy/strings.xml
@@ -0,0 +1,1586 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="byteShort" msgid="8340973892742019101">"Ô²"</string>
+ <string name="kilobyteShort" msgid="5973789783504771878">"Ô¿Õ¢"</string>
+ <string name="megabyteShort" msgid="6355851576770428922">"Õ„Õ¢"</string>
+ <string name="gigabyteShort" msgid="3259882455212193214">"Ô³Õ¢"</string>
+ <string name="terabyteShort" msgid="231613018159186962">"ÕÕ¢"</string>
+ <string name="petabyteShort" msgid="5637816680144990219">"ÕŠÕ¢"</string>
+ <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string>
+ <string name="untitled" msgid="4638956954852782576">"&lt;Ô±Õ¶Õ¡Õ¶Õ¸Ö‚Õ¶&gt;"</string>
+ <string name="ellipsis" msgid="7899829516048813237">"…"</string>
+ <string name="ellipsis_two_dots" msgid="1228078994866030736">"‥"</string>
+ <string name="emptyPhoneNumber" msgid="7694063042079676517">"(Õ€Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ¡Õ°Õ¡Õ´Õ¡Ö€ Õ¹Õ¯Õ¡)"</string>
+ <string name="unknownName" msgid="2277556546742746522">"(Ô±Õ¶Õ°Õ¡ÕµÕ¿)"</string>
+ <string name="defaultVoiceMailAlphaTag" msgid="2660020990097733077">"ÕÕ¡ÕµÕ¶Õ¡ÕµÕ«Õ¶ ÖƒÕ¸Õ½Õ¿"</string>
+ <string name="defaultMsisdnAlphaTag" msgid="2850889754919584674">"MSISDN1"</string>
+ <string name="mmiError" msgid="5154499457739052907">"Õ„Õ«Õ¡ÖÕ´Õ¡Õ¶ Õ­Õ¶Õ¤Õ«Ö€ Õ¯Õ¡Õ´ Õ¡Õ¶Õ¾Õ¡Õ¾Õ¥Ö€ MMI Õ®Õ¡Õ®Õ¡Õ¯Õ¡Õ£Õ«Ö€:"</string>
+ <string name="mmiFdnError" msgid="5224398216385316471">"Ô³Õ¸Ö€Õ®Õ¸Õ²Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Õ½Õ¡Õ°Õ´Õ¡Õ¶Õ¡ÖƒÕ¡Õ¯Õ¾Õ¡Õ® Õ§ Õ´Õ«Õ¡ÕµÕ¶ Õ¡Õ´Ö€Õ¡Õ¯Õ¡ÕµÕ¾Õ¡Õ® Õ°Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ¡Õ°Õ¡Õ´Õ¡Ö€Õ¶Õ¥Ö€Õ« Õ°Õ¡Õ´Õ¡Ö€:"</string>
+ <string name="serviceEnabled" msgid="8147278346414714315">"Ô¾Õ¡Õ¼Õ¡ÕµÕ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Õ´Õ«Õ¡ÖÕ¾Õ¡Õ® Õ§:"</string>
+ <string name="serviceEnabledFor" msgid="6856228140453471041">"Ô¾Õ¡Õ¼Õ¡ÕµÕ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Õ´Õ«Õ¡ÖÕ¾Õ¡Õ® Õ§`"</string>
+ <string name="serviceDisabled" msgid="1937553226592516411">"Ô¾Õ¡Õ¼Õ¡ÕµÕ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶ Õ¡Õ¶Õ»Õ¡Õ¿Õ¾Õ¥Õ¬ Õ§:"</string>
+ <string name="serviceRegistered" msgid="6275019082598102493">"Ô³Ö€Õ¡Õ¶ÖÕ¸Ö‚Õ´Õ¨ Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¡Õ® Õ§:"</string>
+ <string name="serviceErased" msgid="1288584695297200972">"Õ‹Õ¶Õ»Õ¸Ö‚Õ´Õ¨ Õ°Õ¡Õ»Õ¸Õ² Õ§Ö€:"</string>
+ <string name="passwordIncorrect" msgid="7612208839450128715">"ÕÕ­Õ¡Õ¬ Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼:"</string>
+ <string name="mmiComplete" msgid="8232527495411698359">"MMI-Õ¨ Õ¡Õ¾Õ¡Ö€Õ¿Õ¾Õ¡Õ® Õ§:"</string>
+ <string name="badPin" msgid="9015277645546710014">"ÕÕ¥Ö€ Õ´Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ¡Õ® Õ°Õ«Õ¶ PIN-Õ¨ Õ³Õ«Õ·Õ¿ Õ¹Õ§:"</string>
+ <string name="badPuk" msgid="5487257647081132201">"ÕÕ¥Ö€ Õ´Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ¡Õ® PUK-Õ¨ Õ³Õ«Õ·Õ¿ Õ¹Õ§:"</string>
+ <string name="mismatchPin" msgid="609379054496863419">"ÕÕ¥Ö€ Õ´Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ¡Õ® PIN-Õ¥Ö€Õ¨ Õ¹Õ¥Õ¶ Õ°Õ¡Õ´Õ¨Õ¶Õ¯Õ¶Õ¸Ö‚Õ´:"</string>
+ <string name="invalidPin" msgid="3850018445187475377">"Õ„Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ¥Ö„ PIN, Õ¸Ö€Õ¨ 4-Õ«Ö 8 Õ©Õ«Õ¾ Õ§:"</string>
+ <string name="invalidPuk" msgid="8761456210898036513">"Մուտքագրեք PUK, որն 8 կամ ավել թիվ ունի:"</string>
+ <string name="needPuk" msgid="919668385956251611">"ÕÕ¥Ö€ SIM Ö„Õ¡Ö€Õ¿Õ¨ PUK-Õ¸Õ¾ Õ¯Õ¸Õ²ÕºÕ¾Õ¡Õ® Õ§: Õ„Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ¥Ö„ PUK Õ¯Õ¸Õ¤Õ¨ Õ¡ÕµÕ¶ Õ¡ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€:"</string>
+ <string name="needPuk2" msgid="4526033371987193070">"Õ„Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ¥Ö„ PUK2-Õ¨` SIM Ö„Õ¡Ö€Õ¿Õ¶ Õ¡Ö€Õ£Õ¥Õ¬Õ¡Õ¢Õ¡ÖÕ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€:"</string>
+ <string name="imei" msgid="2625429890869005782">"IMEI"</string>
+ <string name="meid" msgid="4841221237681254195">"MEID"</string>
+ <string name="ClipMmi" msgid="6952821216480289285">"Õ„Õ¸Ö‚Õ¿Ö„Õ¡ÕµÕ«Õ¶ Õ¦Õ¡Õ¶Õ£Õ¸Õ²Õ« ID"</string>
+ <string name="ClirMmi" msgid="7784673673446833091">"ÔµÕ¬Ö„Õ¡ÕµÕ«Õ¶ Õ¦Õ¡Õ¶Õ£Õ¸Õ²Õ« ID"</string>
+ <string name="CfMmi" msgid="5123218989141573515">"Ô¶Õ¡Õ¶Õ£Õ« Õ¾Õ¥Ö€Õ¡Õ°Õ¡Õ½ÖÕ¥Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´"</string>
+ <string name="CwMmi" msgid="9129678056795016867">"Ô¶Õ¡Õ¶Õ£Õ« Õ½ÕºÕ¡Õ½Õ¸Ö‚Õ´"</string>
+ <string name="BaMmi" msgid="455193067926770581">"Ô¶Õ¡Õ¶Õ£Õ« Õ¡Ö€Õ£Õ¥Õ¬Õ¡ÖƒÕ¡Õ¯Õ¸Ö‚Õ´"</string>
+ <string name="PwdMmi" msgid="7043715687905254199">"Ô³Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ« ÖƒÕ¸ÖƒÕ¸Õ­Õ¸Ö‚Õ´"</string>
+ <string name="PinMmi" msgid="3113117780361190304">"PIN-Õ« ÖƒÕ¸ÖƒÕ¸Õ­Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶"</string>
+ <string name="CnipMmi" msgid="3110534680557857162">"Ô¶Õ¡Õ¶Õ£Õ¸Õ² Õ°Õ¡Õ´Õ¡Ö€Õ¨ Õ¡Õ¼Õ¯Õ¡ Õ§"</string>
+ <string name="CnirMmi" msgid="3062102121430548731">"Ô¶Õ¡Õ¶Õ£Õ¸Õ² Õ°Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ¡Õ°Õ¡Õ´Õ¡Ö€Õ¨ Õ½Õ¡Õ°Õ´Õ¡Õ¶Õ¡ÖƒÕ¡Õ¯Õ¾Õ¡Õ® Õ§"</string>
+ <string name="ThreeWCMmi" msgid="9051047170321190368">"ÔµÖ€Õ¥Ö„ Õ¯Õ¸Õ²Õ´Õ¸Õ¾ Õ¦Õ¡Õ¶Õ£"</string>
+ <string name="RuacMmi" msgid="7827887459138308886">"Ô±Õ¶ÖÕ¡Õ¶Õ¯Õ¡Õ¬Õ« Õ¾Ö€Õ¤Õ¸Õ¾Õ¥ÖÕ¶Õ¸Õ² Õ¦Õ¡Õ¶Õ£Õ¥Ö€Õ« Õ´Õ¥Ö€ÕªÕ¸Ö‚Õ´"</string>
+ <string name="CndMmi" msgid="3116446237081575808">"Ô¶Õ¡Õ¶Õ£Õ¸Õ² Õ°Õ¡Õ´Õ¡Ö€Õ« Õ¡Õ¼Õ¡Ö„Õ¸Ö‚Õ´"</string>
+ <string name="DndMmi" msgid="1265478932418334331">"Õ‰Õ­Õ¡Õ¶Õ£Õ¡Ö€Õ¥Õ¬"</string>
+ <string name="CLIRDefaultOnNextCallOn" msgid="429415409145781923">"Ô¶Õ¡Õ¶Õ£Õ¸Õ²Õ« ID-Õ¶ Õ¬Õ¼Õ¥Õ¬ÕµÕ¡ÕµÕ¶ Õ½Õ¡Õ°Õ´Õ¡Õ¶Õ¡ÖƒÕ¡Õ¯Õ¾Õ¡Õ® Õ§: Õ€Õ¡Õ»Õ¸Ö€Õ¤ Õ¦Õ¡Õ¶Õ£Õ¨` Õ½Õ¡Õ°Õ´Õ¡Õ¶Õ¡ÖƒÕ¡Õ¯Õ¾Õ¡Õ®"</string>
+ <string name="CLIRDefaultOnNextCallOff" msgid="3092918006077864624">"Ô¶Õ¡Õ¶Õ£Õ¸Õ²Õ« ID-Õ¶ Õ¬Õ¼Õ¥Õ¬ÕµÕ¡ÕµÕ¶ Õ½Õ¡Õ°Õ´Õ¡Õ¶Õ¡ÖƒÕ¡Õ¯Õ¾Õ¡Õ® Õ§: Õ€Õ¡Õ»Õ¸Ö€Õ¤ Õ¦Õ¡Õ¶Õ£Õ¨` Õ¹Õ½Õ¡Õ°Õ´Õ¡Õ¶Õ¡ÖƒÕ¡Õ¯Õ¾Õ¡Õ®"</string>
+ <string name="CLIRDefaultOffNextCallOn" msgid="6179425182856418465">"Ô¶Õ¡Õ¶Õ£Õ¸Õ²Õ« ID-Õ¶ Õ¬Õ¼Õ¥Õ¬ÕµÕ¡ÕµÕ¶ Õ¹Õ½Õ¡Õ°Õ´Õ¡Õ¶Õ¡ÖƒÕ¡Õ¯Õ¾Õ¡Õ® Õ§: Õ€Õ¡Õ»Õ¸Ö€Õ¤ Õ¦Õ¡Õ¶Õ£Õ¨` ÕÕ¡Õ°Õ´Õ¡Õ¶Õ¡ÖƒÕ¡Õ¯Õ¾Õ¡Õ®"</string>
+ <string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"Ô¶Õ¡Õ¶Õ£Õ¸Õ²Õ« ID-Õ¶ Õ¬Õ¼Õ¥Õ¬ÕµÕ¡ÕµÕ¶ Õ¹Õ½Õ¡Õ°Õ´Õ¡Õ¶Õ¡ÖƒÕ¡Õ¯Õ¾Õ¡Õ® Õ§: Õ€Õ¡Õ»Õ¸Ö€Õ¤ Õ¦Õ¡Õ¶Õ£Õ¨` Õ¹Õ½Õ¡Õ°Õ´Õ¡Õ¶Õ¡ÖƒÕ¡Õ¯Õ¾Õ¡Õ®"</string>
+ <string name="serviceNotProvisioned" msgid="8614830180508686666">"Ô¾Õ¡Õ¼Õ¡ÕµÕ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Õ¹Õ« Õ¿Ö€Õ¡Õ´Õ¡Õ¤Ö€Õ¾Õ¸Ö‚Õ´:"</string>
+ <string name="CLIRPermanent" msgid="3377371145926835671">"Ô´Õ¸Ö‚Ö„ Õ¹Õ¥Ö„ Õ¯Õ¡Ö€Õ¸Õ² ÖƒÕ¸Õ­Õ¥Õ¬ Õ¦Õ¡Õ¶Õ£Õ¸Õ²Õ« ID-Õ« Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´Õ¶Õ¥Ö€Õ¨:"</string>
+ <string name="RestrictedChangedTitle" msgid="5592189398956187498">"ÕÕ¡Õ°Õ´Õ¡Õ¶Õ¡ÖƒÕ¡Õ¯Õ¾Õ¡Õ® Õ´Õ¸Ö‚Õ¿Ö„Õ¨ ÖƒÕ¸Õ­Õ¾Õ¡Õ® Õ§"</string>
+ <string name="RestrictedOnData" msgid="8653794784690065540">"ÕÕ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ« Õ®Õ¡Õ¼Õ¡ÕµÕ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶ Õ¡Ö€Õ£Õ¥Õ¬Õ¡ÖƒÕ¡Õ¯Õ¾Õ¡Õ® Õ§:"</string>
+ <string name="RestrictedOnEmergency" msgid="6581163779072833665">"Ô±Ö€Õ¿Õ¡Õ¯Õ¡Ö€Õ£ Õ«Ö€Õ¡Õ¾Õ«Õ³Õ¡Õ¯Õ« Õ®Õ¡Õ¼Õ¡ÕµÕ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶ Õ¡Ö€Õ£Õ¥Õ¬Õ¡ÖƒÕ¡Õ¯Õ¾Õ¡Õ® Õ§:"</string>
+ <string name="RestrictedOnNormal" msgid="4953867011389750673">"ÕÕ¡ÕµÕ¶Õ¡ÕµÕ«Õ¶ Õ®Õ¡Õ¼Õ¡ÕµÕ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Õ¡Ö€Õ£Õ¥Õ¬Õ¡ÖƒÕ¡Õ¯Õ¾Õ¡Õ® Õ§:"</string>
+ <string name="RestrictedOnAllVoice" msgid="3396963652108151260">"Ô²Õ¸Õ¬Õ¸Ö€ Õ±Õ¡ÕµÕ¶Õ¡ÕµÕ«Õ¶ Õ®Õ¡Õ¼Õ¡ÕµÕ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨ Õ¡Ö€Õ£Õ¥Õ¬Õ¡ÖƒÕ¡Õ¯Õ¾Õ¡Õ® Õ¥Õ¶:"</string>
+ <string name="RestrictedOnSms" msgid="8314352327461638897">"SMS Õ®Õ¡Õ¼Õ¡ÕµÕ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶ Õ¡Ö€Õ£Õ¥Õ¬Õ¡ÖƒÕ¡Õ¯Õ¾Õ¡Õ® Õ§:"</string>
+ <string name="RestrictedOnVoiceData" msgid="996636487106171320">"ÕÕ¡ÕµÕ¶Õ¡ÕµÕ«Õ¶ Õ¯Õ¡Õ´ Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ« Õ®Õ¡Õ¼Õ¡ÕµÕ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¶ Õ¡Ö€Õ£Õ¥Õ¬Õ¡ÖƒÕ¡Õ¯Õ¾Õ¡Õ® Õ¥Õ¶:"</string>
+ <string name="RestrictedOnVoiceSms" msgid="1888588152792023873">"ÕÕ¡ÕµÕ¶Õ¡ÕµÕ«Õ¶/SMS Õ®Õ¡Õ¼Õ¡ÕµÕ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨ Õ¡Ö€Õ£Õ¥Õ¬Õ¡ÖƒÕ¡Õ¯Õ¾Õ¡Õ® Õ¥Õ¶:"</string>
+ <string name="RestrictedOnAll" msgid="5643028264466092821">"Ô²Õ¸Õ¬Õ¸Ö€ Õ±Õ¡ÕµÕ¶Õ¡ÕµÕ«Õ¶/Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ«/SMS Õ®Õ¡Õ¼Õ¡ÕµÕ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨ Õ¡Ö€Õ£Õ¥Õ¬Õ¡ÖƒÕ¡Õ¯Õ¾Õ¡Õ® Õ¥Õ¶:"</string>
+ <string name="serviceClassVoice" msgid="1258393812335258019">"ÕÕ¡ÕµÕ¶Õ¡ÕµÕ«Õ¶"</string>
+ <string name="serviceClassData" msgid="872456782077937893">"ÕÕ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€"</string>
+ <string name="serviceClassFAX" msgid="5566624998840486475">"Õ–Õ¡Ö„Õ½"</string>
+ <string name="serviceClassSMS" msgid="2015460373701527489">"SMS"</string>
+ <string name="serviceClassDataAsync" msgid="4523454783498551468">"Õ‰Õ°Õ¡Õ´Õ¡ÕªÕ¡Õ´Õ¥ÖÕ¾Õ¡Õ®"</string>
+ <string name="serviceClassDataSync" msgid="7530000519646054776">"Õ€Õ¡Õ´Õ¡ÕªÕ¡Õ´Õ¥Õ¬"</string>
+ <string name="serviceClassPacket" msgid="6991006557993423453">"Õ“Õ¡Õ©Õ¥Õ©"</string>
+ <string name="serviceClassPAD" msgid="3235259085648271037">"Õ€Õ¡Ö€Õ©Õ¡Õ¯"</string>
+ <string name="roamingText0" msgid="7170335472198694945">"Ռոումինգի ÖÕ¸Ö‚ÖÕ«Õ¹Õ¨ Õ´Õ«Õ¡ÖÕ¾Õ¡Õ® Õ§"</string>
+ <string name="roamingText1" msgid="5314861519752538922">"Ռոումինգի ÖÕ¸Ö‚ÖÕ«Õ¹Õ¨ Õ¡Õ¶Õ»Õ¡Õ¿Õ¾Õ¡Õ® Õ§"</string>
+ <string name="roamingText2" msgid="8969929049081268115">"Ռոումինգի ÖÕ¸Ö‚ÖÕ«Õ¹Õ¨ Õ©Õ¡Ö€Õ©Õ¸Ö‚Õ´ Õ§"</string>
+ <string name="roamingText3" msgid="5148255027043943317">"Õ‡Ö€Õ»Õ¡Õ¯Õ¡ÕµÖ„Õ«Ö Õ¤Õ¸Ö‚Ö€Õ½"</string>
+ <string name="roamingText4" msgid="8808456682550796530">"Õ‡Õ¥Õ¶Ö„Õ«Ö Õ¤Õ¸Ö‚Ö€Õ½"</string>
+ <string name="roamingText5" msgid="7604063252850354350">"Ռոումինգ` նախընտրելի համակարգ"</string>
+ <string name="roamingText6" msgid="2059440825782871513">"Ռոումինգ` հասանելի համակարգ"</string>
+ <string name="roamingText7" msgid="7112078724097233605">"Ռոումինգ` դաշնային գործընկեր"</string>
+ <string name="roamingText8" msgid="5989569778604089291">"Ռոումինգ` առաջնակարգ գործընկեր"</string>
+ <string name="roamingText9" msgid="7969296811355152491">"Ռոումինգ` լիարժեք ծառայության գործառություն"</string>
+ <string name="roamingText10" msgid="3992906999815316417">"Ռոումինգ` Մասնակի ծառայության գործառություն"</string>
+ <string name="roamingText11" msgid="4154476854426920970">"Ռոումինգի Õ¡Õ¦Õ¤Õ¥Ö€Õ«Õ¦Õ¨ Õ´Õ«Õ¡ÖÕ¾Õ¡Õ® Õ§"</string>
+ <string name="roamingText12" msgid="1189071119992726320">"Ռոումինգի ազդերիզն անջատված է"</string>
+ <string name="roamingTextSearching" msgid="8360141885972279963">"Ô¾Õ¡Õ¼Õ¡ÕµÕ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ¸Ö€Õ¸Õ¶Õ¸Ö‚Õ´..."</string>
+ <string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>. Õ‰Õ« Õ¾Õ¥Ö€Õ¡Õ°Õ¡Õ½ÖÕ¥Õ¡Õ¾Õ¸Ö€Õ¾Õ¥Õ¬"</string>
+ <string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>. <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
+ <string name="cfTemplateForwardedTime" msgid="9206251736527085256">"<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" msgid="5073237827620166285">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>. Õ‰Õ« Õ¾Õ¥Ö€Õ¡Õ°Õ¡Õ½ÖÕ¥Õ¡Õ¾Õ¸Ö€Õ¾Õ¥Õ¬"</string>
+ <string name="cfTemplateRegisteredTime" msgid="6781621964320635172">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>. Õ‰Õ« Õ¾Õ¥Ö€Õ¡Õ°Õ¡Õ½ÖÕ¥Õ¡Õ¾Õ¸Ö€Õ¾Õ¥Õ¬"</string>
+ <string name="fcComplete" msgid="3118848230966886575">"Õ€Õ¡Õ¿Õ¯Õ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ¯Õ¸Õ¤Õ¨ Õ¡Õ´Õ¢Õ¸Õ²Õ»Õ¡Õ¯Õ¡Õ¶ Õ§:"</string>
+ <string name="fcError" msgid="3327560126588500777">"Ô¿Õ¡ÕºÕ« Õ­Õ¶Õ¤Õ«Ö€ Õ¯Õ¡Õ´ Õ¡Õ¶Õ¾Õ¡Õ¾Õ¥Ö€ Õ£Õ¸Ö€Õ®Õ¡Õ¼Õ¸Ö‚ÕµÕ©Õ« Õ¯Õ¸Õ¤:"</string>
+ <string name="httpErrorOk" msgid="1191919378083472204">"Ô¼Õ¡Õ¾"</string>
+ <string name="httpError" msgid="7956392511146698522">"Õ‘Õ¡Õ¶ÖÕ¡ÕµÕ«Õ¶ Õ½Õ­Õ¡Õ¬ Õ§Ö€ Õ¿Õ¥Õ²Õ« Õ¸Ö‚Õ¶Õ¥ÖÕ¥Õ¬:"</string>
+ <string name="httpErrorLookup" msgid="4711687456111963163">"URL-Õ¨ Õ¹Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Ö Õ£Õ¿Õ¶Õ¥Õ¬:"</string>
+ <string name="httpErrorUnsupportedAuthScheme" msgid="6299980280442076799">"Ô¿Õ¡ÕµÖ„Õ« Õ¶Õ¸Ö‚ÕµÕ¶Õ¡Õ¯Õ¡Õ¶Õ¡ÖÕ´Õ¡Õ¶ Õ½Õ­Õ¥Õ´Õ¡Õ¶ Õ¹Õ« Õ¡Õ»Õ¡Õ¯ÖÕ¾Õ¸Ö‚Õ´:"</string>
+ <string name="httpErrorAuth" msgid="1435065629438044534">"Õ‰Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Ö Õ¶Õ¸Ö‚ÕµÕ¶Õ¡Õ¯Õ¡Õ¶Õ¡ÖÕ¶Õ¥Õ¬:"</string>
+ <string name="httpErrorProxyAuth" msgid="1788207010559081331">"Õ†Õ¸Ö‚ÕµÕ¶Õ¡Õ¯Õ¡Õ¶Õ¡Öումը պրոքսի Õ½Õ¥Ö€Õ¾Õ¥Ö€Õ« Õ´Õ«Õ»Õ¸ÖÕ¸Õ¾ Õ¡Õ¶Õ°Õ¡Õ»Õ¸Õ² Õ§Ö€:"</string>
+ <string name="httpErrorConnect" msgid="8714273236364640549">"Õ‰Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Ö Õ´Õ«Õ¡Õ¶Õ¡Õ¬ Õ½Õ¥Ö€Õ¾Õ¥Ö€Õ«Õ¶:"</string>
+ <string name="httpErrorIO" msgid="2340558197489302188">"Ô¿Õ¡ÕºÕ¨ Õ½Õ¥Ö€Õ¾Õ¥Ö€Õ« Õ°Õ¥Õ¿ Õ¹Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Ö: Փորձեք Õ¯Ö€Õ¯Õ«Õ¶ Õ¡Õ¾Õ¥Õ¬Õ« Õ¸Ö‚Õ·:"</string>
+ <string name="httpErrorTimeout" msgid="4743403703762883954">"ÕÕ¥Ö€Õ¾Õ¥Ö€Õ« Õ°Õ¥Õ¿ Õ¯Õ¡ÕºÕ¡Õ¯ÖÕ´Õ¡Õ¶ ÕªÕ¡Õ´Õ¡Õ¶Õ¡Õ¯Õ¨ Õ½ÕºÕ¡Õ¼Õ¾Õ¥Õ¬ Õ§:"</string>
+ <string name="httpErrorRedirectLoop" msgid="8679596090392779516">"Ô·Õ»Õ¨ ÕºÕ¡Ö€Õ¸Ö‚Õ¶Õ¡Õ¯Õ¸Ö‚Õ´ Õ§ Õ¹Õ¡ÖƒÕ¡Õ¦Õ¡Õ¶Ö Õ·Õ¡Õ¿ Õ½Õ¥Ö€Õ¾Õ¥Ö€Õ« Õ¾Õ¥Ö€Õ¡Õ°Õ²Õ¸Ö‚Õ´:"</string>
+ <string name="httpErrorUnsupportedScheme" msgid="5015730812906192208">"ÕŠÖ€Õ¸Õ¿Õ¸Õ¯Õ¸Õ¬Õ¨ Õ¹Õ« Õ¡Õ»Õ¡Õ¯ÖÕ¾Õ¸Ö‚Õ´:"</string>
+ <string name="httpErrorFailedSslHandshake" msgid="96549606000658641">"Õ‰Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Ö Õ°Õ¡Õ½Õ¿Õ¡Õ¿Õ¥Õ¬ Õ¡ÕºÕ¡Õ°Õ¸Õ¾ Õ¯Õ¡Õº:"</string>
+ <string name="httpErrorBadUrl" msgid="3636929722728881972">"Õ‰Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Ö Õ¢Õ¡ÖÕ¥Õ¬ Õ§Õ»Õ¨, Õ¸Ö€Õ¸Õ¾Õ°Õ¥Õ¿Ö‡ URL-Õ¨ Õ¡Õ¶Õ¾Õ¡Õ¾Õ¥Ö€ Õ§:"</string>
+ <string name="httpErrorFile" msgid="2170788515052558676">"Õ‰Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Ö Õ´Õ¸Ö‚Õ¿Ö„ Õ£Õ¸Ö€Õ®Õ¥Õ¬ Ö†Õ¡ÕµÕ¬:"</string>
+ <string name="httpErrorFileNotFound" msgid="6203856612042655084">"Õ‰Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Ö Õ£Õ¿Õ¶Õ¥Õ¬ Õ°Õ¡Ö€ÖÕ¾Õ¸Õ² Ö†Õ¡ÕµÕ¬Õ¨:"</string>
+ <string name="httpErrorTooManyRequests" msgid="1235396927087188253">"Õ‰Õ¡ÖƒÕ«Ö Õ·Õ¡Õ¿ Õ°Õ¡Ö€ÖÕ¸Ö‚Õ´Õ¶Õ¥Ö€ Õ¥Õ¶ Õ´Õ·Õ¡Õ¯Õ¾Õ¸Ö‚Õ´: Õ“Õ¸Ö€Õ±Õ¥Ö„ Õ¯Ö€Õ¯Õ«Õ¶ Õ¡Õ¾Õ¥Õ¬Õ« Õ¸Ö‚Õ·:"</string>
+ <string name="notification_title" msgid="8967710025036163822">"Õ„Õ¸Ö‚Õ¿Ö„ Õ£Õ¸Ö€Õ®Õ¥Õ¬Õ¸Ö‚ Õ½Õ­Õ¡Õ¬` <xliff:g id="ACCOUNT">%1$s</xliff:g>-Õ« Õ°Õ¡Õ´Õ¡Ö€"</string>
+ <string name="contentServiceSync" msgid="8353523060269335667">"Õ€Õ¡Õ´Õ¡ÕªÕ¡Õ´Õ¥ÖÕ¶Õ¥Õ¬"</string>
+ <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Õ€Õ¡Õ´Õ¡ÕªÕ¡Õ´Õ¥Õ¬"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Õ‰Õ¡ÖƒÕ«Ö Õ·Õ¡Õ¿ <xliff:g id="CONTENT_TYPE">%s</xliff:g> Õ°Õ¥Õ¼Õ¡ÖÕ¸Ö‚Õ´Õ¶Õ¥Ö€:"</string>
+ <string name="low_memory" product="tablet" msgid="6494019234102154896">"Ô³Ö€Õ¡Õ½Õ¡Õ¬Õ«Õ¯Õ« ÕºÕ¡Õ°Õ¸ÖÕ¨ Õ¬Õ«Ö„Õ¶ Õ§: Õ‹Õ¶Õ»Õ¥Ö„ Õ´Õ« Ö„Õ¡Õ¶Õ« Ö†Õ¡ÕµÕ¬` Õ¿Õ¡Ö€Õ¡Õ®Ö„ Õ¡Õ¦Õ¡Õ¿Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€:"</string>
+ <string name="low_memory" product="default" msgid="3475999286680000541">"Õ€Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ« ÕºÕ¡Õ°Õ¸ÖÕ¨ Õ¬Õ«Ö„Õ¶ Õ§: Õ‹Õ¶Õ»Õ¥Ö„ Õ´Õ« Ö„Õ¡Õ¶Õ« Ö†Õ¡ÕµÕ¬Õ¥Ö€` Õ¿Õ¡Ö€Õ¡Õ®Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶ Õ¡Õ¦Õ¡Õ¿Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€:"</string>
+ <string name="me" msgid="6545696007631404292">"Ô»Õ´"</string>
+ <string name="power_dialog" product="tablet" msgid="8545351420865202853">"Ô³Ö€Õ¡Õ½Õ¡Õ¬Õ«Õ¯Õ« Õ¨Õ¶Õ¿Ö€Õ¡Õ¶Ö„Õ¶Õ¥Ö€Õ¨"</string>
+ <string name="power_dialog" product="default" msgid="1319919075463988638">"Õ€Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ« Õ¨Õ¶Õ¿Ö€Õ¡Õ¶Ö„Õ¶Õ¥Ö€"</string>
+ <string name="silent_mode" msgid="7167703389802618663">"Ô±Õ¶Õ±Õ¡ÕµÕ¶ Õ¼Õ¥ÕªÕ«Õ´"</string>
+ <string name="turn_on_radio" msgid="3912793092339962371">"Õ„Õ«Õ¡ÖÕ¶Õ¥Õ¬ Õ¡Õ¶Õ¬Õ¡Ö€"</string>
+ <string name="turn_off_radio" msgid="8198784949987062346">"Ô±Õ¶Õ¬Õ¡Ö€Õ¨ Õ¡Õ¶Õ»Õ¡Õ¿Õ¥Õ¬"</string>
+ <string name="screen_lock" msgid="799094655496098153">"Õ§Õ¯Ö€Õ¡Õ¶Õ« Õ¯Õ¸Õ²ÕºÕ¥Ö„"</string>
+ <string name="power_off" msgid="4266614107412865048">"Ô±Õ¶Õ»Õ¡Õ¿Õ¥Õ¬"</string>
+ <string name="silent_mode_silent" msgid="319298163018473078">"Ô¶Õ¡Õ¶Õ£Õ¡Õ¯Õ¶ Õ¡Õ¶Õ»Õ¡Õ¿Õ¾Õ¡Õ® Õ§"</string>
+ <string name="silent_mode_vibrate" msgid="7072043388581551395">"Ô¶Õ¡Õ¶Õ£Õ¡Õ¯Õ« Õ©Ö€Õ©Õ¼Õ¸Ö"</string>
+ <string name="silent_mode_ring" msgid="8592241816194074353">"Ô¶Õ¡Õ¶Õ£Õ¡Õ¯Õ¨ Õ´Õ«Õ¡ÖÕ¾Õ¡Õ® Õ§"</string>
+ <string name="shutdown_progress" msgid="2281079257329981203">"Անջատվում է…"</string>
+ <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"ÕÕ¥Ö€ Õ£Ö€Õ¡Õ½Õ¡Õ¬Õ«Õ¯Õ¨ Õ¯Õ¡Õ¶Õ»Õ¡Õ¿Õ¾Õ«:"</string>
+ <string name="shutdown_confirm" product="default" msgid="649792175242821353">"ÕÕ¥Ö€ Õ°Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ¨ Õ¯Õ¡Õ¶Õ»Õ¡Õ¿Õ¾Õ«:"</string>
+ <string name="shutdown_confirm_question" msgid="2906544768881136183">"Õ‘Õ¡Õ¶Õ¯Õ¡Õ¶Õ¸Ö‚ÕžÕ´ Õ¥Ö„ Õ¡Õ¶Õ»Õ¡Õ¿Õ¥Õ¬:"</string>
+ <string name="reboot_safemode_title" msgid="7054509914500140361">"ÕŽÕ¥Ö€Õ¡Õ¢Õ¥Õ¼Õ¶Õ¥Õ¬ Õ¡Õ¶Õ¾Õ¿Õ¡Õ¶Õ£ Õ¼Õ¥ÕªÕ«Õ´Õ«"</string>
+ <string name="reboot_safemode_confirm" msgid="55293944502784668">"Õ‘Õ¡Õ¶Õ¯Õ¡Õ¶Õ¸Ö‚ÕžÕ´ Õ¥Ö„ Õ¾Õ¥Ö€Õ¡Õ¢Õ¥Õ¼Õ¶Õ¥Õ¬ Õ¡Õ¶Õ¾Õ¿Õ¡Õ¶Õ£ Õ¼Õ¥ÕªÕ«Õ´Õ«: ÕÕ¡ Õ¯Õ¯Õ¡Õ½Õ¥ÖÕ¶Õ« Õ±Õ¥Ö€ Õ¿Õ¥Õ²Õ¡Õ¤Ö€Õ¡Õ® Õ¢Õ¸Õ¬Õ¸Ö€ Õ¯Õ¸Õ²Õ´Õ¶Õ¡Õ¯Õ« Õ®Ö€Õ¡Õ£Ö€Õ¥Ö€Õ¨: Ô´Ö€Õ¡Õ¶Ö„ Õ¯Õ¾Õ¥Ö€Õ¡Õ¯Õ¡Õ¶Õ£Õ¶Õ¾Õ¥Õ¶, Õ¥Ö€Õ¢ Õ¤Õ¸Ö‚Ö„ Õ¯Ö€Õ¯Õ«Õ¶ Õ¾Õ¥Ö€Õ¡Õ¢Õ¥Õ¼Õ¶Õ¥Ö„:"</string>
+ <string name="recent_tasks_title" msgid="3691764623638127888">"ÕŽÕ¥Ö€Õ»Õ«Õ¶"</string>
+ <string name="no_recent_tasks" msgid="8794906658732193473">"Õ†Õ¸Ö€ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¥Ö€ Õ¹Õ¯Õ¡Õ¶:"</string>
+ <string name="global_actions" product="tablet" msgid="408477140088053665">"Ô³Ö€Õ¡Õ½Õ¡Õ¬Õ«Õ¯Õ« Õ¨Õ¶Õ¿Ö€Õ¡Õ¶Ö„Õ¶Õ¥Ö€Õ¨"</string>
+ <string name="global_actions" product="default" msgid="2406416831541615258">"Õ€Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ« Õ¨Õ¶Õ¿Ö€Õ¡Õ¶Ö„Õ¶Õ¥Ö€"</string>
+ <string name="global_action_lock" msgid="2844945191792119712">"Ô·Õ¯Ö€Õ¡Õ¶Õ« ÖƒÕ¡Õ¯Õ¡Õ¶"</string>
+ <string name="global_action_power_off" msgid="4471879440839879722">"Ô±Õ¶Õ»Õ¡Õ¿Õ¥Õ¬"</string>
+ <string name="global_action_bug_report" msgid="7934010578922304799">"ÕŽÖ€Õ«ÕºÕ¡Õ¯Õ« Õ¦Õ¥Õ¯Õ¸Ö‚ÕµÖ"</string>
+ <string name="bugreport_title" msgid="2667494803742548533">"Ô³Ö€Õ¥Õ¬ Õ½Õ­Õ¡Õ¬Õ« Õ¦Õ¥Õ¯Õ¸Ö‚ÕµÖ"</string>
+ <string name="bugreport_message" msgid="398447048750350456">"ÕÕ¡ Õ¿Õ¥Õ²Õ¥Õ¯Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€ Õ¯Õ°Õ¡Õ¾Õ¡Ö„Õ¡Õ£Ö€Õ« Õ±Õ¥Ö€ Õ½Õ¡Ö€Ö„Õ« Õ¡Õ¼Õ¯Õ¡ Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ«Õ³Õ¡Õ¯Õ« Õ´Õ¡Õ½Õ«Õ¶ Ö‡ Õ¯Õ¸Ö‚Õ²Õ¡Ö€Õ¯Õ« Õ¡ÕµÕ¶ Õ§Õ¬Õ¥Õ¯Õ¿Ö€Õ¸Õ¶Õ¡ÕµÕ«Õ¶ Õ¶Õ¡Õ´Õ¡Õ¯Õ¸Õ¾: ÕˆÖ€Õ¸Õ·Õ¡Õ¯Õ« ÕªÕ¡Õ´Õ¡Õ¶Õ¡Õ¯ Õ¯ÕºÕ¡Õ°Õ¡Õ¶Õ»Õ¾Õ« Õ¾Ö€Õ«ÕºÕ¡Õ¯Õ« Õ´Õ¡Õ½Õ«Õ¶ Õ¦Õ¥Õ¯Õ¸Ö‚ÖÕ¥Õ¬Õ¸Ö‚ ÕºÕ¡Õ°Õ«Ö Õ½Õ¯Õ½Õ¡Õ® Õ´Õ«Õ¶Õ¹ Õ¸Ö‚Õ²Õ¡Ö€Õ¯Õ¥Õ¬Õ¨: Ô½Õ¶Õ¤Ö€Õ¸Ö‚Õ´ Õ¥Õ¶Ö„ ÖƒÕ¸Ö„Ö€-Õ«Õ¶Õ¹ Õ°Õ¡Õ´Õ¢Õ¥Ö€Õ¡Õ¿Õ¡Ö€ Õ¬Õ«Õ¶Õ¥Õ¬:"</string>
+ <string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Ô±Õ¶Õ±Õ¡ÕµÕ¶ Õ¼Õ¥ÕªÕ«Õ´"</string>
+ <string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"ÕÕ¡ÕµÕ¶Õ¨ Õ¡Õ¶Õ»Õ¡Õ¿Õ¾Õ¡Õ® Õ§"</string>
+ <string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"ÕÕ¡ÕµÕ¶Õ¨ Õ´Õ«Õ¡ÖÕ¾Õ¡Õ® Õ§"</string>
+ <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Ô»Õ¶Ö„Õ¶Õ¡Õ©Õ«Õ¼Õ¡ÕµÕ«Õ¶ Õ¼Õ¥ÕªÕ«Õ´"</string>
+ <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Ô»Õ¶Ö„Õ¶Õ¡Õ©Õ«Õ¼Õ¡ÕµÕ«Õ¶ Õ¼Õ¥ÕªÕ«Õ´Õ¨ Õ´Õ«Õ¡ÖÕ¾Õ¡Õ® Õ§"</string>
+ <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Ô»Õ¶Ö„Õ¶Õ¡Õ©Õ«Õ¼Õ¡ÕµÕ«Õ¶ Õ¼Õ¥ÕªÕ«Õ´Õ¨ Õ¡Õ¶Õ»Õ¡Õ¿Õ¾Õ¡Õ® Õ§"</string>
+ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
+ <string name="safeMode" msgid="2788228061547930246">"Ô±Õ¶Õ¾Õ¿Õ¡Õ¶Õ£ Õ¼Õ¥ÕªÕ«Õ´"</string>
+ <string name="android_system_label" msgid="6577375335728551336">"Android Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£"</string>
+ <string name="permgrouplab_costMoney" msgid="5429808217861460401">"Ô¾Õ¡Õ¼Õ¡ÕµÕ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€, Õ¸Ö€Õ¸Õ¶Ö Õ°Õ¡Õ´Õ¡Ö€ Õ¯Õ£Õ¡Õ¶Õ±Õ¾Õ¥Ö„"</string>
+ <string name="permgroupdesc_costMoney" msgid="3293301903409869495">"Ô¿Õ¡Õ¿Õ¡Ö€Õ¥Õ¬ Õ£Õ¸Ö€Õ®Õ¸Õ²Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€, Õ¸Ö€Õ« Õ¤Õ«Õ´Õ¡Ö Õ±Õ¥Ö€ Õ°Õ¡Õ·Õ¾Õ«Ö Õ£Õ¸Ö‚Õ´Õ¡Ö€ Õ¯Õ®Õ¡Õ­Õ½Õ¾Õ«:"</string>
+ <string name="permgrouplab_messages" msgid="7521249148445456662">"ÕÕ¥Ö€ Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨"</string>
+ <string name="permgroupdesc_messages" msgid="7821999071003699236">"Ô¿Õ¡Ö€Õ¤Õ¡Õ¬ Ö‡ Õ£Ö€Õ¥Õ¬ Õ±Õ¥Ö€ SMS-Õ¨, Õ¶Õ¡Õ´Õ¡Õ¯Õ¨ Ö‡ Õ¡ÕµÕ¬ Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€:"</string>
+ <string name="permgrouplab_personalInfo" msgid="3519163141070533474">"ÕÕ¥Ö€ Õ¡Õ¶Õ±Õ¶Õ¡Õ¯Õ¡Õ¶ Õ¿Õ¥Õ²Õ¥Õ¯Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨"</string>
+ <string name="permgroupdesc_personalInfo" msgid="8426453129788861338">"ÕˆÖ‚Õ²Õ²Õ¡Õ¯Õ« Õ´Õ¸Ö‚Õ¿Ö„ Õ±Õ¥Ö€ Õ´Õ¡Õ½Õ«Õ¶ Õ¿Õ¥Õ²Õ¥Õ¯Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€` ÕºÕ¡Õ°Õ¾Õ¡Õ® Õ±Õ¥Ö€ Õ¯Õ¸Õ¶Õ¿Õ¡Õ¯Õ¿Õ¡ÕµÕ«Õ¶ Ö„Õ¡Ö€Õ¿Õ¸Ö‚Õ´:"</string>
+ <string name="permgrouplab_socialInfo" msgid="5799096623412043791">"ÕÕ¥Ö€ Õ½Õ¸ÖÕ«Õ¡Õ¬Õ¡Õ¯Õ¡Õ¶ Õ¿Õ¥Õ²Õ¥Õ¯Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨"</string>
+ <string name="permgroupdesc_socialInfo" msgid="7129842457611643493">"ÕˆÖ‚Õ²Õ²Õ¡Õ¯Õ« Õ´Õ¸Ö‚Õ¿Ö„ Õ±Õ¥Ö€ Õ¯Õ¸Õ¶Õ¿Õ¡Õ¯Õ¿Õ¶Õ¥Ö€Õ« Õ´Õ¡Õ½Õ«Õ¶ Õ¿Õ¥Õ²Õ¥Õ¯Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€ Ö‡ Õ½Õ¸ÖÕ«Õ¡Õ¬Õ¡Õ¯Õ¡Õ¶ Õ¯Õ¡ÕºÕ¥Ö€:"</string>
+ <string name="permgrouplab_location" msgid="635149742436692049">"ÕÕ¥Ö€ Õ¿Õ¥Õ²Õ¡Õ¤Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨"</string>
+ <string name="permgroupdesc_location" msgid="5704679763124170100">"ÕŽÕ¥Ö€Õ¡Õ°Õ½Õ¯Õ¥Õ¬ Õ±Õ¥Ö€ Ö†Õ«Õ¦Õ«Õ¯Õ¡Õ¯Õ¡Õ¶ Õ¿Õ¥Õ²Õ¡Õ¤Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨:"</string>
+ <string name="permgrouplab_network" msgid="5808983377727109831">"Õ‘Õ¡Õ¶ÖÕ¡ÕµÕ«Õ¶ Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¡Õ¯ÖÕ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶"</string>
+ <string name="permgroupdesc_network" msgid="4478299413241861987">"Õ„Õ¸Ö‚Õ¿Ö„ Õ£Õ¸Ö€Õ®Õ¥Õ¬ ÖÕ¡Õ¶ÖÕ« Õ¿Õ¡Ö€Õ¢Õ¥Ö€ Õ£Õ¸Ö€Õ®Õ¡Õ¼Õ¸Ö‚ÕµÕ©Õ¶Õ¥Ö€:"</string>
+ <string name="permgrouplab_bluetoothNetwork" msgid="1585403544162128109">"Bluetooth"</string>
+ <string name="permgroupdesc_bluetoothNetwork" msgid="5625288577164282391">"Õ„Õ¸Ö‚Õ¿Ö„ Õ£Õ¸Ö€Õ®Õ¥Õ¬ Õ½Õ¡Ö€Ö„Õ¥Ö€ Ö‡ ÖÕ¡Õ¶ÖÕ¥Ö€ Bluetooth-Õ« Õ´Õ«Õ»Õ¸ÖÕ¸Õ¾:"</string>
+ <string name="permgrouplab_audioSettings" msgid="8329261670151871235">"ÕÕ¡ÕµÕ¶Õ¡Õ¶ÕµÕ¸Ö‚Õ©Õ« Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´Õ¶Õ¥Ö€"</string>
+ <string name="permgroupdesc_audioSettings" msgid="2641515403347568130">"Õ“Õ¸Õ­Õ¥Õ¬ Õ±Õ¡ÕµÕ¶Õ¡Õ¶ÕµÕ¸Ö‚Õ©Õ« Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´Õ¶Õ¥Ö€Õ¨:"</string>
+ <string name="permgrouplab_affectsBattery" msgid="6209246653424798033">"Ô±Õ¦Õ¤Õ¸Ö‚Õ´ Õ§ Õ´Õ¡Ö€Õ¿Õ¯Õ¸ÖÕ« Õ¾Ö€Õ¡"</string>
+ <string name="permgroupdesc_affectsBattery" msgid="6441275320638916947">"Õ•Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¥Õ¬ Õ£Õ¸Ö€Õ®Õ«Ö„Õ¶Õ¥Ö€Õ¨, Õ¸Ö€Õ¸Õ¶Ö„ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Õ¶ Õ¡Ö€Õ¡Õ£ Õ½ÕºÕ¡Õ¼Õ¥Õ¬ Õ´Õ¡Ö€Õ¿Õ¯Õ¸ÖÕ¨:"</string>
+ <string name="permgrouplab_calendar" msgid="5863508437783683902">"Õ•Ö€Õ¡ÖÕ¸Ö‚ÕµÖ"</string>
+ <string name="permgroupdesc_calendar" msgid="5777534316982184416">"Ô±Õ¶Õ´Õ«Õ»Õ¡Õ¯Õ¡Õ¶ Õ´Õ¸Ö‚Õ¿Ö„ Ö…Ö€Õ¡ÖÕ¸Ö‚ÕµÖ Ö‡ Õ«Ö€Õ¡Õ¤Õ¡Ö€Õ±Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€:"</string>
+ <string name="permgrouplab_dictionary" msgid="4148597128843641379">"Ô¿Õ¡Ö€Õ¤Õ¡Õ¬ Ö…Õ£Õ¿Õ¾Õ¸Õ²Õ« Õ¢Õ¡Õ¼Õ¡Ö€Õ¡Õ¶Õ¨"</string>
+ <string name="permgroupdesc_dictionary" msgid="7921166355964764490">"Ô¿Õ¡Ö€Õ¤Õ¡Õ¬ Õ¢Õ¡Õ¼Õ¥Ö€Õ¨ Ö…Õ£Õ¿Õ¾Õ¸Õ²Õ« Õ¢Õ¡Õ¼Õ¡Ö€Õ¡Õ¶Õ¸Ö‚Õ´:"</string>
+ <string name="permgrouplab_writeDictionary" msgid="8090237702432576788">"Ô³Ö€Õ¥Õ¬ Ö…Õ£Õ¿Õ¾Õ¸Õ²Õ« Õ¢Õ¡Õ¼Õ¡Ö€Õ¡Õ¶Õ¸Ö‚Õ´"</string>
+ <string name="permgroupdesc_writeDictionary" msgid="2711561994497361646">"Ô±Õ¾Õ¥Õ¬Õ¡ÖÕ¶Õ¥Õ¬ Õ¢Õ¡Õ¼Õ¥Ö€ Ö…Õ£Õ¿Õ¾Õ¸Õ²Õ« Õ¢Õ¡Õ¼Õ¡Ö€Õ¡Õ¶Õ¸Ö‚Õ´:"</string>
+ <string name="permgrouplab_bookmarks" msgid="1949519673103968229">"Ô·Õ»Õ¡Õ¶Õ«Õ·Õ¥Ö€ Ö‡ ÕºÕ¡Õ¿Õ´Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶"</string>
+ <string name="permgroupdesc_bookmarks" msgid="4169771606257963028">"ÕˆÖ‚Õ²Õ²Õ¡Õ¯Õ« Õ´Õ¸Ö‚Õ¿Ö„ Õ¤Õ¥ÕºÕ« Õ§Õ»Õ¡Õ¶Õ«Õ·Õ¥Ö€ Ö‡ Õ¤Õ«Õ¿Õ¡Ö€Õ¯Õ¹Õ« ÕºÕ¡Õ¿Õ´Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶:"</string>
+ <string name="permgrouplab_deviceAlarms" msgid="6117704629728824101">"Ô±Õ¦Õ¤Õ¡Õ¶Õ·Õ¡Õ¶"</string>
+ <string name="permgroupdesc_deviceAlarms" msgid="4769356362251641175">"Ô¿Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¥Õ¬ Õ¦Õ¡Ö€Õ©Õ¸Ö‚ÖÕ«Õ¹Õ« ÕªÕ¡Õ´Õ¡ÖÕ¸Ö‚ÕµÖÕ¨:"</string>
+ <string name="permgrouplab_voicemail" msgid="4162237145027592133">"ÕÕ¡ÕµÕ¶Õ¡ÕµÕ«Õ¶ ÖƒÕ¸Õ½Õ¿"</string>
+ <string name="permgroupdesc_voicemail" msgid="2498403969862951393">"ÕˆÖ‚Õ²Õ²Õ¡Õ¯Õ« Õ´Õ¸Ö‚Õ¿Ö„ Õ¤Õ¥ÕºÕ« Õ±Õ¡ÕµÕ¶Õ¡ÕµÕ«Õ¶ ÖƒÕ¸Õ½Õ¿:"</string>
+ <string name="permgrouplab_microphone" msgid="171539900250043464">"Ô²Õ¡Ö€Õ±Ö€Õ¡Õ­Õ¸Õ½"</string>
+ <string name="permgroupdesc_microphone" msgid="7106618286905738408">"ÕˆÖ‚Õ²Õ²Õ¡Õ¯Õ« Õ´Õ¸Ö‚Õ¿Ö„ Õ¤Õ¥ÕºÕ« Õ¢Õ¡Ö€Õ±Ö€Õ¡Õ­Õ¸Õ½` Õ±Õ¡ÕµÕ¶Õ¡Õ¶ÕµÕ¸Ö‚Õ© Õ±Õ¡ÕµÕ¶Õ¡Õ£Ö€Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€:"</string>
+ <string name="permgrouplab_camera" msgid="4820372495894586615">"Õ–Õ¸Õ¿Õ¸Õ­ÖÕ«Õ¯"</string>
+ <string name="permgroupdesc_camera" msgid="2933667372289567714">"ÕˆÖ‚Õ²Õ²Õ¡Õ¯Õ« Õ´Õ¸Ö‚Õ¿Ö„ Õ¤Õ¥ÕºÕ« Ö†Õ¸Õ¿Õ¸Õ­ÖÕ«Õ¯` Õ¬Õ¸Ö‚Õ½Õ¡Õ¶Õ¯Õ¡Ö€Õ¥Õ¬Õ¸Ö‚ Õ¯Õ¡Õ´ Õ¿Õ¥Õ½Õ¡Õ¶Õ¯Õ¡Ö€Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€:"</string>
+ <string name="permgrouplab_screenlock" msgid="8275500173330718168">"Ô¿Õ¸Õ²ÕºÕ¥Õ¬ Õ§Õ¯Ö€Õ¡Õ¶Õ¨"</string>
+ <string name="permgroupdesc_screenlock" msgid="7067497128925499401">"Õ€Õ¶Õ¡Ö€Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶ Õ¸Ö‚Õ¶Õ« Õ¡Õ¦Õ¤Õ¥Õ¬Õ¸Ö‚ Õ±Õ¥Ö€ Õ½Õ¡Ö€Ö„Õ« Õ¯Õ¸Õ²ÕºÕ§Õ¯Ö€Õ¡Õ¶Õ« Õ¼Õ¥ÕªÕ«Õ´Õ« Õ¾Ö€Õ¡:"</string>
+ <string name="permgrouplab_appInfo" msgid="8028789762634147725">"ÕÕ¥Ö€ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ« Õ¿Õ¥Õ²Õ¥Õ¯Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨"</string>
+ <string name="permgroupdesc_appInfo" msgid="3950378538049625907">"Õ€Õ¶Õ¡Ö€Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶` Õ¡Õ¦Õ¤Õ¥Õ¬Õ¸Ö‚ Õ´ÕµÕ¸Ö‚Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ« Õ¾Õ¡Ö€Ö„Õ¡Õ£Õ®Õ« Õ¾Ö€Õ¡ Õ±Õ¥Ö€ Õ½Õ¡Ö€Ö„Õ¸Ö‚Õ´:"</string>
+ <string name="permgrouplab_wallpaper" msgid="3850280158041175998">"ÕŠÕ¡Õ½Õ¿Õ¡Õ¼"</string>
+ <string name="permgroupdesc_wallpaper" msgid="5630417854750540154">"Õ“Õ¸Õ­Õ¥Õ¬ Õ½Õ¡Ö€Ö„Õ« ÕºÕ¡Õ½Õ¿Õ¡Õ¼Õ« Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´Õ¶Õ¥Ö€Õ¨:"</string>
+ <string name="permgrouplab_systemClock" msgid="406535759236612992">"ÔºÕ¡Õ´Õ¡ÖÕ¸Ö‚ÕµÖ"</string>
+ <string name="permgroupdesc_systemClock" msgid="3944359833624094992">"Õ“Õ¸Õ­Õ¥Õ¬ Õ½Õ¡Ö€Ö„Õ« ÕªÕ¡Õ´Õ¨ Õ¯Õ¡Õ´ ÕªÕ¡Õ´Õ¡ÕµÕ«Õ¶ Õ£Õ¸Õ¿Õ«Õ¶:"</string>
+ <string name="permgrouplab_statusBar" msgid="2095862568113945398">"Ô¿Õ¡Ö€Õ£Õ¡Õ¾Õ«Õ³Õ¡Õ¯Õ« Õ£Õ¸Õ¿Õ«"</string>
+ <string name="permgroupdesc_statusBar" msgid="6242593432226807171">"Õ“Õ¸Õ­Õ¥Õ¬ Õ½Õ¡Ö€Ö„Õ« Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ«Õ³Õ¡Õ¯Õ« Õ£Õ¸Õ¿Õ¸Ö‚ Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´Õ¶Õ¥Ö€Õ¨:"</string>
+ <string name="permgrouplab_syncSettings" msgid="3341990986147826541">"Õ€Õ¡Õ´Õ¡ÕªÕ¡Õ´Õ¥ÖÕ´Õ¡Õ¶ Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´Õ¶Õ¥Ö€"</string>
+ <string name="permgroupdesc_syncSettings" msgid="7603195265129031797">"Õ„Õ¸Ö‚Õ¿Ö„ Õ£Õ¸Ö€Õ®Õ¥Õ¬ Õ°Õ¡Õ´Õ¡ÕªÕ¡Õ´Õ¥ÖÕ´Õ¡Õ¶ Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´Õ¶Õ¥Ö€:"</string>
+ <string name="permgrouplab_accounts" msgid="3359646291125325519">"ÕÕ¥Ö€ Õ°Õ¡Õ·Õ«Õ¾Õ¶Õ¥Ö€Õ¨"</string>
+ <string name="permgroupdesc_accounts" msgid="4948732641827091312">"Õ„Õ¸Ö‚Õ¿Ö„Õ« Õ°Õ¶Õ¡Ö€Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶ Õ¡Õ¼Õ¯Õ¡ Õ°Õ¡Õ·Õ«Õ¾Õ¶Õ¥Ö€:"</string>
+ <string name="permgrouplab_hardwareControls" msgid="7998214968791599326">"ÕÕ¡Ö€Ö„Õ¡Õ·Õ¡Ö€Õ« Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´Õ¶Õ¥Ö€"</string>
+ <string name="permgroupdesc_hardwareControls" msgid="4357057861225462702">"Ô±Õ¶Õ´Õ«Õ»Õ¡Õ¯Õ¡Õ¶ Õ´Õ¸Ö‚Õ¿Ö„ Õ°Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ« Õ½Õ¡Ö€Ö„Õ¡Õ·Õ¡Ö€:"</string>
+ <string name="permgrouplab_phoneCalls" msgid="9067173988325865923">"Õ€Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ¡ÕµÕ«Õ¶ Õ¦Õ¡Õ¶Õ£Õ¥Ö€Õ¨"</string>
+ <string name="permgroupdesc_phoneCalls" msgid="7489701620446183770">"ÕŽÕ¥Ö€Õ¡Õ°Õ½Õ¯Õ¥Õ¬, Õ±Õ¡ÕµÕ¶Õ¡Õ£Ö€Õ¥Õ¬Õ¥Õ¬ Ö‡ Õ¯Õ¡Õ¿Õ¡Ö€Õ¥Õ¬ Õ°Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ¡Õ¦Õ¡Õ¶Õ£Õ¥Ö€:"</string>
+ <string name="permgrouplab_systemTools" msgid="4652191644082714048">"Õ€Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ« Õ£Õ¸Ö€Õ®Õ«Ö„Õ¶Õ¥Ö€Õ¨"</string>
+ <string name="permgroupdesc_systemTools" msgid="8162102602190734305">"Õ€Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ« Õ¡Õ¾Õ¥Õ¬Õ« ÖÕ¡Õ®Ö€ Õ´Õ¡Õ¯Õ¡Ö€Õ¤Õ¡Õ¯Õ« Õ´Õ¡Õ¿Õ¹Õ¸Ö‚Õ´ Ö‡ Õ¾Õ¥Ö€Õ¡Õ°Õ½Õ¯Õ¸Õ²Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶:"</string>
+ <string name="permgrouplab_developmentTools" msgid="3446164584710596513">"Ô¾Ö€Õ¡Õ£Ö€Õ¡Õ¾Õ¸Ö€Õ´Õ¡Õ¶ Õ£Õ¸Ö€Õ®Õ«Ö„Õ¶Õ¥Ö€"</string>
+ <string name="permgroupdesc_developmentTools" msgid="7058828032358142018">"Ô³Õ¸Ö€Õ®Õ¡Õ¼Õ¸Ö‚ÕµÕ©Õ¶Õ¥Ö€, Õ¸Ö€ Õ¡Õ¶Õ°Ö€Õ¡ÕªÕ¥Õ·Õ¿ Õ¥Õ¶ Õ´Õ«Õ¡ÕµÕ¶ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ« Õ®Ö€Õ¡Õ£Ö€Õ¡Õ¾Õ¸Ö€Õ¸Õ²Õ¶Õ¥Ö€Õ«Õ¶:"</string>
+ <string name="permgrouplab_display" msgid="4279909676036402636">"Ô±ÕµÕ¬ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ« UI"</string>
+ <string name="permgroupdesc_display" msgid="6051002031933013714">"Ô±Õ¦Õ¤Õ¥Õ¬ Õ¡ÕµÕ¬ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ« UI-Õ¶Õ¥Ö€Õ«Õ¶:"</string>
+ <string name="permgrouplab_storage" msgid="1971118770546336966">"ÕŠÕ¡Õ°Õ¸Ö"</string>
+ <string name="permgroupdesc_storage" product="nosdcard" msgid="7442318502446874999">"Õ„Õ¸Ö‚Õ¿Ö„ Õ£Õ¸Ö€Õ®Õ¥Õ¬ USB ÕºÕ¡Õ°Õ¸Ö:"</string>
+ <string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"Õ„Õ¸Ö‚Õ¿Ö„ Õ£Õ¸Ö€Õ®Õ¥Õ¬ SD Ö„Õ¡Ö€Õ¿:"</string>
+ <string name="permgrouplab_accessibilityFeatures" msgid="7919025602283593907">"Õ„Õ¡Õ¿Õ¹Õ¥Õ¬Õ«Õ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ£Õ¸Ö€Õ®Õ«Ö„Õ¶Õ¥Ö€"</string>
+ <string name="permgroupdesc_accessibilityFeatures" msgid="4205196881678144335">"Õ€Õ¡Õ¿Õ¯Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€, Õ¸Ö€ Ö…ÕªÕ¡Õ¶Õ¤Õ¡Õ¯Õ¸Õ² Õ¿Õ¥Õ­Õ¶Õ¸Õ¬Õ¸Õ£Õ«Õ¡Õ¶ Õ¯Õ¡Ö€Õ¸Õ² Õ§ Õ°Õ¡ÕµÖÕ¥Õ¬:"</string>
+ <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Ô±Õ¼Õ¢Õ¥Ö€Õ¥Õ¬ ÕºÕ¡Õ¿Õ¸Ö‚Õ°Õ¡Õ¶Õ« Õ¢Õ¸Õ¾Õ¡Õ¶Õ¤Õ¡Õ¯Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨"</string>
+ <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Õտուգեք պատուհանի Õ¢Õ¸Õ¾Õ¡Õ¶Õ¤Õ¡Õ¯Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨, Õ¸Ö€Õ« Õ°Õ¥Õ¿ ÖƒÕ¸Õ­Õ£Õ¸Ö€Õ®Õ¡Õ¯ÖÕ¸Ö‚Õ´ Õ¥Ö„:"</string>
+ <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Õ„Õ«Õ¡ÖÕ¶Õ¥Õ¬ Õ€ÕºÕ´Õ¡Õ¶ Õ´Õ«Õ»Õ¸ÖÕ¸Õ¾ Õ°Õ¥Õ¿Õ¡Õ¦Õ¸Õ¿Õ¸Ö‚Õ´Õ¨"</string>
+ <string name="capability_desc_canRequestTouchExploration" msgid="5800552516779249356">"ÕÕ¡Ö€Ö€Õ¥Ö€Õ¨, Õ¸Ö€Õ¸Õ¶Ö Õ°ÕºÕ¥Ö„, Õ¢Õ¡Ö€Õ±Ö€Õ¡Õ±Õ¡ÕµÕ¶ Õ¯Õ­Õ¸Õ½Õ¥Õ¶, Ö‡ Õ§Õ¯Ö€Õ¡Õ¶Õ¨ Õ°Õ¶Õ¡Ö€Õ¡Õ¾Õ¸Ö€ Õ¯Õ¬Õ«Õ¶Õ« Õ¸Ö‚Õ½Õ¸Ö‚Õ´Õ¶Õ¡Õ½Õ«Ö€Õ¥Õ¬ ÕªÕ¥Õ½Õ¿Õ¥Ö€Õ¸Õ¾:"</string>
+ <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Õ„Õ«Õ¡ÖÕ¶Õ¥Õ¬ Õ¨Õ¶Õ¤Õ¬Õ¡ÕµÕ¶Õ¾Õ¡Õ® Õ¾Õ¥Õ¢ Õ´Õ¡Õ¿Õ¹Õ¥Õ¬Õ«Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨"</string>
+ <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Õ€Õ¶Õ¡Ö€Õ¡Õ¾Õ¸Ö€ Õ§ Õ½Õ¯Ö€Õ«ÕºÕ¿Õ¶Õ¥Ö€ Õ¿Õ¥Õ²Õ¡Õ¤Ö€Õ¾Õ¥Õ¶` Õ®Ö€Õ¡Õ£Ö€Õ« Õ¢Õ¸Õ¾Õ¡Õ¶Õ¤Õ¡Õ¯Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶ Õ¡Õ¾Õ¥Õ¬Õ« Õ´Õ¡Õ¿Õ¹Õ¥Õ¬Õ« Õ¤Õ¡Ö€Õ±Õ¶Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€:"</string>
+ <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Ô¶Õ¶Õ¶Õ¥Õ¬ Õ±Õ¥Ö€ Õ´Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ¡Õ® Õ¿Õ¥Ö„Õ½Õ¿Õ¨"</string>
+ <string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Õ†Õ¥Ö€Õ¡Õ¼Õ¸Ö‚Õ´ Õ§ Õ¡Õ¶Õ±Õ¶Õ¡Õ¯Õ¡Õ¶ Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€, Õ«Õ¶Õ¹ÕºÕ«Õ½Õ«Ö„ Õ¥Õ¶ Õ¾Õ¡Ö€Õ¯Õ¡ÕµÕ«Õ¶ Ö„Õ¡Ö€Õ¿Õ¥Ö€Õ« Õ°Õ¡Õ´Õ¡Ö€Õ¶Õ¥Ö€Õ¨ Ö‡ Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ¥Ö€Õ¨:"</string>
+ <string name="permlab_statusBar" msgid="7417192629601890791">"Õ¡Õ¶Õ»Õ¡Õ¿Õ¥Õ¬ Õ¯Õ¡Õ´ ÖƒÕ¸ÖƒÕ¸Õ­Õ¥Õ¬ Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ«Õ³Õ¡Õ¯Õ« Õ£Õ¸Õ¿Õ«Õ¶"</string>
+ <string name="permdesc_statusBar" msgid="8434669549504290975">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¡Õ¶Õ»Õ¡Õ¿Õ¥Õ¬ Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ«Õ³Õ¡Õ¯Õ« Õ£Õ¸Õ¿Õ«Õ¶ Õ¯Õ¡Õ´ Õ¡Õ¾Õ¥Õ¬Õ¡ÖÕ¶Õ¥Õ¬ Õ¸Ö‚ Õ°Õ¥Õ¼Õ¡ÖÕ¶Õ¥Õ¬ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ« ÕºÕ¡Õ¿Õ¯Õ¥Ö€Õ¡Õ¯Õ¶Õ¥Ö€Õ¨:"</string>
+ <string name="permlab_statusBarService" msgid="7247281911387931485">"Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ«Õ³Õ¡Õ¯Õ« Õ£Õ¸Õ¿Õ«"</string>
+ <string name="permdesc_statusBarService" msgid="716113660795976060">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ«Õ³Õ¡Õ¯Õ« Õ£Õ¸Õ¿Õ«Õ¶ Õ¬Õ«Õ¶Õ¥Õ¬:"</string>
+ <string name="permlab_expandStatusBar" msgid="1148198785937489264">"Õ¨Õ¶Õ¤Õ¬Õ¡ÕµÕ¶Õ¥Õ¬ Õ¯Õ¡Õ´ Õ¥Õ¿ Õ®Õ¡Õ¬Õ¥Õ¬ Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ«Õ³Õ¡Õ¯Õ« Õ£Õ¸Õ¿Õ«Õ¶"</string>
+ <string name="permdesc_expandStatusBar" msgid="6917549437129401132">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ®Ö€Õ¡Õ£Ö€Õ«Õ¶ Õ¨Õ¶Õ¤Õ¬Õ¡ÕµÕ¶Õ¥Õ¬ Õ¯Õ¡Õ´ Õ¥Õ¿ Õ®Õ¡Õ¬Õ¥Õ¬ Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ«Õ³Õ¡Õ¯Õ« Õ£Õ¸Õ¿Õ«Õ¶:"</string>
+ <string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"Õ¾Õ¥Ö€Õ¡Õ¸Ö‚Õ²Õ²Õ¥Õ¬ Õ¥Õ¬Ö„Õ¡ÕµÕ«Õ¶ Õ¦Õ¡Õ¶Õ£Õ¥Ö€Õ¨"</string>
+ <string name="permdesc_processOutgoingCalls" msgid="5331318931937402040">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ´Õ·Õ¡Õ¯Õ¥Õ¬ Õ¥Õ¬Ö„Õ¡ÕµÕ«Õ¶ Õ¦Õ¡Õ¶Õ£Õ¥Ö€Õ¨ Ö‡ ÖƒÕ¸Õ­Õ¥Õ¬ Õ°Õ¡Õ´Õ¡Ö€Õ°Õ¡Õ¾Õ¡Ö„Õ¸Ö‚Õ´Õ¨: ÕŽÕ¶Õ¡Õ½Õ¡Ö€Õ¡Ö€ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ¨ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Õ¶ Õ¾Õ¥Ö€Õ¡Õ°Õ½Õ¯Õ¥Õ¬, Õ¾Õ¥Ö€Õ¡Õ°Õ¡Õ½ÖÕ¥Õ¡Õ¾Õ¸Ö€Õ¥Õ¬ Õ¯Õ¡Õ´ Õ¯Õ¡Õ¶Õ­Õ¥Õ¬ Õ¥Õ¬Ö„Õ¡ÕµÕ«Õ¶ Õ¦Õ¡Õ¶Õ£Õ¥Ö€Õ¨:"</string>
+ <string name="permlab_receiveSms" msgid="8673471768947895082">"Õ½Õ¿Õ¡Õ¶Õ¡Õ¬ Õ¿Õ¥Ö„Õ½Õ¿Õ¡ÕµÕ«Õ¶ Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€ (SMS)"</string>
+ <string name="permdesc_receiveSms" msgid="6424387754228766939">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ½Õ¿Õ¡Õ¶Õ¡Õ¬ Ö‡ Õ´Õ·Õ¡Õ¯Õ¥Õ¬ SMS Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨: ÕÕ¡ Õ¶Õ·Õ¡Õ¶Õ¡Õ¯Õ¸Ö‚Õ´ Õ§, Õ¸Ö€ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¨ Õ¯Õ¡Ö€Õ¸Õ² Õ§ Õ½Õ¿Õ¸Ö‚Õ£Õ¥Õ¬ Õ¯Õ¡Õ´ Õ»Õ¶Õ»Õ¥Õ¬ Õ±Õ¥Ö€ Õ½Õ¡Ö€Ö„Õ«Õ¶ Õ¸Ö‚Õ²Õ¡Ö€Õ¯Õ¾Õ¡Õ® Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨` Õ¡Õ¼Õ¡Õ¶Ö Õ¤Ö€Õ¡Õ¶Ö„ Õ±Õ¥Õ¦ ÖÕ¸Ö‚ÖÕ¡Õ¤Ö€Õ¥Õ¬Õ¸Ö‚:"</string>
+ <string name="permlab_receiveMms" msgid="1821317344668257098">"Õ½Õ¿Õ¡Õ¶Õ¡Õ¬ Õ¿Õ¥Ö„Õ½Õ¿Õ¡ÕµÕ«Õ¶ Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€ (MMS)"</string>
+ <string name="permdesc_receiveMms" msgid="533019437263212260">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ½Õ¿Õ¡Õ¶Õ¡Õ¬ Ö‡ Õ´Õ·Õ¡Õ¯Õ¥Õ¬ MMS Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨: ÕÕ¡ Õ¶Õ·Õ¡Õ¶Õ¡Õ¯Õ¸Ö‚Õ´ Õ§, Õ¸Ö€ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¨ Õ¯Õ¡Ö€Õ¸Õ² Õ§ Õ½Õ¿Õ¸Ö‚Õ£Õ¥Õ¬ Õ¯Õ¡Õ´ Õ»Õ¶Õ»Õ¥Õ¬ Õ±Õ¥Ö€ Õ½Õ¡Ö€Ö„Õ«Õ¶ Õ¸Ö‚Õ²Õ¡Ö€Õ¯Õ¾Õ¡Õ® Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨` Õ¡Õ¼Õ¡Õ¶Ö Õ¤Ö€Õ¡Õ¶Ö„ Õ±Õ¥Õ¦ ÖÕ¸Ö‚ÖÕ¡Õ¤Ö€Õ¥Õ¬Õ¸Ö‚:"</string>
+ <string name="permlab_receiveEmergencyBroadcast" msgid="1803477660846288089">"Õ½Õ¿Õ¡Õ¶Õ¡Õ¬ Õ¡Ö€Õ¿Õ¡Õ¯Õ¡Ö€Õ£ Õ«Ö€Õ¡Õ¾Õ«Õ³Õ¡Õ¯Õ¶Õ¥Ö€Õ« Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¸Ö‚Õ´Õ¶Õ¥Ö€"</string>
+ <string name="permdesc_receiveEmergencyBroadcast" msgid="848524070262431974">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ½Õ¿Õ¡Õ¶Õ¡Õ¬ Ö‡ Õ´Õ·Õ¡Õ¯Õ¥Õ¬ Õ®Õ¡Õ¶Õ¸Ö‚ÖÕ¾Õ¸Õ² Õ¡Ö€Õ¿Õ¡Õ¯Õ¡Ö€Õ£ Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¡Õ¯ÖÕ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨: Ô±ÕµÕ½ Õ©Õ¸Ö‚ÕµÕ¬Õ¿Õ¾Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Õ°Õ¡Õ½Õ¡Õ¶Õ¥Õ¬Õ« Õ§ Õ´Õ«Õ¡ÕµÕ¶ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ¡ÕµÕ«Õ¶ Õ®Ö€Õ¡Õ£Ö€Õ¥Ö€Õ«Õ¶:"</string>
+ <string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"Õ¯Õ¡Ö€Õ¤Õ¡Õ¬ Õ¢Õ»Õ»Õ¡ÕµÕ«Õ¶ Õ¦Õ¥Õ¯Õ¸Ö‚ÖÕ¾Õ¸Õ² Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨"</string>
+ <string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¯Õ¡Ö€Õ¤Õ¡Õ¬ Õ±Õ¥Ö€ Õ½Õ¡Ö€Ö„Õ« Õ¯Õ¸Õ²Õ´Õ«Ö Õ½Õ¿Õ¡ÖÕ¾Õ¡Õ® Õ¢Õ»Õ»Õ¡ÕµÕ«Õ¶ Õ°Õ¥Õ¼Õ¡Ö€Õ±Õ¡Õ¯Õ¾Õ¸Õ² Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨: Ô²Õ»Õ»Õ¡ÕµÕ«Õ¶ Õ°Õ¥Õ¼Õ¡Ö€Õ±Õ¡Õ¯Õ¾Õ¸Õ² Õ¦Õ£Õ¸Ö‚Õ·Õ¡ÖÕ¸Ö‚Õ´Õ¶Õ¥Ö€Õ¨ Õ¸Ö‚Õ²Õ¡Ö€Õ¯Õ¾Õ¸Ö‚Õ´ Õ¥Õ¶ Õ¸Ö€Õ¸Õ· Õ¾Õ¡ÕµÖ€Õ¥Ö€Õ¸Ö‚Õ´` Õ¡Ö€Õ¿Õ¡Õ¯Õ¡Ö€Õ£ Õ«Ö€Õ¡Õ¾Õ«Õ³Õ¡Õ¯Õ¶Õ¥Ö€Õ« Õ´Õ¡Õ½Õ«Õ¶ Õ±Õ¥Õ¦ Õ¦Õ£Õ¸Ö‚Õ·Õ¡ÖÕ¶Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€: ÕŽÕ¶Õ¡Õ½Õ¡Ö€Õ¡Ö€ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ¨ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Õ¶ Õ­Õ¡Õ¶Õ£Õ¡Ö€Õ¥Õ¬ Õ±Õ¥Ö€ Õ½Õ¡Ö€Ö„Õ« Õ¡Ö€Õ¤ÕµÕ¸Ö‚Õ¶Õ¡Õ¾Õ¥Õ¿Õ¸Ö‚Õ©ÕµÕ¡Õ¶Õ¨ Õ¯Õ¡Õ´ Õ·Õ¡Õ°Õ¡Õ£Õ¸Ö€Õ®Õ´Õ¡Õ¶Õ¨, Õ¥Ö€Õ¢ Õ½Õ¿Õ¡ÖÕ¾Õ¸Ö‚Õ´ Õ§ Õ¡Ö€Õ¿Õ¡Õ¯Õ¡Ö€Õ£ Õ«Ö€Õ¡Õ¾Õ«Õ³Õ¡Õ¯Õ« Õ´Õ¡Õ½Õ«Õ¶ Õ¢Õ»Õ»Õ¡ÕµÕ«Õ¶ Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¸Ö‚Õ´:"</string>
+ <string name="permlab_sendSms" msgid="5600830612147671529">"Õ¸Ö‚Õ²Õ¡Ö€Õ¯Õ¥Õ¬ SMS Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€"</string>
+ <string name="permdesc_sendSms" msgid="7094729298204937667">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¸Ö‚Õ²Õ¡Ö€Õ¯Õ¥Õ¬ SMS Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€: Ô±ÕµÕ¶ Õ¯Õ¡Ö€Õ¸Õ² Õ§ Õ¡Õ¶Õ½ÕºÕ¡Õ½Õ¥Õ¬Õ« Õ®Õ¡Õ­Õ½Õ¥Ö€Õ« ÕºÕ¡Õ¿Õ³Õ¡Õ¼ Õ¤Õ¡Õ¼Õ¶Õ¡Õ¬: ÕŽÕ¶Õ¡Õ½Õ¡Ö€Õ¡Ö€ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ¨ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Õ¶ Õ±Õ¥Ö€ Õ°Õ¡Õ·Õ¾Õ«Ö Õ£Õ¸Ö‚Õ´Õ¡Ö€ Õ®Õ¡Õ­Õ½Õ¥Õ¬` Õ¸Ö‚Õ²Õ¡Ö€Õ¯Õ¥Õ¬Õ¸Õ¾ Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€` Õ¡Õ¼Õ¡Õ¶Ö Õ±Õ¥Ö€ Õ°Õ¡Õ½Õ¿Õ¡Õ¿Õ´Õ¡Õ¶:"</string>
+ <string name="permlab_sendRespondViaMessageRequest" msgid="8713889105305943200">"պատասխանել հաղորդագրության Õ´Õ«Õ»Õ¸ÖÕ¸Õ¾ Õ«Ö€Õ¡Õ¤Õ¡Ö€Õ±Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€ Õ¸Ö‚Õ²Õ¡Ö€Õ¯Õ¥Õ¬"</string>
+ <string name="permdesc_sendRespondViaMessageRequest" msgid="7107648548468778734">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ°Õ¡Ö€ÖÕ¸Ö‚Õ´Õ¶Õ¥Ö€ Õ¸Ö‚Õ²Õ¡Ö€Õ¯Õ¥Õ¬ Õ¡ÕµÕ¬ Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ« Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ«Õ¶` Õ¯Õ¡Õ¼Õ¡Õ¾Õ¡Ö€Õ¥Õ¬Õ¸Ö‚ Õ´Õ¸Ö‚Õ¿Ö„Õ¡ÕµÕ«Õ¶ Õ¦Õ¡Õ¶Õ£Õ¥Ö€Õ«Õ¶ Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ´Õ«Õ»Õ¸ÖÕ¸Õ¾ ÕºÕ¡Õ¿Õ¡Õ½Õ­Õ¡Õ¶Õ¥Õ¬Õ¸Ö‚ Õ¤Õ¥ÕºÖ„Õ¥Ö€Õ¨:"</string>
+ <string name="permlab_readSms" msgid="8745086572213270480">"Õ¯Õ¡Ö€Õ¤Õ¡Õ¬ Õ±Õ¥Ö€ Õ¿Õ¥Ö„Õ½Õ¿Õ¡ÕµÕ«Õ¶ Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨ (SMS Õ¯Õ¡Õ´ MMS)"</string>
+ <string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ կարդալ ձեր Õ£Ö€Õ¡Õ½Õ¡Õ¬Õ«Õ¯Õ¸Ö‚Õ´ Õ¯Õ¡Õ´ SIM քարտում պահված SMS Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨: ÕÕ¡ Õ©Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¯Õ¡Ö€Õ¤Õ¡Õ¬ Õ¢Õ¸Õ¬Õ¸Ö€ SMS Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨` Õ¡Õ¶Õ¯Õ¡Õ­ Õ¢Õ¸Õ¾Õ¡Õ¶Õ¤Õ¡Õ¯Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ«Ö Õ¯Õ¡Õ´ Õ£Õ¡Õ²Õ¿Õ¶Õ«Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ«Ö:"</string>
+ <string name="permdesc_readSms" product="default" msgid="3695967533457240550">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¯Õ¡Ö€Õ¤Õ¡Õ¬ Õ±Õ¥Ö€ Õ°Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ¸Ö‚Õ´ Õ¯Õ¡Õ´ SIM Ö„Õ¡Ö€Õ¿Õ¸Ö‚Õ´ ÕºÕ¡Õ°Õ¾Õ¡Õ® SMS Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨: ÕÕ¡ Õ©Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¯Õ¡Ö€Õ¤Õ¡Õ¬ Õ¢Õ¸Õ¬Õ¸Ö€ SMS Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨` Õ¡Õ¶Õ¯Õ¡Õ­ Õ¢Õ¸Õ¾Õ¡Õ¶Õ¤Õ¡Õ¯Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ«Ö Õ¯Õ¡Õ´ Õ£Õ¡Õ²Õ¿Õ¶Õ«Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ«Ö:"</string>
+ <string name="permlab_writeSms" msgid="3216950472636214774">"Õ­Õ´Õ¢Õ¡Õ£Ö€Õ¥Õ¬ Õ±Õ¥Ö€ Õ¿Õ¥Ö„Õ½Õ¿Õ¡ÕµÕ«Õ¶ Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨ (SMS Õ¯Õ¡Õ´ MMS)"</string>
+ <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ ÕºÕ¡Õ¿Õ¡Õ½Õ­Õ¡Õ¶Õ¥Õ¬ Õ±Õ¥Ö€ Õ£Ö€Õ¡Õ½Õ¡Õ¬Õ«Õ¯Õ¸Ö‚Õ´ Õ¯Õ¡Õ´ SIM Ö„Õ¡Ö€Õ¿Õ¸Ö‚Õ´ ÕºÕ¡Õ°Õ¾Õ¡Õ® SMS Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ«Õ¶: ÕŽÕ¶Õ¡Õ½Õ¡Ö€Õ¡Ö€ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ¨ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Õ¶ Õ»Õ¶Õ»Õ¥Õ¬ Õ±Õ¥Ö€ Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨:"</string>
+ <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ ÕºÕ¡Õ¿Õ¡Õ½Õ­Õ¡Õ¶Õ¥Õ¬ Õ±Õ¥Ö€ Õ°Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ¸Ö‚Õ´ Õ¯Õ¡Õ´ SIM Ö„Õ¡Ö€Õ¿Õ¸Ö‚Õ´ ÕºÕ¡Õ°Õ¾Õ¡Õ® SMS Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ«Õ¶: ÕŽÕ¶Õ¡Õ½Õ¡Ö€Õ¡Ö€ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ¨ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Õ¶ Õ»Õ¶Õ»Õ¥Õ¬ Õ±Õ¥Ö€ Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨:"</string>
+ <string name="permlab_receiveWapPush" msgid="5991398711936590410">"Õ½Õ¿Õ¡Õ¶Õ¡Õ¬ Õ¿Õ¥Ö„Õ½Õ¿Õ¡ÕµÕ«Õ¶ Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€ (WAP)"</string>
+ <string name="permdesc_receiveWapPush" msgid="748232190220583385">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ½Õ¿Õ¡Õ¶Õ¡Õ¬ Ö‡ Õ£Õ¸Ö€Õ®Õ¡Ö€Õ¯Õ¥Õ¬ WAP Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨: Ô±ÕµÕ½ Õ©Õ¸Ö‚ÕµÕ¬Õ¿Õ¾Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Õ¶Õ¥Ö€Õ¡Õ¼Õ¸Ö‚Õ´ Õ§ Õ±Õ¥Õ¦ Õ¸Ö‚Õ²Õ¡Ö€Õ¯Õ¾Õ¡Õ® Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨ Õ°Õ¥Õ¿Ö‡Õ¥Õ¬Õ¸Ö‚ Õ¯Õ¡Õ´ ջնջելու կարողությունը` Õ¡Õ¼Õ¡Õ¶Ö Õ±Õ¥Ö€ Õ¿Õ¥Õ½Õ¶Õ¥Õ¬Õ¸Ö‚:"</string>
+ <string name="permlab_getTasks" msgid="6466095396623933906">"Õ¡Õ¼Õ¢Õ¥Ö€Õ¥Õ¬ Õ¡Õ·Õ­Õ¡Õ¿Õ¸Õ² Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ¨"</string>
+ <string name="permdesc_getTasks" msgid="7454215995847658102">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¡Õ¼Õ¢Õ¥Ö€Õ¥Õ¬ Õ´Õ¡Õ¶Ö€Õ¡Õ´Õ¡Õ½Õ¶ Õ¿Õ¥Õ²Õ¥Õ¯Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€ Õ¡Õ¼Õ¯Õ¡ Ö‡ Õ¾Õ¥Ö€Õ»Õ¥Ö€Õ½ Õ¡Õ·Õ­Õ¡Õ¿Õ¸Õ² Õ¡Õ¼Õ¡Õ»Õ¡Õ¤Ö€Õ¡Õ¶Ö„Õ¶Õ¥Ö€Õ« Õ´Õ¡Õ½Õ«Õ¶: ÕÕ¡ Õ¯Õ¡Ö€Õ¸Õ² Õ§ Õ©Õ¸Ö‚ÕµÕ¬ Õ¿Õ¡Õ¬ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ°Õ¡ÕµÕ¿Õ¶Õ¡Õ¢Õ¥Ö€Õ¥Õ¬ Õ¡Õ¶Õ±Õ¶Õ¡Õ¯Õ¡Õ¶ Õ¿Õ¥Õ²Õ¥Õ¯Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€ Õ¡ÕµÕ¬ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ« Õ¾Õ¥Ö€Õ¡Õ¢Õ¥Ö€ÕµÕ¡Õ¬:"</string>
+ <string name="permlab_interactAcrossUsers" msgid="7114255281944211682">"Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¡Õ¯ÖÕ¾Õ¥Õ¬ Ö…Õ£Õ¿Õ¾Õ¸Õ²Õ¶Õ¥Ö€Õ« Õ´Õ«Õ»Ö‡"</string>
+ <string name="permdesc_interactAcrossUsers" msgid="364670963623385786">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ«Ö€Õ¡Õ¯Õ¡Õ¶Õ¡ÖÕ¶Õ¥Õ¬ Õ£Õ¸Ö€Õ®Õ¸Õ²Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€ Õ½Õ¡Ö€Ö„Õ« Õ¿Õ¡Ö€Õ¢Õ¥Ö€ Ö…Õ£Õ¿Õ¾Õ¸Õ²Õ¶Õ¥Ö€Õ« Õ´Õ«Õ»Õ¸ÖÕ¸Õ¾: ÕŽÕ¶Õ¡Õ½Õ¡Ö€Õ¡Ö€ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ¨ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Õ¶ Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¥Õ¬ Õ½Õ¡` Õ­Õ¡Õ­Õ¿Õ¥Õ¬Õ¸Ö‚ Ö…Õ£Õ¿Õ¾Õ¸Õ²Õ¶Õ¥Ö€Õ« Õ´Õ«Õ»Ö‡ ÕºÕ¡Õ·Õ¿ÕºÕ¡Õ¶Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨:"</string>
+ <string name="permlab_interactAcrossUsersFull" msgid="2567734285545074105">"Õ¡Õ´Õ¢Õ¸Õ²Õ»Õ¡Õ¯Õ¡Õ¶ Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¡Õ¯ÖÕ¾Õ¥Õ¬Õ¸Ö‚ Õ¡Ö€Õ¿Õ¸Õ¶Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶ Ö…Õ£Õ¿Õ¾Õ¸Õ²Õ¶Õ¥Ö€Õ« Õ´Õ«Õ»Ö‡"</string>
+ <string name="permdesc_interactAcrossUsersFull" msgid="376841368395502366">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ¢Õ¸Õ¬Õ¸Ö€ Õ°Õ¶Õ¡Ö€Õ¡Õ¾Õ¸Ö€ Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¡Õ¯ÖÕ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ¥Õ²Õ¡Õ¶Õ¡Õ¯Õ¶Õ¥Ö€Õ¨ Ö…Õ£Õ¿Õ¾Õ¸Õ²Õ¶Õ¥Ö€Õ« Õ´Õ«Õ»Ö‡:"</string>
+ <string name="permlab_manageUsers" msgid="1676150911672282428">"Õ¯Õ¡Õ¼Õ¡Õ¾Õ¡Ö€Õ¥Õ¬ Ö…Õ£Õ¿Õ¾Õ¸Õ²Õ¶Õ¥Ö€Õ«Õ¶"</string>
+ <string name="permdesc_manageUsers" msgid="8409306667645355638">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ«Õ¶ Õ¯Õ¡Õ¼Õ¡Õ¾Õ¡Ö€Õ¥Õ¬ Õ½Õ¡Ö€Ö„Õ« Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¸Õ²Õ¶Õ¥Ö€Õ«Õ¶, Õ¡ÕµÕ¤ Õ©Õ¾Õ¸Ö‚Õ´` Õ°Õ¡Ö€ÖÕ¸Ö‚Õ´Õ¶Õ¥Ö€Õ¨, Õ½Õ¿Õ¥Õ²Õ®Õ¸Ö‚Õ´Õ¶ Õ¸Ö‚ Õ»Õ¶Õ»Õ¸Ö‚Õ´Õ¨:"</string>
+ <string name="permlab_getDetailedTasks" msgid="6229468674753529501">"Õ¡Õ¼Õ¢Õ¥Ö€Õ¥Õ¬ Õ¡Õ·Õ­Õ¡Õ¿Õ¸Õ² Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ« Õ´Õ¡Õ¶Ö€Õ¡Õ´Õ¡Õ½Õ¶Õ¥Ö€Õ¨"</string>
+ <string name="permdesc_getDetailedTasks" msgid="153824741440717599">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¡Õ¼Õ¢Õ¥Ö€Õ¥Õ¬ Õ´Õ¡Õ¶Ö€Õ¡Õ´Õ¡Õ½Õ¶ Õ¿Õ¥Õ²Õ¥Õ¯Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€ Õ¡Õ¼Õ¯Õ¡ Ö‡ Õ¾Õ¥Ö€Õ»Õ¥Ö€Õ½ Õ¡Õ·Õ­Õ¡Õ¿Õ¸Õ² Õ¡Õ¼Õ¡Õ»Õ¡Õ¤Ö€Õ¡Õ¶Ö„Õ¶Õ¥Ö€Õ« Õ´Õ¡Õ½Õ«Õ¶: ÕŽÕ¶Õ¡Õ½Õ¡Ö€Õ¡Ö€ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ¨ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Õ¶ Õ°Õ¡ÕµÕ¿Õ¶Õ¡Õ¢Õ¥Ö€Õ¥Õ¬ Õ¡Õ¶Õ±Õ¶Õ¡Õ¯Õ¡Õ¶ Õ¿Õ¥Õ²Õ¥Õ¯Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€ Õ¡ÕµÕ¬ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ« Õ¾Õ¥Ö€Õ¡Õ¢Õ¥Ö€ÕµÕ¡Õ¬:"</string>
+ <string name="permlab_reorderTasks" msgid="2018575526934422779">"Õ¾Õ¥Ö€Õ¡Õ¤Õ¡Õ½Õ¡Õ¾Õ¸Ö€Õ¥Õ¬ Õ¡Õ·Õ­Õ¡Õ¿Õ¸Õ² Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ¨"</string>
+ <string name="permdesc_reorderTasks" msgid="7734217754877439351">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ ÖƒÕ¸Õ­Õ¡Õ¶ÖÕ¥Õ¬ Õ¡Õ¼Õ¡Õ»Õ¡Õ¤Ö€Õ¡Õ¶Ö„Õ¶Õ¥Ö€Õ¨ Õ¡Õ¼Õ»Ö‡Ö„ Ö‡ Õ°Õ¥Õ¿Õ¶Õ¡Õ·Õ¥Ö€Õ¿: Õ€Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¨ Õ¯Õ¡Ö€Õ¸Õ² Õ§ Õ½Õ¡ Õ¡Õ¶Õ¥Õ¬ Õ¡Õ¼Õ¡Õ¶Ö Õ±Õ¥Ö€ Õ¶Õ¥Ö€Õ¡Õ®Õ´Õ¡Õ¶:"</string>
+ <string name="permlab_removeTasks" msgid="6821513401870377403">"Õ¤Õ¡Õ¤Õ¡Ö€Õ¥ÖÕ¶Õ¥Õ¬ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ« Õ¡Õ·Õ­Õ¡Õ¿Õ¡Õ¶Ö„Õ¨"</string>
+ <string name="permdesc_removeTasks" msgid="1394714352062635493">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ°Õ¥Õ¼Õ¡ÖÕ¶Õ¥Õ¬ Õ¡Õ¼Õ¡Õ»Õ¡Õ¤Ö€Õ¡Ö„Õ¶Õ¥Ö€Õ¨ Ö‡ Õ¾Õ¥Ö€Õ¡ÖÕ¶Õ¥Õ¬ Õ¤Ö€Õ¡Õ¶Ö Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ¨: ÕŽÕ¶Õ¡Õ½Õ¡Ö€Õ¡Ö€ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ¨ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Õ¶ Õ­Õ¡Õ¶Õ£Õ¡Ö€Õ¥Õ¬ Õ¡ÕµÕ¬ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ« Õ£Õ¸Ö€Õ®Õ¸Ö‚Õ¶Õ¥Õ¸Ö‚Õ©ÕµÕ¡Õ¶Õ¨:"</string>
+ <string name="permlab_manageActivityStacks" msgid="7391191384027303065">"Õ¯Õ¡Õ¼Õ¡Õ¾Õ¡Ö€Õ¥Õ¬ Õ£Õ¸Ö€Õ®Õ¸Ö‚Õ¶Õ¥Õ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ¯Õ¸Ö‚ÕµÕ¿Õ¥Ö€Õ¨"</string>
+ <string name="permdesc_manageActivityStacks" msgid="1615881933034084440">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ®Ö€Õ¡Õ£Ö€Õ«Õ¶ Õ¡Õ¾Õ¥Õ¬Õ¡ÖÕ¶Õ¥Õ¬, Õ°Õ¥Õ¼Õ¡ÖÕ¶Õ¥Õ¬ Ö‡ ÖƒÕ¸ÖƒÕ¸Õ­Õ¥Õ¬ Õ£Õ¸Ö€Õ®Õ¸Ö‚Õ¶Õ¥Õ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ¯Õ¸Ö‚ÕµÕ¿Õ¥Ö€Õ¨, Õ¸Ö€Õ¸Õ¶ÖÕ¸Ö‚Õ´ Õ¡Õ·Õ­Õ¡Õ¿Õ¸Ö‚Õ´ Õ¥Õ¶ Õ¡ÕµÕ¬ Õ®Ö€Õ¡Õ£Ö€Õ¥Ö€: ÕŽÕ¶Õ¡Õ½Õ¡Õ¯Õ¡Ö€ Õ®Ö€Õ¡Õ£Ö€Õ¥Ö€Õ¨ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Õ¶ Õ­Õ¡Õ©Õ¡Ö€Õ¥Õ¬ Õ¡ÕµÕ¬ Õ®Ö€Õ¡Õ£Ö€Õ¥Ö€Õ« Õ¾Õ¡Ö€Ö„Õ¡Õ£Õ«Õ®Õ¨:"</string>
+ <string name="permlab_startAnyActivity" msgid="2918768238045206456">"Õ´Õ¥Õ¯Õ¶Õ¡Ö€Õ¯Õ¥Õ¬ ÖÕ¡Õ¶Õ¯Õ¡ÖÕ¡Õ® Õ£Õ¸Ö€Õ®Õ¸Ö‚Õ¶Õ¥Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶"</string>
+ <string name="permdesc_startAnyActivity" msgid="997823695343584001">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ´Õ¥Õ¯Õ¶Õ¡Ö€Õ¯Õ¥Õ¬ ÖÕ¡Õ¶Õ¯Õ¡ÖÕ¡Õ® Õ£Õ¸Ö€Õ®Õ¸Ö‚Õ¶Õ¥Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶` Õ¡Õ¶Õ¯Õ¡Õ­ Õ©Õ¸Ö‚ÕµÕ¬Õ¿Õ¾Õ¸Ö‚Õ©ÕµÕ¡Õ¶ ÕºÕ¡Õ·Õ¿ÕºÕ¡Õ¶Õ¾Õ¡Õ®Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ«Ö Õ¯Õ¡Õ´ Õ¡Ö€Õ¿Õ¡Õ°Õ¡Õ¶Õ´Õ¡Õ¶ Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ«Õ³Õ¡Õ¯Õ«Ö:"</string>
+ <string name="permlab_setScreenCompatibility" msgid="6975387118861842061">"Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¥Õ¬ Õ§Õ¯Ö€Õ¡Õ¶Õ« Õ°Õ¡Õ´Õ¡Õ¿Õ¥Õ²Õ¥Õ¬Õ«Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨"</string>
+ <string name="permdesc_setScreenCompatibility" msgid="692043618693917374">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¾Õ¥Ö€Õ¡Õ°Õ½Õ¯Õ¥Õ¬ Õ¡ÕµÕ¬ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ« Õ§Õ¯Ö€Õ¡Õ¶Õ« Õ°Õ¡Õ´Õ¡Õ¿Õ¥Õ²Õ¥Õ¬Õ«Õ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ¼Õ¥ÕªÕ«Õ´Õ¨: ÕŽÕ¶Õ¡Õ½Õ¡Ö€Õ¡Ö€ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ¨ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Õ¶ Õ­Õ¡Õ©Õ¡Ö€Õ¥Õ¬ Õ¡ÕµÕ¬ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ« Õ¾Õ¡Ö€Ö„Õ¡Õ£Õ«Õ®Õ¨:"</string>
+ <string name="permlab_setDebugApp" msgid="3022107198686584052">"Õ´Õ«Õ¡ÖÕ¶Õ¥Õ¬ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ« Õ¾Ö€Õ«ÕºÕ¡Õ¦Õ¥Ö€Õ®Õ¸Ö‚Õ´Õ¨"</string>
+ <string name="permdesc_setDebugApp" msgid="4474512416299013256">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ´Õ«Õ¡ÖÕ¶Õ¥Õ¬ Õ¾Ö€Õ«ÕºÕ¡Õ¦Õ¥Ö€Õ®Õ¸Ö‚Õ´Õ¨ Õ¡ÕµÕ¬ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ« Õ°Õ¡Õ´Õ¡Ö€: ÕŽÕ¶Õ¡Õ½Õ¡Ö€Õ¡Ö€ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ¨ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Õ¶ Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¥Õ¬ Õ½Õ¡` Õ´ÕµÕ¸Ö‚Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ¨ Õ¾Õ¥Ö€Õ¡ÖÕ¶Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€:"</string>
+ <string name="permlab_changeConfiguration" msgid="4162092185124234480">"ÖƒÕ¸Õ­Õ¥Õ¬ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ« ÖÕ¸Ö‚ÖÕ¡Õ¤Ö€Õ´Õ¡Õ¶ Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´Õ¶Õ¥Ö€Õ¨"</string>
+ <string name="permdesc_changeConfiguration" msgid="4372223873154296076">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ ÖƒÕ¸Õ­Õ¥Õ¬ Õ¡Õ¼Õ¯Õ¡ Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´Õ¨, Õ«Õ¶Õ¹ÕºÕ¥Õ½ Ö…Ö€Õ«Õ¶Õ¡Õ¯ Õ¿Õ¥Õ²Õ¸Ö‚ÕµÕ©Õ« Õ¯Õ¡Õ´ Õ¨Õ¶Õ¤Õ°Õ¡Õ¶Õ¸Ö‚Ö€ Õ¿Õ¡Õ¼Õ¡Õ¹Õ¡ÖƒÕ¨:"</string>
+ <string name="permlab_enableCarMode" msgid="5684504058192921098">"Õ´Õ«Õ¡ÖÕ¶Õ¥Õ¬ Õ´Õ¥Ö„Õ¥Õ¶Õ¡ÕµÕ« Õ¼Õ¥ÕªÕ«Õ´Õ¨"</string>
+ <string name="permdesc_enableCarMode" msgid="4853187425751419467">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ´Õ«Õ¡ÖÕ¶Õ¥Õ¬ Õ´Õ¥Ö„Õ¥Õ¶Õ¡ÕµÕ« Õ¼Õ¥ÕªÕ«Õ´Õ¨:"</string>
+ <string name="permlab_killBackgroundProcesses" msgid="3914026687420177202">"ÖƒÕ¡Õ¯Õ¥Õ¬ Õ¡ÕµÕ¬ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ¨"</string>
+ <string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¾Õ¥Ö€Õ» Õ¿Õ¡Õ¬ Õ¡ÕµÕ¬ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ« Õ°Õ¥Õ¿Õ¶Õ¡Õ·Õ¥Ö€Õ¿Õ« Õ£Õ¸Ö€Õ®Õ¨Õ¶Õ©Õ¡ÖÕ¶Õ¥Ö€Õ¨: ÕÕ¡ Õ¯Õ¡Ö€Õ¸Õ² Õ§ ÕºÕ¡Õ¿Õ³Õ¡Õ¼ Õ¤Õ¡Õ¼Õ¶Õ¡Õ¬, Õ¸Ö€ Õ¡ÕµÕ¬ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ¨ Õ¤Õ¡Õ¤Õ¡Ö€Õ¥Õ¶ Õ¡Õ·Õ­Õ¡Õ¿Õ¥Õ¬:"</string>
+ <string name="permlab_forceStopPackages" msgid="2329627428832067700">"Õ½Õ¿Õ«ÕºÕ¥Õ¬ Õ¤Õ¡Õ¤Õ¡Ö€Õ¥ÖÕ¶Õ¥Õ¬ Õ¡ÕµÕ¬ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ¨"</string>
+ <string name="permdesc_forceStopPackages" msgid="5253157296183940812">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ½Õ¿Õ«ÕºÕ¸Õ²Õ¡Õ¢Õ¡Ö€ Õ¤Õ¡Õ¤Õ¡Ö€Õ¥ÖÕ¶Õ¥Õ¬ Õ¡ÕµÕ¬ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ¨:"</string>
+ <string name="permlab_forceBack" msgid="652935204072584616">"Õ½Õ¿Õ«ÕºÕ¥Õ¬, Õ¸Ö€ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¨ ÖƒÕ¡Õ¯Õ¾Õ«"</string>
+ <string name="permdesc_forceBack" msgid="3892295830419513623">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ½Õ¿Õ«ÕºÕ¥Õ¬ Õ¸Ö€Ö‡Õ§ Õ£Õ¸Ö€Õ®Õ¸Ö‚Õ¶Õ¥Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶, Õ¸Ö€Õ¨ Õ£Õ¿Õ¶Õ¾Õ¸Ö‚Õ´ Õ§ Õ¡Õ¼Õ»Ö‡Ö„Õ¸Ö‚Õ´, ÖƒÕ¡Õ¯Õ¥Õ¬ Õ¸Ö‚ Õ¥Õ¿ Õ£Õ¶Õ¡Õ¬: ÕÕ¸Õ¾Õ¸Ö€Õ¡Õ¯Õ¡Õ¶ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ« Õ°Õ¡Õ´Õ¡Ö€ Õ¥Ö€Õ¢Ö‡Õ§ Õ¡Õ¶Õ°Ö€Õ¡ÕªÕ¥Õ·Õ¿ Õ¹ÕºÕ¥Õ¿Ö„ Õ§ Õ¬Õ«Õ¶Õ«:"</string>
+ <string name="permlab_dump" msgid="1681799862438954752">"Õ¡Õ¼Õ¢Õ¥Ö€Õ¥Õ¬ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ« Õ¶Õ¥Ö€Ö„Õ«Õ¶ Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ«Õ³Õ¡Õ¯Õ¨"</string>
+ <string name="permdesc_dump" msgid="1778299088692290329">"Թույլ է տալիս հավելվածին առբերել համակարգի ներքին կարգավիճակը: Վնասարար հավելվածները կարող են առբերել բազմաթիվ անձնական և ապահով տեղեկություններ, որոնք երբեք սովորաբար անհրաժեշտ չեն:"</string>
+ <string name="permlab_retrieve_window_content" msgid="8022588608994589938">"Õ¡Õ¼Õ¢Õ¥Ö€Õ¥Õ¬ Õ§Õ¯Ö€Õ¡Õ¶Õ« Õ¢Õ¸Õ¾Õ¡Õ¶Õ¤Õ¡Õ¯Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨"</string>
+ <string name="permdesc_retrieve_window_content" msgid="3193269069469700265">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ առբերել ակտիվ ÕºÕ¡Õ¿Õ¸Ö‚Õ°Õ¡Õ¶Õ« ÕºÕ¡Ö€Õ¸Ö‚Õ¶Õ¡Õ¯Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨: ÕŽÕ¶Õ¡Õ½Õ¡Ö€Õ¡Ö€ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ¨ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Õ¶ Õ¡Õ¼Õ¢Õ¥Ö€Õ¥Õ¬ ÕºÕ¡Õ¿Õ¸Ö‚Õ°Õ¡Õ¶Õ« Õ¬Ö€Õ«Õ¾ ÕºÕ¡Ö€Õ¸Ö‚Õ¶Õ¡Õ¯Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Ö‡ Õ°Õ¥Õ¿Õ¡Õ¦Õ¸Õ¿Õ¥Õ¬ Õ¤Ö€Õ¡ Õ¡Õ´Õ¢Õ¸Õ²Õ» Õ¿Õ¥Ö„Õ½Õ¿Õ¨` Õ¢Õ¡ÖÕ¡Õ¼Õ¸Ö‚Õ©ÕµÕ¡Õ´Õ¢ Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ¥Ö€Õ«:"</string>
+ <string name="permlab_temporary_enable_accessibility" msgid="2312612135127310254">"ÕªÕ¡Õ´Õ¡Õ¶Õ¡Õ¯Õ¡Õ¾Õ¸Ö€ Õ´Õ«Õ¡ÖÕ¶Õ¥Õ¬ Õ´Õ¸Ö‚Õ¿Ö„Õ« Õ°Õ¶Õ¡Ö€Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨"</string>
+ <string name="permdesc_temporary_enable_accessibility" msgid="8079456293182975464">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ ÕªÕ¡Õ´Õ¡Õ¶Õ¡Õ¯Õ¡Õ¾Õ¸Ö€Õ¡ÕºÕ¥Õ½ Õ´Õ¸Ö‚Õ¿Ö„Õ« Õ°Õ¶Õ¡Ö€Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶ Õ¿Õ¡Õ¬ Õ½Õ¡Ö€Ö„Õ«Õ¶: ÕŽÕ¶Õ¡Õ½Õ¡Ö€Õ¡Ö€ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ¨ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Õ¶ Õ´Õ¸Ö‚Õ¿Ö„Õ« Õ°Õ¶Õ¡Ö€Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶ Õ¨Õ¶Õ±Õ¥Õ¼Õ¥Õ¬ Õ¡Õ¼Õ¡Õ¶Ö Ö…Õ£Õ¿Õ¾Õ¸Õ²Õ« Õ°Õ¡Õ´Õ¡Õ±Õ¡ÕµÕ¶Õ¸Ö‚Õ©ÕµÕ¡Õ¶:"</string>
+ <string name="permlab_retrieve_window_info" msgid="8532295199112519378">"Õ¡Õ¼Õ¢Õ¥Ö€Õ¥Õ¬ ÕºÕ¡Õ¿Õ¸Ö‚Õ°Õ¡Õ¶Õ« Õ¿Õ¥Õ²Õ¥Õ¯Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¥Ö€Õ¨"</string>
+ <string name="permdesc_retrieve_window_info" msgid="4998836370424186849">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ առբերել պատուհանների Õ´Õ¡Õ½Õ«Õ¶ տեղեկատվություններ  ÕºÕ¡Õ¿Õ¸Ö‚Õ°Õ¡Õ¶Õ« Õ¯Õ¡Õ¼Õ¡Õ¾Õ¡Ö€Õ¹Õ«Ö: ÕŽÕ¶Õ¡Õ½Õ¡Ö€Õ¡Ö€ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ¨ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Õ¶ Õ¡Õ¼Õ¢Õ¥Ö€Õ¥Õ¬ Õ¿Õ¥Õ²Õ¥Õ¯Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€, Õ¸Ö€Õ¨ Õ¶Õ¡Õ­Õ¡Õ¿Õ¥Õ½Õ¾Õ¡Õ® Õ§ Õ¶Õ¥Ö€Ö„Õ«Õ¶ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ« Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ´Õ¡Õ¶ Õ°Õ¡Õ´Õ¡Ö€:"</string>
+ <string name="permlab_filter_events" msgid="8675535648807427389">"Õ¦Õ¿Õ¥Õ¬ Õ«Ö€Õ¡Õ¤Õ¡Ö€Õ±Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨"</string>
+ <string name="permdesc_filter_events" msgid="8006236315888347680">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ£Ö€Õ¡Õ¶ÖÕ¥Õ¬ Õ´Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ´Õ¡Õ¶ Õ¦Õ¿Õ«Õ¹, Õ¸Ö€Õ¨ Õ¦Õ¿Õ¸Ö‚Õ´ Õ§ Ö…Õ£Õ¿Õ¾Õ¸Õ²Õ« Õ«Ö€Õ¡Õ¤Õ¡Ö€Õ±Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ« Õ¡Õ´Õ¢Õ¸Õ²Õ» Õ°Õ¸Õ½Ö„Õ¨` Õ¶Õ¡Õ­Ö„Õ¡Õ¶ Õ¤Ö€Õ¡Õ¶Ö„ Õ¯Õ¸Ö‚Õ²Õ¡Ö€Õ¯Õ¾Õ¥Õ¶: ÕŽÕ¶Õ¡Õ½Õ¡Ö€Õ¡Ö€ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¨ Õ¯Õ¡Ö€Õ¸Õ² Õ§ Õ¯Õ¡Õ¼Õ¡Õ¾Õ¡Ö€Õ¥Õ¬ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ« UI-Õ¨` Õ¡Õ¼Õ¡Õ¶Ö Õ±Õ¥Ö€ Õ´Õ«Õ»Õ¡Õ´Õ¿Õ¸Ö‚Õ©ÕµÕ¡Õ¶:"</string>
+ <string name="permlab_magnify_display" msgid="5973626738170618775">"Õ­Õ¸Õ·Õ¸Ö€Õ¡ÖÕ¶Õ¥Õ¬ ÖÕ¸Ö‚ÖÕ¡Õ¤Ö€Õ«Õ¹Õ¨"</string>
+ <string name="permdesc_magnify_display" msgid="7121235684515003792">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ­Õ¸Õ·Õ¸Ö€Õ¡ÖÕ¶Õ¥Õ¬ ÖÕ¸Ö‚ÖÕ¡Õ¤Ö€Õ«Õ¹Õ« Õ¢Õ¸Õ¾Õ¡Õ¶Õ¤Õ¡Õ¯Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨: ÕŽÕ¶Õ¡Õ½Õ¡Ö€Õ¡Ö€ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ¨ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Õ¶ ÖƒÕ¸Õ­Õ¡Õ¯Õ¥Ö€ÕºÕ¥Õ¬ ÖÕ¸Ö‚ÖÕ¡Õ¤Ö€Õ«Õ¹Õ« Õ¢Õ¸Õ¾Õ¡Õ¶Õ¤Õ¡Õ¯Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Õ¡ÕµÕ¶ÕºÕ¥Õ½, Õ¸Ö€ Õ½Õ¡Ö€Ö„Õ¨ Õ¤Õ¡Õ¼Õ¶Õ¡ Õ¡Õ¶ÕºÕ«Õ¿Õ¡Õ¶:"</string>
+ <string name="permlab_shutdown" msgid="7185747824038909016">"Õ´Õ¡Õ½Õ¶Õ¡Õ¯Õ« Õ¡Õ¶Õ»Õ¡Õ¿Õ¸Ö‚Õ´"</string>
+ <string name="permdesc_shutdown" msgid="7046500838746291775">"Ô´Õ¶Õ¸Ö‚Õ´ Õ§ Õ£Õ¸Ö€Õ®Õ¸Ö‚Õ¶Õ¥Õ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ¯Õ¡Õ¼Õ¡Õ¾Õ¡Ö€Õ¹Õ«Õ¶ Õ¡Õ¶Õ»Õ¡Õ¿Õ´Õ¡Õ¶ Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ«Õ³Õ¡Õ¯Õ« Õ´Õ¥Õ»: Õ‰Õ« Õ«Ö€Õ¡Õ¯Õ¡Õ¶Õ¡ÖÕ¶Õ¸Ö‚Õ´ Õ¡Õ´Õ¢Õ¸Õ²Õ»Õ¡Õ¯Õ¡Õ¶ Õ¡Õ¶Õ»Õ¡Õ¿Õ¸Ö‚Õ´:"</string>
+ <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"Õ¯Õ¡Õ¶Õ­Õ¥Õ¬ Õ®Ö€Õ¡Õ£Ö€Õ« ÖƒÕ¸Õ­Õ¡Ö€Õ¯Õ¸Ö‚Õ´Õ¶Õ¥Ö€Õ¨"</string>
+ <string name="permdesc_stopAppSwitches" msgid="8262195802582255021">"Ô¿Õ¡Õ¶Õ­Õ¸Ö‚Õ´ Õ§ Ö…Õ£Õ¿Õ¾Õ¸Õ²Õ« Õ¡Õ¶ÖÕ¸Ö‚Õ´Õ¨ Õ¡ÕµÕ¬ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«:"</string>
+ <string name="permlab_getTopActivityInfo" msgid="2537922311411546016">"Õ½Õ¿Õ¡Õ¶Õ¡Õ¬ Õ¨Õ¶Õ©Õ¡ÖÕ«Õ¯ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ« Õ´Õ¡Õ½Õ«Õ¶ Õ¿Õ¥Õ²Õ¥Õ¯Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€"</string>
+ <string name="permdesc_getTopActivityInfo" msgid="8153651434145132505">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ½Õ¥ÖƒÕ¡Õ¯Õ¡Õ¶Õ¡Õ¿Õ«Ö€Õ¸Õ»Õ¨ Õ¡Õ¼Õ¢Õ¥Ö€Õ¥Õ¬ Õ£Õ¡Õ²Õ¿Õ¶Õ« Õ¿Õ¥Õ²Õ¥Õ¯Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€ Õ¨Õ¶Õ©Õ¡ÖÕ«Õ¯ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ« Ö‡ Õ®Õ¡Õ¼Õ¡ÕµÕ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ« Õ´Õ¡Õ½Õ«Õ¶ Õ§Õ¯Ö€Õ¡Õ¶Õ« Õ¡Õ¼Õ¡Õ»Õ«Õ¶ ÕºÕ¬Õ¡Õ¶Õ¸Ö‚Õ´:"</string>
+ <string name="permlab_runSetActivityWatcher" msgid="892239094867182656">"Õ¾Õ¥Ö€Õ¡Õ°Õ½Õ¯Õ¥Õ¬ Ö‡ Õ¯Õ¡Õ¼Õ¡Õ¾Õ¡Ö€Õ¥Õ¬ Õ¢Õ¸Õ¬Õ¸Ö€ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ« Õ©Õ¸Õ²Õ¡Ö€Õ¯Õ¸Ö‚Õ´Õ¨"</string>
+ <string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ°Õ¥Õ¿Ö‡Õ¥Õ¬ Ö‡ Õ¾Õ¥Ö€Õ¡Õ°Õ½Õ¯Õ¥Õ¬, Õ©Õ¥ Õ«Õ¶Õ¹ÕºÕ¥Õ½ Õ§ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ¨ Õ£Õ¸Ö€Õ®Õ¡Ö€Õ¯Õ¸Ö‚Õ´ Õ£Õ¸Ö€Õ®Õ¸Õ²Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨: ÕŽÕ¶Õ¡Õ½Õ¡Ö€Õ¡Ö€ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ¨ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Õ¶ Õ¡Õ´Õ¢Õ¸Õ²Õ»Õ¸Ö‚Õ©ÕµÕ¡Õ´Õ¢ Õ¾Õ¶Õ¡Õ½Õ¥Õ¬ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ¨: Ô±ÕµÕ½ Õ©Õ¸Ö‚ÕµÕ¬Õ¿Õ¾Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Õ¡Õ¶Õ°Ö€Õ¡ÕªÕ¥Õ·Õ¿ Õ§ Õ´Õ«Õ¡ÕµÕ¶ Õ®Ö€Õ¡Õ£Ö€Õ¡Õ¾Õ¸Ö€Õ´Õ¡Õ¶ Õ°Õ¡Õ´Õ¡Ö€ Ö‡ Õ¸Õ¹ Õ¥Ö€Õ¢Õ¥Ö„ Õ½Õ¸Õ¾Õ¸Ö€Õ¡Õ¯Õ¡Õ¶ Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ´Õ¡Õ¶ Õ°Õ¡Õ´Õ¡Ö€:"</string>
+ <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"Õ¸Ö‚Õ²Õ¡Ö€Õ¯Õ¥Õ¬ Õ°Õ¥Õ¼Õ¡ÖÕ¾Õ¡Õ® ÖƒÕ¡Õ©Õ¥Õ©Õ« Õ´Õ¡Õ½Õ«Õ¶ Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¸Ö‚Õ´"</string>
+ <string name="permdesc_broadcastPackageRemoved" msgid="6621901216207931089">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¥Õ¬ Õ®Õ¡Õ¶Õ¸Ö‚ÖÕ¸Ö‚Õ´, Õ¸Ö€ Õ°Õ¥Õ¼Õ¡ÖÕ¾Õ¥Õ¬ Õ§ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ« ÖƒÕ¡Õ©Õ¥Õ©: ÕŽÕ¶Õ¡Õ½Õ¡Ö€Õ¡Ö€ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ¨ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Õ¶ Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¥Õ¬ Õ½Õ¡ ÖÕ¡Õ¶Õ¯Õ¡ÖÕ¡Õ® Õ¡ÕµÕ¬ Õ¡Õ·Õ­Õ¡Õ¿Õ¸Õ² Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ® Õ½ÕºÕ¡Õ¶Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€:"</string>
+ <string name="permlab_broadcastSmsReceived" msgid="5689095009030336593">"Õ¸Ö‚Õ²Õ¡Ö€Õ¯Õ¥Õ¬ Õ½Õ¿Õ¡ÖÕ¾Õ¡Õ® SMS-Õ« Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¸Ö‚Õ´"</string>
+ <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¥Õ¬ Õ®Õ¡Õ¶Õ¸Ö‚ÖÕ¸Ö‚Õ´, Õ¸Ö€ Õ½Õ¿Õ¡ÖÕ¾Õ¥Õ¬ Õ§ SMS Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶: ÕŽÕ¶Õ¡Õ½Õ¡Ö€Õ¡Ö€ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ¨ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Õ¶ Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¥Õ¬ Õ½Õ¡` Õ¯Õ¥Õ²Õ®Õ¥Õ¬Õ¸Ö‚ Õ´Õ¸Ö‚Õ¿Ö„Õ¡ÕµÕ«Õ¶ SMS Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨:"</string>
+ <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"Õ¸Ö‚Õ²Õ¡Ö€Õ¯Õ¥Õ¬ Õ½Õ¿Õ¡ÖÕ¾Õ¡Õ® WAP-PUSH-Õ« Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¸Ö‚Õ´"</string>
+ <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¥Õ¬ Õ®Õ¡Õ¶Õ¸Ö‚ÖÕ¸Ö‚Õ´, Õ¸Ö€ Õ½Õ¿Õ¡ÖÕ¾Õ¥Õ¬ Õ§ WAP PUSH Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶: ÕŽÕ¶Õ¡Õ½Õ¡Ö€Õ¡Ö€ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ¨ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Õ¶ Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¥Õ¬ Õ½Õ¡` Õ¯Õ¥Õ²Õ®Õ¥Õ¬Õ¸Ö‚ MMS Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ½Õ¿Õ¡ÖÕ¸Ö‚Õ´Õ¨ Õ¯Õ¡Õ´ Õ¡Õ¶Õ¶Õ¯Õ¡Õ¿ ÖƒÕ¸Õ­Õ¡Ö€Õ«Õ¶Õ¥Õ¬Õ¸Ö‚ ÖÕ¡Õ¶Õ¯Õ¡ÖÕ¡Õ® Õ¯Õ¡ÕµÖ„Õ« Õ¢Õ¸Õ¾Õ¡Õ¶Õ¤Õ¡Õ¯Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Õ¾Õ¶Õ¡Õ½Õ¡Ö€Õ¡Ö€ Õ¿Õ¡Ö€Õ¢Õ¥Ö€Õ¡Õ¯Õ¶Õ¥Ö€Õ¸Õ¾:"</string>
+ <string name="permlab_setProcessLimit" msgid="2451873664363662666">"Õ½Õ¡Õ°Õ´Õ¡Õ¶Õ¡ÖƒÕ¡Õ¯Õ¥Õ¬ Õ¡Õ·Õ­Õ¡Õ¿Õ¸Õ² Õ£Õ¸Ö€Õ®Õ¨Õ¶Õ©Õ¡ÖÕ¶Õ¥Ö€Õ« Õ©Õ«Õ¾Õ¨"</string>
+ <string name="permdesc_setProcessLimit" msgid="7318061314040879542">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¾Õ¥Ö€Õ¡Õ°Õ½Õ¯Õ¥Õ¬ Õ£Õ¸Ö€Õ®Õ¨Õ¶Õ©Õ¡ÖÕ¶Õ¥Ö€Õ« Õ¡Õ¼Õ¡Õ¾Õ¥Õ¬Õ¡Õ£Õ¸Ö‚ÕµÕ¶ Õ©Õ«Õ¾Õ¨, Õ¸Ö€ Õ¡Õ·Õ­Õ¡Õ¿Õ¥Õ¬Õ¸Ö‚ Õ¥Õ¶: ÔµÖ€Õ¢Ö‡Õ§ Õ¡Õ¶Õ°Ö€Õ¡ÕªÕ¥Õ·Õ¿ Õ¹Õ§ Õ½Õ¸Õ¾Õ¸Ö€Õ¡Õ¯Õ¡Õ¶ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ« Õ°Õ¡Õ´Õ¡Ö€:"</string>
+ <string name="permlab_setAlwaysFinish" msgid="550958507798796965">"Õ½Õ¿Õ«ÕºÕ¥Õ¬, Õ¸Ö€ Õ¡Õ¼Õ¡Õ»Õ«Õ¶ ÕºÕ¬Õ¡Õ¶Õ« Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ¨ ÖƒÕ¡Õ¯Õ¾Õ¥Õ¶"</string>
+ <string name="permdesc_setAlwaysFinish" msgid="7471310652868841499">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¾Õ¥Ö€Õ¡Õ°Õ½Õ¯Õ¥Õ¬ Õ¡Ö€Õ¤ÕµÕ¸Ö„ Õ£Õ¸Ö€Õ®Õ¸Õ²Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨ Õ´Õ«Õ·Õ¿ Õ¡Õ¾Õ¡Ö€Õ¿Õ¾Õ¡Õ® Õ¥Õ¶, Õ¥Ö€Õ¢ Õ£Õ¶Õ¸Ö‚Õ´ Õ¥Õ¶ Õ°Õ¥Õ¿Õ«Õ¶ ÕºÕ¬Õ¡Õ¶: ÔµÖ€Õ¢Ö‡Õ§ Õ¡Õ¶Õ°Ö€Õ¡ÕªÕ¥Õ·Õ¿ Õ¹Õ§ Õ½Õ¸Õ¾Õ¸Ö€Õ¡Õ¯Õ¡Õ¶ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ« Õ°Õ¡Õ´Õ¡Ö€:"</string>
+ <string name="permlab_batteryStats" msgid="2789610673514103364">"Õ¯Õ¡Ö€Õ¤Õ¡Õ¬ Õ´Õ¡Ö€Õ¿Õ¯Õ¸ÖÕ« Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ«Õ³Õ¡Õ¯Õ¨"</string>
+ <string name="permdesc_batteryStats" msgid="5897346582882915114">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¯Õ¡Ö€Õ¤Õ¡Õ¬ Õ¨Õ¶Õ©Õ¡ÖÕ«Õ¯ ÖÕ¡Õ®Ö€ Õ´Õ¡Õ¯Õ¡Ö€Õ¤Õ¡Õ¯Õ« Õ´Õ¡Ö€Õ¿Õ¯Õ¸ÖÕ« Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ´Õ¡Õ¶ Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨: Ô¿Õ¡Ö€Õ¸Õ² Õ§ Õ©Õ¸Ö‚ÕµÕ¬ Õ¿Õ¡Õ¬ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ ÕºÕ¡Ö€Õ¦Õ¥Õ¬ Õ´Õ¡Õ¶Ö€Õ¡Õ´Õ¡Õ½Õ¶ Õ¿Õ¥Õ²Õ¥Õ¯Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€, Õ©Õ¥ Õ¸Ö€ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ¶ Õ¥Ö„ Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¸Ö‚Õ´:"</string>
+ <string name="permlab_updateBatteryStats" msgid="3719689764536379557">"ÖƒÕ¸ÖƒÕ¸Õ­Õ¥Õ¬ Õ´Õ¡Ö€Õ¿Õ¯Õ¸ÖÕ« Õ¾Õ«Õ³Õ¡Õ¯Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨"</string>
+ <string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ ÖƒÕ¸ÖƒÕ¸Õ­Õ¥Õ¬ Õ´Õ¡Ö€Õ¿Õ¯Õ¸ÖÕ« Õ°Õ¡Õ¾Õ¡Ö„Õ¡Õ£Ö€Õ¾Õ¡Õ® Õ¾Õ«Õ³Õ¡Õ¯Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨: ÕÕ¸Õ¾Õ¸Ö€Õ¡Õ¯Õ¡Õ¶ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ« Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ´Õ¡Õ¶ Õ°Õ¡Õ´Õ¡Ö€ Õ¹Õ§:"</string>
+ <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"Õ¡Õ¼Õ¢Õ¥Ö€Õ¥Õ¬ Õ®Ö€Õ¡Õ£Ö€Õ« ops Õ¾Õ«Õ³Õ¡Õ¯Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨"</string>
+ <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¡Õ¼Õ¢Õ¥Ö€Õ¥Õ¬ հավելվածի հավաքագրված Õ£Õ¸Ö€Õ®Õ¸Õ²Õ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ«Õ³Õ¡Õ¯Õ¨: ÕÕ¸Õ¾Õ¸Ö€Õ¡Õ¯Õ¡Õ¶ հավելվածների օգտագործման Õ°Õ¡Õ´Õ¡Ö€ Õ¹Õ§:"</string>
+ <string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"ÖƒÕ¸ÖƒÕ¸Õ­Õ¥Õ¬ Õ®Ö€Õ¡Õ£Ö€Õ« Õ£Õ¸Ö€Õ®Õ¸Õ²Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ« Õ¾Õ«Õ³Õ¡Õ¯Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨"</string>
+ <string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ ÖƒÕ¸ÖƒÕ¸Õ­Õ¥Õ¬ Õ£Õ¸Ö€Õ®Õ¸Õ²Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ« Õ°Õ¡Õ¾Õ¡Ö„Õ¡Õ£Ö€Õ¾Õ¡Õ® Õ¾Õ«Õ³Õ¡Õ¯Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨: ÕÕ¸Õ¾Õ¸Ö€Õ¡Õ¯Õ¡Õ¶ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ« Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ´Õ¡Õ¶ Õ°Õ¡Õ´Õ¡Ö€ Õ¹Õ§:"</string>
+ <string name="permlab_backup" msgid="470013022865453920">"Õ°Õ½Õ¯Õ¥Õ¬ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ« ÕºÕ¡Õ°Õ¸Ö‚Õ½Õ¿Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´Õ¨ Ö‡ Õ¾Õ¥Ö€Õ¡Õ¯Õ¡Õ¶Õ£Õ¶Õ¸Ö‚Õ´Õ¨"</string>
+ <string name="permdesc_backup" msgid="6912230525140589891">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¾Õ¥Ö€Õ¡Õ°Õ½Õ¯Õ¥Õ¬ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ« ÕºÕ¡Õ°Õ¸Ö‚Õ½Õ¿Õ¡Õ¾Õ¸Ö€Õ´Õ¡Õ¶ Ö‡ Õ¾Õ¥Ö€Õ¡Õ¯Õ¡Õ¶Õ£Õ¶Õ´Õ¡Õ¶ Õ´Õ¥Õ­Õ¡Õ¶Õ«Õ¦Õ´Õ¨: ÕÕ¸Õ¾Õ¸Ö€Õ¡Õ¯Õ¡Õ¶ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ« Õ¯Õ¸Õ²Õ´Õ«Ö Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ´Õ¡Õ¶ Õ°Õ¡Õ´Õ¡Ö€ Õ¹Õ§:"</string>
+ <string name="permlab_confirm_full_backup" msgid="5557071325804469102">"Õ°Õ¡Õ½Õ¿Õ¡Õ¿Õ¥Õ¬ Õ¡Õ´Õ¢Õ¸Õ²Õ»Õ¡Õ¯Õ¡Õ¶ ÕºÕ¡Õ°Õ¸Ö‚Õ½Õ¿Õ¡Õ¾Õ¸Ö€Õ´Õ¡Õ¶ Õ¯Õ¡Õ´ Õ¾Õ¥Ö€Õ¡Õ¯Õ¡Õ¶Õ£Õ¶Õ´Õ¡Õ¶ Õ£Õ¸Ö€Õ®Õ¸Õ²Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨"</string>
+ <string name="permdesc_confirm_full_backup" msgid="1748762171637699562">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ£Õ¸Ö€Õ®Õ¡Ö€Õ¯Õ¥Õ¬ ամբողջական պահուստավորման հաստատման UI-Õ¨: ÕˆÖ€Ö‡Õ§ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ« Õ¯Õ¸Õ²Õ´Õ«Ö Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ´Õ¡Õ¶ Õ°Õ¡Õ´Õ¡Ö€ Õ¹Õ§:"</string>
+ <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"ÖÕ¸Ö‚ÖÕ¡Õ¤Ö€Õ¥Õ¬ Õ¹Õ¡Ö€Õ¿Õ¸Õ¶Õ¾Õ¡Õ® ÕºÕ¡Õ¿Õ¸Ö‚Õ°Õ¡Õ¶Õ¶Õ¥Ö€Õ¨"</string>
+ <string name="permdesc_internalSystemWindow" msgid="7458387759461466397">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ½Õ¿Õ¥Õ²Õ®Õ¥Õ¬ ÕºÕ¡Õ¿Õ¸Ö‚Õ°Õ¡Õ¶Õ¶Õ¥Ö€, Õ¸Ö€Õ¸Õ¶Ö„ Õ¶Õ¡Õ­Õ¡Õ¿Õ¥Õ½Õ¾Õ¡Õ® Õ¥Õ¶ Õ¶Õ¥Ö€Ö„Õ«Õ¶ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ« Ö…Õ£Õ¿Õ¾Õ¸Õ²Õ« Õ«Õ¶Õ¿Õ¥Ö€Ö†Õ¥ÕµÕ½Õ« Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ´Õ¡Õ¶ Õ°Õ¡Õ´Õ¡Ö€: ÕÕ¸Õ¾Õ¸Ö€Õ¡Õ¯Õ¡Õ¶ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ« Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ´Õ¡Õ¶ Õ°Õ¡Õ´Õ¡Ö€ Õ¹Õ§:"</string>
+ <string name="permlab_systemAlertWindow" msgid="3543347980839518613">"Õ¡Õ¶ÖÕ¶Õ¥Õ¬ Õ¡ÕµÕ¬ Õ®Ö€Õ¡Õ£Ö€Õ¥Ö€Õ« Õ¾Ö€Õ¡ÕµÕ¸Õ¾"</string>
+ <string name="permdesc_systemAlertWindow" msgid="8584678381972820118">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¥Ö€Ö‡Õ¡Õ¬ Õ¡ÕµÕ¬ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ« Õ¾Õ¥Ö€Ö‡Õ¸Ö‚Õ´ Õ¯Õ¡Õ´ Ö…Õ£Õ¿Õ¾Õ¸Õ²Õ« Õ«Õ¶Õ¿Õ¥Ö€Ö†Õ¥ÕµÕ½Õ« Õ´Õ¡Õ½Õ¥Ö€Õ¸Ö‚Õ´: Ô´Ö€Õ¡Õ¶Ö„ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Õ¶ Õ­Õ¸Õ¹Õ¨Õ¶Õ¤Õ¸Õ¿Õ¥Õ¬ Õ±Õ¥Ö€ Õ«Õ¶Õ¿Õ¥Ö€Ö†Õ¥ÕµÕ½Õ« Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ´Õ¡Õ¶Õ¨ ÖÕ¡Õ¶Õ¯Õ¡ÖÕ¡Õ® Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¸Ö‚Õ´ Õ¯Õ¡Õ´ ÖƒÕ¸Õ­Õ¥Õ¬ Õ¡ÕµÕ¶, Õ«Õ¶Õ¹Õ¨ Õ¯Õ¡Ö€Õ®Õ¸Ö‚Õ´ Õ¥Ö„, Õ¸Ö€ Õ¿Õ¥Õ½Õ¶Õ¸Ö‚Õ´ Õ¥Ö„ Õ¡ÕµÕ¬ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ¸Ö‚Õ´:"</string>
+ <string name="permlab_setAnimationScale" msgid="2805103241153907174">"ÖƒÕ¸ÖƒÕ¸Õ­Õ¥Õ¬ Õ°Õ¡Õ´Õ¡Õ·Õ­Õ¡Ö€Õ°Õ¡ÕµÕ«Õ¶ Õ¡Õ¶Õ«Õ´Õ¡ÖÕ«Õ¸Õ¶ Õ¡Ö€Õ¡Õ£Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨"</string>
+ <string name="permdesc_setAnimationScale" msgid="7690063428924343571">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ ÖƒÕ¸Õ­Õ¥Õ¬ Õ°Õ¡Õ´Õ¡Õ·Õ­Õ¡Ö€Õ°Õ¡ÕµÕ«Õ¶ Õ¡Õ¶Õ«Õ´Õ¡ÖÕ«Õ¸Õ¶ Õ¡Ö€Õ¡Õ£Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ (Õ¡Õ¾Õ¥Õ¬Õ« Õ¡Ö€Õ¡Õ£ Õ¯Õ¡Õ´ Õ¤Õ¡Õ¶Õ¤Õ¡Õ² Õ¡Õ¶Õ«Õ´Õ¡ÖÕ«Õ¡Õ¶Õ¥Ö€) ÖÕ¡Õ¶Õ¯Õ¡ÖÕ¡Õ® ÕªÕ¡Õ´Õ¡Õ¶Õ¡Õ¯:"</string>
+ <string name="permlab_manageAppTokens" msgid="1286505717050121370">"Õ¯Õ¡Õ¼Õ¡Õ¾Õ¡Ö€Õ¥Õ¬ Õ®Ö€Õ¡Õ£Ö€Õ« Õ¡ÕµÕ¬Õ¡Õ¶Õ«Õ·Õ¥Ö€Õ¨"</string>
+ <string name="permdesc_manageAppTokens" msgid="8043431713014395671">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ½Õ¿Õ¥Õ²Õ®Õ¥Õ¬ Ö‡ Õ¯Õ¡Õ¼Õ¡Õ¾Õ¡Ö€Õ¥Õ¬ Õ«Ö€Õ¥Õ¶Ö Õ½Õ¥ÖƒÕ¡Õ¯Õ¡Õ¶ Õ¶Õ·Õ¡Õ¶Õ¶Õ¥Ö€Õ¨` Õ·Ö€Õ»Õ¡Õ¶ÖÕ¥Õ¬Õ¸Õ¾ Õ«Ö€Õ¥Õ¶Ö Õ½Õ¸Õ¾Õ¸Ö€Õ¡Õ¯Õ¡Õ¶ Z Õ°Õ¥Ö€Õ©Õ¡Õ¯Õ¡Õ¶Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨: ÕÕ¸Õ¾Õ¸Ö€Õ¡Õ¯Õ¡Õ¶ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ« Õ°Õ¡Õ´Õ¡Ö€ Õ¥Ö€Õ¢Ö‡Õ§ Õ¹ÕºÕ¥Õ¿Ö„ Õ§ Õ¡Õ¶Õ°Ö€Õ¡ÕªÕ¥Õ·Õ¿ Õ¬Õ«Õ¶Õ«:"</string>
+ <string name="permlab_freezeScreen" msgid="4708181184441880175">"Õ½Õ¡Õ¼Õ¥ÖÕ¶Õ¥Õ¬ Õ§Õ¯Ö€Õ¡Õ¶Õ¨"</string>
+ <string name="permdesc_freezeScreen" msgid="8558923789222670064">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ ÕªÕ¡Õ´Õ¡Õ¶Õ¡Õ¯Õ¡Õ¾Õ¸Ö€Õ¡ÕºÕ¥Õ½ Õ½Õ¡Õ¼Õ¥ÖÕ¶Õ¥Õ¬ Õ§Õ¯Ö€Õ¡Õ¶Õ¨` Õ¬Ö€Õ«Õ¾ Õ§Õ¯Ö€Õ¡Õ¶Õ«Õ¶ Õ¡Õ¶ÖÕ¶Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€:"</string>
+ <string name="permlab_injectEvents" msgid="1378746584023586600">"Õ½Õ¥Õ²Õ´Õ¥Õ¬ Õ½Õ¿Õ¥Õ²Õ¶Õ¥Ö€Õ¨ Ö‡ Õ¯Õ¡Õ¼Õ¡Õ¾Õ¡Ö€Õ´Õ¡Õ¶ Õ¯Õ¸Õ³Õ¡Õ¯Õ¶Õ¥Ö€Õ¨"</string>
+ <string name="permdesc_injectEvents" product="tablet" msgid="206352565599968632">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¿Ö€Õ¡Õ´Õ¡Õ¤Ö€Õ¥Õ¬ Õ«Ö€ Õ½Õ¥ÖƒÕ¡Õ¯Õ¡Õ¶ Õ´Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ¾Õ¡Õ® Õ«Ö€Õ¡Õ¤Õ¡Ö€Õ±Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¶ (Õ½Õ¿Õ¥Õ²Õ¶Õ¥Ö€Õ« Õ½Õ¥Õ²Õ´Õ¸Ö‚Õ´Õ¶Õ¥Ö€ Ö‡ Õ¡ÕµÕ¬Õ¶) Õ¡ÕµÕ¬ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ«Õ¶: ÕŽÕ¶Õ¡Õ½Õ¡Ö€Õ¡Ö€ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ¨ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Õ¶ Õ½Õ¡ Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¥Õ¬ Õ£Ö€Õ¡Õ½Õ¡Õ¬Õ«Õ¯Õ« Õ¡Õ·Õ­Õ¡Õ¿Õ¡Õ¶Ö„Õ«Õ¶ Õ´Õ«Õ»Õ¡Õ´Õ¿Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€:"</string>
+ <string name="permdesc_injectEvents" product="default" msgid="653128057572326253">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¡Õ¼Õ¡Ö„Õ¥Õ¬ Õ«Ö€ Õ½Õ¥ÖƒÕ¡Õ¯Õ¡Õ¶ Õ¶Õ¥Ö€Õ¡Õ®Õ´Õ¡Õ¶ Õ«Ö€Õ¡Õ¤Õ¡Ö€Õ±Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨ (Õ½Õ¿Õ¥Õ²Õ¶Õ« Õ½Õ¥Õ²Õ´Õ¸Ö‚Õ´Õ¶Õ¥Ö€ Ö‡ Õ¡ÕµÕ¬Õ¶) Õ¡ÕµÕ¬ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ«Õ¶: ÕŽÕ¶Õ¡Õ½Õ¡Ö€Õ¡Ö€ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ¨ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Õ¶ Õ½Õ¡ Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¥Õ¬ Õ£Ö€Õ¡Õ½Õ¡Õ¬Õ«Õ¯Õ¨ Õ¾Õ¶Õ¡Õ½Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€:"</string>
+ <string name="permlab_readInputState" msgid="469428900041249234">"Õ£Ö€Õ¡Õ¼Õ¥Õ¬ Õ±Õ¥Ö€ Õ´Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ¸Ö‚Õ´Õ¶Õ¥Ö€Õ¨ Ö‡ Õ£Õ¸Ö€Õ®Õ¸Õ²Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨"</string>
+ <string name="permdesc_readInputState" msgid="8387754901688728043">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¿Õ¥Õ½Õ¶Õ¥Õ¬ Õ±Õ¥Ö€ Õ½Õ¥Õ²Õ´Õ¡Õ® Õ½Õ¿Õ¥Õ²Õ¶Õ¥Ö€Õ¨, Õ¶Õ¸Ö‚ÕµÕ¶Õ«Õ½Õ¯ Õ¡ÕµÕ¶ ÕªÕ¡Õ´Õ¡Õ¶Õ¡Õ¯, Õ¥Ö€Õ¢ ÖƒÕ¸Õ­Õ£Õ¸Ö€Õ®Õ¡Õ¯ÖÕ¸Ö‚Õ´ Õ¥Ö„ Õ¡ÕµÕ¬ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ« Õ°Õ¥Õ¿ (Ö…Ö€Õ«Õ¶Õ¡Õ¯` գաղտնաբառի Õ´Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ¸Ö‚Õ´Õ¨): ÔµÖ€Õ¢Õ¥Ö„ Õ¡Õ¶Õ°Ö€Õ¡ÕªÕ¥Õ·Õ¿ Õ¹ÕºÕ¥Õ¿Ö„ Õ§ Õ¬Õ«Õ¶Õ« Õ½Õ¸Õ¾Õ¸Ö€Õ¡Õ¯Õ¡Õ¶ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ« Õ°Õ¡Õ´Õ¡Ö€:"</string>
+ <string name="permlab_bindInputMethod" msgid="3360064620230515776">"Õ´Õ«Õ¡Õ¶Õ¡Õ¬ Õ´Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ´Õ¡Õ¶ Õ¥Õ²Õ¡Õ¶Õ¡Õ¯Õ«Õ¶"</string>
+ <string name="permdesc_bindInputMethod" msgid="3250440322807286331">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ½Õ¥ÖƒÕ¡Õ¯Õ¡Õ¶Õ¡Õ¿Õ«Ö€Õ¸Õ»Õ¨ Õ´Õ«Õ¡Õ¶Õ¡Õ¬ Õ´Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ´Õ¡Õ¶ Õ¥Õ²Õ¡Õ¶Õ¡Õ¯Õ« Õ¾Õ¥Ö€Õ«Õ¶ Õ´Õ¡Õ¯Õ¡Ö€Õ¤Õ¡Õ¯Õ« Õ«Õ¶Õ¿Õ¥Ö€Ö†Õ¥ÕµÕ½Õ«Õ¶: ÕÕ¸Õ¾Õ¸Ö€Õ¡Õ¯Õ¡Õ¶ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ« Õ°Õ¡Õ´Õ¡Ö€ Õ¥Ö€Õ¢Ö‡Õ§ Õ¹ÕºÕ¥Õ¿Ö„ Õ§ Õ¡Õ¶Õ°Ö€Õ¡ÕªÕ¥Õ·Õ¿ Õ¬Õ«Õ¶Õ«:"</string>
+ <string name="permlab_bindAccessibilityService" msgid="5357733942556031593">"Õ¯Õ¡ÕºÕ¾Õ¥Õ¬ Õ´Õ¡Õ¿Õ¹Õ¥Õ¬Õ«Õ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ®Õ¡Õ¼Õ¡ÕµÕ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ°Õ¥Õ¿"</string>
+ <string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ½Õ¥ÖƒÕ¡Õ¯Õ¡Õ¶Õ¡Õ¿Õ«Ö€Õ¸Õ»Õ¨ Õ´Õ«Õ¡Õ¶Õ¡Õ¬ Õ°Õ¡Õ½Õ¡Õ¶Õ¥Õ¬Õ«Õ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ®Õ¡Õ¼Õ¡ÕµÕ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ¾Õ¥Ö€Õ«Õ¶ Õ´Õ¡Õ¯Õ¡Ö€Õ¤Õ¡Õ¯Õ« Õ«Õ¶Õ¿Õ¥Ö€Ö†Õ¥ÕµÕ½Õ«Õ¶: ÕÕ¸Õ¾Õ¸Ö€Õ¡Õ¯Õ¡Õ¶ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ« Õ°Õ¡Õ´Õ¡Ö€ Õ¥Ö€Õ¢Ö‡Õ§ Õ¹ÕºÕ¥Õ¿Ö„ Õ§ Õ¡Õ¶Õ°Ö€Õ¡ÕªÕ¥Õ·Õ¿ Õ¬Õ«Õ¶Õ«:"</string>
+ <string name="permlab_bindPrintService" msgid="8462815179572748761">"Õ´Õ«Õ¡Õ¶Õ¡Õ¬ Õ¿ÕºÕ´Õ¡Õ¶ Õ®Õ¡Õ¼Õ¡ÕµÕ¸Ö‚Õ©ÕµÕ¡Õ¶Õ¨"</string>
+ <string name="permdesc_bindPrintService" msgid="7960067623209111135">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ½Õ¥ÖƒÕ¡Õ¯Õ¡Õ¶Õ¡Õ¿Õ«Ö€Õ¸Õ»Õ¨ Õ´Õ«Õ¡Õ¶Õ¡Õ¬ Õ¿ÕºÕ´Õ¡Õ¶ Õ®Õ¡Õ¼Õ¡ÕµÕ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ¾Õ¥Ö€Õ«Õ¶ Õ´Õ¡Õ¯Õ¡Ö€Õ¤Õ¡Õ¯Õ« Õ«Õ¶Õ¿Õ¥Ö€Ö†Õ¥ÕµÕ½Õ«Õ¶: ÕÕ¸Õ¾Õ¸Ö€Õ¡Õ¯Õ¡Õ¶ Õ®Ö€Õ¡Õ£Ö€Õ¥Ö€Õ« Õ°Õ¡Õ´Õ¡Ö€ Õ¥Ö€Õ¢Ö‡Õ§ Õ¹ÕºÕ¥Õ¿Ö„ Õ§ Õ¡Õ¶Õ°Ö€Õ¡ÕªÕ¥Õ·Õ¿ Õ¬Õ«Õ¶Õ«:"</string>
+ <string name="permlab_accessAllPrintJobs" msgid="1120792468465711159">"Õ´Õ¸Ö‚Õ¿Ö„Õ« Õ£Õ¸Ö€Õ®Õ¥Õ¬ Õ¢Õ¸Õ¬Õ¸Ö€ Õ¿ÕºÕ´Õ¡Õ¶ Õ¡Õ·Õ­Õ¡Õ¿Õ¡Õ¶Ö„Õ¶Õ¥Ö€"</string>
+ <string name="permdesc_accessAllPrintJobs" msgid="2978185311041864762">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ½Õ¥ÖƒÕ¡Õ¯Õ¡Õ¶Õ¡Õ¿Õ«Ö€Õ¸Õ»Õ¨ Õ´Õ¸Ö‚Õ¿Ö„ Õ¸Ö‚Õ¶Õ¥Õ¶Õ¡Õ¬ Õ´Õ¥Õ¯ Õ¡ÕµÕ¬ Õ®Ö€Õ¡Õ£Ö€Õ« Õ¯Õ¸Õ²Õ´Õ«Ö Õ½Õ¿Õ¥Õ²Õ®Õ¾Õ¡Õ® Õ¿ÕºÕ´Õ¡Õ¶ Õ¡Õ·Õ­Õ¡Õ¿Õ¡Õ¶Ö„Õ¶Õ¥Ö€: ÕÕ¸Õ¾Õ¸Ö€Õ¡Õ¯Õ¡Õ¶ Õ®Ö€Õ¡Õ£Ö€Õ¥Ö€Õ« Õ°Õ¡Õ´Õ¡Ö€ Õ¥Ö€Õ¢Ö‡Õ§ Õ¹ÕºÕ¥Õ¿Ö„ Õ§ Õ¡Õ¶Õ°Ö€Õ¡ÕªÕ¥Õ·Õ¿ Õ¬Õ«Õ¶Õ«:"</string>
+ <string name="permlab_bindNfcService" msgid="2752731300419410724">"Õ¯Õ¡ÕºÕ¾Õ¥Õ¬ NFC Õ®Õ¡Õ¼Õ¡ÕµÕ¸Ö‚Õ©ÕµÕ¡Õ¶Õ¨"</string>
+ <string name="permdesc_bindNfcService" msgid="6120647629174066862">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ¿Õ«Ö€Õ¸Õ»Õ¨ Õ¯Õ¡ÕºÕ¾Õ¥Õ¬ Õ®Ö€Õ¡Õ£Ö€Õ¥Ö€Õ«Õ¶, Õ¸Ö€Õ¸Õ¶Ö„ Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¸Ö‚Õ´ Õ¥Õ¶ NFC Ö„Õ¡Ö€Õ¿Õ¥Ö€: ÕÕ¸Õ¾Õ¸Ö€Õ¡Õ¯Õ¡Õ¶ Õ®Ö€Õ¡Õ£Ö€Õ¥Ö€Õ« Õ°Õ¡Õ´Õ¡Ö€ Õ¥Ö€Õ¢Õ¥Ö„ Õ¡Õ¶Õ°Ö€Õ¡ÕªÕ¥Õ·Õ¿ Õ¹Õ§:"</string>
+ <string name="permlab_bindTextService" msgid="7358378401915287938">"Õ´Õ«Õ¡Õ¶Õ¡Õ¬ Õ¿Õ¥Ö„Õ½Õ¿Õ¡ÕµÕ«Õ¶ Õ®Õ¡Õ¼Õ¡ÕµÕ¸Ö‚Õ©ÕµÕ¡Õ¶Õ¨"</string>
+ <string name="permdesc_bindTextService" msgid="8151968910973998670">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ½Õ¥ÖƒÕ¡Õ¯Õ¡Õ¶Õ¡Õ¿Õ«Ö€Õ¸Õ»Õ¨ Õ¯Õ¡ÕºÕ¾Õ¥Õ¬ Õ¿Õ¥Ö„Õ½Õ¿Õ¡ÕµÕ«Õ¶ Õ®Õ¡Õ¼Õ¡ÕµÕ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ¢Õ¡Ö€Õ±Ö€ Õ´Õ¡Õ¯Õ¡Ö€Õ¤Õ¡Õ¯Õ« Õ«Õ¶Õ¿Õ¥Ö€Ö†Õ¥ÕµÕ½Õ«Õ¶ (Ö…Ö€Õ«Õ¶Õ¡Õ¯` ÕˆÖ‚Õ²Õ²Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ½Õ¿Õ¸Ö‚Õ£Õ´Õ¡Õ¶ Õ®Õ¡Õ¼Õ¡ÕµÕ¸Ö‚Õ©ÕµÕ¡Õ¶Õ¨): ÕÕ¸Õ¾Õ¸Ö€Õ¡Õ¯Õ¡Õ¶ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ« Õ°Õ¡Õ´Õ¡Ö€ Õ¥Ö€Õ¢Ö‡Õ§ Õ¹ÕºÕ¥Õ¿Ö„ Õ§ Õ¡Õ¶Õ°Ö€Õ¡ÕªÕ¥Õ·Õ¿ Õ¬Õ«Õ¶Õ«:"</string>
+ <string name="permlab_bindVpnService" msgid="4708596021161473255">"Õ¯Õ¡ÕºÕ¾Õ¥Õ¬ VPN Õ®Õ¡Õ¼Õ¡ÕµÕ¸Ö‚Õ©ÕµÕ¡Õ¶Õ¨"</string>
+ <string name="permdesc_bindVpnService" msgid="2067845564581693905">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ½Õ¥ÖƒÕ¡Õ¯Õ¡Õ¶Õ¡Õ¿Õ«Ö€Õ¸Õ»Õ¨ Õ´Õ«Õ¡Õ¶Õ¡Õ¬ Vpn Õ®Õ¡Õ¼Õ¡ÕµÕ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ¾Õ¥Ö€Õ«Õ¶ Õ´Õ¡Õ¯Õ¡Ö€Õ¤Õ¡Õ¯Õ« Õ«Õ¶Õ¿Õ¥Ö€Ö†Õ¥ÕµÕ½Õ«Õ¶: ÕÕ¸Õ¾Õ¸Ö€Õ¡Õ¯Õ¡Õ¶ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ« Õ°Õ¡Õ´Õ¡Ö€ Õ¥Ö€Õ¢Ö‡Õ§ Õ¹ÕºÕ¥Õ¿Ö„ Õ§ Õ¡Õ¶Õ°Ö€Õ¡ÕªÕ¥Õ·Õ¿ Õ¬Õ«Õ¶Õ«:"</string>
+ <string name="permlab_bindWallpaper" msgid="8716400279937856462">"Õ´Õ«Õ¡Õ¶Õ¡Õ¬ ÕºÕ¡Õ½Õ¿Õ¡Õ¼Õ«Õ¶"</string>
+ <string name="permdesc_bindWallpaper" msgid="7108428692595491668">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ½Õ¥ÖƒÕ¡Õ¯Õ¡Õ¶Õ¡Õ¿Õ«Ö€Õ¸Õ»Õ¨ միանալ պաստառի Õ¾Õ¥Ö€Õ«Õ¶ Õ´Õ¡Õ¯Õ¡Ö€Õ¤Õ¡Õ¯Õ« Õ«Õ¶Õ¿Õ¥Ö€Ö†Õ¥ÕµÕ½Õ«Õ¶: ÕÕ¸Õ¾Õ¸Ö€Õ¡Õ¯Õ¡Õ¶ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ« Õ°Õ¡Õ´Õ¡Ö€ երբևէ չպետք Õ§ Õ¡Õ¶Õ°Ö€Õ¡ÕªÕ¥Õ·Õ¿ Õ¬Õ«Õ¶Õ«:"</string>
+ <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"Õ´Õ«Õ¡Õ¶Õ¡Õ¬ Õ¾Õ«Õ»Õ¥Õ© Õ®Õ¡Õ¼Õ¡ÕµÕ¸Ö‚Õ©ÕµÕ¡Õ¶Õ¨"</string>
+ <string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ½Õ¥ÖƒÕ¡Õ¯Õ¡Õ¶Õ¡Õ¿Õ«Ö€Õ¸Õ»Õ¨ Õ´Õ«Õ¡Õ¶Õ¡Õ¬ Õ¾Õ«Õ»Õ¥Õ© Õ®Õ¡Õ¼Õ¡ÕµÕ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ¾Õ¥Ö€Õ«Õ¶ Õ´Õ¡Õ¯Õ¡Ö€Õ¤Õ¡Õ¯Õ« Õ«Õ¶Õ¿Õ¥Ö€Ö†Õ¥ÕµÕ½Õ«Õ¶: ÕÕ¸Õ¾Õ¸Ö€Õ¡Õ¯Õ¡Õ¶ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ« Õ°Õ¡Õ´Õ¡Ö€ Õ¥Ö€Õ¢Ö‡Õ§ Õ¹ÕºÕ¥Õ¿Ö„ Õ§ Õ¡Õ¶Õ°Ö€Õ¡ÕªÕ¥Õ·Õ¿ Õ¬Õ«Õ¶Õ«:"</string>
+ <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"ÖƒÕ¸Õ­Õ£Õ¸Ö€Õ®Õ¡Õ¯ÖÕ¥Õ¬ Õ½Õ¡Ö€Ö„Õ« Õ¯Õ¡Õ¼Õ¡Õ¾Õ¡Ö€Õ¹Õ« Õ°Õ¥Õ¿"</string>
+ <string name="permdesc_bindDeviceAdmin" msgid="569715419543907930">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ½Õ¥ÖƒÕ¡Õ¯Õ¡Õ¶Õ¡Õ¿Õ«Ö€Õ¸Õ»Õ¨ Õ¸Ö‚Õ²Õ¡Ö€Õ¯Õ¥Õ¬ Õ´Õ¿Õ¡Õ¤Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€ Õ½Õ¡Ö€Ö„Õ« Õ¯Õ¡Õ¼Õ¡Õ¾Õ¡Ö€Õ¹Õ«Õ¶: ÕÕ¸Õ¾Õ¸Ö€Õ¡Õ¯Õ¡Õ¶ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ« Õ°Õ¡Õ´Õ¡Ö€ Õ¥Ö€Õ¢Ö‡Õ§ Õ¹ÕºÕ¥Õ¿Ö„ Õ§ Õ¡Õ¶Õ°Ö€Õ¡ÕªÕ¥Õ·Õ¿ Õ¬Õ«Õ¶Õ«:"</string>
+ <string name="permlab_manageDeviceAdmins" msgid="4248828900045808722">"Õ¡Õ¾Õ¥Õ¬Õ¡ÖÕ¶Õ¥Õ¬ Õ¯Õ¡Õ´ Õ°Õ¥Õ¼Õ¡ÖÕ¶Õ¥Õ¬ Õ½Õ¡Ö€Ö„Õ« Õ¡Ö€Õ¤Õ´Õ«Õ¶Õ«Õ½Õ¿Ö€Õ¡Õ¿Õ¸Ö€"</string>
+ <string name="permdesc_manageDeviceAdmins" msgid="5025608167709942485">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ½Õ¥ÖƒÕ¡Õ¯Õ¡Õ¶Õ¡Õ¿Õ«Ö€Õ¸Õ»Õ¨ Õ¡Õ¾Õ¥Õ¬Õ¡ÖÕ¶Õ¥Õ¬ Õ¯Õ¡Õ´ Õ°Õ¥Õ¼Õ¡ÖÕ¶Õ¥Õ¬ Õ½Õ¡Ö€Ö„Õ« Õ¡Õ¯Õ¿Õ«Õ¾ Õ¡Õ¤Õ´Õ«Õ¶Õ«Õ½Õ¿Ö€Õ¡Õ¿Õ¸Ö€Õ¶Õ¥Ö€: ÔµÖ€Õ¢Õ¥Ö„ Õ¹ÕºÕ¥Õ¿Ö„ Õ§ Õ¡Õ¶Õ°Ö€Õ¡ÕªÕ¥Õ·Õ¿ Õ¬Õ«Õ¶Õ« Õ½Õ¸Õ¾Õ¸Ö€Õ¡Õ¯Õ¡Õ¶ Õ®Ö€Õ¡Õ£Ö€Õ¥Ö€Õ«Õ¶:"</string>
+ <string name="permlab_setOrientation" msgid="3365947717163866844">"ÖƒÕ¸Õ­Õ¥Õ¬ Õ§Õ¯Ö€Õ¡Õ¶Õ« Õ¤Õ«Ö€Ö„Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´Õ¨"</string>
+ <string name="permdesc_setOrientation" msgid="3046126619316671476">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ ÖƒÕ¸Õ­Õ¥Õ¬ Õ§Õ¯Ö€Õ¡Õ¶Õ« ÕºÕ¿Õ¿Õ¸Ö‚Õ´Õ¨ ÖÕ¡Õ¶Õ¯Õ¡ÖÕ¡Õ® ÕªÕ¡Õ´Õ¡Õ¶Õ¡Õ¯: ÕÕ¸Õ¾Õ¸Ö€Õ¡Õ¯Õ¡Õ¶ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ« Õ°Õ¡Õ´Õ¡Ö€ Õ¥Ö€Õ¢Ö‡Õ§ Õ¹ÕºÕ¥Õ¿Ö„ Õ§ Õ¡Õ¶Õ°Ö€Õ¡ÕªÕ¥Õ·Õ¿ Õ¬Õ«Õ¶Õ«:"</string>
+ <string name="permlab_setPointerSpeed" msgid="9175371613322562934">"ÖƒÕ¸Õ­Õ¥Õ¬ ÖÕ¸Ö‚ÖÕ¹Õ« Õ¡Ö€Õ¡Õ£Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨"</string>
+ <string name="permdesc_setPointerSpeed" msgid="6866563234274104233">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ ÖƒÕ¸Õ­Õ¥Õ¬ Õ´Õ¯Õ¶Õ«Õ¯Õ« Õ¯Õ¡Õ´ Õ°ÕºÕ¡Õ°Õ¡Ö€Õ©Õ¡Õ¯Õ« Õ½Õ¬Õ¡Ö„Õ« Õ¡Ö€Õ¡Õ£Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ ÖÕ¡Õ¶Õ¯Õ¡ÖÕ¡Õ® ÕªÕ¡Õ´Õ¡Õ¶Õ¡Õ¯: ÔµÖ€Õ¢Ö‡Õ§ Õ¡Õ¶Õ°Ö€Õ¡ÕªÕ¥Õ·Õ¿ Õ¹ÕºÕ¥Õ¿Ö„ Õ§ Õ¬Õ«Õ¶Õ« Õ½Õ¸Õ¾Õ¸Ö€Õ¡Õ¯Õ¡Õ¶ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ« Õ°Õ¡Õ´Õ¡Ö€:"</string>
+ <string name="permlab_setKeyboardLayout" msgid="4778731703600909340">"ÖƒÕ¸Õ­Õ¥Õ¬ Õ½Õ¿Õ¥Õ²Õ¶Õ¡Õ·Õ¡Ö€Õ« Õ¤Õ«Ö€Ö„Õ¨"</string>
+ <string name="permdesc_setKeyboardLayout" msgid="8480016771134175879">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ ÖƒÕ¸Õ­Õ¥Õ¬ Õ½Õ¿Õ¥Õ²Õ¶Õ¡Õ·Õ¡Ö€Õ« Õ¤Õ«Ö€Ö„Õ¨: ÕÕ¸Õ¾Õ¸Ö€Õ¡Õ¯Õ¡Õ¶ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ« Õ°Õ¡Õ´Õ¡Ö€ Õ¥Ö€Õ¢Ö‡Õ§ Õ¹ÕºÕ¥Õ¿Ö„ Õ§ Õ¡Õ¶Õ°Ö€Õ¡ÕªÕ¥Õ·Õ¿ Õ¬Õ«Õ¶Õ«:"</string>
+ <string name="permlab_signalPersistentProcesses" msgid="4539002991947376659">"Õ¸Ö‚Õ²Õ¡Ö€Õ¯Õ¥Õ¬ Linux Õ¡Õ¦Õ¤Õ¡Õ¶Õ·Õ¡Õ¶Õ¶Õ¥Ö€ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ«Õ¶"</string>
+ <string name="permdesc_signalPersistentProcesses" msgid="4896992079182649141">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ°Õ¡ÕµÖÕ¥Õ¬, Õ¸Ö€ Õ¿Ö€Õ¡Õ´Õ¡Õ¤Ö€Õ¾Õ¡Õ® Õ¡Õ¦Õ¤Õ¡Õ¶Õ·Õ¡Õ¶Õ¨ Õ¸Ö‚Õ²Õ¡Ö€Õ¯Õ¾Õ« Õ¢Õ¸Õ¬Õ¸Ö€ Õ´Õ·Õ¿Õ¡Õ¯Õ¡Õ¶ Õ£Õ¸Ö€Õ®Õ¨Õ¶Õ©Õ¡ÖÕ¶Õ¥Ö€Õ«Õ¶:"</string>
+ <string name="permlab_persistentActivity" msgid="8841113627955563938">"Õ´Õ«Õ·Õ¿ Õ¡Õ·Õ­Õ¡Õ¿Õ¥ÖÕ¶Õ¥Õ¬ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¨"</string>
+ <string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ´Õ¶Õ¡ÕµÕ¸Ö‚Õ¶ Õ¤Õ¡Ö€Õ±Õ¶Õ¥Õ¬ Õ«Ö€ Õ´Õ¡Õ½Õ¥Ö€Õ¨ Õ°Õ«Õ·Õ¸Õ²Õ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ´Õ¥Õ»: ÕÕ¡ Õ¯Õ¡Ö€Õ¸Õ² Õ§ Õ½Õ¡Õ°Õ´Õ¡Õ¶Õ¡ÖƒÕ¡Õ¯Õ¥Õ¬ Õ¡ÕµÕ¬ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ«Õ¶ Õ°Õ¡Õ½Õ¡Õ¶Õ¥Õ¬Õ« Õ°Õ«Õ·Õ¸Õ²Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨` Õ¤Õ¡Õ¶Õ¤Õ¡Õ²Õ¥ÖÕ¶Õ¥Õ¬Õ¸Õ¾ Õ£Ö€Õ¡Õ½Õ¡Õ¬Õ«Õ¯Õ« Õ¡Õ·Õ­Õ¡Õ¿Õ¡Õ¶Ö„Õ¨:"</string>
+ <string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ´Õ¶Õ¡ÕµÕ¸Ö‚Õ¶ Õ¤Õ¡Ö€Õ±Õ¶Õ¥Õ¬ Õ«Ö€ Õ´Õ¡Õ½Õ¥Ö€Õ¨ Õ°Õ«Õ·Õ¸Õ²Õ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ´Õ¥Õ»: ÕÕ¡ Õ¯Õ¡Ö€Õ¸Õ² Õ§ Õ½Õ¡Õ°Õ´Õ¡Õ¶Õ¡ÖƒÕ¡Õ¯Õ¥Õ¬ Õ¡ÕµÕ¬ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ«Õ¶ Õ°Õ¡Õ½Õ¡Õ¶Õ¥Õ¬Õ« Õ°Õ«Õ·Õ¸Õ²Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨` Õ¤Õ¡Õ¶Õ¤Õ¡Õ²Õ¥ÖÕ¶Õ¥Õ¬Õ¸Õ¾ Õ°Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ« Õ¡Õ·Õ­Õ¡Õ¿Õ¡Õ¶Ö„Õ¨:"</string>
+ <string name="permlab_deletePackages" msgid="184385129537705938">"Õ»Õ¶Õ»Õ¥Õ¬ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ¨"</string>
+ <string name="permdesc_deletePackages" msgid="7411480275167205081">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ»Õ¶Õ»Õ¥Õ¬ Android ÖƒÕ¡Õ©Õ¥Õ©Õ¶Õ¥Ö€Õ¨: ÕŽÕ¶Õ¡Õ½Õ¡Ö€Õ¡Ö€ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ¨ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Õ¶ Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¥Õ¬ Õ½Õ¡` Õ¯Õ¡Ö€Ö‡Õ¸Ö€ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ¨ Õ»Õ¶Õ»Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€:"</string>
+ <string name="permlab_clearAppUserData" msgid="274109191845842756">"Õ»Õ¶Õ»Õ¥Õ¬ Õ¡ÕµÕ¬ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ« Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨"</string>
+ <string name="permdesc_clearAppUserData" msgid="4625323684125459488">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ´Õ¡Ö„Ö€Õ¥Õ¬ Ö…Õ£Õ¿Õ¾Õ¸Õ²Õ« Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨:"</string>
+ <string name="permlab_deleteCacheFiles" msgid="3128665571837408675">"Õ»Õ¶Õ»Õ¥Õ¬ Õ¡ÕµÕ¬ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ« Ö„Õ¥Õ·Õ¥Ö€Õ¨"</string>
+ <string name="permdesc_deleteCacheFiles" msgid="3812998599006730196">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ»Õ¶Õ»Õ¥Õ¬ Ö„Õ¥Õ· Ö†Õ¡ÕµÕ¬Õ¥Ö€Õ¨:"</string>
+ <string name="permlab_getPackageSize" msgid="7472921768357981986">"Õ¹Õ¡ÖƒÕ¥Õ¬ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ« ÕºÕ¡Õ°Õ¸ÖÕ« Õ¿Õ¡Ö€Õ¡Õ®Ö„Õ¨"</string>
+ <string name="permdesc_getPackageSize" msgid="3921068154420738296">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¡Õ¼Õ¢Õ¥Ö€Õ¥Õ¬ Õ«Ö€ Õ¯Õ¸Õ¤Õ¨, Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨ Ö‡ Ö„Õ¥Õ·Õ« Õ¹Õ¡ÖƒÕ¥Ö€Õ¨"</string>
+ <string name="permlab_installPackages" msgid="2199128482820306924">"Õ¸Ö‚Õ²Õ²Õ¡Õ¯Õ«Õ¸Ö€Õ¥Õ¶ Õ¿Õ¥Õ²Õ¡Õ¤Ö€Õ¥Õ¬ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ¨"</string>
+ <string name="permdesc_installPackages" msgid="5628530972548071284">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¿Õ¥Õ²Õ¡Õ¤Ö€Õ¥Õ¬ Õ¶Õ¸Ö€ Õ¯Õ¡Õ´ Õ©Õ¡Ö€Õ´Õ¡ÖÕ¾Õ¡Õ® Android ÖƒÕ¡Õ©Õ¥Õ©Õ¶Õ¥Ö€: ÕŽÕ¶Õ¡Õ½Õ¡Ö€Õ¡Ö€ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ¨ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Õ¶ Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¥Õ¬ Õ½Õ¡` Õ¡Õ¾Õ¥Õ¬Õ¡ÖÕ¶Õ¥Õ¬Õ¸Ö‚ Õ¶Õ¸Ö€ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€` Õ¯Õ¡Õ´Õ¡ÕµÕ¡Õ¯Õ¡Õ¶Õ¸Ö€Õ¥Õ¶ Õ°Õ¦Õ¸Ö€ Õ©Õ¸Ö‚ÕµÕ¬Õ¿Õ¾Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¸Õ¾:"</string>
+ <string name="permlab_clearAppCache" msgid="7487279391723526815">"Õ»Õ¶Õ»Õ¥Õ¬ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ« Ö„Õ¥Õ·Õ« Õ¢Õ¸Õ¬Õ¸Ö€ Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨"</string>
+ <string name="permdesc_clearAppCache" product="tablet" msgid="8974640871945434565">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¡Õ¦Õ¡Õ¿Õ¥Õ¬ Õ£Ö€Õ¡Õ½Õ¡Õ¬Õ«Õ¯Õ« ÕºÕ¡Õ°Õ¸ÖÕ¨` Õ»Õ¶Õ»Õ¥Õ¬Õ¸Õ¾ Ö†Õ¡ÕµÕ¬Õ¥Ö€Õ¨ Õ¡ÕµÕ¬ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ« Ö„Õ¥Õ· Õ£Ö€Õ¡ÖÕ¸Ö‚ÖÕ¡Õ¯Õ¶Õ¥Ö€Õ¸Ö‚Õ´: ÕÕ¡ Õ¯Õ¡Ö€Õ¸Õ² Õ§ ÕºÕ¡Õ¿Õ³Õ¡Õ¼ Õ¤Õ¡Õ¼Õ¶Õ¡Õ¬, Õ¸Ö€ Õ¡ÕµÕ¬ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ¨ Õ¡Õ¾Õ¥Õ¬Õ« Õ¤Õ¡Õ¶Õ¤Õ¡Õ² Õ´Õ¥Õ¯Õ¶Õ¡Ö€Õ¯Õ¥Õ¶, Ö„Õ¡Õ¶Õ« Õ¸Ö€ Õ¤Ö€Õ¡Õ¶Ö„ ÕºÕ¥Õ¿Ö„ Õ§ Õ¶Õ¸Ö€Õ«Ö Õ¡Õ¼Õ¢Õ¥Ö€Õ¥Õ¶ Õ«Ö€Õ¥Õ¶Ö Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨:"</string>
+ <string name="permdesc_clearAppCache" product="default" msgid="2459441021956436779">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¡Õ¦Õ¡Õ¿Õ¥Õ¬ Õ°Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ« ÕºÕ¡Õ°Õ¸Ö‚Õ½Õ¿Õ¨` Õ»Õ¶Õ»Õ¥Õ¬Õ¸Õ¾ Ö†Õ¡ÕµÕ¬Õ¥Ö€Õ¨ Õ¡ÕµÕ¬ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ« Ö„Õ¥Õ· Õ£Ö€Õ¡ÖÕ¸Ö‚ÖÕ¡Õ¯Õ¶Õ¥Ö€Õ¸Ö‚Õ´: ÕÕ¡ Õ¯Õ¡Ö€Õ¸Õ² Õ§ ÕºÕ¡Õ¿Õ³Õ¡Õ¼ Õ¤Õ¡Õ¼Õ¶Õ¡Õ¬, Õ¸Ö€ Õ¡ÕµÕ¬ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ¨ Õ¡Õ¾Õ¥Õ¬Õ« Õ¤Õ¡Õ¶Õ¤Õ¡Õ² Õ´Õ¥Õ¯Õ¶Õ¡Ö€Õ¯Õ¥Õ¶, Ö„Õ¡Õ¶Õ« Õ¸Ö€ Õ¶Ö€Õ¡Õ¶Ö„ ÕºÕ¥Õ¿Ö„ Õ§ Õ¶Õ¸Ö€Õ«Ö Õ¡Õ¼Õ¢Õ¥Ö€Õ¥Õ¶ Õ«Ö€Õ¥Õ¶Ö Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨:"</string>
+ <string name="permlab_movePackage" msgid="3289890271645921411">"ÕÕ¥Õ²Õ¡ÖƒÕ¸Õ­Õ¥Õ¬ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ« Õ¼Õ¥Õ½Õ¸Ö‚Ö€Õ½Õ¶Õ¥Ö€Õ¨"</string>
+ <string name="permdesc_movePackage" msgid="319562217778244524">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¿Õ¥Õ²Õ¡ÖƒÕ¸Õ­Õ¥Õ¬ Õ®Ö€Õ¡Õ£Ö€Õ¡ÕµÕ«Õ¶ Õ¼Õ¥Õ½Õ¸Ö‚Ö€Õ½Õ¶Õ¥Ö€Õ¨ Õ¶Õ¥Ö€Ö„Õ«Õ¶ Õ´Õ¥Õ¤Õ«Õ¡Õ¶Õ¥Ö€Õ«Ö Õ¡Ö€Õ¿Õ¡Ö„Õ«Õ¶Õ«Õ¶ Ö‡ Õ°Õ¡Õ¯Õ¡Õ¼Õ¡Õ¯Õ¨:"</string>
+ <string name="permlab_readLogs" msgid="6615778543198967614">"Õ¯Õ¡Ö€Õ¤Õ¡Õ¬ Õ°Õ¸Õ½Ö„Õ« Õ¦Õ£Õ¡ÕµÕ¸Ö‚Õ¶ Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨"</string>
+ <string name="permdesc_readLogs" product="tablet" msgid="82061313293455151">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¯Õ¡Ö€Õ¤Õ¡Õ¬ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ« Õ¿Õ¡Ö€Õ¢Õ¥Ö€ Õ£Ö€Õ¡Õ¶ÖÕ¡Õ´Õ¡Õ¿ÕµÕ¡Õ¶Õ¡ÕµÕ«Õ¶ Ö†Õ¡ÕµÕ¬Õ¥Ö€Õ«Ö: ÕÕ¡ Õ©Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ½Õ¿Õ¡Õ¶Õ¡Õ¬ Õ¨Õ¶Õ¤Õ°Õ¡Õ¶Õ¸Ö‚Ö€ Õ¿Õ¥Õ²Õ¥Õ¯Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€ Õ¡ÕµÕ¶ Õ´Õ¡Õ½Õ«Õ¶, Õ©Õ¥ Õ«Õ¶Õ¹ Õ¥Ö„ Õ¡Õ¶Õ¸Ö‚Õ´ Õ£Ö€Õ¡Õ½Õ¡Õ¬Õ«Õ¯Õ¸Õ¾, Õ¡ÕµÕ¤ Õ©Õ¾Õ¸Ö‚Õ´` Õ¡Õ¶Õ±Õ¶Õ¡Õ¯Õ¡Õ¶ Õ¯Õ¡Õ´ Õ£Õ¡Õ²Õ¿Õ¶Õ« Õ¿Õ¥Õ²Õ¥Õ¯Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€:"</string>
+ <string name="permdesc_readLogs" product="default" msgid="2063438140241560443">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¯Õ¡Ö€Õ¤Õ¡Õ¬ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ« Õ¿Õ¡Ö€Õ¢Õ¥Ö€ Õ£Ö€Õ¡Õ¶ÖÕ¡Õ´Õ¡Õ¿ÕµÕ¡Õ¶Õ¡ÕµÕ«Õ¶ Ö†Õ¡ÕµÕ¬Õ¥Ö€Õ«Ö: ÕÕ¡ Õ©Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ½Õ¿Õ¡Õ¶Õ¡Õ¬ Õ¨Õ¶Õ¤Õ°Õ¡Õ¶Õ¸Ö‚Ö€ Õ¿Õ¥Õ²Õ¥Õ¯Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€ Õ¡ÕµÕ¶ Õ´Õ¡Õ½Õ«Õ¶, Õ©Õ¥ Õ«Õ¶Õ¹ Õ¥Ö„ Õ¡Õ¶Õ¸Ö‚Õ´ Õ°Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ¸Õ¾, Õ¡ÕµÕ¤ Õ©Õ¾Õ¸Ö‚Õ´` Õ¡Õ¶Õ±Õ¶Õ¡Õ¯Õ¡Õ¶ Õ¯Õ¡Õ´ Õ£Õ¡Õ²Õ¿Õ¶Õ« Õ¿Õ¥Õ²Õ¥Õ¯Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€:"</string>
+ <string name="permlab_anyCodecForPlayback" msgid="715805555823881818">"Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¥Õ¬ ÖÕ¡Õ¶Õ¯Õ¡ÖÕ¡Õ® Õ´Õ¥Õ¤Õ«Õ¡ Õ¾Õ¥Ö€Õ®Õ¡Õ¶Õ«Õ¹ Õ¶Õ¾Õ¡Õ£Õ¡Ö€Õ¯Õ´Õ¡Õ¶ Õ°Õ¡Õ´Õ¡Ö€"</string>
+ <string name="permdesc_anyCodecForPlayback" msgid="8283912488433189010">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¥Õ¬ ÖÕ¡Õ¶Õ¯Õ¡ÖÕ¡Õ® Õ¿Õ¥Õ²Õ¡Õ¤Ö€Õ¾Õ¡Õ® Õ´Õ¥Õ¤Õ«Õ¡ Õ¾Õ¥Ö€Õ®Õ¡Õ¶Õ«Õ¹` Õ¶Õ¾Õ¡Õ£Õ¡Ö€Õ¯Õ¸Ö‚Õ´Õ¨ Õ¡ÕºÕ¡Õ¯Õ¸Õ¤Õ¡Õ¾Õ¸Ö€Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€:"</string>
+ <string name="permlab_manageCaCertificates" msgid="1678391896786882014">"Õ¯Õ¡Õ¼Õ¡Õ¾Õ¡Ö€Õ¥Ö„ Õ¾Õ½Õ¿Õ¡Õ°Õ¥Õ¬Õ« Õ¾Õ¯Õ¡ÕµÕ¡Õ£Ö€Õ¥Ö€Õ¨"</string>
+ <string name="permdesc_manageCaCertificates" msgid="4015644047196937014">"Ô¹Õ¸Ö‚ÕµÕ¬Õ¡Õ¿Ö€Õ¸Ö‚Õ´ Õ§ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¿Õ¥Õ²Õ¡Õ¤Ö€Õ¥Õ¬ Ö‡ Õ¡ÕºÕ¡Õ¿Õ¥Õ²Õ¡Õ¤Ö€Õ¥Õ¬ CA Õ¾Õ¯Õ¡ÕµÕ¡Õ£Ö€Õ¥Ö€Õ¨Õ Õ¸Ö€ÕºÕ¥Õ½ Õ¾Õ½Õ¿Õ¡Õ°Õ¥Õ¬Õ«:"</string>
+ <string name="permlab_diagnostic" msgid="8076743953908000342">"կարդալ կամ գրել ախտորոշիչին պատկանող ռեսուրսները"</string>
+ <string name="permdesc_diagnostic" msgid="6608295692002452283">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¯Õ¡Ö€Õ¤Õ¡Õ¬ Ö‡ Õ£Ö€Õ¥Õ¬ Õ¡Õ­Õ¿Õ¸Ö€Õ¸Õ·Õ«Õ¹ Õ­Õ´Õ¢Õ«Õ¶ ÕºÕ¡Õ¿Õ¯Õ¡Õ¶Õ¸Õ² ÖÕ¡Õ¶Õ¯Õ¡ÖÕ¡Õ® Õ¼Õ¥Õ½Õ¸Ö‚Ö€Õ½Õ¸Ö‚Õ´, Õ«Õ¶Õ¹ÕºÕ¥Õ½ Ö…Ö€Õ«Õ¶Õ¡Õ¯ Ö†Õ¡ÕµÕ¬Õ¥Ö€Õ¨ /dev-Õ¸Ö‚Õ´: Ô´Õ¡ Õ¯Õ¡Ö€Õ¸Õ² Õ§ Õ¡Õ¦Õ¤Õ¥Õ¬ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ« Õ¯Õ¡ÕµÕ¸Ö‚Õ¶Õ¸Ö‚Õ©ÕµÕ¡Õ¶ Ö‡ Õ¡Õ¶Õ¾Õ¿Õ¡Õ¶Õ£Õ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ¾Ö€Õ¡: ÕÕ¡ ÕºÕ¥Õ¿Ö„ Õ§ Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¥Õ¬ Õ´Õ«Õ¡ÕµÕ¶ Õ¡Ö€Õ¿Õ¡Õ¤Ö€Õ¸Õ²Õ« Õ¯Õ¡Õ´ Ö…ÕºÕ¥Ö€Õ¡Õ¿Õ¸Ö€Õ« Õ¯Õ¸Õ²Õ´Õ«Ö Õ½Õ¡Ö€Ö„Õ«Õ¶ Õ°Õ¡Õ¿Õ¸Ö‚Õ¯ Õ¡Õ­Õ¿Õ¸Ö€Õ¸Õ·Õ´Õ¡Õ¶ Õ°Õ¡Õ´Õ¡Ö€:"</string>
+ <string name="permlab_changeComponentState" msgid="6335576775711095931">"Õ´Õ«Õ¡ÖÕ¶Õ¥Õ¬ Õ¯Õ¡Õ´ Õ¡Õ¶Õ»Õ¡Õ¿Õ¥Õ¬ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ« Õ¢Õ¡Õ²Õ¡Õ¤Ö€Õ«Õ¹Õ¶Õ¥Ö€Õ¨"</string>
+ <string name="permdesc_changeComponentState" product="tablet" msgid="8887435740982237294">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ ÖƒÕ¸Õ­Õ¥Õ¬, Õ¡Ö€Õ¤ÕµÕ¸Ö„ Õ¡ÕµÕ¬ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ« Õ¢Õ¡Õ²Õ¡Õ¤Ö€Õ«Õ¹Õ¨ Õ¬Õ«Õ¶Õ« Õ´Õ«Õ¡ÖÕ¾Õ¡Õ® Õ©Õ¥ Õ¡Õ¶Õ»Õ¡Õ¿Õ¾Õ¡Õ®: ÕŽÕ¶Õ¡Õ½Õ¡Ö€Õ¡Ö€ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ¨ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Õ¶ Õ½Õ¡ Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¥Õ¬` Õ¡Õ¶Õ»Õ¡Õ¿Õ¥Õ¬Õ¸Ö‚ Õ£Ö€Õ¡Õ½Õ¡Õ¬Õ«Õ¯Õ« Õ¯Õ¡Ö€Ö‡Õ¸Ö€ Õ°Õ¶Õ¡Ö€Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨: Ô±ÕµÕ½ Õ©Õ¸Ö‚ÕµÕ¬Õ¿Õ¾Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ ÕºÕ¥Õ¿Ö„ Õ§ Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¥Õ¬ Õ¦Õ£Õ¸Ö‚Õ·Õ¸Ö‚Õ©ÕµÕ¡Õ´Õ¢, Ö„Õ¡Õ¶Õ« Õ¸Ö€ Õ°Õ¶Õ¡Ö€Õ¡Õ¾Õ¸Ö€ Õ§ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ« Õ¢Õ¡Õ²Õ¡Õ¤Ö€Õ«Õ¹Õ¶Õ¥Ö€Õ¨ Õ°Õ¡ÕµÕ¿Õ¶Õ¾Õ¥Õ¶ Õ¡Õ¶ÕºÕ«Õ¿Õ¡Õ¶, Õ¡Õ¶Õ°Õ¡Õ´Õ¡ÕºÕ¡Õ¿Õ¡Õ½Õ­Õ¡Õ¶ Õ¯Õ¡Õ´ Õ¡Õ¶Õ¯Õ¡ÕµÕ¸Ö‚Õ¶ Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ«Õ³Õ¡Õ¯Õ¸Ö‚Õ´:"</string>
+ <string name="permdesc_changeComponentState" product="default" msgid="1827232484416505615">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ ÖƒÕ¸Õ­Õ¥Õ¬, Õ¡Ö€Õ¤ÕµÕ¸Ö„ Õ¡ÕµÕ¬ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ« Õ¢Õ¡Õ²Õ¡Õ¤Ö€Õ«Õ¹Õ¨ Õ¬Õ«Õ¶Õ« Õ´Õ«Õ¡ÖÕ¾Õ¡Õ® Õ©Õ¥ Õ¡Õ¶Õ»Õ¡Õ¿Õ¾Õ¡Õ®: ÕŽÕ¶Õ¡Õ½Õ¡Ö€Õ¡Ö€ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ¨ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Õ¶ Õ½Õ¡ Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¥Õ¬` Õ¡Õ¶Õ»Õ¡Õ¿Õ¥Õ¬Õ¸Ö‚ Õ°Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ« Õ¯Õ¡Ö€Ö‡Õ¸Ö€ Õ°Õ¶Õ¡Ö€Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨: Ô±ÕµÕ½ Õ©Õ¸Ö‚ÕµÕ¬Õ¿Õ¾Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ ÕºÕ¥Õ¿Ö„ Õ§ Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¥Õ¬ Õ¦Õ£Õ¸Ö‚Õ·Õ¸Ö‚Õ©ÕµÕ¡Õ´Õ¢, Ö„Õ¡Õ¶Õ« Õ¸Ö€ Õ°Õ¶Õ¡Ö€Õ¡Õ¾Õ¸Ö€ Õ§ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ« Õ¢Õ¡Õ²Õ¡Õ¤Ö€Õ«Õ¹Õ¶Õ¥Ö€Õ¨ Õ°Õ¡ÕµÕ¿Õ¶Õ¾Õ¥Õ¶ Õ¡Õ¶ÕºÕ«Õ¿Õ¡Õ¶, Õ¡Õ¶Õ°Õ¡Õ´Õ¡ÕºÕ¡Õ¿Õ¡Õ½Õ­Õ¡Õ¶ Õ¯Õ¡Õ´ Õ¡Õ¶Õ¯Õ¡ÕµÕ¸Ö‚Õ¶ Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ«Õ³Õ¡Õ¯Õ¸Ö‚Õ´:"</string>
+ <string name="permlab_grantRevokePermissions" msgid="4627315351093508795">"Õ·Õ¶Õ¸Ö€Õ°Õ¥Õ¬ Õ¯Õ¡Õ´ Õ¹Õ¥Õ²Õ¡Ö€Õ¯Õ¥Õ¬ Õ©Õ¸Ö‚ÕµÕ¬Õ¿Õ¾Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€"</string>
+ <string name="permdesc_grantRevokePermissions" msgid="4088642654085850662">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ°Õ¡Õ¿Õ¸Ö‚Õ¯ Õ©Õ¸Ö‚ÕµÕ¬Õ¿Õ¾Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶ Õ·Õ¶Õ¸Ö€Õ°Õ¥Õ¬ Õ¯Õ¡Õ´ Õ¹Õ¥Õ²Õ¡Ö€Õ¯Õ¥Õ¬ Õ¡ÕµÕ¤ Õ¯Õ¡Õ´ Õ¡ÕµÕ¬ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ« Õ°Õ¡Õ´Õ¡Ö€: ÕŽÕ¶Õ¡Õ½Õ¡Ö€Õ¡Ö€ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ¨ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Õ¶ Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¥Õ¬ Õ½Õ¡` Õ´Õ¸Ö‚Õ¿Ö„ Õ£Õ¸Ö€Õ®Õ¥Õ¬Õ¸Ö‚ Õ±Õ¥Ö€ Õ¯Õ¸Õ²Õ´Õ«Ö Õ¹Õ©Õ¸Ö‚ÕµÕ¬Õ¡Õ¿Ö€Õ¾Õ¡Õ® Õ£Õ¸Ö€Õ®Õ«Ö„Õ¶Õ¥Ö€:"</string>
+ <string name="permlab_setPreferredApplications" msgid="8463181628695396391">"Õ½Õ¡Õ°Õ´Õ¡Õ¶Õ¥Õ¬ Õ¶Õ¡Õ­Õ¨Õ¶Õ¿Ö€Õ¡Õ® Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ¨"</string>
+ <string name="permdesc_setPreferredApplications" msgid="4973986762241783712">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ ÖƒÕ¸ÖƒÕ¸Õ­Õ¥Õ¬ Õ±Õ¥Ö€ Õ¶Õ¡Õ­Õ¨Õ¶Õ¿Ö€Õ¡Õ® Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ¨: ÕŽÕ¶Õ¡Õ½Õ¡Ö€Õ¡Ö€ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ¨ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Õ¶ Õ¡Õ¶Õ¶Õ¯Õ¡Õ¿ ÖƒÕ¸Õ­Õ¥Õ¬ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ¨, Õ¸Ö€Õ¸Õ¶Ö„ Õ¯Õ¥Õ²Õ®Õ¸Ö‚Õ´ Õ¥Õ¶ Õ±Õ¥Ö€ Õ¡Õ¼Õ¯Õ¡ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ« Õ¡Õ·Õ­Õ¡Õ¿Õ¡Õ¶Ö„Õ¨` Õ±Õ¥Õ¦Õ¡Õ¶Õ«Ö Õ¡Õ¶Õ±Õ¶Õ¡Õ¯Õ¡Õ¶ Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€ Õ°Õ¡Õ¾Õ¡Ö„Õ¡Õ£Ö€Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€:"</string>
+ <string name="permlab_writeSettings" msgid="2226195290955224730">"ÖƒÕ¸ÖƒÕ¸Õ­Õ¥Õ¬ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ« Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´Õ¶Õ¥Ö€Õ¨"</string>
+ <string name="permdesc_writeSettings" msgid="7775723441558907181">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ ÖƒÕ¸ÖƒÕ¸Õ­Õ¥Õ¬ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ« Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´Õ¶Õ¥Ö€Õ« Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨: ÕŽÕ¶Õ¡Õ½Õ¡Ö€Õ¡Ö€ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ¨ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Õ¶ Õ¾Õ¶Õ¡Õ½Õ¥Õ¬ Õ±Õ¥Ö€ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ« Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´Õ¶Õ¥Ö€Õ¨:"</string>
+ <string name="permlab_writeSecureSettings" msgid="204676251876718288">"ÖƒÕ¸ÖƒÕ¸Õ­Õ¥Õ¬ Õ¡Õ¶Õ¾Õ¿Õ¡Õ¶Õ£ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ« Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´Õ¶Õ¥Ö€Õ¨"</string>
+ <string name="permdesc_writeSecureSettings" msgid="8159535613020137391">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ ÖƒÕ¸ÖƒÕ¸Õ­Õ¥Õ¬ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ« Õ¡Õ¶Õ¾Õ¿Õ¡Õ¶Õ£ Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´Õ¶Õ¥Ö€Õ« Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨: Õ†Õ¡Õ­Õ¡Õ¿Õ¥Õ½Õ¾Õ¡Õ® Õ¹Õ§ Õ½Õ¸Õ¾Õ¸Ö€Õ¡Õ¯Õ¡Õ¶ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ« Õ¯Õ¸Õ²Õ´Õ«Ö Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ´Õ¡Õ¶ Õ°Õ¡Õ´Õ¡Ö€:"</string>
+ <string name="permlab_writeGservices" msgid="2149426664226152185">"ÖƒÕ¸ÖƒÕ¸Õ­Õ¥Õ¬ Google Õ®Õ¡Õ¼Õ¡ÕµÕ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ« Ö„Õ¡Ö€Õ¿Õ¥Õ¦Õ¨"</string>
+ <string name="permdesc_writeGservices" msgid="1287309437638380229">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ ÖƒÕ¸ÖƒÕ¸Õ­Õ¥Õ¬ Google-Õ« Õ®Õ¡Õ¼Õ¡ÕµÕ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ« Ö„Õ¡Ö€Õ¿Õ¥Õ¦Õ¨: ÕÕ¸Õ¾Õ¸Ö€Õ¡Õ¯Õ¡Õ¶ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ« Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ´Õ¡Õ¶ Õ°Õ¡Õ´Õ¡Ö€ Õ¹Õ§:"</string>
+ <string name="permlab_receiveBootCompleted" msgid="5312965565987800025">"Õ¡Õ·Õ­Õ¡Õ¿Õ¥Õ¬ Õ´Õ¥Õ¯Õ¶Õ¡Ö€Õ¯Õ¡ÕµÕ«Õ¶ Õ¼Õ¥ÕªÕ«Õ´Õ¸Õ¾"</string>
+ <string name="permdesc_receiveBootCompleted" product="tablet" msgid="7390304664116880704">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ«Õ¶Ö„Õ¶Õ¸Ö‚Ö€Õ¸Ö‚ÕµÕ¶ Õ´Õ¥Õ¯Õ¶Õ¡Ö€Õ¯Õ¥Õ¬ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ« Õ¢Õ¥Õ¼Õ¶Õ´Õ¡Õ¶ Õ¡Õ¾Õ¡Ö€Õ¿Õ«Ö Õ°Õ¥Õ¿Õ¸: ÕÕ¡ Õ¯Õ¡Ö€Õ¸Õ² Õ§ Õ¥Ö€Õ¯Õ¡Ö€Õ¡ÖÕ¶Õ¥Õ¬ Õ£Ö€Õ¡Õ½Õ¡Õ¬Õ«Õ¯Õ« Õ´Õ¥Õ¯Õ¶Õ¡Ö€Õ¯Õ¨ Ö‡ Õ©Õ¸Ö‚ÕµÕ¬ Õ¿Õ¡Õ¬ Õ°Õ¡Õ¾Õ¥Õ¬Õ¡Õ¾Õ¡Õ®Õ«Õ¶ Õ¤Õ¡Õ¶Õ¤Õ¡Õ²Õ¥ÖÕ¶Õ¥Õ¬ Õ¡Õ´Õ¢Õ¸Õ²Õ» Õ£Ö€Õ¡Õ½Õ¡Õ¬Õ«Õ¯Õ« Õ¡Õ·Õ­Õ¡Õ¿Õ¡Õ¶Ö„Õ¨` Õ´Õ«Õ·Õ¿ Õ¡Õ·Õ­Õ¡Õ¿Õ¥Õ¬Õ¸Õ¾:"</string>
+ <string name="permdesc_receiveBootCompleted" product="default" msgid="513950589102617504">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ«Õ¶Ö„Õ¶ Õ«Ö€Õ¥Õ¶ Õ½Õ¯Õ½Õ¥Õ¬` Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ« Õ¢Õ¥Õ¼Õ¶Õ¸Ö‚Õ´Õ¶ Õ¡Õ¾Õ¡Ö€Õ¿Õ¾Õ¥Õ¬Õ¸Ö‚Õ¶ ÕºÕ¥Õ½: ÕÕ¡ Õ¯Õ¡Ö€Õ¸Õ² Õ§ Õ°Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ« Õ´Õ¥Õ¯Õ¶Õ¡Ö€Õ¯Õ¨ Õ¤Õ¡Ö€Õ±Õ¶Õ¥Õ¬ Õ¡Õ¾Õ¥Õ¬Õ« Õ¥Ö€Õ¯Õ¡Ö€ Ö‡ Õ©Õ¸Ö‚ÕµÕ¬ Õ¿Õ¡Õ¬, Õ¸Ö€ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¨ Õ¤Õ¡Õ¶Õ¤Õ¡Õ²Õ¥ÖÕ¶Õ« Õ¨Õ¶Õ¤Õ°Õ¡Õ¶Õ¸Ö‚Ö€ Õ°Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ« Õ¡Õ·Õ­Õ¡Õ¿Õ¡Õ¶Ö„Õ¨` Õ´Õ«Õ·Õ¿ Õ¡Õ·Õ­Õ¡Õ¿Õ¥Õ¬Õ¸Õ¾:"</string>
+ <string name="permlab_broadcastSticky" msgid="7919126372606881614">"Õ¸Ö‚Õ²Õ¡Ö€Õ¯Õ¥Õ¬ Õ¯ÕºÕ¹Õ¸Ö‚Õ¶ Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¸Ö‚Õ´"</string>
+ <string name="permdesc_broadcastSticky" product="tablet" msgid="7749760494399915651">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¸Ö‚Õ²Õ¡Ö€Õ¯Õ¥Õ¬ Õ¯ÕºÕ¹Õ¸Ö‚Õ¶ Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¸Ö‚Õ´Õ¶Õ¥Ö€, Õ¸Ö€Õ¸Õ¶Ö„ Õ´Õ¶Õ¸Ö‚Õ´ Õ¥Õ¶ Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ´Õ¡Õ¶ Õ¡Õ¾Õ¡Ö€Õ¿Õ«Ö Õ°Õ¥Õ¿Õ¸: Õ‰Õ¡ÖƒÕ¡Õ¦Õ¡Õ¶Ö Õ·Õ¡Õ¿ Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¸Ö‚Õ´Õ¨ Õ¯Õ¡Ö€Õ¸Õ² Õ§ Õ£Ö€Õ¡Õ½Õ¡Õ¬Õ«Õ¯Õ« Õ¡Õ·Õ­Õ¡Õ¿Õ¡Õ¶Ö„Õ¨ Õ¤Õ¡Õ¶Õ¤Õ¡Õ²Õ¥ÖÕ¶Õ¥Õ¬ Õ¯Õ¡Õ´ Õ¤Õ¡Ö€Õ±Õ¶Õ¥Õ¬ Õ¡Õ¶Õ¯Õ¡ÕµÕ¸Ö‚Õ¶` ÕºÕ¡Õ¿Õ³Õ¡Õ¼ Õ¤Õ¡Õ¼Õ¶Õ¡Õ¬Õ¸Õ¾ Õ¹Õ¡ÖƒÕ¡Õ¦Õ¡Õ¶Ö Õ´Õ¥Õ® Õ°Õ«Õ·Õ¸Õ²Õ¸Ö‚Õ©ÕµÕ¡Õ¶ Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ´Õ¡Õ¶:"</string>
+ <string name="permdesc_broadcastSticky" product="default" msgid="2825803764232445091">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¸Ö‚Õ²Õ¡Ö€Õ¯Õ¥Õ¬ Õ¯ÕºÕ¹Õ¸Ö‚Õ¶ Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¸Ö‚Õ´Õ¶Õ¥Ö€, Õ¸Ö€Õ¸Õ¶Ö„ Õ´Õ¶Õ¸Ö‚Õ´ Õ¥Õ¶ Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ´Õ¡Õ¶ Õ¡Õ¾Õ¡Ö€Õ¿Õ«Ö Õ°Õ¥Õ¿Õ¸: Õ‰Õ¡ÖƒÕ¡Õ¦Õ¡Õ¶Ö Õ·Õ¡Õ¿ Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¸Ö‚Õ´Õ¨ Õ¯Õ¡Ö€Õ¸Õ² Õ§ Õ°Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ« Õ¡Õ·Õ­Õ¡Õ¿Õ¡Õ¶Ö„Õ¨ Õ¤Õ¡Õ¶Õ¤Õ¡Õ²Õ¥ÖÕ¶Õ¥Õ¬ Õ¯Õ¡Õ´ Õ¤Õ¡Ö€Õ±Õ¶Õ¥Õ¬ Õ¡Õ¶Õ¯Õ¡ÕµÕ¸Ö‚Õ¶` ÕºÕ¡Õ¿Õ³Õ¡Õ¼ Õ¤Õ¡Õ¼Õ¶Õ¡Õ¬Õ¸Õ¾ Õ¹Õ¡ÖƒÕ¡Õ¦Õ¡Õ¶Ö Õ´Õ¥Õ® Õ°Õ«Õ·Õ¸Õ²Õ¸Ö‚Õ©ÕµÕ¡Õ¶ Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ´Õ¡Õ¶:"</string>
+ <string name="permlab_readContacts" msgid="8348481131899886131">"Õ¯Õ¡Ö€Õ¤Õ¡Õ¬ Õ±Õ¥Ö€ Õ¯Õ¸Õ¶Õ¿Õ¡Õ¯Õ¿Õ¶Õ¥Ö€Õ¨"</string>
+ <string name="permdesc_readContacts" product="tablet" msgid="5294866856941149639">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¯Õ¡Ö€Õ¤Õ¡Õ¬ Õ±Õ¥Ö€ Õ£Ö€Õ¡Õ½Õ¡Õ¬Õ«Õ¯Õ¸Ö‚Õ´ ÕºÕ¡Õ°Õ¾Õ¡Õ® Õ¯Õ¸Õ¶Õ¿Õ¡Õ¯Õ¿Õ¶Õ¥Ö€Õ« Õ´Õ¡Õ½Õ«Õ¶ Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨, Õ¡ÕµÕ¤ Õ©Õ¾Õ¸Ö‚Õ´` Õ±Õ¥Ö€ Õ¯Õ¡Õ¿Õ¡Ö€Õ¡Õ® Õ¦Õ¡Õ¶Õ£Õ¥Ö€Õ«, Õ£Ö€Õ¡Õ® Õ¶Õ¡Õ´Õ¡Õ¯Õ¶Õ¥Ö€Õ« Õ¯Õ¡Õ´ Õ¸Ö€Õ¸Õ·Õ¡Õ¯Õ« Õ¡Õ¶Õ°Õ¡Õ¿Õ¶Õ¥Ö€Õ« Õ°Õ¥Õ¿ Õ¡ÕµÕ¬ Õ¥Õ²Õ¡Õ¶Õ¡Õ¯Õ¸Õ¾ Õ·ÖƒÕ´Õ¡Õ¶ Õ°Õ¡Õ³Õ¡Õ­Õ¡Õ¯Õ¡Õ¶Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨: Ô±ÕµÕ½ Õ©Õ¸Ö‚ÕµÕ¬Õ¿Õ¾Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Õ°Õ¶Õ¡Ö€Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ«Õ¶ ÕºÕ¡Õ°Õ¥Õ¬ Õ±Õ¥Ö€ Õ¯Õ¸Õ¶Õ¿Õ¡Õ¯Õ¿Õ¡ÕµÕ«Õ¶ Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨, Õ«Õ½Õ¯ Õ¾Õ¶Õ¡Õ½Õ¡Ö€Õ¡Ö€ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ¨ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Õ¶ Õ¿Õ¡Ö€Õ¡Õ®Õ¥Õ¬ Õ¯Õ¸Õ¶Õ¿Õ¡Õ¯Õ¿Õ¡ÕµÕ«Õ¶ Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨` Õ¡Õ¼Õ¡Õ¶Ö Õ±Õ¥Ö€ Õ«Õ´Õ¡ÖÕ¸Ö‚Õ©ÕµÕ¡Õ¶:"</string>
+ <string name="permdesc_readContacts" product="default" msgid="8440654152457300662">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¯Õ¡Ö€Õ¤Õ¡Õ¬ Õ±Õ¥Ö€ Õ°Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ¸Ö‚Õ´ ÕºÕ¡Õ°Õ¾Õ¡Õ® Õ¯Õ¸Õ¶Õ¿Õ¡Õ¯Õ¿Õ¶Õ¥Ö€Õ« Õ´Õ¡Õ½Õ«Õ¶ Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨, Õ¡ÕµÕ¤ Õ©Õ¾Õ¸Ö‚Õ´` Õ±Õ¥Ö€ Õ¯Õ¡Õ¿Õ¡Ö€Õ¡Õ® Õ¦Õ¡Õ¶Õ£Õ¥Ö€Õ«, Õ£Ö€Õ¡Õ® Õ¶Õ¡Õ´Õ¡Õ¯Õ¶Õ¥Ö€Õ« Õ¯Õ¡Õ´ Õ¸Ö€Õ¸Õ·Õ¡Õ¯Õ« Õ¡Õ¶Õ°Õ¡Õ¿Õ¶Õ¥Ö€Õ« Õ°Õ¥Õ¿ Õ¡ÕµÕ¬ Õ¥Õ²Õ¡Õ¶Õ¡Õ¯Õ¸Õ¾ Õ·ÖƒÕ´Õ¡Õ¶ Õ°Õ¡Õ³Õ¡Õ­Õ¡Õ¯Õ¡Õ¶Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨: Ô±ÕµÕ½ Õ©Õ¸Ö‚ÕµÕ¬Õ¿Õ¾Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Õ°Õ¶Õ¡Ö€Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ«Õ¶ ÕºÕ¡Õ°Õ¥Õ¬ Õ±Õ¥Ö€ Õ¯Õ¸Õ¶Õ¿Õ¡Õ¯Õ¿Õ¡ÕµÕ«Õ¶ Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨, Õ«Õ½Õ¯ Õ¾Õ¶Õ¡Õ½Õ¡Ö€Õ¡Ö€ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ¨ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Õ¶ Õ¿Õ¡Ö€Õ¡Õ®Õ¥Õ¬ Õ¯Õ¸Õ¶Õ¿Õ¡Õ¯Õ¿Õ¡ÕµÕ«Õ¶ Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨` Õ¡Õ¼Õ¡Õ¶Ö Õ±Õ¥Ö€ Õ«Õ´Õ¡ÖÕ¸Ö‚Õ©ÕµÕ¡Õ¶:"</string>
+ <string name="permlab_writeContacts" msgid="5107492086416793544">"ÖƒÕ¸ÖƒÕ¸Õ­Õ¥Õ¬ Õ±Õ¥Ö€ Õ¯Õ¸Õ¶Õ¿Õ¡Õ¯Õ¿Õ¶Õ¥Ö€Õ¨"</string>
+ <string name="permdesc_writeContacts" product="tablet" msgid="897243932521953602">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ ÖƒÕ¸ÖƒÕ¸Õ­Õ¥Õ¬ Õ±Õ¥Ö€ Õ£Ö€Õ¡Õ½Õ¡Õ¬Õ«Õ¯Õ¸Ö‚Õ´ ÕºÕ¡Õ°Õ¾Õ¡Õ® Õ¯Õ¸Õ¶Õ¿Õ¡Õ¯Õ¿Õ¶Õ¥Ö€Õ« Õ´Õ¡Õ½Õ«Õ¶ Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨, Õ¡ÕµÕ¤ Õ©Õ¾Õ¸Ö‚Õ´` Õ±Õ¥Ö€ Õ¯Õ¡Õ¿Õ¡Ö€Õ¡Õ® Õ¦Õ¡Õ¶Õ£Õ¥Ö€Õ«, Õ£Ö€Õ¡Õ® Õ¶Õ¡Õ´Õ¡Õ¯Õ¶Õ¥Ö€Õ« Õ¯Õ¡Õ´ Õ¸Ö€Õ¸Õ·Õ¡Õ¯Õ« Õ¡Õ¶Õ°Õ¡Õ¿Õ¶Õ¥Ö€Õ« Õ°Õ¥Õ¿ Õ¡ÕµÕ¬ Õ¥Õ²Õ¡Õ¶Õ¡Õ¯Õ¸Õ¾ Õ·ÖƒÕ´Õ¡Õ¶ Õ°Õ¡Õ³Õ¡Õ­Õ¡Õ¯Õ¡Õ¶Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨: Ô±ÕµÕ½ Õ©Õ¸Ö‚ÕµÕ¬Õ¿Õ¾Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Õ°Õ¶Õ¡Ö€Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ«Õ¶ Õ»Õ¶Õ»Õ¥Õ¬ Õ¯Õ¸Õ¶Õ¿Õ¡Õ¯Õ¿Õ¡ÕµÕ«Õ¶ Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨:"</string>
+ <string name="permdesc_writeContacts" product="default" msgid="589869224625163558">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ ÖƒÕ¸ÖƒÕ¸Õ­Õ¥Õ¬ Õ±Õ¥Ö€ Õ£Ö€Õ¡Õ½Õ¡Õ¬Õ«Õ¯Õ¸Ö‚Õ´ ÕºÕ¡Õ°Õ¾Õ¡Õ® Õ¯Õ¸Õ¶Õ¿Õ¡Õ¯Õ¿Õ¶Õ¥Ö€Õ« Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨, Õ¡ÕµÕ¤ Õ©Õ¾Õ¸Ö‚Õ´` Õ±Õ¥Ö€ Õ¯Õ¡Õ¿Õ¡Ö€Õ¡Õ® Õ¦Õ¡Õ¶Õ£Õ¥Ö€Õ«, Õ£Ö€Õ¡Õ® Õ¶Õ¡Õ´Õ¡Õ¯Õ¶Õ¥Ö€Õ« Õ¯Õ¡Õ´ Õ¸Ö€Õ¸Õ·Õ¡Õ¯Õ« Õ¡Õ¶Õ°Õ¡Õ¿Õ¶Õ¥Ö€Õ« Õ°Õ¥Õ¿ Õ¡ÕµÕ¬ Õ¥Õ²Õ¡Õ¶Õ¡Õ¯Õ¸Õ¾ Õ·ÖƒÕ´Õ¡Õ¶ Õ°Õ¡Õ³Õ¡Õ­Õ¡Õ¯Õ¡Õ¶Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨: Ô±ÕµÕ½ Õ©Õ¸Ö‚ÕµÕ¬Õ¿Õ¾Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Õ°Õ¶Õ¡Ö€Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ«Õ¶ Õ»Õ¶Õ»Õ¥Õ¬ Õ¯Õ¸Õ¶Õ¿Õ¡Õ¯Õ¿Õ¡ÕµÕ«Õ¶ Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨:"</string>
+ <string name="permlab_readCallLog" msgid="3478133184624102739">"Õ¯Õ¡Ö€Õ¤Õ¡Õ¬ Õ¦Õ¡Õ¶Õ£Õ¥Ö€Õ« Õ´Õ¡Õ¿ÕµÕ¡Õ¶Õ¨"</string>
+ <string name="permdesc_readCallLog" product="tablet" msgid="3700645184870760285">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¯Õ¡Ö€Õ¤Õ¡Õ¬ Õ±Õ¥Ö€ Õ£Ö€Õ¡Õ½Õ¡Õ¬Õ«Õ¯Õ« Õ¦Õ¡Õ¶Õ£Õ¥Ö€Õ« Õ£Ö€Õ¡Õ¶ÖÕ¡Õ´Õ¡Õ¿ÕµÕ¡Õ¶Õ¨, Õ¡ÕµÕ¤ Õ©Õ¾Õ¸Ö‚Õ´` Õ´Õ¸Ö‚Õ¿Ö„Õ¡ÕµÕ«Õ¶ Ö‡ Õ¥Õ¬Ö„Õ¡ÕµÕ«Õ¶ Õ¦Õ¡Õ¶Õ£Õ¥Ö€Õ« Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨: ÕÕ¡ Õ©Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ ÕºÕ¡Õ°Õ¥Õ¬ Õ±Õ¥Ö€ Õ¦Õ¡Õ¶Õ£Õ¥Ö€Õ« Õ£Ö€Õ¡Õ¶ÖÕ¡Õ´Õ¡Õ¿ÕµÕ¡Õ¶Õ« Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨, Ö‡ Õ¾Õ¶Õ¡Õ½Õ¡Ö€Õ¡Ö€ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ¨ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Õ¶ Õ¿Õ¡Ö€Õ¡Õ®Õ¥Õ¬ Õ¤Ö€Õ¡Õ¶Ö„` Õ¡Õ¼Õ¡Õ¶Ö Õ±Õ¥Ö€ Õ«Õ´Õ¡ÖÕ¸Ö‚Õ©ÕµÕ¡Õ¶:"</string>
+ <string name="permdesc_readCallLog" product="default" msgid="5777725796813217244">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ տալիս հավելվածին Õ¯Õ¡Ö€Õ¤Õ¡Õ¬ Õ±Õ¥Ö€ Õ°Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ« Õ¦Õ¡Õ¶Õ£Õ¥Ö€Õ« Õ£Ö€Õ¡Õ¶ÖÕ¡Õ´Õ¡Õ¿ÕµÕ¡Õ¶Õ¨, Õ¡ÕµÕ¤ Õ©Õ¾Õ¸Ö‚Õ´` Õ´Õ¸Ö‚Õ¿Ö„Õ¡ÕµÕ«Õ¶ Ö‡ Õ¥Õ¬Ö„Õ¡ÕµÕ«Õ¶ Õ¦Õ¡Õ¶Õ£Õ¥Ö€Õ« Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨: Ô¹Õ¸Ö‚ÕµÕ¬Õ¿Õ¾Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Õ°Õ¶Õ¡Ö€Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ ÕºÕ¡Õ°ÕºÕ¡Õ¶Õ¥Õ¬ Õ±Õ¥Ö€ Õ¦Õ¡Õ¶Õ£Õ¥Ö€Õ« Õ£Ö€Õ¡Õ¶ÖÕ¡Õ´Õ¡Õ¿ÕµÕ¡Õ¶Õ« Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨, Ö‡ Õ¾Õ¶Õ¡Õ½Õ¡Ö€Õ¡Ö€ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ¨ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Õ¶ Õ¿Õ¡Ö€Õ¡Õ®Õ¥Õ¬ Õ£Ö€Õ¡Õ¶ÖÕ¡Õ´Õ¡Õ¿ÕµÕ¡Õ¶Õ« Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¶ Õ¡Õ¼Õ¡Õ¶Ö Õ±Õ¥Ö€ Õ«Õ´Õ¡ÖÕ¸Ö‚Õ©ÕµÕ¡Õ¶:"</string>
+ <string name="permlab_writeCallLog" msgid="8552045664743499354">"Õ¿Õ¥Õ½Õ¶Õ¥Õ¬ Õ¦Õ¡Õ¶Õ£Õ¥Ö€Õ« Õ£Ö€Õ¡Õ¶ÖÕ¡Õ´Õ¡Õ¿ÕµÕ¡Õ¶Õ¨"</string>
+ <string name="permdesc_writeCallLog" product="tablet" msgid="6661806062274119245">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ ÖƒÕ¸ÖƒÕ¸Õ­Õ¥Õ¬ Õ±Õ¥Ö€ Õ£Ö€Õ¡Õ½Õ¡Õ¬Õ«Õ¯Õ« Õ¦Õ¡Õ¶Õ£Õ¥Ö€Õ« Õ´Õ¡Õ¿ÕµÕ¡Õ¶Õ¨, Õ¡ÕµÕ¤ Õ©Õ¾Õ¸Ö‚Õ´` Õ´Õ¸Ö‚Õ¿Ö„Õ¡ÕµÕ«Õ¶ Ö‡ Õ¥Õ¬Ö„Õ¡ÕµÕ«Õ¶ Õ¦Õ¡Õ¶Õ£Õ¥Ö€Õ« Õ´Õ¡Õ½Õ«Õ¶ Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨: ÕŽÕ¶Õ¡Õ½Õ¡Ö€Õ¡Ö€ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ¨ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Õ¶ Õ½Õ¡ Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¥Õ¬` Õ±Õ¥Ö€ Õ¦Õ¡Õ¶Õ£Õ¥Ö€Õ« Õ´Õ¡Õ¿ÕµÕ¡Õ¶Õ¨ Õ»Õ¶Õ»Õ¥Õ¬Õ¸Ö‚ Õ¯Õ¡Õ´ ÖƒÕ¸ÖƒÕ¸Õ­Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€:"</string>
+ <string name="permdesc_writeCallLog" product="default" msgid="683941736352787842">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ ÖƒÕ¸ÖƒÕ¸Õ­Õ¥Õ¬ Õ±Õ¥Ö€ Õ°Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ« Õ¦Õ¡Õ¶Õ£Õ¥Ö€Õ« Õ´Õ¡Õ¿ÕµÕ¡Õ¶Õ¨, Õ¡ÕµÕ¤ Õ©Õ¾Õ¸Ö‚Õ´` Õ´Õ¸Ö‚Õ¿Ö„Õ¡ÕµÕ«Õ¶ Ö‡ Õ¥Õ¬Ö„Õ¡ÕµÕ«Õ¶ Õ¦Õ¡Õ¶Õ£Õ¥Ö€Õ« Õ´Õ¡Õ½Õ«Õ¶ Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨: ÕŽÕ¶Õ¡Õ½Õ¡Ö€Õ¡Ö€ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ¨ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Õ¶ Õ½Õ¡ Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¥Õ¬` Õ±Õ¥Ö€ Õ¦Õ¡Õ¶Õ£Õ¥Ö€Õ« Õ´Õ¡Õ¿ÕµÕ¡Õ¶Õ¨ Õ»Õ¶Õ»Õ¥Õ¬Õ¸Ö‚ Õ¯Õ¡Õ´ ÖƒÕ¸ÖƒÕ¸Õ­Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€:"</string>
+ <string name="permlab_readProfile" msgid="4701889852612716678">"Õ¯Õ¡Ö€Õ¤Õ¡Õ¬ Õ±Õ¥Ö€ Õ½Õ¥ÖƒÕ¡Õ¯Õ¡Õ¶ Õ¯Õ¸Õ¶Õ¿Õ¡Õ¯Õ¿Õ¡ÕµÕ«Õ¶ Ö„Õ¡Ö€Õ¿Õ¨"</string>
+ <string name="permdesc_readProfile" product="default" msgid="5462475151849888848">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¯Õ¡Ö€Õ¤Õ¡Õ¬ Õ±Õ¥Ö€ Õ½Õ¡Ö€Ö„Õ¸Ö‚Õ´ ÕºÕ¡Õ°Õ¾Õ¡Õ® Õ¡Õ¶Õ°Õ¡Õ¿Õ¡Õ¯Õ¡Õ¶ ​​պրոֆիլի Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨, Õ«Õ¶Õ¹ÕºÕ«Õ½Õ«Ö„ Õ¥Õ¶ Õ±Õ¥Ö€ Õ¡Õ¶Õ¸Ö‚Õ¶Õ¨ Ö‡ Õ¯Õ¸Õ¶Õ¿Õ¡Õ¯Õ¿Õ¡ÕµÕ«Õ¶ Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨: ÕÕ¡ Õ¶Õ·Õ¡Õ¶Õ¡Õ¯Õ¸Ö‚Õ´ Õ§, Õ¸Ö€ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¨ Õ¯Õ¡Ö€Õ¸Õ² Õ§ Õ±Õ¥Õ¦ Õ³Õ¡Õ¶Õ¡Õ¹Õ¥Õ¬ Ö‡ Õ¸Ö‚Õ²Õ¡Ö€Õ¯Õ¥Õ¬ Õ±Õ¥Ö€ ÕºÖ€Õ¸Ö†Õ«Õ¬Õ« Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨ Õ¸Ö‚Ö€Õ«Õ·Õ¶Õ¥Ö€Õ«Õ¶:"</string>
+ <string name="permlab_writeProfile" msgid="907793628777397643">"ÖƒÕ¸ÖƒÕ¸Õ­Õ¥Õ¬ Õ±Õ¥Ö€ Õ½Õ¥ÖƒÕ¡Õ¯Õ¡Õ¶ Õ¯Õ¸Õ¶Õ¿Õ¡Õ¯Õ¿Õ¡ÕµÕ«Õ¶ Ö„Õ¡Ö€Õ¿Õ¨"</string>
+ <string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ ÖƒÕ¸Õ­Õ¥Õ¬ Õ¯Õ¡Õ´ Õ¡Õ¾Õ¥Õ¬Õ¡ÖÕ¶Õ¥Õ¬ Õ±Õ¥Ö€ Õ½Õ¡Ö€Ö„Õ¸Ö‚Õ´ ÕºÕ¡Õ°Õ¾Õ¡Õ® Õ¡Õ¶Õ°Õ¡Õ¿Õ¡Õ¯Õ¡Õ¶ ​​պրոֆիլի Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨, Õ«Õ¶Õ¹ÕºÕ«Õ½Õ«Ö„ Õ¥Õ¶ Õ±Õ¥Ö€ Õ¡Õ¶Õ¸Ö‚Õ¶Õ¨ Ö‡ Õ¯Õ¸Õ¶Õ¿Õ¡Õ¯Õ¿Õ¡ÕµÕ«Õ¶ Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨: ÕÕ¡ Õ¶Õ·Õ¡Õ¶Õ¡Õ¯Õ¸Ö‚Õ´ Õ§, Õ¸Ö€ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¨ Õ¯Õ¡Ö€Õ¸Õ² Õ§ Õ±Õ¥Õ¦ Õ³Õ¡Õ¶Õ¡Õ¹Õ¥Õ¬ Ö‡ Õ¸Ö‚Õ²Õ¡Ö€Õ¯Õ¥Õ¬ Õ±Õ¥Ö€ ÕºÖ€Õ¸Ö†Õ«Õ¬Õ« Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨ Õ¸Ö‚Ö€Õ«Õ·Õ¶Õ¥Ö€Õ«Õ¶:"</string>
+ <string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"Õ¯Õ¡Ö€Õ¤Õ¡Õ¬ Õ±Õ¥Ö€ Õ½Õ¸ÖÕ«Õ¡Õ¬Õ¡Õ¯Õ¡Õ¶ Õ°Õ¸Õ½Ö„Õ¨"</string>
+ <string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ´Õ¸Ö‚Õ¿Ö„ Õ£Õ¸Ö€Õ®Õ¥Õ¬ Ö‡ Õ°Õ¡Õ´Õ¡ÕªÕ¡Õ´Õ¥ÖÕ¶Õ¥Õ¬ Õ±Õ¥Ö€ Ö‡ Õ±Õ¥Ö€ Õ¨Õ¶Õ¯Õ¥Ö€Õ¶Õ¥Ö€Õ« Õ½Õ¸ÖÕ«Õ¡Õ¬Õ¡Õ¯Õ¡Õ¶ Õ©Õ¡Ö€Õ´Õ¡ÖÕ¸Ö‚Õ´Õ¶Õ¥Ö€Õ¨: Ô¶Õ£Õ¸Ö‚ÕµÕ· Õ¥Õ²Õ¥Ö„ Õ¿Õ¥Õ²Õ¥Õ¯Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€ Õ¿Õ¡Ö€Õ¡Õ®Õ¥Õ¬Õ«Õ½. Õ¡ÕµÕ¶ Õ©Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¯Õ¡Ö€Õ¤Õ¡Õ¬ Õ±Õ¥Ö€ Ö‡ Õ±Õ¥Ö€ Õ¨Õ¶Õ¯Õ¥Ö€Õ¶Õ¥Ö€Õ« Õ´Õ«Õ»Ö‡ Õ¡Õ¶Õ±Õ¶Õ¡Õ¯Õ¡Õ¶ Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨ Õ½Õ¸ÖÕ«Õ¡Õ¬Õ¡Õ¯Õ¡Õ¶ ÖÕ¡Õ¶ÖÕ¥Ö€Õ¸Ö‚Õ´` Õ¡Õ¶Õ¯Õ¡Õ­ Õ£Õ¡Õ²Õ¿Õ¶Õ«Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ«Ö: Õ†Õ·Õ¸Ö‚Õ´. Õ¡ÕµÕ½ Õ©Õ¸Ö‚ÕµÕ¬Õ¿Õ¾Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Õ¹Õ« Õ¯Õ¡Ö€Õ¸Õ² Õ£Õ¸Ö€Õ®Õ¡Õ®Õ¾Õ¥Õ¬ Õ¢Õ¸Õ¬Õ¸Ö€ Õ½Õ¸ÖÕ«Õ¡Õ¬Õ¡Õ¯Õ¡Õ¶ ÖÕ¡Õ¶ÖÕ¥Ö€Õ¸Ö‚Õ´:"</string>
+ <string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"Õ£Ö€Õ¥Õ¬ Õ±Õ¥Ö€ Õ½Õ¸ÖÕ«Õ¡Õ¬Õ¡Õ¯Õ¡Õ¶ Õ°Õ¸Õ½Ö„Õ¸Ö‚Õ´"</string>
+ <string name="permdesc_writeSocialStream" product="default" msgid="3086557552204114849">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ ÖÕ¸Ö‚ÖÕ¡Õ¤Ö€Õ¥Õ¬ Õ±Õ¥Ö€ Õ¨Õ¶Õ¯Õ¥Ö€Õ¶Õ¥Ö€Õ« Õ½Õ¸ÖÕ«Õ¡Õ¬Õ¡Õ¯Õ¡Õ¶ Õ©Õ¡Ö€Õ´Õ¡ÖÕ¸Ö‚Õ´Õ¶Õ¥Ö€Õ¨: Ô¶Õ£Õ¸Ö‚ÕµÕ· Õ¥Õ²Õ¥Ö„ Õ¿Õ¥Õ²Õ¥Õ¯Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€ Õ¿Õ¡Ö€Õ¡Õ®Õ¥Õ¬Õ«Õ½. Õ¡ÕµÕ¶ Õ©Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¡Õ£Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€ Õ½Õ¿Õ¥Õ²Õ®Õ¥Õ¬, Õ¸Ö€Õ¸Õ¶Ö„ Õ«Õ¢Ö€Ö‡ Õ½Õ¿Õ¡ÖÕ¾Õ¸Ö‚Õ´ Õ¥Õ¶ Õ¨Õ¶Õ¯Õ¥Ö€Õ¸Õ»Õ«Ö: Õ†Õ·Õ¸Ö‚Õ´. Õ¡ÕµÕ½ Õ©Õ¸Ö‚ÕµÕ¬Õ¿Õ¾Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Õ¹Õ« Õ¯Õ¡Ö€Õ¸Õ² Õ£Õ¸Ö€Õ®Õ¡Õ®Õ¾Õ¥Õ¬ Õ¢Õ¸Õ¬Õ¸Ö€ Õ½Õ¸ÖÕ«Õ¡Õ¬Õ¡Õ¯Õ¡Õ¶ ÖÕ¡Õ¶ÖÕ¥Ö€Õ¸Ö‚Õ´:"</string>
+ <string name="permlab_readCalendar" msgid="5972727560257612398">"Õ¯Õ¡Ö€Õ¤Õ¡Õ¬ Ö…Ö€Õ¡ÖÕ¸Ö‚ÖÕ¡ÕµÕ«Õ¶ Õ«Ö€Õ¡Õ¤Õ¡Ö€Õ±Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨ Ö‡ Õ£Õ¡Õ²Õ¿Õ¶Õ« Õ¿Õ¥Õ²Õ¥Õ¯Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨"</string>
+ <string name="permdesc_readCalendar" product="tablet" msgid="4216462049057658723">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¯Õ¡Ö€Õ¤Õ¡Õ¬ Õ±Õ¥Ö€ Õ£Ö€Õ¡Õ½Õ¡Õ¬Õ«Õ¯Õ¸Ö‚Õ´ ÕºÕ¡Õ°Õ¾Õ¡Õ® Õ¢Õ¸Õ¬Õ¸Ö€ Ö…Ö€Õ¡ÖÕ¸Ö‚ÖÕ¡ÕµÕ«Õ¶ Õ«Ö€Õ¡Õ¤Õ¡Ö€Õ±Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨, Õ¡ÕµÕ¤ Õ©Õ¾Õ¸Ö‚Õ´` Õ¨Õ¶Õ¯Õ¥Ö€Õ¶Õ¥Ö€Õ« Õ¯Õ¡Õ´ Õ£Õ¸Ö€Õ®Õ¨Õ¶Õ¯Õ¥Ö€Õ¶Õ¥Ö€Õ«: ÕÕ¡ Õ¯Õ¡Ö€Õ¸Õ² Õ§ Õ©Õ¸Ö‚ÕµÕ¬ Õ¿Õ¡Õ¬ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¿Õ¡Ö€Õ¡Õ®Õ¥Õ¬ Õ¯Õ¡Õ´ ÕºÕ¡Õ°Õ¥Õ¬ Õ±Õ¥Ö€ Ö…Ö€Õ¡ÖÕ¸Ö‚ÖÕ¡ÕµÕ«Õ¶ Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨` Õ¡Õ¶Õ¯Õ¡Õ­ Õ£Õ¡Õ²Õ¿Õ¶Õ«Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ«Ö Õ¯Õ¡Õ´ Õ¦Õ£Õ¡ÕµÕ¸Ö‚Õ¶Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ«Ö:"</string>
+ <string name="permdesc_readCalendar" product="default" msgid="7434548682470851583">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¯Õ¡Ö€Õ¤Õ¡Õ¬ Õ±Õ¥Ö€ Õ°Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ¸Ö‚Õ´ ÕºÕ¡Õ°Õ¾Õ¡Õ® Õ¢Õ¸Õ¬Õ¸Ö€ Ö…Ö€Õ¡ÖÕ¸Ö‚ÖÕ¡ÕµÕ«Õ¶ Õ«Ö€Õ¡Õ¤Õ¡Ö€Õ±Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨, Õ¡ÕµÕ¤ Õ©Õ¾Õ¸Ö‚Õ´` Õ¨Õ¶Õ¯Õ¥Ö€Õ¶Õ¥Ö€Õ« Õ¯Õ¡Õ´ Õ£Õ¸Ö€Õ®Õ¨Õ¶Õ¯Õ¥Ö€Õ¶Õ¥Ö€Õ«: ÕÕ¡ Õ¯Õ¡Ö€Õ¸Õ² Õ§ Õ©Õ¸Ö‚ÕµÕ¬ Õ¿Õ¡Õ¬ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¿Õ¡Ö€Õ¡Õ®Õ¥Õ¬ Õ¯Õ¡Õ´ ÕºÕ¡Õ°Õ¥Õ¬ Õ±Õ¥Ö€ Ö…Ö€Õ¡ÖÕ¸Ö‚ÖÕ¡ÕµÕ«Õ¶ Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨` Õ¡Õ¶Õ¯Õ¡Õ­ Õ£Õ¡Õ²Õ¿Õ¶Õ«Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ«Ö Õ¯Õ¡Õ´ Õ¦Õ£Õ¡ÕµÕ¸Ö‚Õ¶Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ«Ö:"</string>
+ <string name="permlab_writeCalendar" msgid="8438874755193825647">"Õ¡Õ¾Õ¥Õ¬Õ¡ÖÕ¶Õ¥Õ¬ Õ¯Õ¡Õ´ ÖƒÕ¸ÖƒÕ¸Õ­Õ¥Õ¬ Ö…Ö€Õ¡ÖÕ¸Ö‚ÖÕ¡ÕµÕ«Õ¶ Õ«Ö€Õ¡Õ¤Õ¡Ö€Õ±Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨ Ö‡ Õ¸Ö‚Õ²Õ¡Ö€Õ¯Õ¥Õ¬ Õ¶Õ¡Õ´Õ¡Õ¯ Õ°ÕµÕ¸Ö‚Ö€Õ¥Ö€Õ«Õ¶` Õ¡Õ¼Õ¡Õ¶Ö Õ½Õ¥ÖƒÕ¡Õ¯Õ¡Õ¶Õ¡Õ¿Õ¥Ö€Õ¥Ö€Õ« Õ«Õ´Õ¡ÖÕ¸Ö‚Õ©ÕµÕ¡Õ¶"</string>
+ <string name="permdesc_writeCalendar" product="tablet" msgid="6679035520113668528">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¡Õ¾Õ¥Õ¬Õ¡ÖÕ¶Õ¥Õ¬, Õ°Õ¥Õ¼Õ¡ÖÕ¶Õ¥Õ¬, ÖƒÕ¸Õ­Õ¥Õ¬ Õ«Ö€Õ¡Õ¤Õ¡Ö€Õ±Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€, Õ¸Ö€Õ¸Õ¶Ö„ Õ¤Õ¸Ö‚Ö„ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Ö„ ÖƒÕ¸ÖƒÕ¸Õ­Õ¥Õ¬ Õ±Õ¥Ö€ Õ£Ö€Õ¡Õ½Õ¡Õ¬Õ«Õ¯Õ¸Ö‚Õ´, Õ¡ÕµÕ¤ Õ©Õ¾Õ¸Ö‚Õ´ Õ¨Õ¶Õ¯Õ¥Ö€Õ¶Õ¥Ö€Õ« Õ¯Õ¡Õ´ Õ¡Õ·Õ­Õ¡Õ¿Õ¡Õ¯Õ«ÖÕ¶Õ¥Ö€Õ« Õ«Ö€Õ¡Õ¤Õ¡Ö€Õ±Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨: ÕÕ¡ Õ¯Õ¡Ö€Õ¸Õ² Õ§ Õ©Õ¸Ö‚ÕµÕ¬ Õ¿Õ¡Õ¬ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¸Ö‚Õ²Õ¡Ö€Õ¯Õ¥Õ¬ Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€, Õ¸Ö€Õ¸Õ¶Ö„ Õ¥Ö€Ö‡Õ¸Ö‚Õ´ Õ¥Õ¶ որպես օրաÖÕ¸Ö‚ÕµÖÕ« Õ½Õ¥ÖƒÕ¡Õ¯Õ¡Õ¶Õ¡Õ¿Õ¥Ö€Õ¥Ö€Õ«Ö Õ¸Ö‚Õ²Õ¡Ö€Õ¯Õ¾Õ¡Õ®, Õ¯Õ¡Õ´ ÖƒÕ¸ÖƒÕ¸Õ­Õ¥Õ¬ Õ«Ö€Õ¡Õ¤Õ¡Ö€Õ±Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¶ Õ¡Õ¼Õ¡Õ¶Ö Õ½Õ¥ÖƒÕ¡Õ¯Õ¡Õ¶Õ¡Õ¿Õ¥Ö€Õ¥Ö€Õ« Õ«Õ´Õ¡ÖÕ¸Ö‚Õ©ÕµÕ¡Õ¶:"</string>
+ <string name="permdesc_writeCalendar" product="default" msgid="2324469496327249376">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¡Õ¾Õ¥Õ¬Õ¡ÖÕ¶Õ¥Õ¬, Õ°Õ¥Õ¼Õ¡ÖÕ¶Õ¥Õ¬, ÖƒÕ¸Õ­Õ¥Õ¬ Õ¡ÕµÕ¶ Õ«Ö€Õ¡Õ¤Õ¡Ö€Õ±Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨, Õ¸Ö€Õ¸Õ¶Ö„ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Ö„ ÖƒÕ¸ÖƒÕ¸Õ­Õ¥Õ¬ Õ±Õ¥Ö€ Õ°Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ«Ö, Õ¡ÕµÕ¤ Õ©Õ¾Õ¸Ö‚Õ´` Õ¨Õ¶Õ¯Õ¥Ö€Õ¶Õ¥Ö€Õ« Õ¯Õ¡Õ´ Õ£Õ¸Ö€Õ®Õ¨Õ¶Õ¯Õ¥Ö€Õ¶Õ¥Ö€Õ«: ÕÕ¡ Õ¯Õ¡Ö€Õ¸Õ² Õ§ Õ©Õ¸Ö‚ÕµÕ¬ Õ¿Õ¡Õ¬ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¸Ö‚Õ²Õ¡Ö€Õ¯Õ¥Õ¬ Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€, Õ¸Ö€Õ¸Õ¶Ö„ Õ«Õ¢Ö€Ö‡ Õ£Õ¡Õ¬Õ«Õ½ Õ¥Õ¶ Ö…Ö€Õ¡ÖÕ¸Ö‚ÕµÖÕ« Õ½Õ¥ÖƒÕ¡Õ¯Õ¡Õ¶Õ¡Õ¿Õ«Ö€Õ¸Õ»Õ«Ö, Õ¯Õ¡Õ´ ÖƒÕ¸ÖƒÕ¸Õ­Õ¥Õ¬ Õ«Ö€Õ¡Õ¤Õ¡Ö€Õ±Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨` Õ¡Õ¼Õ¡Õ¶Ö Õ½Õ¥ÖƒÕ¡Õ¯Õ¡Õ¶Õ¡Õ¿Õ«Ö€Õ¸Õ» Õ«Õ´Õ¡ÖÕ¸Ö‚Õ©ÕµÕ¡Õ¶:"</string>
+ <string name="permlab_accessMockLocation" msgid="8688334974036823330">"Õ¯Õ¥Õ²Õ® Õ¿Õ¥Õ²Õ¡Õ¶Ö„Õ« Õ¡Õ²Õ¢ÕµÕ¸Ö‚Ö€Õ¶Õ¥Ö€ ÖƒÕ¸Ö€Õ±Õ¡Ö€Õ¯Õ´Õ¡Õ¶ Õ°Õ¡Õ´Õ¡Ö€"</string>
+ <string name="permdesc_accessMockLocation" msgid="5808711039482051824">"ÕÕ¿Õ¥Õ²Õ®Õ¥Õ¬ Õ¯Õ¥Õ²Õ® Õ¿Õ¥Õ²Õ¡Õ¶Ö„Õ« Õ¡Õ²Õ¢ÕµÕ¸Ö‚Ö€Õ¶Õ¥Ö€` ÖƒÕ¸Ö€Õ±Õ¡Ö€Õ¯Õ´Õ¡Õ¶ Õ¯Õ¡Õ´ Õ¿Õ¥Õ²Õ¡Õ¤Ö€Õ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ¶Õ¸Ö€ Õ®Õ¡Õ¼Õ¡ÕµÕ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶ Õ´Õ¡Õ¿Õ¸Ö‚ÖÕ¸Õ²Õ« Õ¿Õ¥Õ²Õ¡Õ¤Ö€Õ´Õ¡Õ¶ Õ°Õ¡Õ´Õ¡Ö€: ÕÕ¡ Õ°Õ¶Õ¡Ö€Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶ Õ§ Õ¿Õ¡Õ¬Õ«Õ½, Õ¸Ö€ Õ®Ö€Õ¡Õ£Õ«Ö€Õ¨ Õ¡Õ¶Õ¿Õ¥Õ½Õ« Õ¿Õ¥Õ²Õ¡Õ¤Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Ö‡/Õ¯Õ¡Õ´ Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ«Õ³Õ¡Õ¯Õ¨` Õ¿Ö€Õ¡Õ´Õ¡Õ¤Ö€Õ¾Õ¡Õ® Õ¿Õ¥Õ²Õ¡Õ¶Ö„Õ« Õ¡ÕµÕ¬ Õ¡Õ²Õ¢ÕµÕ¸Ö‚Ö€Õ¶Õ¥Ö€Õ« Õ¯Õ¸Õ²Õ´Õ«Ö, Õ«Õ¶Õ¹ÕºÕ«Õ½Õ«Ö„ Õ¥Õ¶ GPS-Õ¨ Õ¯Õ¡Õ´ Õ¿Õ¥Õ²Õ¡Õ¤Ö€Õ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ®Õ¡Õ¼Õ¡ÕµÕ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶ Õ´Õ¡Õ¿Õ¸Ö‚ÖÕ¸Õ²Õ¶Õ¥Ö€Õ¨:"</string>
+ <string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¥Õ¬ Õ¿Õ¥Õ²Õ¡Õ¤Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶ Õ¿Ö€Õ¡Õ´Õ¡Õ¤Ö€Õ¸Õ² Õ°Õ¡Õ¾Õ¥Õ¬Õ¾ÕµÕ¡Õ¬ Õ°Ö€Õ¡Õ´Õ¡Õ¶Õ¶Õ¥Ö€"</string>
+ <string name="permdesc_accessLocationExtraCommands" msgid="5945166642335800763">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¥Õ¬ Õ¿Õ¥Õ²Õ¡Õ¤Ö€Õ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ®Õ¡Õ¼Õ¡ÕµÕ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶ Õ´Õ¡Õ¿Õ¸Ö‚ÖÕ¸Õ²Õ¶Õ¥Ö€Õ« Õ¬Ö€Õ¡ÖÕ¸Ö‚ÖÕ«Õ¹ Õ°Ö€Õ¡Õ´Õ¡Õ¶Õ¶Õ¥Ö€Õ¨: ÕÕ¡ Õ¯Õ¡Ö€Õ¸Õ² Õ§ Õ©Õ¸Ö‚ÕµÕ¬ Õ¿Õ¡Õ¬Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ­Õ¡Õ¶Õ£Õ¡Ö€Õ¥Õ¬ GPS-Õ« Õ¯Õ¡Õ´ Õ¡ÕµÕ¬ Õ¿Õ¥Õ²Õ¡Õ¶Ö„Õ« Õ¡Õ²Õ¢ÕµÕ¸Ö‚Ö€Õ¶Õ¥Ö€Õ« Õ¡Õ·Õ­Õ¡Õ¿Õ¡Õ¶Ö„Õ«Õ¶:"</string>
+ <string name="permlab_installLocationProvider" msgid="6578101199825193873">"Õ¿Õ¥Õ²Õ¡Õ¤Ö€Õ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ®Õ¡Õ¼Õ¡ÕµÕ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶ Õ´Õ¡Õ¿Õ¸Ö‚ÖÕ¸Õ²Õ« Õ¿Õ¥Õ²Õ¡Õ¤Ö€Õ´Õ¡Õ¶ Õ©Õ¸Ö‚ÕµÕ¬Õ¿Õ¾Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶"</string>
+ <string name="permdesc_installLocationProvider" msgid="9066146120470591509">"ÕÕ¿Õ¥Õ²Õ®Õ¥Õ¬ Õ¯Õ¥Õ²Õ® Õ¿Õ¥Õ²Õ¡Õ¶Ö„Õ« Õ¡Õ²Õ¢ÕµÕ¸Ö‚Ö€Õ¶Õ¥Ö€` ÖƒÕ¸Ö€Õ±Õ¡Ö€Õ¯Õ´Õ¡Õ¶ Õ¯Õ¡Õ´ Õ¿Õ¥Õ²Õ¡Õ¤Ö€Õ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ¶Õ¸Ö€ Õ®Õ¡Õ¼Õ¡ÕµÕ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶ Õ´Õ¡Õ¿Õ¸Ö‚ÖÕ¸Õ²Õ« Õ¿Õ¥Õ²Õ¡Õ¤Ö€Õ´Õ¡Õ¶ Õ°Õ¡Õ´Õ¡Ö€: ÕÕ¡ Õ°Õ¶Õ¡Ö€Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶ Õ§ Õ¿Õ¡Õ¬Õ«Õ½, Õ¸Ö€ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶ Õ¡Õ¶Õ¿Õ¥Õ½Õ« Õ¿Õ¥Õ²Õ¡Õ¤Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Ö‡/Õ¯Õ¡Õ´ Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ«Õ³Õ¡Õ¯Õ¨` Õ¿Ö€Õ¡Õ´Õ¡Õ¤Ö€Õ¾Õ¡Õ® Õ¿Õ¥Õ²Õ¡Õ¶Ö„Õ« Õ¡ÕµÕ¬ Õ¡Õ²Õ¢ÕµÕ¸Ö‚Ö€Õ¶Õ¥Ö€Õ« Õ¯Õ¸Õ²Õ´Õ«Ö, Õ«Õ¶Õ¹ÕºÕ«Õ½Õ«Ö„ Õ¥Õ¶ GPS-Õ¨ Õ¯Õ¡Õ´ Õ¿Õ¥Õ²Õ¡Õ¤Ö€Õ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ®Õ¡Õ¼Õ¡ÕµÕ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶ Õ´Õ¡Õ¿Õ¸Ö‚ÖÕ¸Õ²Õ¶Õ¥Ö€Õ¨:"</string>
+ <string name="permlab_accessFineLocation" msgid="1191898061965273372">"Õ³Õ·Õ£Ö€Õ«Õ¿ Õ¾Õ¡ÕµÖ€Õ¨ (Õ¨Õ½Õ¿ GPS-Õ« և ÖÕ¡Õ¶ÖÕ«)"</string>
+ <string name="permdesc_accessFineLocation" msgid="5295047563564981250">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ½Õ¿Õ¡Õ¶Õ¡Õ¬ Õ±Õ¥Ö€ Õ³Õ·Õ£Ö€Õ«Õ¿ Õ¿Õ¥Õ²Õ¡Õ¤Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨` Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¥Õ¬Õ¸Õ¾ Ô³Õ¬Õ¸Õ¢Õ¡Õ¬ Ô´Õ«Ö€Ö„Õ¡Õ¾Õ¸Ö€Õ´Õ¡Õ¶ Õ€Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ¨ (GPS) Õ¯Õ¡Õ´ ÖÕ¡Õ¶ÖÕ¡ÕµÕ«Õ¶ Õ¿Õ¥Õ²Õ¡Õ¶Ö„Õ« Õ¡Õ²Õ¢ÕµÕ¸Ö‚Ö€Õ¶Õ¥Ö€Õ¨, Õ«Õ¶Õ¹ÕºÕ¥Õ½ Ö…Ö€Õ«Õ¶Õ¡Õ¯` Õ¢Õ»Õ»Õ¡ÕµÕ«Õ¶ Õ¡Õ·Õ¿Õ¡Ö€Õ¡Õ¯Õ¶Õ¥Ö€Õ¨ Ö‡ Wi-Fi-Õ¨: Ô±ÕµÕ½ Õ¿Õ¥Õ²Õ¡Õ¤Ö€Õ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ®Õ¡Õ¼Õ¡ÕµÕ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨ ÕºÕ¥Õ¿Ö„ Õ§ Õ´Õ«Õ¡ÖÕ¾Õ¥Õ¶ Ö‡ Õ°Õ¡Õ½Õ¡Õ¶Õ¥Õ¬Õ« Õ¬Õ«Õ¶Õ¥Õ¶ Õ±Õ¥Ö€ Õ½Õ¡Ö€Ö„Õ« Õ°Õ¡Õ´Õ¡Ö€, Õ¸Ö€ÕºÕ¥Õ½Õ¦Õ« Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶ Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ« Õ¤Ö€Õ¡Õ¶Ö„: Õ€Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ¨ Õ¯Õ¡Ö€Õ¸Õ² են սա Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¥Õ¬` Õ¸Ö€Õ¸Õ·Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€ Õ±Õ¥Ö€ Õ£Õ¿Õ¶Õ¾Õ¥Õ¬Õ¸Ö‚ Õ¾Õ¡ÕµÖ€Õ¨ Ö‡ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Õ¶ Õ½ÕºÕ¡Õ¼Õ¥Õ¬ Õ´Õ¡Ö€Õ¿Õ¯Õ¸Öի լրաÖÕ¸Ö‚ÖÕ«Õ¹ Õ¬Õ«ÖÖ„:"</string>
+ <string name="permlab_accessCoarseLocation" msgid="4887895362354239628">"Õ´Õ¸Õ¿Õ¡Õ¾Õ¸Ö€ Õ¿Õ¥Õ²Õ¡Õ¤Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ (ÖÕ¡Õ¶ÖÕ¡ÕµÕ«Õ¶)"</string>
+ <string name="permdesc_accessCoarseLocation" msgid="2538200184373302295">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ½Õ¿Õ¡Õ¶Õ¡Õ¬ Õ±Õ¥Ö€ Õ´Õ¸Õ¿Õ¡Õ¾Õ¸Ö€ Õ¿Õ¥Õ²Õ¡Õ¤Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨: Ô±ÕµÕ½ Õ¿Õ¥Õ²Õ¡Õ¤Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Õ½Õ¿Õ¡ÖÕ¾Õ¸Ö‚Õ´ Õ§ Õ¿Õ¥Õ²Õ¡Õ¶Ö„Õ« Õ®Õ¡Õ¼Õ¡ÕµÕ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ« Õ¯Õ¸Õ²Õ´Õ«Ö, Õ«Õ¶Õ¹ÕºÕ¥Õ½ Ö…Ö€Õ«Õ¶Õ¡Õ¯` Õ¢Õ»Õ»Õ¡ÕµÕ«Õ¶ Õ¡Õ·Õ¿Õ¡Ö€Õ¡Õ¯Õ¶Õ¥Ö€Õ«Ö Ö‡ Wi-Fi-Õ«Ö: Ô±ÕµÕ½ Õ¿Õ¥Õ²Õ¡Õ¶Ö„Õ« Õ®Õ¡Õ¼Õ¡ÕµÕ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨ ÕºÕ¥Õ¿Ö„ Õ§ Õ´Õ«Õ¡ÖÕ¾Õ¡Õ® Ö‡ Õ°Õ¡Õ½Õ¡Õ¶Õ¥Õ¬Õ« Õ¬Õ«Õ¶Õ¥Õ¶ Õ±Õ¥Ö€ Õ½Õ¡Ö€Ö„Õ«Õ¶, Õ¸Ö€ÕºÕ¥Õ½Õ¦Õ« Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶ Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ« Õ¤Ö€Õ¡Õ¶Ö„: Õ€Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ¨ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Õ¶ Õ½Õ¡ Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¥Õ¬` Õ±Õ¥Ö€ Õ´Õ¸Õ¿Õ¡Õ¾Õ¸Ö€ Õ£Õ¿Õ¶Õ¾Õ¥Õ¬Õ¸Ö‚ Õ¾Õ¡ÕµÖ€Õ¨ Õ¸Ö€Õ¸Õ·Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€:"</string>
+ <string name="permlab_accessSurfaceFlinger" msgid="2363969641792388947">"Õ´Õ¸Ö‚Õ¿Ö„ SurfaceFlinger"</string>
+ <string name="permdesc_accessSurfaceFlinger" msgid="1041619516733293551">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¥Õ¬ SurfaceFlinger ÖÕ¡Õ®Ö€ Õ´Õ¡Õ¯Õ¡Ö€Õ¤Õ¡Õ¯Õ« Õ£Õ¸Ö€Õ®Õ¡Õ¼Õ¸Ö‚ÕµÕ©Õ¶Õ¥Ö€Õ¨:"</string>
+ <string name="permlab_readFrameBuffer" msgid="6690504248178498136">"Õ¯Õ¡Ö€Õ¤Õ¡Õ¬ Õ·Ö€Õ»Õ¡Õ¶Õ¡Õ¯Õ« ÕºÕ¡Õ°Õ¶Õ¡Õ¯Õ¨"</string>
+ <string name="permdesc_readFrameBuffer" msgid="4937405521809454680">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¯Õ¡Ö€Õ¤Õ¡Õ¬ Õ·Ö€Õ»Õ¡Õ¶Õ¡Õ¯Õ« ÕºÕ¡Õ°Õ¶Õ¡Õ¯Õ« Õ¢Õ¸Õ¾Õ¡Õ¶Õ¤Õ¡Õ¯Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨:"</string>
+ <string name="permlab_accessInputFlinger" msgid="5348635270689553857">"Õ´Õ¸Ö‚Õ¿Ö„ Õ£Õ¸Ö€Õ®Õ¥Õ¬ InputFlinger"</string>
+ <string name="permdesc_accessInputFlinger" msgid="2104864941201226616">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ®Ö€Õ¡Õ£Ö€Õ«Õ¶ Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¥Õ¬ InputFlinger ÖÕ¡Õ®Ö€ Õ´Õ¡Õ¯Õ¡Ö€Õ¤Õ¡Õ¯Õ« Õ£Õ¸Ö€Õ®Õ¡Õ¼Õ¸Ö‚ÕµÕ©Õ¶Õ¥Ö€Õ¨:"</string>
+ <string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¥Õ¬ WiFi-Õ« ÖÕ¸Ö‚ÖÕ¡Õ¤Ö€Õ¸Ö‚Õ´Õ¨"</string>
+ <string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¥Õ¬ Ö‡ Õ´Õ«Õ¡Õ¶Õ¡Õ¬ WiFi ÖÕ¸Ö‚ÖÕ¡Õ¤Ö€Õ«Õ¹Õ¶Õ¥Ö€Õ«Õ¶:"</string>
+ <string name="permlab_controlWifiDisplay" msgid="393641276723695496">"Õ¯Õ¡Õ¼Õ¡Õ¾Õ¡Ö€Õ¥Õ¬ Wifi-Õ« ÖÕ¸Ö‚ÖÕ¡Õ¤Ö€Õ¸Ö‚Õ´Õ¨"</string>
+ <string name="permdesc_controlWifiDisplay" msgid="4543912292681826986">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¯Õ¡Õ¼Õ¡Õ¾Õ¡Ö€Õ¥Õ¬ WiFi ÖÕ¸Ö‚ÖÕ¡Õ¤Ö€Õ«Õ¹Õ¶Õ¥Ö€Õ« ÖÕ¡Õ®Ö€ Õ´Õ¡Õ¯Õ¡Ö€Õ¤Õ¡Õ¯Õ« Õ£Õ¸Ö€Õ®Õ¡Õ¼Õ¸Ö‚ÕµÕ©Õ¶Õ¥Ö€Õ¨:"</string>
+ <string name="permlab_captureAudioOutput" msgid="6857134498402346708">"ÕºÕ¡Õ°Õ¥Õ¬ Õ¡Õ¸Ö‚Õ¤Õ«Õ¸ Õ¡Ö€Õ¿Õ¡Õ®Õ¸Ö‚Õ´Õ¨"</string>
+ <string name="permdesc_captureAudioOutput" msgid="6210597754212208853">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ®Ö€Õ¡Õ£Ö€Õ«Õ¶ ÕºÕ¡Õ°Õ¥Õ¬ Ö‡ Õ¾Õ¥Ö€Õ¡Õ°Õ²Õ¥Õ¬ Õ¡Õ¸Ö‚Õ¤Õ«Õ¸ Õ¡Ö€Õ¿Õ¡Õ®Õ¸Ö‚Õ´Õ¨:"</string>
+ <string name="permlab_captureVideoOutput" msgid="2246828773589094023">"ÕºÕ¡Õ°Õ¥Õ¬ Õ¾Õ«Õ¤Õ¥Õ¸ Õ¡Ö€Õ¿Õ¡Õ®Õ¸Ö‚Õ´Õ¨"</string>
+ <string name="permdesc_captureVideoOutput" msgid="359481658034149860">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ®Ö€Õ¡Õ£Ö€Õ«Õ¶ ÕºÕ¡Õ°Õ¥Õ¬ Ö‡ Õ¾Õ¥Ö€Õ¡Õ°Õ²Õ¥Õ¬ Õ¾Õ«Õ¤Õ¥Õ¸ Õ¡Ö€Õ¿Õ¡Õ®Õ¸Ö‚Õ´Õ¨:"</string>
+ <string name="permlab_captureSecureVideoOutput" msgid="7815398969303382016">"ÕºÕ¡Õ°Õ¥Õ¬ Õ¡Õ¶Õ¾Õ¿Õ¡Õ¶Õ£ Õ¾Õ«Õ¤Õ¥Õ¸ Õ¡Ö€Õ¿Õ¡Õ®Õ¸Ö‚Õ´Õ¨"</string>
+ <string name="permdesc_captureSecureVideoOutput" msgid="2779793064709350289">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ®Ö€Õ¡Õ£Ö€Õ«Õ¶ ÕºÕ¡Õ°Õ¥Õ¬ Ö‡ Õ¾Õ¥Ö€Õ¡Õ°Õ²Õ¥Õ¬ Õ¡Õ¶Õ¾Õ¿Õ¡Õ¶Õ£ Õ¾Õ«Õ¤Õ¥Õ¸ Õ¡Ö€Õ¿Õ¡Õ®Õ¸Ö‚Õ´Õ¨:"</string>
+ <string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"ÖƒÕ¸Õ­Õ¥Õ¬ Õ±Õ¥Ö€ Õ¡Õ¸Ö‚Õ¤Õ«Õ¸ Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´Õ¶Õ¥Ö€Õ¨"</string>
+ <string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"Թույլ է տալիս հավելվածին փոփոխել ձայնանյութի գլոբալ կարգավորումները, ինչպես օրինակ` ձայնը և թե որ խոսափողն է օգտագործված արտածման համար:"</string>
+ <string name="permlab_recordAudio" msgid="3876049771427466323">"Õ±Õ¡ÕµÕ¶Õ¡Õ£Ö€Õ¥Õ¬ Õ±Õ¡ÕµÕ¶Õ¡Õ¶ÕµÕ¸Ö‚Õ©"</string>
+ <string name="permdesc_recordAudio" msgid="4906839301087980680">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¢Õ¡Ö€Õ±Ö€Õ¡Õ­Õ¸Õ½Õ¸Õ¾ Õ±Õ¡ÕµÕ¶Õ¡Õ£Ö€Õ¥Õ¬ Õ±Õ¡ÕµÕ¶Õ¡Õ¶ÕµÕ¸Ö‚Õ©: Ô±ÕµÕ½ Õ©Õ¸Ö‚ÕµÕ¬Õ¿Õ¾Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Õ°Õ¶Õ¡Ö€Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ±Õ¡ÕµÕ¶Õ¡Õ¶ÕµÕ¸Ö‚Õ© Õ±Õ¡ÕµÕ¶Õ¡Õ£Ö€Õ¥Õ¬ ÖÕ¡Õ¶Õ¯Õ¡ÖÕ¡Õ® ÕªÕ¡Õ´Õ¡Õ¶Õ¡Õ¯` Õ¡Õ¼Õ¡Õ¶Ö Õ±Õ¥Ö€ Õ°Õ¡Õ½Õ¿Õ¡Õ¿Õ´Õ¡Õ¶:"</string>
+ <string name="permlab_camera" msgid="3616391919559751192">"Õ¬Õ¸Ö‚Õ½Õ¡Õ¶Õ¯Õ¡Ö€Õ¥Õ¬ Ö‡ Õ¿Õ¥Õ½Õ¡Õ¶Õ¯Õ¡Ö€Õ¥Õ¬"</string>
+ <string name="permdesc_camera" msgid="8497216524735535009">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Ö†Õ¸Õ¿Õ¸Õ­ÖÕ«Õ¯Õ¸Õ¾ Õ¬Õ¸Ö‚Õ½Õ¡Õ¶Õ¯Õ¡Ö€Õ¥Õ¬ Ö‡ Õ¿Õ¥Õ½Õ¡Õ¶Õ¯Õ¡Ö€Õ¥Õ¬: Ô±ÕµÕ½ Õ©Õ¸Ö‚ÕµÕ¬Õ¿Õ¾Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Õ°Õ¶Õ¡Ö€Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¥Õ¬ Ö†Õ¸Õ¿Õ¸Õ­ÖÕ«Õ¯Õ¨ ÖÕ¡Õ¶Õ¯Õ¡ÖÕ¡Õ® ÕªÕ¡Õ´Õ¡Õ¶Õ¡Õ¯` Õ¡Õ¼Õ¡Õ¶Ö Õ±Õ¥Ö€ Õ°Õ¡Õ½Õ¿Õ¡Õ¿Õ´Õ¡Õ¶:"</string>
+ <string name="permlab_cameraDisableTransmitLed" msgid="2651072630501126222">"Õ¡Õ¶Õ»Õ¡Õ¿Õ¥Õ¬ ÖƒÕ¸Õ­Õ¡Õ¶ÖÕ¸Õ² LED ÖÕ¸Ö‚ÖÕ«Õ¹Õ¨, Õ¥Ö€Õ¢ Ö†Õ¸Õ¿Õ¸Õ­ÖÕ«Õ¯Õ¨ Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¾Õ¸Ö‚Õ´ Õ§"</string>
+ <string name="permdesc_cameraDisableTransmitLed" msgid="4764585465480295341">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ¶Õ¡Õ­Õ¡ÕºÕ¥Õ½ Õ¿Õ¥Õ²Õ¡Õ¤Ö€Õ¾Õ¡Õ® Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ¡ÕµÕ«Õ¶ Õ®Ö€Õ¡Õ£Ö€Õ«Õ¶ Õ¡Õ¶Õ»Õ¡Õ¿Õ¥Õ¬ Ö†Õ¸Õ¿Õ¸Õ­ÖÕ«Õ¯Õ« Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ´Õ¡Õ¶ LED ÖÕ¸Ö‚ÖÕ«Õ¹Õ¨:"</string>
+ <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"Õ´Õ·Õ¿Õ¡ÕºÕ¥Õ½ Õ¡Õ¶Õ»Õ¡Õ¿Õ¥Õ¬ Õ£Ö€Õ¡Õ½Õ¡Õ¬Õ«Õ¯Õ¨"</string>
+ <string name="permlab_brick" product="default" msgid="8337817093326370537">"Õ¨Õ¶Õ¤Õ´Õ«Õ·Õ¿ Õ¯Õ¡Õ½Õ¥ÖÕ¶Õ¥Õ¬ Õ°Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ¨"</string>
+ <string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¨Õ¶Õ¤Õ´Õ«Õ·Õ¿ Õ¡Õ¶Õ»Õ¡Õ¿Õ¥Õ¬ Õ¡Õ´Õ¢Õ¸Õ²Õ» Õ£Ö€Õ¡Õ½Õ¡Õ¬Õ«Õ¯Õ¨: ÕÕ¡ Õ·Õ¡Õ¿ Õ¾Õ¿Õ¡Õ¶Õ£Õ¡Õ¾Õ¸Ö€ Õ§:"</string>
+ <string name="permdesc_brick" product="default" msgid="5788903297627283099">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¨Õ¶Õ¤Õ´Õ«Õ·Õ¿ Õ¡Õ¶Õ»Õ¡Õ¿Õ¥Õ¬ Õ¡Õ´Õ¢Õ¸Õ²Õ» Õ°Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ¨: ÕÕ¡ Õ·Õ¡Õ¿ Õ¾Õ¿Õ¡Õ¶Õ£Õ¡Õ¾Õ¸Ö€ Õ§:"</string>
+ <string name="permlab_reboot" product="tablet" msgid="3436634972561795002">"Õ½Õ¿Õ«ÕºÕ¥Õ¬, Õ¸Ö€ Õ£Ö€Õ¡Õ½Õ¡Õ¬Õ«Õ¯Õ¨ Õ¾Õ¥Ö€Õ¡Õ¢Õ¥Õ¼Õ¶Õ¾Õ«"</string>
+ <string name="permlab_reboot" product="default" msgid="2898560872462638242">"Õ½Õ¿Õ«ÕºÕ¥Õ¬, Õ¸Ö€ Õ°Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ¨ Õ¾Õ¥Ö€Õ¡Õ¢Õ¥Õ¼Õ¶Õ¾Õ«"</string>
+ <string name="permdesc_reboot" product="tablet" msgid="8172056180063700741">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ½Õ¿Õ«ÕºÕ¥Õ¬, Õ¸Ö€ Õ£Ö€Õ¡Õ½Õ¡Õ¬Õ«Õ¯Õ¨ Õ¾Õ¥Ö€Õ¡Õ¢Õ¥Õ¼Õ¶Õ¾Õ«:"</string>
+ <string name="permdesc_reboot" product="default" msgid="5326008124289989969">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ½Õ¿Õ«ÕºÕ¥Õ¬, Õ¸Ö€ Õ°Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ¨ Õ¾Õ¥Ö€Õ¡Õ¢Õ¥Õ¼Õ¶Õ¾Õ«:"</string>
+ <string name="permlab_mount_unmount_filesystems" product="nosdcard" msgid="2927361537942591841">"Õ´Õ¸Ö‚Õ¿Ö„ Õ¸Ö‚Õ¶Õ¥Õ¶Õ¡Õ¬ USB Õ¯Ö€Õ«Õ¹Õ« Ö†Õ¡ÕµÕ¬Õ¡ÕµÕ«Õ¶ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£"</string>
+ <string name="permlab_mount_unmount_filesystems" product="default" msgid="4402305049890953810">"Õ´Õ¸Ö‚Õ¿Ö„ Õ¸Ö‚Õ¶Õ¥Õ¶Õ¡Õ¬ SD Ö„Õ¡Ö€Õ¿Õ« Ö†Õ¡ÕµÕ¬Õ¡ÕµÕ«Õ¶ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£"</string>
+ <string name="permdesc_mount_unmount_filesystems" msgid="1829290701658992347">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ´Õ«Õ¡ÖÕ¶Õ¥Õ¬ Ö‡ Õ¡Õ¶Õ»Õ¡Õ¿Õ¥Õ¬ Õ·Õ¡Ö€ÕªÕ¡Õ¯Õ¡Õ¶ Õ¯Ö€Õ«Õ¹Õ¶Õ¥Ö€Õ« Ö†Õ¡ÕµÕ¬Õ¡ÕµÕ«Õ¶ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ¥Ö€Õ¨:"</string>
+ <string name="permlab_mount_format_filesystems" product="nosdcard" msgid="6227819582624904972">"Õ»Õ¶Õ»Õ¥Õ¬ USB Õ¯Ö€Õ«Õ¹Õ¨"</string>
+ <string name="permlab_mount_format_filesystems" product="default" msgid="262582698639274056">"Õ»Õ¶Õ»Õ¥Õ¬ SD Ö„Õ¡Ö€Õ¿Õ¨"</string>
+ <string name="permdesc_mount_format_filesystems" msgid="8784268246779198627">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Ö†Õ¸Ö€Õ´Õ¡Õ¿Õ¡Õ¾Õ¸Ö€Õ¥Õ¬ Õ·Õ¡Ö€ÕªÕ¡Õ¯Õ¡Õ¶ Õ¯Ö€Õ«Õ¹Õ¨:"</string>
+ <string name="permlab_asec_access" msgid="3411338632002193846">"Õ¿Õ¥Õ²Õ¥Õ¯Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€ Õ½Õ¿Õ¡Õ¶Õ¡Õ¬ Õ¶Õ¥Ö€Ö„Õ«Õ¶ ÕºÕ¡Õ°Õ¸ÖÕ« Õ¾Õ¥Ö€Õ¡Õ¢Õ¥Ö€ÕµÕ¡Õ¬"</string>
+ <string name="permdesc_asec_access" msgid="3094563844593878548">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ հավելվածին ստանալ Õ¿Õ¥Õ²Õ¥Õ¯Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€ Õ¶Õ¥Ö€Ö„Õ«Õ¶ ÕºÕ¡Õ°Õ¸ÖÕ« Õ¾Õ¥Ö€Õ¡Õ¢Õ¥Ö€ÕµÕ¡Õ¬:"</string>
+ <string name="permlab_asec_create" msgid="6414757234789336327">"Õ½Õ¿Õ¥Õ²Õ®Õ¥Õ¬ Õ¶Õ¥Ö€Ö„Õ«Õ¶ ÕºÕ¡Õ°Õ¸Ö"</string>
+ <string name="permdesc_asec_create" msgid="4558869273585856876">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ½Õ¿Õ¥Õ²Õ®Õ¥Õ¬ Õ¶Õ¥Ö€Ö„Õ«Õ¶ ÕºÕ¡Õ°Õ¸Ö:"</string>
+ <string name="permlab_asec_destroy" msgid="526928328301618022">"Õ¸Õ¹Õ¶Õ¹Õ¡ÖÕ¶Õ¥Õ¬ Õ¶Õ¥Ö€Ö„Õ«Õ¶ ÕºÕ¡Õ°Õ¸ÖÕ¨"</string>
+ <string name="permdesc_asec_destroy" msgid="7218749286145526537">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¸Õ¹Õ¶Õ¹Õ¡ÖÕ¶Õ¥Õ¬ Õ¶Õ¥Ö€Ö„Õ«Õ¶ ÕºÕ¡Õ°Õ¸ÖÕ¨:"</string>
+ <string name="permlab_asec_mount_unmount" msgid="8877998101944999386">"Õ´Õ«Õ¡ÖÕ¶Õ¥Õ¬ Õ¯Õ¡Õ´ Õ¡Õ¶Õ»Õ¡Õ¿Õ¥Õ¬ Õ¶Õ¥Ö€Ö„Õ«Õ¶ ÕºÕ¡Õ°Õ¸ÖÕ¨"</string>
+ <string name="permdesc_asec_mount_unmount" msgid="3451360114902490929">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ´Õ«Õ¡ÖÕ¶Õ¥Õ¬/Õ¡Õ¶Õ»Õ¡Õ¿Õ¥Õ¬ Õ¶Õ¥Ö€Ö„Õ«Õ¶ ÕºÕ¡Õ°Õ¸ÖÕ¨:"</string>
+ <string name="permlab_asec_rename" msgid="7496633954080472417">"Õ¾Õ¥Ö€Õ¡Õ¶Õ¾Õ¡Õ¶Õ¥Õ¬ Õ¶Õ¥Ö€Ö„Õ«Õ¶ ÕºÕ¡Õ°Õ¸ÖÕ¨"</string>
+ <string name="permdesc_asec_rename" msgid="1794757588472127675">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¾Õ¥Ö€Õ¡Õ¶Õ¾Õ¡Õ¶Õ¥Õ¬ Õ¶Õ¥Ö€Ö„Õ«Õ¶ ÕºÕ¡Õ°Õ¸ÖÕ¨:"</string>
+ <string name="permlab_vibrate" msgid="7696427026057705834">"Õ¯Õ¡Õ¼Õ¡Õ¾Õ¡Ö€Õ¥Õ¬ Õ©Ö€Õ©Õ¼Õ¸Ö‚Õ´Õ¨"</string>
+ <string name="permdesc_vibrate" msgid="6284989245902300945">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¯Õ¡Õ¼Õ¡Õ¾Õ¡Ö€Õ¥Õ¬ Õ©Ö€Õ©Õ¼Õ¸ÖÕ¨:"</string>
+ <string name="permlab_flashlight" msgid="2155920810121984215">"Õ¯Õ¡Õ¼Õ¡Õ¾Õ¡Ö€Õ¥Õ¬ Õ¬Õ¡ÕºÕ¿Õ¥Ö€Õ¨"</string>
+ <string name="permdesc_flashlight" msgid="6522284794568368310">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¯Õ¡Õ¼Õ¡Õ¾Õ¡Ö€Õ¥Õ¬ Õ¬Õ¡ÕºÕ¿Õ¥Ö€Õ¨:"</string>
+ <string name="permlab_manageUsb" msgid="1113453430645402723">"Õ¯Õ¡Õ¼Õ¡Õ¾Õ¡Ö€Õ¥Õ¬ Õ¶Õ¡Õ­Õ¡ÕºÕ¡Õ¿Õ¾Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨ Ö‡ Õ©Õ¸Ö‚ÕµÕ¬Õ¿Õ¾Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨ USB Õ½Õ¡Ö€Ö„Õ¥Ö€Õ« Õ°Õ¡Õ´Õ¡Ö€"</string>
+ <string name="permdesc_manageUsb" msgid="7776155430218239833">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¯Õ¡Õ¼Õ¡Õ¾Õ¡Ö€Õ¥Õ¬ Õ¶Õ¡Õ­Õ¡Õ½Õ«Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¶ Õ¸Ö‚ Õ©Õ¸Ö‚ÕµÕ¬Õ¿Õ¾Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨ USB Õ½Õ¡Ö€Ö„Õ¥Ö€Õ« Õ°Õ¡Õ´Õ¡Ö€:"</string>
+ <string name="permlab_accessMtp" msgid="4953468676795917042">"Õ¯Õ«Ö€Õ¡Õ¼Õ¥Õ¬ MTP ÕºÖ€Õ¸Õ¿Õ¸Õ¯Õ¸Õ¬Õ¨"</string>
+ <string name="permdesc_accessMtp" msgid="6532961200486791570">"Մուտքի հնարավորություն է տալիս միջուկի MTP սարքավարին MTP USB պրոտոկոլը կիրառելու համար:"</string>
+ <string name="permlab_hardware_test" msgid="4148290860400659146">"ÖƒÕ¸Ö€Õ±Õ¡Ö€Õ¯Õ¥Õ¬ Õ½Õ¡Ö€Ö„Õ¨"</string>
+ <string name="permdesc_hardware_test" msgid="6597964191208016605">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¯Õ¡Õ¼Õ¡Õ¾Õ¡Ö€Õ¥Õ¬ Õ¿Õ¡Ö€Õ¢Õ¥Ö€ Õ¡Ö€Õ¿Õ¡Ö„Õ«Õ¶ Õ½Õ¡Ö€Ö„Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´Õ¥Ö€` Õ½Õ¡Ö€Ö„Õ¡Õ·Õ¡Ö€Õ« ÖƒÕ¸Ö€Õ±Õ¡Ö€Õ¯Õ´Õ¡Õ¶ Õ¶ÕºÕ¡Õ¿Õ¡Õ¯Õ¸Õ¾:"</string>
+ <string name="permlab_callPhone" msgid="3925836347681847954">"Õ¸Ö‚Õ²Õ²Õ¡Õ¯Õ«Õ¸Ö€Õ¥Õ¶ Õ¦Õ¡Õ¶Õ£Õ¥Õ¬ Õ°Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ¡Õ°Õ¡Õ´Õ¡Ö€Õ¶Õ¥Ö€Õ«Õ¶"</string>
+ <string name="permdesc_callPhone" msgid="3740797576113760827">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¦Õ¡Õ¶Õ£Õ¥Õ¬ Õ°Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ¡Õ°Õ¡Õ´Õ¡Ö€Õ¶Õ¥Ö€Õ«Õ¶ Õ¡Õ¼Õ¡Õ¶Ö Õ±Õ¥Ö€ Õ´Õ«Õ»Õ¡Õ´Õ¿Õ¸Ö‚Õ©ÕµÕ¡Õ¶: ÕÕ¡ Õ¯Õ¡Ö€Õ¸Õ² Õ§ Õ°Õ¡Õ¶Õ£Õ¥ÖÕ¶Õ¥Õ¬ Õ¡Õ¶Õ¯Õ¡Õ¶Õ­Õ¡Õ¿Õ¥Õ½Õ¥Õ¬Õ« Õ£Õ¡Õ¶Õ±Õ¸Ö‚Õ´Õ¶Õ¥Ö€Õ« Õ¯Õ¡Õ´ Õ¦Õ¡Õ¶Õ£Õ¥Ö€Õ«: Õ†Õ¯Õ¡Õ¿Õ« Õ¸Ö‚Õ¶Õ¥ÖÕ¥Ö„, Õ¸Ö€ Õ½Õ¡ Õ©Õ¸Ö‚ÕµÕ¬ Õ¹Õ« Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¦Õ¡Õ¶Õ£Õ¥Õ¬ Õ¡Ö€Õ¿Õ¡Õ¯Õ¡Ö€Õ£ Õ«Ö€Õ¡Õ¾Õ«Õ³Õ¡Õ¯Õ¶Õ¥Ö€Õ« Õ°Õ¡Õ´Õ¡Ö€Õ¶Õ¥Ö€Õ«Õ¶: ÕŽÕ¶Õ¡Õ½Õ¡Ö€Õ¡Ö€ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ¨ Õ¯Õ¡Ö€Õ¸Õ² են ձեր Õ°Õ¡Õ·Õ¾Õ«Ö Õ¦Õ¡Õ¶Õ£Õ¥Ö€ Õ¯Õ¡Õ¿Õ¡Ö€Õ¥Õ¬` Õ¡Õ¼Õ¡Õ¶Ö Õ±Õ¥Ö€ Õ°Õ¡Õ½Õ¿Õ¡Õ¿Õ´Õ¡Õ¶:"</string>
+ <string name="permlab_callPrivileged" msgid="4198349211108497879">"Õ¸Ö‚Õ²Õ²Õ¡Õ¯Õ«Õ¸Ö€Õ¥Õ¶ Õ¦Õ¡Õ¶Õ£Õ¡Õ°Õ¡Ö€Õ¥Õ¬ Õ¸Ö€Ö‡Õ§ Õ°Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ¡Õ°Õ¡Õ´Õ¡Ö€Õ«"</string>
+ <string name="permdesc_callPrivileged" msgid="1689024901509996810">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¦Õ¡Õ¶Õ£Õ¥Õ¬ ÖÕ¡Õ¶Õ¯Õ¡ÖÕ¡Õ® Õ°Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ¡Õ°Õ¡Õ´Õ¡Ö€Õ«, Õ¡ÕµÕ¤ Õ©Õ¾Õ¸Ö‚Õ´` Õ¡Ö€Õ¿Õ¡Õ¯Õ¡Ö€Õ£ Õ«Ö€Õ¡Õ¾Õ«Õ³Õ¡Õ¯Õ¶Õ¥Ö€Õ« Õ°Õ¡Õ´Õ¡Ö€Õ¶Õ¥Ö€Õ«Õ¶` Õ¡Õ¼Õ¡Õ¶Ö Õ±Õ¥Ö€ Õ´Õ«Õ»Õ¡Õ´Õ¿Õ¸Ö‚Õ©ÕµÕ¡Õ¶: ÕŽÕ¶Õ¡Õ½Õ¡Ö€Õ¡Ö€ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ¨ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Õ¶ Õ¯Õ¡Õ¿Õ¡Ö€Õ¥Õ¬ Õ¡Õ¶ÖÕ¡Õ¶Õ¯Õ¡Õ¬Õ« Ö‡ Õ¡Õ¶Ö…Ö€Õ«Õ¶Õ¡Õ¯Õ¡Õ¶ Õ¦Õ¡Õ¶Õ£Õ¥Ö€ Õ¡Ö€Õ¿Õ¡Õ¯Õ¡Ö€Õ£ Õ«Ö€Õ¡Õ¾Õ«Õ³Õ¡Õ¯Õ¶Õ¥Ö€Õ« Õ®Õ¡Õ¼Õ¡ÕµÕ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ«Õ¶:"</string>
+ <string name="permlab_performCdmaProvisioning" product="tablet" msgid="4842576994144604821">"Õ¸Ö‚Õ²Õ²Õ¡Õ¯Õ«Õ¸Ö€Õ¥Õ¶ Õ½Õ¯Õ½Õ¥Õ¬ CDMA Õ£Ö€Õ¡Õ½Õ¡Õ¬Õ«Õ¯Õ« Õ¯Õ¡Õ£Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´Õ¨"</string>
+ <string name="permlab_performCdmaProvisioning" product="default" msgid="5604848095315421425">"Õ¸Ö‚Õ²Õ²Õ¡Õ¯Õ«Õ¸Ö€Õ¥Õ¶ Õ½Õ¯Õ½Õ¥Õ¬ CDMA Õ°Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ« Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´Õ¨"</string>
+ <string name="permdesc_performCdmaProvisioning" msgid="1994193538802314186">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ´Õ¥Õ¯Õ¶Õ¡Ö€Õ¯Õ¥Õ¬ CDMA-Õ« Õ¿Ö€Õ¡Õ´Õ¡Õ¤Ö€Õ¸Ö‚Õ´Õ¨: ÕŽÕ¶Õ¡Õ½Õ¡Ö€Õ¡Ö€ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ¨ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Õ¶ Õ¡Õ¶Õ¿Õ¥Õ²Õ« Õ½Õ¯Õ½Õ¥Õ¬ CDMA-Õ« Õ¿Ö€Õ¡Õ´Õ¡Õ¤Ö€Õ¸Ö‚Õ´:"</string>
+ <string name="permlab_locationUpdates" msgid="7785408253364335740">"Õ¾Õ¥Ö€Õ¡Õ°Õ½Õ¯Õ¥Õ¬ Õ¿Õ¥Õ²Õ¡Õ¶Ö„Õ« Õ©Õ¡Ö€Õ´Õ¡ÖÕ´Õ¡Õ¶ Õ®Õ¡Õ¶Õ¸Ö‚ÖÕ¸Ö‚Õ´Õ¶Õ¥Ö€Õ¨"</string>
+ <string name="permdesc_locationUpdates" msgid="1120741557891438876">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ´Õ«Õ¡ÖÕ¶Õ¥Õ¬ Õ¯Õ¡Õ´ Õ¡Õ¶Õ»Õ¡Õ¿Õ¥Õ¬ Õ¿Õ¥Õ²Õ¡Õ¶Ö„Õ« Õ©Õ¡Ö€Õ´Õ¡ÖÕ´Õ¡Õ¶ Õ®Õ¡Õ¶Õ¸Ö‚ÖÕ¸Ö‚Õ´Õ¶Õ¥Ö€Õ¨ Õ¼Õ¡Õ¤Õ«Õ¸ÕµÕ«Ö: ÕÕ¸Õ¾Õ¸Ö€Õ¡Õ¯Õ¡Õ¶ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ« Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ´Õ¡Õ¶ Õ°Õ¡Õ´Õ¡Ö€ Õ¹Õ§:"</string>
+ <string name="permlab_checkinProperties" msgid="7855259461268734914">"Õ´Õ¸Ö‚Õ¿Ö„ Õ£Õ¸Ö€Õ®Õ¥Õ¬ Õ£Ö€Õ¡Õ¶ÖÕ¡Õ¶Õ·Õ´Õ¡Õ¶ Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´Õ¶Õ¥Ö€"</string>
+ <string name="permdesc_checkinProperties" msgid="4024526968630194128">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¯Õ¡Ö€Õ¤Õ¡Õ¬/Õ£Ö€Õ¥Õ¬ Õ£Ö€Õ¡Õ¶ÖÕ¡Õ¶Õ·Õ´Õ¡Õ¶ Õ®Õ¡Õ¼Õ¡ÕµÕ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ¯Õ¸Õ²Õ´Õ«Ö Õ¾Õ¥Ö€Õ¢Õ¥Õ¼Õ¶Õ¾Õ¡Õ® Õ°Õ¡Õ¿Õ¯Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ« Õ´Õ¸Ö‚Õ¿Ö„Õ¨: ÕÕ¸Õ¾Õ¸Ö€Õ¡Õ¯Õ¡Õ¶ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ« Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ´Õ¡Õ¶ Õ°Õ¡Õ´Õ¡Ö€ Õ¹Õ§:"</string>
+ <string name="permlab_bindGadget" msgid="776905339015863471">"Õ¨Õ¶Õ¿Ö€Õ¥Õ¬ Õ¾Õ«Õ»Õ¥Õ©Õ¶Õ¥Ö€"</string>
+ <string name="permdesc_bindGadget" msgid="8261326938599049290">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ©Õ¥Õ¬Õ¡Õ¤Ö€Õ¥Õ¬ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ«Õ¶, Õ©Õ¥ Õ¸Ö€ Õ¾Õ«Õ»Õ¥Õ©Õ¶Õ¥Ö€Õ¨ Õ¸Ö€ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ« Õ´Õ«Õ»Õ¸ÖÕ¸Õ¾ Õ§ Õ°Õ¶Õ¡Ö€Õ¡Õ¾Õ¸Ö€ Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¥Õ¬: Ô±ÕµÕ½ Õ©Õ¸Ö‚ÕµÕ¬Õ¿Õ¾Õ¸Ö‚Õ©ÕµÕ¡Õ´Õ¢ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¨ Õ¯Õ¡Ö€Õ¸Õ² Õ§ Õ¡ÕµÕ¬ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ«Õ¶ Õ´Õ¸Ö‚Õ¿Ö„ Õ¿Õ¡Õ¬ Õ¤Õ¥ÕºÕ« Õ¡Õ¶Õ±Õ¶Õ¡Õ¯Õ¡Õ¶ Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€: ÕÕ¸Õ¾Õ¸Ö€Õ¡Õ¯Õ¡Õ¶ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ« Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ´Õ¡Õ¶ Õ°Õ¡Õ´Õ¡Ö€ Õ¹Õ§:"</string>
+ <string name="permlab_modifyPhoneState" msgid="8423923777659292228">"ÖƒÕ¸ÖƒÕ¸Õ­Õ¥Õ¬ Õ°Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ« Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ«Õ³Õ¡Õ¯Õ¨"</string>
+ <string name="permdesc_modifyPhoneState" msgid="1029877529007686732">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¯Õ¡Õ¼Õ¡Õ¾Õ¡Ö€Õ¥Õ¬ Õ½Õ¡Ö€Ö„Õ« Õ°Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ¡ÕµÕ«Õ¶ Õ£Õ¸Ö€Õ®Õ«Ö„Õ¶Õ¥Ö€Õ¨: Ô±ÕµÕ½ Õ©Õ¸Ö‚ÕµÕ¬Õ¿Õ¾Õ¸Ö‚Õ©ÕµÕ¡Õ´Õ¢ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¨ Õ¯Õ¡Ö€Õ¸Õ² Õ§ ÖƒÕ¸Õ­Õ¡Ö€Õ¯Õ¥Õ¬ ÖÕ¡Õ¶ÖÕ¥Ö€Õ¨, Õ´Õ«Õ¡ÖÕ¶Õ¥Õ¬Ö‡ Õ¡Õ¶Õ»Õ¡Õ¿Õ¥Õ¬ Õ°Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ« Õ¼Õ¡Õ¤Õ«Õ¸Õ¶ Ö‡ Õ¶Õ´Õ¡Õ¶ Õ¡ÕµÕ¬ Õ¢Õ¡Õ¶Õ¥Ö€` Õ¡Õ¼Õ¡Õ¶Ö Õ±Õ¥Õ¦ Õ¥Ö€Õ¢Ö‡Õ§ Õ¿Õ¥Õ²Õ¥Õ¯Õ¡ÖÕ¶Õ¥Õ¬Õ¸Ö‚:"</string>
+ <string name="permlab_readPhoneState" msgid="9178228524507610486">"Õ¯Õ¡Ö€Õ¤Õ¡Õ¬ Õ°Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ« Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ«Õ³Õ¡Õ¯Õ¨ Ö‡ Õ«Õ¶Ö„Õ¶Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨"</string>
+ <string name="permdesc_readPhoneState" msgid="1639212771826125528">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¥Õ¬ Õ½Õ¡Ö€Ö„Õ« Õ°Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ¡ÕµÕ«Õ¶ Õ£Õ¸Ö€Õ®Õ«Ö„Õ¶Õ¥Ö€Õ¨: Ô±ÕµÕ½ Õ©Õ¸Ö‚ÕµÕ¬Õ¿Õ¾Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ°Õ¶Õ¡Ö€Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ¸Ö€Õ¸Õ·Õ¥Õ¬ Õ°Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ¡Õ°Õ¡Õ´Õ¡Ö€Õ¨ Ö‡ Õ½Õ¡Ö€Ö„Õ« ID-Õ¶Õ¥Ö€Õ¨, Õ¡Ö€Õ¤ÕµÕ¸Ö„ Õ¦Õ¡Õ¶Õ£Õ¨ Õ¡Õ¯Õ¿Õ«Õ¾ Õ§ Ö‡ Õ´Õ«Õ¡ÖÕ¾Õ¡Õ® Õ¦Õ¡Õ¶Õ£Õ« Õ°Õ¥Õ¼Õ¡Õ¯Õ¡ Õ°Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ¡Õ°Õ¡Õ´Õ¡Ö€Õ¨:"</string>
+ <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"Õ¦Õ¥Ö€Õ® ÕºÕ¡Õ°Õ¥Õ¬ Õ£Ö€Õ¡Õ½Õ¡Õ¬Õ«Õ¯Õ¨ Ö„Õ¶Õ¥Õ¬Õ¸Ö‚Ö"</string>
+ <string name="permlab_wakeLock" product="default" msgid="573480187941496130">"Õ¯Õ¡Õ¶Õ­Õ¥Õ¬ Õ°Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ« Ö„Õ¶Õ« Õ¼Õ¥ÕªÕ«Õ´Õ«Õ¶ Õ¡Õ¶ÖÕ¶Õ¥Õ¬Õ¨"</string>
+ <string name="permdesc_wakeLock" product="tablet" msgid="7311319824400447868">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¯Õ¡Õ¶Õ­Õ¥Õ¬ Õ£Ö€Õ¡Õ½Õ¡Õ¬Õ«Õ¯Õ«` Ö„Õ¶Õ« Õ¼Õ¥ÕªÕ«Õ´Õ«Õ¶ Õ¡Õ¶ÖÕ¶Õ¥Õ¬Õ¨:"</string>
+ <string name="permdesc_wakeLock" product="default" msgid="8559100677372928754">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¯Õ¡Õ¶Õ­Õ¥Õ¬ Õ°Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ«` Ö„Õ¶Õ« Õ¼Õ¥ÕªÕ«Õ´Õ«Õ¶ Õ¡Õ¶ÖÕ¶Õ¥Õ¬Õ¨:"</string>
+ <string name="permlab_devicePower" product="tablet" msgid="2787034722616350417">"Õ£Ö€Õ¡Õ½Õ¡Õ¬Õ«Õ¯Õ¨ Õ´Õ«Õ¡ÖÕ¶Õ¥Õ¬ Õ¯Õ¡Õ´ Õ¡Õ¶Õ»Õ¡Õ¿Õ¥Õ¬"</string>
+ <string name="permlab_devicePower" product="default" msgid="4928622470980943206">"Õ°Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ¨ Õ´Õ«Õ¡ÖÕ¶Õ¥Õ¬ Õ¯Õ¡Õ´ Õ¡Õ¶Õ»Õ¡Õ¿Õ¥Õ¬"</string>
+ <string name="permdesc_devicePower" product="tablet" msgid="6689862878984631831">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ´Õ«Õ¡ÖÕ¶Õ¥Õ¬ Õ¯Õ¡Õ´ Õ¡Õ¶Õ»Õ¡Õ¿Õ¥Õ¬ Õ£Ö€Õ¡Õ½Õ¡Õ¬Õ«Õ¯Õ¨:"</string>
+ <string name="permdesc_devicePower" product="default" msgid="6037057348463131032">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ´Õ«Õ¡ÖÕ¶Õ¥Õ¬ Õ¯Õ¡Õ´ Õ¡Õ¶Õ»Õ¡Õ¿Õ¥Õ¬ Õ°Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ¨:"</string>
+ <string name="permlab_factoryTest" msgid="3715225492696416187">"Õ¡Õ·Õ­Õ¡Õ¿Õ¥Õ¬ Õ£Õ¸Ö€Õ®Õ¡Ö€Õ¡Õ¶Õ¡ÕµÕ«Õ¶ ÖƒÕ¸Ö€Õ±Õ¶Õ¡Õ¯Õ¡Õ¶ Õ¼Õ¥ÕªÕ«Õ´Õ¸Ö‚Õ´"</string>
+ <string name="permdesc_factoryTest" product="tablet" msgid="3952059318359653091">"Ô±Õ·Õ­Õ¡Õ¿Õ¥ÖÕ¶Õ¥Õ¬ Õ¸Ö€ÕºÕ¥Õ½ Õ¡Ö€Õ¿Õ¡Õ¤Ö€Õ¸Õ²Õ« ÖÕ¡Õ®Ö€ Õ´Õ¡Õ¯Õ¡Ö€Õ¤Õ¡Õ¯Õ« ÖƒÕ¸Ö€Õ±Õ¡Ö€Õ¯Õ¸Ö‚Õ´` Õ©Õ¸Ö‚ÕµÕ¬Õ¡Õ¿Ö€Õ¥Õ¬Õ¸Õ¾ Õ£Ö€Õ¡Õ½Õ¡Õ¬Õ«Õ¯Õ« Õ½Õ¡Ö€Ö„Õ«Õ¶ Õ¬Õ«Õ¡Ö€ÕªÕ¥Ö„ Õ´Õ¸Ö‚Õ¿Ö„: Õ€Õ¡Õ½Õ¡Õ¶Õ¥Õ¬Õ« Õ§ Õ´Õ«Õ¡ÕµÕ¶ Õ¡ÕµÕ¶ ÕªÕ¡Õ´Õ¡Õ¶Õ¡Õ¯, Õ¥Ö€Õ¢ Õ£Ö€Õ¡Õ½Õ¡Õ¬Õ«Õ¯Õ¨ Õ¡Õ·Õ­Õ¡Õ¿Õ¸Ö‚Õ´ Õ§ Õ¡Ö€Õ¿Õ¡Õ¤Ö€Õ¸Õ²Õ« ÖƒÕ¸Ö€Õ±Õ¶Õ¡Õ¯Õ¡Õ¶ Õ¼Õ¥ÕªÕ«Õ´Õ¸Ö‚Õ´:"</string>
+ <string name="permdesc_factoryTest" product="default" msgid="8136644990319244802">"Ô±Õ·Õ­Õ¡Õ¿Õ¥ÖÕ¶Õ¥Õ¬ Õ¸Ö€ÕºÕ¥Õ½ Õ¡Ö€Õ¿Õ¡Õ¤Ö€Õ¸Õ²Õ« ÖÕ¡Õ®Ö€ Õ´Õ¡Õ¯Õ¡Ö€Õ¤Õ¡Õ¯Õ« ÖƒÕ¸Ö€Õ±Õ¡Ö€Õ¯Õ¸Ö‚Õ´` թույլատրելով լիարժեք Õ´Õ¸Ö‚Õ¿Ö„ Õ°Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ« Õ½Õ¡Ö€Ö„Õ¡Õ·Õ¡Ö€Õ«Õ¶: Õ€Õ¡Õ½Õ¡Õ¶Õ¥Õ¬Õ« Õ§ Õ´Õ«Õ¡ÕµÕ¶ Õ¡ÕµÕ¶ ÕªÕ¡Õ´Õ¡Õ¶Õ¡Õ¯, Õ¥Ö€Õ¢ Õ°Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ¶ Õ¡Õ·Õ­Õ¡Õ¿Õ¸Ö‚Õ´ Õ§ Õ¡Ö€Õ¿Õ¡Õ¤Ö€Õ¸Õ²Õ« ÖƒÕ¸Ö€Õ±Õ¶Õ¡Õ¯Õ¡Õ¶ Õ¼Õ¥ÕªÕ«Õ´Õ¸Ö‚Õ´:"</string>
+ <string name="permlab_setWallpaper" msgid="6627192333373465143">"Õ¤Õ¶Õ¥Õ¬ ÕºÕ¡Õ½Õ¿Õ¡Õ¼"</string>
+ <string name="permdesc_setWallpaper" msgid="7373447920977624745">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¿Õ¥Õ²Õ¡Õ¤Ö€Õ¥Õ¬ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ« ÕºÕ¡Õ½Õ¿Õ¡Õ¼Õ¨:"</string>
+ <string name="permlab_setWallpaperHints" msgid="3278608165977736538">"Õ¯Õ¡Ö€Õ£Õ¡Õ¢Õ¥Ö€Õ¥Õ¬ Õ±Õ¥Ö€ ÕºÕ¡Õ½Õ¿Õ¡Õ¼Õ« Õ¹Õ¡ÖƒÕ¥Ö€Õ¨"</string>
+ <string name="permdesc_setWallpaperHints" msgid="8235784384223730091">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¿Õ¥Õ²Õ¡Õ¤Ö€Õ¥Õ¬ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ« ÕºÕ¡Õ½Õ¿Õ¡Õ¼Õ« Õ¹Õ¡ÖƒÕ« Õ°Õ¸Ö‚Õ·Õ¸Ö‚Õ´Õ¶Õ¥Ö€Õ¨:"</string>
+ <string name="permlab_masterClear" msgid="2315750423139697397">"Õ¾Õ¥Ö€Õ¡Õ¯Õ¡ÕµÕ¥Õ¬ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ¨ Õ£Õ¸Ö€Õ®Õ¡Ö€Õ¡Õ¶Õ¡ÕµÕ«Õ¶ Õ¬Õ¼Õ¥Õ¬ÕµÕ¡ÕµÕ¶Õ«"</string>
+ <string name="permdesc_masterClear" msgid="3665380492633910226">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¡Õ´Õ¢Õ¸Õ²Õ»Õ¸Ö‚Õ©ÕµÕ¡Õ´Õ¢ Õ¾Õ¥Ö€Õ¡Õ¯Õ¡ÕµÕ¥Õ¬ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ¨ Õ«Ö€ Õ£Õ¸Ö€Õ®Õ¡Ö€Õ¡Õ¶Õ¡ÕµÕ«Õ¶ Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´Õ¶Õ¥Ö€Õ«Õ¶` Õ»Õ¶Õ»Õ¥Õ¬Õ¸Õ¾ Õ¢Õ¸Õ¬Õ¸Ö€ Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨, Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´Õ¶Õ¥Ö€Õ¨ Ö‡ Õ¿Õ¥Õ²Õ¡Õ¤Ö€Õ¾Õ¡Õ® Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ¨:"</string>
+ <string name="permlab_setTime" msgid="2021614829591775646">"Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¥Õ¬ ÕªÕ¡Õ´Õ¨"</string>
+ <string name="permdesc_setTime" product="tablet" msgid="1896341438151152881">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ ÖƒÕ¸Õ­Õ¥Õ¬ Õ£Ö€Õ¡Õ½Õ¡Õ¬Õ«Õ¯Õ« ÕªÕ¡Õ´Õ¡ÖÕ¸Ö‚ÕµÖÕ« ÕªÕ¡Õ´Õ¡Õ¶Õ¡Õ¯Õ¨:"</string>
+ <string name="permdesc_setTime" product="default" msgid="1855702730738020">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ ÖƒÕ¸Õ­Õ¥Õ¬ Õ°Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ« ÕªÕ¡Õ´Õ¡ÖÕ¸Ö‚ÕµÖÕ« ÕªÕ¡Õ´Õ¡Õ¶Õ¡Õ¯Õ¨:"</string>
+ <string name="permlab_setTimeZone" msgid="2945079801013077340">"Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¥Õ¬ ÕªÕ¡Õ´Õ¡ÕµÕ«Õ¶ Õ£Õ¸Õ¿Õ«Õ¶"</string>
+ <string name="permdesc_setTimeZone" product="tablet" msgid="1676983712315827645">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ ÖƒÕ¸Õ­Õ¥Õ¬ Õ£Ö€Õ¡Õ½Õ¡Õ¬Õ«Õ¯Õ« ÕªÕ¡Õ´Õ¡ÕµÕ«Õ¶ Õ£Õ¸Õ¿Õ«Õ¶:"</string>
+ <string name="permdesc_setTimeZone" product="default" msgid="4499943488436633398">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ ÖƒÕ¸Õ­Õ¥Õ¬ Õ°Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ« ÕªÕ¡Õ´Õ¡ÕµÕ«Õ¶ Õ£Õ¸Õ¿Õ«Õ¶:"</string>
+ <string name="permlab_accountManagerService" msgid="4829262349691386986">"Õ£Õ¸Ö€Õ®Õ¥Õ¬ Õ¸Ö€ÕºÕ¥Õ½ Õ€Õ¡Õ·Õ¾Õ« Õ¯Õ¡Õ¼Õ¡Õ¾Õ¡Ö€Õ«Õ¹ Õ®Õ¡Õ¼Õ¡ÕµÕ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶"</string>
+ <string name="permdesc_accountManagerService" msgid="1948455552333615954">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¦Õ¡Õ¶Õ£Õ¥Õ¬ Õ€Õ¡Õ·Õ¾Õ« Õ«Õ½Õ¯Õ¸Ö€Õ¸Õ·Õ«Õ¹Õ¶Õ¥Ö€Õ«Õ¶:"</string>
+ <string name="permlab_getAccounts" msgid="1086795467760122114">"Õ£Õ¿Õ¶Õ¥Õ¬ Õ°Õ¡Õ·Õ«Õ¾Õ¶Õ¥Ö€ Õ½Õ¡Ö€Ö„Õ¸Ö‚Õ´"</string>
+ <string name="permdesc_getAccounts" product="tablet" msgid="2741496534769660027">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ½Õ¿Õ¡Õ¶Õ¡Õ¬ Õ£Ö€Õ¡Õ½Õ¡Õ¬Õ«Õ¯Õ« Õ¯Õ¸Õ²Õ´Õ«Ö Õ³Õ¡Õ¶Õ¡Õ¹Õ¾Õ¡Õ® Õ°Õ¡Õ·Õ«Õ¾Õ¶Õ¥Ö€Õ« ÖÕ¡Õ¶Õ¯Õ¨: ÕÕ¡ Õ¯Õ¡Ö€Õ¸Õ² Õ§ Õ¶Õ¥Ö€Õ¡Õ¼Õ¥Õ¬ ÖÕ¡Õ¶Õ¯Õ¡ÖÕ¡Õ® Õ°Õ¡Õ·Õ«Õ¾, Õ¸Ö€ Õ½Õ¿Õ¥Õ²Õ®Õ¾Õ¥Õ¬ Õ§ Õ±Õ¥Ö€ Õ¿Õ¥Õ²Õ¡Õ¤Ö€Õ¡Õ® Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ« Õ¯Õ¸Õ²Õ´Õ«Ö:"</string>
+ <string name="permdesc_getAccounts" product="default" msgid="3448316822451807382">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ½Õ¿Õ¡Õ¶Õ¡Õ¬ Õ°Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ« Õ¯Õ¸Õ²Õ´Õ«Ö Õ³Õ¡Õ¶Õ¡Õ¹Õ¾Õ¡Õ® Õ°Õ¡Õ·Õ«Õ¾Õ¶Õ¥Ö€Õ« ÖÕ¡Õ¶Õ¯Õ¨: ÕÕ¡ Õ¯Õ¡Ö€Õ¸Õ² Õ§ Õ¶Õ¥Ö€Õ¡Õ¼Õ¥Õ¬ ÖÕ¡Õ¶Õ¯Õ¡ÖÕ¡Õ® Õ°Õ¡Õ·Õ«Õ¾, Õ¸Ö€ Õ½Õ¿Õ¥Õ²Õ®Õ¾Õ¥Õ¬ Õ§ Õ±Õ¥Ö€ Õ¿Õ¥Õ²Õ¡Õ¤Ö€Õ¡Õ® Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ« Õ¯Õ¸Õ²Õ´Õ«Ö:"</string>
+ <string name="permlab_authenticateAccounts" msgid="5265908481172736933">"Õ½Õ¿Õ¥Õ²Õ®Õ¥Õ¬ Õ°Õ¡Õ·Õ«Õ¾Õ¶Õ¥Ö€ Ö‡ Õ¤Õ¶Õ¥Õ¬ Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ¥Ö€"</string>
+ <string name="permdesc_authenticateAccounts" msgid="5472124296908977260">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ օգտագործել հաշվի Õ¯Õ¡Õ¼Õ¡Õ¾Õ¡Ö€Õ¹Õ« Õ¶Õ¸Ö‚ÕµÕ¶Õ¡Õ¯Õ¡Õ¶Õ¡ÖÕ¶Õ¸Õ² Õ°Õ¶Õ¡Ö€Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨, Õ«Õ¶Õ¹ÕºÕ¥Õ½ Õ¶Õ¡Ö‡ Õ½Õ¿Õ¥Õ²Õ®Õ¥Õ¬ Õ°Õ¡Õ·Õ«Õ¾Õ¶Õ¥Ö€, Õ½Õ¿Õ¡Õ¶Õ¡Õ¬ Ö‡ Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¥Õ¬ Õ¤Ö€Õ¡Õ¶Ö Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ¥Ö€Õ¨:"</string>
+ <string name="permlab_manageAccounts" msgid="4983126304757177305">"Õ¡Õ¾Õ¥Õ¬Õ¡ÖÕ¶Õ¥Õ¬ Õ¯Õ¡Õ´ Õ°Õ¥Õ¼Õ¡ÖÕ¶Õ¥Õ¬ Õ°Õ¡Õ·Õ«Õ¾Õ¶Õ¥Ö€"</string>
+ <string name="permdesc_manageAccounts" msgid="8698295625488292506">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ«Ö€Õ¡Õ¯Õ¡Õ¶Õ¡ÖÕ¶Õ¥Õ¬ Õ£Õ¸Ö€Õ®Õ¸Õ²Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€, Õ«Õ¶Õ¹ÕºÕ«Õ½Õ«Ö„ Õ¥Õ¶` Õ¡Õ¾Õ¥Õ¬Õ¡ÖÕ¶Õ¥Õ¬ Ö‡ Õ°Õ¥Õ¼Õ¡ÖÕ¶Õ¥Õ¬ Õ°Õ¡Õ·Õ«Õ¾Õ¶Õ¥Ö€ Ö‡ Õ»Õ¶Õ»Õ¥Õ¬ Õ¤Ö€Õ¡Õ¶Ö Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ¥Ö€Õ¨:"</string>
+ <string name="permlab_useCredentials" msgid="235481396163877642">"Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¥Õ¬ Õ½Õ¡Ö€Ö„Õ« Õ°Õ¡Õ·Õ«Õ¾Õ¶Õ¥Ö€Õ¨"</string>
+ <string name="permdesc_useCredentials" msgid="7984227147403346422">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ°Õ¡ÕµÖÕ¥Õ¬ Õ¶Õ¸Ö‚ÕµÕ¶Õ¡Õ¯Õ¡Õ¶Õ¡ÖÕ´Õ¡Õ¶ Õ¶Õ·Õ¡Õ¶Õ¶Õ¥Ö€:"</string>
+ <string name="permlab_accessNetworkState" msgid="4951027964348974773">"Õ¤Õ«Õ¿Õ¥Õ¬ ÖÕ¡Õ¶ÖÕ¡ÕµÕ«Õ¶ Õ´Õ«Õ¡ÖÕ¸Ö‚Õ´Õ¶Õ¥Ö€Õ¨"</string>
+ <string name="permdesc_accessNetworkState" msgid="8318964424675960975">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¿Õ¥Õ½Õ¶Õ¥Õ¬ ÖÕ¡Õ¶ÖÕ¡ÕµÕ«Õ¶ Õ¯Õ¡ÕºÕ¥Ö€Õ« Õ´Õ¡Õ½Õ«Õ¶ Õ¿Õ¥Õ²Õ¥Õ¯Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€, Õ«Õ¶Õ¹ÕºÕ¥Õ½ Ö…Ö€Õ«Õ¶Õ¡Õ¯, Õ©Õ¥ Õ«Õ¶Õ¹ Õ¯Õ¡ÕºÕ¥Ö€ Õ¯Õ¡Õ¶ Ö‡ Õ¸Ö€Õ¸Õ¶Ö„ Õ¥Õ¶ Õ´Õ«Õ¡ÖÕ¾Õ¡Õ®:"</string>
+ <string name="permlab_createNetworkSockets" msgid="8018758136404323658">"Õ¬Ö€Õ«Õ¾ ÖÕ¡Õ¶ÖÕ¡ÕµÕ«Õ¶ Õ´Õ¸Ö‚Õ¿Ö„"</string>
+ <string name="permdesc_createNetworkSockets" msgid="3403062187779724185">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ½Õ¿Õ¥Õ²Õ®Õ¥Õ¬ ÖÕ¡Õ¶ÖÕ¡ÕµÕ«Õ¶ Õ¢Õ¶Õ«Õ¯Õ¶Õ¥Ö€ Ö‡ Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¥Õ¬ Õ°Õ¡Õ¿Õ¸Ö‚Õ¯ ÖÕ¡Õ¶ÖÕ¡ÕµÕ«Õ¶ ÕºÖ€Õ¸Õ¿Õ¸Õ¯Õ¸Õ¬Õ¶Õ¥Ö€: Ô¶Õ¶Õ¶Õ¡Ö€Õ¯Õ«Õ¹Õ¨ Ö‡ Õ¡ÕµÕ¬ հավելվածները միջոÖÕ¶Õ¥Ö€ Õ¥Õ¶ Õ¿Ö€Õ¡Õ´Õ¡Õ¤Ö€Õ¸Ö‚Õ´ Õ«Õ¶Õ¿Õ¥Ö€Õ¶Õ¥Õ¿Õ«Õ¶ Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€ Õ¸Ö‚Õ²Õ¡Ö€Õ¯Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€, Õ¸Ö‚Õ½Õ¿Õ« Õ¡ÕµÕ½ Õ©Õ¸Ö‚ÕµÕ¬Õ¿Õ¾Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Õ¹Õ« պահանջվում ինտերնետին Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€ Õ¸Ö‚Õ²Õ¡Ö€Õ¯Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€:"</string>
+ <string name="permlab_writeApnSettings" msgid="505660159675751896">"ÖƒÕ¸Õ­Õ¥Õ¬/Õ¯Õ¡Õ½Õ¥ÖÕ¶Õ¥Õ¬ ÖÕ¡Õ¶ÖÕ¡ÕµÕ«Õ¶ Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´Õ¶Õ¥Ö€Õ¨ Ö‡ Õ·Õ¡Ö€ÕªÕ¨"</string>
+ <string name="permdesc_writeApnSettings" msgid="5333798886412714193">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ ÖƒÕ¸Õ­Õ¥Õ¬ ÖÕ¡Õ¶ÖÕ¡ÕµÕ«Õ¶ Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´Õ¶Õ¥Ö€Õ¨ Ö‡ Õ¯Õ¡Õ½Õ¥ÖÕ¶Õ¥Õ¬ Õ¸Ö‚ Õ½Õ¿Õ¸Ö‚Õ£Õ¥Õ¬ Õ¡Õ´Õ¢Õ¸Õ²Õ» ÖÕ¡Õ¶ÖÕ¡ÕµÕ«Õ¶ Õ·Õ¡Ö€ÕªÕ¨, Ö…Ö€Õ«Õ¶Õ¡Õ¯` ÖƒÕ¸Õ­Õ¥Õ¬ ÖÕ¡Õ¶Õ¯Õ¡ÖÕ¡Õ® APN-Õ« ÕºÖ€Õ¸Ö„Õ½Õ«Õ¶ Ö‡ Õ´Õ«Õ¡ÖÖ„Õ¨: ÕŽÕ¶Õ¡Õ½Õ¡Ö€Õ¡Ö€ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ¨ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Õ¶ Õ°Õ¥Õ¿Ö‡Õ¥Õ¬, Õ¾Õ¥Ö€Õ¡Õ°Õ¡Õ½ÖÕ¥Õ¡Õ¾Õ¸Ö€Õ¥Õ¬ Õ¯Õ¡Õ´ ÖƒÕ¸ÖƒÕ¸Õ­Õ¥Õ¬ ÖÕ¡Õ¶ÖÕ¡ÕµÕ«Õ¶ ÖƒÕ¡Õ©Õ¥Õ©Õ¶Õ¥Ö€Õ¨` Õ¡Õ¼Õ¡Õ¶Ö Õ±Õ¥Ö€ Õ«Õ´Õ¡ÖÕ¸Ö‚Õ©ÕµÕ¡Õ¶:"</string>
+ <string name="permlab_changeNetworkState" msgid="958884291454327309">"ÖƒÕ¸Õ­Õ¥Õ¬ ÖÕ¡Õ¶ÖÕ« Õ¯Õ¡ÕºÕ¨"</string>
+ <string name="permdesc_changeNetworkState" msgid="6789123912476416214">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ ÖƒÕ¸Õ­Õ¥Õ¬ ÖÕ¡Õ¶ÖÕ« Õ´Õ«Õ¡ÖÕ´Õ¡Õ¶ Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ«Õ³Õ¡Õ¯Õ¨:"</string>
+ <string name="permlab_changeTetherState" msgid="5952584964373017960">"ÖƒÕ¸Õ­Õ¥Õ¬ Õ´Õ«Õ¡ÖÕ¾Õ¡Õ® Õ¯Õ¡ÕºÕ¨"</string>
+ <string name="permdesc_changeTetherState" msgid="1524441344412319780">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ ÖƒÕ¸Õ­Õ¥Õ¬ Õ¯Õ¡ÕºÕ¾Õ¡Õ® ÖÕ¡Õ¶ÖÕ« Õ´Õ«Õ¡ÖÕ´Õ¡Õ¶ Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ«Õ³Õ¡Õ¯Õ¨:"</string>
+ <string name="permlab_changeBackgroundDataSetting" msgid="1400666012671648741">"ÖƒÕ¸Õ­Õ¥Õ¬ Ö†Õ¸Õ¶Õ¡ÕµÕ«Õ¶ Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ« Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ´Õ¡Õ¶ Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´Õ¨"</string>
+ <string name="permdesc_changeBackgroundDataSetting" msgid="5347729578468744379">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ ÖƒÕ¸Õ­Õ¥Õ¬ Ö†Õ¸Õ¶Õ¡ÕµÕ«Õ¶ Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ« Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ´Õ¡Õ¶ Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´Õ¶Õ¥Ö€Õ¨:"</string>
+ <string name="permlab_accessWifiState" msgid="5202012949247040011">"Õ¤Õ«Õ¿Õ¥Õ¬ Wi-Fi Õ¯Õ¡ÕºÕ¥Ö€Õ¨"</string>
+ <string name="permdesc_accessWifiState" msgid="5002798077387803726">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¿Õ¥Õ½Õ¶Õ¥Õ¬ Wi-Fi ÖÕ¡Õ¶ÖÕ« Õ¿Õ¥Õ²Õ¥Õ¯Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€, Õ«Õ¶Õ¹ÕºÕ¥Õ½ Ö…Ö€Õ«Õ¶Õ¡Õ¯` Õ¡Ö€Õ¤ÕµÕ¸Ö„ Wi-Fi-Õ¨ Õ´Õ«Õ¡ÖÕ¾Õ¡Õ® Õ§, Õ©Õ¥` Õ¸Õ¹, Ö‡ Õ´Õ«Õ¡ÖÕ¾Õ¡Õ® Wi-Fi Õ½Õ¡Ö€Ö„Õ« Õ¡Õ¶Õ¸Ö‚Õ¶Õ¨:"</string>
+ <string name="permlab_changeWifiState" msgid="6550641188749128035">"Õ´Õ«Õ¡Õ¶Õ¡Õ¬ Wi-Fi-Õ«Õ¶ Ö‡ Õ¡Õ¶Õ»Õ¡Õ¿Õ¾Õ¥Õ¬ Õ¤Ö€Õ¡Õ¶Õ«Ö"</string>
+ <string name="permdesc_changeWifiState" msgid="7137950297386127533">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ´Õ«Õ¡Õ¶Õ¡Õ¬ Wi-Fi Õ´Õ¸Ö‚Õ¿Ö„Õ« Õ¯Õ¥Õ¿Õ¥Ö€Õ«Õ¶ Ö‡ Õ¡Õ¶Õ»Õ¡Õ¿Õ¾Õ¥Õ¬ Õ¡ÕµÕ¤ Õ¯Õ¥Õ¿Õ¥Ö€Õ«Ö, Õ«Õ¶Õ¹ÕºÕ¥Õ½ Õ¶Õ¡Ö‡ Õ¯Õ¡Õ¿Õ¡Ö€Õ¥Õ¬ Õ½Õ¡Ö€Ö„Õ« Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ´Õ¡Õ¶ ÖƒÕ¸ÖƒÕ¸Õ­Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€ Wi-Fi ÖÕ¡Õ¶ÖÕ¥Ö€Õ« Õ°Õ¡Õ´Õ¡Ö€:"</string>
+ <string name="permlab_changeWifiMulticastState" msgid="1368253871483254784">"Õ©Õ¸Ö‚ÕµÕ¬Õ¡Õ¿Ö€Õ¥Õ¬ Ô²Õ¡Õ¦Õ´Õ¡Õ½ÖƒÕµÕ¸Ö‚Õ¼ Wi-Fi-Õ« Õ¨Õ¶Õ¤Õ¸Ö‚Õ¶Õ¸Ö‚Õ´Õ¨"</string>
+ <string name="permdesc_changeWifiMulticastState" product="tablet" msgid="7969774021256336548">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ½Õ¿Õ¡Õ¶Õ¡Õ¬ Wi-Fi ÖÕ¡Õ¶ÖÕ« Õ¢Õ¸Õ¬Õ¸Ö€ Õ½Õ¡Ö€Ö„Õ¥Ö€Õ«Õ¶ Õ¸Ö‚Õ²Õ¡Ö€Õ¯Õ¾Õ¡Õ® ÖƒÕ¡Õ©Õ¥Õ©Õ¶Õ¥Ö€Õ¨` Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¥Õ¬Õ¸Õ¾ Õ¸Õ¹ Õ´Õ«Õ¡ÕµÕ¶ Õ±Õ¥Ö€ Õ£Ö€Õ¡Õ½Õ¡Õ¬Õ«Õ¯Õ¨, Õ¡ÕµÕ¬ Õ¶Õ¡Ö‡ Õ¢Õ¡Õ¦Õ´Õ¡Õ½ÖƒÕµÕ¸Ö‚Õ¼ Õ°Õ¡Õ½ÖÕ¥Õ¶Õ¥Ö€Õ¨: Ô±ÕµÕ¶ Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¸Ö‚Õ´ Õ§ Õ¡Õ¾Õ¥Õ¬Õ« Õ·Õ¡Õ¿ Õ¬Õ«ÖÖ„, Ö„Õ¡Õ¶ Õ¸Õ¹ Õ¢Õ¡Õ¦Õ´Õ¡Õ½ÖƒÕµÕ¸Ö‚Õ¼ Õ¼Õ¥ÕªÕ«Õ´Õ¨:"</string>
+ <string name="permdesc_changeWifiMulticastState" product="default" msgid="6851949706025349926">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ ստանալ Wi-Fi ÖÕ¡Õ¶Öի բոլոր Õ½Õ¡Ö€Ö„Õ¥Ö€Õ«Õ¶ Õ¸Ö‚Õ²Õ¡Ö€Õ¯Õ¾Õ¡Õ® ÖƒÕ¡Õ©Õ¥Õ©Õ¶Õ¥Ö€Õ¨` օգտագործելով ոչ Õ´Õ«Õ¡ÕµÕ¶ Õ±Õ¥Ö€ Õ°Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ¨, Õ¡ÕµÕ¬ Õ¶Õ¡Ö‡ Õ¢Õ¡Õ¦Õ´Õ¡Õ½ÖƒÕµÕ¸Ö‚Õ¼ Õ°Õ¡Õ½ÖÕ¥Õ¶Õ¥Ö€Õ¨: Այն օգտագործում Õ§ Õ¡Õ¾Õ¥Õ¬Õ« Õ·Õ¡Õ¿ Õ¬Õ«ÖÖ„, Ö„Õ¡Õ¶ Õ¸Õ¹ Õ¢Õ¡Õ¦Õ´Õ¡Õ½ÖƒÕµÕ¸Ö‚Õ¼ Õ¼Õ¥ÕªÕ«Õ´Õ¨:"</string>
+ <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"Õ´Õ¸Ö‚Õ¿Ö„ Õ£Õ¸Ö€Õ®Õ¥Õ¬ Bluetooth-Õ« Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´Õ¶Õ¥Ö€"</string>
+ <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¥Õ¬ Õ¿Õ¥Õ²Õ¡ÕµÕ«Õ¶ Bluetooth Õ£Ö€Õ¡Õ½Õ¡Õ¬Õ«Õ¯Õ¨ Ö‡ Õ°Õ¡ÕµÕ¿Õ¶Õ¡Õ¢Õ¥Ö€Õ¥Õ¬ Õ¸Ö‚ Õ¦Õ¸Ö‚Õ£Õ¡Õ¯ÖÕ¾Õ¥Õ¬ Õ°Õ¥Õ¼Õ¡Õ¯Õ¡ Õ½Õ¡Ö€Ö„Õ¥Ö€Õ« Õ°Õ¥Õ¿:"</string>
+ <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¥Õ¬ Õ¿Õ¥Õ²Õ¡ÕµÕ«Õ¶ Bluetooth Õ°Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ¨ Ö‡ Õ°Õ¡ÕµÕ¿Õ¶Õ¡Õ¢Õ¥Ö€Õ¥Õ¬ Õ¸Ö‚ Õ¦Õ¸Ö‚Õ£Õ¡Õ¯ÖÕ¾Õ¥Õ¬ Õ°Õ¥Õ¼Õ¡Õ¯Õ¡ Õ½Õ¡Ö€Ö„Õ¥Ö€Õ« Õ°Õ¥Õ¿:"</string>
+ <string name="permlab_accessWimaxState" msgid="4195907010610205703">"Õ´Õ«Õ¡Õ¶Õ¡Õ¬ WiMAX-Õ«Õ¶ Ö‡ Õ¡Õ¶Õ»Õ¡Õ¿Õ¾Õ¥Õ¬ Õ¤Ö€Õ¡Õ¶Õ«Ö"</string>
+ <string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ ÕºÕ¡Ö€Õ¦Õ¥Õ¬, Õ¡Ö€Õ¤ÕµÕ¸Ö„ WiMAX-Õ¨ Õ´Õ«Õ¡ÖÕ¾Õ¡Õ® Õ§ Ö‡ ÖÕ¡Õ¶Õ¯Õ¡ÖÕ¡Õ® Õ´Õ«Õ¡ÖÕ¾Õ¡Õ® WiMAX ÖÕ¡Õ¶ÖÕ« Õ´Õ¡Õ½Õ«Õ¶ Õ¿Õ¥Õ²Õ¥Õ¯Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€:"</string>
+ <string name="permlab_changeWimaxState" msgid="2405042267131496579">"Õ“Õ¸Õ­Õ¥Õ¬ WiMAX-Õ« Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ«Õ³Õ¡Õ¯Õ¨"</string>
+ <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ£Ö€Õ¡Õ½Õ¡Õ¬Õ«Õ¯Õ¨ Õ´Õ«Õ¡ÖÕ¶Õ¥Õ¬ WiMAX ÖÕ¡Õ¶ÖÕ«Õ¶ Ö‡ Õ¡Õ¶Õ»Õ¡Õ¿Õ¾Õ¥Õ¬ Õ¡ÕµÕ¤ ÖÕ¡Õ¶ÖÕ«Ö:"</string>
+ <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ°Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ¨ Õ´Õ«Õ¡ÖÕ¶Õ¥Õ¬ WiMAX ÖÕ¡Õ¶ÖÕ«Õ¶ Ö‡ Õ¡Õ¶Õ»Õ¡Õ¿Õ¥Õ¬ Õ¡ÕµÕ¤ ÖÕ¡Õ¶ÖÕ«Ö:"</string>
+ <string name="permlab_bluetooth" msgid="6127769336339276828">"Õ¦Õ¸Ö‚Õ£Õ¡Õ¯ÖÕ¾Õ¥Õ¬ Bluetooth Õ½Õ¡Ö€Ö„Õ¥Ö€Õ« Õ°Õ¥Õ¿"</string>
+ <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¿Õ¥Õ½Õ¶Õ¥Õ¬ Bluetooth-Õ« Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´Õ¨ Õ£Ö€Õ¡Õ½Õ¡Õ¬Õ«Õ¯Õ« Õ¾Ö€Õ¡ Ö‡ Õ¯Õ¡ÕºÕ¾Õ¥Õ¬ Õ¸Ö‚ Õ¯Õ¡ÕºÕ¥Ö€ Õ¨Õ¶Õ¤Õ¸Ö‚Õ¶Õ¥Õ¬ Õ¦Õ¸Ö‚Õ£Õ¡Õ¯ÖÕ¾Õ¡Õ® Õ½Õ¡Ö€Ö„Õ¥Ö€Õ« Õ°Õ¥Õ¿:"</string>
+ <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¿Õ¥Õ½Õ¶Õ¥Õ¬ Bluetooth-Õ« Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´Õ¨ Õ°Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ« Õ¾Ö€Õ¡ Ö‡ Õ¯Õ¡ÕºÕ¾Õ¥Õ¬ Õ¸Ö‚ Õ¯Õ¡ÕºÕ¥Ö€ Õ¨Õ¶Õ¤Õ¸Ö‚Õ¶Õ¥Õ¬ Õ¦Õ¸Ö‚Õ£Õ¡Õ¯ÖÕ¾Õ¡Õ® Õ½Õ¡Ö€Ö„Õ¥Ö€Õ« Õ°Õ¥Õ¿:"</string>
+ <string name="permlab_nfc" msgid="4423351274757876953">"Õ¾Õ¥Ö€Õ¡Õ°Õ½Õ¯Õ¥Õ¬ Õ„Õ¸Õ¿ ÕÕ¡Ö€Õ¡Õ®Õ¸Ö‚Õ©ÕµÕ¡Õ´Õ¢ Õ€Õ¡Õ²Õ¸Ö€Õ¤Õ¡Õ¯ÖÕ¸Ö‚Õ´Õ¨"</string>
+ <string name="permdesc_nfc" msgid="7120611819401789907">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¡Õ¯ÖÕ¾Õ¥Õ¬ Õ„Õ¸Õ¿ Õ¿Õ¡Ö€Õ¡Õ®Õ¸Ö‚Õ©ÕµÕ¡Õ´Õ¢ Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¡Õ¯ÖÕ´Õ¡Õ¶ (NFC) ÕºÕ«Õ¿Õ¡Õ¯Õ¶Õ¥Ö€Õ«, Ö„Õ¡Ö€Õ¿Õ¥Ö€Õ« Ö‡ Õ¨Õ¶Õ©Õ¥Ö€ÖÕ«Õ¹Õ¶Õ¥Ö€Õ« Õ°Õ¥Õ¿:"</string>
+ <string name="permlab_disableKeyguard" msgid="3598496301486439258">"Õ¡Õ¶Õ»Õ¡Õ¿Õ¥Õ¬ Õ±Õ¥Ö€ Õ§Õ¯Ö€Õ¡Õ¶Õ« Õ¯Õ¸Õ²ÕºÕ¥Ö„Õ¨"</string>
+ <string name="permdesc_disableKeyguard" msgid="6034203065077122992">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¡Õ¶Õ»Õ¡Õ¿Õ¥Õ¬ Õ½Õ¿Õ¥Õ²Õ¶Õ¡Õ·Õ¡Ö€Õ« Õ¯Õ¸Õ²ÕºÕ¸Ö‚Õ´Õ¨ Ö‡ ÖÕ¡Õ¶Õ¯Õ¡ÖÕ¡Õ® Õ°Õ¡Õ´Õ¡Õ¯ÖÕ¾Õ¡Õ® Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ« ÕºÕ¡Õ·Õ¿ÕºÕ¡Õ¶Õ¾Õ¡Õ®Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨: ÕÖ€Õ¡ Õ³Õ«Õ·Õ¿ Ö…Ö€Õ«Õ¶Õ¡Õ¯Õ¶ Õ§, Õ¥Ö€Õ¢ Õ°Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ¨ Õ¡Õ¶Õ»Õ¡Õ¿Õ¸Ö‚Õ´ Õ§ Õ½Õ¿Õ¥Õ²Õ¶Õ¡Õ·Õ¡Ö€Õ« Õ¯Õ¸Õ²ÕºÕ¸Ö‚Õ´Õ¨ Õ´Õ¸Ö‚Õ¿Ö„Õ¡ÕµÕ«Õ¶ Õ¦Õ¡Õ¶Õ£ Õ½Õ¿Õ¡Õ¶Õ¡Õ¬Õ«Õ½, Õ°Õ¥Õ¿Õ¸ Õ¡ÕµÕ¶ Õ¯Ö€Õ¯Õ«Õ¶ Õ´Õ«Õ¡ÖÕ¶Õ¸Ö‚Õ´ Õ§, Õ¥Ö€Õ¢ Õ¦Õ¡Õ¶Õ£Õ¨ Õ¡Õ¾Õ¡Ö€Õ¿Õ¾Õ¸Ö‚Õ´ Õ§:"</string>
+ <string name="permlab_readSyncSettings" msgid="6201810008230503052">"Õ¯Õ¡Ö€Õ¤Õ¡Õ¬ Õ°Õ¡Õ´Õ¡ÕªÕ¡Õ´Õ¥ÖÕ´Õ¡Õ¶ Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´Õ¶Õ¥Ö€Õ¨"</string>
+ <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¯Õ¡Ö€Õ¤Õ¡Õ¬ Õ°Õ¡Õ´Õ¡ÕªÕ¡Õ´Õ¥ÖÕ´Õ¡Õ¶ Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´Õ¶Õ¥Ö€Õ¨ Õ°Õ¡Õ·Õ¾Õ« Õ°Õ¡Õ´Õ¡Ö€: Õ•Ö€Õ«Õ¶Õ¡Õ¯` Õ¡ÕµÕ¶ Õ¯Õ¡Ö€Õ¸Õ² Õ§ Õ¸Ö€Õ¸Õ·Õ¥Õ¬, Õ¡Ö€Õ¤ÕµÕ¸Ö„ Õ„Õ¡Ö€Õ¤Õ«Õ¯ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¨ Õ°Õ¡Õ´Õ¡ÕªÕ¡Õ´Õ¥ÖÕ¾Õ¡Õ® Õ§ Õ°Õ¡Õ·Õ¾Õ« Õ°Õ¥Õ¿:"</string>
+ <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"Õ°Õ¡Õ´Õ¡ÕªÕ¡Õ´Õ¥ÖÕ¸Ö‚Õ´Õ¨ ÖƒÕ¸Õ­Õ¡Ö€Õ¯Õ¥Õ¬ Õ´Õ«Õ¡ÖÕ¾Õ¡Õ®Õ« Ö‡ Õ¡Õ¶Õ»Õ¡Õ¿Õ¾Õ¡Õ®Õ«"</string>
+ <string name="permdesc_writeSyncSettings" msgid="8956262591306369868">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ ÖƒÕ¸ÖƒÕ¸Õ­Õ¥Õ¬ Õ°Õ¡Õ´Õ¡ÕªÕ¡Õ´Õ¥ÖÕ´Õ¡Õ¶ Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´Õ¶Õ¥Ö€Õ¨ Õ°Õ¡Õ·Õ¾Õ« Õ°Õ¡Õ´Õ¡Ö€: Õ•Ö€Õ«Õ¶Õ¡Õ¯, Õ¡ÕµÕ¶ Õ¯Õ¡Ö€Õ¸Õ² Õ§ Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¾Õ¥Õ¬` Õ´Õ«Õ¡ÖÕ¶Õ¥Õ¬Õ¸Ö‚ Õ„Õ¡Ö€Õ¤Õ«Õ¯ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ« Õ°Õ¡Õ´Õ¡ÕªÕ¡Õ´Õ¥ÖÕ¸Ö‚Õ´Õ¨ Õ°Õ¡Õ·Õ¾Õ« Õ°Õ¥Õ¿:"</string>
+ <string name="permlab_readSyncStats" msgid="7396577451360202448">"Õ¯Õ¡Ö€Õ¤Õ¡Õ¬ Õ°Õ¡Õ´Õ¡ÕªÕ¡Õ´Õ¥ÖÕ´Õ¡Õ¶ Õ¾Õ«Õ³Õ¡Õ¯Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨"</string>
+ <string name="permdesc_readSyncStats" msgid="1510143761757606156">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¯Õ¡Ö€Õ¤Õ¡Õ¬ Õ°Õ¡Õ·Õ¾Õ« Õ°Õ¡Õ´Õ¡ÕªÕ¡Õ´Õ¥ÖÕ´Õ¡Õ¶ Õ¾Õ«Õ³Õ¡Õ¯Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨, Õ¡ÕµÕ¤ Õ©Õ¾Õ¸Ö‚Õ´` Õ°Õ¡Õ´Õ¡ÕªÕ¡Õ´Õ¥ÖÕ´Õ¡Õ¶ Õ«Ö€Õ¡Õ¤Õ¡Ö€Õ±Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ« ÕºÕ¡Õ¿Õ´Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Ö‡ Õ©Õ¥ Õ¸Ö€Ö„Õ¡Õ¶ Õ¿Õ¾ÕµÕ¡Õ¬ Õ§ Õ°Õ¡Õ´Õ¡ÕªÕ¡Õ´Õ¥ÖÕ¾Õ¡Õ®:"</string>
+ <string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"Õ¯Õ¡Ö€Õ¤Õ¡Õ¬ Õ¢Õ¡ÕªÕ¡Õ¶Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¾Õ¡Õ® Õ°Õ¸Õ½Ö„Õ¥Ö€Õ¨"</string>
+ <string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ´Õ¡Õ¶Ö€Õ¡Õ´Õ¡Õ½Õ¶Õ¥Ö€ Õ½Õ¿Õ¡Õ¶Õ¡Õ¬ Õ¨Õ¶Õ©Õ¡ÖÕ«Õ¯ Õ°Õ¡Õ´Õ¡ÕªÕ¡Õ´Õ¥ÖÕ¾Õ¡Õ® Õ°Õ¸Õ½Ö„Õ¥Ö€Õ« Õ´Õ¡Õ½Õ«Õ¶:"</string>
+ <string name="permlab_subscribedFeedsWrite" msgid="9015246325408209296">"Õ£Ö€Õ¥Õ¬ Õ¢Õ¡ÕªÕ¡Õ¶Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¾Õ¡Õ® Õ°Õ¸Õ½Ö„Õ¥Ö€Õ¨"</string>
+ <string name="permdesc_subscribedFeedsWrite" msgid="6928930188826089413">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ ÖƒÕ¸ÖƒÕ¸Õ­Õ¥Õ¬ Õ±Õ¥Ö€ Õ¶Õ¥Ö€Õ¯Õ¡ÕµÕ¸Ö‚Õ´Õ½ Õ°Õ¡Õ´Õ¡ÕªÕ¡Õ´Õ¥ÖÕ¾Õ¡Õ® Õ°Õ¸Õ½Ö„Õ¥Ö€Õ¨: ÕŽÕ¶Õ¡Õ½Õ¡Ö€Õ¡Ö€ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ¨ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Õ¶ ÖƒÕ¸Õ­Õ¥Õ¬ Õ±Õ¥Ö€ Õ°Õ¡Õ´Õ¡ÕªÕ¡Õ´Õ¥ÖÕ¾Õ¡Õ® Õ°Õ¸Õ½Ö„Õ¥Ö€Õ¨:"</string>
+ <string name="permlab_readDictionary" msgid="4107101525746035718">"Õ¯Õ¡Ö€Õ¤Õ¡Õ¬ ÕºÕ¡ÕµÕ´Õ¡Õ¶Õ¶Õ¥Ö€Õ¨, Õ¸Ö€ Õ¡Õ¾Õ¥Õ¬Õ¡ÖÖ€Õ¥Õ¬ Õ¥Ö„ Õ¢Õ¡Õ¼Õ¡Ö€Õ¡Õ¶Õ¸Ö‚Õ´"</string>
+ <string name="permdesc_readDictionary" msgid="659614600338904243">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¯Õ¡Ö€Õ¤Õ¡Õ¬ Õ¢Õ¸Õ¬Õ¸Ö€ Õ¢Õ¡Õ¼Õ¥Ö€Õ¨, Õ¡Õ¶Õ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨ Ö‡ Õ¡Ö€Õ¿Õ¡Õ°Õ¡ÕµÕ¿Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨, Õ¸Ö€Õ¸Õ¶Ö„ Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¸Õ²Õ¨ Õ°Õ¶Õ¡Ö€Õ¡Õ¾Õ¸Ö€ Õ§ ÕºÕ¡Õ°Õ¥Õ¬ Õ§ Ö…Õ£Õ¿Õ¾Õ¸Õ²Õ« Õ¢Õ¡Õ¼Õ¡Ö€Õ¡Õ¶Õ¸Ö‚Õ´:"</string>
+ <string name="permlab_writeDictionary" msgid="2183110402314441106">"Õ¡Õ¾Õ¥Õ¬Õ¡ÖÕ¶Õ¥Õ¬ Õ¢Õ¡Õ¼Õ¥Ö€ Ö…Õ£Õ¿Õ¾Õ¸Õ²Õ« Õ°Õ¡Õ´Õ¡Ö€ Õ½Õ¡Õ°Õ´Õ¡Õ¶Õ¾Õ¡Õ® Õ¢Õ¡Õ¼Õ¡Ö€Õ¡Õ¶Õ¸Ö‚Õ´"</string>
+ <string name="permdesc_writeDictionary" msgid="8185385716255065291">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ£Ö€Õ¥Õ¬ Õ¶Õ¸Ö€ Õ¢Õ¡Õ¼Õ¥Ö€ Ö…Õ£Õ¿Õ¾Õ¸Õ²Õ« Õ¢Õ¡Õ¼Õ¡Ö€Õ¡Õ¶Õ¸Ö‚Õ´:"</string>
+ <string name="permlab_sdcardRead" product="nosdcard" msgid="8235341515605559677">"ÖƒÕ¸Ö€Õ±Õ¡Ö€Õ¯Õ¥Õ¬ Õ´Õ¸Ö‚Õ¿Ö„Õ¨ Õ¤Õ¥ÕºÕ« ÕºÕ¡Õ·Õ¿ÕºÕ¡Õ¶Õ¾Õ¡Õ® ÕºÕ¡Õ°Õ¸Ö"</string>
+ <string name="permlab_sdcardRead" product="default" msgid="8235341515605559677">"ÖƒÕ¸Ö€Õ±Õ¡Ö€Õ¯Õ¥Õ¬ Õ´Õ¸Ö‚Õ¿Ö„Õ¨ Õ¤Õ¥ÕºÕ« ÕºÕ¡Õ·Õ¿ÕºÕ¡Õ¶Õ¾Õ¡Õ® ÕºÕ¡Õ°Õ¸Ö"</string>
+ <string name="permdesc_sdcardRead" product="nosdcard" msgid="3642473292348132072">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ ÖƒÕ¸Ö€Õ±Õ¡Ö€Õ¯Õ¥Õ¬ USB Õ¯Ö€Õ«Õ¹Õ« Õ©Õ¸Ö‚ÕµÕ¬Õ¿Õ¾Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨, Õ¸Ö€Õ¨ Õ°Õ¡Õ½Õ¡Õ¶Õ¥Õ¬Õ« Õ¯Õ¬Õ«Õ¶Õ« Õ°Õ¥Õ¿Õ¡Õ£Õ¡ Õ½Õ¡Ö€Ö„Õ¥Ö€Õ¸Ö‚Õ´:"</string>
+ <string name="permdesc_sdcardRead" product="default" msgid="5914402684685848828">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ ÖƒÕ¸Ö€Õ±Õ¡Ö€Õ¯Õ¥Õ¬ SD Ö„Õ¡Ö€Õ¿Õ« Õ©Õ¸Ö‚ÕµÕ¬Õ¿Õ¾Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨, Õ¸Ö€Õ¨ Õ°Õ¡Õ½Õ¡Õ¶Õ¥Õ¬Õ« Õ¯Õ¬Õ«Õ¶Õ« Õ°Õ¥Õ¿Õ¡Õ£Õ¡ Õ½Õ¡Ö€Ö„Õ¥Ö€Õ« Õ¾Ö€Õ¡:"</string>
+ <string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"ÖƒÕ¸ÖƒÕ¸Õ­Õ¥Õ¬ Õ¯Õ¡Õ´ Õ»Õ¶Õ»Õ¥Õ¬ Õ±Õ¥Ö€ USB Õ¯Ö€Õ«Õ¹Õ« Õ¢Õ¸Õ¾Õ¡Õ¶Õ¤Õ¡Õ¯Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨"</string>
+ <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"ÖƒÕ¸ÖƒÕ¸Õ­Õ¥Õ¬ Õ¯Õ¡Õ´ Õ»Õ¶Õ»Õ¥Õ¬ Õ±Õ¥Ö€ SD Ö„Õ¡Ö€Õ¿Õ« Õ¢Õ¸Õ¾Õ¡Õ¶Õ¤Õ¡Õ¯Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨"</string>
+ <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ£Ö€Õ¥Õ¬ USB Õ¯Ö€Õ«Õ¹Õ« Õ¾Ö€Õ¡:"</string>
+ <string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ£Ö€Õ¥Õ¬ SD Ö„Õ¡Ö€Õ¿Õ« Õ¾Ö€Õ¡:"</string>
+ <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"ÖƒÕ¸ÖƒÕ¸Õ­Õ¥Õ¬/Õ»Õ¶Õ»Õ¥Õ¬ Õ¶Õ¥Ö€Ö„Õ«Õ¶ Õ´Õ¥Õ¤Õ«Õ¡ Õ¯Ö€Õ«Õ¹Õ« Õ¢Õ¸Õ¾Õ¡Õ¶Õ¤Õ¡Õ¯Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨"</string>
+ <string name="permdesc_mediaStorageWrite" product="default" msgid="8189160597698529185">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ ÖƒÕ¸ÖƒÕ¸Õ­Õ¥Õ¬ Õ¶Õ¥Ö€Ö„Õ«Õ¶ Õ´Õ¥Õ¤Õ«Õ¡ ÕºÕ¡Õ°Õ¸ÖÕ« Õ¢Õ¸Õ¾Õ¡Õ¶Õ¤Õ¡Õ¯Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨:"</string>
+ <string name="permlab_manageDocs" product="default" msgid="5778318598448849829">"Õ¯Õ¡Õ¼Õ¡Õ¾Õ¡Ö€Õ¥Õ¬ ÖƒÕ¡Õ½Õ¿Õ¡Õ©Õ²Õ©Õ¥Ö€Õ« ÕºÕ¡Õ°Õ¸ÖÕ¨"</string>
+ <string name="permdesc_manageDocs" product="default" msgid="8704323176914121484">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¯Õ¡Õ¼Õ¡Õ¾Õ¡Ö€Õ¥Õ¬ ÖƒÕ¡Õ½Õ¿Õ¡Õ©Õ²Õ©Õ« ÕºÕ¡Õ°Õ¸ÖÕ¨:"</string>
+ <string name="permlab_sdcardAccessAll" msgid="8150613823900460576">"մուտք ունենալ Õ¢Õ¸Õ¬Õ¸Ö€ Ö…Õ£Õ¿Õ¾Õ¸Õ²Õ¶Õ¥Ö€Õ« Õ¡Ö€Õ¿Õ¡Ö„Õ«Õ¶ ÕºÕ¡Õ°Õ¸Ö"</string>
+ <string name="permdesc_sdcardAccessAll" msgid="3215208357415891320">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ´Õ¸Ö‚Õ¿Ö„ Õ£Õ¸Ö€Õ®Õ¥Õ¬ Õ¡Ö€Õ¿Õ¡Ö„Õ«Õ¶ ÕºÕ¡Õ°Õ¸Ö բոլոր Ö…Õ£Õ¿Õ¾Õ¸Õ²Õ¶Õ¥Ö€Õ« Õ°Õ¡Õ´Õ¡Ö€:"</string>
+ <string name="permlab_cache_filesystem" msgid="5656487264819669824">"Õ´Õ¸Ö‚Õ¿Ö„ Ö„Õ¥Õ·Õ« Ö†Õ¡ÕµÕ¬Õ¥Ö€Õ« Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£"</string>
+ <string name="permdesc_cache_filesystem" msgid="5578967642265550955">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ£Ö€Õ¥Õ¬ Ö‡ Õ¯Õ¡Ö€Õ¤Õ¡Õ¬ Ö„Õ¥Õ· Ö†Õ¡ÕµÕ¬Õ¡ÕµÕ«Õ¶ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ¨:"</string>
+ <string name="permlab_use_sip" msgid="5986952362795870502">"Õ¯Õ¡Õ¿Õ¡Ö€Õ¥Õ¬ Õ¯Õ¡Õ´ Õ½Õ¿Õ¡Õ¶Õ¡Õ¬ Õ«Õ¶Õ¿Õ¥Ö€Õ¶Õ¥Õ¿Õ¡ÕµÕ«Õ¶ Õ¦Õ¡Õ¶Õ£Õ¥Ö€"</string>
+ <string name="permdesc_use_sip" msgid="4717632000062674294">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¥Õ¬ SIP Õ®Õ¡Õ¼Õ¡ÕµÕ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨` Õ«Õ¶Õ¿Õ¥Ö€Õ¶Õ¥Õ¿Õ¡ÕµÕ«Õ¶ Õ¦Õ¡Õ¶Õ£Õ¥Ö€ Õ¯Õ¡Õ¿Õ¡Ö€Õ¥Õ¬Õ¸Ö‚/Õ½Õ¿Õ¡Õ¶Õ¡Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€:"</string>
+ <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"Õ¯Õ¡Ö€Õ¤Õ¡Õ¬ ÕºÕ¡Õ¿Õ´Õ¡Õ¯Õ¡Õ¶ ÖÕ¡Õ¶ÖÕ« Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¸Ö‚Õ´Õ¨"</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¯Õ¡Ö€Õ¤Õ¡Õ¬ Õ°Õ¡Õ¿Õ¸Ö‚Õ¯ ÖÕ¡Õ¶ÖÕ¥Ö€Õ« Ö‡ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ« Õ°Õ¡Õ´Õ¡Ö€ ÖÕ¡Õ¶ÖÕ« Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ´Õ¡Õ¶ ÕºÕ¡Õ¿Õ´Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨:"</string>
+ <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"Õ¯Õ¡Õ¼Õ¡Õ¾Õ¡Ö€Õ¥Õ¬ ÖÕ¡Õ¶ÖÕ« Ö„Õ¡Õ²Õ¡Ö„Õ¡Õ¯Õ¡Õ¶Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨"</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¯Õ¡Õ¼Õ¡Õ¾Õ¡Ö€Õ¥Õ¬ ÖÕ¡Õ¶ÖÕ¡ÕµÕ«Õ¶ Ö„Õ¡Õ²Õ¡Ö„Õ¡Õ¯Õ¡Õ¶Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Ö‡ Õ½Õ¡Õ°Õ´Õ¡Õ¶Õ¥Õ¬ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ« Õ°Õ¡Õ¿Õ¸Ö‚Õ¯ Õ¯Õ¡Õ¶Õ¸Õ¶Õ¶Õ¥Ö€Õ¨:"</string>
+ <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"ÖƒÕ¸ÖƒÕ¸Õ­Õ¥Õ¬ ÖÕ¡Õ¶ÖÕ« Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ´Õ¡Õ¶ Õ°Õ¡Õ·Õ¾Õ¡Õ¼Õ¸Ö‚Õ´Õ¨"</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ ÖƒÕ¸ÖƒÕ¸Õ­Õ¥Õ¬, Õ©Õ¥ Õ«Õ¶Õ¹ÕºÕ¥Õ½ Õ§ ÖÕ¡Õ¶ÖÕ« Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¸Ö‚Õ´Õ¨ Õ°Õ¡Õ·Õ¾Õ¡Ö€Õ¯Õ¾Õ¸Ö‚Õ´ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ« Õ°Õ¡Õ´Õ¡Ö€: ÕÕ¸Õ¾Õ¸Ö€Õ¡Õ¯Õ¡Õ¶ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ« Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ´Õ¡Õ¶ Õ°Õ¡Õ´Õ¡Ö€ Õ¹Õ§:"</string>
+ <string name="permlab_markNetworkSocket" msgid="3658527214914959749">"ÖƒÕ¸ÖƒÕ¸Õ­Õ¥Õ¬ Õ¢Õ¶Õ«Õ¯Õ« Õ¶Õ·Õ¡Õ¶Õ¶Õ¥Ö€Õ¨"</string>
+ <string name="permdesc_markNetworkSocket" msgid="7655568433696356578">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ®Ö€Õ¡Õ£Ö€Õ«Õ¶ ÖƒÕ¸ÖƒÕ¸Õ­Õ¥Õ¬ Õ¢Õ¶Õ«Õ¯Õ« Õ¶Õ·Õ¡Õ¶Õ¶Õ¥Ö€Õ¨ Õ¥Ö€Õ©Õ¸Ö‚Õ²Õ´Õ¡Õ¶ Õ°Õ¡Õ´Õ¡Ö€"</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"Õ´Õ¸Ö‚Õ¿Ö„ Õ£Õ¸Ö€Õ®Õ¥Õ¬ Õ®Õ¡Õ¶Õ¸Ö‚ÖÕ¸Ö‚Õ´Õ¶Õ¥Ö€"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¡Õ¼Õ¢Õ¥Ö€Õ¥Õ¬, Õ¸Ö‚Õ½Õ¸Ö‚Õ´Õ¶Õ¡Õ½Õ«Ö€Õ¥Õ¬ Ö‡ Õ´Õ¡Ö„Ö€Õ¥Õ¬ Õ®Õ¡Õ¶Õ¸Ö‚ÖÕ¸Ö‚Õ´Õ¶Õ¥Ö€Õ¶, Õ¡ÕµÕ¤ Õ©Õ¾Õ¸Ö‚Õ´ Õ¶Õ¡Ö‡ Õ¡ÕµÕ¬ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ« Õ¯Õ¸Õ²Õ´Õ«Ö Õ£Ö€Õ¡Õ¼Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ¨:"</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"Õ´Õ«Õ¡Õ¶Õ¡Õ¬ Õ®Õ¡Õ¶Õ¸Ö‚ÖÕ¸Ö‚Õ´Õ¶Õ¥Ö€Õ« Õ¸Ö‚Õ¶Õ¯Õ¶Õ¤Ö€Õ«Õ¹ Õ®Õ¡Õ¼Õ¡ÕµÕ¸Ö‚Õ©ÕµÕ¡Õ¶Õ¨"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ½Õ¥ÖƒÕ¡Õ¯Õ¡Õ¶Õ¡Õ¿Õ«Ö€Õ¸Õ»Õ¨ Õ´Õ«Õ¡Õ¶Õ¡Õ¬ Õ®Õ¡Õ¶Õ¸Ö‚ÖÕ¸Ö‚Õ´Õ¶Õ¥Ö€Õ¨ Õ¸Ö‚Õ¶Õ¯Õ¶Õ¤Ö€Õ¸Õ² Õ®Õ¡Õ¼Õ¡ÕµÕ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ¾Õ¥Ö€Õ«Õ¶ Õ´Õ¡Õ¯Õ¡Ö€Õ¤Õ¡Õ¯Õ« Õ«Õ¶Õ¿Õ¥Ö€Ö†Õ¥ÕµÕ½Õ«Õ¶: ÕÕ¸Õ¾Õ¸Ö€Õ¡Õ¯Õ¡Õ¶ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ« Õ°Õ¡Õ´Õ¡Ö€ Õ¥Ö€Õ¢Ö‡Õ§ Õ¹ÕºÕ¥Õ¿Ö„ Õ§ Õ¡Õ¶Õ°Ö€Õ¡ÕªÕ¥Õ·Õ¿ Õ¬Õ«Õ¶Õ«:"</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"Õ£Õ¸Ö€Õ®Õ¡Ö€Õ¯Õ¥Õ¬ Ö…ÕºÕ¥Ö€Õ¡Õ¿Õ¸Ö€Õ« Õ¯Õ¸Õ²Õ´Õ«Ö Õ¿Ö€Õ¡Õ´Õ¡Õ¤Ö€Õ¾Õ¡Õ® Õ¯Õ¡Õ¦Õ´Õ¡Õ±Ö‡Õ´Õ¡Õ¶ Õ®Ö€Õ¡Õ£Õ«Ö€Õ¨"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ½Õ¥ÖƒÕ¡Õ¯Õ¡Õ¶Õ¡Õ¿Õ«Ö€Õ¸Õ»Õ¨ Õ£Õ¸Ö€Õ®Õ¡Ö€Õ¯Õ¥Õ¬ Ö…ÕºÕ¥Ö€Õ¡Õ¿Õ¸Ö€Õ« Õ¯Õ¸Õ²Õ´Õ«Ö Õ¿Ö€Õ¡Õ´Õ¡Õ¤Ö€Õ¾Õ¡Õ® Õ¯Õ¡Õ¦Õ´Õ¡Õ±Ö‡Õ´Õ¡Õ¶ Õ®Ö€Õ¡Õ£Õ«Ö€Õ¨: ÕÕ¸Õ¾Õ¸Ö€Õ¡Õ¯Õ¡Õ¶ Õ®Ö€Õ¡Õ£Ö€Õ¥Ö€Õ« Õ°Õ¡Õ´Õ¡Ö€ Õ¥Ö€Õ¢Ö‡Õ§ Õ¹ÕºÕ¥Õ¿Ö„ Õ§ Õ¡Õ¶Õ°Ö€Õ¡ÕªÕ¥Õ·Õ¿ Õ¬Õ«Õ¶Õ«:"</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"Õ¬Õ½Õ¥Õ¬ Õ¤Õ«Õ¿Õ¡Ö€Õ¯Õ¸Ö‚Õ´Õ¶Õ¥Ö€ ÖÕ¡Õ¶ÖÕ¡ÕµÕ«Õ¶ ÕºÕ¡ÕµÕ´Õ¡Õ¶Õ¶Õ¥Ö€Õ« Õ¾Õ¥Ö€Õ¡Õ¢Õ¥Ö€ÕµÕ¡Õ¬"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"Õ€Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ©Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ¬Õ½Õ¥Õ¬ Õ¤Õ«Õ¿Õ¡Ö€Õ¯Õ¸Ö‚Õ´Õ¶Õ¥Ö€ ÖÕ¡Õ¶ÖÕ¡ÕµÕ«Õ¶ ÕºÕ¡ÕµÕ´Õ¡Õ¶Õ¶Õ¥Ö€Õ« Õ¾Õ¥Ö€Õ¡Õ¢Õ¥Ö€ÕµÕ¡Õ¬: ÕÕ¸Õ¾Õ¸Ö€Õ¡Õ¯Õ¡Õ¶ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ« Õ°Õ¡Õ´Õ¡Ö€ Õ¥Ö€Õ¢Õ¥Ö„ ÕºÕ¥Õ¿Ö„ Õ¹Õ« Õ£Õ¡Õ¬Õ«Õ½:"</string>
+ <string name="policylab_limitPassword" msgid="4497420728857585791">"ÕÕ¡Õ°Õ´Õ¡Õ¶Õ¥Õ¬ Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ« Õ¯Õ¡Õ¶Õ¸Õ¶Õ¶Õ¥Ö€Õ¨"</string>
+ <string name="policydesc_limitPassword" msgid="3252114203919510394">"ÕŽÕ¥Ö€Õ¡Õ°Õ½Õ¯Õ¥Õ¬ Õ§Õ¯Ö€Õ¡Õ¶Õ« Õ¡ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ´Õ¡Õ¶ Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ¥Ö€Õ« Õ©Õ¸Ö‚ÕµÕ¬Õ¡Õ¿Ö€Õ¥Õ¬Õ« Õ¥Ö€Õ¯Õ¡Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶ Õ¸Ö‚ Õ£Ö€Õ¡Õ¶Õ·Õ¡Õ¶Õ¶Õ¥Ö€Õ¨:"</string>
+ <string name="policylab_watchLogin" msgid="914130646942199503">"ÕŽÕ¥Ö€Õ¡Õ°Õ½Õ¯Õ¥Õ¬ Õ§Õ¯Ö€Õ¡Õ¶Õ« Õ¡ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ´Õ¡Õ¶ ÖƒÕ¸Ö€Õ±Õ¥Ö€Õ¨"</string>
+ <string name="policydesc_watchLogin" product="tablet" msgid="3215729294215070072">"ÕŽÕ¥Ö€Õ¡Õ°Õ½Õ¯Õ¥Õ¬ Õ½Õ­Õ¡Õ¬ Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ¥Ö€Õ« Õ©Õ«Õ¾Õ¨, Õ¸Ö€Õ¸Õ¶Ö„ Õ´Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ¾Õ¥Õ¬ Õ¥Õ¶ Õ§Õ¯Ö€Õ¡Õ¶Õ¶ Õ¡ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ¥Õ¬Õ«Õ½, Ö‡ Õ¯Õ¸Õ²ÕºÕ¥Õ¬ Õ£Ö€Õ¡Õ½Õ¡Õ¬Õ«Õ¯Õ¨ Õ¯Õ¡Õ´ Õ»Õ¶Õ»Õ¥Õ¬ Õ£Ö€Õ¡Õ½Õ¡Õ¬Õ«Õ¯Õ« Õ¢Õ¸Õ¬Õ¸Ö€ Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨, Õ¥Õ©Õ¥ Õ´Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ¾Õ¥Õ¬ Õ¥Õ¶ Õ¹Õ¡ÖƒÕ«Ö Õ·Õ¡Õ¿ Õ½Õ­Õ¡Õ¬ Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ¥Ö€:"</string>
+ <string name="policydesc_watchLogin" product="default" msgid="5712323091846761073">"ÕŽÕ¥Ö€Õ¡Õ°Õ½Õ¯Õ¥Õ¬ Õ½Õ­Õ¡Õ¬ Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ¥Ö€Õ« Õ©Õ«Õ¾Õ¨, Õ¸Ö€Õ¸Õ¶Ö„ Õ´Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ¾Õ¥Õ¬ Õ¥Õ¶ Õ§Õ¯Ö€Õ¡Õ¶Õ¶ Õ¡ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ¥Õ¬Õ«Õ½, Ö‡ Õ¯Õ¸Õ²ÕºÕ¥Õ¬ Õ°Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ¨ Õ¯Õ¡Õ´ Õ»Õ¶Õ»Õ¥Õ¬ Õ°Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ« Õ¢Õ¸Õ¬Õ¸Ö€ Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨, Õ¥Õ©Õ¥ Õ´Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ¾Õ¥Õ¬ Õ¥Õ¶ Õ¹Õ¡ÖƒÕ«Ö Õ·Õ¡Õ¿ Õ½Õ­Õ¡Õ¬ Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ¥Ö€:"</string>
+ <string name="policylab_resetPassword" msgid="2620077191242688955">"Õ“Õ¸Õ­Õ¥Õ¬ Õ§Õ¯Ö€Õ¡Õ¶Õ« Õ¡ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ´Õ¡Õ¶ Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ¨"</string>
+ <string name="policydesc_resetPassword" msgid="605963962301904458">"Õ“Õ¸Õ­Õ¥Õ¬ Õ§Õ¯Ö€Õ¡Õ¶Õ« Õ¡ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ´Õ¡Õ¶ Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ¨:"</string>
+ <string name="policylab_forceLock" msgid="2274085384704248431">"Ô¿Õ¸Õ²ÕºÕ¥Õ¬ Õ§Õ¯Ö€Õ¡Õ¶Õ¨"</string>
+ <string name="policydesc_forceLock" msgid="1141797588403827138">"ÕŽÕ¥Ö€Õ¡Õ°Õ½Õ¯Õ¥Õ¬` Õ«Õ¶Õ¹ÕºÕ¥Õ½ Ö‡ Õ¥Ö€Õ¢ Õ§ Õ§Õ¯Ö€Õ¡Õ¶Õ¨ Õ¯Õ¸Õ²ÕºÕ¾Õ¸Ö‚Õ´:"</string>
+ <string name="policylab_wipeData" msgid="3910545446758639713">"Õ‹Õ¶Õ»Õ¥Õ¬ Õ¢Õ¸Õ¬Õ¸Ö€ Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨"</string>
+ <string name="policydesc_wipeData" product="tablet" msgid="4306184096067756876">"Õ‹Õ¶Õ»Õ¥Õ¬ Õ£Ö€Õ¡Õ½Õ¡Õ¬Õ«Õ¯Õ« Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¶ Õ¡Õ¼Õ¡Õ¶Ö Õ¶Õ¡Õ­Õ¡Õ¦Õ£Õ¸Ö‚Õ·Õ¡ÖÕ´Õ¡Õ¶` Õ¯Õ¡Õ¿Õ¡Ö€Õ¥Õ¬Õ¸Õ¾ Õ£Õ¸Ö€Õ®Õ¡Ö€Õ¡Õ¶Õ¡ÕµÕ«Õ¶ Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ« Õ¾Õ¥Ö€Õ¡Õ¯Õ¡ÕµÕ¸Ö‚Õ´:"</string>
+ <string name="policydesc_wipeData" product="default" msgid="5096895604574188391">"Õ‹Õ¶Õ»Õ¥Õ¬ Õ°Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ« Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¶ Õ¡Õ¼Õ¡Õ¶Ö Õ¶Õ¡Õ­Õ¡Õ¦Õ£Õ¸Ö‚Õ·Õ¡ÖÕ´Õ¡Õ¶` Õ¯Õ¡Õ¿Õ¡Ö€Õ¥Õ¬Õ¸Õ¾ Õ£Õ¸Ö€Õ®Õ¡Ö€Õ¡Õ¶Õ¡ÕµÕ«Õ¶ Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ« Õ¾Õ¥Ö€Õ¡Õ¯Õ¡ÕµÕ¸Ö‚Õ´:"</string>
+ <string name="policylab_setGlobalProxy" msgid="2784828293747791446">"Ô¿Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¥Õ¬ Õ½Õ¡Ö€Ö„Õ« Õ°Õ¡Õ´Õ¡Õ·Õ­Õ¡Ö€Õ°Õ¡ÕµÕ«Õ¶ ÕºÖ€Õ¸Ö„Õ½Õ«Õ¶"</string>
+ <string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"ÕÕ¡Ö€Ö„Õ¨ Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¥Õ¬, Õ¸Ö€ Õ°Õ¡Õ´Õ¡Õ·Õ­Õ¡Ö€Õ°Õ¡ÕµÕ«Õ¶ ÕºÖ€Õ¸Ö„Õ½Õ«Õ¶ Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¾Õ«, Õ¥Ö€Õ¢ Ö„Õ¡Õ²Õ¡Ö„Õ¡Õ¯Õ¡Õ¶Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Õ´Õ«Õ¡ÖÕ¾Õ¡Õ® Õ§: Õ„Õ«Õ¡ÕµÕ¶ Õ¡Õ¼Õ¡Õ»Õ«Õ¶ Õ½Õ¡Ö€Ö„Õ« Õ¯Õ¡Õ¼Õ¡Õ¾Õ¡Ö€Õ«Õ¹Õ¶ Õ§ Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´ Õ£Õ¸Ö€Õ®Õ¸Õ² Õ°Õ¡Õ´Õ¡Õ·Õ­Õ¡Ö€Õ°Õ¡ÕµÕ«Õ¶ ÕºÖ€Õ¸Ö„Õ½Õ«Õ¶:"</string>
+ <string name="policylab_expirePassword" msgid="885279151847254056">"ÕÕ¡Õ°Õ´Õ¡Õ¶Õ¥Õ¬ Õ§Õ¯Ö€Õ¡Õ¶Õ« Õ¯Õ¸Õ²ÕºÕ´Õ¡Õ¶ Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ« Õ½ÕºÕ¡Õ¼Õ´Õ¡Õ¶ ÕªÕ¡Õ´Õ¯Õ¥Õ¿Õ¨"</string>
+ <string name="policydesc_expirePassword" msgid="1729725226314691591">"ÕŽÕ¥Ö€Õ¡Õ°Õ½Õ¯Õ¥Õ¬` Õ«Õ¶Õ¹ Õ°Õ¡Õ³Õ¡Õ­Õ¡Õ¯Õ¡Õ¶Õ¸Ö‚Õ©ÕµÕ¡Õ´Õ¢ ÕºÕ¥Õ¿Ö„ Õ§ Õ§Õ¯Ö€Õ¡Õ¶Õ« Õ¯Õ¸Õ²ÕºÕ´Õ¡Õ¶ Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ¨ ÖƒÕ¸Õ­Õ¾Õ«:"</string>
+ <string name="policylab_encryptedStorage" msgid="8901326199909132915">"Ô¿Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¥Õ¬ ÕºÕ¡Õ°Õ¸ÖÕ« Õ¯Õ¸Õ¤Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´Õ¨"</string>
+ <string name="policydesc_encryptedStorage" msgid="2637732115325316992">"ÕŠÕ¡Õ°Õ¡Õ¶Õ»Õ¥Õ¬, Õ¸Ö€ ÕºÕ¡Õ°Õ¾Õ¸Õ² Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ« Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨ Õ¬Õ«Õ¶Õ¥Õ¶ Õ¯Õ¸Õ¤Õ¡Õ¾Õ¸Ö€Õ¾Õ¡Õ®:"</string>
+ <string name="policylab_disableCamera" msgid="6395301023152297826">"Ô¿Õ¡Õ½Õ¥ÖÕ¶Õ¥Õ¬ Õ¿Õ¥Õ½Õ¡Õ­ÖÕ«Õ¯Õ¶Õ¥Ö€Õ¨"</string>
+ <string name="policydesc_disableCamera" msgid="2306349042834754597">"Կանխել բոլոր Õ½Õ¡Ö€Ö„Õ¥Ö€Õ« Ö†Õ¸Õ¿Õ¸Õ­ÖÕ«Õ¯Õ¶Õ¥Ö€Õ« Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¸Ö‚Õ´Õ¨:"</string>
+ <string name="policylab_disableKeyguardFeatures" msgid="266329104542638802">"Ô±Õ¶Õ»Õ¡Õ¿Õ¥Õ¬ Õ½Õ¿Õ¥Õ²Õ¶Õ¡Õ¯Õ¸Õ²ÕºÕ¥Ö„Õ« Õ£Õ¸Ö€Õ®Õ¡Õ¼Õ¸Ö‚ÕµÕ©Õ¶Õ¥Ö€Õ¨"</string>
+ <string name="policydesc_disableKeyguardFeatures" msgid="3467082272186534614">"Ô¿Õ¡Õ¶Õ­Õ¥Õ¬ Õ½Õ¿Õ¥Õ²Õ¶Õ¡Õ¯Õ¸Õ²ÕºÕ¥Ö„Õ« Õ¸Ö€Õ¸Õ· Õ£Õ¸Ö€Õ®Õ¡Õ¼Õ¸Ö‚ÕµÕ©Õ¶Õ¥Ö€Õ« Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¸Ö‚Õ´Õ¨:"</string>
+ <string-array name="phoneTypes">
+ <item msgid="8901098336658710359">"ÕÕ¶Õ¡ÕµÕ«Õ¶"</item>
+ <item msgid="869923650527136615">"Ô²Õ»Õ»Õ¡ÕµÕ«Õ¶"</item>
+ <item msgid="7897544654242874543">"Ô±Õ·Õ­Õ¡Õ¿Õ¡Õ¶Ö„Õ¡ÕµÕ«Õ¶"</item>
+ <item msgid="1103601433382158155">"Ô±Õ·Õ­Õ¡Õ¿Õ¡Õ¶Ö„Õ¡ÕµÕ«Õ¶ Ö†Õ¡Ö„Õ½"</item>
+ <item msgid="1735177144948329370">"ÕÕ¶Õ¡ÕµÕ«Õ¶ Ö†Õ¡Ö„Õ½"</item>
+ <item msgid="603878674477207394">"Õ“Õ¥ÕµÕ»Õ¥Ö€"</item>
+ <item msgid="1650824275177931637">"Ô±ÕµÕ¬"</item>
+ <item msgid="9192514806975898961">"Õ€Õ¡Õ¿Õ¸Ö‚Õ¯"</item>
+ </string-array>
+ <string-array name="emailAddressTypes">
+ <item msgid="8073994352956129127">"ÕÕ¸Ö‚Õ¶"</item>
+ <item msgid="7084237356602625604">"Ô±Õ·Õ­Õ¡Õ¿Õ¡Õ¶Ö„Õ¡ÕµÕ«Õ¶"</item>
+ <item msgid="1112044410659011023">"Ô±ÕµÕ¬"</item>
+ <item msgid="2374913952870110618">"Õ€Õ¡Õ¿Õ¸Ö‚Õ¯"</item>
+ </string-array>
+ <string-array name="postalAddressTypes">
+ <item msgid="6880257626740047286">"ÕÕ¶Õ¡ÕµÕ«Õ¶"</item>
+ <item msgid="5629153956045109251">"Ô±Õ·Õ­Õ¡Õ¿Õ¡Õ¶Ö„Õ¡ÕµÕ«Õ¶"</item>
+ <item msgid="4966604264500343469">"Ô±ÕµÕ¬"</item>
+ <item msgid="4932682847595299369">"Õ€Õ¡Õ¿Õ¸Ö‚Õ¯"</item>
+ </string-array>
+ <string-array name="imAddressTypes">
+ <item msgid="1738585194601476694">"ÕÕ¶Õ¡ÕµÕ«Õ¶"</item>
+ <item msgid="1359644565647383708">"Ô±Õ·Õ­Õ¡Õ¿Õ¡Õ¶Ö„Õ¡ÕµÕ«Õ¶"</item>
+ <item msgid="7868549401053615677">"Ô±ÕµÕ¬"</item>
+ <item msgid="3145118944639869809">"Õ€Õ¡Õ¿Õ¸Ö‚Õ¯"</item>
+ </string-array>
+ <string-array name="organizationTypes">
+ <item msgid="7546335612189115615">"Ô±Õ·Õ­Õ¡Õ¿Õ¡Õ¶Ö„Õ¡ÕµÕ«Õ¶"</item>
+ <item msgid="4378074129049520373">"Ô±ÕµÕ¬"</item>
+ <item msgid="3455047468583965104">"Õ€Õ¡Õ¿Õ¸Ö‚Õ¯"</item>
+ </string-array>
+ <string-array name="imProtocols">
+ <item msgid="8595261363518459565">"AIM"</item>
+ <item msgid="7390473628275490700">"Windows Live"</item>
+ <item msgid="7882877134931458217">"Yahoo"</item>
+ <item msgid="5035376313200585242">"Skype"</item>
+ <item msgid="7532363178459444943">"QQ"</item>
+ <item msgid="3713441034299660749">"Google Talk"</item>
+ <item msgid="2506857312718630823">"ICQ"</item>
+ <item msgid="1648797903785279353">"Jabber"</item>
+ </string-array>
+ <string name="phoneTypeCustom" msgid="1644738059053355820">"Õ€Õ¡Õ¿Õ¸Ö‚Õ¯"</string>
+ <string name="phoneTypeHome" msgid="2570923463033985887">"ÕÕ¶Õ¡ÕµÕ«Õ¶"</string>
+ <string name="phoneTypeMobile" msgid="6501463557754751037">"Ô²Õ»Õ»Õ¡ÕµÕ«Õ¶"</string>
+ <string name="phoneTypeWork" msgid="8863939667059911633">"Ô±Õ·Õ­Õ¡Õ¿Õ¡Õ¶Ö„Õ¡ÕµÕ«Õ¶"</string>
+ <string name="phoneTypeFaxWork" msgid="3517792160008890912">"Ô±Õ·Õ­Õ¡Õ¿Õ¡Õ¶Ö„Õ¡ÕµÕ«Õ¶ Ö†Õ¡Ö„Õ½"</string>
+ <string name="phoneTypeFaxHome" msgid="2067265972322971467">"ÕÕ¶Õ¡ÕµÕ«Õ¶ Ö†Õ¡Ö„Õ½"</string>
+ <string name="phoneTypePager" msgid="7582359955394921732">"Õ“Õ¥ÕµÕ»Õ¥Ö€"</string>
+ <string name="phoneTypeOther" msgid="1544425847868765990">"Ô±ÕµÕ¬"</string>
+ <string name="phoneTypeCallback" msgid="2712175203065678206">"ÔµÕ¿Õ¦Õ¡Õ¶Õ£"</string>
+ <string name="phoneTypeCar" msgid="8738360689616716982">"Õ„Õ¥Ö„Õ¥Õ¶Õ¡"</string>
+ <string name="phoneTypeCompanyMain" msgid="540434356461478916">"Ô¸Õ¶Õ¯Õ¥Ö€Õ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ£Õ¬Õ­Õ¡Õ¾Õ¸Ö€"</string>
+ <string name="phoneTypeIsdn" msgid="8022453193171370337">"ISDN"</string>
+ <string name="phoneTypeMain" msgid="6766137010628326916">"Õ€Õ«Õ´Õ¶Õ¡Õ¯Õ¡Õ¶"</string>
+ <string name="phoneTypeOtherFax" msgid="8587657145072446565">"Ô±ÕµÕ¬ Ö†Õ¡Ö„Õ½"</string>
+ <string name="phoneTypeRadio" msgid="4093738079908667513">"Ռադիո"</string>
+ <string name="phoneTypeTelex" msgid="3367879952476250512">"ÕÕ¥Õ¬Õ¥Ö„Õ½"</string>
+ <string name="phoneTypeTtyTdd" msgid="8606514378585000044">"TTY TDD"</string>
+ <string name="phoneTypeWorkMobile" msgid="1311426989184065709">"Ô±Õ·Õ­Õ¡Õ¿Õ¡Õ¶Ö„Õ¡ÕµÕ«Õ¶ Õ¢Õ»Õ»Õ¡ÕµÕ«Õ¶ Õ°Õ¡Õ´Õ¡Ö€"</string>
+ <string name="phoneTypeWorkPager" msgid="649938731231157056">"Ô±Õ·Õ­Õ¡Õ¿Õ¡Õ¶Ö„Õ¡ÕµÕ«Õ¶ ÖƒÕ¥ÕµÕ»Õ¥Ö€"</string>
+ <string name="phoneTypeAssistant" msgid="5596772636128562884">"Õ•Õ£Õ¶Õ¡Õ¯Õ¡Õ¶"</string>
+ <string name="phoneTypeMms" msgid="7254492275502768992">"MMS"</string>
+ <string name="eventTypeCustom" msgid="7837586198458073404">"Õ€Õ¡Õ¿Õ¸Ö‚Õ¯"</string>
+ <string name="eventTypeBirthday" msgid="2813379844211390740">"Ô¾Õ¶Õ¶Õ¤ÕµÕ¡Õ¶ Ö…Ö€"</string>
+ <string name="eventTypeAnniversary" msgid="3876779744518284000">"ÕÕ¡Ö€Õ¥Õ¤Õ¡Ö€Õ±"</string>
+ <string name="eventTypeOther" msgid="7388178939010143077">"Ô±ÕµÕ¬"</string>
+ <string name="emailTypeCustom" msgid="8525960257804213846">"Õ€Õ¡Õ¿Õ¸Ö‚Õ¯"</string>
+ <string name="emailTypeHome" msgid="449227236140433919">"ÕÕ¶Õ¡ÕµÕ«Õ¶"</string>
+ <string name="emailTypeWork" msgid="3548058059601149973">"Ô±Õ·Õ­Õ¡Õ¿Õ¡Õ¶Ö„Õ¡ÕµÕ«Õ¶"</string>
+ <string name="emailTypeOther" msgid="2923008695272639549">"Ô±ÕµÕ¬"</string>
+ <string name="emailTypeMobile" msgid="119919005321166205">"Ô²Õ»Õ»Õ¡ÕµÕ«Õ¶"</string>
+ <string name="postalTypeCustom" msgid="8903206903060479902">"Õ€Õ¡Õ¿Õ¸Ö‚Õ¯"</string>
+ <string name="postalTypeHome" msgid="8165756977184483097">"ÕÕ¶Õ¡ÕµÕ«Õ¶"</string>
+ <string name="postalTypeWork" msgid="5268172772387694495">"Ô±Õ·Õ­Õ¡Õ¿Õ¡Õ¶Ö„Õ¡ÕµÕ«Õ¶"</string>
+ <string name="postalTypeOther" msgid="2726111966623584341">"Ô±ÕµÕ¬"</string>
+ <string name="imTypeCustom" msgid="2074028755527826046">"Õ€Õ¡Õ¿Õ¸Ö‚Õ¯"</string>
+ <string name="imTypeHome" msgid="6241181032954263892">"ÕÕ¸Ö‚Õ¶"</string>
+ <string name="imTypeWork" msgid="1371489290242433090">"Ô±Õ·Õ­Õ¡Õ¿Õ¡Õ¶Ö„Õ¡ÕµÕ«Õ¶"</string>
+ <string name="imTypeOther" msgid="5377007495735915478">"Ô±ÕµÕ¬"</string>
+ <string name="imProtocolCustom" msgid="6919453836618749992">"Õ€Õ¡Õ¿Õ¸Ö‚Õ¯"</string>
+ <string name="imProtocolAim" msgid="7050360612368383417">"AIM"</string>
+ <string name="imProtocolMsn" msgid="144556545420769442">"Windows Live"</string>
+ <string name="imProtocolYahoo" msgid="8271439408469021273">"Yahoo"</string>
+ <string name="imProtocolSkype" msgid="9019296744622832951">"Skype"</string>
+ <string name="imProtocolQq" msgid="8887484379494111884">"QQ"</string>
+ <string name="imProtocolGoogleTalk" msgid="493902321140277304">"Hangouts"</string>
+ <string name="imProtocolIcq" msgid="1574870433606517315">"ICQ"</string>
+ <string name="imProtocolJabber" msgid="2279917630875771722">"Jabber"</string>
+ <string name="imProtocolNetMeeting" msgid="8287625655986827971">"NetMeeting"</string>
+ <string name="orgTypeWork" msgid="29268870505363872">"Ô±Õ·Õ­Õ¡Õ¿Õ¡Õ¶Ö„Õ¡ÕµÕ«Õ¶"</string>
+ <string name="orgTypeOther" msgid="3951781131570124082">"Ô±ÕµÕ¬"</string>
+ <string name="orgTypeCustom" msgid="225523415372088322">"Õ€Õ¡Õ¿Õ¸Ö‚Õ¯"</string>
+ <string name="relationTypeCustom" msgid="3542403679827297300">"Õ€Õ¡Õ¿Õ¸Ö‚Õ¯"</string>
+ <string name="relationTypeAssistant" msgid="6274334825195379076">"Õ•Õ£Õ¶Õ¡Õ¯Õ¡Õ¶"</string>
+ <string name="relationTypeBrother" msgid="8757913506784067713">"ÔµÕ²Õ¢Õ¡ÕµÖ€"</string>
+ <string name="relationTypeChild" msgid="1890746277276881626">"ÔµÖ€Õ¥Õ­Õ¡"</string>
+ <string name="relationTypeDomesticPartner" msgid="6904807112121122133">"ÕÕ¥Õ²Õ¡Õ¯Õ¡Õ¶ Õ£Õ¸Ö€Õ®Õ¨Õ¶Õ¯Õ¥Ö€"</string>
+ <string name="relationTypeFather" msgid="5228034687082050725">"Õ€Õ¡ÕµÖ€"</string>
+ <string name="relationTypeFriend" msgid="7313106762483391262">"Ô¸Õ¶Õ¯Õ¥Ö€"</string>
+ <string name="relationTypeManager" msgid="6365677861610137895">"Ô¿Õ¡Õ¼Õ¡Õ¾Õ¡Ö€Õ«Õ¹"</string>
+ <string name="relationTypeMother" msgid="4578571352962758304">"Õ„Õ¡ÕµÖ€"</string>
+ <string name="relationTypeParent" msgid="4755635567562925226">"Ô¾Õ¶Õ¸Õ²"</string>
+ <string name="relationTypePartner" msgid="7266490285120262781">"Ô³Õ¸Ö€Õ®Õ¨Õ¶Õ¯Õ¥Ö€"</string>
+ <string name="relationTypeReferredBy" msgid="101573059844135524">"Õ€Õ²Õ¾Õ¡Õ® Õ§"</string>
+ <string name="relationTypeRelative" msgid="1799819930085610271">"Ô²Õ¡Ö€Õ¥Õ¯Õ¡Õ´"</string>
+ <string name="relationTypeSister" msgid="1735983554479076481">"Õ”Õ¸Ö‚ÕµÖ€"</string>
+ <string name="relationTypeSpouse" msgid="394136939428698117">"Ô±Õ´Õ¸Ö‚Õ½Õ«Õ¶"</string>
+ <string name="sipAddressTypeCustom" msgid="2473580593111590945">"Õ€Õ¡Õ¿Õ¸Ö‚Õ¯"</string>
+ <string name="sipAddressTypeHome" msgid="6093598181069359295">"ÕÕ¶Õ¡ÕµÕ«Õ¶"</string>
+ <string name="sipAddressTypeWork" msgid="6920725730797099047">"Ô±Õ·Õ­Õ¡Õ¿Õ¡Õ¶Ö„Õ¡ÕµÕ«Õ¶"</string>
+ <string name="sipAddressTypeOther" msgid="4408436162950119849">"Ô±ÕµÕ¬"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"Õ„Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ¥Ö„ PIN Õ¯Õ¸Õ¤Õ¨"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"Õ„Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ¥Ö„ PUK-Õ¨ Ö‡ Õ¶Õ¸Ö€ PIN Õ¯Õ¸Õ¤Õ¨"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"PUK Õ¯Õ¸Õ¤"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"Õ†Õ¸Ö€ PIN Õ®Õ¡Õ®Õ¯Õ¡Õ£Õ«Ö€"</string>
+ <string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"Õ€ÕºÕ¥Ö„` Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ¨ Õ´Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€"</font></string>
+ <string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Õ„Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ¥Ö„ Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ¨ Õ¡ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ´Õ¡Õ¶ Õ°Õ¡Õ´Õ¡Ö€"</string>
+ <string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Õ„Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ¥Ö„ PIN-Õ¨ Õ¡ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ´Õ¡Õ¶ Õ°Õ¡Õ´Õ¡Ö€"</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"ÕÕ­Õ¡Õ¬ PIN Õ®Õ¡Õ®Õ¯Õ¡Õ£Õ«Ö€:"</string>
+ <string name="keyguard_label_text" msgid="861796461028298424">"Ô±ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ´Õ¡Õ¶ Õ°Õ¡Õ´Õ¡Ö€ Õ½Õ¥Õ²Õ´Õ¥Ö„ Õ‘Õ¡Õ¶Õ¯, Õ¡ÕºÕ¡ 0:"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"Ô±Ö€Õ¿Õ¡Õ¯Õ¡Ö€Õ£ Õ«Ö€Õ¡Õ¾Õ«Õ³Õ¡Õ¯Õ¶Õ¥Ö€Õ« Õ°Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ¡Õ°Õ¡Õ´Õ¡Ö€"</string>
+ <string name="lockscreen_carrier_default" msgid="8963839242565653192">"Ô¾Õ¡Õ¼Õ¡ÕµÕ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶ Õ¹Õ¯Õ¡:"</string>
+ <string name="lockscreen_screen_locked" msgid="7288443074806832904">"Ô·Õ¯Ö€Õ¡Õ¶Õ¨ Õ¯Õ¸Õ²ÕºÕ¾Õ¡Õ® Õ§:"</string>
+ <string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"ÕÕ¥Õ²Õ´Õ¥Ö„ Õ‘Õ¡Õ¶Õ¯` Õ¡ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€, Õ¯Õ¡Õ´ Õ¯Õ¡Õ¿Õ¡Ö€Õ¥Ö„ Õ¡Ö€Õ¿Õ¡Õ¯Õ¡Ö€Õ£ Õ«Ö€Õ¡Õ¾Õ«Õ³Õ¡Õ¯Õ¶Õ¥Ö€Õ« Õ¦Õ¡Õ¶Õ£:"</string>
+ <string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Ô±ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€ Õ½Õ¥Õ²Õ´Õ¥Ö„ Õ‘Õ¡Õ¶Õ¯Õ¨:"</string>
+ <string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"Õ€Õ¡Õ¾Õ¡Ö„Õ¥Ö„ Õ½Õ­Õ¥Õ´Õ¡Õ¶` Õ¡ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€"</string>
+ <string name="lockscreen_emergency_call" msgid="5347633784401285225">"Ô±Ö€Õ¿Õ¡Õ¯Õ¡Ö€Õ£ Õ«Ö€Õ¡Õ¾Õ«Õ³Õ¡Õ¯Õ¶Õ¥Ö€Õ« Õ°Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ¡Õ¦Õ¡Õ¶Õ£"</string>
+ <string name="lockscreen_return_to_call" msgid="5244259785500040021">"ÕŽÕ¥Ö€Õ¡Õ¤Õ¡Õ¼Õ¶Õ¡Õ¬ Õ¦Õ¡Õ¶Õ£Õ«Õ¶"</string>
+ <string name="lockscreen_pattern_correct" msgid="9039008650362261237">"ÕƒÕ«Õ·Õ¿ Õ§:"</string>
+ <string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"Ô¿Ö€Õ¯Õ«Õ¶ ÖƒÕ¸Ö€Õ±Õ¥Ö„"</string>
+ <string name="lockscreen_password_wrong" msgid="5737815393253165301">"Ô¿Ö€Õ¯Õ«Õ¶ ÖƒÕ¸Ö€Õ±Õ¥Ö„"</string>
+ <string name="faceunlock_multiple_failures" msgid="754137583022792429">"Ô±Õ¼Õ¡Õ¾Õ¥Õ¬Õ¡Õ£Õ¸Ö‚ÕµÕ¶ Ô´Õ¥Õ´Ö„Õ¸Õ¾ Õ¡ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ´Õ¡Õ¶ ÖƒÕ¸Ö€Õ±Õ¥Ö€Õ¨ Õ£Õ¥Ö€Õ¡Õ¦Õ¡Õ¶ÖÕ¾Õ¡Õ® Õ¥Õ¶"</string>
+ <string name="lockscreen_plugged_in" msgid="8057762828355572315">"Ô¼Õ«ÖÖ„Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´, <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+ <string name="lockscreen_charged" msgid="321635745684060624">"Ô¼Õ«ÖÖ„Õ¡Õ¾Õ¸Ö€Õ¾Õ¡Õ® Õ§"</string>
+ <string name="lockscreen_battery_short" msgid="4477264849386850266">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+ <string name="lockscreen_low_battery" msgid="1482873981919249740">"Õ„Õ«Õ¡ÖÖ€Õ¥Ö„ Õ±Õ¥Ö€ Õ¬Õ«ÖÖ„Õ¡Õ¾Õ¸Ö€Õ«Õ¹Õ¨:"</string>
+ <string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"SIM Ö„Õ¡Ö€Õ¿ Õ¹Õ¯Õ¡"</string>
+ <string name="lockscreen_missing_sim_message" product="tablet" msgid="151659196095791474">"Ô³Ö€Õ¡Õ½Õ¡Õ¬Õ«Õ¯Õ¸Ö‚Õ´ SIM Ö„Õ¡Ö€Õ¿ Õ¹Õ¯Õ¡:"</string>
+ <string name="lockscreen_missing_sim_message" product="default" msgid="2186920585695169078">"Õ€Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ¸Ö‚Õ´ SIM Ö„Õ¡Ö€Õ¿ Õ¹Õ¯Õ¡:"</string>
+ <string name="lockscreen_missing_sim_instructions" msgid="5372787138023272615">"Õ„Õ¿ÖÖ€Õ¥Ö„ SIM Ö„Õ¡Ö€Õ¿Õ¨:"</string>
+ <string name="lockscreen_missing_sim_instructions_long" msgid="3526573099019319472">"SIM Ö„Õ¡Ö€Õ¿Õ¨ Õ¢Õ¡ÖÕ¡Õ¯Õ¡ÕµÕ¸Ö‚Õ´ Õ§ Õ¯Õ¡Õ´ Õ¹Õ« Õ¯Õ¡Ö€Õ¸Õ² Õ¯Õ¡Ö€Õ¤Õ¡ÖÕ¾Õ¥Õ¬: Õ„Õ¿ÖÖ€Õ¥Ö„ SIM Ö„Õ¡Ö€Õ¿:"</string>
+ <string name="lockscreen_permanent_disabled_sim_message_short" msgid="5096149665138916184">"Ô±Õ¶ÕºÕ«Õ¿Õ¡Õ¶ SIM Ö„Õ¡Ö€Õ¿:"</string>
+ <string name="lockscreen_permanent_disabled_sim_instructions" msgid="910904643433151371">"ÕÕ¥Ö€ SIM Ö„Õ¡Ö€Õ¿Õ¨ Õ¨Õ¶Õ¤Õ´Õ«Õ·Õ¿ Õ¯Õ¡Õ½Õ¥ÖÕ¾Õ¡Õ® Õ§:\n Ô¿Õ¡ÕºÕ¾Õ¥Ö„ Õ±Õ¥Ö€ Õ¡Õ¶Õ¬Õ¡Ö€ Õ®Õ¡Õ¼Õ¡ÕµÕ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ« Õ´Õ¡Õ¿Õ¡Õ¯Õ¡Ö€Õ¡Ö€Õ« Õ°Õ¥Õ¿ Õ´Õ¥Õ¯ Õ¡ÕµÕ¬ SIM Ö„Õ¡Ö€Õ¿Õ« Õ°Õ¡Õ´Õ¡Ö€:"</string>
+ <string name="lockscreen_transport_prev_description" msgid="201594905152746886">"Õ†Õ¡Õ­Õ¸Ö€Õ¤ Õ°Õ¥Õ¿Ö„Õ« Õ¯Õ¸Õ³Õ¡Õ¯"</string>
+ <string name="lockscreen_transport_next_description" msgid="6089297650481292363">"Õ€Õ¡Õ»Õ¸Ö€Õ¤ Õ°Õ¥Õ¿Õ¡Õ£Õ®Õ« Õ¯Õ¸Õ³Õ¡Õ¯"</string>
+ <string name="lockscreen_transport_pause_description" msgid="7659088786780128001">"Ô´Õ¡Õ¤Õ¡Ö€Õ« Õ¯Õ¸Õ³Õ¡Õ¯"</string>
+ <string name="lockscreen_transport_play_description" msgid="5888422938351019426">"Õ†Õ¾Õ¡Õ£Õ¡Ö€Õ¯Õ´Õ¡Õ¶ Õ¯Õ¸Õ³Õ¡Õ¯"</string>
+ <string name="lockscreen_transport_stop_description" msgid="4562318378766987601">"Ô¿Õ¡Õ¶Õ£Õ« Õ¯Õ¸Õ³Õ¡Õ¯"</string>
+ <string name="emergency_calls_only" msgid="6733978304386365407">"Õ„Õ«Õ¡ÕµÕ¶ Õ¡Ö€Õ¿Õ¡Õ¯Õ¡Ö€Õ£ Õ«Ö€Õ¡Õ¾Õ«Õ³Õ¡Õ¯Õ¶Õ¥Ö€Õ« Õ¦Õ¡Õ¶Õ£Õ¥Ö€"</string>
+ <string name="lockscreen_network_locked_message" msgid="143389224986028501">"Õ‘Õ¡Õ¶ÖÕ¨ Õ¯Õ¸Õ²ÕºÕ¾Õ¡Õ® Õ§"</string>
+ <string name="lockscreen_sim_puk_locked_message" msgid="7441797339976230">"SIM Ö„Õ¡Ö€Õ¿Õ¨ PUK-Õ¸Õ¾ Õ¯Õ¸Õ²ÕºÕ¾Õ¡Õ® Õ§:"</string>
+ <string name="lockscreen_sim_puk_locked_instructions" msgid="8127916255245181063">"ÕÕ¥Õ½Õ¥Ö„ Õ•Õ£Õ¿Õ¾Õ¸Õ²Õ« Õ¸Ö‚Õ²Õ¥ÖÕ¸Ö‚ÕµÖÕ¨ Õ¯Õ¡Õ´ Õ¤Õ«Õ´Õ¥Ö„ Ô²Õ¡ÕªÕ¡Õ¶Õ¸Ö€Õ¤Õ¶Õ¥Ö€Õ« Õ½ÕºÕ¡Õ½Õ¡Ö€Õ¯Õ´Õ¡Õ¶ Õ¯Õ¥Õ¶Õ¿Ö€Õ¸Õ¶:"</string>
+ <string name="lockscreen_sim_locked_message" msgid="8066660129206001039">"SIM Ö„Õ¡Ö€Õ¿Õ¨ Õ¯Õ¸Õ²ÕºÕ¾Õ¡Õ® Õ§:"</string>
+ <string name="lockscreen_sim_unlock_progress_dialog_message" msgid="595323214052881264">"SIM քարտը ապակողպվում է…"</string>
+ <string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="6481623830344107222">"Դուք <xliff:g id="NUMBER_0">%d</xliff:g> Õ¡Õ¶Õ£Õ¡Õ´ Õ½Õ­Õ¡Õ¬ Õ¥Ö„ Õ°Õ¡Õ¾Õ¡Ö„Õ¥Õ¬ Õ±Õ¥Ö€ Õ¡ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ´Õ¡Õ¶ Õ½Õ­Õ¥Õ´Õ¡Õ¶: \n\nÕ“Õ¸Ö€Õ±Õ¥Ö„ Õ¯Ö€Õ¯Õ«Õ¶ <xliff:g id="NUMBER_1">%d</xliff:g> Õ¾Õ¡ÕµÖ€Õ¯ÕµÕ¡Õ¶Õ«Ö:"</string>
+ <string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="2725973286239344555">"Ô´Õ¸Ö‚Ö„ Õ½Õ­Õ¡Õ¬ Õ¥Ö„ Õ´Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ¥Õ¬ Õ±Õ¥Ö€ Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ¨ <xliff:g id="NUMBER_0">%d</xliff:g> Õ¡Õ¶Õ£Õ¡Õ´: \n\n Õ“Õ¸Ö€Õ±Õ¥Ö„ Õ¯Ö€Õ¯Õ«Õ¶ <xliff:g id="NUMBER_1">%d</xliff:g> Õ¾Õ¡ÕµÖ€Õ¯ÕµÕ¡Õ¶Õ«Ö:"</string>
+ <string name="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="6216672706545696955">"Դուք <xliff:g id="NUMBER_0">%d</xliff:g> Õ¡Õ¶Õ£Õ¡Õ´ Õ½Õ­Õ¡Õ¬ Õ¥Ö„ Õ´Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ¥Õ¬ Õ±Õ¥Ö€ PIN-Õ¨: \n\nÕ“Õ¸Ö€Õ±Õ¥Ö„ Õ¯Ö€Õ¯Õ«Õ¶ <xliff:g id="NUMBER_1">%d</xliff:g> Õ¾Õ¡ÕµÖ€Õ¯ÕµÕ¡Õ¶Õ«Ö:"</string>
+ <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="9191611984625460820">"Դուք <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_failed_attempts_almost_glogin" product="default" msgid="2590227559763762751">"Ô´Õ¸Ö‚Ö„ <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_failed_attempts_almost_at_wipe" product="tablet" msgid="6128106399745755604">"Ô´Õ¸Ö‚Ö„ <xliff:g id="NUMBER_0">%d</xliff:g> Õ¡Õ¶Õ£Õ¡Õ´ Õ£Ö€Õ¡Õ½Õ¡Õ¬Õ«Õ¯Õ¶ Õ¡ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ¥Õ¬Õ¸Ö‚ Õ½Õ­Õ¡Õ¬ ÖƒÕ¸Ö€Õ± Õ¥Ö„ Õ¡Ö€Õ¥Õ¬: ÔµÕ¾Õ½ <xliff:g id="NUMBER_1">%d</xliff:g> Õ¡Õ¶Õ°Õ¡Õ»Õ¸Õ² ÖƒÕ¸Ö€Õ±Õ«Ö Õ°Õ¥Õ¿Õ¸ Õ£Ö€Õ¡Õ½Õ¡Õ¬Õ«Õ¯Õ¨ Õ¯Õ¾Õ¥Ö€Õ¡Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¾Õ« Õ£Õ¸Ö€Õ®Õ¡Ö€Õ¡Õ¶Õ¡ÕµÕ«Õ¶ Õ¬Õ¼Õ¥Õ¬ÕµÕ¡ÕµÕ¶Õ«, Ö‡ Ö…Õ£Õ¿Õ¾Õ¸Õ²Õ« Õ¢Õ¸Õ¬Õ¸Ö€ Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨ Õ¯Õ¯Õ¸Ö€Õ¥Õ¶:"</string>
+ <string name="lockscreen_failed_attempts_almost_at_wipe" product="default" msgid="8603565142156826565">"Ô´Õ¸Ö‚Ö„ <xliff:g id="NUMBER_0">%d</xliff:g> Õ¡Õ¶Õ£Õ¡Õ´ Õ°Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ¨ Õ¡ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ¥Õ¬Õ¸Ö‚ Õ½Õ­Õ¡Õ¬ ÖƒÕ¸Ö€Õ± Õ¥Ö„ Õ¡Ö€Õ¥Õ¬: ÔµÕ¾Õ½ <xliff:g id="NUMBER_1">%d</xliff:g> Õ¡Õ¶Õ°Õ¡Õ»Õ¸Õ² ÖƒÕ¸Ö€Õ±Õ«Ö Õ°Õ¥Õ¿Õ¸ Õ°Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ¨ Õ¯Õ¾Õ¥Ö€Õ¡Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¾Õ« Õ£Õ¸Ö€Õ®Õ¡Ö€Õ¡Õ¶Õ¡ÕµÕ«Õ¶ Õ½Õ¯Õ¦Õ¢Õ¶Õ¡Õ¤Õ«Ö€ Õ¼Õ¥ÕªÕ«Õ´Õ«, Ö‡ Ö…Õ£Õ¿Õ¾Õ¸Õ²Õ« Õ¢Õ¸Õ¬Õ¸Ö€ Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨ Õ¯Õ¯Õ¸Ö€Õ¥Õ¶:"</string>
+ <string name="lockscreen_failed_attempts_now_wiping" product="tablet" msgid="280873516493934365">"Ô´Õ¸Ö‚Ö„ <xliff:g id="NUMBER">%d</xliff:g> Õ¡Õ¶Õ£Õ¡Õ´ Õ½Õ­Õ¡Õ¬ ÖƒÕ¸Ö€Õ± Õ¥Ö„ Õ¡Ö€Õ¥Õ¬ Õ£Ö€Õ¡Õ½Õ¡Õ¬Õ«Õ¯Õ¶ Õ¡ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€: Ô³Ö€Õ¡Õ½Õ¡Õ¬Õ«Õ¯Õ¶ Õ¡ÕµÕªÕ´ Õ¯Õ¾Õ¥Ö€Õ¡Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¾Õ« Õ£Õ¸Ö€Õ®Õ¡Ö€Õ¡Õ¶Õ¡ÕµÕ«Õ¶ Õ¬Õ¼Õ¥Õ¬ÕµÕ¡ÕµÕ¶Õ«:"</string>
+ <string name="lockscreen_failed_attempts_now_wiping" product="default" msgid="3025504721764922246">"Ô´Õ¸Ö‚Ö„ <xliff:g id="NUMBER">%d</xliff:g> Õ¡Õ¶Õ£Õ¡Õ´ Õ°Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ¨ Õ¡ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ¥Õ¬Õ¸Ö‚ Õ½Õ­Õ¡Õ¬ ÖƒÕ¸Ö€Õ± Õ¥Ö„ Õ¡Ö€Õ¥Õ¬: Õ€Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ¶ Õ¡ÕµÕªÕ´ Õ¯Õ¾Õ¥Ö€Õ¡Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¾Õ« Õ£Õ¸Ö€Õ®Õ¡Ö€Õ¡Õ¶Õ¡ÕµÕ«Õ¶ Õ½Õ¯Õ¦Õ¢Õ¶Õ¡Õ¤Õ«Ö€ Õ¼Õ¥ÕªÕ«Õ´Õ«:"</string>
+ <string name="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"Õ“Õ¸Ö€Õ±Õ¥Ö„ Õ¯Ö€Õ¯Õ«Õ¶ <xliff:g id="NUMBER">%d</xliff:g> Õ¾Õ¡ÕµÖ€Õ¯ÕµÕ¡Õ¶Õ«Ö:"</string>
+ <string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"Õ„Õ¸Õ¼Õ¡ÖÕ¥ÕžÕ¬ Õ¥Ö„ Õ½Õ­Õ¥Õ´Õ¡Õ¶:"</string>
+ <string name="lockscreen_glogin_forgot_pattern" msgid="2588521501166032747">"Õ€Õ¡Õ·Õ¾Õ« Õ¡ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ¸Ö‚Õ´"</string>
+ <string name="lockscreen_glogin_too_many_attempts" msgid="2751368605287288808">"Õ‰Õ¡ÖƒÕ«Ö Õ·Õ¡Õ¿ Õ½Õ­Õ¥Õ´Õ¡ÕµÕ« ÖƒÕ¸Ö€Õ±Õ¥Ö€"</string>
+ <string name="lockscreen_glogin_instructions" msgid="3931816256100707784">"Ô±ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€` Õ´Õ¸Ö‚Õ¿Ö„ Õ£Õ¸Ö€Õ®Õ¥Ö„ Õ±Õ¥Ö€ Google Õ°Õ¡Õ·Õ¾Õ¸Õ¾:"</string>
+ <string name="lockscreen_glogin_username_hint" msgid="8846881424106484447">"Õ•Õ£Õ¿Õ¡Õ¶Õ¸Ö‚Õ¶ (Õ§Õ¬ÖƒÕ¸Õ½Õ¿)"</string>
+ <string name="lockscreen_glogin_password_hint" msgid="5958028383954738528">"Ô³Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼"</string>
+ <string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"Õ„Õ¸Ö‚Õ¿Ö„ Õ£Õ¸Ö€Õ®Õ¥Õ¬"</string>
+ <string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"Ô±Õ¶Õ¾Õ¡Õ¾Õ¥Ö€ Ö…Õ£Õ¿Õ¡Õ¶Õ¸Ö‚Õ¶ Õ¯Õ¡Õ´ Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼:"</string>
+ <string name="lockscreen_glogin_account_recovery_hint" msgid="1696924763690379073">"Õ„Õ¸Õ¼Õ¡ÖÕ¥ÕžÕ¬ Õ¥Ö„ Õ±Õ¥Ö€ Ö…Õ£Õ¿Õ¡Õ¶Õ¸Ö‚Õ¶Õ¨ Õ¯Õ¡Õ´ Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ¨:\nÔ±ÕµÖÕ¥Õ¬Õ¥Ö„ "<b>"google.com/accounts/recovery"</b>":"</string>
+ <string name="lockscreen_glogin_checking_password" msgid="7114627351286933867">"ÕÕ¿Õ¸Ö‚Õ£Õ¾Õ¸Ö‚Õ´ Õ§..."</string>
+ <string name="lockscreen_unlock_label" msgid="737440483220667054">"Ô±ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ¥Õ¬"</string>
+ <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"ÕÕ¡ÕµÕ¶Õ¨ Õ´Õ«Õ¡ÖÕ¶Õ¥Õ¬"</string>
+ <string name="lockscreen_sound_off_label" msgid="996822825154319026">"Ô±Õ¶Õ±Õ¡ÕµÕ¶"</string>
+ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"ÕÕ­Õ¥Õ´Õ¡ÕµÕ« Õ°Õ¡Õ¾Õ¡Ö„Õ¸Ö‚Õ´Õ¨ Õ½Õ¯Õ½Õ¾Õ¡Õ® Õ§"</string>
+ <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"ÕÕ­Õ¥Õ´Õ¡Õ¶ Õ´Õ¡Ö„Ö€Õ¾Õ¡Õ® Õ§"</string>
+ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Ô±Õ¾Õ¥Õ¬Õ¡ÖÕ¾Õ¥Õ¬ Õ§ Õ¾Õ¡Õ¶Õ¤Õ¡Õ¯"</string>
+ <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"ÕÕ­Õ¥Õ´Õ¡ÕµÕ« Õ°Õ¡Õ¾Õ¡Ö„Õ¸Ö‚Õ´Õ¶ Õ¡Õ¾Õ¡Ö€Õ¿Õ¾Õ¡Õ® Õ§"</string>
+ <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. ÕŽÕ«Õ»Õ¥Õ© %2$d of %3$d:"</string>
+ <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Ô±Õ¾Õ¥Õ¬Õ¡ÖÕ¶Õ¥Õ¬ Õ¾Õ«Õ»Õ¥Õ©:"</string>
+ <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Ô´Õ¡Õ¿Õ¡Ö€Õ¯"</string>
+ <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Ô±ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ´Õ¡Õ¶ Õ¿Õ¡Ö€Õ¡Õ®Ö„Õ¶ Õ¨Õ¶Õ¤Õ¬Õ¡ÕµÕ¶Õ¾Õ¡Õ® Õ§:"</string>
+ <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Ô±ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ´Õ¡Õ¶ Õ¿Õ¡Ö€Õ¡Õ®Ö„Õ¨ Õ¥Õ¿ Õ§ Õ®Õ¡Õ¬Õ¾Õ¡Õ®:"</string>
+ <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> Õ¾Õ«Õ»Õ¥Õ©:"</string>
+ <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"Õ•Õ£Õ¿Õ¾Õ¸Õ²Õ« Õ¨Õ¶Õ¿Ö€Õ«Õ¹"</string>
+ <string name="keyguard_accessibility_status" msgid="8008264603935930611">"Ô¿Õ¡Ö€Õ£Õ¡Õ¾Õ«Õ³Õ¡Õ¯"</string>
+ <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Õ–Õ¸Õ¿Õ¸Õ­ÖÕ«Õ¯"</string>
+ <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Õ„Õ¥Õ¤Õ«Õ¡ Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´Õ¶Õ¥Ö€"</string>
+ <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"ÕŽÕ«Õ»Õ¥Õ©Õ¶Õ¥Ö€Õ« Õ¾Õ¥Ö€Õ¡Õ¤Õ¡Õ½Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´Õ¨ Õ´Õ¥Õ¯Õ¶Õ¡Ö€Õ¯Õ¥Õ¬ Õ§:"</string>
+ <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"ÕŽÕ«Õ»Õ¥Õ©Õ« Õ¾Õ¥Ö€Õ¡Õ¤Õ¡Õ½Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´Õ¶ Õ¡Õ¾Õ¡Ö€Õ¿Õ¾Õ¥Ö:"</string>
+ <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"ÕŽÕ«Õ»Õ¥Õ© <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>-Õ¨ Õ»Õ¶Õ»Õ¾Õ¡Õ® Õ§:"</string>
+ <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Ô¸Õ¶Õ¤Õ¬Õ¡ÕµÕ¶Õ¥Õ¬ Õ¡ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ´Õ¡Õ¶ Õ¿Õ¡Ö€Õ¡Õ®Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨:"</string>
+ <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Ô·Õ»Õ« Õ¡ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ¸Ö‚Õ´:"</string>
+ <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"ÕÕ­Õ¥Õ´Õ¡ÕµÕ¸Õ¾ Õ¡ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ¸Ö‚Õ´:"</string>
+ <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Ô´Õ¥Õ´Ö„Õ¸Õ¾ Õ¡ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ¸Ö‚Õ´:"</string>
+ <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Pin-Õ¶ Õ¡ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ¾Õ¡Õ® Õ§:"</string>
+ <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Ô³Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ« Õ¡ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ¸Ö‚Õ´:"</string>
+ <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"ÕÕ­Õ¥Õ´Õ¡ÕµÕ« Õ¿Õ¡Ö€Õ¡Õ®Ö„:"</string>
+ <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"ÕÕ¡Õ°Õ¥ÖÕ´Õ¡Õ¶ Õ¿Õ¡Ö€Õ¡Õ®Ö„:"</string>
+ <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
+ <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
+ <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
+ <string name="granularity_label_character" msgid="7336470535385009523">"Õ¢Õ¶Õ¸Ö‚ÕµÕ©Õ¨"</string>
+ <string name="granularity_label_word" msgid="7075570328374918660">"Õ¢Õ¡Õ¼"</string>
+ <string name="granularity_label_link" msgid="5815508880782488267">"Õ°Õ²Õ¸Ö‚Õ´"</string>
+ <string name="granularity_label_line" msgid="5764267235026120888">"Õ£Õ«Õ®"</string>
+ <string name="hour_ampm" msgid="4584338083529355982">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
+ <string name="hour_cap_ampm" msgid="2083465992940444366">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
+ <string name="factorytest_failed" msgid="5410270329114212041">"Ô³Õ¸Ö€Õ®Õ¡Ö€Õ¡Õ¶Õ¡ÕµÕ«Õ¶ Õ©Õ¥Õ½Õ¿Õ¨ Õ±Õ¡Õ­Õ¸Õ²Õ¾Õ¥Ö"</string>
+ <string name="factorytest_not_system" msgid="4435201656767276723">"FACTORY_TEST Õ£Õ¸Ö€Õ®Õ¸Õ²Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Õ´Õ«Õ¡ÕµÕ¶ Õ¡Õ»Õ¡Õ¯ÖÕ¾Õ¸Ö‚Õ´ Õ§ /Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ¸Ö‚Õ´/ծրագրում տեղադրված փաթեթների Õ°Õ¡Õ´Õ¡Ö€:"</string>
+ <string name="factorytest_no_action" msgid="872991874799998561">"Õ‰Õ« Õ£Õ¿Õ¶Õ¾Õ¥Õ¬ Õ¸Õ¹ Õ´Õ« ÖƒÕ¡Õ©Õ¥Õ©, Õ¸Ö€Õ¨ Õ¡ÕºÕ¡Õ°Õ¸Õ¾Õ¸Ö‚Õ´ Õ§ FACTORY_TEST Õ£Õ¸Ö€Õ®Õ¸Õ²Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨:"</string>
+ <string name="factorytest_reboot" msgid="6320168203050791643">"ÕŽÕ¥Ö€Õ¡Õ¢Õ¥Õ¼Õ¶Õ¥Õ¬"</string>
+ <string name="js_dialog_title" msgid="1987483977834603872">"«<xliff:g id="TITLE">%s</xliff:g>»-ի էջում ասվում է`"</string>
+ <string name="js_dialog_title_default" msgid="6961903213729667573">"JavaScript"</string>
+ <string name="js_dialog_before_unload_title" msgid="2619376555525116593">"Õ€Õ¡Õ½Õ¿Õ¡Õ¿Õ¥Õ¬ Õ¯Õ¸Õ²Õ´Õ¶Õ¸Ö€Õ¸Õ·Õ¸Ö‚Õ´Õ¨"</string>
+ <string name="js_dialog_before_unload_positive_button" msgid="3112752010600484130">"Ô¼Ö„Õ¥Õ¬ Õ¡ÕµÕ½ Õ§Õ»Õ¨"</string>
+ <string name="js_dialog_before_unload_negative_button" msgid="5614861293026099715">"Õ„Õ¶Õ¡Õ¬ Õ¡ÕµÕ½ Õ§Õ»Õ¸Ö‚Õ´"</string>
+ <string name="js_dialog_before_unload" msgid="3468816357095378590">"<xliff:g id="MESSAGE">%s</xliff:g>\n\nÕŽÕ½Õ¿Õ¡ÕžÕ° Õ¥Ö„, Õ¸Ö€ ÖÕ¡Õ¶Õ¯Õ¡Õ¶Õ¸Ö‚Õ´ Õ¥Ö„ Õ°Õ¥Õ¼Õ¡Õ¶Õ¡Õ¬ Õ¡ÕµÕ½ Õ§Õ»Õ«Ö:"</string>
+ <string name="save_password_label" msgid="6860261758665825069">"Õ€Õ¡Õ½Õ¿Õ¡Õ¿Õ¥Õ¬"</string>
+ <string name="double_tap_toast" msgid="4595046515400268881">"Õ€Õ¸Ö‚Õ·Õ¡Õ¯` Õ¯Ö€Õ¯Õ¶Õ¡Õ¯Õ« Õ°ÕºÕ¥Ö„` Õ´Õ¥Õ®Õ¡ÖÕ¶Õ¥Õ¬Õ¸Ö‚ Ö‡ ÖƒÕ¸Ö„Ö€Õ¡ÖÕ¶Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€:"</string>
+ <string name="autofill_this_form" msgid="4616758841157816676">"Ô»Õ¶Ö„Õ¶Õ¡Õ¬Ö€Õ¡ÖÕ¸Ö‚Õ´"</string>
+ <string name="setup_autofill" msgid="7103495070180590814">"Ô´Õ¶Õ¥Õ¬ Õ«Õ¶Ö„Õ¶Õ¡Õ¬Ö€Õ¡ÖÕ¸Ö‚Õ´"</string>
+ <string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
+ <string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
+ <string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
+ <string name="autofill_address_summary_format" msgid="4874459455786827344">"$1$2$3"</string>
+ <string name="autofill_province" msgid="2231806553863422300">"Ô³Õ¡Õ¾Õ¡Õ¼"</string>
+ <string name="autofill_postal_code" msgid="4696430407689377108">"Õ“Õ¸Õ½Õ¿Õ¡ÕµÕ«Õ¶ Õ«Õ¶Õ¤Õ¥Ö„Õ½"</string>
+ <string name="autofill_state" msgid="6988894195520044613">"Õ†Õ¡Õ°Õ¡Õ¶Õ£"</string>
+ <string name="autofill_zip_code" msgid="8697544592627322946">"Õ“Õ¸Õ½Õ¿Õ¡ÕµÕ«Õ¶ Õ¯Õ¸Õ¤"</string>
+ <string name="autofill_county" msgid="237073771020362891">"Õ„Õ¡Ö€Õ¦"</string>
+ <string name="autofill_island" msgid="4020100875984667025">"Ô¿Õ²Õ¦Õ«"</string>
+ <string name="autofill_district" msgid="8400735073392267672">"Õ‡Ö€Õ»Õ¡Õ¶"</string>
+ <string name="autofill_department" msgid="5343279462564453309">"Ô´Õ¥ÕºÕ¡Ö€Õ¿Õ¡Õ´Õ¥Õ¶Õ¿"</string>
+ <string name="autofill_prefecture" msgid="2028499485065800419">"ÕŠÖ€Õ¥Ö†Õ¥Õ¯Õ¿Õ¸Ö‚Ö€Õ¡"</string>
+ <string name="autofill_parish" msgid="8202206105468820057">"Ô¾Õ¸Ö‚Õ­"</string>
+ <string name="autofill_area" msgid="3547409050889952423">"ÕÕ¡Ö€Õ¡Õ®Ö„"</string>
+ <string name="autofill_emirate" msgid="2893880978835698818">"Ô·Õ´Õ«Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶"</string>
+ <string name="permlab_readHistoryBookmarks" msgid="3775265775405106983">"Õ¯Õ¡Ö€Õ¤Õ¡Õ¬ Õ±Õ¥Ö€ Õ¾Õ¥Õ¢ Õ§Õ»Õ¡Õ¶Õ«Õ·Õ¥Ö€Õ¨ Ö‡ ÕºÕ¡Õ¿Õ´Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨"</string>
+ <string name="permdesc_readHistoryBookmarks" msgid="8462378226600439658">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¯Õ¡Ö€Õ¤Õ¡Õ¬ Õ¤Õ«Õ¿Õ¡Ö€Õ¯Õ¹Õ« Õ¡ÕµÖÕ¥Õ¬Õ¡Õ® Õ¢Õ¸Õ¬Õ¸Ö€ URL-Õ¶Õ¥Ö€Õ« ÕºÕ¡Õ¿Õ´Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Ö‡ Õ¤Õ«Õ¿Õ¡Ö€Õ¯Õ¹Õ« Õ¢Õ¸Õ¬Õ¸Ö€ Õ§Õ»Õ¡Õ¶Õ«Õ·Õ¥Ö€Õ¨: Õ†Õ·Õ¸Ö‚Õ´. Õ¡ÕµÕ½ Õ©Õ¸Ö‚ÕµÕ¬Õ¿Õ¾Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Õ¹Õ« Õ¯Õ¡Ö€Õ¸Õ² Õ£Õ¸Ö€Õ®Õ¡Õ®Õ¾Õ¥Õ¬ Õ¯Õ¸Õ²Õ´Õ¶Õ¡Õ¯Õ« Õ¤Õ«Õ¿Õ¡Ö€Õ¯Õ«Õ¹Õ¶Õ¥Ö€Õ« Õ¯Õ¡Õ´ Õ¾Õ¥Õ¢ Õ¦Õ¶Õ¶Õ¡Ö€Õ¯Õ´Õ¡Õ¶ Õ°Õ¶Õ¡Ö€Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¸Õ¾ Õ¡ÕµÕ¬ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ« Õ¯Õ¸Õ²Õ´Õ«Ö:"</string>
+ <string name="permlab_writeHistoryBookmarks" msgid="3714785165273314490">"Õ£Ö€Õ¥Õ¬ Õ¾Õ¥Õ¢ Õ§Õ»Õ¡Õ¶Õ«Õ·Õ¥Ö€Õ¨ Ö‡ ÕºÕ¡Õ¿Õ´Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨"</string>
+ <string name="permdesc_writeHistoryBookmarks" product="tablet" msgid="6825527469145760922">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ ÖƒÕ¸ÖƒÕ¸Õ­Õ¥Õ¬ Õ¤Õ«Õ¿Õ¡Ö€Õ¯Õ¹Õ« ÕºÕ¡Õ¿Õ´Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Õ¯Õ¡Õ´ Õ±Õ¥Ö€ Õ£Ö€Õ¡Õ½Õ¡Õ¬Õ«Õ¯Õ¸Ö‚Õ´ ÕºÕ¡Õ°Õ¾Õ¡Õ® Õ§Õ»Õ¡Õ¶Õ«Õ·Õ¥Ö€Õ¨: Ô±ÕµÕ¶ Õ¯Õ¡Ö€Õ¸Õ² Õ§ Õ©Õ¸Ö‚ÕµÕ¬ Õ¿Õ¡Õ¬ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ»Õ¶Õ»Õ¥Õ¬ Õ¯Õ¡Õ´ ÖƒÕ¸ÖƒÕ¸Õ­Õ¥Õ¬ Õ¤Õ«Õ¿Õ¡Ö€Õ¯Õ¹Õ« Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨: Õ†Õ·Õ¸Ö‚Õ´. Õ¡ÕµÕ½ Õ©Õ¸Ö‚ÕµÕ¬Õ¿Õ¾Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Õ¹Õ« Õ¯Õ¡Ö€Õ¸Õ² Õ£Õ¸Ö€Õ®Õ¡Õ®Õ¾Õ¥Õ¬ Õ¯Õ¸Õ²Õ´Õ¶Õ¡Õ¯Õ« Õ¤Õ«Õ¿Õ¡Ö€Õ¯Õ«Õ¹Õ¶Õ¥Ö€Õ« Õ¯Õ¡Õ´ Õ¾Õ¥Õ¢ Õ¦Õ¶Õ¶Õ¡Ö€Õ¯Õ´Õ¡Õ¶ Õ°Õ¶Õ¡Ö€Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¸Õ¾ Õ¡ÕµÕ¬ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ« Õ¯Õ¸Õ²Õ´Õ«Ö:"</string>
+ <string name="permdesc_writeHistoryBookmarks" product="default" msgid="8497389531014185509">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ ÖƒÕ¸ÖƒÕ¸Õ­Õ¥Õ¬ Õ¤Õ«Õ¿Õ¡Ö€Õ¯Õ¹Õ« ÕºÕ¡Õ¿Õ´Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Õ¯Õ¡Õ´ Õ±Õ¥Ö€ Õ°Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ¸Ö‚Õ´ ÕºÕ¡Õ°Õ¾Õ¡Õ® Õ§Õ»Õ¡Õ¶Õ«Õ·Õ¥Ö€Õ¨: Ô±ÕµÕ¶ Õ¯Õ¡Ö€Õ¸Õ² Õ§ Õ©Õ¸Ö‚ÕµÕ¬ Õ¿Õ¡Õ¬ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ»Õ¶Õ»Õ¥Õ¬ Õ¯Õ¡Õ´ ÖƒÕ¸ÖƒÕ¸Õ­Õ¥Õ¬ Õ¤Õ«Õ¿Õ¡Ö€Õ¯Õ¹Õ« Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨: Õ†Õ·Õ¸Ö‚Õ´. Õ¡ÕµÕ½ Õ©Õ¸Ö‚ÕµÕ¬Õ¿Õ¾Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Õ¹Õ« Õ¯Õ¡Ö€Õ¸Õ² Õ£Õ¸Ö€Õ®Õ¡Õ®Õ¾Õ¥Õ¬ Õ¯Õ¸Õ²Õ´Õ¶Õ¡Õ¯Õ« Õ¤Õ«Õ¿Õ¡Ö€Õ¯Õ«Õ¹Õ¶Õ¥Ö€Õ« Õ¯Õ¡Õ´ Õ¾Õ¥Õ¢ Õ¦Õ¶Õ¶Õ¡Ö€Õ¯Õ´Õ¡Õ¶ Õ°Õ¶Õ¡Ö€Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¸Õ¾ Õ¡ÕµÕ¬ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ« Õ¯Õ¸Õ²Õ´Õ«Ö:"</string>
+ <string name="permlab_setAlarm" msgid="1379294556362091814">"Õ¤Õ¶Õ¥Õ¬ Õ¡Õ¦Õ¤Õ¡Õ¶Õ·Õ¡Õ¶"</string>
+ <string name="permdesc_setAlarm" msgid="316392039157473848">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ½Õ¡Õ°Õ´Õ¡Õ¶Õ¥Õ¬ Õ¦Õ¡Ö€Õ©Õ¸Ö‚ÖÕ«Õ¹Õ« Õ®Ö€Õ¡Õ£Ö€Õ¸Ö‚Õ´ տեղադրված ազդանշանը: Ô¶Õ¡Ö€Õ©Õ¸Ö‚ÖÕ«Õ¹Õ« Õ¸Ö€Õ¸Õ· Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€ Õ¹Õ¥Õ¶ Õ¯Õ¡Ö€Õ¸Õ² Õ¯Õ«Ö€Õ¡Õ¼Õ¥Õ¬ Õ¡ÕµÕ½ Õ°Õ¡Õ¿Õ¯Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨:"</string>
+ <string name="permlab_addVoicemail" msgid="5525660026090959044">"Õ¡Õ¾Õ¥Õ¬Õ¡ÖÕ¶Õ¥Õ¬ Õ±Õ¡ÕµÕ¶Õ¡ÕµÕ«Õ¶ ÖƒÕ¸Õ½Õ¿"</string>
+ <string name="permdesc_addVoicemail" msgid="6604508651428252437">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¡Õ¾Õ¥Õ¬Õ¡ÖÕ¶Õ¥Õ¬ Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€ Õ±Õ¥Ö€ Õ±Õ¡ÕµÕ¶Õ¡ÕµÕ«Õ¶ ÖƒÕ¸Õ½Õ¿Õ« Õ¡Ö€Õ¯Õ²Õ¸Ö‚Õ´:"</string>
+ <string name="permlab_writeGeolocationPermissions" msgid="5962224158955273932">"ÖƒÕ¸ÖƒÕ¸Õ­Õ¥Õ¬ Õ¤Õ«Õ¿Õ¡Ö€Õ¯Õ¹Õ« Õ¡Õ·Õ­Õ¡Ö€Õ°Õ¡Õ£Ö€Õ¡Õ¯Õ¡Õ¶ Õ¿Õ¥Õ²Õ¡Õ¶Ö„Õ« Õ©Õ¸Ö‚ÕµÕ¬Õ¿Õ¾Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨"</string>
+ <string name="permdesc_writeGeolocationPermissions" msgid="1083743234522638747">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ ÖƒÕ¸ÖƒÕ¸Õ­Õ¥Õ¬ Õ¦Õ¶Õ¶Õ¡Ö€Õ¯Õ¹Õ« Õ¡Õ·Õ­Õ¡Ö€Õ°Õ¡Õ£Ö€Õ¡Õ¯Õ¡Õ¶ Õ¤Õ«Ö€Ö„Õ« Õ©Õ¸Ö‚ÕµÕ¬Õ¿Õ¾Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨: ÕŽÕ¶Õ¡Õ½Õ¡Ö€Õ¡Ö€ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ¨ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Õ¶ Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¥Õ¬ Õ½Õ¡` Õ©Õ¸Ö‚ÕµÕ¬Õ¡Õ¿Ö€Õ¥Õ¬Õ¸Ö‚ Õ¸Ö‚Õ²Õ¡Ö€Õ¯Õ¥Õ¬ Õ¿Õ¥Õ²Õ¡Õ¤Ö€Õ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ¾Õ¥Ö€Õ¡Õ¢Õ¥Ö€ÕµÕ¡Õ¬ Õ¿Õ¥Õ²Õ¥Õ¯Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨ Õ¯Õ¡Õ´Õ¡ÕµÕ¡Õ¯Õ¡Õ¶ Õ¾Õ¥Õ¢ Õ¯Õ¡ÕµÖ„Õ¥Ö€Õ«Õ¶:"</string>
+ <string name="permlab_packageVerificationAgent" msgid="5568139100645829117">"Õ°Õ¡Õ½Õ¿Õ¡Õ¿Õ¥Õ¬ ÖƒÕ¡Õ©Õ¥Õ©Õ¶Õ¥Ö€Õ¨"</string>
+ <string name="permdesc_packageVerificationAgent" msgid="8437590190990843381">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ°Õ¡Õ½Õ¿Õ¡Õ¿Õ¥Õ¬, Õ¸Ö€ ÖƒÕ¡Õ©Õ¥Õ©Õ¨ Õ¿Õ¥Õ²Õ¡Õ¤Ö€Õ¥Õ¬Õ« Õ§:"</string>
+ <string name="permlab_bindPackageVerifier" msgid="4187786793360326654">"Õ´Õ«Õ¡Õ¶Õ¡Õ¬ ÖƒÕ¡Õ©Õ¥Õ©Õ« Õ½Õ¿Õ¸Ö‚Õ£Õ«Õ¹Õ«Õ¶"</string>
+ <string name="permdesc_bindPackageVerifier" msgid="3180741773233862126">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ½Õ¥ÖƒÕ¡Õ¯Õ¡Õ¶Õ¡Õ¿Õ«Ö€Õ¸Õ»Õ¨ ÖƒÕ¡Õ©Õ¥Õ©Õ« Õ½Õ¿Õ¸Ö‚Õ£Õ«Õ¹Õ¶Õ¥Ö€Õ« Õ°Õ¡Ö€ÖÕ¸Ö‚Õ´ Õ¯Õ¡Õ¿Õ¡Ö€Õ¥Õ¬: ÕÕ¸Õ¾Õ¸Ö€Õ¡Õ¯Õ¡Õ¶ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ« Õ°Õ¡Õ´Õ¡Ö€ Õ¥Ö€Õ¢Ö‡Õ§ Õ¹ÕºÕ¥Õ¿Ö„ Õ§ Õ¡Õ¶Õ°Ö€Õ¡ÕªÕ¥Õ·Õ¿ Õ¬Õ«Õ¶Õ«:"</string>
+ <string name="permlab_serialPort" msgid="546083327654631076">"Õ´Õ¸Ö‚Õ¿Ö„ Õ£Õ¸Ö€Õ®Õ¥Õ¬ Õ°Õ¡Õ»Õ¸Ö€Õ¤Õ¡Õ¯Õ¡Õ¶ Õ´Õ«Õ¡ÖÖ„Õ¶Õ¥Ö€"</string>
+ <string name="permdesc_serialPort" msgid="2991639985224598193">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ½Õ¥ÖƒÕ¡Õ¯Õ¡Õ¶Õ¡Õ¿Õ«Ö€Õ¸Õ»Õ¨ Õ´Õ¸Ö‚Õ¿Ö„ Õ£Õ¸Ö€Õ®Õ¥Õ¬ Õ°Õ¡Õ»Õ¸Ö€Õ¤Õ¡Õ¯Õ¡Õ¶ Õ´Õ«Õ¡ÖÖ„Õ¶Õ¥Ö€` Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¥Õ¬Õ¸Õ¾ SerialManager API-Õ¨:"</string>
+ <string name="permlab_accessContentProvidersExternally" msgid="5077774297943409285">"Õ¤Ö€Õ½Õ«Ö Õ´Õ¡Õ¿Õ¹Õ¥Õ¬ Õ¢Õ¸Õ¾Õ¡Õ¶Õ¤Õ¡Õ¯Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶ Õ¿Ö€Õ¡Õ´Õ¡Õ¤Ö€Õ¸Õ²Õ¶Õ¥Ö€Õ«Õ¶"</string>
+ <string name="permdesc_accessContentProvidersExternally" msgid="4544346486697853685">"ÕÕ¥ÖƒÕ¡Õ¯Õ¡Õ¶Õ¡Õ¿Õ«Ö€Õ¸Õ»Õ¨ Õ°Õ¶Õ¡Ö€Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ¯Õ¡ÕºÕ¾Õ¥Õ¬ Õ®Õ¡Õ¼Õ¡ÕµÕ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ´Õ¡Õ¿Õ¡Õ¯Õ¡Ö€Õ¡Ö€Õ¶Õ¥Ö€Õ« Õ°Õ¥Õ¿ Õ¾Õ¡Õ°Õ¡Õ¶Õ¡Õ¯Õ«Ö: ÕÕ¸Õ¾Õ¸Ö€Õ¡Õ¯Õ¡Õ¶ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ« Õ°Õ¡Õ´Õ¡Ö€ Õ¥Ö€Õ¢Ö‡Õ§ Õ¹ÕºÕ¥Õ¿Ö„ է անհրաժեշտ Õ¬Õ«Õ¶Õ«:"</string>
+ <string name="permlab_updateLock" msgid="3527558366616680889">"Õ¯Õ¡Õ½Õ¥ÖÕ¶Õ¥Õ¬ Õ½Õ¡Ö€Ö„Õ« Õ¡Õ¾Õ¿Õ¸Õ´Õ¡Õ¿ Õ©Õ¡Ö€Õ´Õ¡ÖÕ¸Ö‚Õ´Õ¶Õ¥Ö€Õ¨"</string>
+ <string name="permdesc_updateLock" msgid="1655625832166778492">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ½Õ¥ÖƒÕ¡Õ¯Õ¡Õ¶Õ¡Õ¿Õ«Ö€Õ¸Õ»Õ¨ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ«Õ¶ Õ¿Õ¥Õ²Õ¥Õ¯Õ¡ÖÕ¶Õ¥Õ¬ Õ°Õ¡Ö€Õ´Õ¡Ö€ ÕªÕ¡Õ´Õ¡Õ¶Õ¡Õ¯Õ« Õ´Õ¡Õ½Õ«Õ¶` Õ½Õ¡Ö€Ö„Õ¨ Õ¶Õ¸Ö€Õ¡ÖÕ¶Õ¥Õ¬Õ¸Ö‚ Õ¶ÕºÕ¡Õ¿Õ¡Õ¯Õ¸Õ¾ Õ¸Õ¹ ÖƒÕ¸Õ­Õ¡Õ¦Õ¤Õ¡Õ¯Õ¡Õ¶ Õ¾Õ¥Ö€Õ¡Õ¢Õ¥Õ¼Õ¶Õ´Õ¡Õ¶ Õ°Õ¡Õ´Õ¡Ö€:"</string>
+ <string name="save_password_message" msgid="767344687139195790">"Õ‘Õ¡Õ¶Õ¯Õ¡Õ¶Õ¸Ö‚ÕžÕ´ Õ¥Ö„, Õ¸Ö€ Õ¤Õ«Õ¿Õ¡Ö€Õ¯Õ«Õ¹Õ¨ Õ°Õ«Õ·Õ« Õ¡ÕµÕ½ Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ¨:"</string>
+ <string name="save_password_notnow" msgid="6389675316706699758">"ÕˆÕ¹ Õ°Õ«Õ´Õ¡"</string>
+ <string name="save_password_remember" msgid="6491879678996749466">"Õ€Õ«Õ·Õ¥Õ¬"</string>
+ <string name="save_password_never" msgid="8274330296785855105">"ÔµÖ€Õ¢Õ¥Ö„"</string>
+ <string name="open_permission_deny" msgid="7374036708316629800">"Ô´Õ¸Ö‚Ö„ Õ¹Õ¸Ö‚Õ¶Õ¥Ö„ Õ¡ÕµÕ½ Õ§Õ»Õ¨ Õ¢Õ¡ÖÕ¥Õ¬Õ¸Ö‚ Õ©Õ¸Ö‚ÕµÕ¬Õ¿Õ¾Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶:"</string>
+ <string name="text_copied" msgid="4985729524670131385">"ÕÕ¥Ö„Õ½Õ¿Õ¨ ÕºÕ¡Õ¿Õ³Õ¥Õ¶Õ¾Õ¡Õ® Õ§ Õ½Õ¥Õ²Õ´Õ¡Õ¿Õ¡Õ­Õ¿Õ¡Õ¯Õ«Õ¶:"</string>
+ <string name="more_item_label" msgid="4650918923083320495">"Ô±Õ¾Õ¥Õ¬Õ«Õ¶"</string>
+ <string name="prepend_shortcut_label" msgid="2572214461676015642">"Õ‘Õ¡Õ¶Õ¯+"</string>
+ <string name="menu_space_shortcut_label" msgid="2410328639272162537">"Õ¢Õ¡ÖÕ¡Õ¯"</string>
+ <string name="menu_enter_shortcut_label" msgid="2743362785111309668">"Õ´Õ¸Ö‚Õ¿Ö„"</string>
+ <string name="menu_delete_shortcut_label" msgid="3658178007202748164">"Õ»Õ¶Õ»Õ¥Õ¬"</string>
+ <string name="search_go" msgid="8298016669822141719">"ÕˆÖ€Õ¸Õ¶Õ¥Õ¬"</string>
+ <string name="searchview_description_search" msgid="6749826639098512120">"ÕˆÖ€Õ¸Õ¶Õ¥Õ¬"</string>
+ <string name="searchview_description_query" msgid="5911778593125355124">"ÕˆÖ€Õ¸Õ¶Õ¥Õ¬ Õ°Õ¡Ö€ÖÕ¸Ö‚Õ´Õ¨"</string>
+ <string name="searchview_description_clear" msgid="1330281990951833033">"Õ„Õ¡Ö„Ö€Õ¥Õ¬ Õ°Õ¡Ö€ÖÕ¸Ö‚Õ´Õ¨"</string>
+ <string name="searchview_description_submit" msgid="2688450133297983542">"ÕˆÖ‚Õ²Õ¡Ö€Õ¯Õ¥Õ¬ Õ°Õ¡Ö€ÖÕ¸Ö‚Õ´Õ¨"</string>
+ <string name="searchview_description_voice" msgid="2453203695674994440">"ÕÕ¡ÕµÕ¶Õ¡ÕµÕ«Õ¶ Õ¸Ö€Õ¸Õ¶Õ¸Ö‚Õ´"</string>
+ <string name="enable_explore_by_touch_warning_title" msgid="7460694070309730149">"Õ„Õ«Õ¡ÖÕ¶Õ¥ÕžÕ¬ Õ€ÕºÕ´Õ¡Õ¶ Õ´Õ«Õ»Õ¸ÖÕ¸Õ¾ Õ°Õ¥Õ¿Õ¡Õ¦Õ¸Õ¿Õ¸Ö‚Õ´Õ¨:"</string>
+ <string name="enable_explore_by_touch_warning_message" product="tablet" msgid="8655887539089910577">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g>-Õ¨ ÖÕ¡Õ¶Õ¯Õ¡Õ¶Õ¸Ö‚Õ´ Õ§ Õ´Õ«Õ¡ÖÕ¶Õ¥Õ¬ «Հետազոտում Õ°ÕºÕ´Õ¡Õ¶ Õ´Õ«Õ»Õ¸Öով» Õ¼Õ¥ÕªÕ«Õ´Õ¨: ÔµÖ€Õ¢ Õ´Õ«Õ¡ÖÕ¾Õ¡Õ® Õ§ «Հետազոտում Õ°ÕºÕ´Õ¡Õ¶ Õ´Õ«Õ»Õ¸Öով» Õ¼Õ¥ÕªÕ«Õ´Õ¨, Õ¤Õ¸Ö‚Ö„ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Ö„ Õ¬Õ½Õ¥Õ¬ Õ¯Õ¡Õ´ Õ¿Õ¥Õ½Õ¶Õ¥Õ¬ Õ¶Õ¯Õ¡Ö€Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨, Õ©Õ¥ Õ«Õ¶Õ¹ Õ§ Õ±Õ¥Ö€ Õ´Õ¡Õ¿Õ« Õ¿Õ¡Õ¯, Õ¯Õ¡Õ´ Õ¯Õ¡Õ¿Õ¡Ö€Õ¥Õ¬ ÕªÕ¥Õ½Õ¿Õ¥Ö€` Õ£Ö€Õ¡Õ½Õ¡Õ¬Õ«Õ¯Õ« Õ°Õ¥Õ¿ ÖƒÕ¸Õ­Õ£Õ¸Ö€Õ®Õ¡Õ¯ÖÕ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€:"</string>
+ <string name="enable_explore_by_touch_warning_message" product="default" msgid="2708199672852373195">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g>-Õ¨ ÖÕ¡Õ¶Õ¯Õ¡Õ¶Õ¸Ö‚Õ´ Õ§ Õ´Õ«Õ¡ÖÕ¶Õ¥Õ¬ «Հետազոտում Õ°ÕºÕ´Õ¡Õ¶ Õ´Õ«Õ»Õ¸Öով» Õ¼Õ¥ÕªÕ«Õ´Õ¨: ÔµÖ€Õ¢ Õ´Õ«Õ¡ÖÕ¾Õ¡Õ® Õ§ «Հետազոտում Õ°ÕºÕ´Õ¡Õ¶ Õ´Õ«Õ»Õ¸Öով» Õ¼Õ¥ÕªÕ«Õ´Õ¨, Õ¤Õ¸Ö‚Ö„ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Ö„ Õ¬Õ½Õ¥Õ¬ Õ¯Õ¡Õ´ Õ¿Õ¥Õ½Õ¶Õ¥Õ¬ Õ¶Õ¯Õ¡Ö€Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨, Õ©Õ¥ Õ«Õ¶Õ¹ Õ§ Õ±Õ¥Ö€ Õ´Õ¡Õ¿Õ« Õ¿Õ¡Õ¯, Õ¯Õ¡Õ´ Õ¯Õ¡Õ¿Õ¡Ö€Õ¥Õ¬ ÕªÕ¥Õ½Õ¿Õ¥Ö€` Õ°Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ« Õ°Õ¥Õ¿ ÖƒÕ¸Õ­Õ£Õ¸Ö€Õ®Õ¡Õ¯ÖÕ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€:"</string>
+ <string name="oneMonthDurationPast" msgid="7396384508953779925">"1 Õ¡Õ´Õ«Õ½ Õ¡Õ¼Õ¡Õ»"</string>
+ <string name="beforeOneMonthDurationPast" msgid="909134546836499826">"Ô±Õ¾Õ¥Õ¬Õ« Õ·Õ¸Ö‚Õ¿ Ö„Õ¡Õ¶ 1 Õ¡Õ´Õ«Õ½"</string>
+ <plurals name="num_seconds_ago">
+ <item quantity="one" msgid="4869870056547896011">"1 Õ¾Õ¡ÕµÖ€Õ¯ÕµÕ¡Õ¶ Õ¡Õ¼Õ¡Õ»"</item>
+ <item quantity="other" msgid="3903706804349556379">"<xliff:g id="COUNT">%d</xliff:g> Õ¾Õ¡ÕµÖ€Õ¯ÕµÕ¡Õ¶ Õ¡Õ¼Õ¡Õ»"</item>
+ </plurals>
+ <plurals name="num_minutes_ago">
+ <item quantity="one" msgid="3306787433088810191">"1 Ö€Õ¸ÕºÕ¥ Õ¡Õ¼Õ¡Õ»"</item>
+ <item quantity="other" msgid="2176942008915455116">"<xliff:g id="COUNT">%d</xliff:g> Ö€Õ¸ÕºÕ¥ Õ¡Õ¼Õ¡Õ»"</item>
+ </plurals>
+ <plurals name="num_hours_ago">
+ <item quantity="one" msgid="9150797944610821849">"1 ÕªÕ¡Õ´ Õ¡Õ¼Õ¡Õ»"</item>
+ <item quantity="other" msgid="2467273239587587569">"<xliff:g id="COUNT">%d</xliff:g> ÕªÕ¡Õ´ Õ¡Õ¼Õ¡Õ»"</item>
+ </plurals>
+ <plurals name="last_num_days">
+ <item quantity="other" msgid="3069992808164318268">"ÕŽÕ¥Ö€Õ»Õ«Õ¶ <xliff:g id="COUNT">%d</xliff:g> Ö…Ö€Õ¥Ö€Õ«Õ¶"</item>
+ </plurals>
+ <string name="last_month" msgid="3959346739979055432">"Ô±Õ¶ÖÕµÕ¡Õ¬ Õ¡Õ´Õ«Õ½"</string>
+ <string name="older" msgid="5211975022815554840">"Ô±Õ¾Õ¥Õ¬Õ« Õ°Õ«Õ¶"</string>
+ <plurals name="num_days_ago">
+ <item quantity="one" msgid="861358534398115820">"Õ¥Ö€Õ¥Õ¯"</item>
+ <item quantity="other" msgid="2479586466153314633">"<xliff:g id="COUNT">%d</xliff:g> Ö…Ö€ Õ¡Õ¼Õ¡Õ»"</item>
+ </plurals>
+ <plurals name="in_num_seconds">
+ <item quantity="one" msgid="2729745560954905102">"1 Õ¾Õ¡ÕµÖ€Õ¯ÕµÕ¡Õ¶Õ«Ö"</item>
+ <item quantity="other" msgid="1241926116443974687">"<xliff:g id="COUNT">%d</xliff:g> Õ¾Õ¡ÕµÖ€Õ¯ÕµÕ¡Õ¶Õ«Ö"</item>
+ </plurals>
+ <plurals name="in_num_minutes">
+ <item quantity="one" msgid="8793095251325200395">"1 Ö€Õ¸ÕºÕ¥Õ«Ö"</item>
+ <item quantity="other" msgid="3330713936399448749">"<xliff:g id="COUNT">%d</xliff:g> Ö€Õ¸ÕºÕ¥Õ«Ö"</item>
+ </plurals>
+ <plurals name="in_num_hours">
+ <item quantity="one" msgid="7164353342477769999">"1 ÕªÕ¡Õ´Õ«Ö"</item>
+ <item quantity="other" msgid="547290677353727389">"<xliff:g id="COUNT">%d</xliff:g> ÕªÕ¡Õ´Õ«Ö"</item>
+ </plurals>
+ <plurals name="in_num_days">
+ <item quantity="one" msgid="5413088743009839518">"Õ¾Õ¡Õ²Õ¨"</item>
+ <item quantity="other" msgid="5109449375100953247">"<xliff:g id="COUNT">%d</xliff:g> Ö…Ö€Õ«Ö"</item>
+ </plurals>
+ <plurals name="abbrev_num_seconds_ago">
+ <item quantity="one" msgid="1849036840200069118">"1 Õ¾Ö€Õ¯ Õ¡Õ¼Õ¡Õ»"</item>
+ <item quantity="other" msgid="3699169366650930415">"<xliff:g id="COUNT">%d</xliff:g> Õ¾Ö€Õ¯. Õ¡Õ¼Õ¡Õ»"</item>
+ </plurals>
+ <plurals name="abbrev_num_minutes_ago">
+ <item quantity="one" msgid="6361490147113871545">"1 Ö€Õ¸ÕºÕ¥ Õ¡Õ¼Õ¡Õ»"</item>
+ <item quantity="other" msgid="851164968597150710">"<xliff:g id="COUNT">%d</xliff:g> Ö€Õ¸ÕºÕ¥ Õ¡Õ¼Õ¡Õ»"</item>
+ </plurals>
+ <plurals name="abbrev_num_hours_ago">
+ <item quantity="one" msgid="4796212039724722116">"1 ÕªÕ¡Õ´ Õ¡Õ¼Õ¡Õ»"</item>
+ <item quantity="other" msgid="6889970745748538901">"<xliff:g id="COUNT">%d</xliff:g> ÕªÕ¡Õ´ Õ¡Õ¼Õ¡Õ»"</item>
+ </plurals>
+ <plurals name="abbrev_num_days_ago">
+ <item quantity="one" msgid="8463161711492680309">"Õ¥Ö€Õ¥Õ¯"</item>
+ <item quantity="other" msgid="3453342639616481191">"<xliff:g id="COUNT">%d</xliff:g> Ö…Ö€ Õ¡Õ¼Õ¡Õ»"</item>
+ </plurals>
+ <plurals name="abbrev_in_num_seconds">
+ <item quantity="one" msgid="5842225370795066299">"1 Õ¾Ö€Õ¯-Õ«Ö"</item>
+ <item quantity="other" msgid="5495880108825805108">"<xliff:g id="COUNT">%d</xliff:g> Õ¾Ö€Õ¯-Õ«Ö"</item>
+ </plurals>
+ <plurals name="abbrev_in_num_minutes">
+ <item quantity="one" msgid="562786149928284878">"1 Ö€Õ¸ÕºÕ¥Õ«Ö"</item>
+ <item quantity="other" msgid="4216113292706568726">"<xliff:g id="COUNT">%d</xliff:g> Ö€Õ¸ÕºÕ¥Õ«Ö"</item>
+ </plurals>
+ <plurals name="abbrev_in_num_hours">
+ <item quantity="one" msgid="3274708118124045246">"1 ÕªÕ¡Õ´Õ«Ö"</item>
+ <item quantity="other" msgid="3705373766798013406">"<xliff:g id="COUNT">%d</xliff:g> ÕªÕ¡Õ´Õ«Ö"</item>
+ </plurals>
+ <plurals name="abbrev_in_num_days">
+ <item quantity="one" msgid="2178576254385739855">"Õ¾Õ¡Õ²Õ¨"</item>
+ <item quantity="other" msgid="2973062968038355991">"<xliff:g id="COUNT">%d</xliff:g> Ö…Ö€Õ«Ö"</item>
+ </plurals>
+ <string name="preposition_for_date" msgid="9093949757757445117">"<xliff:g id="DATE">%s</xliff:g>-Õ«Õ¶"</string>
+ <string name="preposition_for_time" msgid="5506831244263083793">"ÕªÕ¡Õ´Õ¨ <xliff:g id="TIME">%s</xliff:g>-Õ«Õ¶"</string>
+ <string name="preposition_for_year" msgid="5040395640711867177">"<xliff:g id="YEAR">%s</xliff:g> Õ©Õ¾Õ¡Õ¯Õ¡Õ¶Õ«Õ¶"</string>
+ <string name="day" msgid="8144195776058119424">"Ö…Ö€"</string>
+ <string name="days" msgid="4774547661021344602">"Ö…Ö€"</string>
+ <string name="hour" msgid="2126771916426189481">"ÕªÕ¡Õ´"</string>
+ <string name="hours" msgid="894424005266852993">"ÕªÕ¡Õ´"</string>
+ <string name="minute" msgid="9148878657703769868">"Ö€Õ¸ÕºÕ¥"</string>
+ <string name="minutes" msgid="5646001005827034509">"Ö€Õ¸ÕºÕ¥"</string>
+ <string name="second" msgid="3184235808021478">"Õ¾Ö€Õ¯"</string>
+ <string name="seconds" msgid="3161515347216589235">"Õ¾Ö€Õ¯"</string>
+ <string name="week" msgid="5617961537173061583">"Õ·Õ¡Õ¢Õ¡Õ©"</string>
+ <string name="weeks" msgid="6509623834583944518">"Õ·Õ¡Õ¢Õ¡Õ©"</string>
+ <string name="year" msgid="4001118221013892076">"Õ¿Õ¡Ö€Õ«"</string>
+ <string name="years" msgid="6881577717993213522">"Õ¿Õ¡Ö€Õ«"</string>
+ <plurals name="duration_seconds">
+ <item quantity="one" msgid="6962015528372969481">"1 Õ¾Õ¡ÕµÖ€Õ¯ÕµÕ¡Õ¶"</item>
+ <item quantity="other" msgid="1886107766577166786">"<xliff:g id="COUNT">%d</xliff:g> Õ¾Õ¡ÕµÖ€Õ¯ÕµÕ¡Õ¶"</item>
+ </plurals>
+ <plurals name="duration_minutes">
+ <item quantity="one" msgid="4915414002546085617">"1 Ö€Õ¸ÕºÕ¥"</item>
+ <item quantity="other" msgid="3165187169224908775">"<xliff:g id="COUNT">%d</xliff:g> Ö€Õ¸ÕºÕ¥"</item>
+ </plurals>
+ <plurals name="duration_hours">
+ <item quantity="one" msgid="8917467491248809972">"1 ÕªÕ¡Õ´"</item>
+ <item quantity="other" msgid="3863962854246773930">"<xliff:g id="COUNT">%d</xliff:g> ÕªÕ¡Õ´"</item>
+ </plurals>
+ <string name="VideoView_error_title" msgid="3534509135438353077">"ÕÕ¥Õ½Õ¡Õ¶ÕµÕ¸Ö‚Õ©Õ« Õ­Õ¶Õ¤Õ«Ö€"</string>
+ <string name="VideoView_error_text_invalid_progressive_playback" msgid="3186670335938670444">"Ô±ÕµÕ½ Õ¿Õ¥Õ½Õ¡Õ¶ÕµÕ¸Ö‚Õ©Õ¨ Õ°Õ¥Õ¼Õ¡Ö€Õ±Õ¡Õ¯Õ´Õ¡Õ¶ Õ¥Õ¶Õ©Õ¡Õ¯Õ¡ Õ¹Õ§ Õ¡ÕµÕ½ Õ½Õ¡Ö€Ö„Õ¸Õ¾:"</string>
+ <string name="VideoView_error_text_unknown" msgid="3450439155187810085">"Ô±ÕµÕ½ Õ¿Õ¥Õ½Õ¡Õ¶ÕµÕ¸Ö‚Õ©Õ¨ Õ°Õ¶Õ¡Ö€Õ¡Õ¾Õ¸Ö€ Õ¹Õ§ Õ¶Õ¾Õ¡Õ£Õ¡Ö€Õ¯Õ¥Õ¬:"</string>
+ <string name="VideoView_error_button" msgid="2822238215100679592">"Ô¼Õ¡Õ¾"</string>
+ <string name="relative_time" msgid="1818557177829411417">"<xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="noon" msgid="7245353528818587908">"Õ¯Õ¥Õ½Ö…Ö€"</string>
+ <string name="Noon" msgid="3342127745230013127">"Ô¿Õ¥Õ½Ö…Ö€"</string>
+ <string name="midnight" msgid="7166259508850457595">"Õ¯Õ¥Õ½Õ£Õ«Õ·Õ¥Ö€"</string>
+ <string name="Midnight" msgid="5630806906897892201">"Ô¿Õ¥Õ½Õ£Õ«Õ·Õ¥Ö€"</string>
+ <string name="elapsed_time_short_format_mm_ss" msgid="4431555943828711473">"<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" msgid="1846071997616654124">"<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" msgid="6876518925844129331">"Ô¸Õ¶Õ¿Ö€Õ¥Õ¬ Õ¢Õ¸Õ¬Õ¸Ö€Õ¨"</string>
+ <string name="cut" msgid="3092569408438626261">"Ô¿Õ¿Ö€Õ¥Õ¬"</string>
+ <string name="copy" msgid="2681946229533511987">"ÕŠÕ¡Õ¿Õ³Õ¥Õ¶Õ¥Õ¬"</string>
+ <string name="paste" msgid="5629880836805036433">"ÕÕ¥Õ²Õ¡Õ¤Ö€Õ¥Õ¬"</string>
+ <string name="replace" msgid="5781686059063148930">"Õ“Õ¸Õ­Õ¡Ö€Õ«Õ¶Õ¥Õ¬..."</string>
+ <string name="delete" msgid="6098684844021697789">"Õ‹Õ¶Õ»Õ¥Õ¬"</string>
+ <string name="copyUrl" msgid="2538211579596067402">"ÕŠÕ¡Õ¿Õ³Õ¥Õ¶Õ¥Õ¬ URL-Õ¨"</string>
+ <string name="selectTextMode" msgid="1018691815143165326">"Ô¸Õ¶Õ¿Ö€Õ¥Õ¬ Õ¿Õ¥Ö„Õ½Õ¿"</string>
+ <string name="textSelectionCABTitle" msgid="5236850394370820357">"ÕÕ¥Ö„Õ½Õ¿Õ« Õ¨Õ¶Õ¿Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶"</string>
+ <string name="addToDictionary" msgid="4352161534510057874">"Ô±Õ¾Õ¥Õ¬Õ¡ÖÕ¶Õ¥Õ¬ Õ¢Õ¡Õ¼Õ¡Ö€Õ¡Õ¶Õ¸Ö‚Õ´"</string>
+ <string name="deleteText" msgid="6979668428458199034">"Õ‹Õ¶Õ»Õ¥Õ¬"</string>
+ <string name="inputMethod" msgid="1653630062304567879">"Õ„Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ´Õ¡Õ¶ Õ¥Õ²Õ¡Õ¶Õ¡Õ¯Õ¨"</string>
+ <string name="editTextMenuTitle" msgid="4909135564941815494">"ÕÕ¥Ö„Õ½Õ¿Õ« Õ£Õ¸Ö€Õ®Õ¸Õ²Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨"</string>
+ <string name="low_internal_storage_view_title" msgid="5576272496365684834">"ÕŠÕ¡Õ°Õ¸ÖÕ¡ÕµÕ«Õ¶ Õ¿Õ¡Ö€Õ¡Õ®Ö„Õ¨ Õ½ÕºÕ¡Õ¼Õ¾Õ¸Ö‚Õ´ Õ§"</string>
+ <string name="low_internal_storage_view_text" msgid="6640505817617414371">"Õ€Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ« Õ¸Ö€Õ¸Õ· Õ£Õ¸Ö€Õ®Õ¡Õ¼Õ¸Ö‚ÕµÕ©Õ¶Õ¥Ö€ Õ°Õ¶Õ¡Ö€Õ¡Õ¾Õ¸Ö€ Õ§ Õ¹Õ¡Õ·Õ­Õ¡Õ¿Õ¥Õ¶"</string>
+ <string name="app_running_notification_title" msgid="8718335121060787914">"<xliff:g id="APP_NAME">%1$s</xliff:g>-Õ¶ Õ¡Õ·Õ­Õ¡Õ¿Õ¥ÖÕ¾Õ¸Ö‚Õ´ Õ§"</string>
+ <string name="app_running_notification_text" msgid="4653586947747330058">"Õ€ÕºÕ¥Ö„` Õ¬Ö€Õ¡ÖÕ¸Ö‚ÖÕ«Õ¹ Õ¿Õ¥Õ²Õ¥Õ¯Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨ կամ ծրագիրը Õ¤Õ¡Õ¤Õ¡Ö€Õ¥ÖÕ¶Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€:"</string>
+ <string name="ok" msgid="5970060430562524910">"Ô¼Õ¡Õ¾"</string>
+ <string name="cancel" msgid="6442560571259935130">"Õ‰Õ¥Õ²Õ¡Ö€Õ¯Õ¥Õ¬"</string>
+ <string name="yes" msgid="5362982303337969312">"Ô¼Õ¡Õ¾"</string>
+ <string name="no" msgid="5141531044935541497">"Õ‰Õ¥Õ²Õ¡Ö€Õ¯Õ¥Õ¬"</string>
+ <string name="dialog_alert_title" msgid="2049658708609043103">"ÕˆÖ‚Õ·Õ¡Õ¤Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶"</string>
+ <string name="loading" msgid="7933681260296021180">"Ô²Õ¥Õ¼Õ¶Õ¸Ö‚Õ´..."</string>
+ <string name="capital_on" msgid="1544682755514494298">"Õ„Õ«Õ¡ÖÕ¶Õ¥Õ¬"</string>
+ <string name="capital_off" msgid="6815870386972805832">"Ô±Õ¶Õ»Õ¡Õ¿Õ¥Õ¬"</string>
+ <string name="whichApplication" msgid="4533185947064773386">"Õ¡Õ¾Õ¡Ö€Õ¿Õ¥Õ¬ Õ£Õ¸Ö€Õ®Õ¸Õ²Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨` Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¥Õ¬Õ¸Õ¾"</string>
+ <string name="alwaysUse" msgid="4583018368000610438">"Õ•Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¥Õ¬ Õ¬Õ¼Õ¥Õ¬ÕµÕ¡ÕµÕ¶ Õ¡ÕµÕ½ Õ£Õ¸Ö€Õ®Õ¸Õ²Õ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ°Õ¡Õ´Õ¡Ö€:"</string>
+ <string name="clearDefaultHintMsg" msgid="3252584689512077257">"Õ„Õ¡Ö„Ö€Õ¥Õ¬ Õ¬Õ¼Õ¥Õ¬ÕµÕ¡ÕµÕ¶Õ¨ Õ€Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ« Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´Õ¶Õ¥Ö€ &gt; Ô¾Ö€Õ¡Õ£Ö€Õ¥Ö€ &gt;Õ†Õ¥Ö€Õ¢Õ¥Õ¼Õ¶Õ¾Õ¡Õ® Õ§Õ»Õ«Ö:"</string>
+ <string name="chooseActivity" msgid="7486876147751803333">"Ô¸Õ¶Õ¿Ö€Õ¥Õ¬ Õ£Õ¸Ö€Õ®Õ¸Õ²Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶"</string>
+ <string name="chooseUsbActivity" msgid="6894748416073583509">"Ô¸Õ¶Õ¿Ö€Õ¥Ö„ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ® USB Õ½Õ¡Ö€Ö„Õ« Õ°Õ¡Õ´Õ¡Ö€"</string>
+ <string name="noApplications" msgid="2991814273936504689">"ÕˆÕ¹ Õ´Õ« Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ® Õ¹Õ« Õ¯Õ¡Ö€Õ¸Õ² Õ¯Õ¡Õ¿Õ¡Ö€Õ¥Õ¬ Õ¡ÕµÕ½ Õ£Õ¸Ö€Õ®Õ¸Õ²Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨:"</string>
+ <string name="aerr_title" msgid="1905800560317137752"></string>
+ <string name="aerr_application" msgid="932628488013092776">"Õ‘Õ¡Õ¾Õ¸Ö„, <xliff:g id="APPLICATION">%1$s</xliff:g>-Õ¨ Õ¨Õ¶Õ¤Õ°Õ¡Õ¿Õ¾Õ¥Õ¬ Õ§:"</string>
+ <string name="aerr_process" msgid="4507058997035697579">"Õ‘Õ¡Õ¾Õ¸Ö„, <xliff:g id="PROCESS">%1$s</xliff:g> Õ£Õ¸Ö€Õ®Õ¨Õ¶Õ©Õ¡ÖÕ¨ Õ¤Õ¡Õ¤Õ¡Ö€Õ¥Õ¬ Õ§:"</string>
+ <string name="anr_title" msgid="4351948481459135709"></string>
+ <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g>-Õ¨ Õ¹Õ« Õ¡Ö€Õ±Õ¡Õ£Õ¡Õ¶Ö„Õ¸Ö‚Õ´:\n\nÕ‘Õ¡Õ¶Õ¯Õ¡Õ¶Õ¸Ö‚ÕžÕ´ Õ¥Ö„ ÖƒÕ¡Õ¯Õ¥Õ¬ Õ¡ÕµÕ¶:"</string>
+ <string name="anr_activity_process" msgid="5776209883299089767">"<xliff:g id="ACTIVITY">%1$s</xliff:g> Õ£Õ¸Ö€Õ®Õ¸Õ²Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Õ¹Õ« ÕºÕ¡Õ¿Õ¡Õ½Õ­Õ¡Õ¶Õ¸Ö‚Õ´:\n\nÕ‘Õ¡Õ¶Õ¯Õ¡Õ¶Õ¸Ö‚ÕžÕ´ Õ¥Ö„ Õ¡ÕµÕ¶ ÖƒÕ¡Õ¯Õ¥Õ¬:"</string>
+ <string name="anr_application_process" msgid="8941757607340481057">"<xliff:g id="APPLICATION">%1$s</xliff:g>-Õ¨ Õ¹Õ« Õ¡Ö€Õ±Õ¡Õ£Õ¡Õ¶Ö„Õ¸Ö‚Õ´: Õ‘Õ¡Õ¶Õ¯Õ¡Õ¶Õ¸Ö‚ÕžÕ´ Õ¥Ö„ ÖƒÕ¡Õ¯Õ¥Õ¬ Õ¡ÕµÕ¶:"</string>
+ <string name="anr_process" msgid="6513209874880517125">"<xliff:g id="PROCESS">%1$s</xliff:g> Õ£Õ¸Ö€Õ®Õ¨Õ¶Õ©Õ¡ÖÕ¨ Õ¹Õ« Õ¡Ö€Õ±Õ¡Õ£Õ¡Õ¶Ö„Õ¸Ö‚Õ´:\n\nÕ‘Õ¡Õ¶Õ¯Õ¡Õ¶Õ¸Ö‚ÕžÕ´ Õ¥Ö„ ÖƒÕ¡Õ¯Õ¥Õ¬ Õ¡ÕµÕ¶:"</string>
+ <string name="force_close" msgid="8346072094521265605">"Ô¼Õ¡Õ¾"</string>
+ <string name="report" msgid="4060218260984795706">"Ô¶Õ¥Õ¯Õ¸Ö‚ÕµÖ"</string>
+ <string name="wait" msgid="7147118217226317732">"ÕÕºÕ¡Õ½Õ¥Ö„"</string>
+ <string name="webpage_unresponsive" msgid="3272758351138122503">"Ô·Õ»Õ¨ Õ¹Õ« ÕºÕ¡Õ¿Õ¡Õ½Õ­Õ¡Õ¶Õ¸Ö‚Õ´:\n\nÕ‘Õ¡Õ¶Õ¯Õ¡Õ¶Õ¸Ö‚ÕžÕ´ Õ¥Ö„ ÖƒÕ¡Õ¯Õ¥Õ¬ Õ¡ÕµÕ¶:"</string>
+ <string name="launch_warning_title" msgid="1547997780506713581">"Õ€Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¨ Õ¾Õ¥Ö€Õ¡Õ°Õ²Õ¾Õ¥Õ¬ Õ§"</string>
+ <string name="launch_warning_replace" msgid="6202498949970281412">"<xliff:g id="APP_NAME">%1$s</xliff:g>-Õ¶ Õ¡ÕµÕªÕ´ Õ¡Õ·Õ­Õ¡Õ¿Õ¸Ö‚Õ´ Õ§:"</string>
+ <string name="launch_warning_original" msgid="188102023021668683">"<xliff:g id="APP_NAME">%1$s</xliff:g>-Õ¨ Õ« Õ½Õ¯Õ¦Õ¢Õ¡Õ¶Õ¥ Õ©Õ¸Õ²Õ¡Ö€Õ¯Õ¾Õ¥Õ¬ Õ§:"</string>
+ <string name="screen_compat_mode_scale" msgid="3202955667675944499">"Ô±Õ½Õ¿Õ«Õ³Õ¡Õ¶Õ¡Õ¯Õ¡Ö€Õ£Õ¥Õ¬"</string>
+ <string name="screen_compat_mode_show" msgid="4013878876486655892">"Õ„Õ«Õ·Õ¿ ÖÕ¸Ö‚ÕµÖ Õ¿Õ¡Õ¬"</string>
+ <string name="screen_compat_mode_hint" msgid="1064524084543304459">"Ô¿Ö€Õ¯Õ«Õ¶ Õ¡Õ¯Õ¿Õ«Õ¾Õ¡ÖÕ¶Õ¥Õ¬ Õ½Õ¡ Õ€Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ« Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´Õ¶Õ¥Ö€Õ¸Ö‚Õ´ &amp;gt Ô¾Ö€Õ¡Õ£Ö€Õ¥Ö€ &gt; Õ†Õ¥Ö€Õ¢Õ¥Õ¼Õ¶Õ¸Ö‚Õ´Õ¶Õ¥Ö€:"</string>
+ <string name="smv_application" msgid="3307209192155442829">"<xliff:g id="APPLICATION">%1$s</xliff:g> Õ®Ö€Õ¡Õ£Õ«Ö€Õ¨ (Õ£Õ¸Ö€Õ®Õ¨Õ¶Õ©Õ¡Ö <xliff:g id="PROCESS">%2$s</xliff:g>) Õ­Õ¡Õ­Õ¿Õ¥Õ¬ Õ§ Õ«Ö€ Õ«Õ¶Ö„Õ¶Õ¡Õ°Õ¡Ö€Õ¯Õ¡Õ¤Ö€Õ¾Õ¡Õ® Ô½Õ«Õ½Õ¿ Õ¼Õ¥ÕªÕ«Õ´ Ö„Õ¡Õ²Õ¡Ö„Õ¡Õ¯Õ¡Õ¶Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨:"</string>
+ <string name="smv_process" msgid="5120397012047462446">"<xliff:g id="PROCESS">%1$s</xliff:g> Õ£Õ¸Ö€Õ®Õ¨Õ¶Õ©Õ¡ÖÕ¨ Õ­Õ¡Õ­Õ¿Õ¥Õ¬ Õ§ Õ«Ö€ Õ«Õ¶Ö„Õ¶Õ¡Õ°Õ¡Ö€Õ¯Õ¡Õ¤Ö€Õ¾Õ¡Õ® Ô½Õ«Õ½Õ¿ Õ¼Õ¥ÕªÕ«Õ´ Ö„Õ¡Õ²Õ¡Ö„Õ¡Õ¯Õ¡Õ¶Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨:"</string>
+ <string name="android_upgrading_title" msgid="1584192285441405746">"Android-Õ¨ Õ¶Õ¸Ö€Õ¡ÖÕ¾Õ¸Ö‚Õ´ Õ§..."</string>
+ <string name="android_upgrading_apk" msgid="7904042682111526169">"Õ€Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¨ Ö…ÕºÕ¿Õ«Õ´Õ¡Õ¬Õ¡ÖÕ¾Õ¸Ö‚Õ´ Õ§ <xliff:g id="NUMBER_0">%1$d</xliff:g>-Õ«Ö <xliff:g id="NUMBER_1">%2$d</xliff:g>-Õ«:"</string>
+ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Õ€Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ¨ Õ´Õ¥Õ¯Õ¶Õ¡Ö€Õ¯Õ¸Ö‚Õ´ Õ¥Õ¶:"</string>
+ <string name="android_upgrading_complete" msgid="1405954754112999229">"Ô²Õ¥Õ¼Õ¶Õ¸Ö‚Õ´Õ¶ Õ¡Õ¾Õ¡Ö€Õ¿Õ¾Õ¸Ö‚Õ´ Õ§:"</string>
+ <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g>-Õ¶ Õ¡Õ·Õ­Õ¡Õ¿Õ¸Ö‚Õ´ Õ§"</string>
+ <string name="heavy_weight_notification_detail" msgid="1721681741617898865">"Õ€ÕºÕ¥Ö„` Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¡Õ¶ÖÕ¶Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€"</string>
+ <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Õ“Õ¸Õ­Õ¡Ö€Õ¯Õ¥ÕžÕ¬ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ¨:"</string>
+ <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Õ„Õ¥Õ¯ Õ¡ÕµÕ¬ Õ®Ö€Õ¡Õ£Õ«Ö€ Õ¡Ö€Õ¤Õ¥Õ¶ Õ¡Õ·Õ­Õ¡Õ¿Õ¸Ö‚Õ´ Õ§, Õ¸Ö€Õ¨ ÕºÕ¥Õ¿Ö„ Õ§ Õ¤Õ¡Õ¤Õ¡Ö€Õ¥ÖÕ¶Õ¥Õ¬, Õ¶Õ¡Õ­Ö„Õ¡Õ¶ Õ¤Õ¸Ö‚Ö„ Õ¯Õ¯Õ¡Ö€Õ¸Õ²Õ¡Õ¶Õ¡Ö„ Õ½Õ¯Õ½Õ¥Õ¬ Õ¶Õ¸Ö€Õ¨:"</string>
+ <string name="old_app_action" msgid="493129172238566282">"ÕŽÕ¥Ö€Õ¡Õ¤Õ¡Õ¼Õ¶Õ¡Õ¬ <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+ <string name="old_app_description" msgid="2082094275580358049">"Õ‰Õ½Õ¯Õ½Õ¥Õ¬ Õ¶Õ¸Ö€ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®:"</string>
+ <string name="new_app_action" msgid="5472756926945440706">"ÕÕ¯Õ«Õ¦Õ¢ <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+ <string name="new_app_description" msgid="1932143598371537340">"Ô´Õ¡Õ¤Õ¡Ö€Õ¥ÖÕ¶Õ¥Õ¬ Õ¶Õ¡Õ­Õ¯Õ«Õ¶ Õ®Ö€Õ¡Õ£Õ«Ö€Õ¶ Õ¡Õ¼Õ¡Õ¶Ö ÕºÕ¡Õ°ÕºÕ¡Õ¶Õ´Õ¡Õ¶:"</string>
+ <string name="sendText" msgid="5209874571959469142">"Ô¸Õ¶Õ¿Ö€Õ¥Ö„ Õ£Õ¸Ö€Õ®Õ¸Õ²Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶ Õ¿Õ¥Ö„Õ½Õ¿Õ« Õ°Õ¡Õ´Õ¡Ö€"</string>
+ <string name="volume_ringtone" msgid="6885421406845734650">"Ô¶Õ¡Õ¶Õ£Õ¡Õ¯Õ« Õ±Õ¡ÕµÕ¶Õ« Õ¸Ö‚ÕªÕ£Õ¶Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨"</string>
+ <string name="volume_music" msgid="5421651157138628171">"Õ„Õ¥Õ¤Õ«Õ¡ Õ±Õ¡ÕµÕ¶Õ« Õ¢Õ¡Ö€Õ±Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶"</string>
+ <string name="volume_music_hint_playing_through_bluetooth" msgid="9165984379394601533">"Õ†Õ¾Õ¡Õ£Õ¡Ö€Õ¯Õ¸Ö‚Õ´ է Bluetooth-Õ« Õ´Õ«Õ»Õ¸ÖÕ¸Õ¾"</string>
+ <string name="volume_music_hint_silent_ringtone_selected" msgid="8310739960973156272">"ÕÕ¡Õ°Õ´Õ¡Õ¶Õ¾Õ¥Õ¬ Õ§ Õ¡Õ¶Õ±Õ¡ÕµÕ¶ Õ¦Õ¡Õ¶Õ£Õ¥Ö€Õ¡Õ¶Õ£"</string>
+ <string name="volume_call" msgid="3941680041282788711">"Õ„Õ¸Ö‚Õ¿Ö„Õ¡ÕµÕ«Õ¶ Õ¦Õ¡Õ¶Õ£Õ« Õ±Õ¡ÕµÕ¶Õ« Õ¸Ö‚ÕªÕ£Õ¶Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨"</string>
+ <string name="volume_bluetooth_call" msgid="2002891926351151534">"Bluetooth-Õ« Õ¶Õ¥Ö€Õ¦Õ¡Õ¶Õ£Õ« Õ¢Õ¡Ö€Õ±Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶"</string>
+ <string name="volume_alarm" msgid="1985191616042689100">"Ô¶Õ¡Ö€Õ©Õ¸Ö‚ÖÕ«Õ¹Õ« Õ±Õ¡ÕµÕ¶Õ« Õ¸Ö‚ÕªÕ£Õ¶Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨"</string>
+ <string name="volume_notification" msgid="2422265656744276715">"Ô¾Õ¡Õ¶Õ¸Ö‚ÖÕ¸Ö‚Õ´Õ¶Õ¥Ö€Õ« Õ±Õ¡ÕµÕ¶Õ« Õ¸Ö‚ÕªÕ£Õ¶Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨"</string>
+ <string name="volume_unknown" msgid="1400219669770445902">"ÕÕ¡ÕµÕ¶"</string>
+ <string name="volume_icon_description_bluetooth" msgid="6538894177255964340">"Bluetooth-Õ« Õ±Õ¡ÕµÕ¶Õ« Õ¸Ö‚ÕªÕ£Õ¶Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨"</string>
+ <string name="volume_icon_description_ringer" msgid="3326003847006162496">"Ô¶Õ¡Õ¶Õ£Õ¥Ö€Õ¡Õ¶Õ£Õ« Õ¢Õ¡Ö€Õ±Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶"</string>
+ <string name="volume_icon_description_incall" msgid="8890073218154543397">"Ô¶Õ¡Õ¶Õ£Õ« Õ±Õ¡ÕµÕ¶Õ« Õ¢Õ¡Ö€Õ±Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶"</string>
+ <string name="volume_icon_description_media" msgid="4217311719665194215">"Õ„Õ¥Õ¤Õ«Õ¡ Õ±Õ¡ÕµÕ¶Õ« Õ¢Õ¡Ö€Õ±Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶"</string>
+ <string name="volume_icon_description_notification" msgid="7044986546477282274">"Ô¾Õ¡Õ¶Õ¸Ö‚ÖÕ¸Ö‚Õ´Õ¶Õ¥Ö€Õ« Õ±Õ¡ÕµÕ¶Õ« Õ¸Ö‚ÕªÕ£Õ¶Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨"</string>
+ <string name="ringtone_default" msgid="3789758980357696936">"Ô¼Õ¼Õ¥Õ¬ÕµÕ¡ÕµÕ¶ Õ¦Õ¡Õ¶Õ£Õ¥Ö€Õ¡Õ¶Õ£"</string>
+ <string name="ringtone_default_with_actual" msgid="8129563480895990372">"Ô¼Õ¼Õ¥Õ¬ÕµÕ¡ÕµÕ¶ Õ¦Õ¡Õ¶Õ£Õ¥Ö€Õ¡Õ¶Õ£ (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_silent" msgid="7937634392408977062">"ÕˆÕ¹ Õ´Õ¥Õ¯Õ¨"</string>
+ <string name="ringtone_picker_title" msgid="3515143939175119094">"Ô¶Õ¡Õ¶Õ£Õ¥Ö€Õ¡Õ¶Õ£Õ¶Õ¥Ö€"</string>
+ <string name="ringtone_unknown" msgid="5477919988701784788">"Ô±Õ¶Õ°Õ¡ÕµÕ¿ Õ¦Õ¡Õ¶Õ£Õ¥Ö€Õ¡Õ¶Õ£"</string>
+ <plurals name="wifi_available">
+ <item quantity="one" msgid="6654123987418168693">"Wi-Fi ÖÕ¡Õ¶ÖÕ¨ Õ°Õ¡Õ½Õ¡Õ¶Õ¥Õ¬Õ« Õ§"</item>
+ <item quantity="other" msgid="4192424489168397386">"Õ°Õ¡Õ½Õ¡Õ¶Õ¥Õ¬Õ« Õ¥Õ¶ Wi-Fi ÖÕ¡Õ¶ÖÕ¥Ö€"</item>
+ </plurals>
+ <plurals name="wifi_available_detailed">
+ <item quantity="one" msgid="1634101450343277345">"Ô²Õ¡Ö Wi-Fi ÖÕ¡Õ¶ÖÕ¨ Õ°Õ¡Õ½Õ¡Õ¶Õ¥Õ¬Õ« Õ§"</item>
+ <item quantity="other" msgid="7915895323644292768">"Õ€Õ¡Õ½Õ¡Õ¶Õ¥Õ¬Õ« Õ¥Õ¶ Õ¢Õ¡Ö Wi-Fi ÖÕ¡Õ¶ÖÕ¥Ö€"</item>
+ </plurals>
+ <string name="wifi_available_sign_in" msgid="4029489716605255386">"Õ„Õ¸Ö‚Õ¿Ö„ Õ£Õ¸Ö€Õ®Õ¥Ö„ Wi-Fi ÖÕ¡Õ¶Ö"</string>
+ <string name="network_available_sign_in" msgid="8495155593358054676">"Õ„Õ¸Ö‚Õ¿Ö„ Õ£Õ¸Ö€Õ®Õ¥Õ¬ ÖÕ¡Õ¶Ö"</string>
+ <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
+ <skip />
+ <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Õ‰Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Ö Õ´Õ«Õ¡Õ¶Õ¡Õ¬ Wi-Fi-Õ«Õ¶"</string>
+ <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" Õ¸Ö‚Õ¶Õ« Õ©Õ¸Ö‚ÕµÕ¬ Õ«Õ¶Õ¿Õ¥Ö€Õ¶Õ¥Õ¿ Õ¯Õ¡Õº:"</string>
+ <string name="wifi_p2p_dialog_title" msgid="97611782659324517">"Wi-Fi Õ¸Ö‚Õ²Õ«Õ²"</string>
+ <string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"Õ„Õ¥Õ¯Õ¶Õ¡Ö€Õ¯Õ¥Õ¬ Wi-Fi Õ¸Ö‚Õ²Õ«Õ¶: Ô±ÕµÕ¶ Õ¯Õ¡Õ¶Õ»Õ¡Õ¿Õ« Wi-Fi Õ°Õ¡Õ³Õ¡Õ­Õ¸Ö€Õ¤/Õ©Õ¥Õª Õ¯Õ¥Õ¿ Õ£Õ¸Ö€Õ®Õ¸Õ²Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨:"</string>
+ <string name="wifi_p2p_failed_message" msgid="3763669677935623084">"Õ‰Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Ö Õ´Õ¥Õ¯Õ¶Õ¡Ö€Õ¯Õ¥Õ¬ Wi-Fi Õ¸Ö‚Õ²Õ«Õ¶:"</string>
+ <string name="wifi_p2p_enabled_notification_title" msgid="2068321881673734886">"Wi-Fi Õ¸Ö‚Õ²Õ«Õ²Õ¶ Õ¡Õ¼ÖÕ¡Õ¶Ö Õ§"</string>
+ <string name="wifi_p2p_enabled_notification_message" msgid="1638949953993894335">"Õ€ÕºÕ¥Ö„ Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´Õ¶Õ¥Ö€Õ« Õ°Õ¡Õ´Õ¡Ö€"</string>
+ <string name="accept" msgid="1645267259272829559">"Ô¸Õ¶Õ¤Õ¸Ö‚Õ¶Õ¥Õ¬"</string>
+ <string name="decline" msgid="2112225451706137894">"Õ„Õ¥Ö€ÕªÕ¥Õ¬"</string>
+ <string name="wifi_p2p_invitation_sent_title" msgid="1318975185112070734">"Õ€Ö€Õ¡Õ¾Õ¥Ö€Õ¶ Õ¸Ö‚Õ²Õ¡Ö€Õ¯Õ¾Õ¡Õ® Õ§"</string>
+ <string name="wifi_p2p_invitation_to_connect_title" msgid="4958803948658533637">"Õ„Õ«Õ¡ÖÕ´Õ¡Õ¶ Õ°Ö€Õ¡Õ¾Õ¥Ö€"</string>
+ <string name="wifi_p2p_from_message" msgid="570389174731951769">"ÕˆÖ‚Õ²Õ¡Ö€Õ¯Õ¸Õ²`"</string>
+ <string name="wifi_p2p_to_message" msgid="248968974522044099">"ÕˆÖ‚Õ´`"</string>
+ <string name="wifi_p2p_enter_pin_message" msgid="5920929550367828970">"Õ„Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ¥Ö„ ÕºÕ¡Õ°Õ¡Õ¶Õ»Õ¾Õ¸Õ² PIN-Õ¨:"</string>
+ <string name="wifi_p2p_show_pin_message" msgid="8530563323880921094">"PIN-Õ¨`"</string>
+ <string name="wifi_p2p_frequency_conflict_message" product="tablet" msgid="8012981257742232475">"Ô³Ö€Õ¡Õ½Õ¡Õ¬Õ«Õ¯Õ¨ ÕªÕ¡Õ´Õ¡Õ¶Õ¡Õ¯Õ¡Õ¾Õ¸Ö€Õ¡ÕºÕ¥Õ½ Õ¯Õ¡Õ¶Õ»Õ¡Õ¿Õ¾Õ« Wi-Fi-Õ«Ö, Ö„Õ¡Õ¶Õ« Õ¤Õ¥Õ¼ Õ¡ÕµÕ¶ Õ¯Õ¡ÕºÕ¡Õ¯ÖÕ¾Õ¡Õ® Õ§ <xliff:g id="DEVICE_NAME">%1$s</xliff:g>-Õ«Õ¶"</string>
+ <string name="wifi_p2p_frequency_conflict_message" product="default" msgid="7363907213787469151">"Õ€Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ¨ ÕªÕ¡Õ´Õ¡Õ¶Õ¡Õ¯Õ¡Õ¾Õ¸Ö€Õ¡ÕºÕ¥Õ½ Õ¯Õ¡Õ¶Õ»Õ¡Õ¿Õ¾Õ« Wi-Fi-Õ«Ö, Ö„Õ¡Õ¶Õ« Õ¤Õ¥Õ¼ Õ¡ÕµÕ¶ Õ´Õ«Õ¡ÖÕ¾Õ¡Õ® Õ§ <xliff:g id="DEVICE_NAME">%1$s</xliff:g>-Õ«Õ¶"</string>
+ <string name="select_character" msgid="3365550120617701745">"Ô¶Õ¥Õ¿Õ¥Õ²Õ¥Õ¬ Õ¶Õ·Õ¡Õ¶"</string>
+ <string name="sms_control_title" msgid="7296612781128917719">"SMS Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ« Õ¸Ö‚Õ²Õ¡Ö€Õ¯Õ¸Ö‚Õ´"</string>
+ <string name="sms_control_message" msgid="3867899169651496433">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;-Õ¨ Õ¸Ö‚Õ²Õ¡Ö€Õ¯Õ¸Ö‚Õ´ Õ§ Õ´Õ¥Õ® Õ©Õ¾Õ¸Õ¾ SMS Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€: Õ‘Õ¡Õ¶Õ¯Õ¡Õ¶Õ¸Ö‚ÕžÕ´ Õ¥Ö„ Õ©Õ¸Ö‚ÕµÕ¬Õ¡Õ¿Ö€Õ¥Õ¬ Õ¡ÕµÕ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ·Õ¡Ö€Õ¸Ö‚Õ¶Õ¡Õ¯Õ¥Õ¬ Õ¸Ö‚Õ²Õ¡Ö€Õ¯Õ¥Õ¬ Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€:"</string>
+ <string name="sms_control_yes" msgid="3663725993855816807">"Ô¹Õ¸Ö‚ÕµÕ¬Õ¡Õ¿Ö€Õ¥Õ¬"</string>
+ <string name="sms_control_no" msgid="625438561395534982">"ÔºÕ­Õ¿Õ¥Õ¬"</string>
+ <string name="sms_short_code_confirm_message" msgid="1645436466285310855">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>-Õ¨&lt;/b&gt; Õ¸Ö‚Õ¦Õ¸Ö‚Õ´ Õ§ Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶ Õ¸Ö‚Õ²Õ¡Ö€Õ¯Õ¥Õ¬ &lt;b&gt;<xliff:g id="DEST_ADDRESS">%2$s</xliff:g>-Õ«Õ¶&lt;/b&gt;:"</string>
+ <string name="sms_short_code_details" msgid="3492025719868078457">"Ô±ÕµÕ½ "<font fgcolor="#ffffb060">"-Õ¨ Õ¯Õ¡Ö€Õ¸Õ² Õ§ Õ£Õ¡Õ¶Õ±Õ¸Ö‚Õ´Õ¶Õ¥Ö€ Õ¡Õ¼Õ¡Õ»Õ¡ÖÕ¶Õ¥Õ¬"</font>" Õ±Õ¥Ö€ Õ¢Õ»Õ»Õ¡ÕµÕ«Õ¶ Õ°Õ¡Õ·Õ¾Õ« Õ¾Ö€Õ¡:"</string>
+ <string name="sms_premium_short_code_details" msgid="5523826349105123687"><font fgcolor="#ffffb060">"ÕÖ€Õ¡ Õ°Õ¥Õ¿Ö‡Õ¡Õ¶Ö„Õ¸Õ¾ Õ±Õ¥Ö€ Õ¢Õ»Õ»Õ¡ÕµÕ«Õ¶ Õ°Õ¡Õ·Õ¾Õ«Õ¶ Õ¯Õ¶Õ¥Ö€Õ¯Õ¡ÕµÕ¡ÖÕ¾Õ« Õ°Õ¡Õ·Õ«Õ¾:"</font></string>
+ <string name="sms_short_code_confirm_allow" msgid="4458878637111023413">"ÕˆÖ‚Õ²Õ¡Ö€Õ¯Õ¥Õ¬"</string>
+ <string name="sms_short_code_confirm_deny" msgid="2927389840209170706">"Õ‰Õ¥Õ²Õ¡Ö€Õ¯Õ¥Õ¬"</string>
+ <string name="sms_short_code_remember_choice" msgid="5289538592272218136">"Õ€Õ«Õ·Õ¥Õ¬ Õ«Õ´ Õ¨Õ¶Õ¿Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨"</string>
+ <string name="sms_short_code_remember_undo_instruction" msgid="4960944133052287484">"Դուք կարող եք փոխել սա ավելի ուշ Կարգավորումներում  &gt; Ծրագրերում"</string>
+ <string name="sms_short_code_confirm_always_allow" msgid="3241181154869493368">"Õ„Õ«Õ·Õ¿ Õ©Õ¸Ö‚ÕµÕ¬Õ¡Õ¿Ö€Õ¥Õ¬"</string>
+ <string name="sms_short_code_confirm_never_allow" msgid="446992765774269673">"ÔµÖ€Õ¢Õ¥Ö„ Õ¹Õ©Õ¸Ö‚ÕµÕ¬Õ¡Õ¿Ö€Õ¥Õ¬"</string>
+ <string name="sim_removed_title" msgid="6227712319223226185">"SIM Ö„Õ¡Ö€Õ¿Õ¨ Õ°Õ¥Õ¼Õ¡ÖÕ¾Õ¡Õ® Õ§"</string>
+ <string name="sim_removed_message" msgid="2333164559970958645">"Ô²Õ»Õ»Õ¡ÕµÕ«Õ¶ ÖÕ¡Õ¶ÖÕ¨ Õ¡Õ¶Õ°Õ¡Õ½Õ¡Õ¶Õ¥Õ¬Õ« Õ¯Õ¬Õ«Õ¶Õ«, Õ´Õ«Õ¶Õ¹Ö‡ Õ¹Õ¾Õ¥Ö€Õ¡Õ£Õ¸Ö€Õ®Õ¡Ö€Õ¯Õ¥Ö„ Õ¾Õ¡Õ¾Õ¥Ö€ SIM Ö„Õ¡Ö€Õ¿ Õ¿Õ¥Õ²Õ¡Õ¤Ö€Õ¥Õ¬Õ¸Ö‚Ö Õ°Õ¥Õ¿Õ¸:"</string>
+ <string name="sim_done_button" msgid="827949989369963775">"Ô¿Õ¡Õ¿Õ¡Ö€Õ¾Õ¡Õ®"</string>
+ <string name="sim_added_title" msgid="3719670512889674693">"SIM Ö„Õ¡Ö€Õ¿Õ¨ Õ¡Õ¾Õ¥Õ¬Õ¡ÖÕ¾Õ¥Õ¬ Õ§"</string>
+ <string name="sim_added_message" msgid="6599945301141050216">"ÕŽÕ¥Ö€Õ¡Õ£Õ¸Ö€Õ®Õ¡Ö€Õ¯Õ¥Ö„ Õ±Õ¥Ö€ Õ½Õ¡Ö€Ö„Õ¨` Õ¢Õ»Õ»Õ¡ÕµÕ«Õ¶ ÖÕ¡Õ¶Ö Õ´Õ¸Ö‚Õ¿Ö„ Õ¸Ö‚Õ¶Õ¥Õ¶Õ¡Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€:"</string>
+ <string name="sim_restart_button" msgid="4722407842815232347">"ÕŽÕ¥Ö€Õ¡Õ£Õ¸Ö€Õ®Õ¡Ö€Õ¯Õ¥Õ¬"</string>
+ <string name="time_picker_dialog_title" msgid="8349362623068819295">"ÕÕ¡Õ°Õ´Õ¡Õ¶Õ¥Õ¬ ÕªÕ¡Õ´Õ¨"</string>
+ <string name="date_picker_dialog_title" msgid="5879450659453782278">"ÕÕ¡Õ°Õ´Õ¡Õ¶Õ¥Õ¬ Õ¡Õ´Õ½Õ¡Õ©Õ«Õ¾Õ¨"</string>
+ <string name="date_time_set" msgid="5777075614321087758">"ÕÕ¡Õ°Õ´Õ¡Õ¶Õ¥Õ¬"</string>
+ <string name="date_time_done" msgid="2507683751759308828">"Ô¿Õ¡Õ¿Õ¡Ö€Õ¾Õ¡Õ® Õ§"</string>
+ <string name="perms_new_perm_prefix" msgid="8257740710754301407"><font size="12" fgcolor="#ff33b5e5">"Õ†Õ¸Ö€` "</font></string>
+ <string name="perms_description_app" msgid="5139836143293299417">"ÕÖ€Õ¡Õ´Õ¡Õ¤Ö€Õ¾Õ¡Õ® Õ§ <xliff:g id="APP_NAME">%1$s</xliff:g>-Õ« Õ¯Õ¸Õ²Õ´Õ«Ö:"</string>
+ <string name="no_permissions" msgid="7283357728219338112">"Ô¹Õ¸Ö‚ÕµÕ¬Õ¿Õ¾Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€ Õ¹Õ¥Õ¶ ÕºÕ¡Õ°Õ¡Õ¶Õ»Õ¾Õ¸Ö‚Õ´"</string>
+ <string name="perm_costs_money" msgid="4902470324142151116">"ÕÕ¡ Õ¯Õ¡Ö€Õ¸Õ² Õ§ Õ£Õ¸Ö‚Õ´Õ¡Ö€ ÕºÕ¡Õ°Õ¡Õ¶Õ»Õ¥Õ¬"</string>
+ <string name="usb_storage_activity_title" msgid="4465055157209648641">"USB Õ¦Õ¡Õ¶Õ£Õ¾Õ¡Õ®Õ¡ÕµÕ«Õ¶ Õ¯Ö€Õ«Õ¹"</string>
+ <string name="usb_storage_title" msgid="5901459041398751495">"USB-Õ¶ Õ¯Õ¡ÕºÕ¡Õ¯ÖÕ¾Õ¡Õ® Õ§"</string>
+ <string name="usb_storage_message" product="nosdcard" msgid="3308538094316477839">"Ô´Õ¸Ö‚Ö„ Õ¯Õ¡ÕºÕ¡Õ¯ÖÕ¾Õ¥Õ¬ Õ¥Ö„ Õ±Õ¥Ö€ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ¹Õ«Õ¶ USB-Õ« Õ´Õ«Õ»Õ¸ÖÕ¸Õ¾: Õ€ÕºÕ¥Ö„ Õ¶Õ¥Ö€Ö„Ö‡Õ« Õ¯Õ¸Õ³Õ¡Õ¯Õ¨, Õ¥Õ©Õ¥ ÖÕ¡Õ¶Õ¯Õ¡Õ¶Õ¸Ö‚Õ´ Õ¥Ö„ ÕºÕ¡Õ¿Õ³Õ¥Õ¶Õ¥Õ¬ Ö†Õ¡ÕµÕ¬Õ¥Ö€Õ¨ Õ±Õ¥Ö€ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ¹Õ« Ö‡ Õ±Õ¥Ö€ Android-Õ« USB Õ¯Ö€Õ«Õ¹Õ« Õ´Õ«Õ»Ö‡:"</string>
+ <string name="usb_storage_message" product="default" msgid="805351000446037811">"Ô´Õ¸Ö‚Ö„ Õ´Õ«Õ¡ÖÕ¥Õ¬ Õ¥Ö„ Õ±Õ¥Ö€ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ¹Õ«Õ¶ USB-Õ« Õ´Õ«Õ»Õ¸ÖÕ¸Õ¾: Õ€ÕºÕ¥Ö„ Õ¶Õ¥Ö€Ö„Ö‡Õ« Õ¯Õ¸Õ³Õ¡Õ¯Õ«Õ¶, Õ¥Õ©Õ¥ ÖÕ¡Õ¶Õ¯Õ¡Õ¶Õ¸Ö‚Õ´ Õ¥Ö„ ÕºÕ¡Õ¿Õ³Õ¥Õ¶Õ¥Õ¬ Ö†Õ¡ÕµÕ¬Õ¥Ö€Õ¨ Õ±Õ¥Ö€ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ¹Õ« Ö‡ Õ±Õ¥Ö€ Android-Õ« SD Ö„Õ¡Ö€Õ¿Õ« Õ´Õ«Õ»Ö‡:"</string>
+ <string name="usb_storage_button_mount" msgid="1052259930369508235">"Õ„Õ«Õ¡ÖÕ¶Õ¥Õ¬ USB Õ¯Ö€Õ«Õ¹Õ¨"</string>
+ <string name="usb_storage_error_message" product="nosdcard" msgid="3017045217365540658">"Խնդիր է ծագել ձեր USB կրիչը USB զանգվածային կրիչի համար օգտագործելիս:"</string>
+ <string name="usb_storage_error_message" product="default" msgid="2876018512716970313">"Խնդիր է ծագել ձեր SD քարտը USB զանգվածային կրիչի համար օգտագործելիս:"</string>
+ <string name="usb_storage_notification_title" msgid="8175892554757216525">"USB-Õ¶ Õ¯Õ¡ÕºÕ¡Õ¯ÖÕ¾Õ¡Õ® Õ§"</string>
+ <string name="usb_storage_notification_message" msgid="939822783828183763">"Õ€ÕºÕ¥Ö„` Ö†Õ¡ÕµÕ¬Õ¥Ö€Õ¨ ÕºÕ¡Õ¿Õ³Õ¥Õ¶Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€ Õ±Õ¥Ö€ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ¹Õ¸Ö‚Õ´ Õ¯Õ¡Õ´ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ¹Õ«Ö:"</string>
+ <string name="usb_storage_stop_notification_title" msgid="2336058396663516017">"Ô±Õ¶Õ»Õ¡Õ¿Õ¥Õ¬ USB Õ¯Ö€Õ«Õ¹Õ¨"</string>
+ <string name="usb_storage_stop_notification_message" msgid="1656852098555623822">"Õ€ÕºÕ¥Ö„` USB Õ¯Ö€Õ«Õ¹Õ¶ Õ¡Õ¶Õ»Õ¡Õ¿Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€:"</string>
+ <string name="usb_storage_stop_title" msgid="660129851708775853">"USB Õ¯Ö€Õ«Õ¹Õ¨ Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¾Õ¸Ö‚Õ´ Õ§"</string>
+ <string name="usb_storage_stop_message" product="nosdcard" msgid="4264025280777219521">"Õ†Õ¡Õ­Ö„Õ¡Õ¶ USB Õ¯Ö€Õ«Õ¹Õ¶ Õ¡Õ¶Õ»Õ¡Õ¿Õ¥Õ¬Õ¨, Õ¡Õ¶Õ»Õ¡Õ¿Õ¥Ö„ («հանեք») Õ±Õ¥Ö€ Android-Õ« USB Õ¯Ö€Õ«Õ¹Õ¨ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ¹Õ«Ö:"</string>
+ <string name="usb_storage_stop_message" product="default" msgid="8043969782460613114">"Õ†Õ¡Õ­Ö„Õ¡Õ¶ USB Õ¯Ö€Õ«Õ¹Õ¶ Õ¡Õ¶Õ»Õ¡Õ¿Õ¥Õ¬Õ¨, Õ¡Õ¶Õ»Õ¡Õ¿Õ¥Ö„ («հանեք») Õ±Õ¥Ö€ Android-Õ« SD Ö„Õ¡Ö€Õ¿Õ¨ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ¹Õ«Ö:"</string>
+ <string name="usb_storage_stop_button_mount" msgid="7060218034900696029">"Ô±Õ¶Õ»Õ¡Õ¿Õ¥Õ¬ USB Õ¯Ö€Õ«Õ¹Õ¨"</string>
+ <string name="usb_storage_stop_error_message" msgid="1970374898263063836">"Ô½Õ¶Õ¤Õ«Ö€ Õ¡Õ¼Õ¡Õ»Õ¡ÖÕ¡Õ¾ USB Õ¯Ö€Õ«Õ¹Õ¶ Õ¡Õ¶Õ»Õ¡Õ¿Õ¥Õ¬Õ«Õ½: ÕÕ¿Õ¸Ö‚Õ£Õ¥Ö„, Õ¡Ö€Õ¤ÕµÕ¸Ö„ Õ¡Õ¶Õ»Õ¡Õ¿Õ¥Õ¬ Õ¥Ö„ USB Õ°Õ¡Õ¶Õ£Õ¸Ö‚ÕµÖÕ¨, Õ¡ÕºÕ¡ ÖƒÕ¸Ö€Õ±Õ¥Ö„ Õ¯Ö€Õ¯Õ«Õ¶:"</string>
+ <string name="dlg_confirm_kill_storage_users_title" msgid="963039033470478697">"Õ„Õ«Õ¡ÖÕ¶Õ¥Õ¬ USB Õ¯Ö€Õ«Õ¹Õ¨"</string>
+ <string name="dlg_confirm_kill_storage_users_text" msgid="5100428757107469454">"ÔµÕ©Õ¥ ​​դուք Õ´Õ«Õ¡ÖÕ¶Õ¥Ö„ USB Õ¯Ö€Õ«Õ¹Õ¨, Õ¸Ö€Õ¸Õ· Õ®Ö€Õ¡Õ£Ö€Õ¥Ö€,Õ¸Ö€Õ¸Õ¶ÖÕ«Ö Ö…Õ£Õ¿Õ¾Õ¸Ö‚Õ´ Õ¥Ö„, Õ¯Õ¤Õ¡Õ¤Õ¡Ö€Õ¥Õ¶ Õ¡Õ·Õ­Õ¡Õ¿Õ¥Õ¬ Ö‡ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Õ¶ Õ¡Õ¶Õ°Õ¡Õ½Õ¡Õ¶Õ¥Õ¬Õ« Õ¬Õ«Õ¶Õ¥Õ¬, Ö„Õ¡Õ¶Õ« Õ¤Õ¥Õ¼ Õ¹Õ¥Ö„ Õ¡Õ¶Õ»Õ¡Õ¿Õ¥Õ¬ USB Õ¯Ö€Õ«Õ¹Õ¨:"</string>
+ <string name="dlg_error_title" msgid="7323658469626514207">"USB Õ£Õ¸Ö€Õ®Õ¸Õ²Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Õ¡Õ¶Õ°Õ¡Õ»Õ¸Õ² Õ§Ö€"</string>
+ <string name="dlg_ok" msgid="7376953167039865701">"Ô¼Õ¡Õ¾"</string>
+ <string name="usb_mtp_notification_title" msgid="3699913097391550394">"Ô¿Õ¡ÕºÕ¡Õ¯ÖÕ¾Õ¡Õ® Õ§ Õ¸Ö€ÕºÕ¥Õ½ Õ´Õ¥Õ¤Õ«Õ¡ Õ½Õ¡Ö€Ö„"</string>
+ <string name="usb_ptp_notification_title" msgid="1960817192216064833">"Õ„Õ«Õ¡ÖÕ¾Õ¡Õ® Õ§ Õ¸Ö€ÕºÕ¥Õ½ Ö†Õ¸Õ¿Õ¸Õ­ÖÕ«Õ¯"</string>
+ <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"Õ„Õ«Õ¡ÖÕ¾Õ¡Õ® Õ§ Õ¸Ö€ÕºÕ¥Õ½ Õ¿Õ¥Õ²Õ¡Õ¤Ö€Õ«Õ¹"</string>
+ <string name="usb_accessory_notification_title" msgid="7848236974087653666">"Ô¿Õ¡ÕºÕ¡Õ¯ÖÕ¾Õ¡Õ® Õ§ USB Õ¬Ö€Õ¡Õ½Õ¡Ö€Ö„Õ«"</string>
+ <string name="usb_notification_message" msgid="2290859399983720271">"Հպեք` այլ USB ընտրանքների համար:"</string>
+ <string name="extmedia_format_title" product="nosdcard" msgid="9020092196061007262">"Õ–Õ¸Ö€Õ´Õ¡Õ¿Õ¡Õ¾Õ¸Ö€Õ¥ÕžÕ¬ USB Õ¯Ö€Õ«Õ¹Õ¨:"</string>
+ <string name="extmedia_format_title" product="default" msgid="3648415921526526069">"Õ–Õ¸Ö€Õ´Õ¡Õ¿Õ¡Õ¾Õ¸Ö€Õ¥ÕžÕ¬ SD Ö„Õ¡Ö€Õ¿Õ¨:"</string>
+ <string name="extmedia_format_message" product="nosdcard" msgid="3934016853425761078">"ÕÕ¥Ö€ USB Õ¯Ö€Õ«Õ¹Õ¸Ö‚Õ´ ÕºÕ¡Õ°Õ¾Õ¸Õ² Õ¢Õ¸Õ¬Õ¸Ö€ Ö†Õ¡ÕµÕ¬Õ¥Ö€Õ¨ Õ¯Õ»Õ¶Õ»Õ¾Õ¥Õ¶: Ô±ÕµÕ½ Õ£Õ¸Ö€Õ®Õ¸Õ²Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Õ¡Õ¶Õ·Ö€Õ»Õ¥Õ¬Õ« Õ§:"</string>
+ <string name="extmedia_format_message" product="default" msgid="14131895027543830">"ÕÕ¥Ö€ Ö„Õ¡Ö€Õ¿Õ« Õ¢Õ¸Õ¬Õ¸Ö€ Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨ Õ¯Õ¯Õ¸Ö€Õ¥Õ¶:"</string>
+ <string name="extmedia_format_button_format" msgid="4131064560127478695">"ÕÖ‡Õ¡Õ¹Õ¡Öƒ"</string>
+ <string name="adb_active_notification_title" msgid="6729044778949189918">"USB Õ¾Ö€Õ«ÕºÕ¡Õ¦Õ¥Ö€Õ®Õ¸Ö‚Õ´Õ¨ Õ´Õ«Õ¡ÖÕ¾Õ¡Õ® Õ§"</string>
+ <string name="adb_active_notification_message" msgid="1016654627626476142">"Õ€ÕºÕ¥Ö„` USB Õ¯Õ¡Ö€Õ£Õ¡Õ¢Õ¥Ö€Õ¸Ö‚Õ´Õ¨ Õ¯Õ¡Õ½Õ¥ÖÕ¶Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€:"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"Ô¸Õ¶Õ¿Ö€Õ¥Ö„ Õ´Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ´Õ¡Õ¶ Õ¥Õ²Õ¡Õ¶Õ¡Õ¯Õ¨"</string>
+ <string name="configure_input_methods" msgid="9091652157722495116">"Ô¿Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¥Õ¬ Õ¶Õ¥Ö€Õ¡Õ®Õ´Õ¡Õ¶ Õ¥Õ²Õ¡Õ¶Õ¡Õ¯Õ¶Õ¥Ö€Õ¨"</string>
+ <string name="use_physical_keyboard" msgid="6203112478095117625">"Õ–Õ«Õ¦Õ«Õ¯Õ¡Õ¯Õ¡Õ¶ Õ½Õ¿Õ¥Õ²Õ¶Õ¡Õ·Õ¡Ö€"</string>
+ <string name="hardware" msgid="7517821086888990278">"ÕÕ¡Ö€Ö„Õ¡Õ·Õ¡Ö€"</string>
+ <string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Ô¸Õ¶Õ¿Ö€Õ¥Ö„ Õ½Õ¿Õ¥Õ²Õ¶Õ¡Õ·Õ¡Ö€Õ« Õ¤Õ«Ö€Ö„Õ¨"</string>
+ <string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"Õ€ÕºÕ¥Ö„` Õ½Õ¿Õ¥Õ²Õ¶Õ¡Õ·Õ¡Ö€Õ« Õ¤Õ«Ö€Ö„Õ¨ Õ¨Õ¶Õ¿Ö€Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€:"</string>
+ <string name="fast_scroll_alphabet" msgid="5433275485499039199">" Ô±Ô²Ô³Ô´ÔµÔ¶Ô·Ô¸Ô¹ÔºÔ»Ô¼Ô½Ô¾Ô¿Õ€ÕÕ‚ÕƒÕ„Õ…Õ†Õ‡ÕˆÕ‰ÕŠÕ‹ÕŒÕÕŽÕÕÕ‘ÕˆÕ’Õ“Õ”ÔµÖ‚Õ•Õ–"</string>
+ <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+ <string name="candidates_style" msgid="4333913089637062257"><u>"Õ©Õ¥Õ¯Õ¶Õ¡Õ®Õ¸Ö‚Õ¶Õ¥Ö€Õ¨"</u></string>
+ <string name="ext_media_checking_notification_title" product="nosdcard" msgid="3449816005351468560">"ÕŠÕ¡Õ¿Ö€Õ¡Õ½Õ¿Õ¸Ö‚Õ´ Õ§ USB Õ¯Ö€Õ«Õ¹Õ¨"</string>
+ <string name="ext_media_checking_notification_title" product="default" msgid="5457603418970994050">"ÕŠÕ¡Õ¿Ö€Õ¡Õ½Õ¿Õ¾Õ¸Ö‚Õ´ Õ§ SD Ö„Õ¡Ö€Õ¿Õ¨"</string>
+ <string name="ext_media_checking_notification_message" msgid="8287319882926737053">"ÕÕ­Õ¡Õ¬Õ¶Õ¥Ö€Õ« Õ½Õ¿Õ¸Ö‚Õ£Õ¸Ö‚Õ´:"</string>
+ <string name="ext_media_nofs_notification_title" product="nosdcard" msgid="7788040745686229307">"USB Õ¯Ö€Õ«Õ¹Õ¨ Õ¤Õ¡Õ¿Õ¡Ö€Õ¯ Õ§"</string>
+ <string name="ext_media_nofs_notification_title" product="default" msgid="780477838241212997">"Ô´Õ¡Õ¿Õ¡Ö€Õ¯ SD Ö„Õ¡Ö€Õ¿"</string>
+ <string name="ext_media_nofs_notification_message" product="nosdcard" msgid="7840121067427269500">"USB Õ¯Ö€Õ«Õ¹Õ¨ Õ¤Õ¡Õ¿Õ¡Ö€Õ¯ Õ§ Õ¯Õ¡Õ´ Õ¸Ö‚Õ¶Õ« Õ¹Õ¡Õ»Õ¡Õ¯ÖÕ¾Õ¸Õ² Ö†Õ¡ÕµÕ¬Õ¡ÕµÕ«Õ¶ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£:"</string>
+ <string name="ext_media_nofs_notification_message" product="default" msgid="8641065641786923604">"SD Ö„Õ¡Ö€Õ¿Õ¨ Õ¤Õ¡Õ¿Õ¡Ö€Õ¯ Õ§ Õ¯Õ¡Õ´ Õ¸Ö‚Õ¶Õ« Õ¹Õ¡Õ»Õ¡Õ¯ÖÕ¾Õ¸Õ² Ö†Õ¡ÕµÕ¬Õ¡ÕµÕ«Õ¶ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£:"</string>
+ <string name="ext_media_unmountable_notification_title" product="nosdcard" msgid="2090046769532713563">"ÕŽÕ¶Õ¡Õ½Õ¾Õ¡Õ® USB Õ¯Ö€Õ«Õ¹"</string>
+ <string name="ext_media_unmountable_notification_title" product="default" msgid="6410723906019100189">"ÕŽÕ¶Õ¡Õ½Õ¾Õ¡Õ® SD Ö„Õ¡Ö€Õ¿"</string>
+ <string name="ext_media_unmountable_notification_message" product="nosdcard" msgid="1795917578395333280">"USB Õ¯Ö€Õ«Õ¹Õ¨ Õ¾Õ¶Õ¡Õ½Õ¾Õ¡Õ® Õ§: Õ“Õ¸Ö€Õ±Õ¥Ö„ Õ¾Õ¥Ö€Õ¡Ö†Õ¸Ö€Õ´Õ¡Õ¿Õ¡Õ¾Õ¸Ö€Õ¥Õ¬ Õ¡ÕµÕ¶:"</string>
+ <string name="ext_media_unmountable_notification_message" product="default" msgid="1753898567525568253">"SD Ö„Õ¡Ö€Õ¿Õ¨ Õ¾Õ¶Õ¡Õ½Õ¾Õ¡Õ® Õ§: Õ“Õ¸Ö€Õ±Õ¥Ö„ Õ¾Õ¥Ö€Õ¡Ö†Õ¸Ö€Õ´Õ¡Õ¿Õ¡Õ¾Õ¸Ö€Õ¥Õ¬ Õ¡ÕµÕ¶:"</string>
+ <string name="ext_media_badremoval_notification_title" product="nosdcard" msgid="1661683031330951073">"USB Õ¯Ö€Õ«Õ¹Õ¶ Õ¡Õ¶Õ½ÕºÕ¡Õ½Õ¥Õ¬Õ«Õ¸Ö€Õ¥Õ¶ Õ°Õ¥Õ¼Õ¡ÖÕ¾Õ¥Õ¬ Õ§"</string>
+ <string name="ext_media_badremoval_notification_title" product="default" msgid="6872152882604407837">"SD Ö„Õ¡Ö€Õ¿Õ¨ Õ¡Õ¶Õ½ÕºÕ¡Õ½Õ¥Õ¬Õ«Õ¸Ö€Õ¥Õ¶ Õ°Õ¥Õ¼Õ¡ÖÕ¾Õ¥Õ¬ Õ§"</string>
+ <string name="ext_media_badremoval_notification_message" product="nosdcard" msgid="4329848819865594241">"Ô±Õ¶Õ»Õ¡Õ¿Õ¥Õ¬ USB Õ¯Ö€Õ«Õ¹Õ¨ Õ°Õ¥Õ¼Õ¡ÖÕ¶Õ¥Õ¬Õ¸Ö‚Ö Õ¡Õ¼Õ¡Õ»` Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ« Õ¯Õ¸Ö€Õ½Õ¿Õ«Ö Õ­Õ¸Ö‚Õ½Õ¡ÖƒÕ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€:"</string>
+ <string name="ext_media_badremoval_notification_message" product="default" msgid="7260183293747448241">"Ô±Õ¶Õ»Õ¡Õ¿Õ¥Õ¬ SD Ö„Õ¡Ö€Õ¿Õ¨ Õ°Õ¥Õ¼Õ¡ÖÕ¶Õ¥Õ¬Õ¸Ö‚Ö Õ¡Õ¼Õ¡Õ»` Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ« Õ¯Õ¸Ö€Õ½Õ¿Õ«Ö Õ­Õ¸Ö‚Õ½Õ¡ÖƒÕ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€:"</string>
+ <string name="ext_media_safe_unmount_notification_title" product="nosdcard" msgid="3967973893270360230">"USB Õ¯Ö€Õ«Õ¹Õ¨ Õ¯Õ¡Ö€Õ¸Õ² Õ§ Õ¡Õ¶Õ¾Õ¿Õ¡Õ¶Õ£ Õ°Õ¥Õ¼Õ¡ÖÕ¾Õ¥Õ¬"</string>
+ <string name="ext_media_safe_unmount_notification_title" product="default" msgid="6729801130790616200">"SD Ö„Õ¡Ö€Õ¿Õ¶ Õ¡Õ¶Õ¾Õ¿Õ¡Õ¶Õ£ Õ§ Õ°Õ¥Õ¼Õ¡ÖÕ´Õ¡Õ¶ Õ°Õ¡Õ´Õ¡Ö€"</string>
+ <string name="ext_media_safe_unmount_notification_message" product="nosdcard" msgid="6142195361606493530">"Ô´Õ¸Ö‚Ö„ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Ö„ Õ¡ÕºÕ¡Õ°Õ¸Õ¾ Õ°Õ¥Õ¼Õ¡ÖÕ¶Õ¥Õ¬ USB Õ¯Ö€Õ«Õ¹Õ¨:"</string>
+ <string name="ext_media_safe_unmount_notification_message" product="default" msgid="568841278138377604">"Ô´Õ¸Ö‚Ö„ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Ö„ Õ¡Õ¶Õ¾Õ¿Õ¡Õ¶Õ£ Õ°Õ¥Õ¼Õ¡ÖÕ¶Õ¥Õ¬ SD Ö„Õ¡Ö€Õ¿Õ¨:"</string>
+ <string name="ext_media_nomedia_notification_title" product="nosdcard" msgid="4486377230140227651">"USB Õ¯Ö€Õ«Õ¹Õ¨ Õ°Õ¥Õ¼Õ¡ÖÕ¾Õ¡Õ® Õ§"</string>
+ <string name="ext_media_nomedia_notification_title" product="default" msgid="8902518030404381318">"SD Ö„Õ¡Ö€Õ¿Õ¨ Õ°Õ¥Õ¼Õ¡ÖÕ¾Õ¡Õ® Õ§"</string>
+ <string name="ext_media_nomedia_notification_message" product="nosdcard" msgid="6921126162580574143">"USB Õ¯Ö€Õ«Õ¹Õ¨ Õ°Õ¥Õ¼Õ¡ÖÕ¾Õ¡Õ® Õ§: Õ„Õ¿ÖÖ€Õ¥Ö„ Õ¶Õ¸Ö€ Õ¯Ö€Õ«Õ¹:"</string>
+ <string name="ext_media_nomedia_notification_message" product="default" msgid="3870120652983659641">"SD Ö„Õ¡Ö€Õ¿Õ¨ Õ°Õ¥Õ¼Õ¡ÖÕ¾Õ¡Õ® Õ§: ÕÕ¥Õ²Õ¡Õ¤Ö€Õ¥Ö„ Õ¶Õ¸Ö€Õ¨:"</string>
+ <string name="activity_list_empty" msgid="1675388330786841066">"Õ€Õ¡Õ´Õ¨Õ¶Õ¯Õ¶Õ¸Õ² Õ£Õ¸Ö€Õ®Õ¸Ö‚Õ¶Õ¥Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€ Õ¹Õ£Õ¿Õ¶Õ¾Õ¥ÖÕ«Õ¶:"</string>
+ <string name="permlab_pkgUsageStats" msgid="8787352074326748892">"Õ©Õ¡Ö€Õ´Õ¡ÖÕ¶Õ¥Õ¬ Õ¢Õ¡Õ²Õ¡Õ¤Ö€Õ«Õ¹Õ« Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ´Õ¡Õ¶ Õ¾Õ«Õ³Õ¡Õ¯Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨"</string>
+ <string name="permdesc_pkgUsageStats" msgid="1106612424254277630">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ ÖƒÕ¸ÖƒÕ¸Õ­Õ¥Õ¬ Õ°Õ¡Õ¾Õ¡Ö„Õ¡Õ£Ö€Õ¾Õ¡Õ® Õ¢Õ¡Õ²Õ¡Õ¤Ö€Õ«Õ¹Õ« Õ¾Õ«Õ³Õ¡Õ¯Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨: ÕÕ¸Õ¾Õ¸Ö€Õ¡Õ¯Õ¡Õ¶ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ« Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ´Õ¡Õ¶ Õ°Õ¡Õ´Õ¡Ö€ Õ¹Õ§:"</string>
+ <string name="permlab_copyProtectedData" msgid="4341036311211406692">"ÕºÕ¡Õ¿Õ³Õ¥Õ¶Õ¥Õ¬ Õ¢Õ¸Õ¾Õ¡Õ¶Õ¤Õ¡Õ¯Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨"</string>
+ <string name="permdesc_copyProtectedData" msgid="4390697124288317831">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡ÕµÖÕ¥Õ¬ Õ¬Õ¼Õ¥Õ¬ÕµÕ¡ÕµÕ¶ Õ¦Õ¥Õ¿Õ¥Õ²Õ¡Ö€Õ¡Õ¶Õ« Õ®Õ¡Õ¼Õ¡ÕµÕ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨` Õ¢Õ¸Õ¾Õ¡Õ¶Õ¤Õ¡Õ¯Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ ÕºÕ¡Õ¿Õ³Õ¥Õ¶Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€: ÕÕ¸Õ¾Õ¸Ö€Õ¡Õ¯Õ¡Õ¶ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ« Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ´Õ¡Õ¶ Õ°Õ¡Õ´Õ¡Ö€ Õ¹Õ§:"</string>
+ <string name="permlab_route_media_output" msgid="1642024455750414694">"ÔµÖ€Õ©Õ¸Ö‚Õ²Õ¥Õ¬ Õ´Õ¥Õ¤Õ«Õ¡ Õ¡Ö€Õ¿Õ¡Õ®Õ¸Ö‚Õ´Õ¨"</string>
+ <string name="permdesc_route_media_output" msgid="4932818749547244346">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ´Õ¥Õ¤Õ«Õ¡ Õ¡Ö€Õ¿Õ¡Õ®Õ¸Ö‚Õ´Õ¨ Õ¥Ö€Õ©Õ¸Ö‚Õ²Õ¥Õ¬ Õ¡ÕµÕ¬ Õ¡Ö€Õ¿Õ¡Ö„Õ«Õ¶ Õ½Õ¡Ö€Ö„Õ¥Ö€:"</string>
+ <string name="permlab_access_keyguard_secure_storage" msgid="7565552237977815047">"Õ„Õ¸Ö‚Õ¿Ö„ Õ£Õ¸Ö€Õ®Õ¥Õ¬ Õ½Õ¿Õ¥Õ²Õ¶Õ¡Õ¯Õ¸Õ²ÕºÕ¥Ö„Õ¸Õ¾ ÕºÕ¡Õ·Õ¿ÕºÕ¡Õ¶Õ¾Õ¡Õ® ÕºÕ¡Õ°Õ¸Ö"</string>
+ <string name="permdesc_access_keyguard_secure_storage" msgid="5866245484303285762">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ´Õ¸Ö‚Õ¿Ö„ Õ£Õ¸Ö€Õ®Õ¥Õ¬ Õ½Õ¿Õ¥Õ²Õ¶Õ¡Õ¯Õ¸Õ²ÕºÕ¥Ö„Õ¸Õ¾ ÕºÕ¡Õ·Õ¿ÕºÕ¡Õ¶Õ¾Õ¡Õ® ÕºÕ¡Õ°Õ¸Ö:"</string>
+ <string name="permlab_control_keyguard" msgid="172195184207828387">"Ô¿Õ¡Õ¼Õ¡Õ¾Õ¡Ö€Õ¥Õ¬ Õ½Õ¿Õ¥Õ²Õ¶Õ¡Õ¯Õ¸Õ²ÕºÕ¥Ö„Õ« ÖÕ¸Ö‚ÖÕ¡Õ¤Ö€Õ¸Ö‚Õ´Õ¨ Ö‡ Õ©Õ¡Ö„ÖÕ¶Õ¸Ö‚Õ´Õ¨"</string>
+ <string name="permdesc_control_keyguard" msgid="3043732290518629061">"Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ¯Õ¡Õ¼Õ¡Õ¾Õ¡Ö€Õ¥Õ¬ Õ½Õ¿Õ¥Õ²Õ¶Õ¡Õ·Õ¡Ö€Õ« ÕºÕ¡Õ·Õ¿ÕºÕ¡Õ¶Õ«Õ¹Õ¨:"</string>
+ <string name="tutorial_double_tap_to_zoom_message_short" msgid="4070433208160063538">"Õ€ÕºÕ¥Ö„ Õ¥Ö€Õ¯Õ¸Ö‚ Õ¡Õ¶Õ£Õ¡Õ´` Õ¤Õ«Õ¿Õ¡ÖƒÕ¸Õ­Õ´Õ¡Õ¶ Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ´Õ¡Õ¶ Õ°Õ¡Õ´Õ¡Ö€"</string>
+ <string name="gadget_host_error_inflating" msgid="4882004314906466162">"Õ‰Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Ö Õ¾Õ«Õ»Õ¥Õ© Õ¡Õ¾Õ¥Õ¬Õ¡ÖÕ¶Õ¥Õ¬:"</string>
+ <string name="ime_action_go" msgid="8320845651737369027">"Ô±Õ¼Õ¡Õ»"</string>
+ <string name="ime_action_search" msgid="658110271822807811">"ÕˆÖ€Õ¸Õ¶Õ¥Õ¬"</string>
+ <string name="ime_action_send" msgid="2316166556349314424">"ÕˆÖ‚Õ²Õ¡Ö€Õ¯Õ¥Õ¬"</string>
+ <string name="ime_action_next" msgid="3138843904009813834">"Õ€Õ¡Õ»Õ¸Ö€Õ¤Õ¨"</string>
+ <string name="ime_action_done" msgid="8971516117910934605">"Ô¿Õ¡Õ¿Õ¡Ö€Õ¾Õ¡Õ® Õ§"</string>
+ <string name="ime_action_previous" msgid="1443550039250105948">"Õ†Õ¡Õ­Õ¸Ö€Õ¤"</string>
+ <string name="ime_action_default" msgid="2840921885558045721">"Ô¿Õ¡Õ¿Õ¡Ö€Õ¥Õ¬"</string>
+ <string name="dial_number_using" msgid="5789176425167573586">"Õ€Õ¡Õ¾Õ¡Ö„Õ¥Õ¬ Õ°Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ¡Õ°Õ¡Õ´Õ¡Ö€Õ¨`\nÖ…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¥Õ¬Õ¸Õ¾ <xliff:g id="NUMBER">%s</xliff:g>-Õ¨"</string>
+ <string name="create_contact_using" msgid="4947405226788104538">"ÕÕ¿Õ¥Õ²Õ®Õ¥Õ¬ Õ¯Õ¸Õ¶Õ¿Õ¡Õ¯Õ¿`\nÖ…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¥Õ¬Õ¸Õ¾ <xliff:g id="NUMBER">%s</xliff:g>-Õ¨"</string>
+ <string name="grant_credentials_permission_message_header" msgid="2106103817937859662">"Õ€Õ¥Õ¿Ö‡ÕµÕ¡Õ¬ Õ´Õ¥Õ¯ Õ¯Õ¡Õ´ Õ¡Õ¾Õ¥Õ¬ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€ մուտքի թույլտվության Õ°Õ¡Ö€ÖÕ¸Ö‚Õ´ Õ¥Õ¶ Õ¡Õ¶Õ¸Ö‚Õ´` այժմ Ö‡ Õ°Õ¥Õ¿Õ¡Õ£Õ¡ÕµÕ¸Ö‚Õ´ Õ±Õ¥Ö€ Õ°Õ¡Õ·Õ¾Õ«Õ¶ Õ´Õ¸Ö‚Õ¿Ö„ Õ¸Ö‚Õ¶Õ¥Õ¶Õ¡Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€:"</string>
+ <string name="grant_credentials_permission_message_footer" msgid="3125211343379376561">"Õ‘Õ¡Õ¶Õ¯Õ¡Õ¶Õ¸Ö‚ÕžÕ´ Õ¥Ö„ Õ©Õ¸Ö‚ÕµÕ¬Õ¡Õ¿Ö€Õ¥Õ¬ Õ¡ÕµÕ½ Õ°Õ¡Ö€ÖÕ¸Ö‚Õ´Õ¨:"</string>
+ <string name="grant_permissions_header_text" msgid="6874497408201826708">"Õ„Õ¸Ö‚Õ¿Ö„Õ« Õ°Õ¡Ö€ÖÕ¸Ö‚Õ´"</string>
+ <string name="allow" msgid="7225948811296386551">"Ô¹Õ¸Ö‚ÕµÕ¬Õ¡Õ¿Ö€Õ¥Õ¬"</string>
+ <string name="deny" msgid="2081879885755434506">"Õ„Õ¥Ö€ÕªÕ¥Õ¬"</string>
+ <string name="permission_request_notification_title" msgid="6486759795926237907">"Ô¹Õ¸Ö‚ÕµÕ¬Õ¿Õ¾Õ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ°Õ¡Ö€ÖÕ¸Ö‚Õ´ Õ§ Õ¡Ö€Õ¾Õ¡Õ®"</string>
+ <string name="permission_request_notification_with_subtitle" msgid="8530393139639560189">"Ô¹Õ¸Ö‚ÕµÕ¬Õ¿Õ¾Õ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ°Õ¡Ö€ÖÕ¸Ö‚Õ´ Õ§ Õ¡Ö€Õ¾Õ¡Õ®\n<xliff:g id="ACCOUNT">%s</xliff:g> Õ°Õ¡Õ·Õ¾Õ« Õ°Õ¡Õ´Õ¡Ö€:"</string>
+ <string name="input_method_binding_label" msgid="1283557179944992649">"Õ†Õ¥Ö€Õ¡Õ®Õ´Õ¡Õ¶ Õ¥Õ²Õ¡Õ¶Õ¡Õ¯Õ¨"</string>
+ <string name="sync_binding_label" msgid="3687969138375092423">"Õ€Õ¡Õ´Õ¡ÕªÕ¡Õ´Õ¥Õ¬"</string>
+ <string name="accessibility_binding_label" msgid="4148120742096474641">"Õ„Õ¡Õ¿Õ¹Õ¥Õ¬Õ«Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨"</string>
+ <string name="wallpaper_binding_label" msgid="1240087844304687662">"ÕŠÕ¡Õ½Õ¿Õ¡Õ¼"</string>
+ <string name="chooser_wallpaper" msgid="7873476199295190279">"Õ“Õ¸Õ­Õ¥Õ¬ ÕºÕ¡Õ½Õ¿Õ¡Õ¼Õ¨"</string>
+ <string name="notification_listener_binding_label" msgid="2014162835481906429">"Ô¾Õ¡Õ¶Õ¸Ö‚ÖÕ´Õ¡Õ¶ Õ¸Ö‚Õ¶Õ¯Õ¶Õ¤Õ«Ö€"</string>
+ <string name="vpn_title" msgid="19615213552042827">"VPN-Õ¨ Õ¡Õ¯Õ¿Õ«Õ¾Õ¡ÖÕ¾Õ¡Õ® Õ§"</string>
+ <string name="vpn_title_long" msgid="6400714798049252294">"VPN-Õ¶ Õ¡Õ¯Õ¿Õ«Õ¾Õ¡ÖÕ¾Õ¡Õ® Õ§ <xliff:g id="APP">%s</xliff:g>-Õ« Õ¯Õ¸Õ²Õ´Õ«Ö"</string>
+ <string name="vpn_text" msgid="3011306607126450322">"Õ€ÕºÕ¥Ö„` ÖÕ¡Õ¶ÖÕ« Õ¯Õ¡Õ¼Õ¡Õ¾Õ¡Ö€Õ´Õ¡Õ¶ Õ°Õ¡Õ´Õ¡Ö€:"</string>
+ <string name="vpn_text_long" msgid="6407351006249174473">"Õ„Õ«Õ¡ÖÕ¾Õ¡Õ® Õ§ <xliff:g id="SESSION">%s</xliff:g>-Õ«Õ¶: Õ€ÕºÕ¥Ö„` ÖÕ¡Õ¶ÖÕ¨ Õ¯Õ¡Õ¼Õ¡Õ¾Õ¡Ö€Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€:"</string>
+ <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Õ„Õ«Õ·Õ¿-Õ´Õ«Õ¡ÖÕ¾Õ¡Õ® VPN-Õ¨ Õ¯Õ¡ÕºÕ¾Õ¸Ö‚Õ´ Õ§..."</string>
+ <string name="vpn_lockdown_connected" msgid="8202679674819213931">"Õ„Õ«Õ·Õ¿-Õ¡Õ¼ÖÕ¡Õ¶Ö VPN-Õ¨ Õ¯Õ¡ÕºÕ¡Õ¯ÖÕ¾Õ¡Õ® Õ§"</string>
+ <string name="vpn_lockdown_error" msgid="6009249814034708175">"VPN Õ½Õ­Õ¡Õ¬Õ¨ Õ´Õ«Õ·Õ¿ Õ´Õ«Õ¡ÖÕ¾Õ¡Õ®"</string>
+ <string name="vpn_lockdown_config" msgid="6415899150671537970">"Õ€ÕºÕ¥Ö„ Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€"</string>
+ <string name="upload_file" msgid="2897957172366730416">"Ô¸Õ¶Õ¿Ö€Õ¥Õ¬ Ö†Õ¡ÕµÕ¬Õ¨"</string>
+ <string name="no_file_chosen" msgid="6363648562170759465">"ÕˆÕ¹ Õ´Õ« Ö†Õ¡ÕµÕ¬ Õ¹Õ« Õ¨Õ¶Õ¿Ö€Õ¾Õ¡Õ®"</string>
+ <string name="reset" msgid="2448168080964209908">"ÕŽÕ¥Ö€Õ¡Õ¯Õ¡ÕµÕ¥Õ¬"</string>
+ <string name="submit" msgid="1602335572089911941">"ÕˆÖ‚Õ²Õ¡Ö€Õ¯Õ¥Õ¬"</string>
+ <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Õ„Õ¥Ö„Õ¥Õ¶Õ¡ÕµÕ« Õ¼Õ¥ÕªÕ«Õ´Õ¨ Õ´Õ«Õ¡ÖÕ¾Õ¡Õ® Õ§"</string>
+ <string name="car_mode_disable_notification_message" msgid="8035230537563503262">"Õ€ÕºÕ¥Ö„` Õ´Õ¥Ö„Õ¥Õ¶Õ¡ÕµÕ« Õ¼Õ¥ÕªÕ«Õ´Õ«Ö Õ¤Õ¸Ö‚Ö€Õ½ Õ£Õ¡Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€:"</string>
+ <string name="tethered_notification_title" msgid="3146694234398202601">"Õ„Õ¸Ö‚Õ¿Ö„Õ¨ Õ¯Õ¡Õ´ Õ©Õ¥Õª Õ¯Õ¥Õ¿Õ¨ Õ¡Õ¯Õ¿Õ«Õ¾ Õ§"</string>
+ <string name="tethered_notification_message" msgid="6857031760103062982">"Õ€ÕºÕ¥Ö„ Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€:"</string>
+ <string name="back_button_label" msgid="2300470004503343439">"Õ€Õ¥Õ¿"</string>
+ <string name="next_button_label" msgid="1080555104677992408">"Õ€Õ¡Õ»Õ¸Ö€Õ¤Õ¨"</string>
+ <string name="skip_button_label" msgid="1275362299471631819">"Ô²Õ¡Ö Õ©Õ¸Õ²Õ¶Õ¥Õ¬"</string>
+ <string name="throttle_warning_notification_title" msgid="4890894267454867276">"Õ‡Õ¡Ö€ÕªÕ¡Õ¯Õ¡Õ¶ Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ« Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ´Õ¡Õ¶ Õ¢Õ¡Ö€Õ±Ö€ Õ´Õ¡Õ¯Õ¡Ö€Õ¤Õ¡Õ¯"</string>
+ <string name="throttle_warning_notification_message" msgid="3340822228599337743">"Õ€ÕºÕ¥Ö„` Õ·Õ¡Ö€ÕªÕ¡Õ¯Õ¡Õ¶ Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ« Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ´Õ¡Õ¶ Õ´Õ¡Õ½Õ«Õ¶ Õ¡Õ¾Õ¥Õ¬Õ«Õ¶ Õ«Õ´Õ¡Õ¶Õ¡Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€:"</string>
+ <string name="throttled_notification_title" msgid="6269541897729781332">"Õ‡Õ¡Ö€ÕªÕ¡Õ¯Õ¡Õ¶ Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ« Õ½Õ¡Õ°Õ´Õ¡Õ¶Õ¨ Õ£Õ¥Ö€Õ¡Õ¦Õ¡Õ¶ÖÕ¾Õ¡Õ® Õ§"</string>
+ <string name="throttled_notification_message" msgid="5443457321354907181">"Հպել` շարժական տվյալների օգտագործման մասին ավելին իմանալու համար:"</string>
+ <string name="no_matches" msgid="8129421908915840737">"Õ€Õ¡Õ´Õ¨Õ¶Õ¯Õ¶Õ¸Ö‚Õ´ Õ¹Õ¯Õ¡"</string>
+ <string name="find_on_page" msgid="1946799233822820384">"Ô³Õ¿Õ¥Ö„ Õ§Õ»Õ¸Ö‚Õ´"</string>
+ <plurals name="matches_found">
+ <item quantity="one" msgid="8167147081136579439">"1 Õ°Õ¡Õ´Õ¨Õ¶Õ¯Õ¶Õ¸Ö‚Õ´"</item>
+ <item quantity="other" msgid="4641872797067609177">"<xliff:g id="TOTAL">%d</xliff:g>-Õ«Ö <xliff:g id="INDEX">%d</xliff:g>-Õ¨"</item>
+ </plurals>
+ <string name="action_mode_done" msgid="7217581640461922289">"Ô¿Õ¡Õ¿Õ¡Ö€Õ¾Õ¡Õ® Õ§"</string>
+ <string name="progress_unmounting" product="nosdcard" msgid="3923810448507612746">"Ô±Õ¶Õ»Õ¡Õ¿Õ¾Õ¸Ö‚Õ´ Õ§ USB Õ¯Ö€Õ«Õ¹Õ¨..."</string>
+ <string name="progress_unmounting" product="default" msgid="1327894998409537190">"Ô±Õ¶Õ»Õ¡Õ¿Õ¸Ö‚Õ´ Õ§ SD Ö„Õ¡Ö€Õ¿Õ¨..."</string>
+ <string name="progress_erasing" product="nosdcard" msgid="4521573321524340058">"Õ‹Õ¶Õ»Õ¸Ö‚Õ´ Õ§ USB Õ¯Ö€Õ«Õ¹Õ¨..."</string>
+ <string name="progress_erasing" product="default" msgid="6596988875507043042">"Õ‹Õ¶Õ»Õ¸Ö‚Õ´ Õ§ SD Ö„Õ¡Ö€Õ¿Õ¨..."</string>
+ <string name="format_error" product="nosdcard" msgid="6299769563624776948">"Õ‰Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Ö Õ»Õ¶Õ»Õ¥Õ¬ USB Õ¯Ö€Õ«Õ¹Õ¨:"</string>
+ <string name="format_error" product="default" msgid="7315248696644510935">"SD Ö„Õ¡Ö€Õ¿Õ¨ Õ¹Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Ö Õ»Õ¶Õ»Õ¥Õ¬:"</string>
+ <string name="media_bad_removal" msgid="7960864061016603281">"SD Ö„Õ¡Ö€Õ¿Õ¨ Õ°Õ¥Õ¼Õ¡ÖÕ¾Õ¥Õ¬ Õ§ Õ¶Õ¡Õ­Ö„Õ¡Õ¶ Õ¡Õ¶Õ»Õ¡Õ¿Õ¥Õ¬Õ¨:"</string>
+ <string name="media_checking" product="nosdcard" msgid="418188720009569693">"USB Õ¯Ö€Õ«Õ¹Õ¶ Õ¡ÕµÕªÕ´ Õ½Õ¿Õ¸Ö‚Õ£Õ¾Õ¸Ö‚Õ´ Õ§:"</string>
+ <string name="media_checking" product="default" msgid="7334762503904827481">"SD Ö„Õ¡Ö€Õ¿Õ¨ Õ¡ÕµÕªÕ´ Õ½Õ¿Õ¸Ö‚Õ£Õ¾Õ¸Ö‚Õ´ Õ§:"</string>
+ <string name="media_removed" msgid="7001526905057952097">"SD Ö„Õ¡Ö€Õ¿Õ¨ Õ°Õ¥Õ¼Õ¡ÖÕ¾Õ¥Õ¬ Õ§:"</string>
+ <string name="media_shared" product="nosdcard" msgid="5830814349250834225">"USB Õ¯Ö€Õ«Õ¹Õ¶ Õ¡ÕµÕªÕ´ Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¾Õ¸Ö‚Õ´ Õ§ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ¹Õ« Õ¯Õ¸Õ²Õ´Õ«Ö:"</string>
+ <string name="media_shared" product="default" msgid="5706130568133540435">"SD Ö„Õ¡Ö€Õ¿Õ¶ Õ¡ÕµÕªÕ´ Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¾Õ¸Ö‚Õ´ Õ§ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ¹Õ« Õ¯Õ¸Õ²Õ´Õ«Ö:"</string>
+ <string name="media_unknown_state" msgid="729192782197290385">"Ô±Ö€Õ¿Õ¡Ö„Õ«Õ¶ Õ´Õ¥Õ¤Õ«Õ¡Õ¶ Õ¡Õ¶Õ°Õ¡ÕµÕ¿ Õ§ Õ¾Õ«Õ³Õ¡Õ¯Õ¸Ö‚Õ´ Õ§:"</string>
+ <string name="share" msgid="1778686618230011964">"ÕÕ¡Ö€Õ¡Õ®Õ¥Õ¬"</string>
+ <string name="find" msgid="4808270900322985960">"Ô³Õ¿Õ¶Õ¥Õ¬"</string>
+ <string name="websearch" msgid="4337157977400211589">"ÕŽÕ¥Õ¢Õ« Õ¸Ö€Õ¸Õ¶Õ¸Ö‚Õ´"</string>
+ <string name="find_next" msgid="5742124618942193978">"Ô³Õ¿Õ¶Õ¥Õ¬ Õ°Õ¡Õ»Õ¸Ö€Õ¤Õ¨"</string>
+ <string name="find_previous" msgid="2196723669388360506">"Ô³Õ¿Õ¶Õ¥Õ¬ Õ¶Õ¡Õ­Õ¸Ö€Õ¤Õ¨"</string>
+ <string name="gpsNotifTicker" msgid="5622683912616496172">"ÕÕ¥Õ²Õ¡Õ¤Ö€Õ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ°Õ¡Ö€ÖÕ¸Ö‚Õ´ <xliff:g id="NAME">%s</xliff:g>-Õ«Ö"</string>
+ <string name="gpsNotifTitle" msgid="5446858717157416839">"ÕÕ¥Õ²Õ¡Õ¤Ö€Õ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ°Õ¡Ö€ÖÕ¸Ö‚Õ´"</string>
+ <string name="gpsNotifMessage" msgid="1374718023224000702">"<xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)-Õ« Õ°Õ¡Ö€ÖÕ´Õ¡Õ´Õ¢"</string>
+ <string name="gpsVerifYes" msgid="2346566072867213563">"Ô±ÕµÕ¸"</string>
+ <string name="gpsVerifNo" msgid="1146564937346454865">"ÕˆÕ¹"</string>
+ <string name="sync_too_many_deletes" msgid="5296321850662746890">"Õ‹Õ¶Õ»Õ¥Õ¬Õ¸Ö‚ Õ½Õ¡Õ°Õ´Õ¡Õ¶Õ¨ Õ£Õ¥Ö€Õ¡Õ¦Õ¡Õ¶ÖÕ¾Õ¥Õ¬ Õ§"</string>
+ <string name="sync_too_many_deletes_desc" msgid="496551671008694245">"<xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> Õ»Õ¶Õ»Õ¾Õ¡Õ® Õ¿Õ¡Ö€Ö€ Õ¯Õ¡ <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>-Õ« Õ°Õ¡Õ´Õ¡Ö€, <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g>-Õ« Õ°Õ¡Õ·Õ«Õ¾: Ô»ÕžÕ¶Õ¹ Õ¥Ö„ ÖÕ¡Õ¶Õ¯Õ¡Õ¶Õ¸Ö‚Õ´ Õ¡Õ¶Õ¥Õ¬:"</string>
+ <string name="sync_really_delete" msgid="2572600103122596243">"Õ‹Õ¶Õ»Õ¥Õ¬ Õ¿Õ¡Ö€Ö€Õ¥Ö€Õ¨"</string>
+ <string name="sync_undo_deletes" msgid="2941317360600338602">"Õ€Õ¥Õ¿Õ¡Ö€Õ¯Õ¥Õ¬ Õ»Õ¶Õ»Õ¸Ö‚Õ´Õ¶Õ¥Ö€Õ¨"</string>
+ <string name="sync_do_nothing" msgid="3743764740430821845">"Ô±Õ¼Õ¡ÕµÕªÕ´ Õ¸Õ¹Õ«Õ¶Õ¹ Õ¹Õ¡Õ¶Õ¥Ö„"</string>
+ <string name="choose_account_label" msgid="5655203089746423927">"Ô¸Õ¶Õ¿Ö€Õ¥Õ¬ Õ°Õ¡Õ·Õ«Õ¾Õ¨"</string>
+ <string name="add_account_label" msgid="2935267344849993553">"Ô±Õ¾Õ¥Õ¬Õ¡ÖÕ¶Õ¥Õ¬ Õ°Õ¡Õ·Õ«Õ¾"</string>
+ <string name="add_account_button_label" msgid="3611982894853435874">"Ô±Õ¾Õ¥Õ¬Õ¡ÖÕ¶Õ¥Õ¬ Õ°Õ¡Õ·Õ«Õ¾"</string>
+ <string name="number_picker_increment_button" msgid="2412072272832284313">"Ô±Õ¾Õ¥Õ¬Õ¡ÖÕ¶Õ¥Õ¬"</string>
+ <string name="number_picker_decrement_button" msgid="476050778386779067">"Õ†Õ¾Õ¡Õ¦Õ¥ÖÕ¶Õ¥Õ¬"</string>
+ <string name="number_picker_increment_scroll_mode" msgid="3073101067441638428">"<xliff:g id="VALUE">%s</xliff:g> Õ°ÕºÕ¥Ö„ Ö‡ ÕºÕ¡Õ°Õ¥Ö„:"</string>
+ <string name="number_picker_increment_scroll_action" msgid="9101473045891835490">"ÕÕ¡Õ°Õ¥ÖÖ€Õ¥Ö„ Õ¾Õ¥Ö€Ö‡` Õ¡Õ¾Õ¥Õ¬Õ¡ÖÕ¶Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€, Ö‡ Õ¶Õ¥Ö€Ö„Ö‡` Õ¶Õ¾Õ¡Õ¦Õ¥ÖÕ¶Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€:"</string>
+ <string name="time_picker_increment_minute_button" msgid="8865885114028614321">"Ô±Õ³Õ¥ÖÕ¶Õ¥Õ¬ Ö€Õ¸ÕºÕ¥Õ¶"</string>
+ <string name="time_picker_decrement_minute_button" msgid="6246834937080684791">"Õ†Õ¾Õ¡Õ¦Õ¥ÖÕ¶Õ¥Õ¬ Ö€Õ¸ÕºÕ¥Õ¶"</string>
+ <string name="time_picker_increment_hour_button" msgid="3652056055810223139">"Ô±Õ³Õ¥ÖÕ¶Õ¥Õ¬ ÕªÕ¡Õ´Õ¨"</string>
+ <string name="time_picker_decrement_hour_button" msgid="1377479863429214792">"Õ†Õ¾Õ¡Õ¦Õ¥ÖÕ¶Õ¥Õ¬ ÕªÕ¡Õ´Õ¨"</string>
+ <string name="time_picker_increment_set_pm_button" msgid="4147590696151230863">"Ô´Õ¶Õ¥Õ¬ PM"</string>
+ <string name="time_picker_decrement_set_am_button" msgid="8302140353539486752">"Ô´Õ¶Õ¥Õ¬ AM"</string>
+ <string name="date_picker_increment_month_button" msgid="5369998479067934110">"Ô±Õ³Õ¥ÖÕ¶Õ¥Õ¬ Õ¡Õ´Õ«Õ½Õ¨"</string>
+ <string name="date_picker_decrement_month_button" msgid="1832698995541726019">"Õ†Õ¾Õ¡Õ¦Õ¥ÖÕ¶Õ¥Õ¬ Õ¡Õ´Õ«Õ½Õ¨"</string>
+ <string name="date_picker_increment_day_button" msgid="7130465412308173903">"Ô±Õ³Õ¥ÖÕ¶Õ¥Õ¬ Ö…Ö€Õ¨"</string>
+ <string name="date_picker_decrement_day_button" msgid="4131881521818750031">"Õ†Õ¾Õ¡Õ¦Õ¥ÖÕ¶Õ¥Õ¬ Ö…Ö€Õ¨"</string>
+ <string name="date_picker_increment_year_button" msgid="6318697384310808899">"Ô±Õ³Õ¥ÖÕ¶Õ¥Õ¬ Õ¿Õ¡Ö€Õ«Õ¶"</string>
+ <string name="date_picker_decrement_year_button" msgid="4482021813491121717">"Õ†Õ¾Õ¡Õ¦Õ¥ÖÕ¶Õ¥Õ¬ Õ¿Õ¡Ö€Õ«Õ¶"</string>
+ <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
+ <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"Õ‰Õ¥Õ²Õ¡Ö€Õ¯Õ¥Õ¬"</string>
+ <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Õ‹Õ¶Õ»Õ¥Õ¬"</string>
+ <string name="keyboardview_keycode_done" msgid="1992571118466679775">"Ô¿Õ¡Õ¿Õ¡Ö€Õ¾Õ¡Õ® Õ§"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Ռեժիմի փոփոխում"</string>
+ <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
+ <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Õ„Õ¸Ö‚Õ¿Ö„"</string>
+ <string name="activitychooserview_choose_application" msgid="2125168057199941199">"Ô¸Õ¶Õ¿Ö€Õ¥Õ¬ Õ®Ö€Õ¡Õ£Õ«Ö€"</string>
+ <string name="shareactionprovider_share_with" msgid="806688056141131819">"ÕÕ¡Ö€Õ¡Õ®Õ¥Õ¬"</string>
+ <string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Õ€Õ¡Õ´Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¥Õ¬ <xliff:g id="APPLICATION_NAME">%s</xliff:g>-Õ« Õ°Õ¥Õ¿"</string>
+ <string name="content_description_sliding_handle" msgid="415975056159262248">"ÕÕ¡Õ°Õ¸Õ² Õ¢Õ¼Õ¶Õ¡Õ¯: Հպել &amp; ÕºÕ¡Õ°Õ¥Õ¬:"</string>
+ <string name="description_direction_up" msgid="7169032478259485180">"ÕÕ¡Õ°Õ¥ÖÖ€Õ¥Ö„ Õ¾Õ¥Ö€Ö‡ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>-Õ« Õ°Õ¡Õ´Õ¡Ö€:"</string>
+ <string name="description_direction_down" msgid="5087739728639014595">"ÕÕ¡Õ°Õ¥ÖÖ€Õ¥Ö„ ÖÕ¡Õ® <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>-Õ« Õ°Õ¡Õ´Õ¡Ö€:"</string>
+ <string name="description_direction_left" msgid="7207478719805562165">"ÕÕ¡Õ°Õ¥ÖÖ€Õ¥Ö„ Õ±Õ¡Õ­` <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>-Õ« Õ°Õ¡Õ´Õ¡Ö€:"</string>
+ <string name="description_direction_right" msgid="8034433242579600980">"ÕÕ¡Õ°Õ¥ÖÖ€Õ¥Ö„ Õ¡Õ»` <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>-Õ« Õ°Õ¡Õ´Õ¡Ö€:"</string>
+ <string name="description_target_unlock" msgid="2228524900439801453">"Ô±ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ¥Õ¬"</string>
+ <string name="description_target_camera" msgid="969071997552486814">"Õ–Õ¸Õ¿Õ¸Õ­ÖÕ«Õ¯"</string>
+ <string name="description_target_silent" msgid="893551287746522182">"Ô¼Õ¸Ö‚Õ¼"</string>
+ <string name="description_target_soundon" msgid="30052466675500172">"ÕÕ¡ÕµÕ¶Õ¨ Õ´Õ«Õ¡ÖÕ¶Õ¥Õ¬"</string>
+ <string name="description_target_search" msgid="3091587249776033139">"ÕˆÖ€Õ¸Õ¶Õ¥Õ¬"</string>
+ <string name="description_target_unlock_tablet" msgid="3833195335629795055">"ÕÕ¡Õ°Õ¥ÖÖ€Õ¥Ö„` Õ¡ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€:"</string>
+ <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Õ„Õ«Õ¡ÖÖ€Õ¥Ö„ Õ¡Õ¯Õ¡Õ¶Õ»Õ¡Õ¯Õ¡Õ¬Õ¶Õ¥Ö€Õ¨` Õ¡Ö€Õ¿Õ¡Õ½Õ¡Õ¶Õ¾Õ¸Õ² Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ¨ Õ¬Õ½Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€:"</string>
+ <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Ô¿Õ¥Õ¿:"</string>
+ <string name="action_bar_home_description" msgid="5293600496601490216">"ÕˆÖ‚Õ²Õ²Õ¾Õ¥Õ¬ Õ¿Õ¸Ö‚Õ¶"</string>
+ <string name="action_bar_up_description" msgid="2237496562952152589">"ÕˆÖ‚Õ²Õ²Õ¾Õ¥Õ¬ Õ¾Õ¥Ö€Ö‡"</string>
+ <string name="action_menu_overflow_description" msgid="2295659037509008453">"Ô±Õ¾Õ¥Õ¬Õ« Õ·Õ¡Õ¿ Õ¨Õ¶Õ¿Ö€Õ¡Õ¶Ö„Õ¶Õ¥Ö€"</string>
+ <string name="action_bar_home_description_format" msgid="7965984360903693903">"%1$s, %2$s"</string>
+ <string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string>
+ <string name="storage_internal" msgid="4891916833657929263">"Õ†Õ¥Ö€Ö„Õ«Õ¶ ÕºÕ¡Õ°Õ¸Ö"</string>
+ <string name="storage_sd_card" msgid="3282948861378286745">"SD Ö„Õ¡Ö€Õ¿"</string>
+ <string name="storage_usb" msgid="3017954059538517278">"USB Õ¯Ö€Õ«Õ¹"</string>
+ <string name="extract_edit_menu_button" msgid="8940478730496610137">"Ô½Õ´Õ¢Õ¡Õ£Ö€Õ¥Õ¬"</string>
+ <string name="data_usage_warning_title" msgid="1955638862122232342">"ÕÕ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ« Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ´Õ¡Õ¶ Õ¶Õ¡Õ­Õ¡Õ¦Õ£Õ¸Ö‚Õ·Õ¡ÖÕ¸Ö‚Õ´"</string>
+ <string name="data_usage_warning_body" msgid="2814673551471969954">"Õ€ÕºÕ¥Ö„` Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¸Ö‚Õ´Õ¨ Ö‡ Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´Õ¶Õ¥Ö€Õ¨ Õ¿Õ¥Õ½Õ¶Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€:"</string>
+ <string name="data_usage_3g_limit_title" msgid="7093334419518706686">"2G-3G Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨ Õ¯Õ¡Õ½Õ¥ÖÕ¾Õ¡Õ® Õ¥Õ¶"</string>
+ <string name="data_usage_4g_limit_title" msgid="7636489436819470761">"4G Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨ Õ¡Õ¶Õ»Õ¡Õ¿Õ¾Õ¡Õ® Õ¥Õ¶"</string>
+ <string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"Õ‡Õ¡Ö€ÕªÕ¡Õ¯Õ¡Õ¶ Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨ Õ¯Õ¡Õ½Õ¥ÖÕ¾Õ¡Õ® Õ¥Õ¶"</string>
+ <string name="data_usage_wifi_limit_title" msgid="8992154736441284865">"Wi-Fi Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨ Õ¡Õ¶Õ»Õ¡Õ¿Õ¾Õ¡Õ® Õ¥Õ¶"</string>
+ <string name="data_usage_limit_body" msgid="3317964706973601386">"Õ€ÕºÕ¥Ö„` Õ´Õ«Õ¡ÖÕ¶Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€:"</string>
+ <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"2G-3G Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ« Õ½Õ¡Õ°Õ´Õ¡Õ¶Õ¨ Õ£Õ¥Ö€Õ¡Õ¦Õ¡Õ¶ÖÕ¾Õ¡Õ® Õ§"</string>
+ <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"4G Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ« Õ½Õ¡Õ°Õ´Õ¡Õ¶Õ¨ Õ£Õ¥Ö€Õ¡Õ¦Õ¡Õ¶ÖÕ¾Õ¥Õ¬ Õ§"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"Õ‡Õ¡Ö€ÕªÕ¡Õ¯Õ¡Õ¶ Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ« Õ½Õ¡Õ°Õ´Õ¡Õ¶Õ¨ Õ£Õ¥Ö€Õ¡Õ¦Õ¡Õ¶ÖÕ¾Õ¥Õ¬ Õ§"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"Wi-Fi Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ« Õ½Õ¡Õ°Õ´Õ¡Õ¶Õ¨ Õ£Õ¥Ö€Õ¡Õ¦Õ¡Õ¶ÖÕ¾Õ¥Õ¬ Õ§"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"<xliff:g id="SIZE">%s</xliff:g>-Õ¨ Õ£Õ¥Ö€Õ¡Õ¦Õ¡Õ¶ÖÕ¸Ö‚Õ´ Õ§ Õ¶Õ·Õ¾Õ¡Õ® Õ½Õ¡Õ°Õ´Õ¡Õ¶Õ¡Õ¹Õ¡ÖƒÕ¨:"</string>
+ <string name="data_usage_restricted_title" msgid="5965157361036321914">"Õ€Õ¥Õ¿Õ¶Õ¡Õ·Õ¥Ö€Õ¿Õ¡ÕµÕ«Õ¶ Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨ Õ½Õ¡Õ°Õ´Õ¡Õ¶Õ¡ÖƒÕ¡Õ¯ Õ¥Õ¶"</string>
+ <string name="data_usage_restricted_body" msgid="6741521330997452990">"Õ€ÕºÕ¥Ö„` Õ½Õ¡Õ°Õ´Õ¡Õ¶Õ¡ÖƒÕ¡Õ¯Õ¸Ö‚Õ´Õ¨ Õ°Õ¥Õ¼Õ¡ÖÕ¶Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€:"</string>
+ <string name="ssl_certificate" msgid="6510040486049237639">"Ô±Õ¶Õ¾Õ¿Õ¡Õ¶Õ£Õ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ¾Õ¯Õ¡ÕµÕ¡Õ¯Õ¡Õ¶"</string>
+ <string name="ssl_certificate_is_valid" msgid="6825263250774569373">"Ô±ÕµÕ½ Õ¾Õ¯Õ¡ÕµÕ¡Õ¯Õ¡Õ¶Õ¨ Õ¾Õ¡Õ¾Õ¥Ö€ Õ§:"</string>
+ <string name="issued_to" msgid="454239480274921032">"Ô¹Õ¸Õ²Õ¡Ö€Õ¯Õ¾Õ¥Õ¬ Õ§`"</string>
+ <string name="common_name" msgid="2233209299434172646">"Ô¸Õ¶Õ¤Õ°Õ¡Õ¶Õ¸Ö‚Ö€ Õ¡Õ¶Õ¸Ö‚Õ¶Õ¨`"</string>
+ <string name="org_name" msgid="6973561190762085236">"Ô¿Õ¡Õ¦Õ´Õ¡Õ¯Õ¥Ö€ÕºÕ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶`"</string>
+ <string name="org_unit" msgid="7265981890422070383">"Ô¿Õ¡Õ¦Õ´Õ¡Õ¯Õ¥Ö€ÕºÕ¡Õ¯Õ¡Õ¶ Õ´Õ«Õ¡Õ¾Õ¸Ö€`"</string>
+ <string name="issued_by" msgid="2647584988057481566">"Ô¹Õ¸Õ²Õ¡Ö€Õ¯Õ¾Õ¥Õ¬ Õ§`"</string>
+ <string name="validity_period" msgid="8818886137545983110">"ÕŽÕ¡Õ¾Õ¥Ö€Õ¡Õ¯Õ¡Õ¶Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶`"</string>
+ <string name="issued_on" msgid="5895017404361397232">"Ô¹Õ¸Õ²Õ¡Ö€Õ¯Õ¾Õ¥Õ¬ Õ§`"</string>
+ <string name="expires_on" msgid="3676242949915959821">"ÕÕºÕ¡Õ¼Õ¾Õ¸Ö‚Õ´ Õ§`"</string>
+ <string name="serial_number" msgid="758814067660862493">"Õ€Õ¥Ö€Õ©Õ¡Õ¯Õ¡Õ¶ Õ°Õ¡Õ´Õ¡Ö€Õ¨`"</string>
+ <string name="fingerprints" msgid="4516019619850763049">"Õ„Õ¡Õ¿Õ¶Õ¡Õ°Õ¥Õ¿Ö„Õ¥Ö€Õ¨`"</string>
+ <string name="sha256_fingerprint" msgid="4391271286477279263">"SHA-256 Õ´Õ¡Õ¿Õ¶Õ¡Õ°Õ¥Õ¿Ö„`"</string>
+ <string name="sha1_fingerprint" msgid="7930330235269404581">"SHA-1Õ´Õ¡Õ¿Õ¶Õ¡Õ°Õ¥Õ¿Ö„`"</string>
+ <string name="activity_chooser_view_see_all" msgid="4292569383976636200">"ÕÕ¥Õ½Õ¶Õ¥Õ¬ Õ¢Õ¸Õ¬Õ¸Ö€Õ¨"</string>
+ <string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Ô¸Õ¶Õ¿Ö€Õ¥Õ¬ Õ£Õ¸Ö€Õ®Õ¸Ö‚Õ¶Õ¥Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨"</string>
+ <string name="share_action_provider_share_with" msgid="5247684435979149216">"ÕÕ¡Ö€Õ¡Õ®Õ¥Õ¬"</string>
+ <string name="status_bar_device_locked" msgid="3092703448690669768">"ÕÕ¡Ö€Ö„Õ¨ Õ¯Õ¸Õ²ÕºÕ¾Õ¡Õ® Õ§:"</string>
+ <string name="list_delimeter" msgid="3975117572185494152">", "</string>
+ <string name="sending" msgid="3245653681008218030">"ÕˆÖ‚Õ²Õ¡Ö€Õ¯Õ¾Õ¸Ö‚Õ´ Õ§..."</string>
+ <string name="launchBrowserDefault" msgid="2057951947297614725">"Ô³Õ¸Ö€Õ®Õ¡Ö€Õ¯Õ¥ÕžÕ¬ Õ¦Õ¶Õ¶Õ¡Ö€Õ¯Õ«Õ¹Õ¨:"</string>
+ <string name="SetupCallDefault" msgid="5834948469253758575">"Ô¸Õ¶Õ¤Õ¸Ö‚Õ¶Õ¥ÕžÕ¬ Õ¦Õ¡Õ¶Õ£Õ¨:"</string>
+ <string name="activity_resolver_use_always" msgid="8017770747801494933">"Õ„Õ«Õ·Õ¿"</string>
+ <string name="activity_resolver_use_once" msgid="2404644797149173758">"Õ„Õ«Õ¡ÕµÕ¶ Õ´Õ¥Õ¯ Õ¡Õ¶Õ£Õ¡Õ´"</string>
+ <string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"Ô³Ö€Õ¡Õ½Õ¡Õ¬Õ«Õ¯"</string>
+ <string name="default_audio_route_name" product="default" msgid="4239291273420140123">"Õ€Õ¥Õ¼Õ¡Õ­Õ¸Õ½"</string>
+ <string name="default_audio_route_name_headphones" msgid="8119971843803439110">"Ô±Õ¯Õ¡Õ¶Õ»Õ¡Õ¯Õ¡Õ¬Õ¶Õ¥Ö€"</string>
+ <string name="default_audio_route_name_dock_speakers" msgid="6240602982276591864">"Õ€Õ¡Õ´Õ¡Õ¯ÖÕ¾Õ¡Õ® Õ¢Õ¡Ö€Õ±Ö€Õ¡Õ­Õ¸Õ½Õ¶Õ¥Ö€"</string>
+ <string name="default_media_route_name_hdmi" msgid="2450970399023478055">"HDMI"</string>
+ <string name="default_audio_route_category_name" msgid="3722811174003886946">"Õ€Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£"</string>
+ <string name="bluetooth_a2dp_audio_route_name" msgid="8575624030406771015">"Bluetooth-Õ« Õ±Õ¡ÕµÕ¶Õ¡Õ¶ÕµÕ¸Ö‚Õ©"</string>
+ <string name="wireless_display_route_description" msgid="9070346425023979651">"Ô±Õ¶Õ¬Õ¡Ö€ Õ§Õ¯Ö€Õ¡Õ¶"</string>
+ <string name="media_route_chooser_grouping_done" msgid="7966438307723317169">"Ô¿Õ¡Õ¿Õ¡Ö€Õ¾Õ¡Õ® Õ§"</string>
+ <string name="media_route_button_content_description" msgid="5758553567065145276">"Õ„Õ¥Õ¤Õ«Õ¡ Õ¡Ö€Õ¿Õ¡Õ®Õ¸Ö‚Õ´"</string>
+ <string name="media_route_status_scanning" msgid="7279908761758293783">"ÕÕ¯Õ¡Õ¶Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´..."</string>
+ <string name="media_route_status_connecting" msgid="6422571716007825440">"Õ„Õ«Õ¡Õ¶Õ¸Ö‚Õ´ Õ§..."</string>
+ <string name="media_route_status_available" msgid="6983258067194649391">"Õ€Õ¡Õ½Õ¡Õ¶Õ¥Õ¬Õ« Õ§"</string>
+ <string name="media_route_status_not_available" msgid="6739899962681886401">"Õ€Õ¡Õ½Õ¡Õ¶Õ¥Õ¬Õ« Õ¹Õ§"</string>
+ <string name="media_route_status_in_use" msgid="4533786031090198063">"Ô¶Õ¢Õ¡Õ²Õ¥ÖÕ¾Õ¡Õ® Õ§"</string>
+ <string name="display_manager_built_in_display_name" msgid="2583134294292563941">"Õ†Õ¥Ö€Õ¯Õ¡Õ¼Õ¸Ö‚ÖÕ¾Õ¡Õ® Õ§Õ¯Ö€Õ¡Õ¶"</string>
+ <string name="display_manager_hdmi_display_name" msgid="1555264559227470109">"HDMI Õ§Õ¯Ö€Õ¡Õ¶"</string>
+ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"ÕŽÕ¥Ö€Õ¡Õ®Õ¡Õ®Õ¯ #<xliff:g id="ID">%1$d</xliff:g>"</string>
+ <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>. <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> Õ¯Õ´Õ¾"</string>
+ <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", Õ¡Õ¶Õ¾Õ¿Õ¡Õ¶Õ£"</string>
+ <string name="wifi_display_notification_title" msgid="2223050649240326557">"Ô±Õ¶Õ¬Õ¡Ö€ ÖÕ¸Ö‚ÖÕ¡Õ¤Ö€Õ¸Ö‚Õ´Õ¨ Õ¯Õ¡ÕºÕ¡Õ¯ÖÕ¾Õ¡Õ® Õ§"</string>
+ <string name="wifi_display_notification_message" msgid="4498802012464170685">"Ô±ÕµÕ½ Õ§Õ¯Ö€Õ¡Õ¶Õ¨ ÖÕ¸Ö‚ÖÕ¡Õ¤Ö€Õ¾Õ¸Ö‚Õ´ Õ§ Õ¡ÕµÕ¬ Õ½Õ¡Ö€Ö„Õ¸Ö‚Õ´"</string>
+ <string name="wifi_display_notification_disconnect" msgid="6183754463561153372">"Ô±Õ¶Õ»Õ¡Õ¿Õ¥Õ¬"</string>
+ <string name="kg_emergency_call_label" msgid="684946192523830531">"Ô±Ö€Õ¿Õ¡Õ¯Õ¡Ö€Õ£ Õ«Ö€Õ¡Õ¾Õ«Õ³Õ¡Õ¯Õ« Õ°Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ¡Õ¦Õ¡Õ¶Õ£"</string>
+ <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Õ„Õ¸Õ¼Õ¡ÖÕ¥Õ¬ Õ¥Õ´ Õ½Õ­Õ¥Õ´Õ¡Õ¶"</string>
+ <string name="kg_wrong_pattern" msgid="1850806070801358830">"ÕÕ­Õ¡Õ¬ Õ½Õ­Õ¥Õ´Õ¡"</string>
+ <string name="kg_wrong_password" msgid="2333281762128113157">"ÕÕ­Õ¡Õ¬ Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼"</string>
+ <string name="kg_wrong_pin" msgid="1131306510833563801">"ÕÕ­Õ¡Õ¬ PIN"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"Õ“Õ¸Ö€Õ±Õ¥Ö„ Õ¯Ö€Õ¯Õ«Õ¶ <xliff:g id="NUMBER">%1$d</xliff:g> Õ¾Õ¡ÕµÖ€Õ¯ÕµÕ¡Õ¶Õ«Ö:"</string>
+ <string name="kg_pattern_instructions" msgid="398978611683075868">"Õ€Õ¡Õ¾Õ¡Ö„Õ¥Ö„ Õ±Õ¥Ö€ Õ½Õ­Õ¥Õ´Õ¡Õ¶"</string>
+ <string name="kg_sim_pin_instructions" msgid="2319508550934557331">"Õ„Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ¥Ö„ SIM-Õ« PIN-Õ¨"</string>
+ <string name="kg_pin_instructions" msgid="2377242233495111557">"Õ„Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ¥Ö„ PIN-Õ¨"</string>
+ <string name="kg_password_instructions" msgid="5753646556186936819">"Õ„Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ¥Ö„ Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ¨"</string>
+ <string name="kg_puk_enter_puk_hint" msgid="453227143861735537">"SIM-Õ¨ Õ¡ÕµÕ½ ÕºÕ¡Õ°Õ«Õ¶ Õ¡Õ¶Õ»Õ¡Õ¿Õ¾Õ¡Õ® Õ§: Õ„Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ¥Ö„ PUK Õ¯Õ¸Õ¤Õ¨ Õ·Õ¡Ö€Õ¸Ö‚Õ¶Õ¡Õ¯Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€: Õ„Õ¡Õ¶Ö€Õ¡Õ´Õ¡Õ½Õ¶Õ¥Ö€Õ« Õ°Õ¡Õ´Õ¡Ö€ Õ¯Õ¡ÕºÕ¾Õ¥Ö„ Ö…ÕºÕ¥Ö€Õ¡Õ¿Õ¸Ö€Õ« Õ°Õ¥Õ¿:"</string>
+ <string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"Õ„Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ¥Ö„ ÖÕ¡Õ¶Õ¯Õ¡Õ¬Õ« PIN Õ®Õ¡Õ®Õ¯Õ¡Õ£Õ«Ö€Õ¨"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"Õ€Õ¡Õ½Õ¿Õ¡Õ¿Õ¥Ö„ ÖÕ¡Õ¶Õ¯Õ¡Õ¬Õ« PIN Õ®Õ¡Õ®Õ¯Õ¡Õ£Õ«Ö€Õ¨"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"Ô±ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ¸Ö‚Õ´ Õ§ SIM Ö„Õ¡Ö€Õ¿Õ¨ ..."</string>
+ <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"ÕÕ­Õ¡Õ¬ PIN Õ®Õ¡Õ®Õ¯Õ¡Õ£Õ«Ö€:"</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"Մուտքագրեք PIN, Õ¸Ö€Õ¨ 4-Õ«Ö 8 Õ©Õ«Õ¾ Õ§:"</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"PUK Õ¯Õ¸Õ¤Õ¨ ÕºÕ¥Õ¿Ö„ Õ§ Õ¬Õ«Õ¶Õ« 8 Õ¯Õ¡Õ´ Õ¡Õ¾Õ¥Õ¬Õ« Õ©Õ«Õ¾:"</string>
+ <string name="kg_invalid_puk" msgid="3638289409676051243">"ÕŽÕ¥Ö€Õ¡Õ´Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ¥Ö„ Õ³Õ«Õ·Õ¿ PUK Õ®Õ¡Õ®Õ¯Õ¡Õ£Õ«Ö€Õ¨: Ô¿Ö€Õ¯Õ¶Õ¾Õ¸Õ² ÖƒÕ¸Ö€Õ±Õ¥Ö€Õ¨ Õ¨Õ¶Õ¤Õ´Õ«Õ·Õ¿ Õ¯Õ¯Õ¡Õ½Õ¥ÖÕ¶Õ¥Õ¶ SIM Ö„Õ¡Ö€Õ¿Õ¨:"</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"PIN Õ®Õ¡Õ®Õ¯Õ¡Õ£Ö€Õ¥Ö€Õ¨ Õ¹Õ¥Õ¶ Õ°Õ¡Õ´Õ¨Õ¶Õ¯Õ¶Õ¸Ö‚Õ´"</string>
+ <string name="kg_login_too_many_attempts" msgid="6486842094005698475">"Õ‰Õ¡ÖƒÕ«Ö Õ·Õ¡Õ¿ Õ½Õ­Õ¥Õ´Õ¡ÕµÕ« ÖƒÕ¸Ö€Õ±Õ¥Ö€"</string>
+ <string name="kg_login_instructions" msgid="1100551261265506448">"Ô±ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€` Õ´Õ¸Ö‚Õ¿Ö„ Õ£Õ¸Ö€Õ®Õ¥Ö„ Õ±Õ¥Ö€ Google Õ°Õ¡Õ·Õ¾Õ¸Õ¾:"</string>
+ <string name="kg_login_username_hint" msgid="5718534272070920364">"Õ•Õ£Õ¿Õ¡Õ¶Õ¸Ö‚Õ¶ (Õ§Õ¬ÖƒÕ¸Õ½Õ¿)"</string>
+ <string name="kg_login_password_hint" msgid="9057289103827298549">"Ô³Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ¨"</string>
+ <string name="kg_login_submit_button" msgid="5355904582674054702">"Õ„Õ¸Ö‚Õ¿Ö„ Õ£Õ¸Ö€Õ®Õ¥Õ¬"</string>
+ <string name="kg_login_invalid_input" msgid="5754664119319872197">"ÕÕ­Õ¡Õ¬ Ö…Õ£Õ¿Õ¡Õ¶Õ¸Ö‚Õ¶ Õ¯Õ¡Õ´ Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼:"</string>
+ <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"Õ„Õ¸Õ¼Õ¡ÖÕ¥ÕžÕ¬ Õ¥Ö„ Õ±Õ¥Ö€ Ö…Õ£Õ¿Õ¡Õ¶Õ¸Ö‚Õ¶Õ¨ Õ¯Õ¡Õ´ Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ¨:\nÔ±ÕµÖÕ¥Õ¬Õ¥Ö„ "<b>"google.com /accounts/recovery"</b>":"</string>
+ <string name="kg_login_checking_password" msgid="1052685197710252395">"Õ€Õ¡Õ·Õ«Õ¾Õ¨ Õ½Õ¿Õ¸Ö‚Õ£Õ¾Õ¸Ö‚Õ´ Õ§..."</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"Դուք <xliff:g id="NUMBER_0">%d</xliff:g> Õ¡Õ¶Õ£Õ¡Õ´ Õ½Õ­Õ¡Õ¬ Õ¥Ö„ Õ´Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ¥Õ¬ Õ±Õ¥Ö€ PIN-Õ¨: \n\nÕ“Õ¸Ö€Õ±Õ¥Ö„ Õ¯Ö€Õ¯Õ«Õ¶ <xliff:g id="NUMBER_1">%d</xliff:g> Õ¾Õ¡ÕµÖ€Õ¯ÕµÕ¡Õ¶Õ«Ö:"</string>
+ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"Ô´Õ¸Ö‚Ö„ Õ½Õ­Õ¡Õ¬ Õ¥Ö„ Õ´Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ¥Õ¬ Õ±Õ¥Ö€ Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ¨ <xliff:g id="NUMBER_0">%d</xliff:g> Õ¡Õ¶Õ£Õ¡Õ´: \n\nÕ“Õ¸Ö€Õ±Õ¥Ö„ Õ¯Ö€Õ¯Õ«Õ¶ <xliff:g id="NUMBER_1">%d</xliff:g> Õ¾Õ¡ÕµÖ€Õ¯ÕµÕ¡Õ¶Õ«Ö:"</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"Դուք <xliff:g id="NUMBER_0">%d</xliff:g> Õ¡Õ¶Õ£Õ¡Õ´ Õ½Õ­Õ¡Õ¬ Õ¥Ö„ Õ°Õ¡Õ¾Õ¡Ö„Õ¥Õ¬ Õ±Õ¥Ö€ Õ¡ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ´Õ¡Õ¶ Õ½Õ­Õ¥Õ´Õ¡Õ¶: \n\nÕ“Õ¸Ö€Õ±Õ¥Ö„ Õ¯Ö€Õ¯Õ«Õ¶ <xliff:g id="NUMBER_1">%d</xliff:g> Õ¾Õ¡ÕµÖ€Õ¯ÕµÕ¡Õ¶Õ«Ö:"</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1575557200627128949">"Դուք <xliff:g id="NUMBER_0">%d</xliff:g> Õ¡Õ¶Õ£Õ¡Õ´ Õ½Õ­Õ¡Õ¬ ÖƒÕ¸Ö€Õ± Õ¥Ö„ Õ¡Ö€Õ¥Õ¬ Õ£Ö€Õ¡Õ½Õ¡Õ¬Õ«Õ¯Õ¶ Õ¡ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€: <xliff:g id="NUMBER_1">%d</xliff:g> Õ¡Õ¶Õ£Õ¡Õ´Õ«Ö Õ¡Õ¾Õ¥Õ¬ Õ¡Õ¶Õ°Õ¡Õ»Õ¸Õ² ÖƒÕ¸Ö€Õ±Õ¥Ö€Õ«Ö Õ°Õ¥Õ¿Õ¸ Õ£Ö€Õ¡Õ½Õ¡Õ¬Õ«Õ¯Õ¨ Õ¯Õ¾Õ¥Ö€Õ¡Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¾Õ« Õ£Õ¸Ö€Õ®Õ¡Ö€Õ¡Õ¶Õ¡ÕµÕ«Õ¶ Õ¬Õ¼Õ¥Õ¬ÕµÕ¡ÕµÕ¶Õ«, Ö‡ Ö…Õ£Õ¿Õ¾Õ¸Õ²Õ« Õ¢Õ¸Õ¬Õ¸Ö€ Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨ Õ¯Õ¯Õ¸Ö€Õ¥Õ¶:"</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="4051015943038199910">"Դուք <xliff:g id="NUMBER_0">%d</xliff:g> Õ¡Õ¶Õ£Õ¡Õ´ Õ½Õ­Õ¡Õ¬ ÖƒÕ¸Ö€Õ± Õ¥Ö„ Õ¡Ö€Õ¥Õ¬ Õ°Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ¶ Õ¡ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€: <xliff:g id="NUMBER_1">%d</xliff:g> Õ¡Õ¶Õ£Õ¡Õ´Õ«Ö Õ¡Õ¾Õ¥Õ¬ Õ¡Õ¶Õ°Õ¡Õ»Õ¸Õ² ÖƒÕ¸Ö€Õ±Õ¥Ö€Õ«Ö Õ°Õ¥Õ¿Õ¸ Õ°Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ¨ Õ¯Õ¾Õ¥Ö€Õ¡Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¾Õ« Õ£Õ¸Ö€Õ®Õ¡Ö€Õ¡Õ¶Õ¡ÕµÕ«Õ¶ Õ¬Õ¼Õ¥Õ¬ÕµÕ¡ÕµÕ¶Õ«, Ö‡ Ö…Õ£Õ¿Õ¾Õ¸Õ²Õ« Õ¢Õ¸Õ¬Õ¸Ö€ Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨ Õ¯Õ¯Õ¸Ö€Õ¥Õ¶:"</string>
+ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="2072996269148483637">"Ô´Õ¸Ö‚Ö„ <xliff:g id="NUMBER">%d</xliff:g> Õ¡Õ¶Õ£Õ¡Õ´ Õ½Õ­Õ¡Õ¬ ÖƒÕ¸Ö€Õ± Õ¥Ö„ Õ¡Ö€Õ¥Õ¬ Õ£Ö€Õ¡Õ½Õ¡Õ¬Õ«Õ¯Õ¶ Õ¡ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€: Ô³Ö€Õ¡Õ½Õ¡Õ¬Õ«Õ¯Õ¶ Õ¡ÕµÕªÕ´ Õ¯Õ¾Õ¥Ö€Õ¡Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¾Õ« Õ£Õ¸Ö€Õ®Õ¡Ö€Õ¡Õ¶Õ¡ÕµÕ«Õ¶ Õ¬Õ¼Õ¥Õ¬ÕµÕ¡ÕµÕ¶Õ«:"</string>
+ <string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"Դուք <xliff:g id="NUMBER">%d</xliff:g> անգամ սխալ փորձ եք արել հեռախոսն ապակողպելու համար: Հեռախոսն այժմ կվերակարգավորվի գործարանային լռելյայնի:"</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Ô´Õ¸Ö‚Ö„ Õ½Õ­Õ¡Õ¬ Õ¥Ö„ Õ°Õ¡Õ¾Õ¡Ö„Õ¥Õ¬ Õ±Õ¥Ö€ Õ¡ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ´Õ¡Õ¶ Õ½Õ­Õ¥Õ´Õ¡Õ¶ <xliff:g id="NUMBER_0">%d</xliff:g> Õ¡Õ¶Õ£Õ¡Õ´: ÔµÕ¾Õ½ <xliff:g id="NUMBER_1">%d</xliff:g> Õ¡Õ¶Õ°Õ¡Õ»Õ¸Õ² ÖƒÕ¸Ö€Õ±Õ«Ö Õ°Õ¥Õ¿Õ¸ Õ±Õ¥Õ¦Õ¡Õ¶Õ«Ö Õ¯ÕºÕ¡Õ°Õ¡Õ¶Õ»Õ¾Õ« Õ¡ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ¥Õ¬ Õ±Õ¥Ö€ Õ£Ö€Õ¡Õ½Õ¡Õ¬Õ«Õ¯Õ¨` Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¥Õ¬Õ¸Õ¾ Õ§Õ¬ÖƒÕ¸Õ½Õ¿Õ« Õ°Õ¡Õ·Õ«Õ¾:\n\n Õ“Õ¸Ö€Õ±Õ¥Ö„ Õ¯Ö€Õ¯Õ«Õ¶ <xliff:g id="NUMBER_2">%d</xliff:g> Õ¾Õ¡ÕµÖ€Õ¯ÕµÕ¡Õ¶Õ«Ö:"</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Դուք <xliff:g id="NUMBER_0">%d</xliff:g> Õ¡Õ¶Õ£Õ¡Õ´ Õ½Õ­Õ¡Õ¬ Õ¥Ö„ Õ°Õ¡Õ¾Õ¡Ö„Õ¥Õ¬ Õ±Õ¥Ö€ Õ¡ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ´Õ¡Õ¶ Õ¶Õ´Õ¸Ö‚Õ·Õ¨: <xliff:g id="NUMBER_1">%d</xliff:g> Õ¡Õ¶Õ£Õ¡Õ´Õ«Ö Õ¡Õ¾Õ¥Õ¬ Õ¡Õ¶Õ°Õ¡Õ»Õ¸Õ² ÖƒÕ¸Ö€Õ±Õ¥Ö€Õ«Ö Õ°Õ¥Õ¿Õ¸ Õ±Õ¥Õ¦ Õ¯Õ¡Õ¼Õ¡Õ»Õ¡Ö€Õ¯Õ¾Õ« Õ¡ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ¥Õ¬ Õ±Õ¥Ö€ Õ°Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ¨` Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¥Õ¬Õ¸Õ¾ Õ§Õ¬ÖƒÕ¸Õ½Õ¿Õ« Õ°Õ¡Õ·Õ«Õ¾:\n\n Õ“Õ¸Ö€Õ±Õ¥Ö„ Õ¯Ö€Õ¯Õ«Õ¶ <xliff:g id="NUMBER_2">%d</xliff:g> Õ¾Õ¡ÕµÖ€Õ¯ÕµÕ¡Õ¶Õ«Ö:"</string>
+ <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
+ <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Õ€Õ¥Õ¼Õ¡ÖÕ¶Õ¥Õ¬"</string>
+ <string name="safe_media_volume_warning" product="default" msgid="7324161939475478066">"Ô²Õ¡Ö€Õ±Ö€Õ¡ÖÕ¶Õ¥ÕžÕ¬ Õ±Õ¡ÕµÕ¶Õ¨ Õ¡Õ¼Õ¡Õ»Õ¡Ö€Õ¯Õ¾Õ¸Õ² Õ·Õ¥Õ´Õ«Ö Õ¢Õ¡Ö€Õ±Ö€:\nÔµÖ€Õ¯Õ¡Ö€ ÕªÕ¡Õ´Õ¡Õ¶Õ¡Õ¯ Õ¢Õ¡Ö€Õ±Ö€Õ¡Õ±Õ¡ÕµÕ¶ Õ¬Õ½Õ¥Õ¬Õ¨ Õ¯Õ¡Ö€Õ¸Õ² Õ§ Õ¾Õ¶Õ¡Õ½Õ¥Õ¬ Õ±Õ¥Ö€ Õ¬Õ½Õ¸Õ²Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨:"</string>
+ <string name="continue_to_enable_accessibility" msgid="1626427372316070258">"ÕÕ¥Õ²Õ´Õ¡Õ® ÕºÕ¡Õ°Õ¥Ö„ Õ¥Ö€Õ¯Õ¸Ö‚ Õ´Õ¡Õ¿Õ¶Õ¥Ö€Õ¨` Õ´Õ¡Õ¿Õ¹Õ¥Õ¬Õ«Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Õ´Õ«Õ¡ÖÕ¶Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€:"</string>
+ <string name="accessibility_enabled" msgid="1381972048564547685">"Õ„Õ¡Õ¿Õ¹Õ¥Õ¬Õ«Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Õ´Õ«Õ¡ÖÕ¾Õ¡Õ® Õ§:"</string>
+ <string name="enable_accessibility_canceled" msgid="3833923257966635673">"Õ„Õ¸Ö‚Õ¿Ö„Õ« Õ°Õ¶Õ¡Ö€Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Õ¹Õ¥Õ²Õ¡Ö€Õ¯Õ¾Õ¡Õ® Õ§:"</string>
+ <string name="user_switched" msgid="3768006783166984410">"Õ†Õ¥Ö€Õ¯Õ¡ÕµÕ«Õ½ Ö…Õ£Õ¿Õ¾Õ¸Õ²Õ¨ <xliff:g id="NAME">%1$s</xliff:g>:"</string>
+ <string name="owner_name" msgid="2716755460376028154">"ÕÕ¥ÖƒÕ¡Õ¯Õ¡Õ¶Õ¡Õ¿Õ¥Ö€"</string>
+ <string name="error_message_title" msgid="4510373083082500195">"ÕÕ­Õ¡Õ¬"</string>
+ <string name="app_no_restricted_accounts" msgid="5739463249673727736">"Ô±ÕµÕ½ Õ®Ö€Õ¡Õ£Õ«Ö€Õ¨ Õ¹Õ« Õ¡Õ»Õ¡Õ¯ÖÕ¸Ö‚Õ´ Õ½Õ¡Õ°Õ´Õ¡Õ¶Õ¡ÖƒÕ¡Õ¯Õ¾Õ¡Õ® ÕºÖ€Õ¸Ö†Õ«Õ¬Õ¶Õ¥Ö€Õ« Õ°Õ¡Õ·Õ«Õ¾Õ¶Õ¥Ö€:"</string>
+ <string name="app_not_found" msgid="3429141853498927379">"Ô±ÕµÕ½ Õ£Õ¸Ö€Õ®Õ¸Õ²Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Õ¯Õ¡Õ¿Õ¡Ö€Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€ Õ¸Õ¹ Õ´Õ« Õ®Ö€Õ¡Õ£Õ«Ö€ Õ¹Õ« Õ£Õ¿Õ¶Õ¾Õ¥Õ¬:"</string>
+ <string name="revoke" msgid="5404479185228271586">"Õ‰Õ¥Õ²Õ¡Ö€Õ¯Õ¥Õ¬"</string>
+ <string name="mediaSize_iso_a0" msgid="7875427489420821793">"ISO A0"</string>
+ <string name="mediaSize_iso_a1" msgid="3760734499050875356">"ISO A1"</string>
+ <string name="mediaSize_iso_a2" msgid="5973266378020144382">"ISO A2"</string>
+ <string name="mediaSize_iso_a3" msgid="1373407105687300884">"ISO A3"</string>
+ <string name="mediaSize_iso_a4" msgid="6689772807982597254">"ISO A4"</string>
+ <string name="mediaSize_iso_a5" msgid="5353549652015741040">"ISO A5"</string>
+ <string name="mediaSize_iso_a6" msgid="8585038048674911907">"ISO A6"</string>
+ <string name="mediaSize_iso_a7" msgid="6641836716963839119">"ISO A7"</string>
+ <string name="mediaSize_iso_a8" msgid="7571139437465693355">"ISO A8"</string>
+ <string name="mediaSize_iso_a9" msgid="1378455891957115079">"ISO A9"</string>
+ <string name="mediaSize_iso_a10" msgid="2480747457429475344">"ISO A10"</string>
+ <string name="mediaSize_iso_b0" msgid="3965935097661108039">"ISO B0"</string>
+ <string name="mediaSize_iso_b1" msgid="2505753285010115437">"ISO B1"</string>
+ <string name="mediaSize_iso_b2" msgid="8763874709859458453">"ISO B2"</string>
+ <string name="mediaSize_iso_b3" msgid="4210506688191764076">"ISO B3"</string>
+ <string name="mediaSize_iso_b4" msgid="5749404165888526034">"ISO B4"</string>
+ <string name="mediaSize_iso_b5" msgid="7640627414621904733">"ISO B5"</string>
+ <string name="mediaSize_iso_b6" msgid="7342988864712748544">"ISO B6"</string>
+ <string name="mediaSize_iso_b7" msgid="5069844065235382429">"ISO B7"</string>
+ <string name="mediaSize_iso_b8" msgid="7316818922278779774">"ISO B8"</string>
+ <string name="mediaSize_iso_b9" msgid="5414727094026532341">"ISO B9"</string>
+ <string name="mediaSize_iso_b10" msgid="5251253731832048185">"ISO B10"</string>
+ <string name="mediaSize_iso_c0" msgid="4003138342671964217">"ISO C0"</string>
+ <string name="mediaSize_iso_c1" msgid="1935188063393553008">"ISO C1"</string>
+ <string name="mediaSize_iso_c2" msgid="3197307969712069904">"ISO C2"</string>
+ <string name="mediaSize_iso_c3" msgid="4335826087321913508">"ISO C3"</string>
+ <string name="mediaSize_iso_c4" msgid="3745639598281015005">"ISO C4"</string>
+ <string name="mediaSize_iso_c5" msgid="8269457765822791013">"ISO C5"</string>
+ <string name="mediaSize_iso_c6" msgid="566666105260346930">"ISO C6"</string>
+ <string name="mediaSize_iso_c7" msgid="8678413180782608498">"ISO C7"</string>
+ <string name="mediaSize_iso_c8" msgid="8392376206627041730">"ISO C8"</string>
+ <string name="mediaSize_iso_c9" msgid="9191613372324845405">"ISO C9"</string>
+ <string name="mediaSize_iso_c10" msgid="7327709699184920822">"ISO C10"</string>
+ <string name="mediaSize_na_letter" msgid="4191805615829472953">"Letter"</string>
+ <string name="mediaSize_na_gvrnmt_letter" msgid="7853382192649405507">"Government Letter"</string>
+ <string name="mediaSize_na_legal" msgid="6697982988283823150">"Legal"</string>
+ <string name="mediaSize_na_junior_legal" msgid="3727743969902758948">"Junior Legal"</string>
+ <string name="mediaSize_na_ledger" msgid="281871464896601236">"Ledger"</string>
+ <string name="mediaSize_na_tabloid" msgid="5775966416333578127">"Tabloid"</string>
+ <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Õ‰Õ¥Õ²Õ¡Ö€Õ¯Õ¾Õ¡Õ® Õ§"</string>
+ <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Ô²Õ¸Õ¾Õ¡Õ¶Õ¤Õ¡Õ¯Õ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ£Ö€Õ¥Õ¬Õ¸Ö‚ Õ½Õ­Õ¡Õ¬"</string>
+ <string name="restr_pin_enter_pin" msgid="3395953421368476103">"Õ„Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ¥Ö„ PIN-Õ¨"</string>
+ <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"Ô¸Õ¶Õ©Õ¡ÖÕ«Õ¯ PIN"</string>
+ <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"Õ†Õ¸Ö€ PIN"</string>
+ <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"Õ€Õ¡Õ½Õ¿Õ¡Õ¿Õ¥Ö„ Õ¶Õ¸Ö€ PIN-Õ¨"</string>
+ <string name="restr_pin_create_pin" msgid="8017600000263450337">"ÕÕ¿Õ¥Õ²Õ®Õ¥Õ¬ PINÕ Õ½Õ¡Õ°Õ´Õ¡Õ¶Õ¡ÖƒÕ¡Õ¯Õ¸Ö‚Õ´Õ¶Õ¥Ö€Õ¨ ÖƒÕ¸ÖƒÕ¸Õ­Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€"</string>
+ <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"PIN-Õ¥Ö€Õ¨ Õ¹Õ¥Õ¶ Õ°Õ¡Õ´Õ¨Õ¶Õ¯Õ¶Õ¸Ö‚Õ´: Õ“Õ¸Ö€Õ±Õ¥Ö„ Õ¯Ö€Õ¯Õ«Õ¶:"</string>
+ <string name="restr_pin_error_too_short" msgid="8173982756265777792">"PIN-Õ¨ Õ¹Õ¡ÖƒÕ¡Õ¦Õ¡Õ¶Ö Õ¯Õ¡Ö€Õ³ Õ§: ÕŠÕ¥Õ¿Ö„ Õ§ Õ¸Ö‚Õ¶Õ¥Õ¶Õ¡ Õ¡Õ¼Õ¶Õ¾Õ¡Õ¦Õ¶ 4 Õ©Õ¾Õ¡Õ¶Õ«Õ·:"</string>
+ <plurals name="restr_pin_countdown">
+ <item quantity="one" msgid="4835639969503729874">"PIN-Õ¨ Õ½Õ­Õ¡Õ¬ Õ§: Õ“Õ¸Ö€Õ±Õ¥Ö„ Õ¯Ö€Õ¯Õ«Õ¶ 1 Õ¾Õ¡ÕµÖ€Õ¯ÕµÕ¡Õ¶Õ«Ö:"</item>
+ <item quantity="other" msgid="8030607343223287654">"PIN-Õ¨ Õ½Õ­Õ¡Õ¬ Õ§: Õ“Õ¸Ö€Õ±Õ¥Ö„ Õ¯Ö€Õ¯Õ«Õ¶ <xliff:g id="COUNT">%d</xliff:g> Õ¾Õ¡ÕµÖ€Õ¯ÕµÕ¡Õ¶Õ«Ö:"</item>
+ </plurals>
+ <string name="transient_navigation_confirmation" msgid="4907844043611123426">"ÕÕ¡Õ°Õ¥ÖÖ€Õ¥Ö„ Õ§Õ¯Ö€Õ¡Õ¶Õ« Õ¥Õ¦Ö€Õ¸Õ¾Õ Õ£Õ¸Õ¿Õ«Õ¶ Õ¢Õ¡ÖÕ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€"</string>
+ <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"ÕÕ¡Õ°Õ¥ÖÖ€Õ¥Ö„ Õ§Õ¯Ö€Õ¡Õ¶Õ« Õ¥Õ¦Ö€Õ¸Õ¾Õ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ¡ÕµÕ«Õ¶ Õ£Õ¸Õ¿Õ«Õ¶ Õ¢Õ¡ÖÕ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€"</string>
+</resources>
diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml
index 417c18e..1edbd64 100644
--- a/core/res/res/values-in/strings.xml
+++ b/core/res/res/values-in/strings.xml
@@ -50,6 +50,11 @@
<string name="invalidPuk" msgid="8761456210898036513">"Ketik PUK yang terdiri dari 8 angka atau lebih."</string>
<string name="needPuk" msgid="919668385956251611">"Kartu SIM Anda dikunci PUK. Ketikkan kode PUK untuk membukanya."</string>
<string name="needPuk2" msgid="4526033371987193070">"Ketikkan PUK2 untuk membuka kartu SIM"</string>
+ <string name="enablePin" msgid="209412020907207950">"Gagal, aktifkan Kunci SIM/RUIM."</string>
+ <plurals name="pinpuk_attempts">
+ <item quantity="one" msgid="6596245285809790142">"Sisa <xliff:g id="NUMBER">%d</xliff:g> percobaan sebelum SIM terkunci."</item>
+ <item quantity="other" msgid="7530597808358774740">"Sisa <xliff:g id="NUMBER">%d</xliff:g> percobaan sebelum SIM terkunci."</item>
+ </plurals>
<string name="imei" msgid="2625429890869005782">"IMEI"</string>
<string name="meid" msgid="4841221237681254195">"MEID"</string>
<string name="ClipMmi" msgid="6952821216480289285">"Nomor Penelepon Masuk"</string>
@@ -477,6 +482,8 @@
<string name="permdesc_accessSurfaceFlinger" msgid="1041619516733293551">"Mengizinkan apl menggunakan fitur tingkat rendah SurfaceFlinger."</string>
<string name="permlab_readFrameBuffer" msgid="6690504248178498136">"baca buffer frame"</string>
<string name="permdesc_readFrameBuffer" msgid="4937405521809454680">"Mengizinkan apl membaca konten penyangga frame."</string>
+ <string name="permlab_accessInputFlinger" msgid="5348635270689553857">"mengakses InputFlinger"</string>
+ <string name="permdesc_accessInputFlinger" msgid="2104864941201226616">"Memungkinkan aplikasi menggunakan fitur tingkat rendah InputFlinger."</string>
<string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"mengonfigurasi tampilan Wi-Fi"</string>
<string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"Izinkan aplikasi mengonfigurasi dan terhubung ke tampilan Wi-Fi."</string>
<string name="permlab_controlWifiDisplay" msgid="393641276723695496">"mengontrol tampilan Wi-Fi"</string>
@@ -1142,15 +1149,15 @@
<string name="smv_application" msgid="3307209192155442829">"Apl <xliff:g id="APPLICATION">%1$s</xliff:g> (proses <xliff:g id="PROCESS">%2$s</xliff:g>) telah melanggar kebijakan StrictMode yang diberlakukannya sendiri."</string>
<string name="smv_process" msgid="5120397012047462446">"Proses <xliff:g id="PROCESS">%1$s</xliff:g> telah melanggar kebijakan StrictMode yang diberlakukan secara otomatis."</string>
<string name="android_upgrading_title" msgid="1584192285441405746">"Android sedang meningkatkan versi..."</string>
- <string name="android_upgrading_apk" msgid="7904042682111526169">"Mengoptimalkan apl <xliff:g id="NUMBER_0">%1$d</xliff:g> dari <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
- <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Memulai apl."</string>
+ <string name="android_upgrading_apk" msgid="7904042682111526169">"Mengoptimalkan aplikasi <xliff:g id="NUMBER_0">%1$d</xliff:g> dari <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
+ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Memulai aplikasi."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Menyelesaikan boot."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> berjalan"</string>
<string name="heavy_weight_notification_detail" msgid="1721681741617898865">"Sentuh untuk beralih ke apl"</string>
<string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Beralih apl?"</string>
<string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Apl lain sudah berjalan dan harus dihentikan agar Anda dapat memulai yang baru."</string>
<string name="old_app_action" msgid="493129172238566282">"Kembali ke<xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="old_app_description" msgid="2082094275580358049">"Jangan memulai apl baru."</string>
+ <string name="old_app_description" msgid="2082094275580358049">"Jangan memulai aplikasi baru."</string>
<string name="new_app_action" msgid="5472756926945440706">"Mulai <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
<string name="new_app_description" msgid="1932143598371537340">"Hentikan apl lama tanpa menyimpan."</string>
<string name="sendText" msgid="5209874571959469142">"Pilih tindakan untuk teks"</string>
@@ -1414,6 +1421,7 @@
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
<string name="activitychooserview_choose_application" msgid="2125168057199941199">"Pilih apl"</string>
+ <string name="activitychooserview_choose_application_error" msgid="8624618365481126668">"Tidak dapat meluncurkan <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="shareactionprovider_share_with" msgid="806688056141131819">"Berbagi dengan"</string>
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Berbagi dengan <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Gagang geser. Sentuh &amp; tahan."</string>
@@ -1649,5 +1657,16 @@
<item quantity="other" msgid="4730868920742952817">"Coba <xliff:g id="COUNT">%d</xliff:g> detik lagi"</item>
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Coba lagi nanti"</string>
- <string name="immersive_mode_confirmation" msgid="7227416894979047467">"Gesek ke bawah untuk keluar dari layar penuh"</string>
+ <string name="immersive_mode_confirmation" msgid="7227416894979047467">"Gesek dari atas ke bawah untuk keluar dari layar penuh."</string>
+ <string name="done_label" msgid="2093726099505892398">"Selesai"</string>
+ <string name="hour_picker_description" msgid="6698199186859736512">"Penggeser putar jam"</string>
+ <string name="minute_picker_description" msgid="8606010966873791190">"Penggeser putar menit"</string>
+ <string name="select_hours" msgid="6043079511766008245">"Pilih jam"</string>
+ <string name="select_minutes" msgid="3974345615920336087">"Pilih menit"</string>
+ <string name="day_picker_description" msgid="8990847925961297968">"Kisi hari pada bulan"</string>
+ <string name="year_picker_description" msgid="5524331207436052403">"Daftar tahun"</string>
+ <string name="select_day" msgid="7774759604701773332">"Pilih bulan dan hari"</string>
+ <string name="select_year" msgid="7952052866994196170">"Pilih tahun"</string>
+ <string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> dipilih"</string>
+ <string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> dihapus"</string>
</resources>
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index d2dbfc3..6a5e415 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -50,6 +50,11 @@
<string name="invalidPuk" msgid="8761456210898036513">"Digita un PUK formato da almeno 8 numeri."</string>
<string name="needPuk" msgid="919668385956251611">"La SIM è bloccata tramite PUK. Digita il codice PUK per sbloccarla."</string>
<string name="needPuk2" msgid="4526033371987193070">"Digita il PUK2 per sbloccare la SIM."</string>
+ <string name="enablePin" msgid="209412020907207950">"Operazione non riuscita; attiva blocco SIM/RUIM."</string>
+ <plurals name="pinpuk_attempts">
+ <item quantity="one" msgid="6596245285809790142">"Hai ancora <xliff:g id="NUMBER">%d</xliff:g> tentativo a disposizione prima che la SIM venga bloccata."</item>
+ <item quantity="other" msgid="7530597808358774740">"Hai ancora <xliff:g id="NUMBER">%d</xliff:g> tentativi a disposizione prima che la SIM venga bloccata."</item>
+ </plurals>
<string name="imei" msgid="2625429890869005782">"IMEI"</string>
<string name="meid" msgid="4841221237681254195">"MEID"</string>
<string name="ClipMmi" msgid="6952821216480289285">"ID chiamante in entrata"</string>
@@ -477,6 +482,8 @@
<string name="permdesc_accessSurfaceFlinger" msgid="1041619516733293551">"Consente all\'applicazione l\'utilizzo di funzioni di basso livello SurfaceFlinger."</string>
<string name="permlab_readFrameBuffer" msgid="6690504248178498136">"lettura buffer di frame"</string>
<string name="permdesc_readFrameBuffer" msgid="4937405521809454680">"Consente all\'applicazione di leggere i contenuti del buffer di frame."</string>
+ <string name="permlab_accessInputFlinger" msgid="5348635270689553857">"accesso a InputFlinger"</string>
+ <string name="permdesc_accessInputFlinger" msgid="2104864941201226616">"Consente all\'applicazione di utilizzare funzioni di basso livello InputFlinger."</string>
<string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"configurazione di schermi Wi-Fi"</string>
<string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"Consente all\'applicazione di configurare schermi Wi-Fi e di collegarsi a essi."</string>
<string name="permlab_controlWifiDisplay" msgid="393641276723695496">"controllo di schermi Wi-Fi"</string>
@@ -1414,6 +1421,7 @@
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Maiuscolo"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Invio"</string>
<string name="activitychooserview_choose_application" msgid="2125168057199941199">"Scegli un\'applicazione"</string>
+ <string name="activitychooserview_choose_application_error" msgid="8624618365481126668">"Impossibile avviare l\'applicazione <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="shareactionprovider_share_with" msgid="806688056141131819">"Condividi con"</string>
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Condividi con <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Maniglia scorrevole. Tocca e tieni premuto."</string>
@@ -1650,4 +1658,15 @@
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Riprova più tardi"</string>
<string name="immersive_mode_confirmation" msgid="7227416894979047467">"Scorri dall\'alto verso il basso per uscire dalla modalità schermo intero."</string>
+ <string name="done_label" msgid="2093726099505892398">"Fine"</string>
+ <string name="hour_picker_description" msgid="6698199186859736512">"Dispositivo di scorrimento circolare per le ore"</string>
+ <string name="minute_picker_description" msgid="8606010966873791190">"Dispositivo di scorrimento circolare per i minuti"</string>
+ <string name="select_hours" msgid="6043079511766008245">"Seleziona le ore"</string>
+ <string name="select_minutes" msgid="3974345615920336087">"Seleziona i minuti"</string>
+ <string name="day_picker_description" msgid="8990847925961297968">"Griglia di giorni per mese"</string>
+ <string name="year_picker_description" msgid="5524331207436052403">"Elenco degli anni"</string>
+ <string name="select_day" msgid="7774759604701773332">"Seleziona mese e giorno"</string>
+ <string name="select_year" msgid="7952052866994196170">"Seleziona anno"</string>
+ <string name="item_is_selected" msgid="949687401682476608">"Elemento selezionato: <xliff:g id="ITEM">%1$s</xliff:g>"</string>
+ <string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> eliminato"</string>
</resources>
diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml
index 51f3889..1c30178 100644
--- a/core/res/res/values-iw/strings.xml
+++ b/core/res/res/values-iw/strings.xml
@@ -23,18 +23,18 @@
<string name="byteShort" msgid="8340973892742019101">"B"</string>
<string name="kilobyteShort" msgid="5973789783504771878">"KB"</string>
<string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GBâ€â€"</string>
+ <string name="gigabyteShort" msgid="3259882455212193214">"â€GBâ€â€"</string>
<string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string>
- <string name="untitled" msgid="4638956954852782576">"&gt;×œ×œ× ×›×•×ª×¨×ª&lt;"</string>
+ <string name="untitled" msgid="4638956954852782576">"â€&gt;×œ×œ× ×›×•×ª×¨×ª&lt;"</string>
<string name="ellipsis" msgid="7899829516048813237">"..."</string>
<string name="ellipsis_two_dots" msgid="1228078994866030736">"‥"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(×ין מספר טלפון)"</string>
<string name="unknownName" msgid="2277556546742746522">"(×œ× ×™×“×•×¢)"</string>
<string name="defaultVoiceMailAlphaTag" msgid="2660020990097733077">"דו×ר קולי"</string>
<string name="defaultMsisdnAlphaTag" msgid="2850889754919584674">"MSISDN1"</string>
- <string name="mmiError" msgid="5154499457739052907">"בעיה בחיבור ×ו קוד MMI ×œ× ×—×•×§×™."</string>
+ <string name="mmiError" msgid="5154499457739052907">"â€×‘×¢×™×” בחיבור ×ו קוד MMI ×œ× ×—×•×§×™."</string>
<string name="mmiFdnError" msgid="5224398216385316471">"הפעולה מוגבלת למספרי חיוג ×§×‘×•×¢×™× ×‘×œ×‘×“."</string>
<string name="serviceEnabled" msgid="8147278346414714315">"השירות הופעל."</string>
<string name="serviceEnabledFor" msgid="6856228140453471041">"השירות הופעל עבור:"</string>
@@ -42,14 +42,19 @@
<string name="serviceRegistered" msgid="6275019082598102493">"ההרשמה בוצעה בהצלחה."</string>
<string name="serviceErased" msgid="1288584695297200972">"המחיקה בוצעה בהצלחה."</string>
<string name="passwordIncorrect" msgid="7612208839450128715">"סיסמה שגויה."</string>
- <string name="mmiComplete" msgid="8232527495411698359">"MMI הושל×."</string>
- <string name="badPin" msgid="9015277645546710014">"ה-PIN הישן שהקלדת שגוי."</string>
- <string name="badPuk" msgid="5487257647081132201">"ה-PUK שהקלדת שגוי."</string>
- <string name="mismatchPin" msgid="609379054496863419">"קודי ×”-PIN שהקלדת ×œ× ×ª×•×מי×."</string>
- <string name="invalidPin" msgid="3850018445187475377">"הקלד PIN ש×ורכו 4 עד 8 ספרות."</string>
- <string name="invalidPuk" msgid="8761456210898036513">"הקלד PUK ב×ורך 8 ×ž×¡×¤×¨×™× ×ו יותר."</string>
- <string name="needPuk" msgid="919668385956251611">"כרטיס ×”-SIM נעול ב×מצעות PUK. הקלד ×ת קוד PUK כדי לבטל ×ת נעילתו."</string>
- <string name="needPuk2" msgid="4526033371987193070">"הקלד PUK2 כדי לבטל ×ת חסימת כרטיס ×”-SIM."</string>
+ <string name="mmiComplete" msgid="8232527495411698359">"â€MMI הושל×."</string>
+ <string name="badPin" msgid="9015277645546710014">"â€×”-PIN הישן שהקלדת שגוי."</string>
+ <string name="badPuk" msgid="5487257647081132201">"â€×”-PUK שהקלדת שגוי."</string>
+ <string name="mismatchPin" msgid="609379054496863419">"â€×§×•די ×”-PIN שהקלדת ×œ× ×ª×•×מי×."</string>
+ <string name="invalidPin" msgid="3850018445187475377">"â€×”קלד PIN ש×ורכו 4 עד 8 ספרות."</string>
+ <string name="invalidPuk" msgid="8761456210898036513">"â€×”קלד PUK ב×ורך 8 ×ž×¡×¤×¨×™× ×ו יותר."</string>
+ <string name="needPuk" msgid="919668385956251611">"â€×›×¨×˜×™×¡ ×”-SIM נעול ב×מצעות PUK. הקלד ×ת קוד PUK כדי לבטל ×ת נעילתו."</string>
+ <string name="needPuk2" msgid="4526033371987193070">"â€×”קלד PUK2 כדי לבטל ×ת חסימת כרטיס ×”-SIM."</string>
+ <string name="enablePin" msgid="209412020907207950">"â€×œ× הצלחת. הפעל נעילת SIM/RUIM."</string>
+ <plurals name="pinpuk_attempts">
+ <item quantity="one" msgid="6596245285809790142">"â€× ×•תר לך ניסיון <xliff:g id="NUMBER">%d</xliff:g> לפני נעילת כרטיס ×”-SIM."</item>
+ <item quantity="other" msgid="7530597808358774740">"â€× ×•תרו לך <xliff:g id="NUMBER">%d</xliff:g> ניסיונות לפני נעילת כרטיס ×”-SIM."</item>
+ </plurals>
<string name="imei" msgid="2625429890869005782">"IMEI"</string>
<string name="meid" msgid="4841221237681254195">"MEID"</string>
<string name="ClipMmi" msgid="6952821216480289285">"זיהוי מתקשר של שיחה נכנסת"</string>
@@ -58,7 +63,7 @@
<string name="CwMmi" msgid="9129678056795016867">"שיחה ממתינה"</string>
<string name="BaMmi" msgid="455193067926770581">"חסימת שיחות"</string>
<string name="PwdMmi" msgid="7043715687905254199">"שינוי סיסמה"</string>
- <string name="PinMmi" msgid="3113117780361190304">"שנה ×ת ×”-PIN"</string>
+ <string name="PinMmi" msgid="3113117780361190304">"â€×©× ×” ×ת ×”-PIN"</string>
<string name="CnipMmi" msgid="3110534680557857162">"מספר מתקשר נמצ×"</string>
<string name="CnirMmi" msgid="3062102121430548731">"מספר מתקשר חסוי"</string>
<string name="ThreeWCMmi" msgid="9051047170321190368">"שיחה ×¢× ×©×œ×•×©×” משתתפי×"</string>
@@ -76,10 +81,10 @@
<string name="RestrictedOnEmergency" msgid="6581163779072833665">"שירות ×—×™×¨×•× ×—×¡×•×."</string>
<string name="RestrictedOnNormal" msgid="4953867011389750673">"השירות הקולי חסו×."</string>
<string name="RestrictedOnAllVoice" msgid="3396963652108151260">"כל ×”×©×™×¨×•×ª×™× ×”×§×•×œ×™×™× ×—×¡×•×ž×™×."</string>
- <string name="RestrictedOnSms" msgid="8314352327461638897">"שירות SMS חסו×."</string>
+ <string name="RestrictedOnSms" msgid="8314352327461638897">"â€×©×™×¨×•ת SMS חסו×."</string>
<string name="RestrictedOnVoiceData" msgid="996636487106171320">"שירותי הקול/× ×ª×•× ×™× ×—×¡×•×ž×™×."</string>
- <string name="RestrictedOnVoiceSms" msgid="1888588152792023873">"שירותי קול/SMS חסומי×."</string>
- <string name="RestrictedOnAll" msgid="5643028264466092821">"כל ×”×©×™×¨×•×ª×™× ×©×œ קול/נתוני×/SMS חסומי×."</string>
+ <string name="RestrictedOnVoiceSms" msgid="1888588152792023873">"â€×©×™×¨×•תי קול/SMS חסומי×."</string>
+ <string name="RestrictedOnAll" msgid="5643028264466092821">"â€×›×œ ×”×©×™×¨×•×ª×™× ×©×œ קול/נתוני×/SMS חסומי×."</string>
<string name="serviceClassVoice" msgid="1258393812335258019">"Google Voice"</string>
<string name="serviceClassData" msgid="872456782077937893">"Google Data"</string>
<string name="serviceClassFAX" msgid="5566624998840486475">"פקס"</string>
@@ -114,7 +119,7 @@
<string name="httpErrorLookup" msgid="4711687456111963163">"×œ× × ×™×ª×Ÿ ×œ×ž×¦×•× ×ת כתובת ×”×תר."</string>
<string name="httpErrorUnsupportedAuthScheme" msgid="6299980280442076799">"סכימת ×ימות ×”×תר ××™× ×” נתמכת."</string>
<string name="httpErrorAuth" msgid="1435065629438044534">"×”×ימות נכשל."</string>
- <string name="httpErrorProxyAuth" msgid="1788207010559081331">"×”×ימות דרך שרת ×”-Proxy נכשל."</string>
+ <string name="httpErrorProxyAuth" msgid="1788207010559081331">"â€×”×ימות דרך שרת ×”-Proxy נכשל."</string>
<string name="httpErrorConnect" msgid="8714273236364640549">"×œ× × ×™×ª×Ÿ להתחבר לשרת."</string>
<string name="httpErrorIO" msgid="2340558197489302188">"×œ× × ×™×ª×Ÿ לתקשר ×¢× ×”×©×¨×ª. נסה שוב מ×וחר יותר."</string>
<string name="httpErrorTimeout" msgid="4743403703762883954">"חלף הזמן הקצוב של החיבור לשרת."</string>
@@ -168,11 +173,11 @@
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"מצב טיסה כבוי"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="safeMode" msgid="2788228061547930246">"מצב בטוח"</string>
- <string name="android_system_label" msgid="6577375335728551336">"מערכת Android"</string>
+ <string name="android_system_label" msgid="6577375335728551336">"â€×ž×¢×¨×›×ª Android"</string>
<string name="permgrouplab_costMoney" msgid="5429808217861460401">"×©×™×¨×•×ª×™× ×©×¢×•×œ×™× ×›×¡×£"</string>
<string name="permgroupdesc_costMoney" msgid="3293301903409869495">"ביצוע פעולות שעשויות לעלות לך כסף."</string>
<string name="permgrouplab_messages" msgid="7521249148445456662">"ההודעות שלך"</string>
- <string name="permgroupdesc_messages" msgid="7821999071003699236">"קרי××” וכתיבה בהודעות ×”-SMS, הדו×\"ל והודעות ×חרות שלך."</string>
+ <string name="permgroupdesc_messages" msgid="7821999071003699236">"â€×§×¨×™××” וכתיבה בהודעות ×”-SMS, הדו×\"ל והודעות ×חרות שלך."</string>
<string name="permgrouplab_personalInfo" msgid="3519163141070533474">"המידע ×”×ישי שלך"</string>
<string name="permgroupdesc_personalInfo" msgid="8426453129788861338">"גישה ישירה למידע עליך, המ×וחסן בכרטיס ×יש הקשר שלך."</string>
<string name="permgrouplab_socialInfo" msgid="5799096623412043791">"מידע על ×”×§×©×¨×™× ×”×—×‘×¨×ª×™×™× ×©×œ×š"</string>
@@ -182,7 +187,7 @@
<string name="permgrouplab_network" msgid="5808983377727109831">"תקשורת רשת"</string>
<string name="permgroupdesc_network" msgid="4478299413241861987">"הרש×ת גישה לתכונות רשת שונות."</string>
<string name="permgrouplab_bluetoothNetwork" msgid="1585403544162128109">"Bluetooth"</string>
- <string name="permgroupdesc_bluetoothNetwork" msgid="5625288577164282391">"גישה ×œ×ž×›×©×™×¨×™× ×•×œ×¨×©×ª×•×ª ב×מצעות Bluetooth."</string>
+ <string name="permgroupdesc_bluetoothNetwork" msgid="5625288577164282391">"â€×’ישה ×œ×ž×›×©×™×¨×™× ×•×œ×¨×©×ª×•×ª ב×מצעות Bluetooth."</string>
<string name="permgrouplab_audioSettings" msgid="8329261670151871235">"הגדרות ×ודיו"</string>
<string name="permgroupdesc_audioSettings" msgid="2641515403347568130">"שינוי הגדרות ×”×ודיו."</string>
<string name="permgrouplab_affectsBattery" msgid="6209246653424798033">"השפעה על הסוללה"</string>
@@ -228,8 +233,8 @@
<string name="permgrouplab_display" msgid="4279909676036402636">"ממשק המשתמש של ×פליקציה ×חרת"</string>
<string name="permgroupdesc_display" msgid="6051002031933013714">"השפעה על ממשק המשתמש של ×פליקציות ×חרות."</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"×חסון"</string>
- <string name="permgroupdesc_storage" product="nosdcard" msgid="7442318502446874999">"גישה ל×מצעי ×חסון מסוג USB."</string>
- <string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"גש לכרטיס SD."</string>
+ <string name="permgroupdesc_storage" product="nosdcard" msgid="7442318502446874999">"â€×’ישה ל×מצעי ×חסון מסוג USB."</string>
+ <string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"â€×’ש לכרטיס SD."</string>
<string name="permgrouplab_accessibilityFeatures" msgid="7919025602283593907">"תכונות נגישות"</string>
<string name="permgroupdesc_accessibilityFeatures" msgid="4205196881678144335">"תכונות שטכנולוגיה מסייעת יכולה לבקש."</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"×חזר תוכן של חלון"</string>
@@ -252,26 +257,26 @@
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"מ×פשר ל×פליקציה להסיר קיצורי דרך במסך דף הבית ×œ×œ× ×”×ª×¢×¨×‘×•×ª המשתמש."</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"ניתוב מחדש של שיחות יוצ×ות"</string>
<string name="permdesc_processOutgoingCalls" msgid="5331318931937402040">"מ×פשר ל×פליקציה לעבד שיחות יוצ×ות ולשנות ×ת המספר שיש לחייג. ×ישור ×–×” מ×פשר ל×פליקציה לעקוב ×חר שיחות יוצ×ות, לבצע הפניה מחדש שלהן ×ו ××£ למנוע ×ת ביצוען."</string>
- <string name="permlab_receiveSms" msgid="8673471768947895082">"קבלת הודעות טקסט (SMS)"</string>
- <string name="permdesc_receiveSms" msgid="6424387754228766939">"מ×פשר ל×פליקציה לקבל ולעבד הודעות SMS. משמעות הדבר ×”×™× ×©×”×פליקציה יכולה לעקוב ×חר הודעות שנשלחו למכשיר ×ו למחוק ×ותן מבלי להציג לך ×ותן."</string>
- <string name="permlab_receiveMms" msgid="1821317344668257098">"קבלת הודעות טקסט (MMS)"</string>
- <string name="permdesc_receiveMms" msgid="533019437263212260">"מ×פשר ל×פליקציה לקבל ולעבד הודעות MMS. משמעות הדבר ×”×™× ×©×”×פליקציה יכולה לעקוב ×חר הודעות שנשלחו למכשיר ×ו למחוק ×ותן מבלי להציג לך ×ותן."</string>
+ <string name="permlab_receiveSms" msgid="8673471768947895082">"â€×§×‘לת הודעות טקסט (SMS)"</string>
+ <string name="permdesc_receiveSms" msgid="6424387754228766939">"â€×ž×פשר ל×פליקציה לקבל ולעבד הודעות SMS. משמעות הדבר ×”×™× ×©×”×פליקציה יכולה לעקוב ×חר הודעות שנשלחו למכשיר ×ו למחוק ×ותן מבלי להציג לך ×ותן."</string>
+ <string name="permlab_receiveMms" msgid="1821317344668257098">"â€×§×‘לת הודעות טקסט (MMS)"</string>
+ <string name="permdesc_receiveMms" msgid="533019437263212260">"â€×ž×פשר ל×פליקציה לקבל ולעבד הודעות MMS. משמעות הדבר ×”×™× ×©×”×פליקציה יכולה לעקוב ×חר הודעות שנשלחו למכשיר ×ו למחוק ×ותן מבלי להציג לך ×ותן."</string>
<string name="permlab_receiveEmergencyBroadcast" msgid="1803477660846288089">"קבל שידורי חירו×"</string>
<string name="permdesc_receiveEmergencyBroadcast" msgid="848524070262431974">"מ×פשר ל×פליקציה לקבל ולעבד לשדר הודעות ×—×™×¨×•× ×ž×©×•×“×¨×•×ª. הרש××” זו זמינה רק ל×פליקציות מערכת."</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"קרי×ת הודעות שידור סלולרי"</string>
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"מ×פשר ל×פליקציה ×œ×§×¨×•× ×”×•×“×¢×•×ª שידור סלולרי שהתקבלו במכשיר שלך. התר×ות שידור סלולרי נשלחות במקומות ×ž×¡×•×™×ž×™× ×¢×œ מנת להזהיר ×ותך מפני מצבי חירו×. ×פליקציות זדוניות עשויות להפריע ×œ×‘×™×¦×•×¢×™× ×ו לפעולה של המכשיר שלך ×›×שר מתקבל שידור ×—×™×¨×•× ×¡×œ×•×œ×¨×™."</string>
- <string name="permlab_sendSms" msgid="5600830612147671529">"שלוח הודעות SMS"</string>
- <string name="permdesc_sendSms" msgid="7094729298204937667">"מ×פשר ל×פליקציה לשלוח הודעות SMS. הדבר עשוי ×œ×’×¨×•× ×œ×—×™×•×‘×™× ×‘×œ×ª×™ צפויי×. ×פליקציות זדוניות עלולות ×œ×’×¨×•× ×œ×¢×œ×•×™×•×ª על ידי שליחת הודעות ×œ×œ× ×ישורך."</string>
+ <string name="permlab_sendSms" msgid="5600830612147671529">"â€×©×œ×•×— הודעות SMS"</string>
+ <string name="permdesc_sendSms" msgid="7094729298204937667">"â€×ž×פשר ל×פליקציה לשלוח הודעות SMS. הדבר עשוי ×œ×’×¨×•× ×œ×—×™×•×‘×™× ×‘×œ×ª×™ צפויי×. ×פליקציות זדוניות עלולות ×œ×’×¨×•× ×œ×¢×œ×•×™×•×ª על ידי שליחת הודעות ×œ×œ× ×ישורך."</string>
<string name="permlab_sendRespondViaMessageRequest" msgid="8713889105305943200">"שליחת ×ירועי \'תגובה ב×מצעות הודעה\'"</string>
<string name="permdesc_sendRespondViaMessageRequest" msgid="7107648548468778734">"מ×פשר ל×פליקציה לשלוח בקשות ל×פליקציות ××—×¨×™× ×©×œ העברת הודעות כדי לטפל ב×ירועי \'תגובה ב×מצעות הודעה\' עבור שיחות נכנסות."</string>
- <string name="permlab_readSms" msgid="8745086572213270480">"קרי×ת הודעות הטקסט שלך (SMS ×ו MMS)"</string>
- <string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"מ×פשר ל×פליקציה ×œ×§×¨×•× ×”×•×“×¢×•×ª SMS המ×וחסנות בט×בלט ×ו בכרטיס ×”-SIM. דבר ×–×” מתיר ל×פליקציה ×œ×§×¨×•× ×ת כל הודעות ×”-SMS, ×œ×œ× ×”×ª×—×©×‘×•×ª בתוכן ×ו בסודיות."</string>
- <string name="permdesc_readSms" product="default" msgid="3695967533457240550">"מ×פשר ל×פליקציה ×œ×§×¨×•× ×”×•×“×¢×•×ª SMS המ×וחסנות בטלפון ×ו בכרטיס ×”-SIM. דבר ×–×” מתיר ל×פליקציה ×œ×§×¨×•× ×ת כל הודעות ×”-SMS, ×œ×œ× ×”×ª×—×©×‘×•×ª בתוכן ×ו בסודיות."</string>
- <string name="permlab_writeSms" msgid="3216950472636214774">"עריכת הודעות הטקסט שלך (SMS ×ו MMS)"</string>
- <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"מ×פשר ל×פליקציה לכתוב להודעות SMS המ×וחסנות בט×בלט ×ו בכרטיס ×”-SIM שלך. ×פליקציות זדוניות עלולות למחוק ×ת ההודעות שלך."</string>
- <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"מ×פשר ל×פליקציה לכתוב להודעות SMS המ×וחסנות בטלפון ×ו בכרטיס ×”-SIM שלך. ×פליקציות זדוניות עלולות למחוק ×ת ההודעות שלך."</string>
- <string name="permlab_receiveWapPush" msgid="5991398711936590410">"קבלת הודעות טקסט (WAP)"</string>
- <string name="permdesc_receiveWapPush" msgid="748232190220583385">"מ×פשר ל×פליקציה לקבל ולעבד הודעות WAP. ×ישור ×–×” כולל ×ת היכולת לעקוב ×חר הודעות שנשלחו ×ליך ולמחוק ×ותן מבלי להציג לך ×ותן."</string>
+ <string name="permlab_readSms" msgid="8745086572213270480">"â€×§×¨×™×ת הודעות הטקסט שלך (SMS ×ו MMS)"</string>
+ <string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"â€×ž×פשר ל×פליקציה ×œ×§×¨×•× ×”×•×“×¢×•×ª SMS המ×וחסנות בט×בלט ×ו בכרטיס ×”-SIM. דבר ×–×” מתיר ל×פליקציה ×œ×§×¨×•× ×ת כל הודעות ×”-SMS, ×œ×œ× ×”×ª×—×©×‘×•×ª בתוכן ×ו בסודיות."</string>
+ <string name="permdesc_readSms" product="default" msgid="3695967533457240550">"â€×ž×פשר ל×פליקציה ×œ×§×¨×•× ×”×•×“×¢×•×ª SMS המ×וחסנות בטלפון ×ו בכרטיס ×”-SIM. דבר ×–×” מתיר ל×פליקציה ×œ×§×¨×•× ×ת כל הודעות ×”-SMS, ×œ×œ× ×”×ª×—×©×‘×•×ª בתוכן ×ו בסודיות."</string>
+ <string name="permlab_writeSms" msgid="3216950472636214774">"â€×¢×¨×™×›×ª הודעות הטקסט שלך (SMS ×ו MMS)"</string>
+ <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"â€×ž×פשר ל×פליקציה לכתוב להודעות SMS המ×וחסנות בט×בלט ×ו בכרטיס ×”-SIM שלך. ×פליקציות זדוניות עלולות למחוק ×ת ההודעות שלך."</string>
+ <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"â€×ž×פשר ל×פליקציה לכתוב להודעות SMS המ×וחסנות בטלפון ×ו בכרטיס ×”-SIM שלך. ×פליקציות זדוניות עלולות למחוק ×ת ההודעות שלך."</string>
+ <string name="permlab_receiveWapPush" msgid="5991398711936590410">"â€×§×‘לת הודעות טקסט (WAP)"</string>
+ <string name="permdesc_receiveWapPush" msgid="748232190220583385">"â€×ž×פשר ל×פליקציה לקבל ולעבד הודעות WAP. ×ישור ×–×” כולל ×ת היכולת לעקוב ×חר הודעות שנשלחו ×ליך ולמחוק ×ותן מבלי להציג לך ×ותן."</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"×חזור ×פליקציות פעילות"</string>
<string name="permdesc_getTasks" msgid="7454215995847658102">"מ×פשר ל×פליקציה ל×חזר מידע לגבי משימות הפועלות כרגע ושפעלו ל×חרונה. ייתכן שהדבר יתיר ל×פליקציה לגלות מידע לגבי ×”×פליקציות שבהן נעשה שימוש במכשיר."</string>
<string name="permlab_interactAcrossUsers" msgid="7114255281944211682">"×ינטר×קציה בין משתמשי×"</string>
@@ -313,7 +318,7 @@
<string name="permlab_retrieve_window_info" msgid="8532295199112519378">"×חזר מידע חלון"</string>
<string name="permdesc_retrieve_window_info" msgid="4998836370424186849">"מ×פשר ל×פליקציה ל×חזר מידע לגבי החלונות ממנהל החלונות. ×פליקציות זדוניות עשויות ל×חזר מידע המיועד לשימוש מערכת פנימי."</string>
<string name="permlab_filter_events" msgid="8675535648807427389">"סנן ×ירועי×"</string>
- <string name="permdesc_filter_events" msgid="8006236315888347680">"מ×פשר ל×פליקציה ×œ×¨×©×•× ×ž×¡× ×Ÿ קלט שמסנן ×ת ×”×–×¨× ×©×œ כל ×ירועי המשתמש לפני ×©×”× × ×©×œ×—×™×. ×פליקציה זדונית עשויה לשלוט ב-UI של המערכת ×œ×œ× ×”×ª×¢×¨×‘×•×ª משתמש."</string>
+ <string name="permdesc_filter_events" msgid="8006236315888347680">"â€×ž×פשר ל×פליקציה ×œ×¨×©×•× ×ž×¡× ×Ÿ קלט שמסנן ×ת ×”×–×¨× ×©×œ כל ×ירועי המשתמש לפני ×©×”× × ×©×œ×—×™×. ×פליקציה זדונית עשויה לשלוט ב-UI של המערכת ×œ×œ× ×”×ª×¢×¨×‘×•×ª משתמש."</string>
<string name="permlab_magnify_display" msgid="5973626738170618775">"הגדלת תצוגה"</string>
<string name="permdesc_magnify_display" msgid="7121235684515003792">"מ×פשר ל×פליקציה להגדיל ×ת התוכן של תצוגה. ×פליקציות זדוניות עלולות לשנות ×ת תוכן התצוגה כך שהמכשיר יהפוך לבלתי שמיש."</string>
<string name="permlab_shutdown" msgid="7185747824038909016">"כיבוי חלקי"</string>
@@ -326,10 +331,10 @@
<string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"מ×פשר ל×פליקציה לנהל מעקב ×חר ×”×ופן שבו המערכת מפעילה פעילויות, ולשלוט בו. ×פליקציות זדוניות עלולות לסכן ×ת המערכת כולה. הרש××” זו ××™× ×” נחוצה לשימוש רגיל, ××œ× ×œ×¤×™×ª×•×— בלבד."</string>
<string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"שלח שידור שהוסר מחבילה"</string>
<string name="permdesc_broadcastPackageRemoved" msgid="6621901216207931089">"מ×פשר ל×פליקציה לשדר התר××” על כך שחבילת ×פליקציות הוסרה. ×פליקציות זדוניות עלולות להשתמש בכך כדי לסגור ×פליקציות פעילות ×חרות."</string>
- <string name="permlab_broadcastSmsReceived" msgid="5689095009030336593">"שלח שידור שהתקבל ב-SMS"</string>
- <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"מ×פשר ל×פליקציה לשדר התר××” על כך שהתקבלה הודעת SMS. ×פליקציות זדוניות עלולות להשתמש בכך כדי לזייף הודעות SMS נכנסות."</string>
- <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"שלח שידור שהתקבל ב×מצעות WAP-PUSH"</string>
- <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"מ×פשר ל×פליקציה לשדר התר××” על כך שהתקבלה הודעה מסוג WAP PUSH. ×פליקציות זדוניות עלולות להשתמש בכך כדי לזייף קבלה של הודעות MMS ×ו כדי להחליף בחש××™ ×ת התוכן של דף ×ינטרנט כלשהו בגירס×ות זדוניות."</string>
+ <string name="permlab_broadcastSmsReceived" msgid="5689095009030336593">"â€×©×œ×— שידור שהתקבל ב-SMS"</string>
+ <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"â€×ž×פשר ל×פליקציה לשדר התר××” על כך שהתקבלה הודעת SMS. ×פליקציות זדוניות עלולות להשתמש בכך כדי לזייף הודעות SMS נכנסות."</string>
+ <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"â€×©×œ×— שידור שהתקבל ב×מצעות WAP-PUSH"</string>
+ <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"â€×ž×פשר ל×פליקציה לשדר התר××” על כך שהתקבלה הודעה מסוג WAP PUSH. ×פליקציות זדוניות עלולות להשתמש בכך כדי לזייף קבלה של הודעות MMS ×ו כדי להחליף בחש××™ ×ת התוכן של דף ×ינטרנט כלשהו בגירס×ות זדוניות."</string>
<string name="permlab_setProcessLimit" msgid="2451873664363662666">"הגבל ×ת מספר ×”×ª×”×œ×™×›×™× ×”×¤×•×¢×œ×™×"</string>
<string name="permdesc_setProcessLimit" msgid="7318061314040879542">"מ×פשר ל×פליקציה לשלוט על המספר המרבי של ×ª×”×œ×™×›×™× ×©×™×¤×¢×œ×•. הרש××” זו ×œ×¢×•×œ× ××™× ×” נחוצה ל×פליקציות רגילי×."</string>
<string name="permlab_setAlwaysFinish" msgid="550958507798796965">"×ילוץ סגירה של ×פליקציות ברקע"</string>
@@ -353,7 +358,7 @@
<string name="permlab_setAnimationScale" msgid="2805103241153907174">"שנה ×ת מהירות ההנפשה הגלובלית"</string>
<string name="permdesc_setAnimationScale" msgid="7690063428924343571">"הרש××” זו מ×פשרת ל×פליקציה לשנות ×ת מהירות ההנפשה הכללית (הנפשות מהירות ×ו ×יטיות יותר) בכל עת."</string>
<string name="permlab_manageAppTokens" msgid="1286505717050121370">"ניהול ×סימוני ×פליקציות"</string>
- <string name="permdesc_manageAppTokens" msgid="8043431713014395671">"מ×פשר ל×פליקציה ליצור ולנהל ××¡×™×ž×•× ×™× ×ž×©×œ×”×, תוך עקיפת סידור ×”-Z הרגיל שלה×. הרש××” זו ×œ×¢×•×œ× ××™× ×” נחוצה ל×פליקציות רגילי×."</string>
+ <string name="permdesc_manageAppTokens" msgid="8043431713014395671">"â€×ž×פשר ל×פליקציה ליצור ולנהל ××¡×™×ž×•× ×™× ×ž×©×œ×”×, תוך עקיפת סידור ×”-Z הרגיל שלה×. הרש××” זו ×œ×¢×•×œ× ××™× ×” נחוצה ל×פליקציות רגילי×."</string>
<string name="permlab_freezeScreen" msgid="4708181184441880175">"הקפ×ת מסך"</string>
<string name="permdesc_freezeScreen" msgid="8558923789222670064">"מ×פשר ל×פליקציה ×œ×”×§×¤×™× ×‘×ופן זמני ×ת המסך למעבר למסך מל×."</string>
<string name="permlab_injectEvents" msgid="1378746584023586600">"לחץ על ×ž×§×©×™× ×•×©×œ×•×˜ בלחצני×"</string>
@@ -369,16 +374,16 @@
<string name="permdesc_bindPrintService" msgid="7960067623209111135">"ההרש××” הזו מ×פשרת ×œ×‘×¢×œ×™× ×œ×‘×¦×¢ ×יגוד לממשק הרמה העליונה של שירות הדפסה. ×œ×¢×•×œ× ×œ× ×מורה להיות נחוצה עבור ×פליקציות רגילות."</string>
<string name="permlab_bindPrintSpoolerService" msgid="6807762783744125954">"×יגוד לשירות הדפסה"</string>
<string name="permdesc_bindPrintSpoolerService" msgid="3680552285933318372">"מ×פשרת ×œ×‘×¢×œ×™× ×œ×‘×¦×¢ ×יגוד לממשק ברמה העליונה של שירות הדפסה. ×œ×¢×•×œ× ×œ× ×מורה להיות נחוצה עבור ×פליקציות רגילות."</string>
- <string name="permlab_bindNfcService" msgid="2752731300419410724">"×יגוד לשירות NFC"</string>
- <string name="permdesc_bindNfcService" msgid="6120647629174066862">"מ×פשרת ×œ×‘×¢×œ×™× ×œ×גד ×ת ×”×פליקציות המחקות כרטיסיות NFC. ×œ×¢×•×œ× ×œ× ×מורה להיות נחוצה עבור ×פליקציות רגילות."</string>
+ <string name="permlab_bindNfcService" msgid="2752731300419410724">"â€×יגוד לשירות NFC"</string>
+ <string name="permdesc_bindNfcService" msgid="6120647629174066862">"â€×ž×פשרת ×œ×‘×¢×œ×™× ×œ×גד ×ת ×”×פליקציות המחקות כרטיסיות NFC. ×œ×¢×•×œ× ×œ× ×מורה להיות נחוצה עבור ×פליקציות רגילות."</string>
<string name="permlab_bindTextService" msgid="7358378401915287938">"הכפפה לשירות טקסט"</string>
- <string name="permdesc_bindTextService" msgid="8151968910973998670">"מ×פשר למשתמש ליצור ×יגוד לממשק הרמה העליונה של שירות טקסט (למשל, SpellCheckerService). הרש××” זו ×œ×¢×•×œ× ××™× ×” נחוצה ל×פליקציות רגילי×."</string>
- <string name="permlab_bindVpnService" msgid="4708596021161473255">"×גד לשירות VPN"</string>
- <string name="permdesc_bindVpnService" msgid="2067845564581693905">"מ×פשר למשתמש לבצע ×יגוד לממשק ברמה עליונה של שירות VPN. הרש××” זו ×œ×¢×•×œ× ××™× ×” נחוצה ל×פליקציות רגילי×."</string>
+ <string name="permdesc_bindTextService" msgid="8151968910973998670">"â€×ž×פשר למשתמש ליצור ×יגוד לממשק הרמה העליונה של שירות טקסט (למשל, SpellCheckerService). הרש××” זו ×œ×¢×•×œ× ××™× ×” נחוצה ל×פליקציות רגילי×."</string>
+ <string name="permlab_bindVpnService" msgid="4708596021161473255">"â€×גד לשירות VPN"</string>
+ <string name="permdesc_bindVpnService" msgid="2067845564581693905">"â€×ž×פשר למשתמש לבצע ×יגוד לממשק ברמה עליונה של שירות VPN. הרש××” זו ×œ×¢×•×œ× ××™× ×” נחוצה ל×פליקציות רגילי×."</string>
<string name="permlab_bindWallpaper" msgid="8716400279937856462">"קשור לטפט"</string>
<string name="permdesc_bindWallpaper" msgid="7108428692595491668">"מ×פשר למשתמש לבצע ×יגוד לממשק הרמה העליונה של טפט. הרש××” זו ×œ×¢×•×œ× ××™× ×” נחוצה ל×פליקציות רגילי×."</string>
- <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"הכפפה לשירות Widget"</string>
- <string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"מ×פשר למשתמש לבצע ×יגוד לממשק הרמה העליונה של שירות Widget. הרש××” זו ×œ×¢×•×œ× ××™× ×” נחוצה ל×פליקציות רגילי×."</string>
+ <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"â€×”כפפה לשירות Widget"</string>
+ <string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"â€×ž×פשר למשתמש לבצע ×יגוד לממשק הרמה העליונה של שירות Widget. הרש××” זו ×œ×¢×•×œ× ××™× ×” נחוצה ל×פליקציות רגילי×."</string>
<string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"×§×™×™× ×ינטר×קציה ×¢× ×ž× ×”×œ המכשיר"</string>
<string name="permdesc_bindDeviceAdmin" msgid="569715419543907930">"מ×פשר למשתמש לשלוח כוונות למנהל התקני×. הרש××” זו ×œ×¢×•×œ× ××™× ×” נחוצה ל×פליקציות רגילי×."</string>
<string name="permlab_manageDeviceAdmins" msgid="4248828900045808722">"הוספה ×ו הסרה של מנהלי מכשיר"</string>
@@ -389,13 +394,13 @@
<string name="permdesc_setPointerSpeed" msgid="6866563234274104233">"מ×פשר ל×פליקציה לשנות ×ת המהירות של מצביע העכבר ×ו לוח המגע בכל עת. ×פליקציות רגילות ×œ× ××ž×•×¨×™× ×œ×¢×•×œ× ×œ×”×–×“×§×§ להרש××” זו."</string>
<string name="permlab_setKeyboardLayout" msgid="4778731703600909340">"שנה ×ת פריסת המקלדת"</string>
<string name="permdesc_setKeyboardLayout" msgid="8480016771134175879">"מ×פשר ל×פליקציה לשנות ×ת פריסת המקלדת. הרש××” זו ×œ×¢×•×œ× ××™× ×” ×מורה להיות נחוצה עבור ×פליקציות רגילות."</string>
- <string name="permlab_signalPersistentProcesses" msgid="4539002991947376659">"שליחת ×ותות Linux ל×פליקציות"</string>
+ <string name="permlab_signalPersistentProcesses" msgid="4539002991947376659">"â€×©×œ×™×—ת ×ותות Linux ל×פליקציות"</string>
<string name="permdesc_signalPersistentProcesses" msgid="4896992079182649141">"מ×פשר ל×פליקציה לבקש שה×ות שנקלט יישלח לכל ×”×ª×”×œ×™×›×™× ×”×ž×ª×ž×©×›×™×."</string>
<string name="permlab_persistentActivity" msgid="8841113627955563938">"הגדרת ×”×פליקציה לפעול תמיד"</string>
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"מ×פשר ל×פליקציה להפוך ×—×œ×§×™× ×ž×ž× ×• ×œ×§×‘×•×¢×™× ×‘×–×™×›×¨×•×Ÿ. פעולה זו עשויה להגביל ×ת הזיכרון הזמין ל×פליקציות ××—×¨×™× ×•×œ×”×ט ×ת פעולת הט×בלט."</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"מ×פשר ל×פליקציה להפוך ×—×œ×§×™× ×ž×ž× ×• ×œ×§×‘×•×¢×™× ×‘×–×™×›×¨×•×Ÿ. פעולה זו עשויה להגביל ×ת הזיכרון הזמין ל×פליקציות ××—×¨×™× ×•×œ×”×ט ×ת פעולת הטלפון."</string>
<string name="permlab_deletePackages" msgid="184385129537705938">"מחיקת ×פליקציות"</string>
- <string name="permdesc_deletePackages" msgid="7411480275167205081">"מ×פשר ל×פליקציה למחוק חבילות Android. ×פליקציות זדוניות עלולות להשתמש בכך כדי למחוק ×פליקציות חשובות."</string>
+ <string name="permdesc_deletePackages" msgid="7411480275167205081">"â€×ž×פשר ל×פליקציה למחוק חבילות Android. ×פליקציות זדוניות עלולות להשתמש בכך כדי למחוק ×פליקציות חשובות."</string>
<string name="permlab_clearAppUserData" msgid="274109191845842756">"מחיקת × ×ª×•× ×™× ×©×œ ×פליקציות ×חרות"</string>
<string name="permdesc_clearAppUserData" msgid="4625323684125459488">"מ×פשר ל×פליקציה לנקות ×ת נתוני המשתמש."</string>
<string name="permlab_deleteCacheFiles" msgid="3128665571837408675">"מחיקת ×§×‘×¦×™× ×©×ž×•×¨×™× ×©×œ ×פליקציות ×חרות"</string>
@@ -403,7 +408,7 @@
<string name="permlab_getPackageSize" msgid="7472921768357981986">"מדידת נפח ×”×חסון של ×פליקציות"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"מ×פשר ל×פליקציה ל×חזר ×ת הקוד, הנתוני×, וגודלי ×”×§×‘×¦×™× ×”×©×ž×•×¨×™× ×©×œ×•"</string>
<string name="permlab_installPackages" msgid="2199128482820306924">"התקנה ישירה של ×פליקציות"</string>
- <string name="permdesc_installPackages" msgid="5628530972548071284">"מ×פשר ל×פליקציה להתקין חבילות Android חדשות ×ו מעודכנות. ×פליקציות זדוניות עלולות להשתמש בכך כדי להוסיף ×פליקציות חדשות בעלי הרש×ות ×–×” כדי להוסיף ×פליקציות חדשות ×¢× ×”×¨×©×ות רבות-עוצמה ×קר×יות."</string>
+ <string name="permdesc_installPackages" msgid="5628530972548071284">"â€×ž×פשר ל×פליקציה להתקין חבילות Android חדשות ×ו מעודכנות. ×פליקציות זדוניות עלולות להשתמש בכך כדי להוסיף ×פליקציות חדשות בעלי הרש×ות ×–×” כדי להוסיף ×פליקציות חדשות ×¢× ×”×¨×©×ות רבות-עוצמה ×קר×יות."</string>
<string name="permlab_clearAppCache" msgid="7487279391723526815">"מחיקת כל ×”× ×ª×•× ×™× ×‘×§×‘×¦×™× ×©×ž×•×¨×™× ×©×œ ×פליקציות"</string>
<string name="permdesc_clearAppCache" product="tablet" msgid="8974640871945434565">"מ×פשר ל×פליקציה לשחרר שטח ×חסון בט×בלט על ידי מחיקת ×§×‘×¦×™× ×‘×¡×¤×¨×™×•×ª ×”×§×‘×¦×™× ×”×©×ž×•×¨×™× ×©×œ ×פליקציות ×חרות. הדבר עשוי ×œ×’×¨×•× ×œ×”×¤×¢×œ×” של ×פליקציות ×חרות להיות ×יטית יותר מכיוון ×©×¢×œ×™×”× ×œ×חזר מחדש ×ת הנתוני×."</string>
<string name="permdesc_clearAppCache" product="default" msgid="2459441021956436779">"מ×פשר ל×פליקציה לפנות שטח ×חסון בטלפון על ידי מחיקת ×§×‘×¦×™× ×‘×¡×¤×¨×™×•×ª ×”×§×‘×¦×™× ×”×©×ž×•×¨×™× ×©×œ ×פליקציות ×חרות. הדבר עשוי ×œ×’×¨×•× ×œ×”×¤×¢×œ×” של ×פליקציות ×חרות להיות ×יטית יותר מכיוון ×©×¢×œ×™×”× ×œ×חזר מחדש ×ת הנתוני×."</string>
@@ -415,9 +420,9 @@
<string name="permlab_anyCodecForPlayback" msgid="715805555823881818">"שימוש בכל מפענח מדיה ×©×”×•× ×œ×”×¤×¢×œ×”"</string>
<string name="permdesc_anyCodecForPlayback" msgid="8283912488433189010">"הרש××” זו מ×פשרת ל×פליקציה להשתמש בכל מפענח מדיה מותקן כדי לבצע פענוח להשמעה."</string>
<string name="permlab_manageCaCertificates" msgid="1678391896786882014">"ניהול פרטי כניסה מהימני×"</string>
- <string name="permdesc_manageCaCertificates" msgid="4015644047196937014">"מ×פשרת ל×פליקציה להתקין ולהסיר ×ישורי CA כפרטי כניסה מהימני×."</string>
- <string name="permlab_diagnostic" msgid="8076743953908000342">"קר×/כתוב במש××‘×™× ×‘×‘×¢×œ×•×ª diag"</string>
- <string name="permdesc_diagnostic" msgid="6608295692002452283">"מ×פשר ל×פליקציה ×œ×§×¨×•× ×•×œ×›×ª×•×‘ בכל מש×ב שבבעלות קבוצת ×”-diag; לדוגמה, ×§×‘×¦×™× ×‘-‎/dev. פעולה זו עשויה להשפיע על היציבות וה×בטחה של המערכת. ×פשרות זו צריכה לשמש רק ×ת היצרן ×ו המפעיל, לצורך ××‘×—×•× ×™× ×¡×¤×¦×™×¤×™×™× ×œ×—×•×ž×¨×”."</string>
+ <string name="permdesc_manageCaCertificates" msgid="4015644047196937014">"â€×ž×פשרת ל×פליקציה להתקין ולהסיר ×ישורי CA כפרטי כניסה מהימני×."</string>
+ <string name="permlab_diagnostic" msgid="8076743953908000342">"â€×§×¨×/כתוב במש××‘×™× ×‘×‘×¢×œ×•×ª diag"</string>
+ <string name="permdesc_diagnostic" msgid="6608295692002452283">"â€×ž×פשר ל×פליקציה ×œ×§×¨×•× ×•×œ×›×ª×•×‘ בכל מש×ב שבבעלות קבוצת ×”-diag; לדוגמה, ×§×‘×¦×™× ×‘-‎/dev. פעולה זו עשויה להשפיע על היציבות וה×בטחה של המערכת. ×פשרות זו צריכה לשמש רק ×ת היצרן ×ו המפעיל, לצורך ××‘×—×•× ×™× ×¡×¤×¦×™×¤×™×™× ×œ×—×•×ž×¨×”."</string>
<string name="permlab_changeComponentState" msgid="6335576775711095931">"הפעלה ×ו השבתה של רכיבי ×פליקציות"</string>
<string name="permdesc_changeComponentState" product="tablet" msgid="8887435740982237294">"מ×פשר ל×פליקציה לשנות ×ת מצב ההפעלה של רכיב ב×פליקציה ×חרת. ×פליקציות זדוניות עלולות להשתמש בכך כדי להשבית יכולות חשובות של הט×בלט. יש לנהוג בהרש××” זו בזהירות, מכיוון ×©×”×™× ×™×›×•×œ×” ×œ×”×‘×™× ×¨×›×™×‘×™ ×פליקציות למצב ×œ× ×©×ž×™×©, ×œ× ×¢×§×‘×™ ×ו ×œ× ×™×¦×™×‘."</string>
<string name="permdesc_changeComponentState" product="default" msgid="1827232484416505615">"מ×פשר ל×פליקציה לשנות ×ת מצב ההפעלה של רכיב ב×פליקציה ×חרת. ×פליקציות זדוניות עלולות להשתמש בכך כדי להשבית יכולות חשובות של הטלפון. יש לנהוג בהרש××” זו בזהירות, מכיוון ×©×”×™× ×™×›×•×œ×” ×œ×”×‘×™× ×¨×›×™×‘×™ ×פליקציות למצב ×œ× ×©×ž×™×©, ×œ× ×¢×§×‘×™ ×ו ×œ× ×™×¦×™×‘."</string>
@@ -429,8 +434,8 @@
<string name="permdesc_writeSettings" msgid="7775723441558907181">"מ×פשר ל×פליקציה לשנות ×ת נתוני הגדרות המערכת. ×פליקציות זדוניות עלולות לשבש ×ת תצורת המערכת שלך."</string>
<string name="permlab_writeSecureSettings" msgid="204676251876718288">"שנה ×ת הגדרות המערכת המ×ובטחת"</string>
<string name="permdesc_writeSecureSettings" msgid="8159535613020137391">"מ×פשר ל×פליקציה לשנות ×ת נתוני ההגדרות המ××•×‘×˜×—×™× ×©×œ המערכת. ×œ× ×ž×™×•×¢×“ לשימוש על ידי ×פליקציות רגילות."</string>
- <string name="permlab_writeGservices" msgid="2149426664226152185">"שנה ×ת מפת ×”×©×™×¨×•×ª×™× ×©×œ Google"</string>
- <string name="permdesc_writeGservices" msgid="1287309437638380229">"מ×פשר ל×פליקציה לשנות ×ת מפת שירותי Google. ×œ× ×ž×™×•×¢×“ לשימוש על ידי ×פליקציות רגילות."</string>
+ <string name="permlab_writeGservices" msgid="2149426664226152185">"â€×©× ×” ×ת מפת ×”×©×™×¨×•×ª×™× ×©×œ Google"</string>
+ <string name="permdesc_writeGservices" msgid="1287309437638380229">"â€×ž×פשר ל×פליקציה לשנות ×ת מפת שירותי Google. ×œ× ×ž×™×•×¢×“ לשימוש על ידי ×פליקציות רגילות."</string>
<string name="permlab_receiveBootCompleted" msgid="5312965565987800025">"הפעלה בעת ×תחול"</string>
<string name="permdesc_receiveBootCompleted" product="tablet" msgid="7390304664116880704">"מ×פשר ל×פליקציה להפעיל ×ת עצמו מיד ×¢× ×¡×™×•× ×ª×”×œ×™×š ×”×תחול של המערכת. ×ž×©×•× ×›×š הפעלת הט×בלט עשויה להת×רך וה×פליקציה עלולה לה×ט ×ת הפעילות הכללית של הט×בלט, בשל פעילותה התמידית."</string>
<string name="permdesc_receiveBootCompleted" product="default" msgid="513950589102617504">"מ×פשר ל×פליקציה להפעיל ×ת עצמו מיד ×¢× ×”×©×œ×ž×ª תהליך ×”×תחול של המערכת. ×ž×©×•× ×›×š הפעלת הטלפון עשויה להת×רך וה×פליקציה עלולה לה×ט ×ת הפעילות הכללית של הטלפון, בשל פעילותה התמידית."</string>
@@ -464,23 +469,25 @@
<string name="permdesc_writeCalendar" product="tablet" msgid="6679035520113668528">"מ×פשר ל×פליקציה להוסיף, להסיר ולשנות ××™×¨×•×¢×™× ×©×תה יכול לשנות בט×בלט, כולל ×לה של ×—×‘×¨×™× ×ו ×¢×ž×™×ª×™× ×œ×¢×‘×•×“×”. הדבר עשוי להתיר ל×פליקציה לשלוח הודעות הנר×ות ×›×ילו שנשלחו מבעלי לוח שנה ×ו לשנות ××™×¨×•×¢×™× ×œ×œ× ×™×“×™×¢×ª הבעלי×."</string>
<string name="permdesc_writeCalendar" product="default" msgid="2324469496327249376">"מ×פשר ל×פליקציה להוסיף, להסיר ולשנות ××™×¨×•×¢×™× ×©×תה יכול לשנות בטלפון, כולל ×לה של ×—×‘×¨×™× ×ו ×¢×ž×™×ª×™× ×œ×¢×‘×•×“×”. הדבר עשוי להתיר ל×פליקציה לשלוח הודעות הנר×ות ×›×ילו שנשלחו מבעלי לוח שנה ×ו לשנות ××™×¨×•×¢×™× ×œ×œ× ×™×“×™×¢×ª הבעלי×."</string>
<string name="permlab_accessMockLocation" msgid="8688334974036823330">"צור מקורות ×ž×™×§×•× ×ž×“×•×ž×™× ×œ×¦×•×¨×š בדיקה"</string>
- <string name="permdesc_accessMockLocation" msgid="5808711039482051824">"צור מקורות ×ž×™×§×•× ×ž×“×•×ž×™× ×œ×‘×“×™×§×”, ×ו התקן ספק ×ž×™×§×•× ×—×“×©. פעולה זו מ×פשרת ל×פליקציה לעקוף ×ת ×”×ž×™×§×•× ×•/×ו הסטטוס ×”×ž×•×—×–×¨×™× ×¢×œ ידי מקורות ×ž×™×§×•× ××—×¨×™× ×›×ž×• GPS ×ו ספקי מיקו×."</string>
+ <string name="permdesc_accessMockLocation" msgid="5808711039482051824">"â€×¦×•ר מקורות ×ž×™×§×•× ×ž×“×•×ž×™× ×œ×‘×“×™×§×”, ×ו התקן ספק ×ž×™×§×•× ×—×“×©. פעולה זו מ×פשרת ל×פליקציה לעקוף ×ת ×”×ž×™×§×•× ×•/×ו הסטטוס ×”×ž×•×—×–×¨×™× ×¢×œ ידי מקורות ×ž×™×§×•× ××—×¨×™× ×›×ž×• GPS ×ו ספקי מיקו×."</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"גישה לפקודות ספק ×ž×™×§×•× × ×•×¡×¤×•×ª"</string>
- <string name="permdesc_accessLocationExtraCommands" msgid="5945166642335800763">"מ×פשר ל×פליקציה לגשת לפקודות נוספות של ספק שירות המיקו×. ×ישור ×–×” עשוי ל×פשר ל×פליקציה לשבש ×ת פעולת ×”-GPS ×ו מקורות ×ž×™×§×•× ×חרי×."</string>
+ <string name="permdesc_accessLocationExtraCommands" msgid="5945166642335800763">"â€×ž×פשר ל×פליקציה לגשת לפקודות נוספות של ספק שירות המיקו×. ×ישור ×–×” עשוי ל×פשר ל×פליקציה לשבש ×ת פעולת ×”-GPS ×ו מקורות ×ž×™×§×•× ×חרי×."</string>
<string name="permlab_installLocationProvider" msgid="6578101199825193873">"הרש××” להתקין ספק מיקו×"</string>
- <string name="permdesc_installLocationProvider" msgid="9066146120470591509">"צור מקורות ×ž×™×§×•× ×ž×“×•×ž×™× ×œ×‘×“×™×§×”, ×ו התקן ספק ×ž×™×§×•× ×—×“×©. פעולה זו מ×פשרת ל×פליקציה לעקוף ×ת ×”×ž×™×§×•× ×•/×ו הסטטוס ×”×ž×•×—×–×¨×™× ×¢×œ ידי מקורות ×ž×™×§×•× ××—×¨×™× ×›×ž×• GPS ×ו ספקי מיקו×."</string>
- <string name="permlab_accessFineLocation" msgid="1191898061965273372">"×ž×™×§×•× ×ž×“×•×™×§ (מבוסס GPS ורשת)"</string>
- <string name="permdesc_accessFineLocation" msgid="5295047563564981250">"מ×פשר ל×פליקציה לקבל ×ת ×”×ž×™×§×•× ×”×ž×“×•×™×§ שלך ב×מצעות מערכת ×”×ž×™×§×•× ×”×’×œ×•×‘×œ×™×ª (GPS) ×ו מקורות ×ž×™×§×•× ×‘×¨×©×ª כגון ×נטנות סלולריות ו-Wi-Fi. שירותי ×ž×™×§×•× ×לה ×—×™×™×‘×™× ×œ×”×™×•×ª ×ž×•×¤×¢×œ×™× ×•× ×’×™×©×™× ×œ×ž×›×©×™×¨ שלך כדי שה×פליקציה תשתמש בה×. ייתכן ש×פליקציות יעשו בכך שימוש כדי לקבוע היכן ×תה × ×ž×¦× ×•×œ×’×¨×•× ×œ×¦×¨×™×›×ª סוללה מוגברת."</string>
+ <string name="permdesc_installLocationProvider" msgid="9066146120470591509">"â€×¦×•ר מקורות ×ž×™×§×•× ×ž×“×•×ž×™× ×œ×‘×“×™×§×”, ×ו התקן ספק ×ž×™×§×•× ×—×“×©. פעולה זו מ×פשרת ל×פליקציה לעקוף ×ת ×”×ž×™×§×•× ×•/×ו הסטטוס ×”×ž×•×—×–×¨×™× ×¢×œ ידי מקורות ×ž×™×§×•× ××—×¨×™× ×›×ž×• GPS ×ו ספקי מיקו×."</string>
+ <string name="permlab_accessFineLocation" msgid="1191898061965273372">"â€×ž×™×§×•× ×ž×“×•×™×§ (מבוסס GPS ורשת)"</string>
+ <string name="permdesc_accessFineLocation" msgid="5295047563564981250">"â€×ž×פשר ל×פליקציה לקבל ×ת ×”×ž×™×§×•× ×”×ž×“×•×™×§ שלך ב×מצעות מערכת ×”×ž×™×§×•× ×”×’×œ×•×‘×œ×™×ª (GPS) ×ו מקורות ×ž×™×§×•× ×‘×¨×©×ª כגון ×נטנות סלולריות ו-Wi-Fi. שירותי ×ž×™×§×•× ×לה ×—×™×™×‘×™× ×œ×”×™×•×ª ×ž×•×¤×¢×œ×™× ×•× ×’×™×©×™× ×œ×ž×›×©×™×¨ שלך כדי שה×פליקציה תשתמש בה×. ייתכן ש×פליקציות יעשו בכך שימוש כדי לקבוע היכן ×תה × ×ž×¦× ×•×œ×’×¨×•× ×œ×¦×¨×™×›×ª סוללה מוגברת."</string>
<string name="permlab_accessCoarseLocation" msgid="4887895362354239628">"×ž×™×§×•× ×ž×©×•×¢×¨ (מבוסס רשת)"</string>
- <string name="permdesc_accessCoarseLocation" msgid="2538200184373302295">"מ×פשר ל×פליקציה לקבל ×ת מיקומך המשוער. ×ž×™×§×•× ×–×” נגזר על-פי שירותי ×ž×™×§×•× ×”×¢×•×©×™× ×©×™×ž×•×© במקורות ×ž×™×§×•× ×‘×¨×©×ª, כגון ×נטנות סלולריות ו-Wi-Fi. שירותי ×ž×™×§×•× ×לה ×—×™×™×‘×™× ×œ×”×™×•×ª ×ž×•×¤×¢×œ×™× ×•× ×’×™×©×™× ×œ×ž×›×©×™×¨ שלך כדי שה×פליקציה תשתמש בה×. ייתכן ש×פליקציות יעשו בכך שימוש כדי לקבוע ×ת מיקומך המשוער."</string>
- <string name="permlab_accessSurfaceFlinger" msgid="2363969641792388947">"גישה ל-SurfaceFlinger"</string>
- <string name="permdesc_accessSurfaceFlinger" msgid="1041619516733293551">"מ×פשר ל×פליקציה להשתמש בתכונות ברמה הנמוכה של SurfaceFlinger."</string>
+ <string name="permdesc_accessCoarseLocation" msgid="2538200184373302295">"â€×ž×פשר ל×פליקציה לקבל ×ת מיקומך המשוער. ×ž×™×§×•× ×–×” נגזר על-פי שירותי ×ž×™×§×•× ×”×¢×•×©×™× ×©×™×ž×•×© במקורות ×ž×™×§×•× ×‘×¨×©×ª, כגון ×נטנות סלולריות ו-Wi-Fi. שירותי ×ž×™×§×•× ×לה ×—×™×™×‘×™× ×œ×”×™×•×ª ×ž×•×¤×¢×œ×™× ×•× ×’×™×©×™× ×œ×ž×›×©×™×¨ שלך כדי שה×פליקציה תשתמש בה×. ייתכן ש×פליקציות יעשו בכך שימוש כדי לקבוע ×ת מיקומך המשוער."</string>
+ <string name="permlab_accessSurfaceFlinger" msgid="2363969641792388947">"â€×’ישה ל-SurfaceFlinger"</string>
+ <string name="permdesc_accessSurfaceFlinger" msgid="1041619516733293551">"â€×ž×פשר ל×פליקציה להשתמש בתכונות ברמה הנמוכה של SurfaceFlinger."</string>
<string name="permlab_readFrameBuffer" msgid="6690504248178498136">"×חסון זמני של מסגרת קרי××”"</string>
<string name="permdesc_readFrameBuffer" msgid="4937405521809454680">"מ×פשר ל×פליקציה ×œ×§×¨×•× ×ת התוכן של מ×גר ×”× ×ª×•× ×™× ×”×–×ž× ×™ של המסגרות."</string>
- <string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"הגדר תצוגות Wi-Fi"</string>
- <string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"מ×פשר ל×פליקציה להגדיר ולהתחבר לתצוגות Wi-Fi."</string>
- <string name="permlab_controlWifiDisplay" msgid="393641276723695496">"שלוט בתצוגות Wi-Fi"</string>
- <string name="permdesc_controlWifiDisplay" msgid="4543912292681826986">"מ×פשר ל×פליקציה לשלוט בתכונות ברמה נמוכה של תצוגות Wi-Fi."</string>
+ <string name="permlab_accessInputFlinger" msgid="5348635270689553857">"â€×’ישה ×ל InputFlinger"</string>
+ <string name="permdesc_accessInputFlinger" msgid="2104864941201226616">"â€×ž×פשרת ל×פליקציה להשתמש בתכונות ברמה נמוכה של InputFlinger."</string>
+ <string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"â€×”גדר תצוגות Wi-Fi"</string>
+ <string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"â€×ž×פשר ל×פליקציה להגדיר ולהתחבר לתצוגות Wi-Fi."</string>
+ <string name="permlab_controlWifiDisplay" msgid="393641276723695496">"â€×©×œ×•ט בתצוגות Wi-Fi"</string>
+ <string name="permdesc_controlWifiDisplay" msgid="4543912292681826986">"â€×ž×פשר ל×פליקציה לשלוט בתכונות ברמה נמוכה של תצוגות Wi-Fi."</string>
<string name="permlab_captureAudioOutput" msgid="6857134498402346708">"קליטת פלט ×ודיו"</string>
<string name="permdesc_captureAudioOutput" msgid="6210597754212208853">"מ×פשרת ל×פליקציה לקלוט ולהפנות מחדש פלט ×ודיו."</string>
<string name="permlab_captureAudioHotword" msgid="1890553935650349808">"זיהוי של מילת הפעלה"</string>
@@ -507,11 +514,11 @@
<string name="permlab_reboot" product="default" msgid="2898560872462638242">"×לץ ×תחול מחדש של הטלפון"</string>
<string name="permdesc_reboot" product="tablet" msgid="8172056180063700741">"מ×פשר ל×פליקציה ל×לץ ×ת הט×בלט לבצע ×תחול."</string>
<string name="permdesc_reboot" product="default" msgid="5326008124289989969">"מ×פשר ל×פליקציה ל×לץ ×ת הטלפון לבצע ×תחול."</string>
- <string name="permlab_mount_unmount_filesystems" product="nosdcard" msgid="2927361537942591841">"גישה למערכת ×”×§×‘×¦×™× ×©×œ ×חסון USB"</string>
- <string name="permlab_mount_unmount_filesystems" product="default" msgid="4402305049890953810">"גישה למערכת ×”×§×‘×¦×™× ×©×œ כרטיס SD"</string>
+ <string name="permlab_mount_unmount_filesystems" product="nosdcard" msgid="2927361537942591841">"â€×’ישה למערכת ×”×§×‘×¦×™× ×©×œ ×חסון USB"</string>
+ <string name="permlab_mount_unmount_filesystems" product="default" msgid="4402305049890953810">"â€×’ישה למערכת ×”×§×‘×¦×™× ×©×œ כרטיס SD"</string>
<string name="permdesc_mount_unmount_filesystems" msgid="1829290701658992347">"מ×פשר ל×פליקציה לטעון ולבטל טעינה של מערכות ×§×‘×¦×™× ×‘×מצעי ×חסון נשלפי×."</string>
- <string name="permlab_mount_format_filesystems" product="nosdcard" msgid="6227819582624904972">"מחיקת ×חסון USB"</string>
- <string name="permlab_mount_format_filesystems" product="default" msgid="262582698639274056">"מחיקת כרטיס SD"</string>
+ <string name="permlab_mount_format_filesystems" product="nosdcard" msgid="6227819582624904972">"â€×ž×—יקת ×חסון USB"</string>
+ <string name="permlab_mount_format_filesystems" product="default" msgid="262582698639274056">"â€×ž×—יקת כרטיס SD"</string>
<string name="permdesc_mount_format_filesystems" msgid="8784268246779198627">"מ×פשר ל×פליקציה לפרמט ×מצעי ×חסון נשלפי×."</string>
<string name="permlab_asec_access" msgid="3411338632002193846">"קבל מידע על ×חסון פנימי"</string>
<string name="permdesc_asec_access" msgid="3094563844593878548">"מ×פשר ל×פליקציה לקבל מידע על ×מצעי ×”×חסון הפנימי."</string>
@@ -527,25 +534,25 @@
<string name="permdesc_vibrate" msgid="6284989245902300945">"מ×פשר ל×פליקציה לשלוט ברטט."</string>
<string name="permlab_flashlight" msgid="2155920810121984215">"שליטה בפנס"</string>
<string name="permdesc_flashlight" msgid="6522284794568368310">"מ×פשר ל×פליקציה לשלוט בפנס."</string>
- <string name="permlab_manageUsb" msgid="1113453430645402723">"נהל העדפות ו××™×©×•×¨×™× ×¢×‘×•×¨ מכשירי USB"</string>
- <string name="permdesc_manageUsb" msgid="7776155430218239833">"מ×פשר ל×פליקציה לנהל העדפות והרש×ות עבור מכשירי USB."</string>
- <string name="permlab_accessMtp" msgid="4953468676795917042">"×™×™×©× ×¤×¨×•×˜×•×§×•×œ MTP"</string>
- <string name="permdesc_accessMtp" msgid="6532961200486791570">"מ×פשר גישה למנהל התקן MTP של הליבה כדי ×œ×™×™×©× ×ת פרוטוקול ×”-USB של ×”-MTP."</string>
+ <string name="permlab_manageUsb" msgid="1113453430645402723">"â€× ×”ל העדפות ו××™×©×•×¨×™× ×¢×‘×•×¨ מכשירי USB"</string>
+ <string name="permdesc_manageUsb" msgid="7776155430218239833">"â€×ž×פשר ל×פליקציה לנהל העדפות והרש×ות עבור מכשירי USB."</string>
+ <string name="permlab_accessMtp" msgid="4953468676795917042">"â€×™×™×©× פרוטוקול MTP"</string>
+ <string name="permdesc_accessMtp" msgid="6532961200486791570">"â€×ž×פשר גישה למנהל התקן MTP של הליבה כדי ×œ×™×™×©× ×ת פרוטוקול ×”-USB של ×”-MTP."</string>
<string name="permlab_hardware_test" msgid="4148290860400659146">"בדוק חומרה"</string>
<string name="permdesc_hardware_test" msgid="6597964191208016605">"מ×פשר ל×פליקציה לשלוט בפריטי ציוד היקפי ×©×•× ×™× ×œ×¦×•×¨×š בדיקת החומרה."</string>
<string name="permlab_callPhone" msgid="3925836347681847954">"התקשר ישירות למספרי טלפון"</string>
<string name="permdesc_callPhone" msgid="3740797576113760827">"מ×פשר ל×פליקציה להתקשר למספרי טלפון ×œ×œ× ×”×ª×¢×¨×‘×•×ª×š. פעולה זו עשויה ×œ×’×¨×•× ×œ×©×™×—×•×ª ×ו ×œ×—×™×•×‘×™× ×œ× ×¦×¤×•×™×™×. ×©×™× ×œ×‘ שהדבר ×œ× ×ž×פשר ל×פליקציה להתקשר למספרי חירו×. ×פליקציות זדוניות עשויות ×œ×’×¨×•× ×œ×¢×œ×•×™×•×ª על ידי ביצוע שיחות ×œ×œ× ×”×ª×¢×¨×‘×•×ª×š."</string>
<string name="permlab_callPrivileged" msgid="4198349211108497879">"התקשר ישירות לכל מספר טלפון"</string>
<string name="permdesc_callPrivileged" msgid="1689024901509996810">"מ×פשר ל×פליקציה להתקשר לכל מספר טלפון שהו×, כולל מספרי חירו×, ×œ×œ× ×”×ª×¢×¨×‘×•×ª×š. ×פליקציות זדוניות עלולות לבצע שיחות מיותרות ×•×œ× ×—×•×§×™×•×ª לשירותי חירו×."</string>
- <string name="permlab_performCdmaProvisioning" product="tablet" msgid="4842576994144604821">"הפעל ישירות התקנת ט×בלט מסוג CDMA"</string>
- <string name="permlab_performCdmaProvisioning" product="default" msgid="5604848095315421425">"הפעל ישירות הגדרה של טלפון CDMA"</string>
- <string name="permdesc_performCdmaProvisioning" msgid="1994193538802314186">"מ×פשר ל×פליקציה להפעיל הקצ×ת CDMA. ×פליקציות זדוניות עלולות להפעיל הקצ×ת CDMA ×œ×œ× ×¦×•×¨×š."</string>
+ <string name="permlab_performCdmaProvisioning" product="tablet" msgid="4842576994144604821">"â€×”פעל ישירות התקנת ט×בלט מסוג CDMA"</string>
+ <string name="permlab_performCdmaProvisioning" product="default" msgid="5604848095315421425">"â€×”פעל ישירות הגדרה של טלפון CDMA"</string>
+ <string name="permdesc_performCdmaProvisioning" msgid="1994193538802314186">"â€×ž×פשר ל×פליקציה להפעיל הקצ×ת CDMA. ×פליקציות זדוניות עלולות להפעיל הקצ×ת CDMA ×œ×œ× ×¦×•×¨×š."</string>
<string name="permlab_locationUpdates" msgid="7785408253364335740">"שלוט בהתר×ות על עדכון מיקו×"</string>
<string name="permdesc_locationUpdates" msgid="1120741557891438876">"מ×פשר ל×פליקציה ל×פשר/להשבית התר×ות לגבי עדכוני ×ž×™×§×•× ×ž×”×¨×“×™×•. ×œ× ×ž×™×•×¢×“ לשימוש על ידי ×פליקציות רגילות."</string>
<string name="permlab_checkinProperties" msgid="7855259461268734914">"גישה למ×פייני כניסה"</string>
<string name="permdesc_checkinProperties" msgid="4024526968630194128">"מ×פשר ל×פליקציה לקבל גישה לקרי××”/כתיבה למ××¤×™×™× ×™× ×©×”×•×¢×œ×• על ידי שירות הכניסה. ×œ× ×ž×™×•×¢×“ לשימוש על ידי ×פליקציות רגילות."</string>
- <string name="permlab_bindGadget" msgid="776905339015863471">"בחר רכיבי Widget"</string>
- <string name="permdesc_bindGadget" msgid="8261326938599049290">"מ×פשר ל×פליקציה ליידע ×ת המערכת ב×ילו פריטי Widget יכול להשתמש כל ×פליקציה. ×פליקציה בעלת הרש××” זו יכול לספק ל×פליקציות ×חרות גישה ×œ× ×ª×•× ×™× ×ישיי×. ×œ× ×ž×™×•×¢×“ לשימוש על ידי ×פליקציות רגילות."</string>
+ <string name="permlab_bindGadget" msgid="776905339015863471">"â€×‘חר רכיבי Widget"</string>
+ <string name="permdesc_bindGadget" msgid="8261326938599049290">"â€×ž×פשר ל×פליקציה ליידע ×ת המערכת ב×ילו פריטי Widget יכול להשתמש כל ×פליקציה. ×פליקציה בעלת הרש××” זו יכול לספק ל×פליקציות ×חרות גישה ×œ× ×ª×•× ×™× ×ישיי×. ×œ× ×ž×™×•×¢×“ לשימוש על ידי ×פליקציות רגילות."</string>
<string name="permlab_modifyPhoneState" msgid="8423923777659292228">"שנה ×ת מצב הטלפון"</string>
<string name="permdesc_modifyPhoneState" msgid="1029877529007686732">"מ×פשר ל×פליקציה לשלוט בתכונות הטלפון של המכשיר. ×פליקציה בעלת הרש××” זו יכולה לעבור בין רשתות, להפעיל ולכבות ×ת הרדיו בטלפון ולבצע פעולות נוספות דומות מבלי ליידע ×ותך."</string>
<string name="permlab_readPhoneState" msgid="9178228524507610486">"קרי×ת הסטטוס והזהות של הטלפון"</string>
@@ -576,8 +583,8 @@
<string name="permlab_setTimeZone" msgid="2945079801013077340">"הגדר ×זור זמן"</string>
<string name="permdesc_setTimeZone" product="tablet" msgid="1676983712315827645">"מ×פשר ל×פליקציה לשנות ×ת ×זור הזמן של הט×בלט."</string>
<string name="permdesc_setTimeZone" product="default" msgid="4499943488436633398">"מ×פשר ל×פליקציה לשנות ×ת ×זור הזמן של הטלפון."</string>
- <string name="permlab_accountManagerService" msgid="4829262349691386986">"פעל בתור ה-AccountManagerService"</string>
- <string name="permdesc_accountManagerService" msgid="1948455552333615954">"הרש××” זו מ×פשרת ל×פליקציה לבצע שיחות ×ל AccountAuthenticators."</string>
+ <string name="permlab_accountManagerService" msgid="4829262349691386986">"â€×¤×¢×œ בתור ×”-AccountManagerService"</string>
+ <string name="permdesc_accountManagerService" msgid="1948455552333615954">"â€×”רש××” זו מ×פשרת ל×פליקציה לבצע שיחות ×ל AccountAuthenticators."</string>
<string name="permlab_getAccounts" msgid="1086795467760122114">"חיפוש חשבונות במכשיר"</string>
<string name="permdesc_getAccounts" product="tablet" msgid="2741496534769660027">"מ×פשר ל×פליקציה לקבל רשימה של חשבונות ×”×ž×•×›×¨×™× ×œ×˜×בלט. הדבר עשוי לכלול חשבונות שנוצרו על ידי ×פליקציות שהתקנת."</string>
<string name="permdesc_getAccounts" product="default" msgid="3448316822451807382">"מ×פשר ל×פליקציה לקבל רשימה של חשבונות ×”×ž×•×›×¨×™× ×œ×˜×œ×¤×•×Ÿ. הדבר עשוי לכלול חשבונות שנוצרו על ידי ×פליקציות שהתקנת."</string>
@@ -590,37 +597,37 @@
<string name="permlab_accessNetworkState" msgid="4951027964348974773">"הצג חיבורי רשת"</string>
<string name="permdesc_accessNetworkState" msgid="8318964424675960975">"מ×פשר ל×פליקציה להציג מידע לגבי חיבורי רשת, למשל, ×ילו רשתות קיימות ומחוברות."</string>
<string name="permlab_createNetworkSockets" msgid="8018758136404323658">"גישת רשת מל××”"</string>
- <string name="permdesc_createNetworkSockets" msgid="3403062187779724185">"מ×פשר ל×פליקציה ליצור Sockets ולהשתמש בפרוטוקולי רשת מות××ž×™× ×ישית. הדפדפן ו×פליקציות ×חרות מספקות ××ž×¦×¢×™× ×œ×©×œ×™×—×ª × ×ª×•× ×™× ×œ×ינטרנט, כך ש×ישור ×–×” ×ינו נחוץ לשליחת × ×ª×•× ×™× ×œ×ינטרנט."</string>
+ <string name="permdesc_createNetworkSockets" msgid="3403062187779724185">"â€×ž×פשר ל×פליקציה ליצור Sockets ולהשתמש בפרוטוקולי רשת מות××ž×™× ×ישית. הדפדפן ו×פליקציות ×חרות מספקות ××ž×¦×¢×™× ×œ×©×œ×™×—×ª × ×ª×•× ×™× ×œ×ינטרנט, כך ש×ישור ×–×” ×ינו נחוץ לשליחת × ×ª×•× ×™× ×œ×ינטרנט."</string>
<string name="permlab_writeApnSettings" msgid="505660159675751896">"שנה/עכב הגדרות רשת ותנועה"</string>
- <string name="permdesc_writeApnSettings" msgid="5333798886412714193">"מ×פשר ל×פליקציה לשנות ×ת הגדרות הרשת ולעכב ולבדוק ×ת כל תנועת הרשת, לדוגמה, לשנות ×ת ×”-proxy והיצי××” של כל רשת APN. ×פליקציות זדוניות עלולות לעקוב ×חר חבילות רשת, לבצע הפניה מחדש שלהן ×ו לשנות ×ותן, ×œ×œ× ×™×“×™×¢×ª×š."</string>
+ <string name="permdesc_writeApnSettings" msgid="5333798886412714193">"â€×ž×פשר ל×פליקציה לשנות ×ת הגדרות הרשת ולעכב ולבדוק ×ת כל תנועת הרשת, לדוגמה, לשנות ×ת ×”-proxy והיצי××” של כל רשת APN. ×פליקציות זדוניות עלולות לעקוב ×חר חבילות רשת, לבצע הפניה מחדש שלהן ×ו לשנות ×ותן, ×œ×œ× ×™×“×™×¢×ª×š."</string>
<string name="permlab_changeNetworkState" msgid="958884291454327309">"שנה ×ת קישוריות הרשת"</string>
<string name="permdesc_changeNetworkState" msgid="6789123912476416214">"מ×פשר ל×פליקציה לשנות ×ת מצב הקישוריות של הרשת."</string>
<string name="permlab_changeTetherState" msgid="5952584964373017960">"שינוי של קישוריות קשורה"</string>
<string name="permdesc_changeTetherState" msgid="1524441344412319780">"מ×פשר ל×פליקציה לשנות ×ת מצב הקישוריות של רשת קשורה."</string>
<string name="permlab_changeBackgroundDataSetting" msgid="1400666012671648741">"שנה ×ת הגדרות השימוש בנתוני הרקע"</string>
<string name="permdesc_changeBackgroundDataSetting" msgid="5347729578468744379">"מ×פשר ל×פליקציה לשנות ×ת הגדרת השימוש בנתוני רקע."</string>
- <string name="permlab_accessWifiState" msgid="5202012949247040011">"הצג חיבורי Wi-Fi"</string>
- <string name="permdesc_accessWifiState" msgid="5002798077387803726">"מ×פשר ל×פליקציה להציג מידע על רשתות Wi-Fi, למשל, ×”×× Wi-Fi מופעל, כמו ×’× ×©× ×ž×›×©×™×¨×™ ×”-Wi-Fi המחוברי×."</string>
- <string name="permlab_changeWifiState" msgid="6550641188749128035">"התחברות והתנתקות מ-Wi-Fi"</string>
- <string name="permdesc_changeWifiState" msgid="7137950297386127533">"מ×פשר ל×פליקציה להתחבר לנקודות גישת Wi-Fi ולהתנתק מהן, וכן לבצע ×©×™× ×•×™×™× ×‘×ª×¦×•×¨×ª המכשיר עבור רשתות Wi-Fi."</string>
- <string name="permlab_changeWifiMulticastState" msgid="1368253871483254784">"×פשר קבלת ×©×™×“×•×¨×™× ×ž×¨×•×‘×™× ×‘-Wi-Fi"</string>
- <string name="permdesc_changeWifiMulticastState" product="tablet" msgid="7969774021256336548">"מ×פשר ל×פליקציה לקבל חבילות שנשלחו לכל ×”×ž×›×©×™×¨×™× ×‘×¨×©×ª Wi-Fi ב×מצעות כתובות שידור לקבוצה, ×•×œ× ×¨×§ בט×בלט שלך. צריכת החשמל גבוהה יותר מ×שר במצב ש×ינו שידור לקבוצה."</string>
- <string name="permdesc_changeWifiMulticastState" product="default" msgid="6851949706025349926">"מ×פשר ל×פליקציה לקבל חבילות שנשלחו לכל ×”×ž×›×©×™×¨×™× ×‘×¨×©×ª Wi-Fi ב×מצעות כתובות שידור לקבוצה, ×•×œ× ×¨×§ בטלפון שלך. צריכת החשמל גבוהה יותר מ×שר במצב ש×ינו שידור לקבוצה."</string>
- <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"גישה להגדרות Bluetooth"</string>
- <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"מ×פשר ל×פליקציה להגדיר ×ת תצורתו של הט×בלט המקומי מסוג Bluetooth וכן לגלות ×ž×›×©×™×¨×™× ×ž×¨×•×—×§×™× ×•×œ×‘×¦×¢ הת×מה ×ית×."</string>
- <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"מ×פשר ל×פליקציה להגדיר ×ת תצורתו של הטלפון המקומי מסוג Bluetooth וכן לגלות ×ž×›×©×™×¨×™× ×ž×¨×•×—×§×™× ×•×œ×‘×¦×¢ הת×מה ×ית×."</string>
- <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"×פשר הת×מת Bluetooth על ידי ×”×פליקציה"</string>
+ <string name="permlab_accessWifiState" msgid="5202012949247040011">"â€×”צג חיבורי Wi-Fi"</string>
+ <string name="permdesc_accessWifiState" msgid="5002798077387803726">"â€×ž×פשר ל×פליקציה להציג מידע על רשתות Wi-Fi, למשל, ×”×× Wi-Fi מופעל, כמו ×’× ×©× ×ž×›×©×™×¨×™ ×”-Wi-Fi המחוברי×."</string>
+ <string name="permlab_changeWifiState" msgid="6550641188749128035">"â€×”תחברות והתנתקות מ-Wi-Fi"</string>
+ <string name="permdesc_changeWifiState" msgid="7137950297386127533">"â€×ž×פשר ל×פליקציה להתחבר לנקודות גישת Wi-Fi ולהתנתק מהן, וכן לבצע ×©×™× ×•×™×™× ×‘×ª×¦×•×¨×ª המכשיר עבור רשתות Wi-Fi."</string>
+ <string name="permlab_changeWifiMulticastState" msgid="1368253871483254784">"â€×פשר קבלת ×©×™×“×•×¨×™× ×ž×¨×•×‘×™× ×‘-Wi-Fi"</string>
+ <string name="permdesc_changeWifiMulticastState" product="tablet" msgid="7969774021256336548">"â€×ž×פשר ל×פליקציה לקבל חבילות שנשלחו לכל ×”×ž×›×©×™×¨×™× ×‘×¨×©×ª Wi-Fi ב×מצעות כתובות שידור לקבוצה, ×•×œ× ×¨×§ בט×בלט שלך. צריכת החשמל גבוהה יותר מ×שר במצב ש×ינו שידור לקבוצה."</string>
+ <string name="permdesc_changeWifiMulticastState" product="default" msgid="6851949706025349926">"â€×ž×פשר ל×פליקציה לקבל חבילות שנשלחו לכל ×”×ž×›×©×™×¨×™× ×‘×¨×©×ª Wi-Fi ב×מצעות כתובות שידור לקבוצה, ×•×œ× ×¨×§ בטלפון שלך. צריכת החשמל גבוהה יותר מ×שר במצב ש×ינו שידור לקבוצה."</string>
+ <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"â€×’ישה להגדרות Bluetooth"</string>
+ <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"â€×ž×פשר ל×פליקציה להגדיר ×ת תצורתו של הט×בלט המקומי מסוג Bluetooth וכן לגלות ×ž×›×©×™×¨×™× ×ž×¨×•×—×§×™× ×•×œ×‘×¦×¢ הת×מה ×ית×."</string>
+ <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"â€×ž×פשר ל×פליקציה להגדיר ×ת תצורתו של הטלפון המקומי מסוג Bluetooth וכן לגלות ×ž×›×©×™×¨×™× ×ž×¨×•×—×§×™× ×•×œ×‘×¦×¢ הת×מה ×ית×."</string>
+ <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"â€×פשר הת×מת Bluetooth על ידי ×”×פליקציה"</string>
<string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"מ×פשרת ל×פליקציה לבצע הת×מה ×¢× ×ž×›×©×™×¨×™× ×ž×¨×•×—×§×™× ×œ×œ× ×”×ª×¢×¨×‘×•×ª המשתמש."</string>
<string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"מ×פשרת ל×פליקציה לבצע הת×מה ×¢× ×ž×›×©×™×¨×™× ×ž×¨×•×—×§×™× ×œ×œ× ×”×ª×¢×¨×‘×•×ª המשתמש."</string>
- <string name="permlab_accessWimaxState" msgid="4195907010610205703">"התחברות והתנתקות מ-WiMAX"</string>
- <string name="permdesc_accessWimaxState" msgid="6360102877261978887">"מ×פשר ל×פליקציה לדעת ×”×× WiNMAX מופעל, כמו ×’× ×œ×§×‘×œ מידע ×”×× ×¨×©×ª×•×ª WiNMAX כלשהן מחוברות."</string>
- <string name="permlab_changeWimaxState" msgid="2405042267131496579">"שנה ×ת מצב WiMAX"</string>
- <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"מ×פשר ל×פליקציה לחבר ×ת הט×בלט לרשתות WiMAX ולהתנתק מהן."</string>
- <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"מ×פשר ל×פליקציה לחבר ×ת הטלפון לרשתות WiMAX ולהתנתק מהן."</string>
- <string name="permlab_bluetooth" msgid="6127769336339276828">"הת×מה למכשירי Bluetooth"</string>
- <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"מ×פשר ל×פליקציה להציג ×ת תצורת ×”-Bluetooth בט×בלט, וכן ליצור ולקבל ×—×™×‘×•×¨×™× ×¢× ×ž×›×©×™×¨×™× ×ž×•×ª×מי×."</string>
- <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"מ×פשר ל×פליקציה להציג ×ת תצורת ×”-Bluetooth בטלפון, וכן ליצור ולקבל ×—×™×‘×•×¨×™× ×¢× ×ž×›×©×™×¨×™× ×ž×•×ª×מי×."</string>
- <string name="permlab_nfc" msgid="4423351274757876953">"שלוט ב-Near Field Communication"</string>
+ <string name="permlab_accessWimaxState" msgid="4195907010610205703">"â€×”תחברות והתנתקות מ-WiMAX"</string>
+ <string name="permdesc_accessWimaxState" msgid="6360102877261978887">"â€×ž×פשר ל×פליקציה לדעת ×”×× WiNMAX מופעל, כמו ×’× ×œ×§×‘×œ מידע ×”×× ×¨×©×ª×•×ª WiNMAX כלשהן מחוברות."</string>
+ <string name="permlab_changeWimaxState" msgid="2405042267131496579">"â€×©× ×” ×ת מצב WiMAX"</string>
+ <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"â€×ž×פשר ל×פליקציה לחבר ×ת הט×בלט לרשתות WiMAX ולהתנתק מהן."</string>
+ <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"â€×ž×פשר ל×פליקציה לחבר ×ת הטלפון לרשתות WiMAX ולהתנתק מהן."</string>
+ <string name="permlab_bluetooth" msgid="6127769336339276828">"â€×”ת×מה למכשירי Bluetooth"</string>
+ <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"â€×ž×פשר ל×פליקציה להציג ×ת תצורת ×”-Bluetooth בט×בלט, וכן ליצור ולקבל ×—×™×‘×•×¨×™× ×¢× ×ž×›×©×™×¨×™× ×ž×•×ª×מי×."</string>
+ <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"â€×ž×פשר ל×פליקציה להציג ×ת תצורת ×”-Bluetooth בטלפון, וכן ליצור ולקבל ×—×™×‘×•×¨×™× ×¢× ×ž×›×©×™×¨×™× ×ž×•×ª×מי×."</string>
+ <string name="permlab_nfc" msgid="4423351274757876953">"â€×©×œ×•ט ב-Near Field Communication"</string>
<string name="permdesc_nfc" msgid="7120611819401789907">"מ×פשר ל×פליקציה נהל תקשורת ×¢× ×ª×’×™×, ×›×¨×˜×™×¡×™× ×•×§×•×¨××™× ×ž×¡×•×’ \'תקשורת מטווח קצר\'."</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"ביטול נעילת המסך שלך"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"מ×פשר ל×פליקציה להשבית ×ת נעילת ×”×ž×§×©×™× ×•×›×œ ×מצעי ×בטחה משויך המבוסס על סיסמה. לדוגמה, הטלפון משבית ×ת נעילת ×”×ž×§×©×™× ×‘×¢×ª קבלה של שיחת טלפון נכנסת, ול×חר מכן מפעיל מחדש ×ת נעילת ×”×ž×§×©×™× ×¢× ×¡×™×•× ×”×©×™×—×”."</string>
@@ -638,14 +645,14 @@
<string name="permdesc_readDictionary" msgid="659614600338904243">"מ×פשר ל×פליקציה ×œ×§×¨×•× ×ת כל המילי×, השמות ×•×”×‘×™×˜×•×™×™× ×©×”×ž×©×ª×ž×© ×חסן במילון המשתמש."</string>
<string name="permlab_writeDictionary" msgid="2183110402314441106">"הוספת ×ž×™×œ×™× ×œ×ž×™×œ×•×Ÿ מוגדר-משתמש"</string>
<string name="permdesc_writeDictionary" msgid="8185385716255065291">"מ×פשר ל×פליקציה לכתוב ×ž×™×œ×™× ×—×“×©×•×ª במילון המשתמש."</string>
- <string name="permlab_sdcardRead" product="nosdcard" msgid="367275095159405468">"קרי×ת התוכן של ×חסון ×”-USB שלך"</string>
- <string name="permlab_sdcardRead" product="default" msgid="2188156462934977940">"קרי×ת התוכן של כרטיס ×”-SD שלך"</string>
- <string name="permdesc_sdcardRead" product="nosdcard" msgid="3446988712598386079">"מ×פשר ל×פליקציה ×œ×§×¨×•× ×ת תוכן ×חסון ×”-USB שלך."</string>
- <string name="permdesc_sdcardRead" product="default" msgid="2607362473654975411">"מ×פשר ל×פליקציה ×œ×§×¨×•× ×ת תוכן כרטיס ×”-SD שלך."</string>
- <string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"שינוי ×ו מחיקה של תוכן ×חסון ×”-USB שלך"</string>
- <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"שינוי ×ו מחיקה של תוכן כרטיס ×”-SD שלך"</string>
- <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"מ×פשר ל×פליקציה לכתוב להתקן ×”×חסון מסוג USB."</string>
- <string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"מ×פשר ל×פליקציה לכתוב לכרטיס ×”-SD."</string>
+ <string name="permlab_sdcardRead" product="nosdcard" msgid="367275095159405468">"â€×§×¨×™×ת התוכן של ×חסון ×”-USB שלך"</string>
+ <string name="permlab_sdcardRead" product="default" msgid="2188156462934977940">"â€×§×¨×™×ת התוכן של כרטיס ×”-SD שלך"</string>
+ <string name="permdesc_sdcardRead" product="nosdcard" msgid="3446988712598386079">"â€×ž×פשר ל×פליקציה ×œ×§×¨×•× ×ת תוכן ×חסון ×”-USB שלך."</string>
+ <string name="permdesc_sdcardRead" product="default" msgid="2607362473654975411">"â€×ž×פשר ל×פליקציה ×œ×§×¨×•× ×ת תוכן כרטיס ×”-SD שלך."</string>
+ <string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"â€×©×™× ×•×™ ×ו מחיקה של תוכן ×חסון ×”-USB שלך"</string>
+ <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"â€×©×™× ×•×™ ×ו מחיקה של תוכן כרטיס ×”-SD שלך"</string>
+ <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"â€×ž×פשר ל×פליקציה לכתוב להתקן ×”×חסון מסוג USB."</string>
+ <string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"â€×ž×פשר ל×פליקציה לכתוב לכרטיס ×”-SD."</string>
<string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"שנה/מחק תוכן של ×חסון מדיה פנימי"</string>
<string name="permdesc_mediaStorageWrite" product="default" msgid="8189160597698529185">"מ×פשר ל×פליקציה לשנות ×ת התוכן של ×מצעי ×”×חסון הפנימי למדיה."</string>
<string name="permlab_manageDocs" product="default" msgid="5778318598448849829">"ניהול של ×חסון מסמכי×"</string>
@@ -655,7 +662,7 @@
<string name="permlab_cache_filesystem" msgid="5656487264819669824">"גישה למערכת ×”×§×‘×¦×™× ×‘×§×•×‘×¥ השמור"</string>
<string name="permdesc_cache_filesystem" msgid="5578967642265550955">"מ×פשר ל×פליקציה ×œ×§×¨×•× ×•×œ×›×ª×•×‘ במערכת ×”×§×‘×¦×™× ×©×œ ×”×§×‘×¦×™× ×”×©×ž×•×¨×™×."</string>
<string name="permlab_use_sip" msgid="5986952362795870502">"בצע/קבל שיחות ×ינטרנט"</string>
- <string name="permdesc_use_sip" msgid="4717632000062674294">"מ×פשר ל×פליקציה להשתמש בשירות SIP כדי לבצע/לקבל שיחות ×ינטרנט."</string>
+ <string name="permdesc_use_sip" msgid="4717632000062674294">"â€×ž×פשר ל×פליקציה להשתמש בשירות SIP כדי לבצע/לקבל שיחות ×ינטרנט."</string>
<string name="permlab_bind_call_service" msgid="6724009726671246551">"צור ×ינטר×קציה ×¢× ×ž×¡×š שיחה נכנסת"</string>
<string name="permdesc_bind_call_service" msgid="8732547662442572435">"מ×פשר ל×פליקציה לקבוע מתי ו×יך המשתמש יר××” שיחה נכנסת על המסך."</string>
<string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"קרי×ת נתוני שימוש ×”×™×¡×˜×•×¨×™×™× ×‘×¨×©×ª"</string>
@@ -664,8 +671,8 @@
<string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"מ×פשר ל×פליקציה לנהל מדיניות הרשת להגדיר ×›×œ×œ×™× ×¡×¤×¦×™×¤×™×™×-ל×פליקציה."</string>
<string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"שנה ניהול חשבונות של שימוש ברשת"</string>
<string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"הרש××” זו מ×פשרת ל×פליקציה לשנות ×ת ×ופן החישוב של נתוני שימוש ברשת מול כל ×פליקציה. ×œ× ×ž×™×•×¢×“ לשימוש ב×פליקציות רגילות."</string>
- <string name="permlab_markNetworkSocket" msgid="3658527214914959749">"שינוי של סימני Socket"</string>
- <string name="permdesc_markNetworkSocket" msgid="7655568433696356578">"ההרש××” הזו מ×פשרת ל×פליקציה לשנות סימני Socket עבור ניתוב"</string>
+ <string name="permlab_markNetworkSocket" msgid="3658527214914959749">"â€×©×™× ×•×™ של סימני Socket"</string>
+ <string name="permdesc_markNetworkSocket" msgid="7655568433696356578">"â€×”הרש××” הזו מ×פשרת ל×פליקציה לשנות סימני Socket עבור ניתוב"</string>
<string name="permlab_accessNotifications" msgid="7673416487873432268">"גישה להתר×ות"</string>
<string name="permdesc_accessNotifications" msgid="458457742683431387">"מ×פשר ל×פליקציה ל×חזר, לבדוק ולמחוק התר×ות, כולל ×›×לה שפורסמו על ידי ×פליקציות ×חרות."</string>
<string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"×יגוד לשירות של מ×זין להתר×ות"</string>
@@ -686,16 +693,16 @@
<string name="policylab_wipeData" msgid="3910545446758639713">"מחק ×ת כל הנתוני×"</string>
<string name="policydesc_wipeData" product="tablet" msgid="4306184096067756876">"מחק ×ת נתוני הט×בלט ×œ×œ× ×זהרה על ידי ביצוע ×יפוס נתוני יצרן."</string>
<string name="policydesc_wipeData" product="default" msgid="5096895604574188391">"מחק ×ת נתוני הטלפון ×œ×œ× ×זהרה על ידי ביצוע ×יפוס נתוני יצרן."</string>
- <string name="policylab_setGlobalProxy" msgid="2784828293747791446">"הגדר ×ת שרת ×”-Proxy הכללי של המכשיר"</string>
- <string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"הגדר שימוש בשרת ×”-Proxy הגלובלי של המכשיר ×›×שר המדיניות מופעלת. רק מנהל המכשיר הר×שון מגדיר ×ת שרת ×”-Proxy הגלובלי הפעיל."</string>
+ <string name="policylab_setGlobalProxy" msgid="2784828293747791446">"â€×”גדר ×ת שרת ×”-Proxy הכללי של המכשיר"</string>
+ <string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"â€×”גדר שימוש בשרת ×”-Proxy הגלובלי של המכשיר ×›×שר המדיניות מופעלת. רק מנהל המכשיר הר×שון מגדיר ×ת שרת ×”-Proxy הגלובלי הפעיל."</string>
<string name="policylab_expirePassword" msgid="885279151847254056">"הגדר ת×ריך תפוגה לסיסמה של נעילת המסך"</string>
<string name="policydesc_expirePassword" msgid="1729725226314691591">"שלוט בתדירות שבה יש לשנות ×ת הסיסמה של נעילת המסך."</string>
<string name="policylab_encryptedStorage" msgid="8901326199909132915">"הגדר הצפנת ×חסון"</string>
<string name="policydesc_encryptedStorage" msgid="2637732115325316992">"דרוש שנתוני ×פליקציות מ×וחסנות יהיו מוצפני×."</string>
<string name="policylab_disableCamera" msgid="6395301023152297826">"השבת מצלמות"</string>
<string name="policydesc_disableCamera" msgid="2306349042834754597">"מנע שימוש בכל המצלמות שבמכשיר."</string>
- <string name="policylab_disableKeyguardFeatures" msgid="266329104542638802">"השבת תכונות ב-Keyguard"</string>
- <string name="policydesc_disableKeyguardFeatures" msgid="3467082272186534614">"מנע שימוש בתכונות מסוימות ב-Keyguard."</string>
+ <string name="policylab_disableKeyguardFeatures" msgid="266329104542638802">"â€×”שבת תכונות ב-Keyguard"</string>
+ <string name="policydesc_disableKeyguardFeatures" msgid="3467082272186534614">"â€×ž× ×¢ שימוש בתכונות מסוימות ב-Keyguard."</string>
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"בית"</item>
<item msgid="869923650527136615">"נייד"</item>
@@ -809,14 +816,14 @@
<string name="sipAddressTypeHome" msgid="6093598181069359295">"דף הבית"</string>
<string name="sipAddressTypeWork" msgid="6920725730797099047">"עבודה"</string>
<string name="sipAddressTypeOther" msgid="4408436162950119849">"×חר"</string>
- <string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"הקלד קוד PIN"</string>
- <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"הקלד ×ת קוד ×”-PUK וקוד ×”-PIN החדש"</string>
- <string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"קוד PUK"</string>
- <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"קוד PIN חדש"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"â€×”קלד קוד PIN"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"â€×”קלד ×ת קוד ×”-PUK וקוד ×”-PIN החדש"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"â€×§×•ד PUK"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"â€×§×•ד PIN חדש"</string>
<string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"×’×¢ כדי להקליד ×ת הסיסמה"</font></string>
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"הקלד סיסמה לביטול הנעילה"</string>
- <string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"הקלד קוד PIN לביטול הנעילה"</string>
- <string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"קוד PIN שגוי"</string>
+ <string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"â€×”קלד קוד PIN לביטול הנעילה"</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"â€×§×•ד PIN שגוי"</string>
<string name="keyguard_label_text" msgid="861796461028298424">"כדי לבטל ×ת הנעילה, לחץ על \'תפריט\' ול×חר מכן על 0."</string>
<string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"מספר חירו×"</string>
<string name="lockscreen_carrier_default" msgid="8963839242565653192">"×ין שירות"</string>
@@ -834,13 +841,13 @@
<string name="lockscreen_charged" msgid="321635745684060624">"טעון"</string>
<string name="lockscreen_battery_short" msgid="4477264849386850266">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
<string name="lockscreen_low_battery" msgid="1482873981919249740">"חבר ×ת המטען."</string>
- <string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"×ין כרטיס SIM"</string>
- <string name="lockscreen_missing_sim_message" product="tablet" msgid="151659196095791474">"×ין כרטיס SIM בט×בלט."</string>
- <string name="lockscreen_missing_sim_message" product="default" msgid="2186920585695169078">"×ין כרטיס SIM בטלפון."</string>
- <string name="lockscreen_missing_sim_instructions" msgid="5372787138023272615">"הכנס כרטיס SIM."</string>
- <string name="lockscreen_missing_sim_instructions_long" msgid="3526573099019319472">"כרטיס ×”-SIM חסר ×ו ×©×œ× × ×™×ª×Ÿ ×œ×§×¨×•× ×ותו. הכנס כרטיס SIM."</string>
- <string name="lockscreen_permanent_disabled_sim_message_short" msgid="5096149665138916184">"×œ× × ×™×ª×Ÿ להשתמש בכרטיס SIM ×–×”."</string>
- <string name="lockscreen_permanent_disabled_sim_instructions" msgid="910904643433151371">"כרטיס ×”-SIM שלך הושבת לצמיתות.\nפנה לספק השירות ×”×לחוטי שלך לקבלת כרטיס SIM ×חר."</string>
+ <string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"â€×ין כרטיס SIM"</string>
+ <string name="lockscreen_missing_sim_message" product="tablet" msgid="151659196095791474">"â€×ין כרטיס SIM בט×בלט."</string>
+ <string name="lockscreen_missing_sim_message" product="default" msgid="2186920585695169078">"â€×ין כרטיס SIM בטלפון."</string>
+ <string name="lockscreen_missing_sim_instructions" msgid="5372787138023272615">"â€×”כנס כרטיס SIM."</string>
+ <string name="lockscreen_missing_sim_instructions_long" msgid="3526573099019319472">"â€×›×¨×˜×™×¡ ×”-SIM חסר ×ו ×©×œ× × ×™×ª×Ÿ ×œ×§×¨×•× ×ותו. הכנס כרטיס SIM."</string>
+ <string name="lockscreen_permanent_disabled_sim_message_short" msgid="5096149665138916184">"â€×œ× ניתן להשתמש בכרטיס SIM ×–×”."</string>
+ <string name="lockscreen_permanent_disabled_sim_instructions" msgid="910904643433151371">"â€×›×¨×˜×™×¡ ×”-SIM שלך הושבת לצמיתות.\nפנה לספק השירות ×”×לחוטי שלך לקבלת כרטיס SIM ×חר."</string>
<string name="lockscreen_transport_prev_description" msgid="201594905152746886">"לחצן הרצועה הקודמת"</string>
<string name="lockscreen_transport_next_description" msgid="6089297650481292363">"לחצן הרצועה הב××”"</string>
<string name="lockscreen_transport_pause_description" msgid="7659088786780128001">"לחצן ההשהיה"</string>
@@ -848,15 +855,15 @@
<string name="lockscreen_transport_stop_description" msgid="4562318378766987601">"לחצן העצירה"</string>
<string name="emergency_calls_only" msgid="6733978304386365407">"שיחות ×—×™×¨×•× ×‘×œ×‘×“"</string>
<string name="lockscreen_network_locked_message" msgid="143389224986028501">"רשת נעולה"</string>
- <string name="lockscreen_sim_puk_locked_message" msgid="7441797339976230">"כרטיס SIM נעול ב×מצעות PUK."</string>
+ <string name="lockscreen_sim_puk_locked_message" msgid="7441797339976230">"â€×›×¨×˜×™×¡ SIM נעול ב×מצעות PUK."</string>
<string name="lockscreen_sim_puk_locked_instructions" msgid="8127916255245181063">"עיין במדריך למשתמש ×ו פנה לשירות הלקוחות."</string>
- <string name="lockscreen_sim_locked_message" msgid="8066660129206001039">"כרטיס ה-SIM נעול."</string>
- <string name="lockscreen_sim_unlock_progress_dialog_message" msgid="595323214052881264">"מבטל נעילה של כרטיס SIM…"</string>
+ <string name="lockscreen_sim_locked_message" msgid="8066660129206001039">"â€×›×¨×˜×™×¡ ×”-SIM נעול."</string>
+ <string name="lockscreen_sim_unlock_progress_dialog_message" msgid="595323214052881264">"â€×ž×‘טל נעילה של כרטיס SIM…"</string>
<string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="6481623830344107222">"שרטטת ×ת קו ביטול הנעילה ב×ופן שגוי <xliff:g id="NUMBER_0">%d</xliff:g> פעמי×. \n\nנסה שוב בעוד <xliff:g id="NUMBER_1">%d</xliff:g> שניות."</string>
<string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="2725973286239344555">"הקלדת סיסמה שגויה <xliff:g id="NUMBER_0">%d</xliff:g> פעמי×.\n\nנסה שוב בעוד <xliff:g id="NUMBER_1">%d</xliff:g> שניות."</string>
- <string name="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="6216672706545696955">"הקלדת קוד PIN שגוי <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" product="tablet" msgid="9191611984625460820">"שרטטת ב×ופן שגוי ×ת קו ביטול הנעילה <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_failed_attempts_almost_glogin" product="default" msgid="2590227559763762751">"שרטטת ×ת קו ביטול הנעילה ב×ופן שגוי <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_pin_attempts_dialog_message" msgid="6216672706545696955">"â€×”קלדת קוד PIN שגוי <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" product="tablet" msgid="9191611984625460820">"â€×©×¨×˜×˜×ª ב×ופן שגוי ×ת קו ביטול הנעילה <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_failed_attempts_almost_glogin" product="default" msgid="2590227559763762751">"â€×©×¨×˜×˜×ª ×ת קו ביטול הנעילה ב×ופן שגוי <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_failed_attempts_almost_at_wipe" product="tablet" msgid="6128106399745755604">"ביצעת <xliff:g id="NUMBER_0">%d</xliff:g> ניסיונות ×©×’×•×™×™× ×œ×‘×™×˜×•×œ נעילת הט×בלט. ל×חר <xliff:g id="NUMBER_1">%d</xliff:g> ניסיונות ×›×•×©×œ×™× × ×•×¡×¤×™×, הט×בלט יעבור ×יפוס לברירת המחדל של היצרן וכל נתוני המשתמש ×™×בדו."</string>
<string name="lockscreen_failed_attempts_almost_at_wipe" product="default" msgid="8603565142156826565">"ביצעת <xliff:g id="NUMBER_0">%d</xliff:g> ניסיונות ×©×’×•×™×™× ×œ×‘×™×˜×•×œ נעילת הטלפון. ל×חר <xliff:g id="NUMBER_1">%d</xliff:g> ניסיונות ×›×•×©×œ×™× × ×•×¡×¤×™×, הטלפון יעבור ×יפוס לברירת המחדל של היצרן וכל נתוני המשתמש ×™×בדו."</string>
<string name="lockscreen_failed_attempts_now_wiping" product="tablet" msgid="280873516493934365">"ביצעת <xliff:g id="NUMBER">%d</xliff:g> ניסיונות ×©×’×•×™×™× ×œ×‘×™×˜×•×œ נעילת הט×בלט. הט×בלט יעבור כעת ×יפוס לברירת המחדל של היצרן."</string>
@@ -865,12 +872,12 @@
<string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"שכחת ×ת הקו?"</string>
<string name="lockscreen_glogin_forgot_pattern" msgid="2588521501166032747">"ביטול נעילת חשבון"</string>
<string name="lockscreen_glogin_too_many_attempts" msgid="2751368605287288808">"בוצעו ניסיונות ×¨×‘×™× ×ž×“×™ לשרטוט קו ביטול נעילה."</string>
- <string name="lockscreen_glogin_instructions" msgid="3931816256100707784">"כדי לבטל ×ת הנעילה, היכנס ב×מצעות חשבון Google שלך."</string>
+ <string name="lockscreen_glogin_instructions" msgid="3931816256100707784">"â€×›×“×™ לבטל ×ת הנעילה, היכנס ב×מצעות חשבון Google שלך."</string>
<string name="lockscreen_glogin_username_hint" msgid="8846881424106484447">"×©× ×ž×©×ª×ž×© (דו×\"ל)"</string>
<string name="lockscreen_glogin_password_hint" msgid="5958028383954738528">"סיסמה"</string>
<string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"כניסה"</string>
<string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"×©× ×ž×©×ª×ž×© ×ו סיסמה ×œ× ×—×•×§×™×™×."</string>
- <string name="lockscreen_glogin_account_recovery_hint" msgid="1696924763690379073">"שכחת ×ת ×©× ×”×ž×©×ª×ž×© ×ו הסיסמה?\nבקר בכתובת "<b>"google.com/accounts/recovery"</b></string>
+ <string name="lockscreen_glogin_account_recovery_hint" msgid="1696924763690379073">"â€×©×›×—ת ×ת ×©× ×”×ž×©×ª×ž×© ×ו הסיסמה?\nבקר בכתובת "<b>"google.com/accounts/recovery"</b></string>
<string name="lockscreen_glogin_checking_password" msgid="7114627351286933867">"בודק..."</string>
<string name="lockscreen_unlock_label" msgid="737440483220667054">"בטל נעילה"</string>
<string name="lockscreen_sound_on_label" msgid="9068877576513425970">"קול פועל"</string>
@@ -879,24 +886,24 @@
<string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"התבנית נמחקה"</string>
<string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"×”×ª× × ×•×¡×£"</string>
<string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"התבנית הושלמה"</string>
- <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d מתוך %3$d."</string>
- <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"הוסף Widget."</string>
+ <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"â€%1$s. Widget %2$d מתוך %3$d."</string>
+ <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"â€×”וסף Widget."</string>
<string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"ריק"</string>
<string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"×זור ביטול הנעילה הורחב."</string>
<string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"×זור ביטול הנעילה כווץ."</string>
- <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"Widget â€<xliff:g id="WIDGET_INDEX">%1$s</xliff:g>."</string>
+ <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"â€Widget â€<xliff:g id="WIDGET_INDEX">%1$s</xliff:g>."</string>
<string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"בוחר משתמשי×"</string>
<string name="keyguard_accessibility_status" msgid="8008264603935930611">"סטטוס"</string>
<string name="keyguard_accessibility_camera" msgid="8904231194181114603">"מצלמה"</string>
<string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"פקדי מדיה"</string>
- <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"סידור מחדש של Widgets התחיל."</string>
- <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"סידור מחדש של Widgets הסתיי×."</string>
- <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Widget â€<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> נמחק."</string>
+ <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"â€×¡×™×“ור מחדש של Widgets התחיל."</string>
+ <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"â€×¡×™×“ור מחדש של Widgets הסתיי×."</string>
+ <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"â€Widget â€<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> נמחק."</string>
<string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"הרחב ×ת ×זור ביטול הנעילה."</string>
<string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"ביטול נעילה ב×מצעות הסטה."</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"ביטול נעילה ב×מצעות ציור קו."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"ביטול נעילה ב×מצעות זיהוי פני×."</string>
- <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"ביטול נעילה ב×מצעות מספר PIN."</string>
+ <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"â€×‘יטול נעילה ב×מצעות מספר PIN."</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"ביטול נעילה ב×מצעות סיסמה."</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"×זור ציור קו."</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"×זור הסטה."</string>
@@ -910,8 +917,8 @@
<string name="hour_ampm" msgid="4584338083529355982">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
<string name="hour_cap_ampm" msgid="2083465992940444366">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
<string name="factorytest_failed" msgid="5410270329114212041">"בדיקת היצרן נכשלה"</string>
- <string name="factorytest_not_system" msgid="4435201656767276723">"הפעולה FACTORY_TEST נתמכת רק עבור חבילות שהותקנו ב-‎/system/app."</string>
- <string name="factorytest_no_action" msgid="872991874799998561">"×œ× × ×ž×¦××” חבילה המספקת ×ת הפעולה FACTORY_TEST."</string>
+ <string name="factorytest_not_system" msgid="4435201656767276723">"â€×”פעולה FACTORY_TEST נתמכת רק עבור חבילות שהותקנו ב-‎/system/app."</string>
+ <string name="factorytest_no_action" msgid="872991874799998561">"â€×œ× נמצ××” חבילה המספקת ×ת הפעולה FACTORY_TEST."</string>
<string name="factorytest_reboot" msgid="6320168203050791643">"×תחל מחדש"</string>
<string name="js_dialog_title" msgid="1987483977834603872">"בדף שבכתובת \'<xliff:g id="TITLE">%s</xliff:g>\' כתוב כך:"</string>
<string name="js_dialog_title_default" msgid="6961903213729667573">"JavaScript"</string>
@@ -940,10 +947,10 @@
<string name="autofill_area" msgid="3547409050889952423">"×זור"</string>
<string name="autofill_emirate" msgid="2893880978835698818">"×מירות"</string>
<string name="permlab_readHistoryBookmarks" msgid="3775265775405106983">"קרי×ת סימניות והיסטוריית ×”×ינטרנט שלך"</string>
- <string name="permdesc_readHistoryBookmarks" msgid="8462378226600439658">"מ×פשר ל×פליקציה ×œ×§×¨×•× ×ת ההיסטוריה של כל כתובות ×”××ª×¨×™× ×©×‘×”×Ÿ הדפדפן ביקר, ו×ת כל ×”-Bookmarks של הדפדפן. ×©×™× ×œ×‘: דפדפני צד שלישי ×ו ×פליקציות ×חרות ×¢× ×™×›×•×œ×•×ª לדפדוף ב×ינטרנט ××™× × ×™×›×•×œ×™× ×œ×כוף ×ישור ×–×”."</string>
+ <string name="permdesc_readHistoryBookmarks" msgid="8462378226600439658">"â€×ž×פשר ל×פליקציה ×œ×§×¨×•× ×ת ההיסטוריה של כל כתובות ×”××ª×¨×™× ×©×‘×”×Ÿ הדפדפן ביקר, ו×ת כל ×”-Bookmarks של הדפדפן. ×©×™× ×œ×‘: דפדפני צד שלישי ×ו ×פליקציות ×חרות ×¢× ×™×›×•×œ×•×ª לדפדוף ב×ינטרנט ××™× × ×™×›×•×œ×™× ×œ×כוף ×ישור ×–×”."</string>
<string name="permlab_writeHistoryBookmarks" msgid="3714785165273314490">"כתיבת סימניות והיסטוריית ×ינטרנט"</string>
- <string name="permdesc_writeHistoryBookmarks" product="tablet" msgid="6825527469145760922">"מ×פשר ל×פליקציה לשנות ×ת ההיסטוריה ×ו ×”-Bookmarks של הדפדפן המ××•×—×¡× ×™× ×‘×˜×בלט. הדבר עשוי ל×פשר ל×פליקציה למחוק ×ו לשנות נתוני דפדפן. ×©×™× ×œ×‘: ×ישור ×–×” ×ינו ניתן ל×כיפה על ידי דפדפני צד שלישי ×ו ×פליקציות ×חרות בעלות יכולות גלישה ב×ינטרנט."</string>
- <string name="permdesc_writeHistoryBookmarks" product="default" msgid="8497389531014185509">"מ×פשר ל×פליקציה לשנות ×ת ההיסטוריה ×ו ×”-Bookmarks של הדפדפן המ××•×—×¡× ×™× ×‘×˜×œ×¤×•×Ÿ. הדבר עשוי ל×פשר ל×פליקציה למחוק ×ו לשנות נתוני דפדפן. ×©×™× ×œ×‘: ×ישור ×–×” ×ינו ניתן ל×כיפה על ידי דפדפני צד שלישי ×ו ×פליקציות ×חרות בעלות יכולות גלישה ב×ינטרנט."</string>
+ <string name="permdesc_writeHistoryBookmarks" product="tablet" msgid="6825527469145760922">"â€×ž×פשר ל×פליקציה לשנות ×ת ההיסטוריה ×ו ×”-Bookmarks של הדפדפן המ××•×—×¡× ×™× ×‘×˜×בלט. הדבר עשוי ל×פשר ל×פליקציה למחוק ×ו לשנות נתוני דפדפן. ×©×™× ×œ×‘: ×ישור ×–×” ×ינו ניתן ל×כיפה על ידי דפדפני צד שלישי ×ו ×פליקציות ×חרות בעלות יכולות גלישה ב×ינטרנט."</string>
+ <string name="permdesc_writeHistoryBookmarks" product="default" msgid="8497389531014185509">"â€×ž×פשר ל×פליקציה לשנות ×ת ההיסטוריה ×ו ×”-Bookmarks של הדפדפן המ××•×—×¡× ×™× ×‘×˜×œ×¤×•×Ÿ. הדבר עשוי ל×פשר ל×פליקציה למחוק ×ו לשנות נתוני דפדפן. ×©×™× ×œ×‘: ×ישור ×–×” ×ינו ניתן ל×כיפה על ידי דפדפני צד שלישי ×ו ×פליקציות ×חרות בעלות יכולות גלישה ב×ינטרנט."</string>
<string name="permlab_setAlarm" msgid="1379294556362091814">"הגדרת התר××”"</string>
<string name="permdesc_setAlarm" msgid="316392039157473848">"מ×פשר ל×פליקציה להגדיר התר××” ב×פליקציה מותקנת של שעון מעורר. ×פליקציות מסוימות של שעון מעורר ×ינן מיישמות תכונה זו."</string>
<string name="permlab_addVoicemail" msgid="5525660026090959044">"הוסף דו×ר קולי"</string>
@@ -955,7 +962,7 @@
<string name="permlab_bindPackageVerifier" msgid="4187786793360326654">"הכפפה למ×מת חבילה"</string>
<string name="permdesc_bindPackageVerifier" msgid="3180741773233862126">"מ×פשר למשתמש להגיש בקשות של מ×מתי חבילות. הרש××” זו ×œ×¢×•×œ× ××™× ×” נחוצה ל×פליקציות רגילי×."</string>
<string name="permlab_serialPort" msgid="546083327654631076">"גישה ליצי×ות טוריות"</string>
- <string name="permdesc_serialPort" msgid="2991639985224598193">"מ×פשר ×œ×‘×¢×œ×™× ×œ×’×©×ª ליצי×ות טוריות ב×מצעות ממשק ×”- API של SerialManager."</string>
+ <string name="permdesc_serialPort" msgid="2991639985224598193">"â€×ž×פשר ×œ×‘×¢×œ×™× ×œ×’×©×ª ליצי×ות טוריות ב×מצעות ממשק ×”- API של SerialManager."</string>
<string name="permlab_accessContentProvidersExternally" msgid="5077774297943409285">"גישה לספקי תוכן ב×ופן חיצוני"</string>
<string name="permdesc_accessContentProvidersExternally" msgid="4544346486697853685">"מ×פשר ×œ×‘×¢×œ×™× ×œ×’×©×ª לספקי תוכן מהמעטפת. ×œ×¢×•×œ× ×œ× ×מור להיות צורך עבור ×פליקציות רגילות."</string>
<string name="permlab_updateLock" msgid="3527558366616680889">"דחה עדכוני מכשיר ×וטומטיי×"</string>
@@ -1117,9 +1124,9 @@
<string name="whichApplication" msgid="4533185947064773386">"השלמת פעולה ב×מצעות"</string>
<string name="whichHomeApplication" msgid="4616420172727326782">"בחר ×פליקציה לדף הבית"</string>
<string name="alwaysUse" msgid="4583018368000610438">"השתמש כברירת מחדל עבור פעולה זו."</string>
- <string name="clearDefaultHintMsg" msgid="3252584689512077257">"× ×§×” ×ת הגדרת המחדל ב\'הגדרות מערכת\' &lt;†Google Apps†&lt; \'הורדות\'."</string>
+ <string name="clearDefaultHintMsg" msgid="3252584689512077257">"â€× ×§×” ×ת הגדרת המחדל ב\'הגדרות מערכת\' &lt;†Google Apps†&lt; \'הורדות\'."</string>
<string name="chooseActivity" msgid="7486876147751803333">"בחירת פעולה"</string>
- <string name="chooseUsbActivity" msgid="6894748416073583509">"בחר ×פליקציה עבור התקן ×”-USB"</string>
+ <string name="chooseUsbActivity" msgid="6894748416073583509">"â€×‘חר ×פליקציה עבור התקן ×”-USB"</string>
<string name="noApplications" msgid="2991814273936504689">"×ין ×פליקציות שיכולות לבצע פעולה זו."</string>
<string name="aerr_title" msgid="1905800560317137752"></string>
<string name="aerr_application" msgid="932628488013092776">"לצערנו, פעולת <xliff:g id="APPLICATION">%1$s</xliff:g> הופסקה."</string>
@@ -1138,9 +1145,9 @@
<string name="launch_warning_original" msgid="188102023021668683">"<xliff:g id="APP_NAME">%1$s</xliff:g> הופעל במקור."</string>
<string name="screen_compat_mode_scale" msgid="3202955667675944499">"שינוי קנה-מידה"</string>
<string name="screen_compat_mode_show" msgid="4013878876486655892">"הצג תמיד"</string>
- <string name="screen_compat_mode_hint" msgid="1064524084543304459">"×פשר תכונה זו מחדש ב\'הגדרות מערכת\' &lt;†Google Apps†&lt; \'הורדות\'."</string>
- <string name="smv_application" msgid="3307209192155442829">"×”×פליקציה <xliff:g id="APPLICATION">%1$s</xliff:g> (תהליך <xliff:g id="PROCESS">%2$s</xliff:g>) הפר ×ת מדיניות StrictMode ב×כיפה עצמית שלו."</string>
- <string name="smv_process" msgid="5120397012047462446">"התהליך <xliff:g id="PROCESS">%1$s</xliff:g> הפר ×ת מדיניות StrictMode ב×כיפה עצמית."</string>
+ <string name="screen_compat_mode_hint" msgid="1064524084543304459">"â€×פשר תכונה זו מחדש ב\'הגדרות מערכת\' &lt;†Google Apps†&lt; \'הורדות\'."</string>
+ <string name="smv_application" msgid="3307209192155442829">"â€×”×פליקציה <xliff:g id="APPLICATION">%1$s</xliff:g> (תהליך <xliff:g id="PROCESS">%2$s</xliff:g>) הפר ×ת מדיניות StrictMode ב×כיפה עצמית שלו."</string>
+ <string name="smv_process" msgid="5120397012047462446">"â€×”תהליך <xliff:g id="PROCESS">%1$s</xliff:g> הפר ×ת מדיניות StrictMode ב×כיפה עצמית."</string>
<string name="android_upgrading_title" msgid="1584192285441405746">"â€Android מבצע שדרוג…"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"מבצע ×ופטימיזציה של ×פליקציה <xliff:g id="NUMBER_0">%1$d</xliff:g> מתוך <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"מפעיל ×פליקציות."</string>
@@ -1156,14 +1163,14 @@
<string name="sendText" msgid="5209874571959469142">"בחירת פעולה לביצוע ×¢× ×˜×§×¡×˜"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"עוצמת קול של צלצול"</string>
<string name="volume_music" msgid="5421651157138628171">"עוצמת קול של מדיה"</string>
- <string name="volume_music_hint_playing_through_bluetooth" msgid="9165984379394601533">"הפעלה ב×מצעות Bluetooth"</string>
+ <string name="volume_music_hint_playing_through_bluetooth" msgid="9165984379394601533">"â€×”פעלה ב×מצעות Bluetooth"</string>
<string name="volume_music_hint_silent_ringtone_selected" msgid="8310739960973156272">"הוגדר רינגטון שקט"</string>
<string name="volume_call" msgid="3941680041282788711">"עוצמת קול בשיחה"</string>
- <string name="volume_bluetooth_call" msgid="2002891926351151534">"עוצמת הקול בשיחה ב-Bluetooth"</string>
+ <string name="volume_bluetooth_call" msgid="2002891926351151534">"â€×¢×•צמת הקול בשיחה ב-Bluetooth"</string>
<string name="volume_alarm" msgid="1985191616042689100">"עוצמת קול של התר××”"</string>
<string name="volume_notification" msgid="2422265656744276715">"עוצמת קול של התר×ות"</string>
<string name="volume_unknown" msgid="1400219669770445902">"עוצמת קול"</string>
- <string name="volume_icon_description_bluetooth" msgid="6538894177255964340">"עוצמת קול של Bluetooth"</string>
+ <string name="volume_icon_description_bluetooth" msgid="6538894177255964340">"â€×¢×•צמת קול של Bluetooth"</string>
<string name="volume_icon_description_ringer" msgid="3326003847006162496">"עוצמת קול של רינגטון"</string>
<string name="volume_icon_description_incall" msgid="8890073218154543397">"עוצמת קול של שיחות"</string>
<string name="volume_icon_description_media" msgid="4217311719665194215">"עוצמת קול של מדיה"</string>
@@ -1174,23 +1181,23 @@
<string name="ringtone_picker_title" msgid="3515143939175119094">"רינגטוני×"</string>
<string name="ringtone_unknown" msgid="5477919988701784788">"רינגטון ×œ× ×™×“×•×¢"</string>
<plurals name="wifi_available">
- <item quantity="one" msgid="6654123987418168693">"רשת Wi-Fi זמינה"</item>
- <item quantity="other" msgid="4192424489168397386">"רשתות Wi-Fi זמינות"</item>
+ <item quantity="one" msgid="6654123987418168693">"â€×¨×©×ª Wi-Fi זמינה"</item>
+ <item quantity="other" msgid="4192424489168397386">"â€×¨×©×ª×•ת Wi-Fi זמינות"</item>
</plurals>
<plurals name="wifi_available_detailed">
- <item quantity="one" msgid="1634101450343277345">"רשת Wi-Fi פתוחה זמינה"</item>
- <item quantity="other" msgid="7915895323644292768">"רשתות Wi-Fi פתוחות זמינות"</item>
+ <item quantity="one" msgid="1634101450343277345">"â€×¨×©×ª Wi-Fi פתוחה זמינה"</item>
+ <item quantity="other" msgid="7915895323644292768">"â€×¨×©×ª×•ת Wi-Fi פתוחות זמינות"</item>
</plurals>
- <string name="wifi_available_sign_in" msgid="4029489716605255386">"כניסה לרשת Wi-Fi"</string>
+ <string name="wifi_available_sign_in" msgid="4029489716605255386">"â€×›× ×™×¡×” לרשת Wi-Fi"</string>
<string name="network_available_sign_in" msgid="8495155593358054676">"היכנס לרשת"</string>
<!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
<skip />
- <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"×ין ×פשרות להתחבר ל-Wi-Fi"</string>
+ <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"â€×ין ×פשרות להתחבר ל-Wi-Fi"</string>
<string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" ×ינו מחובר היטב ל×ינטרנט."</string>
- <string name="wifi_p2p_dialog_title" msgid="97611782659324517">"Wi-Fi ישיר"</string>
- <string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"הפעל Wi-Fi ישיר. פעולה זו תכבה ×ת הלקוח/הנקודה החמה של ×”-Wi-Fi."</string>
- <string name="wifi_p2p_failed_message" msgid="3763669677935623084">"×œ× × ×™×ª×Ÿ להפעיל Wi-Fi ישיר"</string>
- <string name="wifi_p2p_enabled_notification_title" msgid="2068321881673734886">"Wi-Fi ישיר מופעל"</string>
+ <string name="wifi_p2p_dialog_title" msgid="97611782659324517">"â€Wi-Fi ישיר"</string>
+ <string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"â€×”פעל Wi-Fi ישיר. פעולה זו תכבה ×ת הלקוח/הנקודה החמה של ×”-Wi-Fi."</string>
+ <string name="wifi_p2p_failed_message" msgid="3763669677935623084">"â€×œ× ניתן להפעיל Wi-Fi ישיר"</string>
+ <string name="wifi_p2p_enabled_notification_title" msgid="2068321881673734886">"â€Wi-Fi ישיר מופעל"</string>
<string name="wifi_p2p_enabled_notification_message" msgid="1638949953993894335">"גע עבור הגדרות"</string>
<string name="accept" msgid="1645267259272829559">"קבל"</string>
<string name="decline" msgid="2112225451706137894">"דחה"</string>
@@ -1198,28 +1205,28 @@
<string name="wifi_p2p_invitation_to_connect_title" msgid="4958803948658533637">"הזמנה להתחבר"</string>
<string name="wifi_p2p_from_message" msgid="570389174731951769">"מ×ת:"</string>
<string name="wifi_p2p_to_message" msgid="248968974522044099">"×ל:"</string>
- <string name="wifi_p2p_enter_pin_message" msgid="5920929550367828970">"הקלד ×ת קוד ×”-PIN הנדרש."</string>
+ <string name="wifi_p2p_enter_pin_message" msgid="5920929550367828970">"â€×”קלד ×ת קוד ×”-PIN הנדרש."</string>
<string name="wifi_p2p_show_pin_message" msgid="8530563323880921094">"PIN:"</string>
- <string name="wifi_p2p_frequency_conflict_message" product="tablet" msgid="8012981257742232475">"הט×בלט יתנתק מרשת ×”-Wi-Fi ב×ופן זמני בשעה ×©×”×•× ×ž×—×•×‘×¨ ×ל <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
- <string name="wifi_p2p_frequency_conflict_message" product="default" msgid="7363907213787469151">"הטלפון יתנתק מרשת ×”-Wi-Fi ב×ופן זמני בשעה ×©×”×•× ×ž×—×•×‘×¨ ×ל <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+ <string name="wifi_p2p_frequency_conflict_message" product="tablet" msgid="8012981257742232475">"â€×”ט×בלט יתנתק מרשת ×”-Wi-Fi ב×ופן זמני בשעה ×©×”×•× ×ž×—×•×‘×¨ ×ל <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+ <string name="wifi_p2p_frequency_conflict_message" product="default" msgid="7363907213787469151">"â€×”טלפון יתנתק מרשת ×”-Wi-Fi ב×ופן זמני בשעה ×©×”×•× ×ž×—×•×‘×¨ ×ל <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
<string name="select_character" msgid="3365550120617701745">"הוסף תו"</string>
- <string name="sms_control_title" msgid="7296612781128917719">"שולח הודעות SMS"</string>
- <string name="sms_control_message" msgid="3867899169651496433">"&lt;b&gt; <xliff:g id="APP_NAME">%1$s</xliff:g> &lt;/ b&gt; שולח מספר רב של הודעות SMS. ×”×× ×‘×¨×¦×•× ×š ל×פשר ל×פליקציה זו להמשיך לשלוח הודעות?"</string>
+ <string name="sms_control_title" msgid="7296612781128917719">"â€×©×•לח הודעות SMS"</string>
+ <string name="sms_control_message" msgid="3867899169651496433">"â€&lt;b&gt; <xliff:g id="APP_NAME">%1$s</xliff:g> &lt;/ b&gt; שולח מספר רב של הודעות SMS. ×”×× ×‘×¨×¦×•× ×š ל×פשר ל×פליקציה זו להמשיך לשלוח הודעות?"</string>
<string name="sms_control_yes" msgid="3663725993855816807">"×פשר"</string>
<string name="sms_control_no" msgid="625438561395534982">"דחה"</string>
- <string name="sms_short_code_confirm_message" msgid="1645436466285310855">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; רוצה לשלוח הודעה ×ל &lt;b&gt;<xliff:g id="DEST_ADDRESS">%2$s</xliff:g>&lt;/b&gt;."</string>
+ <string name="sms_short_code_confirm_message" msgid="1645436466285310855">"â€&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; רוצה לשלוח הודעה ×ל &lt;b&gt;<xliff:g id="DEST_ADDRESS">%2$s</xliff:g>&lt;/b&gt;."</string>
<string name="sms_short_code_details" msgid="3492025719868078457">"הפעולה "<font fgcolor="#ffffb060">"עשויה ×œ×’×¨×•× ×œ×—×™×•×‘×™×"</font>" בחשבון המכשיר הנייד שלך."</string>
<string name="sms_premium_short_code_details" msgid="5523826349105123687"><font fgcolor="#ffffb060">"הפעולה ×ª×’×¨×•× ×œ×—×™×•×‘×™× ×‘×—×©×‘×•×Ÿ המכשיר הנייד שלך."</font></string>
<string name="sms_short_code_confirm_allow" msgid="4458878637111023413">"שלח"</string>
<string name="sms_short_code_confirm_deny" msgid="2927389840209170706">"בטל"</string>
<string name="sms_short_code_remember_choice" msgid="5289538592272218136">"זכור ×ת הבחירה שלי"</string>
- <string name="sms_short_code_remember_undo_instruction" msgid="4960944133052287484">"ניתן לשנות ×–×ת מ×וחר יותר ב\'הגדרות\' &gt; \'×פליקציות\'"</string>
+ <string name="sms_short_code_remember_undo_instruction" msgid="4960944133052287484">"â€× ×™×ª×Ÿ לשנות ×–×ת מ×וחר יותר ב\'הגדרות\' &gt; \'×פליקציות\'"</string>
<string name="sms_short_code_confirm_always_allow" msgid="3241181154869493368">"×פשר תמיד"</string>
<string name="sms_short_code_confirm_never_allow" msgid="446992765774269673">"×œ×¢×•×œ× ×ל ת×פשר"</string>
- <string name="sim_removed_title" msgid="6227712319223226185">"כרטיס ה-SIM הוסר"</string>
- <string name="sim_removed_message" msgid="2333164559970958645">"הרשת הסלולרית ×œ× ×ª×”×™×” זמינה עד שתפעיל מחדש ל×חר הכנסת כרטיס SIM חוקי."</string>
+ <string name="sim_removed_title" msgid="6227712319223226185">"â€×›×¨×˜×™×¡ ×”-SIM הוסר"</string>
+ <string name="sim_removed_message" msgid="2333164559970958645">"â€×”רשת הסלולרית ×œ× ×ª×”×™×” זמינה עד שתפעיל מחדש ל×חר הכנסת כרטיס SIM חוקי."</string>
<string name="sim_done_button" msgid="827949989369963775">"סיו×"</string>
- <string name="sim_added_title" msgid="3719670512889674693">"כרטיס ה-SIM נוסף"</string>
+ <string name="sim_added_title" msgid="3719670512889674693">"â€×›×¨×˜×™×¡ ×”-SIM נוסף"</string>
<string name="sim_added_message" msgid="6599945301141050216">"הפעל מחדש ×ת המכשיר כדי לגשת ×ל הרשת הסלולרית."</string>
<string name="sim_restart_button" msgid="4722407842815232347">"הפעל מחדש"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"הגדרת שעה"</string>
@@ -1230,38 +1237,38 @@
<string name="perms_description_app" msgid="5139836143293299417">"×ž×˜×¢× <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="no_permissions" msgid="7283357728219338112">"×œ× ×“×¨×•×©×™× ×ישורי×"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"פעולה זו עשויה לחייב ×ותך בכסף:"</string>
- <string name="usb_storage_activity_title" msgid="4465055157209648641">"×מצעי מסוג USB ל×חסון בנפח גדול"</string>
- <string name="usb_storage_title" msgid="5901459041398751495">"USB מחובר"</string>
- <string name="usb_storage_message" product="nosdcard" msgid="3308538094316477839">"התחברת למחשב ב×מצעות USB. ×’×¢ בלחצן שבהמשך ×× ×‘×¨×¦×•× ×š להעתיק ×§×‘×¦×™× ×‘×™×Ÿ המחשב ל×חסון ×”-USB של מכשיר ×”-Android שלך."</string>
- <string name="usb_storage_message" product="default" msgid="805351000446037811">"התחברת למחשב ב×מצעות USB. ×’×¢ בלחצן שבהמשך ×× ×‘×¨×¦×•× ×š להעתיק ×§×‘×¦×™× ×‘×™×Ÿ המחשב לבין כרטיס ×”-SD של מכשיר ×”-Android."</string>
- <string name="usb_storage_button_mount" msgid="1052259930369508235">"הפעל ×חסון USB"</string>
- <string name="usb_storage_error_message" product="nosdcard" msgid="3017045217365540658">"יש בעיה בשימוש ב×חסון ×”-USB שלך ל×חסון בנפח גדול ב-USB."</string>
- <string name="usb_storage_error_message" product="default" msgid="2876018512716970313">"יש בעיה בשימוש בכרטיס ×”-SD שלך ל×חסון בנפח גדול ב-USB."</string>
- <string name="usb_storage_notification_title" msgid="8175892554757216525">"USB מחובר"</string>
+ <string name="usb_storage_activity_title" msgid="4465055157209648641">"â€×מצעי מסוג USB ל×חסון בנפח גדול"</string>
+ <string name="usb_storage_title" msgid="5901459041398751495">"â€USB מחובר"</string>
+ <string name="usb_storage_message" product="nosdcard" msgid="3308538094316477839">"â€×”תחברת למחשב ב×מצעות USB. ×’×¢ בלחצן שבהמשך ×× ×‘×¨×¦×•× ×š להעתיק ×§×‘×¦×™× ×‘×™×Ÿ המחשב ל×חסון ×”-USB של מכשיר ×”-Android שלך."</string>
+ <string name="usb_storage_message" product="default" msgid="805351000446037811">"â€×”תחברת למחשב ב×מצעות USB. ×’×¢ בלחצן שבהמשך ×× ×‘×¨×¦×•× ×š להעתיק ×§×‘×¦×™× ×‘×™×Ÿ המחשב לבין כרטיס ×”-SD של מכשיר ×”-Android."</string>
+ <string name="usb_storage_button_mount" msgid="1052259930369508235">"â€×”פעל ×חסון USB"</string>
+ <string name="usb_storage_error_message" product="nosdcard" msgid="3017045217365540658">"â€×™×© בעיה בשימוש ב×חסון ×”-USB שלך ל×חסון בנפח גדול ב-USB."</string>
+ <string name="usb_storage_error_message" product="default" msgid="2876018512716970313">"â€×™×© בעיה בשימוש בכרטיס ×”-SD שלך ל×חסון בנפח גדול ב-USB."</string>
+ <string name="usb_storage_notification_title" msgid="8175892554757216525">"â€USB מחובר"</string>
<string name="usb_storage_notification_message" msgid="939822783828183763">"×’×¢ כדי להעתיק ×§×‘×¦×™× ×œ×ž×—×©×‘/מהמחשב."</string>
- <string name="usb_storage_stop_notification_title" msgid="2336058396663516017">"כבה ×חסון USB"</string>
- <string name="usb_storage_stop_notification_message" msgid="1656852098555623822">"×’×¢ כדי לכבות ×ת ×חסון ×”-USB."</string>
- <string name="usb_storage_stop_title" msgid="660129851708775853">"×חסון USB ×©× ×ž×¦× ×‘×©×™×ž×•×©"</string>
- <string name="usb_storage_stop_message" product="nosdcard" msgid="4264025280777219521">"לפני שתכבה ×ת ×חסון ×”-USB, בטל ×ת הטעינה (\"הוצ×\") של ×חסון ×”-USB של ×”-Android שלך מהמחשב."</string>
- <string name="usb_storage_stop_message" product="default" msgid="8043969782460613114">"לפני שתכבה ×ת ×חסון ×”-USB, ×•×“× ×©×‘×™×˜×œ×ª ×ת הטעינה (\"הוצ×ת\") של כרטיס ×”-SD של ×”-Android שלך מהמחשב."</string>
- <string name="usb_storage_stop_button_mount" msgid="7060218034900696029">"כבה ×חסון USB"</string>
- <string name="usb_storage_stop_error_message" msgid="1970374898263063836">"היתה בעיה בכיבוי ×חסון ×”-USB. ×•×“× ×©×‘×™×˜×œ×ª ×ת טעינת מ×רח ×”-USB, ול×חר מכן נסה שוב."</string>
- <string name="dlg_confirm_kill_storage_users_title" msgid="963039033470478697">"הפעל ×חסון USB"</string>
- <string name="dlg_confirm_kill_storage_users_text" msgid="5100428757107469454">"×× ×ª×¤×¢×™×œ ×חסון USB, ×פליקציות מסוימות שבהן ×תה משתמש יפסיקו לפעול, וייתכן שהן ×œ× ×™×”×™×• זמינות עד שתכבה ×ת ×חסון ×”-USB."</string>
- <string name="dlg_error_title" msgid="7323658469626514207">"פעולת USB נכשלה"</string>
+ <string name="usb_storage_stop_notification_title" msgid="2336058396663516017">"â€×›×‘×” ×חסון USB"</string>
+ <string name="usb_storage_stop_notification_message" msgid="1656852098555623822">"â€×’×¢ כדי לכבות ×ת ×חסון ×”-USB."</string>
+ <string name="usb_storage_stop_title" msgid="660129851708775853">"â€×חסון USB ×©× ×ž×¦× ×‘×©×™×ž×•×©"</string>
+ <string name="usb_storage_stop_message" product="nosdcard" msgid="4264025280777219521">"â€×œ×¤× ×™ שתכבה ×ת ×חסון ×”-USB, בטל ×ת הטעינה (\"הוצ×\") של ×חסון ×”-USB של ×”-Android שלך מהמחשב."</string>
+ <string name="usb_storage_stop_message" product="default" msgid="8043969782460613114">"â€×œ×¤× ×™ שתכבה ×ת ×חסון ×”-USB, ×•×“× ×©×‘×™×˜×œ×ª ×ת הטעינה (\"הוצ×ת\") של כרטיס ×”-SD של ×”-Android שלך מהמחשב."</string>
+ <string name="usb_storage_stop_button_mount" msgid="7060218034900696029">"â€×›×‘×” ×חסון USB"</string>
+ <string name="usb_storage_stop_error_message" msgid="1970374898263063836">"â€×”יתה בעיה בכיבוי ×חסון ×”-USB. ×•×“× ×©×‘×™×˜×œ×ª ×ת טעינת מ×רח ×”-USB, ול×חר מכן נסה שוב."</string>
+ <string name="dlg_confirm_kill_storage_users_title" msgid="963039033470478697">"â€×”פעל ×חסון USB"</string>
+ <string name="dlg_confirm_kill_storage_users_text" msgid="5100428757107469454">"â€×× ×ª×¤×¢×™×œ ×חסון USB, ×פליקציות מסוימות שבהן ×תה משתמש יפסיקו לפעול, וייתכן שהן ×œ× ×™×”×™×• זמינות עד שתכבה ×ת ×חסון ×”-USB."</string>
+ <string name="dlg_error_title" msgid="7323658469626514207">"â€×¤×¢×•לת USB נכשלה"</string>
<string name="dlg_ok" msgid="7376953167039865701">"×ישור"</string>
<string name="usb_mtp_notification_title" msgid="3699913097391550394">"מחובר כמכשיר מדיה"</string>
<string name="usb_ptp_notification_title" msgid="1960817192216064833">"מחובר כמצלמה"</string>
<string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"מחובר כמתקין"</string>
- <string name="usb_accessory_notification_title" msgid="7848236974087653666">"מחובר ל×ביזר USB"</string>
- <string name="usb_notification_message" msgid="2290859399983720271">"×’×¢ לקבלת ×פשרויות USB נוספות."</string>
- <string name="extmedia_format_title" product="nosdcard" msgid="9020092196061007262">"לפרמט ×ת ×מצעי ×”×חסון מסוג USB?"</string>
- <string name="extmedia_format_title" product="default" msgid="3648415921526526069">"לפרמט ×ת כרטיס ×”-SD?"</string>
- <string name="extmedia_format_message" product="nosdcard" msgid="3934016853425761078">"כל ×”×§×‘×¦×™× ×©×©×ž×•×¨×™× ×‘×מצעי ×”×חסון מסוג USB שלך יימחקו. פעולה זו ×”×™× ×‘×œ×ª×™ הפיכה!"</string>
+ <string name="usb_accessory_notification_title" msgid="7848236974087653666">"â€×ž×—ובר ל×ביזר USB"</string>
+ <string name="usb_notification_message" msgid="2290859399983720271">"â€×’×¢ לקבלת ×פשרויות USB נוספות."</string>
+ <string name="extmedia_format_title" product="nosdcard" msgid="9020092196061007262">"â€×œ×¤×¨×ž×˜ ×ת ×מצעי ×”×חסון מסוג USB?"</string>
+ <string name="extmedia_format_title" product="default" msgid="3648415921526526069">"â€×œ×¤×¨×ž×˜ ×ת כרטיס ×”-SD?"</string>
+ <string name="extmedia_format_message" product="nosdcard" msgid="3934016853425761078">"â€×›×œ ×”×§×‘×¦×™× ×©×©×ž×•×¨×™× ×‘×מצעי ×”×חסון מסוג USB שלך יימחקו. פעולה זו ×”×™× ×‘×œ×ª×™ הפיכה!"</string>
<string name="extmedia_format_message" product="default" msgid="14131895027543830">"כל ×”× ×ª×•× ×™× ×©×ž××•×—×¡× ×™× ×‘×›×¨×˜×™×¡ ×™×בדו."</string>
<string name="extmedia_format_button_format" msgid="4131064560127478695">"פרמוט"</string>
- <string name="adb_active_notification_title" msgid="6729044778949189918">"ניקוי ב××’×™× ×©×œ USB מחובר"</string>
- <string name="adb_active_notification_message" msgid="1016654627626476142">"×’×¢ כדי להשבית ×ת ניקוי הב××’×™× ×‘×”×ª×§×Ÿ ×”-USB."</string>
+ <string name="adb_active_notification_title" msgid="6729044778949189918">"â€× ×™×§×•×™ ב××’×™× ×©×œ USB מחובר"</string>
+ <string name="adb_active_notification_message" msgid="1016654627626476142">"â€×’×¢ כדי להשבית ×ת ניקוי הב××’×™× ×‘×”×ª×§×Ÿ ×”-USB."</string>
<string name="select_input_method" msgid="4653387336791222978">"בחר שיטת הזנה"</string>
<string name="configure_input_methods" msgid="9091652157722495116">"הגדר שיטות קלט"</string>
<string name="use_physical_keyboard" msgid="6203112478095117625">"מקלדת פיזית"</string>
@@ -1271,29 +1278,29 @@
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"מועמדי×"</u></string>
- <string name="ext_media_checking_notification_title" product="nosdcard" msgid="3449816005351468560">"מכין ×חסון USB"</string>
- <string name="ext_media_checking_notification_title" product="default" msgid="5457603418970994050">"מכין ×ת כרטיס SD"</string>
+ <string name="ext_media_checking_notification_title" product="nosdcard" msgid="3449816005351468560">"â€×ž×›×™×Ÿ ×חסון USB"</string>
+ <string name="ext_media_checking_notification_title" product="default" msgid="5457603418970994050">"â€×ž×›×™×Ÿ ×ת כרטיס SD"</string>
<string name="ext_media_checking_notification_message" msgid="8287319882926737053">"בודק ×× ×™×© שגי×ות."</string>
- <string name="ext_media_nofs_notification_title" product="nosdcard" msgid="7788040745686229307">"×מצעי ×חסון ריק מסוג USB"</string>
- <string name="ext_media_nofs_notification_title" product="default" msgid="780477838241212997">"כרטיס SD ריק"</string>
- <string name="ext_media_nofs_notification_message" product="nosdcard" msgid="7840121067427269500">"×חסון ×”-USB ריק ×ו שמערכת ×”×§×‘×¦×™× ×©×œ×• ××™× ×” נתמכת."</string>
- <string name="ext_media_nofs_notification_message" product="default" msgid="8641065641786923604">"כרטיס ×”-SD ריק ×ו שמערכת ×”×§×‘×¦×™× ×©×œ×• ××™× ×” נתמכת."</string>
- <string name="ext_media_unmountable_notification_title" product="nosdcard" msgid="2090046769532713563">"×מצעי ×חסון ×¤×’×•× ×ž×¡×•×’ USB"</string>
- <string name="ext_media_unmountable_notification_title" product="default" msgid="6410723906019100189">"כרטיס SD פגו×"</string>
- <string name="ext_media_unmountable_notification_message" product="nosdcard" msgid="1795917578395333280">"×חסון ×”-USB פגו×. נסה לפרמט ×ותו מחדש."</string>
- <string name="ext_media_unmountable_notification_message" product="default" msgid="1753898567525568253">"כרטיס ×”-SD פגו×. נסה לפרמט ×ותו מחדש."</string>
- <string name="ext_media_badremoval_notification_title" product="nosdcard" msgid="1661683031330951073">"×חסון USB הוסר ב×ופן בלתי צפוי"</string>
- <string name="ext_media_badremoval_notification_title" product="default" msgid="6872152882604407837">"כרטיס SD הוסר ב×ופן ×œ× ×¦×¤×•×™"</string>
- <string name="ext_media_badremoval_notification_message" product="nosdcard" msgid="4329848819865594241">"בטל טעינה של ×חסון USB לפני הסרתו כדי למנוע ×ובדן נתוני×."</string>
- <string name="ext_media_badremoval_notification_message" product="default" msgid="7260183293747448241">"בטל ×ת טעינת כרטיס SD לפני הסרתו כדי למנוע ×ובדן נתוני×."</string>
- <string name="ext_media_safe_unmount_notification_title" product="nosdcard" msgid="3967973893270360230">"ניתן להסיר ×ת ×מצעי ×”×חסון מסוג USB בבטחה"</string>
- <string name="ext_media_safe_unmount_notification_title" product="default" msgid="6729801130790616200">"×פשר להסיר ×ת כרטיס SD"</string>
- <string name="ext_media_safe_unmount_notification_message" product="nosdcard" msgid="6142195361606493530">"×תה יכול להסיר בבטחה ×ת ×חסון ×”-USB."</string>
- <string name="ext_media_safe_unmount_notification_message" product="default" msgid="568841278138377604">"ניתן להסיר בבטחה כרטיס SD."</string>
- <string name="ext_media_nomedia_notification_title" product="nosdcard" msgid="4486377230140227651">"×חסון USB הוסר"</string>
- <string name="ext_media_nomedia_notification_title" product="default" msgid="8902518030404381318">"כרטיס SD הוסר"</string>
- <string name="ext_media_nomedia_notification_message" product="nosdcard" msgid="6921126162580574143">"×חסון USB הוסר. הכנס מדיה חדשה."</string>
- <string name="ext_media_nomedia_notification_message" product="default" msgid="3870120652983659641">"כרטיס SD הוסר. הכנס כרטיס חדש."</string>
+ <string name="ext_media_nofs_notification_title" product="nosdcard" msgid="7788040745686229307">"â€×מצעי ×חסון ריק מסוג USB"</string>
+ <string name="ext_media_nofs_notification_title" product="default" msgid="780477838241212997">"â€×›×¨×˜×™×¡ SD ריק"</string>
+ <string name="ext_media_nofs_notification_message" product="nosdcard" msgid="7840121067427269500">"â€×חסון ×”-USB ריק ×ו שמערכת ×”×§×‘×¦×™× ×©×œ×• ××™× ×” נתמכת."</string>
+ <string name="ext_media_nofs_notification_message" product="default" msgid="8641065641786923604">"â€×›×¨×˜×™×¡ ×”-SD ריק ×ו שמערכת ×”×§×‘×¦×™× ×©×œ×• ××™× ×” נתמכת."</string>
+ <string name="ext_media_unmountable_notification_title" product="nosdcard" msgid="2090046769532713563">"â€×מצעי ×חסון ×¤×’×•× ×ž×¡×•×’ USB"</string>
+ <string name="ext_media_unmountable_notification_title" product="default" msgid="6410723906019100189">"â€×›×¨×˜×™×¡ SD פגו×"</string>
+ <string name="ext_media_unmountable_notification_message" product="nosdcard" msgid="1795917578395333280">"â€×חסון ×”-USB פגו×. נסה לפרמט ×ותו מחדש."</string>
+ <string name="ext_media_unmountable_notification_message" product="default" msgid="1753898567525568253">"â€×›×¨×˜×™×¡ ×”-SD פגו×. נסה לפרמט ×ותו מחדש."</string>
+ <string name="ext_media_badremoval_notification_title" product="nosdcard" msgid="1661683031330951073">"â€×חסון USB הוסר ב×ופן בלתי צפוי"</string>
+ <string name="ext_media_badremoval_notification_title" product="default" msgid="6872152882604407837">"â€×›×¨×˜×™×¡ SD הוסר ב×ופן ×œ× ×¦×¤×•×™"</string>
+ <string name="ext_media_badremoval_notification_message" product="nosdcard" msgid="4329848819865594241">"â€×‘טל טעינה של ×חסון USB לפני הסרתו כדי למנוע ×ובדן נתוני×."</string>
+ <string name="ext_media_badremoval_notification_message" product="default" msgid="7260183293747448241">"â€×‘טל ×ת טעינת כרטיס SD לפני הסרתו כדי למנוע ×ובדן נתוני×."</string>
+ <string name="ext_media_safe_unmount_notification_title" product="nosdcard" msgid="3967973893270360230">"â€× ×™×ª×Ÿ להסיר ×ת ×מצעי ×”×חסון מסוג USB בבטחה"</string>
+ <string name="ext_media_safe_unmount_notification_title" product="default" msgid="6729801130790616200">"â€×פשר להסיר ×ת כרטיס SD"</string>
+ <string name="ext_media_safe_unmount_notification_message" product="nosdcard" msgid="6142195361606493530">"â€×תה יכול להסיר בבטחה ×ת ×חסון ×”-USB."</string>
+ <string name="ext_media_safe_unmount_notification_message" product="default" msgid="568841278138377604">"â€× ×™×ª×Ÿ להסיר בבטחה כרטיס SD."</string>
+ <string name="ext_media_nomedia_notification_title" product="nosdcard" msgid="4486377230140227651">"â€×חסון USB הוסר"</string>
+ <string name="ext_media_nomedia_notification_title" product="default" msgid="8902518030404381318">"â€×›×¨×˜×™×¡ SD הוסר"</string>
+ <string name="ext_media_nomedia_notification_message" product="nosdcard" msgid="6921126162580574143">"â€×חסון USB הוסר. הכנס מדיה חדשה."</string>
+ <string name="ext_media_nomedia_notification_message" product="default" msgid="3870120652983659641">"â€×›×¨×˜×™×¡ SD הוסר. הכנס כרטיס חדש."</string>
<string name="activity_list_empty" msgid="1675388330786841066">"×œ× × ×ž×¦×ו פעילויות תו×מות."</string>
<string name="permlab_pkgUsageStats" msgid="8787352074326748892">"עדכן × ×ª×•× ×™× ×¡×˜×˜×™×¡×˜×™×™× ×¢×œ שימוש ברכיב"</string>
<string name="permdesc_pkgUsageStats" msgid="1106612424254277630">"מ×פשר ל×פליקציה לשנות סטטיסטיקות שימוש שנ×ספו לגבי ×¨×›×™×‘×™× ×©×•× ×™×. ×œ× ×ž×™×•×¢×“ לשימוש על ידי ×פליקציות רגילות."</string>
@@ -1306,7 +1313,7 @@
<string name="permlab_control_keyguard" msgid="172195184207828387">"שלוט בהצגה והסתרה של מגן המקלדת"</string>
<string name="permdesc_control_keyguard" msgid="3043732290518629061">"מ×פשר ל×פליקציה לשלוט במגן המקלדת."</string>
<string name="tutorial_double_tap_to_zoom_message_short" msgid="4070433208160063538">"×’×¢ ×¤×¢×ž×™×™× ×œ×‘×§×¨×ª מרחק מתצוגה"</string>
- <string name="gadget_host_error_inflating" msgid="4882004314906466162">"×œ× × ×™×ª×Ÿ להוסיף widget."</string>
+ <string name="gadget_host_error_inflating" msgid="4882004314906466162">"â€×œ× ניתן להוסיף widget."</string>
<string name="ime_action_go" msgid="8320845651737369027">"התחל"</string>
<string name="ime_action_search" msgid="658110271822807811">"חפש"</string>
<string name="ime_action_send" msgid="2316166556349314424">"שלח"</string>
@@ -1329,13 +1336,13 @@
<string name="wallpaper_binding_label" msgid="1240087844304687662">"טפט"</string>
<string name="chooser_wallpaper" msgid="7873476199295190279">"שנה טפט"</string>
<string name="notification_listener_binding_label" msgid="2014162835481906429">"מ×זין להתר×ות"</string>
- <string name="vpn_title" msgid="19615213552042827">"VPN מופעל"</string>
- <string name="vpn_title_long" msgid="6400714798049252294">"VPN מופעל על ידי <xliff:g id="APP">%s</xliff:g>"</string>
+ <string name="vpn_title" msgid="19615213552042827">"â€VPN מופעל"</string>
+ <string name="vpn_title_long" msgid="6400714798049252294">"â€VPN מופעל על ידי <xliff:g id="APP">%s</xliff:g>"</string>
<string name="vpn_text" msgid="3011306607126450322">"×’×¢ כדי לנהל ×ת הרשת."</string>
<string name="vpn_text_long" msgid="6407351006249174473">"מחובר ×ל <xliff:g id="SESSION">%s</xliff:g>. ×’×¢ כדי לנהל ×ת הרשת."</string>
- <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"ה-VPN שמופעל תמיד, מתחבר..."</string>
- <string name="vpn_lockdown_connected" msgid="8202679674819213931">"ה-VPN שפועל תמיד, מחובר"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"שגי×ת VPN שמופעל תמיד"</string>
+ <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"â€×”-VPN שמופעל תמיד, מתחבר..."</string>
+ <string name="vpn_lockdown_connected" msgid="8202679674819213931">"â€×”-VPN שפועל תמיד, מחובר"</string>
+ <string name="vpn_lockdown_error" msgid="6009249814034708175">"â€×©×’×™×ת VPN שמופעל תמיד"</string>
<string name="vpn_lockdown_config" msgid="6415899150671537970">"גע כדי להגדיר"</string>
<string name="upload_file" msgid="2897957172366730416">"בחר קובץ"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"×œ× × ×‘×—×¨ קובץ"</string>
@@ -1359,18 +1366,18 @@
<item quantity="other" msgid="4641872797067609177">"<xliff:g id="INDEX">%d</xliff:g> מתוך <xliff:g id="TOTAL">%d</xliff:g>"</item>
</plurals>
<string name="action_mode_done" msgid="7217581640461922289">"סיו×"</string>
- <string name="progress_unmounting" product="nosdcard" msgid="3923810448507612746">"מבטל טעינה של ×חסון USB..."</string>
- <string name="progress_unmounting" product="default" msgid="1327894998409537190">"מבטל טעינה של כרטיס SD..."</string>
- <string name="progress_erasing" product="nosdcard" msgid="4521573321524340058">"מוחק ×חסון USB..."</string>
- <string name="progress_erasing" product="default" msgid="6596988875507043042">"מוחק כרטיס SD..."</string>
- <string name="format_error" product="nosdcard" msgid="6299769563624776948">"×œ× × ×™×ª×Ÿ למחוק ×ת ×חסון ×”- USB."</string>
- <string name="format_error" product="default" msgid="7315248696644510935">"×œ× × ×™×ª×Ÿ למחוק ×ת כרטיס ×”-SD."</string>
- <string name="media_bad_removal" msgid="7960864061016603281">"כרטיס SD הוסר לפני שטעינתו בוטלה."</string>
- <string name="media_checking" product="nosdcard" msgid="418188720009569693">"×חסון USB נבדק כעת."</string>
- <string name="media_checking" product="default" msgid="7334762503904827481">"כרטיס SD נבדק כעת."</string>
- <string name="media_removed" msgid="7001526905057952097">"כרטיס SD הוסר."</string>
- <string name="media_shared" product="nosdcard" msgid="5830814349250834225">"×חסון USB × ×ž×¦× ×›×¢×ª בשימוש של מחשב."</string>
- <string name="media_shared" product="default" msgid="5706130568133540435">"כרטיס SD × ×ž×¦× ×›×¢×ª בשימוש של מחשב."</string>
+ <string name="progress_unmounting" product="nosdcard" msgid="3923810448507612746">"â€×ž×‘טל טעינה של ×חסון USB..."</string>
+ <string name="progress_unmounting" product="default" msgid="1327894998409537190">"â€×ž×‘טל טעינה של כרטיס SD..."</string>
+ <string name="progress_erasing" product="nosdcard" msgid="4521573321524340058">"â€×ž×•×—×§ ×חסון USB..."</string>
+ <string name="progress_erasing" product="default" msgid="6596988875507043042">"â€×ž×•×—×§ כרטיס SD..."</string>
+ <string name="format_error" product="nosdcard" msgid="6299769563624776948">"â€×œ× ניתן למחוק ×ת ×חסון ×”- USB."</string>
+ <string name="format_error" product="default" msgid="7315248696644510935">"â€×œ× ניתן למחוק ×ת כרטיס ×”-SD."</string>
+ <string name="media_bad_removal" msgid="7960864061016603281">"â€×›×¨×˜×™×¡ SD הוסר לפני שטעינתו בוטלה."</string>
+ <string name="media_checking" product="nosdcard" msgid="418188720009569693">"â€×חסון USB נבדק כעת."</string>
+ <string name="media_checking" product="default" msgid="7334762503904827481">"â€×›×¨×˜×™×¡ SD נבדק כעת."</string>
+ <string name="media_removed" msgid="7001526905057952097">"â€×›×¨×˜×™×¡ SD הוסר."</string>
+ <string name="media_shared" product="nosdcard" msgid="5830814349250834225">"â€×חסון USB × ×ž×¦× ×›×¢×ª בשימוש של מחשב."</string>
+ <string name="media_shared" product="default" msgid="5706130568133540435">"â€×›×¨×˜×™×¡ SD × ×ž×¦× ×›×¢×ª בשימוש של מחשב."</string>
<string name="media_unknown_state" msgid="729192782197290385">"מדיה חיצונית במצב ×œ× ×™×“×•×¢."</string>
<string name="share" msgid="1778686618230011964">"שתף"</string>
<string name="find" msgid="4808270900322985960">"מצ×"</string>
@@ -1398,8 +1405,8 @@
<string name="time_picker_decrement_minute_button" msgid="6246834937080684791">"הפחת דקה"</string>
<string name="time_picker_increment_hour_button" msgid="3652056055810223139">"הוסף שעה"</string>
<string name="time_picker_decrement_hour_button" msgid="1377479863429214792">"הפחת שעה"</string>
- <string name="time_picker_increment_set_pm_button" msgid="4147590696151230863">"הגדר PM"</string>
- <string name="time_picker_decrement_set_am_button" msgid="8302140353539486752">"הגדר AM"</string>
+ <string name="time_picker_increment_set_pm_button" msgid="4147590696151230863">"â€×”גדר PM"</string>
+ <string name="time_picker_decrement_set_am_button" msgid="8302140353539486752">"â€×”גדר AM"</string>
<string name="date_picker_increment_month_button" msgid="5369998479067934110">"הוסף חודש"</string>
<string name="date_picker_decrement_month_button" msgid="1832698995541726019">"הפחת חודש"</string>
<string name="date_picker_increment_day_button" msgid="7130465412308173903">"הוסף יו×"</string>
@@ -1414,6 +1421,7 @@
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
<string name="activitychooserview_choose_application" msgid="2125168057199941199">"בחר ×פליקציה"</string>
+ <string name="activitychooserview_choose_application_error" msgid="8624618365481126668">"×œ× × ×™×ª×Ÿ ×”×™×” להפעיל ×ת <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="shareactionprovider_share_with" msgid="806688056141131819">"שתף ×¢×"</string>
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"שתף ×¢× <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"ידית להחלקה. גע והחזק."</string>
@@ -1432,23 +1440,23 @@
<string name="action_bar_home_description" msgid="5293600496601490216">"נווט לדף הבית"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"נווט למעלה"</string>
<string name="action_menu_overflow_description" msgid="2295659037509008453">"×פשרויות נוספות"</string>
- <string name="action_bar_home_description_format" msgid="7965984360903693903">"%1$sâ€, %2$s"</string>
- <string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$sâ€, %2$sâ€, %3$s"</string>
+ <string name="action_bar_home_description_format" msgid="7965984360903693903">"â€%1$sâ€, %2$s"</string>
+ <string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"â€%1$sâ€, %2$sâ€, %3$s"</string>
<string name="storage_internal" msgid="4891916833657929263">"×חסון פנימי"</string>
- <string name="storage_sd_card" msgid="3282948861378286745">"כרטיס SD"</string>
- <string name="storage_usb" msgid="3017954059538517278">"×חסון USB"</string>
+ <string name="storage_sd_card" msgid="3282948861378286745">"â€×›×¨×˜×™×¡ SD"</string>
+ <string name="storage_usb" msgid="3017954059538517278">"â€×חסון USB"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"ערוך"</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"×זהרת שימוש בנתוני×"</string>
<string name="data_usage_warning_body" msgid="2814673551471969954">"גע כדי להציג נתוני שימוש והגדרות."</string>
- <string name="data_usage_3g_limit_title" msgid="7093334419518706686">"נתוני 2G-3G מושבתי×"</string>
- <string name="data_usage_4g_limit_title" msgid="7636489436819470761">"נתוני 4G מושבתי×"</string>
+ <string name="data_usage_3g_limit_title" msgid="7093334419518706686">"â€× ×ª×•× ×™ 2G-3G מושבתי×"</string>
+ <string name="data_usage_4g_limit_title" msgid="7636489436819470761">"â€× ×ª×•× ×™ 4G מושבתי×"</string>
<string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"× ×ª×•× ×™× ×œ× ×™×™×“ מושבתי×"</string>
- <string name="data_usage_wifi_limit_title" msgid="8992154736441284865">"נתוני Wi-Fi הושבתו"</string>
+ <string name="data_usage_wifi_limit_title" msgid="8992154736441284865">"â€× ×ª×•× ×™ Wi-Fi הושבתו"</string>
<string name="data_usage_limit_body" msgid="3317964706973601386">"גע כדי להפעיל"</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"×ירעה חריגה ממגבלת ×”× ×ª×•× ×™× ×©×œ 2G-3G"</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"×ירעה חריגה ממגבלת ×”× ×ª×•× ×™× ×©×œ 4G"</string>
+ <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"â€×ירעה חריגה ממגבלת ×”× ×ª×•× ×™× ×©×œ 2G-3G"</string>
+ <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"â€×ירעה חריגה ממגבלת ×”× ×ª×•× ×™× ×©×œ 4G"</string>
<string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"×ירעה חריגה ממגבלת ×”× ×ª×•× ×™× ×œ× ×™×™×“"</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"×ירעה חריגה ממגבלת ×”× ×ª×•× ×™× ×©×œ Wi-Fi"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"â€×ירעה חריגה ממגבלת ×”× ×ª×•× ×™× ×©×œ Wi-Fi"</string>
<string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"<xliff:g id="SIZE">%s</xliff:g> מעל למגבלה שצוינה."</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"נתוני הרקע מוגבלי×"</string>
<string name="data_usage_restricted_body" msgid="6741521330997452990">"×’×¢ כדי להסיר ×ת ההגבלה."</string>
@@ -1464,8 +1472,8 @@
<string name="expires_on" msgid="3676242949915959821">"ת×ריך תפוגה:"</string>
<string name="serial_number" msgid="758814067660862493">"מספר סידורי:"</string>
<string name="fingerprints" msgid="4516019619850763049">"טביעות ×צבע:"</string>
- <string name="sha256_fingerprint" msgid="4391271286477279263">"טביעת ×צבע SHA-256:"</string>
- <string name="sha1_fingerprint" msgid="7930330235269404581">"טביעת ×צבע SHA-1:"</string>
+ <string name="sha256_fingerprint" msgid="4391271286477279263">"â€×˜×‘יעת ×צבע SHA-256:"</string>
+ <string name="sha1_fingerprint" msgid="7930330235269404581">"â€×˜×‘יעת ×צבע SHA-1:"</string>
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"הצג הכל"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"בחר פעילות"</string>
<string name="share_action_provider_share_with" msgid="5247684435979149216">"שתף ×¢×"</string>
@@ -1481,7 +1489,7 @@
<string name="default_audio_route_name_dock_speakers" msgid="6240602982276591864">"×¨×ž×§×•×œ×™× ×©×œ מעגן"</string>
<string name="default_media_route_name_hdmi" msgid="2450970399023478055">"HDMI"</string>
<string name="default_audio_route_category_name" msgid="3722811174003886946">"מערכת"</string>
- <string name="bluetooth_a2dp_audio_route_name" msgid="8575624030406771015">"×ודיו Bluetooth"</string>
+ <string name="bluetooth_a2dp_audio_route_name" msgid="8575624030406771015">"â€×ודיו Bluetooth"</string>
<string name="wireless_display_route_description" msgid="9070346425023979651">"צג ×לחוטי"</string>
<string name="media_route_chooser_grouping_done" msgid="7966438307723317169">"סיו×"</string>
<string name="media_route_button_content_description" msgid="5758553567065145276">"פלט מדיה"</string>
@@ -1491,9 +1499,9 @@
<string name="media_route_status_not_available" msgid="6739899962681886401">"×œ× ×–×ž×™×Ÿ"</string>
<string name="media_route_status_in_use" msgid="4533786031090198063">"בשימוש"</string>
<string name="display_manager_built_in_display_name" msgid="2583134294292563941">"מסך מובנה"</string>
- <string name="display_manager_hdmi_display_name" msgid="1555264559227470109">"מסך HDMI"</string>
+ <string name="display_manager_hdmi_display_name" msgid="1555264559227470109">"â€×ž×¡×š HDMI"</string>
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"שכבת על #<xliff:g id="ID">%1$d</xliff:g>"</string>
- <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: ‎<xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>‎, â€<xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
+ <string name="display_manager_overlay_display_title" msgid="652124517672257172">"â€<xliff:g id="NAME">%1$s</xliff:g>: ‎<xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>‎, â€<xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", מ×ובטח"</string>
<string name="wifi_display_notification_title" msgid="2223050649240326557">"מסך ×לחוטי מחובר"</string>
<string name="wifi_display_notification_message" msgid="4498802012464170685">"מסך ×–×” מוצג במכשיר ×חר"</string>
@@ -1502,30 +1510,30 @@
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"שכחת ×ת הקו"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"קו ביטול נעילה שגוי"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"סיסמה שגויה"</string>
- <string name="kg_wrong_pin" msgid="1131306510833563801">"מספר PIN שגוי"</string>
+ <string name="kg_wrong_pin" msgid="1131306510833563801">"â€×ž×¡×¤×¨ PIN שגוי"</string>
<string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"נסה שוב בעוד <xliff:g id="NUMBER">%1$d</xliff:g> שניות."</string>
<string name="kg_pattern_instructions" msgid="398978611683075868">"שרטט ×ת קו ביטול הנעילה"</string>
- <string name="kg_sim_pin_instructions" msgid="2319508550934557331">"הזן מספר PIN ל-SIM"</string>
- <string name="kg_pin_instructions" msgid="2377242233495111557">"הזן מספר PIN"</string>
+ <string name="kg_sim_pin_instructions" msgid="2319508550934557331">"â€×”זן מספר PIN ל-SIM"</string>
+ <string name="kg_pin_instructions" msgid="2377242233495111557">"â€×”זן מספר PIN"</string>
<string name="kg_password_instructions" msgid="5753646556186936819">"הזן ×ת הסיסמה"</string>
- <string name="kg_puk_enter_puk_hint" msgid="453227143861735537">"כרטיס ×”-SIM מושבת כעת. הזן קוד PUK כדי להמשיך. פנה ×ל הספק לפרטי×."</string>
- <string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"הזן ×ת קוד ×”-PIN הרצוי"</string>
- <string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"×שר ×ת קוד ×”-PIN הרצוי"</string>
- <string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"מבטל נעילה של כרטיס SIM…"</string>
- <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"קוד PIN שגוי."</string>
- <string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"הקלד מספר PIN ש×ורכו 4 עד 8 ספרות."</string>
- <string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"קוד PUK צריך להיות בן 8 ספרות ×ו יותר."</string>
- <string name="kg_invalid_puk" msgid="3638289409676051243">"הזן מחדש ×ת קוד PUK הנכון. ניסיונות ×—×•×–×¨×™× ×™×©×‘×™×ª×• לצמיתות ×ת כרטיס ×”-SIM."</string>
- <string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"קודי ×”-PIN ××™× × ×ª×•×מי×"</string>
+ <string name="kg_puk_enter_puk_hint" msgid="453227143861735537">"â€×›×¨×˜×™×¡ ×”-SIM מושבת כעת. הזן קוד PUK כדי להמשיך. פנה ×ל הספק לפרטי×."</string>
+ <string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"â€×”זן ×ת קוד ×”-PIN הרצוי"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"â€×שר ×ת קוד ×”-PIN הרצוי"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"â€×ž×‘טל נעילה של כרטיס SIM…"</string>
+ <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"â€×§×•ד PIN שגוי."</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"â€×”קלד מספר PIN ש×ורכו 4 עד 8 ספרות."</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"â€×§×•ד PUK צריך להיות בן 8 ספרות ×ו יותר."</string>
+ <string name="kg_invalid_puk" msgid="3638289409676051243">"â€×”זן מחדש ×ת קוד PUK הנכון. ניסיונות ×—×•×–×¨×™× ×™×©×‘×™×ª×• לצמיתות ×ת כרטיס ×”-SIM."</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"â€×§×•די ×”-PIN ××™× × ×ª×•×מי×"</string>
<string name="kg_login_too_many_attempts" msgid="6486842094005698475">"ניסיונות ×¨×‘×™× ×ž×“×™ לשרטוט קו ביטול נעילה."</string>
- <string name="kg_login_instructions" msgid="1100551261265506448">"כדי לבטל ×ת הנעילה, היכנס ב×מצעות חשבון Google שלך."</string>
+ <string name="kg_login_instructions" msgid="1100551261265506448">"â€×›×“×™ לבטל ×ת הנעילה, היכנס ב×מצעות חשבון Google שלך."</string>
<string name="kg_login_username_hint" msgid="5718534272070920364">"×©× ×ž×©×ª×ž×© (דו×\"ל)"</string>
<string name="kg_login_password_hint" msgid="9057289103827298549">"סיסמה"</string>
<string name="kg_login_submit_button" msgid="5355904582674054702">"היכנס"</string>
<string name="kg_login_invalid_input" msgid="5754664119319872197">"×©× ×ž×©×ª×ž×© ×ו סיסמה ×œ× ×—×•×§×™×™×."</string>
- <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"שכחת ×ת ×©× ×”×ž×©×ª×ž×© ×ו הסיסמה?\nבקר בכתובת "<b>"google.com/accounts/recovery"</b></string>
+ <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"â€×©×›×—ת ×ת ×©× ×”×ž×©×ª×ž×© ×ו הסיסמה?\nבקר בכתובת "<b>"google.com/accounts/recovery"</b></string>
<string name="kg_login_checking_password" msgid="1052685197710252395">"בודק חשבון…"</string>
- <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"הקלדת מספר PIN שגוי <xliff:g id="NUMBER_0">%d</xliff:g> פעמי×. \n\nנסה שוב בעוד <xliff:g id="NUMBER_1">%d</xliff:g> שניות."</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"â€×”קלדת מספר PIN שגוי <xliff:g id="NUMBER_0">%d</xliff:g> פעמי×. \n\nנסה שוב בעוד <xliff:g id="NUMBER_1">%d</xliff:g> שניות."</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"הקלדת סיסמה שגויה <xliff:g id="NUMBER_0">%d</xliff:g> פעמי×.\n\nנסה שוב בעוד <xliff:g id="NUMBER_1">%d</xliff:g> שניות."</string>
<string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"שרטטת ×ת קו ביטול הנעילה ב×ופן שגוי <xliff:g id="NUMBER_0">%d</xliff:g> פעמי×. \n\nנסה שוב בעוד <xliff:g id="NUMBER_1">%d</xliff:g> שניות."</string>
<string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1575557200627128949">"ביצעת <xliff:g id="NUMBER_0">%d</xliff:g> ניסיונות ×©×’×•×™×™× ×œ×‘×™×˜×•×œ נעילת הטלפון. ל×חר <xliff:g id="NUMBER_1">%d</xliff:g> ניסיונות ×›×•×©×œ×™× × ×•×¡×¤×™×, הט×בלט יעבור ×יפוס לברירת המחדל של היצרן וכל נתוני המשתמש ×™×בדו."</string>
@@ -1585,9 +1593,9 @@
<string name="mediasize_na_junior_legal" msgid="3309324162155085904">"Junior Legal"</string>
<string name="mediasize_na_ledger" msgid="5567030340509075333">"Ledger"</string>
<string name="mediasize_na_tabloid" msgid="4571735038501661757">"Tabloid"</string>
- <string name="mediasize_na_index_3x5" msgid="5182901917818625126">"כרטיס ×ינדקס 3x5"</string>
- <string name="mediasize_na_index_4x6" msgid="7687620625422312396">"כרטיס ×ינדקס 4x6"</string>
- <string name="mediasize_na_index_5x8" msgid="8834215284646872800">"כרטיס ×ינדקס 5x8"</string>
+ <string name="mediasize_na_index_3x5" msgid="5182901917818625126">"â€×›×¨×˜×™×¡ ×ינדקס 3x5"</string>
+ <string name="mediasize_na_index_4x6" msgid="7687620625422312396">"â€×›×¨×˜×™×¡ ×ינדקס 4x6"</string>
+ <string name="mediasize_na_index_5x8" msgid="8834215284646872800">"â€×›×¨×˜×™×¡ ×ינדקס 5x8"</string>
<string name="mediasize_na_monarch" msgid="213639906956550754">"Monarch"</string>
<string name="mediasize_na_quarto" msgid="835778493593023223">"Quarto"</string>
<string name="mediasize_na_foolscap" msgid="1573911237983677138">"Foolscap"</string>
@@ -1635,19 +1643,30 @@
<string name="reason_service_unavailable" msgid="7824008732243903268">"שירות ההדפסה ×œ× ×”×•×¤×¢×œ"</string>
<string name="print_service_installed_title" msgid="2246317169444081628">"שירות <xliff:g id="NAME">%s</xliff:g> מותקן"</string>
<string name="print_service_installed_message" msgid="5897362931070459152">"הקש כדי להפעיל"</string>
- <string name="restr_pin_enter_admin_pin" msgid="783643731895143970">"הזן ×ת מספר ×”-PIN של מנהל המערכת"</string>
- <string name="restr_pin_enter_pin" msgid="3395953421368476103">"הזן מספר PIN"</string>
+ <string name="restr_pin_enter_admin_pin" msgid="783643731895143970">"â€×”זן ×ת מספר ×”-PIN של מנהל המערכת"</string>
+ <string name="restr_pin_enter_pin" msgid="3395953421368476103">"â€×”זן מספר PIN"</string>
<string name="restr_pin_incorrect" msgid="8571512003955077924">"שגוי"</string>
- <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"מספר PIN נוכחי"</string>
- <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"מספר PIN חדש"</string>
- <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"×שר ×ת מספר ×”-PIN החדש"</string>
- <string name="restr_pin_create_pin" msgid="8017600000263450337">"צור מספר PIN לשינוי הגבלות"</string>
- <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"מספרי ×”-PIN ×œ× ×ª×•×מי×. נסה שוב."</string>
- <string name="restr_pin_error_too_short" msgid="8173982756265777792">"מספר ×”-PIN קצר מדי. חייב להיות ב×ורך 4 ספרות לפחות."</string>
+ <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"â€×ž×¡×¤×¨ PIN נוכחי"</string>
+ <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"â€×ž×¡×¤×¨ PIN חדש"</string>
+ <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"â€×שר ×ת מספר ×”-PIN החדש"</string>
+ <string name="restr_pin_create_pin" msgid="8017600000263450337">"â€×¦×•ר מספר PIN לשינוי הגבלות"</string>
+ <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"â€×ž×¡×¤×¨×™ ×”-PIN ×œ× ×ª×•×מי×. נסה שוב."</string>
+ <string name="restr_pin_error_too_short" msgid="8173982756265777792">"â€×ž×¡×¤×¨ ×”-PIN קצר מדי. חייב להיות ב×ורך 4 ספרות לפחות."</string>
<plurals name="restr_pin_countdown">
<item quantity="one" msgid="311050995198548675">"נסה שוב בעוד שנייה"</item>
<item quantity="other" msgid="4730868920742952817">"נסה שוב בעוד <xliff:g id="COUNT">%d</xliff:g> שניות"</item>
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"נסה שוב מ×וחר יותר"</string>
<string name="immersive_mode_confirmation" msgid="7227416894979047467">"החלק מטה מהחלק העליון כדי לצ×ת ממסך מל×."</string>
+ <string name="done_label" msgid="2093726099505892398">"בוצע"</string>
+ <string name="hour_picker_description" msgid="6698199186859736512">"מחוון שעות מעגלי"</string>
+ <string name="minute_picker_description" msgid="8606010966873791190">"מחוון דקות מעגלי"</string>
+ <string name="select_hours" msgid="6043079511766008245">"בחר שעות"</string>
+ <string name="select_minutes" msgid="3974345615920336087">"בחר דקות"</string>
+ <string name="day_picker_description" msgid="8990847925961297968">"בחירת ×™×ž×™× ×‘×—×•×“×© בתצוגת רשת"</string>
+ <string name="year_picker_description" msgid="5524331207436052403">"רשימת שני×"</string>
+ <string name="select_day" msgid="7774759604701773332">"בחר חודש ויו×"</string>
+ <string name="select_year" msgid="7952052866994196170">"בחר שנה"</string>
+ <string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> נבחר"</string>
+ <string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> נמחק"</string>
</resources>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index 246a82e..4a65a8a 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -50,6 +50,11 @@
<string name="invalidPuk" msgid="8761456210898036513">"PUKã¯8æ¡ä»¥ä¸Šã§å…¥åŠ›ã—ã¦ãã ã•ã„。"</string>
<string name="needPuk" msgid="919668385956251611">"SIMカードã¯PUKã§ãƒ­ãƒƒã‚¯ã•れã¦ã„ã¾ã™ã€‚ロックを解除ã™ã‚‹ã«ã¯PUKコードを入力ã—ã¦ãã ã•ã„。"</string>
<string name="needPuk2" msgid="4526033371987193070">"SIMカードã®ãƒ­ãƒƒã‚¯è§£é™¤ã®ãŸã‚PUK2を入力ã—ã¾ã™ã€‚"</string>
+ <string name="enablePin" msgid="209412020907207950">"SIM/RUIMロックを有効ã«ã—ã¦ãã ã•ã„。"</string>
+ <plurals name="pinpuk_attempts">
+ <item quantity="one" msgid="6596245285809790142">"入力ã§ãã‚‹ã®ã¯ã‚ã¨<xliff:g id="NUMBER">%d</xliff:g>回ã§ã™ã€‚ã“ã®å›žæ•°ã‚’è¶…ãˆã‚‹ã¨SIMãŒãƒ­ãƒƒã‚¯ã•れã¾ã™ã€‚"</item>
+ <item quantity="other" msgid="7530597808358774740">"入力ã§ãã‚‹ã®ã¯ã‚ã¨<xliff:g id="NUMBER">%d</xliff:g>回ã§ã™ã€‚ã“ã®å›žæ•°ã‚’è¶…ãˆã‚‹ã¨SIMãŒãƒ­ãƒƒã‚¯ã•れã¾ã™ã€‚"</item>
+ </plurals>
<string name="imei" msgid="2625429890869005782">"IMEI"</string>
<string name="meid" msgid="4841221237681254195">"MEID"</string>
<string name="ClipMmi" msgid="6952821216480289285">"ç€ä¿¡æ™‚ã®ç™ºä¿¡è€…番å·"</string>
@@ -477,6 +482,8 @@
<string name="permdesc_accessSurfaceFlinger" msgid="1041619516733293551">"SurfaceFlingerã®ä½Žãƒ¬ãƒ™ãƒ«ã®æ©Ÿèƒ½ã®ä½¿ç”¨ã‚’アプリã«è¨±å¯ã—ã¾ã™ã€‚"</string>
<string name="permlab_readFrameBuffer" msgid="6690504248178498136">"フレームãƒãƒƒãƒ•ã‚¡ã®èª­ã¿å–り"</string>
<string name="permdesc_readFrameBuffer" msgid="4937405521809454680">"フレームãƒãƒƒãƒ•ã‚¡ã®å†…容ã®èª­ã¿å–りをアプリã«è¨±å¯ã—ã¾ã™ã€‚"</string>
+ <string name="permlab_accessInputFlinger" msgid="5348635270689553857">"InputFlingerã¸ã®ã‚¢ã‚¯ã‚»ã‚¹"</string>
+ <string name="permdesc_accessInputFlinger" msgid="2104864941201226616">"InputFlingerã®ä½Žãƒ¬ãƒ™ãƒ«ã®æ©Ÿèƒ½ã‚’使用ã™ã‚‹ã“ã¨ã‚’アプリã«è¨±å¯ã—ã¾ã™ã€‚"</string>
<string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"Wi-Fiディスプレイã®è¨­å®š"</string>
<string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"Wi-Fiディスプレイを設定ã—ã¦æŽ¥ç¶šã™ã‚‹ã“ã¨ã‚’アプリã«è¨±å¯ã—ã¾ã™ã€‚"</string>
<string name="permlab_controlWifiDisplay" msgid="393641276723695496">"Wi-Fiディスプレイã®åˆ¶å¾¡"</string>
@@ -1414,6 +1421,7 @@
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
<string name="activitychooserview_choose_application" msgid="2125168057199941199">"アプリã®é¸æŠž"</string>
+ <string name="activitychooserview_choose_application_error" msgid="8624618365481126668">"<xliff:g id="APPLICATION_NAME">%s</xliff:g>ã‚’èµ·å‹•ã§ãã¾ã›ã‚“ã§ã—ãŸ"</string>
<string name="shareactionprovider_share_with" msgid="806688056141131819">"共有"</string>
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"<xliff:g id="APPLICATION_NAME">%s</xliff:g>ã¨å…±æœ‰"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"スライダーãƒãƒ³ãƒ‰ãƒ«ã§ã™ã€‚押ã—ç¶šã‘ã¾ã™ã€‚"</string>
@@ -1650,4 +1658,15 @@
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"ã—ã°ã‚‰ãã—ã¦ã‹ã‚‰å†è©¦è¡Œ"</string>
<string name="immersive_mode_confirmation" msgid="7227416894979047467">"全画é¢è¡¨ç¤ºã‚’終了ã™ã‚‹ã«ã¯ã€ä¸Šã‹ã‚‰ä¸‹ã«ã‚¹ãƒ¯ã‚¤ãƒ—"</string>
+ <string name="done_label" msgid="2093726099505892398">"完了"</string>
+ <string name="hour_picker_description" msgid="6698199186859736512">"円形スライダー(時)"</string>
+ <string name="minute_picker_description" msgid="8606010966873791190">"円形スライダー(分)"</string>
+ <string name="select_hours" msgid="6043079511766008245">"æ™‚é–“ã‚’é¸æŠž"</string>
+ <string name="select_minutes" msgid="3974345615920336087">"åˆ†ã‚’é¸æŠž"</string>
+ <string name="day_picker_description" msgid="8990847925961297968">"日グリッド(月別)"</string>
+ <string name="year_picker_description" msgid="5524331207436052403">"年リスト"</string>
+ <string name="select_day" msgid="7774759604701773332">"æœˆã¨æ—¥ã‚’é¸æŠž"</string>
+ <string name="select_year" msgid="7952052866994196170">"å¹´ã‚’é¸æŠž"</string>
+ <string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g>ã‚’é¸æŠžã—ã¾ã—ãŸ"</string>
+ <string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g>を削除ã—ã¾ã—ãŸ"</string>
</resources>
diff --git a/core/res/res/values-ka-rGE/strings.xml b/core/res/res/values-ka-rGE/strings.xml
index a8025d8..ae71d43 100644
--- a/core/res/res/values-ka-rGE/strings.xml
+++ b/core/res/res/values-ka-rGE/strings.xml
@@ -50,6 +50,11 @@
<string name="invalidPuk" msgid="8761456210898036513">"áƒáƒ™áƒ áƒ˜áƒ¤áƒ”თ PUK, რáƒáƒ›áƒ”ლიც რვრáƒáƒœ მეტი ციფრისგáƒáƒœ შედგებáƒ."</string>
<string name="needPuk" msgid="919668385956251611">"თქვენი SIM ბáƒáƒ áƒáƒ—ი დáƒáƒ‘ლáƒáƒ™áƒ˜áƒšáƒ˜áƒ PUK კáƒáƒ“ით. გáƒáƒœáƒ‘ლáƒáƒ™áƒ•ისთვის შეიყვáƒáƒœáƒ”თ PUK კáƒáƒ“ი."</string>
<string name="needPuk2" msgid="4526033371987193070">"SIM ბáƒáƒ áƒáƒ—ის გáƒáƒœáƒ¡áƒáƒ‘ლáƒáƒ™áƒáƒ“ áƒáƒ™áƒ áƒ˜áƒ¤áƒ”თ PUK2."</string>
+ <string name="enablePin" msgid="209412020907207950">"წáƒáƒ áƒ£áƒ›áƒáƒ¢áƒ”ბელი მცდელáƒáƒ‘áƒ. ჩáƒáƒ áƒ—ეთ SIM/RUIM ჩáƒáƒ™áƒ”ტვáƒ."</string>
+ <plurals name="pinpuk_attempts">
+ <item quantity="one" msgid="6596245285809790142">"თქვენ დáƒáƒ’რჩáƒáƒ— <xliff:g id="NUMBER">%d</xliff:g> მცდელáƒáƒ‘áƒ, სáƒáƒœáƒáƒ› SIM დáƒáƒ˜áƒ‘ლáƒáƒ™áƒ”ბáƒáƒ“ეს."</item>
+ <item quantity="other" msgid="7530597808358774740">"თქვენ დáƒáƒ’რჩáƒáƒ— <xliff:g id="NUMBER">%d</xliff:g> მცდელáƒáƒ‘áƒ, სáƒáƒœáƒáƒ› SIM დáƒáƒ˜áƒ‘ლáƒáƒ™áƒ”ბáƒáƒ“ეს."</item>
+ </plurals>
<string name="imei" msgid="2625429890869005782">"IMEI"</string>
<string name="meid" msgid="4841221237681254195">"MEID"</string>
<string name="ClipMmi" msgid="6952821216480289285">"შემáƒáƒ›áƒáƒ•áƒáƒšáƒ˜ ზáƒáƒ áƒ˜áƒ¡ áƒáƒ‘áƒáƒœáƒ”ნტის ID"</string>
@@ -477,6 +482,8 @@
<string name="permdesc_accessSurfaceFlinger" msgid="1041619516733293551">"áƒáƒžáƒ¡ შეეძლებáƒ, გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნáƒáƒ¡ SurfaceFlinger-ის დáƒáƒ‘áƒáƒšáƒ˜ დáƒáƒœáƒ˜áƒ¡ ელემენტები."</string>
<string name="permlab_readFrameBuffer" msgid="6690504248178498136">"კáƒáƒ“რის ბუფერის (ეკრáƒáƒœáƒ˜áƒ¡ შიგთáƒáƒ•სის) წáƒáƒ™áƒ˜áƒ—ხვáƒ"</string>
<string name="permdesc_readFrameBuffer" msgid="4937405521809454680">"áƒáƒžáƒ¡ შეეძლებრწáƒáƒ˜áƒ™áƒ˜áƒ—ხáƒáƒ¡ ბუფერული ჩáƒáƒ áƒ©áƒáƒ¡ კáƒáƒœáƒ¢áƒ”ნტი."</string>
+ <string name="permlab_accessInputFlinger" msgid="5348635270689553857">"InputFlinger-ზე წვდáƒáƒ›áƒ"</string>
+ <string name="permdesc_accessInputFlinger" msgid="2104864941201226616">"áƒáƒžáƒ¡ შეეძლებáƒ, გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნáƒáƒ¡ InputFlinger-ის დáƒáƒ‘áƒáƒšáƒ˜ დáƒáƒœáƒ˜áƒ¡ ფუნქციები."</string>
<string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"Wifi ეკრáƒáƒœáƒ˜áƒ¡ კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ"</string>
<string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"áƒáƒžáƒ¡ შეეძლებრWifi ეკრáƒáƒœáƒ”ბთáƒáƒœ დáƒáƒ™áƒáƒ•შირებრდრდáƒáƒ™áƒáƒœáƒ¤áƒ˜áƒ’ურირებáƒ."</string>
<string name="permlab_controlWifiDisplay" msgid="393641276723695496">"Wifi ეკრáƒáƒœáƒ”ბის მáƒáƒ áƒ—ვáƒ"</string>
@@ -1414,6 +1421,7 @@
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift-"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"შეყვáƒáƒœáƒ"</string>
<string name="activitychooserview_choose_application" msgid="2125168057199941199">"áƒáƒžáƒ˜áƒ¡ áƒáƒ áƒ©áƒ”ვáƒ"</string>
+ <string name="activitychooserview_choose_application_error" msgid="8624618365481126668">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> ვერ გáƒáƒ”შვáƒ"</string>
<string name="shareactionprovider_share_with" msgid="806688056141131819">"გáƒáƒ–იáƒáƒ áƒ”ბáƒ"</string>
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"გáƒáƒ£áƒ–იáƒáƒ áƒ”თ <xliff:g id="APPLICATION_NAME">%s</xliff:g>-ს"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"გáƒáƒ¡áƒ áƒ˜áƒáƒšáƒ”ბით მáƒáƒ áƒ—ვáƒ. შეეხეთ &amp; áƒáƒ  áƒáƒ£áƒ¨áƒ•áƒáƒ—."</string>
@@ -1649,5 +1657,16 @@
<item quantity="other" msgid="4730868920742952817">"კიდევ ერთხელ სცáƒáƒ“ეთ <xliff:g id="COUNT">%d</xliff:g> წáƒáƒ›áƒ¨áƒ˜"</item>
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"სცáƒáƒ“ეთ მáƒáƒ’ვიáƒáƒœáƒ”ბით"</string>
- <string name="immersive_mode_confirmation" msgid="7227416894979047467">"ჩáƒáƒ›áƒáƒáƒ¡áƒ áƒ˜áƒáƒšáƒ”თ ზევიდáƒáƒœ სრული ეკრáƒáƒœáƒ˜áƒ¡ დáƒáƒ¡áƒáƒ®áƒ£áƒ áƒáƒ“"</string>
+ <string name="immersive_mode_confirmation" msgid="7227416894979047467">"ჩáƒáƒ›áƒáƒáƒ¡áƒ áƒ˜áƒáƒšáƒ”თ ზევიდáƒáƒœ სრული ეკრáƒáƒœáƒ˜áƒ¡ დáƒáƒ¡áƒáƒ®áƒ£áƒ áƒáƒ“."</string>
+ <string name="done_label" msgid="2093726099505892398">"დáƒáƒ¡áƒ áƒ£áƒšáƒ“áƒ"</string>
+ <string name="hour_picker_description" msgid="6698199186859736512">"სáƒáƒáƒ—ების წრიული სლáƒáƒ˜áƒ“ერი"</string>
+ <string name="minute_picker_description" msgid="8606010966873791190">"წუთების წრიული სლáƒáƒ˜áƒ“ერი"</string>
+ <string name="select_hours" msgid="6043079511766008245">"áƒáƒ˜áƒ áƒ©áƒ˜áƒ”თ სáƒáƒáƒ—ები"</string>
+ <string name="select_minutes" msgid="3974345615920336087">"áƒáƒ˜áƒ áƒ©áƒ˜áƒ”თ წუთები"</string>
+ <string name="day_picker_description" msgid="8990847925961297968">"დღეების ბáƒáƒ“ე თვეზე"</string>
+ <string name="year_picker_description" msgid="5524331207436052403">"წლის სიáƒ"</string>
+ <string name="select_day" msgid="7774759604701773332">"áƒáƒ˜áƒ áƒ©áƒ˜áƒ”თ თვე დრრიცხვი"</string>
+ <string name="select_year" msgid="7952052866994196170">"áƒáƒ˜áƒ áƒ©áƒ˜áƒ”თ წელი"</string>
+ <string name="item_is_selected" msgid="949687401682476608">"áƒáƒ áƒ©áƒ”ულირ<xliff:g id="ITEM">%1$s</xliff:g>"</string>
+ <string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> წáƒáƒ˜áƒ¨áƒáƒšáƒ"</string>
</resources>
diff --git a/core/res/res/values-ka/strings.xml b/core/res/res/values-ka/strings.xml
new file mode 100644
index 0000000..94fb8d0
--- /dev/null
+++ b/core/res/res/values-ka/strings.xml
@@ -0,0 +1,1588 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="byteShort" msgid="8340973892742019101">"B"</string>
+ <string name="kilobyteShort" msgid="5973789783504771878">"კბáƒáƒ˜áƒ¢áƒ˜"</string>
+ <string name="megabyteShort" msgid="6355851576770428922">"მბáƒáƒ˜áƒ¢áƒ˜"</string>
+ <string name="gigabyteShort" msgid="3259882455212193214">"გბáƒáƒ˜áƒ¢áƒ˜"</string>
+ <string name="terabyteShort" msgid="231613018159186962">"ტბáƒáƒ˜áƒ¢áƒ˜"</string>
+ <string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
+ <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string>
+ <string name="untitled" msgid="4638956954852782576">"უსáƒáƒ—áƒáƒ£áƒ áƒ"</string>
+ <string name="ellipsis" msgid="7899829516048813237">"…"</string>
+ <string name="ellipsis_two_dots" msgid="1228078994866030736">"‥"</string>
+ <string name="emptyPhoneNumber" msgid="7694063042079676517">"(ტელეფáƒáƒœáƒ˜áƒ¡ ნáƒáƒ›áƒ áƒ˜áƒ¡ გáƒáƒ áƒ”შე)"</string>
+ <string name="unknownName" msgid="2277556546742746522">"უცნáƒáƒ‘ი"</string>
+ <string name="defaultVoiceMailAlphaTag" msgid="2660020990097733077">"ხმáƒáƒ•áƒáƒœáƒ˜ ფáƒáƒ¡áƒ¢áƒ"</string>
+ <string name="defaultMsisdnAlphaTag" msgid="2850889754919584674">"MSISDN1"</string>
+ <string name="mmiError" msgid="5154499457739052907">"კáƒáƒ•შირის პრáƒáƒ‘ლემრáƒáƒœ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ MMI კáƒáƒ“ი."</string>
+ <string name="mmiFdnError" msgid="5224398216385316471">"áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ შეზღუდულირმხáƒáƒšáƒáƒ“ დáƒáƒ¨áƒ•ებულ ნáƒáƒ›áƒ áƒ”ბზე."</string>
+ <string name="serviceEnabled" msgid="8147278346414714315">"სერვისი ჩáƒáƒ áƒ—ულიáƒ."</string>
+ <string name="serviceEnabledFor" msgid="6856228140453471041">"სერვისი ჩáƒáƒ áƒ—ულირშემდეგისთვის:"</string>
+ <string name="serviceDisabled" msgid="1937553226592516411">"სერვისი გáƒáƒ›áƒáƒ áƒ—ულიáƒ."</string>
+ <string name="serviceRegistered" msgid="6275019082598102493">"რეგისტრáƒáƒªáƒ˜áƒ წáƒáƒ áƒ›áƒáƒ¢áƒ”ბით გáƒáƒœáƒ®áƒáƒ áƒªáƒ˜áƒ”ლდáƒ."</string>
+ <string name="serviceErased" msgid="1288584695297200972">"წáƒáƒ¨áƒšáƒ წáƒáƒ áƒ›áƒáƒ¢áƒ”ბით გáƒáƒœáƒ®áƒáƒ áƒªáƒ˜áƒ”ლდáƒ."</string>
+ <string name="passwordIncorrect" msgid="7612208839450128715">"პáƒáƒ áƒáƒšáƒ˜ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ"</string>
+ <string name="mmiComplete" msgid="8232527495411698359">"MMI დáƒáƒ¡áƒ áƒ£áƒšáƒ“áƒ."</string>
+ <string name="badPin" msgid="9015277645546710014">"თქვენ მიერ შეყვáƒáƒœáƒ˜áƒšáƒ˜ ძველი პინ-კáƒáƒ“ი áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ."</string>
+ <string name="badPuk" msgid="5487257647081132201">"თქვენ მიერ შეყვáƒáƒœáƒ˜áƒšáƒ˜ PUK კáƒáƒ“ი áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ."</string>
+ <string name="mismatchPin" msgid="609379054496863419">"თქვენ მიერ შეყვáƒáƒœáƒ˜áƒšáƒ˜ PIN კáƒáƒ“ები áƒáƒ  შეესáƒáƒ¢áƒ§áƒ•ისებáƒ."</string>
+ <string name="invalidPin" msgid="3850018445187475377">"áƒáƒ™áƒ áƒ˜áƒ¤áƒ”თ PIN, რáƒáƒ›áƒ”ლიც შედგებრ4-დáƒáƒœ 8 ციფრáƒáƒ›áƒ“ე."</string>
+ <string name="invalidPuk" msgid="8761456210898036513">"áƒáƒ™áƒ áƒ˜áƒ¤áƒ”თ PUK, რáƒáƒ›áƒ”ლიც რვრáƒáƒœ მეტი ციფრისგáƒáƒœ შედგებáƒ."</string>
+ <string name="needPuk" msgid="919668385956251611">"თქვენი SIM ბáƒáƒ áƒáƒ—ი დáƒáƒ‘ლáƒáƒ™áƒ˜áƒšáƒ˜áƒ PUK კáƒáƒ“ით. გáƒáƒœáƒ‘ლáƒáƒ™áƒ•ისთვის შეიყვáƒáƒœáƒ”თ PUK კáƒáƒ“ი."</string>
+ <string name="needPuk2" msgid="4526033371987193070">"SIM ბáƒáƒ áƒáƒ—ის გáƒáƒœáƒ¡áƒáƒ‘ლáƒáƒ™áƒáƒ“ áƒáƒ™áƒ áƒ˜áƒ¤áƒ”თ PUK2."</string>
+ <string name="imei" msgid="2625429890869005782">"IMEI"</string>
+ <string name="meid" msgid="4841221237681254195">"MEID"</string>
+ <string name="ClipMmi" msgid="6952821216480289285">"შემáƒáƒ›áƒáƒ•áƒáƒšáƒ˜ ზáƒáƒ áƒ˜áƒ¡ áƒáƒ‘áƒáƒœáƒ”ნტის ID"</string>
+ <string name="ClirMmi" msgid="7784673673446833091">"გáƒáƒ›áƒáƒ•áƒáƒšáƒ˜ მრეკáƒáƒ•ის ID"</string>
+ <string name="CfMmi" msgid="5123218989141573515">"ზáƒáƒ áƒ˜áƒ¡ გáƒáƒ“áƒáƒ›áƒ˜áƒ¡áƒáƒ›áƒáƒ áƒ—ებáƒ"</string>
+ <string name="CwMmi" msgid="9129678056795016867">"ზáƒáƒ áƒ˜áƒ¡ ლáƒáƒ“ინი"</string>
+ <string name="BaMmi" msgid="455193067926770581">"ზáƒáƒ áƒ˜áƒ¡ áƒáƒ™áƒ áƒ«áƒáƒšáƒ•áƒ"</string>
+ <string name="PwdMmi" msgid="7043715687905254199">"პáƒáƒ áƒáƒšáƒ˜áƒ¡ შეცვლáƒ"</string>
+ <string name="PinMmi" msgid="3113117780361190304">"PIN-ის შეცვლáƒ"</string>
+ <string name="CnipMmi" msgid="3110534680557857162">"გáƒáƒ›áƒáƒ›áƒ«áƒáƒ®áƒ”ბლის ნáƒáƒ›áƒ”რი წáƒáƒ áƒ›áƒáƒ“გენილიáƒ"</string>
+ <string name="CnirMmi" msgid="3062102121430548731">"შემáƒáƒ¡áƒ£áƒšáƒ˜ ზáƒáƒ áƒ˜ შეზღუდულიáƒ"</string>
+ <string name="ThreeWCMmi" msgid="9051047170321190368">"დáƒáƒ áƒ”კვის სáƒáƒ›áƒ˜ გზáƒ"</string>
+ <string name="RuacMmi" msgid="7827887459138308886">"áƒáƒ áƒáƒ¡áƒáƒ¡áƒ£áƒ áƒ•ელი მáƒáƒ›áƒáƒ‘ეზრებელი ზáƒáƒ áƒ”ბის უáƒáƒ áƒ§áƒáƒ¤áƒ"</string>
+ <string name="CndMmi" msgid="3116446237081575808">"დáƒáƒ›áƒ áƒ”კáƒáƒ•ი ნáƒáƒ›áƒ áƒ˜áƒ¡ მáƒáƒ¬áƒáƒ“ებáƒ"</string>
+ <string name="DndMmi" msgid="1265478932418334331">"áƒáƒ  შემáƒáƒ¬áƒ£áƒ®áƒáƒ—"</string>
+ <string name="CLIRDefaultOnNextCallOn" msgid="429415409145781923">"მრეკáƒáƒ•ის ID ნáƒáƒ’ულისხმევáƒáƒ“ შეზღუდულიáƒ. შემდეგი ზáƒáƒ áƒ˜: შეზღუდულიáƒ."</string>
+ <string name="CLIRDefaultOnNextCallOff" msgid="3092918006077864624">"áƒáƒ‘áƒáƒœáƒ”ნტის ID ნáƒáƒ’ულისხმევáƒáƒ“ შეზღუდულიáƒ. შემდეგი ზáƒáƒ áƒ˜: შეუზღუდáƒáƒ•ი."</string>
+ <string name="CLIRDefaultOffNextCallOn" msgid="6179425182856418465">"áƒáƒ‘áƒáƒœáƒ”ნტის ID უპირáƒáƒ‘áƒáƒ“ შეზღუდული áƒáƒ  áƒáƒ áƒ˜áƒ¡. შემდეგი ზáƒáƒ áƒ˜: შეზღუდულიáƒ."</string>
+ <string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"áƒáƒ‘áƒáƒœáƒ”ნტის ID ნáƒáƒ’ულისხმევáƒáƒ“ შეზღუდული áƒáƒ  áƒáƒ áƒ˜áƒ¡. შემდეგი ზáƒáƒ áƒ˜: შეუზღუდáƒáƒ•ი."</string>
+ <string name="serviceNotProvisioned" msgid="8614830180508686666">"სერვისი áƒáƒ  áƒáƒ áƒ˜áƒ¡ მიწáƒáƒ“ებული."</string>
+ <string name="CLIRPermanent" msgid="3377371145926835671">"áƒáƒ  შეგიძლიáƒáƒ— áƒáƒ‘áƒáƒœáƒ”ნტის ID პáƒáƒ áƒáƒ›áƒ”ტრების შეცვლáƒ."</string>
+ <string name="RestrictedChangedTitle" msgid="5592189398956187498">"წვდáƒáƒ›áƒ˜áƒ¡ შეზღუდვები შეცვლილიáƒ"</string>
+ <string name="RestrictedOnData" msgid="8653794784690065540">"ინტერნეტი დáƒáƒ‘ლáƒáƒ™áƒ˜áƒšáƒ˜áƒ."</string>
+ <string name="RestrictedOnEmergency" msgid="6581163779072833665">"გáƒáƒ“áƒáƒ£áƒ“ებელი სáƒáƒ›áƒ¡áƒáƒ®áƒ£áƒ áƒ˜ დáƒáƒ‘ლáƒáƒ™áƒ˜áƒšáƒ˜áƒ."</string>
+ <string name="RestrictedOnNormal" msgid="4953867011389750673">"ხმáƒáƒ•áƒáƒœáƒ˜ მáƒáƒ›áƒ¡áƒáƒ®áƒ£áƒ áƒ”ბრდáƒáƒ‘ლáƒáƒ™áƒ˜áƒšáƒ˜áƒ."</string>
+ <string name="RestrictedOnAllVoice" msgid="3396963652108151260">"ყველრხმáƒáƒ•áƒáƒœáƒ˜ სერვისი დáƒáƒ‘ლáƒáƒ™áƒ˜áƒšáƒ˜áƒ."</string>
+ <string name="RestrictedOnSms" msgid="8314352327461638897">"SMS მáƒáƒ›áƒ¡áƒáƒ®áƒ£áƒ áƒ”ბრდáƒáƒ‘ლáƒáƒ™áƒ˜áƒšáƒ˜áƒ."</string>
+ <string name="RestrictedOnVoiceData" msgid="996636487106171320">"ხმის/მáƒáƒœáƒáƒªáƒ”მების სერვისები დáƒáƒ‘ლáƒáƒ™áƒ˜áƒšáƒ˜áƒ."</string>
+ <string name="RestrictedOnVoiceSms" msgid="1888588152792023873">"ყველრხმáƒáƒ•áƒáƒœáƒ˜/SMS-ის სერვისი დáƒáƒ‘ლáƒáƒ™áƒ˜áƒšáƒ˜áƒ."</string>
+ <string name="RestrictedOnAll" msgid="5643028264466092821">"ხმის/მáƒáƒœáƒáƒªáƒ”მების/SMS-ის ყველრსერვისი დáƒáƒ‘ლáƒáƒ™áƒ˜áƒšáƒ˜áƒ."</string>
+ <string name="serviceClassVoice" msgid="1258393812335258019">"ხმáƒ"</string>
+ <string name="serviceClassData" msgid="872456782077937893">"მáƒáƒœáƒáƒªáƒ”მები"</string>
+ <string name="serviceClassFAX" msgid="5566624998840486475">"ფáƒáƒ¥áƒ¡áƒ˜"</string>
+ <string name="serviceClassSMS" msgid="2015460373701527489">"SMS"</string>
+ <string name="serviceClassDataAsync" msgid="4523454783498551468">"áƒáƒ¡áƒ˜áƒœáƒ¥áƒ áƒáƒœáƒ£áƒšáƒ˜"</string>
+ <string name="serviceClassDataSync" msgid="7530000519646054776">"სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ"</string>
+ <string name="serviceClassPacket" msgid="6991006557993423453">"პáƒáƒ™áƒ”ტი"</string>
+ <string name="serviceClassPAD" msgid="3235259085648271037">"PAD"</string>
+ <string name="roamingText0" msgid="7170335472198694945">"რáƒáƒ£áƒ›áƒ˜áƒœáƒ’ის მáƒáƒ©áƒ•ენებელი ჩáƒáƒ áƒ—ულიáƒ."</string>
+ <string name="roamingText1" msgid="5314861519752538922">"რáƒáƒ£áƒ›áƒ˜áƒœáƒ’ის მáƒáƒ©áƒ•ენებელი გáƒáƒ›áƒáƒ áƒ—ულიáƒ."</string>
+ <string name="roamingText2" msgid="8969929049081268115">"რáƒáƒ£áƒ›áƒ˜áƒœáƒ’ის მáƒáƒ©áƒ•ენებლის ციმციმი"</string>
+ <string name="roamingText3" msgid="5148255027043943317">"სáƒáƒ›áƒ”ზáƒáƒ‘ლáƒáƒ¡ მიღმáƒ"</string>
+ <string name="roamingText4" msgid="8808456682550796530">"შენáƒáƒ‘ის გáƒáƒ áƒ”თ"</string>
+ <string name="roamingText5" msgid="7604063252850354350">"რáƒáƒ£áƒ›áƒ˜áƒœáƒ’ი - უპირáƒáƒ¢áƒ”სი სისტემáƒ"</string>
+ <string name="roamingText6" msgid="2059440825782871513">"რáƒáƒ£áƒ›áƒ˜áƒœáƒ’ი - ხელმისáƒáƒ¬áƒ•დáƒáƒ›áƒ˜ სისტემáƒ"</string>
+ <string name="roamingText7" msgid="7112078724097233605">"რáƒáƒ£áƒ›áƒ˜áƒœáƒ’ი - áƒáƒšáƒ˜áƒáƒœáƒ¡áƒ˜áƒ¡ პáƒáƒ áƒ¢áƒœáƒ˜áƒáƒ áƒ˜"</string>
+ <string name="roamingText8" msgid="5989569778604089291">"რáƒáƒ£áƒ›áƒ˜áƒœáƒ’ი - პრემიუმ პáƒáƒ áƒ¢áƒœáƒ˜áƒáƒ áƒ˜"</string>
+ <string name="roamingText9" msgid="7969296811355152491">"Roaming - Full Service Functionality"</string>
+ <string name="roamingText10" msgid="3992906999815316417">"Roaming - Partial Service Functionality"</string>
+ <string name="roamingText11" msgid="4154476854426920970">"Roaming Banner ჩáƒáƒ áƒ—ულიáƒ"</string>
+ <string name="roamingText12" msgid="1189071119992726320">"რáƒáƒ£áƒ›áƒ˜áƒœáƒ’ის ბáƒáƒœáƒ”რი გáƒáƒ›áƒáƒ áƒ—ულიáƒ"</string>
+ <string name="roamingTextSearching" msgid="8360141885972279963">"სერვისის ძიებáƒ"</string>
+ <string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: áƒáƒ  áƒáƒ áƒ˜áƒ¡ გáƒáƒ“áƒáƒ›áƒ˜áƒ¡áƒáƒ›áƒáƒ áƒ—ებული"</string>
+ <string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
+ <string name="cfTemplateForwardedTime" msgid="9206251736527085256">"<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" msgid="5073237827620166285">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: áƒáƒ  áƒáƒ áƒ˜áƒ¡ გáƒáƒ“áƒáƒ›áƒ˜áƒ¡áƒáƒ›áƒáƒ áƒ—ებული"</string>
+ <string name="cfTemplateRegisteredTime" msgid="6781621964320635172">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: áƒáƒ  áƒáƒ áƒ˜áƒ¡ გáƒáƒ“áƒáƒ›áƒ˜áƒ¡áƒáƒ›áƒáƒ áƒ—ებული"</string>
+ <string name="fcComplete" msgid="3118848230966886575">"ფუნქციის კáƒáƒ“ი შესრულდáƒ."</string>
+ <string name="fcError" msgid="3327560126588500777">"კáƒáƒ•შირის პრáƒáƒ‘ლემáƒáƒ áƒáƒœ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ფუნქციური კáƒáƒ“იáƒ."</string>
+ <string name="httpErrorOk" msgid="1191919378083472204">"კáƒáƒ áƒ’ი"</string>
+ <string name="httpError" msgid="7956392511146698522">"ქსელის შეცდáƒáƒ›áƒ იყáƒ."</string>
+ <string name="httpErrorLookup" msgid="4711687456111963163">"URL-ის მáƒáƒ«áƒ˜áƒ”ბრვერ მáƒáƒ®áƒ”რხდáƒ."</string>
+ <string name="httpErrorUnsupportedAuthScheme" msgid="6299980280442076799">"სáƒáƒ˜áƒ¢áƒ˜áƒ¡ áƒáƒ•ტáƒáƒ áƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ სქემáƒáƒ¡ მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  áƒáƒ¥áƒ•ს."</string>
+ <string name="httpErrorAuth" msgid="1435065629438044534">"áƒáƒ•ტáƒáƒ áƒ˜áƒ–áƒáƒªáƒ˜áƒ ვერ ხერხდებáƒ."</string>
+ <string name="httpErrorProxyAuth" msgid="1788207010559081331">"áƒáƒ•ტáƒáƒ áƒ˜áƒ–áƒáƒªáƒ˜áƒ პრáƒáƒ¥áƒ¡áƒ˜-სერვერის გáƒáƒ›áƒáƒ§áƒ”ნებით წáƒáƒ áƒ£áƒ›áƒáƒ¢áƒ”ბელáƒáƒ“ დáƒáƒ¡áƒ áƒ£áƒšáƒ“áƒ."</string>
+ <string name="httpErrorConnect" msgid="8714273236364640549">"სერვერთáƒáƒœ დáƒáƒ™áƒáƒ•შირებრვერ მáƒáƒ®áƒ”რხდáƒ."</string>
+ <string name="httpErrorIO" msgid="2340558197489302188">"სერვერთáƒáƒœ კáƒáƒ›áƒ£áƒœáƒ˜áƒ™áƒáƒªáƒ˜áƒ ვერ გáƒáƒœáƒáƒ®áƒáƒ áƒªáƒ˜áƒ”ლáƒ. სცáƒáƒ“ეთ ხელáƒáƒ®áƒšáƒ."</string>
+ <string name="httpErrorTimeout" msgid="4743403703762883954">"სერვერთáƒáƒœ დáƒáƒ™áƒáƒ•შირებისáƒáƒ¡ áƒáƒ›áƒáƒ˜áƒ¬áƒ£áƒ áƒ ლáƒáƒ“ინის დრáƒ."</string>
+ <string name="httpErrorRedirectLoop" msgid="8679596090392779516">"ეს გვერდი შეიცáƒáƒ•ს სერვერის ძáƒáƒšáƒ˜áƒáƒœ ბევრ გáƒáƒ“áƒáƒ›áƒ˜áƒ¡áƒáƒ›áƒáƒ áƒ—ებáƒáƒ¡."</string>
+ <string name="httpErrorUnsupportedScheme" msgid="5015730812906192208">"პრáƒáƒ¢áƒáƒ™áƒáƒšáƒ¡ მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  áƒáƒ¥áƒ•ს."</string>
+ <string name="httpErrorFailedSslHandshake" msgid="96549606000658641">"დáƒáƒªáƒ£áƒšáƒ˜ კáƒáƒ•შირის დáƒáƒ›áƒ§áƒáƒ áƒ”ბრშეუძლებელიáƒ."</string>
+ <string name="httpErrorBadUrl" msgid="3636929722728881972">"გვერდი ვერ გáƒáƒ˜áƒ®áƒ¡áƒœáƒ, რáƒáƒ“გáƒáƒœáƒáƒª URL áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ."</string>
+ <string name="httpErrorFile" msgid="2170788515052558676">"ფáƒáƒ˜áƒšáƒ—áƒáƒœ წვდáƒáƒ›áƒ ვერ ხერხდებáƒ."</string>
+ <string name="httpErrorFileNotFound" msgid="6203856612042655084">"მáƒáƒ—ხáƒáƒ•ნილი ფáƒáƒ˜áƒšáƒ˜áƒ¡ მáƒáƒ«áƒ˜áƒ”ბრვერ მáƒáƒ®áƒ”რხდáƒ."</string>
+ <string name="httpErrorTooManyRequests" msgid="1235396927087188253">"ძáƒáƒšáƒ˜áƒáƒœ ბევრი მáƒáƒ—ხáƒáƒ•ნრმუშáƒáƒ•დებáƒ. სცáƒáƒ“ეთ მáƒáƒ’ვიáƒáƒœáƒ”ბით."</string>
+ <string name="notification_title" msgid="8967710025036163822">"<xliff:g id="ACCOUNT">%1$s</xliff:g> áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜áƒ¡ áƒáƒ•ტáƒáƒ áƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ შეცდáƒáƒ›áƒ"</string>
+ <string name="contentServiceSync" msgid="8353523060269335667">"სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ"</string>
+ <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"<xliff:g id="CONTENT_TYPE">%s</xliff:g>-ის ძáƒáƒšáƒ˜áƒáƒœ ბევრი წáƒáƒ¨áƒšáƒ˜áƒšáƒ”ბი."</string>
+ <string name="low_memory" product="tablet" msgid="6494019234102154896">"ტáƒáƒ‘ლეტის მეხსიერებრგáƒáƒ•სებულიáƒ. áƒáƒ“გილის გáƒáƒ¡áƒáƒ—áƒáƒ•ისუფლებლáƒáƒ“ წáƒáƒ¨áƒáƒšáƒ”თ ფáƒáƒ˜áƒšáƒ”ბის ნáƒáƒ¬áƒ˜áƒšáƒ˜."</string>
+ <string name="low_memory" product="default" msgid="3475999286680000541">"ტელეფáƒáƒœáƒ˜áƒ¡ მეხსიერებრგáƒáƒ•სებულიáƒ. áƒáƒ“გილის გáƒáƒ¡áƒáƒ—áƒáƒ•ისუფლებლáƒáƒ“ წáƒáƒ¨áƒáƒšáƒ”თ ფáƒáƒ˜áƒšáƒ”ბის ნáƒáƒ¬áƒ˜áƒšáƒ˜."</string>
+ <string name="me" msgid="6545696007631404292">"მე"</string>
+ <string name="power_dialog" product="tablet" msgid="8545351420865202853">"ტáƒáƒ‘ლეტის პáƒáƒ áƒáƒ›áƒ”ტრები"</string>
+ <string name="power_dialog" product="default" msgid="1319919075463988638">"ტელეფáƒáƒœáƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრები"</string>
+ <string name="silent_mode" msgid="7167703389802618663">"ჩუმი რეჟიმი"</string>
+ <string name="turn_on_radio" msgid="3912793092339962371">"უსáƒáƒ“ენáƒáƒ¡ ჩáƒáƒ áƒ—ვáƒ"</string>
+ <string name="turn_off_radio" msgid="8198784949987062346">"უსáƒáƒ“ენრინტერნეტის გáƒáƒ›áƒáƒ áƒ—ვáƒ"</string>
+ <string name="screen_lock" msgid="799094655496098153">"ეკრáƒáƒœáƒ˜áƒ¡ დáƒáƒ‘ლáƒáƒ™áƒ•áƒ"</string>
+ <string name="power_off" msgid="4266614107412865048">"გáƒáƒ›áƒáƒ áƒ—ვáƒ"</string>
+ <string name="silent_mode_silent" msgid="319298163018473078">"მრეკáƒáƒ•ი გáƒáƒ—იშულიáƒ"</string>
+ <string name="silent_mode_vibrate" msgid="7072043388581551395">"ვიბრáƒáƒªáƒ˜áƒ˜áƒ¡ რეჟიმი"</string>
+ <string name="silent_mode_ring" msgid="8592241816194074353">"ზáƒáƒ áƒ˜ ჩáƒáƒ áƒ—ულიáƒ"</string>
+ <string name="shutdown_progress" msgid="2281079257329981203">"გáƒáƒ›áƒáƒ áƒ—ვáƒâ€¦"</string>
+ <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"თქვენი ტáƒáƒ‘ლეტი გáƒáƒ˜áƒ—იშებáƒ."</string>
+ <string name="shutdown_confirm" product="default" msgid="649792175242821353">"თქვენი ტელეფáƒáƒœáƒ˜ გáƒáƒ˜áƒ—იშებáƒ."</string>
+ <string name="shutdown_confirm_question" msgid="2906544768881136183">"გსურთ გáƒáƒ›áƒáƒ áƒ—ვáƒ?"</string>
+ <string name="reboot_safemode_title" msgid="7054509914500140361">"უსáƒáƒ¤áƒ áƒ—ხრრეჟიმის ჩáƒáƒ¢áƒ•ირთვáƒ"</string>
+ <string name="reboot_safemode_confirm" msgid="55293944502784668">"გსურთ, უსáƒáƒ¤áƒ áƒ—ხრრეჟიმის ხელáƒáƒ®áƒáƒšáƒ˜ ჩáƒáƒ¢áƒ•ირთვáƒ? áƒáƒ›áƒ˜áƒ— გáƒáƒ˜áƒ—იშებრყველრმესáƒáƒ›áƒ” პირი áƒáƒžáƒšáƒ˜áƒ™áƒáƒªáƒ˜áƒ, რáƒáƒ›áƒ”ლიც დáƒáƒ§áƒ”ნებული გáƒáƒ¥áƒ•თ. ისინი áƒáƒ¦áƒ“გებრმáƒáƒ›áƒ“ევნრხელáƒáƒ®áƒáƒšáƒ˜ ჩáƒáƒ¢áƒ•ირთვის შემდეგ."</string>
+ <string name="recent_tasks_title" msgid="3691764623638127888">"უáƒáƒ®áƒšáƒ”სი"</string>
+ <string name="no_recent_tasks" msgid="8794906658732193473">"áƒáƒ  áƒáƒ áƒ˜áƒ¡ ბáƒáƒšáƒáƒ¡ გáƒáƒ›áƒáƒ§áƒ”ნებული áƒáƒžáƒ”ბი."</string>
+ <string name="global_actions" product="tablet" msgid="408477140088053665">"ტáƒáƒ‘ლეტის პáƒáƒ áƒáƒ›áƒ”ტრები"</string>
+ <string name="global_actions" product="default" msgid="2406416831541615258">"ტელეფáƒáƒœáƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრები"</string>
+ <string name="global_action_lock" msgid="2844945191792119712">"ეკრáƒáƒœáƒ˜áƒ¡ დáƒáƒ‘ლáƒáƒ™áƒ•áƒ"</string>
+ <string name="global_action_power_off" msgid="4471879440839879722">"გáƒáƒ›áƒáƒ áƒ—ულიáƒ"</string>
+ <string name="global_action_bug_report" msgid="7934010578922304799">"ხáƒáƒ áƒ•ეზის შესáƒáƒ®áƒ”ბ áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜"</string>
+ <string name="bugreport_title" msgid="2667494803742548533">"შექმენით შეცდáƒáƒ›áƒ˜áƒ¡ áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜"</string>
+ <string name="bugreport_message" msgid="398447048750350456">"იგი შეáƒáƒ’რáƒáƒ•ებს ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒáƒ¡ თქვენი მáƒáƒ¬áƒ§áƒáƒ‘ილáƒáƒ‘ის áƒáƒ›áƒŸáƒáƒ›áƒ˜áƒœáƒ“ელი მდგáƒáƒ›áƒáƒ áƒ”áƒáƒ‘ის შესáƒáƒ®áƒ”ბ, რáƒáƒ—რის ელფáƒáƒ¡áƒ¢áƒ˜áƒ¡ შეტყáƒáƒ‘ინების სáƒáƒ®áƒ˜áƒ— გáƒáƒáƒ’ზáƒáƒ•ნáƒáƒ¡. ხáƒáƒ áƒ•ეზის áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜áƒ¡ მáƒáƒ›áƒ–áƒáƒ“ებáƒáƒ¡áƒ დრშეტყáƒáƒ‘ინების გáƒáƒ’ზáƒáƒ•ნáƒáƒ¡ გáƒáƒ áƒ™áƒ•ეული დრრსჭირდებáƒ. გთხáƒáƒ•თ, მáƒáƒ˜áƒ—მინáƒáƒ—."</string>
+ <string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"ჩუმი რეჟიმი"</string>
+ <string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"ხმრგáƒáƒ›áƒáƒ áƒ—ულიáƒ"</string>
+ <string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"ხმრჩáƒáƒ áƒ—ულიáƒ"</string>
+ <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"თვითმფრინáƒáƒ•ის რეჟიმი"</string>
+ <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"თვითმფრინáƒáƒ•ის რეჟიმი ჩáƒáƒ áƒ—ულიáƒ."</string>
+ <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"თვითმფრინáƒáƒ•ის რეჟიმი გáƒáƒ›áƒáƒ áƒ—ულიáƒ."</string>
+ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
+ <string name="safeMode" msgid="2788228061547930246">"უსáƒáƒ¤áƒ áƒ—ხრრეჟიმი"</string>
+ <string name="android_system_label" msgid="6577375335728551336">"Android-ის სისტემáƒ"</string>
+ <string name="permgrouplab_costMoney" msgid="5429808217861460401">"სერვისები, რáƒáƒ›áƒ”ლშიც ფულის გáƒáƒ“áƒáƒ®áƒ“რგიწევთ"</string>
+ <string name="permgroupdesc_costMoney" msgid="3293301903409869495">"ისეთი áƒáƒ¥áƒ¢áƒ˜áƒ•áƒáƒ‘ების გáƒáƒœáƒ®áƒáƒ áƒªáƒ˜áƒ”ლებáƒ, რáƒáƒ›áƒšáƒ”ბშიც ფულის გáƒáƒ“áƒáƒ®áƒ“რმáƒáƒ’იწევთ."</string>
+ <string name="permgrouplab_messages" msgid="7521249148445456662">"თქვენი შეტყáƒáƒ‘ინებები"</string>
+ <string name="permgroupdesc_messages" msgid="7821999071003699236">"თქვენი SMS-ის, ელფáƒáƒ¢áƒ˜áƒ¡ დრსხვრშეტყáƒáƒ‘ინებების წáƒáƒ™áƒ˜áƒ—ხვრდრდáƒáƒ¬áƒ”რáƒ."</string>
+ <string name="permgrouplab_personalInfo" msgid="3519163141070533474">"თქვენი პირáƒáƒ“ი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ"</string>
+ <string name="permgroupdesc_personalInfo" msgid="8426453129788861338">"პირდáƒáƒžáƒ˜áƒ áƒ˜ წვდáƒáƒ›áƒ თქვენ შესáƒáƒ®áƒ”ბ ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒáƒ–ე, რáƒáƒ›áƒ”ლიც სáƒáƒ™áƒáƒœáƒ¢áƒáƒ¥áƒ¢áƒ ბáƒáƒ áƒáƒ—ზერშენáƒáƒ®áƒ£áƒšáƒ˜."</string>
+ <string name="permgrouplab_socialInfo" msgid="5799096623412043791">"თქვენი სáƒáƒªáƒ˜áƒáƒšáƒ£áƒ áƒ˜ ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ"</string>
+ <string name="permgroupdesc_socialInfo" msgid="7129842457611643493">"თქვენს კáƒáƒœáƒ¢áƒáƒ¥áƒ¢áƒ”ბისრდრსáƒáƒªáƒ˜áƒáƒšáƒ£áƒ  კáƒáƒ•შირების შესáƒáƒ®áƒ”ბ ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒáƒ–ე პირდáƒáƒžáƒ˜áƒ áƒ˜ წვდáƒáƒ›áƒ."</string>
+ <string name="permgrouplab_location" msgid="635149742436692049">"თქვენი მდებáƒáƒ áƒ”áƒáƒ‘áƒ"</string>
+ <string name="permgroupdesc_location" msgid="5704679763124170100">"თქვენი ფიზიკური მდებáƒáƒ áƒ”áƒáƒ‘ის მáƒáƒœáƒ˜áƒ¢áƒáƒ áƒ˜áƒœáƒ’ი"</string>
+ <string name="permgrouplab_network" msgid="5808983377727109831">"ქსელის კáƒáƒ›áƒ£áƒœáƒ˜áƒ™áƒáƒªáƒ˜áƒ"</string>
+ <string name="permgroupdesc_network" msgid="4478299413241861987">"წვდáƒáƒ›áƒ ქსელის სხვáƒáƒ“áƒáƒ¡áƒ®áƒ•რპáƒáƒ áƒáƒ›áƒ”ტრთáƒáƒœ."</string>
+ <string name="permgrouplab_bluetoothNetwork" msgid="1585403544162128109">"Bluetooth"</string>
+ <string name="permgroupdesc_bluetoothNetwork" msgid="5625288577164282391">"მáƒáƒ¬áƒ§áƒáƒ‘ილáƒáƒ‘ებთáƒáƒœ დრქსელებთáƒáƒœ წვდáƒáƒ›áƒ Bluetooth მეშვეáƒáƒ‘ით."</string>
+ <string name="permgrouplab_audioSettings" msgid="8329261670151871235">"áƒáƒ£áƒ“ირპáƒáƒ áƒáƒ›áƒ”ტრები"</string>
+ <string name="permgroupdesc_audioSettings" msgid="2641515403347568130">"áƒáƒ£áƒ“ირპáƒáƒ áƒáƒ›áƒ”ტრების შეცვლáƒ."</string>
+ <string name="permgrouplab_affectsBattery" msgid="6209246653424798033">"áƒáƒ–იáƒáƒœáƒ”ბს ელემენტს"</string>
+ <string name="permgroupdesc_affectsBattery" msgid="6441275320638916947">"იმ ფუნქციების გáƒáƒ›áƒáƒ§áƒ”ნებáƒ, რáƒáƒ›áƒ”ლიც ელემენტს სწრáƒáƒ¤áƒáƒ“ დáƒáƒ®áƒšáƒ˜áƒ¡."</string>
+ <string name="permgrouplab_calendar" msgid="5863508437783683902">"კáƒáƒšáƒ”ნდáƒáƒ áƒ˜"</string>
+ <string name="permgroupdesc_calendar" msgid="5777534316982184416">"კáƒáƒšáƒ”ნდáƒáƒ áƒ¡áƒ დრღáƒáƒœáƒ˜áƒ¡áƒ«áƒ˜áƒ”ბებზე პირდáƒáƒžáƒ˜áƒ áƒ˜ წვდáƒáƒ›áƒ."</string>
+ <string name="permgrouplab_dictionary" msgid="4148597128843641379">"მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ლექსიკáƒáƒœáƒ˜áƒ¡ წáƒáƒ™áƒ˜áƒ—ხვáƒ"</string>
+ <string name="permgroupdesc_dictionary" msgid="7921166355964764490">"მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ლექსიკáƒáƒœáƒ¨áƒ˜ სიტყვების წáƒáƒ™áƒ˜áƒ—ხვáƒ"</string>
+ <string name="permgrouplab_writeDictionary" msgid="8090237702432576788">"მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ლექსიკáƒáƒœáƒ¨áƒ˜ ჩáƒáƒ¬áƒ”რáƒ"</string>
+ <string name="permgroupdesc_writeDictionary" msgid="2711561994497361646">"მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ლექსიკáƒáƒœáƒ¨áƒ˜ სიტყვების დáƒáƒ›áƒáƒ¢áƒ”ბáƒ."</string>
+ <string name="permgrouplab_bookmarks" msgid="1949519673103968229">"სáƒáƒœáƒ˜áƒ¨áƒœáƒ”ები დრისტáƒáƒ áƒ˜áƒ"</string>
+ <string name="permgroupdesc_bookmarks" msgid="4169771606257963028">"პირდáƒáƒžáƒ˜áƒ áƒ˜ წვდáƒáƒ›áƒ სáƒáƒœáƒ˜áƒ¨áƒœáƒ”ებსრდრბრáƒáƒ£áƒ–ერის ისტáƒáƒ áƒ˜áƒáƒ–ე"</string>
+ <string name="permgrouplab_deviceAlarms" msgid="6117704629728824101">"მáƒáƒ¦áƒ•იძáƒáƒ áƒ"</string>
+ <string name="permgroupdesc_deviceAlarms" msgid="4769356362251641175">"მáƒáƒ¦áƒ•იძáƒáƒ áƒ˜áƒ¡ დáƒáƒ§áƒ”ნებáƒ."</string>
+ <string name="permgrouplab_voicemail" msgid="4162237145027592133">"ხმáƒáƒ•áƒáƒœáƒ˜ ფáƒáƒ¡áƒ¢áƒ"</string>
+ <string name="permgroupdesc_voicemail" msgid="2498403969862951393">"პირდáƒáƒžáƒ˜áƒ áƒ˜ წვდáƒáƒ›áƒ ხმáƒáƒ•áƒáƒœ ფáƒáƒ¡áƒ¢áƒáƒ–ე"</string>
+ <string name="permgrouplab_microphone" msgid="171539900250043464">"მიკრáƒáƒ¤áƒáƒœáƒ˜"</string>
+ <string name="permgroupdesc_microphone" msgid="7106618286905738408">"პირდáƒáƒžáƒ˜áƒ áƒ˜ წვდáƒáƒ›áƒ მიკრáƒáƒ¤áƒáƒœáƒ–ე áƒáƒ£áƒ“იáƒáƒ¡ ჩáƒáƒ¡áƒáƒ¬áƒ”რáƒáƒ“."</string>
+ <string name="permgrouplab_camera" msgid="4820372495894586615">"კáƒáƒ›áƒ”რáƒ"</string>
+ <string name="permgroupdesc_camera" msgid="2933667372289567714">"პირდáƒáƒžáƒ˜áƒ áƒ˜ წვდáƒáƒ›áƒ კáƒáƒ›áƒ”რáƒáƒ–ე სურáƒáƒ—ის áƒáƒœ ვიდეáƒáƒ¡ გáƒáƒ“áƒáƒ¡áƒáƒ¦áƒ”ბáƒáƒ“"</string>
+ <string name="permgrouplab_screenlock" msgid="8275500173330718168">"ჩáƒáƒ™áƒ”ტილი ეკრáƒáƒœáƒ˜"</string>
+ <string name="permgroupdesc_screenlock" msgid="7067497128925499401">"მáƒáƒ¬áƒ§áƒáƒ‘ილáƒáƒ‘ის ეკრáƒáƒœáƒ˜áƒ¡ ჩáƒáƒ›áƒ™áƒ”ტის ქცევის შეცვლის შესáƒáƒ«áƒšáƒ”ბლáƒáƒ‘áƒ."</string>
+ <string name="permgrouplab_appInfo" msgid="8028789762634147725">"თქვენი áƒáƒžáƒšáƒ˜áƒ™áƒáƒªáƒ˜áƒ”ბის ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ"</string>
+ <string name="permgroupdesc_appInfo" msgid="3950378538049625907">"თქვენს მáƒáƒ¬áƒ§áƒáƒ‘ილáƒáƒ‘áƒáƒ–ე სხვრáƒáƒžáƒšáƒ˜áƒ™áƒáƒªáƒ˜áƒ”ბის ქცევის შეცვლის შესáƒáƒ«áƒšáƒ”ბლáƒáƒ‘áƒ."</string>
+ <string name="permgrouplab_wallpaper" msgid="3850280158041175998">"ფáƒáƒœáƒ˜"</string>
+ <string name="permgroupdesc_wallpaper" msgid="5630417854750540154">"მáƒáƒ¬áƒ§áƒáƒ‘ილáƒáƒ‘ის ფáƒáƒœáƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრების შეცვლáƒ."</string>
+ <string name="permgrouplab_systemClock" msgid="406535759236612992">"სáƒáƒáƒ—ი"</string>
+ <string name="permgroupdesc_systemClock" msgid="3944359833624094992">"მáƒáƒ¬áƒ§áƒáƒ‘ილáƒáƒ‘ის დრáƒáƒ˜áƒ¡ áƒáƒœ დრáƒáƒ˜áƒ—ი სáƒáƒ áƒ¢áƒ§áƒšáƒ˜áƒ¡ შეცვლáƒ."</string>
+ <string name="permgrouplab_statusBar" msgid="2095862568113945398">"სტáƒáƒ¢áƒ£áƒ¡áƒ˜áƒ¡ ზáƒáƒšáƒ˜"</string>
+ <string name="permgroupdesc_statusBar" msgid="6242593432226807171">"მáƒáƒ¬áƒ§áƒáƒ‘ილáƒáƒ‘ის სტáƒáƒ¢áƒ£áƒ¡áƒ”ბის ზáƒáƒšáƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრების შეცვლáƒ."</string>
+ <string name="permgrouplab_syncSettings" msgid="3341990986147826541">"სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრები"</string>
+ <string name="permgroupdesc_syncSettings" msgid="7603195265129031797">"სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრებზე წვდáƒáƒ›áƒ"</string>
+ <string name="permgrouplab_accounts" msgid="3359646291125325519">"თქვენი áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ”ბი"</string>
+ <string name="permgroupdesc_accounts" msgid="4948732641827091312">"ხელმისáƒáƒ¬áƒ•დáƒáƒ› áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ”ბზე წვდáƒáƒ›áƒ."</string>
+ <string name="permgrouplab_hardwareControls" msgid="7998214968791599326">"მáƒáƒ¬áƒ§áƒáƒ‘ილáƒáƒ‘ების მáƒáƒ áƒ—ვáƒ"</string>
+ <string name="permgroupdesc_hardwareControls" msgid="4357057861225462702">"ყურსáƒáƒªáƒ•áƒáƒ›áƒ˜áƒ¡ áƒáƒžáƒáƒ áƒáƒ¢áƒ£áƒ áƒ£áƒš მáƒáƒ¬áƒ§áƒáƒ‘ილáƒáƒ‘áƒáƒ–ე პირდáƒáƒžáƒ˜áƒ áƒ˜ წვდáƒáƒ›áƒ."</string>
+ <string name="permgrouplab_phoneCalls" msgid="9067173988325865923">"სáƒáƒ¢áƒ”ლეფáƒáƒœáƒ ზáƒáƒ áƒ”ბი"</string>
+ <string name="permgroupdesc_phoneCalls" msgid="7489701620446183770">"სáƒáƒ¢áƒ”ლეფáƒáƒœáƒ ზáƒáƒ áƒ”ბის მáƒáƒœáƒ˜áƒ¢áƒáƒ áƒ˜áƒœáƒ’ი, ჩáƒáƒ¬áƒ”რრდრგáƒáƒœáƒ®áƒáƒ áƒªáƒ˜áƒ”ლებáƒ."</string>
+ <string name="permgrouplab_systemTools" msgid="4652191644082714048">"სისტემის ხელსáƒáƒ¬áƒ§áƒáƒ”ბი"</string>
+ <string name="permgroupdesc_systemTools" msgid="8162102602190734305">"დáƒáƒ‘áƒáƒšáƒ˜ წვდáƒáƒ›áƒ დრსისტემის კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜"</string>
+ <string name="permgrouplab_developmentTools" msgid="3446164584710596513">"დეველáƒáƒžáƒ›áƒ”ნტის ინსტრუმენტები"</string>
+ <string name="permgroupdesc_developmentTools" msgid="7058828032358142018">"ელემენტები, რáƒáƒ›áƒšáƒ”ბიც მხáƒáƒšáƒáƒ“ áƒáƒžáƒ”ბის დეველáƒáƒžáƒ”რებს სჭირდებáƒáƒ—."</string>
+ <string name="permgrouplab_display" msgid="4279909676036402636">"სხვრáƒáƒžáƒšáƒ˜áƒ™áƒáƒªáƒ˜áƒ˜áƒ¡ UI"</string>
+ <string name="permgroupdesc_display" msgid="6051002031933013714">"სხვრáƒáƒžáƒšáƒ˜áƒ™áƒáƒªáƒ˜áƒ”ბის UI-ის ეფექტი."</string>
+ <string name="permgrouplab_storage" msgid="1971118770546336966">"შესáƒáƒœáƒáƒ®áƒ˜ სივრცე"</string>
+ <string name="permgroupdesc_storage" product="nosdcard" msgid="7442318502446874999">"USB მეხსიერებáƒáƒ¡áƒ—áƒáƒœ წვდáƒáƒ›áƒ."</string>
+ <string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"SD ბáƒáƒ áƒáƒ—თáƒáƒœ წვდáƒáƒ›áƒ."</string>
+ <string name="permgrouplab_accessibilityFeatures" msgid="7919025602283593907">"წვდáƒáƒ›áƒ˜áƒ¡ ფუნქციები"</string>
+ <string name="permgroupdesc_accessibilityFeatures" msgid="4205196881678144335">"ფუნქციები, რáƒáƒ›áƒ”ლიც შესáƒáƒ«áƒšáƒáƒ მáƒáƒ˜áƒ—ხáƒáƒ•áƒáƒ¡ დáƒáƒ›áƒ®áƒ›áƒáƒ áƒ” ტექნáƒáƒšáƒáƒ’იáƒáƒ›."</string>
+ <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"ფáƒáƒœáƒ¯áƒ áƒ˜áƒ¡ კáƒáƒœáƒ¢áƒ”ნტის მáƒáƒ«áƒ˜áƒ”ბáƒ"</string>
+ <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"შეáƒáƒ›áƒáƒ¬áƒ›áƒ”თ იმ ფáƒáƒœáƒ¯áƒ áƒ˜áƒ¡ კáƒáƒœáƒ¢áƒ”ქტი, რáƒáƒ›áƒ”ლშიც მუშáƒáƒáƒ‘თ."</string>
+ <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"„შეხებით áƒáƒ¦áƒ›áƒáƒ©áƒ”ნის“ ჩáƒáƒ áƒ—ვáƒ"</string>
+ <string name="capability_desc_canRequestTouchExploration" msgid="5800552516779249356">"ის ერთეულები, რáƒáƒ›áƒšáƒ”ბსáƒáƒª შეეხებით, წáƒáƒ˜áƒ™áƒ˜áƒ—ხებრხმáƒáƒ›áƒáƒ¦áƒšáƒ დრეკრáƒáƒœáƒ˜áƒ¡ კვლევრშეიძლებრჟესტების გáƒáƒ›áƒáƒ§áƒ”ნებით."</string>
+ <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"ვებზე გáƒáƒ›áƒáƒ áƒ¢áƒ˜áƒ•ებული წვდáƒáƒ›áƒ˜áƒ¡ დáƒáƒ›áƒáƒ¢áƒ”ბითი შესáƒáƒ«áƒšáƒ”ბლáƒáƒ‘ების ჩáƒáƒ áƒ—ვáƒ"</string>
+ <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"შესáƒáƒ«áƒšáƒ”ბელირსკრიპტების ინსტáƒáƒšáƒáƒªáƒ˜áƒ áƒáƒžáƒ˜áƒ¡ კáƒáƒœáƒ¢áƒ”ნტის წვდáƒáƒ›áƒáƒ“áƒáƒ‘ის უზრუნველსáƒáƒ§áƒáƒ¤áƒáƒ“."</string>
+ <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"თქვენ მიერ áƒáƒ™áƒ áƒ”ფილ ტექსტზე დáƒáƒ™áƒ•ირვებáƒ"</string>
+ <string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"შეიცáƒáƒ•ს ისეთ პირáƒáƒ“ მáƒáƒœáƒáƒªáƒ”მებს, რáƒáƒ’áƒáƒ áƒ˜áƒªáƒáƒ სáƒáƒ™áƒ áƒ”დიტრბáƒáƒ áƒáƒ—ის ნáƒáƒ›áƒ áƒ”ბი დრპáƒáƒ áƒáƒšáƒ”ბი."</string>
+ <string name="permlab_statusBar" msgid="7417192629601890791">"სტáƒáƒ¢áƒ£áƒ¡áƒ˜áƒ¡ ზáƒáƒšáƒ˜áƒ¡ გáƒáƒ—იშვრáƒáƒœ ცვლილებáƒ"</string>
+ <string name="permdesc_statusBar" msgid="8434669549504290975">"áƒáƒžáƒ¡ შეეძლებრსტáƒáƒ¢áƒ£áƒ¡áƒ”ბის ზáƒáƒšáƒ˜áƒ¡ გáƒáƒ—იშვრდრსისტემის ხáƒáƒ¢áƒ£áƒšáƒ”ბის დáƒáƒ›áƒáƒ¢áƒ”ბáƒ/წáƒáƒ¨áƒšáƒ."</string>
+ <string name="permlab_statusBarService" msgid="7247281911387931485">"სტáƒáƒ¢áƒ£áƒ¡áƒ˜áƒ¡ ზáƒáƒšáƒ˜"</string>
+ <string name="permdesc_statusBarService" msgid="716113660795976060">"áƒáƒžáƒ¡ შეეძლებრსტáƒáƒ¢áƒ£áƒ¡áƒ˜áƒ¡ ზáƒáƒšáƒ˜áƒ¡ ჩáƒáƒœáƒáƒªáƒ•ლებáƒ."</string>
+ <string name="permlab_expandStatusBar" msgid="1148198785937489264">"სტáƒáƒ¢áƒ£áƒ¡áƒ”ბის ზáƒáƒšáƒ˜áƒ¡ გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბáƒ/áƒáƒ™áƒ”ცვáƒ"</string>
+ <string name="permdesc_expandStatusBar" msgid="6917549437129401132">"áƒáƒžáƒ¡ შეეძლებრსტáƒáƒ¢áƒ£áƒ¡áƒ˜áƒ¡ ზáƒáƒšáƒ˜áƒ¡ გáƒáƒ®áƒ¡áƒœáƒ-დáƒáƒ®áƒ£áƒ áƒ•áƒ."</string>
+ <string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"გáƒáƒ›áƒáƒ•áƒáƒšáƒ˜ ზáƒáƒ áƒ”ბის გáƒáƒ“áƒáƒ›áƒ˜áƒ¡áƒáƒ›áƒáƒ áƒ—ებáƒ"</string>
+ <string name="permdesc_processOutgoingCalls" msgid="5331318931937402040">"áƒáƒžáƒ¡ შეეძლებრგáƒáƒ›áƒáƒ•áƒáƒšáƒ˜ ზáƒáƒ áƒ”ბის დáƒáƒ›áƒ£áƒ¨áƒáƒ•ებრდრáƒáƒ¡áƒáƒ™áƒ áƒ”ფი ნáƒáƒ›áƒ áƒ˜áƒ¡ შეცვლáƒ. ეს უფლებრáƒáƒžáƒ¡ áƒáƒ«áƒšáƒ”ვს შესáƒáƒ«áƒšáƒ”ბლáƒáƒ‘áƒáƒ¡ áƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒáƒ¡, გáƒáƒ“áƒáƒáƒ›áƒ˜áƒ¡áƒáƒ›áƒáƒ áƒ—áƒáƒ¡ áƒáƒœ áƒáƒ¦áƒ™áƒ•ეთáƒáƒ¡ გáƒáƒ›áƒáƒ•áƒáƒšáƒ˜ ზáƒáƒ áƒ”ბი."</string>
+ <string name="permlab_receiveSms" msgid="8673471768947895082">"ტექსტური შეტყáƒáƒ‘ინებების (SMS) მიღებáƒ"</string>
+ <string name="permdesc_receiveSms" msgid="6424387754228766939">"áƒáƒžáƒ¡ შეეძლებრSMS შეტყáƒáƒ‘ინებების მიღებრდრდáƒáƒ›áƒ£áƒ¨áƒáƒ•ებáƒ. ეს ნიშნáƒáƒ•ს, რáƒáƒ› áƒáƒžáƒ¡ შეეძლებრთქვენ მáƒáƒ¬áƒ§áƒáƒ‘ილáƒáƒ‘áƒáƒ–ე გáƒáƒ›áƒáƒ’ზáƒáƒ•ნილი შეტყáƒáƒ‘ინებების მáƒáƒœáƒ˜áƒ¢áƒáƒ áƒ˜áƒœáƒ’ი დრმáƒáƒ—ი წáƒáƒ¨áƒšáƒ თქვენთვის ჩვენების გáƒáƒ áƒ”შე."</string>
+ <string name="permlab_receiveMms" msgid="1821317344668257098">"ტექსტური შეტყáƒáƒ‘ინებების (MMS) მიღებáƒ"</string>
+ <string name="permdesc_receiveMms" msgid="533019437263212260">"áƒáƒžáƒ¡ შეეძლებრMMS შეტყáƒáƒ‘ინებების მიღებრდრდáƒáƒ›áƒ£áƒ¨áƒáƒ•ებáƒ. ეს ნიშნáƒáƒ•ს, რáƒáƒ› áƒáƒžáƒ¡ შეეძლებრშეტყáƒáƒ‘ინებების მáƒáƒœáƒ˜áƒ¢áƒáƒ áƒ˜áƒœáƒ’ი დრმáƒáƒ—ი წáƒáƒ¨áƒšáƒ თქვენთვის ჩვენების გáƒáƒ áƒ”შე."</string>
+ <string name="permlab_receiveEmergencyBroadcast" msgid="1803477660846288089">"გáƒáƒ“áƒáƒ£áƒ“ებელი შეტყáƒáƒ‘ინებების მიღებáƒ"</string>
+ <string name="permdesc_receiveEmergencyBroadcast" msgid="848524070262431974">"áƒáƒžáƒ¡ შეეძლებáƒ, მიიღáƒáƒ¡ დრდáƒáƒáƒ›áƒ£áƒ¨áƒáƒáƒ¡ სáƒáƒ’áƒáƒœáƒ’ებრსáƒáƒ›áƒáƒ£áƒ¬áƒ§áƒ”ბლრშეტყáƒáƒ‘ინებები. ეს ნებáƒáƒ áƒ—ვრხელმისáƒáƒ¬áƒ•დáƒáƒ›áƒ˜áƒ მხáƒáƒšáƒáƒ“ სისტემის áƒáƒžáƒ”ბისთვის."</string>
+ <string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"მáƒáƒ¡áƒ˜áƒ£áƒ áƒ˜ დáƒáƒ’ზáƒáƒ•ნის შეტყáƒáƒ‘ინებების წáƒáƒ™áƒ˜áƒ—ხვáƒ"</string>
+ <string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"áƒáƒžáƒ¡ შეეძლებáƒ, წáƒáƒ˜áƒ™áƒ˜áƒ—ხáƒáƒ¡ თქვენს მáƒáƒ¬áƒ§áƒáƒ‘ილáƒáƒ‘áƒáƒ–ე გáƒáƒ›áƒáƒ’ზáƒáƒ•ნილი ქსელის სáƒáƒ›áƒáƒ£áƒ¬áƒ§áƒ”ბლრშეტყáƒáƒ‘ინებები. სáƒáƒ›áƒáƒ£áƒ¬áƒ§áƒ”ბლრგáƒáƒ¤áƒ áƒ—ხილებები მáƒáƒ’ეწáƒáƒ“ებáƒáƒ— ზáƒáƒ’იერთ áƒáƒ“გილზე ექსტრემáƒáƒšáƒ£áƒ áƒ˜ სიტუáƒáƒªáƒ˜áƒ”ბის შესáƒáƒ®áƒ”ბ გáƒáƒ¡áƒáƒ¤áƒ áƒ—ხილებლáƒáƒ“. ქსელის გáƒáƒ“áƒáƒ£áƒ“ებელი შეტყáƒáƒœáƒ˜áƒ‘ენის მიღების დრáƒáƒ¡ მáƒáƒ•ნე áƒáƒžáƒ”ბმრშეიძლებრხელი შეუშáƒáƒšáƒáƒœ თქვენი მáƒáƒ¬áƒ§áƒáƒ‘ილáƒáƒ‘ის ფუნქციáƒáƒœáƒ˜áƒ áƒ”ბáƒáƒ¡ áƒáƒœ áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ”ბს."</string>
+ <string name="permlab_sendSms" msgid="5600830612147671529">"SMS შეტყáƒáƒ‘ის გáƒáƒ’ზáƒáƒ•ნáƒ"</string>
+ <string name="permdesc_sendSms" msgid="7094729298204937667">"áƒáƒžáƒ¡ შეეძლებáƒ, გáƒáƒ’ზáƒáƒ•ნáƒáƒ¡ SMS შეტყáƒáƒ‘ინებები, რáƒáƒ›áƒáƒª შეიძლებრგáƒáƒ£áƒ—ვáƒáƒšáƒ˜áƒ¡áƒ¬áƒ˜áƒœáƒ”ბელი ხáƒáƒ áƒ¯áƒ”ბი გáƒáƒ›áƒáƒ˜áƒ¬áƒ•იáƒáƒ¡. მáƒáƒ•ნე áƒáƒžáƒ”ბმრშეიძლებრდáƒáƒ’იხáƒáƒ áƒ¯áƒáƒœ ფული შეტყáƒáƒ‘ინებების თქვენი თáƒáƒœáƒ®áƒ›áƒáƒ‘ის გáƒáƒ áƒ”შე გáƒáƒ’ზáƒáƒ•ნით."</string>
+ <string name="permlab_sendRespondViaMessageRequest" msgid="8713889105305943200">"ღáƒáƒœáƒ˜áƒ¡áƒ«áƒ˜áƒ”ბების გáƒáƒ’ზáƒáƒ•ნრ(პáƒáƒ¡áƒ£áƒ®áƒ˜áƒ¡ მიღებრმხáƒáƒšáƒáƒ“ შეტყáƒáƒ‘ინებით)"</string>
+ <string name="permdesc_sendRespondViaMessageRequest" msgid="7107648548468778734">"áƒáƒžáƒ¡ შეეძლებáƒ, გáƒáƒ£áƒ’ზáƒáƒ•ნáƒáƒ¡ მáƒáƒ—ხáƒáƒ•ნები სხვრშეტყáƒáƒ‘ინებების áƒáƒžáƒ”ბს შემáƒáƒ›áƒáƒ•áƒáƒš ზáƒáƒ áƒ”ბზე შეტყáƒáƒ‘ინებით პáƒáƒ¡áƒ£áƒ®áƒ˜áƒ¡ მáƒáƒ•ლენებთáƒáƒœ გáƒáƒ¡áƒáƒ›áƒ™áƒšáƒáƒ•ებლáƒáƒ“."</string>
+ <string name="permlab_readSms" msgid="8745086572213270480">"თქვენი ტექსტური შეტყáƒáƒ‘ინებების (SMS áƒáƒœ MMS) წáƒáƒ™áƒ˜áƒ—ხვáƒ"</string>
+ <string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"áƒáƒžáƒ¡ შეეძლებრთქვენს ტáƒáƒ‘ლეტში áƒáƒœ SIM ბáƒáƒ áƒáƒ—ში შენáƒáƒ®áƒ£áƒšáƒ˜ SMS შეტყáƒáƒ‘ინებების წáƒáƒ™áƒ˜áƒ—ხვáƒ. áƒáƒ›áƒ’ვáƒáƒ áƒáƒ“, áƒáƒžáƒ¡ ექნებრშესáƒáƒ«áƒšáƒ”ბლáƒáƒ‘რწáƒáƒ˜áƒ™áƒ˜áƒ—ხáƒáƒ¡ ყველრSMS შეტყáƒáƒ‘ინებáƒ, მáƒáƒ—ი კáƒáƒœáƒ¢áƒ”ნტისრდრკáƒáƒœáƒ¤áƒ˜áƒ“ენციáƒáƒšáƒ£áƒ áƒáƒ‘ის მიუხედáƒáƒ•áƒáƒ“."</string>
+ <string name="permdesc_readSms" product="default" msgid="3695967533457240550">"áƒáƒžáƒ¡ შეეძლებრთქვენს ტáƒáƒ‘ლეტში áƒáƒœ SIM ბáƒáƒ áƒáƒ—ში შენáƒáƒ®áƒ£áƒšáƒ˜ SMS შეტყáƒáƒ‘ინებების წáƒáƒ™áƒ˜áƒ—ხვáƒ. áƒáƒ›áƒ’ვáƒáƒ áƒáƒ“, áƒáƒžáƒ¡ ექნებრშესáƒáƒ«áƒšáƒ”ბლáƒáƒ‘რწáƒáƒ˜áƒ™áƒ˜áƒ—ხáƒáƒ¡ ყველრSMS შეტყáƒáƒ‘ინებáƒ, მáƒáƒ—ი კáƒáƒœáƒ¢áƒ”ნტისრდრკáƒáƒœáƒ¤áƒ˜áƒ“ენციáƒáƒšáƒ£áƒ áƒáƒ‘ის მიუხედáƒáƒ•áƒáƒ“."</string>
+ <string name="permlab_writeSms" msgid="3216950472636214774">"თქვენი ტექსტური შეტყáƒáƒ‘ინებების (SMS áƒáƒœ MMS) რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბáƒ"</string>
+ <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"áƒáƒžáƒ¡ შეეძლებáƒ, უპáƒáƒ¡áƒ£áƒ®áƒáƒ¡ თქვენ ტáƒáƒ‘ლეტში áƒáƒœ SIM ბáƒáƒ áƒáƒ—ზე შენáƒáƒ®áƒ£áƒš SMS შეტყáƒáƒ‘ინებებს. მáƒáƒ•ნე áƒáƒžáƒ”ბმრშეიძლებრწáƒáƒ¨áƒáƒšáƒáƒœ თქვენი შეტყáƒáƒ‘ინებები."</string>
+ <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"áƒáƒžáƒ¡ უფლებრექნებრ, უპáƒáƒ¡áƒ£áƒ®áƒáƒ¡ თქვენ ტáƒáƒ‘ლეტში áƒáƒœ SIM ბáƒáƒ áƒáƒ—ზე შენáƒáƒ®áƒ£áƒš SMS შეტყáƒáƒ‘ინებებს. მáƒáƒ•ნე áƒáƒžáƒ”ბმრშეიძლებრწáƒáƒ¨áƒáƒšáƒáƒœ თქვენი შეტყáƒáƒ‘ინებები."</string>
+ <string name="permlab_receiveWapPush" msgid="5991398711936590410">"ტექსტური შეტყáƒáƒ‘ინებების (WAP) მიღებáƒ"</string>
+ <string name="permdesc_receiveWapPush" msgid="748232190220583385">"áƒáƒžáƒ¡ შეეძლებრWAP შეტყáƒáƒ‘ინებების მიღებრდრგენერირებáƒ. áƒáƒ› უფლებით áƒáƒžáƒ˜ ისე დáƒáƒáƒ™áƒ•ირდებრდრწáƒáƒ¨áƒšáƒ˜áƒ¡ თქვენთვის გáƒáƒ›áƒáƒ’ზáƒáƒ•ნილ შეტყáƒáƒ‘ინებებს, რáƒáƒ› თქვენ ვერც ნáƒáƒ®áƒáƒ•თ."</string>
+ <string name="permlab_getTasks" msgid="6466095396623933906">"მáƒáƒ¥áƒ›áƒ”დი áƒáƒžáƒ”ბის მáƒáƒ«áƒ˜áƒ”ბáƒ"</string>
+ <string name="permdesc_getTasks" msgid="7454215995847658102">"áƒáƒžáƒ¡ შეეძლებრმáƒáƒ˜áƒ«áƒ˜áƒáƒ¡ ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ áƒáƒ›áƒŸáƒáƒ›áƒáƒ“ დრუáƒáƒ®áƒšáƒáƒ”ს წáƒáƒ áƒ¡áƒ£áƒšáƒ¨áƒ˜ მიმდინáƒáƒ áƒ” áƒáƒ›áƒáƒªáƒáƒœáƒ”ბის შესáƒáƒ®áƒ”ბ. áƒáƒ›áƒ’ვáƒáƒ áƒáƒ“, áƒáƒžáƒ¡ áƒáƒ¥áƒ•ს შესáƒáƒ«áƒšáƒ”ბლáƒáƒ‘რáƒáƒ¦áƒ›áƒáƒáƒ©áƒ˜áƒœáƒáƒ¡ ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ იმის შესáƒáƒ®áƒ”ბ, თუ რáƒáƒ›áƒ”ლი áƒáƒžáƒšáƒ˜áƒ™áƒáƒªáƒ˜áƒ”ბირგáƒáƒ›áƒáƒ§áƒ”ნებული მáƒáƒ¬áƒ§áƒáƒ‘ილáƒáƒ‘áƒáƒ–ე."</string>
+ <string name="permlab_interactAcrossUsers" msgid="7114255281944211682">"მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლებს შáƒáƒ áƒ˜áƒ¡ ინტერáƒáƒ¥áƒªáƒ˜áƒ"</string>
+ <string name="permdesc_interactAcrossUsers" msgid="364670963623385786">"áƒáƒžáƒ¡ შეეძლებáƒ, სხვáƒáƒ“áƒáƒ¡áƒ®áƒ•რმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის მáƒáƒ¥áƒ›áƒ”დებები შეáƒáƒ¡áƒ áƒ£áƒšáƒáƒ¡ მáƒáƒ¬áƒ§áƒáƒ‘ილáƒáƒ‘áƒáƒ–ე. მáƒáƒ•ნე áƒáƒžáƒ”ბმრშეიძლებრმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლებს შáƒáƒ áƒ˜áƒ¡ დáƒáƒªáƒ•ის დáƒáƒ¡áƒáƒ áƒ¦áƒ•ევáƒáƒ“ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნáƒáƒœ."</string>
+ <string name="permlab_interactAcrossUsersFull" msgid="2567734285545074105">"მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლებთáƒáƒœ ინტერáƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ სრული ლიცენზიáƒ"</string>
+ <string name="permdesc_interactAcrossUsersFull" msgid="376841368395502366">"áƒáƒ«áƒšáƒ”ვს მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლებს შáƒáƒ áƒ˜áƒ¡ ყველრშესáƒáƒ«áƒšáƒ ინტერáƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ უფლებáƒáƒ¡."</string>
+ <string name="permlab_manageUsers" msgid="1676150911672282428">"მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლების მáƒáƒ áƒ—ვáƒ"</string>
+ <string name="permdesc_manageUsers" msgid="8409306667645355638">"áƒáƒžáƒ¡ შეუძლირმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლების მáƒáƒ áƒ—ვრმáƒáƒ¬áƒ§áƒáƒ‘ილáƒáƒ‘áƒáƒ–ე, მáƒáƒ— შáƒáƒ áƒ˜áƒ¡ მáƒáƒ—ხáƒáƒ•ნის, შექმნის დრწáƒáƒ¨áƒšáƒ˜áƒ¡."</string>
+ <string name="permlab_getDetailedTasks" msgid="6229468674753529501">"მáƒáƒ¥áƒ›áƒ”დი áƒáƒžáƒ”ბის დეტáƒáƒšáƒ”ბის მáƒáƒ«áƒ˜áƒ”ბáƒ"</string>
+ <string name="permdesc_getDetailedTasks" msgid="153824741440717599">"áƒáƒžáƒ¡ შეეძლებრმáƒáƒ˜áƒ«áƒ˜áƒáƒ¡ დეტáƒáƒšáƒ£áƒ áƒ˜ ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ áƒáƒ›áƒŸáƒáƒ›áƒáƒ“ დრუáƒáƒ®áƒšáƒáƒ”ს წáƒáƒ áƒ¡áƒ£áƒšáƒ¨áƒ˜ მიმდინáƒáƒ áƒ” áƒáƒ›áƒáƒªáƒáƒœáƒ”ბის შესáƒáƒ®áƒ”ბ. მáƒáƒ•ნე áƒáƒžáƒ”ბს შეუძლიáƒáƒ— áƒáƒ¦áƒ›áƒáƒáƒ©áƒ˜áƒœáƒáƒœ პირáƒáƒ“ი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ სხვრáƒáƒžáƒ”ბის შესáƒáƒ®áƒ”ბ."</string>
+ <string name="permlab_reorderTasks" msgid="2018575526934422779">"მáƒáƒ¥áƒ›áƒ”დი áƒáƒžáƒ”ბის წყáƒáƒ‘ის შეცვლáƒ"</string>
+ <string name="permdesc_reorderTasks" msgid="7734217754877439351">"áƒáƒžáƒ¡ შეეძლებრáƒáƒ›áƒáƒªáƒáƒœáƒ”ბის გáƒáƒ“áƒáƒ¢áƒáƒœáƒ წინრდრუკáƒáƒœáƒ პლáƒáƒœáƒ–ე. áƒáƒ›áƒáƒ¡ თქვენი ჩáƒáƒ áƒ”ვის გáƒáƒ áƒ”შე გáƒáƒáƒ™áƒ”თებს."</string>
+ <string name="permlab_removeTasks" msgid="6821513401870377403">"გáƒáƒ¨áƒ•ებული áƒáƒžáƒ”ბის შეწყვეტáƒ"</string>
+ <string name="permdesc_removeTasks" msgid="1394714352062635493">"áƒáƒžáƒ¡ შეეძლებრáƒáƒ›áƒáƒªáƒáƒœáƒ”ბის წáƒáƒ¨áƒšáƒ დრმáƒáƒ—ი áƒáƒžáƒ”ბის გáƒáƒ£áƒ¥áƒ›áƒ”ბáƒ. მáƒáƒ•ნე áƒáƒžáƒ”ბმრშესáƒáƒ«áƒšáƒáƒ დáƒáƒáƒ áƒ¦áƒ•იáƒáƒœ სხვრáƒáƒžáƒ”ბის მáƒáƒ¥áƒ›áƒ”დებáƒ."</string>
+ <string name="permlab_manageActivityStacks" msgid="7391191384027303065">"áƒáƒ¥áƒ¢áƒ˜áƒ•áƒáƒ‘ის დáƒáƒ¡áƒ¢áƒ”ბის მáƒáƒ áƒ—ვáƒ"</string>
+ <string name="permdesc_manageActivityStacks" msgid="1615881933034084440">"სáƒáƒ¨áƒ£áƒáƒšáƒ”ბáƒáƒ¡ áƒáƒ«áƒšáƒ”ვს áƒáƒžáƒ¡ დáƒáƒáƒ›áƒáƒ¢áƒáƒ¡, áƒáƒ›áƒáƒ¨áƒáƒšáƒáƒ¡ დრშეცვáƒáƒšáƒáƒ¡ áƒáƒ¥áƒ¢áƒ˜áƒ•áƒáƒ‘ის დáƒáƒ¡áƒ¢áƒ”ბი, რáƒáƒ¨áƒ˜áƒª სხვრáƒáƒžáƒ”ბი ეშვებáƒ. მáƒáƒ•ნე áƒáƒžáƒ”ბი სხვრáƒáƒžáƒ”ბს ქცევის ხელის შეშლáƒáƒ¡ შეძლებს."</string>
+ <string name="permlab_startAnyActivity" msgid="2918768238045206456">"ნებისმიერი áƒáƒ¥áƒ¢áƒ˜áƒ•áƒáƒ‘ის წáƒáƒ›áƒáƒ¬áƒ§áƒ”ბáƒ"</string>
+ <string name="permdesc_startAnyActivity" msgid="997823695343584001">"áƒáƒžáƒ¡ შეეძლებრდáƒáƒ˜áƒ¬áƒ§áƒáƒ¡ ნებისმიერი áƒáƒ¥áƒ¢áƒ˜áƒ•áƒáƒ‘áƒ, ყáƒáƒ•ელგვáƒáƒ áƒ˜ უფლებისრდრსტáƒáƒ¢áƒ£áƒ¡áƒ˜áƒ¡ გáƒáƒ áƒ”შე."</string>
+ <string name="permlab_setScreenCompatibility" msgid="6975387118861842061">"ეკრáƒáƒœáƒ˜áƒ¡ თáƒáƒ•სებáƒáƒ“áƒáƒ‘ის დáƒáƒ§áƒ”ნებáƒ"</string>
+ <string name="permdesc_setScreenCompatibility" msgid="692043618693917374">"áƒáƒžáƒ¡ შეეძლებრსხვრáƒáƒžáƒšáƒ˜áƒ™áƒáƒªáƒ˜áƒ”ბთáƒáƒœ ეკრáƒáƒœáƒ˜áƒ¡ თáƒáƒ•სებáƒáƒ“áƒáƒ‘ის რეჟიმის კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜. მáƒáƒ•ნე áƒáƒžáƒšáƒ˜áƒ™áƒáƒªáƒ˜áƒ”ბმრშესáƒáƒ«áƒšáƒáƒ სხვრáƒáƒžáƒšáƒ˜áƒáƒ™áƒªáƒ˜áƒ”ბის ქცევრშეცვáƒáƒšáƒáƒ¡."</string>
+ <string name="permlab_setDebugApp" msgid="3022107198686584052">"áƒáƒžáƒ˜áƒ¡ გáƒáƒ›áƒáƒ áƒ—ვის გáƒáƒáƒ¥áƒ¢áƒ˜áƒ£áƒ áƒ”ბáƒ"</string>
+ <string name="permdesc_setDebugApp" msgid="4474512416299013256">"áƒáƒžáƒ¡ შეეძლებრსხვრáƒáƒžáƒ˜áƒ¡áƒ—ვის გáƒáƒ›áƒáƒ áƒ—ვის რეჟიმის ჩáƒáƒ áƒ—ვáƒ. მáƒáƒ•ნე áƒáƒžáƒšáƒ˜áƒ™áƒáƒªáƒ˜áƒ”ბს áƒáƒ› ფუნქციით შეეძლებáƒáƒ— სხვრáƒáƒžáƒ”ბის გáƒáƒ—იშვáƒ."</string>
+ <string name="permlab_changeConfiguration" msgid="4162092185124234480">"სისტემის ინტერფეისის პáƒáƒ áƒáƒ›áƒ”ტრების შეცვლáƒ"</string>
+ <string name="permdesc_changeConfiguration" msgid="4372223873154296076">"áƒáƒžáƒ¡ შეეძლებáƒ, შეცვáƒáƒšáƒáƒ¡ áƒáƒ›áƒŸáƒáƒ›áƒ˜áƒœáƒ“ელი კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ, მáƒáƒ’áƒáƒšáƒ˜áƒ—áƒáƒ“, ენრდრქვეყნის კáƒáƒ“ი áƒáƒœ შრიფტის ზáƒáƒ›áƒ."</string>
+ <string name="permlab_enableCarMode" msgid="5684504058192921098">"მáƒáƒœáƒ¥áƒáƒœáƒ˜áƒ¡ რეჟიმის ჩáƒáƒ áƒ—ვáƒ"</string>
+ <string name="permdesc_enableCarMode" msgid="4853187425751419467">"áƒáƒžáƒ¡ შეეძლებრმáƒáƒœáƒ¥áƒáƒœáƒ˜áƒ¡ რეჟიმის ჩáƒáƒ áƒ—ვáƒ."</string>
+ <string name="permlab_killBackgroundProcesses" msgid="3914026687420177202">"სხვრáƒáƒžáƒ”ბის დáƒáƒ®áƒ£áƒ áƒ•áƒ"</string>
+ <string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"áƒáƒžáƒ¡ შეეძლებáƒ, დáƒáƒáƒ¡áƒ áƒ£áƒšáƒáƒ¡ სხვრáƒáƒžáƒ”ბის ფáƒáƒœáƒ£áƒ áƒ˜ პრáƒáƒªáƒ”სები. áƒáƒ›áƒáƒœ შეიძლებრსხვრáƒáƒžáƒ”ბის შეჩერებრგáƒáƒ›áƒáƒ˜áƒ¬áƒ•იáƒáƒ¡."</string>
+ <string name="permlab_forceStopPackages" msgid="2329627428832067700">"სხვრáƒáƒžáƒ”ბის იძულებითი შეჩერებáƒ"</string>
+ <string name="permdesc_forceStopPackages" msgid="5253157296183940812">"áƒáƒžáƒ¡ შეეძლებრიძულებით შეწყვიტáƒáƒ¡ სხვრáƒáƒžáƒ”ბის მუშáƒáƒáƒ‘áƒ."</string>
+ <string name="permlab_forceBack" msgid="652935204072584616">"áƒáƒžáƒ˜áƒ¡ ძáƒáƒšáƒ˜áƒ— დáƒáƒ®áƒ£áƒ áƒ•áƒ"</string>
+ <string name="permdesc_forceBack" msgid="3892295830419513623">"áƒáƒžáƒ¡ შეეძლებრიძულებით დáƒáƒáƒ¡áƒ áƒ£áƒšáƒáƒ¡ წინრპლáƒáƒœáƒ–ე მიმდინáƒáƒ áƒ” ნებისმიერი áƒáƒ¥áƒ¢áƒ˜áƒ•áƒáƒ‘რდრდáƒáƒ‘რუნდეს უკáƒáƒœ. ჩვეულებრივ áƒáƒžáƒ”ბს მსგáƒáƒ•სი რáƒáƒ› áƒáƒ áƒáƒ¡áƒáƒ“ეს სჭირდებáƒ."</string>
+ <string name="permlab_dump" msgid="1681799862438954752">"სისტემის მდგáƒáƒ›áƒáƒ áƒ”áƒáƒ‘ის შესáƒáƒ®áƒ”ბ ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ მიღებáƒ"</string>
+ <string name="permdesc_dump" msgid="1778299088692290329">"áƒáƒžáƒ¡ შეეძლებრსისტემის შიდრმდგáƒáƒ›áƒáƒ áƒ”áƒáƒ‘ის ნáƒáƒ®áƒ•áƒ. მáƒáƒ•ნე პრáƒáƒ’რáƒáƒ›áƒ”ბი შეძლებენ პირáƒáƒ“ი დრდáƒáƒªáƒ£áƒšáƒ˜ ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ ნáƒáƒ®áƒ•áƒáƒ¡, რáƒáƒ›áƒ”ლთáƒáƒœ წვდáƒáƒ›áƒ˜áƒ¡ სáƒáƒ¨áƒ£áƒáƒšáƒ”ბáƒáƒª მáƒáƒ— áƒáƒ  უნდრჰქáƒáƒœáƒ“ეთ."</string>
+ <string name="permlab_retrieve_window_content" msgid="8022588608994589938">"ეკრáƒáƒœáƒ˜áƒ¡ კáƒáƒœáƒ¢áƒ”ნტის მáƒáƒ«áƒ˜áƒ”ბáƒ"</string>
+ <string name="permdesc_retrieve_window_content" msgid="3193269069469700265">"áƒáƒžáƒ¡ შეეძლებრáƒáƒ¥áƒ¢áƒ˜áƒ£áƒ áƒ˜ ფáƒáƒœáƒ¯áƒ áƒ˜áƒ“áƒáƒœ კáƒáƒœáƒ¢áƒ”ნტის მáƒáƒ«áƒ˜áƒ”ბáƒ. მáƒáƒ•ნე áƒáƒžáƒ”ბს შეუძლიáƒáƒ— ფáƒáƒœáƒ¯áƒ áƒ˜áƒ¡ სრული კáƒáƒœáƒ¢áƒ”ნტის მáƒáƒ«áƒ˜áƒ”ბრდრყველრტექსტის წáƒáƒ™áƒ˜áƒ—ხვრპáƒáƒ áƒáƒšáƒ”ბის გáƒáƒ áƒ“áƒ."</string>
+ <string name="permlab_temporary_enable_accessibility" msgid="2312612135127310254">"მáƒáƒ áƒ¢áƒ˜áƒ•ი წვდáƒáƒ›áƒ˜áƒ¡ დრáƒáƒ”ბით გáƒáƒáƒ¥áƒ¢áƒ˜áƒ£áƒ áƒ”ბáƒ"</string>
+ <string name="permdesc_temporary_enable_accessibility" msgid="8079456293182975464">"áƒáƒžáƒ¡ შეეძლებრმáƒáƒ¬áƒ§áƒáƒ‘ილáƒáƒ‘áƒáƒ–ე გáƒáƒ›áƒáƒ áƒ¢áƒ˜áƒ•ებული რეჟიმის ჩáƒáƒ áƒ—ვáƒ. მáƒáƒ•ნე áƒáƒžáƒ”ბს შეეძლებáƒáƒ— áƒáƒ› რეჟიმის ჩáƒáƒ áƒ—ვრმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის გáƒáƒ¤áƒ áƒ—ხილების გáƒáƒ áƒ”შე."</string>
+ <string name="permlab_retrieve_window_info" msgid="8532295199112519378">"ფáƒáƒœáƒ¯áƒ áƒ˜áƒ¡ ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ მáƒáƒ«áƒ˜áƒ”ბáƒ"</string>
+ <string name="permdesc_retrieve_window_info" msgid="4998836370424186849">"áƒáƒžáƒ¡ შეეძლებრფáƒáƒœáƒ¯áƒ áƒ”ბის მენეჯერის მეშვეáƒáƒ‘ით ფáƒáƒœáƒ¯áƒ áƒ”ბის შესáƒáƒ®áƒ”ბ ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ მáƒáƒžáƒáƒ•ებáƒ. მáƒáƒ•ნე áƒáƒžáƒšáƒ˜áƒ™áƒáƒªáƒ˜áƒ”ბს შეეძლებáƒáƒ— ისეთი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ მáƒáƒžáƒáƒ•ებáƒ, რáƒáƒ›áƒ”ლიც შიდრსისტემური მáƒáƒ®áƒ›áƒáƒ áƒ”ბისთვის áƒáƒ áƒ˜áƒ¡ გáƒáƒœáƒ™áƒ£áƒ—ვნილი."</string>
+ <string name="permlab_filter_events" msgid="8675535648807427389">"ღáƒáƒœáƒ˜áƒ¡áƒ«áƒ˜áƒ”ბების გáƒáƒ¤áƒ˜áƒšáƒ¢áƒ•რáƒ"</string>
+ <string name="permdesc_filter_events" msgid="8006236315888347680">"áƒáƒžáƒšáƒ˜áƒ™áƒáƒªáƒ˜áƒáƒ¡ შეეძლებრრეგისტრáƒáƒªáƒ˜áƒ შეტáƒáƒœáƒ˜áƒ¡ ფილტრებისáƒ, რáƒáƒ›áƒšáƒ”ბიც áƒáƒ¡áƒ£áƒ¤áƒ—áƒáƒ•ებენ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ღáƒáƒœáƒ˜áƒ¡áƒ«áƒ˜áƒ”ბის ყველრდინებáƒáƒ¡. მáƒáƒ•ნე áƒáƒžáƒ›áƒ შესáƒáƒ«áƒšáƒáƒ ეს ფუნქცირსისტემის UI კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜áƒ¡áƒ—ვის გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნáƒáƒ¡, მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ინტერვენციის გáƒáƒ áƒ”შე."</string>
+ <string name="permlab_magnify_display" msgid="5973626738170618775">"ეკრáƒáƒœáƒ˜áƒ¡ გáƒáƒ“იდებáƒ"</string>
+ <string name="permdesc_magnify_display" msgid="7121235684515003792">"áƒáƒžáƒšáƒ˜áƒ™áƒáƒªáƒ˜áƒáƒ¡ შეეძლებáƒ, შეცვáƒáƒšáƒáƒ¡ დისპლეის კáƒáƒœáƒ¢áƒ”ნტი. მáƒáƒ•ნე áƒáƒžáƒ”ბმრშეიძლებრიმგვáƒáƒ áƒáƒ“ გáƒáƒ áƒ“áƒáƒ¥áƒ›áƒœáƒáƒœ დისპლეის კáƒáƒœáƒ¢áƒ”ნტი, რáƒáƒ›Â  მáƒáƒ¬áƒ§áƒáƒ‘ილáƒáƒ‘რგáƒáƒ›áƒáƒ£áƒ¡áƒáƒ“ეგáƒáƒ áƒ˜ გáƒáƒ®áƒ“ეს."</string>
+ <string name="permlab_shutdown" msgid="7185747824038909016">"ნáƒáƒ¬áƒ˜áƒšáƒáƒ‘რივი გáƒáƒ›áƒáƒ áƒ—ვáƒ"</string>
+ <string name="permdesc_shutdown" msgid="7046500838746291775">"áƒáƒ¥áƒ¢áƒ˜áƒ•áƒáƒ‘ების მენეჯერს გáƒáƒ—იშვის რეჟიმში áƒáƒ§áƒ”ნებს. სრულ გáƒáƒ—იშვáƒáƒ¡ áƒáƒ  áƒáƒ®áƒáƒ áƒªáƒ˜áƒ”ლებს."</string>
+ <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"áƒáƒžáƒ˜áƒ¡ გáƒáƒ“áƒáƒ áƒ—ვებისგáƒáƒœ დáƒáƒªáƒ•áƒ"</string>
+ <string name="permdesc_stopAppSwitches" msgid="8262195802582255021">"ხელს უშლის მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სხვრáƒáƒžáƒ–ე გáƒáƒ“áƒáƒ áƒ—ვáƒáƒ¡."</string>
+ <string name="permlab_getTopActivityInfo" msgid="2537922311411546016">"áƒáƒ›áƒŸáƒáƒ›áƒ˜áƒœáƒ“ელი áƒáƒžáƒ˜áƒ¡ ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ მიღებáƒ"</string>
+ <string name="permdesc_getTopActivityInfo" msgid="8153651434145132505">"ნებáƒáƒ¡ რთáƒáƒ•ს მფლáƒáƒ‘ელს, მáƒáƒ˜áƒžáƒáƒ•áƒáƒ¡ მიმდინáƒáƒ áƒ” áƒáƒžáƒšáƒ˜áƒ™áƒáƒªáƒ˜áƒ˜áƒ¡ დრსერვისების შესáƒáƒ®áƒ”ბ პირáƒáƒ“ი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ ეკრáƒáƒœáƒ˜áƒ¡ წინრპლáƒáƒœáƒ–ე."</string>
+ <string name="permlab_runSetActivityWatcher" msgid="892239094867182656">"ყველრáƒáƒžáƒ˜áƒ¡ გáƒáƒ¨áƒ•ების მáƒáƒœáƒ˜áƒ¢áƒáƒ áƒ˜áƒœáƒ’ი დ კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜"</string>
+ <string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"áƒáƒžáƒ¡ შეეძლებრსისტემის მიერ გáƒáƒ›áƒáƒ«áƒáƒ®áƒ”ბული áƒáƒ¥áƒ¢áƒ˜áƒ•áƒáƒ‘ების მáƒáƒœáƒ˜áƒ¢áƒáƒ áƒ˜áƒœáƒ’ი დრმáƒáƒ áƒ—ვáƒ. მáƒáƒ•ნე áƒáƒžáƒšáƒ˜áƒ™áƒáƒªáƒ˜áƒ”ბს შეეძლებáƒáƒ— სისტემის სრული კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜. ეს ნებáƒáƒ áƒ—ვრსáƒáƒ­áƒ áƒáƒ მხáƒáƒšáƒáƒ“ დეველáƒáƒžáƒ›áƒ”ნტისთვის დრჩვეულებრივი მáƒáƒ®áƒ›áƒáƒ áƒ”ბისთის áƒáƒ  გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებáƒ."</string>
+ <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"პáƒáƒ™áƒ”ტების წáƒáƒ¨áƒšáƒ˜áƒ¡ შესáƒáƒ®áƒ”ბ შეტყáƒáƒ‘ინებების გáƒáƒ’ზáƒáƒ•ნáƒ"</string>
+ <string name="permdesc_broadcastPackageRemoved" msgid="6621901216207931089">"áƒáƒžáƒ¡ შეეძლებáƒ, გáƒáƒ’ზáƒáƒ•ნáƒáƒ¡ შეტყáƒáƒ‘ინებáƒ, რáƒáƒ› áƒáƒžáƒ˜áƒ¡ პáƒáƒ™áƒ”ტი წáƒáƒ˜áƒ¨áƒáƒšáƒ. მáƒáƒ•ნე áƒáƒžáƒ”ბმრეს უფლებრშეიძლებრგáƒáƒ›áƒáƒ˜áƒ§áƒ”ნáƒáƒœ სხვრნებისმიერი გáƒáƒ¨áƒ•ებული áƒáƒžáƒ”ბის შესáƒáƒ¬áƒ§áƒ•ეტáƒáƒ“."</string>
+ <string name="permlab_broadcastSmsReceived" msgid="5689095009030336593">"SMS-ით მიღებული სáƒáƒ›áƒáƒ£áƒ¬áƒ§áƒ”ბლრშეტყáƒáƒ‘ინების გáƒáƒ’ზáƒáƒ•ნáƒ"</string>
+ <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"áƒáƒžáƒ¡ სáƒáƒ¨áƒ£áƒáƒšáƒ”ბáƒáƒ¡ áƒáƒ«áƒšáƒ”ვს გáƒáƒáƒ’ზáƒáƒ•ნáƒáƒ¡ შეტყáƒáƒ‘ინებრSMS შეტყáƒáƒ‘ინების მიღების თáƒáƒáƒ‘áƒáƒ–ე. მáƒáƒ•ნე áƒáƒžáƒšáƒ˜áƒ™áƒáƒªáƒ˜áƒ”ბში ეს ფუნქცირშეიძლებრგáƒáƒ›áƒáƒ§áƒ”ნებული იქნáƒáƒ¡ SMS შეტყáƒáƒ‘ინებების მიღების იმიტáƒáƒªáƒ˜áƒ˜áƒ˜áƒ¡áƒáƒ—ვის."</string>
+ <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"WAP-PUSH-ით მიღებული სáƒáƒ›áƒáƒ£áƒ¬áƒ§áƒ”ბლრშეტყáƒáƒ‘ინების გáƒáƒ’ზáƒáƒ•ნáƒ"</string>
+ <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"áƒáƒžáƒ¡ შეეძლებáƒ, გáƒáƒ’ზáƒáƒ•ნáƒáƒ¡ შეტყáƒáƒ‘ინებრWAP PUSH შეტყáƒáƒ‘ინების მიღების თáƒáƒáƒ‘áƒáƒ–ე. მáƒáƒ•ნე áƒáƒžáƒ”ბმრეს შეიძლებრგáƒáƒ›áƒáƒ˜áƒ§áƒ”ნáƒáƒœ MMS შეტყáƒáƒ‘ინების მიღების გáƒáƒ¡áƒáƒ§áƒáƒšáƒ‘ებლáƒáƒ“ áƒáƒœ ნებისმიერი ვებგვერდის კáƒáƒœáƒ¢áƒ”ნტის სáƒáƒ®áƒ˜áƒ¤áƒáƒ—რვáƒáƒ áƒ˜áƒáƒœáƒ¢áƒ”ბით ჩუმáƒáƒ“ ჩáƒáƒ¡áƒáƒœáƒáƒªáƒ•ლებლáƒáƒ“."</string>
+ <string name="permlab_setProcessLimit" msgid="2451873664363662666">"მიმდინáƒáƒ áƒ” პრáƒáƒªáƒ”სების რáƒáƒáƒ“ენáƒáƒ‘ის ლიმიტი"</string>
+ <string name="permdesc_setProcessLimit" msgid="7318061314040879542">"áƒáƒžáƒ¡ შეეძლებáƒ, გáƒáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒáƒ¡ მიმდინáƒáƒ áƒ” პრáƒáƒªáƒ”სების მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ რáƒáƒáƒ“ენáƒáƒ‘áƒ. ჩვეულებრივ áƒáƒžáƒ”ბში áƒáƒ áƒáƒ¡áƒ“რáƒáƒ¡ áƒáƒ áƒ˜áƒ¡ სáƒáƒ­áƒ˜áƒ áƒ."</string>
+ <string name="permlab_setAlwaysFinish" msgid="550958507798796965">"უკáƒáƒœáƒ ფáƒáƒœáƒ˜áƒ¡ áƒáƒžáƒ˜áƒ¡ იძულებით დáƒáƒ®áƒ£áƒ áƒ•áƒ"</string>
+ <string name="permdesc_setAlwaysFinish" msgid="7471310652868841499">"áƒáƒžáƒ¡ შეეძლებრგáƒáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒáƒ¡, áƒáƒ áƒ˜áƒ¡ თუ áƒáƒ áƒ áƒáƒ¥áƒ¢áƒ˜áƒ•áƒáƒ‘ები ყáƒáƒ•ელთვის დáƒáƒ¡áƒ áƒ£áƒšáƒ”ბული მáƒáƒ—ი უკáƒáƒœáƒ ფáƒáƒœáƒ–ე გáƒáƒ“áƒáƒ¡áƒ•ლის დრáƒáƒ¡. áƒáƒ áƒáƒ¡áƒ“რáƒáƒ¡ áƒáƒ áƒ˜áƒ¡ სáƒáƒ­áƒ˜áƒ áƒ ჩვეულებრივ áƒáƒžáƒ”ბში."</string>
+ <string name="permlab_batteryStats" msgid="2789610673514103364">"ელემენტის სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ წáƒáƒ™áƒ˜áƒ—ხვáƒ"</string>
+ <string name="permdesc_batteryStats" msgid="5897346582882915114">"áƒáƒžáƒšáƒ˜áƒ™áƒáƒªáƒ˜áƒáƒ¡ შეეძლებრáƒáƒ›áƒŸáƒáƒ›áƒ˜áƒœáƒ“ელი დáƒáƒ‘áƒáƒšáƒ˜ დáƒáƒ›áƒ£áƒ®áƒ¢áƒ•ის ელემენტის გáƒáƒ›áƒáƒ§áƒ”ნების მáƒáƒœáƒáƒªáƒ”მების წáƒáƒ™áƒ˜áƒ—ხვáƒ. áƒáƒžáƒšáƒ˜áƒ™áƒáƒªáƒ˜áƒáƒ› შესáƒáƒ«áƒšáƒáƒ მáƒáƒáƒ®áƒ”რხáƒáƒ¡ თქვენ მიერ გáƒáƒ›áƒáƒ§áƒ”ნებული áƒáƒžáƒ”ბის შესáƒáƒ®áƒ”ბ დეტáƒáƒšáƒ£áƒ áƒ˜ ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ მáƒáƒ«áƒ˜áƒ”ბáƒ."</string>
+ <string name="permlab_updateBatteryStats" msgid="3719689764536379557">"ელემენტის სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ შეცვლáƒ"</string>
+ <string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"áƒáƒžáƒ¡ შეეძლებáƒ, შეცვáƒáƒšáƒáƒ¡ ბáƒáƒ¢áƒáƒ áƒ”ის გáƒáƒ›áƒáƒ§áƒ”ნების შეგრáƒáƒ•ებული სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ. áƒáƒ  გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებრჩვეულებრივ áƒáƒžáƒ”ბში."</string>
+ <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"áƒáƒžáƒ˜áƒ¡ სáƒáƒ›áƒ£áƒ¨áƒáƒ ჟურნáƒáƒšáƒ˜áƒ¡ სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ მáƒáƒ«áƒ˜áƒ”ბáƒ"</string>
+ <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"áƒáƒžáƒ¡ შეეძლებრáƒáƒžáƒšáƒ˜áƒ™áƒáƒªáƒ˜áƒáƒ—რáƒáƒžáƒ”რáƒáƒªáƒ˜áƒ”ბის შეგრáƒáƒ•ებული სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ მáƒáƒžáƒáƒ•ებáƒ. áƒáƒ  გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებრჩვეულებრივ áƒáƒžáƒ”ბში."</string>
+ <string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"áƒáƒžáƒ˜áƒ¡ სáƒáƒ›áƒ£áƒ¨áƒáƒ ჟურნáƒáƒšáƒ˜áƒ¡ სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ შეცვლáƒ"</string>
+ <string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"áƒáƒžáƒ¡ შეეძლებრáƒáƒžáƒšáƒ˜áƒ™áƒáƒªáƒ˜áƒ˜áƒ¡ áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ”ბის შეგრáƒáƒ•ებული სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ მáƒáƒžáƒáƒ•ებáƒ. áƒáƒ  გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებრჩვეულებრივ áƒáƒžáƒ”ბში."</string>
+ <string name="permlab_backup" msgid="470013022865453920">"სისტემის სáƒáƒ áƒ”ზერვრáƒáƒ¡áƒšáƒ”ბის კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜ დრáƒáƒ¦áƒ“გენáƒ"</string>
+ <string name="permdesc_backup" msgid="6912230525140589891">"áƒáƒžáƒ¡ შეეძლებრსისტემის სáƒáƒ áƒ”ზერვრáƒáƒ¡áƒšáƒ”ბის კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜ დრმექáƒáƒœáƒ˜áƒ–მის áƒáƒ¦áƒ“გენáƒ. ჩვეულებრივი áƒáƒžáƒ”ბი მსგáƒáƒ•ს შესáƒáƒ«áƒšáƒ”ბლáƒáƒ‘ებს áƒáƒ  იყენებენ."</string>
+ <string name="permlab_confirm_full_backup" msgid="5557071325804469102">"სრული სáƒáƒ áƒ”ზერვრáƒáƒ¡áƒšáƒ”ბის დáƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ”ბრáƒáƒœ áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ˜áƒ¡ áƒáƒ¦áƒ“გენáƒ"</string>
+ <string name="permdesc_confirm_full_backup" msgid="1748762171637699562">"áƒáƒžáƒ¡ შეეძლებრგáƒáƒ£áƒ¨áƒ•áƒáƒ¡ სრული სáƒáƒ áƒ”ზერვრáƒáƒ¡áƒšáƒ”ბის UI დáƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ”ბáƒ. áƒáƒ  იყენებს áƒáƒ áƒª ერთი სხვრáƒáƒžáƒ˜."</string>
+ <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"áƒáƒ áƒáƒáƒ•ტáƒáƒ áƒ˜áƒ–ებული ფáƒáƒœáƒ¯áƒ áƒ”ბის ჩვენებáƒ"</string>
+ <string name="permdesc_internalSystemWindow" msgid="7458387759461466397">"áƒáƒžáƒ¡ შეეძლებáƒ, შექმნáƒáƒ¡ შიდრსისტემის მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ინტერფეისის მიერ გáƒáƒ›áƒáƒ§áƒ”ნებისთვის გáƒáƒœáƒ™áƒ£áƒ—ვნილი ფáƒáƒœáƒ¯áƒ áƒ”ბი. áƒáƒ  გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებრჩვეულებრივ áƒáƒžáƒ”ბში."</string>
+ <string name="permlab_systemAlertWindow" msgid="3543347980839518613">"სხვრáƒáƒžáƒ”ბის ინტერფეისზე გáƒáƒ“áƒáƒ¬áƒ”რáƒ"</string>
+ <string name="permdesc_systemAlertWindow" msgid="8584678381972820118">"áƒáƒžáƒ¡ შეეძლებრთáƒáƒ•ისი ინტერფეისი ზემáƒáƒ“áƒáƒœ გáƒáƒ“áƒáƒáƒ¬áƒ”რáƒáƒ¡ სხვრáƒáƒžáƒšáƒ˜áƒ™áƒáƒªáƒ˜áƒ”ბს áƒáƒœ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ინტერფეისის ნáƒáƒ¬áƒ˜áƒšáƒ”ბს. áƒáƒ›áƒ’ვáƒáƒ áƒáƒ“, შესáƒáƒ«áƒšáƒáƒ შეიცვáƒáƒšáƒáƒ¡ სხვრáƒáƒžáƒšáƒ˜áƒ™áƒáƒªáƒ˜áƒ˜áƒ¡ ინტერფეისი დრხელი შეგეშáƒáƒšáƒáƒ— სხვრმáƒáƒ¡áƒ—áƒáƒœ მუშáƒáƒáƒ‘ისáƒáƒ¡."</string>
+ <string name="permlab_setAnimationScale" msgid="2805103241153907174">"áƒáƒœáƒ˜áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გლáƒáƒ‘áƒáƒšáƒ£áƒ áƒ˜ სიჩქáƒáƒ áƒ˜áƒ¡ შეცვლáƒ"</string>
+ <string name="permdesc_setAnimationScale" msgid="7690063428924343571">"áƒáƒžáƒ¡ შეეძლებრგლáƒáƒ‘áƒáƒšáƒ£áƒ áƒ˜ áƒáƒœáƒ˜áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ სიჩქáƒáƒ áƒ˜áƒ¡ შეცვლრ(სწრáƒáƒ¤áƒ˜ áƒáƒœ ნელი áƒáƒœáƒ˜áƒ›áƒáƒªáƒ˜áƒ) ნებისმიერ დრáƒáƒ¡."</string>
+ <string name="permlab_manageAppTokens" msgid="1286505717050121370">"áƒáƒžáƒ˜áƒ¡ წინáƒáƒ¡áƒ¬áƒáƒ áƒ˜ გáƒáƒ“áƒáƒ®áƒ“ის ბáƒáƒ áƒáƒ—ების მáƒáƒ áƒ—ვáƒ"</string>
+ <string name="permdesc_manageAppTokens" msgid="8043431713014395671">"áƒáƒžáƒ¡ შეეძლებáƒ, შექმნáƒáƒ¡ დრმáƒáƒ áƒ—áƒáƒ¡ სáƒáƒ™áƒ£áƒ—áƒáƒ áƒ˜ იდენტიფიკáƒáƒªáƒ˜áƒ˜áƒ¡ ნიშნები, ჩვეულებრივი Z-წყáƒáƒ‘ის უგულვებელყáƒáƒ¤áƒ˜áƒ—. ჩვეულებრივი áƒáƒžáƒ”ბისთვის მისი გáƒáƒ›áƒáƒ§áƒ”ნებრáƒáƒ áƒáƒ¡áƒ“რáƒáƒ¡ áƒáƒ áƒ˜áƒ¡ სáƒáƒ­áƒ˜áƒ áƒ."</string>
+ <string name="permlab_freezeScreen" msgid="4708181184441880175">"ეკრáƒáƒœáƒ˜áƒ¡ გáƒáƒ§áƒ˜áƒœáƒ•áƒ"</string>
+ <string name="permdesc_freezeScreen" msgid="8558923789222670064">"áƒáƒžáƒšáƒ˜áƒ™áƒáƒªáƒ˜áƒáƒ¡ შეეძლებრეკრáƒáƒœáƒ˜áƒ¡ დრáƒáƒ”ბით გáƒáƒ¨áƒ”შებრსრულ ეკრáƒáƒœáƒ–ე გáƒáƒ“áƒáƒ¡áƒáƒ¡áƒ•ლელáƒáƒ“."</string>
+ <string name="permlab_injectEvents" msgid="1378746584023586600">"გáƒáƒ¡áƒáƒ¦áƒ”ბზე დáƒáƒ­áƒ”რრდრღილáƒáƒ™áƒ”ბის მáƒáƒ áƒ—ვáƒ"</string>
+ <string name="permdesc_injectEvents" product="tablet" msgid="206352565599968632">"áƒáƒžáƒ¡ შეეძლებრშეყვáƒáƒœáƒ˜áƒ¡ სáƒáƒ™áƒ£áƒ—áƒáƒ áƒ˜ მáƒáƒ•ლენების (გáƒáƒ¡áƒáƒ¦áƒ”ბი დრáƒ.შ.) სხვრáƒáƒžáƒ”ბისთვის გáƒáƒ“áƒáƒªáƒ”მáƒ. მáƒáƒ•ნე áƒáƒžáƒ”ბმრშესáƒáƒ«áƒšáƒáƒ ეს გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნáƒáƒœ ტáƒáƒ‘ლეტის სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒáƒ“."</string>
+ <string name="permdesc_injectEvents" product="default" msgid="653128057572326253">"áƒáƒžáƒ¡ შეეძლებრშეყვáƒáƒœáƒ˜áƒ¡ სáƒáƒ™áƒ£áƒ—áƒáƒ áƒ˜ მáƒáƒ•ლენების (გáƒáƒ¡áƒáƒ¦áƒ”ბი დრáƒ.შ.) სხვრáƒáƒžáƒ”ბისთვის გáƒáƒ“áƒáƒªáƒ”მáƒ. მáƒáƒ•ნე áƒáƒžáƒ”ბმრშესáƒáƒ«áƒšáƒáƒ ეს გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნáƒáƒœ ტელეფáƒáƒœáƒ˜áƒ¡ სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒáƒ“."</string>
+ <string name="permlab_readInputState" msgid="469428900041249234">"ჩáƒáƒ¬áƒ”რეთ რáƒáƒ¡áƒáƒª ბეჭდáƒáƒ•თ დრრრქმედებებსáƒáƒª მიმáƒáƒ áƒ—áƒáƒ•თ."</string>
+ <string name="permdesc_readInputState" msgid="8387754901688728043">"áƒáƒžáƒ¡ შეეძლებრდáƒáƒ˜áƒœáƒáƒ®áƒáƒ¡ გáƒáƒ¡áƒáƒ¦áƒ”ბი, რáƒáƒ“ესáƒáƒª მáƒáƒ¡ ბეჭდáƒáƒ•თ თუნდáƒáƒª სხვრáƒáƒžáƒ¨áƒ˜ მუშáƒáƒáƒ‘ის დრáƒáƒ¡ (მáƒáƒ’áƒáƒšáƒ˜áƒ—áƒáƒ“, პáƒáƒ áƒáƒšáƒ˜áƒ¡ áƒáƒ™áƒ áƒ”ფáƒ). ჩვეულებრივ áƒáƒžáƒ”ბს მსგáƒáƒ•სი რáƒáƒ› áƒáƒ áƒáƒ¡áƒáƒ“ეს სჭირდებáƒ."</string>
+ <string name="permlab_bindInputMethod" msgid="3360064620230515776">"შეტáƒáƒœáƒ˜áƒ¡ მეთáƒáƒ“თáƒáƒœ დáƒáƒ™áƒáƒ•შირებáƒ"</string>
+ <string name="permdesc_bindInputMethod" msgid="3250440322807286331">"áƒáƒžáƒ¡ შეეძლებრზედრდáƒáƒœáƒ˜áƒ¡ ინტერფეისის წვდáƒáƒ›áƒ˜áƒ¡ სისტემáƒáƒ¡áƒ—áƒáƒœ დáƒáƒ™áƒáƒ•შირებáƒ. áƒáƒ áƒáƒ¡áƒ“რáƒáƒ¡ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებრჩვეულებრივ áƒáƒžáƒ”ბში."</string>
+ <string name="permlab_bindAccessibilityService" msgid="5357733942556031593">"გáƒáƒ›áƒáƒ áƒ¢áƒ˜áƒ•ებული წვდáƒáƒ›áƒ˜áƒ¡ სერვისთáƒáƒœ მიერთებáƒ"</string>
+ <string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"áƒáƒžáƒ¡ შეეძლებრგáƒáƒ›áƒáƒ áƒ¢áƒ˜áƒ•ებული წვდáƒáƒ›áƒ˜áƒ¡ სერვისის ზედრდáƒáƒœáƒ˜áƒ¡ ინტერფეისთáƒáƒœ დáƒáƒ™áƒáƒ•შირებáƒ. áƒáƒ áƒáƒ¡áƒ“რáƒáƒ¡ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებრჩვეულებრივ áƒáƒžáƒ”ბში."</string>
+ <string name="permlab_bindPrintService" msgid="8462815179572748761">"ბეჭდვის სევისზე მიბმáƒ"</string>
+ <string name="permdesc_bindPrintService" msgid="7960067623209111135">"მფლáƒáƒ‘ელს შეეძლებრმიებáƒáƒ¡ ბეჭდვის სერვისების ზედრდáƒáƒœáƒ˜áƒ¡ ინტერფეისს. ჩვეულებრივ áƒáƒžáƒ¡ ეს წესით áƒáƒ áƒáƒ¡áƒáƒ“ეს áƒáƒ  უნდრდáƒáƒ­áƒ˜áƒ áƒ“ეს."</string>
+ <string name="permlab_accessAllPrintJobs" msgid="1120792468465711159">"ბეჭდვის ყველრდáƒáƒ•áƒáƒšáƒ”ბáƒáƒ–ე წვდáƒáƒ›áƒ"</string>
+ <string name="permdesc_accessAllPrintJobs" msgid="2978185311041864762">"სáƒáƒ¨áƒ£áƒáƒšáƒ”ბáƒáƒ¡ áƒáƒ«áƒšáƒ”ვს მფლáƒáƒ‘ელს იქáƒáƒœáƒ˜áƒáƒ¡ წვდáƒáƒ›áƒ სხვრáƒáƒžáƒ˜áƒ¡ მიერ შექმნილ ბეჭდვის დáƒáƒ•áƒáƒšáƒ”ბებზე. ჩვეულებრივ áƒáƒžáƒ¡ ეს წესით áƒáƒ áƒáƒ¡áƒáƒ“ეს áƒáƒ  უნდრდáƒáƒ­áƒ˜áƒ áƒ“ეს."</string>
+ <string name="permlab_bindNfcService" msgid="2752731300419410724">"NFC სერვისთáƒáƒœ შეკáƒáƒ•შირებáƒ"</string>
+ <string name="permdesc_bindNfcService" msgid="6120647629174066862">"სáƒáƒ¨áƒ£áƒáƒšáƒ”ბáƒáƒ¡ áƒáƒ«áƒšáƒ”ვს მფლáƒáƒ‘ელს შეკáƒáƒ•შირდეს áƒáƒžáƒšáƒ˜áƒ™áƒáƒªáƒ˜áƒ”ბთáƒáƒœ, რáƒáƒ›áƒšáƒ”ბიც NFC ბáƒáƒ áƒáƒ—ების სიმულáƒáƒªáƒ˜áƒáƒ¡ áƒáƒ®áƒ“ენს. ჩვეულებრივ áƒáƒžáƒ”ბს უმეტეს შემთხვევáƒáƒ¨áƒ˜ áƒáƒ  დáƒáƒ­áƒ˜áƒ áƒ“ებáƒ."</string>
+ <string name="permlab_bindTextService" msgid="7358378401915287938">"ტექსტ სერვისთáƒáƒœ დáƒáƒ™áƒáƒ•შირებáƒ"</string>
+ <string name="permdesc_bindTextService" msgid="8151968910973998670">"áƒáƒžáƒ¡ შეეძლებრზედრდáƒáƒœáƒ˜áƒ¡ ინტერფეისის ტექსტური სáƒáƒ›áƒ¡áƒáƒ®áƒ£áƒ áƒ—áƒáƒœ (მáƒáƒ’. SpellCheckerService) დáƒáƒ™áƒáƒ•შირებáƒ. áƒáƒ áƒáƒ¡áƒ“რáƒáƒ¡ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებრჩვეულებრივ áƒáƒžáƒ”ბში."</string>
+ <string name="permlab_bindVpnService" msgid="4708596021161473255">"VPN სერვისთáƒáƒœ დáƒáƒ™áƒáƒ•შირებáƒ"</string>
+ <string name="permdesc_bindVpnService" msgid="2067845564581693905">"áƒáƒžáƒ¡ შეეძლებრVpn სერვისის ზედრდáƒáƒœáƒ˜áƒ¡ ინტერფეისთáƒáƒœ დáƒáƒ™áƒáƒ•შირებáƒ. áƒáƒ áƒáƒ¡áƒ“რáƒáƒ¡ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებრჩვეულებრივ áƒáƒžáƒ”ბში."</string>
+ <string name="permlab_bindWallpaper" msgid="8716400279937856462">"ფáƒáƒœáƒ–ე მიჭედებáƒ"</string>
+ <string name="permdesc_bindWallpaper" msgid="7108428692595491668">"მფლáƒáƒ‘ელს შეეძლებრფáƒáƒœáƒ˜áƒ¡ ზედრდáƒáƒœáƒ˜áƒ¡ ინტერფეისთáƒáƒœ დáƒáƒ™áƒáƒ•შირებáƒ. áƒáƒ áƒáƒ¡áƒ“რáƒáƒ¡ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებრჩვეულებრივ áƒáƒžáƒ”ბში."</string>
+ <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"ვიჯეტ სერვისთáƒáƒœ დáƒáƒ™áƒáƒ•შირებáƒ"</string>
+ <string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"áƒáƒžáƒ¡ შეეძლებრზედრდáƒáƒœáƒ˜áƒ¡ ინტერფეისის ვიჯეტთáƒáƒœ დáƒáƒ™áƒáƒ•შირებáƒ. áƒáƒ áƒáƒ¡áƒ“რáƒáƒ¡ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებრჩვეულებრივ áƒáƒžáƒ”ბში."</string>
+ <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"მáƒáƒ¬áƒ§áƒáƒ‘ილáƒáƒ‘ის áƒáƒ“მინთáƒáƒœ ინტერáƒáƒ¥áƒªáƒ˜áƒ"</string>
+ <string name="permdesc_bindDeviceAdmin" msgid="569715419543907930">"áƒáƒžáƒ¡ შეეძლებრმáƒáƒ¬áƒ§áƒáƒ‘ილáƒáƒ‘ის áƒáƒ“მინისტრáƒáƒ¢áƒáƒ áƒ˜áƒ¡áƒ—ვის intent áƒáƒ‘იექტების გáƒáƒ’ზáƒáƒ•ნáƒ. áƒáƒ áƒáƒ¡áƒ“რáƒáƒ¡ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებრჩვეულებრივ áƒáƒžáƒ”ბში."</string>
+ <string name="permlab_manageDeviceAdmins" msgid="4248828900045808722">"მáƒáƒ¬áƒ§áƒáƒ‘ილáƒáƒ‘ის áƒáƒ“მინისტრáƒáƒ¢áƒáƒ áƒ¡ დáƒáƒ›áƒáƒ¢áƒ”ბრáƒáƒœ áƒáƒ›áƒáƒ¨áƒšáƒ"</string>
+ <string name="permdesc_manageDeviceAdmins" msgid="5025608167709942485">"სáƒáƒ¨áƒ£áƒáƒšáƒ”ბáƒáƒ¡ áƒáƒ«áƒšáƒ”ვს მფლáƒáƒ‘ელს დáƒáƒáƒ›áƒáƒ¢áƒáƒ¡ áƒáƒœ áƒáƒ›áƒáƒ¨áƒáƒšáƒáƒ¡ მáƒáƒ¬áƒ§áƒáƒ‘ილáƒáƒ‘ის áƒáƒ¥áƒ¢áƒ˜áƒ£áƒ áƒ˜ áƒáƒ“მინისტრáƒáƒ¢áƒáƒ áƒ”ბი. ჩვეულებრივ áƒáƒžáƒ”ბს, áƒáƒšáƒ‘áƒáƒ—, áƒáƒ áƒáƒ¡áƒáƒ“ეს დáƒáƒ­áƒ˜áƒ áƒ“ებáƒ"</string>
+ <string name="permlab_setOrientation" msgid="3365947717163866844">"ეკრáƒáƒœáƒ˜áƒ¡ áƒáƒ áƒ˜áƒ”ნტáƒáƒªáƒ˜áƒ˜áƒ¡ შეცვლáƒ"</string>
+ <string name="permdesc_setOrientation" msgid="3046126619316671476">"áƒáƒžáƒ¡ შეეძლებáƒ, áƒáƒ¢áƒ áƒ˜áƒáƒšáƒáƒ¡ ეკრáƒáƒœáƒ˜ ნებისმიერ დრáƒáƒ¡. áƒáƒ áƒáƒ¡áƒ“რáƒáƒ¡ იქნებრსáƒáƒ­áƒ˜áƒ áƒ ჩვეულებრივ áƒáƒžáƒ”ბში."</string>
+ <string name="permlab_setPointerSpeed" msgid="9175371613322562934">"მáƒáƒ©áƒ•ენებლის სიჩქáƒáƒ áƒ˜áƒ¡ შეცვლáƒ"</string>
+ <string name="permdesc_setPointerSpeed" msgid="6866563234274104233">"áƒáƒžáƒ¡ შეეძლებáƒ, შეცვáƒáƒšáƒáƒ¡ მáƒáƒ£áƒ¡áƒ˜áƒ¡ áƒáƒœ თრექპედის კურსáƒáƒ áƒ˜áƒ¡ სიჩქáƒáƒ áƒ” ნებისმიერ დრáƒáƒ¡. áƒáƒ áƒáƒ¡áƒ“რáƒáƒ¡ იქნებრსáƒáƒ­áƒ˜áƒ áƒ ჩვეულებრივ áƒáƒžáƒ”ბში."</string>
+ <string name="permlab_setKeyboardLayout" msgid="4778731703600909340">"კლáƒáƒ•იáƒáƒ¢áƒ£áƒ áƒ˜áƒ¡ გáƒáƒœáƒšáƒáƒ’ების შეცვლáƒ"</string>
+ <string name="permdesc_setKeyboardLayout" msgid="8480016771134175879">"áƒáƒžáƒ¡ შეეძლებრშეცვáƒáƒšáƒáƒ¡ კლáƒáƒ•იáƒáƒ¢áƒ£áƒ áƒ˜áƒ¡ გáƒáƒœáƒšáƒáƒ’ებáƒ. ეს ფუნქცირáƒáƒ áƒáƒ¡áƒ“რáƒáƒ¡ იქნებრსáƒáƒ­áƒ˜áƒ áƒ ჩვეულებრივ áƒáƒžáƒ”ბში."</string>
+ <string name="permlab_signalPersistentProcesses" msgid="4539002991947376659">"áƒáƒžáƒ”ბისთვის Linux-ის სიგნáƒáƒšáƒ”ბის გáƒáƒ’ზáƒáƒ•ნáƒ"</string>
+ <string name="permdesc_signalPersistentProcesses" msgid="4896992079182649141">"áƒáƒžáƒ¡ შეეძლებრმáƒáƒ˜áƒ—ხáƒáƒ•áƒáƒ¡ უზრუნველყáƒáƒ¤áƒ˜áƒšáƒ˜ სიგნáƒáƒšáƒ˜áƒ¡ მუდმივ პრáƒáƒªáƒ”სებისთვის გáƒáƒ’ზáƒáƒ•ნáƒ."</string>
+ <string name="permlab_persistentActivity" msgid="8841113627955563938">"დáƒáƒáƒ§áƒ”ნáƒáƒ¡ áƒáƒžáƒ˜ მუდმივáƒáƒ“ ჩáƒáƒ áƒ—ულáƒáƒ“"</string>
+ <string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"áƒáƒžáƒ¡ შეეძლებáƒ, სáƒáƒ™áƒ£áƒ—áƒáƒ áƒ˜ ნáƒáƒ¬áƒ˜áƒšáƒ”ბი მუდმივáƒáƒ“ ჩáƒáƒ¬áƒ”რáƒáƒ¡ მეხსიერებáƒáƒ¨áƒ˜. ეს შეზღუდáƒáƒ•ს მეხსიერების ხელმისáƒáƒ¬áƒ•დáƒáƒ›áƒáƒ‘áƒáƒ¡ სხვრáƒáƒžáƒ”ბისთვის დრშეáƒáƒœáƒ”ლებს ტáƒáƒ‘ლეტს."</string>
+ <string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"áƒáƒžáƒ¡ შეეძლებáƒ, სáƒáƒ™áƒ£áƒ—áƒáƒ áƒ˜ ნáƒáƒ¬áƒ˜áƒšáƒ”ბი მუდმივáƒáƒ“ ჩáƒáƒ¬áƒ”რáƒáƒ¡ მეხსიერებáƒáƒ¨áƒ˜. ეს შეზღუდáƒáƒ•ს მეხსიერების ხელმისáƒáƒ¬áƒ•დáƒáƒ›áƒáƒ‘áƒáƒ¡ სხვრáƒáƒžáƒ”ბისთვის დრშეáƒáƒœáƒ”ლებს ტელეფáƒáƒœáƒ¡."</string>
+ <string name="permlab_deletePackages" msgid="184385129537705938">"áƒáƒžáƒ”ბის წáƒáƒ¨áƒšáƒ"</string>
+ <string name="permdesc_deletePackages" msgid="7411480275167205081">"áƒáƒžáƒ¡ შეეძლებრAndroid პáƒáƒ™áƒ”ტების წáƒáƒ¨áƒšáƒ. მáƒáƒ•ნე áƒáƒžáƒ”ბმრშეიძლებრგáƒáƒ›áƒáƒ˜áƒ§áƒ”ნáƒáƒœ მნიშვნელáƒáƒ•áƒáƒœáƒ˜ áƒáƒžáƒ”ბის წáƒáƒ¡áƒáƒ¨áƒšáƒ”ლáƒáƒ“."</string>
+ <string name="permlab_clearAppUserData" msgid="274109191845842756">"სხვრáƒáƒžáƒ”ბის მáƒáƒœáƒáƒªáƒ”მების წáƒáƒ¨áƒšáƒ"</string>
+ <string name="permdesc_clearAppUserData" msgid="4625323684125459488">"áƒáƒžáƒ¡ შეეძლებრმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის მáƒáƒœáƒáƒªáƒ”მების წáƒáƒ¨áƒšáƒ."</string>
+ <string name="permlab_deleteCacheFiles" msgid="3128665571837408675">"სხვრáƒáƒžáƒ”ბის ქეშის წáƒáƒ¨áƒšáƒ"</string>
+ <string name="permdesc_deleteCacheFiles" msgid="3812998599006730196">"áƒáƒžáƒ¡ შეეძლებრქეშის ფáƒáƒ˜áƒšáƒ”ბის წáƒáƒ¨áƒšáƒ."</string>
+ <string name="permlab_getPackageSize" msgid="7472921768357981986">"áƒáƒžáƒ˜áƒ¡ მეხსიერების სივრცის გáƒáƒ–áƒáƒ›áƒ•áƒ"</string>
+ <string name="permdesc_getPackageSize" msgid="3921068154420738296">"áƒáƒžáƒ¡ შეეძლებáƒ, მáƒáƒ˜áƒžáƒáƒ•áƒáƒ¡ თáƒáƒ•ისი კáƒáƒ“ი, მáƒáƒœáƒáƒªáƒ”მები დრქეშის ზáƒáƒ›áƒ”ბი."</string>
+ <string name="permlab_installPackages" msgid="2199128482820306924">"áƒáƒžáƒ”ბის პირდáƒáƒžáƒ˜áƒ áƒ˜ ინსტáƒáƒšáƒáƒªáƒ˜áƒ"</string>
+ <string name="permdesc_installPackages" msgid="5628530972548071284">"áƒáƒžáƒ¡ შეეძლებრAndroid-ის áƒáƒ®áƒáƒšáƒ˜ áƒáƒœ გáƒáƒœáƒáƒ®áƒšáƒ”ბული პáƒáƒ™áƒ”ტების ინსტáƒáƒšáƒáƒªáƒ˜áƒ. მáƒáƒ•ნე áƒáƒžáƒ”ბმრშესáƒáƒ«áƒšáƒáƒ ეს გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნáƒáƒœ áƒáƒ®áƒáƒšáƒ˜ áƒáƒžáƒ”ბის დáƒáƒ¡áƒáƒ›áƒáƒ¢áƒ”ბლáƒáƒ“ თვითნებურáƒáƒ“, მნიშვნელáƒáƒ•áƒáƒœáƒ˜ უფლებებით."</string>
+ <string name="permlab_clearAppCache" msgid="7487279391723526815">"ყველრáƒáƒžáƒ˜áƒ¡ მáƒáƒœáƒáƒªáƒ”მთრქეშის წáƒáƒ¨áƒšáƒ"</string>
+ <string name="permdesc_clearAppCache" product="tablet" msgid="8974640871945434565">"áƒáƒžáƒ¡ შეეძლებáƒ, გáƒáƒáƒ¡áƒ£áƒ¤áƒ—áƒáƒ•áƒáƒ¡ ტáƒáƒ‘ლეტის მეხსიერებრსხვრáƒáƒžáƒšáƒ˜áƒ™áƒáƒªáƒ˜áƒ”ბის ქეშის სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეებში ფáƒáƒ˜áƒšáƒ”ბის წáƒáƒ¨áƒšáƒ˜áƒ—. áƒáƒ›áƒáƒœ შეიძლებრგáƒáƒ›áƒáƒ˜áƒ¬áƒ•იáƒáƒ¡ სხვრáƒáƒžáƒšáƒ˜áƒ™áƒáƒªáƒ˜áƒ”ბის უფრრნელი გáƒáƒ¨áƒ•ებáƒ, რáƒáƒ“გáƒáƒœáƒáƒª მáƒáƒ— მáƒáƒœáƒáƒªáƒ”მების ხელáƒáƒ®áƒšáƒ პáƒáƒ•ნრსჭირდებáƒáƒ—."</string>
+ <string name="permdesc_clearAppCache" product="default" msgid="2459441021956436779">"áƒáƒžáƒ¡ შეეძლებáƒ, გáƒáƒáƒ¡áƒ£áƒ¤áƒ—áƒáƒ•áƒáƒ¡ ტელეფáƒáƒœáƒ˜áƒ¡ მეხსიერებრსხვრáƒáƒžáƒšáƒ˜áƒ™áƒáƒªáƒ˜áƒ”ბის ქეშის სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეებში ფáƒáƒ˜áƒšáƒ”ბის წáƒáƒ¨áƒšáƒ˜áƒ—. áƒáƒ›áƒáƒœ შეიძლებრგáƒáƒ›áƒáƒ˜áƒ¬áƒ•იáƒáƒ¡ სხვრáƒáƒžáƒšáƒ˜áƒ™áƒáƒªáƒ˜áƒ”ბის უფრრნელი გáƒáƒ¨áƒ•ებáƒ, რáƒáƒ“გáƒáƒœáƒáƒª მáƒáƒ— მáƒáƒœáƒáƒªáƒ”მების ხელáƒáƒ®áƒšáƒ პáƒáƒ•ნრსჭირდებáƒáƒ—."</string>
+ <string name="permlab_movePackage" msgid="3289890271645921411">"áƒáƒžáƒ˜áƒ¡ რესურსების გáƒáƒ“áƒáƒ¢áƒáƒœáƒ"</string>
+ <string name="permdesc_movePackage" msgid="319562217778244524">"áƒáƒžáƒ¡ შეეძლებრáƒáƒžáƒ”ბის რესურსსების გáƒáƒ“áƒáƒ¢áƒáƒœáƒ გáƒáƒ áƒ”დáƒáƒœ შიდრმეხსიერებáƒáƒ–ე დრპირიქით."</string>
+ <string name="permlab_readLogs" msgid="6615778543198967614">"ჟურნáƒáƒšáƒ˜áƒ¡ სენსიტიური მáƒáƒœáƒáƒªáƒ”მების წáƒáƒ™áƒ˜áƒ—ხვáƒ"</string>
+ <string name="permdesc_readLogs" product="tablet" msgid="82061313293455151">"áƒáƒžáƒ¡ შეეძლებრსისტემის სხვáƒáƒ“áƒáƒ¡áƒ®áƒ•რჟურნáƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ”ბის წáƒáƒ™áƒ˜áƒ—ხვáƒ. ეს უფლებáƒáƒ¡ áƒáƒ«áƒšáƒ”ვს, გáƒáƒ˜áƒ’áƒáƒ¡ ზáƒáƒ’áƒáƒ“ი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ იმის შესáƒáƒ®áƒ”ბ, თუ რáƒáƒ¡ áƒáƒ™áƒ”თებთ ტáƒáƒ‘ლეტზე დáƒ, პáƒáƒ¢áƒ”ნციურáƒáƒ“, პირáƒáƒ“ი áƒáƒœ კáƒáƒœáƒ¤áƒ˜áƒ“ენციáƒáƒšáƒ£áƒ áƒ˜ ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒáƒª."</string>
+ <string name="permdesc_readLogs" product="default" msgid="2063438140241560443">"áƒáƒžáƒ¡ შეეძლებრსისტემის სხვáƒáƒ“áƒáƒ¡áƒ®áƒ•რჟურნáƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ”ბის წáƒáƒ™áƒ˜áƒ—ხვáƒ. ეს უფლებáƒáƒ¡ áƒáƒ«áƒšáƒ”ვს, გáƒáƒ˜áƒ’áƒáƒ¡ ზáƒáƒ’áƒáƒ“ი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ იმის შესáƒáƒ®áƒ”ბ, თუ რáƒáƒ¡ áƒáƒ™áƒ”თებთ ტელეფáƒáƒœáƒ–ე დáƒ, პáƒáƒ¢áƒ”ნციურáƒáƒ“, პირáƒáƒ“ი áƒáƒœ კáƒáƒœáƒ¤áƒ˜áƒ“ენციáƒáƒšáƒ£áƒ áƒ˜ ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒáƒª."</string>
+ <string name="permlab_anyCodecForPlayback" msgid="715805555823881818">"ნებისმიერი მედირდეკáƒáƒ“ერის გáƒáƒ›áƒáƒ§áƒ”ნებáƒ"</string>
+ <string name="permdesc_anyCodecForPlayback" msgid="8283912488433189010">"áƒáƒžáƒ¡ დáƒáƒ¡áƒáƒ™áƒ áƒáƒ•áƒáƒ“ შეეძლებრგáƒáƒ›áƒáƒ˜áƒ§áƒ”ნáƒáƒ¡ ნებისმიერი დáƒáƒ§áƒ”ნებული მედირდეკáƒáƒ“ერი."</string>
+ <!-- no translation found for permlab_manageCaCertificates (1678391896786882014) -->
+ <skip />
+ <!-- no translation found for permdesc_manageCaCertificates (4015644047196937014) -->
+ <skip />
+ <string name="permlab_diagnostic" msgid="8076743953908000342">"სისტემის დიáƒáƒ’ნáƒáƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ რესურსებში წáƒáƒ™áƒ˜áƒ—ხვáƒ/ჩáƒáƒ¬áƒ”რის უფლებáƒ"</string>
+ <string name="permdesc_diagnostic" msgid="6608295692002452283">"áƒáƒžáƒ¡ შეეძლებáƒ, წáƒáƒ˜áƒ™áƒ˜áƒ—ხáƒáƒ¡ áƒáƒœ ჩáƒáƒ¬áƒ”რáƒáƒ¡ ნებისმიერ რესურსში, რáƒáƒ›áƒ”ლიც დიáƒáƒ’ნáƒáƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ ჯგუფს ეკუთვნის, მáƒáƒ’áƒáƒšáƒ˜áƒ—áƒáƒ“, ფáƒáƒ˜áƒšáƒ”ბი /dev-ში. áƒáƒ›áƒáƒœ შესáƒáƒ«áƒšáƒáƒ იმáƒáƒ¥áƒ›áƒ”დáƒáƒ¡ სისტემის სტáƒáƒ‘ილურáƒáƒ‘áƒáƒ¡áƒ დრუსáƒáƒ¤áƒ áƒ—ხáƒáƒ”ბáƒáƒ–ე. მისი გáƒáƒ›áƒáƒ§áƒ”ნებრმხáƒáƒšáƒáƒ“ მწáƒáƒ áƒ›áƒáƒ”ბლის áƒáƒœ áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ მიერ ტექნიკის სპეციფიკური დიáƒáƒ’ნáƒáƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡áƒ—ვის უნდრმáƒáƒ®áƒ“ეს."</string>
+ <string name="permlab_changeComponentState" msgid="6335576775711095931">"áƒáƒžáƒ˜áƒ¡ კáƒáƒ›áƒžáƒáƒœáƒ”ნტების ჩáƒáƒ áƒ—ვრáƒáƒœ გáƒáƒ›áƒáƒ áƒ—ვáƒ"</string>
+ <string name="permdesc_changeComponentState" product="tablet" msgid="8887435740982237294">"áƒáƒžáƒ”ბს სáƒáƒ¨áƒ£áƒáƒšáƒ”ბáƒáƒ¡ áƒáƒ«áƒšáƒ”ვს, შეცვáƒáƒšáƒáƒœ სხვრáƒáƒžáƒ”ბის კáƒáƒ›áƒžáƒáƒœáƒ”ნტები. áƒáƒ› გზით მáƒáƒ•ნე áƒáƒžáƒ”ბი შეძლებენ ტáƒáƒ‘ლეტის მნიშვნელვáƒáƒœáƒ˜ ფუნქციების გáƒáƒ—იშვáƒáƒ¡. ეს ნებáƒáƒ áƒ—ვრსიფრთხილით გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ, რáƒáƒ—რშემთხვევით áƒáƒ  დáƒáƒáƒ áƒ¦áƒ•იáƒáƒ— áƒáƒžáƒšáƒ˜áƒ™áƒáƒªáƒ˜áƒ˜áƒ¡ კáƒáƒ›áƒžáƒáƒœáƒ”ნტების მუშáƒáƒáƒ‘áƒ."</string>
+ <string name="permdesc_changeComponentState" product="default" msgid="1827232484416505615">"áƒáƒžáƒ”ბს სáƒáƒ¨áƒ£áƒáƒšáƒ”ბáƒáƒ¡ áƒáƒ«áƒšáƒ”ვს, შეცვáƒáƒšáƒáƒœ სხვრáƒáƒžáƒ”ბის კáƒáƒ›áƒžáƒáƒœáƒ”ნტები. áƒáƒ› გზით მáƒáƒ•ნე áƒáƒžáƒ”ბი შეძლებენ ტელეფáƒáƒœáƒ˜áƒ¡ მნიშვნელვáƒáƒœáƒ˜ ფუნქციების გáƒáƒ—იშვáƒáƒ¡. ეს ნებáƒáƒ áƒ—ვრსიფრთხილით გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ, რáƒáƒ—რშემთხვევით áƒáƒ  დáƒáƒáƒ áƒ¦áƒ•იáƒáƒ— áƒáƒžáƒšáƒ˜áƒ™áƒáƒªáƒ˜áƒ˜áƒ¡ კáƒáƒ›áƒžáƒáƒœáƒ”ნტების მუშáƒáƒáƒ‘áƒ."</string>
+ <string name="permlab_grantRevokePermissions" msgid="4627315351093508795">"ნებáƒáƒ áƒ—ვების მიცემრáƒáƒœ გáƒáƒ£áƒ¥áƒ›áƒ”ბáƒ"</string>
+ <string name="permdesc_grantRevokePermissions" msgid="4088642654085850662">"áƒáƒžáƒšáƒ˜áƒ™áƒáƒªáƒ˜áƒáƒ¡ შეეძლებáƒ, გáƒáƒ¡áƒªáƒ”ს áƒáƒœ გáƒáƒáƒ£áƒ¥áƒ›áƒáƒ¡ გáƒáƒœáƒ¡áƒáƒ™áƒ£áƒ—რებული ნებáƒáƒ áƒ—ვები მისთვის áƒáƒœ სხვრáƒáƒžáƒšáƒ˜áƒ™áƒáƒªáƒ˜áƒ”ბისთვის. მáƒáƒ•ნე áƒáƒžáƒšáƒ˜áƒ™áƒáƒªáƒ˜áƒ”ბმრშეიძლებრგáƒáƒ›áƒáƒ˜áƒ§áƒ”ნáƒáƒœ იმ თვისებებზე წვდáƒáƒ›áƒ˜áƒ¡áƒ—ვის, რáƒáƒ›áƒšáƒ”ბიც მáƒáƒ— áƒáƒ  მიáƒáƒœáƒ˜áƒ­áƒ”თ."</string>
+ <string name="permlab_setPreferredApplications" msgid="8463181628695396391">"სáƒáƒ¡áƒ£áƒ áƒ•ელი áƒáƒžáƒ”ბის დáƒáƒ§áƒ”ნებáƒ"</string>
+ <string name="permdesc_setPreferredApplications" msgid="4973986762241783712">"áƒáƒžáƒ¡ შეეძლებრშეცვáƒáƒšáƒáƒ¡ თქვენი სáƒáƒ¡áƒ£áƒ áƒ•ელი áƒáƒžáƒ”ბი. მáƒáƒ•ნე áƒáƒžáƒ”ბმრეს შესáƒáƒ«áƒšáƒáƒ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნáƒáƒœ თქვენ მიერ მáƒáƒ®áƒ›áƒáƒ áƒ”ბáƒáƒ“ი áƒáƒžáƒ”ბის ჩუმáƒáƒ“ შესáƒáƒªáƒ•ლელáƒáƒ“, თქვენგáƒáƒœ პირáƒáƒ“ი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ მáƒáƒ¡áƒáƒ’რáƒáƒ•ებლáƒáƒ“."</string>
+ <string name="permlab_writeSettings" msgid="2226195290955224730">"სისტემის პáƒáƒ áƒáƒ›áƒ”ტრების შეცვლáƒ"</string>
+ <string name="permdesc_writeSettings" msgid="7775723441558907181">"áƒáƒžáƒ¡ შეეძლებáƒ, შეცვáƒáƒšáƒáƒ¡ სისტემის პáƒáƒ áƒáƒ›áƒ”ტრების მáƒáƒœáƒáƒªáƒ”მები. მáƒáƒ•ნე áƒáƒžáƒ”ბს შეუძლიáƒáƒ— დáƒáƒáƒ–იáƒáƒœáƒáƒœ თქვენი სისტემის კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ."</string>
+ <string name="permlab_writeSecureSettings" msgid="204676251876718288">"სისტემის უზრუნველყáƒáƒ¤áƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრების შეცვლáƒ"</string>
+ <string name="permdesc_writeSecureSettings" msgid="8159535613020137391">"áƒáƒžáƒ¡ შეეძლებრსისტემის უსáƒáƒ¤áƒ áƒ—ხáƒáƒ”ბის პáƒáƒ áƒáƒ›áƒ”ტრების მáƒáƒœáƒáƒªáƒ”მების შეცვლáƒ. áƒáƒ› შესáƒáƒ«áƒšáƒ”ბლáƒáƒ‘áƒáƒ¡ ჩვეულებრივი áƒáƒžáƒ”ბის áƒáƒ áƒáƒ¡áƒáƒ“ეს იყენებენ."</string>
+ <string name="permlab_writeGservices" msgid="2149426664226152185">"Google სერვისების რუკის შეცვლáƒ"</string>
+ <string name="permdesc_writeGservices" msgid="1287309437638380229">"áƒáƒžáƒ¡ შეეძლებრGoogle სერვისების რუკის შეცვლáƒ. áƒáƒ  გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებრჩვეულებრივ áƒáƒžáƒšáƒ˜áƒ™áƒáƒªáƒ˜áƒ”ბში."</string>
+ <string name="permlab_receiveBootCompleted" msgid="5312965565987800025">"გáƒáƒ¨áƒ•ებრსისტემის ჩáƒáƒ áƒ—ვისáƒáƒ¡"</string>
+ <string name="permdesc_receiveBootCompleted" product="tablet" msgid="7390304664116880704">"áƒáƒžáƒ¡ შეეძლებრსáƒáƒ™áƒ£áƒ—áƒáƒ áƒ˜ თáƒáƒ•ის სისტემის ჩáƒáƒ¢áƒ•ირთვისáƒáƒ¡ ჩáƒáƒ áƒ—ვáƒ. áƒáƒ›áƒáƒœ შეიძლებრგáƒáƒ›áƒáƒ˜áƒ¬áƒ•იáƒáƒ¡ ჩáƒáƒ¢áƒ•ირთვის დრáƒáƒ˜áƒ¡ გáƒáƒ–რდრდრტáƒáƒ‘ლეტის შენელებáƒ, რáƒáƒ“გáƒáƒœ áƒáƒžáƒ˜ ყáƒáƒ•ელთვის ჩáƒáƒ áƒ—ული იქნებáƒ."</string>
+ <string name="permdesc_receiveBootCompleted" product="default" msgid="513950589102617504">"áƒáƒžáƒ¡ შეეძლებრსáƒáƒ™áƒ£áƒ—áƒáƒ áƒ˜ თáƒáƒ•ის ჩáƒáƒ áƒ—ვრსისტემის ჩáƒáƒ¢áƒ•ირთვისთáƒáƒœáƒáƒ•ე. áƒáƒ›áƒáƒœ შეიძლებრგáƒáƒ›áƒáƒ˜áƒ¬áƒ•იáƒáƒ¡ ტელეფáƒáƒœáƒ˜áƒ¡ ჩáƒáƒ¢áƒ•ირთვის დრáƒáƒ˜áƒ¡ გáƒáƒ–რდრდრზáƒáƒ’áƒáƒ“áƒáƒ“ ტელეფáƒáƒœáƒ˜áƒ¡ შენელებáƒ, რáƒáƒ“გáƒáƒœ áƒáƒžáƒ˜ ყáƒáƒ•ელთვის ჩáƒáƒ áƒ—ული იქნებáƒ."</string>
+ <string name="permlab_broadcastSticky" msgid="7919126372606881614">"ისეთი შეტყáƒáƒ‘ინებების გáƒáƒ’ზáƒáƒ•ნáƒ, რáƒáƒ›áƒšáƒ”ბიც áƒáƒ  იშლებáƒ"</string>
+ <string name="permdesc_broadcastSticky" product="tablet" msgid="7749760494399915651">"áƒáƒžáƒ¡ შეეძლებრáƒáƒ áƒáƒ¡áƒáƒ©áƒ¥áƒáƒ áƒ შეტყáƒáƒ‘ინებების გáƒáƒ’ზáƒáƒ•ნáƒ, რáƒáƒ›áƒšáƒ”ბიც რჩებიáƒáƒœ გáƒáƒ’ზáƒáƒ•ნის დáƒáƒ¡áƒ áƒ£áƒšáƒ”ბის შემდეგáƒáƒª. áƒáƒ› გáƒáƒ“áƒáƒ’ზáƒáƒ•ნის ზáƒáƒ›áƒáƒ–ე მეტáƒáƒ“ გáƒáƒ›áƒáƒ§áƒ”ნებáƒáƒ› შეიძლებრშეáƒáƒœáƒ”ლáƒáƒ¡ áƒáƒœ შეáƒáƒ¤áƒ”რხáƒáƒ¡ თქვენი ტáƒáƒ‘ლეტის მუშáƒáƒáƒ‘რზედმეტáƒáƒ“ დიდი მáƒáƒªáƒ£áƒšáƒáƒ‘ის მეხსიერების გáƒáƒ›áƒáƒ§áƒ”ნების შედეგáƒáƒ“."</string>
+ <string name="permdesc_broadcastSticky" product="default" msgid="2825803764232445091">"áƒáƒžáƒ¡ შეეძლებრáƒáƒ áƒáƒ¡áƒáƒ©áƒ¥áƒáƒ áƒ შეტყáƒáƒ‘ინებების გáƒáƒ’ზáƒáƒ•ნáƒ, რáƒáƒ›áƒ”ლიც რჩებიáƒáƒœ გáƒáƒ’ზáƒáƒ•ნის დáƒáƒ¡áƒ áƒ£áƒšáƒ”ბის შემდეგáƒáƒª. მáƒáƒ•ნე áƒáƒžáƒšáƒ˜áƒ™áƒáƒªáƒ˜áƒ”ბს შეუძლიáƒáƒ— თქვენი ტელეფáƒáƒœáƒ˜áƒ¡ მუშáƒáƒáƒ‘ის შენელებრáƒáƒœ შეფერხებრზედმეტáƒáƒ“ დიდი მáƒáƒªáƒ£áƒšáƒáƒ‘ის მეხსიერების გáƒáƒ›áƒáƒ§áƒ”ნების შედეგáƒáƒ“."</string>
+ <string name="permlab_readContacts" msgid="8348481131899886131">"თქვენი კáƒáƒœáƒ¢áƒáƒ¥áƒ¢áƒ”ბის წáƒáƒ™áƒ˜áƒ—ხვáƒ"</string>
+ <string name="permdesc_readContacts" product="tablet" msgid="5294866856941149639">"áƒáƒžáƒ¡ შეეძლებáƒ, წáƒáƒ˜áƒ™áƒ˜áƒ—ხáƒáƒ¡ თქვენ ტáƒáƒ‘ლეტზე შენáƒáƒ®áƒ£áƒšáƒ˜ კáƒáƒœáƒ¢áƒáƒ¥áƒ¢áƒ”ბის მáƒáƒœáƒáƒªáƒ”მები, მáƒáƒ— შáƒáƒ áƒ˜áƒ¡ ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ კáƒáƒœáƒ™áƒ áƒ”ტულ áƒáƒ“áƒáƒ›áƒ˜áƒáƒœáƒ”ბთáƒáƒœ თქვენი დáƒáƒ áƒ”კვის, ელფáƒáƒ¡áƒ¢áƒ˜áƒ¡ გáƒáƒ’ზáƒáƒ•ნის áƒáƒœ კáƒáƒ›áƒ£áƒœáƒ˜áƒ™áƒáƒªáƒ˜áƒ˜áƒ¡ სიხშირის შესáƒáƒ®áƒ”ბ. ეს ნებáƒáƒ áƒ—ვრუფლებáƒáƒ¡ áƒáƒ«áƒšáƒ”ვს áƒáƒžáƒ”ბს, შეინáƒáƒ®áƒáƒœ თქვენი კáƒáƒœáƒ¢áƒáƒ¥áƒ¢áƒ”ბის მáƒáƒœáƒáƒªáƒ”მები დრმáƒáƒ•ნე áƒáƒžáƒ”ბმრშეიძლებრგáƒáƒáƒ–იáƒáƒ áƒáƒœ სáƒáƒ™áƒáƒœáƒ¢áƒáƒ¥áƒ¢áƒ მáƒáƒœáƒáƒªáƒ”მები თქვენგáƒáƒœ დáƒáƒ›áƒáƒ£áƒ™áƒ˜áƒ“ებლáƒáƒ“. "</string>
+ <string name="permdesc_readContacts" product="default" msgid="8440654152457300662">"áƒáƒžáƒ¡ შეეძლებáƒ, წáƒáƒ˜áƒ™áƒ˜áƒ—ხáƒáƒ¡ თქვენ ტელეფáƒáƒœáƒ–ე შენáƒáƒ®áƒ£áƒšáƒ˜ კáƒáƒœáƒ¢áƒáƒ¥áƒ¢áƒ”ბის მáƒáƒœáƒáƒªáƒ”მები, მáƒáƒ— შáƒáƒ áƒ˜áƒ¡ ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ კáƒáƒœáƒ™áƒ áƒ”ტულ áƒáƒ“áƒáƒ›áƒ˜áƒáƒœáƒ”ბთáƒáƒœ თქვენი დáƒáƒ áƒ”კვის, ელფáƒáƒ¡áƒ¢áƒ˜áƒ¡ გáƒáƒ’ზáƒáƒ•ნის áƒáƒœ კáƒáƒ›áƒ£áƒœáƒ˜áƒ™áƒáƒªáƒ˜áƒ˜áƒ¡ სიხშირის შესáƒáƒ®áƒ”ბ. ეს ნებáƒáƒ áƒ—ვრუფლებáƒáƒ¡ áƒáƒ«áƒšáƒ”ვს áƒáƒžáƒ”ბს, შეინáƒáƒ®áƒáƒœ თქვენი კáƒáƒœáƒ¢áƒáƒ¥áƒ¢áƒ”ბის მáƒáƒœáƒáƒªáƒ”მები დრმáƒáƒ•ნე áƒáƒžáƒ”ბმრშეიძლებრგáƒáƒáƒ–იáƒáƒ áƒáƒœ სáƒáƒ™áƒáƒœáƒ¢áƒáƒ¥áƒ¢áƒ მáƒáƒœáƒáƒªáƒ”მები თქვენგáƒáƒœ დáƒáƒ›áƒáƒ£áƒ™áƒ˜áƒ“ებლáƒáƒ“. "</string>
+ <string name="permlab_writeContacts" msgid="5107492086416793544">"თქვენი კáƒáƒœáƒ¢áƒáƒ¥áƒ¢áƒ”ბის შეცვლáƒ"</string>
+ <string name="permdesc_writeContacts" product="tablet" msgid="897243932521953602">"áƒáƒžáƒ¡ შეეძლებáƒ, შეცვáƒáƒšáƒáƒ¡ თქვენ ტáƒáƒ‘ლეტზე შენáƒáƒ®áƒ£áƒšáƒ˜ კáƒáƒœáƒ¢áƒáƒ¥áƒ¢áƒ”ბის მáƒáƒœáƒáƒªáƒ”მები, მáƒáƒ— შáƒáƒ áƒ˜áƒ¡ ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ კáƒáƒœáƒ™áƒ áƒ”ტულ ინდივიდუáƒáƒšáƒ”ბთáƒáƒœ თქვენი დáƒáƒ áƒ”კვის, ელფáƒáƒ¡áƒ¢áƒ˜áƒ¡ გáƒáƒ’ზáƒáƒ•ნის áƒáƒœ კáƒáƒ›áƒ£áƒœáƒ˜áƒ™áƒáƒªáƒ˜áƒ˜áƒ¡ სიხშირის შესáƒáƒ®áƒ”ბ. ეს ნებáƒáƒ áƒ—ვრუფლებáƒáƒ¡ áƒáƒ«áƒšáƒ”ვს áƒáƒžáƒ”ბს, წáƒáƒ¨áƒáƒšáƒáƒ¡ სáƒáƒ™áƒáƒœáƒ¢áƒáƒ¥áƒ¢áƒ მáƒáƒœáƒáƒªáƒ”მები. "</string>
+ <string name="permdesc_writeContacts" product="default" msgid="589869224625163558">"áƒáƒžáƒ¡ შეეძლებáƒ, შეცვáƒáƒšáƒáƒ¡ თქვენ ტელეფáƒáƒœáƒ–ე შენáƒáƒ®áƒ£áƒšáƒ˜ კáƒáƒœáƒ¢áƒáƒ¥áƒ¢áƒ”ბის მáƒáƒœáƒáƒªáƒ”მები, მáƒáƒ— შáƒáƒ áƒ˜áƒ¡ ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ კáƒáƒœáƒ™áƒ áƒ”ტულ ინდივიდუáƒáƒšáƒ”ბთáƒáƒœ თქვენი დáƒáƒ áƒ”კვის, ელფáƒáƒ¡áƒ¢áƒ˜áƒ¡ გáƒáƒ’ზáƒáƒ•ნის áƒáƒœ კáƒáƒ›áƒ£áƒœáƒ˜áƒ™áƒáƒªáƒ˜áƒ˜áƒ¡ სიხშირის შესáƒáƒ®áƒ”ბ. ეს ნებáƒáƒ áƒ—ვრუფლებáƒáƒ¡ áƒáƒ«áƒšáƒ”ვს áƒáƒžáƒ”ბს, წáƒáƒ¨áƒáƒšáƒáƒ¡ სáƒáƒ™áƒáƒœáƒ¢áƒáƒ¥áƒ¢áƒ მáƒáƒœáƒáƒªáƒ”მები. "</string>
+ <string name="permlab_readCallLog" msgid="3478133184624102739">"ზáƒáƒ áƒ”ბის ჟურნáƒáƒšáƒ˜áƒ¡ წáƒáƒ™áƒ˜áƒ—ხვáƒ"</string>
+ <string name="permdesc_readCallLog" product="tablet" msgid="3700645184870760285">"áƒáƒžáƒ¡ შეეძლებრთქვენი ტáƒáƒ‘ლეტის გáƒáƒ›áƒáƒ•áƒáƒšáƒ˜ დრშემáƒáƒ›áƒáƒ•áƒáƒšáƒ˜ ზáƒáƒ áƒ”ბის ჟურნáƒáƒšáƒ˜áƒ¡ ნáƒáƒ®áƒ•áƒ, áƒáƒ¡áƒ”ვე ექნებრáƒáƒ› ჟურნáƒáƒšáƒ˜áƒ¡ შენáƒáƒ®áƒ•ის უფლებáƒ. ეს მáƒáƒ•ნე áƒáƒžáƒšáƒ˜áƒ™áƒáƒªáƒ˜áƒ”ბს სáƒáƒ¨áƒ£áƒáƒšáƒ”ბáƒáƒ¡ მისცემს ნებáƒáƒ áƒ—ვის გáƒáƒ áƒ”შე გáƒáƒáƒ–იáƒáƒ áƒáƒœ თქვენი ზáƒáƒ áƒ”ბის ჟურნáƒáƒšáƒ˜."</string>
+ <string name="permdesc_readCallLog" product="default" msgid="5777725796813217244">"áƒáƒžáƒ¡ შეეძლებრთქვენი ტელეფáƒáƒœáƒ˜áƒ¡ გáƒáƒ›áƒáƒ•áƒáƒšáƒ˜ დრშემáƒáƒ›áƒáƒ•áƒáƒšáƒ˜ ზáƒáƒ áƒ”ბის ჟურნáƒáƒšáƒ˜áƒ¡ ნáƒáƒ®áƒ•áƒ, áƒáƒ¡áƒ”ვე ექნებრáƒáƒ› ჟურნáƒáƒšáƒ˜áƒ¡ შენáƒáƒ®áƒ•ის უფლებáƒ. ეს მáƒáƒ•ნე áƒáƒžáƒšáƒ˜áƒ™áƒáƒªáƒ˜áƒ”ბს სáƒáƒ¨áƒ£áƒáƒšáƒ”ბáƒáƒ¡ მისცემს ნებáƒáƒ áƒ—ვის გáƒáƒ áƒ”შე გáƒáƒáƒ–იáƒáƒ áƒáƒœ თქვენი ზáƒáƒ áƒ”ბის ჟურნáƒáƒšáƒ˜."</string>
+ <string name="permlab_writeCallLog" msgid="8552045664743499354">"ზáƒáƒ áƒ”ბის ჟურნáƒáƒšáƒ¨áƒ˜ ჩáƒáƒ¬áƒ”რáƒ"</string>
+ <string name="permdesc_writeCallLog" product="tablet" msgid="6661806062274119245">"áƒáƒžáƒ¡ შეეძლებáƒ, შეცვáƒáƒšáƒáƒ¡ თქვენი ტáƒáƒ‘ლეტის ზáƒáƒ áƒ”ბის ჟურნáƒáƒšáƒ˜, მáƒáƒ— შáƒáƒ áƒ˜áƒ¡ შემáƒáƒ›áƒáƒ•áƒáƒšáƒ˜ დრგáƒáƒ›áƒáƒ•áƒáƒšáƒ˜ ზáƒáƒ áƒ”ბის მáƒáƒœáƒáƒªáƒ”მები. მáƒáƒ•ნე áƒáƒžáƒ”ბმრშეიძლებრგáƒáƒ›áƒáƒ˜áƒ§áƒ”ნáƒáƒœ ეს თქვენი ზáƒáƒ áƒ”ბის ჟურნáƒáƒšáƒ˜áƒ¡ წáƒáƒ¡áƒáƒ¨áƒšáƒ”ლáƒáƒ“ áƒáƒœ შესáƒáƒªáƒ•ლელáƒáƒ“."</string>
+ <string name="permdesc_writeCallLog" product="default" msgid="683941736352787842">"áƒáƒžáƒ¡ შეეძლებáƒ, შეცვáƒáƒšáƒáƒ¡ თქვენი ტელეფáƒáƒœáƒ˜áƒ¡ ზáƒáƒ áƒ”ბის ჟურნáƒáƒšáƒ˜, მáƒáƒ— შáƒáƒ áƒ˜áƒ¡ შემáƒáƒ›áƒáƒ•áƒáƒšáƒ˜ დრგáƒáƒ›áƒáƒ•áƒáƒšáƒ˜ ზáƒáƒ áƒ”ბის მáƒáƒœáƒáƒªáƒ”მები. მáƒáƒ•ნე áƒáƒžáƒ”ბმრშეიძლებრგáƒáƒ›áƒáƒ˜áƒ§áƒ”ნáƒáƒœ ეს თქვენი ზáƒáƒ áƒ”ბის ჟურნáƒáƒšáƒ˜áƒ¡ წáƒáƒ¡áƒáƒ¨áƒšáƒ”ლáƒáƒ“ áƒáƒœ შესáƒáƒªáƒ•ლელáƒáƒ“."</string>
+ <string name="permlab_readProfile" msgid="4701889852612716678">"თქვენი სáƒáƒ™áƒáƒœáƒ¢áƒáƒ¥áƒ¢áƒ ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ ნáƒáƒ®áƒ•áƒ"</string>
+ <string name="permdesc_readProfile" product="default" msgid="5462475151849888848">"áƒáƒžáƒ¡ შეეძლებრმáƒáƒ¬áƒ§áƒáƒ‘ილáƒáƒ‘áƒáƒ–ე შენáƒáƒ®áƒ£áƒšáƒ˜ პირáƒáƒ“ი პრáƒáƒ¤áƒ˜áƒšáƒ˜áƒ¡ ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ წáƒáƒ™áƒ˜áƒ—ხვáƒ, მáƒáƒ’áƒáƒšáƒ˜áƒ—áƒáƒ“, თქვენი სáƒáƒ®áƒ”ლისრდრსáƒáƒ™áƒáƒœáƒ¢áƒáƒ¥áƒ¢áƒ ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡. ეს ნიშნáƒáƒ•ს, რáƒáƒ› áƒáƒžáƒ¡ შეუძლირთქვენი იდენტიფიცირებრდრთქვენი პირáƒáƒ“ი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ სხვებისთვის გáƒáƒ’ზáƒáƒ•ნáƒ."</string>
+ <string name="permlab_writeProfile" msgid="907793628777397643">"თქვენი სáƒáƒ™áƒáƒœáƒ¢áƒáƒ¥áƒ¢áƒ ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ შეცვლáƒ"</string>
+ <string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"áƒáƒžáƒ¡ შეეძლებრმáƒáƒ¬áƒ§áƒáƒ‘ილáƒáƒ‘áƒáƒ–ე შენáƒáƒ®áƒ£áƒšáƒ˜ პირáƒáƒ“ი პრáƒáƒ¤áƒ˜áƒšáƒ˜áƒ¡ ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ შეცვლრáƒáƒœ დáƒáƒ›áƒáƒ¢áƒ”ბáƒ, მáƒáƒ’áƒáƒšáƒ˜áƒ—áƒáƒ“, თქვენი სáƒáƒ®áƒ”ლისრდრსáƒáƒ™áƒáƒœáƒ¢áƒáƒ¥áƒ¢áƒ ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡. ეს ნიშნáƒáƒ•ს, რáƒáƒ› áƒáƒžáƒ¡ შეუძლირთქვენი იდენტიფიცირებრდრთქვენი პირáƒáƒ“ი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ სხვებისთვის გáƒáƒ’ზáƒáƒ•ნáƒ."</string>
+ <string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"სáƒáƒªáƒ˜áƒáƒšáƒ£áƒ áƒ˜ ნáƒáƒ™áƒáƒ“ის წáƒáƒ™áƒ˜áƒ—ხვáƒ"</string>
+ <string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"áƒáƒžáƒ¡ შეეძლებრთქვენი დრთქვენი მეგáƒáƒ‘რების სáƒáƒªáƒ˜áƒáƒšáƒ£áƒ áƒ˜ გáƒáƒœáƒáƒ®áƒšáƒ”ბებთáƒáƒœ წვდáƒáƒ›áƒ დრსინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ. ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ–იáƒáƒ áƒ”ბისáƒáƒ¡ იყáƒáƒ•ით ფრთხიáƒáƒ“ - áƒáƒžáƒ¡ ექნებრშესáƒáƒ«áƒšáƒ”ბლáƒáƒ‘áƒ, რáƒáƒ› წáƒáƒ˜áƒ™áƒ˜áƒ—ხáƒáƒ¡ სáƒáƒªáƒ˜áƒáƒšáƒ£áƒ  ქსელებში კáƒáƒ›áƒ£áƒœáƒ˜áƒ™áƒáƒªáƒ˜áƒ თქვენსრდრთქვენს მეგáƒáƒ‘რებს შáƒáƒ áƒ˜áƒ¡ კáƒáƒœáƒ¤áƒ˜áƒ“ენციáƒáƒšáƒ£áƒ áƒáƒ‘ის მიუხედáƒáƒ•áƒáƒ“. შენიშვნáƒ: ეს უფლებრშესáƒáƒ«áƒšáƒáƒ ვერ იყáƒáƒ¡ გáƒáƒ›áƒáƒ§áƒ”ნებული ყველრსáƒáƒªáƒ˜áƒáƒšáƒ£áƒ  ქსელში."</string>
+ <string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"თქვენს სáƒáƒªáƒ˜áƒáƒšáƒ£áƒ  მáƒáƒ£áƒ¬áƒ§áƒ”ბლáƒáƒ‘áƒáƒ–ე დáƒáƒ¬áƒ”რáƒ"</string>
+ <string name="permdesc_writeSocialStream" product="default" msgid="3086557552204114849">"áƒáƒžáƒ¡ შეეძლებáƒ, გიჩვენáƒáƒ— თქვენი მეგáƒáƒ‘რების სáƒáƒªáƒ˜áƒáƒšáƒ£áƒ áƒ˜ სიáƒáƒ®áƒšáƒ”ები. ფრთხილáƒáƒ“ იყáƒáƒ•ით ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ–იáƒáƒ áƒ”ბისáƒáƒ¡ - áƒáƒžáƒ¡ შეუძლირშექმნáƒáƒ¡ შეტყáƒáƒ‘ინებáƒ, რáƒáƒ›áƒ”ლიც თითქáƒáƒ¡áƒ“რმეგáƒáƒ‘რისგáƒáƒœ áƒáƒ áƒ˜áƒ¡ მáƒáƒ¬áƒ”რილი. შენიშვნáƒ: ეს ნებáƒáƒ áƒ—ვრáƒáƒ  შეიძლებრშესრულდეს ყველრსáƒáƒªáƒ˜áƒáƒšáƒ£áƒ  ქსელში."</string>
+ <string name="permlab_readCalendar" msgid="5972727560257612398">"კáƒáƒšáƒ”ნდრის ღáƒáƒœáƒ˜áƒ¡áƒ«áƒ˜áƒ”ბებისრდრკáƒáƒœáƒ¤áƒ˜áƒ“ენციáƒáƒšáƒ£áƒ áƒ˜ ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ წáƒáƒ™áƒ˜áƒ—ხვáƒ"</string>
+ <string name="permdesc_readCalendar" product="tablet" msgid="4216462049057658723">"áƒáƒžáƒ¡ შეეძლებáƒ, წáƒáƒ˜áƒ™áƒ˜áƒ—ხáƒáƒ¡ თქვენ ტáƒáƒ‘ლეტზე შენáƒáƒ®áƒ£áƒšáƒ˜ კáƒáƒšáƒ”ნდრის ყველრმáƒáƒ•ლენáƒ, მáƒáƒ— შáƒáƒ áƒ˜áƒ¡ მეგáƒáƒ‘რებისრდრთáƒáƒœáƒáƒ›áƒ¨áƒ áƒáƒ›áƒšáƒ”ბის მáƒáƒ•ლენებიც. áƒáƒ›áƒáƒœ შეიძლებრუფლებრმისცეს áƒáƒžáƒ¡, გáƒáƒáƒ–იáƒáƒ áƒáƒ¡ áƒáƒœ შეინáƒáƒ®áƒáƒ¡ თქვენი კáƒáƒšáƒ”ნდრის მáƒáƒœáƒáƒªáƒ”მები, მიუხედáƒáƒ•áƒáƒ“ კáƒáƒœáƒ¤áƒ˜áƒ“ენციáƒáƒšáƒ£áƒ áƒáƒ‘ისრთუ მგრძáƒáƒ‘იáƒáƒ áƒáƒ‘ისáƒ."</string>
+ <string name="permdesc_readCalendar" product="default" msgid="7434548682470851583">"áƒáƒžáƒ¡ შეეძლებáƒ, წáƒáƒ˜áƒ™áƒ˜áƒ—ხáƒáƒ¡ თქვენს ტელეფáƒáƒœáƒ–ე შენáƒáƒ®áƒ£áƒšáƒ˜ კáƒáƒšáƒ”ნდრის ყველრმáƒáƒ•ლენáƒ, მáƒáƒ— შáƒáƒ áƒ˜áƒ¡ მეგáƒáƒ‘რებისრდრთáƒáƒœáƒáƒ›áƒ¨áƒ áƒáƒ›áƒšáƒ”ბის მáƒáƒ•ლენებიც. áƒáƒ›áƒáƒœ შეიძლებრუფლებრმისცეს áƒáƒžáƒ¡, გáƒáƒáƒ–იáƒáƒ áƒáƒ¡ áƒáƒœ შეინáƒáƒ®áƒáƒ¡ თქვენი კáƒáƒšáƒ”ნდრის მáƒáƒœáƒáƒªáƒ”მები, მიუხედáƒáƒ•áƒáƒ“ კáƒáƒœáƒ¤áƒ˜áƒ“ენციáƒáƒšáƒ£áƒ áƒáƒ‘ისრთუ მგრძáƒáƒ‘იáƒáƒ áƒáƒ‘ისáƒ."</string>
+ <string name="permlab_writeCalendar" msgid="8438874755193825647">"კáƒáƒšáƒ”ნდრის ღáƒáƒœáƒ˜áƒ¡áƒ«áƒ˜áƒ”ბების დáƒáƒ›áƒáƒ¢áƒ”ბრდრშეცვლრდრმფლáƒáƒ‘ელის გáƒáƒ áƒ”შე ელფáƒáƒ¡áƒ¢áƒ˜áƒ¡ გáƒáƒ’ზáƒáƒ•ნრსტუმრებთáƒáƒœ."</string>
+ <string name="permdesc_writeCalendar" product="tablet" msgid="6679035520113668528">"áƒáƒžáƒ¡ შეეძლებრიმ ღáƒáƒœáƒ˜áƒ¡áƒ«áƒ˜áƒ”ბების დáƒáƒ›áƒáƒ¢áƒ”ბáƒ, წáƒáƒ¨áƒšáƒ დრშეცვლáƒ, რáƒáƒ›áƒšáƒ”ბსáƒáƒª თქვენს ტáƒáƒ‘ლეტზე ქმნით, áƒáƒ¡áƒ”ვე თქვენი მეგáƒáƒ‘რების დრთáƒáƒœáƒáƒ›áƒ¨áƒ áƒáƒ›áƒšáƒ”ბის ღáƒáƒœáƒ˜áƒ¡áƒ«áƒ˜áƒ”ბებიც. áƒáƒ›áƒ’ვáƒáƒ áƒáƒ“, áƒáƒžáƒ¡ ექნებრშესáƒáƒ«áƒšáƒ”ბლáƒáƒ‘რისე დáƒáƒáƒ’ზáƒáƒ•ნáƒáƒ¡ შეტყáƒáƒ‘ინებები კáƒáƒšáƒ”ნდრის მფლáƒáƒ‘ელის სáƒáƒ®áƒ”ლით áƒáƒœ შეცვáƒáƒšáƒáƒ¡ ღáƒáƒœáƒ˜áƒ¡áƒ«áƒ˜áƒ”ბები, რáƒáƒ› მფლáƒáƒ‘ელმრáƒáƒ›áƒ˜áƒ¡ შესáƒáƒ®áƒ”ბ áƒáƒ áƒáƒ¤áƒ”რი იცáƒáƒ“ეს."</string>
+ <string name="permdesc_writeCalendar" product="default" msgid="2324469496327249376">"áƒáƒžáƒ¡ შეეძლებრიმ ღáƒáƒœáƒ˜áƒ¡áƒ«áƒ˜áƒ”ბების დáƒáƒ›áƒáƒ¢áƒ”ბáƒ, წáƒáƒ¨áƒšáƒ დრშეცვლáƒ, რáƒáƒ›áƒšáƒ”ბსáƒáƒª თქვენს ტელეფáƒáƒœáƒ–ე ქმნით, áƒáƒ¡áƒ”ვე თქვენი მეგáƒáƒ‘რების დრთáƒáƒœáƒáƒ›áƒ¨áƒ áƒáƒ›áƒšáƒ”ბის ღáƒáƒœáƒ˜áƒ¡áƒ«áƒ˜áƒ”ბებიც. áƒáƒ›áƒ’ვáƒáƒ áƒáƒ“, áƒáƒžáƒ¡ ექნებრშესáƒáƒ«áƒšáƒ”ბლáƒáƒ‘რისე დáƒáƒáƒ’ზáƒáƒ•ნáƒáƒ¡ შეტყáƒáƒ‘ინებები კáƒáƒšáƒ”ნდრის მფლáƒáƒ‘ელის სáƒáƒ®áƒ”ლით áƒáƒœ შეცვáƒáƒšáƒáƒ¡ ღáƒáƒœáƒ˜áƒ¡áƒ«áƒ˜áƒ”ბები, რáƒáƒ› მფლáƒáƒ‘ელმრáƒáƒ›áƒ˜áƒ¡ შესáƒáƒ®áƒ”ბ áƒáƒ áƒáƒ¤áƒ”რი იცáƒáƒ“ეს."</string>
+ <string name="permlab_accessMockLocation" msgid="8688334974036823330">"მდებáƒáƒ áƒ”áƒáƒ‘ის წყáƒáƒ áƒáƒ”ბის იმიტირებრტესტირებისთვის"</string>
+ <string name="permdesc_accessMockLocation" msgid="5808711039482051824">"áƒáƒžáƒ¡ შეეძლებრტესტირებისთვის ყáƒáƒšáƒ‘ი ლáƒáƒ™áƒáƒªáƒ˜áƒ”ბის შექმნáƒ, áƒáƒœ მდებáƒáƒ áƒ”áƒáƒ‘ის áƒáƒ®áƒáƒšáƒ˜ პრáƒáƒ•áƒáƒ˜áƒ“ერის დáƒáƒ§áƒ”ნებáƒ. ეს უფლებáƒáƒ¡ მისცემს áƒáƒžáƒ¡, შეცვáƒáƒšáƒáƒ¡ მდებáƒáƒ áƒ”áƒáƒ‘ის სხვრწყáƒáƒ áƒáƒ”ბის მიერ, მáƒáƒ’. GPS áƒáƒœ მდებáƒáƒ áƒ”áƒáƒ‘ის პრáƒáƒ•áƒáƒ˜áƒ“ერების მიერ მáƒáƒ¬áƒáƒ“ებული მდებáƒáƒ áƒ”áƒáƒ‘რდáƒ/ áƒáƒœ სტáƒáƒ¢áƒ£áƒ¡áƒ˜."</string>
+ <string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"მდებáƒáƒ áƒ”áƒáƒ‘ის პრáƒáƒ•áƒáƒ˜áƒ“ერის დáƒáƒ›áƒáƒ¢áƒ”ბით ბრძáƒáƒœáƒ”ბებზე წვდáƒáƒ›áƒ"</string>
+ <string name="permdesc_accessLocationExtraCommands" msgid="5945166642335800763">"áƒáƒžáƒ¡ შეეძლებრწვდáƒáƒ›áƒ ჰქáƒáƒœáƒ“ეს მდებáƒáƒ áƒ”áƒáƒ‘ის სერვისის დáƒáƒ›áƒáƒ¢áƒ”ბით ბრძáƒáƒœáƒ”ბებზე. შესáƒáƒ«áƒšáƒáƒ áƒáƒžáƒ›áƒ ეს გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნáƒáƒ¡ GPS-ისრდრმდებáƒáƒ áƒ”áƒáƒ‘ის სხვრწყáƒáƒ áƒáƒ”ბის მუშáƒáƒáƒ‘ის პრáƒáƒªáƒ”სში ჩáƒáƒ áƒ”ვისთვის."</string>
+ <string name="permlab_installLocationProvider" msgid="6578101199825193873">"მდებáƒáƒ áƒ”áƒáƒ‘ის პრáƒáƒ•áƒáƒ˜áƒ“ერის ინსტáƒáƒšáƒáƒªáƒ˜áƒ˜áƒ¡ უფლებáƒ"</string>
+ <string name="permdesc_installLocationProvider" msgid="9066146120470591509">"áƒáƒžáƒ¡ შეეძლებრტესტირებისთვის ყáƒáƒšáƒ‘ი ლáƒáƒ™áƒáƒªáƒ˜áƒ”ბის შექმნáƒ, áƒáƒœ მდებáƒáƒ áƒ”áƒáƒ‘ის áƒáƒ®áƒáƒšáƒ˜ პრáƒáƒ•áƒáƒ˜áƒ“ერის დáƒáƒ§áƒ”ნებáƒ. áƒáƒžáƒ¡ სáƒáƒ¨áƒ£áƒáƒšáƒ”ბრმიეცემრგáƒáƒ“áƒáƒáƒ™áƒ”თáƒáƒ¡ სხვრწყáƒáƒ áƒáƒ”ბის მáƒáƒ’.: GPS áƒáƒœ მდებáƒáƒ áƒ”áƒáƒ‘ის პრáƒáƒ•áƒáƒ˜áƒ“ერების მáƒáƒ¬áƒáƒ“ებული მდებáƒáƒ áƒ”áƒáƒ‘რáƒáƒœ/დრსტáƒáƒ¢áƒ£áƒ¡áƒ˜."</string>
+ <string name="permlab_accessFineLocation" msgid="1191898061965273372">"ზუსტი მდებáƒáƒ áƒ”áƒáƒ‘რ(GPS დრქსელის კáƒáƒáƒ áƒ“ინáƒáƒ¢áƒ”ბის მიხედვით)"</string>
+ <string name="permdesc_accessFineLocation" msgid="5295047563564981250">"áƒáƒ«áƒšáƒ”ვს áƒáƒžáƒ¡ უფლებáƒáƒ¡ მáƒáƒ˜áƒžáƒáƒ•áƒáƒ¡ ზუსტი მდებáƒáƒ áƒ”áƒáƒ‘რგლáƒáƒ‘áƒáƒšáƒ£áƒ áƒ˜ პáƒáƒ–იციáƒáƒœáƒ˜áƒ áƒ”ბის სისტემის (GPS) გáƒáƒ›áƒáƒ§áƒ”ნებით áƒáƒœ ქსელის მდებáƒáƒ áƒ”áƒáƒ‘ის წყáƒáƒ áƒáƒ¡ მიხედვით, რáƒáƒ’áƒáƒ áƒ˜áƒªáƒáƒ ქსელის áƒáƒœáƒ«áƒ”ბი დრWi-Fi. მდებáƒáƒ áƒ”áƒáƒ‘ის ეს სერვისები ჩáƒáƒ áƒ—ული უნდრიყáƒáƒ¡ დრთქვენს მáƒáƒ¬áƒ§áƒáƒ‘ილáƒáƒ‘áƒáƒ–ე áƒáƒžáƒ˜áƒ¡áƒ—ვის მისáƒáƒ¬áƒ•დáƒáƒ›áƒ˜, რáƒáƒ—რშეძლáƒáƒ¡ მáƒáƒ—ი გáƒáƒ›áƒáƒ§áƒ”ნებáƒ. áƒáƒžáƒ”ბში შესáƒáƒ«áƒšáƒ”ბელირმáƒáƒ—ი გáƒáƒ›áƒáƒ§áƒ”ნებრთქვენი მდებáƒáƒ áƒ”áƒáƒ‘ის გáƒáƒœáƒ¡áƒáƒ¡áƒáƒ–ღვრáƒáƒ“ დრáƒáƒ›áƒáƒœ ელემენტის დáƒáƒ›áƒáƒ¢áƒ”ბითი ხáƒáƒ áƒ¯áƒ•რშეიძლებრგáƒáƒ›áƒáƒ˜áƒ¬áƒ•იáƒáƒ¡."</string>
+ <string name="permlab_accessCoarseLocation" msgid="4887895362354239628">"სáƒáƒ•áƒáƒ áƒáƒ£áƒ“რ(ქსელის კáƒáƒáƒ áƒ“ინáƒáƒ¢áƒ”ბის მიხედვით) მდებáƒáƒ áƒ”áƒáƒ‘áƒ"</string>
+ <string name="permdesc_accessCoarseLocation" msgid="2538200184373302295">"áƒáƒžáƒ¡ შეეძლებრგáƒáƒ˜áƒ’áƒáƒ¡ თქვენი სáƒáƒ•áƒáƒ áƒáƒ£áƒ“რმდებáƒáƒ áƒ”áƒáƒ‘áƒ. ის გáƒáƒ›áƒáƒ˜áƒ—ვლებრმდებáƒáƒ áƒ”áƒáƒ‘ის სერვისის მიერ ქსელის მáƒáƒœáƒáƒªáƒ”მების - მáƒáƒ‘ილური კáƒáƒ•შირგáƒáƒ‘მულáƒáƒ‘ის áƒáƒœáƒ«áƒ”ბისრდრWi-Fi-ის მიხედვით. ეს სერვისები ჩáƒáƒ áƒ—ული უნდრიყáƒáƒ¡ თქვენს მáƒáƒ¬áƒ§áƒáƒ‘ილáƒáƒ‘áƒáƒ–ე, ხáƒáƒšáƒ áƒáƒžáƒ”ბს უნდრჰქáƒáƒœáƒ“ეთ მáƒáƒ—ი გáƒáƒ›áƒáƒ§áƒ”ნების უფლებáƒ. áƒáƒžáƒ”ბი მáƒáƒ—ი მáƒáƒœáƒáƒªáƒ”მების მიხედვით სáƒáƒ•áƒáƒ áƒáƒ£áƒ“რმდებáƒáƒ áƒ”áƒáƒ‘ის გáƒáƒ›áƒáƒ—ვლáƒáƒ¡ შეძლებენ."</string>
+ <string name="permlab_accessSurfaceFlinger" msgid="2363969641792388947">"SurfaceFlinger-ზე წვდáƒáƒ›áƒ"</string>
+ <string name="permdesc_accessSurfaceFlinger" msgid="1041619516733293551">"áƒáƒžáƒ¡ შეეძლებáƒ, გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნáƒáƒ¡ SurfaceFlinger-ის დáƒáƒ‘áƒáƒšáƒ˜ დáƒáƒœáƒ˜áƒ¡ ელემენტები."</string>
+ <string name="permlab_readFrameBuffer" msgid="6690504248178498136">"ჩáƒáƒ áƒ©áƒáƒ¡ ბუფერის წáƒáƒ™áƒ˜áƒ—ხვáƒ"</string>
+ <string name="permdesc_readFrameBuffer" msgid="4937405521809454680">"áƒáƒžáƒ¡ შეეძლებრწáƒáƒ˜áƒ™áƒ˜áƒ—ხáƒáƒ¡ ბუფერული ჩáƒáƒ áƒ©áƒáƒ¡ კáƒáƒœáƒ¢áƒ”ნტი."</string>
+ <string name="permlab_accessInputFlinger" msgid="5348635270689553857">"InputFlinger-ზე წვდáƒáƒ›áƒ"</string>
+ <string name="permdesc_accessInputFlinger" msgid="2104864941201226616">"áƒáƒžáƒ¡ შეეძლებáƒ, გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნáƒáƒ¡ InputFlinger-ის დáƒáƒ‘áƒáƒšáƒ˜ დáƒáƒœáƒ˜áƒ¡ ფუნქციები."</string>
+ <string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"Wifi ეკრáƒáƒœáƒ˜áƒ¡ კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ"</string>
+ <string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"áƒáƒžáƒ¡ შეეძლებრWifi ეკრáƒáƒœáƒ”ბთáƒáƒœ დáƒáƒ™áƒáƒ•შირებრდრდáƒáƒ™áƒáƒœáƒ¤áƒ˜áƒ’ურირებáƒ."</string>
+ <string name="permlab_controlWifiDisplay" msgid="393641276723695496">"Wifi ეკრáƒáƒœáƒ”ბის მáƒáƒ áƒ—ვáƒ"</string>
+ <string name="permdesc_controlWifiDisplay" msgid="4543912292681826986">"áƒáƒžáƒ¡ შეეძლებრáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒáƒ¡ Wifi ეკრáƒáƒœáƒ”ბის დáƒáƒ‘áƒáƒšáƒ˜ დáƒáƒœáƒ˜áƒ¡ ფუნქციები."</string>
+ <string name="permlab_captureAudioOutput" msgid="6857134498402346708">"გáƒáƒ›áƒáƒ›áƒáƒ•áƒáƒšáƒ˜ áƒáƒ£áƒ“იáƒáƒ¡ დáƒáƒ­áƒ”რáƒ"</string>
+ <string name="permdesc_captureAudioOutput" msgid="6210597754212208853">"სáƒáƒ¨áƒ£áƒáƒšáƒ”ბáƒáƒ¡ áƒáƒ«áƒšáƒ”ვს áƒáƒžáƒ¡ დáƒáƒ˜áƒ­áƒ˜áƒ áƒáƒ¡ დრგáƒáƒ“áƒáƒáƒ›áƒ˜áƒ¡áƒáƒ›áƒáƒ áƒ—áƒáƒ¡ გáƒáƒ›áƒáƒ›áƒáƒ•áƒáƒšáƒ˜ áƒáƒ£áƒ“იáƒ."</string>
+ <string name="permlab_captureVideoOutput" msgid="2246828773589094023">"გáƒáƒ›áƒáƒ›áƒáƒ•áƒáƒšáƒ˜ ვიდეáƒáƒ¡ დáƒáƒ­áƒ”რáƒ"</string>
+ <string name="permdesc_captureVideoOutput" msgid="359481658034149860">"სáƒáƒ¨áƒ£áƒáƒšáƒ”ბáƒáƒ¡ áƒáƒ«áƒšáƒ”ვს áƒáƒžáƒ¡ დáƒáƒ˜áƒ­áƒ˜áƒ áƒáƒ¡ დრგáƒáƒ“áƒáƒáƒ›áƒ˜áƒ¡áƒáƒ›áƒáƒ áƒ—áƒáƒ¡ გáƒáƒ›áƒáƒ›áƒáƒ•áƒáƒšáƒ˜ ვიდეáƒ."</string>
+ <string name="permlab_captureSecureVideoOutput" msgid="7815398969303382016">"გáƒáƒ›áƒáƒ›áƒáƒ•áƒáƒšáƒ˜ დáƒáƒªáƒ£áƒšáƒ˜ ვიდეáƒáƒ¡ დáƒáƒ­áƒ”რáƒ"</string>
+ <string name="permdesc_captureSecureVideoOutput" msgid="2779793064709350289">"სáƒáƒ¨áƒ£áƒáƒšáƒ”ბáƒáƒ¡ áƒáƒ«áƒšáƒ”ვს áƒáƒžáƒ¡ დáƒáƒ˜áƒ­áƒ˜áƒ áƒáƒ¡ დრგáƒáƒ“áƒáƒáƒ›áƒ˜áƒ¡áƒáƒ›áƒáƒ áƒ—áƒáƒ¡ გáƒáƒ›áƒáƒ›áƒáƒ•áƒáƒšáƒ˜ დáƒáƒªáƒ£áƒšáƒ˜ ვიდეáƒ."</string>
+ <string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"თქვენი áƒáƒ£áƒ“ირპáƒáƒ áƒáƒ›áƒ”ტრების შეცვლáƒ"</string>
+ <string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"áƒáƒžáƒ¡ შეეძლებრáƒáƒ£áƒ“იáƒáƒ¡ გლáƒáƒ‘áƒáƒšáƒ£áƒ áƒ˜ პáƒáƒ áƒáƒ›áƒ”ტრების შეცვლáƒ. მáƒáƒ’.: ხმის სიმáƒáƒ¦áƒšáƒ” დრრáƒáƒ›áƒ”ლი დინáƒáƒ›áƒ˜áƒ™áƒ˜ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებრსიგნáƒáƒšáƒ˜áƒ¡ გáƒáƒ›áƒáƒ¡áƒ¢áƒáƒœáƒáƒ“."</string>
+ <string name="permlab_recordAudio" msgid="3876049771427466323">"áƒáƒ£áƒ“იáƒáƒ¡ ჩáƒáƒ¬áƒ”რáƒ"</string>
+ <string name="permdesc_recordAudio" msgid="4906839301087980680">"áƒáƒžáƒ¡ შეეძლებრáƒáƒ£áƒ“ირჩáƒáƒ¬áƒ”რრმიკრáƒáƒ¤áƒáƒœáƒ˜áƒ—. ნებáƒáƒ áƒ—ვრáƒáƒžáƒ¡ áƒáƒ£áƒ“ირჩáƒáƒ¬áƒ”რის უფლებáƒáƒ¡ áƒáƒ«áƒšáƒ”ვს ნებისმიერ დრáƒáƒ¡, თქვენი თáƒáƒœáƒ®áƒ›áƒáƒ‘ის გáƒáƒ áƒ”შე."</string>
+ <string name="permlab_camera" msgid="3616391919559751192">"სურáƒáƒ—ებისრდრვიდეáƒáƒ”ბის გáƒáƒ“áƒáƒ¦áƒ”ბáƒ"</string>
+ <string name="permdesc_camera" msgid="8497216524735535009">"áƒáƒžáƒ¡ შეეძლებრკáƒáƒ›áƒ”რით სურáƒáƒ—ისრდრვიდეáƒáƒ¡ გáƒáƒ“áƒáƒ¦áƒ”ბáƒ. ეს ნებáƒáƒ áƒ—ვრáƒáƒžáƒ¡ უფლებáƒáƒ¡ áƒáƒ«áƒšáƒ”ვს, ნებისმიერ დრáƒáƒ¡ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნáƒáƒ¡ კáƒáƒ›áƒ”რრთქვენი დáƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ”ბის გáƒáƒ áƒ”შე."</string>
+ <string name="permlab_cameraDisableTransmitLed" msgid="2651072630501126222">"კáƒáƒ›áƒ”რის გáƒáƒ›áƒáƒ§áƒ”ნებისáƒáƒ¡ გáƒáƒ“áƒáƒ›áƒªáƒ”მი ინდიკáƒáƒ¢áƒáƒ áƒ˜áƒ¡ LED გáƒáƒ—იშვáƒ"</string>
+ <string name="permdesc_cameraDisableTransmitLed" msgid="4764585465480295341">"ნებáƒáƒ¡ რთáƒáƒ•ს წინáƒáƒ¡áƒ¬áƒáƒ  დáƒáƒ§áƒ”ნებული სისტემის áƒáƒžáƒšáƒ˜áƒ™áƒáƒªáƒ˜áƒáƒ¡, გáƒáƒ›áƒáƒ áƒ—áƒáƒ¡ კáƒáƒ›áƒ”რის გáƒáƒ›áƒáƒ§áƒ”ნების ინდიკáƒáƒ¢áƒáƒ áƒ˜ LED."</string>
+ <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"მუდმივáƒáƒ“ გáƒáƒ›áƒáƒ áƒ—ული ტáƒáƒ‘ლეტი"</string>
+ <string name="permlab_brick" product="default" msgid="8337817093326370537">"ტელეფáƒáƒœáƒ˜áƒ¡ სáƒáƒ›áƒ£áƒ“áƒáƒ›áƒáƒ“ დეáƒáƒ¥áƒ¢áƒ˜áƒ•áƒáƒªáƒ˜áƒ"</string>
+ <string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"áƒáƒžáƒ¡ შეეძლებრმთელი ტáƒáƒ‘ლეტის სáƒáƒ›áƒ£áƒ“áƒáƒ›áƒáƒ“ გáƒáƒ—იშვáƒ. ეს ძáƒáƒšáƒ˜áƒáƒœ სáƒáƒ®áƒ˜áƒ¤áƒáƒ—áƒáƒ."</string>
+ <string name="permdesc_brick" product="default" msgid="5788903297627283099">"áƒáƒžáƒ¡ შეეძლებრმთელი ტელეფáƒáƒœáƒ˜áƒ¡ სáƒáƒ›áƒ£áƒ“áƒáƒ›áƒáƒ“ გáƒáƒ—იშვáƒ. ეს ძáƒáƒšáƒ˜áƒáƒœ სáƒáƒ®áƒ˜áƒ¤áƒáƒ—áƒáƒ."</string>
+ <string name="permlab_reboot" product="tablet" msgid="3436634972561795002">"ტáƒáƒ‘ლეტის გáƒáƒ“áƒáƒ¢áƒ•ირთვის იძულებáƒ"</string>
+ <string name="permlab_reboot" product="default" msgid="2898560872462638242">"ტელეფáƒáƒœáƒ˜áƒ¡ გáƒáƒ“áƒáƒ¢áƒ•ირთვის იძულებáƒ"</string>
+ <string name="permdesc_reboot" product="tablet" msgid="8172056180063700741">"áƒáƒžáƒ¡ შეეძლებრტáƒáƒ‘ლეტის იძულებითი გáƒáƒ“áƒáƒ¢áƒ•ირთვáƒ."</string>
+ <string name="permdesc_reboot" product="default" msgid="5326008124289989969">"áƒáƒžáƒ¡ შეეძლებრმáƒáƒ¬áƒ§áƒáƒ‘ილáƒáƒ‘ის იძულებითი გáƒáƒ“áƒáƒ¢áƒ•ირთვáƒ."</string>
+ <string name="permlab_mount_unmount_filesystems" product="nosdcard" msgid="2927361537942591841">"UBS ბáƒáƒ áƒáƒ—ის ფáƒáƒ˜áƒšáƒ£áƒ  სისტემáƒáƒ–ე წვდáƒáƒ›áƒ"</string>
+ <string name="permlab_mount_unmount_filesystems" product="default" msgid="4402305049890953810">"SD ბáƒáƒ áƒáƒ—ის ფáƒáƒ˜áƒšáƒ£áƒ  სისტემáƒáƒ–ე წვდáƒáƒ›áƒ"</string>
+ <string name="permdesc_mount_unmount_filesystems" msgid="1829290701658992347">"áƒáƒžáƒ¡ შეეძლებáƒ, მიუერთáƒáƒ¡ დრგáƒáƒ›áƒáƒáƒ”რთáƒáƒ¡ ფáƒáƒ˜áƒšáƒ”ბის სისტემები მáƒáƒ¡áƒáƒ®áƒ¡áƒœáƒ”ლი მეხსიერებისთვის."</string>
+ <string name="permlab_mount_format_filesystems" product="nosdcard" msgid="6227819582624904972">"USB მეხსიერების წáƒáƒ¨áƒšáƒ"</string>
+ <string name="permlab_mount_format_filesystems" product="default" msgid="262582698639274056">"SD ბáƒáƒ áƒáƒ—ის წáƒáƒ¨áƒšáƒ"</string>
+ <string name="permdesc_mount_format_filesystems" msgid="8784268246779198627">"áƒáƒžáƒ¡ შეეძლებáƒ, დáƒáƒáƒ¤áƒáƒ áƒ›áƒáƒ¢áƒáƒ¡ მáƒáƒ¡áƒáƒ®áƒ¡áƒœáƒ”ლი მეხსიერებáƒ."</string>
+ <string name="permlab_asec_access" msgid="3411338632002193846">"შიდრმეხსიერების შესáƒáƒ®áƒ”ბ ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ მიღებáƒ"</string>
+ <string name="permdesc_asec_access" msgid="3094563844593878548">"áƒáƒžáƒ¡ შეეძლებáƒ, მიიღáƒáƒ¡ ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ შიდრმეხსიერებáƒáƒ–ე."</string>
+ <string name="permlab_asec_create" msgid="6414757234789336327">"შიდრმეხსიერების შექმნáƒ"</string>
+ <string name="permdesc_asec_create" msgid="4558869273585856876">"áƒáƒžáƒ¡ შეეძლებრმეხსიერების შიდრსáƒáƒªáƒáƒ•ის შექმნáƒ."</string>
+ <string name="permlab_asec_destroy" msgid="526928328301618022">"შიდრმეხსიერების გáƒáƒœáƒáƒ“გურებáƒ"</string>
+ <string name="permdesc_asec_destroy" msgid="7218749286145526537">"áƒáƒžáƒ¡ შეეძლებრშიდრმეხსიერების გáƒáƒœáƒáƒ“გურებáƒ."</string>
+ <string name="permlab_asec_mount_unmount" msgid="8877998101944999386">"შიდრმეხსიერების მიერთებáƒ/გáƒáƒ›áƒáƒ”რთებáƒ"</string>
+ <string name="permdesc_asec_mount_unmount" msgid="3451360114902490929">"áƒáƒžáƒ¡ შეეძლებრშიდრმეხსიერების მიერთებრ/ გáƒáƒ›áƒáƒ”რთებáƒ."</string>
+ <string name="permlab_asec_rename" msgid="7496633954080472417">"შიდრმეხსიერებისთვის სáƒáƒ®áƒ”ლის გáƒáƒ“áƒáƒ áƒ¥áƒ›áƒ”ვáƒ"</string>
+ <string name="permdesc_asec_rename" msgid="1794757588472127675">"áƒáƒžáƒ¡ შეეძლებრშიდრმეხსიერებისთვის სáƒáƒ®áƒ”ლის გáƒáƒ“áƒáƒ áƒ¥áƒ›áƒ”ვáƒ."</string>
+ <string name="permlab_vibrate" msgid="7696427026057705834">"ვიბრáƒáƒªáƒ˜áƒ˜áƒ¡ კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜"</string>
+ <string name="permdesc_vibrate" msgid="6284989245902300945">"áƒáƒžáƒ¡ შეეძლებáƒ, მáƒáƒ áƒ—áƒáƒ¡ ვიბრირებáƒ."</string>
+ <string name="permlab_flashlight" msgid="2155920810121984215">"სáƒáƒ¡áƒ˜áƒ’ნáƒáƒšáƒ შუქის მáƒáƒ áƒ—ვáƒ"</string>
+ <string name="permdesc_flashlight" msgid="6522284794568368310">"áƒáƒžáƒ¡ შეეძლებáƒ, მáƒáƒ áƒ—áƒáƒ¡ გáƒáƒœáƒáƒ—ებáƒ."</string>
+ <string name="permlab_manageUsb" msgid="1113453430645402723">"USB მáƒáƒ¬áƒ§áƒáƒ‘ილáƒáƒ‘ების უფლებებისრდრსáƒáƒ¡áƒ£áƒ áƒ•ელი პáƒáƒ áƒáƒ›áƒ”ტრების მáƒáƒ áƒ—ვáƒ"</string>
+ <string name="permdesc_manageUsb" msgid="7776155430218239833">"áƒáƒžáƒ¡ შეეძლებრUSB მáƒáƒ¬áƒ§áƒáƒ‘ილáƒáƒ‘ების პáƒáƒ áƒáƒ›áƒ”ტრებისრდრნებáƒáƒ áƒ—ვების მáƒáƒ áƒ—ვáƒ."</string>
+ <string name="permlab_accessMtp" msgid="4953468676795917042">"MTP პრáƒáƒ¢áƒáƒ™áƒáƒšáƒ˜áƒ¡ დáƒáƒœáƒ”რგვáƒ"</string>
+ <string name="permdesc_accessMtp" msgid="6532961200486791570">"áƒáƒœáƒ˜áƒ­áƒ”ბს წვდáƒáƒ›áƒáƒ¡ kernel MTP დრáƒáƒ˜áƒ•ერს MTP USB პრáƒáƒ¢áƒáƒ™áƒáƒšáƒ˜áƒ¡ იმპლემენტáƒáƒªáƒ˜áƒ˜áƒ¡áƒ—ვის."</string>
+ <string name="permlab_hardware_test" msgid="4148290860400659146">"áƒáƒžáƒáƒ áƒáƒ¢áƒ£áƒ áƒ£áƒšáƒ˜ áƒáƒ¦áƒ­áƒ£áƒ áƒ•ილáƒáƒ‘ის ტესტირებáƒ"</string>
+ <string name="permdesc_hardware_test" msgid="6597964191208016605">"áƒáƒžáƒ¡ შეეძლებáƒ, მáƒáƒ áƒ—áƒáƒ¡ სხვáƒáƒ“áƒáƒ¡áƒ®áƒ•რპერიფერიული მáƒáƒ¬áƒ§áƒáƒ‘ილáƒáƒ‘რáƒáƒžáƒáƒ áƒáƒ¢áƒ£áƒ áƒ˜áƒ¡ ტესტირების მიზნით."</string>
+ <string name="permlab_callPhone" msgid="3925836347681847954">"პირდáƒáƒžáƒ˜áƒ áƒ˜ დáƒáƒ áƒ”კვრტელეფáƒáƒœáƒ˜áƒ¡ ნáƒáƒ›áƒ áƒ”ბზე"</string>
+ <string name="permdesc_callPhone" msgid="3740797576113760827">"áƒáƒžáƒ¡ შეეძლებრდáƒáƒ áƒ”კáƒáƒ¡ ტელეფáƒáƒœáƒ˜áƒ¡ ნáƒáƒ›áƒ áƒ”ბზე თქვენი ჩáƒáƒ áƒ”ვის გáƒáƒ áƒ”შე. áƒáƒ›áƒáƒœ შესáƒáƒ«áƒšáƒáƒ გáƒáƒ›áƒáƒ˜áƒ¬áƒ•იáƒáƒ¡ თქვენს სáƒáƒ¢áƒ”ლეფáƒáƒœáƒ˜ ქვითáƒáƒ áƒ–ე მáƒáƒ£áƒšáƒáƒ“ნელი ხáƒáƒ áƒ¯áƒ”ბისრდრზáƒáƒ áƒ”ბის გáƒáƒ©áƒ”ნáƒ. გáƒáƒ˜áƒ—ვáƒáƒšáƒ˜áƒ¡áƒ¬áƒ˜áƒœáƒ”თ, რáƒáƒ› áƒáƒžáƒ¡ გáƒáƒ“áƒáƒ£áƒ“ებელი დáƒáƒ®áƒ›áƒáƒ áƒ”ბის ნáƒáƒ›áƒ áƒ”ბზე დáƒáƒ áƒ”კვრáƒáƒ  შეუძლიáƒ. მáƒáƒ•ნე áƒáƒžáƒ”ბს შეეძლებრთქვენი დáƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ”ბის გáƒáƒ áƒ”შე ზáƒáƒ áƒ”ბის გáƒáƒœáƒ®áƒáƒ áƒªáƒ˜áƒ”ლებრდრშესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡áƒ˜ სáƒáƒ¤áƒáƒ¡áƒ£áƒ áƒ˜áƒ¡ გáƒáƒ“áƒáƒ®áƒ“áƒáƒª მáƒáƒ’იწევთ."</string>
+ <string name="permlab_callPrivileged" msgid="4198349211108497879">"პირდáƒáƒžáƒ˜áƒ áƒ˜ დáƒáƒ áƒ”კვრტელეფáƒáƒœáƒ˜áƒ¡ ნებისმიერ ნáƒáƒ›áƒ”რზე"</string>
+ <string name="permdesc_callPrivileged" msgid="1689024901509996810">"áƒáƒžáƒ¡ შეეძლებრთქვენი მáƒáƒœáƒáƒ¬áƒ˜áƒšáƒ”áƒáƒ‘ის გáƒáƒ áƒ”შე დáƒáƒ áƒ”კáƒáƒ¡ ნებისმიერ ტელეფáƒáƒœáƒ˜áƒ¡ ნáƒáƒ›áƒ”რზე, მáƒáƒ— შáƒáƒ áƒ˜áƒ¡ სáƒáƒ’áƒáƒœáƒ’ებრნáƒáƒ›áƒ áƒ”ბზე. მáƒáƒ•ნე áƒáƒžáƒ”ბი შეძლებენ áƒáƒ áƒáƒ¡áƒáƒ¡áƒ£áƒ áƒ•ელი áƒáƒœ უკáƒáƒœáƒáƒœáƒ ზáƒáƒ áƒ”ბის სáƒáƒ’áƒáƒœáƒ’ებრსáƒáƒ›áƒ¡áƒáƒ®áƒ£áƒ áƒ”ბის სიებში გáƒáƒœáƒ—áƒáƒ•სებáƒáƒ¡."</string>
+ <string name="permlab_performCdmaProvisioning" product="tablet" msgid="4842576994144604821">"CDMA ტáƒáƒ‘ლეტის დáƒáƒ§áƒ”ნების პირდáƒáƒžáƒ˜áƒ  დáƒáƒ¬áƒ§áƒ”ბáƒ"</string>
+ <string name="permlab_performCdmaProvisioning" product="default" msgid="5604848095315421425">"CDMA ტელეფáƒáƒœáƒ˜áƒ¡ დáƒáƒ§áƒ”ნების პირდáƒáƒžáƒ˜áƒ  დáƒáƒ¬áƒ§áƒ”ბáƒ"</string>
+ <string name="permdesc_performCdmaProvisioning" msgid="1994193538802314186">"áƒáƒžáƒ¡ შეეძლებáƒ, დáƒáƒ˜áƒ¬áƒ§áƒáƒ¡ CDMA უზრუნველყáƒáƒ¤áƒ. მáƒáƒ•ნე áƒáƒžáƒ”ბმრშეიძლებრზედმეტáƒáƒ“, სáƒáƒ­áƒ˜áƒ áƒáƒ”ბის გáƒáƒ áƒ”შე დáƒáƒ˜áƒ¬áƒ§áƒáƒœ CDMA უზრუნველყáƒáƒ¤áƒ."</string>
+ <string name="permlab_locationUpdates" msgid="7785408253364335740">"მდებáƒáƒ áƒ”áƒáƒ‘ის გáƒáƒœáƒáƒ®áƒšáƒ”ბის შეტყáƒáƒ‘ინებების კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜"</string>
+ <string name="permdesc_locationUpdates" msgid="1120741557891438876">"áƒáƒžáƒ¡ შეეძლებრმდებáƒáƒ áƒ”áƒáƒ‘ის გáƒáƒœáƒáƒ®áƒšáƒ”ბის შესáƒáƒ®áƒ”ბ რáƒáƒ“ირშეტყáƒáƒ‘ინებების áƒáƒ¥áƒ¢áƒ˜áƒ•áƒáƒªáƒ˜áƒ/დეáƒáƒ¥áƒ¢áƒ˜áƒ•áƒáƒªáƒ˜áƒ. ჩვეულებრივი áƒáƒžáƒ”ბი áƒáƒ› ფუნქციáƒáƒ¡ áƒáƒ  იყენებენ."</string>
+ <string name="permlab_checkinProperties" msgid="7855259461268734914">"სáƒáƒ áƒ”გისტრáƒáƒªáƒ˜áƒ პáƒáƒ áƒáƒ›áƒ”ტრებზე წვდáƒáƒ›áƒ"</string>
+ <string name="permdesc_checkinProperties" msgid="4024526968630194128">"áƒáƒžáƒ”ბს შეეძლებáƒáƒ— რეგისტრáƒáƒªáƒ˜áƒ˜áƒ¡ სáƒáƒ›áƒ¡áƒáƒ®áƒ£áƒ áƒ˜áƒ¡ მეშვეáƒáƒ‘ით დáƒáƒ›áƒáƒ¢áƒ”ბული თვისებების წáƒáƒ¡áƒáƒ™áƒ˜áƒ—ხáƒáƒ“ áƒáƒœ ჩáƒáƒ¡áƒáƒ¬áƒ”რáƒáƒ“ წვდáƒáƒ›áƒ. áƒáƒ  გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებრჩვეულებრივ áƒáƒžáƒ”ბში."</string>
+ <string name="permlab_bindGadget" msgid="776905339015863471">"ვიჯეტების áƒáƒ áƒ©áƒ”ვáƒ"</string>
+ <string name="permdesc_bindGadget" msgid="8261326938599049290">"áƒáƒžáƒ¡ შეეძლებრუთხრáƒáƒ¡ სისტემáƒáƒ¡, თუ რáƒáƒ›áƒ”ლმრáƒáƒžáƒ›áƒ რáƒáƒ›áƒ”ლი ვიჯეტი შეიძლებრგáƒáƒ›áƒáƒ˜áƒ§áƒ”ნáƒáƒ¡. áƒáƒ› ნებáƒáƒ áƒ—ვის მქáƒáƒœáƒ” áƒáƒžáƒ¡ შეუძლიáƒ, პირáƒáƒ“ მáƒáƒœáƒáƒªáƒ”მებზე წვდáƒáƒ›áƒ მისცეს სხვრáƒáƒžáƒ”ბს. áƒáƒ  გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებრჩვეულებრივ áƒáƒžáƒ”ბში."</string>
+ <string name="permlab_modifyPhoneState" msgid="8423923777659292228">"ტელეფáƒáƒœáƒ˜áƒ¡ მდგáƒáƒ›áƒáƒ áƒ”áƒáƒ‘ის შეცვლáƒ"</string>
+ <string name="permdesc_modifyPhoneState" msgid="1029877529007686732">"áƒáƒžáƒ¡ შეეძლებრáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒáƒ¡ მáƒáƒ¬áƒ§áƒáƒ‘ილáƒáƒ‘áƒáƒ–ე ტელეფáƒáƒœáƒ˜áƒ¡ ფუნქციები. áƒáƒ› უფლების მქáƒáƒœáƒ” áƒáƒžáƒ¡ შეუძლირქსელების გáƒáƒ“áƒáƒ áƒ—ვáƒ, ტელეფáƒáƒœáƒ˜áƒ¡ რáƒáƒ“იáƒáƒ¡ ჩáƒáƒ áƒ—ვრდრგáƒáƒ›áƒáƒ áƒ—ვáƒ, მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლისáƒáƒ—ვის შეტყáƒáƒ‘ინების გáƒáƒ áƒ”შე."</string>
+ <string name="permlab_readPhoneState" msgid="9178228524507610486">"ტელეფáƒáƒœáƒ˜áƒ¡ სტáƒáƒ¢áƒ£áƒ¡áƒ˜áƒ¡áƒ დრიდენტáƒáƒ‘ის წáƒáƒ™áƒ˜áƒ—ხვáƒ"</string>
+ <string name="permdesc_readPhoneState" msgid="1639212771826125528">"áƒáƒžáƒ¡ შეეძლებრჰქáƒáƒœáƒ“ეს წვდáƒáƒ›áƒ მáƒáƒ¬áƒ§áƒáƒ‘ილáƒáƒ‘ის სáƒáƒ¢áƒ”ლეფáƒáƒœáƒ ფუნქციებზე. áƒáƒžáƒ›áƒ მსგáƒáƒ•სი უფლებით შეძლებს დáƒáƒáƒ“გინáƒáƒ¡ ტელეფáƒáƒœáƒ˜áƒ¡ ნáƒáƒ›áƒ”რი, მისი სერიული გáƒáƒ›áƒáƒªáƒ”მáƒ, áƒáƒ¥áƒ¢áƒ˜áƒ£áƒ áƒ˜ ზáƒáƒ áƒ˜, დáƒáƒ™áƒáƒ•შირებული ნáƒáƒ›áƒ”რი დრმსგáƒáƒ•სი."</string>
+ <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"დáƒáƒ˜áƒªáƒáƒ•ით ტáƒáƒ‘ლეტი დáƒáƒ«áƒ˜áƒœáƒ”ბისგáƒáƒœ"</string>
+ <string name="permlab_wakeLock" product="default" msgid="573480187941496130">"ტელეფáƒáƒœáƒ˜áƒ¡ ძილის რეჟიმში გáƒáƒ“áƒáƒ¡áƒ•ლის áƒáƒ¦áƒ™áƒ•ეთáƒ"</string>
+ <string name="permdesc_wakeLock" product="tablet" msgid="7311319824400447868">"áƒáƒžáƒ¡ შეეძლებრხელი შეუშáƒáƒšáƒáƒ¡ ტáƒáƒ‘ლეტის დáƒáƒ«áƒ˜áƒœáƒ”ბáƒáƒ¡."</string>
+ <string name="permdesc_wakeLock" product="default" msgid="8559100677372928754">"áƒáƒžáƒ¡ შეეძლებრხელი შეუშáƒáƒšáƒáƒ¡ ტელეფáƒáƒœáƒ˜áƒ¡ დáƒáƒ«áƒ˜áƒœáƒ”ბáƒáƒ¡."</string>
+ <string name="permlab_devicePower" product="tablet" msgid="2787034722616350417">"ტáƒáƒ‘ლეტის ჩáƒáƒ áƒ—ვრáƒáƒœ გáƒáƒ›áƒáƒ áƒ—ვáƒ"</string>
+ <string name="permlab_devicePower" product="default" msgid="4928622470980943206">"ტელეფáƒáƒœáƒ˜áƒ¡ ჩáƒáƒ áƒ—ვრáƒáƒœ გáƒáƒ›áƒáƒ áƒ—ვáƒ"</string>
+ <string name="permdesc_devicePower" product="tablet" msgid="6689862878984631831">"áƒáƒžáƒ¡ შეეძლებáƒ, ჩáƒáƒ áƒ—áƒáƒ¡ áƒáƒœ გáƒáƒ›áƒáƒ áƒ—áƒáƒ¡ ტáƒáƒ‘ლეტი."</string>
+ <string name="permdesc_devicePower" product="default" msgid="6037057348463131032">"áƒáƒžáƒ¡ შეეძლებáƒ, ჩáƒáƒ áƒ—áƒáƒ¡ áƒáƒœ გáƒáƒ›áƒáƒ áƒ—áƒáƒ¡ ტელეფáƒáƒœáƒ˜."</string>
+ <string name="permlab_factoryTest" msgid="3715225492696416187">"ქáƒáƒ áƒ®áƒœáƒ£áƒš სáƒáƒ¢áƒ”სტრრეჟიმში გáƒáƒ¨áƒ•ებáƒ"</string>
+ <string name="permdesc_factoryTest" product="tablet" msgid="3952059318359653091">"მწáƒáƒ áƒ›áƒáƒ”ბლის დáƒáƒ‘áƒáƒšáƒ˜ დáƒáƒœáƒ˜áƒ¡ ტესტის რეჟიმში გáƒáƒ¨áƒ•ებáƒ, რáƒáƒ›áƒšáƒ˜áƒ¡ დრáƒáƒ¡áƒáƒª სრულáƒáƒ“ áƒáƒ áƒ˜áƒ¡ ხელმისáƒáƒ¬áƒ•დáƒáƒ›áƒ˜ ტáƒáƒ‘ლეტის áƒáƒžáƒáƒ áƒáƒ¢áƒ£áƒšáƒ˜ უზრუნველყáƒáƒ¤áƒ. ხელმისáƒáƒ¬áƒ•დáƒáƒ›áƒ˜áƒ მხáƒáƒšáƒáƒ“ მწáƒáƒ áƒ›áƒáƒ”ბლის ტესტის რეჟიმში ჩáƒáƒ áƒ—ულ ტáƒáƒ‘ლეტზე."</string>
+ <string name="permdesc_factoryTest" product="default" msgid="8136644990319244802">"მწáƒáƒ áƒ›áƒáƒ”ბლის დáƒáƒ‘áƒáƒšáƒ˜ დáƒáƒœáƒ˜áƒ¡ ტესტის რეჟიმში გáƒáƒ¨áƒ•ებáƒ, რáƒáƒ›áƒšáƒ˜áƒ¡ დრáƒáƒ¡áƒáƒª სრულáƒáƒ“ áƒáƒ áƒ˜áƒ¡ ხელმისáƒáƒ¬áƒ•დáƒáƒ›áƒ˜ ტელეფáƒáƒœáƒ˜áƒ¡ áƒáƒžáƒáƒ áƒáƒ¢áƒ£áƒšáƒ˜ უზრუნველყáƒáƒ¤áƒ. ხელმისáƒáƒ¬áƒ•დáƒáƒ›áƒ˜áƒ მხáƒáƒšáƒáƒ“ მწáƒáƒ áƒ›áƒáƒ”ბლის ტესტის რეჟიმში ჩáƒáƒ áƒ—ულ ტელეფáƒáƒœáƒ–ე."</string>
+ <string name="permlab_setWallpaper" msgid="6627192333373465143">"ფáƒáƒœáƒ˜áƒ¡ დáƒáƒ§áƒ”ნებáƒ"</string>
+ <string name="permdesc_setWallpaper" msgid="7373447920977624745">"áƒáƒžáƒ¡ შეეძლებáƒ, დáƒáƒáƒ§áƒ”ნáƒáƒ¡ სისტემის ფáƒáƒœáƒ˜."</string>
+ <string name="permlab_setWallpaperHints" msgid="3278608165977736538">"ფáƒáƒœáƒ˜áƒ¡ ზáƒáƒ›áƒ˜áƒ¡ შესწáƒáƒ áƒ”ბáƒ"</string>
+ <string name="permdesc_setWallpaperHints" msgid="8235784384223730091">"áƒáƒžáƒ¡ შეეძლებრმინიშნებების დáƒáƒ§áƒ”ნებრსისტემის ფáƒáƒœáƒ˜áƒ¡ ზáƒáƒ›áƒ˜áƒ¡ მიხედვით."</string>
+ <string name="permlab_masterClear" msgid="2315750423139697397">"სისტემის დáƒáƒ‘რუნებრქáƒáƒ áƒ®áƒœáƒ£áƒš ნáƒáƒ’ულისხმევ მდგáƒáƒ›áƒáƒ áƒ”áƒáƒ‘áƒáƒ¨áƒ˜"</string>
+ <string name="permdesc_masterClear" msgid="3665380492633910226">"áƒáƒžáƒ¡ შეეძლებáƒ, სისტემრსრულáƒáƒ“ გáƒáƒ“áƒáƒ§áƒ”ნáƒáƒ¡ ქáƒáƒ áƒ®áƒœáƒ£áƒš პáƒáƒ áƒáƒ›áƒ”ტრებზე დრწáƒáƒ¨áƒáƒšáƒáƒ¡ ყველრმáƒáƒœáƒáƒªáƒ”მი, კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ დრდáƒáƒ§áƒ”ნებული áƒáƒžáƒ”ბი."</string>
+ <string name="permlab_setTime" msgid="2021614829591775646">"დრáƒáƒ˜áƒ¡ დáƒáƒ§áƒ”ნებáƒ"</string>
+ <string name="permdesc_setTime" product="tablet" msgid="1896341438151152881">"áƒáƒžáƒ¡ შეეძლებრტáƒáƒ‘ლეტის სáƒáƒáƒ—ის დრáƒáƒ˜áƒ¡ შეცვლáƒ."</string>
+ <string name="permdesc_setTime" product="default" msgid="1855702730738020">"áƒáƒžáƒ¡ შეეძლებრტელეფáƒáƒœáƒ˜áƒ¡ სáƒáƒáƒ—ის დრáƒáƒ˜áƒ¡ შეცვლáƒ."</string>
+ <string name="permlab_setTimeZone" msgid="2945079801013077340">"დრáƒáƒ˜áƒ¡ სáƒáƒ áƒ¢áƒ§áƒšáƒ˜áƒ¡ დáƒáƒ§áƒ”ნებáƒ"</string>
+ <string name="permdesc_setTimeZone" product="tablet" msgid="1676983712315827645">"áƒáƒžáƒ¡ შეეძლებáƒ, შეცვáƒáƒšáƒáƒ¡ ტáƒáƒ‘ლეტის დრáƒáƒ˜áƒ¡ სáƒáƒ áƒ¢áƒ§áƒ”ლი."</string>
+ <string name="permdesc_setTimeZone" product="default" msgid="4499943488436633398">"áƒáƒžáƒ¡ შეეძლებრტელეფáƒáƒœáƒ˜áƒ¡ დრáƒáƒ˜áƒ¡ სáƒáƒ áƒ¢áƒ§áƒ”ლის შეცვლáƒ."</string>
+ <string name="permlab_accountManagerService" msgid="4829262349691386986">"იმáƒáƒ¥áƒ›áƒ”დეთ რáƒáƒ’áƒáƒ áƒª AccountManagerService"</string>
+ <string name="permdesc_accountManagerService" msgid="1948455552333615954">"áƒáƒžáƒ¡ შეეძლებრგáƒáƒœáƒáƒ®áƒáƒ áƒªáƒ˜áƒ”ლáƒáƒ¡ ზáƒáƒ áƒ”ბი AccountAuthenticators-ზე."</string>
+ <string name="permlab_getAccounts" msgid="1086795467760122114">"მáƒáƒ¬áƒ§áƒáƒ‘ილáƒáƒ‘áƒáƒ–ე áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ”ბის მáƒáƒ«áƒ˜áƒ”ბáƒ"</string>
+ <string name="permdesc_getAccounts" product="tablet" msgid="2741496534769660027">"áƒáƒžáƒ¡ შეეძლებáƒ, მიიღáƒáƒ¡ ტáƒáƒ‘ლეტისთვის ცნáƒáƒ‘ილი áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ”ბის სიáƒ. ეს შეიძლებრმáƒáƒ˜áƒªáƒáƒ•დეს ნებისმიერ áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ¡, რáƒáƒ›áƒ”ლიც თქვენ მიერ დáƒáƒ§áƒ”ნებული áƒáƒžáƒšáƒ˜áƒ™áƒáƒªáƒ˜áƒ”ბით შეიქმნáƒ."</string>
+ <string name="permdesc_getAccounts" product="default" msgid="3448316822451807382">"áƒáƒžáƒ¡ შეეძლებáƒ, მიიღáƒáƒ¡ ტელეფáƒáƒœáƒ˜áƒ¡áƒ—ვის ცნáƒáƒ‘ილი áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ”ბის სიáƒ. ეს შეიძლებრმáƒáƒ˜áƒªáƒáƒ•დეს ნებისმიერ áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ¡, რáƒáƒ›áƒ”ლიც თქვენ მიერ დáƒáƒ§áƒ”ნებული áƒáƒžáƒšáƒ˜áƒ™áƒáƒªáƒ˜áƒ”ბით შეიქმნáƒ."</string>
+ <string name="permlab_authenticateAccounts" msgid="5265908481172736933">"áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ”ბის შექმნრდრპáƒáƒ áƒáƒšáƒ”ბის დáƒáƒ§áƒ”ნებáƒ"</string>
+ <string name="permdesc_authenticateAccounts" msgid="5472124296908977260">"áƒáƒžáƒ¡ შეეძლებრáƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ”ბის მენეჯერის áƒáƒ•ტáƒáƒ áƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ შესáƒáƒ«áƒšáƒ”ბლáƒáƒ‘ების გáƒáƒ›áƒáƒ§áƒ”ნებáƒ. მáƒáƒ— შáƒáƒ áƒ˜áƒ¡ áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ”ბის შექმნრდრმáƒáƒ—თვის პáƒáƒ áƒáƒšáƒ”ბის მიღებრდრდáƒáƒ§áƒ”ნებáƒ."</string>
+ <string name="permlab_manageAccounts" msgid="4983126304757177305">"áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ”ბის დáƒáƒ›áƒáƒ¢áƒ”ბრáƒáƒœ წáƒáƒ¨áƒšáƒ"</string>
+ <string name="permdesc_manageAccounts" msgid="8698295625488292506">"áƒáƒžáƒ¡ შეეძლებრისეთი áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ”ბის გáƒáƒœáƒ®áƒáƒ áƒªáƒ˜áƒ”ლებáƒ, რáƒáƒ’áƒáƒ áƒ˜áƒªáƒáƒ áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ”ბის დáƒáƒ›áƒáƒ¢áƒ”ბრდრწáƒáƒ¨áƒšáƒ, áƒáƒ¡áƒ”ვე მáƒáƒ—ი პáƒáƒ áƒáƒšáƒ”ბის წáƒáƒ¨áƒšáƒáƒª."</string>
+ <string name="permlab_useCredentials" msgid="235481396163877642">"მáƒáƒ¬áƒ§áƒáƒ‘ილáƒáƒ‘áƒáƒ–ე áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ”ბის გáƒáƒ›áƒáƒ§áƒ”ნებáƒ"</string>
+ <string name="permdesc_useCredentials" msgid="7984227147403346422">"áƒáƒžáƒ¡ შეეძლებáƒ, მáƒáƒ˜áƒ—ხáƒáƒ•áƒáƒ¡ áƒáƒ•ტáƒáƒ áƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ სáƒáƒ˜áƒ“ენტიფიკáƒáƒªáƒ˜áƒ ნიშნები."</string>
+ <string name="permlab_accessNetworkState" msgid="4951027964348974773">"ქსელის კáƒáƒ•შირების ნáƒáƒ®áƒ•áƒ"</string>
+ <string name="permdesc_accessNetworkState" msgid="8318964424675960975">"áƒáƒžáƒ¡ შეეძლებრქსელის კáƒáƒ•შირის შესáƒáƒ®áƒ”ბ ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ ნáƒáƒ®áƒ•áƒ, მáƒáƒ’. რáƒáƒ›áƒ”ლი ქსელები áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს დრრáƒáƒ›áƒ”ლირდáƒáƒ™áƒáƒ•შირებული."</string>
+ <string name="permlab_createNetworkSockets" msgid="8018758136404323658">"ქსელზე სრული წვდáƒáƒ›áƒ"</string>
+ <string name="permdesc_createNetworkSockets" msgid="3403062187779724185">"áƒáƒžáƒ¡ შეეძლებრშექმნáƒáƒ¡ ქსელური ბუდეები დრგáƒáƒ›áƒáƒ˜áƒ§áƒ”ნáƒáƒ¡ მáƒáƒ áƒ’ებული ქსელის პრáƒáƒ¢áƒáƒ™áƒáƒšáƒ”ბი. ბრáƒáƒ£áƒ–ერი დრსხვრáƒáƒžáƒšáƒ˜áƒ™áƒáƒªáƒ˜áƒ”ბი უზრუნველყáƒáƒ¤áƒ¡ ინტერნეტში მáƒáƒœáƒáƒªáƒ”მების გáƒáƒ’ზáƒáƒ•ნის სáƒáƒ¨áƒ£áƒáƒšáƒ”ბáƒáƒ¡, áƒáƒ›áƒ’ვáƒáƒ áƒáƒ“ ეს უფლებრინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ¡áƒáƒ’ზáƒáƒ•ნáƒáƒ“ სáƒáƒ­áƒ˜áƒ áƒ áƒáƒ áƒáƒ."</string>
+ <string name="permlab_writeApnSettings" msgid="505660159675751896">"ქსელის პáƒáƒ áƒáƒ›áƒ”ტრებისრდრტრáƒáƒ¤áƒ˜áƒ™áƒ˜áƒ¡ შეცვლრ/ შეწყვეტáƒ"</string>
+ <string name="permdesc_writeApnSettings" msgid="5333798886412714193">"áƒáƒžáƒ¡ შეეძლებრქსელის პáƒáƒ áƒáƒ›áƒ”ტრების შეცვლáƒ, მთელი ქსელის ტრáƒáƒ¤áƒ˜áƒ™áƒ˜áƒ¡ შეწყვეტრდრინსპექტირებáƒ, მáƒáƒ’áƒáƒšáƒ˜áƒ—áƒáƒ“, ნებისმიერი APN-ის პáƒáƒ áƒ¢áƒ˜áƒ¡áƒ დრპრáƒáƒ¥áƒ¡áƒ˜áƒ¡ შეცვლáƒ. მáƒáƒ•ნე áƒáƒžáƒ”ბს შეეძლებáƒáƒ— ქსელის პáƒáƒ™áƒ”ტების მáƒáƒœáƒ˜áƒ¢áƒáƒ áƒ˜áƒœáƒ’ი, გáƒáƒ“áƒáƒ›áƒ˜áƒ¡áƒáƒ›áƒáƒ áƒ—ებრáƒáƒœ შეცვლრთქვენთვის შეტყáƒáƒ‘ინების გáƒáƒ áƒ”შე."</string>
+ <string name="permlab_changeNetworkState" msgid="958884291454327309">"ქსელის დáƒáƒ™áƒáƒ•შირებულáƒáƒ‘ის შეცვლáƒ"</string>
+ <string name="permdesc_changeNetworkState" msgid="6789123912476416214">"áƒáƒžáƒ¡ შეეძლებáƒ, შეცვáƒáƒšáƒáƒ¡ ქსელის კáƒáƒ•შირის მდგáƒáƒ›áƒáƒ áƒ”áƒáƒ‘áƒ."</string>
+ <string name="permlab_changeTetherState" msgid="5952584964373017960">"მიერთებული კáƒáƒ•შირის შეცვლáƒ"</string>
+ <string name="permdesc_changeTetherState" msgid="1524441344412319780">"áƒáƒžáƒ¡ შეეძლებáƒ, შეცვáƒáƒšáƒáƒ¡ მáƒáƒ‘ილური ქსელის კáƒáƒ•შირის მდგáƒáƒ›áƒáƒ áƒ”áƒáƒ‘áƒ."</string>
+ <string name="permlab_changeBackgroundDataSetting" msgid="1400666012671648741">"ფáƒáƒœáƒ£áƒ áƒ˜ მáƒáƒœáƒáƒªáƒ”მების გáƒáƒ›áƒáƒ§áƒ”ნების პáƒáƒ áƒáƒ›áƒ”ტრების შეცვლáƒ"</string>
+ <string name="permdesc_changeBackgroundDataSetting" msgid="5347729578468744379">"áƒáƒžáƒ¡ შეეძლებáƒ, შეცვáƒáƒšáƒáƒ¡ უკáƒáƒœáƒ ფáƒáƒœáƒ˜áƒ¡ მáƒáƒœáƒáƒªáƒ”მების გáƒáƒ›áƒáƒ§áƒ”ნების პáƒáƒ áƒáƒ›áƒ”ტრები."</string>
+ <string name="permlab_accessWifiState" msgid="5202012949247040011">"Wi-Fi კáƒáƒ•შირების ნáƒáƒ®áƒ•áƒ"</string>
+ <string name="permdesc_accessWifiState" msgid="5002798077387803726">"áƒáƒžáƒ¡ შეეძლებრWi-Fi ქსელის შესáƒáƒ®áƒ”ბ ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ ნáƒáƒ®áƒ•áƒ, მáƒáƒ’áƒáƒšáƒ˜áƒ—áƒáƒ“, Wi-Fi ჩáƒáƒ áƒ—ულირთუ áƒáƒ áƒ, áƒáƒ¡áƒ”ვე დáƒáƒ™áƒáƒ•შირებული Wi-Fi მáƒáƒ¬áƒ§áƒáƒ‘ილáƒáƒ‘ის სáƒáƒ®áƒ”ლის ნáƒáƒ®áƒ•áƒ."</string>
+ <string name="permlab_changeWifiState" msgid="6550641188749128035">"Wi-Fi-ისთáƒáƒœ დáƒáƒ™áƒáƒ•შირებრáƒáƒœ კáƒáƒ•შირის შეწყვეტáƒ"</string>
+ <string name="permdesc_changeWifiState" msgid="7137950297386127533">"áƒáƒžáƒ¡ შეეძლებრWi-Fi წვდáƒáƒ›áƒ˜áƒ¡ წერტილებთáƒáƒœ დáƒáƒ™áƒáƒ•შირებრდრკáƒáƒ•შირის გáƒáƒ¬áƒ§áƒ•ეტრდრმáƒáƒ¬áƒ§áƒáƒ‘ილáƒáƒ‘ის კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ შეცვლრWi-Fi ქსელებისთვის."</string>
+ <string name="permlab_changeWifiMulticastState" msgid="1368253871483254784">"ნებáƒáƒ áƒ—ვრWi-Fi მრáƒáƒ•áƒáƒšáƒ›áƒ˜áƒ¡áƒáƒ›áƒáƒ áƒ—იáƒáƒœ მიღებáƒáƒ–ე"</string>
+ <string name="permdesc_changeWifiMulticastState" product="tablet" msgid="7969774021256336548">"áƒáƒžáƒ¡ შეეძლებáƒ, მიიღáƒáƒ¡ Wi-Fi ქსელში ყველრმáƒáƒ¬áƒ§áƒáƒ‘ილáƒáƒ‘áƒáƒ–ე გáƒáƒ’ზáƒáƒ•ნილი პáƒáƒ™áƒ”ტები ჯგუფური მისáƒáƒ›áƒáƒ áƒ—ების გáƒáƒ›áƒáƒ§áƒ”ნებით. მáƒáƒ˜áƒ®áƒ›áƒáƒ áƒ¡ მეტ ენერგიáƒáƒ¡, ვიდრე áƒáƒ áƒáƒ›áƒ áƒáƒ•áƒáƒšáƒ›áƒ˜áƒ¡áƒáƒ›áƒáƒ áƒ—იáƒáƒœáƒ˜ რეჟიმი."</string>
+ <string name="permdesc_changeWifiMulticastState" product="default" msgid="6851949706025349926">"áƒáƒžáƒ¡ შეეძლებáƒ, მიიღáƒáƒ¡ Wi-Fi ქსელში ყველრმáƒáƒ¬áƒ§áƒáƒ‘ილáƒáƒ‘áƒáƒ–ე გáƒáƒ’ზáƒáƒ•ნილი პáƒáƒ™áƒ”ტები ჯგუფური მისáƒáƒ›áƒáƒ áƒ—ების გáƒáƒ›áƒáƒ§áƒ”ნებით. მáƒáƒ˜áƒ®áƒ›áƒáƒ áƒ¡ მეტ ენერგიáƒáƒ¡, ვიდრე áƒáƒ áƒáƒ›áƒ áƒáƒ•áƒáƒšáƒ›áƒ˜áƒ¡áƒáƒ›áƒáƒ áƒ—იáƒáƒœáƒ˜ რეჟიმი."</string>
+ <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"Bluetooth-ის პáƒáƒ áƒáƒ›áƒ”ტრებზე წვდáƒáƒ›áƒ"</string>
+ <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"áƒáƒžáƒ¡ შეეძლებრáƒáƒ“გილáƒáƒ‘რივი Bluetooth ტáƒáƒ‘ლეტის პáƒáƒ áƒáƒ›áƒ”ტრების დáƒáƒ§áƒ”ნებრდრდისტáƒáƒœáƒªáƒ˜áƒ£áƒ áƒ˜ მáƒáƒ¬áƒ§áƒáƒ‘ილáƒáƒ‘ების áƒáƒ¦áƒ›áƒáƒ©áƒ”ნრდრდáƒáƒ¬áƒ§áƒ•ილებáƒ."</string>
+ <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"áƒáƒžáƒ¡ შეეძლებრტელეფáƒáƒœáƒ˜áƒ¡ áƒáƒ“გილáƒáƒ‘რივი Bluetooth პáƒáƒ áƒáƒ›áƒ”ტრების დáƒáƒ§áƒ”ნებრდრდისტáƒáƒœáƒªáƒ˜áƒ£áƒ áƒ˜ მáƒáƒ¬áƒ§áƒáƒ‘ილáƒáƒ‘ების áƒáƒ¦áƒ›áƒáƒ©áƒ”ნრდრდáƒáƒ¬áƒ§áƒ•ილებáƒ."</string>
+ <string name="permlab_accessWimaxState" msgid="4195907010610205703">"WiMAX-თáƒáƒœ დáƒáƒ™áƒáƒ•შირებრდრკáƒáƒ•შირის გáƒáƒ¬áƒ§áƒ•ეტáƒ"</string>
+ <string name="permdesc_accessWimaxState" msgid="6360102877261978887">"áƒáƒžáƒ¡ შეეძლებრგáƒáƒœáƒ¡áƒáƒ–ღვრáƒáƒ¡, WiMAX áƒáƒ áƒ˜áƒ¡ თუ áƒáƒ áƒ ჩáƒáƒ áƒ—ული დრáƒáƒ¡áƒ”ვე ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ ნებისმიერი დáƒáƒ™áƒáƒ•შირებული WiMAX ქსელის შესáƒáƒ®áƒ”ბ."</string>
+ <string name="permlab_changeWimaxState" msgid="2405042267131496579">"WiMAX მდგáƒáƒ›áƒáƒ áƒ”áƒáƒ‘ის შეცვლáƒ"</string>
+ <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"áƒáƒžáƒ¡ შეეძლებáƒ, დáƒáƒ£áƒ™áƒáƒ•შირáƒáƒ¡ დრგáƒáƒ›áƒáƒáƒ”რთáƒáƒ¡ ტáƒáƒ‘ლეტი WiMAX ქსელებიდáƒáƒœ."</string>
+ <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"áƒáƒžáƒ¡ შეეძლებáƒ, დáƒáƒ£áƒ™áƒáƒ•შირáƒáƒ¡ დრგáƒáƒ›áƒáƒáƒ”რთáƒáƒ¡ ტელეფáƒáƒœáƒ˜ WiMAX ქსელებიდáƒáƒœ."</string>
+ <string name="permlab_bluetooth" msgid="6127769336339276828">"Bluetooth მáƒáƒ¬áƒ§áƒáƒ‘ილáƒáƒ‘ებთáƒáƒœ დáƒáƒ¬áƒ§áƒ•ილებáƒ"</string>
+ <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"áƒáƒžáƒ¡ შეეძლებáƒ, ნáƒáƒ®áƒáƒ¡ Bluetooth-ის კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ ტáƒáƒ‘ლეტზე, შექმნáƒáƒ¡ დრმიიღáƒáƒ¡ კáƒáƒ•შირები დáƒáƒ¬áƒ§áƒ•ილებულ მáƒáƒ¬áƒ§áƒáƒ‘ილáƒáƒ‘ებთáƒáƒœ."</string>
+ <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"áƒáƒžáƒ¡ შეეძლებáƒ, ნáƒáƒ®áƒáƒ¡ Bluetooth-ის კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ ტელეფáƒáƒœáƒ–ე დრშექმნáƒáƒ¡ დრმიიღáƒáƒ¡ კáƒáƒ•შირები დáƒáƒ¬áƒ§áƒ•ილებულ მáƒáƒ¬áƒ§áƒáƒ‘ილáƒáƒ‘ებთáƒáƒœ."</string>
+ <string name="permlab_nfc" msgid="4423351274757876953">"áƒáƒ®áƒšáƒ მáƒáƒ¥áƒ›áƒ”დების რáƒáƒ“იáƒáƒ™áƒáƒ•შირი (NFC) მáƒáƒ áƒ—ვáƒ"</string>
+ <string name="permdesc_nfc" msgid="7120611819401789907">"áƒáƒžáƒ¡ შეეძლებრáƒáƒ®áƒšáƒ მáƒáƒ¥áƒ›áƒ”დების რáƒáƒ“იáƒáƒ™áƒáƒ•შირის (NFC) მეშვეáƒáƒ‘ით ტეგების, ბáƒáƒ áƒáƒ—ებისრდრწáƒáƒ›áƒ™áƒ˜áƒ—ხველების შემცველი მáƒáƒœáƒáƒªáƒ”მების მიმáƒáƒªáƒ•ლáƒ."</string>
+ <string name="permlab_disableKeyguard" msgid="3598496301486439258">"თქვენი ეკრáƒáƒœáƒ˜áƒ¡ ბლáƒáƒ™áƒ˜áƒ¡ გáƒáƒ—იშვáƒ"</string>
+ <string name="permdesc_disableKeyguard" msgid="6034203065077122992">"შეეძლებრკლáƒáƒ•იáƒáƒ¢áƒ£áƒ áƒ˜áƒ¡ დáƒáƒ‘ლáƒáƒ™áƒ•ისრდრპáƒáƒ áƒáƒšáƒ˜áƒ— უზრუნველყáƒáƒ¤áƒ˜áƒšáƒ˜ ნებისმიერი უსáƒáƒ¤áƒ áƒ—ხáƒáƒ”ბის ფუნქციის დეáƒáƒ¥áƒ¢áƒ˜áƒ•áƒáƒªáƒ˜áƒ. მáƒáƒ’áƒáƒšáƒ˜áƒ—áƒáƒ“, ტელეფáƒáƒœáƒ˜ შემáƒáƒ›áƒáƒ•áƒáƒšáƒ˜ ზáƒáƒ áƒ˜áƒ¡ დრáƒáƒ¡ áƒáƒ£áƒ¥áƒ›áƒ”ბს კლáƒáƒ•იáƒáƒ¢áƒ£áƒ áƒ˜áƒ¡ დáƒáƒ‘ლáƒáƒ™áƒ•áƒáƒ¡ დრკვლáƒáƒ• áƒáƒáƒ¥áƒ¢áƒ˜áƒ£áƒ áƒ”ბს მáƒáƒ¡, რáƒáƒ’áƒáƒ áƒª კი ზáƒáƒ áƒ˜ დáƒáƒ¡áƒ áƒ£áƒšáƒ“ებáƒ."</string>
+ <string name="permlab_readSyncSettings" msgid="6201810008230503052">"სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრების წáƒáƒ™áƒ˜áƒ—ხვáƒ"</string>
+ <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"áƒáƒžáƒ¡ შეეძლებáƒ, წáƒáƒ˜áƒ™áƒ˜áƒ—ხáƒáƒ¡ áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜áƒ¡ სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრები. მáƒáƒ’áƒáƒšáƒ˜áƒ—áƒáƒ“, მáƒáƒ¡ შეეძლებრგáƒáƒœáƒ¡áƒáƒ–ღვრáƒáƒ¡, áƒáƒ áƒ˜áƒ¡ თუ áƒáƒ áƒ People áƒáƒžáƒ˜ სინქრáƒáƒœáƒ˜áƒ–ებული áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ—áƒáƒœ."</string>
+ <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ ჩáƒáƒ áƒ—ვრდრგáƒáƒ›áƒáƒ áƒ—ვáƒ"</string>
+ <string name="permdesc_writeSyncSettings" msgid="8956262591306369868">"áƒáƒžáƒ¡ შეეძლებáƒ, შეცვáƒáƒšáƒáƒ¡ áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜áƒ¡ სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრები. მáƒáƒ’áƒáƒšáƒ˜áƒ—áƒáƒ“, მისი გáƒáƒ›áƒáƒ§áƒ”ნებრშეიძლებრáƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜áƒ¡ People áƒáƒžáƒ—áƒáƒœ სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ ჩáƒáƒ¡áƒáƒ áƒ—áƒáƒ•áƒáƒ“."</string>
+ <string name="permlab_readSyncStats" msgid="7396577451360202448">"სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ”ბის წáƒáƒ™áƒ˜áƒ—ხვáƒ"</string>
+ <string name="permdesc_readSyncStats" msgid="1510143761757606156">"áƒáƒžáƒ¡ შეეძლებრáƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜áƒ¡ სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡, მáƒáƒ— შáƒáƒ áƒ˜áƒ¡ სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ მáƒáƒ•ლენების ისტáƒáƒ áƒ˜áƒ˜áƒ¡áƒ დრსინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡áƒáƒ¡ გáƒáƒ“áƒáƒªáƒ”მული მáƒáƒœáƒáƒªáƒ”მების რáƒáƒáƒ“ენáƒáƒ‘ის წáƒáƒ™áƒ˜áƒ—ხვáƒ."</string>
+ <string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"გáƒáƒ›áƒáƒ¬áƒ”რილი áƒáƒ áƒ®áƒ”ბის წáƒáƒ™áƒ˜áƒ—ხვáƒ"</string>
+ <string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"áƒáƒžáƒ¡ შეეძლებრინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ მáƒáƒžáƒáƒ•ებრბáƒáƒšáƒáƒ¡ სინქრáƒáƒœáƒ˜áƒ–ებული áƒáƒ áƒ®áƒ”ბის შესáƒáƒ®áƒ”ბ."</string>
+ <string name="permlab_subscribedFeedsWrite" msgid="9015246325408209296">"გáƒáƒ›áƒáƒ¬áƒ”რილი áƒáƒ áƒ®áƒ”ბის შეცვლáƒ"</string>
+ <string name="permdesc_subscribedFeedsWrite" msgid="6928930188826089413">"áƒáƒžáƒ¡ შეეძლებრთქვენი áƒáƒ›áƒŸáƒáƒ›áƒ˜áƒœáƒ“ელი სინქრáƒáƒœáƒ˜áƒ–ებული áƒáƒ áƒ®áƒ”ბის შეცვლáƒ. მáƒáƒ•ნე áƒáƒžáƒ”ბმრშესáƒáƒ«áƒáƒ შეცვáƒáƒšáƒáƒœ თქვენი სინქრáƒáƒœáƒ˜áƒ–ებული áƒáƒ áƒ®áƒ”ბი."</string>
+ <string name="permlab_readDictionary" msgid="4107101525746035718">"ლექსიკáƒáƒœáƒ¨áƒ˜ თქვენი დáƒáƒ›áƒáƒ¢áƒ”ბული ტერმინების ნáƒáƒ®áƒ•áƒ"</string>
+ <string name="permdesc_readDictionary" msgid="659614600338904243">"áƒáƒžáƒ¡ შეეძლებრწáƒáƒ˜áƒ™áƒ˜áƒ—ხáƒáƒ¡ ყველრსიტყვáƒ, სáƒáƒ®áƒ”ლი დრფრáƒáƒ–áƒ, რáƒáƒ›áƒ”ლიც შეიძლებრმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელმრშეიტáƒáƒœáƒ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ლექსიკáƒáƒœáƒ¨áƒ˜."</string>
+ <string name="permlab_writeDictionary" msgid="2183110402314441106">"მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლისთვის გáƒáƒœáƒ™áƒ£áƒ—ვნილ ლექსიკáƒáƒœáƒ¨áƒ˜ სიტყვების დáƒáƒ›áƒáƒ¢áƒ”ბáƒ."</string>
+ <string name="permdesc_writeDictionary" msgid="8185385716255065291">"áƒáƒžáƒ¡ შეეძლებრáƒáƒ®áƒáƒšáƒ˜ სიტყვების დáƒáƒ›áƒáƒ¢áƒ”ბრმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ლექსიკáƒáƒœáƒ¨áƒ˜."</string>
+ <string name="permlab_sdcardRead" product="nosdcard" msgid="8235341515605559677">"დáƒáƒªáƒ£áƒš მეხსიერებáƒáƒ–ე სáƒáƒªáƒ“ელი წვდáƒáƒ›áƒ"</string>
+ <string name="permlab_sdcardRead" product="default" msgid="8235341515605559677">"დáƒáƒªáƒ£áƒš მეხსიერებáƒáƒ–ე სáƒáƒªáƒ“ელი წვდáƒáƒ›áƒ"</string>
+ <string name="permdesc_sdcardRead" product="nosdcard" msgid="3642473292348132072">"áƒáƒžáƒ¡ შეეძლებáƒ, მიáƒáƒ¬áƒáƒ“áƒáƒ¡ USB მეხსიერებáƒáƒ¡ ნებáƒáƒ áƒ—ვáƒ, რáƒáƒ›áƒšáƒ”ბიც შემდგáƒáƒ› სხვრმáƒáƒ¬áƒ§áƒáƒ‘ილáƒáƒ‘ებზეც იქნებრხელმისáƒáƒ¬áƒ•დáƒáƒ›áƒ˜."</string>
+ <string name="permdesc_sdcardRead" product="default" msgid="5914402684685848828">"áƒáƒžáƒ¡ შეეძლებრSD ბáƒáƒ áƒáƒ—ის ნებáƒáƒ áƒ—ვების შემáƒáƒ¬áƒ›áƒ”ბáƒ, რáƒáƒ›áƒšáƒ”ბიც შემდგáƒáƒ› სხვრმáƒáƒ¬áƒ§áƒáƒ‘ილáƒáƒ‘ებზეც გáƒáƒ•რცელდებáƒ."</string>
+ <string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"თქვენი USB მეხსიერების კáƒáƒœáƒ¢áƒ”ნტის შეცვლრáƒáƒœ წáƒáƒ¨áƒšáƒ"</string>
+ <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"თქვენი SD ბáƒáƒ áƒáƒ—ის კáƒáƒœáƒ¢áƒ”ნტის შეცვლრáƒáƒœ წáƒáƒ¨áƒšáƒ"</string>
+ <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"უფლებáƒáƒ¡ áƒáƒ«áƒšáƒ”ვს áƒáƒžáƒ¡, ჩáƒáƒ¬áƒ”რáƒáƒ¡ USB მეხსიერებáƒáƒ–ე."</string>
+ <string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"უფლებáƒáƒ¡ áƒáƒ«áƒšáƒ”ვს áƒáƒžáƒ¡, ჩáƒáƒ¬áƒ”რáƒáƒ¡ SD ბáƒáƒ áƒáƒ—ზე."</string>
+ <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"შიდრმედირმეხსიერების კáƒáƒœáƒ¢áƒ”ნტის შეცვლáƒ/წáƒáƒ¨áƒšáƒ"</string>
+ <string name="permdesc_mediaStorageWrite" product="default" msgid="8189160597698529185">"áƒáƒžáƒšáƒ˜áƒ™áƒáƒªáƒ˜áƒáƒ¡ შეეძლებრშიდრმედირმეხსიერების კáƒáƒœáƒ¢áƒ”ნტის შეცვლáƒ."</string>
+ <string name="permlab_manageDocs" product="default" msgid="5778318598448849829">"დáƒáƒ™áƒ£áƒ›áƒ”ნტების სáƒáƒªáƒáƒ•ის მáƒáƒ áƒ—ვáƒ"</string>
+ <string name="permdesc_manageDocs" product="default" msgid="8704323176914121484">"áƒáƒžáƒ¡ შეეძლებრდáƒáƒ™áƒ£áƒ›áƒ”ნტების სáƒáƒªáƒáƒ•ის მáƒáƒ áƒ—ვáƒ."</string>
+ <string name="permlab_sdcardAccessAll" msgid="8150613823900460576">"ყველრმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის გáƒáƒ áƒ” მეხსიერებáƒáƒ–ე წვდáƒáƒ›áƒ"</string>
+ <string name="permdesc_sdcardAccessAll" msgid="3215208357415891320">"áƒáƒžáƒ¡ შეეძლებრყველრმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის გáƒáƒ áƒ” მეხსიერებáƒáƒ¡áƒ—áƒáƒœ წვდáƒáƒ›áƒ."</string>
+ <string name="permlab_cache_filesystem" msgid="5656487264819669824">"ქეშის ფáƒáƒ˜áƒšáƒ£áƒ  სისტემáƒáƒ–ე წვდáƒáƒ›áƒ"</string>
+ <string name="permdesc_cache_filesystem" msgid="5578967642265550955">"áƒáƒžáƒ”ბს áƒáƒ«áƒšáƒ”ვს ქეშირებული სისტემური ფáƒáƒ˜áƒšáƒ”ბის წáƒáƒ™áƒ˜áƒ—ხვისრდრმáƒáƒ—ში ჩáƒáƒœáƒáƒ¬áƒ”რების გáƒáƒ™áƒ”თების სáƒáƒ¨áƒ£áƒáƒšáƒ”ბáƒáƒ¡."</string>
+ <string name="permlab_use_sip" msgid="5986952362795870502">"ინტერნეტ-ზáƒáƒ áƒ”ბის წáƒáƒ›áƒáƒ¬áƒ§áƒ”ბáƒ/მიღებáƒ"</string>
+ <string name="permdesc_use_sip" msgid="4717632000062674294">"áƒáƒžáƒ¡ შეეძლებáƒ, გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნáƒáƒ¡ SIP სერვისი ინტერნეტ ზáƒáƒ áƒ”ბის გáƒáƒœáƒ¡áƒáƒ®áƒáƒ áƒªáƒ˜áƒ”ლებლáƒáƒ“ / სáƒáƒžáƒáƒ¡áƒ£áƒ®áƒáƒ“."</string>
+ <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"ქსელის გáƒáƒ›áƒáƒ§áƒ”ნების ისტáƒáƒ áƒ˜áƒ˜áƒ¡ წáƒáƒ™áƒ˜áƒ—ხვáƒ"</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"áƒáƒžáƒ¡ შეეძლებრკáƒáƒœáƒ™áƒ áƒ”ტული ქსელისრდრáƒáƒžáƒ”ბის ისტáƒáƒ áƒ˜áƒ£áƒšáƒ˜ ქსელის გáƒáƒ›áƒáƒ§áƒ”ნების წáƒáƒ™áƒ˜áƒ—ხვáƒáƒ¡."</string>
+ <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"ქსელის დებულების მáƒáƒ áƒ—ვáƒ"</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"áƒáƒžáƒ¡ სáƒáƒ¨áƒ£áƒáƒšáƒ”ბრექნებრმáƒáƒ áƒ—áƒáƒ¡ ქსელის პáƒáƒšáƒ˜áƒ¢áƒ˜áƒ™áƒ დრდáƒáƒáƒ¬áƒ”სáƒáƒ¡ წესები ცáƒáƒšáƒ™áƒ”ული áƒáƒžáƒ”ბისთვის."</string>
+ <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"ქსელის გáƒáƒ›áƒáƒ§áƒ”ნების áƒáƒ¦áƒ áƒ˜áƒªáƒ®áƒ•ის შეცვლáƒ"</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"áƒáƒžáƒ¡ შეეძლებáƒ, შეცვáƒáƒšáƒáƒ¡ ქსელის გáƒáƒ›áƒáƒ§áƒ”ნების áƒáƒ¦áƒ áƒ˜áƒªáƒ®áƒ•რáƒáƒžáƒ”ბთáƒáƒœ მიმáƒáƒ áƒ—ებáƒáƒ¨áƒ˜. áƒáƒ  გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებრჩვეულებრივ áƒáƒžáƒ”ბში."</string>
+ <string name="permlab_markNetworkSocket" msgid="3658527214914959749">"სáƒáƒ™áƒ”ტის ნიშნების შეცვლáƒ"</string>
+ <string name="permdesc_markNetworkSocket" msgid="7655568433696356578">"სáƒáƒ¨áƒ£áƒáƒšáƒ”ბáƒáƒ¡ áƒáƒ«áƒšáƒ”ვს áƒáƒžáƒ¡ შეცვáƒáƒšáƒáƒ¡ მáƒáƒ áƒ¨áƒ áƒ£áƒ¢áƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ სáƒáƒ™áƒ”ტის ნიშნები"</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"წვდáƒáƒ›áƒ შეტყáƒáƒ‘ინებებთáƒáƒœ"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"áƒáƒžáƒ¡ შეეძლებრმáƒáƒ˜áƒ«áƒ˜áƒáƒ¡, გáƒáƒ›áƒáƒ˜áƒ™áƒ•ლიáƒáƒ¡ დრწáƒáƒ¨áƒáƒšáƒáƒ¡ შეტყáƒáƒ‘ინებები, მáƒáƒ— შáƒáƒ áƒ˜áƒ¡ სხვრáƒáƒžáƒ”ბის მიერ გáƒáƒ›áƒáƒ¥áƒ•ეყნებული."</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"შეტყáƒáƒ‘ინებების მáƒáƒ¡áƒ›áƒ”ნის სერვისთáƒáƒœ დáƒáƒ™áƒáƒ•შირებáƒ"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"მფლáƒáƒ‘ელს შეეძლებრშეტყáƒáƒ‘ინებების მსმენლის სერვისის ზედრდáƒáƒœáƒ˜áƒ¡ ინტერფეისთáƒáƒœ დáƒáƒ™áƒáƒ•შირებáƒ. áƒáƒ  უნდრმáƒáƒ®áƒ“ეს მისი გáƒáƒ›áƒáƒ§áƒ”ნებრჩვეუელებრივი áƒáƒžáƒ”ბისთვის.ფ"</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ მიერ მáƒáƒ¬áƒáƒ“ებული კáƒáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ áƒáƒžáƒ˜áƒ¡ გáƒáƒ›áƒáƒ®áƒ›áƒáƒ‘áƒ"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"სáƒáƒ¨áƒ£áƒáƒšáƒ”ბáƒáƒ¡ áƒáƒ«áƒšáƒ”ვს მფლáƒáƒ‘ელს გáƒáƒ›áƒáƒ˜áƒ¬áƒ•იáƒáƒ¡ áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ მიერ მáƒáƒ¬áƒáƒ“ებული კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ áƒáƒžáƒ˜. ჩვეულებრივ áƒáƒžáƒ¡ ეს წესით áƒáƒ áƒáƒ¡áƒáƒ“ეს áƒáƒ  უნდრდáƒáƒ­áƒ˜áƒ áƒ“ეს."</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"გáƒáƒœáƒ®áƒáƒ áƒªáƒ˜áƒ”ლდეს ქსელის მდგáƒáƒ›áƒáƒ áƒ”áƒáƒ‘ის მáƒáƒœáƒ˜áƒ¢áƒáƒ áƒ˜áƒœáƒ’ი"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"სáƒáƒ¨áƒ£áƒáƒšáƒ”ბáƒáƒ¡ áƒáƒ«áƒšáƒ”ვს áƒáƒžáƒšáƒ˜áƒ™áƒáƒªáƒ˜áƒ”ბს გáƒáƒœáƒáƒ®áƒáƒ áƒªáƒ˜áƒ”ლáƒáƒ¡ ქსელის მდგáƒáƒ›áƒáƒ áƒ”áƒáƒ‘ის მáƒáƒœáƒ˜áƒ¢áƒáƒ áƒ˜áƒœáƒ’ი. ეს ფუნქცირჩვეულებრივ áƒáƒžáƒ”ბს áƒáƒ  ჭირდებáƒ."</string>
+ <string name="policylab_limitPassword" msgid="4497420728857585791">"პáƒáƒ áƒáƒšáƒ˜áƒ¡ წესების დáƒáƒ§áƒ”ნებáƒ"</string>
+ <string name="policydesc_limitPassword" msgid="3252114203919510394">"გáƒáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ”თ ეკრáƒáƒœáƒ˜áƒ¡ გáƒáƒœáƒ‘ლáƒáƒ™áƒ•ის პáƒáƒ áƒáƒšáƒ¨áƒ˜ დáƒáƒ¨áƒ•ებული სიმბáƒáƒšáƒáƒ”ბი დრმისი სიგრძე."</string>
+ <string name="policylab_watchLogin" msgid="914130646942199503">"ეკრáƒáƒœáƒ˜áƒ¡ გáƒáƒœáƒ‘ლáƒáƒ™áƒ•ის მცდელáƒáƒ‘ების გáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ”ბáƒ"</string>
+ <string name="policydesc_watchLogin" product="tablet" msgid="3215729294215070072">"ეკრáƒáƒœáƒ˜áƒ¡ გáƒáƒœáƒ‘ლáƒáƒ™áƒ•ისთვის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒáƒ“ áƒáƒ™áƒ áƒ”ფილი პáƒáƒ áƒáƒšáƒ”ბის რáƒáƒáƒ“ენáƒáƒ‘ის მáƒáƒœáƒ˜áƒ¢áƒáƒ áƒ˜áƒœáƒ’ი. ტáƒáƒ‘ლეტის დáƒáƒ‘ლáƒáƒ™áƒ•რáƒáƒœ მáƒáƒ¡áƒ–ე áƒáƒ áƒ¡áƒ”ბული ყველრმáƒáƒœáƒáƒªáƒ”მის წáƒáƒ¨áƒšáƒ ძáƒáƒšáƒ˜áƒáƒœ ბევრჯერ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ პáƒáƒ áƒáƒšáƒ˜áƒ¡ შეყვáƒáƒœáƒ˜áƒ¡ შემთხვევáƒáƒ¨áƒ˜."</string>
+ <string name="policydesc_watchLogin" product="default" msgid="5712323091846761073">"ეკრáƒáƒœáƒ˜áƒ¡ გáƒáƒœáƒ‘ლáƒáƒ™áƒ•ისთვის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒáƒ“ áƒáƒ™áƒ áƒ”ფილი პáƒáƒ áƒáƒšáƒ”ბის რáƒáƒáƒ“ენáƒáƒ‘ის მáƒáƒœáƒ˜áƒ¢áƒáƒ áƒ˜áƒœáƒ’ი. ტელეფáƒáƒœáƒ˜áƒ¡ დáƒáƒ‘ლáƒáƒ™áƒ•რáƒáƒœ მáƒáƒ¡áƒ–ე áƒáƒ áƒ¡áƒ”ბული ყველრმáƒáƒœáƒáƒªáƒ”მის წáƒáƒ¨áƒšáƒ ძáƒáƒšáƒ˜áƒáƒœ ბევრჯერ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ პáƒáƒ áƒáƒšáƒ˜áƒ¡ შეყვáƒáƒœáƒ˜áƒ¡ შემთხვევáƒáƒ¨áƒ˜."</string>
+ <string name="policylab_resetPassword" msgid="2620077191242688955">"ეკრáƒáƒœáƒ˜áƒ¡ გáƒáƒœáƒ‘ლáƒáƒ™áƒ•ის პáƒáƒ áƒáƒšáƒ˜áƒ¡ შეცვლáƒ"</string>
+ <string name="policydesc_resetPassword" msgid="605963962301904458">"შეცვáƒáƒšáƒ”თ ეკრáƒáƒœáƒ˜áƒ¡ გáƒáƒœáƒ‘ლáƒáƒ™áƒ•ის პáƒáƒ áƒáƒšáƒ˜."</string>
+ <string name="policylab_forceLock" msgid="2274085384704248431">"ეკრáƒáƒœáƒ˜áƒ¡ დáƒáƒ‘ლáƒáƒ™áƒ•áƒ"</string>
+ <string name="policydesc_forceLock" msgid="1141797588403827138">"გáƒáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ”თ, რáƒáƒ’áƒáƒ  დრრáƒáƒ“ის დáƒáƒ˜áƒ‘ლáƒáƒ™áƒáƒ¡ ეკრáƒáƒœáƒ˜."</string>
+ <string name="policylab_wipeData" msgid="3910545446758639713">"ყველრმáƒáƒœáƒáƒªáƒ”მის წáƒáƒ¨áƒšáƒ"</string>
+ <string name="policydesc_wipeData" product="tablet" msgid="4306184096067756876">"ტáƒáƒ‘ლეტის მáƒáƒœáƒáƒªáƒ”მების გáƒáƒ£áƒ¤áƒ áƒ—ხილებლáƒáƒ“ წáƒáƒ¨áƒšáƒ, ქáƒáƒ áƒ®áƒœáƒ£áƒšáƒ˜ მáƒáƒœáƒáƒªáƒ”მების áƒáƒ¦áƒ“გენით"</string>
+ <string name="policydesc_wipeData" product="default" msgid="5096895604574188391">"ტელეფáƒáƒœáƒ˜áƒ¡ მáƒáƒœáƒáƒªáƒ”მების გáƒáƒ£áƒ¤áƒ áƒ—ხილებლáƒáƒ“ წáƒáƒ¨áƒšáƒ, ქáƒáƒ áƒ®áƒœáƒ£áƒšáƒ˜ მáƒáƒœáƒáƒªáƒ”მების áƒáƒ¦áƒ“გენით"</string>
+ <string name="policylab_setGlobalProxy" msgid="2784828293747791446">"მáƒáƒ¬áƒ§áƒáƒ‘ილáƒáƒ‘ის გლáƒáƒ‘áƒáƒšáƒ£áƒ áƒ˜ პრáƒáƒ¥áƒ¡áƒ˜áƒ¡ დáƒáƒ§áƒ”ნებáƒ"</string>
+ <string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"დáƒáƒáƒ§áƒ”ნეთ მáƒáƒ¬áƒ§áƒáƒ‘ილáƒáƒ‘რგლáƒáƒ‘áƒáƒšáƒ£áƒ  პრáƒáƒ¥áƒ¡áƒ˜áƒ¡ სერვერის გáƒáƒ›áƒáƒ¡áƒáƒ§áƒ”ნებლáƒáƒ“, რáƒáƒ“ესáƒáƒª დებულებრგáƒáƒáƒ¥áƒ¢áƒ˜áƒ£áƒ áƒ”ბულიáƒ. მხáƒáƒšáƒáƒ“ მáƒáƒ¬áƒ§áƒáƒ‘ილáƒáƒ‘ის პირველი áƒáƒ“მინი áƒáƒ§áƒ”ნებს ეფექტურ გლáƒáƒ‘áƒáƒšáƒ£áƒ  პრáƒáƒ¥áƒ¡áƒ˜ სერვერს."</string>
+ <string name="policylab_expirePassword" msgid="885279151847254056">"ეკრáƒáƒœáƒ˜áƒ¡ პáƒáƒ áƒáƒšáƒ˜áƒ¡ ვáƒáƒ“ის დáƒáƒ§áƒ”ნებáƒ"</string>
+ <string name="policydesc_expirePassword" msgid="1729725226314691591">"გáƒáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ”თ, თუ რáƒáƒ›áƒ“ენáƒáƒ“ ხშირáƒáƒ“ უნდრშეიცვáƒáƒšáƒáƒ¡ ეკრáƒáƒœáƒ˜áƒ¡ დáƒáƒ‘ლáƒáƒ™áƒ•ის პáƒáƒ áƒáƒšáƒ˜."</string>
+ <string name="policylab_encryptedStorage" msgid="8901326199909132915">"მეხსიერების დáƒáƒ¨áƒ˜áƒ¤áƒ áƒ•ის დáƒáƒ§áƒ”ნებáƒ"</string>
+ <string name="policydesc_encryptedStorage" msgid="2637732115325316992">"სáƒáƒ­áƒ˜áƒ áƒáƒ შენáƒáƒ®áƒ£áƒšáƒ˜ áƒáƒžáƒ˜áƒ¡ მáƒáƒœáƒáƒªáƒ”მების დáƒáƒ¨áƒ˜áƒ¤áƒ áƒ•áƒ."</string>
+ <string name="policylab_disableCamera" msgid="6395301023152297826">"კáƒáƒ›áƒ”რების გáƒáƒ—იშვáƒ"</string>
+ <string name="policydesc_disableCamera" msgid="2306349042834754597">"მáƒáƒ¬áƒ§áƒáƒ‘ილáƒáƒ‘ის კáƒáƒ›áƒ”რების გáƒáƒ›áƒáƒ§áƒ”ნების áƒáƒ¦áƒ™áƒ•ეთáƒ."</string>
+ <string name="policylab_disableKeyguardFeatures" msgid="266329104542638802">"დáƒáƒ‘ლáƒáƒ™áƒ•ის ფუნქციების გáƒáƒ—იშვáƒ"</string>
+ <string name="policydesc_disableKeyguardFeatures" msgid="3467082272186534614">"დáƒáƒ‘ლáƒáƒ™áƒ•ისáƒáƒ¡ ზáƒáƒ’იერთი ფუნქციის გáƒáƒ›áƒáƒ§áƒ”ნების თáƒáƒ•იდáƒáƒœ áƒáƒªáƒ˜áƒšáƒ”ბáƒ."</string>
+ <string-array name="phoneTypes">
+ <item msgid="8901098336658710359">"სáƒáƒ®áƒšáƒ˜"</item>
+ <item msgid="869923650527136615">"მáƒáƒ‘ილური"</item>
+ <item msgid="7897544654242874543">"სáƒáƒ›áƒ¡áƒáƒ®áƒ£áƒ áƒ˜"</item>
+ <item msgid="1103601433382158155">"სáƒáƒ›áƒ¡áƒáƒ®áƒ£áƒ áƒ˜áƒ¡ ფáƒáƒ¥áƒ¡áƒ˜"</item>
+ <item msgid="1735177144948329370">"სáƒáƒ®áƒšáƒ˜áƒ¡ ფáƒáƒ¥áƒ¡áƒ˜"</item>
+ <item msgid="603878674477207394">"პეიჯერი"</item>
+ <item msgid="1650824275177931637">"სხვáƒ"</item>
+ <item msgid="9192514806975898961">"მáƒáƒ áƒ’ებული"</item>
+ </string-array>
+ <string-array name="emailAddressTypes">
+ <item msgid="8073994352956129127">"სáƒáƒ®áƒšáƒ˜"</item>
+ <item msgid="7084237356602625604">"სáƒáƒ›áƒ¡áƒáƒ®áƒ£áƒ áƒ˜"</item>
+ <item msgid="1112044410659011023">"სხვáƒ"</item>
+ <item msgid="2374913952870110618">"მáƒáƒ áƒ’ებული"</item>
+ </string-array>
+ <string-array name="postalAddressTypes">
+ <item msgid="6880257626740047286">"სáƒáƒ®áƒšáƒ˜"</item>
+ <item msgid="5629153956045109251">"სáƒáƒ›áƒ¡áƒáƒ®áƒ£áƒ áƒ˜"</item>
+ <item msgid="4966604264500343469">"სხვáƒ"</item>
+ <item msgid="4932682847595299369">"მáƒáƒ áƒ’ებული"</item>
+ </string-array>
+ <string-array name="imAddressTypes">
+ <item msgid="1738585194601476694">"სáƒáƒ®áƒšáƒ˜"</item>
+ <item msgid="1359644565647383708">"სáƒáƒ›áƒ¡áƒáƒ®áƒ£áƒ áƒ˜"</item>
+ <item msgid="7868549401053615677">"სხვáƒ"</item>
+ <item msgid="3145118944639869809">"მáƒáƒ áƒ’ებული"</item>
+ </string-array>
+ <string-array name="organizationTypes">
+ <item msgid="7546335612189115615">"სáƒáƒ›áƒ¡áƒáƒ®áƒ£áƒ áƒ˜"</item>
+ <item msgid="4378074129049520373">"სხვáƒ"</item>
+ <item msgid="3455047468583965104">"მáƒáƒ áƒ’ებული"</item>
+ </string-array>
+ <string-array name="imProtocols">
+ <item msgid="8595261363518459565">"AIM"</item>
+ <item msgid="7390473628275490700">"Windows Live"</item>
+ <item msgid="7882877134931458217">"Yahoo"</item>
+ <item msgid="5035376313200585242">"Skype"</item>
+ <item msgid="7532363178459444943">"QQ"</item>
+ <item msgid="3713441034299660749">"Google Talk"</item>
+ <item msgid="2506857312718630823">"ICQ"</item>
+ <item msgid="1648797903785279353">"Jabber"</item>
+ </string-array>
+ <string name="phoneTypeCustom" msgid="1644738059053355820">"მáƒáƒ áƒ’ებული"</string>
+ <string name="phoneTypeHome" msgid="2570923463033985887">"სáƒáƒ®áƒšáƒ˜"</string>
+ <string name="phoneTypeMobile" msgid="6501463557754751037">"მáƒáƒ‘ილური"</string>
+ <string name="phoneTypeWork" msgid="8863939667059911633">"სáƒáƒ›áƒ¡áƒáƒ®áƒ£áƒ áƒ˜"</string>
+ <string name="phoneTypeFaxWork" msgid="3517792160008890912">"სáƒáƒ›áƒ¡áƒáƒ®áƒ£áƒ áƒ˜áƒ¡ ფáƒáƒ¥áƒ¡áƒ˜"</string>
+ <string name="phoneTypeFaxHome" msgid="2067265972322971467">"სáƒáƒ®áƒšáƒ˜áƒ¡ ფáƒáƒ¥áƒ¡áƒ˜"</string>
+ <string name="phoneTypePager" msgid="7582359955394921732">"პეიჯერი"</string>
+ <string name="phoneTypeOther" msgid="1544425847868765990">"სხვáƒ"</string>
+ <string name="phoneTypeCallback" msgid="2712175203065678206">"გáƒáƒ“მáƒáƒ¡áƒáƒ áƒ”კი"</string>
+ <string name="phoneTypeCar" msgid="8738360689616716982">"მáƒáƒœáƒ¥áƒáƒœáƒ"</string>
+ <string name="phoneTypeCompanyMain" msgid="540434356461478916">"კáƒáƒ›áƒžáƒáƒœáƒ˜áƒ˜áƒ¡ ძირ. ნáƒáƒ›áƒ”რი"</string>
+ <string name="phoneTypeIsdn" msgid="8022453193171370337">"ISDN"</string>
+ <string name="phoneTypeMain" msgid="6766137010628326916">"მთáƒáƒ•áƒáƒ áƒ˜"</string>
+ <string name="phoneTypeOtherFax" msgid="8587657145072446565">"სხვრფáƒáƒ¥áƒ¡áƒ˜"</string>
+ <string name="phoneTypeRadio" msgid="4093738079908667513">"რáƒáƒ“იáƒ"</string>
+ <string name="phoneTypeTelex" msgid="3367879952476250512">"Telex"</string>
+ <string name="phoneTypeTtyTdd" msgid="8606514378585000044">"TTY TDD"</string>
+ <string name="phoneTypeWorkMobile" msgid="1311426989184065709">"სáƒáƒ›áƒ¡áƒáƒ®áƒ£áƒ áƒ˜áƒ¡ მáƒáƒ‘ილური"</string>
+ <string name="phoneTypeWorkPager" msgid="649938731231157056">"სáƒáƒ›áƒ£áƒ¨áƒáƒ პეიჯერი"</string>
+ <string name="phoneTypeAssistant" msgid="5596772636128562884">"დáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”"</string>
+ <string name="phoneTypeMms" msgid="7254492275502768992">"MMS"</string>
+ <string name="eventTypeCustom" msgid="7837586198458073404">"მáƒáƒ áƒ’ებული"</string>
+ <string name="eventTypeBirthday" msgid="2813379844211390740">"დáƒáƒ‘áƒáƒ“ების დღე"</string>
+ <string name="eventTypeAnniversary" msgid="3876779744518284000">"იუბილე"</string>
+ <string name="eventTypeOther" msgid="7388178939010143077">"სხვáƒ"</string>
+ <string name="emailTypeCustom" msgid="8525960257804213846">"მáƒáƒ áƒ’ებული"</string>
+ <string name="emailTypeHome" msgid="449227236140433919">"სáƒáƒ®áƒšáƒ˜"</string>
+ <string name="emailTypeWork" msgid="3548058059601149973">"სáƒáƒ›áƒ¡áƒáƒ®áƒ£áƒ áƒ˜"</string>
+ <string name="emailTypeOther" msgid="2923008695272639549">"სხვáƒ"</string>
+ <string name="emailTypeMobile" msgid="119919005321166205">"მáƒáƒ‘ილური"</string>
+ <string name="postalTypeCustom" msgid="8903206903060479902">"მáƒáƒ áƒ’ებული"</string>
+ <string name="postalTypeHome" msgid="8165756977184483097">"სáƒáƒ®áƒšáƒ˜"</string>
+ <string name="postalTypeWork" msgid="5268172772387694495">"სáƒáƒ›áƒ¡áƒáƒ®áƒ£áƒ áƒ˜"</string>
+ <string name="postalTypeOther" msgid="2726111966623584341">"სხვáƒ"</string>
+ <string name="imTypeCustom" msgid="2074028755527826046">"მáƒáƒ áƒ’ებული"</string>
+ <string name="imTypeHome" msgid="6241181032954263892">"სáƒáƒ®áƒšáƒ˜"</string>
+ <string name="imTypeWork" msgid="1371489290242433090">"სáƒáƒ›áƒ¡áƒáƒ®áƒ£áƒ áƒ˜"</string>
+ <string name="imTypeOther" msgid="5377007495735915478">"სხვáƒ"</string>
+ <string name="imProtocolCustom" msgid="6919453836618749992">"მáƒáƒ áƒ’ებული"</string>
+ <string name="imProtocolAim" msgid="7050360612368383417">"AIM"</string>
+ <string name="imProtocolMsn" msgid="144556545420769442">"Windows Live"</string>
+ <string name="imProtocolYahoo" msgid="8271439408469021273">"Yahoo"</string>
+ <string name="imProtocolSkype" msgid="9019296744622832951">"Skype"</string>
+ <string name="imProtocolQq" msgid="8887484379494111884">"QQ"</string>
+ <string name="imProtocolGoogleTalk" msgid="493902321140277304">"Hangouts"</string>
+ <string name="imProtocolIcq" msgid="1574870433606517315">"ICQ"</string>
+ <string name="imProtocolJabber" msgid="2279917630875771722">"Jabber"</string>
+ <string name="imProtocolNetMeeting" msgid="8287625655986827971">"Netmeeting"</string>
+ <string name="orgTypeWork" msgid="29268870505363872">"სáƒáƒ›áƒ¡áƒáƒ®áƒ£áƒ áƒ˜"</string>
+ <string name="orgTypeOther" msgid="3951781131570124082">"სხვáƒ"</string>
+ <string name="orgTypeCustom" msgid="225523415372088322">"მáƒáƒ áƒ’ებული"</string>
+ <string name="relationTypeCustom" msgid="3542403679827297300">"მáƒáƒ áƒ’ებული"</string>
+ <string name="relationTypeAssistant" msgid="6274334825195379076">"áƒáƒ¡áƒ˜áƒ¡áƒ¢áƒ”ნტი"</string>
+ <string name="relationTypeBrother" msgid="8757913506784067713">"ძმáƒ"</string>
+ <string name="relationTypeChild" msgid="1890746277276881626">"შვილი"</string>
+ <string name="relationTypeDomesticPartner" msgid="6904807112121122133">"სáƒáƒáƒ¯áƒáƒ®áƒ პáƒáƒ áƒ¢áƒœáƒ˜áƒáƒ áƒ˜"</string>
+ <string name="relationTypeFather" msgid="5228034687082050725">"მáƒáƒ›áƒ"</string>
+ <string name="relationTypeFriend" msgid="7313106762483391262">"მეგáƒáƒ‘áƒáƒ áƒ˜"</string>
+ <string name="relationTypeManager" msgid="6365677861610137895">"მენეჯერი"</string>
+ <string name="relationTypeMother" msgid="4578571352962758304">"დედáƒ"</string>
+ <string name="relationTypeParent" msgid="4755635567562925226">"მშáƒáƒ‘ელი"</string>
+ <string name="relationTypePartner" msgid="7266490285120262781">"პáƒáƒ áƒ¢áƒœáƒ˜áƒáƒ áƒ˜"</string>
+ <string name="relationTypeReferredBy" msgid="101573059844135524">"რეკáƒáƒ›áƒ”ნდáƒáƒ¢áƒáƒ áƒ˜:"</string>
+ <string name="relationTypeRelative" msgid="1799819930085610271">"ნáƒáƒ—ესáƒáƒ•ი"</string>
+ <string name="relationTypeSister" msgid="1735983554479076481">"დáƒ"</string>
+ <string name="relationTypeSpouse" msgid="394136939428698117">"მეუღლე"</string>
+ <string name="sipAddressTypeCustom" msgid="2473580593111590945">"მáƒáƒ áƒ’ებული"</string>
+ <string name="sipAddressTypeHome" msgid="6093598181069359295">"სáƒáƒ®áƒšáƒ˜"</string>
+ <string name="sipAddressTypeWork" msgid="6920725730797099047">"სáƒáƒ›áƒ¡áƒáƒ®áƒ£áƒ áƒ˜"</string>
+ <string name="sipAddressTypeOther" msgid="4408436162950119849">"სხვáƒ"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"áƒáƒ™áƒ áƒ˜áƒ¤áƒ”თ PIN კáƒáƒ“ი"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"დáƒáƒ‘ეჭდეთ PUK კáƒáƒ“ი დრáƒáƒ®áƒáƒšáƒ˜ PIN კáƒáƒ“ი."</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"PUK კáƒáƒ“ი"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"áƒáƒ®áƒáƒšáƒ˜ PIN კáƒáƒ“ი"</string>
+ <string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384">"შეეხეთ "<font size="17">"-ს პáƒáƒ áƒáƒšáƒ˜áƒ¡"</font>" დáƒáƒ¡áƒáƒ‘ეჭდáƒáƒ“."</string>
+ <string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"გáƒáƒœáƒ¡áƒáƒ‘ლáƒáƒ™áƒáƒ“ áƒáƒ™áƒ áƒ˜áƒ¤áƒ”თ პáƒáƒ áƒáƒšáƒ˜"</string>
+ <string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"გáƒáƒœáƒ¡áƒáƒ‘ლáƒáƒ™áƒáƒ“ áƒáƒ™áƒ áƒ˜áƒ¤áƒ”თ PIN კáƒáƒ“ი"</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ PIN კáƒáƒ“ი."</string>
+ <string name="keyguard_label_text" msgid="861796461028298424">"გáƒáƒœáƒ‘ლáƒáƒ™áƒ•ისáƒáƒ—ვის დáƒáƒáƒ­áƒ˜áƒ áƒ”თ მენიუს დრშემდეგ 0-ს."</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"გáƒáƒ“áƒáƒ£áƒ“ებელი დáƒáƒ®áƒ›áƒáƒ áƒ”ბის ნáƒáƒ›áƒ áƒ”ბი"</string>
+ <string name="lockscreen_carrier_default" msgid="8963839242565653192">"სერვისი áƒáƒ  áƒáƒ áƒ˜áƒ¡."</string>
+ <string name="lockscreen_screen_locked" msgid="7288443074806832904">"ეკრáƒáƒœáƒ˜ დáƒáƒ‘ლáƒáƒ™áƒ˜áƒšáƒ˜áƒ."</string>
+ <string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"გáƒáƒœáƒ‘ლáƒáƒ™áƒ•ისთვის áƒáƒœ გáƒáƒ“áƒáƒ£áƒ“ებელი ზáƒáƒ áƒ˜áƒ¡áƒ—ვის დáƒáƒáƒ­áƒ˜áƒ áƒ”თ მენიუს."</string>
+ <string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"გáƒáƒœáƒ‘ლáƒáƒ™áƒ•ისთვის დáƒáƒáƒ­áƒ˜áƒ áƒ”თ მენიუს."</string>
+ <string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"გáƒáƒœáƒ¡áƒáƒ‘ლáƒáƒ™áƒáƒ“ დáƒáƒ®áƒáƒ¢áƒ”თ ნიმუში"</string>
+ <string name="lockscreen_emergency_call" msgid="5347633784401285225">"გáƒáƒ“áƒáƒ£áƒ“ებელი ზáƒáƒ áƒ˜"</string>
+ <string name="lockscreen_return_to_call" msgid="5244259785500040021">"ზáƒáƒ áƒ–ე დáƒáƒ‘რუნებáƒ"</string>
+ <string name="lockscreen_pattern_correct" msgid="9039008650362261237">"სწáƒáƒ áƒ˜áƒ!"</string>
+ <string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"კიდევ სცáƒáƒ“ეთ"</string>
+ <string name="lockscreen_password_wrong" msgid="5737815393253165301">"კიდევ სცáƒáƒ“ეთ"</string>
+ <string name="faceunlock_multiple_failures" msgid="754137583022792429">"სáƒáƒ®áƒ˜áƒ¡ áƒáƒ›áƒáƒªáƒœáƒáƒ‘ით გáƒáƒœáƒ‘ლáƒáƒ™áƒ•ის მცდელáƒáƒ‘áƒáƒ› დáƒáƒ¨áƒ•ებულ რáƒáƒáƒ“ენáƒáƒ‘áƒáƒ¡ გáƒáƒ“áƒáƒáƒ­áƒáƒ áƒ‘áƒ"</string>
+ <string name="lockscreen_plugged_in" msgid="8057762828355572315">"დáƒáƒ›áƒ£áƒ®áƒ¢áƒ•áƒ, <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+ <string name="lockscreen_charged" msgid="321635745684060624">"დáƒáƒ›áƒ£áƒ®áƒ¢áƒ£áƒšáƒ˜áƒ"</string>
+ <string name="lockscreen_battery_short" msgid="4477264849386850266">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+ <string name="lockscreen_low_battery" msgid="1482873981919249740">"შეáƒáƒ”რთეთ დáƒáƒ›áƒ¢áƒ”ნი."</string>
+ <string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"SIM ბáƒáƒ áƒáƒ—ი áƒáƒ  áƒáƒ áƒ˜áƒ¡"</string>
+ <string name="lockscreen_missing_sim_message" product="tablet" msgid="151659196095791474">"ტáƒáƒ‘ლეტში áƒáƒ  დევს SIM ბáƒáƒ áƒáƒ—ი."</string>
+ <string name="lockscreen_missing_sim_message" product="default" msgid="2186920585695169078">"áƒáƒ  áƒáƒ áƒ˜áƒ¡ SIM ბáƒáƒ áƒáƒ—ი ტელეფáƒáƒœáƒ¨áƒ˜."</string>
+ <string name="lockscreen_missing_sim_instructions" msgid="5372787138023272615">"ჩáƒáƒ“ეთ SIM ბáƒáƒ áƒáƒ—ი."</string>
+ <string name="lockscreen_missing_sim_instructions_long" msgid="3526573099019319472">"SIM ბáƒáƒ áƒáƒ—ი áƒáƒ  áƒáƒ áƒ˜áƒ¡ áƒáƒœ áƒáƒ  იკითხებáƒ. ჩáƒáƒ“ეთ SIM ბáƒáƒ áƒáƒ—ი."</string>
+ <string name="lockscreen_permanent_disabled_sim_message_short" msgid="5096149665138916184">"áƒáƒ áƒáƒ›áƒáƒ®áƒ›áƒáƒ áƒ”ბáƒáƒ“ი SIM ბáƒáƒ áƒáƒ—ი."</string>
+ <string name="lockscreen_permanent_disabled_sim_instructions" msgid="910904643433151371">"თქვენი SIM ბáƒáƒ áƒáƒ—ი გáƒáƒ›áƒ£áƒ“მებით გáƒáƒ›áƒáƒ áƒ—ული იყáƒ.\n დáƒáƒ£áƒ™áƒáƒ•შირდით თქვენი უკáƒáƒ‘ელრსერვისის პრáƒáƒ•áƒáƒ˜áƒ“ერს სხვრSIM ბáƒáƒ áƒáƒ—ისთვის."</string>
+ <string name="lockscreen_transport_prev_description" msgid="201594905152746886">"წინრჩáƒáƒœáƒáƒ¬áƒ”რი"</string>
+ <string name="lockscreen_transport_next_description" msgid="6089297650481292363">"შემდეგი ჩáƒáƒœáƒáƒ¬áƒ”რი"</string>
+ <string name="lockscreen_transport_pause_description" msgid="7659088786780128001">"პáƒáƒ£áƒ–áƒ"</string>
+ <string name="lockscreen_transport_play_description" msgid="5888422938351019426">"დáƒáƒ™áƒ•რის ღილáƒáƒ™áƒ˜"</string>
+ <string name="lockscreen_transport_stop_description" msgid="4562318378766987601">"შეწყვეტáƒ"</string>
+ <string name="emergency_calls_only" msgid="6733978304386365407">"მხáƒáƒšáƒáƒ“ გáƒáƒ“áƒáƒ£áƒ“ებელი დáƒáƒ®áƒ›áƒáƒ áƒ”ბის ზáƒáƒ áƒ”ბი"</string>
+ <string name="lockscreen_network_locked_message" msgid="143389224986028501">"ქსელი ჩáƒáƒ™áƒ”ტილიáƒ"</string>
+ <string name="lockscreen_sim_puk_locked_message" msgid="7441797339976230">"SIM ბáƒáƒ áƒáƒ—ი áƒáƒ áƒ˜áƒ¡ PUK-ით დáƒáƒ‘ლáƒáƒ™áƒ˜áƒšáƒ˜."</string>
+ <string name="lockscreen_sim_puk_locked_instructions" msgid="8127916255245181063">"იხილეთ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლმძღვáƒáƒœáƒ”ლრáƒáƒœ დáƒáƒ£áƒ™áƒáƒ•შირდით კლიენტების მáƒáƒ›áƒ¡áƒáƒ®áƒ£áƒ áƒ”ბáƒáƒ¡."</string>
+ <string name="lockscreen_sim_locked_message" msgid="8066660129206001039">"SIM ბáƒáƒ áƒáƒ—ი დáƒáƒ‘ლáƒáƒ™áƒ˜áƒšáƒ˜áƒ."</string>
+ <string name="lockscreen_sim_unlock_progress_dialog_message" msgid="595323214052881264">"SIM ბáƒáƒ áƒáƒ—ის გáƒáƒœáƒ‘ლáƒáƒ™áƒ•áƒâ€¦"</string>
+ <string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="6481623830344107222">"თქვენ <xliff:g id="NUMBER_0">%d</xliff:g>-ჯერ დáƒáƒ®áƒáƒ¢áƒ”თ გáƒáƒœáƒ‘ლáƒáƒ™áƒ•ის ნიმუში. \n\nსცáƒáƒ“ეთ ხელáƒáƒ®áƒšáƒ <xliff:g id="NUMBER_1">%d</xliff:g> წáƒáƒ›áƒ¨áƒ˜."</string>
+ <string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="2725973286239344555">"თქვენ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒáƒ“ დáƒáƒ‘ეჭდეთ თქვენი პáƒáƒ áƒáƒšáƒ˜ <xliff:g id="NUMBER_0">%d</xliff:g> ჯერ. \n\nხელáƒáƒ®áƒšáƒ სცáƒáƒ“ეთ <xliff:g id="NUMBER_1">%d</xliff:g> წáƒáƒ›áƒ¨áƒ˜."</string>
+ <string name="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="6216672706545696955">"თქვენ <xliff:g id="NUMBER_0">%d</xliff:g>-ჯერ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒáƒ“ შეიყვáƒáƒœáƒ”თ PIN კáƒáƒ“ი. \n\nსცáƒáƒ“ეთ ხელáƒáƒ®áƒšáƒ <xliff:g id="NUMBER_1">%d</xliff:g> წáƒáƒ›áƒ¨áƒ˜."</string>
+ <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="9191611984625460820">"თქვენ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒáƒ“ დáƒáƒ®áƒáƒ¢áƒ”თ გáƒáƒœáƒ‘ლáƒáƒ™áƒ•ის ნიმუში <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_failed_attempts_almost_glogin" product="default" msgid="2590227559763762751">"თქვენ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒáƒ“ დáƒáƒ®áƒáƒ¢áƒ”თ გáƒáƒœáƒ‘ლáƒáƒ™áƒ•ის ნიმუში <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_failed_attempts_almost_at_wipe" product="tablet" msgid="6128106399745755604">"თქვენ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒáƒ“ სცáƒáƒ“ეთ ტáƒáƒ‘ლეტის გáƒáƒœáƒ‘ლáƒáƒ™áƒ•რ<xliff:g id="NUMBER_0">%d</xliff:g>-ჯერ. კიდევ <xliff:g id="NUMBER_1">%d</xliff:g> წáƒáƒ áƒ£áƒ›áƒáƒ¢áƒ”ბელი ცდის შემდეგ ტáƒáƒ‘ლეტზე დáƒáƒ§áƒ”ნდებრსáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜, ქáƒáƒ áƒ®áƒœáƒ£áƒšáƒ˜ პáƒáƒ áƒáƒ›áƒ”ტრები დრმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ყველრმáƒáƒœáƒáƒªáƒ”მი დáƒáƒ˜áƒ™áƒáƒ áƒ’ებáƒ."</string>
+ <string name="lockscreen_failed_attempts_almost_at_wipe" product="default" msgid="8603565142156826565">"თქვენ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒáƒ“ სცáƒáƒ“ეთ ტელეფáƒáƒœáƒ˜áƒ¡ გáƒáƒœáƒ‘ლáƒáƒ™áƒ•რ<xliff:g id="NUMBER_0">%d</xliff:g> ჯერ. კიდევ <xliff:g id="NUMBER_1">%d</xliff:g> წáƒáƒ áƒ£áƒ›áƒáƒ¢áƒ”ბელი ცდის შემდეგ ტელეფáƒáƒœáƒ–ე დáƒáƒ§áƒ”ნდებრსáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜, ქáƒáƒ áƒ®áƒœáƒ£áƒšáƒ˜ პáƒáƒ áƒáƒ›áƒ”ტრები დრმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ყველრმáƒáƒœáƒáƒªáƒ”მი დáƒáƒ˜áƒ™áƒáƒ áƒ’ებáƒ."</string>
+ <string name="lockscreen_failed_attempts_now_wiping" product="tablet" msgid="280873516493934365">"თქვენ <xliff:g id="NUMBER">%d</xliff:g>-ჯერ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒáƒ“ სცáƒáƒ“ეთ ტáƒáƒ‘ლეტის გáƒáƒœáƒ‘ლáƒáƒ™áƒ•áƒ. áƒáƒ›áƒ˜áƒ¢áƒáƒ› ტáƒáƒ‘ლეტზე დáƒáƒ“გებრსáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜, ქáƒáƒ áƒ®áƒœáƒ£áƒšáƒ˜ პáƒáƒ áƒáƒ›áƒ”ტრები."</string>
+ <string name="lockscreen_failed_attempts_now_wiping" product="default" msgid="3025504721764922246">"თქვენ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒáƒ“ სცáƒáƒ“ეთ ტელეფáƒáƒœáƒ˜áƒ¡ გáƒáƒœáƒ‘ლáƒáƒ™áƒ•რ<xliff:g id="NUMBER">%d</xliff:g> ჯერ. áƒáƒ®áƒšáƒ ტელეფáƒáƒœáƒ–ე დáƒáƒ§áƒ”ნდებრსáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜, ქáƒáƒ áƒ®áƒœáƒ£áƒšáƒ˜ პáƒáƒ áƒáƒ›áƒ”ტრები."</string>
+ <string name="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"კიდევ სცáƒáƒ“ეთ <xliff:g id="NUMBER">%d</xliff:g> წáƒáƒ›áƒ¨áƒ˜."</string>
+ <string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"დáƒáƒ’áƒáƒ•იწყდáƒáƒ— ნიმუში?"</string>
+ <string name="lockscreen_glogin_forgot_pattern" msgid="2588521501166032747">"áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜áƒ— გáƒáƒœáƒ‘ლáƒáƒ™áƒ•áƒ"</string>
+ <string name="lockscreen_glogin_too_many_attempts" msgid="2751368605287288808">"ნáƒáƒ®áƒáƒ¢áƒ˜ ნიმუშის ძáƒáƒšáƒ˜áƒáƒœ ბევრი მცდელáƒáƒ‘áƒ"</string>
+ <string name="lockscreen_glogin_instructions" msgid="3931816256100707784">"გáƒáƒœáƒ‘ლáƒáƒ™áƒ•ისთვის გáƒáƒ˜áƒáƒ áƒ”თ áƒáƒ•ტáƒáƒ áƒ˜áƒ–áƒáƒªáƒ˜áƒ თქვენი Google áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜áƒ—."</string>
+ <string name="lockscreen_glogin_username_hint" msgid="8846881424106484447">"მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი (ელფáƒáƒ¡áƒ¢áƒ)"</string>
+ <string name="lockscreen_glogin_password_hint" msgid="5958028383954738528">"პáƒáƒ áƒáƒšáƒ˜"</string>
+ <string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"შესვლáƒ"</string>
+ <string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სáƒáƒ®áƒ”ლი áƒáƒœ პáƒáƒ áƒáƒšáƒ˜"</string>
+ <string name="lockscreen_glogin_account_recovery_hint" msgid="1696924763690379073">"დáƒáƒ’áƒáƒ•იწყდáƒáƒ— მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი დრპáƒáƒ áƒáƒšáƒ˜?\nეწვიეთ ბმულს "<b>"google.com/accounts/recovery"</b>"."</string>
+ <string name="lockscreen_glogin_checking_password" msgid="7114627351286933867">"შემáƒáƒ¬áƒ›áƒ”ბáƒ..."</string>
+ <string name="lockscreen_unlock_label" msgid="737440483220667054">"გáƒáƒœáƒ‘ლáƒáƒ™áƒ•áƒ"</string>
+ <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"ხმების ჩáƒáƒ áƒ—ვáƒ"</string>
+ <string name="lockscreen_sound_off_label" msgid="996822825154319026">"ხმის გáƒáƒ›áƒáƒ áƒ—ვáƒ"</string>
+ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"ნიმუშის შექმნრდáƒáƒ¬áƒ§áƒ”ბულიáƒ"</string>
+ <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"ნიმუში წáƒáƒ˜áƒ¨áƒáƒšáƒ"</string>
+ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"უჯრედი დáƒáƒ”მáƒáƒ¢áƒ."</string>
+ <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"ნიმუშის შექმნრდáƒáƒ¡áƒ áƒ£áƒšáƒ”ბულიáƒ"</string>
+ <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. ვიჯეტი %2$d of %3$d."</string>
+ <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"ვიჯეტის დáƒáƒ›áƒáƒ¢áƒ”ბáƒ"</string>
+ <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"ცáƒáƒ áƒ˜áƒ”ლი"</string>
+ <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"გáƒáƒœáƒ‘ლáƒáƒ™áƒ•ის სივრცე გáƒáƒ¨áƒšáƒ˜áƒšáƒ˜áƒ."</string>
+ <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"გáƒáƒœáƒ‘ლáƒáƒ™áƒ•ის სივრცე ჩáƒáƒ™áƒ”ცილიáƒ."</string>
+ <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> ვიჯეტი."</string>
+ <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის áƒáƒ›áƒáƒ›áƒ áƒ©áƒ”ველი"</string>
+ <string name="keyguard_accessibility_status" msgid="8008264603935930611">"სტáƒáƒ¢áƒ£áƒ¡áƒ˜"</string>
+ <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"კáƒáƒ›áƒ”რáƒ"</string>
+ <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"მედიის მáƒáƒ áƒ—ვის ელემენტები"</string>
+ <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"დáƒáƒ˜áƒ¬áƒ§áƒ ვიჯეტის ხელáƒáƒ®áƒšáƒ გáƒáƒœáƒšáƒáƒ’ებáƒ."</string>
+ <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"ვიჯეტების გáƒáƒ“áƒáƒ®áƒáƒ áƒ˜áƒ¡áƒ®áƒ”ბრდáƒáƒ¡áƒ áƒ£áƒšáƒ”ბულიáƒ."</string>
+ <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"ვიჯეტი <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> წáƒáƒ˜áƒ¨áƒáƒšáƒ."</string>
+ <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"გáƒáƒœáƒ‘ლáƒáƒ™áƒ•ის სივრცის გáƒáƒ¨áƒšáƒ."</string>
+ <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"გáƒáƒ¡áƒ áƒ˜áƒáƒšáƒ”ბით გáƒáƒœáƒ‘ლáƒáƒ™áƒ•áƒ"</string>
+ <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"გáƒáƒœáƒ‘ლáƒáƒ™áƒ•რნიმუშით."</string>
+ <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"გáƒáƒœáƒ‘ლáƒáƒ™áƒ•რსáƒáƒ®áƒ˜áƒ—"</string>
+ <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"გáƒáƒœáƒ‘ლáƒáƒ™áƒ•რPin-ით."</string>
+ <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"პáƒáƒ áƒáƒšáƒ˜áƒ¡ გáƒáƒœáƒ‘ლáƒáƒ™áƒ•áƒ"</string>
+ <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"ნიმუშების სივრცე."</string>
+ <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"გáƒáƒ“áƒáƒ¡áƒ áƒ˜áƒáƒšáƒ”ბის სივრცე."</string>
+ <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
+ <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
+ <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
+ <string name="granularity_label_character" msgid="7336470535385009523">"სიმბáƒáƒšáƒ"</string>
+ <string name="granularity_label_word" msgid="7075570328374918660">"სიტყვáƒ"</string>
+ <string name="granularity_label_link" msgid="5815508880782488267">"ბმული"</string>
+ <string name="granularity_label_line" msgid="5764267235026120888">"სტრიქáƒáƒœáƒ˜"</string>
+ <string name="hour_ampm" msgid="4584338083529355982">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
+ <string name="hour_cap_ampm" msgid="2083465992940444366">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
+ <string name="factorytest_failed" msgid="5410270329114212041">"წáƒáƒ áƒ›áƒáƒ”ბის ტესტი ვერ გáƒáƒœáƒ®áƒáƒ áƒªáƒ˜áƒ”ლდáƒ"</string>
+ <string name="factorytest_not_system" msgid="4435201656767276723">"áƒáƒ¥áƒ¢áƒ˜áƒ•áƒáƒ‘რFACTORY_TEST მხáƒáƒ áƒ“áƒáƒ­áƒ”რილირმხáƒáƒšáƒáƒ“ იმ პáƒáƒ™áƒ”ტებისთვის, რáƒáƒ›áƒšáƒ”ბიც მáƒáƒ—áƒáƒ•სებულირ/system/app."</string>
+ <string name="factorytest_no_action" msgid="872991874799998561">"ვერ მáƒáƒ˜áƒ«áƒ”ბნრპáƒáƒ™áƒ”ტი, რáƒáƒ›áƒ”ლიც უზრუნველყáƒáƒ¤áƒ¡ ქáƒáƒ áƒ®áƒœáƒ£áƒš ტესტ ქმედებáƒáƒ¡."</string>
+ <string name="factorytest_reboot" msgid="6320168203050791643">"გáƒáƒ“áƒáƒ¢áƒ•ირთვáƒ"</string>
+ <string name="js_dialog_title" msgid="1987483977834603872">"„<xliff:g id="TITLE">%s</xliff:g>“-თáƒáƒœ გვერდი áƒáƒ›áƒ‘áƒáƒ‘ს:"</string>
+ <string name="js_dialog_title_default" msgid="6961903213729667573">"JavaScript"</string>
+ <string name="js_dialog_before_unload_title" msgid="2619376555525116593">"ნáƒáƒ•იგáƒáƒªáƒ˜áƒ˜áƒ¡ დáƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ”ბáƒ"</string>
+ <string name="js_dialog_before_unload_positive_button" msgid="3112752010600484130">"გვერდის დáƒáƒ¢áƒáƒ•ებáƒ"</string>
+ <string name="js_dialog_before_unload_negative_button" msgid="5614861293026099715">"áƒáƒ› გვერდზე დáƒáƒ áƒ©áƒ”ნáƒ"</string>
+ <string name="js_dialog_before_unload" msgid="3468816357095378590">"<xliff:g id="MESSAGE">%s</xliff:g>\n\nდáƒáƒ áƒ¬áƒ›áƒ£áƒœáƒ”ბული ხáƒáƒ áƒ—, რáƒáƒ› გსურთ áƒáƒ› გვერდიდáƒáƒœ გáƒáƒ“áƒáƒ¡áƒ•ლáƒ?"</string>
+ <string name="save_password_label" msgid="6860261758665825069">"დáƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ”ბáƒ"</string>
+ <string name="double_tap_toast" msgid="4595046515400268881">"რჩევáƒ: მáƒáƒ¡áƒ¨áƒ¢áƒáƒ‘ის შესáƒáƒªáƒ•ლელáƒáƒ“ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ áƒáƒ áƒ›áƒáƒ’ი შეხებáƒ."</string>
+ <string name="autofill_this_form" msgid="4616758841157816676">"áƒáƒ•ტáƒáƒ¨áƒ”ვსებáƒ"</string>
+ <string name="setup_autofill" msgid="7103495070180590814">"áƒáƒ•ტáƒáƒ¨áƒ”ვსების დáƒáƒ§áƒ”ნებáƒ"</string>
+ <string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
+ <string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
+ <string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
+ <string name="autofill_address_summary_format" msgid="4874459455786827344">"$1$2$3"</string>
+ <string name="autofill_province" msgid="2231806553863422300">"პრáƒáƒ•ინციáƒ"</string>
+ <string name="autofill_postal_code" msgid="4696430407689377108">"სáƒáƒ¤áƒáƒ¡áƒ¢áƒ˜ მისáƒáƒ›áƒáƒ áƒ—ი"</string>
+ <string name="autofill_state" msgid="6988894195520044613">"შტáƒáƒ¢áƒ˜"</string>
+ <string name="autofill_zip_code" msgid="8697544592627322946">"ZIP კáƒáƒ“ი"</string>
+ <string name="autofill_county" msgid="237073771020362891">"ქვეყáƒáƒœáƒ"</string>
+ <string name="autofill_island" msgid="4020100875984667025">"კუნძული"</string>
+ <string name="autofill_district" msgid="8400735073392267672">"áƒáƒšáƒ¥áƒ˜"</string>
+ <string name="autofill_department" msgid="5343279462564453309">"დეპáƒáƒ áƒ¢áƒáƒ›áƒ”ნტი"</string>
+ <string name="autofill_prefecture" msgid="2028499485065800419">"პრეფექტურáƒ"</string>
+ <string name="autofill_parish" msgid="8202206105468820057">"სáƒáƒ›áƒáƒ¥áƒáƒšáƒáƒ¥áƒ áƒáƒšáƒ¥áƒ˜"</string>
+ <string name="autofill_area" msgid="3547409050889952423">"რეგიáƒáƒœáƒ˜"</string>
+ <string name="autofill_emirate" msgid="2893880978835698818">"ემირáƒáƒ¢áƒ˜"</string>
+ <string name="permlab_readHistoryBookmarks" msgid="3775265775405106983">"თქვენი ვებ სáƒáƒœáƒ˜áƒ¨áƒœáƒ”ებისრდრისტáƒáƒ áƒ˜áƒ˜áƒ¡ წáƒáƒ™áƒ˜áƒ—ხვáƒ"</string>
+ <string name="permdesc_readHistoryBookmarks" msgid="8462378226600439658">"áƒáƒžáƒ¡ შეეძლებრწáƒáƒ˜áƒ™áƒ˜áƒ—ხáƒáƒ¡ ყველრURL-ის ისტáƒáƒ áƒ˜áƒ, სáƒáƒ“áƒáƒª კი ბრáƒáƒ£áƒ–ერი შესულáƒ, áƒáƒ¡áƒ”ვე ბრáƒáƒ£áƒ–ერის სáƒáƒœáƒ˜áƒ¨áƒœáƒ”ები. შენიშვნáƒ: ეს უფლებრშესáƒáƒ«áƒšáƒáƒ áƒáƒ  მáƒáƒ˜áƒªáƒáƒ•დეს მესáƒáƒ›áƒ” მხáƒáƒ áƒ˜áƒ¡ ბრáƒáƒ£áƒ–ერებს áƒáƒœ სხვრáƒáƒžáƒšáƒ˜áƒ™áƒáƒªáƒ˜áƒ”ბს, რáƒáƒ›áƒšáƒ”ბსáƒáƒª ვებში ძიებრშეუძლიáƒáƒ—."</string>
+ <string name="permlab_writeHistoryBookmarks" msgid="3714785165273314490">"ვებ სáƒáƒœáƒ˜áƒ¨áƒœáƒ”ებისრდრისტáƒáƒ áƒ˜áƒ˜áƒ¡ ჩáƒáƒ¬áƒ”რáƒ"</string>
+ <string name="permdesc_writeHistoryBookmarks" product="tablet" msgid="6825527469145760922">"áƒáƒžáƒ¡ შეეძლებáƒ, შეცვáƒáƒšáƒáƒ¡ ბრáƒáƒ£áƒ–ერის ისტáƒáƒ áƒ˜áƒ დრთქვენ ტáƒáƒ‘ლეტში შენáƒáƒ®áƒ£áƒšáƒ˜ სáƒáƒœáƒ˜áƒ¨áƒœáƒ”ები. áƒáƒ›áƒáƒœ შეიძლებრუფლებრმისცეს áƒáƒžáƒ¡, წáƒáƒ¨áƒáƒšáƒáƒ¡ áƒáƒœ შეცვáƒáƒšáƒáƒ¡ ბრáƒáƒ£áƒ–ერის მáƒáƒœáƒáƒªáƒ”მები. შენიშვნáƒ: ეს ნებáƒáƒ áƒ—ვრáƒáƒ  შეიძლებრშესრულდეს მესáƒáƒ›áƒ” მხáƒáƒ áƒ˜áƒ¡ ბრáƒáƒ£áƒ–ერების áƒáƒœ ვებ დáƒáƒ—ვáƒáƒšáƒ˜áƒ”რების შესáƒáƒ«áƒšáƒ”ბლáƒáƒ‘ის მქáƒáƒœáƒ” სხვრáƒáƒžáƒšáƒ˜áƒ™áƒáƒªáƒ˜áƒ”ბის მიერ."</string>
+ <string name="permdesc_writeHistoryBookmarks" product="default" msgid="8497389531014185509">"áƒáƒžáƒ¡ შეეძლებáƒ, შეცვáƒáƒšáƒáƒ¡ ბრáƒáƒ£áƒ–ერის ისტáƒáƒ áƒ˜áƒ დრთქვენ ტელეფáƒáƒœáƒ¨áƒ˜ შენáƒáƒ®áƒ£áƒšáƒ˜ სáƒáƒœáƒ˜áƒ¨áƒœáƒ”ები. áƒáƒ›áƒáƒœ შეიძლებრუფლებრმისცეს áƒáƒžáƒ¡, წáƒáƒ¨áƒáƒšáƒáƒ¡ áƒáƒœ შეცვáƒáƒšáƒáƒ¡ ბრáƒáƒ£áƒ–ერის მáƒáƒœáƒáƒªáƒ”მები. შენიშვნáƒ: ეს ნებáƒáƒ áƒ—ვრáƒáƒ  შეიძლებრშესრულდეს მესáƒáƒ›áƒ” მხáƒáƒ áƒ˜áƒ¡ ბრáƒáƒ£áƒ–ერების áƒáƒœ ვებ დáƒáƒ—ვáƒáƒšáƒ˜áƒ”რების შესáƒáƒ«áƒšáƒ”ბლáƒáƒ‘ის მქáƒáƒœáƒ” სხვრáƒáƒžáƒšáƒ˜áƒ™áƒáƒªáƒ˜áƒ”ბის მიერ."</string>
+ <string name="permlab_setAlarm" msgid="1379294556362091814">"მáƒáƒ¦áƒ•იძáƒáƒ áƒáƒ¡ დáƒáƒ§áƒ”ნებáƒ"</string>
+ <string name="permdesc_setAlarm" msgid="316392039157473848">"áƒáƒžáƒ¡ შეეძლებრმáƒáƒ¦áƒ•იძáƒáƒ áƒáƒ¡ დáƒáƒ§áƒ”ნებრდáƒáƒ˜áƒœáƒ¡áƒ¢áƒáƒšáƒ˜áƒ áƒ”ბული მáƒáƒ¦áƒ•იძáƒáƒ áƒáƒ¡ áƒáƒžáƒšáƒ˜áƒ™áƒáƒªáƒ˜áƒáƒ¨áƒ˜. áƒáƒ› ფუნქციáƒáƒ¡ მáƒáƒ¦áƒ•იძáƒáƒ áƒáƒ¡ ზáƒáƒ’იერთი áƒáƒžáƒ˜ áƒáƒ  იყენებს."</string>
+ <string name="permlab_addVoicemail" msgid="5525660026090959044">"ხმáƒáƒ•áƒáƒœáƒ˜ ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ დáƒáƒ›áƒáƒ¢áƒ”ბáƒ"</string>
+ <string name="permdesc_addVoicemail" msgid="6604508651428252437">"áƒáƒžáƒ¡ შეეძლებრდáƒáƒáƒ›áƒáƒ¢áƒáƒ¡ შეტყáƒáƒ‘ინებები თქვენი ხმáƒáƒ•áƒáƒœáƒ˜ ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ შემáƒáƒ¡áƒ£áƒšáƒ”ბში."</string>
+ <string name="permlab_writeGeolocationPermissions" msgid="5962224158955273932">"ბრáƒáƒ£áƒ–ერის გეáƒáƒšáƒáƒ™áƒáƒªáƒ˜áƒ˜áƒ¡ უფლებების შეცვლáƒ"</string>
+ <string name="permdesc_writeGeolocationPermissions" msgid="1083743234522638747">"áƒáƒžáƒ¡ შეეძლებრბრáƒáƒ£áƒ–ერის გეáƒáƒšáƒáƒ™áƒáƒªáƒ˜áƒ˜áƒ¡ უფლებების შეცვლáƒ. მáƒáƒ•ნე áƒáƒžáƒ”ბმრეს შესáƒáƒ«áƒšáƒáƒ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნáƒáƒœ ნებისმიერი ვებსáƒáƒ˜áƒ¢áƒ˜áƒ¡áƒ—ვის მდებáƒáƒ áƒ”áƒáƒ‘ის შესáƒáƒ®áƒ”ბ ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ¡áƒáƒ’ზáƒáƒ•ნáƒáƒ“."</string>
+ <string name="permlab_packageVerificationAgent" msgid="5568139100645829117">"პáƒáƒ™áƒ”ტების გáƒáƒ“áƒáƒ›áƒáƒ¬áƒ›áƒ”ბáƒ"</string>
+ <string name="permdesc_packageVerificationAgent" msgid="8437590190990843381">"áƒáƒžáƒ¡ შეუძლირდáƒáƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒáƒ¡ პáƒáƒ™áƒ”ტის დáƒáƒ§áƒáƒœáƒ”ბის შესáƒáƒ«áƒšáƒ”ბლáƒáƒ‘áƒ."</string>
+ <string name="permlab_bindPackageVerifier" msgid="4187786793360326654">"პáƒáƒ™áƒ”ტების ვერიფიკáƒáƒ¢áƒáƒ áƒ”ბთáƒáƒœ დáƒáƒ™áƒáƒ•შირებáƒ"</string>
+ <string name="permdesc_bindPackageVerifier" msgid="3180741773233862126">"მფლáƒáƒ‘ელს შეეძლებრპáƒáƒ™áƒ”ტის ვერიფიკáƒáƒ¢áƒáƒ áƒ”ბის მáƒáƒ—ხáƒáƒ•ნáƒ. áƒáƒ áƒáƒ¡áƒ“რáƒáƒ¡ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებრჩვეულებრივ áƒáƒžáƒ”ბში."</string>
+ <string name="permlab_serialPort" msgid="546083327654631076">"სერიულ პáƒáƒ áƒ¢áƒ”ბზე წვდáƒáƒ›áƒ"</string>
+ <string name="permdesc_serialPort" msgid="2991639985224598193">"მფლáƒáƒ‘ელს შეეძლებრსერიულ პáƒáƒ áƒ¢áƒ”ბზე წვდáƒáƒ›áƒ სერიული მენეჯერის API-ის გáƒáƒ›áƒáƒ§áƒ”ნებით."</string>
+ <string name="permlab_accessContentProvidersExternally" msgid="5077774297943409285">"კáƒáƒœáƒ¢áƒ”ნტის მáƒáƒ›áƒ¬áƒáƒ“ებლებთáƒáƒœ გáƒáƒ áƒ”დáƒáƒœ წვდáƒáƒ›áƒ"</string>
+ <string name="permdesc_accessContentProvidersExternally" msgid="4544346486697853685">"მფლáƒáƒ‘ელს áƒáƒ«áƒšáƒ”ვს კáƒáƒœáƒ¢áƒ”ნტ პრáƒáƒ•áƒáƒ˜áƒ“ერებზე წვდáƒáƒ›áƒáƒ¡ გáƒáƒ áƒ”მáƒáƒ“áƒáƒœ. ჩვეულებრივ áƒáƒžáƒ”ბში áƒáƒ áƒáƒ¡áƒáƒ“ეს გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებáƒ."</string>
+ <string name="permlab_updateLock" msgid="3527558366616680889">"მáƒáƒ¬áƒ§áƒáƒ‘ილáƒáƒ‘ის áƒáƒ•ტáƒáƒ›áƒáƒ¢áƒ£áƒ áƒ˜ გáƒáƒœáƒáƒ®áƒšáƒ”ბის დáƒáƒ¨áƒšáƒ"</string>
+ <string name="permdesc_updateLock" msgid="1655625832166778492">"მფლáƒáƒ‘ელს შეეძლებრსისტემისთვის ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ მიწáƒáƒ“ებáƒ, თუ რáƒáƒ“ის იქნებრშესáƒáƒ¤áƒ”რისი დრრმáƒáƒ¬áƒ§áƒáƒ‘ილáƒáƒ‘ის გáƒáƒ¡áƒáƒáƒ®áƒšáƒ”ბლáƒáƒ“ áƒáƒ áƒáƒ˜áƒœáƒ¢áƒ”რáƒáƒ¥áƒ¢áƒ˜áƒ£áƒšáƒ˜ გáƒáƒ“áƒáƒ¢áƒ•ირთვისთვის."</string>
+ <string name="save_password_message" msgid="767344687139195790">"გსურთ, რáƒáƒ› ბრáƒáƒ£áƒ–ერმრდáƒáƒ˜áƒ›áƒáƒ®áƒ¡áƒáƒ•რáƒáƒ¡ პáƒáƒ áƒáƒšáƒ˜?"</string>
+ <string name="save_password_notnow" msgid="6389675316706699758">"áƒáƒ®áƒšáƒ áƒáƒ áƒ"</string>
+ <string name="save_password_remember" msgid="6491879678996749466">"დáƒáƒ›áƒáƒ®áƒ¡áƒáƒ•რებáƒ"</string>
+ <string name="save_password_never" msgid="8274330296785855105">"áƒáƒ áƒáƒ¡áƒáƒ“ეს"</string>
+ <string name="open_permission_deny" msgid="7374036708316629800">"áƒáƒ› გვერდის გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ უფლებრáƒáƒ  გáƒáƒ¥áƒ•თ."</string>
+ <string name="text_copied" msgid="4985729524670131385">"ტექსტი დáƒáƒ™áƒáƒžáƒ˜áƒ áƒ”ბულირგáƒáƒªáƒ•ლის ბუფერში."</string>
+ <string name="more_item_label" msgid="4650918923083320495">"მეტი"</string>
+ <string name="prepend_shortcut_label" msgid="2572214461676015642">"მენიუ+"</string>
+ <string name="menu_space_shortcut_label" msgid="2410328639272162537">"[ინტერვáƒáƒšáƒ˜]"</string>
+ <string name="menu_enter_shortcut_label" msgid="2743362785111309668">"enter"</string>
+ <string name="menu_delete_shortcut_label" msgid="3658178007202748164">"წáƒáƒ¨áƒšáƒ"</string>
+ <string name="search_go" msgid="8298016669822141719">"ძიებáƒ"</string>
+ <string name="searchview_description_search" msgid="6749826639098512120">"ძიებáƒ"</string>
+ <string name="searchview_description_query" msgid="5911778593125355124">"მáƒáƒ—ხáƒáƒ•ნის ძიებáƒ"</string>
+ <string name="searchview_description_clear" msgid="1330281990951833033">"რიგის გáƒáƒ¡áƒ£áƒ¤áƒ—áƒáƒ•ებáƒ"</string>
+ <string name="searchview_description_submit" msgid="2688450133297983542">"შეკითხვის გáƒáƒ’ზáƒáƒ•ნáƒ"</string>
+ <string name="searchview_description_voice" msgid="2453203695674994440">"ხმáƒáƒ•áƒáƒœáƒ˜ ძიებáƒ"</string>
+ <string name="enable_explore_by_touch_warning_title" msgid="7460694070309730149">"ჩáƒáƒ•რთáƒáƒ— შეხებით დáƒáƒ—ვáƒáƒšáƒ˜áƒ”რებáƒ?"</string>
+ <string name="enable_explore_by_touch_warning_message" product="tablet" msgid="8655887539089910577">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g>-ს სურს „შეხებით შესწáƒáƒ•ლის“ რეჟიმის ჩრთვáƒ. ეს ტელეფáƒáƒœáƒ˜áƒ¡ ჟესტებით მáƒáƒ áƒ—ვისრდრიმ ელემენტების áƒáƒ¦áƒ¬áƒ”რის მáƒáƒ¡áƒ›áƒ”ნის შესáƒáƒ«áƒšáƒ”ბლáƒáƒ‘áƒáƒ¡ მáƒáƒ’ცემთ, რáƒáƒ›áƒ”ლსáƒáƒª შეეხებით."</string>
+ <string name="enable_explore_by_touch_warning_message" product="default" msgid="2708199672852373195">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g>-ს სურს „შეხებით შესწáƒáƒ•ლის“ რეჟიმის ჩრთვáƒ. ეს ტელეფáƒáƒœáƒ˜áƒ¡ ჟესტებით მáƒáƒ áƒ—ვისრდრიმ ელემენტების áƒáƒ¦áƒ¬áƒ”რის მáƒáƒ¡áƒ›áƒ”ნის შესáƒáƒ«áƒšáƒ”ბლáƒáƒ‘áƒáƒ¡ მáƒáƒ’ცემთ, რáƒáƒ›áƒ”ლსáƒáƒª შეეხებით."</string>
+ <string name="oneMonthDurationPast" msgid="7396384508953779925">"ერთი თვის წინ"</string>
+ <string name="beforeOneMonthDurationPast" msgid="909134546836499826">"უფრრáƒáƒ“რე, ვიდრე ერთი თვის წინ"</string>
+ <plurals name="num_seconds_ago">
+ <item quantity="one" msgid="4869870056547896011">"1 წáƒáƒ›áƒ˜áƒ¡ წინ"</item>
+ <item quantity="other" msgid="3903706804349556379">"<xliff:g id="COUNT">%d</xliff:g> წáƒáƒ›áƒ˜áƒ¡ წინ"</item>
+ </plurals>
+ <plurals name="num_minutes_ago">
+ <item quantity="one" msgid="3306787433088810191">"1 წუთის უკáƒáƒœ"</item>
+ <item quantity="other" msgid="2176942008915455116">"<xliff:g id="COUNT">%d</xliff:g> წუთის წინ"</item>
+ </plurals>
+ <plurals name="num_hours_ago">
+ <item quantity="one" msgid="9150797944610821849">"1 სáƒáƒáƒ—ის წინ"</item>
+ <item quantity="other" msgid="2467273239587587569">"<xliff:g id="COUNT">%d</xliff:g> სáƒáƒáƒ—ის წინ"</item>
+ </plurals>
+ <plurals name="last_num_days">
+ <item quantity="other" msgid="3069992808164318268">"ბáƒáƒšáƒ <xliff:g id="COUNT">%d</xliff:g> დღე"</item>
+ </plurals>
+ <string name="last_month" msgid="3959346739979055432">"გáƒáƒ¡áƒ£áƒšáƒ˜ თვე"</string>
+ <string name="older" msgid="5211975022815554840">"უფრრძველი"</string>
+ <plurals name="num_days_ago">
+ <item quantity="one" msgid="861358534398115820">"გუშინ"</item>
+ <item quantity="other" msgid="2479586466153314633">"<xliff:g id="COUNT">%d</xliff:g> დღის წინ"</item>
+ </plurals>
+ <plurals name="in_num_seconds">
+ <item quantity="one" msgid="2729745560954905102">"1 წáƒáƒ›áƒ¨áƒ˜"</item>
+ <item quantity="other" msgid="1241926116443974687">"<xliff:g id="COUNT">%d</xliff:g> წáƒáƒ›áƒ¨áƒ˜"</item>
+ </plurals>
+ <plurals name="in_num_minutes">
+ <item quantity="one" msgid="8793095251325200395">"1 წუთში"</item>
+ <item quantity="other" msgid="3330713936399448749">"<xliff:g id="COUNT">%d</xliff:g> წუთში"</item>
+ </plurals>
+ <plurals name="in_num_hours">
+ <item quantity="one" msgid="7164353342477769999">"1 სáƒáƒáƒ—ში"</item>
+ <item quantity="other" msgid="547290677353727389">"<xliff:g id="COUNT">%d</xliff:g> სáƒáƒáƒ—ში"</item>
+ </plurals>
+ <plurals name="in_num_days">
+ <item quantity="one" msgid="5413088743009839518">"ხვáƒáƒš"</item>
+ <item quantity="other" msgid="5109449375100953247">"<xliff:g id="COUNT">%d</xliff:g> დღეში"</item>
+ </plurals>
+ <plurals name="abbrev_num_seconds_ago">
+ <item quantity="one" msgid="1849036840200069118">"1 წმ. წინ"</item>
+ <item quantity="other" msgid="3699169366650930415">"<xliff:g id="COUNT">%d</xliff:g> წáƒáƒ›áƒ˜áƒ¡ წინ"</item>
+ </plurals>
+ <plurals name="abbrev_num_minutes_ago">
+ <item quantity="one" msgid="6361490147113871545">"1 წუთის წინ"</item>
+ <item quantity="other" msgid="851164968597150710">"<xliff:g id="COUNT">%d</xliff:g> წუთის წინ"</item>
+ </plurals>
+ <plurals name="abbrev_num_hours_ago">
+ <item quantity="one" msgid="4796212039724722116">"1 სáƒáƒáƒ—ის წინ"</item>
+ <item quantity="other" msgid="6889970745748538901">"<xliff:g id="COUNT">%d</xliff:g> სáƒáƒáƒ—ის წინ"</item>
+ </plurals>
+ <plurals name="abbrev_num_days_ago">
+ <item quantity="one" msgid="8463161711492680309">"გუშინ"</item>
+ <item quantity="other" msgid="3453342639616481191">"<xliff:g id="COUNT">%d</xliff:g> დღის წინ"</item>
+ </plurals>
+ <plurals name="abbrev_in_num_seconds">
+ <item quantity="one" msgid="5842225370795066299">"1 წáƒáƒ›áƒ¨áƒ˜"</item>
+ <item quantity="other" msgid="5495880108825805108">"<xliff:g id="COUNT">%d</xliff:g> წáƒáƒ›áƒ˜áƒ¡ წინ"</item>
+ </plurals>
+ <plurals name="abbrev_in_num_minutes">
+ <item quantity="one" msgid="562786149928284878">"1 წუთში"</item>
+ <item quantity="other" msgid="4216113292706568726">"<xliff:g id="COUNT">%d</xliff:g> წუთში"</item>
+ </plurals>
+ <plurals name="abbrev_in_num_hours">
+ <item quantity="one" msgid="3274708118124045246">"1 სáƒáƒáƒ—ში"</item>
+ <item quantity="other" msgid="3705373766798013406">"<xliff:g id="COUNT">%d</xliff:g> სáƒáƒáƒ—ში"</item>
+ </plurals>
+ <plurals name="abbrev_in_num_days">
+ <item quantity="one" msgid="2178576254385739855">"ხვáƒáƒš"</item>
+ <item quantity="other" msgid="2973062968038355991">"<xliff:g id="COUNT">%d</xliff:g> დღეში"</item>
+ </plurals>
+ <string name="preposition_for_date" msgid="9093949757757445117">"თáƒáƒ áƒ˜áƒ¦áƒ˜: <xliff:g id="DATE">%s</xliff:g>"</string>
+ <string name="preposition_for_time" msgid="5506831244263083793">"<xliff:g id="TIME">%s</xliff:g>-ზე"</string>
+ <string name="preposition_for_year" msgid="5040395640711867177">"<xliff:g id="YEAR">%s</xliff:g> წელს"</string>
+ <string name="day" msgid="8144195776058119424">"დღე"</string>
+ <string name="days" msgid="4774547661021344602">"დღეები"</string>
+ <string name="hour" msgid="2126771916426189481">"სáƒáƒáƒ—ი"</string>
+ <string name="hours" msgid="894424005266852993">"სáƒáƒáƒ—ი"</string>
+ <string name="minute" msgid="9148878657703769868">"წთ"</string>
+ <string name="minutes" msgid="5646001005827034509">"წუთი"</string>
+ <string name="second" msgid="3184235808021478">"წმ."</string>
+ <string name="seconds" msgid="3161515347216589235">"წáƒáƒ›áƒ”ბი"</string>
+ <string name="week" msgid="5617961537173061583">"კვირáƒ"</string>
+ <string name="weeks" msgid="6509623834583944518">"კვირები"</string>
+ <string name="year" msgid="4001118221013892076">"წელი"</string>
+ <string name="years" msgid="6881577717993213522">"წელი"</string>
+ <plurals name="duration_seconds">
+ <item quantity="one" msgid="6962015528372969481">"1 წáƒáƒ›áƒ˜"</item>
+ <item quantity="other" msgid="1886107766577166786">"<xliff:g id="COUNT">%d</xliff:g> წáƒáƒ›áƒ˜"</item>
+ </plurals>
+ <plurals name="duration_minutes">
+ <item quantity="one" msgid="4915414002546085617">"1 წუთი"</item>
+ <item quantity="other" msgid="3165187169224908775">"<xliff:g id="COUNT">%d</xliff:g> წუთი"</item>
+ </plurals>
+ <plurals name="duration_hours">
+ <item quantity="one" msgid="8917467491248809972">"1 სáƒáƒáƒ—ი"</item>
+ <item quantity="other" msgid="3863962854246773930">"<xliff:g id="COUNT">%d</xliff:g> სáƒáƒáƒ—ში"</item>
+ </plurals>
+ <string name="VideoView_error_title" msgid="3534509135438353077">"პრáƒáƒ‘ლემები ვიდეáƒáƒ¡áƒ—áƒáƒœ"</string>
+ <string name="VideoView_error_text_invalid_progressive_playback" msgid="3186670335938670444">"ეს ვიდერáƒáƒ  გáƒáƒ›áƒáƒ“გებრáƒáƒ› მáƒáƒ¬áƒ§áƒáƒ‘ილáƒáƒ‘áƒáƒ–ე სტრიმინგისთვის."</string>
+ <string name="VideoView_error_text_unknown" msgid="3450439155187810085">"ვიდეáƒáƒ¡ დáƒáƒ™áƒ•რრáƒáƒ  áƒáƒ áƒ˜áƒ¡ შესáƒáƒ«áƒšáƒ”ბელი."</string>
+ <string name="VideoView_error_button" msgid="2822238215100679592">"კáƒáƒ áƒ’ი"</string>
+ <string name="relative_time" msgid="1818557177829411417">"<xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="noon" msgid="7245353528818587908">"შუáƒáƒ“ღე"</string>
+ <string name="Noon" msgid="3342127745230013127">"შუáƒáƒ“ღე"</string>
+ <string name="midnight" msgid="7166259508850457595">"შუáƒáƒ¦áƒáƒ›áƒ”"</string>
+ <string name="Midnight" msgid="5630806906897892201">"შუáƒáƒ¦áƒáƒ›áƒ”"</string>
+ <string name="elapsed_time_short_format_mm_ss" msgid="4431555943828711473">"<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" msgid="1846071997616654124">"<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" msgid="6876518925844129331">"ყველáƒáƒ¡ áƒáƒ áƒ©áƒ”ვáƒ"</string>
+ <string name="cut" msgid="3092569408438626261">"áƒáƒ›áƒáƒ­áƒ áƒ"</string>
+ <string name="copy" msgid="2681946229533511987">"კáƒáƒžáƒ˜áƒ áƒ”ბáƒ"</string>
+ <string name="paste" msgid="5629880836805036433">"ჩáƒáƒ¡áƒ›áƒ"</string>
+ <string name="replace" msgid="5781686059063148930">"ჩáƒáƒœáƒáƒªáƒ•ლებáƒâ€¦"</string>
+ <string name="delete" msgid="6098684844021697789">"წáƒáƒ¨áƒšáƒ"</string>
+ <string name="copyUrl" msgid="2538211579596067402">"URL კáƒáƒžáƒ˜áƒ áƒ”ბáƒ"</string>
+ <string name="selectTextMode" msgid="1018691815143165326">"ტექსტის მáƒáƒœáƒ˜áƒ¨áƒ•ნáƒ"</string>
+ <string name="textSelectionCABTitle" msgid="5236850394370820357">"ტექსტის მáƒáƒœáƒ˜áƒ¨áƒ•ნáƒ"</string>
+ <string name="addToDictionary" msgid="4352161534510057874">"ლექსიკáƒáƒœáƒ¨áƒ˜ დáƒáƒ›áƒáƒ¢áƒ”ბáƒ"</string>
+ <string name="deleteText" msgid="6979668428458199034">"წáƒáƒ¨áƒšáƒ"</string>
+ <string name="inputMethod" msgid="1653630062304567879">"შეყვáƒáƒœáƒ˜áƒ¡ მეთáƒáƒ“ი"</string>
+ <string name="editTextMenuTitle" msgid="4909135564941815494">"ქმედებები ტექსტზე"</string>
+ <string name="low_internal_storage_view_title" msgid="5576272496365684834">"თáƒáƒ•ისუფáƒáƒšáƒ˜ áƒáƒ“გილი იწურებáƒ"</string>
+ <string name="low_internal_storage_view_text" msgid="6640505817617414371">"სისტემის ზáƒáƒ’იერთმრფუნქციáƒáƒ› შესáƒáƒ«áƒšáƒáƒ áƒáƒ  იმუშáƒáƒ•áƒáƒ¡"</string>
+ <string name="app_running_notification_title" msgid="8718335121060787914">"<xliff:g id="APP_NAME">%1$s</xliff:g> გáƒáƒ¨áƒ•ებულიáƒ"</string>
+ <string name="app_running_notification_text" msgid="4653586947747330058">"შეეხეთ მეტი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡áƒáƒ—ვის áƒáƒœ áƒáƒžáƒ˜áƒ¡ შესáƒáƒ¬áƒ§áƒ•ეტáƒáƒ“."</string>
+ <string name="ok" msgid="5970060430562524910">"OK"</string>
+ <string name="cancel" msgid="6442560571259935130">"გáƒáƒ£áƒ¥áƒ›áƒ”ბáƒ"</string>
+ <string name="yes" msgid="5362982303337969312">"OK"</string>
+ <string name="no" msgid="5141531044935541497">"გáƒáƒ£áƒ¥áƒ›áƒ”ბáƒ"</string>
+ <string name="dialog_alert_title" msgid="2049658708609043103">"ყურáƒáƒ“ღებáƒ"</string>
+ <string name="loading" msgid="7933681260296021180">"ჩáƒáƒ¢áƒ•ირთვáƒâ€¦"</string>
+ <string name="capital_on" msgid="1544682755514494298">"ჩáƒáƒ áƒ—."</string>
+ <string name="capital_off" msgid="6815870386972805832">"გáƒáƒ›áƒáƒ áƒ—ულიáƒ"</string>
+ <string name="whichApplication" msgid="4533185947064773386">"მáƒáƒ¥áƒ›áƒ”დების დáƒáƒ¡áƒ áƒ£áƒšáƒ”ბრშემდეგი სáƒáƒ¨áƒ£áƒáƒšáƒ”ბით:"</string>
+ <string name="alwaysUse" msgid="4583018368000610438">"áƒáƒ› ქმედებისთვის ნáƒáƒ’ულისხმევáƒáƒ“ გáƒáƒ›áƒáƒ§áƒ”ნებáƒ."</string>
+ <string name="clearDefaultHintMsg" msgid="3252584689512077257">"ნáƒáƒ’ულისხმევი პáƒáƒ áƒáƒ›áƒ”ტრების წáƒáƒ¨áƒšáƒ სისტემის პáƒáƒ áƒáƒ›áƒ”ტრებში &gt; áƒáƒžáƒ”ბში &gt; ჩáƒáƒ›áƒáƒ¢áƒ•ირთულებში."</string>
+ <string name="chooseActivity" msgid="7486876147751803333">"áƒáƒ˜áƒ áƒ©áƒ˜áƒ”თ მáƒáƒ¥áƒ›áƒ”დებáƒ"</string>
+ <string name="chooseUsbActivity" msgid="6894748416073583509">"USB მáƒáƒ¬áƒ§áƒáƒ‘ილáƒáƒ‘ისáƒáƒ—ვის áƒáƒžáƒ˜áƒ¡ შერჩევáƒ"</string>
+ <string name="noApplications" msgid="2991814273936504689">"ვერც ერთი áƒáƒžáƒ˜ ვერ შეáƒáƒ¡áƒ áƒ£áƒšáƒ”ბს áƒáƒ› ქმედებáƒáƒ¡."</string>
+ <string name="aerr_title" msgid="1905800560317137752"></string>
+ <string name="aerr_application" msgid="932628488013092776">"სáƒáƒ›áƒ¬áƒ£áƒ®áƒáƒ áƒáƒ“, <xliff:g id="APPLICATION">%1$s</xliff:g> შეწყდáƒ."</string>
+ <string name="aerr_process" msgid="4507058997035697579">"სáƒáƒ›áƒ¬áƒ£áƒ®áƒáƒ áƒáƒ“, პრáƒáƒªáƒ”სი <xliff:g id="PROCESS">%1$s</xliff:g> შეწყდáƒ."</string>
+ <string name="anr_title" msgid="4351948481459135709"></string>
+ <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> áƒáƒ  რეáƒáƒ’ირებს.\n\nგსურთ, მისი დáƒáƒ®áƒ£áƒ áƒ•áƒ?"</string>
+ <string name="anr_activity_process" msgid="5776209883299089767">"<xliff:g id="ACTIVITY">%1$s</xliff:g> áƒáƒ¥áƒ¢áƒ˜áƒ•áƒáƒ‘რáƒáƒ  რეáƒáƒ’ირებს.\n\nგსურთ მისი დáƒáƒ®áƒ£áƒ áƒ•áƒ?"</string>
+ <string name="anr_application_process" msgid="8941757607340481057">"<xliff:g id="APPLICATION">%1$s</xliff:g> áƒáƒ  რეáƒáƒ’ირებს. გსურთ მისი დáƒáƒ®áƒ£áƒ áƒ•áƒ?"</string>
+ <string name="anr_process" msgid="6513209874880517125">"პრáƒáƒªáƒ”სი <xliff:g id="PROCESS">%1$s</xliff:g> áƒáƒ  რეáƒáƒ’ირებს.\n\nგსურთ, მისი დáƒáƒ®áƒ£áƒ áƒ•áƒ?"</string>
+ <string name="force_close" msgid="8346072094521265605">"OK"</string>
+ <string name="report" msgid="4060218260984795706">"áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜"</string>
+ <string name="wait" msgid="7147118217226317732">"მáƒáƒªáƒ“áƒ"</string>
+ <string name="webpage_unresponsive" msgid="3272758351138122503">"გვერდი áƒáƒ¦áƒáƒ  რეáƒáƒ’ირებს.\n\nგსურთ მისი დáƒáƒ®áƒ£áƒ áƒ•áƒ?"</string>
+ <string name="launch_warning_title" msgid="1547997780506713581">"áƒáƒžáƒ˜ გáƒáƒ“áƒáƒ›áƒ˜áƒ¡áƒáƒ›áƒáƒ áƒ—ებულიáƒ"</string>
+ <string name="launch_warning_replace" msgid="6202498949970281412">"<xliff:g id="APP_NAME">%1$s</xliff:g> გáƒáƒ¨áƒ•ებულიáƒ."</string>
+ <string name="launch_warning_original" msgid="188102023021668683">"<xliff:g id="APP_NAME">%1$s</xliff:g> თáƒáƒ•დáƒáƒžáƒ˜áƒ áƒ•ელáƒáƒ“ გáƒáƒ”შვáƒ."</string>
+ <string name="screen_compat_mode_scale" msgid="3202955667675944499">"მáƒáƒ¡áƒ¨áƒ¢áƒáƒ‘ი"</string>
+ <string name="screen_compat_mode_show" msgid="4013878876486655892">"ყáƒáƒ•ელთვის ჩვენებáƒ"</string>
+ <string name="screen_compat_mode_hint" msgid="1064524084543304459">"ხელáƒáƒ®áƒáƒšáƒ˜ გáƒáƒáƒ¥áƒ¢áƒ˜áƒ£áƒ áƒ”ბრგáƒáƒœáƒ§áƒáƒ¤áƒ˜áƒšáƒ”ბáƒáƒ¨áƒ˜: სისტემის პáƒáƒ áƒáƒ›áƒ”ტრები &gt; áƒáƒžáƒ”ბი &gt; ჩáƒáƒ›áƒáƒ¢áƒ•ირთულები."</string>
+ <string name="smv_application" msgid="3307209192155442829">"áƒáƒžáƒ›áƒ <xliff:g id="APPLICATION">%1$s</xliff:g> (პრáƒáƒªáƒ”სი <xliff:g id="PROCESS">%2$s</xliff:g>) დáƒáƒáƒ áƒ¦áƒ•ირსáƒáƒ™áƒ£áƒ—áƒáƒ áƒ˜ StrictMode დებულებáƒ."</string>
+ <string name="smv_process" msgid="5120397012047462446">"áƒáƒ› პრáƒáƒªáƒ”სმრ<xliff:g id="PROCESS">%1$s</xliff:g> დáƒáƒáƒ–იáƒáƒœáƒ სáƒáƒ™áƒ£áƒ—áƒáƒ áƒ˜ StrictMode დებულებáƒ."</string>
+ <string name="android_upgrading_title" msgid="1584192285441405746">"Android áƒáƒ®áƒáƒš ვერსიáƒáƒ–ე გáƒáƒ“áƒáƒ“ის…"</string>
+ <string name="android_upgrading_apk" msgid="7904042682111526169">"<xliff:g id="NUMBER_0">%1$d</xliff:g> áƒáƒžáƒšáƒ˜áƒ™áƒáƒªáƒ˜áƒ˜áƒ¡ (სულ <xliff:g id="NUMBER_1">%2$d</xliff:g>-დáƒáƒœ) áƒáƒžáƒ¢áƒ˜áƒ›áƒ˜áƒ–áƒáƒªáƒ˜áƒ."</string>
+ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"áƒáƒžáƒ”ბის ჩáƒáƒ áƒ—ვáƒ"</string>
+ <string name="android_upgrading_complete" msgid="1405954754112999229">"ჩáƒáƒ¢áƒ•ირთვის დáƒáƒ¡áƒáƒ¡áƒ áƒ£áƒšáƒ˜."</string>
+ <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> გáƒáƒ¨áƒ•ებულიáƒ"</string>
+ <string name="heavy_weight_notification_detail" msgid="1721681741617898865">"áƒáƒžáƒ–ე გáƒáƒ“áƒáƒ¡áƒáƒ áƒ—ველáƒáƒ“ შეეხეთ"</string>
+ <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"გსურთ, áƒáƒžáƒ”ბის გáƒáƒ“áƒáƒ áƒ—ვáƒ?"</string>
+ <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"სხვრáƒáƒžáƒ˜ áƒáƒ áƒ˜áƒ¡ უკვე გáƒáƒ¨áƒ•ებული, რáƒáƒ›áƒ”ლიც უნდრშეჩერდეს áƒáƒ®áƒšáƒ˜áƒ¡ დáƒáƒ¬áƒ§áƒ”ბáƒáƒ›áƒ“ე."</string>
+ <string name="old_app_action" msgid="493129172238566282">"<xliff:g id="OLD_APP">%1$s</xliff:g>-თáƒáƒœ დáƒáƒ‘რუნებáƒ"</string>
+ <string name="old_app_description" msgid="2082094275580358049">"áƒáƒ  ჩáƒáƒ áƒ—áƒáƒ— áƒáƒ®áƒáƒšáƒ˜ áƒáƒžáƒ˜."</string>
+ <string name="new_app_action" msgid="5472756926945440706">"დáƒáƒ¡áƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+ <string name="new_app_description" msgid="1932143598371537340">"შეáƒáƒ©áƒ”რე ძველი áƒáƒžáƒ˜ ცვლილებების შენáƒáƒ®áƒ•ის გáƒáƒ áƒ”შე."</string>
+ <string name="sendText" msgid="5209874571959469142">"შეáƒáƒ áƒ©áƒ˜áƒ”თ ქმედებრტექსტისთვის."</string>
+ <string name="volume_ringtone" msgid="6885421406845734650">"მრეკáƒáƒ•ის ხმáƒ"</string>
+ <string name="volume_music" msgid="5421651157138628171">"მედიის ხმáƒ"</string>
+ <string name="volume_music_hint_playing_through_bluetooth" msgid="9165984379394601533">"დáƒáƒ™áƒ•რრBluetooth-ის გáƒáƒ›áƒáƒ§áƒ”ნებით"</string>
+ <string name="volume_music_hint_silent_ringtone_selected" msgid="8310739960973156272">"áƒáƒ áƒ©áƒ”ულირუხმრრეჟიმი"</string>
+ <string name="volume_call" msgid="3941680041282788711">"ხმის სიმáƒáƒ¦áƒšáƒ” ზáƒáƒ áƒ˜áƒ¡ დრáƒáƒ¡"</string>
+ <string name="volume_bluetooth_call" msgid="2002891926351151534">"Bluetooth ხმის სიმáƒáƒ¦áƒšáƒ” ზáƒáƒ áƒ˜áƒ¡ დრáƒáƒ¡"</string>
+ <string name="volume_alarm" msgid="1985191616042689100">"მáƒáƒ¦áƒ•იძáƒáƒ áƒáƒ¡ ხმáƒ"</string>
+ <string name="volume_notification" msgid="2422265656744276715">"შეტყáƒáƒ‘ინების ხმáƒ"</string>
+ <string name="volume_unknown" msgid="1400219669770445902">"ხმáƒ"</string>
+ <string name="volume_icon_description_bluetooth" msgid="6538894177255964340">"Bluetooth-ის ხმáƒ"</string>
+ <string name="volume_icon_description_ringer" msgid="3326003847006162496">"ზáƒáƒ áƒ˜áƒ¡ სიმáƒáƒ¦áƒšáƒ”"</string>
+ <string name="volume_icon_description_incall" msgid="8890073218154543397">"ზáƒáƒ áƒ˜áƒ¡ ხმáƒ"</string>
+ <string name="volume_icon_description_media" msgid="4217311719665194215">"მედიის ხმáƒ"</string>
+ <string name="volume_icon_description_notification" msgid="7044986546477282274">"შეტყáƒáƒ‘ინების ხმáƒ"</string>
+ <string name="ringtone_default" msgid="3789758980357696936">"ნáƒáƒ’ულისხმევი ზáƒáƒ áƒ˜"</string>
+ <string name="ringtone_default_with_actual" msgid="8129563480895990372">"ნáƒáƒ’ულისხმევი ზáƒáƒ áƒ˜ (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_silent" msgid="7937634392408977062">"áƒáƒ áƒª ერთი"</string>
+ <string name="ringtone_picker_title" msgid="3515143939175119094">"ზáƒáƒ áƒ”ბი"</string>
+ <string name="ringtone_unknown" msgid="5477919988701784788">"უცნáƒáƒ‘ი ზáƒáƒ áƒ˜"</string>
+ <plurals name="wifi_available">
+ <item quantity="one" msgid="6654123987418168693">"Wi-Fi ქსელი ხელმისáƒáƒ¬áƒ•დáƒáƒ›áƒ˜áƒ"</item>
+ <item quantity="other" msgid="4192424489168397386">"Wi-Fi ქსელები ხელმისáƒáƒ¬áƒ•დáƒáƒ›áƒ˜áƒ."</item>
+ </plurals>
+ <plurals name="wifi_available_detailed">
+ <item quantity="one" msgid="1634101450343277345">"ხელმისáƒáƒ¬áƒ•დáƒáƒ›áƒ˜ Wi-Fi ქსელების გáƒáƒ®áƒ¡áƒœáƒ"</item>
+ <item quantity="other" msgid="7915895323644292768">"ხელმისáƒáƒ¬áƒ•დáƒáƒ›áƒ˜ Wi-Fi ქსელების გáƒáƒ®áƒ¡áƒœáƒ"</item>
+ </plurals>
+ <string name="wifi_available_sign_in" msgid="4029489716605255386">"Wi-Fi ქსელთáƒáƒœ დáƒáƒ™áƒáƒ•შირებáƒ"</string>
+ <string name="network_available_sign_in" msgid="8495155593358054676">"ქსელში შესვლáƒ"</string>
+ <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
+ <skip />
+ <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Wi-Fi-თáƒáƒœ დáƒáƒ™áƒáƒ•შირებრვერ მáƒáƒ®áƒ”რხდáƒ"</string>
+ <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" áƒáƒ¥áƒ•ს ცუდი ინტერნეტ კáƒáƒ•შირი."</string>
+ <string name="wifi_p2p_dialog_title" msgid="97611782659324517">"Wi-Fi Direct"</string>
+ <string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"ჩáƒáƒ áƒ—ეთ Wi-Fi Direct. ეს გáƒáƒ›áƒáƒ˜áƒ¬áƒ•ევს Wi-Fi კლიენტისáƒ/უსáƒáƒ“ენრქსელის გáƒáƒ›áƒáƒ áƒ—ვáƒáƒ¡."</string>
+ <string name="wifi_p2p_failed_message" msgid="3763669677935623084">"ვერ მáƒáƒ®áƒ”რხდრWi-Fi Direct-ის გáƒáƒ¨áƒ•ებáƒ."</string>
+ <string name="wifi_p2p_enabled_notification_title" msgid="2068321881673734886">"Wi-Fi Direct ჩáƒáƒ áƒ—ულიáƒ"</string>
+ <string name="wifi_p2p_enabled_notification_message" msgid="1638949953993894335">"პáƒáƒ áƒáƒ›áƒ”ტრებისთვის შეეხეთ"</string>
+ <string name="accept" msgid="1645267259272829559">"მიღებáƒ"</string>
+ <string name="decline" msgid="2112225451706137894">"უáƒáƒ áƒ§áƒáƒ¤áƒ"</string>
+ <string name="wifi_p2p_invitation_sent_title" msgid="1318975185112070734">"მáƒáƒ¬áƒ•ევრგáƒáƒ’ზáƒáƒ•ნილიáƒ"</string>
+ <string name="wifi_p2p_invitation_to_connect_title" msgid="4958803948658533637">"მáƒáƒ¬áƒ•ევრდáƒáƒ¡áƒáƒ™áƒáƒ•შირებლáƒáƒ“"</string>
+ <string name="wifi_p2p_from_message" msgid="570389174731951769">"გáƒáƒ›áƒ’ზáƒáƒ•ნი:"</string>
+ <string name="wifi_p2p_to_message" msgid="248968974522044099">"მიმღები:"</string>
+ <string name="wifi_p2p_enter_pin_message" msgid="5920929550367828970">"შეიყვáƒáƒœáƒ”თ სáƒáƒ­áƒ˜áƒ áƒ PIN:"</string>
+ <string name="wifi_p2p_show_pin_message" msgid="8530563323880921094">"პინ-კáƒáƒ“ი:"</string>
+ <string name="wifi_p2p_frequency_conflict_message" product="tablet" msgid="8012981257742232475">"ტáƒáƒ‘ლეტი დრáƒáƒ”ბით გáƒáƒ˜áƒ—იშებრWi-Fi-დáƒáƒœ, სáƒáƒœáƒáƒ› მიერთებულირ<xliff:g id="DEVICE_NAME">%1$s</xliff:g>-ზე"</string>
+ <string name="wifi_p2p_frequency_conflict_message" product="default" msgid="7363907213787469151">"ტელეფáƒáƒœáƒ˜ დრáƒáƒ”ბით გáƒáƒ˜áƒ—იშებრWi-Fi-დáƒáƒœ, სáƒáƒœáƒáƒ› მიერთებულირ<xliff:g id="DEVICE_NAME">%1$s</xliff:g>-ზე"</string>
+ <string name="select_character" msgid="3365550120617701745">"სიმბáƒáƒšáƒáƒ¡ ჩáƒáƒ¡áƒ›áƒ"</string>
+ <string name="sms_control_title" msgid="7296612781128917719">"SMS შეტყáƒáƒ‘ინებები იგზáƒáƒ•ნებáƒ"</string>
+ <string name="sms_control_message" msgid="3867899169651496433">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;áƒáƒ’ზáƒáƒ•ნის დიდი რáƒáƒáƒ“ენáƒáƒ‘ის SMS შეტყáƒáƒ‘ინებებს. გსურთ, მისცეთ áƒáƒ› áƒáƒžáƒ¡ უფლებრგáƒáƒáƒ’რძელáƒáƒ¡ შეტყáƒáƒ‘ინეების დáƒáƒ’ზáƒáƒ•ნáƒ?"</string>
+ <string name="sms_control_yes" msgid="3663725993855816807">"უფლების მიცემáƒ"</string>
+ <string name="sms_control_no" msgid="625438561395534982">"უáƒáƒ áƒ§áƒáƒ¤áƒ"</string>
+ <string name="sms_short_code_confirm_message" msgid="1645436466285310855">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; სურს შეტყáƒáƒ‘ინების გáƒáƒ’ზáƒáƒ•ნრ&lt;b&gt;<xliff:g id="DEST_ADDRESS">%2$s</xliff:g>&lt;/b&gt;-ისთვის."</string>
+ <string name="sms_short_code_details" msgid="3492025719868078457">"áƒáƒ›áƒáƒœ "<font fgcolor="#ffffb060">"შესáƒáƒ«áƒšáƒáƒ გáƒáƒ›áƒáƒ˜áƒ¬áƒ•იáƒáƒ¡ ცვლილებები"</font>" თქვენი მáƒáƒ‘ილურის áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ–ე."</string>
+ <string name="sms_premium_short_code_details" msgid="5523826349105123687"><font fgcolor="#ffffb060">"ეს გáƒáƒ›áƒáƒ˜áƒ¬áƒ•ევს დáƒáƒœáƒáƒ®áƒáƒ áƒ¯áƒ”ბს თქვენ მáƒáƒ‘ილურ áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ–ე."</font></string>
+ <string name="sms_short_code_confirm_allow" msgid="4458878637111023413">"გáƒáƒ’ზáƒáƒ•ნáƒ"</string>
+ <string name="sms_short_code_confirm_deny" msgid="2927389840209170706">"გáƒáƒ£áƒ¥áƒ›áƒ”ბáƒ"</string>
+ <string name="sms_short_code_remember_choice" msgid="5289538592272218136">"ჩემი áƒáƒ áƒ©áƒ”ვáƒáƒœáƒ˜áƒ¡ დáƒáƒ›áƒáƒ®áƒ¡áƒáƒ•რებáƒ"</string>
+ <string name="sms_short_code_remember_undo_instruction" msgid="4960944133052287484">"áƒáƒ›áƒ˜áƒ¡ შეცვლრშეგიძლიáƒáƒ— მáƒáƒ’ვიáƒáƒœáƒ”ბით áƒáƒžáƒ”ბის პáƒáƒ áƒáƒ›áƒ”ტრებიდáƒáƒœ."</string>
+ <string name="sms_short_code_confirm_always_allow" msgid="3241181154869493368">"ნებáƒáƒ áƒ—ვის მიცემრ- ყáƒáƒ•ელთვის"</string>
+ <string name="sms_short_code_confirm_never_allow" msgid="446992765774269673">"áƒáƒ áƒáƒ¡áƒáƒ“ეს მისცე უფლებáƒ"</string>
+ <string name="sim_removed_title" msgid="6227712319223226185">"SIM ბáƒáƒ áƒáƒ—ი áƒáƒ›áƒáƒ¦áƒ”ბულიáƒ"</string>
+ <string name="sim_removed_message" msgid="2333164559970958645">"მáƒáƒ‘ილური კáƒáƒ•შირი áƒáƒ  იქნებრხელმისáƒáƒ¬áƒ•დáƒáƒ›áƒ˜, ვიდრე áƒáƒ  ჩáƒáƒ“ებთ ქმედით SIM ბáƒáƒ áƒáƒ—ს დრგáƒáƒ“áƒáƒ¢áƒ•ირთáƒáƒ•თ."</string>
+ <string name="sim_done_button" msgid="827949989369963775">"დáƒáƒ¡áƒ áƒ£áƒšáƒ“áƒ"</string>
+ <string name="sim_added_title" msgid="3719670512889674693">"SIM ბáƒáƒ áƒáƒ—ი დáƒáƒ”მáƒáƒ¢áƒ"</string>
+ <string name="sim_added_message" msgid="6599945301141050216">"გáƒáƒ“áƒáƒ¢áƒ•ირთეთ თქვენი მáƒáƒ¬áƒ§áƒáƒ‘ილáƒáƒ‘რმáƒáƒ‘ილურ ქსელზე წვდáƒáƒ›áƒ˜áƒ¡áƒ—ვის."</string>
+ <string name="sim_restart_button" msgid="4722407842815232347">"გáƒáƒ“áƒáƒ¢áƒ•ირთვáƒ"</string>
+ <string name="time_picker_dialog_title" msgid="8349362623068819295">"დრáƒáƒ˜áƒ¡ დáƒáƒ§áƒ”ნებáƒ"</string>
+ <string name="date_picker_dialog_title" msgid="5879450659453782278">"თáƒáƒ áƒ˜áƒ¦áƒ˜áƒ¡ დáƒáƒ§áƒ”ნებáƒ"</string>
+ <string name="date_time_set" msgid="5777075614321087758">"დáƒáƒ§áƒ”ნებáƒ"</string>
+ <string name="date_time_done" msgid="2507683751759308828">"დáƒáƒ¡áƒ áƒ£áƒšáƒ“áƒ"</string>
+ <string name="perms_new_perm_prefix" msgid="8257740710754301407"><font size="12" fgcolor="#ff33b5e5">"áƒáƒ®áƒáƒšáƒ˜: "</font></string>
+ <string name="perms_description_app" msgid="5139836143293299417">"მáƒáƒ›áƒ¬áƒáƒ“ებელი: <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
+ <string name="no_permissions" msgid="7283357728219338112">"ნებáƒáƒ áƒ—ვრსáƒáƒ­áƒ˜áƒ áƒ áƒáƒ  áƒáƒ áƒ˜áƒ¡"</string>
+ <string name="perm_costs_money" msgid="4902470324142151116">"áƒáƒ›áƒ˜áƒ¡áƒáƒ—ვის შესáƒáƒ«áƒšáƒáƒ მáƒáƒ’იწიáƒáƒ— თáƒáƒœáƒ®áƒ˜áƒ¡ გáƒáƒ“áƒáƒ®áƒ“áƒ"</string>
+ <string name="usb_storage_activity_title" msgid="4465055157209648641">"USB მáƒáƒ¡áƒ˜áƒ£áƒ áƒ˜ მეხსიერებáƒ"</string>
+ <string name="usb_storage_title" msgid="5901459041398751495">"USB დáƒáƒ™áƒáƒ•შირებულიáƒ"</string>
+ <string name="usb_storage_message" product="nosdcard" msgid="3308538094316477839">"თქვენ დáƒáƒ™áƒáƒ•შირებული ხáƒáƒ áƒ— კáƒáƒ›áƒžáƒ˜áƒ£áƒ¢áƒ”რთáƒáƒœ USB-ის მეშვეáƒáƒ‘ით. თუ გსურთ კáƒáƒ›áƒžáƒ˜áƒ£áƒ¢áƒ”რსრდრთქვენს Android USB მáƒáƒ¬áƒ§áƒáƒ‘ილáƒáƒ‘áƒáƒ¡ შáƒáƒ áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ”ბის კáƒáƒžáƒ˜áƒ áƒ”ბრშეეხეთ ქვემáƒáƒ— მდებáƒáƒ áƒ” ღილáƒáƒ™áƒ¡."</string>
+ <string name="usb_storage_message" product="default" msgid="805351000446037811">"თქვენ დáƒáƒ£áƒ™áƒáƒ•შირდით კáƒáƒ›áƒžáƒ˜áƒ£áƒ¢áƒ”რს USB-ის მეშვეáƒáƒ‘ით. შეეხეთ ქვემáƒáƒ— მდებáƒáƒ áƒ” ღილáƒáƒ™áƒ¡, თუ გსურთ ფáƒáƒ˜áƒšáƒ”ბის კáƒáƒžáƒ˜áƒ áƒ”ბრთქვენ კáƒáƒ›áƒžáƒ˜áƒ£áƒ¢áƒ”რსრდრAndroid SD ბáƒáƒ áƒáƒ—ს შáƒáƒ áƒ˜áƒ¡."</string>
+ <string name="usb_storage_button_mount" msgid="1052259930369508235">"USB მეხსიერების ჩáƒáƒ áƒ—ვáƒ"</string>
+ <string name="usb_storage_error_message" product="nosdcard" msgid="3017045217365540658">"USB მáƒáƒ¡áƒ˜áƒ£áƒ áƒ˜ მეხსიერებისთვის თქვენი USB მეხსიერების გáƒáƒ›áƒáƒ§áƒ”ნებრპრáƒáƒ‘ლემáƒáƒ¡ ქმნის."</string>
+ <string name="usb_storage_error_message" product="default" msgid="2876018512716970313">"USB მáƒáƒ¡áƒ˜áƒ£áƒ áƒ˜ მეხსიერებისთვის თქვენი SD ბáƒáƒ áƒáƒ—ის გáƒáƒ›áƒáƒ§áƒ”ნებრპრáƒáƒ‘ლემáƒáƒ¡ ქმნის."</string>
+ <string name="usb_storage_notification_title" msgid="8175892554757216525">"USB დáƒáƒ™áƒáƒ•შირებულიáƒ"</string>
+ <string name="usb_storage_notification_message" msgid="939822783828183763">"შეეხეთ ფáƒáƒ˜áƒšáƒ”ბის კáƒáƒžáƒ˜áƒ áƒ”ბისáƒáƒ—ვის კáƒáƒ›áƒžáƒ˜áƒ£áƒ¢áƒ”რში/კáƒáƒ›áƒžáƒ˜áƒ£áƒ¢áƒ”რიდáƒáƒœ."</string>
+ <string name="usb_storage_stop_notification_title" msgid="2336058396663516017">"USB მეხსიერების გáƒáƒ›áƒáƒ áƒ—ვáƒ"</string>
+ <string name="usb_storage_stop_notification_message" msgid="1656852098555623822">"შეეხეთ USB მეხსიერების გáƒáƒ›áƒáƒ¡áƒáƒ áƒ—ველáƒáƒ“."</string>
+ <string name="usb_storage_stop_title" msgid="660129851708775853">"ხდებრUSB მეხსიერების გáƒáƒ›áƒáƒ§áƒ”ნებáƒ"</string>
+ <string name="usb_storage_stop_message" product="nosdcard" msgid="4264025280777219521">"USB მეხსიერების გáƒáƒ›áƒáƒ áƒ—ვáƒáƒ›áƒ“ე, გáƒáƒ›áƒáƒ˜áƒ¦áƒ”თ თქვენი Android-ის USB თქვენი კáƒáƒ›áƒžáƒ˜áƒ£áƒ¢áƒ”რიდáƒáƒœ."</string>
+ <string name="usb_storage_stop_message" product="default" msgid="8043969782460613114">"USB მეხსიერების გáƒáƒ›áƒáƒ áƒ—ვáƒáƒ›áƒ“ე, გáƒáƒ›áƒáƒáƒ”რთეთ თქვენი Android SD ბáƒáƒ áƒáƒ—ი კáƒáƒ›áƒžáƒ˜áƒ£áƒ¢áƒ”რიდáƒáƒœ."</string>
+ <string name="usb_storage_stop_button_mount" msgid="7060218034900696029">"USB მეხსიერების გáƒáƒ›áƒáƒ áƒ—ვáƒ"</string>
+ <string name="usb_storage_stop_error_message" msgid="1970374898263063836">"USB-გáƒáƒ›áƒáƒ áƒ—ვისáƒáƒ¡ წáƒáƒ áƒ›áƒáƒ˜áƒ¨áƒ•რშეცდáƒáƒ›áƒ. შეáƒáƒ›áƒáƒ¬áƒ›áƒ”თ, რáƒáƒ› გáƒáƒ—იშეთ თქვენი USB ჰáƒáƒ¡áƒ¢áƒ˜, შემდეგ სცáƒáƒ“ეთ ხელáƒáƒ®áƒšáƒ."</string>
+ <string name="dlg_confirm_kill_storage_users_title" msgid="963039033470478697">"USB მეხსიერების ჩáƒáƒ áƒ—ვáƒ"</string>
+ <string name="dlg_confirm_kill_storage_users_text" msgid="5100428757107469454">"თუ USB მეხსიერებáƒáƒ¡ ჩáƒáƒ áƒ—áƒáƒ•თ, თქვენ მიერ მáƒáƒ®áƒ›áƒáƒ áƒ”ბáƒáƒ“ი რáƒáƒ›áƒ“ენიმე áƒáƒžáƒ˜ შეწყვეტს მუშáƒáƒáƒ‘áƒáƒ¡ დრშესáƒáƒ«áƒšáƒáƒ მიუწვდáƒáƒ›áƒ”ლი გáƒáƒ®áƒ“ეს USB მეხსიერების გáƒáƒ›áƒáƒ áƒ—ვáƒáƒ›áƒ“ე."</string>
+ <string name="dlg_error_title" msgid="7323658469626514207">"USB áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ წáƒáƒ áƒ£áƒ›áƒáƒ¢áƒ”ბელი იყáƒ"</string>
+ <string name="dlg_ok" msgid="7376953167039865701">"OK"</string>
+ <string name="usb_mtp_notification_title" msgid="3699913097391550394">"დáƒáƒ™áƒáƒ•შირებულირრáƒáƒ’áƒáƒ áƒª მედირმáƒáƒ¬áƒ§áƒáƒ‘ილáƒáƒ‘áƒ"</string>
+ <string name="usb_ptp_notification_title" msgid="1960817192216064833">"დáƒáƒ™áƒáƒ•შირებულირრáƒáƒ’áƒáƒ áƒª კáƒáƒ›áƒ”რáƒ"</string>
+ <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"დáƒáƒ™áƒáƒ•შირებულირრáƒáƒ’áƒáƒ áƒª დáƒáƒ›áƒ§áƒ”ნებელი"</string>
+ <string name="usb_accessory_notification_title" msgid="7848236974087653666">"დáƒáƒ™áƒáƒ•შირებულირUSB áƒáƒ¥áƒ¡áƒ”სუáƒáƒ áƒ—áƒáƒœ"</string>
+ <string name="usb_notification_message" msgid="2290859399983720271">"შეეხეთ USB-ის სხვრპáƒáƒ áƒáƒ›áƒ”ტრების სáƒáƒœáƒáƒ®áƒáƒ•áƒáƒ“."</string>
+ <string name="extmedia_format_title" product="nosdcard" msgid="9020092196061007262">"დáƒáƒ•áƒáƒ¤áƒáƒ áƒ›áƒáƒ¢áƒ USB მეხსიერებáƒ?"</string>
+ <string name="extmedia_format_title" product="default" msgid="3648415921526526069">"გსურთ SD ბáƒáƒ áƒáƒ—ის დáƒáƒ¤áƒáƒ áƒ›áƒáƒ¢áƒ”ბáƒ?"</string>
+ <string name="extmedia_format_message" product="nosdcard" msgid="3934016853425761078">"თქვენ USB მეხსიერებáƒáƒ¨áƒ˜ შენáƒáƒ®áƒ£áƒšáƒ˜ ყველრფáƒáƒ˜áƒšáƒ˜ წáƒáƒ˜áƒ¨áƒšáƒ”ბáƒ. ეს მáƒáƒ¥áƒ›áƒ”დებრვეღáƒáƒ  შეიცვლებáƒ!"</string>
+ <string name="extmedia_format_message" product="default" msgid="14131895027543830">"თქვენს ბáƒáƒ áƒáƒ—ზე ყველრმáƒáƒœáƒáƒªáƒ”მი დáƒáƒ˜áƒ™áƒáƒ áƒ’ებáƒ."</string>
+ <string name="extmedia_format_button_format" msgid="4131064560127478695">"დáƒáƒ¤áƒáƒ áƒ›áƒáƒ¢áƒ”ბáƒ"</string>
+ <string name="adb_active_notification_title" msgid="6729044778949189918">"USB გáƒáƒ›áƒáƒ áƒ—ვრშეერთებულიáƒ"</string>
+ <string name="adb_active_notification_message" msgid="1016654627626476142">"შეეხეთ, რáƒáƒ—რშეწყვიტáƒáƒ— USB-ის გáƒáƒ›áƒáƒ áƒ—ვáƒ."</string>
+ <string name="select_input_method" msgid="4653387336791222978">"áƒáƒ˜áƒ áƒ©áƒ˜áƒ”თ შეყვáƒáƒœáƒ˜áƒ¡ მეთáƒáƒ“ი"</string>
+ <string name="configure_input_methods" msgid="9091652157722495116">"შეყვáƒáƒœáƒ˜áƒ¡ მეთáƒáƒ“ების დáƒáƒ§áƒ”ნებáƒ"</string>
+ <string name="use_physical_keyboard" msgid="6203112478095117625">"ფიზიკური კლáƒáƒ•იáƒáƒ¢áƒ£áƒ áƒ"</string>
+ <string name="hardware" msgid="7517821086888990278">"მáƒáƒ¬áƒ§áƒáƒ‘ილáƒáƒ‘áƒ"</string>
+ <string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"შეáƒáƒ áƒ©áƒ˜áƒ”თ კლáƒáƒ•იáƒáƒ¢áƒ£áƒ áƒ˜áƒ¡ გáƒáƒœáƒšáƒáƒ’ებáƒ."</string>
+ <string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"კლáƒáƒ•იáƒáƒ¢áƒ£áƒ áƒ˜áƒ¡ გáƒáƒœáƒšáƒáƒ’ების შესáƒáƒ áƒ©áƒ”ვáƒáƒ“ შეეხეთ."</string>
+ <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+ <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+ <string name="candidates_style" msgid="4333913089637062257"><u>"კáƒáƒœáƒ“იდáƒáƒ¢áƒ”ბი"</u></string>
+ <string name="ext_media_checking_notification_title" product="nosdcard" msgid="3449816005351468560">"USB მეხსიერების მáƒáƒ›áƒ–áƒáƒ“ებáƒ"</string>
+ <string name="ext_media_checking_notification_title" product="default" msgid="5457603418970994050">"SD ბáƒáƒ áƒáƒ—ის მáƒáƒ›áƒ–áƒáƒ“ებáƒ"</string>
+ <string name="ext_media_checking_notification_message" msgid="8287319882926737053">"შეცდáƒáƒ›áƒ”ბის შემáƒáƒ¬áƒ›áƒ”ბáƒ"</string>
+ <string name="ext_media_nofs_notification_title" product="nosdcard" msgid="7788040745686229307">"ცáƒáƒ áƒ˜áƒ”ლი USB მეხსიერებáƒ"</string>
+ <string name="ext_media_nofs_notification_title" product="default" msgid="780477838241212997">"ცáƒáƒ áƒ˜áƒ”ლი SD ბáƒáƒ áƒáƒ—ი"</string>
+ <string name="ext_media_nofs_notification_message" product="nosdcard" msgid="7840121067427269500">"USB მეხსიერებრცáƒáƒ áƒ˜áƒ”ლირáƒáƒœ მხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელი ფáƒáƒ˜áƒšáƒ£áƒ áƒ˜ სისტემრáƒáƒ¥áƒ•ს."</string>
+ <string name="ext_media_nofs_notification_message" product="default" msgid="8641065641786923604">"SD ბáƒáƒ áƒáƒ—ი ცáƒáƒ áƒ˜áƒ”ლირáƒáƒœ ფáƒáƒ˜áƒšáƒ£áƒ áƒ˜ სისტემრმხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელიáƒ."</string>
+ <string name="ext_media_unmountable_notification_title" product="nosdcard" msgid="2090046769532713563">"დáƒáƒ–იáƒáƒœáƒ”ბული USB მეხსიერებáƒ"</string>
+ <string name="ext_media_unmountable_notification_title" product="default" msgid="6410723906019100189">"დáƒáƒ–იáƒáƒœáƒ”ბული SD ბáƒáƒ áƒáƒ—ი"</string>
+ <string name="ext_media_unmountable_notification_message" product="nosdcard" msgid="1795917578395333280">"USB მეხსიერებრდáƒáƒ–იáƒáƒœáƒ”ბულიáƒ. სცáƒáƒ“ეთ მისი ხელáƒáƒ®áƒšáƒ დáƒáƒ¤áƒáƒ áƒ›áƒáƒ¢áƒ”ბáƒ."</string>
+ <string name="ext_media_unmountable_notification_message" product="default" msgid="1753898567525568253">"SD ბáƒáƒ áƒáƒ—ი დáƒáƒ–იáƒáƒœáƒ”ბულიáƒ. სცáƒáƒ“ეთ მისი ხელáƒáƒ®áƒšáƒ დáƒáƒ¤áƒáƒ áƒ›áƒáƒ¢áƒ”ბáƒ."</string>
+ <string name="ext_media_badremoval_notification_title" product="nosdcard" msgid="1661683031330951073">"USB მეხსიერებრმáƒáƒ£áƒšáƒáƒ“ნელáƒáƒ“ გáƒáƒ›áƒáƒ˜áƒ áƒ—áƒ"</string>
+ <string name="ext_media_badremoval_notification_title" product="default" msgid="6872152882604407837">"SD ბáƒáƒ áƒáƒ—ი მáƒáƒ£áƒšáƒáƒ“ნელáƒáƒ“ მáƒáƒ˜áƒ®áƒ¡áƒœáƒ"</string>
+ <string name="ext_media_badremoval_notification_message" product="nosdcard" msgid="4329848819865594241">"გáƒáƒ›áƒáƒ”რთებáƒáƒ›áƒ“ე გáƒáƒ—იშეთ USB მეხსიერებáƒ, რáƒáƒ—რთáƒáƒ•იდáƒáƒœ áƒáƒ˜áƒªáƒ˜áƒšáƒáƒ— მáƒáƒœáƒáƒªáƒ”მების დáƒáƒ™áƒáƒ áƒ’ვáƒ."</string>
+ <string name="ext_media_badremoval_notification_message" product="default" msgid="7260183293747448241">"გáƒáƒ›áƒáƒ”რთებáƒáƒ›áƒ“ე გáƒáƒ—იშეთ SD ბáƒáƒ áƒáƒ—ი, რáƒáƒ—რთáƒáƒ•იდáƒáƒœ áƒáƒ˜áƒªáƒ˜áƒšáƒáƒ— მáƒáƒœáƒáƒªáƒ”მების დáƒáƒ™áƒáƒ áƒ’ვáƒ."</string>
+ <string name="ext_media_safe_unmount_notification_title" product="nosdcard" msgid="3967973893270360230">"USB მეხსიერების გáƒáƒ›áƒáƒ áƒ—ვრუსáƒáƒ¤áƒ áƒ—ხáƒáƒ"</string>
+ <string name="ext_media_safe_unmount_notification_title" product="default" msgid="6729801130790616200">"SD ბáƒáƒ áƒáƒ—ის მáƒáƒ®áƒ¡áƒœáƒ უსáƒáƒ¤áƒ áƒ—ხáƒáƒ"</string>
+ <string name="ext_media_safe_unmount_notification_message" product="nosdcard" msgid="6142195361606493530">"შეგიძლიáƒáƒ— უსáƒáƒ¤áƒ áƒ—ხáƒáƒ“ გáƒáƒ›áƒáƒáƒ”რთáƒáƒ— USB მეხსიერებáƒ."</string>
+ <string name="ext_media_safe_unmount_notification_message" product="default" msgid="568841278138377604">"შეგიძლიáƒáƒ— უსáƒáƒ¤áƒ áƒ—ხáƒáƒ“ გáƒáƒ›áƒáƒáƒ”რთáƒáƒ— SD ბáƒáƒ áƒáƒ—ი."</string>
+ <string name="ext_media_nomedia_notification_title" product="nosdcard" msgid="4486377230140227651">"გáƒáƒ›áƒáƒ áƒ—ული USB მეხსიერებáƒ"</string>
+ <string name="ext_media_nomedia_notification_title" product="default" msgid="8902518030404381318">"გáƒáƒ›áƒáƒ¦áƒ”ბულირSD ბáƒáƒ áƒáƒ—ი."</string>
+ <string name="ext_media_nomedia_notification_message" product="nosdcard" msgid="6921126162580574143">"USB მეხსიერებრგáƒáƒ›áƒáƒ”რთებულიáƒ. მიუერთეთ áƒáƒ®áƒáƒšáƒ˜ მედიáƒ."</string>
+ <string name="ext_media_nomedia_notification_message" product="default" msgid="3870120652983659641">"SD ბáƒáƒ áƒáƒ—ი მáƒáƒ®áƒ¡áƒœáƒ˜áƒšáƒ˜áƒ. ჩáƒáƒ¡áƒ•ით áƒáƒ®áƒáƒšáƒ˜."</string>
+ <string name="activity_list_empty" msgid="1675388330786841066">"შესáƒáƒ¢áƒ§áƒ•ისი áƒáƒ¥áƒ¢áƒ˜áƒ•áƒáƒ‘ები áƒáƒ  áƒáƒ áƒ˜áƒ¡."</string>
+ <string name="permlab_pkgUsageStats" msgid="8787352074326748892">"კáƒáƒ›áƒžáƒáƒœáƒ”ნტების გáƒáƒ›áƒáƒ§áƒ”ნების სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ გáƒáƒœáƒáƒ®áƒšáƒ”ბáƒ"</string>
+ <string name="permdesc_pkgUsageStats" msgid="1106612424254277630">"áƒáƒžáƒ¡ შეეძლებáƒ, შეცვáƒáƒšáƒáƒ¡ კáƒáƒ›áƒžáƒáƒœáƒ”ნტის გáƒáƒ›áƒáƒ§áƒ”ნების შეგრáƒáƒ•ებული სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ. áƒáƒ  გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებრჩვეულებრივ áƒáƒžáƒ”ბში."</string>
+ <string name="permlab_copyProtectedData" msgid="4341036311211406692">"კáƒáƒœáƒ¢áƒ”ნტის კáƒáƒžáƒ˜áƒ áƒ”ბáƒ"</string>
+ <string name="permdesc_copyProtectedData" msgid="4390697124288317831">"áƒáƒžáƒ¡ შეეძლებრკáƒáƒœáƒ¢áƒ”ნტის კáƒáƒžáƒ˜áƒ áƒ”ბისთვის კáƒáƒœáƒ¢áƒ”ინერის ნáƒáƒ’ულისხმევი სერვისის გáƒáƒ›áƒáƒ«áƒáƒ®áƒ”ბáƒ. áƒáƒ  გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებრჩვეულებრივ áƒáƒžáƒ”ბში."</string>
+ <string name="permlab_route_media_output" msgid="1642024455750414694">"მულტიმედირმáƒáƒœáƒáƒªáƒ”მების გáƒáƒ“áƒáƒ›áƒ˜áƒ¡áƒáƒ›áƒáƒ áƒ—ებáƒ"</string>
+ <string name="permdesc_route_media_output" msgid="4932818749547244346">"áƒáƒžáƒšáƒ˜áƒ™áƒáƒªáƒ˜áƒáƒ¡ შეეძლებრგáƒáƒ“áƒáƒáƒ›áƒ˜áƒ¡áƒáƒ›áƒáƒ áƒ—áƒáƒ¡ მულტიმედირმáƒáƒœáƒáƒªáƒ”მები სხვრგáƒáƒ áƒ” მáƒáƒ¬áƒ§áƒáƒ‘ილáƒáƒ‘ებისკენ."</string>
+ <string name="permlab_access_keyguard_secure_storage" msgid="7565552237977815047">"ღილáƒáƒ™áƒ”ბის დáƒáƒ›áƒªáƒáƒ•ის უსáƒáƒ¤áƒ áƒ—ხრსáƒáƒªáƒáƒ•ზე წვდáƒáƒ›áƒ"</string>
+ <string name="permdesc_access_keyguard_secure_storage" msgid="5866245484303285762">"áƒáƒžáƒšáƒ˜áƒ™áƒáƒªáƒ˜áƒáƒ¡ ღილáƒáƒ™áƒ”ბის დáƒáƒ›áƒªáƒáƒ•ის უსáƒáƒ¤áƒ áƒ—ხრსáƒáƒªáƒáƒ•ზე წვდáƒáƒ›áƒ˜áƒ¡ უფლებრექნებáƒ."</string>
+ <string name="permlab_control_keyguard" msgid="172195184207828387">"ღილáƒáƒ™áƒ”ბის დáƒáƒ›áƒªáƒáƒ•ის გáƒáƒ›áƒáƒ©áƒ”ნისრდრდáƒáƒ›áƒáƒšáƒ•ის მáƒáƒ áƒ—ვáƒ"</string>
+ <string name="permdesc_control_keyguard" msgid="3043732290518629061">"áƒáƒžáƒšáƒ˜áƒ™áƒáƒªáƒ˜áƒáƒ¡ შეეძლებრღილáƒáƒ™áƒ”ბის დáƒáƒ›áƒªáƒáƒ•ის კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜."</string>
+ <string name="tutorial_double_tap_to_zoom_message_short" msgid="4070433208160063538">"მáƒáƒ¡áƒ¨áƒ¢áƒáƒ‘ის მáƒáƒ áƒ—ვისთვის შეეხეთ áƒáƒ áƒ¯áƒ”რ."</string>
+ <string name="gadget_host_error_inflating" msgid="4882004314906466162">"ვერ დáƒáƒ”მáƒáƒ¢áƒ ვიჯეტი."</string>
+ <string name="ime_action_go" msgid="8320845651737369027">"გáƒáƒ“áƒáƒ¡áƒ•ლáƒ"</string>
+ <string name="ime_action_search" msgid="658110271822807811">"ძებნáƒ"</string>
+ <string name="ime_action_send" msgid="2316166556349314424">"გáƒáƒ’ზáƒáƒ•ნáƒ"</string>
+ <string name="ime_action_next" msgid="3138843904009813834">"მáƒáƒ›áƒ“ევნáƒ"</string>
+ <string name="ime_action_done" msgid="8971516117910934605">"დáƒáƒ¡áƒ áƒ£áƒšáƒ“áƒ"</string>
+ <string name="ime_action_previous" msgid="1443550039250105948">"წინáƒ"</string>
+ <string name="ime_action_default" msgid="2840921885558045721">"გáƒáƒœáƒ®áƒáƒ áƒªáƒ˜áƒ”ლებáƒ"</string>
+ <string name="dial_number_using" msgid="5789176425167573586">"ნáƒáƒ›áƒ”რზე დáƒáƒ áƒ”კვáƒ\n<xliff:g id="NUMBER">%s</xliff:g>-ის გáƒáƒ›áƒáƒ§áƒ”ნებით"</string>
+ <string name="create_contact_using" msgid="4947405226788104538">"კáƒáƒœáƒ¢áƒáƒ¥áƒ¢áƒ˜áƒ¡ შექმნáƒ\n <xliff:g id="NUMBER">%s</xliff:g>-ის გáƒáƒ›áƒáƒ§áƒ”ნებით"</string>
+ <string name="grant_credentials_permission_message_header" msgid="2106103817937859662">"მითითებული ერთი áƒáƒœ რáƒáƒ›áƒ“ენიმე áƒáƒžáƒ˜ ითხáƒáƒ•ს თქვენს áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ–ე წვდáƒáƒ›áƒ˜áƒ¡ უფლებáƒáƒ¡, áƒáƒ®áƒšáƒ დრმáƒáƒ›áƒáƒ•áƒáƒšáƒ¨áƒ˜."</string>
+ <string name="grant_credentials_permission_message_footer" msgid="3125211343379376561">"გსურთ áƒáƒ› მáƒáƒ—ხáƒáƒ•ნის დáƒáƒ™áƒ›áƒáƒ§áƒáƒ¤áƒ˜áƒšáƒ”ბáƒ?"</string>
+ <string name="grant_permissions_header_text" msgid="6874497408201826708">"წვდáƒáƒ›áƒ˜áƒ¡ მáƒáƒ—ხáƒáƒ•ნáƒ"</string>
+ <string name="allow" msgid="7225948811296386551">"უფლების მიცემáƒ"</string>
+ <string name="deny" msgid="2081879885755434506">"áƒáƒ™áƒ áƒ«áƒáƒšáƒ•áƒ"</string>
+ <string name="permission_request_notification_title" msgid="6486759795926237907">"მáƒáƒ—ხáƒáƒ•ნილირნებáƒáƒ áƒ—ვáƒ"</string>
+ <string name="permission_request_notification_with_subtitle" msgid="8530393139639560189">"მáƒáƒ—ხáƒáƒ•ნილირნებრáƒáƒ—ვრ\náƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜áƒ¡áƒ—ვის: <xliff:g id="ACCOUNT">%s</xliff:g>"</string>
+ <string name="input_method_binding_label" msgid="1283557179944992649">"შეყვáƒáƒœáƒ˜áƒ¡ მეთáƒáƒ“ი"</string>
+ <string name="sync_binding_label" msgid="3687969138375092423">"სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ"</string>
+ <string name="accessibility_binding_label" msgid="4148120742096474641">"წვდáƒáƒ›áƒ"</string>
+ <string name="wallpaper_binding_label" msgid="1240087844304687662">"ფáƒáƒœáƒ˜"</string>
+ <string name="chooser_wallpaper" msgid="7873476199295190279">"ფáƒáƒœáƒ˜áƒ¡ შეცვლáƒ"</string>
+ <string name="notification_listener_binding_label" msgid="2014162835481906429">"შეტყáƒáƒ‘ინებების მსმენელი"</string>
+ <string name="vpn_title" msgid="19615213552042827">"VPN გáƒáƒáƒ¥áƒ¢áƒ˜áƒ£áƒ áƒ”ბულიáƒ"</string>
+ <string name="vpn_title_long" msgid="6400714798049252294">"VPN გáƒáƒáƒ¥áƒ¢áƒ˜áƒ£áƒ áƒ”ბულირ<xliff:g id="APP">%s</xliff:g>-ის მიერ"</string>
+ <string name="vpn_text" msgid="3011306607126450322">"შეეხეთ ქსელის სáƒáƒ›áƒáƒ áƒ—áƒáƒ•áƒáƒ“."</string>
+ <string name="vpn_text_long" msgid="6407351006249174473">"მიერთებულირ<xliff:g id="SESSION">%s</xliff:g>-ზე. შეეხეთ ქსელის სáƒáƒ›áƒáƒ áƒ—áƒáƒ•áƒáƒ“."</string>
+ <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"მიმდინáƒáƒ áƒ”áƒáƒ‘ს მუდმივáƒáƒ“ ჩáƒáƒ áƒ—ული VPN-ის მიერთებáƒâ€¦"</string>
+ <string name="vpn_lockdown_connected" msgid="8202679674819213931">"მუდმივáƒáƒ“ ჩáƒáƒ áƒ—ული VPN-ის მიერთებულიáƒ"</string>
+ <string name="vpn_lockdown_error" msgid="6009249814034708175">"შეცდáƒáƒ›áƒ მუდáƒáƒ› VPN-ზე"</string>
+ <string name="vpn_lockdown_config" msgid="6415899150671537970">"კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡áƒ—ვის შეეხეთ"</string>
+ <string name="upload_file" msgid="2897957172366730416">"ფáƒáƒ˜áƒšáƒ˜áƒ¡ áƒáƒ áƒ©áƒ”ვáƒ"</string>
+ <string name="no_file_chosen" msgid="6363648562170759465">"ფáƒáƒ˜áƒšáƒ˜ áƒáƒ áƒ©áƒ”ული áƒáƒ  áƒáƒ áƒ˜áƒ¡"</string>
+ <string name="reset" msgid="2448168080964209908">"სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ–ე დáƒáƒ‘რუნებáƒ"</string>
+ <string name="submit" msgid="1602335572089911941">"გáƒáƒ’ზáƒáƒ•ნáƒ"</string>
+ <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"მáƒáƒœáƒ¥áƒáƒœáƒ˜áƒ¡ რეჟიმი ჩáƒáƒ áƒ—ულიáƒ"</string>
+ <string name="car_mode_disable_notification_message" msgid="8035230537563503262">"შეეხეთ მáƒáƒœáƒ¥áƒáƒœáƒ˜áƒ¡ რეჟიმიდáƒáƒœ გáƒáƒ›áƒáƒ¡áƒáƒ¡áƒ•ლელáƒáƒ“."</string>
+ <string name="tethered_notification_title" msgid="3146694234398202601">"ინტერნეტის მიერთებრáƒáƒœ უსáƒáƒ“ენრქსელი áƒáƒ¥áƒ¢áƒ˜áƒ£áƒ áƒ˜áƒ."</string>
+ <string name="tethered_notification_message" msgid="6857031760103062982">"შესáƒáƒ¥áƒ›áƒœáƒ”ლáƒáƒ“ შეეხეთ"</string>
+ <string name="back_button_label" msgid="2300470004503343439">"უკáƒáƒœ"</string>
+ <string name="next_button_label" msgid="1080555104677992408">"მáƒáƒ›áƒ“ევნáƒ"</string>
+ <string name="skip_button_label" msgid="1275362299471631819">"გáƒáƒ›áƒáƒ¢áƒáƒ•ებáƒ"</string>
+ <string name="throttle_warning_notification_title" msgid="4890894267454867276">"მáƒáƒ‘ილური ინტერნეტის მáƒáƒ¦áƒáƒšáƒ˜ მáƒáƒ®áƒ›áƒáƒ áƒ”ბáƒ"</string>
+ <string name="throttle_warning_notification_message" msgid="3340822228599337743">"შეეხეთ, რáƒáƒ—რშეიტყáƒáƒ— მეტი მáƒáƒ‘ილურის ინტერნეტის გáƒáƒ›áƒáƒ§áƒ”ნების შესáƒáƒ®áƒ”ბ."</string>
+ <string name="throttled_notification_title" msgid="6269541897729781332">"მáƒáƒ‘ილური ინტერნეტის ლიმიტი გáƒáƒ“áƒáƒ­áƒáƒ áƒ‘ებულიáƒ"</string>
+ <string name="throttled_notification_message" msgid="5443457321354907181">"შეეხეთ, რáƒáƒ—რშეიტყáƒáƒ— მეტი მáƒáƒ‘ილურის ინტერნეტის გáƒáƒ›áƒáƒ§áƒ”ნების შესáƒáƒ®áƒ”ბ."</string>
+ <string name="no_matches" msgid="8129421908915840737">"შესáƒáƒ¢áƒ§áƒ•ისები áƒáƒ  áƒáƒ áƒ˜áƒ¡."</string>
+ <string name="find_on_page" msgid="1946799233822820384">"გვერდზე ძებნáƒ"</string>
+ <plurals name="matches_found">
+ <item quantity="one" msgid="8167147081136579439">"1 დáƒáƒ›áƒ—ხვევáƒ"</item>
+ <item quantity="other" msgid="4641872797067609177">"<xliff:g id="INDEX">%d</xliff:g> <xliff:g id="TOTAL">%d</xliff:g>-დáƒáƒœ"</item>
+ </plurals>
+ <string name="action_mode_done" msgid="7217581640461922289">"დáƒáƒ¡áƒ áƒ£áƒšáƒ“áƒ"</string>
+ <string name="progress_unmounting" product="nosdcard" msgid="3923810448507612746">"USB მეხსიერების გáƒáƒ—იშვáƒâ€¦"</string>
+ <string name="progress_unmounting" product="default" msgid="1327894998409537190">"მიმდინáƒáƒ áƒ”áƒáƒ‘ს SD ბáƒáƒ áƒáƒ—ის მáƒáƒ®áƒ¡áƒœáƒâ€¦"</string>
+ <string name="progress_erasing" product="nosdcard" msgid="4521573321524340058">"მიმდინáƒáƒ áƒ”áƒáƒ‘ს USB მეხსიერების გáƒáƒ¡áƒ£áƒ¤áƒ—áƒáƒ•ებáƒâ€¦"</string>
+ <string name="progress_erasing" product="default" msgid="6596988875507043042">"SD ბáƒáƒ áƒáƒ—ის წáƒáƒ¨áƒšáƒ..."</string>
+ <string name="format_error" product="nosdcard" msgid="6299769563624776948">"USB მეხსიერების წáƒáƒ¨áƒšáƒ ვერ მáƒáƒ®áƒ”რხდáƒ."</string>
+ <string name="format_error" product="default" msgid="7315248696644510935">"SD ბáƒáƒ áƒáƒ—ის წáƒáƒ¨áƒšáƒ ვერ მáƒáƒ®áƒ”რხდáƒ."</string>
+ <string name="media_bad_removal" msgid="7960864061016603281">"SD ბáƒáƒ áƒáƒ—ი მáƒáƒœáƒáƒ› მáƒáƒ˜áƒ®áƒ¡áƒœáƒ, ვიდრე გáƒáƒ›áƒáƒ”რთებული იქნებáƒáƒ“áƒ."</string>
+ <string name="media_checking" product="nosdcard" msgid="418188720009569693">"USB მეხსიერებრáƒáƒ›áƒŸáƒáƒ›áƒáƒ“ შემáƒáƒ¬áƒ›áƒ”ბის პრáƒáƒªáƒ”სშიáƒ."</string>
+ <string name="media_checking" product="default" msgid="7334762503904827481">"áƒáƒ›áƒŸáƒáƒ›áƒáƒ“ მიმდინáƒáƒ áƒ”áƒáƒ‘ს SD ბáƒáƒ áƒáƒ—ის შემáƒáƒ¬áƒ›áƒ”ბáƒ."</string>
+ <string name="media_removed" msgid="7001526905057952097">"SD ბáƒáƒ áƒáƒ—ი გáƒáƒ›áƒáƒ”რთებულიáƒ."</string>
+ <string name="media_shared" product="nosdcard" msgid="5830814349250834225">"USB მეხსიერებáƒáƒ¡ კáƒáƒ›áƒžáƒ˜áƒ£áƒ¢áƒ”რი იყენებს áƒáƒ›áƒŸáƒáƒ›áƒáƒ“."</string>
+ <string name="media_shared" product="default" msgid="5706130568133540435">"SD ბáƒáƒ áƒáƒ—ს კáƒáƒ›áƒžáƒ˜áƒ£áƒ¢áƒ”რი იყენებს áƒáƒ›áƒŸáƒáƒ›áƒáƒ“."</string>
+ <string name="media_unknown_state" msgid="729192782197290385">"გáƒáƒ áƒ” მედირუცნáƒáƒ‘ მდგáƒáƒ›áƒáƒ áƒ”áƒáƒ‘áƒáƒ¨áƒ˜áƒ."</string>
+ <string name="share" msgid="1778686618230011964">"გáƒáƒ–იáƒáƒ áƒ”ბáƒ"</string>
+ <string name="find" msgid="4808270900322985960">"ძიებáƒ"</string>
+ <string name="websearch" msgid="4337157977400211589">"ვებ-ძიებáƒ"</string>
+ <string name="find_next" msgid="5742124618942193978">"მáƒáƒ›áƒ“ევნáƒáƒ¡ მáƒáƒ«áƒ”ბნáƒ"</string>
+ <string name="find_previous" msgid="2196723669388360506">"წინáƒáƒ¡ პáƒáƒ•ნáƒ"</string>
+ <string name="gpsNotifTicker" msgid="5622683912616496172">"მდებáƒáƒ áƒ”áƒáƒ‘რმáƒáƒ—ხáƒáƒ•ნილი იყრ<xliff:g id="NAME">%s</xliff:g>-ისგáƒáƒœ"</string>
+ <string name="gpsNotifTitle" msgid="5446858717157416839">"მდებáƒáƒ áƒ”áƒáƒ‘ის მáƒáƒ—ხáƒáƒ•ნáƒ"</string>
+ <string name="gpsNotifMessage" msgid="1374718023224000702">"მáƒáƒ—ხáƒáƒ•ნილირ<xliff:g id="NAME">%1$s</xliff:g>-ის მიერ (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
+ <string name="gpsVerifYes" msgid="2346566072867213563">"დიáƒáƒ®"</string>
+ <string name="gpsVerifNo" msgid="1146564937346454865">"áƒáƒ áƒ"</string>
+ <string name="sync_too_many_deletes" msgid="5296321850662746890">"წáƒáƒ¨áƒšáƒ˜áƒ¡ შეზღუდვრგáƒáƒ“áƒáƒ­áƒáƒ áƒ‘ებულიáƒ"</string>
+ <string name="sync_too_many_deletes_desc" msgid="496551671008694245">"<xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> წáƒáƒ¨áƒšáƒ˜áƒšáƒ˜ ერთეულირ<xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>-თვის, áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜ <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g>. რისი გáƒáƒ™áƒ”თებრგსურთ?"</string>
+ <string name="sync_really_delete" msgid="2572600103122596243">"ერთეულების წáƒáƒ¨áƒšáƒ"</string>
+ <string name="sync_undo_deletes" msgid="2941317360600338602">"წáƒáƒ¨áƒšáƒ”ბის გáƒáƒ£áƒ¥áƒ›áƒ”ბáƒ"</string>
+ <string name="sync_do_nothing" msgid="3743764740430821845">"áƒáƒ›áƒŸáƒáƒ›áƒáƒ“ áƒáƒ áƒáƒ¤áƒ”რი გáƒáƒáƒ™áƒ”თáƒ"</string>
+ <string name="choose_account_label" msgid="5655203089746423927">"áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜áƒ¡ áƒáƒ áƒ©áƒ”ვáƒ"</string>
+ <string name="add_account_label" msgid="2935267344849993553">"áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜áƒ¡ დáƒáƒ›áƒáƒ¢áƒ”ბáƒ"</string>
+ <string name="add_account_button_label" msgid="3611982894853435874">"áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜áƒ¡ დáƒáƒ›áƒáƒ¢áƒ”ბრ&amp;raquo;"</string>
+ <string name="number_picker_increment_button" msgid="2412072272832284313">"გáƒáƒ–რდáƒ"</string>
+ <string name="number_picker_decrement_button" msgid="476050778386779067">"შემცირებáƒ"</string>
+ <string name="number_picker_increment_scroll_mode" msgid="3073101067441638428">"<xliff:g id="VALUE">%s</xliff:g>-ს შეეხეთ დრáƒáƒ  áƒáƒ£áƒ¨áƒ•áƒáƒ—."</string>
+ <string name="number_picker_increment_scroll_action" msgid="9101473045891835490">"áƒáƒáƒ¡áƒ áƒ˜áƒáƒšáƒ”თ ზემáƒáƒ— გáƒáƒ¡áƒáƒ–რდელáƒáƒ“ დრჩáƒáƒáƒ¡áƒ áƒ˜áƒáƒšáƒ”თ ქვემáƒáƒ— შესáƒáƒ›áƒªáƒ˜áƒ áƒ”ბლáƒáƒ“."</string>
+ <string name="time_picker_increment_minute_button" msgid="8865885114028614321">"ერთი წუთით წინ"</string>
+ <string name="time_picker_decrement_minute_button" msgid="6246834937080684791">"წუთების შემცირებáƒ"</string>
+ <string name="time_picker_increment_hour_button" msgid="3652056055810223139">"სáƒáƒáƒ—ის მáƒáƒ›áƒáƒ¢áƒ”ბáƒ"</string>
+ <string name="time_picker_decrement_hour_button" msgid="1377479863429214792">"სáƒáƒáƒ—ით უკáƒáƒœ"</string>
+ <string name="time_picker_increment_set_pm_button" msgid="4147590696151230863">"PM-ის დáƒáƒ§áƒ”ნებáƒ"</string>
+ <string name="time_picker_decrement_set_am_button" msgid="8302140353539486752">"AM-ის დáƒáƒ§áƒ”ნებáƒ"</string>
+ <string name="date_picker_increment_month_button" msgid="5369998479067934110">"თვის მáƒáƒ›áƒáƒ¢áƒ”ბáƒ"</string>
+ <string name="date_picker_decrement_month_button" msgid="1832698995541726019">"ერთი თვით უკáƒáƒœ"</string>
+ <string name="date_picker_increment_day_button" msgid="7130465412308173903">"დღის მáƒáƒ›áƒáƒ¢áƒ”ბáƒ"</string>
+ <string name="date_picker_decrement_day_button" msgid="4131881521818750031">"დღის მáƒáƒ™áƒšáƒ”ბáƒ"</string>
+ <string name="date_picker_increment_year_button" msgid="6318697384310808899">"წლის მáƒáƒ›áƒáƒ¢áƒ”ბáƒ"</string>
+ <string name="date_picker_decrement_year_button" msgid="4482021813491121717">"წლის მáƒáƒ™áƒšáƒ”ბáƒ"</string>
+ <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
+ <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"გáƒáƒ£áƒ¥áƒ›áƒ”ბáƒ"</string>
+ <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"წáƒáƒ¨áƒšáƒ"</string>
+ <string name="keyboardview_keycode_done" msgid="1992571118466679775">"დáƒáƒ¡áƒ áƒ£áƒšáƒ“áƒ"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"რეჟიმის შეცვლáƒ"</string>
+ <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift-"</string>
+ <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"შეყვáƒáƒœáƒ"</string>
+ <string name="activitychooserview_choose_application" msgid="2125168057199941199">"áƒáƒžáƒ˜áƒ¡ áƒáƒ áƒ©áƒ”ვáƒ"</string>
+ <string name="shareactionprovider_share_with" msgid="806688056141131819">"გáƒáƒ–იáƒáƒ áƒ”ბáƒ"</string>
+ <string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"გáƒáƒ£áƒ–იáƒáƒ áƒ”თ <xliff:g id="APPLICATION_NAME">%s</xliff:g>-ს"</string>
+ <string name="content_description_sliding_handle" msgid="415975056159262248">"გáƒáƒ¡áƒ áƒ˜áƒáƒšáƒ”ბით მáƒáƒ áƒ—ვáƒ. შეეხეთ &amp; áƒáƒ  áƒáƒ£áƒ¨áƒ•áƒáƒ—."</string>
+ <string name="description_direction_up" msgid="7169032478259485180">"გáƒáƒáƒ¡áƒ áƒ˜áƒáƒšáƒ”თ ზემáƒáƒ— <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>-თვის."</string>
+ <string name="description_direction_down" msgid="5087739728639014595">"გáƒáƒáƒ¡áƒ áƒ˜áƒáƒšáƒ”თ ქვემáƒáƒ— <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>-თვის."</string>
+ <string name="description_direction_left" msgid="7207478719805562165">"გáƒáƒáƒ¡áƒ áƒ˜áƒáƒšáƒ”თ მáƒáƒ áƒªáƒ®áƒœáƒ˜áƒ• <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>-თვის."</string>
+ <string name="description_direction_right" msgid="8034433242579600980">"გáƒáƒáƒ¡áƒ áƒ˜áƒáƒšáƒ”თ მáƒáƒ áƒ¯áƒ•ნივ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>-თვის."</string>
+ <string name="description_target_unlock" msgid="2228524900439801453">"გáƒáƒœáƒ‘ლáƒáƒ™áƒ•áƒ"</string>
+ <string name="description_target_camera" msgid="969071997552486814">"კáƒáƒ›áƒ”რáƒ"</string>
+ <string name="description_target_silent" msgid="893551287746522182">"უხმáƒ"</string>
+ <string name="description_target_soundon" msgid="30052466675500172">"ხმის ჩáƒáƒ áƒ—ვáƒ"</string>
+ <string name="description_target_search" msgid="3091587249776033139">"ძიებáƒ"</string>
+ <string name="description_target_unlock_tablet" msgid="3833195335629795055">"გáƒáƒœáƒ‘ლáƒáƒ™áƒ•ისáƒáƒ—ვის გáƒáƒ“áƒáƒ¤áƒ£áƒ áƒªáƒšáƒ”თ"</string>
+ <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"შეáƒáƒ”რთედ ყურსáƒáƒ¡áƒ›áƒ”ნები, პáƒáƒ áƒáƒšáƒ˜áƒ¡ ღილáƒáƒ™áƒ”ბი რáƒáƒ› გáƒáƒ˜áƒ’áƒáƒ—."</string>
+ <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"წერტილი."</string>
+ <string name="action_bar_home_description" msgid="5293600496601490216">"მთáƒáƒ•áƒáƒ áƒ–ე ნáƒáƒ•იგáƒáƒªáƒ˜áƒ"</string>
+ <string name="action_bar_up_description" msgid="2237496562952152589">"ზემáƒáƒ— ნáƒáƒ•იგáƒáƒªáƒ˜áƒ"</string>
+ <string name="action_menu_overflow_description" msgid="2295659037509008453">"მეტი ვáƒáƒ áƒ˜áƒáƒœáƒ¢áƒ”ბი"</string>
+ <string name="action_bar_home_description_format" msgid="7965984360903693903">"%1$s, %2$s"</string>
+ <string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string>
+ <string name="storage_internal" msgid="4891916833657929263">"შიდრმეხსიერებáƒ"</string>
+ <string name="storage_sd_card" msgid="3282948861378286745">"SD ბáƒáƒ áƒáƒ—ი"</string>
+ <string name="storage_usb" msgid="3017954059538517278">"USB მეხსიერებáƒ"</string>
+ <string name="extract_edit_menu_button" msgid="8940478730496610137">"რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბáƒ"</string>
+ <string name="data_usage_warning_title" msgid="1955638862122232342">"ინტერნეტის გáƒáƒ›áƒáƒ§áƒ”ნების გáƒáƒ¤áƒ áƒ—ხილებáƒ"</string>
+ <string name="data_usage_warning_body" msgid="2814673551471969954">"შეეხეთ მáƒáƒ®áƒ›áƒáƒ áƒ”ბისრდრპáƒáƒ áƒáƒ›áƒ”ტრების სáƒáƒœáƒáƒ®áƒáƒ•áƒáƒ“."</string>
+ <string name="data_usage_3g_limit_title" msgid="7093334419518706686">"2G-3G ინტერნეტი გáƒáƒ˜áƒ—იშáƒ."</string>
+ <string name="data_usage_4g_limit_title" msgid="7636489436819470761">"4G მáƒáƒœáƒáƒªáƒ”მები გáƒáƒ—იშულიáƒ"</string>
+ <string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"მáƒáƒ‘ილური ინტერნეტი გáƒáƒ˜áƒ—იშáƒ"</string>
+ <string name="data_usage_wifi_limit_title" msgid="8992154736441284865">"Wi‑Fi მáƒáƒœáƒáƒªáƒ”მთრგáƒáƒ›áƒáƒ áƒ—ვáƒ"</string>
+ <string name="data_usage_limit_body" msgid="3317964706973601386">"გáƒáƒ¡áƒáƒáƒ¥áƒ¢áƒ˜áƒ£áƒ áƒ”ბლáƒáƒ“ შეეხეთ."</string>
+ <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"გáƒáƒ“áƒáƒ­áƒáƒ áƒ‘ებულირ2G-3G მáƒáƒœáƒáƒªáƒ”მების ლიმიტი"</string>
+ <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"4G ლიმიტი გáƒáƒ“áƒáƒ­áƒáƒ áƒ‘ებულიáƒ"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"მáƒáƒ‘ილური ინტერნეტის ლიმიტი გáƒáƒ“áƒáƒ­áƒáƒ áƒ‘ებულიáƒ."</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"Wi‑Fi მáƒáƒœáƒáƒªáƒ”მთრლიმიტი გáƒáƒ“áƒáƒ­áƒáƒ áƒ‘ებულიáƒ"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"ლიმიტი გáƒáƒ“áƒáƒ­áƒáƒ áƒ‘ებულირ<xliff:g id="SIZE">%s</xliff:g>-ით."</string>
+ <string name="data_usage_restricted_title" msgid="5965157361036321914">"მáƒáƒœáƒáƒªáƒ”მთრფáƒáƒœáƒ£áƒ áƒ˜ გáƒáƒ“áƒáƒªáƒ”მრშეზღუდულიáƒ"</string>
+ <string name="data_usage_restricted_body" msgid="6741521330997452990">"შეეხეთ შეზღუდვის მáƒáƒ¡áƒáƒ®áƒ¡áƒœáƒ”ლáƒáƒ“"</string>
+ <string name="ssl_certificate" msgid="6510040486049237639">"უსáƒáƒ¤áƒ áƒ—ხáƒáƒ”ბის სერტიფიკáƒáƒ¢áƒ˜"</string>
+ <string name="ssl_certificate_is_valid" msgid="6825263250774569373">"ეს სერტიფიკáƒáƒ¢áƒ˜ სწáƒáƒ áƒ˜áƒ."</string>
+ <string name="issued_to" msgid="454239480274921032">"მიეცáƒ:"</string>
+ <string name="common_name" msgid="2233209299434172646">"სტáƒáƒœáƒ“áƒáƒ áƒ¢áƒ£áƒšáƒ˜ სáƒáƒ®áƒ”ლი:"</string>
+ <string name="org_name" msgid="6973561190762085236">"áƒáƒ áƒ’áƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ:"</string>
+ <string name="org_unit" msgid="7265981890422070383">"áƒáƒ áƒ’áƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ£áƒšáƒ˜ ერთეული:"</string>
+ <string name="issued_by" msgid="2647584988057481566">"გáƒáƒ›áƒªáƒ”მი:"</string>
+ <string name="validity_period" msgid="8818886137545983110">"ვáƒáƒšáƒ˜áƒ“ურáƒáƒ‘áƒ:"</string>
+ <string name="issued_on" msgid="5895017404361397232">"გáƒáƒªáƒ”მული:"</string>
+ <string name="expires_on" msgid="3676242949915959821">"ვáƒáƒ“რიწურებáƒ:"</string>
+ <string name="serial_number" msgid="758814067660862493">"სერიული ნáƒáƒ›áƒ”რი:"</string>
+ <string name="fingerprints" msgid="4516019619850763049">"áƒáƒœáƒáƒ‘ეჭდები:"</string>
+ <string name="sha256_fingerprint" msgid="4391271286477279263">"SHA-256 áƒáƒœáƒáƒ‘ეჭდი:"</string>
+ <string name="sha1_fingerprint" msgid="7930330235269404581">"SHA-1 თითის áƒáƒœáƒáƒ‘ეჭდი:"</string>
+ <string name="activity_chooser_view_see_all" msgid="4292569383976636200">"ყველáƒáƒ¡ ნáƒáƒ®áƒ•áƒ"</string>
+ <string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"áƒáƒ¥áƒ¢áƒ˜áƒ•áƒáƒ‘ის áƒáƒ áƒ©áƒ”ვáƒ"</string>
+ <string name="share_action_provider_share_with" msgid="5247684435979149216">"გáƒáƒ–იáƒáƒ áƒ”ბáƒ"</string>
+ <string name="status_bar_device_locked" msgid="3092703448690669768">"მáƒáƒ¬áƒ§áƒáƒ‘ილáƒáƒ‘რჩáƒáƒ™áƒ”ტილიáƒ."</string>
+ <string name="list_delimeter" msgid="3975117572185494152">", "</string>
+ <string name="sending" msgid="3245653681008218030">"იგზáƒáƒ•ნებáƒ..."</string>
+ <string name="launchBrowserDefault" msgid="2057951947297614725">"გსურთ ბრáƒáƒ£áƒ–ერის გáƒáƒ¨áƒ•ებáƒ?"</string>
+ <string name="SetupCallDefault" msgid="5834948469253758575">"უპáƒáƒ¡áƒ£áƒ®áƒ”ბთ ზáƒáƒ áƒ¡?"</string>
+ <string name="activity_resolver_use_always" msgid="8017770747801494933">"ყáƒáƒ•ელთვის"</string>
+ <string name="activity_resolver_use_once" msgid="2404644797149173758">"მხáƒáƒšáƒáƒ“ ერთხელ"</string>
+ <string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"ტáƒáƒ‘ლეტი"</string>
+ <string name="default_audio_route_name" product="default" msgid="4239291273420140123">"ტელეფáƒáƒœáƒ˜"</string>
+ <string name="default_audio_route_name_headphones" msgid="8119971843803439110">"ყურსáƒáƒ¡áƒ›áƒ”ნები"</string>
+ <string name="default_audio_route_name_dock_speakers" msgid="6240602982276591864">"სპიკერების მიმáƒáƒ’რებáƒ"</string>
+ <string name="default_media_route_name_hdmi" msgid="2450970399023478055">"HDMI"</string>
+ <string name="default_audio_route_category_name" msgid="3722811174003886946">"სისტემáƒ"</string>
+ <string name="bluetooth_a2dp_audio_route_name" msgid="8575624030406771015">"Bluetooth áƒáƒ£áƒ“იáƒ"</string>
+ <string name="wireless_display_route_description" msgid="9070346425023979651">"უსáƒáƒ“ენრეკრáƒáƒœáƒ˜"</string>
+ <string name="media_route_chooser_grouping_done" msgid="7966438307723317169">"დáƒáƒ¡áƒ áƒ£áƒšáƒ“áƒ"</string>
+ <string name="media_route_button_content_description" msgid="5758553567065145276">"მედირგáƒáƒ›áƒáƒ›áƒáƒ•áƒáƒšáƒ˜"</string>
+ <string name="media_route_status_scanning" msgid="7279908761758293783">"სკáƒáƒœáƒ˜áƒ áƒ”ბáƒ..."</string>
+ <string name="media_route_status_connecting" msgid="6422571716007825440">"დáƒáƒ™áƒáƒ•შირებáƒ..."</string>
+ <string name="media_route_status_available" msgid="6983258067194649391">"ხელმისáƒáƒ¬áƒ•დáƒáƒ›áƒ˜"</string>
+ <string name="media_route_status_not_available" msgid="6739899962681886401">"მიუწვდáƒáƒ›áƒ”ლი"</string>
+ <string name="media_route_status_in_use" msgid="4533786031090198063">"გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებáƒ"</string>
+ <string name="display_manager_built_in_display_name" msgid="2583134294292563941">"ჩáƒáƒ›áƒáƒœáƒ¢áƒáƒŸáƒ”ბული ეკრáƒáƒœáƒ˜"</string>
+ <string name="display_manager_hdmi_display_name" msgid="1555264559227470109">"HDMI ეკრáƒáƒœáƒ˜"</string>
+ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"გáƒáƒ“áƒáƒ¤áƒáƒ áƒ•რ#<xliff:g id="ID">%1$d</xliff:g>"</string>
+ <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
+ <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", დáƒáƒªáƒ£áƒšáƒ˜"</string>
+ <string name="wifi_display_notification_title" msgid="2223050649240326557">"უსáƒáƒ“ენრეკრáƒáƒœáƒ˜ დáƒáƒ™áƒáƒ•შირებულიáƒ"</string>
+ <string name="wifi_display_notification_message" msgid="4498802012464170685">"გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბრგáƒáƒ“áƒáƒ”ცემრსხვრმáƒáƒ¬áƒ§áƒáƒ‘ილáƒáƒ‘áƒáƒ¡"</string>
+ <string name="wifi_display_notification_disconnect" msgid="6183754463561153372">"კáƒáƒ•შირის გáƒáƒ¬áƒ§áƒ•ეტáƒ"</string>
+ <string name="kg_emergency_call_label" msgid="684946192523830531">"გáƒáƒ“áƒáƒ£áƒ“ებელი დáƒáƒ®áƒ›áƒáƒ áƒ”ბის ზáƒáƒ áƒ˜"</string>
+ <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"დáƒáƒ’áƒáƒ•იწყდáƒáƒ— ნიმუში"</string>
+ <string name="kg_wrong_pattern" msgid="1850806070801358830">"áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ნიმუში"</string>
+ <string name="kg_wrong_password" msgid="2333281762128113157">"áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ პáƒáƒ áƒáƒšáƒ˜"</string>
+ <string name="kg_wrong_pin" msgid="1131306510833563801">"áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ PIN"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"კიდევ სცáƒáƒ“ეთ <xliff:g id="NUMBER">%1$d</xliff:g> წáƒáƒ›áƒ¨áƒ˜."</string>
+ <string name="kg_pattern_instructions" msgid="398978611683075868">"დáƒáƒ®áƒáƒ¢áƒ”თ თქვენი ნიმუში."</string>
+ <string name="kg_sim_pin_instructions" msgid="2319508550934557331">"SIM PIN-ის შეყვáƒáƒœáƒ"</string>
+ <string name="kg_pin_instructions" msgid="2377242233495111557">"შეიყვáƒáƒœáƒ”თ PIN"</string>
+ <string name="kg_password_instructions" msgid="5753646556186936819">"პáƒáƒ áƒáƒšáƒ˜áƒ¡ შეყვáƒáƒœáƒ"</string>
+ <string name="kg_puk_enter_puk_hint" msgid="453227143861735537">"SIM áƒáƒ›áƒŸáƒáƒ›áƒáƒ“ დეáƒáƒ¥áƒ¢áƒ˜áƒ•ირებულიáƒ. გáƒáƒ¡áƒáƒ’რძელებლáƒáƒ“ შეიყვáƒáƒœáƒ”თ PUK კáƒáƒ“ი. დეტáƒáƒšáƒ”ბისთვის მიმáƒáƒ áƒ—ეთ მáƒáƒ‘ილურ áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ¡."</string>
+ <string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"სáƒáƒ¡áƒ£áƒ áƒ•ელი PIN კáƒáƒ“ის შეყვáƒáƒœáƒ"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"სáƒáƒ¡áƒ£áƒ áƒ•ელი PIN კáƒáƒ“ის დáƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ”ბáƒ"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"SIM ბáƒáƒ áƒáƒ—ის გáƒáƒœáƒ‘ლáƒáƒ™áƒ•áƒâ€¦"</string>
+ <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ PIN კáƒáƒ“ი."</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"áƒáƒ™áƒ áƒ˜áƒ¤áƒ”თ PIN, რáƒáƒ›áƒ”ლიც შედგებრ4-დáƒáƒœ 8 ციფრáƒáƒ›áƒ“ე."</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"PUK კáƒáƒ“ი უნდრიყáƒáƒ¡ რვრáƒáƒœ მეტი ციფრისგáƒáƒœ შემდგáƒáƒ áƒ˜."</string>
+ <string name="kg_invalid_puk" msgid="3638289409676051243">"ხელáƒáƒ®áƒšáƒ შეიყვáƒáƒœáƒ”თ სწáƒáƒ áƒ˜ PUK კáƒáƒ“ი. რáƒáƒ›áƒ“ენიმე წáƒáƒ áƒ£áƒ›áƒáƒ¢áƒ”ბელი მცდელáƒáƒ‘რგáƒáƒ›áƒáƒ˜áƒ¬áƒ•ევს SIM ბáƒáƒ áƒáƒ—ის დáƒáƒ‘ლáƒáƒ™áƒ•áƒáƒ¡."</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"PIN კáƒáƒ“ები áƒáƒ  ემთხვევáƒ"</string>
+ <string name="kg_login_too_many_attempts" msgid="6486842094005698475">"ნáƒáƒ®áƒáƒ¢áƒ˜ ნიმუშის ძáƒáƒšáƒ˜áƒáƒœ ბევრი მცდელáƒáƒ‘áƒ"</string>
+ <string name="kg_login_instructions" msgid="1100551261265506448">"გáƒáƒœáƒ‘ლáƒáƒ™áƒ•ისთვის გáƒáƒ˜áƒáƒ áƒ”თ áƒáƒ•ტáƒáƒ áƒ˜áƒ–áƒáƒªáƒ˜áƒ თქვენი Google áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜áƒ—."</string>
+ <string name="kg_login_username_hint" msgid="5718534272070920364">"მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი (ელფáƒáƒ¡áƒ¢áƒ)"</string>
+ <string name="kg_login_password_hint" msgid="9057289103827298549">"პáƒáƒ áƒáƒšáƒ˜"</string>
+ <string name="kg_login_submit_button" msgid="5355904582674054702">"შესვლáƒ"</string>
+ <string name="kg_login_invalid_input" msgid="5754664119319872197">"áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სáƒáƒ®áƒ”ლი, áƒáƒœ პáƒáƒ áƒáƒšáƒ˜."</string>
+ <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"დáƒáƒ’áƒáƒ•იწყდáƒáƒ— მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი დრპáƒáƒ áƒáƒšáƒ˜?\nეწვიეთ "<b>"google.com/accounts/recovery"</b>"."</string>
+ <string name="kg_login_checking_password" msgid="1052685197710252395">"მიმდინáƒáƒ áƒ”áƒáƒ‘ს áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜áƒ¡ შემáƒáƒ¬áƒ›áƒ”ბáƒâ€¦"</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"თქვენ <xliff:g id="NUMBER_0">%d</xliff:g>-ჯერ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒáƒ“ შეიყვáƒáƒœáƒ”თ PIN კáƒáƒ“ი. \n\nსცáƒáƒ“ეთ ხელáƒáƒ®áƒšáƒ <xliff:g id="NUMBER_1">%d</xliff:g> წáƒáƒ›áƒ¨áƒ˜."</string>
+ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"თქვენ <xliff:g id="NUMBER_0">%d</xliff:g>-ჯერ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒáƒ“ დáƒáƒ‘ეჭდეთ თქვენი პáƒáƒ áƒáƒšáƒ˜. \n\nხელáƒáƒ®áƒšáƒ სცáƒáƒ“ეთ <xliff:g id="NUMBER_1">%d</xliff:g> წáƒáƒ›áƒ¨áƒ˜."</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"თქვენ <xliff:g id="NUMBER_0">%d</xliff:g>-ჯერ დáƒáƒ®áƒáƒ¢áƒ”თ გáƒáƒœáƒ‘ლáƒáƒ™áƒ•ის ნიმუში. \n\nსცáƒáƒ“ეთ ხელáƒáƒ®áƒšáƒ <xliff:g id="NUMBER_1">%d</xliff:g> წáƒáƒ›áƒ¨áƒ˜."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1575557200627128949">"თქვენ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒáƒ“ სცáƒáƒ“ეთ ტáƒáƒ‘ლეტის გáƒáƒœáƒ‘ლáƒáƒ™áƒ•რ<xliff:g id="NUMBER_0">%d</xliff:g>-ჯერ. კიდევ <xliff:g id="NUMBER_1">%d</xliff:g> წáƒáƒ áƒ£áƒ›áƒáƒ¢áƒ”ბელი ცდის შემდეგ ტáƒáƒ‘ლეტზე დáƒáƒ§áƒ”ნდებრსáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜, ქáƒáƒ áƒ®áƒœáƒ£áƒšáƒ˜ პáƒáƒ áƒáƒ›áƒ”ტრები დრმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ყველრმáƒáƒœáƒáƒªáƒ”მი დáƒáƒ˜áƒ™áƒáƒ áƒ’ებáƒ."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="4051015943038199910">"თქვენ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒáƒ“ სცáƒáƒ“ეთ ტელეფáƒáƒœáƒ˜áƒ¡ გáƒáƒœáƒ‘ლáƒáƒ™áƒ•რ<xliff:g id="NUMBER_0">%d</xliff:g>-ჯერ. კიდევ <xliff:g id="NUMBER_1">%d</xliff:g> წáƒáƒ áƒ£áƒ›áƒáƒ¢áƒ”ბელი ცდის შემდეგ ტელეფáƒáƒœáƒ–ე დáƒáƒ§áƒ”ნდებრსáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜, ქáƒáƒ áƒ®áƒœáƒ£áƒšáƒ˜ პáƒáƒ áƒáƒ›áƒ”ტრები დრმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ყველრმáƒáƒœáƒáƒªáƒ”მი დáƒáƒ˜áƒ™áƒáƒ áƒ’ებáƒ."</string>
+ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="2072996269148483637">"თქვენ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒáƒ“ სცáƒáƒ“ეთ ტáƒáƒ‘ლეტის გáƒáƒœáƒ‘ლáƒáƒ™áƒ•რ<xliff:g id="NUMBER">%d</xliff:g>-ჯერ. ტáƒáƒ‘ლეტზე დáƒáƒ§áƒ”ნდებრსáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜, ქáƒáƒ áƒ®áƒœáƒ£áƒšáƒ˜ პáƒáƒ áƒáƒ›áƒ”ტრები დრმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ყველრმáƒáƒœáƒáƒªáƒ”მი დáƒáƒ˜áƒ™áƒáƒ áƒ’ებáƒ."</string>
+ <string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"თქვენ <xliff:g id="NUMBER">%d</xliff:g>-ჯერ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒáƒ“ სცáƒáƒ“ეთ ტელეფáƒáƒœáƒ˜áƒ¡ გáƒáƒœáƒ‘ლáƒáƒ™áƒ•áƒ. áƒáƒ›áƒ˜áƒ¢áƒáƒ› ტელეფáƒáƒœáƒ–ე დáƒáƒ“გებრსáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜, ქáƒáƒ áƒ®áƒœáƒ£áƒšáƒ˜ პáƒáƒ áƒáƒ›áƒ”ტრები."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"თქვენ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒáƒ“ დáƒáƒ®áƒáƒ¢áƒ”თ თქვენი გáƒáƒœáƒ‘ლáƒáƒ™áƒ•ის ნიმუში <xliff:g id="NUMBER_0">%d</xliff:g> ჯერ. კიდევ <xliff:g id="NUMBER_1">%d</xliff:g> წáƒáƒ áƒ£áƒ›áƒáƒ¢áƒ”ბელი ცდის შემდეგ მáƒáƒ’თხáƒáƒ•თ ტáƒáƒ‘ლეტის გáƒáƒœáƒ‘ლáƒáƒ™áƒ•áƒáƒ¡ ელფáƒáƒ¡áƒ¢áƒ˜áƒ¡ áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜áƒ¡ გáƒáƒ›áƒáƒ§áƒ”ნებით.\n\n ხელáƒáƒ®áƒšáƒ სცáƒáƒ“ეთ <xliff:g id="NUMBER_2">%d</xliff:g> წáƒáƒ›áƒ¨áƒ˜."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"თქვენ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒáƒ“ დáƒáƒ®áƒáƒ¢áƒ”თ თქვენი გáƒáƒœáƒ‘ლáƒáƒ™áƒ•ის ნიმუში <xliff:g id="NUMBER_0">%d</xliff:g>-ჯერ. კიდევ <xliff:g id="NUMBER_1">%d</xliff:g> წáƒáƒ áƒ£áƒ›áƒáƒ¢áƒ”ბელი ცდის შემდეგ, დáƒáƒ’ჭირდებáƒáƒ— თქვენი ტელეფáƒáƒœáƒ˜áƒ¡ გáƒáƒœáƒ‘ლáƒáƒ™áƒ•რელფáƒáƒ¡áƒ¢áƒ˜áƒ¡ áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜áƒ¡ გáƒáƒ›áƒáƒ§áƒ”ნებით.\n\n ხელáƒáƒ®áƒšáƒ სცáƒáƒ“ეთ <xliff:g id="NUMBER_2">%d</xliff:g> წáƒáƒ›áƒ¨áƒ˜."</string>
+ <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
+ <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"áƒáƒ›áƒáƒ¨áƒšáƒ"</string>
+ <string name="safe_media_volume_warning" product="default" msgid="7324161939475478066">"რეკáƒáƒ›áƒ”ნდებულ დáƒáƒœáƒ”ზე მáƒáƒ¦áƒšáƒ გსურთ ხმის áƒáƒ¬áƒ”ვáƒ?\nდიდი ხნის გáƒáƒœáƒ›áƒáƒ•ლáƒáƒ‘áƒáƒ¨áƒ˜ ძáƒáƒšáƒ˜áƒáƒœ ხმáƒáƒ›áƒáƒ¦áƒšáƒ მáƒáƒ¡áƒ›áƒ”ნáƒáƒ› შესáƒáƒ«áƒšáƒáƒ სმენრდáƒáƒ’იზიáƒáƒœáƒáƒ—."</string>
+ <string name="continue_to_enable_accessibility" msgid="1626427372316070258">"გეჭირáƒáƒ— áƒáƒ áƒ˜ თითი მáƒáƒ áƒ¢áƒ˜áƒ•ი წვდáƒáƒ›áƒ˜áƒ¡ ჩáƒáƒ¡áƒáƒ áƒ—áƒáƒ•áƒáƒ“."</string>
+ <string name="accessibility_enabled" msgid="1381972048564547685">"მáƒáƒ áƒ¢áƒ˜áƒ•ი წვდáƒáƒ›áƒ ჩáƒáƒ áƒ—ულიáƒ."</string>
+ <string name="enable_accessibility_canceled" msgid="3833923257966635673">"მáƒáƒ áƒ¢áƒ˜áƒ•ი წვდáƒáƒ›áƒ გáƒáƒ£áƒ¥áƒ›áƒ“áƒ."</string>
+ <string name="user_switched" msgid="3768006783166984410">"áƒáƒ›áƒŸáƒáƒ›áƒ˜áƒœáƒ“ელი მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი <xliff:g id="NAME">%1$s</xliff:g>."</string>
+ <string name="owner_name" msgid="2716755460376028154">"მფლáƒáƒ‘ელი"</string>
+ <string name="error_message_title" msgid="4510373083082500195">"შეცდáƒáƒ›áƒ"</string>
+ <string name="app_no_restricted_accounts" msgid="5739463249673727736">"áƒáƒ› áƒáƒžáƒ¡ შეზღუდული პრáƒáƒ¤áƒ˜áƒšáƒ”ბის áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ”ბის მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  áƒáƒ¥áƒ•ს"</string>
+ <string name="app_not_found" msgid="3429141853498927379">"áƒáƒ› მáƒáƒ¥áƒ›áƒ”დების შესáƒáƒ¡áƒ áƒ£áƒšáƒ”ბლáƒáƒ“ áƒáƒžáƒšáƒ˜áƒ™áƒáƒªáƒ˜áƒ ვერ მáƒáƒ˜áƒ«áƒ”ბნáƒ"</string>
+ <string name="revoke" msgid="5404479185228271586">"გáƒáƒ£áƒ¥áƒ›áƒ”ბáƒ"</string>
+ <string name="mediaSize_iso_a0" msgid="7875427489420821793">"ISO A0"</string>
+ <string name="mediaSize_iso_a1" msgid="3760734499050875356">"ISO A1"</string>
+ <string name="mediaSize_iso_a2" msgid="5973266378020144382">"ISO A2"</string>
+ <string name="mediaSize_iso_a3" msgid="1373407105687300884">"ISO A3"</string>
+ <string name="mediaSize_iso_a4" msgid="6689772807982597254">"ISO A4"</string>
+ <string name="mediaSize_iso_a5" msgid="5353549652015741040">"ISO A5"</string>
+ <string name="mediaSize_iso_a6" msgid="8585038048674911907">"ISO A6"</string>
+ <string name="mediaSize_iso_a7" msgid="6641836716963839119">"ISO A7"</string>
+ <string name="mediaSize_iso_a8" msgid="7571139437465693355">"ISO A8"</string>
+ <string name="mediaSize_iso_a9" msgid="1378455891957115079">"ISO A9"</string>
+ <string name="mediaSize_iso_a10" msgid="2480747457429475344">"ISO A10"</string>
+ <string name="mediaSize_iso_b0" msgid="3965935097661108039">"ISO B0"</string>
+ <string name="mediaSize_iso_b1" msgid="2505753285010115437">"ISO B1"</string>
+ <string name="mediaSize_iso_b2" msgid="8763874709859458453">"ISO B2"</string>
+ <string name="mediaSize_iso_b3" msgid="4210506688191764076">"ISO B3"</string>
+ <string name="mediaSize_iso_b4" msgid="5749404165888526034">"ISO B4"</string>
+ <string name="mediaSize_iso_b5" msgid="7640627414621904733">"ISO B5"</string>
+ <string name="mediaSize_iso_b6" msgid="7342988864712748544">"ISO B6"</string>
+ <string name="mediaSize_iso_b7" msgid="5069844065235382429">"ISO B7"</string>
+ <string name="mediaSize_iso_b8" msgid="7316818922278779774">"ISO B8"</string>
+ <string name="mediaSize_iso_b9" msgid="5414727094026532341">"ISO B9"</string>
+ <string name="mediaSize_iso_b10" msgid="5251253731832048185">"ISO B10"</string>
+ <string name="mediaSize_iso_c0" msgid="4003138342671964217">"ISO C0"</string>
+ <string name="mediaSize_iso_c1" msgid="1935188063393553008">"ISO C1"</string>
+ <string name="mediaSize_iso_c2" msgid="3197307969712069904">"ISO C2"</string>
+ <string name="mediaSize_iso_c3" msgid="4335826087321913508">"ISO C3"</string>
+ <string name="mediaSize_iso_c4" msgid="3745639598281015005">"ISO C4"</string>
+ <string name="mediaSize_iso_c5" msgid="8269457765822791013">"ISO C5"</string>
+ <string name="mediaSize_iso_c6" msgid="566666105260346930">"ISO C6"</string>
+ <string name="mediaSize_iso_c7" msgid="8678413180782608498">"ISO C7"</string>
+ <string name="mediaSize_iso_c8" msgid="8392376206627041730">"ISO C8"</string>
+ <string name="mediaSize_iso_c9" msgid="9191613372324845405">"ISO C9"</string>
+ <string name="mediaSize_iso_c10" msgid="7327709699184920822">"ISO C10"</string>
+ <string name="mediaSize_na_letter" msgid="4191805615829472953">"Letter"</string>
+ <string name="mediaSize_na_gvrnmt_letter" msgid="7853382192649405507">"Government Letter"</string>
+ <string name="mediaSize_na_legal" msgid="6697982988283823150">"Legal"</string>
+ <string name="mediaSize_na_junior_legal" msgid="3727743969902758948">"Junior Legal"</string>
+ <string name="mediaSize_na_ledger" msgid="281871464896601236">"Ledger"</string>
+ <string name="mediaSize_na_tabloid" msgid="5775966416333578127">"Tabloid"</string>
+ <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"გáƒáƒ£áƒ¥áƒ›áƒ”ბული"</string>
+ <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"შეცდáƒáƒ›áƒ კáƒáƒœáƒ¢áƒ”ნტის ჩáƒáƒ¬áƒ”რისáƒáƒ¡"</string>
+ <string name="restr_pin_enter_pin" msgid="3395953421368476103">"შეიყვáƒáƒœáƒ”თ PIN"</string>
+ <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"áƒáƒ›áƒŸáƒáƒ›áƒ˜áƒœáƒ“ელი PIN"</string>
+ <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"áƒáƒ®áƒáƒšáƒ˜ PIN"</string>
+ <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"გáƒáƒ˜áƒ›áƒ”áƒáƒ áƒ”თ áƒáƒ®áƒáƒšáƒ˜ PIN"</string>
+ <string name="restr_pin_create_pin" msgid="8017600000263450337">"შექმენით PIN შეზღუდვების ცვლილებებისáƒáƒ—ვის"</string>
+ <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"PIN-ები áƒáƒ  ემთხვევáƒ. სცáƒáƒ“ეთ ხელáƒáƒ®áƒšáƒ."</string>
+ <string name="restr_pin_error_too_short" msgid="8173982756265777792">"PIN ძáƒáƒšáƒ˜áƒáƒœ მáƒáƒ™áƒšáƒ”áƒ. უნდრშედგებáƒáƒ“ეს სულ ცáƒáƒ¢áƒ 4 ციფრისგáƒáƒœ."</string>
+ <plurals name="restr_pin_countdown">
+ <item quantity="one" msgid="4835639969503729874">"áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ PIN. სცáƒáƒ“ეთ ისევ 1 წáƒáƒ›áƒ¨áƒ˜."</item>
+ <item quantity="other" msgid="8030607343223287654">"áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ PIN. სცáƒáƒ“ეთ ისევ <xliff:g id="COUNT">%d</xliff:g> წáƒáƒ›áƒ¨áƒ˜."</item>
+ </plurals>
+ <string name="transient_navigation_confirmation" msgid="4907844043611123426">"გáƒáƒáƒ¡áƒ áƒ˜áƒáƒšáƒ”თ ეკრáƒáƒœáƒ˜áƒ¡ კიდეზე ზáƒáƒšáƒ˜áƒ¡ გáƒáƒ›áƒáƒ¡áƒáƒ©áƒ”ნáƒáƒ“"</string>
+ <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"გáƒáƒáƒ¡áƒ áƒ˜áƒáƒšáƒ”თ ეკრáƒáƒœáƒ˜áƒ¡ კიდიდáƒáƒœ სისტემის ზáƒáƒšáƒ˜áƒ¡ გáƒáƒ›áƒáƒ¡áƒáƒ©áƒ”ნáƒáƒ“"</string>
+</resources>
diff --git a/core/res/res/values-km-rKH/strings.xml b/core/res/res/values-km-rKH/strings.xml
index 6dace3c..15d4181 100644
--- a/core/res/res/values-km-rKH/strings.xml
+++ b/core/res/res/values-km-rKH/strings.xml
@@ -50,6 +50,11 @@
<string name="invalidPuk" msgid="8761456210898036513">"បញ្ចូល​កូដ PUK ដែល​មាន​ពី​ ៨ áž›áŸážâ€‹ ឬ​វែង​ជាង​នáŸáŸ‡áŸ”"</string>
<string name="needPuk" msgid="919668385956251611">"ស៊ីមកាážâ€‹â€‹ážšáž”ស់​អ្នក​ជាប់​កូដ PUK ។ បញ្ចូល​កូដ PUK ដើម្បី​ដោះ​សោ។"</string>
<string name="needPuk2" msgid="4526033371987193070">"បញ្ចូល​កូដ PUK2 ដើម្បី​ដោះ​សោ​ស៊ីម​កាážáŸ”"</string>
+ <string name="enablePin" msgid="209412020907207950">"បរាជáŸáž™, បើក​ការ​ចាក់សោ​ស៊ី​ម / RUIM ។"</string>
+ <plurals name="pinpuk_attempts">
+ <item quantity="one" msgid="6596245285809790142">"អ្នក​មាន <xliff:g id="NUMBER">%d</xliff:g> ការ​ព្យាយាម​ដែល​នៅសល់​មុន​ពáŸáž›â€‹ážŸáŸŠáž¸â€‹áž˜â€‹ážáŸ’រូវ​បាន​ចាក់សោ​។"</item>
+ <item quantity="other" msgid="7530597808358774740">"អ្នក​មាន <xliff:g id="NUMBER">%d</xliff:g> ការ​ព្យាយាម​ដែល​នៅសល់​មុន​ពáŸáž›â€‹ážŸáŸŠáž¸â€‹áž˜â€‹ážáŸ’រូវ​បាន​ចាក់សោ​។"</item>
+ </plurals>
<string name="imei" msgid="2625429890869005782">"IMEI"</string>
<string name="meid" msgid="4841221237681254195">"MEID"</string>
<string name="ClipMmi" msgid="6952821216480289285">"áž›áŸážâ€‹ážŸáž˜áŸ’គាល់​អ្នក​ហៅ​​ចូល"</string>
@@ -477,6 +482,8 @@
<string name="permdesc_accessSurfaceFlinger" msgid="1041619516733293551">"ឲ្យ​កម្មវិធី​ប្រើ​លក្ážážŽáŸˆâ€‹áž€áž˜áŸ’ážšáž·ážâ€‹áž‘ាប​របស់ SurfaceFlinger ។"</string>
<string name="permlab_readFrameBuffer" msgid="6690504248178498136">"អាន​អង្គ​ចងចាំ​បណ្ដោះ​អាសន្ន"</string>
<string name="permdesc_readFrameBuffer" msgid="4937405521809454680">"ឲ្យ​កម្មវិធី​អាន​មាážáž·áž€áž¶â€‹áž“ៃ​អង្គ​ចងចាំ​បណ្ដោះ​អាសន្ន។"</string>
+ <string name="permlab_accessInputFlinger" msgid="5348635270689553857">"ចូល​ដំណើរការ InputFlinger"</string>
+ <string name="permdesc_accessInputFlinger" msgid="2104864941201226616">"ឲ្យ​កម្មវិធី​ប្រើ​លក្ážážŽáŸˆâ€‹áž€áž˜áŸ’ážšáž·ážâ€‹áž‘áž¶áž” InputFlinger ។"</string>
<string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"កំណážáŸ‹â€‹ážšáž…នាសម្ពáŸáž“្ធ​ការ​បង្ហាញ​វ៉ាយហ្វាយ"</string>
<string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"ឲ្យ​កម្មវិធី​កំណážáŸ‹â€‹ážšáž…នាសម្ពáŸáž“្ធ​ និង​ភ្ជាប់​ទៅ​ការ​បង្ហាញ​វ៉ាយហ្វាយ។"</string>
<string name="permlab_controlWifiDisplay" msgid="393641276723695496">"ពិនិážáŸ’យ​ការ​បង្ហាញ​វ៉ាយហ្វាយ"</string>
@@ -1414,6 +1421,7 @@
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
<string name="activitychooserview_choose_application" msgid="2125168057199941199">"ជ្រើស​កម្មវិធី"</string>
+ <string name="activitychooserview_choose_application_error" msgid="8624618365481126668">"មិន​អាច​ចាប់ផ្ដើម <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="shareactionprovider_share_with" msgid="806688056141131819">"ចែករំលែក​ជា​មួយ"</string>
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"ចែក​រំលែក​ជា​មួយ <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"គ្រប់គ្រង​ការ​រុញ។ ប៉ះ &amp; សង្កážáŸ‹áŸ”"</string>
@@ -1649,5 +1657,16 @@
<item quantity="other" msgid="4730868920742952817">"សូម​ព្យាយាម​ម្ដង​ទៀážâ€‹áž€áŸ’នុង​រយៈពáŸáž› <xliff:g id="COUNT">%d</xliff:g> វិនាទី"</item>
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"សូម​ព្យាយាម​ម្ដងទៀážâ€‹áž“ៅ​ពáŸáž›â€‹áž€áŸ’រោយ។"</string>
- <string name="immersive_mode_confirmation" msgid="7227416894979047467">"អូស​​​ចុះក្រោម ដើម្បី​ចáŸáž‰â€‹áž–ី​ការ​បង្ហាញ​ពáŸáž‰â€‹áž¢áŸáž€áŸ’រង់"</string>
+ <string name="immersive_mode_confirmation" msgid="7227416894979047467">"អូស​​​​ពីលើ​ចុះក្រោម ដើម្បី​ចáŸáž‰â€‹áž–ី​ការ​បង្ហាញ​ពáŸáž‰â€‹áž¢áŸáž€áŸ’រង់។"</string>
+ <string name="done_label" msgid="2093726099505892398">"រួចរាល់"</string>
+ <string name="hour_picker_description" msgid="6698199186859736512">"គ្រាប់​រំកិល​រង្វង់​ម៉ោង"</string>
+ <string name="minute_picker_description" msgid="8606010966873791190">"គ្រាប់​រំកិល​រង្វង់​នាទី"</string>
+ <string name="select_hours" msgid="6043079511766008245">"ជ្រើស​ម៉ោង"</string>
+ <string name="select_minutes" msgid="3974345615920336087">"ជ្រើស​នាទី"</string>
+ <string name="day_picker_description" msgid="8990847925961297968">"ក្រឡា​​​ážáŸ‚​នៃ​ážáŸ’ងៃ"</string>
+ <string name="year_picker_description" msgid="5524331207436052403">"បញ្ជី​ឆ្នាំ"</string>
+ <string name="select_day" msgid="7774759604701773332">"ជ្រើស​ážáŸ‚ និង​ážáŸ’ងៃ"</string>
+ <string name="select_year" msgid="7952052866994196170">"ជ្រើស​ឆ្នាំ"</string>
+ <string name="item_is_selected" msgid="949687401682476608">"បាន​ជ្រើស <xliff:g id="ITEM">%1$s</xliff:g>"</string>
+ <string name="deleted_key" msgid="7659477886625566590">"បាន​លុប <xliff:g id="KEY">%1$s</xliff:g>"</string>
</resources>
diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml
new file mode 100644
index 0000000..e8c8bb4
--- /dev/null
+++ b/core/res/res/values-km/strings.xml
@@ -0,0 +1,1588 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="byteShort" msgid="8340973892742019101">"B"</string>
+ <string name="kilobyteShort" msgid="5973789783504771878">"គីឡូបៃ"</string>
+ <string name="megabyteShort" msgid="6355851576770428922">"មáŸáž€áž¶áž”ៃ"</string>
+ <string name="gigabyteShort" msgid="3259882455212193214">"ជីកាបៃ"</string>
+ <string name="terabyteShort" msgid="231613018159186962">"ážáŸážšáŸ‰áž¶áž”ៃ"</string>
+ <string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
+ <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string>
+ <string name="untitled" msgid="4638956954852782576">"&lt;គ្មាន​ចំណង​ជើង&gt;"</string>
+ <string name="ellipsis" msgid="7899829516048813237">"…"</string>
+ <string name="ellipsis_two_dots" msgid="1228078994866030736">"‥"</string>
+ <string name="emptyPhoneNumber" msgid="7694063042079676517">"(គ្មាន​លáŸážâ€‹áž‘ូរសáŸáž–្ទ)"</string>
+ <string name="unknownName" msgid="2277556546742746522">"(មិន​ស្គាល់)"</string>
+ <string name="defaultVoiceMailAlphaTag" msgid="2660020990097733077">"សារ​ជា​សំឡáŸáž„"</string>
+ <string name="defaultMsisdnAlphaTag" msgid="2850889754919584674">"MSISDN1"</string>
+ <string name="mmiError" msgid="5154499457739052907">"បញ្ហា​ក្នុង​ការ​ážáž—្ជាប់​ ឬ​កូដ MMI មិន​ážáŸ’រឹមážáŸ’រូវ។"</string>
+ <string name="mmiFdnError" msgid="5224398216385316471">"ប្រážáž·áž”ážáŸ’ážáž·áž€áž¶ážšâ€‹ážáŸ’រូវ​បាន​ដាក់​កម្រិážâ€‹â€‹â€‹áž…ំពោះ​លáŸážâ€‹áž áŸ…​ážáŸážšâ€‹ážáŸ‚​ប៉ុណ្ណោះ។"</string>
+ <string name="serviceEnabled" msgid="8147278346414714315">"បាន​បើក​សáŸážœáž¶áž€áž˜áŸ’ម។"</string>
+ <string name="serviceEnabledFor" msgid="6856228140453471041">"បាន​បើក​សáŸážœáž¶áž€áž˜áŸ’ម​សម្រាប់៖"</string>
+ <string name="serviceDisabled" msgid="1937553226592516411">"បាន​បិទ​សáŸážœáž¶áž€áž˜áŸ’ម។"</string>
+ <string name="serviceRegistered" msgid="6275019082598102493">"ការ​ចុះឈ្មោះ​ជោគ​ជáŸáž™áŸ”"</string>
+ <string name="serviceErased" msgid="1288584695297200972">"ការ​លុប​បាន​ជោគជáŸáž™áŸ”"</string>
+ <string name="passwordIncorrect" msgid="7612208839450128715">"ពាក្យ​សម្ងាážáŸ‹â€‹áž˜áž·áž“​ážáŸ’រឹម​ážáŸ’រូវ"</string>
+ <string name="mmiComplete" msgid="8232527495411698359">"MMI បញ្ចប់​។"</string>
+ <string name="badPin" msgid="9015277645546710014">"កូដ PIN ចាស់​ដែល​អ្នក​បាន​បញ្ចូល​មិន​ážáŸ’រឹមážáŸ’រូវ។"</string>
+ <string name="badPuk" msgid="5487257647081132201">"កូដ PUK ដែល​អ្នក​បាន​បញ្ចូល​មិន​ážáŸ’រឹមážáŸ’រូវ។"</string>
+ <string name="mismatchPin" msgid="609379054496863419">"កូដ​ PIN ដែល​អ្នក​បាន​បញ្ចូល​​មិន​ដូច​គ្នា។"</string>
+ <string name="invalidPin" msgid="3850018445187475377">"បញ្ចូល​កូដ PIN ដែល​មាន​​​ពី ៤ ដល់ ៨​លáŸáž"</string>
+ <string name="invalidPuk" msgid="8761456210898036513">"បញ្ចូល​កូដ PUK ដែល​មាន​ពី​ ៨ áž›áŸážâ€‹ ឬ​វែង​ជាង​នáŸáŸ‡áŸ”"</string>
+ <string name="needPuk" msgid="919668385956251611">"ស៊ីមកាážâ€‹â€‹ážšáž”ស់​អ្នក​ជាប់​កូដ PUK ។ បញ្ចូល​កូដ PUK ដើម្បី​ដោះ​សោ។"</string>
+ <string name="needPuk2" msgid="4526033371987193070">"បញ្ចូល​កូដ PUK2 ដើម្បី​ដោះ​សោ​ស៊ីម​កាážáŸ”"</string>
+ <string name="imei" msgid="2625429890869005782">"IMEI"</string>
+ <string name="meid" msgid="4841221237681254195">"MEID"</string>
+ <string name="ClipMmi" msgid="6952821216480289285">"áž›áŸážâ€‹ážŸáž˜áŸ’គាល់​អ្នក​ហៅ​​ចូល"</string>
+ <string name="ClirMmi" msgid="7784673673446833091">"áž›áŸážâ€‹ážŸáž˜áŸ’គាល់​អ្នក​ហៅ​ចáŸáž‰"</string>
+ <string name="CfMmi" msgid="5123218989141573515">"បញ្ជូន​ការ​ហៅ​បន្áž"</string>
+ <string name="CwMmi" msgid="9129678056795016867">"រង់ចាំ​ការ​ហៅ"</string>
+ <string name="BaMmi" msgid="455193067926770581">"រារាំង​ការ​ហៅ"</string>
+ <string name="PwdMmi" msgid="7043715687905254199">"ប្ដូរ​ពាក្យ​សម្ងាážáŸ‹"</string>
+ <string name="PinMmi" msgid="3113117780361190304">"ប្ដូរ​កូដ PIN"</string>
+ <string name="CnipMmi" msgid="3110534680557857162">"បង្ហាញ​ការ​ហៅ​លáŸáž"</string>
+ <string name="CnirMmi" msgid="3062102121430548731">"បាន​ដាក់​កម្រិážâ€‹áž€áž¶ážšâ€‹áž áŸ…​លáŸáž"</string>
+ <string name="ThreeWCMmi" msgid="9051047170321190368">"ការ​ហៅ​បី​ផ្លូវ"</string>
+ <string name="RuacMmi" msgid="7827887459138308886">"បដិសáŸáž’​ការ​ហៅ​រំážáž¶áž“​ដែល​មិន​ចង់បាន"</string>
+ <string name="CndMmi" msgid="3116446237081575808">"ការ​បញ្ជូន​លáŸážâ€‹áž áŸ…"</string>
+ <string name="DndMmi" msgid="1265478932418334331">"កុំ​រំážáž¶áž“"</string>
+ <string name="CLIRDefaultOnNextCallOn" msgid="429415409145781923">"បាន​ដាក់​កម្រិážâ€‹áž›áŸ†áž“ាំដើម​លáŸážâ€‹ážŸáž˜áŸ’គាល់​អ្នក​ហៅ។​​​ ការ​ហៅ​បន្ទាប់៖​ បាន​ដាក់កម្រិáž"</string>
+ <string name="CLIRDefaultOnNextCallOff" msgid="3092918006077864624">"មិន​បាន​ដាក់កម្រិážâ€‹áž›áŸ†áž“ាំដើម​លáŸážâ€‹ážŸáž˜áŸ’គាល់​អ្នក​ហៅ។ ការ​ហៅ​បន្ទាប់៖ មិន​បាន​ដាក់​កម្រិážáŸ”"</string>
+ <string name="CLIRDefaultOffNextCallOn" msgid="6179425182856418465">"មិន​បាន​ដាក់​កម្រិážâ€‹áž›áŸážâ€‹ážŸáž˜áŸ’គាល់​អ្នក​ហៅ​លំនាំ​ដើម។ ការ​ហៅ​បន្ទាប់៖​ បាន​ដាក់កម្រិáž"</string>
+ <string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"មិន​បាន​ដាក់កម្រិážâ€‹áž›áŸ†áž“ាំដើម​លáŸážâ€‹ážŸáž˜áŸ’គាល់​អ្នក​ហៅ។ ការ​ហៅ​បន្ទាប់៖ មិន​បាន​ដាក់​កម្រិážáŸ”"</string>
+ <string name="serviceNotProvisioned" msgid="8614830180508686666">"មិន​បាន​ផ្ដល់​សáŸážœáž¶áž€áž˜áŸ’ម។"</string>
+ <string name="CLIRPermanent" msgid="3377371145926835671">"អ្នក​មិន​អាច​ប្ដូរ​ការ​កំណážáŸ‹â€‹áž›áŸážâ€‹ážŸáž˜áŸ’គាល់​អ្នក​ហៅ​បានទáŸáŸ”"</string>
+ <string name="RestrictedChangedTitle" msgid="5592189398956187498">"បាន​ប្ដូរ​ការ​ចូល​ដំណើរការ​ដែល​បាន​ដាក់​​កម្រិáž"</string>
+ <string name="RestrictedOnData" msgid="8653794784690065540">"បាន​ទប់ស្កាážáŸ‹â€‹ážŸáŸážœáž¶áž€áž˜áŸ’ម​ទិន្ននáŸáž™áŸ”"</string>
+ <string name="RestrictedOnEmergency" msgid="6581163779072833665">"បាន​ទប់ស្កាážáŸ‹â€‹ážŸáŸážœáž¶áž€áž˜áŸ’ម​ពáŸáž›â€‹áž¢áž¶ážŸáž“្ន។"</string>
+ <string name="RestrictedOnNormal" msgid="4953867011389750673">"សáŸážœáž¶áž€áž˜áŸ’ម​សំឡáŸáž„​ážáŸ’រូវ​បាន​ទប់ស្កាážáŸ‹áŸ”"</string>
+ <string name="RestrictedOnAllVoice" msgid="3396963652108151260">"បាន​ទប់ស្កាážáŸ‹â€‹ážŸáŸážœáž¶áž€áž˜áŸ’ម​សំឡáŸáž„​ទាំងអស់។"</string>
+ <string name="RestrictedOnSms" msgid="8314352327461638897">"បាន​ទប់ស្កាážáŸ‹â€‹ážŸáŸážœáž¶áž€áž˜áŸ’ម​ SMS ។"</string>
+ <string name="RestrictedOnVoiceData" msgid="996636487106171320">"បាន​ទប់​ស្កាážáŸ‹â€‹ážŸáŸážœáž¶áž€áž˜áŸ’ម​សំឡáŸáž„/ទិន្ននáŸáž™áŸ”"</string>
+ <string name="RestrictedOnVoiceSms" msgid="1888588152792023873">"បាន​ទប់ស្កាážáŸ‹â€‹ážŸáŸážœáž¶áž€áž˜áŸ’ម​សំឡáŸáž„/សារ SMS ។"</string>
+ <string name="RestrictedOnAll" msgid="5643028264466092821">"សំឡáŸáž„/ទិន្ននáŸáž™/សáŸážœáž¶áž€áž˜áŸ’ម SMS ទាំងអស់​ážáŸ’រូវ​បាន​ទប់​ស្កាážáŸ‹áŸ”"</string>
+ <string name="serviceClassVoice" msgid="1258393812335258019">"សំឡáŸáž„"</string>
+ <string name="serviceClassData" msgid="872456782077937893">"ទិន្ននáŸáž™"</string>
+ <string name="serviceClassFAX" msgid="5566624998840486475">"ទូរសារ"</string>
+ <string name="serviceClassSMS" msgid="2015460373701527489">"សារ SMS"</string>
+ <string name="serviceClassDataAsync" msgid="4523454783498551468">"អ​សម​កាលកម្ម"</string>
+ <string name="serviceClassDataSync" msgid="7530000519646054776">"ធ្វើ​សម​កាល​កម្ម"</string>
+ <string name="serviceClassPacket" msgid="6991006557993423453">"កញ្ចប់​ពáŸážáŸŒáž˜áž¶áž“"</string>
+ <string name="serviceClassPAD" msgid="3235259085648271037">"PAD"</string>
+ <string name="roamingText0" msgid="7170335472198694945">"បើក​ទ្រនិច​បង្ហាញ​រ៉ូមីង"</string>
+ <string name="roamingText1" msgid="5314861519752538922">"បិទ​ទ្រនិច​បង្ហាញ​រ៉ូមីង"</string>
+ <string name="roamingText2" msgid="8969929049081268115">"ពន្លឺ​​ទ្រនិច​បង្ហាញ​រ៉ូមីង"</string>
+ <string name="roamingText3" msgid="5148255027043943317">"áž…áŸáž‰â€‹áž–ី​អ្នកជិážážáž¶áž„"</string>
+ <string name="roamingText4" msgid="8808456682550796530">"ក្រៅ​​អាគារ"</string>
+ <string name="roamingText5" msgid="7604063252850354350">"រ៉ូមីង - ប្រពáŸáž“្ធ​ពáŸáž‰áž…áž·ážáŸ’áž"</string>
+ <string name="roamingText6" msgid="2059440825782871513">"រ៉ូ​មីង - ប្រពáŸáž“្ធ​​អាច​ប្រើ​បាន"</string>
+ <string name="roamingText7" msgid="7112078724097233605">"រ៉ូ​មីង - ​សម្ពន្ធភាព"</string>
+ <string name="roamingText8" msgid="5989569778604089291">"រ៉ូ​មីង - ដៃគូ​ពិសáŸážŸ"</string>
+ <string name="roamingText9" msgid="7969296811355152491">"រ៉ូ​មីង - មុážáž„ារ​សáŸážœáž¶â€‹áž€áž˜áŸ’ម​ពáŸáž‰áž›áŸáž‰"</string>
+ <string name="roamingText10" msgid="3992906999815316417">"រ៉ូ​មីង - មុážáž„ារ​សáŸážœáž¶â€‹ážáž¶áž˜â€‹â€‹áž•្នែក"</string>
+ <string name="roamingText11" msgid="4154476854426920970">"បើក​បដា​រ៉ូមីង"</string>
+ <string name="roamingText12" msgid="1189071119992726320">"បិទ​បដា​រ៉ូមីង"</string>
+ <string name="roamingTextSearching" msgid="8360141885972279963">"​ស្វែង​រក​សáŸážœáž¶áž€áž˜áŸ’ម"</string>
+ <string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g> ៖ មិន​បាន​បញ្ជូន​បន្áž"</string>
+ <string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
+ <string name="cfTemplateForwardedTime" msgid="9206251736527085256">"<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" msgid="5073237827620166285">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g> ៖ មិន​បាន​បញ្ជូន​បន្áž"</string>
+ <string name="cfTemplateRegisteredTime" msgid="6781621964320635172">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g> ៖ មិន​បាន​បញ្ជូន​បន្áž"</string>
+ <string name="fcComplete" msgid="3118848230966886575">"កូដ​លក្ážážŽáŸˆâ€‹áž–áŸáž‰áž›áŸáž‰áŸ”"</string>
+ <string name="fcError" msgid="3327560126588500777">"បញ្ហា​ការ​ážáž—្ជាប់​ ឬ​កូដ​លក្ážážŽáŸˆâ€‹â€‹â€‹áž˜áž·áž“​ážáŸ’រឹមážáŸ’រូវ​។"</string>
+ <string name="httpErrorOk" msgid="1191919378083472204">"យល់​ព្រម"</string>
+ <string name="httpError" msgid="7956392511146698522">"មាន​កំហុស​បណ្ដាញ។"</string>
+ <string name="httpErrorLookup" msgid="4711687456111963163">"រក​មិន​ឃើញ URL ។"</string>
+ <string name="httpErrorUnsupportedAuthScheme" msgid="6299980280442076799">"គ្រោងការណáŸâ€‹áž•្ទៀងផ្ទាážáŸ‹â€‹ážáŸ†áž”ន់បណ្ដាញ​មិន​ážáŸ’រូវ​បាន​គាំទ្រ។"</string>
+ <string name="httpErrorAuth" msgid="1435065629438044534">"មិន​អាច​ផ្ទៀងផ្ទាážáŸ‹áŸ”"</string>
+ <string name="httpErrorProxyAuth" msgid="1788207010559081331">"ការ​ផ្ទៀងផ្ទាážáŸ‹â€‹â€‹ážáž¶áž˜â€‹ážšáž™áŸˆâ€‹áž˜áŸ‰áž¶ážŸáŸŠáž¸áž“​​មáŸâ€‹â€‹áž”្រូកស៊ី​មិន​បាន​ជោគជáŸáž™â€‹áŸ”"</string>
+ <string name="httpErrorConnect" msgid="8714273236364640549">"មិន​អាច​ភ្ជាប់​ម៉ាស៊ីន​មáŸáŸ”"</string>
+ <string name="httpErrorIO" msgid="2340558197489302188">"មិន​អាច​ទាក់ទង​ជា​មួយ​ម៉ាស៊ីន​មáŸáŸ” ព្យាយាម​ម្ដង​ទៀážâ€‹áž–áŸáž›â€‹áž€áŸ’រោយ។"</string>
+ <string name="httpErrorTimeout" msgid="4743403703762883954">"អស់​ពáŸáž›â€‹ážáž—្ជាប់​ទៅ​ម៉ាស៊ីន​មáŸáŸ”"</string>
+ <string name="httpErrorRedirectLoop" msgid="8679596090392779516">"ទំពáŸážšâ€‹áž˜áž¶áž“​ការ​បញ្ជូន​ម៉ាស៊ីន​មáŸâ€‹áž”ន្ážâ€‹áž…្រើន​ពáŸáž€áŸ”"</string>
+ <string name="httpErrorUnsupportedScheme" msgid="5015730812906192208">"មិន​បាន​គាំទ្រ​ពិធីការ។"</string>
+ <string name="httpErrorFailedSslHandshake" msgid="96549606000658641">"មិន​អាច​បង្កើážâ€‹áž€áž¶ážšâ€‹ážáž—្ជាប់​មាន​សុវážáŸ’ážáž·áž—ាព។"</string>
+ <string name="httpErrorBadUrl" msgid="3636929722728881972">"មិន​អាច​បើក​ទំពáŸážšâ€‹áž”ាន​ទ០ព្រោះ​ URL ážáŸ’រឹមážáŸ’រូវ។"</string>
+ <string name="httpErrorFile" msgid="2170788515052558676">"មិន​អាច​ចូល​ដំណើរការ​ឯកសារ​។"</string>
+ <string name="httpErrorFileNotFound" msgid="6203856612042655084">"រក​មិន​ឃើញ​ឯកសារ​បាន​ស្នើ។"</string>
+ <string name="httpErrorTooManyRequests" msgid="1235396927087188253">"កំពុង​ដំណើរការ​សំណើ​​​ច្រើន​ពáŸáž€áŸ” ព្យាយាម​ម្ដង​ទៀážâ€‹áž–áŸáž›â€‹áž€áŸ’រោយ។"</string>
+ <string name="notification_title" msgid="8967710025036163822">"កំហុស​ក្នុង​ការ​ចូល​សម្រាប់ <xliff:g id="ACCOUNT">%1$s</xliff:g>"</string>
+ <string name="contentServiceSync" msgid="8353523060269335667">"ធ្វើ​សម​កាល​កម្ម"</string>
+ <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"ធ្វើ​សម​កាល​កម្ម"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"មាន​ការ​លុប <xliff:g id="CONTENT_TYPE">%s</xliff:g> ច្រើន​ពáŸáž€áŸ”"</string>
+ <string name="low_memory" product="tablet" msgid="6494019234102154896">"ឧបករណáŸâ€‹áž•្ទុក​នៃ​​កុំព្យូទáŸážšâ€‹áž”ន្ទះ​ពáŸáž‰áŸ” លុប​ឯកសារ​មួយ​ចំនួន​។"</string>
+ <string name="low_memory" product="default" msgid="3475999286680000541">"ឧបករណáŸâ€‹áž•្ទុក​ទូរសáŸáž–្ទ​ពáŸáž‰! លុប​ឯកសារ​មួយ​ចំនួន​ដើម្បី​បង្កើន​ទំហំ។"</string>
+ <string name="me" msgid="6545696007631404292">"ážáŸ’ញុំ"</string>
+ <string name="power_dialog" product="tablet" msgid="8545351420865202853">"ជម្រើស​កុំព្យូទáŸážšâ€‹áž”ន្ទះ"</string>
+ <string name="power_dialog" product="default" msgid="1319919075463988638">"ជម្រើស​ទូរសáŸáž–្ទ"</string>
+ <string name="silent_mode" msgid="7167703389802618663">"របៀប​ស្ងាážáŸ‹"</string>
+ <string name="turn_on_radio" msgid="3912793092339962371">"បើក​បណ្ដាញ​ឥážâ€‹ážáŸ’សែ"</string>
+ <string name="turn_off_radio" msgid="8198784949987062346">"បិទ​បណ្ដាញ​ឥážážáŸ’សែ"</string>
+ <string name="screen_lock" msgid="799094655496098153">"ចាក់​សោ​អáŸáž€áŸ’រង់"</string>
+ <string name="power_off" msgid="4266614107412865048">"បិទ"</string>
+ <string name="silent_mode_silent" msgid="319298163018473078">"បិទ​កម្ម​វិធី​រោទáŸ"</string>
+ <string name="silent_mode_vibrate" msgid="7072043388581551395">"កម្មវិធី​រោទáŸâ€‹áž‰áŸážš"</string>
+ <string name="silent_mode_ring" msgid="8592241816194074353">"បើក​កម្មវិធី​រោទáŸ"</string>
+ <string name="shutdown_progress" msgid="2281079257329981203">"កំពុង​បិទ..."</string>
+ <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"កុំព្យូទáŸážšâ€‹áž”ន្ទះ​របស់​អ្នក​នឹង​បិទ។"</string>
+ <string name="shutdown_confirm" product="default" msgid="649792175242821353">"ទូរសáŸáž–្ទ​របស់​អ្នក​នឹង​បិទ។"</string>
+ <string name="shutdown_confirm_question" msgid="2906544768881136183">"ážáž¾â€‹áž¢áŸ’នក​ចង់​បិទ​?"</string>
+ <string name="reboot_safemode_title" msgid="7054509914500140361">"ចាប់ផ្ដើម​ឡើងវិញ​ដើម្បី​ចូល​របៀប​សុវážáŸ’ážáž·áž—áž¶áž–"</string>
+ <string name="reboot_safemode_confirm" msgid="55293944502784668">"ážáž¾â€‹áž¢áŸ’នក​ចង់​ចាប់ផ្ដើម​ឡើងវិញ​ចូល​របៀប​សុវážáŸ’ážáž·áž—áž¶áž–? វា​នឹង​បិទ​កម្មវិធី​ភាគី​ទី​បី​ដែល​អ្នក​បាន​ដំឡើង។ ពួក​វា​នឹង​ážáŸ’រូវ​បាន​ស្ដារ​ឡើងវិញ​ពáŸáž›â€‹áž¢áŸ’នក​ចាប់ផ្ដើម​ម្ដង​ទៀážáŸ”"</string>
+ <string name="recent_tasks_title" msgid="3691764623638127888">"ážáŸ’មី"</string>
+ <string name="no_recent_tasks" msgid="8794906658732193473">"គ្មាន​កម្មវិធី​ážáŸ’មី​​ៗ​​។"</string>
+ <string name="global_actions" product="tablet" msgid="408477140088053665">"ជម្រើស​កុំព្យូទáŸážšâ€‹áž”ន្ទះ"</string>
+ <string name="global_actions" product="default" msgid="2406416831541615258">"ជម្រើស​ទូរសáŸáž–្ទ"</string>
+ <string name="global_action_lock" msgid="2844945191792119712">"ចាក់​សោ​អáŸáž€áŸ’រង់"</string>
+ <string name="global_action_power_off" msgid="4471879440839879722">"បិទ"</string>
+ <string name="global_action_bug_report" msgid="7934010578922304799">"របាយការណáŸâ€‹áž€áŸ†áž áž»ážŸ"</string>
+ <string name="bugreport_title" msgid="2667494803742548533">"យក​របាយការណáŸâ€‹áž€áŸ†áž áž»ážŸ"</string>
+ <string name="bugreport_message" msgid="398447048750350456">"វា​នឹង​​ប្រមូល​ពáŸážáŸŒáž˜áž¶áž“​អំពី​ស្ážáž¶áž“ភាព​ឧបករណáŸâ€‹ážšáž”ស់​អ្នក ដើម្បី​ផ្ញើ​ជា​សារ​អ៊ីមែល។ វា​នឹង​ចំណាយ​ពáŸáž›â€‹ážáž·áž…​ពី​ពáŸáž›â€‹áž…ាប់ផ្ដើម​របាយការណáŸâ€‹ážšáž áž¼ážâ€‹ážŠáž›áŸ‹â€‹áž–áŸáž›â€‹ážœáž¶â€‹ážšáž½áž…រាល់​ដើម្បី​ផ្ញើ សូម​អážáŸ‹áž’្មážáŸ‹áŸ”"</string>
+ <string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"របៀប​ស្ងាážáŸ‹"</string>
+ <string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"បិទ​សំឡáŸáž„"</string>
+ <string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"បើក​សំឡáŸáž„"</string>
+ <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"របៀប​ជិះ​យន្ážáž áŸ„ះ"</string>
+ <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"បាន​បើក​របៀប​ពáŸáž›â€‹áž‡áž·áŸ‡â€‹áž™áž“្ážâ€‹áž áŸ„ះ"</string>
+ <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"បាន​បិទ​របៀប​យន្ážáž áŸ„ះ"</string>
+ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
+ <string name="safeMode" msgid="2788228061547930246">"របៀប​​​សុវážáŸ’ážáž·áž—áž¶áž–"</string>
+ <string name="android_system_label" msgid="6577375335728551336">"ប្រពáŸáž“្ធ​​ Android"</string>
+ <string name="permgrouplab_costMoney" msgid="5429808217861460401">"សáŸážœáž¶áž€áž˜áŸ’ម​ដែល​កាážáŸ‹â€‹áž›áž»áž™â€‹ážšáž”ស់​អ្នក"</string>
+ <string name="permgroupdesc_costMoney" msgid="3293301903409869495">"ធ្វើ​អ្វី​ដែល​អាច​កាážáŸ‹â€‹áž›áž»áž™â€‹ážšáž”ស់​អ្នក។"</string>
+ <string name="permgrouplab_messages" msgid="7521249148445456662">"សារ​របស់​អ្នក"</string>
+ <string name="permgroupdesc_messages" msgid="7821999071003699236">"អាន និង​សរសáŸážšâ€‹ážŸáž¶ážš SMS, អ៊ីមែល និង​សារ​ផ្សáŸáž„ៗ​ទៀážâ€‹ážšáž”ស់​អ្នក។"</string>
+ <string name="permgrouplab_personalInfo" msgid="3519163141070533474">"áž–áŸážáŸŒáž˜áž¶áž“​ផ្ទាល់ážáŸ’លួន​របស់​អ្នក"</string>
+ <string name="permgroupdesc_personalInfo" msgid="8426453129788861338">"ចូល​ដំណើរការ​ពáŸážáŸŒáž˜áž¶áž“​ដោយ​ផ្ទាល់​អំពី​អ្នក​ ដែល​បា​ន​រក្សាទុក​ក្នុង​កាážâ€‹áž‘ំនាក់ទំនង​របស់​អ្នក។"</string>
+ <string name="permgrouplab_socialInfo" msgid="5799096623412043791">"áž–áŸážáŸŒáž˜áž¶áž“​សង្គម​របស់​អ្នក"</string>
+ <string name="permgroupdesc_socialInfo" msgid="7129842457611643493">"ចូល​ដំណើរការ​ពáŸážáŸŒáž˜áž¶áž“​ដោយ​ផ្ទាល់​អំពី​ទំនាក់ទំនង និង​ការ​ភ្ជាប់​សង្គម​របស់​អ្នក។"</string>
+ <string name="permgrouplab_location" msgid="635149742436692049">"ទីážáž¶áŸ†áž„​របស់​អ្នក"</string>
+ <string name="permgroupdesc_location" msgid="5704679763124170100">"ážáž¶áž˜ážŠáž¶áž“​ទីážáž¶áŸ†áž„​ជាក់ស្ដែង​របស់​អ្នក។"</string>
+ <string name="permgrouplab_network" msgid="5808983377727109831">"ការ​ទាក់ទង​បណ្ដាញ"</string>
+ <string name="permgroupdesc_network" msgid="4478299413241861987">"ចូល​ដំណើរការ​លក្ážážŽáŸˆâ€‹â€‹áž”ណ្ដាញ​ផ្សáŸáž„ៗ។"</string>
+ <string name="permgrouplab_bluetoothNetwork" msgid="1585403544162128109">"ប៊្លូធូស"</string>
+ <string name="permgroupdesc_bluetoothNetwork" msgid="5625288577164282391">"ចូល​ដំណើរការ​ឧបករណ០និង​បណ្ដាញ​ážáž¶áž˜â€‹áž”៊្លូធូស។"</string>
+ <string name="permgrouplab_audioSettings" msgid="8329261670151871235">"ការ​កំណážáŸ‹â€‹áž¢áž¼ážŒáž¸áž™áŸ‰áž¼"</string>
+ <string name="permgroupdesc_audioSettings" msgid="2641515403347568130">"ប្ដូរ​ការ​កំណážáŸ‹â€‹áž¢áž¼ážŒáž¸áž™áŸ‰áž¼áŸ”"</string>
+ <string name="permgrouplab_affectsBattery" msgid="6209246653424798033">"ប៉ះពាល់​ដល់​ážáŸ’ម"</string>
+ <string name="permgroupdesc_affectsBattery" msgid="6441275320638916947">"ប្រើ​លក្ážážŽáŸˆâ€‹ážŠáŸ‚ល​អាច​ប្រើ​ážáž¶áž˜áž–ល​ážáŸ’ម​យ៉ាង​រហáŸážŸáŸ”"</string>
+ <string name="permgrouplab_calendar" msgid="5863508437783683902">"ប្រážáž·áž‘áž·áž“"</string>
+ <string name="permgroupdesc_calendar" msgid="5777534316982184416">"​ចូល​ដំណើរការ​​ប្រážáž·áž‘ិន​\"និង​ព្រឹážáŸ’ážáž·áž€áž¶ážšážŽáŸâ€‹ážŠáŸ„យ​ផ្ទាល់​។"</string>
+ <string name="permgrouplab_dictionary" msgid="4148597128843641379">"អាន​វចនានុក្រម​អ្នក​ប្រើ"</string>
+ <string name="permgroupdesc_dictionary" msgid="7921166355964764490">"អាន​ពាក្យ​នៅ​ក្នុង​វចនានុក្រម​​អ្នក​ប្រើ​។"</string>
+ <string name="permgrouplab_writeDictionary" msgid="8090237702432576788">"សរសáŸážšâ€‹ážœáž…នានុក្រម​អ្នក​ប្រើ"</string>
+ <string name="permgroupdesc_writeDictionary" msgid="2711561994497361646">"បន្ážáŸ‚ម​ពាក្យ​ទៅ​វចនានុក្រម​អ្នក​ប្រើ។"</string>
+ <string name="permgrouplab_bookmarks" msgid="1949519673103968229">"ចំណាំ​ និង​ប្រវážáŸ’ážáž·"</string>
+ <string name="permgroupdesc_bookmarks" msgid="4169771606257963028">"ចូល​​ដំណើរការ​ចំណាំ និង​ប្រវážáŸ’ážáž·â€‹áž€áž˜áŸ’មវិធី​អ៊ីនធឺណិážâ€‹ážŠáŸ„យ​ផ្ទាល់។"</string>
+ <string name="permgrouplab_deviceAlarms" msgid="6117704629728824101">"រោទáŸ"</string>
+ <string name="permgroupdesc_deviceAlarms" msgid="4769356362251641175">"កំណážáŸ‹â€‹áž“ាឡិកា​រោទáŸ"</string>
+ <string name="permgrouplab_voicemail" msgid="4162237145027592133">"សារ​ជា​សំឡáŸáž„"</string>
+ <string name="permgroupdesc_voicemail" msgid="2498403969862951393">"ចូល​ដំណើរការ​សារ​ជា​សំឡáŸáž„​ដោយ​ផ្ទាល់។"</string>
+ <string name="permgrouplab_microphone" msgid="171539900250043464">"មីក្រូ​ហ្វូន"</string>
+ <string name="permgroupdesc_microphone" msgid="7106618286905738408">"ចូល​ដំណើរការ​​មីក្រូហ្វូន​ដោយ​ផ្ទាល់ ​ដើម្បី​ážážâ€‹ážŸáŸ†áž¡áŸáž„​។"</string>
+ <string name="permgrouplab_camera" msgid="4820372495894586615">"ម៉ាស៊ីន​ážáž"</string>
+ <string name="permgroupdesc_camera" msgid="2933667372289567714">"ចូល​ដំណើរការ​ម៉ាស៊ីន​ážážâ€‹ážšáž¼áž” ឬ​វីដáŸáž¢áž¼â€‹ážŠáŸ„យ​ផ្ទាល់។"</string>
+ <string name="permgrouplab_screenlock" msgid="8275500173330718168">"ចាក់សោ​​អáŸáž€áŸ’រង់"</string>
+ <string name="permgroupdesc_screenlock" msgid="7067497128925499401">"មាន​សមážáŸ’ážáž—ាព​ប៉ះពាល់​ឥរិយាបážâ€‹áž€áž¶ážšâ€‹áž…ាក់​សោ​អáŸáž€áŸ’រង់​លើ​ឧបករណáŸâ€‹ážšáž”ស់​អ្នក។"</string>
+ <string name="permgrouplab_appInfo" msgid="8028789762634147725">"áž–áŸážáŸŒáž˜áž¶áž“​កម្មវិធី​របស់​អ្នក"</string>
+ <string name="permgroupdesc_appInfo" msgid="3950378538049625907">"លទ្ធភាព​ប៉ះពាល់​ដល់​ឥរិយាបážâ€‹áž€áž˜áŸ’មវិធី​ផ្សáŸáž„ៗ​លើ​ឧបករណáŸâ€‹ážšáž”ស់​អ្នក។"</string>
+ <string name="permgrouplab_wallpaper" msgid="3850280158041175998">"ផ្ទាំង​រូបភាព"</string>
+ <string name="permgroupdesc_wallpaper" msgid="5630417854750540154">"ប្ដូរ​ការ​កំណážáŸ‹â€‹áž•្ទាំង​រូបភាព​ឧបករណáŸ"</string>
+ <string name="permgrouplab_systemClock" msgid="406535759236612992">"នាឡិកា"</string>
+ <string name="permgroupdesc_systemClock" msgid="3944359833624094992">"ប្ដូរ​ពáŸáž›ážœáŸáž›áž¶ ឬ​ážáŸ†áž”ន់​ពáŸáž›ážœáŸáž›áž¶â€‹áž§áž”ករណáŸ"</string>
+ <string name="permgrouplab_statusBar" msgid="2095862568113945398">"របារ​ស្ážáž¶áž“áž—áž¶áž–"</string>
+ <string name="permgroupdesc_statusBar" msgid="6242593432226807171">"ប្ដូរ​ការ​កំណážáŸ‹â€‹ážšáž”ារ​ស្ážáž¶áž“ភាព​ឧបករណáŸáŸ”"</string>
+ <string name="permgrouplab_syncSettings" msgid="3341990986147826541">"ការ​កំណážáŸ‹â€‹â€‹â€‹áž’្វើ​សម​កាល​កម្ម"</string>
+ <string name="permgroupdesc_syncSettings" msgid="7603195265129031797">"ចូល​ដំណើរការ​ការ​កំណážáŸ‹â€‹áž’្វើ​សម​កាល​កម្ម។"</string>
+ <string name="permgrouplab_accounts" msgid="3359646291125325519">"គណនី​របស់​អ្នក"</string>
+ <string name="permgroupdesc_accounts" msgid="4948732641827091312">"ចូល​ដំណើរការ​គណនី​ដែល​មាន។"</string>
+ <string name="permgrouplab_hardwareControls" msgid="7998214968791599326">"ពិនិážáŸ’យ​ផ្នែករឹង"</string>
+ <string name="permgroupdesc_hardwareControls" msgid="4357057861225462702">"ចូល​ដំណើរការ​ផ្នែក​រឹង​ដោយ​ផ្ទាល់​ក្នុង​ទូរសáŸáž–្ទ។"</string>
+ <string name="permgrouplab_phoneCalls" msgid="9067173988325865923">"ហៅ​ទូរសáŸáž–្ទ"</string>
+ <string name="permgroupdesc_phoneCalls" msgid="7489701620446183770">"ážáž¶áž˜ážŠáž¶áž“ ážáž និង​ដំណើរការ​ការ​ហៅ​ទូរសáŸáž–្ទ។"</string>
+ <string name="permgrouplab_systemTools" msgid="4652191644082714048">"ឧបករណáŸâ€‹áž”្រពáŸáž“្ធ"</string>
+ <string name="permgroupdesc_systemTools" msgid="8162102602190734305">"ចូល​ដំណើរការ​កម្រិážâ€‹áž‘áž¶áž” និង​ពិនិážáŸ’យ​ប្រពáŸáž“្ធ។"</string>
+ <string name="permgrouplab_developmentTools" msgid="3446164584710596513">"ឧបករណáŸâ€‹â€‹áž¢áž—ិវឌ្áž"</string>
+ <string name="permgroupdesc_developmentTools" msgid="7058828032358142018">"លក្ážážŽáŸˆâ€‹áž…ាំបាច់​សម្រាប់​ážáŸ‚​អ្នក​អភិវឌ្ážâ€‹áž€áž˜áŸ’មវិធី។"</string>
+ <string name="permgrouplab_display" msgid="4279909676036402636">"ចំណុច​ប្រទាក់​អ្នក​ប្រើ​កម្មវិធី​ផ្សáŸáž„ៗ"</string>
+ <string name="permgroupdesc_display" msgid="6051002031933013714">"ប្រសិទ្ធ​ភាព​ចំណុច​ប្រទាក់​អ្នក​ប្រើ​នៃ​កម្មវិធី​ផ្សáŸáž„ៗ។"</string>
+ <string name="permgrouplab_storage" msgid="1971118770546336966">"ការ​ផ្ទុក"</string>
+ <string name="permgroupdesc_storage" product="nosdcard" msgid="7442318502446874999">"ចូល​ដំណើរការ​ឧបករណáŸâ€‹áž•្ទុក​យូអáŸážŸáž”៊ី។"</string>
+ <string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"ចូល​ដំណើរការ​កាážâ€‹áž¢áŸážŸážŒáž¸"</string>
+ <string name="permgrouplab_accessibilityFeatures" msgid="7919025602283593907">"លក្ážážŽáŸˆâ€‹áž—ាព​ងាយស្រួល"</string>
+ <string name="permgroupdesc_accessibilityFeatures" msgid="4205196881678144335">"លក្ážážŽáŸˆâ€‹ážŠáŸ‚ល​ជា​បច្ចáŸáž€ážœáž·áž‘្យា​ជំនួយ​អាច​ស្នើ។"</string>
+ <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"ទៅ​យក​មាážáž·áž€áž¶â€‹áž”ង្អួច"</string>
+ <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"ពិនិážáŸ’យ​មាážáž·áž€áž¶â€‹áž”ង្អួច​ដែល​អ្នក​កំពុង​ទាក់ទង​ជា​មួយ។"</string>
+ <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"បើក​ការ​រក​មើល​​ដោយ​ប៉ះ"</string>
+ <string name="capability_desc_canRequestTouchExploration" msgid="5800552516779249356">"áž’áž¶ážáž»â€‹áž”ាន​ប៉ះ​នឹង​ážáŸ’រូវ​បាន​អាន​ឮ​ៗ អáŸáž€áŸ’រង់​អាច​ážáŸ’រូវ​បាន​ស្វែងរក​ដោយ​ប្រើ​កាយវិការ។"</string>
+ <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"បើក​ការ​ចូល​ដំណើរការ​បណ្ដាញ​ដែល​បាន​ធ្វើ​ឲ្យ​ប្រសើរ"</string>
+ <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"ស្គ្រីប​អាច​ážáŸ’រូវ​បាន​ដំឡើង​ ដើម្បី​ធ្វើ​ឲ្យ​មាážáž·áž€áž¶â€‹áž€áž˜áŸ’មវិធី​អាច​ចូល​ដំណើរការ​បាន​កាន់ážáŸ‚​ច្រើន។"</string>
+ <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"មើល​អážáŸ’ážáž”ទ​ដែល​វាយ"</string>
+ <string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"រួម​បញ្ចូល​ទិន្ននáŸáž™â€‹áž•្ទាល់​ážáŸ’លួន​ ដូចជា​លáŸážâ€‹áž€áž¶ážâ€‹áž¥ážŽáž‘áž¶áž“ និង​ពាក្យ​សម្ងាážáŸ‹áŸ”"</string>
+ <string name="permlab_statusBar" msgid="7417192629601890791">"បិទ ឬ​កែ​របារ​ស្ážáž¶áž“áž—áž¶áž–"</string>
+ <string name="permdesc_statusBar" msgid="8434669549504290975">"ឲ្យ​កម្មវិធី​បិទ​របារ​ស្ážáž¶áž“áž—áž¶áž– ឬ​បន្ážáŸ‚ម និង​លុប​រូប​ážáŸ†ážŽáž¶áž„​ប្រពáŸáž“្ធ។"</string>
+ <string name="permlab_statusBarService" msgid="7247281911387931485">"របារ​ស្ážáž¶áž“áž—áž¶áž–"</string>
+ <string name="permdesc_statusBarService" msgid="716113660795976060">"ឲ្យ​កម្មវិធី​ក្លាយ​ជា​របារ​ស្ážáž¶áž“ភាព។"</string>
+ <string name="permlab_expandStatusBar" msgid="1148198785937489264">"ពង្រីក/បង្រួម​របារ​ស្ážáž¶áž“​ភាព"</string>
+ <string name="permdesc_expandStatusBar" msgid="6917549437129401132">"ឲ្យ​កម្មវិធី​ពង្រីក ឬ​បង្រួម​របារ​ស្ážáž¶áž“ភាព។"</string>
+ <string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"នាំ​ផ្លូវ​ការ​ហៅ​ចáŸáž‰â€‹áž¡áž¾áž„វិញ"</string>
+ <string name="permdesc_processOutgoingCalls" msgid="5331318931937402040">"ឲ្យ​កម្មវិធី​ដំណើរការ​ការ​ហៅ​ចáŸáž‰ និង​ប្ដូរ​លáŸážâ€‹ážáŸ’រូវ​ហៅ។ សិទ្ធិ​នáŸáŸ‡â€‹áž¢áž“ុញ្ញាážâ€‹áž²áŸ’យ​កម្មវិធី​ážáž¶áž˜ážŠáž¶áž“ ប្ដូរ​ទិស ឬ​ការពារ​ការ​ហៅ​ចáŸáž‰áŸ”"</string>
+ <string name="permlab_receiveSms" msgid="8673471768947895082">"ទទួល​សារ​អážáŸ’ážáž”áž‘ (សារ SMS​)"</string>
+ <string name="permdesc_receiveSms" msgid="6424387754228766939">"ឲ្យ​កម្មវិធី​ទទួល និង​ដំណើរការ​​សារ MMS ។ មាន​នáŸáž™â€‹ážáž¶ កម្មវិធី​អាច​ážáŸ’ážšáž½ážáž–ិនិážáŸ’យ​ ឬ​លុប​សារ​ដែល​បាន​ផ្ញើ​ទៅ​ឧបករណáŸâ€‹ážšáž”ស់​អ្នក ដោយ​​មិន​បង្ហាញ​អ្នក។"</string>
+ <string name="permlab_receiveMms" msgid="1821317344668257098">"ទទួល​សារ​អážáŸ’ážáž”áž‘ (MMS​)"</string>
+ <string name="permdesc_receiveMms" msgid="533019437263212260">"ឲ្យ​កម្មវិធី​ទទួល និង​ដំណើរការ​​សារ​ MMS ។ វា​មាន​នáŸáž™â€‹ážáž¶ កម្មវិធី​អាច​ážáž¶áž˜ážŠáž¶áž“​ ឬ​លុប​សារ​ដែល​បាន​ផ្ញើ​ទៅ​ឧបករណáŸâ€‹ážšáž”ស់​អ្នក​ដោយ​មិន​បង្ហាញ​ពួកវា។"</string>
+ <string name="permlab_receiveEmergencyBroadcast" msgid="1803477660846288089">"ទទួល​ការ​ប្រកាស​ពáŸáž›â€‹â€‹â€‹áž¢áž¶ážŸáž“្ន"</string>
+ <string name="permdesc_receiveEmergencyBroadcast" msgid="848524070262431974">"ឲ្យ​កម្មវិធី​ទទួល​​ដំណើរការ​សារ​ប្រកាស​ពáŸáž›â€‹áž¢áž¶ážŸáž“្ន។ សិទ្ធិ​នáŸáŸ‡â€‹áž˜áž¶áž“​ážáŸ‚​​កម្មវិធី​ប្រពáŸáž“្ធ​ប៉ុណ្ណោះ​​អាច​ប្រើ​បាន​។"</string>
+ <string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"អាន​សារ​ប្រកាស​ចលáŸáž"</string>
+ <string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"ឲ្យ​កម្មវិធី​អាន​សារ​ប្រកាស​ការ​ហៅ​ដែល​ឧបករណáŸâ€‹ážšáž”ស់​​អ្នក​បាន​ទទួល។ ការ​ជូន​ដំណឹង​ប្រកាស​ចលáŸážâ€‹ážáŸ’រូវ​បាន​បញ្ជូន​ទៅ​ទីážáž¶áŸ†áž„​មួយ​ចំនួន ដើម្បី​ព្រមាន​អ្នក​អំពី​ស្ážáž¶áž“ភាព​អាសន្ន។ កម្មវិធី​ព្យាបាទ​អាច​ជ្រៀážáž‡áŸ’រែក​ការ​អនុវážáŸ’ហឬ​ប្រážáž·áž”ážáŸ’ážáž·áž€áž¶ážšâ€‹áž§áž”ករណáŸâ€‹ážšáž”ស់​អ្នក​​ពáŸáž›â€‹áž‘ទួល​ការ​ប្រកាស​ចលáŸážâ€‹áž–áŸáž›â€‹áž¢áž¶ážŸáž“្ន។"</string>
+ <string name="permlab_sendSms" msgid="5600830612147671529">"ផ្ញើ​សារ SMS"</string>
+ <string name="permdesc_sendSms" msgid="7094729298204937667">"ឲ្យ​កម្មវិធី​ផ្ញើ​សារ​ SMS ។ វា​អាច​គិážâ€‹ážáŸ’លៃ​សáŸážœáž¶áž€áž˜áŸ’ម​ដែល​មិន​រំពឹង​ទុក។ កម្មវិធី​ព្យាបាទ​អាច​គិážâ€‹ážáŸ’លៃ​សáŸážœáž¶áž€áž˜áŸ’ម​ពី​អ្នក​ ដោយ​ផ្ញើ​សារ​ដោយ​គ្មាន​ការ​បញ្ជាក់​របស់​អ្នក។"</string>
+ <string name="permlab_sendRespondViaMessageRequest" msgid="8713889105305943200">"ផ្ញើ​ព្រឹážáŸ’ážáž·áž€áž¶ážšážŽáŸâ€‹ážŸáž¶ážšâ€‹ážáž¶áž˜ážšáž™áŸˆâ€‹áž€áž¶ážšâ€‹áž†áŸ’លើយážáž”"</string>
+ <string name="permdesc_sendRespondViaMessageRequest" msgid="7107648548468778734">"ឲ្យ​កម្មវិធី​ផ្ញើ​សំណើ​ទៅ​កម្មវិធី​ផ្ញើ​សារ ដើម្បី​គ្រប់គ្រង​ព្រឹážáŸ’ážáž·áž€áž¶ážšážŽáŸâ€‹ážŸáž¶ážšâ€‹ážáž¶áž˜â€‹ážšáž™áŸˆâ€‹áž€áž¶ážšâ€‹áž†áŸ’លើយážáž”​សម្រាប់​ការ​ហៅ​ចូល។"</string>
+ <string name="permlab_readSms" msgid="8745086572213270480">"អាន​សារ​អážáŸ’ážáž”ទ​របស់​អ្នក (SMS ឬ MMS​)"</string>
+ <string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"ឲ្យ​កម្មវិធី​​អាន​សារ SMS ដែល​មាន​ក្នុង​កុំព្យូទáŸážšâ€‹áž”ន្ទះ ឬ​ស៊ីម​កាážáŸ” វា​ឲ្យ​កម្មវិធី​អាន​សារ SMS ទាក់ទង​នឹង​មាážáž·áž€áž¶ ឬ​ពáŸážáŸŒáž˜áž¶áž“​សម្ងាážáŸ‹áŸ”"</string>
+ <string name="permdesc_readSms" product="default" msgid="3695967533457240550">"ឲ្យ​​កម្មវិធី​អាន​សារ SMS ដែល​បាន​រក្សាទុក​ក្នុង​ទូរសáŸáž–្ទ ឬ​​ស៊ីម​កាážâ€‹áŸ” វា​ឲ្យ​កម្មវិធី​អាន​សារ SMS ទាំង​អស់​ ទាក់ទង​នឹង​មាážáž·áž€áž¶â€‹ ឬ​ពáŸážáŸŒáž˜áž¶áž“​សម្ងាážáŸ‹áŸ”"</string>
+ <string name="permlab_writeSms" msgid="3216950472636214774">"កែសម្រួល​សារ​អážáŸ’ážáž”ទ​របស់​អ្នក (សារ SMS ឬ MMS​)"</string>
+ <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"ឲ្យ​កម្មវិធី​សរសáŸážšâ€‹ážŸáž¶ážš SMS ដែល​​បាន​រក្សាទុក​ក្នុង​កុំព្យូទáŸážšâ€‹áž”ន្ទះ ឬ​ស៊ីម​កាážâ€‹ážšáž”ស់​អ្នក។ កម្មវិធី​ព្យាបាទ​អាច​លុប​សារ​របស់​អ្នក។"</string>
+ <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"ឲ្យ​កម្មវិធី​សរសáŸážšâ€‹ážŸáž¶ážš SMS ដែល​បាន​រក្សាទុក​ក្នុង​ទូរសáŸáž–្ទ ឬ​​ស៊ីម​កាážáŸ” កម្មវិធី​ព្យាបាទ​អាច​លុប​សារ​របស់​អ្នក។"</string>
+ <string name="permlab_receiveWapPush" msgid="5991398711936590410">"ទទួល​សារ​អážáŸ’ážáž”áž‘ (WAP​)"</string>
+ <string name="permdesc_receiveWapPush" msgid="748232190220583385">"ឲ្យ​កម្មវិធី​ទទួល និង​ដំណើរការ​សារ WAP ។ សិទ្ធិ​នáŸáŸ‡â€‹â€‹áž˜áž¶áž“លទ្ធភាព​ážáž¶áž˜ážŠáž¶áž“ ឬ​លុប​សារ​ដែល​បាន​ផ្ញើ​ឲ្យ​អ្នក​ដោយ​មិន​បង្ហា​ញ។"</string>
+ <string name="permlab_getTasks" msgid="6466095396623933906">"ទៅ​យក​កម្មវិធី​កំពុង​ដំណើរការ"</string>
+ <string name="permdesc_getTasks" msgid="7454215995847658102">"ឲ្យ​កម្មវិធី​ទៅ​យក​ពáŸážáŸŒáž˜áž¶áž“​លម្អិážâ€‹áž¢áŸ†áž–ី​កិច្ចការ​ដែល​កំពុង​ដំណើរការ​បច្ចុប្បន្ន។ វា​អាច​ឲ្យ​កម្មវិធី​រកមើល​ពáŸážáŸŒáž˜áž¶áž“​ážáž¶â€‹ážáž¾â€‹áž€áž˜áŸ’មវិធី​ណាមួយ​ážáŸ’រូវ​បាន​ប្រើ​លើ​ឧបករណáŸáŸ”"</string>
+ <string name="permlab_interactAcrossUsers" msgid="7114255281944211682">"អន្ážážšáž€áž˜áŸ’ម​ážáž¶áž˜â€‹â€‹áž¢áŸ’នក​ប្រើ"</string>
+ <string name="permdesc_interactAcrossUsers" msgid="364670963623385786">"ឲ្យ​កម្មវិធី​អនុវážáŸ’ážâ€‹ážŸáž€áž˜áŸ’មភាព​ឆ្លង​អ្នកប្រើ​ផ្សáŸáž„ៗ​​លើ​ឧបករណáŸáŸ” កម្មវិធី​ព្យាបាទ​អាច​ប្រើ​វា ដើម្បី​បំពាន​ការ​ការពារ​រវាង​អ្នក​ប្រើ។"</string>
+ <string name="permlab_interactAcrossUsersFull" msgid="2567734285545074105">"អាជ្ញាបáŸážŽáŸ’ណ​ពáŸáž‰áž›áŸáž‰â€‹ ដើម្បី​ទាក់ទង​អ្នក​ប្រើ"</string>
+ <string name="permdesc_interactAcrossUsersFull" msgid="376841368395502366">"ឲ្យ​អន្ážážšáž€áž˜áŸ’ម​ដែល​មាន​ទាំង​អស់​គ្រប់​អ្នក​ប្រើ។"</string>
+ <string name="permlab_manageUsers" msgid="1676150911672282428">"គ្រប់គ្រង​អ្នក​ប្រើ"</string>
+ <string name="permdesc_manageUsers" msgid="8409306667645355638">"ឲ្យ​កម្មវិធី​គ្រប់គ្រង​អ្នកប្រើ​លើ​ឧបករណ០រួមមាន​ការ​ច្រោះ បង្កើហនិង​លុប។"</string>
+ <string name="permlab_getDetailedTasks" msgid="6229468674753529501">"ទៅ​យក​សáŸáž…ក្ដី​លម្អិážâ€‹áž€áž˜áŸ’មវិធី​កំពុង​ដំណើរការ"</string>
+ <string name="permdesc_getDetailedTasks" msgid="153824741440717599">"ឲ្យ​កម្មវិធី​ទៅ​យក​ពáŸážáŸŒáž˜áž¶áž“​លម្អិážâ€‹áž¢áŸ†áž–ី​កិច្ចការ​ដែល​កំពុង​ដំណើរការ​បច្ចុប្បន្ន។ កម្មវិធី​ព្យាបាទ​អាច​រកមើល​ពáŸážáŸŒáž˜áž¶áž“​ឯកជន​អំពី​កម្មវិធី​ផ្សáŸáž„ៗ។"</string>
+ <string name="permlab_reorderTasks" msgid="2018575526934422779">"ážáž˜áŸ’រៀប​កម្មវិធី​កំពុង​ដំណើរការ​ឡើងវិញ"</string>
+ <string name="permdesc_reorderTasks" msgid="7734217754877439351">"ឲ្យ​កម្មវិធី​ផ្លាស់ទី​ភារកិច្ច​​ទៅ​ផ្ទៃ​ážáž¶áž„​មុážáŸ”​ កម្មវិធី​អាច​ធ្វើ​វា​ដោយ​គ្មាន​ការ​បញ្ចូល​របស់​អ្នក។"</string>
+ <string name="permlab_removeTasks" msgid="6821513401870377403">"បញ្ឈប់​ដំណើរការ​កម្មវិធី"</string>
+ <string name="permdesc_removeTasks" msgid="1394714352062635493">"ឲ្យ​កម្មវិធី​លុប​ភារកិច្ច​ និង​បញ្ឈប់​កម្មវិធី​របស់​ពួកវា។ កម្មវិធី​ព្យាបាទ​អាច​រំážáž¶áž“​ឥរិយាបážâ€‹áž€áž˜áŸ’មវិធី​ផ្សáŸáž„ៗ។"</string>
+ <string name="permlab_manageActivityStacks" msgid="7391191384027303065">"គ្រប់គ្រង​ជង់​សកម្មភាព"</string>
+ <string name="permdesc_manageActivityStacks" msgid="1615881933034084440">"ឲ្យ​កម្មវិធី​បន្ážáŸ‚ម, លុប និង​កែ​ជង់​សកម្មភាព​ដែល​កម្មវិធី​ផ្សáŸáž„​ដំណើរការ។ កម្មវិធី​ព្យាបាទ​អាច​រំážáž¶áž“​ឥរិយាបážâ€‹áž€áž˜áŸ’មវិធី។"</string>
+ <string name="permlab_startAnyActivity" msgid="2918768238045206456">"ចាប់ផ្ដើម​សកម្មភាព​ណា​មួយ"</string>
+ <string name="permdesc_startAnyActivity" msgid="997823695343584001">"ឲ្យ​កម្មវិធី​ចាប់ផ្ដើម​សកម្មភាព​ណា​មួយ ទាក់ទង​នឹង​សិទ្ធិ​ការពារ​ ឬ​ស្ážáž¶áž“ភាព​បាន​នាំចáŸáž‰áŸ”"</string>
+ <string name="permlab_setScreenCompatibility" msgid="6975387118861842061">"កំណážáŸ‹â€‹áž—ាព​ឆប​គ្នា​នៃ​អáŸáž€áŸ’រង់"</string>
+ <string name="permdesc_setScreenCompatibility" msgid="692043618693917374">"ឲ្យ​កម្មវិធី​ពិនិážáŸ’យ​របៀប​​ážáŸ’រូវ​​គ្នា​របស់​​អáŸáž€áŸ’រង់​នៃ​កម្មវិធី​ផ្សáŸáž„ៗ។ កម្មវិធី​ព្យាបាទ​អាច​បំផ្លាញ​ឥរិយាបážâ€‹áž“ៃ​កម្មវិធី​ផ្សáŸáž„ៗ។"</string>
+ <string name="permlab_setDebugApp" msgid="3022107198686584052">"បើក​ការ​កែ​កំហុស​កម្មវិធី"</string>
+ <string name="permdesc_setDebugApp" msgid="4474512416299013256">"ឲ្យ​កម្មវិធី​បើក​ការ​កែ​កំហុស​សម្រាប់​កម្មវិធី​ផ្សáŸáž„​ទៀážáŸ” កម្មវិធី​ព្យាបាទ​អាច​ប្រើ​វា ដើម្បី​បញ្ឈប់​កម្មវិធី​ផ្សáŸáž„។"</string>
+ <string name="permlab_changeConfiguration" msgid="4162092185124234480">"ប្ដូរ​ការ​កំណážáŸ‹â€‹áž”ង្ហាញ​ប្រពáŸáž“្ធ"</string>
+ <string name="permdesc_changeConfiguration" msgid="4372223873154296076">"ឲ្យ​កម្មវិធី​ប្ដូរ​ការ​កំណážáŸ‹â€‹â€‹ážšáž…នាសម្ពáŸáž“្ធ​បច្ចុប្បន្ន ដូច​ជា​មូលដ្ឋាន ឬ​ទំហំ​ពុម្ពអក្សរ​ទាំងអស់។"</string>
+ <string name="permlab_enableCarMode" msgid="5684504058192921098">"បើក​របៀប​រážáž™áž“្áž"</string>
+ <string name="permdesc_enableCarMode" msgid="4853187425751419467">"ឲ្យ​កម្មវិធី​បើក​របៀប​រážáž™áž“្ážáŸ”"</string>
+ <string name="permlab_killBackgroundProcesses" msgid="3914026687420177202">"បិទ​កម្មវិធី​ផ្សáŸáž„ៗ"</string>
+ <string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"ឲ្យ​កម្មវិធី​បញ្ឈប់​ដំណើរការ​​ផ្ទៃ​ážáž¶áž„​ក្រោយ​នៃ​កម្មវិធី​ផ្សáŸáž„ៗ​។ វា​អាច​ធ្វើ​ឲ្យ​កម្មវិធី​ផ្សáŸáž„​ឈប់​ដំណើរការ។"</string>
+ <string name="permlab_forceStopPackages" msgid="2329627428832067700">"បង្ážáŸ†â€‹áž²áŸ’យ​បញ្ឈប់​កម្មវិធី​ផ្សáŸáž„"</string>
+ <string name="permdesc_forceStopPackages" msgid="5253157296183940812">"ឲ្យ​កម្មវិធី​បញ្ឈប់​កម្មវិធី​ផ្សáŸáž„​ដោយ​បង្ážáŸ†áŸ”"</string>
+ <string name="permlab_forceBack" msgid="652935204072584616">"បង្ážáŸ†â€‹áž²áŸ’យ​កម្មវិធី​បិទ"</string>
+ <string name="permdesc_forceBack" msgid="3892295830419513623">"ឲ្យ​កម្មវិធី​បង្ážáŸ†â€‹ážŸáž€áž˜áŸ’មភាព​ផ្សáŸáž„ៗ​ដែល​នៅ​ក្នុង​ផ្ទៃ​ážáž¶áž„​មុážâ€‹áž”áž·áž‘ និង​ទៅ​ក្នុង​ផ្ទៃ​ážáž¶áž„​ក្រោយ។ មិន​គួរ​ចាំបាច់​សម្រាប់​កម្មវិធី​ធម្មážáž¶â€‹áž‘áŸáŸ”"</string>
+ <string name="permlab_dump" msgid="1681799862438954752">"ទៅ​យក​ស្ážáž¶áž“ភាព​ážáž¶áž„​ក្នុង​ប្រពáŸáž“្ធ"</string>
+ <string name="permdesc_dump" msgid="1778299088692290329">"ឲ្យ​កម្មវិធី​ទៅ​យក​ស្ážáž¶áž“ភាព​ážáž¶áž„​ក្នុង​នៃ​ប្រពáŸáž“្ធ។ កម្មវិធី​ព្យាបាទ​អាច​ទៅ​យក​ពáŸážáŸŒáž˜áž¶áž“​ឯកជន​និង​មាន​សុវážáŸ’ážáž·áž—ាព​ផ្សáŸáž„ៗ​ដែល​ពួកវា​មិន​គួរ​ážáŸ’រូវការ​ážáž¶áž˜â€‹áž’ម្មážáž¶áŸ”"</string>
+ <string name="permlab_retrieve_window_content" msgid="8022588608994589938">"ទៅ​យក​មាážáž·áž€áž¶â€‹áž¢áŸáž€áŸ’រង់"</string>
+ <string name="permdesc_retrieve_window_content" msgid="3193269069469700265">"ឲ្យ​កម្មវិធី​ទៅ​យក​មាážáž·áž€áž¶â€‹áž”ង្អួច​សកម្ម។ កម្មវិធី​ព្យាបាទ​អាច​ទៅ​យក​មាážáž·áž€áž¶â€‹áž”ង្អួច​ទាំង​មូល និង​ពិនិážáŸ’យ​អážáŸ’ážáž”ទ​ទាំងអស់ លើកលែង​ážáŸ‚​ពាក្យ​សម្ងាážáŸ‹áŸ”"</string>
+ <string name="permlab_temporary_enable_accessibility" msgid="2312612135127310254">"បើក​មធ្យោបាយ​ងាយស្រួល​ជា​បណ្ដោះ​អាសន្ន"</string>
+ <string name="permdesc_temporary_enable_accessibility" msgid="8079456293182975464">"ឲ្យ​កម្មវិធី​បើក​ភាព​ងាយស្រួល​លើ​ឧបករណáŸâ€‹áž‡áž¶â€‹áž”ណ្ដោះអាសន្ន។ កម្មវិធី​ព្យាបាទ​អាច​បើក​ភាព​ងាយស្រួល​ដោយ​មិន​ឲ្យ​អ្នក​ប្រើ​ដឹង។"</string>
+ <string name="permlab_retrieve_window_info" msgid="8532295199112519378">"ទៅ​យក​ពáŸážáŸŒáž˜áž¶áž“​បង្អួច"</string>
+ <string name="permdesc_retrieve_window_info" msgid="4998836370424186849">"ឲ្យ​កម្មវិធី ទៅ​យក​ពáŸážáŸŒáž˜áž¶áž“​អំពី​បង្អួច​ពី​កម្មវិធី​គ្រប់គ្រង​បង្អួច។ កម្មវិធី​ព្យាបាទ​អាច​ទៅ​យក​ពáŸážáŸŒáž˜áž¶áž“​ដែល​មាន​បំណង​សម្រាប់​ការ​ប្រើ​ប្រពáŸáž“្ធ​ážáž¶áž„​ក្នុង។"</string>
+ <string name="permlab_filter_events" msgid="8675535648807427389">"ច្រោះ​ព្រឹážáŸ’ážáž·áž€áž¶ážšážŽáŸ"</string>
+ <string name="permdesc_filter_events" msgid="8006236315888347680">"ឲ្យ​កម្មវិធី​ចុះ​ឈ្មោះ​ážáž˜áŸ’រង​បញ្ចូល​​ដែល​ច្រោះ​​ព្រឹážáŸ’ážáž·áž€áž¶ážšážŽáŸâ€‹ážšáž”ស់​អ្នក​ប្រើ​ទាំងអស់​មុន​ពáŸáž›â€‹áž–ួក​វា​ážáŸ’រូវ​បាន​ផ្ដាច់។ កម្មវិធី​ព្យាបាទ​អាច​ពិនិážáŸ’យ​ចំណុច​ប្រទាក់​ប្រពáŸáž“្ធ​ដោយ​គ្មាន​អំពើ​ពី​អ្នក​ប្រើ។"</string>
+ <string name="permlab_magnify_display" msgid="5973626738170618775">"ពង្រីក​ការ​បង្ហាញ"</string>
+ <string name="permdesc_magnify_display" msgid="7121235684515003792">"ឲ្យ​កម្មវិធី​ពង្រីក​មាážáž·áž€áž¶â€‹áž“ៃ​ការ​បង្ហាញ។ កម្មវិធី​ព្យាបាទ​អាច​ប្ដូរ​មាážáž·áž€áž¶â€‹áž€áž¶ážšâ€‹áž”ង្ហាញ​ážáž¶áž˜ážœáž·áž’ី​ដែល​បង្ហាញ​ážáž¶â€‹áž§áž”ករណáŸâ€‹áž˜áž·áž“​អាច​ប្រើ​បាន។"</string>
+ <string name="permlab_shutdown" msgid="7185747824038909016">"បិទ​​ដោយ​ផ្នែក"</string>
+ <string name="permdesc_shutdown" msgid="7046500838746291775">"ដាក់​កម្មវិធី​គ្រប់គ្រង​​សកម្មភាព​ក្នុង​ស្ážáž¶áž“​ភាព​បិទ។ មិន​អនុវážáŸ’ážâ€‹áž€áž¶ážšâ€‹áž”ិទ​ពáŸáž‰áž›áŸáž‰â€‹áž‘áŸáŸ”"</string>
+ <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"ការ​ពារ​​ការ​ប្ដូរ​កម្មវិធី"</string>
+ <string name="permdesc_stopAppSwitches" msgid="8262195802582255021">"ការ​ពារ​អ្នក​ប្រើ​មិន​ឲ្យ​ប្ដូរ​​ទៅ​កម្មវិធី​ផ្សáŸáž„។"</string>
+ <string name="permlab_getTopActivityInfo" msgid="2537922311411546016">"យក​ពáŸážáŸŒáž˜áž¶áž“​កម្មវិធី​បច្ចុប្បន្ន"</string>
+ <string name="permdesc_getTopActivityInfo" msgid="8153651434145132505">"អនុញ្ញាážâ€‹áž±áŸ’យ​ម្ចាស់ទៅ​យក​ពáŸâ€‹ážáŸŒâ€‹áž˜áž¶áž“​ឯកជន​អំពី​កម្មវិធី​បច្ចុប្បន្ន ​និង​សáŸážœáž¶áž€áž˜áŸ’ម​នៅ​ក្នុង​ផ្ទៃ​ážáž¶áž„មុážâ€‹ážšáž”ស់​អáŸáž€áŸ’រង់​។"</string>
+ <string name="permlab_runSetActivityWatcher" msgid="892239094867182656">"ážáž¶áž˜ážŠáž¶áž“ និង​ពិនិážáŸ’យ​ការ​ចាប់ផ្ដើម​កម្មវិធី"</string>
+ <string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"ឲ្យ​កម្មវិធី​ážáž¶áž˜ážŠáž¶áž“ និង​ពិនិážáŸ’យ​វិធី​ដែល​ប្រពáŸáž“្ធ​ចាប់ផ្ដើម​​សកម្មភាព។ កម្មវិធី​ព្យាបាទ​អាច​​សម្របសម្រួល​ប្រពáŸáž“្ធ​ទាំង​ស្រុង។ សិទ្ធិ​នáŸáŸ‡â€‹áž…ាំបាច់​សម្រាប់​ážáŸ‚​ការ​អភិវឌ្ហមិន​សម្រាប់​​ប្រើ​ធម្ម​ážáž¶â€‹áž‘áŸáŸ”"</string>
+ <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"ផ្ញើ​កញ្ចប់​​ការ​ប្រកាស​បាន​យកចáŸáž‰"</string>
+ <string name="permdesc_broadcastPackageRemoved" msgid="6621901216207931089">"ឲ្យ​កម្មវិធី​ប្រកាស​ការ​ជូន​ដំណឹង​ážáž¶ កញ្ចប់​កម្មវិធី​ážáŸ’រូវ​បាន​លុប​។ កម្មវិធី​ព្យាបាទ​អាច​ប្រើ​វា ដើម្បី​​បញ្ឈប់​កម្មវិធី​ដែល​កំពុង​ដំណើរ​ការ​ផ្សáŸáž„​ៗ។"</string>
+ <string name="permlab_broadcastSmsReceived" msgid="5689095009030336593">"ផ្ញើ​ការ​ប្រកាស​បាន​ទទួល SMS"</string>
+ <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"ឲ្យ​កម្មវិធី​ប្រកាស​ការ​ជូន​ដំណឹង​​ការ​ទទួល​សារ​ SMS ។ កម្មវិធី​ព្យាបាទ​អាច​ប្រើ​វា​​ដើម្បី​​បន្លំ​សារ SMS ចូល។"</string>
+ <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"ផ្ញើ​ការ​ប្រកាស​បាន​ទទួល​ WAP-PUSH"</string>
+ <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"ឲ្យ​កម្មវិធី​ប្រកាស​ការ​ជូន​ដំណឹង​ážáž¶â€‹áž”ាន​ទទួល​សារ WAP PUSH ។ កម្មវិធី​ព្យាបាទ​អាច​ប្រើ​វា​ដើម្បី​​ក្លែង​​បង្កាន់ដៃ​សារ MMS ឬ​ជំនួស​មាážáž·áž€áž¶â€‹áž‘ំពáŸážšâ€‹áž”ណ្ដាញ​ណាមួយ​ស្ងាážáŸ‹â€‹áŸ—​​​ដោយ​អ្វី​ដែល​ក្លែងក្លាយ។"</string>
+ <string name="permlab_setProcessLimit" msgid="2451873664363662666">"កំណážáŸ‹â€‹áž…ំនួន​ដំណើរការ​ដែល​កំពុង​ដំណើរការ"</string>
+ <string name="permdesc_setProcessLimit" msgid="7318061314040879542">"ឲ្យ​កម្មវិធី​ពិនិážáŸ’យ​ចំនួន​ដំណើរការ​អážáž·áž”រមា​ដែល​នឹង​ដំណើរការ។ មិន​ចាំបាច់​សម្រាប់​កម្មវិធី​ធម្មážáž¶â€‹áž‘áŸáŸ”"</string>
+ <string name="permlab_setAlwaysFinish" msgid="550958507798796965">"បង្ážáŸ†â€‹â€‹áž²áŸ’យ​បិទ​កម្មវិធី​ក្នុង​ផ្ទៃ​ážáž¶áž„​ក្រោយ"</string>
+ <string name="permdesc_setAlwaysFinish" msgid="7471310652868841499">"ឲ្យ​កម្មវិធី​ពិនិážáŸ’យ​ážáž¶â€‹ážáž¾â€‹ážŸáž€áž˜áŸ’មភាព​​ážáŸ’រូវ​បាន​បញ្ចប់​ជា​និច្ច​ដរាប​ណា​ពួកគáŸâ€‹â€‹áž‘ៅ​ក្នុង​ផ្ទៃ​ážáž¶áž„​ក្រោយ។ មិន​ចាំបាច់​សម្រាប់​កម្មវិធី​ធម្មážáž¶â€‹áž‘áŸáŸ”"</string>
+ <string name="permlab_batteryStats" msgid="2789610673514103364">"អាន​ស្ážáž·ážáž·â€‹ážáŸ’ម"</string>
+ <string name="permdesc_batteryStats" msgid="5897346582882915114">"ឲ្យ​កម្មវិធី​អាន​ទិន្ននáŸáž™â€‹áž”្រើ​ážáŸ’ម​កម្រិážâ€‹áž‘ាប​បច្ចុប្បន្ន។ អាច​ឲ្យ​កម្មវិធី​ស្វែងយល់​ពáŸážáŸŒáž˜áž¶áž“​លម្អិážâ€‹áž¢áŸ†áž–ី​កម្មវិធី​ដែល​អ្នក​ប្រើ។"</string>
+ <string name="permlab_updateBatteryStats" msgid="3719689764536379557">"កែ​ស្ážáž·ážáž·â€‹ážáŸ’ម"</string>
+ <string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"ឲ្យ​កម្មវិធី​កែ​ស្ážáž·ážáž·â€‹ážáŸ’ម​ដែល​បាន​ប្រមូល។ មិន​សម្រាប់​ប្រើ​ដោយ​កម្មវិធី​ធម្មážáž¶â€‹áž‘áŸáŸ”"</string>
+ <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"ទៅ​យក​ស្ážáž·ážáž·â€‹áž”្រážáž·áž”ážáŸ’ážáž·áž€áž¶ážšâ€‹áž€áž˜áŸ’មវិធី"</string>
+ <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"ឲ្យ​កម្មវិធី​ទៅ​យក​ស្ážáž·ážáž·â€‹áž”្រážáž·áž”ážáŸ’ážáž·áž€áž¶ážšâ€‹áž€áž˜áŸ’មវិធី​បាន​ប្រមូល។ មិន​សម្រាប់​ប្រើ​ដោយ​កម្មវិធី​ធម្មážáž¶áŸ”"</string>
+ <string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"កែ​ស្ážáž·ážáž·â€‹áž”្រážáž·áž”ážáŸ’ážáž·áž€áž¶ážšâ€‹â€‹áž€áž˜áŸ’មវិធី"</string>
+ <string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"ឲ្យ​កម្មវិធី​កែ​ស្ážáž·ážáž·â€‹áž”្រážáž·áž”ážáŸ’ážáž·áž€áž¶ážšâ€‹áž€áž˜áŸ’មវិធី​បាន​ប្រមូល។ មិន​សម្រាប់​ប្រើ​ដោយ​កម្មវិធី​ធម្មážáž¶áŸ”"</string>
+ <string name="permlab_backup" msgid="470013022865453920">"ពិនិážáŸ’យ​ការ​ស្ដារ និង​បម្រុង​ទុក​ប្រពáŸáž“្ធ"</string>
+ <string name="permdesc_backup" msgid="6912230525140589891">"ឲ្យ​កម្មវិធី​ពិនិážáŸ’យ​​យន្ážáž€áž¶ážšâ€‹â€‹áž”ម្រុងទុក​ និង​ស្ដារ​ឡើងវិញ​របស់​ប្រពáŸáž“្ធ។ មិន​សម្រាប់​ប្រើ​ដោយ​កម្មវិធី​ធម្មážáž¶â€‹áž‘áŸáŸ”"</string>
+ <string name="permlab_confirm_full_backup" msgid="5557071325804469102">"បញ្ជាក់​​ប្រážáž·áž”ážáŸ’ážáž·áž€áž¶ážšâ€‹ážŸáŸ’ដារ​ឡើងវិញ ឬ​បម្រុង​ទុក​ពáŸáž‰áž›áŸáž‰"</string>
+ <string name="permdesc_confirm_full_backup" msgid="1748762171637699562">"ឲ្យ​កម្មវិធី​ចាប់ផ្ដើម​ចំណុច​ប្រទាក់​​បញ្ជាក់​ការ​បម្រុង​ទុក​ពáŸáž‰áž›áŸáž‰áŸ” មិន​សម្រាប់​ប្រើ​ដោយ​កម្មវិធី​ធម្មážáž¶â€‹áž‘áŸáŸ”"</string>
+ <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"បង្ហាញ​បង្អួច​គ្មាន​សិទ្ធិ"</string>
+ <string name="permdesc_internalSystemWindow" msgid="7458387759461466397">"ឲ្យ​កម្មវិធី​បង្កើážâ€‹áž”ង្អួច​​សម្រាប់​ប្រើ​ដោយ​ចំណុច​ប្រទាក់​អ្នកប្រើ​ប្រពáŸáž“្ធ​ážáž¶áž„​ក្នុង។ មិន​សម្រាប់​ប្រើ​ដោយ​កម្មវិធី​ធម្មážáž¶â€‹áž‘áŸáŸ”"</string>
+ <string name="permlab_systemAlertWindow" msgid="3543347980839518613">"គូរ​លើ​កម្មវិធី​ផ្សáŸáž„"</string>
+ <string name="permdesc_systemAlertWindow" msgid="8584678381972820118">"ឲ្យ​​កម្មវិធី​គូរ​លើ​ផ្នែក​ážáž¶áž„​លើ​នៃ​កម្មវិធី​ផ្សáŸáž„ៗ ឬ​ជា​ផ្នែក​នៃ​ចំណុច​ប្រទាក់។ វា​អាច​រំážáž¶áž“​ការ​ប្រើ​ចំណុច​ប្រទាក់​របស់​អ្នក​​ក្នុង​កម្មវិធី​ណាមួយ ឬ​ប្ដូរ​អ្វី​ដែល​អ្នក​គិážâ€‹ážáž¶â€‹áž¢áŸ’នក​កំពុង​មើល​ក្នុង​កម្មវិធី​ផ្សáŸáž„ៗ។"</string>
+ <string name="permlab_setAnimationScale" msgid="2805103241153907174">"កែ​ល្បឿន​ចលនា​សកល"</string>
+ <string name="permdesc_setAnimationScale" msgid="7690063428924343571">"ឲ្យ​កម្មវិធី​ប្ដូរ​ល្បឿន​ចលនា​សកល (ចលនា​លឿន​ ឬ​យឺáž) នៅ​ពáŸáž›ážŽáž¶â€‹áž˜áž½áž™áŸ”"</string>
+ <string name="permlab_manageAppTokens" msgid="1286505717050121370">"គ្រប់គ្រង​និមិážáŸ’ážážŸáž‰áŸ’ញា​កម្មវិធី"</string>
+ <string name="permdesc_manageAppTokens" msgid="8043431713014395671">"ឲ្យ​កម្មវិធី​បង្កើហនិង​គ្រប់គ្រង​និមិážáŸ’ážážŸáž‰áŸ’ញា​ផ្ទាល់​របស់​ពួក​វា ដោយ​ឆ្លង​កាážáŸ‹â€‹áž›áŸ†ážŠáž¶áž”់ Z ធម្មážáž¶â€‹ážšáž”ស់​វា។ មិន​គួរ​​ចាំបាច់​សម្រាប់​កម្មវិធី​ធម្មážáž¶â€‹áž‘áŸáŸ”"</string>
+ <string name="permlab_freezeScreen" msgid="4708181184441880175">"បង្ក​ក​​អáŸáž€áŸ’រង់"</string>
+ <string name="permdesc_freezeScreen" msgid="8558923789222670064">"ឲ្យ​កម្មវិធី​បង្កក​អáŸáž€áŸ’រង់​ជា​បណ្ដោះអាសន្ន​សម្រាប់​​ការ​​ផ្លាស់ប្ដូរ​ពáŸáž‰â€‹áž¢áŸáž€áŸ’រង់។"</string>
+ <string name="permlab_injectEvents" msgid="1378746584023586600">"ចុច​គ្រាប់ចុច និង​គ្រប់គ្រង​ប៊ូážáž»áž„"</string>
+ <string name="permdesc_injectEvents" product="tablet" msgid="206352565599968632">"ឲ្យ​កម្មវិធី​ផ្ដល់​ព្រឹážáŸ’ážáž·áž€áž¶ážšážŽáŸâ€‹áž”ញ្ចូល​ផ្ទាល់​ážáŸ’លួន​(ចុច​គ្រាប់ចុច ។ល។) ទៅ​កម្មវិធី​ផ្សáŸáž„។​ កម្មវិធី​ព្យាបាទ​អាច​ប្រើ​វា​ដើម្បី​គ្រប់គ្រង​កុំព្យូទáŸážšâ€‹áž”ន្ទះ។"</string>
+ <string name="permdesc_injectEvents" product="default" msgid="653128057572326253">"ឲ្យ​កម្មវិធី​ផ្ដល់​ព្រឹážáŸ’ážáž·áž€áž¶ážšážŽáŸâ€‹áž”ញ្ចូល​ផ្ទាល់​ážáŸ’លួន​របស់​វា (ចុច​គ្រាប់​ចុច ។ល។) ចំពោះ​កម្មវិធី​ផ្សáŸáž„ៗ។ កម្មវិធី​ព្យាបាទ​អាច​ប្រើ​វា​ដើម្បី​គ្រប់គ្រង​ទូរសáŸáž–្ទ។"</string>
+ <string name="permlab_readInputState" msgid="469428900041249234">"កážáŸ‹ážáŸ’រា​នូវ​អ្វី​ដែល​អ្នក​វាយ​ និង​សកម្មភាព​ដែល​អ្នក​បាន​យក"</string>
+ <string name="permdesc_readInputState" msgid="8387754901688728043">"ឲ្យ​កម្មវិធី​មើល​គ្រាប់​ចុច​ដែល​អ្នក​ចុច​ពáŸáž›â€‹áž˜áž¶áž“​អន្ážážšáž€áž˜áŸ’ម​ជា​មួយ​កម្មវិធី​ផ្សáŸáž„ (ដូចជា បញ្ចូល​ពាក្យ​សម្ងាážáŸ‹)។ មិន​គួរ​ចាំបាច់​សម្រាប់​កម្មវិធី​ធម្មážáž¶â€‹áž‘áŸáŸ”"</string>
+ <string name="permlab_bindInputMethod" msgid="3360064620230515776">"ចង​ទៅ​វិធីសាស្ážáŸ’រ​បញ្ចូល"</string>
+ <string name="permdesc_bindInputMethod" msgid="3250440322807286331">"ឲ្យ​ម្ចាស់​ចង​ចំណុច​ប្រទាក់​កម្រិážâ€‹áž€áŸ†áž–ូល​នៃ​វិធី​សាស្ážáŸ’រ​បញ្ចូល។ មិន​គួរ​​ចាំបាច់​សម្រាប់​កម្មវិធី​ធម្មážáž¶â€‹áž‘áŸáŸ”"</string>
+ <string name="permlab_bindAccessibilityService" msgid="5357733942556031593">"ចង​សáŸážœáž¶â€‹áž€áž˜áŸ’ម​ភាព​មធ្យោបាយ​ងាយស្រួល"</string>
+ <string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"ឲ្យ​​ម្ចាស់​ចង​ចំណុច​ប្រទាក់​កម្រិážâ€‹áž€áŸ†áž–ូល​នៃ​សáŸážœáž¶áž€áž˜áŸ’ម​ភាព​ងាយស្រួល។ មិន​គួរ​ចាំបាច់​សម្រាប់​កម្មវិធី​ធម្មážáž¶â€‹áž‘áŸáŸ”"</string>
+ <string name="permlab_bindPrintService" msgid="8462815179572748761">"ចង​សáŸážœáž¶áž€áž˜áŸ’ម​​បោះពុម្ព"</string>
+ <string name="permdesc_bindPrintService" msgid="7960067623209111135">"ឲ្យ​ម្ចាស់​ចង​ចំណុច​ប្រទាក់​កម្រិážâ€‹áž€áŸ†áž–ូល​នៃ​សáŸážœáž¶áž€áž˜áŸ’ម​ធាážáž»â€‹áž€áŸ’រាហ្វិក។ មិន​គួរ​​ចាំបាច់​សម្រាប់​កម្មវិធី​ធម្មážáž¶â€‹áž‘áŸáŸ”"</string>
+ <string name="permlab_accessAllPrintJobs" msgid="1120792468465711159">"ចូល​ដំណើរការ​​ការងារ​បោះពុម្ព​ទាំងអស់"</string>
+ <string name="permdesc_accessAllPrintJobs" msgid="2978185311041864762">"អនុញ្ញាážâ€‹áž²áŸ’យ​ម្ចាស់​អាច​បោះពុម្ព​ការងារ​ដែល​បាន​បង្កើážâ€‹ážŠáŸ„យ​កម្មវិធី​ផ្សáŸáž„។ មិន​គួរ​ចាំបាច់​សម្រាប់​កម្មវិធី​ធម្មážáž¶â€‹áž‘áŸáŸ”"</string>
+ <string name="permlab_bindNfcService" msgid="2752731300419410724">"ភ្ជាប់​ជាមួយ​សáŸážœáž¶áž€áž˜áŸ’ម NFC"</string>
+ <string name="permdesc_bindNfcService" msgid="6120647629174066862">"អនុញ្ញាážâ€‹áž²áŸ’យ​​ភ្ជាប់​​​បញ្ជី​ជាមួយ​​កម្មវិធី​ដែល​ážáŸ’រូវ​បាន​ážáŸ’រាប់​ážáž¶áž˜â€‹â€‹áž€áž¶áž NFC ។ មិន​គួរ​ážáŸ’រូវ​​ការ​សម្រាប់​កម្មវិធី​ធម្មážáž¶â€‹áŸ”"</string>
+ <string name="permlab_bindTextService" msgid="7358378401915287938">"ចង​សáŸážœáž¶â€‹áž€áž˜áŸ’ម​អážáŸ’ážáž”áž‘"</string>
+ <string name="permdesc_bindTextService" msgid="8151968910973998670">"ឲ្យ​ម្ចាស់​ចង​ចំណុច​ប្រទាក់​កម្រិážâ€‹áž€áŸ†áž–ូល​នៃ​សáŸážœáž¶áž€áž˜áŸ’ម​អážáŸ’ážáž”áž‘ (áž§. SpellCheckerService) ។ មិន​គួរ​ប្រើ​សម្រាប់​កម្មវិធី​ធម្មážáž¶â€‹áž‘áŸáŸ”"</string>
+ <string name="permlab_bindVpnService" msgid="4708596021161473255">"ចង​ជា​មួយ​សáŸážœáž¶áž€áž˜áŸ’ម VPN"</string>
+ <string name="permdesc_bindVpnService" msgid="2067845564581693905">"ឲ្យ​ម្ចាស់​ចង​ចំណុច​ប្រទាក់​កម្រិážâ€‹áž€áŸ†áž–ូល​នៃ​សáŸážœáž¶áž€áž˜áŸ’ម Vpn ។​ មិន​គួរ​ចាំបាច់​សម្រាប់​កម្មវិធី​ធម្មážáž¶â€‹áž‘áŸáŸ”"</string>
+ <string name="permlab_bindWallpaper" msgid="8716400279937856462">"ចង​ទៅ​ផ្ទាំង​រូបភាព"</string>
+ <string name="permdesc_bindWallpaper" msgid="7108428692595491668">"ឲ្យ​ម្ចាស់​ចង​ចំណុចប្រទាក់​កម្រិážâ€‹áž€áŸ†áž–ូល​នៃ​ផ្ទាំង​រូបភាព។ មិន​គួរ​ចាំបាច់​សម្រាប់​កម្មវិធី​ធម្មážáž¶â€‹áž‘áŸáŸ”"</string>
+ <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"ចង​សáŸážœáž¶â€‹áž€áž˜áŸ’ម​ធាážáž»â€‹áž€áŸ’រាហ្វិក"</string>
+ <string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"ឲ្យ​ម្ចាស់​ចង​ចំណុច​ប្រទាក់​កម្រិážâ€‹áž€áŸ†áž–ូល​នៃ​សáŸážœáž¶áž€áž˜áŸ’ម​ធាážáž»â€‹áž€áŸ’រាហ្វិក។ មិន​គួរ​​ចាំបាច់​សម្រាប់​កម្មវិធី​ធម្មážáž¶â€‹áž‘áŸáŸ”"</string>
+ <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"ទាក់ទង​ជា​មួយ​អ្នកគ្រប់គ្រង​ឧបករណáŸ"</string>
+ <string name="permdesc_bindDeviceAdmin" msgid="569715419543907930">"ឲ្យ​ម្ចាស់​ផ្ញើ​គោលបំណង​​ទៅ​អ្នក​គ្រប់គ្រង​ឧបករណáŸáŸ” មិន​គួរ​ចាំបាច់​សម្រាប់​កម្មវិធី​ធម្មážáž¶â€‹áž‘áŸáŸ”"</string>
+ <string name="permlab_manageDeviceAdmins" msgid="4248828900045808722">"បន្ážáŸ‚ម​ ឬ​លុប​កម្មវិធី​គ្រប់គ្រង​​​ឧបករណáŸ"</string>
+ <string name="permdesc_manageDeviceAdmins" msgid="5025608167709942485">"អនុញ្ញាážâ€‹â€‹â€‹áž²áŸ’យ​ម្ចាស់​​​បន្ážáŸ‚ម​ ឬ​លុប​កម្មវិធី​គ្រប់គ្រង​ឧបករណáŸâ€‹ážŸáž€áž˜áŸ’ម​ចáŸáž‰â€‹áŸ” មិន​គួរ​ប្រើ​សម្រាប់​កម្មវិធី​​ធម្មážáž¶â€‹áž‘áŸâ€‹áŸ”"</string>
+ <string name="permlab_setOrientation" msgid="3365947717163866844">"ប្ដូរ​ទិស​អáŸáž€áŸ’រង់"</string>
+ <string name="permdesc_setOrientation" msgid="3046126619316671476">"ឲ្យ​កម្មវិធី​ប្ដូរ​ការ​បង្វិល​អáŸáž€áŸ’រង់​នៅ​ពáŸáž›â€‹ážŽáž¶â€‹áž˜áž½áž™áŸ” មិន​ចាំបាច់​សម្រាប់​កម្មវិធី​ធម្មážáž¶â€‹áž‘áŸáŸ”"</string>
+ <string name="permlab_setPointerSpeed" msgid="9175371613322562934">"ប្ដូរ​ល្បឿន​ទ្រនិច"</string>
+ <string name="permdesc_setPointerSpeed" msgid="6866563234274104233">"ឲ្យ​កម្មវិធី​ប្ដូរ​ល្បឿន​ទ្រនិច​​កណ្ដុរ ឬ​បន្ទះ​ប៉ះ​​​នៅ​ពáŸáž›â€‹ážŽáž¶â€‹áž˜áž½áž™áŸ” មិន​គួរ​ចាំបាច់​សម្រាប់​កម្មវិធី​ធម្មážáž¶â€‹áž‘áŸáŸ”"</string>
+ <string name="permlab_setKeyboardLayout" msgid="4778731703600909340">"ប្ដូរ​ប្លង់​ក្ដារ​ចុច"</string>
+ <string name="permdesc_setKeyboardLayout" msgid="8480016771134175879">"ឲ្យ​កម្មវិធី​ប្ដូរ​ប្លង់​ក្ដារ​ចុច។ មិន​គួរ​ចាំបាច់​សម្រាប់​កម្មវិធី​ធម្មážáž¶â€‹áž‘áŸáŸ”"</string>
+ <string name="permlab_signalPersistentProcesses" msgid="4539002991947376659">"ផ្ញើ​សញ្ញា​លីនុច​ទៅ​កម្មវិធី"</string>
+ <string name="permdesc_signalPersistentProcesses" msgid="4896992079182649141">"ឲ្យ​កម្មវិធី​ស្នើ​​សញ្ញា​ដែល​បាន​ផ្ដល់​ážáŸ’រូវ​ផ្ញើ​ទៅ​ដំណើរការ​ស្ážáž·ážážŸáŸ’ážáŸážšâ€‹â€‹áž‘ាំង​អស់។"</string>
+ <string name="permlab_persistentActivity" msgid="8841113627955563938">"ធ្វើ​ឲ្យ​កម្មវិធី​ដំណើរការ​ជា​និច្ច"</string>
+ <string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"ឲ្យ​កម្មវិធី​ធ្វើជា​ផ្នែក​​ស្ážáž·ážážŸáŸ’ážáŸážšâ€‹ážŠáŸ„យ​ážáŸ’លួន​ឯង​ក្នុង​អង្គ​ចងចាំ។ វា​អាច​កំណážáŸ‹â€‹áž¢áž„្គ​ចងចាំ​ដែល​អាច​ប្រើ​បាន​ចំពោះ​កម្មវិធី​ផ្សáŸáž„ៗ​ ដោយ​ធ្វើឲ្យ​កុំព្យូទáŸážšâ€‹áž”ន្ទះ​យឺážáŸ”"</string>
+ <string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"ឲ្យ​កម្មវិធី ធ្វើជា​ផ្នែក​អចិន្ážáŸ’រៃយáŸâ€‹áž“ៃ​ážáŸ’លួន​ក្នុង​អង្គ​ចងចាំ។ វា​អាច​កម្រិážâ€‹áž¢áž„្គ​ចងចាំ​អាច​ប្រើ​បាន​ ដើម្បី​ធ្វើ​ឲ្យ​កម្មវិធី​ផ្សáŸáž„​ធ្វើ​ឲ្យ​ទូរសáŸáž–្ទ​របស់​អ្នក​យឺážáŸ”"</string>
+ <string name="permlab_deletePackages" msgid="184385129537705938">"លុប​កម្មវិធី"</string>
+ <string name="permdesc_deletePackages" msgid="7411480275167205081">"ឲ្យ​កម្មវិធី​លុប​កញ្ចប់ Android ។ កម្មវិធី​ព្យាបាទ​អាច​ប្រើ​វា ដើម្បី​លុប​កម្មវិធី​សំážáž¶áž“់​ៗ។"</string>
+ <string name="permlab_clearAppUserData" msgid="274109191845842756">"លុប​ទិន្ននáŸáž™â€‹ážšáž”ស់​​កម្មវិធី​ផ្សáŸáž„"</string>
+ <string name="permdesc_clearAppUserData" msgid="4625323684125459488">"ឲ្យ​កម្មវិធី​សម្អាážâ€‹áž‘ិន្ននáŸáž™â€‹áž¢áŸ’នក​ប្រើ។"</string>
+ <string name="permlab_deleteCacheFiles" msgid="3128665571837408675">"លុប​ឃ្លាំង​សម្ងាážáŸ‹â€‹áž€áž˜áŸ’មវិធី​ផ្សáŸáž„ៗ"</string>
+ <string name="permdesc_deleteCacheFiles" msgid="3812998599006730196">"ឲ្យ​កម្មវិធី​លុប​ឯកសារ​ឃ្លាំង​សម្ងាážáŸ‹áŸ”"</string>
+ <string name="permlab_getPackageSize" msgid="7472921768357981986">"វាស់​ទំហំ​ការ​ផ្ទុក​​កម្មវិធី"</string>
+ <string name="permdesc_getPackageSize" msgid="3921068154420738296">"ឲ្យ​កម្មវិធី​ទៅ​យក​កូដ ទិន្ននáŸáž™ និង​ទំហំ​ឃ្លាំង​សម្ងាážáŸ‹â€‹ážšáž”ស់​វា"</string>
+ <string name="permlab_installPackages" msgid="2199128482820306924">"ដំឡើង​កម្មវិធី​ដោយ​ផ្ទាល់"</string>
+ <string name="permdesc_installPackages" msgid="5628530972548071284">"ឲ្យ​កម្មវិធី​ដំឡើង​កញ្ចប់​ Android ដែល​បាន​ធ្វើ​បច្ចុប្បន្ន ឬ​ážáŸ’មី។ កម្មវិធី​ព្យាបាទ​អាច​ប្រើ​វា ដើម្បី​បន្ážáŸ‚ម​កម្មវិធី​ដែល​មាន​សិទ្ធិ​ដោយ​បំពាន។"</string>
+ <string name="permlab_clearAppCache" msgid="7487279391723526815">"លុប​ទិន្ននáŸáž™â€‹ážƒáŸ’លាំង​សម្ងាážáŸ‹â€‹áž€áž˜áŸ’មវិធី​ទាំងអស់"</string>
+ <string name="permdesc_clearAppCache" product="tablet" msgid="8974640871945434565">"ឲ្យ​កម្មវិធី​បង្កើន​ទំហំ​ផ្ទុក​កុំព្យូទáŸážšâ€‹áž”ន្ទះ ដោយ​លុប​ឯកសារ​ក្នុង​ážážâ€‹ážƒáŸ’លាំង​សម្ងាážáŸ‹â€‹áž“ៃ​កម្មវិធី​ផ្សáŸáž„។ វា​អាច​ធ្វើ​ឲ្យ​កម្មវិធី​ផ្សáŸáž„​ចាប់ផ្ដើម​យឺážâ€‹áž–្រោះážáž¶â€‹â€‹áž–ួកវា​ážáŸ’រូវ​ទៅ​យក​ទិន្ននáŸáž™â€‹áž¡áž¾áž„វិញ។"</string>
+ <string name="permdesc_clearAppCache" product="default" msgid="2459441021956436779">"ឲ្យ​កម្មវិធី​បង្កើន​ទំហំ​ផ្ទុក​ទូរសáŸáž–្ទ​ ដោយ​លុប​ឯកសារ​ក្នុង​ážážâ€‹ážƒáŸ’លាំង​សម្ងាážáŸ‹â€‹áž€áž˜áŸ’មវិធី។ វា​អាច​ធ្វើ​ឲ្យ​កម្មវិធី​ផ្សáŸáž„​កាន់​ážáŸ‚​យឺហព្រោះ​ážáž¶â€‹áž–ួកវា​​ážáŸ’រូវ​ទៅ​យក​ទិន្ននáŸáž™â€‹ážšáž”ស់​ពួកវា។"</string>
+ <string name="permlab_movePackage" msgid="3289890271645921411">"ផ្លាស់ទី​ធនធាន​កម្មវិធី"</string>
+ <string name="permdesc_movePackage" msgid="319562217778244524">"ឲ្យ​កម្មវិធី​ផ្លាស់ទី​ប្រភព​កម្មវិធី​ពី​មáŸážŒáŸ€â€‹ážáž¶áž„​ក្នុង​ទៅ​ážáž¶áž„​ក្រៅ​​ និង​ផ្ទុយ​មក​វិញ។"</string>
+ <string name="permlab_readLogs" msgid="6615778543198967614">"អាន​ទិន្ននáŸáž™â€‹áž€áŸ†ážŽážáŸ‹â€‹áž áŸážáž»â€‹áž”្រែប្រួល"</string>
+ <string name="permdesc_readLogs" product="tablet" msgid="82061313293455151">"ឲ្យ​កម្មវិធី​អាន​ពី​ឯកសារ​កំណážáŸ‹áž áŸážáž»â€‹áž”្រពáŸáž“្ធ។ វា​អនុញ្ញាážâ€‹áž²áŸ’យ​រក​មើល​ពáŸážáŸŒáž˜áž¶áž“​ទូទៅ​អំពី​អ្វី​ដែល​អ្នក​កំពុង​ធ្វើជា​មួយ​កុំព្យូទáŸážšâ€‹áž”ន្ទះ សំážáž¶áž“់​រួមមាន​ពáŸážáŸŒáž˜áž¶áž“​ផ្ទាល់​ážáŸ’លួន​ ឬ​ឯកជន។"</string>
+ <string name="permdesc_readLogs" product="default" msgid="2063438140241560443">"ឲ្យ​កម្មវិធី​អាន​ពី​ឯកសារ​កំណážáŸ‹áž áŸážáž»â€‹áž”្រពáŸáž“្ធ។ វា​អនុញ្ញាážâ€‹áž²áŸ’យ​រក​មើល​ពáŸážáŸŒáž˜áž¶áž“​ទូទៅ​អំពី​អ្វី​ដែល​អ្នក​កំពុង​ធ្វើជា​មួយ​កុំព្យូទáŸážšâ€‹áž”ន្ទះ សំážáž¶áž“់​រួមមាន​ពáŸážáŸŒáž˜áž¶áž“​ផ្ទាល់​ážáŸ’លួន​ ឬ​ឯកជន។"</string>
+ <string name="permlab_anyCodecForPlayback" msgid="715805555823881818">"ប្រើ​កម្មវិធី​ឌិកូដ​​មáŸážŒáŸ€â€‹ážŽáž¶â€‹áž˜áž½áž™â€‹ážŸáž˜áŸ’រាប់​ចាក់​ឡើងវិញ"</string>
+ <string name="permdesc_anyCodecForPlayback" msgid="8283912488433189010">"ឲ្យ​កម្មវិធី​ប្រើ​កម្មវិធី​ឌិកូដ​មáŸážŒáŸ€â€‹ážŠáŸ‚ល​បាន​ដំឡើង ដើម្បី​ឌិកូដ​សម្រាប់​ការ​ចាក់​ឡើងវិញ។"</string>
+ <!-- no translation found for permlab_manageCaCertificates (1678391896786882014) -->
+ <skip />
+ <!-- no translation found for permdesc_manageCaCertificates (4015644047196937014) -->
+ <skip />
+ <string name="permlab_diagnostic" msgid="8076743953908000342">"អាន/សរសáŸážšâ€‹áž’នធាន​គ្រប់គ្រង​ប្រអប់"</string>
+ <string name="permdesc_diagnostic" msgid="6608295692002452283">"ឲ្យ​កម្មវិធី​អាន និង​សរសáŸážšâ€‹áž”្រភព​ណាមួយ​ដែល​គ្រប់គ្រង​ដោយ​ក្រុម​អ្នក​វិនិច្ឆáŸáž™ ឧទាហរណ០ឯកសារ​នៅ​ក្នុង /dev ។ វា​អាច​ប៉ះពាល់​យ៉ាង​ážáŸ’លាំង​ដល់​ស្ážáŸážšâ€‹áž—ាព​ និង​សុវážáŸ’ážáž·áž—ាព​ប្រពáŸáž“្ធ។ វា​គួរ​ážáŸ’រូវ​បាន​ប្រើ​សម្រាប់​វិនិច្ឆáŸáž™â€‹áž•្នែក​រឹង​ជាក់​លាក់​ដោយ​ក្រុមហ៊ុន​ផលិហឬ​ប្រážáž·áž”ážáŸ’ážáž·â€‹áž€ážšáŸ”"</string>
+ <string name="permlab_changeComponentState" msgid="6335576775711095931">"បិទ ឬ​បើក​សមាសធាážáž»â€‹áž€áž˜áŸ’មវិធី"</string>
+ <string name="permdesc_changeComponentState" product="tablet" msgid="8887435740982237294">"ឲ្យ​កម្មវិធី​ប្ដូរ​ážáž¶â€‹ážáž¾â€‹ážŸáž˜áž¶ážŸáž’áž¶ážáž»â€‹áž€áž˜áŸ’មវិធី​ផ្សáŸáž„​ážáŸ’រូវ​បាន​បើក​​ ឬ​កáŸâ€‹áž¢ážáŸ‹áŸ” កម្មវិធី​ព្យាបាទ​អាច​ប្រើ​វា ដើម្បី​បិទ​សមážáŸ’ážáž—ាព​ទូរសáŸáž–្ទ​សំážáž¶áž“់។ ប្រើ​ដោយ​ប្រុងប្រយáŸážáŸ’ន​ជា​មួយ​​សិទ្ធិ​នáŸáŸ‡ ព្រោះ​ážáž¶â€‹ážœáž¶â€‹áž¢áž¶áž…​ធ្វើ​ឲ្យ​សមាសធាážáž»â€‹áž˜áž·áž“​អាច​ប្រើ​បាន​ ស្ážáž·ážážŸáŸ’ážáŸážš ឬ​​មិន​ស្ážáž·ážážŸáŸ’ážáŸážšáŸ”"</string>
+ <string name="permdesc_changeComponentState" product="default" msgid="1827232484416505615">"ឲ្យ​កម្មវិធី​ប្ដូរ​ážáž¶ážáž¾â€‹ážŸáž˜áž¶ážŸáž’áž¶ážáž»â€‹áž€áž˜áŸ’មវិធី​ផ្សáŸáž„​ážáŸ’រូវ​បាន​បើក​​ ឬ​កáŸâ€‹áž¢ážáŸ‹áŸ” កម្មវិធី​ព្យាបាទ​អាច​ប្រើ​វា ដើម្បី​បិទ​សមážáŸ’ážáž—ាព​ទូរសáŸáž–្ទ​សំážáž¶áž“់។ ប្រើ​ដោយ​ប្រុងប្រយáŸážáŸ’ន​ជា​មួយ​​សិទ្ធិ​នáŸáŸ‡ ព្រោះ​ážáž¶â€‹ážœáž¶â€‹áž¢áž¶áž…​ធ្វើ​ឲ្យ​សមាសធាážáž»â€‹áž˜áž·áž“​អាច​ប្រើ​បាន​ ស្ážáž·ážážŸáŸ’ážáŸážš ឬ​​មិន​ស្ážáž·ážážŸáŸ’ážáŸážšáŸ”"</string>
+ <string name="permlab_grantRevokePermissions" msgid="4627315351093508795">"ផ្ដល់ ឬ​ដក​សិទ្ធិ"</string>
+ <string name="permdesc_grantRevokePermissions" msgid="4088642654085850662">"ឲ្យ​កម្មវិធី​ផ្ដល់ ឬ​ដក​សិទ្ធិ​ជាក់លាក់​សម្រាប់​វា ឬ​កម្មវិធី​ផ្សáŸáž„។ កម្មវិធី​ព្យាបាទ​អាច​ប្រើ​វា​ដើម្បី​ចូល​លក្ážážŽáŸˆâ€‹ážŠáŸ‚ល​អ្នក​មិន​បាន​ផ្ដល់​ឲ្យ​ពួកវា។"</string>
+ <string name="permlab_setPreferredApplications" msgid="8463181628695396391">"កំណážáŸ‹â€‹áž€áž˜áŸ’មវិធី​ពáŸáž‰â€‹áž…áž·ážáŸ’áž"</string>
+ <string name="permdesc_setPreferredApplications" msgid="4973986762241783712">"ឲ្យ​កម្មវិធី​កែ​កម្មវិធី​ដែល​អ្នក​ពáŸáž‰â€‹áž…áž·ážáŸ’ážáŸ” កម្មវិធី​ព្យាបាទ​អាច​ប្ដូរ​កម្មវិធី​ដែល​ដំណើរការ​ស្ងាážáŸ‹â€‹áŸ— ដោយ​​​បញ្ឆោážâ€‹áž€áž˜áŸ’មវិធី​ដែល​មាន​ស្រាប់​​របស់​អ្នក​ ដើម្បី​ប្រមូល​ទិន្ននáŸáž™â€‹áž¯áž€áž‡áž“​​ពី​អ្នក។"</string>
+ <string name="permlab_writeSettings" msgid="2226195290955224730">"កែ​​ការ​កំណážáŸ‹â€‹áž”្រពáŸáž“្ធ"</string>
+ <string name="permdesc_writeSettings" msgid="7775723441558907181">"ឲ្យ​កម្មវិធី​កែ​ទិន្ននáŸáž™â€‹áž€áŸ†ážŽážáŸ‹â€‹áž”្រពáŸáž“្ធ។ កម្មវិធី​ព្យាបាទ​អាច​បង្ážáž¼áž…​ការ​កំណážáŸ‹â€‹ážšáž…នាសមáŸáŸ’ពន្ធ​នៃ​ប្រពáŸáž“្ធ​របស់​អ្នក។"</string>
+ <string name="permlab_writeSecureSettings" msgid="204676251876718288">"កែ​ការ​កំណážáŸ‹â€‹áž”្រពáŸáž“្ធ​សុវážáŸ’ážáž·áž—áž¶áž–"</string>
+ <string name="permdesc_writeSecureSettings" msgid="8159535613020137391">"ឲ្យ​កម្មវិធី​កែ​ទិន្ននáŸáž™â€‹áž€áŸ†ážŽážáŸ‹â€‹â€‹ážŸáž»ážœážáŸ’ážáž·áž—ាព​​របស់​ប្រពáŸáž“្ធ។ មិន​សម្រាប់​ប្រើ​ដោយ​កម្មវិធី​ធម្មážáž¶â€‹áž‘áŸáŸ”"</string>
+ <string name="permlab_writeGservices" msgid="2149426664226152185">"កែ​ផែនទី​សáŸážœáž¶áž€áž˜áŸ’ម​ Google"</string>
+ <string name="permdesc_writeGservices" msgid="1287309437638380229">"ឲ្យ​កម្មវិធី​កែ​ផែនទី​សáŸážœáž¶áž€áž˜áŸ’ម​ Google ។ មិន​សម្រាប់​ប្រើ​ដោយ​កម្មវិធី​ធម្មážáž¶â€‹áž‘áŸáŸ”"</string>
+ <string name="permlab_receiveBootCompleted" msgid="5312965565987800025">"ដំណើរការ​ពáŸáž›â€‹áž…ាប់ផ្ដើម"</string>
+ <string name="permdesc_receiveBootCompleted" product="tablet" msgid="7390304664116880704">"ឲ្យ​កម្មវិធី​ចាប់ផ្ដើម​ដោយ​ážáŸ’លួន​វា​ផ្ទាល់​ដរាប​​ណា​ប្រពáŸáž“្ធ​​បាន​ចាប់ផ្ដើម​​រួចរាល់។ វា​អាច​​ចំណាយ​ពáŸáž›â€‹áž™áž¼ážšâ€‹ážŠáž¾áž˜áŸ’បី​ចាប់ផ្ដើម​កុំព្យូទáŸážšâ€‹áž”ន្ទះ និង​ឲ្យ​កម្មវិធី​ធ្វើ​ឲ្យ​កុំព្យូទáŸážšâ€‹áž”ន្ទះ​យឺážâ€‹ážŠáŸ„យ​ដំណើរការ​ជា​និច្ច។"</string>
+ <string name="permdesc_receiveBootCompleted" product="default" msgid="513950589102617504">"ឲ្យ​​កម្មវិធី​​ចាប់ផ្ដើម​ដោយ​ážáŸ’លួន​វា​​ភ្លាម​ៗ​ពáŸáž›â€‹áž”្រពáŸáž“្ធ​​ចាប់ផ្ដើម​ចប់។ ​វា​អាច​ធ្វើ​ឲ្យ​ចំណាយ​ពáŸáž›â€‹áž™áž¼ážšâ€‹ážŠáž¾áž˜áŸ’បី​ចាប់ផ្ដើម​ទូរសáŸáž–្ទ ​និង​ឲ្យ​កម្មវិធី​ធ្វើ​ឲ្យ​ទូរសáŸáž–្ទ​យឺážâ€‹ážŠáŸ„យ​ដំណើរការ​ជា​និច្ច។"</string>
+ <string name="permlab_broadcastSticky" msgid="7919126372606881614">"ផ្ញើ​ការ​ប្រកាស​ទាក់ទាញ"</string>
+ <string name="permdesc_broadcastSticky" product="tablet" msgid="7749760494399915651">"ឲ្យ​កម្មវិធី​ផ្ញើ​ការប្រកាស​​ដែល​ទាក់ទាញ ដែល​មាន​បន្ទាប់​ពី​ការ​ប្រកាស​ចប់។ ការ​ប្រើ​លើស​​អាច​ធ្វើឲ្យ​ទូរសáŸáž–្ទ​យឺហឬ​មិន​ស្ážáž·ážážŸáŸ’ážáŸážšâ€‹ážŠáŸ„យធ្វើ​ឲ្យ​វា​ប្រើ​អង្គ​ចងចាំ​ធំ​ពáŸáž€áŸ”"</string>
+ <string name="permdesc_broadcastSticky" product="default" msgid="2825803764232445091">"ឲ្យ​កម្មវិធី​ផ្ញើ​ការប្រកាស​​ដែល​ទាក់ទាញ ដែល​មាន​បន្ទាប់​ពី​ការ​ប្រកាស​ចប់។ ការ​ប្រើ​លើស​​អាច​ធ្វើឲ្យ​ទូរសáŸáž–្ទ​យឺហឬ​មិន​ស្ážáž·ážážŸáŸ’ážáŸážšâ€‹ážŠáŸ„យធ្វើ​ឲ្យ​វា​ប្រើ​អង្គ​ចងចាំ​ធំ​ពáŸáž€áŸ”"</string>
+ <string name="permlab_readContacts" msgid="8348481131899886131">"អាន​ទំនាក់ទំនង​របស់​អ្នក"</string>
+ <string name="permdesc_readContacts" product="tablet" msgid="5294866856941149639">"ឲ្យ​កម្មវិធី​អាន​ទិន្ននáŸáž™â€‹áž¢áŸ†áž–ី​ទំនាក់ទំនង​របស់​អ្នក​ដែល​មាន​ក្នុង​កុំព្យូទáŸážšâ€‹áž”ន្ទះ​របស់​អ្នក រួមមាន​ប្រáŸáž€áž„់​ដែល​អ្នក​បាន​ហៅ​ អ៊ីមែល ឬ​ទាក់ទង​ážáž¶áž˜â€‹ážœáž·áž’ី​ផ្សáŸáž„ៗ​ជា​មួយ​មនុស្ស​ណា​ម្នាក់។ សិទ្ធិ​នáŸáŸ‡â€‹áž¢áž“ុញ្ញាážâ€‹áž²áŸ’យ​កម្មវិធី​រក្សាទុក​ទិន្ននáŸáž™â€‹áž‘ំនាក់ទំនង​របស់​អ្នក ហើយ​កម្មវិធី​ព្យាបាទ​អាច​ចែករំលែក​ទិន្ននáŸáž™â€‹áž‘ំនាក់ទំនង​ដោយ​មិន​ឲ្យ​អ្នក​ដឹង។"</string>
+ <string name="permdesc_readContacts" product="default" msgid="8440654152457300662">"ឲ្យ​​កម្មវិធី​អាន​ទិន្ននáŸáž™â€‹áž¢áŸ†áž–ី​ទំនាក់ទំនង​របស់​អ្នក​ដែល​បាន​រក្សាទុក​ក្នុង​ទូរសáŸáž–្ទ រួមមាន​ប្រáŸáž€áž„់​ដែល​អ្នក​បាន​ហៅ អ៊ីមែល ឬ​ទាក់ទង​ážáž¶áž˜â€‹ážœáž·áž’ី​ផ្សáŸáž„ៗ​ជា​មួយ​​អ្នក​ណា​ម្នាក់។ សិទ្ធិ​នáŸáŸ‡â€‹áž²áŸ’យ​កម្មវិធី​រក្សាទុក​ទិន្ននáŸáž™â€‹áž‘ំនាក់ទំនង​របស់​អ្នក ហើយ​កម្មវិធី​ព្យាបាទ​អាច​ចែករំលែក​ទិន្ននáŸáž™â€‹áž‘ំនាក់ទំនង​​ដោយ​មិន​ឲ្យ​អ្នកដឹង។"</string>
+ <string name="permlab_writeContacts" msgid="5107492086416793544">"កែ​ទំនាក់ទំនង​របស់​អ្នក"</string>
+ <string name="permdesc_writeContacts" product="tablet" msgid="897243932521953602">"ឲ្យ​កម្មវិធី​កែ​ទិន្ននáŸáž™â€‹áž¢áŸ†áž–ី​ទំនាក់ទំនង​របស់​អ្នក​ដែល​បាន​រក្សាទុក​ក្នុង​កុំព្យូទáŸážšâ€‹áž”ន្ទះ រួមមាន​ប្រáŸáž€áž„់​​ដែល​អ្នក​បាន​ហៅ អ៊ីមែល ឬ​ទាក់ទង​ážáž¶áž˜â€‹ážœáž·áž’ី​ផ្សáŸáž„ៗ​ជា​មួយ​ទំនាក់ទំនង​ជាក់លាក់។ សិទ្ធិ​​នáŸáŸ‡â€‹áž¢áž“ុញ្ញាážâ€‹áž²áŸ’យ​​​កម្មវិធី​លុប​ទិន្ននáŸáž™â€‹áž‘ំនាក់ទំនង​របស់​អ្នក។"</string>
+ <string name="permdesc_writeContacts" product="default" msgid="589869224625163558">"ឲ្យ​កម្មវិធី​កែ​ទិន្ននáŸáž™â€‹áž¢áŸ†áž–ី​ទំនាក់ទំនង​របស់​អ្នក​ដែល​បាន​រក្សាទុក​ក្នុង​ទូរសáŸáž–្ទ​របស់​អ្នក រួមមាន​ប្រáŸáž€áž„់​ដែល​អ្នក​បាន​ហៅ អ៊ីមែល ឬ​បាន​ទាក់ទង​​ážáž¶áž˜â€‹ážœáž·áž’ី​ផ្សáŸáž„ៗ​ជា​មួយ​ទំនាក់​ទំនាក់​ជាក់លាក់។ សិទ្ធិ​នáŸáŸ‡â€‹áž²áŸ’យ​កម្មវិធី​លុប​ទិន្ននáŸáž™â€‹áž‘ំនាក់ទំនង។"</string>
+ <string name="permlab_readCallLog" msgid="3478133184624102739">"អាន​​កំណážáŸ‹â€‹áž áŸážáž»â€‹â€‹â€‹áž áŸ…"</string>
+ <string name="permdesc_readCallLog" product="tablet" msgid="3700645184870760285">"ឲ្យ​កម្មវិធី​អាន​បញ្ជី​ហៅ​កុំព្យូទáŸážšâ€‹áž”ន្ទះ​របស់​អ្នក រួមមាន​ទិន្ននáŸáž™â€‹áž¢áŸ†áž–ី​ការ​ហៅ​ចូល និង​ចáŸáž‰áŸ” សិទ្ធិ​នáŸáŸ‡â€‹áž¢áž“ុញ្ញាážâ€‹áž²áŸ’យ​កម្មវិធី​រក្សាទុក​ទិន្ននáŸáž™â€‹áž”ញ្ជី​ហៅ​របស់​អ្នក ហើយ​កម្មវិធី​ព្យាបាទ​អាច​ចែករំលែក​ទិន្ននáŸáž™â€‹áž”ញ្ជី​ហៅ​ដោយ​មិន​ឲ្យ​អ្នក​ដឹង។"</string>
+ <string name="permdesc_readCallLog" product="default" msgid="5777725796813217244">"ឲ្យ​កម្មវិធី​អាន​​​បញ្ជី​ហៅ​ទូរសáŸáž–្ទ​របស់​អ្នក រួមមាន​ទិន្ននáŸáž™â€‹áž¢áŸ†áž–ី​ការ​ហៅ​ចូល និង​ចáŸáž‰áŸ” សិទ្ធិ​នáŸáŸ‡â€‹áž¢áž“ុញ្ញាážâ€‹áž²áŸ’យ​កម្មវិធី​រក្សាទុក​ទិន្ននáŸáž™â€‹áž”ញ្ជី​ហៅ​របស់​អ្នក ហើយ​កម្មវិធី​ព្យាបាទ​អាច​ចែករំលែក​ទិន្ននáŸáž™â€‹áž”ញ្ជី​ហៅ​ដោយ​មិន​ឲ្យ​អ្នកដឹង។"</string>
+ <string name="permlab_writeCallLog" msgid="8552045664743499354">"សរសáŸážšâ€‹áž”ញ្ជី​ហៅ"</string>
+ <string name="permdesc_writeCallLog" product="tablet" msgid="6661806062274119245">"ឲ្យ​កម្មវិធី​កែ​បញ្ជី​ហៅ​កុំព្យូទáŸážšâ€‹áž”ន្ទះ​របស់​អ្នក​រួមមាន​ទិន្ននáŸáž™â€‹áž¢áŸ†áž–ី​ការ​ហៅ​ចូល និង​ចáŸáž‰áŸ”​កម្មវិធី​ព្យាបាទ​អាច​ប្រើ​វា ដើម្បី​លុប ឬ​កែ​បញ្ជី​ហៅ​របស់​អ្នក។"</string>
+ <string name="permdesc_writeCallLog" product="default" msgid="683941736352787842">"ឲ្យ​កម្មវិធី​កែ​បញ្ជី​ហៅ​នៃ​ទូរសáŸáž–្ទ​របស់​អ្នក រួមមាន​ទិន្ននáŸáž™â€‹áž¢áŸ†áž–ី​ការ​ហៅ​ចូល និង​ចáŸáž‰áŸ” កម្មវិធី​ព្យាបាទ​អាច​ប្រើ​វា ដើម្បី​លុប ឬ​កែ​បញ្ជី​ការ​ហៅ​របស់​អ្នក។"</string>
+ <string name="permlab_readProfile" msgid="4701889852612716678">"អាន​កាážâ€‹áž‘ំនាក់ទំនង​ផ្ទាល់ážáŸ’លួន​​របស់​អ្នក"</string>
+ <string name="permdesc_readProfile" product="default" msgid="5462475151849888848">"ឲ្យ​កម្មវិធី​អាន​ពáŸážáŸŒáž˜áž¶áž“​ប្រវážáŸ’ážáž·ážšáž¼áž”​ផ្ទាល់ážáŸ’លួន​ដែល​មាន​លើ​ឧបករណáŸâ€‹ážšáž”ស់​អ្នក ដូច​ជា ឈ្មោះ និង​ពáŸážáŸŒáž˜áž¶áž“​ទំនាក់ទំនង។ វា​មាន​នáŸáž™â€‹ážáž¶ កម្មវិធី​អាច​កំណážáŸ‹â€‹áž¢áŸ’នក និង​អាច​ផ្ញើ​ពáŸážáŸŒáž˜áž¶áž“​ប្រវážáŸ’ážáž·ážšáž¼áž”​របស់​អ្នក​ទៅ​អ្នក​ផ្សáŸáž„។"</string>
+ <string name="permlab_writeProfile" msgid="907793628777397643">"កែ​កាážâ€‹áž‘ំនាក់ទំនង​ផ្ទាល់​ážáŸ’លួន​របស់​អ្នក"</string>
+ <string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"ឲ្យ​កម្មវិធី​ប្ដូរ ឬ​បន្ážáŸ‚ម​ពáŸážáŸŒáž˜áž¶áž“​ប្រវážáŸ’ážáž·ážšáž¼áž”​ផ្ទាល់​ážáŸ’លួន​ដែល​បាន​រក្សាទុក​ក្នុង​ឧបករណáŸâ€‹ážšáž”ស់​អ្នក ដូចជា ឈ្មោះ និង​ពáŸážáŸŒáž˜áž¶áž“​ទំនាក់ទំនង​របស់​អ្នក។ áž“áŸáŸ‡â€‹áž˜áž¶áž“​នáŸáž™â€‹ážáž¶â€‹áž€áž˜áŸ’មវិធី​អាច​កំណážáŸ‹â€‹áž¢áŸ’នក និង​ផ្ញើ​ពáŸážáŸŒáž˜áž¶áž“​ប្រវážáŸ’ážáž·ážšáž¼áž”​របស់​អ្នក​ទៅ​អ្នក​ផ្សáŸáž„។"</string>
+ <string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"អាន​ចរន្ážâ€‹â€‹ážŸáž„្គម​របស់​អ្នក"</string>
+ <string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"ឲ្យ​កម្មវិធី​ចូល​ដំណើរការ និង​ធ្វើ​សម​កាល​កម្ម​បច្ចុប្បន្នភាព​សង្គម​ពី​អ្នក​ និង​មិážáŸ’ážáž—áŸáž€áŸ’ដិ។ ប្រយáŸážáŸ’ន​ពáŸáž›â€‹áž…ែករំលែក​ពáŸážáŸŒáž˜áž¶áž“ វា​អនុញ្ញាážâ€‹áž²áŸ’យ​កម្មវិធី​អាន​ការ​ទាក់ទង​រវាង​អ្នក​ និង​មិážáŸ’ážáž—áŸáž€áŸ’ដិ​លើ​បណ្ដាញ​សង្គម ទាក់ទង​នឹង​ពáŸážáŸŒáž˜áž¶áž“​សម្ងាážáŸ‹áŸ” ចំណាំ៖​ សិទ្ធិ​នáŸáŸ‡â€‹áž˜áž·áž“​អាច​ážáŸ’រូវ​បាន​​អនុវážáŸ’ážâ€‹áž›áž¾â€‹áž”ណ្ដាញ​សង្គម​ទាំង​អស់​បាន​ទáŸáŸ”"</string>
+ <string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"សរសáŸážšâ€‹áž‘ៅ​ចរន្ážâ€‹ážŸáž„្គម​របស់​អ្នក"</string>
+ <string name="permdesc_writeSocialStream" product="default" msgid="3086557552204114849">"ឲ្យ​កម្មវិធី​បង្ហាញ​បច្ចុប្បន្នភាព​សង្គម​ពី​មិážáŸ’ážáž—áŸáž€áŸ’ដិ​របស់​អ្នក។ ប្រយáŸážáŸ’ន​ពáŸáž›â€‹áž…ែករំលែក​ពáŸážáŸŒáž˜áž¶áž“ វា​ឲ្យ​កម្មវិធី​បង្កើážâ€‹â€‹â€‹ážŸáž¶ážšâ€‹â€‹ážŠáŸ‚ល​អាច​បង្ហាញ​ážáž¶â€‹áž˜áž€â€‹áž–ី​មិážáŸ’ážáž—áŸáž€áŸ’ដិ។ ចំណាំ៖ សិទ្ធិ​នáŸáŸ‡â€‹áž˜áž·áž“​អាច​ប្រើ​លើ​បណ្ដាញ​សង្គម​បាន​ទáŸáŸ”"</string>
+ <string name="permlab_readCalendar" msgid="5972727560257612398">"អាន​ព្រឹážáŸ’ážáž·áž€áž¶ážšážŽáŸâ€‹áž”្រážáž·áž‘ិន​​និង​ពáŸážáŸŒáž˜áž¶áž“​សម្ងាážáŸ‹"</string>
+ <string name="permdesc_readCalendar" product="tablet" msgid="4216462049057658723">"ឲ្យ​កម្មវិធី​អាច​​ព្រឹážáŸ’ážáž·áž€áž¶ážšážŽáŸâ€‹áž”្រážáž·áž‘ិន​ទាំងអស់​ដែល​បាន​រក្សាទុក​ក្នុង​ទូរសáŸáž–្ទ​របស់​អ្នក រួមមាន​មិážáŸ’ážáž—áŸáž€áŸ’ដិ និង​មិážáŸ’ážâ€‹ážšáž½áž˜â€‹áž€áž¶ážšáž„ារ។ វា​អាច​ឲ្យ​កម្មវិធី​ចែករំលែក​ ឬ​រក្សាទុក​ទិន្ននáŸáž™â€‹áž”្រážáž·áž‘ិន​របស់​អ្នក​​ដោយ​មិន​គិážâ€‹áž–ី​ការ​សម្ងាážáŸ‹ ឬ​ការ​យល់​ដឹង។"</string>
+ <string name="permdesc_readCalendar" product="default" msgid="7434548682470851583">"ឲ្យ​កម្មវិធី​អាន​ព្រឹážáŸ’ážáž·áž€áž¶ážšážŽáŸâ€‹áž”្រážáž·áž‘ិន​ទាំងអស់​ដែល​មាន​ក្នុង​កុំព្យូទáŸážšâ€‹áž”ន្ទះ​របស់​អ្នក រួមមាន​មិážáŸ’ážáž—áŸáž€áŸ’ដិ ឬ​មិážáŸ’ážâ€‹ážšáž½áž˜â€‹áž€áž¶ážšáž„ារ។ វា​អាច​អនុញ្ញាážâ€‹áž²áŸ’យ​យ​កម្ម​វិធី​ចែករំលែក ឬ​រក្សាទុក​ទិន្ននáŸáž™â€‹áž”្រážáž·áž‘ិន​របស់​អ្នក​ដែល​ទាក់ទង​នឹង​ពáŸážáŸŒáž˜áž¶áž“​សម្ងាážáŸ‹ ឬ​​ការ​ប្រែប្រួល។"</string>
+ <string name="permlab_writeCalendar" msgid="8438874755193825647">"បន្ážáŸ‚ម ឬ​កែ​ព្រឹážáŸ’ážáž·áž€áž¶ážšážŽáŸâ€‹áž”្រážáž·áž‘ិន​ និង​ផ្ញើ​អ៊ីមែល​ទៅ​ភ្ញៀវ​ដោយ​មិន​ឲ្យ​ម្ចាស់​ដឹង"</string>
+ <string name="permdesc_writeCalendar" product="tablet" msgid="6679035520113668528">"ឲ្យ​កម្មវិធី​បន្ážáŸ‚ម លុប ឬ​ប្ដូរ​ព្រឹážáŸ’ážáž·áž€áž¶ážšážŽáŸâ€‹ážŠáŸ‚ល​អ្នក​អាច​កែ​លើ​កុំព្យូទáŸážšâ€‹áž”ន្ទះ​របស់​អ្នក រួមមាន​មិážáŸ’ážáž—áŸáž€áŸ’ដិ ឬ​មិážáŸ’ážâ€‹ážšáž½áž˜â€‹áž€áž¶ážšáž„ារ។ វា​អាច​ឲ្យ​កម្មវិធី​ផ្ញើ​សារ​ដែល​បង្ហាញ​ážáž¶â€‹áž˜áž€â€‹áž–ី​ម្ចាស់​ប្រážáž·áž‘ិន​ ឬ​កែ​ព្រឹážáŸ’ážáž·áž€áž¶ážšážŽáŸâ€‹ážŠáŸ„យ​មិន​ឲ្យ​ម្ចាស់​ដឹង។"</string>
+ <string name="permdesc_writeCalendar" product="default" msgid="2324469496327249376">"ឲ្យ​កម្មវិធី​បន្ážáŸ‚ម លុប ឬ​ប្ដូរ​ព្រឹážáŸ’ážáž·áž€áž¶ážšážŽáŸâ€‹ážŠáŸ‚ល​អ្នក​អាច​កែប្រែ​លើ​ទូរសáŸáž–្ទ​របស់​អ្នក រួមមាន​មិážáŸ’ážáž—áŸáž€áŸ’ដិ ឬ​មិážáŸ’ážâ€‹ážšáž½áž˜â€‹áž€áž¶ážšáž„ារ។ វា​​អាច​ឲ្យ​កម្មវិធី​ផ្ញើ​សារ​ដែល​បង្ហាញ​ážáž¶â€‹áž˜áž€â€‹áž–ី​ម្ចាស់​ប្រážáž·áž‘áž·áž“ ឬ​កែ​ព្រឹážáŸ’ážáž·áž€áž¶ážšážŽáŸâ€‹ážŠáŸ„យ​មិន​ឲ្យ​​អ្នក​ដឹង។"</string>
+ <string name="permlab_accessMockLocation" msgid="8688334974036823330">"ក្លែង​ប្រភព​ទីážáž¶áŸ†áž„​សម្រាប់​សាកល្បង"</string>
+ <string name="permdesc_accessMockLocation" msgid="5808711039482051824">"បង្កើážâ€‹áž”្រភព​ទីážáž¶áŸ†áž„​ក្លែង​ក្លាយ​សម្រាប់​សាកល្បង ឬ​ដំឡើង​ក្រុមហ៊ុន​ផ្ដល់​ទីážáž¶áŸ†áž„​ážáŸ’មី។ វា​អនុញ្ញាážâ€‹áž²áŸ’យ​កម្មវិធី​បដិសáŸáž’​ទីážáž¶áŸ†áž„​​ និង/ឬ​ស្ážáž¶áž“ភាព​បាន​ážáŸ’រឡប់​ដោយ​ប្រភព​ទីážáž¶áŸ†áž„​ផ្សáŸáž„​ដូច​ជា GPS ឬ​ក្រុមហ៊ុន​ផ្ដល់​ទីážáž¶áŸ†áž„។"</string>
+ <string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"ចូល​ដំណើរការ​ពាក្យ​បញ្ជា​ក្រុមហ៊ុន​ផ្ដល់​ទីážáž¶áŸ†áž„"</string>
+ <string name="permdesc_accessLocationExtraCommands" msgid="5945166642335800763">"ឲ្យ​កម្មវិធី​ចូល​ពាក្យ​បញ្ជា​ក្រុមហ៊ុន​ផ្ដល់​ទីážáž¶áŸ†áž„​បន្ážáŸ‚ម។ កម្មវិធី​ព្យាបាទ​អាច​ប្រើ​វា​ដើម្បី​ជ្រៀážáž‡áŸ’រែក​ជា​មួយ​ប្រážáž·áž”ážáŸ’ážáž·áž€áž¶ážšâ€‹ GPS ឬ​ប្រភព​ទីážáž¶áŸ†áž„​ផ្សáŸáž„​ទៀážáŸ”"</string>
+ <string name="permlab_installLocationProvider" msgid="6578101199825193873">"សិទ្ធិ ដើម្បី​ដំឡើង​ក្រុមហ៊ុន​ផ្ដល់​ទីážáž¶áŸ†áž„"</string>
+ <string name="permdesc_installLocationProvider" msgid="9066146120470591509">"បង្កើážâ€‹áž”្រភព​ទីážáž¶áŸ†áž„​ក្លែងក្លាយ​សម្រាប់​សាកល្បង ឬ​ដំឡើង​ក្រុមហ៊ុន​ផ្ដល់​ទីážáž¶áŸ†áž„​ážáŸ’មី។ វា​អនុញ្ញាážâ€‹áž²áŸ’យ​កម្មវិធី​បដិសáŸáž’​ទីážáž¶áŸ†áž„​ និង/ឬ​ស្ážáž¶áž“ភាព​បាន​ážáŸ’រឡប់​ដោយ​ប្រភព​ទីážáž¶áŸ†áž„​ផ្សáŸáž„ៗ​ដូចជា GPS ឬ​ក្រុមហ៊ុន​ផ្ដល់​ទីážáž¶áŸ†áž„។"</string>
+ <string name="permlab_accessFineLocation" msgid="1191898061965273372">"ទីážáž¶áŸ†áž„​ពិážáž”្រាកដ (GPS និង​មាន​មូលដ្ឋាន​លើ​បណ្ដាញ)"</string>
+ <string name="permdesc_accessFineLocation" msgid="5295047563564981250">"ឲ្យ​កម្មវិធី​ទទួល​ទីážáž¶áŸ†áž„​ពិážáž”្រាកដ​របស់​អ្នក ដោយ​ប្រើ​ប្រពáŸáž“្ធ​កំណážáŸ‹â€‹áž‘ីážáž¶áŸ†áž„​សកម្ម (GPS) ឬ​ប្រភព​ទីážáž¶áŸ†áž„​បណ្ដាញ​ដូច​ជា អង់ážáŸ‚ន​ចលáŸáž និង​វ៉ាយហ្វាយ។ សáŸážœáž¶áž€áž˜áŸ’ម​ទីážáž¶áŸ†áž„​ទាំង​នáŸáŸ‡â€‹ážáŸ’រូវážáŸ‚​បើក និង​អាច​ប្រើ​ចំពោះ​ឧបករណáŸâ€‹ážšáž”ស់​អ្នក​សម្រាប់​កម្មវិធី​ដែល​ប្រើ​ពួក​វា។ កម្មវិធី​អាច​ប្រើ​វា ដើម្បី​កំណážáŸ‹â€‹â€‹áž‘ីកន្លែង​របស់​អ្នក និង​អាច​ប្រើ​ážáž¶áž˜áž–ល​ážáŸ’ម​បន្ážáŸ‚ម។"</string>
+ <string name="permlab_accessCoarseLocation" msgid="4887895362354239628">"ទីážáž¶áŸ†áž„​ប្រហាក់ប្រហែល (​​មាន​មូលដ្ឋាន​លើ​បណ្ដាញ)"</string>
+ <string name="permdesc_accessCoarseLocation" msgid="2538200184373302295">"ឲ្យ​កម្មវិធី​ទទួល​ទីážáž¶áŸ†áž„​ប្រហាក់ប្រហែល។ ទីážáž¶áŸ†áž„​នáŸáŸ‡â€‹ážáŸ’រូវ​បាន​ទទួល​ážáž¶áž˜â€‹ážŸáŸážœáž¶áž€áž˜áŸ’ម​ទីážáž¶áŸ†áž„​ដោយ​ប្រើ​ប្រភព​ទីážáž¶áŸ†áž„​បណ្ដាញ​ដូច​ជា អង់ážáŸ‚áž“ និង​វ៉ាយហ្វាយ។ សáŸážœáž¶áž€áž˜áŸ’ម​ទីážáž¶áŸ†áž„​ទាំង​នáŸáŸ‡â€‹ážáŸ’រូវ​ážáŸ‚​បើក និង​អាច​ប្រើ​បាន​ចំពោះ​ឧបករណáŸâ€‹ážšáž”ស់​អ្នក​សម្រាប់​កម្មវិធី​ដែល​ប្រើ​ពួកវា។ កម្មវិធី​អាច​ប្រើ​វា ដើម្បី​កំណážáŸ‹áž€áž“្លែង​ដែល​អ្នក​នៅ​ប្រហាក់ប្រហែល។"</string>
+ <string name="permlab_accessSurfaceFlinger" msgid="2363969641792388947">"ចូល​ដំណើរការ​ SurfaceFlinger"</string>
+ <string name="permdesc_accessSurfaceFlinger" msgid="1041619516733293551">"ឲ្យ​កម្មវិធី​ប្រើ​លក្ážážŽáŸˆâ€‹áž€áž˜áŸ’ážšáž·ážâ€‹áž‘ាប​របស់ SurfaceFlinger ។"</string>
+ <string name="permlab_readFrameBuffer" msgid="6690504248178498136">"អាន​អង្គ​ចងចាំ​បណ្ដោះ​អាសន្ន"</string>
+ <string name="permdesc_readFrameBuffer" msgid="4937405521809454680">"ឲ្យ​កម្មវិធី​អាន​មាážáž·áž€áž¶â€‹áž“ៃ​អង្គ​ចងចាំ​បណ្ដោះ​អាសន្ន។"</string>
+ <string name="permlab_accessInputFlinger" msgid="5348635270689553857">"ចូល​ដំណើរការ InputFlinger"</string>
+ <string name="permdesc_accessInputFlinger" msgid="2104864941201226616">"ឲ្យ​កម្មវិធី​ប្រើ​លក្ážážŽáŸˆâ€‹áž€áž˜áŸ’ážšáž·ážâ€‹áž‘áž¶áž” InputFlinger ។"</string>
+ <string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"កំណážáŸ‹â€‹ážšáž…នាសម្ពáŸáž“្ធ​ការ​បង្ហាញ​វ៉ាយហ្វាយ"</string>
+ <string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"ឲ្យ​កម្មវិធី​កំណážáŸ‹â€‹ážšáž…នាសម្ពáŸáž“្ធ​ និង​ភ្ជាប់​ទៅ​ការ​បង្ហាញ​វ៉ាយហ្វាយ។"</string>
+ <string name="permlab_controlWifiDisplay" msgid="393641276723695496">"ពិនិážáŸ’យ​ការ​បង្ហាញ​វ៉ាយហ្វាយ"</string>
+ <string name="permdesc_controlWifiDisplay" msgid="4543912292681826986">"ឲ្យ​កម្មវិធី​ពិនិážáŸ’យ​លក្ážážŽáŸˆâ€‹áž€áž˜áŸ’ážšáž·ážâ€‹áž‘ាប​​នៃ​ការ​បង្ហាញ​វ៉ាយហ្វាយ។"</string>
+ <string name="permlab_captureAudioOutput" msgid="6857134498402346708">"ចាប់​យក​លទ្ធផល​អូឌីយ៉ូ"</string>
+ <string name="permdesc_captureAudioOutput" msgid="6210597754212208853">"​ឱ្យ​កម្មវិធី​ដើម្បី​ចាប់​យក​ និង​​ប្ដូរ​​ទិស​លទ្ធផល​អូឌីយ៉ូ​។"</string>
+ <string name="permlab_captureVideoOutput" msgid="2246828773589094023">"ចាប់​យក​លទ្ធផល​វីដáŸáž¢áž¼"</string>
+ <string name="permdesc_captureVideoOutput" msgid="359481658034149860">"ឲ្យ​កម្មវិធី​ចាប់​យក​ និង​ប្ដូរ​​ទិស​លទ្ធផល​វីដáŸáž¢áž¼â€‹áŸ”"</string>
+ <string name="permlab_captureSecureVideoOutput" msgid="7815398969303382016">"ចាប់​យក​លទ្ធផល​វីដáŸáž¢áž¼â€‹ážŸáž»ážœážáŸ’ážáž·áž—áž¶áž–"</string>
+ <string name="permdesc_captureSecureVideoOutput" msgid="2779793064709350289">"ឲ្យ​​កម្មវិធី​​​ចាប់​យក ​និង​ប្ដូរ​ទិស​លទ្ធផល​វីដáŸáž¢áž¼â€‹ážŠáŸ‚ល​មាន​សុវážáŸ’ážáž·áž—ាព​។"</string>
+ <string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"ប្ដូរ​ការ​កំណážáŸ‹â€‹áž¢áž¼ážŒáž¸áž™áž¼â€‹ážšáž”ស់​អ្នក"</string>
+ <string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"ឲ្យ​កម្មវិធី​កែ​ការ​កំណážáŸ‹â€‹ážŸáŸ†áž¡áŸáž„​សកល ដូច​ជា​កម្រិážâ€‹ážŸáŸ†áž¡áŸáž„ និង​អូប៉ាលáŸážšâ€‹ážŠáŸ‚ល​បាន​ប្រើ​សម្រាប់​លទ្ធផល។"</string>
+ <string name="permlab_recordAudio" msgid="3876049771427466323">"ážážâ€‹ážŸáŸ†áž¡áŸáž„"</string>
+ <string name="permdesc_recordAudio" msgid="4906839301087980680">"​ឱ្យ​កម្មវិធី​ážážâ€‹ážŸáŸ†áž¡áŸáž„​​ជាមួយ​មីក្រូហ្វូន​​​។ សិទ្ធិ​នáŸáŸ‡â€‹áž¢áž“ុញ្ញាážâ€‹áž²áŸ’យ​កម្មវិធី​ážážâ€‹ážŸáŸ†áž¡áŸáž„​​នៅ​ពáŸáž›â€‹ážŽáž¶â€‹áž˜áž½áž™â€‹ážŠáŸ„យ​គ្មាន​ការ​បញ្ជាក់​របស់​អ្នក។"</string>
+ <string name="permlab_camera" msgid="3616391919559751192">"ážážâ€‹ážšáž¼áž” និងវីដáŸáž¢áž¼"</string>
+ <string name="permdesc_camera" msgid="8497216524735535009">"ឲ្យ​កម្មវិធី​ážážâ€‹ážšáž¼áž” និង​វីដáŸáž¢áž¼â€‹ážŠáŸ„យ​ប្រើ​ម៉ាស៊ីន​ážážáŸ” វា​ឲ្យ​កម្មវិធី​​ប្រើ​ម៉ាស៊ីន​ážážâ€‹áž“ៅ​ពáŸáž›â€‹â€‹ážŽáž¶áž˜áž½áž™â€‹ážŠáŸ„យ​គ្មាន​ការ​បញ្ជាក់​របស់​អ្នក។"</string>
+ <string name="permlab_cameraDisableTransmitLed" msgid="2651072630501126222">"បិទ​​ពន្លឺ​បង្ហាញ​ការ​បញ្ជូន​​ពáŸáž›â€‹áž˜áŸ‰áž¶ážŸáŸŠáž¸áž“​ážážâ€‹áž€áŸ†áž–ុង​ប្រើ"</string>
+ <string name="permdesc_cameraDisableTransmitLed" msgid="4764585465480295341">"ឲ្យ​កម្មវិធី​ប្រពáŸáž“្ធ​ដែល​បាន​ដំឡើង​រួច​បិទ​​ LED បង្ហាញ​ការ​ប្រើ​ម៉ាស៊ីន​ážážáŸ”"</string>
+ <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"បិទ​កុំព្យូទáŸážšâ€‹áž”ន្ទះ​ជា​អចិន្ážáŸ’រៃយáŸ"</string>
+ <string name="permlab_brick" product="default" msgid="8337817093326370537">"បិទ​ទូរសáŸáž–្ទ​ជា​អចិន្ážáŸ’រៃយáŸ"</string>
+ <string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"ឲ្យ​កម្មវិធី​បិទ​កុំព្យូទáŸážšâ€‹áž”ន្ទះ​​​ជា​អចិន្ážáŸ’រៃយáŸáŸ” វា​មាន​គ្រោះážáŸ’នាក់​ណាស់។"</string>
+ <string name="permdesc_brick" product="default" msgid="5788903297627283099">"ឲ្យ​កម្មវិធី​បិទ​ទូរសáŸáž–្ទ​ទាំង​មូល​​ជា​អចិន្ážáŸ’រៃយáŸáŸ” វា​មាន​គ្រោះ​ážáŸ’នាក់​ណាស់។"</string>
+ <string name="permlab_reboot" product="tablet" msgid="3436634972561795002">"បង្ážáŸ†â€‹áž²áŸ’យ​ចាប់ផ្ដើម​កុំព្យូទáŸážšâ€‹áž”ន្ទះ​ឡើង​វិញ"</string>
+ <string name="permlab_reboot" product="default" msgid="2898560872462638242">"បង្ážáŸ†â€‹áž²áŸ’យ​ទូរសáŸáž–្ទ​ចាប់ផ្ដើម​ឡើងវិញ"</string>
+ <string name="permdesc_reboot" product="tablet" msgid="8172056180063700741">"ឲ្យ​កម្មវិធី​បង្ážáŸ†â€‹áž²áŸ’យ​​កុំព្យូទáŸážšâ€‹áž”ន្ទះ​ចាប់ផ្ដើម​ឡើងវិញ។"</string>
+ <string name="permdesc_reboot" product="default" msgid="5326008124289989969">"ឲ្យ​កម្មវិធី​បង្ážáŸ†â€‹â€‹áž²áŸ’យ​ទូរសáŸáž–្ទ​ចាប់ផ្ដើម​ឡើងវិញ។"</string>
+ <string name="permlab_mount_unmount_filesystems" product="nosdcard" msgid="2927361537942591841">"ការ​ចូល​ដំណើរការ​ប្រពáŸáž“្ធ​ឯកសារ​ឧបករណáŸâ€‹áž•្ទុក​យូអáŸážŸáž”៊ី"</string>
+ <string name="permlab_mount_unmount_filesystems" product="default" msgid="4402305049890953810">"ការ​ចូល​ដំណើរការ​ប្រពáŸáž“្ធ​ឯកសារ​កាážâ€‹áž¢áŸážŸážŒáž¸"</string>
+ <string name="permdesc_mount_unmount_filesystems" msgid="1829290701658992347">"ឲ្យ​កម្មវិធី​ភ្ជាប់ និង​ផ្ដាច់​ប្រពáŸáž“្ធ​ឯកសារ​សម្រាប់​ឧបករណáŸâ€‹áž•្ទុក​ចលáŸážáŸ”"</string>
+ <string name="permlab_mount_format_filesystems" product="nosdcard" msgid="6227819582624904972">"លុប​ឧបករណáŸâ€‹áž•្ទុក​យូអáŸážŸáž”៊ី"</string>
+ <string name="permlab_mount_format_filesystems" product="default" msgid="262582698639274056">"លុប​កាážâ€‹áž¢áŸážŸážŒáž¸"</string>
+ <string name="permdesc_mount_format_filesystems" msgid="8784268246779198627">"ឲ្យ​កម្មវិធី​ធ្វើ​ទ្រង់ទ្រាយ​ឧបករណáŸâ€‹áž•្ទុក​ចលáŸážáŸ”"</string>
+ <string name="permlab_asec_access" msgid="3411338632002193846">"យក​​ពáŸážáŸŒáž˜áž¶áž“​នៅ​លើ​ឧបករណáŸâ€‹â€‹áž•្ទុក​ážáž¶áž„ក្នុង"</string>
+ <string name="permdesc_asec_access" msgid="3094563844593878548">"ឲ្យ​កម្មវិធី​យក​ពáŸážáŸŒáž˜áž¶áž“​លើ​ការ​​ផ្ទុក​ážáž¶áž„​ក្នុង។"</string>
+ <string name="permlab_asec_create" msgid="6414757234789336327">"បង្កើážâ€‹â€‹áž§áž”ករណáŸâ€‹áž•្ទុក​ážáž¶áž„ក្នុង"</string>
+ <string name="permdesc_asec_create" msgid="4558869273585856876">"ឲ្យ​កម្មវិធី​បង្កើážâ€‹áž§áž”ករណáŸâ€‹áž•្ទុក​ážáž¶áž„​ក្នុង។"</string>
+ <string name="permlab_asec_destroy" msgid="526928328301618022">"បំផ្លាញ​​ឧបករណáŸâ€‹â€‹áž•្ទុក​ážáž¶áž„ក្នុង"</string>
+ <string name="permdesc_asec_destroy" msgid="7218749286145526537">"ឲ្យ​កម្មវិធី​បំផ្លាញ​ឧបករណáŸâ€‹áž•្ទុក​ážáž¶áž„​ក្នុង។"</string>
+ <string name="permlab_asec_mount_unmount" msgid="8877998101944999386">"ភ្ជាប់/ផ្ដាច់​ឧបករណáŸâ€‹áž•្ទុក​ážáž¶áž„​ក្នុង"</string>
+ <string name="permdesc_asec_mount_unmount" msgid="3451360114902490929">"ឲ្យ​កម្មវិធី​ភ្ជាប់/ផ្ដាច់​ឧបករណáŸâ€‹áž•្ទុក​ážáž¶áž„​ក្នុង។"</string>
+ <string name="permlab_asec_rename" msgid="7496633954080472417">"ប្ដូរ​ឈ្មោះ​ឧបករណáŸâ€‹áž•្ទុក​ážáž¶áž„​ក្នុង"</string>
+ <string name="permdesc_asec_rename" msgid="1794757588472127675">"ឲ្យ​កម្មវិធី​ប្ដូរ​ឈ្មោះ​ឧបករណáŸâ€‹áž•្ទុក​ážáž¶áž„​ក្នុង។"</string>
+ <string name="permlab_vibrate" msgid="7696427026057705834">"ពិនិážáŸ’យ​ការ​ញáŸážš"</string>
+ <string name="permdesc_vibrate" msgid="6284989245902300945">"ឲ្យ​កម្មវិធី​គ្រប់គ្រង​កម្មវិធី​ញáŸážšáŸ”"</string>
+ <string name="permlab_flashlight" msgid="2155920810121984215">"ážáŸ’ážšáž½ážáž–ិនិážáŸ’យ​ពិល"</string>
+ <string name="permdesc_flashlight" msgid="6522284794568368310">"ឲ្យ​កម្មវិធី​ពិនិážáŸ’យ​ពិល។"</string>
+ <string name="permlab_manageUsb" msgid="1113453430645402723">"គ្រប់គ្រង​ចំណូល​ចិážáŸ’ហនិង​សិទ្ធិ​សម្រាប់​ឧបករណáŸâ€‹áž™áž¼áž¢áŸážŸáž”៊ី"</string>
+ <string name="permdesc_manageUsb" msgid="7776155430218239833">"ឲ្យ​កម្មវិធី​គ្រប់គ្រង​ចំណូល​ចិážáŸ’ហនិង​សិទ្ធិ​ឧបករណáŸâ€‹áž™áž¼áž¢áŸážŸáž”៊ី។"</string>
+ <string name="permlab_accessMtp" msgid="4953468676795917042">"អនុវážáŸ’ážâ€‹áž–ិធីការ MTP"</string>
+ <string name="permdesc_accessMtp" msgid="6532961200486791570">"ចូល​ដំណើរការ​កម្មវិធី​បញ្ជា kernel MTP ដើម្បី​អនុវážáŸ’ážâ€‹áž–ិធីការ​យូអáŸážŸáž”៊ី MTP ។"</string>
+ <string name="permlab_hardware_test" msgid="4148290860400659146">"សាកល្បង​ផ្នែក​រឹង"</string>
+ <string name="permdesc_hardware_test" msgid="6597964191208016605">"ឲ្យ​កម្មវិធី​ពិនិážáŸ’យ​គ្រឿង​ផ្សáŸáž„ៗ​​សម្រាប់​សាកល្បង​ផ្នែក​រឹង។"</string>
+ <string name="permlab_callPhone" msgid="3925836347681847954">"ហៅ​លáŸážâ€‹áž‘ូរសáŸáž–្ទ​ដោយ​ផ្ទាល់"</string>
+ <string name="permdesc_callPhone" msgid="3740797576113760827">"ឲ្យ​កម្មវិធី​ហៅ​លáŸážâ€‹áž‘ូរសáŸáž–្ទ​ដោយ​គ្មាន​សកម្មភាព​របស់​អ្នក។​ វា​អាច​កាážáŸ‹â€‹áž›áž»áž™â€‹ ឬ​ហៅ​ដោយ​មិន​រំពឹង​ទុក។ ចំណាំ​ážáž¶â€‹ វា​មិន​អនុញ្ញាážâ€‹áž²áŸ’យ​កម្មវិធី​ហៅ​លáŸážâ€‹áž–áŸáž›â€‹áž¢áž¶ážŸáž“្ន​ទáŸáŸ” កម្មវិធី​ព្យាបាទ​អាច​កាážáŸ‹â€‹áž›áž»áž™â€‹ážšáž”ស់​អ្នក​ ដោយ​ធ្វើការ​ហៅ​ដោយ​គ្មាន​ការ​បញ្ជាក់​របស់​អ្នក។"</string>
+ <string name="permlab_callPrivileged" msgid="4198349211108497879">"ហៅ​លáŸážâ€‹áž‘ូរសáŸáž–្ទ​ណាមួយ​ដោយ​ផ្ទាល់"</string>
+ <string name="permdesc_callPrivileged" msgid="1689024901509996810">"ឲ្យ​កម្មវិធី​ហៅ​លáŸážâ€‹áž‘ូរសáŸáž–្ទ រួមមាន​លáŸážâ€‹áž–áŸáž›â€‹áž¢áž¶ážŸáž“្ន​ដោយ​គ្មាន​​អំពើ​របស់​អ្នក។ កម្មវិធី​ព្យាបាទ​អាច​ដាក់​ការ​ហៅ​មិន​ážáŸ’រឹមážáŸ’រូវ និង​ចាំបាច់​ទៅ​សáŸážœáž¶áž€áž˜áŸ’ម​ពáŸáž›â€‹áž¢áž¶ážŸáž“្ន។"</string>
+ <string name="permlab_performCdmaProvisioning" product="tablet" msgid="4842576994144604821">"ចាប់ផ្ដើម​រៀបចំ​កុំព្យូទáŸážšâ€‹áž”ន្ទះ CDMA ដោយ​ផ្ទាល់"</string>
+ <string name="permlab_performCdmaProvisioning" product="default" msgid="5604848095315421425">"ចាប់ផ្ដើម​រៀបចំ​កុំព្យូទáŸážšâ€‹áž”ន្ទះ CDMA ដោយ​ផ្ទាល់"</string>
+ <string name="permdesc_performCdmaProvisioning" msgid="1994193538802314186">"ឲ្យ​កម្មវិធី​ចាប់ផ្ដើម​ការ​ផ្ដល់ CDMA ។ កម្មវិធី​ព្យាបាទ​អាច​មិន​ចាំបាច់​ចាប់ផ្ដើម​ការ​ផ្ដល់ CDMA ។"</string>
+ <string name="permlab_locationUpdates" msgid="7785408253364335740">"ពិនិážáŸ’យ​​ការ​ជូន​ដំណឹង​បច្ចុប្បន្ន​ភាព​ទីážáž¶áŸ†áž„"</string>
+ <string name="permdesc_locationUpdates" msgid="1120741557891438876">"ឲ្យ​កម្មវិធី​បិទ/បើក​ការ​ជូន​ដំណឹង​បច្ចុប្បន្នភាព​ទីážáž¶áŸ†áž„​ពី​វិទ្យុ។ មិន​សម្រាប់​ប្រើ​ដោយ​កម្មវិធី​ធម្មážáž¶â€‹áž‘áŸáŸ”។"</string>
+ <string name="permlab_checkinProperties" msgid="7855259461268734914">"ចូល​ដំណើរការ​លក្ážážŽáŸˆâ€‹ážŸáž˜áŸ’áž”ážáŸ’ážáž·â€‹áž–ិនិážáŸ’យ​មើល"</string>
+ <string name="permdesc_checkinProperties" msgid="4024526968630194128">"ឲ្យ​កម្មវិធី​អាន/សរសáŸážšâ€‹áž›áž€áŸ’ážážŽážŸáž˜áŸ’áž”ážáŸ’ážáž·â€‹áž”ាន​ផ្ទុក​ឡើង​ដោយ​សáŸážœáž¶áž€áž˜áŸ’ម​ពិនិážáŸ’យ​មើល។ មិន​សម្រាប់​ប្រើ​ដោយ​កម្មវិធី​ធម្មážáž¶áŸ”"</string>
+ <string name="permlab_bindGadget" msgid="776905339015863471">"ជ្រើស​​ធាážáž»â€‹áž€áŸ’រាហ្វិក"</string>
+ <string name="permdesc_bindGadget" msgid="8261326938599049290">"ឲ្យ​កម្មវិធី​ប្រាប់​ប្រពáŸáž“្ធ​ážáž¶â€‹áž’áž¶ážáž»â€‹áž€áŸ’រាហ្វិក​ណាមួយ​​អាច​ážáŸ’រូវ​បាន​ប្រើ​ដោយ​​កម្មវិធី​ណា​មួយ។​កម្មវិធី​ដែល​មាន​សិទ្ធិ​នáŸáŸ‡â€‹áž¢áž¶áž…​ឲ្យ​កម្មវិធី​ផ្សáŸáž„​ចូល​ដំណើរការ​ទិន្ននáŸáž™â€‹áž•្ទាល់ážáŸ’លួន។ មិន​សម្រាប់​ប្រើ​ដោយ​កម្មវិធី​ធម្មážáž¶áŸ”"</string>
+ <string name="permlab_modifyPhoneState" msgid="8423923777659292228">"កែ​ស្ážáž¶áž“ភាព​ទូរសáŸáž–្ទ"</string>
+ <string name="permdesc_modifyPhoneState" msgid="1029877529007686732">"ឲ្យ​កម្មវិធី​ពិនិážáŸ’យ​លក្ážážŽáŸˆâ€‹áž‘ូរសáŸáž–្ទ​នៃ​ឧបករណáŸáŸ” កម្មវិធី​ដែល​មាន​សិទ្ធិ​នáŸáŸ‡â€‹áž¢áž¶áž…​ប្ដូរ​បណ្ដាញ បិទ និង​បើកវិទ្យុ​ក្នុង​ទូរសáŸáž–្ទ​ដោយ​មិន​ជូន​ដំណឹង​អ្នក។"</string>
+ <string name="permlab_readPhoneState" msgid="9178228524507610486">"អាន​ស្ážáž¶áž“áž—áž¶áž– និង​អážáŸ’ážážŸáž‰áŸ’ញាណ​ទូរសáŸáž–្ទ"</string>
+ <string name="permdesc_readPhoneState" msgid="1639212771826125528">"ឲ្យ​កម្មវិធី​ចូល​ដំណើរការ​លក្ážážŽáŸˆâ€‹áž‘ូរសáŸáž–្ទ​នៃ​ឧបករណáŸáŸ” សិទ្ធិ​នáŸáŸ‡â€‹â€‹áž²áŸ’យ​កម្មវិធី​កំណážáŸ‹â€‹áž›áŸážâ€‹áž‘ូរសáŸáž–្ទ និង​លáŸážâ€‹ážŸáž˜áŸ’គាល់​ឧបករណ០ážáž¶â€‹ážáž¾â€‹áž€áž¶ážšâ€‹áž áŸ…​សកម្ម និង​លáŸážâ€‹áž–ី​ចម្ងាយ​បាន​ភ្ជាប់​ដោយ​ការ​ហៅ។"</string>
+ <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"ការពារ​​កុំព្យូទáŸážšâ€‹áž”ន្ទះ​មិន​ឲ្យ​ដáŸáž€"</string>
+ <string name="permlab_wakeLock" product="default" msgid="573480187941496130">"ការ​ពារ​ទូរសáŸáž–្ទ​មិន​ឲ្យ​ដáŸáž€"</string>
+ <string name="permdesc_wakeLock" product="tablet" msgid="7311319824400447868">"ឲ្យ​​កម្មវិធី​ការពារ​កុំព្យូទáŸážšâ€‹áž”ន្ទះ​មិន​ឲ្យ​ដáŸáž€áŸ”"</string>
+ <string name="permdesc_wakeLock" product="default" msgid="8559100677372928754">"ឲ្យ​កម្មវិធី​ការពារ​ទូរសáŸáž–្ទ​មិន​ឲ្យ​ដáŸáž€áŸ”"</string>
+ <string name="permlab_devicePower" product="tablet" msgid="2787034722616350417">"បិទ/បើក​កុំព្យូទáŸážšâ€‹áž”ន្ទះ"</string>
+ <string name="permlab_devicePower" product="default" msgid="4928622470980943206">"បិទ/បើក​ទូរសáŸáž–្ទ"</string>
+ <string name="permdesc_devicePower" product="tablet" msgid="6689862878984631831">"ឲ្យ​កម្មវិធី​បិទ/បើក​កុំព្យូទáŸážšâ€‹áž”ន្ទះ។"</string>
+ <string name="permdesc_devicePower" product="default" msgid="6037057348463131032">"ឲ្យ​កម្មវិធី​បិទ/បើក​ទូរសáŸáž–្ទ។"</string>
+ <string name="permlab_factoryTest" msgid="3715225492696416187">"ដំណើរការ​ក្នុង​របៀប​សាកល្បង​ពី​រោងចក្រ"</string>
+ <string name="permdesc_factoryTest" product="tablet" msgid="3952059318359653091">"ដំណើរការ​សាកល្បង​ក្រុមហ៊ុន​ផលិážâ€‹áž€áž˜áŸ’ážšáž·ážâ€‹áž‘áž¶áž” ដោយ​អនុញ្ញាážâ€‹áž²áŸ’យ​ចូល​ផ្នែក​រឹង​កុំព្យូទáŸážšâ€‹áž”ន្ទះ។ អាច​ប្រើ​​បាន​ážáŸ‚​ពáŸáž›â€‹áž€áž»áŸ†áž–្យូទáŸážšâ€‹áž€áŸ†áž–ុង​ដំណើរការ​ក្នុង​របៀប​សាកល្បង​ក្រុមហ៊ុន​ផលិážáŸ”"</string>
+ <string name="permdesc_factoryTest" product="default" msgid="8136644990319244802">"ដំណើរ​ការ​ការ​សាកល្បង​ក្រុមហ៊ុន​ផលិážâ€‹áž€áž˜áŸ’ážšáž·ážâ€‹áž‘áž¶áž” ដោយ​អនុញ្ញាážâ€‹áž€áž¶ážšâ€‹áž…ូល​ដំណើរការ​ផ្នែក​រឹង​ទូរសáŸáž–្ទ។ អាច​ប្រើ​បាន​ážáŸ‚​នៅ​ពáŸáž›â€‹áž‘ូរសáŸáž–្ទ​កំពុង​ដំណើរការ​របៀប​សាកល្បង​ក្រុមហ៊ុន​ផលិážáŸ”"</string>
+ <string name="permlab_setWallpaper" msgid="6627192333373465143">"កំណážáŸ‹â€‹áž•្ទាំង​រូបភាព"</string>
+ <string name="permdesc_setWallpaper" msgid="7373447920977624745">"ឲ្យ​កម្មវិធី​កំណážáŸ‹â€‹áž•្ទាំង​រូបភាព​ប្រពáŸáž“្ធ។"</string>
+ <string name="permlab_setWallpaperHints" msgid="3278608165977736538">"កែážáž˜áŸ’រូវ​ទំហំ​ផ្ទាំង​រូបភាព​របស់​អ្នក"</string>
+ <string name="permdesc_setWallpaperHints" msgid="8235784384223730091">"ឲ្យ​កម្មវិធី​កំណážáŸ‹â€‹áž‡áŸ†áž“ួយ​ទំហំ​ផ្ទាំង​រូបភាព​ប្រពáŸáž“្ធ។"</string>
+ <string name="permlab_masterClear" msgid="2315750423139697397">"កំណážáŸ‹â€‹áž”្រពáŸáž“្ធ​ទៅ​លំនាំដើម​រោងចក្រ​ឡើងវិញ"</string>
+ <string name="permdesc_masterClear" msgid="3665380492633910226">"ឲ្យ​កម្មវិធី​កំណážáŸ‹â€‹áž”្រពáŸáž“្ធ​​ដូច​ការ​កំណážáŸ‹â€‹áž…áŸáž‰â€‹áž–ី​រោងចក្រ​ឡើងវិញ​ពáŸáž‰áž›áŸáž‰ ដោយ​លុប​ទិន្ននáŸáž™ ការ​កំណážáŸ‹â€‹ážšáž…នាសម្ពáŸáž“្ធ និង​កម្មវិធី​បាន​ដំឡើង។"</string>
+ <string name="permlab_setTime" msgid="2021614829591775646">"កំណážáŸ‹â€‹â€‹áž˜áŸ‰áŸ„áž„"</string>
+ <string name="permdesc_setTime" product="tablet" msgid="1896341438151152881">"ឲ្យ​កម្មវិធី​ប្ដូរ​ម៉ោង​កុំព្យូទáŸážšâ€‹áž”ន្ទះ។"</string>
+ <string name="permdesc_setTime" product="default" msgid="1855702730738020">"ឲ្យ​កម្មវិធី​ប្ដូរ​ម៉ោង​ទូរសáŸáž–្ទ។"</string>
+ <string name="permlab_setTimeZone" msgid="2945079801013077340">"កំណážáŸ‹â€‹ážáŸ†áž”ន់​ពáŸáž›ážœáŸáž›áž¶"</string>
+ <string name="permdesc_setTimeZone" product="tablet" msgid="1676983712315827645">"ឲ្យ​កម្មវិធី​ប្ដូរ​ážáŸ†áž”ន់​ពáŸáž›ážœáŸáž›áž¶â€‹ážšáž”ស់​កុំព្យូទáŸážšâ€‹áž”ន្ទះ​នáŸáŸ‡áŸ”"</string>
+ <string name="permdesc_setTimeZone" product="default" msgid="4499943488436633398">"ឲ្យ​កម្មវិធី​ប្ដូរ​ážáŸ†áž”ន់​ពáŸáž›ážœáŸáž›áž¶â€‹ážšáž”ស់​ទូរសáŸáž–្ទ។"</string>
+ <string name="permlab_accountManagerService" msgid="4829262349691386986">"ដើរ​ážáž½â€‹áž‡áž¶ AccountManagerService"</string>
+ <string name="permdesc_accountManagerService" msgid="1948455552333615954">"ឲ្យ​កម្មវិធី​ហៅ​ទៅ​​កម្មវិធី​​ផ្ទៀងផ្ទាážáŸ‹â€‹áž‚ណនី។"</string>
+ <string name="permlab_getAccounts" msgid="1086795467760122114">"រក​គណនី​លើ​ឧបករណáŸ"</string>
+ <string name="permdesc_getAccounts" product="tablet" msgid="2741496534769660027">"ឲ្យ​កម្មវិធី​ទទួល​បញ្ជី​គណនី​ដែល​បាន​ស្គាល់​ដោយ​កុំព្យូទáŸážšâ€‹áž”ន្ទះ។ វា​អាច​រួម​មាន​គណនី​ណាមួយ​ដែល​បាន​បង្កើážâ€‹ážŠáŸ„យ​កម្មវិធី​ដែល​អ្នក​បាន​ដំឡើង។"</string>
+ <string name="permdesc_getAccounts" product="default" msgid="3448316822451807382">"ឲ្យ​កម្មវិធី​ទទួល​បញ្ជី​គណនី​ដែល​ទូរសáŸáž–្ទ​​បាន​ស្គាល់​។ វា​អាច​មាន​គណនី​ដែល​បាន​បង្កើážâ€‹ážŠáŸ„យ​កម្មវិធី​ដែល​អ្នក​បាន​ដំឡើង។"</string>
+ <string name="permlab_authenticateAccounts" msgid="5265908481172736933">"បង្កើážâ€‹áž‚ណនី និង​កំណážáŸ‹â€‹áž–ាក្យ​សម្ងាážáŸ‹"</string>
+ <string name="permdesc_authenticateAccounts" msgid="5472124296908977260">"ឲ្យ​កម្មវិធី​ប្រើ​សមážáŸ’ážáž—ាព​កម្មវិធី​ផ្ទៀងផ្ទាážáŸ‹â€‹áž‚ណនី​នៃ​កម្មវិធី​គ្រប់គ្រង​គណនី រួមមាន​បង្កើážâ€‹áž‚ណនី និង​ទទួល ព្រម​ទាំង​កំណážáŸ‹â€‹áž–ាក្យ​សម្ងាážáŸ‹â€‹áŸ”"</string>
+ <string name="permlab_manageAccounts" msgid="4983126304757177305">"បន្ážáŸ‚ម​ ឬ​លុប​​គណនី"</string>
+ <string name="permdesc_manageAccounts" msgid="8698295625488292506">"ឲ្យ​កម្មវិធី​​អនុវážáŸ’ážâ€‹áž”្រážáž·áž”ážáŸ’ážáž·áž€áž¶ážšâ€‹ážŠáž¼áž…ជា បន្ážáŸ‚ម និង​លុប​គណនី ព្រម​ទាំង​លុប​ពាក្យ​សម្ងាážáŸ‹áŸ”"</string>
+ <string name="permlab_useCredentials" msgid="235481396163877642">"ប្រើ​គណនី​​​លើ​ឧបករណáŸ"</string>
+ <string name="permdesc_useCredentials" msgid="7984227147403346422">"ឲ្យ​កម្មវិធី​ស្នើ​និមិážáŸ’ážážŸáž‰áŸ’ញា​ផ្ទៀងផ្ទាážáŸ‹áŸ”"</string>
+ <string name="permlab_accessNetworkState" msgid="4951027964348974773">"មើល​ការ​ážáž—្ជាប់​បណ្ដាញ"</string>
+ <string name="permdesc_accessNetworkState" msgid="8318964424675960975">"ឲ្យ​កម្មវិធី​មើល​ពáŸážáŸŒáž˜áž¶áž“​អំពី​ការ​ážáž—្ជាប់​បណ្ដាញ​ដូចជា​​មាន​បណ្ដាញ​ណាមួយ​ និង​បណ្ដាញ​ážáŸ’រូវ​បាន​ភ្ជាប់។"</string>
+ <string name="permlab_createNetworkSockets" msgid="8018758136404323658">"ចូល​ដំណើរការ​បណ្ដាញ​ពáŸáž‰â€‹áž›áŸáž‰"</string>
+ <string name="permdesc_createNetworkSockets" msgid="3403062187779724185">"ឲ្យ​កម្មវិធី​បង្កើážâ€‹ážšáž“្ធ​បណ្ដាញ​ និង​ប្រើ​ពិធីការ​បណ្ដាញ​ážáž¶áž˜â€‹áž”ំណង។ កម្មវិធី​អ៊ីនធឺណិážâ€‹ និង​កម្មវិធី​ផ្សáŸáž„​ៗ​ផ្ដល់​វិធី​ផ្ញើ​ទិន្ននáŸáž™â€‹áž‘ៅ​អ៊ីនធឺណិហដូច្នáŸáŸ‡â€‹ážŸáž·áž‘្ធិ​នáŸáŸ‡â€‹áž˜áž·áž“​ទាមទារ​ឲ្យ​ផ្ញើ​ទិន្ននáŸáž™â€‹áž‘ៅ​អ៊ីនធឺណិážáŸ”"</string>
+ <string name="permlab_writeApnSettings" msgid="505660159675751896">"ប្ដូរ/បញ្ឈប់​ចរាចរណ០និង​ការ​កំណážáŸ‹â€‹â€‹áž”ណ្ដាញ"</string>
+ <string name="permdesc_writeApnSettings" msgid="5333798886412714193">"ឲ្យ​កម្មវិធី​ប្ដូរ​ការ​កំណážáŸ‹â€‹áž”ណ្ដាញ និង​រារាំង​ និង​ážáž¶áž˜ážŠáž¶áž“​ចរាចរណáŸâ€‹áž”ណ្ដាញ ឧទាហរណ០ដើម្បី​ប្ដូរ​ប្រូកស៊ី និង​ច្រក APN ។​ កម្មវិធី​ព្យាបាទ​អាច​ពិនិážáŸ’áž™ បញ្ជូន​បន្ហឬ​កែ​កញ្ចប់​ពáŸážáŸŒáž˜áž¶áž“​បណ្ដាញ​ដោយ​មិន​ឲ្យ​អ្នក​ដឹង។"</string>
+ <string name="permlab_changeNetworkState" msgid="958884291454327309">"ប្ដូរ​ការ​ážáž—្ជាប់​បណ្ដាញ"</string>
+ <string name="permdesc_changeNetworkState" msgid="6789123912476416214">"ឲ្យ​កម្មវិធី​ប្ដូរ​ស្ážáž¶áž“ភាព​ážáž—្ជាប់​បណ្ដាញ។"</string>
+ <string name="permlab_changeTetherState" msgid="5952584964373017960">"ប្ដូរ​ការ​ážáž—្ជាប់​ដែល​បាន​​ភ្ជាប់"</string>
+ <string name="permdesc_changeTetherState" msgid="1524441344412319780">"ឲ្យ​កម្មវិធី​ប្ដូរ​ស្ážáž¶áž“ភាព​ការ​ážáž—្ជាប់​បណ្ដាញ​ដែល​បាន​ភ្ជាប់។"</string>
+ <string name="permlab_changeBackgroundDataSetting" msgid="1400666012671648741">"ប្ដូរ​ការ​កំណážáŸ‹â€‹áž”្រើ​ទិន្ននáŸáž™â€‹áž•្ទៃ​ážáž¶áž„​ក្រោយ"</string>
+ <string name="permdesc_changeBackgroundDataSetting" msgid="5347729578468744379">"ឲ្យ​កម្មវិធី​ប្ដូរ​ការ​កំណážáŸ‹â€‹áž€áž¶ážšâ€‹áž”្រើ​ទិន្ននáŸáž™â€‹áž•្ទៃ​ážáž¶áž„​ក្រោយ។"</string>
+ <string name="permlab_accessWifiState" msgid="5202012949247040011">"មើល​ការ​ážáž—្ជាប់​វ៉ាយហ្វាយ"</string>
+ <string name="permdesc_accessWifiState" msgid="5002798077387803726">"ឲ្យ​កម្មវិធី​មើល​ពáŸážáŸŒáž˜áž¶áž“​អំពី​បណ្ដាញ​វ៉ាយហ្វាយ ដូច​ជា​ážáž¶â€‹ážáž¾â€‹ážœáŸ‰áž¶áž™áž áŸ’វាយ​បាន​បើក​ដែរ​ឬទ០និង​ឈ្មោះ​ឧបករណáŸâ€‹ážœáŸ‰áž¶áž™áž áŸ’វាយ​ដែល​បាន​ážáž—្ជាប់។"</string>
+ <string name="permlab_changeWifiState" msgid="6550641188749128035">"ភ្ជាប់ និង​ផ្ដាច់​ពី​វ៉ាយហ្វាយ"</string>
+ <string name="permdesc_changeWifiState" msgid="7137950297386127533">"ឲ្យ​កម្មវិធី​ážáž—្ជាប់ និង​ផ្ដាច់​ពី​ចំណុច​ចូល​ដំណើរការ​វ៉ាយហ្វាយ និង​​ធ្វើការ​ផ្លាស់ប្ដូរ​ការ​កំណážáŸ‹â€‹ážšáž…នាសម្ពáŸáž“្ធ​ឧបករណáŸâ€‹ážŸáž˜áŸ’រាប់​បណ្ដាញ​វ៉ាយហ្វាយ។"</string>
+ <string name="permlab_changeWifiMulticastState" msgid="1368253871483254784">"អនុញ្ញាážâ€‹áž‘ទួល​​ម៉ាល់ធីážáž¶ážŸâ€‹ážœáŸ‰áž¶áž™áž áŸ’វាយ"</string>
+ <string name="permdesc_changeWifiMulticastState" product="tablet" msgid="7969774021256336548">"ឲ្យ​កម្មវិធី​ទទួល​កញ្ចប់​ពáŸážáŸŒáž˜áž¶áž“​ដែល​បាន​ផ្ញើ​ទៅ​ឧបករណáŸâ€‹áž‘ាំងអស់​លើ​បណ្ដាញ​វ៉ាយ​ហ្វាយ ដោយ​ប្រើ​អាសយដ្ឋាន​ប្រកាស​ច្រើន មិន​គ្រាន់ážáŸ‚​សម្រាប់​កុំព្យូទáŸážšâ€‹áž”ន្ទះ​របស់​អ្នក​ទáŸáŸ” វា​ប្រើ​ážáž¶áž˜áž–ល​ច្រើន​ជាង​របៀប​មិន​ប្រកាស​ច្រើន។"</string>
+ <string name="permdesc_changeWifiMulticastState" product="default" msgid="6851949706025349926">"ឲ្យ​កម្មវិធី​ទទួល​កញ្ចប់​ពáŸážáŸŒáž˜áž¶áž“​បាន​ផ្ញើ​ឧបករណáŸâ€‹áž‘ាំងអស់​​លើ​បណ្ដាញ​​វ៉ាយហ្វាយ ​ដោយ​ប្រើ​អាសយដ្ឋាន​​ម៉ាល់ធីážáž¶ážŸ មិន​សម្រាប់​ážáŸ‚​ទូរសáŸáž–្ទ​របស់​អ្នក​ទáŸáŸ” វា​ប្រើ​ážáž¶áž˜áž–ល​ច្រើន​ជាង​របៀប​មិន​​ម៉ាល់ធីážáž¶ážŸáŸ”"</string>
+ <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"ចូល​ដំណើរការ​​ការ​កំណážáŸ‹â€‹áž”៊្លូធូស"</string>
+ <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"ឲ្យ​កម្មវិធី​កំណážáŸ‹â€‹ážšáž…នាសម្ពáŸáž“្ធ​កុំព្យូទáŸážšâ€‹áž”ន្ទះ​ប៊្លូធូស​មូលដ្ឋាន និង​រកមើល ព្រម​ទាំង​ផ្គូផ្គង​ជា​មួយ​ឧបករណáŸâ€‹áž–ី​ចម្ងាយ។"</string>
+ <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"ឲ្យ​កម្មវិធី​មើល​​ការ​កំណážáŸ‹â€‹ážšáž…នាសម្ពáŸáž“្ធ​ប៊្លូធូស​ក្នុង​ទូរសáŸáž–្ទ ដើម្បី​រកមើល និង​ផ្គូផ្គង​ជា​មួយ​ឧបករណáŸâ€‹áž–ី​ចម្ងាយ។"</string>
+ <string name="permlab_accessWimaxState" msgid="4195907010610205703">"ភ្ជាប់ និង​ផ្ដាច់​ពី WiMAX"</string>
+ <string name="permdesc_accessWimaxState" msgid="6360102877261978887">"ឲ្យ​កម្មវិធី​កំណážáŸ‹â€‹ážáž¶â€‹ážáž¾ WiMAX ážáŸ’រូវ​បាន​បើក និង​ពáŸážáŸŒáž˜áž¶áž“​អំពី​បណ្ដាញ WiMAX ដែល​ážáŸ’រូវ​បាន​ážáž—្ជាប់។"</string>
+ <string name="permlab_changeWimaxState" msgid="2405042267131496579">"ប្ដូរ​ស្ážáž¶áž“áž—áž¶áž– WiMAX"</string>
+ <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"ឲ្យ​កម្មវិធី​ážáž—្ជាប់​ និង​ផ្ដាច់​កុំព្យូទáŸážšâ€‹áž”ន្ទះ​ពី​បណ្ដាញ WiMAX ។"</string>
+ <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"ឲ្យ​កម្មវិធី​ភ្ជាប់​ទូរសáŸáž–្ទ​ និង​ផ្ដាច់​ពី​បណ្ដាញ WiMAX ។"</string>
+ <string name="permlab_bluetooth" msgid="6127769336339276828">"ផ្គូផ្គង​ជា​មួយ​ឧបករណáŸâ€‹áž”៊្លូធូស"</string>
+ <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"ឲ្យ​កម្មវិធី​មើល​ការ​កំណážáŸ‹â€‹ážšáž…នាសម្ពáŸáž“្ធ​​ប៊្លូធូស​លើ​​កុំព្យូទáŸážšâ€‹áž”ន្ទះ ព្រម​ទាំង​ធ្វើ​ការ​ážáž—្ជាប់ និង​ទទួល​​ជា​មួយ​ឧបករណáŸâ€‹áž”ាន​ផ្គូផ្គង។"</string>
+ <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"ឲ្យ​កម្មវិធី​មើល​​ការ​កំណážáŸ‹â€‹ážšáž…នាសម្ពáŸáž“្ធ​ប៊្លូធូស​ក្នុង​ទូរសáŸáž–្ទ ដើម្បី​ទទួល និង​ážáž—្ជាប់​ជា​មួយ​ឧបករណáŸâ€‹áž”ាន​ផ្គូផ្គង។"</string>
+ <string name="permlab_nfc" msgid="4423351274757876953">"ពិនិážáŸ’យ​ការ​ទាក់ទង​នៅ​ក្បែរ (NFC)"</string>
+ <string name="permdesc_nfc" msgid="7120611819401789907">"ឲ្យ​កម្មវិធី​ទាក់ទង​ជា​មួយ​ស្លាក (NFC) កាហនិង​កម្មវិធី​អាន។"</string>
+ <string name="permlab_disableKeyguard" msgid="3598496301486439258">"បិទ​ការ​ចាក់​សោ​អáŸáž€áŸ’រង់​របស់​អ្នក"</string>
+ <string name="permdesc_disableKeyguard" msgid="6034203065077122992">"ឲ្យ​កម្មវិធី​បិទ​ការ​ចាក់សោ​សុវážáŸ’ážáž·áž—ាព​ពាក្យ​សម្ងាážáŸ‹â€‹ážŠáŸ‚ល​បាន​ភ្ជាប់​ណា​មួយ។ ​ឧទាហរណáŸâ€‹ážáŸ’រឹមážáŸ’រូវ​​​នៃ​ការ​បិទ​ទូរសáŸáž–្ទ​ពáŸáž›â€‹áž‘ទួលការ​ហៅ​ចូល បន្ទាប់​ម​បើក​សោ​ពáŸáž›â€‹áž€áž¶ážšâ€‹áž áŸ…​បាន​បញ្ចប់។"</string>
+ <string name="permlab_readSyncSettings" msgid="6201810008230503052">"អាន​ការ​កំណážáŸ‹â€‹áž’្វើ​សម​កាល​កម្ម"</string>
+ <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"ឲ្យ​កម្មវិធី​អាន​ការ​កំណážáŸ‹â€‹áž’្វើ​សម​កាល​កម្ម​សម្រាប់​គណនី។ ឧទាហរណ០វា​អាច​កំណážáŸ‹â€‹ážáž¶â€‹ážáž¾â€‹â€‹â€‹áž€áž˜áŸ’មវិធី​ážáŸ’រូវ​បាន​បើក​ជា​មួយ​គណនី​ដែរ​ឬទáŸáŸ”"</string>
+ <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"បិទ/បើក​ការ​ធ្វើ​សម​កាល​កម្ម"</string>
+ <string name="permdesc_writeSyncSettings" msgid="8956262591306369868">"ឲ្យ​កម្មវិធី​កែ​ការ​កំណážáŸ‹â€‹áž’្វើ​សម​កាល​កម្ម​សម្រាប់​គណនី។ ឧទាហរណ០វា​អាច​ážáŸ’រូវ​បាន​ប្រើ​ដើម្បី​បើក​ការ​ធ្វើ​សម​កាល​កម្ម​កម្មវិធី​របស់​មនុស្ស​ជា​មួយ​គណនី។"</string>
+ <string name="permlab_readSyncStats" msgid="7396577451360202448">"អាន​ស្ážáž·ážáž·â€‹áž’្វើ​សម​កាល​កម្ម"</string>
+ <string name="permdesc_readSyncStats" msgid="1510143761757606156">"ឲ្យ​កម្មវិធី​អាន​ស្ážáž¶áž“ភាព​ធ្វើ​សម​កាល​កម្ម​សម្រាប់​គណនី រួមមាន​ព្រឹážáŸ’ážáž·áž€áž¶ážšážŽáŸâ€‹áž”្រវážáŸ’ážáž·â€‹áž’្វើ​សម​កាល​កម្ម ​និង​ទំហំ​ទិន្ននáŸáž™â€‹áž”ាន​ធ្វើ​សម​កាល​កម្ម។"</string>
+ <string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"អាន​អážáŸ’ážáž”ទ​ពáŸážáŸŒáž˜áž¶áž“​បាន​ជាវ"</string>
+ <string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"ឲ្យ​កម្មវិធី​ទទួល​ពáŸážáŸŒáž˜áž¶áž“​លម្អិážâ€‹áž¢áŸ†áž–ី​អážáŸ’ážáž”ទ​ពáŸážáŸŒáž˜áž¶áž“​​បាន​ធ្វើ​សម​កាល​កម្ម​បច្ចុប្បន្ន។"</string>
+ <string name="permlab_subscribedFeedsWrite" msgid="9015246325408209296">"សរសáŸážšâ€‹â€‹áž¢ážáŸ’ážáž”ទ​ពáŸážáŸŒáž˜áž¶áž“​ដែល​​បាន​ជាវ"</string>
+ <string name="permdesc_subscribedFeedsWrite" msgid="6928930188826089413">"ឲ្យ​កម្មវិធី​កែ​អážáŸ’ážáž”ទ​ពáŸážáŸŒáž˜áž¶áž“​បាន​ធ្វើ​សម​កាល​កម្ម​បច្ចុប្បន្ន​របស់​អ្នក។ កម្មវិធី​ព្យាបាទ​អាច​ប្ដូរ​អážáŸ’ážáž”ទ​បាន​ធ្វើ​សម​កាល​កម្ម​របស់​អ្នក។"</string>
+ <string name="permlab_readDictionary" msgid="4107101525746035718">"អាន​ពាក្យ​ដែល​អ្នក​បាន​បន្ážáŸ‚ម​ទៅ​វចនានុក្រម"</string>
+ <string name="permdesc_readDictionary" msgid="659614600338904243">"ឲ្យ​កម្មវិធី​អាន​ពាក្យ ឈ្មោះ និង​ឃ្លា​ទាំងអស់​ដែល​អ្នកប្រើ​អាច​​រក្សាទុក​ក្នុង​វចនានុក្រម​​អ្នកប្រើ។"</string>
+ <string name="permlab_writeDictionary" msgid="2183110402314441106">"បន្ážáŸ‚ម​ពាក្យ​ទៅ​វចនានុក្រម​កំណážáŸ‹â€‹ážŠáŸ„យ​អ្នកប្រើ"</string>
+ <string name="permdesc_writeDictionary" msgid="8185385716255065291">"ឲ្យ​កម្មវិធី​សរសáŸážšâ€‹áž–ាក្យ​ážáŸ’មី​ក្នុង​វចនានុក្រម​អ្នកប្រើ។"</string>
+ <string name="permlab_sdcardRead" product="nosdcard" msgid="8235341515605559677">"សាកល្បង​ចូល​ដំណើរការ​ការ​ផ្ទុក​ដែល​បាន​ការពារ"</string>
+ <string name="permlab_sdcardRead" product="default" msgid="8235341515605559677">"សាកល្បង​ចូល​ដំណើរការ​ការ​ផ្ទុក​ដែល​បាន​ការពារ"</string>
+ <string name="permdesc_sdcardRead" product="nosdcard" msgid="3642473292348132072">"ឲ្យ​កម្មវិធី​សាកល្បង​សិទ្ធិ​សម្រាប់​ឧបករណáŸâ€‹áž•្ទុក​យូអáŸážŸáž”៊ី ដែល​នឹង​អាច​ប្រើ​បាន​លើ​ឧបករណáŸâ€‹â€‹áž–áŸáž›â€‹áž¢áž“áž¶áž‚ážáŸ”"</string>
+ <string name="permdesc_sdcardRead" product="default" msgid="5914402684685848828">"ឲ្យ​កម្មវិធី​សាកល្បង​សិទ្ធិ​សម្រាប់​កាážâ€‹áž¢áŸážŸážŒáž¸â€‹ážŠáŸ‚ល​នឹង​អាច​ប្រើ​បាន​លើ​ឧបករណáŸâ€‹áž“ា​ពáŸáž›â€‹áž¢áž“áž¶áž‚ážáŸ”"</string>
+ <string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"កែ​ ឬ​លុប​មាážáž·áž€áž¶â€‹áž“ៃ​ឧបករណáŸâ€‹áž•្ទុក​យូអáŸážŸáž”៊ី​របស់​អ្នក"</string>
+ <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"កែ ឬ​លុប​មាážáž·áž€áž¶â€‹áž€áž¶ážâ€‹áž¢áŸážŸážŒáž¸"</string>
+ <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"ឲ្យ​កម្មវិធី​សរសáŸážšâ€‹áž§áž”ករណáŸâ€‹áž•្ទុក​យូអáŸážŸáž”៊ី។"</string>
+ <string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"ឲ្យ​​កម្មវិធី​សរសáŸážšâ€‹áž‘ៅ​កាážâ€‹áž¢áŸážŸážŒáž¸áŸ”"</string>
+ <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"កែ/លុប​មាážáž·áž€áž¶â€‹áž§áž”ករណáŸâ€‹áž•្ទុក​មáŸážŒáŸ€â€‹ážáž¶áž„​ក្នុង"</string>
+ <string name="permdesc_mediaStorageWrite" product="default" msgid="8189160597698529185">"ឲ្យ​កម្មវិធី​កែ​មាážáž·áž€áž¶â€‹áž“ៃ​ឧបករណáŸâ€‹áž•្ទុក​ážáž¶áž„​ក្នុង។"</string>
+ <string name="permlab_manageDocs" product="default" msgid="5778318598448849829">"គ្រប់គ្រង​ការ​ផ្ទុក​ឯកសារ"</string>
+ <string name="permdesc_manageDocs" product="default" msgid="8704323176914121484">"ឲ្យ​កម្មវិធី​គ្រប់គ្រង​ការ​ផ្ទុក​ឯកសារ។"</string>
+ <string name="permlab_sdcardAccessAll" msgid="8150613823900460576">"ចូល​ដំណើរការ​ឧបករណáŸâ€‹áž•្ទុក​ážáž¶áž„​ក្រៅ​នៃ​អ្នកប្រើ​ទាំងអស់"</string>
+ <string name="permdesc_sdcardAccessAll" msgid="3215208357415891320">"ឲ្យ​កម្មវិធី​ចូល​ដំណើរការ​ឧបករណáŸâ€‹áž•្ទុក​ážáž¶áž„​ក្រៅ​សម្រាប់​អ្នកប្រើ​ទាំងអស់។"</string>
+ <string name="permlab_cache_filesystem" msgid="5656487264819669824">"ចូល​ដំណើរការ​ប្រពáŸáž“្ធ​​​ឯកសារ​ឃ្លាំង​សម្ងាážáŸ‹"</string>
+ <string name="permdesc_cache_filesystem" msgid="5578967642265550955">"ឲ្យ​កម្មវិធី​អាន និង​សរសáŸážšâ€‹áž”្រពáŸáž“្ធ​ឯកសារ​ឃ្លាំង​សម្ងាážáŸ‹áŸ”"</string>
+ <string name="permlab_use_sip" msgid="5986952362795870502">"ធ្វើ​ការ​ហៅ/ទទួល​ážáž¶áž˜â€‹áž¢áŸŠáž¸áž“ធឺណិáž"</string>
+ <string name="permdesc_use_sip" msgid="4717632000062674294">"ឲ្យ​កម្មវិធី​ប្រើ​សáŸážœáž¶áž€áž˜áŸ’ម SIP ដើម្បី​​​ហៅ/ទទួល​​​ážáž¶áž˜â€‹áž¢áŸŠáž¸áž“ធឺណិážáŸ”"</string>
+ <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"អាន​ការ​ប្រើ​បណ្ដាញ​ពិសáŸážŸ"</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"ឲ្យ​កម្មវិធី​អាន​ការ​ប្រើ​បណ្ដាញ​ជា​ប្រវážáŸ’ážáž·â€‹ážŸáž¶ážŸáŸ’ážáŸ’រ​សម្រាប់​បណ្ដាញ និង​កម្មវិធី​ជាក់លាក់។"</string>
+ <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"គ្រប់គ្រង​គោលនយោបាយ​បណ្ដាញ"</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"ឲ្យ​កម្មវិធី​គ្រប់គ្រង​គោលនយោបាយ​បណ្ដាញ និង​កំណážáŸ‹â€‹áž€áŸ’បួន​ជាក់លាក់​សម្រាប់​កម្មវិធី។"</string>
+ <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"កែ​គណនី​ប្រើ​បណ្ដាញ"</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"ឲ្យ​កម្មវិធី​កែ​វិធី​គិážâ€‹ážáŸ’លៃ​សáŸážœáž¶áž€áž˜áŸ’ម​ប្រើ​បណ្ដាញ​​ážáž¶áž˜â€‹áž€áž˜áŸ’មវិធី។ មិន​សម្រាប់​ប្រើ​ដោយ​កម្មវិធី​ធម្មážáž¶áŸ”"</string>
+ <string name="permlab_markNetworkSocket" msgid="3658527214914959749">"កែប្រែ​សញ្ញា​រន្ធ"</string>
+ <string name="permdesc_markNetworkSocket" msgid="7655568433696356578">"ឲ្យ​កម្មវិធី​កែ​សញ្ញា​រន្ធ​​សម្រាប់​នាំ​ផ្លូវ"</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"ចូល​ដំណើរ​ការ​ការ​ជូន​ដំណឹង"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"ឲ្យ​កម្មវិធី​ទៅ​យក ពិនិážáŸ’áž™ និង​សម្អាážâ€‹áž€áž¶ážšâ€‹áž‡áž¼áž“​ដំណឹង រួមមាន​​ប្រកាស​ដោយ​កម្មវិធី​ផ្សáŸáž„ៗ។"</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"ចង​ទៅ​សáŸážœáž¶áž€áž˜áŸ’ម​ស្ដាប់​ការ​ជូន​ដំណឹង"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"ឲ្យ​ម្ចាស់​ចង​ចំណុច​ប្រទាក់​កម្រិážâ€‹áž€áŸ†áž–ូល​នៃ​សáŸážœáž¶áž€áž˜áŸ’ម​កម្មវិធី​ស្ដាប់​ការ​ជូន​ដំណឹង។ មិន​គួរ​ចាំបាច់​សម្រាប់​កម្មវិធី​ធម្មážáž¶â€‹â€‹áž‘áŸáŸ”"</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"ដកហូážâ€‹áž€áž˜áŸ’មវិធី​កំណážáŸ‹â€‹ážšáž…នាសម្ពáŸáž“្ធ​ដែល​បាន​ផ្ដល់​ដោយ​ក្រុមហ៊ុន​បញ្ជូន"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"អនុញ្ញាážâ€‹áž²áŸ’យ​ម្ចាស់​ដក​ហូážâ€‹áž€áž˜áŸ’មវិធី​កំណážáŸ‹â€‹ážšáž…នាសម្ពáŸáž“្ធ​ដែល​បាន​ផ្ដល់​ដោយ​ក្រុមហ៊ុន​បញ្ជូន។ មិន​គួរ​ចាំបាច់​សម្រាប់​កម្មវិធី​ធម្មážáž¶â€‹áž‘áŸáŸ”"</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"សង្កáŸážâ€‹áž˜áž¾áž›â€‹áž›áž¾â€‹áž›áž€áŸ’ážážážŽáŸ’ឌ​បណ្ដាញ"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"ឲ្យ​កម្មវិធី​សង្កáŸážâ€‹áž˜áž¾áž›â€‹â€‹áž›áž¾â€‹áž›áž€áŸ’ážážážŽáŸ’ឌ​បណ្ដាញ​។ មិន​គួរ​ចាំបាច់​សម្រាប់​កម្មវិធី​ធម្មážáž¶â€‹áž‘áŸáŸ”"</string>
+ <string name="policylab_limitPassword" msgid="4497420728857585791">"កំណážáŸ‹â€‹áž€áŸ’បួន​ពាក្យ​សម្ងាážáŸ‹"</string>
+ <string name="policydesc_limitPassword" msgid="3252114203919510394">"ពិនិážáŸ’យ​ប្រវែង និង​ážáž½áž¢áž€áŸ’សរ​ដែល​បាន​អនុញ្ញាážâ€‹áž€áŸ’នុង​ពាក្យ​សម្ងាážáŸ‹â€‹áž…ាក់​សោ​អáŸáž€áŸ’រង់។"</string>
+ <string name="policylab_watchLogin" msgid="914130646942199503">"ពិនិážáŸ’យ​ការ​ព្យាយាម​ដោះ​សោ​អáŸáž€áŸ’រង់"</string>
+ <string name="policydesc_watchLogin" product="tablet" msgid="3215729294215070072">"ពិនិážáŸ’យ​ចំនួន​​បញ្ចូល​ពាក្យ​សម្ងាážáŸ‹â€‹áž˜áž·áž“​ážáŸ’រឹមážáŸ’រូវ។ áž–áŸáž›â€‹ážŠáŸ„ះ​សោ​អáŸáž€áŸ’រង់ និង​ចាក់​សោ​ទូរសáŸáž–្ទ ឬ​លុប​ទិន្ននáŸáž™â€‹áž‘ូរសáŸáž–្ទ​ទាំងអស់​ ប្រសិន​បើ​មាន​ពាក្យ​សម្ងាážáŸ‹â€‹áž”ញ្ចូល​មិន​ážáŸ’រឹមážáŸ’រូវ​ច្រើន​ដង​ពáŸáž€áŸ”"</string>
+ <string name="policydesc_watchLogin" product="default" msgid="5712323091846761073">"ពិនិážáŸ’យ​ចំនួន​​បញ្ចូល​ពាក្យ​សម្ងាážáŸ‹â€‹áž˜áž·áž“​ážáŸ’រឹមážáŸ’រូវ។ áž–áŸáž›â€‹ážŠáŸ„ះ​សោ​អáŸáž€áŸ’រង់ និង​ចាក់​សោ​ទូរសáŸáž–្ទ ឬ​លុប​ទិន្ននáŸáž™â€‹áž‘ូរសáŸáž–្ទ​ទាំងអស់​ ប្រសិន​បើ​មាន​ពាក្យ​សម្ងាážáŸ‹â€‹áž”ញ្ចូល​មិន​ážáŸ’រឹមážáŸ’រូវ​ច្រើន​ដង​ពáŸáž€áŸ”"</string>
+ <string name="policylab_resetPassword" msgid="2620077191242688955">"ប្ដូរ​ពាក្យ​សម្ងាážáŸ‹â€‹ážŠáŸ„ះ​សោ​អáŸáž€áŸ’រង់"</string>
+ <string name="policydesc_resetPassword" msgid="605963962301904458">"ប្ដូរ​ពាក្យ​សម្ងាážáŸ‹â€‹â€‹ážŠáŸ„ះ​សោ​អáŸáž€áŸ’រង់។"</string>
+ <string name="policylab_forceLock" msgid="2274085384704248431">"ចាក់សោ​អáŸáž€áŸ’រង់"</string>
+ <string name="policydesc_forceLock" msgid="1141797588403827138">"ពិនិážáŸ’យ​វិធី និង​ពáŸáž›ážœáŸáž›áž¶â€‹áž…ាក់សោ​អáŸáž€áŸ’រង់។"</string>
+ <string name="policylab_wipeData" msgid="3910545446758639713">"លុប​ទិន្ននáŸáž™â€‹áž‘ាំង​អស់"</string>
+ <string name="policydesc_wipeData" product="tablet" msgid="4306184096067756876">"លុប​ទិន្ននáŸáž™â€‹áž€áž»áŸ†áž–្យូទáŸážšâ€‹áž”ន្ទះ​ដោយ​មិន​​ព្រមាន​ដោយ​អនុវážáŸ’ážâ€‹áž€áž¶ážšâ€‹áž€áŸ†ážŽážáŸ‹â€‹áž‘ិន្ននáŸáž™â€‹ážŠáž¼áž…​ចáŸáž‰â€‹áž–ី​រោងចក្រ។"</string>
+ <string name="policydesc_wipeData" product="default" msgid="5096895604574188391">"លុប​ទិន្ននáŸáž™â€‹áž‘ូរសáŸáž–្ទ​ដោយ​មិន​ព្រមាន ដោយ​អនុវážáŸ’ážâ€‹áž€áž¶ážšâ€‹áž€áŸ†ážŽážáŸ‹â€‹áž‘ិន្ននáŸáž™â€‹ážŠáž¼áž…​ចáŸáž‰â€‹áž–ី​រោងចក្រ ។"</string>
+ <string name="policylab_setGlobalProxy" msgid="2784828293747791446">"កំណážáŸ‹â€‹áž”្រូកស៊ី​សកល​របស់​ឧបករណáŸ"</string>
+ <string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"កំណážáŸ‹â€‹áž”្រូកស៊ី​សកល​របស់​ឧបករណáŸâ€‹ážáŸ’រូវ​ប្រើ​ពáŸáž›â€‹áž”ាន​បើក​គោលនយោបាយ។ មាន​ážáŸ‚​អ្នក​គ្រប់គ្រង​ឧបករណáŸâ€‹ážŠáŸ†áž”ូង​ប៉ុណ្ណោះ​កំណážáŸ‹â€‹áž”្រូកស៊ី​សកល​ážáŸ’រឹមážáŸ’រូវ។"</string>
+ <string name="policylab_expirePassword" msgid="885279151847254056">"កំណážáŸ‹â€‹ážŸáž»áž–លភាព​ពាក្យ​សម្ងាážáŸ‹â€‹áž…ាក់សោ​អáŸáž€áŸ’រង់"</string>
+ <string name="policydesc_expirePassword" msgid="1729725226314691591">"ពិនិážáŸ’យ​វិធី​ដែល​ប្ដូរ​ពាក្យ​សម្ងាážáŸ‹â€‹áž…ាក់​សោ​អáŸáž€áŸ’រង់​ញឹកញាប់។"</string>
+ <string name="policylab_encryptedStorage" msgid="8901326199909132915">"កំណážáŸ‹â€‹áž€áž¶ážšâ€‹ážŠáž¶áž€áŸ‹áž›áŸážâ€‹áž€áž¼ážŠâ€‹áž€áž¶ážšâ€‹áž•្ទុក"</string>
+ <string name="policydesc_encryptedStorage" msgid="2637732115325316992">"ážáž˜áŸ’រូវ​ឲ្យ​ដាក់​លáŸážâ€‹áž€áž¼ážŠâ€‹áž‘ិន្ននáŸáž™â€‹áž€áž˜áŸ’មវិធី​បាន​រក្សាទុក។"</string>
+ <string name="policylab_disableCamera" msgid="6395301023152297826">"បិទ​ម៉ាស៊ីន​ážáž"</string>
+ <string name="policydesc_disableCamera" msgid="2306349042834754597">"ការពារ​ការ​ប្រើ​ម៉ាស៊ីន​ážážâ€‹áž§áž”ករណáŸâ€‹áž‘ាំងអស់។"</string>
+ <string name="policylab_disableKeyguardFeatures" msgid="266329104542638802">"បិទ​លក្ážážŽáŸˆâ€‹áž€áŸ’នុង​ការ​ចាក់សោ"</string>
+ <string name="policydesc_disableKeyguardFeatures" msgid="3467082272186534614">"ការ​ពារ​មិន​ឲ្យ​ប្រើ​លក្ážážŽáŸˆâ€‹áž˜áž½áž™â€‹áž…ំនួន​ក្នុង​ការ​ចាក់សោ។"</string>
+ <string-array name="phoneTypes">
+ <item msgid="8901098336658710359">"ផ្ទះ"</item>
+ <item msgid="869923650527136615">"​ចលáŸáž"</item>
+ <item msgid="7897544654242874543">"កន្លែង​ធ្វើការ"</item>
+ <item msgid="1103601433382158155">"ទូរសារ​កន្លែង​ធ្វើ"</item>
+ <item msgid="1735177144948329370">"ទូរសារ​ផ្ទះ"</item>
+ <item msgid="603878674477207394">"áž—áŸáž™áŸážš"</item>
+ <item msgid="1650824275177931637">"ផ្សáŸáž„ៗ"</item>
+ <item msgid="9192514806975898961">"ážáž¶áž˜â€‹áž”ំណង"</item>
+ </string-array>
+ <string-array name="emailAddressTypes">
+ <item msgid="8073994352956129127">"ផ្ទះ"</item>
+ <item msgid="7084237356602625604">"កន្លែង​ធ្វើការ"</item>
+ <item msgid="1112044410659011023">"ផ្សáŸáž„ៗ"</item>
+ <item msgid="2374913952870110618">"ážáž¶áž˜â€‹ážáž˜áŸ’រូវ​ការ"</item>
+ </string-array>
+ <string-array name="postalAddressTypes">
+ <item msgid="6880257626740047286">"ផ្ទះ"</item>
+ <item msgid="5629153956045109251">"កន្លែង​ធ្វើការ"</item>
+ <item msgid="4966604264500343469">"ផ្សáŸáž„ៗ"</item>
+ <item msgid="4932682847595299369">"ážáž¶áž˜â€‹áž”ំណង"</item>
+ </string-array>
+ <string-array name="imAddressTypes">
+ <item msgid="1738585194601476694">"ផ្ទះ"</item>
+ <item msgid="1359644565647383708">"កន្លែង​ធ្វើការ"</item>
+ <item msgid="7868549401053615677">"ផ្សáŸáž„ៗ"</item>
+ <item msgid="3145118944639869809">"ážáž¶áž˜â€‹ážáž˜áŸ’រូវការ"</item>
+ </string-array>
+ <string-array name="organizationTypes">
+ <item msgid="7546335612189115615">"កន្លែង​ធ្វើការ"</item>
+ <item msgid="4378074129049520373">"ផ្សáŸáž„ៗ"</item>
+ <item msgid="3455047468583965104">"ážáž¶áž˜â€‹ážáž˜áŸ’រូវ​ការ"</item>
+ </string-array>
+ <string-array name="imProtocols">
+ <item msgid="8595261363518459565">"AIM"</item>
+ <item msgid="7390473628275490700">"Windows Live"</item>
+ <item msgid="7882877134931458217">"Yahoo"</item>
+ <item msgid="5035376313200585242">"Skype"</item>
+ <item msgid="7532363178459444943">"QQ"</item>
+ <item msgid="3713441034299660749">"ជជែក​ Google"</item>
+ <item msgid="2506857312718630823">"ICQ"</item>
+ <item msgid="1648797903785279353">"Jabber"</item>
+ </string-array>
+ <string name="phoneTypeCustom" msgid="1644738059053355820">"ážáž¶áž˜â€‹áž”ំណង"</string>
+ <string name="phoneTypeHome" msgid="2570923463033985887">"ផ្ទះ"</string>
+ <string name="phoneTypeMobile" msgid="6501463557754751037">"​ចលáŸáž"</string>
+ <string name="phoneTypeWork" msgid="8863939667059911633">"កន្លែង​ធ្វើការ"</string>
+ <string name="phoneTypeFaxWork" msgid="3517792160008890912">"ទូរសារ​កន្លែង​ធ្វើការ"</string>
+ <string name="phoneTypeFaxHome" msgid="2067265972322971467">"ទូរសារ​ផ្ទះ"</string>
+ <string name="phoneTypePager" msgid="7582359955394921732">"áž—áŸáž™áŸážš"</string>
+ <string name="phoneTypeOther" msgid="1544425847868765990">"ផ្សáŸáž„ៗ"</string>
+ <string name="phoneTypeCallback" msgid="2712175203065678206">"ហៅ​មក​វិញ"</string>
+ <string name="phoneTypeCar" msgid="8738360689616716982">"ážšážáž™áž“្áž"</string>
+ <string name="phoneTypeCompanyMain" msgid="540434356461478916">"áž›áŸážâ€‹ážŸáŸ†ážáž¶áž“់​ក្រុមហ៊ុន"</string>
+ <string name="phoneTypeIsdn" msgid="8022453193171370337">"ISDN"</string>
+ <string name="phoneTypeMain" msgid="6766137010628326916">"áž›áŸážâ€‹ážŸáŸ†ážáž¶áž“់"</string>
+ <string name="phoneTypeOtherFax" msgid="8587657145072446565">"ទូរសារ​ផ្សáŸáž„"</string>
+ <string name="phoneTypeRadio" msgid="4093738079908667513">"វិទ្យុ"</string>
+ <string name="phoneTypeTelex" msgid="3367879952476250512">"ទូរសារ"</string>
+ <string name="phoneTypeTtyTdd" msgid="8606514378585000044">"TTY TDD"</string>
+ <string name="phoneTypeWorkMobile" msgid="1311426989184065709">"ទូរសáŸáž–្ទ​​កន្លែងធ្វើការ"</string>
+ <string name="phoneTypeWorkPager" msgid="649938731231157056">"áž—áŸáž™áŸážšâ€‹áž€áž“្លែង​ធ្វើ​ការ"</string>
+ <string name="phoneTypeAssistant" msgid="5596772636128562884">"អ្នក​ជំនួយ​ការ"</string>
+ <string name="phoneTypeMms" msgid="7254492275502768992">"សារ MMS"</string>
+ <string name="eventTypeCustom" msgid="7837586198458073404">"ážáž¶áž˜â€‹ážáž˜áŸ’រូវ​ការ"</string>
+ <string name="eventTypeBirthday" msgid="2813379844211390740">"ážáŸ’ងៃ​ážáž½áž”​កំណើáž"</string>
+ <string name="eventTypeAnniversary" msgid="3876779744518284000">"បុណ្យážáž½áž”"</string>
+ <string name="eventTypeOther" msgid="7388178939010143077">"ផ្សáŸáž„ៗ"</string>
+ <string name="emailTypeCustom" msgid="8525960257804213846">"ážáž¶áž˜â€‹ážáž˜áŸ’រូវ​ការ"</string>
+ <string name="emailTypeHome" msgid="449227236140433919">"ផ្ទះ"</string>
+ <string name="emailTypeWork" msgid="3548058059601149973">"កន្លែង​ធ្វើការ"</string>
+ <string name="emailTypeOther" msgid="2923008695272639549">"ផ្សáŸáž„ៗ"</string>
+ <string name="emailTypeMobile" msgid="119919005321166205">"áž…áž›áŸáž"</string>
+ <string name="postalTypeCustom" msgid="8903206903060479902">"ážáž¶áž˜â€‹ážáž˜áŸ’រូវ​ការ"</string>
+ <string name="postalTypeHome" msgid="8165756977184483097">"ផ្ទះ"</string>
+ <string name="postalTypeWork" msgid="5268172772387694495">"កន្លែង​ធ្វើការ"</string>
+ <string name="postalTypeOther" msgid="2726111966623584341">"ផ្សáŸáž„ៗ"</string>
+ <string name="imTypeCustom" msgid="2074028755527826046">"ážáž¶áž˜â€‹áž”ំណង"</string>
+ <string name="imTypeHome" msgid="6241181032954263892">"ផ្ទះ"</string>
+ <string name="imTypeWork" msgid="1371489290242433090">"កន្លែង​ធ្វើការ"</string>
+ <string name="imTypeOther" msgid="5377007495735915478">"ផ្សáŸáž„ៗ"</string>
+ <string name="imProtocolCustom" msgid="6919453836618749992">"ážáž¶áž˜â€‹áž”ំណង"</string>
+ <string name="imProtocolAim" msgid="7050360612368383417">"AIM"</string>
+ <string name="imProtocolMsn" msgid="144556545420769442">"Windows Live"</string>
+ <string name="imProtocolYahoo" msgid="8271439408469021273">"Yahoo"</string>
+ <string name="imProtocolSkype" msgid="9019296744622832951">"Skype"</string>
+ <string name="imProtocolQq" msgid="8887484379494111884">"QQ"</string>
+ <string name="imProtocolGoogleTalk" msgid="493902321140277304">"ការ​ជជែក"</string>
+ <string name="imProtocolIcq" msgid="1574870433606517315">"ICQ"</string>
+ <string name="imProtocolJabber" msgid="2279917630875771722">"Jabber"</string>
+ <string name="imProtocolNetMeeting" msgid="8287625655986827971">"NetMeeting"</string>
+ <string name="orgTypeWork" msgid="29268870505363872">"កន្លែង​ធ្វើការ"</string>
+ <string name="orgTypeOther" msgid="3951781131570124082">"ផ្សáŸáž„ៗ"</string>
+ <string name="orgTypeCustom" msgid="225523415372088322">"ážáž¶áž˜â€‹ážáž˜áŸ’រូវការ"</string>
+ <string name="relationTypeCustom" msgid="3542403679827297300">"ážáž¶áž˜â€‹áž”ំណង"</string>
+ <string name="relationTypeAssistant" msgid="6274334825195379076">"អ្នក​ជំនួយ​ការ"</string>
+ <string name="relationTypeBrother" msgid="8757913506784067713">"បងប្អូន​ប្រុស"</string>
+ <string name="relationTypeChild" msgid="1890746277276881626">"កូន"</string>
+ <string name="relationTypeDomesticPartner" msgid="6904807112121122133">"ដៃគូ​ក្នុងស្រុក"</string>
+ <string name="relationTypeFather" msgid="5228034687082050725">"ឪពុក"</string>
+ <string name="relationTypeFriend" msgid="7313106762483391262">"មិážáŸ’ážáž—áŸáž€áŸ’ដិ"</string>
+ <string name="relationTypeManager" msgid="6365677861610137895">"អ្នក​គ្រប់គ្រង"</string>
+ <string name="relationTypeMother" msgid="4578571352962758304">"ម្ដាយ"</string>
+ <string name="relationTypeParent" msgid="4755635567562925226">"ឪពុកម្ដាយ"</string>
+ <string name="relationTypePartner" msgid="7266490285120262781">"ដៃគូ"</string>
+ <string name="relationTypeReferredBy" msgid="101573059844135524">"យោង​ដោយ"</string>
+ <string name="relationTypeRelative" msgid="1799819930085610271">"សាច់ញាážáž·"</string>
+ <string name="relationTypeSister" msgid="1735983554479076481">"បងប្អូន​ស្រី"</string>
+ <string name="relationTypeSpouse" msgid="394136939428698117">"ប្ដី/​​ប្រពន្ធ"</string>
+ <string name="sipAddressTypeCustom" msgid="2473580593111590945">"ážáž¶áž˜â€‹áž”ំណង"</string>
+ <string name="sipAddressTypeHome" msgid="6093598181069359295">"áž‚áŸáž â€‹áž‘ំពáŸážš"</string>
+ <string name="sipAddressTypeWork" msgid="6920725730797099047">"កន្លែង​ធ្វើការ"</string>
+ <string name="sipAddressTypeOther" msgid="4408436162950119849">"ផ្សáŸáž„ៗ"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"បញ្ចូល​កូដ PIN"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"បញ្ចូល​កូដ PUK និង​ PIN ážáŸ’មី"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"កូដ PUK"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"កូដ PIN ážáŸ’មី"</string>
+ <string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"ប៉ះ ដើម្បី​បញ្ចូល​ពាក្យ​សម្ងាážáŸ‹"</font></string>
+ <string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"បញ្ចូល​ពាក្យ​សម្ងាážáŸ‹â€‹ ​ដើម្បី​ដោះ​សោ"</string>
+ <string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"បញ្ចូល​កូដ PIN ដើម្បី​ដោះ​សោ"</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"កូដ PIN មិន​ážáŸ’រឹមážáŸ’រូវ។"</string>
+ <string name="keyguard_label_text" msgid="861796461028298424">"ដើម្បី​ដោះ​សោ​​ ចុច​ម៉ឺនុយ​ បន្ទាប់មក 0 ។"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"áž›áŸážâ€‹áž–áŸáž›â€‹áž¢áž¶ážŸáž“្ន"</string>
+ <string name="lockscreen_carrier_default" msgid="8963839242565653192">"គ្មាន​សáŸážœáž¶áŸ”"</string>
+ <string name="lockscreen_screen_locked" msgid="7288443074806832904">"ចាក់​អáŸáž€áŸ’រង់។"</string>
+ <string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"ចុច​ម៉ឺនុយ ដើម្បី​ដោះ​សោ​ ឬ​ហៅ​ពáŸáž›â€‹áž¢áž¶ážŸáž“្ន។"</string>
+ <string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"ចុច​ម៉ឺនុយ ដើម្បី​ដោះ​សោ។"</string>
+ <string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"គូរ​លំនាំ ដើម្បី​ដោះ​សោ"</string>
+ <string name="lockscreen_emergency_call" msgid="5347633784401285225">"ការ​ហៅ​​ពáŸáž›â€‹áž¢áž¶ážŸáž“្ន"</string>
+ <string name="lockscreen_return_to_call" msgid="5244259785500040021">"ážáŸ’រឡប់​ទៅ​ការ​ហៅ"</string>
+ <string name="lockscreen_pattern_correct" msgid="9039008650362261237">"ážáŸ’រឹមážáŸ’រូវ!"</string>
+ <string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"ព្យាយាម​ម្ដង​ទៀáž"</string>
+ <string name="lockscreen_password_wrong" msgid="5737815393253165301">"ព្យាយាម​ម្ដង​ទៀáž"</string>
+ <string name="faceunlock_multiple_failures" msgid="754137583022792429">"បាន​លើស​ការ​ព្យាយាម​ដោះ​សោ​ážáž¶áž˜â€‹áž‘ម្រង់​មុáž"</string>
+ <string name="lockscreen_plugged_in" msgid="8057762828355572315">"បញ្ចូល​ážáŸ’ម <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+ <string name="lockscreen_charged" msgid="321635745684060624">"បាន​បញ្ចូល​ពáŸáž‰áŸ”"</string>
+ <string name="lockscreen_battery_short" msgid="4477264849386850266">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+ <string name="lockscreen_low_battery" msgid="1482873981919249740">"ភ្ជាប់​ឧបករណáŸâ€‹áž”ញ្ចូល​ážáŸ’ម។"</string>
+ <string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"គ្មាន​ស៊ី​ម​កាáž"</string>
+ <string name="lockscreen_missing_sim_message" product="tablet" msgid="151659196095791474">"គ្មាន​ស៊ីម​កាážâ€‹áž€áŸ’នុង​កុំព្យូទáŸážšâ€‹áž”ន្ទះ។"</string>
+ <string name="lockscreen_missing_sim_message" product="default" msgid="2186920585695169078">"គ្មាន​ស៊ីម​កាážâ€‹áž€áŸ’នុង​ទូរសáŸáž–្ទ។"</string>
+ <string name="lockscreen_missing_sim_instructions" msgid="5372787138023272615">"បញ្ចូល​​ស៊ី​ម​កាážáŸ”"</string>
+ <string name="lockscreen_missing_sim_instructions_long" msgid="3526573099019319472">"បាážáŸ‹â€‹ ឬ​មិន​អាច​អាន​ស៊ីម​កាážáŸ” បញ្ចូល​ស៊ីម​កាážáŸ”"</string>
+ <string name="lockscreen_permanent_disabled_sim_message_short" msgid="5096149665138916184">"ស៊ី​ម​កាážâ€‹áž˜áž·áž“​អាច​ប្រើ​បាន​។"</string>
+ <string name="lockscreen_permanent_disabled_sim_instructions" msgid="910904643433151371">"ស៊ីម​កាážâ€‹ážšáž”ស់​អ្នក​ážáŸ’រូវ​បាន​បិទ​ជា​អចិន្ážáŸ’រៃយáŸáŸ”\n ទាក់ទង​ក្រុមហ៊ុន​ផ្ដល់​សáŸážœáž¶áž€áž˜áŸ’ម​ឥážâ€‹ážáŸ’សែ​របស់​អ្នក​សម្រាប់​ស៊ីម​កាážâ€‹áž•្សáŸáž„។"</string>
+ <string name="lockscreen_transport_prev_description" msgid="201594905152746886">"ប៊ូážáž»áž„​បទ​មុន"</string>
+ <string name="lockscreen_transport_next_description" msgid="6089297650481292363">"ប៊ូážáž»áž„​បទ​បន្ទាប់"</string>
+ <string name="lockscreen_transport_pause_description" msgid="7659088786780128001">"ប៊ូážáž»áž„​​ផ្អាក"</string>
+ <string name="lockscreen_transport_play_description" msgid="5888422938351019426">"ប៊ូážáž»áž„​ចាក់"</string>
+ <string name="lockscreen_transport_stop_description" msgid="4562318378766987601">"ប៊ូážáž»áž„​បញ្ឈប់"</string>
+ <string name="emergency_calls_only" msgid="6733978304386365407">"សម្រាប់​ážáŸ‚​ហៅ​ពáŸáž›â€‹áž¢áž¶ážŸáž“្ន​ប៉ុណ្ណោះ"</string>
+ <string name="lockscreen_network_locked_message" msgid="143389224986028501">"បណ្ដាញ​ជាប់​សោ"</string>
+ <string name="lockscreen_sim_puk_locked_message" msgid="7441797339976230">"ស៊ីម​កាážâ€‹áž‡áž¶áž”់​សោ PUK។"</string>
+ <string name="lockscreen_sim_puk_locked_instructions" msgid="8127916255245181063">"មើល​មគ្គុទ្ទáŸážŸáž€áŸâ€‹áž¢áŸ’នក​ប្រើ ឬ​ទាក់ទង​សáŸážœáž¶â€‹áž¢ážáž·ážáž·áž‡áž“។"</string>
+ <string name="lockscreen_sim_locked_message" msgid="8066660129206001039">"ស៊ីមកាážâ€‹â€‹áž‡áž¶áž”់​សោ។"</string>
+ <string name="lockscreen_sim_unlock_progress_dialog_message" msgid="595323214052881264">"កំពុង​ដោះ​សោ​ស៊ីមកាáž..."</string>
+ <string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="6481623830344107222">"អ្នក​បាន​គូរ​លំនាំ​ដោះ​សោ​មិន​ážáŸ’រឹមážáŸ’រូវ​ចំនួន <xliff:g id="NUMBER_0">%d</xliff:g> ដង។ \n\nព្យាយាម​ម្ដង​ទៀážâ€‹áž€áŸ’នុង​រយៈ​ពáŸáž› <xliff:g id="NUMBER_1">%d</xliff:g> វិនាទី។"</string>
+ <string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="2725973286239344555">"អ្នក​បាន​បញ្ចូល​ពាក្យ​សម្ងាážáŸ‹â€‹ážšáž”ស់​អ្នក​មិន​ážáŸ’រឹមážáŸ’រូវ <xliff:g id="NUMBER_0">%d</xliff:g> ដង។ \n\nព្យាយាម​ម្ដង​ទៀážâ€‹áž€áŸ’នុង​រយៈ​ពáŸáž› <xliff:g id="NUMBER_1">%d</xliff:g> វិនាទី។"</string>
+ <string name="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="6216672706545696955">"អ្នក​បាន​បញ្ចូល​កូដ​ PIN មិន​ážáŸ’រឹមážáŸ’រូវ​ចំនួន <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" product="tablet" msgid="9191611984625460820">"អ្នក​បាន​គូរ​លំនាំ​ដោះ​សោ​របស់​អ្នក​មិន​ážáŸ’រឹមážáŸ’រូវ​ចំនួន <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_failed_attempts_almost_glogin" product="default" msgid="2590227559763762751">"អ្នក​បាន​គូរ​លំនាំ​ដោះ​សោ​របស់​អ្នក​មិន​ážáŸ’រឹមážáŸ’រូវ <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_failed_attempts_almost_at_wipe" product="tablet" msgid="6128106399745755604">"អ្នក​បាន​ព្យាយាម​ដោះ​សោ​កុំព្យូទáŸážšâ€‹áž”ន្ទះ​មិន​ážáŸ’រឹមážáŸ’រូវ <xliff:g id="NUMBER_0">%d</xliff:g> ដង។ បន្ទាប់​ពី​ការ​ព្យាយាម​មិន​ជោគជáŸáž™â€‹ <xliff:g id="NUMBER_1">%d</xliff:g> ដង​ទៀហកុំព្យូទáŸážšâ€‹áž”ន្ទះ​នឹង​ážáŸ’រូវ​បាន​កំណážáŸ‹â€‹ážŠáž¼áž…​ចáŸáž‰â€‹áž–ី​រោងចក្រ​ឡើងវិញ ហើយ​ទិន្ននáŸáž™â€‹áž¢áŸ’នក​ប្រើ​ទាំងអស់​នឹង​បាážáŸ‹áž”ង់។"</string>
+ <string name="lockscreen_failed_attempts_almost_at_wipe" product="default" msgid="8603565142156826565">"អ្នក​បាន​ព្យាយាម​​ដោះ​សោ​​ទូរសáŸáž–្ទ​មិន​ážáŸ’រឹមážáŸ’រូវ​ <xliff:g id="NUMBER_0">%d</xliff:g> ដង។ បន្ទាប់​ពី​ការ​ព្យាយាម​មិន​ជោគជáŸáž™ <xliff:g id="NUMBER_1">%d</xliff:g> ទូរសáŸáž–្ទ​នឹង​ážáŸ’រូវ​បាន​កំណážáŸ‹â€‹ážŠáž¼áž…​ចáŸáž‰â€‹áž–ី​រោងចក្រ​ឡើងវិញ ហើយ​បាážáŸ‹áž”ង់​ទិន្ននáŸáž™â€‹áž¢áŸ’នក​ប្រើ​ទាំងអស់។"</string>
+ <string name="lockscreen_failed_attempts_now_wiping" product="tablet" msgid="280873516493934365">"អ្នក​បាន​ព្យាយាម​ដោះ​សោ​កុំព្យូទáŸážšâ€‹áž”ន្ទះ​មិន​ážáŸ’រឹមážáŸ’រូវ​ចំនួន <xliff:g id="NUMBER">%d</xliff:g> ដង។ ឥឡូវ​កុំព្យូទáŸážšâ€‹áž”ន្ទះ​នឹង​កំណážáŸ‹â€‹áž‘ៅ​លំនាំដើម​ដូច​ចáŸáž‰â€‹áž–ី​រោង​ចក្រ។"</string>
+ <string name="lockscreen_failed_attempts_now_wiping" product="default" msgid="3025504721764922246">"អ្នក​បាន​ព្យាយាម​ដោះ​សោ​ទូរសáŸáž–្ទ​មិន​ážáŸ’រឹមážáŸ’រូវ <xliff:g id="NUMBER">%d</xliff:g> ដង។ ឥឡូវ​ទូរសáŸáž–្ទ​ážáŸ’រូវ​បាន​កំណážáŸ‹â€‹áž‘ៅ​លំនាំដើម​​ដូច​ចáŸáž‰â€‹áž–ី​រោងចក្រ។"</string>
+ <string name="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"ព្យាយាម​ម្ដង​ទៀážâ€‹áž€áŸ’នុង​រយៈ <xliff:g id="NUMBER">%d</xliff:g> វិនាទី​។"</string>
+ <string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"ភ្លáŸáž…​លំនាំ​?"</string>
+ <string name="lockscreen_glogin_forgot_pattern" msgid="2588521501166032747">"ដោះ​សោ​គណនី"</string>
+ <string name="lockscreen_glogin_too_many_attempts" msgid="2751368605287288808">"ព្យាយាម​លំនាំ​ច្រើន​ពáŸáž€"</string>
+ <string name="lockscreen_glogin_instructions" msgid="3931816256100707784">"ដើម្បី​ដោះ​សោ ចូល​គណនី Google របស់​អ្នក។"</string>
+ <string name="lockscreen_glogin_username_hint" msgid="8846881424106484447">"ឈ្មោះ​អ្នក​ប្រើ (អ៊ីមែល​)"</string>
+ <string name="lockscreen_glogin_password_hint" msgid="5958028383954738528">"ពាក្យសម្ងាážáŸ‹"</string>
+ <string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"ចូល"</string>
+ <string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"ឈ្មោះ​អ្នកប្រើ ឬ​ពាក្យ​សម្ងាážáŸ‹â€‹áž˜áž·áž“​ážáŸ’រឹមážáŸ’រូវ។"</string>
+ <string name="lockscreen_glogin_account_recovery_hint" msgid="1696924763690379073">"ភ្លáŸáž…​ឈ្មោះ​អ្នក​ប្រើ ឬ​ពាក្យ​សម្ងាážáŸ‹â€‹ážšáž”ស់​អ្នក?\nមើល "<b>"google.com/accounts/recovery"</b>" ។"</string>
+ <string name="lockscreen_glogin_checking_password" msgid="7114627351286933867">"កំពុង​ពិនិážáŸ’áž™..."</string>
+ <string name="lockscreen_unlock_label" msgid="737440483220667054">"ដោះ​សោ"</string>
+ <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"បើក​សំឡáŸáž„"</string>
+ <string name="lockscreen_sound_off_label" msgid="996822825154319026">"បិទសំឡáŸáž„"</string>
+ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"បាន​ចាប់​ផ្ដើម​លំនាំ"</string>
+ <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"បាន​សម្អាážâ€‹áž›áŸ†áž“ាំ"</string>
+ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"បាន​បន្ážáŸ‚ម​ក្រឡា"</string>
+ <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"បាន​បញ្ចប់​លំនាំ"</string>
+ <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. áž’áž¶ážáž»â€‹áž€áŸ’រាហ្វិក %2$d នៃ %3$d ។"</string>
+ <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"បន្ážáŸ‚ម​ធាážáž»â€‹áž€áŸ’រាហ្វិក​។"</string>
+ <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"ទទáŸ"</string>
+ <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"បាន​ពង្រីក​ផ្ទៃ​ដោះ​សោ។"</string>
+ <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"បាន​បង្រួម​ផ្ទៃ​ដោះ​សោ។"</string>
+ <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> áž’áž¶ážáž»â€‹áž€áŸ’រាហ្វិក។"</string>
+ <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"ឧបករណáŸâ€‹áž‡áŸ’រើស​អ្នក​ប្រើ"</string>
+ <string name="keyguard_accessibility_status" msgid="8008264603935930611">"ស្ážáž¶áž“áž—áž¶áž–"</string>
+ <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"ម៉ាស៊ីន​ážáž"</string>
+ <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"ពិនិážáŸ’យ​មáŸážŒáŸ€"</string>
+ <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"បាន​ចាប់ផ្ដើម​ážáž˜áŸ’រៀប​ធាážáž»â€‹áž€áŸ’រាហ្វិក​ឡើងវិញ។"</string>
+ <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"បាន​បញ្ចប់​ការ​បង្ហាញ​ធាážáž»â€‹áž€áŸ’រាហ្វិក។"</string>
+ <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"បាន​លុប​ធាážáž»â€‹áž€áŸ’រាហ្វិក <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> ។"</string>
+ <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"ពង្រីក​ážáŸ†áž”ន់​ដោះ​សោ។"</string>
+ <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"រុញ​ដោះ​សោ។"</string>
+ <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"លំនាំ​ដោះ​សោ​។"</string>
+ <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"ដោះ​សោ​ážáž¶áž˜â€‹â€‹áž‘ម្រង់​មុážáŸ”"</string>
+ <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"កូដ PIN ដោះ​សោ។"</string>
+ <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"ពាក្យ​សម្ងាážáŸ‹â€‹ážŠáŸ„ះ​សោ​។"</string>
+ <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"ផ្ទៃ​លំនាំ។"</string>
+ <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"ផ្ទៃ​រុញ។"</string>
+ <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
+ <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
+ <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
+ <string name="granularity_label_character" msgid="7336470535385009523">"ážáž½áž¢áž€áŸ’សរ"</string>
+ <string name="granularity_label_word" msgid="7075570328374918660">"ពាក្យ"</string>
+ <string name="granularity_label_link" msgid="5815508880782488267">"ážáŸ†ážŽ"</string>
+ <string name="granularity_label_line" msgid="5764267235026120888">"បន្ទាážáŸ‹"</string>
+ <string name="hour_ampm" msgid="4584338083529355982">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
+ <string name="hour_cap_ampm" msgid="2083465992940444366">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
+ <string name="factorytest_failed" msgid="5410270329114212041">"បាន​បរាជáŸáž™â€‹áž€áŸ’នុង​ការ​សាកល្បង​រោងចក្រ"</string>
+ <string name="factorytest_not_system" msgid="4435201656767276723">"សកម្មភាព FACTORY_TEST ážáŸ’រូវ​បាន​គាំទ្រ​សម្រាប់​ážáŸ‚​កញ្ចប់​បាន​ដំឡើង​ក្នុង /system/app."</string>
+ <string name="factorytest_no_action" msgid="872991874799998561">"រក​មិន​ឃើញ​កញ្ចប់​ដែល​ផ្ដល់​សកម្មភាព FACTORY_TEST ។"</string>
+ <string name="factorytest_reboot" msgid="6320168203050791643">"ចាប់​ផ្ដើម​ឡើង​វិញ"</string>
+ <string name="js_dialog_title" msgid="1987483977834603872">"ទំពáŸážšâ€‹áž˜áž¶áž“​ចំណងជើង \"<xliff:g id="TITLE">%s</xliff:g>\" សរសáŸážšáŸ–"</string>
+ <string name="js_dialog_title_default" msgid="6961903213729667573">"JavaScript"</string>
+ <string name="js_dialog_before_unload_title" msgid="2619376555525116593">"បញ្ជាក់​ការ​រុករក"</string>
+ <string name="js_dialog_before_unload_positive_button" msgid="3112752010600484130">"ចាកចáŸáž‰â€‹áž–ី​ទំពáŸážšâ€‹áž“áŸáŸ‡"</string>
+ <string name="js_dialog_before_unload_negative_button" msgid="5614861293026099715">"នៅ​លើ​ទំពáŸážšâ€‹áž“áŸáŸ‡"</string>
+ <string name="js_dialog_before_unload" msgid="3468816357095378590">"<xliff:g id="MESSAGE">%s</xliff:g>\n\nážáž¾â€‹áž¢áŸ’នក​ប្រាកដ​ជា​ចង់​ចáŸáž‰â€‹áž–ី​ទំពáŸážšâ€‹áž“áŸáŸ‡â€‹áž¬?"</string>
+ <string name="save_password_label" msgid="6860261758665825069">"បញ្ជាក់"</string>
+ <string name="double_tap_toast" msgid="4595046515400268881">"ជំនួយ៖ ប៉ះ​ពីរ​ដង ដើម្បី​ពង្រីក និង​បង្រួម។"</string>
+ <string name="autofill_this_form" msgid="4616758841157816676">"បំពáŸáž‰â€‹ážŸáŸ’ážœáŸáž™â€‹áž”្រវážáŸ’ážáž·"</string>
+ <string name="setup_autofill" msgid="7103495070180590814">"រៀបចំ​ការ​បំពáŸáž‰â€‹ážŸáŸ’ážœáŸáž™â€‹áž”្រវážáŸ’ážáž·"</string>
+ <string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
+ <string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
+ <string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
+ <string name="autofill_address_summary_format" msgid="4874459455786827344">"$1$2$3"</string>
+ <string name="autofill_province" msgid="2231806553863422300">"ážáŸážáŸ’áž"</string>
+ <string name="autofill_postal_code" msgid="4696430407689377108">"áž›áŸážâ€‹áž”្រៃសណីយáŸ"</string>
+ <string name="autofill_state" msgid="6988894195520044613">"រដ្ឋ"</string>
+ <string name="autofill_zip_code" msgid="8697544592627322946">"កូដ​ážáŸ†áž”ន់"</string>
+ <string name="autofill_county" msgid="237073771020362891">"ប្រទáŸážŸ"</string>
+ <string name="autofill_island" msgid="4020100875984667025">"កោះ"</string>
+ <string name="autofill_district" msgid="8400735073392267672">"ស្រុក"</string>
+ <string name="autofill_department" msgid="5343279462564453309">"ផ្នែក"</string>
+ <string name="autofill_prefecture" msgid="2028499485065800419">"Prefecture"</string>
+ <string name="autofill_parish" msgid="8202206105468820057">"Parish"</string>
+ <string name="autofill_area" msgid="3547409050889952423">"ážáŸ†áž”ន់"</string>
+ <string name="autofill_emirate" msgid="2893880978835698818">"Emirate"</string>
+ <string name="permlab_readHistoryBookmarks" msgid="3775265775405106983">"អាន​ប្រវážáŸ’ážáž· និង​ចំណាំ​បណ្ដាញ"</string>
+ <string name="permdesc_readHistoryBookmarks" msgid="8462378226600439658">"ឲ្យ​កម្មវិធី​អាន​ប្រវážáŸ’ážáž· URLs ទាំង​អស់​ដែល​កម្មវិធី​អ៊ីនធឺណិážâ€‹áž”ាន​ទស្សនា ព្រម​ទាំង​ចំណាំ​របស់​​កម្មវិធី​អ៊ីនធឺណិážáŸ” ចំណាំ៖ សិទ្ធិ​នáŸáŸ‡â€‹â€‹áž˜áž·áž“​អាច​ážáŸ’រូវ​បាន​អនុវážáŸ’ážâ€‹ážŠáŸ„យ​កម្មវិធី​អ៊ីនធឺណិážâ€‹áž—ាគី​ទីបី ឬ​កម្មវិធី​ដែល​មាន​សមážáŸ’ážáž—ាព​រុករក​បណ្ដាញ។"</string>
+ <string name="permlab_writeHistoryBookmarks" msgid="3714785165273314490">"សរសáŸážšâ€‹áž…ំណាំ និង​ប្រវážáŸ’ážáž·â€‹áž”ណ្ដាញ"</string>
+ <string name="permdesc_writeHistoryBookmarks" product="tablet" msgid="6825527469145760922">"ឲ្យ​កម្មវិធី​កែ​ប្រវážáŸ’ážáž·â€‹áž€áž˜áŸ’មវិធី​អ៊ីនធឺណិហឬ​ចំណាំ​ដែល​មាន​ក្នុង​កុំព្យូទáŸážšâ€‹áž”ន្ទះ​របស់​អ្នក។ វា​អាច​ឲ្យ​កម្មវិធី​លុប ឬ​កែ​​ទិន្ននáŸáž™â€‹áž€áž˜áŸ’មវិធី​អ៊ីនធឺណិážáŸ” ចំណាំ៖ សិទ្ធិ​នáŸáŸ‡â€‹â€‹áž¢áž¶áž…​កážáŸ‹â€‹ážŸáž˜áŸ’គាល់​ážáž¶â€‹ážáŸ’រូវ​បាន​អនុវážáŸ’ážâ€‹ážŠáŸ„យ​កម្មវិធី​អ៊ីនធឺណិážâ€‹áž—ាគី​ទី​បី ឬ​កម្មវិធី​ផ្សáŸáž„​ដែល​មាន​សមážáŸ’ážáž—ាព​​រុករក​បណ្ដាញ។"</string>
+ <string name="permdesc_writeHistoryBookmarks" product="default" msgid="8497389531014185509">"ឲ្យ​កម្មវិធី​កែ​ប្រវážáŸ’ážáž· ឬ​ចំណាំ​របស់​កម្មវិធី​អ៊ីនធឺណិážâ€‹ážŠáŸ‚ល​បាន​រក្សាទុក​ក្នុង​ទូរសáŸáž–្ទ​​របស់​អ្នក។ កម្មវិធី​ព្យាបាទ​អាច​ប្រើ​វា​ដើម្បី​លុប ឬ​កែ​ទិន្ននáŸáž™â€‹áž“ៃ​កម្មវិធី​អ៊ីនធឺណិážâ€‹ážšáž”ស់​អ្នក។ ចំណាំ៖ សិទ្ធិ​នáŸáŸ‡â€‹áž¢áž¶áž…​ážáŸ’រូវ​បាន​បង្ážáŸ†â€‹ážŠáŸ„យ​កម្មវិធី​អ៊ីនធឺណិážâ€‹â€‹áž—ាគី​ទីបី​ ឬ​​កម្មវិធី​ផ្សáŸáž„​ដែល​មាន​សមážáŸ’ážáž—ាព​រុករក​បណ្ដាញ។ស"</string>
+ <string name="permlab_setAlarm" msgid="1379294556362091814">"កំណážáŸ‹â€‹ážŸáŸ†áž¡áŸáž„​រោទáŸ"</string>
+ <string name="permdesc_setAlarm" msgid="316392039157473848">"ឲ្យ​កម្មវិធី​កំណážáŸ‹â€‹â€‹ážŸáŸ†áž¡áŸáž„​រោទáŸâ€‹áž€áŸ’នុង​កម្មវិធី​នាឡិកា​រោទáŸâ€‹áž”ាន​ដំឡើង។​ កម្មវិធី​នាឡិកា​រោទáŸâ€‹áž˜áž½áž™â€‹áž…ំនួន​អាច​មិន​អនុវážáŸ’ážâ€‹áž›áž€áŸ’ážážŽáŸˆâ€‹áž“áŸáŸ‡áŸ”"</string>
+ <string name="permlab_addVoicemail" msgid="5525660026090959044">"បន្ážáŸ‚ម​សារ​ជា​សំឡáŸáž„"</string>
+ <string name="permdesc_addVoicemail" msgid="6604508651428252437">"ឲ្យ​កម្មវិធី​បន្ážáŸ‚ម​សារ​ទៅ​ប្រអប់​ទទួល​សារ​ជា​សំឡáŸáž„​របស់​អ្នក។"</string>
+ <string name="permlab_writeGeolocationPermissions" msgid="5962224158955273932">"កែ​សិទ្ធិ​ទីážáž¶áŸ†áž„​ភូមិសាស្ážáŸ’រ​របស់​​កម្មវិធី​អ៊ីនធឺណិáž"</string>
+ <string name="permdesc_writeGeolocationPermissions" msgid="1083743234522638747">"ឲ្យ​កម្មវិធី​កែ​​សិទ្ធិ​ទី​ážáž¶áŸ†áž„​ភូមិសាស្ážáŸ’រ​របស់​កម្មវិធី​អ៊ីនធឺណិážáŸ” កម្មវិធី​ព្យាបាទ​អាច​ប្រើ​វា ដើម្បី​ឲ្យ​ផ្ញើ​ពáŸážáŸŒáž˜áž¶áž“​ទីážáž¶áŸ†áž„​ទៅ​ážáŸ†áž”ន់បណ្ដាញ​ដោយ​បំពាន។"</string>
+ <string name="permlab_packageVerificationAgent" msgid="5568139100645829117">"ផ្ទៀងផ្ទាážáŸ‹â€‹áž€áž‰áŸ’ចប់"</string>
+ <string name="permdesc_packageVerificationAgent" msgid="8437590190990843381">"ឲ្យ​កម្មវិធី​ផ្ទៀងផ្ទាážáŸ‹â€‹áž€áž‰áŸ’ចប់​ដែល​អាច​ដំឡើង​បាន។"</string>
+ <string name="permlab_bindPackageVerifier" msgid="4187786793360326654">"ចង​ទៅ​កម្មវិធី​ផ្ទៀងផ្ទាážáŸ‹â€‹áž€áž‰áŸ’ចប់"</string>
+ <string name="permdesc_bindPackageVerifier" msgid="3180741773233862126">"ឲ្យ​ម្ចាស់​ស្នើ​កម្មវិធី​ផ្ទៀងផ្ទាážáŸ‹â€‹áž€áž‰áŸ’ចប់។ មិន​គួរ​ចាំបាច់​សម្រាប់​កម្មវិធី​ធម្មážáž¶â€‹áž‘áŸáŸ”"</string>
+ <string name="permlab_serialPort" msgid="546083327654631076">"ចូល​ដំណើរការ​ច្រក​ស៊áŸážšáž¸"</string>
+ <string name="permdesc_serialPort" msgid="2991639985224598193">"អនុញ្ញាážâ€‹áž±áŸ’យ​ចូល​ដំណើរ​ការ​ទៅ​កាន់​ច្រក​សៀរៀល​ដោយ​ប្រើ SerialManager API ។"</string>
+ <string name="permlab_accessContentProvidersExternally" msgid="5077774297943409285">"ចូល​ដំណើរការ​ក្រុមហ៊ុន​ផ្ដល់​មាážáž·áž€áž¶â€‹ážáž¶áž„​ក្រៅ"</string>
+ <string name="permdesc_accessContentProvidersExternally" msgid="4544346486697853685">"ឲ្យ​ម្ចាស់​ចូល​ដំណើរការ​ក្រុមហ៊ុន​ផ្ដល់​មាážáž·áž€áž¶â€‹áž–ី​សែល។ មិន​គួរ​ចាំបាច់​សម្រាប់​កម្មវិធី​ធម្មážáž¶â€‹áž‘áŸáŸ”"</string>
+ <string name="permlab_updateLock" msgid="3527558366616680889">"ការ​ពារ​បច្ចុប្បន្នភាព​ឧបករណáŸâ€‹ážŸáŸ’ážœáŸáž™â€‹áž”្រវážáŸ’ážáž·"</string>
+ <string name="permdesc_updateLock" msgid="1655625832166778492">"ឲ្យ​ម្ចាស់​ផ្ដល់​ពáŸážáŸŒáž˜áž¶áž“​ទៅ​ប្រពáŸáž“្ធ​អំពី​ពáŸáž›ážœáŸáž›áž¶â€‹ážŠáŸ‚ល​ល្អ​សម្រាប់​ចាប់ផ្ដើម​ឡើងវិញ​ដោយ​គ្មាន​អន្ážážšáž€áž˜áŸ’ម ដើម្បី​ធ្វើ​បច្ចុប្បន្ន​ឧបករណáŸáŸ”"</string>
+ <string name="save_password_message" msgid="767344687139195790">"ážáž¾â€‹áž¢áŸ’នក​ចង់​ឲ្យ​កម្មវិធី​អ៊ីនធឺណិážâ€‹áž…ងចាំ​ពាក្យ​សម្ងាážáŸ‹â€‹áž“áŸáŸ‡?"</string>
+ <string name="save_password_notnow" msgid="6389675316706699758">"មិនមែន​ឥឡូវ"</string>
+ <string name="save_password_remember" msgid="6491879678996749466">"ចងចាំ"</string>
+ <string name="save_password_never" msgid="8274330296785855105">"កុំ"</string>
+ <string name="open_permission_deny" msgid="7374036708316629800">"អ្នក​មិន​មាន​សិទ្ធិ ដើម្បី​បើក​ទំពáŸážšâ€‹áž“áŸáŸ‡áŸ”"</string>
+ <string name="text_copied" msgid="4985729524670131385">"បាន​ចម្លង​អážáŸ’ážáž”ទ​ទៅ​ក្ដារ​ážáž˜áŸ’បៀážâ€‹ážáŸ’ទាស់។"</string>
+ <string name="more_item_label" msgid="4650918923083320495">"ច្រើន​ទៀáž"</string>
+ <string name="prepend_shortcut_label" msgid="2572214461676015642">"ម៉ឺនុយ +"</string>
+ <string name="menu_space_shortcut_label" msgid="2410328639272162537">"ដកឃ្លា"</string>
+ <string name="menu_enter_shortcut_label" msgid="2743362785111309668">"enter"</string>
+ <string name="menu_delete_shortcut_label" msgid="3658178007202748164">"លុប"</string>
+ <string name="search_go" msgid="8298016669822141719">"ស្វែងរក"</string>
+ <string name="searchview_description_search" msgid="6749826639098512120">"ស្វែងរក"</string>
+ <string name="searchview_description_query" msgid="5911778593125355124">"ស្វែងរក​សំណួរ"</string>
+ <string name="searchview_description_clear" msgid="1330281990951833033">"សម្អាážâ€‹ážŸáŸ†ážŽáž½ážš"</string>
+ <string name="searchview_description_submit" msgid="2688450133297983542">"ដាក់​​​ស្នើ​សំណួរ"</string>
+ <string name="searchview_description_voice" msgid="2453203695674994440">"ការស្វែងរក​សំឡáŸáž„"</string>
+ <string name="enable_explore_by_touch_warning_title" msgid="7460694070309730149">"បើក​ការ​រក​មើល ដោយ​ប៉ះ?"</string>
+ <string name="enable_explore_by_touch_warning_message" product="tablet" msgid="8655887539089910577">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g>ចង់​បើក​ការ​រុករ​ក​ដោយ​ប៉ះ។ áž–áŸáž›â€‹ážšáž»áž€ážšáž€â€‹ážŠáŸ„យ​ប៉ះ​ážáŸ’រូវ​បាន​បើក​​ អ្នក​អាច​ស្ដាប់​ឮ​ ឬ​ឃើញ​ការ​ពណ៌នា​អ្វី​ដែល​នៅ​ក្រោម​ម្រាមដៃ​របស់​អ្នក​​ ឬ​អនុវážáŸ’ážâ€‹áž€áž¶áž™ážœáž·áž€áž¶ážšâ€‹ážŠáž¾áž˜áŸ’បី​មាន​អន្ážážšáž€áž˜áŸ’ម​ជា​មួយ​កុំព្យូទáŸážšâ€‹áž”ន្ទះ។"</string>
+ <string name="enable_explore_by_touch_warning_message" product="default" msgid="2708199672852373195">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> ចង់​បើក​ការ​រុករ​ក​ដោយ​ប៉ះ។ áž–áŸáž›â€‹ážšáž»áž€ážšáž€â€‹ážŠáŸ„យ​ប៉ះ​ážáŸ’រូវ​បាន​បើក​​ អ្នក​អាច​ស្ដាប់​ឮ​ ឬ​ឃើញ​ការ​ពណ៌នា​អ្វី​ដែល​នៅ​ក្រោម​ម្រាមដៃ​របស់​អ្នក​​ ឬ​អនុវážáŸ’ážâ€‹áž€áž¶áž™ážœáž·áž€áž¶ážšâ€‹ážŠáž¾áž˜áŸ’បី​មាន​អន្ážážšáž€áž˜áŸ’ម​ជា​មួយ​ទូរសáŸáž–្ទ។"</string>
+ <string name="oneMonthDurationPast" msgid="7396384508953779925">"1 ážáŸ‚​មុន"</string>
+ <string name="beforeOneMonthDurationPast" msgid="909134546836499826">"មុន​ពáŸáž› ១ ážáŸ‚​មុន"</string>
+ <plurals name="num_seconds_ago">
+ <item quantity="one" msgid="4869870056547896011">"១ វិនាទី​មុន"</item>
+ <item quantity="other" msgid="3903706804349556379">"<xliff:g id="COUNT">%d</xliff:g> វិនាទី​មុន"</item>
+ </plurals>
+ <plurals name="num_minutes_ago">
+ <item quantity="one" msgid="3306787433088810191">"១ នាទី​មុន"</item>
+ <item quantity="other" msgid="2176942008915455116">"<xliff:g id="COUNT">%d</xliff:g> នាទី​​មុន"</item>
+ </plurals>
+ <plurals name="num_hours_ago">
+ <item quantity="one" msgid="9150797944610821849">"១ ម៉ោង​មុន"</item>
+ <item quantity="other" msgid="2467273239587587569">"<xliff:g id="COUNT">%d</xliff:g> ម៉ោង​មុន"</item>
+ </plurals>
+ <plurals name="last_num_days">
+ <item quantity="other" msgid="3069992808164318268">"<xliff:g id="COUNT">%d</xliff:g> ážáŸ’ងៃ​ចុងក្រោយ"</item>
+ </plurals>
+ <string name="last_month" msgid="3959346739979055432">"ážáŸ‚​មុន"</string>
+ <string name="older" msgid="5211975022815554840">"ចាស់​ជាង"</string>
+ <plurals name="num_days_ago">
+ <item quantity="one" msgid="861358534398115820">"ម្សិលមិញ"</item>
+ <item quantity="other" msgid="2479586466153314633">"<xliff:g id="COUNT">%d</xliff:g> ážáŸ’ងៃ​មុន"</item>
+ </plurals>
+ <plurals name="in_num_seconds">
+ <item quantity="one" msgid="2729745560954905102">"ក្នុង​រយៈ​ពáŸáž› ១ វិនាទី"</item>
+ <item quantity="other" msgid="1241926116443974687">"ក្នុង​រយៈ​ពáŸáž› <xliff:g id="COUNT">%d</xliff:g> វិនាទី"</item>
+ </plurals>
+ <plurals name="in_num_minutes">
+ <item quantity="one" msgid="8793095251325200395">"ក្នុង​រយៈពáŸáž› ១ នាទី"</item>
+ <item quantity="other" msgid="3330713936399448749">"រយៈពáŸáž› <xliff:g id="COUNT">%d</xliff:g> នាទី"</item>
+ </plurals>
+ <plurals name="in_num_hours">
+ <item quantity="one" msgid="7164353342477769999">"រយៈពáŸáž› ១ ម៉ោង"</item>
+ <item quantity="other" msgid="547290677353727389">"រយៈពáŸáž› <xliff:g id="COUNT">%d</xliff:g> ម៉ោង"</item>
+ </plurals>
+ <plurals name="in_num_days">
+ <item quantity="one" msgid="5413088743009839518">"ážáŸ’ងៃស្អែក"</item>
+ <item quantity="other" msgid="5109449375100953247">"រយៈពáŸáž› <xliff:g id="COUNT">%d</xliff:g> ážáŸ’ងៃ"</item>
+ </plurals>
+ <plurals name="abbrev_num_seconds_ago">
+ <item quantity="one" msgid="1849036840200069118">"១ វិនាទី​មុន"</item>
+ <item quantity="other" msgid="3699169366650930415">"<xliff:g id="COUNT">%d</xliff:g> វិនាទី​មុន"</item>
+ </plurals>
+ <plurals name="abbrev_num_minutes_ago">
+ <item quantity="one" msgid="6361490147113871545">"១ នាទី​មុន"</item>
+ <item quantity="other" msgid="851164968597150710">"<xliff:g id="COUNT">%d</xliff:g> នាទី​​មុន"</item>
+ </plurals>
+ <plurals name="abbrev_num_hours_ago">
+ <item quantity="one" msgid="4796212039724722116">"១ ម៉ោង​មុន"</item>
+ <item quantity="other" msgid="6889970745748538901">"<xliff:g id="COUNT">%d</xliff:g> ម៉ោង​មុន"</item>
+ </plurals>
+ <plurals name="abbrev_num_days_ago">
+ <item quantity="one" msgid="8463161711492680309">"ម្សិលមិញ"</item>
+ <item quantity="other" msgid="3453342639616481191">"<xliff:g id="COUNT">%d</xliff:g> ážáŸ’ងៃ​​មុន"</item>
+ </plurals>
+ <plurals name="abbrev_in_num_seconds">
+ <item quantity="one" msgid="5842225370795066299">"ក្នុង​ពáŸáž›â€‹ 1 វិនាទី"</item>
+ <item quantity="other" msgid="5495880108825805108">"ក្នុង​ពáŸáž› <xliff:g id="COUNT">%d</xliff:g> វិនាទី"</item>
+ </plurals>
+ <plurals name="abbrev_in_num_minutes">
+ <item quantity="one" msgid="562786149928284878">"ក្នុង​ពáŸáž› 1 នាទី"</item>
+ <item quantity="other" msgid="4216113292706568726">"នៅ​រយៈពáŸáž› <xliff:g id="COUNT">%d</xliff:g> នាទី"</item>
+ </plurals>
+ <plurals name="abbrev_in_num_hours">
+ <item quantity="one" msgid="3274708118124045246">"ក្នុង​រយៈ​ពáŸáž› ១ ម៉ោង"</item>
+ <item quantity="other" msgid="3705373766798013406">"ក្នុង​រយៈ​ពáŸáž› <xliff:g id="COUNT">%d</xliff:g> ម៉ោង"</item>
+ </plurals>
+ <plurals name="abbrev_in_num_days">
+ <item quantity="one" msgid="2178576254385739855">"ážáŸ’ងៃស្អែក"</item>
+ <item quantity="other" msgid="2973062968038355991">"ក្នុង​រយៈ​ពáŸáž› <xliff:g id="COUNT">%d</xliff:g> ážáŸ’ងៃ"</item>
+ </plurals>
+ <string name="preposition_for_date" msgid="9093949757757445117">"នៅ <xliff:g id="DATE">%s</xliff:g>"</string>
+ <string name="preposition_for_time" msgid="5506831244263083793">"នៅ​ម៉ោង <xliff:g id="TIME">%s</xliff:g>"</string>
+ <string name="preposition_for_year" msgid="5040395640711867177">"ក្នុង​ឆ្នាំ <xliff:g id="YEAR">%s</xliff:g>"</string>
+ <string name="day" msgid="8144195776058119424">"ážáŸ’ងៃ"</string>
+ <string name="days" msgid="4774547661021344602">"​ážáŸ’ងៃ"</string>
+ <string name="hour" msgid="2126771916426189481">"ម៉ោង"</string>
+ <string name="hours" msgid="894424005266852993">"ម៉ោង"</string>
+ <string name="minute" msgid="9148878657703769868">"នាទី"</string>
+ <string name="minutes" msgid="5646001005827034509">"នាទី"</string>
+ <string name="second" msgid="3184235808021478">"វិនាទី"</string>
+ <string name="seconds" msgid="3161515347216589235">"វិនាទី"</string>
+ <string name="week" msgid="5617961537173061583">"សប្ដាហáŸ"</string>
+ <string name="weeks" msgid="6509623834583944518">"សប្ដាហáŸ"</string>
+ <string name="year" msgid="4001118221013892076">"ឆ្នាំ"</string>
+ <string name="years" msgid="6881577717993213522">"ឆ្នាំ"</string>
+ <plurals name="duration_seconds">
+ <item quantity="one" msgid="6962015528372969481">"1 វិនាទី"</item>
+ <item quantity="other" msgid="1886107766577166786">"<xliff:g id="COUNT">%d</xliff:g> វិនាទី"</item>
+ </plurals>
+ <plurals name="duration_minutes">
+ <item quantity="one" msgid="4915414002546085617">"១ នាទី"</item>
+ <item quantity="other" msgid="3165187169224908775">"<xliff:g id="COUNT">%d</xliff:g> នាទី"</item>
+ </plurals>
+ <plurals name="duration_hours">
+ <item quantity="one" msgid="8917467491248809972">"១ ម៉ោង"</item>
+ <item quantity="other" msgid="3863962854246773930">"<xliff:g id="COUNT">%d</xliff:g> ម៉ោង"</item>
+ </plurals>
+ <string name="VideoView_error_title" msgid="3534509135438353077">"បញ្ហា​វីដáŸáž¢áž¼"</string>
+ <string name="VideoView_error_text_invalid_progressive_playback" msgid="3186670335938670444">"វីដáŸáž¢áž¼â€‹áž“áŸáŸ‡â€‹áž˜áž·áž“​ážáŸ’រឹមážáŸ’រូវ​សម្រាប់​​ចរន្ážâ€‹áž…ូល​ឧបករណáŸâ€‹áž“áŸáŸ‡áŸ”"</string>
+ <string name="VideoView_error_text_unknown" msgid="3450439155187810085">"មិន​អាច​ចាក់​វីដáŸáž¢áž¼â€‹áž“áŸáŸ‡áŸ”"</string>
+ <string name="VideoView_error_button" msgid="2822238215100679592">"យល់​ព្រម"</string>
+ <string name="relative_time" msgid="1818557177829411417">"<xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="noon" msgid="7245353528818587908">"រសៀល"</string>
+ <string name="Noon" msgid="3342127745230013127">"រសៀល"</string>
+ <string name="midnight" msgid="7166259508850457595">"កណ្ដាលអធ្រាážáŸ’ážš"</string>
+ <string name="Midnight" msgid="5630806906897892201">"កណ្ដាល​អធ្រាážáŸ’ážš"</string>
+ <string name="elapsed_time_short_format_mm_ss" msgid="4431555943828711473">"<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" msgid="1846071997616654124">"<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" msgid="6876518925844129331">"ជ្រើស​ទាំងអស់"</string>
+ <string name="cut" msgid="3092569408438626261">"កាážáŸ‹"</string>
+ <string name="copy" msgid="2681946229533511987">"ចម្លង"</string>
+ <string name="paste" msgid="5629880836805036433">"បិទ​ភ្ជាប់"</string>
+ <string name="replace" msgid="5781686059063148930">"ជំនួស..."</string>
+ <string name="delete" msgid="6098684844021697789">"លុប"</string>
+ <string name="copyUrl" msgid="2538211579596067402">"ចម្លង URL"</string>
+ <string name="selectTextMode" msgid="1018691815143165326">"ជ្រើស​អážáŸ’ážáž”áž‘"</string>
+ <string name="textSelectionCABTitle" msgid="5236850394370820357">"ការ​ជ្រើស​អážáŸ’ážáž”áž‘"</string>
+ <string name="addToDictionary" msgid="4352161534510057874">"បន្ážáŸ‚ម​ទៅ​វចនានុក្រម"</string>
+ <string name="deleteText" msgid="6979668428458199034">"លុប"</string>
+ <string name="inputMethod" msgid="1653630062304567879">"វិធីសាស្ážáŸ’រ​បញ្ចូល"</string>
+ <string name="editTextMenuTitle" msgid="4909135564941815494">"សកម្មភាព​អážáŸ’ážáž”áž‘"</string>
+ <string name="low_internal_storage_view_title" msgid="5576272496365684834">"អស់​ទំហំ​ផ្ទុក"</string>
+ <string name="low_internal_storage_view_text" msgid="6640505817617414371">"មុážáž„ារ​ប្រពáŸáž“្ធ​មួយ​ចំនួន​អាច​មិន​ដំណើរការ"</string>
+ <string name="app_running_notification_title" msgid="8718335121060787914">"<xliff:g id="APP_NAME">%1$s</xliff:g> កំពុង​ដំណើរការ"</string>
+ <string name="app_running_notification_text" msgid="4653586947747330058">"ប៉ះ​ ដើម្បី​មើល​ពáŸážáŸŒáž˜áž¶áž“​បន្ážáŸ‚ម ឬ​បញ្ឈប់​កម្មវិធី។"</string>
+ <string name="ok" msgid="5970060430562524910">"យល់​ព្រម"</string>
+ <string name="cancel" msgid="6442560571259935130">"បោះ​បង់"</string>
+ <string name="yes" msgid="5362982303337969312">"យល់​ព្រម"</string>
+ <string name="no" msgid="5141531044935541497">"បោះ​បង់"</string>
+ <string name="dialog_alert_title" msgid="2049658708609043103">"ប្រយáŸážáŸ’áž“"</string>
+ <string name="loading" msgid="7933681260296021180">"កំពុង​ផ្ទុក..."</string>
+ <string name="capital_on" msgid="1544682755514494298">"បើក"</string>
+ <string name="capital_off" msgid="6815870386972805832">"បិទ"</string>
+ <string name="whichApplication" msgid="4533185947064773386">"បញ្ចប់​សកម្មភាព​ដោយ​ប្រើ"</string>
+ <string name="alwaysUse" msgid="4583018368000610438">"ប្រើ​ážáž¶áž˜â€‹áž›áŸ†áž“ាំដើម​សម្រាប់​សកម្មភាព​នáŸáŸ‡áŸ”"</string>
+ <string name="clearDefaultHintMsg" msgid="3252584689512077257">"សម្អាážâ€‹áž›áŸ†áž“ាំដើម​ក្នុង​ការកំណážáŸ‹â€‹áž”្រពáŸáž“្ធ &gt; កម្មវិធី &gt; ទាញ​យក។"</string>
+ <string name="chooseActivity" msgid="7486876147751803333">"ជ្រើស​សកម្មភាព"</string>
+ <string name="chooseUsbActivity" msgid="6894748416073583509">"ជ្រើស​កម្មវិធី​សម្រាប់​ឧបករណáŸâ€‹áž™áž¼áž¢áŸážŸáž”៊ី"</string>
+ <string name="noApplications" msgid="2991814273936504689">"គ្មាន​កម្មវិធី​អាច​អនុវážáŸ’ážâ€‹ážŸáž€áž˜áŸ’មភាព​នáŸáŸ‡áŸ”"</string>
+ <string name="aerr_title" msgid="1905800560317137752"></string>
+ <string name="aerr_application" msgid="932628488013092776">"ដោយ​បរាជáŸáž™ <xliff:g id="APPLICATION">%1$s</xliff:g> បាន​បញ្ឈប់។"</string>
+ <string name="aerr_process" msgid="4507058997035697579">"ជា​អកុសល ដំណើរការ <xliff:g id="PROCESS">%1$s</xliff:g> បាន​បញ្ឈប់។"</string>
+ <string name="anr_title" msgid="4351948481459135709"></string>
+ <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> មិន​ឆ្លើយážáž”។\n\nážáž¾â€‹áž¢áŸ’នក​ចង់​បិទ​វា​ឬ?"</string>
+ <string name="anr_activity_process" msgid="5776209883299089767">"សកម្មភាព <xliff:g id="ACTIVITY">%1$s</xliff:g> មិន​ឆ្លើយážáž”។\n\nážáž¾â€‹áž¢áŸ’នក​ចង់​បិទ​វា?"</string>
+ <string name="anr_application_process" msgid="8941757607340481057">"<xliff:g id="APPLICATION">%1$s</xliff:g> មិន​ឆ្លើយážáž”។ ážáž¾â€‹áž¢áŸ’នក​ចង់​បិទ​វា?"</string>
+ <string name="anr_process" msgid="6513209874880517125">"ដំណើរការ <xliff:g id="PROCESS">%1$s</xliff:g> មិន​ឆ្លើយážáž”។ \n\nážáž¾â€‹áž¢áŸ’នក​ចង់​បិទ​វា​ឬ?"</string>
+ <string name="force_close" msgid="8346072094521265605">"យល់​ព្រម"</string>
+ <string name="report" msgid="4060218260984795706">"របាយការណáŸ"</string>
+ <string name="wait" msgid="7147118217226317732">"រង់ចាំ"</string>
+ <string name="webpage_unresponsive" msgid="3272758351138122503">"ទំពáŸážšâ€‹áž€áŸ’លាយ​ជា​មិន​ឆ្លើយážáž”។\n\nážáž¾â€‹áž¢áŸ’នក​​ចង់​បិទ​វា?"</string>
+ <string name="launch_warning_title" msgid="1547997780506713581">"បាន​ប្ដូរ​ទិស​កម្មវិធី"</string>
+ <string name="launch_warning_replace" msgid="6202498949970281412">"<xliff:g id="APP_NAME">%1$s</xliff:g> ឥឡូវ​កំពុង​ដំណើរការ។"</string>
+ <string name="launch_warning_original" msgid="188102023021668683">"<xliff:g id="APP_NAME">%1$s</xliff:g> ážáŸ’រូវ​បាន​ចាប់ផ្ដើម​ពី​ដំបូង។"</string>
+ <string name="screen_compat_mode_scale" msgid="3202955667675944499">"មាážáŸ’រដ្ឋាន"</string>
+ <string name="screen_compat_mode_show" msgid="4013878876486655892">"បង្ហាញ​ជា​និច្ច"</string>
+ <string name="screen_compat_mode_hint" msgid="1064524084543304459">"បើក​វា​ឡើងវិញ​ក្នុង​ការ​កំណážáŸ‹â€‹áž”្រពáŸáž“្ធ &gt; កម្មវិធី &gt; ទាញ​យក។"</string>
+ <string name="smv_application" msgid="3307209192155442829">"កម្មវិធី <xliff:g id="APPLICATION">%1$s</xliff:g> (ដំណើរការ <xliff:g id="PROCESS">%2$s</xliff:g>) បាន​បំពាន​គោលនយោបាយ​របៀប​ážáž¹áž„រ៉ឹង​អនុវážáŸ’ážâ€‹ážŠáŸ„យ​ážáŸ’លួន​​ឯង។"</string>
+ <string name="smv_process" msgid="5120397012047462446">"ដំណើរការ <xliff:g id="PROCESS">%1$s</xliff:g> បាន​បំពាន​គោលនយោបាយ​​របៀប​​ážáž¹áž„​រឹង​​​បង្ážáŸ†â€‹ážŠáŸ„យ​ážáŸ’លួន​ឯង"</string>
+ <string name="android_upgrading_title" msgid="1584192285441405746">"Android កំពុង​ធ្វើ​បច្ចុប្បន្នភាព..."</string>
+ <string name="android_upgrading_apk" msgid="7904042682111526169">"ធ្វើ​ឲ្យ​កម្មវិធី​ប្រសើរ​ឡើង <xliff:g id="NUMBER_0">%1$d</xliff:g> នៃ <xliff:g id="NUMBER_1">%2$d</xliff:g> ។"</string>
+ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"ចាប់ផ្ដើម​កម្មវិធី។"</string>
+ <string name="android_upgrading_complete" msgid="1405954754112999229">"បញ្ចប់​ការ​ចាប់ផ្ដើម។"</string>
+ <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> កំពុង​ដំណើរការ"</string>
+ <string name="heavy_weight_notification_detail" msgid="1721681741617898865">"ប៉ះ​ ដើម្បី​ប្ដូរ​​​កម្មវិធី"</string>
+ <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"ប្ដូរ​កម្មវិធី?"</string>
+ <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"កម្មវិធី​ផ្សáŸáž„​កំពុង​ដំណើរការ​រួច​ហើយ​ ដែល​ážáž˜áŸ’រូវ​ឲ្យ​បញ្ឈប់​មុន​ពáŸáž›â€‹áž¢áŸ’នក​អាច​ចាប់ផ្ដើម​ážáŸ’មី។"</string>
+ <string name="old_app_action" msgid="493129172238566282">"ážáŸ’រឡប់​ទៅ <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+ <string name="old_app_description" msgid="2082094275580358049">"កុំ​ចាប់ផ្ដើម​កម្មវិធី​ážáŸ’មី។"</string>
+ <string name="new_app_action" msgid="5472756926945440706">"ចាប់ផ្ដើម <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+ <string name="new_app_description" msgid="1932143598371537340">"បញ្ឈប់​កម្មវិធី​ចាស់​ដោយ​មិន​រក្សាទុក"</string>
+ <string name="sendText" msgid="5209874571959469142">"ជ្រើស​សកម្មភាព​សម្រាប់​អážáŸ’ážáž”áž‘"</string>
+ <string name="volume_ringtone" msgid="6885421406845734650">"កម្រិážâ€‹ážŸáŸ†áž¡áŸáž„​រោទáŸ"</string>
+ <string name="volume_music" msgid="5421651157138628171">"កម្រិážâ€‹ážŸáŸ†áž¡áŸáž„​មáŸážŒáŸ€"</string>
+ <string name="volume_music_hint_playing_through_bluetooth" msgid="9165984379394601533">"ចាក់​ážáž¶áž˜â€‹áž”៊្លូធូស"</string>
+ <string name="volume_music_hint_silent_ringtone_selected" msgid="8310739960973156272">"កំណážáŸ‹â€‹ážŸáŸ†áž¡áŸáž„​រោទáŸâ€‹ážŸáŸ’ងាážáŸ‹"</string>
+ <string name="volume_call" msgid="3941680041282788711">"កម្រិážâ€‹ážŸáŸ†áž¡áŸáž„​ហៅ​ចូល"</string>
+ <string name="volume_bluetooth_call" msgid="2002891926351151534">"កម្រិážâ€‹ážŸáŸ†áž¡áŸáž„​ហៅ​ចូល​ážáž¶áž˜â€‹áž”៊្លូធូស"</string>
+ <string name="volume_alarm" msgid="1985191616042689100">"កម្រិážâ€‹ážŸáŸ†áž¡áŸáž„​រោទáŸ"</string>
+ <string name="volume_notification" msgid="2422265656744276715">"កម្រិážâ€‹ážŸáŸ†áž¡áŸáž„​ការ​ជូន​ដំណឹង"</string>
+ <string name="volume_unknown" msgid="1400219669770445902">"កម្រិážâ€‹ážŸáŸ†áž¡áŸáž„"</string>
+ <string name="volume_icon_description_bluetooth" msgid="6538894177255964340">"កម្រិážâ€‹ážŸáŸ†áž¡áŸáž„​ប៊្លូធូស"</string>
+ <string name="volume_icon_description_ringer" msgid="3326003847006162496">"កម្រិážâ€‹ážŸáŸ†áž¡áŸáž„​រោទáŸ"</string>
+ <string name="volume_icon_description_incall" msgid="8890073218154543397">"កម្រិážâ€‹ážŸáŸ†áž¡áŸáž„​ហៅ"</string>
+ <string name="volume_icon_description_media" msgid="4217311719665194215">"កម្រិážâ€‹ážŸáŸ†áž¡áŸáž„​មáŸážŒáŸ€"</string>
+ <string name="volume_icon_description_notification" msgid="7044986546477282274">"កម្រិážâ€‹ážŸáŸ†áž¡áŸáž„​ការ​ជូន​ដំណឹង"</string>
+ <string name="ringtone_default" msgid="3789758980357696936">"សំឡáŸáž„​រោទáŸâ€‹áž›áŸ†áž“ាំដើម"</string>
+ <string name="ringtone_default_with_actual" msgid="8129563480895990372">"សំឡáŸáž„​រោទáŸâ€‹áž›áŸ†áž“ាំដើម (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_silent" msgid="7937634392408977062">"គ្មាន"</string>
+ <string name="ringtone_picker_title" msgid="3515143939175119094">"សំឡáŸáž„​រោទáŸ"</string>
+ <string name="ringtone_unknown" msgid="5477919988701784788">"សំឡáŸáž„​រោទáŸâ€‹áž˜áž·áž“​ស្គាល់"</string>
+ <plurals name="wifi_available">
+ <item quantity="one" msgid="6654123987418168693">"មាន​បណ្ដាញ​វ៉ាយហ្វាយ"</item>
+ <item quantity="other" msgid="4192424489168397386">"មាន​បណ្ដាញ​វ៉ាយហ្វាយ"</item>
+ </plurals>
+ <plurals name="wifi_available_detailed">
+ <item quantity="one" msgid="1634101450343277345">"បើក​បណ្ដាញ​វ៉ាយហ្វាយ​​ដែល​មាន"</item>
+ <item quantity="other" msgid="7915895323644292768">"មាន​បណ្ដាញ​វ៉ាយហ្វាយ​បើក"</item>
+ </plurals>
+ <string name="wifi_available_sign_in" msgid="4029489716605255386">"ចូល​បណ្ដាញ​វ៉ាយហ្វាយ"</string>
+ <string name="network_available_sign_in" msgid="8495155593358054676">"ចូល​ក្នុង​បណ្ដាញ"</string>
+ <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
+ <skip />
+ <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"មិន​​អាច​ážáž—្ជាប់​វ៉ាយហ្វាយ"</string>
+ <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" មាន​ការ​ážáž—្ជាប់​អ៊ីនធឺណិážâ€‹áž˜áž·áž“​ល្អ។"</string>
+ <string name="wifi_p2p_dialog_title" msgid="97611782659324517">"វ៉ាយហ្វាយ​ផ្ទាល់"</string>
+ <string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"ចាប់ផ្ដើម​វ៉ាយហ្វាយ​ដោយ​ផ្ទាល់។ វា​នឹង​បិទ​វ៉ាយហ្វាយ ។"</string>
+ <string name="wifi_p2p_failed_message" msgid="3763669677935623084">"មិន​អាច​ចាប់ផ្ដើម​វ៉ាយហ្វា​ដោយ​ផ្ទាល់។"</string>
+ <string name="wifi_p2p_enabled_notification_title" msgid="2068321881673734886">"បើក​​វ៉ាយហ្វាយ​ផ្ទាល់"</string>
+ <string name="wifi_p2p_enabled_notification_message" msgid="1638949953993894335">"ប៉ះ​ ដើម្បី​កំណážáŸ‹"</string>
+ <string name="accept" msgid="1645267259272829559">"ទទួល"</string>
+ <string name="decline" msgid="2112225451706137894">"បដិសáŸáž’"</string>
+ <string name="wifi_p2p_invitation_sent_title" msgid="1318975185112070734">"បា​ន​ផ្ញើ​លិážáž·ážâ€‹áž¢áž‰áŸ’ជើញ"</string>
+ <string name="wifi_p2p_invitation_to_connect_title" msgid="4958803948658533637">"អញ្ជើញ​ឲ្យ​ភ្ជាប់"</string>
+ <string name="wifi_p2p_from_message" msgid="570389174731951769">"ពី៖"</string>
+ <string name="wifi_p2p_to_message" msgid="248968974522044099">"ទៅ៖"</string>
+ <string name="wifi_p2p_enter_pin_message" msgid="5920929550367828970">"បញ្ចូល​កូដ PIN ដែល​ទាមទារ៖"</string>
+ <string name="wifi_p2p_show_pin_message" msgid="8530563323880921094">"កូដ PIN ៖"</string>
+ <string name="wifi_p2p_frequency_conflict_message" product="tablet" msgid="8012981257742232475">"កុំព្យូទáŸážšâ€‹áž”ន្ទះ​នឹង​ផ្ដាច់​ជា​បណ្ដោះអាសន្ន​ពី​វ៉ាយហ្វាយ ážážŽáŸˆâ€‹ážŠáŸ‚ល​វា​ភ្ជាប់​ <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+ <string name="wifi_p2p_frequency_conflict_message" product="default" msgid="7363907213787469151">"ទូរសáŸáž–្ទ​នឹង​​ផ្ដាច់​ពី​វ៉ាយហ្វាយ​ážážŽáŸˆâ€‹ážŠáŸ‚ល​វា​ážáŸ’រូវ​បាន​ážáž—្ជាប់​ទៅ <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+ <string name="select_character" msgid="3365550120617701745">"បញ្ចូល​ážáž½áž¢áž€áŸ’សរ"</string>
+ <string name="sms_control_title" msgid="7296612781128917719">"ផ្ញើ​សារ SMS"</string>
+ <string name="sms_control_message" msgid="3867899169651496433">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; កំពុង​ផ្ញើ​សារ​ SMS មួយ​ចំនួន​ធំ។ ážáž¾â€‹áž¢áŸ’នក​ចង់​ឲ្យ​​កម្មវិធី​នáŸáŸ‡â€‹áž”ន្ážâ€‹áž•្ញើ​សារ?"</string>
+ <string name="sms_control_yes" msgid="3663725993855816807">"អនុញ្ញាáž"</string>
+ <string name="sms_control_no" msgid="625438561395534982">"បដិសáŸáž’"</string>
+ <string name="sms_short_code_confirm_message" msgid="1645436466285310855">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ចង់​ផ្ញើ​សារ​ទៅ &lt;b&gt;<xliff:g id="DEST_ADDRESS">%2$s</xliff:g>&lt;/b&gt; ។"</string>
+ <string name="sms_short_code_details" msgid="3492025719868078457"><font fgcolor="#ffffb060">"áž“áŸáŸ‡â€‹áž¢áž¶áž…​កាážáŸ‹â€‹áž›áž»áž™"</font>" លើ​គណនី​ចលáŸážâ€‹ážšáž”ស់​អ្នក។"</string>
+ <string name="sms_premium_short_code_details" msgid="5523826349105123687"><font fgcolor="#ffffb060">"វា​នឹង​គិážâ€‹ážáŸ’លៃ​សáŸážœáž¶áž€áž˜áŸ’ម​លើ​គណនី​ចលáŸážâ€‹ážšáž”ស់​អ្នក។"</font></string>
+ <string name="sms_short_code_confirm_allow" msgid="4458878637111023413">"ផ្ញើ"</string>
+ <string name="sms_short_code_confirm_deny" msgid="2927389840209170706">"បោះ​បង់"</string>
+ <string name="sms_short_code_remember_choice" msgid="5289538592272218136">"ចងចាំ​ជម្រើស​របស់​ážáŸ’ញុំ"</string>
+ <string name="sms_short_code_remember_undo_instruction" msgid="4960944133052287484">"អ្នក​អាច​ប្ដូរ​វា​ពáŸáž›â€‹áž€áŸ’រោយ​ក្នុង​ការ​កំណážáŸ‹ &gt; កម្មវិធី"</string>
+ <string name="sms_short_code_confirm_always_allow" msgid="3241181154869493368">"អនុញ្ញាážâ€‹áž‡áž¶â€‹áž“ិច្ច"</string>
+ <string name="sms_short_code_confirm_never_allow" msgid="446992765774269673">"កុំ​អនុញ្ញាáž"</string>
+ <string name="sim_removed_title" msgid="6227712319223226185">"បាន​ដក​ស៊ីម​កាážâ€‹áž…áŸáž‰"</string>
+ <string name="sim_removed_message" msgid="2333164559970958645">"បណ្ដាញ​ចលáŸážâ€‹áž“ឹង​ប្រើ​លែង​បាន​រហូážâ€‹ážŠáž›áŸ‹â€‹áž¢áŸ’នក​ចាប់ផ្ដើម​ជា​មួយ​ស៊ីម​កាážâ€‹ážŠáŸ‚ល​បា​បញ្ចូល​ážáŸ’រឹមážáŸ’រូវ។"</string>
+ <string name="sim_done_button" msgid="827949989369963775">"រួចរាល់"</string>
+ <string name="sim_added_title" msgid="3719670512889674693">"បាន​បន្ážáŸ‚ម​ស៊ីម​កាáž"</string>
+ <string name="sim_added_message" msgid="6599945301141050216">"ចាប់ផ្ដើម​ឧបករណáŸâ€‹ážšáž”ស់​អ្នក​ឡើង​វិញ ដើម្បី​ចូល​ដំណើរការ​បណ្ដាញ​ចលáŸážáŸ”"</string>
+ <string name="sim_restart_button" msgid="4722407842815232347">"ចាប់ផ្ដើម​ឡើងវិញ"</string>
+ <string name="time_picker_dialog_title" msgid="8349362623068819295">"កំណážáŸ‹â€‹áž˜áŸ‰áŸ„áž„"</string>
+ <string name="date_picker_dialog_title" msgid="5879450659453782278">"កំណážáŸ‹â€‹áž€áž¶áž›â€‹áž”រិច្ឆáŸáž‘"</string>
+ <string name="date_time_set" msgid="5777075614321087758">"កំណážáŸ‹"</string>
+ <string name="date_time_done" msgid="2507683751759308828">"រួចរាល់"</string>
+ <string name="perms_new_perm_prefix" msgid="8257740710754301407"><font size="12" fgcolor="#ff33b5e5">"ážáŸ’មី៖ "</font></string>
+ <string name="perms_description_app" msgid="5139836143293299417">"បាន​ផ្ដល់​ដោយ <xliff:g id="APP_NAME">%1$s</xliff:g> ។"</string>
+ <string name="no_permissions" msgid="7283357728219338112">"មិន​ទាមទារ​សិទ្ធិ"</string>
+ <string name="perm_costs_money" msgid="4902470324142151116">"វា​អាច​កាážáŸ‹â€‹áž›áž»áž™â€‹â€‹áž¢áŸ’នក"</string>
+ <string name="usb_storage_activity_title" msgid="4465055157209648641">"ឧបករណáŸâ€‹áž™áž¼áž¢áŸážŸáž”៊ី"</string>
+ <string name="usb_storage_title" msgid="5901459041398751495">"បាន​ភ្ជាប់​យូអáŸážŸáž”៊ី"</string>
+ <string name="usb_storage_message" product="nosdcard" msgid="3308538094316477839">"អ្នក​បាន​ភ្ជាប់​កុំព្យូទáŸážšâ€‹ážšáž”ស់​អ្នក​ážáž¶áž˜â€‹â€‹áž™áž¼áž¢áŸážŸáž”៊ី។ ប៉ះ ប៊ូážáž»áž„​ážáž¶áž„​ក្រោម បើ​អ្នក​ចង់​ចម្លង​ឯកសារ​រវាង​កុំព្យូទáŸážš និង​ឧបករណáŸâ€‹áž•្ទុក Android របស់​អ្នក។"</string>
+ <string name="usb_storage_message" product="default" msgid="805351000446037811">"អ្នក​បាន​ភ្ជាប់​កុំព្យូទáŸážšâ€‹ážšáž”ស់​អ្នក​ážáž¶áž˜â€‹áž™áž¼áž¢áŸážŸáž”៊ី។ ប៉ះ ប៊ូážáž»áž„​ážáž¶áž„​ក្រោម​ប្រសិន​បើ​អ្នក​ចង់​ចម្លង​ឯកសារ​រវាង​កុំព្យូទáŸážšâ€‹ážšáž”ស់​អ្នក និង​កាážâ€‹áž¢áŸážŸážŒáž¸â€‹áž“ៃ Android របស់​អ្នក។"</string>
+ <string name="usb_storage_button_mount" msgid="1052259930369508235">"បើក​ឧបករណáŸâ€‹áž•្ទុក​យូអáŸážŸáž”៊ី"</string>
+ <string name="usb_storage_error_message" product="nosdcard" msgid="3017045217365540658">"មាន​បញ្ហា​ក្នុង​ការ​ផ្អាក​ឧបករណáŸâ€‹áž•្ទុក​យូអáŸážŸáž”៊ី​សម្រាប់​ជា​ឧបករណáŸâ€‹áž•្ទុក។"</string>
+ <string name="usb_storage_error_message" product="default" msgid="2876018512716970313">"មាន​បញ្ហា​ក្នុង​ការ​ប្រើ​កាážâ€‹áž¢áŸážŸážŒáž¸â€‹ážŸáž˜áŸ’រាប់​ឧបករណáŸâ€‹áž•្ទុក​យូអáŸážŸáž”៊ី។"</string>
+ <string name="usb_storage_notification_title" msgid="8175892554757216525">"បាន​ភ្ជាប់​យូអáŸážŸáž”៊ី"</string>
+ <string name="usb_storage_notification_message" msgid="939822783828183763">"ប៉ះ ដើម្បី​ចម្លង​ឯកសារ​ទៅ/ពី​កុំព្យូទáŸážšâ€‹ážšáž”ស់​​អ្នក។"</string>
+ <string name="usb_storage_stop_notification_title" msgid="2336058396663516017">"បិទ​ឧបករណáŸâ€‹áž•្ទុក​យូអáŸážŸáž”៊ី"</string>
+ <string name="usb_storage_stop_notification_message" msgid="1656852098555623822">"ប៉ះ ដើម្បី​បិទ​ឧបករណáŸâ€‹áž•្ទុក​យូអáŸážŸáž”៊ី។"</string>
+ <string name="usb_storage_stop_title" msgid="660129851708775853">"ឧបករណáŸâ€‹áž•្ទុក​យូអáŸážŸáž”៊ី​កំពុង​ប្រើ"</string>
+ <string name="usb_storage_stop_message" product="nosdcard" msgid="4264025280777219521">"មុន​ពáŸáž›â€‹áž”ិទ​ឧបករណáŸâ€‹áž•្ទុក​យូអáŸážŸáž”៊ី ផ្ដាច់ (\"បដិសáŸáž’\") ឧបករណáŸâ€‹áž•្ទុក​យូអáŸážŸáž”៊ី Android របស់​អ្នក​ពី​កុំព្យូទáŸážšáŸ”"</string>
+ <string name="usb_storage_stop_message" product="default" msgid="8043969782460613114">"មុន​ពáŸáž›â€‹áž”ិទ​​ឧបករណáŸâ€‹áž•្ទុក​យូអáŸážŸáž”៊ី ផ្ដាច់ (\"បដិសáŸáž’\") កាážâ€‹áž¢áŸážŸážŒáž¸ Android របស់​អ្នក​ពី​កុំព្យូទáŸážšáŸ”"</string>
+ <string name="usb_storage_stop_button_mount" msgid="7060218034900696029">"បិទ​ឧបករណáŸâ€‹áž•្ទុក​យូអáŸážŸáž”៊ី"</string>
+ <string name="usb_storage_stop_error_message" msgid="1970374898263063836">"មាន​បញ្ហា​ក្នុង​ការ​បិទ​ឧបករណáŸâ€‹áž•្ទុក​យូអáŸážŸáž”៊ី។ ពិនិážáŸ’យ​ážáž¶â€‹áž¢áŸ’នក​បាន​ផ្ដាច់​យូអáŸážŸáž”៊ី បន្ទាប់​មក​ព្យាយាម​ម្ដង​ទៀážáŸ”"</string>
+ <string name="dlg_confirm_kill_storage_users_title" msgid="963039033470478697">"បើក​ឧបករណáŸâ€‹áž•្ទុក​យូអáŸážŸáž”៊ី"</string>
+ <string name="dlg_confirm_kill_storage_users_text" msgid="5100428757107469454">"បើ​អ្នក​បើក​ឧបករណáŸâ€‹áž•្ទុក​យូអáŸážŸáž”៊ី កម្មវិធី​មួយ​ចំនួន​ដែល​អ្នក​កំពុង​ប្រើ​នឹង​បញ្ឈប់ ហើយ​អាច​ប្រើ​លែង​បាន​រហូážâ€‹ážŠáž›áŸ‹â€‹áž¢áŸ’នក​បិទ​ឧបករណáŸâ€‹áž•្ទុក​យូអáŸážŸáž”៊ី។"</string>
+ <string name="dlg_error_title" msgid="7323658469626514207">"ប្រážáž·áž”ážáŸ’ážáž·áž€áž¶ážšâ€‹áž™áž¼áž¢áŸážŸáž”៊ី​​បរាជáŸáž™"</string>
+ <string name="dlg_ok" msgid="7376953167039865701">"យល់ព្រម"</string>
+ <string name="usb_mtp_notification_title" msgid="3699913097391550394">"បាន​ážáž—្ជាប់​ជា​ឧបករណáŸâ€‹â€‹áž•្ទុក"</string>
+ <string name="usb_ptp_notification_title" msgid="1960817192216064833">"បាន​ភ្ជាប់​ជា​ម៉ាស៊ីន​ážáž"</string>
+ <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"បាន​ភ្ជាប់​ជា​កម្មវិធី​ដំឡើង"</string>
+ <string name="usb_accessory_notification_title" msgid="7848236974087653666">"បាន​ភ្ជាប់​ឧបករណáŸâ€‹áž™áž¼áž¢áŸážŸáž”៊ី"</string>
+ <string name="usb_notification_message" msgid="2290859399983720271">"ប៉ះ ដើម្បី​មើល​ជម្រើស​យូអáŸážŸáž”៊ី​ផ្សáŸáž„។"</string>
+ <string name="extmedia_format_title" product="nosdcard" msgid="9020092196061007262">"ធ្វើ​ទ្រង់ទ្រាយ​ឧបករណáŸâ€‹áž•្ទុក​យូអáŸážŸáž”៊ី?"</string>
+ <string name="extmedia_format_title" product="default" msgid="3648415921526526069">"ធ្វើ​ទ្រង់ទ្រាយ​កាážâ€‹áž¢áŸážŸážŒáž¸?"</string>
+ <string name="extmedia_format_message" product="nosdcard" msgid="3934016853425761078">"ឯកសារ​ទាំងអស់​ដែល​បាន​រក្សាទុក​ក្នុង​ឧបករណáŸâ€‹áž•្ទុក​យូអáŸážŸáž”៊ី​នឹង​ážáŸ’រូវ​បាន​លុប។ សកម្មភាព​នáŸáŸ‡â€‹áž˜áž·áž“​អាច​ážáŸ’រឡប់​វិញ​បាន​ទáŸ!"</string>
+ <string name="extmedia_format_message" product="default" msgid="14131895027543830">"ទិន្ននáŸáž™â€‹áž‘ាំងអស់​ក្នុង​កាážâ€‹ážšáž”ស់​អ្នក​នឹង​បាážáŸ‹áž”ង់។"</string>
+ <string name="extmedia_format_button_format" msgid="4131064560127478695">"ធ្វើ​ទ្រង់ទ្រាយ"</string>
+ <string name="adb_active_notification_title" msgid="6729044778949189918">"បាន​ភ្ជាប់​ការ​កែ​កំហុស​យូអáŸážŸáž”៊ី"</string>
+ <string name="adb_active_notification_message" msgid="1016654627626476142">"ប៉ះ ដើម្បី​បិទ​ការ​កែ​កំហុស​យូអáŸážŸáž”៊ី។"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"ជ្រើស​វិធីសាស្ážáŸ’រ​បញ្ចូល"</string>
+ <string name="configure_input_methods" msgid="9091652157722495116">"រៀបចំ​វិធីសាស្ážáŸ’រ​បញ្ចូល"</string>
+ <string name="use_physical_keyboard" msgid="6203112478095117625">"ក្ដារ​ចុច​​ពិážáž”្រាកដ"</string>
+ <string name="hardware" msgid="7517821086888990278">"ផ្នែក​រឹង"</string>
+ <string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"ជ្រើស​ប្លង់​ក្ដារ​ចុច"</string>
+ <string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"ប៉ះ ​ដើម្បី​ជ្រើស​ប្លង់​​ក្ដារចុច។"</string>
+ <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+ <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+ <string name="candidates_style" msgid="4333913089637062257"><u>"áž”áŸáž€áŸ’ážáž‡áž“"</u></string>
+ <string name="ext_media_checking_notification_title" product="nosdcard" msgid="3449816005351468560">"រៀបចំ​ឧបករណáŸâ€‹áž•្ទុក​យូអáŸážŸáž”៊ី"</string>
+ <string name="ext_media_checking_notification_title" product="default" msgid="5457603418970994050">"រៀបចំ​កាážâ€‹áž¢áŸážŸážŒáž¸"</string>
+ <string name="ext_media_checking_notification_message" msgid="8287319882926737053">"ពិនិážáŸ’យ​រក​កំហុស។"</string>
+ <string name="ext_media_nofs_notification_title" product="nosdcard" msgid="7788040745686229307">"ឧបករណáŸâ€‹áž•្ទុក​យូអáŸážŸáž”៊ី​ទទáŸ"</string>
+ <string name="ext_media_nofs_notification_title" product="default" msgid="780477838241212997">"ការ​​អáŸážŸážŒáž¸â€‹áž‘áž‘áŸ"</string>
+ <string name="ext_media_nofs_notification_message" product="nosdcard" msgid="7840121067427269500">"ឧបករណáŸâ€‹áž•្ទុក​យូអáŸážŸáž”៊ី​ទទ០ឬ​មាន​ប្រពáŸáž“្ធ​ឯកសារ​ដែល​មិន​បា​គាំទ្រ។"</string>
+ <string name="ext_media_nofs_notification_message" product="default" msgid="8641065641786923604">"កាážâ€‹áž¢áŸážŸážŒáž¸â€‹áž‘ទ០ឬ​មាន​ប្រពáŸáž“្ធ​ឯកសារ​មិន​បាន​គាំទ្រ។"</string>
+ <string name="ext_media_unmountable_notification_title" product="nosdcard" msgid="2090046769532713563">"ឧបករណáŸâ€‹áž•្ទុក​យូអáŸážŸáž”៊ី​ážáž¼áž…"</string>
+ <string name="ext_media_unmountable_notification_title" product="default" msgid="6410723906019100189">"កាážâ€‹áž¢áŸážŸážŒáž¸â€‹ážáž¼áž…"</string>
+ <string name="ext_media_unmountable_notification_message" product="nosdcard" msgid="1795917578395333280">"ឧបករណáŸâ€‹áž•្ទុក​យូអáŸážŸáž”៊ី​ážáž¼áž…។ ព្យាយាម​ធ្វើ​ទ្រង់ទ្រាយ​វា​ឡើងវិញ។"</string>
+ <string name="ext_media_unmountable_notification_message" product="default" msgid="1753898567525568253">"កាážâ€‹áž¢áŸážŸážŒáž¸â€‹ážáž¼áž…។ ព្យាយាម​ធ្វើ​ទ្រង់ទ្រាយ​វា​ឡើងវិញ។"</string>
+ <string name="ext_media_badremoval_notification_title" product="nosdcard" msgid="1661683031330951073">"បាន​ដក​ឧបករណáŸâ€‹áž•្ទុក​យូអáŸážŸáž”៊ី​ដោយ​មិន​រំពឹង​ទុក"</string>
+ <string name="ext_media_badremoval_notification_title" product="default" msgid="6872152882604407837">"បាន​ដក​កាážâ€‹áž¢áŸážŸážŒáž¸â€‹ážŠáŸ„យ​មិន​រំពឹង​ទុក"</string>
+ <string name="ext_media_badremoval_notification_message" product="nosdcard" msgid="4329848819865594241">"ផ្ដាច់​ឧបករណáŸâ€‹áž•្ទុក​យូអáŸážŸáž”៊ី​មុន​នឹង​​លុប​​​ជៀសវាង​ការ​បាážáŸ‹â€‹áž‘ិន្ននáŸáž™áŸ”"</string>
+ <string name="ext_media_badremoval_notification_message" product="default" msgid="7260183293747448241">"ផ្ដាច់​កាážâ€‹áž¢áŸážŸážŒáž¸â€‹áž˜áž»áž“​នឹង​ដក់​ចáŸáž‰ ជៀសវាង​បាážáŸ‹áž”ង់​ទិន្ននáŸáž™áŸ”"</string>
+ <string name="ext_media_safe_unmount_notification_title" product="nosdcard" msgid="3967973893270360230">"ឧបករណáŸâ€‹áž™áž¼áž¢áŸážŸáž”៊ី​មាន​សុវážáŸ’ážáž·áž—áž¶áž– ដើម្បី​ដក"</string>
+ <string name="ext_media_safe_unmount_notification_title" product="default" msgid="6729801130790616200">"មាន​សុវážáŸ’ážáž·áž—ាព​ក្នុង​ការ​ដក​កាážâ€‹áž¢áŸážŸážŒáž¸"</string>
+ <string name="ext_media_safe_unmount_notification_message" product="nosdcard" msgid="6142195361606493530">"អ្នក​អាច​ដក​ឧបករណáŸâ€‹áž•្ទុក​យូអáŸážŸáž”៊ី​ដោយ​សុវážáŸ’ážáž·áž—ាព។"</string>
+ <string name="ext_media_safe_unmount_notification_message" product="default" msgid="568841278138377604">"អ្នក​អាច​ដក​កាážâ€‹áž¢áŸážŸážŒáž¸â€‹ážŠáŸ„យ​មាន​សុវážáŸ’ážáž·áž—ាព។"</string>
+ <string name="ext_media_nomedia_notification_title" product="nosdcard" msgid="4486377230140227651">"បាន​លុប​ឧបករណáŸâ€‹áž•្ទុក​យូអáŸážŸáž”៊ី"</string>
+ <string name="ext_media_nomedia_notification_title" product="default" msgid="8902518030404381318">"បាន​ដក​កាážâ€‹áž¢áŸážŸážŒáž¸"</string>
+ <string name="ext_media_nomedia_notification_message" product="nosdcard" msgid="6921126162580574143">"បាន​ដក​ឧបករណáŸâ€‹áž•្ទុក​យូអáŸážŸáž”៊ី។ បញ្ចូល​មáŸážŒáŸ€â€‹ážáŸ’មី។"</string>
+ <string name="ext_media_nomedia_notification_message" product="default" msgid="3870120652983659641">"បាន​ដក​កាážâ€‹áž¢áŸážŸážŒáž¸áŸ” បញ្ចូល​ážáŸ’មី​មួយ។"</string>
+ <string name="activity_list_empty" msgid="1675388330786841066">"រក​មិន​ឃើញ​សកម្មភាព​ផ្គូផ្គង។"</string>
+ <string name="permlab_pkgUsageStats" msgid="8787352074326748892">"ធ្វើ​បច្ចុប្បន្ន​សមាសធាážáž»â€‹ážŸáŸ’ážáž·ážáž·â€‹áž€áž¶ážšâ€‹áž”្រើ"</string>
+ <string name="permdesc_pkgUsageStats" msgid="1106612424254277630">"ឲ្យ​កម្មវិធី​កែ​ស្ážáž·ážáž·â€‹áž”្រើ​សមាសភាគ​ដែល​បា​ន​ប្រមូល។​​ មិន​សម្រាប់​ប្រើ​ដោយ​កម្មវិធី​ធម្មážáž¶â€‹áž‘áŸáŸ”"</string>
+ <string name="permlab_copyProtectedData" msgid="4341036311211406692">"ចម្លង​មាážáž·áž€áž¶"</string>
+ <string name="permdesc_copyProtectedData" msgid="4390697124288317831">"ឲ្យ​កម្មវិធី​ដក​សáŸážœáž¶áž€áž˜áŸ’ម​នៃ​កម្មវិធី​ផ្ទុក​​លំនាំដើម ដើម្បី​ចម្លង​មាážáž·áž€áž¶áŸ”​ មិន​សម្រាប់​ប្រើ​ដោយ​កម្មវិធី​លំនាំដើម។"</string>
+ <string name="permlab_route_media_output" msgid="1642024455750414694">"នាំ​ផ្លូវ​លទ្ធផល​មáŸážŒáŸ€"</string>
+ <string name="permdesc_route_media_output" msgid="4932818749547244346">"ឲ្យ​កម្មវិធី​នាំ​ផ្លូវ​លទ្ធផល​មáŸážŒáŸ€â€‹áž‘ៅ​ឧបករណáŸâ€‹â€‹ážáž¶áž„​ក្រៅ​ផ្សáŸáž„។"</string>
+ <string name="permlab_access_keyguard_secure_storage" msgid="7565552237977815047">"ចូល​ដំណើរការ​ឧបករណáŸâ€‹áž•្ទុក​សុវážáŸ’ážáž·áž—áž¶áž–"</string>
+ <string name="permdesc_access_keyguard_secure_storage" msgid="5866245484303285762">"ឲ្យ​កម្មវិធី​ចូល​​ការ​ផ្ទុក​មាន​សុវážáŸ’ážáž·áž—áž¶áž– keguard ។"</string>
+ <string name="permlab_control_keyguard" msgid="172195184207828387">"ពិនិážáŸ’យ​ការ​បង្ហាញ និង​លាក់​ការ​ការពារ"</string>
+ <string name="permdesc_control_keyguard" msgid="3043732290518629061">"ឲ្យ​កម្មវិធី​គ្រប់គ្រង keguard ។"</string>
+ <string name="tutorial_double_tap_to_zoom_message_short" msgid="4070433208160063538">"ប៉ះ​ពីរ​ដង ​​ដើម្បី​គ្រប់គ្រង​ការ​ពង្រីក"</string>
+ <string name="gadget_host_error_inflating" msgid="4882004314906466162">"មិន​អាច​បន្ážáŸ‚ម​ធាážáž»â€‹áž€áŸ’រាហ្វិក។"</string>
+ <string name="ime_action_go" msgid="8320845651737369027">"ទៅ"</string>
+ <string name="ime_action_search" msgid="658110271822807811">"ស្វែងរក"</string>
+ <string name="ime_action_send" msgid="2316166556349314424">"ផ្ញើ"</string>
+ <string name="ime_action_next" msgid="3138843904009813834">"បន្ទាប់"</string>
+ <string name="ime_action_done" msgid="8971516117910934605">"រួចរាល់"</string>
+ <string name="ime_action_previous" msgid="1443550039250105948">"មុន"</string>
+ <string name="ime_action_default" msgid="2840921885558045721">"អនុវážáŸ’áž"</string>
+ <string name="dial_number_using" msgid="5789176425167573586">"ចុច​លáŸážâ€‹\nដោយ​ប្រើ <xliff:g id="NUMBER">%s</xliff:g>"</string>
+ <string name="create_contact_using" msgid="4947405226788104538">"បង្កើážâ€‹áž‘ំនាក់ទំនង\nដោយ​ប្រើ <xliff:g id="NUMBER">%s</xliff:g>"</string>
+ <string name="grant_credentials_permission_message_header" msgid="2106103817937859662">"កម្មវិធី​មួយ ឬ​ច្រើន​ដូច​ážáž¶áž„​ក្រោម​ស្នើ​សិទ្ធិ ដើម្បី​ចូល​គណនី​របស់​អ្នក​ឥឡូវ និង​ពáŸáž›â€‹áž¢áž“áž¶áž‚ážáŸ”"</string>
+ <string name="grant_credentials_permission_message_footer" msgid="3125211343379376561">"ážáž¾â€‹áž¢áŸ’នក​ចង់​អនុញ្ញាážâ€‹ážŸáŸ†ážŽáž¾â€‹áž“áŸáŸ‡?"</string>
+ <string name="grant_permissions_header_text" msgid="6874497408201826708">"ស្នើ​ចូល"</string>
+ <string name="allow" msgid="7225948811296386551">"អនុញ្ញាáž"</string>
+ <string name="deny" msgid="2081879885755434506">"បដិសáŸáž’"</string>
+ <string name="permission_request_notification_title" msgid="6486759795926237907">"បាន​ស្នើ​សិទ្ធិ"</string>
+ <string name="permission_request_notification_with_subtitle" msgid="8530393139639560189">"បាន​ស្នើ​សិទ្ធិ\nសម្រាប់​គណនី <xliff:g id="ACCOUNT">%s</xliff:g> ។"</string>
+ <string name="input_method_binding_label" msgid="1283557179944992649">"វិធីសាស្ážáŸ’រ​បញ្ចូល"</string>
+ <string name="sync_binding_label" msgid="3687969138375092423">"ធ្វើ​សម​កាល​កម្ម"</string>
+ <string name="accessibility_binding_label" msgid="4148120742096474641">"ភាព​ងាយស្រួល"</string>
+ <string name="wallpaper_binding_label" msgid="1240087844304687662">"ផ្ទាំង​រូបភាព"</string>
+ <string name="chooser_wallpaper" msgid="7873476199295190279">"ប្ដូរ​ផ្ទាំង​រូបភាព"</string>
+ <string name="notification_listener_binding_label" msgid="2014162835481906429">"កម្មវិធី​ស្ដាប់​ការ​ជូន​ដំណឹង"</string>
+ <string name="vpn_title" msgid="19615213552042827">"បាន​ធ្វើ​ឲ្យ VPN សកម្ម"</string>
+ <string name="vpn_title_long" msgid="6400714798049252294">"បាន​ធ្វើ​ឲ្យ VPN សកម្ម​ដោយ <xliff:g id="APP">%s</xliff:g>"</string>
+ <string name="vpn_text" msgid="3011306607126450322">"ប៉ះ ដើម្បី​គ្រប់គ្រង​បណ្ដាញ។"</string>
+ <string name="vpn_text_long" msgid="6407351006249174473">"បាន​ážáž—្ជាប់​ទៅ <xliff:g id="SESSION">%s</xliff:g> ។ ប៉ះ ដើម្បី​គ្រប់គ្រង​បណ្ដាញ។"</string>
+ <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"បើក​ការ​ážáž—្ជាប់ VPN ជា​និច្ច..។"</string>
+ <string name="vpn_lockdown_connected" msgid="8202679674819213931">"ភ្ជាប់ VPN ជា​និច្ច"</string>
+ <string name="vpn_lockdown_error" msgid="6009249814034708175">"បើក​កំហុស VPN ជា​និច្ច"</string>
+ <string name="vpn_lockdown_config" msgid="6415899150671537970">"ប៉ះ ​ដើម្បី​កំណážáŸ‹â€‹ážšáž…នា​សម្ពáŸáž“្ធ"</string>
+ <string name="upload_file" msgid="2897957172366730416">"ជ្រើស​​ឯកសារ"</string>
+ <string name="no_file_chosen" msgid="6363648562170759465">"គ្មាន​ឯកសារ​បាន​ជ្រើស"</string>
+ <string name="reset" msgid="2448168080964209908">"កំណážáŸ‹â€‹áž¡áž¾áž„វិញ"</string>
+ <string name="submit" msgid="1602335572089911941">"ដាក់​ស្នើ"</string>
+ <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"បាន​បើក​របៀប​រážáž™áž“្áž"</string>
+ <string name="car_mode_disable_notification_message" msgid="8035230537563503262">"ប៉ះ​ ដើម្បី​ចáŸáž‰â€‹áž–ី​របៀប​រážáž™áž“្ážâ€‹áŸ”"</string>
+ <string name="tethered_notification_title" msgid="3146694234398202601">"​ភ្ជាប់ ឬ​ hotspot សកម្ម"</string>
+ <string name="tethered_notification_message" msgid="6857031760103062982">"ប៉ះ​ ដើម្បី​រៀបចំ។"</string>
+ <string name="back_button_label" msgid="2300470004503343439">"ážáž™áž€áŸ’រោយ"</string>
+ <string name="next_button_label" msgid="1080555104677992408">"បន្ទាប់"</string>
+ <string name="skip_button_label" msgid="1275362299471631819">"រំលង"</string>
+ <string name="throttle_warning_notification_title" msgid="4890894267454867276">"ការ​ប្រើ​ទិន្ននáŸáž™â€‹áž…áž›áŸážâ€‹ážáŸ’ពស់"</string>
+ <string name="throttle_warning_notification_message" msgid="3340822228599337743">"ប៉ះ​ ដើម្បី​​ស្វែងយល់​បន្ážáŸ‚ម​អំពី​ការ​ប្រើ​​​ទិន្ននáŸáž™â€‹áž…áž›áŸážâ€‹áŸ”"</string>
+ <string name="throttled_notification_title" msgid="6269541897729781332">"លើក​ដែន​កំណážáŸ‹â€‹áž‘ិន្ននáŸáž™â€‹áž…áž›áŸáž"</string>
+ <string name="throttled_notification_message" msgid="5443457321354907181">"ប៉ះ ដើម្បី​ស្វែងយល់​បន្ážáŸ‚ម​អំពី​ការ​ប្រើ​ទិន្ននáŸáž™â€‹áž…áž›áŸážáŸ”"</string>
+ <string name="no_matches" msgid="8129421908915840737">"គ្មាន​ការ​ផ្គូផ្គង"</string>
+ <string name="find_on_page" msgid="1946799233822820384">"រក​ក្នុង​ទំពáŸážš"</string>
+ <plurals name="matches_found">
+ <item quantity="one" msgid="8167147081136579439">"១ ប្រកួáž"</item>
+ <item quantity="other" msgid="4641872797067609177">"<xliff:g id="INDEX">%d</xliff:g> នៃ <xliff:g id="TOTAL">%d</xliff:g>"</item>
+ </plurals>
+ <string name="action_mode_done" msgid="7217581640461922289">"រួចរាល់"</string>
+ <string name="progress_unmounting" product="nosdcard" msgid="3923810448507612746">"កំពុង​ផ្ដាច់​ឧបករណáŸâ€‹áž™áž¼áž¢áŸážŸáž”៊ី..."</string>
+ <string name="progress_unmounting" product="default" msgid="1327894998409537190">"កំពុង​ផ្ដាច់​កាážâ€‹áž¢áŸážŸážŒáž¸..."</string>
+ <string name="progress_erasing" product="nosdcard" msgid="4521573321524340058">"កំពុង​លុប​ឧបករណáŸâ€‹áž•្ទុក​យូអáŸážŸáž”៊ី..."</string>
+ <string name="progress_erasing" product="default" msgid="6596988875507043042">"កំពុង​លុប​កាážâ€‹áž¢áŸážŸážŒáž¸..."</string>
+ <string name="format_error" product="nosdcard" msgid="6299769563624776948">"មិន​​អាច​លុប​ឧបករណáŸâ€‹áž•្ទុក​យូអáŸážŸáž”៊ី។"</string>
+ <string name="format_error" product="default" msgid="7315248696644510935">"មិន​អាច​លុប​កាážâ€‹áž¢áŸážŸážŒáž¸áŸ”"</string>
+ <string name="media_bad_removal" msgid="7960864061016603281">"បាន​ដក​កាážâ€‹áž¢áŸážŸážŒáž¸â€‹áž˜áž»áž“​នឹង​ផ្ដាច់។"</string>
+ <string name="media_checking" product="nosdcard" msgid="418188720009569693">"បច្ចុប្បន្ន​កំពុង​ពិនិážáŸ’យ​ឧបករណáŸâ€‹áž•្ទុក​យូអáŸážŸáž”៊ី។"</string>
+ <string name="media_checking" product="default" msgid="7334762503904827481">"បច្ចុប្បន្ន​កំពុង​ពិនិážáŸ’យ​មើល​កាážâ€‹áž¢áŸážŸážŒáž¸áŸ”"</string>
+ <string name="media_removed" msgid="7001526905057952097">"បាន​ដក​កាážâ€‹áž¢áŸážŸážŒáž¸áŸ”"</string>
+ <string name="media_shared" product="nosdcard" msgid="5830814349250834225">"ឧបករណáŸâ€‹áž•្ទុក​យូអáŸážŸáž”៊ី​បច្ចុប្បន្ន​កំពុង​ប្រើ​ដោយ​កុំព្យូទáŸážšáŸ”"</string>
+ <string name="media_shared" product="default" msgid="5706130568133540435">"បច្ចុប្បន្ន​កាážâ€‹áž¢áŸážŸážŒáž¸â€‹áž€áŸ†áž–ុង​ប្រើ​ដោយ​កុំព្យូទáŸážš"</string>
+ <string name="media_unknown_state" msgid="729192782197290385">"មិន​ស្គាល់​ស្ážáž¶áž“ភាព​មáŸážŒáŸ€â€‹ážáž¶áž„​ក្រៅ។"</string>
+ <string name="share" msgid="1778686618230011964">"ចែក​រំលែក"</string>
+ <string name="find" msgid="4808270900322985960">"រក"</string>
+ <string name="websearch" msgid="4337157977400211589">"ស្វែងរក​ážáž¶áž˜â€‹áž”ណ្ដាញ"</string>
+ <string name="find_next" msgid="5742124618942193978">"រក​បន្ទាប់"</string>
+ <string name="find_previous" msgid="2196723669388360506">"រក​ពី​មុន"</string>
+ <string name="gpsNotifTicker" msgid="5622683912616496172">"ស្នើ​ទីážáž¶áŸ†áž„​ពី <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="gpsNotifTitle" msgid="5446858717157416839">"សំណើ​ទីážáž¶áŸ†áž„"</string>
+ <string name="gpsNotifMessage" msgid="1374718023224000702">"បាន​ស្នើ​ដោយ <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
+ <string name="gpsVerifYes" msgid="2346566072867213563">"បាទ/ចាស"</string>
+ <string name="gpsVerifNo" msgid="1146564937346454865">"áž‘áŸ"</string>
+ <string name="sync_too_many_deletes" msgid="5296321850662746890">"លុប​​លើស​ដែន​កំណážáŸ‹"</string>
+ <string name="sync_too_many_deletes_desc" msgid="496551671008694245">"មាន​ធាážáž»â€‹áž”ាន​លុប <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> សម្រាប់ <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g> គណនី <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g> ។ ážáž¾â€‹áž¢áŸ’នក​ចង់​ធ្វើ​អ្វី​ážáŸ’លះ​?"</string>
+ <string name="sync_really_delete" msgid="2572600103122596243">"លុប​ធាážáž»"</string>
+ <string name="sync_undo_deletes" msgid="2941317360600338602">"មិន​ធ្វើ​ការ​លុប​វិញ"</string>
+ <string name="sync_do_nothing" msgid="3743764740430821845">"មិន​ធ្វើអ្វី​ទáŸâ€‹áž¥áž¡áž¼ážœ"</string>
+ <string name="choose_account_label" msgid="5655203089746423927">"ជ្រើស​គណនី"</string>
+ <string name="add_account_label" msgid="2935267344849993553">"បន្ážáŸ‚ម​គណនី​ážáŸ’មី"</string>
+ <string name="add_account_button_label" msgid="3611982894853435874">"បន្ážáŸ‚ម​គណនី"</string>
+ <string name="number_picker_increment_button" msgid="2412072272832284313">"បង្កើន"</string>
+ <string name="number_picker_decrement_button" msgid="476050778386779067">"បន្ážáž™"</string>
+ <string name="number_picker_increment_scroll_mode" msgid="3073101067441638428">"<xliff:g id="VALUE">%s</xliff:g> ប៉ះ និង​សង្កážáŸ‹áŸ”"</string>
+ <string name="number_picker_increment_scroll_action" msgid="9101473045891835490">"រុញ​ឡើងលើ ដើម្បី​បង្កើន និង​ចុះក្រោម​ដើម្បី​បន្ážáž™áŸ”"</string>
+ <string name="time_picker_increment_minute_button" msgid="8865885114028614321">"បង្កើន​នាទី"</string>
+ <string name="time_picker_decrement_minute_button" msgid="6246834937080684791">"បន្ážáž™â€‹áž“ាទី"</string>
+ <string name="time_picker_increment_hour_button" msgid="3652056055810223139">"បង្កើន​ម៉ោង"</string>
+ <string name="time_picker_decrement_hour_button" msgid="1377479863429214792">"បន្ážáž™â€‹áž˜áŸ‰áŸ„áž„"</string>
+ <string name="time_picker_increment_set_pm_button" msgid="4147590696151230863">"កំណážáŸ‹â€‹ PM"</string>
+ <string name="time_picker_decrement_set_am_button" msgid="8302140353539486752">"កំណážáŸ‹ AM"</string>
+ <string name="date_picker_increment_month_button" msgid="5369998479067934110">"បង្កើន​ážáŸ‚"</string>
+ <string name="date_picker_decrement_month_button" msgid="1832698995541726019">"បន្ážáž™â€‹ážáŸ‚"</string>
+ <string name="date_picker_increment_day_button" msgid="7130465412308173903">"បង្កើន​ážáŸ’ងៃ"</string>
+ <string name="date_picker_decrement_day_button" msgid="4131881521818750031">"បន្ážáž™â€‹ážáŸ’ងៃ"</string>
+ <string name="date_picker_increment_year_button" msgid="6318697384310808899">"បង្កើន​​ឆ្នាំ"</string>
+ <string name="date_picker_decrement_year_button" msgid="4482021813491121717">"បន្ážáž™â€‹áž†áŸ’នាំ"</string>
+ <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
+ <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"បោះ​បង់"</string>
+ <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"លុប"</string>
+ <string name="keyboardview_keycode_done" msgid="1992571118466679775">"រួចរាល់"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"ប្ដូរ​របៀប"</string>
+ <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
+ <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
+ <string name="activitychooserview_choose_application" msgid="2125168057199941199">"ជ្រើស​កម្មវិធី"</string>
+ <string name="shareactionprovider_share_with" msgid="806688056141131819">"ចែករំលែក​ជា​មួយ"</string>
+ <string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"ចែក​រំលែក​ជា​មួយ <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
+ <string name="content_description_sliding_handle" msgid="415975056159262248">"គ្រប់គ្រង​ការ​រុញ។ ប៉ះ &amp; សង្កážáŸ‹áŸ”"</string>
+ <string name="description_direction_up" msgid="7169032478259485180">"រុញ​ឡើង​លើ​ដើម្បី <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ។"</string>
+ <string name="description_direction_down" msgid="5087739728639014595">"រុញ​ចុះក្រោម​សម្រាប់ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ។"</string>
+ <string name="description_direction_left" msgid="7207478719805562165">"រុញ​ទៅ​ឆ្វáŸáž„​ដើម្បី <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ។"</string>
+ <string name="description_direction_right" msgid="8034433242579600980">"រុញ​​ទៅ​ស្ដាំ​ដើម្បី <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ។"</string>
+ <string name="description_target_unlock" msgid="2228524900439801453">"ដោះ​​សោ"</string>
+ <string name="description_target_camera" msgid="969071997552486814">"ម៉ាស៊ីន​ážáž"</string>
+ <string name="description_target_silent" msgid="893551287746522182">"ស្ងាážáŸ‹"</string>
+ <string name="description_target_soundon" msgid="30052466675500172">"បើក​សំឡáŸáž„"</string>
+ <string name="description_target_search" msgid="3091587249776033139">"ស្វែងរក"</string>
+ <string name="description_target_unlock_tablet" msgid="3833195335629795055">"អូស​ ដើម្បី​ដោះ​សោ។"</string>
+ <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"ដោážâ€‹áž€áž¶ážŸâ€‹ážŠáž¾áž˜áŸ’បី​ស្ដាប់​ពាក្យ​សម្ងាážáŸ‹â€‹áž”ាន​និយាយ។"</string>
+ <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Dot."</string>
+ <string name="action_bar_home_description" msgid="5293600496601490216">"រកមើល​ទៅ​ដើម"</string>
+ <string name="action_bar_up_description" msgid="2237496562952152589">"រកមើល​ឡើងលើ"</string>
+ <string name="action_menu_overflow_description" msgid="2295659037509008453">"ជម្រើស​ច្រើន​ទៀáž"</string>
+ <string name="action_bar_home_description_format" msgid="7965984360903693903">"%1$s, %2$s"</string>
+ <string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string>
+ <string name="storage_internal" msgid="4891916833657929263">"ឧបករណáŸâ€‹áž•្ទុក​ážáž¶áž„​ក្នុង"</string>
+ <string name="storage_sd_card" msgid="3282948861378286745">"កាážâ€‹áž¢áŸážŸážŒáž¸"</string>
+ <string name="storage_usb" msgid="3017954059538517278">"ឧបករណáŸâ€‹áž•្ទុក​យូអáŸážŸáž”៊ី"</string>
+ <string name="extract_edit_menu_button" msgid="8940478730496610137">"កែសម្រួល"</string>
+ <string name="data_usage_warning_title" msgid="1955638862122232342">"ការព្រមាន​ប្រើ​ទិន្ននáŸáž™"</string>
+ <string name="data_usage_warning_body" msgid="2814673551471969954">"ប៉ះ ដើម្បី​មើល​ការ​ប្រើ និង​ការ​កំណážáŸ‹áŸ”"</string>
+ <string name="data_usage_3g_limit_title" msgid="7093334419518706686">"បាន​បិទ​ទិន្ននáŸáž™ 2G​-3G"</string>
+ <string name="data_usage_4g_limit_title" msgid="7636489436819470761">"បាន​បិទ​ទិន្ននáŸáž™ 4G"</string>
+ <string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"បាន​បិទ​ទិន្ននáŸáž™â€‹áž…áž›áŸáž"</string>
+ <string name="data_usage_wifi_limit_title" msgid="8992154736441284865">"បាន​បិទ​ទិន្ននáŸáž™â€‹ážœáŸ‰áž¶áž™áž áŸ’វាយ"</string>
+ <string name="data_usage_limit_body" msgid="3317964706973601386">"ប៉ះ​​ ដើម្បី​បើក​។"</string>
+ <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"លើស​ដែន​កំណážáŸ‹â€‹áž‘ិន្ននáŸáž™ 2G​-3G"</string>
+ <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"បាន​លើស​ដែន​កំណážáŸ‹â€‹áž‘ិន្ននáŸáž™ 4G"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"បាន​លើស​ដែន​កំណážáŸ‹â€‹áž‘ិន្ននáŸáž™â€‹áž…áž›áŸáž"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"លើស​ដែន​កំណážáŸ‹â€‹áž‘ិន្ននáŸáž™â€‹ážœáŸ‰áž¶áž™áž áŸ’វាយ"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"<xliff:g id="SIZE">%s</xliff:g> លើ​ដែន​កំណážáŸ‹â€‹áž”ាន​បញ្ជាក់។"</string>
+ <string name="data_usage_restricted_title" msgid="5965157361036321914">"បាន​ដាក់​កម្រិážâ€‹áž‘ិន្ននáŸáž™â€‹áž•្ទៃ​ážáž¶áž„​ក្រោយ"</string>
+ <string name="data_usage_restricted_body" msgid="6741521330997452990">"ប៉ះ ដើម្បី​លុប​ការ​ដាក់កម្រិážáŸ”"</string>
+ <string name="ssl_certificate" msgid="6510040486049237639">"វិញ្ញាបនបážáŸ’រ​សុវážáŸ’ážáž·áž—áž¶áž–"</string>
+ <string name="ssl_certificate_is_valid" msgid="6825263250774569373">"វិញ្ញាបនបážáŸ’រ​នáŸáŸ‡â€‹â€‹â€‹â€‹ážáŸ’រឹមážáŸ’រូវ​។"</string>
+ <string name="issued_to" msgid="454239480274921032">"បាន​ចáŸáž‰â€‹áž²áŸ’យ​៖"</string>
+ <string name="common_name" msgid="2233209299434172646">"ឈ្មោះ​ទូទៅ៖"</string>
+ <string name="org_name" msgid="6973561190762085236">"ស្ážáž¶áž”áŸáž“៖"</string>
+ <string name="org_unit" msgid="7265981890422070383">"ផ្នែក​នៃ​ស្ážáž¶áž”áŸáž“៖"</string>
+ <string name="issued_by" msgid="2647584988057481566">"បាន​ចáŸáž‰â€‹ážŠáŸ„យ​៖"</string>
+ <string name="validity_period" msgid="8818886137545983110">"សុពលភាព៖"</string>
+ <string name="issued_on" msgid="5895017404361397232">"áž…áŸáž‰â€‹áž“ៅ៖"</string>
+ <string name="expires_on" msgid="3676242949915959821">"ផុážâ€‹áž€áŸ†ážŽážáŸ‹â€‹áž“ៅ៖"</string>
+ <string name="serial_number" msgid="758814067660862493">"áž›áŸážâ€‹ážŸáŸŠáŸážšáž¸áŸ–"</string>
+ <string name="fingerprints" msgid="4516019619850763049">"ស្នាម​ម្រាមដៃ​៖"</string>
+ <string name="sha256_fingerprint" msgid="4391271286477279263">"ស្នាម​ម្រាមដៃ SHA​-256 ​៖"</string>
+ <string name="sha1_fingerprint" msgid="7930330235269404581">"ស្នាម​ម្រាម​ដៃ SHA-1 ៖"</string>
+ <string name="activity_chooser_view_see_all" msgid="4292569383976636200">"មើល​ទាំងអស់"</string>
+ <string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"ជ្រើស​សកម្មភាព"</string>
+ <string name="share_action_provider_share_with" msgid="5247684435979149216">"ចែករំលែក​ជា​មួយ"</string>
+ <string name="status_bar_device_locked" msgid="3092703448690669768">"ឧបករណáŸâ€‹áž‡áž¶áž”់​សោ​។"</string>
+ <string name="list_delimeter" msgid="3975117572185494152">", "</string>
+ <string name="sending" msgid="3245653681008218030">"កំពុង​ផ្ញើ..."</string>
+ <string name="launchBrowserDefault" msgid="2057951947297614725">"ចាប់ផ្ដើម​កម្មវិធី​អ៊ីនធឺណិ�"</string>
+ <string name="SetupCallDefault" msgid="5834948469253758575">"ទទួល​ការ​ហៅ​?"</string>
+ <string name="activity_resolver_use_always" msgid="8017770747801494933">"ជា​និច្ច"</string>
+ <string name="activity_resolver_use_once" msgid="2404644797149173758">"ážáŸ‚​ម្ដង"</string>
+ <string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"កុំព្យូទáŸážšâ€‹áž”ន្ទះ"</string>
+ <string name="default_audio_route_name" product="default" msgid="4239291273420140123">"ទូរសáŸáž–្ទ"</string>
+ <string name="default_audio_route_name_headphones" msgid="8119971843803439110">"កាស"</string>
+ <string name="default_audio_route_name_dock_speakers" msgid="6240602982276591864">"ភ្ជាប់​អូប៉ាលáŸážš"</string>
+ <string name="default_media_route_name_hdmi" msgid="2450970399023478055">"HDMI"</string>
+ <string name="default_audio_route_category_name" msgid="3722811174003886946">"ប្រពáŸáž“្ធ"</string>
+ <string name="bluetooth_a2dp_audio_route_name" msgid="8575624030406771015">"សំឡáŸáž„​ប៊្លូធូស"</string>
+ <string name="wireless_display_route_description" msgid="9070346425023979651">"បង្ហាញ​បណ្ដាញ​ឥážâ€‹ážáŸ’សែ"</string>
+ <string name="media_route_chooser_grouping_done" msgid="7966438307723317169">"រួចរាល់"</string>
+ <string name="media_route_button_content_description" msgid="5758553567065145276">"លទ្ធផល​មáŸážŒáŸ€"</string>
+ <string name="media_route_status_scanning" msgid="7279908761758293783">"កំពុង​វិភាគ​រក…"</string>
+ <string name="media_route_status_connecting" msgid="6422571716007825440">"កំពុង​​​ភ្ជាប់​…"</string>
+ <string name="media_route_status_available" msgid="6983258067194649391">"ទំនáŸážš"</string>
+ <string name="media_route_status_not_available" msgid="6739899962681886401">"មិន​ទំនáŸážš"</string>
+ <string name="media_route_status_in_use" msgid="4533786031090198063">"កំពុង​ប្រើ"</string>
+ <string name="display_manager_built_in_display_name" msgid="2583134294292563941">"អáŸáž€áŸ’រង់​ជាប់"</string>
+ <string name="display_manager_hdmi_display_name" msgid="1555264559227470109">"អáŸáž€áŸ’រង់ HDMI"</string>
+ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"#<xliff:g id="ID">%1$d</xliff:g> ážáŸ’ážšáž½ážâ€‹áž‚្នា"</string>
+ <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
+ <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", សុវážáŸ’ážáž·áž—áž¶áž–"</string>
+ <string name="wifi_display_notification_title" msgid="2223050649240326557">"បាន​ភ្ជាប់​ការ​បង្ហាញ​បណ្ដាញ​ឥážâ€‹ážáŸ’សែ"</string>
+ <string name="wifi_display_notification_message" msgid="4498802012464170685">"អáŸáž€áŸ’រង់​នáŸáŸ‡â€‹áž”ង្ហាញ​លើ​ឧបករណáŸâ€‹áž•្សáŸáž„"</string>
+ <string name="wifi_display_notification_disconnect" msgid="6183754463561153372">"ផ្ដាច់"</string>
+ <string name="kg_emergency_call_label" msgid="684946192523830531">"ការ​ហៅ​ពáŸáž›â€‹áž¢áž¶ážŸáž“្ន"</string>
+ <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"ភ្លáŸáž…​​លំនាំ"</string>
+ <string name="kg_wrong_pattern" msgid="1850806070801358830">"លំនាំ​មិន​ážáŸ’រឹមážáŸ’រូវ"</string>
+ <string name="kg_wrong_password" msgid="2333281762128113157">"ពាក្យ​សម្ងាážáŸ‹â€‹áž˜áž·áž“​ážáŸ’រឹមážáŸ’រូវ"</string>
+ <string name="kg_wrong_pin" msgid="1131306510833563801">"កូដ PIN មិន​ážáŸ’រឹមážáŸ’រូវ"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"ព្យាយាម​ម្ដង​ទៀážâ€‹áž€áŸ’នុង​រយៈ​ពáŸáž› <xliff:g id="NUMBER">%1$d</xliff:g> វិនាទី។"</string>
+ <string name="kg_pattern_instructions" msgid="398978611683075868">"គូរ​លំនាំ​របស់​អ្នក"</string>
+ <string name="kg_sim_pin_instructions" msgid="2319508550934557331">"បញ្ចូល​កូដ PIN ស៊ីម​កាáž"</string>
+ <string name="kg_pin_instructions" msgid="2377242233495111557">"បញ្ចូល​​កូដ PIN"</string>
+ <string name="kg_password_instructions" msgid="5753646556186936819">"បញ្ចូល​ពាក្យ​សម្ងាážáŸ‹"</string>
+ <string name="kg_puk_enter_puk_hint" msgid="453227143861735537">"ឥឡូវ​ស៊ីមកាážâ€‹ážáŸ’រូវ​បាន​បិទ។ បញ្ចូល​កូដ PUK ដើម្បី​បន្ážáŸ” ចំពោះ​ពáŸážáŸŒáž˜áž¶áž“​លម្អិážâ€‹áž‘ាក់ទង​ក្រុមហ៊ុន​បញ្ជូន​របស់​អ្នក។"</string>
+ <string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"បញ្ចូល​កូដ PIN ដែល​ចង់​បាន"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"បញ្ជាក់​កូដ PIN ដែល​ចង់​បាន"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"កំពុង​ដោះ​សោ​​ស៊ីម​កាáž..."</string>
+ <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"កូដ PIN មិន​ážáŸ’រឹមážáŸ’រូវ។"</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"បញ្ចូល​កូដ PIN ដែល​មាន​ពី ៤ ដល់ ៨ áž›áŸážáŸ”"</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"កូដ PUK គួរ​ážáŸ‚​មាន​​ ៨ áž›áŸáž ឬ​​ច្រើន​ជាង​នáŸáŸ‡áŸ”"</string>
+ <string name="kg_invalid_puk" msgid="3638289409676051243">"បញ្ចូល​កូដ PUK ម្ដង​ទៀážáŸ” ការ​ព្យាយាម​ដដែល​ច្រើន​ដឹង​នឹង​បិទ​ស៊ីម​កាážâ€‹áž‡áž¶â€‹áž¢áž…ិន្ážáŸ’រៃយáŸáŸ”"</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"កូដ PIN មិន​ដូច​គ្នា"</string>
+ <string name="kg_login_too_many_attempts" msgid="6486842094005698475">"ព្យាយាម​លំនាំ​ច្រើន​ពáŸáž€"</string>
+ <string name="kg_login_instructions" msgid="1100551261265506448">"ដើម្បី​ដោះ​សោ ចូល​ក្នុង​គណនី Google ។"</string>
+ <string name="kg_login_username_hint" msgid="5718534272070920364">"ឈ្មោះ​អ្នក​ប្រើ (អ៊ី​ម៉ែ​ល​)"</string>
+ <string name="kg_login_password_hint" msgid="9057289103827298549">"ពាក្យសម្ងាážáŸ‹"</string>
+ <string name="kg_login_submit_button" msgid="5355904582674054702">"ចូល"</string>
+ <string name="kg_login_invalid_input" msgid="5754664119319872197">"ឈ្មោះ​អ្នកប្រើ ឬ​ពាក្យ​សម្ងាážáŸ‹â€‹áž˜áž·áž“​ážáŸ’រឹមážáŸ’រូវ។"</string>
+ <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"ភ្លáŸáž…​ឈ្មោះ​អ្នកប្រើ ឬ​ពាក្យ​សម្ងាážáŸ‹â€‹ážšáž”ស់​អ្នក?\nមើល "<b>"google.com/accounts/recovery"</b>" ។"</string>
+ <string name="kg_login_checking_password" msgid="1052685197710252395">"កំពុង​ពិនិážáŸ’យ​មើល​គណនី..."</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"អ្នក​បាន​បញ្ចូល​កូដ PIN របស់​អ្នក​មិន​ážáŸ’រឹមážáŸ’រូវ​ចំនួន <xliff:g id="NUMBER_0">%d</xliff:g> ដង។\n\n ព្យាយាម​ម្ដង​ទៀážâ€‹áž€áŸ’នុង​រយៈ​ពáŸáž› <xliff:g id="NUMBER_1">%d</xliff:g> វិនាទី។"</string>
+ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"អ្នក​បាន​បញ្ចូល​ពាក្យ​សម្ងាážáŸ‹â€‹áž˜áž·áž“​ážáŸ’រឹមážáŸ’រូវ <xliff:g id="NUMBER_0">%d</xliff:g> ដង។\n\nព្យាយាម​ម្ដង​ទៀážâ€‹áž€áŸ’នុង​រយៈ​ពáŸáž› <xliff:g id="NUMBER_1">%d</xliff:g> វិនាទី។"</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"អ្នក​បាន​​គូរ​លំនាំ​ដោះ​សោ​របស់​អ្នក​មិន​ážáŸ’រឹមážáŸ’រូវ​ចំនួន <xliff:g id="NUMBER_0">%d</xliff:g> ដង។\n\nព្យាយាម​ម្ដង​ទៀážâ€‹áž€áŸ’នុង​រយៈ​ពáŸáž› <xliff:g id="NUMBER_1">%d</xliff:g> វិនាទី។"</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1575557200627128949">"អ្នក​បាន​ព្យាយាម​ដោះ​សោ​​កុំព្យូទáŸážšâ€‹áž”ន្ទះ​​មិន​ážáŸ’រឹមážáŸ’រូវ​ចំនួន <xliff:g id="NUMBER_0">%d</xliff:g> ដង។ បន្ទាប់​ពី​ការ​ព្យាយាម​មិន​ជោគជáŸáž™â€‹â€‹áž…្រើន​ជាង <xliff:g id="NUMBER_1">%d</xliff:g> ដង កុំព្យូទáŸážšâ€‹áž”ន្ទះ​​នឹង​ážáŸ’រូវ​បាន​កំណážáŸ‹â€‹áž‘ៅ​លំនាំដើម​ដូច​ចáŸáž‰â€‹áž–ី​រោងចក្រ ហើយ​ទិន្ននáŸáž™â€‹áž¢áŸ’នកប្រើ​នឹង​បាážáŸ‹áž”ង់។"</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="4051015943038199910">"អ្នក​បាន​ព្យាយាម​ដោះ​សោ​ទូរសáŸáž–្ទ​មិន​ážáŸ’រឹមážáŸ’រូវ​ចំនួន <xliff:g id="NUMBER_0">%d</xliff:g> ដង។ បន្ទាប់​ពី​ការ​ព្យាយាម​មិន​ជោគជáŸáž™â€‹â€‹áž…្រើន​ជាង <xliff:g id="NUMBER_1">%d</xliff:g> ដង ទូរសáŸáž–្ទ​នឹង​ážáŸ’រូវ​បាន​កំណážáŸ‹â€‹áž‘ៅ​លំនាំដើម​ដូច​ចáŸáž‰â€‹áž–ី​រោងចក្រ ហើយ​ទិន្ននáŸáž™â€‹áž¢áŸ’នកប្រើ​នឹង​បាážáŸ‹áž”ង់។"</string>
+ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="2072996269148483637">"អ្នក​បាន​ព្យាយាម​ដោះ​សោ​កុំព្យូទáŸážšâ€‹áž”ន្ទះ​មិន​ážáŸ’រឹមážáŸ’រូវ​ចំនួន​ <xliff:g id="NUMBER">%d</xliff:g> ដង។ កុំព្យូទáŸážšâ€‹áž”ន្ទះ​នឹង​ážáŸ’រូវ​បាន​កំណážáŸ‹â€‹áž‘ៅ​លំនាំដើម​ដូច​ចáŸáž‰â€‹áž–ី​រោងចក្រ"</string>
+ <string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"អ្នក​បាន​ព្យាយាម​ដោះ​សោ​ទូរសáŸáž–្ទ​មិន​ážáŸ’រឹមážáŸ’រូវ​ចំនួន <xliff:g id="NUMBER">%d</xliff:g> ដង។ ឥឡូវ​ទូរសáŸáž–្ទ​នឹង​កំណážáŸ‹â€‹áž‘ៅ​លំនាំ​ដើម​ដូច​ចáŸáž‰â€‹áž–ី​រោងចក្រ។"</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"អ្នក​បាន​គូរ​លំនាំ​ដោះ​សោ​មិន​ážáŸ’រឹមážáŸ’រូវ <xliff:g id="NUMBER_0">%d</xliff:g> ដង។ បន្ទាប់​ពី​ការ​ព្យាយាម <xliff:g id="NUMBER_1">%d</xliff:g> ដង​មិន​ជោគជáŸáž™ អ្នក​នឹង​ážáŸ’រូវ​បាន​ស្នើ​ឲ្យ​ដោះ​សោ​កុំព្យូទáŸážšâ€‹áž”ន្ទះ​របស់​អ្នក ដោយ​ប្រើ​គណនី​អ៊ីមែល។\n\n ព្យាយាម​ម្ដង​ទៀážâ€‹áž€áŸ’នុង​រយៈ​ពáŸáž› <xliff:g id="NUMBER_2">%d</xliff:g> វិនាទី។"</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"អ្នក​បាន​គូរ​លំនាំ​ដោះ​​សោ​របស់​អ្នក​មិន​ážáŸ’រឹមážáŸ’រូវ​ចំនួន <xliff:g id="NUMBER_0">%d</xliff:g> ដង។ បន្ទាប់​ពី​ការ​ព្យាយាម​មិន​ជោគជáŸáž™â€‹â€‹áž…្រើនជាង <xliff:g id="NUMBER_1">%d</xliff:g> ដង អ្នក​នឹង​ážáŸ’រូវ​បាន​​ស្នើ​ឲ្យ​ដោះ​សោ​ទូរសáŸáž–្ទ​របស់​អ្នក​ដោយ​ប្រើ​គណនី​អ៊ីមែល។\n\n ព្យាយាម​ម្ដង​ទៀážâ€‹áž€áŸ’នុង​រយៈ​ពáŸáž› <xliff:g id="NUMBER_2">%d</xliff:g> វិនាទី។"</string>
+ <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
+ <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"លុប​ចáŸáž‰"</string>
+ <string name="safe_media_volume_warning" product="default" msgid="7324161939475478066">"បង្កើន​កម្រិážâ€‹ážŸáŸ†áž¡áŸáž„​ážáž¶áž„​លើ​កម្រិážâ€‹áž”ាន​​ណែនាំ?\nស្ដាប់​កម្រិážâ€‹ážŸáŸ†áž¡áŸáž„​ážáŸ’ពស់​រយៈ​ពáŸáž›â€‹áž™áž¼ážšâ€‹áž¢áž¶áž…​ឲ្យ​ážáž¼áž…​ážáŸ’រចៀក។"</string>
+ <string name="continue_to_enable_accessibility" msgid="1626427372316070258">"សង្កážáŸ‹â€‹ážŠáŸ„យ​ម្រាមដៃ​ពីរ ដើម្បី​បើក​ភាព​ងាយស្រួល។"</string>
+ <string name="accessibility_enabled" msgid="1381972048564547685">"បាន​បើក​មធ្យោបាយ​ងាយស្រួល​។"</string>
+ <string name="enable_accessibility_canceled" msgid="3833923257966635673">"បាន​បោះបង់​ភាព​ងាយស្រួល។"</string>
+ <string name="user_switched" msgid="3768006783166984410">"អ្នក​ប្រើ​បច្ចុប្បន្ន <xliff:g id="NAME">%1$s</xliff:g> ។"</string>
+ <string name="owner_name" msgid="2716755460376028154">"ម្ចាស់"</string>
+ <string name="error_message_title" msgid="4510373083082500195">"កំហុស"</string>
+ <string name="app_no_restricted_accounts" msgid="5739463249673727736">"កម្មវិធី​នáŸáŸ‡â€‹áž˜áž·áž“​គាំទ្រ​គណនី​សម្រាប់​ប្រវážáŸ’ážáž·ážšáž¼áž”​ដែល​បាន​ដាក់​កម្រិážâ€‹áž‘áŸ"</string>
+ <string name="app_not_found" msgid="3429141853498927379">"រក​មិន​ឃើញ​កម្មវិធី​ ដើម្បី​គ្រប់គ្រង​សកម្មភាព​នáŸáŸ‡"</string>
+ <string name="revoke" msgid="5404479185228271586">"ដកហូáž"</string>
+ <string name="mediaSize_iso_a0" msgid="7875427489420821793">"ISO A0"</string>
+ <string name="mediaSize_iso_a1" msgid="3760734499050875356">"ISO A1"</string>
+ <string name="mediaSize_iso_a2" msgid="5973266378020144382">"ISO A2"</string>
+ <string name="mediaSize_iso_a3" msgid="1373407105687300884">"ISO A3"</string>
+ <string name="mediaSize_iso_a4" msgid="6689772807982597254">"ISO A4"</string>
+ <string name="mediaSize_iso_a5" msgid="5353549652015741040">"ISO A5"</string>
+ <string name="mediaSize_iso_a6" msgid="8585038048674911907">"ISO A6"</string>
+ <string name="mediaSize_iso_a7" msgid="6641836716963839119">"ISO A7"</string>
+ <string name="mediaSize_iso_a8" msgid="7571139437465693355">"ISO A8"</string>
+ <string name="mediaSize_iso_a9" msgid="1378455891957115079">"ISO A9"</string>
+ <string name="mediaSize_iso_a10" msgid="2480747457429475344">"ISO A10"</string>
+ <string name="mediaSize_iso_b0" msgid="3965935097661108039">"ISO B0"</string>
+ <string name="mediaSize_iso_b1" msgid="2505753285010115437">"ISO B1"</string>
+ <string name="mediaSize_iso_b2" msgid="8763874709859458453">"ISO B2"</string>
+ <string name="mediaSize_iso_b3" msgid="4210506688191764076">"ISO B3"</string>
+ <string name="mediaSize_iso_b4" msgid="5749404165888526034">"ISO B4"</string>
+ <string name="mediaSize_iso_b5" msgid="7640627414621904733">"ISO B5"</string>
+ <string name="mediaSize_iso_b6" msgid="7342988864712748544">"ISO B6"</string>
+ <string name="mediaSize_iso_b7" msgid="5069844065235382429">"ISO B7"</string>
+ <string name="mediaSize_iso_b8" msgid="7316818922278779774">"ISO B8"</string>
+ <string name="mediaSize_iso_b9" msgid="5414727094026532341">"ISO B9"</string>
+ <string name="mediaSize_iso_b10" msgid="5251253731832048185">"ISO B10"</string>
+ <string name="mediaSize_iso_c0" msgid="4003138342671964217">"ISO C0"</string>
+ <string name="mediaSize_iso_c1" msgid="1935188063393553008">"ISO C1"</string>
+ <string name="mediaSize_iso_c2" msgid="3197307969712069904">"ISO C2"</string>
+ <string name="mediaSize_iso_c3" msgid="4335826087321913508">"ISO C3"</string>
+ <string name="mediaSize_iso_c4" msgid="3745639598281015005">"ISO C4"</string>
+ <string name="mediaSize_iso_c5" msgid="8269457765822791013">"ISO C5"</string>
+ <string name="mediaSize_iso_c6" msgid="566666105260346930">"ISO C6"</string>
+ <string name="mediaSize_iso_c7" msgid="8678413180782608498">"ISO C7"</string>
+ <string name="mediaSize_iso_c8" msgid="8392376206627041730">"ISO C8"</string>
+ <string name="mediaSize_iso_c9" msgid="9191613372324845405">"ISO C9"</string>
+ <string name="mediaSize_iso_c10" msgid="7327709699184920822">"ISO C10"</string>
+ <string name="mediaSize_na_letter" msgid="4191805615829472953">"Letter"</string>
+ <string name="mediaSize_na_gvrnmt_letter" msgid="7853382192649405507">"លិážáž·ážâ€‹ážšážŠáŸ’ឋាភិបាល"</string>
+ <string name="mediaSize_na_legal" msgid="6697982988283823150">"Legal"</string>
+ <string name="mediaSize_na_junior_legal" msgid="3727743969902758948">"Junior Legal"</string>
+ <string name="mediaSize_na_ledger" msgid="281871464896601236">"Ledger"</string>
+ <string name="mediaSize_na_tabloid" msgid="5775966416333578127">"Tabloid"</string>
+ <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"បាន​បោះ​បង់"</string>
+ <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"កំហុស​ក្នុង​ការ​សរសáŸážšâ€‹áž˜áž¶ážáž·áž€áž¶"</string>
+ <string name="restr_pin_enter_pin" msgid="3395953421368476103">"បញ្ចូល​​កូដ PIN"</string>
+ <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"កូដ PIN បច្ចុប្បន្ន"</string>
+ <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"កូដ PIN ážáŸ’មី"</string>
+ <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"បញ្ជាក់​កូដ PIN ážáŸ’មី"</string>
+ <string name="restr_pin_create_pin" msgid="8017600000263450337">"បង្កើážâ€‹áž€áž¼ážŠ PIN សម្រាប់​កែ​ការ​ដាក់​កម្រិáž"</string>
+ <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"កូដ PIN មិន​ដូច​គ្នា។ ព្យាយាម​ម្ដង​ទៀážáŸ”"</string>
+ <string name="restr_pin_error_too_short" msgid="8173982756265777792">"កូដ​ PIN ážáŸ’លី​ពáŸáž€áŸ” ážáŸ’រូវ​ážáŸ‚​មាន​យ៉ាង​ហោច​ណាស់ ៤ ážáž½áŸ”"</string>
+ <plurals name="restr_pin_countdown">
+ <item quantity="one" msgid="4835639969503729874">"áž›áŸážâ€‹áž€áž¼ážŠâ€‹ PIN មិន​ážáŸ’រឹមážáŸ’រូវ។ ព្យាយាម​ម្ដង​ទៀážâ€‹áž€áŸ’នុង​រយៈ​ពáŸáž› ១ វិនាទី។"</item>
+ <item quantity="other" msgid="8030607343223287654">"áž›áŸážâ€‹áž€áž¼ážŠâ€‹ PIN មិន​ážáŸ’រឹមážáŸ’រូវ។ ព្យាយាម​ម្ដង​ទៀážâ€‹áž€áŸ’នុង​រយៈ​ពáŸáž› <xliff:g id="COUNT">%d</xliff:g> វិនាទី​។"</item>
+ </plurals>
+ <string name="transient_navigation_confirmation" msgid="4907844043611123426">"អូស​គែម​អáŸáž€áŸ’រង់ ដើម្បី​បង្ហាញ​របារ"</string>
+ <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"អូស​ពី​គែម​អáŸáž€áŸ’រង់ ដើម្បី​បង្ហាញ​របារ​ប្រពáŸáž“្ធ"</string>
+</resources>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index 1a0b2d9..4147c39 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -50,6 +50,11 @@
<string name="invalidPuk" msgid="8761456210898036513">"8ìžë¦¬ ì´ìƒì˜ ìˆ«ìž PUK를 입력합니다."</string>
<string name="needPuk" msgid="919668385956251611">"SIM ì¹´ë“œì˜ PUKê°€ 잠겨 있습니다. 잠금해제하려면 PUK 코드를 입력하세요."</string>
<string name="needPuk2" msgid="4526033371987193070">"SIM 카드 ìž ê¸ˆì„ í•´ì œí•˜ë ¤ë©´ PUK2를 입력하세요."</string>
+ <string name="enablePin" msgid="209412020907207950">"실패했습니다. SIM/RUIM ìž ê¸ˆì„ ì‚¬ìš© 설정하세요."</string>
+ <plurals name="pinpuk_attempts">
+ <item quantity="one" msgid="6596245285809790142">"<xliff:g id="NUMBER">%d</xliff:g>회 ì´ìƒ 실패할 경우 SIMì´ ìž ê¹ë‹ˆë‹¤."</item>
+ <item quantity="other" msgid="7530597808358774740">"<xliff:g id="NUMBER">%d</xliff:g>회 ì´ìƒ 실패할 경우 SIMì´ ìž ê¹ë‹ˆë‹¤."</item>
+ </plurals>
<string name="imei" msgid="2625429890869005782">"IMEI"</string>
<string name="meid" msgid="4841221237681254195">"MEID"</string>
<string name="ClipMmi" msgid="6952821216480289285">"ë°œì‹ ìž ë²ˆí˜¸"</string>
@@ -477,6 +482,8 @@
<string name="permdesc_accessSurfaceFlinger" msgid="1041619516733293551">"ì•±ì´ SurfaceFlingerì˜ í•˜ìœ„ 수준 ê¸°ëŠ¥ì„ ì‚¬ìš©í•  수 있ë„ë¡ í—ˆìš©í•©ë‹ˆë‹¤."</string>
<string name="permlab_readFrameBuffer" msgid="6690504248178498136">"프레임 ë²„í¼ ì½ê¸°"</string>
<string name="permdesc_readFrameBuffer" msgid="4937405521809454680">"ì•±ì´ í”„ë ˆìž„ 버í¼ì˜ ë‚´ìš©ì„ ì½ì„ 수 있ë„ë¡ í—ˆìš©í•©ë‹ˆë‹¤."</string>
+ <string name="permlab_accessInputFlinger" msgid="5348635270689553857">"InputFlingerì— ì•¡ì„¸ìŠ¤"</string>
+ <string name="permdesc_accessInputFlinger" msgid="2104864941201226616">"ì•±ì´ InputFlingerì˜ í•˜ìœ„ 수준 ê¸°ëŠ¥ì„ ì‚¬ìš©í•˜ë„ë¡ í•©ë‹ˆë‹¤."</string>
<string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"Wi-Fi ë””ìŠ¤í”Œë ˆì´ ì„¤ì •"</string>
<string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"ì•±ì´ Wi-Fi 디스플레ì´ë¥¼ 설정하고 연결하ë„ë¡ í—ˆìš©í•©ë‹ˆë‹¤."</string>
<string name="permlab_controlWifiDisplay" msgid="393641276723695496">"Wi-Fi ë””ìŠ¤í”Œë ˆì´ ì œì–´"</string>
@@ -1414,6 +1421,7 @@
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift 키"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter 키"</string>
<string name="activitychooserview_choose_application" msgid="2125168057199941199">"앱 ì„ íƒ"</string>
+ <string name="activitychooserview_choose_application_error" msgid="8624618365481126668">"<xliff:g id="APPLICATION_NAME">%s</xliff:g>ì„(를) 실행할 수 없습니다."</string>
<string name="shareactionprovider_share_with" msgid="806688056141131819">"공유 대ìƒ:"</string>
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"<xliff:g id="APPLICATION_NAME">%s</xliff:g>와(과) 공유"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"슬ë¼ì´ë”© í•¸ë“¤ì„ ê¸¸ê²Œ 터치하세요."</string>
@@ -1649,5 +1657,16 @@
<item quantity="other" msgid="4730868920742952817">"<xliff:g id="COUNT">%d</xliff:g>ì´ˆ í›„ì— ë‹¤ì‹œ 시ë„하세요."</item>
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"ë‚˜ì¤‘ì— ë‹¤ì‹œ 시ë„"</string>
- <string name="immersive_mode_confirmation" msgid="7227416894979047467">"ì „ì²´í™”ë©´ì„ ì¢…ë£Œí•˜ë ¤ë©´ 위ì—서 아래로 스와ì´í”„"</string>
+ <string name="immersive_mode_confirmation" msgid="7227416894979047467">"ì „ì²´í™”ë©´ì„ ì¢…ë£Œí•˜ë ¤ë©´ 위ì—서 아래로 스와ì´í”„하세요."</string>
+ <string name="done_label" msgid="2093726099505892398">"완료"</string>
+ <string name="hour_picker_description" msgid="6698199186859736512">"시간 ì›í˜• 슬ë¼ì´ë”"</string>
+ <string name="minute_picker_description" msgid="8606010966873791190">"ë¶„ ì›í˜• 슬ë¼ì´ë”"</string>
+ <string name="select_hours" msgid="6043079511766008245">"시간 ì„ íƒ"</string>
+ <string name="select_minutes" msgid="3974345615920336087">"ë¶„ ì„ íƒ"</string>
+ <string name="day_picker_description" msgid="8990847925961297968">"월별 바둑íŒì‹ ë‚ ì§œ 표시"</string>
+ <string name="year_picker_description" msgid="5524331207436052403">"ë…„"</string>
+ <string name="select_day" msgid="7774759604701773332">"ì›”/ì¼ ì„ íƒ"</string>
+ <string name="select_year" msgid="7952052866994196170">"ì—°ë„ ì„ íƒ"</string>
+ <string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g>ì´(ê°€) ì„ íƒë¨"</string>
+ <string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> ì‚­ì œë¨"</string>
</resources>
diff --git a/core/res/res/values-land/dimens.xml b/core/res/res/values-land/dimens.xml
index dc59f61..640ca1e 100644
--- a/core/res/res/values-land/dimens.xml
+++ b/core/res/res/values-land/dimens.xml
@@ -61,6 +61,10 @@
Landscape's layout allows this to be smaller than for portrait. -->
<dimen name="kg_squashed_layout_threshold">400dp</dimen>
+ <!-- New TimePicker dimensions. -->
+ <dimen name="timepicker_left_side_width">250dip</dimen>
+
<!-- width of ImmersiveModeConfirmation (-1 for match_parent) -->
<dimen name="immersive_mode_cling_width">380dp</dimen>
+
</resources>
diff --git a/core/res/res/values-lo-rLA/strings.xml b/core/res/res/values-lo-rLA/strings.xml
index 003b3f9..816f7fc 100644
--- a/core/res/res/values-lo-rLA/strings.xml
+++ b/core/res/res/values-lo-rLA/strings.xml
@@ -50,6 +50,11 @@
<string name="invalidPuk" msgid="8761456210898036513">"ພິມລະຫັດ PUK ທີ່ມີ 8 ໂຕເລຠຫຼືຫຼາàºàºàº§à»ˆàº²àº™àº±à»‰àº™."</string>
<string name="needPuk" msgid="919668385956251611">"ຊິມàºàº²àº”ຂອງທ່ານຖືàºàº¥àº±àº­àºàº”້ວàºàº¥àº°àº«àº±àº” PUK. ໃຫ້ພິມລະຫັດ PUK ເພື່ອປົດລັອàºàº¡àº±àº™."</string>
<string name="needPuk2" msgid="4526033371987193070">"ພິມ PUK2 ເພື່ອປົດລັອຠSIM card."</string>
+ <string name="enablePin" msgid="209412020907207950">"ບà»à»ˆàºªàº³à»€àº¥àº±àº”, ເປີດນà»àº²à»ƒàºŠà»‰àºàº²àº™àº¥àº±àº­àºàº‚ອງ SIM/RUIM."</string>
+ <plurals name="pinpuk_attempts">
+ <item quantity="one" msgid="6596245285809790142">"ທ່ານສາມາດລອງໄດ້ອີຠ<xliff:g id="NUMBER">%d</xliff:g> ເທື່ອàºà»ˆàº­àº™àº—ີ່ SIM ຂອງທ່ານຈະຖືàºàº¥àº±àº­àº."</item>
+ <item quantity="other" msgid="7530597808358774740">"ທ່ານສາມາດລອງໄດ້ອີຠ<xliff:g id="NUMBER">%d</xliff:g> ເທື່ອàºà»ˆàº­àº™àº—ີ່ SIM ຂອງທ່ານຈະຖືàºàº¥àº±àº­àº."</item>
+ </plurals>
<string name="imei" msgid="2625429890869005782">"IMEI"</string>
<string name="meid" msgid="4841221237681254195">"MEID"</string>
<string name="ClipMmi" msgid="6952821216480289285">"à»àº²àºà»€àº¥àºàºœàº¹à»ˆà»‚ທເຂົ້າ"</string>
@@ -477,6 +482,8 @@
<string name="permdesc_accessSurfaceFlinger" msgid="1041619516733293551">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àº™àº³à»ƒàºŠà»‰àº„ວາມສາມາດລະດັບຕ່ຳ SurfaceFlinger"</string>
<string name="permlab_readFrameBuffer" msgid="6690504248178498136">"ອ່ານເຟຣມບັບເຟີ"</string>
<string name="permdesc_readFrameBuffer" msgid="4937405521809454680">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àº­à»ˆàº²àº™à»€àº™àº·à»‰àº­àº«àº²àº‚ອງເຟຣມບັບເຟີ."</string>
+ <string name="permlab_accessInputFlinger" msgid="5348635270689553857">"ເຂົ້າເຖິງ InputFlinger"</string>
+ <string name="permdesc_accessInputFlinger" msgid="2104864941201226616">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àº™àº³à»ƒàºŠà»‰àº„ວາມສາມາດ InputFlinger ລະດັບຕ່ຳ"</string>
<string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"ປັບຄ່າàºàº²àº™àºªàº°à»àº”ງຜົນ WiFi"</string>
<string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àº•ັ້ງຄ່າ à»àº¥àº°à»€àºŠàº·à»ˆàº­àº¡àº•à»à»ˆàºˆà»àºªàº°à»àº”ງຜົນ WiFi."</string>
<string name="permlab_controlWifiDisplay" msgid="393641276723695496">"ຄວບຄຸມàºàº²àº™àºªàº°à»àº”ງ WiFi"</string>
@@ -1114,7 +1121,7 @@
<string name="loading" msgid="7933681260296021180">"àºàº³àº¥àº±àº‡à»‚ຫລດ..."</string>
<string name="capital_on" msgid="1544682755514494298">"ເປີດ"</string>
<string name="capital_off" msgid="6815870386972805832">"ປິດ"</string>
- <string name="whichApplication" msgid="4533185947064773386">"ເຮັດວຽàºà»ƒàº«à»‰àºªàº³à»€àº¥àº±àº”ໂດàºà»ƒàºŠà»‰"</string>
+ <string name="whichApplication" msgid="4533185947064773386">"ດຳເນີນàºàº²àº™à»‚ດàºà»ƒàºŠà»‰"</string>
<string name="whichHomeApplication" msgid="4616420172727326782">"ເລືອàºà»àº­àº±àºšàº¯ Home"</string>
<string name="alwaysUse" msgid="4583018368000610438">"ໃຊ້ໂດàºàº„່າເລີ່ມຕົນສຳລັບàºàº²àº™à»€àº®àº±àº”ວຽàºàº™àºµà»‰."</string>
<string name="clearDefaultHintMsg" msgid="3252584689512077257">"ລຶບລ້າງຄ່າເລີ່ມຕົ້ນ ໃນ àºàº²àº™àº•ັ້ງຄ່າລະບົບ &gt; à»àº­àº±àºšàº¯ &gt; ດາວໂຫລດà»àº¥à»‰àº§."</string>
@@ -1414,6 +1421,7 @@
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
<string name="activitychooserview_choose_application" msgid="2125168057199941199">"ເລືອàºà»àº­àº±àºšàº¯"</string>
+ <string name="activitychooserview_choose_application_error" msgid="8624618365481126668">"ບà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ເປີດ <xliff:g id="APPLICATION_NAME">%s</xliff:g> ໄດ້"</string>
<string name="shareactionprovider_share_with" msgid="806688056141131819">"à»àºšà»ˆàº‡àº›àº±àº™àºàº±àºš"</string>
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"à»àºšà»ˆàº‡àº›àº±àº™à»ƒàº«à»‰ <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"ເລື່ອນບ່ອນຖື à»àº¥à»‰àº§à»àº•ະຄ້າງໄວ້."</string>
@@ -1650,4 +1658,15 @@
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"ລອງໃà»à»ˆàº­àºµàºàº„ັ້ງໃນພາàºàº«àº¥àº±àº‡."</string>
<string name="immersive_mode_confirmation" msgid="7227416894979047467">"ປັດລົງມາຈາàºàº—າງເທິງເພື່ອອອàºàºˆàº²àºà»‚à»àº”ເຕັມໜ້າຈà»."</string>
+ <string name="done_label" msgid="2093726099505892398">"à»àº¥à»‰àº§à»†"</string>
+ <string name="hour_picker_description" msgid="6698199186859736512">"ໂຕà»àº¸àº™àº›àº±àºšàºŠàº»à»ˆàº§à»‚ມງ"</string>
+ <string name="minute_picker_description" msgid="8606010966873791190">"ໂຕà»àº¸àº™àº›àº±àºšàº™àº²àº—ີ"</string>
+ <string name="select_hours" msgid="6043079511766008245">"ເລືອàºâ€‹àºŠàº»à»ˆàº§â€‹à»‚ມງ"</string>
+ <string name="select_minutes" msgid="3974345615920336087">"ເລືອàºàº™àº²â€‹àº—ີ"</string>
+ <string name="day_picker_description" msgid="8990847925961297968">"ຕາຕາລາງວັນທີເດືອນປີ"</string>
+ <string name="year_picker_description" msgid="5524331207436052403">"ລາàºàºàº²àº™àº›àºµ"</string>
+ <string name="select_day" msgid="7774759604701773332">"ເລືອàºà»€àº”ືອນ à»àº¥àº° ວັນ"</string>
+ <string name="select_year" msgid="7952052866994196170">"ເລືອàºâ€‹àº›àºµ"</string>
+ <string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> ຖືàºà»€àº¥àº·àº­àºà»àº¥à»‰àº§"</string>
+ <string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> ຖືàºàº¥àº¶àºšà»àº¥à»‰àº§"</string>
</resources>
diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml
new file mode 100644
index 0000000..9d07ae6
--- /dev/null
+++ b/core/res/res/values-lo/strings.xml
@@ -0,0 +1,1588 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="byteShort" msgid="8340973892742019101">"B"</string>
+ <string name="kilobyteShort" msgid="5973789783504771878">"KB"</string>
+ <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
+ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
+ <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
+ <string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
+ <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string>
+ <string name="untitled" msgid="4638956954852782576">"&lt;ບà»à»ˆàº¡àºµàºŠàº·à»ˆ&gt;"</string>
+ <string name="ellipsis" msgid="7899829516048813237">"…"</string>
+ <string name="ellipsis_two_dots" msgid="1228078994866030736">"‥"</string>
+ <string name="emptyPhoneNumber" msgid="7694063042079676517">"(ບà»à»ˆàº¡àºµà»€àºšàºµà»‚ທລະສັບ)"</string>
+ <string name="unknownName" msgid="2277556546742746522">"(ບà»à»ˆàº®àº¹à»‰)"</string>
+ <string name="defaultVoiceMailAlphaTag" msgid="2660020990097733077">"ຂà»à»‰àº„ວາມສຽງ"</string>
+ <string name="defaultMsisdnAlphaTag" msgid="2850889754919584674">"MSISDN1"</string>
+ <string name="mmiError" msgid="5154499457739052907">"ມີບັນຫາໃນàºàº²àº™à»€àºŠàº·à»ˆàº­àº¡àº•à»à»ˆ ຫຼືລະຫັດ MMI ບà»à»ˆàº–ືàºàº•້ອງ."</string>
+ <string name="mmiFdnError" msgid="5224398216385316471">"àºàº²àº™àº”ຳເນີນàºàº²àº™àº–ືàºàºˆàº³àºàº±àº”ເປັນ ຈຳàºàº±àº”à»àº²àºà»€àº¥àºà»‚ທອອàºà»€àº—ົ່ານັ້ນ."</string>
+ <string name="serviceEnabled" msgid="8147278346414714315">"ບà»àº¥àº´àºàº²àº™àº–ືàºà»€àº›àºµàº”ໄວ້à»àº¥à»‰àº§."</string>
+ <string name="serviceEnabledFor" msgid="6856228140453471041">"ບà»àº¥àº´àºàº²àº™àº–ືàºà»€àº›àºµàº”ໃຊ້ສຳລັບ:"</string>
+ <string name="serviceDisabled" msgid="1937553226592516411">"ບà»â€‹àº¥àº´â€‹àºàº²àº™â€‹à»„ດ້​ຖືàºâ€‹àº›àº´àº”à»àº¥à»‰àº§."</string>
+ <string name="serviceRegistered" msgid="6275019082598102493">"àºàº²àº™àº¥àº»àº‡àº—ະບຽນສຳເລັດà»àº¥à»‰àº§."</string>
+ <string name="serviceErased" msgid="1288584695297200972">"àºàº²àº™àº¥àº¶àºšàºªàº»àº¡àºšàº¹àº™à»àº¥à»‰àº§."</string>
+ <string name="passwordIncorrect" msgid="7612208839450128715">"ລະຫັດຜ່ານບà»à»ˆàº–ືàºàº•້ອງ"</string>
+ <string name="mmiComplete" msgid="8232527495411698359">"MMI ສຳເລັດ."</string>
+ <string name="badPin" msgid="9015277645546710014">"ລະຫັດ PIN ເàºàº»à»ˆàº²àº—ີ່ທ່ານພິມນັ້ນບà»à»ˆàº–ືàºàº•້ອງ."</string>
+ <string name="badPuk" msgid="5487257647081132201">"ລະຫັດ PUK ທີ່ທ່ານພິມນັ້ນບà»à»ˆàº–ືàºàº•້ອງ."</string>
+ <string name="mismatchPin" msgid="609379054496863419">"ລະຫັດ PIN ທີ່ທ່ານພິມໄປນັ້ນບà»à»ˆàºàº»àº‡àºàº±àº™."</string>
+ <string name="invalidPin" msgid="3850018445187475377">"ພິມລະຫັດ PIN ທີ່ມີ 4 ຫາ 8 ໂຕເລàº."</string>
+ <string name="invalidPuk" msgid="8761456210898036513">"ພິມລະຫັດ PUK ທີ່ມີ 8 ໂຕເລຠຫຼືຫຼາàºàºàº§à»ˆàº²àº™àº±à»‰àº™."</string>
+ <string name="needPuk" msgid="919668385956251611">"ຊິມàºàº²àº”ຂອງທ່ານຖືàºàº¥àº±àº­àºàº”້ວàºàº¥àº°àº«àº±àº” PUK. ໃຫ້ພິມລະຫັດ PUK ເພື່ອປົດລັອàºàº¡àº±àº™."</string>
+ <string name="needPuk2" msgid="4526033371987193070">"ພິມ PUK2 ເພື່ອປົດລັອຠSIM card."</string>
+ <string name="imei" msgid="2625429890869005782">"IMEI"</string>
+ <string name="meid" msgid="4841221237681254195">"MEID"</string>
+ <string name="ClipMmi" msgid="6952821216480289285">"à»àº²àºà»€àº¥àºàºœàº¹à»ˆà»‚ທເຂົ້າ"</string>
+ <string name="ClirMmi" msgid="7784673673446833091">"à»àº²àºà»€àº¥àºàºœàº¹à»ˆà»‚ທອອàº"</string>
+ <string name="CfMmi" msgid="5123218989141573515">"àºàº²àº™à»‚ອນສາàº"</string>
+ <string name="CwMmi" msgid="9129678056795016867">"ສາàºàºŠà»‰àº­àº™"</string>
+ <string name="BaMmi" msgid="455193067926770581">"àºàº²àº™àº¥àº°àº‡àº±àºšàºàº²àº™à»‚ທ"</string>
+ <string name="PwdMmi" msgid="7043715687905254199">"àºàº²àº™àº›à»ˆàº½àº™àº¥àº°àº«àº±àº”ຜ່ານ"</string>
+ <string name="PinMmi" msgid="3113117780361190304">"àºàº²àº™àº›à»ˆàº½àº™à»àº›àº‡ PIN"</string>
+ <string name="CnipMmi" msgid="3110534680557857162">"ສະà»àº”ງà»àº²àºà»€àº¥àºàº—ີ່ໂທ"</string>
+ <string name="CnirMmi" msgid="3062102121430548731">"ເບີໂທທີ່ຖືàºàºˆàº³àºàº±àº”"</string>
+ <string name="ThreeWCMmi" msgid="9051047170321190368">"àºàº²àº™à»‚ທສາມສາàº"</string>
+ <string name="RuacMmi" msgid="7827887459138308886">"ປະຕິເສດສາàºàº—ີ່ບà»à»ˆàº•້ອງàºàº²àº™àº®àº±àºš"</string>
+ <string name="CndMmi" msgid="3116446237081575808">"àºàº²àº™àºªàº»à»ˆàº‡à»àº²àºà»€àº¥àºàº—ີ່ໂທ"</string>
+ <string name="DndMmi" msgid="1265478932418334331">"ຫ້າມລົບàºàº§àº™"</string>
+ <string name="CLIRDefaultOnNextCallOn" msgid="429415409145781923">"à»àº²àºà»€àº¥àºàºœàº¹à»ˆà»‚ທຖືàºàº•ັ້ງຄ່າເລີ່ມຕົ້ນໃຫ້ຖືàºàºˆàº³àºàº±àº”. àºàº²àº™à»‚ທຄັ້ງຕà»à»ˆà»„ປ: ຖືàºàºˆàº³àºàº±àº”"</string>
+ <string name="CLIRDefaultOnNextCallOff" msgid="3092918006077864624">"à»àº²àºà»€àº¥àºàºœàº¹à»ˆà»‚ທ ໄດ້ຮັບàºàº²àº™àº•ັ້ງຄ່າເລີ່ມຕົ້ນເປັນ ຖືàºàºˆàº³àºàº±àº”. àºàº²àº™à»‚ທຄັ້ງຕà»à»ˆà»„ປ: ບà»à»ˆàº–ືàºàºˆàº³àºàº±àº”."</string>
+ <string name="CLIRDefaultOffNextCallOn" msgid="6179425182856418465">"Caller ID ໂດàºà»€àº¥àºµà»ˆàº¡àº•ົ້ນຖືàºàº›àº±àºšà»ƒàº«à»‰àºšà»à»ˆàº¡àºµàºàº²àº™àº›àº´àº”àºàº±à»‰àº™. àºàº²àº™à»‚ທຕà»à»ˆà»„ປ:ປິດàºàº±à»‰àº™"</string>
+ <string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"à»àº²àºà»€àº¥àºàºœàº¹à»ˆà»‚ທ ໄດ້ຮັບàºàº²àº™àº•ັ້ງຄ່າເລີ່ມຕົ້ນເປັນ ບà»à»ˆàº–ືàºàºˆàº³àºàº±àº”. àºàº²àº™à»‚ທຄັ້ງຕà»à»ˆà»„ປ: ບà»à»ˆàº–ືàºàºˆàº³àºàº±àº”."</string>
+ <string name="serviceNotProvisioned" msgid="8614830180508686666">"ບà»à»ˆà»„ດ້ເປີດໃຊ້ບà»àº¥àº´àºàº²àº™."</string>
+ <string name="CLIRPermanent" msgid="3377371145926835671">"ທ່ານບà»à»ˆàºªàº²àº¡àº²àº”ປ່ຽນà»àº›àº‡àºàº²àº™àº•ັ້ງຄ່າ Caller ID"</string>
+ <string name="RestrictedChangedTitle" msgid="5592189398956187498">"ປ່ຽນàºàº²àº™à»€àº‚ົ້າເຖິງທີ່ຖືàºàºˆàº³àºàº±àº”à»àº¥à»‰àº§"</string>
+ <string name="RestrictedOnData" msgid="8653794784690065540">"ບà»àº¥àº´àºàº²àº™àº‚à»à»‰àº¡àº¹àº™àº–ືàºàºšàº¥àº±àº­àº."</string>
+ <string name="RestrictedOnEmergency" msgid="6581163779072833665">"ບà»àº¥àº´àºàº²àº™àºªàº¸àºà»€àºªàºµàº™àº–ືàºàºšàº¥àº±àº­àº."</string>
+ <string name="RestrictedOnNormal" msgid="4953867011389750673">"ບà»àº¥àº´àºàº²àº™àºàº²àº™à»‚ທຖືàºàº›àº´àº”àºàº±à»‰àº™à»„ວ້."</string>
+ <string name="RestrictedOnAllVoice" msgid="3396963652108151260">"ບà»àº¥àº´àºàº²àº™àºªàº½àº‡àº—ັງà»àº»àº”ຖືàºàºšàº¥àº±àº­àº."</string>
+ <string name="RestrictedOnSms" msgid="8314352327461638897">"ບà»àº¥àº´àºàº²àº™ SMS ຖືàºàºšàº¥àº±àº­àº."</string>
+ <string name="RestrictedOnVoiceData" msgid="996636487106171320">"ບà»àº¥àº´àºàº²àº™ ຂà»à»‰àº¡àº¹àº™/ສຽງ ຖືàºàºšàº¥àº±àº­àº."</string>
+ <string name="RestrictedOnVoiceSms" msgid="1888588152792023873">"ບà»àº¥àº´àºàº²àº™ ສຽງ/SMS ຖືàºàºšàº¥àº±àº­àº."</string>
+ <string name="RestrictedOnAll" msgid="5643028264466092821">"ບà»àº¥àº´àºàº²àº™ àºàº²àº™à»‚ທ/ອິນເຕີເນັດ/SMS ຖືàºàº›àº´àº”àºàº±à»‰àº™à»„ວ້."</string>
+ <string name="serviceClassVoice" msgid="1258393812335258019">"ສຽງ"</string>
+ <string name="serviceClassData" msgid="872456782077937893">"ຂà»à»‰àº¡àº¹àº™"</string>
+ <string name="serviceClassFAX" msgid="5566624998840486475">"à»àºŸàº±àº"</string>
+ <string name="serviceClassSMS" msgid="2015460373701527489">"SMS"</string>
+ <string name="serviceClassDataAsync" msgid="4523454783498551468">"ບà»à»ˆàºàº»àº‡àºàº±àº™"</string>
+ <string name="serviceClassDataSync" msgid="7530000519646054776">"ຊິ້ງຂà»à»‰àº¡àº¹àº™"</string>
+ <string name="serviceClassPacket" msgid="6991006557993423453">"à»àºžàº±àºà»€àºàº±àº”"</string>
+ <string name="serviceClassPAD" msgid="3235259085648271037">"PAD"</string>
+ <string name="roamingText0" msgid="7170335472198694945">"ໂຕບອàºàºàº²àº™à»€àºŠàº·à»ˆàº­àº¡àº•à»à»ˆàºàº±àºšà»€àº„ືອຂ່າàºàºžàº²àºàº™àº­àºà»€àº›àºµàº”ຢູ່"</string>
+ <string name="roamingText1" msgid="5314861519752538922">"ໂຕບອàºàºàº²àº™à»€àºŠàº·à»ˆàº­àº¡àº•à»à»ˆàºàº±àºšà»€àº„ືອຂ່າàºàºžàº²àºàº™àº­àºàº›àº´àº”ຢູ່"</string>
+ <string name="roamingText2" msgid="8969929049081268115">"ໂຕບອàºàºàº²àº™à»€àºŠàº·à»ˆàº­àº¡àº•à»à»ˆàºàº±àºšà»€àº„ືອຂ່າàºàºžàº²àºàº™àº­àºàºàº°àºžàº´àºš"</string>
+ <string name="roamingText3" msgid="5148255027043943317">"ຢູ່ນອàºà»€àº‚ດໃàºà»‰àº„ຽງ"</string>
+ <string name="roamingText4" msgid="8808456682550796530">"ດ້ານນອàºàº‚ອງອາຄານ"</string>
+ <string name="roamingText5" msgid="7604063252850354350">"ໂຣມມິງ - ລະບົບທີ່ຕ້ອງàºàº²àº™"</string>
+ <string name="roamingText6" msgid="2059440825782871513">"ໂຣມມິງ - ລະບົບທີ່ໃຊ້ໄດ້"</string>
+ <string name="roamingText7" msgid="7112078724097233605">"ໂຣມມິງ - ຮຸ້ນສ່ວນພັນທະມິດ"</string>
+ <string name="roamingText8" msgid="5989569778604089291">"ໂຣມມິງ - ຮຸ້ນສ່ວນພຣີມຽມ"</string>
+ <string name="roamingText9" msgid="7969296811355152491">"ໂຣມມິງ - ຟັງຊັນບà»àº¥àº´àºàº²àº™à»€àº•ັມຮູບà»àºšàºš"</string>
+ <string name="roamingText10" msgid="3992906999815316417">"ໂຣມມິງ - ຟັງຊັນບà»àº¥àº´àºàº²àº™àºšàº²àº‡àºªà»ˆàº§àº™"</string>
+ <string name="roamingText11" msgid="4154476854426920970">"ເປີດໂຣມມິງà»àºšàº™à»€àº™àºµ"</string>
+ <string name="roamingText12" msgid="1189071119992726320">"ປິດໂຣມມິງà»àºšàº™à»€àº™àºµ"</string>
+ <string name="roamingTextSearching" msgid="8360141885972279963">"ຊອàºàº«àº²àºšà»àº¥àº´àºàº²àº™"</string>
+ <string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: ບà»à»ˆàº–ືàºàºªàº»à»ˆàº‡àº•à»à»ˆ"</string>
+ <string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
+ <string name="cfTemplateForwardedTime" msgid="9206251736527085256">"<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" msgid="5073237827620166285">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: ບà»à»ˆàº–ືàºàºªàº»à»ˆàº‡àº•à»à»ˆ"</string>
+ <string name="cfTemplateRegisteredTime" msgid="6781621964320635172">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: ບà»à»ˆàº–ືàºàºªàº»à»ˆàº‡àº•à»à»ˆ"</string>
+ <string name="fcComplete" msgid="3118848230966886575">"ລະຫັດຄຸນສົມບັດສຳເລັດà»àº¥à»‰àº§."</string>
+ <string name="fcError" msgid="3327560126588500777">"ເàºàºµàº”ບັນຫາàºàº²àº™à»€àºŠàº·à»ˆàº­àº¡àº•à»à»ˆ ຫຼືລະຫັດàºàº²àº™à»€àº®àº±àº”ວຽàºàºšà»à»ˆàº–ືàºàº•້ອງ."</string>
+ <string name="httpErrorOk" msgid="1191919378083472204">"ຕົàºàº¥àº»àº‡"</string>
+ <string name="httpError" msgid="7956392511146698522">"ມີຂà»à»‰àºœàº´àº”ພາດທາງເຄືອຂ່າàº."</string>
+ <string name="httpErrorLookup" msgid="4711687456111963163">"ບà»à»ˆàºžàº»àºš URL."</string>
+ <string name="httpErrorUnsupportedAuthScheme" msgid="6299980280442076799">"ບà»à»ˆàº®àº­àº‡àº®àº±àºšàº®àº¹àºšà»àºšàºšàºàº²àº™àºžàº´àºªàº¹àº”ຢືນຢັນຂອງເວັບໄຊ."</string>
+ <string name="httpErrorAuth" msgid="1435065629438044534">"ບà»à»ˆàºªàº²àº¡àº²àº”ພິສູດຢືນຢັນໄດ້."</string>
+ <string name="httpErrorProxyAuth" msgid="1788207010559081331">"àºàº²àº™àºžàº´àºªàº¹àº”ຢືນຢັນຜ່ານເຊີບເວີ Proxy ບà»à»ˆàºªàº³à»€àº¥àº±àº”."</string>
+ <string name="httpErrorConnect" msgid="8714273236364640549">"ບà»à»ˆàºªàº²àº¡àº²àº”ເຊື່ອມຕà»à»ˆàºàº±àºšà»€àºŠàºµàºšà»€àº§àºµà»„ດ້."</string>
+ <string name="httpErrorIO" msgid="2340558197489302188">"ບà»à»ˆàºªàº²àº¡àº²àº”ສື່ສານàºàº±àºšà»€àºŠàºµàºšà»€àº§àºµà»„ດ້. àºàº°àº¥àº¸àº™àº²àº¥àº­àº‡à»ƒà»à»ˆà»ƒàº™àºžàº²àºàº«àº¼àº±àº‡."</string>
+ <string name="httpErrorTimeout" msgid="4743403703762883954">"à»àº»àº”ເວລາàºàº²àº™à»€àºŠàº·à»ˆàº­àº¡àº•à»à»ˆàº«àº²à»€àºŠàºµàºšà»€àº§àºµ."</string>
+ <string name="httpErrorRedirectLoop" msgid="8679596090392779516">"ໜ້ານີ້ມີàºàº²àº™àº›à»ˆàº½àº™à»€àºªàº±à»‰àº™àº—າງເຊີບເວີຫຼາàºà»€àºàºµàº™à»„ປ."</string>
+ <string name="httpErrorUnsupportedScheme" msgid="5015730812906192208">"ບà»à»ˆàº®àº­àº‡àº®àº±àºšà»‚ປຣໂຕຄອນດັ່ງàºà»ˆàº²àº§."</string>
+ <string name="httpErrorFailedSslHandshake" msgid="96549606000658641">"ບà»à»ˆàºªàº²àº¡àº²àº”ເປີດໃຊ້àºàº²àº™à»€àºŠàº·à»ˆàº­àº¡àº•à»à»ˆàº—ີ່ປອດໄພໄດ້."</string>
+ <string name="httpErrorBadUrl" msgid="3636929722728881972">"ບà»à»ˆàºªàº²àº¡àº²àº”ເປີດໜ້າເວັບໄດ້ເນື່ອງຈາຠURL ບà»à»ˆàº–ືàºàº•້ອງ."</string>
+ <string name="httpErrorFile" msgid="2170788515052558676">"ບà»à»ˆàºªàº²àº¡àº²àº”ເຂົ້າເຖິງໄຟລ໌ໄດ້."</string>
+ <string name="httpErrorFileNotFound" msgid="6203856612042655084">"ບà»à»ˆàºžàº»àºšà»„ຟລ໌ທີ່ຮ້ອງຂà»."</string>
+ <string name="httpErrorTooManyRequests" msgid="1235396927087188253">"ມີàºàº²àº™àº®à»‰àº­àº‡àº‚à»àº«àº¼àº²àºà»€àºàºµàº™à»„ປ, àºàº°àº¥àº¸àº™àº²àº¥àº­àº‡à»ƒà»à»ˆàºžàº²àºàº«àº¼àº±àº‡."</string>
+ <string name="notification_title" msgid="8967710025036163822">"àºàº²àº™à»€àº‚ົ້າສູ່ລະບົບຂອງ <xliff:g id="ACCOUNT">%1$s</xliff:g> ຜິດພາດ"</string>
+ <string name="contentServiceSync" msgid="8353523060269335667">"àºàº²àº™àºŠàº´à»‰àº‡àº‚à»à»‰àº¡àº¹àº™"</string>
+ <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"ຊິ້ງຂà»à»‰àº¡àº¹àº™"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"ມີàºàº²àº™àº¥àº¶àºš <xliff:g id="CONTENT_TYPE">%s</xliff:g> ຫຼາàºà»€àºàºµàº™à»„ປ."</string>
+ <string name="low_memory" product="tablet" msgid="6494019234102154896">"ພື້ນທີ່ຈັດເàºàº±àºšàº‚à»à»‰àº¡àº¹àº™à»ƒàº™à»àº—ັບເລັດເຕັມ. ລຶບບາງໄຟລ໌ອອàºà»€àºžàº·à»ˆàº­à»€àºžàºµà»ˆàº¡àºžàº·à»‰àº™àº—ີ່ຫວ່າງ."</string>
+ <string name="low_memory" product="default" msgid="3475999286680000541">"ພື້ນທີ່ໃນໂທລະສັບເຕັມà»àº¥à»‰àº§. àºàº°àº¥àº¸àº™àº²àº¥àº¶àºšàºšàº²àº‡à»„ຟລ໌ອອàºà»€àºžàº·à»ˆàº­à»€àºžàºµà»ˆàº¡àºžàº·à»‰àº™àº—ີ່ຫວ່າງ."</string>
+ <string name="me" msgid="6545696007631404292">"ຂ້າພະເຈົ້າ"</string>
+ <string name="power_dialog" product="tablet" msgid="8545351420865202853">"ໂຕເລືອàºà»àº—ັບເລັດ"</string>
+ <string name="power_dialog" product="default" msgid="1319919075463988638">"ໂຕເລືອàºà»‚ທລະສັບ"</string>
+ <string name="silent_mode" msgid="7167703389802618663">"ໂà»àº”ປິດສຽງ"</string>
+ <string name="turn_on_radio" msgid="3912793092339962371">"ເປີດລະບົບໄຮ້ສາàº"</string>
+ <string name="turn_off_radio" msgid="8198784949987062346">"ປິດ wireless"</string>
+ <string name="screen_lock" msgid="799094655496098153">"ລັອàºà»œà»‰àº²àºˆà»"</string>
+ <string name="power_off" msgid="4266614107412865048">"ປິດເຄື່ອງ"</string>
+ <string name="silent_mode_silent" msgid="319298163018473078">"ປິດສຽງຣິງໂທນ"</string>
+ <string name="silent_mode_vibrate" msgid="7072043388581551395">"ສັ່ນພ້ອມສຽງຣິງໂທນ"</string>
+ <string name="silent_mode_ring" msgid="8592241816194074353">"ເປີດສຽງໂທເຂົ້າà»àº¥à»‰àº§"</string>
+ <string name="shutdown_progress" msgid="2281079257329981203">"àºàº³àº¥àº±àº‡àº›àº´àº”ລົງ..."</string>
+ <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"à»àº—ັບເລັດຂອງທ່ານຈະຖືàºàº›àº´àº”."</string>
+ <string name="shutdown_confirm" product="default" msgid="649792175242821353">"ໂທລະສັບຂອງທ່ານຈະຖືàºàº›àº´àº”."</string>
+ <string name="shutdown_confirm_question" msgid="2906544768881136183">"ທ່ານຕ້ອງàºàº²àº™àº—ີ່ຈະປິດບà»à»ˆ?"</string>
+ <string name="reboot_safemode_title" msgid="7054509914500140361">"ຣີບູດເຂົ້າ safe mode"</string>
+ <string name="reboot_safemode_confirm" msgid="55293944502784668">"ທ່ານຕ້ອງàºàº²àº™àº£àºµàºšàº¹àº”ເຂົ້າ safe mode ຫຼືບà»à»ˆ? ນີ້ຈະເປັນàºàº²àº™àº›àº´àº”àºàº²àº™à»€àº®àº±àº”ວຽàºàº‚ອງà»àº­àº±àºšàºžàº¥àº´à»€àº„ຊັນ ຈາàºàºžàº²àºàºªà»ˆàº§àº™àº—ີສາມທັງà»àº»àº”ທີ່ທ່ານໄດ້ຕິດຕັ້ງໄວ້. à»àº­àº±àºšàºžàº¥àº´à»€àº„ຊັນເຫຼົ່ານັ້ນ ຈະàºàº±àºšàº¡àº²à»€àº®àº±àº”ວຽàºà»„ດ້ອີàºàº«àº¼àº±àº‡àºˆàº²àºàº—່ານຣີບູດອີàºàº„ັ້ງ."</string>
+ <string name="recent_tasks_title" msgid="3691764623638127888">"ຫາàºà»à»ƒàºŠà»‰"</string>
+ <string name="no_recent_tasks" msgid="8794906658732193473">"ບà»à»ˆàº¡àºµà»àº­àº±àºšàº¯àº«àº¼à»‰àº²àºªàº¸àº”"</string>
+ <string name="global_actions" product="tablet" msgid="408477140088053665">"ໂຕເລືອàºà»àº—ັບເລັດ"</string>
+ <string name="global_actions" product="default" msgid="2406416831541615258">"ໂຕເລືອàºà»‚ທລະສັບ"</string>
+ <string name="global_action_lock" msgid="2844945191792119712">"ລັອàºà»œà»‰àº²àºˆà»"</string>
+ <string name="global_action_power_off" msgid="4471879440839879722">"ປິດ"</string>
+ <string name="global_action_bug_report" msgid="7934010578922304799">"ລາàºàº‡àº²àº™àº‚à»à»‰àºœàº´àº”ພາດ"</string>
+ <string name="bugreport_title" msgid="2667494803742548533">"ໃຊ້ລາàºàº‡àº²àº™àº‚à»à»‰àºšàº»àºàºžà»ˆàº­àº‡"</string>
+ <string name="bugreport_message" msgid="398447048750350456">"ນີ້ຈະເປັນàºàº²àº™à»€àºàº±àºšàºàº³àº‚à»à»‰àº¡àº¹àº™àºà»ˆàº½àº§àºàº±àºš ສະຖານະປັດຈຸບັນຂອງອຸປະàºàº­àº™àº—່ານ ເພື່ອສົ່ງເປັນຂà»à»‰àº„ວາມທາງອີເມວ. ມັນຈະໃຊ້ເວລາໜ້ອàºàº™àº¶à»ˆàº‡ ໃນàºàº²àº™à»€àº¥àºµà»ˆàº¡àº•ົ້ນàºàº²àº™àº¥àº²àºàº‡àº²àº™àº‚à»à»‰àºœàº´àº”ພາດ ຈົນàºàº§à»ˆàº²àºˆàº°àºžà»‰àº­àº¡àº—ີ່ຈະສົ່ງໄດ້, àºàº°àº¥àº¸àº™àº²àº¥à»àº–້າ."</string>
+ <string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"ໂà»àº”ປິດສຽງ"</string>
+ <string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"ປິດສຽງà»àº¥à»‰àº§"</string>
+ <string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"ເປິດສຽງà»àº¥à»‰àº§"</string>
+ <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"ໂà»àº”ໃນàºàº»àº™"</string>
+ <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"ເປີດໂà»àº”ຢູ່ໃນàºàº»àº™à»àº¥à»‰àº§"</string>
+ <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"ປິດໂà»àº”ໃນàºàº»àº™à»àº¥à»‰àº§"</string>
+ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
+ <string name="safeMode" msgid="2788228061547930246">"Safe mode"</string>
+ <string name="android_system_label" msgid="6577375335728551336">"ລະບົບ Android"</string>
+ <string name="permgrouplab_costMoney" msgid="5429808217861460401">"ບà»àº¥àº´àºàº²àº™àº—ີ່ເຮັດໃຫ້ທ່ານເສàºà»€àº‡àº´àº™"</string>
+ <string name="permgroupdesc_costMoney" msgid="3293301903409869495">"ເຮັດສິ່ງທີ່ທ່ານຕ້ອງເສàºàº„່າໃຊ້ຈ່າàº."</string>
+ <string name="permgrouplab_messages" msgid="7521249148445456662">"ຂà»à»‰àº„ວາມຂອງທ່ານ"</string>
+ <string name="permgroupdesc_messages" msgid="7821999071003699236">"ອ່ານ à»àº¥àº°àº‚ຽນ SMS, ອີເມວ à»àº¥àº°àº‚à»à»‰àº„ວາມອື່ນໆຂອງທ່ານ."</string>
+ <string name="permgrouplab_personalInfo" msgid="3519163141070533474">"ຂà»à»‰àº¡àº¹àº™àºªà»ˆàº§àº™à»‚ຕຂອງທ່ານ"</string>
+ <string name="permgroupdesc_personalInfo" msgid="8426453129788861338">"ເຂົ້າເຖິງຂà»à»‰àº¡àº¹àº™àºà»ˆàº½àº§àºàº±àºšàº—່ານໂດàºàºàº»àº‡, ບັນທຶàºà»„ວ້ໃນບັດລາàºàºŠàº·à»ˆàºœàº¹à»ˆàº•ິດຕà»à»ˆàº‚ອງທ່ານ."</string>
+ <string name="permgrouplab_socialInfo" msgid="5799096623412043791">"ຂà»à»‰àº¡àº¹àº™àºªàº±àº‡àº„ົມຂອງທ່ານ"</string>
+ <string name="permgroupdesc_socialInfo" msgid="7129842457611643493">"ເຂົ້າເຖິງຂà»à»‰àº¡àº¹àº™àºà»ˆàº½àº§àºàº±àºšàº¥àº²àºàºŠàº·à»ˆàºœàº¹à»ˆàº•ິດຕà»à»ˆ à»àº¥àº°àºàº²àº™à»€àºŠàº·à»ˆàº­àº¡àº•à»à»ˆàº—າງສັງຄົມຂອງທ່ານໂດàºàºàº»àº‡."</string>
+ <string name="permgrouplab_location" msgid="635149742436692049">"ສະຖານທີ່ຂອງທ່ານ"</string>
+ <string name="permgroupdesc_location" msgid="5704679763124170100">"ຕິດຕາມສະຖານທີ່ທາງàºàº²àºàº°àºžàº²àºšàº‚ອງທ່ານ."</string>
+ <string name="permgrouplab_network" msgid="5808983377727109831">"àºàº²àº™àºªàº·à»ˆàºªàº²àº™à»€àº„ືອຂ່າàº"</string>
+ <string name="permgroupdesc_network" msgid="4478299413241861987">"ເຂົ້າເຖິງຄຸນສົມບັດຕ່າງໆຂອງເຄືອຂ່າàº."</string>
+ <string name="permgrouplab_bluetoothNetwork" msgid="1585403544162128109">"Bluetooth"</string>
+ <string name="permgroupdesc_bluetoothNetwork" msgid="5625288577164282391">"ເຂົ້າເຖິງອຸປະàºàº­àº™ à»àº¥àº°à»€àº„ືອຂ່າàºàºœà»ˆàº²àº™ Bluetooth."</string>
+ <string name="permgrouplab_audioSettings" msgid="8329261670151871235">"àºàº²àº™àº•ັ້ງຄ່າສຽງ"</string>
+ <string name="permgroupdesc_audioSettings" msgid="2641515403347568130">"ປ່ຽນàºàº²àº™àº•ັ້ງຄ່າສຽງ."</string>
+ <string name="permgrouplab_affectsBattery" msgid="6209246653424798033">"ສົ່ງຜົນຕà»à»ˆà»àºšàº±àº”ເຕີຣີ"</string>
+ <string name="permgroupdesc_affectsBattery" msgid="6441275320638916947">"ໃຊ້ຄວາມສາມາດທີ່ເຮັດໃຫ້ພະລັງງານà»àºšàº±àº”ເຕີຣີຫຼຸດລົງຢ່າງໄວວາ."</string>
+ <string name="permgrouplab_calendar" msgid="5863508437783683902">"ປະຕິທິນ"</string>
+ <string name="permgroupdesc_calendar" msgid="5777534316982184416">"ເຂົ້າເຖິງປະຕິທິນ à»àº¥àº°àº™àº±àº”à»àº²àºà»‚ດàºàºàº»àº‡."</string>
+ <string name="permgrouplab_dictionary" msgid="4148597128843641379">"ອ່ານວັດຈະນານຸàºàº»àº¡àºœàº¹à»ˆà»ƒàºŠà»‰"</string>
+ <string name="permgroupdesc_dictionary" msgid="7921166355964764490">"ອ່ານຄຳສັບໃນວັດຈະນານຸàºàº»àº¡àºœàº¹à»ˆà»ƒàºŠà»‰."</string>
+ <string name="permgrouplab_writeDictionary" msgid="8090237702432576788">"ຂຽນວັດຈະນານຸàºàº»àº¡àºœàº¹à»ˆà»ƒàºŠà»‰"</string>
+ <string name="permgroupdesc_writeDictionary" msgid="2711561994497361646">"ເພີ່ມຄຳສັບໃສ່ວັດຈະນານຸàºàº»àº¡àºœàº¹à»ˆà»ƒàºŠà»‰."</string>
+ <string name="permgrouplab_bookmarks" msgid="1949519673103968229">"ບຸàºàº¡àº²àº à»àº¥àº°àº›àº°àº«àº§àº±àº”ເວັບໄຊ"</string>
+ <string name="permgroupdesc_bookmarks" msgid="4169771606257963028">"ເຂົ້ານຳໃຊ້ບຸàºà»àº¥àº°àº›àº°àº«àº§àº±àº”àºàº²àº™àº—່ອງເວັບໂດàºàºàº»àº‡."</string>
+ <string name="permgrouplab_deviceAlarms" msgid="6117704629728824101">"ໂມງປຸàº"</string>
+ <string name="permgroupdesc_deviceAlarms" msgid="4769356362251641175">"ຕັ້ງໂມງປຸàº."</string>
+ <string name="permgrouplab_voicemail" msgid="4162237145027592133">"ຂà»à»‰àº„ວາມສຽງ"</string>
+ <string name="permgroupdesc_voicemail" msgid="2498403969862951393">"ເຂົ້າໃຊ້ຂà»à»‰àº„ວາມສຽງໂດàºàºàº»àº‡"</string>
+ <string name="permgrouplab_microphone" msgid="171539900250043464">"ໄມໂຄຣໂຟນ"</string>
+ <string name="permgroupdesc_microphone" msgid="7106618286905738408">"ເຂົ້າເຖິງໄມໂຄຣໂຟນໂດàºàºàº»àº‡à»€àºžàº·à»ˆàº­àºšàº±àº™àº—ຶàºàºªàº½àº‡."</string>
+ <string name="permgrouplab_camera" msgid="4820372495894586615">"àºà»‰àº­àº‡"</string>
+ <string name="permgroupdesc_camera" msgid="2933667372289567714">"ເຂົ້າໃຊ້àºà»‰àº­àº‡àº–່າàºàº®àº¹àºšàºªàº³àº¥àº±àºšàºàº²àº™àº–່າàºàº®àº¹àºš à»àº¥àº°àº§àº´àº”ີໂອໂດàºàºàº»àº‡."</string>
+ <string name="permgrouplab_screenlock" msgid="8275500173330718168">"ລັອàºà»œà»‰àº²àºˆà»"</string>
+ <string name="permgroupdesc_screenlock" msgid="7067497128925499401">"ຄວາມສາມາດໃນàºàº²àº™àºªàº»à»ˆàº‡àºœàº»àº™àº•à»à»ˆàºžàº¶àº”ຕິàºàº³ ຂອງàºàº²àº™àº¥àº±àº­àºà»œà»‰àº²àºˆà»à»ƒàº™àº­àº¸àº›àº°àºàº­àº™àº‚ອງທ່ານ."</string>
+ <string name="permgrouplab_appInfo" msgid="8028789762634147725">"ເບິ່ງຂà»à»‰àº¡àº¹àº™à»àº­àº±àºšàºžàº¥àº´à»€àº„ຊັນຂອງທ່ານ"</string>
+ <string name="permgroupdesc_appInfo" msgid="3950378538049625907">"ສາມາດສົ່ງຜົນຕà»à»ˆàºàº²àº™à»€àº®àº±àº”ວຽຠຂອງà»àº­àº±àºšàºžàº¥àº´à»€àº„ຊັນອື່ນໃນອຸປະàºàº­àº™àº‚ອງທ່ານ."</string>
+ <string name="permgrouplab_wallpaper" msgid="3850280158041175998">"ພາບພື້ນຫຼັງ"</string>
+ <string name="permgroupdesc_wallpaper" msgid="5630417854750540154">"ປ່ຽນàºàº²àº™àº•ັ້ງຄ່າພາບພື້ນຫຼັງຂອງອຸປະàºàº­àº™."</string>
+ <string name="permgrouplab_systemClock" msgid="406535759236612992">"ໂມງ"</string>
+ <string name="permgroupdesc_systemClock" msgid="3944359833624094992">"ປ່ຽນເວລາ ຫຼືເຂດເວລາໃນອຸປະàºàº­àº™."</string>
+ <string name="permgrouplab_statusBar" msgid="2095862568113945398">"à»àº–ບສະຖານະ"</string>
+ <string name="permgroupdesc_statusBar" msgid="6242593432226807171">"ປ່ຽນàºàº²àº™àº•ັ້ງຄ່າà»àº–ບສະຖານະອຸປະàºàº­àº™."</string>
+ <string name="permgrouplab_syncSettings" msgid="3341990986147826541">"ຕັ້ງຄ່າàºàº²àº™àºŠàº´à»‰àº‡àº‚à»à»‰àº¡àº¹àº™"</string>
+ <string name="permgroupdesc_syncSettings" msgid="7603195265129031797">"ເຂົ້າໃຊ້àºàº²àº™àº•ັ້ງຄ່າàºàº²àº™àºŠàº´à»‰àº‡àº‚à»à»‰àº¡àº¹àº™"</string>
+ <string name="permgrouplab_accounts" msgid="3359646291125325519">"ບັນຊີຂອງທ່ານ"</string>
+ <string name="permgroupdesc_accounts" msgid="4948732641827091312">"ເຂົ້າເຖິງບັນຊີທີ່ໃຊ້ໄດ້."</string>
+ <string name="permgrouplab_hardwareControls" msgid="7998214968791599326">"àºàº²àº™àº„ວບຄຸມຮາດà»àº§"</string>
+ <string name="permgroupdesc_hardwareControls" msgid="4357057861225462702">"ເຂົ້າເຖິງຮາດà»àº§àº‚ອງຊຸດຫູຟັງໂດàºàºàº»àº‡."</string>
+ <string name="permgrouplab_phoneCalls" msgid="9067173988325865923">"àºàº²àº™à»‚ທ"</string>
+ <string name="permgroupdesc_phoneCalls" msgid="7489701620446183770">"ຕິດຕາມ, ເàºàº±àºšàºàº³ à»àº¥àº°àº›àº°àº¡àº§àº™àºœàº»àº™àºàº²àº™à»‚ທລະສັບ."</string>
+ <string name="permgrouplab_systemTools" msgid="4652191644082714048">"ເຄື່ອງມືລະບົບ"</string>
+ <string name="permgroupdesc_systemTools" msgid="8162102602190734305">"àºàº²àº™à»€àº‚ົ້າເຖິງ à»àº¥àº°àºàº²àº™àº„ວບຄຸມລະບົບໃນລະດັບຕ່ຳ."</string>
+ <string name="permgrouplab_developmentTools" msgid="3446164584710596513">"ເຄື່ອງມືàºàº²àº™àºžàº±àº”ທະນາ"</string>
+ <string name="permgroupdesc_developmentTools" msgid="7058828032358142018">"ມີພຽງນັàºàºžàº±àº”ທະນາà»àº­àº±àºšàº¯à»€àº—ົ່ານັ້ນທີ່ຈະຕ້ອງàºàº²àº™àº„ວາມສາມາດເຫຼົ່ານີ້."</string>
+ <string name="permgrouplab_display" msgid="4279909676036402636">"ສ່ວນຕິດຕà»à»ˆàºœàº¹à»ˆà»ƒàºŠà»‰àº‚ອງà»àº­àº±àºšàºžàº¥àº´à»€àº„ຊັນອື່ນ"</string>
+ <string name="permgroupdesc_display" msgid="6051002031933013714">"ສົ່ງຜົນຕà»à»ˆàºªà»ˆàº§àº™àº•ິດຕà»à»ˆàºœàº¹à»ˆà»ƒàºŠà»‰àº‚ອງà»àº­àº±àºšàºžàº¥àº´à»€àº„ຊັນອື່ນ."</string>
+ <string name="permgrouplab_storage" msgid="1971118770546336966">"ພື້ນທີ່ຈັດເàºàº±àºšàº‚à»à»‰àº¡àº¹àº™"</string>
+ <string name="permgroupdesc_storage" product="nosdcard" msgid="7442318502446874999">"àºàº²àº™à»€àº‚ົ້າເຖິງບ່ອນຈັດເàºàº±àºšàº‚à»à»‰àº¡àº¹àº™ USB."</string>
+ <string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"àºàº²àº™à»€àº‚ົ້າເຖິງ SD card."</string>
+ <string name="permgrouplab_accessibilityFeatures" msgid="7919025602283593907">"ຄວາມສາມາດàºàº²àº™àºŠà»ˆàº§àºà»€àº‚ົ້າເຖິງ"</string>
+ <string name="permgroupdesc_accessibilityFeatures" msgid="4205196881678144335">"ຄຸນສົມບັດທີ່ເທັàºà»‚ນໂລຢີຄວາມຊ່ວàºà»€àº«àº¼àº·àº­àºªàº²àº¡àº²àº”ຮ້ອງຂà»à»„ດ້."</string>
+ <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"ດຶງຂà»à»‰àº¡àº¹àº™à»€àº™àº·à»‰àº­àº«àº²à»ƒàº™à»œà»‰àº²àºˆà»"</string>
+ <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"àºàº§àº”àºàº²à»€àº™àº·à»‰àº­àº«àº²àº‚ອງໜ້າຈà»àº—ີ່ທ່ານàºàº³àº¥àº±àº‡àº¡àºµàº›àº°àº•ິສຳພັນນຳ."</string>
+ <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"ເປີດໃຊ້ \"àºàº²àº™àºªàº³àº«àº¼àº§àº”ໂດàºàºªàº³àºžàº±àº”\""</string>
+ <string name="capability_desc_canRequestTouchExploration" msgid="5800552516779249356">"ລາàºàºàº²àº™àº—ີ່ສຳພັດຈະຖືàºà»€àº§àº»à»‰àº²àº­àº­àºàº¡àº² à»àº¥àº°àºªàº²àº¡àº²àº”ສຳຫຼວດໜ້າຈà»à»„ດ້ດ້ວàºàº—່າທາງ."</string>
+ <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"ເປີດàºàº²àº™à»€àº‚ົ້າເຖິງເວັບທີ່ມີປະສິດທິພາບຫຼາàºàº‚ຶ້ນ"</string>
+ <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"ສະຄຣິບອາດຖືàºàº•ິດຕັ້ງ ເພື່ອເຮັດໃຫ້ເນື້ອຫາà»àº­àº±àºšàº¯à»€àº‚ົ້າເຖິງໄດ້ຫຼາàºàº‚ຶ້ນ."</string>
+ <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"ຕິດຕາມ​ເບິ່ງ​ຂà»à»‰â€‹àº„ວາມ​ທີ່​ທ່ານ​ພິມ"</string>
+ <string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"ຮວມທັງຂà»à»‰àº¡àº¹àº™àºªà»ˆàº§àº™à»‚ຕເຊັ່ນ: ເລàºàºšàº±àº”ເຄຣດິດ à»àº¥àº°àº¥àº°àº«àº±àº”ຜ່ານ."</string>
+ <string name="permlab_statusBar" msgid="7417192629601890791">"ປິດàºàº²àº™àº™àº™àº³à»ƒàºŠà»‰ ຫຼື à»àºà»‰à»„ຂà»àº–ບສະຖານະ"</string>
+ <string name="permdesc_statusBar" msgid="8434669549504290975">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àº›àº´àº”àºàº²àº™à»€àº®àº±àº”ວຽàºàº‚ອງà»àº–ບສະຖານະ ຫຼືເພີ່ມ à»àº¥àº°àº¥àº¶àºšà»„ອຄອນລະບົບອອàºà»„ດ້."</string>
+ <string name="permlab_statusBarService" msgid="7247281911387931485">"à»àº–ບສະຖານະ"</string>
+ <string name="permdesc_statusBarService" msgid="716113660795976060">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯à»€àº›àº±àº™à»àº–ບສະຖານະ."</string>
+ <string name="permlab_expandStatusBar" msgid="1148198785937489264">"ຫàºà»à»‰/ຂະຫàºàº²àº à»àº–ບສະຖານະ"</string>
+ <string name="permdesc_expandStatusBar" msgid="6917549437129401132">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯ ຂະຫàºàº²àº ຫຼືຫàºà»à»‰à»àº–ບສະຖານະ."</string>
+ <string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"ປ່ຽນເສັ້ນທາງàºàº²àº™à»‚ທອອàº"</string>
+ <string name="permdesc_processOutgoingCalls" msgid="5331318931937402040">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àº›àº°àº¡àº§àº™àºœàº»àº™àºªàº²àºàº—ີ່ໂທອອຠà»àº¥àº°àº›à»ˆàº½àº™à»àº²àºà»€àº¥àºàº—ີ່ຈະໂທອອàº. à»àº­àº±àºšàº¯àº—ີ່ເປັນອັນຕະລາàºàº­àº²àº”àºàº§àº”ສອບ, ໂອນສາຠຫຼືຂັດຂວາງບà»à»ˆà»ƒàº«à»‰à»‚ທອອàºà»„ດ້."</string>
+ <string name="permlab_receiveSms" msgid="8673471768947895082">"ຮັບຂà»à»‰àº„ວາມສັ້ນ (SMS)"</string>
+ <string name="permdesc_receiveSms" msgid="6424387754228766939">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àº®àº±àºš à»àº¥àº°àº›àº°àº¡àº§àº™àºœàº»àº™àº‚à»à»‰àº„ວາມ SMS. ນີ້à»àº²àºàº„ວາມວ່າà»àº­àº±àºšàº¯àºªàº²àº¡àº²àº”ຕິດຕາມ ຫຼືລຶບຂà»à»‰àº„ວາມທີ່ສົ່ງເຂົ້າອຸປະàºàº­àº™àº‚ອງທ່ານ ໂດàºàº—ີ່ບà»à»ˆàºªàº°à»àº”ງພວàºàº¡àº±àº™à»ƒàº«à»‰àº—່ານເຫັນ."</string>
+ <string name="permlab_receiveMms" msgid="1821317344668257098">"ຮັບຂà»à»‰àº„ວາມ (MMS)"</string>
+ <string name="permdesc_receiveMms" msgid="533019437263212260">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯ ຮັບà»àº¥àº°àº›àº°àº¡àº§àº™àºœàº»àº™àº‚à»à»‰àº„ວາມ MMS. ນີ້à»àº²àºàº„ວາມວ່າà»àº­àº±àºšàº¯àºªàº²àº¡àº²àº”ຕິດຕາມ ຫຼືລຶບຂà»à»‰àº„ວາມທີ່ສົ່ງເຂົ້າອຸປະàºàº­àº™àº‚ອງທ່ານ ໂດàºàº—ີ່ບà»à»ˆàºªàº°à»àº”ງພວàºàº¡àº±àº™à»ƒàº«à»‰àº—່ານເຫັນ."</string>
+ <string name="permlab_receiveEmergencyBroadcast" msgid="1803477660846288089">"ຮັບàºàº²àº™àºàº°àºˆàº²àºàºªàº±àº™àºàº²àº™àºªàº¸àºà»€àºªàºµàº™"</string>
+ <string name="permdesc_receiveEmergencyBroadcast" msgid="848524070262431974">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àº®àº±àºš à»àº¥àº°àº›àº°àº¡àº§àº™àºœàº»àº™àºàº²àº™àºàº°àºˆàº²àºàº‚à»à»‰àº„ວາມດ່ວນໄດ້. àºàº²àº™àº­àº°àº™àº¸àºàº²àº”ນີ້ຈະສາມາດນຳໃຊ້ໄດ້ໂດàºà»àº­àº±àºšàº¯àº‚ອງລະບົບເທົ່ານັ້ນ."</string>
+ <string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"ອ່ານຂà»à»‰àº„ວາມàºàº°àºˆàº²àºàºªàº±àº™àºàº²àº™àº‚ອງເສົາສັນàºàº²àº™"</string>
+ <string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯ ສາມາດອ່ານຂà»à»‰àº„ວາມà»àºˆà»‰àº‡à»€àº•ືອນເຫດສຸàºà»€àºªàºµàº™ ທີ່ໄດ້ຮັບໂດàºàº­àº¸àº›àº°àºàº­àº™àº‚ອງທ່ານ. àºàº²àº™à»àºˆà»‰àº‡à»€àº•ືອນສຸàºà»€àºªàºµàº™àº—ີ່ມີໃຫ້ບà»àº¥àº´àºàº²àº™à»ƒàº™àºšàº²àº‡àºžàº·à»‰àº™àº—ີ່ ເພື່ອà»àºˆà»‰àº‡à»€àº•ືອນໃຫ້ທ່ານຮູ້ເຖິງສະຖານະàºàº²àº™àºªàº¸àºà»€àºªàºµàº™. à»àº­àº±àºšàºžàº¥àº´à»€àº„ຊັນທີ່ເປັນອັນຕະລາàºàº­àº²àº”ລົບàºàº§àº™àº›àº°àºªàº´àº”ທິພາບ ຫຼືàºàº²àº™àº”ຳເນີນງານຂອງອຸປະàºàº­àº™àº‚ອງທ່ານ ເມື່ອໄດ້àºàº²àº™àº®àº±àºšà»àºˆà»‰àº‡à»€àº•ືອນສຸàºà»€àºªàºµàº™àºˆàº²àºàºªàº°àº–ານີມືຖື."</string>
+ <string name="permlab_sendSms" msgid="5600830612147671529">"ສົ່ງຂà»à»‰àº„ວາມ SMS"</string>
+ <string name="permdesc_sendSms" msgid="7094729298204937667">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àºªàº»à»ˆàº‡àº‚à»à»‰àº„ວາມ SMS ໄດ້. ນີ້ອາດເຮັດໃຫ້ທ່ານເàºàºµàº”àºàº²àº™àº„ິດຄ່າບà»àº¥àº´àºàº²àº™àº—ີ່ບà»à»ˆàº„າດຄິດໄດ້. à»àº­àº±àºšàº¯àº—ີ່ເປັນອັນຕະລາຠອາດເຮັດໃຫ້ທ່ານເສàºà»€àº‡àº´àº™àºà»‰àº­àº™àºàº²àº™àºªàº»à»ˆàº‡àº‚à»à»‰àº„ວາມໂດàºàº—ີ່ທ່ານບà»à»ˆàº®àº¹à»‰à»‚ຕໄດ້."</string>
+ <string name="permlab_sendRespondViaMessageRequest" msgid="8713889105305943200">"ສົ່ງàºàº´àº”ຈະàºàº³àºàº²àº™àº•ອບສະໜອງຜ່ານທາງຂà»à»‰àº„ວາມ"</string>
+ <string name="permdesc_sendRespondViaMessageRequest" msgid="7107648548468778734">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àºªàº»à»ˆàº‡àº„ຳຂ໠ໄປຫາà»àº­àº±àºšàº¯àº‚à»à»‰àº„ວາມອື່ນໆເພື່ອຈັດàºàº²àº™ àºà»àº¥àº°àº™àºµàºàº²àº™àº•ອບດ້ວàºàº‚à»à»‰àº„ວາມ ສຳລັບສາàºàº—ີ່ໂທເຂົ້າມາ."</string>
+ <string name="permlab_readSms" msgid="8745086572213270480">"ອ່ານຂà»à»‰àº„ວາມຂອງທ່ານ (SMS ຫຼື MMS)"</string>
+ <string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àº­à»ˆàº²àº™ SMS ທີ່ບັນທຶàºà»„ວ້ໃນà»àº—ັບເລັດ ຫຼື SIM card ຂອງທ່ານ. ຄຸນສົມບັດນີ້ຈະເຮັດໃຫ້à»àº­àº±àºšàº¯àºªàº²àº¡àº²àº”ອ່ານຂà»à»‰àº„ວາມ SMS ທັງà»àº»àº”ໄດ້ ບà»à»ˆà»€àº™àº·à»‰àº­àº«àº²àº‚ອງມັນຈະà»àº¡à»ˆàº™àº«àºàº±àº‡àºà»àº•າມ."</string>
+ <string name="permdesc_readSms" product="default" msgid="3695967533457240550">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯ ອ່ານຂà»à»‰àº„ວາມ SMS ທີ່ເàºàº±àºšà»„ວ້ໃນໂທລະສັບຂອງທ່ານ ຫຼືຊິມàºàº²àº”. ນີ້ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯ ອ່ານຂà»à»‰àº„ວາມ SMS ທັງà»àº»àº”, ໂດàºàºšà»à»ˆàº„ຳນຶງເຖິງເນື້ອຫາ ຫຼືຄວາມລັບ."</string>
+ <string name="permlab_writeSms" msgid="3216950472636214774">"à»àºà»‰à»„ຂຂà»à»‰àº„ວາມຂອງທ່ານ (SMS ຫຼື MMS)"</string>
+ <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àº‚ຽນຂà»à»‰àº„ວາມ SMS ທີ່ບັນທຶàºà»„ວ້ໃນà»àº—ັບເລັດຂອງທ່ານ ຫຼືຊິມàºàº²àº”ຂອງທ່ານ. à»àº­àº±àºšàº¯àº—ີ່ເປັນອັນຕະລາຠອາດລຶບຂà»à»‰àº„ວາມຂອງທ່ານໄດ້."</string>
+ <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯ ຂຽນລົງໃສ່ຂà»à»‰àº„ວາມ SMS ທີ່ເàºàº±àºšà»„ວ້ໃນໂທລະສັບ ຫຼືຊິມàºàº²àº”ຂອງທ່ານ. à»àº­àº±àºšàº¯àº—ີ່ເປັນອັນຕະລາຠອາດລຶບຂà»à»‰àº„ວາມຂອງທ່ານໄດ້."</string>
+ <string name="permlab_receiveWapPush" msgid="5991398711936590410">"ຮັບຂà»à»‰àº„ວາມສັ້ນ (WAP)"</string>
+ <string name="permdesc_receiveWapPush" msgid="748232190220583385">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àº®àº±àºš à»àº¥àº°àº›àº°àº¡àº§àº™àºœàº»àº™àº‚à»à»‰àº„ວາມ WAP. àºàº²àº™àº­àº°àº™àº¸àºàº²àº”ນີ້ຮວມເຖິງຄວາມສາມາດໃນàºàº²àº™àºàº§àº”ເບິ່ງ à»àº¥àº°àº¥àº¶àºšàº‚à»à»‰àº„ວາມທີ່ສົ່ງà»àº¥à»‰àº§ ໂດàºàºšà»à»ˆàº•້ອງສະà»àº”ງໃຫ້ທ່ານເຫັນ."</string>
+ <string name="permlab_getTasks" msgid="6466095396623933906">"ດຶງà»àº­àº±àºšàº¯àº—ີ່ເຮັດວຽàºàº¢àº¹à»ˆàº¡àº²"</string>
+ <string name="permdesc_getTasks" msgid="7454215995847658102">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àº”ຶງຂà»à»‰àº¡àº¹àº™àºà»ˆàº½àº§àºàº±àºšàºàº²àº™à»€àº®àº±àº”ວຽàºà»ƒàº™àº›àº±àº”ຈຸບັນ à»àº¥àº°àº«àº²àºà»àºœà»ˆàº²àº™àº¡àº². à»àº­àº±àºšàº¯àº—ີ່ເປັນອັນຕະລາàºàº­àº²àº”ຄົ້ນພົບຂà»à»‰àº¡àº¹àº™ àºà»ˆàº½àº§àºàº±àºšà»àº­àº±àºšàºžàº¥àº´à»€àº„ຊັນທີ່ໃຊ້ຢູ່ໃນອຸປະàºàº­àº™à»„ດ້."</string>
+ <string name="permlab_interactAcrossUsers" msgid="7114255281944211682">"àºàº²àº™àº•ອບໂຕ້ລະຫວ່າງຜູ່ໃຊ້"</string>
+ <string name="permdesc_interactAcrossUsers" msgid="364670963623385786">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àº”ຳເນີນàºàº²àº™ ສັ່ງງານຜ່ານຜູ່ໃຊ້ອື່ນໆໃນອຸປະàºàº­àº™. à»àº­àº±àºšàº¯àº—ີ່ເປັນອັນຕະລາàºàº­àº²àº”ໃຊ້ຄວາມສາມາດນີ້ ເພື່ອລະເມີດàºàº²àº™àº›à»‰àº­àº‡àºàº±àº™àº¥àº°àº«àº§à»ˆàº²àº‡àºœàº¹à»ˆà»ƒàºŠà»‰."</string>
+ <string name="permlab_interactAcrossUsersFull" msgid="2567734285545074105">"ໃບອະນຸàºàº²àº”ສະບັບເຕັມໃນàºàº²àº™à»‚ຕ້ຕອບລະຫວ່າງຜູ່ໃຊ້"</string>
+ <string name="permdesc_interactAcrossUsersFull" msgid="376841368395502366">"ອະນຸàºàº²àº”ທຸàºàºàº²àº™à»‚ຕ້ຕອບທີ່ເປັນໄປໄດ້ລະຫວ່າງຜູ່ໃຊ້."</string>
+ <string name="permlab_manageUsers" msgid="1676150911672282428">"ຈັດàºàº²àº™àºœàº¹à»ˆà»ƒàºŠà»‰"</string>
+ <string name="permdesc_manageUsers" msgid="8409306667645355638">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àºˆàº±àº”àºàº²àº™àºœàº¹à»ˆà»ƒàºŠà»‰à»ƒàº™àº­àº¸àº›àº°àºàº­àº™, ຮວມທັງàºàº²àº™à»€àº­àºµà»‰àº™, àºàº²àº™àºªà»‰àº²àº‡ à»àº¥àº°àºàº²àº™àº¥àº¶àºšàº‚à»à»‰àº¡àº¹àº™."</string>
+ <string name="permlab_getDetailedTasks" msgid="6229468674753529501">"ດຶງລາàºàº¥àº°àº­àº½àº”ຂອງà»àº­àº±àºšàº¯àº—ີ່àºàº³àº¥àº±àº‡à»€àº®àº±àº”ວຽàºàº¢àº¹à»ˆ"</string>
+ <string name="permdesc_getDetailedTasks" msgid="153824741440717599">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àº”ຶງຂà»à»‰àº¡àº¹àº™àº¢à»ˆàº²àº‡àº¥àº°àº­àº½àº” àºà»ˆàº½àº§àºàº±àºšàºàº²àº™à»€àº®àº±àº”ວຽàºà»ƒàº™àº›àº±àº”ຈຸບັນ à»àº¥àº°àº«àº²àºà»àºœà»ˆàº²àº™àº¡àº². à»àº­àº±àºšàº¯àº—ີ່ເປັນອັນຕະລາàºàº­àº²àº”ຄົ້ນພົບຂà»à»‰àº¡àº¹àº™àºªà»ˆàº§àº™à»‚ຕ àºà»ˆàº½àº§àºàº±àºšà»àº­àº±àºšàº¯àº­àº·à»ˆàº™à»„ດ້."</string>
+ <string name="permlab_reorderTasks" msgid="2018575526934422779">"ຮຽງລຳດັບà»àº­àº±àºšàº¯àº—ີ່àºàº³àº¥àº±àº‡à»€àº®àº±àº”ວຽàºàº„ືນໃà»à»ˆ"</string>
+ <string name="permdesc_reorderTasks" msgid="7734217754877439351">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àºà»‰àº²àºàºàº²àº™à»€àº®àº±àº”ວຽàºà»„ປໃສ່ດ້ານໜ້າ à»àº¥àº°àºžàº·à»‰àº™àº«àº¼àº±àº‡à»„ດ້. à»àº­àº±àºšàº¯àº­àº²àº”ຈະດຳເນີນàºàº²àº™à»‚ດàºàºšà»à»ˆàº•້ອງໃຫ້ທ່ານບອàº."</string>
+ <string name="permlab_removeTasks" msgid="6821513401870377403">"ຢຸດà»àº­àº±àºšàº¯àº—ີ່ເຮັດວຽàºàº¢àº¹à»ˆ"</string>
+ <string name="permdesc_removeTasks" msgid="1394714352062635493">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àº¥àº¶àºšàºàº²àº™à»€àº®àº±àº”ວຽຠà»àº¥àº°àº›àº´àº”à»àº­àº±àºšàº¯àº‚ອງວຽàºà»€àº«àº¼àº»à»ˆàº²àº™àº±à»‰àº™. à»àº­àº±àºšàº¯àº—ີ່ເປັນອັນຕະລາຠສາມາດລົບàºàº§àº™àºàº²àº™à»€àº®àº±àº”ວຽàºàº‚ອງà»àº­àº±àºšàº¯àº­àº·à»ˆàº™à»„ດ້."</string>
+ <string name="permlab_manageActivityStacks" msgid="7391191384027303065">"ຈັດàºàº²àº™àºªàº°à»àº•ັàºàºàº²àº™à»€àº„ື່ອນໄຫວ"</string>
+ <string name="permdesc_manageActivityStacks" msgid="1615881933034084440">"ອະ​ນຸ​àºàº²àº”​ໃຫ້à»àº­àº±àºšàº¯à»€àºžàº·à»ˆàº­à»€àºžàºµà»ˆàº¡, ລຶບ à»àº¥àº° à»àºà»‰à»„ຂສະà»àº•ັàºàºàº²àº™à»€àº„ື່ອນໄຫວ ທີ່à»àº­àº±àºšàº¯àº­àº·à»ˆàº™à»†à»€àº®àº±àº”ວຽàº. à»àº­àº±àºšàº¯àº—ີ່ເປັນອັນຕະລາຠອາດລົບàºàº§àº™àºàº²àº™à»€àº®àº±àº”ວຽàºàº‚ອງà»àº­àº±àºšàº¯àº­àº·à»ˆàº™."</string>
+ <string name="permlab_startAnyActivity" msgid="2918768238045206456">"ເລີ່ມàºàº²àº™à»€àº®àº±àº”ວຽàºà»ƒàº”ນຶ່ງ"</string>
+ <string name="permdesc_startAnyActivity" msgid="997823695343584001">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯à»€àº¥àºµà»ˆàº¡àºàº²àº™à»€àº®àº±àº”ວຽàºà»ƒàº”àºà»à»„ດ້ ບà»à»ˆàº§à»ˆàº²àºàº²àº™àº­àº°àº™àº¸àºàº²àº” ຫຼືສະຖານະàºàº²àº™àºªàº»à»ˆàº‡àº­àº­àºàºˆàº°à»€àº›àº±àº™à»àº™àº§à»ƒàº”àºà»àº•າມ."</string>
+ <string name="permlab_setScreenCompatibility" msgid="6975387118861842061">"ຕັ້ງຄວາມເຂົ້າàºàº±àº™à»„ດ້ຂອງໜ້າຈà»"</string>
+ <string name="permdesc_setScreenCompatibility" msgid="692043618693917374">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àº„ວບຄຸມໂà»àº”ຄວາມເຂົ້າàºàº±àº™à»„ດ້ ຂອງໜ້າຈà»à»àº­àº±àºšàºžàº¥àº´à»€àº„ຊັນອື່ນໆ. à»àº­àº±àºšàºžàº¥àº´à»€àº„ຊັນທີ່ເປັນອັນຕະລາຠອາດເຮັດໃຫ້à»àº­àº±àºšàºžàº¥àº´à»€àº„ຊັນອື່ນເຮັດວຽàºàºœàº´àº”ພາດໄດ້."</string>
+ <string name="permlab_setDebugApp" msgid="3022107198686584052">"ເປີດàºàº²àº™à»€àºàº±àºšàº‚à»à»‰àº¡àº¹àº™à»€àºžàº·à»ˆàº­à»àºà»‰à»„ຂບັນຫາ"</string>
+ <string name="permdesc_setDebugApp" msgid="4474512416299013256">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯ ເປີດàºàº²àº™à»€àºàº±àºšàº‚à»à»‰àº¡àº¹àº™à»àºà»‰àºšàº±àº™àº«àº²àºªàº³àº¥àº±àºšà»àº­àº±àºšàº¯àº­àº·à»ˆàº™. à»àº­àº±àºšàº¯àº—ີ່ເປັນອັນຕະລາàºàº­àº²àº”ໃຊ້ຄຸນສົມບັດນີ້ເພື່ອປິດà»àº­àº±àºšàº¯àº­àº·à»ˆàº™."</string>
+ <string name="permlab_changeConfiguration" msgid="4162092185124234480">"ປ່ຽນàºàº²àº™àº•ັ້ງຄ່າໜ້າຈà»àº‚ອງລະບົບ"</string>
+ <string name="permdesc_changeConfiguration" msgid="4372223873154296076">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àº›à»ˆàº½àº™à»àº›àº‡àºàº²àº™àº•ັ້ງຄ່າໃນປັດຈຸບັນ ເຊັ່ນ: àºàº²àº™àº•ັ້ງຄ່າທ້ອງຖິ່ນ ຫຼືຂະໜາດໂຕອັàºàºªàº­àº™à»‚ດàºàº®àº§àº¡."</string>
+ <string name="permlab_enableCarMode" msgid="5684504058192921098">"ເປີດນຳໃຊ້ໂຫມດຂັບລົດ"</string>
+ <string name="permdesc_enableCarMode" msgid="4853187425751419467">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯à»€àº›àºµàº”ໃຊ້ໂà»àº”ໃນລົດ."</string>
+ <string name="permlab_killBackgroundProcesses" msgid="3914026687420177202">"ປິດà»àº­àº±àºšàº¯àº­àº·à»ˆàº™à»†"</string>
+ <string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àº›àº´àº”ໂປຣເຊສພື້ນຫຼັງຂອງà»àº­àº±àºšàº¯àº­àº·à»ˆàº™à»„ດ້. ນີ້ອາດເຮັດໃຫ້à»àº­àº±àºšàº¯àº­àº·à»ˆàº™àº™àº±à»‰àº™àº¢àº¸àº”àºàº²àº™à»€àº®àº±àº”ວຽàºà»„ປນຳ."</string>
+ <string name="permlab_forceStopPackages" msgid="2329627428832067700">"ບັງຄັບໃຫ້à»àº­àº±àºšàº¯àº­àº·à»ˆàº™àº¢àº¸àº”ເຮັດວຽàº"</string>
+ <string name="permdesc_forceStopPackages" msgid="5253157296183940812">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àºšàº±àº‡àº„ັບປິດà»àº­àº±àºšàº¯àº­àº·à»ˆàº™à»†à»„ດ້."</string>
+ <string name="permlab_forceBack" msgid="652935204072584616">"ບັງຄັບປິດà»àº­àº±àºšàº¯"</string>
+ <string name="permdesc_forceBack" msgid="3892295830419513623">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àºšàº±àº‡àº„ັບàºàº²àº™à»€àº®àº±àº”ວຽàºàº—ີ່ຢູ່ດ້ານໜ້າປິດ à»àº¥àº°àºàº±àºšàº„ືນໄດ້. à»àº­àº±àºšàºžàº¥àº´à»€àº„ຊັນທົ່ວໄປບà»à»ˆàº„ວນຈຳເປັນຕ້ອງໃຊ້."</string>
+ <string name="permlab_dump" msgid="1681799862438954752">"ດຶງຂà»à»‰àº¡àº¹àº™àºªàº°àº–ານະພາàºà»ƒàº™àº‚ອງລະບົບ"</string>
+ <string name="permdesc_dump" msgid="1778299088692290329">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯ ດຶງເອົາສະຖານະພາàºà»ƒàº™àº‚ອງລະບົບ. à»àº­àº±àºšàº¯àº—ີ່ເປັນອັນຕະລາàºàº­àº²àº”ຈະດຶງເອົາຂà»à»‰àº¡àº¹àº™àºªà»ˆàº§àº™àº•ົວ à»àº¥àº°àº‚à»à»‰àº¡àº¹àº™àº„ວາມປອດໄພ ຫຼາàºàº«àº¼àº²àºàº›àº°à»€àºžàº”ທີ່ບà»à»ˆàºˆàº³à»€àº›àº±àº™àº•à»à»ˆàºžàº§àºàº¡àº±àº™à»€àº¥àºµàº."</string>
+ <string name="permlab_retrieve_window_content" msgid="8022588608994589938">"ດຶງເອົາເນື້ອຫາໜ້າຈà»"</string>
+ <string name="permdesc_retrieve_window_content" msgid="3193269069469700265">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àº”ຶງຂà»à»‰àº¡àº¹àº™à»€àº™àº·à»‰àº­àº«àº²àº‚ອງໜ້າຈà»àº—ີ່ໃຊ້ຢູ່ໄດ້. à»àº­àº±àºšàº¯àº—ີ່ເປັນອັນຕະລາàºàº­àº²àº”ດຶງຂà»à»‰àº¡àº¹àº™àº—ັງà»àº»àº”ໃນໜ້າຈ໠à»àº¥àº°àºàº§àº”ສອບຂà»à»‰àº„ວາມທັງà»àº»àº”ໃນນັ້ນໄດ້ àºàº»àºà»€àº§àº±à»‰àº™àº¥àº°àº«àº±àº”ຜ່ານ."</string>
+ <string name="permlab_temporary_enable_accessibility" msgid="2312612135127310254">"ປິດàºàº²àº™àºŠà»ˆàº§àºàºàº²àº™à»€àº‚ົ້າເຖິງຊົ່ວຄາວ"</string>
+ <string name="permdesc_temporary_enable_accessibility" msgid="8079456293182975464">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàºžàº¥àº´à»€àº„ຊັນ ເປີດໃຊ້àºàº²àº™àºŠà»ˆàº§àºà»€àº‚ົ້າເຖິງà»àºšàºšàºŠàº»à»ˆàº§àº„າວໃນອຸປະàºàº­àº™. à»àº­àº±àºšàº¯àº—ີ່ເປັນອັນຕະລາຠອາດເປີດໃຊ້àºàº²àº™àºŠà»ˆàº§àºà»€àº‚ົ້າເຖິງ ໂດàºàºšà»à»ˆà»„ດ້ຮັບàºàº²àº™àºàº´àº™àºàº­àº¡àºˆàº²àºàºœàº¹à»ˆà»ƒàºŠà»‰."</string>
+ <string name="permlab_retrieve_window_info" msgid="8532295199112519378">"ດຶງເອົາຂà»à»‰àº¡àº¹àº™à»œà»‰àº²àºˆà»"</string>
+ <string name="permdesc_retrieve_window_info" msgid="4998836370424186849">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàºžàº¥àº´à»€àº„ຊັນ ດຶງເອົາຂà»à»‰àº¡àº¹àº™àºà»ˆàº½àº§àºàº±àºšà»œà»‰àº²àºˆà»àºˆàº²àºà»‚ຕຈັດàºàº²àº™à»œà»‰àº²àºˆà». à»àº­àº±àºšàº¯àº—ີ່ບà»à»ˆàº›àº­àº”ໄພອາດດຶງເອົາຂà»à»‰àº¡àº¹àº™àº—ີ່ໃຊ້ສຳລັບພາàºà»ƒàº™àº¥àº°àºšàº»àºšà»„ດ້."</string>
+ <string name="permlab_filter_events" msgid="8675535648807427389">"àºàº±à»ˆàº™àº•ອງເຫດàºàº²àº™"</string>
+ <string name="permdesc_filter_events" msgid="8006236315888347680">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàºžàº¥àº´à»€àº„ຊັນ ລົງທະບຽນàºàº²àº™àºàº±à»ˆàº™àº•ອງຂາເຂົ້າ ທີ່àºàº±à»ˆàº™àº•ອງàºàº²àº™àºªàº»à»ˆàº‡àº‚à»à»‰àº¡àº¹àº™à»€àº«àº”àºàº²àº™àºœàº¹à»ˆà»ƒàºŠà»‰àº—ັງà»àº»àº” àºà»ˆàº­àº™àº—ີ່ພວàºàº¡àº±àº™àºˆàº°àº–ືàºà»€àºœàºµàºà»àºœà»ˆ. à»àº­àº±àºšàº¯àº—ີ່ເປັນອັນຕະລາàºàº­àº²àº”ຄວບຄຸມ UI ຂອງລະບົບໂດàºàºšà»à»ˆàº•້ອງໃຫ້ຜູ່ໃຊ້ຈັດàºàº²àº™à»„ດ້."</string>
+ <string name="permlab_magnify_display" msgid="5973626738170618775">"ຂະຫàºàº²àºàºàº²àº™àºªàº°à»àº”ງຜົນ"</string>
+ <string name="permdesc_magnify_display" msgid="7121235684515003792">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàºžàº¥àº´à»€àº„ຊັນ ສາມາດຂະຫàºàº²àºà»€àº™àº·à»‰àº­àº«àº²àº—ີ່ສະà»àº”ງຜົນໄດ້. à»àº­àº±àºšàºžàº¥àº´à»€àº„ຊັນທີ່ເປັນອັນຕະລາຠອາດປ່ຽນເນື້ອຫາທີ່ສະà»àº”ງໃນລັàºàºªàº°àº™àº° ທີ່ເຮັດໃຫ້ບà»à»ˆàºªàº²àº¡àº²àº”ນຳໃຊ້ອຸປະàºàº­àº™à»„ດ້."</string>
+ <string name="permlab_shutdown" msgid="7185747824038909016">"ປິດລົງບາງສ່ວນ"</string>
+ <string name="permdesc_shutdown" msgid="7046500838746291775">"àºàº³àº™àº»àº”ໃຫ້ໂຕຈັດàºàº²àº™àºàº´àº”ຈະàºàº³àº¢àº¹à»ˆà»ƒàº™àºªàº°àº–ານະປິດລະບົບ ໂດàºàºšà»à»ˆà»„ດ້ປິດລະບົບຢ່າງສົມບູນ."</string>
+ <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"ຂັດຂວາງàºàº²àº™àºªàº°àº¥àº±àºšà»àº­àº±àºšàº¯"</string>
+ <string name="permdesc_stopAppSwitches" msgid="8262195802582255021">"ປ້ອງàºàº±àº™àºšà»à»ˆà»ƒàº«à»‰àºœàº¹à»ˆà»ƒàºŠà»‰àºªàº°àº«àº¼àº±àºšà»„ປຫາà»àº­àº±àºšàº¯àº­àº·à»ˆàº™."</string>
+ <string name="permlab_getTopActivityInfo" msgid="2537922311411546016">"ດຶງຂà»à»‰àº¡àº¹àº™à»àº­àº±àºšàº¯à»ƒàº™àº›àº±àº”ຈຸບັນ"</string>
+ <string name="permdesc_getTopActivityInfo" msgid="8153651434145132505">"ອະນຸàºàº²àº”ໃຫ້ເຈົ້າຂອງດຶງຂà»à»‰àº¡àº¹àº™àºªà»ˆàº§àº™à»‚ຕ àºà»ˆàº½àº§àºàº±àºšà»àº­àº±àºšàºžàº¥àº´à»€àº„ຊັນ à»àº¥àº° àºàº²àº™àºšà»àº¥àº´àºàº²àº™àº›àº±àº”ຈຸບັນໃນໜ້າຈà»à»„ດ້."</string>
+ <string name="permlab_runSetActivityWatcher" msgid="892239094867182656">"ຕິດຕາມ à»àº¥àº°àº„ວບຄຸມàºàº²àº™à»€àº›àºµàº”ໂຕຂອງà»àº­àº±àºšàº¯àº—ັງà»àº»àº”"</string>
+ <string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯ ຕິດຕາມ à»àº¥àº°àº„ວບຄຸມວິທີທີ່ລະບົບເລີ່ມàºàº²àº™à»€àº®àº±àº”ວຽàºàº•່າງໆ. à»àº­àº±àºšàº¯àº—ີ່ເປັນອັນຕະລາຠອາດເຮັດໃຫ້ລະບົບທັງà»àº»àº”ເàºàºµàº”ອັນຕະລາàºà»„ດ້. àºàº²àº™àºàº³àº™àº»àº”ສິດນີ້ຈຳເປັນສຳລັບàºàº²àº™àºžàº±àº”ທະນາເທົ່ານັ້ນ, ບà»à»ˆà»àº¡à»ˆàº™àºªàº³àº¥àº±àºšàºàº²àº™àº™àº³à»ƒàºŠà»‰àº—ົ່ວໄປ."</string>
+ <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"ສົ່ງàºàº²àº™àºàº°àºˆà»ˆàº²àºàº‚à»à»‰àº¡àº¹àº™àº—ີ່ເອົາà»àºžàº±àºà»€àºàº”ອອàºà»àº¥à»‰àº§"</string>
+ <string name="permdesc_broadcastPackageRemoved" msgid="6621901216207931089">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àºªàº»à»ˆàº‡àºàº²àº™à»àºˆà»‰àº‡à»€àº•ືອນວ່າ à»àºžàº±àºà»€àºàº±àº”ຂອງà»àº­àº±àºšàº¯àº”ັ່ງໄດ້ລຶບອອàºà»„ປà»àº¥à»‰àº§. à»àº­àº±àºšàº¯àº—ີ່ເປັນອັນຕະລາຠອາດໃຊ້ຄວາມສາມາດນີ້ ເພື່ອປິດàºàº²àº™à»€àº®àº±àº”ວຽàºàº‚ອງà»àº­àº±àºšàº¯àº­àº·à»ˆàº™à»† ທີ່àºàº³àº¥àº±àº‡à»€àº®àº±àº”ວຽàºàº¢àº¹à»ˆ."</string>
+ <string name="permlab_broadcastSmsReceived" msgid="5689095009030336593">"ສົ່ງàºàº²àº™àºàº°àºˆàº²àº SMS ທີ່ໄດ້ຮັບ"</string>
+ <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯ àºàº°àºˆàº²àºàºªàº±àº™àºàº²àº™àºàº²àº™à»àºˆà»‰àº‡à»€àº•ືອນວ່າຂà»à»‰àº„ວາມ SMS ໄດ້ຮັບà»àº¥à»‰àº§. à»àº­àº±àºšàº¯àº—ີ່ເປັນອັນຕະລາàºàº­àº²àº”ຈະໃຊ້ສິ່ງນີ້ໃນàºàº²àº™àº›àº­àº¡à»àº›àº‡àº‚à»à»‰àº„ວາມ SMS ຂາເຂົ້າ."</string>
+ <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"ສົ່ງàºàº²àº™àºàº°àºˆàº²àº WAP-PUSH ທີ່ໄດ້ຮັບ"</string>
+ <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àºªàº»à»ˆàº‡àºàº²àº™à»àºˆà»‰àº‡à»€àº•ືອນໃນເວລາທີ່ໄດ້ຮັບຂà»à»‰àº¡àº„ວາມ WAP PUSH. à»àº­àº±àºšàº¯àº—ີ່ເປັນອັນຕະລາຠອາດໃຊ້àºàº²àº™àºàº°àº—ຳນີ້ເພື່ອປອມàºàº²àº™à»„ດ້ຮັບຂà»à»‰àº„ວາມ MMS ຫຼືລັàºàº›à»ˆàº½àº™à»€àº™àº·à»‰àº­àº«àº²àº‚ອງໜ້າເວັບຕ່າງໆ ດ້ວàºàºªàº´à»ˆàº‡àº­àº±àº™àº•ະລາàºàº—ັງຫຼາàºàº¢à»ˆàº²àº‡àº‡àº½àºšà»†."</string>
+ <string name="permlab_setProcessLimit" msgid="2451873664363662666">"ຈຳàºàº±àº”ຈຳນວນຂອງໂປຣເຊສທີ່ເຮັດວຽàºàº¢àº¹à»ˆ"</string>
+ <string name="permdesc_setProcessLimit" msgid="7318061314040879542">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àº„ວບຄຸມຈຳນວນສູງສຸດ ຂອງໂປຣເຊສທີ່ຈະເຮັດວຽàº. ບà»à»ˆàº„ວນຖືàºà»ƒàºŠà»‰àºàº±àºšà»àº­àº±àºšàºžàº¥àº´à»€àº„ຊັນທົ່ວໄປ."</string>
+ <string name="permlab_setAlwaysFinish" msgid="550958507798796965">"ບັງຄັບໃຫ້à»àº­àº±àºšàº¯àº—ີ່ເຮັດວຽàºàº¢àº¹à»ˆàºžàº·à»‰àº™àº«àº¼àº±àº‡àº›àº´àº”ໂຕລົງ"</string>
+ <string name="permdesc_setAlwaysFinish" msgid="7471310652868841499">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àº„ວບຄຸມວ່າàºàº²àº™à»€àº®àº±àº”ວຽàºà»ƒàº” ຄວນຈະຖືàºàº›àº´àº”ລົງ ຫຼັງຈາàºàº—ີ່ພວàºàº¡àº±àº™àº–ືàºàº›à»ˆàº½àº™à»ƒàº«à»‰à»„ປເຮັດວຽàºà»ƒàº™àº«àº¼àº±àº‡àº¥àº°àºšàº»àºš. ບà»à»ˆàº„ວນໃຊ້àºàº±àºšà»àº­àº±àºšàº¯àº—ົ່ວໄປ."</string>
+ <string name="permlab_batteryStats" msgid="2789610673514103364">"ອ່ານສະຖິຕິà»àºšàº±àº”ເຕີຣີ"</string>
+ <string name="permdesc_batteryStats" msgid="5897346582882915114">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàºžàº¥àº´à»€àº„ຊັນ ອ່ານຂà»à»‰àº¡àº¹àº™àºàº²àº™àº™àº³à»ƒàºŠà»‰àº›àº°àºˆàº¸àºšàº±àº™àº‚ອງຖ່ານໃນລະດັບຕà»à»ˆàº². ອາດຈະເຮັດໃຫ້à»àº­àº±àºšàºžàº¥àº´à»€àº„ຊັນ ສາມາດຊອàºàº«àº²àº‚à»à»‰àº¡àº¹àº™àº¥àº°àº­àº½àº” àºà»ˆàº½àº§àºàº±àºšà»àº­àº±àºšàº¯àº—ີ່ທ່ານໃຊ້."</string>
+ <string name="permlab_updateBatteryStats" msgid="3719689764536379557">"à»àºà»‰à»„ຂສະຖິຕິà»àºšàº±àº”ເຕີຣີ"</string>
+ <string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯ à»àºà»‰à»„ຂສະຖິຕິàºà»ˆàº½àº§àºàº±àºšà»àºšàº±àº”ເຕີຣີທີ່ເàºàº±àºšàºàº³àº¡àº²à»„ດ້. ບà»à»ˆà»ƒàºŠà»‰àºªàº³àº¥àº±àºšà»àº­àº±àºšàº¯àº—ົ່ວໄປ."</string>
+ <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"ດຶງຂà»à»‰àº¡àº¹àº™àºªàº°àº–ິຕິàºàº²àº™à»€àº®àº±àº”ວຽàºàº‚ອງà»àº­àº±àºšàº¯"</string>
+ <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àº”ຶງເອົາຂà»à»‰àº¡àº¹àº™ ສະຖິຕິຂອງà»àº­àº±àºšàºžàº¥àº´à»€àº„ຊັນທີ່ໄດ້ເàºàº±àºšàºàº³àº¡àº². ບà»à»ˆà»„ດ້ໃຊ້ໃນà»àº­àº±àºšàº¯àº—ົ່ວໄປ."</string>
+ <string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"à»àºà»‰à»„ຂສະຖິຕິàºàº²àº™à»€àº®àº±àº”ວຽàºàº‚ອງà»àº­àº±àºšàº¯"</string>
+ <string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯à»àºà»‰à»„ຂສະຖິຕິ àºàº²àº™à»€àº®àº±àº”ວຽàºàº‚ອງà»àº­àº±àºšàºžàº¥àº´à»€àº„ຊັນທີ່ເàºàº±àºšàºàº³àº¡àº². à»àº­àº±àºšàº¯àº—ົ່ວໄປບà»à»ˆàºˆàº³à»€àº›àº±àº™àº•້ອງໃຊ້."</string>
+ <string name="permlab_backup" msgid="470013022865453920">"ຄວບຄຸມàºàº²àº™àºªàº³àº®àº­àº‡ à»àº¥àº°àºàº²àº™àºàº¹à»‰àº‚à»à»‰àº¡àº¹àº™àº¥àº°àºšàº»àºš"</string>
+ <string name="permdesc_backup" msgid="6912230525140589891">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àº„ວບຄຸມàºàº»àº™à»„àºàºàº²àº™àºªàº³àº®àº­àº‡ à»àº¥àº°àºàº¹à»‰àº‚à»à»‰àº¡àº¹àº™àº‚ອງລະບົບໄດ້. à»àº­àº±àºšàº¯àº—ຳມະດາບà»à»ˆà»„ດ້ໃຊ້."</string>
+ <string name="permlab_confirm_full_backup" msgid="5557071325804469102">"ຢືນຢັນàºàº²àº™àºªàº³àº®àº­àº‡ ຫຼືàºàº²àº™àºàº¹à»‰àº‚à»à»‰àº¡àº¹àº™à»€àº•ັມຮູບà»àºšàºš"</string>
+ <string name="permdesc_confirm_full_backup" msgid="1748762171637699562">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯à»€àº›àºµàº”àºàº²àº™à»€àº®àº±àº”ວຽຠຂອງສ່ວນຕິດຕà»à»ˆàºœàº¹à»ˆà»ƒàºŠà»‰àºªàº³àº¥àº±àºšàº¢àº·àº™àº¢àº±àº™àºàº²àº™àºªàº³àº®àº­àº‡àº‚à»à»‰àº¡àº¹àº™à»€àº•ັມຮູບà»àºšàºš. ບà»à»ˆàº¡àºµà»àº­àº±àºšàº¯à»ƒàº”ຕ້ອງໃຊ້ຄຸນສົມບັດນີ້."</string>
+ <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"ສະà»àº”ງໜ້າຈà»àº—ີ່ບà»à»ˆà»„ດ້ຮັບອະນຸàºàº²àº”"</string>
+ <string name="permdesc_internalSystemWindow" msgid="7458387759461466397">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àºªà»‰àº²àº‡à»œà»‰àº²àºˆà»àºªàº³àº¥àº±àºšàºàº²àº™àº™àº³à»ƒàºŠà»‰àºžàº²àºà»ƒàº™àº¥àº°àºšàº»àºš. à»àº­àº±àºšàº¯àº—ົ່ວໄປບà»à»ˆà»„ດ້ໃຊ້."</string>
+ <string name="permlab_systemAlertWindow" msgid="3543347980839518613">"ບັງà»àº­àº±àºšàº¯àº­àº·à»ˆàº™à»†"</string>
+ <string name="permdesc_systemAlertWindow" msgid="8584678381972820118">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯à»€àº®àº±àº”ວຽàºà»€àº—ິງà»àº­àº±àºšàº¯ ຫຼືບ່ອນອື່ນໆຂອງສ່ວນຕິດຕà»à»ˆàºœàº¹à»ˆà»ƒàºŠà»‰ ເຊິ່ງອາດລົບàºàº§àº™àºàº²àº™à»€àº®àº±àº”ວຽàºàº‚ອງສ່ວນຕິດຕà»à»ˆ ໃນà»àº­àº±àºšàºžàº¥àº´à»€àº„ຊັນຕ່າງໆ ຫຼືປ່ຽນສິ່ງທີ່ທ່ານຄິດວ່າທ່ານເຫັນໃນà»àº­àº±àºšàºžàº¥àº´à»€àº„ຊັນອື່ນໆໄດ້."</string>
+ <string name="permlab_setAnimationScale" msgid="2805103241153907174">"à»àºà»‰à»„ຂຄວາມໄວຂອງອະນິເມຊັນໂດàºàº®àº§àº¡"</string>
+ <string name="permdesc_setAnimationScale" msgid="7690063428924343571">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯ ປ່ຽນຄວາມໄວອະນິເມຊັນທົ່ວໄປ (ອະນິເມຊັນໄວຂຶ້ນ ຫຼືຊ້າລົງ) ໄດ້ຕະຫຼອດເວລາ."</string>
+ <string name="permlab_manageAppTokens" msgid="1286505717050121370">"ຈັດàºàº²àº™à»‚ທເຄນຂອງà»àº­àº±àºšàº¯"</string>
+ <string name="permdesc_manageAppTokens" msgid="8043431713014395671">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àºªà»‰àº²àº‡ à»àº¥àº°àºˆàº±àº”àºàº²àº™à»‚ທເຄນຂອງຕົນເອງ ໂດàºàº‚້າມàºàº²àº™àºˆàº±àº”ຕາມລຳດັບ Z ປົàºàºàº°àº•ິຂອງພວàºàº¡àº±àº™à»„ປ. à»àº­àº±àºšàº¯àº—ົ່ວໄປບà»à»ˆàº„ວນຈຳເປັນຕ້ອງໃຊ້."</string>
+ <string name="permlab_freezeScreen" msgid="4708181184441880175">"ຄ້າງໜ້າຈà»"</string>
+ <string name="permdesc_freezeScreen" msgid="8558923789222670064">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàºžàº¥àº´à»€àº„ຊັນຄ້າງໜ້າຈà»à»„ວ້ຊົ່ວຄາວ ສຳລັບàºàº²àº™àº›à»ˆàº½àº™à»€àº›àº±àº™à»àºšàºšà»€àº•ັມໜ້າຈà»."</string>
+ <string name="permlab_injectEvents" msgid="1378746584023586600">"àºàº»àº”ປຸ່ມà»àº¥àº°àº›àº¸à»ˆàº¡àº„ວບຄຸມ"</string>
+ <string name="permdesc_injectEvents" product="tablet" msgid="206352565599968632">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àºªàº»à»ˆàº‡àºàº´àº”ຈະàºàº³àºàº²àº™àº›à»‰àº­àº™àº‚à»à»‰àº¡àº¹àº™àº‚ອງມັນ (ເຊັ່ນ: àºàº²àº™àºàº»àº”ປຸ່ມ à»àº¥àº°àº­àº·à»ˆàº™à»†) ຫາà»àº­àº±àºšàº¯àº­àº·à»ˆàº™. à»àº­àº±àºšàº¯àº—ີ່ເປັນອັນຕະລາàºàº­àº²àº”ໃຊ້ຄຸນສົມບັດນີ້ ເພື່ອຄວບຄຸມà»àº—ັບເລັດໄດ້."</string>
+ <string name="permdesc_injectEvents" product="default" msgid="653128057572326253">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯ ສົ່ງàºàº²àº™àº›à»‰àº­àº™àº‚à»à»‰àº¡àº¹àº™àº‚ອງຕົນເອງ (àºàº²àº™àºàº»àº”ປຸ່ມ à»àº¥àº°àº­àº·à»ˆàº™à»†.) ໃຫ້à»àº­àº±àºšàº¯àº­àº·à»ˆàº™. à»àº­àº±àºšàº¯àº—ີ່ເປັນອັນຕະລາຠສາມາດໃຊ້ສິ່ງນີ້ເພື່ອàºàº¶àº”ເອົາàºàº²àº™àº„ວບຄຸມໂທລະສັບທັງà»àº»àº”ໄດ້."</string>
+ <string name="permlab_readInputState" msgid="469428900041249234">"ບັນທຶàºàºªàº´à»ˆàº‡àº—ີ່ທ່ານພິມ à»àº¥àº°àºàº²àº™àºàº°àº—ຳທີ່ທ່ານເຮັດ"</string>
+ <string name="permdesc_readInputState" msgid="8387754901688728043">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯à»€àºšàº´à»ˆàº‡àºàº²àº™àºàº»àº”ປຸ່ມຂອງທ່ານ ເມື່ອມີປະຕິສຳພັນàºàº±àºšà»àº­àº±àºšàº¯àº­àº·à»ˆàº™ (ເຊັ່ນ: àºàº²àº™àºžàº´àº¡àº¥àº°àº«àº±àº”ຜ່ານ). à»àº­àº±àºšàº¯àº—ົ່ວໄປບà»à»ˆàº„ວນຈຳເປັນຕ້ອງໃຊ້."</string>
+ <string name="permlab_bindInputMethod" msgid="3360064620230515776">"ເຊື່ອມໂàºàº‡àºàº±àºšàº§àº´àº—ີປ້ອນຂà»à»‰àº¡àº¹àº™"</string>
+ <string name="permdesc_bindInputMethod" msgid="3250440322807286331">"ອະນຸàºàº²àº”ໃຫ້ຜູ່ຖືຜູàºàºàº±àºšàº­àº´àº™à»€àº•ີເຟດລະດັບສູງສຸດ ຂອງຮູບà»àºšàºšàºàº²àº™àº›à»‰àº­àº™àº‚à»à»‰àº¡àº¹àº™. ບà»à»ˆàºˆàº³à»€àº›àº±àº™àºªàº³àº¥àº±àºšà»àº­àº±àºšàº¯àº—ົ່ວໄປ."</string>
+ <string name="permlab_bindAccessibilityService" msgid="5357733942556031593">"ເຊື່ອມໂàºàº‡àºàº±àºšàºšà»àº¥àº´àºàº²àº™àºŠà»ˆàº§àºàºàº²àº™à»€àº‚ົ້າເຖິງໃດນຶ່ງ"</string>
+ <string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"ອະນຸàºàº²àº”ໃຫ້ເຈົ້າຂອງ ເຊື່ອມໂàºàº‡àºªà»ˆàº§àº™àº•ິດຕà»à»ˆàº¥àº°àº”ັບເທິງສຸດ ຂອງບà»àº¥àº´àºàº²àº™àºàº²àº™à»€àº‚ົ້າເຖິງ. à»àº­àº±àºšàº¯àº—ົ່ວໄປບà»à»ˆàº„ວນຈຳເປັນຕ້ອງໃຊ້."</string>
+ <string name="permlab_bindPrintService" msgid="8462815179572748761">"ຜູàºâ€‹àº¡àº±àº”​àºàº±àºšâ€‹àºàº²àº™â€‹àºšà»â€‹àº¥àº´â€‹àºàº²àº™â€‹àºžàº´àº¡"</string>
+ <string name="permdesc_bindPrintService" msgid="7960067623209111135">"ອະນຸàºàº²àº”ໃຫ້ເຈົ້າຂອງຜູàºàºàº±àºšàºªà»ˆàº§àº™àº•ິດຕà»à»ˆàºœàº¹à»ˆà»ƒàºŠà»‰àº‚ອງàºàº²àº™àºšà»àº¥àº´àºàº²àº™àºàº²àº™àºžàº´àº¡. ບà»à»ˆà»œà»‰àº²àºˆàº°àº•້ອງàºàº²àº™àºªàº³àº¥àº±àºšà»àº­àº±àºšàº¯àº—ົ່ວໄປ."</string>
+ <string name="permlab_accessAllPrintJobs" msgid="1120792468465711159">"ເຂົ້າເຖິງວຽàºàºàº²àº™àºžàº´àº¡àº—ັງà»àº»àº”"</string>
+ <string name="permdesc_accessAllPrintJobs" msgid="2978185311041864762">"ອະນຸàºàº²àº”ໃຫ້ເຈົ້າຂອງເຂົ້າເຖິງວຽàºàºàº²àº™àºžàº´àº¡àº—ີ່ຖືàºàºªà»‰àº²àº‡à»‚ດàºà»àº­àº±àºšàº¯àº­àº·à»ˆàº™. ບà»à»ˆà»œà»‰àº²àºˆàº°àº•້ອງàºàº²àº™àºªàº³àº¥àº±àºšà»àº­àº±àºšàº¯àº—ົ່ວໄປ."</string>
+ <string name="permlab_bindNfcService" msgid="2752731300419410724">"ເຊື່ອມໂàºàº‡àºàº±àºšàºšà»àº¥àº´àºàº²àº™ NFC"</string>
+ <string name="permdesc_bindNfcService" msgid="6120647629174066862">"ອະນຸàºàº²àº”ໃຫ້ຜູ່ຖືອຸປະàºàº­àº™à»ƒàº«à»‰àºªàº²àº¡àº²àº”ເຊື່ອມໂàºàº‡à»àº­àº±àºšàºžàº¥àº´à»€àº„ຊັນ ທີ່ຄ້າàºàºàº±àºšàºšàº±àº” NFC. ມັນບà»à»ˆàºˆàº³à»€àº›àº±àº™àº•້ອງໃຊ້ໃນà»àº­àº±àºšàº¯àº—ຳມະດາ."</string>
+ <string name="permlab_bindTextService" msgid="7358378401915287938">"ເຊື່ອມໂàºàº‡à»„ປຫາບà»àº¥àº´àºàº²àº™àºªàº»à»ˆàº‡àº‚à»à»‰àº„ວາມ"</string>
+ <string name="permdesc_bindTextService" msgid="8151968910973998670">"ອະນຸàºàº²àº”ໃຫ້ຜູ່ຖືຜູàºàºàº±àºšàº­àº´àº™à»€àº•ີເຟດລະດັບສູງສຸດ ຂອງບà»àº¥àº´àºàº²àº™àº‚à»à»‰àº„ວາມ(ຕ.ຢ. SpellCheckerService). ບà»à»ˆàºˆàº³à»€àº›àº±àº™àºªàº³àº¥àº±àºšà»àº­àº±àºšàº¯àº—ົ່ວໄປ."</string>
+ <string name="permlab_bindVpnService" msgid="4708596021161473255">"ເຊື່ອມໂàºàº‡àºàº±àºšàºšà»àº¥àº´àºàº²àº™ VPN"</string>
+ <string name="permdesc_bindVpnService" msgid="2067845564581693905">"ອະນຸàºàº²àº”ໃຫ້ເຈົ້າຂອງເຊື່ອມໂàºàº‡àºàº±àºšàºªà»ˆàº§àº™àº•ິດຕà»à»ˆàº¥àº°àº”ັບເທິງສຸດ ຂອງບà»àº¥àº´àºàº²àº™ VPN. à»àº­àº±àºšàº¯àº—ົ່ວໄປບà»à»ˆàº„ວນຈຳເປັນຕ້ອງໃຊ້."</string>
+ <string name="permlab_bindWallpaper" msgid="8716400279937856462">"ເຊື່ອມໂàºàº‡àºàº±àºšàºžàº²àºšàºžàº·à»‰àº™àº«àº¼àº±àº‡"</string>
+ <string name="permdesc_bindWallpaper" msgid="7108428692595491668">"ອະນຸàºàº²àº”ໃຫ້ຜູ່ໃຊ້ເຊື່ອມໂàºàº‡àºàº±àºšàºªà»ˆàº§àº™àº•ິດຕà»à»ˆàº¥àº°àº”ັບສູງສຸດ ຂອງພາບພື້ນຫຼັງໃດນຶ່ງ. à»àº­àº±àºšàº¯àº—ຳມະດາບà»à»ˆàº„ວນຈຳເປັນຕ້ອງໃຊ້."</string>
+ <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"ເຊື່ອມໂàºàº‡à»„ປຫາບà»àº¥àº´àºàº²àº™àº§àº´àº”ເຈັດ"</string>
+ <string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"ອະນຸàºàº²àº”ໃຫ້ຜູ່ຖືຜູàºàºàº±àºšàº­àº´àº™à»€àº•ີເຟດລະດັບສູງສຸດ ຂອງບà»àº¥àº´àºàº²àº™àº§àº´à»€àºˆàº±àº”. ບà»à»ˆàºˆàº³à»€àº›àº±àº™àºªàº³àº¥àº±àºšà»àº­àº±àºšàº¯àº—ົ່ວໄປ."</string>
+ <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"ຕິດຕà»à»ˆàºàº±àºšàºœàº¹à»ˆà»€àºšàº´à»ˆàº‡à»àºàº‡àº­àº¸àº›àº°àºàº­àº™"</string>
+ <string name="permdesc_bindDeviceAdmin" msgid="569715419543907930">"ອະນຸàºàº²àº”ໃຫ້ເຈົ້າຂອງສົ່ງເຈດຕະນາຫາຜູ່ເບິ່ງà»àºàº‡àº¥àº°àºšàº»àºšàº­àº¸àº›àº°àºàº­àº™. à»àº­àº±àºšàº¯àº—ົ່ວໄປບà»à»ˆàº„ວນຈຳເປັນຕ້ອງໃຊ້."</string>
+ <string name="permlab_manageDeviceAdmins" msgid="4248828900045808722">"ເພີ່ມ ຫຼືລຶບຜູ່ເບິ່ງà»àºàº‡àº¥àº°àºšàº»àºšàº­àº¸àº›àº°àºàº­àº™"</string>
+ <string name="permdesc_manageDeviceAdmins" msgid="5025608167709942485">"ອະນຸàºàº²àº”ໃຫ້ເຈົ້າຂອງສາມາດລຶບ ຫຼືລຶບຂà»à»‰àº¡àº¹àº™àº­àº¸àº›àº°àºàº­àº™àº—ີ່ນຳໃຊ້ໄດ້. à»àº­àº±àºšàº¯àº—ົ່ວໄປບà»à»ˆàºˆàº³à»€àº›àº±àº™àº•້ອງໃຊ້."</string>
+ <string name="permlab_setOrientation" msgid="3365947717163866844">"ປ່ຽນລວງຂອງໜ້າຈà»"</string>
+ <string name="permdesc_setOrientation" msgid="3046126619316671476">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àº›à»ˆàº½àº™àºàº²àº™à»àº¸àº™àº‚ອງໜ້າຈà»à»„ດ້ທຸàºà»€àº§àº¥àº². ບà»à»ˆàº„ວນຖືàºà»ƒàºŠà»‰à»ƒàº™à»àº­àº±àºšàºžàº¥àº´à»€àº„ຊັນທົ່ວໄປ."</string>
+ <string name="permlab_setPointerSpeed" msgid="9175371613322562934">"ປ່ຽນຄວາມໄວລູàºàºªàº­àº™"</string>
+ <string name="permdesc_setPointerSpeed" msgid="6866563234274104233">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àº›à»ˆàº½àº™àº„ວາມໄວເມົ້າ ຫຼືລູàºàºªàº­àº™à»àº—ຣັàºà»àºžàº”ໃນເວລາໃດàºà»à»„ດ້. à»àº­àº±àºšàº¯àº—ົ່ວໄປບà»à»ˆàº„ວນຈຳເປັນຕ້ອງໃຊ້."</string>
+ <string name="permlab_setKeyboardLayout" msgid="4778731703600909340">"ປ່ຽນຮູບà»àºšàºšà»àº›à»‰àº™àºžàº´àº¡"</string>
+ <string name="permdesc_setKeyboardLayout" msgid="8480016771134175879">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àº›à»ˆàº½àº™àº®àº¹àºšà»àºšàºšàº‚ອງà»àº›à»‰àº™àº³àºžàº´àº¡. ບà»à»ˆàºˆàº³à»€àº›àº±àº™àºªàº³àº¥àº±àºšà»àº­àº±àºšàº¯àº—ົ່ວໄປ."</string>
+ <string name="permlab_signalPersistentProcesses" msgid="4539002991947376659">"ສົ່ງສັນàºàº²àº™ Linux ຫາà»àº­àº±àºšàº¯"</string>
+ <string name="permdesc_signalPersistentProcesses" msgid="4896992079182649141">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àº®à»‰àº­àº‡àº‚à»à»ƒàº«à»‰àºªàº»à»ˆàº‡àºªàº±àº™àºàº²àº™ à»àºˆà»‰àº‡à»„ປຫາໂປຣເຊສທີ່àºàº±àº‡à»€àº®àº±àº”ວຽàºàº¢àº¹à»ˆàº—ັງà»àº»àº”."</string>
+ <string name="permlab_persistentActivity" msgid="8841113627955563938">"ເຮັດໃຫ້à»àº­àº±àºšàº¯à»€àº®àº±àº”ວຽàºàº•ະຫຼອດເວລາ"</string>
+ <string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯ ສາມາດເຮັດໃຫ້ບາງພາàºàºªà»ˆàº§àº™àº‚ອງມັນເອັງ ຄົງໂຕໃນໜ່ວàºàº„ວາມຈຳ. ສິ່ງນີ້ສາມາດຈຳàºàº±àº”ໜ່ວàºàº„ວາມຈຳທີ່ສາມາດໃຊ້ໄດ້ໂດàºà»àº­àº±àºšàº¯àº­àº·à»ˆàº™ ເຮັດໃຫ້à»àº—ັບເລັດຊ້າລົງ."</string>
+ <string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯à»€àº®àº±àº”ໃຫ້ສ່ວນນຶ່ງຂອງຕົນເອງ ຄົງຢູ່ຖາວອນໃນໜ່ວàºàº„ວາມຈຳ ເຊິ່ງອາດສາມາດ ເຮັດໃຫ້àºàº²àº™àº™àº³à»ƒàºŠà»‰à»œà»ˆàº§àºàº„ວາມຈຳຂອງà»àº­àº±àºšàº¯ ອື່ນຖືàºàºˆàº³àºàº±àº” ສົ່ງຜົນເຮັດໃຫ້ມືຖືຂອງທ່ານເຮັດວຽàºàºŠà»‰àº²àº¥àº»àº‡à»„ດ້."</string>
+ <string name="permlab_deletePackages" msgid="184385129537705938">"ລຶບà»àº­àº±àºšàº¯"</string>
+ <string name="permdesc_deletePackages" msgid="7411480275167205081">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àº¥àº¶àºšà»àºžàº±àºà»€àºàº±àº” Android ຕ່າງໆໄດ້. à»àº­àº±àºšàº¯àº­àº±àº™àº•ະລາàºàº­àº²àº”ໃຊ້ຄວາມສາມາດນີ້ ເພື່ອລຶບà»àº­àº±àºšàº¯àº—ີ່ສຳຄັນໄດ້."</string>
+ <string name="permlab_clearAppUserData" msgid="274109191845842756">"ລຶບຂà»à»‰àº¡àº¹àº™àº‚ອງà»àº­àº±àºšàº¯àº­àº·à»ˆàº™"</string>
+ <string name="permdesc_clearAppUserData" msgid="4625323684125459488">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àº¥àº¶àºšàº‚à»à»‰àº¡àº¹àº™àºœàº¹à»ˆà»ƒàºŠà»‰."</string>
+ <string name="permlab_deleteCacheFiles" msgid="3128665571837408675">"ລຶບ cache ຂອງà»àº­àº±àºšàº¯àº­àº·à»ˆàº™"</string>
+ <string name="permdesc_deleteCacheFiles" msgid="3812998599006730196">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àº¥àº¶àºšà»„ຟລ໌ cache ໄດ້."</string>
+ <string name="permlab_getPackageSize" msgid="7472921768357981986">"àºàº§àº”ສອບພື້ນທີ່ຈັດເàºàº±àºšàº‚à»à»‰àº¡àº¹àº™à»àº­àº±àºšàº¯"</string>
+ <string name="permdesc_getPackageSize" msgid="3921068154420738296">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àº”ຶງໂຄດ, ຂà»à»‰àº¡àº¹àº™ à»àº¥àº°àº‚ະໜາດ cache ຂອງມັນໄດ້."</string>
+ <string name="permlab_installPackages" msgid="2199128482820306924">"ຕິດຕັ້ງà»àº­àº±àºšàº¯à»‚ດàºàºàº»àº‡"</string>
+ <string name="permdesc_installPackages" msgid="5628530972548071284">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àº•ິດຕັ້ງà»àºžàº±àºà»€àºàº” Android ໃà»à»ˆ ຫຼືà»àºžàº±àºà»€àºàº”ທີ່ອັບເດດà»àº¥à»‰àº§. à»àº­àº±àºšàº¯àº—ີ່ເປັນອັນຕະລາàºàº­àº²àº”ໃຊ້ຄຸນສົມບັດນີ້ ເພື່ອສ້າງà»àº­àº±àºšàº¯à»ƒà»à»ˆàº—ີ່ມີສິດອະນຸàºàº²àº”ສູງàºàº§à»ˆàº²à»„ດ້."</string>
+ <string name="permlab_clearAppCache" msgid="7487279391723526815">"ລຶບຂà»à»‰àº¡àº¹àº™ cache ຂອງà»àº­àº±àºšàº¯àº—ັງà»àº»àº”"</string>
+ <string name="permdesc_clearAppCache" product="tablet" msgid="8974640871945434565">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àºªà»‰àº²àº‡àºžàº·à»‰àº™àº—ີ່ຫວ່າງໃນà»àº—ັບເລັດ ໂດàºàºàº²àº™àº¥àº¶àºšà»„ຟລ໌ໃນໄດເຣັàºàº—à»àº£àºµ cache ຂອງà»àº­àº±àºšàºžàº¥àº´à»€àº„ຊັນອື່ນ. ຄຸນສົມບັດນີ້ອາດເຮັດໃຫ້à»àº­àº±àºšàºžàº¥àº´à»€àº„ຊັນອື່ນ ເລີ່ມເຮັດວຽàºàºŠà»‰àº²àº¥àº»àº‡à»€àºžàº²àº°àº•້ອງຂຽນຂà»à»‰àº¡àº¹àº™àº„ືນໃà»à»ˆ."</string>
+ <string name="permdesc_clearAppCache" product="default" msgid="2459441021956436779">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàºžàº¥àº´à»€àº„ຊັນເພີ່ມເນື້ອທີ່ຫວ່າງໃຫ້ໂທລະສັບ ໂດàºàºàº²àº™àº¥àº¶àºšà»„ຟລ໌ໃນໄດເຣັàºàº—à»àº£àºµ cache ຂອງà»àº­àº±àºšàºžàº¥àº´à»€àº„ຊັນອື່ນໆ. àºàº²àº™àºàº°àº—ຳນີ້ອາດເຮັດໃຫ້à»àº­àº±àºšàºžàº¥àº´à»€àº„ຊັນອື່ນ ເຮັດວຽàºà»„ດ້ຊ້າລົງເນື່ອງຈາàºàºžàº§àºàº¡àº±àº™àº•້ອງໄດ້ດຶງຂà»à»‰àº¡àº¹àº™àº„ືນໃà»à»ˆ."</string>
+ <string name="permlab_movePackage" msgid="3289890271645921411">"àºà»‰àº²àºàºŠàº±àºšàºžàº°àºàº²àºàº­àº™à»àº­àº±àºšàº¯"</string>
+ <string name="permdesc_movePackage" msgid="319562217778244524">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àºà»‰àº²àºà»àº«àº¥à»ˆàº‡àºŠàº±àºšàºžàº°àºàº²àºàº­àº™à»àº­àº±àºšàº¯ ຈາàºàºšà»ˆàº­àº™àºˆàº±àº”ເàºàº±àºšàº‚à»à»‰àº¡àº¹àº™àºžàº²àºà»ƒàº™ ສູ່ບ່ອນຈັດເàºàº±àºšàº‚à»à»‰àº¡àº¹àº™àºžàº²àºàº™àº­àº à»àº¥àº°à»ƒàº™àº—າງàºàº±àºšàºàº±àº™à»„ດ້."</string>
+ <string name="permlab_readLogs" msgid="6615778543198967614">"ອ່ານຂà»à»‰àº¡àº¹àº™àºšàº±àº™àº—ຶàºàº—ີ່ສຳຄັນ"</string>
+ <string name="permdesc_readLogs" product="tablet" msgid="82061313293455151">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àº­à»ˆàº²àº™à»„ຟລ໌ບັນທຶàºàº¥àº°àºšàº»àºšàº•່າງໆຂອງລະບົບ. ຄຸນສົມບັດນີ້ຈະອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯ ສາມາດຄົ້ນພົບຂà»à»‰àº¡àº¹àº™àº—ົ່ວໄປ àºà»ˆàº½àº§àºàº±àºšàºªàº´à»ˆàº‡àº—ີ່ທ່ານàºàº³àº¥àº±àº‡à»€àº®àº±àº”àºàº±àºšà»àº—ັບເລັດ ເຊິ່ງອາດຮວມເຖິງຂà»à»‰àº¡àº¹àº™àºªà»ˆàº§àº™à»‚ຕນຳໄດ້."</string>
+ <string name="permdesc_readLogs" product="default" msgid="2063438140241560443">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àº­à»ˆàº²àº™à»„ຟລ໌ບັນທຶàºàº¥àº°àºšàº»àºšàº•່າງໆຂອງລະບົບ. ຄຸນສົມບັດນີ້ຈະອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯ ສາມາດຄົ້ນພົບຂà»à»‰àº¡àº¹àº™àº—ົ່ວໄປ àºà»ˆàº½àº§àºàº±àºšàºªàº´à»ˆàº‡àº—ີ່ທ່ານàºàº³àº¥àº±àº‡à»€àº®àº±àº”àºàº±àºšà»‚ທລະສັບ ເຊິ່ງອາດຮວມເຖິງຂà»à»‰àº¡àº¹àº™àºªà»ˆàº§àº™à»‚ຕນຳໄດ້."</string>
+ <string name="permlab_anyCodecForPlayback" msgid="715805555823881818">"ໃຊ້ຕົວຖອດລະຫັດໃດàºà»à»„ດ້ເພື່ອàºàº²àº™àº«àº¼àº´à»‰àº™"</string>
+ <string name="permdesc_anyCodecForPlayback" msgid="8283912488433189010">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯à»ƒàºŠà»‰àº—ຸàºàº•ົວຖອດລະຫັດສື່ທີ່ຕິດຕັ້ງໄວ້à»àº¥à»‰àº§ ເພື່ອàºàº²àº™àº–ອດລະຫັດàºàº²àº™àº«àº¼àº´à»‰àº™à»„ຟລ໌ຕ່າງໆ."</string>
+ <!-- no translation found for permlab_manageCaCertificates (1678391896786882014) -->
+ <skip />
+ <!-- no translation found for permdesc_manageCaCertificates (4015644047196937014) -->
+ <skip />
+ <string name="permlab_diagnostic" msgid="8076743953908000342">"ອ່ານ/ຂຽນ ໃສ່ຊັບພະàºàº²àºàº­àº™àº—ີ່ເປັນຂອງàºàº¸à»ˆàº¡àº§àº´à»„ຈ"</string>
+ <string name="permdesc_diagnostic" msgid="6608295692002452283">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàºžàº¥àº´à»€àº„ຊັນອ່ານ à»àº¥àº°àº‚ຽນ ໃສ່ທຸàºàºŠàº±àºšàºžàº°àºàº²àºàº­àº™àº—ີ່ເປັນຂອງàºàº¸à»ˆàº¡àº§àº´àº™àº´à»„ສ; ຕົວຢ່າງ: ໄຟລ໌ໃນ /dev. ສິ່ງນີ້ອາດສົ່ງຜົນàºàº°àº—ົບຕà»à»ˆàº„ວາມສະຖຽນ à»àº¥àº°àº„ວາມປອດໄພຂອງລະບົບ. ສິ່ງນີ້ຄວນໃຊ້ສຳຫຼັບàºàº²àº™àº§àº´à»€àº„າະບັນຫາຈຳເພາະ ຂອງບາງຮາດà»àº§à»‚ດàºàºœàº¹à»ˆàºœàº°àº¥àº´àº” ຫຼືຜູ່ປະຕິບັດàºàº²àº™à»€àº—ົ່ານັ້ນ."</string>
+ <string name="permlab_changeComponentState" msgid="6335576775711095931">"ເປີດ ຫຼືປິດນຳໃຊ້ອົງປະàºàº­àºšàº‚ອງà»àº­àº±àºšàº¯"</string>
+ <string name="permdesc_changeComponentState" product="tablet" msgid="8887435740982237294">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯ ປ່ຽນà»àº›àº‡àº­àº»àº‡àº›àº°àºàº­àºšàº‚ອງà»àº­àº±àºšàº¯àº­àº·à»ˆàº™ ວ່າຖືàºà»€àº›àºµàº”ນຳໃຊ້ ຫຼືບà»à»ˆ. à»àº­àº±àºšàº¯àº—ີ່ເປັນອັນຕະລາຠອາດໃຊ້ຄວາມສາມາດນີ້ ເພື່ອປິດàºàº²àº™àº™àº³à»ƒàºŠà»‰àº„ວາມສາມາດສຳຄັນຂອງà»àº—ັບເລັດ. àºàº²àº™àºàº³àº™àº»àº”ສິດນີ້ຄວນຖືàºà»ƒàºŠà»‰àº¢à»ˆàº²àº‡àº¥àº°àº¡àº±àº”ລະວັງ, ເພາະມັນເປັນໄປໄດ້ທີ່ຈະເຮັດໃຫ້ອົງປະàºàº­àºšàº‚ອງà»àº­àº±àºšàº¯àº¢àº¹à»ˆà»ƒàº™àºªàº°àº–ານະ ໃຊ້àºàº²àº™àºšà»à»ˆà»„ດ້, ບà»à»ˆà»àº™à»ˆàº™àº­àº™ ຫຼືບà»à»ˆàºªàº°àº–ຽນ."</string>
+ <string name="permdesc_changeComponentState" product="default" msgid="1827232484416505615">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯ ປ່ຽນà»àº›àº‡àº­àº»àº‡àº›àº°àºàº­àºšàº‚ອງà»àº­àº±àºšàº¯àº­àº·à»ˆàº™ ວ່າຖືàºà»€àº›àºµàº”ນຳໃຊ້ ຫຼືບà»à»ˆ. à»àº­àº±àºšàº¯àº—ີ່ເປັນອັນຕະລາຠອາດໃຊ້ຄວາມສາມາດນີ້ ເພື່ອປິດàºàº²àº™àº™àº³à»ƒàºŠà»‰àº„ວາມສາມາດສຳຄັນຂອງໂທລະສັບ. àºàº²àº™àºàº³àº™àº»àº”ສິດນີ້ຄວນຖືàºà»ƒàºŠà»‰àº¢à»ˆàº²àº‡àº¥àº°àº¡àº±àº”ລະວັງ, ເພາະມັນເປັນໄປໄດ້ທີ່ຈະເຮັດໃຫ້ອົງປະàºàº­àºšàº‚ອງà»àº­àº±àºšàº¯àº¢àº¹à»ˆà»ƒàº™àºªàº°àº–ານະ ໃຊ້àºàº²àº™àºšà»à»ˆà»„ດ້, ບà»à»ˆà»àº™à»ˆàº™àº­àº™ ຫຼືບà»à»ˆàºªàº°àº–ຽນ."</string>
+ <string name="permlab_grantRevokePermissions" msgid="4627315351093508795">"ອະນຸມັດ ຫຼືຖອດຖານàºàº²àº™àº­àº°àº™àº¸àºàº²àº”"</string>
+ <string name="permdesc_grantRevokePermissions" msgid="4088642654085850662">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàºžàº¥àº´à»€àº„ຊັນອະນຸມັດ ຫຼືຖອນàºàº²àº™àº­àº°àº™àº¸àº¡àº±àº”ສິດໃດນຶ່ງສຳລັບໂຕມັນເອງ ຫຼືà»àº­àº±àºšàºžàº¥àº´à»€àº„ຊັນອື່ນໆ. à»àº­àº±àºšàºžàº¥àº´à»€àº„ຊັນທີ່ເປັນອັນຕະລາຠອາດໃຊ້ຄວາມສາມາດນີ້ ເພື່ອເຂົ້າເຖິງຄຸນສົມບັດບາງຢ່າງທີ່ທ່ານບà»à»ˆà»„ດ້ອະນຸມັດໃຫ້ພວàºàº¡àº±àº™."</string>
+ <string name="permlab_setPreferredApplications" msgid="8463181628695396391">"ຕັ້ງຄ່າà»àº­àº±àºšàº¯àº—ີ່ຕ້ອງàºàº²àº™"</string>
+ <string name="permdesc_setPreferredApplications" msgid="4973986762241783712">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯ à»àºà»‰à»„ຂà»àº­àº±àºšàº¯àº—ີ່ທ່ານຕ້ອງàºàº²àº™à»ƒàºŠà»‰. à»àº­àº±àºšàº¯àº—ີ່ເປັນອັນຕະລາຠອາດປ່ຽນà»àº›àº‡à»àº­àº±àºšàº—ີ່ເຮັດວຽàºàº¢àº¹à»ˆà»‚ດàºàºšà»à»ˆà»àºˆà»‰àº‡à»ƒàº«à»‰àº®àº¹à»‰ ໂດàºàºàº²àº™àº›àº­àº¡à»àº›àº‡àº§à»ˆàº²à»€àº›àº±àº™à»àº­àº±àºšàº¯àº—ີ່ທ່ານຕ້ອງàºàº²àº™ ເພື່ອເàºàº±àºšàº‚à»à»‰àº¡àº¹àº™àºªà»ˆàº§àº™à»‚ຕ."</string>
+ <string name="permlab_writeSettings" msgid="2226195290955224730">"à»àºà»‰à»„ຂàºàº²àº™àº•ັ້ງຄ່າລະບົບ"</string>
+ <string name="permdesc_writeSettings" msgid="7775723441558907181">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯ à»àºà»‰à»„ຂຂà»à»‰àº¡àº¹àº™àºàº²àº™àº•ັ້ງຄ່າລະບົບ. à»àº­àº±àºšàº¯àº—ີ່ເປັນອັນຕະລາຠອາດເຮັດໃຫ້àºàº²àº™àº•ັ້ງຄ່າຂອງລະບົບເສàºàº«àº²àºà»„ດ້."</string>
+ <string name="permlab_writeSecureSettings" msgid="204676251876718288">"à»àºà»‰à»„ຂàºàº²àº™àº•ັ້ງຄ່າລະບົບ"</string>
+ <string name="permdesc_writeSecureSettings" msgid="8159535613020137391">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯ à»àºà»‰à»„ຂຂà»à»‰àº¡àº¹àº™àºàº²àº™àº•ັ້ງຄ່າຄວາມປອດໄພຂອງລະບົບ. à»àº­àº±àºšàº¯àº—ົ່ວໄປບà»à»ˆà»„ດ້ໃຊ້ຄຸນສົມບັດນີ້."</string>
+ <string name="permlab_writeGservices" msgid="2149426664226152185">"à»àºà»‰à»„ຂà»àºœàº™àº—ີ່ບà»àº¥àº´àºàº²àº™ Google"</string>
+ <string name="permdesc_writeGservices" msgid="1287309437638380229">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯ à»àºà»‰à»„ຂàºàº²àº™àº§àº²àº‡à»àºœàº™àºšà»àº¥àº´àºàº²àº™ Google. ບà»à»ˆà»„ດ້ໃຊ້ສຳລັບà»àº­àº±àºšàº¯àº—ົ່ວໄປ."</string>
+ <string name="permlab_receiveBootCompleted" msgid="5312965565987800025">"ເຮັດວຽàºà»ƒàº™àº•ອນລະບົບເລີ່ມ"</string>
+ <string name="permdesc_receiveBootCompleted" product="tablet" msgid="7390304664116880704">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯ ເປີດໂຕມັນເອງທັນທີທີ່ເປີດລະບົບຂຶ້ນມາສຳເລັດ. ນີ້ສາມາດເຮັດໃຫ້àºàº²àº™à»€àº¥àºµà»ˆàº¡à»€àº›àºµàº”ຂອງà»àº—ັບເລັດໃຊ້ເວລາດົນຂຶ້ນ à»àº¥àº°à»€àº®àº±àº”ໃຫ້àºàº²àº™à»€àº®àº±àº”ວຽàºà»‚ດàºàº®àº§àº¡àº‚ອງà»àº—ັບເລັດຊ້າລົງ ໂດàºàºàº²àº™à»€àº®àº±àº”ວຽàºàº•ະຫຼອດເວລາ."</string>
+ <string name="permdesc_receiveBootCompleted" product="default" msgid="513950589102617504">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯ ເປີດໂຕມັນເອງທັນທີທີ່ລະບົບສຳເລັດເປີດເຄື່ອງ. ນີ້ສາມາດເຮັດໃຫ້àºàº²àº™à»€àº¥àºµà»ˆàº¡à»€àº›àºµàº”ຂອງໂທລະສັບໃຊ້ເວລາດົນຂຶ້ນ à»àº¥àº°àº›à»ˆàº­àºà»ƒàº«à»‰à»àº­àº±àºšàº¯ ເຮັດໃຫ້ໂທລະສັບໂດàºàº®àº§àº¡àºŠà»‰àº²àº¥àº»àº‡ ດ້ວàºàºàº²àº™à»€àº®àº±àº”ວຽàºàº¢àº¹à»ˆàº•ະຫຼອດເວລາ."</string>
+ <string name="permlab_broadcastSticky" msgid="7919126372606881614">"ສົ່ງàºàº²àº™àºàº°àºˆàº²àºàºªàº±àº™àºàº²àº™à»àºšàºšàºàº¶àº”ຕິດ"</string>
+ <string name="permdesc_broadcastSticky" product="tablet" msgid="7749760494399915651">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàºžàº¥àº´à»€àº„ຊັນສົ່ງàºàº²àº™àºàº°àºˆàº²àºàºªàº±àº™àºàº²àº™à»àºšàºšàºàº¶àº”ຕິດ, ທີ່àºàº±àº‡àº„ົງເຫຼືອຫຼັງຈາàºàºàº²àº™àºàº°àºˆàº²àºàºªàº±àº™àºàº²àº™àºªàº´à»‰àº™àºªàº¸àº”ລົງ. àºàº²àº™àº™àº³à»ƒàºŠà»‰à»àºšàºšàº¡àº°àº«àº²àºªàº²àº™àº­àº²àº”ເຮັດໃຫ້à»àº—ັບເລັດຊ້າ ຫຼືບà»à»ˆàºªàº°àº–ຽນ ໂດàºàºàº²àº™à»ƒàºŠà»‰à»œà»ˆàº§àºàº„ວາມຈຳຫຼາàºà»€àºàºµàº™à»„ປ."</string>
+ <string name="permdesc_broadcastSticky" product="default" msgid="2825803764232445091">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàºžàº¥àº´à»€àº„ຊັນສົ່ງàºàº²àº™àºàº°àºˆàº²àºàºªàº±àº™àºàº²àº™à»àºšàºšàºàº¶àº”ຕິດ, ທີ່àºàº±àº‡àº„ົງເຫຼືອຫຼັງຈາàºàºàº²àº™àºàº°àºˆàº²àºàºªàº±àº™àºàº²àº™àºªàº´à»‰àº™àºªàº¸àº”ລົງ. àºàº²àº™àº™àº³à»ƒàºŠà»‰à»àºšàºšàº¡àº°àº«àº²àºªàº²àº™àº­àº²àº”ເຮັດໃຫ້ໂທລະສັບຊ້າ ຫຼືບà»à»ˆàºªàº°àº–ຽນ ໂດàºàºàº²àº™à»ƒàºŠà»‰à»œà»ˆàº§àºàº„ວາມຈຳຫຼາàºà»€àºàºµàº™à»„ປ."</string>
+ <string name="permlab_readContacts" msgid="8348481131899886131">"ອ່ານລາàºàºŠàº·à»ˆàºœàº¹à»ˆàº•ິດຕà»à»ˆàº‚ອງທ່ານ"</string>
+ <string name="permdesc_readContacts" product="tablet" msgid="5294866856941149639">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àº­à»ˆàº²àº™àº‚à»à»‰àº¡àº¹àº™àºà»ˆàº½àº§àºàº±àºšàº¥àº²àºàºŠàº·à»ˆàºœàº¹à»ˆàº•ິດຕà»à»ˆà»ƒàº™à»àº—ັບເລັດຂອງທ່ານ, ຮວມເຖິງຂà»à»‰àº¡àº¹àº™àºàº²àº™àºˆàº³àº™àº§àº™àºàº²àº™àº•ິດຕà»à»ˆàº•່າງໆເຊັ່ນ: àºàº²àº™à»‚ທ, ອີເມວ, ຫຼືຕິດຕà»à»ˆàº«àº²à»ƒàº™àº—າງອື່ນໆàºàº±àºšàºšàº¸àºàº„ົນໃດນຶ່ງໄດ້. àºàº²àº™àº­àº°àº™àº¸àºàº²àº”ນີ້ເຮັດໃຫ້à»àº­àº±àºšàº¯ ສາມາດບັນທຶàºàº‚à»à»‰àº¡àº¹àº™àºœàº¹à»ˆàº•ິດຕà»à»ˆàº‚ອງທ່ານ à»àº¥àº°à»àº­àº±àºšàº¯àº—ີ່ເປັນອັນຕະລາຠອາດສົ່ງຕà»à»ˆàº‚à»à»‰àº¡àº¹àº™à»€àº«àº¼àº»à»ˆàº²àº™àº±à»‰àº™à»‚ດàºàº—ີ່ທ່ານບà»à»ˆàº®àº¹à»‰à»‚ຕ."</string>
+ <string name="permdesc_readContacts" product="default" msgid="8440654152457300662">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯ ອ່ານຂà»à»‰àº¡àº¹àº™àºà»ˆàº½àº§àºàº±àºšàº¥àº²àºàºŠàº·à»ˆàºœàº¹à»ˆàº•ິດຕà»à»ˆàº—ີ່ເàºàº±àºšà»„ວ້ໃນໂທລະສັບຂອງທ່ານ ຮວມເຖິງຄວາມຖີ່àºàº²àº™à»‚ທ, àºàº²àº™àºªàº»à»ˆàº‡àºªàº»à»ˆàº‡àº­àºµà»€àº¡àº§ ຫຼືàºàº²àº™àºªàº·à»ˆàºªàº²àº™à»ƒàº™àº®àº¹àºšà»àºšàºšàº­àº·à»ˆàº™àºàº±àºšàºšàº¸àºàº„ົນໃດນຶ່ງ. àºàº²àº™àº­àº°àº™àº¸àºàº²àº”ເຮັດໃຫ້à»àº­àº±àºšàº¯ ສາມາດບັນທຶàºàº‚à»à»‰àº¡àº¹àº™àº¥àº²àºàºŠàº·à»ˆàºœàº¹à»ˆàº•ິດຕà»à»ˆàº‚ອງທ່ານ à»àº¥àº°à»àº­àº±àºšàº¯àº—ີ່ເປັນອັນຕະລາຠອາດເຜີàºà»àºœà»ˆàº‚à»à»‰àº¡àº¹àº™àº‚ອງທ່ານໂດàºàº—ີ່ທ່ານບà»à»ˆà»„ດ້ຮັບຮູ້."</string>
+ <string name="permlab_writeContacts" msgid="5107492086416793544">"à»àºà»‰à»„ຂລາàºàºŠàº·à»ˆàºœàº¹à»ˆàº•ິດຕà»à»ˆàº‚ອງທ່ານ"</string>
+ <string name="permdesc_writeContacts" product="tablet" msgid="897243932521953602">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯ à»àºà»‰à»„ຂຂà»à»‰àº¡àº¹àº™àºà»ˆàº½àº§àºàº±àºšàº¥àº²àºàºŠàº·à»ˆàºœàº¹à»ˆàº•ິດຕà»à»ˆàº‚ອງທ່ານທີ່ເàºàº±àºšà»„ວ້ໃນà»àº—ັບເລັດ ຮວມທັງຄວາມຖີ່ໃນàºàº²àº™à»‚ທ, àºàº²àº™àºªàº»à»ˆàº‡àº­àºµà»€àº¡àº§ ຫຼືàºàº²àº™àºªàº·à»ˆàºªàº²àº™à»ƒàº™àº®àº¹àºšà»àºšàºšàº­àº·à»ˆàº™àº‚ອງທ່ານàºàº±àºšàº¥àº²àºàºŠàº·à»ˆàºœàº¹à»ˆàº•ິດຕà»à»ˆà»ƒàº”ນຶ່ງ. àºàº²àº™àºàº³àº™àº»àº”ສິດນີ້ເຮັດໃຫ້à»àº­àº±àºšàº¯àºªàº²àº¡àº²àº”ລຶບຂà»à»‰àº¡àº¹àº™àº¥àº²àºàºŠàº·à»ˆàºœàº¹à»ˆàº•ິດຕà»à»ˆà»„ດ້."</string>
+ <string name="permdesc_writeContacts" product="default" msgid="589869224625163558">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯à»àºà»‰à»„ຂຂà»à»‰àº¡àº¹àº™àºà»ˆàº½àº§àºàº±àºšàº¥àº²àºàºŠàº·à»ˆàºœàº¹à»ˆàº•ິດຕà»à»ˆ ທີ່ບັນທຶàºà»ƒàº™à»‚ທລະສັບຂອງທ່ານ ຮວມທັງຄວາມຖີ່ຂອງàºàº²àº™à»‚ທ, àºàº²àº™àº­àºµà»€àº¡àº§ ຫຼືàºàº²àº™àº•ິດຕà»à»ˆà»ƒàº™àº®àº¹àºšà»àºšàºšàº­àº·à»ˆàº™àºàº±àºšàº¥àº²àºàºŠàº·à»ˆàºœàº¹à»ˆàº•ິດຕà»à»ˆà»ƒàº”ນຶ່ງນຳ. àºàº²àº™àº­àº°àº™àº¸àºàº²àº”ນີ້ຈະເຮັດໃຫ້à»àº­àº±àºšàº¯ ສາມາດລຶບຂà»à»‰àº¡àº¹àº™àº¥àº²àºàºŠàº·à»ˆàºœàº¹à»ˆàº•ິດຕà»à»ˆà»„ດ້."</string>
+ <string name="permlab_readCallLog" msgid="3478133184624102739">"ອ່ານບັນທຶàºàºàº²àº™à»‚ທ"</string>
+ <string name="permdesc_readCallLog" product="tablet" msgid="3700645184870760285">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯ ອ່ານບັນທຶàºàºàº²àº™à»‚ທຂອງà»àº—ັບເລັດທ່ານ ຮວມທັງຂà»à»‰àº¡àº¹àº™àºàº²àº™à»‚ທເຂົ້າ à»àº¥àº°àºàº²àº™à»‚ທອອàº. àºàº²àº™àºàº³àº™àº»àº”ສິດນີ້ເຮັດໃຫ້à»àº­àº±àºšàº¯àºªàº²àº¡àº²àº” ບັນທຶàºàº‚à»à»‰àº¡àº¹àº™àºàº²àº™à»‚ທຂອງທ່ານ à»àº¥àº°à»àº­àº±àºšàº¯àº—ີ່ເປັນອັນຕະລາຠອາດຈະເຜີàºà»àºœà»ˆàº‚à»à»‰àº¡àº¹àº™àºàº²àº™à»‚ທໂດàºàº—ີ່ທ່ານບà»à»ˆàº®àº±àºšàº®àº¹à»‰."</string>
+ <string name="permdesc_readCallLog" product="default" msgid="5777725796813217244">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àº­à»ˆàº²àº™àºšàº±àº™àº—ຶàºàºàº²àº™à»‚ທຂອງໂທລະສັບທ່ານ ຮວມທັງຂà»à»‰àº¡àº¹àº™àºà»ˆàº½àº§àºàº±àºšàºªàº²àºà»‚ທເຂົ້າ à»àº¥àº°à»‚ທອອàº. àºàº²àº™àº­àº°àº™àº¸àºàº²àº”ນີ້ຈະເຮັດໃຫ້à»àº­àº±àºšàº¯ ສາມາດບັນທຶàºàº‚à»à»‰àº¡àº¹àº™àºàº²àº™à»‚ທ à»àº¥àº°à»€àº®àº±àº”ໃຫ້à»àº­àº±àºšàº¯àº—ີ່ເປັນອັນຕະລາàºàºªàº²àº¡àº²àº” ສົ່ງຕà»à»ˆàº‚à»à»‰àº¡àº¹àº™àºšàº±àº™àº—ຶàºàºàº²àº™à»‚ທໂດàºàºšà»à»ˆà»ƒàº«à»‰àº—່ານຮູ້ໄດ້."</string>
+ <string name="permlab_writeCallLog" msgid="8552045664743499354">"ຂຽນຂà»à»‰àº¡àº¹àº™àºàº²àº™à»‚ທ"</string>
+ <string name="permdesc_writeCallLog" product="tablet" msgid="6661806062274119245">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯à»àºà»‰à»„ຂບັນທຶàºàºàº²àº™à»‚ທຂອງà»àº—ັບເລັດ ຮວມທັງຂà»à»‰àº¡àº¹àº™àºà»ˆàº½àº§àºàº±àºšàºàº²àº™à»‚ທອອຠà»àº¥àº°à»‚ທເຂົ້ານຳ. à»àº­àº±àºšàº¯àº—ີ່ເປັນອັນຕະລາàºàº­àº²àº”ໃຊ້ຄຸນສົມບັດນີ້ເພື່ອລຶບ ຫຼືà»àºà»‰à»„ຂບັນທຶàºàºàº²àº™à»‚ທຂອງທ່ານໄດ້."</string>
+ <string name="permdesc_writeCallLog" product="default" msgid="683941736352787842">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯ à»àºà»‰à»„ຂລາàºàºàº²àº™àºàº²àº™à»‚ທໃນໂທລະສັບຂອງທ່ານ, ຮວມທັງຂà»à»‰àº¡àº¹àº™àºà»ˆàº½àº§àºàº±àºšàºªàº²àºà»‚ທເຂົ້າ à»àº¥àº°àºàº²àº™à»‚ທອອàº. à»àº­àº±àºšàº¯àº—ີ່ເປັນອັນຕະລາຠອາດໃຊ້ຄວາມສາມາດນີ້ ເພື່ອລຶບ ຫຼືà»àºà»‰à»„ຂລາàºàºàº²àº™àºàº²àº™à»‚ທຂອງທ່ານໄດ້."</string>
+ <string name="permlab_readProfile" msgid="4701889852612716678">"ອ່ານບັດລາàºàºŠàº·à»ˆàºœàº¹à»ˆàº•ິດຕà»à»ˆàº‚ອງທ່ານເອງ"</string>
+ <string name="permdesc_readProfile" product="default" msgid="5462475151849888848">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯ ອ່ານຂà»à»‰àº¡àº¹àº™à»‚ປໄຟລ໌ສ່ວນໂຕໃນອຸປະàºàº­àº™àº‚ອງທ່ານເຊັ່ນ: ຊື່ຂອງທ່ານ à»àº¥àº°àº‚à»à»‰àº¡àº¹àº™àºàº²àº™àº•ິດຕà»à»ˆàº‚ອງທ່ານ. ນີ້à»àº²àºàº„ວາມວ່າà»àº­àº±àºšàº¯àºˆàº°àºªàº²àº¡àº²àº”ລະບຸໂຕຕົນຂອງທ່ານ à»àº¥àº°àºªàº»à»ˆàº‡àº‚à»à»‰àº¡àº¹àº™à»‚ປຣໄຟລ໌ຂອງທ່ານໃຫ້ຜູ່ອື່ນໄດ້."</string>
+ <string name="permlab_writeProfile" msgid="907793628777397643">"à»àºà»‰à»„ຂບັດລາàºàºŠàº·à»ˆàºœàº¹à»ˆàº•ິດຕà»à»ˆàº‚ອງທ່ານເອງ"</string>
+ <string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯ ປ່ຽນà»àº›àº‡ ຫຼືເພີ່ມຂà»à»‰àº¡àº¹àº™à»ƒàºªà»ˆà»‚ປຣໄຟລ໌ສ່ວນບຸàºàº„ົນທີ່ເàºàº±àºšà»„ວ້ໃນອຸປະàºàº­àº™àº‚ອງທ່ານ, ເຊັ່ນ: ຊື່ à»àº¥àº°àº‚à»à»‰àº¡àº¹àº™àº•ິດຕà»à»ˆàº—່ານ. ນີ້à»àº²àºàº„ວາມວ່າà»àº­àº±àºšàº¯àºªàº²àº¡àº²àº”ບົ່ງບອàºà»‚ຕທ່ານ à»àº¥àº°àº­àº²àº”ສົ່ງຂà»à»‰àº¡àº¹àº™à»‚ປຣໄຟລ໌ຂອງທ່ານໃຫ້ຜູ່ອື່ນໄດ້."</string>
+ <string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"ອ່ານàºàº²àº™àº­àº±àºšà»€àº”ດສັງຄົມອອນລາàºàº‚ອງທ່ານ"</string>
+ <string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯ ເຂົ້າເຖິງ à»àº¥àº°àºŠàº´à»‰àº‡àº‚à»à»‰àº¡àº¹àº™àº‚່າວສານສັງຄົມຈາàºàº—່ານ à»àº¥àº°à»àº¹à»ˆàº‚ອງທ່ານ. ຄວນລະມັດລະວັງໃນເວລາທີ່à»àº¥àºàº›à»ˆàº½àº™àº‚à»à»‰àº¡àº¹àº™ -- ນີ້ຈະເປັນàºàº²àº™àº­àº°àº™àº¸àºàº²àº”ໃຫ້à»àº­àº±àºšàº¯ ອ່ານàºàº²àº™àºªàº·à»ˆàºªàº²àº™àº¥àº°àº«àº§à»ˆàº²àº‡àº—່ານ àºàº±àºšà»àº¹à»ˆàº‚ອງທ່ານເທິງເຄືອຂ່າàºàºªàº±àº‡àº„ົມ ໂດàºàºšà»à»ˆàº„ຳນຶງເຖິງຄວາມລັບ. à»àº²àºà»€àº«àº”: àºàº²àº™àºàº³àº™àº»àº”ສິດນີ້ອາດບà»à»ˆà»„ດ້ບັງຄັບໃຊ້ໃນທຸàºà»€àº„ືອຂ່າàºàºªàº±àº‡àº„ົມ."</string>
+ <string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"ຂຽນໃສ່ເຄືອຂ່າàºàºªàº±àº‡àº„ົມຂອງທ່ານ"</string>
+ <string name="permdesc_writeSocialStream" product="default" msgid="3086557552204114849">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àºªàº°à»àº”ງàºàº²àº™àº­àº±àºšà»€àº”ດຈາàºà»àº¹à»ˆàº‚ອງທ່ານ. ຄວນລະວັງໃນàºàº²àº™à»àº›à»ˆàº‡àº›àº±àº™àº‚à»à»‰àº¡àº¹àº™. ມັນຈະໄປອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯ ສ້າງຂà»à»‰àº„ວາມທີ່ອ້າງວ່າມາຈາàºà»àº¹à»ˆàº‚ອງທ່ານ. à»àº²àºà»€àº«àº”: àºàº²àº™àº­àº°àº™àº¸àºàº²àº”ອາດບà»à»ˆàº–ືàºàºšàº±àº‡àº„ັບ ໃນບà»àº¥àº´àºàº²àº™à»€àº„ືອຂ່າàºàºªàº±àº‡àº„ອມອອນລາàºàº—ຸàºàº­àº±àº™."</string>
+ <string name="permlab_readCalendar" msgid="5972727560257612398">"ອ່ານàºàº³àº™àº»àº”àºàº²àº™à»ƒàº™àº›àº°àº•ິທິນຮວມທັງຂà»à»‰àº¡àº¹àº™àº„ວາມລັບ"</string>
+ <string name="permdesc_readCalendar" product="tablet" msgid="4216462049057658723">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯ ອ່ານàºàº²àº™àº™àº±àº”à»àº²àºàº—ັງà»àº»àº”ທີ່ມີບັນທຶàºà»ƒàº™à»àº—ັບເລັດຂອງທ່ານ, ຮວມທັງຂອງà»àº¹à»ˆ ຫຼືà»àº¹à»ˆàº—ີ່ເຮັດວຽàºàº™àº³àºàº±àº™à»„ດ້ ເຊິ່ງອາດເຮັດໃຫ້à»àº­àº±àºšàº¯àºªàº²àº¡àº²àº”ສົ່ງຕà»à»ˆ ຫຼືບັນທຶàºàº‚à»à»‰àº¡àº¹àº™àº›àº°àº•ິທິນຂອງທ່ານ ບà»à»ˆàº§à»ˆàº²àºˆàº°à»€àº›àº±àº™à»€àº¥àº·à»ˆàº­àº‡àº„ວາມລັບ ຫຼືເລື່ອງລະອຽດອ່ອນà»àºšàºšà»ƒàº”àºà»àº•າມ."</string>
+ <string name="permdesc_readCalendar" product="default" msgid="7434548682470851583">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯ ອ່ານàºàº³àº™àº»àº”àºàº²àº™à»ƒàº™àº›àº°àº•ິທິນທັງà»àº»àº” ທີ່ເàºàº±àºšà»„ວ້ໃນໂທລະສັບຂອງທ່ານ, ຮວມເຖິງຂອງà»àº¹à»ˆàº„ູ່ ຫຼືເພື່ອນຮ່ວມວຽàº. ນີ້ອາດຈະເຮັດໃຫ້à»àº­àº±àºšàº¯àºªàº²àº¡àº²àº”ເຜີàºà»àºœà»ˆ ຫຼືບັນທຶàºàº‚à»à»‰àº¡àº¹àº™àº›àº°àº•ິທິນຂອງທ່ານ, ໂດàºàºšà»à»ˆàº„ຳນຶງເຖິງ ຄວາມລະອຽດອ່ອນ ຫຼືຄວາມລັບໃດໆໄດ້."</string>
+ <string name="permlab_writeCalendar" msgid="8438874755193825647">"ເພີ່ມ ຫຼືà»àºà»‰à»„ຂນັດà»àº²àºà»ƒàº™àº›àº°àº•ິທິນ à»àº¥àº°àºªàº»à»ˆàº‡àº­àºµà»€àº¡àº§àº«àº²àºœàº¹à»ˆà»€àº‚ົ້າຮ່ວມໂດàºàºšà»à»ˆàº•້ອງໃຫ້ເຈົ້າຂອງຮັບຮູ້"</string>
+ <string name="permdesc_writeCalendar" product="tablet" msgid="6679035520113668528">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯à»€àºžàºµà»ˆàº¡, ລຶບ à»àº¥àº°àº›à»ˆàº½àº™àºàº´àº”ຈະàºàº³àº—ີ່ທ່ານສາມາດà»àºà»‰à»„ຂ ໃນà»àº—ັບເລັດຂອງທ່ານໄດ້ ຮວມທັງàºàº´àº”ຈະàºàº³àº‚ອງà»àº¹à»ˆ ຫຼືà»àº¹à»ˆàº®à»ˆàº§àº¡à»€àº®àº±àº”ວຽຠເຊິ່ງອາດອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àºªàº»à»ˆàº‡àº‚à»à»‰àº„ວາມທີ່ຄືàºàº±àºšàº§à»ˆàº² ມາຈາàºà»€àºˆàº»à»‰àº²àº‚ອງປະຕິທິນ ຫຼືà»àºà»‰à»„ຂàºàº²àº™àº™àº±àº”à»àº²àºà»„ດ້ ໂດàºàºšà»à»ˆà»ƒàº«à»‰à»€àºˆàº»à»‰àº²àº‚ອງຮັບຮູ້."</string>
+ <string name="permdesc_writeCalendar" product="default" msgid="2324469496327249376">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯ ເພີ່ມ, ລຶບ, ປ່ຽນà»àº›àº‡àº™àº±àº”à»àº²àºàº—ີ່ທ່ານສາມາດà»àºà»‰à»„ຂໄດ້ໃນໂທລະສັບຂອງທ່ານ, ຮວມທັງຂອງà»àº¹à»ˆàº„ູ່ ຫຼືເພື່ອນຮ່ວມວຽàº. ນີ້ອາດເຮັດໃຫ້à»àº­àº±àºšàº¯àºªàº²àº¡àº²àº”ສົ່ງຂà»à»‰àº„ວາມ ທີ່ເບິ່ງຄືວ່າມາຈາàºà»€àºˆàº»à»‰àº²àº‚ອງປະຕິທິນ ຫຼືà»àºà»‰à»„ຂນັດà»àº²àºà»‚ດàºàº—ີ່ທ່ານບà»à»ˆà»„ດ້ຮັບຮູ້ໄດ້."</string>
+ <string name="permlab_accessMockLocation" msgid="8688334974036823330">"ຈຳລອງà»àº«àº¥à»ˆàº‡àº‚à»à»‰àº¡àº¹àº™àºªàº°àº–ານທີ່ເພື່ອàºàº²àº™àº—ົດສອບ"</string>
+ <string name="permdesc_accessMockLocation" msgid="5808711039482051824">"ສ້າງà»àº«àº¥à»ˆàº‡àº‚à»à»‰àº¡àº¹àº™àºˆàº³àº¥àº­àº‡àº‚ອງສະຖານທີ່ ເພື່ອàºàº²àº™àº—ົດສອບ ຫຼືຕິດຕັ້ງà»àº«àº¥à»ˆàº‡àº‚à»à»‰àº¡àº¹àº™àºªàº°àº–ານທີ່ໃà»à»ˆ. ນີ້ຈະອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àºªàº²àº¡àº²àº”ຂຽນທັບຂà»à»‰àº¡àº¹àº™àº‚ອງສະຖານທີ່ à»àº¥àº°/ຫຼື ຂà»à»‰àº¡àº¹àº™àº—ີ່ສົ່ງàºàº±àºšàº¡àº²àºˆàº²àºà»àº«àº¥à»ˆàº‡àº‚à»à»‰àº¡àº¹àº™àºªàº°àº–ານທີ່ອື່ນ ເຊັ່ນ: GPS ຫຼືà»àº«àº¥à»ˆàº‡àº‚à»à»‰àº¡àº¹àº™àºªàº°àº–ານທີ່ອື່ນໄດ້."</string>
+ <string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"ເຂົ້າເຖິງຄຳສັ່ງຜູ່ໃຫ້ບà»àº¥àº´àºàº²àº™àºžàº´àºàº±àº”ສະຖານທີ່"</string>
+ <string name="permdesc_accessLocationExtraCommands" msgid="5945166642335800763">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯ ເຂົ້າເຖິງຄຳສັ່ງເພີ່ມເຕີມຂອງຜູ່ໃຫ້ບà»àº¥àº´àºàº²àº™àºªàº°àº–ານທີ່. ນີ້ອາດຈະເປັນàºàº²àº™à»€àº®àº±àº”ໃຫ້à»àº­àº±àºšàº¯ ລົບàºàº§àº™àºàº²àº™à»€àº®àº±àº”ວຽàºàº‚ອງ GPS ຫຼືà»àº«àº¥à»ˆàº‡àº‚à»à»‰àº¡àº¹àº™àºªàº°àº–ານທີ່ອື່ນໆໄດ້."</string>
+ <string name="permlab_installLocationProvider" msgid="6578101199825193873">"ສິດໃນàºàº²àº™àº•ິດຕັ້ງà»àº«àº¼à»ˆàº‡àºªàº°à»œàº­àº‡àºªàº°àº–ານທີ່"</string>
+ <string name="permdesc_installLocationProvider" msgid="9066146120470591509">"ສ້າງສະຖານທີ່ຈຳລອງເພື່ອàºàº²àº™àº—ົດລອງ ຫຼືຕິດຕັ້ງà»àº«àº¼à»ˆàº‡àº‚à»à»‰àº¡àº¹àº™àºªàº°àº–ານທີ່ໃà»à»ˆ. ສິ່ງນີ້ເຮັດໃຫ້à»àº­àº±àºšàº¯àºªàº²àº¡àº²àº”ຂຽນທັບສະຖານທີ່ à»àº¥àº°/ຫຼື ສະຖານະທີ່ໄດ້ຈາàºà»àº«àº¼à»ˆàº‡àºªàº°àº–ານທີ່ອື່ນເຊັ່ນ: GPS ຫຼືຜູ່ສະໜອງສະຖານທີ່ຕ່າງໆ."</string>
+ <string name="permlab_accessFineLocation" msgid="1191898061965273372">"ສະຖານທີ່à»àº™à»ˆàº™àº­àº™ (ອ້າງອີງຈາຠGPS à»àº¥àº°à»€àº„ືອຂ່າàº)"</string>
+ <string name="permdesc_accessFineLocation" msgid="5295047563564981250">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯ ຮັບຕຳà»à»œà»ˆàº‡àºªàº°àº–ານທີ່ລະອຽດຂອງທ່ານໂດàºà»ƒàºŠà»‰ GPS ຫຼືà»àº«àº¥à»ˆàº‡àº‚à»à»‰àº¡àº¹àº™à»€àº„ືອຂ່າàºàºªàº°àº–ານທີ່ເຊັ່ນ: ເສົາສັນàºàº²àº™àº¡àº·àº–ື à»àº¥àº° Wi-Fi. ບà»àº¥àº´àºàº²àº™àºªàº°àº–ານທີ່ເຫຼົ່ານີ້ຕ້ອງຖືàºà»€àº›àºµàº”ນຳໃຊ້ à»àº¥àº°à»àº¥àº°àº¡àºµàº‚à»à»‰àº¡àº¹àº™à»ƒàº«à»‰àºàº±àºšàº­àº¸àº›àº°àºàº­àº™àº‚ອງທ່ານ ເພື່ອໃຫ້à»àº­àº±àºšàº¯à»ƒàºŠà»‰à»„ດ້. à»àº­àº±àºšàº¯àº•່າງໆອາດໃຊ້ຂà»à»‰àº¡àº¹àº™àº™àºµà»‰à»€àºžàº·à»ˆàº­àº¥àº°àºšàº¸àºªàº°àº–ານທີ່ຢູ່ຂອງທ່ານ à»àº¥àº°àº­àº²àº”ນຳໃຊ້à»àºšàº±àº”ເຕີຣີເພີ່ມເຕີມໄດ້."</string>
+ <string name="permlab_accessCoarseLocation" msgid="4887895362354239628">"ສະຖານທີ່ໂດàºàº›àº°àº¡àº²àº™ (ອ້າງອີງຈາàºà»€àº„ືອຂ່າàº)"</string>
+ <string name="permdesc_accessCoarseLocation" msgid="2538200184373302295">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯ ລະບຸສະຖານທີ່ໂດàºàº›àº°àº¡àº²àº™àº‚ອງທ່ານ. ສະຖານທີ່ນີ້ໄດ້ຮັບມາຈາàºàºšà»àº¥àº´àºàº²àº™àºªàº°àº–ານທີ່ ໂດàºàº­àº²à»ƒàºªàºªàº°àº–ານທີ່ເຄືອຂ່າàºà»€àºŠàº±à»ˆàº™: ເສົາສັນàºàº²àº™ à»àº¥àº° Wi-Fi. ບà»àº¥àº´àºàº²àº™àºªàº°àº–ານທີ່ເຫຼົ່ານີ້ຕ້ອງຖືàºà»€àº›àºµàº”ໃຊ້ à»àº¥àº° ມີໃນອຸປະàºàº­àº™àº‚ອງທ່ານເພື່ອທີ່à»àº­àº±àºšàº¯àºˆàº°àºªàº²àº¡àº²àº”ໃຊ້ພວàºàº¡àº±àº™à»„ດ້. à»àº­àº±àºšàº¯àº­àº²àº”ຈະໃຊ້ຄຸນສົມບັດນີ້ ເພື່ອàºàº§àº”ສອບສະຖານທີ່ໂດàºàº›àº°àº¡àº²àº™àº‚ອງທ່ານ."</string>
+ <string name="permlab_accessSurfaceFlinger" msgid="2363969641792388947">"ເຂົ້າເຖິງ SurfaceFlinger"</string>
+ <string name="permdesc_accessSurfaceFlinger" msgid="1041619516733293551">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àº™àº³à»ƒàºŠà»‰àº„ວາມສາມາດລະດັບຕ່ຳ SurfaceFlinger"</string>
+ <string name="permlab_readFrameBuffer" msgid="6690504248178498136">"ອ່ານເຟຣມບັບເຟີ"</string>
+ <string name="permdesc_readFrameBuffer" msgid="4937405521809454680">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àº­à»ˆàº²àº™à»€àº™àº·à»‰àº­àº«àº²àº‚ອງເຟຣມບັບເຟີ."</string>
+ <string name="permlab_accessInputFlinger" msgid="5348635270689553857">"ເຂົ້າເຖິງ InputFlinger"</string>
+ <string name="permdesc_accessInputFlinger" msgid="2104864941201226616">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àº™àº³à»ƒàºŠà»‰àº„ວາມສາມາດ InputFlinger ລະດັບຕ່ຳ"</string>
+ <string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"ປັບຄ່າàºàº²àº™àºªàº°à»àº”ງຜົນ WiFi"</string>
+ <string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àº•ັ້ງຄ່າ à»àº¥àº°à»€àºŠàº·à»ˆàº­àº¡àº•à»à»ˆàºˆà»àºªàº°à»àº”ງຜົນ WiFi."</string>
+ <string name="permlab_controlWifiDisplay" msgid="393641276723695496">"ຄວບຄຸມàºàº²àº™àºªàº°à»àº”ງ WiFi"</string>
+ <string name="permdesc_controlWifiDisplay" msgid="4543912292681826986">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯ ຄວບຄຸມຄວາມສາມາດລະດັບຕà»à»ˆàº²àº‚ອງàºàº²àº™àºªàº°à»àº”ງຜົນ Wifi."</string>
+ <string name="permlab_captureAudioOutput" msgid="6857134498402346708">"ບັນທຶàºàºªàº½àº‡àº­àº­àº"</string>
+ <string name="permdesc_captureAudioOutput" msgid="6210597754212208853">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àºšàº±àº™àº—ຶຠà»àº¥àº°àº›à»ˆàº½àº™à»€àºªàº±à»‰àº™àº—າງàºàº²àº™àº›à»‰àº­àº™àº‚à»à»‰àº¡àº¹àº™àº­àº­àºàº‚ອງສຽງ."</string>
+ <string name="permlab_captureVideoOutput" msgid="2246828773589094023">"ບັນທຶàºàº§àº´àº”ີໂອອອàº"</string>
+ <string name="permdesc_captureVideoOutput" msgid="359481658034149860">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àºšàº±àº™àº—ຶຠà»àº¥àº°àº›à»ˆàº½àº™à»€àºªàº±à»‰àº™àº—າງàºàº²àº™àº›à»‰àº­àº™àº‚à»à»‰àº¡àº¹àº™àº­àº­àºàº‚ອງວິດີໂອ."</string>
+ <string name="permlab_captureSecureVideoOutput" msgid="7815398969303382016">"ບັນທຶàºàº§àº´àº”ີໂອອອàºàº¢à»ˆàº²àº‡àº›àº­àº”ໄພ"</string>
+ <string name="permdesc_captureSecureVideoOutput" msgid="2779793064709350289">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àºšàº±àº™àº—ຶຠà»àº¥àº°àº›à»ˆàº½àº™à»€àºªàº±à»‰àº™àº—າງàºàº²àº™àº›à»‰àº­àº™àº‚à»à»‰àº¡àº¹àº™àº­àº­àºàº‚ອງວິດີໂອທີ່ປອດໄພ."</string>
+ <string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"ປ່ຽນàºàº²àº™àº•ັ້ງຄ່າສຽງຂອງທ່ານ"</string>
+ <string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯à»àºà»‰à»„ຂàºàº²àº™àº•ັ້ງຄ່າສຽງສ່ວນàºàº²àº‡ ເຊັ່ນ: ລະດັບສຽງ à»àº¥àº°àº¥àº³à»‚ພງໃດທີ່ຖືàºà»ƒàºŠà»‰àºªàº»à»ˆàº‡àºªàº½àº‡àº­àº­àº."</string>
+ <string name="permlab_recordAudio" msgid="3876049771427466323">"ບັນທຶàºàºªàº½àº‡"</string>
+ <string name="permdesc_recordAudio" msgid="4906839301087980680">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àºšàº±àº™àº—ຶàºàºªàº½àº‡àº”້ວàºà»„ມໂຄຣໂຟນໄດ້. àºàº²àº™àº­àº°àº™àº¸àºàº²àº”ນີ້ຈະເຮັດໃຫ້à»àº­àº±àºšàº¯ ສາມາດບັນທຶàºàºªàº½àº‡à»„ດ້ຕະຫລອດເວລາ ໂດàºàºšà»à»ˆàº•້ອງຖ້າàºàº²àº™àº¢àº·àº™àº¢àº±àº™àºˆàº²àºàº—່ານ."</string>
+ <string name="permlab_camera" msgid="3616391919559751192">"ຖ່າàºàº®àº¹àºš à»àº¥àº°àº§àº´àº”ີໂອ"</string>
+ <string name="permdesc_camera" msgid="8497216524735535009">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àº–່າàºàº®àº¹àºš à»àº¥àº°àº§àº´àº”ີໂອດ້ວàºàºà»‰àº­àº‡àº–່າàºàº®àº¹àºš. àºàº²àº™àº­àº°àº™àº¸àºàº²àº”ນີ້ຈະອານຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯ ສາມາດໃຊ້àºà»‰àº­àº‡àº–່າàºàº®àº¹àºšà»„ດ້ຕະຫລອດເວລາ ໂດàºàºšà»à»ˆàº•້ອງຖ້າàºàº²àº™àº¢àº·àº™àº¢àº±àº™àºˆàº²àºàº—່ານ."</string>
+ <string name="permlab_cameraDisableTransmitLed" msgid="2651072630501126222">"ປິດໄຟສັນàºàº²àº™ LED ເມື່ອນຳໃຊ້àºà»‰àº­àº‡"</string>
+ <string name="permdesc_cameraDisableTransmitLed" msgid="4764585465480295341">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàºžàº¥àº´à»€àº„ຊັນທີ່ມາàºàº±àºšà»‚ຕເຄື່ອງ ປິດàºàº²àº™àº™àº³à»ƒàºŠà»‰à»„ຟ LED ໃນàºà»‰àº­àº‡àº–່າàºàº®àº¹àºš."</string>
+ <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"ປິດàºàº²àº™àº™àº³à»ƒàºŠà»‰à»àº—ັບເລັດຖາວອນ"</string>
+ <string name="permlab_brick" product="default" msgid="8337817093326370537">"ປິດàºàº²àº™à»€àº®àº±àº”ວຽàºàº‚ອງໂທລະສັບຖາວອນ"</string>
+ <string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àº›àº´àº”àºàº²àº™àº™àº³à»ƒàºŠà»‰à»àº—ັບເລັດທັງà»àº»àº”ໂດàºàº–າວອນ. ຄຸນສົມບັດນີ້ເປັນສິ່ງອັນຕະລາàºàº«àº¼àº²àº."</string>
+ <string name="permdesc_brick" product="default" msgid="5788903297627283099">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àº›àº´àº”àºàº²àº™àº™àº³à»ƒàºŠà»‰à»‚ທລະສັບທັງà»àº»àº”à»àºšàºšàº–າວອນ. ອັນຕະລາàºàº«àº¼àº²àº."</string>
+ <string name="permlab_reboot" product="tablet" msgid="3436634972561795002">"ບັງຄັບໃຫ້à»àº—ັບເລັດປິດà»àº¥à»‰àº§à»€àº›àºµàº”ໃà»à»ˆ"</string>
+ <string name="permlab_reboot" product="default" msgid="2898560872462638242">"ບັງຄັບໃຫ້ໂທລະສັບປິດà»àº¥à»‰àº§à»€àº›àºµàº”ໃà»à»ˆ"</string>
+ <string name="permdesc_reboot" product="tablet" msgid="8172056180063700741">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯ ບັງຄັບà»àº—ັບເລັດໃຫ້ປິດເປີດໃà»à»ˆ."</string>
+ <string name="permdesc_reboot" product="default" msgid="5326008124289989969">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯ ບັງຄັບໃຫ້ໂທລະສັບປິດເປີດໃà»à»ˆ."</string>
+ <string name="permlab_mount_unmount_filesystems" product="nosdcard" msgid="2927361537942591841">"ເຂົ້າເຖິງໄຟລ໌ລະບົບຂອງບ່ອນຈັດເàºàº±àºšàº‚à»à»‰àº¡àº¹àº™ USB"</string>
+ <string name="permlab_mount_unmount_filesystems" product="default" msgid="4402305049890953810">"ເຂົ້າເຖິງໄຟລ໌ລະບົບຂອງ SD card"</string>
+ <string name="permdesc_mount_unmount_filesystems" msgid="1829290701658992347">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯ ເຊື່ອມຕà»à»ˆ à»àº¥àº°àº–ອນàºàº²àº™à»€àºŠàº·à»ˆàº­àº¡àº•à»à»ˆàºˆàº²àºàº¥àº°àºšàº»àºšà»„ຟລ໌ ຂອງອຸປະàºàº­àº™à»€àºàº±àºšàº‚à»à»‰àº¡àº¹àº™à»àºšàºšàº–ອດອອàºà»„ດ້."</string>
+ <string name="permlab_mount_format_filesystems" product="nosdcard" msgid="6227819582624904972">"ລຶບບ່ອນຈັດເàºàº±àºšàº‚à»à»‰àº¡àº¹àº™ USB"</string>
+ <string name="permlab_mount_format_filesystems" product="default" msgid="262582698639274056">"ລຶບ SD card"</string>
+ <string name="permdesc_mount_format_filesystems" msgid="8784268246779198627">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯ ຟà»à»àº¡àº±àº”ອຸປະàºàº­àº™à»€àºàº±àºšàº‚à»à»‰àº¡àº¹àº™àº—ີ່ສາມາດຖອດອອàºà»„ດ້."</string>
+ <string name="permlab_asec_access" msgid="3411338632002193846">"ດຶງຂà»à»‰àº¡àº¹àº™àºˆàº²àºàºšà»ˆàº­àº™àºˆàº±àº”ເàºàº±àºšàº‚à»à»‰àº¡àº¹àº™àºžàº²àºà»ƒàº™"</string>
+ <string name="permdesc_asec_access" msgid="3094563844593878548">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àº”ຶງຂà»à»‰àº¡àº¹àº™à»ƒàº™àºšà»ˆàº­àº™àºˆàº±àº”ເàºàº±àºšàº‚à»à»‰àº¡àº¹àº™àºžàº²àºà»ƒàº™à»„ດ້."</string>
+ <string name="permlab_asec_create" msgid="6414757234789336327">"ສ້າງບ່ອນຈັດເàºàº±àºšàº‚à»à»‰àº¡àº¹àº™àºžàº²àºà»ƒàº™"</string>
+ <string name="permdesc_asec_create" msgid="4558869273585856876">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àºªà»‰àº²àº‡àºžàº·à»‰àº™àº—ີ່ຈັດເàºàº±àºšàº‚à»à»‰àº¡àº¹àº™àºžàº²àºà»ƒàº™."</string>
+ <string name="permlab_asec_destroy" msgid="526928328301618022">"ທຳລາàºàºšà»ˆàº­àº™àºˆàº±àº”ເàºàº±àºšàº‚à»à»‰àº¡àº¹àº™àºžàº²àºà»ƒàº™"</string>
+ <string name="permdesc_asec_destroy" msgid="7218749286145526537">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àº—ຳລາàºàºšà»ˆàº­àº™àºˆàº±àº”ເàºàº±àºšàº‚à»à»‰àº¡àº¹àº™àºžàº²àºà»ƒàº™."</string>
+ <string name="permlab_asec_mount_unmount" msgid="8877998101944999386">"ເຊື່ອມຕà»à»ˆ/ຖອນàºàº²àº™à»€àºŠàº·à»ˆàº­àº¡àº•à»à»ˆ ບ່ອນຈັດເàºàº±àºšàº‚à»à»‰àº¡àº¹àº™àºžàº²àºà»ƒàº™"</string>
+ <string name="permdesc_asec_mount_unmount" msgid="3451360114902490929">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯ ເຊື່ອມຕà»à»ˆ/ຖອດàºàº²àº™à»€àºŠàº·à»ˆàº­àº¡àº•à»à»ˆ ບ່ອນຈັດເàºàº±àºšàº‚à»à»‰àº¡àº¹àº™àºžàº²àºà»ƒàº™."</string>
+ <string name="permlab_asec_rename" msgid="7496633954080472417">"ປ່ຽນຊື່ບ່ອນເàºàº±àºšàº‚à»à»‰àº¡àº¹àº™àºžàº²àºà»ƒàº™"</string>
+ <string name="permdesc_asec_rename" msgid="1794757588472127675">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàºžàº¥àº´à»€àº„ຊັນປ່ຽນຊື່ພື້ນທີ່ເàºàº±àºšàº‚à»à»‰àº¡àº¹àº™àºžàº²àºà»ƒàº™."</string>
+ <string name="permlab_vibrate" msgid="7696427026057705834">"ຄວບຄຸມàºàº²àº™àºªàº±à»ˆàº™"</string>
+ <string name="permdesc_vibrate" msgid="6284989245902300945">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àº„ວບຄຸມໂຕສັ່ນ."</string>
+ <string name="permlab_flashlight" msgid="2155920810121984215">"ຄວບຄຸມໄຟà»àºŸàº¥àº”"</string>
+ <string name="permdesc_flashlight" msgid="6522284794568368310">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯ ຄວບຄຸມໄຟà»àºŸàº¥àº”."</string>
+ <string name="permlab_manageUsb" msgid="1113453430645402723">"ຈັດàºàº²àº™àºàº²àº™àºàº³àº™àº»àº”ຄ່າ à»àº¥àº°àºàº²àº™àº­àº°àº™àº¸àºàº²àº”ສຳລັບອຸປະàºàº­àº™ USB"</string>
+ <string name="permdesc_manageUsb" msgid="7776155430218239833">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯ ຈັດàºàº²àº™àºàº²àº™àº•ັ້ງຄ່າຄວາມຕ້ອງàºàº²àº™ à»àº¥àº°àºàº²àº™àºàº³àº™àº»àº”ສິດສຳລັບອຸປະàºàº­àº™ USB."</string>
+ <string name="permlab_accessMtp" msgid="4953468676795917042">"ໃຊ້ໂປຣໂຕຄອນ MTP"</string>
+ <string name="permdesc_accessMtp" msgid="6532961200486791570">"ອະນຸàºàº²àº”àºàº²àº™à»€àº‚ົ້າເຖິງ kernel MPT driver ເພື່ອໃຊ້ໂປຣໂຕຄອນ MTP USB."</string>
+ <string name="permlab_hardware_test" msgid="4148290860400659146">"ທົດສອບຮາດà»àº§"</string>
+ <string name="permdesc_hardware_test" msgid="6597964191208016605">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àº„ວບຄຸມອຸປະàºàº­àº™àº•à»à»ˆàºžà»ˆàº§àº‡àº—ັງຫຼາຠເພື່ອຈຸດປະສົງàºàº²àº™àº—ົດສອບຮາດà»àº§."</string>
+ <string name="permlab_callPhone" msgid="3925836347681847954">"ໂທຫາເບີໂທລະສັບໂດàºàºàº»àº‡"</string>
+ <string name="permdesc_callPhone" msgid="3740797576113760827">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯à»‚ທຫາເບີໂທລະສັບໄດ້ ໂດàºàºšà»à»ˆàº•້ອງຖ້າàºàº²àº™àº”ຳເນີນàºàº²àº™à»ƒàº”ໆຈາàºàº—່ານ. ຄຸນສົມບັດນີ້ອາດàºà»à»ˆà»ƒàº«à»‰à»€àºàºµàº”ຄ່າໃຊ້ຈ່າàºà»ƒàº™àºàº²àº™à»‚ທທີ່ບà»à»ˆàº„າດຄິດໄດ້. à»àº²àºà»€àº«àº”: ຄຸນສົມບັດນີ້ບà»à»ˆà»„ດ້ເປັນàºàº²àº™àº­àº°àº™àº¸àºàº²àº”ໃຫ້à»àº­àº±àºšàº¯ ສາມາດໂທຫາເບີສຸàºà»€àºªàºµàº™. à»àº­àº±àºšàº¯àº—ີ່ເປັນອັນຕະລາàºàº­àº²àº”ເຮັດໃຫ້ທ່ານ ຕ້ອງເສàºàº„່າໂທໂດàºàº—ີ່ບà»à»ˆà»„ດ້ຄາດຄິດ."</string>
+ <string name="permlab_callPrivileged" msgid="4198349211108497879">"ໂທໂດàºàºàº»àº‡à»„ປຫາເບີໂທໃດàºà»à»„ດ້"</string>
+ <string name="permdesc_callPrivileged" msgid="1689024901509996810">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯à»‚ທອອàºàº«àº²à»€àºšàºµà»‚ທລະສັບໃດàºà»à»„ດ້, ຮວມທັງເບີສຸàºà»€àºªàºµàº™, ໂດàºàºšà»à»ˆàº¡àºµàºàº²àº™à»àºŠàºà»àºŠàº‡àº‚ອງທ່ານ. à»àº­àº±àºšàº¯àº—ີ່ເປັນອັນຕະລາàºàº­àº²àº”ໂທອອàºà»‚ດàºàºšà»à»ˆàºˆàº³à»€àº›àº±àº™ à»àº¥àº°à»‚ທຫາບà»àº¥àº´àºàº²àº™à»€àºšàºµàºªàº¸àºà»€àºªàºµàº™à»àºšàºšàºœàº´àº”àºàº»àº”à»àº²àº."</string>
+ <string name="permlab_performCdmaProvisioning" product="tablet" msgid="4842576994144604821">"ເລີ່ມàºàº²àº™àº•ັ້ງຄ່າà»àº—ັບເລັດ CDMA ໂດàºàºàº»àº‡"</string>
+ <string name="permlab_performCdmaProvisioning" product="default" msgid="5604848095315421425">"ເລີ່ມàºàº²àº™àº•ັ້ງຄ່າໂທລະສັບ CDMA ໂດàºàºàº»àº‡"</string>
+ <string name="permdesc_performCdmaProvisioning" msgid="1994193538802314186">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯à»€àº¥àºµà»ˆàº¡àºàº²àº™à»€àº®àº±àº”ວຽàºàº‚ອງ CDMA. à»àº­àº±àºšàº¯àº—ີ່ເປັນອັນຕະລາàºàº­àº²àº”ເລີ່ມàºàº²àº™à»€àº®àº±àº”ວຽàºàº‚ອງ CDMA ໂດàºàºšà»à»ˆàºˆàº³à»€àº›àº±àº™."</string>
+ <string name="permlab_locationUpdates" msgid="7785408253364335740">"ຄວບຄຸມàºàº²àº™à»àºˆà»‰àº‡à»€àº•ືອນອັບເດດສະຖານທີ່"</string>
+ <string name="permdesc_locationUpdates" msgid="1120741557891438876">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯ ເປີດ/ປິດ àºàº²àº™à»€àº®àº±àº”ວຽàºàº‚ອງàºàº²àº™à»àºˆà»‰àº‡à»€àº•ືອນອັບເດດສະຖານທີ່ຈາàºàº§àº´àº—ະàºàº¸. à»àº­àº±àºšàº¯àº—ົ່ວໄປບà»à»ˆàºˆàº³à»€àº›àº±àº™àº•້ອງໃຊ້."</string>
+ <string name="permlab_checkinProperties" msgid="7855259461268734914">"ເຂົ້າເຖິງຄຸນສົມບັດàºàº²àº™à»€àºŠàº±àºàº­àº´àº™"</string>
+ <string name="permdesc_checkinProperties" msgid="4024526968630194128">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯à»„ດ້ຮັບສິດ ອ່ານ/ຂຽນ ໃສ່ສິ່ງທີ່ອັບໂຫຼດຂຶ້ນໂດàºàºšà»àº¥àº´àºàº²àº™à»€àºŠàº±àºàº­àº´àº™. ບà»à»ˆà»ƒàºŠà»‰à»ƒàº™à»àº­àº±àºšàº¯àº—ົ່ວໄປ."</string>
+ <string name="permlab_bindGadget" msgid="776905339015863471">"ເລືອàºàº§àº´àº”ເຈັດ"</string>
+ <string name="permdesc_bindGadget" msgid="8261326938599049290">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àºšàº­àºàº¥àº°àºšàº»àºšàº§à»ˆàº² ວິດເຈັດໃດສາມາດນຳໃຊ້ໂດàºà»àº­àº±àºšàº¯à»ƒàº”. à»àº­àº±àºšàº¯àº—ີ່ມີàºàº²àº™àº­àº°àº™àº¸àºàº²àº”ນີ້ຈະມອບàºàº²àº™à»€àº‚ົ້າເຖິງຂà»à»‰àº¡àº¹àº™àºªà»ˆàº§àº™à»‚ຕ ໃຫ້àºàº±àºšà»àº­àº±àºšàº¯àº­àº·à»ˆàº™à»„ດ້. ບà»à»ˆà»„ດ້ໃຊ້ໂດàºà»àº­àº±àºšàº¯àº—ົ່ວໄປ."</string>
+ <string name="permlab_modifyPhoneState" msgid="8423923777659292228">"à»àºà»‰à»„ຂສະຖານະໂທລະສັບ"</string>
+ <string name="permdesc_modifyPhoneState" msgid="1029877529007686732">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àº„ວບຄຸມຄວາມສາມາດຂອງໂທລະສັບໃນອຸປະàºàº­àº™. à»àº­àº±àºšàº¯àº—ີ່ມີàºàº²àº™àº­àº°àº™àº¸àºàº²àº”ນີ້ຈະສາມາດສະລັບເຄືອຂ່າàº, ເປີດ ຫຼືປິດສັນàºàº²àº™àº§àº´àº—ະàºàº¸ à»àº¥àº°àº„ວາມສາມາດອື່ນທີ່ຄ້າàºàºàº±àº™ ໂດàºàºšà»à»ˆàº¡àºµàºàº²àº™à»àºˆà»‰àº‡à»€àº•ືອນທ່ານ."</string>
+ <string name="permlab_readPhoneState" msgid="9178228524507610486">"ອ່ານສະຖານະ à»àº¥àº°àº‚à»à»‰àº¡àº¹àº™àº¥àº°àºšàº¸à»‚ຕຕົນຂອງໂທລະສັບ"</string>
+ <string name="permdesc_readPhoneState" msgid="1639212771826125528">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯ ເຂົ້າເຖິງຄວາມສາມາດàºàº²àº™à»‚ທລະສັບຂອງອຸປະàºàº­àº™. àºàº²àº™àºàº³àº™àº»àº”ສິດນີ້ເຮັດໃຫ້à»àº­àº±àºšàº¯àºªàº²àº¡àº²àº”àºàº§àº”ສອບເບີໂທລະສັບ à»àº¥àº° ID ຂອງອຸປະàºàº­àº™, ບà»à»ˆàº§à»ˆàº²àºàº²àº™à»‚ທຈະàºàº±àº‡àº”ຳເນີນຢູ່ à»àº¥àº°à»€àºšàºµàº›àº²àºàº—າງເຊື່ອມຕà»à»ˆàº¢àº¹à»ˆàº«àº¼àº·àºšà»à»ˆàºà»àº•າມ."</string>
+ <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"ຂັດຂວາງບà»à»ˆà»ƒàº«à»‰àº›àº´àº”ໜ້າຈà»à»àº—ັບເລັດ"</string>
+ <string name="permlab_wakeLock" product="default" msgid="573480187941496130">"ຂັດຂວາງບà»à»ˆà»ƒàº«à»‰à»‚ທລະສັບປິດໜ້າຈà»"</string>
+ <string name="permdesc_wakeLock" product="tablet" msgid="7311319824400447868">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯ ປ້ອງàºàº±àº™àºšà»à»ˆà»ƒàº«à»‰àº›àº´àº”ໜ້າຈà»à»àº—ັບເລັດ."</string>
+ <string name="permdesc_wakeLock" product="default" msgid="8559100677372928754">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àº›à»‰àº­àº‡àºàº±àº™àºšà»à»ˆà»ƒàº«à»‰àº›àº´àº”ໜ້າຈà»à»‚ທລະສັບ."</string>
+ <string name="permlab_devicePower" product="tablet" msgid="2787034722616350417">"ເປີດ ຫຼືປິດà»àº—ັບເລັດ"</string>
+ <string name="permlab_devicePower" product="default" msgid="4928622470980943206">"ເປີດ ຫຼືປິດໂທລະສັບ"</string>
+ <string name="permdesc_devicePower" product="tablet" msgid="6689862878984631831">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯à»€àº›àºµàº” ຫຼືປິດà»àº—ັບເລັດ."</string>
+ <string name="permdesc_devicePower" product="default" msgid="6037057348463131032">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàºžàº¥àº´à»€àº„ຊັນປິດ ຫຼືເປີດà»àº—ັບເລັດໄດ້."</string>
+ <string name="permlab_factoryTest" msgid="3715225492696416187">"ເຮັດວຽàºà»ƒàº™à»‚à»àº”àºàº²àº™àº—ົດສອບຂອງໂຮງງານ"</string>
+ <string name="permdesc_factoryTest" product="tablet" msgid="3952059318359653091">"ເຮັດວຽàºà»ƒàº™àº®àº¹àºšà»àºšàºšàº—ົດສອບໃນລະດັບຕà»à»ˆàº²àº‚ອງຜູ່ຜະລິດ, ອະນຸàºàº²àº”àºàº²àº™à»€àº‚ົ້າເຖິງà»àºšàºšà»€àº•ັມຮູບà»àºšàºšàº«àº²àº®àº²àº”à»àº§àº‚ອງà»àº—ັບເລັດ. ໃຊ້ໄດ້ສະເພາະໃນເວລາທີ່à»àº—ັບເລັດàºàº³àº¥àº±àº‡àº¢àº¹à»ˆà»ƒàº™à»‚à»àº” àºàº²àº™àº—ົດສອບຂອງຜູ່ຜະລິດgmqjkoaho."</string>
+ <string name="permdesc_factoryTest" product="default" msgid="8136644990319244802">"ເປີດໃຊ້ໃນà»àºšàºšàºàº²àº™àº—ົດສອບຂອງຜູ່ລະລິດໃນລະດັບຕà»à»ˆàº², ອະນຸàºàº²àº”àºàº²àº™à»€àº‚ົ້າເຖິງຮາດà»àº§àº‚ອງໂທລະສັບà»àºšàºšàºªàº»àº¡àºšàº¹àº™. ສະເພາະເມື່ອໂທລະສັບຖືàºà»€àº›àºµàº”ໃຊ້ ໃນໂà»àº”àºàº²àº™àº—ົດສອບຂອງຜູ່ຜະລິດເທົ່ານັ້ນ."</string>
+ <string name="permlab_setWallpaper" msgid="6627192333373465143">"ຕັ້ງພາບພື້ນຫຼັງ"</string>
+ <string name="permdesc_setWallpaper" msgid="7373447920977624745">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àº•ັ້ງຄ່າພາບພື້ນຫຼັງຂອງລະບົບໄດ້."</string>
+ <string name="permlab_setWallpaperHints" msgid="3278608165977736538">"ປັບຂະໜາດພາບພື້ນຫຼັງຂອງທ່ານ"</string>
+ <string name="permdesc_setWallpaperHints" msgid="8235784384223730091">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯ ຕັ້ງຄ່າຄຳà»àº™àº°àº™àº³àº‚ະໜາດພາບພື້ນຫຼັງ."</string>
+ <string name="permlab_masterClear" msgid="2315750423139697397">"ຣີເຊັດລະບົບໃຫ້ເປັນຄ່າເລີ່ມຕົ້ນທີ່ມາຈາàºà»‚ຮງງານ"</string>
+ <string name="permdesc_masterClear" msgid="3665380492633910226">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯ ຣີເຊັດຄ່າທັງà»àº»àº”ຂອງລະບົບໃຫ້àºàº±àºšà»„ປເປັນà»àºšàºšàº—ີ່ມາຈາàºà»‚ຮງງານ, ລຶບຂà»à»‰àº¡àº¹àº™, àºàº²àº™àº•ັ້ງຄ່າ à»àº¥àº°à»àº­àº±àºšàº¯àº—ີ່ໄດ້ຕິດຕັ້ງໄວ້ທັງà»àº»àº”."</string>
+ <string name="permlab_setTime" msgid="2021614829591775646">"ຕັ້ງເວລາ"</string>
+ <string name="permdesc_setTime" product="tablet" msgid="1896341438151152881">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àº›à»ˆàº½àº™à»€àº§àº¥àº²àº‚ອງໂມງໃນà»àº—ັບເລັດໄດ້."</string>
+ <string name="permdesc_setTime" product="default" msgid="1855702730738020">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àº›à»ˆàº½àº™à»€àº§àº¥àº²àº‚ອງໂມງໃນໂທລະສັບໄດ້."</string>
+ <string name="permlab_setTimeZone" msgid="2945079801013077340">"ຕັ້ງເຂດເວລາ"</string>
+ <string name="permdesc_setTimeZone" product="tablet" msgid="1676983712315827645">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àº›à»ˆàº½àº™à»€àº‚ດເວລາຂອງà»àº—ັບເລັດ."</string>
+ <string name="permdesc_setTimeZone" product="default" msgid="4499943488436633398">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯ ປ່ຽນເຂດເວລາຂອງໂທລະສັບ."</string>
+ <string name="permlab_accountManagerService" msgid="4829262349691386986">"ເຮັດໜ້າທີ່ເປັນ AccountManagerService"</string>
+ <string name="permdesc_accountManagerService" msgid="1948455552333615954">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯à»€àº­àºµà»‰àº™àº«àº² AccountAuthenticators."</string>
+ <string name="permlab_getAccounts" msgid="1086795467760122114">"ຊອàºàº«àº²àºšàº±àº™àºŠàºµà»ƒàº™àº­àº¸àº›àº°àºàº­àº™"</string>
+ <string name="permdesc_getAccounts" product="tablet" msgid="2741496534769660027">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àº®àº±àºšà»€àº­àº»àº²àº¥àº²àºàºàº²àº™àº‚ອງບັນຊີທີ່ຮູ້ຈັàºà»‚ດàºà»àº—ັບເລັດ. ນີ້ອາດຮວມທັງບັນຊີຕ່າງໆ ທີ່ຖືàºàºªà»‰àº²àº‡à»‚ດàºà»àº­àº±àºšàºžàº¥àº´à»€àº„ຊັນທີ່ທ່ານໄດ້ຕິດຕັ້ງໄວ້."</string>
+ <string name="permdesc_getAccounts" product="default" msgid="3448316822451807382">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàºžàº¥àº´à»€àº„ຊັນ ດຶງຂà»à»‰àº¡àº¹àº™àº¥àº²àºàºŠàº·à»ˆàº‚ອງບັນຊີທີ່ໂທລະສັບມີ ເຊິ່ງອາດຮວມເຖິງບັນຊີທີ່ໃດໆທີ່ສ້າງຂຶ້ນ ໂດàºà»àº­àº±àºšàºžàº¥àº´à»€àº„ຊັນທີ່ທ່ານຕິດຕັ້ງໄວ້."</string>
+ <string name="permlab_authenticateAccounts" msgid="5265908481172736933">"ສ້າງບັນຊີ à»àº¥àº°àº•ັ້ງລະຫັດຜ່ານ"</string>
+ <string name="permdesc_authenticateAccounts" msgid="5472124296908977260">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯ ໃຊ້ຄວາມສາມາດຂອງຕົວພິສູດສິດບັນຊີຂອງ AccountManager ຮວມທັງàºàº²àº™àºªà»‰àº²àº‡àºšàº±àº™àºŠàºµ, àºàº²àº™àº‚à»à»€àºšàº´à»ˆàº‡ à»àº¥àº°àº•ັ້ງຄ່າລະຫັດຜ່ານ."</string>
+ <string name="permlab_manageAccounts" msgid="4983126304757177305">"ສ້າງ ຫຼືລຶບບັນຊີ"</string>
+ <string name="permdesc_manageAccounts" msgid="8698295625488292506">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àº”ຳເນີນàºàº²àº™à»€àºŠàº±à»ˆàº™: ເພີ່ມ ຫຼືລຶບບັນຊີ à»àº¥àº°àº¥àº¶àºšàº¥àº°àº«àº±àº”ຜ່ານຂອງບັນຊີໄດ້."</string>
+ <string name="permlab_useCredentials" msgid="235481396163877642">"ໃຊ້ບັນຊີໃນອຸປະàºàº­àº™"</string>
+ <string name="permdesc_useCredentials" msgid="7984227147403346422">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àº®à»‰àº­àº‡àº‚à»à»‚ທເຄນàºàº²àº™àºžàº´àºªàº¹àº”ຢືນຢັນໄດ້."</string>
+ <string name="permlab_accessNetworkState" msgid="4951027964348974773">"ເບິ່ງàºàº²àº™à»€àºŠàº·à»ˆàº­àº¡àº•à»à»ˆà»€àº„ືອຂ່າàº"</string>
+ <string name="permdesc_accessNetworkState" msgid="8318964424675960975">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯ ເບິ່ງຂà»à»‰àº¡àº¹àº™àºà»ˆàº½àº§àºàº±àºšàºàº²àº™à»€àºŠàº·à»ˆàº­àº¡àº•à»à»ˆà»€àº„ືອຂ່າຠເຊັ່ນວ່າມີເຄືອຂ່າàºà»ƒàº”à»àº”່ à»àº¥àº°à»„ດ້ເຊື່ອມຕà»à»ˆàºàº±àºšà»€àº„ືອຂ່າàºà»ƒàº”."</string>
+ <string name="permlab_createNetworkSockets" msgid="8018758136404323658">"ເຂົ້າເຖິງເຄືອຂ່າàºà»€àº•ັມຮູບà»àºšàºš"</string>
+ <string name="permdesc_createNetworkSockets" msgid="3403062187779724185">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àºªà»‰àº²àº‡àºŠàº±àº­àºà»€àºàº±àº”ເຄືອຂ່າຠà»àº¥àº°à»‚ປຣໂຕຄອນເຄືອຂ່າàºà»àºšàºšàºàº³àº™àº»àº”ເອງ. ໂປຣà»àºàº£àº¡àº—່ອງເວັບ à»àº¥àº°à»àº­àº±àºšàºžàº¥àº´à»€àº„ຊັນອື່ນໆຈະສົ່ງຂà»à»‰àº¡àº¹àº™àºªàº¹à»ˆàº­àº´àº™à»€àº•ີເນັດຢູ່à»àº¥à»‰àº§ ດັ່ງນັ້ນàºàº²àº™àº­àº°àº™àº¸àºàº²àº”ນີ້ຈຶ່ງບà»à»ˆàºˆàº³à»€àº›àº±àº™àº•້ອງໃຊ້ ເພື່ອສົ່ງຂà»à»‰àº¡àº¹àº™àºªàº¹à»ˆàº­àº´àº™à»€àº•ີເນັດ."</string>
+ <string name="permlab_writeApnSettings" msgid="505660159675751896">"ປ່ຽນ/ສະàºàº±àº”àºàº±à»‰àº™àºàº²àº™àº•ັ້ງຄ່າເຄືອຂ່າຠà»àº¥àº°àº‚à»à»‰àº¡àº¹àº™"</string>
+ <string name="permdesc_writeApnSettings" msgid="5333798886412714193">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àº›à»ˆàº½àº™àºàº²àº™àº•ັ້ງຄ່າເຄືອຂ່າຠà»àº¥àº°àºªàº°àºàº±àº”àºàº±à»‰àº™ à»àº¥àº°àºàº§àº”ສອບàºàº²àº™à»€àº”ີນທາງຂອງຂà»à»‰àº¡àº¹àº™àº—ັງà»àº»àº”, àºàº»àºàº•ົວຢ່າງ: ໃນàºàº²àº™àº›à»ˆàº½àº™àºžàº­àº”ຂອງ Proxy ຂອງ APN ໃດàºà»àº•າມ. à»àº­àº±àºšàº¯àº—ີ່ເປັນອັນຕະລາàºàº­àº²àº”ຕິດຕາມ, ປ່ຽນà»àº›àº‡ à»àº¥àº°à»àºà»‰à»„ຂà»àºžàº±àºà»€àºàº±àº”ຂອງທ່ານໂດàºàº—ີ່ທ່ານບà»à»ˆàº®àº¹à»‰à»‚ຕ."</string>
+ <string name="permlab_changeNetworkState" msgid="958884291454327309">"ປ່ຽນàºàº²àº™à»€àºŠàº·à»ˆàº­àº¡àº•à»à»ˆà»€àº„ືອຂ່າàº"</string>
+ <string name="permdesc_changeNetworkState" msgid="6789123912476416214">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àº›à»ˆàº½àº™àºªàº°àº–ານະàºàº²àº™à»€àºŠàº·à»ˆàº­àº¡àº•à»à»ˆàº‚ອງເຄືອຂ່າàºà»„ດ້."</string>
+ <string name="permlab_changeTetherState" msgid="5952584964373017960">"ປ່ຽນàºàº²àº™à»€àºŠàº·à»ˆàº­àº¡àº•à»à»ˆàº—ີ່ປ່ອàºàºªàº±àº™àºàº²àº™à»„ວ້"</string>
+ <string name="permdesc_changeTetherState" msgid="1524441344412319780">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àº›à»ˆàº½àº™à»àº›àº‡àºªàº°àº–ານະ ຂອງເຄືອຂ່າàºàºàº²àº™à»€àºŠàº·à»ˆàº­àº¡àº•à»à»ˆàº­àº´àº™à»€àº•ີເນັດຜ່ານມືຖື."</string>
+ <string name="permlab_changeBackgroundDataSetting" msgid="1400666012671648741">"ປ່ຽນàºàº²àº™àº•ັ້ງຄ່າàºàº²àº™àº™àº³à»ƒàºŠà»‰àº‚à»à»‰àº¡àº¹àº™àºžàº·à»‰àº™àº«àº¼àº±àº‡"</string>
+ <string name="permdesc_changeBackgroundDataSetting" msgid="5347729578468744379">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àº›à»ˆàº½àº™àºàº²àº™àº•ັ້ງຄ່າàºàº²àº™à»ƒàºŠà»‰àº­àº´àº™à»€àº•ີເນັດ ຂອງà»àº­àº±àºšàº¯àº—ີ່ເຮັດວຽàºàº¢àº¹à»ˆàº”້ານຫຼັງລະບົບ."</string>
+ <string name="permlab_accessWifiState" msgid="5202012949247040011">"ເບິ່ງàºàº²àº™à»€àºŠàº·à»ˆàº­àº¡àº•à»à»ˆ Wi-Fi"</string>
+ <string name="permdesc_accessWifiState" msgid="5002798077387803726">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯à»€àºšàº´à»ˆàº‡àº‚à»à»‰àº¡àº¹àº™àºà»ˆàº½àº§àºàº±àºšà»€àº„ືອຂ່າຠWi-Fi ເຊັ່ນວ່າ WiFi àºàº³àº¥àº±àº‡àº–ືàºàº™àº³à»ƒàºŠà»‰àº¢àº¹à»ˆàºšà»à»ˆ à»àº¥àº°àºŠàº·à»ˆàº‚ອງອຸປະàºàº­àº™ WiFi ທີ່àºàº³àº¥àº±àº‡à»€àºŠàº·à»ˆàº­àº¡àº•à»à»ˆàº¢àº¹à»ˆ."</string>
+ <string name="permlab_changeWifiState" msgid="6550641188749128035">"ເຊື່ອມຕà»à»ˆ à»àº¥àº°àº•ັດàºàº²àº™à»€àºŠàº·à»ˆàº­àº¡àº•à»à»ˆàºˆàº²àº Wi-Fi"</string>
+ <string name="permdesc_changeWifiState" msgid="7137950297386127533">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯à»€àºŠàº·à»ˆàº­àº¡àº•à»à»ˆ à»àº¥àº°àº•ັດàºàº²àº™à»€àºŠàº·à»ˆàº­àº¡àº•à»à»ˆàºˆàº²àºàºˆàº¸àº”ເຊື່ອມຕà»à»ˆ Wi-Fi à»àº¥àº°à»ƒàº«à»‰àºªàº²àº¡àº²àº”ປ່ຽນà»àº›àº‡àº„່າຂອງອຸປະàºàº­àº™àºªàº³àº¥àº±àºšà»€àº„ືອຂ່າຠWi-Fi."</string>
+ <string name="permlab_changeWifiMulticastState" msgid="1368253871483254784">"ອະນຸàºàº²àº”àºàº²àº™àº®àº±àºš Wi-Fi Multicast"</string>
+ <string name="permdesc_changeWifiMulticastState" product="tablet" msgid="7969774021256336548">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àº®àº±àºšàº‚à»à»‰àº¡àº¹àº™à»àºžàº±àºà»€àºàº±àº” ທີ່ຖືàºàºªàº»à»ˆàº‡ ໄປຫາທຸàºàº­àº¸àº›àº°àºàº­àº™à»ƒàº™à»€àº„ືອຂ່າຠWiFi ໂດàºàºàº²àº™àº™àº³à»ƒàºŠà»‰àºàº²àº™àºàº°àºˆàº²àºàº‚à»à»‰àº¡àº¹àº™à»ƒàº™àº§àº»àº‡àºàº§à»‰àº²àº‡, ບà»à»ˆà»àº¡à»ˆàº™àºªàº°à»€àºžàº²àº°à»àº—ັບເລັດຂອງທ່ານ. ມັນໃຊ້ພະລັງງານຫຼາàºàºàº§à»ˆàº²à»‚ຫມດàºàº°àºˆàº²àºàº‚à»à»‰àº¡àº¹àº™à»àºšàºšà»‚ດàºàºàº»àº‡."</string>
+ <string name="permdesc_changeWifiMulticastState" product="default" msgid="6851949706025349926">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯ ຮັບຂà»à»‰àº¡àº¹àº™à»àºžàº±àºà»€àºàº”ທີ່ສົ່ງໄປໃຫ້ທຸàºàº­àº¸àº›àº°àºàº­àº™à»ƒàº™à»€àº„ືອຂ່າຠWi-Fi ໂດàºà»ƒàºŠà»‰àº—ີ່ຢູ່ multicast ບà»à»ˆàºªàº°à»€àºžàº²àº°àºžàº½àº‡à»‚ທລະສັບຂອງທ່ານ, ເຊິ່ງຈະໃຊ້ພະລັງງານຫຼາàºàºàº§à»ˆàº²à»ƒàº™à»‚à»àº”ທີ່ບà»à»ˆà»àº¡à»ˆàº™ multicast."</string>
+ <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"ເຂົ້າເຖິງàºàº²àº™àº•ັ້ງຄ່າ Bluetooth"</string>
+ <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àº•ັ້ງຄ່າà»àº—ັບເລັດ Bluetooth ພາàºà»ƒàº™ à»àº¥àº°àºŠàº­àºàº«àº² à»àº¥àº°à»€àºŠàº·à»ˆàº­àº¡àº•à»à»ˆà»„ວ້àºàº±àºšàº­àº¸àº›àº°àºàº­àº™àºžàº²àºàº™àº­àº."</string>
+ <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àº•ັ້ງຄ່າ Bluetooth ໃນໂທລະສັບ ເພື່ອຊອàºàº«àº² à»àº¥àº°àºàº²àº™à»€àºŠàº·à»ˆàº­àº¡àº•à»à»ˆàºàº±àºšàº­àº¸àº›àº°àºàº­àº™à»„ຮ້ສາàºàºžàº²àºàº™àº­àº."</string>
+ <string name="permlab_accessWimaxState" msgid="4195907010610205703">"ເຊື່ອມຕà»à»ˆ à»àº¥àº°àº•ັດàºàº²àº™à»€àºŠàº·à»ˆàº­àº¡àº•à»à»ˆàºˆàº²àº WiMAX"</string>
+ <string name="permdesc_accessWimaxState" msgid="6360102877261978887">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àºàº§àº”ເບິ່ງວ່າ WiMAX ຖືàºà»€àº›àºµàº”ນຳໃຊ້ຢູ່ບà»à»ˆ à»àº¥àº°àº‚à»à»‰àº¡àº¹àº™àºà»ˆàº½àº§àºàº±àºšà»€àº„ືອຂ່າຠWiMAX ອື່ນໆທີ່àºàº³àº¥àº±àº‡à»€àºŠàº·à»ˆàº­àº¡àº•à»à»ˆàº¢àº¹à»ˆ."</string>
+ <string name="permlab_changeWimaxState" msgid="2405042267131496579">"ປ່ຽນສະຖານະ WiMAX"</string>
+ <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯à»€àºŠàº·à»ˆàº­àº¡àº•à»à»ˆ à»àº¥àº°àº•ັດàºàº²àº™à»€àºŠàº·à»ˆàº­àº¡àº•à»à»ˆà»àº—ັບເລັດຈາàºà»€àº„ືອຂ່າຠWiMAX."</string>
+ <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯à»€àºŠàº·à»ˆàº­àº¡àº•à»à»ˆ à»àº¥àº°àº•ັດàºàº²àº™à»€àºŠàº·à»ˆàº­àº¡àº•à»à»ˆàº‚ອງໂທລະສັບຈາàºà»€àº„ືອຂ່າຠWiMax ໄດ້."</string>
+ <string name="permlab_bluetooth" msgid="6127769336339276828">"ຈັບຄູ່àºàº±àºšàº­àº¸àº›àº°àºàº­àº™ Bluetooth"</string>
+ <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯à»€àºšàº´à»ˆàº‡àºàº²àº™àº•ັ້ງຄ່າຂອງ Bluetooth ໃນà»àº—ັບເລັດ ຕະຫຼອດຈົນເຊື່ອມຕà»à»ˆ à»àº¥àº°àºàº­àº¡àº®àº±àºšàºàº²àº™à»€àºŠàº·à»ˆàº­àº¡àº•à»à»ˆàºàº±àºšàº­àº¸àº›àº°àºàº­àº™àº—ີ່ຈັບຄູ່àºàº±àº™à»àº¥à»‰àº§."</string>
+ <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯à»€àºšàº´à»ˆàº‡àºàº²àº™àº•ັ້ງຄ່າຂອງ Bluetooth ໃນໂທລະສັບ, ຮວມທັງໃຫ້ສ້າງ à»àº¥àº°àº®àº±àºšàºàº²àº™à»€àºŠàº·à»ˆàº­àº¡àº•à»à»ˆàºˆàº²àºàº­àº¸àº›àº°àºàº­àº™àº—ີ່ຈັບຄູ່àºàº±àº™."</string>
+ <string name="permlab_nfc" msgid="4423351274757876953">"ຄວບຄຸມ Near Field Communication"</string>
+ <string name="permdesc_nfc" msgid="7120611819401789907">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àº•ິດຕà»à»ˆàºªàº·à»ˆàºªàº²àº™àºàº±àºšàº›à»‰àº²àºàºàº³àºàº±àºš, ບັດ à»àº¥àº°à»‚ຕອ່ານຂອງàºàº²àº™àºªàº·à»ˆàºªàº²àº™à»„ລàºàº°àºªàº±à»‰àº™ (NFC)."</string>
+ <string name="permlab_disableKeyguard" msgid="3598496301486439258">"ປິດàºàº²àº™àº¥àº±àº­àºà»œà»‰àº²àºˆà»"</string>
+ <string name="permdesc_disableKeyguard" msgid="6034203065077122992">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àº›àº´àº”àºàº²àº™à»€àº®àº±àº”ວຽàºàº‚ອງປຸ່ມລັອຠà»àº¥àº°àº¥àº°àºšàº»àºšàº„ວາມປອດໄພຂອງລະຫັດຜ່ານທີ່ເຊື່ອມໂàºàº‡àºàº±àº™. ໂຕຢ່າງ: ໂທລະສັບຈະປິດàºàº²àº™à»€àº®àº±àº”ວຽàºàº‚ອງປຸ່ມລັອàºà»€àº¡àº·à»ˆàº­àº¡àºµàºªàº²àºà»‚ທເຂົ້າ ຈາàºàº™àº±à»‰àº™àºˆàº¶à»ˆàº‡à»€àº›àºµàº”ໃຊ້ໄດ້ອີàºà»€àº¡àº·à»ˆàº­àº§àº²àº‡àºªàº²àºà»àº¥à»‰àº§."</string>
+ <string name="permlab_readSyncSettings" msgid="6201810008230503052">"ອ່ານàºàº²àº™àº•ັ້ງຄ່າຊິ້ງຂà»à»‰àº¡àº¹àº™"</string>
+ <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯ ອ່ານàºàº²àº™àº•ັ້ງຄ່າàºàº²àº™àºŠàº´à»‰àº‡àº‚à»à»‰àº¡àº¹àº™àº‚ອງບັນຊີໄດ້. ຕົວຢ່າງເຊັ່ນ: ມັນຈະສາມາດàºàº§àº”ສອບໄດ້à»àº­àº±àºšàº¯ People ຖືàºàºŠàº´à»‰àº‡àº‚à»à»‰àº¡àº¹àº™àºàº±àºšàºšàº±àº™àºŠàºµà»ƒàº”ນຶ່ງà»àº¥à»‰àº§àº«àº¼àº·àºàº±àº‡."</string>
+ <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"ສະລັບàºàº²àº™à»€àº›àºµàº” à»àº¥àº°àº›àº´àº”àºàº²àº™àºŠàº´à»‰àº‡àº‚à»à»‰àº¡àº¹àº™"</string>
+ <string name="permdesc_writeSyncSettings" msgid="8956262591306369868">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯à»àºà»‰à»„ຂàºàº²àº™àº•ັ້ງຄ່າàºàº²àº™àºŠàº´à»‰àº‡àº‚à»à»‰àº¡àº¹àº™àºªàº³àº¥àº±àºšàºšàº±àº™àºŠàºµ. àºàº»àºàº•ົວຢ່າງ: ມັນສາມາດໃຊ້ເພື່ອເປີດນຳໃຊ້àºàº²àº™àºŠàº´à»‰àº‡àº‚à»à»‰àº¡àº¹àº™àº‚ອງ People à»àº­àº±àºšàº¯àºàº±àºšàºšàº±àº™àºŠàºµà»ƒàº”ນຶ່ງໄດ້."</string>
+ <string name="permlab_readSyncStats" msgid="7396577451360202448">"ອ່ານສະຖິຕິàºàº²àº™àºŠàº´à»‰àº‡àº‚à»à»‰àº¡àº¹àº™"</string>
+ <string name="permdesc_readSyncStats" msgid="1510143761757606156">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯ ອ່ານສະຖິຕິàºàº²àº™àºŠàº´à»‰àº‡àº‚à»à»‰àº¡àº¹àº™àº‚ອງບັນຊີໃດນຶ່ງ ຮວມທັງປະຫວັດàºàº²àº™àºŠàº´à»‰àº‡àº‚à»à»‰àº¡àº¹àº™ à»àº¥àº°àºˆàº³àº™àº§àº™àº‚à»à»‰àº¡àº¹àº™àº—ີ່ຖືàºàºŠàº´à»‰àº‡."</string>
+ <string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"ອ່ານຂà»à»‰àº¡àº¹àº™àºŸàºµàº”ທີ່ສະà»àº±àºà»„ວ້"</string>
+ <string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯ ດຶງລາàºàº¥àº°àº­àº½àº”àºà»ˆàº½àº§àºàº±àºšàº‚à»à»‰àº¡àº¹àº™àº—ີ່àºàº³àº¥àº±àº‡àºŠàº´à»‰àº‡àº¢àº¹à»ˆ."</string>
+ <string name="permlab_subscribedFeedsWrite" msgid="9015246325408209296">"ຂຽນຂà»à»‰àº¡àº¹àº™àºŸàºµàº”ທີ່ສະà»àº±àºà»„ວ້"</string>
+ <string name="permdesc_subscribedFeedsWrite" msgid="6928930188826089413">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯ à»àºà»‰à»„ຂຟີດທີ່ຖືàºàºŠàº´à»‰àº‡àº‚à»à»‰àº¡àº¹àº™à»€àº¡àº·à»ˆàº­à»„ວໆນີ້ຂອງທ່ານ. à»àº­àº±àºšàº¯àº—ີ່ເປັນອັນຕະລາຠອາດປ່ຽນà»àº›àº‡àºŸàºµàº”ຂອງທ່ານທີ່ຊິ້ງມາ."</string>
+ <string name="permlab_readDictionary" msgid="4107101525746035718">"ອ່ານຄຳສັບທີ່ທ່ານເພີ່ມໃສ່ວັດຈະນານຸàºàº»àº¡"</string>
+ <string name="permdesc_readDictionary" msgid="659614600338904243">"ອະນຸàºàº²àº”à»àº­àº±àºšàº¯àº­à»ˆàº²àº™àº„ຳສັບ, ຊື່ à»àº¥àº°àº›àº°à»‚ຫàºàºàº—ັງà»àº»àº”ທີ່ຜູ່ໃຊ້ອາດບັນທຶàºà»„ວ້ໃນວັດຈະນານຸàºàº»àº¡àºœàº¹à»ˆà»ƒàºŠà»‰."</string>
+ <string name="permlab_writeDictionary" msgid="2183110402314441106">"ເພີ່ມຄຳສັບໃສ່ວັດຈະນານຸàºàº»àº¡àº—ີ່ຜູ່ໃຊ້àºàº³àº™àº»àº”ເອງ"</string>
+ <string name="permdesc_writeDictionary" msgid="8185385716255065291">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àº‚ຽນຄຳສັບໃà»à»ˆ ໃສ່ວັດຈະນານຸàºàº»àº¡àºœàº¹à»ˆà»ƒàºŠà»‰."</string>
+ <string name="permlab_sdcardRead" product="nosdcard" msgid="8235341515605559677">"ທົດສອບàºàº²àº™à»€àº‚ົ້າເຖິງບ່ອນຈັດເàºàº±àºšàº‚à»à»‰àº¡àº¹àº™àº—ີ່ຖືàºàº›à»‰àº­àº‡àºàº±àº™à»„ວ້"</string>
+ <string name="permlab_sdcardRead" product="default" msgid="8235341515605559677">"ທົດສອບàºàº²àº™à»€àº‚ົ້າເຖິງບ່ອນຈັດເàºàº±àºšàº‚à»à»‰àº¡àº¹àº™àº—ີ່ຖືàºàº›à»‰àº­àº‡àºàº±àº™à»„ວ້"</string>
+ <string name="permdesc_sdcardRead" product="nosdcard" msgid="3642473292348132072">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àº—ົດສອບàºàº²àº™àº­àº°àº™àº¸àºàº²àº”ຂອງ ບ່ອນຈັດເàºàº±àºšàº‚à»à»‰àº¡àº¹àº™ USB ເຊິ່ງຈະຖືàºà»ƒàºŠà»‰à»ƒàº™àº­àº¸àº›àº°àºàº­àº™à»ƒàº™àº­àº°àº™àº²àº„ົດ."</string>
+ <string name="permdesc_sdcardRead" product="default" msgid="5914402684685848828">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯ ທົດລອງສິດໃດນຶ່ງສຳລັບ SD card ທີ່ຈະມີໃນອຸປະàºàº­àº™à»ƒàº™àº­àº°àº™àº²àº„ົດ."</string>
+ <string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"à»àºà»‰à»„ຂ ຫຼືລຶບເນື້ອຫາໃນບ່ອນຈັດເàºàº±àºšàº‚à»à»‰àº¡àº¹àº™ USB ຂອງທ່ານ"</string>
+ <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"à»àºà»‰à»„ຂ ຫຼືລຶບເນື້ອຫາຂອງ SD card ຂອງທ່ານ"</string>
+ <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àº‚ຽນຂà»à»‰àº¡àº¹àº™à»ƒàºªà»ˆàºšà»ˆàº­àº™àºˆàº±àº”ເàºàº±àºšàº‚à»à»‰àº¡àº¹àº™ USB."</string>
+ <string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àº‚ຽນຂà»à»‰àº¡àº¹àº™àº¥àº»àº‡à»ƒàº™ SD card ໄດ້."</string>
+ <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"à»àºà»‰à»„ຂ/ລຶບ ເນື້ອຫາບ່ອນຈັດເàºàº±àºšàºªàº·à»ˆàºžàº²àºà»ƒàº™"</string>
+ <string name="permdesc_mediaStorageWrite" product="default" msgid="8189160597698529185">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯à»àºà»‰à»„ຂເນື້ອຫາຂອງໂຕເàºàº±àºšàº‚à»à»‰àº¡àº¹àº™à»ƒàº™à»‚ຕເຄື່ອງ."</string>
+ <string name="permlab_manageDocs" product="default" msgid="5778318598448849829">"ຈັດàºàº²àº™àºžàº·à»‰àº™àº—ີ່ຈັດເàºàº±àºšà»€àº­àºàº°àºªàº²àº™"</string>
+ <string name="permdesc_manageDocs" product="default" msgid="8704323176914121484">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àºˆàº±àº”àºàº²àº™àºàº±àºšàºšà»ˆàº­àº™àºˆàº±àº”ເàºàº±àºšàº‚à»à»‰àº¡àº¹àº™à»€àº­àºàº°àºªàº²àº™."</string>
+ <string name="permlab_sdcardAccessAll" msgid="8150613823900460576">"ເຂົ້າເຖິງພື້ນທີ່ຈັດເàºàº±àºšàº‚à»à»‰àº¡àº¹àº™àºžàº²àºàº™àº­àºàº‚ອງທຸàºàºœàº¹à»ˆà»ƒàºŠà»‰"</string>
+ <string name="permdesc_sdcardAccessAll" msgid="3215208357415891320">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯ ເຂົ້າເຖິງພື້ນທີ່ຈັດເàºàº±àºšàº‚à»à»‰àº¡àº¹àº™àºžàº²àºàº™àº­àº ສຳລັບທຸàºàºœàº¹à»ˆà»ƒàºŠà»‰."</string>
+ <string name="permlab_cache_filesystem" msgid="5656487264819669824">"ເຂົ້າເຖິງໄຟລ໌ cache ຂອງລະບົບ"</string>
+ <string name="permdesc_cache_filesystem" msgid="5578967642265550955">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯ ອ່ານ à»àº¥àº°àº‚ຽນ ລະບົບໄຟລ໌à»àº„ດ."</string>
+ <string name="permlab_use_sip" msgid="5986952362795870502">"ສົ່ງ/ຮັບ àºàº²àº™à»‚ທຜ່ານອິນເຕີເນັດ"</string>
+ <string name="permdesc_use_sip" msgid="4717632000062674294">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯ ໃຊ້ບà»àº¥àº´àºàº²àº™ SIP ເພື່ອ ໂທອອàº/ຮັບສາຠàºàº²àº™à»‚ທຜ່ານອິນເຕີເນັດ."</string>
+ <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"ອ່ານປະຫວັດàºàº²àº™àº™àº³à»ƒàºŠà»‰à»€àº„ືອຂ່າàº"</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯ ອ່ານປະຫວັດàºàº²àº™àº™àº³à»ƒàºŠà»‰à»€àº„ືອຂ່າàºàº‚ອງà»àº­àº±àºšàº¯ à»àº¥àº°à»€àº„ືອຂ່າàºà»ƒàº”ນຶ່ງ."</string>
+ <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"ຈັດàºàº²àº™àº™àº°à»‚àºàºšàº²àºà»€àº„ືອຂ່າàº"</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àºˆàº±àº”àºàº²àº™àºàº±àºšàº™àº°à»‚àºàºšàº²àºà»€àº„ືອຂ່າຠà»àº¥àº°àºàº³àº™àº»àº”àºàº»àº”ລະບຽບສະເພາະຂອງà»àº­àº±àºšàº¯."</string>
+ <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"à»àºà»‰à»„ຂàºàº²àº™àº„ຳນວນàºàº²àº™àº™àº³à»ƒàºŠà»‰à»€àº„ືອຂ່າàº"</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯à»àºà»‰à»„ຂວິທີàºàº²àº™àºšàº±àº™àº—ຶàºàºšàº±àº™àºŠàºµ àºàº²àº™àº™àº³à»ƒàºŠà»‰à»€àº„ືອຂ່າàºàº‚ອງà»àº­àº±àºšàº¯. à»àº­àº±àºšàº¯àº—ົ່ວໄປບà»à»ˆàºˆàº³à»€àº›àº±àº™àº•້ອງໃຊ້."</string>
+ <string name="permlab_markNetworkSocket" msgid="3658527214914959749">"ດັດ​à»àº›àº‡àºŠàº±àº­àºà»€àºàº±àº”ມາàº"</string>
+ <string name="permdesc_markNetworkSocket" msgid="7655568433696356578">"ອະ​ນຸ​àºàº²àº”​ໃຫ້à»àº­àº±àºšàº¯à»àºà»‰à»„ຂຊັອàºà»€àºàº±àº”ທີ່à»àº²àºà»„ວ້ສຳລັບàºàº³àº™àº»àº”ເສັ້ນທາງ"</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"ເຂົ້າເຖິງàºàº²àº™à»àºˆà»‰àº‡à»€àº•ືອນ"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àº”ຶງຂà»à»‰àº¡àº¹àº™, àºàº§àº”ສອບ à»àº¥àº°àº¥àº¶àºšàº¥à»‰àº²àº‡àºàº²àº™à»àºˆà»‰àº‡à»€àº•ືອນ ຮວມທັງພວàºàº—ີ່ໂພສໂດàºà»àº­àº±àºšàº¯àº­àº·à»ˆàº™à»†àº™àº³."</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"ເຊື່ອມໂàºàº‡àºàº±àºšàºšà»àº¥àº´àºàº²àº™à»‚ຕຟັງàºàº²àº™à»àºˆà»‰àº‡à»€àº•ືອນ"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"ອະນຸàºàº²àº”ໃຫ້ເຈົ້າຂອງເຊື່ອມໂàºàº‡àºªà»ˆàº§àº™àº•ິດຕà»à»ˆàº¥àº°àº”ັບເທິງສຸດ ຂອງຜູ່ຟັງບà»àº¥àº´àºàº²àº™àºàº²àº™à»àºˆà»‰àº‡à»€àº•ືອນ. ບà»à»ˆàºˆàº³à»€àº›àº±àº™àºªàº³àº¥àº±àºšà»àº­àº±àºšàº¯àº—ົ່ວໄປ."</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"ຮ້ອງຂà»à»àº­àº±àºšàº¯àº›àº±àºšàº„່າທີ່ສະໜອງໂດàºàºœàº¹à»ˆà»ƒàº«à»‰àºšà»àº¥àº´àºàº²àº™"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"ອະ​ນຸ​àºàº²àº”​ໃຫ້​ເຈົ້າຂອງຮ້ອງຂà»à»àº­àº±àºšàº¯àº›àº±àºšàº„່າທີ່ສະໜອງໂດàºàºœàº¹à»ˆà»ƒàº«à»‰àºšà»àº¥àº´àºàº²àº™. ບà»à»ˆà»œà»‰àº²àºˆàº°àº•້ອງàºàº²àº™àºªàº³àº¥àº±àºšà»àº­àº±àºšàº¯àº—ົ່ວໄປ."</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"ຕິດຕາມເພື່ອສັງເàºàº”ສະພາບຂອງເຄືອຂ່າàº"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàºžàº¥àº´à»€àº„ຊັ່ນຕິດຕາມເພື່ອສັງເàºàº”ສະພາບຂອງເຄືອຂ່າàº. ປົàºàºàº°àº•ິà»àº¥à»‰àº§à»àº­àº±àºšàº¯àº—ຳມະດາຈະບà»à»ˆàº•້ອງàºàº²àº™à»ƒàºŠà»‰."</string>
+ <string name="policylab_limitPassword" msgid="4497420728857585791">"ຕັ້ງຄ່າàºàº»àº”ຂອງລະຫັດຜ່ານ"</string>
+ <string name="policydesc_limitPassword" msgid="3252114203919510394">"ຄວບຄຸມຄວາມàºàº²àº§àº‚ອງໂຕອັàºàºªàº­àº™àº—ີ່ສາມາດໃຊ້àºàº±àºšàº¥àº°àº«àº±àº”ປົດລັອàºà»œà»‰àº²àºˆà»"</string>
+ <string name="policylab_watchLogin" msgid="914130646942199503">"ຕິດຕາມàºàº²àº™àºžàº°àºàº²àºàº²àº¡àº›àº»àº”ລັອàºà»œà»‰àº²àºˆà»"</string>
+ <string name="policydesc_watchLogin" product="tablet" msgid="3215729294215070072">"ຕິດຕາມເບິ່ງຈຳນວນàºàº²àº™àºžàº´àº¡àº¥àº°àº«àº±àº”ຜ່ານທີ່ບà»à»ˆàº–ືàºàº•້ອງ ໃນເວລາປົດລັອàºà»œà»‰àº²àºˆà» à»àº¥àº°àº¥àº±àº­àºà»àº—ັບເລັດ ຫຼືລຶບຂà»à»‰àº¡àº¹àº™àº—ັງà»àº»àº”ຂອງà»àº—ັບເລັດ ຖ້າມີàºàº²àº™àºžàº´àº¡àº¥àº°àº«àº±àº”ຜ່ານບà»à»ˆàº–ືàºàº•້ອງຫຼາàºà»€àº—ື່ອເàºàºµàº™à»„ປ."</string>
+ <string name="policydesc_watchLogin" product="default" msgid="5712323091846761073">"ຕິດຕາມເບິ່ງຈຳນວນàºàº²àº™àºžàº´àº¡àº¥àº°àº«àº±àº”ຜ່ານບà»à»ˆàº–ືàºàº•້ອງ ໃນເວລາປົດລັອàºà»œà»‰àº²àºˆà» à»àº¥àº°àº¥àº±àº­àºà»‚ທລະສັບ ຫຼືລຶບຂà»à»‰àº¡àº¹àº™àº—ັງà»àº»àº”ຂອງໂປລະສັບ ຖ້າມີàºàº²àº™àºžàº´àº¡àº¥àº°àº«àº±àº”ຜ່ານບà»à»ˆàº–ືàºàº•້ອງຫຼາàºà»€àº—ື່ອເàºàºµàº™à»„ປ."</string>
+ <string name="policylab_resetPassword" msgid="2620077191242688955">"ປ່ຽນລະຫັດລັອàºà»œà»‰àº²àºˆà»"</string>
+ <string name="policydesc_resetPassword" msgid="605963962301904458">"ປ່ຽນລະຫັດປົດລັອàºà»œà»‰àº²àºˆà»"</string>
+ <string name="policylab_forceLock" msgid="2274085384704248431">"ລັອàºà»œà»‰àº²àºˆà»"</string>
+ <string name="policydesc_forceLock" msgid="1141797588403827138">"ຄວບຄຸມວ່າໜ້າຈà»àº„ວນຈະຖືàºàº¥àº±àº­àºà»€àº¡àº·à»ˆàº­à»ƒàº” à»àº¥àº°à»àº™àº§à»ƒàº”"</string>
+ <string name="policylab_wipeData" msgid="3910545446758639713">"ລຶບຂà»à»‰àº¡àº¹àº™àº—ັງà»àº»àº”"</string>
+ <string name="policydesc_wipeData" product="tablet" msgid="4306184096067756876">"ລຶບຂà»à»‰àº¡àº¹àº™àº‚ອງà»àº—ັບເລັດໂດàºàºšà»à»ˆàº¡àºµàºàº²àº™à»€àº•ືອນ ໂດàºàºàº²àº™àº£àºµà»€àºŠàº±àº”àºàº±àºšàº„ືນໃຫ້ເປັນà»àºšàºšàº—ີ່ມາຈາàºà»‚ຮງງານ."</string>
+ <string name="policydesc_wipeData" product="default" msgid="5096895604574188391">"ລຶບຂà»à»‰àº¡àº¹àº™àº‚ອງໂທລະສັບໂດàºàºšà»à»ˆàº¡àºµàºàº²àº™à»€àº•ືອນ ໂດàºàºàº²àº™àº£àºµà»€àºŠàº±àº”àºàº±àºšàº„ືນໃຫ້ເປັນà»àºšàºšàº—ີ່ມາຈາàºà»‚ຮງງານ."</string>
+ <string name="policylab_setGlobalProxy" msgid="2784828293747791446">"ປ່ຽນ proxy ຮວມຂອງອຸປະàºàº­àº™"</string>
+ <string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"ຕັ້ງໃຫ້ພຣັອàºàºŠàºµàºªà»ˆàº§àº™àºàº²àº‡àº‚ອງອຸປະàºàº­àº™ ທີ່ຈະໃຊ້ໃນຂະນະທີ່ເປີດນຳໃຊ້ນະໂàºàºšàº²àº. ສະເເພາະຜູ່ເບິ່ງà»àºàº‡àº­àº¸àº›àº°àºàº­àº™àº„ົນທຳອິດເທົ່ານັ້ນ ທີ່ຈະຕັ້ງຄ່າພຣັອàºàºŠàºµàºªà»ˆàº§àº™àºàº²àº‡àº—ີ່ມີຜົນນຳໃຊ້ໄດ້."</string>
+ <string name="policylab_expirePassword" msgid="885279151847254056">"ຕັ້ງວັນà»àº»àº”àºàº³àº™àº»àº”ຂອງລະຫັດລັອàºà»œà»‰àº²àºˆà»"</string>
+ <string name="policydesc_expirePassword" msgid="1729725226314691591">"ຄວບຄຸມຄວາມຖີ່ໃນàºàº²àº™àº›à»ˆàº½àº™àº¥àº°àº«àº±àº”ໜ້າຈà»àº¥àº±àº­àº."</string>
+ <string name="policylab_encryptedStorage" msgid="8901326199909132915">"ຕັ້ງຄ່າàºàº²àº™à»€àº‚ົ້າລະຫັດທີ່ເàºàº±àºšàº‚à»à»‰àº¡àº¹àº™"</string>
+ <string name="policydesc_encryptedStorage" msgid="2637732115325316992">"ຮຽàºàº®à»‰àº­àº‡à»ƒàº«à»‰àº¡àºµàºàº²àº™à»€àº‚ົ້າລະຫັດຂà»à»‰àº¡àº¹àº™àº—ີ່ຈັດເàºàº±àºšà»ƒàº™à»àº­àº±àºšàº¯"</string>
+ <string name="policylab_disableCamera" msgid="6395301023152297826">"ປິດàºàº²àº™à»ƒàºŠà»‰àºà»‰àº­àº‡"</string>
+ <string name="policydesc_disableCamera" msgid="2306349042834754597">"ຫ້າມàºàº²àº™à»ƒàºŠà»‰àºà»‰àº­àº‡àºˆàº²àºàº—ຸàºàº­àº¸àº›àº°àºàº­àº™."</string>
+ <string name="policylab_disableKeyguardFeatures" msgid="266329104542638802">"ປິດàºàº²àº™àº™àº³à»ƒàºŠà»‰àºàº²àº™àº¥àº±àº­àºàº›àº¸à»ˆàº¡"</string>
+ <string name="policydesc_disableKeyguardFeatures" msgid="3467082272186534614">"ປ້ອງàºàº±àº™àºàº²àº™à»ƒàºŠà»‰àº„ວາມສາມາດບາງສ່ວນໃນàºàº²àº™àº¥àº±àº­àºàº›àº¸à»ˆàº¡."</string>
+ <string-array name="phoneTypes">
+ <item msgid="8901098336658710359">"ເຮືອນ"</item>
+ <item msgid="869923650527136615">"ມືຖື"</item>
+ <item msgid="7897544654242874543">"ວຽàº"</item>
+ <item msgid="1103601433382158155">"à»àºŸàº±àºàºšà»ˆàº­àº™à»€àº®àº±àº”ວຽàº"</item>
+ <item msgid="1735177144948329370">"à»àºŸàº±àºà»€àº®àº·àº­àº™"</item>
+ <item msgid="603878674477207394">"ເພàºà»€àºˆàºµ"</item>
+ <item msgid="1650824275177931637">"ອື່ນໆ"</item>
+ <item msgid="9192514806975898961">"àºàº³àº™àº»àº”ເອງ"</item>
+ </string-array>
+ <string-array name="emailAddressTypes">
+ <item msgid="8073994352956129127">"ເຮືອນ"</item>
+ <item msgid="7084237356602625604">"ວຽàº"</item>
+ <item msgid="1112044410659011023">"ອື່ນໆ"</item>
+ <item msgid="2374913952870110618">"àºàº³àº™àº»àº”ເອງ"</item>
+ </string-array>
+ <string-array name="postalAddressTypes">
+ <item msgid="6880257626740047286">"ເຮືອນ"</item>
+ <item msgid="5629153956045109251">"ວຽàº"</item>
+ <item msgid="4966604264500343469">"ອື່ນໆ"</item>
+ <item msgid="4932682847595299369">"àºàº³àº™àº»àº”ເອງ"</item>
+ </string-array>
+ <string-array name="imAddressTypes">
+ <item msgid="1738585194601476694">"ເຮືອນ"</item>
+ <item msgid="1359644565647383708">"ບ່ອນເຮັດວຽàº"</item>
+ <item msgid="7868549401053615677">"ອື່ນໆ"</item>
+ <item msgid="3145118944639869809">"àºàº³àº™àº»àº”ເອງ"</item>
+ </string-array>
+ <string-array name="organizationTypes">
+ <item msgid="7546335612189115615">"ບ່ອນເຮັດວຽàº"</item>
+ <item msgid="4378074129049520373">"ອື່ນໆ"</item>
+ <item msgid="3455047468583965104">"àºàº³àº™àº»àº”ເອງ"</item>
+ </string-array>
+ <string-array name="imProtocols">
+ <item msgid="8595261363518459565">"AIM"</item>
+ <item msgid="7390473628275490700">"Windows Live"</item>
+ <item msgid="7882877134931458217">"Yahoo"</item>
+ <item msgid="5035376313200585242">"Skype"</item>
+ <item msgid="7532363178459444943">"QQ"</item>
+ <item msgid="3713441034299660749">"Google Talk"</item>
+ <item msgid="2506857312718630823">"ICQ"</item>
+ <item msgid="1648797903785279353">"Jabber"</item>
+ </string-array>
+ <string name="phoneTypeCustom" msgid="1644738059053355820">"àºàº³àº™àº»àº”ເອງ"</string>
+ <string name="phoneTypeHome" msgid="2570923463033985887">"ເຮືອນ"</string>
+ <string name="phoneTypeMobile" msgid="6501463557754751037">"ມືຖື"</string>
+ <string name="phoneTypeWork" msgid="8863939667059911633">"ບ່ອນເຮັດວຽàº"</string>
+ <string name="phoneTypeFaxWork" msgid="3517792160008890912">"à»àºŸàº±àºàºšà»ˆàº­àº™à»€àº®àº±àº”ວຽàº"</string>
+ <string name="phoneTypeFaxHome" msgid="2067265972322971467">"à»àºŸàº±àºà»€àº®àº·àº­àº™"</string>
+ <string name="phoneTypePager" msgid="7582359955394921732">"ເພàºà»€àºˆàºµ"</string>
+ <string name="phoneTypeOther" msgid="1544425847868765990">"ອື່ນໆ"</string>
+ <string name="phoneTypeCallback" msgid="2712175203065678206">"ໂທàºàº±àºš"</string>
+ <string name="phoneTypeCar" msgid="8738360689616716982">"ລົດ"</string>
+ <string name="phoneTypeCompanyMain" msgid="540434356461478916">"ເບີໂທຫຼັàºàºšà»àº¥àº´àºªàº±àº”"</string>
+ <string name="phoneTypeIsdn" msgid="8022453193171370337">"ISDN"</string>
+ <string name="phoneTypeMain" msgid="6766137010628326916">"ຫຼັàº"</string>
+ <string name="phoneTypeOtherFax" msgid="8587657145072446565">"à»àºŸàº±àºàº­àº·à»ˆàº™à»†"</string>
+ <string name="phoneTypeRadio" msgid="4093738079908667513">"ວິທະàºàº¸"</string>
+ <string name="phoneTypeTelex" msgid="3367879952476250512">"ໂທລະສານ"</string>
+ <string name="phoneTypeTtyTdd" msgid="8606514378585000044">"TTY TDD"</string>
+ <string name="phoneTypeWorkMobile" msgid="1311426989184065709">"ໂທລະສັບມືຖືບ່ອນເຮັດວຽàº"</string>
+ <string name="phoneTypeWorkPager" msgid="649938731231157056">"ເພàºà»€àºˆàºµàºšà»ˆàº­àº™à»€àº®àº±àº”ວຽàº"</string>
+ <string name="phoneTypeAssistant" msgid="5596772636128562884">"ຜູ່ຊ່ວàº"</string>
+ <string name="phoneTypeMms" msgid="7254492275502768992">"MMS"</string>
+ <string name="eventTypeCustom" msgid="7837586198458073404">"àºàº³àº™àº»àº”ເອງ"</string>
+ <string name="eventTypeBirthday" msgid="2813379844211390740">"ວັນເດືອນປີເàºàºµàº”"</string>
+ <string name="eventTypeAnniversary" msgid="3876779744518284000">"ວັນຄົບຮອບ"</string>
+ <string name="eventTypeOther" msgid="7388178939010143077">"ອື່ນໆ"</string>
+ <string name="emailTypeCustom" msgid="8525960257804213846">"àºàº³àº™àº»àº”ເອງ"</string>
+ <string name="emailTypeHome" msgid="449227236140433919">"ເຮືອນ"</string>
+ <string name="emailTypeWork" msgid="3548058059601149973">"ວຽàº"</string>
+ <string name="emailTypeOther" msgid="2923008695272639549">"ອື່ນໆ"</string>
+ <string name="emailTypeMobile" msgid="119919005321166205">"ມືຖື"</string>
+ <string name="postalTypeCustom" msgid="8903206903060479902">"àºàº³àº™àº»àº”ເອງ"</string>
+ <string name="postalTypeHome" msgid="8165756977184483097">"ເຮືອນ"</string>
+ <string name="postalTypeWork" msgid="5268172772387694495">"ຫ້ອງàºàº²àº™"</string>
+ <string name="postalTypeOther" msgid="2726111966623584341">"ອື່ນໆ"</string>
+ <string name="imTypeCustom" msgid="2074028755527826046">"àºàº³àº™àº»àº”ເອງ"</string>
+ <string name="imTypeHome" msgid="6241181032954263892">"ເຮືອນ"</string>
+ <string name="imTypeWork" msgid="1371489290242433090">"ວຽàº"</string>
+ <string name="imTypeOther" msgid="5377007495735915478">"ອື່ນໆ"</string>
+ <string name="imProtocolCustom" msgid="6919453836618749992">"àºàº³àº™àº»àº”ເອງ"</string>
+ <string name="imProtocolAim" msgid="7050360612368383417">"AIM"</string>
+ <string name="imProtocolMsn" msgid="144556545420769442">"Windows Live"</string>
+ <string name="imProtocolYahoo" msgid="8271439408469021273">"Yahoo"</string>
+ <string name="imProtocolSkype" msgid="9019296744622832951">"Skype"</string>
+ <string name="imProtocolQq" msgid="8887484379494111884">"QQ"</string>
+ <string name="imProtocolGoogleTalk" msgid="493902321140277304">"Hangouts"</string>
+ <string name="imProtocolIcq" msgid="1574870433606517315">"ICQ"</string>
+ <string name="imProtocolJabber" msgid="2279917630875771722">"Jabber"</string>
+ <string name="imProtocolNetMeeting" msgid="8287625655986827971">"NetMeeting"</string>
+ <string name="orgTypeWork" msgid="29268870505363872">"ວຽàº"</string>
+ <string name="orgTypeOther" msgid="3951781131570124082">"ອື່ນໆ"</string>
+ <string name="orgTypeCustom" msgid="225523415372088322">"àºàº³àº™àº»àº”ເອງ"</string>
+ <string name="relationTypeCustom" msgid="3542403679827297300">"àºàº³àº™àº»àº”ເອງ"</string>
+ <string name="relationTypeAssistant" msgid="6274334825195379076">"ຜູ່ຊ່ວàº"</string>
+ <string name="relationTypeBrother" msgid="8757913506784067713">"ອ້າàº-ນ້ອງ"</string>
+ <string name="relationTypeChild" msgid="1890746277276881626">"ລູàº"</string>
+ <string name="relationTypeDomesticPartner" msgid="6904807112121122133">"ຮຸ້ນສ່ວນພາàºà»ƒàº™"</string>
+ <string name="relationTypeFather" msgid="5228034687082050725">"ພà»à»ˆ"</string>
+ <string name="relationTypeFriend" msgid="7313106762483391262">"à»àº¹à»ˆà»€àºžàº·à»ˆàº­àº™"</string>
+ <string name="relationTypeManager" msgid="6365677861610137895">"ຜູ່ຈັດàºàº²àº™"</string>
+ <string name="relationTypeMother" msgid="4578571352962758304">"à»àº¡à»ˆ"</string>
+ <string name="relationTypeParent" msgid="4755635567562925226">"ພà»à»ˆà»àº¡à»ˆ"</string>
+ <string name="relationTypePartner" msgid="7266490285120262781">"ຮຸ້ນສ່ວນ"</string>
+ <string name="relationTypeReferredBy" msgid="101573059844135524">"à»àº™àº°àº™àº³à»‚ດàº"</string>
+ <string name="relationTypeRelative" msgid="1799819930085610271">"àºàº²àº”ຕິພີ່ນ້ອງ"</string>
+ <string name="relationTypeSister" msgid="1735983554479076481">"ເອື້ອàº-ນ້ອງ"</string>
+ <string name="relationTypeSpouse" msgid="394136939428698117">"ຜົວເມàº"</string>
+ <string name="sipAddressTypeCustom" msgid="2473580593111590945">"àºàº³àº™àº»àº”ເອງ"</string>
+ <string name="sipAddressTypeHome" msgid="6093598181069359295">"ເຮືອນ"</string>
+ <string name="sipAddressTypeWork" msgid="6920725730797099047">"ບ່ອນເຮັດວຽàº"</string>
+ <string name="sipAddressTypeOther" msgid="4408436162950119849">"ອື່ນໆ"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"ພິມລະຫັດ PIN"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"ພິມລະຫັດ PUK à»àº¥àº°â€‹àº¥àº°â€‹àº«àº±àº” PIN ອັນໃà»à»ˆ"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"ລະ​ຫັດ PUK"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"ລະຫັດ PIN ໃà»à»ˆ"</string>
+ <string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"à»àº•ະເພື່ອພິມລະຫັດຜ່ານ"</font></string>
+ <string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"ພິມລະຫັດເພື່ອປົດລັອàº"</string>
+ <string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"ພິມລະຫັດ PIN ເພື່ອປົດລັອàº"</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"ລະຫັດ PIN ບà»à»ˆàº–ືàºàº•້ອງ."</string>
+ <string name="keyguard_label_text" msgid="861796461028298424">"ເພື່ອປົດລັອàº, ໃຫ້àºàº»àº”ເມນູ à»àº¥à»‰àº§àºàº»àº” 0."</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"ເບີໂທສຸàºà»€àºªàºµàº™"</string>
+ <string name="lockscreen_carrier_default" msgid="8963839242565653192">"ບà»à»ˆàº¡àºµàºšà»àº¥àº´àºàº²àº™."</string>
+ <string name="lockscreen_screen_locked" msgid="7288443074806832904">"ລັອàºà»œà»‰àº²àºˆà»à»àº¥à»‰àº§."</string>
+ <string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"àºàº»àº” ເມນູ ເພື່ອປົດລັອຠຫຼື ໂທອອàºàº«àº²à»€àºšàºµàºªàº¸àºà»€àºªàºµàº™."</string>
+ <string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"àºàº»àº” \"ເມນູ\" ເພື່ອປົດລັອàº."</string>
+ <string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"à»àº•້ມຮູບà»àºšàºšà»€àºžàº·à»ˆàº­àº›àº»àº”ລັອàº"</string>
+ <string name="lockscreen_emergency_call" msgid="5347633784401285225">"ໂທສຸàºà»€àºªàºµàº™"</string>
+ <string name="lockscreen_return_to_call" msgid="5244259785500040021">"àºàº±àºšà»„ປຫາàºàº²àº™à»‚ທ"</string>
+ <string name="lockscreen_pattern_correct" msgid="9039008650362261237">"ຖືàºàº•້ອງ!"</string>
+ <string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"ລອງໃà»à»ˆàº­àºµàºàº„ັ້ງ"</string>
+ <string name="lockscreen_password_wrong" msgid="5737815393253165301">"ທົດລອງອີàºàº„ັ້ງ"</string>
+ <string name="faceunlock_multiple_failures" msgid="754137583022792429">"ຄວາມພະàºàº²àºàº²àº¡àº›àº»àº”ລັອàºàº”້ວàºà»œà»‰àº²àº™àº±à»‰àº™ ເàºàºµàº™àºˆàº³àº™àº§àº™àº—ີ່àºàº³àº™àº»àº”à»àº¥à»‰àº§"</string>
+ <string name="lockscreen_plugged_in" msgid="8057762828355572315">"àºàº³àº¥àº±àº‡àºªàº²àº <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+ <string name="lockscreen_charged" msgid="321635745684060624">"ສາàºà»€àº•ັມà»àº¥à»‰àº§."</string>
+ <string name="lockscreen_battery_short" msgid="4477264849386850266">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+ <string name="lockscreen_low_battery" msgid="1482873981919249740">"ເຊື່ອມຕà»à»ˆàºªàº²àºàºªàº²àºàº‚ອງທ່ານ."</string>
+ <string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"ບà»à»ˆàº¡àºµ SIM card."</string>
+ <string name="lockscreen_missing_sim_message" product="tablet" msgid="151659196095791474">"ບà»à»ˆàº¡àºµàºŠàº´àº¡àºàº²àº”ໃນà»àº—ັບເລັດ."</string>
+ <string name="lockscreen_missing_sim_message" product="default" msgid="2186920585695169078">"ບà»à»ˆàº¡àºµ SIM card ໃນໂທລະສັບ."</string>
+ <string name="lockscreen_missing_sim_instructions" msgid="5372787138023272615">"ໃສ່ຊິມàºàº²àº”."</string>
+ <string name="lockscreen_missing_sim_instructions_long" msgid="3526573099019319472">"ບà»à»ˆàº¡àºµàºŠàº´àº¡àºàº²àº” ຫຼືອ່ານຊິມàºàº²àº”ບà»à»ˆà»„ດ້. ໃສ່ຊິມàºàº²àº”."</string>
+ <string name="lockscreen_permanent_disabled_sim_message_short" msgid="5096149665138916184">"SIM card ບà»à»ˆàºªàº²àº¡àº²àº”ໃຊ້ໄດ້."</string>
+ <string name="lockscreen_permanent_disabled_sim_instructions" msgid="910904643433151371">"ຊິມàºàº²àº”ຂອງທ່ານຖືàºàº›àº´àº”àºàº²àº™àº™àº³à»ƒàºŠà»‰àº¢à»ˆàº²àº‡àº–າວອນà»àº¥à»‰àº§.\n àºàº°àº¥àº¸àº™àº²àº•ິດຕà»à»ˆàºœàº¹à»ˆà»ƒàº«à»‰àºšà»àº¥àº´àºàº²àº™à»‚ທລະສັບຂອງທ່ານ ເພື່ອຂà»à»€àº­àº»àº²àºŠàº´àº¡àºàº²àº”ໃà»à»ˆ."</string>
+ <string name="lockscreen_transport_prev_description" msgid="201594905152746886">"ປຸ່ມເພງàºà»ˆàº­àº™à»œà»‰àº²àº™àºµà»‰"</string>
+ <string name="lockscreen_transport_next_description" msgid="6089297650481292363">"ປຸ່ມເພງຕà»à»ˆà»„ປ"</string>
+ <string name="lockscreen_transport_pause_description" msgid="7659088786780128001">"ປຸ່ມຢຸດຊົ່ວຄາວ"</string>
+ <string name="lockscreen_transport_play_description" msgid="5888422938351019426">"ປຸ່ມຫຼິ້ນ"</string>
+ <string name="lockscreen_transport_stop_description" msgid="4562318378766987601">"ປຸ່ມຢຸດ"</string>
+ <string name="emergency_calls_only" msgid="6733978304386365407">"ສຳລັບàºàº²àº™à»‚ທສຸàºà»€àºªàºµàº™à»€àº—ົ່ານັ້ນ"</string>
+ <string name="lockscreen_network_locked_message" msgid="143389224986028501">"ເຄືອຂ່າàºàº–ືàºàº¥àº±àº­àº"</string>
+ <string name="lockscreen_sim_puk_locked_message" msgid="7441797339976230">"SIM card ຖືàºàº¥àº±àº­àºàº”້ວàºàº¥àº°àº«àº±àº” PUK."</string>
+ <string name="lockscreen_sim_puk_locked_instructions" msgid="8127916255245181063">"ເບິ່ງຄູ່ມືຜູ່ໃຊ້ ຫຼືຕິດຕà»à»ˆàºªàº¹àº™àºšà»àº¥àº´àºàº²àº™àº¥àº¹àºàº„້າ."</string>
+ <string name="lockscreen_sim_locked_message" msgid="8066660129206001039">"SIM card ຖືàºàº¥àº±àº­àº."</string>
+ <string name="lockscreen_sim_unlock_progress_dialog_message" msgid="595323214052881264">"àºàº³àº¥àº±àº‡àº›àº»àº”ລັອàºàºŠàº´àº¡àºàº²àº”..."</string>
+ <string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="6481623830344107222">"ທ່ານà»àº•້ມຮູບà»àºšàºšàº›àº»àº”ລັອàºàºšà»à»ˆàº–ືຠ<xliff:g id="NUMBER_0">%d</xliff:g> ເທື່ອà»àº¥à»‰àº§. \n\nລອງໃà»à»ˆà»ƒàº™àº­àºµàº <xliff:g id="NUMBER_1">%d</xliff:g> ວິນາທີ."</string>
+ <string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="2725973286239344555">"ທ່ານພິມລະຫັດຜ່ານຜິດ <xliff:g id="NUMBER_0">%d</xliff:g> ເທື່ອà»àº¥à»‰àº§. \n\nໃຫ້ລອງໃà»à»ˆàº­àºµàºàº„ັ້ງໃນອີຠ<xliff:g id="NUMBER_1">%d</xliff:g> ວິນາທີ."</string>
+ <string name="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="6216672706545696955">"ທ່ານພິມລະຫັດ PIN ຂອງທ່ານຜິດ <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" product="tablet" msgid="9191611984625460820">"ທ່ານà»àº•້ມຮູບà»àºšàºšàº›àº»àº”ລັອàºàº‚ອງທ່ານຜິດ <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_failed_attempts_almost_glogin" product="default" msgid="2590227559763762751">"ທ່ານà»àº•້ມຮູບà»àºšàºšàº›àº»àº”ລັອàºàºœàº´àº” <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_failed_attempts_almost_at_wipe" product="tablet" msgid="6128106399745755604">"ທ່ານພະàºàº²àºàº²àº¡àº›àº±àº”ລັອàºà»àº—ັບເລັດຜິດ <xliff:g id="NUMBER_0">%d</xliff:g> ເທື່ອà»àº¥à»‰àº§. ຫຼັງຈາàºàºœàº´àº”ອີຠ<xliff:g id="NUMBER_1">%d</xliff:g> ເທື່ອ, à»àº—ັບເລັດຈະຖືàºàº£àºµà»€àºŠàº±àº”ໃຫ້ເປັນà»àºšàºšàº—ີ່ມາຈາàºà»‚ຮງງານ à»àº¥àº°àº‚à»à»‰àº¡àº¹àº™àº—ັງà»àº»àº”ຈະຖືàºàº«àº²àºà»„ປ."</string>
+ <string name="lockscreen_failed_attempts_almost_at_wipe" product="default" msgid="8603565142156826565">"ທ່ານໄດ້ພະàºàº²àºàº²àº¡àº›àº»àº”ລັອàºà»‚ທລະສັບເປັນຈຳນວນ <xliff:g id="NUMBER_0">%d</xliff:g> ເທື່ອà»àº¥à»‰àº§. ຫຼັງຈາàºàºàº²àº™àºžàº°àºàº²àºàº²àº¡àº­àºµàº <xliff:g id="NUMBER_1">%d</xliff:g> ເທື່ອà»àº¥à»‰àº§àºšà»à»ˆàºªàº³à»€àº¥àº±àº”ຜົນ, ໂທລະສັບຈະຖືàºàº•ັ້ງຄ່າໃຫ້ເປັນຄ່າຈາàºà»‚ຮງງານ à»àº¥àº°àº‚à»à»‰àº¡àº¹àº™àº—ັງà»àº»àº”ຈະສູນຫາàºà»„ປ."</string>
+ <string name="lockscreen_failed_attempts_now_wiping" product="tablet" msgid="280873516493934365">"ທ່ານພະàºàº²àºàº²àº¡àº›àº»àº”ລັອàºà»àº—ັບເລັດຜິດ <xliff:g id="NUMBER">%d</xliff:g> ເທື່ອà»àº¥à»‰àº§. ຕອນນີ້à»àº—ັບເລັດຈະຖືàºàº£àºµà»€àºŠàº±àº”ເປັນຄ່າຈາàºà»‚ຮງງານ."</string>
+ <string name="lockscreen_failed_attempts_now_wiping" product="default" msgid="3025504721764922246">"ທ່ານໄດ້ພະàºàº²àºàº²àº¡àº›àº»àº”ລັອàºà»‚ທລະສັບຜິດ <xliff:g id="NUMBER">%d</xliff:g> ເທື່ອà»àº¥à»‰àº§. ໂທລະສັບຈະຖືàºàº£àºµà»€àºŠàº±àº”ໃຫ້ເປັນຄ່າທີ່ມາຈາàºà»‚ຮງງານ."</string>
+ <string name="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"ທົດລອງອີàºàº„ັ້ງໃນອີຠ<xliff:g id="NUMBER">%d</xliff:g> ວິນາທີ."</string>
+ <string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"ລືມຮູບà»àºšàºšàº›àº»àº”ລັອàº?"</string>
+ <string name="lockscreen_glogin_forgot_pattern" msgid="2588521501166032747">"ປົດລັອàºàºšàº±àº™àºŠàºµ"</string>
+ <string name="lockscreen_glogin_too_many_attempts" msgid="2751368605287288808">"ພະàºàº²àºàº²àº¡à»ƒàºŠà»‰àº®àº¹àºšà»àºšàºšàº›àº»àº”ລັອàºàºœàº´àº”ຫຼາàºà»€àº—ື່ອເàºàºµàº™à»„ປ"</string>
+ <string name="lockscreen_glogin_instructions" msgid="3931816256100707784">"ເພື່ອປົດລັອàº, ໃຫ້ເຂົ້າສູ່ລະບົບດ້ວàºàºšàº±àº™àºŠàºµ Google ຂອງທ່ານ."</string>
+ <string name="lockscreen_glogin_username_hint" msgid="8846881424106484447">"ຊື່ຜູ່ໃຊ້ (ອີເມວ)"</string>
+ <string name="lockscreen_glogin_password_hint" msgid="5958028383954738528">"ລະຫັດຜ່ານ"</string>
+ <string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"ເຂົ້າສູ່ລະບົບ"</string>
+ <string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"ຊື່ຜູ່ໃຊ້ ຫຼືລະຫັດຜ່ານບà»à»ˆàº–ືàºàº•້ອງ"</string>
+ <string name="lockscreen_glogin_account_recovery_hint" msgid="1696924763690379073">"ລືມຊື່ຜູ່ໃຊ້ ຫຼືລະຫັດຜ່ານຂອງທ່ານບ�\nໄປທີ່ "<b>"google.com/accounts/recovery"</b>"."</string>
+ <string name="lockscreen_glogin_checking_password" msgid="7114627351286933867">"àºàº³àº¥àº±àº‡àºàº§àº”ສອບ..."</string>
+ <string name="lockscreen_unlock_label" msgid="737440483220667054">"ປົດລັອàº"</string>
+ <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"ເປີດສຽງà»àº¥à»‰àº§"</string>
+ <string name="lockscreen_sound_off_label" msgid="996822825154319026">"ປິດສຽງ"</string>
+ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"ຮູບà»àºšàºšà»€àº¥àºµà»ˆàº¡àº•ົ້ນà»àº¥à»‰àº§"</string>
+ <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"ລຶບລ້າງຮູບà»àºšàºšà»àº¥à»‰àº§"</string>
+ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"ຕາລາງຖືàºà»€àºžàºµà»ˆàº¡à»àº¥à»‰àº§"</string>
+ <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"ຮູບà»àºšàºšàºªàº³à»€àº¥àº±àº”à»àº¥à»‰àº§"</string>
+ <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. ວິດເຈັດ %2$d ຈາàºàº—ັງà»àº»àº” %3$d."</string>
+ <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"ເພີ່ມວິດເຈັດ"</string>
+ <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"ຫວ່າງເປົ່າ"</string>
+ <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"ຂະຫàºàº²àºàºžàº·à»‰àº™àº—ີ່ປົດລັອàºà»àº¥à»‰àº§."</string>
+ <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"ຫàºà»à»‰àºžàº·à»‰àº™àº—ີ່ປົດລັອàºà»àº¥à»‰àº§."</string>
+ <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> ວິດເຈັດ."</string>
+ <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"ໂຕເລືອàºàº‚ອງຜູ່ໃຊ້"</string>
+ <string name="keyguard_accessibility_status" msgid="8008264603935930611">"ສະຖານະ"</string>
+ <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"àºà»‰àº­àº‡"</string>
+ <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"àºàº²àº™àº„ວບຄຸມສື່"</string>
+ <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"àºàº²àº™àºˆàº±àº”ຮຽງວິເຈັດໃà»à»ˆà»€àº¥àºµà»ˆàº¡àº•ົ້ນà»àº¥à»‰àº§."</string>
+ <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"àºàº²àº™àºˆàº±àº”ຮຽງວິດເຈັດຄືນໃà»à»ˆàºªàº³à»€àº¥àº±àº”à»àº¥à»‰àº§."</string>
+ <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"ລຶບວິດເຈັດ <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> à»àº¥à»‰àº§."</string>
+ <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"ຂະຫàºàº²àºàº‚ອບເຂດປົດລັອàº."</string>
+ <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"àºàº²àº™àº›àº»àº”ລັອàºàº”້ວàºàºàº²àº™à»€àº¥àº·à»ˆàº­àº™."</string>
+ <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"ປົດລັອàºàº”້ວàºàº®àº¹àºšà»àºšàºš."</string>
+ <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"ປົດລັອàºàº”້ວàºà»œà»‰àº²."</string>
+ <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"ປົດລັອàºàº”້ວຠPIN."</string>
+ <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"àºàº²àº™àº›àº»àº”ລັອàºàº”້ວàºàº¥àº°àº«àº±àº”ຜ່ານ."</string>
+ <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"ພື້ນທີ່ຮູບà»àºšàºš."</string>
+ <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"ເລື່ອນພື້ນທີ່."</string>
+ <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
+ <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
+ <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
+ <string name="granularity_label_character" msgid="7336470535385009523">"ໂຕອັàºàºªàº­àº™"</string>
+ <string name="granularity_label_word" msgid="7075570328374918660">"ຄຳສັບ"</string>
+ <string name="granularity_label_link" msgid="5815508880782488267">"ລິ້ງ"</string>
+ <string name="granularity_label_line" msgid="5764267235026120888">"ເສັ້ນ"</string>
+ <string name="hour_ampm" msgid="4584338083529355982">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
+ <string name="hour_cap_ampm" msgid="2083465992940444366">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
+ <string name="factorytest_failed" msgid="5410270329114212041">"àºàº²àº™àº—ົດສອບຈາàºà»‚ຮງງານລົ້ມເຫລວ"</string>
+ <string name="factorytest_not_system" msgid="4435201656767276723">"àºàº²àº™à»€àº®àº±àº” FACTORY_TEST ຮອງຮັບສະເພາະà»àºžàº±àºà»€àºàº”ທີ່ຖືàºàº•ິດຕັ້ງໃນ /system/app ເທົ່ານັ້ນ."</string>
+ <string name="factorytest_no_action" msgid="872991874799998561">"ບà»à»ˆàºžàº»àºšà»àºžàº±àºà»€àºàº”ທີ່ມີàºàº²àº™à»€àº®àº±àº”ວຽຠFACTORY_TEST."</string>
+ <string name="factorytest_reboot" msgid="6320168203050791643">"ຣີບູດ"</string>
+ <string name="js_dialog_title" msgid="1987483977834603872">"ໜ້າທີ່ຢູ່ທີ່ \"<xliff:g id="TITLE">%s</xliff:g>\" ເວົ້າວ່າ:"</string>
+ <string name="js_dialog_title_default" msgid="6961903213729667573">"JavaScript"</string>
+ <string name="js_dialog_before_unload_title" msgid="2619376555525116593">"ຢືນຢັນàºàº²àº™àº™àº³àº—າງ"</string>
+ <string name="js_dialog_before_unload_positive_button" msgid="3112752010600484130">"ອອàºàºˆàº²àºà»œà»‰àº²àº™àºµà»‰"</string>
+ <string name="js_dialog_before_unload_negative_button" msgid="5614861293026099715">"ຢູ່ທີ່ໜ້ານີ້ຕà»à»ˆà»„ປ"</string>
+ <string name="js_dialog_before_unload" msgid="3468816357095378590">"<xliff:g id="MESSAGE">%s</xliff:g>\n\nທ່ານà»àº™à»ˆà»ƒàºˆàºšà»à»ˆàº§à»ˆàº²àº•້ອງàºàº²àº™àº­àº­àºà»„ປຈາàºà»œà»‰àº²àº™àºµà»‰?"</string>
+ <string name="save_password_label" msgid="6860261758665825069">"ຢືນຢັນ"</string>
+ <string name="double_tap_toast" msgid="4595046515400268881">"ເຄັດລັບ: à»àº•ະສອງຄັ້ງເພື່ອຊູມເຂົ້າ à»àº¥àº°àºŠàº¹àº¡àº­àº­àº."</string>
+ <string name="autofill_this_form" msgid="4616758841157816676">"ຕື່ມຂà»à»‰àº¡àº¹àº™àº­àº±àº”ຕະໂນມັດ"</string>
+ <string name="setup_autofill" msgid="7103495070180590814">"ຕັ້ງàºàº²àº™àº•ື່ມຂà»à»‰àº¡àº¹àº™àº­àº±àº”ຕະໂນມັດ"</string>
+ <string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
+ <string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
+ <string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
+ <string name="autofill_address_summary_format" msgid="4874459455786827344">"$1$2$3"</string>
+ <string name="autofill_province" msgid="2231806553863422300">"à»àº‚ວງ"</string>
+ <string name="autofill_postal_code" msgid="4696430407689377108">"ລະຫັດໄປສະນີ"</string>
+ <string name="autofill_state" msgid="6988894195520044613">"ລັດ"</string>
+ <string name="autofill_zip_code" msgid="8697544592627322946">"ລະຫັດ ZIP"</string>
+ <string name="autofill_county" msgid="237073771020362891">"ປະເທດ"</string>
+ <string name="autofill_island" msgid="4020100875984667025">"ເàºàº²àº°"</string>
+ <string name="autofill_district" msgid="8400735073392267672">"ເມືອງ"</string>
+ <string name="autofill_department" msgid="5343279462564453309">"ພະà»àº™àº"</string>
+ <string name="autofill_prefecture" msgid="2028499485065800419">"ເຂດປົàºàº„ອງ"</string>
+ <string name="autofill_parish" msgid="8202206105468820057">"ເຂດàºàº²àº™àº›àº»àºàº„ອງທ້ອງຖິ່ນ"</string>
+ <string name="autofill_area" msgid="3547409050889952423">"ພື້ນທີ່"</string>
+ <string name="autofill_emirate" msgid="2893880978835698818">"ອີມິເຣດ"</string>
+ <string name="permlab_readHistoryBookmarks" msgid="3775265775405106983">"ອ່ານບຸàºàº¡àº²àº à»àº¥àº°àº›àº°àº«àº§àº±àº”ເວັບໄຊຂອງທ່ານ"</string>
+ <string name="permdesc_readHistoryBookmarks" msgid="8462378226600439658">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯ ອ່ານປະຫວັດຂອງ URL ທັງà»àº»àº”ທີ່ໂປຣà»àºàº£àº¡àº—່ອງເວັບເຄີàºà»€àº‚ົ້າເບິ່ງ ຮວມທັງ ບຸàºàº¡àº²àºàº—ັງà»àº»àº”ຂອງໂປຣà»àºàº£àº¡àº—່ອງເວັບນຳ. à»àº²àºà»€àº«àº”: àºàº²àº™àºàº³àº™àº»àº”ສິດນີ້ ອາດບà»à»ˆà»„ດ້ບັງຄັບໃຊ້ໃນໂປຣà»àºàº£àº¡àº—່ອງເວັບພາàºàºªà»ˆàº§àº™àº—ີສາມ ຫຼືà»àº­àº±àºšàºžàº¥àº´à»€àº„ຊັນອື່ນທີ່ມີຄວາມສາມາດທ່ອງເວັບ."</string>
+ <string name="permlab_writeHistoryBookmarks" msgid="3714785165273314490">"ຂຽນຂà»à»‰àº¡àº¹àº™àºšàº¸àºàº¡àº²àº à»àº¥àº°àº›àº°àº«àº§àº±àº”ເວັບໄຊ"</string>
+ <string name="permdesc_writeHistoryBookmarks" product="tablet" msgid="6825527469145760922">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯à»àºà»‰à»„ຂປະຫວັດໃນàºàº²àº™àº—່ອງເວັບ ຫຼືບຸàºàº¡àº²àºàº—ີ່ບັນທຶàºà»ƒàº™à»àº—ັບເລັດຂອງທ່ານ. ນີ້ອາດອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àº¥àº¶àºš ຫຼືà»àºà»‰à»„ຂຂà»à»‰àº¡àº¹àº™à»‚ປຣà»àºàº£àº¡àº—່ອງເວັບໄດ້. à»àº²àºà»€àº«àº”: àºàº²àº™àº­àº°àº™àº¸àºàº²àº”ນີ້ອາດເປັນຜົນບັງຄັບໃຊ້ ຈາàºà»‚ປຣà»àºàº£àº¡àº—່ອງເວັບພາàºàº™àº­àº ຫຼືà»àº­àº±àºšàºžàº¥àº´à»€àº„ຊັນອື່ນທີ່ສາມາດເຂົ້າເວັບໄດ້."</string>
+ <string name="permdesc_writeHistoryBookmarks" product="default" msgid="8497389531014185509">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯ à»àºà»‰à»„ຂປະຫວັດໂປຣà»àºàº£àº¡àº—່ອງເວັບ ຫຼືບຸàºàº¡àº²àºàº—ີ່ເàºàº±àºšà»„ວ້ໃນໂທລະສັບຂອງທ່ານ. ນີ້ອາດອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àº¥àº¶àºš ຫຼືà»àºà»‰à»„ຂຂà»à»‰àº¡àº¹àº™à»‚ປຣà»àºàº£àº¡àº—່ອງເວັບ. à»àº²àºà»€àº«àº”: àºàº²àº™àºàº³àº™àº»àº”ສິດນີ້ ອາດບà»à»ˆà»„ດ້ຖືàºàºšàº±àº‡àº„ັບໃຊ້ໃນໂປຣà»àºàº£àº¡àº—່ອງເວັບພາàºàºªà»ˆàº§àº™àº—ີສາມ ຫຼືà»àº­àº±àºšàºžàº¥àº´à»€àº„ຊັນອື່ນທີ່ມີຄວາມສາມາດທ່ອງເວັບ."</string>
+ <string name="permlab_setAlarm" msgid="1379294556362091814">"ຕັ້ງàºàº²àº™à»àºˆà»‰àº‡à»€àº•ືອນ"</string>
+ <string name="permdesc_setAlarm" msgid="316392039157473848">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àº•ັ້ງໂມງປຸàºà»ƒàº™à»àº­àº±àºšàº¯à»‚ມງປຸàºàº—ີ່ຕິດຕັ້ງໄວ້. ບາງà»àº­àº±àºšàº¯à»‚ມງປຸàºàº­àº²àº”ບà»à»ˆàº¡àºµàº„ຸນສົມບັດà»àºšàºšàº™àºµà»‰à»€àº—ື່ອ."</string>
+ <string name="permlab_addVoicemail" msgid="5525660026090959044">"ເພີ່ມຂà»à»‰àº„ວາມສຽງ"</string>
+ <string name="permdesc_addVoicemail" msgid="6604508651428252437">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯ ສາມາດເພີ່ມຂà»à»‰àº„ວາມໃສ່ອິນບັອàºàº‚à»à»‰àº„ວາມສຽງຂອງທ່ານໄດ້."</string>
+ <string name="permlab_writeGeolocationPermissions" msgid="5962224158955273932">"à»àºà»‰à»„ຂສິດທາງສະຖານທີ່ພູມສາດຂອງໂປຣà»àºàº£àº¡àº—່ອງເວັບ"</string>
+ <string name="permdesc_writeGeolocationPermissions" msgid="1083743234522638747">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯à»àºà»‰à»„ຂ àºàº²àº™àº­àº°àº™àº¸àºàº²àº”ຕຳà»à»œà»ˆàº‡àº—າງພູມສາດ ຂອງໂປຣà»àºàº£àº¡àº—່ອງເວັບ. à»àº­àº±àºšàº¯àº—ີ່ເປັນອັນຕະລາàºàº­àº²àº”ໃຊ້ຄຸນສົມບັດນີ້ ເພື່ອສົ່ງຂà»à»‰àº¡àº¹àº™àºªàº°àº–ານທີ່ໄປໃຫ້ເວັບໄຊຕ່າງໆໄດ້."</string>
+ <string name="permlab_packageVerificationAgent" msgid="5568139100645829117">"ຢັ້ງຢືນà»àºžàº±àºà»€àºàº”"</string>
+ <string name="permdesc_packageVerificationAgent" msgid="8437590190990843381">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àº¢àº·àº™àº¢àº±àº™àº§à»ˆàº²à»àºžàº±àºà»€àºàº”ໃດນຶ່ງ ສາມາດຕິດຕັ້ງໄດ້."</string>
+ <string name="permlab_bindPackageVerifier" msgid="4187786793360326654">"ເຊື່ອມໂàºàº‡àºàº±àºšà»‚ຕຢືນຢັນà»àºžàº±àºà»€àºàº”"</string>
+ <string name="permdesc_bindPackageVerifier" msgid="3180741773233862126">"ອະນຸàºàº²àº”ໃຫ້ເຈົ້າຂອງເຮັດàºàº²àº™àº®à»‰àº­àº‡àº‚à»à»‚ຕຢືນຢັນà»àºžàº±àºà»€àºàº±àº”. ບà»à»ˆàºˆàº³à»€àº›àº±àº™àºªàº³àº¥àº±àºšà»àº­àº±àºšàº¯àº—ົ່ວໄປ."</string>
+ <string name="permlab_serialPort" msgid="546083327654631076">"ເຂົ້າເຖິງພອດຊີຣຽວ"</string>
+ <string name="permdesc_serialPort" msgid="2991639985224598193">"ອະນຸàºàº²àº”ໃຫ້ເຈົ້າຂອງສາມາດເຂົ້າເບິ່ງ serial ports ໂດàºàºàº²àº™àº™àº³à»ƒàºŠà»‰ SerialManager API."</string>
+ <string name="permlab_accessContentProvidersExternally" msgid="5077774297943409285">"ເຂົ້າເຖິງຜູ່ສະໜອງເນື້ອຫາພາàºàº™àº­àº"</string>
+ <string name="permdesc_accessContentProvidersExternally" msgid="4544346486697853685">"ຊ່ວàºà»ƒàº«à»‰à»€àºˆàº»à»‰àº²àº‚ອງສາມາດ ເຂົ້າເຖິງຜູ່ໃຫ້ບà»àº¥àº´àºàº²àº™à»€àº™àº·à»‰àº­àº«àº²àºˆàº²àºà»œà»‰àº² shell ໄດ້. à»àº­àº±àºšàºžàº¥àº´à»€àº„ຊັນທົ່ວໄປບà»à»ˆàº„ວນຈຳເປັນຕ້ອງໃຊ້."</string>
+ <string name="permlab_updateLock" msgid="3527558366616680889">"ປ້ອງàºàº±àº™àºàº²àº™àº­àº±àºšà»€àº”ດອຸປະàºàº­àº™à»‚ດàºàº­àº±àº”ຕະໂນມັດ"</string>
+ <string name="permdesc_updateLock" msgid="1655625832166778492">"ອະນຸàºàº²àº”ໃຫ້ເຈົ້າຂອງàºàº³àº™àº»àº”ຂà»à»‰àº¡àº¹àº™à»ƒàº™àº¥àº°àºšàº»àºš àºà»ˆàº½àº§àºàº±àºšà»€àº§àº¥àº²àº—ີ່ເà»àº²àº°àºªàº»àº¡à»ƒàº™àºàº²àº™àº£àºµàºšàº¹àº”à»àºšàºšàºšà»à»ˆà»‚ຕ້ຕອບ ເພື່ອອັບເàºàº£àº”ອຸປະàºàº­àº™."</string>
+ <string name="save_password_message" msgid="767344687139195790">"ທ່ານຕ້ອງàºàº²àº™à»ƒàº«à»‰à»‚ປຣà»àºàº£àº¡àº—່ອງເວັບນີ້ຈື່ລະຫັດຜ່ານນີ້ບà»à»ˆ?"</string>
+ <string name="save_password_notnow" msgid="6389675316706699758">"ບà»à»ˆà»àº¡à»ˆàº™àº•ອນນີ້"</string>
+ <string name="save_password_remember" msgid="6491879678996749466">"ຈື່ໄວ້"</string>
+ <string name="save_password_never" msgid="8274330296785855105">"ບà»à»ˆàº•້ອງຈື່"</string>
+ <string name="open_permission_deny" msgid="7374036708316629800">"ທ່ານບà»à»ˆà»„ດ້ຮັບອະນຸàºàº²àº”ໃຫ້ເປີດໜ້ານີ້."</string>
+ <string name="text_copied" msgid="4985729524670131385">"ສຳເນົາຂà»à»‰àº„ວາມໃສ່ຄລິບບອດà»àº¥à»‰àº§."</string>
+ <string name="more_item_label" msgid="4650918923083320495">"ເພີ່ມເຕີມ"</string>
+ <string name="prepend_shortcut_label" msgid="2572214461676015642">"ເມນູ+"</string>
+ <string name="menu_space_shortcut_label" msgid="2410328639272162537">"Space"</string>
+ <string name="menu_enter_shortcut_label" msgid="2743362785111309668">"enter"</string>
+ <string name="menu_delete_shortcut_label" msgid="3658178007202748164">"ລຶບ"</string>
+ <string name="search_go" msgid="8298016669822141719">"ຊອàºàº«àº²"</string>
+ <string name="searchview_description_search" msgid="6749826639098512120">"ຊອàºàº«àº²"</string>
+ <string name="searchview_description_query" msgid="5911778593125355124">"ຊອàºàº«àº²"</string>
+ <string name="searchview_description_clear" msgid="1330281990951833033">"ລຶບຂà»à»‰àº„ວາມຊອàºàº«àº²"</string>
+ <string name="searchview_description_submit" msgid="2688450133297983542">"ສົ່ງàºàº²àº™àºŠàº­àºàº«àº²"</string>
+ <string name="searchview_description_voice" msgid="2453203695674994440">"ຊອàºàº«àº²àº”້ວàºàºªàº½àº‡"</string>
+ <string name="enable_explore_by_touch_warning_title" msgid="7460694070309730149">"ເປີດນຳໃຊ້ \"àºàº²àº™àºªàº³àº«àº¼àº§àº”ໂດàºàºªàº³àºžàº±àº”\" ບà»à»ˆ?"</string>
+ <string name="enable_explore_by_touch_warning_message" product="tablet" msgid="8655887539089910577">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> ຕ້ອງàºàº²àº™à»€àº›àºµàº”ນຳໃຊ້ \"àºàº²àº™àºªàº³àº«àº¼àº§àº”ໂດàºàºªàº³àºžàº±àº”\". ເມື່ອເປີດ \"àºàº²àº™àºªàº³àº«àº¼àº§àº”ໂດàºàºªàº³àºžàº±àº”\" à»àº¥à»‰àº§ ທ່ານຈະສາມາດໄດ້àºàº´àº™ ຫຼືເຫັນຄຳບັນàºàº²àºàº§à»ˆàº²àº¡àºµàº«àºàº±àº‡àº¢àº¹à»ˆàºà»‰àº­àº‡àº™àº´à»‰àº§àº¡àº·àº‚ອງທ່ານ ຫຼືໃຊ້ຮູບà»àºšàºšàºàº²àº™à»€àº„ື່ອນໄຫວເພື່ອໂຕ້ຕອບàºàº±àºšà»àº—ັບເລັດ."</string>
+ <string name="enable_explore_by_touch_warning_message" product="default" msgid="2708199672852373195">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> ຕ້ອງàºàº²àº™à»€àº›àºµàº”ນຳໃຊ້ \"àºàº²àº™àºªàº³àº«àº¼àº§àº”ໂດàºàºªàº³àºžàº±àº”\". ເມື່ອເປີດ \"àºàº²àº™àºªàº³àº«àº¼àº§àº”ໂດàºàºªàº³àºžàº±àº”\" à»àº¥à»‰àº§ ທ່ານຈະສາມາດໄດ້àºàº´àº™ ຫຼືເຫັນຄຳບັນàºàº²àºàº§à»ˆàº²àº¡àºµàº«àºàº±àº‡àº¢àº¹à»ˆàºà»‰àº­àº‡àº™àº´à»‰àº§àº¡àº·àº‚ອງທ່ານ ຫຼືໃຊ້ຮູບà»àºšàºšàºàº²àº™à»€àº„ື່ອນໄຫວເພື່ອໂຕ້ຕອບàºàº±àºšà»‚ທລະສັບ."</string>
+ <string name="oneMonthDurationPast" msgid="7396384508953779925">"1 ເດືອນàºà»ˆàº­àº™àº«àº™à»‰àº²àº™àºµà»‰"</string>
+ <string name="beforeOneMonthDurationPast" msgid="909134546836499826">"ຫຼາàºàºàº§à»ˆàº² 1 ເດືອນàºà»ˆàº­àº™"</string>
+ <plurals name="num_seconds_ago">
+ <item quantity="one" msgid="4869870056547896011">"1 ວິນາທີàºà»ˆàº­àº™"</item>
+ <item quantity="other" msgid="3903706804349556379">"<xliff:g id="COUNT">%d</xliff:g> ວິນາທີàºà»ˆàº­àº™à»œà»‰àº²àº™àºµà»‰"</item>
+ </plurals>
+ <plurals name="num_minutes_ago">
+ <item quantity="one" msgid="3306787433088810191">"1 ນາທີàºà»ˆàº­àº™à»œà»‰àº²àº™àºµà»‰"</item>
+ <item quantity="other" msgid="2176942008915455116">"<xliff:g id="COUNT">%d</xliff:g> ນາ​ທີ​ທີ່ຜ່ານມາ"</item>
+ </plurals>
+ <plurals name="num_hours_ago">
+ <item quantity="one" msgid="9150797944610821849">"1 ຊົ່ວໂມງàºà»ˆàº­àº™à»œà»‰àº²àº™àºµà»‰"</item>
+ <item quantity="other" msgid="2467273239587587569">"<xliff:g id="COUNT">%d</xliff:g> ຊົ່ວໂມງທີ່ຜ່ານມາ"</item>
+ </plurals>
+ <plurals name="last_num_days">
+ <item quantity="other" msgid="3069992808164318268">"<xliff:g id="COUNT">%d</xliff:g> ມື້ທີ່ຜ່ານມາ"</item>
+ </plurals>
+ <string name="last_month" msgid="3959346739979055432">"ເດືອນà»àº¥à»‰àº§"</string>
+ <string name="older" msgid="5211975022815554840">"ເàºàº»à»ˆàº²àºàº§à»ˆàº²"</string>
+ <plurals name="num_days_ago">
+ <item quantity="one" msgid="861358534398115820">"ມື້​ວານ​ນີ້"</item>
+ <item quantity="other" msgid="2479586466153314633">"<xliff:g id="COUNT">%d</xliff:g> ມື້​àºà»ˆàº­àº™"</item>
+ </plurals>
+ <plurals name="in_num_seconds">
+ <item quantity="one" msgid="2729745560954905102">"ໃນອີຠ1 ວິນາທີ"</item>
+ <item quantity="other" msgid="1241926116443974687">"ໃນ <xliff:g id="COUNT">%d</xliff:g> ວິ​ນາ​ທີ"</item>
+ </plurals>
+ <plurals name="in_num_minutes">
+ <item quantity="one" msgid="8793095251325200395">"ໃນ 1 ນາທີ"</item>
+ <item quantity="other" msgid="3330713936399448749">"ໃນ <xliff:g id="COUNT">%d</xliff:g> ນາທີ"</item>
+ </plurals>
+ <plurals name="in_num_hours">
+ <item quantity="one" msgid="7164353342477769999">"ໃນ 1 ຊົ່ວໂມງ"</item>
+ <item quantity="other" msgid="547290677353727389">"ໃນ <xliff:g id="COUNT">%d</xliff:g> ຊົ່ວໂມງ"</item>
+ </plurals>
+ <plurals name="in_num_days">
+ <item quantity="one" msgid="5413088743009839518">"ມື້ອື່ນ"</item>
+ <item quantity="other" msgid="5109449375100953247">"ໃນ <xliff:g id="COUNT">%d</xliff:g> ມື້"</item>
+ </plurals>
+ <plurals name="abbrev_num_seconds_ago">
+ <item quantity="one" msgid="1849036840200069118">"1 ວິນາທີàºà»ˆàº­àº™"</item>
+ <item quantity="other" msgid="3699169366650930415">"<xliff:g id="COUNT">%d</xliff:g> ວິ àºà»ˆàº­àº™à»œà»‰àº²àº™àºµà»‰"</item>
+ </plurals>
+ <plurals name="abbrev_num_minutes_ago">
+ <item quantity="one" msgid="6361490147113871545">"1 ນທ àºà»ˆàº­àº™"</item>
+ <item quantity="other" msgid="851164968597150710">"<xliff:g id="COUNT">%d</xliff:g> ນທ àºà»ˆàº­àº™à»œà»‰àº²àº™àºµà»‰"</item>
+ </plurals>
+ <plurals name="abbrev_num_hours_ago">
+ <item quantity="one" msgid="4796212039724722116">"1 ຊົ່ວໂມງàºà»ˆàº­àº™"</item>
+ <item quantity="other" msgid="6889970745748538901">"<xliff:g id="COUNT">%d</xliff:g> ຊົ່ວໂມງàºà»ˆàº­àº™à»œà»‰àº²àº™àºµà»‰"</item>
+ </plurals>
+ <plurals name="abbrev_num_days_ago">
+ <item quantity="one" msgid="8463161711492680309">"ມື້ວານນີ້"</item>
+ <item quantity="other" msgid="3453342639616481191">"<xliff:g id="COUNT">%d</xliff:g> ມື້àºà»ˆàº­àº™à»œà»‰àº²àº™àºµà»‰"</item>
+ </plurals>
+ <plurals name="abbrev_in_num_seconds">
+ <item quantity="one" msgid="5842225370795066299">"ໃນ 1 ວິ"</item>
+ <item quantity="other" msgid="5495880108825805108">"ໃນ <xliff:g id="COUNT">%d</xliff:g> ວິ"</item>
+ </plurals>
+ <plurals name="abbrev_in_num_minutes">
+ <item quantity="one" msgid="562786149928284878">"ໃນ 1 ນາທີ"</item>
+ <item quantity="other" msgid="4216113292706568726">"ໃນ <xliff:g id="COUNT">%d</xliff:g> ນທ"</item>
+ </plurals>
+ <plurals name="abbrev_in_num_hours">
+ <item quantity="one" msgid="3274708118124045246">"ໃນ 1 ຊົ່ວໂມງ"</item>
+ <item quantity="other" msgid="3705373766798013406">"ໃນ <xliff:g id="COUNT">%d</xliff:g> ຊົ່ວໂມງ"</item>
+ </plurals>
+ <plurals name="abbrev_in_num_days">
+ <item quantity="one" msgid="2178576254385739855">"ມື້ອື່ນ"</item>
+ <item quantity="other" msgid="2973062968038355991">"ໃນ <xliff:g id="COUNT">%d</xliff:g> ມື້"</item>
+ </plurals>
+ <string name="preposition_for_date" msgid="9093949757757445117">"ວັນທີ <xliff:g id="DATE">%s</xliff:g>"</string>
+ <string name="preposition_for_time" msgid="5506831244263083793">"ເວລາ <xliff:g id="TIME">%s</xliff:g>"</string>
+ <string name="preposition_for_year" msgid="5040395640711867177">"ໃນ <xliff:g id="YEAR">%s</xliff:g>"</string>
+ <string name="day" msgid="8144195776058119424">"ມື້"</string>
+ <string name="days" msgid="4774547661021344602">"ມື້"</string>
+ <string name="hour" msgid="2126771916426189481">"ຊົ່ວໂມງ"</string>
+ <string name="hours" msgid="894424005266852993">"ຊົ່ວໂມງ"</string>
+ <string name="minute" msgid="9148878657703769868">"ນາທີ"</string>
+ <string name="minutes" msgid="5646001005827034509">"ນທ"</string>
+ <string name="second" msgid="3184235808021478">"ວິ"</string>
+ <string name="seconds" msgid="3161515347216589235">"ວິ"</string>
+ <string name="week" msgid="5617961537173061583">"ອາທິດ"</string>
+ <string name="weeks" msgid="6509623834583944518">"ອາທິດ"</string>
+ <string name="year" msgid="4001118221013892076">"ປີ"</string>
+ <string name="years" msgid="6881577717993213522">"ປິ"</string>
+ <plurals name="duration_seconds">
+ <item quantity="one" msgid="6962015528372969481">"1 ວິນາທີ"</item>
+ <item quantity="other" msgid="1886107766577166786">"<xliff:g id="COUNT">%d</xliff:g> ວິນາທີ"</item>
+ </plurals>
+ <plurals name="duration_minutes">
+ <item quantity="one" msgid="4915414002546085617">"1 ນາ​ທີ"</item>
+ <item quantity="other" msgid="3165187169224908775">"<xliff:g id="COUNT">%d</xliff:g> ນາທີ"</item>
+ </plurals>
+ <plurals name="duration_hours">
+ <item quantity="one" msgid="8917467491248809972">"1 ຊົ່ວ​ໂມງ"</item>
+ <item quantity="other" msgid="3863962854246773930">"<xliff:g id="COUNT">%d</xliff:g> ຊົ່ວໂມງ"</item>
+ </plurals>
+ <string name="VideoView_error_title" msgid="3534509135438353077">"ບັນຫາວິດີໂອ"</string>
+ <string name="VideoView_error_text_invalid_progressive_playback" msgid="3186670335938670444">"ວິດີໂອນີ້ບà»à»ˆàº–ືàºàº•້ອງສຳລັບàºàº²àº™àºªàº°à»àº”ງໃນອຸປະàºàº­àº™àº™àºµà»‰."</string>
+ <string name="VideoView_error_text_unknown" msgid="3450439155187810085">"ບà»à»ˆàºªàº²àº¡àº²àº”ຫຼິ້ນວິດີໂອນີ້ໄດ້."</string>
+ <string name="VideoView_error_button" msgid="2822238215100679592">"ຕົàºàº¥àº»àº‡"</string>
+ <string name="relative_time" msgid="1818557177829411417">"<xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="noon" msgid="7245353528818587908">"ທ່ຽງ"</string>
+ <string name="Noon" msgid="3342127745230013127">"ທ່ຽງ"</string>
+ <string name="midnight" msgid="7166259508850457595">"ທ່ຽງຄືນ"</string>
+ <string name="Midnight" msgid="5630806906897892201">"ທ່ຽງຄືນ"</string>
+ <string name="elapsed_time_short_format_mm_ss" msgid="4431555943828711473">"<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" msgid="1846071997616654124">"<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" msgid="6876518925844129331">"ເລືອàºàº—ັງà»àº»àº”"</string>
+ <string name="cut" msgid="3092569408438626261">"ຕັດ"</string>
+ <string name="copy" msgid="2681946229533511987">"ສຳເນົາ"</string>
+ <string name="paste" msgid="5629880836805036433">"ວາງ"</string>
+ <string name="replace" msgid="5781686059063148930">"à»àº—ນທີ່…"</string>
+ <string name="delete" msgid="6098684844021697789">"ລຶບ"</string>
+ <string name="copyUrl" msgid="2538211579596067402">"ສຳເນົາ URL"</string>
+ <string name="selectTextMode" msgid="1018691815143165326">"ເລືອàºàº‚à»à»‰àº„ວາມ"</string>
+ <string name="textSelectionCABTitle" msgid="5236850394370820357">"àºàº²àº™à»€àº¥àº·àº­àºàº‚à»à»‰àº„ວາມ"</string>
+ <string name="addToDictionary" msgid="4352161534510057874">"ເພີ່ມໄປທີ່ວັດຈະນານຸàºàº»àº¡"</string>
+ <string name="deleteText" msgid="6979668428458199034">"ລຶບ"</string>
+ <string name="inputMethod" msgid="1653630062304567879">"ຮູບà»àºšàºšàºàº²àº™àº›à»‰àº­àº™àº‚à»à»‰àº¡àº¹àº™"</string>
+ <string name="editTextMenuTitle" msgid="4909135564941815494">"àºàº²àº™à»€àº®àº±àº”ວຽàºàº‚ອງຂà»à»‰àº„ວາມ"</string>
+ <string name="low_internal_storage_view_title" msgid="5576272496365684834">"ພື້ນທີ່ຈັດເàºàº±àºšàº‚à»à»‰àº¡àº¹àº™àºàº³àº¥àº±àº‡àºˆàº°à»€àº•ັມ"</string>
+ <string name="low_internal_storage_view_text" msgid="6640505817617414371">"àºàº²àº™à»€àº®àº±àº”ວຽàºàºšàº²àº‡àº¢à»ˆàº²àº‡àº‚ອງລະບົບບາງອາດຈະໃຊ້ບà»à»ˆà»„ດ້"</string>
+ <string name="app_running_notification_title" msgid="8718335121060787914">"<xliff:g id="APP_NAME">%1$s</xliff:g> àºàº³àº¥àº±àº‡à»€àº®àº±àº”ວຽàºàº¢àº¹à»ˆ"</string>
+ <string name="app_running_notification_text" msgid="4653586947747330058">"à»àº•ະເພື່ອເບິ່ງຂà»à»‰àº¡àº¹àº™à»€àºžàºµà»ˆàº¡à»€àº•ີມ ຫຼືເພື່ອຢຸດàºàº²àº™à»€àº®àº±àº”ວຽàºàº‚ອງà»àº­àº±àºšàº¯àº™àºµà»‰."</string>
+ <string name="ok" msgid="5970060430562524910">"ຕົàºàº¥àº»àº‡"</string>
+ <string name="cancel" msgid="6442560571259935130">"àºàº»àºà»€àº¥àºµàº"</string>
+ <string name="yes" msgid="5362982303337969312">"ຕົàºàº¥àº»àº‡"</string>
+ <string name="no" msgid="5141531044935541497">"àºàº»àºà»€àº¥àºµàº"</string>
+ <string name="dialog_alert_title" msgid="2049658708609043103">"àºàº°àº¥àº¸àº™àº²àº®àº±àºšàºŠàº²àºš"</string>
+ <string name="loading" msgid="7933681260296021180">"àºàº³àº¥àº±àº‡à»‚ຫລດ..."</string>
+ <string name="capital_on" msgid="1544682755514494298">"ເປີດ"</string>
+ <string name="capital_off" msgid="6815870386972805832">"ປິດ"</string>
+ <string name="whichApplication" msgid="4533185947064773386">"ເຮັດວຽàºà»ƒàº«à»‰àºªàº³à»€àº¥àº±àº”ໂດàºà»ƒàºŠà»‰"</string>
+ <string name="alwaysUse" msgid="4583018368000610438">"ໃຊ້ໂດàºàº„່າເລີ່ມຕົນສຳລັບàºàº²àº™à»€àº®àº±àº”ວຽàºàº™àºµà»‰."</string>
+ <string name="clearDefaultHintMsg" msgid="3252584689512077257">"ລຶບລ້າງຄ່າເລີ່ມຕົ້ນ ໃນ àºàº²àº™àº•ັ້ງຄ່າລະບົບ &gt; à»àº­àº±àºšàº¯ &gt; ດາວໂຫລດà»àº¥à»‰àº§."</string>
+ <string name="chooseActivity" msgid="7486876147751803333">"ເລືອàºàºàº²àº™àº›àº°àº•ິບັດ"</string>
+ <string name="chooseUsbActivity" msgid="6894748416073583509">"ເລືອàºà»àº­àº±àºšàº¯àºªà»àº²àº¥àº±àºšàº­àº¸àº›àº°àºàº­àº™ USB"</string>
+ <string name="noApplications" msgid="2991814273936504689">"ບà»à»ˆàº¡àºµà»àº­àº±àºšàº¯à»ƒàº”ສາມາດເຮັດວຽàºàº™àºµà»‰à»„ດ້."</string>
+ <string name="aerr_title" msgid="1905800560317137752"></string>
+ <string name="aerr_application" msgid="932628488013092776">"ຂà»àº­àº°à»„ພ, <xliff:g id="APPLICATION">%1$s</xliff:g> ຢຸດàºàº²àº™à»€àº®àº±àº”ວຽàºà»àº¥à»‰àº§."</string>
+ <string name="aerr_process" msgid="4507058997035697579">"ຂà»àº­àº°à»„ພ, ໂປຣເຊສ <xliff:g id="PROCESS">%1$s</xliff:g> ໄດ້ຢຸດàºàº²àº™à»€àº®àº±àº”ວຽàºà»àº¥à»‰àº§."</string>
+ <string name="anr_title" msgid="4351948481459135709"></string>
+ <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> ບà»à»ˆàº•ອບສະໜອງ. \n\nທ່ານຕ້ອງàºàº²àº™àº›àº´àº”ມັນບà»à»ˆ?"</string>
+ <string name="anr_activity_process" msgid="5776209883299089767">"àºàº²àº™à»€àº®àº±àº”ວຽຠ<xliff:g id="ACTIVITY">%1$s</xliff:g> ບà»à»ˆàº•ອບສະໜອງ. \n\n ທ່ານຕ້ອງàºàº²àº™àº—ີ່ຈະປິດມັນບà»à»ˆ?"</string>
+ <string name="anr_application_process" msgid="8941757607340481057">"<xliff:g id="APPLICATION">%1$s</xliff:g> ບà»à»ˆàº•ອບສະໜອງ. ທ່ານຕ້ອງàºàº²àº™àº›àº´àº”ມັນບà»à»ˆ?"</string>
+ <string name="anr_process" msgid="6513209874880517125">"ໂປຣເຊສ <xliff:g id="PROCESS">%1$s</xliff:g> ບà»à»ˆàº•ອບສະໜອງ. \n\n ທ່ານຕ້ອງàºàº²àº™àº›àº´àº”ມັນບà»à»ˆ?"</string>
+ <string name="force_close" msgid="8346072094521265605">"ຕົàºàº¥àº»àº‡"</string>
+ <string name="report" msgid="4060218260984795706">"ລາàºàº‡àº²àº™"</string>
+ <string name="wait" msgid="7147118217226317732">"ລà»â€‹àº–້າ"</string>
+ <string name="webpage_unresponsive" msgid="3272758351138122503">"ໜ້າເວັບບà»à»ˆàº•ອບສະໜອງ.\n\nທ່ານຕ້ອງàºàº²àº™àº—ີ່ຈະປິດມັນບà»à»ˆ?"</string>
+ <string name="launch_warning_title" msgid="1547997780506713581">"à»àº­àº±àºšàº¯àº–ືàºàº›à»ˆàº½àº™à»€àºªàº±à»‰àº™àº—າງ"</string>
+ <string name="launch_warning_replace" msgid="6202498949970281412">"<xliff:g id="APP_NAME">%1$s</xliff:g> àºàº³àº¥àº±àº‡à»€àº®àº±àº”ວຽàºàº¢àº¹à»ˆ."</string>
+ <string name="launch_warning_original" msgid="188102023021668683">"<xliff:g id="APP_NAME">%1$s</xliff:g> ເປີດໃຊ້ໄວ້à»àº¥à»‰àº§."</string>
+ <string name="screen_compat_mode_scale" msgid="3202955667675944499">"ຂະໜາດ"</string>
+ <string name="screen_compat_mode_show" msgid="4013878876486655892">"ສະà»àº”ງຕະຫຼອດເວລາ"</string>
+ <string name="screen_compat_mode_hint" msgid="1064524084543304459">"ເປີດàºàº²àº™à»€àº®àº±àº”ວຽàºàº™àºµà»‰àº„ືນໄດ້ໃນ àºàº²àº™àº•ັ້ງຄ່າລະບົບ &gt; à»àº­àº±àºšàº¯ &gt; ດາວໂຫລດà»àº¥à»‰àº§"</string>
+ <string name="smv_application" msgid="3307209192155442829">"à»àº­àº±àºšàº¯ <xliff:g id="APPLICATION">%1$s</xliff:g> (ໂປຣເຊສ <xliff:g id="PROCESS">%2$s</xliff:g>) ໄດ້ລະເມີດນະໂàºàºšàº²àº StrictMode ທີ່ບັງຄັບໃຊ້ດ້ວàºà»‚ຕເອງ."</string>
+ <string name="smv_process" msgid="5120397012047462446">"ໂປຣເຊສ <xliff:g id="PROCESS">%1$s</xliff:g> ລະເມີດນະໂàºàºšàº²àºàºšàº±àº‡àº„ັບໃຊ້ເອງ StrictMode."</string>
+ <string name="android_upgrading_title" msgid="1584192285441405746">"àºàº³àº¥àº±àº‡àº­àº±àºšà»€àºàº£àº” Android..."</string>
+ <string name="android_upgrading_apk" msgid="7904042682111526169">"àºàº³àº¥àº±àº‡àº›àº±àºšàº›àº¸àº‡àº›àº°àºªàº´àº”ຕິພາບà»àº­àº±àºšàº¯àº—ີ <xliff:g id="NUMBER_0">%1$d</xliff:g> ຈາàºàº—ັງà»àº»àº” <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
+ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"àºàº³àº¥àº±àº‡à»€àº›àºµàº”à»àº­àº±àºšàº¯."</string>
+ <string name="android_upgrading_complete" msgid="1405954754112999229">"àºàº³àº¥àº±àº‡àºªàº³à»€àº¥àº±àº”àºàº²àº™à»€àº›àºµàº”ລະບົບ."</string>
+ <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> àºàº³àº¥àº±àº‡à»€àº®àº±àº”ວຽàº"</string>
+ <string name="heavy_weight_notification_detail" msgid="1721681741617898865">"à»àº•ະເພື່ອສະລັບàºàº±àºšà»„ປຫາà»àº­àº±àºšàº¯"</string>
+ <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"ສະລັບà»àº­àº±àºšàº¯àºšà»à»ˆ?"</string>
+ <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"ທ່ານຈະຕ້ອງຢຸດນຳໃຊ້à»àº­àº±àºšàº¯à»‚ຕອື່ນàºà»ˆàº­àº™ àºà»ˆàº­àº™àº—ີ່ທ່ານຈະເປີດໃຊ້à»àº­àº±àºšàº¯à»ƒà»à»ˆà»„ດ້."</string>
+ <string name="old_app_action" msgid="493129172238566282">"àºàº±àºšà»„ປ <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+ <string name="old_app_description" msgid="2082094275580358049">"ຫ້າມເປີດà»àº­àº±àºšàº¯à»ƒà»à»ˆ."</string>
+ <string name="new_app_action" msgid="5472756926945440706">"ເລີ່ມຕົ້ນ <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+ <string name="new_app_description" msgid="1932143598371537340">"ຢຸດà»àº­àº±àºšàº¯à»€àºàº»à»ˆàº²à»‚ດàºàºšà»à»ˆàº•້ອງບັນທຶàº."</string>
+ <string name="sendText" msgid="5209874571959469142">"ເລືອàºàºàº²àº™à»€àº®àº±àº”ວຽàºàº‚ອງຂà»à»‰àº„ວາມ"</string>
+ <string name="volume_ringtone" msgid="6885421406845734650">"ລະດັບສຽງເອີ້ນເຂົ້າ"</string>
+ <string name="volume_music" msgid="5421651157138628171">"ລະດັບສຽງຂອງສື່"</string>
+ <string name="volume_music_hint_playing_through_bluetooth" msgid="9165984379394601533">"àºàº³àº¥àº±àº‡àº«àº¼àº´à»‰àº™àºœà»ˆàº²àº™ Bluetooth"</string>
+ <string name="volume_music_hint_silent_ringtone_selected" msgid="8310739960973156272">"ຕັ້ງໃຫ້ບà»à»ˆàº¡àºµàºªàº½àº‡à»€àº­àºµà»‰àº™à»€àº‚ົ້າ"</string>
+ <string name="volume_call" msgid="3941680041282788711">"ລະດັບສຽງໃນàºàº²àº™à»‚ທ"</string>
+ <string name="volume_bluetooth_call" msgid="2002891926351151534">"ລະດັບບສຽງ Bluetooth ໃນຂະນະໂທ"</string>
+ <string name="volume_alarm" msgid="1985191616042689100">"ລະດັບສຽງà»àºˆà»‰àº‡à»€àº•ືອນ"</string>
+ <string name="volume_notification" msgid="2422265656744276715">"ລະດັບສຽງà»àºˆà»‰àº‡à»€àº•ືອນ"</string>
+ <string name="volume_unknown" msgid="1400219669770445902">"ລະດັບສຽງ"</string>
+ <string name="volume_icon_description_bluetooth" msgid="6538894177255964340">"ສຽງຂອງ Bluetooth"</string>
+ <string name="volume_icon_description_ringer" msgid="3326003847006162496">"ລະດັບສຽງເອີ້ນເຂົ້າ"</string>
+ <string name="volume_icon_description_incall" msgid="8890073218154543397">"ລະດັບສຽງàºàº²àº™à»‚ທ"</string>
+ <string name="volume_icon_description_media" msgid="4217311719665194215">"ລະດັບສຽງຂອງສື່"</string>
+ <string name="volume_icon_description_notification" msgid="7044986546477282274">"ລະດັບສຽງàºàº²àº™à»àºˆà»‰àº‡à»€àº•ືອນ"</string>
+ <string name="ringtone_default" msgid="3789758980357696936">"ຣິງໂທນເລີ່ມຕົ້ນ"</string>
+ <string name="ringtone_default_with_actual" msgid="8129563480895990372">"ຣິງໂທນເລີ່ມຕົ້ນ (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_silent" msgid="7937634392408977062">"ບà»à»ˆàº¡àºµ"</string>
+ <string name="ringtone_picker_title" msgid="3515143939175119094">"ຣິງໂທນ"</string>
+ <string name="ringtone_unknown" msgid="5477919988701784788">"ຣິງໂທນທີ່ບà»à»ˆàº®àº¹à»‰àºˆàº±àº"</string>
+ <plurals name="wifi_available">
+ <item quantity="one" msgid="6654123987418168693">"ເຄືອຂ່າຠWi-Fi ທີ່ພົບ"</item>
+ <item quantity="other" msgid="4192424489168397386">"ມີເຄືອຂ່າຠWi​-Fi ໃຫ້ໃຊ້"</item>
+ </plurals>
+ <plurals name="wifi_available_detailed">
+ <item quantity="one" msgid="1634101450343277345">"ເປີດ Wi-Fi ເຄືອຂ່າàºàº—ີ່ມີ"</item>
+ <item quantity="other" msgid="7915895323644292768">"ເຄືອຂ່າຠWi-Fi à»àºšàºšà»€àº›àºµàº”ທີ່ພົບ"</item>
+ </plurals>
+ <string name="wifi_available_sign_in" msgid="4029489716605255386">"ເຂົ້າສູ່ລະບົບເຄືອຂ່າຠWi-Fi"</string>
+ <string name="network_available_sign_in" msgid="8495155593358054676">"ເຂົ້າສູ່ລະບົບເຄືອຂ່າàº"</string>
+ <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
+ <skip />
+ <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"ບà»à»ˆàºªàº²àº¡àº²àº”ເຊື່ອມຕà»à»ˆ Wi-Fi ໄດ້"</string>
+ <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" ມີສັນàºàº²àº™àº­àº´àº™à»€àº•ີເນັດທີ່ບà»à»ˆàº”ີ."</string>
+ <string name="wifi_p2p_dialog_title" msgid="97611782659324517">"Wi-Fi Direct"</string>
+ <string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"ເລີ່ມ Wi-Fi Direct. ນີ້ຈະເປັນàºàº²àº™àº›àº´àº” Wi-Fi client/hotspot."</string>
+ <string name="wifi_p2p_failed_message" msgid="3763669677935623084">"ບà»à»ˆàºªàº²àº¡àº²àº”ເລີ່ມ Wi-Fi Direct ໄດ້."</string>
+ <string name="wifi_p2p_enabled_notification_title" msgid="2068321881673734886">"ເປີດໃຊ້ Wi-Fi Direct à»àº¥à»‰àº§"</string>
+ <string name="wifi_p2p_enabled_notification_message" msgid="1638949953993894335">"à»àº•ະເພື່ອຕັ້ງຄ່າ"</string>
+ <string name="accept" msgid="1645267259272829559">"àºàº­àº¡àº®àº±àºš"</string>
+ <string name="decline" msgid="2112225451706137894">"ປະຕິເສດ"</string>
+ <string name="wifi_p2p_invitation_sent_title" msgid="1318975185112070734">"àºàº²àº™â€‹à»€àºŠàº·à»‰àº­â€‹à»€àºŠàºµàº™â€‹àº–ືàºàºªàº»à»ˆàº‡à»„ປà»àº¥à»‰àº§"</string>
+ <string name="wifi_p2p_invitation_to_connect_title" msgid="4958803948658533637">"àºàº²àº™à»€àºŠàºµàº™àºŠàº§àº™à»€àºžàº·à»ˆàº­à»€àºŠàº·à»ˆàº­àº¡àº•à»à»ˆ"</string>
+ <string name="wifi_p2p_from_message" msgid="570389174731951769">"ຈາàº:"</string>
+ <string name="wifi_p2p_to_message" msgid="248968974522044099">"ຈາàº:"</string>
+ <string name="wifi_p2p_enter_pin_message" msgid="5920929550367828970">"ພິມລະຫັດ PIN:"</string>
+ <string name="wifi_p2p_show_pin_message" msgid="8530563323880921094">"PIN:"</string>
+ <string name="wifi_p2p_frequency_conflict_message" product="tablet" msgid="8012981257742232475">"à»àº—ັບເລັດຈະຖືàºàº•ັດàºàº²àº™à»€àºŠàº·à»ˆàº­àº¡àº•à»à»ˆàºˆàº²àº Wi-Fi ເປັນàºàº²àº™àºŠàº»à»ˆàº§àº„າວ ໃນຂະນະທີ່ມັນເຊື່ອມຕà»à»ˆàºàº±àºš <xliff:g id="DEVICE_NAME">%1$s</xliff:g> ຢູ່."</string>
+ <string name="wifi_p2p_frequency_conflict_message" product="default" msgid="7363907213787469151">"ໂທລະສັບຈະຖືàºàº¢àº¸àº”àºàº²àº™à»€àºŠàº·à»ˆàº­àº¡àº•à»à»ˆàºŠàº»à»ˆàº§àº„າວຈາຠWi-Fi ໃນຂະນະທີ່ມັນເຊື່ອມຕà»à»ˆàºàº±àºš <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+ <string name="select_character" msgid="3365550120617701745">"ໃສ່ໂຕອັàºàºªàº­àº™"</string>
+ <string name="sms_control_title" msgid="7296612781128917719">"àºàº³àº¥àº±àº‡àºªàº»à»ˆàº‡àº‚à»à»‰àº„ວາມ SMS"</string>
+ <string name="sms_control_message" msgid="3867899169651496433">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; àºàº³àº¥àº±àº‡àºªàº»à»ˆàº‡àº‚à»à»‰àº„ວາມ SMS ຈຳນວນຫຼາàº. ທ່ານຕ້ອງàºàº²àº™àº­àº°àº™àº¸àºàº²àº”ໃຫ້à»àº­àº±àºšàº¯àºªàº·àºšàº•à»à»ˆàºàº²àº™àºªàº»à»ˆàº‡àº‚à»à»‰àº„ວາມບà»à»ˆ?"</string>
+ <string name="sms_control_yes" msgid="3663725993855816807">"ອະນຸàºàº²àº”"</string>
+ <string name="sms_control_no" msgid="625438561395534982">"ປະຕິເສດ"</string>
+ <string name="sms_short_code_confirm_message" msgid="1645436466285310855">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ຕ້ອງàºàº²àº™àºªàº»à»ˆàº‡àº‚à»à»‰àº„ວາມຫາ &lt;b&gt;<xliff:g id="DEST_ADDRESS">%2$s</xliff:g>&lt;/b&gt;."</string>
+ <string name="sms_short_code_details" msgid="3492025719868078457">"ນີ້ "<font fgcolor="#ffffb060">"ອາດເຮັດໃຫ້ເàºàºµàº”ຄ່າໃຊ້ຈ່າàº"</font>" ໃນບັນຊີມືຖືຂອງທ່ານໄດ້."</string>
+ <string name="sms_premium_short_code_details" msgid="5523826349105123687"><font fgcolor="#ffffb060">"ມັນຈະເຮັດໃຫ້ທ່ານເສàºàº„່າບà»àº¥àº´àºàº²àº™à»ƒàº™àºšàº±àº™àºŠàºµàº‚ອງທ່ານ."</font></string>
+ <string name="sms_short_code_confirm_allow" msgid="4458878637111023413">"ສົ່ງ"</string>
+ <string name="sms_short_code_confirm_deny" msgid="2927389840209170706">"àºàº»àºà»€àº¥àºµàº"</string>
+ <string name="sms_short_code_remember_choice" msgid="5289538592272218136">"ຈື່àºàº²àº™à»€àº¥àº·àº­àºàº‚ອງຂ້ອàº"</string>
+ <string name="sms_short_code_remember_undo_instruction" msgid="4960944133052287484">"ທ່ານສາມາດປ່ຽນà»àº›àº‡à»‚ຕເລືອàºàº™àºµà»‰à»ƒàº™àºžàº²àºàº«àº¼àº±àº‡à»„ດ້ໃນ àºàº²àº™àº•ັ້ງຄ່າ &gt; à»àº­àº±àºšàº¯"</string>
+ <string name="sms_short_code_confirm_always_allow" msgid="3241181154869493368">"ອະນຸàºàº²àº”ທຸàºàº„ັ້ງ"</string>
+ <string name="sms_short_code_confirm_never_allow" msgid="446992765774269673">"ບà»à»ˆàº­àº°àº™àº¸àºàº²àº”ເດັດຂາດ"</string>
+ <string name="sim_removed_title" msgid="6227712319223226185">"ຖອດ SIM card ອອàºà»àº¥à»‰àº§"</string>
+ <string name="sim_removed_message" msgid="2333164559970958645">"ເຄືອຂ່າàºàº¡àº·àº–ືຈະບà»à»ˆàºªàº²àº¡àº²àº”ໃຊ້ໄດ້ ຈົນàºàº§à»ˆàº²àº—່ານຈະປິດà»àº¥à»‰àº§à»€àº›àºµàº”ໃà»à»ˆàºžà»‰àº­àº¡àºàº±àºšà»ƒàºªà»ˆ SIM card ທີ່ຖືàºàº•້ອງ."</string>
+ <string name="sim_done_button" msgid="827949989369963775">"à»àº¥à»‰àº§à»†"</string>
+ <string name="sim_added_title" msgid="3719670512889674693">"ເພີ່ມຊິມàºàº²àº”à»àº¥à»‰àº§"</string>
+ <string name="sim_added_message" msgid="6599945301141050216">"ປິດà»àº¥à»‰àº§à»€àº›àºµàº”ອຸປະàºàº­àº™àº‚ອງທ່ານ ເພື່ອເຂົ້າເຖິງເຄືອຂ່າàºàº¡àº·àº–ື."</string>
+ <string name="sim_restart_button" msgid="4722407842815232347">"ຣີສະຕາດ"</string>
+ <string name="time_picker_dialog_title" msgid="8349362623068819295">"ຕັ້ງເວລາ"</string>
+ <string name="date_picker_dialog_title" msgid="5879450659453782278">"àºà»àº²àº™àº»àº”ວັນທີ"</string>
+ <string name="date_time_set" msgid="5777075614321087758">"ຕັ້ງຄ່າ"</string>
+ <string name="date_time_done" msgid="2507683751759308828">"à»àº¥à»‰àº§à»†"</string>
+ <string name="perms_new_perm_prefix" msgid="8257740710754301407"><font size="12" fgcolor="#ff33b5e5">"ໃà»à»ˆ: "</font></string>
+ <string name="perms_description_app" msgid="5139836143293299417">"ສະໜອງໂດຠ<xliff:g id="APP_NAME">%1$s</xliff:g> ."</string>
+ <string name="no_permissions" msgid="7283357728219338112">"ບà»à»ˆàº•້ອງàºàº²àº™àºàº²àº™àº­àº°àº™àº¸àºàº²àº”"</string>
+ <string name="perm_costs_money" msgid="4902470324142151116">"ລາàºàºàº²àº™àº™àºµà»‰àº­àº²àº”ມີàºàº²àº™à»€àºàº±àºšà»€àº‡àº´àº™"</string>
+ <string name="usb_storage_activity_title" msgid="4465055157209648641">"ບ່ອນຈັດເàºàº±àºšàº‚à»à»‰àº¡àº¹àº™ USB"</string>
+ <string name="usb_storage_title" msgid="5901459041398751495">"ເຊື່ອມຕà»à»ˆ USB à»àº¥à»‰àº§"</string>
+ <string name="usb_storage_message" product="nosdcard" msgid="3308538094316477839">"ທ່ານໄດ້ເຊື່ອມຕà»à»ˆàºàº±àºšàº„ອມພິວເຕີຂອງທ່ານຜ່ານ USB à»àº¥à»‰àº§. ໃຫ້à»àº•ະປຸ່ມຂ້າງລຸ່ມຖ້າທ່ານຕ້ອງàºàº²àº™àºªàº³à»€àº™àº»àº²à»„ຟລ໌ ລະຫວ່າງຄອມພິວເຕີ à»àº¥àº°àºšà»ˆàº­àº™àºˆàº±àº”ເàºàº±àºšàº‚à»à»‰àº¡àº¹àº™ USB ຂອງ Android ທ່ານ."</string>
+ <string name="usb_storage_message" product="default" msgid="805351000446037811">"ທ່ານໄດ້ເຊື່ອມຕà»à»ˆàºàº±àºšàº„ອມພິວເຕີຂອງທ່ານດ້ວຠUSB à»àº¥à»‰àº§. ໃຫ້ປຸ່ມທາງດ້ານລຸ່ມນີ້ຫາàºàº—່ານຕ້ອງàºàº²àº™ ທີ່ຈະສຳເນົາໄຟລ໌ຂà»à»‰àº¡àº¹àº™àº¥àº°àº«àº§à»ˆàº²àº‡àº„ອມພິວເຕີ à»àº¥àº° SD card ຂອງ Android ຂອງທ່ານ."</string>
+ <string name="usb_storage_button_mount" msgid="1052259930369508235">"ເປີດ ບ່ອນຈັດເàºàº±àºšàº‚à»à»‰àº¡àº¹àº™ USB"</string>
+ <string name="usb_storage_error_message" product="nosdcard" msgid="3017045217365540658">"ມີບັນຫາໃນàºàº²àº™à»ƒàºŠà»‰àºšà»ˆàº­àº™àºˆàº±àº”ເàºàº±àºšàº‚à»à»‰àº¡àº¹àº™ USB ຂອງທ່ານເປັນບ່ອນຈັດເàºàº±àºšàº‚à»à»‰àº¡àº¹àº™àºˆàº³àº™àº§àº™àº«àº¼àº²àºàº”້ວຠUSB."</string>
+ <string name="usb_storage_error_message" product="default" msgid="2876018512716970313">"ມີບັນຫາໃນàºàº²àº™à»ƒàºŠà»‰ SD card ຂອງທ່ານເປັນບ່ອນຈັດເàºàº±àºšàº‚à»à»‰àº¡àº¹àº™àºˆàº³àº™àº§àº™àº«àº¼àº²àºàº”້ວຠUSB."</string>
+ <string name="usb_storage_notification_title" msgid="8175892554757216525">"ເຊື່ອມຕà»à»ˆ USB à»àº¥à»‰àº§"</string>
+ <string name="usb_storage_notification_message" msgid="939822783828183763">"à»àº•ະເພື່ອສຳເນົາໄຟລ໌ ໃສ່/ຈາຠຄອມພິວເຕີຂອງທ່ານ."</string>
+ <string name="usb_storage_stop_notification_title" msgid="2336058396663516017">"ປິດບ່ອນຈັດເàºàº±àºšàº‚à»à»‰àº¡àº¹àº™ USB"</string>
+ <string name="usb_storage_stop_notification_message" msgid="1656852098555623822">"à»àº•ະເພື່ອປິດ ບ່ອນຈັດເàºàº±àºšàº‚à»à»‰àº¡àº¹àº™ USB ."</string>
+ <string name="usb_storage_stop_title" msgid="660129851708775853">"ບ່ອນຈັດເàºàº±àºšàº‚à»à»‰àº¡àº¹àº™ USB àºàº³àº¥àº±àº‡àº–ືàºàº™àº³à»ƒàºŠà»‰àº¢àº¹à»ˆ"</string>
+ <string name="usb_storage_stop_message" product="nosdcard" msgid="4264025280777219521">"àºà»ˆàº­àº™àº›àº´àº”ບ່ອນຈັດເàºàº±àºšàº‚à»à»‰àº¡àº¹àº™ USB, ຖອນ (\"eject\") ບ່ອນຈັດເàºàº±àºšàº‚à»à»‰àº¡àº¹àº™ USB ຂອງ Android ຂອງທ່ານຈາàºàº„ອມພິວເຕີຂອງທ່ານ."</string>
+ <string name="usb_storage_stop_message" product="default" msgid="8043969782460613114">"àºà»ˆàº­àº™àºàº²àº™àº›àº´àº”ບ່ອນຈັດເàºàº±àºšàº‚à»à»‰àº¡àº¹àº™ USB, ໃຫ້ຖອນàºàº²àº™à»€àºŠàº·à»ˆàº­àº¡àº•à»à»ˆ (eject) SD card ຂອງ Android ທ່ານອອàºàºˆàº²àºàº„ອມພິວເຕີàºà»ˆàº­àº™."</string>
+ <string name="usb_storage_stop_button_mount" msgid="7060218034900696029">"ປິດບ່ອນຈັດເàºàº±àºšàº‚à»à»‰àº¡àº¹àº™ USB"</string>
+ <string name="usb_storage_stop_error_message" msgid="1970374898263063836">"ເàºàºµàº”ບັນຫາໃນàºàº²àº™àº›àº´àº”ບ່ອນຈັດເàºàº±àºšàº‚à»à»‰àº¡àº¹àº™ USB. ໃຫ້àºàº§àº”ສອບວ່າທ່ານໄດ້ຖອນàºàº²àº™à»€àºŠàº·à»ˆàº­àº¡àº•à»à»ˆ USB host à»àº¥à»‰àº§àº«àº¼àº·àºàº±àº‡ ຈາàºàº™àº±à»‰àº™àºˆàº¶à»ˆàº‡àº¥àº­àº‡àº­àºµàºàº„ັ້ງ."</string>
+ <string name="dlg_confirm_kill_storage_users_title" msgid="963039033470478697">"ເປີດໃຊ້ບ່ອນຈັດເàºàº±àºšàº‚à»à»‰àº¡àº¹àº™ USB"</string>
+ <string name="dlg_confirm_kill_storage_users_text" msgid="5100428757107469454">"ຫາàºàº—່ານເປີດນຳໃຊ້ບ່ອນຈັດເàºàº±àºšàº‚à»à»‰àº¡àº¹àº™ USB ຈະເຮັດໃຫ້ບາງà»àº­àº±àºšàº¯àº—ີ່ທ່ານເຮັດວຽàºàº¢àº¹à»ˆàº™àº±à»‰àº™ ຢຸດເຮັດວຽຠà»àº¥àº°àº­àº²àº”ຈະບà»à»ˆàºªàº²àº¡àº²àº”ໃຊ້ໄດ້ຈົນàºàº§à»ˆàº²àº—່ານປິດບ່ອນຈັດເàºàº±àºšàº‚à»à»‰àº¡àº¹àº™ USB àºà»ˆàº­àº™."</string>
+ <string name="dlg_error_title" msgid="7323658469626514207">"ປະຕິບັດàºàº²àº™ USB ບà»à»ˆàºªàº³à»€àº¥àº±àº”"</string>
+ <string name="dlg_ok" msgid="7376953167039865701">"ຕົàºàº¥àº»àº‡"</string>
+ <string name="usb_mtp_notification_title" msgid="3699913097391550394">"ເຊື່ອມຕà»à»ˆà»€àº›àº±àº™àº­àº¸àº›àº°àºàº­àº™àºªàº·à»ˆ"</string>
+ <string name="usb_ptp_notification_title" msgid="1960817192216064833">"ເຊື່ອມຕà»à»ˆà»€àº›àº±àº™àºà»‰àº­àº‡àº–່າàºàº®àº¹àºšà»àº¥à»‰àº§"</string>
+ <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"ເຊື່ອມຕà»à»ˆà»ƒàº™àº™àº²àº¡àº•ົວຕິດຕັ້ງ"</string>
+ <string name="usb_accessory_notification_title" msgid="7848236974087653666">"ເຊື່ອມຕà»à»ˆàºàº±àºšàº­àº¸àº›àº°àºàº­àº™à»€àºªàºµàº¡ USB à»àº¥à»‰àº§"</string>
+ <string name="usb_notification_message" msgid="2290859399983720271">"à»àº•ະເພື່ອເບິ່ງໂຕເລືອàºà»€àº¥àº·àº­àº USB ອື່ນໆ."</string>
+ <string name="extmedia_format_title" product="nosdcard" msgid="9020092196061007262">"ຟà»à»àº¡àº±àº” ບ່ອນຈັດເàºàº±àºšàº‚à»à»‰àº¡àº¹àº™ USB?"</string>
+ <string name="extmedia_format_title" product="default" msgid="3648415921526526069">"ຟà»à»àº¡àº±àº” SD card?"</string>
+ <string name="extmedia_format_message" product="nosdcard" msgid="3934016853425761078">"ໄຟລ໌ທັງà»àº»àº”ທີ່ຢູ່ໃນບ່ອນຈັດເàºàº±àºšàº‚à»à»‰àº¡àº¹àº™ USB ຂອງທ່ານຈະຖືàºàº¥àº¶àºšàº­àº­àºà»àº»àº”. àºàº²àº™àºàº°àº—ຳຈະບà»à»ˆàºªàº²àº¡àº²àº”àºàº»àºà»€àº¥àºµàºà»„ດ້!"</string>
+ <string name="extmedia_format_message" product="default" msgid="14131895027543830">"ຂà»à»‰àº¡àº¹àº™àº—ັງà»àº»àº”ໃນàºàº²àº”ຂອງທ່ານຈະຫາàºà»„ປ."</string>
+ <string name="extmedia_format_button_format" msgid="4131064560127478695">"ຟà»à»àº¡àº±àº”"</string>
+ <string name="adb_active_notification_title" msgid="6729044778949189918">"ເຊື່ອມຕà»à»ˆàºàº²àº™àº”ີບັ໊àºàºœà»ˆàº²àº™ USB à»àº¥à»‰àº§"</string>
+ <string name="adb_active_notification_message" msgid="1016654627626476142">"à»àº•ະເພື່ອປິດàºàº²àº™àº”ີບັ໊àºàºœà»ˆàº²àº™ USB."</string>
+ <string name="select_input_method" msgid="4653387336791222978">"ເລືອàºàº®àº¹àºšà»àºšàºšàºàº²àº™àº›à»‰àº­àº™"</string>
+ <string name="configure_input_methods" msgid="9091652157722495116">"ຕັ້ງຄ່າວິທີàºàº²àº™àº›à»‰àº­àº™àº‚à»à»‰àº¡àº¹àº™"</string>
+ <string name="use_physical_keyboard" msgid="6203112478095117625">"à»àº›à»‰àº™àºžàº´àº¡à»àº—້"</string>
+ <string name="hardware" msgid="7517821086888990278">"ຮາດà»àº§"</string>
+ <string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"ເລືອàºàº®àº¹àºšà»àºšàºšà»àº›à»‰àº™àºžàº´àº¡"</string>
+ <string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"àºàº»àº”ເພື່ອເລືອàºàº®àº¹àºšà»àºšàºšà»àº›à»‰àº™àºžàº´àº¡."</string>
+ <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+ <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+ <string name="candidates_style" msgid="4333913089637062257"><u>"ຕົວເລືອàº"</u></string>
+ <string name="ext_media_checking_notification_title" product="nosdcard" msgid="3449816005351468560">"àºàº³àº¥àº±àº‡àºàº½àº¡àºšà»ˆàº­àº™àºˆàº±àº”ເàºàº±àºšàº‚à»à»‰àº¡àº¹àº™ USB"</string>
+ <string name="ext_media_checking_notification_title" product="default" msgid="5457603418970994050">"àºàº³àº¥àº±àº‡àºàº°àºàº½àº¡ SD card"</string>
+ <string name="ext_media_checking_notification_message" msgid="8287319882926737053">"àºàº³àº¥àº±àº‡àºàº§àº”ຫາຂà»à»‰àºœàº´àº”ພາດ."</string>
+ <string name="ext_media_nofs_notification_title" product="nosdcard" msgid="7788040745686229307">"ບ່ອນຈັດເàºàº±àºšàº‚à»à»‰àº¡àº¹àº™ USB ເປົ່າຫວ່າງ"</string>
+ <string name="ext_media_nofs_notification_title" product="default" msgid="780477838241212997">"SD card ຫວ່າງເປົ່າ"</string>
+ <string name="ext_media_nofs_notification_message" product="nosdcard" msgid="7840121067427269500">"ບ່ອນຈັດເàºàº±àºšàº‚à»à»‰àº¡àº¹àº™ USB ຫວ່າງເປົ່າ ຫຼືມີໄຟລ໌ລະບົບທີ່ບà»à»ˆàº®àº­àº‡àº®àº±àºš."</string>
+ <string name="ext_media_nofs_notification_message" product="default" msgid="8641065641786923604">"SD card ຫວ່າງເປົ່າ ຫຼືມີລະບົບໄຟລ໌ທີ່ບà»à»ˆàº®àº­àº‡àº®àº±àºš."</string>
+ <string name="ext_media_unmountable_notification_title" product="nosdcard" msgid="2090046769532713563">"ບ່ອນຈັດເàºàº±àºšàº‚à»à»‰àº¡àº¹àº™ USB ທີ່ເສàºàº«àº²àº."</string>
+ <string name="ext_media_unmountable_notification_title" product="default" msgid="6410723906019100189">"SD card ທີ່ເສàºàº«àº²àº."</string>
+ <string name="ext_media_unmountable_notification_message" product="nosdcard" msgid="1795917578395333280">"ບ່ອນຈັດເàºàº±àºšàº‚à»à»‰àº¡àº¹àº™ USB ເສàºàº«àº²àº. ລອງຟà»à»àº¡àº±àº”ມັນອີàºàº„ັ້ງເບິ່ງ."</string>
+ <string name="ext_media_unmountable_notification_message" product="default" msgid="1753898567525568253">"SD card ເສàºàº«àº²àº. ລອງຟà»à»àº¡àº±àº”ມັນອີàºàº„ັ້ງເບິ່ງ."</string>
+ <string name="ext_media_badremoval_notification_title" product="nosdcard" msgid="1661683031330951073">"ບ່ອນຈັດເàºàº±àºšàº‚à»à»‰àº¡àº¹àº™ USB ຖືàºàº–ອດອອàºà»àºšàºšàºšà»à»ˆàº›àº­àº”ໄພ"</string>
+ <string name="ext_media_badremoval_notification_title" product="default" msgid="6872152882604407837">"SD card ຖືàºàº–ອດອອàºà»‚ດàºàºšà»à»ˆàº„າດຄິດ"</string>
+ <string name="ext_media_badremoval_notification_message" product="nosdcard" msgid="4329848819865594241">"ຖອດàºàº²àº™à»€àºŠàº·à»ˆàº­àº¡àº•à»à»ˆàºšà»ˆàº­àº™àºˆàº±àº”ເàºàº±àºšàº‚à»à»‰àº¡àº¹àº™ USB àºà»ˆàº­àº™àº—ີ່ຈະຖອດອອຠເພື່ອປ້ອງàºàº±àº™àºàº²àº™àºªàº¹àº™à»€àºªàºàº‚à»à»‰àº¡àº¹àº™."</string>
+ <string name="ext_media_badremoval_notification_message" product="default" msgid="7260183293747448241">"ຖອນàºàº²àº™à»€àºŠàº·à»ˆàº­àº¡àº•à»à»ˆ SD card àºà»ˆàº­àº™àºˆàº°àº–ອດອອàºà»€àºžàº·à»ˆàº­àº›à»‰àº­àº‡àºàº±àº™àºàº²àº™àºªàº¹àº™à»€àºªàºàº‚à»à»‰àº¡àº¹àº™."</string>
+ <string name="ext_media_safe_unmount_notification_title" product="nosdcard" msgid="3967973893270360230">"ບ່ອນຈັດເàºàº±àºšàº‚à»à»‰àº¡àº¹àº™ USB ສາມາດຖອດອອàºà»„ດ້ຢ່າງປອດໄພ"</string>
+ <string name="ext_media_safe_unmount_notification_title" product="default" msgid="6729801130790616200">"ສາມາດຖອດ SD card ອອàºà»„ດ້ປອດໄພà»àº¥à»‰àº§"</string>
+ <string name="ext_media_safe_unmount_notification_message" product="nosdcard" msgid="6142195361606493530">"ທ່ານສາມາດຖອດບ່ອນຈັດເàºàº±àºšàº‚à»à»‰àº¡àº¹àº™ USB ອອàºà»„ດ້ຢ່າງປອດໄພ."</string>
+ <string name="ext_media_safe_unmount_notification_message" product="default" msgid="568841278138377604">"ທ່ານສາມາດຖອດ SD card ອອàºà»„ດ້ຢ່າງປອດໄພ."</string>
+ <string name="ext_media_nomedia_notification_title" product="nosdcard" msgid="4486377230140227651">"ບ່ອນຈັດເàºàº±àºšàº‚à»à»‰àº¡àº¹àº™ USB ຖືàºàº–ອດອອàºà»àº¥à»‰àº§"</string>
+ <string name="ext_media_nomedia_notification_title" product="default" msgid="8902518030404381318">"SD card ຖືàºàº–ອດອອàº"</string>
+ <string name="ext_media_nomedia_notification_message" product="nosdcard" msgid="6921126162580574143">"ບ່ອນຈັດເàºàºšàº±àº‚à»à»‰àº¡àº¹àº™ USB ຖືàºàº–ອດອອàºà»àº¥à»‰àº§. ໃຫ້ໃສ່ອັນໃà»à»ˆà»€àº‚ົ້າໄປ."</string>
+ <string name="ext_media_nomedia_notification_message" product="default" msgid="3870120652983659641">"SD card ຖືàºàº–ອດອອàºà»àº¥à»‰àº§. àºàº°àº¥àº¸àº™àº²à»ƒàºªà»ˆàº­àº±àº™à»ƒà»à»ˆ."</string>
+ <string name="activity_list_empty" msgid="1675388330786841066">"ບà»à»ˆàºžàº»àºšàºàº´àº”ຈະàºàº³àº—ີ່àºàº»àº‡àºàº±àº™."</string>
+ <string name="permlab_pkgUsageStats" msgid="8787352074326748892">"ອັບເດດສະຖິຕິàºàº²àº™àº™àº³à»ƒàºŠà»‰àº­àº»àº‡àº›àº°àºàº­àºš"</string>
+ <string name="permdesc_pkgUsageStats" msgid="1106612424254277630">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯à»àºà»‰à»„ຂສະຖິຕິ àºàº²àº™àº™àº³à»ƒàºŠà»‰àº‚à»à»‰àº¡àº¹àº™àºªà»ˆàº§àº™àº›àº°àºàº­àºšàº—ີ່ເàºàº±àºšàºàº³àº¡àº². à»àº­àº±àºšàº¯àº—ົ່ວໄປບà»à»ˆàºˆàº³à»€àº›àº±àº™àº•້ອງໃຊ້."</string>
+ <string name="permlab_copyProtectedData" msgid="4341036311211406692">"ສຳເນົາເນື້ອຫາ"</string>
+ <string name="permdesc_copyProtectedData" msgid="4390697124288317831">"ອະນຸàºàº²àº”ໃຫ້ຮ້ອງຂà»àºšà»àº¥àº´àºàº²àº™àº„ອນເທັນເນີຫຼັຠໃນàºàº²àº™àºªàº³à»€àº™àº»àº²à»€àº™àº·à»‰àº­àº«àº². ບà»à»ˆà»ƒàºŠà»‰à»ƒàº™à»àº­àº±àºšàº¯àº—ົ່ວໄປ."</string>
+ <string name="permlab_route_media_output" msgid="1642024455750414694">"àºàº³àº™àº»àº”ເສັ້ນທາງເອົ້າພຸດຂອງສື່"</string>
+ <string name="permdesc_route_media_output" msgid="4932818749547244346">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàºžàº¥àº´à»€àº„ຊັນ àºàº³àº™àº»àº”ເສັ້ນທາງເອົ້າພຸດຂອງສື່ໄປຫາອຸປະàºàº­àº™àºžàº²àºàº™àº­àºàº­àº·à»ˆàº™à»†."</string>
+ <string name="permlab_access_keyguard_secure_storage" msgid="7565552237977815047">"ເຂົ້າໃຊ້ບ່ອນຈັດເàºàº±àºšàº‚à»à»‰àº¡àº¹àº™àº„ວາມປອດໄພຄີàºàº²àº”"</string>
+ <string name="permdesc_access_keyguard_secure_storage" msgid="5866245484303285762">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàºžàº¥àº´à»€àº„ຊັນ ເຂົ້າເຖິງບ່ອນຈັດເàºàº±àºšàº‚à»à»‰àº¡àº¹àº™àº„ວາມປອດໄພດ້ວàºàº„ີàºàº²àº”."</string>
+ <string name="permlab_control_keyguard" msgid="172195184207828387">"ຄວບຄຸມàºàº²àº™àºªàº°à»àº”ງ à»àº¥àº°àºàº²àº™à»€àºŠàº·à»ˆàº­àº‡à»‚ຕລັອàºàº›àº¸à»ˆàº¡àºàº»àº”"</string>
+ <string name="permdesc_control_keyguard" msgid="3043732290518629061">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàºžàº¥àº´à»€àº„ຊັນສາມາດຄວບຄຸມຄີàºàº²àº”ໄດ້."</string>
+ <string name="tutorial_double_tap_to_zoom_message_short" msgid="4070433208160063538">"à»àº•ະສອງເທື່ອສຳລັບàºàº²àº™àº„ວບຄຸມàºàº²àº™àºŠàº¹àº¡"</string>
+ <string name="gadget_host_error_inflating" msgid="4882004314906466162">"ບà»à»ˆàºªàº²àº¡àº²àº”ເພີ່ມວິດເຈັດໄດ້."</string>
+ <string name="ime_action_go" msgid="8320845651737369027">"ໄປ"</string>
+ <string name="ime_action_search" msgid="658110271822807811">"ຊອàºàº«àº²"</string>
+ <string name="ime_action_send" msgid="2316166556349314424">"ສົ່ງ"</string>
+ <string name="ime_action_next" msgid="3138843904009813834">"ຕà»à»ˆà»„ປ"</string>
+ <string name="ime_action_done" msgid="8971516117910934605">"à»àº¥à»‰àº§à»†"</string>
+ <string name="ime_action_previous" msgid="1443550039250105948">"àºà»ˆàº­àº™à»œà»‰àº²"</string>
+ <string name="ime_action_default" msgid="2840921885558045721">"ດຳເນີນàºàº²àº™"</string>
+ <string name="dial_number_using" msgid="5789176425167573586">"àºàº»àº”ເລàºà»àº²àº\nໂດàºà»ƒàºŠà»‰ <xliff:g id="NUMBER">%s</xliff:g>"</string>
+ <string name="create_contact_using" msgid="4947405226788104538">"ສ້າງລາàºàºŠàº·à»ˆàºœàº¹à»ˆàº•ິດຕà»à»ˆ\nໂດàºàºàº²àº™à»ƒàºŠà»‰ <xliff:g id="NUMBER">%s</xliff:g>"</string>
+ <string name="grant_credentials_permission_message_header" msgid="2106103817937859662">"ມີນຶ່ງà»àº­àº±àºšàº¯ ຫຼືຫຼາàºàºàº§à»ˆàº²àº™àº±à»‰àº™àºàº³àº¥àº±àº‡àº®à»‰àº­àº‡àº‚à»àºàº²àº™àº­àº°àº™àº¸àºàº²àº” ເພື່ອເຂົ້າເຖິງບັນຊີຂອງທ່ານໃນຕອນນີ້ à»àº¥àº°àº­àº°àº™àº²àº„ົດ."</string>
+ <string name="grant_credentials_permission_message_footer" msgid="3125211343379376561">"ທ່ານຕ້ອງàºàº²àº™àº­àº°àº™àº¸àº¡àº±àº”ຄຳຮ້ອງຂà»àº™àºµà»‰àºšà»à»ˆ?"</string>
+ <string name="grant_permissions_header_text" msgid="6874497408201826708">"ຄà»àº²àº®à»‰àº­àº‡àº‚à»àºàº²àº™à»€àº‚ົ້າເຖິງ"</string>
+ <string name="allow" msgid="7225948811296386551">"ອະນຸàºàº²àº”"</string>
+ <string name="deny" msgid="2081879885755434506">"ປະ​ຕິ​ເສດ"</string>
+ <string name="permission_request_notification_title" msgid="6486759795926237907">"ຕ້ອງàºàº²àº™àºàº²àº™àº­àº°àº™àº¸àºàº²àº”"</string>
+ <string name="permission_request_notification_with_subtitle" msgid="8530393139639560189">"ຮ້ອງຂà»àºàº²àº™àºàº³àº™àº»àº”ສິດ\nສຳລັບບັນຊີ <xliff:g id="ACCOUNT">%s</xliff:g> à»àº¥à»‰àº§."</string>
+ <string name="input_method_binding_label" msgid="1283557179944992649">"ວິທີàºàº²àº™àº›à»‰àº­àº™àº‚à»à»‰àº¡àº¹àº™"</string>
+ <string name="sync_binding_label" msgid="3687969138375092423">"ຊິ້ງຂà»à»‰àº¡àº¹àº™"</string>
+ <string name="accessibility_binding_label" msgid="4148120742096474641">"àºàº²àº™àºŠà»ˆàº§àºà»€àº‚ົ້າເຖິງ"</string>
+ <string name="wallpaper_binding_label" msgid="1240087844304687662">"ພາບພື້ນຫຼັງ"</string>
+ <string name="chooser_wallpaper" msgid="7873476199295190279">"ປ່ຽນພາບພື້ນຫຼັງ"</string>
+ <string name="notification_listener_binding_label" msgid="2014162835481906429">"ໂຕຟັງàºàº²àº™à»àºˆà»‰àº‡à»€àº•ືອນ"</string>
+ <string name="vpn_title" msgid="19615213552042827">"ເປີດນຳໃຊ້ VPN à»àº¥à»‰àº§"</string>
+ <string name="vpn_title_long" msgid="6400714798049252294">"ເປີດໃຊ້ VPN ໂດຠ<xliff:g id="APP">%s</xliff:g>"</string>
+ <string name="vpn_text" msgid="3011306607126450322">"à»àº•ະເພື່ອຈັດàºàº²àº™à»€àº„ືອຂ່າàº."</string>
+ <string name="vpn_text_long" msgid="6407351006249174473">"ເຊື່ອມຕà»à»ˆàº¢àº¹à»ˆàºàº±àºš <xliff:g id="SESSION">%s</xliff:g>. à»àº•ະເພື່ອຈັດàºàº²àº™à»€àº„ືອຂ່າàº."</string>
+ <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"àºàº³àº¥àº±àº‡à»€àºŠàº·à»ˆàº­àº¡àº•à»à»ˆ Always-on VPN…"</string>
+ <string name="vpn_lockdown_connected" msgid="8202679674819213931">"ເຊື່ອມຕà»à»ˆ VPN à»àºšàºšà»€àº›àºµàº”ຕະຫຼອດເວລາà»àº¥à»‰àº§"</string>
+ <string name="vpn_lockdown_error" msgid="6009249814034708175">"VPN à»àºšàºšà»€àº›àºµàº”ຕະຫຼອດເàºàºµàº”ຄວາມຜິດພາດ"</string>
+ <string name="vpn_lockdown_config" msgid="6415899150671537970">"à»àº•ະເພື່ອປັບຄ່າ"</string>
+ <string name="upload_file" msgid="2897957172366730416">"ເລືອàºà»„ຟລ໌"</string>
+ <string name="no_file_chosen" msgid="6363648562170759465">"ບà»à»ˆà»„ດ້ເລືອàºà»„ຟລ໌ເທື່ອ"</string>
+ <string name="reset" msgid="2448168080964209908">"ຣີເຊັດ"</string>
+ <string name="submit" msgid="1602335572089911941">"ສົ່ງຂà»à»‰àº¡àº¹àº™"</string>
+ <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"ໂຫມດຂັບລົດຖືàºà»€àº›àºµàº”à»àº¥à»‰àº§"</string>
+ <string name="car_mode_disable_notification_message" msgid="8035230537563503262">"àºàº»àº”ເພື່ອປິດໂຫມດຂັບລົດ."</string>
+ <string name="tethered_notification_title" msgid="3146694234398202601">"àºàº²àº™àº›à»ˆàº­àºàºªàº±àº™àºàº²àº™ ຫຼືຮັອດສະປອດທີ່ເຮັດວຽàºàº¢àº¹à»ˆ"</string>
+ <string name="tethered_notification_message" msgid="6857031760103062982">"à»àº•ະເພື່ອຕິດຕັ້ງ."</string>
+ <string name="back_button_label" msgid="2300470004503343439">"àºàº±àºšàº„ືນ"</string>
+ <string name="next_button_label" msgid="1080555104677992408">"ຕà»à»ˆà»„ປ"</string>
+ <string name="skip_button_label" msgid="1275362299471631819">"ຂ້າມ"</string>
+ <string name="throttle_warning_notification_title" msgid="4890894267454867276">"ມີàºàº²àº™à»ƒàºŠà»‰àº­àº´àº™à»€àº•ີເນັດຫຼາàº"</string>
+ <string name="throttle_warning_notification_message" msgid="3340822228599337743">"à»àº•ະເພື່ອສຶàºàºªàº²à»€àºžàºµà»ˆàº¡à»€àº•ີມàºà»ˆàº½àº§àºàº±àºšàºàº²àº™à»ƒàºŠà»‰àº‚à»à»‰àº¡àº¹àº™àº¡àº·àº–ື."</string>
+ <string name="throttled_notification_title" msgid="6269541897729781332">"àºàº²àº™àº™àº³à»ƒàºŠà»‰àº­àº´àº™à»€àº•ີເນັດຮອດຂີດຈຳàºàº±àº”à»àº¥à»‰àº§"</string>
+ <string name="throttled_notification_message" msgid="5443457321354907181">"à»àº•ະເພື່ອສຶàºàºªàº²à»€àºžàºµà»ˆàº¡à»€àº•ີມàºà»ˆàº½àº§àºàº±àºšàºàº²àº™àº™àº³à»ƒàºŠà»‰àº‚à»à»‰àº¡àº¹àº™àº¡àº·àº–ື."</string>
+ <string name="no_matches" msgid="8129421908915840737">"ບà»à»ˆàºžàº»àºšàºœàº»àº™àºàº²àº™àºŠàº­àºàº«àº²"</string>
+ <string name="find_on_page" msgid="1946799233822820384">"ຊອàºà»ƒàº™à»œà»‰àº²"</string>
+ <plurals name="matches_found">
+ <item quantity="one" msgid="8167147081136579439">"1 àºàº»àº‡àºàº±àº™"</item>
+ <item quantity="other" msgid="4641872797067609177">"<xliff:g id="INDEX">%d</xliff:g> ຈາàºàº—ັງà»àº»àº” <xliff:g id="TOTAL">%d</xliff:g>"</item>
+ </plurals>
+ <string name="action_mode_done" msgid="7217581640461922289">"à»àº¥à»‰àº§à»†"</string>
+ <string name="progress_unmounting" product="nosdcard" msgid="3923810448507612746">"àºàº³àº¥àº±àº‡àº–ອນàºàº²àº™à»€àºŠàº·à»ˆàº­àº¡àº•à»à»ˆàºšà»ˆàº­àº™àºˆàº±àº”ເàºàº±àºšàº‚à»à»‰àº¡àº¹àº™ USB …"</string>
+ <string name="progress_unmounting" product="default" msgid="1327894998409537190">"ຖອນàºàº²àº™à»€àºŠàº·à»ˆàº­àº¡àº•à»à»ˆ SD card..."</string>
+ <string name="progress_erasing" product="nosdcard" msgid="4521573321524340058">"àºàº³àº¥àº±àº‡àº¥àº¶àºš ບ່ອນຈັດເàºàº±àºšàº‚à»à»‰àº¡àº¹àº™ USB …"</string>
+ <string name="progress_erasing" product="default" msgid="6596988875507043042">"àºàº³àº¥àº±àº‡àº¥àº¶àºšâ€‹ SD card..."</string>
+ <string name="format_error" product="nosdcard" msgid="6299769563624776948">"ບà»à»ˆàºªàº²àº¡àº²àº”ລຶບບ່ອນຈັດເàºàº±àºšàº‚à»à»‰àº¡àº¹àº™ USB ໄດ້."</string>
+ <string name="format_error" product="default" msgid="7315248696644510935">"ບà»à»ˆàºªàº²àº¡àº²àº”ລຶບ SD card ໄດ້."</string>
+ <string name="media_bad_removal" msgid="7960864061016603281">"SD card ຖືàºàº–ອດອອàºàºà»ˆàº­àº™àºàº²àº™àº–ອນàºàº²àº™à»€àºŠàº·à»ˆàº­àº¡àº•à»à»ˆ."</string>
+ <string name="media_checking" product="nosdcard" msgid="418188720009569693">"ບ່ອນຈັດເàºàº±àºšàº‚à»à»‰àº¡àº¹àº™àºàº³àº¥àº±àº‡àº¢àº¹à»ˆà»ƒàº™àº¥àº°àº«àº§à»ˆàº²àº‡àºàº²àº™àºàº§àº”ສອບ."</string>
+ <string name="media_checking" product="default" msgid="7334762503904827481">"àºàº³àº¥àº±àº‡àºàº§àº”ສອບ SD card ຢູ່ໃນຂະນະນີ້."</string>
+ <string name="media_removed" msgid="7001526905057952097">"SD card ຖືàºàº–ອດອອàºà»àº¥à»‰àº§."</string>
+ <string name="media_shared" product="nosdcard" msgid="5830814349250834225">"ບ່ອນຈັດເàºàº±àºšàº‚à»à»‰àº¡àº¹àº™ USB àºàº³àº¥àº±àº‡àº–ືàºàº™àº³à»ƒàºŠà»‰à»‚ດàºàº„ອມພິວເຕີ."</string>
+ <string name="media_shared" product="default" msgid="5706130568133540435">"SD card àºàº³àº¥àº±àº‡àº–ືàºàº™àº³à»ƒàºŠà»‰à»‚ດàºàº„ອມພິວເຕີຢູ່."</string>
+ <string name="media_unknown_state" msgid="729192782197290385">"ຂà»à»‰àº¡àº¹àº™àºžàº²àºàº™àº­àºàº¢àº¹à»ˆà»ƒàº™àºªàº°àº–ານະທີ່ບà»à»ˆàº®àº¹à»‰àºˆàº±àº."</string>
+ <string name="share" msgid="1778686618230011964">"à»àºšà»ˆàº‡àº›àº±àº™"</string>
+ <string name="find" msgid="4808270900322985960">"ຊອàºàº«àº²"</string>
+ <string name="websearch" msgid="4337157977400211589">"ຊອàºàº«àº²à»€àº§àº±àºš"</string>
+ <string name="find_next" msgid="5742124618942193978">"ຊອàºàº«àº²àº•à»à»ˆà»„ປ"</string>
+ <string name="find_previous" msgid="2196723669388360506">"ຊອàºàºà»ˆàº­àº™à»œà»‰àº²àº™àºµà»‰"</string>
+ <string name="gpsNotifTicker" msgid="5622683912616496172">"ຄຳຮ້ອງຂà»àºªàº°àº–ານທີ່ຈາຠ<xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="gpsNotifTitle" msgid="5446858717157416839">"ຮ້ອງຂà»àºªàº°àº–ານທີ່"</string>
+ <string name="gpsNotifMessage" msgid="1374718023224000702">"ຮ້ອງຂà»à»‚ດຠ<xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
+ <string name="gpsVerifYes" msgid="2346566072867213563">"ຕົàºàº¥àº»àº‡"</string>
+ <string name="gpsVerifNo" msgid="1146564937346454865">"ບà»à»ˆ"</string>
+ <string name="sync_too_many_deletes" msgid="5296321850662746890">"àºàº²àºà»€àº‚ດàºàº³àº™àº»àº”àºàº²àº™àº¥àº¶àºš"</string>
+ <string name="sync_too_many_deletes_desc" msgid="496551671008694245">"ມີ <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> ລາàºàºàº²àº™àº—ີ່ຖືàºàº¥àº¶àºšàºªàº³àº¥àº±àºš <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>, ບັນຊີ <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g>. ທ່ານຕ້ອງàºàº²àº™àºˆàº°à»€àº®àº±àº”à»àº™àº§à»ƒàº”?"</string>
+ <string name="sync_really_delete" msgid="2572600103122596243">"ລຶບລາàºàºàº²àº™"</string>
+ <string name="sync_undo_deletes" msgid="2941317360600338602">"àºàº»àºà»€àº¥àºµàºàºàº²àº™àº¥àº¶àºš"</string>
+ <string name="sync_do_nothing" msgid="3743764740430821845">"ບà»à»ˆà»€àº®àº±àº”ຫàºàº±àº‡à»ƒàº™àº•ອນນີ້"</string>
+ <string name="choose_account_label" msgid="5655203089746423927">"ເລືອàºàºšàº±àº™àºŠàºµ"</string>
+ <string name="add_account_label" msgid="2935267344849993553">"ເພີ່ມບັນຊີ"</string>
+ <string name="add_account_button_label" msgid="3611982894853435874">"ເພີ່ມບັນຊີ"</string>
+ <string name="number_picker_increment_button" msgid="2412072272832284313">"ເພີ່ມ"</string>
+ <string name="number_picker_decrement_button" msgid="476050778386779067">"ປັບລົງ"</string>
+ <string name="number_picker_increment_scroll_mode" msgid="3073101067441638428">"<xliff:g id="VALUE">%s</xliff:g> ສຳພັດຄ້າງໄວ້."</string>
+ <string name="number_picker_increment_scroll_action" msgid="9101473045891835490">"ເລື່ອນຂຶ້ນເພື່ອເພີ່ມ à»àº¥àº°à»€àº¥àº·à»ˆàº­àº™àº¥àº»àº‡à»€àºžàº·à»ˆàº­àº«àº¼àº¸àº”."</string>
+ <string name="time_picker_increment_minute_button" msgid="8865885114028614321">"ເພີ່ມນາທີ"</string>
+ <string name="time_picker_decrement_minute_button" msgid="6246834937080684791">"ປັບນາທີລົງ"</string>
+ <string name="time_picker_increment_hour_button" msgid="3652056055810223139">"ເພີ່ມຊົ່ວໂມງ"</string>
+ <string name="time_picker_decrement_hour_button" msgid="1377479863429214792">"ຫຼຸດຊົ່ວໂມງ"</string>
+ <string name="time_picker_increment_set_pm_button" msgid="4147590696151230863">"ຕັ້ງ PM"</string>
+ <string name="time_picker_decrement_set_am_button" msgid="8302140353539486752">"ຕັ້ງ AM"</string>
+ <string name="date_picker_increment_month_button" msgid="5369998479067934110">"ເພີ່ມຈຳນວນເດືອນ"</string>
+ <string name="date_picker_decrement_month_button" msgid="1832698995541726019">"ຫຼຸດເດືອນ"</string>
+ <string name="date_picker_increment_day_button" msgid="7130465412308173903">"ເພີ່ມຈຳນວນມື້"</string>
+ <string name="date_picker_decrement_day_button" msgid="4131881521818750031">"ຫຼຸດຈຳນວນມື້"</string>
+ <string name="date_picker_increment_year_button" msgid="6318697384310808899">"ເພີ່ມປີຂຶ້ນ"</string>
+ <string name="date_picker_decrement_year_button" msgid="4482021813491121717">"ຫຼຸດຈຳນວນປີ"</string>
+ <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
+ <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"àºàº»àºà»€àº¥àºµàº"</string>
+ <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"ລຶບ"</string>
+ <string name="keyboardview_keycode_done" msgid="1992571118466679775">"à»àº¥à»‰àº§à»†"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"ປ່ຽນຮູບà»àºšàºš"</string>
+ <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
+ <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
+ <string name="activitychooserview_choose_application" msgid="2125168057199941199">"ເລືອàºà»àº­àº±àºšàº¯"</string>
+ <string name="shareactionprovider_share_with" msgid="806688056141131819">"à»àºšà»ˆàº‡àº›àº±àº™àºàº±àºš"</string>
+ <string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"à»àºšà»ˆàº‡àº›àº±àº™à»ƒàº«à»‰ <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
+ <string name="content_description_sliding_handle" msgid="415975056159262248">"ເລື່ອນບ່ອນຖື à»àº¥à»‰àº§à»àº•ະຄ້າງໄວ້."</string>
+ <string name="description_direction_up" msgid="7169032478259485180">"ເລື່ອນຂຶ້ນເພື່ອ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="5087739728639014595">"ເລື່ອນລົງເພື່ອ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="7207478719805562165">"ເລື່ອນໄປທາງຊ້າàºà»€àºžàº·à»ˆàº­ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="8034433242579600980">"ເລື່ອນໄປທາງຂວາເພື່ອ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_target_unlock" msgid="2228524900439801453">"ປົດລັອàº"</string>
+ <string name="description_target_camera" msgid="969071997552486814">"àºà»‰àº­àº‡"</string>
+ <string name="description_target_silent" msgid="893551287746522182">"ປິດສຽງ"</string>
+ <string name="description_target_soundon" msgid="30052466675500172">"ເປີດສຽງ"</string>
+ <string name="description_target_search" msgid="3091587249776033139">"ຊອàºàº«àº²"</string>
+ <string name="description_target_unlock_tablet" msgid="3833195335629795055">"ປັດເພື່ອປົດລັອàº."</string>
+ <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"ສຽບສາàºàº«àº¹àºŸàº±àº‡à»€àºžàº·à»ˆàº­àºŸàº±àº‡àº¥àº°àº«àº±àº”ຜ່ານ."</string>
+ <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"ຈà»à»‰àº²à»€àº¡àº±àº”."</string>
+ <string name="action_bar_home_description" msgid="5293600496601490216">"àºàº±àºšà»„ປໜ້າຫຼັàº"</string>
+ <string name="action_bar_up_description" msgid="2237496562952152589">"ຂຶ້ນເທິງ"</string>
+ <string name="action_menu_overflow_description" msgid="2295659037509008453">"ໂຕເລືອàºàº­àº·à»ˆàº™"</string>
+ <string name="action_bar_home_description_format" msgid="7965984360903693903">"%1$s, %2$s"</string>
+ <string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string>
+ <string name="storage_internal" msgid="4891916833657929263">"ບ່ອນຈັດເàºàº±àºšàº‚à»à»‰àº¡àº¹àº™àºžàº²àºà»ƒàº™"</string>
+ <string name="storage_sd_card" msgid="3282948861378286745">"SD card"</string>
+ <string name="storage_usb" msgid="3017954059538517278">"ບ່ອນຈັດເàºàº±àºšàº‚à»à»‰àº¡àº¹àº™ USB"</string>
+ <string name="extract_edit_menu_button" msgid="8940478730496610137">"à»àºà»‰à»„ຂ"</string>
+ <string name="data_usage_warning_title" msgid="1955638862122232342">"ເຕືອນàºà»ˆàº½àº§àºàº±àºšàºàº²àº™àº™àº³à»ƒàºŠà»‰àº‚à»à»‰àº¡àº¹àº™"</string>
+ <string name="data_usage_warning_body" msgid="2814673551471969954">"à»àº•ະເພື່ອເບິ່ງàºàº²àº™àº™àº³à»ƒàºŠà»‰ à»àº¥àº°àºàº²àº™àº•ັ້ງຄ່າ."</string>
+ <string name="data_usage_3g_limit_title" msgid="7093334419518706686">"ປິດàºàº²àº™àº™àº³à»ƒàºŠà»‰àº‚à»à»‰àº¡àº¹àº™ 2G-3G"</string>
+ <string name="data_usage_4g_limit_title" msgid="7636489436819470761">"àºàº²àº™àº™àº³à»ƒàºŠà»‰àº‚à»à»‰àº¡àº¹àº™ 4G ຖືàºàº›àº´àº”à»àº¥à»‰àº§"</string>
+ <string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"ຂà»à»‰àº¡àº¹àº™àº¡àº·àº–ືຖືàºàº›àº´àº”ໄວ້"</string>
+ <string name="data_usage_wifi_limit_title" msgid="8992154736441284865">"ປິດຂà»à»‰àº¡àº¹àº™ Wi-Fi à»àº¥à»‰àº§"</string>
+ <string name="data_usage_limit_body" msgid="3317964706973601386">"à»àº•ະເພື່ອເປີດໃຊ້."</string>
+ <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"ຂà»à»‰àº¡àº¹àº™ 2G-3G ຮອດຂີດຈຳàºàº±àº”à»àº¥à»‰àº§"</string>
+ <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"à»àº»àº”àºàº³àº™àº»àº”àºàº²àº™àº™àº³à»ƒàºŠà»‰àº‚à»à»‰àº¡àº¹àº™ 4G"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"à»àº»àº”àºàº³àº™àº»àº”àºàº²àº™àº™àº³à»ƒàºŠà»‰àº‚à»à»‰àº¡àº¹àº™à»ƒàº™àº¡àº·àº–ື"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"à»àº»àº”àºà»àº²àº™àº»àº”àºàº²àº™àº™àº³à»ƒàºŠà»‰àº‚à»à»‰àº¡àº¹àº™ Wi-Fi"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"<xliff:g id="SIZE">%s</xliff:g> ເàºàºµàº™àº—ີ່àºà»àº²â€‹àº™àº»àº”ໄວ້."</string>
+ <string name="data_usage_restricted_title" msgid="5965157361036321914">"ຂà»à»‰àº¡àº¹àº™à»àºšàº±àºàºàº£àº²àº§àº–ືàºàºˆàº³àºàº±àº”à»àº¥à»‰àº§"</string>
+ <string name="data_usage_restricted_body" msgid="6741521330997452990">"à»àº•ະເພື່ອເອົາàºàº²àº™àºˆàº³àºàº±àº”ອອàº"</string>
+ <string name="ssl_certificate" msgid="6510040486049237639">"ໃບຮັບຮອງຄວາມປອດໄພ"</string>
+ <string name="ssl_certificate_is_valid" msgid="6825263250774569373">"ໃບຮັບຮອງບà»à»ˆàº–ືàºàº•້ອງ."</string>
+ <string name="issued_to" msgid="454239480274921032">"ອອàºà»ƒàº«à»‰à»àºà»ˆ:"</string>
+ <string name="common_name" msgid="2233209299434172646">"ຊື່ສາມັນ:"</string>
+ <string name="org_name" msgid="6973561190762085236">"ອົງàºàº­àº™:"</string>
+ <string name="org_unit" msgid="7265981890422070383">"ໜ່ວàºàº­àº»àº‡àºàº­àº™:"</string>
+ <string name="issued_by" msgid="2647584988057481566">"ອອàºà»ƒàº«à»‰à»‚ດàº:"</string>
+ <string name="validity_period" msgid="8818886137545983110">"ອາàºàº¸àºàº²àº™àº™àº³à»ƒàºŠà»‰:"</string>
+ <string name="issued_on" msgid="5895017404361397232">"ອອàºà»ƒàº«à»‰à»€àº¡àº·à»ˆàº­:"</string>
+ <string name="expires_on" msgid="3676242949915959821">"à»àº»àº”ອາàºàº¸à»ƒàº™:"</string>
+ <string name="serial_number" msgid="758814067660862493">"à»àº²àºà»€àº¥àºàºŠàºµàº£àº½àº§:"</string>
+ <string name="fingerprints" msgid="4516019619850763049">"ລາàºàº™àº´à»‰àº§àº¡àº·:"</string>
+ <string name="sha256_fingerprint" msgid="4391271286477279263">"ພິມລາàºàº™àº´à»‰àº§àº¡àº· SHA-256:"</string>
+ <string name="sha1_fingerprint" msgid="7930330235269404581">"ລາàºàº™àº´à»‰àº§àº¡àº· SHA-1:"</string>
+ <string name="activity_chooser_view_see_all" msgid="4292569383976636200">"ເບິ່ງທັງຫມົດ"</string>
+ <string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"ເລືອàºàºàº´àº”ຈະàºàº³"</string>
+ <string name="share_action_provider_share_with" msgid="5247684435979149216">"à»àºšà»ˆàº‡àº›àº±àº™àºàº±àºš"</string>
+ <string name="status_bar_device_locked" msgid="3092703448690669768">"ອຸປະàºàº­àº™àº¥àº±àº­àº."</string>
+ <string name="list_delimeter" msgid="3975117572185494152">", "</string>
+ <string name="sending" msgid="3245653681008218030">"àºàº³àº¥àº±àº‡àºªàº»à»ˆàº‡..."</string>
+ <string name="launchBrowserDefault" msgid="2057951947297614725">"ເປີດໂປຣà»àºàº£àº¡àº—່ອງເວັບ?"</string>
+ <string name="SetupCallDefault" msgid="5834948469253758575">"ຮັບàºàº²àº™à»‚ທບà»à»ˆ?"</string>
+ <string name="activity_resolver_use_always" msgid="8017770747801494933">"ທຸàºàº„ັ້ງ"</string>
+ <string name="activity_resolver_use_once" msgid="2404644797149173758">"ຄັ້ງດຽວ"</string>
+ <string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"à»àº—ັບເລັດ"</string>
+ <string name="default_audio_route_name" product="default" msgid="4239291273420140123">"ໂທລະສັບ"</string>
+ <string name="default_audio_route_name_headphones" msgid="8119971843803439110">"ຫູຟັງ"</string>
+ <string name="default_audio_route_name_dock_speakers" msgid="6240602982276591864">"ບ່ອນຕັ້ງລຳໂພງ"</string>
+ <string name="default_media_route_name_hdmi" msgid="2450970399023478055">"HDMI"</string>
+ <string name="default_audio_route_category_name" msgid="3722811174003886946">"ລະບົບ"</string>
+ <string name="bluetooth_a2dp_audio_route_name" msgid="8575624030406771015">"ສຽງ Bluetooth"</string>
+ <string name="wireless_display_route_description" msgid="9070346425023979651">"àºàº²àº™àºªàº°à»àº”ງຜົນໄຮ້ສາàº"</string>
+ <string name="media_route_chooser_grouping_done" msgid="7966438307723317169">"à»àº¥à»‰àº§à»†"</string>
+ <string name="media_route_button_content_description" msgid="5758553567065145276">"ມີເດàºà»€àº­àº»à»‰àº²àºžàº¸àº”"</string>
+ <string name="media_route_status_scanning" msgid="7279908761758293783">"àºàº³àº¥àº±àº‡àºªàº°à»àºàº™..."</string>
+ <string name="media_route_status_connecting" msgid="6422571716007825440">"àºàº³àº¥àº±àº‡à»€àºŠàº·à»ˆàº­àº¡àº•à»à»ˆ..."</string>
+ <string name="media_route_status_available" msgid="6983258067194649391">"ສາມາດໃຊ້ໄດ້"</string>
+ <string name="media_route_status_not_available" msgid="6739899962681886401">"ບà»à»ˆàºªàº²àº¡àº²àº”ໃຊ້ໄດ້"</string>
+ <string name="media_route_status_in_use" msgid="4533786031090198063">"àºàº³àº¥àº±àº‡à»ƒàºŠà»‰àº¢àº¹à»ˆ"</string>
+ <string name="display_manager_built_in_display_name" msgid="2583134294292563941">"ໜ້າຈà»àº—ີ່ຕິດມານຳ"</string>
+ <string name="display_manager_hdmi_display_name" msgid="1555264559227470109">"ຈ໠HDMI"</string>
+ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"àºàº²àº™àº§àº²àº‡àºŠà»‰àº­àº™ #<xliff:g id="ID">%1$d</xliff:g>"</string>
+ <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
+ <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", ປອດໄພ"</string>
+ <string name="wifi_display_notification_title" msgid="2223050649240326557">"ເຊື່ອມຕà»à»ˆàºàº²àº™àºªàº°à»àº”ງຜົນໄຮ້ສາàºà»àº¥à»‰àº§"</string>
+ <string name="wifi_display_notification_message" msgid="4498802012464170685">"ຈà»àº™àºµà»‰àºàº³àº¥àº±àº‡àºªàº°à»àº”ງຢູ່ໃນອຸປະàºàº­àº™àº­àº·à»ˆàº™"</string>
+ <string name="wifi_display_notification_disconnect" msgid="6183754463561153372">"ຢຸດàºàº²àº™à»€àºŠàº·à»ˆàº­àº¡àº•à»à»ˆ"</string>
+ <string name="kg_emergency_call_label" msgid="684946192523830531">"àºàº²àº™à»‚ທສຸàºà»€àºªàºµàº™"</string>
+ <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"ລືມຮູບà»àºšàºšàº›àº»àº”ລັອàº?"</string>
+ <string name="kg_wrong_pattern" msgid="1850806070801358830">"ຮູບà»àºšàºšàºœàº´àº”"</string>
+ <string name="kg_wrong_password" msgid="2333281762128113157">"ລະຫັດຜ່ານບà»à»ˆàº–ືàºàº•້ອງ"</string>
+ <string name="kg_wrong_pin" msgid="1131306510833563801">"ລະຫັດ PIN ຜິດ"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"ລອງໃà»à»ˆà»ƒàº™àº­àºµàº <xliff:g id="NUMBER">%1$d</xliff:g> ວິນາທີ."</string>
+ <string name="kg_pattern_instructions" msgid="398978611683075868">"à»àº•້ມຮູບà»àºšàºšàº›àº»àº”ລັອàºàº‚ອງທ່ານ"</string>
+ <string name="kg_sim_pin_instructions" msgid="2319508550934557331">"ໃສ່ລະຫັດ PIN ຂອງຊິມ"</string>
+ <string name="kg_pin_instructions" msgid="2377242233495111557">"ໃສ່ລະຫັດ PIN"</string>
+ <string name="kg_password_instructions" msgid="5753646556186936819">"ໃສ່ລະຫັດຜ່ານ"</string>
+ <string name="kg_puk_enter_puk_hint" msgid="453227143861735537">"ຊິມຖືàºàº›àº´àº”àºàº²àº™àº™àº³à»ƒàºŠà»‰à»àº¥à»‰àº§. ປ້ອນລະຫັດ PUK ເພື່ອດຳເນີນàºàº²àº™àº•à»à»ˆ. ຕິດຕà»à»ˆàºœàº¹à»ˆà»ƒàº«à»‰àºšà»àº¥àº´àºàº²àº™àºªàº³àº¥àº±àºšàº¥àº²àºàº¥àº°àº­àº½àº”."</string>
+ <string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"ໃສ່ລະຫັດ PIN ທີ່ຕ້ອງàºàº²àº™."</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"ຢືນຢັນລະຫັດ PIN ທີ່ຕ້ອງàºàº²àº™"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"ປົດລັອຠSIM card..."</string>
+ <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"ລະຫັດ PIN ບà»à»ˆàº–ືàºàº•້ອງ."</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"ພິມລະຫັດ PIN ຄວາມàºàº²àº§ 4 ເຖິງ 8 ໂຕເລàº."</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"ລະຫັດ PUK ຄວນມີຢ່າງໜ້ອຠ8 ໂຕເລàº."</string>
+ <string name="kg_invalid_puk" msgid="3638289409676051243">"ປ້ອນລະຫັດ PUK ທີ່ຖືàºàº•້ອງຄືນໃà»à»ˆ. àºàº²àº™àºžàº°àºàº²àºàº²àº¡à»ƒàºªà»ˆàº«àº¼àº²àºà»€àº—ື່ອຈະເຮັດໃຫ້ຊິມàºàº²àº”ໃຊ້ບà»à»ˆà»„ດ້ຖາວອນ."</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"ລະຫັດ PIN ບà»à»ˆàºàº»àº‡àºàº±àº™"</string>
+ <string name="kg_login_too_many_attempts" msgid="6486842094005698475">"à»àº•້ມຮູບà»àºšàºšàº›àº»àº”ລັອàºàº«àº¼àº²àºà»€àºàºµàº™à»„ປ"</string>
+ <string name="kg_login_instructions" msgid="1100551261265506448">"ເພື່ອປົດລັອàº, ເຂົ້າສູ່ລະບົບດ້ວàºàºšàº±àº™àºŠàºµ Google ຂອງທ່ານ."</string>
+ <string name="kg_login_username_hint" msgid="5718534272070920364">"ຊື່ຜູ່ໃຊ້ (ອີເມວ)"</string>
+ <string name="kg_login_password_hint" msgid="9057289103827298549">"ລະຫັດຜ່ານ"</string>
+ <string name="kg_login_submit_button" msgid="5355904582674054702">"ເຂົ້າສູ່ລະບົບ"</string>
+ <string name="kg_login_invalid_input" msgid="5754664119319872197">"ຊື່ຜູ່ໃຊ້ ຫຼືລະຫັດຜ່ານບà»à»ˆàº–ືàºàº•້ອງ."</string>
+ <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"ລືມຊື່ຜູ່ໃຊ້ ຫຼືລະຫັດຜ່ານຂອງທ່ານບà»à»ˆ?\nໄປທີ່ "<b>"google.com/accounts/recovery"</b>"."</string>
+ <string name="kg_login_checking_password" msgid="1052685197710252395">"àºàº³àº¥àº±àº‡àºàº§àº”ສອບບັນຊີ..."</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"ທ່ານພິມລະຫັດ PIN​ ຂອງທ່ານຜິດ <xliff:g id="NUMBER_0">%d</xliff:g> ເທື່ອà»àº¥à»‰àº§. \n\nàºàº°àº¥àº¸àº™àº²àº¥àº­àº‡à»ƒà»à»ˆà»ƒàº™àº­àºµàº <xliff:g id="NUMBER_1">%d</xliff:g> ວິນາທີ."</string>
+ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"ທ່ານພິມລະຫັດຜິດ <xliff:g id="NUMBER_0">%d</xliff:g> ເທື່ອà»àº¥à»‰àº§. \n\nລອງໃà»à»ˆà»ƒàº™àº­àºµàº <xliff:g id="NUMBER_1">%d</xliff:g> ວິນາທີ."</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"ທ່ານà»àº•້ມຮູບà»àºšàºšàº›àº»àº”ລັອàºàº‚ອງທ່ານຜິດ <xliff:g id="NUMBER_0">%d</xliff:g> ເທື່ອà»àº¥à»‰àº§. \n\nàºàº°àº¥àº¸àº™àº²àº¥àº­àº‡à»ƒà»à»ˆà»ƒàº™àº­àºµàº <xliff:g id="NUMBER_1">%d</xliff:g> ວິນາທີ."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1575557200627128949">"ທ່ານໄດ້ພະàºàº²àºàº²àº¡àº›àº»àº”ລັອàºà»àº—ັບເລັດບà»à»ˆàºªàº³à»€àº¥àº±àº” <xliff:g id="NUMBER_0">%d</xliff:g> ເທື່ອà»àº¥à»‰àº§. ຫຼັງຈາàºàº„ວາມພະàºàº²àºàº²àº¡àº­àºµàº <xliff:g id="NUMBER_1">%d</xliff:g> ເທື່ອ à»àº—ັບເລັດຂອງທ່ານຈະຖືàºàº•ັ້ງ ໃຫ້àºàº±àºšà»„ປໃຊ້ຄ່າເລີ່ມຕົ້ນຈາàºà»‚ຮງງານຄືນໃà»à»ˆ à»àº¥àº°àº‚à»à»‰àº¡àº¹àº™àºœàº¹à»ˆà»ƒàºŠà»‰àº—ັງà»àº»àº”ຈະສູນຫາàºà»„ປ."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="4051015943038199910">"ທ່ານໄດ້ພະàºàº²àºàº²àº¡àº›àº»àº”ລັອàºà»‚ທລະສັບບà»à»ˆàºªàº³à»€àº¥àº±àº” <xliff:g id="NUMBER_0">%d</xliff:g> ເທື່ອà»àº¥à»‰àº§. ຫຼັງຈາàºàº„ວາມພະàºàº²àºàº²àº¡àº­àºµàº <xliff:g id="NUMBER_1">%d</xliff:g> ເທື່ອ ໂທລະສັບຂອງທ່ານຈະຖືàºàº•ັ້ງ ໃຫ້àºàº±àºšà»„ປໃຊ້ຄ່າເລີ່ມຕົ້ນຈາàºà»‚ຮງງານຄືນໃà»à»ˆ à»àº¥àº°àº‚à»à»‰àº¡àº¹àº™àºœàº¹à»ˆà»ƒàºŠà»‰àº—ັງà»àº»àº”ຈະສູນຫາàºà»„ປ."</string>
+ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="2072996269148483637">"ທ່ານໄດ້ພະàºàº²àºàº²àº¡àº›àº»àº”ລັອàºà»àº—ັບເລັດບà»à»ˆàºªàº³à»€àº¥àº±àº” <xliff:g id="NUMBER">%d</xliff:g> ເທື່ອà»àº¥à»‰àº§. ຕອນນີ້à»àº—ັບເລັດຈະຖືàºàº•ັ້ງໃຫ້àºàº±àºšà»„ປໃຊ້ຄ່າເລີ່ມຕົ້ນຈາàºà»‚ຮງງານ."</string>
+ <string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"ທ່ານໄດ້ພະàºàº²àºàº²àº¡àº›àº»àº”ລັອàºà»‚ທລະສັບບà»à»ˆàº–ືຠ<xliff:g id="NUMBER">%d</xliff:g> ເທື່ອà»àº¥à»‰àº§. ຕອນນີ້ໂທລະສັບຈະຖືàºàº£àºµà»€àºŠàº±àº”ເປັນຄ່າຈາàºà»‚ຮງງານ."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"ທ່ານà»àº•້ມຮູບà»àºšàºšàº›àº»àº”ລັອàºàºœàº´àº” <xliff:g id="NUMBER_0">%d</xliff:g> ເທື່ອà»àº¥à»‰àº§. ຫຼັງຈາàºà»àº•້ມຜິດອີຠ<xliff:g id="NUMBER_1">%d</xliff:g> ເທື່ອ, ທ່ານຈະຖືàºàº–າມໃຫ້ປົດລັອàºà»àº—ັບເລັດຂອງທ່ານ ດ້ວàºàºàº²àº™à»€àº‚ົ້າສູ່ລະບົບໂດàºà»ƒàºŠà»‰àº­àºµà»€àº¡àº§àº‚ອງທ່ານ.\n\n àºàº°àº¥àº¸àº™àº²àº¥àº­àº‡à»ƒà»à»ˆàº­àºµàºàº„ັ້ງໃນອີຠ<xliff:g id="NUMBER_2">%d</xliff:g> ວິນາທີ."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"ທ່ານà»àº•້ມຮູບà»àºšàºšàº›àº»àº”ລັອàºàº‚ອງທ່ານຜິດ <xliff:g id="NUMBER_0">%d</xliff:g> ເທື່ອà»àº¥à»‰àº§. ຫຼັງຈາàºàº„ວາມພະàºàº²àºàº²àº¡àº­àºµàº <xliff:g id="NUMBER_1">%d</xliff:g> ເທື່ອ ທ່ານຈະຖືàºàº–າມໃຫ້ປົດລັອàºà»‚ທລະສັບຂອງທ່ານດ້ວàºàºšàº±àº™àºŠàºµàº­àºµà»€àº¡àº§.\n\n ລອງໃà»à»ˆàº­àºµàºàº„ັ້ງໃນ <xliff:g id="NUMBER_2">%d</xliff:g> ວິນາທີ."</string>
+ <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
+ <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"ລຶບອອàº"</string>
+ <string name="safe_media_volume_warning" product="default" msgid="7324161939475478066">"ຕ້ອງàºàº²àº™à»€àºžàºµà»ˆàº¡àº¥àº°àº”ັບສຽງຈົນເàºàºµàº™àº¥àº°àº”ັບທີ່à»àº™àº°àº™àº³?\nàºàº²àº™àºŸàº±àº‡à»ƒàº™àº¥àº°àº”ັບສຽງດັງເປັນເວລາດົນ ອາດທຳລາàºàºàº²àº™à»„ດ້àºàº´àº™àºªàº½àº‡àº‚ອງທ່ານໄດ້."</string>
+ <string name="continue_to_enable_accessibility" msgid="1626427372316070258">"àºàº»àº”ສອງນິ້ວຄ້າງໄວ້ເພື່ອເປີດໃຊ້àºàº²àº™àºŠà»ˆàº§àºà»€àº‚ົ້າເຖິງ"</string>
+ <string name="accessibility_enabled" msgid="1381972048564547685">"ເປີດàºàº²àº™àºŠà»ˆàº§àºà»€àº‚ົ້າເຖິງà»àº¥à»‰àº§."</string>
+ <string name="enable_accessibility_canceled" msgid="3833923257966635673">"àºàº»àºà»€àº¥àºµàºà»‚ຕຊ່ວàºàºàº²àº™à»€àº‚ົ້າເຖິງà»àº¥à»‰àº§."</string>
+ <string name="user_switched" msgid="3768006783166984410">"ຜູ່ໃຊ້ປັດຈຸບັນ <xliff:g id="NAME">%1$s</xliff:g> ."</string>
+ <string name="owner_name" msgid="2716755460376028154">"ເຈົ້າຂອງ"</string>
+ <string name="error_message_title" msgid="4510373083082500195">"ຜິດພາດ"</string>
+ <string name="app_no_restricted_accounts" msgid="5739463249673727736">"à»àº­àº±àºšàºžàº¥àº´à»€àº„ຊັນນີ້ບà»à»ˆàº®àº­àº‡àº®àº±àºšàºšàº±àº™àºŠàºµàº‚ອງໂປຣໄຟລ໌ທີ່ຖືàºàºˆàº³àºàº±àº”."</string>
+ <string name="app_not_found" msgid="3429141853498927379">"ບà»à»ˆàºžàº»àºšà»àº­àº±àºšàºžàº¥àº´à»€àº„ຊັນເພື່ອຈັດàºàº²àº™à»€àº®àº±àº”ວຽàºàº™àºµà»‰."</string>
+ <string name="revoke" msgid="5404479185228271586">"ຖອນ"</string>
+ <string name="mediaSize_iso_a0" msgid="7875427489420821793">"ISO A0"</string>
+ <string name="mediaSize_iso_a1" msgid="3760734499050875356">"ISO A1"</string>
+ <string name="mediaSize_iso_a2" msgid="5973266378020144382">"ISO A2"</string>
+ <string name="mediaSize_iso_a3" msgid="1373407105687300884">"ISO A3"</string>
+ <string name="mediaSize_iso_a4" msgid="6689772807982597254">"ISO A4"</string>
+ <string name="mediaSize_iso_a5" msgid="5353549652015741040">"ISO A5"</string>
+ <string name="mediaSize_iso_a6" msgid="8585038048674911907">"ISO A6"</string>
+ <string name="mediaSize_iso_a7" msgid="6641836716963839119">"ISO A7"</string>
+ <string name="mediaSize_iso_a8" msgid="7571139437465693355">"ISO A8"</string>
+ <string name="mediaSize_iso_a9" msgid="1378455891957115079">"ISO A9"</string>
+ <string name="mediaSize_iso_a10" msgid="2480747457429475344">"ISO A10"</string>
+ <string name="mediaSize_iso_b0" msgid="3965935097661108039">"ISO B0"</string>
+ <string name="mediaSize_iso_b1" msgid="2505753285010115437">"ISO B1"</string>
+ <string name="mediaSize_iso_b2" msgid="8763874709859458453">"ISO B2"</string>
+ <string name="mediaSize_iso_b3" msgid="4210506688191764076">"ISO B3"</string>
+ <string name="mediaSize_iso_b4" msgid="5749404165888526034">"ISO B4"</string>
+ <string name="mediaSize_iso_b5" msgid="7640627414621904733">"ISO B5"</string>
+ <string name="mediaSize_iso_b6" msgid="7342988864712748544">"ISO B6"</string>
+ <string name="mediaSize_iso_b7" msgid="5069844065235382429">"ISO B7"</string>
+ <string name="mediaSize_iso_b8" msgid="7316818922278779774">"ISO B8"</string>
+ <string name="mediaSize_iso_b9" msgid="5414727094026532341">"ISO B9"</string>
+ <string name="mediaSize_iso_b10" msgid="5251253731832048185">"ISO B10"</string>
+ <string name="mediaSize_iso_c0" msgid="4003138342671964217">"ISO C0"</string>
+ <string name="mediaSize_iso_c1" msgid="1935188063393553008">"ISO C1"</string>
+ <string name="mediaSize_iso_c2" msgid="3197307969712069904">"ISO C2"</string>
+ <string name="mediaSize_iso_c3" msgid="4335826087321913508">"ISO C3"</string>
+ <string name="mediaSize_iso_c4" msgid="3745639598281015005">"ISO C4"</string>
+ <string name="mediaSize_iso_c5" msgid="8269457765822791013">"ISO C5"</string>
+ <string name="mediaSize_iso_c6" msgid="566666105260346930">"ISO C6"</string>
+ <string name="mediaSize_iso_c7" msgid="8678413180782608498">"ISO C7"</string>
+ <string name="mediaSize_iso_c8" msgid="8392376206627041730">"ISO C8"</string>
+ <string name="mediaSize_iso_c9" msgid="9191613372324845405">"ISO C9"</string>
+ <string name="mediaSize_iso_c10" msgid="7327709699184920822">"ISO C10"</string>
+ <string name="mediaSize_na_letter" msgid="4191805615829472953">"ຈົດà»àº²àº"</string>
+ <string name="mediaSize_na_gvrnmt_letter" msgid="7853382192649405507">"ຈົດ​ຫມາàºàº—າງ​ລັດ​ຖະ​ບານ"</string>
+ <string name="mediaSize_na_legal" msgid="6697982988283823150">"àºàº»àº”ຫມາàº"</string>
+ <string name="mediaSize_na_junior_legal" msgid="3727743969902758948">"àºàº»àº”à»àº²àºàº‚ັ້ນຕ່ຳ"</string>
+ <string name="mediaSize_na_ledger" msgid="281871464896601236">"ບັນ​ຊີ"</string>
+ <string name="mediaSize_na_tabloid" msgid="5775966416333578127">"à»àº–ບບລອàº"</string>
+ <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"àºàº»àºà»€àº¥àºµàºà»àº¥à»‰àº§"</string>
+ <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"ເນື້ອ​ໃນ​àºàº²àº™àº‚ຽນຜິດພາດ"</string>
+ <string name="restr_pin_enter_pin" msgid="3395953421368476103">"ໃສ່ລະຫັດ PIN"</string>
+ <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"PIN ປະ​ຈຸ​ບັນ"</string>
+ <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"ລະຫັດ PIN ໃà»à»ˆ"</string>
+ <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"ຢືນຢັນລະຫັດ PIN ໃà»à»ˆ"</string>
+ <string name="restr_pin_create_pin" msgid="8017600000263450337">"ສ້າງ PIN ສà»àº²â€‹àº¥àº±àºšâ€‹àºàº²àº™â€‹àº›àº±àºšâ€‹àº›àº¸àº‡â€‹àº‚à»à»‰àºˆà»àº²â€‹àºàº±àº”"</string>
+ <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"PIN ບà»à»ˆâ€‹àºàº»àº‡àºàº±àº™. ລອງໃà»à»ˆàº­àºµàºàº„ັ້ງ​."</string>
+ <string name="restr_pin_error_too_short" msgid="8173982756265777792">"PIN ​ສັ້ນ​ເàºàºµàº™â€‹à»„ປ​. ຕ້ອງມີຢ່າງໜ້ອຠ4 ຫຼັàºâ€‹."</string>
+ <plurals name="restr_pin_countdown">
+ <item quantity="one" msgid="4835639969503729874">"PIN ​ບà»à»ˆâ€‹àº–ືàºâ€‹àº•້ອງ​. ລອງໃà»à»ˆà»ƒàº™àº­àºµàº 1 ວິນາທີ."</item>
+ <item quantity="other" msgid="8030607343223287654">"PIN ບà»à»ˆâ€‹àº–ືàºâ€‹àº•້ອງ​. ລອງໃà»à»ˆà»ƒàº™àº­àºµàº <xliff:g id="COUNT">%d</xliff:g> ວິ​ນາ​ທີ​."</item>
+ </plurals>
+ <string name="transient_navigation_confirmation" msgid="4907844043611123426">"ປັດຢູ່ຂອບຂອງໜ້າຈà»à»€àºžàº·à»ˆàº­àºªàº°à»àº”ງà»àº–ບ"</string>
+ <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"ປັດຢູ່ຂອບຂອງໜ້າຈà»à»€àºžàº·à»ˆàº­àºªàº°à»àº”ງà»àº–ບຂອງລະບົບ"</string>
+</resources>
diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml
index 9fa41c9..517890d 100644
--- a/core/res/res/values-lt/strings.xml
+++ b/core/res/res/values-lt/strings.xml
@@ -50,6 +50,11 @@
<string name="invalidPuk" msgid="8761456210898036513">"Įveskite 8 skaitmenų ar ilgesnį PUK kodą."</string>
<string name="needPuk" msgid="919668385956251611">"Jūsų SIM kortelė yra užrakinta PUK kodu. Jei norite ją atrakinti, įveskite PUK kodą."</string>
<string name="needPuk2" msgid="4526033371987193070">"Įveskite PUK2 kodą, kad panaikintumėte SIM kortelės blokavimą."</string>
+ <string name="enablePin" msgid="209412020907207950">"Nepavyko. Įgalinti SIM / RUIM užraktą."</string>
+ <plurals name="pinpuk_attempts">
+ <item quantity="one" msgid="6596245285809790142">"Liko <xliff:g id="NUMBER">%d</xliff:g> band. Paskui SIM kortelė bus užrakinta."</item>
+ <item quantity="other" msgid="7530597808358774740">"Liko <xliff:g id="NUMBER">%d</xliff:g> band. Paskui SIM kortelė bus užrakinta."</item>
+ </plurals>
<string name="imei" msgid="2625429890869005782">"IMEI"</string>
<string name="meid" msgid="4841221237681254195">"MEID"</string>
<string name="ClipMmi" msgid="6952821216480289285">"Ä®einanÄio skambintojo ID"</string>
@@ -477,6 +482,8 @@
<string name="permdesc_accessSurfaceFlinger" msgid="1041619516733293551">"Leidžiama programai naudoti „SurfaceFlinger“ žemo lygio funkcijas."</string>
<string name="permlab_readFrameBuffer" msgid="6690504248178498136">"skaityti kadrų buferį"</string>
<string name="permdesc_readFrameBuffer" msgid="4937405521809454680">"Leidžiama programai skaityti rėmelio buferio turinį."</string>
+ <string name="permlab_accessInputFlinger" msgid="5348635270689553857">"pasiekti „InputFlinger“"</string>
+ <string name="permdesc_accessInputFlinger" msgid="2104864941201226616">"Programai leidžiama naudoti „InputFlinger“ žemo lygio funkcijas."</string>
<string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"konfigūruoti „Wi-Fi“ pateiktis"</string>
<string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"Leidžiama programai konfigÅ«ruoti ir prisijungti prie „Wi-Fi“ pateikÄių."</string>
<string name="permlab_controlWifiDisplay" msgid="393641276723695496">"valdyti „Wi-Fi“ pateiktis"</string>
@@ -1414,6 +1421,7 @@
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Įvesti"</string>
<string name="activitychooserview_choose_application" msgid="2125168057199941199">"Pasirinkite programÄ…"</string>
+ <string name="activitychooserview_choose_application_error" msgid="8624618365481126668">"Nepavyko paleisti „<xliff:g id="APPLICATION_NAME">%s</xliff:g>“"</string>
<string name="shareactionprovider_share_with" msgid="806688056141131819">"Bendrinti su"</string>
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Bendrinti su „<xliff:g id="APPLICATION_NAME">%s</xliff:g>“"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Slydimo valdymas. Palieskite ir laikykite."</string>
@@ -1650,4 +1658,15 @@
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"VÄ—liau bandykite dar kartÄ…"</string>
<string name="immersive_mode_confirmation" msgid="7227416894979047467">"Perbraukite nuo viršaus žemyn, kad išeitumėte iš viso ekrano režimo"</string>
+ <string name="done_label" msgid="2093726099505892398">"Atlikta"</string>
+ <string name="hour_picker_description" msgid="6698199186859736512">"Apskritas valandų slankiklis"</string>
+ <string name="minute_picker_description" msgid="8606010966873791190">"Apskritas minuÄių slankiklis"</string>
+ <string name="select_hours" msgid="6043079511766008245">"Pasirinkite valandas"</string>
+ <string name="select_minutes" msgid="3974345615920336087">"Pasirinkite minutes"</string>
+ <string name="day_picker_description" msgid="8990847925961297968">"Mėnesio dienų tinklelis"</string>
+ <string name="year_picker_description" msgid="5524331207436052403">"Metų sąrašas"</string>
+ <string name="select_day" msgid="7774759604701773332">"Pasirinkite mėnesį ir dieną"</string>
+ <string name="select_year" msgid="7952052866994196170">"Pasirinkite metus"</string>
+ <string name="item_is_selected" msgid="949687401682476608">"Pasirinkta: <xliff:g id="ITEM">%1$s</xliff:g>"</string>
+ <string name="deleted_key" msgid="7659477886625566590">"Ištrinta: <xliff:g id="KEY">%1$s</xliff:g>"</string>
</resources>
diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml
index 036d5d6..3bbb8b7 100644
--- a/core/res/res/values-lv/strings.xml
+++ b/core/res/res/values-lv/strings.xml
@@ -50,6 +50,11 @@
<string name="invalidPuk" msgid="8761456210898036513">"Ierakstiet PUK kodu, kas sastÄv no 8 vai vairÄk cipariem."</string>
<string name="needPuk" msgid="919668385956251611">"SIM karte ir bloķēta ar PUK kodu. Ierakstiet PUK kodu, lai to atbloķētu."</string>
<string name="needPuk2" msgid="4526033371987193070">"Ierakstiet PUK2 kodu, lai atbloķētu SIM karti."</string>
+ <string name="enablePin" msgid="209412020907207950">"NeizdevÄs. IespÄ“jojiet SIM/RUIM bloķēšanu."</string>
+ <plurals name="pinpuk_attempts">
+ <item quantity="one" msgid="6596245285809790142">"Varat mēģinÄt vÄ“l <xliff:g id="NUMBER">%d</xliff:g> reizi, pirms SIM karte tiks bloÄ·Ä“ta."</item>
+ <item quantity="other" msgid="7530597808358774740">"Varat mēģinÄt vÄ“l <xliff:g id="NUMBER">%d</xliff:g> reizi(-es), pirms SIM karte tiks bloÄ·Ä“ta."</item>
+ </plurals>
<string name="imei" msgid="2625429890869005782">"IMEI"</string>
<string name="meid" msgid="4841221237681254195">"MEID"</string>
<string name="ClipMmi" msgid="6952821216480289285">"IenÄkoÅ¡Ä zvana zvanÄ«tÄja ID"</string>
@@ -477,6 +482,8 @@
<string name="permdesc_accessSurfaceFlinger" msgid="1041619516733293551">"Ļauj lietotnei lietot SurfaceFlinger zema līmeņa funkcijas."</string>
<string name="permlab_readFrameBuffer" msgid="6690504248178498136">"lasīt kadru buferi"</string>
<string name="permdesc_readFrameBuffer" msgid="4937405521809454680">"Ļauj lietotnei lasīt kadru bufera saturu."</string>
+ <string name="permlab_accessInputFlinger" msgid="5348635270689553857">"Piekļuve InputFlinger"</string>
+ <string name="permdesc_accessInputFlinger" msgid="2104864941201226616">"Ļauj lietotnei izmantot InputFlinger zema līmeņa funkcijas."</string>
<string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"Wi-Fi displeju konfigurēšana"</string>
<string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"Ļauj lietotnei konfigurēt Wi-Fi displejus un veidot savienojumu ar tiem."</string>
<string name="permlab_controlWifiDisplay" msgid="393641276723695496">"Wi-Fi displeju vadība"</string>
@@ -1414,6 +1421,7 @@
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"PÄrslÄ“gÅ¡anas taustiņš"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Ievadīšanas taustiņš"</string>
<string name="activitychooserview_choose_application" msgid="2125168057199941199">"Izvēlieties lietotni"</string>
+ <string name="activitychooserview_choose_application_error" msgid="8624618365481126668">"Nevarēja palaist lietotni <xliff:g id="APPLICATION_NAME">%s</xliff:g>."</string>
<string name="shareactionprovider_share_with" msgid="806688056141131819">"Kopīgot ar:"</string>
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Kopīgot ar lietojumprogrammu <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"BÄ«dÄms turis. Pieskarieties tam un turiet to nospiestu."</string>
@@ -1650,4 +1658,15 @@
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"VÄ“lÄk mēģiniet vÄ“lreiz."</string>
<string name="immersive_mode_confirmation" msgid="7227416894979047467">"Lai izietu no pilnekrÄna režīma, velciet no augÅ¡as uz leju."</string>
+ <string name="done_label" msgid="2093726099505892398">"Gatavs"</string>
+ <string name="hour_picker_description" msgid="6698199186859736512">"Stundu apļveida slīdnis"</string>
+ <string name="minute_picker_description" msgid="8606010966873791190">"Minūšu apļveida slīdnis"</string>
+ <string name="select_hours" msgid="6043079511766008245">"Atlasiet stundas."</string>
+ <string name="select_minutes" msgid="3974345615920336087">"Atlasiet minūtes."</string>
+ <string name="day_picker_description" msgid="8990847925961297968">"Režģis ar mÄ“neÅ¡a dienÄm"</string>
+ <string name="year_picker_description" msgid="5524331207436052403">"Gadu saraksts"</string>
+ <string name="select_day" msgid="7774759604701773332">"Atlasiet mēnesi un dienu."</string>
+ <string name="select_year" msgid="7952052866994196170">"Atlasiet gadu."</string>
+ <string name="item_is_selected" msgid="949687401682476608">"Atlasīts: <xliff:g id="ITEM">%1$s</xliff:g>"</string>
+ <string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> tika dzēsts."</string>
</resources>
diff --git a/core/res/res/values-mn-rMN/strings.xml b/core/res/res/values-mn-rMN/strings.xml
index fe3d78b..d9ac5ea 100644
--- a/core/res/res/values-mn-rMN/strings.xml
+++ b/core/res/res/values-mn-rMN/strings.xml
@@ -50,6 +50,11 @@
<string name="invalidPuk" msgid="8761456210898036513">"8-Ñ Ñ†Ó©Ó©Ð½Ð³Ò¯Ð¹ Ñ‚Ð¾Ð¾Ð½Ð¾Ð¾Ñ Ð±Ò¯Ñ‚ÑÑ… PUK-г Ð±Ð¸Ñ‡Ð½Ñ Ò¯Ò¯."</string>
<string name="needPuk" msgid="919668385956251611">"SIM картны PUK-түгжигдÑÑн. Тайлах бол PUK кодыг Ð±Ð¸Ñ‡Ð½Ñ Ò¯Ò¯."</string>
<string name="needPuk2" msgid="4526033371987193070">"SIM картын хаалтыг болиулах бол PUK2-г Ð±Ð¸Ñ‡Ð½Ñ Ò¯Ò¯."</string>
+ <string name="enablePin" msgid="209412020907207950">"Ðмжилтгүй боллоо, СИМ/РҮИМ түгжÑÑг идÑÐ²Ñ…Ð¶Ò¯Ò¯Ð»Ð½Ñ Ò¯Ò¯."</string>
+ <plurals name="pinpuk_attempts">
+ <item quantity="one" msgid="6596245285809790142">"Таны СИМ түгжигдÑÑ…ÑÑÑ Ó©Ð¼Ð½Ó© танд <xliff:g id="NUMBER">%d</xliff:g> оролдлого хийх боломж үлдлÑÑ."</item>
+ <item quantity="other" msgid="7530597808358774740">"СИМ түгжигдÑÑ…ÑÑÑ Ó©Ð¼Ð½Ó© танд <xliff:g id="NUMBER">%d</xliff:g> оролдлого хийх боломж үлдлÑÑ."</item>
+ </plurals>
<string name="imei" msgid="2625429890869005782">"IMEI"</string>
<string name="meid" msgid="4841221237681254195">"MEID"</string>
<string name="ClipMmi" msgid="6952821216480289285">"Дуудлага хийгчийн ID"</string>
@@ -477,6 +482,8 @@
<string name="permdesc_accessSurfaceFlinger" msgid="1041619516733293551">"Ðпп нь SurfaceFlinger доод-төвшиний функцийг ашиглах боломжтой."</string>
<string name="permlab_readFrameBuffer" msgid="6690504248178498136">"ФрÑйм буферÑÑÑ ÑƒÐ½ÑˆÐ¸Ñ…"</string>
<string name="permdesc_readFrameBuffer" msgid="4937405521809454680">"Ðпп нь фрÑйм буферын контентыг унших боломжтой."</string>
+ <string name="permlab_accessInputFlinger" msgid="5348635270689553857">"InputFlinger-т хандалт хийх"</string>
+ <string name="permdesc_accessInputFlinger" msgid="2104864941201226616">"Ðпп-д SurfaceFlinger доод-түвшний функцуудыг ашиглах боломж олгоно."</string>
<string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"Wifi дÑлгÑцийг тохируулах"</string>
<string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"Ðпп нь Wifi дÑлгÑцийг тохируулах болон холбогдох боломжтой."</string>
<string name="permlab_controlWifiDisplay" msgid="393641276723695496">"Wifi дÑлгÑцийг удирдах"</string>
@@ -1414,6 +1421,7 @@
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Шифт"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Оруулах"</string>
<string name="activitychooserview_choose_application" msgid="2125168057199941199">"Ðпп Ñонгох"</string>
+ <string name="activitychooserview_choose_application_error" msgid="8624618365481126668">"<xliff:g id="APPLICATION_NAME">%s</xliff:g>-г Ñхлүүлж чадÑангүй"</string>
<string name="shareactionprovider_share_with" msgid="806688056141131819">"Хуваалцах"</string>
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"<xliff:g id="APPLICATION_NAME">%s</xliff:g>-тай хуваалцана уу"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Бариулыг гулÑуулна. ХүрÑÑд хүлÑÑнÑ."</string>
@@ -1649,5 +1657,16 @@
<item quantity="other" msgid="4730868920742952817">"<xliff:g id="COUNT">%d</xliff:g> Ñекундын дараа дахин оролдоно уу"</item>
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Дараа дахин оролдоно уу"</string>
- <string name="immersive_mode_confirmation" msgid="7227416894979047467">"БүтÑн дÑлгÑцÑÑÑ Ð³Ð°Ñ€Ð°Ñ…Ñ‹Ð½ тулд дÑÑÑ€ÑÑÑ Ð½ÑŒ ÑхлÑн доош шудрана уу."</string>
+ <string name="immersive_mode_confirmation" msgid="7227416894979047467">"БүтÑн дÑлгÑцÑÑÑ Ð³Ð°Ñ€Ð°Ñ…Ñ‹Ð½ тулд дÑÑÑ€ÑÑÑ Ð½ÑŒ доош шудрана уу."</string>
+ <string name="done_label" msgid="2093726099505892398">"ДууÑÑан"</string>
+ <string name="hour_picker_description" msgid="6698199186859736512">"Цаг гүйлгÑгч"</string>
+ <string name="minute_picker_description" msgid="8606010966873791190">"Минут гүйлгÑгч"</string>
+ <string name="select_hours" msgid="6043079511766008245">"Цаг Ñонгоно уу"</string>
+ <string name="select_minutes" msgid="3974345615920336087">"Минут Ñонгоно уу"</string>
+ <string name="day_picker_description" msgid="8990847925961297968">"Өдрүүдийг Ñараар"</string>
+ <string name="year_picker_description" msgid="5524331207436052403">"Жилийн жагÑаалт"</string>
+ <string name="select_day" msgid="7774759604701773332">"Сар болон өдрийг Ñонгоно уу"</string>
+ <string name="select_year" msgid="7952052866994196170">"Жилийг Ñонгоно уу"</string>
+ <string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> ÑонгогдÑон"</string>
+ <string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> уÑÑ‚Ñан"</string>
</resources>
diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml
new file mode 100644
index 0000000..e0c9478
--- /dev/null
+++ b/core/res/res/values-mn/strings.xml
@@ -0,0 +1,1586 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="byteShort" msgid="8340973892742019101">"B"</string>
+ <string name="kilobyteShort" msgid="5973789783504771878">"КБ"</string>
+ <string name="megabyteShort" msgid="6355851576770428922">"МБ"</string>
+ <string name="gigabyteShort" msgid="3259882455212193214">"ГБ"</string>
+ <string name="terabyteShort" msgid="231613018159186962">"TБ"</string>
+ <string name="petabyteShort" msgid="5637816680144990219">"ПБ"</string>
+ <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string>
+ <string name="untitled" msgid="4638956954852782576">"&lt;Гарчиггүй&gt;"</string>
+ <string name="ellipsis" msgid="7899829516048813237">"…"</string>
+ <string name="ellipsis_two_dots" msgid="1228078994866030736">"‥"</string>
+ <string name="emptyPhoneNumber" msgid="7694063042079676517">"(УтаÑны дугаар байхгүй)"</string>
+ <string name="unknownName" msgid="2277556546742746522">"(Тодорхойгүй)"</string>
+ <string name="defaultVoiceMailAlphaTag" msgid="2660020990097733077">"дуут шуудан"</string>
+ <string name="defaultMsisdnAlphaTag" msgid="2850889754919584674">"MSISDN1"</string>
+ <string name="mmiError" msgid="5154499457739052907">"Холболтын аÑуудал ÑÑвÑл буруу MMI код."</string>
+ <string name="mmiFdnError" msgid="5224398216385316471">"Ðжиллагаа зөвөх тогтÑон дугаараар Ñ…ÑзгаарлагдÑан."</string>
+ <string name="serviceEnabled" msgid="8147278346414714315">"ҮйлчилгÑÑ Ð¸Ð´ÑвхжÑÑн."</string>
+ <string name="serviceEnabledFor" msgid="6856228140453471041">"Дараах үйлчилгÑÑ Ð¸Ð´ÑвхтÑй болÑон:"</string>
+ <string name="serviceDisabled" msgid="1937553226592516411">"ҮйлчилгÑÑ Ð¸Ð´Ñвхгүй болÑон."</string>
+ <string name="serviceRegistered" msgid="6275019082598102493">"Ðмжилттай бүртгÑв."</string>
+ <string name="serviceErased" msgid="1288584695297200972">"Ðмжилттай арилгалаа."</string>
+ <string name="passwordIncorrect" msgid="7612208839450128715">"Буруу нууц үг"</string>
+ <string name="mmiComplete" msgid="8232527495411698359">"MMI дууÑÑан."</string>
+ <string name="badPin" msgid="9015277645546710014">"Таны бичÑÑн хуучин PIN буруу байна."</string>
+ <string name="badPuk" msgid="5487257647081132201">"Таны бичÑÑн PUК буруу байна."</string>
+ <string name="mismatchPin" msgid="609379054496863419">"Таны оруулÑан PIN таарахгүй байна."</string>
+ <string name="invalidPin" msgid="3850018445187475377">"4-8 Ñ‚Ð¾Ð¾Ð½Ð¾Ð¾Ñ Ð±Ò¯Ñ‚ÑÑ… PIN-г Ð±Ð¸Ñ‡Ð½Ñ Ò¯Ò¯."</string>
+ <string name="invalidPuk" msgid="8761456210898036513">"8-Ñ Ñ†Ó©Ó©Ð½Ð³Ò¯Ð¹ Ñ‚Ð¾Ð¾Ð½Ð¾Ð¾Ñ Ð±Ò¯Ñ‚ÑÑ… PUK-г Ð±Ð¸Ñ‡Ð½Ñ Ò¯Ò¯."</string>
+ <string name="needPuk" msgid="919668385956251611">"SIM картны PUK-түгжигдÑÑн. Тайлах бол PUK кодыг Ð±Ð¸Ñ‡Ð½Ñ Ò¯Ò¯."</string>
+ <string name="needPuk2" msgid="4526033371987193070">"SIM картын хаалтыг болиулах бол PUK2-г Ð±Ð¸Ñ‡Ð½Ñ Ò¯Ò¯."</string>
+ <string name="imei" msgid="2625429890869005782">"IMEI"</string>
+ <string name="meid" msgid="4841221237681254195">"MEID"</string>
+ <string name="ClipMmi" msgid="6952821216480289285">"Дуудлага хийгчийн ID"</string>
+ <string name="ClirMmi" msgid="7784673673446833091">"Гарч байгаа дуудлага хийгчийн ID"</string>
+ <string name="CfMmi" msgid="5123218989141573515">"Дуудлага дамжуулах"</string>
+ <string name="CwMmi" msgid="9129678056795016867">"дуудлага хүлÑÑлгÑÑ…"</string>
+ <string name="BaMmi" msgid="455193067926770581">"Дуудлага хориглох"</string>
+ <string name="PwdMmi" msgid="7043715687905254199">"Ðууц үг Ñолих"</string>
+ <string name="PinMmi" msgid="3113117780361190304">"PIN Ñолих"</string>
+ <string name="CnipMmi" msgid="3110534680557857162">"ДуудÑан дугаар харуулах"</string>
+ <string name="CnirMmi" msgid="3062102121430548731">"Дуудлага хийгчийн дугаар Ñ…ÑзгаарлагдÑан"</string>
+ <string name="ThreeWCMmi" msgid="9051047170321190368">"Гурван чиглÑлт дуудлага"</string>
+ <string name="RuacMmi" msgid="7827887459138308886">"Ð¥Ò¯ÑÑÑгүй тааламжгүй Ð´ÑƒÑƒÐ´Ð»Ð°Ð³Ð°Ð°Ñ Ñ‚Ð°Ñ‚Ð³Ð°Ð»Ð·Ð°Ñ…"</string>
+ <string name="CndMmi" msgid="3116446237081575808">"Дуудлага хийгчийн дугаарыг дамжуулах"</string>
+ <string name="DndMmi" msgid="1265478932418334331">"Бүү Ñаад бол"</string>
+ <string name="CLIRDefaultOnNextCallOn" msgid="429415409145781923">"Дуудлага хийгчийн ID Ñ…ÑзгаарлагдÑан. Дараагийн дуудлага: Ð¥ÑзгаарлагдÑан"</string>
+ <string name="CLIRDefaultOnNextCallOff" msgid="3092918006077864624">"Дуудлага хийгчийн ID Ñ…ÑзгаарлагдÑан. Дараагийн дуудлага: Ð¥Ñзгаарлагдаагүй"</string>
+ <string name="CLIRDefaultOffNextCallOn" msgid="6179425182856418465">"Дуудлага хийгчийн ID Ñ…Ñзгаарлагдаагүй. Дараагийн дуудлага: Ð¥ÑзгаарлагдÑан"</string>
+ <string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"Дуудлага хийгчийн ID Ñ…ÑзгаарлагдÑан. Дараагийн дуудлага: Ð¥ÑзгаарлагдÑан"</string>
+ <string name="serviceNotProvisioned" msgid="8614830180508686666">"ҮйлчилгÑÑ Ð¿Ñ€Ð¾Ð²Ð¸ÑˆÐ½ хийгдÑÑгүй ."</string>
+ <string name="CLIRPermanent" msgid="3377371145926835671">"Та дуудлага хийгчийн ID тохиргоог Ñолиж чадахгүй."</string>
+ <string name="RestrictedChangedTitle" msgid="5592189398956187498">"Ð¥ÑзгаарлагдÑан хандалт өөрчлөгдөв"</string>
+ <string name="RestrictedOnData" msgid="8653794784690065540">"Дата үйлчилгÑÑ Ñ…Ð°Ð°Ð³Ð´Ñан."</string>
+ <string name="RestrictedOnEmergency" msgid="6581163779072833665">"Яаралтай үйлчилгÑÑ Ñ…Ð°Ð°Ð³Ð´Ñан."</string>
+ <string name="RestrictedOnNormal" msgid="4953867011389750673">"Дуут үйлчилгÑÑ Ñ…Ð¾Ñ€Ð¸Ð³Ð»Ð¾Ð³Ð´Ñон."</string>
+ <string name="RestrictedOnAllVoice" msgid="3396963652108151260">"Бүх дуут үйлчилгÑÑнүүд хориглогдÑон."</string>
+ <string name="RestrictedOnSms" msgid="8314352327461638897">"SMS үйлчилгÑÑ Ñ…Ð°Ð°Ð³Ð´Ñан."</string>
+ <string name="RestrictedOnVoiceData" msgid="996636487106171320">"Дуут/дата үйлчилгÑÑ Ñ…Ð°Ð°Ð³Ð´Ñан."</string>
+ <string name="RestrictedOnVoiceSms" msgid="1888588152792023873">"Дуут/SMS үйлчилгÑÑнүүд хориглогдÑон."</string>
+ <string name="RestrictedOnAll" msgid="5643028264466092821">"Бүх дуут/дата/SMS үйлчилгÑÑнүүд хориглогдÑон."</string>
+ <string name="serviceClassVoice" msgid="1258393812335258019">"Дуу"</string>
+ <string name="serviceClassData" msgid="872456782077937893">"Дата"</string>
+ <string name="serviceClassFAX" msgid="5566624998840486475">"ФакÑ"</string>
+ <string name="serviceClassSMS" msgid="2015460373701527489">"SMS"</string>
+ <string name="serviceClassDataAsync" msgid="4523454783498551468">"Синхрон буÑ"</string>
+ <string name="serviceClassDataSync" msgid="7530000519646054776">"Синк"</string>
+ <string name="serviceClassPacket" msgid="6991006557993423453">"Пакет"</string>
+ <string name="serviceClassPAD" msgid="3235259085648271037">"PAD"</string>
+ <string name="roamingText0" msgid="7170335472198694945">"Роуминг заагч аÑÑан"</string>
+ <string name="roamingText1" msgid="5314861519752538922">"Роуминг заагч унтарÑан"</string>
+ <string name="roamingText2" msgid="8969929049081268115">"Роуминг заагч анивчиж байна"</string>
+ <string name="roamingText3" msgid="5148255027043943317">"Хөрш дотор"</string>
+ <string name="roamingText4" msgid="8808456682550796530">"Барилгын гадна"</string>
+ <string name="roamingText5" msgid="7604063252850354350">"Роуминг - СонгогдÑон СиÑтем"</string>
+ <string name="roamingText6" msgid="2059440825782871513">"Роуминг- Боломжтой СиÑтем"</string>
+ <string name="roamingText7" msgid="7112078724097233605">"Роуминг- Холбоотон Түнш"</string>
+ <string name="roamingText8" msgid="5989569778604089291">"Роуминг- Урамшууллын Түнш"</string>
+ <string name="roamingText9" msgid="7969296811355152491">"Рүүминг - ҮйлчилгÑÑний Ðжиллагаа БүрÑн"</string>
+ <string name="roamingText10" msgid="3992906999815316417">"Рүүминг - Ð¥ÑÑÑгчилÑÑн үйлчилгÑÑний функционал"</string>
+ <string name="roamingText11" msgid="4154476854426920970">"Рүүминг Баннер ÐÑаалттай"</string>
+ <string name="roamingText12" msgid="1189071119992726320">"Баннергүй рүүминг"</string>
+ <string name="roamingTextSearching" msgid="8360141885972279963">"ҮйлчилгÑÑг хайж байна…"</string>
+ <string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: дамжуулагдаагүй"</string>
+ <string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
+ <string name="cfTemplateForwardedTime" msgid="9206251736527085256">"<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" msgid="5073237827620166285">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: дамжуулагдаагүй"</string>
+ <string name="cfTemplateRegisteredTime" msgid="6781621964320635172">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: дамжуулагдаагүй"</string>
+ <string name="fcComplete" msgid="3118848230966886575">"Онцлог код дууÑав."</string>
+ <string name="fcError" msgid="3327560126588500777">"Холболтын аÑуудал ÑÑвÑл буруу функцын код."</string>
+ <string name="httpErrorOk" msgid="1191919378083472204">"Тийм"</string>
+ <string name="httpError" msgid="7956392511146698522">"СүлжÑÑний алдаа гарав."</string>
+ <string name="httpErrorLookup" msgid="4711687456111963163">"URL олдÑонгүй."</string>
+ <string name="httpErrorUnsupportedAuthScheme" msgid="6299980280442076799">"Сайт гÑрчлÑлийн Ñхем дÑмжигдÑхгүй."</string>
+ <string name="httpErrorAuth" msgid="1435065629438044534">"ГÑрчлÑж чадÑангүй."</string>
+ <string name="httpErrorProxyAuth" msgid="1788207010559081331">"ПрокÑи Ñервер гÑрчлÑл бүтÑлгүйтÑв."</string>
+ <string name="httpErrorConnect" msgid="8714273236364640549">"СервертÑй холбогдож чадÑангүй."</string>
+ <string name="httpErrorIO" msgid="2340558197489302188">"СервертÑй холбогдож чадÑангүй. Дараа дахин оролдоно уу."</string>
+ <string name="httpErrorTimeout" msgid="4743403703762883954">"Сервер холболтын хугацаа Ñ…ÑтрÑв."</string>
+ <string name="httpErrorRedirectLoop" msgid="8679596090392779516">"Ð¥ÑƒÑƒÐ´Ð°Ñ Ñ…ÑÑ‚ олон Ñервер дахин чиглүүлÑл агуулж байна."</string>
+ <string name="httpErrorUnsupportedScheme" msgid="5015730812906192208">"Протокол дÑмжигдÑхгүй байна."</string>
+ <string name="httpErrorFailedSslHandshake" msgid="96549606000658641">"Ðюулгүй холбоог Ò¯Ò¯ÑгÑж чадÑангүй."</string>
+ <string name="httpErrorBadUrl" msgid="3636929722728881972">"URL буруу тул хуудÑыг нÑÑж чадÑангүй."</string>
+ <string name="httpErrorFile" msgid="2170788515052558676">"Файлд хандаж чадÑангүй."</string>
+ <string name="httpErrorFileNotFound" msgid="6203856612042655084">"ДуудÑан файл олдÑонгүй."</string>
+ <string name="httpErrorTooManyRequests" msgid="1235396927087188253">"Ð¥ÑÑ‚ олон Ñ…Ò¯ÑÑлтийг боловÑруулж байна. Дараа дахин оролдоно уу."</string>
+ <string name="notification_title" msgid="8967710025036163822">"<xliff:g id="ACCOUNT">%1$s</xliff:g>-н нÑвтрÑлтийн алдаа"</string>
+ <string name="contentServiceSync" msgid="8353523060269335667">"Синк"</string>
+ <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Синк"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Ð¥ÑÑ‚ олон <xliff:g id="CONTENT_TYPE">%s</xliff:g> уÑтгах."</string>
+ <string name="low_memory" product="tablet" msgid="6494019234102154896">"Таблетийн Ñан дүүрÑÑн. Зай чөлөөлөх бол зарим файлыг уÑтгана уу."</string>
+ <string name="low_memory" product="default" msgid="3475999286680000541">"УтаÑны Ñан дүүрÑÑн. Зай чөлөөлөх бол зарим файлыг уÑтгана уу."</string>
+ <string name="me" msgid="6545696007631404292">"Би"</string>
+ <string name="power_dialog" product="tablet" msgid="8545351420865202853">"Таблетын Ñонголтууд"</string>
+ <string name="power_dialog" product="default" msgid="1319919075463988638">"УтаÑны Ñонголт"</string>
+ <string name="silent_mode" msgid="7167703389802618663">"ЧимÑÑгүй горим"</string>
+ <string name="turn_on_radio" msgid="3912793092339962371">"УтаÑгүй холбоог аÑаах"</string>
+ <string name="turn_off_radio" msgid="8198784949987062346">"УтаÑгүй ÑүлжÑÑг унтраах уу"</string>
+ <string name="screen_lock" msgid="799094655496098153">"ДÑлгÑцний түгжÑÑ"</string>
+ <string name="power_off" msgid="4266614107412865048">"Унтраах"</string>
+ <string name="silent_mode_silent" msgid="319298163018473078">"Хонх унтраах"</string>
+ <string name="silent_mode_vibrate" msgid="7072043388581551395">"Хонхны чичиргÑÑ."</string>
+ <string name="silent_mode_ring" msgid="8592241816194074353">"Хонх аÑÑан"</string>
+ <string name="shutdown_progress" msgid="2281079257329981203">"Унтрааж байна…"</string>
+ <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Таны таблет унтрах болно."</string>
+ <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Таны ÑƒÑ‚Ð°Ñ ÑƒÐ½Ñ‚Ñ€Ð°Ñ… болно."</string>
+ <string name="shutdown_confirm_question" msgid="2906544768881136183">"Та унтраах уу?"</string>
+ <string name="reboot_safemode_title" msgid="7054509914500140361">"Ðюулгүй горимоор дахин аÑаах"</string>
+ <string name="reboot_safemode_confirm" msgid="55293944502784668">"Та аюулгүй горимоор дахин аÑаах уу? Ð­Ð½Ñ Ð½ÑŒ таны ÑуулгаÑан гуравдагч талын бүх аппликешныг идÑвхгүй болгоно. Та дахин аÑаах үед Ñ‚ÑдгÑÑÑ€ нь ÑÑргÑÑгдÑнÑ."</string>
+ <string name="recent_tasks_title" msgid="3691764623638127888">"Сүүлийн"</string>
+ <string name="no_recent_tasks" msgid="8794906658732193473">"Сүүлийн апп хооÑон."</string>
+ <string name="global_actions" product="tablet" msgid="408477140088053665">"Таблет Ñонголт"</string>
+ <string name="global_actions" product="default" msgid="2406416831541615258">"УтаÑны Ñонголтууд"</string>
+ <string name="global_action_lock" msgid="2844945191792119712">"ДÑлгÑцний түгжÑÑ"</string>
+ <string name="global_action_power_off" msgid="4471879440839879722">"Унтраах"</string>
+ <string name="global_action_bug_report" msgid="7934010578922304799">"Ðлдаа мÑдÑÑллÑÑ…"</string>
+ <string name="bugreport_title" msgid="2667494803742548533">"Согог репорт авах"</string>
+ <string name="bugreport_message" msgid="398447048750350456">"Ð­Ð½Ñ Ñ‚Ð°Ð½Ñ‹ төхөөрөмжийн одоогийн ÑтатуÑын талаарх мÑдÑÑллийг цуглуулах ба имÑйл меÑÑеж болгон илгÑÑнÑ. Ðлдааны мÑдÑгдлÑÑÑ ÑÑ…Ñлж илгÑÑÑ…Ñд бÑлÑн болоход Ñ…ÑÑÑг хугацаа зарцуулагдана Ñ‚ÑвчÑÑртÑй байна уу."</string>
+ <string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"ЧимÑÑгүй горим"</string>
+ <string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"Дуу хаагдÑан"</string>
+ <string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"Дуу аÑав"</string>
+ <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"ÐиÑлÑгийн горим"</string>
+ <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"ÐиÑлÑгийн горим аÑав"</string>
+ <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"ÐиÑлÑгийн горим унтарÑан"</string>
+ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
+ <string name="safeMode" msgid="2788228061547930246">"Ðюулгүй горим"</string>
+ <string name="android_system_label" msgid="6577375335728551336">"Ðндройд ÑиÑтем"</string>
+ <string name="permgrouplab_costMoney" msgid="5429808217861460401">"Ð¢Ð°Ð½Ð°Ð°Ñ Ñ‚Ó©Ð»Ð±Ó©Ñ€ авдаг үйлчилгÑÑнүүд"</string>
+ <string name="permgroupdesc_costMoney" msgid="3293301903409869495">"Таны төлбөрт оруулах зүйлийг хийх."</string>
+ <string name="permgrouplab_messages" msgid="7521249148445456662">"Таны меÑÑеж"</string>
+ <string name="permgroupdesc_messages" msgid="7821999071003699236">"Таны SMS, и-мÑйл ба буÑад меÑÑежийг унших болон бичих."</string>
+ <string name="permgrouplab_personalInfo" msgid="3519163141070533474">"Таны хувийн мÑдÑÑлÑл"</string>
+ <string name="permgroupdesc_personalInfo" msgid="8426453129788861338">"Таны харилцагчдын картанд хадгалагдÑан таны мÑдÑÑлÑлд шууд хандах."</string>
+ <string name="permgrouplab_socialInfo" msgid="5799096623412043791">"Таны нийтийн мÑдÑÑлÑл"</string>
+ <string name="permgroupdesc_socialInfo" msgid="7129842457611643493">"Таны харилцагчид болон нийтийн холбооны тухай мÑдÑÑлÑлд шууд хандах."</string>
+ <string name="permgrouplab_location" msgid="635149742436692049">"Таны байршил"</string>
+ <string name="permgroupdesc_location" msgid="5704679763124170100">"Таны бодит байршлыг Ñ…Ñнах."</string>
+ <string name="permgrouplab_network" msgid="5808983377727109831">"СүлжÑÑний холбоо"</string>
+ <string name="permgroupdesc_network" msgid="4478299413241861987">"Төрөл бүрийн ÑүлжÑÑний функцүүдÑд хандах"</string>
+ <string name="permgrouplab_bluetoothNetwork" msgid="1585403544162128109">"Блютүүт"</string>
+ <string name="permgroupdesc_bluetoothNetwork" msgid="5625288577164282391">"БлютүүтÑÑÑ€ төхөөрөмж болон ÑүлжÑÑнд хандах."</string>
+ <string name="permgrouplab_audioSettings" msgid="8329261670151871235">"Ðудио тохиргоо"</string>
+ <string name="permgroupdesc_audioSettings" msgid="2641515403347568130">"Ðудио тохиргоо Ñолих."</string>
+ <string name="permgrouplab_affectsBattery" msgid="6209246653424798033">"Батерейд нөлөөлөх"</string>
+ <string name="permgroupdesc_affectsBattery" msgid="6441275320638916947">"Батерей хурдан дууÑгах функцийг ашиглах."</string>
+ <string name="permgrouplab_calendar" msgid="5863508437783683902">"Календарь"</string>
+ <string name="permgroupdesc_calendar" msgid="5777534316982184416">"Календар болон үйл Ñвдалд шууд хандах."</string>
+ <string name="permgrouplab_dictionary" msgid="4148597128843641379">"Ð¥ÑÑ€ÑглÑгчийн Ñ‚Ð¾Ð»Ð¸Ð¾Ñ ÑƒÐ½ÑˆÐ¸Ñ…"</string>
+ <string name="permgroupdesc_dictionary" msgid="7921166355964764490">"Ð¥ÑÑ€ÑглÑгчийн толь бичгÑÑÑ Ò¯Ð³ унших."</string>
+ <string name="permgrouplab_writeDictionary" msgid="8090237702432576788">"Ð¥ÑÑ€ÑглÑгчийн тольд бичих"</string>
+ <string name="permgroupdesc_writeDictionary" msgid="2711561994497361646">"Ð¥ÑÑ€ÑглÑгчийн толь бичигт үг нÑмÑÑ…."</string>
+ <string name="permgrouplab_bookmarks" msgid="1949519673103968229">"Хавчуурга болон түүх"</string>
+ <string name="permgroupdesc_bookmarks" msgid="4169771606257963028">"Хавчуурга болон хөтчийн түүхрүү шууд хандах."</string>
+ <string name="permgrouplab_deviceAlarms" msgid="6117704629728824101">"СÑрүүлÑг"</string>
+ <string name="permgroupdesc_deviceAlarms" msgid="4769356362251641175">"СÑрүүлÑг тохируулах."</string>
+ <string name="permgrouplab_voicemail" msgid="4162237145027592133">"Дуут шуудан"</string>
+ <string name="permgroupdesc_voicemail" msgid="2498403969862951393">"Дуут шууданд шууд хандах."</string>
+ <string name="permgrouplab_microphone" msgid="171539900250043464">"Микрофон"</string>
+ <string name="permgroupdesc_microphone" msgid="7106618286905738408">"Ðудио бичихийн тулд микрофонд шууд хандах."</string>
+ <string name="permgrouplab_camera" msgid="4820372495894586615">"Камер"</string>
+ <string name="permgroupdesc_camera" msgid="2933667372289567714">"Зураг ÑвÑÑл бичлÑг хийхÑÑÑ€ камерт шууд хандах."</string>
+ <string name="permgrouplab_screenlock" msgid="8275500173330718168">"ДÑлгÑц түгжих"</string>
+ <string name="permgroupdesc_screenlock" msgid="7067497128925499401">"Таны төхөөрөмжийн дÑлгÑцийн түгжÑÑнд нөлөөлөх чадвар."</string>
+ <string name="permgrouplab_appInfo" msgid="8028789762634147725">"Таны аппликешны мÑдÑÑлÑл"</string>
+ <string name="permgroupdesc_appInfo" msgid="3950378538049625907">"Таны төхөөрөмжийн буÑад аппликешнд нөлөөлөх чадвар."</string>
+ <string name="permgrouplab_wallpaper" msgid="3850280158041175998">"Ханын зураг"</string>
+ <string name="permgroupdesc_wallpaper" msgid="5630417854750540154">"Төхөөрөмжийн ханын зургийн тохиргоог Ñолих."</string>
+ <string name="permgrouplab_systemClock" msgid="406535759236612992">"Цаг"</string>
+ <string name="permgroupdesc_systemClock" msgid="3944359833624094992">"Төхөөрөмжийн цаг ÑÑвÑл цагийн бүÑийг Ñолих."</string>
+ <string name="permgrouplab_statusBar" msgid="2095862568113945398">"Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ñамбар"</string>
+ <string name="permgroupdesc_statusBar" msgid="6242593432226807171">"Төхөөрөмжийн ÑÑ‚Ð°Ñ‚ÑƒÑ Ñамбарын тохиргоог Ñолих."</string>
+ <string name="permgrouplab_syncSettings" msgid="3341990986147826541">"Синк тохиргоо"</string>
+ <string name="permgroupdesc_syncSettings" msgid="7603195265129031797">"Синк тохиргоонд хандах."</string>
+ <string name="permgrouplab_accounts" msgid="3359646291125325519">"Таны акаунт"</string>
+ <string name="permgroupdesc_accounts" msgid="4948732641827091312">"Боломжит акаунтад хандах."</string>
+ <string name="permgrouplab_hardwareControls" msgid="7998214968791599326">"Хардвер контрол"</string>
+ <string name="permgroupdesc_hardwareControls" msgid="4357057861225462702">"Гар төхөөрөмжийн хардверт шууд хандах."</string>
+ <string name="permgrouplab_phoneCalls" msgid="9067173988325865923">"УтÑаар Ñрих"</string>
+ <string name="permgroupdesc_phoneCalls" msgid="7489701620446183770">"УтаÑны дуудлагыг Ñ…Ñнах, бичих болон боловÑруулах."</string>
+ <string name="permgrouplab_systemTools" msgid="4652191644082714048">"СиÑтемийн багаж"</string>
+ <string name="permgroupdesc_systemTools" msgid="8162102602190734305">"СиÑтемрүү доод төвшиний хандах болон удирдах."</string>
+ <string name="permgrouplab_developmentTools" msgid="3446164584710596513">"ХөгжүүлÑÑ… багаж"</string>
+ <string name="permgroupdesc_developmentTools" msgid="7058828032358142018">"Зөвхөн аппликешн хөгжүүлÑгчдÑд Ñ…ÑÑ€ÑгтÑй функц."</string>
+ <string name="permgrouplab_display" msgid="4279909676036402636">"БуÑад аппликешн UI"</string>
+ <string name="permgroupdesc_display" msgid="6051002031933013714">"БуÑад аппликешны UI-д нөлөөлөх."</string>
+ <string name="permgrouplab_storage" msgid="1971118770546336966">"Сан"</string>
+ <string name="permgroupdesc_storage" product="nosdcard" msgid="7442318502446874999">"USB Ñанд хандах."</string>
+ <string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"SD картад хандах."</string>
+ <string name="permgrouplab_accessibilityFeatures" msgid="7919025602283593907">"Ð¥Ñлбар хандах функц"</string>
+ <string name="permgroupdesc_accessibilityFeatures" msgid="4205196881678144335">"ТуÑлах Ñ‚ÐµÑ…Ð½Ð¾Ð»Ð¾Ð³Ð¸Ð¾Ñ Ñ…Ò¯ÑÑлт илгÑÑÑ… боломжтой функц"</string>
+ <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Цонхны контентыг авах"</string>
+ <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Таны харилцан үйлчлÑÑ… цонхны ÐºÐ¾Ð½Ñ‚ÐµÐ½Ñ‚Ð¾Ð¾Ñ ÑˆÐ°Ð»Ð³Ð°Ñ…."</string>
+ <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Хүрч танихыг аÑаах"</string>
+ <string name="capability_desc_canRequestTouchExploration" msgid="5800552516779249356">"ХүрÑÑн зүйлÑийг чангаар дуудах ба дохио ашиглан дÑлгÑцийг таньж болно."</string>
+ <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"СайжруулÑан веб хандалтыг аÑаах"</string>
+ <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Ðпп контентод илүү Ñ…Ñлбар хандуулахын тулд Ñкриптыг Ñуулгана."</string>
+ <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"БичÑÑн текÑÑ‚ÑÑ Ð°Ð¶Ð¸Ð³Ð»Ð°Ñ…"</string>
+ <string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Кредит картын дугаар болон нууц үг зÑÑ€Ñг хувийн датаг агуулж байна."</string>
+ <string name="permlab_statusBar" msgid="7417192629601890791">"ÑÑ‚Ð°Ñ‚ÑƒÑ Ñамбарыг идÑвхгүй болгох болон өөрчлөх"</string>
+ <string name="permdesc_statusBar" msgid="8434669549504290975">"Ðпп нь ÑÑ‚Ð°Ñ‚ÑƒÑ Ñамбарыг идÑвхгүй болгох ÑÑвÑл ÑиÑтем дүрÑийг нÑмÑÑ…, хаÑах боломжтой."</string>
+ <string name="permlab_statusBarService" msgid="7247281911387931485">"ÑÑ‚Ð°Ñ‚ÑƒÑ Ñамбар"</string>
+ <string name="permdesc_statusBarService" msgid="716113660795976060">"Ðпп нь ÑÑ‚Ð°Ñ‚ÑƒÑ Ñамбар болох боломжтой."</string>
+ <string name="permlab_expandStatusBar" msgid="1148198785937489264">"ÑÑ‚Ð°Ñ‚ÑƒÑ Ñамбарыг нÑÑÑ…/хаах"</string>
+ <string name="permdesc_expandStatusBar" msgid="6917549437129401132">"Ðпп нь ÑÑ‚Ð°Ñ‚ÑƒÑ Ñамбарыг дÑлгÑÑ… болон хаах боломжтой."</string>
+ <string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"гарÑан дуудлагыг чиглÑлийг өөрчлөх"</string>
+ <string name="permdesc_processOutgoingCalls" msgid="5331318931937402040">"Ðпп нь дуудлага хийх болон залгаж байгаа дугаарыг өөрчлөх боломжтой. Ð­Ð½Ñ Ð·Ó©Ð²ÑˆÓ©Ó©Ñ€Ó©Ð» нь апп-г залгаÑан дуудлагыг хаах, Ñ…Ñнах болон дахин чиглүүлÑÑ… боломжтой болгодог."</string>
+ <string name="permlab_receiveSms" msgid="8673471768947895082">"текÑÑ‚ меÑÑеж(SMS) хүлÑÑж авах"</string>
+ <string name="permdesc_receiveSms" msgid="6424387754228766939">"Ðпп нь SMS меÑÑежийг хүлÑÑн авах болон гүйцÑтгÑÑ… боломжтой. ИнгÑÑнÑÑÑ€ апп нь таны төхөөрөмжрүү илгÑÑÑÑн меÑÑежийг танд үзүүлÑхгүйгÑÑÑ€ Ñ…Ñнах болон уÑтгаж чадна."</string>
+ <string name="permlab_receiveMms" msgid="1821317344668257098">"текÑÑ‚ меÑÑеж(МMS) хүлÑÑж авах"</string>
+ <string name="permdesc_receiveMms" msgid="533019437263212260">"Ðпп нь MMS меÑÑежийг хүлÑÑн авах болон гүйцÑтгÑÑ… боломжтой. ИнгÑÑнÑÑÑ€ апп нь таны төхөөрөмжрүү илгÑÑÑÑн меÑÑежийг танд үзүүлÑхгүйгÑÑÑ€ Ñ…Ñнах болон уÑтгаж чадна."</string>
+ <string name="permlab_receiveEmergencyBroadcast" msgid="1803477660846288089">"Яаралтай өргөн дамжууллыг хүлÑÑн авах"</string>
+ <string name="permdesc_receiveEmergencyBroadcast" msgid="848524070262431974">"Ðпп нь Ñаралтай өргөн дамжууллын меÑÑежийг хүлÑÑн авах болон гүйцÑтгÑÑ… боломжтой. Ð­Ð½Ñ Ð·Ó©Ð²ÑˆÓ©Ó©Ñ€Ó©Ð» нь зөвхөн ÑиÑтем аппликешнд л боломжтой."</string>
+ <string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"үүрÑн өргөн дамжууллын меÑÑеж унших"</string>
+ <string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"Ðпп нь таны төхөөрөмжийн хүлÑÑн авÑан үүрÑн өргөн дамжуулах меÑÑежийг унших боломжтой. ҮүрÑн өргөн дамжууллын мÑдÑгдÑл нь Ñаралтай нөхцөл байдлыг анхааруулах зорилгоор зарим байршлуудад хүрдÑг. Хортой апп нь Ñаралтай үүрÑн өргөн дамжууллыг хүлÑÑн авÑан үед таны төхөөрөмжийн ажиллагаа болон чадамжид нөлөөлөх боломжтой."</string>
+ <string name="permlab_sendSms" msgid="5600830612147671529">"SMS меÑÑеж илгÑÑÑ…"</string>
+ <string name="permdesc_sendSms" msgid="7094729298204937667">"Ðпп нь SMS меÑÑеж илгÑÑÑ… боломжтой. Ð­Ð½Ñ Ð½ÑŒ Ñанаандгүй төлбөрт оруулж болзошгүй. Хортой апп нь таны зөвшөөрөлгүйгÑÑÑ€ меÑÑеж илгÑÑн таныг төлбөрт оруулж болзошгүй."</string>
+ <string name="permlab_sendRespondViaMessageRequest" msgid="8713889105305943200">"меÑÑежÑÑÑ€ хариулах үйл Ñвдалыг илгÑÑÑ…"</string>
+ <string name="permdesc_sendRespondViaMessageRequest" msgid="7107648548468778734">"Ðпп нь дуудлага ирÑÑ… үед меÑÑежÑÑÑ€ хариу өгөх үйл Ñвдлыг зохицуулахын тулд буÑад меÑÑежийн апп-д Ñ…Ò¯ÑÑлт илгÑÑÑ… боломжтой."</string>
+ <string name="permlab_readSms" msgid="8745086572213270480">"таны текÑÑ‚ меÑÑежийг унших(SMS ÑÑвÑл MMS)"</string>
+ <string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"Ðпп нь таны ÑƒÑ‚Ð°Ñ ÑÑвÑл SIM картанд хадгалагдÑан SMS меÑÑежийг унших боломжтой. Ð­Ð½Ñ Ð½ÑŒ апп-д бүх меÑÑежийг контент ÑÑвÑл нууц ÑÑÑÑ…ÑÑÑ Ð½ÑŒ үл хамааран унших боломжийг олгоно."</string>
+ <string name="permdesc_readSms" product="default" msgid="3695967533457240550">"Ðпп нь таны ÑƒÑ‚Ð°Ñ ÑÑвÑл SIM картанд хадгалагдÑан SMS меÑÑежийг унших боломжтой. Ð­Ð½Ñ Ð½ÑŒ апп-д бүх меÑÑежийг контент ÑÑвÑл нууц ÑÑÑÑ…ÑÑÑ Ð½ÑŒ үл хамааран унших боломжийг олгоно."</string>
+ <string name="permlab_writeSms" msgid="3216950472636214774">"ТекÑÑ‚ меÑÑежийг заÑах (SMS ÑÑвÑл MMS)"</string>
+ <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"Ðпп нь таны таблет ÑÑвÑл SIM картанд хадгалагдÑан SMS меÑÑежрүү бичих боломжтой. Хортой апп нь таны меÑÑежүүдийг уÑтгах боломжтой."</string>
+ <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"Ðпп нь таны ÑƒÑ‚Ð°Ñ ÑÑвÑл SIM картанд хадгалагдÑан SMS меÑÑежрүү бичих боломжтой. Хортой апп нь таны меÑÑежүүдийг уÑтгах боломжтой."</string>
+ <string name="permlab_receiveWapPush" msgid="5991398711936590410">"текÑÑ‚ меÑÑеж(WAP) хүлÑÑн авах"</string>
+ <string name="permdesc_receiveWapPush" msgid="748232190220583385">"Ðпп нь WAP меÑÑежийг хүлÑÑн авах болон биелүүлÑÑ… боломжтой. Ð­Ð½Ñ Ð·Ó©Ð²ÑˆÓ©Ó©Ñ€Ó©Ð» нь танд илгÑÑÑÑн меÑÑежийг танд харуулалгүйгÑÑÑ€ Ñ…Ñнах ÑÑвÑл уÑтгах боломжийг агуулна."</string>
+ <string name="permlab_getTasks" msgid="6466095396623933906">"ажиллаж байгаа апп-г дуудах"</string>
+ <string name="permdesc_getTasks" msgid="7454215995847658102">"Ðпп нь одоо ажиллаж байгаа болон Ñүүлд ажиллаÑан даалгаврын талаарх мÑдÑÑллийг авах боломжтой. ИнгÑÑнÑÑÑ€ апп нь төхөөмж дÑÑрх Ñмар аппликешнүүд ашиглагдÑан талаарх мÑдÑÑлийг олох боломжтой."</string>
+ <string name="permlab_interactAcrossUsers" msgid="7114255281944211682">"Ñ…ÑÑ€ÑглÑгчидтÑй харилцан үйлчлÑлцÑÑ…"</string>
+ <string name="permdesc_interactAcrossUsers" msgid="364670963623385786">"Ðпп нь төхөөрөмж дÑÑрх Ñлгаатай Ñ…ÑÑ€ÑглÑгчдÑд үйлдÑл гүйцÑтгÑÑ… боломжтой. Хортой апп нь Ñнийг ашиглан Ñ…ÑÑ€ÑглÑгч хоорондын хамгаалалтыг зөрчих боломжтой."</string>
+ <string name="permlab_interactAcrossUsersFull" msgid="2567734285545074105">"Ñ…ÑÑ€ÑглÑгчидтÑй харилцан үйлчлÑлцÑÑ… бүрÑн зөвшөөрөл"</string>
+ <string name="permdesc_interactAcrossUsersFull" msgid="376841368395502366">"Бүх Ñ…ÑÑ€ÑглÑгчдÑд боломжит бүх харилцан үйлдлийг зөвшөөрнө."</string>
+ <string name="permlab_manageUsers" msgid="1676150911672282428">"Ñ…ÑÑ€ÑгчлÑгч удирдах"</string>
+ <string name="permdesc_manageUsers" msgid="8409306667645355638">"Ðпп нь төхөөрөмж дÑÑÑ€ аÑуулга, Ò¯Ò¯ÑгÑлт болон уÑтгалт зÑргийг багтааÑан Ñ…ÑÑ€ÑглÑгч удирдах боломжтой."</string>
+ <string name="permlab_getDetailedTasks" msgid="6229468674753529501">"ажиллаж байгаа апп-н дÑлгÑÑ€Ñнгүйг авах"</string>
+ <string name="permdesc_getDetailedTasks" msgid="153824741440717599">"Ðпп нь одоо ажиллаж байгаа болон Ñүүлд ажиллаÑан даалгаврын талаарх дÑлгÑÑ€Ñнгүй мÑдÑÑллийг авах боломжтой. Хортой апп нь буÑад апп-н хувийн мÑдÑÑлийг олох боломжтой."</string>
+ <string name="permlab_reorderTasks" msgid="2018575526934422779">"ажиллаж байгаа апп-уудыг дахин ÑÑ€ÑмбÑлÑÑ…"</string>
+ <string name="permdesc_reorderTasks" msgid="7734217754877439351">"Ðпп нь даалгавруудыг нүүрлүү болон арлуу зөөх боломжтой. Ðпп нь Ñнийг таны оролцоогүйгÑÑÑ€ хийж болзошгүй"</string>
+ <string name="permlab_removeTasks" msgid="6821513401870377403">"ажиллаж байгаа апп-г зогÑоох"</string>
+ <string name="permdesc_removeTasks" msgid="1394714352062635493">"Ðпп нь даалгаврууд уÑтгах болон Ñ‚ÑдгÑÑрийн апп-г зогÑоох боломжтой. Хортой апп нь буÑад апп-н ажиллагааг таÑалдуулж болзошгүй."</string>
+ <string name="permlab_manageActivityStacks" msgid="7391191384027303065">"идÑвхжилтийн Ñтекүүдийг удирдах"</string>
+ <string name="permdesc_manageActivityStacks" msgid="1615881933034084440">"Ðпп-д буÑад апп-уудын ажилладаг идÑвхжилтийн Ñтекүүдийг нÑмÑÑ…, хаÑах буюу өөрчлөх боломж олгоно. Хорлонтой апп-ууд буÑад апп-уудын авирт нөлөөлөх боломжтой."</string>
+ <string name="permlab_startAnyActivity" msgid="2918768238045206456">"Ñмарч активитиг ÑхлүүлÑÑ…"</string>
+ <string name="permdesc_startAnyActivity" msgid="997823695343584001">"Ðпп нь зөвшөөрөл хамгаалалтай ÑÑвÑл ÑкÑпорт хийÑÑн ÑтатуÑÐ°Ð°Ñ Ò¯Ð» хамааран Ñмарч активитиг ÑхлүүлÑÑ… боломжтой."</string>
+ <string name="permlab_setScreenCompatibility" msgid="6975387118861842061">"дÑлгÑцний зохицолыг тохируулах"</string>
+ <string name="permdesc_setScreenCompatibility" msgid="692043618693917374">"Ðпп нь буÑад аппликешны дÑлгÑцний тохиромжит горимыг удирдах боломжтой. Хортой аппликешн нь буÑад аппликешны чадамжийг ÑвдÑÑ… боломжтой."</string>
+ <string name="permlab_setDebugApp" msgid="3022107198686584052">"апп дебагыг идÑвхжүүлÑÑ…"</string>
+ <string name="permdesc_setDebugApp" msgid="4474512416299013256">"Ðпп нь буÑад апп-г дебаг хийхийг аÑаах боломжтой. Хортой апп нь Ñнийг ашиглан буÑад апп-г зогÑоох боломжтой."</string>
+ <string name="permlab_changeConfiguration" msgid="4162092185124234480">"ÑиÑтемийн дÑлгÑцний тохиргоог Ñолих"</string>
+ <string name="permdesc_changeConfiguration" msgid="4372223873154296076">"Ðпп нь нутагшил ÑÑвÑл фонтын Ñ…ÑмжÑÑ Ð·ÑÑ€Ñг одоогийн тохиргоог Ñолих боломжтой."</string>
+ <string name="permlab_enableCarMode" msgid="5684504058192921098">"машины горимыг идÑвхжүүлÑÑ…"</string>
+ <string name="permdesc_enableCarMode" msgid="4853187425751419467">"Ðпп нь машины горимыг идÑвхжүүлÑÑ… боломжтой."</string>
+ <string name="permlab_killBackgroundProcesses" msgid="3914026687420177202">"буÑад апп-г хаах"</string>
+ <string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"Ðпп нь буÑад апп-н арын процеÑÑыг дууÑгах боломжтой. Ð­Ð½Ñ Ð±ÑƒÑад апп-г зогÑоох боломжийг олгоно."</string>
+ <string name="permlab_forceStopPackages" msgid="2329627428832067700">"буÑад апп-г хүчÑÑÑ€ зогÑоох"</string>
+ <string name="permdesc_forceStopPackages" msgid="5253157296183940812">"Ðпп нь буÑад апп-г хүчÑÑÑ€ зогÑоох боломжтой."</string>
+ <string name="permlab_forceBack" msgid="652935204072584616">"апп-г хүчÑÑÑ€ унтраах"</string>
+ <string name="permdesc_forceBack" msgid="3892295830419513623">"Ðпп нь нүүрÑнд ажиллаж байгаа активитиг хүчÑÑÑ€ зогÑоох болгон арлуу Ñвуулах боломжтой. Энгийн апп-д Ñ…ÑÑ€ÑглÑхгүй."</string>
+ <string name="permlab_dump" msgid="1681799862438954752">"ÑиÑтемийн дотоод ÑтатуÑыг дуудах"</string>
+ <string name="permdesc_dump" msgid="1778299088692290329">"Ðпп нь ÑиÑтемийн дотоод ÑтатуÑыг дуудах боломжтой. Хортой апп нь Ñнийг ашиглах шаардлагагүй аюулгүй байдлын болон хувийн мÑдÑÑллийг дуудах боломжтой."</string>
+ <string name="permlab_retrieve_window_content" msgid="8022588608994589938">"ДÑлгÑцийн контентыг унших"</string>
+ <string name="permdesc_retrieve_window_content" msgid="3193269069469700265">"Ðпп нь идÑвхтÑй цонхны контентыг авах боломжтой. Хортой апп нь цонхны контентыг бүхÑлд авах болон нууц үгнÑÑÑ Ð±ÑƒÑад бүх текÑтийг шалгаж болзошгүй"</string>
+ <string name="permlab_temporary_enable_accessibility" msgid="2312612135127310254">"Ð¥Ñлбар байдлыг түр идÑвхтÑй болгох"</string>
+ <string name="permdesc_temporary_enable_accessibility" msgid="8079456293182975464">"Ðппликешн нь төхөөрөмжийн Ñ…Ñлбар байдлыг түр зуур идÑвхжүүлÑÑ… боломжтой. Хортой апп нь Ñ…ÑÑ€ÑглÑгчийн зөвшөөрөлгүйгÑÑÑ€ Ñ…Ñлбар байдлыг идÑвхжүүлж болзошгүй."</string>
+ <string name="permlab_retrieve_window_info" msgid="8532295199112519378">"цонхны мÑдÑÑллийг унших"</string>
+ <string name="permdesc_retrieve_window_info" msgid="4998836370424186849">"Ðппликешн нь цонхны менежерÑÑÑ Ñ†Ð¾Ð½Ñ…Ð½Ñ‹ талаар мÑдÑÑллийг дуудах боломжтой. Хортой апп нь дотоод ÑиÑтемийн Ñ…ÑÑ€ÑглÑÑнд зориулагдÑан мÑдÑÑллийг дуудаж болзошгүй."</string>
+ <string name="permlab_filter_events" msgid="8675535648807427389">"үйл Ñвдлыг шүүх"</string>
+ <string name="permdesc_filter_events" msgid="8006236315888347680">"Ðппликешн нь Ñ…ÑÑ€ÑглÑгчийн бүх үйл Ñвдалын илгÑÑгдÑÑ…ÑÑÑ Ó©Ð¼Ð½Ó©Ñ… урÑгалыг шүүж байгаа оролтын шүүлтйиг бүртгÑÑ… боломжтой. Хортой апп нь Ñ…ÑÑ€ÑглÑгчийн интервÑшнгүйгÑÑÑ€ ÑиÑтемийн UI-г удирдах боломжтой."</string>
+ <string name="permlab_magnify_display" msgid="5973626738170618775">"дÑлгÑц томруулах"</string>
+ <string name="permdesc_magnify_display" msgid="7121235684515003792">"Ðппликешн нь дÑлгÑцний контентийг Ó©Ñгөх боломжтой. Хортой апп нь дÑлгÑцийн контентыг Ñ‚Ó©Ñ…Ó©Ó©Ñ€Ó©Ð¼Ð¶Ð½Ó©Ó©Ñ Ð°ÑˆÐ¸Ð³Ð»Ð°Ð¶ болохгүй болгон хувиргах боломжтой."</string>
+ <string name="permlab_shutdown" msgid="7185747824038909016">"Ñ…ÑÑÑгчилÑÑн унтраалт"</string>
+ <string name="permdesc_shutdown" msgid="7046500838746291775">"Ðктивити менежерийг унтраана. БүрÑн унтраалтыг хийхгүй."</string>
+ <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"апп шилжүүлÑхийг хориглох"</string>
+ <string name="permdesc_stopAppSwitches" msgid="8262195802582255021">"Ð¥ÑÑ€ÑглÑгч буÑад апп-руу ÑÑлгÑхийг хориглох."</string>
+ <string name="permlab_getTopActivityInfo" msgid="2537922311411546016">"одоогийн апп-н мÑдÑÑллийг авах"</string>
+ <string name="permdesc_getTopActivityInfo" msgid="8153651434145132505">"ЭзÑмшигч нь дÑлгÑцний нүүрÑнд байгаа одоогийн аппликешн болон үйлчилгÑÑний талаарх хувийн мÑдÑÑллийг унших боломжтой."</string>
+ <string name="permlab_runSetActivityWatcher" msgid="892239094867182656">"бүх апп-ын ÑхлÑлийг Ñ…Ñнах болон удирдах"</string>
+ <string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"Ðпп нь ÑиÑтем активитиг Ñаж Ñхлүүлж байгааг Ñ…Ñнах болон удирдан боломжтой. Хортой апп нь ÑиÑтемд бүрÑн нөлөөлж болзошгүй. Ð­Ð½Ñ Ñрх нь зөвхөн хөгжүүлÑлтийн үед л Ñ…ÑÑ€ÑгтÑй ба Ñнгийн Ñ…ÑÑ€ÑглÑÑнд огт Ñ…ÑÑ€Ñггүй."</string>
+ <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"багц хаÑагдÑан өргөн дамжууллыг илгÑÑÑ…"</string>
+ <string name="permdesc_broadcastPackageRemoved" msgid="6621901216207931089">"Ðпп нь апп багц уÑтгагдÑан талаарх мÑдÑгдлийг өргөн дамжуулах боломжтой. Хортой апп Ñнийг ашиглан буÑад ажиллаж байгаа апп-г зогÑоох боломжтой."</string>
+ <string name="permlab_broadcastSmsReceived" msgid="5689095009030336593">"SMS-хүлÑÑн авав өргөн дамжууллыг илгÑÑÑ…"</string>
+ <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"Ðпп нь SMS меÑÑеж хүлÑÑн авÑан талаарх мÑдÑгдлийг өргөн дамжуулах боломжтой. Хортой апп Ñнийг ашиглан ирÑÑн SMS меÑÑежийг хуурамчаар хийх боломжтой."</string>
+ <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"WAP-PUSH-хүлÑÑн авав өргөн дамжууллыг илгÑÑÑ…"</string>
+ <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"Ðппликешн нь WAP PUSH меÑÑеж хүлÑÑж авÑан мÑдÑгдлийг өргөн дамжуулах боломжтой. Хортой апп нь Ñнийг ашиглан MMS меÑÑеж хүлÑÑн авÑан гÑж хуурамчаар мÑдÑгдÑÑ… ÑÑвÑл хортой хувьÑагч агуулÑан веб хуудаÑны контентыг чимÑÑгүй орлуулах боломжтой."</string>
+ <string name="permlab_setProcessLimit" msgid="2451873664363662666">"ажиллаж байгаа процеÑÑийн тоог Ñ…Ñзгаарлах"</string>
+ <string name="permdesc_setProcessLimit" msgid="7318061314040879542">"Ðпп нь нÑг зÑÑ€Ñг ажиллах процеÑÑийн тооны дÑÑд утгыг удирдах боломжтой. Энгийн апп-д Ñ…ÑзÑÑ Ñ‡ ашиглагдахгүй."</string>
+ <string name="permlab_setAlwaysFinish" msgid="550958507798796965">"арын апп-г хүчÑÑÑ€ хаах"</string>
+ <string name="permdesc_setAlwaysFinish" msgid="7471310652868841499">"Ðпп нь активитинүүд арын болонгуутаа дууÑах ÑÑÑхийг удирдах боломжтой. Энгийн апп-д Ñ…ÑÑ€ÑглÑгдÑхгүй."</string>
+ <string name="permlab_batteryStats" msgid="2789610673514103364">"батерейны ÑтатиÑтикийг унших"</string>
+ <string name="permdesc_batteryStats" msgid="5897346582882915114">"Ðппликешн нь батерей Ñ…ÑÑ€ÑглÑÑний доод-төвшиний одоогийн датаг унших боломжтой. Ðппликешнд таны ашиглаж байгаа апп-н талаарх дÑлгÑÑ€Ñнгүй мÑдÑÑллийг олох боломжийг олгоно."</string>
+ <string name="permlab_updateBatteryStats" msgid="3719689764536379557">"батерейн ÑтатиÑтикийг өөрчлөх"</string>
+ <string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Ðпп нь батерейн цуглуулагдÑан ÑтатиÑтикийг өөрчлөх боломжтой. Энгийн апп-д шаардлагагүй."</string>
+ <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"апп-н ажиллагааны ÑтатиÑтикийг авах"</string>
+ <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Ðпп нь аппликешны ажиллагааны цуглуулÑан ÑтатиÑтикийг дуудах боломжтой. Энгийн апп-д ашиглагдахгүй."</string>
+ <string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"апп ажиллагааны ÑтатиÑтикийг өөрчлөх"</string>
+ <string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Ðпп нь аппликешны ажиллагааны цуглуулÑан ÑтатиÑтикийг өөрчлөх боломжтой. Энгийн апп-д ашиглагдахгүй."</string>
+ <string name="permlab_backup" msgid="470013022865453920">"ÑиÑтем нөөшлөлт болон ÑÑргÑÑлтийг удирдах"</string>
+ <string name="permdesc_backup" msgid="6912230525140589891">"Ðпп нь ÑиÑтемийн нөөшлөх болон ÑÑргÑÑÑ… тогтолцоог удирдах боломжтой. Энгийн апп-уудад Ñ…ÑÑ€ÑглÑгдÑхгүй."</string>
+ <string name="permlab_confirm_full_backup" msgid="5557071325804469102">"бүтÑн нөөшлөлтийг бататгах ÑÑвÑл ажиллагааг ÑÑргÑÑÑ…"</string>
+ <string name="permdesc_confirm_full_backup" msgid="1748762171637699562">"Ðпп нь бүрÑн нөөшлөлтийг баталгаажуулах UI-г ÑхлүүлÑÑ… боломжтой. Энгийн апп-д ашиглагдахгүй."</string>
+ <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"ÑрхжүүлÑгдÑÑгүй цонхыг үзүүлÑÑ…"</string>
+ <string name="permdesc_internalSystemWindow" msgid="7458387759461466397">"Ðпп нь дотоод ÑиÑтемийн Ñ…ÑÑ€ÑглÑгчийн интерфейÑÑ‚ ашиглагдах цонхыг Ò¯Ò¯ÑгÑÑ… боломжтой. Энгийн апп-д ашиглагдахгүй."</string>
+ <string name="permlab_systemAlertWindow" msgid="3543347980839518613">"буÑад апп-Ñ€ зурах"</string>
+ <string name="permdesc_systemAlertWindow" msgid="8584678381972820118">"Ðпп нь буÑад аппликешн ÑÑвÑл Ñ…ÑÑ€ÑглÑгчийн интерфейÑын дÑÑд талд зурах боломжтой. ЭдгÑÑÑ€ нь бүх аппликешны интерфейÑыг ашиглахад Ñаад болох ÑÑвÑл буÑад аппликешн дÑÑÑ€ таны харж байгааг Ñолих боломжтой."</string>
+ <string name="permlab_setAnimationScale" msgid="2805103241153907174">"глобал Ñнимешн хурдыг өөрчлөх"</string>
+ <string name="permdesc_setAnimationScale" msgid="7690063428924343571">"Ðпп нь Ñмар ч үед глобал Ñнимешн хурдыг(хурдан удаан Ñнимешн) Ñолих боломжтой."</string>
+ <string name="permlab_manageAppTokens" msgid="1286505717050121370">"апп бүтвÑрийг удирдах"</string>
+ <string name="permdesc_manageAppTokens" msgid="8043431713014395671">"Ðпп нь өөрийн нормал Z ÑÑ€Ñмбийг дамжуулах замаар Ó©Ó©Ñ€Ñдийн бүтвÑрийг Ò¯Ò¯ÑгÑÑ… болон удирдах боломжтой. Энгийн апп-д Ñ…ÑÑ€ÑглÑгдÑхгүй"</string>
+ <string name="permlab_freezeScreen" msgid="4708181184441880175">"дÑлгÑцийг хөдөлгөөнгүй болгох"</string>
+ <string name="permdesc_freezeScreen" msgid="8558923789222670064">"Ðппликешн нь бүтÑн дÑлгÑцрүү шилжихÑд дÑлгÑцийг хөдөлгөөнгүй болгох боломжтой."</string>
+ <string name="permlab_injectEvents" msgid="1378746584023586600">"товч болон контрол товч дарах"</string>
+ <string name="permdesc_injectEvents" product="tablet" msgid="206352565599968632">"Ðлл нь өөрийн оролтын үйл Ñвдлыг(товч дарагдах г.м) буÑад апп-д дамжуулах боломжтой. Хортой апп нь Ñнийг ашиглан таблетыг удирдах боломжтой."</string>
+ <string name="permdesc_injectEvents" product="default" msgid="653128057572326253">"Ðлл нь өөрийн оролтын үйл Ñвдлыг(товч дарагдах г.м) буÑад апп-д дамжуулах боломжтой. Хортой апп нь Ñнийг ашиглан утÑыг удирдах боломжтой."</string>
+ <string name="permlab_readInputState" msgid="469428900041249234">"таны хийж байгаа үйлдÑл болон бичиж байгааг бичлÑг хийх"</string>
+ <string name="permdesc_readInputState" msgid="8387754901688728043">"Ðпп нь буÑад апп-тай харилцан үйлчилж(нууц үг оруулах) таны дарÑан товчийг ажиглах боломжтой. Энгийн апп-д Ñ…ÑÑ€ÑглÑгдÑхгүй."</string>
+ <string name="permlab_bindInputMethod" msgid="3360064620230515776">"оролтын аргатай холбох"</string>
+ <string name="permdesc_bindInputMethod" msgid="3250440322807286331">"ЭзÑмшигч нь оруулах аргын дÑÑд-төвшиний интерфейÑÑ‚Ñй холбох боломжтой. Энгийн апп-д Ñ…ÑÑ€ÑглÑгдÑхгүй."</string>
+ <string name="permlab_bindAccessibilityService" msgid="5357733942556031593">"хандалтын үйлчилгÑÑнд холбогдох"</string>
+ <string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"ЭзÑмшигч нь хандах үйлчилгÑÑний дÑÑд-төвшиний интерфейÑÑ‚Ñй холбох боломжтой. Энгийн апп-д шаардлагагүй."</string>
+ <string name="permlab_bindPrintService" msgid="8462815179572748761">"Ñ…ÑвлÑÑ… үйлчилгÑÑÑ‚Ñй холбох"</string>
+ <string name="permdesc_bindPrintService" msgid="7960067623209111135">"ЭзÑмшигчид Ñ…ÑвлÑÑ… үйлчилгÑÑний дÑÑд-түвшний интерфейÑÑ‚Ñй холбох боломж олгоно. Энгийн апп-уудад Ñ…ÑзÑÑ Ñ‡ ашиглагдахгүй."</string>
+ <string name="permlab_accessAllPrintJobs" msgid="1120792468465711159">"бүх Ñ…ÑвлÑÑ… ажилд хандалт хийх"</string>
+ <string name="permdesc_accessAllPrintJobs" msgid="2978185311041864762">"ЭзÑмшигчид Ó©Ó©Ñ€ апп-Ð°Ð°Ñ Ò¯Ò¯ÑгÑÑÑн Ñ…ÑвлÑÑ… ажилд хандалт хийх боломж олгоно. Энгийн апп-уудад Ñ…ÑзÑÑ Ñ‡ ашиглагдахгүй."</string>
+ <string name="permlab_bindNfcService" msgid="2752731300419410724">"NFC үйлчилгÑÑÑ‚Ñй холбох"</string>
+ <string name="permdesc_bindNfcService" msgid="6120647629174066862">"ЭзÑмшигчид NFC картуудыг дуурайлгадаг аппликешнүүдийг холбох боломж олгоно. Энгийн апп-уудад Ñ…ÑзÑÑ Ñ‡ шаардагдахгүй."</string>
+ <string name="permlab_bindTextService" msgid="7358378401915287938">"текÑÑ‚ үйлчилгÑÑÑ‚Ñй холбох"</string>
+ <string name="permdesc_bindTextService" msgid="8151968910973998670">"ЭзÑмшигч нь текÑÑ‚ үйлчилгÑÑний(ж.нь. SpellCheckerService) дÑÑд-төвшиний интерфейÑÑ‚Ñй холбох боломжтой. Энгийн апп-д Ñ…ÑÑ€ÑглÑгдÑхгүй."</string>
+ <string name="permlab_bindVpnService" msgid="4708596021161473255">"VPN үйлчилгÑÑÑ‚Ñй холбох"</string>
+ <string name="permdesc_bindVpnService" msgid="2067845564581693905">"ЭзÑмшигч нь VPN үйлчилгÑÑний дÑÑд-төвшиний интерфейÑÑ‚Ñй холбох боломжтой. Энгийн апп-д шаардлагагүй."</string>
+ <string name="permlab_bindWallpaper" msgid="8716400279937856462">"ханын зурагтай холбох"</string>
+ <string name="permdesc_bindWallpaper" msgid="7108428692595491668">"ЭзÑмшигч нь ханын зурагны дÑÑд-төвшиний интерфейÑÑ‚Ñй холбох боломжтой. Энгийн апп-уудад шаардлагагүй."</string>
+ <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"виджет үйлчилгÑÑÑ‚Ñй холбох"</string>
+ <string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"ЭзÑмшигч нь виджет үйлчилгÑÑний дÑÑд-төвшиний интерфейÑÑ‚Ñй холбох боломжтой. Энгийн апп-д шаардлагагүй."</string>
+ <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"төхөөрөмжийн админтай харилцан үйлчлÑÑ…"</string>
+ <string name="permdesc_bindDeviceAdmin" msgid="569715419543907930">"ЭзÑмшигч нь төхөөрөмжийн админруу интент илгÑÑÑ… боломжтой. Энгийн апп-д шаардлагагүй."</string>
+ <string name="permlab_manageDeviceAdmins" msgid="4248828900045808722">"төхөөрөмжийн админ нÑмÑÑ…, хаÑах"</string>
+ <string name="permdesc_manageDeviceAdmins" msgid="5025608167709942485">"ЭзÑмшигч нь идÑвхтÑй төхөөрөмжийн админиÑтраторыг нÑмÑÑ…, хаÑах боломжтой. Энгийн апп-д шаардлагагүй."</string>
+ <string name="permlab_setOrientation" msgid="3365947717163866844">"дÑлгÑцний чиглÑлийг Ñолих"</string>
+ <string name="permdesc_setOrientation" msgid="3046126619316671476">"Ðпп нь Ñмар ч үед дÑлгÑцний ÑргÑлтийг Ñолих боломжтой. Энгийн аппликешнд Ñ…ÑзÑÑ Ñ‡ ашиглахгүй."</string>
+ <string name="permlab_setPointerSpeed" msgid="9175371613322562934">"заагчийн хурдыг Ñолих"</string>
+ <string name="permdesc_setPointerSpeed" msgid="6866563234274104233">"Ðпп нь хулгана ÑÑвÑл хөдлөх Ñамбарын заагчийн хурдыг Ñмарч үед Ñолих боломжтой. Энгийн апп-д Ñ…ÑÑ€ÑглÑгдÑхгүй."</string>
+ <string name="permlab_setKeyboardLayout" msgid="4778731703600909340">"гарын Ñхемийг Ñолих"</string>
+ <string name="permdesc_setKeyboardLayout" msgid="8480016771134175879">"Ðпп нь гарын Ñхемыг Ñолих боломжтой. Энгийн апп-д Ñ…ÑÑ€ÑглÑгдÑхгүй."</string>
+ <string name="permlab_signalPersistentProcesses" msgid="4539002991947376659">"аппруу Linux дохио илгÑÑÑ…"</string>
+ <string name="permdesc_signalPersistentProcesses" msgid="4896992079182649141">"Ðпп нь бүх байнгын процеÑÑруу хангамжийн дохиог илгÑÑÑ… Ñ…Ò¯ÑÑлтийг хийх боломжтой."</string>
+ <string name="permlab_persistentActivity" msgid="8841113627955563938">"апп-г байнга ажиллуулах"</string>
+ <string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Ðпп нь өөрийн Ñ…ÑÑгийн Ñанах ойд байнга байлгах боломжтой. Ð­Ð½Ñ Ð½ÑŒ буÑад апп-уудын ашиглах Ñанах ойг Ñ…Ñзгаарлан таблетыг удаашруулах болно."</string>
+ <string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"Ðпп нь өөрийн Ñ…ÑÑгийг Ñанах ойд байнга байлгах боломжтой. Ð­Ð½Ñ Ð½ÑŒ буÑад апп-уудын ашиглах Ñанах ойг Ñ…Ñзгаарлан утÑыг удаашруулах болно."</string>
+ <string name="permlab_deletePackages" msgid="184385129537705938">"апп уÑтгах"</string>
+ <string name="permdesc_deletePackages" msgid="7411480275167205081">"Ðпп нь Ðндройд багцийг уÑтгах боломжтой. Хортой апп нь Ñнийг ашиглан чухал апп-г уÑтгах боломжтой."</string>
+ <string name="permlab_clearAppUserData" msgid="274109191845842756">"буÑад апп-н датаг уÑтгах"</string>
+ <string name="permdesc_clearAppUserData" msgid="4625323684125459488">"Ðпп нь Ñ…ÑÑ€ÑглÑгчийн датаг арилгах боломжтой."</string>
+ <string name="permlab_deleteCacheFiles" msgid="3128665571837408675">"буÑад апп-н кешÑÑÑ ÑƒÑтгах"</string>
+ <string name="permdesc_deleteCacheFiles" msgid="3812998599006730196">"Ðпп нь кеш Ñ„Ð°Ð¹Ð»Ð°Ð°Ñ ÑƒÑтгах боломжтой."</string>
+ <string name="permlab_getPackageSize" msgid="7472921768357981986">"апп Ñангийн Ñ…ÑмжÑÑг Ñ…Ñмжих"</string>
+ <string name="permdesc_getPackageSize" msgid="3921068154420738296">"Ðпп нь өөрийн код, дата болон кеш Ñ…ÑмжÑÑг унших боломжтой"</string>
+ <string name="permlab_installPackages" msgid="2199128482820306924">"апп-г шууд Ñуулгах"</string>
+ <string name="permdesc_installPackages" msgid="5628530972548071284">"Ðпп нь ÑˆÐ¸Ð½Ñ ÑÑвÑл шинÑчлÑгдÑÑн Ðндройд багцийг Ñуулгах боломжтой. Хортой апп нь Ñнийг ашиглан дурын ÑрхтÑй ÑˆÐ¸Ð½Ñ Ð°Ð¿Ð¿-г Ñуулгах боломжтой."</string>
+ <string name="permlab_clearAppCache" msgid="7487279391723526815">"бүх апп-н кеш датаг уÑтгах"</string>
+ <string name="permdesc_clearAppCache" product="tablet" msgid="8974640871945434565">"Ðпп нь буÑад аппликешны кеш Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¾Ð¾Ñ Ñ„Ð°Ð¹Ð» уÑтган таблетын Ñанг чөлөөлөх боломжтой. Ð­Ð½Ñ Ð½ÑŒ буÑад аппликешнд нөлөөлж, Ñ‚ÑдгÑÑÑ€ нь ÑхлÑхдÑÑ ÑˆÐ°Ð°Ñ€Ð´Ð»Ð°Ð³Ð°Ñ‚Ð°Ð¹ датагаа дахин дуудах тул удааширч болзошгүй."</string>
+ <string name="permdesc_clearAppCache" product="default" msgid="2459441021956436779">"Ðпп нь буÑад аппликешны кеш Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¾Ð¾Ñ Ñ„Ð°Ð¹Ð» уÑтган утаÑны Ñанг чөлөөлөх боломжтой. Ð­Ð½Ñ Ð½ÑŒ буÑад аппликешнд нөлөөлж, Ñ‚ÑдгÑÑÑ€ нь ÑхлÑхдÑÑ ÑˆÐ°Ð°Ñ€Ð´Ð»Ð°Ð³Ð°Ñ‚Ð°Ð¹ датагаа дахин дуудах тул удааширч болзошгүй."</string>
+ <string name="permlab_movePackage" msgid="3289890271645921411">"апп нөөцийг шилжүүлÑÑ…"</string>
+ <string name="permdesc_movePackage" msgid="319562217778244524">"Ðпп нь апп нөөцийг Ð´Ð¾Ñ‚Ñ€Ð¾Ð¾Ñ Ð³Ð°Ð´Ð½Ð° медиаруу болон ÑÑÑ€ÑгÑÑÑ€ нь зөөх боломжтой."</string>
+ <string name="permlab_readLogs" msgid="6615778543198967614">"нууц лог дата унших"</string>
+ <string name="permdesc_readLogs" product="tablet" msgid="82061313293455151">"Ðпп нь ÑиÑтемийн төрөл бүрийн лог файлыг унших боломжтой. Ð­Ð½Ñ Ð½ÑŒ та таблет дÑÑÑ€ÑÑ ÑŽÑƒ хийÑÑн талаарх хувийн болон нууц мÑдÑÑллийг олох боломжтой болгоно."</string>
+ <string name="permdesc_readLogs" product="default" msgid="2063438140241560443">"Ðпп нь ÑиÑтемийн төрөл бүрийн лог файлыг унших боломжтой. Ð­Ð½Ñ Ð½ÑŒ та утÑан дÑÑÑ€ÑÑ ÑŽÑƒ хийÑÑн талаарх хувийн болон нууц мÑдÑÑллийг олох боломжтой болгоно."</string>
+ <string name="permlab_anyCodecForPlayback" msgid="715805555823881818">"тоглуулахын тулд дурын медиа шифрлÑгчийг ашиглах"</string>
+ <string name="permdesc_anyCodecForPlayback" msgid="8283912488433189010">"Ðпп нь тоглуулах үедÑÑ ÐºÐ¾Ð´ тайлахдаа ÑуулгагдÑан Ñмарч медиа код тайлагчийг ашиглах боломжтой."</string>
+ <string name="permlab_manageCaCertificates" msgid="1678391896786882014">"итгÑмжлÑгдÑÑн жуухуудыг удирдах"</string>
+ <string name="permdesc_manageCaCertificates" msgid="4015644047196937014">"Ðпп-д CA Ñертификатуудыг итгÑмжлÑгдÑÑн жуух байдлаар Ñуулгах болон уÑтгахыг зөвшөөрнө."</string>
+ <string name="permlab_diagnostic" msgid="8076743953908000342">"оношлох грүпийн ÑзÑмшдÑг нөөцрүү унших/бичих"</string>
+ <string name="permdesc_diagnostic" msgid="6608295692002452283">"Ðпп нь оношлох грүпийн ÑзÑмшдÑг, жишÑÑ Ð½ÑŒ /dev доторх файлууд, дурын нөөцийг унших бичих боломжтой.Ð­Ð½Ñ Ð½ÑŒ ÑиÑтемийн тогвортой байдал болон аюулгүй байдалд бодитоор нөлөөлнө. Ð­Ð½Ñ Ð½ÑŒ үйлдвÑрлÑгч болон операторын хардверт-зориулÑан оношлогоонд ашиглагдана."</string>
+ <string name="permlab_changeComponentState" msgid="6335576775711095931">"апп компонентыг идÑвхжүүлÑÑ… ÑÑвÑл идÑвхгүй болгох"</string>
+ <string name="permdesc_changeComponentState" product="tablet" msgid="8887435740982237294">"Ðпп нь Ó©Ó©Ñ€ апп-н компонент идÑвхтÑй ÑÑÑхийг Ñолих боломжтой. Хортой апп нь Ñнийг ашиглан таблетын чухал чадамжийг идÑвхгүй болгож болзошгүй. Зөвшөөрөл нь аппликешн компонентыг тогтворгүй, ашиглаж болохгүй, тохиромжгүй төлөвт оруулах боломжтой тул ашиглахдаа болгоомжтой байх шаардлагатай."</string>
+ <string name="permdesc_changeComponentState" product="default" msgid="1827232484416505615">"Ðпп нь Ó©Ó©Ñ€ апп-н компонент идÑвхтÑй ÑÑÑхийг Ñолих боломжтой. Хортой апп нь Ñнийг ашиглан утаÑны чухал чадамжийг идÑвхгүй болгож болзошгүй. Зөвшөөрөл нь аппликешн компонентыг тогтворгүй, ашиглаж болохгүй, тохиромжгүй төлөвт оруулах боломжтой тул ашиглахдаа болгоомжтой байх шаардлагатай."</string>
+ <string name="permlab_grantRevokePermissions" msgid="4627315351093508795">"зөвшөөрөл олгох ÑÑвÑл цуцлах"</string>
+ <string name="permdesc_grantRevokePermissions" msgid="4088642654085850662">"Ðппликешн нь өөртÑй болон буÑад аппликешнд туÑгай зөвшөөрлийг олгох болон цуцлах боломжтой. Хортой аппликешн нь Ñнийг ашиглан таны олгоогүй ÑрхÑнд хандах боломжтой."</string>
+ <string name="permlab_setPreferredApplications" msgid="8463181628695396391">"үндÑÑн апп-г тохируулах"</string>
+ <string name="permdesc_setPreferredApplications" msgid="4973986762241783712">"Ðпп нь таны туÑгай апп-уудыг өөрчлөх боломжтой. Хортой апп нь ажиллаж байгаа апп-г нууцаар өөрчлөн, таны хуучин апп-г таны хувийн датаг цуглуулагч болгон хуурах боломжтой."</string>
+ <string name="permlab_writeSettings" msgid="2226195290955224730">"ÑиÑтем тохиргоог өөрчлөх"</string>
+ <string name="permdesc_writeSettings" msgid="7775723441558907181">"Ðпп нь ÑиÑтемийн тохиргооны датаг өөрчлөх боломжтой. Хортой апп нь таны ÑиÑтемийн тохиргоог ÑүйтгÑÑ… боломжтой."</string>
+ <string name="permlab_writeSecureSettings" msgid="204676251876718288">"аюулгүй ÑиÑтем тохиргоог өөрчлөх"</string>
+ <string name="permdesc_writeSecureSettings" msgid="8159535613020137391">"Ðпп нь ÑиÑтемийн аюулгүй байдлын тохиргооны датаг өөрчлөх боломжтой. Энгийн апп-д ашиглагдахгүй."</string>
+ <string name="permlab_writeGservices" msgid="2149426664226152185">"Google газрын зургийн үйлчилгÑÑг өөрчлөх"</string>
+ <string name="permdesc_writeGservices" msgid="1287309437638380229">"Ðпп нь Google-н газрын зургийн үйлчилгÑÑг өөрчлөх боломжтой. Энгийн апп-д ашиглагдахгүй."</string>
+ <string name="permlab_receiveBootCompleted" msgid="5312965565987800025">"ЭхлÑÑ…Ñд ажиллуулах"</string>
+ <string name="permdesc_receiveBootCompleted" product="tablet" msgid="7390304664116880704">"Ðпп нь ÑиÑтем аÑаж дууÑахад шууд өөрийгөө аÑаах боломжтой. ИнгÑÑнÑÑÑ€ таблетыг аÑахад их хугацаа орох болон байнга ажилладаг апп нь таблетийг бүхÑлд нь удаашруулах боломжтой."</string>
+ <string name="permdesc_receiveBootCompleted" product="default" msgid="513950589102617504">"Ðпп нь ÑиÑтем аÑаж дууÑахад шууд өөрийгөө аÑаах боломжтой. ИнгÑÑнÑÑÑ€ утÑыг аÑахад их хугацаа орох болон байнга ажилладаг апп нь утÑыг бүхÑлд нь удаашруулах боломжтой."</string>
+ <string name="permlab_broadcastSticky" msgid="7919126372606881614">"таÑардаггүй өргөн дамжууллыг илгÑÑÑ…"</string>
+ <string name="permdesc_broadcastSticky" product="tablet" msgid="7749760494399915651">"Ðпп нь өргөн дамжуулал дууÑÑаны дараа үлдÑÑн өргөн дамжуулалыг илгÑÑÑ… боломжтой. ИхÑÑÑ€ ашиглах нь Ñ…ÑÑ‚ их Ñанах ой ашиглан таблетыг удаашруулах болон тогтворгүй болгох боломжтой."</string>
+ <string name="permdesc_broadcastSticky" product="default" msgid="2825803764232445091">"Ðпп нь өргөн дамжуулал дууÑÑаны дараа үлдÑÑн өргөн дамжуулалыг илгÑÑÑ… боломжтой. ИхÑÑÑ€ ашиглах нь Ñ…ÑÑ‚ их Ñанах ой ашиглан утÑыг удаашруулах болон тогтворгүй болгох боломжтой."</string>
+ <string name="permlab_readContacts" msgid="8348481131899886131">"өөрийн харилцагчдыг унших"</string>
+ <string name="permdesc_readContacts" product="tablet" msgid="5294866856941149639">"Ðпп нь таны утÑаар ÑрьÑан, имÑйл илгÑÑÑÑн давтамж ÑÑвÑл туÑгай харилцагдчидтайгаа Ó©Ó©Ñ€ аргаар холбоо барьÑан байдал зÑргийг агуулÑан таблет дÑÑÑ€ хадгалагдÑан харилцагчдын талаарх датаг унших боломжтой. Ð­Ð½Ñ Ð·Ó©Ð²ÑˆÓ©Ó©Ñ€Ó©Ð» нь апп-д таны харилцагчийн датаг хадгалах боломжийг олгох ба хортой апп нь танд мÑдÑгдÑлгүйгÑÑÑ€ харилцагчийн датаг хуваалцах боломжтой."</string>
+ <string name="permdesc_readContacts" product="default" msgid="8440654152457300662">"Ðпп нь таны утÑаар ÑрьÑан, имÑйл илгÑÑÑÑн давтамж ÑÑвÑл туÑгай харилцагчидтайгаа Ó©Ó©Ñ€ аргаар холбоо барьÑан байдал зÑргийг агуулÑан таны утÑан дÑÑÑ€ хадгалагдÑан харилцагчдын талаарх датаг унших боломжтой. Ð­Ð½Ñ Ð·Ó©Ð²ÑˆÓ©Ó©Ñ€Ó©Ð» нь апп-д таны харилцагчийн датаг хадгалах боломжийг олгох ба хортой апп нь танд мÑдÑгдÑлгүйгÑÑÑ€ харилцагчийн датаг хуваалцах боломжтой."</string>
+ <string name="permlab_writeContacts" msgid="5107492086416793544">"таны харилцагчдыг өөрчлөх"</string>
+ <string name="permdesc_writeContacts" product="tablet" msgid="897243932521953602">"Ðпп нь таны утÑаар ÑрьÑан, имÑйл илгÑÑÑÑн давтамж ÑÑвÑл туÑгай харилцагчидтайгаа Ó©Ó©Ñ€ аргаар холбоо барьÑан байдал зÑргийг агуулÑан таны таблет дÑÑÑ€ хадгалагдÑан харилцагчдын талаарх датаг өөрчлөх боломжтой. Ð­Ð½Ñ Ð·Ó©Ð²ÑˆÓ©Ó©Ñ€Ó©Ð» нь апп-д харилцагчийн датаг уÑтгах боломжийг олгоно."</string>
+ <string name="permdesc_writeContacts" product="default" msgid="589869224625163558">"Ðпп нь таны утÑаар ÑрьÑан, имÑйл илгÑÑÑÑн давтамж ÑÑвÑл харилцагдчидтайгаа Ó©Ó©Ñ€ аргаар холбоо барьÑан байдал зÑргийг агуулÑан утÑан дÑÑÑ€ хадгалагдÑан харилцагчдын талаарх датаг өөрчлөх боломжтой. Ð­Ð½Ñ Ð·Ó©Ð²ÑˆÓ©Ó©Ñ€Ó©Ð» нь апп-д харилцагчийн датаг уÑтгах боломжийг олгоно."</string>
+ <string name="permlab_readCallLog" msgid="3478133184624102739">"дуудлагын логийг унших"</string>
+ <string name="permdesc_readCallLog" product="tablet" msgid="3700645184870760285">"Ðпп нь таны таблетын ирÑÑн гарÑан дуудлага зÑргийг агуулÑан дуудлагын логыг унших боломжтой. Ð­Ð½Ñ Ð·Ó©Ð²ÑˆÓ©Ó©Ñ€Ó©Ð» нь апп-д таны дуудлагын логын датаг хадгалах боломжийг олгох ба хортой апп нь танд мÑдÑгдÑлгүйгÑÑÑ€ дуудлагын лог датаг хуваалцах боломжтой."</string>
+ <string name="permdesc_readCallLog" product="default" msgid="5777725796813217244">"Ðпп нь таны утаÑны ирÑÑн гарÑан дуудлага зÑргийг агуулÑан дуудлагын логыг унших боломжтой. Ð­Ð½Ñ Ð·Ó©Ð²ÑˆÓ©Ó©Ñ€Ó©Ð» нь апп-д таны дуудлагын логын датаг хадгалах боломжийг олгох ба хортой апп нь танд мÑдÑгдÑлгүйгÑÑÑ€ дуудлагын лог датаг хуваалцах боломжтой."</string>
+ <string name="permlab_writeCallLog" msgid="8552045664743499354">"дуудлагын логруу бичих"</string>
+ <string name="permdesc_writeCallLog" product="tablet" msgid="6661806062274119245">"Ðпп нь таны таблетын ирÑÑн гарÑан дуудлага зÑргийг агуулÑан дуудлагын логыг унших боломжтой. Хортой апп нь Ñнийг ашиглан таны дуудлагын логыг өөрчлөх болон арилгах боломжтой."</string>
+ <string name="permdesc_writeCallLog" product="default" msgid="683941736352787842">"Ðпп нь таны утаÑны ирÑÑн гарÑан дуудлага зÑргийг агуулÑан дуудлагын логыг өөрчлөх боломжтой. Хортой апп нь Ñнийг ашиглан таны дуудлагын логыг өөрчлөх болон арилгах боломжтой."</string>
+ <string name="permlab_readProfile" msgid="4701889852612716678">"та өөрийн харилцагчийн картыг унших"</string>
+ <string name="permdesc_readProfile" product="default" msgid="5462475151849888848">"Ðпп нь таны нÑÑ€ болон холбоо барих мÑдÑÑлÑл зÑÑ€Ñг таны утÑан дÑÑÑ€ хадгалагдÑан хувийн профайл мÑдÑÑллийг унших боломжтой. ИнгÑÑнÑÑÑ€ апп нь танийг таньж чадах ба таны профайл мÑдÑÑллийг буÑдад илгÑÑÑ… боломжтой."</string>
+ <string name="permlab_writeProfile" msgid="907793628777397643">"та өөрийн харилцагчийн картыг өөрчлөх"</string>
+ <string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"Ðпп нь таны нÑÑ€ болон холбоо барих мÑдÑÑлÑл зÑÑ€Ñг таны төхөөрөмж дÑÑÑ€ хадгалагдÑан хувийн профайл мÑдÑÑллийг Ñолих ÑÑвÑл нÑмÑÑ… боломжтой. ИнгÑÑнÑÑÑ€ апп нь танийг таньж чадах ба таны профайл мÑдÑÑллийг буÑдад илгÑÑÑ… боломжтой."</string>
+ <string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"таны нийтийн урÑÐ³Ð°Ð»Ð°Ð°Ñ ÑƒÐ½ÑˆÐ¸Ñ…"</string>
+ <string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"Ðпп нь та болон таны найзуудын нийтийн шинÑчлÑлтÑд хандах болон Ñинк хийх боломжтой. МÑдÑÑлÑл хуваалцахдаа болгоомжтой байна уу - ÑÐ½Ñ Ð½ÑŒ апп-д нийтийн ÑүлжÑÑндÑÑ… та болон таны найзууд хоорондын холбоог нууц ÑÑÑÑ…ÑÑÑ Ò¯Ð» хамааран унших боломжтой. Ðнхаар: ÑÐ½Ñ Ð·Ó©Ð²ÑˆÓ©Ó©Ñ€Ó©Ð» нь бүх нийтийн ÑүлжÑÑнд ашиглаж боломжгүй."</string>
+ <string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"Таны нийтийн урÑгалруу бичих"</string>
+ <string name="permdesc_writeSocialStream" product="default" msgid="3086557552204114849">"Ðпп нь таны найзуудын нийтийн шинÑчлÑлтийг дүрÑлÑÑ… боломжтой.МÑдÑÑлÑл хуваалцахдаа болгоомжтой байна уу - ÑÐ½Ñ Ð½ÑŒ апп-д таны Ð½Ð°Ð¹Ð·Ð°Ð°Ñ Ð¸Ñ€ÑÑн мÑÑ‚ харагдах меÑÑеж хийх боломжийг олгоно. Ðнхаар: ÑÐ½Ñ Ð·Ó©Ð²ÑˆÓ©Ó©Ñ€Ó©Ð» нь бүх нийтийн ÑүлжÑÑнд ашиглаж боломжгүй."</string>
+ <string name="permlab_readCalendar" msgid="5972727560257612398">"календарийн хуваарийн нууц мÑдÑÑллийг унших"</string>
+ <string name="permdesc_readCalendar" product="tablet" msgid="4216462049057658723">"Ðпп нь таны таблет дÑÑÑ€ хадгалагдÑан найзууд болон хамтран ажиллагÑдын календарийн бүх хуваарийг унших боломжтой. Ð­Ð½Ñ Ð½ÑŒ апп-д таны календарийн датаг нууц ÑÑвÑл ÑмзÑг ÑÑÑÑ…ÑÑÑ Ð½ÑŒ үл хамааран хуваалцах ÑÑвÑл хадгалах боломжийг олгоно."</string>
+ <string name="permdesc_readCalendar" product="default" msgid="7434548682470851583">"Allows the app to read all calendar events stored on your phone, including those of friends or co-workers. This may allow the app to share or save your calendar data, regardless of confidentiality or sensitivity. Ðпп нь таны утÑан дÑÑÑ€ хадгалагдÑан найзууд болон хамтран ажиллагÑдын календарийн бүх хуваарийг унших боломжтой. Ð­Ð½Ñ Ð½ÑŒ апп-д таны календарийн датаг нууц ÑÑвÑл ÑмзÑг ÑÑÑÑ…ÑÑÑ Ð½ÑŒ үл хамааран хуваалцах ÑÑвÑл хадгалах боломжийг олгоно."</string>
+ <string name="permlab_writeCalendar" msgid="8438874755193825647">"календарын хуваарийг нÑмÑÑ… ÑÑвÑл өөрчлөх болон ÑзÑмшигчид мÑдÑгдÑлгүйгÑÑÑ€ зочидруу имÑйл илгÑÑÑ…"</string>
+ <string name="permdesc_writeCalendar" product="tablet" msgid="6679035520113668528">"Ðпп нь таблет дÑÑÑ€ та болон таны найзууд, хамтран ажиллагÑдын өөрчилж чадах үйл Ñвдлуудыг нÑмÑÑ…, хаÑах болон Ñолих боломжтой. Ð­Ð½Ñ Ð½ÑŒ апп-д, календарь ÑзÑмшигчÑÑÑ Ð¸Ñ€ÑÑн мÑÑ‚ харагдах меÑÑежийг илгÑÑÑ… ÑÑвÑл ÑзÑмшигчд нь мÑдÑгдÑлгүйгÑÑÑ€ үйл Ñвдлуудыг өөрчлөх боломжийг олгоно."</string>
+ <string name="permdesc_writeCalendar" product="default" msgid="2324469496327249376">"Ðпп нь утÑан дÑÑÑ€ та болон таны найзууд, хамтран ажиллагÑдын өөрчилж чадах үйл Ñвдлуудыг нÑмÑÑ…, хаÑах болон Ñолих боломжтой. Ð­Ð½Ñ Ð½ÑŒ апп-д, календарь ÑзÑмшигчÑÑÑ Ð¸Ñ€ÑÑн мÑÑ‚ харагдах меÑÑежийг илгÑÑÑ… ÑÑвÑл ÑзÑмшигчид нь мÑдÑгдÑлгүйгÑÑÑ€ үйл Ñвдлуудыг өөрчлөх боломжийг олгоно."</string>
+ <string name="permlab_accessMockLocation" msgid="8688334974036823330">"теÑÑ‚ хийх байршлын ÑÑ… Ò¯Ò¯ÑвÑрийг Ò¯Ò¯ÑгÑÑ…"</string>
+ <string name="permdesc_accessMockLocation" msgid="5808711039482051824">"ТеÑÑ‚Ñд ашиглах хуурамч байршлын ÑÑ… Ò¯Ò¯ÑвÑрийг Ò¯Ò¯ÑгÑÑ… болон ÑˆÐ¸Ð½Ñ Ð±Ð°Ð¹Ñ€ÑˆÐ¸Ð» өгөгчийг Ñуулгах боломжтой. ИнгÑÑнÑÑÑ€ апп нь GPS ÑÑвÑл байршил өгөгч зÑÑ€Ñг буÑад байршлын ÑÑ… Ò¯Ò¯ÑвÑÑ€ÑÑÑ Ð¸Ñ€ÑÑн байршил болон ÑтатуÑыг өөрчлөх боломжтой."</string>
+ <string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"байршил нийлүүлÑгчийн нÑмÑлт тушаалд хандах"</string>
+ <string name="permdesc_accessLocationExtraCommands" msgid="5945166642335800763">"Ðпп нь байршил нийлүүлÑгчийн нÑмÑлт тушаалд хандах боломжтой. Ð­Ð½Ñ Ð½ÑŒ апп-д GPS ÑÑвÑл буÑад байршлын үйлчилгÑÑний ажиллагаанд нөлөөлөх боломжийг олгоно."</string>
+ <string name="permlab_installLocationProvider" msgid="6578101199825193873">"байршил нийлүүлÑгчийг Ñуулгах зөвшөөрөх"</string>
+ <string name="permdesc_installLocationProvider" msgid="9066146120470591509">"ТеÑÑ‚Ñд ашиглах хуурамч байршлын ÑÑ… Ò¯Ò¯ÑвÑрийг Ò¯Ò¯ÑгÑÑ… болон ÑˆÐ¸Ð½Ñ Ð±Ð°Ð¹Ñ€ÑˆÐ¸Ð» өгөгчийг Ñуулгах боломжтой. ИнгÑÑнÑÑÑ€ апп нь GPS ÑÑвÑл байршил өгөгч зÑÑ€Ñг буÑад байршлын ÑÑ… Ò¯Ò¯ÑвÑÑ€ÑÑÑ Ð¸Ñ€ÑÑн байршил болон ÑтатуÑыг өөрчлөх боломжтой."</string>
+ <string name="permlab_accessFineLocation" msgid="1191898061965273372">"Тодорхой байршил(GPS болон ÑүлжÑÑнд ÑуурилÑан)"</string>
+ <string name="permdesc_accessFineLocation" msgid="5295047563564981250">"Ðпп нь GPS ÑÑвÑл үүрÑн цамхаг болон Wi-Fi зÑÑ€Ñг ÑүлжÑÑний байршлын ÑÑ… Ò¯Ò¯ÑвÑрийг ашиглан таны тодорхой байршлыг авах боломжтой. ЭдгÑÑÑ€ байршлын үйлчилгÑÑнүүд нь аÑаалттай байх шаардлагатай ба таны төхөөрөмж дÑÑрх апп-ууд ашиглах боломжтой байх шаардлагатай. Ðпп-ууд Ñнийг ашиглан таныг хаана байгааг тогтоох боломжтой ба батерей зарцуулалт нÑмÑгдÑнÑ."</string>
+ <string name="permlab_accessCoarseLocation" msgid="4887895362354239628">"ойролцоох байршил(ÑүлжÑÑнд ÑуурилÑан)"</string>
+ <string name="permdesc_accessCoarseLocation" msgid="2538200184373302295">"Ðпп нь таны ойролцоох байршлыг оло боломжтой. Ð­Ð½Ñ Ð±Ð°Ð¹Ñ€ÑˆÐ¸Ð» нь үүрÑн цамхаг болон Wi-Fi зÑÑ€Ñг ÑүлжÑÑний байршлын ÑÑ… Ñурвалжийг ашигладаг байршлын үйлчилгÑÑнÑÑÑ Ð¾Ð»Ð´Ð¾Ð½Ð¾. ЭдгÑÑÑ€ байршлын үйлчилгÑÑнүүд нь таны төхөөрөмж дÑÑÑ€ аÑаалттай байх шаардлагатай ба апп-д Ñ‚ÑдгÑÑрийг ашиглах боломжтой байх шаардлагатай. Ðпп-д Ñ‚ÑдгÑÑрийг ашиглан таны байршлыг ойролцоогоор олох боломжтой."</string>
+ <string name="permlab_accessSurfaceFlinger" msgid="2363969641792388947">"SurfaceFlinger-т хандах"</string>
+ <string name="permdesc_accessSurfaceFlinger" msgid="1041619516733293551">"Ðпп нь SurfaceFlinger доод-төвшиний функцийг ашиглах боломжтой."</string>
+ <string name="permlab_readFrameBuffer" msgid="6690504248178498136">"ФрÑйм буферÑÑÑ ÑƒÐ½ÑˆÐ¸Ñ…"</string>
+ <string name="permdesc_readFrameBuffer" msgid="4937405521809454680">"Ðпп нь фрÑйм буферын контентыг унших боломжтой."</string>
+ <string name="permlab_accessInputFlinger" msgid="5348635270689553857">"InputFlinger-т хандалт хийх"</string>
+ <string name="permdesc_accessInputFlinger" msgid="2104864941201226616">"Ðпп-д SurfaceFlinger доод-түвшний функцуудыг ашиглах боломж олгоно."</string>
+ <string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"Wifi дÑлгÑцийг тохируулах"</string>
+ <string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"Ðпп нь Wifi дÑлгÑцийг тохируулах болон холбогдох боломжтой."</string>
+ <string name="permlab_controlWifiDisplay" msgid="393641276723695496">"Wifi дÑлгÑцийг удирдах"</string>
+ <string name="permdesc_controlWifiDisplay" msgid="4543912292681826986">"Ðпп нь Wifi дÑлгÑцний доод-төвшиний функцийг удирдах боломжтой."</string>
+ <string name="permlab_captureAudioOutput" msgid="6857134498402346708">"аудио гаралтыг барих"</string>
+ <string name="permdesc_captureAudioOutput" msgid="6210597754212208853">"Ðпп-Ñ‚ аудио гаралтыг барих, дахин чиглүүлÑхийг зөвшөөрнө."</string>
+ <string name="permlab_captureVideoOutput" msgid="2246828773589094023">"видео гаралтыг барих"</string>
+ <string name="permdesc_captureVideoOutput" msgid="359481658034149860">"Ðпп-Ñ‚ видео гаралтыг барих, дахин чиглүүлÑхийг зөвшөөрнө."</string>
+ <string name="permlab_captureSecureVideoOutput" msgid="7815398969303382016">"найдвартай видео гаралтыг барих"</string>
+ <string name="permdesc_captureSecureVideoOutput" msgid="2779793064709350289">"Ðпп-Ñ‚ найдвартай видео гаралтыг барих, дахин чиглүүлÑхийг зөвшөөрнө."</string>
+ <string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"Ðудио тохиргоо Ñолих"</string>
+ <string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"Ðпп нь дууны Ñ…ÑмжÑÑ, Ñпикерын гаралтад ашиглагдах глобал аудио тохиргоог өөрчлөх боломжтой."</string>
+ <string name="permlab_recordAudio" msgid="3876049771427466323">"аудио бичих"</string>
+ <string name="permdesc_recordAudio" msgid="4906839301087980680">"Ðпп нь микрофоноор аудио бичих боломжтой. Ð­Ð½Ñ Ð·Ó©Ð²ÑˆÓ©Ó©Ñ€Ó©Ð» нь апп-д Ñмар ч үед таны зөвшөөрөлгүйгÑÑÑ€ аудио бичих боломжийг олгоно."</string>
+ <string name="permlab_camera" msgid="3616391919559751192">"зураг авах болон видео бичих"</string>
+ <string name="permdesc_camera" msgid="8497216524735535009">"Ðпп нь камераар зураг авах болон видео бичих боломжтой. Ð­Ð½Ñ Ð·Ó©Ð²ÑˆÓ©Ó©Ñ€Ó©Ð» нь апп-д Ñмар ч үед таны зөвшөөрөлгүйгÑÑÑ€ камер ашиглах боломжийг олгоно."</string>
+ <string name="permlab_cameraDisableTransmitLed" msgid="2651072630501126222">"камер ашиглаж байх үед дамжууллыг заагч LED-г идÑвхгүй болгох"</string>
+ <string name="permdesc_cameraDisableTransmitLed" msgid="4764585465480295341">"Урьдчилан ÑууÑан ÑиÑтем аппликешн нь камер ашиглалтыг зааÑан LED-г идÑвхгүй болгох боломжтой."</string>
+ <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"таблетыг бүрмөÑөн идÑвхгүй болгох"</string>
+ <string name="permlab_brick" product="default" msgid="8337817093326370537">"утÑыг бүрмөÑөн идÑвхгүй болгох"</string>
+ <string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Ðпп нь таблетыг бүхÑлд нь бүрмөÑөн идÑвхгүй болгох боломжтой. Ð­Ð½Ñ Ð¼Ð°Ñˆ аюултайÑ"</string>
+ <string name="permdesc_brick" product="default" msgid="5788903297627283099">"Ðпп нь утÑыг бүхÑлд нь бүрмөÑөн идÑвхгүй болгох боломжтой. Ð­Ð½Ñ Ð¼Ð°Ñˆ аюултай."</string>
+ <string name="permlab_reboot" product="tablet" msgid="3436634972561795002">"таблет хүчÑÑÑ€ дахин аÑаах"</string>
+ <string name="permlab_reboot" product="default" msgid="2898560872462638242">"утÑыг хүчÑÑÑ€ дахин аÑаах"</string>
+ <string name="permdesc_reboot" product="tablet" msgid="8172056180063700741">"Ðпп нь таблетыг хүчÑÑÑ€ дахин аÑаах боломжтой."</string>
+ <string name="permdesc_reboot" product="default" msgid="5326008124289989969">"Ðпп нь утÑыг хүчÑÑÑ€ дахин аÑаах боломжтой."</string>
+ <string name="permlab_mount_unmount_filesystems" product="nosdcard" msgid="2927361537942591841">"USB Ñан файл ÑиÑтемд хандах"</string>
+ <string name="permlab_mount_unmount_filesystems" product="default" msgid="4402305049890953810">"SD карт файл ÑиÑтемд хандах"</string>
+ <string name="permdesc_mount_unmount_filesystems" msgid="1829290701658992347">"Ðпп нь Ñугалдаг Ñанг файл ÑиÑтемд залгах болон Ñалгах боломжтой."</string>
+ <string name="permlab_mount_format_filesystems" product="nosdcard" msgid="6227819582624904972">"USB Ñанг арилгах"</string>
+ <string name="permlab_mount_format_filesystems" product="default" msgid="262582698639274056">"SD картыг арилгах"</string>
+ <string name="permdesc_mount_format_filesystems" msgid="8784268246779198627">"Ðпп нь зөөврийн Ñанг форматлах боломжтой."</string>
+ <string name="permlab_asec_access" msgid="3411338632002193846">"дотоод Ñангийн мÑдÑÑллийг авах"</string>
+ <string name="permdesc_asec_access" msgid="3094563844593878548">"Ðпп нь дотоод ÑÐ°Ð½Ð³Ð°Ð°Ñ Ð¼ÑдÑÑллийг авах боломжтой"</string>
+ <string name="permlab_asec_create" msgid="6414757234789336327">"дотоод Ñанд Ò¯Ò¯ÑгÑÑ…"</string>
+ <string name="permdesc_asec_create" msgid="4558869273585856876">"Ðпп нь дотоод Ñан Ò¯Ò¯ÑгÑÑ… боломжтой."</string>
+ <string name="permlab_asec_destroy" msgid="526928328301618022">"дотоод ÑÐ°Ð½Ð³Ð°Ð°Ñ ÑƒÑтгах"</string>
+ <string name="permdesc_asec_destroy" msgid="7218749286145526537">"Ðпп нь дотоод ÑÐ°Ð½Ð³Ð°Ð°Ñ ÑƒÑтгах боломжтой."</string>
+ <string name="permlab_asec_mount_unmount" msgid="8877998101944999386">"дотоод Ñанг залгах/Ñалгах"</string>
+ <string name="permdesc_asec_mount_unmount" msgid="3451360114902490929">"Ðпп нь дотоод Ñанг залгах/Ñалгах боломжтой."</string>
+ <string name="permlab_asec_rename" msgid="7496633954080472417">"дотоод Ñангийн нÑрийг өөрчлөх"</string>
+ <string name="permdesc_asec_rename" msgid="1794757588472127675">"Ðпп нь дотоод Ñангийн нÑрийг өөрчлөх боломжтой."</string>
+ <string name="permlab_vibrate" msgid="7696427026057705834">"чичиргÑÑг удирдах"</string>
+ <string name="permdesc_vibrate" msgid="6284989245902300945">"Ðпп нь чичиргÑÑг удирдах боломжтой."</string>
+ <string name="permlab_flashlight" msgid="2155920810121984215">"гар чийдÑн удирдах"</string>
+ <string name="permdesc_flashlight" msgid="6522284794568368310">"Ðпп нь гар чийдÑнг удирдах боломжтой."</string>
+ <string name="permlab_manageUsb" msgid="1113453430645402723">"USB төхөөрөмжийн тохиргоо болон зөвшөөрлийг удирдах"</string>
+ <string name="permdesc_manageUsb" msgid="7776155430218239833">"Ðпп нь USB төхөөрөмжийн зөвшөөрөл болон тохируулгыг удирдах боломжтой."</string>
+ <string name="permlab_accessMtp" msgid="4953468676795917042">"MTP протоколыг гүйцÑтгÑÑ…"</string>
+ <string name="permdesc_accessMtp" msgid="6532961200486791570">"MTP USB протокол биелүүлÑÑ…ÑÑÑ€ MTP цөм драйверт хандах боломжтой."</string>
+ <string name="permlab_hardware_test" msgid="4148290860400659146">"хардвер теÑлÑÑ…"</string>
+ <string name="permdesc_hardware_test" msgid="6597964191208016605">"Ðпп нь хардверийг теÑтлÑÑ… зорилгоор олон төрлийн туÑлах төхөөрөмжийг удирдах боломжтой."</string>
+ <string name="permlab_callPhone" msgid="3925836347681847954">"утаÑны дугаарт шууд дуудлага хийх"</string>
+ <string name="permdesc_callPhone" msgid="3740797576113760827">"Ðпп нь таны оролцоогүйгÑÑÑ€ дуудлага хийх боломжтой. Ð­Ð½Ñ Ð½ÑŒ төлөвлөгдөөгүй төлбөрт оруулах ÑÑвÑл дуудлага хийнÑ. Ð­Ð½Ñ Ð½ÑŒ апп-г Ñаралтай дугаарт дуудлага хийхйг зөвшөөрөхгүй. Хортой апп нь таны зөвшөөрөлгүйгÑÑÑ€ дуудлага хийж таныг төлбөрт оруулж болзошгүй"</string>
+ <string name="permlab_callPrivileged" msgid="4198349211108497879">"дурны утаÑны дугаарт шууд дуудлага хийх"</string>
+ <string name="permdesc_callPrivileged" msgid="1689024901509996810">"Ðпп нь таны оролцоогүйгÑÑÑ€ Ñаралтай туÑламжийн дугааруудыг оруулаад Ñмарч дугаарлуу дуудлага хийх боломжтой. Хортой апп нь шаардлагагүй, хууль Ð±ÑƒÑ Ð´ÑƒÑƒÐ´Ð»Ð°Ð³Ñ‹Ð³ Ñаралтай туÑламжийн үйлчилгÑÑÑ€Ò¯Ò¯ хийж болзошгүй."</string>
+ <string name="permlab_performCdmaProvisioning" product="tablet" msgid="4842576994144604821">"CDMA таблет тохиргоог шууд ÑхлүүлÑÑ…"</string>
+ <string name="permlab_performCdmaProvisioning" product="default" msgid="5604848095315421425">"CDMA утаÑны тохиргоог шууд ÑхлүүлÑÑ…"</string>
+ <string name="permdesc_performCdmaProvisioning" msgid="1994193538802314186">"Ðпп нь CDMA провишныг ÑхлүүлÑÑ… боломжтой. Хортой апп нь шаардлагагүй байхад CDMA провишныг Ñхлүүлж болзошгүй."</string>
+ <string name="permlab_locationUpdates" msgid="7785408253364335740">"байршил шинÑчлÑÑ… мÑдÑгдлийг удирдах"</string>
+ <string name="permdesc_locationUpdates" msgid="1120741557891438876">"Ðпп нь Ñ€Ð°Ð´Ð¸Ð¾Ð³Ð¾Ð¾Ñ Ð¸Ñ€ÑÑн байршил шинÑчлÑÑ… мÑдÑгдлийг идÑвхтÑй/идÑвхгүй болгох боломжтой. Энгийн апп-д Ñ…ÑÑ€ÑглÑглÑхгүй."</string>
+ <string name="permlab_checkinProperties" msgid="7855259461268734914">"бүртгÑÑ… пропертид хандах"</string>
+ <string name="permdesc_checkinProperties" msgid="4024526968630194128">"Ðпп нь бүртгÑл үйлчилгÑÑгÑÑÑ€ байршуулагдÑан пропертиг унших/бичих боломжтой. Энгийн апп-д Ñ…ÑÑ€ÑглÑгдÑхгүй."</string>
+ <string name="permlab_bindGadget" msgid="776905339015863471">"виджет Ñонгох"</string>
+ <string name="permdesc_bindGadget" msgid="8261326938599049290">"Ðпп нь аль апп Ñмар виджетийг ашиглаж байгаа тухай ÑиÑтемд мÑдÑгдÑÑ… боломжтой. Ð­Ð½Ñ Ð·Ó©Ð²ÑˆÓ©Ó©Ñ€Ó©Ð»Ñ‚Ñй апп нь буÑад апп-д хувийн датад хандах Ñрхийг өгөх боломжтой. Энгийн апп-д ашиглагдахгүй."</string>
+ <string name="permlab_modifyPhoneState" msgid="8423923777659292228">"утаÑны ÑтатуÑыг өөрчлөх"</string>
+ <string name="permdesc_modifyPhoneState" msgid="1029877529007686732">"Ðпп-н төхөөрөмжийн утаÑны функцийг удирдах боломжтой. Ð­Ð½Ñ Ð·Ó©Ð²ÑˆÓ©Ó©Ñ€Ó©Ð»Ñ‚Ñй апп нь танд анхааруулахгүйгÑÑÑ€ ÑүлжÑÑг ÑÑлгÑÑ…, утаÑны радиог аÑаах, унтраах боломжтой."</string>
+ <string name="permlab_readPhoneState" msgid="9178228524507610486">"утаÑны ÑÑ‚Ð°Ñ‚ÑƒÑ Ð±Ð° таниулбарыг унших"</string>
+ <string name="permdesc_readPhoneState" msgid="1639212771826125528">"Ðпп нь төхөөрөмжийн утаÑны функцд хандах боломжтой. Ð­Ð½Ñ Ð·Ó©Ð²ÑˆÓ©Ó©Ñ€Ó©Ð» нь апп-д утаÑны дугаар болон төхөөрөмжийн ID-г, дуудлага идÑвхтÑй ÑÑÑÑ…, холын дугаар дуудлагаар холбогдÑон байгаа ÑÑÑхийг тогтоох боломжийг олгоно,"</string>
+ <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"таблетыг унтуулахгүй байлгах"</string>
+ <string name="permlab_wakeLock" product="default" msgid="573480187941496130">"утÑыг унтуулахгүй байлгах"</string>
+ <string name="permdesc_wakeLock" product="tablet" msgid="7311319824400447868">"Ðпп нь таблетыг ÑƒÐ½Ñ‚Ð°Ñ…Ð°Ð°Ñ ÑÑргийлÑÑ… боломжтой"</string>
+ <string name="permdesc_wakeLock" product="default" msgid="8559100677372928754">"Ðпп нь утÑыг ÑƒÐ½Ñ‚Ð°Ñ…Ð°Ð°Ñ ÑÑргийлÑÑ… боломжтой"</string>
+ <string name="permlab_devicePower" product="tablet" msgid="2787034722616350417">"таблетыг унтраах ÑÑвÑл аÑаах"</string>
+ <string name="permlab_devicePower" product="default" msgid="4928622470980943206">"утÑыг унтраах ÑÑвÑл аÑаах"</string>
+ <string name="permdesc_devicePower" product="tablet" msgid="6689862878984631831">"Ðпп нь таблетыг аÑаах, унтраах боломжтой."</string>
+ <string name="permdesc_devicePower" product="default" msgid="6037057348463131032">"Ðпп нь утÑыг аÑаах, унтраах боломжтой."</string>
+ <string name="permlab_factoryTest" msgid="3715225492696416187">"үйлдвÑрийн теÑÑ‚ горимд ажиллуулах"</string>
+ <string name="permdesc_factoryTest" product="tablet" msgid="3952059318359653091">"Доод төвшиний үйлдвÑрийн теÑтийг ажиллуулан таблетын хардверт бүрÑн хандах боломжтой. Таблет нь үйлдвÑрийн теÑтийн горимд ажиллах үед л боломжтой."</string>
+ <string name="permdesc_factoryTest" product="default" msgid="8136644990319244802">"Доод төвшиний үйлдвÑрийн теÑтийг ажиллуулан утаÑны хардверт бүрÑн хандах боломжтой. Ð£Ñ‚Ð°Ñ Ò¯Ð¹Ð»Ð´Ð²Ñрийн теÑтийн горимд ажиллах үед л боломжтой."</string>
+ <string name="permlab_setWallpaper" msgid="6627192333373465143">"ханын зургийг тохируулах"</string>
+ <string name="permdesc_setWallpaper" msgid="7373447920977624745">"Ðпп нь ÑиÑтемийн ханын зургийг тохируулах боломжтой."</string>
+ <string name="permlab_setWallpaperHints" msgid="3278608165977736538">"Таны ханын зурагны Ñ…ÑмжÑÑг тохируулах"</string>
+ <string name="permdesc_setWallpaperHints" msgid="8235784384223730091">"Ðпп нь ÑиÑтемийн ханын зургийн Ñ…ÑмжÑÑний Ñаналыг тохируулах боломжтой"</string>
+ <string name="permlab_masterClear" msgid="2315750423139697397">"ÑиÑтемийг үйлдвÑрийн үндÑÑн утгаар тохируулах"</string>
+ <string name="permdesc_masterClear" msgid="3665380492633910226">"Ðпп нь бүх датаг арилгах болон бүх ÑуулгаÑан апп-г арилган ÑиÑтемийг бүхÑлд үйлдвÑрийн тохиргоогоор бүрÑн тохируулах боломжтой"</string>
+ <string name="permlab_setTime" msgid="2021614829591775646">"цагийн тохиргоо"</string>
+ <string name="permdesc_setTime" product="tablet" msgid="1896341438151152881">"Ðпп нь таблетын цагийг Ñолих боломжтой."</string>
+ <string name="permdesc_setTime" product="default" msgid="1855702730738020">"Ðпп нь утаÑны цагийг Ñолих боломжтой."</string>
+ <string name="permlab_setTimeZone" msgid="2945079801013077340">"цагийн бүÑийн тохиргоо"</string>
+ <string name="permdesc_setTimeZone" product="tablet" msgid="1676983712315827645">"Ðпп нь таблетын цагийн бүÑийг Ñолих боломжтой."</string>
+ <string name="permdesc_setTimeZone" product="default" msgid="4499943488436633398">"Ðпп нь утаÑны цагийн бүÑийг өөрчлөх боломжтой."</string>
+ <string name="permlab_accountManagerService" msgid="4829262349691386986">"AccountManagerService болж ажиллах"</string>
+ <string name="permdesc_accountManagerService" msgid="1948455552333615954">"Ðпп нь Ðкаунт гÑрчлÑгчрүү дуудлага хийх боломжтой."</string>
+ <string name="permlab_getAccounts" msgid="1086795467760122114">"төхөөрөмж дÑÑрх акаунтыг олох"</string>
+ <string name="permdesc_getAccounts" product="tablet" msgid="2741496534769660027">"Ðпп нь таблетÑд мÑдÑгдÑж байгаа акаунтын жагÑаалтыг авах боломжтой. Энд таны ÑуулгаÑан аппликешнүүдийн Ò¯Ò¯ÑгÑÑÑн бүх акаунтууд хамрагдана."</string>
+ <string name="permdesc_getAccounts" product="default" msgid="3448316822451807382">"Ðпп нь утÑанд мÑдÑгдÑж байгаа акаунтын жагÑаалтыг авах боломжтой. Энд таны ÑуулгаÑан аппликешнүүдийн Ò¯Ò¯ÑгÑÑÑн бүх акаунтууд хамрагдана."</string>
+ <string name="permlab_authenticateAccounts" msgid="5265908481172736933">"акаунт Ò¯Ò¯ÑгÑÑ… болон нууц үг тохируулах"</string>
+ <string name="permdesc_authenticateAccounts" msgid="5472124296908977260">"Ðпп нь акаунт Ò¯Ò¯ÑгÑÑ…, Ñ‚ÑдгÑÑрийн нууц үгийг тохируулах зÑÑ€Ñг акаунт удирдагчийн акаунт гÑрчлÑгчийн функцийг ашиглах боломжтой."</string>
+ <string name="permlab_manageAccounts" msgid="4983126304757177305">"акаунт нÑмÑÑ… ÑÑвÑл хаÑах"</string>
+ <string name="permdesc_manageAccounts" msgid="8698295625488292506">"Ðпп нь акаунт нÑмÑÑ…, уÑтгах ба Ñ‚Ñдний нууц үгийг уÑтгах зÑÑ€Ñг үйлдлийг гүйцÑтгÑÑ… боломжтой."</string>
+ <string name="permlab_useCredentials" msgid="235481396163877642">"төхөөрөмж дÑÑрх акаунтыг ашиглах"</string>
+ <string name="permdesc_useCredentials" msgid="7984227147403346422">"Ðпп нь гÑрчлÑлийн бүтвÑрийг Ñ…Ò¯ÑÑÑ… боломжтой."</string>
+ <string name="permlab_accessNetworkState" msgid="4951027964348974773">"ÑүлжÑÑний холболтыг үзÑÑ…"</string>
+ <string name="permdesc_accessNetworkState" msgid="8318964424675960975">"Ðпп нь ÑүлжÑÑ Ð±Ð°Ð¹Ð³Ð°Ð° болон холбогдÑон ÑÑÑÑ… зÑÑ€Ñг ÑүлжÑÑний холболтын талаарх мÑдÑÑллийг харах боломжтой."</string>
+ <string name="permlab_createNetworkSockets" msgid="8018758136404323658">"ÑүлжÑÑнд бүрÑн хандах"</string>
+ <string name="permdesc_createNetworkSockets" msgid="3403062187779724185">"Ðпп нь ÑүлжÑÑний Ñокетыг Ò¯Ò¯ÑгÑÑ… болон туÑгай ÑүлжÑÑний протокол ашиглах боломжтой. Хөтөч болон буÑад аппликешнүүд ИнтернетÑÑÑ€ дата илгÑÑÑ… боломжтой тул ÑÐ½Ñ Ð·Ó©Ð²ÑˆÓ©Ó©Ñ€Ó©Ð» нь ИнтернетÑÑÑ€ дата илгÑÑÑ…Ñд шаардлагагүй."</string>
+ <string name="permlab_writeApnSettings" msgid="505660159675751896">"ÑүлжÑÑний тохиргоо болон урÑгалыг Ñолих/таÑлах"</string>
+ <string name="permdesc_writeApnSettings" msgid="5333798886412714193">"Ðпп нь ÑүлжÑÑний тохиргоог Ñолих болон ÑүлжÑÑний бүх урÑгалыг APN-н прокÑи болон портыг Ñолих замаар таÑлах, Ñ…Ñнах боломжтой. Хортой апп нь танд мÑдÑгдÑлгүйгÑÑÑ€ ÑүлжÑÑний пакетыг Ñ…Ñнах, дахин чиглүүлÑÑ… болон өөрчлөх боломжтой."</string>
+ <string name="permlab_changeNetworkState" msgid="958884291454327309">"ÑүлжÑÑний холболтыг Ñолих"</string>
+ <string name="permdesc_changeNetworkState" msgid="6789123912476416214">"Ðпп нь ÑүлжÑÑний холболтын ÑтатуÑыг Ñолих боломжтой."</string>
+ <string name="permlab_changeTetherState" msgid="5952584964373017960">"модем болгоÑон холболтыг Ñолих"</string>
+ <string name="permdesc_changeTetherState" msgid="1524441344412319780">"Ðпп нь холбогдÑон ÑүлжÑÑний холболтын ÑтатуÑыг Ñолих боломжтой."</string>
+ <string name="permlab_changeBackgroundDataSetting" msgid="1400666012671648741">"арын дата ашиглалтын тохиргоог Ñолих"</string>
+ <string name="permdesc_changeBackgroundDataSetting" msgid="5347729578468744379">"Ðпп нь арын дата Ñ…ÑÑ€ÑглÑÑний тохиргоог Ñолих боломжтой."</string>
+ <string name="permlab_accessWifiState" msgid="5202012949247040011">"Wi-Fi холболтыг үзÑÑ…"</string>
+ <string name="permdesc_accessWifiState" msgid="5002798077387803726">"Ðпп нь Wi-Fi идÑвхтÑй ÑÑÑÑ… болон холбогдÑон Wi-Fi төхөөрөмжийн нÑÑ€ зÑÑ€Ñг Wi-Fi ÑүлжÑÑний талаарх мÑдÑÑллийг харах боломжтой."</string>
+ <string name="permlab_changeWifiState" msgid="6550641188749128035">"Wi-Fi -тай холбогдох болон Ñалах"</string>
+ <string name="permdesc_changeWifiState" msgid="7137950297386127533">"Ðпп нь Wi-Fi холболтын цÑгтÑй холбогдох буюу Ñалах боломжтой ба тохируулÑан Wi-Fi ÑүлжÑÑнд өөрчлөлт хийх боломжтой."</string>
+ <string name="permlab_changeWifiMulticastState" msgid="1368253871483254784">"Wi-Fi олон дамжуулалт хүлÑÑн авахыг зөвшөөрөх"</string>
+ <string name="permdesc_changeWifiMulticastState" product="tablet" msgid="7969774021256336548">"Ðпп нь олон дамжуулал ашиглан Wi-Fi ÑүлжÑÑн дÑÑ… бүх төхөөрөмжрүү пакет илгÑÑÑ… болон хүлÑÑн авах боломжтой. Ð­Ð½Ñ Ð½ÑŒ олон дамжуулал ашиглахгүй Ð³Ð¾Ñ€Ð¸Ð¼Ð¾Ð¾Ñ Ð¸Ð»Ò¯Ò¯ их Ñ‚ÑжÑÑл зарцуулна."</string>
+ <string name="permdesc_changeWifiMulticastState" product="default" msgid="6851949706025349926">"Ðпп нь олон дамжуулал ашиглан Wi-Fi ÑүлжÑÑн дÑÑ… бүх төхөөрөмжрүү пакет илгÑÑÑ… болон хүлÑÑн авах боломжтой. Ð­Ð½Ñ Ð½ÑŒ олон дамжуулал ашиглахгүй Ð³Ð¾Ñ€Ð¸Ð¼Ð¾Ð¾Ñ Ð¸Ð»Ò¯Ò¯ их Ñ‚ÑжÑÑл зарцуулна."</string>
+ <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"Блютүүт тохиргоонд хандах"</string>
+ <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Ðпп нь дотоод блютүүт таблетын тохиргоог харах боломжтой ба Ñ…Ð¾Ñ Ð±Ð¾Ð»Ð¾Ñ… төхөөрөмжтÑй холболтыг зөвшөөрөх болон хийх боломжтой"</string>
+ <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Ðпп нь утаÑны дотоод блютүүтыг тохируулах боломжтой ба гадаад төхөөрөмжийг олох болон Ñ…Ð¾Ñ Ò¯Ò¯ÑгÑÑ… боломжтой."</string>
+ <string name="permlab_accessWimaxState" msgid="4195907010610205703">"WiMAX-д холбогдох болон Ñалах"</string>
+ <string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Ðпп нь WiMAX идÑвхтÑй ÑÑÑÑ… болон холбогдÑон WiMAX ÑүлжÑÑний талаар мÑдÑÑллийг тодорхойлох боломжтой."</string>
+ <string name="permlab_changeWimaxState" msgid="2405042267131496579">"WiMAX ÑтатуÑыг өөрчлөх"</string>
+ <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"Ðпп нь WiMAX ÑүлжÑÑнд таблетыг холбох болон Ñалгах боломжтой."</string>
+ <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"Ðпп нь WiMAX ÑүлжÑÑнд утÑыг холбох болон Ñалгах боломжтой."</string>
+ <string name="permlab_bluetooth" msgid="6127769336339276828">"Блютүүт төхөөрөмжтÑй Ñ…Ð¾Ñ Ò¯Ò¯ÑгÑÑ…"</string>
+ <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"Ðпп нь таблет дÑÑрх блютүүт тохиргоог харах боломжтой ба Ñ…Ð¾Ñ Ð±Ð¾Ð»Ð¾Ñ… төхөөрөмжтÑй холболтыг зөвшөөрөх болон хийх боломжтой."</string>
+ <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"Ðпп нь утÑан дÑÑрх Блютүүт тохиргоог харах боломжтой ба Ñ…Ð¾Ñ Ð±Ð¾Ð»Ð¾Ñ… төхөөрөмжтÑй холболтыг зөвшөөрөх болон хийх боломжтой."</string>
+ <string name="permlab_nfc" msgid="4423351274757876953">"ойролцоо талбарын холбоог удирдах"</string>
+ <string name="permdesc_nfc" msgid="7120611819401789907">"Ðпп нь Ойролцоо Талбарын Холболт(NFC) таг, карт, болон уншигчтай холбогдох боломжтой."</string>
+ <string name="permlab_disableKeyguard" msgid="3598496301486439258">"дÑлгÑцний түгжÑÑг идÑвхгүй болгох"</string>
+ <string name="permdesc_disableKeyguard" msgid="6034203065077122992">"Ðпп нь түгжÑÑ Ð±Ð¾Ð»Ð¾Ð½ буÑад холбоотой нууц үгийн аюулгүй байдлыг идÑвхгүй болгох боломжтой. ЖишÑÑ Ð½ÑŒ бол ÑƒÑ‚Ð°Ñ Ð½ÑŒ дуудлага ирÑÑ… үед түгжÑÑг идÑвхгүй болгох ба дуудлага дууÑахад буцаан идÑвхтÑй болгодог."</string>
+ <string name="permlab_readSyncSettings" msgid="6201810008230503052">"Ñинк тохиргоог унших"</string>
+ <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Ðпп нь акаунтын Ñинк тохиргоог унших боломжтой. ЖишÑÑ Ð½ÑŒ ÑÐ½Ñ Ð½ÑŒ Ð¥Ò¯Ð¼Ò¯Ò¯Ñ Ð°Ð¿Ð¿ акаунттай Ñинк хийгдÑÑн ÑÑÑхийг тодорхойлох боломжтой."</string>
+ <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"Ñинкийг унтрааж аÑаах тохиргоо"</string>
+ <string name="permdesc_writeSyncSettings" msgid="8956262591306369868">"Ðпп нь акаунтын Ñинк тохиргоог өөрчлөх боломжтой. ЖишÑÑ Ð½ÑŒ ÑÐ½Ñ Ð½ÑŒ Ð¥Ò¯Ð¼Ò¯Ò¯Ñ Ð°Ð¿Ð¿ акаунттай Ñинк хийхийг идÑвхжүүлÑÑ… боломжтой."</string>
+ <string name="permlab_readSyncStats" msgid="7396577451360202448">"Ñинк ÑтатиÑтикийг унших"</string>
+ <string name="permdesc_readSyncStats" msgid="1510143761757606156">"Ðпп нь Ñинк үйлдÑлийн түүх болон Ñ…ÑÑ€ их дата Ñинк хийгдÑÑн зÑÑ€Ñг акаунтын Ñинк ÑтатуÑыг унших боломжтой."</string>
+ <string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"бүртгүүлÑÑн хангамжийг унших"</string>
+ <string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"Ðпп нь одоогийн Ñинк хийгдÑÑн хангамжийн талаарх мÑдÑÑллийг авах боломжтой."</string>
+ <string name="permlab_subscribedFeedsWrite" msgid="9015246325408209296">"бүртгүүлÑÑн хангамжруу бичих"</string>
+ <string name="permdesc_subscribedFeedsWrite" msgid="6928930188826089413">"Ðпп нь таны одоогийн Ñинк хийгдÑÑн хангамжийг өөрчлөх боломжтой. Хортой апп нь таны Ñинк хийгдÑÑн хангамжийг өөрчлөх боломжтой."</string>
+ <string name="permlab_readDictionary" msgid="4107101525746035718">"таны толь бичигт нÑмÑÑн нөхцөлийг унших"</string>
+ <string name="permdesc_readDictionary" msgid="659614600338904243">"Ðпп нь Ñ…ÑÑ€ÑглÑгч Ñ…ÑÑ€ÑглÑгчийн толь бичигт хадгалÑан бүх үгÑ, нÑÑ€Ñ Ð±Ð¾Ð»Ð¾Ð½ Ñ…Ñлцийг унших боломжтой."</string>
+ <string name="permlab_writeDictionary" msgid="2183110402314441106">"Ñ…ÑÑ€ÑглÑгчийн толь бичигт Ò¯Ð³Ñ Ð½ÑмÑÑ…"</string>
+ <string name="permdesc_writeDictionary" msgid="8185385716255065291">"Ðпп нь Ñ…ÑÑ€ÑглÑгчийн толь бичигт ÑˆÐ¸Ð½Ñ Ò¯Ð³ бичих боломжтой."</string>
+ <string name="permlab_sdcardRead" product="nosdcard" msgid="8235341515605559677">"хамгаалагдÑан Ñанд хандах теÑÑ‚ хийх"</string>
+ <string name="permlab_sdcardRead" product="default" msgid="8235341515605559677">"хамгаалагдÑан Ñанд хандах теÑÑ‚ хийх"</string>
+ <string name="permdesc_sdcardRead" product="nosdcard" msgid="3642473292348132072">"Ðпп нь дараагийн төхөөрөмжүүдÑд ашиглах боломжтой болох SD карт зөвшөөрлийг теÑтлÑÑ… боломжтой."</string>
+ <string name="permdesc_sdcardRead" product="default" msgid="5914402684685848828">"Ðпп нь дараагийн төхөөрөмжүүдÑд ашиглах боломжтой болох SD карт Ñрхийг теÑтлÑÑ… боломжтой."</string>
+ <string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"USB Ñангийн контентыг өөрчлөх ÑÑвÑл уÑтгах"</string>
+ <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"SD картны контентыг өөрчлөх болон уÑтгах"</string>
+ <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"Ðпп нь USB Ñанруу бичих боломжтой."</string>
+ <string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Ðпп нь SD картруу бичих боломжтой."</string>
+ <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"дотоод медиа Ñангийн контентыг өөрчлөх/уÑтгах"</string>
+ <string name="permdesc_mediaStorageWrite" product="default" msgid="8189160597698529185">"Ðпп нь дотоод медиа Ñангийн контентыг өөрчлөх боломжтой."</string>
+ <string name="permlab_manageDocs" product="default" msgid="5778318598448849829">"документ Ñанг удирдах"</string>
+ <string name="permdesc_manageDocs" product="default" msgid="8704323176914121484">"Ðпп нь документ Ñанг удирдах боломжтой."</string>
+ <string name="permlab_sdcardAccessAll" msgid="8150613823900460576">"бүх Ñ…ÑÑ€ÑглÑгчдийн гадаар Ñанд хандах"</string>
+ <string name="permdesc_sdcardAccessAll" msgid="3215208357415891320">"Ðпп нь бүх Ñ…ÑÑ€ÑглÑгчдийн гадаад Ñанд хандах боломжтой."</string>
+ <string name="permlab_cache_filesystem" msgid="5656487264819669824">"кеш файлÑиÑтемд хандах"</string>
+ <string name="permdesc_cache_filesystem" msgid="5578967642265550955">"Ðпп нь кеш файлÑиÑтемийг унших бичих боломжтой."</string>
+ <string name="permlab_use_sip" msgid="5986952362795870502">"Интернет дуудлага хийх/хүлÑÑн авах"</string>
+ <string name="permdesc_use_sip" msgid="4717632000062674294">"Ðпп нь Интернет дуудлага хийх/хүлÑÑн авахын тулд SIP үйлчилгÑÑг ашиглах боломжтой."</string>
+ <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"ÑүлжÑÑний ашиглалтын түүхийг унших"</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"Ðпп нь туÑгай ÑүлжÑÑ Ð±Ð¾Ð»Ð¾Ð½ апп-н ÑүлжÑÑ Ð°ÑˆÐ¸Ð³Ð»Ð°Ð»Ñ‚Ñ‹Ð½ түүхийг унших боломжтой."</string>
+ <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"ÑүлжÑÑний бодлогыг удирдах"</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"Ðпп нь ÑүлжÑÑний бодлогыг удирдах болон апп-д зориулÑан дүрмийг тогтоох боломжтой."</string>
+ <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"ÑүлжÑÑний Ñ…ÑÑ€ÑглÑÑний тайланг өөрчлөх"</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"Ðпп нь апп-уудын ÑүлжÑÑ Ð°ÑˆÐ¸Ð³Ð»Ð°Ð»Ñ‚Ñ‹Ð½ талаарх тооцоог өөрчлөх боломжтой. Энгийн апп-д ашиглагдахгүй."</string>
+ <string name="permlab_markNetworkSocket" msgid="3658527214914959749">"Ñоккетын Ñ‚Ñмдгүүдийг өөрчлөх"</string>
+ <string name="permdesc_markNetworkSocket" msgid="7655568433696356578">"Ðпп-д чиглÑлийн Ñоккетын Ñ‚Ñмдгийг өөрчлөх боломж олгоно"</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"мÑдÑгдÑлд хандах"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"Ðпп нь буÑад апп-уудын илгÑÑÑÑн мÑдÑгдлүүдийг дуудах, шалгах, болон цÑвÑрлÑÑ… боломжтой."</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"мÑдÑгдÑл ÑонÑогч үйлчилгÑÑÑ‚Ñй холбох"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"ЭзÑмшигч нь мÑдÑгдÑл ÑонÑох үйлчилгÑÑний дÑÑд-төвшиний интерфейÑÑ‚Ñй холбох боломжтой. Энгийн апп-д шаардлагагүй."</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"үүрÑн компанийн нийлүүлÑÑн тохируулгын апп-г өдөөх"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"ЭзÑмшигчид үүрÑн компанийн нийлүүлÑÑн тохируулах апп-г өдөөх боломж олгоно. Энгийн апп-уудад Ñ…ÑзÑÑ Ñ‡ ашиглагдахгүй."</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"СүлжÑÑний байдлын талаар ажиглалтуудыг хүлÑÑн авах"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"Ðппликешнд ÑүлжÑÑний байдлын талаар ажиглалтуудыг хүлÑÑн авахыг зөвшөөрнө. Энгийн апп-уудад Ñ…ÑзÑÑ Ñ‡ ашиглагдахгүй."</string>
+ <string name="policylab_limitPassword" msgid="4497420728857585791">"Ðууц үгний дүрмийг тохируулах"</string>
+ <string name="policydesc_limitPassword" msgid="3252114203919510394">"ДÑлгÑц түгжих нууц үгÑнд зөвшөөрөгдÑөн Ñ‚ÑмдÑгт болон уртыг удирдах"</string>
+ <string name="policylab_watchLogin" msgid="914130646942199503">"ДÑлгÑц тайлах оролдлогыг Ñ…Ñнах"</string>
+ <string name="policydesc_watchLogin" product="tablet" msgid="3215729294215070072">"ДÑлгÑц түгжигдÑÑн үед нууц үг буруу оруулалтын тоог Ñ…Ñнах ба Ñ…ÑÑ€Ñв Ñ…ÑÑ‚ олон удаа нууц үгийг буруу оруулбал таблетыг түгжих болон таблетын бүх датаг арилгана"</string>
+ <string name="policydesc_watchLogin" product="default" msgid="5712323091846761073">"ДÑлгÑц түгжигдÑÑн үед нууц үг буруу оруулалтын тоог Ñ…Ñнах, ба Ñ…ÑÑ€Ñв Ñ…ÑÑ‚ олон удаа нууц үгийг буруу оруулбал утÑыг түгжих болон утаÑны бүх датаг арилгана"</string>
+ <string name="policylab_resetPassword" msgid="2620077191242688955">"ДÑлгÑц түгжих нууц үгийг Ñолих"</string>
+ <string name="policydesc_resetPassword" msgid="605963962301904458">"ДÑлгÑц түгжих нууц үгийг Ñолих"</string>
+ <string name="policylab_forceLock" msgid="2274085384704248431">"ДÑлгÑц түгжих"</string>
+ <string name="policydesc_forceLock" msgid="1141797588403827138">"ДÑлгÑц Ñ…ÑзÑÑ Ñаж түгжихийг удирдах"</string>
+ <string name="policylab_wipeData" msgid="3910545446758639713">"Бүх датаг арилгах"</string>
+ <string name="policydesc_wipeData" product="tablet" msgid="4306184096067756876">"ҮйлдвÑрийн дата утгыг өгÑөнөөр таблетын дата шууд арилгагдана."</string>
+ <string name="policydesc_wipeData" product="default" msgid="5096895604574188391">"ҮйлдвÑрийн дата утгыг өгÑөнөөр утаÑны дата шууд арилгагдана."</string>
+ <string name="policylab_setGlobalProxy" msgid="2784828293747791446">"Төхөрөөмжийн глобал прокÑиг тохируулах"</string>
+ <string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"Бодлого идÑвхтÑй үед төхөөрөмжийн глобал прокÑиг ашиглахаар тохируулÑан. Зөвхөн Ñхний төхөөрөмжийн админ л үр дүнтÑй глобал прокÑиг тохируулна."</string>
+ <string name="policylab_expirePassword" msgid="885279151847254056">"ДÑлгÑц түгжих нууц үгний хүчинтÑй хугацааг тохируулах"</string>
+ <string name="policydesc_expirePassword" msgid="1729725226314691591">"ДÑлгÑцний түгжих нууц үг Ñ…ÑÑ€ давтамжтай Ñолигдохыг удирдах."</string>
+ <string name="policylab_encryptedStorage" msgid="8901326199909132915">"Сангийн шифрлÑхийг тохируулах"</string>
+ <string name="policydesc_encryptedStorage" msgid="2637732115325316992">"ХадгалагдÑан апп дата шифрлÑгдÑÑ… шаардлагатай"</string>
+ <string name="policylab_disableCamera" msgid="6395301023152297826">"Камер идÑвхгүй болгох"</string>
+ <string name="policydesc_disableCamera" msgid="2306349042834754597">"Төхөөрөмжийн бүх камерийг ашиглахгүй."</string>
+ <string name="policylab_disableKeyguardFeatures" msgid="266329104542638802">"Түлхүүр хамгаалтын функцийг унтраах"</string>
+ <string name="policydesc_disableKeyguardFeatures" msgid="3467082272186534614">"Түлхүүр хамгаалалтын зарим функцийг ашиглахыг хориглох."</string>
+ <string-array name="phoneTypes">
+ <item msgid="8901098336658710359">"ГÑрийн"</item>
+ <item msgid="869923650527136615">"Мобайл"</item>
+ <item msgid="7897544654242874543">"Ðжлын"</item>
+ <item msgid="1103601433382158155">"Ðжлын факÑ"</item>
+ <item msgid="1735177144948329370">"ГÑрийн ФакÑ"</item>
+ <item msgid="603878674477207394">"ПÑйжер"</item>
+ <item msgid="1650824275177931637">"БуÑад"</item>
+ <item msgid="9192514806975898961">"ТуÑгай"</item>
+ </string-array>
+ <string-array name="emailAddressTypes">
+ <item msgid="8073994352956129127">"ГÑрийн"</item>
+ <item msgid="7084237356602625604">"Ðжлын"</item>
+ <item msgid="1112044410659011023">"БуÑад"</item>
+ <item msgid="2374913952870110618">"ТуÑгай"</item>
+ </string-array>
+ <string-array name="postalAddressTypes">
+ <item msgid="6880257626740047286">"ГÑрийн"</item>
+ <item msgid="5629153956045109251">"Ðжлын"</item>
+ <item msgid="4966604264500343469">"БуÑад"</item>
+ <item msgid="4932682847595299369">"ТуÑгай"</item>
+ </string-array>
+ <string-array name="imAddressTypes">
+ <item msgid="1738585194601476694">"ГÑрийн"</item>
+ <item msgid="1359644565647383708">"Ðжлын"</item>
+ <item msgid="7868549401053615677">"БуÑад"</item>
+ <item msgid="3145118944639869809">"ТуÑгай"</item>
+ </string-array>
+ <string-array name="organizationTypes">
+ <item msgid="7546335612189115615">"Ðжлын"</item>
+ <item msgid="4378074129049520373">"БуÑад"</item>
+ <item msgid="3455047468583965104">"ТуÑгай"</item>
+ </string-array>
+ <string-array name="imProtocols">
+ <item msgid="8595261363518459565">"AIM"</item>
+ <item msgid="7390473628275490700">"Windows Live"</item>
+ <item msgid="7882877134931458217">"Yahoo"</item>
+ <item msgid="5035376313200585242">"Skype"</item>
+ <item msgid="7532363178459444943">"QQ"</item>
+ <item msgid="3713441034299660749">"Google Talk"</item>
+ <item msgid="2506857312718630823">"ICQ"</item>
+ <item msgid="1648797903785279353">"Jabber"</item>
+ </string-array>
+ <string name="phoneTypeCustom" msgid="1644738059053355820">"ТуÑгай"</string>
+ <string name="phoneTypeHome" msgid="2570923463033985887">"ГÑрийн"</string>
+ <string name="phoneTypeMobile" msgid="6501463557754751037">"Мобайл"</string>
+ <string name="phoneTypeWork" msgid="8863939667059911633">"Ðжлын"</string>
+ <string name="phoneTypeFaxWork" msgid="3517792160008890912">"Ðжлын факÑ"</string>
+ <string name="phoneTypeFaxHome" msgid="2067265972322971467">"ГÑрийн ФакÑ"</string>
+ <string name="phoneTypePager" msgid="7582359955394921732">"ПÑйжер"</string>
+ <string name="phoneTypeOther" msgid="1544425847868765990">"БуÑад"</string>
+ <string name="phoneTypeCallback" msgid="2712175203065678206">"Буцаж холбоо барих"</string>
+ <string name="phoneTypeCar" msgid="8738360689616716982">"Машин"</string>
+ <string name="phoneTypeCompanyMain" msgid="540434356461478916">"Байгууллагын үндÑÑн"</string>
+ <string name="phoneTypeIsdn" msgid="8022453193171370337">"ISDN"</string>
+ <string name="phoneTypeMain" msgid="6766137010628326916">"ҮндÑÑн"</string>
+ <string name="phoneTypeOtherFax" msgid="8587657145072446565">"БуÑад факÑ"</string>
+ <string name="phoneTypeRadio" msgid="4093738079908667513">"Радио"</string>
+ <string name="phoneTypeTelex" msgid="3367879952476250512">"TелекÑ"</string>
+ <string name="phoneTypeTtyTdd" msgid="8606514378585000044">"TTY TDD"</string>
+ <string name="phoneTypeWorkMobile" msgid="1311426989184065709">"Ðжлын утаÑ"</string>
+ <string name="phoneTypeWorkPager" msgid="649938731231157056">"Ðжлын пейжер"</string>
+ <string name="phoneTypeAssistant" msgid="5596772636128562884">"ТуÑлагч"</string>
+ <string name="phoneTypeMms" msgid="7254492275502768992">"MMS"</string>
+ <string name="eventTypeCustom" msgid="7837586198458073404">"ТуÑгай"</string>
+ <string name="eventTypeBirthday" msgid="2813379844211390740">"ТөрÑөн огноо"</string>
+ <string name="eventTypeAnniversary" msgid="3876779744518284000">"ТүүхÑн ой"</string>
+ <string name="eventTypeOther" msgid="7388178939010143077">"БуÑад"</string>
+ <string name="emailTypeCustom" msgid="8525960257804213846">"ТуÑгай"</string>
+ <string name="emailTypeHome" msgid="449227236140433919">"ГÑрийн"</string>
+ <string name="emailTypeWork" msgid="3548058059601149973">"Ðжлын"</string>
+ <string name="emailTypeOther" msgid="2923008695272639549">"БуÑад"</string>
+ <string name="emailTypeMobile" msgid="119919005321166205">"Мобайл"</string>
+ <string name="postalTypeCustom" msgid="8903206903060479902">"ТуÑгай"</string>
+ <string name="postalTypeHome" msgid="8165756977184483097">"ГÑрийн"</string>
+ <string name="postalTypeWork" msgid="5268172772387694495">"Ðжлын"</string>
+ <string name="postalTypeOther" msgid="2726111966623584341">"БуÑад"</string>
+ <string name="imTypeCustom" msgid="2074028755527826046">"ТуÑгай"</string>
+ <string name="imTypeHome" msgid="6241181032954263892">"ГÑрийн"</string>
+ <string name="imTypeWork" msgid="1371489290242433090">"Ðжлын"</string>
+ <string name="imTypeOther" msgid="5377007495735915478">"БуÑад"</string>
+ <string name="imProtocolCustom" msgid="6919453836618749992">"ТуÑгай"</string>
+ <string name="imProtocolAim" msgid="7050360612368383417">"AIM"</string>
+ <string name="imProtocolMsn" msgid="144556545420769442">"Windows Live"</string>
+ <string name="imProtocolYahoo" msgid="8271439408469021273">"Yahoo"</string>
+ <string name="imProtocolSkype" msgid="9019296744622832951">"Skype"</string>
+ <string name="imProtocolQq" msgid="8887484379494111884">"QQ"</string>
+ <string name="imProtocolGoogleTalk" msgid="493902321140277304">"Цугларалт"</string>
+ <string name="imProtocolIcq" msgid="1574870433606517315">"ICQ"</string>
+ <string name="imProtocolJabber" msgid="2279917630875771722">"Jabber"</string>
+ <string name="imProtocolNetMeeting" msgid="8287625655986827971">"NetMeeting"</string>
+ <string name="orgTypeWork" msgid="29268870505363872">"Ðжлын"</string>
+ <string name="orgTypeOther" msgid="3951781131570124082">"БуÑад"</string>
+ <string name="orgTypeCustom" msgid="225523415372088322">"ТуÑгай"</string>
+ <string name="relationTypeCustom" msgid="3542403679827297300">"ТуÑгай"</string>
+ <string name="relationTypeAssistant" msgid="6274334825195379076">"ТуÑлагч"</string>
+ <string name="relationTypeBrother" msgid="8757913506784067713">"ÐÑ…"</string>
+ <string name="relationTypeChild" msgid="1890746277276881626">"ХүүхÑд"</string>
+ <string name="relationTypeDomesticPartner" msgid="6904807112121122133">"Дотоод Түнш"</string>
+ <string name="relationTypeFather" msgid="5228034687082050725">"ЭцÑг"</string>
+ <string name="relationTypeFriend" msgid="7313106762483391262">"Ðайз"</string>
+ <string name="relationTypeManager" msgid="6365677861610137895">"Менежер"</string>
+ <string name="relationTypeMother" msgid="4578571352962758304">"Эх"</string>
+ <string name="relationTypeParent" msgid="4755635567562925226">"ЭцÑг ÑÑ…"</string>
+ <string name="relationTypePartner" msgid="7266490285120262781">"Түнш"</string>
+ <string name="relationTypeReferredBy" msgid="101573059844135524">"ДурдагдÑан"</string>
+ <string name="relationTypeRelative" msgid="1799819930085610271">"Хамаатан"</string>
+ <string name="relationTypeSister" msgid="1735983554479076481">"Эгч"</string>
+ <string name="relationTypeSpouse" msgid="394136939428698117">"Хань"</string>
+ <string name="sipAddressTypeCustom" msgid="2473580593111590945">"ТуÑгай"</string>
+ <string name="sipAddressTypeHome" msgid="6093598181069359295">"ГÑрийн"</string>
+ <string name="sipAddressTypeWork" msgid="6920725730797099047">"Ðжлын"</string>
+ <string name="sipAddressTypeOther" msgid="4408436162950119849">"БуÑад"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"PIN кодыг Ð±Ð¸Ñ‡Ð½Ñ Ò¯Ò¯"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"PUK-г бичÑÑд ÑˆÐ¸Ð½Ñ PIN код оруулна уу"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"PUK код"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"Ð¨Ð¸Ð½Ñ PIN код"</string>
+ <string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"Ðууц үг бичих бол Ñ…Ò¯Ñ€Ð½Ñ Ò¯Ò¯"</font></string>
+ <string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Тайлах нууц үгийг Ð±Ð¸Ñ‡Ð½Ñ Ò¯Ò¯"</string>
+ <string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Тайлах PIN-г оруулна уу"</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"Буруу PIN код."</string>
+ <string name="keyguard_label_text" msgid="861796461028298424">"Тайлах бол ЦÑÑийг дараад 0."</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"Яаралтай дугаар"</string>
+ <string name="lockscreen_carrier_default" msgid="8963839242565653192">"ҮйлчилгÑÑ Ð±Ð°Ð¹Ñ…Ð³Ò¯Ð¹."</string>
+ <string name="lockscreen_screen_locked" msgid="7288443074806832904">"ДÑлгÑц түгжигдÑÑн."</string>
+ <string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Яаралтай дуудлага хийх буюу ÑÑвÑл түгжÑÑг тайлах бол цÑÑийг дарна уу."</string>
+ <string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Тайлах бол цÑÑийг дарна уу."</string>
+ <string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"Тайлах Ñ…ÑÑгÑÑ Ð·ÑƒÑ€Ð½Ð° уу"</string>
+ <string name="lockscreen_emergency_call" msgid="5347633784401285225">"Яаралтай дуудлага"</string>
+ <string name="lockscreen_return_to_call" msgid="5244259785500040021">"Дуудлагаруу буцах"</string>
+ <string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Зөв!"</string>
+ <string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"Дахин оролдох"</string>
+ <string name="lockscreen_password_wrong" msgid="5737815393253165301">"Дахин оролдох"</string>
+ <string name="faceunlock_multiple_failures" msgid="754137583022792429">"ÐүүрÑÑÑ€ түгжÑÑ Ñ‚Ð°Ð¹Ð»Ð°Ñ… оролдлогын тоо дÑÑд Ñ…ÑмжÑÑнÑÑÑ Ñ…ÑÑ‚ÑÑ€ÑÑн"</string>
+ <string name="lockscreen_plugged_in" msgid="8057762828355572315">"ЦÑнÑглÑж байна, <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+ <string name="lockscreen_charged" msgid="321635745684060624">"ЦÑнÑглÑгдÑв"</string>
+ <string name="lockscreen_battery_short" msgid="4477264849386850266">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+ <string name="lockscreen_low_battery" msgid="1482873981919249740">"ЦÑнÑглÑгчÑÑ Ñ…Ð¾Ð»Ð±Ð¾Ð½Ð¾ уу."</string>
+ <string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"SIM карт байхгүй"</string>
+ <string name="lockscreen_missing_sim_message" product="tablet" msgid="151659196095791474">"Таблет SIM картгүй."</string>
+ <string name="lockscreen_missing_sim_message" product="default" msgid="2186920585695169078">"УтÑанд SIM карт байхгүй."</string>
+ <string name="lockscreen_missing_sim_instructions" msgid="5372787138023272615">"SIM картыг оруулна уу."</string>
+ <string name="lockscreen_missing_sim_instructions_long" msgid="3526573099019319472">"SIM карт байхгүй ÑÑвÑл унших боломжгүй. SIM карт оруулна уу."</string>
+ <string name="lockscreen_permanent_disabled_sim_message_short" msgid="5096149665138916184">"Ðшиглах боломжгүй SIM карт."</string>
+ <string name="lockscreen_permanent_disabled_sim_instructions" msgid="910904643433151371">"Таны SIM карт бүрмөÑөн идÑвхгүй болов.\n Ó¨Ó©Ñ€ SIM карт авах бол өөрийн утаÑгүй үйлчилгÑÑний нийлүүлÑгчтÑй холбогдоно уу."</string>
+ <string name="lockscreen_transport_prev_description" msgid="201594905152746886">"Өмнөх бичлÑг товч"</string>
+ <string name="lockscreen_transport_next_description" msgid="6089297650481292363">"Дараагийн бичлÑг товч"</string>
+ <string name="lockscreen_transport_pause_description" msgid="7659088786780128001">"Түр зогÑоох товч"</string>
+ <string name="lockscreen_transport_play_description" msgid="5888422938351019426">"Тоглуулах товч"</string>
+ <string name="lockscreen_transport_stop_description" msgid="4562318378766987601">"ЗогÑоох товч"</string>
+ <string name="emergency_calls_only" msgid="6733978304386365407">"Зөвхөн Ñаралтай дуудлага"</string>
+ <string name="lockscreen_network_locked_message" msgid="143389224986028501">"СүлжÑÑ Ñ‚Ò¯Ð³Ð¶Ð¸Ð³Ð´ÑÑн"</string>
+ <string name="lockscreen_sim_puk_locked_message" msgid="7441797339976230">"SIM карт нь PUK түгжÑÑÑ‚Ñй."</string>
+ <string name="lockscreen_sim_puk_locked_instructions" msgid="8127916255245181063">"Ð¥ÑÑ€ÑглÑгчийн зааврыг харах ÑÑвÑл Ð¥ÑÑ€ÑглÑгчдÑд ТуÑлах төвтÑй холбоо барина уу."</string>
+ <string name="lockscreen_sim_locked_message" msgid="8066660129206001039">"SIM карт түгжигдÑÑн."</string>
+ <string name="lockscreen_sim_unlock_progress_dialog_message" msgid="595323214052881264">"SIM картны түгжÑÑг гаргаж байна…"</string>
+ <string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="6481623830344107222">"Та тайлах Ñ…ÑÑг <xliff:g id="NUMBER_0">%d</xliff:g> удаа буруу зурлаа. \n\n<xliff:g id="NUMBER_1">%d</xliff:g> Ñекундын дараа дахин оролдоно уу."</string>
+ <string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="2725973286239344555">"Та нууц үгÑÑ <xliff:g id="NUMBER_0">%d</xliff:g> удаа буруу бичив. \n\n<xliff:g id="NUMBER_1">%d</xliff:g> Ñекундын дараа дахин оролдоно уу."</string>
+ <string name="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="6216672706545696955">"Та PIN кодоо <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" product="tablet" msgid="9191611984625460820">"Та тайлах Ñ…ÑÑг <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_failed_attempts_almost_glogin" product="default" msgid="2590227559763762751">"Та тайлах Ñ…ÑÑг <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_failed_attempts_almost_at_wipe" product="tablet" msgid="6128106399745755604">"Та таблетыг тайлах гÑж <xliff:g id="NUMBER_0">%d</xliff:g> удаа буруу оролдлоо. <xliff:g id="NUMBER_1">%d</xliff:g> удаа дахин буруу оролдвол таблет үйлдвÑрийн үндÑÑн утгаараа тохируулагдах ба Ñ…ÑÑ€ÑглÑгчийн дата бүхÑлдÑÑ ÑƒÑтана."</string>
+ <string name="lockscreen_failed_attempts_almost_at_wipe" product="default" msgid="8603565142156826565">"Та утÑыг тайлах гÑж <xliff:g id="NUMBER_0">%d</xliff:g> удаа буруу оролдлоо. <xliff:g id="NUMBER_1">%d</xliff:g> удаа дахин буруу оролдвол ÑƒÑ‚Ð°Ñ Ò¯Ð¹Ð»Ð´Ð²Ñрийн үндÑÑн утгаараа тохируулагдах ба Ñ…ÑÑ€ÑглÑгчийн дата бүхÑлдÑÑ ÑƒÑтана."</string>
+ <string name="lockscreen_failed_attempts_now_wiping" product="tablet" msgid="280873516493934365">"Та таблетыг <xliff:g id="NUMBER">%d</xliff:g> удаа тайлах гÑж буруу оролдлоо. Таблет одоо үйлдвÑрийн үндÑÑн утгаараа тохируулагдах болно."</string>
+ <string name="lockscreen_failed_attempts_now_wiping" product="default" msgid="3025504721764922246">"Та утÑыг тайлах гÑж <xliff:g id="NUMBER">%d</xliff:g> удаа буруу оролдлоо. Ð£Ñ‚Ð°Ñ Ð¾Ð´Ð¾Ð¾ үйлдвÑрийн үндÑÑн утгаараа тохируулагдах болно."</string>
+ <string name="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"<xliff:g id="NUMBER">%d</xliff:g> Ñекундын дараа дахин оролдоно уу."</string>
+ <string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"Ð¥ÑÑг мартÑан уу?"</string>
+ <string name="lockscreen_glogin_forgot_pattern" msgid="2588521501166032747">"Ðкаунт тайлах"</string>
+ <string name="lockscreen_glogin_too_many_attempts" msgid="2751368605287288808">"Ð¥ÑÑ Ð¾Ñ€ÑƒÑƒÐ»Ð°Ñ… оролдлого Ñ…ÑÑ‚ олон"</string>
+ <string name="lockscreen_glogin_instructions" msgid="3931816256100707784">"ТүгжÑÑг тайлах бол Google акаунтаараа нÑвтÑÑ€Ð½Ñ Ò¯Ò¯."</string>
+ <string name="lockscreen_glogin_username_hint" msgid="8846881424106484447">"Ð¥ÑÑ€ÑглÑгч (имÑйл)"</string>
+ <string name="lockscreen_glogin_password_hint" msgid="5958028383954738528">"Ðууц үг"</string>
+ <string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"ÐÑвтрÑÑ…"</string>
+ <string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"Ð¥ÑÑ€ÑглÑгчийн нÑÑ€ ÑÑвÑл нууц үг буруу."</string>
+ <string name="lockscreen_glogin_account_recovery_hint" msgid="1696924763690379073">"Ð¥ÑÑ€ÑглÑгчийн нÑÑ€ нууц үгÑÑ Ð¼Ð°Ñ€Ñ‚Ñан уу?\n"<b>"google.com/accounts/recovery"</b>"-д зочилно уу."</string>
+ <string name="lockscreen_glogin_checking_password" msgid="7114627351286933867">"Шалгаж байна..."</string>
+ <string name="lockscreen_unlock_label" msgid="737440483220667054">"Тайлах"</string>
+ <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"Дуу идÑвхтÑй"</string>
+ <string name="lockscreen_sound_off_label" msgid="996822825154319026">"Дууг хаагдÑан"</string>
+ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"Ð¥ÑÑ ÑÑ…Ñлж байна"</string>
+ <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Ð¥ÑÑ Ñ†ÑвÑрлÑгдÑв"</string>
+ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Ðүд нÑмÑгдÑÑн"</string>
+ <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Ð¥ÑÑ Ð´ÑƒÑƒÑав"</string>
+ <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. %3$d. -н %2$d виджет"</string>
+ <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Виджет нÑмÑÑ…."</string>
+ <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"ХооÑон"</string>
+ <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Тайлах Ñ…ÑÑÑг нÑÑгдÑÑн."</string>
+ <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Тайлах Ñ…ÑÑÑг хаагдÑан."</string>
+ <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> виджет."</string>
+ <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"Ð¥ÑÑ€ÑглÑгч Ñонгоч"</string>
+ <string name="keyguard_accessibility_status" msgid="8008264603935930611">"СтатуÑ"</string>
+ <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Камер"</string>
+ <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Медиа контрол"</string>
+ <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Виджет дахин ÑÑ€ÑмбÑлж ÑхлÑв."</string>
+ <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Виджетийг дахин ÑÑ€ÑмбÑлж дууÑав."</string>
+ <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> виджет уÑÑ‚Ñан."</string>
+ <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"ТүгжÑÑгүй Ñ…ÑÑгийг өргөÑгөх."</string>
+ <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Тайлах гулÑуулалт."</string>
+ <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Тайлах Ñ…ÑÑ."</string>
+ <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"ÐүүрÑÑÑ€ тайлах"</string>
+ <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Тайлах пин."</string>
+ <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Тайлах нууц үг."</string>
+ <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Ð¥ÑÑний Ñ…ÑÑÑг."</string>
+ <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"ГулÑуулах Ñ…ÑÑÑг."</string>
+ <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
+ <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ÐБВ"</string>
+ <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
+ <string name="granularity_label_character" msgid="7336470535385009523">"Ñ‚ÑмдÑгт"</string>
+ <string name="granularity_label_word" msgid="7075570328374918660">"үг"</string>
+ <string name="granularity_label_link" msgid="5815508880782488267">"холбооÑ"</string>
+ <string name="granularity_label_line" msgid="5764267235026120888">"Мөр"</string>
+ <string name="hour_ampm" msgid="4584338083529355982">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
+ <string name="hour_cap_ampm" msgid="2083465992940444366">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
+ <string name="factorytest_failed" msgid="5410270329114212041">"ҮйлдлвÑрийн теÑÑ‚ бүтÑлгүйтÑв"</string>
+ <string name="factorytest_not_system" msgid="4435201656767276723">"FACTORY_TEST үйлдÑл нь зөвхөн /system/app-д ÑууÑан багцуудад дÑмжигдÑнÑ."</string>
+ <string name="factorytest_no_action" msgid="872991874799998561">"FACTORY_TEST үйлдлийг хангах багц олдÑонгүй."</string>
+ <string name="factorytest_reboot" msgid="6320168203050791643">"Дахин аÑаах"</string>
+ <string name="js_dialog_title" msgid="1987483977834603872">"\"<xliff:g id="TITLE">%s</xliff:g>\" хуудаÑ:"</string>
+ <string name="js_dialog_title_default" msgid="6961903213729667573">"JavaScript"</string>
+ <string name="js_dialog_before_unload_title" msgid="2619376555525116593">"ШилжүүлÑлтийг бататгах"</string>
+ <string name="js_dialog_before_unload_positive_button" msgid="3112752010600484130">"Ð­Ð½Ñ Ñ…ÑƒÑƒÐ´Ñыг орхих"</string>
+ <string name="js_dialog_before_unload_negative_button" msgid="5614861293026099715">"Ð­Ð½Ñ Ñ…ÑƒÑƒÐ´Ñанд үлдÑÑ…"</string>
+ <string name="js_dialog_before_unload" msgid="3468816357095378590">"<xliff:g id="MESSAGE">%s</xliff:g>\n\nТа үнÑÑ…ÑÑÑ€ ÑÐ½Ñ Ñ…ÑƒÑƒÐ´Ð°ÑÐ½Ð°Ð°Ñ Ð³Ð°Ñ€Ð¼Ð°Ð°Ñ€ байна уу?"</string>
+ <string name="save_password_label" msgid="6860261758665825069">"Баталгаажуулах"</string>
+ <string name="double_tap_toast" msgid="4595046515400268881">"Зөвлөмж: Ó¨Ñгөх бол давхар товшино уу."</string>
+ <string name="autofill_this_form" msgid="4616758841157816676">"Ðвтомат бичих"</string>
+ <string name="setup_autofill" msgid="7103495070180590814">"Ðвтомат дүүргÑлтийг тохируулах"</string>
+ <string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
+ <string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
+ <string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
+ <string name="autofill_address_summary_format" msgid="4874459455786827344">"$1$2$3"</string>
+ <string name="autofill_province" msgid="2231806553863422300">"Муж"</string>
+ <string name="autofill_postal_code" msgid="4696430407689377108">"Шуудангийн код"</string>
+ <string name="autofill_state" msgid="6988894195520044613">"Муж"</string>
+ <string name="autofill_zip_code" msgid="8697544592627322946">"ZIP код"</string>
+ <string name="autofill_county" msgid="237073771020362891">"Муж"</string>
+ <string name="autofill_island" msgid="4020100875984667025">"Ðрал"</string>
+ <string name="autofill_district" msgid="8400735073392267672">"ДүүрÑг"</string>
+ <string name="autofill_department" msgid="5343279462564453309">"Ð¥ÑлтÑÑ"</string>
+ <string name="autofill_prefecture" msgid="2028499485065800419">"Муж"</string>
+ <string name="autofill_parish" msgid="8202206105468820057">"Мөргөлч"</string>
+ <string name="autofill_area" msgid="3547409050889952423">"Ð¥ÑÑÑг"</string>
+ <string name="autofill_emirate" msgid="2893880978835698818">"Эмират"</string>
+ <string name="permlab_readHistoryBookmarks" msgid="3775265775405106983">"өөрийн Веб хавчуурга болон түүхийг унших"</string>
+ <string name="permdesc_readHistoryBookmarks" msgid="8462378226600439658">"Ðпп нь Хөтчийн зочилж байÑан бүх URL-н түүх болон Хөтчийн бүх хавчуургыг унших боломжтой. Ðнхаар: Ð­Ð½Ñ Ð·Ó©Ð²ÑˆÓ©Ó©Ñ€Ó©Ð» нь гуравдагч талын хөтөч ÑÑвÑл вебÑÑÑ€ хөтөчлөх чадавхтай аппликешнүүдÑд ашиглагдахгүй байх боломжтой."</string>
+ <string name="permlab_writeHistoryBookmarks" msgid="3714785165273314490">"веб хавчуурга болон түүхийг бичих"</string>
+ <string name="permdesc_writeHistoryBookmarks" product="tablet" msgid="6825527469145760922">"Ðпп нь таны таблет дÑÑÑ€ хадгалагдÑан Хөтчийн түүх ÑÑвÑл хавчуургыг өөрчлөх боломжтой. Ð­Ð½Ñ Ð½ÑŒ апп-д Хөтчийн датаг арилгах ÑÑвÑл өөрчлөх боломжийг олгоно. Ðнхаар: Ð­Ð½Ñ Ð·Ó©Ð²ÑˆÓ©Ó©Ñ€Ó©Ð» нь гуравдагч талын хөтөч ÑÑвÑл вебÑÑÑ€ хөтөчлөх чадвартай аппликешнд ажиллахгүй байх боломжтой."</string>
+ <string name="permdesc_writeHistoryBookmarks" product="default" msgid="8497389531014185509">"Ðпп нь таны утÑан дÑÑÑ€ хадгалагдÑан Хөтчийн түүх ÑÑвÑл хавчуургыг өөрчлөх боломжтой. Ð­Ð½Ñ Ð½ÑŒ апп-д Хөтчийн датаг арилгах ÑÑвÑл өөрчлөх боломжийг олгоно. Ðнхаар: Ð­Ð½Ñ Ð·Ó©Ð²ÑˆÓ©Ó©Ñ€Ó©Ð» нь гуравдагч талын хөтөч ÑÑвÑл вебÑÑÑ€ хөтөчлөх чадвартай аппликешнд ажиллахгүй байх боломжтой."</string>
+ <string name="permlab_setAlarm" msgid="1379294556362091814">"ÑÑрүүлÑг тохируулах"</string>
+ <string name="permdesc_setAlarm" msgid="316392039157473848">"Ðпп нь ÑуулгагдÑан ÑÑрүүлÑгний апп дÑÑÑ€ ÑÑрүүлÑг тохируулах боломжтой. Зарим ÑÑрүүлÑгний апп нь ÑÐ½Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¹Ð³ дÑмжихгүй байж болзошгүй."</string>
+ <string name="permlab_addVoicemail" msgid="5525660026090959044">"дуут шуудан нÑмÑÑ…"</string>
+ <string name="permdesc_addVoicemail" msgid="6604508651428252437">"Ðпп нь таны дуут шуудангийн ирÑÑн мÑйлд меÑÑеж нÑмÑÑ… боломжтой."</string>
+ <string name="permlab_writeGeolocationPermissions" msgid="5962224158955273932">"Хөтчийн геобайршлын зөвшөөрлийг өөрчлөх"</string>
+ <string name="permdesc_writeGeolocationPermissions" msgid="1083743234522638747">"Ðпп нь Хөтчийн гео байршлын зөвшөөрлийг өөрчлөх боломжтой. Хортой апп нь Ñнийг ашиглан дурын веб хуудаÑруу байршлын мÑдÑÑллийг илгÑÑÑ… боломжтой."</string>
+ <string name="permlab_packageVerificationAgent" msgid="5568139100645829117">"багцийг тулгах"</string>
+ <string name="permdesc_packageVerificationAgent" msgid="8437590190990843381">"Ðпп нь багцыг Ñуулгаж болох ÑÑÑхийг шалгах боломжтой."</string>
+ <string name="permlab_bindPackageVerifier" msgid="4187786793360326654">"багц тулгагчтÑй холбох"</string>
+ <string name="permdesc_bindPackageVerifier" msgid="3180741773233862126">"ЭзÑмшигч нь багц тулгагчдад Ñ…Ò¯ÑÑлт тавих боломжтой. Энгийн апп-д Ñ…ÑÑ€ÑглÑгдÑхгүй."</string>
+ <string name="permlab_serialPort" msgid="546083327654631076">"Ñериал портруу хандах"</string>
+ <string name="permdesc_serialPort" msgid="2991639985224598193">"ЭзÑмшигч нь SerialManager API ашиглан Ñериал портод хандах боломжтой."</string>
+ <string name="permlab_accessContentProvidersExternally" msgid="5077774297943409285">"контент нийлүүлÑгчид Ð³Ð°Ð´Ð½Ð°Ð°Ñ Ñ…Ð°Ð½Ð´Ð°Ñ…"</string>
+ <string name="permdesc_accessContentProvidersExternally" msgid="4544346486697853685">"ЭзÑмшигч нь шелÑÑÑ ÐºÐ¾Ð½Ñ‚ÐµÐ½Ñ‚ нийлүүлÑгчид хандах боломжтой. Энгийн апп-Ñ Ñ…ÑÑ€ÑглÑхгүй."</string>
+ <string name="permlab_updateLock" msgid="3527558366616680889">"төхөөрөмжийн автомат шинÑчлÑлтийг хориглох"</string>
+ <string name="permdesc_updateLock" msgid="1655625832166778492">"ЭзÑмшигч нь төхөөрөмжийг дÑвшүүлÑÑ…ÑÑÑ€ Ñ…ÑзÑÑ Ð´Ð°Ñ…Ð¸Ð½ аÑаавал тохирох тухай ÑиÑтемд мÑдÑÑлÑл Ñанал болгох боломжтой."</string>
+ <string name="save_password_message" msgid="767344687139195790">"Та хөтчид ÑÐ½Ñ Ð½ÑƒÑƒÑ† үгийг Ñануулах уу?"</string>
+ <string name="save_password_notnow" msgid="6389675316706699758">"Одоо биш"</string>
+ <string name="save_password_remember" msgid="6491879678996749466">"Санах"</string>
+ <string name="save_password_never" msgid="8274330296785855105">"Ð¥ÑзÑÑ Ñ‡ үгүй"</string>
+ <string name="open_permission_deny" msgid="7374036708316629800">"Танд ÑÐ½Ñ Ñ…ÑƒÑƒÐ´Ñыг нÑÑÑ… зөвшөөрөл байхгүй."</string>
+ <string name="text_copied" msgid="4985729524670131385">"ТекÑÑ‚ хуулагдав."</string>
+ <string name="more_item_label" msgid="4650918923083320495">"Илүү"</string>
+ <string name="prepend_shortcut_label" msgid="2572214461676015642">"ЦÑÑ+"</string>
+ <string name="menu_space_shortcut_label" msgid="2410328639272162537">"зай"</string>
+ <string name="menu_enter_shortcut_label" msgid="2743362785111309668">"оруулах"</string>
+ <string name="menu_delete_shortcut_label" msgid="3658178007202748164">"уÑтгах"</string>
+ <string name="search_go" msgid="8298016669822141719">"Хайх"</string>
+ <string name="searchview_description_search" msgid="6749826639098512120">"Хайх"</string>
+ <string name="searchview_description_query" msgid="5911778593125355124">"Хайх аÑуулга"</string>
+ <string name="searchview_description_clear" msgid="1330281990951833033">"ÐÑуулгыг цÑвÑрлÑÑ…"</string>
+ <string name="searchview_description_submit" msgid="2688450133297983542">"ÐÑуулгыг илгÑÑÑ…"</string>
+ <string name="searchview_description_voice" msgid="2453203695674994440">"Дуут хайлт"</string>
+ <string name="enable_explore_by_touch_warning_title" msgid="7460694070309730149">"Хүрч хайх функцийг идÑвхтÑй болгох уу?"</string>
+ <string name="enable_explore_by_touch_warning_message" product="tablet" msgid="8655887539089910577">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> нь Хүрч танихыг идÑвхжүүлÑхийг шаардаж байна. Хүрч таних идÑвхжÑÑн үед та хуруун доороо юу байгааг ÑонÑох, тайлбарыг харах боломжтой ба таблеттайгаа дохиогоор харилцах боломжтой."</string>
+ <string name="enable_explore_by_touch_warning_message" product="default" msgid="2708199672852373195">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> нь Хүрч танихыг идÑвхжүүлÑхийг шаардаж байна. Хүрч таних идÑвхжÑÑн тохиолдолд та хуруун доороо юу байгааг ÑонÑох, тайлбарыг харах боломжтой ба утаÑтайгаа дохиогоор харилцах боломжтой."</string>
+ <string name="oneMonthDurationPast" msgid="7396384508953779925">"1 Ñарын өмнө"</string>
+ <string name="beforeOneMonthDurationPast" msgid="909134546836499826">"1 Ñарын өмнө"</string>
+ <plurals name="num_seconds_ago">
+ <item quantity="one" msgid="4869870056547896011">"1 Ñекундын өмнө"</item>
+ <item quantity="other" msgid="3903706804349556379">"<xliff:g id="COUNT">%d</xliff:g> Ñекундын өмнө"</item>
+ </plurals>
+ <plurals name="num_minutes_ago">
+ <item quantity="one" msgid="3306787433088810191">"1 минутын өмнө"</item>
+ <item quantity="other" msgid="2176942008915455116">"<xliff:g id="COUNT">%d</xliff:g> минутын өмнө"</item>
+ </plurals>
+ <plurals name="num_hours_ago">
+ <item quantity="one" msgid="9150797944610821849">"1 цагийн өмнө"</item>
+ <item quantity="other" msgid="2467273239587587569">"<xliff:g id="COUNT">%d</xliff:g> цагийн өмнө"</item>
+ </plurals>
+ <plurals name="last_num_days">
+ <item quantity="other" msgid="3069992808164318268">"Сүүлийн <xliff:g id="COUNT">%d</xliff:g> өдөр"</item>
+ </plurals>
+ <string name="last_month" msgid="3959346739979055432">"Сүүлийн Ñар"</string>
+ <string name="older" msgid="5211975022815554840">"Хуучин"</string>
+ <plurals name="num_days_ago">
+ <item quantity="one" msgid="861358534398115820">"өчигдөр"</item>
+ <item quantity="other" msgid="2479586466153314633">"<xliff:g id="COUNT">%d</xliff:g> өдрийн өмнө"</item>
+ </plurals>
+ <plurals name="in_num_seconds">
+ <item quantity="one" msgid="2729745560954905102">"1 Ñекундын дараа"</item>
+ <item quantity="other" msgid="1241926116443974687">"<xliff:g id="COUNT">%d</xliff:g> Ñекундын дараа"</item>
+ </plurals>
+ <plurals name="in_num_minutes">
+ <item quantity="one" msgid="8793095251325200395">"1 минутын дараа"</item>
+ <item quantity="other" msgid="3330713936399448749">"<xliff:g id="COUNT">%d</xliff:g> минутын дараа"</item>
+ </plurals>
+ <plurals name="in_num_hours">
+ <item quantity="one" msgid="7164353342477769999">"1 цагийн дараа"</item>
+ <item quantity="other" msgid="547290677353727389">"<xliff:g id="COUNT">%d</xliff:g> цагийн дараа"</item>
+ </plurals>
+ <plurals name="in_num_days">
+ <item quantity="one" msgid="5413088743009839518">"маргааш"</item>
+ <item quantity="other" msgid="5109449375100953247">"<xliff:g id="COUNT">%d</xliff:g> өдрийн дараа"</item>
+ </plurals>
+ <plurals name="abbrev_num_seconds_ago">
+ <item quantity="one" msgid="1849036840200069118">"1 Ñекундын өмнө"</item>
+ <item quantity="other" msgid="3699169366650930415">"<xliff:g id="COUNT">%d</xliff:g> Ñек дараа"</item>
+ </plurals>
+ <plurals name="abbrev_num_minutes_ago">
+ <item quantity="one" msgid="6361490147113871545">"1 мин өмнө"</item>
+ <item quantity="other" msgid="851164968597150710">"<xliff:g id="COUNT">%d</xliff:g> минутын өмнө"</item>
+ </plurals>
+ <plurals name="abbrev_num_hours_ago">
+ <item quantity="one" msgid="4796212039724722116">"1 цагийн өмнө"</item>
+ <item quantity="other" msgid="6889970745748538901">"<xliff:g id="COUNT">%d</xliff:g> цагийн өмнө"</item>
+ </plurals>
+ <plurals name="abbrev_num_days_ago">
+ <item quantity="one" msgid="8463161711492680309">"өчигдөр"</item>
+ <item quantity="other" msgid="3453342639616481191">"<xliff:g id="COUNT">%d</xliff:g> өдрийн өмнө"</item>
+ </plurals>
+ <plurals name="abbrev_in_num_seconds">
+ <item quantity="one" msgid="5842225370795066299">"1 Ñек дараа"</item>
+ <item quantity="other" msgid="5495880108825805108">"<xliff:g id="COUNT">%d</xliff:g> Ñек дараа"</item>
+ </plurals>
+ <plurals name="abbrev_in_num_minutes">
+ <item quantity="one" msgid="562786149928284878">"1 мин дараа"</item>
+ <item quantity="other" msgid="4216113292706568726">"<xliff:g id="COUNT">%d</xliff:g> минутын дараа"</item>
+ </plurals>
+ <plurals name="abbrev_in_num_hours">
+ <item quantity="one" msgid="3274708118124045246">"1 цагийн дараа"</item>
+ <item quantity="other" msgid="3705373766798013406">"<xliff:g id="COUNT">%d</xliff:g> цагийн дараа"</item>
+ </plurals>
+ <plurals name="abbrev_in_num_days">
+ <item quantity="one" msgid="2178576254385739855">"маргааш"</item>
+ <item quantity="other" msgid="2973062968038355991">"<xliff:g id="COUNT">%d</xliff:g> өдрийн дараа"</item>
+ </plurals>
+ <string name="preposition_for_date" msgid="9093949757757445117">"<xliff:g id="DATE">%s</xliff:g>"</string>
+ <string name="preposition_for_time" msgid="5506831244263083793">"<xliff:g id="TIME">%s</xliff:g>"</string>
+ <string name="preposition_for_year" msgid="5040395640711867177">"<xliff:g id="YEAR">%s</xliff:g>"</string>
+ <string name="day" msgid="8144195776058119424">"өдөр"</string>
+ <string name="days" msgid="4774547661021344602">"өдөр"</string>
+ <string name="hour" msgid="2126771916426189481">"цаг"</string>
+ <string name="hours" msgid="894424005266852993">"цаг"</string>
+ <string name="minute" msgid="9148878657703769868">"мин"</string>
+ <string name="minutes" msgid="5646001005827034509">"минут"</string>
+ <string name="second" msgid="3184235808021478">"Ñек"</string>
+ <string name="seconds" msgid="3161515347216589235">"Ñек"</string>
+ <string name="week" msgid="5617961537173061583">"7 хоног"</string>
+ <string name="weeks" msgid="6509623834583944518">"7 хоног"</string>
+ <string name="year" msgid="4001118221013892076">"жил"</string>
+ <string name="years" msgid="6881577717993213522">"жил"</string>
+ <plurals name="duration_seconds">
+ <item quantity="one" msgid="6962015528372969481">"1 Ñекунд"</item>
+ <item quantity="other" msgid="1886107766577166786">"<xliff:g id="COUNT">%d</xliff:g> Ñекунд"</item>
+ </plurals>
+ <plurals name="duration_minutes">
+ <item quantity="one" msgid="4915414002546085617">"1 минут"</item>
+ <item quantity="other" msgid="3165187169224908775">"<xliff:g id="COUNT">%d</xliff:g> минут"</item>
+ </plurals>
+ <plurals name="duration_hours">
+ <item quantity="one" msgid="8917467491248809972">"1 цаг"</item>
+ <item quantity="other" msgid="3863962854246773930">"<xliff:g id="COUNT">%d</xliff:g> цаг"</item>
+ </plurals>
+ <string name="VideoView_error_title" msgid="3534509135438353077">"Видео алдаа"</string>
+ <string name="VideoView_error_text_invalid_progressive_playback" msgid="3186670335938670444">"Ð­Ð½Ñ Ð²Ð¸Ð´ÐµÐ¾ ÑÐ½Ñ Ñ‚Ó©Ñ…Ó©Ó©Ñ€Ó©Ð¼Ð¶ дÑÑÑ€ урÑгалаар гарч чадахгүй."</string>
+ <string name="VideoView_error_text_unknown" msgid="3450439155187810085">"Ð­Ð½Ñ Ð²Ð¸Ð´ÐµÐ¾Ð³ тоглуулах боломжгүй."</string>
+ <string name="VideoView_error_button" msgid="2822238215100679592">"Тийм"</string>
+ <string name="relative_time" msgid="1818557177829411417">"<xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="noon" msgid="7245353528818587908">"үд"</string>
+ <string name="Noon" msgid="3342127745230013127">"Үд"</string>
+ <string name="midnight" msgid="7166259508850457595">"шөнө дунд"</string>
+ <string name="Midnight" msgid="5630806906897892201">"Шөнө дунд"</string>
+ <string name="elapsed_time_short_format_mm_ss" msgid="4431555943828711473">"<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" msgid="1846071997616654124">"<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" msgid="6876518925844129331">"Бүгдийг Ñонгох"</string>
+ <string name="cut" msgid="3092569408438626261">"ТаÑлах"</string>
+ <string name="copy" msgid="2681946229533511987">"Хуулах"</string>
+ <string name="paste" msgid="5629880836805036433">"Буулгах"</string>
+ <string name="replace" msgid="5781686059063148930">"Орлуулах…"</string>
+ <string name="delete" msgid="6098684844021697789">"УÑтгах"</string>
+ <string name="copyUrl" msgid="2538211579596067402">"URL хуулах"</string>
+ <string name="selectTextMode" msgid="1018691815143165326">"ТекÑÑ‚ Ñонгох"</string>
+ <string name="textSelectionCABTitle" msgid="5236850394370820357">"ТекÑÑ‚ Ñонгох"</string>
+ <string name="addToDictionary" msgid="4352161534510057874">"Толь бичигт нÑмÑÑ…"</string>
+ <string name="deleteText" msgid="6979668428458199034">"УÑтгах"</string>
+ <string name="inputMethod" msgid="1653630062304567879">"Оруулах арга"</string>
+ <string name="editTextMenuTitle" msgid="4909135564941815494">"ТекÑÑ‚ үйлдÑл"</string>
+ <string name="low_internal_storage_view_title" msgid="5576272496365684834">"Сангийн Ñ…ÑмжÑÑ Ð´ÑƒÑ‚Ð°Ð³Ð´Ð°Ð¶ байна"</string>
+ <string name="low_internal_storage_view_text" msgid="6640505817617414371">"Зарим ÑиÑтем функц ажиллахгүй байна"</string>
+ <string name="app_running_notification_title" msgid="8718335121060787914">"<xliff:g id="APP_NAME">%1$s</xliff:g> ажиллаж байна"</string>
+ <string name="app_running_notification_text" msgid="4653586947747330058">"Илүү мÑдÑÑлÑл авах бол хүрÑÑ… ÑÑвÑл апп-г зогÑооно уу ."</string>
+ <string name="ok" msgid="5970060430562524910">"Тийм"</string>
+ <string name="cancel" msgid="6442560571259935130">"Цуцлах"</string>
+ <string name="yes" msgid="5362982303337969312">"Тийм"</string>
+ <string name="no" msgid="5141531044935541497">"Цуцлах"</string>
+ <string name="dialog_alert_title" msgid="2049658708609043103">"Ðнхаар"</string>
+ <string name="loading" msgid="7933681260296021180">"Ðчааллаж байна..."</string>
+ <string name="capital_on" msgid="1544682755514494298">"ИдÑвхтÑй"</string>
+ <string name="capital_off" msgid="6815870386972805832">"ИдÑвхгүй"</string>
+ <string name="whichApplication" msgid="4533185947064773386">"Үйлдлийг дууÑгах"</string>
+ <string name="alwaysUse" msgid="4583018368000610438">"Ð­Ð½Ñ Ð°Ð¶Ð¸Ð»Ð»Ð°Ð³Ð°Ð°Ð³ үндÑÑн болгох."</string>
+ <string name="clearDefaultHintMsg" msgid="3252584689512077257">"СиÑтем тохиргоо &gt; Ðпп &gt; Татаж авÑан Ñ…ÑÑгийн үндÑÑн утгуудыг цÑвÑрлÑÑ…"</string>
+ <string name="chooseActivity" msgid="7486876147751803333">"ҮйлдÑл Ñонгох"</string>
+ <string name="chooseUsbActivity" msgid="6894748416073583509">"USB төхөөрөмжийн апп-г Ñонгох"</string>
+ <string name="noApplications" msgid="2991814273936504689">"Ð­Ð½Ñ Ð°Ð¶Ð¸Ð»Ð»Ð°Ð³Ð°Ð°Ð³ гүйцÑтгÑÑ… апп байхгүй."</string>
+ <string name="aerr_title" msgid="1905800560317137752"></string>
+ <string name="aerr_application" msgid="932628488013092776">"ХарамÑалтай, <xliff:g id="APPLICATION">%1$s</xliff:g> зогÑÑон."</string>
+ <string name="aerr_process" msgid="4507058997035697579">"ХарамÑалтай нь <xliff:g id="PROCESS">%1$s</xliff:g> процеÑÑ Ð·Ð¾Ð³ÑÑон."</string>
+ <string name="anr_title" msgid="4351948481459135709"></string>
+ <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> хариу өгөхгүй байна.\n\nТа хаамаар байна уу?"</string>
+ <string name="anr_activity_process" msgid="5776209883299089767">"<xliff:g id="ACTIVITY">%1$s</xliff:g> активити хариу өгөхгүй байна.\n\nТа Ñнийг хаах уу?"</string>
+ <string name="anr_application_process" msgid="8941757607340481057">"<xliff:g id="APPLICATION">%1$s</xliff:g> хариу өгөхгүй байна. Та Ñнийг хаамаар байна уу?"</string>
+ <string name="anr_process" msgid="6513209874880517125">"<xliff:g id="PROCESS">%1$s</xliff:g> процеÑÑ Ñ…Ð°Ñ€Ð¸Ñƒ өгөхгүй байн.\n\nТа хаамаар байна уу?"</string>
+ <string name="force_close" msgid="8346072094521265605">"Тийм"</string>
+ <string name="report" msgid="4060218260984795706">"МÑдÑгдÑÑ…"</string>
+ <string name="wait" msgid="7147118217226317732">"ХүлÑÑÑ…"</string>
+ <string name="webpage_unresponsive" msgid="3272758351138122503">"Ð¥ÑƒÑƒÐ´Ð°Ñ Ñ…Ð°Ñ€Ð¸Ñƒ өгөхгүй байна.\n\nТа Ñнийг хаах уу?"</string>
+ <string name="launch_warning_title" msgid="1547997780506713581">"Aпп дахин чиглүүлÑгдÑв"</string>
+ <string name="launch_warning_replace" msgid="6202498949970281412">"<xliff:g id="APP_NAME">%1$s</xliff:g> одоо ажиллаж байна."</string>
+ <string name="launch_warning_original" msgid="188102023021668683">"<xliff:g id="APP_NAME">%1$s</xliff:g> ажиллав."</string>
+ <string name="screen_compat_mode_scale" msgid="3202955667675944499">"Цар Ñ…ÑмжÑÑ"</string>
+ <string name="screen_compat_mode_show" msgid="4013878876486655892">"Байнга харуулах"</string>
+ <string name="screen_compat_mode_hint" msgid="1064524084543304459">"Энийг СиÑтемийн тохиргоо &gt; Ðпп &gt; Татаж авÑан Ð´Ð¾Ñ‚Ñ€Ð¾Ð¾Ñ Ð´Ð°Ñ…Ð¸Ð½ идÑвхтÑй болгох боломжтой."</string>
+ <string name="smv_application" msgid="3307209192155442829">"<xliff:g id="APPLICATION">%1$s</xliff:g> апп (<xliff:g id="PROCESS">%2$s</xliff:g> процеÑÑ) өөрийнхөө StrictMode бодлогыг зөрчив."</string>
+ <string name="smv_process" msgid="5120397012047462446">"<xliff:g id="PROCESS">%1$s</xliff:g> процеÑÑ Ó©Ó©Ñ€Ð¸Ð¹Ð½Ñ…Ó©Ó© StrictMode бодлогыг зөрчив."</string>
+ <string name="android_upgrading_title" msgid="1584192285441405746">"Ðндройдыг дÑвшүүлж байна…"</string>
+ <string name="android_upgrading_apk" msgid="7904042682111526169">"<xliff:g id="NUMBER_1">%2$d</xliff:g>-н <xliff:g id="NUMBER_0">%1$d</xliff:g> апп-г тохируулж байна."</string>
+ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Ðпп-г Ñхлүүлж байна."</string>
+ <string name="android_upgrading_complete" msgid="1405954754112999229">"ЭхлÑлийг дууÑгаж байна."</string>
+ <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> ажиллаж байна"</string>
+ <string name="heavy_weight_notification_detail" msgid="1721681741617898865">"Ðпп ÑÑлгÑÑ… бол Ñ…Ò¯Ñ€Ð½Ñ Ò¯Ò¯"</string>
+ <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Ðпп ÑÑлгÑÑ… Ò¯Ò¯?"</string>
+ <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Та ÑˆÐ¸Ð½Ñ Ð°Ð¿Ð¿-г ажиллуулахын өмнө зогÑоох Ñ‘Ñтой Ó©Ó©Ñ€ апп ажиллаж байна."</string>
+ <string name="old_app_action" msgid="493129172238566282">"<xliff:g id="OLD_APP">%1$s</xliff:g>-руу буцах"</string>
+ <string name="old_app_description" msgid="2082094275580358049">"Ð¨Ð¸Ð½Ñ Ð°Ð¿Ð¿-г Ñхлүүлж болохгүй."</string>
+ <string name="new_app_action" msgid="5472756926945440706">"<xliff:g id="OLD_APP">%1$s</xliff:g> ÑхлүүлÑÑ…"</string>
+ <string name="new_app_description" msgid="1932143598371537340">"Хуучин апп-г хадгалахгүйгÑÑÑ€ зогÑооно уу."</string>
+ <string name="sendText" msgid="5209874571959469142">"ТекÑÑ‚ илгÑÑÑ… үйлдлийг Ñонгох"</string>
+ <string name="volume_ringtone" msgid="6885421406845734650">"Хонхны аÑны Ñ…ÑмжÑÑ"</string>
+ <string name="volume_music" msgid="5421651157138628171">"Медиа дууны Ñ…ÑмжÑÑ"</string>
+ <string name="volume_music_hint_playing_through_bluetooth" msgid="9165984379394601533">"БлютүүтÑÑÑ€ тоглож байна"</string>
+ <string name="volume_music_hint_silent_ringtone_selected" msgid="8310739960973156272">"Хонхны дууг чимÑÑгүй болгов"</string>
+ <string name="volume_call" msgid="3941680041282788711">"ИрÑÑн дуудлагын дууны Ñ…ÑмжÑÑ"</string>
+ <string name="volume_bluetooth_call" msgid="2002891926351151534">"Блютүүт ирÑÑн дуудлагын дууны Ñ…ÑмжÑÑ"</string>
+ <string name="volume_alarm" msgid="1985191616042689100">"СÑрүүлгийн дууны Ñ…ÑмжÑÑ"</string>
+ <string name="volume_notification" msgid="2422265656744276715">"МÑдÑгдлийн дууны Ñ…ÑмжÑÑ"</string>
+ <string name="volume_unknown" msgid="1400219669770445902">"Дууны Ñ…ÑмжÑÑ"</string>
+ <string name="volume_icon_description_bluetooth" msgid="6538894177255964340">"Блютүүтын Ñ…ÑмжÑÑ"</string>
+ <string name="volume_icon_description_ringer" msgid="3326003847006162496">"Хонхны дууны Ñ…ÑмжÑÑ"</string>
+ <string name="volume_icon_description_incall" msgid="8890073218154543397">"Дуудлагын дууны Ñ…ÑмжÑÑ"</string>
+ <string name="volume_icon_description_media" msgid="4217311719665194215">"Медиа дууны Ñ…ÑмжÑÑ"</string>
+ <string name="volume_icon_description_notification" msgid="7044986546477282274">"МÑдÑгдлийн дууны Ñ…ÑмжÑÑ"</string>
+ <string name="ringtone_default" msgid="3789758980357696936">"ҮндÑÑн хонхны аÑ"</string>
+ <string name="ringtone_default_with_actual" msgid="8129563480895990372">"ҮндÑÑн хонхны Ð°Ñ (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_silent" msgid="7937634392408977062">"Ðлийг нь ч биш"</string>
+ <string name="ringtone_picker_title" msgid="3515143939175119094">"Хонхны аÑ"</string>
+ <string name="ringtone_unknown" msgid="5477919988701784788">"Үл мÑдÑгдÑÑ… хонхны аÑ"</string>
+ <plurals name="wifi_available">
+ <item quantity="one" msgid="6654123987418168693">"Wi-Fi ÑүлжÑÑ Ð°ÑˆÐ¸Ð³Ð»Ð°Ñ… боломжтой"</item>
+ <item quantity="other" msgid="4192424489168397386">"Wi-Fi ÑүлжÑÑ Ð°ÑˆÐ¸Ð³Ð»Ð°Ñ… боломжгүй"</item>
+ </plurals>
+ <plurals name="wifi_available_detailed">
+ <item quantity="one" msgid="1634101450343277345">"ÐÑÑллтÑй Wi-Fi ÑүлжÑÑ Ð°ÑˆÐ¸Ð³Ð»Ð°Ñ… боломжтой"</item>
+ <item quantity="other" msgid="7915895323644292768">"ÐÑÑлттÑй Wi-Fi ÑүлжÑÑ Ð°ÑˆÐ¸Ð³Ð»Ð°Ñ… боломжтой"</item>
+ </plurals>
+ <string name="wifi_available_sign_in" msgid="4029489716605255386">"Wi-Fi ÑүлжÑÑнд нÑвтÑÑ€Ð½Ñ Ò¯Ò¯"</string>
+ <string name="network_available_sign_in" msgid="8495155593358054676">"СүлжÑÑнд нÑвтрÑÑ…"</string>
+ <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
+ <skip />
+ <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Wi-Fi-д холбогдож чадÑангүй"</string>
+ <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" Интернет холболт муу байна."</string>
+ <string name="wifi_p2p_dialog_title" msgid="97611782659324517">"Wi-Fi Шууд"</string>
+ <string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"Wi-Fi Шуудыг ÑÑ…Ð»Ò¯Ò¯Ð»Ð½Ñ Ò¯Ò¯. Ð­Ð½Ñ Ð½ÑŒ Wi-Fi клиент/холболтын цÑг унтраана."</string>
+ <string name="wifi_p2p_failed_message" msgid="3763669677935623084">"Wi-Fi Шуудыг Ñхлүүлж чадÑангүй."</string>
+ <string name="wifi_p2p_enabled_notification_title" msgid="2068321881673734886">"Wi-Fi Шууд аÑав"</string>
+ <string name="wifi_p2p_enabled_notification_message" msgid="1638949953993894335">"Тохируулах бол Ñ…Ò¯Ñ€Ð½Ñ Ò¯Ò¯"</string>
+ <string name="accept" msgid="1645267259272829559">"Зөвшөөрөх"</string>
+ <string name="decline" msgid="2112225451706137894">"Татгалзах"</string>
+ <string name="wifi_p2p_invitation_sent_title" msgid="1318975185112070734">"Урилга илгÑÑгдÑÑн"</string>
+ <string name="wifi_p2p_invitation_to_connect_title" msgid="4958803948658533637">"Холбох урилга"</string>
+ <string name="wifi_p2p_from_message" msgid="570389174731951769">"Ð¥ÑнÑÑÑ:"</string>
+ <string name="wifi_p2p_to_message" msgid="248968974522044099">"Ð¥Ñнд:"</string>
+ <string name="wifi_p2p_enter_pin_message" msgid="5920929550367828970">"Шаардлагатай PIN-г Ð±Ð¸Ñ‡Ð½Ñ Ò¯Ò¯:"</string>
+ <string name="wifi_p2p_show_pin_message" msgid="8530563323880921094">"PIN:"</string>
+ <string name="wifi_p2p_frequency_conflict_message" product="tablet" msgid="8012981257742232475">"Таблет <xliff:g id="DEVICE_NAME">%1$s</xliff:g>-Ñ‚Ñй холбогдох үедÑÑ Ñ‚Ò¯Ñ€ зуур Wi-Fi-Ñ Ñалах болно."</string>
+ <string name="wifi_p2p_frequency_conflict_message" product="default" msgid="7363907213787469151">"Ð£Ñ‚Ð°Ñ <xliff:g id="DEVICE_NAME">%1$s</xliff:g>-тай холбогдох үедÑÑ Ñ‚Ò¯Ñ€ зуур Wi-Fi-Ñ Ñалах болно."</string>
+ <string name="select_character" msgid="3365550120617701745">"ТÑмдÑгт оруулах"</string>
+ <string name="sms_control_title" msgid="7296612781128917719">"SMS меÑÑеж илгÑÑж байна"</string>
+ <string name="sms_control_message" msgid="3867899169651496433">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; их Ñ…ÑмжÑÑний SMS меÑÑежийг илгÑÑж байна. Та ÑÐ½Ñ Ð°Ð¿Ð¿-д үргÑлжлүүлÑн меÑÑеж илгÑÑхийг зөвшөөрөх Ò¯Ò¯?"</string>
+ <string name="sms_control_yes" msgid="3663725993855816807">"Зөвшөөрөх"</string>
+ <string name="sms_control_no" msgid="625438561395534982">"Татгалзах"</string>
+ <string name="sms_short_code_confirm_message" msgid="1645436466285310855">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; нь &lt;b&gt;<xliff:g id="DEST_ADDRESS">%2$s</xliff:g>&lt;/b&gt; уруу меÑÑеж илгÑÑÑ… гÑж байна."</string>
+ <string name="sms_short_code_details" msgid="3492025719868078457">"Ð­Ð½Ñ Ñ‚Ð°Ð½Ñ‹ мобайл акаунтад "<font fgcolor="#ffffb060">"төлбөр гаргаж"</font>" болзошгүй."</string>
+ <string name="sms_premium_short_code_details" msgid="5523826349105123687"><font fgcolor="#ffffb060">"Ð­Ð½Ñ Ñ‚Ð°Ð½Ñ‹ мобайл акаунтад төлбөр гаргах болно."</font></string>
+ <string name="sms_short_code_confirm_allow" msgid="4458878637111023413">"ИлгÑÑÑ…"</string>
+ <string name="sms_short_code_confirm_deny" msgid="2927389840209170706">"Цуцлах"</string>
+ <string name="sms_short_code_remember_choice" msgid="5289538592272218136">"Миний Ñонголтыг Ñанах"</string>
+ <string name="sms_short_code_remember_undo_instruction" msgid="4960944133052287484">"Та дараа Ñнийг Тохиргоо &gt; Ðпп Ð´Ð¾Ñ‚Ñ€Ð¾Ð¾Ñ Ñолих боломжтой"</string>
+ <string name="sms_short_code_confirm_always_allow" msgid="3241181154869493368">"Байнга зөвшөөрөх"</string>
+ <string name="sms_short_code_confirm_never_allow" msgid="446992765774269673">"Ð¥ÑзÑÑ Ñ‡ зөвшөөрөхгүй"</string>
+ <string name="sim_removed_title" msgid="6227712319223226185">"SIM карт хаÑагдÑан"</string>
+ <string name="sim_removed_message" msgid="2333164559970958645">"Зөв SIM карт хийгÑÑд дахин аÑаатал та мобайл ÑүлжÑÑг ашиглах боломжгүй."</string>
+ <string name="sim_done_button" msgid="827949989369963775">"ДууÑгах"</string>
+ <string name="sim_added_title" msgid="3719670512889674693">"SIM карт нÑмÑгдÑÑн"</string>
+ <string name="sim_added_message" msgid="6599945301141050216">"Мобайл ÑүлжÑÑнд хандах бол төхөөрөмжөө дахин аÑаан уу."</string>
+ <string name="sim_restart_button" msgid="4722407842815232347">"Дахин ÑхлүүлÑÑ…"</string>
+ <string name="time_picker_dialog_title" msgid="8349362623068819295">"Цагийн тохируулах"</string>
+ <string name="date_picker_dialog_title" msgid="5879450659453782278">"Огноо оруулах"</string>
+ <string name="date_time_set" msgid="5777075614321087758">"Тохируулах"</string>
+ <string name="date_time_done" msgid="2507683751759308828">"ДууÑгах"</string>
+ <string name="perms_new_perm_prefix" msgid="8257740710754301407"><font size="12" fgcolor="#ff33b5e5">"ШИÐЭ: "</font></string>
+ <string name="perms_description_app" msgid="5139836143293299417">"<xliff:g id="APP_NAME">%1$s</xliff:g> өгÑөн."</string>
+ <string name="no_permissions" msgid="7283357728219338112">"Зөвшөөрөл шаардахгүй"</string>
+ <string name="perm_costs_money" msgid="4902470324142151116">"Ð­Ð½Ñ Ñ‚Ð°Ð½Ñ‹Ð³ төлбөрт оруулж болзошгүй"</string>
+ <string name="usb_storage_activity_title" msgid="4465055157209648641">"USB маÑÑ Ñан"</string>
+ <string name="usb_storage_title" msgid="5901459041398751495">"USB холбогдÑон"</string>
+ <string name="usb_storage_message" product="nosdcard" msgid="3308538094316477839">"Та өөрийн компьютертÑÑ USB-Ñ€ холбогдÑон байна. Ð¥ÑÑ€Ñв та өөрийн компьютер болон өөрийн Ðндройдын USB Ñан хооронд файл хуулах бол доорх товчинд Ñ…Ò¯Ñ€Ð½Ñ Ò¯Ò¯."</string>
+ <string name="usb_storage_message" product="default" msgid="805351000446037811">"Та өөрийн компьютертÑÑ USB-Ñ€ холбогдÑон байна. Ð¥ÑÑ€Ñв та өөрийн компьютер болон өөрийн Ðндройдын USB Ñан хооронд файл хуулах бол доорх товчинд Ñ…Ò¯Ñ€Ð½Ñ Ò¯Ò¯."</string>
+ <string name="usb_storage_button_mount" msgid="1052259930369508235">"USB Ñанг аÑаах"</string>
+ <string name="usb_storage_error_message" product="nosdcard" msgid="3017045217365540658">"USB Ñанг USB маÑÑ Ñан болгон ашиглахад алдаа гарав."</string>
+ <string name="usb_storage_error_message" product="default" msgid="2876018512716970313">"SD картыг USB маÑÑ Ñан болгон ашиглахад алдаа гарав."</string>
+ <string name="usb_storage_notification_title" msgid="8175892554757216525">"USB холбогдÑон"</string>
+ <string name="usb_storage_notification_message" msgid="939822783828183763">"Өөрийн компьютер- ÑÑÑ/луу файл хуулах бол Ñ…Ò¯Ñ€Ð½Ñ Ò¯Ò¯"</string>
+ <string name="usb_storage_stop_notification_title" msgid="2336058396663516017">"USB Ñанг унтраах"</string>
+ <string name="usb_storage_stop_notification_message" msgid="1656852098555623822">"USB Ñанг унтраах бол Ñ…Ò¯Ñ€Ð½Ñ Ò¯Ò¯."</string>
+ <string name="usb_storage_stop_title" msgid="660129851708775853">"USB Ñан ашиглагдаж байна"</string>
+ <string name="usb_storage_stop_message" product="nosdcard" msgid="4264025280777219521">"USB Ñанг ÑƒÐ½Ñ‚Ñ€Ð°Ð°Ñ…Ð°Ð°Ñ Ó©Ð¼Ð½Ó© өөрийн Ðндройдын SD картыг компьютерÑÑÑÑÑ Ñалгана(\"гаргана\") уу."</string>
+ <string name="usb_storage_stop_message" product="default" msgid="8043969782460613114">"USB Ñанг ÑƒÐ½Ñ‚Ñ€Ð°Ð°Ñ…Ð°Ð°Ñ Ó©Ð¼Ð½Ó© өөрийн Ðндройдын SD картыг компьютерÑÑÑÑÑ Ñалгана(\"гаргана\") уу."</string>
+ <string name="usb_storage_stop_button_mount" msgid="7060218034900696029">"USB Ñанг унтраах"</string>
+ <string name="usb_storage_stop_error_message" msgid="1970374898263063836">"USB Ñанг унтраахад алдаа гарав. USB хоÑтоо ÑалгаÑан ÑÑÑÑ…ÑÑ ÑˆÐ°Ð»Ð³Ð°Ð°Ð´ дахин оролдоно уу."</string>
+ <string name="dlg_confirm_kill_storage_users_title" msgid="963039033470478697">"USB Ñанг аÑаах"</string>
+ <string name="dlg_confirm_kill_storage_users_text" msgid="5100428757107469454">"Ð¥ÑÑ€Ñв та USB Ñанг аÑуувал таны ашиглаж байга зарим апп зогÑох ба та USB Ñангаа унтраатал ашиглах боломжгүй байж болзошгүй."</string>
+ <string name="dlg_error_title" msgid="7323658469626514207">"USB ажиллагаа бүтÑлгүйтÑв"</string>
+ <string name="dlg_ok" msgid="7376953167039865701">"Тийм"</string>
+ <string name="usb_mtp_notification_title" msgid="3699913097391550394">"Медиа төхөөрөмж болон холбогдов"</string>
+ <string name="usb_ptp_notification_title" msgid="1960817192216064833">"Камер болгон холбов"</string>
+ <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"Суулгагч болгон холбогдÑон"</string>
+ <string name="usb_accessory_notification_title" msgid="7848236974087653666">"USB төхөөрөмжид холбогдов"</string>
+ <string name="usb_notification_message" msgid="2290859399983720271">"БуÑад USB Ñонголт хийх бол Ñ…Ò¯Ñ€Ð½Ñ Ò¯Ò¯."</string>
+ <string name="extmedia_format_title" product="nosdcard" msgid="9020092196061007262">"USB Ñанг форматлах уу?"</string>
+ <string name="extmedia_format_title" product="default" msgid="3648415921526526069">"SD картыг форматлах уу?"</string>
+ <string name="extmedia_format_message" product="nosdcard" msgid="3934016853425761078">"Таны USB Ñанд хадгалагдÑан бүх файл арилгагдана. Ð­Ð½Ñ Ò¯Ð¹Ð»Ð´Ð»Ð¸Ð¹Ð³ буцаах боломжгүй!"</string>
+ <string name="extmedia_format_message" product="default" msgid="14131895027543830">"Таны картан дÑÑрх бүх дата уÑтах болно."</string>
+ <string name="extmedia_format_button_format" msgid="4131064560127478695">"Форматлах"</string>
+ <string name="adb_active_notification_title" msgid="6729044778949189918">"USB дебаг холбогдÑон"</string>
+ <string name="adb_active_notification_message" msgid="1016654627626476142">"USB дебаг хийхийг идÑвхгүй болгох бол Ñ…Ò¯Ñ€Ð½Ñ Ò¯Ò¯."</string>
+ <string name="select_input_method" msgid="4653387336791222978">"Оруулах аргыг Ñонгоно уу"</string>
+ <string name="configure_input_methods" msgid="9091652157722495116">"Оруулах аргыг тохируулах"</string>
+ <string name="use_physical_keyboard" msgid="6203112478095117625">"Бодит гар"</string>
+ <string name="hardware" msgid="7517821086888990278">"Хардвер"</string>
+ <string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Гарын Ñхемийг Ñонгох"</string>
+ <string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"Гарын Ñхемийг Ñонгох бол Ñ…Ò¯Ñ€Ð½Ñ Ò¯Ò¯."</string>
+ <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+ <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+ <string name="candidates_style" msgid="4333913089637062257"><u>"нÑÑ€ дÑвшигч"</u></string>
+ <string name="ext_media_checking_notification_title" product="nosdcard" msgid="3449816005351468560">"USB Ñанг бÑлдÑж байна"</string>
+ <string name="ext_media_checking_notification_title" product="default" msgid="5457603418970994050">"SD карт бÑлдÑж байна"</string>
+ <string name="ext_media_checking_notification_message" msgid="8287319882926737053">"Ðлдааг шалгаж байна."</string>
+ <string name="ext_media_nofs_notification_title" product="nosdcard" msgid="7788040745686229307">"ХооÑон USB Ñан"</string>
+ <string name="ext_media_nofs_notification_title" product="default" msgid="780477838241212997">"ХооÑон SD карт"</string>
+ <string name="ext_media_nofs_notification_message" product="nosdcard" msgid="7840121067427269500">"USB Ñан хооÑон ÑÑвÑл дÑмжигдÑхгүй файл ÑиÑтемтÑй."</string>
+ <string name="ext_media_nofs_notification_message" product="default" msgid="8641065641786923604">"SD карт хооÑон ÑÑвÑл дÑмжигдÑхгүй файл ÑиÑтем."</string>
+ <string name="ext_media_unmountable_notification_title" product="nosdcard" msgid="2090046769532713563">"ГÑмтÑÑн USB Ñан"</string>
+ <string name="ext_media_unmountable_notification_title" product="default" msgid="6410723906019100189">"ГÑмтÑÑн SD карт"</string>
+ <string name="ext_media_unmountable_notification_message" product="nosdcard" msgid="1795917578395333280">"USB Ñан гÑмтÑÑн байна. Дахин форматлаж Ò¯Ð·Ð½Ñ Ò¯Ò¯."</string>
+ <string name="ext_media_unmountable_notification_message" product="default" msgid="1753898567525568253">"SD карт гÑмтÑÑн байна. Дахин форматлаж Ò¯Ð·Ð½Ñ Ò¯Ò¯."</string>
+ <string name="ext_media_badremoval_notification_title" product="nosdcard" msgid="1661683031330951073">"USB Ñанг ÑанамÑаргүй хаÑагдав"</string>
+ <string name="ext_media_badremoval_notification_title" product="default" msgid="6872152882604407837">"SD карт ÑанамÑаргүй хаÑагдав"</string>
+ <string name="ext_media_badremoval_notification_message" product="nosdcard" msgid="4329848819865594241">"Дата Ñ…Ð¾Ñ…Ð¸Ñ€Ð»Ð¾Ð¾Ñ ÑÑргийлж USB Ñанг ÑугалахааÑаа өмнө Ñалгаж байна уу."</string>
+ <string name="ext_media_badremoval_notification_message" product="default" msgid="7260183293747448241">"Дата Ñ…Ð¾Ñ…Ð¸Ñ€Ð»Ð¾Ð¾Ñ ÑÑргийлж SD картыг хаÑахааÑаа өмнө Ñалгаж байна уу."</string>
+ <string name="ext_media_safe_unmount_notification_title" product="nosdcard" msgid="3967973893270360230">"USB Ñанг Ñалгаж авахад аюулгүй."</string>
+ <string name="ext_media_safe_unmount_notification_title" product="default" msgid="6729801130790616200">"SD картыг хаÑахад аюулгүй"</string>
+ <string name="ext_media_safe_unmount_notification_message" product="nosdcard" msgid="6142195361606493530">"USB Ñанг Ñугалахад аюулгүй."</string>
+ <string name="ext_media_safe_unmount_notification_message" product="default" msgid="568841278138377604">"SD картаа Ñалгаж авах аюулгүй."</string>
+ <string name="ext_media_nomedia_notification_title" product="nosdcard" msgid="4486377230140227651">"ХаÑагдÑан USB Ñан"</string>
+ <string name="ext_media_nomedia_notification_title" product="default" msgid="8902518030404381318">"СугалÑан SD карт"</string>
+ <string name="ext_media_nomedia_notification_message" product="nosdcard" msgid="6921126162580574143">"USB Ñан Ñугалагдав. Ð¨Ð¸Ð½Ñ Ð¼ÐµÐ´Ð¸Ð°Ð³ Ñ…Ð¸Ð¹Ð½Ñ Ò¯Ò¯."</string>
+ <string name="ext_media_nomedia_notification_message" product="default" msgid="3870120652983659641">"SD карт хаÑагдав. Шинийг Ñ…Ð¸Ð¹Ð½Ñ Ò¯Ò¯."</string>
+ <string name="activity_list_empty" msgid="1675388330786841066">"Таарах активити олдÑонгүй."</string>
+ <string name="permlab_pkgUsageStats" msgid="8787352074326748892">"компонент ашиглалтын ÑтатиÑтикийг шинÑчлÑÑ…"</string>
+ <string name="permdesc_pkgUsageStats" msgid="1106612424254277630">"Ðпп нь компонент Ñ…ÑÑ€ÑглÑÑний цуглуулагдÑан ÑтатиÑтикийг өөрчлөх боломжтой. Энгийн апп-д шаардлагагүй."</string>
+ <string name="permlab_copyProtectedData" msgid="4341036311211406692">"контент хуулах"</string>
+ <string name="permdesc_copyProtectedData" msgid="4390697124288317831">"Ðпп нь контентыг хуулах үндÑÑн контейнер үйлчилгÑÑг дуудах боломжтой. Энгийн апп-д ашиглах боломжгүй."</string>
+ <string name="permlab_route_media_output" msgid="1642024455750414694">"Медиа гаралтыг чиглүүлÑÑ…"</string>
+ <string name="permdesc_route_media_output" msgid="4932818749547244346">"Ðппликешн нь медиа гаралтыг буÑад гадаад төхөөрөмжрүү чиглүүлÑÑ… боломжтой."</string>
+ <string name="permlab_access_keyguard_secure_storage" msgid="7565552237977815047">"Түлхүүр хамгаалах аюулгүй Ñанд хандах"</string>
+ <string name="permdesc_access_keyguard_secure_storage" msgid="5866245484303285762">"Ðппликешн нь хамгаалалттай аюулгүй Ñанд хандах боломжтой."</string>
+ <string name="permlab_control_keyguard" msgid="172195184207828387">"Түлхүүр хамгаалалтын харуулах болон далдлахыг удирдах"</string>
+ <string name="permdesc_control_keyguard" msgid="3043732290518629061">"Ðппликешн нь түлхүүр хамгаалагчыг удирдах боломжтой."</string>
+ <string name="tutorial_double_tap_to_zoom_message_short" msgid="4070433208160063538">"Ó¨Ñгөх контрол дÑÑÑ€ хоёр удаа товшино уу"</string>
+ <string name="gadget_host_error_inflating" msgid="4882004314906466162">"Виджет нÑмж чадÑангүй."</string>
+ <string name="ime_action_go" msgid="8320845651737369027">"Очих"</string>
+ <string name="ime_action_search" msgid="658110271822807811">"Хайх"</string>
+ <string name="ime_action_send" msgid="2316166556349314424">"ИлгÑÑÑ…"</string>
+ <string name="ime_action_next" msgid="3138843904009813834">"Дараах"</string>
+ <string name="ime_action_done" msgid="8971516117910934605">"ДууÑгах"</string>
+ <string name="ime_action_previous" msgid="1443550039250105948">"Өмнөх"</string>
+ <string name="ime_action_default" msgid="2840921885558045721">"Ðжиллуулах"</string>
+ <string name="dial_number_using" msgid="5789176425167573586">"<xliff:g id="NUMBER">%s</xliff:g> ашиглан \n залгах"</string>
+ <string name="create_contact_using" msgid="4947405226788104538">"<xliff:g id="NUMBER">%s</xliff:g> дугаар ашиглан \n харилцагч Ò¯Ò¯ÑгÑÑ…"</string>
+ <string name="grant_credentials_permission_message_header" msgid="2106103817937859662">"Дараах нÑг буюу түүнÑÑÑ Ð´ÑÑш апп таны акаунтад одоо болон дараа хандах зөвшөөрлийг Ñ…Ò¯ÑÑж байна."</string>
+ <string name="grant_credentials_permission_message_footer" msgid="3125211343379376561">"Та ÑÐ½Ñ Ñ…Ò¯ÑÑлтийг зөвшөөрөх Ò¯Ò¯?"</string>
+ <string name="grant_permissions_header_text" msgid="6874497408201826708">"Хандах Ñ…Ò¯ÑÑлт"</string>
+ <string name="allow" msgid="7225948811296386551">"Зөвшөөрөх"</string>
+ <string name="deny" msgid="2081879885755434506">"Татгалзах"</string>
+ <string name="permission_request_notification_title" msgid="6486759795926237907">"Зөвшөөрөл Ñ…Ò¯ÑÑв"</string>
+ <string name="permission_request_notification_with_subtitle" msgid="8530393139639560189">"<xliff:g id="ACCOUNT">%s</xliff:g> акаунт зөвшөөрөл \n Ñ…Ò¯ÑÑÑн"</string>
+ <string name="input_method_binding_label" msgid="1283557179944992649">"Оруулах арга"</string>
+ <string name="sync_binding_label" msgid="3687969138375092423">"Синк"</string>
+ <string name="accessibility_binding_label" msgid="4148120742096474641">"Хандалт"</string>
+ <string name="wallpaper_binding_label" msgid="1240087844304687662">"Ханын зураг"</string>
+ <string name="chooser_wallpaper" msgid="7873476199295190279">"Ханын зураг Ñолих"</string>
+ <string name="notification_listener_binding_label" msgid="2014162835481906429">"МÑдÑгдÑл ÑонÑогч"</string>
+ <string name="vpn_title" msgid="19615213552042827">"VPN идÑвхтÑй болов"</string>
+ <string name="vpn_title_long" msgid="6400714798049252294">"VPN-г <xliff:g id="APP">%s</xliff:g> идÑвхтÑй болгов"</string>
+ <string name="vpn_text" msgid="3011306607126450322">"СүлжÑÑг удирдах бол Ñ…Ò¯Ñ€Ð½Ñ Ò¯Ò¯."</string>
+ <string name="vpn_text_long" msgid="6407351006249174473">"<xliff:g id="SESSION">%s</xliff:g>-д холбогдов. СүлжÑÑг удирдах бол Ñ…Ò¯Ñ€Ð½Ñ Ò¯Ò¯."</string>
+ <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Байнгын VPN-д холбогдож байна..."</string>
+ <string name="vpn_lockdown_connected" msgid="8202679674819213931">"Байнга VPN холбоотой"</string>
+ <string name="vpn_lockdown_error" msgid="6009249814034708175">"Байнгын VPN алдаа"</string>
+ <string name="vpn_lockdown_config" msgid="6415899150671537970">"Тохируулах бол Ñ…Ò¯Ñ€Ð½Ñ Ò¯Ò¯"</string>
+ <string name="upload_file" msgid="2897957172366730416">"Файл Ñонгох"</string>
+ <string name="no_file_chosen" msgid="6363648562170759465">"СонгоÑон файл байхгүй"</string>
+ <string name="reset" msgid="2448168080964209908">"Бүгдийг цÑвÑрлÑÑ…"</string>
+ <string name="submit" msgid="1602335572089911941">"ИлгÑÑÑ…"</string>
+ <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Машины горим идÑвхтÑй болов"</string>
+ <string name="car_mode_disable_notification_message" msgid="8035230537563503262">"Машины Ð³Ð¾Ñ€Ð¸Ð¼Ð¾Ð¾Ñ Ð³Ð°Ñ€Ð°Ñ… бол Ñ…Ò¯Ñ€Ð½Ñ Ò¯Ò¯."</string>
+ <string name="tethered_notification_title" msgid="3146694234398202601">"Модем болгох ÑÑвÑл идÑвхтÑй цÑг болгох"</string>
+ <string name="tethered_notification_message" msgid="6857031760103062982">"Тохируулах бол Ñ…Ò¯Ñ€Ð½Ñ Ò¯Ò¯."</string>
+ <string name="back_button_label" msgid="2300470004503343439">"Буцах"</string>
+ <string name="next_button_label" msgid="1080555104677992408">"Дараах"</string>
+ <string name="skip_button_label" msgid="1275362299471631819">"ÐлгаÑах"</string>
+ <string name="throttle_warning_notification_title" msgid="4890894267454867276">"Мобайл дата Ñ…ÑÑ€ÑглÑÑ Ó©Ð½Ð´Ó©Ñ€"</string>
+ <string name="throttle_warning_notification_message" msgid="3340822228599337743">"Мобайл дата Ñ…ÑÑ€ÑглÑÑний талаар дÑлгÑÑ€Ñнгүй үзÑÑ… бол Ñ…Ò¯Ñ€Ð½Ñ Ò¯Ò¯"</string>
+ <string name="throttled_notification_title" msgid="6269541897729781332">"Мобайл дата Ñ…Ñзгаар Ñ…ÑтрÑв"</string>
+ <string name="throttled_notification_message" msgid="5443457321354907181">"Мобайл дата Ñ…ÑÑ€ÑглÑÑний талаар дÑлгÑÑ€Ñнгүй үзÑÑ… бол Ñ…Ò¯Ñ€Ð½Ñ Ò¯Ò¯"</string>
+ <string name="no_matches" msgid="8129421908915840737">"ИлÑрц алга"</string>
+ <string name="find_on_page" msgid="1946799233822820384">"ХуудаÑÐ½Ð°Ð°Ñ Ð¾Ð»Ð¾Ñ…"</string>
+ <plurals name="matches_found">
+ <item quantity="one" msgid="8167147081136579439">"1 утга"</item>
+ <item quantity="other" msgid="4641872797067609177">"<xliff:g id="TOTAL">%d</xliff:g>-н <xliff:g id="INDEX">%d</xliff:g>"</item>
+ </plurals>
+ <string name="action_mode_done" msgid="7217581640461922289">"ДууÑгах"</string>
+ <string name="progress_unmounting" product="nosdcard" msgid="3923810448507612746">"USB Ñанг Ñалгаж байна…"</string>
+ <string name="progress_unmounting" product="default" msgid="1327894998409537190">"SD картыг Ñалгаж байна…"</string>
+ <string name="progress_erasing" product="nosdcard" msgid="4521573321524340058">"USB Ñанг арилгаж байна…"</string>
+ <string name="progress_erasing" product="default" msgid="6596988875507043042">"SD картыг цÑвÑрлÑж байна…"</string>
+ <string name="format_error" product="nosdcard" msgid="6299769563624776948">"USB Ñанг арилгаж чадÑангүй."</string>
+ <string name="format_error" product="default" msgid="7315248696644510935">"SD картыг арилгаж чадÑангүй."</string>
+ <string name="media_bad_removal" msgid="7960864061016603281">"SD картыг ÑалгалгүйгÑÑÑ€ хаÑÑан байна."</string>
+ <string name="media_checking" product="nosdcard" msgid="418188720009569693">"USB Ñанг одоо шалгаж байна."</string>
+ <string name="media_checking" product="default" msgid="7334762503904827481">"SD картыг одоо шалгаж байна."</string>
+ <string name="media_removed" msgid="7001526905057952097">"SD картыг ÑугалÑан байна."</string>
+ <string name="media_shared" product="nosdcard" msgid="5830814349250834225">"USB Ñанг одоо компьютерÑÑÑ Ð°ÑˆÐ¸Ð³Ð»Ð°Ð¶ байна."</string>
+ <string name="media_shared" product="default" msgid="5706130568133540435">"USB Ñанг одоо компьютерÑÑÑ Ð°ÑˆÐ¸Ð³Ð»Ð°Ð¶ байна."</string>
+ <string name="media_unknown_state" msgid="729192782197290385">"Гадаад медиа үл мÑдÑгдÑÑ… ÑтатуÑтай байна."</string>
+ <string name="share" msgid="1778686618230011964">"Хуваалцах"</string>
+ <string name="find" msgid="4808270900322985960">"Олох"</string>
+ <string name="websearch" msgid="4337157977400211589">"Веб хайлт"</string>
+ <string name="find_next" msgid="5742124618942193978">"Дараагийнхыг хайх"</string>
+ <string name="find_previous" msgid="2196723669388360506">"Ó¨Ð¼Ð½Ó©Ñ…Ó©Ó©Ñ Ð¾Ð»Ð¾Ñ…"</string>
+ <string name="gpsNotifTicker" msgid="5622683912616496172">"<xliff:g id="NAME">%s</xliff:g>-н байршлын Ñ…Ò¯ÑÑлт"</string>
+ <string name="gpsNotifTitle" msgid="5446858717157416839">"Байршлын Ñ…Ò¯ÑÑлт"</string>
+ <string name="gpsNotifMessage" msgid="1374718023224000702">"<xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>) Ñ…Ò¯ÑÑлт илгÑÑÑÑн"</string>
+ <string name="gpsVerifYes" msgid="2346566072867213563">"Тийм"</string>
+ <string name="gpsVerifNo" msgid="1146564937346454865">"Үгүй"</string>
+ <string name="sync_too_many_deletes" msgid="5296321850662746890">"УÑтгах Ñ…Ñзгаар Ñ…ÑтрÑв"</string>
+ <string name="sync_too_many_deletes_desc" msgid="496551671008694245">"<xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>-Ñ€ <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g> акаунтын <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> зүйл уÑÑ‚Ñан . Та юу хиймÑÑÑ€ байна?"</string>
+ <string name="sync_really_delete" msgid="2572600103122596243">"УÑтгах"</string>
+ <string name="sync_undo_deletes" msgid="2941317360600338602">"УÑтгаÑныг буцаах"</string>
+ <string name="sync_do_nothing" msgid="3743764740430821845">"Одоо юу ч хийхгүй"</string>
+ <string name="choose_account_label" msgid="5655203089746423927">"Ðкаунт Ñонгох"</string>
+ <string name="add_account_label" msgid="2935267344849993553">"Ðкаунт нÑмÑÑ…"</string>
+ <string name="add_account_button_label" msgid="3611982894853435874">"Ðккаунт нÑмÑÑ…"</string>
+ <string name="number_picker_increment_button" msgid="2412072272832284313">"Ó¨ÑÓ©Ñ…"</string>
+ <string name="number_picker_decrement_button" msgid="476050778386779067">"Бууруулах"</string>
+ <string name="number_picker_increment_scroll_mode" msgid="3073101067441638428">"<xliff:g id="VALUE">%s</xliff:g> хүрÑÑд барина уу."</string>
+ <string name="number_picker_increment_scroll_action" msgid="9101473045891835490">"Ó¨Ñгөх бол дÑÑшÑÑ Ð±ÑƒÑƒÑ€ÑƒÑƒÐ»Ð°Ñ… бол доошоо гулÑуулна уу."</string>
+ <string name="time_picker_increment_minute_button" msgid="8865885114028614321">"Минут Ó©Ñгөх"</string>
+ <string name="time_picker_decrement_minute_button" msgid="6246834937080684791">"Минутыг бууруулах"</string>
+ <string name="time_picker_increment_hour_button" msgid="3652056055810223139">"Цаг Ó©Ñгөх"</string>
+ <string name="time_picker_decrement_hour_button" msgid="1377479863429214792">"Цаг бууруулах"</string>
+ <string name="time_picker_increment_set_pm_button" msgid="4147590696151230863">"PM тохируулах"</string>
+ <string name="time_picker_decrement_set_am_button" msgid="8302140353539486752">"AM тохируулах"</string>
+ <string name="date_picker_increment_month_button" msgid="5369998479067934110">"Сар Ó©Ñгөх"</string>
+ <string name="date_picker_decrement_month_button" msgid="1832698995541726019">"Сарыг бууруулах"</string>
+ <string name="date_picker_increment_day_button" msgid="7130465412308173903">"Өдөр Ó©Ñгөх"</string>
+ <string name="date_picker_decrement_day_button" msgid="4131881521818750031">"Өдрийг бууруулах"</string>
+ <string name="date_picker_increment_year_button" msgid="6318697384310808899">"Жилийг Ó©Ñгөх"</string>
+ <string name="date_picker_decrement_year_button" msgid="4482021813491121717">"Жил бууруулах"</string>
+ <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
+ <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"Цуцлах"</string>
+ <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"УÑтгах"</string>
+ <string name="keyboardview_keycode_done" msgid="1992571118466679775">"ДууÑгах"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Горим өөрчлөх"</string>
+ <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Шифт"</string>
+ <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Оруулах"</string>
+ <string name="activitychooserview_choose_application" msgid="2125168057199941199">"Ðпп Ñонгох"</string>
+ <string name="shareactionprovider_share_with" msgid="806688056141131819">"Хуваалцах"</string>
+ <string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"<xliff:g id="APPLICATION_NAME">%s</xliff:g>-тай хуваалцана уу"</string>
+ <string name="content_description_sliding_handle" msgid="415975056159262248">"Бариулыг гулÑуулна. ХүрÑÑд хүлÑÑнÑ."</string>
+ <string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>-г гулÑуулах."</string>
+ <string name="description_direction_down" msgid="5087739728639014595">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> хийх бол доош гулÑуулах."</string>
+ <string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> хийх зүүнлүү гулÑуулах."</string>
+ <string name="description_direction_right" msgid="8034433242579600980">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> хийх бол баруунлуу гулÑуулах."</string>
+ <string name="description_target_unlock" msgid="2228524900439801453">"Тайлах"</string>
+ <string name="description_target_camera" msgid="969071997552486814">"Камер"</string>
+ <string name="description_target_silent" msgid="893551287746522182">"ЧимÑÑгүй"</string>
+ <string name="description_target_soundon" msgid="30052466675500172">"Дуунууд идÑвхтÑй"</string>
+ <string name="description_target_search" msgid="3091587249776033139">"Хайх"</string>
+ <string name="description_target_unlock_tablet" msgid="3833195335629795055">"ТүгжÑÑг тайлах бол татна уу"</string>
+ <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Ðууц үгний дуудлагыг ÑонÑох бол чихÑвчийг залгана уу."</string>
+ <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"ЦÑг."</string>
+ <string name="action_bar_home_description" msgid="5293600496601490216">"Ðүүр хуудаÑруу шилжих"</string>
+ <string name="action_bar_up_description" msgid="2237496562952152589">"ДÑÑш шилжих"</string>
+ <string name="action_menu_overflow_description" msgid="2295659037509008453">"ÐÑмÑлт Ñонголтууд"</string>
+ <string name="action_bar_home_description_format" msgid="7965984360903693903">"%1$s, %2$s"</string>
+ <string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string>
+ <string name="storage_internal" msgid="4891916833657929263">"Дотоод Ñан"</string>
+ <string name="storage_sd_card" msgid="3282948861378286745">"SD карт"</string>
+ <string name="storage_usb" msgid="3017954059538517278">"USB Ñан"</string>
+ <string name="extract_edit_menu_button" msgid="8940478730496610137">"ЗаÑах"</string>
+ <string name="data_usage_warning_title" msgid="1955638862122232342">"Дата Ñ…ÑÑ€ÑглÑÑний анхааруулга"</string>
+ <string name="data_usage_warning_body" msgid="2814673551471969954">"Ðшиглалт болон тохиргоог харах бол Ñ…Ò¯Ñ€Ð½Ñ Ò¯Ò¯."</string>
+ <string name="data_usage_3g_limit_title" msgid="7093334419518706686">"2G-3G дата идÑвхгүй болов"</string>
+ <string name="data_usage_4g_limit_title" msgid="7636489436819470761">"4G дата идÑвхгүй байна"</string>
+ <string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"Мобайл дата идÑвхгүй"</string>
+ <string name="data_usage_wifi_limit_title" msgid="8992154736441284865">"Wi-Fi дата идÑвхгүй"</string>
+ <string name="data_usage_limit_body" msgid="3317964706973601386">"ИдÑвхжүүлÑÑ… бол Ñ…Ò¯Ñ€Ð½Ñ Ò¯Ò¯."</string>
+ <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"2G-3G дата Ñ…Ñзгаар Ñ…ÑтрÑв"</string>
+ <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"4G дата Ñ…Ñзгаар Ñ…ÑтрÑв"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"Мобайл дата Ñ…Ñзгаар Ñ…ÑтрÑв"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"Wi-Fi дата Ñ…Ñзгаар Ñ…ÑтрÑв"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"<xliff:g id="SIZE">%s</xliff:g> зааÑан Ñ…Ñзгаарыг давав."</string>
+ <string name="data_usage_restricted_title" msgid="5965157361036321914">"Ðрын дата Ñ…ÑзгаарлагдÑан"</string>
+ <string name="data_usage_restricted_body" msgid="6741521330997452990">"Ð¥Ñзгаарлалтыг хаÑах бол Ñ…Ò¯Ñ€Ð½Ñ Ò¯Ò¯."</string>
+ <string name="ssl_certificate" msgid="6510040486049237639">"Ðюулгүй Ñертификат"</string>
+ <string name="ssl_certificate_is_valid" msgid="6825263250774569373">"Сертификат хүчинтÑй."</string>
+ <string name="issued_to" msgid="454239480274921032">"ГаргуулÑан:"</string>
+ <string name="common_name" msgid="2233209299434172646">"Ерөнхий нÑÑ€:"</string>
+ <string name="org_name" msgid="6973561190762085236">"Байгууллага:"</string>
+ <string name="org_unit" msgid="7265981890422070383">"Байгууллагын нÑгж:"</string>
+ <string name="issued_by" msgid="2647584988057481566">"ГаргаÑан:"</string>
+ <string name="validity_period" msgid="8818886137545983110">"ХүчинтÑй байх:"</string>
+ <string name="issued_on" msgid="5895017404361397232">"ГаргаÑан:"</string>
+ <string name="expires_on" msgid="3676242949915959821">"ХүртÑл хүчинтÑй:"</string>
+ <string name="serial_number" msgid="758814067660862493">"Сериал дугаар:"</string>
+ <string name="fingerprints" msgid="4516019619850763049">"Хурууны Ñ…ÑÑ:"</string>
+ <string name="sha256_fingerprint" msgid="4391271286477279263">"SHA-256 хурууны Ñ…ÑÑ:"</string>
+ <string name="sha1_fingerprint" msgid="7930330235269404581">"SHA-1 хурууны Ñ…ÑÑ:"</string>
+ <string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Бүгдийг харах"</string>
+ <string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Ðктивити Ñонгох"</string>
+ <string name="share_action_provider_share_with" msgid="5247684435979149216">"Хуваалцах"</string>
+ <string name="status_bar_device_locked" msgid="3092703448690669768">"Төхөөрөмж түгжигдÑÑн."</string>
+ <string name="list_delimeter" msgid="3975117572185494152">", "</string>
+ <string name="sending" msgid="3245653681008218030">"ИлгÑÑж байна ..."</string>
+ <string name="launchBrowserDefault" msgid="2057951947297614725">"Хөтөч ажиллуулах уу?"</string>
+ <string name="SetupCallDefault" msgid="5834948469253758575">"Дуудлагыг зөвшөөрөх үү?"</string>
+ <string name="activity_resolver_use_always" msgid="8017770747801494933">"Байнга"</string>
+ <string name="activity_resolver_use_once" msgid="2404644797149173758">"ÐÑг удаа"</string>
+ <string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"Таблет"</string>
+ <string name="default_audio_route_name" product="default" msgid="4239291273420140123">"УтаÑ"</string>
+ <string name="default_audio_route_name_headphones" msgid="8119971843803439110">"ЧихÑвч"</string>
+ <string name="default_audio_route_name_dock_speakers" msgid="6240602982276591864">"Чанга Ñригчийг Ñуулгах"</string>
+ <string name="default_media_route_name_hdmi" msgid="2450970399023478055">"HDMI"</string>
+ <string name="default_audio_route_category_name" msgid="3722811174003886946">"СиÑтем"</string>
+ <string name="bluetooth_a2dp_audio_route_name" msgid="8575624030406771015">"Блютүүт аудио"</string>
+ <string name="wireless_display_route_description" msgid="9070346425023979651">"УтаÑгүй дÑлгÑц"</string>
+ <string name="media_route_chooser_grouping_done" msgid="7966438307723317169">"ДууÑÑан"</string>
+ <string name="media_route_button_content_description" msgid="5758553567065145276">"Медиа гаралт"</string>
+ <string name="media_route_status_scanning" msgid="7279908761758293783">"Скан хийж байна..."</string>
+ <string name="media_route_status_connecting" msgid="6422571716007825440">"Холбогдож байна..."</string>
+ <string name="media_route_status_available" msgid="6983258067194649391">"Боломжтой"</string>
+ <string name="media_route_status_not_available" msgid="6739899962681886401">"Боломжгүй"</string>
+ <string name="media_route_status_in_use" msgid="4533786031090198063">"Ðшиглаж байгаа"</string>
+ <string name="display_manager_built_in_display_name" msgid="2583134294292563941">"ҮндÑÑн дÑлгÑц"</string>
+ <string name="display_manager_hdmi_display_name" msgid="1555264559227470109">"HDMI ДÑлгÑц"</string>
+ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Давхарга #<xliff:g id="ID">%1$d</xliff:g>"</string>
+ <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
+ <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", найдвартай"</string>
+ <string name="wifi_display_notification_title" msgid="2223050649240326557">"УтаÑгүй дÑлгÑц холбогдов"</string>
+ <string name="wifi_display_notification_message" msgid="4498802012464170685">"Ð­Ð½Ñ Ð´ÑлгÑц Ó©Ó©Ñ€ төхөөрөмжийг харуулж байна"</string>
+ <string name="wifi_display_notification_disconnect" msgid="6183754463561153372">"Салгах"</string>
+ <string name="kg_emergency_call_label" msgid="684946192523830531">"Яаралтай дуудлага"</string>
+ <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Ð¥ÑÑг мартÑан"</string>
+ <string name="kg_wrong_pattern" msgid="1850806070801358830">"Буруу Ñ…ÑÑ"</string>
+ <string name="kg_wrong_password" msgid="2333281762128113157">"Ðууц үг буруу"</string>
+ <string name="kg_wrong_pin" msgid="1131306510833563801">"PIN буруу"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"<xliff:g id="NUMBER">%1$d</xliff:g> Ñекундын дараа дахин оролдоно уу."</string>
+ <string name="kg_pattern_instructions" msgid="398978611683075868">"Ð¥ÑÑг зурах"</string>
+ <string name="kg_sim_pin_instructions" msgid="2319508550934557331">"SIM PIN оруулна уу"</string>
+ <string name="kg_pin_instructions" msgid="2377242233495111557">"PIN оруулна уу"</string>
+ <string name="kg_password_instructions" msgid="5753646556186936819">"Ðууц үгÑÑ Ð¾Ñ€ÑƒÑƒÐ»Ð½Ð° уу"</string>
+ <string name="kg_puk_enter_puk_hint" msgid="453227143861735537">"SIM идÑвхгүй байна. ҮргÑлжлүүлÑÑ… бол PUK кодыг оруулна уу. ДÑлгÑÑ€Ñнгүй мÑдÑÑллийг Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð¾Ñ Ð°Ñууна ууу"</string>
+ <string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"Ð¥Ò¯ÑÑÑн PIN кодоо оруулна уу"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"Ð¥Ò¯ÑÑÑн PIN кодоо дахин оруулна уу"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"SIM картны түгжÑÑг гаргаж байна…"</string>
+ <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"Буруу PIN код."</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"4-8 Ñ‚Ð¾Ð¾Ð½Ð¾Ð¾Ñ Ð±Ò¯Ñ‚ÑÑ… PIN-г Ð±Ð¸Ñ‡Ð½Ñ Ò¯Ò¯."</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"PUK код 8-Ñ Ñ†Ó©Ó©Ð½Ð³Ò¯Ð¹ Ñ‚Ð¾Ð¾Ð½Ð¾Ð¾Ñ Ð±Ò¯Ñ‚Ð½Ñ."</string>
+ <string name="kg_invalid_puk" msgid="3638289409676051243">"Зөв PUK кодыг дахин оруулна уу. Давтан оролдвол SIM нь бүрмөÑөн идÑвхгүй болгоно."</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"PIN кодууд таарахгүй байна"</string>
+ <string name="kg_login_too_many_attempts" msgid="6486842094005698475">"Ð¥ÑÑ Ð¾Ñ€ÑƒÑƒÐ»Ð°Ñ… оролдлого Ñ…ÑÑ‚ олон"</string>
+ <string name="kg_login_instructions" msgid="1100551261265506448">"ТүгжÑÑг тайлах бол Google акаунтаараа нÑвтÑÑ€Ð½Ñ Ò¯Ò¯."</string>
+ <string name="kg_login_username_hint" msgid="5718534272070920364">"Ð¥ÑÑ€ÑглÑгчийн нÑÑ€ (имÑйл)"</string>
+ <string name="kg_login_password_hint" msgid="9057289103827298549">"Ðууц үг"</string>
+ <string name="kg_login_submit_button" msgid="5355904582674054702">"ÐÑвтрÑÑ…"</string>
+ <string name="kg_login_invalid_input" msgid="5754664119319872197">"Ð¥ÑÑ€ÑглÑгчийн нÑÑ€ ÑÑвÑл нууц үг буруу."</string>
+ <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"Ð¥ÑÑ€ÑглÑгчийн нÑÑ€ нууц үгÑÑ Ð¼Ð°Ñ€Ñ‚Ñан уу?\n"<b>"google.com/accounts/recovery"</b>"-д зочилно уу."</string>
+ <string name="kg_login_checking_password" msgid="1052685197710252395">"Ðкаунт шалгаж байна…"</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"Та PIN кодоо <xliff:g id="NUMBER_0">%d</xliff:g> удаа буруу бичив. \n\n<xliff:g id="NUMBER_1">%d</xliff:g> Ñекундын дараа дахин оролдоно уу."</string>
+ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"Та PIN кодоо <xliff:g id="NUMBER_0">%d</xliff:g> удаа буруу бичив. \n\n<xliff:g id="NUMBER_1">%d</xliff:g> Ñекундын дараа дахин оролдоно уу."</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"Та тайлах Ñ…ÑÑг <xliff:g id="NUMBER_0">%d</xliff:g> удаа буруу зурлаа. \n\n<xliff:g id="NUMBER_1">%d</xliff:g> Ñекундын дараа дахин оролдоно уу."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1575557200627128949">"Та таблетыг тайлах гÑж <xliff:g id="NUMBER_0">%d</xliff:g> удаа буруу оролдлоо. <xliff:g id="NUMBER_1">%d</xliff:g> удаа дахин буруу оролдвол таблет үйлдвÑрийн үндÑÑн утгаараа тохируулагдах ба Ñ…ÑÑ€ÑглÑгчийн дата бүхÑлдÑÑ ÑƒÑтана."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="4051015943038199910">"Та утÑыг тайлах гÑж <xliff:g id="NUMBER_0">%d</xliff:g> удаа буруу оролдлоо. <xliff:g id="NUMBER_1">%d</xliff:g> удаа дахин буруу оролдвол ÑƒÑ‚Ð°Ñ Ò¯Ð¹Ð»Ð´Ð²Ñрийн үндÑÑн утгаараа тохируулагдах ба Ñ…ÑÑ€ÑглÑгчийн дата бүхÑлдÑÑ ÑƒÑтана."</string>
+ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="2072996269148483637">"Та таблетыг тайлах гÑж <xliff:g id="NUMBER">%d</xliff:g> удаа буруу оролдлоо. Таблет одоо үйлдвÑрийн үндÑÑн утгаараа тохируулагдах болно."</string>
+ <string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"Та утÑыг тайлах гÑж <xliff:g id="NUMBER">%d</xliff:g> удаа буруу оролдлоо. Ð£Ñ‚Ð°Ñ Ð¾Ð´Ð¾Ð¾ үйлдвÑрийн үндÑÑн утгаараа тохируулагдах болно."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Та тайлах Ñ…ÑÑг <xliff:g id="NUMBER_0">%d</xliff:g> удаа буруу зурлаа. <xliff:g id="NUMBER_1">%d</xliff:g> удаа дахин буруу оруулбал, та таблетаа тайлахын тулд имÑйл акаунт шаардлагатай болно.\n\n <xliff:g id="NUMBER_2">%d</xliff:g> Ñекундын дараа дахин оролдоно уу."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Та тайлах Ñ…ÑÑг <xliff:g id="NUMBER_0">%d</xliff:g> удаа буруу зурлаа. <xliff:g id="NUMBER_1">%d</xliff:g> удаа дахин буруу оруулбал, та утÑаа тайлахын тулд имÑйл акаунтаа ашиглах шаардлагатай болно.\n\n <xliff:g id="NUMBER_2">%d</xliff:g> Ñекундын дараа дахин оролдоно уу."</string>
+ <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
+ <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"УÑтгах"</string>
+ <string name="safe_media_volume_warning" product="default" msgid="7324161939475478066">"Дууг Ñанал болгоÑон дÑÑд Ñ‚Ó©Ð²ÑˆÐ¸Ð½Ó©Ó©Ñ Ó©Ñгөх Ò¯Ò¯. \n Өндөр дуугаар урт хугацаанд ÑонÑох нь таны ÑонÑголд хортой."</string>
+ <string name="continue_to_enable_accessibility" msgid="1626427372316070258">"Ð¥Ñлбар горимыг идÑвхжүүлÑÑ… бол хоёр хуруугаараа доошлуулаад хүлÑÑÐ½Ñ Ò¯Ò¯."</string>
+ <string name="accessibility_enabled" msgid="1381972048564547685">"Ð¥ÑлбаршуулÑан горим идÑвхжив."</string>
+ <string name="enable_accessibility_canceled" msgid="3833923257966635673">"Хандалт цуцлагдÑан."</string>
+ <string name="user_switched" msgid="3768006783166984410">"Одоогийн Ñ…ÑÑ€ÑглÑгч <xliff:g id="NAME">%1$s</xliff:g>."</string>
+ <string name="owner_name" msgid="2716755460376028154">"ЭзÑмшигч"</string>
+ <string name="error_message_title" msgid="4510373083082500195">"Ðлдаа"</string>
+ <string name="app_no_restricted_accounts" msgid="5739463249673727736">"Ð­Ð½Ñ Ð°Ð¿Ð¿Ð»Ð¸ÐºÐµÑˆÐ½ Ñ…ÑзгаарлагдÑан профайлын акаунтыг дÑмжихгүй."</string>
+ <string name="app_not_found" msgid="3429141853498927379">"Ð­Ð½Ñ Ð°Ð¶Ð¸Ð»Ð»Ð°Ð³Ð°Ð°Ð³ зохицуулах аппликешн олдÑонгүй."</string>
+ <string name="revoke" msgid="5404479185228271586">"Цуцлах"</string>
+ <string name="mediaSize_iso_a0" msgid="7875427489420821793">"ISO A0"</string>
+ <string name="mediaSize_iso_a1" msgid="3760734499050875356">"ISO A1"</string>
+ <string name="mediaSize_iso_a2" msgid="5973266378020144382">"ISO A2"</string>
+ <string name="mediaSize_iso_a3" msgid="1373407105687300884">"ISO A3"</string>
+ <string name="mediaSize_iso_a4" msgid="6689772807982597254">"ISO A4"</string>
+ <string name="mediaSize_iso_a5" msgid="5353549652015741040">"ISO A5"</string>
+ <string name="mediaSize_iso_a6" msgid="8585038048674911907">"ISO A6"</string>
+ <string name="mediaSize_iso_a7" msgid="6641836716963839119">"ISO A7"</string>
+ <string name="mediaSize_iso_a8" msgid="7571139437465693355">"ISO A8"</string>
+ <string name="mediaSize_iso_a9" msgid="1378455891957115079">"ISO A9"</string>
+ <string name="mediaSize_iso_a10" msgid="2480747457429475344">"ISO A10"</string>
+ <string name="mediaSize_iso_b0" msgid="3965935097661108039">"ISO B0"</string>
+ <string name="mediaSize_iso_b1" msgid="2505753285010115437">"ISO B1"</string>
+ <string name="mediaSize_iso_b2" msgid="8763874709859458453">"ISO B2"</string>
+ <string name="mediaSize_iso_b3" msgid="4210506688191764076">"ISO B3"</string>
+ <string name="mediaSize_iso_b4" msgid="5749404165888526034">"ISO B4"</string>
+ <string name="mediaSize_iso_b5" msgid="7640627414621904733">"ISO B5"</string>
+ <string name="mediaSize_iso_b6" msgid="7342988864712748544">"ISO B6"</string>
+ <string name="mediaSize_iso_b7" msgid="5069844065235382429">"ISO B7"</string>
+ <string name="mediaSize_iso_b8" msgid="7316818922278779774">"ISO B8"</string>
+ <string name="mediaSize_iso_b9" msgid="5414727094026532341">"ISO B9"</string>
+ <string name="mediaSize_iso_b10" msgid="5251253731832048185">"ISO B10"</string>
+ <string name="mediaSize_iso_c0" msgid="4003138342671964217">"ISO C0"</string>
+ <string name="mediaSize_iso_c1" msgid="1935188063393553008">"ISO C1"</string>
+ <string name="mediaSize_iso_c2" msgid="3197307969712069904">"ISO C2"</string>
+ <string name="mediaSize_iso_c3" msgid="4335826087321913508">"ISO C3"</string>
+ <string name="mediaSize_iso_c4" msgid="3745639598281015005">"ISO C4"</string>
+ <string name="mediaSize_iso_c5" msgid="8269457765822791013">"ISO C5"</string>
+ <string name="mediaSize_iso_c6" msgid="566666105260346930">"ISO C6"</string>
+ <string name="mediaSize_iso_c7" msgid="8678413180782608498">"ISO C7"</string>
+ <string name="mediaSize_iso_c8" msgid="8392376206627041730">"ISO C8"</string>
+ <string name="mediaSize_iso_c9" msgid="9191613372324845405">"ISO C9"</string>
+ <string name="mediaSize_iso_c10" msgid="7327709699184920822">"ISO C10"</string>
+ <string name="mediaSize_na_letter" msgid="4191805615829472953">"Letter"</string>
+ <string name="mediaSize_na_gvrnmt_letter" msgid="7853382192649405507">"Government Letter"</string>
+ <string name="mediaSize_na_legal" msgid="6697982988283823150">"Legal"</string>
+ <string name="mediaSize_na_junior_legal" msgid="3727743969902758948">"Junior Legal"</string>
+ <string name="mediaSize_na_ledger" msgid="281871464896601236">"Ledger"</string>
+ <string name="mediaSize_na_tabloid" msgid="5775966416333578127">"Tabloid"</string>
+ <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"ЦуцлагдÑан"</string>
+ <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Контентыг бичих Ñвцад алдаа гарÑан"</string>
+ <string name="restr_pin_enter_pin" msgid="3395953421368476103">"PIN оруулна уу"</string>
+ <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"Одоогийн PIN"</string>
+ <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"Ð¨Ð¸Ð½Ñ PIN"</string>
+ <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"Ð¨Ð¸Ð½Ñ PIN-г баталгаажуулах"</string>
+ <string name="restr_pin_create_pin" msgid="8017600000263450337">"Өөрчлөлтийг Ñ…Ñзгаарлахад зориулан PIN Ò¯Ò¯ÑгÑÑ…"</string>
+ <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"PIN таарахгүй байна. Дахин оролдоно уу."</string>
+ <string name="restr_pin_error_too_short" msgid="8173982756265777792">"PIN Ñ…ÑÑ‚ богино байна. Хамгийн багадаа 4 цифртÑй байх Ñ‘Ñтой."</string>
+ <plurals name="restr_pin_countdown">
+ <item quantity="one" msgid="4835639969503729874">"Буруу PIN. 1 Ñекундын дараа дахин оролдоно уу."</item>
+ <item quantity="other" msgid="8030607343223287654">"Буруу PIN. <xliff:g id="COUNT">%d</xliff:g> Ñекундын дараа дахин оролдоно уу."</item>
+ </plurals>
+ <string name="transient_navigation_confirmation" msgid="4907844043611123426">"Баганыг харуулахын тулд дÑлгÑцийн ирмÑгийг шудрана уу"</string>
+ <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"СиÑтемийн баганыг гаргахын тулд дÑлгÑцийн ирмÑгÑÑÑ ÑˆÑƒÐ´Ñ€Ð°Ð½Ð° уу"</string>
+</resources>
diff --git a/core/res/res/values-ms-rMY/strings.xml b/core/res/res/values-ms-rMY/strings.xml
index 88d76e7..0785ac3 100644
--- a/core/res/res/values-ms-rMY/strings.xml
+++ b/core/res/res/values-ms-rMY/strings.xml
@@ -50,6 +50,11 @@
<string name="invalidPuk" msgid="8761456210898036513">"Taipkan PUK yang mempunyai 8 nombor atau lebih panjang."</string>
<string name="needPuk" msgid="919668385956251611">"Kad SIM anda dikunci PUK. Taipkan kod PUK untuk membuka kuncinya."</string>
<string name="needPuk2" msgid="4526033371987193070">"Taipkan PUK2 untuk menyahsekat kad SIM."</string>
+ <string name="enablePin" msgid="209412020907207950">"Tidak berjaya, dayakan Kunci SIM/RUIM."</string>
+ <plurals name="pinpuk_attempts">
+ <item quantity="one" msgid="6596245285809790142">"Anda mempunyai <xliff:g id="NUMBER">%d</xliff:g> percubaan lagi sebelum SIM dikunci."</item>
+ <item quantity="other" msgid="7530597808358774740">"Anda mempunyai <xliff:g id="NUMBER">%d</xliff:g> percubaan lagi sebelum SIM dikunci."</item>
+ </plurals>
<string name="imei" msgid="2625429890869005782">"IMEI"</string>
<string name="meid" msgid="4841221237681254195">"MEID"</string>
<string name="ClipMmi" msgid="6952821216480289285">"ID Pemanggil Masuk"</string>
@@ -477,6 +482,8 @@
<string name="permdesc_accessSurfaceFlinger" msgid="1041619516733293551">"Membenarkan apl menggunakan ciri peringkat rendah SurfaceFlinger."</string>
<string name="permlab_readFrameBuffer" msgid="6690504248178498136">"baca penimbal bingkai"</string>
<string name="permdesc_readFrameBuffer" msgid="4937405521809454680">"Membenarkan apl membaca kandungan penimbal bingkai."</string>
+ <string name="permlab_accessInputFlinger" msgid="5348635270689553857">"akses InputFlinger"</string>
+ <string name="permdesc_accessInputFlinger" msgid="2104864941201226616">"Membenarkan apl menggunakan ciri peringkat rendah InputFlinger."</string>
<string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"konfigurasikan paparan Wifi"</string>
<string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"Membenarkan apl mengkonfigurasi dan menyambung ke paparan Wifi."</string>
<string name="permlab_controlWifiDisplay" msgid="393641276723695496">"kawal paparan Wifi"</string>
@@ -1414,6 +1421,7 @@
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Masuk"</string>
<string name="activitychooserview_choose_application" msgid="2125168057199941199">"Pilih apl"</string>
+ <string name="activitychooserview_choose_application_error" msgid="8624618365481126668">"Tidak dapat melancarkan <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="shareactionprovider_share_with" msgid="806688056141131819">"Kongsi dengan"</string>
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Kongsi dengan <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Pemegang gelongsor. Sentuh &amp; tahan."</string>
@@ -1649,5 +1657,16 @@
<item quantity="other" msgid="4730868920742952817">"Cuba <xliff:g id="COUNT">%d</xliff:g> saat lagi"</item>
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Cuba sebentar lagi"</string>
- <string name="immersive_mode_confirmation" msgid="7227416894979047467">"Leret ke bawah untuk keluar dari skrin penuh"</string>
+ <string name="immersive_mode_confirmation" msgid="7227416894979047467">"Leret ke bawah dari atas untuk keluar dari skrin penuh."</string>
+ <string name="done_label" msgid="2093726099505892398">"Selesai"</string>
+ <string name="hour_picker_description" msgid="6698199186859736512">"Penggelangsar bulatan jam"</string>
+ <string name="minute_picker_description" msgid="8606010966873791190">"Penggelangsar bulatan minit"</string>
+ <string name="select_hours" msgid="6043079511766008245">"Pilih jam"</string>
+ <string name="select_minutes" msgid="3974345615920336087">"Pilih minit"</string>
+ <string name="day_picker_description" msgid="8990847925961297968">"Grid hari bulanan"</string>
+ <string name="year_picker_description" msgid="5524331207436052403">"Senarai tahun"</string>
+ <string name="select_day" msgid="7774759604701773332">"Pilih bulan dan hari"</string>
+ <string name="select_year" msgid="7952052866994196170">"Pilih tahun"</string>
+ <string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> dipilih"</string>
+ <string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> dipadamkan"</string>
</resources>
diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml
index a9fe930..e6dc0ca 100644
--- a/core/res/res/values-ms/strings.xml
+++ b/core/res/res/values-ms/strings.xml
@@ -314,7 +314,7 @@
<string name="permlab_stopAppSwitches" msgid="4138608610717425573">"halang pertukaran apl"</string>
<string name="permdesc_stopAppSwitches" msgid="8262195802582255021">"Menghalang pengguna daripada bertukar kepada apl lain."</string>
<string name="permlab_getTopActivityInfo" msgid="2537922311411546016">"dapatkan maklumat apl semasa"</string>
- <string name="permdesc_getTopActivityInfo" msgid="2512448855496067131">"Membenarkan pemegang mendapatkan maklumat peribadi tentang permohonan semasa di latar hadapan skrin"</string>
+ <string name="permdesc_getTopActivityInfo" msgid="8153651434145132505">"Membenarkan pemegang mendapatkan maklumat peribadi tentang aplikasi dan perkhidmatan semasa di latar hadapan skrin."</string>
<string name="permlab_runSetActivityWatcher" msgid="892239094867182656">"pantau dan kawal semua pelancaran apl"</string>
<string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"Membenarkan apl untuk memantau dan mengawal cara sistem melancarkan aktiviti. Apl hasad boleh menjejaskan sistem sepenuhnya. Kebenaran ini hanya diperlukan untuk pembangunan, tidak sekali-kali untuk penggunaan biasa."</string>
<string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"hantar siaran bahawa pakej telah dialih keluar"</string>
@@ -362,10 +362,8 @@
<string name="permdesc_bindPrintService" msgid="7960067623209111135">"Membenarkan pemegang terikat dengan antara muka peringkat tertinggi bagi perkhidmatan cetakan. Tidak sekali-kali diperlukan untuk apl biasa."</string>
<string name="permlab_accessAllPrintJobs" msgid="1120792468465711159">"akses semua kerja cetakan"</string>
<string name="permdesc_accessAllPrintJobs" msgid="2978185311041864762">"Membenarkan pemegang mengakses kerja cetakan yang dibuat oleh apl lain. Tidak sekali-kali diperlukan untuk apl biasa."</string>
- <!-- no translation found for permlab_bindNfcService (2752731300419410724) -->
- <skip />
- <!-- no translation found for permdesc_bindNfcService (6120647629174066862) -->
- <skip />
+ <string name="permlab_bindNfcService" msgid="2752731300419410724">"terikat kepada perkhidmatan NFC"</string>
+ <string name="permdesc_bindNfcService" msgid="6120647629174066862">"Membenarkan pemegang untuk terikat kepada aplikasi yang mengikut kad NFC. Tidak sekali-kali diperlukan untuk apl normal."</string>
<string name="permlab_bindTextService" msgid="7358378401915287938">"terikat kepada perkhidmatan teks"</string>
<string name="permdesc_bindTextService" msgid="8151968910973998670">"Membenarkan pemegang mengikat kepada antara muka peringkat atasan perkhidmatan teks(mis. PerkhidmatanPenyemakEjaan). Tidak seharusnya diperlukan untuk apl biasa."</string>
<string name="permlab_bindVpnService" msgid="4708596021161473255">"terikat kepada perkhidmatan VPN"</string>
@@ -409,6 +407,10 @@
<string name="permdesc_readLogs" product="default" msgid="2063438140241560443">"Membenarkan apl membaca daripada pelbagai fail log sistem. Hal ini membenarkannya menemui maklumat umum mengenai perkara yang anda lakukan dengan telefon, juga berpotensi menyertakan maklumat persendirian dan peribadi."</string>
<string name="permlab_anyCodecForPlayback" msgid="715805555823881818">"gunakan mana-mana penyahkod media untuk main semula"</string>
<string name="permdesc_anyCodecForPlayback" msgid="8283912488433189010">"Membenarkan apl untuk menggunakan sebarang penyahkod media yang dipasangkan untuk menyahkod main semula."</string>
+ <!-- no translation found for permlab_manageCaCertificates (1678391896786882014) -->
+ <skip />
+ <!-- no translation found for permdesc_manageCaCertificates (4015644047196937014) -->
+ <skip />
<string name="permlab_diagnostic" msgid="8076743953908000342">"baca/tulis ke sumber yang dimiliki oleh diag"</string>
<string name="permdesc_diagnostic" msgid="6608295692002452283">"Membenarkan apl membaca dan menulis ke sebarang sumber yang dimiliki oleh kumpulan diag; contohnya, fail dalam /dev. Hal ini berpotensi menjejaskan kestabilan dan keselamatan sistem. Perkara ini seharusnya HANYA digunakan untuk diagnosis khusus perkakasan oleh pengilang atau pengendali."</string>
<string name="permlab_changeComponentState" msgid="6335576775711095931">"dayakan atau lumpuhkan komponen apl"</string>
@@ -474,18 +476,14 @@
<string name="permdesc_accessInputFlinger" msgid="2104864941201226616">"Membenarkan apl menggunakan ciri peringkat rendah InputFlinger."</string>
<string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"konfigurasikan paparan Wifi"</string>
<string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"Membenarkan apl mengkonfigurasi dan menyambung ke paparan Wifi."</string>
- <!-- no translation found for permlab_captureAudioOutput (6857134498402346708) -->
- <skip />
- <!-- no translation found for permdesc_captureAudioOutput (6210597754212208853) -->
- <skip />
- <!-- no translation found for permlab_captureVideoOutput (2246828773589094023) -->
- <skip />
- <!-- no translation found for permdesc_captureVideoOutput (359481658034149860) -->
- <skip />
- <!-- no translation found for permlab_captureSecureVideoOutput (7815398969303382016) -->
- <skip />
- <!-- no translation found for permdesc_captureSecureVideoOutput (2779793064709350289) -->
- <skip />
+ <string name="permlab_controlWifiDisplay" msgid="393641276723695496">"kawal paparan Wifi"</string>
+ <string name="permdesc_controlWifiDisplay" msgid="4543912292681826986">"Membenarkan apl mengawal ciri tahap rendah paparan Wifi."</string>
+ <string name="permlab_captureAudioOutput" msgid="6857134498402346708">"tangkap output audio"</string>
+ <string name="permdesc_captureAudioOutput" msgid="6210597754212208853">"Membenarkan apl menangkap dan mengubah hala output audio."</string>
+ <string name="permlab_captureVideoOutput" msgid="2246828773589094023">"tangkap output video"</string>
+ <string name="permdesc_captureVideoOutput" msgid="359481658034149860">"Membenarkan apl menangkap dan mengubah hala output video."</string>
+ <string name="permlab_captureSecureVideoOutput" msgid="7815398969303382016">"tangkap output video selamat"</string>
+ <string name="permdesc_captureSecureVideoOutput" msgid="2779793064709350289">"Membenarkan apl menangkap dan mengubah hala output video selamat."</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"tukar tetapan audio anda"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"Membenarkan apl untuk mengubah suai tetapan audio global seperti kelantangan dan pembesar suara mana digunakan untuk output."</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"rakam audio"</string>
@@ -659,6 +657,8 @@
<string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"Membenarkan pemegang terikat dengan antara muka peringkat tertinggi bagi perkhidmatan pendengar pemberitahuan. Tidak sekali-kali diperlukan untuk apl biasa."</string>
<string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"gunakan apl konfigurasi yang disediakan oleh pembawa"</string>
<string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"Membenarkan pemegang menggunakan apl konfigurasi yang diberikan oleh pembawa. Tidak sekali-kali diperlukan untuk apl biasa."</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"dengar pemerhatian mengenai keadaan rangkaian"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"Membenarkan aplikasi mendengar pemerhatian tentang keadaan rangkaian. Tidak sekali-kali diperlukan untuk apl biasa."</string>
<string name="policylab_limitPassword" msgid="4497420728857585791">"Tetapkan peraturan kata laluan"</string>
<string name="policydesc_limitPassword" msgid="3252114203919510394">"Mengawal panjang dan aksara yang dibenarkan dalam kata laluan buka kunci skrin."</string>
<string name="policylab_watchLogin" msgid="914130646942199503">"Memantau percubaan buka kunci skrin"</string>
@@ -1479,8 +1479,7 @@
<string name="display_manager_hdmi_display_name" msgid="1555264559227470109">"Skrin HDMI"</string>
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Tindih #<xliff:g id="ID">%1$d</xliff:g>"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
- <!-- no translation found for display_manager_overlay_display_secure_suffix (6022119702628572080) -->
- <skip />
+ <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", selamat"</string>
<string name="wifi_display_notification_title" msgid="2223050649240326557">"Paparan wayarles disambungkan"</string>
<string name="wifi_display_notification_message" msgid="4498802012464170685">"Skrin ini ditunjukkan pada peranti lain"</string>
<string name="wifi_display_notification_disconnect" msgid="6183754463561153372">"Putus sambungan"</string>
@@ -1584,4 +1583,6 @@
<item quantity="one" msgid="4835639969503729874">"PIN salah. Cuba lagi dalam masa 1 saat."</item>
<item quantity="other" msgid="8030607343223287654">"PIN salah. Cuba lagi dalam masa <xliff:g id="COUNT">%d</xliff:g> saat."</item>
</plurals>
+ <string name="transient_navigation_confirmation" msgid="4907844043611123426">"Leret bhg tepi skrin utk serlah bar"</string>
+ <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"Leret dari tepi skrin untuk menampakkan bar sistem"</string>
</resources>
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index 3be8817..abda0a1 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -50,6 +50,11 @@
<string name="invalidPuk" msgid="8761456210898036513">"Skriv inn en PUK-kode på åtte tall eller mer."</string>
<string name="needPuk" msgid="919668385956251611">"SIM-kortet ditt er PUK-låst. Skriv inn PUK-koden for å låse det opp."</string>
<string name="needPuk2" msgid="4526033371987193070">"Skriv inn PUK2 for å låse opp SIM-kortet."</string>
+ <string name="enablePin" msgid="209412020907207950">"Mislyktes – aktiver lås for SIM/RUIM."</string>
+ <plurals name="pinpuk_attempts">
+ <item quantity="one" msgid="6596245285809790142">"Du har <xliff:g id="NUMBER">%d</xliff:g> forsøk igjen før SIM-kortet låses."</item>
+ <item quantity="other" msgid="7530597808358774740">"Du har <xliff:g id="NUMBER">%d</xliff:g> forsøk igjen før SIM-kortet låses."</item>
+ </plurals>
<string name="imei" msgid="2625429890869005782">"IMEI"</string>
<string name="meid" msgid="4841221237681254195">"MEID"</string>
<string name="ClipMmi" msgid="6952821216480289285">"Inngående nummervisning"</string>
@@ -477,6 +482,8 @@
<string name="permdesc_accessSurfaceFlinger" msgid="1041619516733293551">"Lar appen bruke grunnleggende SurfaceFlinger-funksjoner."</string>
<string name="permlab_readFrameBuffer" msgid="6690504248178498136">"lese skjermbufferen"</string>
<string name="permdesc_readFrameBuffer" msgid="4937405521809454680">"Lar appen lese innholdet i rammebufferen."</string>
+ <string name="permlab_accessInputFlinger" msgid="5348635270689553857">"tilgang til InputFlinger"</string>
+ <string name="permdesc_accessInputFlinger" msgid="2104864941201226616">"Lar appen bruke grunnleggende InputFlinger-funksjoner."</string>
<string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"konfigurere Wi-Fi-skjermer"</string>
<string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"Tillater appen å konfigurere og koble til Wi-Fi-skjermer."</string>
<string name="permlab_controlWifiDisplay" msgid="393641276723695496">"kontrollere Wi-Fi-skjermer"</string>
@@ -1414,6 +1421,7 @@
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
<string name="activitychooserview_choose_application" msgid="2125168057199941199">"Velg en app"</string>
+ <string name="activitychooserview_choose_application_error" msgid="8624618365481126668">"Kunne ikke starte <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="shareactionprovider_share_with" msgid="806688056141131819">"Del med"</string>
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Del med <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Glidebryter. Trykk og hold inne."</string>
@@ -1650,4 +1658,15 @@
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Prøv på nytt senere"</string>
<string name="immersive_mode_confirmation" msgid="7227416894979047467">"Sveip ned fra toppen av skjermen for å gå ut av fullskjermvisningen."</string>
+ <string name="done_label" msgid="2093726099505892398">"Ferdig"</string>
+ <string name="hour_picker_description" msgid="6698199186859736512">"Sirkulær glidebryter for timer"</string>
+ <string name="minute_picker_description" msgid="8606010966873791190">"Sirkulær glidebryter for minutter"</string>
+ <string name="select_hours" msgid="6043079511766008245">"Angi timer"</string>
+ <string name="select_minutes" msgid="3974345615920336087">"Angi minutter"</string>
+ <string name="day_picker_description" msgid="8990847925961297968">"MÃ¥nedsrutenett med dager"</string>
+ <string name="year_picker_description" msgid="5524331207436052403">"Ã…rsliste"</string>
+ <string name="select_day" msgid="7774759604701773332">"Velg måneden og dagen"</string>
+ <string name="select_year" msgid="7952052866994196170">"Velg året"</string>
+ <string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> er valgt"</string>
+ <string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> er slettet"</string>
</resources>
diff --git a/core/res/res/values-ne-rNP/strings.xml b/core/res/res/values-ne-rNP/strings.xml
new file mode 100644
index 0000000..8626897b
--- /dev/null
+++ b/core/res/res/values-ne-rNP/strings.xml
@@ -0,0 +1,1591 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="byteShort" msgid="8340973892742019101">"B"</string>
+ <string name="kilobyteShort" msgid="5973789783504771878">"KB"</string>
+ <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
+ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
+ <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
+ <string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
+ <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string>
+ <string name="untitled" msgid="4638956954852782576">"&lt;बिना शीरà¥à¤·à¤•&gt;"</string>
+ <string name="ellipsis" msgid="7899829516048813237">"…"</string>
+ <string name="ellipsis_two_dots" msgid="1228078994866030736">"‥"</string>
+ <string name="emptyPhoneNumber" msgid="7694063042079676517">"(कà¥à¤¨à¥ˆ फोन नमà¥à¤¬à¤° छैन)"</string>
+ <string name="unknownName" msgid="2277556546742746522">"(अजà¥à¤žà¤¾à¤¤)"</string>
+ <string name="defaultVoiceMailAlphaTag" msgid="2660020990097733077">"भà¥à¤µà¤¾à¤‡à¤¸ मेल"</string>
+ <string name="defaultMsisdnAlphaTag" msgid="2850889754919584674">"MSISDN१"</string>
+ <string name="mmiError" msgid="5154499457739052907">"जडान समसà¥à¤¯à¤¾ वा अमानà¥à¤¯ MMI कोड।"</string>
+ <string name="mmiFdnError" msgid="5224398216385316471">"अपरेशन निशà¥à¤šà¤¿à¤¤ डायल नमà¥à¤¬à¤°à¤¹à¤°à¥‚को लागि मातà¥à¤° पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¿à¤¤ छ।"</string>
+ <string name="serviceEnabled" msgid="8147278346414714315">"सेवा सकà¥à¤·à¤® पारियो।"</string>
+ <string name="serviceEnabledFor" msgid="6856228140453471041">"निमà¥à¤¨ उलà¥à¤²à¥‡à¤–ितको लागि सेवा सकà¥à¤·à¤® पारियो:"</string>
+ <string name="serviceDisabled" msgid="1937553226592516411">"सेवा असकà¥à¤·à¤® पारिà¤à¤•ो छ।"</string>
+ <string name="serviceRegistered" msgid="6275019082598102493">"दरà¥à¤¤à¤¾ सफल भयो।"</string>
+ <string name="serviceErased" msgid="1288584695297200972">"मेटाइ सफल थियो।"</string>
+ <string name="passwordIncorrect" msgid="7612208839450128715">"गलत पासवरà¥à¤¡à¥¤"</string>
+ <string name="mmiComplete" msgid="8232527495411698359">"MMI पà¥à¤°à¤¾ भयो।"</string>
+ <string name="badPin" msgid="9015277645546710014">"तपाईंले टाइप गरà¥à¤¨à¥à¤­à¤à¤•ो पà¥à¤°à¤¾à¤¨à¥‹ PIN सही छैन।"</string>
+ <string name="badPuk" msgid="5487257647081132201">"तपाईंले टाइप गरà¥à¤¨à¥à¤­à¤à¤•ो PUK सही छैन।"</string>
+ <string name="mismatchPin" msgid="609379054496863419">"तपाईंले टाइप गरà¥à¤¨à¥à¤­à¤à¤•ो PIN मेल खाà¤à¤¦à¥ˆà¤¨à¥¤"</string>
+ <string name="invalidPin" msgid="3850018445187475377">"४ देखि ८ वटा नमà¥à¤¬à¤° भà¤à¤•ो à¤à¤‰à¤Ÿà¤¾ PIN टाइप गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="invalidPuk" msgid="8761456210898036513">"८ वटा नमà¥à¤¬à¤°à¤¹à¤°à¥‚ वा सो भनà¥à¤¦à¤¾ लामो à¤à¤‰à¤Ÿà¤¾ PUK टाइप गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="needPuk" msgid="919668385956251611">"तपाईंको SIM कारà¥à¤¡ PUK-लक छ। यसलाई अनलक गरà¥à¤¨ PUK कोड टाइप गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="needPuk2" msgid="4526033371987193070">"SIM कारà¥à¤¡ अनलक गरà¥à¤¨ PUK2 टाइप गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="imei" msgid="2625429890869005782">"IMEI"</string>
+ <string name="meid" msgid="4841221237681254195">"MEID"</string>
+ <string name="ClipMmi" msgid="6952821216480289285">"आगमन कलर ID"</string>
+ <string name="ClirMmi" msgid="7784673673446833091">"बाहिरिने कलर ID"</string>
+ <string name="CfMmi" msgid="5123218989141573515">"कल अगाडि बढाउà¤à¤¦à¥ˆ"</string>
+ <string name="CwMmi" msgid="9129678056795016867">"कल पà¥à¤°à¤¤à¤¿à¤•à¥à¤·à¤¾"</string>
+ <string name="BaMmi" msgid="455193067926770581">"कल बà¥à¤¯à¤¾à¤°à¤¿à¤™"</string>
+ <string name="PwdMmi" msgid="7043715687905254199">"पासवरà¥à¤¡ परिवरà¥à¤¤à¤¨"</string>
+ <string name="PinMmi" msgid="3113117780361190304">"PIN परिवरà¥à¤¤à¤¨"</string>
+ <string name="CnipMmi" msgid="3110534680557857162">"पà¥à¤°à¤¸à¥à¤¤à¥à¤¤ नमà¥à¤¬à¤°à¤®à¤¾ कल गरà¥à¤¦à¥ˆ"</string>
+ <string name="CnirMmi" msgid="3062102121430548731">"कल गरà¥à¤¨à¥‡ अंक रोकेको छ।"</string>
+ <string name="ThreeWCMmi" msgid="9051047170321190368">"कल गरà¥à¤¨à¥‡ तिन तरिका"</string>
+ <string name="RuacMmi" msgid="7827887459138308886">"नचाहिà¤à¤•ा रिसउठà¥à¤¦à¤¾ कलहरूको असà¥à¤µà¥€à¤•ार"</string>
+ <string name="CndMmi" msgid="3116446237081575808">"कलिङ नमà¥à¤¬à¤° पà¥à¤°à¤¦à¤¾à¤¨ गरà¥à¤¨à¥‡"</string>
+ <string name="DndMmi" msgid="1265478932418334331">"बाधा नगरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="CLIRDefaultOnNextCallOn" msgid="429415409145781923">"सीमति गरà¥à¤¨ पूरà¥à¤µà¤¨à¤¿à¤°à¥à¤§à¤¾à¤°à¤¿à¤¤ कलर ID, अरà¥à¤•ो कल: सीमति गरिà¤à¤•ो"</string>
+ <string name="CLIRDefaultOnNextCallOff" msgid="3092918006077864624">"कलर ID पूरà¥à¤µà¤¨à¤¿à¤°à¥à¤§à¤¾à¤°à¤¿à¤¤à¤•ो लागि रोकावट छ। अरà¥à¤•ो कल: रोकावट छैन"</string>
+ <string name="CLIRDefaultOffNextCallOn" msgid="6179425182856418465">"कलर ID पूरà¥à¤µà¤¨à¤¿à¤°à¥à¤§à¤¾à¤°à¤¿à¤¤à¤¦à¥‡à¤–ि पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¿à¤¤ छैन। अरà¥à¤•ो कल: पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¿à¤¤ छ"</string>
+ <string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"कलर ID पूरà¥à¤µà¤¨à¤¿à¤°à¥à¤§à¤¾à¤°à¤¿à¤¤à¤•ो लागि रोकावट छैन। अरà¥à¤•ो कल: रोकावट छैन"</string>
+ <string name="serviceNotProvisioned" msgid="8614830180508686666">"सेवाको वà¥à¤¯à¤µà¤¸à¥à¤¥à¤¾ छैन।"</string>
+ <string name="CLIRPermanent" msgid="3377371145926835671">"तपाईं कलर ID सेटिङ परिवरà¥à¤¤à¤¨ गरà¥à¤¨ सकà¥à¤¨à¥à¤¹à¥à¤¨à¥à¤¨à¥¤"</string>
+ <string name="RestrictedChangedTitle" msgid="5592189398956187498">"पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¿à¤¤ पहà¥à¤à¤š परिवरà¥à¤¤à¤¨ भà¤à¤•ो छ"</string>
+ <string name="RestrictedOnData" msgid="8653794784690065540">"डेटा सेवा रोकिà¤à¤•ो छ।"</string>
+ <string name="RestrictedOnEmergency" msgid="6581163779072833665">"आपतकालीन सेवा रोकिà¤à¤•ो छ।"</string>
+ <string name="RestrictedOnNormal" msgid="4953867011389750673">"भà¥à¤µà¤¾à¤‡à¤¸ सेवा बà¥à¤²à¤• भà¤à¤•ो छ।"</string>
+ <string name="RestrictedOnAllVoice" msgid="3396963652108151260">"सबै आवाज सेवाहरू बनà¥à¤¦ छनà¥à¥¤"</string>
+ <string name="RestrictedOnSms" msgid="8314352327461638897">"SMS सेवा रोकिà¤à¤•ो छ।"</string>
+ <string name="RestrictedOnVoiceData" msgid="996636487106171320">"भà¥à¤µà¤¾à¤‡à¤¸/डेटा सेवाहरू रोकिà¤à¤•ा छनà¥à¥¤"</string>
+ <string name="RestrictedOnVoiceSms" msgid="1888588152792023873">"आवाज/SMS सेवाहरू बनà¥à¤¦ छनà¥à¥¤"</string>
+ <string name="RestrictedOnAll" msgid="5643028264466092821">"सबै भà¥à¤µà¤¾à¤‡à¤¸/डेटा/SMS सेवाहरू बà¥à¤²à¤• भà¤à¤•ा छनà¥à¥¤"</string>
+ <string name="serviceClassVoice" msgid="1258393812335258019">"आवाज"</string>
+ <string name="serviceClassData" msgid="872456782077937893">"डेटा"</string>
+ <string name="serviceClassFAX" msgid="5566624998840486475">"फà¥à¤¯à¤¾à¤•à¥à¤¸"</string>
+ <string name="serviceClassSMS" msgid="2015460373701527489">"SMS"</string>
+ <string name="serviceClassDataAsync" msgid="4523454783498551468">"Async"</string>
+ <string name="serviceClassDataSync" msgid="7530000519646054776">"सिङà¥à¤• गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="serviceClassPacket" msgid="6991006557993423453">"पà¥à¤¯à¤¾à¤•ेट"</string>
+ <string name="serviceClassPAD" msgid="3235259085648271037">"PAD"</string>
+ <string name="roamingText0" msgid="7170335472198694945">"रोमिङ सूचक खà¥à¤²à¤¾"</string>
+ <string name="roamingText1" msgid="5314861519752538922">"रोमिङ सूचक बनà¥à¤¦"</string>
+ <string name="roamingText2" msgid="8969929049081268115">"रोमिङ सूचक फà¥à¤²à¥à¤¯à¤¾à¤¸ गरà¥à¤¦à¥ˆ"</string>
+ <string name="roamingText3" msgid="5148255027043943317">"छिमेकबाट बाहिर"</string>
+ <string name="roamingText4" msgid="8808456682550796530">"बिलà¥à¤¡à¤¿à¤™à¤•ो बाहिर"</string>
+ <string name="roamingText5" msgid="7604063252850354350">"रोमिङ - उपयà¥à¤•à¥à¤¤ पà¥à¤°à¤£à¤¾à¤²à¥€"</string>
+ <string name="roamingText6" msgid="2059440825782871513">"रोमिङ - उपलबà¥à¤§ पà¥à¤°à¤£à¤¾à¤²à¥€"</string>
+ <string name="roamingText7" msgid="7112078724097233605">"रोमिङ - à¤à¤²à¤¿à¤¯à¤¨à¥à¤¸à¤° पारà¥à¤Ÿà¤¨à¤°"</string>
+ <string name="roamingText8" msgid="5989569778604089291">"रोमिङ - पà¥à¤°à¤¿à¤®à¤¿à¤¯à¤® पारà¥à¤Ÿà¤¨à¤°"</string>
+ <string name="roamingText9" msgid="7969296811355152491">"रोमिङ - पूरà¥à¤£ सेवा कारà¥à¤¯à¤•à¥à¤·à¤®à¤¤à¤¾ अवसà¥à¤¥à¤¾"</string>
+ <string name="roamingText10" msgid="3992906999815316417">"रोमिङ - आङà¥à¤¶à¤¿à¤• सेवा पà¥à¤°à¤•ारà¥à¤¯à¤¤à¤¾"</string>
+ <string name="roamingText11" msgid="4154476854426920970">"रोमिङ धà¥à¤µà¤œà¤¾ चालॠछ"</string>
+ <string name="roamingText12" msgid="1189071119992726320">"रोमिङ बà¥à¤¯à¤¾à¤¨à¤° बनà¥à¤¦ छ"</string>
+ <string name="roamingTextSearching" msgid="8360141885972279963">"सेवाको खोजी गरà¥à¤¦à¥ˆâ€¦"</string>
+ <string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: अगाडि पठाइà¤à¤•ो छैन"</string>
+ <string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
+ <string name="cfTemplateForwardedTime" msgid="9206251736527085256">"<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" msgid="5073237827620166285">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: अगाडि बढाइà¤à¤•ो छैन"</string>
+ <string name="cfTemplateRegisteredTime" msgid="6781621964320635172">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: अगाडि बढाइà¤à¤•ो छैन"</string>
+ <string name="fcComplete" msgid="3118848230966886575">"विशेषता कोड पà¥à¤°à¤¾ भयो।"</string>
+ <string name="fcError" msgid="3327560126588500777">"जडान समसà¥à¤¯à¤¾ वा अमानà¥à¤¯ सà¥à¤µà¤¿à¤§à¤¾ कोड।"</string>
+ <string name="httpErrorOk" msgid="1191919378083472204">"ठिक छ"</string>
+ <string name="httpError" msgid="7956392511146698522">"à¤à¤‰à¤Ÿà¤¾ नेटवरà¥à¤• तà¥à¤°à¥à¤Ÿà¤¿ थियो।"</string>
+ <string name="httpErrorLookup" msgid="4711687456111963163">"URL भेटाउन सकेन।"</string>
+ <string name="httpErrorUnsupportedAuthScheme" msgid="6299980280442076799">"साइटको आधिकारिकता योजना समरà¥à¤¥à¤¿à¤¤ छैन।"</string>
+ <string name="httpErrorAuth" msgid="1435065629438044534">"पà¥à¤°à¤®à¤¾à¤£à¥€à¤•रण गरà¥à¤¨ सकेन।"</string>
+ <string name="httpErrorProxyAuth" msgid="1788207010559081331">"पà¥à¤°à¥‹à¤•à¥à¤¸à¥€ सरà¥à¤­à¤°à¤•ो माधà¥à¤¯à¤®à¤¦à¥à¤µà¤¾à¤°à¤¾ पà¥à¤°à¤®à¤¾à¤£à¤¿à¤•रण असफल भà¤à¤•ो छ।"</string>
+ <string name="httpErrorConnect" msgid="8714273236364640549">"सरà¥à¤­à¤°à¤¸à¤à¤— जोडà¥à¤¨ सकेन।"</string>
+ <string name="httpErrorIO" msgid="2340558197489302188">"सरà¥à¤­à¤°à¤¸à¤à¤— संचार गरà¥à¤¨ सकेन। फेरि पछि कोसिस गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="httpErrorTimeout" msgid="4743403703762883954">"सरà¥à¤­à¤° संगको समà¥à¤ªà¤°à¥à¤• पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ समय सकियो।"</string>
+ <string name="httpErrorRedirectLoop" msgid="8679596090392779516">"पृषà¥à¤Ÿà¤®à¤¾ धेरै सरà¥à¤­à¤°à¤¹à¤°à¥‚तिर पà¥à¤¨à¤ƒ निरà¥à¤¦à¥‡à¤¶à¤¨à¤¹à¤°à¥‚ छनà¥à¥¤"</string>
+ <string name="httpErrorUnsupportedScheme" msgid="5015730812906192208">"पà¥à¤°à¥‹à¤Ÿà¥‹à¤•ल समरà¥à¤¥à¤¿à¤¤ छैन।"</string>
+ <string name="httpErrorFailedSslHandshake" msgid="96549606000658641">"à¤à¤‰à¤Ÿà¤¾ सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ जडान सà¥à¤¥à¤¾à¤ªà¤¨à¤¾ गरà¥à¤¨ सकेन।"</string>
+ <string name="httpErrorBadUrl" msgid="3636929722728881972">"पृषà¥à¤  खोलà¥à¤¨ सकिà¤à¤¦à¥ˆà¤¨ किनभने URL अमानà¥à¤¯ छ।"</string>
+ <string name="httpErrorFile" msgid="2170788515052558676">"फाइल भेटाउन सकेन।"</string>
+ <string name="httpErrorFileNotFound" msgid="6203856612042655084">"अनà¥à¤°à¥‹à¤§ गरिà¤à¤•ो फाइल भेटाउन सकेन।"</string>
+ <string name="httpErrorTooManyRequests" msgid="1235396927087188253">"धेरै नै अनà¥à¤°à¥‹à¤§à¤¹à¤°à¥‚ पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾à¤®à¤¾ छनà¥à¥¤ पछि फेरि पà¥à¤°à¤¯à¤¾à¤¸ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="notification_title" msgid="8967710025036163822">"<xliff:g id="ACCOUNT">%1$s</xliff:g>को लागि साइन इन तà¥à¤°à¥à¤Ÿà¤¿"</string>
+ <string name="contentServiceSync" msgid="8353523060269335667">"सिङक गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"सिङà¥à¤• गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"अति धेरै <xliff:g id="CONTENT_TYPE">%s</xliff:g> मेटà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="low_memory" product="tablet" msgid="6494019234102154896">"टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿ भणà¥à¤¡à¤¾à¤°à¤£ खाली छैन! ठाउठखाली गरà¥à¤¨à¤•ो लागि केही फाइलहरू मेटाउनà¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="low_memory" product="default" msgid="3475999286680000541">"फोन भणà¥à¤¡à¤¾à¤°à¤£ भरिà¤à¤•ो छ! ठाउठखाली गरà¥à¤¨à¤•ो लागि केही फाइलहरू मेटाउनà¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="me" msgid="6545696007631404292">"मलाई"</string>
+ <string name="power_dialog" product="tablet" msgid="8545351420865202853">"टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿ विकलà¥à¤ªà¤¹à¤°à¥‚"</string>
+ <string name="power_dialog" product="default" msgid="1319919075463988638">"फोन विकलà¥à¤ªà¤¹à¤°à¥‚"</string>
+ <string name="silent_mode" msgid="7167703389802618663">"मौन मोड"</string>
+ <string name="turn_on_radio" msgid="3912793092339962371">"वायरलेस अन गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="turn_off_radio" msgid="8198784949987062346">"ताररहित बनà¥à¤¦ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="screen_lock" msgid="799094655496098153">"सà¥à¤•à¥à¤°à¤¿à¤¨ लक गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="power_off" msgid="4266614107412865048">"पावर बनà¥à¤¦"</string>
+ <string name="silent_mode_silent" msgid="319298163018473078">"घनà¥à¤Ÿà¥€ बनà¥à¤¦ भयो"</string>
+ <string name="silent_mode_vibrate" msgid="7072043388581551395">"घनà¥à¤Ÿà¥€ कमà¥à¤ªà¤¨ गरà¥à¤›"</string>
+ <string name="silent_mode_ring" msgid="8592241816194074353">"घनà¥à¤Ÿà¤¿ चालॠछ"</string>
+ <string name="shutdown_progress" msgid="2281079257329981203">"बनà¥à¤¦ गरà¥à¤¦à¥ˆ..."</string>
+ <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"तपाईà¤à¤•ो टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿ बनà¥à¤¦ हà¥à¤¨à¥‡ छ।"</string>
+ <string name="shutdown_confirm" product="default" msgid="649792175242821353">"तपाईà¤à¤•ो फोन बनà¥à¤¦ हà¥à¤¨à¥‡ छ।"</string>
+ <string name="shutdown_confirm_question" msgid="2906544768881136183">"के तपाईं बनà¥à¤¦ गरà¥à¤¨ चाहनà¥à¤¹à¥à¤¨à¥à¤›?"</string>
+ <string name="reboot_safemode_title" msgid="7054509914500140361">"सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ मोडमा पà¥à¤¨à¤ƒà¤¬à¥à¤Ÿ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="reboot_safemode_confirm" msgid="55293944502784668">"सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ मोडमा तपाईठपà¥à¤¨à¤ƒà¤¬à¥à¤Ÿ गरà¥à¤¨ चाहनॠहà¥à¤¨à¥à¤›? तपाईà¤à¤²à¥‡ सà¥à¤¥à¤¾à¤ªà¤¨à¤¾ गरेका सबै तेसà¥à¤°à¥‹ पकà¥à¤·à¤•ा अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूलाई असकà¥à¤·à¤® गराउने छ।"</string>
+ <string name="recent_tasks_title" msgid="3691764623638127888">"नयाà¤"</string>
+ <string name="no_recent_tasks" msgid="8794906658732193473">"कà¥à¤¨à¥ˆ नयाठअनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरू छैननà¥à¥¤"</string>
+ <string name="global_actions" product="tablet" msgid="408477140088053665">"टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿ विकलà¥à¤ªà¤¹à¤°à¥‚"</string>
+ <string name="global_actions" product="default" msgid="2406416831541615258">"फोन विकलà¥à¤ªà¤¹à¤°à¥‚"</string>
+ <string name="global_action_lock" msgid="2844945191792119712">"सà¥à¤•à¥à¤°à¤¿à¤¨ बनà¥à¤¦"</string>
+ <string name="global_action_power_off" msgid="4471879440839879722">"शकà¥à¤¤à¤¿ बनà¥à¤¦"</string>
+ <string name="global_action_bug_report" msgid="7934010578922304799">"बग रिपोरà¥à¤Ÿ"</string>
+ <string name="bugreport_title" msgid="2667494803742548533">"बग रिपोरà¥à¤Ÿ लिनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="bugreport_message" msgid="398447048750350456">"à¤à¤‰à¤Ÿà¤¾ इमेल सनà¥à¤¦à¥‡à¤¶à¤•ो रूपमा पठाउनलाई यसले तपाईà¤à¤•ो हालैको उपकरणको अवसà¥à¤¥à¤¾à¤•ो बारेमा सूचना जमà¥à¤®à¤¾ गरà¥à¤¨à¥‡ छ। बग रिपोरà¥à¤Ÿ सà¥à¤°à¥ गरेदेखि पठाउन तयार नभà¤à¤¸à¤®à¥à¤® यसले केही समय लिनà¥à¤›; कृपया धैरà¥à¤¯ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"मौन मोड"</string>
+ <string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"आवाज बनà¥à¤¦ छ"</string>
+ <string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"धà¥à¤µà¤¨à¤¿ खà¥à¤²à¥à¤²à¤¾ छ"</string>
+ <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"हवाइजहाज मोड"</string>
+ <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"हवाइजहाज मोड खà¥à¤²à¤¾ छ"</string>
+ <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"हवाइजहाज मोड बनà¥à¤¦ छ"</string>
+ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"९९९+"</string>
+ <string name="safeMode" msgid="2788228061547930246">"सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ मोड"</string>
+ <string name="android_system_label" msgid="6577375335728551336">"à¤à¤¨à¥à¤¡à¥à¤°à¥‹à¤‡à¤¡ पà¥à¤°à¤£à¤¾à¤²à¥€"</string>
+ <string name="permgrouplab_costMoney" msgid="5429808217861460401">"तपाईà¤à¤²à¥‡ तिरà¥à¤¨à¥ परà¥à¤¨à¥‡ सेवाहरू"</string>
+ <string name="permgroupdesc_costMoney" msgid="3293301903409869495">"तपाईà¤à¤²à¤¾à¤ˆ महà¤à¤—ो परà¥à¤¨ सकà¥à¤¨à¥‡ कामहरू गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="permgrouplab_messages" msgid="7521249148445456662">"तपाईंका सनà¥à¤¦à¥‡à¤¶à¤¹à¤°à¥‚"</string>
+ <string name="permgroupdesc_messages" msgid="7821999071003699236">"तपाईà¤à¤•ा SMS, इमेल र अनà¥à¤¯ सनà¥à¤¦à¥‡à¤¶à¤¹à¤°à¥‚ पढà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ र लेखà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="permgrouplab_personalInfo" msgid="3519163141070533474">"तपाईà¤à¤•ो निजी सूचना"</string>
+ <string name="permgroupdesc_personalInfo" msgid="8426453129788861338">"तपाईà¤à¤•ो समà¥à¤ªà¤°à¥à¤• कारà¥à¤¡à¤®à¤¾ भणà¥à¤¡à¤¾à¤°à¤£ भà¤à¤•ा तपाईà¤à¤•ो बारेको जानकारीमा सिधा पहà¥à¤à¤š पà¥à¤°à¥â€à¤¯à¤¾à¤‰à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="permgrouplab_socialInfo" msgid="5799096623412043791">"तपाईà¤à¤•ो सामाजिक सूचना"</string>
+ <string name="permgroupdesc_socialInfo" msgid="7129842457611643493">"तपाईà¤à¤•ो समà¥à¤ªà¤°à¥à¤•हरू र सामाजिक जडानहरूको बारेको जानकारीमा सिधा पहà¥à¤à¤š पà¥à¤°à¥â€à¤¯à¤¾à¤‰à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="permgrouplab_location" msgid="635149742436692049">"तपाईà¤à¤•ो सà¥à¤¥à¤¾à¤¨"</string>
+ <string name="permgroupdesc_location" msgid="5704679763124170100">"तपाईà¤à¤•ो भौतिक सà¥à¤¥à¤¾à¤¨ निरीकà¥à¤·à¤£ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="permgrouplab_network" msgid="5808983377727109831">"नेटवरà¥à¤• संचार"</string>
+ <string name="permgroupdesc_network" msgid="4478299413241861987">"विभिनà¥à¤¨ नेटवरà¥à¤• सà¥à¤µà¤¿à¤§à¤¾à¤¹à¤°à¥‚मा पहà¥à¤à¤š राखà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="permgrouplab_bluetoothNetwork" msgid="1585403544162128109">"बà¥à¤²à¥à¤Ÿà¥à¤¥"</string>
+ <string name="permgroupdesc_bluetoothNetwork" msgid="5625288577164282391">"बà¥à¤²à¥à¤Ÿà¥à¤¥à¤•ो माधà¥à¤¯à¤®à¤¦à¥à¤µà¤¾à¤°à¤¾ उपकरणहरू र नेटवरà¥à¤•हरूमाथि पहà¥à¤à¤š राखà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="permgrouplab_audioSettings" msgid="8329261670151871235">"अडियो सेटिङहरू"</string>
+ <string name="permgroupdesc_audioSettings" msgid="2641515403347568130">"अडियो सेटिङहरू बदलà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="permgrouplab_affectsBattery" msgid="6209246653424798033">"बà¥à¤¯à¤Ÿà¥à¤°à¤¿à¤²à¤¾à¤ˆ पà¥à¤°à¤­à¤¾à¤µ पारà¥à¤›"</string>
+ <string name="permgroupdesc_affectsBattery" msgid="6441275320638916947">"छिटà¥à¤Ÿà¥ˆ बà¥à¤¯à¤¾à¤Ÿà¥à¤°à¤¿ सकाउन सकà¥à¤¨à¥‡ ती विशेषताहरू पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="permgrouplab_calendar" msgid="5863508437783683902">"पातà¥à¤°à¥‹"</string>
+ <string name="permgroupdesc_calendar" msgid="5777534316982184416">"पातà¥à¤°à¥‹ तथा घटनाहरूमा पà¥à¤°à¤¤à¥à¤¯à¤•à¥à¤· पहà¥à¤à¤š"</string>
+ <string name="permgrouplab_dictionary" msgid="4148597128843641379">"पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ शबà¥à¤¦à¤•ोश पढà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permgroupdesc_dictionary" msgid="7921166355964764490">"पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ शबà¥à¤¦à¤•ोशमा शबà¥à¤¦à¤¹à¤°à¥‚ पढà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="permgrouplab_writeDictionary" msgid="8090237702432576788">"पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ शबà¥à¤¦à¤•ोश लेखà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permgroupdesc_writeDictionary" msgid="2711561994497361646">"पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ शबà¥à¤¦à¤•ोशमा शबà¥à¤¦à¤¹à¤°à¥‚ थपà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="permgrouplab_bookmarks" msgid="1949519673103968229">"बà¥à¤•मारà¥à¤•हरू र इतिहास"</string>
+ <string name="permgroupdesc_bookmarks" msgid="4169771606257963028">"बà¥à¤•मारà¥à¤•हरू र बà¥à¤°à¤¾à¤‰à¤œà¤° इतिहासमा सिधा पहà¥à¤à¤šà¥¤"</string>
+ <string name="permgrouplab_deviceAlarms" msgid="6117704629728824101">"अलारà¥à¤®"</string>
+ <string name="permgroupdesc_deviceAlarms" msgid="4769356362251641175">"अलारà¥à¤® घडी सेट गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="permgrouplab_voicemail" msgid="4162237145027592133">"भà¥à¤µà¤¾à¤‡à¤¸ मेल"</string>
+ <string name="permgroupdesc_voicemail" msgid="2498403969862951393">"भà¥à¤µà¤¾à¤‡à¤¸à¤®à¥‡à¤²à¤®à¤¾ सिधा पहà¥à¤à¤šà¥¤"</string>
+ <string name="permgrouplab_microphone" msgid="171539900250043464">"माइकà¥à¤°à¥‹à¤«à¥‹à¤¨"</string>
+ <string name="permgroupdesc_microphone" msgid="7106618286905738408">"मा[कà¥à¤°à¥‹à¤«à¥‹à¤¨à¤¬à¤¾à¤Ÿ रेकरà¥à¤¡ अडियोमा सिधा पहà¥à¤à¤š पà¥à¤°à¥â€à¤¯à¤¾à¤‰à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="permgrouplab_camera" msgid="4820372495894586615">"कà¥à¤¯à¤¾à¤®à¥‡à¤°à¤¾"</string>
+ <string name="permgroupdesc_camera" msgid="2933667372289567714">"तसà¥à¤¬à¤¿à¤° वा भिडियो कà¥à¤¯à¤¾à¤ªà¥à¤šà¤°à¤•ो लागि कà¥à¤¯à¤¾à¤®à¥‡à¤°à¤¾à¤®à¤¾ सिधा पहà¥à¤à¤šà¥¤"</string>
+ <string name="permgrouplab_screenlock" msgid="8275500173330718168">"सà¥à¤•à¥à¤°à¤¿à¤¨ लक गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permgroupdesc_screenlock" msgid="7067497128925499401">"तपाईà¤à¤•ो उपकरणमा लक सà¥à¤•à¥à¤°à¤¿à¤¨à¤•ो वà¥à¤¯à¤µà¤¹à¤¾à¤°à¤²à¤¾à¤ˆ पà¥à¤°à¤­à¤¾à¤µà¤¿à¤¤ गरà¥à¤¨à¥‡ कà¥à¤·à¤®à¤¤à¤¾à¥¤"</string>
+ <string name="permgrouplab_appInfo" msgid="8028789762634147725">"तपाईà¤à¤•ा अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूको सूचना"</string>
+ <string name="permgroupdesc_appInfo" msgid="3950378538049625907">"तपाईà¤à¤•ो उपकरणमा अनà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूको वà¥à¤¯à¤µà¤¹à¤¾à¤°à¤®à¤¾ पà¥à¤°à¤­à¤¾à¤µ पारà¥à¤¨à¥‡ कà¥à¤·à¤®à¤¤à¤¾à¥¤"</string>
+ <string name="permgrouplab_wallpaper" msgid="3850280158041175998">"वालपेपर"</string>
+ <string name="permgroupdesc_wallpaper" msgid="5630417854750540154">"उपकरण वालपेपर सेटिङहरू बदलà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="permgrouplab_systemClock" msgid="406535759236612992">"घडी"</string>
+ <string name="permgroupdesc_systemClock" msgid="3944359833624094992">"उपकरण समय वा समय कà¥à¤·à¥‡à¤¤à¥à¤° परिवरà¥à¤¤à¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="permgrouplab_statusBar" msgid="2095862568113945398">"सà¥à¤¥à¤¿à¤¤à¤¿ पटà¥à¤Ÿà¥€"</string>
+ <string name="permgroupdesc_statusBar" msgid="6242593432226807171">"उपकरण सà¥à¤¥à¤¿à¤¤à¤¿ सेटिङहरू परिवरà¥à¤¤à¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="permgrouplab_syncSettings" msgid="3341990986147826541">"सिङà¥à¤• सेटिङहरू"</string>
+ <string name="permgroupdesc_syncSettings" msgid="7603195265129031797">"सिङà¥à¤• सेटिङहरूमा पहà¥à¤à¤š गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="permgrouplab_accounts" msgid="3359646291125325519">"तपाईà¤à¤•ा खाताहरू"</string>
+ <string name="permgroupdesc_accounts" msgid="4948732641827091312">"उपलबà¥à¤§ खाताहरू पहà¥à¤à¤š गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="permgrouplab_hardwareControls" msgid="7998214968791599326">"हारà¥à¤¡à¤µà¥‡à¤¯à¤° नियनà¥à¤¤à¥à¤°à¤£à¤¹à¤°à¥‚"</string>
+ <string name="permgroupdesc_hardwareControls" msgid="4357057861225462702">"हà¥à¤¯à¤¾à¤¨à¥à¤¡à¤¸à¥‡à¤Ÿà¤•ो हारà¥à¤¡à¤µà¥‡à¤¯à¤°à¤®à¤¾ पà¥à¤°à¤¤à¥à¤¯à¤•à¥à¤· पहà¥à¤à¤šà¥¤"</string>
+ <string name="permgrouplab_phoneCalls" msgid="9067173988325865923">"फोन कलहरू"</string>
+ <string name="permgroupdesc_phoneCalls" msgid="7489701620446183770">"अनà¥à¤—मन, रेकरà¥à¤¡ र फोन कलहरूको पà¥à¤°à¤¸à¥‹à¤§à¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥¤"</string>
+ <string name="permgrouplab_systemTools" msgid="4652191644082714048">"पà¥à¤°à¤£à¤¾à¤²à¥€ औजारहरू"</string>
+ <string name="permgroupdesc_systemTools" msgid="8162102602190734305">"निमà¥à¤¨-सà¥à¤¤à¤° पहà¥à¤à¤š र पà¥à¤°à¤£à¤¾à¤²à¥€à¤•ो नियनà¥à¤¤à¥à¤°à¤£"</string>
+ <string name="permgrouplab_developmentTools" msgid="3446164584710596513">"विकसित टà¥à¤²à¤¹à¤°à¥‚"</string>
+ <string name="permgroupdesc_developmentTools" msgid="7058828032358142018">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— विकासकरà¥à¤¤à¤¾à¤¹à¤°à¥‚को लागि मातà¥à¤° सà¥à¤µà¤¿à¤§à¤¾à¤¹à¤°à¥‚को आवशà¥à¤¯à¤•ता।"</string>
+ <string name="permgrouplab_display" msgid="4279909676036402636">"अनà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— UI"</string>
+ <string name="permgroupdesc_display" msgid="6051002031933013714">"अनà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूको UI लाई असर पारà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permgrouplab_storage" msgid="1971118770546336966">"भणà¥à¤¡à¤¾à¤°à¤£"</string>
+ <string name="permgroupdesc_storage" product="nosdcard" msgid="7442318502446874999">"USB भणà¥à¤¡à¤¾à¤°à¤£à¤®à¤¾à¤¥à¤¿ पहà¥à¤à¤š गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"SD कारà¥à¤¡à¤®à¤¾à¤¥à¤¿ पहà¥à¤à¤š गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="permgrouplab_accessibilityFeatures" msgid="7919025602283593907">"पहà¥à¤à¤šà¥€à¤•रण विशेषताहरू"</string>
+ <string name="permgroupdesc_accessibilityFeatures" msgid="4205196881678144335">"सहयोगी पà¥à¤°à¤µà¤¿à¤§à¤¿ भà¤à¤•ो विशेषताहरूले अनà¥à¤°à¥‹à¤§ गरà¥à¤¨ सकà¥à¤›à¤¨à¥à¥¤"</string>
+ <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"विनà¥à¤¡à¥‹ सामगà¥à¤°à¥€à¤•ो पà¥à¤¨à¤ƒà¤¬à¤¹à¤¾à¤²à¥€ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"तपाईà¤à¤•ो अनà¥à¤¤à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ भइरहेको विनà¥à¤¡à¥‹à¤•ो सामगà¥à¤°à¥€à¤•ो निरीकà¥à¤·à¤£ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"छोà¤à¤° गरिने खोजलाई सà¥à¤šà¤¾à¤°à¥ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="capability_desc_canRequestTouchExploration" msgid="5800552516779249356">"छोइà¤à¤•ा आइटमहरू चरà¥à¤•ो सà¥à¤µà¤°à¤®à¤¾ बोलिने छ र सà¥à¤•à¥à¤°à¤¿à¤¨ इशाराहरूको पà¥à¤°à¤¯à¥‹à¤—ले अनà¥à¤µà¥‡à¤·à¤£ गरà¥à¤¨ सकिनà¥à¤›à¥¤"</string>
+ <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"उचà¥à¤š वेब पहà¥à¤à¤šà¤²à¤¾à¤ˆ सà¥à¤šà¤¾à¤°à¥ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—को सामगà¥à¤°à¥€à¤²à¤¾à¤ˆ थप पहà¥à¤à¤šà¤¯à¥‹à¤—à¥à¤¯ बनाउन लिपिहरू सà¥à¤¥à¤¾à¤ªà¤¨à¤¾ गरà¥à¤¨ सकà¥à¤¨à¥ हà¥à¤¨à¥à¤›à¥¤"</string>
+ <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"आफà¥à¤²à¥‡ टाइप गरेको पाठको निरीकà¥à¤·à¤£ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"वà¥à¤¯à¤•à¥à¤¤à¤¿à¤—त डेटा जसà¥à¤¤à¥ˆ कà¥à¤°à¥‡à¤¡à¤¿à¤Ÿ कारà¥à¤¡ नमà¥à¤¬à¤°à¤¹à¤°à¥‚ र पासवरà¥à¤¡à¤¹à¤°à¥‚ समावेश गरà¥à¤¦à¤›à¥¤"</string>
+ <string name="permlab_statusBar" msgid="7417192629601890791">"सà¥à¤¥à¤¿à¤¤à¤¿ पटà¥à¤Ÿà¤¿à¤²à¤¾à¤ˆ अकà¥à¤·à¤® वा संशोधित गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_statusBar" msgid="8434669549504290975">"सà¥à¤¥à¤¿à¤¤à¤¿ पटà¥à¤Ÿà¤¿ असकà¥à¤·à¤® पारà¥à¤¨ वा पà¥à¤°à¤£à¤¾à¤²à¥€ आइकनहरू थपà¥à¤¨ र हटाउन अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_statusBarService" msgid="7247281911387931485">"सà¥à¤¥à¤¿à¤¤à¤¿ पटà¥à¤Ÿà¤¿"</string>
+ <string name="permdesc_statusBarService" msgid="716113660795976060">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई सà¥à¤¥à¤¿à¤¤à¤¿ पटà¥à¤Ÿà¤¿ हà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_expandStatusBar" msgid="1148198785937489264">"सà¥à¤¥à¤¿à¤¤à¤¿ पटà¥à¤Ÿà¤¿à¤²à¤¾à¤ˆ विसà¥à¤¤à¥ƒà¤¤/सङà¥à¤•à¥à¤šà¤¿à¤¤ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_expandStatusBar" msgid="6917549437129401132">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई सà¥à¤¥à¤¿à¤¤à¤¿ पटà¥à¤Ÿà¤¿ विसà¥à¤¤à¤¾à¤° वा संकà¥à¤šà¤¨ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"बहिरà¥à¤—मन कलहरूलाई अरà¥à¤•ो मारà¥à¤— दिनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_processOutgoingCalls" msgid="5331318931937402040">"बहिरà¥à¤—मन कलहरूको पà¥à¤°à¤¶à¥‹à¤§à¤¨ गरà¥à¤¨ र डायल गरिने नमà¥à¤¬à¤° परिवरà¥à¤¤à¤¨ गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ यो अनà¥à¤®à¤¤à¤¿à¤²à¥‡ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई मोनिटर गरà¥à¤¨, अनà¥à¤¯à¤¤à¥à¤° पठाउन वा बाहिर जाने कलहरूलाई रोकà¥à¤¨ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_receiveSms" msgid="8673471768947895082">"पाठ सनà¥à¤¦à¥‡à¤¶à¤¹à¤°à¥‚ (SMS) पà¥à¤°à¤¾à¤ªà¥à¤¤ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_receiveSms" msgid="6424387754228766939">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई SMS सनà¥à¤¦à¥‡à¤¶à¤¹à¤°à¥‚ पà¥à¤°à¤¾à¤ªà¥à¤¤ गरà¥à¤¨ र पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ यसको मतलब अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—ले तपाईंको उपकरणमा पठाइà¤à¤•ो सनà¥à¤¦à¥‡à¤¶à¤¹à¤°à¥‚ तपाईंलाई नदेखाईनै मोनिटर गरà¥à¤¨ वा मेटाउन सकà¥à¤¦à¤›à¥¤"</string>
+ <string name="permlab_receiveMms" msgid="1821317344668257098">"पाठ सनà¥à¤¦à¥‡à¤¶ (MMS) पà¥à¤°à¤¾à¤ªà¥à¤¤ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_receiveMms" msgid="533019437263212260">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई MMS सनà¥à¤¦à¥‡à¤¶à¤¹à¤°à¥‚ पà¥à¤°à¤¾à¤ªà¥à¤¤ गरà¥à¤¨ र पà¥à¤°à¤•ृया गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ यसको मतलब अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—ले तपाईंको उपकरणमा पठाइà¤à¤•ो सनà¥à¤¦à¥‡à¤¶à¤¹à¤°à¥‚ तपाईंलाई नदेखाईनै मोनिटर गरà¥à¤¨ वा मेटाउन सकà¥à¤¦à¤›à¥¤"</string>
+ <string name="permlab_receiveEmergencyBroadcast" msgid="1803477660846288089">"आकसà¥à¤®à¤¿à¤• पà¥à¤°à¤¸à¤¾à¤°à¤£à¤¹à¤°à¥‚ पà¥à¤°à¤¾à¤ªà¥à¤¤ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_receiveEmergencyBroadcast" msgid="848524070262431974">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई आपतकालीन पà¥à¤°à¤¸à¤¾à¤°à¤£ सनà¥à¤¦à¥‡à¤¶à¤¹à¤°à¥‚ पà¥à¤°à¤¾à¤ªà¥à¤¤ गरà¥à¤¨ र पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ यो अनà¥à¤®à¤¤à¤¿ पà¥à¤°à¤£à¤¾à¤²à¥€ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूमा मातà¥à¤° उपलबà¥à¤§ छ।"</string>
+ <string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"सेल पà¥à¤°à¤¸à¤¾à¤°à¤¿à¤¤ सनà¥à¤¦à¥‡à¤¶à¤¹à¤°à¥‚ पढà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"तपाईंको उपकरणदà¥à¤µà¤¾à¤°à¤¾ पà¥à¤°à¤¾à¤ªà¥à¤¤ सेल पà¥à¤°à¤¸à¤¾à¤°à¤£ सनà¥à¤¦à¥‡à¤¶à¤¹à¤°à¥‚ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई पढà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ सेल पà¥à¤°à¤¸à¤¾à¤°à¤£ चेतावनीहरू केही सà¥à¤¥à¤¾à¤¨à¤¹à¤°à¥‚मा तपाईंलाई आपतकालीन गतिविधिहरूको बारेमा सचेत गराउन गरिà¤à¤•ा छनà¥à¥¤ खराब अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूले à¤à¤‰à¤Ÿà¤¾ आपतकालीन सेल पà¥à¤°à¤¸à¤¾à¤°à¤£ पà¥à¤°à¤¾à¤ªà¥à¤¤ गरà¥à¤¦à¤› जब तपाईंको उपकरणको पà¥à¤°à¤¦à¤°à¥à¤¶à¤¨ वा अपरेशनको साथ हसà¥à¤¤à¤•à¥à¤·à¥‡à¤ª गरà¥à¤¨ सकà¥à¤¦à¤›à¤¨à¥à¥¤"</string>
+ <string name="permlab_sendSms" msgid="5600830612147671529">"SMS सनà¥à¤¦à¥‡à¤¶à¤¹à¤°à¥‚ पठाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_sendSms" msgid="7094729298204937667">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई SMS सनà¥à¤¦à¥‡à¤¶à¤¹à¤°à¥‚ पठाउन अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ यसले अपà¥à¤°à¤¤à¥à¤¯à¤¾à¤¸à¤¿à¤¤ चारà¥à¤œà¤¹à¤°à¥‚को परिणाम दिन सकà¥à¤¦à¤›à¥¤ खराब अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूले तपाईंको पà¥à¤·à¥à¤Ÿà¤¿ बिना सनà¥à¤¦à¥‡à¤¶à¤¹à¤°à¥‚ पठाà¤à¤° तपाईंको पैसा खरà¥à¤š गराउन सकà¥à¤¦à¤›à¥¤"</string>
+ <string name="permlab_sendRespondViaMessageRequest" msgid="8713889105305943200">"पà¥à¤°à¤¤à¤¿à¤•à¥à¤°à¤¿à¤¯à¤¾-मारà¥à¤«à¤¤-सनà¥à¤¦à¥‡à¤¶ घटनाहरू पठाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_sendRespondViaMessageRequest" msgid="7107648548468778734">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई आगत कलहरूको लागि पà¥à¤°à¤¤à¤¿à¤•à¥à¤°à¤¿à¤¯à¤¾-मारà¥à¤«à¤¤-सनà¥à¤¦à¥‡à¤¶ घटनाहरूलाई अनà¥à¤¯ सनà¥à¤¦à¥‡à¤¶ पठाउने अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूमा अनà¥à¤°à¥‹à¤§à¤¹à¤°à¥‚ पठाउन अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_readSms" msgid="8745086572213270480">"तपाईंका पाठ सनà¥à¤¦à¥‡à¤¶à¤¹à¤°à¥‚ (SMS वा MMS) पढà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"तपाईà¤à¤•ो टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿ वा SIM कारà¥à¤¡à¤®à¤¾ भणà¥à¤¡à¤¾à¤°à¤£ भà¤à¤•ा SMS सनà¥à¤¦à¥‡à¤¶à¤¹à¤°à¥‚लाई पढà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ यसले अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई विषयवसà¥à¤¤à¥ वा गोपनीयतालाई वेवासà¥à¤¤à¤¾ गरà¥à¤¦à¥ˆ सबै SMS सनà¥à¤¦à¥‡à¤¶à¤¹à¤°à¥‚ पढà¥à¤¨à¥‡ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permdesc_readSms" product="default" msgid="3695967533457240550">"तपाईà¤à¤•ो फोन वा SIM कारà¥à¤¡à¤®à¤¾ भणà¥à¤¡à¤¾à¤°à¤£ भà¤à¤•ा SMS सनà¥à¤¦à¥‡à¤¶à¤¹à¤°à¥‚लाई पढà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ यसले सबै SMS सनà¥à¤¦à¥‡à¤¶à¤¹à¤°à¥‚लाई पढà¥à¤¨à¤•ो लागि सामगà¥à¤°à¥€ वा विशà¥à¤µà¤¸à¤¨à¤¿à¤¯à¤¤à¤¾ बिना नै अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_writeSms" msgid="3216950472636214774">"तपाईà¤à¤•ा पाठ सनà¥à¤¦à¥‡à¤¶à¤¹à¤°à¥‚ समà¥à¤ªà¤¾à¤¦à¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ (SMS वा MMS)"</string>
+ <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई तपाईंको टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿ वा SIM कारà¥à¤¡à¤®à¤¾ भणà¥à¤¡à¤¾à¤° गरिà¤à¤•ा SMS सनà¥à¤¦à¥‡à¤¶à¤¹à¤°à¥‚ लेखà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ खराब अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूले तपाईंको सनà¥à¤¦à¥‡à¤¶à¤¹à¤°à¥‚ मेटाउन सकà¥à¤¦à¤›à¥¤"</string>
+ <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"तपाईà¤à¤•ो फोन वा SIM कारà¥à¤¡à¤®à¤¾ भणà¥à¤¡à¤¾à¤°à¤£ भà¤à¤•ा SMS सनà¥à¤¦à¥‡à¤¶à¤¹à¤°à¥‚लाई लेखà¥â€à¤¨à¤•ो लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ खराब अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूले सायद तपाईà¤à¤•ो सनà¥à¤¦à¥‡à¤¶à¤¹à¤°à¥‚ मेटाउन सकà¥à¤›à¤¨à¥à¥¤"</string>
+ <string name="permlab_receiveWapPush" msgid="5991398711936590410">"पाठ सनà¥à¤¦à¥‡à¤¶à¤¹à¤°à¥‚ (WAP) पà¥à¤°à¤¾à¤ªà¥à¤¤ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_receiveWapPush" msgid="748232190220583385">"WAP सनà¥à¤¦à¥‡à¤¶à¤¹à¤°à¥‚ पà¥à¤°à¤¾à¤ªà¥à¤¤ गरà¥à¤¨ र पà¥à¤°à¤¶à¥‹à¤§à¤¨ गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ यो अनà¥à¤®à¤¤à¤¿à¤®à¤¾ मोनिटर गरà¥à¤¨à¥‡ वा तपाईà¤à¤²à¤¾à¤ˆ पठाइà¤à¤•ा सनà¥à¤¦à¥‡à¤¶à¤¹à¤°à¥‚ तपाईà¤à¤²à¤¾à¤ˆ नदेखाई मेटà¥à¤¨à¥‡ कà¥à¤·à¤®à¤¤à¤¾ समावेश हà¥à¤¨à¥à¤›à¥¤"</string>
+ <string name="permlab_getTasks" msgid="6466095396623933906">"चलिरहेका अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरू पà¥à¤¨à¤ƒà¤¬à¤¹à¤¾à¤²à¥€ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_getTasks" msgid="7454215995847658102">"वरà¥à¤¤à¤®à¤¾à¤¨à¤®à¤¾ र भरखरै चलिरहेका कारà¥à¤¯à¤¹à¤°à¥‚ बारेको सूचना पà¥à¤¨à¤ƒà¤¬à¤¹à¤¾à¤²à¥€ गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¿à¤¤ दिनà¥à¤›à¥¤ यसले उपकरणमा पà¥à¤°à¤¯à¥‹à¤— भà¤à¤•ा अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूको बारेमा सूचना पतà¥à¤¤à¤¾ लगाउन अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिन सकà¥à¤›à¥¤"</string>
+ <string name="permlab_interactAcrossUsers" msgid="7114255281944211682">"पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤¹à¤°à¥‚ तरà¥à¤« अनà¥à¤¤à¤°à¥à¤•à¥à¤°à¤¿à¤¯à¤¾ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_interactAcrossUsers" msgid="364670963623385786">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई उपकरणमा विभिनà¥à¤¨ पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤¹à¤°à¥‚ मारà¥à¤«à¤¤ कारà¥à¤¯à¤¹à¤°à¥‚ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ खराब अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूले यो पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤¹à¤°à¥‚ बिच सà¥à¤°à¤•à¥à¤·à¤¾ बिथोलà¥à¤¨ पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨ सकà¥à¤¨à¥‡ छनà¥à¥¤"</string>
+ <string name="permlab_interactAcrossUsersFull" msgid="2567734285545074105">"कà¥à¤°à¤¾à¤•ानी पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤¹à¤°à¥‚ बिच अनà¥à¤¤à¤°à¥à¤•à¥à¤°à¤¿à¤¯à¤¾ गरà¥à¤¨ पूरà¥à¤£ अनà¥à¤®à¤¤à¤¿"</string>
+ <string name="permdesc_interactAcrossUsersFull" msgid="376841368395502366">"पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤¸à¤à¤—को कà¥à¤°à¤¾à¤•ानी सबै समà¥à¤­à¤¾à¤µà¤¨à¤¾à¤²à¤¾à¤ˆ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_manageUsers" msgid="1676150911672282428">"पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤¹à¤°à¥‚ वà¥à¤¯à¤µà¤¸à¥à¤¥à¤¾à¤ªà¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_manageUsers" msgid="8409306667645355638">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई उपकरणमा, पà¥à¤°à¤¶à¥à¤¨, सिरà¥à¤œà¤¨à¤¾ र मेटाइसहित पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤¹à¤°à¥‚को पà¥à¤°à¤¬à¤¨à¥à¤§ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_getDetailedTasks" msgid="6229468674753529501">"चलिरहेका अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूको विवरण पà¥à¤¨à¤ƒà¤¬à¤¹à¤¾à¤²à¥€ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_getDetailedTasks" msgid="153824741440717599">"वरà¥à¤¤à¤®à¤¾à¤¨à¤®à¤¾ र भरखरै चलिरहेका कारà¥à¤¯à¤¹à¤°à¥‚को बारेमा विसà¥à¤¤à¥ƒà¤¤ सूचना पà¥à¤¨à¤ƒà¤¬à¤¹à¤¾à¤²à¥€ गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ खराब अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूले अनà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरू बारेको निजी सूचना पतà¥à¤¤à¤¾ लगाउन सकà¥à¤›à¥¤"</string>
+ <string name="permlab_reorderTasks" msgid="2018575526934422779">"चलिरहेका अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूलाई पà¥à¤¨à¤ƒà¤•à¥à¤°à¤® गराउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_reorderTasks" msgid="7734217754877439351">"कामहरूलाई अगà¥à¤°à¤­à¤¾à¤— र पृषà¥à¤ à¤­à¥‚मिमा सारà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—ले यो तपाईà¤à¤•ो इनपà¥à¤Ÿ बिना नै गरà¥à¤¨ सकà¥à¤›à¥¤"</string>
+ <string name="permlab_removeTasks" msgid="6821513401870377403">"चालॠभइरहेका अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरू रोकà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_removeTasks" msgid="1394714352062635493">"कामहरू हटाउन र उनीहरूको अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूलाई बनà¥à¤¦ गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ खराब अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूले अनà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूको वà¥à¤¯à¤µà¤¹à¤¾à¤°à¤²à¤¾à¤ˆ अबरोध गरà¥à¤¨ सकà¥à¤›à¤¨à¥à¥¤"</string>
+ <string name="permlab_manageActivityStacks" msgid="7391191384027303065">"activity stacks को पà¥à¤°à¤¬à¤¨à¥à¤§ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_manageActivityStacks" msgid="1615881933034084440">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरू चलà¥à¤¨à¥‡ activity stacks लाई थपà¥à¤¨, हटाउन र परिवरà¥à¤¤à¤¨ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ खराब अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूले अनà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूको वà¥à¤¯à¤µà¤¹à¤¾à¤°à¤²à¤¾à¤ˆ विघटन गरà¥à¤¨ सकà¥à¤›à¤¨à¥à¥¤"</string>
+ <string name="permlab_startAnyActivity" msgid="2918768238045206456">"कà¥à¤¨à¥ˆ गतिविधि सà¥à¤°à¥ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_startAnyActivity" msgid="997823695343584001">"अनà¥à¤®à¤¤à¤¿ सà¥à¤°à¤•à¥à¤·à¤¾ वा निरà¥à¤¯à¤¾à¤¤ अवसà¥à¤¥à¤¾à¤²à¤¾à¤ˆ वासà¥à¤¤à¤¾ नगरिकन कà¥à¤¨à¥ˆ पनि कारà¥à¤¯ सà¥à¤°à¥ गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_setScreenCompatibility" msgid="6975387118861842061">"सà¥à¤•à¥à¤°à¤¿à¤¨ अनà¥à¤•ूलता सेट गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_setScreenCompatibility" msgid="692043618693917374">"अनà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤¹à¤°à¥‚को सà¥à¤•à¥à¤°à¤¿à¤¨ मिलà¥à¤¦à¥‹ मोडलाई नियनà¥à¤¤à¥à¤°à¤£ गरà¥à¤¨à¤•ो लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ अनà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤¹à¤°à¥‚को वà¥à¤¯à¤µà¤¹à¤¾à¤° खराब अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूले टà¥à¤Ÿà¤¾à¤‰à¤¨ सकà¥à¤›à¤¨à¥à¥¤"</string>
+ <string name="permlab_setDebugApp" msgid="3022107198686584052">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— डिबग गरà¥à¤¨à¥‡ सकà¥à¤·à¤® गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_setDebugApp" msgid="4474512416299013256">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—को लागि डिबग गरà¥à¤¨à¥‡ पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ चालॠगरà¥à¤¨à¥‡ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ खराब अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—ले अरू अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरू समापà¥à¤¤ गरà¥à¤¨ यसको उपयोग गरà¥à¤¨ सकà¥à¤¦à¤›à¥¤"</string>
+ <string name="permlab_changeConfiguration" msgid="4162092185124234480">"पà¥à¤°à¤£à¤¾à¤²à¥€ पà¥à¤°à¤¦à¤°à¥à¤¶à¤¨ सेटिङहरू परिवरà¥à¤¤à¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_changeConfiguration" msgid="4372223873154296076">"वरà¥à¤¤à¤®à¤¾à¤¨ कनà¥à¤«à¤¿à¤—रेसन जसà¥à¤¤à¥ˆ लोकà¥à¤¯à¤¾à¤² वा सबैतिर फनà¥à¤Ÿ आकार बदलà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_enableCarMode" msgid="5684504058192921098">"कार मोड सकà¥à¤·à¤® गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_enableCarMode" msgid="4853187425751419467">"कार मोडलाई सकà¥à¤·à¤® पारà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_killBackgroundProcesses" msgid="3914026687420177202">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरू बनà¥à¤¦ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूको पृषà¥à¤ à¤­à¥‚मि पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾à¤¹à¤°à¥‚ बनà¥à¤¦ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ यसले अनà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूलाई चलà¥à¤¨à¤¬à¤¾à¤Ÿ रोकà¥à¤¨ सकà¥à¤¦à¤›à¥¤"</string>
+ <string name="permlab_forceStopPackages" msgid="2329627428832067700">"अनà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरू दबाबमा रोकà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_forceStopPackages" msgid="5253157296183940812">"अनà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूलाई बलपूरà¥à¤µà¤• बनà¥à¤¦ गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_forceBack" msgid="652935204072584616">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— बनà¥à¤¦ गरà¥à¤¨ बल गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_forceBack" msgid="3892295830419513623">"अगà¥à¤°à¤­à¤¾à¤—मा भà¤à¤•ो कà¥à¤¨à¥ˆ गतिविधिलाई जबरजसà¥à¤¤à¥€ बनà¥à¤¦ गरà¥à¤¨ र फरà¥à¤•ेर जानका लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ सामानà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूलाइ कहिलà¥à¤¯à¥ˆ आवशà¥à¤¯à¤•ता परà¥à¤¦à¥ˆà¤¨à¥¤"</string>
+ <string name="permlab_dump" msgid="1681799862438954752">"पà¥à¤°à¤£à¤¾à¤²à¥€à¤•ो आनà¥à¤¤à¤°à¤¿à¤• सà¥à¤¥à¤¿à¤¤à¤¿ पà¥à¤°à¤¾à¤ªà¥à¤¤ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_dump" msgid="1778299088692290329">"पà¥à¤°à¤£à¤¾à¤²à¥€à¤•ो आनà¥à¤¤à¤°à¤¿à¤• सà¥à¤¥à¤¿à¤¤à¤¿ पà¥à¤¨à¤ƒà¤¬à¤¹à¤¾à¤²à¥€ गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ खराब अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूले उनीहरूलाई सामानà¥à¤¯à¤¤à¤ƒ कहिलà¥à¤¯à¥ˆ नचाहिने वà¥à¤¯à¤¾à¤ªà¤• विविधताको निजी र सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ सूचना पà¥à¤¨à¤ƒà¤¬à¤¹à¤¾à¤²à¥€ गरà¥à¤¨ सकà¥à¤›à¤¨à¥à¥¤"</string>
+ <string name="permlab_retrieve_window_content" msgid="8022588608994589938">"सà¥à¤•à¥à¤°à¤¿à¤¨ सामगà¥à¤°à¥€ बहाली गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_retrieve_window_content" msgid="3193269069469700265">"सकà¥à¤°à¤¿à¤¯ विनà¥à¤¡à¥‹à¤•ो विषयवसà¥à¤¤à¥à¤²à¤¾à¤ˆ पà¥à¤¨à¤ƒà¤¬à¤¹à¤¾à¤²à¥€ गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ खराब अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूले पà¥à¤°à¥ˆ विनà¥à¤¡à¥‹à¤•ो विषयवसà¥à¤¤à¥ पà¥à¤¨à¤ƒà¤¬à¤¹à¤¾à¤²à¥€ गरà¥à¤¨ सकà¥à¤›à¤¨à¥ र पासवरà¥à¤¡à¤¹à¤°à¥‚बाहेक यसका सबै पाठको जाà¤à¤š गरà¥à¤¨ सकà¥à¤›à¤¨à¥à¥¤"</string>
+ <string name="permlab_temporary_enable_accessibility" msgid="2312612135127310254">"पहà¥à¤à¤šà¤¤à¤¾à¤²à¤¾à¤ˆ असà¥à¤¥à¤¾à¤¯à¥€ सकà¥à¤·à¤® गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_temporary_enable_accessibility" msgid="8079456293182975464">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई असà¥à¤¥à¤¾à¤¯à¥€ रूपमा उपकरणमाथि पहà¥à¤à¤š राखà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ खराब अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—ले उपयोगकरà¥à¤¤à¤¾à¤•ो सहमति बिना नै पहà¥à¤à¤šà¤²à¤¾à¤ˆ सकà¥à¤·à¤® गरà¥à¤¨ सकà¥à¤¦à¤›à¥¤"</string>
+ <string name="permlab_retrieve_window_info" msgid="8532295199112519378">"विनà¥à¤¡à¥‹ जानकारी बहाली गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_retrieve_window_info" msgid="4998836370424186849">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई विनà¥à¤¡à¥‹ वà¥à¤¯à¤µà¤¸à¥à¤¥à¤¾à¤ªà¤•बाट विनà¥à¤¡à¥‹à¤¹à¤°à¥‚को बारेमा जानकारी पà¥à¤°à¤¾à¤ªà¥à¤¤ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ खराब अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—ले आनà¥à¤¤à¤°à¤¿à¤• पà¥à¤°à¤£à¤¾à¤²à¥€ उपयोगको लागि निमितà¥à¤¤ जानकारी पनि पà¥à¤°à¤¾à¤ªà¥à¤¤ गरà¥à¤¨ सकà¥à¤¦à¤›à¥¤"</string>
+ <string name="permlab_filter_events" msgid="8675535648807427389">"घटनाहरू छानà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_filter_events" msgid="8006236315888347680">"इनà¥à¤ªà¥à¤Ÿ फिलà¥à¤Ÿà¤° जà¥à¤¨ सबै पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ घटनाहरू पठाइनà¥à¤­à¤¨à¥à¤¦à¤¾ पहिले फिलà¥à¤Ÿà¤° गरà¥à¤¨à¥‡à¤²à¤¾à¤ˆ दरà¥à¤¤à¤¾ गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤•ो हसà¥à¤¤à¤•à¥à¤·à¥‡à¤ª बिना नै UI पà¥à¤°à¤£à¤¾à¤²à¥€ खराब अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—ले नियनà¥à¤¤à¥à¤°à¤£ गरà¥à¤¨ सकà¥à¤›à¤¨à¥à¥¤"</string>
+ <string name="permlab_magnify_display" msgid="5973626738170618775">"पà¥à¤°à¤¦à¤°à¥à¤¶à¤¨ बढाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_magnify_display" msgid="7121235684515003792">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई पà¥à¤°à¤¦à¤°à¥à¤¶à¤¨à¤•ो सामगà¥à¤°à¥€ आवरà¥à¤§à¤¨ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ खराब अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूले पà¥à¤°à¤¦à¤°à¥à¤¶à¤¨ सामगà¥à¤°à¥€ संकà¥à¤°à¤®à¤£ गरà¥à¤¨ सकà¥à¤¦à¤›à¤¨à¥ जसले उपकरणलाई अनà¥à¤ªà¤¯à¥‹à¤—ी बनाउà¤à¤¦à¤›à¥¤"</string>
+ <string name="permlab_shutdown" msgid="7185747824038909016">"आंशिक बनà¥à¤¦"</string>
+ <string name="permdesc_shutdown" msgid="7046500838746291775">"गतिविधि वà¥à¤¯à¤µà¤¸à¥à¤¥à¤¾à¤ªà¤•लाई बनà¥à¤¦ गरà¥à¤¨à¥‡ अवसà¥à¤¥à¤¾à¤®à¤¾ राखà¥à¤›à¥¤ पूरà¥à¤£ बनà¥à¤¦ गरà¥à¤¨à¥‡ काम गरà¥à¤¦à¥ˆà¤¨à¥¤"</string>
+ <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— सà¥à¤µà¤¿à¤šà¤¹à¤°à¥‚ जोगाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_stopAppSwitches" msgid="8262195802582255021">"अनà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—मा सà¥à¤µà¤¿à¤š गरà¥à¤¨à¤¬à¤¾à¤Ÿ पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤¹à¤°à¥‚लाई रोकà¥à¤›à¥¤"</string>
+ <string name="permlab_getTopActivityInfo" msgid="2537922311411546016">"वरà¥à¤¤à¤®à¤¾à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—को जानकारी पà¥à¤°à¤¾à¤ªà¥à¤¤ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_getTopActivityInfo" msgid="8153651434145132505">"सà¥à¤•à¥à¤°à¤¿à¤¨à¤•ो अगà¥à¤° भागमा हालको अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— र सेवाहरूका बारे निजी जानकारी निकालà¥à¤¨ बाहकलाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_runSetActivityWatcher" msgid="892239094867182656">"सबै अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— सà¥à¤°à¥à¤µà¤¾à¤¤ गरà¥à¤¨à¥‡ निरीकà¥à¤·à¤£ र नियनà¥à¤¤à¥à¤°à¤£ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई कसरी पà¥à¤°à¤£à¤¾à¤²à¥€ सà¥à¤°à¥à¤µà¤¾à¤¤ गतिहरू मोनिटर गरà¥à¤¨ र नियनà¥à¤¤à¥à¤°à¤£ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ खराब अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूले पà¥à¤°à¤£à¤¾à¤²à¥€à¤®à¤¾ पूरà¥à¤£ सहमत गरà¥à¤¨ सकà¥à¤¦à¤›à¥¤ यो अनà¥à¤®à¤¤à¤¿ केवल विकासको लागि आवशà¥à¤¯à¤• छ, साधारण पà¥à¤°à¤¯à¥‹à¤—को लागि कहिले होइन।"</string>
+ <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"पà¥à¤¯à¤¾à¤•ेज हटाइà¤à¤•ो पà¥à¤°à¤¸à¤¾à¤°à¤£à¤²à¤¾à¤ˆ पठाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_broadcastPackageRemoved" msgid="6621901216207931089">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई सूचना पà¥à¤°à¤¸à¤¾à¤°à¤£ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤› जà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— पà¥à¤¯à¤¾à¤•ेज हटाइà¤à¤•ो छ। खराब अनà¥à¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूले यो कà¥à¤¨à¥ˆ अनà¥à¤¯ चालॠअनà¥à¥à¤ªà¥à¤°à¤¯à¥‹à¤— बनà¥à¤¦ गरà¥à¤¨ पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨ सकà¥à¤¦à¤›à¤¨à¥à¥¤"</string>
+ <string name="permlab_broadcastSmsReceived" msgid="5689095009030336593">"SMS-पà¥à¤°à¤¾à¤ªà¥à¤¤ पà¥à¤°à¤¸à¤¾à¤°à¤£ पठाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"तà¥à¤¯à¥‹ à¤à¤‰à¤Ÿà¤¾ SMS सनà¥à¤¦à¥‡à¤¶à¤¬à¤¾à¤Ÿ पà¥à¤°à¤¾à¤ªà¥à¤¤ भà¤à¤•ो सूचनालाई पà¥à¤°à¤¸à¤¾à¤°à¤£ गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ आउà¤à¤¦à¥ˆ गरेको SMS सनà¥à¤¦à¥‡à¤¶à¤¹à¤°à¥‚लाई जालसाजी गरà¥à¤¨ सायद खराब भà¤à¤•ा अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूले यसलाई पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨ सकà¥à¤›à¤¨à¥à¥¤"</string>
+ <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"WAP-PUSH-पà¥à¤°à¤¾à¤ªà¥à¤¤ पà¥à¤°à¤¸à¤¾à¤°à¤£ पठाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई सूचना पà¥à¤°à¤¸à¤¾à¤°à¤£ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤› जà¥à¤¨ à¤à¤‰à¤Ÿà¤¾ WAP PUSH सनà¥à¤¦à¥‡à¤¶ पà¥à¤°à¤¾à¤ªà¥à¤¤ भà¤à¤•ो छ। खराब अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूले यो MMS सनà¥à¤¦à¥‡à¤¶ बिगारà¥à¤¨ वा मौन तरिकाले कà¥à¤¨à¥ˆ पनि वेबपृषà¥à¤ à¤•ो सामगà¥à¤°à¥€ खराब विभेदहरूसà¤à¤— बदलà¥à¤¨ पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨ सकà¥à¤¦à¤›à¤¨à¥à¥¤"</string>
+ <string name="permlab_setProcessLimit" msgid="2451873664363662666">"चालॠपà¥à¤°à¤¶à¥‹à¤§à¤¨à¤¹à¤°à¥‚को सङà¥à¤–à¥à¤¯à¤¾ सीमति गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_setProcessLimit" msgid="7318061314040879542">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई चालॠहà¥à¤¨à¥‡ पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾à¤¹à¤°à¥‚को अधिकतम संखà¥à¤¯à¤¾ नियनà¥à¤¤à¥à¤°à¤£ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ साधारण अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूको लागि कहिले पनि आवशà¥à¤¯à¤• नपरà¥à¤¨ सकà¥à¤¦à¤›à¥¤"</string>
+ <string name="permlab_setAlwaysFinish" msgid="550958507798796965">"पृषà¥à¤ à¤­à¥‚मि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरू बनà¥à¤¦ गरà¥à¤¨ दबाब दिनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_setAlwaysFinish" msgid="7471310652868841499">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई गतिविधिहरू सधैठसमापà¥à¤¤ भयो कि भà¤à¤¨ जब कि जति सकà¥à¤¦à¥‹ तिनीहरू पृषà¥à¤ à¤­à¥‚मिमा जानà¥à¤›à¤¨à¥ भनà¥à¤¨à¥‡ नियनà¥à¤¤à¥à¤°à¤£ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ साधारण अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूको लागि कहिले पनि आवशà¥à¤¯à¤• नपरà¥à¤¨ सकà¥à¤¦à¤›à¥¤"</string>
+ <string name="permlab_batteryStats" msgid="2789610673514103364">"बà¥à¤¯à¤¾à¤Ÿà¥à¤°à¤¿ तथà¥à¤¯à¤¾à¤™à¥à¤¹à¤°à¥‚ पढà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_batteryStats" msgid="5897346582882915114">"वरà¥à¤¤à¤®à¤¾à¤¨ थोरै बà¥à¤¯à¤¾à¤Ÿà¥à¤°à¥€ पà¥à¤°à¤¯à¥‹à¤— डेटा पढà¥à¤¨à¤•ो लागि à¤à¤• अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—ले अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ जà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— तपाईà¤à¤²à¥‡ पà¥à¤°à¤¯à¥‹à¤— गरीरहनà¥à¤­à¤à¤•ो छ तà¥à¤¯à¤¸à¥à¤•ो बारेका पà¥à¤°à¥à¤£ जानकारी पà¥à¤°à¤¾à¤ªà¥à¤¤ गरà¥à¤¨ सायद अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—ले अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_updateBatteryStats" msgid="3719689764536379557">"बà¥à¤¯à¤¾à¤Ÿà¥à¤°à¤¿ तथà¥à¤¯à¤¾à¤™à¥à¤•लाई परिमारà¥à¤œà¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई संकलित बà¥à¤¯à¤¾à¤Ÿà¥à¤°à¤¿ तथà¥à¤¯à¤¾à¤™à¥à¤•हरू परिमारà¥à¤œà¤¨ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ साधारण अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूको पà¥à¤°à¤¯à¥‹à¤—को लागि होइन।"</string>
+ <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— संचालनका तथà¥à¤¯à¤¾à¤™à¥à¤•हरू पà¥à¤¨à¤ƒà¤¬à¤¹à¤¾à¤²à¥€ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"सङà¥à¤•लन गरिà¤à¤•ा अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— संचालन तथà¥à¤¯à¤¾à¤™à¥à¤²à¤¾à¤ˆ पà¥à¤¨à¤ƒ पà¥à¤°à¤¾à¤ªà¥à¤¤ गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ सामानà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—बाट पà¥à¤°à¤¯à¥‹à¤—को लागि होइन।"</string>
+ <string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— संचलान तथà¥à¤¯à¤¾à¤™à¥à¤•हरूलाई परिमारà¥à¤œà¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"सङà¥à¤•लन गरिà¤à¤•ा अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— संचालन तथà¥à¤¯à¤¾à¤™à¥à¤²à¤¾à¤ˆ परिमारà¥à¤œà¤¨ गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ सामानà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—बाट पà¥à¤°à¤¯à¥‹à¤—को लागि होइन।"</string>
+ <string name="permlab_backup" msgid="470013022865453920">"पà¥à¤°à¤£à¤¾à¤²à¥€ बà¥à¤¯à¤•अप नियनà¥à¤¤à¥à¤°à¤£ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ र पà¥à¤¨à¤ƒ बहाली गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_backup" msgid="6912230525140589891">"पà¥à¤°à¤£à¤¾à¤²à¥€à¤•ो जगेडा नियनà¥à¤¤à¥à¤°à¤£ गरà¥à¤¨ र पà¥à¤¨à¤ƒà¤ªà¥à¤°à¤¾à¤ªà¥à¤¤à¤¿à¤•ो संयोजन गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¿à¤¤ दिनà¥à¤›à¥¤ सामानà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—दà¥à¤µà¤¾à¤°à¤¾ पà¥à¤°à¤¯à¥‹à¤—को लागि होइन।"</string>
+ <string name="permlab_confirm_full_backup" msgid="5557071325804469102">"पूरà¥à¤£ जगेडा गरà¥à¤¨ वा पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ पà¥à¤¨à¤ƒà¤¬à¤¹à¤¾à¤²à¥€ गरà¥à¤¨ निशà¥à¤šà¤¿à¤¤ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_confirm_full_backup" msgid="1748762171637699562">"UI को पूरà¥à¤£ जगेडा निशà¥à¤šà¤¿à¤¨à¥à¤¤à¤¤à¤¾ सà¥à¤°à¥ गरà¥à¤¨à¤•ा लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ कà¥à¤¨à¥ˆ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—बाट पà¥à¤°à¤¯à¥‹à¤— नगरिने।"</string>
+ <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"अनधिकृत बिनà¥à¤¡à¥‹à¤¹à¤°à¥‚ पà¥à¤°à¤¦à¤°à¥à¤¶à¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_internalSystemWindow" msgid="7458387759461466397">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई विनà¥à¤¡à¥‹à¤¹à¤°à¥‚ सिरà¥à¤œà¤¨à¤¾ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤› जà¥à¤¨ आनà¥à¤¤à¤°à¤¿à¤• पà¥à¤°à¤£à¤¾à¤²à¥€ पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ इनà¥à¤Ÿà¤°à¤«à¥‡à¤¸à¤¦à¥à¤µà¤¾à¤°à¤¾ पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨ अभिपà¥à¤°à¥‡à¤°à¤¿à¤¤ छ। साधारण अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूदà¥à¤µà¤¾à¤°à¤¾ पà¥à¤°à¤¯à¥‹à¤—को लागि होइन।"</string>
+ <string name="permlab_systemAlertWindow" msgid="3543347980839518613">"अनà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूमा चितà¥à¤° कोरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_systemAlertWindow" msgid="8584678381972820118">"अरू अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूमाथि वा पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ इनà¥à¤Ÿà¤°à¤«à¥‡à¤¸à¤•ा भागहरूमा चितà¥à¤° कोरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ तिनीहरूले कà¥à¤¨à¥ˆ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—मा इनà¥à¤Ÿà¤°à¤«à¥‡à¤•ो तपाईà¤à¤•ो पà¥à¤°à¤¯à¥‹à¤—सà¤à¤— हसà¥à¤¤à¤•à¥à¤·à¥‡à¤ª गरà¥à¤¨ वा तपाईठअनà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूमा के देखिरहनॠभà¤à¤•ो छ भनà¥à¤¨à¥‡ सोचà¥à¤¨ हà¥à¤¨à¥à¤› भनà¥à¤¨à¥‡ बदलà¥à¤¨ सकà¥à¤›à¤¨à¥à¥¤"</string>
+ <string name="permlab_setAnimationScale" msgid="2805103241153907174">"गà¥à¤²à¥‹à¤¬à¤² सजीविकरण गति परिमारà¥à¤œà¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_setAnimationScale" msgid="7690063428924343571">"विशà¥à¤µà¤¬à¥à¤¯à¤¾à¤ªà¤¿ सजीविकरण(दà¥à¤°à¥à¤¤ वा ढिला सजीविकरणहरू) लाई कà¥à¤¨à¥ˆ पनि समय परिवरà¥à¤¤à¤¨ गरà¥à¤¨à¤•ो लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_manageAppTokens" msgid="1286505717050121370">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— टोकनहरू पà¥à¤°à¤¬à¤¨à¥à¤§ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_manageAppTokens" msgid="8043431713014395671">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई आफà¥à¤¨à¤¾ टोकनहरू सिरà¥à¤œà¤¨à¤¾ गरà¥à¤¨ र उनीहरूको साधारण Z-कà¥à¤°à¤®à¤¾à¤™à¥à¤•न बाइपास गरेर पà¥à¤°à¤¬à¤¨à¥à¤§ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ साधारण अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूको लागि कहिलà¥à¤¯à¥ˆ पनि आवशà¥à¤¯à¤• नहà¥à¤¨ सकà¥à¤¦à¤›à¥¤"</string>
+ <string name="permlab_freezeScreen" msgid="4708181184441880175">"सà¥à¤•à¥à¤°à¤¿à¤¨ फà¥à¤°à¤¿à¤œ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_freezeScreen" msgid="8558923789222670064">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई पूरà¥à¤£-सà¥à¤•à¥à¤°à¤¿à¤¨ संकà¥à¤°à¤®à¤£à¤•ो लागि असà¥à¤¥à¤¾à¤¯à¥€ रूपमा सà¥à¤•à¥à¤°à¤¿à¤¨ सà¥à¤¥à¤¿à¤° गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_injectEvents" msgid="1378746584023586600">"कà¥à¤žà¥à¤œà¥€à¤¹à¤°à¥‚ र नियनà¥à¤¤à¥à¤°à¤£ बटनहरू थिचà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_injectEvents" product="tablet" msgid="206352565599968632">"यसका आफà¥à¤¨à¤¾ इनपà¥à¤Ÿ घटनाहरू (कि थिचाइहरू, आदि) अनà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूलाई वितरण गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ खराब अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूले यसलाई टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿà¤¸à¤®à¥à¤® लैजान पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨ सकà¥à¤›à¤¨à¥à¥¤"</string>
+ <string name="permdesc_injectEvents" product="default" msgid="653128057572326253">"यसà¥à¤•ो आफà¥à¤¨à¥ˆ निवेश घटनाहरू (कि थिचाइहरू, आदि.) अनà¥à¤¯ अनà¥à¤ªà¥à¤°à¥‹à¤¯à¤—हरूलाई पà¥à¥à¤°à¥â€à¤¯à¤¾à¤‰à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ फोनलाई हसà¥à¤¤à¤•à¥à¤·à¥‡à¤ª गरà¥à¤¨ यसको पà¥à¤°à¤¯à¥‹à¤— खराब अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूले गरà¥à¤¨ सकà¥à¤›à¤¨à¥à¥¤"</string>
+ <string name="permlab_readInputState" msgid="469428900041249234">"तपाईंले के टाइप गरà¥à¤¨à¥à¤¹à¥à¤¨à¥à¤› र के कारà¥à¤¯à¤¹à¤°à¥‚ लिनà¥à¤¹à¥à¤¨à¥à¤› रेकरà¥à¤¡ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_readInputState" msgid="8387754901688728043">"अरà¥à¤•ो अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—(जसà¥à¤¤à¥ˆ पासवरà¥à¤¡ टाइप गराइ)सà¤à¤— अनà¥à¤¤à¤°à¥à¤•à¥à¤°à¤¿à¤¯à¤¾ गरेको बेला पनि तपाईà¤à¤²à¥‡ थिचेका किहरूलाइ हेरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ सामानà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूलाई कहिलà¥à¤¯à¥ˆ आवशà¥à¤¯à¤• हà¥à¤à¤¦à¥ˆà¤¨à¥¤"</string>
+ <string name="permlab_bindInputMethod" msgid="3360064620230515776">"à¤à¤‰à¤Ÿà¤¾ निवेश तरिकामा बाà¤à¤§à¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_bindInputMethod" msgid="3250440322807286331">"à¤à¤‰à¤Ÿà¤¾ निवेश तरिकाको उचà¥à¤š सà¥à¤¤à¤°à¤•ो इनà¥à¤Ÿà¤°à¤«à¥‡à¤¸à¤²à¤¾à¤ˆ पकà¥à¤•ा गरà¥à¤¨à¤•ो लागि समाती राखà¥à¤¨à¥‡à¤²à¤¾à¤ˆ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ साधारण अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूलाई कहिलà¥à¤¯à¥ˆ आवशà¥à¤¯à¤• परà¥à¤¨à¥‡ छैन।"</string>
+ <string name="permlab_bindAccessibilityService" msgid="5357733942556031593">"à¤à¤‰à¤Ÿà¤¾ पहà¥à¤à¤š सेवासà¤à¤— जोडà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"à¤à¤• पहà¥à¤à¤š सेवाको उचà¥à¤š सà¥à¤¤à¤°à¤•ो कà¥à¤°à¤¾à¤•ानीलाई पकà¥à¤•ा गरà¥à¤¨à¤•ो लागि समाती राखà¥à¤¨à¥‡à¤²à¥‡ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ साधारण अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूलाई कहिलà¥à¤¯à¥ˆ आवशà¥à¤¯à¤• परà¥à¤¨à¥‡ छैन।"</string>
+ <string name="permlab_bindPrintService" msgid="8462815179572748761">"à¤à¤‰à¤Ÿà¤¾ पà¥à¤°à¤¿à¤¨à¥à¤Ÿ सेवासà¤à¤— जोडà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_bindPrintService" msgid="7960067623209111135">"à¤à¤‰à¤Ÿà¤¾ पà¥à¤°à¤¿à¤¨à¥à¤Ÿ सेवाको उचà¥à¤š सà¥à¤¤à¤°à¤•ो इनà¥à¤Ÿà¤°à¤«à¥‡à¤¸à¤²à¤¾à¤ˆ पकà¥à¤•ा गरà¥à¤¨à¤•ो लागि पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤²à¤¾à¤ˆ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ साधारण अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूलाई कहिलà¥à¤¯à¥ˆ आवशà¥à¤¯à¤• परà¥à¤¨à¥‡ छैन।"</string>
+ <string name="permlab_bindPrintSpoolerService" msgid="6807762783744125954">"पà¥à¤°à¤¿à¤¨à¥à¤Ÿ सà¥à¤ªà¥à¤²à¤° सेवासà¤à¤— बाधà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_bindPrintSpoolerService" msgid="3680552285933318372">"पà¥à¤°à¤¿à¤¨à¥à¤Ÿ सà¥à¤ªà¥à¤²à¤° सेवाको शीरà¥à¤· तह इनà¥à¤Ÿà¤°à¥à¤«à¥‡à¤¸à¤²à¤¾à¤ˆ बाहकसà¤à¤— बाà¤à¤§à¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ सामानà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई कहिलà¥à¤¯à¥ˆ पनि आवाशà¥à¤¯à¤• नपरà¥à¤¨ सकà¥à¤›à¥¤"</string>
+ <string name="permlab_bindNfcService" msgid="2752731300419410724">"NFC सेवामा बाà¤à¤§à¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_bindNfcService" msgid="6120647629174066862">"NFC कारà¥à¤¡à¤¹à¤°à¥‚ इमà¥à¤²à¥‡à¤Ÿ गरà¥à¤¨à¥‡ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूलाई बाà¤à¤§à¥à¤¨à¤•ा लागि होलà¥à¤¡à¤°à¤²à¤¾à¤ˆ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ सामानà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूका लागि कहिलà¥à¤¯à¥ˆ पनि आवशà¥à¤¯à¤• परà¥à¤¦à¥ˆà¤¨à¥¤"</string>
+ <string name="permlab_bindTextService" msgid="7358378401915287938">"à¤à¤‰à¤Ÿà¤¾ पाठ सेवासà¤à¤— संगठित हà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_bindTextService" msgid="8151968910973998670">"à¤à¤‰à¤Ÿà¤¾ पाठ सेवाको (उदाहरण शबà¥à¤¦ परीकà¥à¤·à¤£à¤¸à¥‡à¤µà¤¾) उचà¥à¤š सà¥à¤¤à¤°à¤•ो इनà¥à¤Ÿà¤°à¤«à¥‡à¤¸à¤²à¤¾à¤ˆ पकà¥à¤•ा गरà¥à¤¨à¤•ो लागि समाती राखà¥à¤¨à¥‡à¤²à¤¾à¤ˆ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ साधारण अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूलाई कहिलà¥à¤¯à¥ˆ आवशà¥à¤¯à¤• परà¥à¤¨à¥‡ छैन।"</string>
+ <string name="permlab_bindVpnService" msgid="4708596021161473255">"VPN सेवासà¤à¤— बाà¤à¤§à¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="permdesc_bindVpnService" msgid="2067845564581693905">"à¤à¤• Vpn सेवाको उचà¥à¤š सà¥à¤¤à¤°à¤•ो कà¥à¤°à¤¾à¤•ानीलाई पकà¥à¤•ा गरà¥à¤¨à¤•ो लागि समाती राखà¥à¤¨à¥‡à¤²à¥‡ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ साधारण अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूलाई कहिलà¥à¤¯à¥ˆ आवशà¥à¤¯à¤• परà¥à¤¨à¥‡ छैन।"</string>
+ <string name="permlab_bindWallpaper" msgid="8716400279937856462">"à¤à¤‰à¤Ÿà¤¾ वालपेपरमा बाà¤à¤§à¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_bindWallpaper" msgid="7108428692595491668">"वालपेपरको माथिलà¥à¤²à¥‹ सà¥à¤¤à¤°à¤•ो इनà¥à¤Ÿà¤°à¤«à¥‡à¤¸à¤®à¤¾ बाà¤à¤§à¥à¤¨ धारकलाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ सामानà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूलाई कहिलà¥à¤¯à¥ˆ आवशà¥à¤¯à¤• परà¥à¤¦à¥ˆà¤¨à¥¤"</string>
+ <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"à¤à¤‰à¤Ÿà¤¾ विजेट सेवासà¤à¤— संगठित हà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"à¤à¤‰à¤Ÿà¤¾ विजेट सेवाको उचà¥à¤š सà¥à¤¤à¤°à¤•ो इनà¥à¤Ÿà¤°à¤«à¥‡à¤¸à¤²à¤¾à¤ˆ पकà¥à¤•ा गरà¥à¤¨à¤•ो लागि समाती राखà¥à¤¨à¥‡à¤²à¤¾à¤ˆ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ साधारण अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूलाई कहिलà¥à¤¯à¥ˆ आवशà¥à¤¯à¤• परà¥à¤¨à¥‡ छैन।"</string>
+ <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"उपकरणको पà¥à¤°à¤¬à¤¨à¥à¤§à¤¸à¤à¤— अनà¥à¤¤à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_bindDeviceAdmin" msgid="569715419543907930">"उपकरण पà¥à¤°à¤¶à¤¾à¤¸à¤• लाई आशय पठाउन समाती राखà¥â€à¤¨à¥‡à¤²à¤¾à¤ˆ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ साधारण अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤¹à¤°à¥‚को लागि कहिलà¥à¤¯à¥ˆ पनी आवशà¥à¤¯à¤• परà¥à¤¦à¥ˆà¤¨à¥¤"</string>
+ <string name="permlab_manageDeviceAdmins" msgid="4248828900045808722">"à¤à¤‰à¤Ÿà¤¾ उपकरण वà¥à¤¯à¤µà¤¸à¥à¤¥à¤¾à¤ªà¤• थप गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ वा हटाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_manageDeviceAdmins" msgid="5025608167709942485">"होलà¥à¤¡à¤°à¤²à¤¾à¤ˆ सकà¥à¤°à¤¿à¤¯ उपकरण वà¥à¤¯à¤µà¤¸à¥à¤¥à¤¾à¤ªà¤•हरू थप गरà¥à¤¨ वा हटाउन अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ साधारण अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूको लागि कहिलà¥à¤¯à¥ˆ पनि आवशà¥à¤¯à¤• नहà¥à¤¨ सकà¥à¤¦à¤›à¥¤"</string>
+ <string name="permlab_setOrientation" msgid="3365947717163866844">"सà¥à¤•à¥à¤°à¤¿à¤¨ अभिमà¥à¤–िकरण परिवरà¥à¤¤à¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_setOrientation" msgid="3046126619316671476">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई कà¥à¤¨à¥ˆ पनि समयमा सà¥à¤•à¥à¤°à¤¿à¤¨à¤•ो परिकà¥à¤°à¤®à¤£ परिवरà¥à¤¤à¤¨ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ साधारण अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूको लागि कहिले पनि आवशà¥à¤¯à¤• नपरà¥à¤¨ सकà¥à¤¦à¤›à¥¤"</string>
+ <string name="permlab_setPointerSpeed" msgid="9175371613322562934">"सङà¥à¤•ेतक गति बदलà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_setPointerSpeed" msgid="6866563234274104233">"कà¥à¤¨à¥ˆ पनि समयमा माउस परिवरà¥à¤¤à¤¨ गरà¥à¤¨ वा टà¥à¤°à¤¾à¤•पà¥à¤¯à¤¾à¤¡ संकेतकको गति बदलà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ सामानà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूको लागि कहिलà¥à¤¯à¥ˆ नचाहिन सकà¥à¤›à¥¤"</string>
+ <string name="permlab_setKeyboardLayout" msgid="4778731703600909340">"किबोरà¥à¤¡ लेआउट परिवरà¥à¤¤à¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_setKeyboardLayout" msgid="8480016771134175879">"किबोरà¥à¤¡ लेआउटलाई परिवरà¥à¤¤à¤¨ गरà¥à¤¨à¤•ो लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ साधारण अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूलाई सायद कहिलà¥à¤¯à¥ˆ आवशà¥à¤¯à¤• परà¥à¤¨à¥‡ छैन।"</string>
+ <string name="permlab_signalPersistentProcesses" msgid="4539002991947376659">"Linux संकेतहरू अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई पठाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_signalPersistentProcesses" msgid="4896992079182649141">"सबै चलिरहेका पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾à¤¹à¤°à¥‚मा पठाइà¤à¤•ा संकेतलाई अनà¥à¤°à¥‹à¤§ गरà¥à¤¨à¤•ो लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_persistentActivity" msgid="8841113627955563938">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरू जहिले पनि चलà¥à¤¨à¥‡ बनाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"यसको आफà¥à¤¨à¥ˆ मेमोरीमा दृढ भà¤à¤•ोको अंश बनाउनको लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿà¤²à¤¾à¤ˆ ढिलो गराउà¤à¤¦à¥ˆ गरेका अनà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूलाई सीमित मातà¥à¤°à¤¾à¤®à¤¾ यसले मेमोरी उपलबà¥à¤§ गराउन सकà¥à¤›à¥¤"</string>
+ <string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई मेमोरीमा आफैंको निरनà¥à¤¤à¤°à¤•ो अंश बनाउन अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ यसले फोनलाई ढिला बनाà¤à¤° अनà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूमा मेमोरी SIMित गरà¥à¤¨ सकà¥à¤¦à¤›à¤¨à¥à¥¤"</string>
+ <string name="permlab_deletePackages" msgid="184385129537705938">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरू मेटाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_deletePackages" msgid="7411480275167205081">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई à¤à¤¨à¥à¤¡à¥à¤°à¥‹à¤‡à¤¡ पà¥à¤¯à¤¾à¤•ेजहरू मेटाउन अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ खराब अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूले यसलाई महतà¥à¤¤à¥à¤µà¤ªà¥‚रà¥à¤£ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरू मेटाउन पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨ सकà¥à¤¦à¤›à¤¨à¥à¥¤"</string>
+ <string name="permlab_clearAppUserData" msgid="274109191845842756">"अनà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूको डेटा मेटाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_clearAppUserData" msgid="4625323684125459488">"पà¥à¤°à¤¯à¤—करà¥à¤¤à¤¾ डेटा हटाउन अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_deleteCacheFiles" msgid="3128665571837408675">"अनà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूको कà¥à¤¯à¤¾à¤¸à¤¹à¤°à¥‚ मेटाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_deleteCacheFiles" msgid="3812998599006730196">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई कà¥à¤¯à¤¾à¤¸ फाइलहरू मेटाउन अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_getPackageSize" msgid="7472921768357981986">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— भणà¥à¤¡à¤¾à¤°à¤£ ठाउà¤à¤•ो मापन गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_getPackageSize" msgid="3921068154420738296">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई यसको कोड, डेटा, र कà¥à¤¯à¤¾à¤¸ आकारहरू पà¥à¤¨à¤ƒà¤ªà¥à¤°à¤¾à¤ªà¥à¤¤ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_installPackages" msgid="2199128482820306924">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरू सिधै सà¥à¤¥à¤¾à¤ªà¤¨à¤¾ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_installPackages" msgid="5628530972548071284">"नयाठसà¥à¤¥à¤¾à¤ªà¤¨à¤¾ गरà¥à¤¨ वा à¤à¤¨à¥à¤¡à¥à¤°à¥‹à¤‡à¤¡ पà¥à¤¯à¤¾à¤•ेजहरू अदà¥à¤¯à¤¾à¤µà¤§à¤¿à¤• गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ खराब अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूले यसलाई मनपरी रूपमा शकà¥à¤¤à¤¿à¤¶à¤¾à¤²à¥€ अनà¥à¤®à¤¤à¤¿à¤¹à¤°à¥‚ भà¤à¤•ा नयाठअनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरू थपà¥à¤¨ पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨ सकà¥à¤›à¤¨à¥à¥¤"</string>
+ <string name="permlab_clearAppCache" msgid="7487279391723526815">"सबै अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— कà¥à¤¯à¤¾à¤¸ डेटा मेटाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_clearAppCache" product="tablet" msgid="8974640871945434565">"अनà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूको कà¥à¤¯à¤¾à¤¸ डाइरेकà¥à¤Ÿà¤°à¥€à¤¹à¤°à¥‚मा फाइलहरू हटाà¤à¤° टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿà¤•ो भणà¥à¤¡à¤¾à¤°à¤£ खाली गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूलाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ उनीहरूले आफà¥à¤¨à¥‹ डेटा पà¥à¤¨à¤ƒà¤¬à¤¹à¤¾à¤²à¥€ गरà¥à¤¨ परà¥à¤¨à¥‡ हà¥à¤¨à¤¾à¤²à¥‡ यसले अनà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूलाई सà¥à¤Ÿà¤¾à¤°à¥à¤Ÿ हà¥à¤¨ निकै ढिलो गराउन सकà¥à¤›à¥¤"</string>
+ <string name="permdesc_clearAppCache" product="default" msgid="2459441021956436779">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूको कà¥à¤¯à¤¾à¤¸ डाइरेकà¥à¤Ÿà¤°à¥€à¤®à¤¾ फाइलहरू मेटाà¤à¤° फोन भणà¥à¤¡à¤¾à¤°à¤£ खाली गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ यसले अनà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूलाई बढी ढिला सà¥à¤°à¥ गराउà¤à¤› किनकि तिनीहरूले आफà¥à¤¨à¥‹ डेटा पà¥à¤¨à¤ƒà¤ªà¥à¤°à¤¾à¤ªà¥à¤¤à¤¿ गरà¥à¤¨ आवशà¥à¤¯à¤• परà¥à¤¨à¥‡ हà¥à¤¨à¥à¤›à¥¤"</string>
+ <string name="permlab_movePackage" msgid="3289890271645921411">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— सà¥à¤°à¥‹à¤¤à¤¹à¤°à¥‚ सारà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_movePackage" msgid="319562217778244524">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— सà¥à¤°à¥‹à¤¤à¤¹à¤°à¥‚ आनà¥à¤¤à¤°à¤¿à¤•बाट बाहà¥à¤¯ मेडियामा र विपरितमा लैजान अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_readLogs" msgid="6615778543198967614">"संवेनशील लग डेटा पढà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_readLogs" product="tablet" msgid="82061313293455151">"पà¥à¤°à¤£à¤¾à¤²à¥€à¤•ा विभिनà¥à¤¨ फाइलहरूबाट पढà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ समà¥à¤­à¤¾à¤µà¥à¤¯ रूपमा वà¥à¤¯à¤•à¥à¤¤à¤¿à¤—त र निजी सूचनासहित तपाईठटà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿà¤¸à¤à¤— के गरिरहनॠभà¤à¤•ो छ भनà¥à¤¨à¥‡ बारेको साधारण सूचना पतà¥à¤¤à¤¾ लगाउन यसलाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permdesc_readLogs" product="default" msgid="2063438140241560443">"पà¥à¤°à¤£à¤¾à¤²à¥€à¤•ा विभिनà¥à¤¨ फाइलहरूबाट पढà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ समà¥à¤­à¤¾à¤µà¥à¤¯ रूपमा वà¥à¤¯à¤•à¥à¤¤à¤¿à¤—त र निजी सूचनासहित तपाईठफोनसà¤à¤— के गरिरहनॠभà¤à¤•ो छ भनà¥à¤¨à¥‡ बारेको साधारण सूचना पतà¥à¤¤à¤¾ लगाउन यसलाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_anyCodecForPlayback" msgid="715805555823881818">"पछाडि बजाउनको लागि कà¥à¤¨à¥ˆ मिडिया पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_anyCodecForPlayback" msgid="8283912488433189010">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई पà¥à¤²à¥‡à¤¬à¥à¤¯à¤¾à¤• डिकोड गरà¥à¤¨ कà¥à¤¨à¥ˆ पनि सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ मिडिया डिकोडर पà¥à¤°à¤¯à¥‹à¤—को लागि अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_manageCaCertificates" msgid="1678391896786882014">"विशà¥à¤µà¤¸à¤¨à¥€à¤¯ पà¥à¤°à¤®à¤¾à¤£à¤¹à¤°à¥‚ पà¥à¤°à¤¬à¤¨à¥à¤§ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_manageCaCertificates" msgid="4015644047196937014">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई CA पà¥à¤°à¤®à¤¾à¤£à¤ªà¤¤à¥à¤°à¤¹à¤°à¥‚ विशà¥à¤µà¤¸à¤¨à¥€à¤¯ पà¥à¤°à¤®à¤¾à¤£à¤¹à¤°à¥‚का रूपमा सà¥à¤¥à¤¾à¤ªà¤¨à¤¾ गरà¥à¤¨ र हटाउन अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_diagnostic" msgid="8076743953908000342">"diag को सà¥à¤µà¤¾à¤®à¤¿à¤¤à¥à¤µà¤®à¤¾ रहेको संसाधनहरूमा पढà¥à¤¨à¥à¤¹à¥‹à¤¸à¥/लेखà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_diagnostic" msgid="6608295692002452283">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई diag समूहदà¥à¤µà¤¾à¤°à¤¾ सà¥à¤µà¤¾à¤®à¤¿à¤¤à¥à¤µ पà¥à¤°à¤¾à¤ªà¥à¤¤ कà¥à¤¨à¥ˆ पनि सà¥à¤°à¥‹à¤¤à¤¹à¤°à¥‚मा पढà¥à¤¨ र लेखà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›; उदाहरणको लागि, /dev मा फाइलहरू। यसले समà¥à¤­à¤µà¤¤à¤ƒ पà¥à¤°à¤£à¤¾à¤²à¥€ सà¥à¤¥à¤¿à¤°à¤¤à¤¾ र सà¥à¤°à¤•à¥à¤·à¤¾à¤®à¤¾ पà¥à¤°à¤­à¤¾à¤µ पारà¥à¤¨ सकà¥à¤¦à¤›à¥¤ यो केवल निरà¥à¤®à¤¾à¤¤à¤¾ वा संचालकदà¥à¤µà¤¾à¤°à¤¾ हारà¥à¤¡à¤µà¥‡à¤¯à¤°-निरà¥à¤¦à¤¿à¤·à¥à¤Ÿà¤•ो लागि पà¥à¤°à¤¯à¥‹à¤— हà¥à¤¨ सकà¥à¤¦à¤›à¥¤"</string>
+ <string name="permlab_changeComponentState" msgid="6335576775711095931">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— अंशहरू सकà¥à¤·à¤® वा अकà¥à¤·à¤® गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_changeComponentState" product="tablet" msgid="8887435740982237294">"अनà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— सकà¥à¤·à¤® छ वा छैन भनà¥à¤¨à¥‡ कà¥à¤°à¤¾à¤•ो परिवरà¥à¤¤à¤¨ गरà¥à¤¨à¤•ो लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ महतà¥à¤¤à¥à¤µà¤ªà¥‚रà¥à¤£ फोन सकà¥à¤·à¤®à¤¤à¤¾ खराब अनà¥à¤ªà¥à¤°à¥‹à¤—हरूले असकà¥à¤·à¤® पारà¥à¤¨ पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨ सकà¥à¤›à¤¨à¥à¥¤ यो अनà¥à¤®à¤¤à¤¿à¤¸à¤à¤—ै होसियारी अपनाउनॠपरà¥à¤›, अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— विषय सूचीमा पà¥à¤°à¤¯à¥‹à¤— नहà¥à¤¨à¥‡, असंगत, असà¥à¤¥à¤¿à¤° अवसà¥à¤¥à¤¾ भà¤à¤•ो पà¥à¤°à¤¾à¤ªà¥à¤¤ हà¥à¤¨à¥‡ समà¥à¤­à¤¾à¤µà¤¨à¤¾ हà¥à¤¨à¥à¤›à¥¤"</string>
+ <string name="permdesc_changeComponentState" product="default" msgid="1827232484416505615">"अनà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—को अंश सकà¥à¤·à¤® छ वा छैन भनà¥à¤¨à¥‡à¤®à¤¾ परिवरà¥à¤¤à¤¨ गरà¥à¤¨à¤•ो लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ महतà¥à¤¤à¥à¤µà¤ªà¥‚रà¥à¤£ फोन सकà¥à¤·à¤®à¤¤à¤¾ खराब अनà¥à¤ªà¥à¤°à¥‹à¤—हरूले असकà¥à¤·à¤® पारà¥à¤¨ पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨ सकà¥à¤›à¤¨à¥à¥¤ यो अनà¥à¤®à¤¤à¤¿à¤¸à¤à¤—ै होसियारी अपनाउनॠपरà¥à¤›, अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— विषय सूचीमा पà¥à¤°à¤¯à¥‹à¤— नहà¥à¤¨à¥‡, असंगत, असà¥à¤¥à¤¿à¤° अवसà¥à¤¥à¤¾ भà¤à¤•ो पà¥à¤°à¤¾à¤ªà¥à¤¤ हà¥à¤¨à¥‡ समà¥à¤­à¤¾à¤µà¤¨à¤¾ हà¥à¤¨à¥à¤›à¥¤"</string>
+ <string name="permlab_grantRevokePermissions" msgid="4627315351093508795">"अनà¥à¤®à¤¤à¤¿à¤¹à¤°à¥‚ पà¥à¤°à¤¦à¤¾à¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ वा रदà¥à¤¦ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_grantRevokePermissions" msgid="4088642654085850662">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई यो वा अनà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूको लागि निरà¥à¤¦à¤¿à¤·à¥à¤Ÿ सà¥à¤µà¥€à¤•ृतिहरू पà¥à¤°à¤¦à¤¾à¤¨ गरà¥à¤¨ वा रदà¥à¤¦ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ खराब अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूले यो तपाईंले अनà¥à¤®à¤¤à¤¿ पà¥à¤°à¤¦à¤¾à¤¨ नगरà¥à¤¨à¥à¤­à¤à¤•ा सà¥à¤µà¤¿à¤§à¤¾à¤¹à¤°à¥‚मा पहà¥à¤à¤š गरà¥à¤¨ सकà¥à¤¦à¤›à¤¨à¥à¥¤"</string>
+ <string name="permlab_setPreferredApplications" msgid="8463181628695396391">"विशेष रूपमा मानà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरू सेट गरà¥à¤¨à¥à¤¹à¥‹à¤¸"</string>
+ <string name="permdesc_setPreferredApplications" msgid="4973986762241783712">"तपाईà¤à¤•ो मनपरà¥à¤¨à¥‡ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई परिवरà¥à¤¤à¤¨ गरà¥à¤¨à¤•ो लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ खराब अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूले चलिरहेका ती अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤¹à¤°à¥‚लाई चà¥à¤ªà¤šà¤¾à¤ª रूपमा परिवरà¥à¤¤à¤¨ गरà¥à¤¨ सकà¥à¤›à¤¨à¥, तपाईà¤à¤¬à¤¾à¤Ÿ निजी डेटा संकलन गरà¥à¤¨à¤•ो लागि भइरहेको अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई सà¥à¤ªà¥à¤« गरà¥à¤¨ सकà¥à¤›à¤¨à¥à¥¤"</string>
+ <string name="permlab_writeSettings" msgid="2226195290955224730">"पà¥à¤°à¤£à¤¾à¤²à¥€ सेटिङहरू परिमारà¥à¤œà¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_writeSettings" msgid="7775723441558907181">"पà¥à¤°à¤£à¤¾à¤²à¥€à¤•ा सेटिङ डेटालाई परिवरà¥à¤¤à¤¨ गरà¥à¤¨à¤•ो लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ खराब अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूले सायद तपाईà¤à¤•ो पà¥à¤°à¤£à¤¾à¤²à¥€à¤•ो कनà¥à¤«à¤¿à¤—रेसनलाई कà¥à¤·à¤¤à¤¿ पà¥à¤°à¥â€à¤¯à¤¾à¤‰à¤¨ सकà¥à¤›à¤¨à¥à¥¤"</string>
+ <string name="permlab_writeSecureSettings" msgid="204676251876718288">"सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ पà¥à¤°à¤£à¤¾à¤²à¥€ सेटिङहरू परिमारà¥à¤œà¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_writeSecureSettings" msgid="8159535613020137391">"पà¥à¤°à¤£à¤¾à¤²à¥€à¤•ो सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ सेटिङ डेटा परिमारà¥à¤œà¤¨ गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ सामानà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूको पà¥à¤°à¤¯à¥‹à¤—को लागि होइनà¥à¥¤"</string>
+ <string name="permlab_writeGservices" msgid="2149426664226152185">"Google सेवा नकà¥à¤¸à¤¾ परिवरà¥à¤¤à¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_writeGservices" msgid="1287309437638380229">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई Google सेवा नकà¥à¤¸à¤¾à¤¹à¤°à¥‚ परिमारà¥à¤œà¤¨ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ साधारण अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूदà¥à¤µà¤¾à¤°à¤¾à¤•ो पà¥à¤°à¤¯à¥‹à¤—को लागि होइन।"</string>
+ <string name="permlab_receiveBootCompleted" msgid="5312965565987800025">"सà¥à¤Ÿà¤¾à¤°à¥à¤Ÿà¤…पमा चलाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_receiveBootCompleted" product="tablet" msgid="7390304664116880704">"आनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई पà¥à¤°à¤£à¤¾à¤²à¥€ बà¥à¤Ÿ पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ पूरà¥à¤£ हà¥à¤¨à¥‡ बितिकै आफैलाई सà¥à¤°à¥ गरà¥à¤¨à¥‡ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ यसले टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿ सà¥à¤°à¥ गरà¥à¤¨à¤®à¤¾ ढिला गरà¥à¤¨ सकà¥à¤¦à¤› र अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई समगà¥à¤°à¤®à¤¾ टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿ सधैठचालॠगरेर ढिला बनाउà¤à¤¦à¤›à¥¤"</string>
+ <string name="permdesc_receiveBootCompleted" product="default" msgid="513950589102617504">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई पà¥à¤°à¤£à¤¾à¤²à¥€ बà¥à¤Ÿ गरी सकेपछि जति सकà¥à¤¦à¥‹ चाà¤à¤¡à¥‹ आफैंमा सà¥à¤°à¥ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ यसले फोन सà¥à¤°à¥ गरà¥à¤¨à¤®à¤¾ ढिला गरà¥à¤¨ सकà¥à¤¦à¤› र अनपà¥à¤°à¤¯à¥‹à¤—लाई समगà¥à¤°à¤®à¤¾ फोन सधैठचालॠगरेर ढिला बनाउà¤à¤¦à¤›à¥¤"</string>
+ <string name="permlab_broadcastSticky" msgid="7919126372606881614">"सà¥à¤Ÿà¤¿à¤•ि पà¥à¤°à¤¸à¤¾à¤°à¤£ पठाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_broadcastSticky" product="tablet" msgid="7749760494399915651">"औपचारिक पà¥à¤°à¤¸à¤¾à¤°à¤£à¤²à¤¾à¤ˆ पठाउनको लागि à¤à¤‰à¤Ÿà¤¾ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›, जà¥à¤¨ पà¥à¤°à¤¸à¤¾à¤°à¤£ समापà¥à¤¤ भà¤à¤ªà¤›à¤¿ बाà¤à¤•ी रहनà¥à¤›à¥¤ अतà¥à¤¯à¤¾à¤§à¤¿à¤• पà¥à¤°à¤¯à¥‹à¤—ले धेरै मेमोरी पà¥à¤°à¤¯à¥‹à¤— गरेको कारणले टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿà¤²à¤¾à¤ˆ ढिलो र असà¥à¤¥à¤¿à¤° बनाउन सकà¥à¤›à¥¤"</string>
+ <string name="permdesc_broadcastSticky" product="default" msgid="2825803764232445091">"औपचारिक पà¥à¤°à¤¸à¤¾à¤°à¤£à¤²à¤¾à¤ˆ पठाउनको लागि à¤à¤• अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›, जà¥à¤¨ पà¥à¤°à¤¸à¤¾à¤°à¤£ समापà¥à¤¤ भà¤à¤ªà¤›à¤¿ बाà¤à¤•ी रहनà¥à¤›à¥¤ अतà¥à¤¯à¤¾à¤§à¤¿à¤• पà¥à¤°à¤¯à¥‹à¤—ले धेरै मेमोरी पà¥à¤°à¤¯à¥‹à¤— गरेको कारणले फोनलाई ढिलो र असà¥à¤¥à¤¿à¤° बनाउन सकà¥à¤›à¥¤"</string>
+ <string name="permlab_readContacts" msgid="8348481131899886131">"तपाईà¤à¤•ा समà¥à¤ªà¤°à¥à¤•हरू पढà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_readContacts" product="tablet" msgid="5294866856941149639">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई निरà¥à¤¦à¤¿à¤·à¥à¤Ÿ वà¥à¤¯à¤•à¥à¤¤à¤¿à¤—तसà¤à¤— अनà¥à¤¯ तरिकाहरूबाट कल गरà¥à¤¨à¥ भà¤à¤•ा, इमेल गरà¥à¤¨à¥ भà¤à¤•ा वा अनà¥à¤¤à¤°à¥à¤•à¥à¤°à¤¿à¤¯à¤¾ गरà¥à¤¨à¥à¤­à¤à¤•ा आवृतिसहितको तपाईंको टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿà¤®à¤¾ भणà¥à¤¡à¤¾à¤°à¤£ गरिà¤à¤•ा समà¥à¤ªà¤°à¥à¤•हरूको डेटा पढà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ यो अनà¥à¤®à¤¤à¤¿à¤²à¥‡ तपाईंको समà¥à¤ªà¤°à¥à¤• डेटा बचत गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›, र खराब अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूले तपाईंको जानकारी बिना समà¥à¤ªà¤°à¥à¤• डेटा साà¤à¥‡à¤¦à¤¾à¤°à¥€ गरà¥à¤¨ सकà¥à¤¦à¤›à¤¨à¥à¥¤"</string>
+ <string name="permdesc_readContacts" product="default" msgid="8440654152457300662">"तपाईà¤à¤²à¥‡ विशेष वà¥à¤¯à¤•à¥à¤¤à¤¿à¤¹à¤°à¥‚सà¤à¤— अरà¥à¤•ो तरिकाबाट कल गरà¥à¤¨à¥à¤­à¤à¤•ा, इमेल गरà¥à¤¨à¥à¤­à¤à¤•ा वा संचार गरà¥à¤¨à¥à¤­à¤à¤•ा आवृतिसहित तपाईà¤à¤•ो फोनमा भणà¥à¤¡à¤¾à¤°à¤£ भà¤à¤•ा डेटाको बारेमा पढà¥à¤¨à¤•ो लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ यो अनà¥à¤®à¤¤à¤¿à¤²à¥‡ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई तपाईà¤à¤•ो समà¥à¤ªà¤°à¥à¤• डेटा बचत गरà¥à¤¨à¤•ो लागि अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›, र तपाईà¤à¤•ो जà¥à¤žà¤¾à¤¨ बिना नै खराब अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूले सायद समà¥à¤ªà¤°à¥à¤• डेटा साà¤à¥‡à¤¦à¤¾à¤°à¥€ गरà¥à¤¨ सकà¥à¤›à¤¨à¥à¥¤"</string>
+ <string name="permlab_writeContacts" msgid="5107492086416793544">"तपाईà¤à¤•ा समà¥à¤ªà¤°à¥à¤•हरू परिवरà¥à¤¤à¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_writeContacts" product="tablet" msgid="897243932521953602">"अनà¥à¤¯ तरिकाका आवृतिहरूसà¤à¤— जà¥à¤¨ तपाईà¤à¤²à¥‡ कल, इमेल, वा विशेष समà¥à¤ªà¤°à¥à¤• गरà¥à¤¨à¥à¤­à¤à¤•ासहित तपाईà¤à¤•ो टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿà¤®à¤¾ भणà¥à¤¡à¤¾à¤°à¤£ भà¤à¤•ा समà¥à¤ªà¤°à¥à¤•हरूको बारेको डेटालाई परिवरà¥à¤¤à¤¨ गरà¥à¤¨à¤•ो लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ यस अनà¥à¤®à¤¤à¤¿à¤²à¥‡ समà¥à¤ªà¤°à¥à¤• डेटालाई मेटाउनको लागि अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permdesc_writeContacts" product="default" msgid="589869224625163558">"तपाईà¤à¤²à¥‡ बारमà¥à¤¬à¤¾à¤° कल गरेका, इमेल गरेका, वा विशेष समà¥à¤ªà¤°à¥à¤•हरूसà¤à¤— सञà¥à¤šà¤¾à¤° गरेका सहित तपाईà¤à¤•ो फोनमा भणà¥à¤¡à¤¾à¤°à¤£ गरेका तपाईà¤à¤•ा समà¥à¤ªà¤°à¥à¤•हरू परिमारà¥à¤œà¤¨ गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ यो अनà¥à¤®à¤¤à¤¿à¤²à¥‡ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई समà¥à¤ªà¤°à¥à¤• डेटा मेटाउन दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_readCallLog" msgid="3478133184624102739">"कल लग पढà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_readCallLog" product="tablet" msgid="3700645184870760285">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई तपाईà¤à¤•ो टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿà¤•ो कल लग, आगमन र बहिरà¥à¤—मन कलहरू बारे डेटा सहितको कल लग पढà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ यस अनà¥à¤®à¤¤à¤¿à¤²à¥‡ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूलाई तपाईà¤à¤•ो कल लग डेटाहरूको बचत गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›, र खराब अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूले तपाईà¤à¤•ो जानकारी बिना नै यो कल लग डेटालाई अरूसà¤à¤— साà¤à¥‡à¤¦à¤¾à¤° गरà¥à¤¨ सकà¥à¤›à¤¨à¥à¥¤"</string>
+ <string name="permdesc_readCallLog" product="default" msgid="5777725796813217244">"भितà¥à¤° आउने र बाहिर जाने कलहरूसहित तपाईà¤à¤•ो फनको कल लग पढà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ यो अनà¥à¤®à¤¤à¤¿à¤²à¥‡ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूलाई तपाईà¤à¤•ा कल लग डेटा बचत गरà¥à¤¨ दिनà¥à¤› र खराब अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूले तपाईà¤à¤²à¥‡ थाहै नपाई कल लग डेटालाई साà¤à¥‡à¤¦à¤¾à¤°à¥€ गरà¥à¤¨ सकà¥à¤›à¤¨à¥à¥¤"</string>
+ <string name="permlab_writeCallLog" msgid="8552045664743499354">"कल लग लेखà¥â€à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_writeCallLog" product="tablet" msgid="6661806062274119245">"आगमन तथा बहरà¥à¤—मन डेटासहित तपाईà¤à¤•ो टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿà¤•ो कल लगको परिमारà¥à¤œà¤¨ गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ खराब अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूले यसलाई तपाईà¤à¤•ो कल लग परिमारà¥à¤œà¤¨ गरà¥à¤¨ वा मेटाउन पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨ सकà¥à¤›à¤¨à¥à¥¤"</string>
+ <string name="permdesc_writeCallLog" product="default" msgid="683941736352787842">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई तपाईंको फोनको आउने र बाहिर जाने कलहरूको बारेको डेटा सहित कल लग परिमारà¥à¤œà¤¨ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ खराब अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूले यसलाई तपाईंको कल लग मेटाउन वा परिमारà¥à¤œà¤¨ गरà¥à¤¨ पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨ सकà¥à¤¦à¤›à¥¤"</string>
+ <string name="permlab_readProfile" msgid="4701889852612716678">"तपाईà¤à¤•ो आफà¥à¤¨à¥ˆ समà¥à¤ªà¤°à¥à¤• कारà¥à¤¡ पढà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_readProfile" product="default" msgid="5462475151849888848">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई तपाईंको उपकरणमा भणà¥à¤¡à¤¾à¤°à¤£ गरिà¤à¤•ा वà¥à¤¯à¤•à¥à¤¤à¤¿à¤—त पà¥à¤°à¥‹à¤«à¤¾à¤‡à¤² जानकारी पढà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›, जसà¥à¤¤à¥ˆ तपाईंको नाम र समà¥à¤ªà¤°à¥à¤• जानकारी। यसको मतलब अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—ले तपाईंलाई पहिचान गरà¥à¤¨ सकà¥à¤¦à¤› र तपाईंको पà¥à¤°à¥‹à¤«à¤¾à¤‡à¤² जानकारी अरूलाई पठाउन सकà¥à¤¦à¤›à¥¤"</string>
+ <string name="permlab_writeProfile" msgid="907793628777397643">"तपाईà¤à¤•ो आफà¥à¤¨à¥ˆ समà¥à¤ªà¤°à¥à¤• कारà¥à¤¡ परिमारà¥à¤œà¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"तपाईà¤à¤•ो उपकरणमा भणà¥à¤¡à¤¾à¤° भà¤à¤•ो वà¥à¤¯à¤¾à¤•à¥à¤¤à¤¿à¤—त पà¥à¤°à¥‹à¤«à¤¾à¤‡à¤² जानकारी, जसà¥à¤¤à¥ˆ तपाईà¤à¤•ो नाम वा समà¥à¤ªà¤°à¥à¤• जानकारीलाई परिवरà¥à¤¤à¤¨ गरà¥à¤¨ वा थपà¥à¤¨à¤•ो लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ यसको मतलब अनà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—ले तपाईà¤à¤²à¤¾à¤ˆ चिनà¥à¤¨ सकà¥à¤›à¤¨à¥ र सायद अनà¥à¤¯à¤²à¤¾à¤ˆ तपाईà¤à¤•ो पà¥à¤°à¥‹à¤«à¤¾à¤‡à¤² जानकारी पठाउन सकà¥à¤›à¤¨à¥à¥¤"</string>
+ <string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"तपाईंको सामाजिक सà¥à¤Ÿà¥à¤°à¤¿à¤® पढà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"तपाईठर तपाईà¤à¤•ा साथीहरूबाट सामाजिक अपडेटलाई पहà¥à¤à¤š र सिंक गरà¥à¤¨à¤•ो लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ जानकारी साà¤à¥‡à¤¦à¤¾à¤°à¥€ गरà¥à¤¦à¤¾ सावधान रहनà¥à¤¹à¥‹à¤¸à¥ -- समाजिक नेटवरà¥à¤•हरूमा तपाईठर तपाईà¤à¤•ो साथीको बिचमा भà¤à¤•ा संचारलाई पढà¥à¤¨ विशà¥à¤µà¤¾à¤¸à¤¨à¥€à¤¯à¤¤à¤¾ बेगरै यसले अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ नोट: यो अनà¥à¤®à¤¤à¤¿ बलपूरà¥à¤µà¤• सबै सामाजिक नेटवरà¥à¤•हरूमा सायद नगरà¥à¤¨ सकिनà¥à¤›à¥¤"</string>
+ <string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"तपाईà¤à¤•ो सामाजिक पà¥à¤°à¤µà¤¾à¤¹à¤®à¤¾ लेखà¥â€à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_writeSocialStream" product="default" msgid="3086557552204114849">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई तपाईंको साथीहरूबाट सामाजिक अपडेटहरू पà¥à¤°à¤¦à¤°à¥à¤¶à¤¨ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ जानकारी साà¤à¥‡à¤¦à¤¾à¤°à¥€ गरà¥à¤¨à¥‡ बेलामा होशियार रहनà¥à¤¹à¥‹à¤¸à¥ -- यसले अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई सनà¥à¤¦à¥‡à¤¶à¤¹à¤°à¥‚ निरà¥à¤®à¤¾à¤£ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤› जà¥à¤¨ साथीबाट आà¤à¤•ो देखिनà¥à¤›à¥¤ टिपà¥à¤ªà¤£à¥€: यो अनà¥à¤®à¤¤à¤¿ सबै सामाजिक सञà¥à¤œà¤¾à¤²à¤¹à¤°à¥‚मा लागू नहà¥à¤¨ सकà¥à¤¦à¤›à¥¤"</string>
+ <string name="permlab_readCalendar" msgid="5972727560257612398">"गोपà¥à¤¯ जानकारी र पातà¥à¤°à¥‹ घटनाहरू पढà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_readCalendar" product="tablet" msgid="4216462049057658723">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई तपाईंको टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿà¤®à¤¾ भणà¥à¤¡à¤¾à¤°à¤£ गरिà¤à¤•ा ती साथीहरू वा सहयोगीहरू सहितको पातà¥à¤°à¤¾à¤•ा कारà¥à¤¯à¤•à¥à¤°à¤®à¤¹à¤°à¥‚ पढà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ यसले गोपनीयता वा संवेदनशीलता बिना पनि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई तपाईंको पातà¥à¤°à¤¾à¤•ा डेटा साà¤à¥‡à¤¦à¤¾à¤°à¥€ गरà¥à¤¨ वा बचत गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permdesc_readCalendar" product="default" msgid="7434548682470851583">"ती साथीहरू वा सहकरà¥à¤®à¥€à¤¹à¤°à¥‚सहित सबै पातà¥à¤°à¥‹ घटनाहरू तपाईà¤à¤•ो टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿà¤®à¤¾ भणà¥à¤¡à¤¾à¤°à¤£ भà¤à¤•ालाई पढà¥à¤¨à¤•ो लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ तपाईà¤à¤•ो पातà¥à¤°à¥‹ डेटा यसले सायद सेयर गरà¥à¤¨ वा सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ गरà¥à¤¨à¤•ो लागि विशà¥à¤µà¤¾à¤¸à¤¨à¤¿à¤¯à¤¤à¤¾ वा समà¥à¤µà¥‡à¤¦à¤¨à¤¶à¥€à¤²à¤¤à¤¾ बिना नै अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_writeCalendar" msgid="8438874755193825647">"पातà¥à¤°à¥‹ घटनाहरू थपà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ वा परिमारà¥à¤œà¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ र मालिकको जà¥à¤žà¤¾à¤¨ बिना नै पाहà¥à¤¨à¤¾à¤¹à¤°à¥‚लाई इमेल पठाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_writeCalendar" product="tablet" msgid="6679035520113668528">"ती साथीहरू वा सहकरà¥à¤®à¥€à¤¹à¤°à¥‚सहितका घटनाहरू जसलाई तपाईà¤à¤²à¥‡ आफà¥à¤¨à¥‹ टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿà¤®à¤¾ परिमारà¥à¤œà¤¨ गरà¥à¤¨ सकà¥à¤¨à¥‡ अनà¥à¤®à¤¤à¤¿ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई दिनà¥à¤›à¥¤ यसले अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई सनà¥à¤¦à¥‡à¤¶à¤¹à¤°à¥‚ जà¥à¤¨ पातà¥à¤°à¤¾à¤•ो मालिकहरूबाट आà¤à¤•ा देखिनेलाई पठाउने वा मालिकहरूको जà¥à¤žà¤¾à¤¨ बेगर घटनालाई परिमारà¥à¤œà¤¨ गरà¥à¤¨à¥‡ अनà¥à¤®à¤¿à¤¤ दिनà¥à¤›à¥¤"</string>
+ <string name="permdesc_writeCalendar" product="default" msgid="2324469496327249376">"ती साथीहरू वा सहकरà¥à¤®à¥€à¤¹à¤°à¥‚सहित तपाईà¤à¤•ो फोनका घटनाहरू जसलाई थपà¥à¤¨, हटाउन र परिवरà¥à¤¤à¤¨ गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ पातà¥à¤°à¥‹ मालिकबाट देखा परेका वा मालिकको जà¥à¤žà¤¾à¤¨ बिना परिवरà¥à¤¤à¤¨ भà¤à¤•ा घटनाहरू सनà¥à¤¦à¥‡à¤¶ पठाउन यसले अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिन सकà¥à¤›à¥¤"</string>
+ <string name="permlab_accessMockLocation" msgid="8688334974036823330">"परीकà¥à¤·à¤£à¤•ो लागि सà¥à¤¥à¤¾à¤¨ सà¥à¤°à¥‹à¤¤à¤¹à¤°à¥‚ मक गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_accessMockLocation" msgid="5808711039482051824">"परीकà¥à¤·à¤£à¤•ो लागि मक सà¥à¤¥à¤¾à¤¨ सà¥à¤°à¥‹à¤¤à¤¹à¤°à¥‚ सिरà¥à¤œà¤¨à¤¾ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ वा नयाठसà¥à¤¥à¤¾à¤¨ पà¥à¤°à¤¦à¤¾à¤¯à¤• सà¥à¤¥à¤¾à¤ªà¤¨à¤¾ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤ यसले अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई सà¥à¤¥à¤¾à¤¨à¤®à¤¾ ओभरराइड गरà¥à¤¦à¤› र/वा सà¥à¤¥à¤¿à¤¤à¤¿ अनà¥à¤¯ सà¥à¤¥à¤¾à¤¨ सà¥à¤°à¥‹à¤¤à¤¹à¤°à¥‚ जसà¥à¤¤à¥ˆ GPS वा सà¥à¤¥à¤¾à¤¨ पà¥à¤°à¤¦à¤¾à¤¯à¤•बाट फरà¥à¤•ाइà¤à¤•ा।"</string>
+ <string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"अधिक सà¥à¤¥à¤¾à¤¨ पà¥à¤°à¤¦à¤¾à¤¯à¤• आदेशहरू पहà¥à¤à¤š गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_accessLocationExtraCommands" msgid="5945166642335800763">"थप सà¥à¤¥à¤¾à¤¨ पà¥à¤°à¤¦à¤¾à¤¯à¤• कमाणà¥à¤¡à¤¹à¤°à¥‚ समà¥à¤® पहà¥à¤à¤š पà¥à¤°à¥â€à¤¯à¤¾à¤‰à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—ले अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ यसले अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई सायद जीपीà¤à¤¸à¤•ो वा अनà¥à¤¯ सà¥à¤¥à¤¾à¤¨ सेवाहरूको कारà¥à¤¯ सà¤à¤— हसà¥à¤¤à¤•à¥à¤·à¥‡à¤ª गरà¥à¤¨à¤•ो लागि यसलाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_installLocationProvider" msgid="6578101199825193873">"à¤à¤‰à¤Ÿà¤¾ सà¥à¤¥à¤¾à¤¨ पà¥à¤°à¤¦à¤¾à¤¤à¤¾ सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿"</string>
+ <string name="permdesc_installLocationProvider" msgid="9066146120470591509">"परीकà¥à¤·à¤£à¤•ो लागि मक सà¥à¤¥à¤¾à¤¨ सà¥à¤°à¥‹à¤¤à¤¹à¤°à¥‚ सिरà¥à¤œà¤¨à¤¾ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ वा नयाठसà¥à¤¥à¤¾à¤¨ पà¥à¤°à¤¦à¤¾à¤¯à¤• सà¥à¤¥à¤¾à¤ªà¤¨à¤¾ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤ यसले अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई सà¥à¤¥à¤¾à¤¨à¤®à¤¾ ओभरराइड गरà¥à¤¦à¤› र/वा सà¥à¤¥à¤¿à¤¤à¤¿ अनà¥à¤¯ सà¥à¤¥à¤¾à¤¨ सà¥à¤°à¥‹à¤¤à¤¹à¤°à¥‚ जसà¥à¤¤à¥ˆ GPS वा सà¥à¤¥à¤¾à¤¨ पà¥à¤°à¤¦à¤¾à¤¯à¤•बाट फरà¥à¤•ाइà¤à¤•ा।"</string>
+ <string name="permlab_accessFineLocation" msgid="1191898061965273372">"सटिक सà¥à¤¥à¤¾à¤¨ (GPS र नेटवरà¥à¤• आधारित)"</string>
+ <string name="permdesc_accessFineLocation" msgid="5295047563564981250">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—ले विशà¥à¤µà¤µà¥à¤¯à¤¾à¤ªà¥€ सà¥à¤¥à¤¾à¤¨ पà¥à¤°à¤£à¤¾à¤²à¥€ (GPS) वा सेल टावरहरू र वाइ-फाइ जसà¥à¤¤à¤¾ नेटवरà¥à¤• सà¥à¤¥à¤¾à¤¨ सà¥à¤°à¥‹à¤¤à¤¹à¤°à¥‚को पà¥à¤°à¤¯à¥‹à¤— गरेर तपाईà¤à¤•ो सही सà¥à¤¥à¤¾à¤¨ पà¥à¤°à¤¾à¤ªà¥à¤¤ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ यी सà¥à¤¥à¤¾à¤¨ सेवाहरू खोलà¥à¤¨à¥ परà¥à¤› र अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूका लागि पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨ तपाईà¤à¤•ो उपकरणमा उपलबà¥à¤§ हà¥à¤¨à¥ परà¥à¤›à¥¤ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूले तपाईठकहाठहà¥à¤¨à¥ हà¥à¤¨à¥à¤› भनà¥à¤¨à¥‡ निरà¥à¤§à¤¾à¤°à¤£ गरà¥à¤¨ यसलाई पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨ सकà¥à¤› र यसले अतिरिकà¥à¤¤ बà¥à¤¯à¤¾à¤Ÿà¥à¤°à¤¿ उरà¥à¤œà¤¾ खतप गरà¥à¤¨ सकà¥à¤›à¥¤"</string>
+ <string name="permlab_accessCoarseLocation" msgid="4887895362354239628">"अनà¥à¤®à¤¾à¤¨à¤¿à¤¤ सà¥à¤¥à¤¾à¤¨ (नेटवरà¥à¤•-आधारित)"</string>
+ <string name="permdesc_accessCoarseLocation" msgid="2538200184373302295">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई तपाईà¤à¤•ो अनà¥à¤®à¤¾à¤¨à¤¿à¤¤ सà¥à¤¥à¤¾à¤¨ पà¥à¤°à¤¾à¤ªà¥à¤¤ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ यो सà¥à¤¥à¤¾à¤¨ सेल टावर र वाइ-फाइजसà¥à¤¤à¤¾ नेटवरà¥à¤• सà¥à¤¥à¤¾à¤¨ सà¥à¤°à¥‹à¤¤à¤¹à¤°à¥‚को पà¥à¤°à¥‹à¤— गरी सà¥à¤¥à¤¾à¤¨ सेवाहरूबाट उतà¥à¤ªà¤¨à¥à¤¨ गरिà¤à¤•ो हो। अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—ले यी सà¥à¤¥à¤¾à¤¨ सेवाहरूको उपयोग गरà¥à¤¨à¤•ो लागि यी सेवाहरू तपाईà¤à¤•ो उपकरणमा चालॠर उपलबà¥à¤§ हà¥à¤¨à¥ आवशà¥à¤¯à¤• छ। अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूले अनà¥à¤®à¤¾à¤¨à¤¿à¤¤ रूपमा तपाईठकहाठहà¥à¤¨à¥à¤¹à¥à¤¨à¥à¤› भनà¥à¤¨à¥‡ निरà¥à¤§à¤¾à¤°à¤£ गरà¥à¤¨ यसको पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨ सकà¥à¤›à¤¨à¥à¥¤"</string>
+ <string name="permlab_accessSurfaceFlinger" msgid="2363969641792388947">"SurfaceFlinger पहà¥à¤à¤š गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="permdesc_accessSurfaceFlinger" msgid="1041619516733293551">"SurfaceFlinger कम-सà¥à¤¤à¤° सà¥à¤µà¤¿à¤§à¤¾à¤¹à¤°à¥‚ पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_readFrameBuffer" msgid="6690504248178498136">"फà¥à¤°à¥‡à¤® बफर पढà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_readFrameBuffer" msgid="4937405521809454680">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई फà¥à¤°à¥‡à¤® बफरको सामगà¥à¤°à¥€ पढà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_accessInputFlinger" msgid="5348635270689553857">"InputFlinger को पहà¥à¤à¤š गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_accessInputFlinger" msgid="2104864941201226616">"InputFlinger को कम-सà¥à¤¤à¤° सà¥à¤µà¤¿à¤§à¤¾à¤¹à¤°à¥‚ पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"वाइफाइ पà¥à¤°à¤¦à¤°à¥à¤¶à¤¨à¤¹à¤°à¥‚लाई विनà¥à¤¯à¤¾à¤¸ गरà¥à¤¨à¥à¤¹à¥‹à¤¸"</string>
+ <string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई कनà¥à¤«à¤¿à¤—र गरà¥à¤¨ र वाइफाइ पà¥à¤°à¤¦à¤°à¥à¤¶à¤¨à¤¹à¤°à¥‚सà¤à¤— जोडà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_controlWifiDisplay" msgid="393641276723695496">"वाइफाइ पà¥à¤°à¤¦à¤°à¥à¤¶à¤¨à¤¹à¤°à¥‚ नियनà¥à¤¤à¥à¤°à¤£ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_controlWifiDisplay" msgid="4543912292681826986">"वाइफाइ पà¥à¤°à¤¦à¤°à¥à¤¶à¤¨à¥€à¤•ा तलà¥à¤²à¥‹ तह विषेशताहरू नियनà¥à¤¤à¥à¤°à¤£ गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_captureAudioOutput" msgid="6857134498402346708">"अडियो आउटपà¥à¤Ÿ कैद गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_captureAudioOutput" msgid="6210597754212208853">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अडियो आउटपà¥à¤Ÿ कैद गरà¥à¤¨ र रिडाइरेकà¥à¤Ÿ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_captureVideoOutput" msgid="2246828773589094023">"भिडियो आउटपà¥à¤Ÿ कैद गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_captureVideoOutput" msgid="359481658034149860">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई भिडियो आउटपà¥à¤Ÿ कैद गरà¥à¤¨ र रिडाइरेकà¥à¤Ÿ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_captureSecureVideoOutput" msgid="7815398969303382016">"सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ भिडियो आउटपà¥à¤Ÿ कैद गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_captureSecureVideoOutput" msgid="2779793064709350289">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ भिडियो आउटपà¥à¤Ÿ कैद गरà¥à¤¨ र रिडाइरेकà¥à¤Ÿ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"तपाईà¤à¤•ा अडियो सेटिङहरू परिवरà¥à¤¤à¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई गà¥à¤²à¥‹à¤¬à¤² अडियो सेटिङà¥à¤¹à¤°à¥‚ परिमारà¥à¤œà¤¨ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›, जसà¥à¤¤à¥ˆ आवाजको मातà¥à¤°à¤¾ र आउटपà¥à¤Ÿà¤•ो लागि कà¥à¤¨ सà¥à¤ªà¤¿à¤•र पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨à¥‡à¥¤"</string>
+ <string name="permlab_recordAudio" msgid="3876049771427466323">"अडियो रेकरà¥à¤¡ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_recordAudio" msgid="4906839301087980680">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई माइकà¥à¤°à¥‹à¤«à¥‹à¤¨à¤•ो साथ अडियो रेकरà¥à¤¡ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ यस अनà¥à¤®à¤¤à¤¿à¤²à¥‡ तपाईंको पà¥à¤·à¥à¤Ÿà¤¿à¤•रण बिना कà¥à¤¨à¥ˆ पनि समयमा अडियो रेकरà¥à¤¡ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_camera" msgid="3616391919559751192">"तसà¥à¤¬à¤¿à¤°à¤¹à¤°à¥‚ र भिडियोहरू लिनà¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="permdesc_camera" msgid="8497216524735535009">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई कà¥à¤¯à¤¾à¤®à¥‡à¤°à¤¾à¤¸à¤à¤— तसà¥à¤¬à¤¿à¤° र भिडियोहरू लिन अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ यस अनà¥à¤®à¤¤à¤¿à¤²à¥‡ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई तपाईंको पà¥à¤·à¥à¤Ÿà¤¿à¤•रण बिना कà¥à¤¨à¥ˆ पनि समयमा कà¥à¤¯à¤¾à¤®à¥‡à¤°à¤¾ पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨ सà¥à¤µà¥€à¤•ृति दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_cameraDisableTransmitLed" msgid="2651072630501126222">"कà¥à¤¯à¤¾à¤®à¥‡à¤°à¤¾ पà¥à¤°à¤¯à¥‹à¤—मा हà¥à¤à¤¦à¤¾ सूचक LED पà¥à¤°à¤¸à¤¾à¤°à¤£ असकà¥à¤·à¤® गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_cameraDisableTransmitLed" msgid="4764585465480295341">"पूरà¥à¤µ-सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ पà¥à¤°à¤£à¤¾à¤²à¥€ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई कà¥à¤¯à¤¾à¤®à¥‡à¤°à¤¾ उपयोग सूचक LED अकà¥à¤·à¤® गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"सà¥à¤¥à¤¾à¤¯à¥€ रूपमा टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿ अकà¥à¤·à¤® पारà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permlab_brick" product="default" msgid="8337817093326370537">"फोनलाई सà¥à¤¥à¤¾à¤¯à¥€ रूपमा असकà¥à¤·à¤® पारà¥à¤¨à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"पà¥à¤°à¥ˆ टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿà¤²à¤¾à¤ˆ सà¥à¤¥à¤¾à¤¯à¥€ रूपमा असकà¥à¤·à¤® पारà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ यो निकै खतरनाक हà¥à¤¨à¥à¤›à¥¤"</string>
+ <string name="permdesc_brick" product="default" msgid="5788903297627283099">"समà¥à¤ªà¥‚रà¥à¤£ फोनलाई सà¥à¤¥à¤¾à¤¯à¥€ रूपमा असकà¥à¤·à¤® पारà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ यो धेरै खतरनाक हà¥à¤¨à¥à¤›à¥¤"</string>
+ <string name="permlab_reboot" product="tablet" msgid="3436634972561795002">"टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿ पà¥à¤¨à¤ƒà¤¬à¥à¤Ÿ गरà¥à¤¨ जोड गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permlab_reboot" product="default" msgid="2898560872462638242">"फोन पà¥à¤¨à¤ƒà¤¬à¥à¤Ÿ गरà¥à¤¨à¥ जोड गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_reboot" product="tablet" msgid="8172056180063700741">"टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿà¤²à¤¾à¤ˆ बलपूरà¥à¤µà¤• पà¥à¤¨à¤ƒà¤¬à¥à¤Ÿ गरà¥à¤¨à¤•ो लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permdesc_reboot" product="default" msgid="5326008124289989969">"फोनलाई बलपà¥à¤°à¥à¤µà¤• पà¥à¤¨à¤ƒà¤¬à¥à¤Ÿ गरà¥à¤¨à¤•ो लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_mount_unmount_filesystems" product="nosdcard" msgid="2927361537942591841">"USB भणà¥à¤¡à¤¾à¤°à¤£ फाइल पà¥à¤°à¤£à¤¾à¤²à¥€ पहà¥à¤à¤š गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permlab_mount_unmount_filesystems" product="default" msgid="4402305049890953810">"SD कारà¥à¤¡ फाइल पà¥à¤°à¤£à¤¾à¤²à¥€ पहà¥à¤à¤š गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_mount_unmount_filesystems" msgid="1829290701658992347">"हटाउन मिलà¥à¤¨à¥‡ भणà¥à¤¡à¤¾à¤°à¤£à¤•ो लागि फाइल पà¥à¤°à¤£à¤¾à¤²à¥€à¤¹à¤°à¥‚ माउनà¥à¤Ÿ र अनमाउनà¥à¤Ÿ गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_mount_format_filesystems" product="nosdcard" msgid="6227819582624904972">"USB भणà¥à¤¡à¤¾à¤°à¤£ मेटà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permlab_mount_format_filesystems" product="default" msgid="262582698639274056">"SD कारà¥à¤¡ मेटाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_mount_format_filesystems" msgid="8784268246779198627">"हटाउन मिलà¥à¤¨à¥‡ भणà¥à¤¡à¤¾à¤°à¤£ फरà¥à¤®à¥à¤¯à¤¾à¤Ÿ गरà¥à¤¨à¤•ो लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_asec_access" msgid="3411338632002193846">"आनà¥à¤¤à¤°à¤¿à¤• भणà¥à¤¡à¤¾à¤°à¤£à¤•ो सूचना पà¥à¤°à¤¾à¤ªà¥à¤¤ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_asec_access" msgid="3094563844593878548">"आनà¥à¤¤à¤°à¤¿à¤• भणà¥à¤¡à¤¾à¤°à¤£à¤®à¤¾ सूचना पà¥à¤°à¤¾à¤ªà¥à¤¤ गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_asec_create" msgid="6414757234789336327">"आनà¥à¤¤à¤°à¤¿à¤• भणà¥à¤¡à¤¾à¤°à¤£ सिरà¥à¤œà¤¨à¤¾ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_asec_create" msgid="4558869273585856876">"आनà¥à¤¤à¤°à¤¿à¤• भणà¥à¤¡à¤¾à¤°à¤£ सिरà¥à¤œà¤¨à¤¾ गरà¥à¤¨à¤•ो लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—ले अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_asec_destroy" msgid="526928328301618022">"आनà¥à¤¤à¤°à¤¿à¤• भणà¥à¤¡à¤¾à¤°à¤£ धà¥à¤µà¤¸à¥à¤¤ पारà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_asec_destroy" msgid="7218749286145526537">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई आनà¥à¤¤à¤°à¤¿à¤• भणà¥à¤¡à¤¾à¤°à¤£ धà¥à¤µà¤¸à¥à¤¤ पारà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_asec_mount_unmount" msgid="8877998101944999386">"आनà¥à¤¤à¤°à¤¿à¤• भणà¥à¤¡à¤¾à¤°à¤£à¤²à¤¾à¤ˆ माउनà¥à¤Ÿ/अनमाउनà¥à¤Ÿ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_asec_mount_unmount" msgid="3451360114902490929">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई आनà¥à¤¤à¤°à¤¿à¤• भणà¥à¤¡à¤¾à¤°à¤£ माउनà¥à¤Ÿ/अनमाउनà¥à¤Ÿ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_asec_rename" msgid="7496633954080472417">"आनà¥à¤¤à¤°à¤¿à¤• भणà¥à¤¡à¤¾à¤°à¤£à¤•ो पà¥à¤¨:नामाकरण गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_asec_rename" msgid="1794757588472127675">"आनà¥à¤¤à¤°à¥€à¤• भणà¥à¤¡à¤¾à¤°à¤£à¤•ो पà¥à¤¨à¤¨à¤¾à¤®à¤¾à¤•रण गरà¥à¤¨à¤•ो लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—ले अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_vibrate" msgid="7696427026057705834">"कमà¥à¤ªà¤¨ नियनà¥à¤¤à¥à¤°à¤£ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_vibrate" msgid="6284989245902300945">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई भाइबà¥à¤°à¥‡à¤Ÿà¤° नियनà¥à¤¤à¥à¤°à¤£ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_flashlight" msgid="2155920810121984215">"फà¥à¤²à¥à¤¯à¤¾à¤¸à¤²à¤¾à¤ˆà¤Ÿ नियनà¥à¤¤à¥à¤°à¤£ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_flashlight" msgid="6522284794568368310">"फà¥à¤²à¥à¤¯à¤¾à¤¸ पà¥à¤°à¤•ाशलाई नियनà¥à¤¤à¥à¤°à¤£ गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_manageUsb" msgid="1113453430645402723">"USB उपकरणहरूको लागि पà¥à¤°à¤¾à¤¥à¤®à¤¿à¤•ताहरू र अनà¥à¤®à¤¤à¤¿à¤¹à¤°à¥‚ पà¥à¤°à¤¬à¤¨à¥à¤§ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_manageUsb" msgid="7776155430218239833">"USB उपकरणहरूको लागि पà¥à¤°à¤¾à¤¥à¤®à¤¿à¤•ताहरू र अनà¥à¤®à¤¤à¤¿à¤¹à¤°à¥‚लाई वà¥à¤¯à¤µà¤¸à¥à¤¥à¤¾à¤ªà¤¨ गरà¥à¤¨à¤•ो लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_accessMtp" msgid="4953468676795917042">"MTP पà¥à¤°à¥‹à¤Ÿà¥‹à¤•ल कारà¥à¤¯à¤¾à¤¨à¥à¤µà¤¯à¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_accessMtp" msgid="6532961200486791570">"MTP USB पà¥à¤°à¥‹à¤Ÿà¥‹à¤•ल कारà¥à¤¯à¤¾à¤¨à¥à¤µà¤¯à¤¨ गरà¥à¤¨ केरà¥à¤¨à¤² MTP डà¥à¤°à¤¾à¤‡à¤­à¤°à¤•ो पहà¥à¤à¤šà¤•ो अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_hardware_test" msgid="4148290860400659146">"हारà¥à¤¡à¤µà¥‡à¤¯à¤° परीकà¥à¤·à¤£ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_hardware_test" msgid="6597964191208016605">"हारà¥à¤¡à¤µà¥‡à¤¯à¤° परीकà¥à¤·à¤£à¤•ो उदà¥à¤¦à¥‡à¤¶à¥à¤¯à¤•ा लागि विभिनà¥à¤¨ परिधीयहरूलाई नियनà¥à¤¤à¥à¤°à¤£ गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_callPhone" msgid="3925836347681847954">"फोन नमà¥à¤¬à¤°à¤¹à¤°à¥‚मा सिधै कल गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_callPhone" msgid="3740797576113760827">"तपाईà¤à¤•ो हसà¥à¤¤à¤•à¥à¤·à¥‡à¤ª बेगरै फोन नमà¥à¤¬à¤° कल गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ यसले अनपेकà¥à¤·à¤¿à¤¤ शà¥à¤²à¥à¤• वा कलहरू गराउन सकà¥à¤›à¥¤ यसले अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई आपतकालीन नमà¥à¤¬à¤°à¤¹à¤°à¥‚ कल गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिà¤à¤¦à¥ˆà¤¨ विचार गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤ खराब अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूले तपाईà¤à¤•ो सà¥à¤µà¥€à¤•ार बिना कलहरू गरेर तपाईà¤à¤²à¤¾à¤ˆ बढी पैसा तिराउन सकà¥à¤›à¥¤"</string>
+ <string name="permlab_callPrivileged" msgid="4198349211108497879">"कà¥à¤¨à¥ˆ पनि फोन नमà¥à¤¬à¤°à¤¹à¤°à¥‚ सिधै कल गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_callPrivileged" msgid="1689024901509996810">"कà¥à¤¨à¥ˆ पनि फोन नमà¥à¤¬à¤°à¤®à¤¾, आकसà¥à¤®à¤¿à¤• नमà¥à¤¬à¤° सहित, तपाईà¤à¤•ो हसà¥à¤¤à¤•à¥à¤·à¥‡à¤ª बिना कल गरà¥à¤¨à¤•ो लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ खराब अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूले अनावशà¥à¤¯à¤• र गैर कानà¥à¤¨à¥€ कलहरूलाई आकसà¥à¤®à¤¿à¤•मा सà¥à¤¥à¤¾à¤¨à¤¾à¤¨à¥à¤¤à¤°à¤£ गरà¥à¤¨ सकà¥à¤›à¤¨à¥à¥¤"</string>
+ <string name="permlab_performCdmaProvisioning" product="tablet" msgid="4842576994144604821">"CDMA टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿ सेटअफ सिधै सà¥à¤°à¥ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permlab_performCdmaProvisioning" product="default" msgid="5604848095315421425">"CDMA फोन सेटअप सिधै सà¥à¤°à¥ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_performCdmaProvisioning" msgid="1994193538802314186">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई CDMA पà¥à¤°à¤¾à¤µà¤§à¤¾à¤¨ सà¥à¤°u गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ खराब अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूले अनावशà¥à¤¯à¤• रूपमा CDMA पà¥à¤°à¤¾à¤µà¤§à¤¾à¤¨ सà¥à¤°à¥ गरà¥à¤¨ सकà¥à¤›à¤¨à¥à¥¤"</string>
+ <string name="permlab_locationUpdates" msgid="7785408253364335740">"सà¥à¤¥à¤¾à¤¨ अपडेट सूचनाहरू नियनà¥à¤¤à¥à¤°à¤£ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_locationUpdates" msgid="1120741557891438876">"रेडियोबाट सà¥à¤¥à¤¾à¤¨ अदà¥à¤¯à¤¾à¤µà¤§à¤¿à¤• सूचनाहरूलाई सकà¥à¤·à¤®/असकà¥à¤·à¤® गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ सामानà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूबाट पà¥à¤°à¤¯à¥‹à¤— नहà¥à¤¨à¥‡à¥¤"</string>
+ <string name="permlab_checkinProperties" msgid="7855259461268734914">"परीकà¥à¤·à¤£ विशेषताहरू पहà¥à¤à¤š गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_checkinProperties" msgid="4024526968630194128">"परीकà¥à¤·à¤£ सेवादà¥à¤µà¤¾à¤°à¤¾ विशेषता अपलोड भà¤à¤•ो पहà¥à¤à¤š पढà¥à¤¨/लेखà¥â€à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ साधारण अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—दà¥à¤µà¤¾à¤°à¤¾ पà¥à¤°à¤¯à¥‹à¤—को लागि होइन।"</string>
+ <string name="permlab_bindGadget" msgid="776905339015863471">"विजेटहरूको चयन गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_bindGadget" msgid="8261326938599049290">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई पà¥à¤°à¤£à¤¾à¤²à¥€à¤²à¤¾à¤ˆ कà¥à¤¨ विजेट कà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—दà¥à¤µà¤¾à¤°à¤¾ पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨ सकिनà¥à¤› भनेर अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ यस अनà¥à¤®à¤¤à¤¿à¤¸à¤¹à¤¿à¤¤à¤•ो अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—ले अनà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूलाई वà¥à¤¯à¤•à¥à¤¤à¤¿à¤—त डेटाको पहà¥à¤à¤š दिन सकà¥à¤¦à¤›à¥¤ सामानà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूको पà¥à¤°à¤¯à¥‹à¤—को लागि होइन।"</string>
+ <string name="permlab_modifyPhoneState" msgid="8423923777659292228">"फोनको सà¥à¤¥à¤¿à¤¤à¤¿ परिमारà¥à¤œà¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_modifyPhoneState" msgid="1029877529007686732">"उपकरणका फोन विशेषताहरूलाई नियनà¥à¤¤à¥à¤°à¤£ गरà¥à¤¨à¤•ो लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ यस अनà¥à¤®à¤¤à¤¿à¤²à¥‡ à¤à¤‰à¤Ÿà¤¾ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—ले नेटवरà¥à¤• सà¥à¤µà¤¿à¤š गरà¥à¤¨, फोन रेडियो बनà¥à¤¦ गरà¥à¤¨ र खोलà¥à¤¨ र जसà¥à¤¤à¥ˆ तपाईठसधै सूचित नगरी गरà¥à¤¨ सकà¥à¤›à¥¤"</string>
+ <string name="permlab_readPhoneState" msgid="9178228524507610486">"फोन सà¥à¤¥à¤¿à¤¤à¤¿ र पहिचान पढà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_readPhoneState" msgid="1639212771826125528">"उपकरणको फोन विशेषताहरूको पहà¥à¤à¤š गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ यस अनà¥à¤®à¤¤à¤¿à¤²à¥‡ फोन नमà¥à¤¬à¤° र उपकरणको IDs, कल सकà¥à¤·à¤® छ कि छैन र कलदà¥à¤µà¤¾à¤°à¤¾ जोडिà¤à¤•ो टाढाको नमà¥à¤¬à¤° निरà¥à¤§à¤¾à¤°à¤£ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿà¤²à¤¾à¤ˆ निनà¥à¤¦à¥à¤°à¤¾à¤®à¤¾ जानबाट रोकà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permlab_wakeLock" product="default" msgid="573480187941496130">"फोनलाई निदाउनबाट रोकà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_wakeLock" product="tablet" msgid="7311319824400447868">"टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿà¤²à¤¾à¤ˆ निसà¥à¤•à¥à¤°à¤¿à¤¯ हà¥à¤¨à¤¬à¤¾à¤Ÿ रोकà¥à¤¨à¤•ो लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permdesc_wakeLock" product="default" msgid="8559100677372928754">"फोनलाई निसà¥à¤•à¥à¤°à¤¿à¤¯ हà¥à¤¨à¤¬à¤¾à¤Ÿ रोकà¥à¤¨à¤•ो लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_devicePower" product="tablet" msgid="2787034722616350417">"टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿ पावर खोलà¥à¤¨ र बनà¥à¤¦ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permlab_devicePower" product="default" msgid="4928622470980943206">"फोन खोलà¥à¤¨ वा बनà¥à¤¦ गरà¥à¤¨ उरà¥à¤œà¤¾ पà¥à¤°à¤¦à¤¾à¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸"</string>
+ <string name="permdesc_devicePower" product="tablet" msgid="6689862878984631831">"टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿà¤²à¤¾à¤ˆ खोलà¥à¤¨ र बनà¥à¤¦ गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permdesc_devicePower" product="default" msgid="6037057348463131032">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई फोन खोलà¥à¤¨ र बनà¥à¤¦ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_factoryTest" msgid="3715225492696416187">"फà¥à¤¯à¤¾à¤•à¥à¤Ÿà¥à¤°à¤¿ परीकà¥à¤·à¤£ मोडमा चालॠगरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_factoryTest" product="tablet" msgid="3952059318359653091">"टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿ हारà¥à¤¡à¤µà¥‡à¤¯à¤°à¤²à¤¾à¤ˆ पà¥à¤°à¤¾ पहà¥à¤à¤š गरà¥à¤¨ दिà¤à¤¦à¥ˆ तलà¥à¤²à¥‹ सà¥à¤¤à¤° उतà¥à¤¤à¥à¤ªà¤¾à¤¦à¤• परीकà¥à¤·à¤£à¤•ो रूपमा चलाउनà¥à¤¹à¥‹à¤¸à¥à¥¤ टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿ उतà¥à¤¤à¥à¤ªà¤¾à¤¦à¤• परीकà¥à¤·à¤£ मोडमा चलिरहेको बेला मातà¥à¤° उपलबà¥à¤§ हà¥à¤¨à¥à¤›à¥¤"</string>
+ <string name="permdesc_factoryTest" product="default" msgid="8136644990319244802">"तलà¥à¤²à¥‹ सà¥à¤¤à¤° उतà¥à¤¤à¥à¤ªà¤¾à¤¦à¤• जसà¥à¤¤à¥ˆ चलाउनà¥à¤¹à¥‹à¤¸à¥, पà¥à¤°à¤¾ पहà¥à¤à¤š दिन फोन हारà¥à¤¡à¤µà¥‡à¤¯à¤°à¤²à¤¾à¤ˆ अनà¥à¤®à¤¤à¤¿ हà¥à¤¨à¥à¤›à¥¤ फोन उतà¥à¤ªà¤¾à¤¦à¤• परीकà¥à¤·à¤£ मोडमा चलिरहेको बेला मातà¥à¤° उपलबà¥à¤§ हà¥à¤¨à¥à¤›à¥¤"</string>
+ <string name="permlab_setWallpaper" msgid="6627192333373465143">"वालपेपर सेट गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_setWallpaper" msgid="7373447920977624745">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई पà¥à¤°à¤£à¤¾à¤²à¥€ वालपेपर सेट गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_setWallpaperHints" msgid="3278608165977736538">"तपाईंको वालपेपर आकार समायोजन गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_setWallpaperHints" msgid="8235784384223730091">"पà¥à¤°à¤£à¤¾à¤²à¥€ वालपेपरको आकार सङà¥à¤•ेतहरू मिलाउन अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_masterClear" msgid="2315750423139697397">"कारà¥à¤¯à¤¶à¤¾à¤²à¤¾ पूरà¥à¤µà¤¨à¤¿à¤°à¥à¤§à¤¾à¤°à¤£à¤•ो लागि पà¥à¤°à¤£à¤¾à¤²à¥€ पà¥à¤¨à¤ƒà¤¸à¥‡à¤Ÿ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_masterClear" msgid="3665380492633910226">"यसका फà¥à¤¯à¤¾à¤•à¥à¤Ÿà¥à¤°à¤¿ सेटिङहरू, कनà¥à¤«à¤¿à¤—रेसन र सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूलाई पà¥à¤°à¤£à¤¾à¤²à¥€à¤®à¤¾ पà¥à¤°à¥ˆ पà¥à¤¨à¤ƒà¤¸à¥‡à¤Ÿ गरà¥à¤¨à¤•ो लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_setTime" msgid="2021614829591775646">"समय सेट गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_setTime" product="tablet" msgid="1896341438151152881">"टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿà¤•ो घडीको समय बदलà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permdesc_setTime" product="default" msgid="1855702730738020">"फोनको घडीको समय बदलà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_setTimeZone" msgid="2945079801013077340">"समय कà¥à¤·à¥‡à¤¤à¥à¤° सेट गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_setTimeZone" product="tablet" msgid="1676983712315827645">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿà¤•ो समय कà¥à¤·à¥‡à¤¤à¥à¤° परिवरà¥à¤¤à¤¨ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permdesc_setTimeZone" product="default" msgid="4499943488436633398">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई फोनको समय कà¥à¤·à¥‡à¤¤à¥à¤° परिवरà¥à¤¤à¤¨ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_accountManagerService" msgid="4829262349691386986">"AccountManagerService को रूपमा कारà¥à¤¯ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_accountManagerService" msgid="1948455552333615954">"खाता अधिकारीहरूलाई कल गरà¥à¤¨à¤•ो लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—ले अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_getAccounts" msgid="1086795467760122114">"उपकरणमा खाताहरू भेटà¥à¤Ÿà¤¾à¤‰à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_getAccounts" product="tablet" msgid="2741496534769660027">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿà¤¦à¥à¤µà¤¾à¤°à¤¾ जà¥à¤žà¤¾à¤¤ खाताहरूको सूची पाउन अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ यसले अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—दà¥à¤µà¤¾à¤°à¤¾ तपाईंले सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ गरà¥à¤¨à¥à¤­à¤à¤•ो कà¥à¤¨à¥ˆ पनि खाताहरू समावेश गरà¥à¤¨ सकà¥à¤¦à¤›à¥¤"</string>
+ <string name="permdesc_getAccounts" product="default" msgid="3448316822451807382">"फोनलाई थाहा भà¤à¤•ा खाताहरूको सूची पà¥à¤°à¤¾à¤ªà¥à¤¤ गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ यसले तपाईà¤à¤²à¥‡ सà¥à¤¥à¤¾à¤ªà¤¨à¤¾ गरà¥à¤¨à¥ भà¤à¤•ा अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूबाट सृजित कà¥à¤¨à¥ˆ खाताहरू समावेश हà¥à¤¨ सकà¥à¤›à¥¤"</string>
+ <string name="permlab_authenticateAccounts" msgid="5265908481172736933">"खाता सिरà¥à¤œà¤¨à¤¾ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ र पासवरà¥à¤¡ सेट गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_authenticateAccounts" msgid="5472124296908977260">"खाताहरूको सिरà¥à¤œà¤¨à¤¾ गरà¥à¤¨à¥‡ र पà¥à¤°à¤¾à¤ªà¥à¤¤ गरà¥à¤¨à¥‡ र उनीहरूको पासवरà¥à¤¡à¤¹à¤°à¥‚को सेटिङ गरà¥à¤¨à¥‡ सहित खाता पà¥à¤°à¤¬à¤¨à¥à¤§à¤•को खाता आधिकारी सकà¥à¤·à¤®à¤¤à¤¾à¤¹à¤°à¥‚ पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_manageAccounts" msgid="4983126304757177305">"खाताहरू थपà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ वा हटाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_manageAccounts" msgid="8698295625488292506">"खाताहरू थपà¥à¤¨à¥‡ र हटाउने जसà¥à¤¤à¤¾ पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾à¤¹à¤°à¥‚ समà¥à¤ªà¤¨à¥à¤¨ गरà¥à¤¨, र उनीहरूको पासवरà¥à¤¡ मेटाउन अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_useCredentials" msgid="235481396163877642">"उपकरणमा खाताहरूको पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_useCredentials" msgid="7984227147403346422">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई पà¥à¤°à¤®à¤¾à¤£à¥€à¤•रण टोकनहरू अनà¥à¤°à¥‹à¤§ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_accessNetworkState" msgid="4951027964348974773">"नेटवरà¥à¤• जडानहरू हेरà¥à¤¨à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_accessNetworkState" msgid="8318964424675960975">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई नेटवरà¥à¤• जडानहरू जसà¥à¤¤à¥ˆ कà¥à¤¨ नेटवरà¥à¤•हरू अवसà¥à¤¥à¤¿à¤¤ हà¥à¤¨à¥à¤›à¤¨à¥ र जडित छनॠजसले हेरà¥à¤¨à¤²à¤¾à¤ˆ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_createNetworkSockets" msgid="8018758136404323658">"पूरà¥à¤£ नेटवरà¥à¤• पहà¥à¤à¤š"</string>
+ <string name="permdesc_createNetworkSockets" msgid="3403062187779724185">"नेटवरà¥à¤• सकेटहरू सिरà¥à¤œà¤¨à¤¾ गरà¥à¤¨ र कसà¥à¤Ÿà¤® नेटवरà¥à¤• पà¥à¤°à¥‹à¤Ÿà¥‹à¤•ल पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ बà¥à¤°à¤¾à¤‰à¤œà¤° र अनà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूले इनà¥à¤Ÿà¤°à¤¨à¥‡à¤Ÿà¤®à¤¾ डेटा पठाउने माधà¥à¤¯à¤® पà¥à¤°à¤¦à¤¾à¤¨ गरà¥à¤›à¤¨à¥, तà¥à¤¯à¤¸à¥ˆà¤²à¥‡ इनà¥à¤Ÿà¤°à¤¨à¥‡à¤Ÿà¤®à¤¾ डेटा पठाउन यो अनà¥à¤®à¤¤à¤¿à¤•ो आवशà¥à¤¯à¤•ता परà¥à¤¦à¥ˆà¤¨à¥¤"</string>
+ <string name="permlab_writeApnSettings" msgid="505660159675751896">"नेटवरà¥à¤• सेटिङहरू र टà¥à¤°à¤¾à¤«à¤¿à¤• परिवरà¥à¤¤à¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ / रोकà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_writeApnSettings" msgid="5333798886412714193">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई नेटवरà¥à¤• सेटिङहरू परिवरà¥à¤¤à¤¨ गरà¥à¤¨ र सबै नेटवरà¥à¤• टà¥à¤°à¤¾à¤«à¤¿à¤• रोकà¥à¤¨ र परीकà¥à¤·à¤£ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›, उदाहरणको लागि कà¥à¤¨à¥ˆ पनि APN को पà¥à¤°à¥‹à¤•à¥à¤¸à¥€ र पोरà¥à¤Ÿ परिवरà¥à¤¤à¤¨ गरà¥à¤¨à¥¤ खराब अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूले तपाईंको जà¥à¤žà¤¾à¤¨ बिना नेटवरà¥à¤• पà¥à¤¯à¤¾à¤•ेटहरू मोनिटर गरà¥à¤¨, पà¥à¤¨:निरà¥à¤¦à¥‡à¤¶à¤¿à¤¤ गरà¥à¤¨, वा परिमारà¥à¤œà¤¨ गरà¥à¤¨ सकà¥à¤¦à¤›à¥¤"</string>
+ <string name="permlab_changeNetworkState" msgid="958884291454327309">"नेटवरà¥à¤• जडान परिवरà¥à¤¤à¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_changeNetworkState" msgid="6789123912476416214">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई नेटवरà¥à¤• जडानको सà¥à¤¥à¤¿à¤¤à¤¿ परिवरà¥à¤¤à¤¨ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_changeTetherState" msgid="5952584964373017960">"टेथरà¥à¤¡ नेटवरà¥à¤• जडान परिवरà¥à¤¤à¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_changeTetherState" msgid="1524441344412319780">"टिथर गरेको नेटवरà¥à¤• जडानको सà¥à¤¥à¤¿à¤¤à¤¿ बदलà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_changeBackgroundDataSetting" msgid="1400666012671648741">"पृषà¥à¤ à¤­à¥‚मि डेटा पà¥à¤°à¤¯à¥‹à¤— सेटिङहरू परिवरà¥à¤¤à¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_changeBackgroundDataSetting" msgid="5347729578468744379">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई पृषà¥à¤ à¤­à¥‚मि डेटा उपयोग सेटिङ परिवरà¥à¤¤à¤¨ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_accessWifiState" msgid="5202012949247040011">"वाइ-फाइ जडानहरू हेरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_accessWifiState" msgid="5002798077387803726">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई वाइ-फाइ नेटवरà¥à¤•को बारेमा जानकारी हेरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›, जसà¥à¤¤à¥ˆ कि वाइ-फाइ सकà¥à¤·à¤® छ कि छैन र जडान गरिà¤à¤•ो वाइ-फाइ उपकरणहरूको नाम।"</string>
+ <string name="permlab_changeWifiState" msgid="6550641188749128035">"वाइ-फाइसà¤à¤— जोडà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ वा छà¥à¤Ÿà¤¾à¤‰à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_changeWifiState" msgid="7137950297386127533">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई वाइ-फाइ पहà¥à¤à¤š बिनà¥à¤¦à¥à¤¬à¤¾à¤Ÿ जडान गरà¥à¤¨ र विचà¥à¤›à¥‡à¤¦à¤¨ गरà¥à¤¨ र वाइ-फाइ नेटवरà¥à¤•हरूको लागि उपकरण कनà¥à¤«à¤¿à¤—रेसनमा परिवरà¥à¤¤à¤¨à¤¹à¤°à¥‚ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_changeWifiMulticastState" msgid="1368253871483254784">"वाइ-फाइ Multicast सà¥à¤µà¤¿à¤•ृतिलाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_changeWifiMulticastState" product="tablet" msgid="7969774021256336548">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई मलà¥à¤Ÿà¤¿à¤•ाषà¥à¤Ÿ ठेगानाहरू पà¥à¤°à¤¯à¥‹à¤— गरेर वाइ-फाइ नेटवरà¥à¤•मा पठाइà¤à¤•ो पà¥à¤¯à¤¾à¤•ेटहरू पà¥à¤°à¤¾à¤ªà¥à¤¤ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›, केवल तपाईंको टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿ मातà¥à¤° होइन। यसले गैर-मलà¥à¤Ÿà¤¿à¤•ाषà¥à¤Ÿ मोड भनà¥à¤¦à¤¾ बढी उरà¥à¤œà¤¾ पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¦à¤›à¥¤"</string>
+ <string name="permdesc_changeWifiMulticastState" product="default" msgid="6851949706025349926">"तपाईà¤à¤•ो फोन मातà¥à¤° होइन, मलà¥à¤Ÿà¤¿à¤•ासà¥à¤Ÿ ठेगानाहरूको पà¥à¤°à¤¯à¥‹à¤— गरे वाइ-फाइ नेटवरà¥à¤•का सबै उपकरणहरूमा पठाइà¤à¤•ा पà¥à¤¯à¤¾à¤•ेटहरू पà¥à¤°à¤¾à¤ªà¥à¤¤ गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ यसले गैर-मलà¥à¤Ÿà¤¿à¤•ासà¥à¤Ÿ मोडभनà¥à¤¦à¤¾ बढी उरà¥à¤œà¤¾ पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤›à¥¤"</string>
+ <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"बà¥à¤²à¥à¤Ÿà¥à¤¥ सेटिङहरूमा पहà¥à¤à¤š गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"सà¥à¤¥à¤¾à¤¨à¥€à¤¯ बà¥à¤²à¥à¤Ÿà¥à¤¥ टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿà¤²à¤¾à¤ˆ कनà¥à¤«à¤¿à¤—र गरà¥à¤¨à¤•ो लागि र टाढाका उपकरणहरूलाई पतà¥à¤¤à¤¾ लगाउन र जोडà¥à¤¨à¤•ो लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई सà¥à¤¥à¤¾à¤¨à¥€à¤¯ बà¥à¤²à¥à¤Ÿà¥à¤¥ फोन कनà¥à¤«à¤¿à¤—र गरà¥à¤¨ र टाढाका उपकरणहरूसà¤à¤— खोज गरà¥à¤¨ र जोडी गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_accessWimaxState" msgid="4195907010610205703">"WiMAXसà¤à¤— जोडà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ वा छà¥à¤Ÿà¤¾à¤‰à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_accessWimaxState" msgid="6360102877261978887">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई वाइमà¥à¤¯à¤¾à¤•à¥à¤¸ सकà¥à¤·à¤® छ कि छैन र जडान भà¤à¤•ो कà¥à¤¨à¥ˆ पनि वाइमà¥à¤¯à¤¾à¤•à¥à¤¸ नेटवरà¥à¤•हरूको बारेमा जानकारी निरà¥à¤§à¤¾à¤°à¤¿à¤£ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_changeWimaxState" msgid="2405042267131496579">"वाइमà¥à¤¯à¤¾à¤•à¥à¤¸ सà¥à¤¥à¤¿à¤¤à¤¿ परिवरà¥à¤¤à¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई वाइमà¥à¤¯à¤¾à¤•à¥à¤¸ नेटवरà¥à¤•हरूबाट टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿ जडान गरà¥à¤¨ र टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿ विचà¥à¤›à¥‡à¤¦à¤¨ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"वाइमà¥à¤¯à¤¾à¤•à¥à¤¸ नेटवरà¥à¤•हरूसà¤à¤— फोन जोडà¥à¤¨ र छà¥à¤Ÿà¤¾à¤‰à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_bluetooth" msgid="6127769336339276828">"बà¥à¤²à¥à¤Ÿà¥à¤¥ उपकरणहरूसà¤à¤— जोडी मिलाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿà¤®à¤¾ बà¥à¤²à¥à¤Ÿà¥à¤¥à¤•ो कनà¥à¤«à¤¿à¤—à¥à¤°à¥‡à¤¸à¤¨à¤²à¤¾à¤ˆ हेरà¥à¤¨ र बनाउन र जोडी उपकरणहरूसà¤à¤— जडानहरूलाई सà¥à¤µà¥€à¤•ार गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई फोनमा बà¥à¤²à¥à¤Ÿà¥à¤¥à¤•ो कनà¥à¤«à¤¿à¤—रेसन हेरà¥à¤¨ र जोडी भà¤à¤•ा उपकरणहरूसà¤à¤— जडानहरू बनाउन र सà¥à¤µà¥€à¤•ार गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_nfc" msgid="4423351274757876953">"नजिक कà¥à¤·à¥‡à¤¤à¥à¤° संचार नियनà¥à¤¤à¥à¤°à¤£à¤¹à¤°à¥‚"</string>
+ <string name="permdesc_nfc" msgid="7120611819401789907">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई नयाठकà¥à¤·à¥‡à¤¤à¥à¤° संचार (NFC) टà¥à¤¯à¤¾à¤—हरू, कारà¥à¤¡à¤¹à¤°à¥‚ र पाठकहरूसà¤à¤— अनà¥à¤¤à¤°à¥à¤•à¥à¤°à¤¿à¤¯à¤¾ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_disableKeyguard" msgid="3598496301486439258">"सà¥à¤•à¥à¤°à¤¿à¤¨ लक असकà¥à¤·à¤® पारà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_disableKeyguard" msgid="6034203065077122992">"कà¥à¤¨à¥ˆ समà¥à¤¬à¤¨à¥à¤§à¤¿à¤¤ पासवरà¥à¤¡ सà¥à¤°à¤•à¥à¤·à¤¾ र किलकलाई असकà¥à¤·à¤® पारà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ उदाहरणको लागि, अनà¥à¤¤à¤°à¥à¤—मन फोन कल पà¥à¤°à¤¾à¤ªà¥à¤¤ गरà¥à¤¦à¤¾ फोनले किलकलाई असकà¥à¤·à¤® पारà¥à¤›, तà¥à¤¯à¤¸à¤ªà¤›à¤¿ कल सकिà¤à¤•ो बेला किलक पà¥à¤¨à¤ƒà¤¸à¤•à¥à¤·à¤® पारà¥à¤›à¥¤"</string>
+ <string name="permlab_readSyncSettings" msgid="6201810008230503052">"समीकरण सेटिङहरू पढà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई खाताको लागि सिङà¥à¤• सेटिङहरू पढà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ उदाहरणको लागि यसले वà¥à¤¯à¤•à¥à¤¤à¤¿à¤¹à¤°à¤•ो अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— खातासà¤à¤— सिङà¥à¤• भà¤à¤•ो नभà¤à¤•ो निरà¥à¤§à¤¾à¤°à¤£ गरà¥à¤¨ सकà¥à¤¦à¤›à¥¤"</string>
+ <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"टगल सिङà¥à¤• खà¥à¤²à¤¾ र बनà¥à¤¦"</string>
+ <string name="permdesc_writeSyncSettings" msgid="8956262591306369868">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूलाई खाताको लागि सिङà¥à¤• सेटिङहरू परिमारà¥à¤œà¤¨ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ उदाहरणको लागि, यो खातासà¤à¤— वà¥à¤¯à¤•à¥à¤¤à¤¿ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—को सिङà¥à¤• सकà¥à¤·à¤® गरà¥à¤¨ पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨ सकिनà¥à¤›à¥¤"</string>
+ <string name="permlab_readSyncStats" msgid="7396577451360202448">"सिङà¥à¤• तथà¥à¤¯à¤¾à¤™à¥à¤•हरू पढà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_readSyncStats" msgid="1510143761757606156">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई खाताको लागि समीकरणको आà¤à¤•डा समीकरण घटनाहरूको इतिहास र समीकरण गरिà¤à¤•ो डेटाको मापन समेत, पढà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"सदसà¥à¤¯ बनाइका फिडहरू पढà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अहिलेको समीकरण गरिà¤à¤•ा सूचकहरू बारे विवरणहरू लिने अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_subscribedFeedsWrite" msgid="9015246325408209296">"सदसà¥à¤¯ बनाइका फिडहरू लेखà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_subscribedFeedsWrite" msgid="6928930188826089413">"तपाईà¤à¤•ा भरà¥à¤–रै सिङà¥à¤• फिडहरूलाई परिमारà¥à¤œà¤¨ गरà¥à¤¨à¤•ो लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ तपाईà¤à¤•ो सिङà¥à¤• फिडहरूलाई परिवरà¥à¤¤à¤¨ गरà¥à¤¨à¤•ो लागि यसले खराब अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिन सकà¥à¤›à¥¤"</string>
+ <string name="permlab_readDictionary" msgid="4107101525746035718">"तपाईà¤à¤²à¥‡ शबà¥à¤¦à¤•ोशमा थपेका शबà¥à¤¦à¤¹à¤°à¥‚ पढà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_readDictionary" msgid="659614600338904243">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤²à¥‡ पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ शबà¥à¤¦à¤•ोशमा भणà¥à¤¡à¤¾à¤°à¤£ गरेका हà¥à¤¨ सकà¥à¤¨à¥‡ सबै शबà¥à¤¦à¤¹à¤°à¥‚, नामहरू र पदावलीहरू पढà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_writeDictionary" msgid="2183110402314441106">"पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾-परिभाषित शबà¥à¤¦à¤•ोशमा शबà¥à¤¦à¤¹à¤°à¥‚ थपà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="permdesc_writeDictionary" msgid="8185385716255065291">"पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ शबà¥à¤¦à¤•ोशमा नयाठशबà¥à¤¦ लेखà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_sdcardRead" product="nosdcard" msgid="8235341515605559677">"सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ गरिà¤à¤•ा भणà¥à¤¡à¤¾à¤°à¤£ पहà¥à¤à¤šà¤•ो परीकà¥à¤·à¤£ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permlab_sdcardRead" product="default" msgid="8235341515605559677">"सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ गरिà¤à¤•ा भणà¥à¤¡à¤¾à¤°à¤£ पहà¥à¤à¤šà¤•ो परीकà¥à¤·à¤£ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_sdcardRead" product="nosdcard" msgid="3642473292348132072">"भविषà¥à¤¯ उपकरणहरूमा उपलबà¥à¤§ हà¥à¤¨à¥‡ USB भणà¥à¤¡à¤¾à¤°à¤£à¤•ो लागि अनà¥à¤®à¤¤à¤¿ परीकà¥à¤·à¤£ गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permdesc_sdcardRead" product="default" msgid="5914402684685848828">"भविषà¥à¤¯ उपकरणहरूमा उपलबà¥à¤§ हà¥à¤¨à¥‡ SD कारà¥à¤¡à¤•ो लागि अनà¥à¤®à¤¤à¤¿ परीकà¥à¤·à¤£ गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"तपाईà¤à¤•ो USB भणà¥à¤¡à¤¾à¤°à¤£à¤•ो विषयवसà¥à¤¤à¥à¤¹à¤°à¥‚लाई परिमारà¥à¤œà¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ वा मेटाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"तपाईà¤à¤•ो SD कारà¥à¤¡à¤•ो विषयसूची परिमारà¥à¤œà¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ वा मेटà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"USB भणà¥à¤¡à¤¾à¤°à¤£à¤®à¤¾ लेखà¥â€à¤¨à¤•ो लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई SD कारà¥à¤¡à¤®à¤¾ लेखà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"आनà¥à¤¤à¤°à¤¿à¤• मिडिया भणà¥à¤¡à¤¾à¤°à¤£ सामगà¥à¤°à¥€à¤¹à¤°à¥‚ परिमारà¥à¤œà¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥/मेटाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_mediaStorageWrite" product="default" msgid="8189160597698529185">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई आनà¥à¤¤à¤°à¤¿à¤• मिडिया भणà¥à¤¡à¤¾à¤°à¤£à¤•ो सामगà¥à¤°à¥€à¤¹à¤°à¥‚ परिमारà¥à¤œà¤¨ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_manageDocs" product="default" msgid="5778318598448849829">"कागजात भणà¥à¤¡à¤¾à¤°à¤£ पà¥à¤°à¤¬à¤¨à¥à¤§ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_manageDocs" product="default" msgid="8704323176914121484">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई कागजात भणà¥à¤¡à¤¾à¤°à¤£ समायोजन गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_sdcardAccessAll" msgid="8150613823900460576">"सबै उपयोगकरà¥à¤¤à¤¾à¤¹à¤°à¥‚को बाहà¥à¤¯ भणà¥à¤¡à¤¾à¤°à¤£à¤•ो पहà¥à¤à¤š राखà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_sdcardAccessAll" msgid="3215208357415891320">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई सबै उपयोगकरà¥à¤¤à¤¾à¤¹à¤°à¥‚को लागि बाहà¥à¤¯ भणà¥à¤¡à¤¾à¤°à¤£à¤®à¤¾à¤¥à¤¿ पहà¥à¤à¤š राखà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_cache_filesystem" msgid="5656487264819669824">"कà¥à¤¯à¤¾à¤¸ फाइल पà¥à¤°à¤£à¤¾à¤²à¥€ पहà¥à¤à¤š गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="permdesc_cache_filesystem" msgid="5578967642265550955">"केस फाइल पà¥à¤°à¤£à¤¾à¤²à¥€à¤²à¤¾à¤ˆ पढà¥à¤¨ र लेखà¥â€à¤¨à¤•ो लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_use_sip" msgid="5986952362795870502">"इनà¥à¤Ÿà¤°à¤¨à¥‡à¤Ÿ कलहरू गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ वा पà¥à¤°à¤¾à¤ªà¥à¤¤ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_use_sip" msgid="4717632000062674294">"इनà¥à¤Ÿà¤°à¤¨à¥‡à¤Ÿ कल गरà¥à¤¨/पà¥à¤°à¤¾à¤ªà¥à¤¤ गरà¥à¤¨ SIP सेवालाई पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨à¤•ो लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"नेटवरà¥à¤• उपयोगको इतिहास पढà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"निशà¥à¤šà¤¿à¤¤ नेटवरà¥à¤•हरू र अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूको लागि à¤à¤¤à¤¿à¤¹à¤¾à¤¸à¤¿à¤• नेटवरà¥à¤• उपयोग पढà¥à¤¨à¤•ो लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"नेटवरà¥à¤• नीति पà¥à¤°à¤¬à¤¨à¥à¤§ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"नेटवरà¥à¤• नीतिहरू वà¥à¤¯à¤µà¤¸à¥à¤¥à¤¾à¤ªà¤¨ गरà¥à¤¨ र अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—-विशेष नियमहरू परिभाषित गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"नेटवरà¥à¤• उपयोग लेखालाई परिमारà¥à¤œà¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई कसरी अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूको विरूदà¥à¤§à¤®à¤¾ कसरी नेटवरà¥à¤• उपयोगी अकाउनà¥à¤Ÿà¥‡à¤¡ छ भनेर परिमारà¥à¤œà¤¨ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ साधारण अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूदà¥à¤µà¤¾à¤°à¤¾ पà¥à¤°à¤¯à¥‹à¤—को लागि होइन।"</string>
+ <string name="permlab_markNetworkSocket" msgid="3658527214914959749">"सकेटको निशानहरू परिवरà¥à¤¤à¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_markNetworkSocket" msgid="7655568433696356578">"मारà¥à¤— दरà¥à¤¶à¤¨à¤•ो लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई सकेटको निशानहरू परिवरà¥à¤¤à¤¨ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›"</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"सूचनाहरू पहà¥à¤à¤š गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"अनà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूबाट पोसà¥à¤Ÿ गरिà¤à¤•ासहित पà¥à¤¨à¤ƒà¤ªà¥à¤°à¤¾à¤ªà¥à¤¤ गरà¥à¤¨, परीकà¥à¤·à¤£ गरà¥à¤¨ र सूचनाहरू हटाउन अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूलाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"जानकारी शà¥à¤°à¥‹à¤¤à¤¾ सेवामा बाà¤à¤§à¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"होलà¥à¤¡à¤°à¤²à¤¾à¤ˆ सूचना शà¥à¤°à¥‹à¤¤à¤¾ सेवाको शीरà¥à¤·-सà¥à¤¤à¤°à¤•ो इनà¥à¤Ÿà¤°à¤«à¥‡à¤¸ बाà¤à¤§à¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ सामानà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूलाई कहिले पनि आवशà¥à¤¯à¤• नपरà¥à¤¨ सकà¥à¤¦à¤›à¥¤"</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"वाहक-पà¥à¤°à¤¦à¤¾à¤¨ विनà¥à¤¯à¤¾à¤¸ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— सà¥à¤°à¥ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤²à¤¾à¤ˆ वाहक-पà¥à¤°à¤¦à¤¾à¤¨ विनà¥à¤¯à¤¾à¤¸ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— सà¥à¤°à¥ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ साधारण अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूलाई कहिलà¥à¤¯à¥ˆ आवशà¥à¤¯à¤• परà¥à¤¨à¥‡ छैन।"</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"सञà¥à¤œà¤¾à¤² अवसà¥à¤¥à¤¾à¤•ा परà¥à¤¯à¤µà¥‡à¤•à¥à¤·à¤£à¤•ा लागि सà¥à¤¨à¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"सञà¥à¤œà¤¾à¤² अवसà¥à¤¥à¤¾à¤•ा परà¥à¤¯à¤µà¥‡à¤•à¥à¤·à¤£ सà¥à¤¨à¥à¤¨à¤•ा लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤à¤¸à¤¾à¤®à¤¾à¤¨à¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई चाà¤à¤¹à¤¿à¤¦à¥ˆ नचाà¤à¤¹à¤¿à¤¨ सकà¥à¤›à¥¤"</string>
+ <string name="permlab_hotwordRecognition" msgid="3225080408746361313">"जलà¥à¤¦à¥‹à¤¬à¤²à¥à¤¦à¥‹ शबà¥à¤¦ पहिचानका लागि अनà¥à¤°à¥‹à¤§ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_hotwordRecognition" msgid="3716741260195364252">"जलà¥à¤¦à¤¾à¤¬à¤²à¥à¤¦à¤¾ शबà¥à¤¦ पहिचानका लागि अनà¥à¤°à¥‹à¤§ पठाउन अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤à¤¸à¤¾à¤®à¤¾à¤¨à¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—का लागि यो कहिलà¥à¤¯à¥ˆ नचाहिन सकà¥à¤›à¥¤"</string>
+ <string name="policylab_limitPassword" msgid="4497420728857585791">"पासवरà¥à¤¡ नियमहरू मिलाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="policydesc_limitPassword" msgid="3252114203919510394">"सà¥à¤•à¥à¤°à¤¿à¤¨-अनलक पासवरà¥à¤¡à¤¹à¤°à¥‚मा अनà¥à¤®à¤¤à¤¿ दिइà¤à¤•ो लमà¥à¤¬à¤¾à¤‡ र अकà¥à¤·à¤°à¤¹à¤°à¥‚ नियनà¥à¤¤à¥à¤°à¤£ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="policylab_watchLogin" msgid="914130646942199503">"मोनिटर सà¥à¤•à¥à¤°à¤¿à¤¨-अनलक पà¥à¤°à¤¯à¤¤à¥à¤¨à¤¹à¤°à¥‚"</string>
+ <string name="policydesc_watchLogin" product="tablet" msgid="3215729294215070072">"सà¥à¤•à¥à¤°à¤¿à¤¨ अनलक गरà¥à¤¦à¤¾ गलत पासवरà¥à¤¡ टाइप भà¤à¤•ो संखà¥à¤¯à¤¾ निरीकà¥à¤·à¤£ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ र यदि निकै धेरै गलत पासवरà¥à¤¡à¤¹à¤°à¥‚ टाइप भà¤à¤•ा छन भने टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿ लक गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ वा टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿà¤•ा सबै डेटा मेटà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="policydesc_watchLogin" product="default" msgid="5712323091846761073">"सà¥à¤•à¥à¤°à¤¿à¤¨à¤…नलक गरà¥à¤¦à¤¾ गलत पासवरà¥à¤¡ टाइप भà¤à¤•ो संखà¥à¤¯à¤¾ निरीकà¥à¤·à¤£ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ र यदि निकै धेरै गलत पासवरà¥à¤¡à¤¹à¤°à¥‚ टाइप भà¤à¤•ा छन भने फोन लक गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ वा फोनका सबै डेटा मेटà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="policylab_resetPassword" msgid="2620077191242688955">"सà¥à¤•à¥à¤°à¤¿à¤¨-अनलक पासवरà¥à¤¡ बदलà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="policydesc_resetPassword" msgid="605963962301904458">"सà¥à¤•à¥à¤°à¤¿à¤¨-अनलक पासवरà¥à¤¡ परिवरà¥à¤¤à¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="policylab_forceLock" msgid="2274085384704248431">"सà¥à¤•à¥à¤°à¤¿à¤¨ लक गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="policydesc_forceLock" msgid="1141797588403827138">"कसरी र कहिले सà¥à¤•à¥à¤°à¤¿à¤¨ लक गरà¥à¤¨à¥‡ नियनà¥à¤¤à¥à¤°à¤£ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="policylab_wipeData" msgid="3910545446758639713">"सबै डेटा मेटà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="policydesc_wipeData" product="tablet" msgid="4306184096067756876">"à¤à¤‰à¤Ÿà¤¾ फà¥à¤¯à¤¾à¤•à¥à¤Ÿà¥à¤°à¤¿ डेटा पà¥à¤¨à¤ƒà¤¸à¥‡à¤Ÿ गरेर चेतावनी नआउà¤à¤¦à¥ˆ टà¥à¤¯à¤¾à¤¬à¤²à¥à¤Ÿà¤•ो डेटा मेटà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="policydesc_wipeData" product="default" msgid="5096895604574188391">"à¤à¤‰à¤Ÿà¤¾ फà¥à¤¯à¤¾à¤•à¥à¤Ÿà¥à¤°à¤¿ डेटा पà¥à¤¨à¤ƒà¤¸à¥‡à¤Ÿ गरेर चेतावनी नआउà¤à¤¦à¥ˆ फोनको डेटा मेटà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="policylab_setGlobalProxy" msgid="2784828293747791446">"उपकरण विशà¥à¤µà¤µà¥à¤¯à¤¾à¤ªà¥€ पà¥à¤°à¥‹à¤•à¥à¤¸à¥€ मिलाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"नीति सकà¥à¤·à¤® हà¥à¤à¤¦à¤¾ पà¥à¤°à¤¯à¥‹à¤— हà¥à¤¨à¥‡ उपकरण विशà¥à¤µà¤µà¥à¤¯à¤¾à¤ªà¥€ पà¥à¤°à¥‹à¤•à¥à¤¸à¥€ सेट गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤ पà¥à¤°à¤¥à¤® उपकरण पà¥à¤°à¤¶à¤¾à¤¸à¤¶à¤¨à¤²à¥‡ मातà¥à¤° पà¥à¤°à¤­à¤¾à¤µà¤•ारी विशà¥à¤µà¤µà¥à¤¯à¤¾à¤ªà¥€ पà¥à¤°à¥‹à¤•à¥à¤¸à¥€ सेट गरà¥à¤›à¥¤"</string>
+ <string name="policylab_expirePassword" msgid="885279151847254056">"लक-सà¥à¤•à¥à¤°à¤¿à¤¨ पासवरà¥à¤¡ अनà¥à¤¤ सेट गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="policydesc_expirePassword" msgid="1729725226314691591">"पà¥à¤°à¤¾à¤¯à¤ƒ कति छिटो लक-सà¥à¤•à¥à¤°à¤¿à¤¨ पासवरà¥à¤¡ बदलà¥à¤¨à¥ परà¥à¤› यसलाई नियनà¥à¤¤à¥à¤°à¤£ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="policylab_encryptedStorage" msgid="8901326199909132915">"भणà¥à¤¡à¤¾à¤°à¤£ इनà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤¸à¤¨ मिलाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="policydesc_encryptedStorage" msgid="2637732115325316992">"भणà¥à¤¡à¤¾à¤° गरिà¤à¤•ो डेटा इनà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ हà¥à¤¨à¥ आवशà¥à¤¯à¤• छ।"</string>
+ <string name="policylab_disableCamera" msgid="6395301023152297826">"कà¥à¤¯à¤¾à¤®à¥‡à¤°à¤¾à¤²à¤¾à¤ˆ असकà¥à¤·à¤® गराउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="policydesc_disableCamera" msgid="2306349042834754597">"सबै उपकरण कà¥à¤¯à¤¾à¤®à¤°à¤¾à¤¹à¤°à¥‚को पà¥à¤°à¤¯à¥‹à¤— रोकà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="policylab_disableKeyguardFeatures" msgid="266329104542638802">"किगारà¥à¤¡à¤®à¤¾ भà¤à¤•ा विशेषताहरू असकà¥à¤·à¤® पारà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="policydesc_disableKeyguardFeatures" msgid="3467082272186534614">"केही किगारà¥à¤¡ विशेषताहरूको पà¥à¤°à¤¯à¥‹à¤— रोकà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string-array name="phoneTypes">
+ <item msgid="8901098336658710359">"गृह"</item>
+ <item msgid="869923650527136615">"मोबाइल"</item>
+ <item msgid="7897544654242874543">"काम गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</item>
+ <item msgid="1103601433382158155">"कारà¥à¤¯ फà¥à¤¯à¤¾à¤•à¥à¤¸"</item>
+ <item msgid="1735177144948329370">"घरको फà¥à¤¯à¤¾à¤•à¥à¤¸"</item>
+ <item msgid="603878674477207394">"पेजर"</item>
+ <item msgid="1650824275177931637">"अनà¥à¤¯"</item>
+ <item msgid="9192514806975898961">"अनà¥à¤•ूलन"</item>
+ </string-array>
+ <string-array name="emailAddressTypes">
+ <item msgid="8073994352956129127">"गृह"</item>
+ <item msgid="7084237356602625604">"काम"</item>
+ <item msgid="1112044410659011023">"अनà¥à¤¯"</item>
+ <item msgid="2374913952870110618">"अनà¥à¤•ूलन"</item>
+ </string-array>
+ <string-array name="postalAddressTypes">
+ <item msgid="6880257626740047286">"गृह"</item>
+ <item msgid="5629153956045109251">"काम"</item>
+ <item msgid="4966604264500343469">"अनà¥à¤¯"</item>
+ <item msgid="4932682847595299369">"अनà¥à¤•ूलन"</item>
+ </string-array>
+ <string-array name="imAddressTypes">
+ <item msgid="1738585194601476694">"गृह"</item>
+ <item msgid="1359644565647383708">"काम"</item>
+ <item msgid="7868549401053615677">"अनà¥à¤¯"</item>
+ <item msgid="3145118944639869809">"अनà¥à¤•ूलन"</item>
+ </string-array>
+ <string-array name="organizationTypes">
+ <item msgid="7546335612189115615">"काम गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</item>
+ <item msgid="4378074129049520373">"अनà¥à¤¯"</item>
+ <item msgid="3455047468583965104">"अनà¥à¤•ूलन"</item>
+ </string-array>
+ <string-array name="imProtocols">
+ <item msgid="8595261363518459565">"AIM"</item>
+ <item msgid="7390473628275490700">"Windows Live"</item>
+ <item msgid="7882877134931458217">"Yahoo"</item>
+ <item msgid="5035376313200585242">"सà¥à¤•ाइप"</item>
+ <item msgid="7532363178459444943">"QQ"</item>
+ <item msgid="3713441034299660749">"Google Talk"</item>
+ <item msgid="2506857312718630823">"ICQ"</item>
+ <item msgid="1648797903785279353">"Jabber"</item>
+ </string-array>
+ <string name="phoneTypeCustom" msgid="1644738059053355820">"अनà¥à¤•ूलन"</string>
+ <string name="phoneTypeHome" msgid="2570923463033985887">"गृह"</string>
+ <string name="phoneTypeMobile" msgid="6501463557754751037">"मोबाइल"</string>
+ <string name="phoneTypeWork" msgid="8863939667059911633">"काम"</string>
+ <string name="phoneTypeFaxWork" msgid="3517792160008890912">"कारà¥à¤¯ फà¥à¤¯à¤¾à¤•à¥à¤¸"</string>
+ <string name="phoneTypeFaxHome" msgid="2067265972322971467">"घरको फà¥à¤¯à¤¾à¤•à¥à¤¸"</string>
+ <string name="phoneTypePager" msgid="7582359955394921732">"पेजर"</string>
+ <string name="phoneTypeOther" msgid="1544425847868765990">"अनà¥à¤¯"</string>
+ <string name="phoneTypeCallback" msgid="2712175203065678206">"कलबà¥à¤¯à¤¾à¤•"</string>
+ <string name="phoneTypeCar" msgid="8738360689616716982">"कार"</string>
+ <string name="phoneTypeCompanyMain" msgid="540434356461478916">"कमà¥à¤ªà¤¨à¥€ मà¥à¤–à¥à¤¯"</string>
+ <string name="phoneTypeIsdn" msgid="8022453193171370337">"ISDN"</string>
+ <string name="phoneTypeMain" msgid="6766137010628326916">"मà¥à¤–à¥à¤¯"</string>
+ <string name="phoneTypeOtherFax" msgid="8587657145072446565">"अनà¥à¤¯ फà¥à¤¯à¤¾à¤•à¥à¤¸"</string>
+ <string name="phoneTypeRadio" msgid="4093738079908667513">"रेडियो"</string>
+ <string name="phoneTypeTelex" msgid="3367879952476250512">"टेलेकà¥à¤¸"</string>
+ <string name="phoneTypeTtyTdd" msgid="8606514378585000044">"TTY TDD"</string>
+ <string name="phoneTypeWorkMobile" msgid="1311426989184065709">"कारà¥à¤¯ मोबाइल"</string>
+ <string name="phoneTypeWorkPager" msgid="649938731231157056">"कारà¥à¤¯ पेजर"</string>
+ <string name="phoneTypeAssistant" msgid="5596772636128562884">"सहायक"</string>
+ <string name="phoneTypeMms" msgid="7254492275502768992">"MMS"</string>
+ <string name="eventTypeCustom" msgid="7837586198458073404">"अनà¥à¤•ूलन"</string>
+ <string name="eventTypeBirthday" msgid="2813379844211390740">"जनà¥à¤®à¤¦à¤¿à¤¨"</string>
+ <string name="eventTypeAnniversary" msgid="3876779744518284000">"वारà¥à¤·à¤¿à¤• समारोह"</string>
+ <string name="eventTypeOther" msgid="7388178939010143077">"अनà¥à¤¯"</string>
+ <string name="emailTypeCustom" msgid="8525960257804213846">"अनà¥à¤•ूलन"</string>
+ <string name="emailTypeHome" msgid="449227236140433919">"गृह"</string>
+ <string name="emailTypeWork" msgid="3548058059601149973">"काम"</string>
+ <string name="emailTypeOther" msgid="2923008695272639549">"अनà¥à¤¯"</string>
+ <string name="emailTypeMobile" msgid="119919005321166205">"मोबाइल"</string>
+ <string name="postalTypeCustom" msgid="8903206903060479902">"अनà¥à¤•ूलन"</string>
+ <string name="postalTypeHome" msgid="8165756977184483097">"गृह"</string>
+ <string name="postalTypeWork" msgid="5268172772387694495">"काम"</string>
+ <string name="postalTypeOther" msgid="2726111966623584341">"अनà¥à¤¯"</string>
+ <string name="imTypeCustom" msgid="2074028755527826046">"अनà¥à¤•ूलन"</string>
+ <string name="imTypeHome" msgid="6241181032954263892">"गृह"</string>
+ <string name="imTypeWork" msgid="1371489290242433090">"काम"</string>
+ <string name="imTypeOther" msgid="5377007495735915478">"अनà¥à¤¯"</string>
+ <string name="imProtocolCustom" msgid="6919453836618749992">"अनà¥à¤•ूलन"</string>
+ <string name="imProtocolAim" msgid="7050360612368383417">"AIM"</string>
+ <string name="imProtocolMsn" msgid="144556545420769442">"Windows Live"</string>
+ <string name="imProtocolYahoo" msgid="8271439408469021273">"Yahoo"</string>
+ <string name="imProtocolSkype" msgid="9019296744622832951">"सà¥à¤•ाइप"</string>
+ <string name="imProtocolQq" msgid="8887484379494111884">"QQ"</string>
+ <string name="imProtocolGoogleTalk" msgid="493902321140277304">"हà¥à¤¯à¤¾à¤™à¤†à¤‰à¤Ÿà¤¹à¤°à¥‚"</string>
+ <string name="imProtocolIcq" msgid="1574870433606517315">"ICQ"</string>
+ <string name="imProtocolJabber" msgid="2279917630875771722">"Jabber"</string>
+ <string name="imProtocolNetMeeting" msgid="8287625655986827971">"NetMeeting"</string>
+ <string name="orgTypeWork" msgid="29268870505363872">"काम"</string>
+ <string name="orgTypeOther" msgid="3951781131570124082">"अनà¥à¤¯"</string>
+ <string name="orgTypeCustom" msgid="225523415372088322">"अनà¥à¤•ूलन"</string>
+ <string name="relationTypeCustom" msgid="3542403679827297300">"अनà¥à¤•ूलन"</string>
+ <string name="relationTypeAssistant" msgid="6274334825195379076">"सहायक"</string>
+ <string name="relationTypeBrother" msgid="8757913506784067713">"भाइ"</string>
+ <string name="relationTypeChild" msgid="1890746277276881626">"बचà¥à¤šà¥‹"</string>
+ <string name="relationTypeDomesticPartner" msgid="6904807112121122133">"आनà¥à¤¤à¤°à¤¿à¤• साà¤à¥‡à¤¦à¤¾à¤°"</string>
+ <string name="relationTypeFather" msgid="5228034687082050725">"बà¥à¤¬à¤¾"</string>
+ <string name="relationTypeFriend" msgid="7313106762483391262">"मितà¥à¤°"</string>
+ <string name="relationTypeManager" msgid="6365677861610137895">"बà¥à¤¯à¤µà¤¸à¥à¤¥à¤¾à¤ªà¤•"</string>
+ <string name="relationTypeMother" msgid="4578571352962758304">"आमा"</string>
+ <string name="relationTypeParent" msgid="4755635567562925226">"अभिभावक"</string>
+ <string name="relationTypePartner" msgid="7266490285120262781">"पारà¥à¤Ÿà¤¨à¤°"</string>
+ <string name="relationTypeReferredBy" msgid="101573059844135524">"दà¥à¤µà¤¾à¤°à¤¾ उलà¥à¤²à¤¿à¤–ित"</string>
+ <string name="relationTypeRelative" msgid="1799819930085610271">"आफनà¥à¤¤"</string>
+ <string name="relationTypeSister" msgid="1735983554479076481">"बहिनी"</string>
+ <string name="relationTypeSpouse" msgid="394136939428698117">"पति-पतà¥à¤¨à¤¿"</string>
+ <string name="sipAddressTypeCustom" msgid="2473580593111590945">"अनà¥à¤•ूलन"</string>
+ <string name="sipAddressTypeHome" msgid="6093598181069359295">"गृह"</string>
+ <string name="sipAddressTypeWork" msgid="6920725730797099047">"काम गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="sipAddressTypeOther" msgid="4408436162950119849">"अनà¥à¤¯"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"PIN कोड टाइप गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"PUK र नयाठPIN कोड टाइप गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"PUK कोड"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"नयाठPIN कोड"</string>
+ <string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"पासवरà¥à¤¡ टाइप गरà¥à¤¨ छà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</font></string>
+ <string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"अनलक गरà¥à¤¨ पासवरà¥à¤¡ टाइप गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"अनलक गरà¥à¤¨ PIN कोड टाइप गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"गलत PIN कोड।"</string>
+ <string name="keyguard_label_text" msgid="861796461028298424">"अनलक गरà¥à¤¨ मेनॠथिचà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ र तà¥à¤¯à¤¸à¤ªà¤›à¤¿ ० थिचà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"आपतकालीन नमà¥à¤¬à¤°"</string>
+ <string name="lockscreen_carrier_default" msgid="8963839242565653192">"सेवा छैन।"</string>
+ <string name="lockscreen_screen_locked" msgid="7288443074806832904">"सà¥à¤•à¥à¤°à¤¿à¤¨ लक गरिà¤à¤•ो।"</string>
+ <string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"अनलक वा आपतकालीन कल गरà¥à¤¨ मेनॠथिचà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"अनलक गरà¥à¤¨ मेनॠथिचà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"अनलक गरà¥à¤¨à¥ ढाà¤à¤šà¤¾ खिचà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="lockscreen_emergency_call" msgid="5347633784401285225">"आपतकालीन कलहरू"</string>
+ <string name="lockscreen_return_to_call" msgid="5244259785500040021">"कलमा फरà¥à¤•िनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="lockscreen_pattern_correct" msgid="9039008650362261237">"सही!"</string>
+ <string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"फेरि पà¥à¤°à¤¯à¤¾à¤¸ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="lockscreen_password_wrong" msgid="5737815393253165301">"फेरि पà¥à¤°à¤¯à¤¾à¤¸ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="faceunlock_multiple_failures" msgid="754137583022792429">"अतà¥à¤¯à¤¾à¤§à¤¿à¤• मोहडा खोलà¥à¤¨à¥‡ पà¥à¤°à¤¯à¤¾à¤¸à¤¹à¤°à¥‚ बढी भà¤à¥¤"</string>
+ <string name="lockscreen_plugged_in" msgid="8057762828355572315">"चारà¥à¤œ हà¥à¤à¤¦à¥ˆ, <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+ <string name="lockscreen_charged" msgid="321635745684060624">"चारà¥à¤œ भयो"</string>
+ <string name="lockscreen_battery_short" msgid="4477264849386850266">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+ <string name="lockscreen_low_battery" msgid="1482873981919249740">"तपाईà¤à¤•ो चारà¥à¤œà¤° जोडà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"SIM कारà¥à¤¡ छैन"</string>
+ <string name="lockscreen_missing_sim_message" product="tablet" msgid="151659196095791474">"टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿà¤®à¤¾ SIM कारà¥à¤¡ छैन।"</string>
+ <string name="lockscreen_missing_sim_message" product="default" msgid="2186920585695169078">"फोनमा SIM कारà¥à¤¡ छैन।"</string>
+ <string name="lockscreen_missing_sim_instructions" msgid="5372787138023272615">"SIM कारà¥à¤¡ घà¥à¤¸à¤¾à¤‰à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="lockscreen_missing_sim_instructions_long" msgid="3526573099019319472">"SIM कारà¥à¤¡ छैन वा पढà¥à¤¨ मिलà¥à¤¦à¥ˆà¤¨à¥¤ SIM कारà¥à¤¡ हालà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="lockscreen_permanent_disabled_sim_message_short" msgid="5096149665138916184">"पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨ अयोगà¥à¤¯ SIM कारà¥à¤¡"</string>
+ <string name="lockscreen_permanent_disabled_sim_instructions" msgid="910904643433151371">"तपाईंको SIM कारà¥à¤¡ सà¥à¤¥à¤¾à¤¯à¥€ रूपमा अकà¥à¤·à¤® भयो।\n अरà¥à¤•ो SIM कारà¥à¤¡à¤•ो लागि आफनो ताररहित सेवा पà¥à¤°à¤¦à¤¾à¤¯à¤•सà¤à¤— समà¥à¤ªà¤°à¥à¤• गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="lockscreen_transport_prev_description" msgid="201594905152746886">"अघिलà¥à¤²à¥‹ टà¥à¤°à¤¯à¤¾à¤• बटन"</string>
+ <string name="lockscreen_transport_next_description" msgid="6089297650481292363">"अरà¥à¤•ो टà¥à¤°à¤¯à¤¾à¤• बटन"</string>
+ <string name="lockscreen_transport_pause_description" msgid="7659088786780128001">"रोकà¥à¤¨à¥‡ बटन"</string>
+ <string name="lockscreen_transport_play_description" msgid="5888422938351019426">"बजाउने बटन"</string>
+ <string name="lockscreen_transport_stop_description" msgid="4562318378766987601">"बटन रोकà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="emergency_calls_only" msgid="6733978304386365407">"आपतकालीन कलहरू मातà¥à¤°"</string>
+ <string name="lockscreen_network_locked_message" msgid="143389224986028501">"नेटवरà¥à¤• लक छ"</string>
+ <string name="lockscreen_sim_puk_locked_message" msgid="7441797339976230">"SIM कारà¥à¤¡ PUK-लक गरिà¤à¤•ो छ।"</string>
+ <string name="lockscreen_sim_puk_locked_instructions" msgid="8127916255245181063">"पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ निरà¥à¤¦à¥‡à¤¶à¤• वा गà¥à¤°à¤¾à¤¹à¤• सेवा समà¥à¤ªà¤°à¥à¤• हरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="lockscreen_sim_locked_message" msgid="8066660129206001039">"SIM कारà¥à¤¡ लक गरिà¤à¤•ो छ।"</string>
+ <string name="lockscreen_sim_unlock_progress_dialog_message" msgid="595323214052881264">"SIM कारà¥à¤¡ अनलक गरिà¤à¤¦à¥ˆ..."</string>
+ <string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="6481623830344107222">"तपाईà¤à¤²à¥‡ तपाईà¤à¤•ो अनलक ढाà¤à¤šà¤¾ गलत तरिकाले <xliff:g id="NUMBER_0">%d</xliff:g> पटक खिचà¥à¤¨à¥ भà¤à¤•ो छ। \n\n <xliff:g id="NUMBER_1">%d</xliff:g> सेकेनà¥à¤¡à¤®à¤¾ फेरि कोसिस गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="2725973286239344555">"तपाईंले गलत तरिकाले आफà¥à¤¨à¥‹ पासवरà¥à¤¡ <xliff:g id="NUMBER_0">%d</xliff:g> पटक टाइप गरà¥à¤¨à¥à¤­à¤¯à¥‹à¥¤ \n\n<xliff:g id="NUMBER_1">%d</xliff:g> सेकेनà¥à¤¡à¤®à¤¾ फेरि पà¥à¤°à¤¯à¤¾à¤¸ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="6216672706545696955">"तपाईà¤à¤²à¥‡ गलत तरिकाले तपाईà¤à¤•ो PIN <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" product="tablet" msgid="9191611984625460820">"तपाईà¤à¤²à¥‡ तपाईà¤à¤•ो अनलक ढाà¤à¤šà¤¾ गलत तरिकाले <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_failed_attempts_almost_glogin" product="default" msgid="2590227559763762751">"तपाईà¤à¤²à¥‡ <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_failed_attempts_almost_at_wipe" product="tablet" msgid="6128106399745755604">"तपाईà¤à¤²à¥‡ <xliff:g id="NUMBER_0">%d</xliff:g> पटक टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿà¤²à¤¾à¤ˆ अनलक गरà¥à¤¨à¤•ो लागि गलत तरिकाले कोशिस गरà¥à¤¨à¥à¤­à¤à¤•ो छ। <xliff:g id="NUMBER_1">%d</xliff:g> अरू धेरै असफल कोसिसहरूपछि, टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿ फà¥à¤¯à¤¾à¤Ÿà¥à¤°à¤¿ पूरà¥à¤µà¤¨à¤¿à¤°à¥à¤§à¤¾à¤°à¤¿à¤¤à¤®à¤¾ पà¥à¤¨à¤ƒà¤¸à¥‡à¤Ÿ हà¥à¤¨à¥‡ छ र सबै पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ डेटा हराउने छनà¥à¥¤"</string>
+ <string name="lockscreen_failed_attempts_almost_at_wipe" product="default" msgid="8603565142156826565">"तपाईंले गलत तरिकाले <xliff:g id="NUMBER_0">%d</xliff:g> पटक फोन अनलक गरà¥à¤¨à¥‡ पà¥à¤°à¤¯à¤¤à¥à¤¨ गरà¥à¤¨à¥à¤­à¤¯à¥‹à¥¤ <xliff:g id="NUMBER_1">%d</xliff:g> बढी असफल पà¥à¤°à¤¯à¤¤à¥à¤¨à¤¹à¤°à¥‚ पछि, फोन फà¥à¤¯à¤¾à¤•à¥à¤Ÿà¥à¤°à¤¿ पूरà¥à¤µà¤¨à¤¿à¤°à¥à¤§à¤¾à¤°à¤¿à¤¤à¤®à¤¾ पà¥à¤¨à¤ƒà¤¸à¥‡à¤Ÿ हà¥à¤¨à¥‡ छ र सबै पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ डेटा हराउने छनà¥à¥¤"</string>
+ <string name="lockscreen_failed_attempts_now_wiping" product="tablet" msgid="280873516493934365">"तपाईà¤à¤²à¥‡ टà¥à¤¯à¤¬à¥à¤²à¥‡à¤Ÿà¤²à¤¾à¤ˆ अनलक गरà¥à¤¨ गलत तरिकाले <xliff:g id="NUMBER">%d</xliff:g> पटक पà¥à¤°à¤¯à¤¾à¤¸ गरà¥à¤¨à¥ भà¤à¤•ो छ। अब टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿà¤²à¤¾à¤ˆ पूरà¥à¤µà¤¨à¤¿à¤°à¥à¤§à¤¾à¤°à¤¿à¤¤ कारà¥à¤¯à¤¶à¤¾à¤²à¤¾à¤®à¤¾ पà¥à¤¨à¤ƒà¤¸à¥‡à¤Ÿ गरिने छ।"</string>
+ <string name="lockscreen_failed_attempts_now_wiping" product="default" msgid="3025504721764922246">"तपाईंले गलत तरिकाले फोन <xliff:g id="NUMBER">%d</xliff:g> पटक अनलक गरà¥à¤¨à¥‡ पà¥à¤°à¤¯à¤¤à¥à¤¨ गरà¥à¤¨à¥à¤­à¤¯à¥‹à¥¤ अब फोन फà¥à¤¯à¤¾à¤•à¥à¤Ÿà¥à¤°à¤¿ पूरà¥à¤µà¤¨à¤¿à¤°à¥à¤§à¤¾à¤°à¤¿à¤¤à¤®à¤¾ पà¥à¤¨à¤ƒà¤¸à¥‡à¤Ÿ हà¥à¤¨à¥‡ छ।"</string>
+ <string name="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"<xliff:g id="NUMBER">%d</xliff:g> सेकेनà¥à¤¡à¤®à¤¾ फेरि पà¥à¤°à¤¯à¤¾à¤¸ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"ढाà¤à¤šà¤¾ बिरà¥à¤¸à¤¨à¥ भयो?"</string>
+ <string name="lockscreen_glogin_forgot_pattern" msgid="2588521501166032747">"खाता अनलक"</string>
+ <string name="lockscreen_glogin_too_many_attempts" msgid="2751368605287288808">"निकै धेरै कोसिसहरू"</string>
+ <string name="lockscreen_glogin_instructions" msgid="3931816256100707784">"अनलक गरà¥à¤¨à¤•ो लागि, तपाईà¤à¤•ो Google खातासà¤à¤— साइन इन गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="lockscreen_glogin_username_hint" msgid="8846881424106484447">"पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤¨à¤¾à¤® (इमेल)"</string>
+ <string name="lockscreen_glogin_password_hint" msgid="5958028383954738528">"पासवरà¥à¤¡:"</string>
+ <string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"साइन इन गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"अमानà¥à¤¯ पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤¨à¤¾à¤® वा पासवरà¥à¤¡"</string>
+ <string name="lockscreen_glogin_account_recovery_hint" msgid="1696924763690379073">"तपाईà¤à¤•ो पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ नाम वा पासवरà¥à¤¡ बिरà¥à¤¸à¤¨à¥à¤­à¤¯à¥‹?\n भà¥à¤°à¤®à¤£ गरà¥à¤¨à¥à¤¹à¥‹à¤¸"<b>"google.com/accounts/recovery"</b></string>
+ <string name="lockscreen_glogin_checking_password" msgid="7114627351286933867">"जाà¤à¤š गरà¥à¤¦à¥ˆ..."</string>
+ <string name="lockscreen_unlock_label" msgid="737440483220667054">"खोलà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"आवाज चालॠछ।"</string>
+ <string name="lockscreen_sound_off_label" msgid="996822825154319026">"धà¥à¤µà¤¨à¤¿ बनà¥à¤¦"</string>
+ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"ढाà¤à¤šà¤¾ सà¥à¤°à¥ भयो"</string>
+ <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"ढाà¤à¤šà¤¾ हटाइà¤à¤•ो"</string>
+ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"सेल थप गरियो"</string>
+ <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"ढाà¤à¤šà¤¾ पà¥à¤°à¤¾ भयो"</string>
+ <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. विजेट %2$d of %3$d।"</string>
+ <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"विजेट थप गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"खाली"</string>
+ <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"अनलक कà¥à¤·à¥‡à¤¤à¥à¤° विसà¥à¤¤à¤¾à¤° भयो।"</string>
+ <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"अनलक कà¥à¤·à¥‡à¤¤à¥à¤° भतà¥à¤•ियो।"</string>
+ <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> विजेट।"</string>
+ <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ छनौटकरà¥à¤¤à¤¾"</string>
+ <string name="keyguard_accessibility_status" msgid="8008264603935930611">"सà¥à¤¥à¤¿à¤¤à¤¿"</string>
+ <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"कà¥à¤¯à¤¾à¤®à¥‡à¤°à¤¾"</string>
+ <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"मिडिया नियनà¥à¤¤à¥à¤°à¤£à¤¹à¤°à¥‚"</string>
+ <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"विजेट पà¥à¤¨à¤ƒà¤•à¥à¤°à¤® गरà¥à¤¨à¥‡ सà¥à¤°à¥ भयो।"</string>
+ <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"विजेट पà¥à¤¨à¤ƒà¤•à¥à¤°à¤® समापà¥à¤¤ भà¤à¤•ो छ।"</string>
+ <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"विजेट <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> मेटाइयो।"</string>
+ <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"अनलक कà¥à¤·à¥‡à¤¤à¥à¤° बढाउनà¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"सà¥à¤²à¤¾à¤‡à¤¡ अनलक।"</string>
+ <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"ढाà¤à¤šà¤¾ अनलक।"</string>
+ <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"फेस अनलक"</string>
+ <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Pin अनलक"</string>
+ <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"पासवरà¥à¤¡ अनलक।"</string>
+ <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"ढाà¤à¤šà¤¾ कà¥à¤·à¥‡à¤¤à¥à¤°à¥¤"</string>
+ <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"सà¥à¤²à¤¾à¤‡à¤¡ कà¥à¤·à¥‡à¤¤à¥à¤°à¥¤"</string>
+ <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?१२३"</string>
+ <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
+ <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
+ <string name="granularity_label_character" msgid="7336470535385009523">"अकà¥à¤·à¤°"</string>
+ <string name="granularity_label_word" msgid="7075570328374918660">"शबà¥à¤¦"</string>
+ <string name="granularity_label_link" msgid="5815508880782488267">"लिङà¥à¤•"</string>
+ <string name="granularity_label_line" msgid="5764267235026120888">"लाइन"</string>
+ <string name="hour_ampm" msgid="4584338083529355982">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
+ <string name="hour_cap_ampm" msgid="2083465992940444366">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
+ <string name="factorytest_failed" msgid="5410270329114212041">"कारà¥à¤¯à¤¶à¤¾à¤²à¤¾ परीकà¥à¤·à¤£ असफल भयो।"</string>
+ <string name="factorytest_not_system" msgid="4435201656767276723">"FACTORY_TEST कारà¥à¤°à¤µà¤¾à¤‡à¤²à¥‡ /system/app मा सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ पà¥à¤¯à¤¾à¤•ेजहरूको लागि मातà¥à¤° समरà¥à¤¥à¤¨ गरà¥à¤›à¥¤"</string>
+ <string name="factorytest_no_action" msgid="872991874799998561">"कà¥à¤¨à¥ˆ पà¥à¤¯à¤¾à¤•ेज फेला पारà¥à¤¨ सकिà¤à¤¨ जसले FACTORY_TEST कारà¥à¤¯ पà¥à¤°à¤¦à¤¾à¤¨ गरà¥à¤¦à¤›à¥¤"</string>
+ <string name="factorytest_reboot" msgid="6320168203050791643">"पà¥à¤¨à¤ƒà¤¬à¥à¤Ÿ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="js_dialog_title" msgid="1987483977834603872">"यस \"<xliff:g id="TITLE">%s</xliff:g>\" मा भà¤à¤•ो पृषà¥à¤ à¤²à¥‡ बताउà¤à¤›:"</string>
+ <string name="js_dialog_title_default" msgid="6961903213729667573">"जाभासà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ"</string>
+ <string name="js_dialog_before_unload_title" msgid="2619376555525116593">"मारà¥à¤—निरà¥à¤¦à¥‡à¤¶à¤¨ पकà¥à¤•ा गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="js_dialog_before_unload_positive_button" msgid="3112752010600484130">"यस पृषà¥à¤ à¤²à¤¾à¤ˆ छोडà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="js_dialog_before_unload_negative_button" msgid="5614861293026099715">"यही पृषà¥à¤ à¤®à¤¾ रहनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="js_dialog_before_unload" msgid="3468816357095378590">"<xliff:g id="MESSAGE">%s</xliff:g>\n\nके तपाईठयो पेजबाट नेभिगेट गरà¥à¤¨ चाहनॠहà¥à¤¨à¥à¤› भनà¥à¤¨à¥‡ निशà¥à¤šà¤¤ छ?"</string>
+ <string name="save_password_label" msgid="6860261758665825069">"निशà¥à¤šà¤¿à¤¤ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="double_tap_toast" msgid="4595046515400268881">"जà¥à¤•à¥à¤¤à¤¿: जà¥à¤®à¤²à¤¾à¤ˆ ठूलो र सानो पारà¥à¤¨ दà¥à¤ˆ पटक हानà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="autofill_this_form" msgid="4616758841157816676">"सà¥à¤µà¤¤à¤ƒ भरà¥à¤¨à¥‡"</string>
+ <string name="setup_autofill" msgid="7103495070180590814">"अटोफिल सेटअप गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
+ <string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$१$२$३"</string>
+ <string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
+ <string name="autofill_address_summary_format" msgid="4874459455786827344">"$1$2$3"</string>
+ <string name="autofill_province" msgid="2231806553863422300">"पà¥à¤°à¤¾à¤¨à¥à¤¤"</string>
+ <string name="autofill_postal_code" msgid="4696430407689377108">"हà¥à¤²à¤¾à¤•ी कोड"</string>
+ <string name="autofill_state" msgid="6988894195520044613">"राजà¥à¤¯"</string>
+ <string name="autofill_zip_code" msgid="8697544592627322946">"ZIP कोड"</string>
+ <string name="autofill_county" msgid="237073771020362891">"काउनà¥à¤Ÿà¥€"</string>
+ <string name="autofill_island" msgid="4020100875984667025">"टापà¥"</string>
+ <string name="autofill_district" msgid="8400735073392267672">"जिलà¥à¤²à¤¾"</string>
+ <string name="autofill_department" msgid="5343279462564453309">"विभाग"</string>
+ <string name="autofill_prefecture" msgid="2028499485065800419">"पà¥à¤°à¤¶à¤¾à¤¸à¤•ीय कà¥à¤·à¥‡à¤¤à¥à¤°"</string>
+ <string name="autofill_parish" msgid="8202206105468820057">"पेरिस"</string>
+ <string name="autofill_area" msgid="3547409050889952423">"कà¥à¤·à¥‡à¤¤à¥à¤°"</string>
+ <string name="autofill_emirate" msgid="2893880978835698818">"इमिरेट"</string>
+ <string name="permlab_readHistoryBookmarks" msgid="3775265775405106983">"तपाईà¤à¤•ा बà¥à¤•मारà¥à¤•हरू र इतिहास पढà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_readHistoryBookmarks" msgid="8462378226600439658">"बà¥à¤°à¤¾à¤‰à¤œà¤°à¤²à¥‡ भà¥à¤°à¤®à¤£ गरेको सबै URL हरूको इतिहास र बà¥à¤°à¤¾à¤‰à¤œà¤°à¤•ा सबै बà¥à¤•मारà¥à¤•हरू पढà¥à¤¨à¤•ो लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ नोट: यो अनà¥à¤®à¤¤à¤¿à¤²à¤¾à¤ˆ तेसà¥à¤°à¥‹ पकà¥à¤· बà¥à¤°à¤¾à¤‰à¤œà¤°à¤¹à¤°à¥‚दà¥à¤µà¤¾à¤°à¤¾ वा वेब बà¥à¤°à¤¾à¤‰à¤œ गरà¥à¤¨à¥‡ कà¥à¤·à¤®à¤¤à¤¾à¤¦à¥à¤µà¤¾à¤°à¤¾ बलपूरà¥à¤µà¤• गराउन सकिà¤à¤¦à¥ˆà¤¨à¥¤"</string>
+ <string name="permlab_writeHistoryBookmarks" msgid="3714785165273314490">"वेब बà¥à¤•मारà¥à¤•हरू र इतिहास लेखà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_writeHistoryBookmarks" product="tablet" msgid="6825527469145760922">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई तपाईंको टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿà¤®à¤¾ भणà¥à¤¡à¤¾à¤° गरिà¤à¤•ो बà¥à¤°à¤¾à¤‰à¤œà¤°à¤•ो इतिहास वा बà¥à¤•मारà¥à¤•हरू परिमारà¥à¤œà¤¨ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ यसले अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई बà¥à¤°à¤¾à¤œà¤° डेटा मेटाउन वा परिमारà¥à¤œà¤¨ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिन सकà¥à¤¦à¤›à¥¤ टिपà¥à¤ªà¤£à¥€: यो अनà¥à¤®à¤¤à¤¿ वेब बà¥à¤°à¤¾à¤‰à¤œ गरà¥à¤¨à¥‡ कà¥à¤·à¤®à¤¤à¤¾à¤¹à¤°à¥‚को साथ तेसà¥à¤°à¥‹-पारà¥à¤Ÿà¥€ बà¥à¤°à¤¾à¤‰à¤œà¤° वा अनà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूदà¥à¤µà¤¾à¤°à¤¾ लागू गरिà¤à¤•ो होइन।"</string>
+ <string name="permdesc_writeHistoryBookmarks" product="default" msgid="8497389531014185509">"तपाईà¤à¤•ो फोनमा भणà¥à¤¡à¤¾à¤°à¤£ भà¤à¤•ो बà¥à¤°à¤¾à¤‰à¤œà¤°à¤•ो इतिहास वा बà¥à¤•मारà¥à¤•हरू परिवरà¥à¤¤à¤¨ गरà¥à¤¨à¤•ो लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ यसले सायद बà¥à¤°à¤¾à¤‰à¤œà¤° डेटालाई मेटà¥à¤¨ वा परिवरà¥à¤¤à¤¨ गरà¥à¤¨à¤•ो लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ नोट: वेब बà¥à¤°à¤¾à¤‰à¤œ गरà¥à¤¨à¥‡ कà¥à¤·à¤®à¤¤à¤¾à¤¸à¤¹à¤¿à¤¤à¤•ा अनà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरू वा तेसà¥à¤°à¥‹- पकà¥à¤· बà¥à¤°à¤¾à¤‰à¤œà¤°à¤¦à¥à¤µà¤¾à¤°à¤¾ सायद यस अनà¥à¤®à¤¤à¤¿à¤²à¤¾à¤ˆ लागॠगरà¥à¤¨ सकिंदैन।"</string>
+ <string name="permlab_setAlarm" msgid="1379294556362091814">"à¤à¤‰à¤Ÿà¤¾ आलरà¥à¤® सेट गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_setAlarm" msgid="316392039157473848">"सà¥à¤¥à¤¾à¤ªà¤¨à¤¾ गरिà¤à¤•ो सङà¥à¤•ेत घडी अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—मा सङà¥à¤•ेत समय मिलाउन अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ केही सङà¥à¤•ेत घडी अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूले यो सà¥à¤µà¤¿à¤§à¤¾ कारà¥à¤¯à¤¾à¤¨à¥à¤µà¤¯à¤¨ नगरà¥à¤¨ सकà¥à¤›à¤¨à¥à¥¤"</string>
+ <string name="permlab_addVoicemail" msgid="5525660026090959044">"भà¥à¤µà¤¾à¤‡à¤¸à¤®à¥‡à¤² थप गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_addVoicemail" msgid="6604508651428252437">"तपाईà¤à¤•ो भà¥à¤µà¤¾à¤‡à¤¸à¤®à¥‡à¤² इनबकà¥à¤¸à¤®à¤¾ सनà¥à¤¦à¥‡à¤¶ थपà¥à¤¨à¤•ो लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_writeGeolocationPermissions" msgid="5962224158955273932">"भूसà¥à¤¥à¤¾à¤¨ अनà¥à¤®à¤¤à¤¿à¤¹à¤°à¥‚ बà¥à¤°à¤¾à¤‰à¤œà¤° परिवरà¥à¤¤à¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_writeGeolocationPermissions" msgid="1083743234522638747">"बà¥à¤°à¤¾à¤‰à¤œà¤°à¤•ो भू-सà¥à¤¥à¤¾à¤¨ अनà¥à¤®à¤¤à¤¿à¤¹à¤°à¥‚ परिमारà¥à¤œà¤¨ गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ खराब अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूले सà¥à¤¥à¤¾à¤¨ सूचना मनपरी वेब साइटहरूमा पठाउने अनà¥à¤®à¤¤à¤¿à¤•ो लागि यसलाई पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨ सकà¥à¤›à¤¨à¥à¥¤"</string>
+ <string name="permlab_packageVerificationAgent" msgid="5568139100645829117">"पà¥à¤¯à¤•ेजहरूको निरीकà¥à¤·à¤£ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_packageVerificationAgent" msgid="8437590190990843381">"पà¥à¤¯à¤¾à¤•ेज सà¥à¤¥à¤¾à¤ªà¤¨à¤¾ योगà¥à¤¯ छ कि भनेर रà¥à¤œà¥ गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_bindPackageVerifier" msgid="4187786793360326654">"à¤à¤‰à¤Ÿà¤¾ पà¥à¤¯à¤¾à¤•ेज रà¥à¤œà¥à¤•रà¥à¤¤à¤¾à¤®à¤¾ बाà¤à¤§à¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_bindPackageVerifier" msgid="3180741773233862126">"होलà¥à¤¡à¤°à¤²à¤¾à¤ˆ पà¥à¤¯à¤¾à¤•ेज पà¥à¤°à¤®à¤¾à¤£à¤¿à¤¤à¤•रà¥à¤¤à¤¾à¤¹à¤°à¥‚को अनà¥à¤°à¥‹à¤§à¤¹à¤°à¥‚ बनाउन अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ सामानà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूलाई कहिले पनि आवशà¥à¤¯à¤• नपरà¥à¤¨ सकà¥à¤¦à¤›à¥¤"</string>
+ <string name="permlab_serialPort" msgid="546083327654631076">"पहà¥à¤à¤š सिरियल पोरà¥à¤Ÿà¤¹à¤°à¥‚"</string>
+ <string name="permdesc_serialPort" msgid="2991639985224598193">"होलà¥à¤¡à¤°à¤²à¤¾à¤ˆ SerialManager API पà¥à¤°à¤¯à¥‹à¤— गरेर सिरियल पोरà¥à¤Ÿà¤¹à¤°à¥‚ पहà¥à¤à¤š गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_accessContentProvidersExternally" msgid="5077774297943409285">"विषयसूची पà¥à¤°à¤¦à¤¾à¤¤à¤¾à¤²à¤¾à¤ˆ बाहà¥à¤¯ रूपमा पहà¥à¤à¤š गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_accessContentProvidersExternally" msgid="4544346486697853685">"सेलबाट धारकले विषयवसà¥à¤¤à¥ पà¥à¤°à¤¦à¤¾à¤¯à¤•हरूसमà¥à¤®à¤•ो पहà¥à¤à¤š पाउन अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ सामानà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूलाई कहिलà¥à¤¯à¥ˆ आवशà¥à¤¯à¤• परà¥à¤¦à¥ˆà¤¨à¥¤"</string>
+ <string name="permlab_updateLock" msgid="3527558366616680889">"सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤ उपकरण अपडेटहरू हतोतà¥à¤¸à¤¾à¤¹à¤¿à¤¤ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_updateLock" msgid="1655625832166778492">"होलà¥à¤¡à¤°à¤²à¤¾à¤ˆ उपकरण अपगà¥à¤°à¥‡à¤¡ गरà¥à¤¨ गैर पारसà¥à¤ªà¤°à¤¿à¤• पà¥à¤¨à¤ƒà¤¬à¥à¤Ÿà¤•ो लागि उचित समयको बारेमा पà¥à¤°à¤£à¤¾à¤²à¥€à¤®à¤¾ जानाकारी पà¥à¤°à¤¸à¥à¤¤à¤¾à¤µà¤•ो लागि अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="save_password_message" msgid="767344687139195790">"के तपाईं बà¥à¤°à¤¾à¤‰à¤œà¤°à¤²à¥‡ यो पासवरà¥à¤¡ समà¥à¤à¥‡à¤•ो चाहनà¥à¤¹à¥à¤¨à¥à¤›?"</string>
+ <string name="save_password_notnow" msgid="6389675316706699758">"अहिले होइन"</string>
+ <string name="save_password_remember" msgid="6491879678996749466">"समà¥à¤à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="save_password_never" msgid="8274330296785855105">"कहिलà¥à¤¯à¥ˆ पनि होइन"</string>
+ <string name="open_permission_deny" msgid="7374036708316629800">"यो पृषà¥à¤  खोलà¥à¤¨ तपाईà¤à¤²à¤¾à¤ˆ अनà¥à¤®à¤¤à¤¿ छैन।"</string>
+ <string name="text_copied" msgid="4985729524670131385">"कà¥à¤²à¤¿à¤ªà¤¬à¥‹à¤°à¥à¤¡à¤®à¤¾ पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ª गरिà¤à¤•ो पाठ।"</string>
+ <string name="more_item_label" msgid="4650918923083320495">"बढी"</string>
+ <string name="prepend_shortcut_label" msgid="2572214461676015642">"मेनà¥+"</string>
+ <string name="menu_space_shortcut_label" msgid="2410328639272162537">"ठाउà¤"</string>
+ <string name="menu_enter_shortcut_label" msgid="2743362785111309668">"पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¿ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="menu_delete_shortcut_label" msgid="3658178007202748164">"मेटाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="search_go" msgid="8298016669822141719">"खोजà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="searchview_description_search" msgid="6749826639098512120">"खोजà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="searchview_description_query" msgid="5911778593125355124">"जिजà¥à¤žà¤¾à¤¸à¤¾ खोज गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="searchview_description_clear" msgid="1330281990951833033">"पà¥à¤°à¤¶à¥â€à¤¨ हटाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="searchview_description_submit" msgid="2688450133297983542">"जिजà¥à¤žà¤¾à¤¸à¤¾ पेस गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="searchview_description_voice" msgid="2453203695674994440">"भà¥à¤µà¤¾à¤‡à¤¸ खोजी"</string>
+ <string name="enable_explore_by_touch_warning_title" msgid="7460694070309730149">"छोà¤à¤° अनà¥à¤µà¥‡à¤·à¤£ गरà¥à¤¨à¥‡ सकà¥à¤·à¤® पारà¥à¤¨ चाहनॠहà¥à¤¨à¥à¤›?"</string>
+ <string name="enable_explore_by_touch_warning_message" product="tablet" msgid="8655887539089910577">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g>ले सà¥à¤ªà¤°à¥à¤·à¤¦à¥à¤µà¤¾à¤°à¤¾ अनà¥à¤µà¥‡à¤·à¤£ सकà¥à¤·à¤® गरà¥à¤¨ चाहनà¥à¤›à¥¤ सà¥à¤ªà¤°à¥à¤·à¤¦à¥à¤µà¤¾à¤°à¤¾ अनà¥à¤µà¥‡à¤·à¤£ सकà¥à¤·à¤® भà¤à¤•ो बेला, तपाईठआफà¥à¤¨à¥‹ औà¤à¤²à¤¾à¤•ो मà¥à¤¨à¤¿ भà¤à¤•ा विषयवसà¥à¤¤à¥à¤¹à¤°à¥‚ बारे सà¥à¤¨à¥à¤¨ वा विवरण हेरà¥à¤¨ सकà¥à¤¨à¥à¤¹à¥à¤¨à¥à¤› वा टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿà¤¸à¤à¤— अनà¥à¤¤à¤°à¥à¤•à¥à¤°à¤¿à¤¯à¤¾ गरà¥à¤¨ इशारा गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="enable_explore_by_touch_warning_message" product="default" msgid="2708199672852373195">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g>ले सà¥à¤ªà¤°à¥à¤·à¤¦à¥à¤µà¤¾à¤°à¤¾ अनà¥à¤µà¥‡à¤·à¤£ सकà¥à¤·à¤® गरà¥à¤¨ चाहनà¥à¤›à¥¤ सà¥à¤ªà¤°à¥à¤·à¤¦à¥à¤µà¤¾à¤°à¤¾ अनà¥à¤µà¥‡à¤·à¤£ सकà¥à¤·à¤® भà¤à¤•ो बेला तपाईठआफà¥à¤¨à¥‹ औà¤à¤²à¤¾à¤•ो मà¥à¤¨à¤¿ भà¤à¤•ा विषयवसà¥à¤¤à¥à¤¹à¤°à¥‚ बारे सà¥à¤¨à¥à¤¨ वा विवरण हेरà¥à¤¨ सकà¥à¤¨à¥à¤¹à¥à¤¨à¥à¤› वा फोनसà¤à¤— अनà¥à¤¤à¤°à¥à¤•à¥à¤°à¤¿à¤¯à¤¾ गरà¥à¤¨ इशारा गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="oneMonthDurationPast" msgid="7396384508953779925">"१ महिना अघि"</string>
+ <string name="beforeOneMonthDurationPast" msgid="909134546836499826">"१ महिना अघि"</string>
+ <plurals name="num_seconds_ago">
+ <item quantity="one" msgid="4869870056547896011">"१ सेकेनà¥à¤¡ अघि"</item>
+ <item quantity="other" msgid="3903706804349556379">"<xliff:g id="COUNT">%d</xliff:g> सेकेनà¥à¤¡ अघि"</item>
+ </plurals>
+ <plurals name="num_minutes_ago">
+ <item quantity="one" msgid="3306787433088810191">"१ मिनेट अघि"</item>
+ <item quantity="other" msgid="2176942008915455116">"<xliff:g id="COUNT">%d</xliff:g> मिनेट अघि"</item>
+ </plurals>
+ <plurals name="num_hours_ago">
+ <item quantity="one" msgid="9150797944610821849">"१ घनà¥à¤Ÿà¤¾ अघि"</item>
+ <item quantity="other" msgid="2467273239587587569">"<xliff:g id="COUNT">%d</xliff:g> घनà¥à¤Ÿà¤¾ अघि"</item>
+ </plurals>
+ <plurals name="last_num_days">
+ <item quantity="other" msgid="3069992808164318268">"अनà¥à¤¤à¤¿à¤® <xliff:g id="COUNT">%d</xliff:g> दिन"</item>
+ </plurals>
+ <string name="last_month" msgid="3959346739979055432">"अनà¥à¤¤à¤¿à¤® महिना"</string>
+ <string name="older" msgid="5211975022815554840">"पà¥à¤°à¤¾à¤¨à¥‹"</string>
+ <plurals name="num_days_ago">
+ <item quantity="one" msgid="861358534398115820">"हिजो"</item>
+ <item quantity="other" msgid="2479586466153314633">"<xliff:g id="COUNT">%d</xliff:g> दिन अघि"</item>
+ </plurals>
+ <plurals name="in_num_seconds">
+ <item quantity="one" msgid="2729745560954905102">"१ सेकेनà¥à¤¡à¤®à¤¾"</item>
+ <item quantity="other" msgid="1241926116443974687">"<xliff:g id="COUNT">%d</xliff:g> सेकेनà¥à¤¡à¤®à¤¾"</item>
+ </plurals>
+ <plurals name="in_num_minutes">
+ <item quantity="one" msgid="8793095251325200395">"१ मिनेटमा"</item>
+ <item quantity="other" msgid="3330713936399448749">"<xliff:g id="COUNT">%d</xliff:g>मिनेटमा"</item>
+ </plurals>
+ <plurals name="in_num_hours">
+ <item quantity="one" msgid="7164353342477769999">"१ घनà¥à¤Ÿà¤¾à¤®à¤¾"</item>
+ <item quantity="other" msgid="547290677353727389">"<xliff:g id="COUNT">%d</xliff:g> घनà¥à¤Ÿà¤¾à¤®à¤¾"</item>
+ </plurals>
+ <plurals name="in_num_days">
+ <item quantity="one" msgid="5413088743009839518">"भोलि"</item>
+ <item quantity="other" msgid="5109449375100953247">"<xliff:g id="COUNT">%d</xliff:g> दिनमा"</item>
+ </plurals>
+ <plurals name="abbrev_num_seconds_ago">
+ <item quantity="one" msgid="1849036840200069118">"१ सेकेनà¥à¤¡ अघि"</item>
+ <item quantity="other" msgid="3699169366650930415">"<xliff:g id="COUNT">%d</xliff:g> सेकेनà¥à¤¡ अगाडि"</item>
+ </plurals>
+ <plurals name="abbrev_num_minutes_ago">
+ <item quantity="one" msgid="6361490147113871545">"१ मिनेट अघि"</item>
+ <item quantity="other" msgid="851164968597150710">"<xliff:g id="COUNT">%d</xliff:g> मिनेट अघि"</item>
+ </plurals>
+ <plurals name="abbrev_num_hours_ago">
+ <item quantity="one" msgid="4796212039724722116">"१ घनà¥à¤Ÿà¤¾ अघि"</item>
+ <item quantity="other" msgid="6889970745748538901">"<xliff:g id="COUNT">%d</xliff:g> घनà¥à¤Ÿà¤¾ अघि"</item>
+ </plurals>
+ <plurals name="abbrev_num_days_ago">
+ <item quantity="one" msgid="8463161711492680309">"हिजो"</item>
+ <item quantity="other" msgid="3453342639616481191">"<xliff:g id="COUNT">%d</xliff:g> दिन अघि"</item>
+ </plurals>
+ <plurals name="abbrev_in_num_seconds">
+ <item quantity="one" msgid="5842225370795066299">"१ सेकनà¥à¤¡"</item>
+ <item quantity="other" msgid="5495880108825805108">"<xliff:g id="COUNT">%d</xliff:g> सेकेनà¥à¤¡à¤®à¤¾"</item>
+ </plurals>
+ <plurals name="abbrev_in_num_minutes">
+ <item quantity="one" msgid="562786149928284878">"१ मिनेटमा"</item>
+ <item quantity="other" msgid="4216113292706568726">"<xliff:g id="COUNT">%d</xliff:g> मिनेटमा"</item>
+ </plurals>
+ <plurals name="abbrev_in_num_hours">
+ <item quantity="one" msgid="3274708118124045246">"१ घनà¥à¤Ÿà¤¾à¤®à¤¾"</item>
+ <item quantity="other" msgid="3705373766798013406">"<xliff:g id="COUNT">%d</xliff:g> घनà¥à¤Ÿà¤¾à¤®à¤¾"</item>
+ </plurals>
+ <plurals name="abbrev_in_num_days">
+ <item quantity="one" msgid="2178576254385739855">"भोलि"</item>
+ <item quantity="other" msgid="2973062968038355991">"दिन<xliff:g id="COUNT">%d</xliff:g> मा"</item>
+ </plurals>
+ <string name="preposition_for_date" msgid="9093949757757445117">"<xliff:g id="DATE">%s</xliff:g> मा"</string>
+ <string name="preposition_for_time" msgid="5506831244263083793">"<xliff:g id="TIME">%s</xliff:g> मा"</string>
+ <string name="preposition_for_year" msgid="5040395640711867177">"<xliff:g id="YEAR">%s</xliff:g> मा"</string>
+ <string name="day" msgid="8144195776058119424">"दिन"</string>
+ <string name="days" msgid="4774547661021344602">"दिन"</string>
+ <string name="hour" msgid="2126771916426189481">"घनà¥à¤Ÿà¤¾"</string>
+ <string name="hours" msgid="894424005266852993">"घनà¥à¤Ÿà¤¾"</string>
+ <string name="minute" msgid="9148878657703769868">"मिनेट"</string>
+ <string name="minutes" msgid="5646001005827034509">"मिनेट"</string>
+ <string name="second" msgid="3184235808021478">"सेकेनà¥à¤¡"</string>
+ <string name="seconds" msgid="3161515347216589235">"सेकेनà¥à¤¡"</string>
+ <string name="week" msgid="5617961537173061583">"हपà¥à¤¤à¤¾"</string>
+ <string name="weeks" msgid="6509623834583944518">"हपà¥à¤¤à¤¾à¤¹à¤°à¥‚"</string>
+ <string name="year" msgid="4001118221013892076">"वरà¥à¤·"</string>
+ <string name="years" msgid="6881577717993213522">"वरà¥à¤·à¤¹à¤°à¥‚"</string>
+ <plurals name="duration_seconds">
+ <item quantity="one" msgid="6962015528372969481">"१ सेकेनà¥à¤¡"</item>
+ <item quantity="other" msgid="1886107766577166786">"<xliff:g id="COUNT">%d</xliff:g> सेकेनà¥à¤¡"</item>
+ </plurals>
+ <plurals name="duration_minutes">
+ <item quantity="one" msgid="4915414002546085617">"१ मिनेट"</item>
+ <item quantity="other" msgid="3165187169224908775">"<xliff:g id="COUNT">%d</xliff:g> मिनेट"</item>
+ </plurals>
+ <plurals name="duration_hours">
+ <item quantity="one" msgid="8917467491248809972">"१ घनà¥à¤Ÿà¤¾"</item>
+ <item quantity="other" msgid="3863962854246773930">"<xliff:g id="COUNT">%d</xliff:g> घनà¥à¤Ÿà¤¾"</item>
+ </plurals>
+ <string name="VideoView_error_title" msgid="3534509135438353077">"भिडियो समसà¥à¤¯à¤¾"</string>
+ <string name="VideoView_error_text_invalid_progressive_playback" msgid="3186670335938670444">"यो भिडियो यस उपकरणको लागि सà¥à¤Ÿà¥à¤°à¤¿à¤®à¤¿à¤™ गरà¥à¤¨ मानà¥à¤¯ छैन।"</string>
+ <string name="VideoView_error_text_unknown" msgid="3450439155187810085">"यो भिडियो चलाउन सकà¥à¤¦à¥ˆà¤¨à¥¤"</string>
+ <string name="VideoView_error_button" msgid="2822238215100679592">"ठीक छ"</string>
+ <string name="relative_time" msgid="1818557177829411417">"<xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="noon" msgid="7245353528818587908">"मधà¥à¤¯à¤¾à¤¨à¥à¤¨"</string>
+ <string name="Noon" msgid="3342127745230013127">"मधà¥à¤¯à¤¾à¤¨à¥à¤¹"</string>
+ <string name="midnight" msgid="7166259508850457595">"मधà¥à¤¯à¤°à¤¾à¤¤"</string>
+ <string name="Midnight" msgid="5630806906897892201">"मधà¥à¤¯à¤°à¤¾à¤¤"</string>
+ <string name="elapsed_time_short_format_mm_ss" msgid="4431555943828711473">"<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" msgid="1846071997616654124">"<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" msgid="6876518925844129331">"सबैलाई चयन गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="cut" msgid="3092569408438626261">"काटà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="copy" msgid="2681946229533511987">"पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿ बनाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="paste" msgid="5629880836805036433">"टाà¤à¤¸à¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="replace" msgid="5781686059063148930">"विसà¥à¤¥à¤¾à¤ªà¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥â€¦"</string>
+ <string name="delete" msgid="6098684844021697789">"मेटà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="copyUrl" msgid="2538211579596067402">"URL को पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ª गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="selectTextMode" msgid="1018691815143165326">"पाठ चयन गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="textSelectionCABTitle" msgid="5236850394370820357">"पाठ चयनता"</string>
+ <string name="addToDictionary" msgid="4352161534510057874">"शबà¥à¤¦à¤•ोशमा थपà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="deleteText" msgid="6979668428458199034">"मेटà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="inputMethod" msgid="1653630062304567879">"निवेश विधि"</string>
+ <string name="editTextMenuTitle" msgid="4909135564941815494">"पाठ कारà¥à¤¯à¤¹à¤°à¥‚"</string>
+ <string name="low_internal_storage_view_title" msgid="5576272496365684834">"भणà¥à¤¡à¤¾à¤°à¤£ ठाउठसकिà¤à¤¦à¥ˆ छ"</string>
+ <string name="low_internal_storage_view_text" msgid="6640505817617414371">"सायद केही पà¥à¤°à¤£à¤¾à¤²à¥€ कारà¥à¤¯à¤•à¥à¤°à¤®à¤¹à¤°à¥‚ले काम गरà¥à¤¦à¥ˆà¤¨à¤¨à¥"</string>
+ <string name="app_running_notification_title" msgid="8718335121060787914">"<xliff:g id="APP_NAME">%1$s</xliff:g> चलिरहेको छ"</string>
+ <string name="app_running_notification_text" msgid="4653586947747330058">"थप सूचनाको लागि छà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ वा अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— बनà¥à¤¦ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="ok" msgid="5970060430562524910">"ठिक छ"</string>
+ <string name="cancel" msgid="6442560571259935130">"रदà¥à¤¦ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="yes" msgid="5362982303337969312">"ठिक छ"</string>
+ <string name="no" msgid="5141531044935541497">"रदà¥à¤¦ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="dialog_alert_title" msgid="2049658708609043103">"सावधानी"</string>
+ <string name="loading" msgid="7933681260296021180">"लोड हà¥à¤à¤¦à¥ˆ..."</string>
+ <string name="capital_on" msgid="1544682755514494298">"चालà¥"</string>
+ <string name="capital_off" msgid="6815870386972805832">"बनà¥à¤¦"</string>
+ <string name="whichApplication" msgid="4533185947064773386">"पà¥à¤°à¤¯à¥‹à¤— गरेर कारबाही पà¥à¤°à¤¾ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="alwaysUse" msgid="4583018368000610438">"यस कारà¥à¤¯à¤•ो लागि पूरà¥à¤µà¤¨à¤¿à¤°à¥à¤§à¤¾à¤°à¤¿à¤¤à¤¬à¤¾à¤Ÿ पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="clearDefaultHintMsg" msgid="3252584689512077257">"पà¥à¤°à¤£à¤¾à¤²à¥€ सेटिङहरूमा पूरà¥à¤µà¤¨à¤¿à¤°à¥à¤§à¤¾à¤°à¤¿à¤¤à¤²à¤¾à¤ˆ हटाउनà¥à¤¹à¥‹à¤¸à¥ &gt; अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरू &gt; डाउनलोड।"</string>
+ <string name="chooseActivity" msgid="7486876147751803333">"à¤à¤‰à¤Ÿà¤¾ कारà¥à¤¯à¤•ो चयन गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="chooseUsbActivity" msgid="6894748416073583509">"USB उपकरणको लागि à¤à¤‰à¤Ÿà¤¾ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— छानà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="noApplications" msgid="2991814273936504689">"कà¥à¤¨à¥ˆ पनि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूले यो कारà¥à¤¯ गरà¥à¤¨ सकà¥à¤¦à¥ˆà¤¨à¤¨à¥à¥¤"</string>
+ <string name="aerr_title" msgid="1905800560317137752"></string>
+ <string name="aerr_application" msgid="932628488013092776">"दà¥à¤°à¥à¤­à¤¾à¤—à¥à¤¯à¤µà¤¶, <xliff:g id="APPLICATION">%1$s</xliff:g>ले रोकेको छ।"</string>
+ <string name="aerr_process" msgid="4507058997035697579">"दà¥à¤°à¥à¤­à¤¾à¤—à¥à¤¯à¤µà¤¶, पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ <xliff:g id="PROCESS">%1$s</xliff:g> बनà¥à¤¦ भयो।"</string>
+ <string name="anr_title" msgid="4351948481459135709"></string>
+ <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g>ले कारà¥à¤¯ गरिरहेको छैन।\n\nके तपाईठयसलाई बनà¥à¤¦ गरà¥à¤¨ चाहनॠहà¥à¤¨à¥à¤›?"</string>
+ <string name="anr_activity_process" msgid="5776209883299089767">"गतिविधि <xliff:g id="ACTIVITY">%1$s</xliff:g> ले पà¥à¤°à¤¤à¤¿à¤•à¥à¤°à¤¿à¤¯à¤¾ देखाइरहेको छैन।\n\nके तपाईं यसलाई बनà¥à¤¦ गरà¥à¤¨ चाहनॠहà¥à¤¨à¥à¤›?"</string>
+ <string name="anr_application_process" msgid="8941757607340481057">"<xliff:g id="APPLICATION">%1$s</xliff:g> जवाफ दिइरहेको छैन। के तपाईठयसलाई बनà¥à¤¦ गरà¥à¤¨ चाहनॠहà¥à¤¨à¥à¤›?"</string>
+ <string name="anr_process" msgid="6513209874880517125">"पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ <xliff:g id="PROCESS">%1$s</xliff:g>ले कारà¥à¤¯ गरिरहेको छैन।\n\nके तपाईठयसलाई बनà¥à¤¦ गरà¥à¤¨ चाहनॠहà¥à¤¨à¥à¤›?"</string>
+ <string name="force_close" msgid="8346072094521265605">"ठिक छ"</string>
+ <string name="report" msgid="4060218260984795706">"रिपोरà¥à¤Ÿ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="wait" msgid="7147118217226317732">"पà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="webpage_unresponsive" msgid="3272758351138122503">"पृषà¥à¤  गैर जिमà¥à¤®à¥‡à¤µà¤¾à¤°à¥€ भà¤à¤•ो छ।\n\nके तपाईं यसलाई बनà¥à¤¦ गरà¥à¤¨ चाहनà¥à¤¹à¥à¤¨à¥à¤›?"</string>
+ <string name="launch_warning_title" msgid="1547997780506713581">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— पà¥à¤¨à¤ƒ निरà¥à¤¦à¥‡à¤¶à¥€à¤¤"</string>
+ <string name="launch_warning_replace" msgid="6202498949970281412">"<xliff:g id="APP_NAME">%1$s</xliff:g> अहिले चलिरहेको छ।"</string>
+ <string name="launch_warning_original" msgid="188102023021668683">"<xliff:g id="APP_NAME">%1$s</xliff:g> वासà¥à¤¤à¤µà¤¿à¤• सà¥à¤°à¥à¤µà¤¾à¤¤ भà¤à¤•ो थियो।"</string>
+ <string name="screen_compat_mode_scale" msgid="3202955667675944499">"सà¥à¤•ेल"</string>
+ <string name="screen_compat_mode_show" msgid="4013878876486655892">"सधैठदेखाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="screen_compat_mode_hint" msgid="1064524084543304459">"पà¥à¤°à¤£à¤¾à¤²à¥€ सेटिङहरूमा यसलाई पà¥à¤¨à¤ƒà¤¸à¤•à¥à¤·à¤® गराउनà¥à¤¹à¥‹à¤¸à¥ &gt; अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरू &gt; डाउनलोड गरेको।"</string>
+ <string name="smv_application" msgid="3307209192155442829">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— <xliff:g id="APPLICATION">%1$s</xliff:g> (पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ <xliff:g id="PROCESS">%2$s</xliff:g>) ले यसको सà¥à¤µà¤¯à¤‚-लागॠगरिà¤à¤•ो सà¥à¤Ÿà¥à¤°à¤¿à¤Ÿà¤®à¥‹à¤¡ नीति उलङà¥à¤˜à¤¨ गरेको छ।"</string>
+ <string name="smv_process" msgid="5120397012047462446">"पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ <xliff:g id="PROCESS">%1$s</xliff:g> यसको आफà¥à¤¨à¥ˆ कडामोड नीतिका कारण उलà¥à¤²à¤™à¥à¤˜à¤¨ गरिà¤à¤•ो छ।"</string>
+ <string name="android_upgrading_title" msgid="1584192285441405746">"à¤à¤¨à¥à¤¡à¥à¤°à¥‹à¤‡à¤¡ अपगà¥à¤°à¥‡à¤¡ हà¥à¤à¤¦à¥ˆà¤›â€¦"</string>
+ <string name="android_upgrading_apk" msgid="7904042682111526169">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— अनà¥à¤•à¥à¤² हà¥à¤à¤¦à¥ˆ <xliff:g id="NUMBER_0">%1$d</xliff:g> को <xliff:g id="NUMBER_1">%2$d</xliff:g>।"</string>
+ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"सà¥à¤°à¥à¤µà¤¾à¤¤ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरू।"</string>
+ <string name="android_upgrading_complete" msgid="1405954754112999229">"बà¥à¤Ÿ पà¥à¤°à¤¾ हà¥à¤à¤¦à¥ˆà¥¤"</string>
+ <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> चलिरहेको छ"</string>
+ <string name="heavy_weight_notification_detail" msgid="1721681741617898865">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—मा सà¥à¤µà¤¿à¤š गरà¥à¤¨ छà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरू सà¥à¤µà¤¿à¤š गरà¥à¤¨à¥‡ हो?"</string>
+ <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"अरà¥à¤•ो अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— पहिले नै चालॠछ जà¥à¤¨ तपाईंले à¤à¤‰à¤Ÿà¤¾ नयाठसà¥à¤°à¥ गरà¥à¤¨à¥ अघि बनà¥à¤¦ गरà¥à¤¨à¥à¤ªà¤°à¥à¤¨à¥‡ हà¥à¤¨à¥à¤›à¥¤"</string>
+ <string name="old_app_action" msgid="493129172238566282">"<xliff:g id="OLD_APP">%1$s</xliff:g> मा फरà¥à¤•नà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="old_app_description" msgid="2082094275580358049">"नयाठअनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— सà¥à¤°à¥ नगरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="new_app_action" msgid="5472756926945440706">"<xliff:g id="OLD_APP">%1$s</xliff:g> सà¥à¤°à¥ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="new_app_description" msgid="1932143598371537340">"बचत नगरी पà¥à¤°à¤¾à¤¨à¥‹ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— रोकà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="sendText" msgid="5209874571959469142">"पाठको लागि à¤à¤‰à¤Ÿà¤¾ पà¥à¤°à¤•ारà¥à¤¯ छानà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="volume_ringtone" msgid="6885421406845734650">"बजाउने मातà¥à¤°à¤¾"</string>
+ <string name="volume_music" msgid="5421651157138628171">"मिडियाको मातà¥à¤°à¤¾"</string>
+ <string name="volume_music_hint_playing_through_bluetooth" msgid="9165984379394601533">"बà¥à¤²à¥à¤Ÿà¥à¤¥à¤•ो माधà¥à¤¯à¤®à¤¦à¥à¤µà¤¾à¤°à¤¾ बजाइदै छ।"</string>
+ <string name="volume_music_hint_silent_ringtone_selected" msgid="8310739960973156272">"शानà¥à¤¤ रिङà¥à¤—टोन सेट"</string>
+ <string name="volume_call" msgid="3941680041282788711">"इन-कल भोलà¥à¤¯à¥à¤®"</string>
+ <string name="volume_bluetooth_call" msgid="2002891926351151534">"बà¥à¤²à¥à¤Ÿà¥à¤¥ भितà¥à¤°à¥€-कल मातà¥à¤°à¤¾"</string>
+ <string name="volume_alarm" msgid="1985191616042689100">"आलरà¥à¤® मातà¥à¤°à¤¾"</string>
+ <string name="volume_notification" msgid="2422265656744276715">"सूचना मातà¥à¤°à¤¾"</string>
+ <string name="volume_unknown" msgid="1400219669770445902">"मातà¥à¤°à¤¾"</string>
+ <string name="volume_icon_description_bluetooth" msgid="6538894177255964340">"बà¥à¤²à¥à¤Ÿà¥à¤¥ भोलà¥à¤¯à¥à¤®"</string>
+ <string name="volume_icon_description_ringer" msgid="3326003847006162496">"घनà¥à¤Ÿà¤¿à¤•ो आवाज मातà¥à¤°à¤¾"</string>
+ <string name="volume_icon_description_incall" msgid="8890073218154543397">"कला मातà¥à¤°à¤¾"</string>
+ <string name="volume_icon_description_media" msgid="4217311719665194215">"मिडियाको मातà¥à¤°à¤¾"</string>
+ <string name="volume_icon_description_notification" msgid="7044986546477282274">"सूचना भोलà¥à¤¯à¥à¤®"</string>
+ <string name="ringtone_default" msgid="3789758980357696936">"पूरà¥à¤µà¤¨à¤¿à¤°à¥à¤§à¤¾à¤°à¤¿à¤¤ रिङटोन"</string>
+ <string name="ringtone_default_with_actual" msgid="8129563480895990372">"पूरà¥à¤µà¤¨à¤¿à¤°à¥à¤§à¤¾à¤°à¤¿à¤¤ रिङटोन (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_silent" msgid="7937634392408977062">"कà¥à¤¨à¥ˆ पनि होइन"</string>
+ <string name="ringtone_picker_title" msgid="3515143939175119094">"घनà¥à¤Ÿà¥€à¤•ा सà¥à¤µà¤°à¤¹à¤°à¥‚"</string>
+ <string name="ringtone_unknown" msgid="5477919988701784788">"अजà¥à¤žà¤¾à¤¤ रिङटोन"</string>
+ <plurals name="wifi_available">
+ <item quantity="one" msgid="6654123987418168693">"वाइ-फाइ नेटवरà¥à¤• उपलबà¥à¤§ छ"</item>
+ <item quantity="other" msgid="4192424489168397386">"वाइ-फाइ नेटवरà¥à¤•हरू उपलबà¥à¤§"</item>
+ </plurals>
+ <plurals name="wifi_available_detailed">
+ <item quantity="one" msgid="1634101450343277345">"खà¥à¤²à¥à¤²à¤¾ वाइ-फाइ नेटवरà¥à¤• उपलबà¥à¤§ छ"</item>
+ <item quantity="other" msgid="7915895323644292768">"खà¥à¤²à¥à¤²à¤¾ वाइ-फाइ नेटवरà¥à¤• उपलबà¥à¤§ छ"</item>
+ </plurals>
+ <string name="wifi_available_sign_in" msgid="4029489716605255386">"वाइ-फाइ नेटवरà¥à¤•मा साइन गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="network_available_sign_in" msgid="8495155593358054676">"नेटवरà¥à¤•मा साइन गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
+ <skip />
+ <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"वाइ-फाइसà¤à¤— जडान गरà¥à¤¨ सकेन"</string>
+ <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" कमजोर इनà¥à¤Ÿà¤°à¤¨à¥‡à¤Ÿ जडान छ।"</string>
+ <string name="wifi_p2p_dialog_title" msgid="97611782659324517">"वाइ-फाइ पà¥à¤°à¤¤à¥à¤¯à¤•à¥à¤·"</string>
+ <string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"वाइ-फाइ सिधा सà¥à¤°à¥ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤ यसले वाइ-फाइ गà¥à¤°à¤¾à¤¹à¤•/हटà¥à¤¸à¥à¤ªà¤Ÿà¤²à¤¾à¤ˆ बनà¥à¤¦ गराउने छ।"</string>
+ <string name="wifi_p2p_failed_message" msgid="3763669677935623084">"वाइ-फाइ सिधा सà¥à¤°à¥ हà¥à¤¨ सकेन।"</string>
+ <string name="wifi_p2p_enabled_notification_title" msgid="2068321881673734886">"वाइ-फाइ पà¥à¤°à¤¤à¥à¤¯à¤•à¥à¤· खà¥à¤²à¥à¤²à¤¾ छ"</string>
+ <string name="wifi_p2p_enabled_notification_message" msgid="1638949953993894335">"सेटिङहरूको लागि छà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="accept" msgid="1645267259272829559">"सà¥à¤µà¥€à¤•ारà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="decline" msgid="2112225451706137894">"असà¥à¤µà¥€à¤•ार गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="wifi_p2p_invitation_sent_title" msgid="1318975185112070734">"निमनà¥à¤¤à¥à¤°à¤£à¤¾ पठाइà¤à¤•ो"</string>
+ <string name="wifi_p2p_invitation_to_connect_title" msgid="4958803948658533637">"जडानमा निमनà¥à¤¤à¥à¤°à¤£à¤¾"</string>
+ <string name="wifi_p2p_from_message" msgid="570389174731951769">"बाट:"</string>
+ <string name="wifi_p2p_to_message" msgid="248968974522044099">"पà¥à¤°à¤¾à¤ªà¤•:"</string>
+ <string name="wifi_p2p_enter_pin_message" msgid="5920929550367828970">"आवशà¥à¤¯à¤• PIN टाइप गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥:"</string>
+ <string name="wifi_p2p_show_pin_message" msgid="8530563323880921094">"PIN:"</string>
+ <string name="wifi_p2p_frequency_conflict_message" product="tablet" msgid="8012981257742232475">"यो <xliff:g id="DEVICE_NAME">%1$s</xliff:g>सà¤à¤— जोडिà¤à¤•ो बेला टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿ असà¥à¤¥à¤¾à¤¯à¥€ रूपमा वाइ-फाइबाट विचà¥à¤›à¥‡à¤¦ गरिने छ।"</string>
+ <string name="wifi_p2p_frequency_conflict_message" product="default" msgid="7363907213787469151">"जब यो <xliff:g id="DEVICE_NAME">%1$s</xliff:g> सà¤à¤— जडित हà¥à¤¨à¥à¤›, फोन असà¥à¤¥à¤¾à¤¯à¥€ रूपमा वाइ-फाइबाट विचà¥à¤›à¥‡à¤¦ हà¥à¤¨à¥‡ छ"</string>
+ <string name="select_character" msgid="3365550120617701745">"अकà¥à¤·à¤°à¤¹à¤°à¥‚ पà¥à¤°à¤µà¥‡à¤¶ गराउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="sms_control_title" msgid="7296612781128917719">"SMS सनà¥à¤¦à¥‡à¤¶à¤¹à¤°à¥‚ पठाइà¤à¤¦à¥ˆ"</string>
+ <string name="sms_control_message" msgid="3867899169651496433">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ले धरै संखà¥à¤¯à¤¾à¤®à¤¾ SMS सनà¥à¤¦à¥‡à¤¶à¤¹à¤°à¥‚ पठाउà¤à¤¦à¥ˆà¤›à¥¤ के तपाईठयस अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई सनà¥à¤¦à¥‡à¤¶à¤¹à¤°à¥‚ पठाउन सà¥à¤šà¤¾à¤°à¥ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिन चाहनॠहà¥à¤¨à¥à¤›?"</string>
+ <string name="sms_control_yes" msgid="3663725993855816807">"अनà¥à¤®à¤¤à¤¿ दिनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="sms_control_no" msgid="625438561395534982">"असà¥à¤µà¥€à¤•ार गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="sms_short_code_confirm_message" msgid="1645436466285310855">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; के तपाईठसनà¥à¤¦à¥‡à¤¶ पठाउन चाहà¥à¤¨à¥ हà¥à¤¨à¥à¤› &lt;b&gt;<xliff:g id="DEST_ADDRESS">%2$s</xliff:g>&lt;/b&gt;."</string>
+ <string name="sms_short_code_details" msgid="3492025719868078457">"यसले "<font fgcolor="#ffffb060">" शà¥à¤²à¥à¤• लगाउन सकà¥à¤›"</font>" तपाईà¤à¤•ो मोबाइल खातामा।"</string>
+ <string name="sms_premium_short_code_details" msgid="5523826349105123687"><font fgcolor="#ffffb060">"यसले तपाईंको मोबाइल खातामा चारà¥à¤œà¤¹à¤°à¥‚ उतà¥à¤ªà¤¨à¥à¤¨ गरà¥à¤¦à¤›à¥¤"</font></string>
+ <string name="sms_short_code_confirm_allow" msgid="4458878637111023413">"पठाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="sms_short_code_confirm_deny" msgid="2927389840209170706">"रदà¥à¤¦ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="sms_short_code_remember_choice" msgid="5289538592272218136">"मेरो छनौट याद राखà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="sms_short_code_remember_undo_instruction" msgid="4960944133052287484">"तपाईठयसलाई पछि सेटिङहरूमा बदलà¥à¤¨ सकà¥à¤¨à¥ हà¥à¤¨à¥à¤› &gt; अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरू"</string>
+ <string name="sms_short_code_confirm_always_allow" msgid="3241181154869493368">"सधैठअनà¥à¤®à¤¤à¤¿ दिनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="sms_short_code_confirm_never_allow" msgid="446992765774269673">"कहिलà¥à¤¯à¥ˆ अनà¥à¤®à¤¤à¤¿ नदिनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="sim_removed_title" msgid="6227712319223226185">"SIM कारà¥à¤¡ हटाइयो"</string>
+ <string name="sim_removed_message" msgid="2333164559970958645">"à¤à¤‰à¤Ÿà¤¾ मानà¥à¤¯ SIM कारà¥à¤¡ राखेर पà¥à¤¨à¤ƒà¤¸à¥à¤Ÿà¤¾à¤°à¥à¤Ÿ नगरेसमà¥à¤® मोबाइल नेटवरà¥à¤• उपलबà¥à¤§ हà¥à¤¨à¥‡ छैन।"</string>
+ <string name="sim_done_button" msgid="827949989369963775">"भयो"</string>
+ <string name="sim_added_title" msgid="3719670512889674693">"SIM कारà¥à¤¡ थप गरियो"</string>
+ <string name="sim_added_message" msgid="6599945301141050216">"मोबाइल नेटवरà¥à¤• पहà¥à¤à¤š गरà¥à¤¨ तपाईà¤à¤•ो उपकरण पà¥à¤¨à¤ƒà¤¸à¥à¤Ÿà¤¾à¤°à¥à¤Ÿ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="sim_restart_button" msgid="4722407842815232347">"पà¥à¤¨à¤ƒà¤¸à¥à¤Ÿà¤¾à¤°à¥à¤Ÿ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="time_picker_dialog_title" msgid="8349362623068819295">"समय मिलाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="date_picker_dialog_title" msgid="5879450659453782278">"मिति मिलाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="date_time_set" msgid="5777075614321087758">"सेट गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="date_time_done" msgid="2507683751759308828">"भयो"</string>
+ <string name="perms_new_perm_prefix" msgid="8257740710754301407"><font size="12" fgcolor="#ff33b5e5">"नयाà¤: "</font></string>
+ <string name="perms_description_app" msgid="5139836143293299417">"<xliff:g id="APP_NAME">%1$s</xliff:g>दà¥à¤µà¤¾à¤°à¤¾ पà¥à¤°à¤¦à¤¾à¤¨ गरिà¤à¤•ो।"</string>
+ <string name="no_permissions" msgid="7283357728219338112">"कà¥à¤¨à¥ˆ अनà¥à¤®à¤¤à¤¿ आवशà¥à¤¯à¤• छैन"</string>
+ <string name="perm_costs_money" msgid="4902470324142151116">"सायद तपाईà¤à¤²à¤¾à¤ˆ पैसा परà¥à¤¨ सकà¥à¤›à¥¤"</string>
+ <string name="usb_storage_activity_title" msgid="4465055157209648641">"USB ठूलो भणà¥à¤¡à¤¾à¤°à¤£"</string>
+ <string name="usb_storage_title" msgid="5901459041398751495">"USB जोडिà¤à¤•ो छ"</string>
+ <string name="usb_storage_message" product="nosdcard" msgid="3308538094316477839">"तपाईं आफà¥à¤¨à¥‹ कमà¥à¤ªà¥à¤¯à¥à¤Ÿà¤°à¤®à¤¾ USB मारà¥à¤«à¤¤ जडान हà¥à¤¨à¥à¤­à¤¯à¥‹à¥¤ तलको बटन टच गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ यदि तपाईं आफà¥à¤¨à¥‹ कमà¥à¤ªà¥à¤¯à¥à¤Ÿà¤° र à¤à¤¨à¥à¤¡à¥à¤°à¥‹à¤‡à¤¡à¤•ो USB भणà¥à¤¡à¤¾à¤°à¤£ बीच फाइलहरू पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿ गरà¥à¤¨ चाहनà¥à¤¹à¥à¤¨à¥à¤› भने।"</string>
+ <string name="usb_storage_message" product="default" msgid="805351000446037811">"तपाईं आफà¥à¤¨à¥‹ कमà¥à¤ªà¥à¤¯à¥à¤Ÿà¤°à¤®à¤¾ USB मारà¥à¤«à¤¤ जडान हà¥à¤¨à¥à¤­à¤¯à¥‹à¥¤ तलको बटन टच गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ यदि तपाईं आफà¥à¤¨à¥‹ कमà¥à¤ªà¥à¤¯à¥à¤Ÿà¤° र à¤à¤¨à¥à¤¡à¥à¤°à¥‹à¤‡à¤¡à¤•ो SD कारà¥à¤¡ बीच फाइलहरू पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿ गरà¥à¤¨ चाहनà¥à¤¹à¥à¤¨à¥à¤› भने।"</string>
+ <string name="usb_storage_button_mount" msgid="1052259930369508235">"USB भणà¥à¤¡à¤¾à¤°à¤£ चालॠगरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="usb_storage_error_message" product="nosdcard" msgid="3017045217365540658">"USB आम भणà¥à¤¡à¤¾à¤°à¤£à¤•ो लागि तपाईà¤à¤•ो USB भणà¥à¤¡à¤¾à¤°à¤£ पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¦à¤¾ à¤à¤‰à¤Ÿà¤¾ समसà¥à¤¯à¤¾ भयो।"</string>
+ <string name="usb_storage_error_message" product="default" msgid="2876018512716970313">"USB आम भणà¥à¤¡à¤¾à¤°à¤£à¤•ो लागि तपाईà¤à¤•ो SD कारà¥à¤¡ पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¦à¤¾ à¤à¤‰à¤Ÿà¤¾ समसà¥à¤¯à¤¾ भयो।"</string>
+ <string name="usb_storage_notification_title" msgid="8175892554757216525">"USB जोडिà¤à¤•ो छ"</string>
+ <string name="usb_storage_notification_message" msgid="939822783828183763">"तपाईà¤à¤•ो कमà¥à¤ªà¥à¤¯à¥à¤Ÿà¤°à¤¬à¤¾à¤Ÿ वा तिर फाइलहरू पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ª गरà¥à¤¨ छà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="usb_storage_stop_notification_title" msgid="2336058396663516017">"USB भणà¥à¤¡à¤¾à¤°à¤£ बनà¥à¤¦ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="usb_storage_stop_notification_message" msgid="1656852098555623822">"USB भणà¥à¤¡à¤¾à¤°à¤£ बनà¥à¤¦ गरà¥à¤¨ छà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="usb_storage_stop_title" msgid="660129851708775853">"USB भणà¥à¤¡à¤¾à¤°à¤£ पà¥à¤°à¤¯à¥‹à¤—मा छ"</string>
+ <string name="usb_storage_stop_message" product="nosdcard" msgid="4264025280777219521">"USB भणà¥à¤¡à¤¾à¤°à¤£ बनà¥à¤¦ हà¥à¤¨à¥à¤­à¤¨à¥à¤¦à¤¾ पहीले तपाईà¤à¤•ो कमà¥à¤ªà¥à¤¯à¥à¤Ÿà¤°à¤¬à¤¾à¤Ÿ तपाईà¤à¤•ो à¤à¤¨à¥à¤¡à¥à¤°à¥‹à¤‡à¤¡ USB भणà¥à¤¡à¤¾à¤°à¤£ अनमाउनà¥à¤Ÿ (\"à¤à¤¿à¤•à¥à¤¨à¥à¤¹à¥‹à¤¸à¥\") गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ ।"</string>
+ <string name="usb_storage_stop_message" product="default" msgid="8043969782460613114">"USB भणà¥à¤¡à¤¾à¤°à¤£ बनà¥à¤¦ गरà¥à¤¨à¥à¤…घि तपाईà¤à¤•ो कमà¥à¤ªà¥à¤¯à¥à¤Ÿà¤°à¤¬à¤¾à¤Ÿ तपाईà¤à¤•ो à¤à¤¨à¥à¤¡à¥à¤°à¥‹à¤‡à¤¡à¤•ो SD कारà¥à¤¡ अनमाउनà¥à¤Ÿ (\"निकालेको\") गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="usb_storage_stop_button_mount" msgid="7060218034900696029">"USB भणà¥à¤¡à¤¾à¤°à¤£ बनà¥à¤¦ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="usb_storage_stop_error_message" msgid="1970374898263063836">"USB भणà¥à¤¡à¤¾à¤°à¤£ बनà¥à¤¦ गरà¥à¤¦à¤¾ à¤à¤‰à¤Ÿà¤¾ समसà¥à¤¯à¤¾ भयो। तपाईà¤à¤²à¥‡ USB होसà¥à¤Ÿ अनमाउनà¥à¤Ÿ गरà¥à¤¨à¥ भà¤à¤•ो जाà¤à¤š गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥, तà¥à¤¯à¤¸à¤ªà¤›à¤¿ फेरि पà¥à¤°à¤¯à¤¾à¤¸ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="dlg_confirm_kill_storage_users_title" msgid="963039033470478697">"USB भणà¥à¤¡à¤¾à¤°à¤£ खोलà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="dlg_confirm_kill_storage_users_text" msgid="5100428757107469454">"यदि तपाईà¤à¤²à¥‡ USB भणà¥à¤¡à¤¾à¤°à¤£ खोलà¥à¤¨à¥ भयो भने तपाईà¤à¤²à¥‡ पà¥à¤°à¤¯à¥‹à¤— गरिरहनॠभà¤à¤•ा केही अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरू रोकिने छनॠर तपाईà¤à¤²à¥‡ USB भणà¥à¤¡à¤¾à¤°à¤£ बनà¥à¤¦ नगरेसमà¥à¤® अनà¥à¤ªà¤²à¤¬à¥à¤§ हà¥à¤¨ सकà¥à¤›à¤¨à¥à¥¤"</string>
+ <string name="dlg_error_title" msgid="7323658469626514207">"USB संचालन असफल"</string>
+ <string name="dlg_ok" msgid="7376953167039865701">"ठिक छ"</string>
+ <string name="usb_mtp_notification_title" msgid="3699913097391550394">"मिडिया उपकरणको रूपमा जडित"</string>
+ <string name="usb_ptp_notification_title" msgid="1960817192216064833">"कà¥à¤¯à¤¾à¤®à¥‡à¤°à¤¾à¤•ो रूपमा जडान भà¤à¤•ो"</string>
+ <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"à¤à¤‰à¤Ÿà¤¾ सà¥à¤¥à¤¾à¤ªà¤¨à¤•रà¥à¤¤à¤¾à¤•ो रूपमा जोडिà¤à¤•ो छ"</string>
+ <string name="usb_accessory_notification_title" msgid="7848236974087653666">"USB सहायकमा जोडिà¤à¤•ो छ"</string>
+ <string name="usb_notification_message" msgid="2290859399983720271">"अनà¥à¤¯ USB विकलà¥à¤ªà¤¹à¤°à¥‚को लागि टच गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="extmedia_format_title" product="nosdcard" msgid="9020092196061007262">"USB भणà¥à¤¡à¤¾à¤°à¤£à¤²à¤¾à¤ˆ फरà¥à¤®à¥à¤¯à¤¾à¤Ÿ गरà¥à¤¨ चाहनॠहà¥à¤¨à¥à¤›?"</string>
+ <string name="extmedia_format_title" product="default" msgid="3648415921526526069">"SD कारà¥à¤¡ फरà¥à¤®à¥à¤¯à¤¾à¤Ÿ गरà¥à¤¨à¥‡?"</string>
+ <string name="extmedia_format_message" product="nosdcard" msgid="3934016853425761078">"तपाईंको USBमा सङà¥à¤—à¥à¤°à¤¹ भà¤à¤•ा सबै फाइलहरू मेटिने छनà¥à¥¤ यो कारà¥à¤¯ उलà¥à¤Ÿà¤¾à¤‰à¤¨ सकिà¤à¤¦à¥ˆà¤¨!"</string>
+ <string name="extmedia_format_message" product="default" msgid="14131895027543830">"तपाईà¤à¤•ो कारà¥à¤¡à¤®à¤¾ भà¤à¤•ा सबै डेटाहरू हराउने छनà¥à¥¤"</string>
+ <string name="extmedia_format_button_format" msgid="4131064560127478695">"फरà¥à¤®à¥à¤¯à¤¾à¤Ÿ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="adb_active_notification_title" msgid="6729044778949189918">"USB डिबग गरà¥à¤¨à¥‡ जडित छ"</string>
+ <string name="adb_active_notification_message" msgid="1016654627626476142">"USB डिबग गरà¥à¤¨à¥‡ असकà¥à¤·à¤® पारà¥à¤¨ छà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"निवेश विधि छानà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="configure_input_methods" msgid="9091652157722495116">"इनपà¥à¤Ÿ विधिहरू सेटअप गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="use_physical_keyboard" msgid="6203112478095117625">"भौतिक किबोरà¥à¤¡"</string>
+ <string name="hardware" msgid="7517821086888990278">"हारà¥à¤¡à¤µà¥‡à¤¯à¤°"</string>
+ <string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"किबोरà¥à¤¡ रूपरेखा चयन गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"किबोरà¥à¤¡ रूपरेखा चयन गरà¥à¤¨ टच गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+ <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+ <string name="candidates_style" msgid="4333913089637062257"><u>"उमà¥à¤®à¥‡à¤¦à¤µà¤¾à¤°"</u></string>
+ <string name="ext_media_checking_notification_title" product="nosdcard" msgid="3449816005351468560">"USB भणà¥à¤¡à¤¾à¤°à¤£à¤•ो तयारी हà¥à¤à¤¦à¥ˆ"</string>
+ <string name="ext_media_checking_notification_title" product="default" msgid="5457603418970994050">"SD कारà¥à¤¡ तयार गरà¥à¤¦à¥ˆ"</string>
+ <string name="ext_media_checking_notification_message" msgid="8287319882926737053">"तà¥à¤°à¥à¤Ÿà¤¿à¤¹à¤°à¥‚को लागि जाà¤à¤š गरà¥à¤¦à¥ˆà¥¤"</string>
+ <string name="ext_media_nofs_notification_title" product="nosdcard" msgid="7788040745686229307">"रिकà¥à¤¤ USB भणà¥à¤¡à¤¾à¤°à¤£"</string>
+ <string name="ext_media_nofs_notification_title" product="default" msgid="780477838241212997">"खाली SD कारà¥à¤¡"</string>
+ <string name="ext_media_nofs_notification_message" product="nosdcard" msgid="7840121067427269500">"USB भणà¥à¤¡à¤¾à¤°à¤£ खाली वा असमरà¥à¤¥à¤¿à¤¤ फाइल पà¥à¤°à¤£à¤¾à¤²à¥€ छ।"</string>
+ <string name="ext_media_nofs_notification_message" product="default" msgid="8641065641786923604">"SD कारà¥à¤¡ खाली छ अथवा समरà¥à¤¥à¤¨ नगरिà¤à¤•ो फाइल पà¥à¤°à¤£à¤¾à¤²à¥€ छ।"</string>
+ <string name="ext_media_unmountable_notification_title" product="nosdcard" msgid="2090046769532713563">"बिगà¥à¤°à¤¿à¤à¤•ो USB भणà¥à¤¡à¤¾à¤°à¤£"</string>
+ <string name="ext_media_unmountable_notification_title" product="default" msgid="6410723906019100189">"बिगà¥à¤°à¤¿à¤à¤•ो SD कारà¥à¤¡"</string>
+ <string name="ext_media_unmountable_notification_message" product="nosdcard" msgid="1795917578395333280">"USB भणà¥à¤¡à¤¾à¤°à¤£ बिगà¥à¤°à¤¿à¤à¤•ो छ। यसलाई पà¥à¤¨à¤ƒà¤«à¤°à¥à¤®à¥à¤¯à¤¾à¤Ÿ गरà¥à¤¨ पà¥à¤°à¤¯à¤¾à¤¸ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥¤"</string>
+ <string name="ext_media_unmountable_notification_message" product="default" msgid="1753898567525568253">"SD कारà¥à¤¡ बिगà¥à¤°à¤¿à¤à¤•ो छ। यसलाई पà¥à¤¨à¤ƒà¤«à¤°à¥à¤®à¥à¤¯à¤¾à¤Ÿ गरà¥à¤¨ पà¥à¤°à¤¯à¤¾à¤¸ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥¤"</string>
+ <string name="ext_media_badremoval_notification_title" product="nosdcard" msgid="1661683031330951073">"USB भणà¥à¤¡à¤¾à¤°à¤£ अपà¥à¤°à¤¤à¥à¤¯à¤¾à¤¶à¤¿à¤¤ रूपमा हटाइà¤à¤•ो छ"</string>
+ <string name="ext_media_badremoval_notification_title" product="default" msgid="6872152882604407837">"SD कारà¥à¤¡ अनपेकà¥à¤·à¤¿à¤¤ रूपमा हटाइयो"</string>
+ <string name="ext_media_badremoval_notification_message" product="nosdcard" msgid="4329848819865594241">"डेटा गà¥à¤®à¥à¤¨à¤¬à¤¾à¤Ÿ रोकà¥à¤¨à¤•ो लागि USB भणà¥à¤¡à¤¾à¤°à¤£ हटाउनà¥à¤…घि अनमाउनà¥à¤Ÿ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="ext_media_badremoval_notification_message" product="default" msgid="7260183293747448241">"डेटा नाश हà¥à¤¨à¤¬à¤¾à¤Ÿ बचà¥à¤¨ SD कारà¥à¤¡à¤²à¤¾à¤ˆ निकालà¥à¤¨à¥à¤­à¤¨à¥à¤¦à¤¾ पहिला अनमाउनà¥à¤Ÿ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="ext_media_safe_unmount_notification_title" product="nosdcard" msgid="3967973893270360230">"USB भणà¥à¤¡à¤¾à¤°à¤£ हटाउनको लागि सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ छ"</string>
+ <string name="ext_media_safe_unmount_notification_title" product="default" msgid="6729801130790616200">"SD कारà¥à¤¡ हटाउन सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ छ।"</string>
+ <string name="ext_media_safe_unmount_notification_message" product="nosdcard" msgid="6142195361606493530">"तपाईं सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ रूपमा USB भणà¥à¤¡à¤¾à¤°à¤£ हटाउन सकà¥à¤¨à¥à¤¹à¥à¤¨à¥‡ छ।"</string>
+ <string name="ext_media_safe_unmount_notification_message" product="default" msgid="568841278138377604">"तपाईठSD कारà¥à¤¡ सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ रूपमा हटाउन सकà¥à¤¨à¥ हà¥à¤¨à¥à¤›à¥¤"</string>
+ <string name="ext_media_nomedia_notification_title" product="nosdcard" msgid="4486377230140227651">"USB भणà¥à¤¡à¤¾à¤°à¤£ हटाइयो"</string>
+ <string name="ext_media_nomedia_notification_title" product="default" msgid="8902518030404381318">"हटाइà¤à¤•ो SD कारà¥à¤¡"</string>
+ <string name="ext_media_nomedia_notification_message" product="nosdcard" msgid="6921126162580574143">"USD भणà¥à¤¡à¤¾à¤°à¤£ हटाइयो। नयाठमिडिया घà¥à¤¸à¤¾à¤‰à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="ext_media_nomedia_notification_message" product="default" msgid="3870120652983659641">"SD कारà¥à¤¡ हटाइयो। à¤à¤‰à¤Ÿà¤¾ नयाठछिराउनà¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="activity_list_empty" msgid="1675388330786841066">"कà¥à¤¨à¥ˆ मिलà¥à¤¨à¥‡ गतिविधि पाइà¤à¤¨à¥¤"</string>
+ <string name="permlab_pkgUsageStats" msgid="8787352074326748892">"खणà¥à¤¡ पà¥à¤°à¤¯à¥‹à¤— तथà¥à¤¯à¤¾à¤™à¥à¤•हरू अपडेट गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_pkgUsageStats" msgid="1106612424254277630">"जमà¥à¤®à¤¾ गरिà¤à¤•ो घटक उपयोग तथà¥à¤¯à¤¾à¤™à¥à¤•हरूलाई परिमारà¥à¤œà¤¨ गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ सामानà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूबाट पà¥à¤°à¤¯à¥‹à¤—को लागि होइन।"</string>
+ <string name="permlab_copyProtectedData" msgid="4341036311211406692">"सामागà¥à¤°à¥€à¤•ो नकल गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_copyProtectedData" msgid="4390697124288317831">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई सामगà¥à¤°à¥€ पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿ गरà¥à¤¨ पूरà¥à¤µà¤¨à¤¿à¤°à¥à¤§à¤¾à¤°à¤¿à¤¤ कनà¥à¤Ÿà¥‡à¤¨à¤° सेवा आहà¥à¤µà¤¾à¤¨ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ साधारण अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूदà¥à¤µà¤¾à¤°à¤¾à¤•ो पà¥à¤°à¤¯à¥‹à¤—को लागि होइन।"</string>
+ <string name="permlab_route_media_output" msgid="1642024455750414694">"मिडिया परिणाम दिशानिरà¥à¤¦à¥‡à¤¶ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_route_media_output" msgid="4932818749547244346">"मिडिया परिणामलाई अनà¥à¤¯ बाहिरी उपकरणहरूसà¤à¤— लैजानको लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_access_keyguard_secure_storage" msgid="7565552237977815047">"किगारà¥à¤¡ सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ भणà¥à¤¡à¤¾à¤°à¤£ पहà¥à¤à¤š गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_access_keyguard_secure_storage" msgid="5866245484303285762">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई किगारà¥à¤¡ सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ भणà¥à¤¡à¤¾à¤°à¤£ पहà¥à¤à¤š गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_control_keyguard" msgid="172195184207828387">"किगारà¥à¤¡ पà¥à¤°à¤¦à¤°à¥à¤¶à¤¨ गरà¥à¤¨à¥‡ र लà¥à¤•ाउने नियनà¥à¤¤à¥à¤°à¤£ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_control_keyguard" msgid="3043732290518629061">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई किगारà¥à¤¡ नियनà¥à¤¤à¥à¤°à¤£ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="tutorial_double_tap_to_zoom_message_short" msgid="4070433208160063538">"जà¥à¤® नियनà¥à¤¤à¥à¤°à¤£à¤•ो लागि दà¥à¤ˆ चोटि टच गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="gadget_host_error_inflating" msgid="4882004314906466162">"विजेट थप गरà¥à¤¨ सकिà¤à¤¦à¥ˆà¤¨à¥¤"</string>
+ <string name="ime_action_go" msgid="8320845651737369027">"जानà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="ime_action_search" msgid="658110271822807811">"खोजà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="ime_action_send" msgid="2316166556349314424">"पठाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="ime_action_next" msgid="3138843904009813834">"अरà¥à¤•ो"</string>
+ <string name="ime_action_done" msgid="8971516117910934605">"भयो"</string>
+ <string name="ime_action_previous" msgid="1443550039250105948">"अघिलà¥à¤²à¥‹"</string>
+ <string name="ime_action_default" msgid="2840921885558045721">"चलाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="dial_number_using" msgid="5789176425167573586">\n"नमà¥à¤¬à¤° डायल गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ <xliff:g id="NUMBER">%s</xliff:g> पà¥à¤°à¤¯à¥‹à¤— गरेर"</string>
+ <string name="create_contact_using" msgid="4947405226788104538">"समà¥à¤ªà¤°à¥à¤• सिरà¥à¤œà¤¨à¤¾ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥\nयो <xliff:g id="NUMBER">%s</xliff:g> पà¥à¤°à¤¯à¥‹à¤— गरेर"</string>
+ <string name="grant_credentials_permission_message_header" msgid="2106103817937859662">"निमà¥à¤¨ à¤à¤‰à¤Ÿà¤¾ वा धेरै अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूले तपाईà¤à¤•ो खातामा पहà¥à¤à¤šà¤•ो लागि अनà¥à¤®à¤¤à¤¿ अहिले र भविषà¥à¤¯à¤®à¤¾ अनà¥à¤°à¥‹à¤§ गरà¥à¤›à¤¨à¥à¥¤"</string>
+ <string name="grant_credentials_permission_message_footer" msgid="3125211343379376561">"के तपाईठयस अनà¥à¤°à¥‹à¤§à¤²à¤¾à¤ˆ अनà¥à¤®à¤¤à¤¿ दिन चाहनà¥à¤¹à¥à¤¨à¥à¤›?"</string>
+ <string name="grant_permissions_header_text" msgid="6874497408201826708">"अनà¥à¤°à¥‹à¤§ पहà¥à¤à¤š गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="allow" msgid="7225948811296386551">"अनà¥à¤®à¤¤à¤¿ दिनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="deny" msgid="2081879885755434506">"असà¥à¤µà¥€à¤•ार गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permission_request_notification_title" msgid="6486759795926237907">"अनà¥à¤°à¥‹à¤§ गरिà¤à¤•ो अनà¥à¤®à¤¤à¤¿"</string>
+ <string name="permission_request_notification_with_subtitle" msgid="8530393139639560189">\n"खाता <xliff:g id="ACCOUNT">%s</xliff:g>को लागि अनà¥à¤°à¥‹à¤§ गरिà¤à¤•ो अनà¥à¤®à¤¤à¤¿à¥¤"</string>
+ <string name="input_method_binding_label" msgid="1283557179944992649">"इनपà¥à¤Ÿ विधि"</string>
+ <string name="sync_binding_label" msgid="3687969138375092423">"सिङà¥à¤• गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="accessibility_binding_label" msgid="4148120742096474641">"उपलबà¥à¤§à¤¤à¤¾"</string>
+ <string name="wallpaper_binding_label" msgid="1240087844304687662">"वालपेपर"</string>
+ <string name="chooser_wallpaper" msgid="7873476199295190279">"वालपेपर परिवरà¥à¤¤à¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="notification_listener_binding_label" msgid="2014162835481906429">"सूचना सà¥à¤¨à¥à¤¨à¥‡à¤µà¤¾à¤²à¤¾"</string>
+ <string name="vpn_title" msgid="19615213552042827">"VPN सकà¥à¤°à¤¿à¤¯ भयो"</string>
+ <string name="vpn_title_long" msgid="6400714798049252294">"VPN <xliff:g id="APP">%s</xliff:g>दà¥à¤µà¤¾à¤°à¤¾ सकà¥à¤°à¤¿à¤¯ गरिà¤à¤•ो हो"</string>
+ <string name="vpn_text" msgid="3011306607126450322">"नेटवरà¥à¤• पà¥à¤°à¤¬à¤¨à¥à¤§ गरà¥à¤¨ छà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="vpn_text_long" msgid="6407351006249174473">"<xliff:g id="SESSION">%s</xliff:g>सà¤à¤— जोडिà¤à¤•ो छ। नेटवरà¥à¤• वà¥à¤¯à¤µà¤¸à¥à¤¥à¤¾à¤ªà¤¨ गरà¥à¤¨à¤•ो लागि छà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"VPN जडान सधै जोडà¥à¤¦à¥ˆâ€¦"</string>
+ <string name="vpn_lockdown_connected" msgid="8202679674819213931">"सधैठखà¥à¤²à¥à¤²à¤¾ हà¥à¤¨à¥‡ VPN जोडिà¤à¤•ो"</string>
+ <string name="vpn_lockdown_error" msgid="6009249814034708175">"सधैठभरि VPN तà¥à¤°à¥à¤Ÿà¤¿à¤®à¤¾"</string>
+ <string name="vpn_lockdown_config" msgid="6415899150671537970">"कनà¥à¤«à¤¿à¤—र गरà¥à¤¨ टच गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="upload_file" msgid="2897957172366730416">"फाइल छानà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="no_file_chosen" msgid="6363648562170759465">"कà¥à¤¨à¥ˆ फाइल छानिà¤à¤•ो छैन"</string>
+ <string name="reset" msgid="2448168080964209908">"पà¥à¤¨à¤ƒà¤¸à¥‡à¤Ÿ गरà¥à¤¨à¥"</string>
+ <string name="submit" msgid="1602335572089911941">"पेस गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"कार मोड सकà¥à¤·à¤® पारियो।"</string>
+ <string name="car_mode_disable_notification_message" msgid="8035230537563503262">"कार मोडबाट निसà¥à¤•न छà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="tethered_notification_title" msgid="3146694234398202601">"टेथर गरà¥à¤¨à¥‡ वा हटसà¥à¤ªà¤Ÿ सकà¥à¤°à¤¿à¤¯"</string>
+ <string name="tethered_notification_message" msgid="6857031760103062982">"सेटअप गरà¥à¤¨ टच गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="back_button_label" msgid="2300470004503343439">"पछाडि"</string>
+ <string name="next_button_label" msgid="1080555104677992408">"अरà¥à¤•ो"</string>
+ <string name="skip_button_label" msgid="1275362299471631819">"छोडà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="throttle_warning_notification_title" msgid="4890894267454867276">"उचà¥à¤š मोबाइल डेटा पà¥à¤°à¤¯à¥‹à¤—"</string>
+ <string name="throttle_warning_notification_message" msgid="3340822228599337743">"मोबाइल डेटा पà¥à¤°à¤¯à¥‹à¤—को बारेमा अरू थप जानà¥à¤¨à¤•ो लागि छà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="throttled_notification_title" msgid="6269541897729781332">"मोबाइल डेटा सीमा पार भयो"</string>
+ <string name="throttled_notification_message" msgid="5443457321354907181">"मोबाइल डेटा पà¥à¤°à¤¯à¥‹à¤— बारे थप सिकà¥à¤¨ छà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="no_matches" msgid="8129421908915840737">"कà¥à¤¨à¥ˆ मिलेन"</string>
+ <string name="find_on_page" msgid="1946799233822820384">"पृषà¥à¤ à¤®à¤¾ फेला पारà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <plurals name="matches_found">
+ <item quantity="one" msgid="8167147081136579439">"१ मेल"</item>
+ <item quantity="other" msgid="4641872797067609177">"<xliff:g id="TOTAL">%d</xliff:g> को <xliff:g id="INDEX">%d</xliff:g>"</item>
+ </plurals>
+ <string name="action_mode_done" msgid="7217581640461922289">"भयो"</string>
+ <string name="progress_unmounting" product="nosdcard" msgid="3923810448507612746">"USB भणà¥à¤¡à¤¾à¤°à¤£ अनमाउनà¥à¤Ÿ गरà¥à¤¦à¥ˆ..."</string>
+ <string name="progress_unmounting" product="default" msgid="1327894998409537190">"SD कारà¥à¤¡ अनमाउनà¥à¤Ÿ गरà¥à¤¦à¥ˆâ€¦"</string>
+ <string name="progress_erasing" product="nosdcard" msgid="4521573321524340058">"USB भणà¥à¤¡à¤¾à¤°à¤£ मेटाउà¤à¤¦à¥ˆâ€¦"</string>
+ <string name="progress_erasing" product="default" msgid="6596988875507043042">"SD कारà¥à¤¡ मेटाउà¤à¤¦à¥ˆâ€¦"</string>
+ <string name="format_error" product="nosdcard" msgid="6299769563624776948">"USB भणà¥à¤¡à¤¾à¤°à¤£à¤²à¤¾à¤ˆ मेटाउन सकेन।"</string>
+ <string name="format_error" product="default" msgid="7315248696644510935">"SD कारà¥à¤¡ मेटाउन सकेन"</string>
+ <string name="media_bad_removal" msgid="7960864061016603281">"SD कारà¥à¤¡ अनमाउनà¥à¤Ÿ हà¥à¤¨à¥à¤­à¤¨à¥à¤¦à¤¾ पहिला निकालियो।"</string>
+ <string name="media_checking" product="nosdcard" msgid="418188720009569693">"अहिले USB भणà¥à¤¡à¤¾à¤°à¤£ जाà¤à¤š भइरहेको छ।"</string>
+ <string name="media_checking" product="default" msgid="7334762503904827481">"SD कारà¥à¤¡ अहिले परीकà¥à¤·à¤£ भइरहेको छ।"</string>
+ <string name="media_removed" msgid="7001526905057952097">"SD कारà¥à¤¡ हटाइयो।"</string>
+ <string name="media_shared" product="nosdcard" msgid="5830814349250834225">"SD कारà¥à¤¡ कमà¥à¤ªà¥à¤¯à¥à¤Ÿà¤°à¤¦à¥à¤µà¤¾à¤°à¤¾ अहिले पà¥à¤°à¤¯à¥‹à¤—मा छ।"</string>
+ <string name="media_shared" product="default" msgid="5706130568133540435">"SD कारà¥à¤¡ अहिले कमà¥à¤ªà¥à¤¯à¥à¤Ÿà¤°à¤¦à¥à¤µà¤¾à¤°à¤¾ पà¥à¤°à¤¯à¥‹à¤—मा छ।"</string>
+ <string name="media_unknown_state" msgid="729192782197290385">"बाहà¥à¤¯ मिडिया अजà¥à¤žà¤¾à¤¤ अवसà¥à¤¥à¤¾à¤®à¤¾à¥¤"</string>
+ <string name="share" msgid="1778686618230011964">"साà¤à¥‡à¤¦à¤¾à¤°à¥€ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="find" msgid="4808270900322985960">"पतà¥à¤¤à¤¾ लगाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="websearch" msgid="4337157977400211589">"वेब खोजी"</string>
+ <string name="find_next" msgid="5742124618942193978">"अरà¥à¤•ो भेटाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="find_previous" msgid="2196723669388360506">"अघिलà¥à¤²à¥‹ फेला पारà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="gpsNotifTicker" msgid="5622683912616496172">"<xliff:g id="NAME">%s</xliff:g> बाट सà¥à¤¥à¤¾à¤¨ अनà¥à¤°à¥‹à¤§"</string>
+ <string name="gpsNotifTitle" msgid="5446858717157416839">"सà¥à¤¥à¤¾à¤¨ अनà¥à¤°à¥‹à¤§"</string>
+ <string name="gpsNotifMessage" msgid="1374718023224000702">"<xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>) दà¥à¤µà¤¾à¤°à¤¾ अनà¥à¤°à¥‹à¤§ गरिà¤à¤•ो"</string>
+ <string name="gpsVerifYes" msgid="2346566072867213563">"हो"</string>
+ <string name="gpsVerifNo" msgid="1146564937346454865">"होइन"</string>
+ <string name="sync_too_many_deletes" msgid="5296321850662746890">"सीमा नाघेकाहरू मेटà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="sync_too_many_deletes_desc" msgid="496551671008694245">"तà¥à¤¯à¤¹à¤¾à¤ <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> मेटाइà¤à¤•ा आइटमहरू छनॠ<xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>को लागि, खाता <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g>। तपाईं के गरà¥à¤¨ चाहनॠहà¥à¤¨à¥à¤›?"</string>
+ <string name="sync_really_delete" msgid="2572600103122596243">"वसà¥à¤¤à¥à¤¹à¤°à¥‚ मेटà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="sync_undo_deletes" msgid="2941317360600338602">"मेटिà¤à¤•ाहरू पूरà¥à¤µà¤µà¤¤ बनाउनà¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="sync_do_nothing" msgid="3743764740430821845">"अहिलेको लागि केही नगरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="choose_account_label" msgid="5655203089746423927">"à¤à¤‰à¤Ÿà¤¾ खाता छानà¥â€à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="add_account_label" msgid="2935267344849993553">"à¤à¤‰à¤Ÿà¤¾ खाता थपà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="add_account_button_label" msgid="3611982894853435874">"खाता थप गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="number_picker_increment_button" msgid="2412072272832284313">"बढाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="number_picker_decrement_button" msgid="476050778386779067">"घटाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="number_picker_increment_scroll_mode" msgid="3073101067441638428">"<xliff:g id="VALUE">%s</xliff:g>छà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ र समाउनà¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="number_picker_increment_scroll_action" msgid="9101473045891835490">"बढाउन माथि र घटाउन तल सारà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="time_picker_increment_minute_button" msgid="8865885114028614321">"मिनेट बढाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="time_picker_decrement_minute_button" msgid="6246834937080684791">"मिनेट घटाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="time_picker_increment_hour_button" msgid="3652056055810223139">"घनà¥à¤Ÿà¤¾ बढाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="time_picker_decrement_hour_button" msgid="1377479863429214792">"घनà¥à¤Ÿà¤¾ घटाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="time_picker_increment_set_pm_button" msgid="4147590696151230863">"PM सेट गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="time_picker_decrement_set_am_button" msgid="8302140353539486752">"AM सेट गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="date_picker_increment_month_button" msgid="5369998479067934110">"महिना बढाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="date_picker_decrement_month_button" msgid="1832698995541726019">"महिना घटाउनà¥à¤¹à¥‹à¥à¤¸à¥"</string>
+ <string name="date_picker_increment_day_button" msgid="7130465412308173903">"दिन बढाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="date_picker_decrement_day_button" msgid="4131881521818750031">"दिन घटाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="date_picker_increment_year_button" msgid="6318697384310808899">"वरà¥à¤· बढाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="date_picker_decrement_year_button" msgid="4482021813491121717">"वरà¥à¤· घटाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
+ <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"रदà¥à¤¦ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"मेटà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="keyboardview_keycode_done" msgid="1992571118466679775">"भयो"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"मोड परिवरà¥à¤¤à¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
+ <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¿ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="activitychooserview_choose_application" msgid="2125168057199941199">"à¤à¤‰à¤Ÿà¤¾ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— छानà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="shareactionprovider_share_with" msgid="806688056141131819">"साà¤à¥‡à¤¦à¤¾à¤°à¥€ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥..."</string>
+ <string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> सà¤à¤— साà¤à¥‡à¤¦à¤¾à¤°à¥€ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="content_description_sliding_handle" msgid="415975056159262248">"धिसारà¥à¤¨à¥‡ हà¥à¤¯à¤¾à¤¨à¥à¤¡à¤²à¥¤ छà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ &amp; समाउनà¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>को लागि माथि धिसारà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="description_direction_down" msgid="5087739728639014595">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> को लागि तल सà¥à¤²à¤¾à¤‡à¤¡ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="description_direction_left" msgid="7207478719805562165">"सà¥à¤²à¤¾à¤‡à¤¡ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>को लागि बायाà¤à¥¤"</string>
+ <string name="description_direction_right" msgid="8034433242579600980">"सà¥à¤²à¤¾à¤‡à¤¡ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>को लागि दायाà¤à¥¤"</string>
+ <string name="description_target_unlock" msgid="2228524900439801453">"अनलक गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="description_target_camera" msgid="969071997552486814">"कà¥à¤¯à¤¾à¤®à¥‡à¤°à¤¾"</string>
+ <string name="description_target_silent" msgid="893551287746522182">"मौन"</string>
+ <string name="description_target_soundon" msgid="30052466675500172">"आवाज चालू"</string>
+ <string name="description_target_search" msgid="3091587249776033139">"खोजà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="description_target_unlock_tablet" msgid="3833195335629795055">"खोलà¥à¤¨à¤²à¤¾à¤‡ हà¥à¤¤à¥à¤¤à¥à¤¯à¤¾à¤‰à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"बोलिà¤à¤•ो पासवरà¥à¤¡ कà¥à¤žà¥à¤œà¥€à¤¹à¤°à¥‚ सà¥à¤¨à¥à¤¨à¤•ो लागि हेडसेट पà¥à¤²à¤— इन गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"डट।"</string>
+ <string name="action_bar_home_description" msgid="5293600496601490216">"गृह खोजà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="action_bar_up_description" msgid="2237496562952152589">"माथि खोजà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="action_menu_overflow_description" msgid="2295659037509008453">"थप विकलà¥à¤ªà¤¹à¤°à¥‚"</string>
+ <string name="action_bar_home_description_format" msgid="7965984360903693903">"%1$s, %2$s"</string>
+ <string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string>
+ <string name="storage_internal" msgid="4891916833657929263">"आनà¥à¤¤à¤°à¤¿à¤• भणà¥à¤¡à¤¾à¤°à¤£"</string>
+ <string name="storage_sd_card" msgid="3282948861378286745">"SD कारà¥à¤¡"</string>
+ <string name="storage_usb" msgid="3017954059538517278">"USB भणà¥à¤¡à¤¾à¤°à¤£"</string>
+ <string name="extract_edit_menu_button" msgid="8940478730496610137">"समà¥à¤ªà¤¾à¤¦à¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="data_usage_warning_title" msgid="1955638862122232342">"डेटा पà¥à¤°à¤¯à¥‹à¤— चेतावनी"</string>
+ <string name="data_usage_warning_body" msgid="2814673551471969954">"उपयोग र सेटिङहरू हेरà¥à¤¨ छà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="data_usage_3g_limit_title" msgid="7093334419518706686">"2G-3G डेटा असकà¥à¤·à¤® गरिà¤à¤•ो"</string>
+ <string name="data_usage_4g_limit_title" msgid="7636489436819470761">"4G डेटा असकà¥à¤·à¤® गरियो"</string>
+ <string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"मोबाइल डेटा असकà¥à¤·à¤® पारियो।"</string>
+ <string name="data_usage_wifi_limit_title" msgid="8992154736441284865">"वाइ-फाइ डेटा असकà¥à¤·à¤® गरियो"</string>
+ <string name="data_usage_limit_body" msgid="3317964706973601386">"सकà¥à¤·à¤® पारà¥à¤¨ छà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"2G-3G डेटा सीमा भनà¥à¤¦à¤¾ पार भà¤à¤•ो छ"</string>
+ <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"4G डेटा SIMा नाघà¥à¤¯à¥‹"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"मोवाइल डेटा SIMा नाघà¥à¤¯à¥‹"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"वाइ-फाइ डेटा SIMा नाघà¥à¤¯à¥‹"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"<xliff:g id="SIZE">%s</xliff:g> उलà¥à¤²à¥‡à¤–ित सीमा भनà¥à¤¦à¤¾ बढी छ।"</string>
+ <string name="data_usage_restricted_title" msgid="5965157361036321914">"पृषà¥à¤ à¤­à¥‚मिका डेटा पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¿à¤¤ गरिà¤à¤•ो छ"</string>
+ <string name="data_usage_restricted_body" msgid="6741521330997452990">"अवरोध हटाउन छà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="ssl_certificate" msgid="6510040486049237639">"सà¥à¤°à¤•à¥à¤·à¤¾ पà¥à¤°à¤®à¤¾à¤£à¤ªà¤¤à¥à¤°"</string>
+ <string name="ssl_certificate_is_valid" msgid="6825263250774569373">"पà¥à¤°à¤®à¤¾à¤£à¤ªà¤¤à¥à¤° मानà¥à¤¯ छ।"</string>
+ <string name="issued_to" msgid="454239480274921032">"दà¥à¤µà¤¾à¤°à¤¾ जारी गरिà¤à¤•ो:"</string>
+ <string name="common_name" msgid="2233209299434172646">"साधारण नाम:"</string>
+ <string name="org_name" msgid="6973561190762085236">"संगठन:"</string>
+ <string name="org_unit" msgid="7265981890422070383">"संगठनातà¥à¤®à¤• à¤à¤•ाइ:"</string>
+ <string name="issued_by" msgid="2647584988057481566">"दà¥à¤µà¤¾à¤°à¤¾ जारी गरिà¤à¤•ो:"</string>
+ <string name="validity_period" msgid="8818886137545983110">"मानà¥à¤¯à¤¤à¤¾:"</string>
+ <string name="issued_on" msgid="5895017404361397232">"जारी गरिà¤à¤•ो:"</string>
+ <string name="expires_on" msgid="3676242949915959821">"अवधि समापà¥à¤¤:"</string>
+ <string name="serial_number" msgid="758814067660862493">"कà¥à¤°à¤® संखà¥à¤¯à¤¾:"</string>
+ <string name="fingerprints" msgid="4516019619850763049">"औà¤à¤ à¤¾à¤›à¤¾à¤ªà¤¹à¤°à¥‚:"</string>
+ <string name="sha256_fingerprint" msgid="4391271286477279263">"SHA-२५६ औंठाछाप:"</string>
+ <string name="sha1_fingerprint" msgid="7930330235269404581">"SHA-1 औंलाछाप:"</string>
+ <string name="activity_chooser_view_see_all" msgid="4292569383976636200">"सबै हेरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"गतिविधि छनौट गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="share_action_provider_share_with" msgid="5247684435979149216">"साà¤à¥‡à¤¦à¤¾à¤°à¥€ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥..."</string>
+ <string name="list_delimeter" msgid="3975117572185494152">", "</string>
+ <string name="sending" msgid="3245653681008218030">"पठाउà¤à¤¦à¥ˆ..."</string>
+ <string name="launchBrowserDefault" msgid="2057951947297614725">"बà¥à¤°à¤¾à¤‰à¤œà¤° सà¥à¤°à¥ गरà¥à¤¨à¥‡ हो?"</string>
+ <string name="SetupCallDefault" msgid="5834948469253758575">"कल सà¥à¤µà¥€à¤•ार गरà¥à¤¨à¥à¤¹à¥à¤¨à¥à¤›?"</string>
+ <string name="activity_resolver_use_always" msgid="8017770747801494933">"सधैà¤"</string>
+ <string name="activity_resolver_use_once" msgid="2404644797149173758">"à¤à¤‰à¤Ÿà¤¾ मातà¥à¤°"</string>
+ <string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿ"</string>
+ <string name="default_audio_route_name" product="default" msgid="4239291273420140123">"फोन"</string>
+ <string name="default_audio_route_name_headphones" msgid="8119971843803439110">"हेडफोनहरू"</string>
+ <string name="default_audio_route_name_dock_speakers" msgid="6240602982276591864">"डक सà¥à¤ªà¤¿à¤•रहरू"</string>
+ <string name="default_media_route_name_hdmi" msgid="2450970399023478055">"HDMI"</string>
+ <string name="default_audio_route_category_name" msgid="3722811174003886946">"पà¥à¤°à¤£à¤¾à¤²à¥€"</string>
+ <string name="bluetooth_a2dp_audio_route_name" msgid="8575624030406771015">"बà¥à¤²à¥à¤Ÿà¥à¤¥ अडियो"</string>
+ <string name="wireless_display_route_description" msgid="9070346425023979651">"ताररहित पà¥à¤°à¤¦à¤°à¥à¤¶à¤¨"</string>
+ <string name="media_route_chooser_grouping_done" msgid="7966438307723317169">"भयो"</string>
+ <string name="media_route_button_content_description" msgid="5758553567065145276">"मिडियाको उतà¥à¤ªà¤¾à¤¦à¤¨"</string>
+ <string name="media_route_status_scanning" msgid="7279908761758293783">"सà¥à¤•à¥à¤¯à¤¾à¤¨ गरà¥à¤¦à¥ˆ ..."</string>
+ <string name="media_route_status_connecting" msgid="6422571716007825440">"जडान हà¥à¤à¤¦à¥ˆ..."</string>
+ <string name="media_route_status_available" msgid="6983258067194649391">"उपलबà¥à¤§"</string>
+ <string name="media_route_status_not_available" msgid="6739899962681886401">"उपलबà¥à¤§ छैन"</string>
+ <string name="media_route_status_in_use" msgid="4533786031090198063">"पà¥à¤°à¤¯à¥‹à¤—मा छ"</string>
+ <string name="display_manager_built_in_display_name" msgid="2583134294292563941">"पूरà¥à¤µ-निरà¥à¤®à¤¿à¤¤ सà¥à¤•à¥à¤°à¤¿à¤¨"</string>
+ <string name="display_manager_hdmi_display_name" msgid="1555264559227470109">"HDMI सà¥à¤•à¥à¤°à¤¿à¤¨"</string>
+ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"आवरण #<xliff:g id="ID">%1$d</xliff:g>"</string>
+ <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
+ <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", सà¥à¤°à¤•à¥à¤·à¤¿à¤¤"</string>
+ <string name="wifi_display_notification_title" msgid="2223050649240326557">"ताररहित पà¥à¤°à¤¦à¤°à¥à¤¶à¤¨ जोडिà¤à¤•ो छ"</string>
+ <string name="wifi_display_notification_message" msgid="4498802012464170685">"अरà¥à¤•ो उपकरणमा यो सà¥à¤•à¥à¤°à¤¿à¤¨à¤²à¥‡ देखाइरहेको छ"</string>
+ <string name="wifi_display_notification_disconnect" msgid="6183754463561153372">"विचà¥à¤›à¥‡à¤¦à¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="kg_emergency_call_label" msgid="684946192523830531">"आपतकालीन कल"</string>
+ <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"ढाà¤à¤šà¤¾ बिरà¥à¤¸à¤¨à¥ भयो"</string>
+ <string name="kg_wrong_pattern" msgid="1850806070801358830">"गलत ढाà¤à¤šà¤¾"</string>
+ <string name="kg_wrong_password" msgid="2333281762128113157">"गलत पासवरà¥à¤¡"</string>
+ <string name="kg_wrong_pin" msgid="1131306510833563801">"गलत PIN"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"<xliff:g id="NUMBER">%1$d</xliff:g>सेकेनà¥à¤¡à¤®à¤¾ फेरि पà¥à¤°à¤¯à¤¾à¤¸ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="kg_pattern_instructions" msgid="398978611683075868">"आफà¥à¤¨à¥‹ ढाà¤à¤šà¤¾ कोरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="kg_sim_pin_instructions" msgid="2319508550934557331">"SIM PIN पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¿ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="kg_pin_instructions" msgid="2377242233495111557">"PIN पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¿ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="kg_password_instructions" msgid="5753646556186936819">"पासवरà¥à¤¡ पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¿ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="kg_puk_enter_puk_hint" msgid="453227143861735537">"SIM कारà¥à¤¡ अहिले असकà¥à¤·à¤® छ। सà¥à¤šà¤¾à¤°à¥ गरà¥à¤¨à¤•ो लागि PUK कोड पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¿ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤ विवरणको लागि वाहकलाई समà¥à¤ªà¤°à¥à¤• गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"इचà¥à¤›à¤¿à¤¤ PIN कोड पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¿ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"मनपरà¥à¤¦à¥‹ PIN कोड निशà¥à¤šà¤¿à¤¤ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"SIM कारà¥à¤¡ अनलक गरà¥à¤¦à¥ˆâ€¦"</string>
+ <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"गलत PIN कोड।"</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"४ देखि ८ वाट नमà¥à¤¬à¤° भà¤à¤•ो à¤à¤‰à¤Ÿà¤¾ PIN टाइप गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"PUK कोड ८ वटा नमà¥à¤¬à¤° वा सो भनà¥à¤¦à¤¾ बढी हà¥à¤¨à¥à¤ªà¤°à¥à¤›à¥¤"</string>
+ <string name="kg_invalid_puk" msgid="3638289409676051243">"PUK कोड पà¥à¤¨:पà¥à¤°à¤¦à¤¾à¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤ धेरै पà¥à¤¨:पà¥à¤°à¤¯à¤¾à¤¸à¤¹à¤°à¥‚ले SIMलाई सà¥à¤¥à¤¾à¤¯à¥€ रूपमा निषà¥à¤•à¥à¤°à¤¿à¤¯ गरिदिने छ।"</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"PIN कोडहरू मेल खाà¤à¤¨"</string>
+ <string name="kg_login_too_many_attempts" msgid="6486842094005698475">"निकै धेरै ढाà¤à¤šà¤¾ कोसिसहरू"</string>
+ <string name="kg_login_instructions" msgid="1100551261265506448">"अनलक गरà¥à¤¨à¤•ो लागि, तपाईà¤à¤•ो Google खाताको साथ साइन इन गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="kg_login_username_hint" msgid="5718534272070920364">"पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ नाम (इमेल)"</string>
+ <string name="kg_login_password_hint" msgid="9057289103827298549">"पासवरà¥à¤¡"</string>
+ <string name="kg_login_submit_button" msgid="5355904582674054702">"साइन इन गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="kg_login_invalid_input" msgid="5754664119319872197">"अमानà¥à¤¯ पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤¨à¤¾à¤® वा पासवरà¥à¤¡à¥¤"</string>
+ <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"के तपाईà¤à¤²à¥‡ उपयोगकरà¥à¤¤à¤¾ नाम वा पासवरà¥à¤¡ बिरà¥à¤¸à¤¨à¥à¤­à¤¯à¥‹?\n"<b>"google.com/accounts/recovery"</b>" मा जानà¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="kg_login_checking_password" msgid="1052685197710252395">"खाता जाà¤à¤š हà¥à¤à¤¦à¥ˆâ€¦"</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"तपाईà¤à¤²à¥‡ गलत तरिकाले तपाईà¤à¤•ो PIN <xliff:g id="NUMBER_0">%d</xliff:g> पटक टाइप गरà¥à¤¨à¥ भà¤à¤•ो छ। \n\n<xliff:g id="NUMBER_1">%d</xliff:g> सेकेनà¥à¤¡à¤®à¤¾ फेरि पà¥à¤°à¤¯à¤¾à¤¸ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"तपाईà¤à¤²à¥‡ तपाईà¤à¤• पासवरà¥à¤¡ <xliff:g id="NUMBER_0">%d</xliff:g> पटक गलत टाइप गरà¥à¤¨à¥à¤­à¤à¤•ो छ। \n\n <xliff:g id="NUMBER_1">%d</xliff:g> सेकेनà¥à¤¡à¤®à¤¾ फेरि पà¥à¤°à¤¯à¤¾à¤¸ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"तपाईà¤à¤²à¥‡ तपाईà¤à¤•ो अनलक ढाà¤à¤šà¤¾ गलत तरिकाले <xliff:g id="NUMBER_0">%d</xliff:g> पटक खिचà¥à¤¨à¥ भà¤à¤•ो छ। \n\n <xliff:g id="NUMBER_1">%d</xliff:g> सेकेनà¥à¤¡à¤®à¤¾ फेरि कोसिस गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1575557200627128949">"तपाईà¤à¤²à¥‡ टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿà¤²à¤¾à¤ˆ अनलक गरà¥à¤¨ गलत तरिकाले <xliff:g id="NUMBER_0">%d</xliff:g> पटक कोसिस गरà¥à¤¨à¥ भà¤à¤•ो छ। <xliff:g id="NUMBER_1">%d</xliff:g> पछि थप असफल पà¥à¤°à¤¯à¤¾à¤¸à¤¹à¤°à¥‚, टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿ पूरà¥à¤µà¤¨à¤¿à¤°à¥à¤§à¤¾à¤°à¤¿à¤¤ कारà¥à¤¯à¤¶à¤¾à¤²à¤¾à¤®à¤¾ पà¥à¤¨à¤ƒà¤¸à¥‡à¤Ÿ गरिने छ र सबै पà¥à¤°à¤¯à¥‹à¤— डेटा हराउने छ।"</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="4051015943038199910">"तपाईà¤à¤²à¥‡ गलतसà¤à¤— फोनलाई अनलक गरà¥à¤¨ <xliff:g id="NUMBER_0">%d</xliff:g> पटक कोसिस गरà¥à¤¨à¥ भयो। <xliff:g id="NUMBER_1">%d</xliff:g> पछि थप असफल कोसिसहरू, फोनलाई पूरà¥à¤µà¤¨à¤¿à¤°à¥à¤§à¤¾à¤°à¤¿à¤¤ कारà¥à¤¯à¤¶à¤¾à¤²à¤¾à¤®à¤¾ पà¥à¤¨à¤ƒà¤¸à¥‡à¤Ÿ गरिने छ र सबै पà¥à¤°à¤¯à¥‹à¤— डेटा हराउने छ।"</string>
+ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="2072996269148483637">"तपाईà¤à¤²à¥‡ टà¥à¤¯à¤¬à¥à¤²à¥‡à¤Ÿà¤²à¤¾à¤ˆ अनलक गरà¥à¤¨ गलत तरिकाले <xliff:g id="NUMBER">%d</xliff:g> पटक पà¥à¤°à¤¯à¤¾à¤¸ गरà¥à¤¨à¥ भà¤à¤•ो छ। अब टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿà¤²à¤¾à¤ˆ पूरà¥à¤µà¤¨à¤¿à¤°à¥à¤§à¤¾à¤°à¤¿à¤¤ कारà¥à¤¯à¤¶à¤¾à¤²à¤¾à¤®à¤¾ पà¥à¤¨à¤ƒà¤¸à¥‡à¤Ÿ गरिने छ।"</string>
+ <string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"तपाईंले गलत तरिकाले फोन <xliff:g id="NUMBER">%d</xliff:g> पटक अनलक गरà¥à¤¨à¥‡ पà¥à¤°à¤¯à¤¤à¥à¤¨ गरà¥à¤¨à¥à¤­à¤¯à¥‹à¥¤ अब फोन फà¥à¤¯à¤¾à¤•à¥à¤Ÿà¥à¤°à¤¿ पूरà¥à¤µà¤¨à¤¿à¤°à¥à¤§à¤¾à¤°à¤¿à¤¤à¤®à¤¾ पà¥à¤¨à¤ƒà¤¸à¥‡à¤Ÿ हà¥à¤¨à¥‡ छ।"</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"तपाईंले गलत तरिकाले आफà¥à¤¨à¥‹ अनलक ढाà¤à¤šà¤¾ <xliff:g id="NUMBER_0">%d</xliff:g> पटक कोरà¥à¤¨à¥à¤­à¤¯à¥‹à¥¤ <xliff:g id="NUMBER_1">%d</xliff:g> विफल पà¥à¤°à¤¯à¤¤à¥à¤¨à¤¹à¤°à¥‚ पछि, तपाईंलाई आफà¥à¤¨à¥‹ टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿ इमेल खाता पà¥à¤°à¤¯à¥‹à¤— गरेर अनलक गरà¥à¤¨ सोधिने छ।\n\n फेरि पà¥à¤°à¤¯à¤¾à¤¸ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ <xliff:g id="NUMBER_2">%d</xliff:g> सेकेनà¥à¤¡à¤¹à¤°à¥‚मा।"</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"तपाईà¤à¤²à¥‡ आफà¥à¤¨à¥‹ अनलक ढाà¤à¤šà¤¾ गलत रूपमा <xliff:g id="NUMBER_0">%d</xliff:g> पटक तानà¥à¤¨à¥ भà¤à¤•ो छ। <xliff:g id="NUMBER_1">%d</xliff:g> धेरै असफल पà¥à¤°à¤¯à¤¾à¤¸à¤¹à¤°à¥‚पछि, तपाईà¤à¤²à¤¾à¤ˆ à¤à¤‰à¤Ÿà¤¾ इमेल खाताको पà¥à¤°à¤¯à¥‹à¤— गरेर तपाईà¤à¤•ो फोन अनलक गरà¥à¤¨ सोधिने छ।\n\n फेरि <xliff:g id="NUMBER_2">%d</xliff:g> सेकेनà¥à¤¡à¤®à¤¾ पà¥à¤°à¤¯à¤¾à¤¸ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
+ <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"हटाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="safe_media_volume_warning" product="default" msgid="7324161939475478066">"आवाज सलà¥à¤²à¤¾à¤¹ दिà¤à¤•ो तहभनà¥à¤¦à¤¾ माथि बढाउने हो?\nठूलो आवाजमा सà¥à¤¨à¥à¤¦à¤¾ लामो समयको लागि तपाईà¤à¤•ो सà¥à¤¨à¥à¤¨à¥‡ शकà¥à¤¤à¥€à¤²à¤¾à¤ˆ खतà¥à¤¤à¤® पारà¥à¤¨ सकà¥à¤›à¥¤"</string>
+ <string name="continue_to_enable_accessibility" msgid="1626427372316070258">"उपलबà¥à¤§à¤¤à¤¾ सकà¥à¤·à¤® पारà¥à¤¨ दà¥à¤ˆà¤µà¤Ÿà¤¾ औंलाहरूले थिचिरहनà¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="accessibility_enabled" msgid="1381972048564547685">"पहà¥à¤à¤š सकà¥à¤·à¤® गरिà¤à¤•ो।"</string>
+ <string name="enable_accessibility_canceled" msgid="3833923257966635673">"पहà¥à¤à¤šà¤¯à¥‹à¤—à¥à¤¯à¤¤à¤¾ रदà¥à¤¦ गरियो।"</string>
+ <string name="user_switched" msgid="3768006783166984410">"अहिलेको पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ <xliff:g id="NAME">%1$s</xliff:g>।"</string>
+ <string name="owner_name" msgid="2716755460376028154">"मालिक"</string>
+ <string name="error_message_title" msgid="4510373083082500195">"तà¥à¤°à¥à¤Ÿà¤¿"</string>
+ <string name="app_no_restricted_accounts" msgid="5739463249673727736">"पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¿à¤¤ पà¥à¤°à¥‹à¤«à¤¾à¤‡à¤²à¤¹à¤°à¥‚को लागि यस अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—ले खाताहरू समरà¥à¤¥à¤¨ गरà¥à¤¦à¥ˆà¤¨"</string>
+ <string name="app_not_found" msgid="3429141853498927379">"यस कारà¥à¤¯ समà¥à¤¹à¤¾à¤²à¤¨à¥‡ कà¥à¤¨à¥ˆ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— भेटिà¤à¤¨"</string>
+ <string name="revoke" msgid="5404479185228271586">"रदà¥à¤¦ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="mediaSize_iso_a0" msgid="7875427489420821793">"ISO A0"</string>
+ <string name="mediaSize_iso_a1" msgid="3760734499050875356">"ISO A1"</string>
+ <string name="mediaSize_iso_a2" msgid="5973266378020144382">"ISO A2"</string>
+ <string name="mediaSize_iso_a3" msgid="1373407105687300884">"ISO A3"</string>
+ <string name="mediaSize_iso_a4" msgid="6689772807982597254">"ISO A4"</string>
+ <string name="mediaSize_iso_a5" msgid="5353549652015741040">"ISO A5"</string>
+ <string name="mediaSize_iso_a6" msgid="8585038048674911907">"ISO A6"</string>
+ <string name="mediaSize_iso_a7" msgid="6641836716963839119">"ISO A7"</string>
+ <string name="mediaSize_iso_a8" msgid="7571139437465693355">"ISO A8"</string>
+ <string name="mediaSize_iso_a9" msgid="1378455891957115079">"ISO A9"</string>
+ <string name="mediaSize_iso_a10" msgid="2480747457429475344">"ISO A10"</string>
+ <string name="mediaSize_iso_b0" msgid="3965935097661108039">"ISO B0"</string>
+ <string name="mediaSize_iso_b1" msgid="2505753285010115437">"ISO B1"</string>
+ <string name="mediaSize_iso_b2" msgid="8763874709859458453">"ISO B2"</string>
+ <string name="mediaSize_iso_b3" msgid="4210506688191764076">"ISO B3"</string>
+ <string name="mediaSize_iso_b4" msgid="5749404165888526034">"ISO B4"</string>
+ <string name="mediaSize_iso_b5" msgid="7640627414621904733">"ISO B5"</string>
+ <string name="mediaSize_iso_b6" msgid="7342988864712748544">"ISO B6"</string>
+ <string name="mediaSize_iso_b7" msgid="5069844065235382429">"ISO B7"</string>
+ <string name="mediaSize_iso_b8" msgid="7316818922278779774">"ISO B8"</string>
+ <string name="mediaSize_iso_b9" msgid="5414727094026532341">"ISO B9"</string>
+ <string name="mediaSize_iso_b10" msgid="5251253731832048185">"ISO B10"</string>
+ <string name="mediaSize_iso_c0" msgid="4003138342671964217">"ISO C0"</string>
+ <string name="mediaSize_iso_c1" msgid="1935188063393553008">"ISO C1"</string>
+ <string name="mediaSize_iso_c2" msgid="3197307969712069904">"ISO C2"</string>
+ <string name="mediaSize_iso_c3" msgid="4335826087321913508">"ISO C3"</string>
+ <string name="mediaSize_iso_c4" msgid="3745639598281015005">"ISO C4"</string>
+ <string name="mediaSize_iso_c5" msgid="8269457765822791013">"ISO C5"</string>
+ <string name="mediaSize_iso_c6" msgid="566666105260346930">"ISO C6"</string>
+ <string name="mediaSize_iso_c7" msgid="8678413180782608498">"ISO C7"</string>
+ <string name="mediaSize_iso_c8" msgid="8392376206627041730">"ISO C8"</string>
+ <string name="mediaSize_iso_c9" msgid="9191613372324845405">"ISO C9"</string>
+ <string name="mediaSize_iso_c10" msgid="7327709699184920822">"ISO C10"</string>
+ <string name="mediaSize_na_letter" msgid="4191805615829472953">"पतà¥à¤°"</string>
+ <string name="mediaSize_na_gvrnmt_letter" msgid="7853382192649405507">"सरकारी पतà¥à¤°"</string>
+ <string name="mediaSize_na_legal" msgid="6697982988283823150">"कानूनी"</string>
+ <string name="mediaSize_na_junior_legal" msgid="3727743969902758948">"Junior Legal"</string>
+ <string name="mediaSize_na_ledger" msgid="281871464896601236">"Ledger"</string>
+ <string name="mediaSize_na_tabloid" msgid="5775966416333578127">"Tabloid"</string>
+ <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"रदà¥à¤¦ गरियो"</string>
+ <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"सामागà¥à¤°à¥€ लेखनमा तà¥à¤°à¥à¤Ÿà¤¿"</string>
+ <string name="reason_unknown" msgid="6048913880184628119">"अजà¥à¤žà¤¾à¤¤"</string>
+ <string name="restr_pin_enter_admin_pin" msgid="783643731895143970">"पà¥à¤°à¤¶à¤¾à¤¸à¤• PIN पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¿ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="restr_pin_enter_pin" msgid="3395953421368476103">"PIN पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¿ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="restr_pin_incorrect" msgid="8571512003955077924">"गलत"</string>
+ <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"वरà¥à¤¤à¤®à¤¾à¤¨ PIN"</string>
+ <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"नयाठPIN"</string>
+ <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"नयाठPIN निशà¥à¤šà¤¿à¤¤ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="restr_pin_create_pin" msgid="8017600000263450337">"पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¹à¤°à¥‚लाई परिवरà¥à¤¤à¤¨ गरà¥à¤¨à¤•ो लागि à¤à¤‰à¤Ÿà¤¾ PIN बनाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"PIN हरू मेल खाà¤à¤¨à¤¨à¥à¥¤ पà¥à¤¨à¤ƒ पà¥à¤°à¤¯à¤¾à¤¸ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="restr_pin_error_too_short" msgid="8173982756265777792">"PIN अति छोटो भयो। कमà¥à¤¤à¥€à¤®à¤¾ ४ अङà¥à¤• हà¥à¤¨ आवशà¥à¤¯à¤• छ।"</string>
+ <plurals name="restr_pin_countdown">
+ <item quantity="one" msgid="311050995198548675">"१ सेकेनà¥à¤¡ पछि पà¥à¤¨à¤ƒ पà¥à¤°à¤¯à¤¾à¤¸ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</item>
+ <item quantity="other" msgid="4730868920742952817">"<xliff:g id="COUNT">%d</xliff:g> सेकेनà¥à¤¡à¤®à¤¾ पà¥à¤¨à¤ƒ पà¥à¤°à¤¯à¤¾à¤¸ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</item>
+ </plurals>
+ <string name="restr_pin_try_later" msgid="973144472490532377">"पछि पà¥à¤¨à¤ƒ पà¥à¤°à¤¯à¤¾à¤¸ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="transient_navigation_confirmation" msgid="4907844043611123426">"पटà¥à¤Ÿà¤¿ देखिने बनाउन सà¥à¤•à¥à¤°à¤¿à¤¨à¤•ो छेउमा सà¥à¤µà¤¾à¤‡à¤ª गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"पà¥à¤°à¤£à¤¾à¤²à¥€ पटà¥à¤Ÿà¤¿ देखिने बनाउन सà¥à¤•à¥à¤°à¤¿à¤¨à¤•ो छेउबाट सà¥à¤µà¤¾à¤‡à¤ª गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+</resources>
diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml
new file mode 100644
index 0000000..b6e4fc3
--- /dev/null
+++ b/core/res/res/values-ne/strings.xml
@@ -0,0 +1,1588 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="byteShort" msgid="8340973892742019101">"B"</string>
+ <string name="kilobyteShort" msgid="5973789783504771878">"KB"</string>
+ <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
+ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
+ <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
+ <string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
+ <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string>
+ <string name="untitled" msgid="4638956954852782576">"&lt;बिना शीरà¥à¤·à¤•&gt;"</string>
+ <string name="ellipsis" msgid="7899829516048813237">"…"</string>
+ <string name="ellipsis_two_dots" msgid="1228078994866030736">"‥"</string>
+ <string name="emptyPhoneNumber" msgid="7694063042079676517">"(कà¥à¤¨à¥ˆ फोन नमà¥à¤¬à¤° छैन)"</string>
+ <string name="unknownName" msgid="2277556546742746522">"(अजà¥à¤žà¤¾à¤¤)"</string>
+ <string name="defaultVoiceMailAlphaTag" msgid="2660020990097733077">"भà¥à¤µà¤¾à¤‡à¤¸ मेल"</string>
+ <string name="defaultMsisdnAlphaTag" msgid="2850889754919584674">"MSISDN१"</string>
+ <string name="mmiError" msgid="5154499457739052907">"जडान समसà¥à¤¯à¤¾ वा अमानà¥à¤¯ MMI कोड।"</string>
+ <string name="mmiFdnError" msgid="5224398216385316471">"अपरेशन निशà¥à¤šà¤¿à¤¤ डायल नमà¥à¤¬à¤°à¤¹à¤°à¥‚को लागि मातà¥à¤° पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¿à¤¤ छ।"</string>
+ <string name="serviceEnabled" msgid="8147278346414714315">"सेवा सकà¥à¤·à¤® पारियो।"</string>
+ <string name="serviceEnabledFor" msgid="6856228140453471041">"निमà¥à¤¨ उलà¥à¤²à¥‡à¤–ितको लागि सेवा सकà¥à¤·à¤® पारियो:"</string>
+ <string name="serviceDisabled" msgid="1937553226592516411">"सेवा असकà¥à¤·à¤® पारिà¤à¤•ो छ।"</string>
+ <string name="serviceRegistered" msgid="6275019082598102493">"दरà¥à¤¤à¤¾ सफल भयो।"</string>
+ <string name="serviceErased" msgid="1288584695297200972">"मेटाइ सफल थियो।"</string>
+ <string name="passwordIncorrect" msgid="7612208839450128715">"गलत पासवरà¥à¤¡à¥¤"</string>
+ <string name="mmiComplete" msgid="8232527495411698359">"MMI पà¥à¤°à¤¾ भयो।"</string>
+ <string name="badPin" msgid="9015277645546710014">"तपाईंले टाइप गरà¥à¤¨à¥à¤­à¤à¤•ो पà¥à¤°à¤¾à¤¨à¥‹ PIN सही छैन।"</string>
+ <string name="badPuk" msgid="5487257647081132201">"तपाईंले टाइप गरà¥à¤¨à¥à¤­à¤à¤•ो PUK सही छैन।"</string>
+ <string name="mismatchPin" msgid="609379054496863419">"तपाईंले टाइप गरà¥à¤¨à¥à¤­à¤à¤•ो PIN मेल खाà¤à¤¦à¥ˆà¤¨à¥¤"</string>
+ <string name="invalidPin" msgid="3850018445187475377">"४ देखि ८ वटा नमà¥à¤¬à¤° भà¤à¤•ो à¤à¤‰à¤Ÿà¤¾ PIN टाइप गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="invalidPuk" msgid="8761456210898036513">"८ वटा नमà¥à¤¬à¤°à¤¹à¤°à¥‚ वा सो भनà¥à¤¦à¤¾ लामो à¤à¤‰à¤Ÿà¤¾ PUK टाइप गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="needPuk" msgid="919668385956251611">"तपाईंको SIM कारà¥à¤¡ PUK-लक छ। यसलाई अनलक गरà¥à¤¨ PUK कोड टाइप गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="needPuk2" msgid="4526033371987193070">"SIM कारà¥à¤¡ अनलक गरà¥à¤¨ PUK2 टाइप गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="imei" msgid="2625429890869005782">"IMEI"</string>
+ <string name="meid" msgid="4841221237681254195">"MEID"</string>
+ <string name="ClipMmi" msgid="6952821216480289285">"आगमन कलर ID"</string>
+ <string name="ClirMmi" msgid="7784673673446833091">"बाहिरिने कलर ID"</string>
+ <string name="CfMmi" msgid="5123218989141573515">"कल अगाडि बढाउà¤à¤¦à¥ˆ"</string>
+ <string name="CwMmi" msgid="9129678056795016867">"कल पà¥à¤°à¤¤à¤¿à¤•à¥à¤·à¤¾"</string>
+ <string name="BaMmi" msgid="455193067926770581">"कल बà¥à¤¯à¤¾à¤°à¤¿à¤™"</string>
+ <string name="PwdMmi" msgid="7043715687905254199">"पासवरà¥à¤¡ परिवरà¥à¤¤à¤¨"</string>
+ <string name="PinMmi" msgid="3113117780361190304">"PIN परिवरà¥à¤¤à¤¨"</string>
+ <string name="CnipMmi" msgid="3110534680557857162">"पà¥à¤°à¤¸à¥à¤¤à¥à¤¤ नमà¥à¤¬à¤°à¤®à¤¾ कल गरà¥à¤¦à¥ˆ"</string>
+ <string name="CnirMmi" msgid="3062102121430548731">"कल गरà¥à¤¨à¥‡ अंक रोकेको छ।"</string>
+ <string name="ThreeWCMmi" msgid="9051047170321190368">"कल गरà¥à¤¨à¥‡ तिन तरिका"</string>
+ <string name="RuacMmi" msgid="7827887459138308886">"नचाहिà¤à¤•ा रिसउठà¥à¤¦à¤¾ कलहरूको असà¥à¤µà¥€à¤•ार"</string>
+ <string name="CndMmi" msgid="3116446237081575808">"कलिङ नमà¥à¤¬à¤° पà¥à¤°à¤¦à¤¾à¤¨ गरà¥à¤¨à¥‡"</string>
+ <string name="DndMmi" msgid="1265478932418334331">"बाधा नगरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="CLIRDefaultOnNextCallOn" msgid="429415409145781923">"सीमति गरà¥à¤¨ पूरà¥à¤µà¤¨à¤¿à¤°à¥à¤§à¤¾à¤°à¤¿à¤¤ कलर ID, अरà¥à¤•ो कल: सीमति गरिà¤à¤•ो"</string>
+ <string name="CLIRDefaultOnNextCallOff" msgid="3092918006077864624">"कलर ID पूरà¥à¤µà¤¨à¤¿à¤°à¥à¤§à¤¾à¤°à¤¿à¤¤à¤•ो लागि रोकावट छ। अरà¥à¤•ो कल: रोकावट छैन"</string>
+ <string name="CLIRDefaultOffNextCallOn" msgid="6179425182856418465">"कलर ID पूरà¥à¤µà¤¨à¤¿à¤°à¥à¤§à¤¾à¤°à¤¿à¤¤à¤¦à¥‡à¤–ि पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¿à¤¤ छैन। अरà¥à¤•ो कल: पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¿à¤¤ छ"</string>
+ <string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"कलर ID पूरà¥à¤µà¤¨à¤¿à¤°à¥à¤§à¤¾à¤°à¤¿à¤¤à¤•ो लागि रोकावट छैन। अरà¥à¤•ो कल: रोकावट छैन"</string>
+ <string name="serviceNotProvisioned" msgid="8614830180508686666">"सेवाको वà¥à¤¯à¤µà¤¸à¥à¤¥à¤¾ छैन।"</string>
+ <string name="CLIRPermanent" msgid="3377371145926835671">"तपाईं कलर ID सेटिङ परिवरà¥à¤¤à¤¨ गरà¥à¤¨ सकà¥à¤¨à¥à¤¹à¥à¤¨à¥à¤¨à¥¤"</string>
+ <string name="RestrictedChangedTitle" msgid="5592189398956187498">"पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¿à¤¤ पहà¥à¤à¤š परिवरà¥à¤¤à¤¨ भà¤à¤•ो छ"</string>
+ <string name="RestrictedOnData" msgid="8653794784690065540">"डेटा सेवा रोकिà¤à¤•ो छ।"</string>
+ <string name="RestrictedOnEmergency" msgid="6581163779072833665">"आपतकालीन सेवा रोकिà¤à¤•ो छ।"</string>
+ <string name="RestrictedOnNormal" msgid="4953867011389750673">"भà¥à¤µà¤¾à¤‡à¤¸ सेवा बà¥à¤²à¤• भà¤à¤•ो छ।"</string>
+ <string name="RestrictedOnAllVoice" msgid="3396963652108151260">"सबै आवाज सेवाहरू बनà¥à¤¦ छनà¥à¥¤"</string>
+ <string name="RestrictedOnSms" msgid="8314352327461638897">"SMS सेवा रोकिà¤à¤•ो छ।"</string>
+ <string name="RestrictedOnVoiceData" msgid="996636487106171320">"भà¥à¤µà¤¾à¤‡à¤¸/डेटा सेवाहरू रोकिà¤à¤•ा छनà¥à¥¤"</string>
+ <string name="RestrictedOnVoiceSms" msgid="1888588152792023873">"आवाज/SMS सेवाहरू बनà¥à¤¦ छनà¥à¥¤"</string>
+ <string name="RestrictedOnAll" msgid="5643028264466092821">"सबै भà¥à¤µà¤¾à¤‡à¤¸/डेटा/SMS सेवाहरू बà¥à¤²à¤• भà¤à¤•ा छनà¥à¥¤"</string>
+ <string name="serviceClassVoice" msgid="1258393812335258019">"आवाज"</string>
+ <string name="serviceClassData" msgid="872456782077937893">"डेटा"</string>
+ <string name="serviceClassFAX" msgid="5566624998840486475">"फà¥à¤¯à¤¾à¤•à¥à¤¸"</string>
+ <string name="serviceClassSMS" msgid="2015460373701527489">"SMS"</string>
+ <string name="serviceClassDataAsync" msgid="4523454783498551468">"Async"</string>
+ <string name="serviceClassDataSync" msgid="7530000519646054776">"सिङà¥à¤• गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="serviceClassPacket" msgid="6991006557993423453">"पà¥à¤¯à¤¾à¤•ेट"</string>
+ <string name="serviceClassPAD" msgid="3235259085648271037">"PAD"</string>
+ <string name="roamingText0" msgid="7170335472198694945">"रोमिङ सूचक खà¥à¤²à¤¾"</string>
+ <string name="roamingText1" msgid="5314861519752538922">"रोमिङ सूचक बनà¥à¤¦"</string>
+ <string name="roamingText2" msgid="8969929049081268115">"रोमिङ सूचक फà¥à¤²à¥à¤¯à¤¾à¤¸ गरà¥à¤¦à¥ˆ"</string>
+ <string name="roamingText3" msgid="5148255027043943317">"छिमेकबाट बाहिर"</string>
+ <string name="roamingText4" msgid="8808456682550796530">"बिलà¥à¤¡à¤¿à¤™à¤•ो बाहिर"</string>
+ <string name="roamingText5" msgid="7604063252850354350">"रोमिङ - उपयà¥à¤•à¥à¤¤ पà¥à¤°à¤£à¤¾à¤²à¥€"</string>
+ <string name="roamingText6" msgid="2059440825782871513">"रोमिङ - उपलबà¥à¤§ पà¥à¤°à¤£à¤¾à¤²à¥€"</string>
+ <string name="roamingText7" msgid="7112078724097233605">"रोमिङ - à¤à¤²à¤¿à¤¯à¤¨à¥à¤¸à¤° पारà¥à¤Ÿà¤¨à¤°"</string>
+ <string name="roamingText8" msgid="5989569778604089291">"रोमिङ - पà¥à¤°à¤¿à¤®à¤¿à¤¯à¤® पारà¥à¤Ÿà¤¨à¤°"</string>
+ <string name="roamingText9" msgid="7969296811355152491">"रोमिङ - पूरà¥à¤£ सेवा कारà¥à¤¯à¤•à¥à¤·à¤®à¤¤à¤¾ अवसà¥à¤¥à¤¾"</string>
+ <string name="roamingText10" msgid="3992906999815316417">"रोमिङ - आङà¥à¤¶à¤¿à¤• सेवा पà¥à¤°à¤•ारà¥à¤¯à¤¤à¤¾"</string>
+ <string name="roamingText11" msgid="4154476854426920970">"रोमिङ धà¥à¤µà¤œà¤¾ चालॠछ"</string>
+ <string name="roamingText12" msgid="1189071119992726320">"रोमिङ बà¥à¤¯à¤¾à¤¨à¤° बनà¥à¤¦ छ"</string>
+ <string name="roamingTextSearching" msgid="8360141885972279963">"सेवाको खोजी गरà¥à¤¦à¥ˆâ€¦"</string>
+ <string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: अगाडि पठाइà¤à¤•ो छैन"</string>
+ <string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
+ <string name="cfTemplateForwardedTime" msgid="9206251736527085256">"<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" msgid="5073237827620166285">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: अगाडि बढाइà¤à¤•ो छैन"</string>
+ <string name="cfTemplateRegisteredTime" msgid="6781621964320635172">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: अगाडि बढाइà¤à¤•ो छैन"</string>
+ <string name="fcComplete" msgid="3118848230966886575">"विशेषता कोड पà¥à¤°à¤¾ भयो।"</string>
+ <string name="fcError" msgid="3327560126588500777">"जडान समसà¥à¤¯à¤¾ वा अमानà¥à¤¯ सà¥à¤µà¤¿à¤§à¤¾ कोड।"</string>
+ <string name="httpErrorOk" msgid="1191919378083472204">"ठिक छ"</string>
+ <string name="httpError" msgid="7956392511146698522">"à¤à¤‰à¤Ÿà¤¾ नेटवरà¥à¤• तà¥à¤°à¥à¤Ÿà¤¿ थियो।"</string>
+ <string name="httpErrorLookup" msgid="4711687456111963163">"URL भेटाउन सकेन।"</string>
+ <string name="httpErrorUnsupportedAuthScheme" msgid="6299980280442076799">"साइटको आधिकारिकता योजना समरà¥à¤¥à¤¿à¤¤ छैन।"</string>
+ <string name="httpErrorAuth" msgid="1435065629438044534">"पà¥à¤°à¤®à¤¾à¤£à¥€à¤•रण गरà¥à¤¨ सकेन।"</string>
+ <string name="httpErrorProxyAuth" msgid="1788207010559081331">"पà¥à¤°à¥‹à¤•à¥à¤¸à¥€ सरà¥à¤­à¤°à¤•ो माधà¥à¤¯à¤®à¤¦à¥à¤µà¤¾à¤°à¤¾ पà¥à¤°à¤®à¤¾à¤£à¤¿à¤•रण असफल भà¤à¤•ो छ।"</string>
+ <string name="httpErrorConnect" msgid="8714273236364640549">"सरà¥à¤­à¤°à¤¸à¤à¤— जोडà¥à¤¨ सकेन।"</string>
+ <string name="httpErrorIO" msgid="2340558197489302188">"सरà¥à¤­à¤°à¤¸à¤à¤— संचार गरà¥à¤¨ सकेन। फेरि पछि कोसिस गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="httpErrorTimeout" msgid="4743403703762883954">"सरà¥à¤­à¤° संगको समà¥à¤ªà¤°à¥à¤• पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ समय सकियो।"</string>
+ <string name="httpErrorRedirectLoop" msgid="8679596090392779516">"पृषà¥à¤Ÿà¤®à¤¾ धेरै सरà¥à¤­à¤°à¤¹à¤°à¥‚तिर पà¥à¤¨à¤ƒ निरà¥à¤¦à¥‡à¤¶à¤¨à¤¹à¤°à¥‚ छनà¥à¥¤"</string>
+ <string name="httpErrorUnsupportedScheme" msgid="5015730812906192208">"पà¥à¤°à¥‹à¤Ÿà¥‹à¤•ल समरà¥à¤¥à¤¿à¤¤ छैन।"</string>
+ <string name="httpErrorFailedSslHandshake" msgid="96549606000658641">"à¤à¤‰à¤Ÿà¤¾ सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ जडान सà¥à¤¥à¤¾à¤ªà¤¨à¤¾ गरà¥à¤¨ सकेन।"</string>
+ <string name="httpErrorBadUrl" msgid="3636929722728881972">"पृषà¥à¤  खोलà¥à¤¨ सकिà¤à¤¦à¥ˆà¤¨ किनभने URL अमानà¥à¤¯ छ।"</string>
+ <string name="httpErrorFile" msgid="2170788515052558676">"फाइल भेटाउन सकेन।"</string>
+ <string name="httpErrorFileNotFound" msgid="6203856612042655084">"अनà¥à¤°à¥‹à¤§ गरिà¤à¤•ो फाइल भेटाउन सकेन।"</string>
+ <string name="httpErrorTooManyRequests" msgid="1235396927087188253">"धेरै नै अनà¥à¤°à¥‹à¤§à¤¹à¤°à¥‚ पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾à¤®à¤¾ छनà¥à¥¤ पछि फेरि पà¥à¤°à¤¯à¤¾à¤¸ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="notification_title" msgid="8967710025036163822">"<xliff:g id="ACCOUNT">%1$s</xliff:g>को लागि साइन इन तà¥à¤°à¥à¤Ÿà¤¿"</string>
+ <string name="contentServiceSync" msgid="8353523060269335667">"सिङक गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"सिङà¥à¤• गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"अति धेरै <xliff:g id="CONTENT_TYPE">%s</xliff:g> मेटà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="low_memory" product="tablet" msgid="6494019234102154896">"टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿ भणà¥à¤¡à¤¾à¤°à¤£ खाली छैन! ठाउठखाली गरà¥à¤¨à¤•ो लागि केही फाइलहरू मेटाउनà¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="low_memory" product="default" msgid="3475999286680000541">"फोन भणà¥à¤¡à¤¾à¤°à¤£ भरिà¤à¤•ो छ! ठाउठखाली गरà¥à¤¨à¤•ो लागि केही फाइलहरू मेटाउनà¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="me" msgid="6545696007631404292">"मलाई"</string>
+ <string name="power_dialog" product="tablet" msgid="8545351420865202853">"टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿ विकलà¥à¤ªà¤¹à¤°à¥‚"</string>
+ <string name="power_dialog" product="default" msgid="1319919075463988638">"फोन विकलà¥à¤ªà¤¹à¤°à¥‚"</string>
+ <string name="silent_mode" msgid="7167703389802618663">"मौन मोड"</string>
+ <string name="turn_on_radio" msgid="3912793092339962371">"वायरलेस अन गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="turn_off_radio" msgid="8198784949987062346">"ताररहित बनà¥à¤¦ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="screen_lock" msgid="799094655496098153">"सà¥à¤•à¥à¤°à¤¿à¤¨ लक गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="power_off" msgid="4266614107412865048">"पावर बनà¥à¤¦"</string>
+ <string name="silent_mode_silent" msgid="319298163018473078">"घनà¥à¤Ÿà¥€ बनà¥à¤¦ भयो"</string>
+ <string name="silent_mode_vibrate" msgid="7072043388581551395">"घनà¥à¤Ÿà¥€ कमà¥à¤ªà¤¨ गरà¥à¤›"</string>
+ <string name="silent_mode_ring" msgid="8592241816194074353">"घनà¥à¤Ÿà¤¿ चालॠछ"</string>
+ <string name="shutdown_progress" msgid="2281079257329981203">"बनà¥à¤¦ गरà¥à¤¦à¥ˆ..."</string>
+ <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"तपाईà¤à¤•ो टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿ बनà¥à¤¦ हà¥à¤¨à¥‡ छ।"</string>
+ <string name="shutdown_confirm" product="default" msgid="649792175242821353">"तपाईà¤à¤•ो फोन बनà¥à¤¦ हà¥à¤¨à¥‡ छ।"</string>
+ <string name="shutdown_confirm_question" msgid="2906544768881136183">"के तपाईं बनà¥à¤¦ गरà¥à¤¨ चाहनà¥à¤¹à¥à¤¨à¥à¤›?"</string>
+ <string name="reboot_safemode_title" msgid="7054509914500140361">"सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ मोडमा पà¥à¤¨à¤ƒà¤¬à¥à¤Ÿ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="reboot_safemode_confirm" msgid="55293944502784668">"सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ मोडमा तपाईठपà¥à¤¨à¤ƒà¤¬à¥à¤Ÿ गरà¥à¤¨ चाहनॠहà¥à¤¨à¥à¤›? तपाईà¤à¤²à¥‡ सà¥à¤¥à¤¾à¤ªà¤¨à¤¾ गरेका सबै तेसà¥à¤°à¥‹ पकà¥à¤·à¤•ा अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूलाई असकà¥à¤·à¤® गराउने छ।"</string>
+ <string name="recent_tasks_title" msgid="3691764623638127888">"नयाà¤"</string>
+ <string name="no_recent_tasks" msgid="8794906658732193473">"कà¥à¤¨à¥ˆ नयाठअनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरू छैननà¥à¥¤"</string>
+ <string name="global_actions" product="tablet" msgid="408477140088053665">"टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿ विकलà¥à¤ªà¤¹à¤°à¥‚"</string>
+ <string name="global_actions" product="default" msgid="2406416831541615258">"फोन विकलà¥à¤ªà¤¹à¤°à¥‚"</string>
+ <string name="global_action_lock" msgid="2844945191792119712">"सà¥à¤•à¥à¤°à¤¿à¤¨ बनà¥à¤¦"</string>
+ <string name="global_action_power_off" msgid="4471879440839879722">"शकà¥à¤¤à¤¿ बनà¥à¤¦"</string>
+ <string name="global_action_bug_report" msgid="7934010578922304799">"बग रिपोरà¥à¤Ÿ"</string>
+ <string name="bugreport_title" msgid="2667494803742548533">"बग रिपोरà¥à¤Ÿ लिनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="bugreport_message" msgid="398447048750350456">"à¤à¤‰à¤Ÿà¤¾ इमेल सनà¥à¤¦à¥‡à¤¶à¤•ो रूपमा पठाउनलाई यसले तपाईà¤à¤•ो हालैको उपकरणको अवसà¥à¤¥à¤¾à¤•ो बारेमा सूचना जमà¥à¤®à¤¾ गरà¥à¤¨à¥‡ छ। बग रिपोरà¥à¤Ÿ सà¥à¤°à¥ गरेदेखि पठाउन तयार नभà¤à¤¸à¤®à¥à¤® यसले केही समय लिनà¥à¤›; कृपया धैरà¥à¤¯ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"मौन मोड"</string>
+ <string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"आवाज बनà¥à¤¦ छ"</string>
+ <string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"धà¥à¤µà¤¨à¤¿ खà¥à¤²à¥à¤²à¤¾ छ"</string>
+ <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"हवाइजहाज मोड"</string>
+ <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"उडान मोड खà¥à¤²à¤¾ छ"</string>
+ <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"हवाइजहाज मोड बनà¥à¤¦ छ"</string>
+ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"९९९+"</string>
+ <string name="safeMode" msgid="2788228061547930246">"सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ मोड"</string>
+ <string name="android_system_label" msgid="6577375335728551336">"à¤à¤¨à¥à¤¡à¥à¤°à¥‹à¤‡à¤¡ पà¥à¤°à¤£à¤¾à¤²à¥€"</string>
+ <string name="permgrouplab_costMoney" msgid="5429808217861460401">"तपाईà¤à¤²à¥‡ तिरà¥à¤¨à¥ परà¥à¤¨à¥‡ सेवाहरू"</string>
+ <string name="permgroupdesc_costMoney" msgid="3293301903409869495">"तपाईà¤à¤²à¤¾à¤ˆ महà¤à¤—ो परà¥à¤¨ सकà¥à¤¨à¥‡ कामहरू गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="permgrouplab_messages" msgid="7521249148445456662">"तपाईंका सनà¥à¤¦à¥‡à¤¶à¤¹à¤°à¥‚"</string>
+ <string name="permgroupdesc_messages" msgid="7821999071003699236">"तपाईà¤à¤•ा SMS, इमेल र अनà¥à¤¯ सनà¥à¤¦à¥‡à¤¶à¤¹à¤°à¥‚ पढà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ र लेखà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="permgrouplab_personalInfo" msgid="3519163141070533474">"तपाईà¤à¤•ो निजी सूचना"</string>
+ <string name="permgroupdesc_personalInfo" msgid="8426453129788861338">"तपाईà¤à¤•ो समà¥à¤ªà¤°à¥à¤• कारà¥à¤¡à¤®à¤¾ भणà¥à¤¡à¤¾à¤°à¤£ भà¤à¤•ा तपाईà¤à¤•ो बारेको जानकारीमा सिधा पहà¥à¤à¤š पà¥à¤°à¥â€à¤¯à¤¾à¤‰à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="permgrouplab_socialInfo" msgid="5799096623412043791">"तपाईà¤à¤•ो सामाजिक सूचना"</string>
+ <string name="permgroupdesc_socialInfo" msgid="7129842457611643493">"तपाईà¤à¤•ो समà¥à¤ªà¤°à¥à¤•हरू र सामाजिक जडानहरूको बारेको जानकारीमा सिधा पहà¥à¤à¤š पà¥à¤°à¥â€à¤¯à¤¾à¤‰à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="permgrouplab_location" msgid="635149742436692049">"तपाईà¤à¤•ो सà¥à¤¥à¤¾à¤¨"</string>
+ <string name="permgroupdesc_location" msgid="5704679763124170100">"तपाईà¤à¤•ो भौतिक सà¥à¤¥à¤¾à¤¨ निरीकà¥à¤·à¤£ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="permgrouplab_network" msgid="5808983377727109831">"नेटवरà¥à¤• संचार"</string>
+ <string name="permgroupdesc_network" msgid="4478299413241861987">"विभिनà¥à¤¨ नेटवरà¥à¤• सà¥à¤µà¤¿à¤§à¤¾à¤¹à¤°à¥‚मा पहà¥à¤à¤š राखà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="permgrouplab_bluetoothNetwork" msgid="1585403544162128109">"बà¥à¤²à¥à¤Ÿà¥à¤¥"</string>
+ <string name="permgroupdesc_bluetoothNetwork" msgid="5625288577164282391">"बà¥à¤²à¥à¤Ÿà¥à¤¥à¤•ो माधà¥à¤¯à¤®à¤¦à¥à¤µà¤¾à¤°à¤¾ उपकरणहरू र नेटवरà¥à¤•हरूमाथि पहà¥à¤à¤š राखà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="permgrouplab_audioSettings" msgid="8329261670151871235">"अडियो सेटिङहरू"</string>
+ <string name="permgroupdesc_audioSettings" msgid="2641515403347568130">"अडियो सेटिङहरू बदलà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="permgrouplab_affectsBattery" msgid="6209246653424798033">"बà¥à¤¯à¤Ÿà¥à¤°à¤¿à¤²à¤¾à¤ˆ पà¥à¤°à¤­à¤¾à¤µ पारà¥à¤›"</string>
+ <string name="permgroupdesc_affectsBattery" msgid="6441275320638916947">"छिटà¥à¤Ÿà¥ˆ बà¥à¤¯à¤¾à¤Ÿà¥à¤°à¤¿ सकाउन सकà¥à¤¨à¥‡ ती विशेषताहरू पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="permgrouplab_calendar" msgid="5863508437783683902">"पातà¥à¤°à¥‹"</string>
+ <string name="permgroupdesc_calendar" msgid="5777534316982184416">"पातà¥à¤°à¥‹ तथा घटनाहरूमा पà¥à¤°à¤¤à¥à¤¯à¤•à¥à¤· पहà¥à¤à¤š"</string>
+ <string name="permgrouplab_dictionary" msgid="4148597128843641379">"पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ शबà¥à¤¦à¤•ोश पढà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permgroupdesc_dictionary" msgid="7921166355964764490">"पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ शबà¥à¤¦à¤•ोशमा शबà¥à¤¦à¤¹à¤°à¥‚ पढà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="permgrouplab_writeDictionary" msgid="8090237702432576788">"पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ शबà¥à¤¦à¤•ोश लेखà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permgroupdesc_writeDictionary" msgid="2711561994497361646">"पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ शबà¥à¤¦à¤•ोशमा शबà¥à¤¦à¤¹à¤°à¥‚ थपà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="permgrouplab_bookmarks" msgid="1949519673103968229">"बà¥à¤•मारà¥à¤•हरू र इतिहास"</string>
+ <string name="permgroupdesc_bookmarks" msgid="4169771606257963028">"बà¥à¤•मारà¥à¤•हरू र बà¥à¤°à¤¾à¤‰à¤œà¤° इतिहासमा सिधा पहà¥à¤à¤šà¥¤"</string>
+ <string name="permgrouplab_deviceAlarms" msgid="6117704629728824101">"अलारà¥à¤®"</string>
+ <string name="permgroupdesc_deviceAlarms" msgid="4769356362251641175">"अलारà¥à¤® घडी सेट गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="permgrouplab_voicemail" msgid="4162237145027592133">"भà¥à¤µà¤¾à¤‡à¤¸ मेल"</string>
+ <string name="permgroupdesc_voicemail" msgid="2498403969862951393">"भà¥à¤µà¤¾à¤‡à¤¸à¤®à¥‡à¤²à¤®à¤¾ सिधा पहà¥à¤à¤šà¥¤"</string>
+ <string name="permgrouplab_microphone" msgid="171539900250043464">"माइकà¥à¤°à¥‹à¤«à¥‹à¤¨"</string>
+ <string name="permgroupdesc_microphone" msgid="7106618286905738408">"मा[कà¥à¤°à¥‹à¤«à¥‹à¤¨à¤¬à¤¾à¤Ÿ रेकरà¥à¤¡ अडियोमा सिधा पहà¥à¤à¤š पà¥à¤°à¥â€à¤¯à¤¾à¤‰à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="permgrouplab_camera" msgid="4820372495894586615">"कà¥à¤¯à¤¾à¤®à¥‡à¤°à¤¾"</string>
+ <string name="permgroupdesc_camera" msgid="2933667372289567714">"तसà¥à¤¬à¤¿à¤° वा भिडियो कà¥à¤¯à¤¾à¤ªà¥à¤šà¤°à¤•ो लागि कà¥à¤¯à¤¾à¤®à¥‡à¤°à¤¾à¤®à¤¾ सिधा पहà¥à¤à¤šà¥¤"</string>
+ <string name="permgrouplab_screenlock" msgid="8275500173330718168">"सà¥à¤•à¥à¤°à¤¿à¤¨ लक गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permgroupdesc_screenlock" msgid="7067497128925499401">"तपाईà¤à¤•ो उपकरणमा लक सà¥à¤•à¥à¤°à¤¿à¤¨à¤•ो वà¥à¤¯à¤µà¤¹à¤¾à¤°à¤²à¤¾à¤ˆ पà¥à¤°à¤­à¤¾à¤µà¤¿à¤¤ गरà¥à¤¨à¥‡ कà¥à¤·à¤®à¤¤à¤¾à¥¤"</string>
+ <string name="permgrouplab_appInfo" msgid="8028789762634147725">"तपाईà¤à¤•ा अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूको सूचना"</string>
+ <string name="permgroupdesc_appInfo" msgid="3950378538049625907">"तपाईà¤à¤•ो उपकरणमा अनà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूको वà¥à¤¯à¤µà¤¹à¤¾à¤°à¤®à¤¾ पà¥à¤°à¤­à¤¾à¤µ पारà¥à¤¨à¥‡ कà¥à¤·à¤®à¤¤à¤¾à¥¤"</string>
+ <string name="permgrouplab_wallpaper" msgid="3850280158041175998">"वालपेपर"</string>
+ <string name="permgroupdesc_wallpaper" msgid="5630417854750540154">"उपकरण वालपेपर सेटिङहरू बदलà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="permgrouplab_systemClock" msgid="406535759236612992">"घडी"</string>
+ <string name="permgroupdesc_systemClock" msgid="3944359833624094992">"उपकरण समय वा समय कà¥à¤·à¥‡à¤¤à¥à¤° परिवरà¥à¤¤à¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="permgrouplab_statusBar" msgid="2095862568113945398">"सà¥à¤¥à¤¿à¤¤à¤¿ पटà¥à¤Ÿà¥€"</string>
+ <string name="permgroupdesc_statusBar" msgid="6242593432226807171">"उपकरण सà¥à¤¥à¤¿à¤¤à¤¿ सेटिङहरू परिवरà¥à¤¤à¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="permgrouplab_syncSettings" msgid="3341990986147826541">"सिङà¥à¤• सेटिङहरू"</string>
+ <string name="permgroupdesc_syncSettings" msgid="7603195265129031797">"सिङà¥à¤• सेटिङहरूमा पहà¥à¤à¤š गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="permgrouplab_accounts" msgid="3359646291125325519">"तपाईà¤à¤•ा खाताहरू"</string>
+ <string name="permgroupdesc_accounts" msgid="4948732641827091312">"उपलबà¥à¤§ खाताहरू पहà¥à¤à¤š गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="permgrouplab_hardwareControls" msgid="7998214968791599326">"हारà¥à¤¡à¤µà¥‡à¤¯à¤° नियनà¥à¤¤à¥à¤°à¤£à¤¹à¤°à¥‚"</string>
+ <string name="permgroupdesc_hardwareControls" msgid="4357057861225462702">"हà¥à¤¯à¤¾à¤¨à¥à¤¡à¤¸à¥‡à¤Ÿà¤•ो हारà¥à¤¡à¤µà¥‡à¤¯à¤°à¤®à¤¾ पà¥à¤°à¤¤à¥à¤¯à¤•à¥à¤· पहà¥à¤à¤šà¥¤"</string>
+ <string name="permgrouplab_phoneCalls" msgid="9067173988325865923">"फोन कलहरू"</string>
+ <string name="permgroupdesc_phoneCalls" msgid="7489701620446183770">"अनà¥à¤—मन, रेकरà¥à¤¡ र फोन कलहरूको पà¥à¤°à¤¸à¥‹à¤§à¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥¤"</string>
+ <string name="permgrouplab_systemTools" msgid="4652191644082714048">"पà¥à¤°à¤£à¤¾à¤²à¥€ औजारहरू"</string>
+ <string name="permgroupdesc_systemTools" msgid="8162102602190734305">"निमà¥à¤¨-सà¥à¤¤à¤° पहà¥à¤à¤š र पà¥à¤°à¤£à¤¾à¤²à¥€à¤•ो नियनà¥à¤¤à¥à¤°à¤£"</string>
+ <string name="permgrouplab_developmentTools" msgid="3446164584710596513">"विकसित टà¥à¤²à¤¹à¤°à¥‚"</string>
+ <string name="permgroupdesc_developmentTools" msgid="7058828032358142018">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— विकासकरà¥à¤¤à¤¾à¤¹à¤°à¥‚को लागि मातà¥à¤° सà¥à¤µà¤¿à¤§à¤¾à¤¹à¤°à¥‚को आवशà¥à¤¯à¤•ता।"</string>
+ <string name="permgrouplab_display" msgid="4279909676036402636">"अनà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— UI"</string>
+ <string name="permgroupdesc_display" msgid="6051002031933013714">"अनà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूको UI लाई असर पारà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permgrouplab_storage" msgid="1971118770546336966">"भणà¥à¤¡à¤¾à¤°à¤£"</string>
+ <string name="permgroupdesc_storage" product="nosdcard" msgid="7442318502446874999">"USB भणà¥à¤¡à¤¾à¤°à¤£à¤®à¤¾à¤¥à¤¿ पहà¥à¤à¤š गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"SD कारà¥à¤¡à¤®à¤¾à¤¥à¤¿ पहà¥à¤à¤š गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="permgrouplab_accessibilityFeatures" msgid="7919025602283593907">"पहà¥à¤à¤šà¥€à¤•रण विशेषताहरू"</string>
+ <string name="permgroupdesc_accessibilityFeatures" msgid="4205196881678144335">"सहयोगी पà¥à¤°à¤µà¤¿à¤§à¤¿ भà¤à¤•ो विशेषताहरूले अनà¥à¤°à¥‹à¤§ गरà¥à¤¨ सकà¥à¤›à¤¨à¥à¥¤"</string>
+ <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"विनà¥à¤¡à¥‹ सामगà¥à¤°à¥€à¤•ो पà¥à¤¨à¤ƒà¤¬à¤¹à¤¾à¤²à¥€ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"तपाईà¤à¤•ो अनà¥à¤¤à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ भइरहेको विनà¥à¤¡à¥‹à¤•ो सामगà¥à¤°à¥€à¤•ो निरीकà¥à¤·à¤£ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"छोà¤à¤° गरिने खोजलाई सà¥à¤šà¤¾à¤°à¥ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="capability_desc_canRequestTouchExploration" msgid="5800552516779249356">"छोइà¤à¤•ा आइटमहरू चरà¥à¤•ो सà¥à¤µà¤°à¤®à¤¾ बोलिने छ र सà¥à¤•à¥à¤°à¤¿à¤¨ इशाराहरूको पà¥à¤°à¤¯à¥‹à¤—ले अनà¥à¤µà¥‡à¤·à¤£ गरà¥à¤¨ सकिनà¥à¤›à¥¤"</string>
+ <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"उचà¥à¤š वेब पहà¥à¤à¤šà¤²à¤¾à¤ˆ सà¥à¤šà¤¾à¤°à¥ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—को सामगà¥à¤°à¥€à¤²à¤¾à¤ˆ थप पहà¥à¤à¤šà¤¯à¥‹à¤—à¥à¤¯ बनाउन लिपिहरू सà¥à¤¥à¤¾à¤ªà¤¨à¤¾ गरà¥à¤¨ सकà¥à¤¨à¥ हà¥à¤¨à¥à¤›à¥¤"</string>
+ <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"आफà¥à¤²à¥‡ टाइप गरेको पाठको निरीकà¥à¤·à¤£ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"वà¥à¤¯à¤•à¥à¤¤à¤¿à¤—त डेटा जसà¥à¤¤à¥ˆ कà¥à¤°à¥‡à¤¡à¤¿à¤Ÿ कारà¥à¤¡ नमà¥à¤¬à¤°à¤¹à¤°à¥‚ र पासवरà¥à¤¡à¤¹à¤°à¥‚ समावेश गरà¥à¤¦à¤›à¥¤"</string>
+ <string name="permlab_statusBar" msgid="7417192629601890791">"सà¥à¤¥à¤¿à¤¤à¤¿ पटà¥à¤Ÿà¤¿à¤²à¤¾à¤ˆ अकà¥à¤·à¤® वा संशोधित गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_statusBar" msgid="8434669549504290975">"सà¥à¤¥à¤¿à¤¤à¤¿ पटà¥à¤Ÿà¤¿ असकà¥à¤·à¤® पारà¥à¤¨ वा पà¥à¤°à¤£à¤¾à¤²à¥€ आइकनहरू थपà¥à¤¨ र हटाउन अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_statusBarService" msgid="7247281911387931485">"सà¥à¤¥à¤¿à¤¤à¤¿ पटà¥à¤Ÿà¤¿"</string>
+ <string name="permdesc_statusBarService" msgid="716113660795976060">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई सà¥à¤¥à¤¿à¤¤à¤¿ पटà¥à¤Ÿà¤¿ हà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_expandStatusBar" msgid="1148198785937489264">"सà¥à¤¥à¤¿à¤¤à¤¿ पटà¥à¤Ÿà¤¿à¤²à¤¾à¤ˆ विसà¥à¤¤à¥ƒà¤¤/सङà¥à¤•à¥à¤šà¤¿à¤¤ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_expandStatusBar" msgid="6917549437129401132">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई सà¥à¤¥à¤¿à¤¤à¤¿ पटà¥à¤Ÿà¤¿ विसà¥à¤¤à¤¾à¤° वा संकà¥à¤šà¤¨ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"बहिरà¥à¤—मन कलहरूलाई अरà¥à¤•ो मारà¥à¤— दिनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_processOutgoingCalls" msgid="5331318931937402040">"बहिरà¥à¤—मन कलहरूको पà¥à¤°à¤¶à¥‹à¤§à¤¨ गरà¥à¤¨ र डायल गरिने नमà¥à¤¬à¤° परिवरà¥à¤¤à¤¨ गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ यो अनà¥à¤®à¤¤à¤¿à¤²à¥‡ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई मोनिटर गरà¥à¤¨, अनà¥à¤¯à¤¤à¥à¤° पठाउन वा बाहिर जाने कलहरूलाई रोकà¥à¤¨ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_receiveSms" msgid="8673471768947895082">"पाठ सनà¥à¤¦à¥‡à¤¶à¤¹à¤°à¥‚ (SMS) पà¥à¤°à¤¾à¤ªà¥à¤¤ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_receiveSms" msgid="6424387754228766939">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई SMS सनà¥à¤¦à¥‡à¤¶à¤¹à¤°à¥‚ पà¥à¤°à¤¾à¤ªà¥à¤¤ गरà¥à¤¨ र पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ यसको मतलब अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—ले तपाईंको उपकरणमा पठाइà¤à¤•ो सनà¥à¤¦à¥‡à¤¶à¤¹à¤°à¥‚ तपाईंलाई नदेखाईनै मोनिटर गरà¥à¤¨ वा मेटाउन सकà¥à¤¦à¤›à¥¤"</string>
+ <string name="permlab_receiveMms" msgid="1821317344668257098">"पाठ सनà¥à¤¦à¥‡à¤¶ (MMS) पà¥à¤°à¤¾à¤ªà¥à¤¤ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_receiveMms" msgid="533019437263212260">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई MMS सनà¥à¤¦à¥‡à¤¶à¤¹à¤°à¥‚ पà¥à¤°à¤¾à¤ªà¥à¤¤ गरà¥à¤¨ र पà¥à¤°à¤•ृया गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ यसको मतलब अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—ले तपाईंको उपकरणमा पठाइà¤à¤•ो सनà¥à¤¦à¥‡à¤¶à¤¹à¤°à¥‚ तपाईंलाई नदेखाईनै मोनिटर गरà¥à¤¨ वा मेटाउन सकà¥à¤¦à¤›à¥¤"</string>
+ <string name="permlab_receiveEmergencyBroadcast" msgid="1803477660846288089">"आकसà¥à¤®à¤¿à¤• पà¥à¤°à¤¸à¤¾à¤°à¤£à¤¹à¤°à¥‚ पà¥à¤°à¤¾à¤ªà¥à¤¤ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_receiveEmergencyBroadcast" msgid="848524070262431974">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई आपतकालीन पà¥à¤°à¤¸à¤¾à¤°à¤£ सनà¥à¤¦à¥‡à¤¶à¤¹à¤°à¥‚ पà¥à¤°à¤¾à¤ªà¥à¤¤ गरà¥à¤¨ र पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ यो अनà¥à¤®à¤¤à¤¿ पà¥à¤°à¤£à¤¾à¤²à¥€ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूमा मातà¥à¤° उपलबà¥à¤§ छ।"</string>
+ <string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"सेल पà¥à¤°à¤¸à¤¾à¤°à¤¿à¤¤ सनà¥à¤¦à¥‡à¤¶à¤¹à¤°à¥‚ पढà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"तपाईंको उपकरणदà¥à¤µà¤¾à¤°à¤¾ पà¥à¤°à¤¾à¤ªà¥à¤¤ सेल पà¥à¤°à¤¸à¤¾à¤°à¤£ सनà¥à¤¦à¥‡à¤¶à¤¹à¤°à¥‚ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई पढà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ सेल पà¥à¤°à¤¸à¤¾à¤°à¤£ चेतावनीहरू केही सà¥à¤¥à¤¾à¤¨à¤¹à¤°à¥‚मा तपाईंलाई आपतकालीन गतिविधिहरूको बारेमा सचेत गराउन गरिà¤à¤•ा छनà¥à¥¤ खराब अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूले à¤à¤‰à¤Ÿà¤¾ आपतकालीन सेल पà¥à¤°à¤¸à¤¾à¤°à¤£ पà¥à¤°à¤¾à¤ªà¥à¤¤ गरà¥à¤¦à¤› जब तपाईंको उपकरणको पà¥à¤°à¤¦à¤°à¥à¤¶à¤¨ वा अपरेशनको साथ हसà¥à¤¤à¤•à¥à¤·à¥‡à¤ª गरà¥à¤¨ सकà¥à¤¦à¤›à¤¨à¥à¥¤"</string>
+ <string name="permlab_sendSms" msgid="5600830612147671529">"SMS सनà¥à¤¦à¥‡à¤¶à¤¹à¤°à¥‚ पठाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_sendSms" msgid="7094729298204937667">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई SMS सनà¥à¤¦à¥‡à¤¶à¤¹à¤°à¥‚ पठाउन अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ यसले अपà¥à¤°à¤¤à¥à¤¯à¤¾à¤¸à¤¿à¤¤ चारà¥à¤œà¤¹à¤°à¥‚को परिणाम दिन सकà¥à¤¦à¤›à¥¤ खराब अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूले तपाईंको पà¥à¤·à¥à¤Ÿà¤¿ बिना सनà¥à¤¦à¥‡à¤¶à¤¹à¤°à¥‚ पठाà¤à¤° तपाईंको पैसा खरà¥à¤š गराउन सकà¥à¤¦à¤›à¥¤"</string>
+ <string name="permlab_sendRespondViaMessageRequest" msgid="8713889105305943200">"पà¥à¤°à¤¤à¤¿à¤•à¥à¤°à¤¿à¤¯à¤¾-मारà¥à¤«à¤¤-सनà¥à¤¦à¥‡à¤¶ घटनाहरू पठाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_sendRespondViaMessageRequest" msgid="7107648548468778734">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई आगत कलहरूको लागि पà¥à¤°à¤¤à¤¿à¤•à¥à¤°à¤¿à¤¯à¤¾-मारà¥à¤«à¤¤-सनà¥à¤¦à¥‡à¤¶ घटनाहरूलाई अनà¥à¤¯ सनà¥à¤¦à¥‡à¤¶ पठाउने अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूमा अनà¥à¤°à¥‹à¤§à¤¹à¤°à¥‚ पठाउन अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_readSms" msgid="8745086572213270480">"तपाईंका पाठ सनà¥à¤¦à¥‡à¤¶à¤¹à¤°à¥‚ (SMS वा MMS) पढà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"तपाईà¤à¤•ो टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿ वा SIM कारà¥à¤¡à¤®à¤¾ भणà¥à¤¡à¤¾à¤°à¤£ भà¤à¤•ा SMS सनà¥à¤¦à¥‡à¤¶à¤¹à¤°à¥‚लाई पढà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ यसले अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई विषयवसà¥à¤¤à¥ वा गोपनीयतालाई वेवासà¥à¤¤à¤¾ गरà¥à¤¦à¥ˆ सबै SMS सनà¥à¤¦à¥‡à¤¶à¤¹à¤°à¥‚ पढà¥à¤¨à¥‡ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permdesc_readSms" product="default" msgid="3695967533457240550">"तपाईà¤à¤•ो फोन वा SIM कारà¥à¤¡à¤®à¤¾ भणà¥à¤¡à¤¾à¤°à¤£ भà¤à¤•ा SMS सनà¥à¤¦à¥‡à¤¶à¤¹à¤°à¥‚लाई पढà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ यसले सबै SMS सनà¥à¤¦à¥‡à¤¶à¤¹à¤°à¥‚लाई पढà¥à¤¨à¤•ो लागि सामगà¥à¤°à¥€ वा विशà¥à¤µà¤¸à¤¨à¤¿à¤¯à¤¤à¤¾ बिना नै अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_writeSms" msgid="3216950472636214774">"तपाईà¤à¤•ा पाठ सनà¥à¤¦à¥‡à¤¶à¤¹à¤°à¥‚ समà¥à¤ªà¤¾à¤¦à¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ (SMS वा MMS)"</string>
+ <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई तपाईंको टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿ वा SIM कारà¥à¤¡à¤®à¤¾ भणà¥à¤¡à¤¾à¤° गरिà¤à¤•ा SMS सनà¥à¤¦à¥‡à¤¶à¤¹à¤°à¥‚ लेखà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ खराब अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूले तपाईंको सनà¥à¤¦à¥‡à¤¶à¤¹à¤°à¥‚ मेटाउन सकà¥à¤¦à¤›à¥¤"</string>
+ <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"तपाईà¤à¤•ो फोन वा SIM कारà¥à¤¡à¤®à¤¾ भणà¥à¤¡à¤¾à¤°à¤£ भà¤à¤•ा SMS सनà¥à¤¦à¥‡à¤¶à¤¹à¤°à¥‚लाई लेखà¥â€à¤¨à¤•ो लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ खराब अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूले सायद तपाईà¤à¤•ो सनà¥à¤¦à¥‡à¤¶à¤¹à¤°à¥‚ मेटाउन सकà¥à¤›à¤¨à¥à¥¤"</string>
+ <string name="permlab_receiveWapPush" msgid="5991398711936590410">"पाठ सनà¥à¤¦à¥‡à¤¶à¤¹à¤°à¥‚ (WAP) पà¥à¤°à¤¾à¤ªà¥à¤¤ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_receiveWapPush" msgid="748232190220583385">"WAP सनà¥à¤¦à¥‡à¤¶à¤¹à¤°à¥‚ पà¥à¤°à¤¾à¤ªà¥à¤¤ गरà¥à¤¨ र पà¥à¤°à¤¶à¥‹à¤§à¤¨ गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ यो अनà¥à¤®à¤¤à¤¿à¤®à¤¾ मोनिटर गरà¥à¤¨à¥‡ वा तपाईà¤à¤²à¤¾à¤ˆ पठाइà¤à¤•ा सनà¥à¤¦à¥‡à¤¶à¤¹à¤°à¥‚ तपाईà¤à¤²à¤¾à¤ˆ नदेखाई मेटà¥à¤¨à¥‡ कà¥à¤·à¤®à¤¤à¤¾ समावेश हà¥à¤¨à¥à¤›à¥¤"</string>
+ <string name="permlab_getTasks" msgid="6466095396623933906">"चलिरहेका अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरू पà¥à¤¨à¤ƒà¤¬à¤¹à¤¾à¤²à¥€ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_getTasks" msgid="7454215995847658102">"वरà¥à¤¤à¤®à¤¾à¤¨à¤®à¤¾ र भरखरै चलिरहेका कारà¥à¤¯à¤¹à¤°à¥‚ बारेको सूचना पà¥à¤¨à¤ƒà¤¬à¤¹à¤¾à¤²à¥€ गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¿à¤¤ दिनà¥à¤›à¥¤ यसले उपकरणमा पà¥à¤°à¤¯à¥‹à¤— भà¤à¤•ा अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूको बारेमा सूचना पतà¥à¤¤à¤¾ लगाउन अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिन सकà¥à¤›à¥¤"</string>
+ <string name="permlab_interactAcrossUsers" msgid="7114255281944211682">"पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤¹à¤°à¥‚ तरà¥à¤« अनà¥à¤¤à¤°à¥à¤•à¥à¤°à¤¿à¤¯à¤¾ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_interactAcrossUsers" msgid="364670963623385786">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई उपकरणमा विभिनà¥à¤¨ पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤¹à¤°à¥‚ मारà¥à¤«à¤¤ कारà¥à¤¯à¤¹à¤°à¥‚ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ खराब अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूले यो पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤¹à¤°à¥‚ बिच सà¥à¤°à¤•à¥à¤·à¤¾ बिथोलà¥à¤¨ पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨ सकà¥à¤¨à¥‡ छनà¥à¥¤"</string>
+ <string name="permlab_interactAcrossUsersFull" msgid="2567734285545074105">"कà¥à¤°à¤¾à¤•ानी पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤¹à¤°à¥‚ बिच अनà¥à¤¤à¤°à¥à¤•à¥à¤°à¤¿à¤¯à¤¾ गरà¥à¤¨ पूरà¥à¤£ अनà¥à¤®à¤¤à¤¿"</string>
+ <string name="permdesc_interactAcrossUsersFull" msgid="376841368395502366">"पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤¸à¤à¤—को कà¥à¤°à¤¾à¤•ानी सबै समà¥à¤­à¤¾à¤µà¤¨à¤¾à¤²à¤¾à¤ˆ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_manageUsers" msgid="1676150911672282428">"पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤¹à¤°à¥‚ वà¥à¤¯à¤µà¤¸à¥à¤¥à¤¾à¤ªà¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_manageUsers" msgid="8409306667645355638">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई उपकरणमा, पà¥à¤°à¤¶à¥à¤¨, सिरà¥à¤œà¤¨à¤¾ र मेटाइसहित पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤¹à¤°à¥‚को पà¥à¤°à¤¬à¤¨à¥à¤§ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_getDetailedTasks" msgid="6229468674753529501">"चलिरहेका अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूको विवरण पà¥à¤¨à¤ƒà¤¬à¤¹à¤¾à¤²à¥€ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_getDetailedTasks" msgid="153824741440717599">"वरà¥à¤¤à¤®à¤¾à¤¨à¤®à¤¾ र भरखरै चलिरहेका कारà¥à¤¯à¤¹à¤°à¥‚को बारेमा विसà¥à¤¤à¥ƒà¤¤ सूचना पà¥à¤¨à¤ƒà¤¬à¤¹à¤¾à¤²à¥€ गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ खराब अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूले अनà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरू बारेको निजी सूचना पतà¥à¤¤à¤¾ लगाउन सकà¥à¤›à¥¤"</string>
+ <string name="permlab_reorderTasks" msgid="2018575526934422779">"चलिरहेका अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूलाई पà¥à¤¨à¤ƒà¤•à¥à¤°à¤® गराउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_reorderTasks" msgid="7734217754877439351">"कामहरूलाई अगà¥à¤°à¤­à¤¾à¤— र पृषà¥à¤ à¤­à¥‚मिमा सारà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—ले यो तपाईà¤à¤•ो इनपà¥à¤Ÿ बिना नै गरà¥à¤¨ सकà¥à¤›à¥¤"</string>
+ <string name="permlab_removeTasks" msgid="6821513401870377403">"चालॠभइरहेका अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरू रोकà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_removeTasks" msgid="1394714352062635493">"कामहरू हटाउन र उनीहरूको अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूलाई बनà¥à¤¦ गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ खराब अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूले अनà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूको वà¥à¤¯à¤µà¤¹à¤¾à¤°à¤²à¤¾à¤ˆ अबरोध गरà¥à¤¨ सकà¥à¤›à¤¨à¥à¥¤"</string>
+ <string name="permlab_manageActivityStacks" msgid="7391191384027303065">"activity stacks को पà¥à¤°à¤¬à¤¨à¥à¤§ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_manageActivityStacks" msgid="1615881933034084440">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरू चलà¥à¤¨à¥‡ activity stacks लाई थपà¥à¤¨, हटाउन र परिवरà¥à¤¤à¤¨ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ खराब अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूले अनà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूको वà¥à¤¯à¤µà¤¹à¤¾à¤°à¤²à¤¾à¤ˆ विघटन गरà¥à¤¨ सकà¥à¤›à¤¨à¥à¥¤"</string>
+ <string name="permlab_startAnyActivity" msgid="2918768238045206456">"कà¥à¤¨à¥ˆ गतिविधि सà¥à¤°à¥ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_startAnyActivity" msgid="997823695343584001">"अनà¥à¤®à¤¤à¤¿ सà¥à¤°à¤•à¥à¤·à¤¾ वा निरà¥à¤¯à¤¾à¤¤ अवसà¥à¤¥à¤¾à¤²à¤¾à¤ˆ वासà¥à¤¤à¤¾ नगरिकन कà¥à¤¨à¥ˆ पनि कारà¥à¤¯ सà¥à¤°à¥ गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_setScreenCompatibility" msgid="6975387118861842061">"सà¥à¤•à¥à¤°à¤¿à¤¨ अनà¥à¤•ूलता सेट गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_setScreenCompatibility" msgid="692043618693917374">"अनà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤¹à¤°à¥‚को सà¥à¤•à¥à¤°à¤¿à¤¨ मिलà¥à¤¦à¥‹ मोडलाई नियनà¥à¤¤à¥à¤°à¤£ गरà¥à¤¨à¤•ो लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ अनà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤¹à¤°à¥‚को वà¥à¤¯à¤µà¤¹à¤¾à¤° खराब अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूले टà¥à¤Ÿà¤¾à¤‰à¤¨ सकà¥à¤›à¤¨à¥à¥¤"</string>
+ <string name="permlab_setDebugApp" msgid="3022107198686584052">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— डिबग गरà¥à¤¨à¥‡ सकà¥à¤·à¤® गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_setDebugApp" msgid="4474512416299013256">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—को लागि डिबग गरà¥à¤¨à¥‡ पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ चालॠगरà¥à¤¨à¥‡ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ खराब अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—ले अरू अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरू समापà¥à¤¤ गरà¥à¤¨ यसको उपयोग गरà¥à¤¨ सकà¥à¤¦à¤›à¥¤"</string>
+ <string name="permlab_changeConfiguration" msgid="4162092185124234480">"पà¥à¤°à¤£à¤¾à¤²à¥€ पà¥à¤°à¤¦à¤°à¥à¤¶à¤¨ सेटिङहरू परिवरà¥à¤¤à¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_changeConfiguration" msgid="4372223873154296076">"वरà¥à¤¤à¤®à¤¾à¤¨ कनà¥à¤«à¤¿à¤—रेसन जसà¥à¤¤à¥ˆ लोकà¥à¤¯à¤¾à¤² वा सबैतिर फनà¥à¤Ÿ आकार बदलà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_enableCarMode" msgid="5684504058192921098">"कार मोड सकà¥à¤·à¤® गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_enableCarMode" msgid="4853187425751419467">"कार मोडलाई सकà¥à¤·à¤® पारà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_killBackgroundProcesses" msgid="3914026687420177202">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरू बनà¥à¤¦ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूको पृषà¥à¤ à¤­à¥‚मि पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾à¤¹à¤°à¥‚ बनà¥à¤¦ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ यसले अनà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूलाई चलà¥à¤¨à¤¬à¤¾à¤Ÿ रोकà¥à¤¨ सकà¥à¤¦à¤›à¥¤"</string>
+ <string name="permlab_forceStopPackages" msgid="2329627428832067700">"अनà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरू दबाबमा रोकà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_forceStopPackages" msgid="5253157296183940812">"अनà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूलाई बलपूरà¥à¤µà¤• बनà¥à¤¦ गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_forceBack" msgid="652935204072584616">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— बनà¥à¤¦ गरà¥à¤¨ बल गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_forceBack" msgid="3892295830419513623">"अगà¥à¤°à¤­à¤¾à¤—मा भà¤à¤•ो कà¥à¤¨à¥ˆ गतिविधिलाई जबरजसà¥à¤¤à¥€ बनà¥à¤¦ गरà¥à¤¨ र फरà¥à¤•ेर जानका लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ सामानà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूलाइ कहिलà¥à¤¯à¥ˆ आवशà¥à¤¯à¤•ता परà¥à¤¦à¥ˆà¤¨à¥¤"</string>
+ <string name="permlab_dump" msgid="1681799862438954752">"पà¥à¤°à¤£à¤¾à¤²à¥€à¤•ो आनà¥à¤¤à¤°à¤¿à¤• सà¥à¤¥à¤¿à¤¤à¤¿ पà¥à¤°à¤¾à¤ªà¥à¤¤ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_dump" msgid="1778299088692290329">"पà¥à¤°à¤£à¤¾à¤²à¥€à¤•ो आनà¥à¤¤à¤°à¤¿à¤• सà¥à¤¥à¤¿à¤¤à¤¿ पà¥à¤¨à¤ƒà¤¬à¤¹à¤¾à¤²à¥€ गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ खराब अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूले उनीहरूलाई सामानà¥à¤¯à¤¤à¤ƒ कहिलà¥à¤¯à¥ˆ नचाहिने वà¥à¤¯à¤¾à¤ªà¤• विविधताको निजी र सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ सूचना पà¥à¤¨à¤ƒà¤¬à¤¹à¤¾à¤²à¥€ गरà¥à¤¨ सकà¥à¤›à¤¨à¥à¥¤"</string>
+ <string name="permlab_retrieve_window_content" msgid="8022588608994589938">"सà¥à¤•à¥à¤°à¤¿à¤¨ सामगà¥à¤°à¥€ बहाली गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_retrieve_window_content" msgid="3193269069469700265">"सकà¥à¤°à¤¿à¤¯ विनà¥à¤¡à¥‹à¤•ो विषयवसà¥à¤¤à¥à¤²à¤¾à¤ˆ पà¥à¤¨à¤ƒà¤¬à¤¹à¤¾à¤²à¥€ गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ खराब अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूले पà¥à¤°à¥ˆ विनà¥à¤¡à¥‹à¤•ो विषयवसà¥à¤¤à¥ पà¥à¤¨à¤ƒà¤¬à¤¹à¤¾à¤²à¥€ गरà¥à¤¨ सकà¥à¤›à¤¨à¥ र पासवरà¥à¤¡à¤¹à¤°à¥‚बाहेक यसका सबै पाठको जाà¤à¤š गरà¥à¤¨ सकà¥à¤›à¤¨à¥à¥¤"</string>
+ <string name="permlab_temporary_enable_accessibility" msgid="2312612135127310254">"पहà¥à¤à¤šà¤¤à¤¾à¤²à¤¾à¤ˆ असà¥à¤¥à¤¾à¤¯à¥€ सकà¥à¤·à¤® गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_temporary_enable_accessibility" msgid="8079456293182975464">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई असà¥à¤¥à¤¾à¤¯à¥€ रूपमा उपकरणमाथि पहà¥à¤à¤š राखà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ खराब अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—ले उपयोगकरà¥à¤¤à¤¾à¤•ो सहमति बिना नै पहà¥à¤à¤šà¤²à¤¾à¤ˆ सकà¥à¤·à¤® गरà¥à¤¨ सकà¥à¤¦à¤›à¥¤"</string>
+ <string name="permlab_retrieve_window_info" msgid="8532295199112519378">"विनà¥à¤¡à¥‹ जानकारी बहाली गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_retrieve_window_info" msgid="4998836370424186849">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई विनà¥à¤¡à¥‹ वà¥à¤¯à¤µà¤¸à¥à¤¥à¤¾à¤ªà¤•बाट विनà¥à¤¡à¥‹à¤¹à¤°à¥‚को बारेमा जानकारी पà¥à¤°à¤¾à¤ªà¥à¤¤ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ खराब अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—ले आनà¥à¤¤à¤°à¤¿à¤• पà¥à¤°à¤£à¤¾à¤²à¥€ उपयोगको लागि निमितà¥à¤¤ जानकारी पनि पà¥à¤°à¤¾à¤ªà¥à¤¤ गरà¥à¤¨ सकà¥à¤¦à¤›à¥¤"</string>
+ <string name="permlab_filter_events" msgid="8675535648807427389">"घटनाहरू छानà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_filter_events" msgid="8006236315888347680">"इनà¥à¤ªà¥à¤Ÿ फिलà¥à¤Ÿà¤° जà¥à¤¨ सबै पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ घटनाहरू पठाइनà¥à¤­à¤¨à¥à¤¦à¤¾ पहिले फिलà¥à¤Ÿà¤° गरà¥à¤¨à¥‡à¤²à¤¾à¤ˆ दरà¥à¤¤à¤¾ गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤•ो हसà¥à¤¤à¤•à¥à¤·à¥‡à¤ª बिना नै UI पà¥à¤°à¤£à¤¾à¤²à¥€ खराब अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—ले नियनà¥à¤¤à¥à¤°à¤£ गरà¥à¤¨ सकà¥à¤›à¤¨à¥à¥¤"</string>
+ <string name="permlab_magnify_display" msgid="5973626738170618775">"पà¥à¤°à¤¦à¤°à¥à¤¶à¤¨ बढाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_magnify_display" msgid="7121235684515003792">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई पà¥à¤°à¤¦à¤°à¥à¤¶à¤¨à¤•ो सामगà¥à¤°à¥€ आवरà¥à¤§à¤¨ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ खराब अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूले पà¥à¤°à¤¦à¤°à¥à¤¶à¤¨ सामगà¥à¤°à¥€ संकà¥à¤°à¤®à¤£ गरà¥à¤¨ सकà¥à¤¦à¤›à¤¨à¥ जसले उपकरणलाई अनà¥à¤ªà¤¯à¥‹à¤—ी बनाउà¤à¤¦à¤›à¥¤"</string>
+ <string name="permlab_shutdown" msgid="7185747824038909016">"आंशिक बनà¥à¤¦"</string>
+ <string name="permdesc_shutdown" msgid="7046500838746291775">"गतिविधि वà¥à¤¯à¤µà¤¸à¥à¤¥à¤¾à¤ªà¤•लाई बनà¥à¤¦ गरà¥à¤¨à¥‡ अवसà¥à¤¥à¤¾à¤®à¤¾ राखà¥à¤›à¥¤ पूरà¥à¤£ बनà¥à¤¦ गरà¥à¤¨à¥‡ काम गरà¥à¤¦à¥ˆà¤¨à¥¤"</string>
+ <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— सà¥à¤µà¤¿à¤šà¤¹à¤°à¥‚ जोगाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_stopAppSwitches" msgid="8262195802582255021">"अनà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—मा सà¥à¤µà¤¿à¤š गरà¥à¤¨à¤¬à¤¾à¤Ÿ पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤¹à¤°à¥‚लाई रोकà¥à¤›à¥¤"</string>
+ <string name="permlab_getTopActivityInfo" msgid="2537922311411546016">"वरà¥à¤¤à¤®à¤¾à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—को जानकारी पà¥à¤°à¤¾à¤ªà¥à¤¤ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_getTopActivityInfo" msgid="8153651434145132505">"सà¥à¤•à¥à¤°à¤¿à¤¨à¤•ो अगà¥à¤° भागमा हालको अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— र सेवाहरूका बारे निजी जानकारी निकालà¥à¤¨ बाहकलाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_runSetActivityWatcher" msgid="892239094867182656">"सबै अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— सà¥à¤°à¥à¤µà¤¾à¤¤ गरà¥à¤¨à¥‡ निरीकà¥à¤·à¤£ र नियनà¥à¤¤à¥à¤°à¤£ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई कसरी पà¥à¤°à¤£à¤¾à¤²à¥€ सà¥à¤°à¥à¤µà¤¾à¤¤ गतिहरू मोनिटर गरà¥à¤¨ र नियनà¥à¤¤à¥à¤°à¤£ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ खराब अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूले पà¥à¤°à¤£à¤¾à¤²à¥€à¤®à¤¾ पूरà¥à¤£ सहमत गरà¥à¤¨ सकà¥à¤¦à¤›à¥¤ यो अनà¥à¤®à¤¤à¤¿ केवल विकासको लागि आवशà¥à¤¯à¤• छ, साधारण पà¥à¤°à¤¯à¥‹à¤—को लागि कहिले होइन।"</string>
+ <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"पà¥à¤¯à¤¾à¤•ेज हटाइà¤à¤•ो पà¥à¤°à¤¸à¤¾à¤°à¤£à¤²à¤¾à¤ˆ पठाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_broadcastPackageRemoved" msgid="6621901216207931089">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई सूचना पà¥à¤°à¤¸à¤¾à¤°à¤£ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤› जà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— पà¥à¤¯à¤¾à¤•ेज हटाइà¤à¤•ो छ। खराब अनà¥à¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूले यो कà¥à¤¨à¥ˆ अनà¥à¤¯ चालॠअनà¥à¥à¤ªà¥à¤°à¤¯à¥‹à¤— बनà¥à¤¦ गरà¥à¤¨ पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨ सकà¥à¤¦à¤›à¤¨à¥à¥¤"</string>
+ <string name="permlab_broadcastSmsReceived" msgid="5689095009030336593">"SMS-पà¥à¤°à¤¾à¤ªà¥à¤¤ पà¥à¤°à¤¸à¤¾à¤°à¤£ पठाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"तà¥à¤¯à¥‹ à¤à¤‰à¤Ÿà¤¾ SMS सनà¥à¤¦à¥‡à¤¶à¤¬à¤¾à¤Ÿ पà¥à¤°à¤¾à¤ªà¥à¤¤ भà¤à¤•ो सूचनालाई पà¥à¤°à¤¸à¤¾à¤°à¤£ गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ आउà¤à¤¦à¥ˆ गरेको SMS सनà¥à¤¦à¥‡à¤¶à¤¹à¤°à¥‚लाई जालसाजी गरà¥à¤¨ सायद खराब भà¤à¤•ा अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूले यसलाई पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨ सकà¥à¤›à¤¨à¥à¥¤"</string>
+ <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"WAP-PUSH-पà¥à¤°à¤¾à¤ªà¥à¤¤ पà¥à¤°à¤¸à¤¾à¤°à¤£ पठाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई सूचना पà¥à¤°à¤¸à¤¾à¤°à¤£ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤› जà¥à¤¨ à¤à¤‰à¤Ÿà¤¾ WAP PUSH सनà¥à¤¦à¥‡à¤¶ पà¥à¤°à¤¾à¤ªà¥à¤¤ भà¤à¤•ो छ। खराब अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूले यो MMS सनà¥à¤¦à¥‡à¤¶ बिगारà¥à¤¨ वा मौन तरिकाले कà¥à¤¨à¥ˆ पनि वेबपृषà¥à¤ à¤•ो सामगà¥à¤°à¥€ खराब विभेदहरूसà¤à¤— बदलà¥à¤¨ पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨ सकà¥à¤¦à¤›à¤¨à¥à¥¤"</string>
+ <string name="permlab_setProcessLimit" msgid="2451873664363662666">"चालॠपà¥à¤°à¤¶à¥‹à¤§à¤¨à¤¹à¤°à¥‚को सङà¥à¤–à¥à¤¯à¤¾ सीमति गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_setProcessLimit" msgid="7318061314040879542">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई चालॠहà¥à¤¨à¥‡ पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾à¤¹à¤°à¥‚को अधिकतम संखà¥à¤¯à¤¾ नियनà¥à¤¤à¥à¤°à¤£ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ साधारण अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूको लागि कहिले पनि आवशà¥à¤¯à¤• नपरà¥à¤¨ सकà¥à¤¦à¤›à¥¤"</string>
+ <string name="permlab_setAlwaysFinish" msgid="550958507798796965">"पृषà¥à¤ à¤­à¥‚मि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरू बनà¥à¤¦ गरà¥à¤¨ दबाब दिनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_setAlwaysFinish" msgid="7471310652868841499">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई गतिविधिहरू सधैठसमापà¥à¤¤ भयो कि भà¤à¤¨ जब कि जति सकà¥à¤¦à¥‹ तिनीहरू पृषà¥à¤ à¤­à¥‚मिमा जानà¥à¤›à¤¨à¥ भनà¥à¤¨à¥‡ नियनà¥à¤¤à¥à¤°à¤£ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ साधारण अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूको लागि कहिले पनि आवशà¥à¤¯à¤• नपरà¥à¤¨ सकà¥à¤¦à¤›à¥¤"</string>
+ <string name="permlab_batteryStats" msgid="2789610673514103364">"बà¥à¤¯à¤¾à¤Ÿà¥à¤°à¤¿ तथà¥à¤¯à¤¾à¤™à¥à¤¹à¤°à¥‚ पढà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_batteryStats" msgid="5897346582882915114">"वरà¥à¤¤à¤®à¤¾à¤¨ थोरै बà¥à¤¯à¤¾à¤Ÿà¥à¤°à¥€ पà¥à¤°à¤¯à¥‹à¤— डेटा पढà¥à¤¨à¤•ो लागि à¤à¤• अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—ले अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ जà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— तपाईà¤à¤²à¥‡ पà¥à¤°à¤¯à¥‹à¤— गरीरहनà¥à¤­à¤à¤•ो छ तà¥à¤¯à¤¸à¥à¤•ो बारेका पà¥à¤°à¥à¤£ जानकारी पà¥à¤°à¤¾à¤ªà¥à¤¤ गरà¥à¤¨ सायद अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—ले अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_updateBatteryStats" msgid="3719689764536379557">"बà¥à¤¯à¤¾à¤Ÿà¥à¤°à¤¿ तथà¥à¤¯à¤¾à¤™à¥à¤•लाई परिमारà¥à¤œà¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई संकलित बà¥à¤¯à¤¾à¤Ÿà¥à¤°à¤¿ तथà¥à¤¯à¤¾à¤™à¥à¤•हरू परिमारà¥à¤œà¤¨ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ साधारण अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूको पà¥à¤°à¤¯à¥‹à¤—को लागि होइन।"</string>
+ <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— संचालनका तथà¥à¤¯à¤¾à¤™à¥à¤•हरू पà¥à¤¨à¤ƒà¤¬à¤¹à¤¾à¤²à¥€ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"सङà¥à¤•लन गरिà¤à¤•ा अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— संचालन तथà¥à¤¯à¤¾à¤™à¥à¤²à¤¾à¤ˆ पà¥à¤¨à¤ƒ पà¥à¤°à¤¾à¤ªà¥à¤¤ गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ सामानà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—बाट पà¥à¤°à¤¯à¥‹à¤—को लागि होइन।"</string>
+ <string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— संचलान तथà¥à¤¯à¤¾à¤™à¥à¤•हरूलाई परिमारà¥à¤œà¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"सङà¥à¤•लन गरिà¤à¤•ा अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— संचालन तथà¥à¤¯à¤¾à¤™à¥à¤²à¤¾à¤ˆ परिमारà¥à¤œà¤¨ गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ सामानà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—बाट पà¥à¤°à¤¯à¥‹à¤—को लागि होइन।"</string>
+ <string name="permlab_backup" msgid="470013022865453920">"पà¥à¤°à¤£à¤¾à¤²à¥€ बà¥à¤¯à¤•अप नियनà¥à¤¤à¥à¤°à¤£ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ र पà¥à¤¨à¤ƒ बहाली गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_backup" msgid="6912230525140589891">"पà¥à¤°à¤£à¤¾à¤²à¥€à¤•ो जगेडा नियनà¥à¤¤à¥à¤°à¤£ गरà¥à¤¨ र पà¥à¤¨à¤ƒà¤ªà¥à¤°à¤¾à¤ªà¥à¤¤à¤¿à¤•ो संयोजन गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¿à¤¤ दिनà¥à¤›à¥¤ सामानà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—दà¥à¤µà¤¾à¤°à¤¾ पà¥à¤°à¤¯à¥‹à¤—को लागि होइन।"</string>
+ <string name="permlab_confirm_full_backup" msgid="5557071325804469102">"पूरà¥à¤£ जगेडा गरà¥à¤¨ वा पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ पà¥à¤¨à¤ƒà¤¬à¤¹à¤¾à¤²à¥€ गरà¥à¤¨ निशà¥à¤šà¤¿à¤¤ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_confirm_full_backup" msgid="1748762171637699562">"UI को पूरà¥à¤£ जगेडा निशà¥à¤šà¤¿à¤¨à¥à¤¤à¤¤à¤¾ सà¥à¤°à¥ गरà¥à¤¨à¤•ा लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ कà¥à¤¨à¥ˆ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—बाट पà¥à¤°à¤¯à¥‹à¤— नगरिने।"</string>
+ <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"अनधिकृत बिनà¥à¤¡à¥‹à¤¹à¤°à¥‚ पà¥à¤°à¤¦à¤°à¥à¤¶à¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_internalSystemWindow" msgid="7458387759461466397">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई विनà¥à¤¡à¥‹à¤¹à¤°à¥‚ सिरà¥à¤œà¤¨à¤¾ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤› जà¥à¤¨ आनà¥à¤¤à¤°à¤¿à¤• पà¥à¤°à¤£à¤¾à¤²à¥€ पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ इनà¥à¤Ÿà¤°à¤«à¥‡à¤¸à¤¦à¥à¤µà¤¾à¤°à¤¾ पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨ अभिपà¥à¤°à¥‡à¤°à¤¿à¤¤ छ। साधारण अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूदà¥à¤µà¤¾à¤°à¤¾ पà¥à¤°à¤¯à¥‹à¤—को लागि होइन।"</string>
+ <string name="permlab_systemAlertWindow" msgid="3543347980839518613">"अनà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूमा चितà¥à¤° कोरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_systemAlertWindow" msgid="8584678381972820118">"अरू अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूमाथि वा पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ इनà¥à¤Ÿà¤°à¤«à¥‡à¤¸à¤•ा भागहरूमा चितà¥à¤° कोरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ तिनीहरूले कà¥à¤¨à¥ˆ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—मा इनà¥à¤Ÿà¤°à¤«à¥‡à¤•ो तपाईà¤à¤•ो पà¥à¤°à¤¯à¥‹à¤—सà¤à¤— हसà¥à¤¤à¤•à¥à¤·à¥‡à¤ª गरà¥à¤¨ वा तपाईठअनà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूमा के देखिरहनॠभà¤à¤•ो छ भनà¥à¤¨à¥‡ सोचà¥à¤¨ हà¥à¤¨à¥à¤› भनà¥à¤¨à¥‡ बदलà¥à¤¨ सकà¥à¤›à¤¨à¥à¥¤"</string>
+ <string name="permlab_setAnimationScale" msgid="2805103241153907174">"गà¥à¤²à¥‹à¤¬à¤² सजीविकरण गति परिमारà¥à¤œà¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_setAnimationScale" msgid="7690063428924343571">"विशà¥à¤µà¤¬à¥à¤¯à¤¾à¤ªà¤¿ सजीविकरण(दà¥à¤°à¥à¤¤ वा ढिला सजीविकरणहरू) लाई कà¥à¤¨à¥ˆ पनि समय परिवरà¥à¤¤à¤¨ गरà¥à¤¨à¤•ो लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_manageAppTokens" msgid="1286505717050121370">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— टोकनहरू पà¥à¤°à¤¬à¤¨à¥à¤§ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_manageAppTokens" msgid="8043431713014395671">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई आफà¥à¤¨à¤¾ टोकनहरू सिरà¥à¤œà¤¨à¤¾ गरà¥à¤¨ र उनीहरूको साधारण Z-कà¥à¤°à¤®à¤¾à¤™à¥à¤•न बाइपास गरेर पà¥à¤°à¤¬à¤¨à¥à¤§ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ साधारण अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूको लागि कहिलà¥à¤¯à¥ˆ पनि आवशà¥à¤¯à¤• नहà¥à¤¨ सकà¥à¤¦à¤›à¥¤"</string>
+ <string name="permlab_freezeScreen" msgid="4708181184441880175">"सà¥à¤•à¥à¤°à¤¿à¤¨ फà¥à¤°à¤¿à¤œ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_freezeScreen" msgid="8558923789222670064">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई पूरà¥à¤£-सà¥à¤•à¥à¤°à¤¿à¤¨ संकà¥à¤°à¤®à¤£à¤•ो लागि असà¥à¤¥à¤¾à¤¯à¥€ रूपमा सà¥à¤•à¥à¤°à¤¿à¤¨ सà¥à¤¥à¤¿à¤° गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_injectEvents" msgid="1378746584023586600">"कà¥à¤žà¥à¤œà¥€à¤¹à¤°à¥‚ र नियनà¥à¤¤à¥à¤°à¤£ बटनहरू थिचà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_injectEvents" product="tablet" msgid="206352565599968632">"यसका आफà¥à¤¨à¤¾ इनपà¥à¤Ÿ घटनाहरू (कि थिचाइहरू, आदि) अनà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूलाई वितरण गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ खराब अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूले यसलाई टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿà¤¸à¤®à¥à¤® लैजान पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨ सकà¥à¤›à¤¨à¥à¥¤"</string>
+ <string name="permdesc_injectEvents" product="default" msgid="653128057572326253">"यसà¥à¤•ो आफà¥à¤¨à¥ˆ निवेश घटनाहरू (कि थिचाइहरू, आदि.) अनà¥à¤¯ अनà¥à¤ªà¥à¤°à¥‹à¤¯à¤—हरूलाई पà¥à¥à¤°à¥â€à¤¯à¤¾à¤‰à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ फोनलाई हसà¥à¤¤à¤•à¥à¤·à¥‡à¤ª गरà¥à¤¨ यसको पà¥à¤°à¤¯à¥‹à¤— खराब अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूले गरà¥à¤¨ सकà¥à¤›à¤¨à¥à¥¤"</string>
+ <string name="permlab_readInputState" msgid="469428900041249234">"तपाईंले के टाइप गरà¥à¤¨à¥à¤¹à¥à¤¨à¥à¤› र के कारà¥à¤¯à¤¹à¤°à¥‚ लिनà¥à¤¹à¥à¤¨à¥à¤› रेकरà¥à¤¡ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_readInputState" msgid="8387754901688728043">"अरà¥à¤•ो अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—(जसà¥à¤¤à¥ˆ पासवरà¥à¤¡ टाइप गराइ)सà¤à¤— अनà¥à¤¤à¤°à¥à¤•à¥à¤°à¤¿à¤¯à¤¾ गरेको बेला पनि तपाईà¤à¤²à¥‡ थिचेका किहरूलाइ हेरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ सामानà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूलाई कहिलà¥à¤¯à¥ˆ आवशà¥à¤¯à¤• हà¥à¤à¤¦à¥ˆà¤¨à¥¤"</string>
+ <string name="permlab_bindInputMethod" msgid="3360064620230515776">"à¤à¤‰à¤Ÿà¤¾ निवेश तरिकामा बाà¤à¤§à¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_bindInputMethod" msgid="3250440322807286331">"à¤à¤‰à¤Ÿà¤¾ निवेश तरिकाको उचà¥à¤š सà¥à¤¤à¤°à¤•ो इनà¥à¤Ÿà¤°à¤«à¥‡à¤¸à¤²à¤¾à¤ˆ पकà¥à¤•ा गरà¥à¤¨à¤•ो लागि समाती राखà¥à¤¨à¥‡à¤²à¤¾à¤ˆ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ साधारण अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूलाई कहिलà¥à¤¯à¥ˆ आवशà¥à¤¯à¤• परà¥à¤¨à¥‡ छैन।"</string>
+ <string name="permlab_bindAccessibilityService" msgid="5357733942556031593">"à¤à¤‰à¤Ÿà¤¾ पहà¥à¤à¤š सेवासà¤à¤— जोडà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"à¤à¤• पहà¥à¤à¤š सेवाको उचà¥à¤š सà¥à¤¤à¤°à¤•ो कà¥à¤°à¤¾à¤•ानीलाई पकà¥à¤•ा गरà¥à¤¨à¤•ो लागि समाती राखà¥à¤¨à¥‡à¤²à¥‡ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ साधारण अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूलाई कहिलà¥à¤¯à¥ˆ आवशà¥à¤¯à¤• परà¥à¤¨à¥‡ छैन।"</string>
+ <string name="permlab_bindPrintService" msgid="8462815179572748761">"à¤à¤‰à¤Ÿà¤¾ पà¥à¤°à¤¿à¤¨à¥à¤Ÿ सेवासà¤à¤— जोडà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_bindPrintService" msgid="7960067623209111135">"à¤à¤‰à¤Ÿà¤¾ पà¥à¤°à¤¿à¤¨à¥à¤Ÿ सेवाको उचà¥à¤š सà¥à¤¤à¤°à¤•ो इनà¥à¤Ÿà¤°à¤«à¥‡à¤¸à¤²à¤¾à¤ˆ पकà¥à¤•ा गरà¥à¤¨à¤•ो लागि पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤²à¤¾à¤ˆ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ साधारण अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूलाई कहिलà¥à¤¯à¥ˆ आवशà¥à¤¯à¤• परà¥à¤¨à¥‡ छैन।"</string>
+ <string name="permlab_accessAllPrintJobs" msgid="1120792468465711159">"सबै पà¥à¤°à¤¿à¤¨à¥à¤Ÿ कारà¥à¤¯à¤¹à¤°à¥‚को पहà¥à¤à¤š गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_accessAllPrintJobs" msgid="2978185311041864762">"पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤²à¤¾à¤ˆ अनà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—दà¥à¤µà¤¾à¤°à¤¾ निरà¥à¤®à¤¿à¤¤ पà¥à¤°à¤¿à¤¨à¥à¤Ÿ कारà¥à¤¯à¤¹à¤°à¥‚ पहà¥à¤à¤š गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ साधारण अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूलाई कहिलà¥à¤¯à¥ˆ आवशà¥à¤¯à¤• परà¥à¤¨à¥‡ छैन।"</string>
+ <string name="permlab_bindNfcService" msgid="2752731300419410724">"NFC सेवामा बाà¤à¤§à¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_bindNfcService" msgid="6120647629174066862">"NFC कारà¥à¤¡à¤¹à¤°à¥‚ इमà¥à¤²à¥‡à¤Ÿ गरà¥à¤¨à¥‡ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूलाई बाà¤à¤§à¥à¤¨à¤•ा लागि होलà¥à¤¡à¤°à¤²à¤¾à¤ˆ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ सामानà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूका लागि कहिलà¥à¤¯à¥ˆ पनि आवशà¥à¤¯à¤• परà¥à¤¦à¥ˆà¤¨à¥¤"</string>
+ <string name="permlab_bindTextService" msgid="7358378401915287938">"à¤à¤‰à¤Ÿà¤¾ पाठ सेवासà¤à¤— संगठित हà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_bindTextService" msgid="8151968910973998670">"à¤à¤‰à¤Ÿà¤¾ पाठ सेवाको (उदाहरण शबà¥à¤¦ परीकà¥à¤·à¤£à¤¸à¥‡à¤µà¤¾) उचà¥à¤š सà¥à¤¤à¤°à¤•ो इनà¥à¤Ÿà¤°à¤«à¥‡à¤¸à¤²à¤¾à¤ˆ पकà¥à¤•ा गरà¥à¤¨à¤•ो लागि समाती राखà¥à¤¨à¥‡à¤²à¤¾à¤ˆ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ साधारण अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूलाई कहिलà¥à¤¯à¥ˆ आवशà¥à¤¯à¤• परà¥à¤¨à¥‡ छैन।"</string>
+ <string name="permlab_bindVpnService" msgid="4708596021161473255">"VPN सेवासà¤à¤— बाà¤à¤§à¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="permdesc_bindVpnService" msgid="2067845564581693905">"à¤à¤• Vpn सेवाको उचà¥à¤š सà¥à¤¤à¤°à¤•ो कà¥à¤°à¤¾à¤•ानीलाई पकà¥à¤•ा गरà¥à¤¨à¤•ो लागि समाती राखà¥à¤¨à¥‡à¤²à¥‡ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ साधारण अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूलाई कहिलà¥à¤¯à¥ˆ आवशà¥à¤¯à¤• परà¥à¤¨à¥‡ छैन।"</string>
+ <string name="permlab_bindWallpaper" msgid="8716400279937856462">"à¤à¤‰à¤Ÿà¤¾ वालपेपरमा बाà¤à¤§à¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_bindWallpaper" msgid="7108428692595491668">"वालपेपरको माथिलà¥à¤²à¥‹ सà¥à¤¤à¤°à¤•ो इनà¥à¤Ÿà¤°à¤«à¥‡à¤¸à¤®à¤¾ बाà¤à¤§à¥à¤¨ धारकलाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ सामानà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूलाई कहिलà¥à¤¯à¥ˆ आवशà¥à¤¯à¤• परà¥à¤¦à¥ˆà¤¨à¥¤"</string>
+ <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"à¤à¤‰à¤Ÿà¤¾ विजेट सेवासà¤à¤— संगठित हà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"à¤à¤‰à¤Ÿà¤¾ विजेट सेवाको उचà¥à¤š सà¥à¤¤à¤°à¤•ो इनà¥à¤Ÿà¤°à¤«à¥‡à¤¸à¤²à¤¾à¤ˆ पकà¥à¤•ा गरà¥à¤¨à¤•ो लागि समाती राखà¥à¤¨à¥‡à¤²à¤¾à¤ˆ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ साधारण अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूलाई कहिलà¥à¤¯à¥ˆ आवशà¥à¤¯à¤• परà¥à¤¨à¥‡ छैन।"</string>
+ <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"उपकरणको पà¥à¤°à¤¬à¤¨à¥à¤§à¤¸à¤à¤— अनà¥à¤¤à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_bindDeviceAdmin" msgid="569715419543907930">"उपकरण पà¥à¤°à¤¶à¤¾à¤¸à¤• लाई आशय पठाउन समाती राखà¥â€à¤¨à¥‡à¤²à¤¾à¤ˆ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ साधारण अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤¹à¤°à¥‚को लागि कहिलà¥à¤¯à¥ˆ पनी आवशà¥à¤¯à¤• परà¥à¤¦à¥ˆà¤¨à¥¤"</string>
+ <string name="permlab_manageDeviceAdmins" msgid="4248828900045808722">"à¤à¤‰à¤Ÿà¤¾ उपकरण वà¥à¤¯à¤µà¤¸à¥à¤¥à¤¾à¤ªà¤• थप गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ वा हटाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_manageDeviceAdmins" msgid="5025608167709942485">"होलà¥à¤¡à¤°à¤²à¤¾à¤ˆ सकà¥à¤°à¤¿à¤¯ उपकरण वà¥à¤¯à¤µà¤¸à¥à¤¥à¤¾à¤ªà¤•हरू थप गरà¥à¤¨ वा हटाउन अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ साधारण अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूको लागि कहिलà¥à¤¯à¥ˆ पनि आवशà¥à¤¯à¤• नहà¥à¤¨ सकà¥à¤¦à¤›à¥¤"</string>
+ <string name="permlab_setOrientation" msgid="3365947717163866844">"सà¥à¤•à¥à¤°à¤¿à¤¨ अभिमà¥à¤–िकरण परिवरà¥à¤¤à¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_setOrientation" msgid="3046126619316671476">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई कà¥à¤¨à¥ˆ पनि समयमा सà¥à¤•à¥à¤°à¤¿à¤¨à¤•ो परिकà¥à¤°à¤®à¤£ परिवरà¥à¤¤à¤¨ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ साधारण अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूको लागि कहिले पनि आवशà¥à¤¯à¤• नपरà¥à¤¨ सकà¥à¤¦à¤›à¥¤"</string>
+ <string name="permlab_setPointerSpeed" msgid="9175371613322562934">"सङà¥à¤•ेतक गति बदलà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_setPointerSpeed" msgid="6866563234274104233">"कà¥à¤¨à¥ˆ पनि समयमा माउस परिवरà¥à¤¤à¤¨ गरà¥à¤¨ वा टà¥à¤°à¤¾à¤•पà¥à¤¯à¤¾à¤¡ संकेतकको गति बदलà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ सामानà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूको लागि कहिलà¥à¤¯à¥ˆ नचाहिन सकà¥à¤›à¥¤"</string>
+ <string name="permlab_setKeyboardLayout" msgid="4778731703600909340">"किबोरà¥à¤¡ लेआउट परिवरà¥à¤¤à¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_setKeyboardLayout" msgid="8480016771134175879">"किबोरà¥à¤¡ लेआउटलाई परिवरà¥à¤¤à¤¨ गरà¥à¤¨à¤•ो लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ साधारण अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूलाई सायद कहिलà¥à¤¯à¥ˆ आवशà¥à¤¯à¤• परà¥à¤¨à¥‡ छैन।"</string>
+ <string name="permlab_signalPersistentProcesses" msgid="4539002991947376659">"Linux संकेतहरू अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई पठाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_signalPersistentProcesses" msgid="4896992079182649141">"सबै चलिरहेका पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾à¤¹à¤°à¥‚मा पठाइà¤à¤•ा संकेतलाई अनà¥à¤°à¥‹à¤§ गरà¥à¤¨à¤•ो लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_persistentActivity" msgid="8841113627955563938">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरू जहिले पनि चलà¥à¤¨à¥‡ बनाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"यसको आफà¥à¤¨à¥ˆ मेमोरीमा दृढ भà¤à¤•ोको अंश बनाउनको लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿà¤²à¤¾à¤ˆ ढिलो गराउà¤à¤¦à¥ˆ गरेका अनà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूलाई सीमित मातà¥à¤°à¤¾à¤®à¤¾ यसले मेमोरी उपलबà¥à¤§ गराउन सकà¥à¤›à¥¤"</string>
+ <string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई मेमोरीमा आफैंको निरनà¥à¤¤à¤°à¤•ो अंश बनाउन अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ यसले फोनलाई ढिला बनाà¤à¤° अनà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूमा मेमोरी SIMित गरà¥à¤¨ सकà¥à¤¦à¤›à¤¨à¥à¥¤"</string>
+ <string name="permlab_deletePackages" msgid="184385129537705938">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरू मेटाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_deletePackages" msgid="7411480275167205081">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई à¤à¤¨à¥à¤¡à¥à¤°à¥‹à¤‡à¤¡ पà¥à¤¯à¤¾à¤•ेजहरू मेटाउन अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ खराब अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूले यसलाई महतà¥à¤¤à¥à¤µà¤ªà¥‚रà¥à¤£ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरू मेटाउन पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨ सकà¥à¤¦à¤›à¤¨à¥à¥¤"</string>
+ <string name="permlab_clearAppUserData" msgid="274109191845842756">"अनà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूको डेटा मेटाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_clearAppUserData" msgid="4625323684125459488">"पà¥à¤°à¤¯à¤—करà¥à¤¤à¤¾ डेटा हटाउन अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_deleteCacheFiles" msgid="3128665571837408675">"अनà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूको कà¥à¤¯à¤¾à¤¸à¤¹à¤°à¥‚ मेटाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_deleteCacheFiles" msgid="3812998599006730196">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई कà¥à¤¯à¤¾à¤¸ फाइलहरू मेटाउन अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_getPackageSize" msgid="7472921768357981986">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— भणà¥à¤¡à¤¾à¤°à¤£ ठाउà¤à¤•ो मापन गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_getPackageSize" msgid="3921068154420738296">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई यसको कोड, डेटा, र कà¥à¤¯à¤¾à¤¸ आकारहरू पà¥à¤¨à¤ƒà¤ªà¥à¤°à¤¾à¤ªà¥à¤¤ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_installPackages" msgid="2199128482820306924">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरू सिधै सà¥à¤¥à¤¾à¤ªà¤¨à¤¾ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_installPackages" msgid="5628530972548071284">"नयाठसà¥à¤¥à¤¾à¤ªà¤¨à¤¾ गरà¥à¤¨ वा à¤à¤¨à¥à¤¡à¥à¤°à¥‹à¤‡à¤¡ पà¥à¤¯à¤¾à¤•ेजहरू अदà¥à¤¯à¤¾à¤µà¤§à¤¿à¤• गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ खराब अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूले यसलाई मनपरी रूपमा शकà¥à¤¤à¤¿à¤¶à¤¾à¤²à¥€ अनà¥à¤®à¤¤à¤¿à¤¹à¤°à¥‚ भà¤à¤•ा नयाठअनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरू थपà¥à¤¨ पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨ सकà¥à¤›à¤¨à¥à¥¤"</string>
+ <string name="permlab_clearAppCache" msgid="7487279391723526815">"सबै अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— कà¥à¤¯à¤¾à¤¸ डेटा मेटाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_clearAppCache" product="tablet" msgid="8974640871945434565">"अनà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूको कà¥à¤¯à¤¾à¤¸ डाइरेकà¥à¤Ÿà¤°à¥€à¤¹à¤°à¥‚मा फाइलहरू हटाà¤à¤° टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿà¤•ो भणà¥à¤¡à¤¾à¤°à¤£ खाली गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूलाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ उनीहरूले आफà¥à¤¨à¥‹ डेटा पà¥à¤¨à¤ƒà¤¬à¤¹à¤¾à¤²à¥€ गरà¥à¤¨ परà¥à¤¨à¥‡ हà¥à¤¨à¤¾à¤²à¥‡ यसले अनà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूलाई सà¥à¤Ÿà¤¾à¤°à¥à¤Ÿ हà¥à¤¨ निकै ढिलो गराउन सकà¥à¤›à¥¤"</string>
+ <string name="permdesc_clearAppCache" product="default" msgid="2459441021956436779">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूको कà¥à¤¯à¤¾à¤¸ डाइरेकà¥à¤Ÿà¤°à¥€à¤®à¤¾ फाइलहरू मेटाà¤à¤° फोन भणà¥à¤¡à¤¾à¤°à¤£ खाली गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ यसले अनà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूलाई बढी ढिला सà¥à¤°à¥ गराउà¤à¤› किनकि तिनीहरूले आफà¥à¤¨à¥‹ डेटा पà¥à¤¨à¤ƒà¤ªà¥à¤°à¤¾à¤ªà¥à¤¤à¤¿ गरà¥à¤¨ आवशà¥à¤¯à¤• परà¥à¤¨à¥‡ हà¥à¤¨à¥à¤›à¥¤"</string>
+ <string name="permlab_movePackage" msgid="3289890271645921411">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— सà¥à¤°à¥‹à¤¤à¤¹à¤°à¥‚ सारà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_movePackage" msgid="319562217778244524">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— सà¥à¤°à¥‹à¤¤à¤¹à¤°à¥‚ आनà¥à¤¤à¤°à¤¿à¤•बाट बाहà¥à¤¯ मेडियामा र विपरितमा लैजान अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_readLogs" msgid="6615778543198967614">"संवेनशील लग डेटा पढà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_readLogs" product="tablet" msgid="82061313293455151">"पà¥à¤°à¤£à¤¾à¤²à¥€à¤•ा विभिनà¥à¤¨ फाइलहरूबाट पढà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ समà¥à¤­à¤¾à¤µà¥à¤¯ रूपमा वà¥à¤¯à¤•à¥à¤¤à¤¿à¤—त र निजी सूचनासहित तपाईठटà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿà¤¸à¤à¤— के गरिरहनॠभà¤à¤•ो छ भनà¥à¤¨à¥‡ बारेको साधारण सूचना पतà¥à¤¤à¤¾ लगाउन यसलाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permdesc_readLogs" product="default" msgid="2063438140241560443">"पà¥à¤°à¤£à¤¾à¤²à¥€à¤•ा विभिनà¥à¤¨ फाइलहरूबाट पढà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ समà¥à¤­à¤¾à¤µà¥à¤¯ रूपमा वà¥à¤¯à¤•à¥à¤¤à¤¿à¤—त र निजी सूचनासहित तपाईठफोनसà¤à¤— के गरिरहनॠभà¤à¤•ो छ भनà¥à¤¨à¥‡ बारेको साधारण सूचना पतà¥à¤¤à¤¾ लगाउन यसलाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_anyCodecForPlayback" msgid="715805555823881818">"पछाडि बजाउनको लागि कà¥à¤¨à¥ˆ मिडिया पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_anyCodecForPlayback" msgid="8283912488433189010">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई पà¥à¤²à¥‡à¤¬à¥à¤¯à¤¾à¤• डिकोड गरà¥à¤¨ कà¥à¤¨à¥ˆ पनि सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ मिडिया डिकोडर पà¥à¤°à¤¯à¥‹à¤—को लागि अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <!-- no translation found for permlab_manageCaCertificates (1678391896786882014) -->
+ <skip />
+ <!-- no translation found for permdesc_manageCaCertificates (4015644047196937014) -->
+ <skip />
+ <string name="permlab_diagnostic" msgid="8076743953908000342">"diag को सà¥à¤µà¤¾à¤®à¤¿à¤¤à¥à¤µà¤®à¤¾ रहेको संसाधनहरूमा पढà¥à¤¨à¥à¤¹à¥‹à¤¸à¥/लेखà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_diagnostic" msgid="6608295692002452283">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई diag समूहदà¥à¤µà¤¾à¤°à¤¾ सà¥à¤µà¤¾à¤®à¤¿à¤¤à¥à¤µ पà¥à¤°à¤¾à¤ªà¥à¤¤ कà¥à¤¨à¥ˆ पनि सà¥à¤°à¥‹à¤¤à¤¹à¤°à¥‚मा पढà¥à¤¨ र लेखà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›; उदाहरणको लागि, /dev मा फाइलहरू। यसले समà¥à¤­à¤µà¤¤à¤ƒ पà¥à¤°à¤£à¤¾à¤²à¥€ सà¥à¤¥à¤¿à¤°à¤¤à¤¾ र सà¥à¤°à¤•à¥à¤·à¤¾à¤®à¤¾ पà¥à¤°à¤­à¤¾à¤µ पारà¥à¤¨ सकà¥à¤¦à¤›à¥¤ यो केवल निरà¥à¤®à¤¾à¤¤à¤¾ वा संचालकदà¥à¤µà¤¾à¤°à¤¾ हारà¥à¤¡à¤µà¥‡à¤¯à¤°-निरà¥à¤¦à¤¿à¤·à¥à¤Ÿà¤•ो लागि पà¥à¤°à¤¯à¥‹à¤— हà¥à¤¨ सकà¥à¤¦à¤›à¥¤"</string>
+ <string name="permlab_changeComponentState" msgid="6335576775711095931">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— अंशहरू सकà¥à¤·à¤® वा अकà¥à¤·à¤® गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_changeComponentState" product="tablet" msgid="8887435740982237294">"अनà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— सकà¥à¤·à¤® छ वा छैन भनà¥à¤¨à¥‡ कà¥à¤°à¤¾à¤•ो परिवरà¥à¤¤à¤¨ गरà¥à¤¨à¤•ो लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ महतà¥à¤¤à¥à¤µà¤ªà¥‚रà¥à¤£ फोन सकà¥à¤·à¤®à¤¤à¤¾ खराब अनà¥à¤ªà¥à¤°à¥‹à¤—हरूले असकà¥à¤·à¤® पारà¥à¤¨ पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨ सकà¥à¤›à¤¨à¥à¥¤ यो अनà¥à¤®à¤¤à¤¿à¤¸à¤à¤—ै होसियारी अपनाउनॠपरà¥à¤›, अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— विषय सूचीमा पà¥à¤°à¤¯à¥‹à¤— नहà¥à¤¨à¥‡, असंगत, असà¥à¤¥à¤¿à¤° अवसà¥à¤¥à¤¾ भà¤à¤•ो पà¥à¤°à¤¾à¤ªà¥à¤¤ हà¥à¤¨à¥‡ समà¥à¤­à¤¾à¤µà¤¨à¤¾ हà¥à¤¨à¥à¤›à¥¤"</string>
+ <string name="permdesc_changeComponentState" product="default" msgid="1827232484416505615">"अनà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—को अंश सकà¥à¤·à¤® छ वा छैन भनà¥à¤¨à¥‡à¤®à¤¾ परिवरà¥à¤¤à¤¨ गरà¥à¤¨à¤•ो लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ महतà¥à¤¤à¥à¤µà¤ªà¥‚रà¥à¤£ फोन सकà¥à¤·à¤®à¤¤à¤¾ खराब अनà¥à¤ªà¥à¤°à¥‹à¤—हरूले असकà¥à¤·à¤® पारà¥à¤¨ पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨ सकà¥à¤›à¤¨à¥à¥¤ यो अनà¥à¤®à¤¤à¤¿à¤¸à¤à¤—ै होसियारी अपनाउनॠपरà¥à¤›, अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— विषय सूचीमा पà¥à¤°à¤¯à¥‹à¤— नहà¥à¤¨à¥‡, असंगत, असà¥à¤¥à¤¿à¤° अवसà¥à¤¥à¤¾ भà¤à¤•ो पà¥à¤°à¤¾à¤ªà¥à¤¤ हà¥à¤¨à¥‡ समà¥à¤­à¤¾à¤µà¤¨à¤¾ हà¥à¤¨à¥à¤›à¥¤"</string>
+ <string name="permlab_grantRevokePermissions" msgid="4627315351093508795">"अनà¥à¤®à¤¤à¤¿à¤¹à¤°à¥‚ पà¥à¤°à¤¦à¤¾à¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ वा रदà¥à¤¦ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_grantRevokePermissions" msgid="4088642654085850662">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई यो वा अनà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूको लागि निरà¥à¤¦à¤¿à¤·à¥à¤Ÿ सà¥à¤µà¥€à¤•ृतिहरू पà¥à¤°à¤¦à¤¾à¤¨ गरà¥à¤¨ वा रदà¥à¤¦ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ खराब अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूले यो तपाईंले अनà¥à¤®à¤¤à¤¿ पà¥à¤°à¤¦à¤¾à¤¨ नगरà¥à¤¨à¥à¤­à¤à¤•ा सà¥à¤µà¤¿à¤§à¤¾à¤¹à¤°à¥‚मा पहà¥à¤à¤š गरà¥à¤¨ सकà¥à¤¦à¤›à¤¨à¥à¥¤"</string>
+ <string name="permlab_setPreferredApplications" msgid="8463181628695396391">"विशेष रूपमा मानà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरू सेट गरà¥à¤¨à¥à¤¹à¥‹à¤¸"</string>
+ <string name="permdesc_setPreferredApplications" msgid="4973986762241783712">"तपाईà¤à¤•ो मनपरà¥à¤¨à¥‡ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई परिवरà¥à¤¤à¤¨ गरà¥à¤¨à¤•ो लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ खराब अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूले चलिरहेका ती अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤¹à¤°à¥‚लाई चà¥à¤ªà¤šà¤¾à¤ª रूपमा परिवरà¥à¤¤à¤¨ गरà¥à¤¨ सकà¥à¤›à¤¨à¥, तपाईà¤à¤¬à¤¾à¤Ÿ निजी डेटा संकलन गरà¥à¤¨à¤•ो लागि भइरहेको अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई सà¥à¤ªà¥à¤« गरà¥à¤¨ सकà¥à¤›à¤¨à¥à¥¤"</string>
+ <string name="permlab_writeSettings" msgid="2226195290955224730">"पà¥à¤°à¤£à¤¾à¤²à¥€ सेटिङहरू परिमारà¥à¤œà¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_writeSettings" msgid="7775723441558907181">"पà¥à¤°à¤£à¤¾à¤²à¥€à¤•ा सेटिङ डेटालाई परिवरà¥à¤¤à¤¨ गरà¥à¤¨à¤•ो लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ खराब अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूले सायद तपाईà¤à¤•ो पà¥à¤°à¤£à¤¾à¤²à¥€à¤•ो कनà¥à¤«à¤¿à¤—रेसनलाई कà¥à¤·à¤¤à¤¿ पà¥à¤°à¥â€à¤¯à¤¾à¤‰à¤¨ सकà¥à¤›à¤¨à¥à¥¤"</string>
+ <string name="permlab_writeSecureSettings" msgid="204676251876718288">"सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ पà¥à¤°à¤£à¤¾à¤²à¥€ सेटिङहरू परिमारà¥à¤œà¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_writeSecureSettings" msgid="8159535613020137391">"पà¥à¤°à¤£à¤¾à¤²à¥€à¤•ो सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ सेटिङ डेटा परिमारà¥à¤œà¤¨ गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ सामानà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूको पà¥à¤°à¤¯à¥‹à¤—को लागि होइनà¥à¥¤"</string>
+ <string name="permlab_writeGservices" msgid="2149426664226152185">"Google सेवा नकà¥à¤¸à¤¾ परिवरà¥à¤¤à¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_writeGservices" msgid="1287309437638380229">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई Google सेवा नकà¥à¤¸à¤¾à¤¹à¤°à¥‚ परिमारà¥à¤œà¤¨ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ साधारण अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूदà¥à¤µà¤¾à¤°à¤¾à¤•ो पà¥à¤°à¤¯à¥‹à¤—को लागि होइन।"</string>
+ <string name="permlab_receiveBootCompleted" msgid="5312965565987800025">"सà¥à¤Ÿà¤¾à¤°à¥à¤Ÿà¤…पमा चलाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_receiveBootCompleted" product="tablet" msgid="7390304664116880704">"आनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई पà¥à¤°à¤£à¤¾à¤²à¥€ बà¥à¤Ÿ पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ पूरà¥à¤£ हà¥à¤¨à¥‡ बितिकै आफैलाई सà¥à¤°à¥ गरà¥à¤¨à¥‡ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ यसले टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿ सà¥à¤°à¥ गरà¥à¤¨à¤®à¤¾ ढिला गरà¥à¤¨ सकà¥à¤¦à¤› र अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई समगà¥à¤°à¤®à¤¾ टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿ सधैठचालॠगरेर ढिला बनाउà¤à¤¦à¤›à¥¤"</string>
+ <string name="permdesc_receiveBootCompleted" product="default" msgid="513950589102617504">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई पà¥à¤°à¤£à¤¾à¤²à¥€ बà¥à¤Ÿ गरी सकेपछि जति सकà¥à¤¦à¥‹ चाà¤à¤¡à¥‹ आफैंमा सà¥à¤°à¥ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ यसले फोन सà¥à¤°à¥ गरà¥à¤¨à¤®à¤¾ ढिला गरà¥à¤¨ सकà¥à¤¦à¤› र अनपà¥à¤°à¤¯à¥‹à¤—लाई समगà¥à¤°à¤®à¤¾ फोन सधैठचालॠगरेर ढिला बनाउà¤à¤¦à¤›à¥¤"</string>
+ <string name="permlab_broadcastSticky" msgid="7919126372606881614">"सà¥à¤Ÿà¤¿à¤•ि पà¥à¤°à¤¸à¤¾à¤°à¤£ पठाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_broadcastSticky" product="tablet" msgid="7749760494399915651">"औपचारिक पà¥à¤°à¤¸à¤¾à¤°à¤£à¤²à¤¾à¤ˆ पठाउनको लागि à¤à¤‰à¤Ÿà¤¾ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›, जà¥à¤¨ पà¥à¤°à¤¸à¤¾à¤°à¤£ समापà¥à¤¤ भà¤à¤ªà¤›à¤¿ बाà¤à¤•ी रहनà¥à¤›à¥¤ अतà¥à¤¯à¤¾à¤§à¤¿à¤• पà¥à¤°à¤¯à¥‹à¤—ले धेरै मेमोरी पà¥à¤°à¤¯à¥‹à¤— गरेको कारणले टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿà¤²à¤¾à¤ˆ ढिलो र असà¥à¤¥à¤¿à¤° बनाउन सकà¥à¤›à¥¤"</string>
+ <string name="permdesc_broadcastSticky" product="default" msgid="2825803764232445091">"औपचारिक पà¥à¤°à¤¸à¤¾à¤°à¤£à¤²à¤¾à¤ˆ पठाउनको लागि à¤à¤• अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›, जà¥à¤¨ पà¥à¤°à¤¸à¤¾à¤°à¤£ समापà¥à¤¤ भà¤à¤ªà¤›à¤¿ बाà¤à¤•ी रहनà¥à¤›à¥¤ अतà¥à¤¯à¤¾à¤§à¤¿à¤• पà¥à¤°à¤¯à¥‹à¤—ले धेरै मेमोरी पà¥à¤°à¤¯à¥‹à¤— गरेको कारणले फोनलाई ढिलो र असà¥à¤¥à¤¿à¤° बनाउन सकà¥à¤›à¥¤"</string>
+ <string name="permlab_readContacts" msgid="8348481131899886131">"तपाईà¤à¤•ा समà¥à¤ªà¤°à¥à¤•हरू पढà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_readContacts" product="tablet" msgid="5294866856941149639">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई निरà¥à¤¦à¤¿à¤·à¥à¤Ÿ वà¥à¤¯à¤•à¥à¤¤à¤¿à¤—तसà¤à¤— अनà¥à¤¯ तरिकाहरूबाट कल गरà¥à¤¨à¥ भà¤à¤•ा, इमेल गरà¥à¤¨à¥ भà¤à¤•ा वा अनà¥à¤¤à¤°à¥à¤•à¥à¤°à¤¿à¤¯à¤¾ गरà¥à¤¨à¥à¤­à¤à¤•ा आवृतिसहितको तपाईंको टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿà¤®à¤¾ भणà¥à¤¡à¤¾à¤°à¤£ गरिà¤à¤•ा समà¥à¤ªà¤°à¥à¤•हरूको डेटा पढà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ यो अनà¥à¤®à¤¤à¤¿à¤²à¥‡ तपाईंको समà¥à¤ªà¤°à¥à¤• डेटा बचत गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›, र खराब अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूले तपाईंको जानकारी बिना समà¥à¤ªà¤°à¥à¤• डेटा साà¤à¥‡à¤¦à¤¾à¤°à¥€ गरà¥à¤¨ सकà¥à¤¦à¤›à¤¨à¥à¥¤"</string>
+ <string name="permdesc_readContacts" product="default" msgid="8440654152457300662">"तपाईà¤à¤²à¥‡ विशेष वà¥à¤¯à¤•à¥à¤¤à¤¿à¤¹à¤°à¥‚सà¤à¤— अरà¥à¤•ो तरिकाबाट कल गरà¥à¤¨à¥à¤­à¤à¤•ा, इमेल गरà¥à¤¨à¥à¤­à¤à¤•ा वा संचार गरà¥à¤¨à¥à¤­à¤à¤•ा आवृतिसहित तपाईà¤à¤•ो फोनमा भणà¥à¤¡à¤¾à¤°à¤£ भà¤à¤•ा डेटाको बारेमा पढà¥à¤¨à¤•ो लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ यो अनà¥à¤®à¤¤à¤¿à¤²à¥‡ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई तपाईà¤à¤•ो समà¥à¤ªà¤°à¥à¤• डेटा बचत गरà¥à¤¨à¤•ो लागि अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›, र तपाईà¤à¤•ो जà¥à¤žà¤¾à¤¨ बिना नै खराब अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूले सायद समà¥à¤ªà¤°à¥à¤• डेटा साà¤à¥‡à¤¦à¤¾à¤°à¥€ गरà¥à¤¨ सकà¥à¤›à¤¨à¥à¥¤"</string>
+ <string name="permlab_writeContacts" msgid="5107492086416793544">"तपाईà¤à¤•ा समà¥à¤ªà¤°à¥à¤•हरू परिवरà¥à¤¤à¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_writeContacts" product="tablet" msgid="897243932521953602">"अनà¥à¤¯ तरिकाका आवृतिहरूसà¤à¤— जà¥à¤¨ तपाईà¤à¤²à¥‡ कल, इमेल, वा विशेष समà¥à¤ªà¤°à¥à¤• गरà¥à¤¨à¥à¤­à¤à¤•ासहित तपाईà¤à¤•ो टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿà¤®à¤¾ भणà¥à¤¡à¤¾à¤°à¤£ भà¤à¤•ा समà¥à¤ªà¤°à¥à¤•हरूको बारेको डेटालाई परिवरà¥à¤¤à¤¨ गरà¥à¤¨à¤•ो लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ यस अनà¥à¤®à¤¤à¤¿à¤²à¥‡ समà¥à¤ªà¤°à¥à¤• डेटालाई मेटाउनको लागि अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permdesc_writeContacts" product="default" msgid="589869224625163558">"तपाईà¤à¤²à¥‡ बारमà¥à¤¬à¤¾à¤° कल गरेका, इमेल गरेका, वा विशेष समà¥à¤ªà¤°à¥à¤•हरूसà¤à¤— सञà¥à¤šà¤¾à¤° गरेका सहित तपाईà¤à¤•ो फोनमा भणà¥à¤¡à¤¾à¤°à¤£ गरेका तपाईà¤à¤•ा समà¥à¤ªà¤°à¥à¤•हरू परिमारà¥à¤œà¤¨ गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ यो अनà¥à¤®à¤¤à¤¿à¤²à¥‡ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई समà¥à¤ªà¤°à¥à¤• डेटा मेटाउन दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_readCallLog" msgid="3478133184624102739">"कल लग पढà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_readCallLog" product="tablet" msgid="3700645184870760285">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई तपाईà¤à¤•ो टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿà¤•ो कल लग, आगमन र बहिरà¥à¤—मन कलहरू बारे डेटा सहितको कल लग पढà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ यस अनà¥à¤®à¤¤à¤¿à¤²à¥‡ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूलाई तपाईà¤à¤•ो कल लग डेटाहरूको बचत गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›, र खराब अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूले तपाईà¤à¤•ो जानकारी बिना नै यो कल लग डेटालाई अरूसà¤à¤— साà¤à¥‡à¤¦à¤¾à¤° गरà¥à¤¨ सकà¥à¤›à¤¨à¥à¥¤"</string>
+ <string name="permdesc_readCallLog" product="default" msgid="5777725796813217244">"भितà¥à¤° आउने र बाहिर जाने कलहरूसहित तपाईà¤à¤•ो फनको कल लग पढà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ यो अनà¥à¤®à¤¤à¤¿à¤²à¥‡ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूलाई तपाईà¤à¤•ा कल लग डेटा बचत गरà¥à¤¨ दिनà¥à¤› र खराब अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूले तपाईà¤à¤²à¥‡ थाहै नपाई कल लग डेटालाई साà¤à¥‡à¤¦à¤¾à¤°à¥€ गरà¥à¤¨ सकà¥à¤›à¤¨à¥à¥¤"</string>
+ <string name="permlab_writeCallLog" msgid="8552045664743499354">"कल लग लेखà¥â€à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_writeCallLog" product="tablet" msgid="6661806062274119245">"आगमन तथा बहरà¥à¤—मन डेटासहित तपाईà¤à¤•ो टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿà¤•ो कल लगको परिमारà¥à¤œà¤¨ गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ खराब अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूले यसलाई तपाईà¤à¤•ो कल लग परिमारà¥à¤œà¤¨ गरà¥à¤¨ वा मेटाउन पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨ सकà¥à¤›à¤¨à¥à¥¤"</string>
+ <string name="permdesc_writeCallLog" product="default" msgid="683941736352787842">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई तपाईंको फोनको आउने र बाहिर जाने कलहरूको बारेको डेटा सहित कल लग परिमारà¥à¤œà¤¨ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ खराब अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूले यसलाई तपाईंको कल लग मेटाउन वा परिमारà¥à¤œà¤¨ गरà¥à¤¨ पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨ सकà¥à¤¦à¤›à¥¤"</string>
+ <string name="permlab_readProfile" msgid="4701889852612716678">"तपाईà¤à¤•ो आफà¥à¤¨à¥ˆ समà¥à¤ªà¤°à¥à¤• कारà¥à¤¡ पढà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_readProfile" product="default" msgid="5462475151849888848">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई तपाईंको उपकरणमा भणà¥à¤¡à¤¾à¤°à¤£ गरिà¤à¤•ा वà¥à¤¯à¤•à¥à¤¤à¤¿à¤—त पà¥à¤°à¥‹à¤«à¤¾à¤‡à¤² जानकारी पढà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›, जसà¥à¤¤à¥ˆ तपाईंको नाम र समà¥à¤ªà¤°à¥à¤• जानकारी। यसको मतलब अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—ले तपाईंलाई पहिचान गरà¥à¤¨ सकà¥à¤¦à¤› र तपाईंको पà¥à¤°à¥‹à¤«à¤¾à¤‡à¤² जानकारी अरूलाई पठाउन सकà¥à¤¦à¤›à¥¤"</string>
+ <string name="permlab_writeProfile" msgid="907793628777397643">"तपाईà¤à¤•ो आफà¥à¤¨à¥ˆ समà¥à¤ªà¤°à¥à¤• कारà¥à¤¡ परिमारà¥à¤œà¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"तपाईà¤à¤•ो उपकरणमा भणà¥à¤¡à¤¾à¤° भà¤à¤•ो वà¥à¤¯à¤¾à¤•à¥à¤¤à¤¿à¤—त पà¥à¤°à¥‹à¤«à¤¾à¤‡à¤² जानकारी, जसà¥à¤¤à¥ˆ तपाईà¤à¤•ो नाम वा समà¥à¤ªà¤°à¥à¤• जानकारीलाई परिवरà¥à¤¤à¤¨ गरà¥à¤¨ वा थपà¥à¤¨à¤•ो लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ यसको मतलब अनà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—ले तपाईà¤à¤²à¤¾à¤ˆ चिनà¥à¤¨ सकà¥à¤›à¤¨à¥ र सायद अनà¥à¤¯à¤²à¤¾à¤ˆ तपाईà¤à¤•ो पà¥à¤°à¥‹à¤«à¤¾à¤‡à¤² जानकारी पठाउन सकà¥à¤›à¤¨à¥à¥¤"</string>
+ <string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"तपाईंको सामाजिक सà¥à¤Ÿà¥à¤°à¤¿à¤® पढà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"तपाईठर तपाईà¤à¤•ा साथीहरूबाट सामाजिक अपडेटलाई पहà¥à¤à¤š र सिंक गरà¥à¤¨à¤•ो लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ जानकारी साà¤à¥‡à¤¦à¤¾à¤°à¥€ गरà¥à¤¦à¤¾ सावधान रहनà¥à¤¹à¥‹à¤¸à¥ -- समाजिक नेटवरà¥à¤•हरूमा तपाईठर तपाईà¤à¤•ो साथीको बिचमा भà¤à¤•ा संचारलाई पढà¥à¤¨ विशà¥à¤µà¤¾à¤¸à¤¨à¥€à¤¯à¤¤à¤¾ बेगरै यसले अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ नोट: यो अनà¥à¤®à¤¤à¤¿ बलपूरà¥à¤µà¤• सबै सामाजिक नेटवरà¥à¤•हरूमा सायद नगरà¥à¤¨ सकिनà¥à¤›à¥¤"</string>
+ <string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"तपाईà¤à¤•ो सामाजिक पà¥à¤°à¤µà¤¾à¤¹à¤®à¤¾ लेखà¥â€à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_writeSocialStream" product="default" msgid="3086557552204114849">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई तपाईंको साथीहरूबाट सामाजिक अपडेटहरू पà¥à¤°à¤¦à¤°à¥à¤¶à¤¨ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ जानकारी साà¤à¥‡à¤¦à¤¾à¤°à¥€ गरà¥à¤¨à¥‡ बेलामा होशियार रहनà¥à¤¹à¥‹à¤¸à¥ -- यसले अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई सनà¥à¤¦à¥‡à¤¶à¤¹à¤°à¥‚ निरà¥à¤®à¤¾à¤£ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤› जà¥à¤¨ साथीबाट आà¤à¤•ो देखिनà¥à¤›à¥¤ टिपà¥à¤ªà¤£à¥€: यो अनà¥à¤®à¤¤à¤¿ सबै सामाजिक सञà¥à¤œà¤¾à¤²à¤¹à¤°à¥‚मा लागू नहà¥à¤¨ सकà¥à¤¦à¤›à¥¤"</string>
+ <string name="permlab_readCalendar" msgid="5972727560257612398">"गोपà¥à¤¯ जानकारी र पातà¥à¤°à¥‹ घटनाहरू पढà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_readCalendar" product="tablet" msgid="4216462049057658723">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई तपाईंको टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿà¤®à¤¾ भणà¥à¤¡à¤¾à¤°à¤£ गरिà¤à¤•ा ती साथीहरू वा सहयोगीहरू सहितको पातà¥à¤°à¤¾à¤•ा कारà¥à¤¯à¤•à¥à¤°à¤®à¤¹à¤°à¥‚ पढà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ यसले गोपनीयता वा संवेदनशीलता बिना पनि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई तपाईंको पातà¥à¤°à¤¾à¤•ा डेटा साà¤à¥‡à¤¦à¤¾à¤°à¥€ गरà¥à¤¨ वा बचत गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permdesc_readCalendar" product="default" msgid="7434548682470851583">"ती साथीहरू वा सहकरà¥à¤®à¥€à¤¹à¤°à¥‚सहित सबै पातà¥à¤°à¥‹ घटनाहरू तपाईà¤à¤•ो टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿà¤®à¤¾ भणà¥à¤¡à¤¾à¤°à¤£ भà¤à¤•ालाई पढà¥à¤¨à¤•ो लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ तपाईà¤à¤•ो पातà¥à¤°à¥‹ डेटा यसले सायद सेयर गरà¥à¤¨ वा सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ गरà¥à¤¨à¤•ो लागि विशà¥à¤µà¤¾à¤¸à¤¨à¤¿à¤¯à¤¤à¤¾ वा समà¥à¤µà¥‡à¤¦à¤¨à¤¶à¥€à¤²à¤¤à¤¾ बिना नै अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_writeCalendar" msgid="8438874755193825647">"पातà¥à¤°à¥‹ घटनाहरू थपà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ वा परिमारà¥à¤œà¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ र मालिकको जà¥à¤žà¤¾à¤¨ बिना नै पाहà¥à¤¨à¤¾à¤¹à¤°à¥‚लाई इमेल पठाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_writeCalendar" product="tablet" msgid="6679035520113668528">"ती साथीहरू वा सहकरà¥à¤®à¥€à¤¹à¤°à¥‚सहितका घटनाहरू जसलाई तपाईà¤à¤²à¥‡ आफà¥à¤¨à¥‹ टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿà¤®à¤¾ परिमारà¥à¤œà¤¨ गरà¥à¤¨ सकà¥à¤¨à¥‡ अनà¥à¤®à¤¤à¤¿ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई दिनà¥à¤›à¥¤ यसले अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई सनà¥à¤¦à¥‡à¤¶à¤¹à¤°à¥‚ जà¥à¤¨ पातà¥à¤°à¤¾à¤•ो मालिकहरूबाट आà¤à¤•ा देखिनेलाई पठाउने वा मालिकहरूको जà¥à¤žà¤¾à¤¨ बेगर घटनालाई परिमारà¥à¤œà¤¨ गरà¥à¤¨à¥‡ अनà¥à¤®à¤¿à¤¤ दिनà¥à¤›à¥¤"</string>
+ <string name="permdesc_writeCalendar" product="default" msgid="2324469496327249376">"ती साथीहरू वा सहकरà¥à¤®à¥€à¤¹à¤°à¥‚सहित तपाईà¤à¤•ो फोनका घटनाहरू जसलाई थपà¥à¤¨, हटाउन र परिवरà¥à¤¤à¤¨ गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ पातà¥à¤°à¥‹ मालिकबाट देखा परेका वा मालिकको जà¥à¤žà¤¾à¤¨ बिना परिवरà¥à¤¤à¤¨ भà¤à¤•ा घटनाहरू सनà¥à¤¦à¥‡à¤¶ पठाउन यसले अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिन सकà¥à¤›à¥¤"</string>
+ <string name="permlab_accessMockLocation" msgid="8688334974036823330">"परीकà¥à¤·à¤£à¤•ो लागि सà¥à¤¥à¤¾à¤¨ सà¥à¤°à¥‹à¤¤à¤¹à¤°à¥‚ मक गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_accessMockLocation" msgid="5808711039482051824">"परीकà¥à¤·à¤£à¤•ो लागि मक सà¥à¤¥à¤¾à¤¨ सà¥à¤°à¥‹à¤¤à¤¹à¤°à¥‚ सिरà¥à¤œà¤¨à¤¾ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ वा नयाठसà¥à¤¥à¤¾à¤¨ पà¥à¤°à¤¦à¤¾à¤¯à¤• सà¥à¤¥à¤¾à¤ªà¤¨à¤¾ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤ यसले अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई सà¥à¤¥à¤¾à¤¨à¤®à¤¾ ओभरराइड गरà¥à¤¦à¤› र/वा सà¥à¤¥à¤¿à¤¤à¤¿ अनà¥à¤¯ सà¥à¤¥à¤¾à¤¨ सà¥à¤°à¥‹à¤¤à¤¹à¤°à¥‚ जसà¥à¤¤à¥ˆ GPS वा सà¥à¤¥à¤¾à¤¨ पà¥à¤°à¤¦à¤¾à¤¯à¤•बाट फरà¥à¤•ाइà¤à¤•ा।"</string>
+ <string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"अधिक सà¥à¤¥à¤¾à¤¨ पà¥à¤°à¤¦à¤¾à¤¯à¤• आदेशहरू पहà¥à¤à¤š गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_accessLocationExtraCommands" msgid="5945166642335800763">"थप सà¥à¤¥à¤¾à¤¨ पà¥à¤°à¤¦à¤¾à¤¯à¤• कमाणà¥à¤¡à¤¹à¤°à¥‚ समà¥à¤® पहà¥à¤à¤š पà¥à¤°à¥â€à¤¯à¤¾à¤‰à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—ले अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ यसले अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई सायद जीपीà¤à¤¸à¤•ो वा अनà¥à¤¯ सà¥à¤¥à¤¾à¤¨ सेवाहरूको कारà¥à¤¯ सà¤à¤— हसà¥à¤¤à¤•à¥à¤·à¥‡à¤ª गरà¥à¤¨à¤•ो लागि यसलाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_installLocationProvider" msgid="6578101199825193873">"à¤à¤‰à¤Ÿà¤¾ सà¥à¤¥à¤¾à¤¨ पà¥à¤°à¤¦à¤¾à¤¤à¤¾ सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿"</string>
+ <string name="permdesc_installLocationProvider" msgid="9066146120470591509">"परीकà¥à¤·à¤£à¤•ो लागि मक सà¥à¤¥à¤¾à¤¨ सà¥à¤°à¥‹à¤¤à¤¹à¤°à¥‚ सिरà¥à¤œà¤¨à¤¾ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ वा नयाठसà¥à¤¥à¤¾à¤¨ पà¥à¤°à¤¦à¤¾à¤¯à¤• सà¥à¤¥à¤¾à¤ªà¤¨à¤¾ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤ यसले अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई सà¥à¤¥à¤¾à¤¨à¤®à¤¾ ओभरराइड गरà¥à¤¦à¤› र/वा सà¥à¤¥à¤¿à¤¤à¤¿ अनà¥à¤¯ सà¥à¤¥à¤¾à¤¨ सà¥à¤°à¥‹à¤¤à¤¹à¤°à¥‚ जसà¥à¤¤à¥ˆ GPS वा सà¥à¤¥à¤¾à¤¨ पà¥à¤°à¤¦à¤¾à¤¯à¤•बाट फरà¥à¤•ाइà¤à¤•ा।"</string>
+ <string name="permlab_accessFineLocation" msgid="1191898061965273372">"सटिक सà¥à¤¥à¤¾à¤¨ (GPS र नेटवरà¥à¤• आधारित)"</string>
+ <string name="permdesc_accessFineLocation" msgid="5295047563564981250">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—ले विशà¥à¤µà¤µà¥à¤¯à¤¾à¤ªà¥€ सà¥à¤¥à¤¾à¤¨ पà¥à¤°à¤£à¤¾à¤²à¥€ (GPS) वा सेल टावरहरू र वाइ-फाइ जसà¥à¤¤à¤¾ नेटवरà¥à¤• सà¥à¤¥à¤¾à¤¨ सà¥à¤°à¥‹à¤¤à¤¹à¤°à¥‚को पà¥à¤°à¤¯à¥‹à¤— गरेर तपाईà¤à¤•ो सही सà¥à¤¥à¤¾à¤¨ पà¥à¤°à¤¾à¤ªà¥à¤¤ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ यी सà¥à¤¥à¤¾à¤¨ सेवाहरू खोलà¥à¤¨à¥ परà¥à¤› र अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूका लागि पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨ तपाईà¤à¤•ो उपकरणमा उपलबà¥à¤§ हà¥à¤¨à¥ परà¥à¤›à¥¤ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूले तपाईठकहाठहà¥à¤¨à¥ हà¥à¤¨à¥à¤› भनà¥à¤¨à¥‡ निरà¥à¤§à¤¾à¤°à¤£ गरà¥à¤¨ यसलाई पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨ सकà¥à¤› र यसले अतिरिकà¥à¤¤ बà¥à¤¯à¤¾à¤Ÿà¥à¤°à¤¿ उरà¥à¤œà¤¾ खतप गरà¥à¤¨ सकà¥à¤›à¥¤"</string>
+ <string name="permlab_accessCoarseLocation" msgid="4887895362354239628">"अनà¥à¤®à¤¾à¤¨à¤¿à¤¤ सà¥à¤¥à¤¾à¤¨ (नेटवरà¥à¤•-आधारित)"</string>
+ <string name="permdesc_accessCoarseLocation" msgid="2538200184373302295">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई तपाईà¤à¤•ो अनà¥à¤®à¤¾à¤¨à¤¿à¤¤ सà¥à¤¥à¤¾à¤¨ पà¥à¤°à¤¾à¤ªà¥à¤¤ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ यो सà¥à¤¥à¤¾à¤¨ सेल टावर र वाइ-फाइजसà¥à¤¤à¤¾ नेटवरà¥à¤• सà¥à¤¥à¤¾à¤¨ सà¥à¤°à¥‹à¤¤à¤¹à¤°à¥‚को पà¥à¤°à¥‹à¤— गरी सà¥à¤¥à¤¾à¤¨ सेवाहरूबाट उतà¥à¤ªà¤¨à¥à¤¨ गरिà¤à¤•ो हो। अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—ले यी सà¥à¤¥à¤¾à¤¨ सेवाहरूको उपयोग गरà¥à¤¨à¤•ो लागि यी सेवाहरू तपाईà¤à¤•ो उपकरणमा चालॠर उपलबà¥à¤§ हà¥à¤¨à¥ आवशà¥à¤¯à¤• छ। अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूले अनà¥à¤®à¤¾à¤¨à¤¿à¤¤ रूपमा तपाईठकहाठहà¥à¤¨à¥à¤¹à¥à¤¨à¥à¤› भनà¥à¤¨à¥‡ निरà¥à¤§à¤¾à¤°à¤£ गरà¥à¤¨ यसको पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨ सकà¥à¤›à¤¨à¥à¥¤"</string>
+ <string name="permlab_accessSurfaceFlinger" msgid="2363969641792388947">"SurfaceFlinger पहà¥à¤à¤š गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="permdesc_accessSurfaceFlinger" msgid="1041619516733293551">"SurfaceFlinger कम-सà¥à¤¤à¤° सà¥à¤µà¤¿à¤§à¤¾à¤¹à¤°à¥‚ पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_readFrameBuffer" msgid="6690504248178498136">"फà¥à¤°à¥‡à¤® बफर पढà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_readFrameBuffer" msgid="4937405521809454680">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई फà¥à¤°à¥‡à¤® बफरको सामगà¥à¤°à¥€ पढà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_accessInputFlinger" msgid="5348635270689553857">"InputFlinger को पहà¥à¤à¤š गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_accessInputFlinger" msgid="2104864941201226616">"InputFlinger को कम-सà¥à¤¤à¤° सà¥à¤µà¤¿à¤§à¤¾à¤¹à¤°à¥‚ पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"वाइफाइ पà¥à¤°à¤¦à¤°à¥à¤¶à¤¨à¤¹à¤°à¥‚लाई विनà¥à¤¯à¤¾à¤¸ गरà¥à¤¨à¥à¤¹à¥‹à¤¸"</string>
+ <string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई कनà¥à¤«à¤¿à¤—र गरà¥à¤¨ र वाइफाइ पà¥à¤°à¤¦à¤°à¥à¤¶à¤¨à¤¹à¤°à¥‚सà¤à¤— जोडà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_controlWifiDisplay" msgid="393641276723695496">"वाइफाइ पà¥à¤°à¤¦à¤°à¥à¤¶à¤¨à¤¹à¤°à¥‚ नियनà¥à¤¤à¥à¤°à¤£ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_controlWifiDisplay" msgid="4543912292681826986">"वाइफाइ पà¥à¤°à¤¦à¤°à¥à¤¶à¤¨à¥€à¤•ा तलà¥à¤²à¥‹ तह विषेशताहरू नियनà¥à¤¤à¥à¤°à¤£ गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_captureAudioOutput" msgid="6857134498402346708">"अडियो आउटपà¥à¤Ÿ कैद गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_captureAudioOutput" msgid="6210597754212208853">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अडियो आउटपà¥à¤Ÿ कैद गरà¥à¤¨ र रिडाइरेकà¥à¤Ÿ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_captureVideoOutput" msgid="2246828773589094023">"भिडियो आउटपà¥à¤Ÿ कैद गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_captureVideoOutput" msgid="359481658034149860">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई भिडियो आउटपà¥à¤Ÿ कैद गरà¥à¤¨ र रिडाइरेकà¥à¤Ÿ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_captureSecureVideoOutput" msgid="7815398969303382016">"सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ भिडियो आउटपà¥à¤Ÿ कैद गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_captureSecureVideoOutput" msgid="2779793064709350289">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ भिडियो आउटपà¥à¤Ÿ कैद गरà¥à¤¨ र रिडाइरेकà¥à¤Ÿ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"तपाईà¤à¤•ा अडियो सेटिङहरू परिवरà¥à¤¤à¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई गà¥à¤²à¥‹à¤¬à¤² अडियो सेटिङà¥à¤¹à¤°à¥‚ परिमारà¥à¤œà¤¨ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›, जसà¥à¤¤à¥ˆ आवाजको मातà¥à¤°à¤¾ र आउटपà¥à¤Ÿà¤•ो लागि कà¥à¤¨ सà¥à¤ªà¤¿à¤•र पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨à¥‡à¥¤"</string>
+ <string name="permlab_recordAudio" msgid="3876049771427466323">"अडियो रेकरà¥à¤¡ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_recordAudio" msgid="4906839301087980680">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई माइकà¥à¤°à¥‹à¤«à¥‹à¤¨à¤•ो साथ अडियो रेकरà¥à¤¡ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ यस अनà¥à¤®à¤¤à¤¿à¤²à¥‡ तपाईंको पà¥à¤·à¥à¤Ÿà¤¿à¤•रण बिना कà¥à¤¨à¥ˆ पनि समयमा अडियो रेकरà¥à¤¡ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_camera" msgid="3616391919559751192">"तसà¥à¤¬à¤¿à¤°à¤¹à¤°à¥‚ र भिडियोहरू लिनà¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="permdesc_camera" msgid="8497216524735535009">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई कà¥à¤¯à¤¾à¤®à¥‡à¤°à¤¾à¤¸à¤à¤— तसà¥à¤¬à¤¿à¤° र भिडियोहरू लिन अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ यस अनà¥à¤®à¤¤à¤¿à¤²à¥‡ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई तपाईंको पà¥à¤·à¥à¤Ÿà¤¿à¤•रण बिना कà¥à¤¨à¥ˆ पनि समयमा कà¥à¤¯à¤¾à¤®à¥‡à¤°à¤¾ पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨ सà¥à¤µà¥€à¤•ृति दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_cameraDisableTransmitLed" msgid="2651072630501126222">"कà¥à¤¯à¤¾à¤®à¥‡à¤°à¤¾ पà¥à¤°à¤¯à¥‹à¤—मा हà¥à¤à¤¦à¤¾ सूचक LED पà¥à¤°à¤¸à¤¾à¤°à¤£ असकà¥à¤·à¤® गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_cameraDisableTransmitLed" msgid="4764585465480295341">"पूरà¥à¤µ-सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ पà¥à¤°à¤£à¤¾à¤²à¥€ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई कà¥à¤¯à¤¾à¤®à¥‡à¤°à¤¾ उपयोग सूचक LED अकà¥à¤·à¤® गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"सà¥à¤¥à¤¾à¤¯à¥€ रूपमा टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿ अकà¥à¤·à¤® पारà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permlab_brick" product="default" msgid="8337817093326370537">"फोनलाई सà¥à¤¥à¤¾à¤¯à¥€ रूपमा असकà¥à¤·à¤® पारà¥à¤¨à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"पà¥à¤°à¥ˆ टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿà¤²à¤¾à¤ˆ सà¥à¤¥à¤¾à¤¯à¥€ रूपमा असकà¥à¤·à¤® पारà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ यो निकै खतरनाक हà¥à¤¨à¥à¤›à¥¤"</string>
+ <string name="permdesc_brick" product="default" msgid="5788903297627283099">"समà¥à¤ªà¥‚रà¥à¤£ फोनलाई सà¥à¤¥à¤¾à¤¯à¥€ रूपमा असकà¥à¤·à¤® पारà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ यो धेरै खतरनाक हà¥à¤¨à¥à¤›à¥¤"</string>
+ <string name="permlab_reboot" product="tablet" msgid="3436634972561795002">"टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿ पà¥à¤¨à¤ƒà¤¬à¥à¤Ÿ गरà¥à¤¨ जोड गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permlab_reboot" product="default" msgid="2898560872462638242">"फोन पà¥à¤¨à¤ƒà¤¬à¥à¤Ÿ गरà¥à¤¨à¥ जोड गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_reboot" product="tablet" msgid="8172056180063700741">"टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿà¤²à¤¾à¤ˆ बलपूरà¥à¤µà¤• पà¥à¤¨à¤ƒà¤¬à¥à¤Ÿ गरà¥à¤¨à¤•ो लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permdesc_reboot" product="default" msgid="5326008124289989969">"फोनलाई बलपà¥à¤°à¥à¤µà¤• पà¥à¤¨à¤ƒà¤¬à¥à¤Ÿ गरà¥à¤¨à¤•ो लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_mount_unmount_filesystems" product="nosdcard" msgid="2927361537942591841">"USB भणà¥à¤¡à¤¾à¤°à¤£ फाइल पà¥à¤°à¤£à¤¾à¤²à¥€ पहà¥à¤à¤š गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permlab_mount_unmount_filesystems" product="default" msgid="4402305049890953810">"SD कारà¥à¤¡ फाइल पà¥à¤°à¤£à¤¾à¤²à¥€ पहà¥à¤à¤š गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_mount_unmount_filesystems" msgid="1829290701658992347">"हटाउन मिलà¥à¤¨à¥‡ भणà¥à¤¡à¤¾à¤°à¤£à¤•ो लागि फाइल पà¥à¤°à¤£à¤¾à¤²à¥€à¤¹à¤°à¥‚ माउनà¥à¤Ÿ र अनमाउनà¥à¤Ÿ गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_mount_format_filesystems" product="nosdcard" msgid="6227819582624904972">"USB भणà¥à¤¡à¤¾à¤°à¤£ मेटà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permlab_mount_format_filesystems" product="default" msgid="262582698639274056">"SD कारà¥à¤¡ मेटाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_mount_format_filesystems" msgid="8784268246779198627">"हटाउन मिलà¥à¤¨à¥‡ भणà¥à¤¡à¤¾à¤°à¤£ फरà¥à¤®à¥à¤¯à¤¾à¤Ÿ गरà¥à¤¨à¤•ो लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_asec_access" msgid="3411338632002193846">"आनà¥à¤¤à¤°à¤¿à¤• भणà¥à¤¡à¤¾à¤°à¤£à¤•ो सूचना पà¥à¤°à¤¾à¤ªà¥à¤¤ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_asec_access" msgid="3094563844593878548">"आनà¥à¤¤à¤°à¤¿à¤• भणà¥à¤¡à¤¾à¤°à¤£à¤®à¤¾ सूचना पà¥à¤°à¤¾à¤ªà¥à¤¤ गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_asec_create" msgid="6414757234789336327">"आनà¥à¤¤à¤°à¤¿à¤• भणà¥à¤¡à¤¾à¤°à¤£ सिरà¥à¤œà¤¨à¤¾ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_asec_create" msgid="4558869273585856876">"आनà¥à¤¤à¤°à¤¿à¤• भणà¥à¤¡à¤¾à¤°à¤£ सिरà¥à¤œà¤¨à¤¾ गरà¥à¤¨à¤•ो लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—ले अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_asec_destroy" msgid="526928328301618022">"आनà¥à¤¤à¤°à¤¿à¤• भणà¥à¤¡à¤¾à¤°à¤£ धà¥à¤µà¤¸à¥à¤¤ पारà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_asec_destroy" msgid="7218749286145526537">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई आनà¥à¤¤à¤°à¤¿à¤• भणà¥à¤¡à¤¾à¤°à¤£ धà¥à¤µà¤¸à¥à¤¤ पारà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_asec_mount_unmount" msgid="8877998101944999386">"आनà¥à¤¤à¤°à¤¿à¤• भणà¥à¤¡à¤¾à¤°à¤£à¤²à¤¾à¤ˆ माउनà¥à¤Ÿ/अनमाउनà¥à¤Ÿ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_asec_mount_unmount" msgid="3451360114902490929">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई आनà¥à¤¤à¤°à¤¿à¤• भणà¥à¤¡à¤¾à¤°à¤£ माउनà¥à¤Ÿ/अनमाउनà¥à¤Ÿ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_asec_rename" msgid="7496633954080472417">"आनà¥à¤¤à¤°à¤¿à¤• भणà¥à¤¡à¤¾à¤°à¤£à¤•ो पà¥à¤¨:नामाकरण गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_asec_rename" msgid="1794757588472127675">"आनà¥à¤¤à¤°à¥€à¤• भणà¥à¤¡à¤¾à¤°à¤£à¤•ो पà¥à¤¨à¤¨à¤¾à¤®à¤¾à¤•रण गरà¥à¤¨à¤•ो लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—ले अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_vibrate" msgid="7696427026057705834">"कमà¥à¤ªà¤¨ नियनà¥à¤¤à¥à¤°à¤£ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_vibrate" msgid="6284989245902300945">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई भाइबà¥à¤°à¥‡à¤Ÿà¤° नियनà¥à¤¤à¥à¤°à¤£ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_flashlight" msgid="2155920810121984215">"फà¥à¤²à¥à¤¯à¤¾à¤¸à¤²à¤¾à¤ˆà¤Ÿ नियनà¥à¤¤à¥à¤°à¤£ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_flashlight" msgid="6522284794568368310">"फà¥à¤²à¥à¤¯à¤¾à¤¸ पà¥à¤°à¤•ाशलाई नियनà¥à¤¤à¥à¤°à¤£ गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_manageUsb" msgid="1113453430645402723">"USB उपकरणहरूको लागि पà¥à¤°à¤¾à¤¥à¤®à¤¿à¤•ताहरू र अनà¥à¤®à¤¤à¤¿à¤¹à¤°à¥‚ पà¥à¤°à¤¬à¤¨à¥à¤§ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_manageUsb" msgid="7776155430218239833">"USB उपकरणहरूको लागि पà¥à¤°à¤¾à¤¥à¤®à¤¿à¤•ताहरू र अनà¥à¤®à¤¤à¤¿à¤¹à¤°à¥‚लाई वà¥à¤¯à¤µà¤¸à¥à¤¥à¤¾à¤ªà¤¨ गरà¥à¤¨à¤•ो लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_accessMtp" msgid="4953468676795917042">"MTP पà¥à¤°à¥‹à¤Ÿà¥‹à¤•ल कारà¥à¤¯à¤¾à¤¨à¥à¤µà¤¯à¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_accessMtp" msgid="6532961200486791570">"MTP USB पà¥à¤°à¥‹à¤Ÿà¥‹à¤•ल कारà¥à¤¯à¤¾à¤¨à¥à¤µà¤¯à¤¨ गरà¥à¤¨ केरà¥à¤¨à¤² MTP डà¥à¤°à¤¾à¤‡à¤­à¤°à¤•ो पहà¥à¤à¤šà¤•ो अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_hardware_test" msgid="4148290860400659146">"हारà¥à¤¡à¤µà¥‡à¤¯à¤° परीकà¥à¤·à¤£ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_hardware_test" msgid="6597964191208016605">"हारà¥à¤¡à¤µà¥‡à¤¯à¤° परीकà¥à¤·à¤£à¤•ो उदà¥à¤¦à¥‡à¤¶à¥à¤¯à¤•ा लागि विभिनà¥à¤¨ परिधीयहरूलाई नियनà¥à¤¤à¥à¤°à¤£ गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_callPhone" msgid="3925836347681847954">"फोन नमà¥à¤¬à¤°à¤¹à¤°à¥‚मा सिधै कल गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_callPhone" msgid="3740797576113760827">"तपाईà¤à¤•ो हसà¥à¤¤à¤•à¥à¤·à¥‡à¤ª बेगरै फोन नमà¥à¤¬à¤° कल गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ यसले अनपेकà¥à¤·à¤¿à¤¤ शà¥à¤²à¥à¤• वा कलहरू गराउन सकà¥à¤›à¥¤ यसले अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई आपतकालीन नमà¥à¤¬à¤°à¤¹à¤°à¥‚ कल गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिà¤à¤¦à¥ˆà¤¨ विचार गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤ खराब अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूले तपाईà¤à¤•ो सà¥à¤µà¥€à¤•ार बिना कलहरू गरेर तपाईà¤à¤²à¤¾à¤ˆ बढी पैसा तिराउन सकà¥à¤›à¥¤"</string>
+ <string name="permlab_callPrivileged" msgid="4198349211108497879">"कà¥à¤¨à¥ˆ पनि फोन नमà¥à¤¬à¤°à¤¹à¤°à¥‚ सिधै कल गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_callPrivileged" msgid="1689024901509996810">"कà¥à¤¨à¥ˆ पनि फोन नमà¥à¤¬à¤°à¤®à¤¾, आकसà¥à¤®à¤¿à¤• नमà¥à¤¬à¤° सहित, तपाईà¤à¤•ो हसà¥à¤¤à¤•à¥à¤·à¥‡à¤ª बिना कल गरà¥à¤¨à¤•ो लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ खराब अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूले अनावशà¥à¤¯à¤• र गैर कानà¥à¤¨à¥€ कलहरूलाई आकसà¥à¤®à¤¿à¤•मा सà¥à¤¥à¤¾à¤¨à¤¾à¤¨à¥à¤¤à¤°à¤£ गरà¥à¤¨ सकà¥à¤›à¤¨à¥à¥¤"</string>
+ <string name="permlab_performCdmaProvisioning" product="tablet" msgid="4842576994144604821">"CDMA टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿ सेटअफ सिधै सà¥à¤°à¥ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permlab_performCdmaProvisioning" product="default" msgid="5604848095315421425">"CDMA फोन सेटअप सिधै सà¥à¤°à¥ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_performCdmaProvisioning" msgid="1994193538802314186">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई CDMA पà¥à¤°à¤¾à¤µà¤§à¤¾à¤¨ सà¥à¤°u गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ खराब अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूले अनावशà¥à¤¯à¤• रूपमा CDMA पà¥à¤°à¤¾à¤µà¤§à¤¾à¤¨ सà¥à¤°à¥ गरà¥à¤¨ सकà¥à¤›à¤¨à¥à¥¤"</string>
+ <string name="permlab_locationUpdates" msgid="7785408253364335740">"सà¥à¤¥à¤¾à¤¨ अपडेट सूचनाहरू नियनà¥à¤¤à¥à¤°à¤£ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_locationUpdates" msgid="1120741557891438876">"रेडियोबाट सà¥à¤¥à¤¾à¤¨ अदà¥à¤¯à¤¾à¤µà¤§à¤¿à¤• सूचनाहरूलाई सकà¥à¤·à¤®/असकà¥à¤·à¤® गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ सामानà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूबाट पà¥à¤°à¤¯à¥‹à¤— नहà¥à¤¨à¥‡à¥¤"</string>
+ <string name="permlab_checkinProperties" msgid="7855259461268734914">"परीकà¥à¤·à¤£ विशेषताहरू पहà¥à¤à¤š गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_checkinProperties" msgid="4024526968630194128">"परीकà¥à¤·à¤£ सेवादà¥à¤µà¤¾à¤°à¤¾ विशेषता अपलोड भà¤à¤•ो पहà¥à¤à¤š पढà¥à¤¨/लेखà¥â€à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ साधारण अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—दà¥à¤µà¤¾à¤°à¤¾ पà¥à¤°à¤¯à¥‹à¤—को लागि होइन।"</string>
+ <string name="permlab_bindGadget" msgid="776905339015863471">"विजेटहरूको चयन गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_bindGadget" msgid="8261326938599049290">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई पà¥à¤°à¤£à¤¾à¤²à¥€à¤²à¤¾à¤ˆ कà¥à¤¨ विजेट कà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—दà¥à¤µà¤¾à¤°à¤¾ पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨ सकिनà¥à¤› भनेर अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ यस अनà¥à¤®à¤¤à¤¿à¤¸à¤¹à¤¿à¤¤à¤•ो अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—ले अनà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूलाई वà¥à¤¯à¤•à¥à¤¤à¤¿à¤—त डेटाको पहà¥à¤à¤š दिन सकà¥à¤¦à¤›à¥¤ सामानà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूको पà¥à¤°à¤¯à¥‹à¤—को लागि होइन।"</string>
+ <string name="permlab_modifyPhoneState" msgid="8423923777659292228">"फोनको सà¥à¤¥à¤¿à¤¤à¤¿ परिमारà¥à¤œà¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_modifyPhoneState" msgid="1029877529007686732">"उपकरणका फोन विशेषताहरूलाई नियनà¥à¤¤à¥à¤°à¤£ गरà¥à¤¨à¤•ो लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ यस अनà¥à¤®à¤¤à¤¿à¤²à¥‡ à¤à¤‰à¤Ÿà¤¾ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—ले नेटवरà¥à¤• सà¥à¤µà¤¿à¤š गरà¥à¤¨, फोन रेडियो बनà¥à¤¦ गरà¥à¤¨ र खोलà¥à¤¨ र जसà¥à¤¤à¥ˆ तपाईठसधै सूचित नगरी गरà¥à¤¨ सकà¥à¤›à¥¤"</string>
+ <string name="permlab_readPhoneState" msgid="9178228524507610486">"फोन सà¥à¤¥à¤¿à¤¤à¤¿ र पहिचान पढà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_readPhoneState" msgid="1639212771826125528">"उपकरणको फोन विशेषताहरूको पहà¥à¤à¤š गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ यस अनà¥à¤®à¤¤à¤¿à¤²à¥‡ फोन नमà¥à¤¬à¤° र उपकरणको IDs, कल सकà¥à¤·à¤® छ कि छैन र कलदà¥à¤µà¤¾à¤°à¤¾ जोडिà¤à¤•ो टाढाको नमà¥à¤¬à¤° निरà¥à¤§à¤¾à¤°à¤£ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿà¤²à¤¾à¤ˆ निनà¥à¤¦à¥à¤°à¤¾à¤®à¤¾ जानबाट रोकà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permlab_wakeLock" product="default" msgid="573480187941496130">"फोनलाई निदाउनबाट रोकà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_wakeLock" product="tablet" msgid="7311319824400447868">"टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿà¤²à¤¾à¤ˆ निसà¥à¤•à¥à¤°à¤¿à¤¯ हà¥à¤¨à¤¬à¤¾à¤Ÿ रोकà¥à¤¨à¤•ो लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permdesc_wakeLock" product="default" msgid="8559100677372928754">"फोनलाई निसà¥à¤•à¥à¤°à¤¿à¤¯ हà¥à¤¨à¤¬à¤¾à¤Ÿ रोकà¥à¤¨à¤•ो लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_devicePower" product="tablet" msgid="2787034722616350417">"टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿ पावर खोलà¥à¤¨ र बनà¥à¤¦ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permlab_devicePower" product="default" msgid="4928622470980943206">"फोन खोलà¥à¤¨ वा बनà¥à¤¦ गरà¥à¤¨ उरà¥à¤œà¤¾ पà¥à¤°à¤¦à¤¾à¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸"</string>
+ <string name="permdesc_devicePower" product="tablet" msgid="6689862878984631831">"टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿà¤²à¤¾à¤ˆ खोलà¥à¤¨ र बनà¥à¤¦ गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permdesc_devicePower" product="default" msgid="6037057348463131032">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई फोन खोलà¥à¤¨ र बनà¥à¤¦ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_factoryTest" msgid="3715225492696416187">"फà¥à¤¯à¤¾à¤•à¥à¤Ÿà¥à¤°à¤¿ परीकà¥à¤·à¤£ मोडमा चालॠगरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_factoryTest" product="tablet" msgid="3952059318359653091">"टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿ हारà¥à¤¡à¤µà¥‡à¤¯à¤°à¤²à¤¾à¤ˆ पà¥à¤°à¤¾ पहà¥à¤à¤š गरà¥à¤¨ दिà¤à¤¦à¥ˆ तलà¥à¤²à¥‹ सà¥à¤¤à¤° उतà¥à¤¤à¥à¤ªà¤¾à¤¦à¤• परीकà¥à¤·à¤£à¤•ो रूपमा चलाउनà¥à¤¹à¥‹à¤¸à¥à¥¤ टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿ उतà¥à¤¤à¥à¤ªà¤¾à¤¦à¤• परीकà¥à¤·à¤£ मोडमा चलिरहेको बेला मातà¥à¤° उपलबà¥à¤§ हà¥à¤¨à¥à¤›à¥¤"</string>
+ <string name="permdesc_factoryTest" product="default" msgid="8136644990319244802">"तलà¥à¤²à¥‹ सà¥à¤¤à¤° उतà¥à¤¤à¥à¤ªà¤¾à¤¦à¤• जसà¥à¤¤à¥ˆ चलाउनà¥à¤¹à¥‹à¤¸à¥, पà¥à¤°à¤¾ पहà¥à¤à¤š दिन फोन हारà¥à¤¡à¤µà¥‡à¤¯à¤°à¤²à¤¾à¤ˆ अनà¥à¤®à¤¤à¤¿ हà¥à¤¨à¥à¤›à¥¤ फोन उतà¥à¤ªà¤¾à¤¦à¤• परीकà¥à¤·à¤£ मोडमा चलिरहेको बेला मातà¥à¤° उपलबà¥à¤§ हà¥à¤¨à¥à¤›à¥¤"</string>
+ <string name="permlab_setWallpaper" msgid="6627192333373465143">"वालपेपर सेट गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_setWallpaper" msgid="7373447920977624745">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई पà¥à¤°à¤£à¤¾à¤²à¥€ वालपेपर सेट गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_setWallpaperHints" msgid="3278608165977736538">"तपाईंको वालपेपर आकार समायोजन गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_setWallpaperHints" msgid="8235784384223730091">"पà¥à¤°à¤£à¤¾à¤²à¥€ वालपेपरको आकार सङà¥à¤•ेतहरू मिलाउन अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_masterClear" msgid="2315750423139697397">"कारà¥à¤¯à¤¶à¤¾à¤²à¤¾ पूरà¥à¤µà¤¨à¤¿à¤°à¥à¤§à¤¾à¤°à¤£à¤•ो लागि पà¥à¤°à¤£à¤¾à¤²à¥€ पà¥à¤¨à¤ƒà¤¸à¥‡à¤Ÿ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_masterClear" msgid="3665380492633910226">"यसका फà¥à¤¯à¤¾à¤•à¥à¤Ÿà¥à¤°à¤¿ सेटिङहरू, कनà¥à¤«à¤¿à¤—रेसन र सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूलाई पà¥à¤°à¤£à¤¾à¤²à¥€à¤®à¤¾ पà¥à¤°à¥ˆ पà¥à¤¨à¤ƒà¤¸à¥‡à¤Ÿ गरà¥à¤¨à¤•ो लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_setTime" msgid="2021614829591775646">"समय सेट गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_setTime" product="tablet" msgid="1896341438151152881">"टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿà¤•ो घडीको समय बदलà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permdesc_setTime" product="default" msgid="1855702730738020">"फोनको घडीको समय बदलà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_setTimeZone" msgid="2945079801013077340">"समय कà¥à¤·à¥‡à¤¤à¥à¤° सेट गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_setTimeZone" product="tablet" msgid="1676983712315827645">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿà¤•ो समय कà¥à¤·à¥‡à¤¤à¥à¤° परिवरà¥à¤¤à¤¨ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permdesc_setTimeZone" product="default" msgid="4499943488436633398">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई फोनको समय कà¥à¤·à¥‡à¤¤à¥à¤° परिवरà¥à¤¤à¤¨ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_accountManagerService" msgid="4829262349691386986">"AccountManagerService को रूपमा कारà¥à¤¯ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_accountManagerService" msgid="1948455552333615954">"खाता अधिकारीहरूलाई कल गरà¥à¤¨à¤•ो लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—ले अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_getAccounts" msgid="1086795467760122114">"उपकरणमा खाताहरू भेटà¥à¤Ÿà¤¾à¤‰à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_getAccounts" product="tablet" msgid="2741496534769660027">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿà¤¦à¥à¤µà¤¾à¤°à¤¾ जà¥à¤žà¤¾à¤¤ खाताहरूको सूची पाउन अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ यसले अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—दà¥à¤µà¤¾à¤°à¤¾ तपाईंले सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ गरà¥à¤¨à¥à¤­à¤à¤•ो कà¥à¤¨à¥ˆ पनि खाताहरू समावेश गरà¥à¤¨ सकà¥à¤¦à¤›à¥¤"</string>
+ <string name="permdesc_getAccounts" product="default" msgid="3448316822451807382">"फोनलाई थाहा भà¤à¤•ा खाताहरूको सूची पà¥à¤°à¤¾à¤ªà¥à¤¤ गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ यसले तपाईà¤à¤²à¥‡ सà¥à¤¥à¤¾à¤ªà¤¨à¤¾ गरà¥à¤¨à¥ भà¤à¤•ा अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूबाट सृजित कà¥à¤¨à¥ˆ खाताहरू समावेश हà¥à¤¨ सकà¥à¤›à¥¤"</string>
+ <string name="permlab_authenticateAccounts" msgid="5265908481172736933">"खाता सिरà¥à¤œà¤¨à¤¾ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ र पासवरà¥à¤¡ सेट गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_authenticateAccounts" msgid="5472124296908977260">"खाताहरूको सिरà¥à¤œà¤¨à¤¾ गरà¥à¤¨à¥‡ र पà¥à¤°à¤¾à¤ªà¥à¤¤ गरà¥à¤¨à¥‡ र उनीहरूको पासवरà¥à¤¡à¤¹à¤°à¥‚को सेटिङ गरà¥à¤¨à¥‡ सहित खाता पà¥à¤°à¤¬à¤¨à¥à¤§à¤•को खाता आधिकारी सकà¥à¤·à¤®à¤¤à¤¾à¤¹à¤°à¥‚ पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_manageAccounts" msgid="4983126304757177305">"खाताहरू थपà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ वा हटाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_manageAccounts" msgid="8698295625488292506">"खाताहरू थपà¥à¤¨à¥‡ र हटाउने जसà¥à¤¤à¤¾ पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾à¤¹à¤°à¥‚ समà¥à¤ªà¤¨à¥à¤¨ गरà¥à¤¨, र उनीहरूको पासवरà¥à¤¡ मेटाउन अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_useCredentials" msgid="235481396163877642">"उपकरणमा खाताहरूको पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_useCredentials" msgid="7984227147403346422">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई पà¥à¤°à¤®à¤¾à¤£à¥€à¤•रण टोकनहरू अनà¥à¤°à¥‹à¤§ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_accessNetworkState" msgid="4951027964348974773">"नेटवरà¥à¤• जडानहरू हेरà¥à¤¨à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_accessNetworkState" msgid="8318964424675960975">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई नेटवरà¥à¤• जडानहरू जसà¥à¤¤à¥ˆ कà¥à¤¨ नेटवरà¥à¤•हरू अवसà¥à¤¥à¤¿à¤¤ हà¥à¤¨à¥à¤›à¤¨à¥ र जडित छनॠजसले हेरà¥à¤¨à¤²à¤¾à¤ˆ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_createNetworkSockets" msgid="8018758136404323658">"पूरà¥à¤£ नेटवरà¥à¤• पहà¥à¤à¤š"</string>
+ <string name="permdesc_createNetworkSockets" msgid="3403062187779724185">"नेटवरà¥à¤• सकेटहरू सिरà¥à¤œà¤¨à¤¾ गरà¥à¤¨ र कसà¥à¤Ÿà¤® नेटवरà¥à¤• पà¥à¤°à¥‹à¤Ÿà¥‹à¤•ल पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ बà¥à¤°à¤¾à¤‰à¤œà¤° र अनà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूले इनà¥à¤Ÿà¤°à¤¨à¥‡à¤Ÿà¤®à¤¾ डेटा पठाउने माधà¥à¤¯à¤® पà¥à¤°à¤¦à¤¾à¤¨ गरà¥à¤›à¤¨à¥, तà¥à¤¯à¤¸à¥ˆà¤²à¥‡ इनà¥à¤Ÿà¤°à¤¨à¥‡à¤Ÿà¤®à¤¾ डेटा पठाउन यो अनà¥à¤®à¤¤à¤¿à¤•ो आवशà¥à¤¯à¤•ता परà¥à¤¦à¥ˆà¤¨à¥¤"</string>
+ <string name="permlab_writeApnSettings" msgid="505660159675751896">"नेटवरà¥à¤• सेटिङहरू र टà¥à¤°à¤¾à¤«à¤¿à¤• परिवरà¥à¤¤à¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ / रोकà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_writeApnSettings" msgid="5333798886412714193">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई नेटवरà¥à¤• सेटिङहरू परिवरà¥à¤¤à¤¨ गरà¥à¤¨ र सबै नेटवरà¥à¤• टà¥à¤°à¤¾à¤«à¤¿à¤• रोकà¥à¤¨ र परीकà¥à¤·à¤£ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›, उदाहरणको लागि कà¥à¤¨à¥ˆ पनि APN को पà¥à¤°à¥‹à¤•à¥à¤¸à¥€ र पोरà¥à¤Ÿ परिवरà¥à¤¤à¤¨ गरà¥à¤¨à¥¤ खराब अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूले तपाईंको जà¥à¤žà¤¾à¤¨ बिना नेटवरà¥à¤• पà¥à¤¯à¤¾à¤•ेटहरू मोनिटर गरà¥à¤¨, पà¥à¤¨:निरà¥à¤¦à¥‡à¤¶à¤¿à¤¤ गरà¥à¤¨, वा परिमारà¥à¤œà¤¨ गरà¥à¤¨ सकà¥à¤¦à¤›à¥¤"</string>
+ <string name="permlab_changeNetworkState" msgid="958884291454327309">"नेटवरà¥à¤• जडान परिवरà¥à¤¤à¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_changeNetworkState" msgid="6789123912476416214">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई नेटवरà¥à¤• जडानको सà¥à¤¥à¤¿à¤¤à¤¿ परिवरà¥à¤¤à¤¨ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_changeTetherState" msgid="5952584964373017960">"टेथरà¥à¤¡ नेटवरà¥à¤• जडान परिवरà¥à¤¤à¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_changeTetherState" msgid="1524441344412319780">"टिथर गरेको नेटवरà¥à¤• जडानको सà¥à¤¥à¤¿à¤¤à¤¿ बदलà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_changeBackgroundDataSetting" msgid="1400666012671648741">"पृषà¥à¤ à¤­à¥‚मि डेटा पà¥à¤°à¤¯à¥‹à¤— सेटिङहरू परिवरà¥à¤¤à¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_changeBackgroundDataSetting" msgid="5347729578468744379">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई पृषà¥à¤ à¤­à¥‚मि डेटा उपयोग सेटिङ परिवरà¥à¤¤à¤¨ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_accessWifiState" msgid="5202012949247040011">"वाइ-फाइ जडानहरू हेरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_accessWifiState" msgid="5002798077387803726">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई वाइ-फाइ नेटवरà¥à¤•को बारेमा जानकारी हेरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›, जसà¥à¤¤à¥ˆ कि वाइ-फाइ सकà¥à¤·à¤® छ कि छैन र जडान गरिà¤à¤•ो वाइ-फाइ उपकरणहरूको नाम।"</string>
+ <string name="permlab_changeWifiState" msgid="6550641188749128035">"वाइ-फाइसà¤à¤— जोडà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ वा छà¥à¤Ÿà¤¾à¤‰à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_changeWifiState" msgid="7137950297386127533">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई वाइ-फाइ पहà¥à¤à¤š बिनà¥à¤¦à¥à¤¬à¤¾à¤Ÿ जडान गरà¥à¤¨ र विचà¥à¤›à¥‡à¤¦à¤¨ गरà¥à¤¨ र वाइ-फाइ नेटवरà¥à¤•हरूको लागि उपकरण कनà¥à¤«à¤¿à¤—रेसनमा परिवरà¥à¤¤à¤¨à¤¹à¤°à¥‚ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_changeWifiMulticastState" msgid="1368253871483254784">"वाइ-फाइ Multicast सà¥à¤µà¤¿à¤•ृतिलाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_changeWifiMulticastState" product="tablet" msgid="7969774021256336548">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई मलà¥à¤Ÿà¤¿à¤•ाषà¥à¤Ÿ ठेगानाहरू पà¥à¤°à¤¯à¥‹à¤— गरेर वाइ-फाइ नेटवरà¥à¤•मा पठाइà¤à¤•ो पà¥à¤¯à¤¾à¤•ेटहरू पà¥à¤°à¤¾à¤ªà¥à¤¤ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›, केवल तपाईंको टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿ मातà¥à¤° होइन। यसले गैर-मलà¥à¤Ÿà¤¿à¤•ाषà¥à¤Ÿ मोड भनà¥à¤¦à¤¾ बढी उरà¥à¤œà¤¾ पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¦à¤›à¥¤"</string>
+ <string name="permdesc_changeWifiMulticastState" product="default" msgid="6851949706025349926">"तपाईà¤à¤•ो फोन मातà¥à¤° होइन, मलà¥à¤Ÿà¤¿à¤•ासà¥à¤Ÿ ठेगानाहरूको पà¥à¤°à¤¯à¥‹à¤— गरे वाइ-फाइ नेटवरà¥à¤•का सबै उपकरणहरूमा पठाइà¤à¤•ा पà¥à¤¯à¤¾à¤•ेटहरू पà¥à¤°à¤¾à¤ªà¥à¤¤ गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ यसले गैर-मलà¥à¤Ÿà¤¿à¤•ासà¥à¤Ÿ मोडभनà¥à¤¦à¤¾ बढी उरà¥à¤œà¤¾ पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤›à¥¤"</string>
+ <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"बà¥à¤²à¥à¤Ÿà¥à¤¥ सेटिङहरूमा पहà¥à¤à¤š गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"सà¥à¤¥à¤¾à¤¨à¥€à¤¯ बà¥à¤²à¥à¤Ÿà¥à¤¥ टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿà¤²à¤¾à¤ˆ कनà¥à¤«à¤¿à¤—र गरà¥à¤¨à¤•ो लागि र टाढाका उपकरणहरूलाई पतà¥à¤¤à¤¾ लगाउन र जोडà¥à¤¨à¤•ो लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई सà¥à¤¥à¤¾à¤¨à¥€à¤¯ बà¥à¤²à¥à¤Ÿà¥à¤¥ फोन कनà¥à¤«à¤¿à¤—र गरà¥à¤¨ र टाढाका उपकरणहरूसà¤à¤— खोज गरà¥à¤¨ र जोडी गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_accessWimaxState" msgid="4195907010610205703">"WiMAXसà¤à¤— जोडà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ वा छà¥à¤Ÿà¤¾à¤‰à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_accessWimaxState" msgid="6360102877261978887">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई वाइमà¥à¤¯à¤¾à¤•à¥à¤¸ सकà¥à¤·à¤® छ कि छैन र जडान भà¤à¤•ो कà¥à¤¨à¥ˆ पनि वाइमà¥à¤¯à¤¾à¤•à¥à¤¸ नेटवरà¥à¤•हरूको बारेमा जानकारी निरà¥à¤§à¤¾à¤°à¤¿à¤£ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_changeWimaxState" msgid="2405042267131496579">"वाइमà¥à¤¯à¤¾à¤•à¥à¤¸ सà¥à¤¥à¤¿à¤¤à¤¿ परिवरà¥à¤¤à¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई वाइमà¥à¤¯à¤¾à¤•à¥à¤¸ नेटवरà¥à¤•हरूबाट टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿ जडान गरà¥à¤¨ र टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿ विचà¥à¤›à¥‡à¤¦à¤¨ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"वाइमà¥à¤¯à¤¾à¤•à¥à¤¸ नेटवरà¥à¤•हरूसà¤à¤— फोन जोडà¥à¤¨ र छà¥à¤Ÿà¤¾à¤‰à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_bluetooth" msgid="6127769336339276828">"बà¥à¤²à¥à¤Ÿà¥à¤¥ उपकरणहरूसà¤à¤— जोडी मिलाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿà¤®à¤¾ बà¥à¤²à¥à¤Ÿà¥à¤¥à¤•ो कनà¥à¤«à¤¿à¤—à¥à¤°à¥‡à¤¸à¤¨à¤²à¤¾à¤ˆ हेरà¥à¤¨ र बनाउन र जोडी उपकरणहरूसà¤à¤— जडानहरूलाई सà¥à¤µà¥€à¤•ार गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई फोनमा बà¥à¤²à¥à¤Ÿà¥à¤¥à¤•ो कनà¥à¤«à¤¿à¤—रेसन हेरà¥à¤¨ र जोडी भà¤à¤•ा उपकरणहरूसà¤à¤— जडानहरू बनाउन र सà¥à¤µà¥€à¤•ार गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_nfc" msgid="4423351274757876953">"नजिक कà¥à¤·à¥‡à¤¤à¥à¤° संचार नियनà¥à¤¤à¥à¤°à¤£à¤¹à¤°à¥‚"</string>
+ <string name="permdesc_nfc" msgid="7120611819401789907">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई नयाठकà¥à¤·à¥‡à¤¤à¥à¤° संचार (NFC) टà¥à¤¯à¤¾à¤—हरू, कारà¥à¤¡à¤¹à¤°à¥‚ र पाठकहरूसà¤à¤— अनà¥à¤¤à¤°à¥à¤•à¥à¤°à¤¿à¤¯à¤¾ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_disableKeyguard" msgid="3598496301486439258">"सà¥à¤•à¥à¤°à¤¿à¤¨ लक असकà¥à¤·à¤® पारà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_disableKeyguard" msgid="6034203065077122992">"कà¥à¤¨à¥ˆ समà¥à¤¬à¤¨à¥à¤§à¤¿à¤¤ पासवरà¥à¤¡ सà¥à¤°à¤•à¥à¤·à¤¾ र किलकलाई असकà¥à¤·à¤® पारà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ उदाहरणको लागि, अनà¥à¤¤à¤°à¥à¤—मन फोन कल पà¥à¤°à¤¾à¤ªà¥à¤¤ गरà¥à¤¦à¤¾ फोनले किलकलाई असकà¥à¤·à¤® पारà¥à¤›, तà¥à¤¯à¤¸à¤ªà¤›à¤¿ कल सकिà¤à¤•ो बेला किलक पà¥à¤¨à¤ƒà¤¸à¤•à¥à¤·à¤® पारà¥à¤›à¥¤"</string>
+ <string name="permlab_readSyncSettings" msgid="6201810008230503052">"समीकरण सेटिङहरू पढà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई खाताको लागि सिङà¥à¤• सेटिङहरू पढà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ उदाहरणको लागि यसले वà¥à¤¯à¤•à¥à¤¤à¤¿à¤¹à¤°à¤•ो अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— खातासà¤à¤— सिङà¥à¤• भà¤à¤•ो नभà¤à¤•ो निरà¥à¤§à¤¾à¤°à¤£ गरà¥à¤¨ सकà¥à¤¦à¤›à¥¤"</string>
+ <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"टगल सिङà¥à¤• खà¥à¤²à¤¾ र बनà¥à¤¦"</string>
+ <string name="permdesc_writeSyncSettings" msgid="8956262591306369868">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूलाई खाताको लागि सिङà¥à¤• सेटिङहरू परिमारà¥à¤œà¤¨ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ उदाहरणको लागि, यो खातासà¤à¤— वà¥à¤¯à¤•à¥à¤¤à¤¿ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—को सिङà¥à¤• सकà¥à¤·à¤® गरà¥à¤¨ पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨ सकिनà¥à¤›à¥¤"</string>
+ <string name="permlab_readSyncStats" msgid="7396577451360202448">"सिङà¥à¤• तथà¥à¤¯à¤¾à¤™à¥à¤•हरू पढà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_readSyncStats" msgid="1510143761757606156">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई खाताको लागि समीकरणको आà¤à¤•डा समीकरण घटनाहरूको इतिहास र समीकरण गरिà¤à¤•ो डेटाको मापन समेत, पढà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"सदसà¥à¤¯ बनाइका फिडहरू पढà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अहिलेको समीकरण गरिà¤à¤•ा सूचकहरू बारे विवरणहरू लिने अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_subscribedFeedsWrite" msgid="9015246325408209296">"सदसà¥à¤¯ बनाइका फिडहरू लेखà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_subscribedFeedsWrite" msgid="6928930188826089413">"तपाईà¤à¤•ा भरà¥à¤–रै सिङà¥à¤• फिडहरूलाई परिमारà¥à¤œà¤¨ गरà¥à¤¨à¤•ो लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ तपाईà¤à¤•ो सिङà¥à¤• फिडहरूलाई परिवरà¥à¤¤à¤¨ गरà¥à¤¨à¤•ो लागि यसले खराब अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिन सकà¥à¤›à¥¤"</string>
+ <string name="permlab_readDictionary" msgid="4107101525746035718">"तपाईà¤à¤²à¥‡ शबà¥à¤¦à¤•ोशमा थपेका शबà¥à¤¦à¤¹à¤°à¥‚ पढà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_readDictionary" msgid="659614600338904243">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤²à¥‡ पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ शबà¥à¤¦à¤•ोशमा भणà¥à¤¡à¤¾à¤°à¤£ गरेका हà¥à¤¨ सकà¥à¤¨à¥‡ सबै शबà¥à¤¦à¤¹à¤°à¥‚, नामहरू र पदावलीहरू पढà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_writeDictionary" msgid="2183110402314441106">"पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾-परिभाषित शबà¥à¤¦à¤•ोशमा शबà¥à¤¦à¤¹à¤°à¥‚ थपà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="permdesc_writeDictionary" msgid="8185385716255065291">"पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ शबà¥à¤¦à¤•ोशमा नयाठशबà¥à¤¦ लेखà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_sdcardRead" product="nosdcard" msgid="8235341515605559677">"सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ गरिà¤à¤•ा भणà¥à¤¡à¤¾à¤°à¤£ पहà¥à¤à¤šà¤•ो परीकà¥à¤·à¤£ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permlab_sdcardRead" product="default" msgid="8235341515605559677">"सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ गरिà¤à¤•ा भणà¥à¤¡à¤¾à¤°à¤£ पहà¥à¤à¤šà¤•ो परीकà¥à¤·à¤£ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_sdcardRead" product="nosdcard" msgid="3642473292348132072">"भविषà¥à¤¯ उपकरणहरूमा उपलबà¥à¤§ हà¥à¤¨à¥‡ USB भणà¥à¤¡à¤¾à¤°à¤£à¤•ो लागि अनà¥à¤®à¤¤à¤¿ परीकà¥à¤·à¤£ गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permdesc_sdcardRead" product="default" msgid="5914402684685848828">"भविषà¥à¤¯ उपकरणहरूमा उपलबà¥à¤§ हà¥à¤¨à¥‡ SD कारà¥à¤¡à¤•ो लागि अनà¥à¤®à¤¤à¤¿ परीकà¥à¤·à¤£ गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"तपाईà¤à¤•ो USB भणà¥à¤¡à¤¾à¤°à¤£à¤•ो विषयवसà¥à¤¤à¥à¤¹à¤°à¥‚लाई परिमारà¥à¤œà¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ वा मेटाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"तपाईà¤à¤•ो SD कारà¥à¤¡à¤•ो विषयसूची परिमारà¥à¤œà¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ वा मेटà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"USB भणà¥à¤¡à¤¾à¤°à¤£à¤®à¤¾ लेखà¥â€à¤¨à¤•ो लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई SD कारà¥à¤¡à¤®à¤¾ लेखà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"आनà¥à¤¤à¤°à¤¿à¤• मिडिया भणà¥à¤¡à¤¾à¤°à¤£ सामगà¥à¤°à¥€à¤¹à¤°à¥‚ परिमारà¥à¤œà¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥/मेटाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_mediaStorageWrite" product="default" msgid="8189160597698529185">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई आनà¥à¤¤à¤°à¤¿à¤• मिडिया भणà¥à¤¡à¤¾à¤°à¤£à¤•ो सामगà¥à¤°à¥€à¤¹à¤°à¥‚ परिमारà¥à¤œà¤¨ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_manageDocs" product="default" msgid="5778318598448849829">"कागजात भणà¥à¤¡à¤¾à¤°à¤£ पà¥à¤°à¤¬à¤¨à¥à¤§ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_manageDocs" product="default" msgid="8704323176914121484">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई कागजात भणà¥à¤¡à¤¾à¤°à¤£ समायोजन गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_sdcardAccessAll" msgid="8150613823900460576">"सबै उपयोगकरà¥à¤¤à¤¾à¤¹à¤°à¥‚को बाहà¥à¤¯ भणà¥à¤¡à¤¾à¤°à¤£à¤•ो पहà¥à¤à¤š राखà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_sdcardAccessAll" msgid="3215208357415891320">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई सबै उपयोगकरà¥à¤¤à¤¾à¤¹à¤°à¥‚को लागि बाहà¥à¤¯ भणà¥à¤¡à¤¾à¤°à¤£à¤®à¤¾à¤¥à¤¿ पहà¥à¤à¤š राखà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_cache_filesystem" msgid="5656487264819669824">"कà¥à¤¯à¤¾à¤¸ फाइल पà¥à¤°à¤£à¤¾à¤²à¥€ पहà¥à¤à¤š गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="permdesc_cache_filesystem" msgid="5578967642265550955">"केस फाइल पà¥à¤°à¤£à¤¾à¤²à¥€à¤²à¤¾à¤ˆ पढà¥à¤¨ र लेखà¥â€à¤¨à¤•ो लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_use_sip" msgid="5986952362795870502">"इनà¥à¤Ÿà¤°à¤¨à¥‡à¤Ÿ कलहरू गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ वा पà¥à¤°à¤¾à¤ªà¥à¤¤ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_use_sip" msgid="4717632000062674294">"इनà¥à¤Ÿà¤°à¤¨à¥‡à¤Ÿ कल गरà¥à¤¨/पà¥à¤°à¤¾à¤ªà¥à¤¤ गरà¥à¤¨ SIP सेवालाई पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨à¤•ो लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"नेटवरà¥à¤• उपयोगको इतिहास पढà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"निशà¥à¤šà¤¿à¤¤ नेटवरà¥à¤•हरू र अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूको लागि à¤à¤¤à¤¿à¤¹à¤¾à¤¸à¤¿à¤• नेटवरà¥à¤• उपयोग पढà¥à¤¨à¤•ो लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"नेटवरà¥à¤• नीति पà¥à¤°à¤¬à¤¨à¥à¤§ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"नेटवरà¥à¤• नीतिहरू वà¥à¤¯à¤µà¤¸à¥à¤¥à¤¾à¤ªà¤¨ गरà¥à¤¨ र अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—-विशेष नियमहरू परिभाषित गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"नेटवरà¥à¤• उपयोग लेखालाई परिमारà¥à¤œà¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई कसरी अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूको विरूदà¥à¤§à¤®à¤¾ कसरी नेटवरà¥à¤• उपयोगी अकाउनà¥à¤Ÿà¥‡à¤¡ छ भनेर परिमारà¥à¤œà¤¨ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ साधारण अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूदà¥à¤µà¤¾à¤°à¤¾ पà¥à¤°à¤¯à¥‹à¤—को लागि होइन।"</string>
+ <string name="permlab_markNetworkSocket" msgid="3658527214914959749">"सकेटको निशानहरू परिवरà¥à¤¤à¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_markNetworkSocket" msgid="7655568433696356578">"मारà¥à¤— दरà¥à¤¶à¤¨à¤•ो लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई सकेटको निशानहरू परिवरà¥à¤¤à¤¨ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›"</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"सूचनाहरू पहà¥à¤à¤š गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"अनà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूबाट पोसà¥à¤Ÿ गरिà¤à¤•ासहित पà¥à¤¨à¤ƒà¤ªà¥à¤°à¤¾à¤ªà¥à¤¤ गरà¥à¤¨, परीकà¥à¤·à¤£ गरà¥à¤¨ र सूचनाहरू हटाउन अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूलाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"जानकारी शà¥à¤°à¥‹à¤¤à¤¾ सेवामा बाà¤à¤§à¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"होलà¥à¤¡à¤°à¤²à¤¾à¤ˆ सूचना शà¥à¤°à¥‹à¤¤à¤¾ सेवाको शीरà¥à¤·-सà¥à¤¤à¤°à¤•ो इनà¥à¤Ÿà¤°à¤«à¥‡à¤¸ बाà¤à¤§à¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ सामानà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूलाई कहिले पनि आवशà¥à¤¯à¤• नपरà¥à¤¨ सकà¥à¤¦à¤›à¥¤"</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"वाहक-पà¥à¤°à¤¦à¤¾à¤¨ विनà¥à¤¯à¤¾à¤¸ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— सà¥à¤°à¥ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤²à¤¾à¤ˆ वाहक-पà¥à¤°à¤¦à¤¾à¤¨ विनà¥à¤¯à¤¾à¤¸ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— सà¥à¤°à¥ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ साधारण अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूलाई कहिलà¥à¤¯à¥ˆ आवशà¥à¤¯à¤• परà¥à¤¨à¥‡ छैन।"</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"सञà¥à¤œà¤¾à¤² अवसà¥à¤¥à¤¾à¤•ा परà¥à¤¯à¤µà¥‡à¤•à¥à¤·à¤£à¤•ा लागि सà¥à¤¨à¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"सञà¥à¤œà¤¾à¤² अवसà¥à¤¥à¤¾à¤•ा परà¥à¤¯à¤µà¥‡à¤•à¥à¤·à¤£ सà¥à¤¨à¥à¤¨à¤•ा लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤à¤¸à¤¾à¤®à¤¾à¤¨à¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई चाà¤à¤¹à¤¿à¤¦à¥ˆ नचाà¤à¤¹à¤¿à¤¨ सकà¥à¤›à¥¤"</string>
+ <string name="policylab_limitPassword" msgid="4497420728857585791">"पासवरà¥à¤¡ नियमहरू मिलाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="policydesc_limitPassword" msgid="3252114203919510394">"सà¥à¤•à¥à¤°à¤¿à¤¨-अनलक पासवरà¥à¤¡à¤¹à¤°à¥‚मा अनà¥à¤®à¤¤à¤¿ दिइà¤à¤•ो लमà¥à¤¬à¤¾à¤‡ र अकà¥à¤·à¤°à¤¹à¤°à¥‚ नियनà¥à¤¤à¥à¤°à¤£ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="policylab_watchLogin" msgid="914130646942199503">"मोनिटर सà¥à¤•à¥à¤°à¤¿à¤¨-अनलक पà¥à¤°à¤¯à¤¤à¥à¤¨à¤¹à¤°à¥‚"</string>
+ <string name="policydesc_watchLogin" product="tablet" msgid="3215729294215070072">"सà¥à¤•à¥à¤°à¤¿à¤¨ अनलक गरà¥à¤¦à¤¾ गलत पासवरà¥à¤¡ टाइप भà¤à¤•ो संखà¥à¤¯à¤¾ निरीकà¥à¤·à¤£ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ र यदि निकै धेरै गलत पासवरà¥à¤¡à¤¹à¤°à¥‚ टाइप भà¤à¤•ा छन भने टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿ लक गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ वा टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿà¤•ा सबै डेटा मेटà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="policydesc_watchLogin" product="default" msgid="5712323091846761073">"सà¥à¤•à¥à¤°à¤¿à¤¨à¤…नलक गरà¥à¤¦à¤¾ गलत पासवरà¥à¤¡ टाइप भà¤à¤•ो संखà¥à¤¯à¤¾ निरीकà¥à¤·à¤£ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ र यदि निकै धेरै गलत पासवरà¥à¤¡à¤¹à¤°à¥‚ टाइप भà¤à¤•ा छन भने फोन लक गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ वा फोनका सबै डेटा मेटà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="policylab_resetPassword" msgid="2620077191242688955">"सà¥à¤•à¥à¤°à¤¿à¤¨-अनलक पासवरà¥à¤¡ बदलà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="policydesc_resetPassword" msgid="605963962301904458">"सà¥à¤•à¥à¤°à¤¿à¤¨-अनलक पासवरà¥à¤¡ परिवरà¥à¤¤à¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="policylab_forceLock" msgid="2274085384704248431">"सà¥à¤•à¥à¤°à¤¿à¤¨ लक गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="policydesc_forceLock" msgid="1141797588403827138">"कसरी र कहिले सà¥à¤•à¥à¤°à¤¿à¤¨ लक गरà¥à¤¨à¥‡ नियनà¥à¤¤à¥à¤°à¤£ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="policylab_wipeData" msgid="3910545446758639713">"सबै डेटा मेटà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="policydesc_wipeData" product="tablet" msgid="4306184096067756876">"à¤à¤‰à¤Ÿà¤¾ फà¥à¤¯à¤¾à¤•à¥à¤Ÿà¥à¤°à¤¿ डेटा पà¥à¤¨à¤ƒà¤¸à¥‡à¤Ÿ गरेर चेतावनी नआउà¤à¤¦à¥ˆ टà¥à¤¯à¤¾à¤¬à¤²à¥à¤Ÿà¤•ो डेटा मेटà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="policydesc_wipeData" product="default" msgid="5096895604574188391">"à¤à¤‰à¤Ÿà¤¾ फà¥à¤¯à¤¾à¤•à¥à¤Ÿà¥à¤°à¤¿ डेटा पà¥à¤¨à¤ƒà¤¸à¥‡à¤Ÿ गरेर चेतावनी नआउà¤à¤¦à¥ˆ फोनको डेटा मेटà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="policylab_setGlobalProxy" msgid="2784828293747791446">"उपकरण विशà¥à¤µà¤µà¥à¤¯à¤¾à¤ªà¥€ पà¥à¤°à¥‹à¤•à¥à¤¸à¥€ मिलाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"नीति सकà¥à¤·à¤® हà¥à¤à¤¦à¤¾ पà¥à¤°à¤¯à¥‹à¤— हà¥à¤¨à¥‡ उपकरण विशà¥à¤µà¤µà¥à¤¯à¤¾à¤ªà¥€ पà¥à¤°à¥‹à¤•à¥à¤¸à¥€ सेट गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤ पà¥à¤°à¤¥à¤® उपकरण पà¥à¤°à¤¶à¤¾à¤¸à¤¶à¤¨à¤²à¥‡ मातà¥à¤° पà¥à¤°à¤­à¤¾à¤µà¤•ारी विशà¥à¤µà¤µà¥à¤¯à¤¾à¤ªà¥€ पà¥à¤°à¥‹à¤•à¥à¤¸à¥€ सेट गरà¥à¤›à¥¤"</string>
+ <string name="policylab_expirePassword" msgid="885279151847254056">"लक-सà¥à¤•à¥à¤°à¤¿à¤¨ पासवरà¥à¤¡ अनà¥à¤¤ सेट गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="policydesc_expirePassword" msgid="1729725226314691591">"पà¥à¤°à¤¾à¤¯à¤ƒ कति छिटो लक-सà¥à¤•à¥à¤°à¤¿à¤¨ पासवरà¥à¤¡ बदलà¥à¤¨à¥ परà¥à¤› यसलाई नियनà¥à¤¤à¥à¤°à¤£ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="policylab_encryptedStorage" msgid="8901326199909132915">"भणà¥à¤¡à¤¾à¤°à¤£ इनà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤¸à¤¨ मिलाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="policydesc_encryptedStorage" msgid="2637732115325316992">"भणà¥à¤¡à¤¾à¤° गरिà¤à¤•ो डेटा इनà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ हà¥à¤¨à¥ आवशà¥à¤¯à¤• छ।"</string>
+ <string name="policylab_disableCamera" msgid="6395301023152297826">"कà¥à¤¯à¤¾à¤®à¥‡à¤°à¤¾à¤²à¤¾à¤ˆ असकà¥à¤·à¤® गराउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="policydesc_disableCamera" msgid="2306349042834754597">"सबै उपकरण कà¥à¤¯à¤¾à¤®à¤°à¤¾à¤¹à¤°à¥‚को पà¥à¤°à¤¯à¥‹à¤— रोकà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="policylab_disableKeyguardFeatures" msgid="266329104542638802">"किगारà¥à¤¡à¤®à¤¾ भà¤à¤•ा विशेषताहरू असकà¥à¤·à¤® पारà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="policydesc_disableKeyguardFeatures" msgid="3467082272186534614">"केही किगारà¥à¤¡ विशेषताहरूको पà¥à¤°à¤¯à¥‹à¤— रोकà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string-array name="phoneTypes">
+ <item msgid="8901098336658710359">"गृह"</item>
+ <item msgid="869923650527136615">"मोबाइल"</item>
+ <item msgid="7897544654242874543">"काम गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</item>
+ <item msgid="1103601433382158155">"कारà¥à¤¯ फà¥à¤¯à¤¾à¤•à¥à¤¸"</item>
+ <item msgid="1735177144948329370">"घरको फà¥à¤¯à¤¾à¤•à¥à¤¸"</item>
+ <item msgid="603878674477207394">"पेजर"</item>
+ <item msgid="1650824275177931637">"अनà¥à¤¯"</item>
+ <item msgid="9192514806975898961">"अनà¥à¤•ूलन"</item>
+ </string-array>
+ <string-array name="emailAddressTypes">
+ <item msgid="8073994352956129127">"गृह"</item>
+ <item msgid="7084237356602625604">"काम"</item>
+ <item msgid="1112044410659011023">"अनà¥à¤¯"</item>
+ <item msgid="2374913952870110618">"अनà¥à¤•ूलन"</item>
+ </string-array>
+ <string-array name="postalAddressTypes">
+ <item msgid="6880257626740047286">"गृह"</item>
+ <item msgid="5629153956045109251">"काम"</item>
+ <item msgid="4966604264500343469">"अनà¥à¤¯"</item>
+ <item msgid="4932682847595299369">"अनà¥à¤•ूलन"</item>
+ </string-array>
+ <string-array name="imAddressTypes">
+ <item msgid="1738585194601476694">"गृह"</item>
+ <item msgid="1359644565647383708">"काम"</item>
+ <item msgid="7868549401053615677">"अनà¥à¤¯"</item>
+ <item msgid="3145118944639869809">"अनà¥à¤•ूलन"</item>
+ </string-array>
+ <string-array name="organizationTypes">
+ <item msgid="7546335612189115615">"काम गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</item>
+ <item msgid="4378074129049520373">"अनà¥à¤¯"</item>
+ <item msgid="3455047468583965104">"अनà¥à¤•ूलन"</item>
+ </string-array>
+ <string-array name="imProtocols">
+ <item msgid="8595261363518459565">"AIM"</item>
+ <item msgid="7390473628275490700">"Windows Live"</item>
+ <item msgid="7882877134931458217">"Yahoo"</item>
+ <item msgid="5035376313200585242">"सà¥à¤•ाइप"</item>
+ <item msgid="7532363178459444943">"QQ"</item>
+ <item msgid="3713441034299660749">"Google Talk"</item>
+ <item msgid="2506857312718630823">"ICQ"</item>
+ <item msgid="1648797903785279353">"Jabber"</item>
+ </string-array>
+ <string name="phoneTypeCustom" msgid="1644738059053355820">"अनà¥à¤•ूलन"</string>
+ <string name="phoneTypeHome" msgid="2570923463033985887">"गृह"</string>
+ <string name="phoneTypeMobile" msgid="6501463557754751037">"मोबाइल"</string>
+ <string name="phoneTypeWork" msgid="8863939667059911633">"काम"</string>
+ <string name="phoneTypeFaxWork" msgid="3517792160008890912">"कारà¥à¤¯ फà¥à¤¯à¤¾à¤•à¥à¤¸"</string>
+ <string name="phoneTypeFaxHome" msgid="2067265972322971467">"घरको फà¥à¤¯à¤¾à¤•à¥à¤¸"</string>
+ <string name="phoneTypePager" msgid="7582359955394921732">"पेजर"</string>
+ <string name="phoneTypeOther" msgid="1544425847868765990">"अनà¥à¤¯"</string>
+ <string name="phoneTypeCallback" msgid="2712175203065678206">"कलबà¥à¤¯à¤¾à¤•"</string>
+ <string name="phoneTypeCar" msgid="8738360689616716982">"कार"</string>
+ <string name="phoneTypeCompanyMain" msgid="540434356461478916">"कमà¥à¤ªà¤¨à¥€ मà¥à¤–à¥à¤¯"</string>
+ <string name="phoneTypeIsdn" msgid="8022453193171370337">"ISDN"</string>
+ <string name="phoneTypeMain" msgid="6766137010628326916">"मà¥à¤–à¥à¤¯"</string>
+ <string name="phoneTypeOtherFax" msgid="8587657145072446565">"अनà¥à¤¯ फà¥à¤¯à¤¾à¤•à¥à¤¸"</string>
+ <string name="phoneTypeRadio" msgid="4093738079908667513">"रेडियो"</string>
+ <string name="phoneTypeTelex" msgid="3367879952476250512">"टेलेकà¥à¤¸"</string>
+ <string name="phoneTypeTtyTdd" msgid="8606514378585000044">"TTY TDD"</string>
+ <string name="phoneTypeWorkMobile" msgid="1311426989184065709">"कारà¥à¤¯ मोबाइल"</string>
+ <string name="phoneTypeWorkPager" msgid="649938731231157056">"कारà¥à¤¯ पेजर"</string>
+ <string name="phoneTypeAssistant" msgid="5596772636128562884">"सहायक"</string>
+ <string name="phoneTypeMms" msgid="7254492275502768992">"MMS"</string>
+ <string name="eventTypeCustom" msgid="7837586198458073404">"अनà¥à¤•ूलन"</string>
+ <string name="eventTypeBirthday" msgid="2813379844211390740">"जनà¥à¤®à¤¦à¤¿à¤¨"</string>
+ <string name="eventTypeAnniversary" msgid="3876779744518284000">"वारà¥à¤·à¤¿à¤• समारोह"</string>
+ <string name="eventTypeOther" msgid="7388178939010143077">"अनà¥à¤¯"</string>
+ <string name="emailTypeCustom" msgid="8525960257804213846">"अनà¥à¤•ूलन"</string>
+ <string name="emailTypeHome" msgid="449227236140433919">"गृह"</string>
+ <string name="emailTypeWork" msgid="3548058059601149973">"काम"</string>
+ <string name="emailTypeOther" msgid="2923008695272639549">"अनà¥à¤¯"</string>
+ <string name="emailTypeMobile" msgid="119919005321166205">"मोबाइल"</string>
+ <string name="postalTypeCustom" msgid="8903206903060479902">"अनà¥à¤•ूलन"</string>
+ <string name="postalTypeHome" msgid="8165756977184483097">"गृह"</string>
+ <string name="postalTypeWork" msgid="5268172772387694495">"काम"</string>
+ <string name="postalTypeOther" msgid="2726111966623584341">"अनà¥à¤¯"</string>
+ <string name="imTypeCustom" msgid="2074028755527826046">"अनà¥à¤•ूलन"</string>
+ <string name="imTypeHome" msgid="6241181032954263892">"गृह"</string>
+ <string name="imTypeWork" msgid="1371489290242433090">"काम"</string>
+ <string name="imTypeOther" msgid="5377007495735915478">"अनà¥à¤¯"</string>
+ <string name="imProtocolCustom" msgid="6919453836618749992">"अनà¥à¤•ूलन"</string>
+ <string name="imProtocolAim" msgid="7050360612368383417">"AIM"</string>
+ <string name="imProtocolMsn" msgid="144556545420769442">"Windows Live"</string>
+ <string name="imProtocolYahoo" msgid="8271439408469021273">"Yahoo"</string>
+ <string name="imProtocolSkype" msgid="9019296744622832951">"सà¥à¤•ाइप"</string>
+ <string name="imProtocolQq" msgid="8887484379494111884">"QQ"</string>
+ <string name="imProtocolGoogleTalk" msgid="493902321140277304">"हà¥à¤¯à¤¾à¤™à¤†à¤‰à¤Ÿà¤¹à¤°à¥‚"</string>
+ <string name="imProtocolIcq" msgid="1574870433606517315">"ICQ"</string>
+ <string name="imProtocolJabber" msgid="2279917630875771722">"Jabber"</string>
+ <string name="imProtocolNetMeeting" msgid="8287625655986827971">"NetMeeting"</string>
+ <string name="orgTypeWork" msgid="29268870505363872">"काम"</string>
+ <string name="orgTypeOther" msgid="3951781131570124082">"अनà¥à¤¯"</string>
+ <string name="orgTypeCustom" msgid="225523415372088322">"अनà¥à¤•ूलन"</string>
+ <string name="relationTypeCustom" msgid="3542403679827297300">"अनà¥à¤•ूलन"</string>
+ <string name="relationTypeAssistant" msgid="6274334825195379076">"सहायक"</string>
+ <string name="relationTypeBrother" msgid="8757913506784067713">"भाइ"</string>
+ <string name="relationTypeChild" msgid="1890746277276881626">"बचà¥à¤šà¥‹"</string>
+ <string name="relationTypeDomesticPartner" msgid="6904807112121122133">"आनà¥à¤¤à¤°à¤¿à¤• साà¤à¥‡à¤¦à¤¾à¤°"</string>
+ <string name="relationTypeFather" msgid="5228034687082050725">"बà¥à¤¬à¤¾"</string>
+ <string name="relationTypeFriend" msgid="7313106762483391262">"मितà¥à¤°"</string>
+ <string name="relationTypeManager" msgid="6365677861610137895">"बà¥à¤¯à¤µà¤¸à¥à¤¥à¤¾à¤ªà¤•"</string>
+ <string name="relationTypeMother" msgid="4578571352962758304">"आमा"</string>
+ <string name="relationTypeParent" msgid="4755635567562925226">"अभिभावक"</string>
+ <string name="relationTypePartner" msgid="7266490285120262781">"पारà¥à¤Ÿà¤¨à¤°"</string>
+ <string name="relationTypeReferredBy" msgid="101573059844135524">"दà¥à¤µà¤¾à¤°à¤¾ उलà¥à¤²à¤¿à¤–ित"</string>
+ <string name="relationTypeRelative" msgid="1799819930085610271">"आफनà¥à¤¤"</string>
+ <string name="relationTypeSister" msgid="1735983554479076481">"बहिनी"</string>
+ <string name="relationTypeSpouse" msgid="394136939428698117">"पति-पतà¥à¤¨à¤¿"</string>
+ <string name="sipAddressTypeCustom" msgid="2473580593111590945">"अनà¥à¤•ूलन"</string>
+ <string name="sipAddressTypeHome" msgid="6093598181069359295">"गृह"</string>
+ <string name="sipAddressTypeWork" msgid="6920725730797099047">"काम गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="sipAddressTypeOther" msgid="4408436162950119849">"अनà¥à¤¯"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"PIN कोड टाइप गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"PUK र नयाठPIN कोड टाइप गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"PUK कोड"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"नयाठPIN कोड"</string>
+ <string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"पासवरà¥à¤¡ टाइप गरà¥à¤¨ छà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</font></string>
+ <string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"अनलक गरà¥à¤¨ पासवरà¥à¤¡ टाइप गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"अनलक गरà¥à¤¨ PIN कोड टाइप गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"गलत PIN कोड।"</string>
+ <string name="keyguard_label_text" msgid="861796461028298424">"अनलक गरà¥à¤¨ मेनॠथिचà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ र तà¥à¤¯à¤¸à¤ªà¤›à¤¿ ० थिचà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"आपतकालीन नमà¥à¤¬à¤°"</string>
+ <string name="lockscreen_carrier_default" msgid="8963839242565653192">"सेवा छैन।"</string>
+ <string name="lockscreen_screen_locked" msgid="7288443074806832904">"सà¥à¤•à¥à¤°à¤¿à¤¨ लक गरिà¤à¤•ो।"</string>
+ <string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"अनलक वा आपतकालीन कल गरà¥à¤¨ मेनॠथिचà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"अनलक गरà¥à¤¨ मेनॠथिचà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"अनलक गरà¥à¤¨à¥ ढाà¤à¤šà¤¾ खिचà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="lockscreen_emergency_call" msgid="5347633784401285225">"आपतकालीन कलहरू"</string>
+ <string name="lockscreen_return_to_call" msgid="5244259785500040021">"कलमा फरà¥à¤•िनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="lockscreen_pattern_correct" msgid="9039008650362261237">"सही!"</string>
+ <string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"फेरि पà¥à¤°à¤¯à¤¾à¤¸ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="lockscreen_password_wrong" msgid="5737815393253165301">"फेरि पà¥à¤°à¤¯à¤¾à¤¸ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="faceunlock_multiple_failures" msgid="754137583022792429">"अतà¥à¤¯à¤¾à¤§à¤¿à¤• मोहडा खोलà¥à¤¨à¥‡ पà¥à¤°à¤¯à¤¾à¤¸à¤¹à¤°à¥‚ बढी भà¤à¥¤"</string>
+ <string name="lockscreen_plugged_in" msgid="8057762828355572315">"चारà¥à¤œ हà¥à¤à¤¦à¥ˆ, <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+ <string name="lockscreen_charged" msgid="321635745684060624">"चारà¥à¤œ भयो"</string>
+ <string name="lockscreen_battery_short" msgid="4477264849386850266">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+ <string name="lockscreen_low_battery" msgid="1482873981919249740">"तपाईà¤à¤•ो चारà¥à¤œà¤° जोडà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"SIM कारà¥à¤¡ छैन"</string>
+ <string name="lockscreen_missing_sim_message" product="tablet" msgid="151659196095791474">"टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿà¤®à¤¾ SIM कारà¥à¤¡ छैन।"</string>
+ <string name="lockscreen_missing_sim_message" product="default" msgid="2186920585695169078">"फोनमा SIM कारà¥à¤¡ छैन।"</string>
+ <string name="lockscreen_missing_sim_instructions" msgid="5372787138023272615">"SIM कारà¥à¤¡ घà¥à¤¸à¤¾à¤‰à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="lockscreen_missing_sim_instructions_long" msgid="3526573099019319472">"SIM कारà¥à¤¡ छैन वा पढà¥à¤¨ मिलà¥à¤¦à¥ˆà¤¨à¥¤ SIM कारà¥à¤¡ हालà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="lockscreen_permanent_disabled_sim_message_short" msgid="5096149665138916184">"पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨ अयोगà¥à¤¯ SIM कारà¥à¤¡"</string>
+ <string name="lockscreen_permanent_disabled_sim_instructions" msgid="910904643433151371">"तपाईंको SIM कारà¥à¤¡ सà¥à¤¥à¤¾à¤¯à¥€ रूपमा अकà¥à¤·à¤® भयो।\n अरà¥à¤•ो SIM कारà¥à¤¡à¤•ो लागि आफनो ताररहित सेवा पà¥à¤°à¤¦à¤¾à¤¯à¤•सà¤à¤— समà¥à¤ªà¤°à¥à¤• गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="lockscreen_transport_prev_description" msgid="201594905152746886">"अघिलà¥à¤²à¥‹ टà¥à¤°à¤¯à¤¾à¤• बटन"</string>
+ <string name="lockscreen_transport_next_description" msgid="6089297650481292363">"अरà¥à¤•ो टà¥à¤°à¤¯à¤¾à¤• बटन"</string>
+ <string name="lockscreen_transport_pause_description" msgid="7659088786780128001">"रोकà¥à¤¨à¥‡ बटन"</string>
+ <string name="lockscreen_transport_play_description" msgid="5888422938351019426">"बजाउने बटन"</string>
+ <string name="lockscreen_transport_stop_description" msgid="4562318378766987601">"बटन रोकà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="emergency_calls_only" msgid="6733978304386365407">"आपतकालीन कलहरू मातà¥à¤°"</string>
+ <string name="lockscreen_network_locked_message" msgid="143389224986028501">"नेटवरà¥à¤• लक छ"</string>
+ <string name="lockscreen_sim_puk_locked_message" msgid="7441797339976230">"SIM कारà¥à¤¡ PUK-लक गरिà¤à¤•ो छ।"</string>
+ <string name="lockscreen_sim_puk_locked_instructions" msgid="8127916255245181063">"पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ निरà¥à¤¦à¥‡à¤¶à¤• वा गà¥à¤°à¤¾à¤¹à¤• सेवा समà¥à¤ªà¤°à¥à¤• हरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="lockscreen_sim_locked_message" msgid="8066660129206001039">"SIM कारà¥à¤¡ लक गरिà¤à¤•ो छ।"</string>
+ <string name="lockscreen_sim_unlock_progress_dialog_message" msgid="595323214052881264">"SIM कारà¥à¤¡ अनलक गरिà¤à¤¦à¥ˆ..."</string>
+ <string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="6481623830344107222">"तपाईà¤à¤²à¥‡ तपाईà¤à¤•ो अनलक ढाà¤à¤šà¤¾ गलत तरिकाले <xliff:g id="NUMBER_0">%d</xliff:g> पटक खिचà¥à¤¨à¥ भà¤à¤•ो छ। \n\n <xliff:g id="NUMBER_1">%d</xliff:g> सेकेनà¥à¤¡à¤®à¤¾ फेरि कोसिस गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="2725973286239344555">"तपाईंले गलत तरिकाले आफà¥à¤¨à¥‹ पासवरà¥à¤¡ <xliff:g id="NUMBER_0">%d</xliff:g> पटक टाइप गरà¥à¤¨à¥à¤­à¤¯à¥‹à¥¤ \n\n<xliff:g id="NUMBER_1">%d</xliff:g> सेकेनà¥à¤¡à¤®à¤¾ फेरि पà¥à¤°à¤¯à¤¾à¤¸ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="6216672706545696955">"तपाईà¤à¤²à¥‡ गलत तरिकाले तपाईà¤à¤•ो PIN <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" product="tablet" msgid="9191611984625460820">"तपाईà¤à¤²à¥‡ तपाईà¤à¤•ो अनलक ढाà¤à¤šà¤¾ गलत तरिकाले <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_failed_attempts_almost_glogin" product="default" msgid="2590227559763762751">"तपाईà¤à¤²à¥‡ <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_failed_attempts_almost_at_wipe" product="tablet" msgid="6128106399745755604">"तपाईà¤à¤²à¥‡ <xliff:g id="NUMBER_0">%d</xliff:g> पटक टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿà¤²à¤¾à¤ˆ अनलक गरà¥à¤¨à¤•ो लागि गलत तरिकाले कोशिस गरà¥à¤¨à¥à¤­à¤à¤•ो छ। <xliff:g id="NUMBER_1">%d</xliff:g> अरू धेरै असफल कोसिसहरूपछि, टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿ फà¥à¤¯à¤¾à¤Ÿà¥à¤°à¤¿ पूरà¥à¤µà¤¨à¤¿à¤°à¥à¤§à¤¾à¤°à¤¿à¤¤à¤®à¤¾ पà¥à¤¨à¤ƒà¤¸à¥‡à¤Ÿ हà¥à¤¨à¥‡ छ र सबै पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ डेटा हराउने छनà¥à¥¤"</string>
+ <string name="lockscreen_failed_attempts_almost_at_wipe" product="default" msgid="8603565142156826565">"तपाईंले गलत तरिकाले <xliff:g id="NUMBER_0">%d</xliff:g> पटक फोन अनलक गरà¥à¤¨à¥‡ पà¥à¤°à¤¯à¤¤à¥à¤¨ गरà¥à¤¨à¥à¤­à¤¯à¥‹à¥¤ <xliff:g id="NUMBER_1">%d</xliff:g> बढी असफल पà¥à¤°à¤¯à¤¤à¥à¤¨à¤¹à¤°à¥‚ पछि, फोन फà¥à¤¯à¤¾à¤•à¥à¤Ÿà¥à¤°à¤¿ पूरà¥à¤µà¤¨à¤¿à¤°à¥à¤§à¤¾à¤°à¤¿à¤¤à¤®à¤¾ पà¥à¤¨à¤ƒà¤¸à¥‡à¤Ÿ हà¥à¤¨à¥‡ छ र सबै पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ डेटा हराउने छनà¥à¥¤"</string>
+ <string name="lockscreen_failed_attempts_now_wiping" product="tablet" msgid="280873516493934365">"तपाईà¤à¤²à¥‡ टà¥à¤¯à¤¬à¥à¤²à¥‡à¤Ÿà¤²à¤¾à¤ˆ अनलक गरà¥à¤¨ गलत तरिकाले <xliff:g id="NUMBER">%d</xliff:g> पटक पà¥à¤°à¤¯à¤¾à¤¸ गरà¥à¤¨à¥ भà¤à¤•ो छ। अब टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿà¤²à¤¾à¤ˆ पूरà¥à¤µà¤¨à¤¿à¤°à¥à¤§à¤¾à¤°à¤¿à¤¤ कारà¥à¤¯à¤¶à¤¾à¤²à¤¾à¤®à¤¾ पà¥à¤¨à¤ƒà¤¸à¥‡à¤Ÿ गरिने छ।"</string>
+ <string name="lockscreen_failed_attempts_now_wiping" product="default" msgid="3025504721764922246">"तपाईंले गलत तरिकाले फोन <xliff:g id="NUMBER">%d</xliff:g> पटक अनलक गरà¥à¤¨à¥‡ पà¥à¤°à¤¯à¤¤à¥à¤¨ गरà¥à¤¨à¥à¤­à¤¯à¥‹à¥¤ अब फोन फà¥à¤¯à¤¾à¤•à¥à¤Ÿà¥à¤°à¤¿ पूरà¥à¤µà¤¨à¤¿à¤°à¥à¤§à¤¾à¤°à¤¿à¤¤à¤®à¤¾ पà¥à¤¨à¤ƒà¤¸à¥‡à¤Ÿ हà¥à¤¨à¥‡ छ।"</string>
+ <string name="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"<xliff:g id="NUMBER">%d</xliff:g> सेकेनà¥à¤¡à¤®à¤¾ फेरि पà¥à¤°à¤¯à¤¾à¤¸ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"ढाà¤à¤šà¤¾ बिरà¥à¤¸à¤¨à¥ भयो?"</string>
+ <string name="lockscreen_glogin_forgot_pattern" msgid="2588521501166032747">"खाता अनलक"</string>
+ <string name="lockscreen_glogin_too_many_attempts" msgid="2751368605287288808">"निकै धेरै कोसिसहरू"</string>
+ <string name="lockscreen_glogin_instructions" msgid="3931816256100707784">"अनलक गरà¥à¤¨à¤•ो लागि, तपाईà¤à¤•ो Google खातासà¤à¤— साइन इन गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="lockscreen_glogin_username_hint" msgid="8846881424106484447">"पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤¨à¤¾à¤® (इमेल)"</string>
+ <string name="lockscreen_glogin_password_hint" msgid="5958028383954738528">"पासवरà¥à¤¡:"</string>
+ <string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"साइन इन गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"अमानà¥à¤¯ पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤¨à¤¾à¤® वा पासवरà¥à¤¡"</string>
+ <string name="lockscreen_glogin_account_recovery_hint" msgid="1696924763690379073">"तपाईà¤à¤•ो पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ नाम वा पासवरà¥à¤¡ बिरà¥à¤¸à¤¨à¥à¤­à¤¯à¥‹?\n भà¥à¤°à¤®à¤£ गरà¥à¤¨à¥à¤¹à¥‹à¤¸"<b>"google.com/accounts/recovery"</b></string>
+ <string name="lockscreen_glogin_checking_password" msgid="7114627351286933867">"जाà¤à¤š गरà¥à¤¦à¥ˆ..."</string>
+ <string name="lockscreen_unlock_label" msgid="737440483220667054">"खोलà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"आवाज चालॠछ।"</string>
+ <string name="lockscreen_sound_off_label" msgid="996822825154319026">"धà¥à¤µà¤¨à¤¿ बनà¥à¤¦"</string>
+ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"ढाà¤à¤šà¤¾ सà¥à¤°à¥ भयो"</string>
+ <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"ढाà¤à¤šà¤¾ हटाइà¤à¤•ो"</string>
+ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"सेल थप गरियो"</string>
+ <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"ढाà¤à¤šà¤¾ पà¥à¤°à¤¾ भयो"</string>
+ <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. विजेट %2$d of %3$d।"</string>
+ <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"विजेट थप गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"खाली"</string>
+ <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"अनलक कà¥à¤·à¥‡à¤¤à¥à¤° विसà¥à¤¤à¤¾à¤° भयो।"</string>
+ <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"अनलक कà¥à¤·à¥‡à¤¤à¥à¤° भतà¥à¤•ियो।"</string>
+ <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> विजेट।"</string>
+ <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ छनौटकरà¥à¤¤à¤¾"</string>
+ <string name="keyguard_accessibility_status" msgid="8008264603935930611">"सà¥à¤¥à¤¿à¤¤à¤¿"</string>
+ <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"कà¥à¤¯à¤¾à¤®à¥‡à¤°à¤¾"</string>
+ <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"मिडिया नियनà¥à¤¤à¥à¤°à¤£à¤¹à¤°à¥‚"</string>
+ <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"विजेट पà¥à¤¨à¤ƒà¤•à¥à¤°à¤® गरà¥à¤¨à¥‡ सà¥à¤°à¥ भयो।"</string>
+ <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"विजेट पà¥à¤¨à¤ƒà¤•à¥à¤°à¤® समापà¥à¤¤ भà¤à¤•ो छ।"</string>
+ <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"विजेट <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> मेटाइयो।"</string>
+ <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"अनलक कà¥à¤·à¥‡à¤¤à¥à¤° बढाउनà¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"सà¥à¤²à¤¾à¤‡à¤¡ अनलक।"</string>
+ <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"ढाà¤à¤šà¤¾ अनलक।"</string>
+ <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"फेस अनलक"</string>
+ <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Pin अनलक"</string>
+ <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"पासवरà¥à¤¡ अनलक।"</string>
+ <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"ढाà¤à¤šà¤¾ कà¥à¤·à¥‡à¤¤à¥à¤°à¥¤"</string>
+ <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"सà¥à¤²à¤¾à¤‡à¤¡ कà¥à¤·à¥‡à¤¤à¥à¤°à¥¤"</string>
+ <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?१२३"</string>
+ <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
+ <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
+ <string name="granularity_label_character" msgid="7336470535385009523">"अकà¥à¤·à¤°"</string>
+ <string name="granularity_label_word" msgid="7075570328374918660">"शबà¥à¤¦"</string>
+ <string name="granularity_label_link" msgid="5815508880782488267">"लिङà¥à¤•"</string>
+ <string name="granularity_label_line" msgid="5764267235026120888">"लाइन"</string>
+ <string name="hour_ampm" msgid="4584338083529355982">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
+ <string name="hour_cap_ampm" msgid="2083465992940444366">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
+ <string name="factorytest_failed" msgid="5410270329114212041">"कारà¥à¤¯à¤¶à¤¾à¤²à¤¾ परीकà¥à¤·à¤£ असफल भयो।"</string>
+ <string name="factorytest_not_system" msgid="4435201656767276723">"FACTORY_TEST कारà¥à¤°à¤µà¤¾à¤‡à¤²à¥‡ /system/app मा सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ पà¥à¤¯à¤¾à¤•ेजहरूको लागि मातà¥à¤° समरà¥à¤¥à¤¨ गरà¥à¤›à¥¤"</string>
+ <string name="factorytest_no_action" msgid="872991874799998561">"कà¥à¤¨à¥ˆ पà¥à¤¯à¤¾à¤•ेज फेला पारà¥à¤¨ सकिà¤à¤¨ जसले FACTORY_TEST कारà¥à¤¯ पà¥à¤°à¤¦à¤¾à¤¨ गरà¥à¤¦à¤›à¥¤"</string>
+ <string name="factorytest_reboot" msgid="6320168203050791643">"पà¥à¤¨à¤ƒà¤¬à¥à¤Ÿ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="js_dialog_title" msgid="1987483977834603872">"यस \"<xliff:g id="TITLE">%s</xliff:g>\" मा भà¤à¤•ो पृषà¥à¤ à¤²à¥‡ बताउà¤à¤›:"</string>
+ <string name="js_dialog_title_default" msgid="6961903213729667573">"जाभासà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ"</string>
+ <string name="js_dialog_before_unload_title" msgid="2619376555525116593">"मारà¥à¤—निरà¥à¤¦à¥‡à¤¶à¤¨ पकà¥à¤•ा गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="js_dialog_before_unload_positive_button" msgid="3112752010600484130">"यस पृषà¥à¤ à¤²à¤¾à¤ˆ छोडà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="js_dialog_before_unload_negative_button" msgid="5614861293026099715">"यही पृषà¥à¤ à¤®à¤¾ रहनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="js_dialog_before_unload" msgid="3468816357095378590">"<xliff:g id="MESSAGE">%s</xliff:g>\n\nके तपाईठयो पेजबाट नेभिगेट गरà¥à¤¨ चाहनॠहà¥à¤¨à¥à¤› भनà¥à¤¨à¥‡ निशà¥à¤šà¤¤ छ?"</string>
+ <string name="save_password_label" msgid="6860261758665825069">"निशà¥à¤šà¤¿à¤¤ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="double_tap_toast" msgid="4595046515400268881">"जà¥à¤•à¥à¤¤à¤¿: जà¥à¤®à¤²à¤¾à¤ˆ ठूलो र सानो पारà¥à¤¨ दà¥à¤ˆ पटक हानà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="autofill_this_form" msgid="4616758841157816676">"सà¥à¤µà¤¤à¤ƒ भरà¥à¤¨à¥‡"</string>
+ <string name="setup_autofill" msgid="7103495070180590814">"अटोफिल सेटअप गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
+ <string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$१$२$३"</string>
+ <string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
+ <string name="autofill_address_summary_format" msgid="4874459455786827344">"$1$2$3"</string>
+ <string name="autofill_province" msgid="2231806553863422300">"पà¥à¤°à¤¾à¤¨à¥à¤¤"</string>
+ <string name="autofill_postal_code" msgid="4696430407689377108">"हà¥à¤²à¤¾à¤•ी कोड"</string>
+ <string name="autofill_state" msgid="6988894195520044613">"राजà¥à¤¯"</string>
+ <string name="autofill_zip_code" msgid="8697544592627322946">"ZIP कोड"</string>
+ <string name="autofill_county" msgid="237073771020362891">"काउनà¥à¤Ÿà¥€"</string>
+ <string name="autofill_island" msgid="4020100875984667025">"टापà¥"</string>
+ <string name="autofill_district" msgid="8400735073392267672">"जिलà¥à¤²à¤¾"</string>
+ <string name="autofill_department" msgid="5343279462564453309">"विभाग"</string>
+ <string name="autofill_prefecture" msgid="2028499485065800419">"पà¥à¤°à¤¶à¤¾à¤¸à¤•ीय कà¥à¤·à¥‡à¤¤à¥à¤°"</string>
+ <string name="autofill_parish" msgid="8202206105468820057">"पेरिस"</string>
+ <string name="autofill_area" msgid="3547409050889952423">"कà¥à¤·à¥‡à¤¤à¥à¤°"</string>
+ <string name="autofill_emirate" msgid="2893880978835698818">"इमिरेट"</string>
+ <string name="permlab_readHistoryBookmarks" msgid="3775265775405106983">"तपाईà¤à¤•ा बà¥à¤•मारà¥à¤•हरू र इतिहास पढà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_readHistoryBookmarks" msgid="8462378226600439658">"बà¥à¤°à¤¾à¤‰à¤œà¤°à¤²à¥‡ भà¥à¤°à¤®à¤£ गरेको सबै URL हरूको इतिहास र बà¥à¤°à¤¾à¤‰à¤œà¤°à¤•ा सबै बà¥à¤•मारà¥à¤•हरू पढà¥à¤¨à¤•ो लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ नोट: यो अनà¥à¤®à¤¤à¤¿à¤²à¤¾à¤ˆ तेसà¥à¤°à¥‹ पकà¥à¤· बà¥à¤°à¤¾à¤‰à¤œà¤°à¤¹à¤°à¥‚दà¥à¤µà¤¾à¤°à¤¾ वा वेब बà¥à¤°à¤¾à¤‰à¤œ गरà¥à¤¨à¥‡ कà¥à¤·à¤®à¤¤à¤¾à¤¦à¥à¤µà¤¾à¤°à¤¾ बलपूरà¥à¤µà¤• गराउन सकिà¤à¤¦à¥ˆà¤¨à¥¤"</string>
+ <string name="permlab_writeHistoryBookmarks" msgid="3714785165273314490">"वेब बà¥à¤•मारà¥à¤•हरू र इतिहास लेखà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_writeHistoryBookmarks" product="tablet" msgid="6825527469145760922">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई तपाईंको टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿà¤®à¤¾ भणà¥à¤¡à¤¾à¤° गरिà¤à¤•ो बà¥à¤°à¤¾à¤‰à¤œà¤°à¤•ो इतिहास वा बà¥à¤•मारà¥à¤•हरू परिमारà¥à¤œà¤¨ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ यसले अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई बà¥à¤°à¤¾à¤œà¤° डेटा मेटाउन वा परिमारà¥à¤œà¤¨ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिन सकà¥à¤¦à¤›à¥¤ टिपà¥à¤ªà¤£à¥€: यो अनà¥à¤®à¤¤à¤¿ वेब बà¥à¤°à¤¾à¤‰à¤œ गरà¥à¤¨à¥‡ कà¥à¤·à¤®à¤¤à¤¾à¤¹à¤°à¥‚को साथ तेसà¥à¤°à¥‹-पारà¥à¤Ÿà¥€ बà¥à¤°à¤¾à¤‰à¤œà¤° वा अनà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूदà¥à¤µà¤¾à¤°à¤¾ लागू गरिà¤à¤•ो होइन।"</string>
+ <string name="permdesc_writeHistoryBookmarks" product="default" msgid="8497389531014185509">"तपाईà¤à¤•ो फोनमा भणà¥à¤¡à¤¾à¤°à¤£ भà¤à¤•ो बà¥à¤°à¤¾à¤‰à¤œà¤°à¤•ो इतिहास वा बà¥à¤•मारà¥à¤•हरू परिवरà¥à¤¤à¤¨ गरà¥à¤¨à¤•ो लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ यसले सायद बà¥à¤°à¤¾à¤‰à¤œà¤° डेटालाई मेटà¥à¤¨ वा परिवरà¥à¤¤à¤¨ गरà¥à¤¨à¤•ो लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ नोट: वेब बà¥à¤°à¤¾à¤‰à¤œ गरà¥à¤¨à¥‡ कà¥à¤·à¤®à¤¤à¤¾à¤¸à¤¹à¤¿à¤¤à¤•ा अनà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरू वा तेसà¥à¤°à¥‹- पकà¥à¤· बà¥à¤°à¤¾à¤‰à¤œà¤°à¤¦à¥à¤µà¤¾à¤°à¤¾ सायद यस अनà¥à¤®à¤¤à¤¿à¤²à¤¾à¤ˆ लागॠगरà¥à¤¨ सकिंदैन।"</string>
+ <string name="permlab_setAlarm" msgid="1379294556362091814">"à¤à¤‰à¤Ÿà¤¾ आलरà¥à¤® सेट गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_setAlarm" msgid="316392039157473848">"सà¥à¤¥à¤¾à¤ªà¤¨à¤¾ गरिà¤à¤•ो सङà¥à¤•ेत घडी अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—मा सङà¥à¤•ेत समय मिलाउन अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ केही सङà¥à¤•ेत घडी अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूले यो सà¥à¤µà¤¿à¤§à¤¾ कारà¥à¤¯à¤¾à¤¨à¥à¤µà¤¯à¤¨ नगरà¥à¤¨ सकà¥à¤›à¤¨à¥à¥¤"</string>
+ <string name="permlab_addVoicemail" msgid="5525660026090959044">"भà¥à¤µà¤¾à¤‡à¤¸à¤®à¥‡à¤² थप गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_addVoicemail" msgid="6604508651428252437">"तपाईà¤à¤•ो भà¥à¤µà¤¾à¤‡à¤¸à¤®à¥‡à¤² इनबकà¥à¤¸à¤®à¤¾ सनà¥à¤¦à¥‡à¤¶ थपà¥à¤¨à¤•ो लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_writeGeolocationPermissions" msgid="5962224158955273932">"भूसà¥à¤¥à¤¾à¤¨ अनà¥à¤®à¤¤à¤¿à¤¹à¤°à¥‚ बà¥à¤°à¤¾à¤‰à¤œà¤° परिवरà¥à¤¤à¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_writeGeolocationPermissions" msgid="1083743234522638747">"बà¥à¤°à¤¾à¤‰à¤œà¤°à¤•ो भू-सà¥à¤¥à¤¾à¤¨ अनà¥à¤®à¤¤à¤¿à¤¹à¤°à¥‚ परिमारà¥à¤œà¤¨ गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ खराब अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूले सà¥à¤¥à¤¾à¤¨ सूचना मनपरी वेब साइटहरूमा पठाउने अनà¥à¤®à¤¤à¤¿à¤•ो लागि यसलाई पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨ सकà¥à¤›à¤¨à¥à¥¤"</string>
+ <string name="permlab_packageVerificationAgent" msgid="5568139100645829117">"पà¥à¤¯à¤•ेजहरूको निरीकà¥à¤·à¤£ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_packageVerificationAgent" msgid="8437590190990843381">"पà¥à¤¯à¤¾à¤•ेज सà¥à¤¥à¤¾à¤ªà¤¨à¤¾ योगà¥à¤¯ छ कि भनेर रà¥à¤œà¥ गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_bindPackageVerifier" msgid="4187786793360326654">"à¤à¤‰à¤Ÿà¤¾ पà¥à¤¯à¤¾à¤•ेज रà¥à¤œà¥à¤•रà¥à¤¤à¤¾à¤®à¤¾ बाà¤à¤§à¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_bindPackageVerifier" msgid="3180741773233862126">"होलà¥à¤¡à¤°à¤²à¤¾à¤ˆ पà¥à¤¯à¤¾à¤•ेज पà¥à¤°à¤®à¤¾à¤£à¤¿à¤¤à¤•रà¥à¤¤à¤¾à¤¹à¤°à¥‚को अनà¥à¤°à¥‹à¤§à¤¹à¤°à¥‚ बनाउन अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ सामानà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूलाई कहिले पनि आवशà¥à¤¯à¤• नपरà¥à¤¨ सकà¥à¤¦à¤›à¥¤"</string>
+ <string name="permlab_serialPort" msgid="546083327654631076">"पहà¥à¤à¤š सिरियल पोरà¥à¤Ÿà¤¹à¤°à¥‚"</string>
+ <string name="permdesc_serialPort" msgid="2991639985224598193">"होलà¥à¤¡à¤°à¤²à¤¾à¤ˆ SerialManager API पà¥à¤°à¤¯à¥‹à¤— गरेर सिरियल पोरà¥à¤Ÿà¤¹à¤°à¥‚ पहà¥à¤à¤š गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_accessContentProvidersExternally" msgid="5077774297943409285">"विषयसूची पà¥à¤°à¤¦à¤¾à¤¤à¤¾à¤²à¤¾à¤ˆ बाहà¥à¤¯ रूपमा पहà¥à¤à¤š गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_accessContentProvidersExternally" msgid="4544346486697853685">"सेलबाट धारकले विषयवसà¥à¤¤à¥ पà¥à¤°à¤¦à¤¾à¤¯à¤•हरूसमà¥à¤®à¤•ो पहà¥à¤à¤š पाउन अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ सामानà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूलाई कहिलà¥à¤¯à¥ˆ आवशà¥à¤¯à¤• परà¥à¤¦à¥ˆà¤¨à¥¤"</string>
+ <string name="permlab_updateLock" msgid="3527558366616680889">"सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤ उपकरण अपडेटहरू हतोतà¥à¤¸à¤¾à¤¹à¤¿à¤¤ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_updateLock" msgid="1655625832166778492">"होलà¥à¤¡à¤°à¤²à¤¾à¤ˆ उपकरण अपगà¥à¤°à¥‡à¤¡ गरà¥à¤¨ गैर पारसà¥à¤ªà¤°à¤¿à¤• पà¥à¤¨à¤ƒà¤¬à¥à¤Ÿà¤•ो लागि उचित समयको बारेमा पà¥à¤°à¤£à¤¾à¤²à¥€à¤®à¤¾ जानाकारी पà¥à¤°à¤¸à¥à¤¤à¤¾à¤µà¤•ो लागि अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="save_password_message" msgid="767344687139195790">"के तपाईं बà¥à¤°à¤¾à¤‰à¤œà¤°à¤²à¥‡ यो पासवरà¥à¤¡ समà¥à¤à¥‡à¤•ो चाहनà¥à¤¹à¥à¤¨à¥à¤›?"</string>
+ <string name="save_password_notnow" msgid="6389675316706699758">"अहिले होइन"</string>
+ <string name="save_password_remember" msgid="6491879678996749466">"समà¥à¤à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="save_password_never" msgid="8274330296785855105">"कहिलà¥à¤¯à¥ˆ पनि होइन"</string>
+ <string name="open_permission_deny" msgid="7374036708316629800">"यो पृषà¥à¤  खोलà¥à¤¨ तपाईà¤à¤²à¤¾à¤ˆ अनà¥à¤®à¤¤à¤¿ छैन।"</string>
+ <string name="text_copied" msgid="4985729524670131385">"कà¥à¤²à¤¿à¤ªà¤¬à¥‹à¤°à¥à¤¡à¤®à¤¾ पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ª गरिà¤à¤•ो पाठ।"</string>
+ <string name="more_item_label" msgid="4650918923083320495">"बढी"</string>
+ <string name="prepend_shortcut_label" msgid="2572214461676015642">"मेनà¥+"</string>
+ <string name="menu_space_shortcut_label" msgid="2410328639272162537">"ठाउà¤"</string>
+ <string name="menu_enter_shortcut_label" msgid="2743362785111309668">"पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¿ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="menu_delete_shortcut_label" msgid="3658178007202748164">"मेटाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="search_go" msgid="8298016669822141719">"खोजà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="searchview_description_search" msgid="6749826639098512120">"खोजà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="searchview_description_query" msgid="5911778593125355124">"जिजà¥à¤žà¤¾à¤¸à¤¾ खोज गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="searchview_description_clear" msgid="1330281990951833033">"पà¥à¤°à¤¶à¥â€à¤¨ हटाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="searchview_description_submit" msgid="2688450133297983542">"जिजà¥à¤žà¤¾à¤¸à¤¾ पेस गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="searchview_description_voice" msgid="2453203695674994440">"भà¥à¤µà¤¾à¤‡à¤¸ खोजी"</string>
+ <string name="enable_explore_by_touch_warning_title" msgid="7460694070309730149">"छोà¤à¤° अनà¥à¤µà¥‡à¤·à¤£ गरà¥à¤¨à¥‡ सकà¥à¤·à¤® पारà¥à¤¨ चाहनॠहà¥à¤¨à¥à¤›?"</string>
+ <string name="enable_explore_by_touch_warning_message" product="tablet" msgid="8655887539089910577">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g>ले सà¥à¤ªà¤°à¥à¤·à¤¦à¥à¤µà¤¾à¤°à¤¾ अनà¥à¤µà¥‡à¤·à¤£ सकà¥à¤·à¤® गरà¥à¤¨ चाहनà¥à¤›à¥¤ सà¥à¤ªà¤°à¥à¤·à¤¦à¥à¤µà¤¾à¤°à¤¾ अनà¥à¤µà¥‡à¤·à¤£ सकà¥à¤·à¤® भà¤à¤•ो बेला, तपाईठआफà¥à¤¨à¥‹ औà¤à¤²à¤¾à¤•ो मà¥à¤¨à¤¿ भà¤à¤•ा विषयवसà¥à¤¤à¥à¤¹à¤°à¥‚ बारे सà¥à¤¨à¥à¤¨ वा विवरण हेरà¥à¤¨ सकà¥à¤¨à¥à¤¹à¥à¤¨à¥à¤› वा टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿà¤¸à¤à¤— अनà¥à¤¤à¤°à¥à¤•à¥à¤°à¤¿à¤¯à¤¾ गरà¥à¤¨ इशारा गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="enable_explore_by_touch_warning_message" product="default" msgid="2708199672852373195">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g>ले सà¥à¤ªà¤°à¥à¤·à¤¦à¥à¤µà¤¾à¤°à¤¾ अनà¥à¤µà¥‡à¤·à¤£ सकà¥à¤·à¤® गरà¥à¤¨ चाहनà¥à¤›à¥¤ सà¥à¤ªà¤°à¥à¤·à¤¦à¥à¤µà¤¾à¤°à¤¾ अनà¥à¤µà¥‡à¤·à¤£ सकà¥à¤·à¤® भà¤à¤•ो बेला तपाईठआफà¥à¤¨à¥‹ औà¤à¤²à¤¾à¤•ो मà¥à¤¨à¤¿ भà¤à¤•ा विषयवसà¥à¤¤à¥à¤¹à¤°à¥‚ बारे सà¥à¤¨à¥à¤¨ वा विवरण हेरà¥à¤¨ सकà¥à¤¨à¥à¤¹à¥à¤¨à¥à¤› वा फोनसà¤à¤— अनà¥à¤¤à¤°à¥à¤•à¥à¤°à¤¿à¤¯à¤¾ गरà¥à¤¨ इशारा गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="oneMonthDurationPast" msgid="7396384508953779925">"१ महिना अघि"</string>
+ <string name="beforeOneMonthDurationPast" msgid="909134546836499826">"१ महिना अघि"</string>
+ <plurals name="num_seconds_ago">
+ <item quantity="one" msgid="4869870056547896011">"१ सेकेनà¥à¤¡ अघि"</item>
+ <item quantity="other" msgid="3903706804349556379">"<xliff:g id="COUNT">%d</xliff:g> सेकेनà¥à¤¡ अघि"</item>
+ </plurals>
+ <plurals name="num_minutes_ago">
+ <item quantity="one" msgid="3306787433088810191">"१ मिनेट अघि"</item>
+ <item quantity="other" msgid="2176942008915455116">"<xliff:g id="COUNT">%d</xliff:g> मिनेट अघि"</item>
+ </plurals>
+ <plurals name="num_hours_ago">
+ <item quantity="one" msgid="9150797944610821849">"१ घनà¥à¤Ÿà¤¾ अघि"</item>
+ <item quantity="other" msgid="2467273239587587569">"<xliff:g id="COUNT">%d</xliff:g> घनà¥à¤Ÿà¤¾ अघि"</item>
+ </plurals>
+ <plurals name="last_num_days">
+ <item quantity="other" msgid="3069992808164318268">"अनà¥à¤¤à¤¿à¤® <xliff:g id="COUNT">%d</xliff:g> दिन"</item>
+ </plurals>
+ <string name="last_month" msgid="3959346739979055432">"अनà¥à¤¤à¤¿à¤® महिना"</string>
+ <string name="older" msgid="5211975022815554840">"पà¥à¤°à¤¾à¤¨à¥‹"</string>
+ <plurals name="num_days_ago">
+ <item quantity="one" msgid="861358534398115820">"हिजो"</item>
+ <item quantity="other" msgid="2479586466153314633">"<xliff:g id="COUNT">%d</xliff:g> दिन अघि"</item>
+ </plurals>
+ <plurals name="in_num_seconds">
+ <item quantity="one" msgid="2729745560954905102">"१ सेकेनà¥à¤¡à¤®à¤¾"</item>
+ <item quantity="other" msgid="1241926116443974687">"<xliff:g id="COUNT">%d</xliff:g> सेकेनà¥à¤¡à¤®à¤¾"</item>
+ </plurals>
+ <plurals name="in_num_minutes">
+ <item quantity="one" msgid="8793095251325200395">"१ मिनेटमा"</item>
+ <item quantity="other" msgid="3330713936399448749">"<xliff:g id="COUNT">%d</xliff:g>मिनेटमा"</item>
+ </plurals>
+ <plurals name="in_num_hours">
+ <item quantity="one" msgid="7164353342477769999">"१ घनà¥à¤Ÿà¤¾à¤®à¤¾"</item>
+ <item quantity="other" msgid="547290677353727389">"<xliff:g id="COUNT">%d</xliff:g> घनà¥à¤Ÿà¤¾à¤®à¤¾"</item>
+ </plurals>
+ <plurals name="in_num_days">
+ <item quantity="one" msgid="5413088743009839518">"भोलि"</item>
+ <item quantity="other" msgid="5109449375100953247">"<xliff:g id="COUNT">%d</xliff:g> दिनमा"</item>
+ </plurals>
+ <plurals name="abbrev_num_seconds_ago">
+ <item quantity="one" msgid="1849036840200069118">"१ सेकेनà¥à¤¡ अघि"</item>
+ <item quantity="other" msgid="3699169366650930415">"<xliff:g id="COUNT">%d</xliff:g> सेकेनà¥à¤¡ अगाडि"</item>
+ </plurals>
+ <plurals name="abbrev_num_minutes_ago">
+ <item quantity="one" msgid="6361490147113871545">"१ मिनेट अघि"</item>
+ <item quantity="other" msgid="851164968597150710">"<xliff:g id="COUNT">%d</xliff:g> मिनेट अघि"</item>
+ </plurals>
+ <plurals name="abbrev_num_hours_ago">
+ <item quantity="one" msgid="4796212039724722116">"१ घनà¥à¤Ÿà¤¾ अघि"</item>
+ <item quantity="other" msgid="6889970745748538901">"<xliff:g id="COUNT">%d</xliff:g> घनà¥à¤Ÿà¤¾ अघि"</item>
+ </plurals>
+ <plurals name="abbrev_num_days_ago">
+ <item quantity="one" msgid="8463161711492680309">"हिजो"</item>
+ <item quantity="other" msgid="3453342639616481191">"<xliff:g id="COUNT">%d</xliff:g> दिन अघि"</item>
+ </plurals>
+ <plurals name="abbrev_in_num_seconds">
+ <item quantity="one" msgid="5842225370795066299">"१ सेकनà¥à¤¡"</item>
+ <item quantity="other" msgid="5495880108825805108">"<xliff:g id="COUNT">%d</xliff:g> सेकेनà¥à¤¡à¤®à¤¾"</item>
+ </plurals>
+ <plurals name="abbrev_in_num_minutes">
+ <item quantity="one" msgid="562786149928284878">"१ मिनेटमा"</item>
+ <item quantity="other" msgid="4216113292706568726">"<xliff:g id="COUNT">%d</xliff:g> मिनेटमा"</item>
+ </plurals>
+ <plurals name="abbrev_in_num_hours">
+ <item quantity="one" msgid="3274708118124045246">"१ घनà¥à¤Ÿà¤¾à¤®à¤¾"</item>
+ <item quantity="other" msgid="3705373766798013406">"<xliff:g id="COUNT">%d</xliff:g> घनà¥à¤Ÿà¤¾à¤®à¤¾"</item>
+ </plurals>
+ <plurals name="abbrev_in_num_days">
+ <item quantity="one" msgid="2178576254385739855">"भोलि"</item>
+ <item quantity="other" msgid="2973062968038355991">"दिन<xliff:g id="COUNT">%d</xliff:g> मा"</item>
+ </plurals>
+ <string name="preposition_for_date" msgid="9093949757757445117">"<xliff:g id="DATE">%s</xliff:g> मा"</string>
+ <string name="preposition_for_time" msgid="5506831244263083793">"<xliff:g id="TIME">%s</xliff:g> मा"</string>
+ <string name="preposition_for_year" msgid="5040395640711867177">"<xliff:g id="YEAR">%s</xliff:g> मा"</string>
+ <string name="day" msgid="8144195776058119424">"दिन"</string>
+ <string name="days" msgid="4774547661021344602">"दिन"</string>
+ <string name="hour" msgid="2126771916426189481">"घनà¥à¤Ÿà¤¾"</string>
+ <string name="hours" msgid="894424005266852993">"घनà¥à¤Ÿà¤¾"</string>
+ <string name="minute" msgid="9148878657703769868">"मिनेट"</string>
+ <string name="minutes" msgid="5646001005827034509">"मिनेट"</string>
+ <string name="second" msgid="3184235808021478">"सेकेनà¥à¤¡"</string>
+ <string name="seconds" msgid="3161515347216589235">"सेकेनà¥à¤¡"</string>
+ <string name="week" msgid="5617961537173061583">"हपà¥à¤¤à¤¾"</string>
+ <string name="weeks" msgid="6509623834583944518">"हपà¥à¤¤à¤¾à¤¹à¤°à¥‚"</string>
+ <string name="year" msgid="4001118221013892076">"वरà¥à¤·"</string>
+ <string name="years" msgid="6881577717993213522">"वरà¥à¤·à¤¹à¤°à¥‚"</string>
+ <plurals name="duration_seconds">
+ <item quantity="one" msgid="6962015528372969481">"१ सेकेनà¥à¤¡"</item>
+ <item quantity="other" msgid="1886107766577166786">"<xliff:g id="COUNT">%d</xliff:g> सेकेनà¥à¤¡"</item>
+ </plurals>
+ <plurals name="duration_minutes">
+ <item quantity="one" msgid="4915414002546085617">"१ मिनेट"</item>
+ <item quantity="other" msgid="3165187169224908775">"<xliff:g id="COUNT">%d</xliff:g> मिनेट"</item>
+ </plurals>
+ <plurals name="duration_hours">
+ <item quantity="one" msgid="8917467491248809972">"१ घनà¥à¤Ÿà¤¾"</item>
+ <item quantity="other" msgid="3863962854246773930">"<xliff:g id="COUNT">%d</xliff:g> घनà¥à¤Ÿà¤¾"</item>
+ </plurals>
+ <string name="VideoView_error_title" msgid="3534509135438353077">"भिडियो समसà¥à¤¯à¤¾"</string>
+ <string name="VideoView_error_text_invalid_progressive_playback" msgid="3186670335938670444">"यो भिडियो यस उपकरणको लागि सà¥à¤Ÿà¥à¤°à¤¿à¤®à¤¿à¤™ गरà¥à¤¨ मानà¥à¤¯ छैन।"</string>
+ <string name="VideoView_error_text_unknown" msgid="3450439155187810085">"यो भिडियो चलाउन सकà¥à¤¦à¥ˆà¤¨à¥¤"</string>
+ <string name="VideoView_error_button" msgid="2822238215100679592">"ठीक छ"</string>
+ <string name="relative_time" msgid="1818557177829411417">"<xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="noon" msgid="7245353528818587908">"मधà¥à¤¯à¤¾à¤¨à¥à¤¨"</string>
+ <string name="Noon" msgid="3342127745230013127">"मधà¥à¤¯à¤¾à¤¨à¥à¤¹"</string>
+ <string name="midnight" msgid="7166259508850457595">"मधà¥à¤¯à¤°à¤¾à¤¤"</string>
+ <string name="Midnight" msgid="5630806906897892201">"मधà¥à¤¯à¤°à¤¾à¤¤"</string>
+ <string name="elapsed_time_short_format_mm_ss" msgid="4431555943828711473">"<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" msgid="1846071997616654124">"<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" msgid="6876518925844129331">"सबैलाई चयन गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="cut" msgid="3092569408438626261">"काटà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="copy" msgid="2681946229533511987">"पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿ बनाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="paste" msgid="5629880836805036433">"टाà¤à¤¸à¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="replace" msgid="5781686059063148930">"विसà¥à¤¥à¤¾à¤ªà¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥â€¦"</string>
+ <string name="delete" msgid="6098684844021697789">"मेटà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="copyUrl" msgid="2538211579596067402">"URL को पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ª गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="selectTextMode" msgid="1018691815143165326">"पाठ चयन गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="textSelectionCABTitle" msgid="5236850394370820357">"पाठ चयनता"</string>
+ <string name="addToDictionary" msgid="4352161534510057874">"शबà¥à¤¦à¤•ोशमा थपà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="deleteText" msgid="6979668428458199034">"मेटà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="inputMethod" msgid="1653630062304567879">"निवेश विधि"</string>
+ <string name="editTextMenuTitle" msgid="4909135564941815494">"पाठ कारà¥à¤¯à¤¹à¤°à¥‚"</string>
+ <string name="low_internal_storage_view_title" msgid="5576272496365684834">"भणà¥à¤¡à¤¾à¤°à¤£ ठाउठसकिà¤à¤¦à¥ˆ छ"</string>
+ <string name="low_internal_storage_view_text" msgid="6640505817617414371">"सायद केही पà¥à¤°à¤£à¤¾à¤²à¥€ कारà¥à¤¯à¤•à¥à¤°à¤®à¤¹à¤°à¥‚ले काम गरà¥à¤¦à¥ˆà¤¨à¤¨à¥"</string>
+ <string name="app_running_notification_title" msgid="8718335121060787914">"<xliff:g id="APP_NAME">%1$s</xliff:g> चलिरहेको छ"</string>
+ <string name="app_running_notification_text" msgid="4653586947747330058">"थप सूचनाको लागि छà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ वा अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— बनà¥à¤¦ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="ok" msgid="5970060430562524910">"ठिक छ"</string>
+ <string name="cancel" msgid="6442560571259935130">"रदà¥à¤¦ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="yes" msgid="5362982303337969312">"ठिक छ"</string>
+ <string name="no" msgid="5141531044935541497">"रदà¥à¤¦ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="dialog_alert_title" msgid="2049658708609043103">"सावधानी"</string>
+ <string name="loading" msgid="7933681260296021180">"लोड हà¥à¤à¤¦à¥ˆ..."</string>
+ <string name="capital_on" msgid="1544682755514494298">"चालà¥"</string>
+ <string name="capital_off" msgid="6815870386972805832">"बनà¥à¤¦"</string>
+ <string name="whichApplication" msgid="4533185947064773386">"पà¥à¤°à¤¯à¥‹à¤— गरेर कारबाही पà¥à¤°à¤¾ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="alwaysUse" msgid="4583018368000610438">"यस कारà¥à¤¯à¤•ो लागि पूरà¥à¤µà¤¨à¤¿à¤°à¥à¤§à¤¾à¤°à¤¿à¤¤à¤¬à¤¾à¤Ÿ पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="clearDefaultHintMsg" msgid="3252584689512077257">"पà¥à¤°à¤£à¤¾à¤²à¥€ सेटिङहरूमा पूरà¥à¤µà¤¨à¤¿à¤°à¥à¤§à¤¾à¤°à¤¿à¤¤à¤²à¤¾à¤ˆ हटाउनà¥à¤¹à¥‹à¤¸à¥ &gt; अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरू &gt; डाउनलोड।"</string>
+ <string name="chooseActivity" msgid="7486876147751803333">"à¤à¤‰à¤Ÿà¤¾ कारà¥à¤¯à¤•ो चयन गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="chooseUsbActivity" msgid="6894748416073583509">"USB उपकरणको लागि à¤à¤‰à¤Ÿà¤¾ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— छानà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="noApplications" msgid="2991814273936504689">"कà¥à¤¨à¥ˆ पनि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूले यो कारà¥à¤¯ गरà¥à¤¨ सकà¥à¤¦à¥ˆà¤¨à¤¨à¥à¥¤"</string>
+ <string name="aerr_title" msgid="1905800560317137752"></string>
+ <string name="aerr_application" msgid="932628488013092776">"दà¥à¤°à¥à¤­à¤¾à¤—à¥à¤¯à¤µà¤¶, <xliff:g id="APPLICATION">%1$s</xliff:g>ले रोकेको छ।"</string>
+ <string name="aerr_process" msgid="4507058997035697579">"दà¥à¤°à¥à¤­à¤¾à¤—à¥à¤¯à¤µà¤¶, पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ <xliff:g id="PROCESS">%1$s</xliff:g> बनà¥à¤¦ भयो।"</string>
+ <string name="anr_title" msgid="4351948481459135709"></string>
+ <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g>ले कारà¥à¤¯ गरिरहेको छैन।\n\nके तपाईठयसलाई बनà¥à¤¦ गरà¥à¤¨ चाहनॠहà¥à¤¨à¥à¤›?"</string>
+ <string name="anr_activity_process" msgid="5776209883299089767">"गतिविधि <xliff:g id="ACTIVITY">%1$s</xliff:g> ले पà¥à¤°à¤¤à¤¿à¤•à¥à¤°à¤¿à¤¯à¤¾ देखाइरहेको छैन।\n\nके तपाईं यसलाई बनà¥à¤¦ गरà¥à¤¨ चाहनॠहà¥à¤¨à¥à¤›?"</string>
+ <string name="anr_application_process" msgid="8941757607340481057">"<xliff:g id="APPLICATION">%1$s</xliff:g> जवाफ दिइरहेको छैन। के तपाईठयसलाई बनà¥à¤¦ गरà¥à¤¨ चाहनॠहà¥à¤¨à¥à¤›?"</string>
+ <string name="anr_process" msgid="6513209874880517125">"पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ <xliff:g id="PROCESS">%1$s</xliff:g>ले कारà¥à¤¯ गरिरहेको छैन।\n\nके तपाईठयसलाई बनà¥à¤¦ गरà¥à¤¨ चाहनॠहà¥à¤¨à¥à¤›?"</string>
+ <string name="force_close" msgid="8346072094521265605">"ठिक छ"</string>
+ <string name="report" msgid="4060218260984795706">"रिपोरà¥à¤Ÿ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="wait" msgid="7147118217226317732">"पà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="webpage_unresponsive" msgid="3272758351138122503">"पृषà¥à¤  गैर जिमà¥à¤®à¥‡à¤µà¤¾à¤°à¥€ भà¤à¤•ो छ।\n\nके तपाईं यसलाई बनà¥à¤¦ गरà¥à¤¨ चाहनà¥à¤¹à¥à¤¨à¥à¤›?"</string>
+ <string name="launch_warning_title" msgid="1547997780506713581">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— पà¥à¤¨à¤ƒ निरà¥à¤¦à¥‡à¤¶à¥€à¤¤"</string>
+ <string name="launch_warning_replace" msgid="6202498949970281412">"<xliff:g id="APP_NAME">%1$s</xliff:g> अहिले चलिरहेको छ।"</string>
+ <string name="launch_warning_original" msgid="188102023021668683">"<xliff:g id="APP_NAME">%1$s</xliff:g> वासà¥à¤¤à¤µà¤¿à¤• सà¥à¤°à¥à¤µà¤¾à¤¤ भà¤à¤•ो थियो।"</string>
+ <string name="screen_compat_mode_scale" msgid="3202955667675944499">"सà¥à¤•ेल"</string>
+ <string name="screen_compat_mode_show" msgid="4013878876486655892">"सधैठदेखाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="screen_compat_mode_hint" msgid="1064524084543304459">"पà¥à¤°à¤£à¤¾à¤²à¥€ सेटिङहरूमा यसलाई पà¥à¤¨à¤ƒà¤¸à¤•à¥à¤·à¤® गराउनà¥à¤¹à¥‹à¤¸à¥ &gt; अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरू &gt; डाउनलोड गरेको।"</string>
+ <string name="smv_application" msgid="3307209192155442829">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— <xliff:g id="APPLICATION">%1$s</xliff:g> (पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ <xliff:g id="PROCESS">%2$s</xliff:g>) ले यसको सà¥à¤µà¤¯à¤‚-लागॠगरिà¤à¤•ो सà¥à¤Ÿà¥à¤°à¤¿à¤Ÿà¤®à¥‹à¤¡ नीति उलङà¥à¤˜à¤¨ गरेको छ।"</string>
+ <string name="smv_process" msgid="5120397012047462446">"पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ <xliff:g id="PROCESS">%1$s</xliff:g> यसको आफà¥à¤¨à¥ˆ कडामोड नीतिका कारण उलà¥à¤²à¤™à¥à¤˜à¤¨ गरिà¤à¤•ो छ।"</string>
+ <string name="android_upgrading_title" msgid="1584192285441405746">"à¤à¤¨à¥à¤¡à¥à¤°à¥‹à¤‡à¤¡ अपगà¥à¤°à¥‡à¤¡ हà¥à¤à¤¦à¥ˆà¤›â€¦"</string>
+ <string name="android_upgrading_apk" msgid="7904042682111526169">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— अनà¥à¤•à¥à¤² हà¥à¤à¤¦à¥ˆ <xliff:g id="NUMBER_0">%1$d</xliff:g> को <xliff:g id="NUMBER_1">%2$d</xliff:g>।"</string>
+ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"सà¥à¤°à¥à¤µà¤¾à¤¤ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरू।"</string>
+ <string name="android_upgrading_complete" msgid="1405954754112999229">"बà¥à¤Ÿ पà¥à¤°à¤¾ हà¥à¤à¤¦à¥ˆà¥¤"</string>
+ <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> चलिरहेको छ"</string>
+ <string name="heavy_weight_notification_detail" msgid="1721681741617898865">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—मा सà¥à¤µà¤¿à¤š गरà¥à¤¨ छà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरू सà¥à¤µà¤¿à¤š गरà¥à¤¨à¥‡ हो?"</string>
+ <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"अरà¥à¤•ो अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— पहिले नै चालॠछ जà¥à¤¨ तपाईंले à¤à¤‰à¤Ÿà¤¾ नयाठसà¥à¤°à¥ गरà¥à¤¨à¥ अघि बनà¥à¤¦ गरà¥à¤¨à¥à¤ªà¤°à¥à¤¨à¥‡ हà¥à¤¨à¥à¤›à¥¤"</string>
+ <string name="old_app_action" msgid="493129172238566282">"<xliff:g id="OLD_APP">%1$s</xliff:g> मा फरà¥à¤•नà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="old_app_description" msgid="2082094275580358049">"नयाठअनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— सà¥à¤°à¥ नगरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="new_app_action" msgid="5472756926945440706">"<xliff:g id="OLD_APP">%1$s</xliff:g> सà¥à¤°à¥ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="new_app_description" msgid="1932143598371537340">"बचत नगरी पà¥à¤°à¤¾à¤¨à¥‹ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— रोकà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="sendText" msgid="5209874571959469142">"पाठको लागि à¤à¤‰à¤Ÿà¤¾ पà¥à¤°à¤•ारà¥à¤¯ छानà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="volume_ringtone" msgid="6885421406845734650">"बजाउने मातà¥à¤°à¤¾"</string>
+ <string name="volume_music" msgid="5421651157138628171">"मिडियाको मातà¥à¤°à¤¾"</string>
+ <string name="volume_music_hint_playing_through_bluetooth" msgid="9165984379394601533">"बà¥à¤²à¥à¤Ÿà¥à¤¥à¤•ो माधà¥à¤¯à¤®à¤¦à¥à¤µà¤¾à¤°à¤¾ बजाइदै छ।"</string>
+ <string name="volume_music_hint_silent_ringtone_selected" msgid="8310739960973156272">"शानà¥à¤¤ रिङà¥à¤—टोन सेट"</string>
+ <string name="volume_call" msgid="3941680041282788711">"इन-कल भोलà¥à¤¯à¥à¤®"</string>
+ <string name="volume_bluetooth_call" msgid="2002891926351151534">"बà¥à¤²à¥à¤Ÿà¥à¤¥ भितà¥à¤°à¥€-कल मातà¥à¤°à¤¾"</string>
+ <string name="volume_alarm" msgid="1985191616042689100">"आलरà¥à¤® मातà¥à¤°à¤¾"</string>
+ <string name="volume_notification" msgid="2422265656744276715">"सूचना मातà¥à¤°à¤¾"</string>
+ <string name="volume_unknown" msgid="1400219669770445902">"मातà¥à¤°à¤¾"</string>
+ <string name="volume_icon_description_bluetooth" msgid="6538894177255964340">"बà¥à¤²à¥à¤Ÿà¥à¤¥ भोलà¥à¤¯à¥à¤®"</string>
+ <string name="volume_icon_description_ringer" msgid="3326003847006162496">"घनà¥à¤Ÿà¤¿à¤•ो आवाज मातà¥à¤°à¤¾"</string>
+ <string name="volume_icon_description_incall" msgid="8890073218154543397">"कला मातà¥à¤°à¤¾"</string>
+ <string name="volume_icon_description_media" msgid="4217311719665194215">"मिडियाको मातà¥à¤°à¤¾"</string>
+ <string name="volume_icon_description_notification" msgid="7044986546477282274">"सूचना भोलà¥à¤¯à¥à¤®"</string>
+ <string name="ringtone_default" msgid="3789758980357696936">"पूरà¥à¤µà¤¨à¤¿à¤°à¥à¤§à¤¾à¤°à¤¿à¤¤ रिङटोन"</string>
+ <string name="ringtone_default_with_actual" msgid="8129563480895990372">"पूरà¥à¤µà¤¨à¤¿à¤°à¥à¤§à¤¾à¤°à¤¿à¤¤ रिङटोन (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_silent" msgid="7937634392408977062">"कà¥à¤¨à¥ˆ पनि होइन"</string>
+ <string name="ringtone_picker_title" msgid="3515143939175119094">"घनà¥à¤Ÿà¥€à¤•ा सà¥à¤µà¤°à¤¹à¤°à¥‚"</string>
+ <string name="ringtone_unknown" msgid="5477919988701784788">"अजà¥à¤žà¤¾à¤¤ रिङटोन"</string>
+ <plurals name="wifi_available">
+ <item quantity="one" msgid="6654123987418168693">"वाइ-फाइ नेटवरà¥à¤• उपलबà¥à¤§ छ"</item>
+ <item quantity="other" msgid="4192424489168397386">"वाइ-फाइ नेटवरà¥à¤•हरू उपलबà¥à¤§"</item>
+ </plurals>
+ <plurals name="wifi_available_detailed">
+ <item quantity="one" msgid="1634101450343277345">"खà¥à¤²à¥à¤²à¤¾ वाइ-फाइ नेटवरà¥à¤• उपलबà¥à¤§ छ"</item>
+ <item quantity="other" msgid="7915895323644292768">"खà¥à¤²à¥à¤²à¤¾ वाइ-फाइ नेटवरà¥à¤• उपलबà¥à¤§ छ"</item>
+ </plurals>
+ <string name="wifi_available_sign_in" msgid="4029489716605255386">"वाइ-फाइ नेटवरà¥à¤•मा साइन गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="network_available_sign_in" msgid="8495155593358054676">"नेटवरà¥à¤•मा साइन गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
+ <skip />
+ <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"वाइ-फाइसà¤à¤— जडान गरà¥à¤¨ सकेन"</string>
+ <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" कमजोर इनà¥à¤Ÿà¤°à¤¨à¥‡à¤Ÿ जडान छ।"</string>
+ <string name="wifi_p2p_dialog_title" msgid="97611782659324517">"वाइ-फाइ पà¥à¤°à¤¤à¥à¤¯à¤•à¥à¤·"</string>
+ <string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"वाइ-फाइ सिधा सà¥à¤°à¥ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤ यसले वाइ-फाइ गà¥à¤°à¤¾à¤¹à¤•/हटà¥à¤¸à¥à¤ªà¤Ÿà¤²à¤¾à¤ˆ बनà¥à¤¦ गराउने छ।"</string>
+ <string name="wifi_p2p_failed_message" msgid="3763669677935623084">"वाइ-फाइ सिधा सà¥à¤°à¥ हà¥à¤¨ सकेन।"</string>
+ <string name="wifi_p2p_enabled_notification_title" msgid="2068321881673734886">"वाइ-फाइ पà¥à¤°à¤¤à¥à¤¯à¤•à¥à¤· खà¥à¤²à¥à¤²à¤¾ छ"</string>
+ <string name="wifi_p2p_enabled_notification_message" msgid="1638949953993894335">"सेटिङहरूको लागि छà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="accept" msgid="1645267259272829559">"सà¥à¤µà¥€à¤•ारà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="decline" msgid="2112225451706137894">"असà¥à¤µà¥€à¤•ार गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="wifi_p2p_invitation_sent_title" msgid="1318975185112070734">"निमनà¥à¤¤à¥à¤°à¤£à¤¾ पठाइà¤à¤•ो"</string>
+ <string name="wifi_p2p_invitation_to_connect_title" msgid="4958803948658533637">"जडानमा निमनà¥à¤¤à¥à¤°à¤£à¤¾"</string>
+ <string name="wifi_p2p_from_message" msgid="570389174731951769">"बाट:"</string>
+ <string name="wifi_p2p_to_message" msgid="248968974522044099">"पà¥à¤°à¤¾à¤ªà¤•:"</string>
+ <string name="wifi_p2p_enter_pin_message" msgid="5920929550367828970">"आवशà¥à¤¯à¤• PIN टाइप गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥:"</string>
+ <string name="wifi_p2p_show_pin_message" msgid="8530563323880921094">"PIN:"</string>
+ <string name="wifi_p2p_frequency_conflict_message" product="tablet" msgid="8012981257742232475">"यो <xliff:g id="DEVICE_NAME">%1$s</xliff:g>सà¤à¤— जोडिà¤à¤•ो बेला टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿ असà¥à¤¥à¤¾à¤¯à¥€ रूपमा वाइ-फाइबाट विचà¥à¤›à¥‡à¤¦ गरिने छ।"</string>
+ <string name="wifi_p2p_frequency_conflict_message" product="default" msgid="7363907213787469151">"जब यो <xliff:g id="DEVICE_NAME">%1$s</xliff:g> सà¤à¤— जडित हà¥à¤¨à¥à¤›, फोन असà¥à¤¥à¤¾à¤¯à¥€ रूपमा वाइ-फाइबाट विचà¥à¤›à¥‡à¤¦ हà¥à¤¨à¥‡ छ"</string>
+ <string name="select_character" msgid="3365550120617701745">"अकà¥à¤·à¤°à¤¹à¤°à¥‚ पà¥à¤°à¤µà¥‡à¤¶ गराउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="sms_control_title" msgid="7296612781128917719">"SMS सनà¥à¤¦à¥‡à¤¶à¤¹à¤°à¥‚ पठाइà¤à¤¦à¥ˆ"</string>
+ <string name="sms_control_message" msgid="3867899169651496433">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ले धरै संखà¥à¤¯à¤¾à¤®à¤¾ SMS सनà¥à¤¦à¥‡à¤¶à¤¹à¤°à¥‚ पठाउà¤à¤¦à¥ˆà¤›à¥¤ के तपाईठयस अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई सनà¥à¤¦à¥‡à¤¶à¤¹à¤°à¥‚ पठाउन सà¥à¤šà¤¾à¤°à¥ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिन चाहनॠहà¥à¤¨à¥à¤›?"</string>
+ <string name="sms_control_yes" msgid="3663725993855816807">"अनà¥à¤®à¤¤à¤¿ दिनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="sms_control_no" msgid="625438561395534982">"असà¥à¤µà¥€à¤•ार गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="sms_short_code_confirm_message" msgid="1645436466285310855">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; के तपाईठसनà¥à¤¦à¥‡à¤¶ पठाउन चाहà¥à¤¨à¥ हà¥à¤¨à¥à¤› &lt;b&gt;<xliff:g id="DEST_ADDRESS">%2$s</xliff:g>&lt;/b&gt;."</string>
+ <string name="sms_short_code_details" msgid="3492025719868078457">"यसले "<font fgcolor="#ffffb060">" शà¥à¤²à¥à¤• लगाउन सकà¥à¤›"</font>" तपाईà¤à¤•ो मोबाइल खातामा।"</string>
+ <string name="sms_premium_short_code_details" msgid="5523826349105123687"><font fgcolor="#ffffb060">"यसले तपाईंको मोबाइल खातामा चारà¥à¤œà¤¹à¤°à¥‚ उतà¥à¤ªà¤¨à¥à¤¨ गरà¥à¤¦à¤›à¥¤"</font></string>
+ <string name="sms_short_code_confirm_allow" msgid="4458878637111023413">"पठाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="sms_short_code_confirm_deny" msgid="2927389840209170706">"रदà¥à¤¦ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="sms_short_code_remember_choice" msgid="5289538592272218136">"मेरो छनौट याद राखà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="sms_short_code_remember_undo_instruction" msgid="4960944133052287484">"तपाईठयसलाई पछि सेटिङहरूमा बदलà¥à¤¨ सकà¥à¤¨à¥ हà¥à¤¨à¥à¤› &gt; अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरू"</string>
+ <string name="sms_short_code_confirm_always_allow" msgid="3241181154869493368">"सधैठअनà¥à¤®à¤¤à¤¿ दिनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="sms_short_code_confirm_never_allow" msgid="446992765774269673">"कहिलà¥à¤¯à¥ˆ अनà¥à¤®à¤¤à¤¿ नदिनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="sim_removed_title" msgid="6227712319223226185">"SIM कारà¥à¤¡ हटाइयो"</string>
+ <string name="sim_removed_message" msgid="2333164559970958645">"à¤à¤‰à¤Ÿà¤¾ मानà¥à¤¯ SIM कारà¥à¤¡ राखेर पà¥à¤¨à¤ƒà¤¸à¥à¤Ÿà¤¾à¤°à¥à¤Ÿ नगरेसमà¥à¤® मोबाइल नेटवरà¥à¤• उपलबà¥à¤§ हà¥à¤¨à¥‡ छैन।"</string>
+ <string name="sim_done_button" msgid="827949989369963775">"भयो"</string>
+ <string name="sim_added_title" msgid="3719670512889674693">"SIM कारà¥à¤¡ थप गरियो"</string>
+ <string name="sim_added_message" msgid="6599945301141050216">"मोबाइल नेटवरà¥à¤• पहà¥à¤à¤š गरà¥à¤¨ तपाईà¤à¤•ो उपकरण पà¥à¤¨à¤ƒà¤¸à¥à¤Ÿà¤¾à¤°à¥à¤Ÿ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="sim_restart_button" msgid="4722407842815232347">"पà¥à¤¨à¤ƒà¤¸à¥à¤Ÿà¤¾à¤°à¥à¤Ÿ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="time_picker_dialog_title" msgid="8349362623068819295">"समय मिलाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="date_picker_dialog_title" msgid="5879450659453782278">"मिति मिलाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="date_time_set" msgid="5777075614321087758">"सेट गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="date_time_done" msgid="2507683751759308828">"भयो"</string>
+ <string name="perms_new_perm_prefix" msgid="8257740710754301407"><font size="12" fgcolor="#ff33b5e5">"नयाà¤: "</font></string>
+ <string name="perms_description_app" msgid="5139836143293299417">"<xliff:g id="APP_NAME">%1$s</xliff:g>दà¥à¤µà¤¾à¤°à¤¾ पà¥à¤°à¤¦à¤¾à¤¨ गरिà¤à¤•ो।"</string>
+ <string name="no_permissions" msgid="7283357728219338112">"कà¥à¤¨à¥ˆ अनà¥à¤®à¤¤à¤¿ आवशà¥à¤¯à¤• छैन"</string>
+ <string name="perm_costs_money" msgid="4902470324142151116">"सायद तपाईà¤à¤²à¤¾à¤ˆ पैसा परà¥à¤¨ सकà¥à¤›à¥¤"</string>
+ <string name="usb_storage_activity_title" msgid="4465055157209648641">"USB ठूलो भणà¥à¤¡à¤¾à¤°à¤£"</string>
+ <string name="usb_storage_title" msgid="5901459041398751495">"USB जोडिà¤à¤•ो छ"</string>
+ <string name="usb_storage_message" product="nosdcard" msgid="3308538094316477839">"तपाईं आफà¥à¤¨à¥‹ कमà¥à¤ªà¥à¤¯à¥à¤Ÿà¤°à¤®à¤¾ USB मारà¥à¤«à¤¤ जडान हà¥à¤¨à¥à¤­à¤¯à¥‹à¥¤ तलको बटन टच गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ यदि तपाईं आफà¥à¤¨à¥‹ कमà¥à¤ªà¥à¤¯à¥à¤Ÿà¤° र à¤à¤¨à¥à¤¡à¥à¤°à¥‹à¤‡à¤¡à¤•ो USB भणà¥à¤¡à¤¾à¤°à¤£ बीच फाइलहरू पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿ गरà¥à¤¨ चाहनà¥à¤¹à¥à¤¨à¥à¤› भने।"</string>
+ <string name="usb_storage_message" product="default" msgid="805351000446037811">"तपाईं आफà¥à¤¨à¥‹ कमà¥à¤ªà¥à¤¯à¥à¤Ÿà¤°à¤®à¤¾ USB मारà¥à¤«à¤¤ जडान हà¥à¤¨à¥à¤­à¤¯à¥‹à¥¤ तलको बटन टच गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ यदि तपाईं आफà¥à¤¨à¥‹ कमà¥à¤ªà¥à¤¯à¥à¤Ÿà¤° र à¤à¤¨à¥à¤¡à¥à¤°à¥‹à¤‡à¤¡à¤•ो SD कारà¥à¤¡ बीच फाइलहरू पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿ गरà¥à¤¨ चाहनà¥à¤¹à¥à¤¨à¥à¤› भने।"</string>
+ <string name="usb_storage_button_mount" msgid="1052259930369508235">"USB भणà¥à¤¡à¤¾à¤°à¤£ चालॠगरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="usb_storage_error_message" product="nosdcard" msgid="3017045217365540658">"USB आम भणà¥à¤¡à¤¾à¤°à¤£à¤•ो लागि तपाईà¤à¤•ो USB भणà¥à¤¡à¤¾à¤°à¤£ पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¦à¤¾ à¤à¤‰à¤Ÿà¤¾ समसà¥à¤¯à¤¾ भयो।"</string>
+ <string name="usb_storage_error_message" product="default" msgid="2876018512716970313">"USB आम भणà¥à¤¡à¤¾à¤°à¤£à¤•ो लागि तपाईà¤à¤•ो SD कारà¥à¤¡ पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¦à¤¾ à¤à¤‰à¤Ÿà¤¾ समसà¥à¤¯à¤¾ भयो।"</string>
+ <string name="usb_storage_notification_title" msgid="8175892554757216525">"USB जोडिà¤à¤•ो छ"</string>
+ <string name="usb_storage_notification_message" msgid="939822783828183763">"तपाईà¤à¤•ो कमà¥à¤ªà¥à¤¯à¥à¤Ÿà¤°à¤¬à¤¾à¤Ÿ वा तिर फाइलहरू पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ª गरà¥à¤¨ छà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="usb_storage_stop_notification_title" msgid="2336058396663516017">"USB भणà¥à¤¡à¤¾à¤°à¤£ बनà¥à¤¦ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="usb_storage_stop_notification_message" msgid="1656852098555623822">"USB भणà¥à¤¡à¤¾à¤°à¤£ बनà¥à¤¦ गरà¥à¤¨ छà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="usb_storage_stop_title" msgid="660129851708775853">"USB भणà¥à¤¡à¤¾à¤°à¤£ पà¥à¤°à¤¯à¥‹à¤—मा छ"</string>
+ <string name="usb_storage_stop_message" product="nosdcard" msgid="4264025280777219521">"USB भणà¥à¤¡à¤¾à¤°à¤£ बनà¥à¤¦ हà¥à¤¨à¥à¤­à¤¨à¥à¤¦à¤¾ पहीले तपाईà¤à¤•ो कमà¥à¤ªà¥à¤¯à¥à¤Ÿà¤°à¤¬à¤¾à¤Ÿ तपाईà¤à¤•ो à¤à¤¨à¥à¤¡à¥à¤°à¥‹à¤‡à¤¡ USB भणà¥à¤¡à¤¾à¤°à¤£ अनमाउनà¥à¤Ÿ (\"à¤à¤¿à¤•à¥à¤¨à¥à¤¹à¥‹à¤¸à¥\") गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ ।"</string>
+ <string name="usb_storage_stop_message" product="default" msgid="8043969782460613114">"USB भणà¥à¤¡à¤¾à¤°à¤£ बनà¥à¤¦ गरà¥à¤¨à¥à¤…घि तपाईà¤à¤•ो कमà¥à¤ªà¥à¤¯à¥à¤Ÿà¤°à¤¬à¤¾à¤Ÿ तपाईà¤à¤•ो à¤à¤¨à¥à¤¡à¥à¤°à¥‹à¤‡à¤¡à¤•ो SD कारà¥à¤¡ अनमाउनà¥à¤Ÿ (\"निकालेको\") गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="usb_storage_stop_button_mount" msgid="7060218034900696029">"USB भणà¥à¤¡à¤¾à¤°à¤£ बनà¥à¤¦ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="usb_storage_stop_error_message" msgid="1970374898263063836">"USB भणà¥à¤¡à¤¾à¤°à¤£ बनà¥à¤¦ गरà¥à¤¦à¤¾ à¤à¤‰à¤Ÿà¤¾ समसà¥à¤¯à¤¾ भयो। तपाईà¤à¤²à¥‡ USB होसà¥à¤Ÿ अनमाउनà¥à¤Ÿ गरà¥à¤¨à¥ भà¤à¤•ो जाà¤à¤š गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥, तà¥à¤¯à¤¸à¤ªà¤›à¤¿ फेरि पà¥à¤°à¤¯à¤¾à¤¸ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="dlg_confirm_kill_storage_users_title" msgid="963039033470478697">"USB भणà¥à¤¡à¤¾à¤°à¤£ खोलà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="dlg_confirm_kill_storage_users_text" msgid="5100428757107469454">"यदि तपाईà¤à¤²à¥‡ USB भणà¥à¤¡à¤¾à¤°à¤£ खोलà¥à¤¨à¥ भयो भने तपाईà¤à¤²à¥‡ पà¥à¤°à¤¯à¥‹à¤— गरिरहनॠभà¤à¤•ा केही अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरू रोकिने छनॠर तपाईà¤à¤²à¥‡ USB भणà¥à¤¡à¤¾à¤°à¤£ बनà¥à¤¦ नगरेसमà¥à¤® अनà¥à¤ªà¤²à¤¬à¥à¤§ हà¥à¤¨ सकà¥à¤›à¤¨à¥à¥¤"</string>
+ <string name="dlg_error_title" msgid="7323658469626514207">"USB संचालन असफल"</string>
+ <string name="dlg_ok" msgid="7376953167039865701">"ठिक छ"</string>
+ <string name="usb_mtp_notification_title" msgid="3699913097391550394">"मिडिया उपकरणको रूपमा जडित"</string>
+ <string name="usb_ptp_notification_title" msgid="1960817192216064833">"कà¥à¤¯à¤¾à¤®à¥‡à¤°à¤¾à¤•ो रूपमा जडान भà¤à¤•ो"</string>
+ <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"à¤à¤‰à¤Ÿà¤¾ सà¥à¤¥à¤¾à¤ªà¤¨à¤•रà¥à¤¤à¤¾à¤•ो रूपमा जोडिà¤à¤•ो छ"</string>
+ <string name="usb_accessory_notification_title" msgid="7848236974087653666">"USB सहायकमा जोडिà¤à¤•ो छ"</string>
+ <string name="usb_notification_message" msgid="2290859399983720271">"अनà¥à¤¯ USB विकलà¥à¤ªà¤¹à¤°à¥‚को लागि टच गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="extmedia_format_title" product="nosdcard" msgid="9020092196061007262">"USB भणà¥à¤¡à¤¾à¤°à¤£à¤²à¤¾à¤ˆ फरà¥à¤®à¥à¤¯à¤¾à¤Ÿ गरà¥à¤¨ चाहनॠहà¥à¤¨à¥à¤›?"</string>
+ <string name="extmedia_format_title" product="default" msgid="3648415921526526069">"SD कारà¥à¤¡ फरà¥à¤®à¥à¤¯à¤¾à¤Ÿ गरà¥à¤¨à¥‡?"</string>
+ <string name="extmedia_format_message" product="nosdcard" msgid="3934016853425761078">"तपाईंको USBमा सङà¥à¤—à¥à¤°à¤¹ भà¤à¤•ा सबै फाइलहरू मेटिने छनà¥à¥¤ यो कारà¥à¤¯ उलà¥à¤Ÿà¤¾à¤‰à¤¨ सकिà¤à¤¦à¥ˆà¤¨!"</string>
+ <string name="extmedia_format_message" product="default" msgid="14131895027543830">"तपाईà¤à¤•ो कारà¥à¤¡à¤®à¤¾ भà¤à¤•ा सबै डेटाहरू हराउने छनà¥à¥¤"</string>
+ <string name="extmedia_format_button_format" msgid="4131064560127478695">"फरà¥à¤®à¥à¤¯à¤¾à¤Ÿ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="adb_active_notification_title" msgid="6729044778949189918">"USB डिबग गरà¥à¤¨à¥‡ जडित छ"</string>
+ <string name="adb_active_notification_message" msgid="1016654627626476142">"USB डिबग गरà¥à¤¨à¥‡ असकà¥à¤·à¤® पारà¥à¤¨ छà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"निवेश विधि छानà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="configure_input_methods" msgid="9091652157722495116">"इनपà¥à¤Ÿ विधिहरू सेटअप गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="use_physical_keyboard" msgid="6203112478095117625">"भौतिक किबोरà¥à¤¡"</string>
+ <string name="hardware" msgid="7517821086888990278">"हारà¥à¤¡à¤µà¥‡à¤¯à¤°"</string>
+ <string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"किबोरà¥à¤¡ रूपरेखा चयन गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"किबोरà¥à¤¡ रूपरेखा चयन गरà¥à¤¨ टच गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+ <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+ <string name="candidates_style" msgid="4333913089637062257"><u>"उमà¥à¤®à¥‡à¤¦à¤µà¤¾à¤°"</u></string>
+ <string name="ext_media_checking_notification_title" product="nosdcard" msgid="3449816005351468560">"USB भणà¥à¤¡à¤¾à¤°à¤£à¤•ो तयारी हà¥à¤à¤¦à¥ˆ"</string>
+ <string name="ext_media_checking_notification_title" product="default" msgid="5457603418970994050">"SD कारà¥à¤¡ तयार गरà¥à¤¦à¥ˆ"</string>
+ <string name="ext_media_checking_notification_message" msgid="8287319882926737053">"तà¥à¤°à¥à¤Ÿà¤¿à¤¹à¤°à¥‚को लागि जाà¤à¤š गरà¥à¤¦à¥ˆà¥¤"</string>
+ <string name="ext_media_nofs_notification_title" product="nosdcard" msgid="7788040745686229307">"रिकà¥à¤¤ USB भणà¥à¤¡à¤¾à¤°à¤£"</string>
+ <string name="ext_media_nofs_notification_title" product="default" msgid="780477838241212997">"खाली SD कारà¥à¤¡"</string>
+ <string name="ext_media_nofs_notification_message" product="nosdcard" msgid="7840121067427269500">"USB भणà¥à¤¡à¤¾à¤°à¤£ खाली वा असमरà¥à¤¥à¤¿à¤¤ फाइल पà¥à¤°à¤£à¤¾à¤²à¥€ छ।"</string>
+ <string name="ext_media_nofs_notification_message" product="default" msgid="8641065641786923604">"SD कारà¥à¤¡ खाली छ अथवा समरà¥à¤¥à¤¨ नगरिà¤à¤•ो फाइल पà¥à¤°à¤£à¤¾à¤²à¥€ छ।"</string>
+ <string name="ext_media_unmountable_notification_title" product="nosdcard" msgid="2090046769532713563">"बिगà¥à¤°à¤¿à¤à¤•ो USB भणà¥à¤¡à¤¾à¤°à¤£"</string>
+ <string name="ext_media_unmountable_notification_title" product="default" msgid="6410723906019100189">"बिगà¥à¤°à¤¿à¤à¤•ो SD कारà¥à¤¡"</string>
+ <string name="ext_media_unmountable_notification_message" product="nosdcard" msgid="1795917578395333280">"USB भणà¥à¤¡à¤¾à¤°à¤£ बिगà¥à¤°à¤¿à¤à¤•ो छ। यसलाई पà¥à¤¨à¤ƒà¤«à¤°à¥à¤®à¥à¤¯à¤¾à¤Ÿ गरà¥à¤¨ पà¥à¤°à¤¯à¤¾à¤¸ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥¤"</string>
+ <string name="ext_media_unmountable_notification_message" product="default" msgid="1753898567525568253">"SD कारà¥à¤¡ बिगà¥à¤°à¤¿à¤à¤•ो छ। यसलाई पà¥à¤¨à¤ƒà¤«à¤°à¥à¤®à¥à¤¯à¤¾à¤Ÿ गरà¥à¤¨ पà¥à¤°à¤¯à¤¾à¤¸ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥¤"</string>
+ <string name="ext_media_badremoval_notification_title" product="nosdcard" msgid="1661683031330951073">"USB भणà¥à¤¡à¤¾à¤°à¤£ अपà¥à¤°à¤¤à¥à¤¯à¤¾à¤¶à¤¿à¤¤ रूपमा हटाइà¤à¤•ो छ"</string>
+ <string name="ext_media_badremoval_notification_title" product="default" msgid="6872152882604407837">"SD कारà¥à¤¡ अनपेकà¥à¤·à¤¿à¤¤ रूपमा हटाइयो"</string>
+ <string name="ext_media_badremoval_notification_message" product="nosdcard" msgid="4329848819865594241">"डेटा गà¥à¤®à¥à¤¨à¤¬à¤¾à¤Ÿ रोकà¥à¤¨à¤•ो लागि USB भणà¥à¤¡à¤¾à¤°à¤£ हटाउनà¥à¤…घि अनमाउनà¥à¤Ÿ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="ext_media_badremoval_notification_message" product="default" msgid="7260183293747448241">"डेटा नाश हà¥à¤¨à¤¬à¤¾à¤Ÿ बचà¥à¤¨ SD कारà¥à¤¡à¤²à¤¾à¤ˆ निकालà¥à¤¨à¥à¤­à¤¨à¥à¤¦à¤¾ पहिला अनमाउनà¥à¤Ÿ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="ext_media_safe_unmount_notification_title" product="nosdcard" msgid="3967973893270360230">"USB भणà¥à¤¡à¤¾à¤°à¤£ हटाउनको लागि सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ छ"</string>
+ <string name="ext_media_safe_unmount_notification_title" product="default" msgid="6729801130790616200">"SD कारà¥à¤¡ हटाउन सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ छ।"</string>
+ <string name="ext_media_safe_unmount_notification_message" product="nosdcard" msgid="6142195361606493530">"तपाईं सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ रूपमा USB भणà¥à¤¡à¤¾à¤°à¤£ हटाउन सकà¥à¤¨à¥à¤¹à¥à¤¨à¥‡ छ।"</string>
+ <string name="ext_media_safe_unmount_notification_message" product="default" msgid="568841278138377604">"तपाईठSD कारà¥à¤¡ सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ रूपमा हटाउन सकà¥à¤¨à¥ हà¥à¤¨à¥à¤›à¥¤"</string>
+ <string name="ext_media_nomedia_notification_title" product="nosdcard" msgid="4486377230140227651">"USB भणà¥à¤¡à¤¾à¤°à¤£ हटाइयो"</string>
+ <string name="ext_media_nomedia_notification_title" product="default" msgid="8902518030404381318">"हटाइà¤à¤•ो SD कारà¥à¤¡"</string>
+ <string name="ext_media_nomedia_notification_message" product="nosdcard" msgid="6921126162580574143">"USD भणà¥à¤¡à¤¾à¤°à¤£ हटाइयो। नयाठमिडिया घà¥à¤¸à¤¾à¤‰à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="ext_media_nomedia_notification_message" product="default" msgid="3870120652983659641">"SD कारà¥à¤¡ हटाइयो। à¤à¤‰à¤Ÿà¤¾ नयाठछिराउनà¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="activity_list_empty" msgid="1675388330786841066">"कà¥à¤¨à¥ˆ मिलà¥à¤¨à¥‡ गतिविधि पाइà¤à¤¨à¥¤"</string>
+ <string name="permlab_pkgUsageStats" msgid="8787352074326748892">"खणà¥à¤¡ पà¥à¤°à¤¯à¥‹à¤— तथà¥à¤¯à¤¾à¤™à¥à¤•हरू अपडेट गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_pkgUsageStats" msgid="1106612424254277630">"जमà¥à¤®à¤¾ गरिà¤à¤•ो घटक उपयोग तथà¥à¤¯à¤¾à¤™à¥à¤•हरूलाई परिमारà¥à¤œà¤¨ गरà¥à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ सामानà¥à¤¯ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूबाट पà¥à¤°à¤¯à¥‹à¤—को लागि होइन।"</string>
+ <string name="permlab_copyProtectedData" msgid="4341036311211406692">"सामागà¥à¤°à¥€à¤•ो नकल गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_copyProtectedData" msgid="4390697124288317831">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई सामगà¥à¤°à¥€ पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿ गरà¥à¤¨ पूरà¥à¤µà¤¨à¤¿à¤°à¥à¤§à¤¾à¤°à¤¿à¤¤ कनà¥à¤Ÿà¥‡à¤¨à¤° सेवा आहà¥à¤µà¤¾à¤¨ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤ साधारण अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूदà¥à¤µà¤¾à¤°à¤¾à¤•ो पà¥à¤°à¤¯à¥‹à¤—को लागि होइन।"</string>
+ <string name="permlab_route_media_output" msgid="1642024455750414694">"मिडिया परिणाम दिशानिरà¥à¤¦à¥‡à¤¶ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_route_media_output" msgid="4932818749547244346">"मिडिया परिणामलाई अनà¥à¤¯ बाहिरी उपकरणहरूसà¤à¤— लैजानको लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_access_keyguard_secure_storage" msgid="7565552237977815047">"किगारà¥à¤¡ सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ भणà¥à¤¡à¤¾à¤°à¤£ पहà¥à¤à¤š गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_access_keyguard_secure_storage" msgid="5866245484303285762">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई किगारà¥à¤¡ सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ भणà¥à¤¡à¤¾à¤°à¤£ पहà¥à¤à¤š गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="permlab_control_keyguard" msgid="172195184207828387">"किगारà¥à¤¡ पà¥à¤°à¤¦à¤°à¥à¤¶à¤¨ गरà¥à¤¨à¥‡ र लà¥à¤•ाउने नियनà¥à¤¤à¥à¤°à¤£ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permdesc_control_keyguard" msgid="3043732290518629061">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई किगारà¥à¤¡ नियनà¥à¤¤à¥à¤°à¤£ गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤›à¥¤"</string>
+ <string name="tutorial_double_tap_to_zoom_message_short" msgid="4070433208160063538">"जà¥à¤® नियनà¥à¤¤à¥à¤°à¤£à¤•ो लागि दà¥à¤ˆ चोटि टच गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="gadget_host_error_inflating" msgid="4882004314906466162">"विजेट थप गरà¥à¤¨ सकिà¤à¤¦à¥ˆà¤¨à¥¤"</string>
+ <string name="ime_action_go" msgid="8320845651737369027">"जानà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="ime_action_search" msgid="658110271822807811">"खोजà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="ime_action_send" msgid="2316166556349314424">"पठाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="ime_action_next" msgid="3138843904009813834">"अरà¥à¤•ो"</string>
+ <string name="ime_action_done" msgid="8971516117910934605">"भयो"</string>
+ <string name="ime_action_previous" msgid="1443550039250105948">"अघिलà¥à¤²à¥‹"</string>
+ <string name="ime_action_default" msgid="2840921885558045721">"चलाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="dial_number_using" msgid="5789176425167573586">\n"नमà¥à¤¬à¤° डायल गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ <xliff:g id="NUMBER">%s</xliff:g> पà¥à¤°à¤¯à¥‹à¤— गरेर"</string>
+ <string name="create_contact_using" msgid="4947405226788104538">"समà¥à¤ªà¤°à¥à¤• सिरà¥à¤œà¤¨à¤¾ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥\nयो <xliff:g id="NUMBER">%s</xliff:g> पà¥à¤°à¤¯à¥‹à¤— गरेर"</string>
+ <string name="grant_credentials_permission_message_header" msgid="2106103817937859662">"निमà¥à¤¨ à¤à¤‰à¤Ÿà¤¾ वा धेरै अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरूले तपाईà¤à¤•ो खातामा पहà¥à¤à¤šà¤•ो लागि अनà¥à¤®à¤¤à¤¿ अहिले र भविषà¥à¤¯à¤®à¤¾ अनà¥à¤°à¥‹à¤§ गरà¥à¤›à¤¨à¥à¥¤"</string>
+ <string name="grant_credentials_permission_message_footer" msgid="3125211343379376561">"के तपाईठयस अनà¥à¤°à¥‹à¤§à¤²à¤¾à¤ˆ अनà¥à¤®à¤¤à¤¿ दिन चाहनà¥à¤¹à¥à¤¨à¥à¤›?"</string>
+ <string name="grant_permissions_header_text" msgid="6874497408201826708">"अनà¥à¤°à¥‹à¤§ पहà¥à¤à¤š गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="allow" msgid="7225948811296386551">"अनà¥à¤®à¤¤à¤¿ दिनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="deny" msgid="2081879885755434506">"असà¥à¤µà¥€à¤•ार गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="permission_request_notification_title" msgid="6486759795926237907">"अनà¥à¤°à¥‹à¤§ गरिà¤à¤•ो अनà¥à¤®à¤¤à¤¿"</string>
+ <string name="permission_request_notification_with_subtitle" msgid="8530393139639560189">\n"खाता <xliff:g id="ACCOUNT">%s</xliff:g>को लागि अनà¥à¤°à¥‹à¤§ गरिà¤à¤•ो अनà¥à¤®à¤¤à¤¿à¥¤"</string>
+ <string name="input_method_binding_label" msgid="1283557179944992649">"इनपà¥à¤Ÿ विधि"</string>
+ <string name="sync_binding_label" msgid="3687969138375092423">"सिङà¥à¤• गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="accessibility_binding_label" msgid="4148120742096474641">"उपलबà¥à¤§à¤¤à¤¾"</string>
+ <string name="wallpaper_binding_label" msgid="1240087844304687662">"वालपेपर"</string>
+ <string name="chooser_wallpaper" msgid="7873476199295190279">"वालपेपर परिवरà¥à¤¤à¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="notification_listener_binding_label" msgid="2014162835481906429">"सूचना सà¥à¤¨à¥à¤¨à¥‡à¤µà¤¾à¤²à¤¾"</string>
+ <string name="vpn_title" msgid="19615213552042827">"VPN सकà¥à¤°à¤¿à¤¯ भयो"</string>
+ <string name="vpn_title_long" msgid="6400714798049252294">"VPN <xliff:g id="APP">%s</xliff:g>दà¥à¤µà¤¾à¤°à¤¾ सकà¥à¤°à¤¿à¤¯ गरिà¤à¤•ो हो"</string>
+ <string name="vpn_text" msgid="3011306607126450322">"नेटवरà¥à¤• पà¥à¤°à¤¬à¤¨à¥à¤§ गरà¥à¤¨ छà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="vpn_text_long" msgid="6407351006249174473">"<xliff:g id="SESSION">%s</xliff:g>सà¤à¤— जोडिà¤à¤•ो छ। नेटवरà¥à¤• वà¥à¤¯à¤µà¤¸à¥à¤¥à¤¾à¤ªà¤¨ गरà¥à¤¨à¤•ो लागि छà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"VPN जडान सधै जोडà¥à¤¦à¥ˆâ€¦"</string>
+ <string name="vpn_lockdown_connected" msgid="8202679674819213931">"सधैठखà¥à¤²à¥à¤²à¤¾ हà¥à¤¨à¥‡ VPN जोडिà¤à¤•ो"</string>
+ <string name="vpn_lockdown_error" msgid="6009249814034708175">"सधैठभरि VPN तà¥à¤°à¥à¤Ÿà¤¿à¤®à¤¾"</string>
+ <string name="vpn_lockdown_config" msgid="6415899150671537970">"कनà¥à¤«à¤¿à¤—र गरà¥à¤¨ टच गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="upload_file" msgid="2897957172366730416">"फाइल छानà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="no_file_chosen" msgid="6363648562170759465">"कà¥à¤¨à¥ˆ फाइल छानिà¤à¤•ो छैन"</string>
+ <string name="reset" msgid="2448168080964209908">"पà¥à¤¨à¤ƒà¤¸à¥‡à¤Ÿ गरà¥à¤¨à¥"</string>
+ <string name="submit" msgid="1602335572089911941">"पेस गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"कार मोड सकà¥à¤·à¤® पारियो।"</string>
+ <string name="car_mode_disable_notification_message" msgid="8035230537563503262">"कार मोडबाट निसà¥à¤•न छà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="tethered_notification_title" msgid="3146694234398202601">"टेथर गरà¥à¤¨à¥‡ वा हटसà¥à¤ªà¤Ÿ सकà¥à¤°à¤¿à¤¯"</string>
+ <string name="tethered_notification_message" msgid="6857031760103062982">"सेटअप गरà¥à¤¨ टच गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="back_button_label" msgid="2300470004503343439">"पछाडि"</string>
+ <string name="next_button_label" msgid="1080555104677992408">"अरà¥à¤•ो"</string>
+ <string name="skip_button_label" msgid="1275362299471631819">"छोडà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="throttle_warning_notification_title" msgid="4890894267454867276">"उचà¥à¤š मोबाइल डेटा पà¥à¤°à¤¯à¥‹à¤—"</string>
+ <string name="throttle_warning_notification_message" msgid="3340822228599337743">"मोबाइल डेटा पà¥à¤°à¤¯à¥‹à¤—को बारेमा अरू थप जानà¥à¤¨à¤•ो लागि छà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="throttled_notification_title" msgid="6269541897729781332">"मोबाइल डेटा सीमा पार भयो"</string>
+ <string name="throttled_notification_message" msgid="5443457321354907181">"मोबाइल डेटा पà¥à¤°à¤¯à¥‹à¤— बारे थप सिकà¥à¤¨ छà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="no_matches" msgid="8129421908915840737">"कà¥à¤¨à¥ˆ मिलेन"</string>
+ <string name="find_on_page" msgid="1946799233822820384">"पृषà¥à¤ à¤®à¤¾ फेला पारà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <plurals name="matches_found">
+ <item quantity="one" msgid="8167147081136579439">"१ मेल"</item>
+ <item quantity="other" msgid="4641872797067609177">"<xliff:g id="TOTAL">%d</xliff:g> को <xliff:g id="INDEX">%d</xliff:g>"</item>
+ </plurals>
+ <string name="action_mode_done" msgid="7217581640461922289">"भयो"</string>
+ <string name="progress_unmounting" product="nosdcard" msgid="3923810448507612746">"USB भणà¥à¤¡à¤¾à¤°à¤£ अनमाउनà¥à¤Ÿ गरà¥à¤¦à¥ˆ..."</string>
+ <string name="progress_unmounting" product="default" msgid="1327894998409537190">"SD कारà¥à¤¡ अनमाउनà¥à¤Ÿ गरà¥à¤¦à¥ˆâ€¦"</string>
+ <string name="progress_erasing" product="nosdcard" msgid="4521573321524340058">"USB भणà¥à¤¡à¤¾à¤°à¤£ मेटाउà¤à¤¦à¥ˆâ€¦"</string>
+ <string name="progress_erasing" product="default" msgid="6596988875507043042">"SD कारà¥à¤¡ मेटाउà¤à¤¦à¥ˆâ€¦"</string>
+ <string name="format_error" product="nosdcard" msgid="6299769563624776948">"USB भणà¥à¤¡à¤¾à¤°à¤£à¤²à¤¾à¤ˆ मेटाउन सकेन।"</string>
+ <string name="format_error" product="default" msgid="7315248696644510935">"SD कारà¥à¤¡ मेटाउन सकेन"</string>
+ <string name="media_bad_removal" msgid="7960864061016603281">"SD कारà¥à¤¡ अनमाउनà¥à¤Ÿ हà¥à¤¨à¥à¤­à¤¨à¥à¤¦à¤¾ पहिला निकालियो।"</string>
+ <string name="media_checking" product="nosdcard" msgid="418188720009569693">"अहिले USB भणà¥à¤¡à¤¾à¤°à¤£ जाà¤à¤š भइरहेको छ।"</string>
+ <string name="media_checking" product="default" msgid="7334762503904827481">"SD कारà¥à¤¡ अहिले परीकà¥à¤·à¤£ भइरहेको छ।"</string>
+ <string name="media_removed" msgid="7001526905057952097">"SD कारà¥à¤¡ हटाइयो।"</string>
+ <string name="media_shared" product="nosdcard" msgid="5830814349250834225">"SD कारà¥à¤¡ कमà¥à¤ªà¥à¤¯à¥à¤Ÿà¤°à¤¦à¥à¤µà¤¾à¤°à¤¾ अहिले पà¥à¤°à¤¯à¥‹à¤—मा छ।"</string>
+ <string name="media_shared" product="default" msgid="5706130568133540435">"SD कारà¥à¤¡ अहिले कमà¥à¤ªà¥à¤¯à¥à¤Ÿà¤°à¤¦à¥à¤µà¤¾à¤°à¤¾ पà¥à¤°à¤¯à¥‹à¤—मा छ।"</string>
+ <string name="media_unknown_state" msgid="729192782197290385">"बाहà¥à¤¯ मिडिया अजà¥à¤žà¤¾à¤¤ अवसà¥à¤¥à¤¾à¤®à¤¾à¥¤"</string>
+ <string name="share" msgid="1778686618230011964">"साà¤à¥‡à¤¦à¤¾à¤°à¥€ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="find" msgid="4808270900322985960">"पतà¥à¤¤à¤¾ लगाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="websearch" msgid="4337157977400211589">"वेब खोजी"</string>
+ <string name="find_next" msgid="5742124618942193978">"अरà¥à¤•ो भेटाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="find_previous" msgid="2196723669388360506">"अघिलà¥à¤²à¥‹ फेला पारà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="gpsNotifTicker" msgid="5622683912616496172">"<xliff:g id="NAME">%s</xliff:g> बाट सà¥à¤¥à¤¾à¤¨ अनà¥à¤°à¥‹à¤§"</string>
+ <string name="gpsNotifTitle" msgid="5446858717157416839">"सà¥à¤¥à¤¾à¤¨ अनà¥à¤°à¥‹à¤§"</string>
+ <string name="gpsNotifMessage" msgid="1374718023224000702">"<xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>) दà¥à¤µà¤¾à¤°à¤¾ अनà¥à¤°à¥‹à¤§ गरिà¤à¤•ो"</string>
+ <string name="gpsVerifYes" msgid="2346566072867213563">"हो"</string>
+ <string name="gpsVerifNo" msgid="1146564937346454865">"होइन"</string>
+ <string name="sync_too_many_deletes" msgid="5296321850662746890">"सीमा नाघेकाहरू मेटà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="sync_too_many_deletes_desc" msgid="496551671008694245">"तà¥à¤¯à¤¹à¤¾à¤ <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> मेटाइà¤à¤•ा आइटमहरू छनॠ<xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>को लागि, खाता <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g>। तपाईं के गरà¥à¤¨ चाहनॠहà¥à¤¨à¥à¤›?"</string>
+ <string name="sync_really_delete" msgid="2572600103122596243">"वसà¥à¤¤à¥à¤¹à¤°à¥‚ मेटà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="sync_undo_deletes" msgid="2941317360600338602">"मेटिà¤à¤•ाहरू पूरà¥à¤µà¤µà¤¤ बनाउनà¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="sync_do_nothing" msgid="3743764740430821845">"अहिलेको लागि केही नगरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="choose_account_label" msgid="5655203089746423927">"à¤à¤‰à¤Ÿà¤¾ खाता छानà¥â€à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="add_account_label" msgid="2935267344849993553">"à¤à¤‰à¤Ÿà¤¾ खाता थपà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="add_account_button_label" msgid="3611982894853435874">"खाता थप गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="number_picker_increment_button" msgid="2412072272832284313">"बढाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="number_picker_decrement_button" msgid="476050778386779067">"घटाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="number_picker_increment_scroll_mode" msgid="3073101067441638428">"<xliff:g id="VALUE">%s</xliff:g>छà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ र समाउनà¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="number_picker_increment_scroll_action" msgid="9101473045891835490">"बढाउन माथि र घटाउन तल सारà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="time_picker_increment_minute_button" msgid="8865885114028614321">"मिनेट बढाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="time_picker_decrement_minute_button" msgid="6246834937080684791">"मिनेट घटाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="time_picker_increment_hour_button" msgid="3652056055810223139">"घनà¥à¤Ÿà¤¾ बढाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="time_picker_decrement_hour_button" msgid="1377479863429214792">"घनà¥à¤Ÿà¤¾ घटाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="time_picker_increment_set_pm_button" msgid="4147590696151230863">"PM सेट गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="time_picker_decrement_set_am_button" msgid="8302140353539486752">"AM सेट गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="date_picker_increment_month_button" msgid="5369998479067934110">"महिना बढाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="date_picker_decrement_month_button" msgid="1832698995541726019">"महिना घटाउनà¥à¤¹à¥‹à¥à¤¸à¥"</string>
+ <string name="date_picker_increment_day_button" msgid="7130465412308173903">"दिन बढाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="date_picker_decrement_day_button" msgid="4131881521818750031">"दिन घटाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="date_picker_increment_year_button" msgid="6318697384310808899">"वरà¥à¤· बढाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="date_picker_decrement_year_button" msgid="4482021813491121717">"वरà¥à¤· घटाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
+ <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"रदà¥à¤¦ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"मेटà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="keyboardview_keycode_done" msgid="1992571118466679775">"भयो"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"मोड परिवरà¥à¤¤à¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
+ <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¿ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="activitychooserview_choose_application" msgid="2125168057199941199">"à¤à¤‰à¤Ÿà¤¾ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— छानà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="shareactionprovider_share_with" msgid="806688056141131819">"साà¤à¥‡à¤¦à¤¾à¤°à¥€ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥..."</string>
+ <string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> सà¤à¤— साà¤à¥‡à¤¦à¤¾à¤°à¥€ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="content_description_sliding_handle" msgid="415975056159262248">"धिसारà¥à¤¨à¥‡ हà¥à¤¯à¤¾à¤¨à¥à¤¡à¤²à¥¤ छà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ &amp; समाउनà¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>को लागि माथि धिसारà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="description_direction_down" msgid="5087739728639014595">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> को लागि तल सà¥à¤²à¤¾à¤‡à¤¡ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="description_direction_left" msgid="7207478719805562165">"सà¥à¤²à¤¾à¤‡à¤¡ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>को लागि बायाà¤à¥¤"</string>
+ <string name="description_direction_right" msgid="8034433242579600980">"सà¥à¤²à¤¾à¤‡à¤¡ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>को लागि दायाà¤à¥¤"</string>
+ <string name="description_target_unlock" msgid="2228524900439801453">"अनलक गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="description_target_camera" msgid="969071997552486814">"कà¥à¤¯à¤¾à¤®à¥‡à¤°à¤¾"</string>
+ <string name="description_target_silent" msgid="893551287746522182">"मौन"</string>
+ <string name="description_target_soundon" msgid="30052466675500172">"आवाज चालू"</string>
+ <string name="description_target_search" msgid="3091587249776033139">"खोजà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="description_target_unlock_tablet" msgid="3833195335629795055">"खोलà¥à¤¨à¤²à¤¾à¤‡ हà¥à¤¤à¥à¤¤à¥à¤¯à¤¾à¤‰à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"बोलिà¤à¤•ो पासवरà¥à¤¡ कà¥à¤žà¥à¤œà¥€à¤¹à¤°à¥‚ सà¥à¤¨à¥à¤¨à¤•ो लागि हेडसेट पà¥à¤²à¤— इन गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"डट।"</string>
+ <string name="action_bar_home_description" msgid="5293600496601490216">"गृह खोजà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="action_bar_up_description" msgid="2237496562952152589">"माथि खोजà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="action_menu_overflow_description" msgid="2295659037509008453">"थप विकलà¥à¤ªà¤¹à¤°à¥‚"</string>
+ <string name="action_bar_home_description_format" msgid="7965984360903693903">"%1$s, %2$s"</string>
+ <string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string>
+ <string name="storage_internal" msgid="4891916833657929263">"आनà¥à¤¤à¤°à¤¿à¤• भणà¥à¤¡à¤¾à¤°à¤£"</string>
+ <string name="storage_sd_card" msgid="3282948861378286745">"SD कारà¥à¤¡"</string>
+ <string name="storage_usb" msgid="3017954059538517278">"USB भणà¥à¤¡à¤¾à¤°à¤£"</string>
+ <string name="extract_edit_menu_button" msgid="8940478730496610137">"समà¥à¤ªà¤¾à¤¦à¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="data_usage_warning_title" msgid="1955638862122232342">"डेटा पà¥à¤°à¤¯à¥‹à¤— चेतावनी"</string>
+ <string name="data_usage_warning_body" msgid="2814673551471969954">"उपयोग र सेटिङहरू हेरà¥à¤¨ छà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="data_usage_3g_limit_title" msgid="7093334419518706686">"2G-3G डेटा असकà¥à¤·à¤® गरिà¤à¤•ो"</string>
+ <string name="data_usage_4g_limit_title" msgid="7636489436819470761">"4G डेटा असकà¥à¤·à¤® गरियो"</string>
+ <string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"मोबाइल डेटा असकà¥à¤·à¤® पारियो।"</string>
+ <string name="data_usage_wifi_limit_title" msgid="8992154736441284865">"वाइ-फाइ डेटा असकà¥à¤·à¤® गरियो"</string>
+ <string name="data_usage_limit_body" msgid="3317964706973601386">"सकà¥à¤·à¤® पारà¥à¤¨ छà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"2G-3G डेटा सीमा भनà¥à¤¦à¤¾ पार भà¤à¤•ो छ"</string>
+ <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"4G डेटा SIMा नाघà¥à¤¯à¥‹"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"मोवाइल डेटा SIMा नाघà¥à¤¯à¥‹"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"वाइ-फाइ डेटा SIMा नाघà¥à¤¯à¥‹"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"<xliff:g id="SIZE">%s</xliff:g> उलà¥à¤²à¥‡à¤–ित सीमा भनà¥à¤¦à¤¾ बढी छ।"</string>
+ <string name="data_usage_restricted_title" msgid="5965157361036321914">"पृषà¥à¤ à¤­à¥‚मिका डेटा पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¿à¤¤ गरिà¤à¤•ो छ"</string>
+ <string name="data_usage_restricted_body" msgid="6741521330997452990">"अवरोध हटाउन छà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="ssl_certificate" msgid="6510040486049237639">"सà¥à¤°à¤•à¥à¤·à¤¾ पà¥à¤°à¤®à¤¾à¤£à¤ªà¤¤à¥à¤°"</string>
+ <string name="ssl_certificate_is_valid" msgid="6825263250774569373">"पà¥à¤°à¤®à¤¾à¤£à¤ªà¤¤à¥à¤° मानà¥à¤¯ छ।"</string>
+ <string name="issued_to" msgid="454239480274921032">"दà¥à¤µà¤¾à¤°à¤¾ जारी गरिà¤à¤•ो:"</string>
+ <string name="common_name" msgid="2233209299434172646">"साधारण नाम:"</string>
+ <string name="org_name" msgid="6973561190762085236">"संगठन:"</string>
+ <string name="org_unit" msgid="7265981890422070383">"संगठनातà¥à¤®à¤• à¤à¤•ाइ:"</string>
+ <string name="issued_by" msgid="2647584988057481566">"दà¥à¤µà¤¾à¤°à¤¾ जारी गरिà¤à¤•ो:"</string>
+ <string name="validity_period" msgid="8818886137545983110">"मानà¥à¤¯à¤¤à¤¾:"</string>
+ <string name="issued_on" msgid="5895017404361397232">"जारी गरिà¤à¤•ो:"</string>
+ <string name="expires_on" msgid="3676242949915959821">"अवधि समापà¥à¤¤:"</string>
+ <string name="serial_number" msgid="758814067660862493">"कà¥à¤°à¤® संखà¥à¤¯à¤¾:"</string>
+ <string name="fingerprints" msgid="4516019619850763049">"औà¤à¤ à¤¾à¤›à¤¾à¤ªà¤¹à¤°à¥‚:"</string>
+ <string name="sha256_fingerprint" msgid="4391271286477279263">"SHA-२५६ औंठाछाप:"</string>
+ <string name="sha1_fingerprint" msgid="7930330235269404581">"SHA-1 औंलाछाप:"</string>
+ <string name="activity_chooser_view_see_all" msgid="4292569383976636200">"सबै हेरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"गतिविधि छनौट गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="share_action_provider_share_with" msgid="5247684435979149216">"साà¤à¥‡à¤¦à¤¾à¤°à¥€ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥..."</string>
+ <string name="status_bar_device_locked" msgid="3092703448690669768">"उपकरण लक छ।"</string>
+ <string name="list_delimeter" msgid="3975117572185494152">", "</string>
+ <string name="sending" msgid="3245653681008218030">"पठाउà¤à¤¦à¥ˆ..."</string>
+ <string name="launchBrowserDefault" msgid="2057951947297614725">"बà¥à¤°à¤¾à¤‰à¤œà¤° सà¥à¤°à¥ गरà¥à¤¨à¥‡ हो?"</string>
+ <string name="SetupCallDefault" msgid="5834948469253758575">"कल सà¥à¤µà¥€à¤•ार गरà¥à¤¨à¥à¤¹à¥à¤¨à¥à¤›?"</string>
+ <string name="activity_resolver_use_always" msgid="8017770747801494933">"सधैà¤"</string>
+ <string name="activity_resolver_use_once" msgid="2404644797149173758">"à¤à¤‰à¤Ÿà¤¾ मातà¥à¤°"</string>
+ <string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿ"</string>
+ <string name="default_audio_route_name" product="default" msgid="4239291273420140123">"फोन"</string>
+ <string name="default_audio_route_name_headphones" msgid="8119971843803439110">"हेडफोनहरू"</string>
+ <string name="default_audio_route_name_dock_speakers" msgid="6240602982276591864">"डक सà¥à¤ªà¤¿à¤•रहरू"</string>
+ <string name="default_media_route_name_hdmi" msgid="2450970399023478055">"HDMI"</string>
+ <string name="default_audio_route_category_name" msgid="3722811174003886946">"पà¥à¤°à¤£à¤¾à¤²à¥€"</string>
+ <string name="bluetooth_a2dp_audio_route_name" msgid="8575624030406771015">"बà¥à¤²à¥à¤Ÿà¥à¤¥ अडियो"</string>
+ <string name="wireless_display_route_description" msgid="9070346425023979651">"ताररहित पà¥à¤°à¤¦à¤°à¥à¤¶à¤¨"</string>
+ <string name="media_route_chooser_grouping_done" msgid="7966438307723317169">"भयो"</string>
+ <string name="media_route_button_content_description" msgid="5758553567065145276">"मिडियाको उतà¥à¤ªà¤¾à¤¦à¤¨"</string>
+ <string name="media_route_status_scanning" msgid="7279908761758293783">"सà¥à¤•à¥à¤¯à¤¾à¤¨ गरà¥à¤¦à¥ˆ ..."</string>
+ <string name="media_route_status_connecting" msgid="6422571716007825440">"जडान हà¥à¤à¤¦à¥ˆ..."</string>
+ <string name="media_route_status_available" msgid="6983258067194649391">"उपलबà¥à¤§"</string>
+ <string name="media_route_status_not_available" msgid="6739899962681886401">"उपलबà¥à¤§ छैन"</string>
+ <string name="media_route_status_in_use" msgid="4533786031090198063">"पà¥à¤°à¤¯à¥‹à¤—मा छ"</string>
+ <string name="display_manager_built_in_display_name" msgid="2583134294292563941">"पूरà¥à¤µ-निरà¥à¤®à¤¿à¤¤ सà¥à¤•à¥à¤°à¤¿à¤¨"</string>
+ <string name="display_manager_hdmi_display_name" msgid="1555264559227470109">"HDMI सà¥à¤•à¥à¤°à¤¿à¤¨"</string>
+ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"आवरण #<xliff:g id="ID">%1$d</xliff:g>"</string>
+ <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
+ <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", सà¥à¤°à¤•à¥à¤·à¤¿à¤¤"</string>
+ <string name="wifi_display_notification_title" msgid="2223050649240326557">"ताररहित पà¥à¤°à¤¦à¤°à¥à¤¶à¤¨ जोडिà¤à¤•ो छ"</string>
+ <string name="wifi_display_notification_message" msgid="4498802012464170685">"अरà¥à¤•ो उपकरणमा यो सà¥à¤•à¥à¤°à¤¿à¤¨à¤²à¥‡ देखाइरहेको छ"</string>
+ <string name="wifi_display_notification_disconnect" msgid="6183754463561153372">"विचà¥à¤›à¥‡à¤¦à¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="kg_emergency_call_label" msgid="684946192523830531">"आपतकालीन कल"</string>
+ <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"ढाà¤à¤šà¤¾ बिरà¥à¤¸à¤¨à¥ भयो"</string>
+ <string name="kg_wrong_pattern" msgid="1850806070801358830">"गलत ढाà¤à¤šà¤¾"</string>
+ <string name="kg_wrong_password" msgid="2333281762128113157">"गलत पासवरà¥à¤¡"</string>
+ <string name="kg_wrong_pin" msgid="1131306510833563801">"गलत PIN"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"<xliff:g id="NUMBER">%1$d</xliff:g>सेकेनà¥à¤¡à¤®à¤¾ फेरि पà¥à¤°à¤¯à¤¾à¤¸ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="kg_pattern_instructions" msgid="398978611683075868">"आफà¥à¤¨à¥‹ ढाà¤à¤šà¤¾ कोरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="kg_sim_pin_instructions" msgid="2319508550934557331">"SIM PIN पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¿ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="kg_pin_instructions" msgid="2377242233495111557">"PIN पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¿ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="kg_password_instructions" msgid="5753646556186936819">"पासवरà¥à¤¡ पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¿ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="kg_puk_enter_puk_hint" msgid="453227143861735537">"SIM कारà¥à¤¡ अहिले असकà¥à¤·à¤® छ। सà¥à¤šà¤¾à¤°à¥ गरà¥à¤¨à¤•ो लागि PUK कोड पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¿ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤ विवरणको लागि वाहकलाई समà¥à¤ªà¤°à¥à¤• गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"इचà¥à¤›à¤¿à¤¤ PIN कोड पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¿ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"मनपरà¥à¤¦à¥‹ PIN कोड निशà¥à¤šà¤¿à¤¤ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"SIM कारà¥à¤¡ अनलक गरà¥à¤¦à¥ˆâ€¦"</string>
+ <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"गलत PIN कोड।"</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"४ देखि ८ वाट नमà¥à¤¬à¤° भà¤à¤•ो à¤à¤‰à¤Ÿà¤¾ PIN टाइप गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"PUK कोड ८ वटा नमà¥à¤¬à¤° वा सो भनà¥à¤¦à¤¾ बढी हà¥à¤¨à¥à¤ªà¤°à¥à¤›à¥¤"</string>
+ <string name="kg_invalid_puk" msgid="3638289409676051243">"PUK कोड पà¥à¤¨:पà¥à¤°à¤¦à¤¾à¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤ धेरै पà¥à¤¨:पà¥à¤°à¤¯à¤¾à¤¸à¤¹à¤°à¥‚ले SIMलाई सà¥à¤¥à¤¾à¤¯à¥€ रूपमा निषà¥à¤•à¥à¤°à¤¿à¤¯ गरिदिने छ।"</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"PIN कोडहरू मेल खाà¤à¤¨"</string>
+ <string name="kg_login_too_many_attempts" msgid="6486842094005698475">"निकै धेरै ढाà¤à¤šà¤¾ कोसिसहरू"</string>
+ <string name="kg_login_instructions" msgid="1100551261265506448">"अनलक गरà¥à¤¨à¤•ो लागि, तपाईà¤à¤•ो Google खाताको साथ साइन इन गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="kg_login_username_hint" msgid="5718534272070920364">"पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ नाम (इमेल)"</string>
+ <string name="kg_login_password_hint" msgid="9057289103827298549">"पासवरà¥à¤¡"</string>
+ <string name="kg_login_submit_button" msgid="5355904582674054702">"साइन इन गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="kg_login_invalid_input" msgid="5754664119319872197">"अमानà¥à¤¯ पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤¨à¤¾à¤® वा पासवरà¥à¤¡à¥¤"</string>
+ <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"के तपाईà¤à¤²à¥‡ उपयोगकरà¥à¤¤à¤¾ नाम वा पासवरà¥à¤¡ बिरà¥à¤¸à¤¨à¥à¤­à¤¯à¥‹?\n"<b>"google.com/accounts/recovery"</b>" मा जानà¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="kg_login_checking_password" msgid="1052685197710252395">"खाता जाà¤à¤š हà¥à¤à¤¦à¥ˆâ€¦"</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"तपाईà¤à¤²à¥‡ गलत तरिकाले तपाईà¤à¤•ो PIN <xliff:g id="NUMBER_0">%d</xliff:g> पटक टाइप गरà¥à¤¨à¥ भà¤à¤•ो छ। \n\n<xliff:g id="NUMBER_1">%d</xliff:g> सेकेनà¥à¤¡à¤®à¤¾ फेरि पà¥à¤°à¤¯à¤¾à¤¸ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"तपाईà¤à¤²à¥‡ तपाईà¤à¤• पासवरà¥à¤¡ <xliff:g id="NUMBER_0">%d</xliff:g> पटक गलत टाइप गरà¥à¤¨à¥à¤­à¤à¤•ो छ। \n\n <xliff:g id="NUMBER_1">%d</xliff:g> सेकेनà¥à¤¡à¤®à¤¾ फेरि पà¥à¤°à¤¯à¤¾à¤¸ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"तपाईà¤à¤²à¥‡ तपाईà¤à¤•ो अनलक ढाà¤à¤šà¤¾ गलत तरिकाले <xliff:g id="NUMBER_0">%d</xliff:g> पटक खिचà¥à¤¨à¥ भà¤à¤•ो छ। \n\n <xliff:g id="NUMBER_1">%d</xliff:g> सेकेनà¥à¤¡à¤®à¤¾ फेरि कोसिस गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1575557200627128949">"तपाईà¤à¤²à¥‡ टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿà¤²à¤¾à¤ˆ अनलक गरà¥à¤¨ गलत तरिकाले <xliff:g id="NUMBER_0">%d</xliff:g> पटक कोसिस गरà¥à¤¨à¥ भà¤à¤•ो छ। <xliff:g id="NUMBER_1">%d</xliff:g> पछि थप असफल पà¥à¤°à¤¯à¤¾à¤¸à¤¹à¤°à¥‚, टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿ पूरà¥à¤µà¤¨à¤¿à¤°à¥à¤§à¤¾à¤°à¤¿à¤¤ कारà¥à¤¯à¤¶à¤¾à¤²à¤¾à¤®à¤¾ पà¥à¤¨à¤ƒà¤¸à¥‡à¤Ÿ गरिने छ र सबै पà¥à¤°à¤¯à¥‹à¤— डेटा हराउने छ।"</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="4051015943038199910">"तपाईà¤à¤²à¥‡ गलतसà¤à¤— फोनलाई अनलक गरà¥à¤¨ <xliff:g id="NUMBER_0">%d</xliff:g> पटक कोसिस गरà¥à¤¨à¥ भयो। <xliff:g id="NUMBER_1">%d</xliff:g> पछि थप असफल कोसिसहरू, फोनलाई पूरà¥à¤µà¤¨à¤¿à¤°à¥à¤§à¤¾à¤°à¤¿à¤¤ कारà¥à¤¯à¤¶à¤¾à¤²à¤¾à¤®à¤¾ पà¥à¤¨à¤ƒà¤¸à¥‡à¤Ÿ गरिने छ र सबै पà¥à¤°à¤¯à¥‹à¤— डेटा हराउने छ।"</string>
+ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="2072996269148483637">"तपाईà¤à¤²à¥‡ टà¥à¤¯à¤¬à¥à¤²à¥‡à¤Ÿà¤²à¤¾à¤ˆ अनलक गरà¥à¤¨ गलत तरिकाले <xliff:g id="NUMBER">%d</xliff:g> पटक पà¥à¤°à¤¯à¤¾à¤¸ गरà¥à¤¨à¥ भà¤à¤•ो छ। अब टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿà¤²à¤¾à¤ˆ पूरà¥à¤µà¤¨à¤¿à¤°à¥à¤§à¤¾à¤°à¤¿à¤¤ कारà¥à¤¯à¤¶à¤¾à¤²à¤¾à¤®à¤¾ पà¥à¤¨à¤ƒà¤¸à¥‡à¤Ÿ गरिने छ।"</string>
+ <string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"तपाईंले गलत तरिकाले फोन <xliff:g id="NUMBER">%d</xliff:g> पटक अनलक गरà¥à¤¨à¥‡ पà¥à¤°à¤¯à¤¤à¥à¤¨ गरà¥à¤¨à¥à¤­à¤¯à¥‹à¥¤ अब फोन फà¥à¤¯à¤¾à¤•à¥à¤Ÿà¥à¤°à¤¿ पूरà¥à¤µà¤¨à¤¿à¤°à¥à¤§à¤¾à¤°à¤¿à¤¤à¤®à¤¾ पà¥à¤¨à¤ƒà¤¸à¥‡à¤Ÿ हà¥à¤¨à¥‡ छ।"</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"तपाईंले गलत तरिकाले आफà¥à¤¨à¥‹ अनलक ढाà¤à¤šà¤¾ <xliff:g id="NUMBER_0">%d</xliff:g> पटक कोरà¥à¤¨à¥à¤­à¤¯à¥‹à¥¤ <xliff:g id="NUMBER_1">%d</xliff:g> विफल पà¥à¤°à¤¯à¤¤à¥à¤¨à¤¹à¤°à¥‚ पछि, तपाईंलाई आफà¥à¤¨à¥‹ टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿ इमेल खाता पà¥à¤°à¤¯à¥‹à¤— गरेर अनलक गरà¥à¤¨ सोधिने छ।\n\n फेरि पà¥à¤°à¤¯à¤¾à¤¸ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ <xliff:g id="NUMBER_2">%d</xliff:g> सेकेनà¥à¤¡à¤¹à¤°à¥‚मा।"</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"तपाईà¤à¤²à¥‡ आफà¥à¤¨à¥‹ अनलक ढाà¤à¤šà¤¾ गलत रूपमा <xliff:g id="NUMBER_0">%d</xliff:g> पटक तानà¥à¤¨à¥ भà¤à¤•ो छ। <xliff:g id="NUMBER_1">%d</xliff:g> धेरै असफल पà¥à¤°à¤¯à¤¾à¤¸à¤¹à¤°à¥‚पछि, तपाईà¤à¤²à¤¾à¤ˆ à¤à¤‰à¤Ÿà¤¾ इमेल खाताको पà¥à¤°à¤¯à¥‹à¤— गरेर तपाईà¤à¤•ो फोन अनलक गरà¥à¤¨ सोधिने छ।\n\n फेरि <xliff:g id="NUMBER_2">%d</xliff:g> सेकेनà¥à¤¡à¤®à¤¾ पà¥à¤°à¤¯à¤¾à¤¸ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
+ <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"हटाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="safe_media_volume_warning" product="default" msgid="7324161939475478066">"आवाज सलà¥à¤²à¤¾à¤¹ दिà¤à¤•ो तहभनà¥à¤¦à¤¾ माथि बढाउने हो?\nठूलो आवाजमा सà¥à¤¨à¥à¤¦à¤¾ लामो समयको लागि तपाईà¤à¤•ो सà¥à¤¨à¥à¤¨à¥‡ शकà¥à¤¤à¥€à¤²à¤¾à¤ˆ खतà¥à¤¤à¤® पारà¥à¤¨ सकà¥à¤›à¥¤"</string>
+ <string name="continue_to_enable_accessibility" msgid="1626427372316070258">"उपलबà¥à¤§à¤¤à¤¾ सकà¥à¤·à¤® पारà¥à¤¨ दà¥à¤ˆà¤µà¤Ÿà¤¾ औंलाहरूले थिचिरहनà¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="accessibility_enabled" msgid="1381972048564547685">"पहà¥à¤à¤š सकà¥à¤·à¤® गरिà¤à¤•ो।"</string>
+ <string name="enable_accessibility_canceled" msgid="3833923257966635673">"पहà¥à¤à¤šà¤¯à¥‹à¤—à¥à¤¯à¤¤à¤¾ रदà¥à¤¦ गरियो।"</string>
+ <string name="user_switched" msgid="3768006783166984410">"अहिलेको पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ <xliff:g id="NAME">%1$s</xliff:g>।"</string>
+ <string name="owner_name" msgid="2716755460376028154">"मालिक"</string>
+ <string name="error_message_title" msgid="4510373083082500195">"तà¥à¤°à¥à¤Ÿà¤¿"</string>
+ <string name="app_no_restricted_accounts" msgid="5739463249673727736">"पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¿à¤¤ पà¥à¤°à¥‹à¤«à¤¾à¤‡à¤²à¤¹à¤°à¥‚को लागि यस अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—ले खाताहरू समरà¥à¤¥à¤¨ गरà¥à¤¦à¥ˆà¤¨"</string>
+ <string name="app_not_found" msgid="3429141853498927379">"यस कारà¥à¤¯ समà¥à¤¹à¤¾à¤²à¤¨à¥‡ कà¥à¤¨à¥ˆ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— भेटिà¤à¤¨"</string>
+ <string name="revoke" msgid="5404479185228271586">"रदà¥à¤¦ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="mediaSize_iso_a0" msgid="7875427489420821793">"ISO A0"</string>
+ <string name="mediaSize_iso_a1" msgid="3760734499050875356">"ISO A1"</string>
+ <string name="mediaSize_iso_a2" msgid="5973266378020144382">"ISO A2"</string>
+ <string name="mediaSize_iso_a3" msgid="1373407105687300884">"ISO A3"</string>
+ <string name="mediaSize_iso_a4" msgid="6689772807982597254">"ISO A4"</string>
+ <string name="mediaSize_iso_a5" msgid="5353549652015741040">"ISO A5"</string>
+ <string name="mediaSize_iso_a6" msgid="8585038048674911907">"ISO A6"</string>
+ <string name="mediaSize_iso_a7" msgid="6641836716963839119">"ISO A7"</string>
+ <string name="mediaSize_iso_a8" msgid="7571139437465693355">"ISO A8"</string>
+ <string name="mediaSize_iso_a9" msgid="1378455891957115079">"ISO A9"</string>
+ <string name="mediaSize_iso_a10" msgid="2480747457429475344">"ISO A10"</string>
+ <string name="mediaSize_iso_b0" msgid="3965935097661108039">"ISO B0"</string>
+ <string name="mediaSize_iso_b1" msgid="2505753285010115437">"ISO B1"</string>
+ <string name="mediaSize_iso_b2" msgid="8763874709859458453">"ISO B2"</string>
+ <string name="mediaSize_iso_b3" msgid="4210506688191764076">"ISO B3"</string>
+ <string name="mediaSize_iso_b4" msgid="5749404165888526034">"ISO B4"</string>
+ <string name="mediaSize_iso_b5" msgid="7640627414621904733">"ISO B5"</string>
+ <string name="mediaSize_iso_b6" msgid="7342988864712748544">"ISO B6"</string>
+ <string name="mediaSize_iso_b7" msgid="5069844065235382429">"ISO B7"</string>
+ <string name="mediaSize_iso_b8" msgid="7316818922278779774">"ISO B8"</string>
+ <string name="mediaSize_iso_b9" msgid="5414727094026532341">"ISO B9"</string>
+ <string name="mediaSize_iso_b10" msgid="5251253731832048185">"ISO B10"</string>
+ <string name="mediaSize_iso_c0" msgid="4003138342671964217">"ISO C0"</string>
+ <string name="mediaSize_iso_c1" msgid="1935188063393553008">"ISO C1"</string>
+ <string name="mediaSize_iso_c2" msgid="3197307969712069904">"ISO C2"</string>
+ <string name="mediaSize_iso_c3" msgid="4335826087321913508">"ISO C3"</string>
+ <string name="mediaSize_iso_c4" msgid="3745639598281015005">"ISO C4"</string>
+ <string name="mediaSize_iso_c5" msgid="8269457765822791013">"ISO C5"</string>
+ <string name="mediaSize_iso_c6" msgid="566666105260346930">"ISO C6"</string>
+ <string name="mediaSize_iso_c7" msgid="8678413180782608498">"ISO C7"</string>
+ <string name="mediaSize_iso_c8" msgid="8392376206627041730">"ISO C8"</string>
+ <string name="mediaSize_iso_c9" msgid="9191613372324845405">"ISO C9"</string>
+ <string name="mediaSize_iso_c10" msgid="7327709699184920822">"ISO C10"</string>
+ <string name="mediaSize_na_letter" msgid="4191805615829472953">"पतà¥à¤°"</string>
+ <string name="mediaSize_na_gvrnmt_letter" msgid="7853382192649405507">"सरकारी पतà¥à¤°"</string>
+ <string name="mediaSize_na_legal" msgid="6697982988283823150">"कानूनी"</string>
+ <string name="mediaSize_na_junior_legal" msgid="3727743969902758948">"Junior Legal"</string>
+ <string name="mediaSize_na_ledger" msgid="281871464896601236">"Ledger"</string>
+ <string name="mediaSize_na_tabloid" msgid="5775966416333578127">"Tabloid"</string>
+ <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"रदà¥à¤¦ गरियो"</string>
+ <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"सामागà¥à¤°à¥€ लेखनमा तà¥à¤°à¥à¤Ÿà¤¿"</string>
+ <string name="restr_pin_enter_pin" msgid="3395953421368476103">"PIN पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¿ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"वरà¥à¤¤à¤®à¤¾à¤¨ PIN"</string>
+ <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"नयाठPIN"</string>
+ <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"नयाठPIN निशà¥à¤šà¤¿à¤¤ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="restr_pin_create_pin" msgid="8017600000263450337">"पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¹à¤°à¥‚लाई परिवरà¥à¤¤à¤¨ गरà¥à¤¨à¤•ो लागि à¤à¤‰à¤Ÿà¤¾ PIN बनाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"PIN हरू मेल खाà¤à¤¨à¤¨à¥à¥¤ पà¥à¤¨à¤ƒ पà¥à¤°à¤¯à¤¾à¤¸ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="restr_pin_error_too_short" msgid="8173982756265777792">"PIN अति छोटो भयो। कमà¥à¤¤à¥€à¤®à¤¾ ४ अङà¥à¤• हà¥à¤¨ आवशà¥à¤¯à¤• छ।"</string>
+ <plurals name="restr_pin_countdown">
+ <item quantity="one" msgid="4835639969503729874">"गलत PIN । १ सेकेनà¥à¤¡à¤®à¤¾ पà¥à¤¨à¤ƒ पà¥à¤°à¤¯à¤¾à¤¸ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</item>
+ <item quantity="other" msgid="8030607343223287654">"गलत PIN । <xliff:g id="COUNT">%d</xliff:g> सेकेनà¥à¤¡à¤®à¤¾ पà¥à¤¨à¤ƒ पà¥à¤°à¤¯à¤¾à¤¸ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</item>
+ </plurals>
+ <string name="transient_navigation_confirmation" msgid="4907844043611123426">"पटà¥à¤Ÿà¤¿ देखिने बनाउन सà¥à¤•à¥à¤°à¤¿à¤¨à¤•ो छेउमा सà¥à¤µà¤¾à¤‡à¤ª गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"पà¥à¤°à¤£à¤¾à¤²à¥€ पटà¥à¤Ÿà¤¿ देखिने बनाउन सà¥à¤•à¥à¤°à¤¿à¤¨à¤•ो छेउबाट सà¥à¤µà¤¾à¤‡à¤ª गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+</resources>
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index 30afea7..8596ed2 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -50,6 +50,11 @@
<string name="invalidPuk" msgid="8761456210898036513">"Typ een PUK-code die 8 cijfers of langer is."</string>
<string name="needPuk" msgid="919668385956251611">"Uw SIM-kaart is vergrendeld met de PUK-code. Typ de PUK-code om te ontgrendelen."</string>
<string name="needPuk2" msgid="4526033371987193070">"Voer de PUK2-code in om de SIM-kaart te ontgrendelen."</string>
+ <string name="enablePin" msgid="209412020907207950">"Mislukt. Schakel SIM/RUIM-vergrendeling in."</string>
+ <plurals name="pinpuk_attempts">
+ <item quantity="one" msgid="6596245285809790142">"U heeft nog <xliff:g id="NUMBER">%d</xliff:g> poging over voordat de simkaart wordt vergrendeld."</item>
+ <item quantity="other" msgid="7530597808358774740">"U heeft nog <xliff:g id="NUMBER">%d</xliff:g> pogingen over voordat de simkaart wordt vergrendeld."</item>
+ </plurals>
<string name="imei" msgid="2625429890869005782">"IMEI"</string>
<string name="meid" msgid="4841221237681254195">"MEID"</string>
<string name="ClipMmi" msgid="6952821216480289285">"Inkomende beller-id"</string>
@@ -477,6 +482,8 @@
<string name="permdesc_accessSurfaceFlinger" msgid="1041619516733293551">"Hiermee kan de app SurfaceFlinger-functies op laag niveau gebruiken."</string>
<string name="permlab_readFrameBuffer" msgid="6690504248178498136">"framebuffer lezen"</string>
<string name="permdesc_readFrameBuffer" msgid="4937405521809454680">"Hiermee kan de app de inhoud van de framebuffer lezen."</string>
+ <string name="permlab_accessInputFlinger" msgid="5348635270689553857">"toegang krijgen tot InputFlinger"</string>
+ <string name="permdesc_accessInputFlinger" msgid="2104864941201226616">"Hiermee kan de app InputFlinger-functies op laag niveau gebruiken."</string>
<string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"wifi-displays configureren"</string>
<string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"De app toestaan wifi-displays te configureren en hiermee verbinding te maken."</string>
<string name="permlab_controlWifiDisplay" msgid="393641276723695496">"wifi-displays beheren"</string>
@@ -1414,6 +1421,7 @@
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
<string name="activitychooserview_choose_application" msgid="2125168057199941199">"Een app selecteren"</string>
+ <string name="activitychooserview_choose_application_error" msgid="8624618365481126668">"Kan <xliff:g id="APPLICATION_NAME">%s</xliff:g> niet starten"</string>
<string name="shareactionprovider_share_with" msgid="806688056141131819">"Delen met"</string>
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Delen met <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Schuifgreep. Tikken en blijven aanraken."</string>
@@ -1482,7 +1490,7 @@
<string name="default_media_route_name_hdmi" msgid="2450970399023478055">"HDMI"</string>
<string name="default_audio_route_category_name" msgid="3722811174003886946">"Systeem"</string>
<string name="bluetooth_a2dp_audio_route_name" msgid="8575624030406771015">"Bluetooth-audio"</string>
- <string name="wireless_display_route_description" msgid="9070346425023979651">"Draadloze display"</string>
+ <string name="wireless_display_route_description" msgid="9070346425023979651">"Draadloze weergave"</string>
<string name="media_route_chooser_grouping_done" msgid="7966438307723317169">"Gereed"</string>
<string name="media_route_button_content_description" msgid="5758553567065145276">"Media-uitvoer"</string>
<string name="media_route_status_scanning" msgid="7279908761758293783">"Scannen..."</string>
@@ -1495,7 +1503,7 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Overlay <xliff:g id="ID">%1$d</xliff:g>"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", beveiligd"</string>
- <string name="wifi_display_notification_title" msgid="2223050649240326557">"Draadloze display is aangesloten"</string>
+ <string name="wifi_display_notification_title" msgid="2223050649240326557">"Draadloze weergave is aangesloten"</string>
<string name="wifi_display_notification_message" msgid="4498802012464170685">"Dit scherm wordt op een ander apparaat weergegeven"</string>
<string name="wifi_display_notification_disconnect" msgid="6183754463561153372">"Verbinding verbreken"</string>
<string name="kg_emergency_call_label" msgid="684946192523830531">"Noodoproep"</string>
@@ -1650,4 +1658,15 @@
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Probeer het later opnieuw"</string>
<string name="immersive_mode_confirmation" msgid="7227416894979047467">"Veeg omlaag vanaf de bovenkant om het volledige scherm te sluiten."</string>
+ <string name="done_label" msgid="2093726099505892398">"Gereed"</string>
+ <string name="hour_picker_description" msgid="6698199186859736512">"Ronde schuifregelaar voor uren"</string>
+ <string name="minute_picker_description" msgid="8606010966873791190">"Ronde schuifregelaar voor minuten"</string>
+ <string name="select_hours" msgid="6043079511766008245">"Uren selecteren"</string>
+ <string name="select_minutes" msgid="3974345615920336087">"Minuten selecteren"</string>
+ <string name="day_picker_description" msgid="8990847925961297968">"Maandraster van dagen"</string>
+ <string name="year_picker_description" msgid="5524331207436052403">"Jaarlijst"</string>
+ <string name="select_day" msgid="7774759604701773332">"Maand en dag selecteren"</string>
+ <string name="select_year" msgid="7952052866994196170">"Jaar selecteren"</string>
+ <string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> geselecteerd"</string>
+ <string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> verwijderd"</string>
</resources>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index 0e1bee9..aebfcf8 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -50,6 +50,11 @@
<string name="invalidPuk" msgid="8761456210898036513">"Wpisz kod PUK składający się z co najmniej 8 cyfr."</string>
<string name="needPuk" msgid="919668385956251611">"Karta SIM jest zablokowana kodem PUK. Wprowadź kod PUK, aby odblokować kartę."</string>
<string name="needPuk2" msgid="4526033371987193070">"Wprowadź kod PUK2, aby odblokować kartę SIM."</string>
+ <string name="enablePin" msgid="209412020907207950">"Nie udało się. Włącz blokadę karty SIM/RUIM."</string>
+ <plurals name="pinpuk_attempts">
+ <item quantity="one" msgid="6596245285809790142">"Masz jeszcze <xliff:g id="NUMBER">%d</xliff:g> próbę, zanim karta SIM zostanie zablokowana."</item>
+ <item quantity="other" msgid="7530597808358774740">"Masz jeszcze <xliff:g id="NUMBER">%d</xliff:g> prób(y), zanim karta SIM zostanie zablokowana."</item>
+ </plurals>
<string name="imei" msgid="2625429890869005782">"IMEI"</string>
<string name="meid" msgid="4841221237681254195">"MEID"</string>
<string name="ClipMmi" msgid="6952821216480289285">"Nazwa rozmówcy przy połączeniach przychodzących"</string>
@@ -477,6 +482,8 @@
<string name="permdesc_accessSurfaceFlinger" msgid="1041619516733293551">"Pozwala aplikacji na wykorzystanie funkcji niskiego poziomu usługi SurfaceFlinger."</string>
<string name="permlab_readFrameBuffer" msgid="6690504248178498136">"czytanie bufora ramki"</string>
<string name="permdesc_readFrameBuffer" msgid="4937405521809454680">"Pozwala aplikacji na odczyt zawartości bufora ramki."</string>
+ <string name="permlab_accessInputFlinger" msgid="5348635270689553857">"dostęp do InputFlinger"</string>
+ <string name="permdesc_accessInputFlinger" msgid="2104864941201226616">"Zezwala aplikacji na wykorzystanie niskopoziomowych funkcji usługi InputFlinger."</string>
<string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"konfigurowanie wyświetlaczy Wi-Fi"</string>
<string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"Zezwala aplikacji na konfigurację wyświetlaczy Wi-Fi i łączenie z nimi."</string>
<string name="permlab_controlWifiDisplay" msgid="393641276723695496">"zarządzanie wyświetlaczami Wi-Fi"</string>
@@ -1204,7 +1211,7 @@
<string name="wifi_p2p_frequency_conflict_message" product="default" msgid="7363907213787469151">"Na czas połączenia z <xliff:g id="DEVICE_NAME">%1$s</xliff:g> telefon zostanie tymczasowo odłączony od Wi-Fi"</string>
<string name="select_character" msgid="3365550120617701745">"Wstaw znak"</string>
<string name="sms_control_title" msgid="7296612781128917719">"Wysyłanie wiadomości SMS"</string>
- <string name="sms_control_message" msgid="3867899169651496433">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; wysyła wiele SMS-ów. Chcesz pozwolić tej aplikacji dalej wysyłać SMS-y?"</string>
+ <string name="sms_control_message" msgid="3867899169651496433">"Aplikacja &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; wysyła wiele SMS-ów. Chcesz pozwolić tej aplikacji dalej wysyłać SMS-y?"</string>
<string name="sms_control_yes" msgid="3663725993855816807">"Pozwól"</string>
<string name="sms_control_no" msgid="625438561395534982">"Odmów"</string>
<string name="sms_short_code_confirm_message" msgid="1645436466285310855">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; chce wysłać wiadomość do &lt;b&gt;<xliff:g id="DEST_ADDRESS">%2$s</xliff:g>&lt;/b&gt;."</string>
@@ -1414,6 +1421,7 @@
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
<string name="activitychooserview_choose_application" msgid="2125168057199941199">"Wybierz aplikacjÄ™"</string>
+ <string name="activitychooserview_choose_application_error" msgid="8624618365481126668">"Nie udało się uruchomić aplikacji <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="shareactionprovider_share_with" msgid="806688056141131819">"Udostępnij przez"</string>
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Udostępnij przez <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Uchwyt przesuwny. Dotknij i przytrzymaj."</string>
@@ -1650,4 +1658,15 @@
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Spróbuj ponownie później"</string>
<string name="immersive_mode_confirmation" msgid="7227416894979047467">"Przesuń z góry w dół, by zamknąć pełny ekran."</string>
+ <string name="done_label" msgid="2093726099505892398">"Gotowe"</string>
+ <string name="hour_picker_description" msgid="6698199186859736512">"Kołowy suwak godzin"</string>
+ <string name="minute_picker_description" msgid="8606010966873791190">"Kołowy suwak minut"</string>
+ <string name="select_hours" msgid="6043079511766008245">"Wybierz godziny"</string>
+ <string name="select_minutes" msgid="3974345615920336087">"Wybierz minuty"</string>
+ <string name="day_picker_description" msgid="8990847925961297968">"Siatka miesięczna z dniami"</string>
+ <string name="year_picker_description" msgid="5524331207436052403">"Lista lat"</string>
+ <string name="select_day" msgid="7774759604701773332">"Wybierz miesiąc i dzień"</string>
+ <string name="select_year" msgid="7952052866994196170">"Wybierz rok"</string>
+ <string name="item_is_selected" msgid="949687401682476608">"Wybrałeś <xliff:g id="ITEM">%1$s</xliff:g>"</string>
+ <string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> usunięte"</string>
</resources>
diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml
index f3c4020..e0fbe1c 100644
--- a/core/res/res/values-pt-rPT/strings.xml
+++ b/core/res/res/values-pt-rPT/strings.xml
@@ -50,6 +50,11 @@
<string name="invalidPuk" msgid="8761456210898036513">"Introduza um PUK que tenha 8 ou mais algarismos."</string>
<string name="needPuk" msgid="919668385956251611">"O seu cartão SIM está bloqueado com PUK. Introduza o código PUK para desbloqueá-lo."</string>
<string name="needPuk2" msgid="4526033371987193070">"Introduza o PUK2 para desbloquear o cartão SIM."</string>
+ <string name="enablePin" msgid="209412020907207950">"Ação sem êxito. Ative o bloqueio do SIM/RUIM."</string>
+ <plurals name="pinpuk_attempts">
+ <item quantity="one" msgid="6596245285809790142">"Tem mais <xliff:g id="NUMBER">%d</xliff:g> tentativa antes de o cartão SIM ficar bloqueado."</item>
+ <item quantity="other" msgid="7530597808358774740">"Tem mais <xliff:g id="NUMBER">%d</xliff:g> tentativas antes de o cartão SIM ficar bloqueado."</item>
+ </plurals>
<string name="imei" msgid="2625429890869005782">"IMEI"</string>
<string name="meid" msgid="4841221237681254195">"MEID"</string>
<string name="ClipMmi" msgid="6952821216480289285">"ID do Autor da Chamada"</string>
@@ -477,6 +482,8 @@
<string name="permdesc_accessSurfaceFlinger" msgid="1041619516733293551">"Permite à aplicação utilizar funcionalidades de SurfaceFlinger de nível inferior."</string>
<string name="permlab_readFrameBuffer" msgid="6690504248178498136">"ler memória intermédia de fotogramas"</string>
<string name="permdesc_readFrameBuffer" msgid="4937405521809454680">"Permite à aplicação ler o conteúdo da memória intermédia de fotogramas."</string>
+ <string name="permlab_accessInputFlinger" msgid="5348635270689553857">"aceder a InputFlinger"</string>
+ <string name="permdesc_accessInputFlinger" msgid="2104864941201226616">"Permite que a aplicação utilize funcionalidades de InputFlinger de nível inferior."</string>
<string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"configurar visores Wi-Fi"</string>
<string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"Permite que a aplicação se configure e se ligue a visores Wi-Fi."</string>
<string name="permlab_controlWifiDisplay" msgid="393641276723695496">"controlar visores Wi-Fi"</string>
@@ -1414,6 +1421,7 @@
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
<string name="activitychooserview_choose_application" msgid="2125168057199941199">"Escolher uma aplicação"</string>
+ <string name="activitychooserview_choose_application_error" msgid="8624618365481126668">"Não foi possível iniciar <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="shareactionprovider_share_with" msgid="806688056141131819">"Partilhar com:"</string>
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Compartilhar com <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Barra deslizante. Toque &amp; não solte."</string>
@@ -1650,4 +1658,15 @@
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Tente novamente mais tarde"</string>
<string name="immersive_mode_confirmation" msgid="7227416894979047467">"Deslize rapidamente para baixo para sair do ecrã inteiro."</string>
+ <string name="done_label" msgid="2093726099505892398">"Concluído"</string>
+ <string name="hour_picker_description" msgid="6698199186859736512">"Controlo de deslize circular das horas"</string>
+ <string name="minute_picker_description" msgid="8606010966873791190">"Controlo de deslize circular dos minutos"</string>
+ <string name="select_hours" msgid="6043079511766008245">"Selecionar horas"</string>
+ <string name="select_minutes" msgid="3974345615920336087">"Selecionar minutos"</string>
+ <string name="day_picker_description" msgid="8990847925961297968">"Grelha de dias do mês"</string>
+ <string name="year_picker_description" msgid="5524331207436052403">"Lista de anos"</string>
+ <string name="select_day" msgid="7774759604701773332">"Selecionar mês e dia"</string>
+ <string name="select_year" msgid="7952052866994196170">"Selecionar ano"</string>
+ <string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> selecionado"</string>
+ <string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> eliminado"</string>
</resources>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index 15a6130..1c517ab 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -50,6 +50,11 @@
<string name="invalidPuk" msgid="8761456210898036513">"Digite um PUK com oito números ou mais."</string>
<string name="needPuk" msgid="919668385956251611">"O seu cartão SIM está bloqueado por um PUK. Digite o código PUK para desbloqueá-lo."</string>
<string name="needPuk2" msgid="4526033371987193070">"Digite o PUK2 para desbloquear o cartão SIM."</string>
+ <string name="enablePin" msgid="209412020907207950">"Falha. Ative o bloqueio do SIM/R-UIM."</string>
+ <plurals name="pinpuk_attempts">
+ <item quantity="one" msgid="6596245285809790142">"Tentativas restantes: <xliff:g id="NUMBER">%d</xliff:g>. Caso o código correto não seja digitado, o SIM será bloqueado."</item>
+ <item quantity="other" msgid="7530597808358774740">"Tentativas restantes: <xliff:g id="NUMBER">%d</xliff:g>. Caso o código correto não seja digitado, o SIM será bloqueado."</item>
+ </plurals>
<string name="imei" msgid="2625429890869005782">"IMEI"</string>
<string name="meid" msgid="4841221237681254195">"MEID"</string>
<string name="ClipMmi" msgid="6952821216480289285">"ID do chamador de entrada"</string>
@@ -477,6 +482,8 @@
<string name="permdesc_accessSurfaceFlinger" msgid="1041619516733293551">"Permite que o aplicativo use recursos com baixos níveis de SurfaceFlinger."</string>
<string name="permlab_readFrameBuffer" msgid="6690504248178498136">"ler o buffer do frame"</string>
<string name="permdesc_readFrameBuffer" msgid="4937405521809454680">"Permite que o aplicativo leia o conteúdo do buffer de frame."</string>
+ <string name="permlab_accessInputFlinger" msgid="5348635270689553857">"acessar InputFlinger"</string>
+ <string name="permdesc_accessInputFlinger" msgid="2104864941201226616">"Permite que o aplicativo use recursos com baixos níveis de InputFinger."</string>
<string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"configurar monitores Wi-Fi"</string>
<string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"Permite que o aplicativo configure e conecte a monitores Wi-Fi."</string>
<string name="permlab_controlWifiDisplay" msgid="393641276723695496">"controlar monitores Wi-Fi"</string>
@@ -1414,6 +1421,7 @@
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
<string name="activitychooserview_choose_application" msgid="2125168057199941199">"Selecione um aplicativo"</string>
+ <string name="activitychooserview_choose_application_error" msgid="8624618365481126668">"Não foi possível iniciar o <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="shareactionprovider_share_with" msgid="806688056141131819">"Compartilhar com"</string>
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Compartilhar com <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Recurso deslizante. Toque e segure."</string>
@@ -1649,5 +1657,16 @@
<item quantity="other" msgid="4730868920742952817">"Tente novamente em <xliff:g id="COUNT">%d</xliff:g> segundos"</item>
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Tente novamente mais tarde"</string>
- <string name="immersive_mode_confirmation" msgid="7227416894979047467">"Deslize para baixo para sair da tela inteira"</string>
+ <string name="immersive_mode_confirmation" msgid="7227416894979047467">"Deslize de cima para baixo para sair da tela inteira"</string>
+ <string name="done_label" msgid="2093726099505892398">"Concluído"</string>
+ <string name="hour_picker_description" msgid="6698199186859736512">"Controle deslizante circular das horas"</string>
+ <string name="minute_picker_description" msgid="8606010966873791190">"Controle deslizante circular dos minutos"</string>
+ <string name="select_hours" msgid="6043079511766008245">"Selecione as horas"</string>
+ <string name="select_minutes" msgid="3974345615920336087">"Selecione os minutos"</string>
+ <string name="day_picker_description" msgid="8990847925961297968">"Grade mensal de dias"</string>
+ <string name="year_picker_description" msgid="5524331207436052403">"Lista de anos"</string>
+ <string name="select_day" msgid="7774759604701773332">"Selecione o mês e o dia"</string>
+ <string name="select_year" msgid="7952052866994196170">"Selecione o ano"</string>
+ <string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> selecionado"</string>
+ <string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> excluído"</string>
</resources>
diff --git a/core/res/res/values-rm/strings.xml b/core/res/res/values-rm/strings.xml
index 9154621..48ff2a5 100644
--- a/core/res/res/values-rm/strings.xml
+++ b/core/res/res/values-rm/strings.xml
@@ -57,6 +57,10 @@
<skip />
<string name="needPuk" msgid="919668385956251611">"Vossa carta SIM è bloccada cun in PUK. Endatai il PUK per debloccar ella."</string>
<string name="needPuk2" msgid="4526033371987193070">"Endatai il PUK2 per debloccar la carta SIM."</string>
+ <!-- no translation found for enablePin (209412020907207950) -->
+ <skip />
+ <!-- no translation found for pinpuk_attempts:one (6596245285809790142) -->
+ <!-- no translation found for pinpuk_attempts:other (7530597808358774740) -->
<!-- no translation found for imei (2625429890869005782) -->
<skip />
<!-- no translation found for meid (4841221237681254195) -->
@@ -783,6 +787,10 @@
<string name="permlab_readFrameBuffer" msgid="6690504248178498136">"leger il paraculp da frame"</string>
<!-- no translation found for permdesc_readFrameBuffer (4937405521809454680) -->
<skip />
+ <!-- no translation found for permlab_accessInputFlinger (5348635270689553857) -->
+ <skip />
+ <!-- no translation found for permdesc_accessInputFlinger (2104864941201226616) -->
+ <skip />
<!-- no translation found for permlab_configureWifiDisplay (5595661694746742168) -->
<skip />
<!-- no translation found for permdesc_configureWifiDisplay (7916815158690218065) -->
@@ -2267,6 +2275,8 @@
<skip />
<!-- no translation found for activitychooserview_choose_application (2125168057199941199) -->
<skip />
+ <!-- no translation found for activitychooserview_choose_application_error (8624618365481126668) -->
+ <skip />
<!-- no translation found for shareactionprovider_share_with (806688056141131819) -->
<skip />
<!-- no translation found for shareactionprovider_share_with_application (5627411384638389738) -->
@@ -2735,4 +2745,26 @@
<!-- no translation found for immersive_mode_confirmation (7227416894979047467) -->
<!-- no translation found for immersive_mode_confirmation (8554991488096662508) -->
<skip />
+ <!-- no translation found for done_label (2093726099505892398) -->
+ <skip />
+ <!-- no translation found for hour_picker_description (6698199186859736512) -->
+ <skip />
+ <!-- no translation found for minute_picker_description (8606010966873791190) -->
+ <skip />
+ <!-- no translation found for select_hours (6043079511766008245) -->
+ <skip />
+ <!-- no translation found for select_minutes (3974345615920336087) -->
+ <skip />
+ <!-- no translation found for day_picker_description (8990847925961297968) -->
+ <skip />
+ <!-- no translation found for year_picker_description (5524331207436052403) -->
+ <skip />
+ <!-- no translation found for select_day (7774759604701773332) -->
+ <skip />
+ <!-- no translation found for select_year (7952052866994196170) -->
+ <skip />
+ <!-- no translation found for item_is_selected (949687401682476608) -->
+ <skip />
+ <!-- no translation found for deleted_key (7659477886625566590) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml
index dc5a211..5938239 100644
--- a/core/res/res/values-ro/strings.xml
+++ b/core/res/res/values-ro/strings.xml
@@ -50,6 +50,11 @@
<string name="invalidPuk" msgid="8761456210898036513">"Introduceţi un cod PUK care să aibă 8 cifre sau mai mult."</string>
<string name="needPuk" msgid="919668385956251611">"Cardul SIM este blocat cu codul PUK. Introduceţi codul PUK pentru a-l debloca."</string>
<string name="needPuk2" msgid="4526033371987193070">"Introduceţi codul PUK2 pentru a debloca cardul SIM."</string>
+ <string name="enablePin" msgid="209412020907207950">"Operațiunea nu a reușit. Activați blocarea cardului SIM/RUIM."</string>
+ <plurals name="pinpuk_attempts">
+ <item quantity="one" msgid="6596245285809790142">"V-a mai rămas <xliff:g id="NUMBER">%d</xliff:g> încercare până la blocarea cardului SIM."</item>
+ <item quantity="other" msgid="7530597808358774740">"V-au mai rămas <xliff:g id="NUMBER">%d</xliff:g> încercări până la blocarea cardului SIM."</item>
+ </plurals>
<string name="imei" msgid="2625429890869005782">"IMEI"</string>
<string name="meid" msgid="4841221237681254195">"MEID"</string>
<string name="ClipMmi" msgid="6952821216480289285">"ID apelant de primire"</string>
@@ -477,6 +482,8 @@
<string name="permdesc_accessSurfaceFlinger" msgid="1041619516733293551">"Permite aplicaţiei să utilizeze funcţiile de nivel redus SurfaceFlinger."</string>
<string name="permlab_readFrameBuffer" msgid="6690504248178498136">"citire zonă tampon de cadre"</string>
<string name="permdesc_readFrameBuffer" msgid="4937405521809454680">"Permite aplicaţiei să citească conţinutul zonei-tampon a cadrului."</string>
+ <string name="permlab_accessInputFlinger" msgid="5348635270689553857">"acces la InputFlinger"</string>
+ <string name="permdesc_accessInputFlinger" msgid="2104864941201226616">"Permite aplicației să utilizeze funcțiile de nivel redus InputFlinger."</string>
<string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"configurează afişaje Wi-Fi"</string>
<string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"Permite aplicaţiei să configureze şi să se conecteze la afişaje Wi-Fi."</string>
<string name="permlab_controlWifiDisplay" msgid="393641276723695496">"controlează afişaje Wi-Fi"</string>
@@ -1414,6 +1421,7 @@
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
<string name="activitychooserview_choose_application" msgid="2125168057199941199">"Alegeţi o aplicaţie"</string>
+ <string name="activitychooserview_choose_application_error" msgid="8624618365481126668">"Nu s-a putut lansa <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="shareactionprovider_share_with" msgid="806688056141131819">"Permiteţi accesul pentru"</string>
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Permiteţi accesul pentru <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Mâner glisant. Atingeţi şi ţineţi apăsat."</string>
@@ -1650,4 +1658,15 @@
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Reîncercați mai târziu"</string>
<string name="immersive_mode_confirmation" msgid="7227416894979047467">"Glisați în jos pentru a ieși din ecran complet."</string>
+ <string name="done_label" msgid="2093726099505892398">"Terminat"</string>
+ <string name="hour_picker_description" msgid="6698199186859736512">"Selector circular pentru ore"</string>
+ <string name="minute_picker_description" msgid="8606010966873791190">"Selector circular pentru minute"</string>
+ <string name="select_hours" msgid="6043079511766008245">"Selectați orele"</string>
+ <string name="select_minutes" msgid="3974345615920336087">"Selectați minutele"</string>
+ <string name="day_picker_description" msgid="8990847925961297968">"Afișare pe luni"</string>
+ <string name="year_picker_description" msgid="5524331207436052403">"Listă de ani"</string>
+ <string name="select_day" msgid="7774759604701773332">"Selectați luna și ziua"</string>
+ <string name="select_year" msgid="7952052866994196170">"Selectați anul"</string>
+ <string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> selectat"</string>
+ <string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> a fost șters"</string>
</resources>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index 5348084..1b914da 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -50,6 +50,11 @@
<string name="invalidPuk" msgid="8761456210898036513">"Введите PUK-код из 8 или более цифр."</string>
<string name="needPuk" msgid="919668385956251611">"SIM-карта заблокирована Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ кода PUK. Ð”Ð»Ñ Ñ€Ð°Ð·Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²ÐºÐ¸ введите код PUK."</string>
<string name="needPuk2" msgid="4526033371987193070">"Ð”Ð»Ñ Ñ€Ð°Ð·Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²ÐºÐ¸ SIM-карты введите PUK2."</string>
+ <string name="enablePin" msgid="209412020907207950">"Произошла ошибка. Включите блокировку SIM-карты или карты R-UIM."</string>
+ <plurals name="pinpuk_attempts">
+ <item quantity="one" msgid="6596245285809790142">"ОÑталоÑÑŒ попыток: <xliff:g id="NUMBER">%d</xliff:g>. ПоÑле Ñтого SIM-карта будет заблокирована."</item>
+ <item quantity="other" msgid="7530597808358774740">"ОÑталоÑÑŒ попыток: <xliff:g id="NUMBER">%d</xliff:g>. ПоÑле Ñтого SIM-карта будет заблокирована."</item>
+ </plurals>
<string name="imei" msgid="2625429890869005782">"IMEI"</string>
<string name="meid" msgid="4841221237681254195">"MEID"</string>
<string name="ClipMmi" msgid="6952821216480289285">"Ð˜Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Ð²Ñ‹Ð·Ñ‹Ð²Ð°ÑŽÑ‰ÐµÐ³Ð¾ абонента"</string>
@@ -477,6 +482,8 @@
<string name="permdesc_accessSurfaceFlinger" msgid="1041619516733293551">"Приложение Ñможет иÑпользовать низкоуровневые функции SurfaceFlinger."</string>
<string name="permlab_readFrameBuffer" msgid="6690504248178498136">"Чтение данных в буфере кадров"</string>
<string name="permdesc_readFrameBuffer" msgid="4937405521809454680">"Приложение Ñможет Ñчитывать Ñодержание буфера фреймов."</string>
+ <string name="permlab_accessInputFlinger" msgid="5348635270689553857">"ДоÑтуп к InputFlinger"</string>
+ <string name="permdesc_accessInputFlinger" msgid="2104864941201226616">"Приложение Ñможет иÑпользовать низкоуровневые функции InputFlinger."</string>
<string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"наÑтраивать Ñкраны, подключенные через Wi-Fi"</string>
<string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"Приложение Ñможет подключатьÑÑ Ðº Ñкранам Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Wi-Fi и наÑтраивать их."</string>
<string name="permlab_controlWifiDisplay" msgid="393641276723695496">"Управление мониторами, подключенными через Wi-Fi"</string>
@@ -1414,6 +1421,7 @@
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Клавиша Ñмены региÑтра"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Клавиша ввода"</string>
<string name="activitychooserview_choose_application" msgid="2125168057199941199">"Выберите приложение"</string>
+ <string name="activitychooserview_choose_application_error" msgid="8624618365481126668">"Ðе удалоÑÑŒ запуÑтить приложение \"<xliff:g id="APPLICATION_NAME">%s</xliff:g>\""</string>
<string name="shareactionprovider_share_with" msgid="806688056141131819">"Открыть доÑтуп:"</string>
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Открыть доÑтуп приложению \"<xliff:g id="APPLICATION_NAME">%s</xliff:g>\""</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"ПеретаÑкиваемый значок блокировки. Ðажмите и удерживайте."</string>
@@ -1649,5 +1657,16 @@
<item quantity="other" msgid="4730868920742952817">"Повтор через <xliff:g id="COUNT">%d</xliff:g> Ñек."</item>
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Повторите попытку позже."</string>
- <string name="immersive_mode_confirmation" msgid="7227416894979047467">"Чтобы вернутьÑÑ Ð² обычный режим, проведите пальцем вниз"</string>
+ <string name="immersive_mode_confirmation" msgid="7227416894979047467">"Чтобы вернутьÑÑ Ð² обычный режим, проведите пальцем вниз."</string>
+ <string name="done_label" msgid="2093726099505892398">"Готово"</string>
+ <string name="hour_picker_description" msgid="6698199186859736512">"Выбор чаÑов на циферблате"</string>
+ <string name="minute_picker_description" msgid="8606010966873791190">"Выбор минут на циферблате"</string>
+ <string name="select_hours" msgid="6043079511766008245">"Выберите чаÑÑ‹"</string>
+ <string name="select_minutes" msgid="3974345615920336087">"Выберите минуты"</string>
+ <string name="day_picker_description" msgid="8990847925961297968">"Окно выбора даты"</string>
+ <string name="year_picker_description" msgid="5524331207436052403">"Меню выбора года"</string>
+ <string name="select_day" msgid="7774759604701773332">"Выберите меÑÑц и чиÑло"</string>
+ <string name="select_year" msgid="7952052866994196170">"Выберите год"</string>
+ <string name="item_is_selected" msgid="949687401682476608">"Выбран Ñлемент <xliff:g id="ITEM">%1$s</xliff:g>"</string>
+ <string name="deleted_key" msgid="7659477886625566590">"Цифра <xliff:g id="KEY">%1$s</xliff:g> удалена"</string>
</resources>
diff --git a/core/res/res/values-si-rLK/strings.xml b/core/res/res/values-si-rLK/strings.xml
new file mode 100644
index 0000000..0bbcd06
--- /dev/null
+++ b/core/res/res/values-si-rLK/strings.xml
@@ -0,0 +1,1594 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="byteShort" msgid="8340973892742019101">"B"</string>
+ <string name="kilobyteShort" msgid="5973789783504771878">"KB"</string>
+ <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
+ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
+ <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
+ <string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
+ <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string>
+ <string name="untitled" msgid="4638956954852782576">"&lt;නම් යොද෠නà·à¶­&gt;"</string>
+ <string name="ellipsis" msgid="7899829516048813237">"…"</string>
+ <string name="ellipsis_two_dots" msgid="1228078994866030736">"‥"</string>
+ <string name="emptyPhoneNumber" msgid="7694063042079676517">"(දුරකථන අංකයක් නොමà·à¶­)"</string>
+ <string name="unknownName" msgid="2277556546742746522">"(නොදනී)"</string>
+ <string name="defaultVoiceMailAlphaTag" msgid="2660020990097733077">"කටහඬ à¶­à·à¶´à·‘à¶½"</string>
+ <string name="defaultMsisdnAlphaTag" msgid="2850889754919584674">"MSISDN1"</string>
+ <string name="mmiError" msgid="5154499457739052907">"සම්බන්ධත෠ගà·à¶§à·…ුවක් හ෠අවලංගු MMI කේතයකි."</string>
+ <string name="mmiFdnError" msgid="5224398216385316471">"ස්ථà·à·€à¶» ඇමතීම් à¶…à¶‚à¶š වලට පමණක් මෙහෙයුම සීමà·à¶šà¶» ඇත."</string>
+ <string name="serviceEnabled" msgid="8147278346414714315">"සේවà·à·€ සබල කරන ලදි."</string>
+ <string name="serviceEnabledFor" msgid="6856228140453471041">"සේවà·à·€ සබලයි, සඳහà·:"</string>
+ <string name="serviceDisabled" msgid="1937553226592516411">"සේවà·à·€ à¶…à¶¶à¶½ කරන ලදි."</string>
+ <string name="serviceRegistered" msgid="6275019082598102493">"ලියà·à¶´à¶¯à·’à¶‚à¶ à·’ වීම à·ƒà·à¶»à·Šà¶®à¶šà¶ºà·’."</string>
+ <string name="serviceErased" msgid="1288584695297200972">"මà·à¶šà·“ම à·ƒà·à¶»à·Šà¶®à¶š විය."</string>
+ <string name="passwordIncorrect" msgid="7612208839450128715">"à·€à·à¶»à¶¯à·’ මුරපදයක්."</string>
+ <string name="mmiComplete" msgid="8232527495411698359">"MMI සම්පූර්ණයි."</string>
+ <string name="badPin" msgid="9015277645546710014">"ඔබ ටයිප් කරන ලද පරණ PIN à¶‘à¶š à·€à·à¶»à¶¯à·’ය."</string>
+ <string name="badPuk" msgid="5487257647081132201">"ඔබ ටයිප් කරන ලද PUK à¶‘à¶š à·€à·à¶»à¶¯à·’යි."</string>
+ <string name="mismatchPin" msgid="609379054496863419">"ඔබ ටයිප් à¶šà¶½ PIN නොගà·à·…à¶´à·š."</string>
+ <string name="invalidPin" msgid="3850018445187475377">"4 සිට 8 දක්ව෠අංක සහිත PIN එකක් ටයිප් කරන්න."</string>
+ <string name="invalidPuk" msgid="8761456210898036513">"à¶…à¶‚à¶š 8 à¶šà·Š à·„à· à¶Šà¶§ à·€à·à¶©à·’ PUK à¶‘à¶šà¶šà·Š ටයිප් කරන්න."</string>
+ <string name="needPuk" msgid="919668385956251611">"ඔබගේ SIM à¶´à¶­ à¶´à¶­à¶§ PUK අගුළු à·€à·à¶§à·“ ඇත. එම අගුල ඇරීමට PUK කේතය ටයිප් කරන්න."</string>
+ <string name="needPuk2" msgid="4526033371987193070">"SIM පතේ අගුළු ඇරීමට PUK2 ටයිප් කරන්න."</string>
+ <string name="imei" msgid="2625429890869005782">"IMEI"</string>
+ <string name="meid" msgid="4841221237681254195">"MEID"</string>
+ <string name="ClipMmi" msgid="6952821216480289285">"à¶´à·à¶¸à·’ණෙන අමතන්නà·à¶œà·š ID"</string>
+ <string name="ClirMmi" msgid="7784673673446833091">"à¶´à·’à¶§à¶­à¶§ යන අමතන්නà·à¶œà·š ID"</string>
+ <string name="CfMmi" msgid="5123218989141573515">"ඇමතුම ඉදිරියට යà·à·€à·“ම"</string>
+ <string name="CwMmi" msgid="9129678056795016867">"ඇමතුම් à¶»à·à¶³à·“ම"</string>
+ <string name="BaMmi" msgid="455193067926770581">"ඇමතුම අවහිර කිරීම"</string>
+ <string name="PwdMmi" msgid="7043715687905254199">"මුරපදය වෙනස් කිරීම"</string>
+ <string name="PinMmi" msgid="3113117780361190304">"PIN වෙනස් වී ඇත"</string>
+ <string name="CnipMmi" msgid="3110534680557857162">"ඇමතුම් අංකය ඇත"</string>
+ <string name="CnirMmi" msgid="3062102121430548731">"ඇමතුම් අංකය සීම෠කර ඇත"</string>
+ <string name="ThreeWCMmi" msgid="9051047170321190368">"තුන් මà·à¶»à·Šà¶œ ඇමතීම"</string>
+ <string name="RuacMmi" msgid="7827887459138308886">"අනවà·à·Šâ€à¶º හිරිහà·à¶»à¶¯à·à¶ºà¶š ඇමතුම් à¶´à·Šâ€à¶»à¶­à·’à¶šà·Šà·‚à·šà¶´ කිරීම"</string>
+ <string name="CndMmi" msgid="3116446237081575808">"ඇමතීමේ අංකය à¶·à·à¶»à¶¯à·“ම"</string>
+ <string name="DndMmi" msgid="1265478932418334331">"à¶¶à·à¶°à· නොකරන්න"</string>
+ <string name="CLIRDefaultOnNextCallOn" msgid="429415409145781923">"අමතන්නà·à¶œà·š ID සුපුරුද්ද අනුව සීම෠වී ඇත. මීළඟ ඇමතුම: සීම෠කර ඇත"</string>
+ <string name="CLIRDefaultOnNextCallOff" msgid="3092918006077864624">"අමතන්නà·à¶œà·š ID සුපුරුදු අනුව සීම෠වී ඇත. මීළඟ ඇමතුම: සීම෠කර à¶±à·à¶­"</string>
+ <string name="CLIRDefaultOffNextCallOn" msgid="6179425182856418465">"අමතන්නà·à¶œà·š ID සුපුරුදු අනුව සීම෠වී à¶±à·à¶­. මීළඟ ඇමතුම: සීම෠කර ඇත"</string>
+ <string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"අමතන්නà·à¶œà·š ID සුපුරුදු අනුව සීම෠වී à¶±à·à¶­. මීළඟ ඇමතුම: සීම෠කර ඇත"</string>
+ <string name="serviceNotProvisioned" msgid="8614830180508686666">"සේවà·à·€à¶±à·Š සපය෠නà·à¶­."</string>
+ <string name="CLIRPermanent" msgid="3377371145926835671">"අමතන්නà·à¶œà·š ID à·ƒà·à¶šà·ƒà·“ම ඔබට වෙනස්කල නොහà·à¶š."</string>
+ <string name="RestrictedChangedTitle" msgid="5592189398956187498">"සීමිත à¶´à·Šâ€à¶»à·€à·šà·à¶º වෙනස් කෙරිණි"</string>
+ <string name="RestrictedOnData" msgid="8653794784690065540">"දත්ත සේවà·à·€ අවහිර à¶šà¶» ඇත."</string>
+ <string name="RestrictedOnEmergency" msgid="6581163779072833665">"හදිසි සේවà·à·€ අවහිර à¶šà¶» ඇත."</string>
+ <string name="RestrictedOnNormal" msgid="4953867011389750673">"හඬ සේවà·à·€ à¶¶à·à¶°à· à¶šà¶» ඇත."</string>
+ <string name="RestrictedOnAllVoice" msgid="3396963652108151260">"සියලු හඬ සේව෠අවහිර කර ඇත."</string>
+ <string name="RestrictedOnSms" msgid="8314352327461638897">"SMS සේවà·à·€ අවහිර à¶šà¶» ඇත."</string>
+ <string name="RestrictedOnVoiceData" msgid="996636487106171320">"හඬ/දත්ත සේව෠අවහිර කර ඇත."</string>
+ <string name="RestrictedOnVoiceSms" msgid="1888588152792023873">"හඬ/SMS සේව෠අවහිර කර ඇත."</string>
+ <string name="RestrictedOnAll" msgid="5643028264466092821">"සියලුම හඬ/දත්ත/SMS සේවà·à·€à¶±à·Š à¶¶à·à¶°à· à¶šà¶» ඇත."</string>
+ <string name="serviceClassVoice" msgid="1258393812335258019">"හඬ"</string>
+ <string name="serviceClassData" msgid="872456782077937893">"දත්ත"</string>
+ <string name="serviceClassFAX" msgid="5566624998840486475">"à·†à·à¶šà·Šà·ƒà·Š"</string>
+ <string name="serviceClassSMS" msgid="2015460373701527489">"SMS"</string>
+ <string name="serviceClassDataAsync" msgid="4523454783498551468">"අසමමුහුර්ත කරන්න"</string>
+ <string name="serviceClassDataSync" msgid="7530000519646054776">"සමමුහුර්ත කිරීම"</string>
+ <string name="serviceClassPacket" msgid="6991006557993423453">"à¶´à·à¶šà·à¶§à·Šà¶§à·”à·€"</string>
+ <string name="serviceClassPAD" msgid="3235259085648271037">"PAD"</string>
+ <string name="roamingText0" msgid="7170335472198694945">"à¶»à·à¶¸à·’à¶‚ දර්à·à¶šà¶º සක්â€à¶»à·’යයි"</string>
+ <string name="roamingText1" msgid="5314861519752538922">"à¶»à·à¶¸à·’à¶‚ දර්à·à¶šà¶º à¶…à¶šà·Šâ€à¶»à·’යයි"</string>
+ <string name="roamingText2" msgid="8969929049081268115">"à¶»à·à¶¸à·’à¶‚ දර්à·à¶šà¶º à·ƒà·à¶«à·™à¶½à·’ වෙයි"</string>
+ <string name="roamingText3" msgid="5148255027043943317">"වටපිටà·à·€à·™à¶±à·Š ඉවත්ව"</string>
+ <string name="roamingText4" msgid="8808456682550796530">"ගොඩනà·à¶œà·’ල්ලෙන් à¶´à·’à¶§à¶­"</string>
+ <string name="roamingText5" msgid="7604063252850354350">"à¶»à·à¶¸à·’à¶‚ - à¶šà·à¶¸à¶­à·’ පද්ධතිය"</string>
+ <string name="roamingText6" msgid="2059440825782871513">"à¶»à·à¶¸à·’à¶‚ - ලබà·à¶œà¶­ à·„à·à¶šà·’ පද්ධතිය"</string>
+ <string name="roamingText7" msgid="7112078724097233605">"à¶»à·à¶¸à·’à¶‚ - මිත්â€à¶» හවුල්කරු"</string>
+ <string name="roamingText8" msgid="5989569778604089291">"à¶»à·à¶¸à·’à¶‚ - අධිමිල හවුල්කරු"</string>
+ <string name="roamingText9" msgid="7969296811355152491">"à¶»à·à¶¸à·’à¶‚ - සම්පූර්ණ සේව෠ක්â€à¶»à·’යà·à¶šà·à¶»à·’ත්වය"</string>
+ <string name="roamingText10" msgid="3992906999815316417">"à¶»à·à¶¸à·’à¶‚ - අසම්පූර්ණ සේව෠ක්â€à¶»à·’යà·à¶šà·à¶»à·“ත්වය"</string>
+ <string name="roamingText11" msgid="4154476854426920970">"à¶»à·à¶¸à·’à¶‚ à¶¶à·à¶±à¶»à¶º සක්â€à¶»à·“යයි"</string>
+ <string name="roamingText12" msgid="1189071119992726320">"à¶»à·à¶¸à·’à¶‚ à¶¶à·à¶±à¶»à¶º à¶…à¶šà·Šâ€à¶»à·’යයි"</string>
+ <string name="roamingTextSearching" msgid="8360141885972279963">"සේවà·à·€ සඳහ෠සොයමින්"</string>
+ <string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: ඉදිරියට නොයවන ලදි"</string>
+ <string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
+ <string name="cfTemplateForwardedTime" msgid="9206251736527085256">"<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" msgid="5073237827620166285">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: ඉදිරියට නොයවන ලදි"</string>
+ <string name="cfTemplateRegisteredTime" msgid="6781621964320635172">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: ඉදිරියට නොයවන ලදි"</string>
+ <string name="fcComplete" msgid="3118848230966886575">"අංග කේතය සම්පූර්ණයි."</string>
+ <string name="fcError" msgid="3327560126588500777">"සම්බන්ධත෠ගà·à¶§à·…ුවක් හ෠අවලංගු විà·à·šà·‚à·à¶‚à¶œ කේතයකි."</string>
+ <string name="httpErrorOk" msgid="1191919378083472204">"හරි"</string>
+ <string name="httpError" msgid="7956392511146698522">"à¶¢à·à¶½ දà·à·‚යක් තිබුණි."</string>
+ <string name="httpErrorLookup" msgid="4711687456111963163">"URL ය සෙවිය නොහà·à¶š."</string>
+ <string name="httpErrorUnsupportedAuthScheme" msgid="6299980280442076799">"අඩවියේ සත්â€à¶ºà·à¶´à¶± à¶´à¶§à·’à¶´à·à¶§à·’ය වෙත සහය නොදක්වයි."</string>
+ <string name="httpErrorAuth" msgid="1435065629438044534">"සත්â€à¶ºà·à¶´à¶±à¶º à¶šà·… නොහà·à¶š"</string>
+ <string name="httpErrorProxyAuth" msgid="1788207010559081331">"à¶´à·Šâ€à¶»à·œà¶šà·Šà·ƒà·’ සේවà·à¶¯à·à¶ºà¶šà¶º හරහ෠සත්â€à¶ºà·à¶´à¶±à¶º à¶…à·ƒà·à¶»à·Šà¶®à¶šà¶º."</string>
+ <string name="httpErrorConnect" msgid="8714273236364640549">"සේවà·à¶¯à·à¶ºà¶šà¶ºà·à¶§ සම්බන්ධ විය නොහà·à¶š."</string>
+ <string name="httpErrorIO" msgid="2340558197489302188">"සේවà·à¶¯à·à¶ºà¶šà¶ºà· සමග සම්බන්ධ වීමට නොහà·à¶šà·’ විය. à¶±à·à·€à¶­ උත්සහ කරන්න."</string>
+ <string name="httpErrorTimeout" msgid="4743403703762883954">"සේවà·à¶¯à·à¶ºà¶šà¶º වෙත සම්බන්ධතà·à·€à¶º කල් ඉකුත් විණි."</string>
+ <string name="httpErrorRedirectLoop" msgid="8679596090392779516">"පිටුවේ බොහ෠සේවà·à¶¯à·à¶ºà¶š à¶±à·à·€à¶­ හරව෠යà·à·€à·“ම් අඩංගු වේ."</string>
+ <string name="httpErrorUnsupportedScheme" msgid="5015730812906192208">"à¶´à·Šâ€à¶»à·œà¶§à·à¶šà·à¶½à¶º වෙත සහය නොදක්වයි."</string>
+ <string name="httpErrorFailedSslHandshake" msgid="96549606000658641">"සුරක්ෂිත සම්බන්ධතà·à·€à¶ºà¶šà·Š පිහිටුවීමට නොහà·à¶šà·’ විය."</string>
+ <string name="httpErrorBadUrl" msgid="3636929722728881972">"URL වලංගු නොවන නිස෠පිටුව විවෘත කිරීමට නොහà·à¶šà·’ විය."</string>
+ <string name="httpErrorFile" msgid="2170788515052558676">"ගොනුව වෙත පිවිසිය නොහà·à¶š."</string>
+ <string name="httpErrorFileNotFound" msgid="6203856612042655084">"ඉල්ලන ලද ගොනු සෙවිය නොහà·à¶š."</string>
+ <string name="httpErrorTooManyRequests" msgid="1235396927087188253">"ඉල්ලීම් විà·à·à¶½ à¶´à·Šâ€à¶»à¶¸à·à¶«à¶ºà¶šà·Š à¶šà·Šâ€à¶»à·’යà·à¶­à·Šà¶¸à¶š වෙමින් පවතියි. පසුව à¶±à·à·€à¶­ à¶‹à¶­à·Šà·ƒà·à·„ කරන්න."</string>
+ <string name="notification_title" msgid="8967710025036163822">"<xliff:g id="ACCOUNT">%1$s</xliff:g> සඳහ෠පුරනය වීමේ දà·à·‚යක්"</string>
+ <string name="contentServiceSync" msgid="8353523060269335667">"සමමුහුර්ත කිරීම"</string>
+ <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"සමමුහුර්ත කරන්න"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"<xliff:g id="CONTENT_TYPE">%s</xliff:g> මà·à¶šà·“ම් à·€à·à¶©à·’ය"</string>
+ <string name="low_memory" product="tablet" msgid="6494019234102154896">"à¶§à·à¶¶à·Šà¶½à¶§à·Š ආචයනය පිරි ඇත. ඉඩ නිදහස් කිරීමට සමහර ගොනු මකන්න."</string>
+ <string name="low_memory" product="default" msgid="3475999286680000541">"දුරකථන ආචයනය පිරී ඇත. ඉඩ නිදහස් කිරීමට සමහර ගොනු මකන්න."</string>
+ <string name="me" msgid="6545696007631404292">"මම"</string>
+ <string name="power_dialog" product="tablet" msgid="8545351420865202853">"à¶§à·à¶¶à·Šà¶½à¶§ විකල්ප"</string>
+ <string name="power_dialog" product="default" msgid="1319919075463988638">"දුරකථන විකල්පයන්"</string>
+ <string name="silent_mode" msgid="7167703389802618663">"නිහඬ ආකà·à¶»à¶º"</string>
+ <string name="turn_on_radio" msgid="3912793092339962371">"නොරà·à·„න් සක්â€à¶»à·’ය කරන්න"</string>
+ <string name="turn_off_radio" msgid="8198784949987062346">"නොරà·à·„à·à¶±à·Š à¶…à¶šà·Šâ€à¶»à·’ය කරන්න"</string>
+ <string name="screen_lock" msgid="799094655496098153">"තිර අගුල"</string>
+ <string name="power_off" msgid="4266614107412865048">"බලය à¶…à¶šà·Šâ€à¶»à·’ය කරන්න"</string>
+ <string name="silent_mode_silent" msgid="319298163018473078">"හඬ නඟනය à¶…à¶šà·Šâ€à¶»à·’යයි"</string>
+ <string name="silent_mode_vibrate" msgid="7072043388581551395">"හඬ නඟනය කම්පනය"</string>
+ <string name="silent_mode_ring" msgid="8592241816194074353">"හඬ නඟනය සක්â€à¶»à·“යයි"</string>
+ <string name="shutdown_progress" msgid="2281079257329981203">"වස෠දමමින්…"</string>
+ <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"ඔබගේ à¶§à·à¶¶à·Šà¶½à¶§à¶º à·€à·à·ƒà·š."</string>
+ <string name="shutdown_confirm" product="default" msgid="649792175242821353">"ඔබගේ දුරකථනය à·€à·à·ƒà·š."</string>
+ <string name="shutdown_confirm_question" msgid="2906544768881136183">"ඔබට වස෠දà·à¶¸à·“මට à¶…à·€à·à·Šâ€à¶ºà¶¯?"</string>
+ <string name="reboot_safemode_title" msgid="7054509914500140361">"ආරක්â€à·‚à·’à¶­ ආකà·à¶»à¶ºà¶§ à¶±à·à·€à¶­ à¶´à¶« ගන්වන්න"</string>
+ <string name="reboot_safemode_confirm" msgid="55293944502784668">"ආරක්â€à·‚à·’à¶­ ආකà·à¶»à¶ºà¶§ à¶±à·à·€à¶­ à¶´à¶« à¶œà·à¶±à·Šà·€à·“මට ඔබට à¶…à·€à·à·Šâ€à¶ºà¶¯? මෙමඟින් ඔබ ස්ථà·à¶´à·’à¶­ à¶šà¶» ඇති සියලුම තෙවන à¶´à·à¶»à·Šà·à·€à·“ය යෙදුම් සියල්ල à¶…à¶¶à¶½ වී යයි. ඔබ à¶±à·à·€à¶­ à¶´à¶« ගන්වන විට ඒව෠නà·à·€à¶­ පිහිටුවීම සිදු වේ."</string>
+ <string name="recent_tasks_title" msgid="3691764623638127888">"මෑත"</string>
+ <string name="no_recent_tasks" msgid="8794906658732193473">"මෑත යෙදුම් à¶±à·à¶­."</string>
+ <string name="global_actions" product="tablet" msgid="408477140088053665">"à¶§à·à¶¶à·Šà¶½à¶§à·Š විකල්ප"</string>
+ <string name="global_actions" product="default" msgid="2406416831541615258">"දුරකථන විකල්ප"</string>
+ <string name="global_action_lock" msgid="2844945191792119712">"තිර අගුල"</string>
+ <string name="global_action_power_off" msgid="4471879440839879722">"බලය à¶…à¶šà·Šâ€à¶»à·’ය කරන්න"</string>
+ <string name="global_action_bug_report" msgid="7934010578922304799">"දà·à·‚ වර්තà·à·€"</string>
+ <string name="bugreport_title" msgid="2667494803742548533">"දà·à·‚ à·€à·à¶»à·Šà¶­à·à·€à¶šà·Š ගන්න"</string>
+ <string name="bugreport_message" msgid="398447048750350456">"à¶Š-à¶­à·à¶´à·à¶½à·Š පණිවිඩයක් ලෙස යà·à·€à·“මට මෙය ඔබගේ වත්මන් à¶‹à¶´à·à¶‚à¶œ තත්වය à¶œà·à¶± තොරතුරු à¶‘à¶šà¶­à·” කරනු ඇත. දà·à·‚ à·€à·à¶»à·Šà¶­à·à·€ ආරම්භ à¶šà¶» එය යà·à·€à·“මට සූදà·à¶±à¶¸à·Š කරන තෙක් එයට කිසියම් à¶šà·à¶½à¶ºà¶šà·Š ගතවනු ඇත; කරුණà·à¶šà¶» ඉවසන්න."</string>
+ <string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"නිහඬ ආකà·à¶»à¶º"</string>
+ <string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"à·à¶¶à·Šà¶¯à¶º à¶…à¶šà·Šâ€à¶»à·’යයි"</string>
+ <string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"හඬ සක්â€à¶»à·’යයි"</string>
+ <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"අහස්යà·à¶±à· ආකà·à¶»à¶º"</string>
+ <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"අහස්යà·à¶±à· ආකà·à¶»à¶º සක්â€à¶»à·“යයි."</string>
+ <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"අහස්යà·à¶±à· à¶…à¶šà·à¶»à¶º à¶…à¶šà·Šâ€à¶»à·’යයි"</string>
+ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
+ <string name="safeMode" msgid="2788228061547930246">"ආරක්â€à·‚à·’à¶­ ආකà·à¶»à¶º"</string>
+ <string name="android_system_label" msgid="6577375335728551336">"Android පද්ධතිය"</string>
+ <string name="permgrouplab_costMoney" msgid="5429808217861460401">"ඔබගේ මුදල් à·€à·à¶ºà·€à¶± සේවà·à·€à¶±à·Š"</string>
+ <string name="permgroupdesc_costMoney" msgid="3293301903409869495">"ඔබගෙන් මුදල් යන දේවල් කරන්න."</string>
+ <string name="permgrouplab_messages" msgid="7521249148445456662">"ඔබගේ පණිවිඩ"</string>
+ <string name="permgroupdesc_messages" msgid="7821999071003699236">"ඔබගේ SMS, à¶Š-à¶­à·à¶´à·à¶½à·Š, සහ වෙනත් පණිවිඩ කියවන්න සහ ලියන්න."</string>
+ <string name="permgrouplab_personalInfo" msgid="3519163141070533474">"ඔබගේ පෞද්ගලික තොරතුරු"</string>
+ <string name="permgroupdesc_personalInfo" msgid="8426453129788861338">"ඔබගේ සම්බන්ධත෠පතේ ආචයනය කරන ලද, ඔබ à¶œà·à¶± තොරතුරු වලට à¶à¶¢à·” à¶´à·Šâ€à¶»à·€à·šà·à¶º."</string>
+ <string name="permgrouplab_socialInfo" msgid="5799096623412043791">"ඔබගේ සමà·à¶¢à¶ºà·“ය තොරතුරු"</string>
+ <string name="permgroupdesc_socialInfo" msgid="7129842457611643493">"ඔබගේ සම්බන්ධත෠සහ à·ƒà·à¶¸à·à¶¢ සම්බන්ධයන් à¶œà·à¶± තොරතුරු වෙත à¶à¶¢à·” à¶´à·Šâ€à¶»à·€à·šà·à¶º."</string>
+ <string name="permgrouplab_location" msgid="635149742436692049">"ඔබගේ ස්ථà·à¶±à¶º"</string>
+ <string name="permgroupdesc_location" msgid="5704679763124170100">"ඔබගේ භෞතික පිහිටුම නිරීක්ෂණය කරයි."</string>
+ <string name="permgrouplab_network" msgid="5808983377727109831">"à¶¢à·à¶½ සන්නිවේදනය"</string>
+ <string name="permgroupdesc_network" msgid="4478299413241861987">"විවිධ à¶¢à·à¶½ විà·à·šà·‚à·à¶‚à¶œ වෙත පිවිසෙන්න."</string>
+ <string name="permgrouplab_bluetoothNetwork" msgid="1585403544162128109">"බ්ලූටූත්"</string>
+ <string name="permgroupdesc_bluetoothNetwork" msgid="5625288577164282391">"බ්ලූටූත් ඔස්සේ à¶‹à¶´à·à¶‚à¶œ සහ à¶¢à·à¶½ වෙත පිවිසෙන්න."</string>
+ <string name="permgrouplab_audioSettings" msgid="8329261670151871235">"à·à·Šâ€à¶»à·€à·Šâ€à¶º à·ƒà·à¶šà·ƒà·“ම්"</string>
+ <string name="permgroupdesc_audioSettings" msgid="2641515403347568130">"à·à·Šâ€à¶»à·€à·Šâ€à¶º à·ƒà·à¶šà·ƒà·“ම් වෙනස් කරන්න."</string>
+ <string name="permgrouplab_affectsBattery" msgid="6209246653424798033">"à¶¶à·à¶§à¶»à·’ය වෙත බලපà·à¶ºà·’"</string>
+ <string name="permgroupdesc_affectsBattery" msgid="6441275320638916947">"à¶¶à·à¶§à¶»à·’යේ බලය à¶šà·Šà·‚à¶«à·’à¶šà·€ à¶…à¶©à·” වන විà·à·šà·‚à·à¶‚à¶œ à¶·à·à·€à·’à¶­ කරන්න."</string>
+ <string name="permgrouplab_calendar" msgid="5863508437783683902">"දින දර්à·à¶±à¶º"</string>
+ <string name="permgroupdesc_calendar" msgid="5777534316982184416">"දින දර්à·à¶± සිද්ධින්ට සෘජුව à¶´à·Šâ€à¶»à·€à·šà· වීම."</string>
+ <string name="permgrouplab_dictionary" msgid="4148597128843641379">"පරිà·à·“ලක à·à¶¶à·Šà¶¯ à¶šà·à·‚ය කියවන්න"</string>
+ <string name="permgroupdesc_dictionary" msgid="7921166355964764490">"පරිà·à·“ලක à·à¶¶à·Šà¶¯ à¶šà·à·‚යේ වචන කියවීම."</string>
+ <string name="permgrouplab_writeDictionary" msgid="8090237702432576788">"පරිà·à·“ලක à·à¶¶à·Šà¶¯à¶šà·à·‚යට ලිවිම"</string>
+ <string name="permgroupdesc_writeDictionary" msgid="2711561994497361646">"පරිà·à·“ලක à·à¶¶à·Šà¶¯à¶šà·à·‚යට වචන à¶‘à¶šà¶­à·” කරන්න."</string>
+ <string name="permgrouplab_bookmarks" msgid="1949519673103968229">"පිටුසන් සහ ඉතිහà·à·ƒà¶º"</string>
+ <string name="permgroupdesc_bookmarks" msgid="4169771606257963028">"පිටුසන් සහ à¶¶à·Šâ€à¶»à·€à·Šà·ƒà¶» ඉතිහà·à·ƒà¶º වෙත à¶à¶¢à·” à¶´à·Šâ€à¶»à·€à·šà·à¶º."</string>
+ <string name="permgrouplab_deviceAlarms" msgid="6117704629728824101">"සීනුව"</string>
+ <string name="permgroupdesc_deviceAlarms" msgid="4769356362251641175">"සීනුව සකසන්න."</string>
+ <string name="permgrouplab_voicemail" msgid="4162237145027592133">"හඬ à¶­à·à¶´à·‘à¶½"</string>
+ <string name="permgroupdesc_voicemail" msgid="2498403969862951393">"හඬ à¶­à·à¶´à·‘à¶½ වෙත à¶à¶¢à·” à¶´à·Šâ€à¶»à·€à·šà·à¶º."</string>
+ <string name="permgrouplab_microphone" msgid="171539900250043464">"මයික්â€à¶»à·œà·†à·à¶±à¶º"</string>
+ <string name="permgroupdesc_microphone" msgid="7106618286905738408">"à·à¶¶à·Šà¶¯à¶º පටිගත කිරීමට මයික්â€à¶»à·œà·†à·à¶±à¶º වෙත à¶à¶¢à·” à¶´à·Šâ€à¶»à·€à·šà·à¶º."</string>
+ <string name="permgrouplab_camera" msgid="4820372495894586615">"à¶šà·à¶¸à¶»à·à·€"</string>
+ <string name="permgroupdesc_camera" msgid="2933667372289567714">"à¶¡à·à¶ºà·à¶»à·–à¶´ හ෠වීඩිය෠ග්â€à¶»à·„ණය සඳහ෠කà·à¶¸à¶»à·à·€ වෙත à¶à¶¢à·” à¶´à·Šâ€à¶»à·€à·šà·à¶º."</string>
+ <string name="permgrouplab_screenlock" msgid="8275500173330718168">"අගුළු තිරය"</string>
+ <string name="permgroupdesc_screenlock" msgid="7067497128925499401">"ඔබගේ à¶‹à¶´à·à¶‚ගයේ අගුළු තිරයේ à¶šà·Šâ€à¶»à·’යà·à¶šà·à¶»à·’ත්වයට බලපà·à¶± à·„à·à¶šà·’යà·à·€."</string>
+ <string name="permgrouplab_appInfo" msgid="8028789762634147725">"ඔබගේ යෙදුම් වල තොරතුරු"</string>
+ <string name="permgroupdesc_appInfo" msgid="3950378538049625907">"ඔබගේ à¶‹à¶´à·à¶‚ගයේ වෙනත් යෙදුම් වල à¶šà·Šâ€à¶»à·’යà·à¶šà·à¶»à·’ත්වයට බලපෑම් à¶šà·… à·„à·à¶šà·’ à¶¶à·€."</string>
+ <string name="permgrouplab_wallpaper" msgid="3850280158041175998">"බිතුපත"</string>
+ <string name="permgroupdesc_wallpaper" msgid="5630417854750540154">"à¶‹à¶´à·à¶‚à¶œ බිතුපතේ à·ƒà·à¶šà·ƒà·“ම් වෙනස් කරන්න."</string>
+ <string name="permgrouplab_systemClock" msgid="406535759236612992">"ඔරලà·à·ƒà·”à·€"</string>
+ <string name="permgroupdesc_systemClock" msgid="3944359833624094992">"à¶‹à¶´à·à¶‚à¶œ à¶šà·à¶½ à·„à· à¶šà·à¶½ à¶šà¶½à·à¶´ වෙනස් කරන්න."</string>
+ <string name="permgrouplab_statusBar" msgid="2095862568113945398">"තත්ව තීරුව"</string>
+ <string name="permgroupdesc_statusBar" msgid="6242593432226807171">"à¶‹à¶´à·à¶‚à¶œ à¶­à¶­à·Šà·€ තීරු à·ƒà·à¶šà·ƒà·“ම් වෙනස් කරන්න."</string>
+ <string name="permgrouplab_syncSettings" msgid="3341990986147826541">"සමමුහුර්ත à·ƒà·à¶šà·ƒà·“ම්"</string>
+ <string name="permgroupdesc_syncSettings" msgid="7603195265129031797">"සමමුහුර්ත à·ƒà·à¶šà·ƒà·“ම් වෙත à¶´à·Šâ€à¶»à·€à·šà·à¶º."</string>
+ <string name="permgrouplab_accounts" msgid="3359646291125325519">"ඔබගේ ගිණුම්"</string>
+ <string name="permgroupdesc_accounts" msgid="4948732641827091312">"ලබà·à¶œà¶­ à·„à·à¶šà·’ ගිණුම් වලට à¶´à·Šâ€à¶»à·€à·šà· වීම."</string>
+ <string name="permgrouplab_hardwareControls" msgid="7998214968791599326">"දෘඩà·à¶‚à¶œ à¶´à·à¶½à¶š"</string>
+ <string name="permgroupdesc_hardwareControls" msgid="4357057861225462702">"හෑන්ඩ්සෙටයේ දෘඩà·à¶‚à¶œ වලට සෘජුවම à¶´à·Šâ€à¶»à·€à·šà· වන්න."</string>
+ <string name="permgrouplab_phoneCalls" msgid="9067173988325865923">"දුරකථන ඇමතුම්"</string>
+ <string name="permgroupdesc_phoneCalls" msgid="7489701620446183770">"දුරකථන ඇමතුම් නිරීක්ෂණය කරන්න, පටිගත කරන්න සහ à¶šà·Šâ€à¶»à·’යà·à¶­à·Šà¶¸à¶š කරන්න."</string>
+ <string name="permgrouplab_systemTools" msgid="4652191644082714048">"පද්ධති මෙවලම්"</string>
+ <string name="permgroupdesc_systemTools" msgid="8162102602190734305">"පද්ධතියේ à¶´à·„à¶½ මට්ටම් à¶´à·Šâ€à¶»à·€à·šà·à¶º සහ à¶´à·à¶½à¶±à¶º."</string>
+ <string name="permgrouplab_developmentTools" msgid="3446164584710596513">"සංවර්ධක මෙවලම්"</string>
+ <string name="permgroupdesc_developmentTools" msgid="7058828032358142018">"යෙදුම් සංවර්ධකයන් සඳහ෠පමණක් à¶…à·€à·à·Šâ€à¶º විà·à·šà·‚à·à¶‚à¶œ."</string>
+ <string name="permgrouplab_display" msgid="4279909676036402636">"වෙනත් යෙදුම් UI"</string>
+ <string name="permgroupdesc_display" msgid="6051002031933013714">"වෙනත් යෙදුම්වල UI සඳහ෠බලපà·à¶ºà·’."</string>
+ <string name="permgrouplab_storage" msgid="1971118770546336966">"ආචයනය"</string>
+ <string name="permgroupdesc_storage" product="nosdcard" msgid="7442318502446874999">"USB ආචයනය වෙත à¶´à·Šâ€à¶»à·€à·šà·à¶º."</string>
+ <string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"SD à¶´à¶­ වෙත à¶´à·Šâ€à¶»à·€à·šà·à¶º."</string>
+ <string name="permgrouplab_accessibilityFeatures" msgid="7919025602283593907">"à¶´à·Šâ€à¶»à·€à·šà·à·Šâ€à¶ºà¶­à· විà·à·šà·‚à·à¶‚à¶œ"</string>
+ <string name="permgroupdesc_accessibilityFeatures" msgid="4205196881678144335">"à¶‹à¶´à¶šà·à¶»à·“වන à¶­à·à¶šà·Šà·‚à¶« ඉල්ලීම් à¶šà·… à·„à·à¶šà·’ විà·à·šà·‚à·à¶‚à¶œ."</string>
+ <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"කවුළු අන්න්තර්ගතය ලබà·à¶œà¶±à·Šà¶±"</string>
+ <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"ඔබ අන්තර්ක්â€à¶»à·’යà·à¶šà·à¶»à·“ වන කවුළුවේ අන්තර්ගතය පරීක්ෂ෠කරන්න."</string>
+ <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"ස්පර්à·à¶ºà·™à¶±à·Š ගවේෂණය සක්â€à¶»à·’ය කරන්න"</string>
+ <string name="capability_desc_canRequestTouchExploration" msgid="5800552516779249356">"ස්පර්෠කරන අයිතම හඬ නග෠කත෠කෙරෙනු ඇති à¶…à¶­à¶» ඉංගිති à¶·à·à·€à·’තයෙන් තිරය ගවේෂණය කිරීමට පුළුවනි."</string>
+ <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"උසස් වෙබ් à¶´à·Šâ€à¶»à·€à·šà·à·Šâ€à¶ºà¶­à·à·€ සක්â€à¶»à·’ය කරන්න"</string>
+ <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"යෙදුම් අන්තර්ගතයට à¶´à·Šâ€à¶»à·€à·šà·à·Šâ€à¶ºà¶­à·à·€à¶º à·€à·à¶©à·’වන ලෙස සකස් කිරීමට ඇතà·à¶¸à·Š විට ස්ක්â€à¶»à·’à¶´à·Šà¶§à·Š ස්ථà·à¶´à¶±à¶º à¶šà¶» ඇත."</string>
+ <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"ඔබ ටයිප් කළ පෙළ බලන්න"</string>
+ <string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"ණයවරපත් à¶…à¶‚à¶š සහ මුරපද à·€à·à¶±à·’ පුද්ගලික දත්ත ඇතුළත් වේ."</string>
+ <string name="permlab_statusBar" msgid="7417192629601890791">"තත්ව තීරුව අබල කරන්න හ෠වෙනස් කරන්න"</string>
+ <string name="permdesc_statusBar" msgid="8434669549504290975">"à¶­à¶­à·Šà·€ තීරුව à¶…à¶šà·Šâ€à¶»à·’ය කිරීමට හ෠පද්ධති නිරූපක à¶‘à¶šà¶­à·” හ෠ඉවත් කිරීමට යෙදුමට අවසර දේ."</string>
+ <string name="permlab_statusBarService" msgid="7247281911387931485">"තත්ව තීරුව"</string>
+ <string name="permdesc_statusBarService" msgid="716113660795976060">"තත්ව තීරුව වීමට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_expandStatusBar" msgid="1148198785937489264">"à¶­à¶­à·Šà·€ තීරුව දිග à·„à·à¶»à·“ම/à·„à·à¶šà·’ලීම"</string>
+ <string name="permdesc_expandStatusBar" msgid="6917549437129401132">"à¶­à¶­à·Šà·€ තීරුව දිග à·„à·à¶»à·“මට à·„à· à·„à·à¶šà·’ළීමට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"පිටවන ඇමතුම් වල මග වෙනස් කිරීම"</string>
+ <string name="permdesc_processOutgoingCalls" msgid="5331318931937402040">"පිටවන ඇමතුම් සකස් කිරීමට සහ ඇමතීමට නියමිත අංකය වෙනස් කිරීමට යෙදුමට අවසර දෙන්න. මෙම අවසරයෙන් යෙදුමට පිටවන ඇමතුම් නිරීක්ෂණය, à¶±à·à·€à¶­ à·„à·à¶»à·€à·“ම à·„à· à·€à·à·…ක්වීම අවසර දෙයි."</string>
+ <string name="permlab_receiveSms" msgid="8673471768947895082">"කෙටි පණිවිඩ ලබà·à¶œà·à¶±à·“ම (SMS)"</string>
+ <string name="permdesc_receiveSms" msgid="6424387754228766939">"SMS පණිවිඩ à¶½à·à¶¶à·“මට සහ à¶šà·Šâ€à¶»à·’යà·à¶­à·Šà¶¸à¶š කිරීමට යෙදුමට අවසර දෙන්න. මෙහි තේරුම යෙදුමට ඔබගේ à¶‹à¶´à·à¶‚ගයට à¶½à·à¶¶à·™à¶± පණිවිඩ අධීක්ෂණය කිරීමට à·„à·à¶šà·’වීම වන à¶…à¶­à¶», ඒව෠ඔබට නොපෙන්ව෠මක෠දà·à¶¸à·“මටද à·„à·à¶šà·’ වීමයි."</string>
+ <string name="permlab_receiveMms" msgid="1821317344668257098">"පෙළ පණිවුඩ ලබà·à¶œà¶±à·Šà¶± (MMS)"</string>
+ <string name="permdesc_receiveMms" msgid="533019437263212260">"MMS පණිවිඩ සොය෠ලබà·à¶œà·à¶±à·“මට සහ à¶šà·Šâ€à¶»à·’යà·à¶­à·Šà¶¸à¶š කිරීමට යෙදුමට අවසර දෙන්න. යෙදුම නිරීක්ෂණය කරනු ලබන à¶…à¶­à¶» ඔබට à¶½à·à¶¶à·”à¶± පණිවිඩ පෙන්වීමෙන් තොරවම මක෠දà·à¶¸à·’ය à·„à·à¶šà·’ à¶¶à·€ මෙමඟින් අදහස් කරයි."</string>
+ <string name="permlab_receiveEmergencyBroadcast" msgid="1803477660846288089">"හදිසි විකà·à·à¶± ලබ෠ගà·à¶±à·“ම"</string>
+ <string name="permdesc_receiveEmergencyBroadcast" msgid="848524070262431974">"හදිසි විකà·à· පණිවිඩ à¶½à·à¶¶à·“මට සහ à¶šà·Šâ€à¶»à·’යà·à¶­à·Šà¶¸à¶š කිරීමට යෙදුමට අවසර දෙන්න. පද්ධති යෙදුම් වලට පමණක් මෙම අවසරය අදà·à·… වෙයි."</string>
+ <string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"සෙල් à¶´à·Šâ€à¶»à¶ à·à¶»à¶« පණිවිඩ කියවීම"</string>
+ <string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"ඔබගේ à¶‹à¶´à·à¶‚ගයට à¶½à·à¶¶à·”à¶«à·” සෙල් විකà·à·à¶± පණිවිඩ කියවීමට යෙදුමට අවසර දෙන්න. ඔබට හදිසි අවස්ථà·à·€à¶±à·Š à¶´à·’à·…à·’à¶¶à¶³ අනතුරු ඇඟවීමට සෙල් විකà·à·à¶± පණිවිඩ ඇතà·à¶¸à·Š ස්ථà·à¶±à·€à¶½ සිට යවනු ලබයි. හදිසි සෙල් විකà·à·à¶± à¶½à·à¶¶à·™à¶± අවස්ථà·à·€à¶šà¶¯à·“, අනිෂ්ට යෙදුම් මඟින් ඔබගේ à¶‹à¶´à·à¶‚ගයට à¶šà·à¶»à·Šà¶º à·ƒà·à¶°à¶±à¶ºà¶§ à·„à· à¶šà·Šâ€à¶»à·’යකරණයට à¶¶à·à¶°à· සිදුවිය à·„à·à¶š."</string>
+ <string name="permlab_sendSms" msgid="5600830612147671529">"SMS පණිවිඩ යà·à·€à·“ම"</string>
+ <string name="permdesc_sendSms" msgid="7094729298204937667">"SMS පණිවිඩ යà·à·€à·“මට යෙදුමට අවසර දෙන්න. මෙමඟින් à¶¶à¶½à·à¶´à·œà¶»à·œà¶­à·Šà¶­à·” නොවූ à¶´à·Šâ€à¶»à¶­à·’ඵල à¶…à¶­à·Š විය à·„à·à¶š. අනිෂ්ට යෙදුම් ඔබගේ තහවුරුවකින් තොරව පණිවිඩ යà·à·€à·“ම මඟින් ඔබගේ මුදල් à·€à·à¶º à¶šà¶½ à·„à·à¶š."</string>
+ <string name="permlab_sendRespondViaMessageRequest" msgid="8713889105305943200">"පණිවිඩ සිදුවීම හරහ෠ප්â€à¶»à¶­à·’à¶ à·à¶» යà·à·€à·“ම"</string>
+ <string name="permdesc_sendRespondViaMessageRequest" msgid="7107648548468778734">"à¶´à·à¶¸à·’ණෙන ඇමතුම් සඳහ෠පණිවිඩ ඔස්සේ à¶´à·Šâ€à¶»à¶­à·’à¶ à·à¶» සිදුවීම් හසුරුවීමට වෙනත් පණිවිඩ යෙදුම් සඳහ෠ඉල්ලීම් යà·à·€à·“මට, යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_readSms" msgid="8745086572213270480">"ඔබගේ පෙළ පණිවුඩ කියවන්න (SMS හ෠MMS)"</string>
+ <string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"ඔබගේ à¶§à·à¶¶à·Šà¶½à¶§à¶ºà·š à·„à· SIM à¶´à¶­à·š ආචයනය à¶šà¶» ඇති SMS පණිවිඩ කියවීමට යෙදුමට අවසර දෙන්න. අන්තර්ගතය හ෠විà·à·€à·à·ƒà¶¯à¶ºà·’ බවින් තොරවම සියලු SMS පණිවිඩ කියවීමට මෙමගින් යෙදුමට අවසර දෙයි."</string>
+ <string name="permdesc_readSms" product="default" msgid="3695967533457240550">"ඔබගේ දුරකථනයේ à·„à· SIM à¶´à¶­à·š ආචයනය කරන ලද SMS පණිවිඩ කියවීමට යෙදුමට අවසර දෙන්න. අන්තර්ගතය හ෠විà·à·Šà·€à·à·ƒà¶¯à·à¶ºà·“ බවින් තොරවම සියලු SMS පණිවිඩ කියවීමට මෙමගින් යෙදුමට අවසර දෙයි."</string>
+ <string name="permlab_writeSms" msgid="3216950472636214774">"ඔබගේ කෙටි පණිවිඩ සංස්කරණය කිරීම (SMS හ෠MMS)"</string>
+ <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"ඔබගේ à¶§à·à¶¶à·Šà¶½à¶§à¶ºà·š à·„à· SIM à¶´à¶­à·š ගබඩ෠කර ඇති SMS පණිවිඩ වෙත ලිවීමට යෙදුමට අවසර දෙන්න. අනිෂ්ට යෙදුම් ඔබගේ පණිවිඩ මක෠දà·à¶¸à·’ය à·„à·à¶š."</string>
+ <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"ඔබගේ à¶§à·à¶¶à·Šà¶½à¶§à¶ºà·š à·„à· SIM à¶´à¶­à·š ආචයනය කරන ලද SMS පණිවිඩ ලිවීමට යෙදුමට අවසර දෙන්න. අනිෂ්ට යෙදුම් ඔබගේ පණිවිඩ මක෠දà·à¶¸à·’ය à·„à·à¶š."</string>
+ <string name="permlab_receiveWapPush" msgid="5991398711936590410">"පෙළ පණිවිඩ ලබà·à¶œà·à¶±à·“ම (WAP)"</string>
+ <string name="permdesc_receiveWapPush" msgid="748232190220583385">"WAP පණිවිඩ à¶½à·à¶¶à·“මට සහ à¶šà·Šâ€à¶»à·’යà·à·€à¶½à·’ කිරීමට යෙදුමට අවසර දෙන්න. මෙම අවසරයෙහි ඔබව à¶’à·€à·à¶§ පෙන්වීමකින් තොරව ඔබට පණිවිඩ නිරීක්ෂණයට හ෠මà·à¶šà·“මට à·„à·à¶šà·’යà·à·€ ඇතුළත් වේ."</string>
+ <string name="permlab_getTasks" msgid="6466095396623933906">"à¶°à·à·€à¶±à¶º වන යෙදුම් ලබà·à¶œà·à¶±à·“ම"</string>
+ <string name="permdesc_getTasks" msgid="7454215995847658102">"දà·à¶±à¶§ සහ මෑත à¶šà·Šâ€à¶»à·’යà·à¶­à·Šà¶¸à¶š à¶šà·à¶»à·Šà¶ºà¶ºà¶±à·Š à¶´à·’à·…à·’à¶¶à¶³ විස්තරà·à¶­à·Šà¶¸à¶š තොරතුරු සොය෠ලබà·à¶œà·à¶±à·“මට යෙදුමට ඉඩ දෙන්න. මෙය කුමන යෙදුම් à¶‹à¶´à·à¶‚ගයේ à¶·à·à·€à·’ත෠කරන්නේද යන තොරතුරු යෙදුම්වලට සොය෠ගà·à¶±à·“මට ඉඩ දිය à·„à·à¶š."</string>
+ <string name="permlab_interactAcrossUsers" msgid="7114255281944211682">"පරිà·à·“ලකයන් à¶…à¶­à¶» අන්තර්ක්â€à¶»à·’යà·à¶šà·à¶»à·“ වන්න"</string>
+ <string name="permdesc_interactAcrossUsers" msgid="364670963623385786">"à¶‹à¶´à·à¶‚ගයේ විවිධ පරිà·à·“ලකයන් හරහ෠ක්â€à¶»à·’යà·à·€à¶±à·Š දà·à¶šà·Šà·€à·“මට යෙදුමට අවසර දෙන්න. පරිà·à·“ලකයන් à¶…à¶­à¶» ආරක්ෂà·à·€ කඩකිරීමට අනිෂ්ට යෙදුම් විසින් මෙය à¶·à·à·€à·’ත෠කිරීමට ඉඩ ඇත."</string>
+ <string name="permlab_interactAcrossUsersFull" msgid="2567734285545074105">"පරිà·à·“ලකයන් à¶…à¶­à¶» අන්තර් à¶šà·Šâ€à¶»à·’යà·à¶šà·à¶»à·“ වීමට සම්පූර්ණ බලපත්â€à¶»à¶º"</string>
+ <string name="permdesc_interactAcrossUsersFull" msgid="376841368395502366">"පරිà·à·“ලකයන් හරහ෠සිදු à¶šà·… à·„à·à¶šà·’ සියලු අන්තර් à¶šà·Šâ€à¶»à·’ය෠වලට අවසර දෙන්න."</string>
+ <string name="permlab_manageUsers" msgid="1676150911672282428">"පරිà·à·“ලකයන් කළමනà·à¶šà¶»à¶«à¶º කරන්න"</string>
+ <string name="permdesc_manageUsers" msgid="8409306667645355638">"විස්තර ලබ෠ගà·à¶±à·“ම, නිර්මà·à¶«à¶šà¶»à¶«à¶º, මකà·à¶¯à·à¶¸à·“ම ඇතුළු පරිà·à·“ලකයන් කළමනà·à¶šà¶»à¶«à¶ºà¶§ යෙදුම්වලට අවසර දෙන්න."</string>
+ <string name="permlab_getDetailedTasks" msgid="6229468674753529501">"à¶°à·à·€à¶±à¶º වන යෙදුම් වල තොරතුරු සොය෠ලබà·à¶œà·à¶±à·“ම"</string>
+ <string name="permdesc_getDetailedTasks" msgid="153824741440717599">"දà·à¶±à¶§ සහ මෑතක à¶šà·Šâ€à¶»à·’යà·à¶­à·Šà¶¸à¶š à¶šà·à¶»à·Šà¶ºà¶ºà¶±à·Š à¶´à·’à·…à·’à¶¶à¶³ විස්තරà·à¶­à·Šà¶¸à¶š තොරතුරු ලබà·à¶œà·à¶±à·“මට යෙදුමට අවසර දෙන්න අනිෂ්ට යෙදුම් අනෙකුත් යෙදුම් à¶´à·’à·…à·’à¶¶à¶³ පුද්ගලික තොරතුරු සොය෠ගà·à¶±à·“මට ඉඩ à¶­à·’à¶¶à·š."</string>
+ <string name="permlab_reorderTasks" msgid="2018575526934422779">"à¶°à·à·€à¶±à¶º වන යෙදුම් à¶±à·à·€à¶­ අනුපිළිවෙලට à·ƒà·à¶šà·ƒà·“ම"</string>
+ <string name="permdesc_reorderTasks" msgid="7734217754877439351">"පෙරබිමට හ෠පසුබිමට සිදුවීම් ගෙනයà·à¶¸à¶§ යෙදුමට අවසර දෙන්න. ඔබගේ ආදà·à¶±à¶ºà¶šà·’න් තොරව යෙදුම මෙය සිදුකරයි."</string>
+ <string name="permlab_removeTasks" msgid="6821513401870377403">"යෙදුම් à¶°à·à·€à¶±à¶º නවත්වන්න"</string>
+ <string name="permdesc_removeTasks" msgid="1394714352062635493">"à¶šà·à¶»à·Šà¶ºà¶ºà¶±à·Š ඉවත් කිරීමට සහ à¶’à·€à·à¶ºà·™à·„à·’ යෙදුම් à¶±à·à¶­à·’ කිරීමට යෙදුමට අවසර දෙන්න. අනෙක් යෙදුම් à·„à·à·ƒà·’රීම à¶¶à·à¶°à· කිරීමට අනිෂ්ට යෙදුම්වලට අවසර දෙන්න."</string>
+ <string name="permlab_manageActivityStacks" msgid="7391191384027303065">"à¶šà·Šâ€à¶»à·’යà·à¶šà·à¶»à¶šà¶¸à·Š à¶…à¶§à·Šà¶§à·’ කළමනà·à¶šà¶»à¶«à¶º කරන්න"</string>
+ <string name="permdesc_manageActivityStacks" msgid="1615881933034084440">"වෙනත් යෙදුම් à¶°à·à·€à¶±à¶º වන à¶šà·Šâ€à¶»à·’යà·à¶šà·à¶»à¶šà¶¸à·Š à¶…à¶§à·Šà¶§à·’ වලට à¶‘à¶šà¶­à·” කිරීමට, ඉවත් කිරීමට, සහ වෙනස් කිරීමට යෙදුමට අවසර දෙන්න. වෙනත් යෙදුම්වල à·„à·à·ƒà·’රීම අනිෂ්ට යෙදුම් මගින් à¶¶à·à¶°à· විය à·„à·à¶š."</string>
+ <string name="permlab_startAnyActivity" msgid="2918768238045206456">"ඕනෑම à¶šà·Šâ€à¶»à·’යà·à·€à¶šà·Š අරඹන්න"</string>
+ <string name="permdesc_startAnyActivity" msgid="997823695343584001">"අවසර ආරක්ෂà·à·€ හ෠යà·à·€à·”ම් තත්වයෙන් තොරවම ඕනෑම à¶šà·Šâ€à¶»à·’යà·à·€à¶šà·Š ආරම්භ කිරීමට යෙදුමට අවසර දේ."</string>
+ <string name="permlab_setScreenCompatibility" msgid="6975387118861842061">"à¶­à·’à¶» à¶œà·à·…පුම à·ƒà·à¶šà·ƒà·“ම"</string>
+ <string name="permdesc_setScreenCompatibility" msgid="692043618693917374">"වෙනත් යෙදුම්වල à¶­à·’à¶» à¶œà·à¶½à¶´à·”ම් මà·à¶¯à·’ලිය à¶´à·à¶½à¶±à¶ºà¶§ යෙදුමට අවසර දෙන්න. වෙනත් යෙදුම්වල à·„à·à·ƒà·’රීම අනිෂ්ට යෙදුම් à¶šà·à¶©à·’ය à·„à·à¶š."</string>
+ <string name="permlab_setDebugApp" msgid="3022107198686584052">"යෙදුම් නිදොස්කරණය සබල කිරීම"</string>
+ <string name="permdesc_setDebugApp" msgid="4474512416299013256">"වෙනත් යෙදුමක් සඳහ෠නිදොස්කරණය සක්â€à¶»à·’ය කිරීමට යෙදුමට අවසර දෙන්න. වෙනත් යෙදුම් විනà·à· කිරීමට අනිෂ්ට යෙදුම් මෙය à¶·à·à·€à·’à¶­ à¶šà·… à·„à·à¶š."</string>
+ <string name="permlab_changeConfiguration" msgid="4162092185124234480">"පද්ධති සංදර්à·à¶š à·ƒà·à¶šà·ƒà·“ම් වෙනස් කරන්න"</string>
+ <string name="permdesc_changeConfiguration" msgid="4372223873154296076">"පෙදෙසිය හ෠සම්පූර්ණ අකුරු à¶´à·Šâ€à¶»à¶¸à·à¶«à¶º à·€à·à¶±à·’ පවතින වින්â€à¶ºà·à·ƒà¶º වෙනස් කිරීමට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_enableCarMode" msgid="5684504058192921098">"මà·à¶§à¶»à·Š රථ ආකà·à¶»à¶º à¶šà·Šâ€à¶»à·’යà·à¶­à·Šà¶¸à¶š කරන්න"</string>
+ <string name="permdesc_enableCarMode" msgid="4853187425751419467">"à¶šà·à¶»à·Š ආකà·à¶»à¶º සබල කිරීමට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_killBackgroundProcesses" msgid="3914026687420177202">"වෙනත් යෙදුම් à·€à·à·ƒà·“ම"</string>
+ <string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"අනෙක් යෙදුම්වල පසුබිම් à¶šà·Šâ€à¶»à·’යà·à·€à¶½à·’ අවසන් කිරීමට යෙදුමට අවසර දෙන්න. අනෙක් යෙදුම් à¶°à·à·€à¶±à¶º à¶±à·à·€à¶­à·“මට මෙය හේතුවක් වේ."</string>
+ <string name="permlab_forceStopPackages" msgid="2329627428832067700">"වෙනත් යෙදුම් බලෙන් නවත්වන්න"</string>
+ <string name="permdesc_forceStopPackages" msgid="5253157296183940812">"යෙදුමට බලෙන් අනෙක් යෙදුම් à¶±à·à·€à¶­à·“මට අවසර දෙන්න."</string>
+ <string name="permlab_forceBack" msgid="652935204072584616">"යෙදුම à·€à·à·ƒà·“මට à¶¶à¶½ කිරීම"</string>
+ <string name="permdesc_forceBack" msgid="3892295830419513623">"à¶±à·à·€à¶­à·“මට පෙරබිමේ ඇති ඕනෑම à¶šà·Šâ€à¶»à·’යà·à·€à¶šà·Š බලෙන් à¶±à·à·€à¶­à·“මට සහ පිටුපසට යà·à¶¸à¶§ යෙදුමට අවසර දෙන්න. à·ƒà·à¶¸à·à¶±à·Šâ€à¶º යෙදුම් සඳහ෠කිසිද෠අවà·à·Šâ€à¶º නොවේ."</string>
+ <string name="permlab_dump" msgid="1681799862438954752">"පද්ධති à¶…à¶·à·Šâ€à¶ºà¶±à·Šà¶­à¶» තත්වය සොය෠ලබ෠ගන්න"</string>
+ <string name="permdesc_dump" msgid="1778299088692290329">"පද්ධතියේ à¶…à¶·à·Šâ€à¶ºà¶±à·Šà¶­à¶» තත්වය à¶½à·à¶¶à·“මට යෙදුමට අවසර දෙන්න. ඔවුන් à·ƒà·à¶¸à·à¶±à·Šâ€à¶ºà¶ºà·™à¶±à·Š à¶·à·à·€à·’à¶­ නොකරන විවිධත්වයකින් යුත් පුද්ගලික සහ ආරක්â€à·‚à·’à¶­ තොරතුරු අනිෂ්ට යෙදුම් සොය෠ලබ෠ගත à·„à·à¶š."</string>
+ <string name="permlab_retrieve_window_content" msgid="8022588608994589938">"à¶­à·’à¶» අන්තර්ගතය සොය෠ලබà·à¶œà·à¶±à·“ම"</string>
+ <string name="permdesc_retrieve_window_content" msgid="3193269069469700265">"à¶šà·Šâ€à¶»à·’යà·à¶šà·à¶»à·“ කවුළුවක අන්තර්ගතය ලබà·à¶œà·à¶±à·“මට යෙදුමට අවසර දෙන්න. අනිෂ්ට යෙදුම් විසින් සම්පූර්ණ කවුළු අන්තර්ගතය ලබà·à¶œà·à¶±à·“ම සහ මුරපදය à·„à·à¶» à¶’à·€à·à¶ºà·™à·„à·’ පෙළ පරික්ෂ෠කිරීම සිදුකරයි."</string>
+ <string name="permlab_temporary_enable_accessibility" msgid="2312612135127310254">"à¶´à·Šâ€à¶»à·€à·šà·à·Šâ€à¶ºà¶­à·à·€à¶º à¶­à·à·€à¶šà·à¶½à·’à¶šà·€ සබල කිරීම"</string>
+ <string name="permdesc_temporary_enable_accessibility" msgid="8079456293182975464">"à¶‹à¶´à·à¶‚ගය වෙත à¶´â€à·Šâ€à¶»à·€à·šà·à·Šâ€à¶ºà¶­à·à·€ à¶­à·à·€à¶šà·à¶½à·’à¶šà·€ සක්â€à¶»à·’ය කිරීමට යෙදුමට අවසර දෙන්න. පරිà·à·“ලක අවධà·à¶±à¶ºà¶šà·’න් තොරව අනිෂ්ට යෙදුම් à¶´â€à·Šâ€à¶»à·€à·šà·à·Šâ€à¶ºà¶­à·à·€ සක්â€à¶»à·’ය à¶šà·… à·„à·à¶š."</string>
+ <string name="permlab_retrieve_window_info" msgid="8532295199112519378">"à¶­à·’à¶» තොරතුරු සොය෠ලබà·à¶œà·à¶±à·“ම"</string>
+ <string name="permdesc_retrieve_window_info" msgid="4998836370424186849">"කවුළු කළමනà·à¶šà¶»à·” මගින් කවුළුව à¶œà·à¶± තොරතුරු සොය෠ලබà·à¶œà·à¶±à·“මට යෙදුමට අවසර දෙන්න. à¶…à¶·à·Šâ€à¶ºà¶±à·Šà¶­à¶» පද්ධති à¶·à·à·€à·’තය සඳහ෠කà·à¶¸à¶­à·’ තොරතුරු අනිෂ්ට යෙදුම් විසින් ලබ෠ගත à·„à·à¶š."</string>
+ <string name="permlab_filter_events" msgid="8675535648807427389">"සිදුවීම් පෙරන්න"</string>
+ <string name="permdesc_filter_events" msgid="8006236315888347680">"à¶´à·’à¶§à¶­à·Š කිරීමට පෙර සියලු පරිà·à·“ලක සිදුවීම්වල à¶´à·Šâ€à¶»à·€à·à·„යක් පෙරීමට යොද෠ගන්න෠ආදà·à¶± පෙරීමක් ලියà·à¶´à¶¯à·’à¶‚à¶ à·’ කිරීමට යෙදුමට අවසර දෙන්න. පරිà·à·“ලක මà·à¶¯à·’à·„à¶­à·Š වීමකින් තොරව පද්ධති UI අනිෂ්ට යෙදුම් à¶´à·à¶½à¶±à¶º කරයි."</string>
+ <string name="permlab_magnify_display" msgid="5973626738170618775">"දර්à·à¶±à¶º විà·à·à¶½à¶±à¶º කරන්න"</string>
+ <string name="permdesc_magnify_display" msgid="7121235684515003792">"දසුනේ අන්තර්ගතය විà·à·à¶½ කිරීමට යෙදුමට අවසර දෙන්න. ඇතà·à¶¸à·Š විට අනිෂ්ට යෙදුම්, à¶‹à¶´à·à¶‚ගය à¶·à·à·€à·’à¶­à· à¶šà·… නොහà·à¶šà·’ බවට à¶´à¶­à·Š කරමින් දසුනේ අන්තර්ගතය වෙනස් à¶šà·… à·„à·à¶š."</string>
+ <string name="permlab_shutdown" msgid="7185747824038909016">"à¶…à¶© à·€à·à¶ºà·™à¶±à·Š à·€à·à·„ීම"</string>
+ <string name="permdesc_shutdown" msgid="7046500838746291775">"à¶šà·Šâ€à¶»à·’යà·à¶šà·à¶»à¶šà¶¸à·Š කළමනà·à¶šà¶»à·” à·€à·à·„ීමේ තත්වයට දමන්න. සම්පූර්ණ à·€à·à·„ීමකට à¶´à¶­à·Š නොකරන්න."</string>
+ <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"යෙදුම් මà·à¶»à·” වීම à·€à·à·…ක්වීම"</string>
+ <string name="permdesc_stopAppSwitches" msgid="8262195802582255021">"වෙනත් යෙදුමක් වෙත පරිà·à·“ලකයà·à·€ මà·à¶»à·” වීම වළක්වයි."</string>
+ <string name="permlab_getTopActivityInfo" msgid="2537922311411546016">"පවතින යෙදුමේ තොරතුරු ලබà·à¶œà·à¶±à·“ම"</string>
+ <string name="permdesc_getTopActivityInfo" msgid="8153651434145132505">"තිරයේ පෙරබිම තුළ තිබෙන දà·à¶±à·Š පවත්න෠යෙදුමේ සහ සේවà·à·€à¶½ පෞද්ගලික තොරතුරු ලබà·à¶œà·à¶±à·“මට දරන්නà·à¶§ අවසර දෙන්න."</string>
+ <string name="permlab_runSetActivityWatcher" msgid="892239094867182656">"සියලු යෙදුම් දියත් කිරීම් නිරීක්ෂණය සහ à¶´à·à¶½à¶±à¶º කිරීම"</string>
+ <string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"පද්ධතිය à¶šà·Šâ€à¶»à·’යà·à¶šà·à¶»à¶šà¶¸à·Š දියත් කරන්නේ කෙසේදà·à¶ºà·’ නිරීක්ෂණයට සහ à¶´à·à¶½à¶±à¶ºà¶§ යෙදුමට අවසර දෙන්න. අනිෂ්ට යෙදුම් මගින් පද්ධතිය සම්පූර්ණයෙන්ම සම්මුතියකට එළඹිය à·„à·à¶š. වර්ධනය සඳහ෠පමණක් මෙම අවසරය à¶…à·€à·à·Šâ€à¶º වෙයි, à·ƒà·à¶¸à·à¶±à·Šâ€à¶º à¶·à·à·€à·’තය සඳහ෠කිසි විටෙකත් à¶…à·€à·à·Šâ€à¶º නොවෙයි."</string>
+ <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"à¶´à·à¶šà·šà¶¢ ඉවත් කිරීමේ à¶´à·Šâ€à¶»à¶ à·à¶»à¶«à¶ºà¶šà·Š යවන්න"</string>
+ <string name="permdesc_broadcastPackageRemoved" msgid="6621901216207931089">"යෙදුම් à¶´à·à¶šà·šà¶¢à¶ºà¶šà·Š ඉවත්කොට ඇති බවට දà·à¶±à·”ම්දීමක් විකà·à·à¶±à¶ºà¶§ යෙදුමට අවසර දෙයි. à¶°à·à·€à¶±à¶º වන අනෙකුත් යෙදුමක් à¶±à·à¶­à·’ කිරීමට අනිෂ්ට යෙදුම් විසින් මෙය à¶·à·à·€à·’à¶­ à¶šà·… à·„à·à¶š."</string>
+ <string name="permlab_broadcastSmsReceived" msgid="5689095009030336593">"SMS-à¶½à·à¶¶à·“ම විකà·à·à¶± යà·à·€à·“ම"</string>
+ <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"SMS පණිවිඩයක් හරහ෠ලà·à¶¶à·”à¶«à·” දà·à¶±à·”ම්දීමක් à¶´à·Šâ€à¶»à¶ à·à¶»à¶«à¶ºà¶§ යෙදුමට අවසර දෙන්න. à¶´à·à¶¸à·’ණෙන SMS පණිවිඩ වංච෠කිරීමට අනිෂ්ට යෙදුම් මෙය à¶·à·à·€à·’à¶­ à¶šà·… à·„à·à¶š."</string>
+ <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"WAP-PUSH-à¶½à·à¶¶à·“ම විකà·à·à¶± යà·à·€à·“ම"</string>
+ <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"WAP PUSH පණිවුඩයක් à¶½à·à¶¶à·“ ඇති බවට දà·à¶±à·”ම්දීමක් විකà·à·à¶±à¶º කිරීමට යෙදුමට අවසර දෙන්න. වංචà·à¶šà·à¶»à·“ MMS පණිවුඩ à¶½à·à¶¶à·“ම් හ෠නිහඬව ඕනෑම වෙබ් පිටුවක අන්තර්ගතය අනිෂ්ට විචල්â€à¶ºà·€à¶½à·’න් ඉවත් කිරීමට, අනිෂ්ට යෙදුම් විසින් මෙය à¶·à·à·€à·’ත෠කිරීමට ඉඩ ඇත."</string>
+ <string name="permlab_setProcessLimit" msgid="2451873664363662666">"à¶°à·à·€à¶± à¶šà·Šâ€à¶»à·’යà·à·€à¶½à·’ ගණන සීම෠කිරීම"</string>
+ <string name="permdesc_setProcessLimit" msgid="7318061314040879542">"à¶°à·à·€à¶±à¶º වන උපරිම à¶šà·Šâ€à¶»à·’යà·à·€à¶½à·’ ගණන à¶´à·à¶½à¶±à¶º කිරීමට යෙදුමට අවසර දෙන්න. à·ƒà·à¶¸à·à¶±à·Šâ€à¶º යෙදුම් සඳහ෠කිසිද෠අවà·à·Šâ€à¶º නොවේ."</string>
+ <string name="permlab_setAlwaysFinish" msgid="550958507798796965">"පසුබිම් යෙදුම් වලට à·€à·à·ƒà·“මට බලකරන්න"</string>
+ <string name="permdesc_setAlwaysFinish" msgid="7471310652868841499">"පසුබිමට පිවිසෙනවà·à¶­à·Š සමඟම à¶šà·Šâ€à¶»à·’යà·à¶šà·à¶»à¶šà¶¸à·Š à¶±à·à·€à¶­à·“ම à¶´à·à¶½à¶±à¶ºà¶§ යෙදුමට අවසර දෙන්න. à·ƒà·à¶¸à·à¶±à·Šâ€à¶º යෙදුම්වලට කිසිසේත් à¶…à·€à·à·Šâ€à¶º නොවෙයි."</string>
+ <string name="permlab_batteryStats" msgid="2789610673514103364">"à¶¶à·à¶§à¶»à·’ සංඛ්â€à¶ºà·à¶± කියවීම"</string>
+ <string name="permdesc_batteryStats" msgid="5897346582882915114">"වර්තමà·à¶± à¶´à·„à·… මට්ටමේ à¶¶à·à¶§à¶»à·’ය à¶·à·à·€à·’ත෠දත්ත කියවීමට යෙදුමට අවසර දෙන්න. ඔබ à¶·à·à·€à·’à¶­ කරන යෙදුම් මොනව෠දà·à¶ºà·’ à¶œà·à¶± විස්තරà·à¶­à·Šà¶¸à¶š තොරතුරු à¶œà·à¶± දà·à¶± à¶œà·à¶±à·“මට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_updateBatteryStats" msgid="3719689764536379557">"à¶¶à·à¶§à¶»à·’ සංඛ්â€à¶ºà·à¶± වෙනස් කිරීම"</string>
+ <string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"à¶‘à¶šà¶­à·” කරගන්න෠ලද à¶¶à·à¶§à¶»à·’ සංඛ්â€à¶ºà·à¶± වෙනස් කිරීමට යෙදුමට අවසර දෙන්න. à·ƒà·à¶¸à·à¶±à·Šâ€à¶º යෙදුම් වල à¶·à·à·€à·’තයට නොවේ."</string>
+ <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"යෙදුමේ විකල්ප සංඛ්â€à¶ºà·à¶‚à¶š සොය෠ලබà·à¶œà·à¶±à·“ම"</string>
+ <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"à¶‘à¶šà¶­à·” කරගත් යෙදුම් à¶šà·Šâ€à¶»à·’යà·à¶šà·à¶»à·’à¶­à·Šà·€ සංඛ්â€à¶ºà· ලේඛන වෙනස් කිරීමට à¶‹à¶´à·à¶‚ගයට ඉඩ දෙන්න. à·ƒà·à¶¸à·à¶±à·Šâ€à¶º à¶‹à¶´à·à¶‚à¶œ à¶·à·à·€à·’තය සඳහ෠නොවේ."</string>
+ <string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"යෙදුම් විකල්ප සංඛ්â€à¶ºà·à¶‚à¶š වෙනස් කිරීම"</string>
+ <string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"à¶‘à¶šà¶­à·” කරගත් යෙදුම් à¶šà·Šâ€à¶»à·’යà·à¶šà·à¶»à·’à¶­à·Šà·€ සංඛ්â€à¶ºà· ලේඛන වෙනස් කිරීමට යෙදුමට ඉඩ දෙන්න. à·ƒà·à¶¸à·à¶±à·Šâ€à¶º යෙදුම් à¶·à·à·€à·’තය සඳහ෠නොවේ."</string>
+ <string name="permlab_backup" msgid="470013022865453920">"පද්ධති උපස්ථ à¶´à·à¶½à¶±à¶º කරන්න සහ à¶±à·à·€à¶­ පිහිටුවන්න"</string>
+ <string name="permdesc_backup" msgid="6912230525140589891">"පද්ධතියේ උපස්ථය සහ à¶‹à¶´à¶šà·Šâ€à¶»à¶¸ à¶±à·à·€à¶­ පිහිටුවීම à¶´à·à¶½à¶±à¶ºà¶§ යෙදුමට අවසර දෙන්න. à·ƒà·à¶¸à·à¶±à·Šâ€à¶º යෙදුම් වල à¶·à·à·€à·’තය සඳහ෠නොවේ."</string>
+ <string name="permlab_confirm_full_backup" msgid="5557071325804469102">"සම්පූර්ණ උපස්ථය හ෠මෙහෙයුම් à¶±à·à·€à¶­ පිහිටුවීම සනà·à¶® කිරීම"</string>
+ <string name="permdesc_confirm_full_backup" msgid="1748762171637699562">"පූර්ණ උපස්ථ තහවුරුකිරීම් UI පුරන්නට උපකරණයට ඉඩ දෙන්න. කිසිම යෙදුමක් à¶·à·à·€à·’ත෠නොකරනු ඇත."</string>
+ <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"අවසර නොලත් කවුළුව දර්à·à¶±à¶º කරන්න"</string>
+ <string name="permdesc_internalSystemWindow" msgid="7458387759461466397">"à¶…à¶·à·Šâ€à¶ºà¶±à·Šà¶­à¶» පද්ධති පරිà·à·“ලක අතුරුමුහුණත් විසින් à¶·à·à·€à·’ත෠කිරීමට à¶¶à¶½à·à¶´à·œà¶»à·œà¶­à·Šà¶­à·” වන කවුළු නිර්මà·à¶«à¶º කිරීමට යෙදුමට අවසර දෙන්න. à·ƒà·à¶¸à·à¶±à·Šâ€à¶º යෙදුම්වල à¶·à·à·€à·’තය සඳහ෠නොවේ."</string>
+ <string name="permlab_systemAlertWindow" msgid="3543347980839518613">"වෙනත් යෙදුම් උඩින් අඳින්න"</string>
+ <string name="permdesc_systemAlertWindow" msgid="8584678381972820118">"අනෙක් යෙදුම් මත හ෠පරිà·à·“ලක අතුරු මුහුණත් කොටස්වල ඇඳීමට යෙදුමට ඉඩ දෙන්න. එය ඔබේ à¶·à·à·€à·’තයේ ඇති ඕනෑම යෙදුමක මුහුණත සමග සම්බන්ධ වීමට හ෠අනෙක් යෙදුම් à¶œà·à¶± ඔබට පෙනෙන ආකà·à¶»à¶º වෙනස් කිරීමට ඉඩ ඇත."</string>
+ <string name="permlab_setAnimationScale" msgid="2805103241153907174">"à¶œà·à¶½à·“ය සජීවන වේගය වෙනස් කරන්න"</string>
+ <string name="permdesc_setAnimationScale" msgid="7690063428924343571">"ඕනෑම වෙලà·à·€à¶š පොදු සජීවීකරණ වේගය (වේගවත් හ෠මන්දගà·à¶¸à·“ සජීවීකරණ) වෙනස් කිරීමට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_manageAppTokens" msgid="1286505717050121370">"යෙදුම් à¶§à·à¶šà¶± කළමනà·à¶šà¶»à¶«à¶º කිරීම"</string>
+ <string name="permdesc_manageAppTokens" msgid="8043431713014395671">"à·ƒà·à¶¸à·à¶±à·Šâ€à¶º Z à¶´à¶§à·’à¶´à·à¶§à·’ය මඟහà·à¶»à¶ºà¶¸à·’න් යෙදුම්වලට අයිති à¶§à·à¶šà¶±à·Š à¶´à¶­à·Š නිර්මà·à¶«à¶ºà¶§ සහ කළමනà·à¶šà¶»à¶«à¶ºà¶§ යෙදුම්වලට අවසර දෙන්න. à·ƒà·à¶¸à·à¶±à·Šâ€à¶º යෙදුම්වලට කිසිසේත් à¶…à·€à·à·Šâ€à¶º නොවේ."</string>
+ <string name="permlab_freezeScreen" msgid="4708181184441880175">"තිරය නිà·à·Šà¶ à¶½ කරන්න"</string>
+ <string name="permdesc_freezeScreen" msgid="8558923789222670064">"සම්පූර්ණ à¶­à·’à¶» සංක්â€à¶»à¶¸à¶«à¶º සඳහ෠තිරය à¶­à·à·€à¶šà·à¶½à·’à¶šà·€ මුදවිමට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_injectEvents" msgid="1378746584023586600">"යතුරු සහ à¶´à·à¶½à¶± බොත්තම් ඔබන්න"</string>
+ <string name="permdesc_injectEvents" product="tablet" msgid="206352565599968632">"තමන්ගේ ආදà·à¶± සිදුවීම් (යතුරු එබිම් , ආදී ) අනෙකුත් යෙදුම්වලට à¶·à·à¶»à¶¯à·“මට යෙදුමට ඉඩ දෙන්න. අනිෂ්ට යෙදුම් මෙය à¶§à·à¶¶à·Šà¶½à¶§à¶º ලබ෠ගà·à¶±à·“මට à¶·à·à·€à·’ත෠කිරීමට ඉඩ ඇත."</string>
+ <string name="permdesc_injectEvents" product="default" msgid="653128057572326253">"වෙනත් යෙදුම්වලට à¶‘à·„à·’ ආදà·à¶± සිදුවීම් (යතුරු එබීම්, යනà·à¶¯à·’ය.) ආදිය යà·à·€à·“මට යෙදුමට අවසර දෙන්න. දුරකථනය à¶…à¶­à·Šà¶šà¶» à¶œà·à¶±à·“ම අනිෂ්ට යෙදුම් මෙය à¶·à·à·€à·’à¶­ කරයි."</string>
+ <string name="permlab_readInputState" msgid="469428900041249234">"ඔබ ටයිප් කරන දෙය සහ ඔබ ගන්න෠ක්â€à¶»à·’යà·à·€à¶±à·Š පටිගත කරන්න"</string>
+ <string name="permdesc_readInputState" msgid="8387754901688728043">"මුරපදය ටයිප් කිරීම à·€à·à¶±à·’ අනෙකුත් යෙදුම් සමඟ අන්තර්ක්â€à¶»à·’යà·à¶šà·à¶»à·“ වනවිට යනà·à¶¯à·“ ඔබ ඔබන යතුරු දà·à¶šà·“මට යෙදුමට අවසර දෙන්න. à·ƒà·à¶¸à·à¶±à·Šâ€à¶º යෙදුම් සඳහ෠කිසිසේත් අදà·à·… නොවේ."</string>
+ <string name="permlab_bindInputMethod" msgid="3360064620230515776">"ආදà·à¶± à¶šà·Šâ€à¶»à¶¸à¶ºà¶šà·Š වෙත බඳින්න"</string>
+ <string name="permdesc_bindInputMethod" msgid="3250440322807286331">"ආදà·à¶± à¶šà·Šâ€à¶»à¶¸à¶º ඉහල මට්ටමේ අතුරු මුහුණතක් වෙත සම්බන්ධ කිරීමට à¶°à·à¶»à¶šà¶ºà·à¶§ අවසර දෙන්න. à·ƒà·à¶¸à·à¶±à·Šâ€à¶º යෙදුම්වලට කිසි විටෙක à¶…à·€à·à·Šâ€à¶º නොවෙයි."</string>
+ <string name="permlab_bindAccessibilityService" msgid="5357733942556031593">"à¶´â€à·Šâ€à¶»à·€à·šà·à·Šâ€à¶ºà¶­à· සේවà·à·€à¶šà·Š වෙත බදින්න"</string>
+ <string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"à¶´â€à·Šâ€à¶»à·€à·šà·à·Šâ€à¶ºà¶­à· සේවà·à·€à·š ඉහළ මට්ටමේ අතුරුමුහුණතට à¶¶à·à¶³à·“මට දරන්නà·à¶§ අවසර දේ. à·ƒà·à¶¸à·à¶±à·Šâ€à¶º යෙදුම් සඳහ෠කිසිවිටක à¶…à·€à·à·Šâ€à¶º නොවේ."</string>
+ <string name="permlab_bindPrintService" msgid="8462815179572748761">"මුද්â€à¶»à¶« සේවà·à·€à¶šà¶§ බද්ධ වී ඇත"</string>
+ <string name="permdesc_bindPrintService" msgid="7960067623209111135">"මුද්â€à¶»à¶« සේවà·à·€ ඉහල මට්ටමේ අතුරු මුහුණතක් වෙත සම්බන්ධ කිරීමට à¶°à·à¶»à¶šà¶ºà·à¶§ අවසර දෙන්න. à·ƒà·à¶¸à·à¶±à·Šâ€à¶º යෙදුම්වලට කිසි විටෙක à¶…à·€à·à·Šâ€à¶º නොවෙයි."</string>
+ <string name="permlab_bindPrintSpoolerService" msgid="6807762783744125954">"මුද්â€à¶»à¶« සේවà·à·€à¶šà¶§ බද්ධ වී ඇත"</string>
+ <string name="permdesc_bindPrintSpoolerService" msgid="3680552285933318372">"මුද්â€à¶»à¶« සේවà·à·€ ඉහල මට්ටමේ අතුරු මුහුණතක් වෙත සම්බන්ධ කිරීමට à¶°à·à¶»à¶šà¶ºà·à¶§ අවසර දෙන්න. à·ƒà·à¶¸à·à¶±à·Šâ€à¶º යෙදුම්වලට කිසි විටෙක à¶…à·€à·à·Šâ€à¶º නොවෙයි."</string>
+ <string name="permlab_bindNfcService" msgid="2752731300419410724">"NFC සේවà·à·€ වෙත à¶¶à·à¶³à·™à¶±à·Šà¶±"</string>
+ <string name="permdesc_bindNfcService" msgid="6120647629174066862">"NFC à¶šà·à¶©à·Š à¶´à¶­à·Š ආදර්à·à¶±à¶º කරන යෙදුම් රඳවනයට සම්බන්ධ වීමට ඉඩ දෙන්න. à·ƒà·à¶¸à·à¶±à·Šâ€à¶º යෙදුම් සඳහ෠කිසිද෠අවà·à·Šâ€à¶º නොවෙයි."</string>
+ <string name="permlab_bindTextService" msgid="7358378401915287938">"පෙළ සේවà·à·€à¶šà¶§ බඳින්න"</string>
+ <string name="permdesc_bindTextService" msgid="8151968910973998670">"කෙටි පණිවිඩ සේවà·à·€à¶š (උදà·. SpellCheckerService) ඉහල මට්ටමේ අතුරු මුහුණතක් වෙත සම්බන්ධ කිරීමට à¶°à·à¶»à¶šà¶ºà·à¶§ අවසර දෙන්න. à·ƒà·à¶¸à·à¶±à·Šâ€à¶º යෙදුම්වලට කිසි විටෙක à¶…à·€à·à·Šâ€à¶º නොවෙයි."</string>
+ <string name="permlab_bindVpnService" msgid="4708596021161473255">"VPN සේවà·à·€à¶šà¶§ à¶¶à·à¶³à·“ම"</string>
+ <string name="permdesc_bindVpnService" msgid="2067845564581693905">"VPN සේවà·à·€ ඉහල මට්ටමේ අතුරු මුහුණතක් වෙත සම්බන්ධ කිරීමට à¶°à·à¶»à¶šà¶ºà·à¶§ අවසර දෙන්න. à·ƒà·à¶¸à·à¶±à·Šâ€à¶º යෙදුම්වලට කිසි විටෙක à¶…à·€à·à·Šâ€à¶º නොවෙයි."</string>
+ <string name="permlab_bindWallpaper" msgid="8716400279937856462">"බිතුපත වෙත බඳින්න"</string>
+ <string name="permdesc_bindWallpaper" msgid="7108428692595491668">"බිතුපත ඉහල මට්ටමේ අතුරු මුහුණතක් වෙත සම්බන්ධ කිරීමට à¶°à·à¶»à¶šà¶ºà·à¶§ අවසර දෙන්න. à·ƒà·à¶¸à·à¶±à·Šâ€à¶º යෙදුම්වලට කිසි විටෙක à¶…à·€à·à·Šâ€à¶º නොවෙයි."</string>
+ <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"විජට සේවà·à·€à¶šà¶§ බඳින්න"</string>
+ <string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"විජට් සේවà·à·€ ඉහල මට්ටමේ අතුරු මුහුණතක් වෙත සම්බන්ධ කිරීමට à¶°à·à¶»à¶šà¶ºà·à¶§ අවසර දෙන්න. à·ƒà·à¶¸à·à¶±à·Šâ€à¶º යෙදුම්වලට කිසි විටෙක à¶…à·€à·à·Šâ€à¶º නොවෙයි."</string>
+ <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"à¶‹à¶´à·à¶‚à¶œ පරිපà·à¶½à¶š සමඟ අන්තර්ක්â€à¶»à·’යà·à¶šà·à¶»à·“ වීම"</string>
+ <string name="permdesc_bindDeviceAdmin" msgid="569715419543907930">"à¶‹à¶´à·à¶‚à¶œ à¶´à·à¶½à¶šà¶ºà· වෙතට à¶…à¶·à·’à¶´à·Šâ€à¶»à·à¶ºà¶ºà¶±à·Š යà·à·€à·“මට à¶°à·à¶»à¶šà¶ºà·à¶§ අවසර දෙන්න. à·ƒà·à¶¸à·à¶±à·Šâ€à¶º යෙදුම්වලට කිසි විටෙක à¶…à·€à·à·Šâ€à¶º නොවෙයි."</string>
+ <string name="permlab_manageDeviceAdmins" msgid="4248828900045808722">"à¶‹à¶´à·à¶‚à¶œ පරිපà·à¶½à¶šà¶ºà·™à¶šà·Š à¶‘à¶šà·Š කිරීම හ෠ඉවත් කිරීම"</string>
+ <string name="permdesc_manageDeviceAdmins" msgid="5025608167709942485">"දරන්නà·à¶§ à¶‹à¶´à·à¶‚à¶œ පරිපà·à¶½à¶šà¶ºà·’න් à¶‘à¶šà·Š කිරීමට හ෠ඉවත් කිරීමට අවසර දේ. à·ƒà·à¶¸à·à¶±à·Šâ€à¶º යෙදුම් වලට කිසිද෠අවà·à·Šâ€à¶º නොවේ."</string>
+ <string name="permlab_setOrientation" msgid="3365947717163866844">"à¶­à·’à¶» දිà·à·à¶±à¶­à·’ය වෙනස් කිරීම"</string>
+ <string name="permdesc_setOrientation" msgid="3046126619316671476">"තිරයේ à¶·à·Šâ€à¶»à¶¸à¶«à¶º ඕනෑම වේලà·à·€à¶š වෙනස් කිරීමට යෙදුමට අවසර දෙන්න. à·ƒà·à¶¸à·à¶±à·Šâ€à¶º යෙදුම් සඳහ෠කිසිද෠අවà·à·Šâ€à¶º නොවනු ඇත."</string>
+ <string name="permlab_setPointerSpeed" msgid="9175371613322562934">"දර්à·à¶šà¶ºà·š වේගය වෙනස් කිරීම"</string>
+ <string name="permdesc_setPointerSpeed" msgid="6866563234274104233">"මූසිකයේ à·„à· à¶§à·Šâ€à¶»à·à¶šà·Šà¶´à·‘ඩයේ වේගය ඕනෑම මොහොතක වෙනස් කිරීමට à¶‹à¶´à·à¶‚ගයට ඉඩ දෙන්න. à·ƒà·à¶¸à·à¶±à·Šâ€à¶º à¶‹à¶´à·à¶‚ගයන් සඳහ෠කිසිද෠අවà·à·Šâ€à¶º නොවනු ඇත."</string>
+ <string name="permlab_setKeyboardLayout" msgid="4778731703600909340">"යතුරු පුවරු පිරිසà·à¶½à·à·ƒà·Šà¶¸ වෙනස් කිරීම"</string>
+ <string name="permdesc_setKeyboardLayout" msgid="8480016771134175879">"යතුරුපුවරු මුහුණත වෙනස් කිරීමට යෙදුමට අවසර දෙන්න. à·ƒà·à¶¸à·à¶±à·Šâ€à¶º යෙදුම් සඳහ෠කිසිද෠අවà·à·Šâ€à¶º නොවෙයි."</string>
+ <string name="permlab_signalPersistentProcesses" msgid="4539002991947376659">"යෙදුම් වෙත Linux සංඥ෠යà·à·€à·“ම"</string>
+ <string name="permdesc_signalPersistentProcesses" msgid="4896992079182649141">"පවතින සියලු à¶šà·Šâ€à¶»à·’යà·à·€à¶½à·’ වෙත à·ƒà·à¶´à¶ºà·”ම් සංඥ෠ඉල්ලවිමට යෙදුමට අවසර දේ."</string>
+ <string name="permlab_persistentActivity" msgid="8841113627955563938">"යෙදුම à·ƒà·à¶¸à·€à·’ටම à¶°à·à·€à¶±à¶º කරන්න"</string>
+ <string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"මතකයේ පවතින à¶‘à·„à·’ කොටස් නොනà·à·ƒà·“ à¶´à·à·€à¶­à·“මට යෙදුමට අවසර දෙන්න. වෙනත් යෙදුම් වලට මතකය සීම෠කිරීමෙන් à¶§à·à¶¶à·Šà¶½à¶§à¶º පම෠කිරීම මගින් මෙමගින් à¶šà·… à·„à·à¶š."</string>
+ <string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"යෙදුමට තම කොටස් මතකය තුල නොබිඳීව රඳ෠පවත්වà·à¶œà·™à¶± යà·à¶¸à¶§ අවසර දෙන්න. මෙය දුරකථනය මන්දගà·à¶¸à·“ කරමින් අනෙකුත් à¶‹à¶´à·à¶‚ගයන් සඳහ෠ඉතිරි මතකය සීම෠කිරීමට à·„à·à¶š."</string>
+ <string name="permlab_deletePackages" msgid="184385129537705938">"යෙදුම් මකන්න"</string>
+ <string name="permdesc_deletePackages" msgid="7411480275167205081">"Android à¶´à·à¶šà·šà¶¢ මà·à¶šà·“මට යෙදුමට අවසර දෙන්න. à·€à·à¶¯à¶œà¶­à·Š යෙදුම් මà·à¶šà·“මට අනිෂ්ට යෙදුම් විසින් මෙය à¶·à·à·€à·’ත෠කිරීමට ඉඩ ඇත."</string>
+ <string name="permlab_clearAppUserData" msgid="274109191845842756">"යෙදුමේ වෙනත් දත්ත මකන්න"</string>
+ <string name="permdesc_clearAppUserData" msgid="4625323684125459488">"පරිà·à·“ලක දත්ත හිස් කිරීමට යෙදුමකට ඉඩ දේ."</string>
+ <string name="permlab_deleteCacheFiles" msgid="3128665571837408675">"අනෙක් යෙදුම්වල à·„à·à¶¹à·’ලි මකන්න"</string>
+ <string name="permdesc_deleteCacheFiles" msgid="3812998599006730196">"à·„à·à¶¹à·’ලි ගොනු මà·à¶šà·“මට අවසර යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_getPackageSize" msgid="7472921768357981986">"යෙදුම් ආචයනයේ ඉඩ à¶´à·Šâ€à¶»à¶¸à·à¶«à¶º මà·à¶±à·“ම"</string>
+ <string name="permdesc_getPackageSize" msgid="3921068154420738296">"යෙදුමකට à¶‘à·„à·’ කේතය, දත්ත සහ à·„à·à¶¹à·’ලි à¶´à·Šâ€à¶»à¶¸à·à¶« ලබà·à¶œà·à¶±à·“මට අවසර දෙන්න."</string>
+ <string name="permlab_installPackages" msgid="2199128482820306924">"යෙදුම් කෙළින්ම ස්ථà·à¶´à¶±à¶º කිරීම"</string>
+ <string name="permdesc_installPackages" msgid="5628530972548071284">"නව හ෠යà·à·€à¶­à·Šà¶šà·à¶½à·’à¶± කරන ලද Android à¶´à·à¶šà·šà¶¢à¶ºà¶±à·Š ස්ථà·à¶´à¶±à¶º කිරීමට ඉඩ දෙන්න. බලසහිත අවසර තීන්දු සමග නව යෙදුම් à¶‘à¶šà¶­à·” කිරීමට අනිෂ්ට යෙදුම්වලට මෙය à¶·à·à·€à·’ත෠කිරීමට ඉඩ à¶­à·’à¶¶à·š."</string>
+ <string name="permlab_clearAppCache" msgid="7487279391723526815">"යෙදුමේ සියලුම à·„à·à¶¹à·’ලි දත්ත මකන්න"</string>
+ <string name="permdesc_clearAppCache" product="tablet" msgid="8974640871945434565">"අනෙක් යෙදුම්වල à·„à·à¶¹à·’ලි à¶±à·à¶¸à·à·€à¶½à·’ තුළ ඇති ගොනු මà·à¶šà·“මෙන් යෙදුමට à¶§à·à¶¶à·Šà¶½à¶§ ආචයනය නිදහස් කිරීමට අවසර දෙන්න. මෙමගින් අනෙක් යෙදුම්වලට à¶’à·€à·à¶ºà·š දත්ත à¶±à·à·€à¶­ ලබ෠ගà·à¶±à·“මට à¶…à·€à·à·Šâ€à¶º වන නිසà·, à¶’à·€à·à¶ºà·š ආරම්භය තවත් සෙමින් සිදුවීමට ඉඩ ඇත."</string>
+ <string name="permdesc_clearAppCache" product="default" msgid="2459441021956436779">"අනෙක් යෙදුම්වල à·„à·à¶¹à·’ලි à¶±à·à¶¸à·à·€à¶½à·’ තුළ ඇති ගොනු මà·à¶šà·“මෙන් යෙදුමට දුරකථන ආචයනය නිදහස් කිරීමට අවසර දෙන්න. මෙමඟින් අනෙක් යෙදුම්වලට à¶’à·€à·à¶ºà·š දත්ත à¶±à·à·€à¶­ ලබ෠ගà·à¶±à·“මට à¶…à·€à·à·Šâ€à¶º වන නිසà·, à¶’à·€à·à¶ºà·š ආරම්භය තවත් සෙමින් සිදුවීමට ඉඩ ඇත."</string>
+ <string name="permlab_movePackage" msgid="3289890271645921411">"යෙදුම් සම්පත් ගෙන යà·à¶¸"</string>
+ <string name="permdesc_movePackage" msgid="319562217778244524">"à¶…à¶·à·Šâ€à¶ºà¶±à·Šà¶­à¶» සහ à¶¶à·à·„à·’à¶» මà·à¶°à·Šâ€à¶ºà¶ºà¶±à·Šà¶œà·™à¶±à·Š යෙදුමේ සම්පත් ගෙනයà·à¶¸à¶§ සහ යෙදුමේ සම්පත් වලින් à¶…à¶·à·Šâ€à¶ºà¶±à·Šà¶­à¶» සහ à¶¶à·à·„à·’à¶» මà·à¶°à·Šâ€à¶ºà¶ºà¶±à·Šà¶§ යෙදුමේ සම්පත් ගෙනයà·à¶¸à¶§ යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_readLogs" msgid="6615778543198967614">"සංවේදී ලොග් දත්ත කියවීම"</string>
+ <string name="permdesc_readLogs" product="tablet" msgid="82061313293455151">"පද්ධතියේ විවිධ ලොග් ගොනු කියවීමට යෙදුමට අවසර දෙන්න. පුද්ගලික සහ පෞද්ගලික තොරතුරු ඇතුළත්ව ඔබ à¶§à·à¶¶à·Šà¶½à¶§à¶ºà·™à¶±à·Š කුමක් කරන්නෙහිද යනà·à¶¯à·“ à·ƒà·à¶¸à·à¶±à·Šâ€à¶º තොරතුරු සෙවීමට මෙයට අවසර දෙන්න."</string>
+ <string name="permdesc_readLogs" product="default" msgid="2063438140241560443">"පද්ධතියේ විවිධ ලොග් ගොනු කියවීමට යෙදුමට අවසර දෙන්න. පුද්ගලික සහ පෞද්ගලික තොරතුරු ඇතුළත්ව ඔබ දුරකථනයෙන් කුමක් කරන්නෙහිද යනà·à¶¯à·“ à·ƒà·à¶¸à·à¶±à·Šâ€à¶º තොරතුරු සෙවීමට මෙයට අවසර දෙන්න."</string>
+ <string name="permlab_anyCodecForPlayback" msgid="715805555823881818">"à¶±à·à·€à¶­ à¶°à·à·€à¶±à¶º සඳහ෠ඕනෑම මà·à¶°à·Šâ€à¶º විකේතකයක් à·„à·à·€à·’ත෠කරන්න"</string>
+ <string name="permdesc_anyCodecForPlayback" msgid="8283912488433189010">"à¶±à·à·€à¶­ à¶°à·à·€à¶±à¶º සඳහ෠විකේතනය කිරීමට ඕනෑම ස්ථà·à¶´à·’à¶­ මà·à¶°à·Šâ€à¶º විකේතකයක් à¶·à·à·€à·’තයට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_manageCaCertificates" msgid="1678391896786882014">"විà·à·Šà·€à·à·ƒà¶¯à·à¶ºà·“ à¶…à¶šà·Šà¶­à¶´à¶­à·Šâ€à¶» කළමනà·à¶šà¶»à¶«à¶º"</string>
+ <string name="permdesc_manageCaCertificates" msgid="4015644047196937014">"යෙදුමට CA සහතික විà·à·Šà·€à·à·ƒà¶¯à·à¶ºà·“ à¶…à¶šà·Šà¶­à¶´à¶­à·Šâ€à¶» ලෙස ස්ථà·à¶´à¶±à¶º සහ අස්ථà·à¶´à¶±à¶º කිරීමට ඉඩ දෙන්න."</string>
+ <string name="permlab_diagnostic" msgid="8076743953908000342">"Diag විසින් හිමිකà·à¶»à¶­à·Šà·€à¶º දරණ සම්පත්වලට කියවීම/ ලිවිම"</string>
+ <string name="permdesc_diagnostic" msgid="6608295692002452283">"Diag à¶šà¶«à·Šà¶©à·à¶ºà¶¸à¶§ අයිති ඕනෑම සම්පතක් කියවීමට සහ ලිවීමට යෙදුමට අවසර දෙන්න. උදà·à·„රණයක් ලෙස /dev තුල ඇති ගොනු. මෙයට පද්ධති ස්ථà·à¶ºà·’à¶­à·à·€à¶§ සහ ආරක්ෂà·à·€à¶§ බලපෑම් කිරීමට à·„à·à¶šà·’යà·à·€à¶šà·Š ඇත. නිෂ්පà·à¶¯à¶š à·„à· à¶šà·Šâ€à¶»à·’යà·à¶šà¶»à·” විසින් දෘඩà·à¶‚à¶œ-විà·à·šà·‚à·’à¶­ දà·à·‚ නිර්ණය සඳහ෠පමණක් මෙය යොදà·à¶œà¶­ යුතුය."</string>
+ <string name="permlab_changeComponentState" msgid="6335576775711095931">"යෙදුම් අංග සබල හ෠අබල කිරීම"</string>
+ <string name="permdesc_changeComponentState" product="tablet" msgid="8887435740982237294">"වෙනත් යෙදුමක අංගයක් සබල ද à¶±à·à¶¯à·Šà¶¯ යන්න වෙනස් කිරීමට යෙදුමට අවසර දෙන්න. à·€à·à¶¯à¶œà¶­à·Š à¶§à·à¶¶à·Šà¶½à¶§à·Š à¶…à·€à·à·Šâ€à¶ºà¶­à· à¶…à¶¶à¶½ කිරීමට අනිෂ්ට යෙදුම් මෙය à¶·à·à·€à·’à¶­ à¶šà·… à·„à·à¶š. මෙම අවසරය à·ƒà·à¶½à¶šà·’ල්ලෙන් à¶·à·à·€à·’à¶­à· à¶šà·… යුතුය, à¶·à·à·€à·’à¶­ නොකරන, අස්ථිර හ෠අස්ථà·à¶ºà·’ තත්වයට යෙදුම à¶´à¶­à·Š කිරීමට එයට à·„à·à¶šà·’ය."</string>
+ <string name="permdesc_changeComponentState" product="default" msgid="1827232484416505615">"වෙනත් යෙදුමක අංගයක් සබල ද à¶±à·à¶¯à·Šà¶¯ යන්න වෙනස් කිරීමට යෙදුමට අවසර දෙන්න. à·€à·à¶¯à¶œà¶­à·Š දුරකථන à¶…à·€à·à·Šâ€à¶ºà¶­à· à¶…à¶šà·Šâ€à¶»à·’ය කිරීමට අනිෂ්ට යෙදුම් මෙය à¶·à·à·€à·’à¶­ à¶šà·… à·„à·à¶š. මෙම අවසරය à·ƒà·à¶½à¶šà·’ල්ලෙන් à¶·à·à·€à·’à¶­ à¶šà·… යුතුය, à¶·à·à·€à·’à¶­ නොකරන, අස්ථිර හ෠අස්ථà·à¶ºà·’ තත්වයට යෙදුම à¶´à¶­à·Š කිරීමට එයට à·„à·à¶šà·’ය."</string>
+ <string name="permlab_grantRevokePermissions" msgid="4627315351093508795">"අවසර à¶´à·Šâ€à¶»à¶¯à·à¶±à¶º කිරීම à·„à· à¶…à·„à·à·ƒà·’ කිරීම"</string>
+ <string name="permdesc_grantRevokePermissions" msgid="4088642654085850662">"යෙදුමකට එයට හ෠අනෙක් යෙදුම් වලට විà·à·šà·‚à·’à¶­ අවසර à¶´à·Šâ€à¶»à¶¯à·à¶±à¶ºà¶§ à·„à· à¶…à·„à·à·ƒà·’ කිරීමට අවසර දෙන්න. අනිෂ්ට යෙදුම්, à¶’à·€à·à¶§ අවසර à¶´à·Šâ€à¶»à¶¯à·à¶±à¶º නොකළ ගුණà·à¶‚à¶œ වලට à¶´à·Šâ€à¶»à·€à·šà· වීමට මෙය à¶·à·à·€à·’à¶­à· à¶šà·… à·„à·à¶š."</string>
+ <string name="permlab_setPreferredApplications" msgid="8463181628695396391">"අභිරුචි යෙදුම් සකසන්න"</string>
+ <string name="permdesc_setPreferredApplications" msgid="4973986762241783712">"ඔබගේ අභිරුචි යෙදුම් වෙනස් කිරීමට යෙදුමට අවසර දෙන්න. ඔබගේ à¶°à·à·€à¶±à¶º වන යෙදුම් වෙනස් කිරීම, පවතින යෙදුම් වලින් දත්ත à¶‘à¶šà¶­à·” කිරීම, à¶´à·Šâ€à¶»à·à¶©à· කිරීම à·€à·à¶±à·’ දේ අනිෂ්ට යෙදුම් නිà·à·Šà·à¶¶à¶¯à·€à¶¸ සිදු කරයි."</string>
+ <string name="permlab_writeSettings" msgid="2226195290955224730">"පද්ධති à·ƒà·à¶šà·ƒà·“ම් වෙනස් කිරීම"</string>
+ <string name="permdesc_writeSettings" msgid="7775723441558907181">"පද්ධති à·ƒà·à¶šà·ƒà·“ම් දත්ත වෙනස් කිරීමට යෙදුමට අවසර දෙන්න. අනිෂ්ට යෙදුම් ඔබගේ පද්ධති වින්â€à¶ºà·à·ƒ දà·à·‚ à¶œà·à¶±à·Šà·€à·’ය à·„à·à¶š."</string>
+ <string name="permlab_writeSecureSettings" msgid="204676251876718288">"ආරක්â€à·‚à·’à¶­ පද්ධති à·ƒà·à¶šà·ƒà·“ම් වෙනස් කරන්න"</string>
+ <string name="permdesc_writeSecureSettings" msgid="8159535613020137391">"පද්ධතියේ ආරක්â€à·‚à·’à¶­ දත්ත වෙනස් කිරීමට à¶‹à¶´à·à¶‚ගයට අවසර දෙන්න. à·ƒà·à¶¸à·à¶±à·Šâ€à¶º à¶‹à¶´à·à¶‚à¶œ සඳහ෠භà·à·€à·’තයට නොවේ."</string>
+ <string name="permlab_writeGservices" msgid="2149426664226152185">"Google සේව෠සිතියම වෙනස් කරන්න"</string>
+ <string name="permdesc_writeGservices" msgid="1287309437638380229">"Google සේව෠සිතියම වෙනස් කිරීමට යෙදුමට අවසර දෙන්න. à·ƒà·à¶¸à·à¶±à·Šâ€à¶º යෙදුම් සඳහ෠භà·à·€à·’තයට නොවෙයි."</string>
+ <string name="permlab_receiveBootCompleted" msgid="5312965565987800025">"ආරම්භයේදී à¶°à·à·€à¶±à¶º කිරීම"</string>
+ <string name="permdesc_receiveBootCompleted" product="tablet" msgid="7390304664116880704">"පද්ධතිය ඇරඹුම අවසන් වූ වහà·à¶¸ යෙදුම ආරම්භ වීමට යෙදුමට අවසර දෙන්න. à¶§à·à¶¶à·Šà¶½à¶§à¶º ආරම්භ කිරීමට මෙමඟින් පම෠කළ à·„à·à¶šà·’ à¶…à¶­à¶» à·ƒà·à¶¸à·€à·’ටම à¶°à·à·€à¶±à¶º වන නිස෠සම්පූර්ණ à¶§à·à¶¶à·Šà¶½à¶§à¶ºà¶¸ à¶´à·Šâ€à¶»à¶¸à·à¶¯ කිරීමට යෙදුමට අවසර දෙයි."</string>
+ <string name="permdesc_receiveBootCompleted" product="default" msgid="513950589102617504">"පද්ධතිය ඇරඹුම අවසන් වූ වහà·à¶¸ යෙදුම ආරම්භ වීමට යෙදුමට අවසර දෙන්න. දුරකථනය ආරම්භ කිරීමට මෙමඟින් පම෠කළ à·„à·à¶šà·’ à¶…à¶­à¶» à·ƒà·à¶¸à·€à·’ටම à¶°à·à·€à¶±à¶º වන නිස෠සම්පූර්ණ දුරකථනයේම à¶šà·Šâ€à¶»à·’යà·à¶šà·à¶»à·’ත්වය à¶´à·Šâ€à¶»à¶¸à·à¶¯ කිරීමට යෙදුමට අවසර දෙයි."</string>
+ <string name="permlab_broadcastSticky" msgid="7919126372606881614">"à¶¶à·à¶³à·”à¶«à·” විකà·à·à¶±à¶º යà·à·€à·“ම"</string>
+ <string name="permdesc_broadcastSticky" product="tablet" msgid="7749760494399915651">"à¶´à·Šâ€à¶»à¶ à·à¶»à¶«à¶ºà¶§ පසුවද පවතින, à¶´à·Šâ€à¶»à¶ à·à¶»à¶«à¶ºà¶±à·Š යà·à·€à·“මට යෙදුමට අවසර දෙන්න. à·€à·à¶©à·’පුර මතකය à¶·à·à·€à·’තය à·„à·šà¶­à·” කොට, à¶…à¶°à·’à¶š à¶·à·à·€à·’තය මඟින් à¶§à·à¶¶à·Šà¶½à¶§à¶º පම෠කිරීම හ෠අස්ථිර à¶šà·… à·„à·à¶š."</string>
+ <string name="permdesc_broadcastSticky" product="default" msgid="2825803764232445091">"à¶´à·Šâ€à¶»à¶ à·à¶»à¶«à¶ºà¶§ පසුවද පවතින, à¶´à·Šâ€à¶»à¶ à·à¶»à¶«à¶ºà¶±à·Š යà·à·€à·“මට යෙදුමට අවසර දෙන්න. à·€à·à¶©à·’පුර මතකය à¶·à·à·€à·’තය à·„à·šà¶­à·” කොට, à¶…à¶°à·’à¶š à¶·à·à·€à·’තය මඟින් දුරකථනය පම෠කිරීම හ෠අස්ථිර à¶šà·… à·„à·à¶š."</string>
+ <string name="permlab_readContacts" msgid="8348481131899886131">"ඔබගේ සම්බන්ධත෠කියවීම"</string>
+ <string name="permdesc_readContacts" product="tablet" msgid="5294866856941149639">"සඳහන් පුද්ගලයන් à·„à¶§ ඔබ ඇමතුම් ගත්, à¶Š-à¶­à·à¶´à·à¶½à·Š, හ෠අනෙකුත් ආකà·à¶» වලින් සන්නිවේදනය කරගත් සංඛ්â€à¶ºà¶­à¶¯ ඇතුළුව, ඔබගේ à¶§à·à¶¶à·Šà¶½à¶§à¶ºà·š ගබඩà·à·€à·“ ඇති සම්බන්ධත෠පිළිබඳ දත්ත කියවීමට යෙදුමට අවසර දෙන්න. මෙම අවසරය මඟින් යෙදුම්වලට ඔබගේ සම්බන්ධත෠පිළිබඳ දත්ත සුරà·à¶šà·“මට ඉඩ ලබ෠දෙන à¶…à¶­à¶», අනිෂ්ට යෙදුම් විසින් ඔබ නොදà·à¶±à·”වත්වම සම්බන්ධත෠දත්ත බෙද෠ගà·à¶±à·“මට ඉඩ ඇත."</string>
+ <string name="permdesc_readContacts" product="default" msgid="8440654152457300662">"නියමිත පුද්ගලයන් සමග ඔබ ඇමතු, à¶Š-à¶­à·à¶´à·à¶½à·Š à¶šà·… හ෠වෙනත් ආකà·à¶»à¶ºà¶šà·’න් සන්නිවේදනය à¶šà·… සංඛ්â€à¶ºà·à¶­à¶º ඇතුලත් ඔබගේ දුරකථනයේ ආචයනය කරන ලද ඔබගේ සම්බන්ධත෠ගà·à¶± දත්ත කියවීමට යෙදුමට අවසර දෙන්න. ඔබගේ සම්බන්ධත෠දත්ත උපස්ථ කිරීමට මෙම අවසරය යෙදුමට අවසර දෙන à¶…à¶­à¶» ඔබගේ දà·à¶±à·”මකින් තොරව අනිෂ්ට යෙදුම් සම්බන්ධත෠දත්ත බෙදà·à¶œà·à¶±à·“ම à¶šà·… à·„à·à¶š."</string>
+ <string name="permlab_writeContacts" msgid="5107492086416793544">"ඔබගේ සම්බන්ධත෠වෙනස් කිරීම"</string>
+ <string name="permdesc_writeContacts" product="tablet" msgid="897243932521953602">"නියමිත පුද්ගලයන්ට ඔබ ඇමතූ, à¶Š-à¶­à·à¶´à·à¶½à·Š à¶šà·… හ෠ඇමතුම් à¶šà·… සංඛ්â€à¶ºà·à¶­ ඇතුලත් ඔබගේ à¶§à·à¶¶à·Šà¶½à¶§à¶ºà·š ආචයනය කරන ලද සම්බන්ධත෠(ලිපින) දත්ත වෙනස් කිරීමට යෙදුමට අවසර දෙන්න. මෙම අවසරයෙන් යෙදුමට සම්බන්ධත෠දත්ත මà·à¶šà·“මට අවසර දෙයි."</string>
+ <string name="permdesc_writeContacts" product="default" msgid="589869224625163558">"සඳහන් පුද්ගලයන්ට ඔබ ඇමතූ, à¶Š-à¶­à·à¶´à·à¶½à·Š à¶šà·… හ෠ඇමතුම් à¶šà·… සංඛ්â€à¶ºà·à¶± ඇතුලත් ඔබගේ දුරකථනයේ ආචයනය කරන ලද සම්බන්ධත෠(ලිපින) දත්ත වෙනස් කිරීමට යෙදුමට අවසර දෙන්න. මෙම අවසරයෙන් යෙදුමට සම්බන්ධත෠දත්ත මà·à¶šà·“මට අවසර දෙයි."</string>
+ <string name="permlab_readCallLog" msgid="3478133184624102739">"ඇමතුම් ලොගය කියවන්න"</string>
+ <string name="permdesc_readCallLog" product="tablet" msgid="3700645184870760285">"à¶´à·à¶¸à·’ණෙන සහ පිටවන ඇමතුම් à¶œà·à¶± දත්ත ඇතුළත්, ඔබගේ à¶§à·à¶¶à·Šà¶½à¶§à¶ºà·š ඇමතුම් ලොග කියවීමට යෙදුමට අවසර දෙන්න. ඔබගේ ඇමතුම් ලොග දත්ත සුරක්ෂිත කිරීමට මෙම අවසරය යෙදුම්වලට අවසර දෙයි සහ ඔබගේ දà·à¶±à·”මකින් තොරව ඇමතුම් ලොග දත්ත අනිෂ්ට යෙදුම් බෙද෠ගà·à¶±à·“ම à¶šà·… à·„à·à¶š."</string>
+ <string name="permdesc_readCallLog" product="default" msgid="5777725796813217244">"à¶½à·à¶¶à·™à¶± සහ පිටවන ඇමතුම් à¶´à·’à·…à·’à¶¶à¶³ දත්ත ඇතුළත්ව ඔබගේ දුරකථනයේ ඇමතුම් ලොග් කියවීමට යෙදුමට අවසර දෙන්න. මෙම අවසරය ඔබගේ ඇමතුම් ලොග් දත්ත උපස්ථ කිරීමට යෙදුමට ඉඩදෙන à¶…à¶­à¶» ඔබගේ අනුදà·à¶±à·”මකින් තොරව අනිෂ්ට යෙදුම් විසින් ඇමතුම් ලොග් දත්ත බෙදà·à¶œà·à¶±à·“ම à¶šà·… à·„à·à¶š."</string>
+ <string name="permlab_writeCallLog" msgid="8552045664743499354">"ඇමතුම් ලොගය ලිවීම"</string>
+ <string name="permdesc_writeCallLog" product="tablet" msgid="6661806062274119245">"à¶½à·à¶¶à·™à¶± ඇමතුම් සහ පිටවන ඇමතුම් දත්ත ඇතුළත්ව ඔබගේ à¶§à·à¶¶à·Šà¶½à¶§à¶ºà·š ඇමතුම් ලොගය වෙනස් කිරීමට යෙදුමට අවසර දෙන්න. ඔබගේ ඇමතුම් ලොගය මà·à¶šà·“මට හ෠වෙනස් කිරීමට අනිෂ්ට යෙදුම් මෙය à¶·à·à·€à·’ත෠කෙරේ."</string>
+ <string name="permdesc_writeCallLog" product="default" msgid="683941736352787842">"à¶´à·à¶¸à·’ණෙන සහ පිටවෙන ඇමතුම් දත්ත ඇතුළුව ඔබගේ දුරකථනයේ ඇමතුම් ලොගය වෙනස් කිරීමට යෙදුමට අවසර දෙන්න. ඔබගේ ඇමතුම් ලොගය මà·à¶šà·“මට හ෠වෙනස් කිරීමට අනිෂ්ට යෙදුම් මෙය à¶·à·à·€à·’à¶­ à¶šà¶½ à·„à·à¶š."</string>
+ <string name="permlab_readProfile" msgid="4701889852612716678">"ඔබගේ සම්බන්ධත෠පත කියවන්න"</string>
+ <string name="permdesc_readProfile" product="default" msgid="5462475151849888848">"ඔබගේ නම සම්බන්ධත෠තොරතුරු ආදී ඔබගේ à¶‹à¶´à·à¶‚ගයේ ගබඩ෠වී ඇති පුද්ගලික à¶´à·à¶­à·’à¶šà¶© තොරතුරු කියවීමට යෙදුමට අවසර දෙන්න. මෙහි තේරුම යෙදුමට ඔබව හඳුන෠ගà·à¶±à·“මට à·„à·à¶šà·’ වන à¶¶à·€ සහ ඔබගේ පුද්ගලික තොරතුරු අනෙක් අයට යà·à·€à·“මට ද à·„à·à¶šà·’ වීමයි."</string>
+ <string name="permlab_writeProfile" msgid="907793628777397643">"ඔබගේ සම්බන්ධත෠පත වෙනස් කිරීම"</string>
+ <string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"ඔබගේ නම සහ සම්බන්ධත෠තොරතුරු à·€à·à¶±à·’ ඔබගේ à¶‹à¶´à·à¶‚ගයේ ආචයනය කරන ලද පුද්ගලික à¶´à·à¶­à·’à¶šà¶© තොරතුරු වෙනස් කිරීමට à·„à· à¶‘à¶šà¶­à·” කිරීමට යෙදුමට අවසර දෙන්න. මෙමගින් යෙදුමට ඔබව හඳුන෠ගත à·„à·à¶šà·’ à¶…à¶­à¶» අනෙක් අයට ඔබගේ à¶´à·à¶­à·’à¶šà¶© තොරතුරු යà·à·€à·’ය à·„à·à¶šà·’ à¶¶à·€ කියවෙයි."</string>
+ <string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"ඔබගේ සමà·à¶¢ à¶´à·Šâ€à¶»à·€à·à·„ය කියවන්න"</string>
+ <string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"ඔබගේ සහ ඔබගේ යහළුවන්ගේ සමà·à¶¢ යà·à·€à¶­à·Šà¶šà·à¶½à·“නයන් වෙත පිවිසීමට හ෠සමමුහුර්ත කිරීමට යෙදුමට අවසර දෙන්න. තොරතුරු බෙද෠ගà·à¶±à·“මේ දී à·ƒà·à¶½à¶šà·’ලිමත් වන්න -- විà·à·Šà·€à·à·ƒà¶ºà¶šà·’න් තොරව සමà·à¶¢ à¶¢à·à¶½à·€à¶½ ඔබගේ සහ ඔබගේ යහළුවන් à¶…à¶­à¶» සන්නිවේදන කියවීමට මෙමගින් යෙදුමට අවසර දෙයි. සටහන: සියලු සමà·à¶¢ à¶¢à·à¶½à·€à¶½ මෙම අවසරය à¶¶à¶½ නොකරයි."</string>
+ <string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"ඔබගේ සමà·à¶¢ à¶´à·Šâ€à¶»à·€à·à·„ය වෙත ලිවීම"</string>
+ <string name="permdesc_writeSocialStream" product="default" msgid="3086557552204114849">"ඔබගේ යහළුවන්ගේ සමà·à¶¢ යà·à·€à¶­à·Šà¶šà·à¶½à·“නයන් පෙන්වීමට යෙදුමට අවසර දෙන්න. තොරතුරු බෙද෠ගà·à¶±à·“මේදී à·ƒà·à¶½à¶šà·’ලිමත් වන්න -- යහළුවෙක්ගෙන් à¶´à·à¶¸à·’ණෙන ලෙස පණිවිඩ නිපදවීමට මෙමඟින් යෙදුමට අවසර දෙන්න. සටහන : සියලු සමà·à¶¢ à¶¢à·à¶½ සඳහ෠මෙම අවසරය à¶¶à¶½ නොදෙයි."</string>
+ <string name="permlab_readCalendar" msgid="5972727560257612398">"දින දර්à·à¶±à¶ºà·š සිදුවීම් සහ රහසිගත තොරතුරු කියවීම"</string>
+ <string name="permdesc_readCalendar" product="tablet" msgid="4216462049057658723">"ඔබගේ à¶§à·à¶¶à·Šà¶½à¶§à¶º තුල ගබඩ෠කර ඇති මිතුරන්ගේ සහ à¶‘à¶šà·Šà·€ à¶šà·Šâ€à¶»à·’යà·à¶šà¶»à¶±à·Šà¶±à¶±à·Šà¶œà·š ද ඇතුළුව සියලුම දින දර්à·à¶± සිද්ධි කියවීමට යෙදුමට අවසර දෙන්න. මෙය රහස්â€à¶ºà¶·à·à·€à¶º හ෠සංවේදීතà·à·€à¶º නොසලක෠ඔබගේ දින දර්à·à¶± දත්ත බෙද෠ගà·à¶±à·“මට හ෠සුරà·à¶šà·“මට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permdesc_readCalendar" product="default" msgid="7434548682470851583">"යහළුවන් සහ සමකà·à¶½à·’නයන් ඇතුලත් ඔබගේ දුරකථනයේ ආචයනය කරන ලද සියලු දින දර්à·à¶± සිදුවීම් කියවීමට යෙදුමට අවසර දෙන්න. විà·à·Šà·€à·à·ƒà¶ºà¶šà·’න් හ෠සංවේදීතà·à·€à¶šà·’න් තොරව ඔබගේ දින දර්à·à¶± දත්ත බෙද෠ගà·à¶±à·“මට හ෠උපස්ථ කිරීමට මෙමගින් යෙදුමට අවසර දෙයි."</string>
+ <string name="permlab_writeCalendar" msgid="8438874755193825647">"දින දර්à·à¶± සිද්ධි à¶‘à¶šà¶­à·” කිරීම හ෠වෙනස් කිරීමක් සිදුකර හිමිකරුගේ දà·à¶±à·“මකින් තොරව අමුත්තන්ට à¶Š-à¶­à·à¶´à·‘ලක් යවීම"</string>
+ <string name="permdesc_writeCalendar" product="tablet" msgid="6679035520113668528">"යහළුවන් à·„à· à¶‘à¶šà¶§-à·€à·à¶©à¶šà¶»à¶±à·Šà¶±à¶±à·Š ඇතුළත්ව ඔබට à¶§à·à¶¶à·Šà¶½à¶§à¶ºà·š වෙනස් à¶šà·… à·„à·à¶šà·’ සිද්ධි à¶‘à¶šà¶­à·” කිරීමට, ඉවත් කිරීමට, වෙනස් කිරීමට යෙදුමට අවසර දෙන්න. මෙමඟින් දින දර්à·à¶± හිමිකරුවන්ගෙන් පණිවිඩ යවන පරිදි මෙන් මවà·à¶´à·‘මට හ෠හිමිකරුගේ අනුදà·à¶±à·”මකින් තොරව සිද්ධි වෙනස් කිරීමට යෙදුමට අවසර à¶½à·à¶¶à·š."</string>
+ <string name="permdesc_writeCalendar" product="default" msgid="2324469496327249376">"ඔබගේ යහළුවන් හ෠සමකà·à¶½à·“නයන් ඇතුළත් ඔබගේ දුරකථනයේ ඔබට වෙනස් à¶šà·… à·„à·à¶šà·’ සිදු වීම් à¶‘à¶šà¶­à·” කිරීමට, ඉවත් කිරීමට, වෙනස් කිරීමට යෙදුමට අවසර දෙන්න. මෙමගින් දින දර්à·à¶± හිමිකරුවන්ගෙන් à¶´à·à¶¸à·’ණෙන සේ පෙනෙන පණිවිඩ යà·à·€à·“මට හ෠හිමිකරුගේ දà·à¶±à·”මකින් තොරව සිදුවීම් වෙනස් කිරීමට යෙදුමට අවසර දෙයි."</string>
+ <string name="permlab_accessMockLocation" msgid="8688334974036823330">"පරීක්ෂණ සඳහ෠ආදර්෠ස්ථà·à¶± මූලà·à·à·Šâ€à¶»"</string>
+ <string name="permdesc_accessMockLocation" msgid="5808711039482051824">"පරීක්ෂණයට ව්â€à¶ºà·à¶¢ ස්ථà·à¶± මූලà·à·à·Šâ€à¶» à·ƒà·à¶¯à¶±à·Šà¶± හ෠නව ස්ථà·à¶± à·ƒà·à¶´à¶ºà·”ම්කරුවෙකු ස්ථà·à¶´à¶±à¶º කරන්න. GPS හ෠ස්ථà·à¶± à·ƒà·à¶´à¶ºà·”ම්කරුවන් ආදී වෙනත් ස්ථà·à¶± මූලà·à·à·Šâ€à¶» විසින් ලබ෠දෙන ස්ථà·à¶±à¶º සහ/හ෠තත්වය à¶´à·Šâ€à¶»à¶­à·’ස්ථà·à¶´à¶±à¶º කිරීමට යෙදුමට මෙය අවසර දෙයි."</string>
+ <string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"අමතර ස්ථà·à¶± à·ƒà·à¶´à¶ºà·”ම්කරු විධà·à¶± වෙත à¶´à·Šâ€à¶»à·€à·šà· වීම"</string>
+ <string name="permdesc_accessLocationExtraCommands" msgid="5945166642335800763">"අමතර ස්ථà·à¶± à·ƒà·à¶´à¶ºà·”ම්කරු විධà·à¶± වෙත පිවිසීමට යෙදුමට අවසර දෙන්න. GPS හ෠වෙනත් ස්ථà·à¶± මූලà·à·à·Šâ€à¶» à¶šà·Šâ€à¶»à·’යà·à·€à¶½à·’ වෙත à¶¶à·à¶°à· කිරීමට මෙය අවසර දෙයි."</string>
+ <string name="permlab_installLocationProvider" msgid="6578101199825193873">"ස්ථà·à¶± à·ƒà·à¶´à¶ºà·”ම්කරුවෙකු ස්ථà·à¶´à¶±à¶ºà¶§ අවසරය දෙන්න"</string>
+ <string name="permdesc_installLocationProvider" msgid="9066146120470591509">"පරීක්ෂණයට ව්â€à¶ºà·à¶¢ ස්ථà·à¶± මූලà·à·à·Šâ€à¶» à·ƒà·à¶¯à¶±à·Šà¶± හ෠නව ස්ථà·à¶± à·ƒà·à¶´à¶ºà·”ම්කරුවෙකු ස්ථà·à¶´à¶±à¶º කරන්න. GPS හ෠ස්ථà·à¶± à·ƒà·à¶´à¶ºà·”ම්කරුවන් ආදී වෙනත් ස්ථà·à¶± මූලà·à·à·Šâ€à¶» විසින් ලබ෠දෙන ස්ථà·à¶±à¶º සහ/හ෠තත්ත්වය à¶´à·Šâ€à¶»à¶­à·’ස්ථà·à¶´à¶±à¶º කිරීමට යෙදුමට මෙය අවසර දෙයි."</string>
+ <string name="permlab_accessFineLocation" msgid="1191898061965273372">"නිවà·à¶»à¶¯à·’ ස්ථà·à¶±à¶º (GPS සහ à¶¢à·à¶½à¶º පදනම් කරගත්)"</string>
+ <string name="permdesc_accessFineLocation" msgid="5295047563564981250">"à¶œà·à¶½à·“ය ස්ථà·à¶±à·“ය පද්ධතිය (GPS) හ෠සෙල් කුළුණු සහ Wi-Fi à·€à·à¶±à·’ à¶¢à·à¶½ ස්ථà·à¶±à·“ය à¶´à·Šâ€à¶»à¶·à·€ à¶·à·à·€à·’තයෙන් ඔබගේ නිවà·à¶»à¶¯à·’ ස්ථà·à¶±à¶º ලබà·à¶œà·à¶±à·“මට යෙදුම අවසර දෙන්න. යෙදුම් වලට ස්ථà·à¶±à·“ය සේව෠භà·à·€à·’ත෠කිරීමට ඒව෠සක්â€à¶»à·’ය විය යුතු වේ. ඔබව සොය෠ගà·à¶±à·“මට යෙදුම් මෙය à¶·à·à·€à·’ත෠කරන à¶…à¶­à¶» අමතර à¶¶à·à¶§à¶»à·’ බලයක්ද පරිභà·à¶¢à¶±à¶º කරයි."</string>
+ <string name="permlab_accessCoarseLocation" msgid="4887895362354239628">"ආසන්නතම ස්ථà·à¶±à¶º (à¶¢à·à¶½à¶º-à¶´à·à¶¯à¶š වූ)"</string>
+ <string name="permdesc_accessCoarseLocation" msgid="2538200184373302295">"ඔබගේ දළ ස්ථà·à¶±à¶º ලබà·à¶œà·à¶±à·“මට යෙදුමට අවසර දෙන්න. සන්නේවේදන කුළුණු සහ Wi-Fi ආදී à¶¢à·à¶½ ස්ථà·à¶± මූලà·à·à·Šâ€à¶» à¶·à·à·€à·’à¶­ කරන ස්ථà·à¶± සේව෠විසින් මෙම ස්ථà·à¶±à¶º ව්â€à¶ºà·”ත්පන්න à¶šà¶» ඇත. යෙදුමට à¶·à·à·€à·’තය සඳහ෠මෙම ස්ථà·à¶± සේව෠සක්â€à¶»à·’ය à¶šà·… යුතු à¶…à¶­à¶» ඔබගේ à¶‹à¶´à·à¶‚ගය සඳහ෠පà·à·€à¶­à·’ය යුතුය. ඔබ සිටින à¶­à·à¶± දළව හඳුන෠ගà·à¶±à·“මට යෙදුම් වලට මෙය à¶·à·à·€à·’à¶­ à¶šà·… à·„à·à¶šà·’ය."</string>
+ <string name="permlab_accessSurfaceFlinger" msgid="2363969641792388947">"SurfaceFlinger වෙත à¶´à·Šâ€à¶»à·€à·šà·à¶º"</string>
+ <string name="permdesc_accessSurfaceFlinger" msgid="1041619516733293551">"SurfaceFlinger à¶´à·„à¶½ මට්ටමේ විà·à·šà·‚à·à¶‚à¶œ à¶·à·à·€à·’තයට යෙදුමට අවසර දෙයි."</string>
+ <string name="permlab_readFrameBuffer" msgid="6690504248178498136">"à¶»à·à¶¸à·” අන්තරà·à¶ à¶º කියවීම"</string>
+ <string name="permdesc_readFrameBuffer" msgid="4937405521809454680">"à¶»à·à¶¸à·” අන්තරà·à¶ à¶ºà¶±à¶ºà·™à¶±à·Š අන්තර්ගතයන් කියවීමට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_accessInputFlinger" msgid="5348635270689553857">"InputFlinger වෙත පිවිසෙන්න"</string>
+ <string name="permdesc_accessInputFlinger" msgid="2104864941201226616">"InputFlinger à¶´à·„à¶½ මට්ටමේ විà·à·šà·‚à·à¶‚à¶œ à¶·à·à·€à·’තයට යෙදුමට අවසර දෙයි."</string>
+ <string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"Wifi සංදර්à·à¶š වින්â€à¶ºà·à·ƒ කරන්න"</string>
+ <string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"වින්â€à¶ºà·à·ƒ කිරීමට සහ Wifi සංදර්à·à¶š වෙත සම්බන්ධ වීමට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_controlWifiDisplay" msgid="393641276723695496">"Wifi සංදර්à·à¶š à¶´à·à¶½à¶±à¶º"</string>
+ <string name="permdesc_controlWifiDisplay" msgid="4543912292681826986">"Wifi සංදර්à·à¶šà¶ºà·š à¶´à·„à·… මට්ටමේ විà·à·šà·‚à·à¶‚à¶œ à¶´à·à¶½à¶±à¶ºà¶§ යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_captureAudioOutput" msgid="6857134498402346708">"à·à¶¶à·Šà¶¯ à¶´à·Šâ€à¶»à¶­à·’දà·à¶±à¶º ග්â€à¶»à·„ණය"</string>
+ <string name="permdesc_captureAudioOutput" msgid="6210597754212208853">"යෙදුමට à·à¶¶à·Šà¶¯ à¶´à·Šâ€à¶»à¶­à·’දà·à¶±à¶º ග්â€à¶»à·„ණය à¶šà¶» හරව෠යà·à·€à·“මට ඉඩ දේ."</string>
+ <string name="permlab_captureVideoOutput" msgid="2246828773589094023">"වීඩිය෠ප්â€à¶»à¶­à·’දà·à¶±à¶º"</string>
+ <string name="permdesc_captureVideoOutput" msgid="359481658034149860">"යෙදුමට වීඩිය෠ප්â€à¶»à¶­à·’දà·à¶±à¶º ග්â€à¶»à·„ණය à¶šà¶» හරව෠යà·à·€à·“මට ඉඩ දේ."</string>
+ <string name="permlab_captureSecureVideoOutput" msgid="7815398969303382016">"ආරක්â€à·‚à·’à¶­ වීඩිය෠ප්â€à¶»à¶­à·’දà·à¶±à¶º"</string>
+ <string name="permdesc_captureSecureVideoOutput" msgid="2779793064709350289">"යෙදුමට ආරක්â€à·‚à·’à¶­ වීඩිය෠ප්â€à¶»à¶­à·’දà·à¶±à¶º ග්â€à¶»à·„ණය à¶šà¶» හරව෠යà·à·€à·“මට ඉඩ දේ."</string>
+ <string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"ඔබගේ à·à·Šâ€à¶»à·€à·Šâ€à¶º à·ƒà·à¶šà·ƒà·“ම් වෙනස් කරන්න"</string>
+ <string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"à·à¶¶à·Šà¶¯à¶º ආදී à¶œà·à¶½à·“ය à·à¶¶à·Šà¶¯ à·ƒà·à¶šà·ƒà·“ම් වෙනස් කිරීමට සහ à¶´à·Šâ€à¶»à¶­à·’දà·à¶±à¶º සඳහ෠භà·à·€à·’à¶­ කරන්නේ කුමන à¶±à·à¶¯à¶šà¶º දà·à¶ºà·’ තේරීමට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_recordAudio" msgid="3876049771427466323">"à·à¶¶à·Šà¶¯ පටිගත කරන්න"</string>
+ <string name="permdesc_recordAudio" msgid="4906839301087980680">"මයික්â€à¶»à·œà·†à·à¶±à¶º මඟින් à·à¶¶à·Šà¶¯ පටිගත කිරීමට යෙදුමට අවසර දෙන්න. මෙම අවසරය මඟින් යෙදුමට ඕනෑම වේලà·à·€à¶š ඔබගේ අනුදà·à¶±à·”මකින් තොරව à·à¶¶à·Šà¶¯ පටිගත කිරීමට ඉඩ ලබ෠දේ."</string>
+ <string name="permlab_camera" msgid="3616391919559751192">"පින්තූර සහ වීඩිය෠ගන්න"</string>
+ <string name="permdesc_camera" msgid="8497216524735535009">"à¶šà·à¶¸à¶»à·à·€à·™à¶±à·Š පින්තූර à¶œà·à¶±à·“මට සහ වීඩිය෠කිරීමට යෙදුමට අවසර දෙන්න. මෙම අවසරය මඟින් ඔබගේ අනුදà·à¶±à·”මකින් තොරව ඕනෑම වේලà·à·€à¶šà¶¯à·“ à¶šà·à¶¸à¶»à·à·€ à¶·à·à·€à·’ත෠කිරීමට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_cameraDisableTransmitLed" msgid="2651072630501126222">"à¶šà·à¶¸à¶»à·à·€ à¶·à·à·€à·’තයේදී LED දර්à·à¶š සම්ප්â€à¶»à·šà·‚ණය à¶…à¶¶à¶½ කරන්න"</string>
+ <string name="permdesc_cameraDisableTransmitLed" msgid="4764585465480295341">"à¶šà·à¶¸à¶»à· à¶·à·à·€à·’තය à¶´à·’à·…à·’à¶¶à¶³ LED දර්à·à¶šà¶º à¶…à¶šà·Šâ€à¶»à·’ය කිරීමට, කලින් පිහිටුව෠ඇති පද්ධති යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"à¶§à·à¶¶à·Šà¶½à¶§à¶º ස්ථිරවම à¶…à¶¶à¶½ කිරීම"</string>
+ <string name="permlab_brick" product="default" msgid="8337817093326370537">"දුරකථනය ස්ථිරව අබල කිරීම"</string>
+ <string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"මුළු à¶§à·à¶¶à·Šà¶½à¶§à¶ºà¶¸ ස්ථිරවම à¶…à¶šà·Šâ€à¶»à·’ය කිරීමට යෙදුමට අවසර දෙන්න. මෙය ඉත෠භයà·à¶±à¶šà¶ºà·’."</string>
+ <string name="permdesc_brick" product="default" msgid="5788903297627283099">"මුළු දුරකථනයම ස්ථිරවම à¶…à¶šà·Šâ€à¶»à·’ය කිරීමට යෙදුමට අවසර දෙන්න. මෙය ඉත෠භයà·à¶±à¶šà¶ºà·’."</string>
+ <string name="permlab_reboot" product="tablet" msgid="3436634972561795002">"à¶§à·à¶¶à·Šà¶½à¶§à·Š à¶±à·à·€à¶­ à¶´à¶« à¶œà·à¶±à·Šà·€à·“මට à¶¶à¶½ කරන්න"</string>
+ <string name="permlab_reboot" product="default" msgid="2898560872462638242">"දුරකථන à¶±à·à·€à¶­ à¶´à¶« à¶œà·à¶±à·Šà·€à·“මට à¶¶à¶½ කරන්න"</string>
+ <string name="permdesc_reboot" product="tablet" msgid="8172056180063700741">"à¶§à·à¶¶à·Šà¶½à¶§à¶º à¶±à·à·€à¶­ à¶¶à¶½ à¶œà·à¶±à·Šà·€à·“මට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permdesc_reboot" product="default" msgid="5326008124289989969">"à¶§à·à¶¶à·Šà¶½à¶§à¶º à¶±à·à·€à¶­ ඇරඹීමට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_mount_unmount_filesystems" product="nosdcard" msgid="2927361537942591841">"USB ආචයනය ගොනු පද්ධතිය à¶´à·Šâ€à¶»à·€à·šà· කිරීම"</string>
+ <string name="permlab_mount_unmount_filesystems" product="default" msgid="4402305049890953810">"SD à¶´à¶­à·Š ගොනු පද්ධතිය à¶´à·Šâ€à¶»à·€à·šà· කිරීම"</string>
+ <string name="permdesc_mount_unmount_filesystems" msgid="1829290701658992347">"ඉවත් à¶šà·… à·„à·à¶šà·’ ආචයනය සඳහ෠ගොනු පද්ධති ඈඳීමට සහ à¶œà·à¶½à·€à·“මට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_mount_format_filesystems" product="nosdcard" msgid="6227819582624904972">"USB ආචයනය මකන්න"</string>
+ <string name="permlab_mount_format_filesystems" product="default" msgid="262582698639274056">"SD පත මකන්න"</string>
+ <string name="permdesc_mount_format_filesystems" msgid="8784268246779198627">"ඉවත් à¶šà·… à·„à·à¶šà·’ ආචයන à·†à·à¶¸à·à¶§à·Š කිරීමට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_asec_access" msgid="3411338632002193846">"à¶…à¶·à·Šâ€à¶ºà¶±à·Šà¶­à¶» ආචයනය à¶´à·’à·…à·’à¶¶à¶³ තොරතුරු ලබ෠ගà·à¶±à·“ම"</string>
+ <string name="permdesc_asec_access" msgid="3094563844593878548">"à¶…à¶·à·Šâ€à¶ºà¶±à·Šà¶­à¶» ආචයනයේ තොරතුරු ලබà·à¶œà·à¶±à·“මට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_asec_create" msgid="6414757234789336327">"à¶…à¶·à·Šâ€à¶ºà¶±à·Šà¶­à¶» ආචයනය නිර්මà·à¶«à¶º"</string>
+ <string name="permdesc_asec_create" msgid="4558869273585856876">"à¶…à¶·à·Šâ€à¶ºà¶±à·Šà¶­à¶» ආචයනය à·ƒà·à¶¯à·“මට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_asec_destroy" msgid="526928328301618022">"à¶…à¶·à·Šâ€à¶ºà¶±à·Šà¶­à¶» ආචයනය විනà·à· කිරීම"</string>
+ <string name="permdesc_asec_destroy" msgid="7218749286145526537">"à¶…à¶·à·Šâ€à¶ºà¶±à·Šà¶­à¶» ආචයනය විනà·à· කිරීමට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_asec_mount_unmount" msgid="8877998101944999386">"à¶…à¶·à·Šâ€à¶ºà¶±à·Šà¶­à¶» ආචයනය නංවීම/à¶œà·à¶½à·€à·“ම"</string>
+ <string name="permdesc_asec_mount_unmount" msgid="3451360114902490929">"à¶…à¶·à·Šâ€à¶ºà¶±à·Šà¶­à¶» ආචයනය සවි කිරීමට/à¶œà·à¶½à·€à·“මට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_asec_rename" msgid="7496633954080472417">"à¶…à¶·à·Šâ€à¶ºà¶±à·Šà¶­à¶» ආචයනය à¶±à·à·€à¶­ නම් කරන්න"</string>
+ <string name="permdesc_asec_rename" msgid="1794757588472127675">"à¶…à¶·à·Šâ€à¶ºà¶±à·Šà¶­à¶» ආචයනය à¶±à·à·€à¶­ නම් කිරීමට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_vibrate" msgid="7696427026057705834">"කම්පනය à¶´à·à¶½à¶±à¶º කිරීම"</string>
+ <string name="permdesc_vibrate" msgid="6284989245902300945">"කම්පකය à¶´à·à¶½à¶±à¶ºà¶§ යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_flashlight" msgid="2155920810121984215">"à·ƒà·à¶«à·™à·…à·’ ආලà·à¶šà¶º à¶´à·à¶½à¶±à¶º කරන්න"</string>
+ <string name="permdesc_flashlight" msgid="6522284794568368310">"à·ƒà·à¶«à·™à·…ිය à¶´à·à¶½à¶±à¶ºà¶§ යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_manageUsb" msgid="1113453430645402723">"USB à¶‹à¶´à·à¶‚à¶œ සඳහ෠කà·à¶¸à·à¶­à·Šà¶­ සහ අවසර කළමනà·à¶šà¶»à¶«à¶º කිරීම"</string>
+ <string name="permdesc_manageUsb" msgid="7776155430218239833">"USB à¶‹à¶´à·à¶‚à¶œ සඳහ෠අභිරුචි සහ අවසර කළමනà·à¶šà¶»à¶«à¶ºà¶§ යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_accessMtp" msgid="4953468676795917042">"MTP à¶´à·Šâ€à¶»à·œà¶§à·œà¶šà·à¶½à¶º à¶šà·Šâ€à¶»à·’යà·à¶­à·Šà¶¸à¶š කිරීම"</string>
+ <string name="permdesc_accessMtp" msgid="6532961200486791570">"MTP USB à¶´à·Šâ€à¶»à·œà¶§à·à¶šà·à¶½à¶º à¶šà·Šâ€à¶»à·’යà·à¶­à·Šà¶¸à¶š කිරීමට කර්නල MTP à¶°à·à·€à¶šà¶ºà¶§ à¶´à·Šâ€à¶»à·€à·šà· වීමට අවසර දෙන්න."</string>
+ <string name="permlab_hardware_test" msgid="4148290860400659146">"දෘඩà·à¶‚à¶œ පරීක්ෂණය කරන්න"</string>
+ <string name="permdesc_hardware_test" msgid="6597964191208016605">"දෘඩà·à¶‚à¶œ පරීක්ෂ෠කිරීමේ අරමුණ සඳහ෠යෙදුමට විවිධ පර්යන්ත à¶´à·à¶½à¶±à¶º කිරීමට ඉඩ දෙන්න."</string>
+ <string name="permlab_callPhone" msgid="3925836347681847954">"දුරකථන à¶…à¶‚à¶š වෙත à¶à¶¢à·”වම අමතන්න"</string>
+ <string name="permdesc_callPhone" msgid="3740797576113760827">"ඔබගේ මà·à¶¯à·’à·„à¶­à·Š වීමක් නොමà·à¶­à·’à·€ දුරකථන à¶…à¶‚à¶š ඇමතීමට යෙදුමට අවසර දෙන්න. මෙහි à¶´à·Šâ€à¶»à¶­à·’එලය වන්නේ අනපේක්ෂිත අයකිරීම් හ෠ඇමතුම් ඇතිවීමයි. මෙයන් හදිසි à¶…à¶‚à¶š වලට ඇමතුම් à¶œà·à¶±à·“මට යෙදුමට අවසර නොදෙන බවට සටහන් කරගන්න. ඔබගේ අනුදà·à¶±à·”මක් නොමà·à¶­à·’à·€ ඇමතුම් à¶œà·à¶±à·“මෙන් අනිෂ්ට යෙදුම් ඔබගේ මුදල් නිකරුණේ à·€à·à¶º කරයි."</string>
+ <string name="permlab_callPrivileged" msgid="4198349211108497879">"ඕනෑම දුරකථන අංකයකට à¶à¶¢à·”වම අමතන්න"</string>
+ <string name="permdesc_callPrivileged" msgid="1689024901509996810">"ඔබගේ මà·à¶¯à·’හත්වීමකින් තොරව හදිසි à¶…à¶‚à¶š ඇතුළත්ව ඕනෑම දුරකථන අංකයකට ඇමතීමට යෙදුමට අවසර දෙන්න. හදිසි සේව෠වෙත අනවà·à·Šâ€à¶º සහ නීතිමය නොවන ඇමතුම à¶½à·à¶¶à·“මට අනිෂ්ට යෙදුම සිදු à¶šà·… à·„à·à¶š."</string>
+ <string name="permlab_performCdmaProvisioning" product="tablet" msgid="4842576994144604821">"CDMA à¶§à·à¶¶à·Šà¶½à¶§ පිහිටුම සෘජුව ඇරඹීම"</string>
+ <string name="permlab_performCdmaProvisioning" product="default" msgid="5604848095315421425">"CDMA දුරකථන පිහිටුම සෘජුව ඇරඹීම"</string>
+ <string name="permdesc_performCdmaProvisioning" msgid="1994193538802314186">"යෙදුමට CDMA à¶´à·Šâ€à¶»à¶­à·’à¶´à·à¶¯à¶± ආරම්භ කිරීමට ඉඩදෙන්න. අනිෂ්ට යෙදුම් අනවà·à·Šâ€à¶º ලෙස CDMA à¶´à·Šâ€à¶»à¶­à·’à¶´à·à¶¯à¶± ආරම්භ à¶šà·… à·„à·à¶š."</string>
+ <string name="permlab_locationUpdates" msgid="7785408253364335740">"ස්ථà·à¶± යà·à·€à¶­à·Šà¶šà·à¶½à·“à¶± දà·à¶±à·”ම්දීම් à¶´à·à¶½à¶±à¶º කරන්න"</string>
+ <string name="permdesc_locationUpdates" msgid="1120741557891438876">"ස්ථà·à¶±à·“ය යà·à·€à¶­à·Šà¶šà·à¶½à·’à¶± දà·à¶±à·”ම්දීම් රේඩියà·à·€à·™à¶±à·Š සබල/à¶…à¶¶à¶½ කිරීමට යෙදුමට අවසර දෙන්න. à·ƒà·à¶¸à·à¶±à·Šâ€à¶º යෙදුම්වල à¶·à·à·€à·’තය සඳහ෠නොවේ."</string>
+ <string name="permlab_checkinProperties" msgid="7855259461268734914">"පිරික්සුම් ගුණà·à¶‚à¶œ වෙත à¶´à·Šâ€à¶»à·€à·šà·à¶º"</string>
+ <string name="permdesc_checkinProperties" msgid="4024526968630194128">"පිරික්සුම් සේවà·à·€ මගින් à¶‹à¶­à·Šà·à·Šâ€à¶»à·šà¶«à·’ à¶šà·… ගුණà·à¶‚à¶œ වෙත කියවීම්/ලිවීම් පිවිසුම සඳහ෠යෙදුමට අවසර දෙන්න. à·ƒà·à¶¸à·à¶±à·Šâ€à¶º යෙදුම් වල à¶·à·à·€à·’තයට නොවේ."</string>
+ <string name="permlab_bindGadget" msgid="776905339015863471">"විජට් à¶­à·à¶»à¶±à·Šà¶±"</string>
+ <string name="permdesc_bindGadget" msgid="8261326938599049290">"කුමන විජටය කුමන යෙදුමෙන් à¶·à·à·€à·’à¶­à· à¶šà¶½ à·„à·à¶šà·’ද යන්න පද්ධතියට à¶´à·à·€à·ƒà·“මට යෙදුමට අවසර දෙන්න. මෙම අවසරය ඇති යෙදුමකට අනෙක් යෙදුම්වලට පුද්ගලික දත්ත වලට à¶´à·Šâ€à¶»à·€à·šà·à¶º ලබ෠දිය à·„à·à¶š. à·ƒà·à¶¸à·à¶±à·Šâ€à¶º යෙදුම් වල à¶·à·à·€à·’තයට නොවේ."</string>
+ <string name="permlab_modifyPhoneState" msgid="8423923777659292228">"දුරකථනයේ තත්වය වෙනස් කිරීම"</string>
+ <string name="permdesc_modifyPhoneState" msgid="1029877529007686732">"à¶‹à¶´à·à¶‚ගයේ දුරකථන විà·à·šà·‚à·à¶‚à¶œ à¶´à·à¶½à¶±à¶ºà¶§ යෙදුමට අවසර දෙන්න. මෙම අවසරය ඇති යෙදුමට ඔබට නිවේදනයෙන් තොරව à¶¢à·à¶½ මà·à¶»à·” කිරීම, දුරකථන රේඩියà·à·€ සක්â€à¶»à·’ය සහ à¶…à¶šà·Šâ€à¶»à·’ය කිරීම à¶šà·… à·„à·à¶š."</string>
+ <string name="permlab_readPhoneState" msgid="9178228524507610486">"දුරකථනයේ තත්වය සහ අනන්â€à¶ºà¶­à·à·€à¶º කියවීම"</string>
+ <string name="permdesc_readPhoneState" msgid="1639212771826125528">"à¶‹à¶´à·à¶‚ගයේ දුරකථන විà·à·šà·‚à·à¶‚à¶œ වෙත පිවිසීමට යෙදුමට අවසර දෙන්න. ඇමතුම සක්â€à¶»à·’ය වුවත් සහ ඇමතුමකින් දුරස්ථ අංකය සම්බන්ධ වුවත් දුරකථන අංකය සහ à¶‹à¶´à·à¶‚à¶œ ID හඳුන෠ගà·à¶±à·“මට මෙම අවසරය යෙදුමට අවසර දෙයි."</string>
+ <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"à¶§à·à¶¶à·Šà¶½à¶§à¶º නින්දෙන් à·€à·à·…ක්වීම"</string>
+ <string name="permlab_wakeLock" product="default" msgid="573480187941496130">"දුරකථනය නින්දට යà·à¶¸à·™à¶±à·Š වළකන්න"</string>
+ <string name="permdesc_wakeLock" product="tablet" msgid="7311319824400447868">"à¶§à·à¶¶à·Šà¶½à¶§à¶º නින්දට යà·à¶¸à·™à¶±à·Š à·€à·à¶½à·à¶šà·Šà·€à·“මට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permdesc_wakeLock" product="default" msgid="8559100677372928754">"දුරකථනය නින්දට යà·à¶¸à·™à¶±à·Š à·€à·à¶½à·à¶šà·Šà·€à·“මට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_devicePower" product="tablet" msgid="2787034722616350417">"à¶§à·à¶¶à·Šà¶½à¶§à¶º සක්â€à¶»à·’ය à·„à· à¶…à¶šà·Šâ€à¶»à·’ය කරන්න"</string>
+ <string name="permlab_devicePower" product="default" msgid="4928622470980943206">"දුරකථනය à¶¶à¶½ à¶œà·à¶±à·Šà·€à·“ම à·„à· à·€à·à·ƒà·“ම"</string>
+ <string name="permdesc_devicePower" product="tablet" msgid="6689862878984631831">"à¶§à·à¶¶à·Šà¶½à¶§à¶º සක්â€à¶»à·’ය à·„à· à¶…à¶šà·Šâ€à¶»à·’ය කිරීමට යෙදුමට අවසර දේ."</string>
+ <string name="permdesc_devicePower" product="default" msgid="6037057348463131032">"දුරකථනය සක්â€à¶»à·’ය සහ à¶…à¶šà·Šâ€à¶»à·’ය කිරීමට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_factoryTest" msgid="3715225492696416187">"කර්මà·à¶±à·Šà¶­à·à·à¶½à· පරීක්ෂණ ආකà·à¶»à¶º තුළ à¶°à·à·€à¶±à¶º කරන්න"</string>
+ <string name="permdesc_factoryTest" product="tablet" msgid="3952059318359653091">"à¶§à·à¶¶à·Šà¶½à¶§à¶ºà·š දෘඩà·à¶‚à¶œ වෙත සම්පූර්ණ පිවිසුම සඳහ෠අවසර දීමෙන් à¶´à·„à·… මට්ටමේ නිපà·à·€à·”ම්කරු පරීක්ෂණයක් ලෙස à¶°à·à·€à¶±à¶º කරන්න. නිපà·à·€à·”ම්කරු පරීක්ෂණ ආකà·à¶»à¶ºà·™à¶±à·Š à¶§à·à¶¶à·Šà¶½à¶§à¶ºà·š à¶°à·à·€à¶±à¶º වන විට පමණි."</string>
+ <string name="permdesc_factoryTest" product="default" msgid="8136644990319244802">"දුරකථනයේ දෘඩà·à¶‚à¶œ වෙත සම්පූර්ණ පිවිසුම සඳහ෠අවසර දීමෙන් à¶´à·„à·… මට්ටමේ නිපà·à·€à·”ම්කරු පරීක්ෂණයක් ලෙස à¶°à·à·€à¶±à¶º කරන්න. නිපà·à·€à·”ම්කරු පරීක්ෂණ ආකà·à¶»à¶ºà·™à¶±à·Š දුරකථනයේ à¶°à·à·€à¶±à¶º වන විට පමණි."</string>
+ <string name="permlab_setWallpaper" msgid="6627192333373465143">"බිතුපත à·ƒà·à¶šà·ƒà·“ම"</string>
+ <string name="permdesc_setWallpaper" msgid="7373447920977624745">"පද්ධති බිතුපත à·ƒà·à¶šà·ƒà·“මට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_setWallpaperHints" msgid="3278608165977736538">"ඔබගේ බිතුපතේ à¶´à·Šâ€à¶»à¶¸à·à¶«à¶º à·ƒà·à¶šà·ƒà·“ම"</string>
+ <string name="permdesc_setWallpaperHints" msgid="8235784384223730091">"පද්ධති බිතුපතේ à¶´à·Šâ€à¶»à¶¸à·à¶« ඉඟි සකස් කිරීමට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_masterClear" msgid="2315750423139697397">"කර්මà·à¶±à·Šà¶­à·à·à¶½à· සුපුරුද්දට පද්ධතිය à¶±à·à·€à¶­ සකස් කිරීම"</string>
+ <string name="permdesc_masterClear" msgid="3665380492633910226">"සියලු දත්ත මà·à¶šà·“මෙන්, වින්â€à¶ºà·à·ƒ කිරීමෙන් සහ යෙදුම් ස්ථà·à¶´à¶±à¶ºà·™à¶±à·Š à¶‘à·„à·’ කර්මà·à¶±à·Šà¶­ à·à·à¶½à· à·ƒà·à¶šà·ƒà·“ම් වෙත පද්ධතිය à¶±à·à·€à¶­ à·ƒà·à¶šà·ƒà·“මට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_setTime" msgid="2021614829591775646">"වේලà·à·€ à·ƒà·à¶šà·ƒà·“ම"</string>
+ <string name="permdesc_setTime" product="tablet" msgid="1896341438151152881">"à¶§à·à¶¶à·Šà¶½à¶§ ඔරලà·à·ƒà·”වේ වේලà·à·€ වෙනස් කිරීමට යෙදුමට ඉඩ දෙන්න."</string>
+ <string name="permdesc_setTime" product="default" msgid="1855702730738020">"දුරකථන ඔරලà·à·ƒà·”වේ වේලà·à·€ වෙනස් කිරීමට යෙදුමකට ඉඩ දෙන්න."</string>
+ <string name="permlab_setTimeZone" msgid="2945079801013077340">"වේල෠කලà·à¶´à¶º à·ƒà·à¶šà·ƒà·“ම"</string>
+ <string name="permdesc_setTimeZone" product="tablet" msgid="1676983712315827645">"à¶§à·à¶¶à·Šà¶½à¶§à¶ºà·š à¶šà·à¶½ à¶šà¶½à·à¶´à¶º වෙනස් කිරීමට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permdesc_setTimeZone" product="default" msgid="4499943488436633398">"දුරකථනයේ වේල෠කලà·à¶´à¶º වෙනස් කිරීමට à¶‹à¶´à·à¶‚ගයට අවසර දෙන්න."</string>
+ <string name="permlab_accountManagerService" msgid="4829262349691386986">"AccountManagerService ලෙස පෙනී සිටින්න"</string>
+ <string name="permdesc_accountManagerService" msgid="1948455552333615954">"AccountAuthenticators වෙත ඇමතුම් à¶œà·à¶±à·“මට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_getAccounts" msgid="1086795467760122114">"à¶‹à¶´à·à¶‚ගයේ ඇති ගිණුම් සොයන්න"</string>
+ <string name="permdesc_getAccounts" product="tablet" msgid="2741496534769660027">"à¶§à·à¶¶à·Šà¶½à¶§à¶º විසින් දන්න෠ගිණුම් à¶½à·à¶ºà·’ස්තුවක් ලබà·à¶œà·à¶±à·“මට යෙදුමට අවසර දෙන්න. ඔබ ස්ථà·à¶´à¶±à¶º කොට ඇති යෙදුම් විසින් à·ƒà·à¶¯à· ඇති ගිණුම් මීට ඇතුළත් වේ."</string>
+ <string name="permdesc_getAccounts" product="default" msgid="3448316822451807382">"දුරකථනය විසින් දන්න෠ගිණුම් à¶½à·à¶ºà·’ස්තුවක් ලබà·à¶œà·à¶±à·“මට යෙදුමට අවසර දෙන්න. ඔබ ස්ථà·à¶´à¶±à¶º කොට ඇති යෙදුම් විසින් à·ƒà·à¶¯à· ඇති ගිණුම් මීට ඇතුළත් වේ."</string>
+ <string name="permlab_authenticateAccounts" msgid="5265908481172736933">"ගිණුම් à·ƒà·à¶¯à¶±à·Šà¶± සහ මුරපද සකසන්න"</string>
+ <string name="permdesc_authenticateAccounts" msgid="5472124296908977260">"ගිණුම් à·ƒà·à¶¯à·“මට සහ රහස් පද ලබà·à¶œà·à¶±à·“ම සහ à·ƒà·à¶šà·ƒà·“ම් කිරීම ඇතුළත්ව AccountManager ගේ ගිණුම් සත්â€à¶ºà·à¶´à¶± à·„à·à¶šà·’යà·à·€à¶±à·Š à¶·à·à·€à·’ත෠කිරීමට යෙදුමකට අවසර දෙන්න."</string>
+ <string name="permlab_manageAccounts" msgid="4983126304757177305">"ගිණුම් එකතු කරන්න හ෠ඉවත් කරන්න"</string>
+ <string name="permdesc_manageAccounts" msgid="8698295625488292506">"ගිණුම් à¶‘à¶šà¶­à·” කිරීම, සහ ඉවත් කිරීම සහ ඔවුන්ගේ මුරපද මà·à¶šà·“ම ආදී à¶šà·Šâ€à¶»à·’යà·à·€à¶½à·’ සිදු කිරීමට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_useCredentials" msgid="235481396163877642">"à¶‹à¶´à·à¶‚ගයේ ඇති ගිණුම් à¶·à·à·€à·’ත෠කිරීම"</string>
+ <string name="permdesc_useCredentials" msgid="7984227147403346422">"සත්â€à¶ºà·à¶´à¶± à¶§à·à¶šà¶± ඉල්ලීම සඳහ෠යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_accessNetworkState" msgid="4951027964348974773">"à¶¢à·à¶½ සම්බන්ධතà·à·€à¶ºà¶±à·Š à¶¶à·à¶½à·“ම"</string>
+ <string name="permdesc_accessNetworkState" msgid="8318964424675960975">"කුමන à¶¢à·à¶½ පවතින්නේ ද සහ සම්බන්ධිත ද ආදී à¶¢à·à¶½ සබඳත෠ගà·à¶± තොරතුරු à¶¶à·à¶½à·“මට යෙදුමට අවසර දෙයි."</string>
+ <string name="permlab_createNetworkSockets" msgid="8018758136404323658">"සම්පූර්ණ à¶¢à·à¶½ à¶´à·Šâ€à¶»à·€à·šà·à¶º"</string>
+ <string name="permdesc_createNetworkSockets" msgid="3403062187779724185">"උපකරණයට à¶¢à·à¶½ කෙවනියන් à·ƒà·à¶¯à·“මට සහ à¶¢à·à¶½ à¶´à·Šâ€à¶»à·œà¶§à·à¶šà·à¶½ අභිරුචි à¶·à·à·€à·’ත෠කිරීමට උපකරණයට ඉඩ දෙන්න. අන්තර්ජà·à¶½à¶ºà¶§ දත්ත යà·à·€à·“මට විධියන් à¶¶à·Šâ€à¶»à·€à·Šà·ƒà¶»à¶º සහ අනෙකුත් යෙදුම් සපයයි, එනිස෠මෙම අවසරය දත්ත අන්තර්ජà·à¶½à¶ºà¶§ යà·à·€à·“මට à¶…à·€à·à·Šâ€à¶º නොවේ."</string>
+ <string name="permlab_writeApnSettings" msgid="505660159675751896">"à¶¢à·à¶½à¶ºà·š à·ƒà·à¶šà·ƒà·“ම් සහ ගමනà·à¶œà¶¸à¶± වෙනස් කරන්න/අල්ල෠ගà·à¶±à·“ම"</string>
+ <string name="permdesc_writeApnSettings" msgid="5333798886412714193">"ඕනෑම APN à¶‘à¶šà¶š නියුතුව සහ තොට වෙනස් කිරීම à·€à·à¶±à·’ à¶¢à·à¶½ à·ƒà·à¶šà·ƒà·“ම් වෙනස් කිරීමට සහ සියලුම à¶¢à·à¶½ අතුරු ඇරීමට සහ à·ƒà·à¶¯à·’සි කිරීමට යෙදුමට අවසර දෙන්න. ඇතà·à¶¸à·Šà·€à·’à¶§ ඔබගේ අනුදà·à¶±à·”මකින් තොරව අනිෂ්ට à¶‹à¶´à·à¶‚à¶œ à¶¢à·à¶½ à¶´à·à¶šà·à¶§à·Šà¶§à·” අධීක්ෂණය,ආපසු දිà·à·à¶œà¶­ කිරීම හ෠වෙනස්කිරීම සිදු කිරීමට ඉඩ à¶­à·’à¶¶à·š."</string>
+ <string name="permlab_changeNetworkState" msgid="958884291454327309">"à¶¢à·à¶½ සම්බන්ධතà·à·€ වෙනස් කිරීම"</string>
+ <string name="permdesc_changeNetworkState" msgid="6789123912476416214">"à¶¢à·à¶½ සම්බන්ධතà·à·€à¶ºà·š තත්වය වෙනස් කිරීමට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_changeTetherState" msgid="5952584964373017960">"ටෙදර් කරන ලද සම්බන්ධත෠වෙනස් කිරීම"</string>
+ <string name="permdesc_changeTetherState" msgid="1524441344412319780">"ටෙදර් à¶šà·… à¶¢à·à¶½ සම්බන්ධතà·à·€à¶ºà·š තත්වය වෙනස් කිරීමට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_changeBackgroundDataSetting" msgid="1400666012671648741">"පසුබිම් දත්ත à¶·à·à·€à·’à¶­ à·ƒà·à¶šà·ƒà·“ම් වෙනස් කිරීම"</string>
+ <string name="permdesc_changeBackgroundDataSetting" msgid="5347729578468744379">"පසුබිම් දත්ත à¶·à·à·€à·’à¶­à· à·ƒà·à¶šà·ƒà·“ම වෙනස් කිරීමට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_accessWifiState" msgid="5202012949247040011">"Wi-Fi සම්බන්ධතà·à·€à¶±à·Š à¶¶à·à¶½à·“ම"</string>
+ <string name="permdesc_accessWifiState" msgid="5002798077387803726">"Wi-Fi සබල à¶¶à·€ සහ සම්බන්ධිත Wi-Fi à¶‹à¶´à·à¶‚à¶œ වල නම් ආදී Wi-Fi à¶¢à·à¶½à¶šà¶»à¶«à¶ºà·š තොරතුරු à¶¶à·à¶½à·“මට යෙදුමට අවසර දෙයි."</string>
+ <string name="permlab_changeWifiState" msgid="6550641188749128035">"Wi-Fi වලට සම්බන්ධ විම සහ විසන්ධි කිරීම"</string>
+ <string name="permdesc_changeWifiState" msgid="7137950297386127533">"Wi-Fi à¶´à·Šâ€à¶»à·€à·šà· ස්ථà·à¶±à¶ºà¶±à·Š වෙත සම්බන්ධ වීමට සහ විසන්ධි වීමට සහ, Wi-Fi à¶¢à·à¶½ සඳහ෠උපà·à¶‚ගයේ වින්â€à¶ºà·à·ƒà¶ºà¶§ වෙනස් කිරීමට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_changeWifiMulticastState" msgid="1368253871483254784">"Wi-Fi බහුවිකà·à·à¶± à¶´à·’à·…à·’à¶œà·à¶±à·“මට අවසර දෙන්න"</string>
+ <string name="permdesc_changeWifiMulticastState" product="tablet" msgid="7969774021256336548">"ඔබගේ à¶§à·à¶¶à·Šà¶½à¶§à¶ºà¶§ පමණක් නොව Wi-Fi à¶¢à·à¶½à¶ºà·š ඇති සියලුම à¶‹à¶´à·à¶‚ගවලට යà·à·€à·– à¶´à·à¶šà·à¶§à·Šà¶§à·” à¶¶à·„à·” විකà·à· ලිපින à¶·à·à·€à·’තයෙන් ලබà·à¶œà·à¶±à·“මට යෙදුමට අවසර දෙන්න. non-multicast ආකà·à¶»à¶ºà¶§ වඩ෠වà·à¶©à·’ බලයක් මෙහිදී à¶·à·à·€à·’ත෠වේ."</string>
+ <string name="permdesc_changeWifiMulticastState" product="default" msgid="6851949706025349926">"ඔබගේ දුරකථනයට පමණක් නොව Wi-Fi à¶¢à·à¶½à¶ºà·š ඇති සියලුම යෙදුම්වලට යà·à·€à·– à¶´à·à¶šà·à¶§à·Šà¶§à·” බහුවà·à·„à¶š ලිපින à¶·à·à·€à·’තයෙන් ලබà·à¶œà·à¶±à·“මට යෙදුමට අවසර à¶½à·à¶¶à·š. බහුවà·à·„à¶š à¶±à·à¶­à·’ ආකà·à¶»à¶ºà¶§ වඩ෠වà·à¶©à·’ බලයක් මෙහිදී à¶·à·à·€à·’ත෠වේ."</string>
+ <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"බ්ලූටූත් à·ƒà·à¶šà·ƒà·“ම් à¶´à·Šâ€à¶»à·€à·šà·à¶º"</string>
+ <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"ස්ථà·à¶±à·“ය බ්ලූටූත් à¶§à·à¶¶à·Šà¶½à¶§à·Šà¶ºà¶šà·Š à·ƒà·à¶šà·ƒà·“මට සහ වින්â€à¶ºà·à·ƒ කිරීමට සහ දුරස්ථ à¶‹à¶´à·à¶‚à¶œ සමග යුගළ කිරීමට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"දුරකථනයේ පෙදෙසි බ්ලූටූත් වින්â€à¶ºà·à·ƒ කිරීමට, සහ දුරස්ථ à¶‹à¶´à·à¶‚à¶œ ගවේෂණයට සහ යුගල වීමට යෙදුමට අවසර දෙයි."</string>
+ <string name="permlab_accessWimaxState" msgid="4195907010610205703">"WiMAX වෙතට සම්බන්ධ කරන්න හ෠විසන්ධි කරන්න"</string>
+ <string name="permdesc_accessWimaxState" msgid="6360102877261978887">"WiMAX සබල à¶¶à·€ සහ සම්බන්ධිත ඕනෑම WiMAX à¶¢à·à¶½à¶ºà¶š තොරතුරු නිà·à·Šà¶ à¶º කිරීමට යෙදුමට අවසර දෙයි."</string>
+ <string name="permlab_changeWimaxState" msgid="2405042267131496579">"WiMAX තත්වය වෙනස් කරන්න"</string>
+ <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"à¶§à·à¶¶à·Šà¶½à¶§à¶º WiMAX à¶¢à·à¶½ වෙත සම්බන්ධ කිරීමට සහ විසන්ධි කිරීමට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"WiMAX à¶¢à·à¶½à¶ºà¶±à·Šà¶§ දුරකථනය සම්බන්ධ කිරීමට සහ විසන්ධි කිරීමට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_bluetooth" msgid="6127769336339276828">"බ්ලූටූත් à¶‹à¶´à·à¶‚à¶œ සමඟ යුගල කිරීම"</string>
+ <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"à¶§à·à¶¶à·Šà¶½à¶§à¶ºà·š බ්ලූටූත් වින්â€à¶ºà·à·ƒà¶º à¶¶à·à¶½à·’මට, à·ƒà·à¶šà·ƒà·“මට සහ යුගල à¶šà·… à¶‹à¶´à·à¶‚à¶œ සමඟ සම්බන්ධතà·à·€à¶±à·Š à¶´à·’à·…à·’à¶œà·à¶±à·“මට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"දුරකථනයේ බ්ලූටූත් වින්â€à¶ºà·à·ƒà¶º දà·à¶šà·“මට, යුගල à¶‹à¶´à·à¶‚à¶œ සමඟ සම්බන්ධතà·à·€à¶±à·Š à·ƒà·à¶šà·ƒà·“මට සහ à¶·à·à¶»à¶œà·à¶±à·“මට යෙදුමට අවසර දෙයි."</string>
+ <string name="permlab_nfc" msgid="4423351274757876953">"ආසන්න à¶šà·Šà·‚à·šà¶­à·Šâ€à¶» සන්නිවේදනය à¶´à·à¶½à¶±à¶º කරන්න"</string>
+ <string name="permdesc_nfc" msgid="7120611819401789907">"ආසන්න à¶šà·Šà·‚à·šà¶­à·Šâ€à¶» සන්නිවේදන (NFC) à¶§à·à¶œà·Š, à¶´à¶­à·Š, සහ කියවන්නන් සමඟ සන්නිවේදනය කිරීමට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_disableKeyguard" msgid="3598496301486439258">"ඔබගේ තිරයේ අගුල අබල කරන්න"</string>
+ <string name="permdesc_disableKeyguard" msgid="6034203065077122992">"යතුරු අගුල සහ ඕනෑම සම්බන්ධිත මුරපද ආරක්ෂà·à·€à¶šà·Š à¶…à¶¶à¶½ කිරීමට යෙදුමට අවසර දෙන්න. මෙහි උදà·à·„රණයක් වන්නේ à¶´à·à¶¸à·’ණෙන ඇමතුමක් à¶½à·à¶¶à·™à¶¯à·Šà¶¯à·“, දුරකථනය à¶…à¶šà·Šâ€à¶»à·’ය වන à¶…à¶­à¶» ඇමතුම අවසà·à¶± වන විට යතුරු අගුල à¶±à·à·€à¶­ සක්â€à¶»à·’ය වෙයි."</string>
+ <string name="permlab_readSyncSettings" msgid="6201810008230503052">"සමමුහුර්ත à·ƒà·à¶šà·ƒà·“ම් කියවන්න"</string>
+ <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"ගිණුම සඳහ෠සමමුහුර්ත à·ƒà·à¶šà·ƒà·“ම් කියවීමට යෙදුමට අවසර දෙන්න. උදà·à·„රණයක් ලෙස, ගිණුමක් සමඟ පුද්ගල යෙදුම සමමුහුර්ත දà·à¶ºà·’ මෙයට හඳුන෠ගත à·„à·à¶š."</string>
+ <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"සමමුහුර්ත කිරීම සක්â€à¶»à·’ය කරන්න සහ à¶…à¶šà·Šâ€à¶»à·’ය කරන්න"</string>
+ <string name="permdesc_writeSyncSettings" msgid="8956262591306369868">"ගිණුම සඳහ෠සමමුහුර්ත à·ƒà·à¶šà·ƒà·“ම් වෙනස් කිරීමට යෙදුමට අවසර දෙන්න. උදà·à·„රණයක් ලෙස, ගිණුම සමඟ පුද්ගල යෙදුම සමමුහුර්ත කිරීම සක්â€à¶»à·’ය කිරීමට à¶·à·à·€à·’à¶­ à¶šà¶½ à·„à·à¶š."</string>
+ <string name="permlab_readSyncStats" msgid="7396577451360202448">"සමමුහුර්ත කිරීමේ සංඛ්â€à¶ºà·à¶± කියවීම"</string>
+ <string name="permdesc_readSyncStats" msgid="1510143761757606156">"සමමුහුර්ත කිරීමේ සිදුවීම් ඉතිහà·à·ƒà¶º සහ කෙතරම් දත්ත සමමුහුර්ත වී ඇතිදà·à¶ºà·’ ඇතුලත් ගිණුම සඳහ෠සමමුහුර්ත කිරීමේ සංඛ්â€à¶ºà·à¶± කියවීමට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"දà·à¶ºà¶š වූ සංග්â€à¶»à·„ කියවීම"</string>
+ <string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"වර්තමà·à¶± සමමුහුර්ත සංග්â€à¶»à·„ à¶œà·à¶± විස්තර à¶½à·à¶¶à·“මට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_subscribedFeedsWrite" msgid="9015246325408209296">"දà·à¶ºà¶š වූ සංග්â€à¶»à·„ ලිවීම"</string>
+ <string name="permdesc_subscribedFeedsWrite" msgid="6928930188826089413">"ඔබගේ වර්තමà·à¶± සමමුහුර්ත සංග්â€à¶»à·„ වෙනස් කිරීමට යෙදුමට අවසර දෙන්න. ඔබගේ සමමුහුර්ත සංග්â€à¶»à·„ අනිෂ්ට යෙදුම්වලින් වෙනස් à¶šà¶½ à·„à·à¶š."</string>
+ <string name="permlab_readDictionary" msgid="4107101525746035718">"ඔබ විසින් à·à¶¶à·Šà¶¯à¶šà·à·‚යට ඇතුළත්කොට ඇති කොන්දේසි කියවීම"</string>
+ <string name="permdesc_readDictionary" msgid="659614600338904243">"පරිà·à·“ලක à·à¶¶à·Šà¶¯ à¶šà·à·‚යේ පරිà·à·“ලකයන් විසින් ගබඩ෠කර තිබිය à·„à·à¶šà·’ වචන, නම්, à·€à·à¶šà·Šâ€à¶ºà¶‚෠කියවීමට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_writeDictionary" msgid="2183110402314441106">"පරිà·à·“ලකයින් අර්ථ දà·à¶šà·Šà·€à·– à·à¶¶à·Šà¶¯ à¶šà·à·‚යට වචන à¶‘à¶šà¶­à·” කිරීම"</string>
+ <string name="permdesc_writeDictionary" msgid="8185385716255065291">"පරිà·à·“ලක à·à¶¶à·Šà¶¯à¶šà·à·‚ය තුළට අලුත් වචන ලිවීමට යෙදුමට ඉඩ දෙන්න."</string>
+ <string name="permlab_sdcardRead" product="nosdcard" msgid="8235341515605559677">"ආරක්â€à·‚à·’à¶­ ආචයනය වෙත à¶´à·Šâ€à¶»à·€à·šà·à¶º පරීක්ෂ෠කිරීම"</string>
+ <string name="permlab_sdcardRead" product="default" msgid="8235341515605559677">"ආරක්â€à·‚à·’à¶­ ආචයනය වෙත à¶´à·Šâ€à¶»à·€à·šà·à¶º පරීක්ෂ෠කිරීම"</string>
+ <string name="permdesc_sdcardRead" product="nosdcard" msgid="3642473292348132072">"à¶…à¶±à·à¶œà¶­ à¶‹à¶´à·à¶‚ගවල ලබà·à¶œà¶­ à·„à·à¶šà·’ USB ආචයනය සඳහ෠අවසරයක් පරීක්ෂ෠කිරීමට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permdesc_sdcardRead" product="default" msgid="5914402684685848828">"à¶…à¶±à·à¶œà¶­ à¶‹à¶´à·à¶‚ගවල à¶´à·à·€à¶­à·™à¶± SD à¶šà·à¶©à·Š à¶´à¶­ සඳහ෠අවසරයක් පිරික්සීමට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"ඔබගේ USB ආචයනයේ අන්තර්ගත වෙනස් කිරීම හ෠මà·à¶šà·“ම"</string>
+ <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"ඔබගේ SD à¶´à¶­à·š අන්තර්ගත වෙනස් කිරීම හ෠මà·à¶šà·“ම"</string>
+ <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"USB ආචයනය වෙත ලිවීමට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"SD පත වෙත ලිවීමට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"à¶…à¶·à·Šâ€à¶ºà¶±à·Šà¶­à¶» මà·à¶°à·Šâ€à¶º ආචයනය අන්තර්ගත වෙනස් කරන්න/ මකන්න"</string>
+ <string name="permdesc_mediaStorageWrite" product="default" msgid="8189160597698529185">"à¶…à¶·à·Šâ€à¶ºà¶±à·Šà¶­à¶» මà·à¶°à·Šâ€à¶º ආචයනයේ අන්තර්ගතය වෙනස් කිරීමට à¶‹à¶´à·à¶‚ගයට අවසර දෙන්න."</string>
+ <string name="permlab_manageDocs" product="default" msgid="5778318598448849829">"ලේඛන ආචයනය කළමනà·à¶šà¶»à¶«à¶º කරන්න"</string>
+ <string name="permdesc_manageDocs" product="default" msgid="8704323176914121484">"ලේඛන ආචයනය කළමනà·à¶šà¶»à¶«à¶º කිරීමට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_sdcardAccessAll" msgid="8150613823900460576">"සියලුම පරිà·à·“ලකයන්ගේ à¶¶à·à·„à·’à¶» ආචයන වෙත පිවිසෙන්න"</string>
+ <string name="permdesc_sdcardAccessAll" msgid="3215208357415891320">"සියලු පරිà·à·“ලකයන් සඳහ෠බà·à·„à·’à¶» ආචයනය වෙත පිවිසීමට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_cache_filesystem" msgid="5656487264819669824">"à·„à·à¶¹à·’ලි ගොනු පද්ධතියට à¶´à·Šâ€à¶»à·€à·šà· වීම"</string>
+ <string name="permdesc_cache_filesystem" msgid="5578967642265550955">"à·„à·à¶¹à·’ලි ගොනු පද්ධති කියවීමට සහ ලිවීමට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_use_sip" msgid="5986952362795870502">"අන්තර්ජà·à¶½ ඇමතුම් ගන්න/ලබන්න"</string>
+ <string name="permdesc_use_sip" msgid="4717632000062674294">"අන්තර්ජà·à¶½ ඇමතුම් à¶œà·à¶±à·“මට/à¶½à·à¶¶à·“මට SIP සේවà·à·€ à¶·à·à·€à·’තයට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"ඉතිහà·à·ƒà¶œà¶­ à¶¢à·à¶½ à¶·à·à·€à·’තය කියවන්න"</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"විà·à·šà·‚à·’à¶­ à¶¢à·à¶½ සහ යෙදුම් සඳහ෠ඉතිහà·à·ƒà¶œà¶­ à¶¢à·à¶½ à¶·à·à·€à·’තය කියවීමට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"à¶¢à·à¶½ à¶´à·Šâ€à¶»à¶­à·’පත්තිය කළමනà·à¶šà¶»à¶«à¶º කිරීම"</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"à¶¢à·à¶½ කොන්දේසි සහ සඳහන් යෙදුම් විà·à·šà·‚à·“à¶­ රීති කළමනà·à¶šà¶»à¶«à¶º කිරීමට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"à¶¢à·à¶½ à¶·à·à·€à·’à¶­ ගිණුම් කිරීම වෙනස් කිරීම"</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"යෙදුම්වලට à¶¢à·à¶½ à¶·à·à·€à·’තයෙන් වන බලපෑම කෙසේද යන්න වෙනස් කිරීමට යෙදුමට අවසර දෙන්න. à·ƒà·à¶¸à·à¶±à·Šâ€à¶º යෙදුම්වල à¶·à·à·€à·’තය සඳහ෠නොවේ."</string>
+ <string name="permlab_markNetworkSocket" msgid="3658527214914959749">"කෙවෙනි ලකුණු වෙනස් කරන්න"</string>
+ <string name="permdesc_markNetworkSocket" msgid="7655568433696356578">"මà·à¶»à·Šà¶œà¶œà¶­ වීම සඳහ෠කෙවෙනියේ ලකුණු වෙනස් කිරීමට යෙදුමට ඉඩ දෙන්න"</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"à¶´à·Šâ€à¶»à·€à·šà· දà·à¶±à·”ම්දීම්"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"වෙනත් යෙදුම් විසින් à¶šà·… à¶´à¶½ කිරීම්ද ඇතුළත්ව දà·à¶±à·Šà·€à·“ම් ලබ෠ගà·à¶±à·“මට, පරීක්ෂ෠කිරීමට සහ හිස් කිරීමට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"දà·à¶±à·”ම්දීම ඇහුම්කන් දීම් සේවà·à·€à¶šà·Š වෙත බඳින්න"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"දà·à¶±à·”ම්දීම් අසන්නà·à¶œà·š සේවà·à·€à·š ඉහළ මට්ටමේ අතුරුමුහුණතට à¶¶à·à¶³à·“මට දරන්නà·à¶§ අවසර දේ. à·ƒà·à¶¸à·à¶±à·Šâ€à¶º යෙදුම් සඳහ෠කිසිසේත් à¶…à·€à·à·Šâ€à¶º නොවේ."</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"à·€à·à·„කය à·ƒà·à¶´à¶ºà·” වින්â€à¶ºà·à·ƒà¶º යෙදුම ඉල්ල෠සිටින්න"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"à·€à·à·„කය෠ලබà·à¶¯à·”න් à·ƒà·à¶šà·ƒà·”ම් යෙදුම් à¶‹à¶­à·Šà¶´à·à¶¯à¶±à¶ºà¶§ à¶°à·à¶»à¶šà¶ºà·à¶§ අවසර දෙන්න. à·ƒà·à¶¸à·à¶±à·Šâ€à¶º යෙදුම් සඳහ෠කිසිද෠අවà·à·Šâ€à¶º නොවෙයි."</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"à¶¢à·à¶½ à¶­à¶­à·Šà·€ මත නිරීක්ෂණ වෙත ඇහුම්කන් දීම"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"යෙදුමකට à¶¢à·à¶½ à¶­à¶­à·Šà·€ මත නිරීක්ෂණ වෙත ඇහුම්කන් දීමට අවසර දේ. à·ƒà·à¶¸à·à¶±à·Šâ€à¶º යෙදුම් සඳහ෠කිසිද෠අවà·à·Šâ€à¶º නොවේ."</string>
+ <string name="permlab_hotwordRecognition" msgid="3225080408746361313">"අණවදන හඳුනà·à¶œà·à¶±à·“ම ඉල්ලයි"</string>
+ <string name="permdesc_hotwordRecognition" msgid="3716741260195364252">"අණවදන හඳුනà·à¶œà·à¶±à·“ම සඳහ෠ඉල්ලීමට යෙදුමට ඉඩ දෙන්න. à·ƒà·à¶¸à·à¶±à·Šâ€à¶º යෙදුම් සඳහ෠කිසිද෠අවà·à·Šâ€à¶º නොවෙයි."</string>
+ <string name="policylab_limitPassword" msgid="4497420728857585791">"මුරපද නීති සකස් කිරීම"</string>
+ <string name="policydesc_limitPassword" msgid="3252114203919510394">"තිරය අගුළු ඇරීමේ මුරපදයට අනුමත අකුරු සහ දිග à¶´à·à¶½à¶±à¶º කරන්න."</string>
+ <string name="policylab_watchLogin" msgid="914130646942199503">"තිරය අගුළු ඇරීමේ à¶‹à¶­à·Šà·ƒà·à·„යන් නිරීක්ෂණය කරන්න"</string>
+ <string name="policydesc_watchLogin" product="tablet" msgid="3215729294215070072">"තිරය අගුළු à·„à·à¶»à·“මේදී à·€à·à¶»à¶¯à·’යට ටයිප් à¶šà·… මුරපද ගණන නිරීක්ෂණය කරන්න සහ à¶§à·à¶¶à·Šà¶½à¶§à¶º අගුළු දමන්න à·„à· à·€à·à¶»à¶¯à·’ මුරපද බොහ෠ගණනක් ටයිප් à¶šà¶» ඇති නම් à¶§à·à¶¶à·Šà¶½à¶§à¶ºà·š සියලු දත්ත මකන්න."</string>
+ <string name="policydesc_watchLogin" product="default" msgid="5712323091846761073">"තිරය අගුළු à·„à·à¶»à·“මේදී à·€à·à¶»à¶¯à·’යට ටයිප් à¶šà·… මුරපද ගණන නිරීක්ෂණය කරන්න සහ දුරකථනය අගුළු දමන්න à·„à· à·€à·à¶»à¶¯à·’ මුරපද බොහ෠ගණනක් ටයිප් à¶šà¶» ඇති නම් දුරකථනයේ සියලු දත්ත මකන්න."</string>
+ <string name="policylab_resetPassword" msgid="2620077191242688955">"තිරය අගුළු ඇරීමේ මුරපදය වෙනස් කිරීම"</string>
+ <string name="policydesc_resetPassword" msgid="605963962301904458">"තිරය අගුළු ඇරීමේ මුරපදය වෙනස් කරන්න."</string>
+ <string name="policylab_forceLock" msgid="2274085384704248431">"තිරය අගුළු දà·à¶¸à·“ම"</string>
+ <string name="policydesc_forceLock" msgid="1141797588403827138">"තිරයට අගුළු à·€à·à¶§à·“ම සිදුවන්නේ කෙසේද සහ කවදà·à¶¯ යන්න à¶´à·à¶½à¶±à¶º කරන්න."</string>
+ <string name="policylab_wipeData" msgid="3910545446758639713">"සියලු දත්ත මකන්න"</string>
+ <string name="policydesc_wipeData" product="tablet" msgid="4306184096067756876">"කර්මà·à¶±à·Šà¶­ à·à·à¶½à· දත්ත යළි පිහිටුවීමෙන් පසුව අනතුරු ඇඟවිමකින් තොරවම à¶§à·à¶¶à·Šà¶½à¶§à·Š දත්ත මක෠දමයි."</string>
+ <string name="policydesc_wipeData" product="default" msgid="5096895604574188391">"කර්මà·à¶±à·Šà¶­ à·à·à¶½à· දත්ත යළි පිහිටුවීමෙන් පසුව අනතුරු ඇඟවිමකින් තොරවම දුරකථන දත්ත මක෠දමයි."</string>
+ <string name="policylab_setGlobalProxy" msgid="2784828293747791446">"à¶‹à¶´à·à¶‚à¶œ à¶œà·à¶½à·“ය නියුතුව සකස් කිරීම"</string>
+ <string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"කොන්දේසි සක්â€à¶»à·’ය විට පොදු නියුතු à¶‘à¶šà¶šà·Š à¶·à·à·€à·’à¶­ කරන ලෙස à¶‹à¶´à·à¶‚ගය සකසන්න. පළමු à¶‹à¶´à·à¶‚à¶œ පරිපà·à¶½à¶šà¶ºà· පමණක් ඵලදà·à¶ºà·’ පොදු නියුතුව සකසයි."</string>
+ <string name="policylab_expirePassword" msgid="885279151847254056">"තිරය අගුළු දà·à¶¸à·“මේ මුරපදය කල් ඉකුත්වීම සකසන්න"</string>
+ <string name="policydesc_expirePassword" msgid="1729725226314691591">"à¶­à·’à¶»-අගුළේ මුරපදය වෙනස්වීම කොපමණ à¶šà·à¶½ à¶´à¶»à·à·ƒà¶ºà¶šà·’න් සිදුවිය යුතුද යන්න à¶´à·à¶½à¶±à¶º කිරීම."</string>
+ <string name="policylab_encryptedStorage" msgid="8901326199909132915">"ආචයනයේ සංකේතනය සකස් කිරීම"</string>
+ <string name="policydesc_encryptedStorage" msgid="2637732115325316992">"ආචයනය à¶šà·… යෙදුම් දත්ත සංකේතනය කිරීමට à¶…à·€à·à·Šâ€à¶ºà¶º."</string>
+ <string name="policylab_disableCamera" msgid="6395301023152297826">"à¶šà·à¶¸à¶»à· à¶…à¶¶à¶½ කිරීම"</string>
+ <string name="policydesc_disableCamera" msgid="2306349042834754597">"සියලු à¶‹à¶´à·à¶‚à¶œ à¶šà·à¶¸à¶»à·à·€à¶½ à¶·à·à·€à·’තය වලක්වන්න."</string>
+ <string name="policylab_disableKeyguardFeatures" msgid="266329104542638802">"යතුරු ආරක්ෂà·à·€à·š විà·à·šà·‚à·à¶‚à¶œ à¶…à¶¶à¶½ කරන්න"</string>
+ <string name="policydesc_disableKeyguardFeatures" msgid="3467082272186534614">"යතුරු ආරක්ෂà·à·€ à·„à·’ සමහර විà·à·šà·‚à·à¶‚à¶œ à¶·à·à·€à·’තය වළක්වයි."</string>
+ <string-array name="phoneTypes">
+ <item msgid="8901098336658710359">"නිවස"</item>
+ <item msgid="869923650527136615">"ජංගම"</item>
+ <item msgid="7897544654242874543">"à¶šà·à¶»à·Šà¶ºà·à¶½à¶º"</item>
+ <item msgid="1103601433382158155">"à¶šà·à¶»à·Šà¶ºà·à¶½ à·†à·à¶šà·Šà·ƒà·Š"</item>
+ <item msgid="1735177144948329370">"නිවසේ à·†à·à¶šà·Šà·ƒà·Š"</item>
+ <item msgid="603878674477207394">"පේජරය"</item>
+ <item msgid="1650824275177931637">"වෙනත්"</item>
+ <item msgid="9192514806975898961">"අභිරුචි"</item>
+ </string-array>
+ <string-array name="emailAddressTypes">
+ <item msgid="8073994352956129127">"මුල් පිටුව"</item>
+ <item msgid="7084237356602625604">"à¶šà·à¶»à·Šà¶ºà·à¶½à¶º"</item>
+ <item msgid="1112044410659011023">"වෙනත්"</item>
+ <item msgid="2374913952870110618">"අභිරුචි"</item>
+ </string-array>
+ <string-array name="postalAddressTypes">
+ <item msgid="6880257626740047286">"නිවස"</item>
+ <item msgid="5629153956045109251">"à¶šà·à¶»à·Šà¶ºà·à¶½à¶º"</item>
+ <item msgid="4966604264500343469">"වෙනත්"</item>
+ <item msgid="4932682847595299369">"අභිරුචි"</item>
+ </string-array>
+ <string-array name="imAddressTypes">
+ <item msgid="1738585194601476694">"නිවස"</item>
+ <item msgid="1359644565647383708">"à¶šà·à¶»à·Šà¶ºà·à¶½à¶º"</item>
+ <item msgid="7868549401053615677">"වෙනත්"</item>
+ <item msgid="3145118944639869809">"අභිරුචි"</item>
+ </string-array>
+ <string-array name="organizationTypes">
+ <item msgid="7546335612189115615">"à¶šà·à¶»à·Šà¶ºà·à¶½à¶º"</item>
+ <item msgid="4378074129049520373">"වෙනත්"</item>
+ <item msgid="3455047468583965104">"අභිරුචි"</item>
+ </string-array>
+ <string-array name="imProtocols">
+ <item msgid="8595261363518459565">"AIM"</item>
+ <item msgid="7390473628275490700">"Windows Live"</item>
+ <item msgid="7882877134931458217">"Yahoo"</item>
+ <item msgid="5035376313200585242">"Skype"</item>
+ <item msgid="7532363178459444943">"QQ"</item>
+ <item msgid="3713441034299660749">"Google Talk"</item>
+ <item msgid="2506857312718630823">"ICQ"</item>
+ <item msgid="1648797903785279353">"Jabber"</item>
+ </string-array>
+ <string name="phoneTypeCustom" msgid="1644738059053355820">"අභිරුචි"</string>
+ <string name="phoneTypeHome" msgid="2570923463033985887">"නිවස"</string>
+ <string name="phoneTypeMobile" msgid="6501463557754751037">"ජංගම"</string>
+ <string name="phoneTypeWork" msgid="8863939667059911633">"à¶šà·à¶»à·Šà¶ºà·à¶½à¶º"</string>
+ <string name="phoneTypeFaxWork" msgid="3517792160008890912">"à¶šà·à¶»à·Šà¶ºà·à¶½ à·†à·à¶šà·Šà·ƒà·Š"</string>
+ <string name="phoneTypeFaxHome" msgid="2067265972322971467">"නිවසේ à·†à·à¶šà·Šà·ƒà·Š"</string>
+ <string name="phoneTypePager" msgid="7582359955394921732">"පේජරය"</string>
+ <string name="phoneTypeOther" msgid="1544425847868765990">"වෙනත්"</string>
+ <string name="phoneTypeCallback" msgid="2712175203065678206">"යළි ඇමතීම"</string>
+ <string name="phoneTypeCar" msgid="8738360689616716982">"මà·à¶§à¶»à·Š රථය"</string>
+ <string name="phoneTypeCompanyMain" msgid="540434356461478916">"ආයතනයේ මූලිකය"</string>
+ <string name="phoneTypeIsdn" msgid="8022453193171370337">"ISDN"</string>
+ <string name="phoneTypeMain" msgid="6766137010628326916">"මූලික"</string>
+ <string name="phoneTypeOtherFax" msgid="8587657145072446565">"වෙනත් à·†à·à¶šà·Šà·ƒà·Š"</string>
+ <string name="phoneTypeRadio" msgid="4093738079908667513">"රේඩියà·à·€"</string>
+ <string name="phoneTypeTelex" msgid="3367879952476250512">"ටෙලෙක්ස්"</string>
+ <string name="phoneTypeTtyTdd" msgid="8606514378585000044">"TTY TDD"</string>
+ <string name="phoneTypeWorkMobile" msgid="1311426989184065709">"à¶šà·à¶»à·Šà¶ºà·à¶½ ජංගම"</string>
+ <string name="phoneTypeWorkPager" msgid="649938731231157056">"à¶šà·à¶»à·Šà¶ºà·à¶½ පේජරය"</string>
+ <string name="phoneTypeAssistant" msgid="5596772636128562884">"සහà·à¶ºà¶š"</string>
+ <string name="phoneTypeMms" msgid="7254492275502768992">"MMS"</string>
+ <string name="eventTypeCustom" msgid="7837586198458073404">"අභිරුචි"</string>
+ <string name="eventTypeBirthday" msgid="2813379844211390740">"උපන්දිනය"</string>
+ <string name="eventTypeAnniversary" msgid="3876779744518284000">"සංවත්සරය"</string>
+ <string name="eventTypeOther" msgid="7388178939010143077">"වෙනත්"</string>
+ <string name="emailTypeCustom" msgid="8525960257804213846">"අභිරුචි"</string>
+ <string name="emailTypeHome" msgid="449227236140433919">"නිවස"</string>
+ <string name="emailTypeWork" msgid="3548058059601149973">"à¶šà·à¶»à·Šà¶ºà·à¶½à¶º"</string>
+ <string name="emailTypeOther" msgid="2923008695272639549">"වෙනත්"</string>
+ <string name="emailTypeMobile" msgid="119919005321166205">"ජංගම"</string>
+ <string name="postalTypeCustom" msgid="8903206903060479902">"අභිරුචි"</string>
+ <string name="postalTypeHome" msgid="8165756977184483097">"නිවස"</string>
+ <string name="postalTypeWork" msgid="5268172772387694495">"à¶šà·à¶»à·Šà¶ºà·à¶½à¶º"</string>
+ <string name="postalTypeOther" msgid="2726111966623584341">"වෙනත්"</string>
+ <string name="imTypeCustom" msgid="2074028755527826046">"අභිරුචි"</string>
+ <string name="imTypeHome" msgid="6241181032954263892">"මුල් පිටුව"</string>
+ <string name="imTypeWork" msgid="1371489290242433090">"à¶šà·à¶»à·Šà¶ºà·à¶½à¶º"</string>
+ <string name="imTypeOther" msgid="5377007495735915478">"වෙනත්"</string>
+ <string name="imProtocolCustom" msgid="6919453836618749992">"අභිරුචි"</string>
+ <string name="imProtocolAim" msgid="7050360612368383417">"AIM"</string>
+ <string name="imProtocolMsn" msgid="144556545420769442">"Windows Live"</string>
+ <string name="imProtocolYahoo" msgid="8271439408469021273">"Yahoo"</string>
+ <string name="imProtocolSkype" msgid="9019296744622832951">"Skype"</string>
+ <string name="imProtocolQq" msgid="8887484379494111884">"QQ"</string>
+ <string name="imProtocolGoogleTalk" msgid="493902321140277304">"Hangouts"</string>
+ <string name="imProtocolIcq" msgid="1574870433606517315">"ICQ"</string>
+ <string name="imProtocolJabber" msgid="2279917630875771722">"Jabber"</string>
+ <string name="imProtocolNetMeeting" msgid="8287625655986827971">"NetMeeting"</string>
+ <string name="orgTypeWork" msgid="29268870505363872">"à¶šà·à¶»à·Šà¶ºà·à¶½à¶º"</string>
+ <string name="orgTypeOther" msgid="3951781131570124082">"වෙනත්"</string>
+ <string name="orgTypeCustom" msgid="225523415372088322">"අභිරුචි"</string>
+ <string name="relationTypeCustom" msgid="3542403679827297300">"අභිරුචි"</string>
+ <string name="relationTypeAssistant" msgid="6274334825195379076">"සහà·à¶ºà¶š"</string>
+ <string name="relationTypeBrother" msgid="8757913506784067713">"සහà·à¶¯à¶»à¶ºà·"</string>
+ <string name="relationTypeChild" msgid="1890746277276881626">"දරුවà·"</string>
+ <string name="relationTypeDomesticPartner" msgid="6904807112121122133">"දේà·à·“ය හවුල්කරුවà·"</string>
+ <string name="relationTypeFather" msgid="5228034687082050725">"පියà·"</string>
+ <string name="relationTypeFriend" msgid="7313106762483391262">"මිත්â€à¶»à¶ºà·"</string>
+ <string name="relationTypeManager" msgid="6365677861610137895">"කළමනà·à¶šà¶»à·”"</string>
+ <string name="relationTypeMother" msgid="4578571352962758304">"මව"</string>
+ <string name="relationTypeParent" msgid="4755635567562925226">"මව්පිය"</string>
+ <string name="relationTypePartner" msgid="7266490285120262781">"හවුල්කරුවà·"</string>
+ <string name="relationTypeReferredBy" msgid="101573059844135524">"යොමුකරන ලද්දේ"</string>
+ <string name="relationTypeRelative" msgid="1799819930085610271">"නෑයà·"</string>
+ <string name="relationTypeSister" msgid="1735983554479076481">"සහà·à¶¯à¶»à·’ය"</string>
+ <string name="relationTypeSpouse" msgid="394136939428698117">"à¶·à·à¶»à·Šà¶ºà·à·€ හ෠ස්වà·à¶¸à·’පුරුෂයà·"</string>
+ <string name="sipAddressTypeCustom" msgid="2473580593111590945">"අභිරුචි"</string>
+ <string name="sipAddressTypeHome" msgid="6093598181069359295">"නිවස"</string>
+ <string name="sipAddressTypeWork" msgid="6920725730797099047">"à¶šà·à¶»à·Šà¶ºà·à¶½à¶º"</string>
+ <string name="sipAddressTypeOther" msgid="4408436162950119849">"වෙනත්"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"PIN කේතය ටයිප් කරන්න"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"PUK සහ නව PIN කේතය ටයිප් කරන්න"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"PUK කේතය"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"නව PIN කේතය"</string>
+ <string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"මුරපදය ටයිප් කිරීමට ස්පර්෠කරන්න"</font></string>
+ <string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"අගුළු ඇරීමට මුරපදය ටයිප් කරන්න"</string>
+ <string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"අගුළු à·„à·à¶»à·“මට PIN à¶‘à¶š ටයිප් කරන්න"</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"à·€à·à¶»à¶¯à·’ PIN කේතයකි."</string>
+ <string name="keyguard_label_text" msgid="861796461028298424">"අගුළු ඇරීමට, මෙනුව ඔබ෠පසුව 0 ද ඔබන්න."</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"හදිසි ඇමතුම් අංකය"</string>
+ <string name="lockscreen_carrier_default" msgid="8963839242565653192">"සේවà·à·€ à¶±à·à¶­."</string>
+ <string name="lockscreen_screen_locked" msgid="7288443074806832904">"තිරය අගුළු දම෠ඇත."</string>
+ <string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"අගුළු à·„à·à¶»à·“මට මෙනුව ඔබන්න හ෠හදිසි ඇමතුම ලබà·à¶œà¶±à·Šà¶±."</string>
+ <string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"අගුළු à·„à·à¶»à·“මට මෙනු ඔබන්න."</string>
+ <string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"අගුළු ඇරීමට රටà·à·€ අඳින්න"</string>
+ <string name="lockscreen_emergency_call" msgid="5347633784401285225">"හදිසි ඇමතුම්"</string>
+ <string name="lockscreen_return_to_call" msgid="5244259785500040021">"ඇමතුම වෙත à¶±à·à·€à¶­ යන්න"</string>
+ <string name="lockscreen_pattern_correct" msgid="9039008650362261237">"නිවà·à¶»à¶¯à·’යි!"</string>
+ <string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"à¶±à·à·€à¶­ à¶‹à¶­à·Šà·ƒà·à·„ කරන්න"</string>
+ <string name="lockscreen_password_wrong" msgid="5737815393253165301">"à¶±à·à·€à¶­ à¶‹à¶­à·Šà·ƒà·à·„ කරන්න"</string>
+ <string name="faceunlock_multiple_failures" msgid="754137583022792429">"මුහුණ à¶·à·à·€à·’තයෙන් අඟුළු à·„à·à¶»à·“මේ උපරිම à¶´à·Šâ€à¶»à¶ºà¶±à·Šà¶­à¶ºà¶±à·Š ගණන ඉක්මව෠ඇත"</string>
+ <string name="lockscreen_plugged_in" msgid="8057762828355572315">"ආරà·à¶´à¶«à¶º වෙමින්, <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+ <string name="lockscreen_charged" msgid="321635745684060624">"à¶…à¶»à·à¶´à·’තයි"</string>
+ <string name="lockscreen_battery_short" msgid="4477264849386850266">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+ <string name="lockscreen_low_battery" msgid="1482873981919249740">"ඔබගේ ආරà·à¶´à¶šà¶ºà¶§ සම්බන්ධ කරන්න."</string>
+ <string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"SIM à¶´à¶­ à¶±à·à¶­"</string>
+ <string name="lockscreen_missing_sim_message" product="tablet" msgid="151659196095791474">"à¶§à·à¶¶à·Šà¶½à¶§à¶ºà·š SIM à¶´à¶­ නොමà·à¶­."</string>
+ <string name="lockscreen_missing_sim_message" product="default" msgid="2186920585695169078">"දුරකථනය තුළ SIM à¶´à¶­ à¶±à·à¶­."</string>
+ <string name="lockscreen_missing_sim_instructions" msgid="5372787138023272615">"SIM පතක් ඇතුල් කරන්න."</string>
+ <string name="lockscreen_missing_sim_instructions_long" msgid="3526573099019319472">"SIM à¶´à¶­ නොමà·à¶­ හ෠කියවිය නොහà·à¶š. SIM à¶´à¶­à¶šà·Š ඇතුලත් කරන්න."</string>
+ <string name="lockscreen_permanent_disabled_sim_message_short" msgid="5096149665138916184">"à¶·à·à·€à·’à¶­à· à¶šà·… නොහà·à¶šà·’ SIM à¶´à¶­."</string>
+ <string name="lockscreen_permanent_disabled_sim_instructions" msgid="910904643433151371">"ඔබගේ SIM à¶´à¶­ ස්ථිරව à¶…à¶¶à¶½ à¶šà¶» à¶­à·’à¶¶à·š.\n වෙනත් SIM à¶´à¶­à¶šà·Š සඳහ෠ඔබගේ සේවà·à¶¯à·à¶ºà¶šà¶ºà· සම්බන්ධ කරගන්න."</string>
+ <string name="lockscreen_transport_prev_description" msgid="201594905152746886">"පෙර ගීත බොත්තම"</string>
+ <string name="lockscreen_transport_next_description" msgid="6089297650481292363">"ඊළඟ ගීත බොත්තම"</string>
+ <string name="lockscreen_transport_pause_description" msgid="7659088786780128001">"විරà·à¶¸ බොත්තම"</string>
+ <string name="lockscreen_transport_play_description" msgid="5888422938351019426">"à¶°à·à·€à¶š බොත්තම"</string>
+ <string name="lockscreen_transport_stop_description" msgid="4562318378766987601">"à¶±à·à·€à¶­à·“මේ බොත්තම"</string>
+ <string name="emergency_calls_only" msgid="6733978304386365407">"හදිසි ඇමතුම් පමණි"</string>
+ <string name="lockscreen_network_locked_message" msgid="143389224986028501">"à¶¢à·à¶½à¶º අගුළු දම෠ඇත"</string>
+ <string name="lockscreen_sim_puk_locked_message" msgid="7441797339976230">"SIM පත PUK අගුළු දම෠ඇත."</string>
+ <string name="lockscreen_sim_puk_locked_instructions" msgid="8127916255245181063">"පරිà·à·“ලක උපදේà·à¶º බලන්න හ෠පරිභà·à¶œà·’à¶š සේවà·à·€ අමතන්න."</string>
+ <string name="lockscreen_sim_locked_message" msgid="8066660129206001039">"SIM පත අගුළු දම෠ඇත."</string>
+ <string name="lockscreen_sim_unlock_progress_dialog_message" msgid="595323214052881264">"SIM පත අගුළු අරිමින්..."</string>
+ <string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="6481623830344107222">"ඔබ <xliff:g id="NUMBER_0">%d</xliff:g> à·€à·à¶»à¶ºà¶šà·Š අගුළු ඇරීමේ රටà·à·€ à·€à·à¶»à¶¯à·’යට ඇඳ ඇත. \n\nà¶­à¶­à·Šà¶´à¶» <xliff:g id="NUMBER_1">%d</xliff:g> à¶šà·Š ඇතුළත à¶±à·à·€à¶­ à¶‹à¶­à·Šà·ƒà·à·„ කරන්න."</string>
+ <string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="2725973286239344555">"ඔබ මුරපදය à·€à·à¶» <xliff:g id="NUMBER_0">%d</xliff:g> à¶šà·Š à·€à·à¶»à¶¯à·’යට ටයිප්කොට ඇත. \n\nà¶­à¶­à·Šà¶´à¶» <xliff:g id="NUMBER_1">%d</xliff:g> කින් à¶±à·à·€à¶­ උත්සහ කරන්න."</string>
+ <string name="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="6216672706545696955">"ඔබ PIN අංකය <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" product="tablet" msgid="9191611984625460820">"ඔබ à·€à·à¶»à¶¯à·’යට <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_failed_attempts_almost_glogin" product="default" msgid="2590227559763762751">"ඔබ à·€à·à¶»à¶¯à·’යට <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_failed_attempts_almost_at_wipe" product="tablet" msgid="6128106399745755604">"ඔබ à¶§à·à¶¶à·Šà¶½à¶§à¶º අගුළු à·„à·à¶»à·“මට à·€à·à¶»à¶¯à·’යට අවස්ථ෠<xliff:g id="NUMBER_0">%d</xliff:g> à¶šà·Š à¶‹à¶­à·Šà·ƒà·à·„ à¶šà¶» ඇත. අවස්ථ෠<xliff:g id="NUMBER_1">%d</xliff:g> à¶šà·Š à¶…à·ƒà·à¶»à·Šà¶®à¶šà·€ උත්සහ කිරීමකින් පසුව, à¶§à·à¶¶à·Šà¶½à¶§à¶º කර්මà·à¶±à·Šà¶­ à·à·à¶½à· මුල් තත්වයට à¶±à·à·€à¶­ à¶´à¶­à·Š වන à¶…à¶­à¶» සියලු පරිà·à·“ලක දත්ත à¶±à·à¶­à·’ වෙයි."</string>
+ <string name="lockscreen_failed_attempts_almost_at_wipe" product="default" msgid="8603565142156826565">"ඔබ දුරකථනය අගුළු ඇරීමට à·€à·à¶» <xliff:g id="NUMBER_0">%d</xliff:g> කදී à·€à·à¶»à¶¯à·“ à¶´à·Šâ€à¶»à¶ºà¶­à·Šà¶±à¶ºà¶±à·Š ගෙන à¶­à·’à¶¶à·š. තවත් à¶…à·ƒà·à¶»à·Šà¶®à¶š à¶´à·Šâ€à¶»à¶ºà¶­à·Šà¶± <xliff:g id="NUMBER_1">%d</xliff:g> කින් පසුව, දුරකථනය කර්මà·à¶±à·Šà¶­à·à·à¶½à·à·€à·š පෙරනිමියට යළි පිහිටුවන à¶…à¶­à¶» සියලුම පරිà·à·“ලක දත්ත à¶±à·à¶­à·’ වී යයි."</string>
+ <string name="lockscreen_failed_attempts_now_wiping" product="tablet" msgid="280873516493934365">"à¶§à·à¶¶à·Šà¶½à¶§à¶ºà·š අගුළු ඇරීමට ඔබ à·€à·à¶»à¶¯à·’ à¶´à·Šâ€à¶»à¶ºà¶­à·Šà¶± <xliff:g id="NUMBER">%d</xliff:g> à·€à·à¶»à¶ºà¶šà·Š ගෙන ඇත. දà·à¶±à·Š à¶§à·à¶¶à·Šà¶½à¶§à¶º කර්මà·à¶±à·Šà¶­à·à·à¶½à· සුපුරුද්ද වෙත යළි පිහිටුවීම කෙරේ."</string>
+ <string name="lockscreen_failed_attempts_now_wiping" product="default" msgid="3025504721764922246">"ඔබ දුරකථනය අගුළු ඇරීමට à·€à·à¶» <xliff:g id="NUMBER">%d</xliff:g> කදී à·€à·à¶»à¶¯à·“ à¶´à·Šâ€à¶»à¶ºà¶­à·Šà¶±à¶ºà¶±à·Š ගෙන à¶­à·’à¶¶à·š. දà·à¶±à·Š දුරකථනය කර්මà·à¶±à·Šà¶­à·à·à¶½à· පෙරනිමියට පිහිටුවනු ලබයි."</string>
+ <string name="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"à¶­à¶­à·Šà¶´à¶» <xliff:g id="NUMBER">%d</xliff:g> කින් à¶±à·à·€à¶­ à¶‹à¶­à·Šà·ƒà·à·„ කරන්න."</string>
+ <string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"රටà·à·€ අමතකද?"</string>
+ <string name="lockscreen_glogin_forgot_pattern" msgid="2588521501166032747">"ගිණුමේ අගුළු අරින්න"</string>
+ <string name="lockscreen_glogin_too_many_attempts" msgid="2751368605287288808">"රට෠උත්සà·à·„ කිරීම් à·€à·à¶©à·’ය"</string>
+ <string name="lockscreen_glogin_instructions" msgid="3931816256100707784">"අගුළු à·„à·à¶»à·“මට, ඔබගේ Google ගිණුම සමග පුරනය වන්න."</string>
+ <string name="lockscreen_glogin_username_hint" msgid="8846881424106484447">"පරිà·à·“ලක à¶±à·à¶¸à¶º (à¶Š-à¶­à·à¶´à·‘à¶½)"</string>
+ <string name="lockscreen_glogin_password_hint" msgid="5958028383954738528">"මුරපදය"</string>
+ <string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"පුරනය වෙන්න"</string>
+ <string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"වලංගු නොවන පරිà·à·“ලක à¶±à·à¶¸à¶ºà¶šà·Š හ෠මුරපදයක්."</string>
+ <string name="lockscreen_glogin_account_recovery_hint" msgid="1696924763690379073">"ඔබගේ පරිà·à·“ලක à¶±à·à¶¸à¶º හ෠මුරපදය අමතකද?\n "<b>"google.com/accounts/recovery"</b>" වෙත යන්න."</string>
+ <string name="lockscreen_glogin_checking_password" msgid="7114627351286933867">"පරික්ෂ෠කරමින්..."</string>
+ <string name="lockscreen_unlock_label" msgid="737440483220667054">"අඟුල අරින්න"</string>
+ <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"à·à¶¶à·Šà¶¯à¶º සක්â€à¶»à·“ය කරන්න"</string>
+ <string name="lockscreen_sound_off_label" msgid="996822825154319026">"à·à·Šâ€à¶»à·€à·Šâ€à¶º à¶…à¶šà·Šâ€à¶»à·’ය කරන්න"</string>
+ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"රටà·à·€ අරඹන ලදි"</string>
+ <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"රටà·à·€ හිස් කරන ලදි"</string>
+ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"කොටුවක් එකතු කරන ලදි"</string>
+ <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"රටà·à·€ සම්පූර්ණයි"</string>
+ <!-- String.format failed for translation -->
+ <!-- no translation found for keyguard_accessibility_widget_changed (5678624624681400191) -->
+ <skip />
+ <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"විජටය එකතු කරන්න."</string>
+ <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"හිස්"</string>
+ <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"අගුළු අරින à¶´à·Šâ€à¶»à¶¯à·šà·à¶º විදහ෠ඇත."</string>
+ <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"අගුළු අරින à¶´à·Šâ€à¶»à¶¯à·šà·à¶º à·„à·à¶šà·’ලී ඇත."</string>
+ <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> විජට්."</string>
+ <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"පරිà·à·“ලක à¶­à·à¶»à¶±à·Šà¶±à·"</string>
+ <string name="keyguard_accessibility_status" msgid="8008264603935930611">"තත්වය"</string>
+ <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"à¶šà·à¶¸à¶»à·à·€"</string>
+ <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"මà·à¶°à·Šâ€à¶º à¶´à·à¶½à¶š"</string>
+ <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"විජටය à¶±à·à·€à¶­ අනුපිළිවෙළට à·ƒà·à¶šà·ƒà·’ම ඇරඹුණි."</string>
+ <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"විජට් à¶±à·à·€à¶­ අනුපිළිවෙලට à·ƒà·à¶šà·ƒà·“ම අවසà·à¶±à¶º."</string>
+ <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> විජටය මà·à¶šà·“ ඇත."</string>
+ <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"අගුළු නොදà·à¶¸à·– à¶´à·Šâ€à¶»à¶¯à·šà·à¶º පුළුල් කරන්න."</string>
+ <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"සර්පණ අගුළු ඇරීම."</string>
+ <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"රට෠අගුළු ඇරීම."</string>
+ <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"මුහුණ à¶·à·à·€à·’තයෙන් අඟුළු à·„à·à¶»à·“ම."</string>
+ <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"PIN අගුළු ඇරීම."</string>
+ <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"මුරපද අගුළු ඇරීම."</string>
+ <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"රට෠ප්â€à¶»à¶¯à·šà·à¶º."</string>
+ <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"සර්පණ à¶´à·Šâ€à¶»à¶¯à·šà·à¶º."</string>
+ <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
+ <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
+ <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
+ <string name="granularity_label_character" msgid="7336470535385009523">"අක්ෂරය"</string>
+ <string name="granularity_label_word" msgid="7075570328374918660">"වචනය"</string>
+ <string name="granularity_label_link" msgid="5815508880782488267">"සබà·à¶³à·’ය"</string>
+ <string name="granularity_label_line" msgid="5764267235026120888">"රේඛà·à·€"</string>
+ <string name="hour_ampm" msgid="4584338083529355982">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
+ <string name="hour_cap_ampm" msgid="2083465992940444366">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
+ <string name="factorytest_failed" msgid="5410270329114212041">"කර්මà·à¶±à·Šà¶­ à·à·à¶½à· පරීක්ෂණය à¶…à·ƒà·à¶»à·Šà¶®à¶šà¶ºà·’"</string>
+ <string name="factorytest_not_system" msgid="4435201656767276723">"FACTORY_TEST à¶šà·Šâ€à¶»à·’යà·à·€ /system/app à·„à·’ ස්ථà·à¶´à·’à¶­ à¶´à·à¶šà·šà¶¢ සඳහ෠පමණක් සහය දක්වයි."</string>
+ <string name="factorytest_no_action" msgid="872991874799998561">"FACTORY_TEST à¶šà·Šâ€à¶»à·’යà·à·€ ලබà·à¶¯à·™à¶± à¶´à·à¶šà·šà¶¢à¶ºà¶šà·Š සොයà·à¶œà¶­ නොහà·à¶šà·’ විය."</string>
+ <string name="factorytest_reboot" msgid="6320168203050791643">"පුනරà·à¶»à¶¸à·Šà¶· කරන්න"</string>
+ <string name="js_dialog_title" msgid="1987483977834603872">"\"<xliff:g id="TITLE">%s</xliff:g>\" හි ඇති පිටුව කියන්නේ:"</string>
+ <string name="js_dialog_title_default" msgid="6961903213729667573">"à¶¢à·à·€à·à·ƒà·Šà¶šà·Šâ€à¶»à·’à¶´à·Šà¶§à·Š"</string>
+ <string name="js_dialog_before_unload_title" msgid="2619376555525116593">"සංචලනය තහවුරු කරන්න"</string>
+ <string name="js_dialog_before_unload_positive_button" msgid="3112752010600484130">"මෙම පිටුවෙන් ඉවත් වන්න"</string>
+ <string name="js_dialog_before_unload_negative_button" msgid="5614861293026099715">"මෙම පිටුවෙහි ඉන්න"</string>
+ <string name="js_dialog_before_unload" msgid="3468816357095378590">"<xliff:g id="MESSAGE">%s</xliff:g>\n\nඔබට මෙම පිටුවෙන් සංචලනය කිරීමට à¶…à·€à·à·Šâ€à¶º බවට ඔබට විà·à·Šà·€à·à·ƒà¶¯?"</string>
+ <string name="save_password_label" msgid="6860261758665825069">"තහවුරු කරන්න"</string>
+ <string name="double_tap_toast" msgid="4595046515400268881">"උපදෙස: විà·à·à¶½à¶±à¶º කිරීමට සහ කුඩ෠කිරීමට දෙවරක් à¶­à¶§à·Šà¶§à·” කරන්න."</string>
+ <string name="autofill_this_form" msgid="4616758841157816676">"ස්වයංක්â€à¶»à·’ය පිරවුම"</string>
+ <string name="setup_autofill" msgid="7103495070180590814">"ස්වයංක්â€à¶»à·’ය පිරවුම සකසන්න"</string>
+ <string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
+ <string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
+ <string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
+ <string name="autofill_address_summary_format" msgid="4874459455786827344">"$1$2$3"</string>
+ <string name="autofill_province" msgid="2231806553863422300">"à¶´à·…à·à¶­"</string>
+ <string name="autofill_postal_code" msgid="4696430407689377108">"à¶­à·à¶´à·à¶½à·Š කේතය"</string>
+ <string name="autofill_state" msgid="6988894195520044613">"ජනපදය"</string>
+ <string name="autofill_zip_code" msgid="8697544592627322946">"ZIP කේතය"</string>
+ <string name="autofill_county" msgid="237073771020362891">"à¶´à·Šâ€à¶»à·à¶±à·Šà¶­à¶º"</string>
+ <string name="autofill_island" msgid="4020100875984667025">"දූපත"</string>
+ <string name="autofill_district" msgid="8400735073392267672">"දිස්ත්â€à¶»à·’ක්කය"</string>
+ <string name="autofill_department" msgid="5343279462564453309">"දෙපà·à¶»à·Šà¶­à¶¸à·šà¶±à·Šà¶­à·”à·€"</string>
+ <string name="autofill_prefecture" msgid="2028499485065800419">"à¶´à·Šâ€à¶»à·à¶±à·Šà¶­à¶º"</string>
+ <string name="autofill_parish" msgid="8202206105468820057">"à¶šà·à¶»à¶½à¶º"</string>
+ <string name="autofill_area" msgid="3547409050889952423">"à¶´à·Šâ€à¶»à¶¯à·šà·à¶º"</string>
+ <string name="autofill_emirate" msgid="2893880978835698818">"එමිරේට්"</string>
+ <string name="permlab_readHistoryBookmarks" msgid="3775265775405106983">"ඔබගේ වෙබ් පිටුසන් සහ ඉතිහà·à·ƒà¶º කියවීම"</string>
+ <string name="permdesc_readHistoryBookmarks" msgid="8462378226600439658">"à¶¶à·Šâ€à¶»à·€à·Šà·ƒà¶»à¶º à¶±à·à¶»à¶¹à·– සියලු URL සහ සියලු à¶¶à·Šâ€à¶»à·€à·Šà·ƒà¶» පිටුසන් වල ඉතිහà·à·ƒà¶º කියවීමට යෙදුමට අවසර දෙන්න. සටහන: වෙබ් à¶¶à·Šâ€à¶»à·€à·Šà·ƒà¶» à¶…à·€à·à·Šâ€à¶ºà¶­à· සමග තෙවෙනි à¶´à·à¶»à·Šà·à·€ à¶¶à·Šâ€à¶»à·€à·Šà·ƒà¶» වලට හ෠වෙනත් යෙදුම්වලට මෙම අවසරය à¶¶à¶½ නොදෙයි."</string>
+ <string name="permlab_writeHistoryBookmarks" msgid="3714785165273314490">"වෙබ් පිටුසන් සහ ඉතිහà·à·ƒà¶ºà¶§ ලිවිම"</string>
+ <string name="permdesc_writeHistoryBookmarks" product="tablet" msgid="6825527469145760922">"ඔබගේ à¶§à·à¶¶à·Šà¶½à¶§à¶ºà·š ගබඩ෠කර ඇති à¶¶à·Šâ€à¶»à·€à·Šà·ƒà¶»à¶ºà·š ඉතිහà·à·ƒà¶º හ෠පිටුසන් වෙනස් කිරීමට යෙදුමට අවසර දෙන්න. à¶¶à·Šâ€à¶»à·€à·Šà·ƒà¶» දත්ත මà·à¶šà·“මට හ෠වෙනස් කිරීමට මෙමඟින් යෙදුමට අවසර දෙයි. සටහන: වෙබ් ගවේෂණ à·„à·à¶šà·’යà·à·€ සහිත තෙවෙනි à¶´à·à¶»à·Šà·à·€ à¶¶à·Šâ€à¶»à·€à·Šà·ƒà¶» හ෠වෙනත් යෙදුම් වලින් මෙම අවසරයට à¶¶à¶½ නොකරයි."</string>
+ <string name="permdesc_writeHistoryBookmarks" product="default" msgid="8497389531014185509">"ඔබගේ දුරකථනයේ ආචයනය කරන ලද à¶¶à·Šâ€à¶»à·€à·Šà·ƒà¶» ඉතිහà·à·ƒà¶º හ෠පිටුසන වෙනස් කිරීමට යෙදුමට අවසර දෙන්න. ඔබගේ à¶¶à·Šâ€à¶»à·€à·Šà·ƒà¶» දත්ත මà·à¶šà·“මට හ෠වෙනස් කිරීමට අනිෂ්ට යෙදුම් මෙය à¶·à·à·€à·’à¶­ කරයි. සටහන: වෙබ් à¶¶à·Šâ€à¶»à·€à·Šà·ƒà¶» à¶…à·€à·à·Šâ€à¶ºà¶­à·à·€à¶º සමග තෙවෙනි à¶´à·à¶»à·Šà·à·€ à¶¶à·Šâ€à¶»à·€à·Šà·ƒà¶» හ෠වෙනත් යෙදුම් විසින් මෙම අවසරය à¶¶à¶½ à¶œà·à¶±à·Šà·€à·’ය à·„à·à¶š."</string>
+ <string name="permlab_setAlarm" msgid="1379294556362091814">"සීනුවක් à·ƒà·à¶šà·ƒà·“ම"</string>
+ <string name="permdesc_setAlarm" msgid="316392039157473848">"ස්ථà·à¶´à¶±à¶º කරන ලද සීනු ඔරලà·à·ƒà·” යෙදුමේ සීනුව සකස් කරන්නට යෙදුමට ඉඩ දෙන්න. ඇතà·à¶¸à·Š සීනු ඔරලà·à·ƒà·” යෙදුම් මෙම අංගය à¶šà·Šâ€à¶»à·’යà·à·€à¶§ නංව෠නොතිබීමට ඉඩ à¶­à·’à¶¶à·š."</string>
+ <string name="permlab_addVoicemail" msgid="5525660026090959044">"හඬ à¶­à·à¶´à·‘à¶½ à¶‘à¶šà·Š කිරීම"</string>
+ <string name="permdesc_addVoicemail" msgid="6604508651428252437">"ඔබගේ හඬ à¶­à·à¶´à·‘ලේ à¶‘à¶± ලිපි වෙත à¶‘à¶± පණිවිඩ à¶‘à¶šà¶­à·” කිරීමට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_writeGeolocationPermissions" msgid="5962224158955273932">"à¶¶à·Šâ€à¶»à·€à·Šà·ƒà¶»à¶ºà·š à¶·à·– අවසර වෙනස් කිරීම"</string>
+ <string name="permdesc_writeGeolocationPermissions" msgid="1083743234522638747">"à¶¶à·Šâ€à¶»à·€à·”සරයේ à¶·à·– ස්ථà·à¶±à·“ය අවසර වෙනස් කිරීමට යෙදුමට අවසර දෙන්න. අභිමත වෙබ් අඩවි වලට ස්ථà·à¶±à·“ය තොරතුරු යà·à·€à·“මට අනිෂ්ට යෙදුම් මෙය à¶·à·à·€à·’ත෠කෙරේ."</string>
+ <string name="permlab_packageVerificationAgent" msgid="5568139100645829117">"à¶´à·à¶šà·šà¶¢ සත්â€à¶ºà·à¶´à¶±à¶º කරන්න"</string>
+ <string name="permdesc_packageVerificationAgent" msgid="8437590190990843381">"ස්ථà·à¶´à·’à¶­ කොට ඇති à¶´à·à¶šà·šà¶¢à¶ºà¶šà·Š සත්â€à¶ºà·à¶´à¶±à¶ºà¶§ යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_bindPackageVerifier" msgid="4187786793360326654">"à¶´à·à¶šà·šà¶¢ සත්â€à¶ºà·à¶´à¶šà¶ºà¶šà·Š වෙත බඳින්න"</string>
+ <string name="permdesc_bindPackageVerifier" msgid="3180741773233862126">"à¶´à·à¶šà·šà¶¢ සත්â€à¶ºà·à¶´à¶š ඉල්ලීම් වලට දරන්නà·à¶§ ඉඩ ලබ෠දේ. à·ƒà·à¶¸à·à¶±à·Šâ€à¶º යෙදුම් සඳහ෠කිසිසේත් à¶…à·€à·à·Šâ€à¶º නොවේ."</string>
+ <string name="permlab_serialPort" msgid="546083327654631076">"à·à·Šâ€à¶»à·šà¶«à·’ගත පොට à¶´à·Šâ€à¶»à·€à·šà· කිරීම"</string>
+ <string name="permdesc_serialPort" msgid="2991639985224598193">"SerialManager API à¶·à·à·€à·’තයෙන් අනුක්â€à¶»à¶¸ තොට වෙත à¶´à·Šâ€à¶»à·€à·šà· වීමට රඳවනයට අවසර දෙන්න."</string>
+ <string name="permlab_accessContentProvidersExternally" msgid="5077774297943409285">"à¶¶à·à·„à·’à¶» අන්තර්ගත à·ƒà·à¶´à¶ºà·”ම්කරුවන් වෙත à¶´à·Šâ€à¶»à·€à·šà·à¶º"</string>
+ <string name="permdesc_accessContentProvidersExternally" msgid="4544346486697853685">"අන්තර්ගත සපයන්නන්ට à¶´à·Šâ€à¶»à·€à·šà· වීමට දරන්නන්ට ෂෙල් à¶‘à¶šà·š සිට à¶´à·Šâ€à¶»à·€à·šà· වීමට අවසර දෙන්න. à·ƒà·à¶¸à·à¶±à·Šâ€à¶º යෙදුම් සඳහ෠කිසිසේත් අදà·à·… නොවේ."</string>
+ <string name="permlab_updateLock" msgid="3527558366616680889">"ස්වයංක්â€à¶»à·“ය à¶‹à¶´à·à¶‚à¶œ යවත්කà·à¶½ කිරීම් පසුබට කරන්න"</string>
+ <string name="permdesc_updateLock" msgid="1655625832166778492">"à¶‹à¶´à·à¶‚ගය à¶‹à¶­à·Šà·à·Šâ€à¶»à·šà¶«à·’කරණයට අන්තර්ක්â€à¶»à·’යà·à¶šà·à¶»à·“ නොවන යළි ඇරඹීමක් සඳහ෠සුදුසු වෙලà·à·€ කුමක්ද යන්න à¶œà·à¶± පද්ධතියට තොරතුරු ලබà·à¶¯à·“මට දරන්නà·à¶§ අවසර දෙන්න."</string>
+ <string name="save_password_message" msgid="767344687139195790">"à¶¶à·Šâ€à¶»à·€à·Šà·ƒà¶»à¶ºà¶§ මෙම මුරපදය මතක à¶­à¶¶à· à¶œà·à¶±à·“මට ඔබට à¶…à·€à·à·Šâ€à¶ºà¶¯?"</string>
+ <string name="save_password_notnow" msgid="6389675316706699758">"දà·à¶±à·Š නොවේ"</string>
+ <string name="save_password_remember" msgid="6491879678996749466">"මතක තබ෠ගන්න"</string>
+ <string name="save_password_never" msgid="8274330296785855105">"කවදà·à·€à¶­à·Š නොවේ"</string>
+ <string name="open_permission_deny" msgid="7374036708316629800">"මෙම පිටුව විවෘත කිරීමට ඔබට අවසර à¶±à·à¶­."</string>
+ <string name="text_copied" msgid="4985729524670131385">"පෙළ පසුරු පුවරුවට පිටපත් කරන ලදි."</string>
+ <string name="more_item_label" msgid="4650918923083320495">"à¶­à·€"</string>
+ <string name="prepend_shortcut_label" msgid="2572214461676015642">"මෙනුව+"</string>
+ <string name="menu_space_shortcut_label" msgid="2410328639272162537">"space"</string>
+ <string name="menu_enter_shortcut_label" msgid="2743362785111309668">"ඇතුල් කරන්න"</string>
+ <string name="menu_delete_shortcut_label" msgid="3658178007202748164">"මකන්න"</string>
+ <string name="search_go" msgid="8298016669822141719">"සෙවීම"</string>
+ <string name="searchview_description_search" msgid="6749826639098512120">"සෙවීම"</string>
+ <string name="searchview_description_query" msgid="5911778593125355124">"සෙවුම් විමසුම"</string>
+ <string name="searchview_description_clear" msgid="1330281990951833033">"විමසුම හිස් කරන්න"</string>
+ <string name="searchview_description_submit" msgid="2688450133297983542">"විමසුම යොමු කරන්න"</string>
+ <string name="searchview_description_voice" msgid="2453203695674994440">"හඬ සෙවීම"</string>
+ <string name="enable_explore_by_touch_warning_title" msgid="7460694070309730149">"ස්පර්෠කිරීමෙන් ගවේෂණය සබල කරන්න ද?"</string>
+ <string name="enable_explore_by_touch_warning_message" product="tablet" msgid="8655887539089910577">"ස්පර්à·à¶º වෙතින් ගවේෂණය සක්â€à¶»à·’ය කිරීමට <xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> à¶§ à¶…à·€à·à·Šâ€à¶ºà¶º. ස්පර්à·à¶º වෙතින් ගවේෂණය සක්â€à¶»à·’ය විට, ඔබගේ ඇඟිලිවලට à¶´à·„à·… විස්තර ඇසිය à·„à· à¶¶à·à¶½à·’ය à·„à·à¶š à·„à· à¶§à·à¶¶à·Šà¶½à¶§à¶º සමග අන්තර් à¶šà·Šâ€à¶»à·’යà·à¶šà·à¶»à·“ වීමට ඉංගිති සිදු à¶šà·… à·„à·à¶š."</string>
+ <string name="enable_explore_by_touch_warning_message" product="default" msgid="2708199672852373195">"ස්පර්à·à¶º වෙතින් ගවේෂණය සක්â€à¶»à·’ය කිරීමට <xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> à¶§ à¶…à·€à·à·Šâ€à¶ºà¶ºà·’. ස්පර්à·à¶º වෙතින් ගවේෂණය සක්â€à¶»à·’ය විට, ඔබගේ ඇඟිලිවලට à¶´à·„à·… විස්තර ඇසිය à·„à· à¶¶à·à¶½à·’ය à·„à·à¶š හ෠දුරකථනය සමග අන්තර් à¶šà·Šâ€à¶»à·’යà·à¶šà·à¶»à·“ වීමට ඉංගිති සිදු à¶šà·… à·„à·à¶š."</string>
+ <string name="oneMonthDurationPast" msgid="7396384508953779925">"මà·à·ƒ 1 à¶šà¶§ පෙර"</string>
+ <string name="beforeOneMonthDurationPast" msgid="909134546836499826">"මà·à·ƒ 1 à¶šà¶§ පෙර"</string>
+ <plurals name="num_seconds_ago">
+ <item quantity="one" msgid="4869870056547896011">"තත්පර 1 කට පෙර"</item>
+ <item quantity="other" msgid="3903706804349556379">"තත්පර <xliff:g id="COUNT">%d</xliff:g> ට පෙර"</item>
+ </plurals>
+ <plurals name="num_minutes_ago">
+ <item quantity="one" msgid="3306787433088810191">"මිනිත්තු 1 ට පෙර"</item>
+ <item quantity="other" msgid="2176942008915455116">"මිනිත්තු <xliff:g id="COUNT">%d</xliff:g> කට පෙර"</item>
+ </plurals>
+ <plurals name="num_hours_ago">
+ <item quantity="one" msgid="9150797944610821849">"à¶´à·à¶º 1 à¶šà¶§ පෙර"</item>
+ <item quantity="other" msgid="2467273239587587569">"à¶´à·à¶º <xliff:g id="COUNT">%d</xliff:g> à¶šà¶§ පෙර"</item>
+ </plurals>
+ <plurals name="last_num_days">
+ <item quantity="other" msgid="3069992808164318268">"අන්තිම දවස් <xliff:g id="COUNT">%d</xliff:g>"</item>
+ </plurals>
+ <string name="last_month" msgid="3959346739979055432">"අවසà·à¶± මà·à·ƒà¶º"</string>
+ <string name="older" msgid="5211975022815554840">"පරණ"</string>
+ <plurals name="num_days_ago">
+ <item quantity="one" msgid="861358534398115820">"ඊයේ"</item>
+ <item quantity="other" msgid="2479586466153314633">"දින <xliff:g id="COUNT">%d</xliff:g> කට පෙර"</item>
+ </plurals>
+ <plurals name="in_num_seconds">
+ <item quantity="one" msgid="2729745560954905102">"තත්පර 1 කින්"</item>
+ <item quantity="other" msgid="1241926116443974687">"තත්පර <xliff:g id="COUNT">%d</xliff:g> කදී"</item>
+ </plurals>
+ <plurals name="in_num_minutes">
+ <item quantity="one" msgid="8793095251325200395">"මිනිත්තු 1 කදී"</item>
+ <item quantity="other" msgid="3330713936399448749">"මිනිත්තු <xliff:g id="COUNT">%d</xliff:g> ක් තුළ"</item>
+ </plurals>
+ <plurals name="in_num_hours">
+ <item quantity="one" msgid="7164353342477769999">"à¶´à·à¶º 1 à¶šà·Š තුළ"</item>
+ <item quantity="other" msgid="547290677353727389">"à¶´à·à¶º <xliff:g id="COUNT">%d</xliff:g> à¶šà·Š තුළ"</item>
+ </plurals>
+ <plurals name="in_num_days">
+ <item quantity="one" msgid="5413088743009839518">"හෙට"</item>
+ <item quantity="other" msgid="5109449375100953247">"දින <xliff:g id="COUNT">%d</xliff:g> ක් තුළ"</item>
+ </plurals>
+ <plurals name="abbrev_num_seconds_ago">
+ <item quantity="one" msgid="1849036840200069118">"තත්පර 1 කට පෙර"</item>
+ <item quantity="other" msgid="3699169366650930415">"තත්පර <xliff:g id="COUNT">%d</xliff:g> කට පෙර"</item>
+ </plurals>
+ <plurals name="abbrev_num_minutes_ago">
+ <item quantity="one" msgid="6361490147113871545">"මිනිත්තු 1 කට පෙර"</item>
+ <item quantity="other" msgid="851164968597150710">"මිනිත්තු <xliff:g id="COUNT">%d</xliff:g> ට පෙර"</item>
+ </plurals>
+ <plurals name="abbrev_num_hours_ago">
+ <item quantity="one" msgid="4796212039724722116">"à¶´à·à¶º 1 à¶šà¶§ පෙර"</item>
+ <item quantity="other" msgid="6889970745748538901">"à¶´à·à¶º <xliff:g id="COUNT">%d</xliff:g> à¶§ පෙර"</item>
+ </plurals>
+ <plurals name="abbrev_num_days_ago">
+ <item quantity="one" msgid="8463161711492680309">"ඊයේ"</item>
+ <item quantity="other" msgid="3453342639616481191">"දින <xliff:g id="COUNT">%d</xliff:g> ට පෙර"</item>
+ </plurals>
+ <plurals name="abbrev_in_num_seconds">
+ <item quantity="one" msgid="5842225370795066299">"තත්පර 1 ක් තුළ"</item>
+ <item quantity="other" msgid="5495880108825805108">"තත්පර <xliff:g id="COUNT">%d</xliff:g> ක් තුළ"</item>
+ </plurals>
+ <plurals name="abbrev_in_num_minutes">
+ <item quantity="one" msgid="562786149928284878">"මිනිත්තු 1 ක් තුළ"</item>
+ <item quantity="other" msgid="4216113292706568726">"මිනිත්තු <xliff:g id="COUNT">%d</xliff:g> ක් තුළ"</item>
+ </plurals>
+ <plurals name="abbrev_in_num_hours">
+ <item quantity="one" msgid="3274708118124045246">"à¶´à·à¶º 1 à¶šà·Š තුළ"</item>
+ <item quantity="other" msgid="3705373766798013406">"à¶´à·à¶º <xliff:g id="COUNT">%d</xliff:g> à¶šà·Š තුළ"</item>
+ </plurals>
+ <plurals name="abbrev_in_num_days">
+ <item quantity="one" msgid="2178576254385739855">"හෙට"</item>
+ <item quantity="other" msgid="2973062968038355991">"දින <xliff:g id="COUNT">%d</xliff:g> ක් තුළ"</item>
+ </plurals>
+ <string name="preposition_for_date" msgid="9093949757757445117">"<xliff:g id="DATE">%s</xliff:g> වන දà·"</string>
+ <string name="preposition_for_time" msgid="5506831244263083793">"<xliff:g id="TIME">%s</xliff:g> à¶§"</string>
+ <string name="preposition_for_year" msgid="5040395640711867177">"<xliff:g id="YEAR">%s</xliff:g> තුළ"</string>
+ <string name="day" msgid="8144195776058119424">"දවස"</string>
+ <string name="days" msgid="4774547661021344602">"දින"</string>
+ <string name="hour" msgid="2126771916426189481">"à¶´à·à¶º"</string>
+ <string name="hours" msgid="894424005266852993">"à¶´à·à¶º"</string>
+ <string name="minute" msgid="9148878657703769868">"min"</string>
+ <string name="minutes" msgid="5646001005827034509">"මිනිත්තු"</string>
+ <string name="second" msgid="3184235808021478">"à¶­à¶­à·Š"</string>
+ <string name="seconds" msgid="3161515347216589235">"à¶­à¶­à·Šà¶´à¶»"</string>
+ <string name="week" msgid="5617961537173061583">"සතිය"</string>
+ <string name="weeks" msgid="6509623834583944518">"සති"</string>
+ <string name="year" msgid="4001118221013892076">"අවුරුද්ද"</string>
+ <string name="years" msgid="6881577717993213522">"අවුරුදු"</string>
+ <plurals name="duration_seconds">
+ <item quantity="one" msgid="6962015528372969481">"à¶­à¶­à·Šà¶´à¶» 1"</item>
+ <item quantity="other" msgid="1886107766577166786">"à¶­à¶­à·Šà¶´à¶» <xliff:g id="COUNT">%d</xliff:g>"</item>
+ </plurals>
+ <plurals name="duration_minutes">
+ <item quantity="one" msgid="4915414002546085617">"මිනිත්තු 1"</item>
+ <item quantity="other" msgid="3165187169224908775">"මිනිත්තු <xliff:g id="COUNT">%d</xliff:g>"</item>
+ </plurals>
+ <plurals name="duration_hours">
+ <item quantity="one" msgid="8917467491248809972">"à¶´à·à¶º 1"</item>
+ <item quantity="other" msgid="3863962854246773930">"à¶´à·à¶º <xliff:g id="COUNT">%d</xliff:g> à¶šà·Š"</item>
+ </plurals>
+ <string name="VideoView_error_title" msgid="3534509135438353077">"වීඩිය෠ගà·à¶§à¶½à·”à·€"</string>
+ <string name="VideoView_error_text_invalid_progressive_playback" msgid="3186670335938670444">"මේ වීඩියà·à·€ මෙම à¶‹à¶´à·à¶‚ගයට à¶´à·Šâ€à¶»à·€à·à·„නය සඳහ෠වලංගු à¶±à·à¶­."</string>
+ <string name="VideoView_error_text_unknown" msgid="3450439155187810085">"මෙම වීඩියà·à·€ à¶°à·à·€à¶±à¶º à¶šà·… නොහà·à¶š."</string>
+ <string name="VideoView_error_button" msgid="2822238215100679592">"හරි"</string>
+ <string name="relative_time" msgid="1818557177829411417">"<xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="noon" msgid="7245353528818587908">"මධ්â€à¶ºà·„නය"</string>
+ <string name="Noon" msgid="3342127745230013127">"මධ්â€à¶ºà·à·„නය"</string>
+ <string name="midnight" msgid="7166259508850457595">"මධ්â€à¶ºà¶¸ à¶»à·à¶­à·Šâ€à¶»à·’ය"</string>
+ <string name="Midnight" msgid="5630806906897892201">"මධ්â€à¶ºà¶¸ à¶»à·à¶­à·Šâ€à¶»à·’ය"</string>
+ <string name="elapsed_time_short_format_mm_ss" msgid="4431555943828711473">"<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" msgid="1846071997616654124">"<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" msgid="6876518925844129331">"සියල්ල à¶­à·à¶»à¶±à·Šà¶±"</string>
+ <string name="cut" msgid="3092569408438626261">"කපන්න"</string>
+ <string name="copy" msgid="2681946229533511987">"පිටපත් කරන්න"</string>
+ <string name="paste" msgid="5629880836805036433">"අලවන්න"</string>
+ <string name="replace" msgid="5781686059063148930">"à¶´à·Šâ€à¶»à¶­à·’ස්ථà·à¶´à¶±à¶º කරන්න..."</string>
+ <string name="delete" msgid="6098684844021697789">"මකන්න"</string>
+ <string name="copyUrl" msgid="2538211579596067402">"URL පිටපත් කරන්න"</string>
+ <string name="selectTextMode" msgid="1018691815143165326">"පෙළ à¶­à·à¶»à¶±à·Šà¶±"</string>
+ <string name="textSelectionCABTitle" msgid="5236850394370820357">"පෙළ තේරීම"</string>
+ <string name="addToDictionary" msgid="4352161534510057874">"à·à¶¶à·Šà¶¯ à¶šà·à·‚යට à¶‘à¶šà¶­à·” කරන්න"</string>
+ <string name="deleteText" msgid="6979668428458199034">"මකන්න"</string>
+ <string name="inputMethod" msgid="1653630062304567879">"ආදà·à¶± à¶šà·Šâ€à¶»à¶¸à¶º"</string>
+ <string name="editTextMenuTitle" msgid="4909135564941815494">"පෙළ à¶šà·Šâ€à¶»à·’යà·à·€à¶±à·Š"</string>
+ <string name="low_internal_storage_view_title" msgid="5576272496365684834">"ආචයනය ඉඩ à¶´à·Šâ€à¶»à¶¸à·à¶«à¶º à¶…à¶©à·” වී ඇත"</string>
+ <string name="low_internal_storage_view_text" msgid="6640505817617414371">"සමහර පද්ධති à¶šà·à¶»à·Šà¶ºà¶ºà¶±à·Š à¶šà·Šâ€à¶»à·’ය෠නොකරනු ඇත"</string>
+ <string name="app_running_notification_title" msgid="8718335121060787914">"<xliff:g id="APP_NAME">%1$s</xliff:g> à¶°à·à·€à¶±à¶º වේ"</string>
+ <string name="app_running_notification_text" msgid="4653586947747330058">"à·€à·à¶©à·’පුර තොරතුරු හ෠යෙදුම à¶±à·à·€à¶­à·“ම සඳහ෠ස්පර්෠කරන්න."</string>
+ <string name="ok" msgid="5970060430562524910">"හරි"</string>
+ <string name="cancel" msgid="6442560571259935130">"අවලංගු කරන්න"</string>
+ <string name="yes" msgid="5362982303337969312">"හරි"</string>
+ <string name="no" msgid="5141531044935541497">"අවලංගු කරන්න"</string>
+ <string name="dialog_alert_title" msgid="2049658708609043103">"අවධà·à¶±à¶º"</string>
+ <string name="loading" msgid="7933681260296021180">"පූරණය වෙමින්..."</string>
+ <string name="capital_on" msgid="1544682755514494298">"සක්â€à¶»à·“යයි"</string>
+ <string name="capital_off" msgid="6815870386972805832">"à¶…à¶šà·Šâ€à¶»à·’ය කරන්න"</string>
+ <string name="whichApplication" msgid="4533185947064773386">"à¶´à·„à¶­ à¶·à·à·€à·’තයෙන් à¶šà·Šâ€à¶»à·’යà·à·€ සම්පූර්ණ කරන්න"</string>
+ <string name="alwaysUse" msgid="4583018368000610438">"මෙම à¶šà·Šâ€à¶»à·’යà·à·€ සඳහ෠සුපුරුද්දෙන් à¶·à·à·€à·’à¶­ කරන්න."</string>
+ <string name="clearDefaultHintMsg" msgid="3252584689512077257">"පද්ධති à·ƒà·à¶šà·ƒà·“ම් &gt; යෙදුම් &gt; à¶¶à·à¶œà·à¶±à·“ම් තුළ ඇති සුපුරුද්ද හිස් කරන්න."</string>
+ <string name="chooseActivity" msgid="7486876147751803333">"à¶šà·Šâ€à¶»à·’යà·à·€à¶šà·Š à¶­à·à¶»à¶±à·Šà¶±"</string>
+ <string name="chooseUsbActivity" msgid="6894748416073583509">"USB à¶‹à¶´à·à¶‚ගය සඳහ෠යෙදුමක් à¶­à·à¶»à¶±à·Šà¶±"</string>
+ <string name="noApplications" msgid="2991814273936504689">"මෙම à¶šà·Šâ€à¶»à·’යà·à·€ සිදු කිරීමට කිසිදු යෙදුමකට නොහà·à¶šà·’ය."</string>
+ <string name="aerr_title" msgid="1905800560317137752"></string>
+ <string name="aerr_application" msgid="932628488013092776">"à¶…à·€à·à·ƒà¶±à·à·€à¶±à·Šà¶­ ලෙස <xliff:g id="APPLICATION">%1$s</xliff:g> à¶±à·à·€à¶­à·“ ඇත."</string>
+ <string name="aerr_process" msgid="4507058997035697579">"à¶…à·€à·à·ƒà¶±à·à·€à¶±à·Šà¶­ ලෙස, <xliff:g id="PROCESS">%1$s</xliff:g> à¶šà·Šâ€à¶»à·’යà·à·€à¶½à·’ය නතර විණි."</string>
+ <string name="anr_title" msgid="4351948481459135709"></string>
+ <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> à¶´à·Šâ€à¶»à¶­à·’à¶ à·à¶» නොදක්වයි.\n\nඔබට එය නතර කිරීමට à¶…à·€à·à·Šâ€à¶ºà¶¯?"</string>
+ <string name="anr_activity_process" msgid="5776209883299089767">"<xliff:g id="ACTIVITY">%1$s</xliff:g> à¶šà·Šâ€à¶»à·’යà·à¶šà·à¶»à¶šà¶¸ à¶´à·Šâ€à¶»à¶­à·’à¶ à·à¶» නොදක්වයි.\n\nඑය වස෠දà·à¶¸à·“මට ඔබට à¶…à·€à·à·Šâ€à¶ºà¶¯?"</string>
+ <string name="anr_application_process" msgid="8941757607340481057">"<xliff:g id="APPLICATION">%1$s</xliff:g> à¶´à·Šâ€à¶»à¶­à·’à¶ à·à¶» නොදක්වයි. එය වස෠දà·à¶¸à·“මට ඔබට à¶…à·€à·à·Šâ€à¶ºà¶¯?"</string>
+ <string name="anr_process" msgid="6513209874880517125">"<xliff:g id="PROCESS">%1$s</xliff:g> à¶šà·Šâ€à¶»à·’යà·à·€à¶½à·’ය à¶´à·Šâ€à¶»à¶­à·’à¶ à·à¶» නොදක්වයි.\n\nඔබට එය නතර කිරීමට à¶…à·€à·à·Šâ€à¶ºà¶¯?"</string>
+ <string name="force_close" msgid="8346072094521265605">"හරි"</string>
+ <string name="report" msgid="4060218260984795706">"à·€à·à¶»à·Šà¶­à·à·€"</string>
+ <string name="wait" msgid="7147118217226317732">"à¶»à·à¶³à·“ සිටින්න"</string>
+ <string name="webpage_unresponsive" msgid="3272758351138122503">"පිටුව à¶´à·Šâ€à¶»à¶­à·’à¶ à·à¶» නොදක්වන තත්වයට පත්වී ඇත.\n\nඔබට එය à·€à·à·ƒà·“මට à¶…à·€à·à·Šâ€à¶ºà¶¯?"</string>
+ <string name="launch_warning_title" msgid="1547997780506713581">"යෙදුම à¶±à·à·€à¶­ හරව෠යව෠ඇත"</string>
+ <string name="launch_warning_replace" msgid="6202498949970281412">"<xliff:g id="APP_NAME">%1$s</xliff:g> දà·à¶±à·Š à¶°à·à·€à¶±à¶º වෙයි."</string>
+ <string name="launch_warning_original" msgid="188102023021668683">"<xliff:g id="APP_NAME">%1$s</xliff:g> මුලින්ම අරඹ෠ඇත."</string>
+ <string name="screen_compat_mode_scale" msgid="3202955667675944499">"පරිමà·à¶«à¶º"</string>
+ <string name="screen_compat_mode_show" msgid="4013878876486655892">"à·ƒà·à¶¸à·€à·’ටම පෙන්වන්න"</string>
+ <string name="screen_compat_mode_hint" msgid="1064524084543304459">"පද්ධති à·ƒà·à¶šà·ƒà·“ම් තුළ මෙය à¶±à·à·€à¶­ à¶šà·Šâ€à¶»à·’යà·à¶­à·Šà¶¸à¶š කරන්න &gt; යෙදුම් &gt; à¶¶à·à¶œà¶±à·Šà¶±à· ලදි."</string>
+ <string name="smv_application" msgid="3307209192155442829">"<xliff:g id="APPLICATION">%1$s</xliff:g> යෙදුම (<xliff:g id="PROCESS">%2$s</xliff:g> à¶šà·Šâ€à¶»à·’යà·à·€à¶½à·’ය) à¶‘à·„à·’ StrictMode කොන්දේසිය උල්ලංà¶à¶±à¶º à¶šà¶» ඇත."</string>
+ <string name="smv_process" msgid="5120397012047462446">"<xliff:g id="PROCESS">%1$s</xliff:g> à¶šà·Šâ€à¶»à·’යà·à·€à¶½à·’ය à¶‘à·„à·’ StrictMode කොන්දේසිය උල්ලංà¶à¶±à¶º à¶šà¶» ඇත."</string>
+ <string name="android_upgrading_title" msgid="1584192285441405746">"Android à¶‹à¶­à·Šà·à·Šâ€à¶»à·šà¶«à·’ වෙමින් පවතී..."</string>
+ <string name="android_upgrading_apk" msgid="7904042682111526169">"<xliff:g id="NUMBER_1">%2$d</xliff:g> කින් <xliff:g id="NUMBER_0">%1$d</xliff:g> à·€à·à¶±à·’ යෙදුමප්†රà·à·ƒà·Šà¶­ කරමින්."</string>
+ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"යෙදුම් ආරම්භ කරමින්."</string>
+ <string name="android_upgrading_complete" msgid="1405954754112999229">"ඇරඹුම අවසà·à¶± කරමින්."</string>
+ <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> à¶°à·à·€à¶±à¶º වෙමින්"</string>
+ <string name="heavy_weight_notification_detail" msgid="1721681741617898865">"යෙදුමට මà·à¶»à·” වීමට ස්පර්෠කරන්න"</string>
+ <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"යෙදුම් මà·à¶»à·” වනවà·à¶¯?"</string>
+ <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"අලුත් යෙදුමක් ආරම්භ කිරීමට පෙර තවමත් à¶šà·Šâ€à¶»à·’යà·à·€à·™à·„à·’ යෙදෙමින් පවතින යෙදුම à¶±à·à·€à·à¶­à·Šà·€à·’ය යුතුයි."</string>
+ <string name="old_app_action" msgid="493129172238566282">"<xliff:g id="OLD_APP">%1$s</xliff:g> වෙත ආපසු යන්න"</string>
+ <string name="old_app_description" msgid="2082094275580358049">"නව යෙදුම ආරම්භ නොකරන්න."</string>
+ <string name="new_app_action" msgid="5472756926945440706">"<xliff:g id="OLD_APP">%1$s</xliff:g> අරඹන්න"</string>
+ <string name="new_app_description" msgid="1932143598371537340">"සුරà·à¶šà·“මකින් තොරව පරණ යෙදුම නවත්වන්න."</string>
+ <string name="sendText" msgid="5209874571959469142">"පෙළ සඳහ෠ක්â€à¶»à·’යà·à·€ à¶­à·à¶»à¶±à·Šà¶±"</string>
+ <string name="volume_ringtone" msgid="6885421406845734650">"හඬ නඟනයේ à·à¶¶à·Šà¶¯à¶º"</string>
+ <string name="volume_music" msgid="5421651157138628171">"මà·à¶°à·Šâ€à¶º à·à¶¶à·Šà¶¯à¶º à¶­à·Šâ€à¶»à·“වතà·à·€à¶º"</string>
+ <string name="volume_music_hint_playing_through_bluetooth" msgid="9165984379394601533">"බ්ලූටූත් හරහ෠ධà·à·€à¶±à¶º වෙයි"</string>
+ <string name="volume_music_hint_silent_ringtone_selected" msgid="8310739960973156272">"නිහඬ රිගින් à¶§à·à¶±à¶ºà¶šà·Š සකසන්න"</string>
+ <string name="volume_call" msgid="3941680041282788711">"ඇමතුම-තුළ à·à¶¶à·Šà¶¯ à¶­à·Šâ€à¶»à·“වතà·à·€"</string>
+ <string name="volume_bluetooth_call" msgid="2002891926351151534">"බ්ලූටූත් ඇමතුම-තුළ à·à¶¶à·Šà¶¯ à¶­à·Šâ€à¶»à·“වතà·à·€à¶º"</string>
+ <string name="volume_alarm" msgid="1985191616042689100">"සීනුවේ à·à¶¶à·Šà¶¯à¶º"</string>
+ <string name="volume_notification" msgid="2422265656744276715">"දà·à¶±à·”ම්දීමේ à·à¶¶à·Šà¶¯à¶º"</string>
+ <string name="volume_unknown" msgid="1400219669770445902">"à·à¶¶à·Šà¶¯à¶º à¶­à·Šâ€à¶»à·“වතà·à·€à¶º"</string>
+ <string name="volume_icon_description_bluetooth" msgid="6538894177255964340">"බ්ලූටූත් à·à¶¶à·Šà¶¯ à¶­à·Šâ€à¶»à·“වතà·à·€"</string>
+ <string name="volume_icon_description_ringer" msgid="3326003847006162496">"රින්ටà·à¶±à¶ºà·š à·à¶¶à·Šà¶¯à¶º"</string>
+ <string name="volume_icon_description_incall" msgid="8890073218154543397">"ඇමතුම් à·à¶¶à·Šà¶¯à¶º à¶­à·Šâ€à¶»à·“වතà·à·€à¶º"</string>
+ <string name="volume_icon_description_media" msgid="4217311719665194215">"මà·à¶°à·Šâ€à¶º à·à¶¶à·Šà¶¯à¶º à¶­à·Šâ€à¶»à·“වතà·à·€à¶º"</string>
+ <string name="volume_icon_description_notification" msgid="7044986546477282274">"දà·à¶±à·”ම්දීමේ à·à¶¶à·Šà¶¯ à¶­à·Šâ€à¶»à·“වතà·à·€"</string>
+ <string name="ringtone_default" msgid="3789758980357696936">"සුපුරුදු රින්ටà·à¶±à¶º සකසන්න"</string>
+ <string name="ringtone_default_with_actual" msgid="8129563480895990372">"සුපුරුදු රින්ටà·à¶±à¶º (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_silent" msgid="7937634392408977062">"කිසිවක් à¶±à·à¶­"</string>
+ <string name="ringtone_picker_title" msgid="3515143939175119094">"රිගින්ටà·à¶±"</string>
+ <string name="ringtone_unknown" msgid="5477919988701784788">"නොදන්න෠රින්ටà·à¶±à¶º"</string>
+ <plurals name="wifi_available">
+ <item quantity="one" msgid="6654123987418168693">"Wi-Fi à¶¢à·à¶½à¶ºà¶šà·Š à¶­à·’à¶¶à·š"</item>
+ <item quantity="other" msgid="4192424489168397386">"Wi-Fi à¶¢à·à¶½ ඇත"</item>
+ </plurals>
+ <plurals name="wifi_available_detailed">
+ <item quantity="one" msgid="1634101450343277345">"විවෘත Wi-Fi à¶¢à·à¶½à¶º ලබà·à¶œà¶­ à·„à·à¶š"</item>
+ <item quantity="other" msgid="7915895323644292768">"විවෘත Wi-Fi à¶¢à·à¶½ à¶­à·’à¶¶à·š"</item>
+ </plurals>
+ <string name="wifi_available_sign_in" msgid="4029489716605255386">"Wi-Fi ජලයට පුරනය වන්න"</string>
+ <string name="network_available_sign_in" msgid="8495155593358054676">"à¶¢à·à¶½à¶ºà¶§ පුරනය වන්න"</string>
+ <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
+ <skip />
+ <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Wi-Fi වෙත සම්බන්ධ විය නොහà·à¶š"</string>
+ <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" දුබල අන්තර්ජà·à¶½ සම්බන්ධතà·à·€à¶ºà¶šà·Š ඇත."</string>
+ <string name="wifi_p2p_dialog_title" msgid="97611782659324517">"à¶à¶¢à·” Wi-Fi"</string>
+ <string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"à¶à¶¢à·” Wi-Fi ආරම්භ කරන්න. මෙය Wi-Fi සේවà·à¶¯à·à¶ºà¶š/හොට්ස්පොට් à¶‘à¶š à¶…à¶šà·Šâ€à¶»à·’ය කරනු ඇත."</string>
+ <string name="wifi_p2p_failed_message" msgid="3763669677935623084">"à¶à¶¢à·” Wi-Fi ආරම්භ à¶šà·… නොහà·à¶š."</string>
+ <string name="wifi_p2p_enabled_notification_title" msgid="2068321881673734886">"Wi-Fi à¶à¶¢à·” සම්බන්ධතà·à·€ සක්â€à¶»à·’යයි"</string>
+ <string name="wifi_p2p_enabled_notification_message" msgid="1638949953993894335">"à·ƒà·à¶šà·ƒà·“ම් සඳහ෠ස්පර්෠කරන්න"</string>
+ <string name="accept" msgid="1645267259272829559">"පිළිගන්න"</string>
+ <string name="decline" msgid="2112225451706137894">"à¶´à·Šâ€à¶»à¶­à·’à¶šà·Šà·‚à·šà¶´ කරන්න"</string>
+ <string name="wifi_p2p_invitation_sent_title" msgid="1318975185112070734">"ආරà·à¶°à¶±à·à·€ යවන ලදි"</string>
+ <string name="wifi_p2p_invitation_to_connect_title" msgid="4958803948658533637">"සම්බන්ධතà·à·€à¶ºà¶§ ඇරයුමකි"</string>
+ <string name="wifi_p2p_from_message" msgid="570389174731951769">"වෙතින්:"</string>
+ <string name="wifi_p2p_to_message" msgid="248968974522044099">"වෙත:"</string>
+ <string name="wifi_p2p_enter_pin_message" msgid="5920929550367828970">"à¶…à·€à·à·Šâ€à¶º PIN à¶‘à¶š ටයිප් කරන්න:"</string>
+ <string name="wifi_p2p_show_pin_message" msgid="8530563323880921094">"PIN:"</string>
+ <string name="wifi_p2p_frequency_conflict_message" product="tablet" msgid="8012981257742232475">"à¶§à·à¶¶à·Šà¶½à¶§à¶º <xliff:g id="DEVICE_NAME">%1$s</xliff:g> වෙත සම්බන්ධ වන අතරතුර එය Wi-Fi වලින් à¶­à·à·€à¶šà·à¶½à·’à¶šà·€ විසන්ධි කෙරේ."</string>
+ <string name="wifi_p2p_frequency_conflict_message" product="default" msgid="7363907213787469151">"දුරකථනය <xliff:g id="DEVICE_NAME">%1$s</xliff:g> à¶§ සම්බන්ධ වී පවතින විට Wi-Fi වලින් එය à¶­à·à·€à¶šà·à¶½à·’à¶šà·€ විසන්ධි වෙයි."</string>
+ <string name="select_character" msgid="3365550120617701745">"අකුර ඇතුළත් කරන්න"</string>
+ <string name="sms_control_title" msgid="7296612781128917719">"SMS පණිවිඩ යවමින්"</string>
+ <string name="sms_control_message" msgid="3867899169651496433">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; SMS පණිවිඩ විà·à·à¶½ ගණනක් යවයි. මෙම යෙදුමට පණිවිඩ යà·à·€à·“ම නොනà·à·€à¶­à·“ කරගෙන යà·à¶¸à¶§ අවසර දීමට ඔබට à¶…à·€à·à·Šâ€à¶ºà¶¯?"</string>
+ <string name="sms_control_yes" msgid="3663725993855816807">"අවසර දෙන්න"</string>
+ <string name="sms_control_no" msgid="625438561395534982">"à¶´à·Šâ€à¶»à¶­à·’à¶šà·Šà·‚à·šà¶´ කරන්න"</string>
+ <string name="sms_short_code_confirm_message" msgid="1645436466285310855">"&lt;b&gt;<xliff:g id="DEST_ADDRESS">%2$s</xliff:g>&lt;b&gt; වෙත කෙටි පණිවීඩයක් යà·à·€à·“මට &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;b&gt; à¶šà·à¶¸à¶­à·’ය."</string>
+ <!-- syntax error in translation for sms_short_code_details (3492025719868078457) org.xmlpull.v1.XmlPullParserException: expected: /string read: font (position:END_TAG </font>@1:83 in <string name="sms_short_code_details" msgid="3492025719868078457">"මෙය "</font>"ඔබගේ ජංගම ගිණුමේ"<font fgcolor="#ffffb060">" අය වීම් වලට හේතුවක් වේ."</string>
+) -->
+ <string name="sms_premium_short_code_details" msgid="5523826349105123687"><font fgcolor="#ffffb060">"මෙය ඔබගේ ජංගම ගිණුමෙන් අයවීමට හේතු වේ."</font></string>
+ <string name="sms_short_code_confirm_allow" msgid="4458878637111023413">"යවන්න"</string>
+ <string name="sms_short_code_confirm_deny" msgid="2927389840209170706">"අවලංගු කරන්න"</string>
+ <string name="sms_short_code_remember_choice" msgid="5289538592272218136">"මගේ තේරීම මතක à¶­à¶¶à·à¶œà¶±à·Šà¶±"</string>
+ <string name="sms_short_code_remember_undo_instruction" msgid="4960944133052287484">"ඔබට මෙය à·ƒà·à¶šà·ƒà·“ම් තුළ වෙනස්කර à¶œà·à¶±à·“ම පසුව à¶šà·… à·„à·à¶šÂ &gt; යෙදුම්"</string>
+ <string name="sms_short_code_confirm_always_allow" msgid="3241181154869493368">"à·ƒà·à¶¸à·€à·’ටම ඉඩ දෙන්න"</string>
+ <string name="sms_short_code_confirm_never_allow" msgid="446992765774269673">"කිසිද෠අවසර නොදෙන්න"</string>
+ <string name="sim_removed_title" msgid="6227712319223226185">"SIM පත ඉවත් කරන ලදි"</string>
+ <string name="sim_removed_message" msgid="2333164559970958645">"ඔබ ඇතුළත් කරන ලද වලංගු SIM à¶´à¶­ සමඟ à¶±à·à·€à¶­ ඇරඹීම කරන තුරු ජංගම à¶¢à·à¶½à¶º නොතිබේ."</string>
+ <string name="sim_done_button" msgid="827949989369963775">"හරි"</string>
+ <string name="sim_added_title" msgid="3719670512889674693">"SIM පතක් එකතු කරන ලදි"</string>
+ <string name="sim_added_message" msgid="6599945301141050216">"ජංගම à¶¢à·à¶½à¶ºà¶§ à¶´à·Šâ€à¶»à·€à·šà· වීමට ඔබගේ à¶‹à¶´à·à¶‚ගය à¶±à·à·€à¶­ අරඹන්න."</string>
+ <string name="sim_restart_button" msgid="4722407842815232347">"යළි අරඹන්න"</string>
+ <string name="time_picker_dialog_title" msgid="8349362623068819295">"වේලà·à·€ සකසන්න"</string>
+ <string name="date_picker_dialog_title" msgid="5879450659453782278">"දිනය à·ƒà·à¶šà·ƒà·“ම"</string>
+ <string name="date_time_set" msgid="5777075614321087758">"සකසන්න"</string>
+ <string name="date_time_done" msgid="2507683751759308828">"හරි"</string>
+ <string name="perms_new_perm_prefix" msgid="8257740710754301407"><font size="12" fgcolor="#ff33b5e5">"අලුත්: "</font></string>
+ <string name="perms_description_app" msgid="5139836143293299417">"<xliff:g id="APP_NAME">%1$s</xliff:g> විසින් සපයන ලදි."</string>
+ <string name="no_permissions" msgid="7283357728219338112">"අවසර à¶…à·€à·à·Šâ€à¶º නොමà·à¶­"</string>
+ <string name="perm_costs_money" msgid="4902470324142151116">"මෙමඟින් ඔබට මුදල් à·€à·à¶º විය à·„à·à¶š"</string>
+ <string name="usb_storage_activity_title" msgid="4465055157209648641">"USB මහ෠ආචයනය"</string>
+ <string name="usb_storage_title" msgid="5901459041398751495">"USB සම්බන්ධිතයි"</string>
+ <string name="usb_storage_message" product="nosdcard" msgid="3308538094316477839">"ඔබ ඔබගේ පරිගණකයට සම්බන්ධ වී ඇත්තේ USB ස්පර්à·à¶º හරහà·à¶º. ඔබට ඔබේ පරිගණකය හ෠ඔබගේ Android USB ආචයනය à¶…à¶­à¶» ගොනු à¶´à·’à¶§à¶´à¶­à·Š කිරීමට à¶…à·€à·à·Šâ€à¶º නම් à¶´à·„à¶­ බොත්තම ඔබන්න."</string>
+ <string name="usb_storage_message" product="default" msgid="805351000446037811">"ඔබ ඔබගේ පරිගණකයට USB හරහ෠සම්බන්ධ වී ඇත. ඔබට ඔබේ පරිගණකය හ෠ඔබගේ Android SD à¶´à¶­ à¶…à¶­à¶» ගොනු à¶´à·’à¶§à¶´à¶­à·Š කිරීමට à¶…à·€à·à·Šâ€à¶º නම් à¶´à·„à¶­ බොත්තම ස්පර්෠කරන්න."</string>
+ <string name="usb_storage_button_mount" msgid="1052259930369508235">"USB ආචයනය සක්â€à¶»à·’ය කරන්න"</string>
+ <string name="usb_storage_error_message" product="nosdcard" msgid="3017045217365540658">"USB මහ෠ආචයනය සඳහ෠ඔබගේ USB ආචයනය à¶·à·à·€à·’තයේදී à¶œà·à¶§à·…ුවක් à¶­à·’à¶¶à·š."</string>
+ <string name="usb_storage_error_message" product="default" msgid="2876018512716970313">"USB මහ෠ආචයනය සඳහ෠ඔබගේ SD à¶´à¶­ à¶·à·à·€à·’තයේදී à¶œà·à¶§à·…ුවක් à¶­à·’à¶¶à·š."</string>
+ <string name="usb_storage_notification_title" msgid="8175892554757216525">"USB සම්බන්ධිතයි"</string>
+ <string name="usb_storage_notification_message" msgid="939822783828183763">"ඔබගේ පරිගණකය වෙතට/වෙතින් ගොනු පිටපත් කිරීමට ස්පර්෠කරන්න."</string>
+ <string name="usb_storage_stop_notification_title" msgid="2336058396663516017">"USB ආචයනය à¶…à¶šà·Šâ€à¶»à·’ය කරන්න"</string>
+ <string name="usb_storage_stop_notification_message" msgid="1656852098555623822">"USB ආචයනය à¶…à¶šà·Šâ€à¶»à·’ය කිරීමට ස්පර්෠කරන්න."</string>
+ <string name="usb_storage_stop_title" msgid="660129851708775853">"USB ආචයනය à¶·à·à·€à·’තයේ පවතී"</string>
+ <string name="usb_storage_stop_message" product="nosdcard" msgid="4264025280777219521">"USB ආචයනය à¶…à¶šà·Šâ€à¶»à·’ය කිරීමට පෙර, ඔබගේ පරිගණකයෙන් Android USB ආචයනය ගලව෠දමන්න (\"à¶´à·’à¶§ කරන්න\")."</string>
+ <string name="usb_storage_stop_message" product="default" msgid="8043969782460613114">"USB ආචයනය à¶…à¶šà·Šâ€à¶»à·’ය කිරීමට පෙර, ඔබගේ Android SD à¶´à¶­ පරිගණකයෙන් ගලවන්න."</string>
+ <string name="usb_storage_stop_button_mount" msgid="7060218034900696029">"USB ආචයනය à¶…à¶šà·Šâ€à¶»à·’ය කරන්න"</string>
+ <string name="usb_storage_stop_error_message" msgid="1970374898263063836">"USB ආචයනය à¶…à¶šà·Šâ€à¶»à·’ය කිරීමේදී à¶œà·à¶§à·…ුවක් ඇතිවිය. USB සංග්â€à¶»à·à·„කය ගලව෠ඇති දà·à¶ºà·’ පරීක්ෂ෠කරන්න, පසුව à¶±à·à·€à¶­à¶­à·Š උත්සහ කරන්න."</string>
+ <string name="dlg_confirm_kill_storage_users_title" msgid="963039033470478697">"USB ආචයනය සක්â€à¶»à·’ය කරන්න"</string>
+ <string name="dlg_confirm_kill_storage_users_text" msgid="5100428757107469454">"ඔබ USB ආචයනය සක්â€à¶»à·’ය නම්, ඔබ à¶·à·à·€à·’ත෠කරන සමහර යෙදුම් à¶±à·à·€à¶­à·“ම සහ ඔබ USB ආචයනය à¶…à¶šà·Šâ€à¶»à·’ය කරන තුරු නොතිබේවී."</string>
+ <string name="dlg_error_title" msgid="7323658469626514207">"USB à¶šà·Šâ€à¶»à·’යà·à·€à¶½à·’ය à¶…à·ƒà·à¶»à·Šà¶®à¶šà¶ºà·’"</string>
+ <string name="dlg_ok" msgid="7376953167039865701">"හරි"</string>
+ <string name="usb_mtp_notification_title" msgid="3699913097391550394">"මà·à¶°à·Šâ€à¶º à¶‹à¶´à·à¶‚ගයක් ලෙස සම්බන්ධිතයි"</string>
+ <string name="usb_ptp_notification_title" msgid="1960817192216064833">"à¶šà·à¶¸à¶»à·à·€à¶šà·Š ලෙස සම්බන්ධ à¶šà¶» ඇත"</string>
+ <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"ස්ථà·à¶´à·’තයක් ලෙස සම්බන්ධයි"</string>
+ <string name="usb_accessory_notification_title" msgid="7848236974087653666">"USB මෙවලමකට සම්බන්ධිතයි"</string>
+ <string name="usb_notification_message" msgid="2290859399983720271">"අනෙක් USB විකල්පය සඳහ෠ස්පර්෠කරන්න."</string>
+ <string name="extmedia_format_title" product="nosdcard" msgid="9020092196061007262">"USB ආචයනය à·†à·à¶¸à·à¶§à·Š කරන්නද?"</string>
+ <string name="extmedia_format_title" product="default" msgid="3648415921526526069">"SD à¶´à¶­ à·†à·à¶¸à·à¶§à·Š කරන්නද?"</string>
+ <string name="extmedia_format_message" product="nosdcard" msgid="3934016853425761078">"ඔබගේ USB ආචයනයේ ඇති සියලුම ගොනු මà·à¶šà·“ යනු ඇත. මෙම à¶šà·Šâ€à¶»à·’යà·à·€ ආපසු à·„à·à¶»à·€à·’ය නොහà·à¶š!"</string>
+ <string name="extmedia_format_message" product="default" msgid="14131895027543830">"ඔබගේ à¶´à¶­à·š සියලු දත්ත à¶±à·à¶­à·’ වනු ඇත."</string>
+ <string name="extmedia_format_button_format" msgid="4131064560127478695">"à·†à·à¶¸à·à¶§à·Š"</string>
+ <string name="adb_active_notification_title" msgid="6729044778949189918">"USB නිදොස්කරණය සම්බන්ධිතයි"</string>
+ <string name="adb_active_notification_message" msgid="1016654627626476142">"USB නිදොස්කරණය අබල කිරීමට ස්පර්෠කරන්න."</string>
+ <string name="select_input_method" msgid="4653387336791222978">"ආදà·à¶± à¶šà·Šâ€à¶»à¶¸à¶ºà¶šà·Š à¶­à·à¶»à¶±à·Šà¶±"</string>
+ <string name="configure_input_methods" msgid="9091652157722495116">"ආදà·à¶± à¶šà·Šâ€à¶»à¶¸ සකසන්න"</string>
+ <string name="use_physical_keyboard" msgid="6203112478095117625">"භෞතික යතුරු පුවරුව"</string>
+ <string name="hardware" msgid="7517821086888990278">"දෘඨà·à¶‚à¶œ"</string>
+ <string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"යතුරු පුවරුවට පිරිසà·à¶½à·à·ƒà·Šà¶¸ à¶­à·à¶»à¶±à·Šà¶±"</string>
+ <string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"යතුරු පුවරුවට පිරිසà·à¶½à·à·ƒà·Šà¶¸à¶šà·Š තේරීමට ස්පර්෠කරන්න."</string>
+ <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+ <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+ <string name="candidates_style" msgid="4333913089637062257"><u>"අපේක්ෂකයන්"</u></string>
+ <string name="ext_media_checking_notification_title" product="nosdcard" msgid="3449816005351468560">"USB ආචයනය සකසමින්"</string>
+ <string name="ext_media_checking_notification_title" product="default" msgid="5457603418970994050">"SD à¶´à¶­ සුදà·à¶±à¶¸à·Š කරමින්"</string>
+ <string name="ext_media_checking_notification_message" msgid="8287319882926737053">"à·€à·à¶»à¶¯à·’ සඳහ෠පරීක්ෂ෠කරමින්."</string>
+ <string name="ext_media_nofs_notification_title" product="nosdcard" msgid="7788040745686229307">"හිස් USB ආචයනය"</string>
+ <string name="ext_media_nofs_notification_title" product="default" msgid="780477838241212997">"හිස් SD පත"</string>
+ <string name="ext_media_nofs_notification_message" product="nosdcard" msgid="7840121067427269500">"SD à¶´à¶­ හිස් හ෠සහà·à¶º නොදක්වන ගොනු පද්ධතියක් ඇත."</string>
+ <string name="ext_media_nofs_notification_message" product="default" msgid="8641065641786923604">"SD පත හිස් හ෠සහය නොදක්වන ගොනු පද්ධතියක් ඇත"</string>
+ <string name="ext_media_unmountable_notification_title" product="nosdcard" msgid="2090046769532713563">"à·„à·à¶±à·’ වූ USB ආචයනය"</string>
+ <string name="ext_media_unmountable_notification_title" product="default" msgid="6410723906019100189">"à·„à·à¶±à·’ වූ SD à¶´à¶­"</string>
+ <string name="ext_media_unmountable_notification_message" product="nosdcard" msgid="1795917578395333280">"USB ආචයනයට à·„à·à¶±à·’ වී ඇත. එය à¶±à·à·€à¶­ à·†à·à¶¸à·à¶§à·Š à¶œà·à¶±à·Šà·€à·“මට උත්සහ කරන්න."</string>
+ <string name="ext_media_unmountable_notification_message" product="default" msgid="1753898567525568253">"SD à¶´à¶­à¶§ à·„à·à¶±à·’ වී ඇත. එය à¶±à·à·€à¶­ à·†à·à¶¸à·à¶§à·Š à¶œà·à¶±à·Šà·€à·“මට උත්සහ කරන්න."</string>
+ <string name="ext_media_badremoval_notification_title" product="nosdcard" msgid="1661683031330951073">"à¶¶à¶½à·à¶´à·œà¶»à·œà¶­à·Šà¶­à·” නොවූ ලෙස USB ආචයනය ඉවත් කෙරිණි"</string>
+ <string name="ext_media_badremoval_notification_title" product="default" msgid="6872152882604407837">"SD à¶´à¶­ à¶¶à¶½à·à¶´à·œà¶»à·œà¶­à·Šà¶­à·” රහිතව ඉවත් කරන ලදි"</string>
+ <string name="ext_media_badremoval_notification_message" product="nosdcard" msgid="4329848819865594241">"දත්ත à¶±à·à¶­à·’වීම à·€à·à·…ක්වීමට USB ආචයනය ඉවත්කිරීමට පෙර ගලවන්න."</string>
+ <string name="ext_media_badremoval_notification_message" product="default" msgid="7260183293747448241">"දත්ත à¶±à·à¶­à·’වීම à·€à·à·…ක්වීමට à¶œà·à¶½à·€à·“මට කලින් SD à¶´à¶­ ඉවත් කරන්න."</string>
+ <string name="ext_media_safe_unmount_notification_title" product="nosdcard" msgid="3967973893270360230">"ඉවත් කිරීමට USB ආචයනය ආරක්ෂිතයි"</string>
+ <string name="ext_media_safe_unmount_notification_title" product="default" msgid="6729801130790616200">"SD පත ඉවත් කිරීමට සුරක්ෂිතයි"</string>
+ <string name="ext_media_safe_unmount_notification_message" product="nosdcard" msgid="6142195361606493530">"ඔබට USB ආචයනය ආරක්ෂිතව ඉවත් කිරීමට පුළුවනි."</string>
+ <string name="ext_media_safe_unmount_notification_message" product="default" msgid="568841278138377604">"ඔබට ආරක්ෂිතව SD à¶´à¶­ ඉවත් à¶šà·… à·„à·à¶š"</string>
+ <string name="ext_media_nomedia_notification_title" product="nosdcard" msgid="4486377230140227651">"USB ආචයනය ඉවත් කරන ලදි"</string>
+ <string name="ext_media_nomedia_notification_title" product="default" msgid="8902518030404381318">"SD පත ඉවත් කර ඇත"</string>
+ <string name="ext_media_nomedia_notification_message" product="nosdcard" msgid="6921126162580574143">"USB ආචයනය ඉවත්කොට ඇත. අලුත් මà·à¶°à·Šâ€à¶ºà¶ºà¶šà·Š ඇතුළත් කරන්න."</string>
+ <string name="ext_media_nomedia_notification_message" product="default" msgid="3870120652983659641">"SD පත ඉවත් කරන ලදි. අලුත් එකක් ඇතුළත් කරන්න."</string>
+ <string name="activity_list_empty" msgid="1675388330786841066">"à¶œà·à¶½à¶´à·™à¶± à¶šà·Šâ€à¶»à·’යà·à¶šà·à¶»à¶šà¶¸à·Š හමු නොවුණි."</string>
+ <string name="permlab_pkgUsageStats" msgid="8787352074326748892">"සංරචකය à¶·à·à·€à·’à¶­ කිරීමේ සංඛ්â€à¶ºà·à¶± යà·à·€à¶­à·Šà¶šà·à¶½à·“à¶± කරන්න"</string>
+ <string name="permdesc_pkgUsageStats" msgid="1106612424254277630">"à¶‘à¶šà¶­à·” කරන ලද සංරචකය à¶·à·à·€à·’ත෠සංඛ්â€à¶ºà·à¶± වෙනස් කිරීමට යෙදුමට අවසර දෙන්න. à·ƒà·à¶¸à·à¶±à·Šâ€à¶º යෙදුම් සඳහ෠නොවේ."</string>
+ <string name="permlab_copyProtectedData" msgid="4341036311211406692">"අන්තර්ගතය පිටපත් කරන්න"</string>
+ <string name="permdesc_copyProtectedData" msgid="4390697124288317831">"අන්තර්ගතය à¶´à·’à¶§à¶´à¶­à·Š කිරීමට සුපුරුදු අන්තර්ගත සේවà·à·€ ඉල්ව෠සිටීමට යෙදුමට අවසර දෙන්න. à·ƒà·à¶¸à·à¶±à·Šâ€à¶º යෙදුම්වල à¶·à·à·€à·’තය සඳහ෠නොවේ."</string>
+ <string name="permlab_route_media_output" msgid="1642024455750414694">"මà·à¶°à·Šâ€à¶º à¶´à·Šâ€à¶»à¶­à·’දà·à¶±à¶ºà·š මà·à¶»à·Šà¶œà¶œà¶­ කිරීම"</string>
+ <string name="permdesc_route_media_output" msgid="4932818749547244346">"වෙනත් à¶¶à·à·„à·’à¶» à¶‹à¶´à·à¶‚à¶œ වෙත මà·à¶°à·Šâ€à¶º à¶´à·Šâ€à¶»à¶­à·’දà·à¶±à¶º යà·à·€à·“මට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_access_keyguard_secure_storage" msgid="7565552237977815047">"යතුරු à¶´à·à¶½à¶š ආරක්â€à·‚à·’à¶­ ආචයනය වෙත à¶´à·Šâ€à¶»à·€à·šà·à¶º"</string>
+ <string name="permdesc_access_keyguard_secure_storage" msgid="5866245484303285762">"යතුරු ආරක්ෂක ආචයනයට à¶´à·Šâ€à¶»à·€à·šà· වීමට යෙදුමට දෙයි."</string>
+ <string name="permlab_control_keyguard" msgid="172195184207828387">"පෙන්වීමේ à·„à· à·ƒà·à¶Ÿà·€à·“මේ යතුරු ආරක්ෂකය à¶´à·à¶½à¶±à¶º කරන්න"</string>
+ <string name="permdesc_control_keyguard" msgid="3043732290518629061">"යතුරු ආරක්ෂකය à¶´à·à¶½à¶±à¶ºà¶§ යෙදුමකට අවසර දෙන්න."</string>
+ <string name="tutorial_double_tap_to_zoom_message_short" msgid="4070433208160063538">"විà·à·à¶½à¶± à¶´à·à¶½à¶±à¶º සඳහ෠දෙවරක් ස්පර්෠කරන්න"</string>
+ <string name="gadget_host_error_inflating" msgid="4882004314906466162">"විජටය à¶‘à¶šà¶­à·” කිරීමට නොහà·à¶šà·’ විය."</string>
+ <string name="ime_action_go" msgid="8320845651737369027">"යන්න"</string>
+ <string name="ime_action_search" msgid="658110271822807811">"සෙවීම"</string>
+ <string name="ime_action_send" msgid="2316166556349314424">"යවන්න"</string>
+ <string name="ime_action_next" msgid="3138843904009813834">"මීලඟ"</string>
+ <string name="ime_action_done" msgid="8971516117910934605">"හරි"</string>
+ <string name="ime_action_previous" msgid="1443550039250105948">"පෙර"</string>
+ <string name="ime_action_default" msgid="2840921885558045721">"à¶šà·Šâ€à¶»à·’යà·à¶šà¶»à·€à¶±à·Šà¶±"</string>
+ <string name="dial_number_using" msgid="5789176425167573586">"<xliff:g id="NUMBER">%s</xliff:g> à¶·à·à·€à·’තයෙන්\nඅංකය අමතන්න"</string>
+ <string name="create_contact_using" msgid="4947405226788104538">"<xliff:g id="NUMBER">%s</xliff:g> à¶·à·à·€à·’තයෙන්\nසම්බන්ධතà·à·€à¶ºà¶šà·Š නිර්මà·à¶«à¶º කරන්න"</string>
+ <string name="grant_credentials_permission_message_header" msgid="2106103817937859662">"à¶´à·„à¶­ දà·à¶šà·Šà·€à·™à¶± à¶‘à¶šà¶šà·Š à·„à· à¶Šà¶§ à·€à·à¶©à·’ යෙදුම් ගණනක් ඔබගේ ගිණුමට à¶´à·Šâ€à¶»à·€à·šà· වීමට, දà·à¶±à·Š සහ ඉදිරියේදී අවසර ඉල්ලයි."</string>
+ <string name="grant_credentials_permission_message_footer" msgid="3125211343379376561">"මෙම ඉල්ලීමට අවසර දීමට ඔබට à¶…à·€à·à·Šâ€à¶ºà¶¯?"</string>
+ <string name="grant_permissions_header_text" msgid="6874497408201826708">"à¶´à·Šâ€à¶»à·€à·šà·à¶º ඉල්ලීම"</string>
+ <string name="allow" msgid="7225948811296386551">"අවසර දෙන්න"</string>
+ <string name="deny" msgid="2081879885755434506">"à¶´à·Šâ€à¶»à¶­à·’à¶šà·Šà·‚à·šà¶´ කරන්න"</string>
+ <string name="permission_request_notification_title" msgid="6486759795926237907">"අවසර ඉල්ල෠සිටී"</string>
+ <string name="permission_request_notification_with_subtitle" msgid="8530393139639560189">"<xliff:g id="ACCOUNT">%s</xliff:g> ගිණුම සඳහà·\nඅවසර ඉල්ලන ලදි."</string>
+ <string name="input_method_binding_label" msgid="1283557179944992649">"ආදà·à¶± à¶šà·Šâ€à¶»à¶¸à¶º"</string>
+ <string name="sync_binding_label" msgid="3687969138375092423">"සමමුහුර්තය"</string>
+ <string name="accessibility_binding_label" msgid="4148120742096474641">"à¶´à·Šâ€à¶»à·€à·šà·à·Šâ€à¶ºà¶­à·à·€"</string>
+ <string name="wallpaper_binding_label" msgid="1240087844304687662">"බිතුපත"</string>
+ <string name="chooser_wallpaper" msgid="7873476199295190279">"බිතුපත වෙනස් කරන්න"</string>
+ <string name="notification_listener_binding_label" msgid="2014162835481906429">"දà·à¶±à·”ම්දීම් අසන්නà·"</string>
+ <string name="vpn_title" msgid="19615213552042827">"VPN à¶šà·Šâ€à¶»à·’යà·à¶­à·Šà¶¸à¶šà¶ºà·’"</string>
+ <string name="vpn_title_long" msgid="6400714798049252294">"<xliff:g id="APP">%s</xliff:g> මඟින් VPN සක්â€à¶»à·“ය කරන ලදි"</string>
+ <string name="vpn_text" msgid="3011306607126450322">"à¶¢à·à¶½à¶º කළමනà·à¶šà¶»à¶«à¶º කිරීමට ස්පර්෠කරන්න."</string>
+ <string name="vpn_text_long" msgid="6407351006249174473">"<xliff:g id="SESSION">%s</xliff:g> වෙත සම්බන්ධ වුණි. à¶¢à·à¶½à¶º කළමනà·à¶šà¶»à¶«à¶º කිරීමට ස්පර්෠කරන්න."</string>
+ <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"à·ƒà·à¶¸à·€à·’ටම VPN සම්බන්ධ වෙමින්…"</string>
+ <string name="vpn_lockdown_connected" msgid="8202679674819213931">"නිරතුරුවම VPN සම්බන්ධ කර ඇත"</string>
+ <string name="vpn_lockdown_error" msgid="6009249814034708175">"à·ƒà·à¶¸à·€à·’à¶§ සක්â€à¶»à·’ය VPN දà·à·‚ය"</string>
+ <string name="vpn_lockdown_config" msgid="6415899150671537970">"වින්â€à¶ºà·à·ƒ කිරීමට ස්පර්෠කරන්න"</string>
+ <string name="upload_file" msgid="2897957172366730416">"ගොනුව à¶­à·à¶»à¶±à·Šà¶±"</string>
+ <string name="no_file_chosen" msgid="6363648562170759465">"ගොනුවක් à¶­à·à¶»à·à¶œà·™à¶± à¶±à·à¶­"</string>
+ <string name="reset" msgid="2448168080964209908">"යළි පිහිටුවන්න"</string>
+ <string name="submit" msgid="1602335572089911941">"යොමු කරන්න"</string>
+ <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"මà·à¶§à¶»à·Š රථ ආකà·à¶»à¶º සබල à¶šà¶» ඇත"</string>
+ <string name="car_mode_disable_notification_message" msgid="8035230537563503262">"මà·à¶§à¶»à·Š රථ ආකà·à¶»à¶ºà·™à¶±à·Š පිටවීමට ස්පර්෠කරන්න."</string>
+ <string name="tethered_notification_title" msgid="3146694234398202601">"ටෙදරින් හ෠හොට්ස්පොට් සක්â€à¶»à·“යයි"</string>
+ <string name="tethered_notification_message" msgid="6857031760103062982">"සකස් කිරීමට ස්පර්෠කරන්න."</string>
+ <string name="back_button_label" msgid="2300470004503343439">"ආපසු"</string>
+ <string name="next_button_label" msgid="1080555104677992408">"මීලඟ"</string>
+ <string name="skip_button_label" msgid="1275362299471631819">"මඟ හරින්න"</string>
+ <string name="throttle_warning_notification_title" msgid="4890894267454867276">"ඉහළ ජංගම දත්ත à¶·à·à·€à·’තය"</string>
+ <string name="throttle_warning_notification_message" msgid="3340822228599337743">"ජංගම දත්ත à¶·à·à·€à·’තය à¶œà·à¶± à¶­à·€ දà·à¶±à¶œà·à¶±à·“මට ස්පර්෠කරන්න."</string>
+ <string name="throttled_notification_title" msgid="6269541897729781332">"ජංගම දත්ත සීමà·à·€ ඉක්මව෠ඇත"</string>
+ <string name="throttled_notification_message" msgid="5443457321354907181">"ජංගම දත්ත à¶·à·à·€à·’තය à¶œà·à¶± à¶­à·€ දà·à¶±à¶œà·à¶±à·“මට ස්පර්෠කරන්න."</string>
+ <string name="no_matches" msgid="8129421908915840737">"à¶œà·à¶½à¶´à·“ම් à¶±à·à¶­"</string>
+ <string name="find_on_page" msgid="1946799233822820384">"පිටුවෙහි සෙවීම"</string>
+ <plurals name="matches_found">
+ <item quantity="one" msgid="8167147081136579439">"à¶œà·à·…පීම් 1 යි"</item>
+ <item quantity="other" msgid="4641872797067609177">"<xliff:g id="TOTAL">%d</xliff:g> කින් <xliff:g id="INDEX">%d</xliff:g>"</item>
+ </plurals>
+ <string name="action_mode_done" msgid="7217581640461922289">"හරි"</string>
+ <string name="progress_unmounting" product="nosdcard" msgid="3923810448507612746">"USB ආචයනය à¶œà·à¶½à·€à·“ම..."</string>
+ <string name="progress_unmounting" product="default" msgid="1327894998409537190">"SD පත ගලවමින්..."</string>
+ <string name="progress_erasing" product="nosdcard" msgid="4521573321524340058">"USB ආචයනය මකමින්..."</string>
+ <string name="progress_erasing" product="default" msgid="6596988875507043042">"SD පත මකමින්..."</string>
+ <string name="format_error" product="nosdcard" msgid="6299769563624776948">"USB ආචයනය මà·à¶šà·’ය නොහà·à¶š."</string>
+ <string name="format_error" product="default" msgid="7315248696644510935">"SD à¶´à¶­ මà·à¶šà·“මට නොහà·à¶šà·’ විය."</string>
+ <string name="media_bad_removal" msgid="7960864061016603281">"à¶œà·à¶½à·€à·“මට පෙර SD à¶´à¶­ ඉවත්කර ඇත."</string>
+ <string name="media_checking" product="nosdcard" msgid="418188720009569693">"USB ආචයනය මේ වනවිට පරීක්ෂ෠කරමින් පවතී."</string>
+ <string name="media_checking" product="default" msgid="7334762503904827481">"SD à¶´à¶­ දà·à¶±à·Š පරීක්ෂ෠කරමින් පවතී."</string>
+ <string name="media_removed" msgid="7001526905057952097">"SD පත ඉවත් කර ඇත."</string>
+ <string name="media_shared" product="nosdcard" msgid="5830814349250834225">"පරිගණකයක් විසින් දà·à¶±à·Š USB ආචයනය à¶·à·à·€à·’ත෠කරයි."</string>
+ <string name="media_shared" product="default" msgid="5706130568133540435">"SD à¶´à¶­ දà·à¶±à¶§ පරිගණකයකින් à¶´à·à·€à·’à¶ à·Šà¶ à·’ කරයි."</string>
+ <string name="media_unknown_state" msgid="729192782197290385">"à¶¶à·à·„à·’à¶» මà·à¶°à·Šâ€à¶ºà¶º නොදන්න෠අවස්ථà·à·€à·š පවතියි."</string>
+ <string name="share" msgid="1778686618230011964">"බෙදà·à¶œà¶±à·Šà¶±"</string>
+ <string name="find" msgid="4808270900322985960">"සොයන්න"</string>
+ <string name="websearch" msgid="4337157977400211589">"වෙබ් සෙවුම"</string>
+ <string name="find_next" msgid="5742124618942193978">"මීළඟ සොයන්න"</string>
+ <string name="find_previous" msgid="2196723669388360506">"පෙර එක සොයන්න"</string>
+ <string name="gpsNotifTicker" msgid="5622683912616496172">"<xliff:g id="NAME">%s</xliff:g> ගෙන් ස්ථà·à¶±à¶º ඉල්ලීම"</string>
+ <string name="gpsNotifTitle" msgid="5446858717157416839">"ස්ථà·à¶± ඉල්ලීම"</string>
+ <string name="gpsNotifMessage" msgid="1374718023224000702">"<xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>) විසින් ඉල්ලන ලද"</string>
+ <string name="gpsVerifYes" msgid="2346566072867213563">"ඔව්"</string>
+ <string name="gpsVerifNo" msgid="1146564937346454865">"à¶±à·à¶­"</string>
+ <string name="sync_too_many_deletes" msgid="5296321850662746890">"මà·à¶šà·“මේ සීමà·à·€ ඉක්මවන ලදි"</string>
+ <string name="sync_too_many_deletes_desc" msgid="496551671008694245">"<xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g> සඳහ෠<xliff:g id="ACCOUNT_NAME">%3$s</xliff:g> ගිණුමේ මකන ලද අයිතම <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> à¶šà·Š ඇත. ඔබට කුමක් කිරීමට à¶…à·€à·à·Šâ€à¶ºà¶¯?"</string>
+ <string name="sync_really_delete" msgid="2572600103122596243">"අයිතම මකන්න"</string>
+ <string name="sync_undo_deletes" msgid="2941317360600338602">"මà·à¶šà·“ම් අස් කරන්න"</string>
+ <string name="sync_do_nothing" msgid="3743764740430821845">"දà·à¶±à¶§ කිසිවක් නොකරන්න"</string>
+ <string name="choose_account_label" msgid="5655203089746423927">"ගිණුමක් à¶­à·à¶»à¶±à·Šà¶±"</string>
+ <string name="add_account_label" msgid="2935267344849993553">"ගිණුමක් එකතු කරන්න"</string>
+ <string name="add_account_button_label" msgid="3611982894853435874">"ගිණුමක් එකතු කරන්න"</string>
+ <string name="number_picker_increment_button" msgid="2412072272832284313">"à·€à·à¶©à·’ කරන්න"</string>
+ <string name="number_picker_decrement_button" msgid="476050778386779067">"අඩු කරන්න"</string>
+ <string name="number_picker_increment_scroll_mode" msgid="3073101067441638428">"<xliff:g id="VALUE">%s</xliff:g> ස්පර්෠කර රඳව෠සිටින්න."</string>
+ <string name="number_picker_increment_scroll_action" msgid="9101473045891835490">"à·€à·à¶©à·’ කිරීමට ඉහලට සර්පණය කරන්න සහ à¶…à¶©à·” කිරීමට පහලට සර්පණය කරන්න."</string>
+ <string name="time_picker_increment_minute_button" msgid="8865885114028614321">"මිනිත්තුවක් à·€à·à¶©à·’ කරන්න"</string>
+ <string name="time_picker_decrement_minute_button" msgid="6246834937080684791">"මිනිත්තුව අඩු කරන්න"</string>
+ <string name="time_picker_increment_hour_button" msgid="3652056055810223139">"à¶´à·à¶º à·€à·à¶©à·’කරන්න"</string>
+ <string name="time_picker_decrement_hour_button" msgid="1377479863429214792">"à¶´à·à¶º අඩුකරන්න"</string>
+ <string name="time_picker_increment_set_pm_button" msgid="4147590696151230863">"ප.ව.සකසන්න"</string>
+ <string name="time_picker_decrement_set_am_button" msgid="8302140353539486752">"පෙ.ව. සකස් කිරීම"</string>
+ <string name="date_picker_increment_month_button" msgid="5369998479067934110">"මà·à·ƒà¶º à·€à·à¶©à·’ කරන්න"</string>
+ <string name="date_picker_decrement_month_button" msgid="1832698995541726019">"මà·à·ƒà¶ºà¶šà·Š à¶…à¶©à·” කරන්න"</string>
+ <string name="date_picker_increment_day_button" msgid="7130465412308173903">"දවස à·€à·à¶©à·’ කරන්න"</string>
+ <string name="date_picker_decrement_day_button" msgid="4131881521818750031">"දවස අඩු කරන්න"</string>
+ <string name="date_picker_increment_year_button" msgid="6318697384310808899">"වසර à·€à·à¶©à·’ කරන්න"</string>
+ <string name="date_picker_decrement_year_button" msgid="4482021813491121717">"වසර අඩු කරන්න"</string>
+ <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
+ <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"අවලංගු කරන්න"</string>
+ <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"මකන්න"</string>
+ <string name="keyboardview_keycode_done" msgid="1992571118466679775">"හරි"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"ආකà·à¶»à¶º වෙනස් කරන්න"</string>
+ <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
+ <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"ඇතුල් කරන්න"</string>
+ <string name="activitychooserview_choose_application" msgid="2125168057199941199">"යෙදුමක් à¶­à·à¶»à¶±à·Šà¶±"</string>
+ <string name="shareactionprovider_share_with" msgid="806688056141131819">"සමඟ බෙදà·à¶œà¶±à·Šà¶±"</string>
+ <string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> සමඟින් බෙද෠ගන්න"</string>
+ <string name="content_description_sliding_handle" msgid="415975056159262248">"සර්පණ à·„à·à¶©à¶½à¶º. ස්පර්෠කර රඳව෠සිටීම."</string>
+ <string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> සඳහ෠උඩට සර්පණය කරන්න."</string>
+ <string name="description_direction_down" msgid="5087739728639014595">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> සඳහ෠පහලට සර්පණය කරන්න."</string>
+ <string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> සඳහ෠වමට සර්පණය කරන්න."</string>
+ <string name="description_direction_right" msgid="8034433242579600980">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> සඳහ෠දකුණට සර්පණය කරන්න."</string>
+ <string name="description_target_unlock" msgid="2228524900439801453">"අඟුල අරින්න"</string>
+ <string name="description_target_camera" msgid="969071997552486814">"à¶šà·à¶¸à¶»à·à·€"</string>
+ <string name="description_target_silent" msgid="893551287746522182">"නිහඬ"</string>
+ <string name="description_target_soundon" msgid="30052466675500172">"à·à¶¶à·Šà¶¯ සක්â€à¶»à·“ය කරන්න"</string>
+ <string name="description_target_search" msgid="3091587249776033139">"සෙවීම"</string>
+ <string name="description_target_unlock_tablet" msgid="3833195335629795055">"අගුළු ඇරීමට ස්වයිප් කරන්න."</string>
+ <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"මුරපද යතුරු කියවනු ඇසීමට ඉස් බණුවක් සම්බන්ධ කරන්න."</string>
+ <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"à¶±à·à·€à¶­à·”ම."</string>
+ <string name="action_bar_home_description" msgid="5293600496601490216">"මුල් පිටුවට සංචà·à¶½à¶±à¶º කරන්න"</string>
+ <string name="action_bar_up_description" msgid="2237496562952152589">"ඉහලට සංචà·à¶½à¶±à¶º කරන්න"</string>
+ <string name="action_menu_overflow_description" msgid="2295659037509008453">"තවත් විකල්ප"</string>
+ <string name="action_bar_home_description_format" msgid="7965984360903693903">"%1$s, %2$s"</string>
+ <string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string>
+ <string name="storage_internal" msgid="4891916833657929263">"à¶…à¶·à·Šâ€à¶ºà¶±à·Šà¶­à¶» ආචයනය"</string>
+ <string name="storage_sd_card" msgid="3282948861378286745">"SD à¶´à¶­"</string>
+ <string name="storage_usb" msgid="3017954059538517278">"USB ආචයනය"</string>
+ <string name="extract_edit_menu_button" msgid="8940478730496610137">"සංස්කරණය කරන්න"</string>
+ <string name="data_usage_warning_title" msgid="1955638862122232342">"දත්ත à¶·à·à·€à·’ත෠අවවà·à¶¯à¶º"</string>
+ <string name="data_usage_warning_body" msgid="2814673551471969954">"à¶·à·à·€à·’තය සහ à·ƒà·à¶šà·ƒà·“ම් à¶¶à·à¶½à·“මට ස්පර්෠කරන්න."</string>
+ <string name="data_usage_3g_limit_title" msgid="7093334419518706686">"2G-3G දත්ත අබලයි"</string>
+ <string name="data_usage_4g_limit_title" msgid="7636489436819470761">"4G දත්ත අබල කරන ලදි"</string>
+ <string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"ජංගම දත්ත අබල කර ඇත"</string>
+ <string name="data_usage_wifi_limit_title" msgid="8992154736441284865">"Wi-Fi දත්ත අබල කරන ලදි"</string>
+ <string name="data_usage_limit_body" msgid="3317964706973601386">"සබල කිරීමට ස්පර්෠කරන්න."</string>
+ <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"2G-3G දත්ත සීමà·à·€ ඉක්මවන ලදි"</string>
+ <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"4G දත්ත සීමà·à·€ ඉක්මව෠යන ලදි"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"ජංගම දත්ත සීමà·à·€ ඉක්මව෠යන ලදි"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"Wi-Fi දත්ත සීමà·à·€ ඉක්මව෠යන ලදි"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"සඳහන් à¶šà·… සීමà·à·€à¶§ වඩ෠<xliff:g id="SIZE">%s</xliff:g> à·€à·à¶©à·’ය."</string>
+ <string name="data_usage_restricted_title" msgid="5965157361036321914">"පසුබිම් දත්ත සිම෠කරන ලදි"</string>
+ <string name="data_usage_restricted_body" msgid="6741521330997452990">"සීම෠කිරීම ඉවත් කිරීමට ස්පර්෠කරන්න"</string>
+ <string name="ssl_certificate" msgid="6510040486049237639">"ආරක්â€à·‚à·’à¶­ සහතිකය"</string>
+ <string name="ssl_certificate_is_valid" msgid="6825263250774569373">"මෙම සහතිකය වලංගුයි."</string>
+ <string name="issued_to" msgid="454239480274921032">"ලබà·à¶¯à·”න්නේ:"</string>
+ <string name="common_name" msgid="2233209299434172646">"පොදු à¶±à·à¶¸à¶º:"</string>
+ <string name="org_name" msgid="6973561190762085236">"සංවිධà·à¶±à¶º:"</string>
+ <string name="org_unit" msgid="7265981890422070383">"සංවිධà·à¶±à·à¶­à·Šà¶¸à¶š ඒකකය:"</string>
+ <string name="issued_by" msgid="2647584988057481566">"ලබà·à¶¯à·™à¶± ලද්දේ:"</string>
+ <string name="validity_period" msgid="8818886137545983110">"වලංගුතà·à·€à¶º:"</string>
+ <string name="issued_on" msgid="5895017404361397232">"නිකුත් කරන ලද්දේ:"</string>
+ <string name="expires_on" msgid="3676242949915959821">"කල් ඉකුත් වන්නේ:"</string>
+ <string name="serial_number" msgid="758814067660862493">"අනුක්â€à¶»à¶¸à·à¶‚කය:"</string>
+ <string name="fingerprints" msgid="4516019619850763049">"ඇඟිලි සලකුණු:"</string>
+ <string name="sha256_fingerprint" msgid="4391271286477279263">"SHA-256 ඇඟිලිසලකුණ:"</string>
+ <string name="sha1_fingerprint" msgid="7930330235269404581">"SHA-1 ඇඟිලි සලකුණ:"</string>
+ <string name="activity_chooser_view_see_all" msgid="4292569383976636200">"සියල්ල බලන්න"</string>
+ <string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"à¶šà·Šâ€à¶»à·’යà·à¶šà·à¶»à¶šà¶¸ à¶­à·à¶»à¶±à·Šà¶±"</string>
+ <string name="share_action_provider_share_with" msgid="5247684435979149216">"සමඟ බෙදà·à¶œà¶±à·Šà¶±"</string>
+ <string name="list_delimeter" msgid="3975117572185494152">", "</string>
+ <string name="sending" msgid="3245653681008218030">"යවමින්..."</string>
+ <string name="launchBrowserDefault" msgid="2057951947297614725">"à¶¶à·Šâ€à¶»à·€à·”සරය දියත් කරන්නද?"</string>
+ <string name="SetupCallDefault" msgid="5834948469253758575">"ඇමතුම පිළිගන්නවà·à¶¯?"</string>
+ <string name="activity_resolver_use_always" msgid="8017770747801494933">"à·ƒà·à¶¸ විටම"</string>
+ <string name="activity_resolver_use_once" msgid="2404644797149173758">"à¶‘à¶šà·Š à·€à·à¶»à¶ºà¶ºà·’"</string>
+ <string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"à¶§à·à¶¶à·Šà¶½à¶§à·Šà¶º"</string>
+ <string name="default_audio_route_name" product="default" msgid="4239291273420140123">"දුරකථනය"</string>
+ <string name="default_audio_route_name_headphones" msgid="8119971843803439110">"ඉස් බණු"</string>
+ <string name="default_audio_route_name_dock_speakers" msgid="6240602982276591864">"à¶±à·à¶¯à¶š ඩොක් කරන්න"</string>
+ <string name="default_media_route_name_hdmi" msgid="2450970399023478055">"HDMI"</string>
+ <string name="default_audio_route_category_name" msgid="3722811174003886946">"පද්ධතිය"</string>
+ <string name="bluetooth_a2dp_audio_route_name" msgid="8575624030406771015">"බ්ලූටූත් à·à·Šâ€à¶»à·€à·Šâ€à¶º"</string>
+ <string name="wireless_display_route_description" msgid="9070346425023979651">"à¶»à·à·„à·à¶±à·Š රහිත දර්à·à¶±à¶º"</string>
+ <string name="media_route_chooser_grouping_done" msgid="7966438307723317169">"හරි"</string>
+ <string name="media_route_button_content_description" msgid="5758553567065145276">"මà·à¶°à·Šâ€à¶º à¶´à·Šâ€à¶»à¶­à·’දà·à¶±à¶º"</string>
+ <string name="media_route_status_scanning" msgid="7279908761758293783">"පරිලà·à¶šà¶±à¶º කරමින්…"</string>
+ <string name="media_route_status_connecting" msgid="6422571716007825440">"සම්බන්ධ වෙමින්…"</string>
+ <string name="media_route_status_available" msgid="6983258067194649391">"ලබà·à¶œà¶­ à·„à·à¶š"</string>
+ <string name="media_route_status_not_available" msgid="6739899962681886401">"ලබà·à¶œà¶­ නොහà·à¶š"</string>
+ <string name="media_route_status_in_use" msgid="4533786031090198063">"à¶·à·à·€à·’තයේ ඇත"</string>
+ <string name="display_manager_built_in_display_name" msgid="2583134294292563941">"à¶­à·’à·…à·à¶½à·’ තිරය"</string>
+ <string name="display_manager_hdmi_display_name" msgid="1555264559227470109">"HDMI තිරය"</string>
+ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"à¶‹à¶©à·à¶­à·’රිය #<xliff:g id="ID">%1$d</xliff:g>"</string>
+ <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
+ <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", ආරක්â€à·‚à·’à¶­"</string>
+ <string name="wifi_display_notification_title" msgid="2223050649240326557">"නොරà·à·„à·à¶±à·Š සංදර්à·à¶šà¶º සම්බන්ධිතයි"</string>
+ <string name="wifi_display_notification_message" msgid="4498802012464170685">"වෙනත් à¶‹à¶´à·à¶‚ගයක් මත මෙම තිරය පෙන්වයි"</string>
+ <string name="wifi_display_notification_disconnect" msgid="6183754463561153372">"විසන්ධි කරන්න"</string>
+ <string name="kg_emergency_call_label" msgid="684946192523830531">"හදිසි ඇමතුම"</string>
+ <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"රටà·à·€ අමතකයි"</string>
+ <string name="kg_wrong_pattern" msgid="1850806070801358830">"à·€à·à¶»à¶¯à·’ රටà·à·€à¶šà·’"</string>
+ <string name="kg_wrong_password" msgid="2333281762128113157">"à·€à·à¶»à¶¯à·’ මුරපදය"</string>
+ <string name="kg_wrong_pin" msgid="1131306510833563801">"PIN à¶‘à¶š à·€à·à¶»à¶¯à·’යි"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"à¶­à¶­à·Šà¶´à¶» <xliff:g id="NUMBER">%1$d</xliff:g> à¶§ පසුව à¶±à·à·€à¶­ උත්සහ කරන්න."</string>
+ <string name="kg_pattern_instructions" msgid="398978611683075868">"ඔබගේ රටà·à·€ අඳින්න"</string>
+ <string name="kg_sim_pin_instructions" msgid="2319508550934557331">"SIM PIN ඇතුලු කරන්න"</string>
+ <string name="kg_pin_instructions" msgid="2377242233495111557">"PIN එක ඇතුළු කරන්න"</string>
+ <string name="kg_password_instructions" msgid="5753646556186936819">"මුරපදය ඇතුළු කරන්න"</string>
+ <string name="kg_puk_enter_puk_hint" msgid="453227143861735537">"දà·à¶±à·Š SIM à¶‘à¶š à¶…à¶¶à¶½ à¶šà¶» ඇත. ඉදිරියට යà·à¶¸à¶§ PUK කේතය යොදන්න. විස්තර සඳහ෠වà·à·„කය෠අමතන්න."</string>
+ <string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"අපේක්ෂිත PIN කේතය ඇතුළත් කරන්න"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"අපේක්ෂිත PIN කේතය ස්ථිර කරන්න"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"SIM පත අගුළු අරිමින්..."</string>
+ <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"à·€à·à¶»à¶¯à·’ PIN කේතයකි."</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"අංක 4 සිට 8 අතර වන PIN එකක් ටයිප් කරන්න."</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"PUK කේතය සංඛ්â€à¶ºà· 8 à¶šà·Š à·„à· à·€à·à¶©à·’ විය යුතුය."</string>
+ <string name="kg_invalid_puk" msgid="3638289409676051243">"නිවà·à¶»à¶¯à·’ PUK කේතය à¶±à·à·€à¶­ ඇතුලත් කරන්න. à¶±à·à·€à¶­ à¶±à·à·€à¶­ à¶‹à¶­à·Šà·ƒà·à·„ කිරීමෙන් SIM à¶‘à¶š ස්ථිරවම à¶…à¶¶à¶½ කරයි."</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"PIN à¶šà·šà¶­ à¶œà·à¶½à¶´à·“ à¶±à·à¶­"</string>
+ <string name="kg_login_too_many_attempts" msgid="6486842094005698475">"රට෠උත්සà·à·„ කිරීම් à·€à·à¶©à·’ය"</string>
+ <string name="kg_login_instructions" msgid="1100551261265506448">"අගුළු ඇරීමට, ඔබගේ Google ගිණුම සමග පුරනය වන්න."</string>
+ <string name="kg_login_username_hint" msgid="5718534272070920364">"පරිà·à·“ලක à¶±à·à¶¸à¶º (à¶Š-à¶­à·à¶´à·‘à¶½)"</string>
+ <string name="kg_login_password_hint" msgid="9057289103827298549">"මුරපදය"</string>
+ <string name="kg_login_submit_button" msgid="5355904582674054702">"පුරනය වන්න"</string>
+ <string name="kg_login_invalid_input" msgid="5754664119319872197">"වලංගු නොවන පරිà·à·“ලක à¶±à·à¶¸à¶ºà¶šà·Š හ෠මුරපදයක්."</string>
+ <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"ඔබගේ පරිà·à·“ලක à¶±à·à¶¸à¶º හ෠මුරපදය අමතකද?\n "<b>"google.com/accounts/recovery"</b>" වෙත යන්න."</string>
+ <string name="kg_login_checking_password" msgid="1052685197710252395">"ගිණුම පරීක්ෂ෠කරමින්…"</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"ඔබ PIN අංකය <xliff:g id="NUMBER_0">%d</xliff:g> à·€à·à¶»à¶ºà¶šà·Š à·€à·à¶»à¶¯à·’යට ටයිප් කොට ඇත.\n\n à¶­à¶­à·Šà¶´à¶» <xliff:g id="NUMBER_1">%d</xliff:g> à¶šà·Š ඇතුළත à¶±à·à·€à¶­ à¶‹à¶­à·Šà·ƒà·à·„ කරන්න."</string>
+ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"<xliff:g id="NUMBER_0">%d</xliff:g> වතà·à·€à¶šà·Š ඔබගේ මුරපදය ඔබ à·€à·à¶»à¶¯à·’යට ටයිප් à¶šà¶» ඇත. \n\nà¶­à¶­à·Šà¶´à¶» <xliff:g id="NUMBER_1">%d</xliff:g> à¶§ පසුව à¶±à·à·€à¶­ උත්සහ කරන්න."</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"ඔබ <xliff:g id="NUMBER_0">%d</xliff:g> à·€à·à¶»à¶ºà¶šà·Š අගුළු ඇරීමේ රටà·à·€ à·€à·à¶»à¶¯à·’යට ඇඳ ඇත. \n\nà¶­à¶­à·Šà¶´à¶» <xliff:g id="NUMBER_1">%d</xliff:g> à¶šà·Š ඇතුළත à¶±à·à·€à¶­ à¶‹à¶­à·Šà·ƒà·à·„ කරන්න."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1575557200627128949">"ඔබ à¶§à·à¶¶à·Šà¶½à¶§à¶º අගුළු à·„à·à¶»à·“මට à·€à·à¶»à¶¯à·’යට අවස්ථ෠<xliff:g id="NUMBER_0">%d</xliff:g> à¶šà·Š à¶‹à¶­à·Šà·ƒà·à·„ à¶šà¶» ඇත. අවස්ථ෠<xliff:g id="NUMBER_1">%d</xliff:g> à¶šà·Š à¶…à·ƒà·à¶»à·Šà¶®à¶šà·€ උත්සහ කිරීමකින් පසුව, කර්මà·à¶±à·Šà¶­ à·à·à¶½à· මුල් තත්වයට à¶±à·à·€à¶­ à¶´à¶­à·Š වන à¶…à¶­à¶» සියලු පරිà·à·“ලක දත්ත à¶±à·à¶­à·’ වෙයි."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="4051015943038199910">"ඔබ දුරකථනය අගුළු ඇරීමට à·€à·à¶» <xliff:g id="NUMBER_0">%d</xliff:g> කදී à·€à·à¶»à¶¯à·“ à¶´à·Šâ€à¶»à¶ºà¶­à·Šà¶±à¶ºà¶±à·Š ගෙන à¶­à·’à¶¶à·š. තවත් à¶…à·ƒà·à¶»à·Šà¶®à¶š à¶´à·Šâ€à¶»à¶ºà¶­à·Šà¶± <xliff:g id="NUMBER_1">%d</xliff:g> කින් පසුව, දුරකථනය කර්මà·à¶±à·Šà¶­ à·à·à¶½à·à·€à·š සුපුරුද්දට යළි පිහිටුවන à¶…à¶­à¶» සියලුම පරිà·à·“ලක දත්ත à¶±à·à¶­à·’ වී යයි."</string>
+ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="2072996269148483637">"à¶§à·à¶¶à·Šà¶½à¶§à¶ºà·š අගුළු ඇරීමට ඔබ à·€à·à¶»à¶¯à·’ à¶´à·Šâ€à¶»à¶ºà¶­à·Šà¶± <xliff:g id="NUMBER">%d</xliff:g> à·€à·à¶»à¶ºà¶šà·Š ගෙන ඇත. දà·à¶±à·Š à¶§à·à¶¶à·Šà¶½à¶§à¶º කර්මà·à¶±à·Šà¶­ à·à·à¶½à· සුපුරුද්ද වෙත යළි පිහිටුවීම කෙරේ."</string>
+ <string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"ඔබ දුරකථනය අගුළු ඇරීමට à·€à·à¶» <xliff:g id="NUMBER">%d</xliff:g> කදී à·€à·à¶»à¶¯à·“ à¶´à·Šâ€à¶»à¶ºà¶±à·Šà¶­à¶ºà¶±à·Š ගෙන à¶­à·’à¶¶à·š. දà·à¶±à·Š දුරකථනය කර්මà·à¶±à·Šà¶­à·à·à¶½à· සුපුරුද්දට පිහිටුවනු ලබයි."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"ඔබ අගුළු ඇරිමේ රටà·à·€ <xliff:g id="NUMBER_0">%d</xliff:g> වතà·à·€à¶šà·Š à·€à·à¶»à¶¯à·’යට ඇඳ ඇත. තවත් à¶…à·ƒà·à¶»à·Šà¶®à¶š à¶‹à¶­à·Šà·ƒà·à·„ <xliff:g id="NUMBER_1">%d</xliff:g> කින් පසුව, à¶Š-à¶­à·à¶´à·à¶½à·Š ගිණුම à¶·à·à·€à·’ත෠කරමින් ඔබගේ à¶§à·à¶¶à·Šà¶½à¶§à¶ºà·š අගුළු ඇරීමට ඔබට පවසනු ඇත.\n\n à¶±à·à·€à¶­ à¶­à¶­à·Šà¶´à¶» <xliff:g id="NUMBER_2">%d</xliff:g> කින් à¶‹à¶­à·Šà·ƒà·à·„ කරන්න."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"ඔබ à·€à·à¶»à¶¯à·’යට <xliff:g id="NUMBER_0">%d</xliff:g> වතà·à·€à¶šà·Š ඔබගේ අගුළු à·„à·à¶»à·“මේ රටà·à·€ ඇඳ ඇත. à¶…à·ƒà·à¶»à·Šà¶®à¶š උත්සහ කිරීම් <xliff:g id="NUMBER_1">%d</xliff:g> න් පසුව, ඔබගේ à¶Š-à¶­à·à¶´à·à¶½à·Š ලිපිනය à¶·à·à·€à·’තයෙන් ඔබගේ දුරකථනය අගුළු à·„à·à¶»à·“මට ඔබගෙන් අසයි.\n\n à¶­à¶­à·Šà¶´à¶» <xliff:g id="NUMBER_2">%d</xliff:g> න් පසුව à¶±à·à·€à¶­ උත්සහ කරන්න."</string>
+ <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
+ <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"ඉවත් කරන්න"</string>
+ <string name="safe_media_volume_warning" product="default" msgid="7324161939475478066">"නිර්දේà·à·’à¶­ මට්ටමෙන් ඉහළට à·à¶¶à·Šà¶¯à¶º à·€à·à¶©à·’ කරනවද?\nà·€à·à¶©à·’ à¶šà·à¶½à¶ºà¶šà·Š ඉහළ à·à¶¶à·Šà¶¯à¶ºà¶šà·Š à·à·Šâ€à¶»à·€à¶±à¶º කිරීමෙන් ඔබගේ à·à·Šâ€à¶»à·€à¶±à¶ºà¶§ à·„à·à¶±à·’ විය à·„à·à¶š."</string>
+ <string name="continue_to_enable_accessibility" msgid="1626427372316070258">"à¶´à·Šâ€à¶»à·€à·šà·à·Šâ€à¶ºà¶­à·à·€à¶º සබල කිරීමට ඇඟිලි දෙකක් à¶´à·„à·…à¶§ රඳව෠සිටින්න."</string>
+ <string name="accessibility_enabled" msgid="1381972048564547685">"à¶´â€à·Šâ€à¶»à·€à·šà·à·Šâ€à¶ºà¶­à·à·€ සබල කරන ලදි."</string>
+ <string name="enable_accessibility_canceled" msgid="3833923257966635673">"à¶´â€à·Šâ€à¶»à·€à·šà·à·Šâ€à¶ºà¶­à·à·€ අවලංගු à¶šà¶» ඇත."</string>
+ <string name="user_switched" msgid="3768006783166984410">"දà·à¶±à¶§ සිටින පරිà·à·“ලකය෠<xliff:g id="NAME">%1$s</xliff:g>."</string>
+ <string name="owner_name" msgid="2716755460376028154">"හිමිකරු"</string>
+ <string name="error_message_title" msgid="4510373083082500195">"දà·à·‚ය"</string>
+ <string name="app_no_restricted_accounts" msgid="5739463249673727736">"සීම෠සහිත à¶´à·à¶­à·’à¶šà¶© සඳහ෠වන ගිණුම් වෙත මෙම යෙදුම සහය නොදක්වයි"</string>
+ <string name="app_not_found" msgid="3429141853498927379">"මෙම à¶šà·Šâ€à¶»à·’යà·à·€ හසුරුවීමට යෙදුමක් සොයà·à¶œà¶­à·Šà¶­à·š à¶±à·à¶­"</string>
+ <string name="revoke" msgid="5404479185228271586">"à¶…à·„à·à·ƒà·’ කරන්න"</string>
+ <string name="mediaSize_iso_a0" msgid="7875427489420821793">"ISO A0"</string>
+ <string name="mediaSize_iso_a1" msgid="3760734499050875356">"ISO A1"</string>
+ <string name="mediaSize_iso_a2" msgid="5973266378020144382">"ISO A2"</string>
+ <string name="mediaSize_iso_a3" msgid="1373407105687300884">"ISO A3"</string>
+ <string name="mediaSize_iso_a4" msgid="6689772807982597254">"ISO A4"</string>
+ <string name="mediaSize_iso_a5" msgid="5353549652015741040">"ISO A5"</string>
+ <string name="mediaSize_iso_a6" msgid="8585038048674911907">"ISO A6"</string>
+ <string name="mediaSize_iso_a7" msgid="6641836716963839119">"ISO A7"</string>
+ <string name="mediaSize_iso_a8" msgid="7571139437465693355">"ISO A8"</string>
+ <string name="mediaSize_iso_a9" msgid="1378455891957115079">"ISO A9"</string>
+ <string name="mediaSize_iso_a10" msgid="2480747457429475344">"ISO A10"</string>
+ <string name="mediaSize_iso_b0" msgid="3965935097661108039">"ISO B0"</string>
+ <string name="mediaSize_iso_b1" msgid="2505753285010115437">"ISO B1"</string>
+ <string name="mediaSize_iso_b2" msgid="8763874709859458453">"ISO B2"</string>
+ <string name="mediaSize_iso_b3" msgid="4210506688191764076">"ISO B3"</string>
+ <string name="mediaSize_iso_b4" msgid="5749404165888526034">"ISO B4"</string>
+ <string name="mediaSize_iso_b5" msgid="7640627414621904733">"ISO B5"</string>
+ <string name="mediaSize_iso_b6" msgid="7342988864712748544">"ISO B6"</string>
+ <string name="mediaSize_iso_b7" msgid="5069844065235382429">"ISO B7"</string>
+ <string name="mediaSize_iso_b8" msgid="7316818922278779774">"ISO B8"</string>
+ <string name="mediaSize_iso_b9" msgid="5414727094026532341">"ISO B9"</string>
+ <string name="mediaSize_iso_b10" msgid="5251253731832048185">"ISO B10"</string>
+ <string name="mediaSize_iso_c0" msgid="4003138342671964217">"ISO C0"</string>
+ <string name="mediaSize_iso_c1" msgid="1935188063393553008">"ISO C1"</string>
+ <string name="mediaSize_iso_c2" msgid="3197307969712069904">"ISO C2"</string>
+ <string name="mediaSize_iso_c3" msgid="4335826087321913508">"ISO C3"</string>
+ <string name="mediaSize_iso_c4" msgid="3745639598281015005">"ISO C4"</string>
+ <string name="mediaSize_iso_c5" msgid="8269457765822791013">"ISO C5"</string>
+ <string name="mediaSize_iso_c6" msgid="566666105260346930">"ISO C6"</string>
+ <string name="mediaSize_iso_c7" msgid="8678413180782608498">"ISO C7"</string>
+ <string name="mediaSize_iso_c8" msgid="8392376206627041730">"ISO C8"</string>
+ <string name="mediaSize_iso_c9" msgid="9191613372324845405">"ISO C9"</string>
+ <string name="mediaSize_iso_c10" msgid="7327709699184920822">"ISO C10"</string>
+ <string name="mediaSize_na_letter" msgid="4191805615829472953">"අකුරු"</string>
+ <string name="mediaSize_na_gvrnmt_letter" msgid="7853382192649405507">"රජයේ ලිපිය"</string>
+ <string name="mediaSize_na_legal" msgid="6697982988283823150">"නීත්â€à¶ºà¶±à·”à¶šà·–à¶½"</string>
+ <string name="mediaSize_na_junior_legal" msgid="3727743969902758948">"à¶´à·Šâ€à¶»à·à¶®à¶¸à·’à¶š නීතිමය"</string>
+ <string name="mediaSize_na_ledger" msgid="281871464896601236">"ලෙජරය"</string>
+ <string name="mediaSize_na_tabloid" msgid="5775966416333578127">"කුඩ෠පුවත්පත"</string>
+ <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"අවලංගු කරන ලදි"</string>
+ <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"අන්තර්ගතය ලිවීමේදී දà·à·‚යකි"</string>
+ <string name="reason_unknown" msgid="6048913880184628119">"නොදනී"</string>
+ <string name="restr_pin_enter_admin_pin" msgid="783643731895143970">"පරිපà·à¶½à¶šà¶ºà·à¶œà·š PIN à¶‘à¶š ඇතුළ් කරන්න"</string>
+ <string name="restr_pin_enter_pin" msgid="3395953421368476103">"PIN එක ඇතුළු කරන්න"</string>
+ <string name="restr_pin_incorrect" msgid="8571512003955077924">"à·€à·à¶»à¶¯à·’යි"</string>
+ <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"වත්මන් PIN"</string>
+ <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"නව PIN"</string>
+ <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"නව PIN තහවුරු කරන්න"</string>
+ <string name="restr_pin_create_pin" msgid="8017600000263450337">"සිම෠වà·à¶©à·’දියුණු කිරීමට PIN à·ƒà·à¶¯à¶±à·Šà¶±"</string>
+ <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"PIN නොගà·à·…පෙයි. à¶±à·à·€à¶­ උත්සහ කරන්න."</string>
+ <string name="restr_pin_error_too_short" msgid="8173982756265777792">"PIN කුඩ෠වà·à¶©à·’ය. ඉලක්කම් 4 වත් විය යුතුය."</string>
+ <plurals name="restr_pin_countdown">
+ <item quantity="one" msgid="311050995198548675">"තවත් à¶­à¶­à·Šà¶´à¶» 1 කින් යළි à¶‹à¶­à·Šà·ƒà·à·„ කරන්න"</item>
+ <item quantity="other" msgid="4730868920742952817">"à¶­à¶­à·Šà¶´à¶» <xliff:g id="COUNT">%d</xliff:g> කින් à¶±à·à·€à¶­ උත්සහ කරන්න"</item>
+ </plurals>
+ <string name="restr_pin_try_later" msgid="973144472490532377">"පසුව à¶±à·à·€à¶­ à¶‹à¶­à·Šà·ƒà·à·„ කරන්න"</string>
+ <string name="transient_navigation_confirmation" msgid="4907844043611123426">"තීරුව à¶…à¶±à·à·€à¶»à¶«à¶ºà¶§ තිරයේ කෙලවර අදින්න"</string>
+ <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"පද්ධති තීරුව à¶…à¶±à·à·€à¶»à¶«à¶ºà¶§ තිරයේ කෙලවරින් අදින්න"</string>
+</resources>
diff --git a/core/res/res/values-si/strings.xml b/core/res/res/values-si/strings.xml
new file mode 100644
index 0000000..165163b
--- /dev/null
+++ b/core/res/res/values-si/strings.xml
@@ -0,0 +1,1591 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="byteShort" msgid="8340973892742019101">"B"</string>
+ <string name="kilobyteShort" msgid="5973789783504771878">"KB"</string>
+ <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
+ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
+ <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
+ <string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
+ <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string>
+ <string name="untitled" msgid="4638956954852782576">"&lt;නම් යොද෠නà·à¶­&gt;"</string>
+ <string name="ellipsis" msgid="7899829516048813237">"…"</string>
+ <string name="ellipsis_two_dots" msgid="1228078994866030736">"‥"</string>
+ <string name="emptyPhoneNumber" msgid="7694063042079676517">"(දුරකථන අංකයක් නොමà·à¶­)"</string>
+ <string name="unknownName" msgid="2277556546742746522">"(නොදනී)"</string>
+ <string name="defaultVoiceMailAlphaTag" msgid="2660020990097733077">"කටහඬ à¶­à·à¶´à·‘à¶½"</string>
+ <string name="defaultMsisdnAlphaTag" msgid="2850889754919584674">"MSISDN1"</string>
+ <string name="mmiError" msgid="5154499457739052907">"සම්බන්ධත෠ගà·à¶§à·…ුවක් හ෠අවලංගු MMI කේතයකි."</string>
+ <string name="mmiFdnError" msgid="5224398216385316471">"ස්ථà·à·€à¶» ඇමතීම් à¶…à¶‚à¶š වලට පමණක් මෙහෙයුම සීමà·à¶šà¶» ඇත."</string>
+ <string name="serviceEnabled" msgid="8147278346414714315">"සේවà·à·€ සබල කරන ලදි."</string>
+ <string name="serviceEnabledFor" msgid="6856228140453471041">"සේවà·à·€ සබලයි, සඳහà·:"</string>
+ <string name="serviceDisabled" msgid="1937553226592516411">"සේවà·à·€ à¶…à¶¶à¶½ කරන ලදි."</string>
+ <string name="serviceRegistered" msgid="6275019082598102493">"ලියà·à¶´à¶¯à·’à¶‚à¶ à·’ වීම à·ƒà·à¶»à·Šà¶®à¶šà¶ºà·’."</string>
+ <string name="serviceErased" msgid="1288584695297200972">"මà·à¶šà·“ම à·ƒà·à¶»à·Šà¶®à¶š විය."</string>
+ <string name="passwordIncorrect" msgid="7612208839450128715">"à·€à·à¶»à¶¯à·’ මුරපදයක්."</string>
+ <string name="mmiComplete" msgid="8232527495411698359">"MMI සම්පූර්ණයි."</string>
+ <string name="badPin" msgid="9015277645546710014">"ඔබ ටයිප් කරන ලද පරණ PIN à¶‘à¶š à·€à·à¶»à¶¯à·’ය."</string>
+ <string name="badPuk" msgid="5487257647081132201">"ඔබ ටයිප් කරන ලද PUK à¶‘à¶š à·€à·à¶»à¶¯à·’යි."</string>
+ <string name="mismatchPin" msgid="609379054496863419">"ඔබ ටයිප් à¶šà¶½ PIN නොගà·à·…à¶´à·š."</string>
+ <string name="invalidPin" msgid="3850018445187475377">"4 සිට 8 දක්ව෠අංක සහිත PIN එකක් ටයිප් කරන්න."</string>
+ <string name="invalidPuk" msgid="8761456210898036513">"à¶…à¶‚à¶š 8 à¶šà·Š à·„à· à¶Šà¶§ à·€à·à¶©à·’ PUK à¶‘à¶šà¶šà·Š ටයිප් කරන්න."</string>
+ <string name="needPuk" msgid="919668385956251611">"ඔබගේ SIM à¶´à¶­ à¶´à¶­à¶§ PUK අගුළු à·€à·à¶§à·“ ඇත. එම අගුල ඇරීමට PUK කේතය ටයිප් කරන්න."</string>
+ <string name="needPuk2" msgid="4526033371987193070">"SIM පතේ අගුළු ඇරීමට PUK2 ටයිප් කරන්න."</string>
+ <string name="imei" msgid="2625429890869005782">"IMEI"</string>
+ <string name="meid" msgid="4841221237681254195">"MEID"</string>
+ <string name="ClipMmi" msgid="6952821216480289285">"à¶´à·à¶¸à·’ණෙන අමතන්නà·à¶œà·š ID"</string>
+ <string name="ClirMmi" msgid="7784673673446833091">"à¶´à·’à¶§à¶­à¶§ යන අමතන්නà·à¶œà·š ID"</string>
+ <string name="CfMmi" msgid="5123218989141573515">"ඇමතුම ඉදිරියට යà·à·€à·“ම"</string>
+ <string name="CwMmi" msgid="9129678056795016867">"ඇමතුම් à¶»à·à¶³à·“ම"</string>
+ <string name="BaMmi" msgid="455193067926770581">"ඇමතුම අවහිර කිරීම"</string>
+ <string name="PwdMmi" msgid="7043715687905254199">"මුරපදය වෙනස් කිරීම"</string>
+ <string name="PinMmi" msgid="3113117780361190304">"PIN වෙනස් වී ඇත"</string>
+ <string name="CnipMmi" msgid="3110534680557857162">"ඇමතුම් අංකය ඇත"</string>
+ <string name="CnirMmi" msgid="3062102121430548731">"ඇමතුම් අංකය සීම෠කර ඇත"</string>
+ <string name="ThreeWCMmi" msgid="9051047170321190368">"තුන් මà·à¶»à·Šà¶œ ඇමතීම"</string>
+ <string name="RuacMmi" msgid="7827887459138308886">"අනවà·à·Šâ€à¶º හිරිහà·à¶»à¶¯à·à¶ºà¶š ඇමතුම් à¶´à·Šâ€à¶»à¶­à·’à¶šà·Šà·‚à·šà¶´ කිරීම"</string>
+ <string name="CndMmi" msgid="3116446237081575808">"ඇමතීමේ අංකය à¶·à·à¶»à¶¯à·“ම"</string>
+ <string name="DndMmi" msgid="1265478932418334331">"à¶¶à·à¶°à· නොකරන්න"</string>
+ <string name="CLIRDefaultOnNextCallOn" msgid="429415409145781923">"අමතන්නà·à¶œà·š ID සුපුරුද්ද අනුව සීම෠වී ඇත. මීළඟ ඇමතුම: සීම෠කර ඇත"</string>
+ <string name="CLIRDefaultOnNextCallOff" msgid="3092918006077864624">"අමතන්නà·à¶œà·š ID සුපුරුදු අනුව සීම෠වී ඇත. මීළඟ ඇමතුම: සීම෠කර à¶±à·à¶­"</string>
+ <string name="CLIRDefaultOffNextCallOn" msgid="6179425182856418465">"අමතන්නà·à¶œà·š ID සුපුරුදු අනුව සීම෠වී à¶±à·à¶­. මීළඟ ඇමතුම: සීම෠කර ඇත"</string>
+ <string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"අමතන්නà·à¶œà·š ID සුපුරුදු අනුව සීම෠වී à¶±à·à¶­. මීළඟ ඇමතුම: සීම෠කර ඇත"</string>
+ <string name="serviceNotProvisioned" msgid="8614830180508686666">"සේවà·à·€à¶±à·Š සපය෠නà·à¶­."</string>
+ <string name="CLIRPermanent" msgid="3377371145926835671">"අමතන්නà·à¶œà·š ID à·ƒà·à¶šà·ƒà·“ම ඔබට වෙනස්කල නොහà·à¶š."</string>
+ <string name="RestrictedChangedTitle" msgid="5592189398956187498">"සීමිත à¶´à·Šâ€à¶»à·€à·šà·à¶º වෙනස් කෙරිණි"</string>
+ <string name="RestrictedOnData" msgid="8653794784690065540">"දත්ත සේවà·à·€ අවහිර à¶šà¶» ඇත."</string>
+ <string name="RestrictedOnEmergency" msgid="6581163779072833665">"හදිසි සේවà·à·€ අවහිර à¶šà¶» ඇත."</string>
+ <string name="RestrictedOnNormal" msgid="4953867011389750673">"හඬ සේවà·à·€ à¶¶à·à¶°à· à¶šà¶» ඇත."</string>
+ <string name="RestrictedOnAllVoice" msgid="3396963652108151260">"සියලු හඬ සේව෠අවහිර කර ඇත."</string>
+ <string name="RestrictedOnSms" msgid="8314352327461638897">"SMS සේවà·à·€ අවහිර à¶šà¶» ඇත."</string>
+ <string name="RestrictedOnVoiceData" msgid="996636487106171320">"හඬ/දත්ත සේව෠අවහිර කර ඇත."</string>
+ <string name="RestrictedOnVoiceSms" msgid="1888588152792023873">"හඬ/SMS සේව෠අවහිර කර ඇත."</string>
+ <string name="RestrictedOnAll" msgid="5643028264466092821">"සියලුම හඬ/දත්ත/SMS සේවà·à·€à¶±à·Š à¶¶à·à¶°à· à¶šà¶» ඇත."</string>
+ <string name="serviceClassVoice" msgid="1258393812335258019">"හඬ"</string>
+ <string name="serviceClassData" msgid="872456782077937893">"දත්ත"</string>
+ <string name="serviceClassFAX" msgid="5566624998840486475">"à·†à·à¶šà·Šà·ƒà·Š"</string>
+ <string name="serviceClassSMS" msgid="2015460373701527489">"SMS"</string>
+ <string name="serviceClassDataAsync" msgid="4523454783498551468">"අසමමුහුර්ත කරන්න"</string>
+ <string name="serviceClassDataSync" msgid="7530000519646054776">"සමමුහුර්ත කිරීම"</string>
+ <string name="serviceClassPacket" msgid="6991006557993423453">"à¶´à·à¶šà·à¶§à·Šà¶§à·”à·€"</string>
+ <string name="serviceClassPAD" msgid="3235259085648271037">"PAD"</string>
+ <string name="roamingText0" msgid="7170335472198694945">"à¶»à·à¶¸à·’à¶‚ දර්à·à¶šà¶º සක්â€à¶»à·’යයි"</string>
+ <string name="roamingText1" msgid="5314861519752538922">"à¶»à·à¶¸à·’à¶‚ දර්à·à¶šà¶º à¶…à¶šà·Šâ€à¶»à·’යයි"</string>
+ <string name="roamingText2" msgid="8969929049081268115">"à¶»à·à¶¸à·’à¶‚ දර්à·à¶šà¶º à·ƒà·à¶«à·™à¶½à·’ වෙයි"</string>
+ <string name="roamingText3" msgid="5148255027043943317">"වටපිටà·à·€à·™à¶±à·Š ඉවත්ව"</string>
+ <string name="roamingText4" msgid="8808456682550796530">"ගොඩනà·à¶œà·’ල්ලෙන් à¶´à·’à¶§à¶­"</string>
+ <string name="roamingText5" msgid="7604063252850354350">"à¶»à·à¶¸à·’à¶‚ - à¶šà·à¶¸à¶­à·’ පද්ධතිය"</string>
+ <string name="roamingText6" msgid="2059440825782871513">"à¶»à·à¶¸à·’à¶‚ - ලබà·à¶œà¶­ à·„à·à¶šà·’ පද්ධතිය"</string>
+ <string name="roamingText7" msgid="7112078724097233605">"à¶»à·à¶¸à·’à¶‚ - මිත්â€à¶» හවුල්කරු"</string>
+ <string name="roamingText8" msgid="5989569778604089291">"à¶»à·à¶¸à·’à¶‚ - අධිමිල හවුල්කරු"</string>
+ <string name="roamingText9" msgid="7969296811355152491">"à¶»à·à¶¸à·’à¶‚ - සම්පූර්ණ සේව෠ක්â€à¶»à·’යà·à¶šà·à¶»à·’ත්වය"</string>
+ <string name="roamingText10" msgid="3992906999815316417">"à¶»à·à¶¸à·’à¶‚ - අසම්පූර්ණ සේව෠ක්â€à¶»à·’යà·à¶šà·à¶»à·“ත්වය"</string>
+ <string name="roamingText11" msgid="4154476854426920970">"à¶»à·à¶¸à·’à¶‚ à¶¶à·à¶±à¶»à¶º සක්â€à¶»à·“යයි"</string>
+ <string name="roamingText12" msgid="1189071119992726320">"à¶»à·à¶¸à·’à¶‚ à¶¶à·à¶±à¶»à¶º à¶…à¶šà·Šâ€à¶»à·’යයි"</string>
+ <string name="roamingTextSearching" msgid="8360141885972279963">"සේවà·à·€ සඳහ෠සොයමින්"</string>
+ <string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: ඉදිරියට නොයවන ලදි"</string>
+ <string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
+ <string name="cfTemplateForwardedTime" msgid="9206251736527085256">"<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" msgid="5073237827620166285">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: ඉදිරියට නොයවන ලදි"</string>
+ <string name="cfTemplateRegisteredTime" msgid="6781621964320635172">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: ඉදිරියට නොයවන ලදි"</string>
+ <string name="fcComplete" msgid="3118848230966886575">"අංග කේතය සම්පූර්ණයි."</string>
+ <string name="fcError" msgid="3327560126588500777">"සම්බන්ධත෠ගà·à¶§à·…ුවක් හ෠අවලංගු විà·à·šà·‚à·à¶‚à¶œ කේතයකි."</string>
+ <string name="httpErrorOk" msgid="1191919378083472204">"හරි"</string>
+ <string name="httpError" msgid="7956392511146698522">"à¶¢à·à¶½ දà·à·‚යක් තිබුණි."</string>
+ <string name="httpErrorLookup" msgid="4711687456111963163">"URL ය සෙවිය නොහà·à¶š."</string>
+ <string name="httpErrorUnsupportedAuthScheme" msgid="6299980280442076799">"අඩවියේ සත්â€à¶ºà·à¶´à¶± à¶´à¶§à·’à¶´à·à¶§à·’ය වෙත සහය නොදක්වයි."</string>
+ <string name="httpErrorAuth" msgid="1435065629438044534">"සත්â€à¶ºà·à¶´à¶±à¶º à¶šà·… නොහà·à¶š"</string>
+ <string name="httpErrorProxyAuth" msgid="1788207010559081331">"à¶´à·Šâ€à¶»à·œà¶šà·Šà·ƒà·’ සේවà·à¶¯à·à¶ºà¶šà¶º හරහ෠සත්â€à¶ºà·à¶´à¶±à¶º à¶…à·ƒà·à¶»à·Šà¶®à¶šà¶º."</string>
+ <string name="httpErrorConnect" msgid="8714273236364640549">"සේවà·à¶¯à·à¶ºà¶šà¶ºà·à¶§ සම්බන්ධ විය නොහà·à¶š."</string>
+ <string name="httpErrorIO" msgid="2340558197489302188">"සේවà·à¶¯à·à¶ºà¶šà¶ºà· සමග සම්බන්ධ වීමට නොහà·à¶šà·’ විය. à¶±à·à·€à¶­ උත්සහ කරන්න."</string>
+ <string name="httpErrorTimeout" msgid="4743403703762883954">"සේවà·à¶¯à·à¶ºà¶šà¶º වෙත සම්බන්ධතà·à·€à¶º කල් ඉකුත් විණි."</string>
+ <string name="httpErrorRedirectLoop" msgid="8679596090392779516">"පිටුවේ බොහ෠සේවà·à¶¯à·à¶ºà¶š à¶±à·à·€à¶­ හරව෠යà·à·€à·“ම් අඩංගු වේ."</string>
+ <string name="httpErrorUnsupportedScheme" msgid="5015730812906192208">"à¶´à·Šâ€à¶»à·œà¶§à·à¶šà·à¶½à¶º වෙත සහය නොදක්වයි."</string>
+ <string name="httpErrorFailedSslHandshake" msgid="96549606000658641">"සුරක්ෂිත සම්බන්ධතà·à·€à¶ºà¶šà·Š පිහිටුවීමට නොහà·à¶šà·’ විය."</string>
+ <string name="httpErrorBadUrl" msgid="3636929722728881972">"URL වලංගු නොවන නිස෠පිටුව විවෘත කිරීමට නොහà·à¶šà·’ විය."</string>
+ <string name="httpErrorFile" msgid="2170788515052558676">"ගොනුව වෙත පිවිසිය නොහà·à¶š."</string>
+ <string name="httpErrorFileNotFound" msgid="6203856612042655084">"ඉල්ලන ලද ගොනු සෙවිය නොහà·à¶š."</string>
+ <string name="httpErrorTooManyRequests" msgid="1235396927087188253">"ඉල්ලීම් විà·à·à¶½ à¶´à·Šâ€à¶»à¶¸à·à¶«à¶ºà¶šà·Š à¶šà·Šâ€à¶»à·’යà·à¶­à·Šà¶¸à¶š වෙමින් පවතියි. පසුව à¶±à·à·€à¶­ à¶‹à¶­à·Šà·ƒà·à·„ කරන්න."</string>
+ <string name="notification_title" msgid="8967710025036163822">"<xliff:g id="ACCOUNT">%1$s</xliff:g> සඳහ෠පුරනය වීමේ දà·à·‚යක්"</string>
+ <string name="contentServiceSync" msgid="8353523060269335667">"සමමුහුර්ත කිරීම"</string>
+ <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"සමමුහුර්ත කරන්න"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"<xliff:g id="CONTENT_TYPE">%s</xliff:g> මà·à¶šà·“ම් à·€à·à¶©à·’ය"</string>
+ <string name="low_memory" product="tablet" msgid="6494019234102154896">"à¶§à·à¶¶à·Šà¶½à¶§à·Š ආචයනය පිරි ඇත. ඉඩ නිදහස් කිරීමට සමහර ගොනු මකන්න."</string>
+ <string name="low_memory" product="default" msgid="3475999286680000541">"දුරකථන ආචයනය පිරී ඇත. ඉඩ නිදහස් කිරීමට සමහර ගොනු මකන්න."</string>
+ <string name="me" msgid="6545696007631404292">"මම"</string>
+ <string name="power_dialog" product="tablet" msgid="8545351420865202853">"à¶§à·à¶¶à·Šà¶½à¶§ විකල්ප"</string>
+ <string name="power_dialog" product="default" msgid="1319919075463988638">"දුරකථන විකල්පයන්"</string>
+ <string name="silent_mode" msgid="7167703389802618663">"නිහඬ ආකà·à¶»à¶º"</string>
+ <string name="turn_on_radio" msgid="3912793092339962371">"නොරà·à·„න් සක්â€à¶»à·’ය කරන්න"</string>
+ <string name="turn_off_radio" msgid="8198784949987062346">"නොරà·à·„à·à¶±à·Š à¶…à¶šà·Šâ€à¶»à·’ය කරන්න"</string>
+ <string name="screen_lock" msgid="799094655496098153">"තිර අගුල"</string>
+ <string name="power_off" msgid="4266614107412865048">"බලය à¶…à¶šà·Šâ€à¶»à·’ය කරන්න"</string>
+ <string name="silent_mode_silent" msgid="319298163018473078">"හඬ නඟනය à¶…à¶šà·Šâ€à¶»à·’යයි"</string>
+ <string name="silent_mode_vibrate" msgid="7072043388581551395">"හඬ නඟනය කම්පනය"</string>
+ <string name="silent_mode_ring" msgid="8592241816194074353">"හඬ නඟනය සක්â€à¶»à·“යයි"</string>
+ <string name="shutdown_progress" msgid="2281079257329981203">"වස෠දමමින්…"</string>
+ <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"ඔබගේ à¶§à·à¶¶à·Šà¶½à¶§à¶º à·€à·à·ƒà·š."</string>
+ <string name="shutdown_confirm" product="default" msgid="649792175242821353">"ඔබගේ දුරකථනය à·€à·à·ƒà·š."</string>
+ <string name="shutdown_confirm_question" msgid="2906544768881136183">"ඔබට වස෠දà·à¶¸à·“මට à¶…à·€à·à·Šâ€à¶ºà¶¯?"</string>
+ <string name="reboot_safemode_title" msgid="7054509914500140361">"ආරක්â€à·‚à·’à¶­ ආකà·à¶»à¶ºà¶§ à¶±à·à·€à¶­ à¶´à¶« ගන්වන්න"</string>
+ <string name="reboot_safemode_confirm" msgid="55293944502784668">"ආරක්â€à·‚à·’à¶­ ආකà·à¶»à¶ºà¶§ à¶±à·à·€à¶­ à¶´à¶« à¶œà·à¶±à·Šà·€à·“මට ඔබට à¶…à·€à·à·Šâ€à¶ºà¶¯? මෙමඟින් ඔබ ස්ථà·à¶´à·’à¶­ à¶šà¶» ඇති සියලුම තෙවන à¶´à·à¶»à·Šà·à·€à·“ය යෙදුම් සියල්ල à¶…à¶¶à¶½ වී යයි. ඔබ à¶±à·à·€à¶­ à¶´à¶« ගන්වන විට ඒව෠නà·à·€à¶­ පිහිටුවීම සිදු වේ."</string>
+ <string name="recent_tasks_title" msgid="3691764623638127888">"මෑත"</string>
+ <string name="no_recent_tasks" msgid="8794906658732193473">"මෑත යෙදුම් à¶±à·à¶­."</string>
+ <string name="global_actions" product="tablet" msgid="408477140088053665">"à¶§à·à¶¶à·Šà¶½à¶§à·Š විකල්ප"</string>
+ <string name="global_actions" product="default" msgid="2406416831541615258">"දුරකථන විකල්ප"</string>
+ <string name="global_action_lock" msgid="2844945191792119712">"තිර අගුල"</string>
+ <string name="global_action_power_off" msgid="4471879440839879722">"බලය à¶…à¶šà·Šâ€à¶»à·’ය කරන්න"</string>
+ <string name="global_action_bug_report" msgid="7934010578922304799">"දà·à·‚ වර්තà·à·€"</string>
+ <string name="bugreport_title" msgid="2667494803742548533">"දà·à·‚ à·€à·à¶»à·Šà¶­à·à·€à¶šà·Š ගන්න"</string>
+ <string name="bugreport_message" msgid="398447048750350456">"à¶Š-à¶­à·à¶´à·à¶½à·Š පණිවිඩයක් ලෙස යà·à·€à·“මට මෙය ඔබගේ වත්මන් à¶‹à¶´à·à¶‚à¶œ තත්වය à¶œà·à¶± තොරතුරු à¶‘à¶šà¶­à·” කරනු ඇත. දà·à·‚ à·€à·à¶»à·Šà¶­à·à·€ ආරම්භ à¶šà¶» එය යà·à·€à·“මට සූදà·à¶±à¶¸à·Š කරන තෙක් එයට කිසියම් à¶šà·à¶½à¶ºà¶šà·Š ගතවනු ඇත; කරුණà·à¶šà¶» ඉවසන්න."</string>
+ <string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"නිහඬ ආකà·à¶»à¶º"</string>
+ <string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"à·à¶¶à·Šà¶¯à¶º à¶…à¶šà·Šâ€à¶»à·’යයි"</string>
+ <string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"හඬ සක්â€à¶»à·’යයි"</string>
+ <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"අහස්යà·à¶±à· ආකà·à¶»à¶º"</string>
+ <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"අහස්යà·à¶±à· ආකà·à¶»à¶º සක්â€à¶»à·“යයි."</string>
+ <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"අහස්යà·à¶±à· à¶…à¶šà·à¶»à¶º à¶…à¶šà·Šâ€à¶»à·’යයි"</string>
+ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
+ <string name="safeMode" msgid="2788228061547930246">"ආරක්â€à·‚à·’à¶­ ආකà·à¶»à¶º"</string>
+ <string name="android_system_label" msgid="6577375335728551336">"Android පද්ධතිය"</string>
+ <string name="permgrouplab_costMoney" msgid="5429808217861460401">"ඔබගේ මුදල් à·€à·à¶ºà·€à¶± සේවà·à·€à¶±à·Š"</string>
+ <string name="permgroupdesc_costMoney" msgid="3293301903409869495">"ඔබගෙන් මුදල් යන දේවල් කරන්න."</string>
+ <string name="permgrouplab_messages" msgid="7521249148445456662">"ඔබගේ පණිවිඩ"</string>
+ <string name="permgroupdesc_messages" msgid="7821999071003699236">"ඔබගේ SMS, à¶Š-à¶­à·à¶´à·à¶½à·Š, සහ වෙනත් පණිවිඩ කියවන්න සහ ලියන්න."</string>
+ <string name="permgrouplab_personalInfo" msgid="3519163141070533474">"ඔබගේ පෞද්ගලික තොරතුරු"</string>
+ <string name="permgroupdesc_personalInfo" msgid="8426453129788861338">"ඔබගේ සම්බන්ධත෠පතේ ආචයනය කරන ලද, ඔබ à¶œà·à¶± තොරතුරු වලට à¶à¶¢à·” à¶´à·Šâ€à¶»à·€à·šà·à¶º."</string>
+ <string name="permgrouplab_socialInfo" msgid="5799096623412043791">"ඔබගේ සමà·à¶¢à¶ºà·“ය තොරතුරු"</string>
+ <string name="permgroupdesc_socialInfo" msgid="7129842457611643493">"ඔබගේ සම්බන්ධත෠සහ à·ƒà·à¶¸à·à¶¢ සම්බන්ධයන් à¶œà·à¶± තොරතුරු වෙත à¶à¶¢à·” à¶´à·Šâ€à¶»à·€à·šà·à¶º."</string>
+ <string name="permgrouplab_location" msgid="635149742436692049">"ඔබගේ ස්ථà·à¶±à¶º"</string>
+ <string name="permgroupdesc_location" msgid="5704679763124170100">"ඔබගේ භෞතික පිහිටුම නිරීක්ෂණය කරයි."</string>
+ <string name="permgrouplab_network" msgid="5808983377727109831">"à¶¢à·à¶½ සන්නිවේදනය"</string>
+ <string name="permgroupdesc_network" msgid="4478299413241861987">"විවිධ à¶¢à·à¶½ විà·à·šà·‚à·à¶‚à¶œ වෙත පිවිසෙන්න."</string>
+ <string name="permgrouplab_bluetoothNetwork" msgid="1585403544162128109">"බ්ලූටූත්"</string>
+ <string name="permgroupdesc_bluetoothNetwork" msgid="5625288577164282391">"බ්ලූටූත් ඔස්සේ à¶‹à¶´à·à¶‚à¶œ සහ à¶¢à·à¶½ වෙත පිවිසෙන්න."</string>
+ <string name="permgrouplab_audioSettings" msgid="8329261670151871235">"à·à·Šâ€à¶»à·€à·Šâ€à¶º à·ƒà·à¶šà·ƒà·“ම්"</string>
+ <string name="permgroupdesc_audioSettings" msgid="2641515403347568130">"à·à·Šâ€à¶»à·€à·Šâ€à¶º à·ƒà·à¶šà·ƒà·“ම් වෙනස් කරන්න."</string>
+ <string name="permgrouplab_affectsBattery" msgid="6209246653424798033">"à¶¶à·à¶§à¶»à·’ය වෙත බලපà·à¶ºà·’"</string>
+ <string name="permgroupdesc_affectsBattery" msgid="6441275320638916947">"à¶¶à·à¶§à¶»à·’යේ බලය à¶šà·Šà·‚à¶«à·’à¶šà·€ à¶…à¶©à·” වන විà·à·šà·‚à·à¶‚à¶œ à¶·à·à·€à·’à¶­ කරන්න."</string>
+ <string name="permgrouplab_calendar" msgid="5863508437783683902">"දින දර්à·à¶±à¶º"</string>
+ <string name="permgroupdesc_calendar" msgid="5777534316982184416">"දින දර්à·à¶± සිද්ධින්ට සෘජුව à¶´à·Šâ€à¶»à·€à·šà· වීම."</string>
+ <string name="permgrouplab_dictionary" msgid="4148597128843641379">"පරිà·à·“ලක à·à¶¶à·Šà¶¯ à¶šà·à·‚ය කියවන්න"</string>
+ <string name="permgroupdesc_dictionary" msgid="7921166355964764490">"පරිà·à·“ලක à·à¶¶à·Šà¶¯ à¶šà·à·‚යේ වචන කියවීම."</string>
+ <string name="permgrouplab_writeDictionary" msgid="8090237702432576788">"පරිà·à·“ලක à·à¶¶à·Šà¶¯à¶šà·à·‚යට ලිවිම"</string>
+ <string name="permgroupdesc_writeDictionary" msgid="2711561994497361646">"පරිà·à·“ලක à·à¶¶à·Šà¶¯à¶šà·à·‚යට වචන à¶‘à¶šà¶­à·” කරන්න."</string>
+ <string name="permgrouplab_bookmarks" msgid="1949519673103968229">"පිටුසන් සහ ඉතිහà·à·ƒà¶º"</string>
+ <string name="permgroupdesc_bookmarks" msgid="4169771606257963028">"පිටුසන් සහ à¶¶à·Šâ€à¶»à·€à·Šà·ƒà¶» ඉතිහà·à·ƒà¶º වෙත à¶à¶¢à·” à¶´à·Šâ€à¶»à·€à·šà·à¶º."</string>
+ <string name="permgrouplab_deviceAlarms" msgid="6117704629728824101">"සීනුව"</string>
+ <string name="permgroupdesc_deviceAlarms" msgid="4769356362251641175">"සීනුව සකසන්න."</string>
+ <string name="permgrouplab_voicemail" msgid="4162237145027592133">"හඬ à¶­à·à¶´à·‘à¶½"</string>
+ <string name="permgroupdesc_voicemail" msgid="2498403969862951393">"හඬ à¶­à·à¶´à·‘à¶½ වෙත à¶à¶¢à·” à¶´à·Šâ€à¶»à·€à·šà·à¶º."</string>
+ <string name="permgrouplab_microphone" msgid="171539900250043464">"මයික්â€à¶»à·œà·†à·à¶±à¶º"</string>
+ <string name="permgroupdesc_microphone" msgid="7106618286905738408">"à·à¶¶à·Šà¶¯à¶º පටිගත කිරීමට මයික්â€à¶»à·œà·†à·à¶±à¶º වෙත à¶à¶¢à·” à¶´à·Šâ€à¶»à·€à·šà·à¶º."</string>
+ <string name="permgrouplab_camera" msgid="4820372495894586615">"à¶šà·à¶¸à¶»à·à·€"</string>
+ <string name="permgroupdesc_camera" msgid="2933667372289567714">"à¶¡à·à¶ºà·à¶»à·–à¶´ හ෠වීඩිය෠ග්â€à¶»à·„ණය සඳහ෠කà·à¶¸à¶»à·à·€ වෙත à¶à¶¢à·” à¶´à·Šâ€à¶»à·€à·šà·à¶º."</string>
+ <string name="permgrouplab_screenlock" msgid="8275500173330718168">"අගුළු තිරය"</string>
+ <string name="permgroupdesc_screenlock" msgid="7067497128925499401">"ඔබගේ à¶‹à¶´à·à¶‚ගයේ අගුළු තිරයේ à¶šà·Šâ€à¶»à·’යà·à¶šà·à¶»à·’ත්වයට බලපà·à¶± à·„à·à¶šà·’යà·à·€."</string>
+ <string name="permgrouplab_appInfo" msgid="8028789762634147725">"ඔබගේ යෙදුම් වල තොරතුරු"</string>
+ <string name="permgroupdesc_appInfo" msgid="3950378538049625907">"ඔබගේ à¶‹à¶´à·à¶‚ගයේ වෙනත් යෙදුම් වල à¶šà·Šâ€à¶»à·’යà·à¶šà·à¶»à·’ත්වයට බලපෑම් à¶šà·… à·„à·à¶šà·’ à¶¶à·€."</string>
+ <string name="permgrouplab_wallpaper" msgid="3850280158041175998">"බිතුපත"</string>
+ <string name="permgroupdesc_wallpaper" msgid="5630417854750540154">"à¶‹à¶´à·à¶‚à¶œ බිතුපතේ à·ƒà·à¶šà·ƒà·“ම් වෙනස් කරන්න."</string>
+ <string name="permgrouplab_systemClock" msgid="406535759236612992">"ඔරලà·à·ƒà·”à·€"</string>
+ <string name="permgroupdesc_systemClock" msgid="3944359833624094992">"à¶‹à¶´à·à¶‚à¶œ à¶šà·à¶½ à·„à· à¶šà·à¶½ à¶šà¶½à·à¶´ වෙනස් කරන්න."</string>
+ <string name="permgrouplab_statusBar" msgid="2095862568113945398">"තත්ව තීරුව"</string>
+ <string name="permgroupdesc_statusBar" msgid="6242593432226807171">"à¶‹à¶´à·à¶‚à¶œ à¶­à¶­à·Šà·€ තීරු à·ƒà·à¶šà·ƒà·“ම් වෙනස් කරන්න."</string>
+ <string name="permgrouplab_syncSettings" msgid="3341990986147826541">"සමමුහුර්ත à·ƒà·à¶šà·ƒà·“ම්"</string>
+ <string name="permgroupdesc_syncSettings" msgid="7603195265129031797">"සමමුහුර්ත à·ƒà·à¶šà·ƒà·“ම් වෙත à¶´à·Šâ€à¶»à·€à·šà·à¶º."</string>
+ <string name="permgrouplab_accounts" msgid="3359646291125325519">"ඔබගේ ගිණුම්"</string>
+ <string name="permgroupdesc_accounts" msgid="4948732641827091312">"ලබà·à¶œà¶­ à·„à·à¶šà·’ ගිණුම් වලට à¶´à·Šâ€à¶»à·€à·šà· වීම."</string>
+ <string name="permgrouplab_hardwareControls" msgid="7998214968791599326">"දෘඩà·à¶‚à¶œ à¶´à·à¶½à¶š"</string>
+ <string name="permgroupdesc_hardwareControls" msgid="4357057861225462702">"හෑන්ඩ්සෙටයේ දෘඩà·à¶‚à¶œ වලට සෘජුවම à¶´à·Šâ€à¶»à·€à·šà· වන්න."</string>
+ <string name="permgrouplab_phoneCalls" msgid="9067173988325865923">"දුරකථන ඇමතුම්"</string>
+ <string name="permgroupdesc_phoneCalls" msgid="7489701620446183770">"දුරකථන ඇමතුම් නිරීක්ෂණය කරන්න, පටිගත කරන්න සහ à¶šà·Šâ€à¶»à·’යà·à¶­à·Šà¶¸à¶š කරන්න."</string>
+ <string name="permgrouplab_systemTools" msgid="4652191644082714048">"පද්ධති මෙවලම්"</string>
+ <string name="permgroupdesc_systemTools" msgid="8162102602190734305">"පද්ධතියේ à¶´à·„à¶½ මට්ටම් à¶´à·Šâ€à¶»à·€à·šà·à¶º සහ à¶´à·à¶½à¶±à¶º."</string>
+ <string name="permgrouplab_developmentTools" msgid="3446164584710596513">"සංවර්ධක මෙවලම්"</string>
+ <string name="permgroupdesc_developmentTools" msgid="7058828032358142018">"යෙදුම් සංවර්ධකයන් සඳහ෠පමණක් à¶…à·€à·à·Šâ€à¶º විà·à·šà·‚à·à¶‚à¶œ."</string>
+ <string name="permgrouplab_display" msgid="4279909676036402636">"වෙනත් යෙදුම් UI"</string>
+ <string name="permgroupdesc_display" msgid="6051002031933013714">"වෙනත් යෙදුම්වල UI සඳහ෠බලපà·à¶ºà·’."</string>
+ <string name="permgrouplab_storage" msgid="1971118770546336966">"ආචයනය"</string>
+ <string name="permgroupdesc_storage" product="nosdcard" msgid="7442318502446874999">"USB ආචයනය වෙත à¶´à·Šâ€à¶»à·€à·šà·à¶º."</string>
+ <string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"SD à¶´à¶­ වෙත à¶´à·Šâ€à¶»à·€à·šà·à¶º."</string>
+ <string name="permgrouplab_accessibilityFeatures" msgid="7919025602283593907">"à¶´à·Šâ€à¶»à·€à·šà·à·Šâ€à¶ºà¶­à· විà·à·šà·‚à·à¶‚à¶œ"</string>
+ <string name="permgroupdesc_accessibilityFeatures" msgid="4205196881678144335">"à¶‹à¶´à¶šà·à¶»à·“වන à¶­à·à¶šà·Šà·‚à¶« ඉල්ලීම් à¶šà·… à·„à·à¶šà·’ විà·à·šà·‚à·à¶‚à¶œ."</string>
+ <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"කවුළු අන්න්තර්ගතය ලබà·à¶œà¶±à·Šà¶±"</string>
+ <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"ඔබ අන්තර්ක්â€à¶»à·’යà·à¶šà·à¶»à·“ වන කවුළුවේ අන්තර්ගතය පරීක්ෂ෠කරන්න."</string>
+ <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"ස්පර්à·à¶ºà·™à¶±à·Š ගවේෂණය සක්â€à¶»à·’ය කරන්න"</string>
+ <string name="capability_desc_canRequestTouchExploration" msgid="5800552516779249356">"ස්පර්෠කරන අයිතම හඬ නග෠කත෠කෙරෙනු ඇති à¶…à¶­à¶» ඉංගිති à¶·à·à·€à·’තයෙන් තිරය ගවේෂණය කිරීමට පුළුවනි."</string>
+ <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"උසස් වෙබ් à¶´à·Šâ€à¶»à·€à·šà·à·Šâ€à¶ºà¶­à·à·€ සක්â€à¶»à·’ය කරන්න"</string>
+ <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"යෙදුම් අන්තර්ගතයට à¶´à·Šâ€à¶»à·€à·šà·à·Šâ€à¶ºà¶­à·à·€à¶º à·€à·à¶©à·’වන ලෙස සකස් කිරීමට ඇතà·à¶¸à·Š විට ස්ක්â€à¶»à·’à¶´à·Šà¶§à·Š ස්ථà·à¶´à¶±à¶º à¶šà¶» ඇත."</string>
+ <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"ඔබ ටයිප් කළ පෙළ බලන්න"</string>
+ <string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"ණයවරපත් à¶…à¶‚à¶š සහ මුරපද à·€à·à¶±à·’ පුද්ගලික දත්ත ඇතුළත් වේ."</string>
+ <string name="permlab_statusBar" msgid="7417192629601890791">"තත්ව තීරුව අබල කරන්න හ෠වෙනස් කරන්න"</string>
+ <string name="permdesc_statusBar" msgid="8434669549504290975">"à¶­à¶­à·Šà·€ තීරුව à¶…à¶šà·Šâ€à¶»à·’ය කිරීමට හ෠පද්ධති නිරූපක à¶‘à¶šà¶­à·” හ෠ඉවත් කිරීමට යෙදුමට අවසර දේ."</string>
+ <string name="permlab_statusBarService" msgid="7247281911387931485">"තත්ව තීරුව"</string>
+ <string name="permdesc_statusBarService" msgid="716113660795976060">"තත්ව තීරුව වීමට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_expandStatusBar" msgid="1148198785937489264">"à¶­à¶­à·Šà·€ තීරුව දිග à·„à·à¶»à·“ම/à·„à·à¶šà·’ලීම"</string>
+ <string name="permdesc_expandStatusBar" msgid="6917549437129401132">"à¶­à¶­à·Šà·€ තීරුව දිග à·„à·à¶»à·“මට à·„à· à·„à·à¶šà·’ළීමට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"පිටවන ඇමතුම් වල මග වෙනස් කිරීම"</string>
+ <string name="permdesc_processOutgoingCalls" msgid="5331318931937402040">"පිටවන ඇමතුම් සකස් කිරීමට සහ ඇමතීමට නියමිත අංකය වෙනස් කිරීමට යෙදුමට අවසර දෙන්න. මෙම අවසරයෙන් යෙදුමට පිටවන ඇමතුම් නිරීක්ෂණය, à¶±à·à·€à¶­ à·„à·à¶»à·€à·“ම à·„à· à·€à·à·…ක්වීම අවසර දෙයි."</string>
+ <string name="permlab_receiveSms" msgid="8673471768947895082">"කෙටි පණිවිඩ ලබà·à¶œà·à¶±à·“ම (SMS)"</string>
+ <string name="permdesc_receiveSms" msgid="6424387754228766939">"SMS පණිවිඩ à¶½à·à¶¶à·“මට සහ à¶šà·Šâ€à¶»à·’යà·à¶­à·Šà¶¸à¶š කිරීමට යෙදුමට අවසර දෙන්න. මෙහි තේරුම යෙදුමට ඔබගේ à¶‹à¶´à·à¶‚ගයට à¶½à·à¶¶à·™à¶± පණිවිඩ අධීක්ෂණය කිරීමට à·„à·à¶šà·’වීම වන à¶…à¶­à¶», ඒව෠ඔබට නොපෙන්ව෠මක෠දà·à¶¸à·“මටද à·„à·à¶šà·’ වීමයි."</string>
+ <string name="permlab_receiveMms" msgid="1821317344668257098">"පෙළ පණිවුඩ ලබà·à¶œà¶±à·Šà¶± (MMS)"</string>
+ <string name="permdesc_receiveMms" msgid="533019437263212260">"MMS පණිවිඩ සොය෠ලබà·à¶œà·à¶±à·“මට සහ à¶šà·Šâ€à¶»à·’යà·à¶­à·Šà¶¸à¶š කිරීමට යෙදුමට අවසර දෙන්න. යෙදුම නිරීක්ෂණය කරනු ලබන à¶…à¶­à¶» ඔබට à¶½à·à¶¶à·”à¶± පණිවිඩ පෙන්වීමෙන් තොරවම මක෠දà·à¶¸à·’ය à·„à·à¶šà·’ à¶¶à·€ මෙමඟින් අදහස් කරයි."</string>
+ <string name="permlab_receiveEmergencyBroadcast" msgid="1803477660846288089">"හදිසි විකà·à·à¶± ලබ෠ගà·à¶±à·“ම"</string>
+ <string name="permdesc_receiveEmergencyBroadcast" msgid="848524070262431974">"හදිසි විකà·à· පණිවිඩ à¶½à·à¶¶à·“මට සහ à¶šà·Šâ€à¶»à·’යà·à¶­à·Šà¶¸à¶š කිරීමට යෙදුමට අවසර දෙන්න. පද්ධති යෙදුම් වලට පමණක් මෙම අවසරය අදà·à·… වෙයි."</string>
+ <string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"සෙල් à¶´à·Šâ€à¶»à¶ à·à¶»à¶« පණිවිඩ කියවීම"</string>
+ <string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"ඔබගේ à¶‹à¶´à·à¶‚ගයට à¶½à·à¶¶à·”à¶«à·” සෙල් විකà·à·à¶± පණිවිඩ කියවීමට යෙදුමට අවසර දෙන්න. ඔබට හදිසි අවස්ථà·à·€à¶±à·Š à¶´à·’à·…à·’à¶¶à¶³ අනතුරු ඇඟවීමට සෙල් විකà·à·à¶± පණිවිඩ ඇතà·à¶¸à·Š ස්ථà·à¶±à·€à¶½ සිට යවනු ලබයි. හදිසි සෙල් විකà·à·à¶± à¶½à·à¶¶à·™à¶± අවස්ථà·à·€à¶šà¶¯à·“, අනිෂ්ට යෙදුම් මඟින් ඔබගේ à¶‹à¶´à·à¶‚ගයට à¶šà·à¶»à·Šà¶º à·ƒà·à¶°à¶±à¶ºà¶§ à·„à· à¶šà·Šâ€à¶»à·’යකරණයට à¶¶à·à¶°à· සිදුවිය à·„à·à¶š."</string>
+ <string name="permlab_sendSms" msgid="5600830612147671529">"SMS පණිවිඩ යà·à·€à·“ම"</string>
+ <string name="permdesc_sendSms" msgid="7094729298204937667">"SMS පණිවිඩ යà·à·€à·“මට යෙදුමට අවසර දෙන්න. මෙමඟින් à¶¶à¶½à·à¶´à·œà¶»à·œà¶­à·Šà¶­à·” නොවූ à¶´à·Šâ€à¶»à¶­à·’ඵල à¶…à¶­à·Š විය à·„à·à¶š. අනිෂ්ට යෙදුම් ඔබගේ තහවුරුවකින් තොරව පණිවිඩ යà·à·€à·“ම මඟින් ඔබගේ මුදල් à·€à·à¶º à¶šà¶½ à·„à·à¶š."</string>
+ <string name="permlab_sendRespondViaMessageRequest" msgid="8713889105305943200">"පණිවිඩ සිදුවීම හරහ෠ප්â€à¶»à¶­à·’à¶ à·à¶» යà·à·€à·“ම"</string>
+ <string name="permdesc_sendRespondViaMessageRequest" msgid="7107648548468778734">"à¶´à·à¶¸à·’ණෙන ඇමතුම් සඳහ෠පණිවිඩ ඔස්සේ à¶´à·Šâ€à¶»à¶­à·’à¶ à·à¶» සිදුවීම් හසුරුවීමට වෙනත් පණිවිඩ යෙදුම් සඳහ෠ඉල්ලීම් යà·à·€à·“මට, යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_readSms" msgid="8745086572213270480">"ඔබගේ පෙළ පණිවුඩ කියවන්න (SMS හ෠MMS)"</string>
+ <string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"ඔබගේ à¶§à·à¶¶à·Šà¶½à¶§à¶ºà·š à·„à· SIM à¶´à¶­à·š ආචයනය à¶šà¶» ඇති SMS පණිවිඩ කියවීමට යෙදුමට අවසර දෙන්න. අන්තර්ගතය හ෠විà·à·€à·à·ƒà¶¯à¶ºà·’ බවින් තොරවම සියලු SMS පණිවිඩ කියවීමට මෙමගින් යෙදුමට අවසර දෙයි."</string>
+ <string name="permdesc_readSms" product="default" msgid="3695967533457240550">"ඔබගේ දුරකථනයේ à·„à· SIM à¶´à¶­à·š ආචයනය කරන ලද SMS පණිවිඩ කියවීමට යෙදුමට අවසර දෙන්න. අන්තර්ගතය හ෠විà·à·Šà·€à·à·ƒà¶¯à·à¶ºà·“ බවින් තොරවම සියලු SMS පණිවිඩ කියවීමට මෙමගින් යෙදුමට අවසර දෙයි."</string>
+ <string name="permlab_writeSms" msgid="3216950472636214774">"ඔබගේ කෙටි පණිවිඩ සංස්කරණය කිරීම (SMS හ෠MMS)"</string>
+ <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"ඔබගේ à¶§à·à¶¶à·Šà¶½à¶§à¶ºà·š à·„à· SIM à¶´à¶­à·š ගබඩ෠කර ඇති SMS පණිවිඩ වෙත ලිවීමට යෙදුමට අවසර දෙන්න. අනිෂ්ට යෙදුම් ඔබගේ පණිවිඩ මක෠දà·à¶¸à·’ය à·„à·à¶š."</string>
+ <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"ඔබගේ à¶§à·à¶¶à·Šà¶½à¶§à¶ºà·š à·„à· SIM à¶´à¶­à·š ආචයනය කරන ලද SMS පණිවිඩ ලිවීමට යෙදුමට අවසර දෙන්න. අනිෂ්ට යෙදුම් ඔබගේ පණිවිඩ මක෠දà·à¶¸à·’ය à·„à·à¶š."</string>
+ <string name="permlab_receiveWapPush" msgid="5991398711936590410">"පෙළ පණිවිඩ ලබà·à¶œà·à¶±à·“ම (WAP)"</string>
+ <string name="permdesc_receiveWapPush" msgid="748232190220583385">"WAP පණිවිඩ à¶½à·à¶¶à·“මට සහ à¶šà·Šâ€à¶»à·’යà·à·€à¶½à·’ කිරීමට යෙදුමට අවසර දෙන්න. මෙම අවසරයෙහි ඔබව à¶’à·€à·à¶§ පෙන්වීමකින් තොරව ඔබට පණිවිඩ නිරීක්ෂණයට හ෠මà·à¶šà·“මට à·„à·à¶šà·’යà·à·€ ඇතුළත් වේ."</string>
+ <string name="permlab_getTasks" msgid="6466095396623933906">"à¶°à·à·€à¶±à¶º වන යෙදුම් ලබà·à¶œà·à¶±à·“ම"</string>
+ <string name="permdesc_getTasks" msgid="7454215995847658102">"දà·à¶±à¶§ සහ මෑත à¶šà·Šâ€à¶»à·’යà·à¶­à·Šà¶¸à¶š à¶šà·à¶»à·Šà¶ºà¶ºà¶±à·Š à¶´à·’à·…à·’à¶¶à¶³ විස්තරà·à¶­à·Šà¶¸à¶š තොරතුරු සොය෠ලබà·à¶œà·à¶±à·“මට යෙදුමට ඉඩ දෙන්න. මෙය කුමන යෙදුම් à¶‹à¶´à·à¶‚ගයේ à¶·à·à·€à·’ත෠කරන්නේද යන තොරතුරු යෙදුම්වලට සොය෠ගà·à¶±à·“මට ඉඩ දිය à·„à·à¶š."</string>
+ <string name="permlab_interactAcrossUsers" msgid="7114255281944211682">"පරිà·à·“ලකයන් à¶…à¶­à¶» අන්තර්ක්â€à¶»à·’යà·à¶šà·à¶»à·“ වන්න"</string>
+ <string name="permdesc_interactAcrossUsers" msgid="364670963623385786">"à¶‹à¶´à·à¶‚ගයේ විවිධ පරිà·à·“ලකයන් හරහ෠ක්â€à¶»à·’යà·à·€à¶±à·Š දà·à¶šà·Šà·€à·“මට යෙදුමට අවසර දෙන්න. පරිà·à·“ලකයන් à¶…à¶­à¶» ආරක්ෂà·à·€ කඩකිරීමට අනිෂ්ට යෙදුම් විසින් මෙය à¶·à·à·€à·’ත෠කිරීමට ඉඩ ඇත."</string>
+ <string name="permlab_interactAcrossUsersFull" msgid="2567734285545074105">"පරිà·à·“ලකයන් à¶…à¶­à¶» අන්තර් à¶šà·Šâ€à¶»à·’යà·à¶šà·à¶»à·“ වීමට සම්පූර්ණ බලපත්â€à¶»à¶º"</string>
+ <string name="permdesc_interactAcrossUsersFull" msgid="376841368395502366">"පරිà·à·“ලකයන් හරහ෠සිදු à¶šà·… à·„à·à¶šà·’ සියලු අන්තර් à¶šà·Šâ€à¶»à·’ය෠වලට අවසර දෙන්න."</string>
+ <string name="permlab_manageUsers" msgid="1676150911672282428">"පරිà·à·“ලකයන් කළමනà·à¶šà¶»à¶«à¶º කරන්න"</string>
+ <string name="permdesc_manageUsers" msgid="8409306667645355638">"විස්තර ලබ෠ගà·à¶±à·“ම, නිර්මà·à¶«à¶šà¶»à¶«à¶º, මකà·à¶¯à·à¶¸à·“ම ඇතුළු පරිà·à·“ලකයන් කළමනà·à¶šà¶»à¶«à¶ºà¶§ යෙදුම්වලට අවසර දෙන්න."</string>
+ <string name="permlab_getDetailedTasks" msgid="6229468674753529501">"à¶°à·à·€à¶±à¶º වන යෙදුම් වල තොරතුරු සොය෠ලබà·à¶œà·à¶±à·“ම"</string>
+ <string name="permdesc_getDetailedTasks" msgid="153824741440717599">"දà·à¶±à¶§ සහ මෑතක à¶šà·Šâ€à¶»à·’යà·à¶­à·Šà¶¸à¶š à¶šà·à¶»à·Šà¶ºà¶ºà¶±à·Š à¶´à·’à·…à·’à¶¶à¶³ විස්තරà·à¶­à·Šà¶¸à¶š තොරතුරු ලබà·à¶œà·à¶±à·“මට යෙදුමට අවසර දෙන්න අනිෂ්ට යෙදුම් අනෙකුත් යෙදුම් à¶´à·’à·…à·’à¶¶à¶³ පුද්ගලික තොරතුරු සොය෠ගà·à¶±à·“මට ඉඩ à¶­à·’à¶¶à·š."</string>
+ <string name="permlab_reorderTasks" msgid="2018575526934422779">"à¶°à·à·€à¶±à¶º වන යෙදුම් à¶±à·à·€à¶­ අනුපිළිවෙලට à·ƒà·à¶šà·ƒà·“ම"</string>
+ <string name="permdesc_reorderTasks" msgid="7734217754877439351">"පෙරබිමට හ෠පසුබිමට සිදුවීම් ගෙනයà·à¶¸à¶§ යෙදුමට අවසර දෙන්න. ඔබගේ ආදà·à¶±à¶ºà¶šà·’න් තොරව යෙදුම මෙය සිදුකරයි."</string>
+ <string name="permlab_removeTasks" msgid="6821513401870377403">"යෙදුම් à¶°à·à·€à¶±à¶º නවත්වන්න"</string>
+ <string name="permdesc_removeTasks" msgid="1394714352062635493">"à¶šà·à¶»à·Šà¶ºà¶ºà¶±à·Š ඉවත් කිරීමට සහ à¶’à·€à·à¶ºà·™à·„à·’ යෙදුම් à¶±à·à¶­à·’ කිරීමට යෙදුමට අවසර දෙන්න. අනෙක් යෙදුම් à·„à·à·ƒà·’රීම à¶¶à·à¶°à· කිරීමට අනිෂ්ට යෙදුම්වලට අවසර දෙන්න."</string>
+ <string name="permlab_manageActivityStacks" msgid="7391191384027303065">"à¶šà·Šâ€à¶»à·’යà·à¶šà·à¶»à¶šà¶¸à·Š à¶…à¶§à·Šà¶§à·’ කළමනà·à¶šà¶»à¶«à¶º කරන්න"</string>
+ <string name="permdesc_manageActivityStacks" msgid="1615881933034084440">"වෙනත් යෙදුම් à¶°à·à·€à¶±à¶º වන à¶šà·Šâ€à¶»à·’යà·à¶šà·à¶»à¶šà¶¸à·Š à¶…à¶§à·Šà¶§à·’ වලට à¶‘à¶šà¶­à·” කිරීමට, ඉවත් කිරීමට, සහ වෙනස් කිරීමට යෙදුමට අවසර දෙන්න. වෙනත් යෙදුම්වල à·„à·à·ƒà·’රීම අනිෂ්ට යෙදුම් මගින් à¶¶à·à¶°à· විය à·„à·à¶š."</string>
+ <string name="permlab_startAnyActivity" msgid="2918768238045206456">"ඕනෑම à¶šà·Šâ€à¶»à·’යà·à·€à¶šà·Š අරඹන්න"</string>
+ <string name="permdesc_startAnyActivity" msgid="997823695343584001">"අවසර ආරක්ෂà·à·€ හ෠යà·à·€à·”ම් තත්වයෙන් තොරවම ඕනෑම à¶šà·Šâ€à¶»à·’යà·à·€à¶šà·Š ආරම්භ කිරීමට යෙදුමට අවසර දේ."</string>
+ <string name="permlab_setScreenCompatibility" msgid="6975387118861842061">"à¶­à·’à¶» à¶œà·à·…පුම à·ƒà·à¶šà·ƒà·“ම"</string>
+ <string name="permdesc_setScreenCompatibility" msgid="692043618693917374">"වෙනත් යෙදුම්වල à¶­à·’à¶» à¶œà·à¶½à¶´à·”ම් මà·à¶¯à·’ලිය à¶´à·à¶½à¶±à¶ºà¶§ යෙදුමට අවසර දෙන්න. වෙනත් යෙදුම්වල à·„à·à·ƒà·’රීම අනිෂ්ට යෙදුම් à¶šà·à¶©à·’ය à·„à·à¶š."</string>
+ <string name="permlab_setDebugApp" msgid="3022107198686584052">"යෙදුම් නිදොස්කරණය සබල කිරීම"</string>
+ <string name="permdesc_setDebugApp" msgid="4474512416299013256">"වෙනත් යෙදුමක් සඳහ෠නිදොස්කරණය සක්â€à¶»à·’ය කිරීමට යෙදුමට අවසර දෙන්න. වෙනත් යෙදුම් විනà·à· කිරීමට අනිෂ්ට යෙදුම් මෙය à¶·à·à·€à·’à¶­ à¶šà·… à·„à·à¶š."</string>
+ <string name="permlab_changeConfiguration" msgid="4162092185124234480">"පද්ධති සංදර්à·à¶š à·ƒà·à¶šà·ƒà·“ම් වෙනස් කරන්න"</string>
+ <string name="permdesc_changeConfiguration" msgid="4372223873154296076">"පෙදෙසිය හ෠සම්පූර්ණ අකුරු à¶´à·Šâ€à¶»à¶¸à·à¶«à¶º à·€à·à¶±à·’ පවතින වින්â€à¶ºà·à·ƒà¶º වෙනස් කිරීමට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_enableCarMode" msgid="5684504058192921098">"මà·à¶§à¶»à·Š රථ ආකà·à¶»à¶º à¶šà·Šâ€à¶»à·’යà·à¶­à·Šà¶¸à¶š කරන්න"</string>
+ <string name="permdesc_enableCarMode" msgid="4853187425751419467">"à¶šà·à¶»à·Š ආකà·à¶»à¶º සබල කිරීමට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_killBackgroundProcesses" msgid="3914026687420177202">"වෙනත් යෙදුම් à·€à·à·ƒà·“ම"</string>
+ <string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"අනෙක් යෙදුම්වල පසුබිම් à¶šà·Šâ€à¶»à·’යà·à·€à¶½à·’ අවසන් කිරීමට යෙදුමට අවසර දෙන්න. අනෙක් යෙදුම් à¶°à·à·€à¶±à¶º à¶±à·à·€à¶­à·“මට මෙය හේතුවක් වේ."</string>
+ <string name="permlab_forceStopPackages" msgid="2329627428832067700">"වෙනත් යෙදුම් බලෙන් නවත්වන්න"</string>
+ <string name="permdesc_forceStopPackages" msgid="5253157296183940812">"යෙදුමට බලෙන් අනෙක් යෙදුම් à¶±à·à·€à¶­à·“මට අවසර දෙන්න."</string>
+ <string name="permlab_forceBack" msgid="652935204072584616">"යෙදුම à·€à·à·ƒà·“මට à¶¶à¶½ කිරීම"</string>
+ <string name="permdesc_forceBack" msgid="3892295830419513623">"à¶±à·à·€à¶­à·“මට පෙරබිමේ ඇති ඕනෑම à¶šà·Šâ€à¶»à·’යà·à·€à¶šà·Š බලෙන් à¶±à·à·€à¶­à·“මට සහ පිටුපසට යà·à¶¸à¶§ යෙදුමට අවසර දෙන්න. à·ƒà·à¶¸à·à¶±à·Šâ€à¶º යෙදුම් සඳහ෠කිසිද෠අවà·à·Šâ€à¶º නොවේ."</string>
+ <string name="permlab_dump" msgid="1681799862438954752">"පද්ධති à¶…à¶·à·Šâ€à¶ºà¶±à·Šà¶­à¶» තත්වය සොය෠ලබ෠ගන්න"</string>
+ <string name="permdesc_dump" msgid="1778299088692290329">"පද්ධතියේ à¶…à¶·à·Šâ€à¶ºà¶±à·Šà¶­à¶» තත්වය à¶½à·à¶¶à·“මට යෙදුමට අවසර දෙන්න. ඔවුන් à·ƒà·à¶¸à·à¶±à·Šâ€à¶ºà¶ºà·™à¶±à·Š à¶·à·à·€à·’à¶­ නොකරන විවිධත්වයකින් යුත් පුද්ගලික සහ ආරක්â€à·‚à·’à¶­ තොරතුරු අනිෂ්ට යෙදුම් සොය෠ලබ෠ගත à·„à·à¶š."</string>
+ <string name="permlab_retrieve_window_content" msgid="8022588608994589938">"à¶­à·’à¶» අන්තර්ගතය සොය෠ලබà·à¶œà·à¶±à·“ම"</string>
+ <string name="permdesc_retrieve_window_content" msgid="3193269069469700265">"à¶šà·Šâ€à¶»à·’යà·à¶šà·à¶»à·“ කවුළුවක අන්තර්ගතය ලබà·à¶œà·à¶±à·“මට යෙදුමට අවසර දෙන්න. අනිෂ්ට යෙදුම් විසින් සම්පූර්ණ කවුළු අන්තර්ගතය ලබà·à¶œà·à¶±à·“ම සහ මුරපදය à·„à·à¶» à¶’à·€à·à¶ºà·™à·„à·’ පෙළ පරික්ෂ෠කිරීම සිදුකරයි."</string>
+ <string name="permlab_temporary_enable_accessibility" msgid="2312612135127310254">"à¶´à·Šâ€à¶»à·€à·šà·à·Šâ€à¶ºà¶­à·à·€à¶º à¶­à·à·€à¶šà·à¶½à·’à¶šà·€ සබල කිරීම"</string>
+ <string name="permdesc_temporary_enable_accessibility" msgid="8079456293182975464">"à¶‹à¶´à·à¶‚ගය වෙත à¶´â€à·Šâ€à¶»à·€à·šà·à·Šâ€à¶ºà¶­à·à·€ à¶­à·à·€à¶šà·à¶½à·’à¶šà·€ සක්â€à¶»à·’ය කිරීමට යෙදුමට අවසර දෙන්න. පරිà·à·“ලක අවධà·à¶±à¶ºà¶šà·’න් තොරව අනිෂ්ට යෙදුම් à¶´â€à·Šâ€à¶»à·€à·šà·à·Šâ€à¶ºà¶­à·à·€ සක්â€à¶»à·’ය à¶šà·… à·„à·à¶š."</string>
+ <string name="permlab_retrieve_window_info" msgid="8532295199112519378">"à¶­à·’à¶» තොරතුරු සොය෠ලබà·à¶œà·à¶±à·“ම"</string>
+ <string name="permdesc_retrieve_window_info" msgid="4998836370424186849">"කවුළු කළමනà·à¶šà¶»à·” මගින් කවුළුව à¶œà·à¶± තොරතුරු සොය෠ලබà·à¶œà·à¶±à·“මට යෙදුමට අවසර දෙන්න. à¶…à¶·à·Šâ€à¶ºà¶±à·Šà¶­à¶» පද්ධති à¶·à·à·€à·’තය සඳහ෠කà·à¶¸à¶­à·’ තොරතුරු අනිෂ්ට යෙදුම් විසින් ලබ෠ගත à·„à·à¶š."</string>
+ <string name="permlab_filter_events" msgid="8675535648807427389">"සිදුවීම් පෙරන්න"</string>
+ <string name="permdesc_filter_events" msgid="8006236315888347680">"à¶´à·’à¶§à¶­à·Š කිරීමට පෙර සියලු පරිà·à·“ලක සිදුවීම්වල à¶´à·Šâ€à¶»à·€à·à·„යක් පෙරීමට යොද෠ගන්න෠ආදà·à¶± පෙරීමක් ලියà·à¶´à¶¯à·’à¶‚à¶ à·’ කිරීමට යෙදුමට අවසර දෙන්න. පරිà·à·“ලක මà·à¶¯à·’à·„à¶­à·Š වීමකින් තොරව පද්ධති UI අනිෂ්ට යෙදුම් à¶´à·à¶½à¶±à¶º කරයි."</string>
+ <string name="permlab_magnify_display" msgid="5973626738170618775">"දර්à·à¶±à¶º විà·à·à¶½à¶±à¶º කරන්න"</string>
+ <string name="permdesc_magnify_display" msgid="7121235684515003792">"දසුනේ අන්තර්ගතය විà·à·à¶½ කිරීමට යෙදුමට අවසර දෙන්න. ඇතà·à¶¸à·Š විට අනිෂ්ට යෙදුම්, à¶‹à¶´à·à¶‚ගය à¶·à·à·€à·’à¶­à· à¶šà·… නොහà·à¶šà·’ බවට à¶´à¶­à·Š කරමින් දසුනේ අන්තර්ගතය වෙනස් à¶šà·… à·„à·à¶š."</string>
+ <string name="permlab_shutdown" msgid="7185747824038909016">"à¶…à¶© à·€à·à¶ºà·™à¶±à·Š à·€à·à·„ීම"</string>
+ <string name="permdesc_shutdown" msgid="7046500838746291775">"à¶šà·Šâ€à¶»à·’යà·à¶šà·à¶»à¶šà¶¸à·Š කළමනà·à¶šà¶»à·” à·€à·à·„ීමේ තත්වයට දමන්න. සම්පූර්ණ à·€à·à·„ීමකට à¶´à¶­à·Š නොකරන්න."</string>
+ <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"යෙදුම් මà·à¶»à·” වීම à·€à·à·…ක්වීම"</string>
+ <string name="permdesc_stopAppSwitches" msgid="8262195802582255021">"වෙනත් යෙදුමක් වෙත පරිà·à·“ලකයà·à·€ මà·à¶»à·” වීම වළක්වයි."</string>
+ <string name="permlab_getTopActivityInfo" msgid="2537922311411546016">"පවතින යෙදුමේ තොරතුරු ලබà·à¶œà·à¶±à·“ම"</string>
+ <string name="permdesc_getTopActivityInfo" msgid="8153651434145132505">"තිරයේ පෙරබිම තුළ තිබෙන දà·à¶±à·Š පවත්න෠යෙදුමේ සහ සේවà·à·€à¶½ පෞද්ගලික තොරතුරු ලබà·à¶œà·à¶±à·“මට දරන්නà·à¶§ අවසර දෙන්න."</string>
+ <string name="permlab_runSetActivityWatcher" msgid="892239094867182656">"සියලු යෙදුම් දියත් කිරීම් නිරීක්ෂණය සහ à¶´à·à¶½à¶±à¶º කිරීම"</string>
+ <string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"පද්ධතිය à¶šà·Šâ€à¶»à·’යà·à¶šà·à¶»à¶šà¶¸à·Š දියත් කරන්නේ කෙසේදà·à¶ºà·’ නිරීක්ෂණයට සහ à¶´à·à¶½à¶±à¶ºà¶§ යෙදුමට අවසර දෙන්න. අනිෂ්ට යෙදුම් මගින් පද්ධතිය සම්පූර්ණයෙන්ම සම්මුතියකට එළඹිය à·„à·à¶š. වර්ධනය සඳහ෠පමණක් මෙම අවසරය à¶…à·€à·à·Šâ€à¶º වෙයි, à·ƒà·à¶¸à·à¶±à·Šâ€à¶º à¶·à·à·€à·’තය සඳහ෠කිසි විටෙකත් à¶…à·€à·à·Šâ€à¶º නොවෙයි."</string>
+ <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"à¶´à·à¶šà·šà¶¢ ඉවත් කිරීමේ à¶´à·Šâ€à¶»à¶ à·à¶»à¶«à¶ºà¶šà·Š යවන්න"</string>
+ <string name="permdesc_broadcastPackageRemoved" msgid="6621901216207931089">"යෙදුම් à¶´à·à¶šà·šà¶¢à¶ºà¶šà·Š ඉවත්කොට ඇති බවට දà·à¶±à·”ම්දීමක් විකà·à·à¶±à¶ºà¶§ යෙදුමට අවසර දෙයි. à¶°à·à·€à¶±à¶º වන අනෙකුත් යෙදුමක් à¶±à·à¶­à·’ කිරීමට අනිෂ්ට යෙදුම් විසින් මෙය à¶·à·à·€à·’à¶­ à¶šà·… à·„à·à¶š."</string>
+ <string name="permlab_broadcastSmsReceived" msgid="5689095009030336593">"SMS-à¶½à·à¶¶à·“ම විකà·à·à¶± යà·à·€à·“ම"</string>
+ <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"SMS පණිවිඩයක් හරහ෠ලà·à¶¶à·”à¶«à·” දà·à¶±à·”ම්දීමක් à¶´à·Šâ€à¶»à¶ à·à¶»à¶«à¶ºà¶§ යෙදුමට අවසර දෙන්න. à¶´à·à¶¸à·’ණෙන SMS පණිවිඩ වංච෠කිරීමට අනිෂ්ට යෙදුම් මෙය à¶·à·à·€à·’à¶­ à¶šà·… à·„à·à¶š."</string>
+ <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"WAP-PUSH-à¶½à·à¶¶à·“ම විකà·à·à¶± යà·à·€à·“ම"</string>
+ <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"WAP PUSH පණිවුඩයක් à¶½à·à¶¶à·“ ඇති බවට දà·à¶±à·”ම්දීමක් විකà·à·à¶±à¶º කිරීමට යෙදුමට අවසර දෙන්න. වංචà·à¶šà·à¶»à·“ MMS පණිවුඩ à¶½à·à¶¶à·“ම් හ෠නිහඬව ඕනෑම වෙබ් පිටුවක අන්තර්ගතය අනිෂ්ට විචල්â€à¶ºà·€à¶½à·’න් ඉවත් කිරීමට, අනිෂ්ට යෙදුම් විසින් මෙය à¶·à·à·€à·’ත෠කිරීමට ඉඩ ඇත."</string>
+ <string name="permlab_setProcessLimit" msgid="2451873664363662666">"à¶°à·à·€à¶± à¶šà·Šâ€à¶»à·’යà·à·€à¶½à·’ ගණන සීම෠කිරීම"</string>
+ <string name="permdesc_setProcessLimit" msgid="7318061314040879542">"à¶°à·à·€à¶±à¶º වන උපරිම à¶šà·Šâ€à¶»à·’යà·à·€à¶½à·’ ගණන à¶´à·à¶½à¶±à¶º කිරීමට යෙදුමට අවසර දෙන්න. à·ƒà·à¶¸à·à¶±à·Šâ€à¶º යෙදුම් සඳහ෠කිසිද෠අවà·à·Šâ€à¶º නොවේ."</string>
+ <string name="permlab_setAlwaysFinish" msgid="550958507798796965">"පසුබිම් යෙදුම් වලට à·€à·à·ƒà·“මට බලකරන්න"</string>
+ <string name="permdesc_setAlwaysFinish" msgid="7471310652868841499">"පසුබිමට පිවිසෙනවà·à¶­à·Š සමඟම à¶šà·Šâ€à¶»à·’යà·à¶šà·à¶»à¶šà¶¸à·Š à¶±à·à·€à¶­à·“ම à¶´à·à¶½à¶±à¶ºà¶§ යෙදුමට අවසර දෙන්න. à·ƒà·à¶¸à·à¶±à·Šâ€à¶º යෙදුම්වලට කිසිසේත් à¶…à·€à·à·Šâ€à¶º නොවෙයි."</string>
+ <string name="permlab_batteryStats" msgid="2789610673514103364">"à¶¶à·à¶§à¶»à·’ සංඛ්â€à¶ºà·à¶± කියවීම"</string>
+ <string name="permdesc_batteryStats" msgid="5897346582882915114">"වර්තමà·à¶± à¶´à·„à·… මට්ටමේ à¶¶à·à¶§à¶»à·’ය à¶·à·à·€à·’ත෠දත්ත කියවීමට යෙදුමට අවසර දෙන්න. ඔබ à¶·à·à·€à·’à¶­ කරන යෙදුම් මොනව෠දà·à¶ºà·’ à¶œà·à¶± විස්තරà·à¶­à·Šà¶¸à¶š තොරතුරු à¶œà·à¶± දà·à¶± à¶œà·à¶±à·“මට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_updateBatteryStats" msgid="3719689764536379557">"à¶¶à·à¶§à¶»à·’ සංඛ්â€à¶ºà·à¶± වෙනස් කිරීම"</string>
+ <string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"à¶‘à¶šà¶­à·” කරගන්න෠ලද à¶¶à·à¶§à¶»à·’ සංඛ්â€à¶ºà·à¶± වෙනස් කිරීමට යෙදුමට අවසර දෙන්න. à·ƒà·à¶¸à·à¶±à·Šâ€à¶º යෙදුම් වල à¶·à·à·€à·’තයට නොවේ."</string>
+ <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"යෙදුමේ විකල්ප සංඛ්â€à¶ºà·à¶‚à¶š සොය෠ලබà·à¶œà·à¶±à·“ම"</string>
+ <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"à¶‘à¶šà¶­à·” කරගත් යෙදුම් à¶šà·Šâ€à¶»à·’යà·à¶šà·à¶»à·’à¶­à·Šà·€ සංඛ්â€à¶ºà· ලේඛන වෙනස් කිරීමට à¶‹à¶´à·à¶‚ගයට ඉඩ දෙන්න. à·ƒà·à¶¸à·à¶±à·Šâ€à¶º à¶‹à¶´à·à¶‚à¶œ à¶·à·à·€à·’තය සඳහ෠නොවේ."</string>
+ <string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"යෙදුම් විකල්ප සංඛ්â€à¶ºà·à¶‚à¶š වෙනස් කිරීම"</string>
+ <string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"à¶‘à¶šà¶­à·” කරගත් යෙදුම් à¶šà·Šâ€à¶»à·’යà·à¶šà·à¶»à·’à¶­à·Šà·€ සංඛ්â€à¶ºà· ලේඛන වෙනස් කිරීමට යෙදුමට ඉඩ දෙන්න. à·ƒà·à¶¸à·à¶±à·Šâ€à¶º යෙදුම් à¶·à·à·€à·’තය සඳහ෠නොවේ."</string>
+ <string name="permlab_backup" msgid="470013022865453920">"පද්ධති උපස්ථ à¶´à·à¶½à¶±à¶º කරන්න සහ à¶±à·à·€à¶­ පිහිටුවන්න"</string>
+ <string name="permdesc_backup" msgid="6912230525140589891">"පද්ධතියේ උපස්ථය සහ à¶‹à¶´à¶šà·Šâ€à¶»à¶¸ à¶±à·à·€à¶­ පිහිටුවීම à¶´à·à¶½à¶±à¶ºà¶§ යෙදුමට අවසර දෙන්න. à·ƒà·à¶¸à·à¶±à·Šâ€à¶º යෙදුම් වල à¶·à·à·€à·’තය සඳහ෠නොවේ."</string>
+ <string name="permlab_confirm_full_backup" msgid="5557071325804469102">"සම්පූර්ණ උපස්ථය හ෠මෙහෙයුම් à¶±à·à·€à¶­ පිහිටුවීම සනà·à¶® කිරීම"</string>
+ <string name="permdesc_confirm_full_backup" msgid="1748762171637699562">"පූර්ණ උපස්ථ තහවුරුකිරීම් UI පුරන්නට උපකරණයට ඉඩ දෙන්න. කිසිම යෙදුමක් à¶·à·à·€à·’ත෠නොකරනු ඇත."</string>
+ <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"අවසර නොලත් කවුළුව දර්à·à¶±à¶º කරන්න"</string>
+ <string name="permdesc_internalSystemWindow" msgid="7458387759461466397">"à¶…à¶·à·Šâ€à¶ºà¶±à·Šà¶­à¶» පද්ධති පරිà·à·“ලක අතුරුමුහුණත් විසින් à¶·à·à·€à·’ත෠කිරීමට à¶¶à¶½à·à¶´à·œà¶»à·œà¶­à·Šà¶­à·” වන කවුළු නිර්මà·à¶«à¶º කිරීමට යෙදුමට අවසර දෙන්න. à·ƒà·à¶¸à·à¶±à·Šâ€à¶º යෙදුම්වල à¶·à·à·€à·’තය සඳහ෠නොවේ."</string>
+ <string name="permlab_systemAlertWindow" msgid="3543347980839518613">"වෙනත් යෙදුම් උඩින් අඳින්න"</string>
+ <string name="permdesc_systemAlertWindow" msgid="8584678381972820118">"අනෙක් යෙදුම් මත හ෠පරිà·à·“ලක අතුරු මුහුණත් කොටස්වල ඇඳීමට යෙදුමට ඉඩ දෙන්න. එය ඔබේ à¶·à·à·€à·’තයේ ඇති ඕනෑම යෙදුමක මුහුණත සමග සම්බන්ධ වීමට හ෠අනෙක් යෙදුම් à¶œà·à¶± ඔබට පෙනෙන ආකà·à¶»à¶º වෙනස් කිරීමට ඉඩ ඇත."</string>
+ <string name="permlab_setAnimationScale" msgid="2805103241153907174">"à¶œà·à¶½à·“ය සජීවන වේගය වෙනස් කරන්න"</string>
+ <string name="permdesc_setAnimationScale" msgid="7690063428924343571">"ඕනෑම වෙලà·à·€à¶š පොදු සජීවීකරණ වේගය (වේගවත් හ෠මන්දගà·à¶¸à·“ සජීවීකරණ) වෙනස් කිරීමට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_manageAppTokens" msgid="1286505717050121370">"යෙදුම් à¶§à·à¶šà¶± කළමනà·à¶šà¶»à¶«à¶º කිරීම"</string>
+ <string name="permdesc_manageAppTokens" msgid="8043431713014395671">"à·ƒà·à¶¸à·à¶±à·Šâ€à¶º Z à¶´à¶§à·’à¶´à·à¶§à·’ය මඟහà·à¶»à¶ºà¶¸à·’න් යෙදුම්වලට අයිති à¶§à·à¶šà¶±à·Š à¶´à¶­à·Š නිර්මà·à¶«à¶ºà¶§ සහ කළමනà·à¶šà¶»à¶«à¶ºà¶§ යෙදුම්වලට අවසර දෙන්න. à·ƒà·à¶¸à·à¶±à·Šâ€à¶º යෙදුම්වලට කිසිසේත් à¶…à·€à·à·Šâ€à¶º නොවේ."</string>
+ <string name="permlab_freezeScreen" msgid="4708181184441880175">"තිරය නිà·à·Šà¶ à¶½ කරන්න"</string>
+ <string name="permdesc_freezeScreen" msgid="8558923789222670064">"සම්පූර්ණ à¶­à·’à¶» සංක්â€à¶»à¶¸à¶«à¶º සඳහ෠තිරය à¶­à·à·€à¶šà·à¶½à·’à¶šà·€ මුදවිමට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_injectEvents" msgid="1378746584023586600">"යතුරු සහ à¶´à·à¶½à¶± බොත්තම් ඔබන්න"</string>
+ <string name="permdesc_injectEvents" product="tablet" msgid="206352565599968632">"තමන්ගේ ආදà·à¶± සිදුවීම් (යතුරු එබිම් , ආදී ) අනෙකුත් යෙදුම්වලට à¶·à·à¶»à¶¯à·“මට යෙදුමට ඉඩ දෙන්න. අනිෂ්ට යෙදුම් මෙය à¶§à·à¶¶à·Šà¶½à¶§à¶º ලබ෠ගà·à¶±à·“මට à¶·à·à·€à·’ත෠කිරීමට ඉඩ ඇත."</string>
+ <string name="permdesc_injectEvents" product="default" msgid="653128057572326253">"වෙනත් යෙදුම්වලට à¶‘à·„à·’ ආදà·à¶± සිදුවීම් (යතුරු එබීම්, යනà·à¶¯à·’ය.) ආදිය යà·à·€à·“මට යෙදුමට අවසර දෙන්න. දුරකථනය à¶…à¶­à·Šà¶šà¶» à¶œà·à¶±à·“ම අනිෂ්ට යෙදුම් මෙය à¶·à·à·€à·’à¶­ කරයි."</string>
+ <string name="permlab_readInputState" msgid="469428900041249234">"ඔබ ටයිප් කරන දෙය සහ ඔබ ගන්න෠ක්â€à¶»à·’යà·à·€à¶±à·Š පටිගත කරන්න"</string>
+ <string name="permdesc_readInputState" msgid="8387754901688728043">"මුරපදය ටයිප් කිරීම à·€à·à¶±à·’ අනෙකුත් යෙදුම් සමඟ අන්තර්ක්â€à¶»à·’යà·à¶šà·à¶»à·“ වනවිට යනà·à¶¯à·“ ඔබ ඔබන යතුරු දà·à¶šà·“මට යෙදුමට අවසර දෙන්න. à·ƒà·à¶¸à·à¶±à·Šâ€à¶º යෙදුම් සඳහ෠කිසිසේත් අදà·à·… නොවේ."</string>
+ <string name="permlab_bindInputMethod" msgid="3360064620230515776">"ආදà·à¶± à¶šà·Šâ€à¶»à¶¸à¶ºà¶šà·Š වෙත බඳින්න"</string>
+ <string name="permdesc_bindInputMethod" msgid="3250440322807286331">"ආදà·à¶± à¶šà·Šâ€à¶»à¶¸à¶º ඉහල මට්ටමේ අතුරු මුහුණතක් වෙත සම්බන්ධ කිරීමට à¶°à·à¶»à¶šà¶ºà·à¶§ අවසර දෙන්න. à·ƒà·à¶¸à·à¶±à·Šâ€à¶º යෙදුම්වලට කිසි විටෙක à¶…à·€à·à·Šâ€à¶º නොවෙයි."</string>
+ <string name="permlab_bindAccessibilityService" msgid="5357733942556031593">"à¶´â€à·Šâ€à¶»à·€à·šà·à·Šâ€à¶ºà¶­à· සේවà·à·€à¶šà·Š වෙත බදින්න"</string>
+ <string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"à¶´â€à·Šâ€à¶»à·€à·šà·à·Šâ€à¶ºà¶­à· සේවà·à·€à·š ඉහළ මට්ටමේ අතුරුමුහුණතට à¶¶à·à¶³à·“මට දරන්නà·à¶§ අවසර දේ. à·ƒà·à¶¸à·à¶±à·Šâ€à¶º යෙදුම් සඳහ෠කිසිවිටක à¶…à·€à·à·Šâ€à¶º නොවේ."</string>
+ <string name="permlab_bindPrintService" msgid="8462815179572748761">"මුද්â€à¶»à¶« සේවà·à·€à¶šà¶§ බද්ධ වී ඇත"</string>
+ <string name="permdesc_bindPrintService" msgid="7960067623209111135">"මුද්â€à¶»à¶« සේවà·à·€ ඉහල මට්ටමේ අතුරු මුහුණතක් වෙත සම්බන්ධ කිරීමට à¶°à·à¶»à¶šà¶ºà·à¶§ අවසර දෙන්න. à·ƒà·à¶¸à·à¶±à·Šâ€à¶º යෙදුම්වලට කිසි විටෙක à¶…à·€à·à·Šâ€à¶º නොවෙයි."</string>
+ <string name="permlab_accessAllPrintJobs" msgid="1120792468465711159">"සියලු මුද්â€à¶»à¶« à¶šà·à¶»à·Šà¶ºà¶ºà¶±à·Š වෙත පිවිසෙන්න"</string>
+ <string name="permdesc_accessAllPrintJobs" msgid="2978185311041864762">"වෙනත් යෙදුමකින් සෑදු මුද්â€à¶»à¶« à¶šà·à¶»à·Šà¶º වෙත පිවිසීමට à¶°à·à¶»à¶šà¶ºà·à¶§ අවසර දෙන්න. à·ƒà·à¶¸à·à¶±à·Šâ€à¶º යෙදුම් සඳහ෠කිසිද෠අවà·à·Šâ€à¶º නොවෙයි."</string>
+ <string name="permlab_bindNfcService" msgid="2752731300419410724">"NFC සේවà·à·€ වෙත à¶¶à·à¶³à·™à¶±à·Šà¶±"</string>
+ <string name="permdesc_bindNfcService" msgid="6120647629174066862">"NFC à¶šà·à¶©à·Š à¶´à¶­à·Š ආදර්à·à¶±à¶º කරන යෙදුම් රඳවනයට සම්බන්ධ වීමට ඉඩ දෙන්න. à·ƒà·à¶¸à·à¶±à·Šâ€à¶º යෙදුම් සඳහ෠කිසිද෠අවà·à·Šâ€à¶º නොවෙයි."</string>
+ <string name="permlab_bindTextService" msgid="7358378401915287938">"පෙළ සේවà·à·€à¶šà¶§ බඳින්න"</string>
+ <string name="permdesc_bindTextService" msgid="8151968910973998670">"කෙටි පණිවිඩ සේවà·à·€à¶š (උදà·. SpellCheckerService) ඉහල මට්ටමේ අතුරු මුහුණතක් වෙත සම්බන්ධ කිරීමට à¶°à·à¶»à¶šà¶ºà·à¶§ අවසර දෙන්න. à·ƒà·à¶¸à·à¶±à·Šâ€à¶º යෙදුම්වලට කිසි විටෙක à¶…à·€à·à·Šâ€à¶º නොවෙයි."</string>
+ <string name="permlab_bindVpnService" msgid="4708596021161473255">"VPN සේවà·à·€à¶šà¶§ à¶¶à·à¶³à·“ම"</string>
+ <string name="permdesc_bindVpnService" msgid="2067845564581693905">"VPN සේවà·à·€ ඉහල මට්ටමේ අතුරු මුහුණතක් වෙත සම්බන්ධ කිරීමට à¶°à·à¶»à¶šà¶ºà·à¶§ අවසර දෙන්න. à·ƒà·à¶¸à·à¶±à·Šâ€à¶º යෙදුම්වලට කිසි විටෙක à¶…à·€à·à·Šâ€à¶º නොවෙයි."</string>
+ <string name="permlab_bindWallpaper" msgid="8716400279937856462">"බිතුපත වෙත බඳින්න"</string>
+ <string name="permdesc_bindWallpaper" msgid="7108428692595491668">"බිතුපත ඉහල මට්ටමේ අතුරු මුහුණතක් වෙත සම්බන්ධ කිරීමට à¶°à·à¶»à¶šà¶ºà·à¶§ අවසර දෙන්න. à·ƒà·à¶¸à·à¶±à·Šâ€à¶º යෙදුම්වලට කිසි විටෙක à¶…à·€à·à·Šâ€à¶º නොවෙයි."</string>
+ <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"විජට සේවà·à·€à¶šà¶§ බඳින්න"</string>
+ <string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"විජට් සේවà·à·€ ඉහල මට්ටමේ අතුරු මුහුණතක් වෙත සම්බන්ධ කිරීමට à¶°à·à¶»à¶šà¶ºà·à¶§ අවසර දෙන්න. à·ƒà·à¶¸à·à¶±à·Šâ€à¶º යෙදුම්වලට කිසි විටෙක à¶…à·€à·à·Šâ€à¶º නොවෙයි."</string>
+ <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"à¶‹à¶´à·à¶‚à¶œ පරිපà·à¶½à¶š සමඟ අන්තර්ක්â€à¶»à·’යà·à¶šà·à¶»à·“ වීම"</string>
+ <string name="permdesc_bindDeviceAdmin" msgid="569715419543907930">"à¶‹à¶´à·à¶‚à¶œ à¶´à·à¶½à¶šà¶ºà· වෙතට à¶…à¶·à·’à¶´à·Šâ€à¶»à·à¶ºà¶ºà¶±à·Š යà·à·€à·“මට à¶°à·à¶»à¶šà¶ºà·à¶§ අවසර දෙන්න. à·ƒà·à¶¸à·à¶±à·Šâ€à¶º යෙදුම්වලට කිසි විටෙක à¶…à·€à·à·Šâ€à¶º නොවෙයි."</string>
+ <string name="permlab_manageDeviceAdmins" msgid="4248828900045808722">"à¶‹à¶´à·à¶‚à¶œ පරිපà·à¶½à¶šà¶ºà·™à¶šà·Š à¶‘à¶šà·Š කිරීම හ෠ඉවත් කිරීම"</string>
+ <string name="permdesc_manageDeviceAdmins" msgid="5025608167709942485">"දරන්නà·à¶§ à¶‹à¶´à·à¶‚à¶œ පරිපà·à¶½à¶šà¶ºà·’න් à¶‘à¶šà·Š කිරීමට හ෠ඉවත් කිරීමට අවසර දේ. à·ƒà·à¶¸à·à¶±à·Šâ€à¶º යෙදුම් වලට කිසිද෠අවà·à·Šâ€à¶º නොවේ."</string>
+ <string name="permlab_setOrientation" msgid="3365947717163866844">"à¶­à·’à¶» දිà·à·à¶±à¶­à·’ය වෙනස් කිරීම"</string>
+ <string name="permdesc_setOrientation" msgid="3046126619316671476">"තිරයේ à¶·à·Šâ€à¶»à¶¸à¶«à¶º ඕනෑම වේලà·à·€à¶š වෙනස් කිරීමට යෙදුමට අවසර දෙන්න. à·ƒà·à¶¸à·à¶±à·Šâ€à¶º යෙදුම් සඳහ෠කිසිද෠අවà·à·Šâ€à¶º නොවනු ඇත."</string>
+ <string name="permlab_setPointerSpeed" msgid="9175371613322562934">"දර්à·à¶šà¶ºà·š වේගය වෙනස් කිරීම"</string>
+ <string name="permdesc_setPointerSpeed" msgid="6866563234274104233">"මූසිකයේ à·„à· à¶§à·Šâ€à¶»à·à¶šà·Šà¶´à·‘ඩයේ වේගය ඕනෑම මොහොතක වෙනස් කිරීමට à¶‹à¶´à·à¶‚ගයට ඉඩ දෙන්න. à·ƒà·à¶¸à·à¶±à·Šâ€à¶º à¶‹à¶´à·à¶‚ගයන් සඳහ෠කිසිද෠අවà·à·Šâ€à¶º නොවනු ඇත."</string>
+ <string name="permlab_setKeyboardLayout" msgid="4778731703600909340">"යතුරු පුවරු පිරිසà·à¶½à·à·ƒà·Šà¶¸ වෙනස් කිරීම"</string>
+ <string name="permdesc_setKeyboardLayout" msgid="8480016771134175879">"යතුරුපුවරු මුහුණත වෙනස් කිරීමට යෙදුමට අවසර දෙන්න. à·ƒà·à¶¸à·à¶±à·Šâ€à¶º යෙදුම් සඳහ෠කිසිද෠අවà·à·Šâ€à¶º නොවෙයි."</string>
+ <string name="permlab_signalPersistentProcesses" msgid="4539002991947376659">"යෙදුම් වෙත Linux සංඥ෠යà·à·€à·“ම"</string>
+ <string name="permdesc_signalPersistentProcesses" msgid="4896992079182649141">"පවතින සියලු à¶šà·Šâ€à¶»à·’යà·à·€à¶½à·’ වෙත à·ƒà·à¶´à¶ºà·”ම් සංඥ෠ඉල්ලවිමට යෙදුමට අවසර දේ."</string>
+ <string name="permlab_persistentActivity" msgid="8841113627955563938">"යෙදුම à·ƒà·à¶¸à·€à·’ටම à¶°à·à·€à¶±à¶º කරන්න"</string>
+ <string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"මතකයේ පවතින à¶‘à·„à·’ කොටස් නොනà·à·ƒà·“ à¶´à·à·€à¶­à·“මට යෙදුමට අවසර දෙන්න. වෙනත් යෙදුම් වලට මතකය සීම෠කිරීමෙන් à¶§à·à¶¶à·Šà¶½à¶§à¶º පම෠කිරීම මගින් මෙමගින් à¶šà·… à·„à·à¶š."</string>
+ <string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"යෙදුමට තම කොටස් මතකය තුල නොබිඳීව රඳ෠පවත්වà·à¶œà·™à¶± යà·à¶¸à¶§ අවසර දෙන්න. මෙය දුරකථනය මන්දගà·à¶¸à·“ කරමින් අනෙකුත් à¶‹à¶´à·à¶‚ගයන් සඳහ෠ඉතිරි මතකය සීම෠කිරීමට à·„à·à¶š."</string>
+ <string name="permlab_deletePackages" msgid="184385129537705938">"යෙදුම් මකන්න"</string>
+ <string name="permdesc_deletePackages" msgid="7411480275167205081">"Android à¶´à·à¶šà·šà¶¢ මà·à¶šà·“මට යෙදුමට අවසර දෙන්න. à·€à·à¶¯à¶œà¶­à·Š යෙදුම් මà·à¶šà·“මට අනිෂ්ට යෙදුම් විසින් මෙය à¶·à·à·€à·’ත෠කිරීමට ඉඩ ඇත."</string>
+ <string name="permlab_clearAppUserData" msgid="274109191845842756">"යෙදුමේ වෙනත් දත්ත මකන්න"</string>
+ <string name="permdesc_clearAppUserData" msgid="4625323684125459488">"පරිà·à·“ලක දත්ත හිස් කිරීමට යෙදුමකට ඉඩ දේ."</string>
+ <string name="permlab_deleteCacheFiles" msgid="3128665571837408675">"අනෙක් යෙදුම්වල à·„à·à¶¹à·’ලි මකන්න"</string>
+ <string name="permdesc_deleteCacheFiles" msgid="3812998599006730196">"à·„à·à¶¹à·’ලි ගොනු මà·à¶šà·“මට අවසර යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_getPackageSize" msgid="7472921768357981986">"යෙදුම් ආචයනයේ ඉඩ à¶´à·Šâ€à¶»à¶¸à·à¶«à¶º මà·à¶±à·“ම"</string>
+ <string name="permdesc_getPackageSize" msgid="3921068154420738296">"යෙදුමකට à¶‘à·„à·’ කේතය, දත්ත සහ à·„à·à¶¹à·’ලි à¶´à·Šâ€à¶»à¶¸à·à¶« ලබà·à¶œà·à¶±à·“මට අවසර දෙන්න."</string>
+ <string name="permlab_installPackages" msgid="2199128482820306924">"යෙදුම් කෙළින්ම ස්ථà·à¶´à¶±à¶º කිරීම"</string>
+ <string name="permdesc_installPackages" msgid="5628530972548071284">"නව හ෠යà·à·€à¶­à·Šà¶šà·à¶½à·’à¶± කරන ලද Android à¶´à·à¶šà·šà¶¢à¶ºà¶±à·Š ස්ථà·à¶´à¶±à¶º කිරීමට ඉඩ දෙන්න. බලසහිත අවසර තීන්දු සමග නව යෙදුම් à¶‘à¶šà¶­à·” කිරීමට අනිෂ්ට යෙදුම්වලට මෙය à¶·à·à·€à·’ත෠කිරීමට ඉඩ à¶­à·’à¶¶à·š."</string>
+ <string name="permlab_clearAppCache" msgid="7487279391723526815">"යෙදුමේ සියලුම à·„à·à¶¹à·’ලි දත්ත මකන්න"</string>
+ <string name="permdesc_clearAppCache" product="tablet" msgid="8974640871945434565">"අනෙක් යෙදුම්වල à·„à·à¶¹à·’ලි à¶±à·à¶¸à·à·€à¶½à·’ තුළ ඇති ගොනු මà·à¶šà·“මෙන් යෙදුමට à¶§à·à¶¶à·Šà¶½à¶§ ආචයනය නිදහස් කිරීමට අවසර දෙන්න. මෙමගින් අනෙක් යෙදුම්වලට à¶’à·€à·à¶ºà·š දත්ත à¶±à·à·€à¶­ ලබ෠ගà·à¶±à·“මට à¶…à·€à·à·Šâ€à¶º වන නිසà·, à¶’à·€à·à¶ºà·š ආරම්භය තවත් සෙමින් සිදුවීමට ඉඩ ඇත."</string>
+ <string name="permdesc_clearAppCache" product="default" msgid="2459441021956436779">"අනෙක් යෙදුම්වල à·„à·à¶¹à·’ලි à¶±à·à¶¸à·à·€à¶½à·’ තුළ ඇති ගොනු මà·à¶šà·“මෙන් යෙදුමට දුරකථන ආචයනය නිදහස් කිරීමට අවසර දෙන්න. මෙමඟින් අනෙක් යෙදුම්වලට à¶’à·€à·à¶ºà·š දත්ත à¶±à·à·€à¶­ ලබ෠ගà·à¶±à·“මට à¶…à·€à·à·Šâ€à¶º වන නිසà·, à¶’à·€à·à¶ºà·š ආරම්භය තවත් සෙමින් සිදුවීමට ඉඩ ඇත."</string>
+ <string name="permlab_movePackage" msgid="3289890271645921411">"යෙදුම් සම්පත් ගෙන යà·à¶¸"</string>
+ <string name="permdesc_movePackage" msgid="319562217778244524">"à¶…à¶·à·Šâ€à¶ºà¶±à·Šà¶­à¶» සහ à¶¶à·à·„à·’à¶» මà·à¶°à·Šâ€à¶ºà¶ºà¶±à·Šà¶œà·™à¶±à·Š යෙදුමේ සම්පත් ගෙනයà·à¶¸à¶§ සහ යෙදුමේ සම්පත් වලින් à¶…à¶·à·Šâ€à¶ºà¶±à·Šà¶­à¶» සහ à¶¶à·à·„à·’à¶» මà·à¶°à·Šâ€à¶ºà¶ºà¶±à·Šà¶§ යෙදුමේ සම්පත් ගෙනයà·à¶¸à¶§ යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_readLogs" msgid="6615778543198967614">"සංවේදී ලොග් දත්ත කියවීම"</string>
+ <string name="permdesc_readLogs" product="tablet" msgid="82061313293455151">"පද්ධතියේ විවිධ ලොග් ගොනු කියවීමට යෙදුමට අවසර දෙන්න. පුද්ගලික සහ පෞද්ගලික තොරතුරු ඇතුළත්ව ඔබ à¶§à·à¶¶à·Šà¶½à¶§à¶ºà·™à¶±à·Š කුමක් කරන්නෙහිද යනà·à¶¯à·“ à·ƒà·à¶¸à·à¶±à·Šâ€à¶º තොරතුරු සෙවීමට මෙයට අවසර දෙන්න."</string>
+ <string name="permdesc_readLogs" product="default" msgid="2063438140241560443">"පද්ධතියේ විවිධ ලොග් ගොනු කියවීමට යෙදුමට අවසර දෙන්න. පුද්ගලික සහ පෞද්ගලික තොරතුරු ඇතුළත්ව ඔබ දුරකථනයෙන් කුමක් කරන්නෙහිද යනà·à¶¯à·“ à·ƒà·à¶¸à·à¶±à·Šâ€à¶º තොරතුරු සෙවීමට මෙයට අවසර දෙන්න."</string>
+ <string name="permlab_anyCodecForPlayback" msgid="715805555823881818">"à¶±à·à·€à¶­ à¶°à·à·€à¶±à¶º සඳහ෠ඕනෑම මà·à¶°à·Šâ€à¶º විකේතකයක් à·„à·à·€à·’ත෠කරන්න"</string>
+ <string name="permdesc_anyCodecForPlayback" msgid="8283912488433189010">"à¶±à·à·€à¶­ à¶°à·à·€à¶±à¶º සඳහ෠විකේතනය කිරීමට ඕනෑම ස්ථà·à¶´à·’à¶­ මà·à¶°à·Šâ€à¶º විකේතකයක් à¶·à·à·€à·’තයට යෙදුමට අවසර දෙන්න."</string>
+ <!-- no translation found for permlab_manageCaCertificates (1678391896786882014) -->
+ <skip />
+ <!-- no translation found for permdesc_manageCaCertificates (4015644047196937014) -->
+ <skip />
+ <string name="permlab_diagnostic" msgid="8076743953908000342">"Diag විසින් හිමිකà·à¶»à¶­à·Šà·€à¶º දරණ සම්පත්වලට කියවීම/ ලිවිම"</string>
+ <string name="permdesc_diagnostic" msgid="6608295692002452283">"Diag à¶šà¶«à·Šà¶©à·à¶ºà¶¸à¶§ අයිති ඕනෑම සම්පතක් කියවීමට සහ ලිවීමට යෙදුමට අවසර දෙන්න. උදà·à·„රණයක් ලෙස /dev තුල ඇති ගොනු. මෙයට පද්ධති ස්ථà·à¶ºà·’à¶­à·à·€à¶§ සහ ආරක්ෂà·à·€à¶§ බලපෑම් කිරීමට à·„à·à¶šà·’යà·à·€à¶šà·Š ඇත. නිෂ්පà·à¶¯à¶š à·„à· à¶šà·Šâ€à¶»à·’යà·à¶šà¶»à·” විසින් දෘඩà·à¶‚à¶œ-විà·à·šà·‚à·’à¶­ දà·à·‚ නිර්ණය සඳහ෠පමණක් මෙය යොදà·à¶œà¶­ යුතුය."</string>
+ <string name="permlab_changeComponentState" msgid="6335576775711095931">"යෙදුම් අංග සබල හ෠අබල කිරීම"</string>
+ <string name="permdesc_changeComponentState" product="tablet" msgid="8887435740982237294">"වෙනත් යෙදුමක අංගයක් සබල ද à¶±à·à¶¯à·Šà¶¯ යන්න වෙනස් කිරීමට යෙදුමට අවසර දෙන්න. à·€à·à¶¯à¶œà¶­à·Š à¶§à·à¶¶à·Šà¶½à¶§à·Š à¶…à·€à·à·Šâ€à¶ºà¶­à· à¶…à¶¶à¶½ කිරීමට අනිෂ්ට යෙදුම් මෙය à¶·à·à·€à·’à¶­ à¶šà·… à·„à·à¶š. මෙම අවසරය à·ƒà·à¶½à¶šà·’ල්ලෙන් à¶·à·à·€à·’à¶­à· à¶šà·… යුතුය, à¶·à·à·€à·’à¶­ නොකරන, අස්ථිර හ෠අස්ථà·à¶ºà·’ තත්වයට යෙදුම à¶´à¶­à·Š කිරීමට එයට à·„à·à¶šà·’ය."</string>
+ <string name="permdesc_changeComponentState" product="default" msgid="1827232484416505615">"වෙනත් යෙදුමක අංගයක් සබල ද à¶±à·à¶¯à·Šà¶¯ යන්න වෙනස් කිරීමට යෙදුමට අවසර දෙන්න. à·€à·à¶¯à¶œà¶­à·Š දුරකථන à¶…à·€à·à·Šâ€à¶ºà¶­à· à¶…à¶šà·Šâ€à¶»à·’ය කිරීමට අනිෂ්ට යෙදුම් මෙය à¶·à·à·€à·’à¶­ à¶šà·… à·„à·à¶š. මෙම අවසරය à·ƒà·à¶½à¶šà·’ල්ලෙන් à¶·à·à·€à·’à¶­ à¶šà·… යුතුය, à¶·à·à·€à·’à¶­ නොකරන, අස්ථිර හ෠අස්ථà·à¶ºà·’ තත්වයට යෙදුම à¶´à¶­à·Š කිරීමට එයට à·„à·à¶šà·’ය."</string>
+ <string name="permlab_grantRevokePermissions" msgid="4627315351093508795">"අවසර à¶´à·Šâ€à¶»à¶¯à·à¶±à¶º කිරීම à·„à· à¶…à·„à·à·ƒà·’ කිරීම"</string>
+ <string name="permdesc_grantRevokePermissions" msgid="4088642654085850662">"යෙදුමකට එයට හ෠අනෙක් යෙදුම් වලට විà·à·šà·‚à·’à¶­ අවසර à¶´à·Šâ€à¶»à¶¯à·à¶±à¶ºà¶§ à·„à· à¶…à·„à·à·ƒà·’ කිරීමට අවසර දෙන්න. අනිෂ්ට යෙදුම්, à¶’à·€à·à¶§ අවසර à¶´à·Šâ€à¶»à¶¯à·à¶±à¶º නොකළ ගුණà·à¶‚à¶œ වලට à¶´à·Šâ€à¶»à·€à·šà· වීමට මෙය à¶·à·à·€à·’à¶­à· à¶šà·… à·„à·à¶š."</string>
+ <string name="permlab_setPreferredApplications" msgid="8463181628695396391">"අභිරුචි යෙදුම් සකසන්න"</string>
+ <string name="permdesc_setPreferredApplications" msgid="4973986762241783712">"ඔබගේ අභිරුචි යෙදුම් වෙනස් කිරීමට යෙදුමට අවසර දෙන්න. ඔබගේ à¶°à·à·€à¶±à¶º වන යෙදුම් වෙනස් කිරීම, පවතින යෙදුම් වලින් දත්ත à¶‘à¶šà¶­à·” කිරීම, à¶´à·Šâ€à¶»à·à¶©à· කිරීම à·€à·à¶±à·’ දේ අනිෂ්ට යෙදුම් නිà·à·Šà·à¶¶à¶¯à·€à¶¸ සිදු කරයි."</string>
+ <string name="permlab_writeSettings" msgid="2226195290955224730">"පද්ධති à·ƒà·à¶šà·ƒà·“ම් වෙනස් කිරීම"</string>
+ <string name="permdesc_writeSettings" msgid="7775723441558907181">"පද්ධති à·ƒà·à¶šà·ƒà·“ම් දත්ත වෙනස් කිරීමට යෙදුමට අවසර දෙන්න. අනිෂ්ට යෙදුම් ඔබගේ පද්ධති වින්â€à¶ºà·à·ƒ දà·à·‚ à¶œà·à¶±à·Šà·€à·’ය à·„à·à¶š."</string>
+ <string name="permlab_writeSecureSettings" msgid="204676251876718288">"ආරක්â€à·‚à·’à¶­ පද්ධති à·ƒà·à¶šà·ƒà·“ම් වෙනස් කරන්න"</string>
+ <string name="permdesc_writeSecureSettings" msgid="8159535613020137391">"පද්ධතියේ ආරක්â€à·‚à·’à¶­ දත්ත වෙනස් කිරීමට à¶‹à¶´à·à¶‚ගයට අවසර දෙන්න. à·ƒà·à¶¸à·à¶±à·Šâ€à¶º à¶‹à¶´à·à¶‚à¶œ සඳහ෠භà·à·€à·’තයට නොවේ."</string>
+ <string name="permlab_writeGservices" msgid="2149426664226152185">"Google සේව෠සිතියම වෙනස් කරන්න"</string>
+ <string name="permdesc_writeGservices" msgid="1287309437638380229">"Google සේව෠සිතියම වෙනස් කිරීමට යෙදුමට අවසර දෙන්න. à·ƒà·à¶¸à·à¶±à·Šâ€à¶º යෙදුම් සඳහ෠භà·à·€à·’තයට නොවෙයි."</string>
+ <string name="permlab_receiveBootCompleted" msgid="5312965565987800025">"ආරම්භයේදී à¶°à·à·€à¶±à¶º කිරීම"</string>
+ <string name="permdesc_receiveBootCompleted" product="tablet" msgid="7390304664116880704">"පද්ධතිය ඇරඹුම අවසන් වූ වහà·à¶¸ යෙදුම ආරම්භ වීමට යෙදුමට අවසර දෙන්න. à¶§à·à¶¶à·Šà¶½à¶§à¶º ආරම්භ කිරීමට මෙමඟින් පම෠කළ à·„à·à¶šà·’ à¶…à¶­à¶» à·ƒà·à¶¸à·€à·’ටම à¶°à·à·€à¶±à¶º වන නිස෠සම්පූර්ණ à¶§à·à¶¶à·Šà¶½à¶§à¶ºà¶¸ à¶´à·Šâ€à¶»à¶¸à·à¶¯ කිරීමට යෙදුමට අවසර දෙයි."</string>
+ <string name="permdesc_receiveBootCompleted" product="default" msgid="513950589102617504">"පද්ධතිය ඇරඹුම අවසන් වූ වහà·à¶¸ යෙදුම ආරම්භ වීමට යෙදුමට අවසර දෙන්න. දුරකථනය ආරම්භ කිරීමට මෙමඟින් පම෠කළ à·„à·à¶šà·’ à¶…à¶­à¶» à·ƒà·à¶¸à·€à·’ටම à¶°à·à·€à¶±à¶º වන නිස෠සම්පූර්ණ දුරකථනයේම à¶šà·Šâ€à¶»à·’යà·à¶šà·à¶»à·’ත්වය à¶´à·Šâ€à¶»à¶¸à·à¶¯ කිරීමට යෙදුමට අවසර දෙයි."</string>
+ <string name="permlab_broadcastSticky" msgid="7919126372606881614">"à¶¶à·à¶³à·”à¶«à·” විකà·à·à¶±à¶º යà·à·€à·“ම"</string>
+ <string name="permdesc_broadcastSticky" product="tablet" msgid="7749760494399915651">"à¶´à·Šâ€à¶»à¶ à·à¶»à¶«à¶ºà¶§ පසුවද පවතින, à¶´à·Šâ€à¶»à¶ à·à¶»à¶«à¶ºà¶±à·Š යà·à·€à·“මට යෙදුමට අවසර දෙන්න. à·€à·à¶©à·’පුර මතකය à¶·à·à·€à·’තය à·„à·šà¶­à·” කොට, à¶…à¶°à·’à¶š à¶·à·à·€à·’තය මඟින් à¶§à·à¶¶à·Šà¶½à¶§à¶º පම෠කිරීම හ෠අස්ථිර à¶šà·… à·„à·à¶š."</string>
+ <string name="permdesc_broadcastSticky" product="default" msgid="2825803764232445091">"à¶´à·Šâ€à¶»à¶ à·à¶»à¶«à¶ºà¶§ පසුවද පවතින, à¶´à·Šâ€à¶»à¶ à·à¶»à¶«à¶ºà¶±à·Š යà·à·€à·“මට යෙදුමට අවසර දෙන්න. à·€à·à¶©à·’පුර මතකය à¶·à·à·€à·’තය à·„à·šà¶­à·” කොට, à¶…à¶°à·’à¶š à¶·à·à·€à·’තය මඟින් දුරකථනය පම෠කිරීම හ෠අස්ථිර à¶šà·… à·„à·à¶š."</string>
+ <string name="permlab_readContacts" msgid="8348481131899886131">"ඔබගේ සම්බන්ධත෠කියවීම"</string>
+ <string name="permdesc_readContacts" product="tablet" msgid="5294866856941149639">"සඳහන් පුද්ගලයන් à·„à¶§ ඔබ ඇමතුම් ගත්, à¶Š-à¶­à·à¶´à·à¶½à·Š, හ෠අනෙකුත් ආකà·à¶» වලින් සන්නිවේදනය කරගත් සංඛ්â€à¶ºà¶­à¶¯ ඇතුළුව, ඔබගේ à¶§à·à¶¶à·Šà¶½à¶§à¶ºà·š ගබඩà·à·€à·“ ඇති සම්බන්ධත෠පිළිබඳ දත්ත කියවීමට යෙදුමට අවසර දෙන්න. මෙම අවසරය මඟින් යෙදුම්වලට ඔබගේ සම්බන්ධත෠පිළිබඳ දත්ත සුරà·à¶šà·“මට ඉඩ ලබ෠දෙන à¶…à¶­à¶», අනිෂ්ට යෙදුම් විසින් ඔබ නොදà·à¶±à·”වත්වම සම්බන්ධත෠දත්ත බෙද෠ගà·à¶±à·“මට ඉඩ ඇත."</string>
+ <string name="permdesc_readContacts" product="default" msgid="8440654152457300662">"නියමිත පුද්ගලයන් සමග ඔබ ඇමතු, à¶Š-à¶­à·à¶´à·à¶½à·Š à¶šà·… හ෠වෙනත් ආකà·à¶»à¶ºà¶šà·’න් සන්නිවේදනය à¶šà·… සංඛ්â€à¶ºà·à¶­à¶º ඇතුලත් ඔබගේ දුරකථනයේ ආචයනය කරන ලද ඔබගේ සම්බන්ධත෠ගà·à¶± දත්ත කියවීමට යෙදුමට අවසර දෙන්න. ඔබගේ සම්බන්ධත෠දත්ත උපස්ථ කිරීමට මෙම අවසරය යෙදුමට අවසර දෙන à¶…à¶­à¶» ඔබගේ දà·à¶±à·”මකින් තොරව අනිෂ්ට යෙදුම් සම්බන්ධත෠දත්ත බෙදà·à¶œà·à¶±à·“ම à¶šà·… à·„à·à¶š."</string>
+ <string name="permlab_writeContacts" msgid="5107492086416793544">"ඔබගේ සම්බන්ධත෠වෙනස් කිරීම"</string>
+ <string name="permdesc_writeContacts" product="tablet" msgid="897243932521953602">"නියමිත පුද්ගලයන්ට ඔබ ඇමතූ, à¶Š-à¶­à·à¶´à·à¶½à·Š à¶šà·… හ෠ඇමතුම් à¶šà·… සංඛ්â€à¶ºà·à¶­ ඇතුලත් ඔබගේ à¶§à·à¶¶à·Šà¶½à¶§à¶ºà·š ආචයනය කරන ලද සම්බන්ධත෠(ලිපින) දත්ත වෙනස් කිරීමට යෙදුමට අවසර දෙන්න. මෙම අවසරයෙන් යෙදුමට සම්බන්ධත෠දත්ත මà·à¶šà·“මට අවසර දෙයි."</string>
+ <string name="permdesc_writeContacts" product="default" msgid="589869224625163558">"සඳහන් පුද්ගලයන්ට ඔබ ඇමතූ, à¶Š-à¶­à·à¶´à·à¶½à·Š à¶šà·… හ෠ඇමතුම් à¶šà·… සංඛ්â€à¶ºà·à¶± ඇතුලත් ඔබගේ දුරකථනයේ ආචයනය කරන ලද සම්බන්ධත෠(ලිපින) දත්ත වෙනස් කිරීමට යෙදුමට අවසර දෙන්න. මෙම අවසරයෙන් යෙදුමට සම්බන්ධත෠දත්ත මà·à¶šà·“මට අවසර දෙයි."</string>
+ <string name="permlab_readCallLog" msgid="3478133184624102739">"ඇමතුම් ලොගය කියවන්න"</string>
+ <string name="permdesc_readCallLog" product="tablet" msgid="3700645184870760285">"à¶´à·à¶¸à·’ණෙන සහ පිටවන ඇමතුම් à¶œà·à¶± දත්ත ඇතුළත්, ඔබගේ à¶§à·à¶¶à·Šà¶½à¶§à¶ºà·š ඇමතුම් ලොග කියවීමට යෙදුමට අවසර දෙන්න. ඔබගේ ඇමතුම් ලොග දත්ත සුරක්ෂිත කිරීමට මෙම අවසරය යෙදුම්වලට අවසර දෙයි සහ ඔබගේ දà·à¶±à·”මකින් තොරව ඇමතුම් ලොග දත්ත අනිෂ්ට යෙදුම් බෙද෠ගà·à¶±à·“ම à¶šà·… à·„à·à¶š."</string>
+ <string name="permdesc_readCallLog" product="default" msgid="5777725796813217244">"à¶½à·à¶¶à·™à¶± සහ පිටවන ඇමතුම් à¶´à·’à·…à·’à¶¶à¶³ දත්ත ඇතුළත්ව ඔබගේ දුරකථනයේ ඇමතුම් ලොග් කියවීමට යෙදුමට අවසර දෙන්න. මෙම අවසරය ඔබගේ ඇමතුම් ලොග් දත්ත උපස්ථ කිරීමට යෙදුමට ඉඩදෙන à¶…à¶­à¶» ඔබගේ අනුදà·à¶±à·”මකින් තොරව අනිෂ්ට යෙදුම් විසින් ඇමතුම් ලොග් දත්ත බෙදà·à¶œà·à¶±à·“ම à¶šà·… à·„à·à¶š."</string>
+ <string name="permlab_writeCallLog" msgid="8552045664743499354">"ඇමතුම් ලොගය ලිවීම"</string>
+ <string name="permdesc_writeCallLog" product="tablet" msgid="6661806062274119245">"à¶½à·à¶¶à·™à¶± ඇමතුම් සහ පිටවන ඇමතුම් දත්ත ඇතුළත්ව ඔබගේ à¶§à·à¶¶à·Šà¶½à¶§à¶ºà·š ඇමතුම් ලොගය වෙනස් කිරීමට යෙදුමට අවසර දෙන්න. ඔබගේ ඇමතුම් ලොගය මà·à¶šà·“මට හ෠වෙනස් කිරීමට අනිෂ්ට යෙදුම් මෙය à¶·à·à·€à·’ත෠කෙරේ."</string>
+ <string name="permdesc_writeCallLog" product="default" msgid="683941736352787842">"à¶´à·à¶¸à·’ණෙන සහ පිටවෙන ඇමතුම් දත්ත ඇතුළුව ඔබගේ දුරකථනයේ ඇමතුම් ලොගය වෙනස් කිරීමට යෙදුමට අවසර දෙන්න. ඔබගේ ඇමතුම් ලොගය මà·à¶šà·“මට හ෠වෙනස් කිරීමට අනිෂ්ට යෙදුම් මෙය à¶·à·à·€à·’à¶­ à¶šà¶½ à·„à·à¶š."</string>
+ <string name="permlab_readProfile" msgid="4701889852612716678">"ඔබගේ සම්බන්ධත෠පත කියවන්න"</string>
+ <string name="permdesc_readProfile" product="default" msgid="5462475151849888848">"ඔබගේ නම සම්බන්ධත෠තොරතුරු ආදී ඔබගේ à¶‹à¶´à·à¶‚ගයේ ගබඩ෠වී ඇති පුද්ගලික à¶´à·à¶­à·’à¶šà¶© තොරතුරු කියවීමට යෙදුමට අවසර දෙන්න. මෙහි තේරුම යෙදුමට ඔබව හඳුන෠ගà·à¶±à·“මට à·„à·à¶šà·’ වන à¶¶à·€ සහ ඔබගේ පුද්ගලික තොරතුරු අනෙක් අයට යà·à·€à·“මට ද à·„à·à¶šà·’ වීමයි."</string>
+ <string name="permlab_writeProfile" msgid="907793628777397643">"ඔබගේ සම්බන්ධත෠පත වෙනස් කිරීම"</string>
+ <string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"ඔබගේ නම සහ සම්බන්ධත෠තොරතුරු à·€à·à¶±à·’ ඔබගේ à¶‹à¶´à·à¶‚ගයේ ආචයනය කරන ලද පුද්ගලික à¶´à·à¶­à·’à¶šà¶© තොරතුරු වෙනස් කිරීමට à·„à· à¶‘à¶šà¶­à·” කිරීමට යෙදුමට අවසර දෙන්න. මෙමගින් යෙදුමට ඔබව හඳුන෠ගත à·„à·à¶šà·’ à¶…à¶­à¶» අනෙක් අයට ඔබගේ à¶´à·à¶­à·’à¶šà¶© තොරතුරු යà·à·€à·’ය à·„à·à¶šà·’ à¶¶à·€ කියවෙයි."</string>
+ <string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"ඔබගේ සමà·à¶¢ à¶´à·Šâ€à¶»à·€à·à·„ය කියවන්න"</string>
+ <string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"ඔබගේ සහ ඔබගේ යහළුවන්ගේ සමà·à¶¢ යà·à·€à¶­à·Šà¶šà·à¶½à·“නයන් වෙත පිවිසීමට හ෠සමමුහුර්ත කිරීමට යෙදුමට අවසර දෙන්න. තොරතුරු බෙද෠ගà·à¶±à·“මේ දී à·ƒà·à¶½à¶šà·’ලිමත් වන්න -- විà·à·Šà·€à·à·ƒà¶ºà¶šà·’න් තොරව සමà·à¶¢ à¶¢à·à¶½à·€à¶½ ඔබගේ සහ ඔබගේ යහළුවන් à¶…à¶­à¶» සන්නිවේදන කියවීමට මෙමගින් යෙදුමට අවසර දෙයි. සටහන: සියලු සමà·à¶¢ à¶¢à·à¶½à·€à¶½ මෙම අවසරය à¶¶à¶½ නොකරයි."</string>
+ <string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"ඔබගේ සමà·à¶¢ à¶´à·Šâ€à¶»à·€à·à·„ය වෙත ලිවීම"</string>
+ <string name="permdesc_writeSocialStream" product="default" msgid="3086557552204114849">"ඔබගේ යහළුවන්ගේ සමà·à¶¢ යà·à·€à¶­à·Šà¶šà·à¶½à·“නයන් පෙන්වීමට යෙදුමට අවසර දෙන්න. තොරතුරු බෙද෠ගà·à¶±à·“මේදී à·ƒà·à¶½à¶šà·’ලිමත් වන්න -- යහළුවෙක්ගෙන් à¶´à·à¶¸à·’ණෙන ලෙස පණිවිඩ නිපදවීමට මෙමඟින් යෙදුමට අවසර දෙන්න. සටහන : සියලු සමà·à¶¢ à¶¢à·à¶½ සඳහ෠මෙම අවසරය à¶¶à¶½ නොදෙයි."</string>
+ <string name="permlab_readCalendar" msgid="5972727560257612398">"දින දර්à·à¶±à¶ºà·š සිදුවීම් සහ රහසිගත තොරතුරු කියවීම"</string>
+ <string name="permdesc_readCalendar" product="tablet" msgid="4216462049057658723">"ඔබගේ à¶§à·à¶¶à·Šà¶½à¶§à¶º තුල ගබඩ෠කර ඇති මිතුරන්ගේ සහ à¶‘à¶šà·Šà·€ à¶šà·Šâ€à¶»à·’යà·à¶šà¶»à¶±à·Šà¶±à¶±à·Šà¶œà·š ද ඇතුළුව සියලුම දින දර්à·à¶± සිද්ධි කියවීමට යෙදුමට අවසර දෙන්න. මෙය රහස්â€à¶ºà¶·à·à·€à¶º හ෠සංවේදීතà·à·€à¶º නොසලක෠ඔබගේ දින දර්à·à¶± දත්ත බෙද෠ගà·à¶±à·“මට හ෠සුරà·à¶šà·“මට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permdesc_readCalendar" product="default" msgid="7434548682470851583">"යහළුවන් සහ සමකà·à¶½à·’නයන් ඇතුලත් ඔබගේ දුරකථනයේ ආචයනය කරන ලද සියලු දින දර්à·à¶± සිදුවීම් කියවීමට යෙදුමට අවසර දෙන්න. විà·à·Šà·€à·à·ƒà¶ºà¶šà·’න් හ෠සංවේදීතà·à·€à¶šà·’න් තොරව ඔබගේ දින දර්à·à¶± දත්ත බෙද෠ගà·à¶±à·“මට හ෠උපස්ථ කිරීමට මෙමගින් යෙදුමට අවසර දෙයි."</string>
+ <string name="permlab_writeCalendar" msgid="8438874755193825647">"දින දර්à·à¶± සිද්ධි à¶‘à¶šà¶­à·” කිරීම හ෠වෙනස් කිරීමක් සිදුකර හිමිකරුගේ දà·à¶±à·“මකින් තොරව අමුත්තන්ට à¶Š-à¶­à·à¶´à·‘ලක් යවීම"</string>
+ <string name="permdesc_writeCalendar" product="tablet" msgid="6679035520113668528">"යහළුවන් à·„à· à¶‘à¶šà¶§-à·€à·à¶©à¶šà¶»à¶±à·Šà¶±à¶±à·Š ඇතුළත්ව ඔබට à¶§à·à¶¶à·Šà¶½à¶§à¶ºà·š වෙනස් à¶šà·… à·„à·à¶šà·’ සිද්ධි à¶‘à¶šà¶­à·” කිරීමට, ඉවත් කිරීමට, වෙනස් කිරීමට යෙදුමට අවසර දෙන්න. මෙමඟින් දින දර්à·à¶± හිමිකරුවන්ගෙන් පණිවිඩ යවන පරිදි මෙන් මවà·à¶´à·‘මට හ෠හිමිකරුගේ අනුදà·à¶±à·”මකින් තොරව සිද්ධි වෙනස් කිරීමට යෙදුමට අවසර à¶½à·à¶¶à·š."</string>
+ <string name="permdesc_writeCalendar" product="default" msgid="2324469496327249376">"ඔබගේ යහළුවන් හ෠සමකà·à¶½à·“නයන් ඇතුළත් ඔබගේ දුරකථනයේ ඔබට වෙනස් à¶šà·… à·„à·à¶šà·’ සිදු වීම් à¶‘à¶šà¶­à·” කිරීමට, ඉවත් කිරීමට, වෙනස් කිරීමට යෙදුමට අවසර දෙන්න. මෙමගින් දින දර්à·à¶± හිමිකරුවන්ගෙන් à¶´à·à¶¸à·’ණෙන සේ පෙනෙන පණිවිඩ යà·à·€à·“මට හ෠හිමිකරුගේ දà·à¶±à·”මකින් තොරව සිදුවීම් වෙනස් කිරීමට යෙදුමට අවසර දෙයි."</string>
+ <string name="permlab_accessMockLocation" msgid="8688334974036823330">"පරීක්ෂණ සඳහ෠ආදර්෠ස්ථà·à¶± මූලà·à·à·Šâ€à¶»"</string>
+ <string name="permdesc_accessMockLocation" msgid="5808711039482051824">"පරීක්ෂණයට ව්â€à¶ºà·à¶¢ ස්ථà·à¶± මූලà·à·à·Šâ€à¶» à·ƒà·à¶¯à¶±à·Šà¶± හ෠නව ස්ථà·à¶± à·ƒà·à¶´à¶ºà·”ම්කරුවෙකු ස්ථà·à¶´à¶±à¶º කරන්න. GPS හ෠ස්ථà·à¶± à·ƒà·à¶´à¶ºà·”ම්කරුවන් ආදී වෙනත් ස්ථà·à¶± මූලà·à·à·Šâ€à¶» විසින් ලබ෠දෙන ස්ථà·à¶±à¶º සහ/හ෠තත්වය à¶´à·Šâ€à¶»à¶­à·’ස්ථà·à¶´à¶±à¶º කිරීමට යෙදුමට මෙය අවසර දෙයි."</string>
+ <string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"අමතර ස්ථà·à¶± à·ƒà·à¶´à¶ºà·”ම්කරු විධà·à¶± වෙත à¶´à·Šâ€à¶»à·€à·šà· වීම"</string>
+ <string name="permdesc_accessLocationExtraCommands" msgid="5945166642335800763">"අමතර ස්ථà·à¶± à·ƒà·à¶´à¶ºà·”ම්කරු විධà·à¶± වෙත පිවිසීමට යෙදුමට අවසර දෙන්න. GPS හ෠වෙනත් ස්ථà·à¶± මූලà·à·à·Šâ€à¶» à¶šà·Šâ€à¶»à·’යà·à·€à¶½à·’ වෙත à¶¶à·à¶°à· කිරීමට මෙය අවසර දෙයි."</string>
+ <string name="permlab_installLocationProvider" msgid="6578101199825193873">"ස්ථà·à¶± à·ƒà·à¶´à¶ºà·”ම්කරුවෙකු ස්ථà·à¶´à¶±à¶ºà¶§ අවසරය දෙන්න"</string>
+ <string name="permdesc_installLocationProvider" msgid="9066146120470591509">"පරීක්ෂණයට ව්â€à¶ºà·à¶¢ ස්ථà·à¶± මූලà·à·à·Šâ€à¶» à·ƒà·à¶¯à¶±à·Šà¶± හ෠නව ස්ථà·à¶± à·ƒà·à¶´à¶ºà·”ම්කරුවෙකු ස්ථà·à¶´à¶±à¶º කරන්න. GPS හ෠ස්ථà·à¶± à·ƒà·à¶´à¶ºà·”ම්කරුවන් ආදී වෙනත් ස්ථà·à¶± මූලà·à·à·Šâ€à¶» විසින් ලබ෠දෙන ස්ථà·à¶±à¶º සහ/හ෠තත්ත්වය à¶´à·Šâ€à¶»à¶­à·’ස්ථà·à¶´à¶±à¶º කිරීමට යෙදුමට මෙය අවසර දෙයි."</string>
+ <string name="permlab_accessFineLocation" msgid="1191898061965273372">"නිවà·à¶»à¶¯à·’ ස්ථà·à¶±à¶º (GPS සහ à¶¢à·à¶½à¶º පදනම් කරගත්)"</string>
+ <string name="permdesc_accessFineLocation" msgid="5295047563564981250">"à¶œà·à¶½à·“ය ස්ථà·à¶±à·“ය පද්ධතිය (GPS) හ෠සෙල් කුළුණු සහ Wi-Fi à·€à·à¶±à·’ à¶¢à·à¶½ ස්ථà·à¶±à·“ය à¶´à·Šâ€à¶»à¶·à·€ à¶·à·à·€à·’තයෙන් ඔබගේ නිවà·à¶»à¶¯à·’ ස්ථà·à¶±à¶º ලබà·à¶œà·à¶±à·“මට යෙදුම අවසර දෙන්න. යෙදුම් වලට ස්ථà·à¶±à·“ය සේව෠භà·à·€à·’ත෠කිරීමට ඒව෠සක්â€à¶»à·’ය විය යුතු වේ. ඔබව සොය෠ගà·à¶±à·“මට යෙදුම් මෙය à¶·à·à·€à·’ත෠කරන à¶…à¶­à¶» අමතර à¶¶à·à¶§à¶»à·’ බලයක්ද පරිභà·à¶¢à¶±à¶º කරයි."</string>
+ <string name="permlab_accessCoarseLocation" msgid="4887895362354239628">"ආසන්නතම ස්ථà·à¶±à¶º (à¶¢à·à¶½à¶º-à¶´à·à¶¯à¶š වූ)"</string>
+ <string name="permdesc_accessCoarseLocation" msgid="2538200184373302295">"ඔබගේ දළ ස්ථà·à¶±à¶º ලබà·à¶œà·à¶±à·“මට යෙදුමට අවසර දෙන්න. සන්නේවේදන කුළුණු සහ Wi-Fi ආදී à¶¢à·à¶½ ස්ථà·à¶± මූලà·à·à·Šâ€à¶» à¶·à·à·€à·’à¶­ කරන ස්ථà·à¶± සේව෠විසින් මෙම ස්ථà·à¶±à¶º ව්â€à¶ºà·”ත්පන්න à¶šà¶» ඇත. යෙදුමට à¶·à·à·€à·’තය සඳහ෠මෙම ස්ථà·à¶± සේව෠සක්â€à¶»à·’ය à¶šà·… යුතු à¶…à¶­à¶» ඔබගේ à¶‹à¶´à·à¶‚ගය සඳහ෠පà·à·€à¶­à·’ය යුතුය. ඔබ සිටින à¶­à·à¶± දළව හඳුන෠ගà·à¶±à·“මට යෙදුම් වලට මෙය à¶·à·à·€à·’à¶­ à¶šà·… à·„à·à¶šà·’ය."</string>
+ <string name="permlab_accessSurfaceFlinger" msgid="2363969641792388947">"SurfaceFlinger වෙත à¶´à·Šâ€à¶»à·€à·šà·à¶º"</string>
+ <string name="permdesc_accessSurfaceFlinger" msgid="1041619516733293551">"SurfaceFlinger à¶´à·„à¶½ මට්ටමේ විà·à·šà·‚à·à¶‚à¶œ à¶·à·à·€à·’තයට යෙදුමට අවසර දෙයි."</string>
+ <string name="permlab_readFrameBuffer" msgid="6690504248178498136">"à¶»à·à¶¸à·” අන්තරà·à¶ à¶º කියවීම"</string>
+ <string name="permdesc_readFrameBuffer" msgid="4937405521809454680">"à¶»à·à¶¸à·” අන්තරà·à¶ à¶ºà¶±à¶ºà·™à¶±à·Š අන්තර්ගතයන් කියවීමට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_accessInputFlinger" msgid="5348635270689553857">"InputFlinger වෙත පිවිසෙන්න"</string>
+ <string name="permdesc_accessInputFlinger" msgid="2104864941201226616">"InputFlinger à¶´à·„à¶½ මට්ටමේ විà·à·šà·‚à·à¶‚à¶œ à¶·à·à·€à·’තයට යෙදුමට අවසර දෙයි."</string>
+ <string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"Wifi සංදර්à·à¶š වින්â€à¶ºà·à·ƒ කරන්න"</string>
+ <string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"වින්â€à¶ºà·à·ƒ කිරීමට සහ Wifi සංදර්à·à¶š වෙත සම්බන්ධ වීමට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_controlWifiDisplay" msgid="393641276723695496">"Wifi සංදර්à·à¶š à¶´à·à¶½à¶±à¶º"</string>
+ <string name="permdesc_controlWifiDisplay" msgid="4543912292681826986">"Wifi සංදර්à·à¶šà¶ºà·š à¶´à·„à·… මට්ටමේ විà·à·šà·‚à·à¶‚à¶œ à¶´à·à¶½à¶±à¶ºà¶§ යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_captureAudioOutput" msgid="6857134498402346708">"à·à¶¶à·Šà¶¯ à¶´à·Šâ€à¶»à¶­à·’දà·à¶±à¶º ග්â€à¶»à·„ණය"</string>
+ <string name="permdesc_captureAudioOutput" msgid="6210597754212208853">"යෙදුමට à·à¶¶à·Šà¶¯ à¶´à·Šâ€à¶»à¶­à·’දà·à¶±à¶º ග්â€à¶»à·„ණය à¶šà¶» හරව෠යà·à·€à·“මට ඉඩ දේ."</string>
+ <string name="permlab_captureVideoOutput" msgid="2246828773589094023">"වීඩිය෠ප්â€à¶»à¶­à·’දà·à¶±à¶º"</string>
+ <string name="permdesc_captureVideoOutput" msgid="359481658034149860">"යෙදුමට වීඩිය෠ප්â€à¶»à¶­à·’දà·à¶±à¶º ග්â€à¶»à·„ණය à¶šà¶» හරව෠යà·à·€à·“මට ඉඩ දේ."</string>
+ <string name="permlab_captureSecureVideoOutput" msgid="7815398969303382016">"ආරක්â€à·‚à·’à¶­ වීඩිය෠ප්â€à¶»à¶­à·’දà·à¶±à¶º"</string>
+ <string name="permdesc_captureSecureVideoOutput" msgid="2779793064709350289">"යෙදුමට ආරක්â€à·‚à·’à¶­ වීඩිය෠ප්â€à¶»à¶­à·’දà·à¶±à¶º ග්â€à¶»à·„ණය à¶šà¶» හරව෠යà·à·€à·“මට ඉඩ දේ."</string>
+ <string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"ඔබගේ à·à·Šâ€à¶»à·€à·Šâ€à¶º à·ƒà·à¶šà·ƒà·“ම් වෙනස් කරන්න"</string>
+ <string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"à·à¶¶à·Šà¶¯à¶º ආදී à¶œà·à¶½à·“ය à·à¶¶à·Šà¶¯ à·ƒà·à¶šà·ƒà·“ම් වෙනස් කිරීමට සහ à¶´à·Šâ€à¶»à¶­à·’දà·à¶±à¶º සඳහ෠භà·à·€à·’à¶­ කරන්නේ කුමන à¶±à·à¶¯à¶šà¶º දà·à¶ºà·’ තේරීමට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_recordAudio" msgid="3876049771427466323">"à·à¶¶à·Šà¶¯ පටිගත කරන්න"</string>
+ <string name="permdesc_recordAudio" msgid="4906839301087980680">"මයික්â€à¶»à·œà·†à·à¶±à¶º මඟින් à·à¶¶à·Šà¶¯ පටිගත කිරීමට යෙදුමට අවසර දෙන්න. මෙම අවසරය මඟින් යෙදුමට ඕනෑම වේලà·à·€à¶š ඔබගේ අනුදà·à¶±à·”මකින් තොරව à·à¶¶à·Šà¶¯ පටිගත කිරීමට ඉඩ ලබ෠දේ."</string>
+ <string name="permlab_camera" msgid="3616391919559751192">"පින්තූර සහ වීඩිය෠ගන්න"</string>
+ <string name="permdesc_camera" msgid="8497216524735535009">"à¶šà·à¶¸à¶»à·à·€à·™à¶±à·Š පින්තූර à¶œà·à¶±à·“මට සහ වීඩිය෠කිරීමට යෙදුමට අවසර දෙන්න. මෙම අවසරය මඟින් ඔබගේ අනුදà·à¶±à·”මකින් තොරව ඕනෑම වේලà·à·€à¶šà¶¯à·“ à¶šà·à¶¸à¶»à·à·€ à¶·à·à·€à·’ත෠කිරීමට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_cameraDisableTransmitLed" msgid="2651072630501126222">"à¶šà·à¶¸à¶»à·à·€ à¶·à·à·€à·’තයේදී LED දර්à·à¶š සම්ප්â€à¶»à·šà·‚ණය à¶…à¶¶à¶½ කරන්න"</string>
+ <string name="permdesc_cameraDisableTransmitLed" msgid="4764585465480295341">"à¶šà·à¶¸à¶»à· à¶·à·à·€à·’තය à¶´à·’à·…à·’à¶¶à¶³ LED දර්à·à¶šà¶º à¶…à¶šà·Šâ€à¶»à·’ය කිරීමට, කලින් පිහිටුව෠ඇති පද්ධති යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"à¶§à·à¶¶à·Šà¶½à¶§à¶º ස්ථිරවම à¶…à¶¶à¶½ කිරීම"</string>
+ <string name="permlab_brick" product="default" msgid="8337817093326370537">"දුරකථනය ස්ථිරව අබල කිරීම"</string>
+ <string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"මුළු à¶§à·à¶¶à·Šà¶½à¶§à¶ºà¶¸ ස්ථිරවම à¶…à¶šà·Šâ€à¶»à·’ය කිරීමට යෙදුමට අවසර දෙන්න. මෙය ඉත෠භයà·à¶±à¶šà¶ºà·’."</string>
+ <string name="permdesc_brick" product="default" msgid="5788903297627283099">"මුළු දුරකථනයම ස්ථිරවම à¶…à¶šà·Šâ€à¶»à·’ය කිරීමට යෙදුමට අවසර දෙන්න. මෙය ඉත෠භයà·à¶±à¶šà¶ºà·’."</string>
+ <string name="permlab_reboot" product="tablet" msgid="3436634972561795002">"à¶§à·à¶¶à·Šà¶½à¶§à·Š à¶±à·à·€à¶­ à¶´à¶« à¶œà·à¶±à·Šà·€à·“මට à¶¶à¶½ කරන්න"</string>
+ <string name="permlab_reboot" product="default" msgid="2898560872462638242">"දුරකථන à¶±à·à·€à¶­ à¶´à¶« à¶œà·à¶±à·Šà·€à·“මට à¶¶à¶½ කරන්න"</string>
+ <string name="permdesc_reboot" product="tablet" msgid="8172056180063700741">"à¶§à·à¶¶à·Šà¶½à¶§à¶º à¶±à·à·€à¶­ à¶¶à¶½ à¶œà·à¶±à·Šà·€à·“මට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permdesc_reboot" product="default" msgid="5326008124289989969">"à¶§à·à¶¶à·Šà¶½à¶§à¶º à¶±à·à·€à¶­ ඇරඹීමට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_mount_unmount_filesystems" product="nosdcard" msgid="2927361537942591841">"USB ආචයනය ගොනු පද්ධතිය à¶´à·Šâ€à¶»à·€à·šà· කිරීම"</string>
+ <string name="permlab_mount_unmount_filesystems" product="default" msgid="4402305049890953810">"SD à¶´à¶­à·Š ගොනු පද්ධතිය à¶´à·Šâ€à¶»à·€à·šà· කිරීම"</string>
+ <string name="permdesc_mount_unmount_filesystems" msgid="1829290701658992347">"ඉවත් à¶šà·… à·„à·à¶šà·’ ආචයනය සඳහ෠ගොනු පද්ධති ඈඳීමට සහ à¶œà·à¶½à·€à·“මට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_mount_format_filesystems" product="nosdcard" msgid="6227819582624904972">"USB ආචයනය මකන්න"</string>
+ <string name="permlab_mount_format_filesystems" product="default" msgid="262582698639274056">"SD පත මකන්න"</string>
+ <string name="permdesc_mount_format_filesystems" msgid="8784268246779198627">"ඉවත් à¶šà·… à·„à·à¶šà·’ ආචයන à·†à·à¶¸à·à¶§à·Š කිරීමට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_asec_access" msgid="3411338632002193846">"à¶…à¶·à·Šâ€à¶ºà¶±à·Šà¶­à¶» ආචයනය à¶´à·’à·…à·’à¶¶à¶³ තොරතුරු ලබ෠ගà·à¶±à·“ම"</string>
+ <string name="permdesc_asec_access" msgid="3094563844593878548">"à¶…à¶·à·Šâ€à¶ºà¶±à·Šà¶­à¶» ආචයනයේ තොරතුරු ලබà·à¶œà·à¶±à·“මට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_asec_create" msgid="6414757234789336327">"à¶…à¶·à·Šâ€à¶ºà¶±à·Šà¶­à¶» ආචයනය නිර්මà·à¶«à¶º"</string>
+ <string name="permdesc_asec_create" msgid="4558869273585856876">"à¶…à¶·à·Šâ€à¶ºà¶±à·Šà¶­à¶» ආචයනය à·ƒà·à¶¯à·“මට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_asec_destroy" msgid="526928328301618022">"à¶…à¶·à·Šâ€à¶ºà¶±à·Šà¶­à¶» ආචයනය විනà·à· කිරීම"</string>
+ <string name="permdesc_asec_destroy" msgid="7218749286145526537">"à¶…à¶·à·Šâ€à¶ºà¶±à·Šà¶­à¶» ආචයනය විනà·à· කිරීමට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_asec_mount_unmount" msgid="8877998101944999386">"à¶…à¶·à·Šâ€à¶ºà¶±à·Šà¶­à¶» ආචයනය නංවීම/à¶œà·à¶½à·€à·“ම"</string>
+ <string name="permdesc_asec_mount_unmount" msgid="3451360114902490929">"à¶…à¶·à·Šâ€à¶ºà¶±à·Šà¶­à¶» ආචයනය සවි කිරීමට/à¶œà·à¶½à·€à·“මට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_asec_rename" msgid="7496633954080472417">"à¶…à¶·à·Šâ€à¶ºà¶±à·Šà¶­à¶» ආචයනය à¶±à·à·€à¶­ නම් කරන්න"</string>
+ <string name="permdesc_asec_rename" msgid="1794757588472127675">"à¶…à¶·à·Šâ€à¶ºà¶±à·Šà¶­à¶» ආචයනය à¶±à·à·€à¶­ නම් කිරීමට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_vibrate" msgid="7696427026057705834">"කම්පනය à¶´à·à¶½à¶±à¶º කිරීම"</string>
+ <string name="permdesc_vibrate" msgid="6284989245902300945">"කම්පකය à¶´à·à¶½à¶±à¶ºà¶§ යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_flashlight" msgid="2155920810121984215">"à·ƒà·à¶«à·™à·…à·’ ආලà·à¶šà¶º à¶´à·à¶½à¶±à¶º කරන්න"</string>
+ <string name="permdesc_flashlight" msgid="6522284794568368310">"à·ƒà·à¶«à·™à·…ිය à¶´à·à¶½à¶±à¶ºà¶§ යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_manageUsb" msgid="1113453430645402723">"USB à¶‹à¶´à·à¶‚à¶œ සඳහ෠කà·à¶¸à·à¶­à·Šà¶­ සහ අවසර කළමනà·à¶šà¶»à¶«à¶º කිරීම"</string>
+ <string name="permdesc_manageUsb" msgid="7776155430218239833">"USB à¶‹à¶´à·à¶‚à¶œ සඳහ෠අභිරුචි සහ අවසර කළමනà·à¶šà¶»à¶«à¶ºà¶§ යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_accessMtp" msgid="4953468676795917042">"MTP à¶´à·Šâ€à¶»à·œà¶§à·œà¶šà·à¶½à¶º à¶šà·Šâ€à¶»à·’යà·à¶­à·Šà¶¸à¶š කිරීම"</string>
+ <string name="permdesc_accessMtp" msgid="6532961200486791570">"MTP USB à¶´à·Šâ€à¶»à·œà¶§à·à¶šà·à¶½à¶º à¶šà·Šâ€à¶»à·’යà·à¶­à·Šà¶¸à¶š කිරීමට කර්නල MTP à¶°à·à·€à¶šà¶ºà¶§ à¶´à·Šâ€à¶»à·€à·šà· වීමට අවසර දෙන්න."</string>
+ <string name="permlab_hardware_test" msgid="4148290860400659146">"දෘඩà·à¶‚à¶œ පරීක්ෂණය කරන්න"</string>
+ <string name="permdesc_hardware_test" msgid="6597964191208016605">"දෘඩà·à¶‚à¶œ පරීක්ෂ෠කිරීමේ අරමුණ සඳහ෠යෙදුමට විවිධ පර්යන්ත à¶´à·à¶½à¶±à¶º කිරීමට ඉඩ දෙන්න."</string>
+ <string name="permlab_callPhone" msgid="3925836347681847954">"දුරකථන à¶…à¶‚à¶š වෙත à¶à¶¢à·”වම අමතන්න"</string>
+ <string name="permdesc_callPhone" msgid="3740797576113760827">"ඔබගේ මà·à¶¯à·’à·„à¶­à·Š වීමක් නොමà·à¶­à·’à·€ දුරකථන à¶…à¶‚à¶š ඇමතීමට යෙදුමට අවසර දෙන්න. මෙහි à¶´à·Šâ€à¶»à¶­à·’එලය වන්නේ අනපේක්ෂිත අයකිරීම් හ෠ඇමතුම් ඇතිවීමයි. මෙයන් හදිසි à¶…à¶‚à¶š වලට ඇමතුම් à¶œà·à¶±à·“මට යෙදුමට අවසර නොදෙන බවට සටහන් කරගන්න. ඔබගේ අනුදà·à¶±à·”මක් නොමà·à¶­à·’à·€ ඇමතුම් à¶œà·à¶±à·“මෙන් අනිෂ්ට යෙදුම් ඔබගේ මුදල් නිකරුණේ à·€à·à¶º කරයි."</string>
+ <string name="permlab_callPrivileged" msgid="4198349211108497879">"ඕනෑම දුරකථන අංකයකට à¶à¶¢à·”වම අමතන්න"</string>
+ <string name="permdesc_callPrivileged" msgid="1689024901509996810">"ඔබගේ මà·à¶¯à·’හත්වීමකින් තොරව හදිසි à¶…à¶‚à¶š ඇතුළත්ව ඕනෑම දුරකථන අංකයකට ඇමතීමට යෙදුමට අවසර දෙන්න. හදිසි සේව෠වෙත අනවà·à·Šâ€à¶º සහ නීතිමය නොවන ඇමතුම à¶½à·à¶¶à·“මට අනිෂ්ට යෙදුම සිදු à¶šà·… à·„à·à¶š."</string>
+ <string name="permlab_performCdmaProvisioning" product="tablet" msgid="4842576994144604821">"CDMA à¶§à·à¶¶à·Šà¶½à¶§ පිහිටුම සෘජුව ඇරඹීම"</string>
+ <string name="permlab_performCdmaProvisioning" product="default" msgid="5604848095315421425">"CDMA දුරකථන පිහිටුම සෘජුව ඇරඹීම"</string>
+ <string name="permdesc_performCdmaProvisioning" msgid="1994193538802314186">"යෙදුමට CDMA à¶´à·Šâ€à¶»à¶­à·’à¶´à·à¶¯à¶± ආරම්භ කිරීමට ඉඩදෙන්න. අනිෂ්ට යෙදුම් අනවà·à·Šâ€à¶º ලෙස CDMA à¶´à·Šâ€à¶»à¶­à·’à¶´à·à¶¯à¶± ආරම්භ à¶šà·… à·„à·à¶š."</string>
+ <string name="permlab_locationUpdates" msgid="7785408253364335740">"ස්ථà·à¶± යà·à·€à¶­à·Šà¶šà·à¶½à·“à¶± දà·à¶±à·”ම්දීම් à¶´à·à¶½à¶±à¶º කරන්න"</string>
+ <string name="permdesc_locationUpdates" msgid="1120741557891438876">"ස්ථà·à¶±à·“ය යà·à·€à¶­à·Šà¶šà·à¶½à·’à¶± දà·à¶±à·”ම්දීම් රේඩියà·à·€à·™à¶±à·Š සබල/à¶…à¶¶à¶½ කිරීමට යෙදුමට අවසර දෙන්න. à·ƒà·à¶¸à·à¶±à·Šâ€à¶º යෙදුම්වල à¶·à·à·€à·’තය සඳහ෠නොවේ."</string>
+ <string name="permlab_checkinProperties" msgid="7855259461268734914">"පිරික්සුම් ගුණà·à¶‚à¶œ වෙත à¶´à·Šâ€à¶»à·€à·šà·à¶º"</string>
+ <string name="permdesc_checkinProperties" msgid="4024526968630194128">"පිරික්සුම් සේවà·à·€ මගින් à¶‹à¶­à·Šà·à·Šâ€à¶»à·šà¶«à·’ à¶šà·… ගුණà·à¶‚à¶œ වෙත කියවීම්/ලිවීම් පිවිසුම සඳහ෠යෙදුමට අවසර දෙන්න. à·ƒà·à¶¸à·à¶±à·Šâ€à¶º යෙදුම් වල à¶·à·à·€à·’තයට නොවේ."</string>
+ <string name="permlab_bindGadget" msgid="776905339015863471">"විජට් à¶­à·à¶»à¶±à·Šà¶±"</string>
+ <string name="permdesc_bindGadget" msgid="8261326938599049290">"කුමන විජටය කුමන යෙදුමෙන් à¶·à·à·€à·’à¶­à· à¶šà¶½ à·„à·à¶šà·’ද යන්න පද්ධතියට à¶´à·à·€à·ƒà·“මට යෙදුමට අවසර දෙන්න. මෙම අවසරය ඇති යෙදුමකට අනෙක් යෙදුම්වලට පුද්ගලික දත්ත වලට à¶´à·Šâ€à¶»à·€à·šà·à¶º ලබ෠දිය à·„à·à¶š. à·ƒà·à¶¸à·à¶±à·Šâ€à¶º යෙදුම් වල à¶·à·à·€à·’තයට නොවේ."</string>
+ <string name="permlab_modifyPhoneState" msgid="8423923777659292228">"දුරකථනයේ තත්වය වෙනස් කිරීම"</string>
+ <string name="permdesc_modifyPhoneState" msgid="1029877529007686732">"à¶‹à¶´à·à¶‚ගයේ දුරකථන විà·à·šà·‚à·à¶‚à¶œ à¶´à·à¶½à¶±à¶ºà¶§ යෙදුමට අවසර දෙන්න. මෙම අවසරය ඇති යෙදුමට ඔබට නිවේදනයෙන් තොරව à¶¢à·à¶½ මà·à¶»à·” කිරීම, දුරකථන රේඩියà·à·€ සක්â€à¶»à·’ය සහ à¶…à¶šà·Šâ€à¶»à·’ය කිරීම à¶šà·… à·„à·à¶š."</string>
+ <string name="permlab_readPhoneState" msgid="9178228524507610486">"දුරකථනයේ තත්වය සහ අනන්â€à¶ºà¶­à·à·€à¶º කියවීම"</string>
+ <string name="permdesc_readPhoneState" msgid="1639212771826125528">"à¶‹à¶´à·à¶‚ගයේ දුරකථන විà·à·šà·‚à·à¶‚à¶œ වෙත පිවිසීමට යෙදුමට අවසර දෙන්න. ඇමතුම සක්â€à¶»à·’ය වුවත් සහ ඇමතුමකින් දුරස්ථ අංකය සම්බන්ධ වුවත් දුරකථන අංකය සහ à¶‹à¶´à·à¶‚à¶œ ID හඳුන෠ගà·à¶±à·“මට මෙම අවසරය යෙදුමට අවසර දෙයි."</string>
+ <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"à¶§à·à¶¶à·Šà¶½à¶§à¶º නින්දෙන් à·€à·à·…ක්වීම"</string>
+ <string name="permlab_wakeLock" product="default" msgid="573480187941496130">"දුරකථනය නින්දට යà·à¶¸à·™à¶±à·Š වළකන්න"</string>
+ <string name="permdesc_wakeLock" product="tablet" msgid="7311319824400447868">"à¶§à·à¶¶à·Šà¶½à¶§à¶º නින්දට යà·à¶¸à·™à¶±à·Š à·€à·à¶½à·à¶šà·Šà·€à·“මට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permdesc_wakeLock" product="default" msgid="8559100677372928754">"දුරකථනය නින්දට යà·à¶¸à·™à¶±à·Š à·€à·à¶½à·à¶šà·Šà·€à·“මට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_devicePower" product="tablet" msgid="2787034722616350417">"à¶§à·à¶¶à·Šà¶½à¶§à¶º සක්â€à¶»à·’ය à·„à· à¶…à¶šà·Šâ€à¶»à·’ය කරන්න"</string>
+ <string name="permlab_devicePower" product="default" msgid="4928622470980943206">"දුරකථනය à¶¶à¶½ à¶œà·à¶±à·Šà·€à·“ම à·„à· à·€à·à·ƒà·“ම"</string>
+ <string name="permdesc_devicePower" product="tablet" msgid="6689862878984631831">"à¶§à·à¶¶à·Šà¶½à¶§à¶º සක්â€à¶»à·’ය à·„à· à¶…à¶šà·Šâ€à¶»à·’ය කිරීමට යෙදුමට අවසර දේ."</string>
+ <string name="permdesc_devicePower" product="default" msgid="6037057348463131032">"දුරකථනය සක්â€à¶»à·’ය සහ à¶…à¶šà·Šâ€à¶»à·’ය කිරීමට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_factoryTest" msgid="3715225492696416187">"කර්මà·à¶±à·Šà¶­à·à·à¶½à· පරීක්ෂණ ආකà·à¶»à¶º තුළ à¶°à·à·€à¶±à¶º කරන්න"</string>
+ <string name="permdesc_factoryTest" product="tablet" msgid="3952059318359653091">"à¶§à·à¶¶à·Šà¶½à¶§à¶ºà·š දෘඩà·à¶‚à¶œ වෙත සම්පූර්ණ පිවිසුම සඳහ෠අවසර දීමෙන් à¶´à·„à·… මට්ටමේ නිපà·à·€à·”ම්කරු පරීක්ෂණයක් ලෙස à¶°à·à·€à¶±à¶º කරන්න. නිපà·à·€à·”ම්කරු පරීක්ෂණ ආකà·à¶»à¶ºà·™à¶±à·Š à¶§à·à¶¶à·Šà¶½à¶§à¶ºà·š à¶°à·à·€à¶±à¶º වන විට පමණි."</string>
+ <string name="permdesc_factoryTest" product="default" msgid="8136644990319244802">"දුරකථනයේ දෘඩà·à¶‚à¶œ වෙත සම්පූර්ණ පිවිසුම සඳහ෠අවසර දීමෙන් à¶´à·„à·… මට්ටමේ නිපà·à·€à·”ම්කරු පරීක්ෂණයක් ලෙස à¶°à·à·€à¶±à¶º කරන්න. නිපà·à·€à·”ම්කරු පරීක්ෂණ ආකà·à¶»à¶ºà·™à¶±à·Š දුරකථනයේ à¶°à·à·€à¶±à¶º වන විට පමණි."</string>
+ <string name="permlab_setWallpaper" msgid="6627192333373465143">"බිතුපත à·ƒà·à¶šà·ƒà·“ම"</string>
+ <string name="permdesc_setWallpaper" msgid="7373447920977624745">"පද්ධති බිතුපත à·ƒà·à¶šà·ƒà·“මට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_setWallpaperHints" msgid="3278608165977736538">"ඔබගේ බිතුපතේ à¶´à·Šâ€à¶»à¶¸à·à¶«à¶º à·ƒà·à¶šà·ƒà·“ම"</string>
+ <string name="permdesc_setWallpaperHints" msgid="8235784384223730091">"පද්ධති බිතුපතේ à¶´à·Šâ€à¶»à¶¸à·à¶« ඉඟි සකස් කිරීමට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_masterClear" msgid="2315750423139697397">"කර්මà·à¶±à·Šà¶­à·à·à¶½à· සුපුරුද්දට පද්ධතිය à¶±à·à·€à¶­ සකස් කිරීම"</string>
+ <string name="permdesc_masterClear" msgid="3665380492633910226">"සියලු දත්ත මà·à¶šà·“මෙන්, වින්â€à¶ºà·à·ƒ කිරීමෙන් සහ යෙදුම් ස්ථà·à¶´à¶±à¶ºà·™à¶±à·Š à¶‘à·„à·’ කර්මà·à¶±à·Šà¶­ à·à·à¶½à· à·ƒà·à¶šà·ƒà·“ම් වෙත පද්ධතිය à¶±à·à·€à¶­ à·ƒà·à¶šà·ƒà·“මට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_setTime" msgid="2021614829591775646">"වේලà·à·€ à·ƒà·à¶šà·ƒà·“ම"</string>
+ <string name="permdesc_setTime" product="tablet" msgid="1896341438151152881">"à¶§à·à¶¶à·Šà¶½à¶§ ඔරලà·à·ƒà·”වේ වේලà·à·€ වෙනස් කිරීමට යෙදුමට ඉඩ දෙන්න."</string>
+ <string name="permdesc_setTime" product="default" msgid="1855702730738020">"දුරකථන ඔරලà·à·ƒà·”වේ වේලà·à·€ වෙනස් කිරීමට යෙදුමකට ඉඩ දෙන්න."</string>
+ <string name="permlab_setTimeZone" msgid="2945079801013077340">"වේල෠කලà·à¶´à¶º à·ƒà·à¶šà·ƒà·“ම"</string>
+ <string name="permdesc_setTimeZone" product="tablet" msgid="1676983712315827645">"à¶§à·à¶¶à·Šà¶½à¶§à¶ºà·š à¶šà·à¶½ à¶šà¶½à·à¶´à¶º වෙනස් කිරීමට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permdesc_setTimeZone" product="default" msgid="4499943488436633398">"දුරකථනයේ වේල෠කලà·à¶´à¶º වෙනස් කිරීමට à¶‹à¶´à·à¶‚ගයට අවසර දෙන්න."</string>
+ <string name="permlab_accountManagerService" msgid="4829262349691386986">"AccountManagerService ලෙස පෙනී සිටින්න"</string>
+ <string name="permdesc_accountManagerService" msgid="1948455552333615954">"AccountAuthenticators වෙත ඇමතුම් à¶œà·à¶±à·“මට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_getAccounts" msgid="1086795467760122114">"à¶‹à¶´à·à¶‚ගයේ ඇති ගිණුම් සොයන්න"</string>
+ <string name="permdesc_getAccounts" product="tablet" msgid="2741496534769660027">"à¶§à·à¶¶à·Šà¶½à¶§à¶º විසින් දන්න෠ගිණුම් à¶½à·à¶ºà·’ස්තුවක් ලබà·à¶œà·à¶±à·“මට යෙදුමට අවසර දෙන්න. ඔබ ස්ථà·à¶´à¶±à¶º කොට ඇති යෙදුම් විසින් à·ƒà·à¶¯à· ඇති ගිණුම් මීට ඇතුළත් වේ."</string>
+ <string name="permdesc_getAccounts" product="default" msgid="3448316822451807382">"දුරකථනය විසින් දන්න෠ගිණුම් à¶½à·à¶ºà·’ස්තුවක් ලබà·à¶œà·à¶±à·“මට යෙදුමට අවසර දෙන්න. ඔබ ස්ථà·à¶´à¶±à¶º කොට ඇති යෙදුම් විසින් à·ƒà·à¶¯à· ඇති ගිණුම් මීට ඇතුළත් වේ."</string>
+ <string name="permlab_authenticateAccounts" msgid="5265908481172736933">"ගිණුම් à·ƒà·à¶¯à¶±à·Šà¶± සහ මුරපද සකසන්න"</string>
+ <string name="permdesc_authenticateAccounts" msgid="5472124296908977260">"ගිණුම් à·ƒà·à¶¯à·“මට සහ රහස් පද ලබà·à¶œà·à¶±à·“ම සහ à·ƒà·à¶šà·ƒà·“ම් කිරීම ඇතුළත්ව AccountManager ගේ ගිණුම් සත්â€à¶ºà·à¶´à¶± à·„à·à¶šà·’යà·à·€à¶±à·Š à¶·à·à·€à·’ත෠කිරීමට යෙදුමකට අවසර දෙන්න."</string>
+ <string name="permlab_manageAccounts" msgid="4983126304757177305">"ගිණුම් එකතු කරන්න හ෠ඉවත් කරන්න"</string>
+ <string name="permdesc_manageAccounts" msgid="8698295625488292506">"ගිණුම් à¶‘à¶šà¶­à·” කිරීම, සහ ඉවත් කිරීම සහ ඔවුන්ගේ මුරපද මà·à¶šà·“ම ආදී à¶šà·Šâ€à¶»à·’යà·à·€à¶½à·’ සිදු කිරීමට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_useCredentials" msgid="235481396163877642">"à¶‹à¶´à·à¶‚ගයේ ඇති ගිණුම් à¶·à·à·€à·’ත෠කිරීම"</string>
+ <string name="permdesc_useCredentials" msgid="7984227147403346422">"සත්â€à¶ºà·à¶´à¶± à¶§à·à¶šà¶± ඉල්ලීම සඳහ෠යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_accessNetworkState" msgid="4951027964348974773">"à¶¢à·à¶½ සම්බන්ධතà·à·€à¶ºà¶±à·Š à¶¶à·à¶½à·“ම"</string>
+ <string name="permdesc_accessNetworkState" msgid="8318964424675960975">"කුමන à¶¢à·à¶½ පවතින්නේ ද සහ සම්බන්ධිත ද ආදී à¶¢à·à¶½ සබඳත෠ගà·à¶± තොරතුරු à¶¶à·à¶½à·“මට යෙදුමට අවසර දෙයි."</string>
+ <string name="permlab_createNetworkSockets" msgid="8018758136404323658">"සම්පූර්ණ à¶¢à·à¶½ à¶´à·Šâ€à¶»à·€à·šà·à¶º"</string>
+ <string name="permdesc_createNetworkSockets" msgid="3403062187779724185">"උපකරණයට à¶¢à·à¶½ කෙවනියන් à·ƒà·à¶¯à·“මට සහ à¶¢à·à¶½ à¶´à·Šâ€à¶»à·œà¶§à·à¶šà·à¶½ අභිරුචි à¶·à·à·€à·’ත෠කිරීමට උපකරණයට ඉඩ දෙන්න. අන්තර්ජà·à¶½à¶ºà¶§ දත්ත යà·à·€à·“මට විධියන් à¶¶à·Šâ€à¶»à·€à·Šà·ƒà¶»à¶º සහ අනෙකුත් යෙදුම් සපයයි, එනිස෠මෙම අවසරය දත්ත අන්තර්ජà·à¶½à¶ºà¶§ යà·à·€à·“මට à¶…à·€à·à·Šâ€à¶º නොවේ."</string>
+ <string name="permlab_writeApnSettings" msgid="505660159675751896">"à¶¢à·à¶½à¶ºà·š à·ƒà·à¶šà·ƒà·“ම් සහ ගමනà·à¶œà¶¸à¶± වෙනස් කරන්න/අල්ල෠ගà·à¶±à·“ම"</string>
+ <string name="permdesc_writeApnSettings" msgid="5333798886412714193">"ඕනෑම APN à¶‘à¶šà¶š නියුතුව සහ තොට වෙනස් කිරීම à·€à·à¶±à·’ à¶¢à·à¶½ à·ƒà·à¶šà·ƒà·“ම් වෙනස් කිරීමට සහ සියලුම à¶¢à·à¶½ අතුරු ඇරීමට සහ à·ƒà·à¶¯à·’සි කිරීමට යෙදුමට අවසර දෙන්න. ඇතà·à¶¸à·Šà·€à·’à¶§ ඔබගේ අනුදà·à¶±à·”මකින් තොරව අනිෂ්ට à¶‹à¶´à·à¶‚à¶œ à¶¢à·à¶½ à¶´à·à¶šà·à¶§à·Šà¶§à·” අධීක්ෂණය,ආපසු දිà·à·à¶œà¶­ කිරීම හ෠වෙනස්කිරීම සිදු කිරීමට ඉඩ à¶­à·’à¶¶à·š."</string>
+ <string name="permlab_changeNetworkState" msgid="958884291454327309">"à¶¢à·à¶½ සම්බන්ධතà·à·€ වෙනස් කිරීම"</string>
+ <string name="permdesc_changeNetworkState" msgid="6789123912476416214">"à¶¢à·à¶½ සම්බන්ධතà·à·€à¶ºà·š තත්වය වෙනස් කිරීමට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_changeTetherState" msgid="5952584964373017960">"ටෙදර් කරන ලද සම්බන්ධත෠වෙනස් කිරීම"</string>
+ <string name="permdesc_changeTetherState" msgid="1524441344412319780">"ටෙදර් à¶šà·… à¶¢à·à¶½ සම්බන්ධතà·à·€à¶ºà·š තත්වය වෙනස් කිරීමට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_changeBackgroundDataSetting" msgid="1400666012671648741">"පසුබිම් දත්ත à¶·à·à·€à·’à¶­ à·ƒà·à¶šà·ƒà·“ම් වෙනස් කිරීම"</string>
+ <string name="permdesc_changeBackgroundDataSetting" msgid="5347729578468744379">"පසුබිම් දත්ත à¶·à·à·€à·’à¶­à· à·ƒà·à¶šà·ƒà·“ම වෙනස් කිරීමට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_accessWifiState" msgid="5202012949247040011">"Wi-Fi සම්බන්ධතà·à·€à¶±à·Š à¶¶à·à¶½à·“ම"</string>
+ <string name="permdesc_accessWifiState" msgid="5002798077387803726">"Wi-Fi සබල à¶¶à·€ සහ සම්බන්ධිත Wi-Fi à¶‹à¶´à·à¶‚à¶œ වල නම් ආදී Wi-Fi à¶¢à·à¶½à¶šà¶»à¶«à¶ºà·š තොරතුරු à¶¶à·à¶½à·“මට යෙදුමට අවසර දෙයි."</string>
+ <string name="permlab_changeWifiState" msgid="6550641188749128035">"Wi-Fi වලට සම්බන්ධ විම සහ විසන්ධි කිරීම"</string>
+ <string name="permdesc_changeWifiState" msgid="7137950297386127533">"Wi-Fi à¶´à·Šâ€à¶»à·€à·šà· ස්ථà·à¶±à¶ºà¶±à·Š වෙත සම්බන්ධ වීමට සහ විසන්ධි වීමට සහ, Wi-Fi à¶¢à·à¶½ සඳහ෠උපà·à¶‚ගයේ වින්â€à¶ºà·à·ƒà¶ºà¶§ වෙනස් කිරීමට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_changeWifiMulticastState" msgid="1368253871483254784">"Wi-Fi බහුවිකà·à·à¶± à¶´à·’à·…à·’à¶œà·à¶±à·“මට අවසර දෙන්න"</string>
+ <string name="permdesc_changeWifiMulticastState" product="tablet" msgid="7969774021256336548">"ඔබගේ à¶§à·à¶¶à·Šà¶½à¶§à¶ºà¶§ පමණක් නොව Wi-Fi à¶¢à·à¶½à¶ºà·š ඇති සියලුම à¶‹à¶´à·à¶‚ගවලට යà·à·€à·– à¶´à·à¶šà·à¶§à·Šà¶§à·” à¶¶à·„à·” විකà·à· ලිපින à¶·à·à·€à·’තයෙන් ලබà·à¶œà·à¶±à·“මට යෙදුමට අවසර දෙන්න. non-multicast ආකà·à¶»à¶ºà¶§ වඩ෠වà·à¶©à·’ බලයක් මෙහිදී à¶·à·à·€à·’ත෠වේ."</string>
+ <string name="permdesc_changeWifiMulticastState" product="default" msgid="6851949706025349926">"ඔබගේ දුරකථනයට පමණක් නොව Wi-Fi à¶¢à·à¶½à¶ºà·š ඇති සියලුම යෙදුම්වලට යà·à·€à·– à¶´à·à¶šà·à¶§à·Šà¶§à·” බහුවà·à·„à¶š ලිපින à¶·à·à·€à·’තයෙන් ලබà·à¶œà·à¶±à·“මට යෙදුමට අවසර à¶½à·à¶¶à·š. බහුවà·à·„à¶š à¶±à·à¶­à·’ ආකà·à¶»à¶ºà¶§ වඩ෠වà·à¶©à·’ බලයක් මෙහිදී à¶·à·à·€à·’ත෠වේ."</string>
+ <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"බ්ලූටූත් à·ƒà·à¶šà·ƒà·“ම් à¶´à·Šâ€à¶»à·€à·šà·à¶º"</string>
+ <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"ස්ථà·à¶±à·“ය බ්ලූටූත් à¶§à·à¶¶à·Šà¶½à¶§à·Šà¶ºà¶šà·Š à·ƒà·à¶šà·ƒà·“මට සහ වින්â€à¶ºà·à·ƒ කිරීමට සහ දුරස්ථ à¶‹à¶´à·à¶‚à¶œ සමග යුගළ කිරීමට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"දුරකථනයේ පෙදෙසි බ්ලූටූත් වින්â€à¶ºà·à·ƒ කිරීමට, සහ දුරස්ථ à¶‹à¶´à·à¶‚à¶œ ගවේෂණයට සහ යුගල වීමට යෙදුමට අවසර දෙයි."</string>
+ <string name="permlab_accessWimaxState" msgid="4195907010610205703">"WiMAX වෙතට සම්බන්ධ කරන්න හ෠විසන්ධි කරන්න"</string>
+ <string name="permdesc_accessWimaxState" msgid="6360102877261978887">"WiMAX සබල à¶¶à·€ සහ සම්බන්ධිත ඕනෑම WiMAX à¶¢à·à¶½à¶ºà¶š තොරතුරු නිà·à·Šà¶ à¶º කිරීමට යෙදුමට අවසර දෙයි."</string>
+ <string name="permlab_changeWimaxState" msgid="2405042267131496579">"WiMAX තත්වය වෙනස් කරන්න"</string>
+ <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"à¶§à·à¶¶à·Šà¶½à¶§à¶º WiMAX à¶¢à·à¶½ වෙත සම්බන්ධ කිරීමට සහ විසන්ධි කිරීමට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"WiMAX à¶¢à·à¶½à¶ºà¶±à·Šà¶§ දුරකථනය සම්බන්ධ කිරීමට සහ විසන්ධි කිරීමට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_bluetooth" msgid="6127769336339276828">"බ්ලූටූත් à¶‹à¶´à·à¶‚à¶œ සමඟ යුගල කිරීම"</string>
+ <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"à¶§à·à¶¶à·Šà¶½à¶§à¶ºà·š බ්ලූටූත් වින්â€à¶ºà·à·ƒà¶º à¶¶à·à¶½à·’මට, à·ƒà·à¶šà·ƒà·“මට සහ යුගල à¶šà·… à¶‹à¶´à·à¶‚à¶œ සමඟ සම්බන්ධතà·à·€à¶±à·Š à¶´à·’à·…à·’à¶œà·à¶±à·“මට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"දුරකථනයේ බ්ලූටූත් වින්â€à¶ºà·à·ƒà¶º දà·à¶šà·“මට, යුගල à¶‹à¶´à·à¶‚à¶œ සමඟ සම්බන්ධතà·à·€à¶±à·Š à·ƒà·à¶šà·ƒà·“මට සහ à¶·à·à¶»à¶œà·à¶±à·“මට යෙදුමට අවසර දෙයි."</string>
+ <string name="permlab_nfc" msgid="4423351274757876953">"ආසන්න à¶šà·Šà·‚à·šà¶­à·Šâ€à¶» සන්නිවේදනය à¶´à·à¶½à¶±à¶º කරන්න"</string>
+ <string name="permdesc_nfc" msgid="7120611819401789907">"ආසන්න à¶šà·Šà·‚à·šà¶­à·Šâ€à¶» සන්නිවේදන (NFC) à¶§à·à¶œà·Š, à¶´à¶­à·Š, සහ කියවන්නන් සමඟ සන්නිවේදනය කිරීමට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_disableKeyguard" msgid="3598496301486439258">"ඔබගේ තිරයේ අගුල අබල කරන්න"</string>
+ <string name="permdesc_disableKeyguard" msgid="6034203065077122992">"යතුරු අගුල සහ ඕනෑම සම්බන්ධිත මුරපද ආරක්ෂà·à·€à¶šà·Š à¶…à¶¶à¶½ කිරීමට යෙදුමට අවසර දෙන්න. මෙහි උදà·à·„රණයක් වන්නේ à¶´à·à¶¸à·’ණෙන ඇමතුමක් à¶½à·à¶¶à·™à¶¯à·Šà¶¯à·“, දුරකථනය à¶…à¶šà·Šâ€à¶»à·’ය වන à¶…à¶­à¶» ඇමතුම අවසà·à¶± වන විට යතුරු අගුල à¶±à·à·€à¶­ සක්â€à¶»à·’ය වෙයි."</string>
+ <string name="permlab_readSyncSettings" msgid="6201810008230503052">"සමමුහුර්ත à·ƒà·à¶šà·ƒà·“ම් කියවන්න"</string>
+ <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"ගිණුම සඳහ෠සමමුහුර්ත à·ƒà·à¶šà·ƒà·“ම් කියවීමට යෙදුමට අවසර දෙන්න. උදà·à·„රණයක් ලෙස, ගිණුමක් සමඟ පුද්ගල යෙදුම සමමුහුර්ත දà·à¶ºà·’ මෙයට හඳුන෠ගත à·„à·à¶š."</string>
+ <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"සමමුහුර්ත කිරීම සක්â€à¶»à·’ය කරන්න සහ à¶…à¶šà·Šâ€à¶»à·’ය කරන්න"</string>
+ <string name="permdesc_writeSyncSettings" msgid="8956262591306369868">"ගිණුම සඳහ෠සමමුහුර්ත à·ƒà·à¶šà·ƒà·“ම් වෙනස් කිරීමට යෙදුමට අවසර දෙන්න. උදà·à·„රණයක් ලෙස, ගිණුම සමඟ පුද්ගල යෙදුම සමමුහුර්ත කිරීම සක්â€à¶»à·’ය කිරීමට à¶·à·à·€à·’à¶­ à¶šà¶½ à·„à·à¶š."</string>
+ <string name="permlab_readSyncStats" msgid="7396577451360202448">"සමමුහුර්ත කිරීමේ සංඛ්â€à¶ºà·à¶± කියවීම"</string>
+ <string name="permdesc_readSyncStats" msgid="1510143761757606156">"සමමුහුර්ත කිරීමේ සිදුවීම් ඉතිහà·à·ƒà¶º සහ කෙතරම් දත්ත සමමුහුර්ත වී ඇතිදà·à¶ºà·’ ඇතුලත් ගිණුම සඳහ෠සමමුහුර්ත කිරීමේ සංඛ්â€à¶ºà·à¶± කියවීමට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"දà·à¶ºà¶š වූ සංග්â€à¶»à·„ කියවීම"</string>
+ <string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"වර්තමà·à¶± සමමුහුර්ත සංග්â€à¶»à·„ à¶œà·à¶± විස්තර à¶½à·à¶¶à·“මට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_subscribedFeedsWrite" msgid="9015246325408209296">"දà·à¶ºà¶š වූ සංග්â€à¶»à·„ ලිවීම"</string>
+ <string name="permdesc_subscribedFeedsWrite" msgid="6928930188826089413">"ඔබගේ වර්තමà·à¶± සමමුහුර්ත සංග්â€à¶»à·„ වෙනස් කිරීමට යෙදුමට අවසර දෙන්න. ඔබගේ සමමුහුර්ත සංග්â€à¶»à·„ අනිෂ්ට යෙදුම්වලින් වෙනස් à¶šà¶½ à·„à·à¶š."</string>
+ <string name="permlab_readDictionary" msgid="4107101525746035718">"ඔබ විසින් à·à¶¶à·Šà¶¯à¶šà·à·‚යට ඇතුළත්කොට ඇති කොන්දේසි කියවීම"</string>
+ <string name="permdesc_readDictionary" msgid="659614600338904243">"පරිà·à·“ලක à·à¶¶à·Šà¶¯ à¶šà·à·‚යේ පරිà·à·“ලකයන් විසින් ගබඩ෠කර තිබිය à·„à·à¶šà·’ වචන, නම්, à·€à·à¶šà·Šâ€à¶ºà¶‚෠කියවීමට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_writeDictionary" msgid="2183110402314441106">"පරිà·à·“ලකයින් අර්ථ දà·à¶šà·Šà·€à·– à·à¶¶à·Šà¶¯ à¶šà·à·‚යට වචන à¶‘à¶šà¶­à·” කිරීම"</string>
+ <string name="permdesc_writeDictionary" msgid="8185385716255065291">"පරිà·à·“ලක à·à¶¶à·Šà¶¯à¶šà·à·‚ය තුළට අලුත් වචන ලිවීමට යෙදුමට ඉඩ දෙන්න."</string>
+ <string name="permlab_sdcardRead" product="nosdcard" msgid="8235341515605559677">"ආරක්â€à·‚à·’à¶­ ආචයනය වෙත à¶´à·Šâ€à¶»à·€à·šà·à¶º පරීක්ෂ෠කිරීම"</string>
+ <string name="permlab_sdcardRead" product="default" msgid="8235341515605559677">"ආරක්â€à·‚à·’à¶­ ආචයනය වෙත à¶´à·Šâ€à¶»à·€à·šà·à¶º පරීක්ෂ෠කිරීම"</string>
+ <string name="permdesc_sdcardRead" product="nosdcard" msgid="3642473292348132072">"à¶…à¶±à·à¶œà¶­ à¶‹à¶´à·à¶‚ගවල ලබà·à¶œà¶­ à·„à·à¶šà·’ USB ආචයනය සඳහ෠අවසරයක් පරීක්ෂ෠කිරීමට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permdesc_sdcardRead" product="default" msgid="5914402684685848828">"à¶…à¶±à·à¶œà¶­ à¶‹à¶´à·à¶‚ගවල à¶´à·à·€à¶­à·™à¶± SD à¶šà·à¶©à·Š à¶´à¶­ සඳහ෠අවසරයක් පිරික්සීමට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"ඔබගේ USB ආචයනයේ අන්තර්ගත වෙනස් කිරීම හ෠මà·à¶šà·“ම"</string>
+ <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"ඔබගේ SD à¶´à¶­à·š අන්තර්ගත වෙනස් කිරීම හ෠මà·à¶šà·“ම"</string>
+ <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"USB ආචයනය වෙත ලිවීමට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"SD පත වෙත ලිවීමට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"à¶…à¶·à·Šâ€à¶ºà¶±à·Šà¶­à¶» මà·à¶°à·Šâ€à¶º ආචයනය අන්තර්ගත වෙනස් කරන්න/ මකන්න"</string>
+ <string name="permdesc_mediaStorageWrite" product="default" msgid="8189160597698529185">"à¶…à¶·à·Šâ€à¶ºà¶±à·Šà¶­à¶» මà·à¶°à·Šâ€à¶º ආචයනයේ අන්තර්ගතය වෙනස් කිරීමට à¶‹à¶´à·à¶‚ගයට අවසර දෙන්න."</string>
+ <string name="permlab_manageDocs" product="default" msgid="5778318598448849829">"ලේඛන ආචයනය කළමනà·à¶šà¶»à¶«à¶º කරන්න"</string>
+ <string name="permdesc_manageDocs" product="default" msgid="8704323176914121484">"ලේඛන ආචයනය කළමනà·à¶šà¶»à¶«à¶º කිරීමට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_sdcardAccessAll" msgid="8150613823900460576">"සියලුම පරිà·à·“ලකයන්ගේ à¶¶à·à·„à·’à¶» ආචයන වෙත පිවිසෙන්න"</string>
+ <string name="permdesc_sdcardAccessAll" msgid="3215208357415891320">"සියලු පරිà·à·“ලකයන් සඳහ෠බà·à·„à·’à¶» ආචයනය වෙත පිවිසීමට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_cache_filesystem" msgid="5656487264819669824">"à·„à·à¶¹à·’ලි ගොනු පද්ධතියට à¶´à·Šâ€à¶»à·€à·šà· වීම"</string>
+ <string name="permdesc_cache_filesystem" msgid="5578967642265550955">"à·„à·à¶¹à·’ලි ගොනු පද්ධති කියවීමට සහ ලිවීමට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_use_sip" msgid="5986952362795870502">"අන්තර්ජà·à¶½ ඇමතුම් ගන්න/ලබන්න"</string>
+ <string name="permdesc_use_sip" msgid="4717632000062674294">"අන්තර්ජà·à¶½ ඇමතුම් à¶œà·à¶±à·“මට/à¶½à·à¶¶à·“මට SIP සේවà·à·€ à¶·à·à·€à·’තයට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"ඉතිහà·à·ƒà¶œà¶­ à¶¢à·à¶½ à¶·à·à·€à·’තය කියවන්න"</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"විà·à·šà·‚à·’à¶­ à¶¢à·à¶½ සහ යෙදුම් සඳහ෠ඉතිහà·à·ƒà¶œà¶­ à¶¢à·à¶½ à¶·à·à·€à·’තය කියවීමට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"à¶¢à·à¶½ à¶´à·Šâ€à¶»à¶­à·’පත්තිය කළමනà·à¶šà¶»à¶«à¶º කිරීම"</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"à¶¢à·à¶½ කොන්දේසි සහ සඳහන් යෙදුම් විà·à·šà·‚à·“à¶­ රීති කළමනà·à¶šà¶»à¶«à¶º කිරීමට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"à¶¢à·à¶½ à¶·à·à·€à·’à¶­ ගිණුම් කිරීම වෙනස් කිරීම"</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"යෙදුම්වලට à¶¢à·à¶½ à¶·à·à·€à·’තයෙන් වන බලපෑම කෙසේද යන්න වෙනස් කිරීමට යෙදුමට අවසර දෙන්න. à·ƒà·à¶¸à·à¶±à·Šâ€à¶º යෙදුම්වල à¶·à·à·€à·’තය සඳහ෠නොවේ."</string>
+ <string name="permlab_markNetworkSocket" msgid="3658527214914959749">"කෙවෙනි ලකුණු වෙනස් කරන්න"</string>
+ <string name="permdesc_markNetworkSocket" msgid="7655568433696356578">"මà·à¶»à·Šà¶œà¶œà¶­ වීම සඳහ෠කෙවෙනියේ ලකුණු වෙනස් කිරීමට යෙදුමට ඉඩ දෙන්න"</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"à¶´à·Šâ€à¶»à·€à·šà· දà·à¶±à·”ම්දීම්"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"වෙනත් යෙදුම් විසින් à¶šà·… à¶´à¶½ කිරීම්ද ඇතුළත්ව දà·à¶±à·Šà·€à·“ම් ලබ෠ගà·à¶±à·“මට, පරීක්ෂ෠කිරීමට සහ හිස් කිරීමට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"දà·à¶±à·”ම්දීම ඇහුම්කන් දීම් සේවà·à·€à¶šà·Š වෙත බඳින්න"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"දà·à¶±à·”ම්දීම් අසන්නà·à¶œà·š සේවà·à·€à·š ඉහළ මට්ටමේ අතුරුමුහුණතට à¶¶à·à¶³à·“මට දරන්නà·à¶§ අවසර දේ. à·ƒà·à¶¸à·à¶±à·Šâ€à¶º යෙදුම් සඳහ෠කිසිසේත් à¶…à·€à·à·Šâ€à¶º නොවේ."</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"à·€à·à·„කය à·ƒà·à¶´à¶ºà·” වින්â€à¶ºà·à·ƒà¶º යෙදුම ඉල්ල෠සිටින්න"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"à·€à·à·„කය෠ලබà·à¶¯à·”න් à·ƒà·à¶šà·ƒà·”ම් යෙදුම් à¶‹à¶­à·Šà¶´à·à¶¯à¶±à¶ºà¶§ à¶°à·à¶»à¶šà¶ºà·à¶§ අවසර දෙන්න. à·ƒà·à¶¸à·à¶±à·Šâ€à¶º යෙදුම් සඳහ෠කිසිද෠අවà·à·Šâ€à¶º නොවෙයි."</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"à¶¢à·à¶½ à¶­à¶­à·Šà·€ මත නිරීක්ෂණ වෙත ඇහුම්කන් දීම"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"යෙදුමකට à¶¢à·à¶½ à¶­à¶­à·Šà·€ මත නිරීක්ෂණ වෙත ඇහුම්කන් දීමට අවසර දේ. à·ƒà·à¶¸à·à¶±à·Šâ€à¶º යෙදුම් සඳහ෠කිසිද෠අවà·à·Šâ€à¶º නොවේ."</string>
+ <string name="policylab_limitPassword" msgid="4497420728857585791">"මුරපද නීති සකස් කිරීම"</string>
+ <string name="policydesc_limitPassword" msgid="3252114203919510394">"තිරය අගුළු ඇරීමේ මුරපදයට අනුමත අකුරු සහ දිග à¶´à·à¶½à¶±à¶º කරන්න."</string>
+ <string name="policylab_watchLogin" msgid="914130646942199503">"තිරය අගුළු ඇරීමේ à¶‹à¶­à·Šà·ƒà·à·„යන් නිරීක්ෂණය කරන්න"</string>
+ <string name="policydesc_watchLogin" product="tablet" msgid="3215729294215070072">"තිරය අගුළු à·„à·à¶»à·“මේදී à·€à·à¶»à¶¯à·’යට ටයිප් à¶šà·… මුරපද ගණන නිරීක්ෂණය කරන්න සහ à¶§à·à¶¶à·Šà¶½à¶§à¶º අගුළු දමන්න à·„à· à·€à·à¶»à¶¯à·’ මුරපද බොහ෠ගණනක් ටයිප් à¶šà¶» ඇති නම් à¶§à·à¶¶à·Šà¶½à¶§à¶ºà·š සියලු දත්ත මකන්න."</string>
+ <string name="policydesc_watchLogin" product="default" msgid="5712323091846761073">"තිරය අගුළු à·„à·à¶»à·“මේදී à·€à·à¶»à¶¯à·’යට ටයිප් à¶šà·… මුරපද ගණන නිරීක්ෂණය කරන්න සහ දුරකථනය අගුළු දමන්න à·„à· à·€à·à¶»à¶¯à·’ මුරපද බොහ෠ගණනක් ටයිප් à¶šà¶» ඇති නම් දුරකථනයේ සියලු දත්ත මකන්න."</string>
+ <string name="policylab_resetPassword" msgid="2620077191242688955">"තිරය අගුළු ඇරීමේ මුරපදය වෙනස් කිරීම"</string>
+ <string name="policydesc_resetPassword" msgid="605963962301904458">"තිරය අගුළු ඇරීමේ මුරපදය වෙනස් කරන්න."</string>
+ <string name="policylab_forceLock" msgid="2274085384704248431">"තිරය අගුළු දà·à¶¸à·“ම"</string>
+ <string name="policydesc_forceLock" msgid="1141797588403827138">"තිරයට අගුළු à·€à·à¶§à·“ම සිදුවන්නේ කෙසේද සහ කවදà·à¶¯ යන්න à¶´à·à¶½à¶±à¶º කරන්න."</string>
+ <string name="policylab_wipeData" msgid="3910545446758639713">"සියලු දත්ත මකන්න"</string>
+ <string name="policydesc_wipeData" product="tablet" msgid="4306184096067756876">"කර්මà·à¶±à·Šà¶­ à·à·à¶½à· දත්ත යළි පිහිටුවීමෙන් පසුව අනතුරු ඇඟවිමකින් තොරවම à¶§à·à¶¶à·Šà¶½à¶§à·Š දත්ත මක෠දමයි."</string>
+ <string name="policydesc_wipeData" product="default" msgid="5096895604574188391">"කර්මà·à¶±à·Šà¶­ à·à·à¶½à· දත්ත යළි පිහිටුවීමෙන් පසුව අනතුරු ඇඟවිමකින් තොරවම දුරකථන දත්ත මක෠දමයි."</string>
+ <string name="policylab_setGlobalProxy" msgid="2784828293747791446">"à¶‹à¶´à·à¶‚à¶œ à¶œà·à¶½à·“ය නියුතුව සකස් කිරීම"</string>
+ <string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"කොන්දේසි සක්â€à¶»à·’ය විට පොදු නියුතු à¶‘à¶šà¶šà·Š à¶·à·à·€à·’à¶­ කරන ලෙස à¶‹à¶´à·à¶‚ගය සකසන්න. පළමු à¶‹à¶´à·à¶‚à¶œ පරිපà·à¶½à¶šà¶ºà· පමණක් ඵලදà·à¶ºà·’ පොදු නියුතුව සකසයි."</string>
+ <string name="policylab_expirePassword" msgid="885279151847254056">"තිරය අගුළු දà·à¶¸à·“මේ මුරපදය කල් ඉකුත්වීම සකසන්න"</string>
+ <string name="policydesc_expirePassword" msgid="1729725226314691591">"à¶­à·’à¶»-අගුළේ මුරපදය වෙනස්වීම කොපමණ à¶šà·à¶½ à¶´à¶»à·à·ƒà¶ºà¶šà·’න් සිදුවිය යුතුද යන්න à¶´à·à¶½à¶±à¶º කිරීම."</string>
+ <string name="policylab_encryptedStorage" msgid="8901326199909132915">"ආචයනයේ සංකේතනය සකස් කිරීම"</string>
+ <string name="policydesc_encryptedStorage" msgid="2637732115325316992">"ආචයනය à¶šà·… යෙදුම් දත්ත සංකේතනය කිරීමට à¶…à·€à·à·Šâ€à¶ºà¶º."</string>
+ <string name="policylab_disableCamera" msgid="6395301023152297826">"à¶šà·à¶¸à¶»à· à¶…à¶¶à¶½ කිරීම"</string>
+ <string name="policydesc_disableCamera" msgid="2306349042834754597">"සියලු à¶‹à¶´à·à¶‚à¶œ à¶šà·à¶¸à¶»à·à·€à¶½ à¶·à·à·€à·’තය වලක්වන්න."</string>
+ <string name="policylab_disableKeyguardFeatures" msgid="266329104542638802">"යතුරු ආරක්ෂà·à·€à·š විà·à·šà·‚à·à¶‚à¶œ à¶…à¶¶à¶½ කරන්න"</string>
+ <string name="policydesc_disableKeyguardFeatures" msgid="3467082272186534614">"යතුරු ආරක්ෂà·à·€ à·„à·’ සමහර විà·à·šà·‚à·à¶‚à¶œ à¶·à·à·€à·’තය වළක්වයි."</string>
+ <string-array name="phoneTypes">
+ <item msgid="8901098336658710359">"නිවස"</item>
+ <item msgid="869923650527136615">"ජංගම"</item>
+ <item msgid="7897544654242874543">"à¶šà·à¶»à·Šà¶ºà·à¶½à¶º"</item>
+ <item msgid="1103601433382158155">"à¶šà·à¶»à·Šà¶ºà·à¶½ à·†à·à¶šà·Šà·ƒà·Š"</item>
+ <item msgid="1735177144948329370">"නිවසේ à·†à·à¶šà·Šà·ƒà·Š"</item>
+ <item msgid="603878674477207394">"පේජරය"</item>
+ <item msgid="1650824275177931637">"වෙනත්"</item>
+ <item msgid="9192514806975898961">"අභිරුචි"</item>
+ </string-array>
+ <string-array name="emailAddressTypes">
+ <item msgid="8073994352956129127">"මුල් පිටුව"</item>
+ <item msgid="7084237356602625604">"à¶šà·à¶»à·Šà¶ºà·à¶½à¶º"</item>
+ <item msgid="1112044410659011023">"වෙනත්"</item>
+ <item msgid="2374913952870110618">"අභිරුචි"</item>
+ </string-array>
+ <string-array name="postalAddressTypes">
+ <item msgid="6880257626740047286">"නිවස"</item>
+ <item msgid="5629153956045109251">"à¶šà·à¶»à·Šà¶ºà·à¶½à¶º"</item>
+ <item msgid="4966604264500343469">"වෙනත්"</item>
+ <item msgid="4932682847595299369">"අභිරුචි"</item>
+ </string-array>
+ <string-array name="imAddressTypes">
+ <item msgid="1738585194601476694">"නිවස"</item>
+ <item msgid="1359644565647383708">"à¶šà·à¶»à·Šà¶ºà·à¶½à¶º"</item>
+ <item msgid="7868549401053615677">"වෙනත්"</item>
+ <item msgid="3145118944639869809">"අභිරුචි"</item>
+ </string-array>
+ <string-array name="organizationTypes">
+ <item msgid="7546335612189115615">"à¶šà·à¶»à·Šà¶ºà·à¶½à¶º"</item>
+ <item msgid="4378074129049520373">"වෙනත්"</item>
+ <item msgid="3455047468583965104">"අභිරුචි"</item>
+ </string-array>
+ <string-array name="imProtocols">
+ <item msgid="8595261363518459565">"AIM"</item>
+ <item msgid="7390473628275490700">"Windows Live"</item>
+ <item msgid="7882877134931458217">"Yahoo"</item>
+ <item msgid="5035376313200585242">"Skype"</item>
+ <item msgid="7532363178459444943">"QQ"</item>
+ <item msgid="3713441034299660749">"Google Talk"</item>
+ <item msgid="2506857312718630823">"ICQ"</item>
+ <item msgid="1648797903785279353">"Jabber"</item>
+ </string-array>
+ <string name="phoneTypeCustom" msgid="1644738059053355820">"අභිරුචි"</string>
+ <string name="phoneTypeHome" msgid="2570923463033985887">"නිවස"</string>
+ <string name="phoneTypeMobile" msgid="6501463557754751037">"ජංගම"</string>
+ <string name="phoneTypeWork" msgid="8863939667059911633">"à¶šà·à¶»à·Šà¶ºà·à¶½à¶º"</string>
+ <string name="phoneTypeFaxWork" msgid="3517792160008890912">"à¶šà·à¶»à·Šà¶ºà·à¶½ à·†à·à¶šà·Šà·ƒà·Š"</string>
+ <string name="phoneTypeFaxHome" msgid="2067265972322971467">"නිවසේ à·†à·à¶šà·Šà·ƒà·Š"</string>
+ <string name="phoneTypePager" msgid="7582359955394921732">"පේජරය"</string>
+ <string name="phoneTypeOther" msgid="1544425847868765990">"වෙනත්"</string>
+ <string name="phoneTypeCallback" msgid="2712175203065678206">"යළි ඇමතීම"</string>
+ <string name="phoneTypeCar" msgid="8738360689616716982">"මà·à¶§à¶»à·Š රථය"</string>
+ <string name="phoneTypeCompanyMain" msgid="540434356461478916">"ආයතනයේ මූලිකය"</string>
+ <string name="phoneTypeIsdn" msgid="8022453193171370337">"ISDN"</string>
+ <string name="phoneTypeMain" msgid="6766137010628326916">"මූලික"</string>
+ <string name="phoneTypeOtherFax" msgid="8587657145072446565">"වෙනත් à·†à·à¶šà·Šà·ƒà·Š"</string>
+ <string name="phoneTypeRadio" msgid="4093738079908667513">"රේඩියà·à·€"</string>
+ <string name="phoneTypeTelex" msgid="3367879952476250512">"ටෙලෙක්ස්"</string>
+ <string name="phoneTypeTtyTdd" msgid="8606514378585000044">"TTY TDD"</string>
+ <string name="phoneTypeWorkMobile" msgid="1311426989184065709">"à¶šà·à¶»à·Šà¶ºà·à¶½ ජංගම"</string>
+ <string name="phoneTypeWorkPager" msgid="649938731231157056">"à¶šà·à¶»à·Šà¶ºà·à¶½ පේජරය"</string>
+ <string name="phoneTypeAssistant" msgid="5596772636128562884">"සහà·à¶ºà¶š"</string>
+ <string name="phoneTypeMms" msgid="7254492275502768992">"MMS"</string>
+ <string name="eventTypeCustom" msgid="7837586198458073404">"අභිරුචි"</string>
+ <string name="eventTypeBirthday" msgid="2813379844211390740">"උපන්දිනය"</string>
+ <string name="eventTypeAnniversary" msgid="3876779744518284000">"සංවත්සරය"</string>
+ <string name="eventTypeOther" msgid="7388178939010143077">"වෙනත්"</string>
+ <string name="emailTypeCustom" msgid="8525960257804213846">"අභිරුචි"</string>
+ <string name="emailTypeHome" msgid="449227236140433919">"නිවස"</string>
+ <string name="emailTypeWork" msgid="3548058059601149973">"à¶šà·à¶»à·Šà¶ºà·à¶½à¶º"</string>
+ <string name="emailTypeOther" msgid="2923008695272639549">"වෙනත්"</string>
+ <string name="emailTypeMobile" msgid="119919005321166205">"ජංගම"</string>
+ <string name="postalTypeCustom" msgid="8903206903060479902">"අභිරුචි"</string>
+ <string name="postalTypeHome" msgid="8165756977184483097">"නිවස"</string>
+ <string name="postalTypeWork" msgid="5268172772387694495">"à¶šà·à¶»à·Šà¶ºà·à¶½à¶º"</string>
+ <string name="postalTypeOther" msgid="2726111966623584341">"වෙනත්"</string>
+ <string name="imTypeCustom" msgid="2074028755527826046">"අභිරුචි"</string>
+ <string name="imTypeHome" msgid="6241181032954263892">"මුල් පිටුව"</string>
+ <string name="imTypeWork" msgid="1371489290242433090">"à¶šà·à¶»à·Šà¶ºà·à¶½à¶º"</string>
+ <string name="imTypeOther" msgid="5377007495735915478">"වෙනත්"</string>
+ <string name="imProtocolCustom" msgid="6919453836618749992">"අභිරුචි"</string>
+ <string name="imProtocolAim" msgid="7050360612368383417">"AIM"</string>
+ <string name="imProtocolMsn" msgid="144556545420769442">"Windows Live"</string>
+ <string name="imProtocolYahoo" msgid="8271439408469021273">"Yahoo"</string>
+ <string name="imProtocolSkype" msgid="9019296744622832951">"Skype"</string>
+ <string name="imProtocolQq" msgid="8887484379494111884">"QQ"</string>
+ <string name="imProtocolGoogleTalk" msgid="493902321140277304">"Hangouts"</string>
+ <string name="imProtocolIcq" msgid="1574870433606517315">"ICQ"</string>
+ <string name="imProtocolJabber" msgid="2279917630875771722">"Jabber"</string>
+ <string name="imProtocolNetMeeting" msgid="8287625655986827971">"NetMeeting"</string>
+ <string name="orgTypeWork" msgid="29268870505363872">"à¶šà·à¶»à·Šà¶ºà·à¶½à¶º"</string>
+ <string name="orgTypeOther" msgid="3951781131570124082">"වෙනත්"</string>
+ <string name="orgTypeCustom" msgid="225523415372088322">"අභිරුචි"</string>
+ <string name="relationTypeCustom" msgid="3542403679827297300">"අභිරුචි"</string>
+ <string name="relationTypeAssistant" msgid="6274334825195379076">"සහà·à¶ºà¶š"</string>
+ <string name="relationTypeBrother" msgid="8757913506784067713">"සහà·à¶¯à¶»à¶ºà·"</string>
+ <string name="relationTypeChild" msgid="1890746277276881626">"දරුවà·"</string>
+ <string name="relationTypeDomesticPartner" msgid="6904807112121122133">"දේà·à·“ය හවුල්කරුවà·"</string>
+ <string name="relationTypeFather" msgid="5228034687082050725">"පියà·"</string>
+ <string name="relationTypeFriend" msgid="7313106762483391262">"මිත්â€à¶»à¶ºà·"</string>
+ <string name="relationTypeManager" msgid="6365677861610137895">"කළමනà·à¶šà¶»à·”"</string>
+ <string name="relationTypeMother" msgid="4578571352962758304">"මව"</string>
+ <string name="relationTypeParent" msgid="4755635567562925226">"මව්පිය"</string>
+ <string name="relationTypePartner" msgid="7266490285120262781">"හවුල්කරුවà·"</string>
+ <string name="relationTypeReferredBy" msgid="101573059844135524">"යොමුකරන ලද්දේ"</string>
+ <string name="relationTypeRelative" msgid="1799819930085610271">"නෑයà·"</string>
+ <string name="relationTypeSister" msgid="1735983554479076481">"සහà·à¶¯à¶»à·’ය"</string>
+ <string name="relationTypeSpouse" msgid="394136939428698117">"à¶·à·à¶»à·Šà¶ºà·à·€ හ෠ස්වà·à¶¸à·’පුරුෂයà·"</string>
+ <string name="sipAddressTypeCustom" msgid="2473580593111590945">"අභිරුචි"</string>
+ <string name="sipAddressTypeHome" msgid="6093598181069359295">"නිවස"</string>
+ <string name="sipAddressTypeWork" msgid="6920725730797099047">"à¶šà·à¶»à·Šà¶ºà·à¶½à¶º"</string>
+ <string name="sipAddressTypeOther" msgid="4408436162950119849">"වෙනත්"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"PIN කේතය ටයිප් කරන්න"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"PUK සහ නව PIN කේතය ටයිප් කරන්න"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"PUK කේතය"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"නව PIN කේතය"</string>
+ <string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"මුරපදය ටයිප් කිරීමට ස්පර්෠කරන්න"</font></string>
+ <string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"අගුළු ඇරීමට මුරපදය ටයිප් කරන්න"</string>
+ <string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"අගුළු à·„à·à¶»à·“මට PIN à¶‘à¶š ටයිප් කරන්න"</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"à·€à·à¶»à¶¯à·’ PIN කේතයකි."</string>
+ <string name="keyguard_label_text" msgid="861796461028298424">"අගුළු ඇරීමට, මෙනුව ඔබ෠පසුව 0 ද ඔබන්න."</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"හදිසි ඇමතුම් අංකය"</string>
+ <string name="lockscreen_carrier_default" msgid="8963839242565653192">"සේවà·à·€ à¶±à·à¶­."</string>
+ <string name="lockscreen_screen_locked" msgid="7288443074806832904">"තිරය අගුළු දම෠ඇත."</string>
+ <string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"අගුළු à·„à·à¶»à·“මට මෙනුව ඔබන්න හ෠හදිසි ඇමතුම ලබà·à¶œà¶±à·Šà¶±."</string>
+ <string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"අගුළු à·„à·à¶»à·“මට මෙනු ඔබන්න."</string>
+ <string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"අගුළු ඇරීමට රටà·à·€ අඳින්න"</string>
+ <string name="lockscreen_emergency_call" msgid="5347633784401285225">"හදිසි ඇමතුම්"</string>
+ <string name="lockscreen_return_to_call" msgid="5244259785500040021">"ඇමතුම වෙත à¶±à·à·€à¶­ යන්න"</string>
+ <string name="lockscreen_pattern_correct" msgid="9039008650362261237">"නිවà·à¶»à¶¯à·’යි!"</string>
+ <string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"à¶±à·à·€à¶­ à¶‹à¶­à·Šà·ƒà·à·„ කරන්න"</string>
+ <string name="lockscreen_password_wrong" msgid="5737815393253165301">"à¶±à·à·€à¶­ à¶‹à¶­à·Šà·ƒà·à·„ කරන්න"</string>
+ <string name="faceunlock_multiple_failures" msgid="754137583022792429">"මුහුණ à¶·à·à·€à·’තයෙන් අඟුළු à·„à·à¶»à·“මේ උපරිම à¶´à·Šâ€à¶»à¶ºà¶±à·Šà¶­à¶ºà¶±à·Š ගණන ඉක්මව෠ඇත"</string>
+ <string name="lockscreen_plugged_in" msgid="8057762828355572315">"ආරà·à¶´à¶«à¶º වෙමින්, <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+ <string name="lockscreen_charged" msgid="321635745684060624">"à¶…à¶»à·à¶´à·’තයි"</string>
+ <string name="lockscreen_battery_short" msgid="4477264849386850266">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+ <string name="lockscreen_low_battery" msgid="1482873981919249740">"ඔබගේ ආරà·à¶´à¶šà¶ºà¶§ සම්බන්ධ කරන්න."</string>
+ <string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"SIM à¶´à¶­ à¶±à·à¶­"</string>
+ <string name="lockscreen_missing_sim_message" product="tablet" msgid="151659196095791474">"à¶§à·à¶¶à·Šà¶½à¶§à¶ºà·š SIM à¶´à¶­ නොමà·à¶­."</string>
+ <string name="lockscreen_missing_sim_message" product="default" msgid="2186920585695169078">"දුරකථනය තුළ SIM à¶´à¶­ à¶±à·à¶­."</string>
+ <string name="lockscreen_missing_sim_instructions" msgid="5372787138023272615">"SIM පතක් ඇතුල් කරන්න."</string>
+ <string name="lockscreen_missing_sim_instructions_long" msgid="3526573099019319472">"SIM à¶´à¶­ නොමà·à¶­ හ෠කියවිය නොහà·à¶š. SIM à¶´à¶­à¶šà·Š ඇතුලත් කරන්න."</string>
+ <string name="lockscreen_permanent_disabled_sim_message_short" msgid="5096149665138916184">"à¶·à·à·€à·’à¶­à· à¶šà·… නොහà·à¶šà·’ SIM à¶´à¶­."</string>
+ <string name="lockscreen_permanent_disabled_sim_instructions" msgid="910904643433151371">"ඔබගේ SIM à¶´à¶­ ස්ථිරව à¶…à¶¶à¶½ à¶šà¶» à¶­à·’à¶¶à·š.\n වෙනත් SIM à¶´à¶­à¶šà·Š සඳහ෠ඔබගේ සේවà·à¶¯à·à¶ºà¶šà¶ºà· සම්බන්ධ කරගන්න."</string>
+ <string name="lockscreen_transport_prev_description" msgid="201594905152746886">"පෙර ගීත බොත්තම"</string>
+ <string name="lockscreen_transport_next_description" msgid="6089297650481292363">"ඊළඟ ගීත බොත්තම"</string>
+ <string name="lockscreen_transport_pause_description" msgid="7659088786780128001">"විරà·à¶¸ බොත්තම"</string>
+ <string name="lockscreen_transport_play_description" msgid="5888422938351019426">"à¶°à·à·€à¶š බොත්තම"</string>
+ <string name="lockscreen_transport_stop_description" msgid="4562318378766987601">"à¶±à·à·€à¶­à·“මේ බොත්තම"</string>
+ <string name="emergency_calls_only" msgid="6733978304386365407">"හදිසි ඇමතුම් පමණි"</string>
+ <string name="lockscreen_network_locked_message" msgid="143389224986028501">"à¶¢à·à¶½à¶º අගුළු දම෠ඇත"</string>
+ <string name="lockscreen_sim_puk_locked_message" msgid="7441797339976230">"SIM පත PUK අගුළු දම෠ඇත."</string>
+ <string name="lockscreen_sim_puk_locked_instructions" msgid="8127916255245181063">"පරිà·à·“ලක උපදේà·à¶º බලන්න හ෠පරිභà·à¶œà·’à¶š සේවà·à·€ අමතන්න."</string>
+ <string name="lockscreen_sim_locked_message" msgid="8066660129206001039">"SIM පත අගුළු දම෠ඇත."</string>
+ <string name="lockscreen_sim_unlock_progress_dialog_message" msgid="595323214052881264">"SIM පත අගුළු අරිමින්..."</string>
+ <string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="6481623830344107222">"ඔබ <xliff:g id="NUMBER_0">%d</xliff:g> à·€à·à¶»à¶ºà¶šà·Š අගුළු ඇරීමේ රටà·à·€ à·€à·à¶»à¶¯à·’යට ඇඳ ඇත. \n\nà¶­à¶­à·Šà¶´à¶» <xliff:g id="NUMBER_1">%d</xliff:g> à¶šà·Š ඇතුළත à¶±à·à·€à¶­ à¶‹à¶­à·Šà·ƒà·à·„ කරන්න."</string>
+ <string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="2725973286239344555">"ඔබ මුරපදය à·€à·à¶» <xliff:g id="NUMBER_0">%d</xliff:g> à¶šà·Š à·€à·à¶»à¶¯à·’යට ටයිප්කොට ඇත. \n\nà¶­à¶­à·Šà¶´à¶» <xliff:g id="NUMBER_1">%d</xliff:g> කින් à¶±à·à·€à¶­ උත්සහ කරන්න."</string>
+ <string name="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="6216672706545696955">"ඔබ PIN අංකය <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" product="tablet" msgid="9191611984625460820">"ඔබ à·€à·à¶»à¶¯à·’යට <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_failed_attempts_almost_glogin" product="default" msgid="2590227559763762751">"ඔබ à·€à·à¶»à¶¯à·’යට <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_failed_attempts_almost_at_wipe" product="tablet" msgid="6128106399745755604">"ඔබ à¶§à·à¶¶à·Šà¶½à¶§à¶º අගුළු à·„à·à¶»à·“මට à·€à·à¶»à¶¯à·’යට අවස්ථ෠<xliff:g id="NUMBER_0">%d</xliff:g> à¶šà·Š à¶‹à¶­à·Šà·ƒà·à·„ à¶šà¶» ඇත. අවස්ථ෠<xliff:g id="NUMBER_1">%d</xliff:g> à¶šà·Š à¶…à·ƒà·à¶»à·Šà¶®à¶šà·€ උත්සහ කිරීමකින් පසුව, à¶§à·à¶¶à·Šà¶½à¶§à¶º කර්මà·à¶±à·Šà¶­ à·à·à¶½à· මුල් තත්වයට à¶±à·à·€à¶­ à¶´à¶­à·Š වන à¶…à¶­à¶» සියලු පරිà·à·“ලක දත්ත à¶±à·à¶­à·’ වෙයි."</string>
+ <string name="lockscreen_failed_attempts_almost_at_wipe" product="default" msgid="8603565142156826565">"ඔබ දුරකථනය අගුළු ඇරීමට à·€à·à¶» <xliff:g id="NUMBER_0">%d</xliff:g> කදී à·€à·à¶»à¶¯à·“ à¶´à·Šâ€à¶»à¶ºà¶­à·Šà¶±à¶ºà¶±à·Š ගෙන à¶­à·’à¶¶à·š. තවත් à¶…à·ƒà·à¶»à·Šà¶®à¶š à¶´à·Šâ€à¶»à¶ºà¶­à·Šà¶± <xliff:g id="NUMBER_1">%d</xliff:g> කින් පසුව, දුරකථනය කර්මà·à¶±à·Šà¶­à·à·à¶½à·à·€à·š පෙරනිමියට යළි පිහිටුවන à¶…à¶­à¶» සියලුම පරිà·à·“ලක දත්ත à¶±à·à¶­à·’ වී යයි."</string>
+ <string name="lockscreen_failed_attempts_now_wiping" product="tablet" msgid="280873516493934365">"à¶§à·à¶¶à·Šà¶½à¶§à¶ºà·š අගුළු ඇරීමට ඔබ à·€à·à¶»à¶¯à·’ à¶´à·Šâ€à¶»à¶ºà¶­à·Šà¶± <xliff:g id="NUMBER">%d</xliff:g> à·€à·à¶»à¶ºà¶šà·Š ගෙන ඇත. දà·à¶±à·Š à¶§à·à¶¶à·Šà¶½à¶§à¶º කර්මà·à¶±à·Šà¶­à·à·à¶½à· සුපුරුද්ද වෙත යළි පිහිටුවීම කෙරේ."</string>
+ <string name="lockscreen_failed_attempts_now_wiping" product="default" msgid="3025504721764922246">"ඔබ දුරකථනය අගුළු ඇරීමට à·€à·à¶» <xliff:g id="NUMBER">%d</xliff:g> කදී à·€à·à¶»à¶¯à·“ à¶´à·Šâ€à¶»à¶ºà¶­à·Šà¶±à¶ºà¶±à·Š ගෙන à¶­à·’à¶¶à·š. දà·à¶±à·Š දුරකථනය කර්මà·à¶±à·Šà¶­à·à·à¶½à· පෙරනිමියට පිහිටුවනු ලබයි."</string>
+ <string name="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"à¶­à¶­à·Šà¶´à¶» <xliff:g id="NUMBER">%d</xliff:g> කින් à¶±à·à·€à¶­ à¶‹à¶­à·Šà·ƒà·à·„ කරන්න."</string>
+ <string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"රටà·à·€ අමතකද?"</string>
+ <string name="lockscreen_glogin_forgot_pattern" msgid="2588521501166032747">"ගිණුමේ අගුළු අරින්න"</string>
+ <string name="lockscreen_glogin_too_many_attempts" msgid="2751368605287288808">"රට෠උත්සà·à·„ කිරීම් à·€à·à¶©à·’ය"</string>
+ <string name="lockscreen_glogin_instructions" msgid="3931816256100707784">"අගුළු à·„à·à¶»à·“මට, ඔබගේ Google ගිණුම සමග පුරනය වන්න."</string>
+ <string name="lockscreen_glogin_username_hint" msgid="8846881424106484447">"පරිà·à·“ලක à¶±à·à¶¸à¶º (à¶Š-à¶­à·à¶´à·‘à¶½)"</string>
+ <string name="lockscreen_glogin_password_hint" msgid="5958028383954738528">"මුරපදය"</string>
+ <string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"පුරනය වෙන්න"</string>
+ <string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"වලංගු නොවන පරිà·à·“ලක à¶±à·à¶¸à¶ºà¶šà·Š හ෠මුරපදයක්."</string>
+ <string name="lockscreen_glogin_account_recovery_hint" msgid="1696924763690379073">"ඔබගේ පරිà·à·“ලක à¶±à·à¶¸à¶º හ෠මුරපදය අමතකද?\n "<b>"google.com/accounts/recovery"</b>" වෙත යන්න."</string>
+ <string name="lockscreen_glogin_checking_password" msgid="7114627351286933867">"පරික්ෂ෠කරමින්..."</string>
+ <string name="lockscreen_unlock_label" msgid="737440483220667054">"අඟුල අරින්න"</string>
+ <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"à·à¶¶à·Šà¶¯à¶º සක්â€à¶»à·“ය කරන්න"</string>
+ <string name="lockscreen_sound_off_label" msgid="996822825154319026">"à·à·Šâ€à¶»à·€à·Šâ€à¶º à¶…à¶šà·Šâ€à¶»à·’ය කරන්න"</string>
+ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"රටà·à·€ අරඹන ලදි"</string>
+ <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"රටà·à·€ හිස් කරන ලදි"</string>
+ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"කොටුවක් එකතු කරන ලදි"</string>
+ <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"රටà·à·€ සම්පූර්ණයි"</string>
+ <!-- String.format failed for translation -->
+ <!-- no translation found for keyguard_accessibility_widget_changed (5678624624681400191) -->
+ <skip />
+ <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"විජටය එකතු කරන්න."</string>
+ <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"හිස්"</string>
+ <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"අගුළු අරින à¶´à·Šâ€à¶»à¶¯à·šà·à¶º විදහ෠ඇත."</string>
+ <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"අගුළු අරින à¶´à·Šâ€à¶»à¶¯à·šà·à¶º à·„à·à¶šà·’ලී ඇත."</string>
+ <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> විජට්."</string>
+ <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"පරිà·à·“ලක à¶­à·à¶»à¶±à·Šà¶±à·"</string>
+ <string name="keyguard_accessibility_status" msgid="8008264603935930611">"තත්වය"</string>
+ <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"à¶šà·à¶¸à¶»à·à·€"</string>
+ <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"මà·à¶°à·Šâ€à¶º à¶´à·à¶½à¶š"</string>
+ <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"විජටය à¶±à·à·€à¶­ අනුපිළිවෙළට à·ƒà·à¶šà·ƒà·’ම ඇරඹුණි."</string>
+ <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"විජට් à¶±à·à·€à¶­ අනුපිළිවෙලට à·ƒà·à¶šà·ƒà·“ම අවසà·à¶±à¶º."</string>
+ <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> විජටය මà·à¶šà·“ ඇත."</string>
+ <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"අගුළු නොදà·à¶¸à·– à¶´à·Šâ€à¶»à¶¯à·šà·à¶º පුළුල් කරන්න."</string>
+ <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"සර්පණ අගුළු ඇරීම."</string>
+ <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"රට෠අගුළු ඇරීම."</string>
+ <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"මුහුණ à¶·à·à·€à·’තයෙන් අඟුළු à·„à·à¶»à·“ම."</string>
+ <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"PIN අගුළු ඇරීම."</string>
+ <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"මුරපද අගුළු ඇරීම."</string>
+ <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"රට෠ප්â€à¶»à¶¯à·šà·à¶º."</string>
+ <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"සර්පණ à¶´à·Šâ€à¶»à¶¯à·šà·à¶º."</string>
+ <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
+ <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
+ <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
+ <string name="granularity_label_character" msgid="7336470535385009523">"අක්ෂරය"</string>
+ <string name="granularity_label_word" msgid="7075570328374918660">"වචනය"</string>
+ <string name="granularity_label_link" msgid="5815508880782488267">"සබà·à¶³à·’ය"</string>
+ <string name="granularity_label_line" msgid="5764267235026120888">"රේඛà·à·€"</string>
+ <string name="hour_ampm" msgid="4584338083529355982">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
+ <string name="hour_cap_ampm" msgid="2083465992940444366">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
+ <string name="factorytest_failed" msgid="5410270329114212041">"කර්මà·à¶±à·Šà¶­ à·à·à¶½à· පරීක්ෂණය à¶…à·ƒà·à¶»à·Šà¶®à¶šà¶ºà·’"</string>
+ <string name="factorytest_not_system" msgid="4435201656767276723">"FACTORY_TEST à¶šà·Šâ€à¶»à·’යà·à·€ /system/app à·„à·’ ස්ථà·à¶´à·’à¶­ à¶´à·à¶šà·šà¶¢ සඳහ෠පමණක් සහය දක්වයි."</string>
+ <string name="factorytest_no_action" msgid="872991874799998561">"FACTORY_TEST à¶šà·Šâ€à¶»à·’යà·à·€ ලබà·à¶¯à·™à¶± à¶´à·à¶šà·šà¶¢à¶ºà¶šà·Š සොයà·à¶œà¶­ නොහà·à¶šà·’ විය."</string>
+ <string name="factorytest_reboot" msgid="6320168203050791643">"පුනරà·à¶»à¶¸à·Šà¶· කරන්න"</string>
+ <string name="js_dialog_title" msgid="1987483977834603872">"\"<xliff:g id="TITLE">%s</xliff:g>\" හි ඇති පිටුව කියන්නේ:"</string>
+ <string name="js_dialog_title_default" msgid="6961903213729667573">"à¶¢à·à·€à·à·ƒà·Šà¶šà·Šâ€à¶»à·’à¶´à·Šà¶§à·Š"</string>
+ <string name="js_dialog_before_unload_title" msgid="2619376555525116593">"සංචලනය තහවුරු කරන්න"</string>
+ <string name="js_dialog_before_unload_positive_button" msgid="3112752010600484130">"මෙම පිටුවෙන් ඉවත් වන්න"</string>
+ <string name="js_dialog_before_unload_negative_button" msgid="5614861293026099715">"මෙම පිටුවෙහි ඉන්න"</string>
+ <string name="js_dialog_before_unload" msgid="3468816357095378590">"<xliff:g id="MESSAGE">%s</xliff:g>\n\nඔබට මෙම පිටුවෙන් සංචලනය කිරීමට à¶…à·€à·à·Šâ€à¶º බවට ඔබට විà·à·Šà·€à·à·ƒà¶¯?"</string>
+ <string name="save_password_label" msgid="6860261758665825069">"තහවුරු කරන්න"</string>
+ <string name="double_tap_toast" msgid="4595046515400268881">"උපදෙස: විà·à·à¶½à¶±à¶º කිරීමට සහ කුඩ෠කිරීමට දෙවරක් à¶­à¶§à·Šà¶§à·” කරන්න."</string>
+ <string name="autofill_this_form" msgid="4616758841157816676">"ස්වයංක්â€à¶»à·’ය පිරවුම"</string>
+ <string name="setup_autofill" msgid="7103495070180590814">"ස්වයංක්â€à¶»à·’ය පිරවුම සකසන්න"</string>
+ <string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
+ <string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
+ <string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
+ <string name="autofill_address_summary_format" msgid="4874459455786827344">"$1$2$3"</string>
+ <string name="autofill_province" msgid="2231806553863422300">"à¶´à·…à·à¶­"</string>
+ <string name="autofill_postal_code" msgid="4696430407689377108">"à¶­à·à¶´à·à¶½à·Š කේතය"</string>
+ <string name="autofill_state" msgid="6988894195520044613">"ජනපදය"</string>
+ <string name="autofill_zip_code" msgid="8697544592627322946">"ZIP කේතය"</string>
+ <string name="autofill_county" msgid="237073771020362891">"à¶´à·Šâ€à¶»à·à¶±à·Šà¶­à¶º"</string>
+ <string name="autofill_island" msgid="4020100875984667025">"දූපත"</string>
+ <string name="autofill_district" msgid="8400735073392267672">"දිස්ත්â€à¶»à·’ක්කය"</string>
+ <string name="autofill_department" msgid="5343279462564453309">"දෙපà·à¶»à·Šà¶­à¶¸à·šà¶±à·Šà¶­à·”à·€"</string>
+ <string name="autofill_prefecture" msgid="2028499485065800419">"à¶´à·Šâ€à¶»à·à¶±à·Šà¶­à¶º"</string>
+ <string name="autofill_parish" msgid="8202206105468820057">"à¶šà·à¶»à¶½à¶º"</string>
+ <string name="autofill_area" msgid="3547409050889952423">"à¶´à·Šâ€à¶»à¶¯à·šà·à¶º"</string>
+ <string name="autofill_emirate" msgid="2893880978835698818">"එමිරේට්"</string>
+ <string name="permlab_readHistoryBookmarks" msgid="3775265775405106983">"ඔබගේ වෙබ් පිටුසන් සහ ඉතිහà·à·ƒà¶º කියවීම"</string>
+ <string name="permdesc_readHistoryBookmarks" msgid="8462378226600439658">"à¶¶à·Šâ€à¶»à·€à·Šà·ƒà¶»à¶º à¶±à·à¶»à¶¹à·– සියලු URL සහ සියලු à¶¶à·Šâ€à¶»à·€à·Šà·ƒà¶» පිටුසන් වල ඉතිහà·à·ƒà¶º කියවීමට යෙදුමට අවසර දෙන්න. සටහන: වෙබ් à¶¶à·Šâ€à¶»à·€à·Šà·ƒà¶» à¶…à·€à·à·Šâ€à¶ºà¶­à· සමග තෙවෙනි à¶´à·à¶»à·Šà·à·€ à¶¶à·Šâ€à¶»à·€à·Šà·ƒà¶» වලට හ෠වෙනත් යෙදුම්වලට මෙම අවසරය à¶¶à¶½ නොදෙයි."</string>
+ <string name="permlab_writeHistoryBookmarks" msgid="3714785165273314490">"වෙබ් පිටුසන් සහ ඉතිහà·à·ƒà¶ºà¶§ ලිවිම"</string>
+ <string name="permdesc_writeHistoryBookmarks" product="tablet" msgid="6825527469145760922">"ඔබගේ à¶§à·à¶¶à·Šà¶½à¶§à¶ºà·š ගබඩ෠කර ඇති à¶¶à·Šâ€à¶»à·€à·Šà·ƒà¶»à¶ºà·š ඉතිහà·à·ƒà¶º හ෠පිටුසන් වෙනස් කිරීමට යෙදුමට අවසර දෙන්න. à¶¶à·Šâ€à¶»à·€à·Šà·ƒà¶» දත්ත මà·à¶šà·“මට හ෠වෙනස් කිරීමට මෙමඟින් යෙදුමට අවසර දෙයි. සටහන: වෙබ් ගවේෂණ à·„à·à¶šà·’යà·à·€ සහිත තෙවෙනි à¶´à·à¶»à·Šà·à·€ à¶¶à·Šâ€à¶»à·€à·Šà·ƒà¶» හ෠වෙනත් යෙදුම් වලින් මෙම අවසරයට à¶¶à¶½ නොකරයි."</string>
+ <string name="permdesc_writeHistoryBookmarks" product="default" msgid="8497389531014185509">"ඔබගේ දුරකථනයේ ආචයනය කරන ලද à¶¶à·Šâ€à¶»à·€à·Šà·ƒà¶» ඉතිහà·à·ƒà¶º හ෠පිටුසන වෙනස් කිරීමට යෙදුමට අවසර දෙන්න. ඔබගේ à¶¶à·Šâ€à¶»à·€à·Šà·ƒà¶» දත්ත මà·à¶šà·“මට හ෠වෙනස් කිරීමට අනිෂ්ට යෙදුම් මෙය à¶·à·à·€à·’à¶­ කරයි. සටහන: වෙබ් à¶¶à·Šâ€à¶»à·€à·Šà·ƒà¶» à¶…à·€à·à·Šâ€à¶ºà¶­à·à·€à¶º සමග තෙවෙනි à¶´à·à¶»à·Šà·à·€ à¶¶à·Šâ€à¶»à·€à·Šà·ƒà¶» හ෠වෙනත් යෙදුම් විසින් මෙම අවසරය à¶¶à¶½ à¶œà·à¶±à·Šà·€à·’ය à·„à·à¶š."</string>
+ <string name="permlab_setAlarm" msgid="1379294556362091814">"සීනුවක් à·ƒà·à¶šà·ƒà·“ම"</string>
+ <string name="permdesc_setAlarm" msgid="316392039157473848">"ස්ථà·à¶´à¶±à¶º කරන ලද සීනු ඔරලà·à·ƒà·” යෙදුමේ සීනුව සකස් කරන්නට යෙදුමට ඉඩ දෙන්න. ඇතà·à¶¸à·Š සීනු ඔරලà·à·ƒà·” යෙදුම් මෙම අංගය à¶šà·Šâ€à¶»à·’යà·à·€à¶§ නංව෠නොතිබීමට ඉඩ à¶­à·’à¶¶à·š."</string>
+ <string name="permlab_addVoicemail" msgid="5525660026090959044">"හඬ à¶­à·à¶´à·‘à¶½ à¶‘à¶šà·Š කිරීම"</string>
+ <string name="permdesc_addVoicemail" msgid="6604508651428252437">"ඔබගේ හඬ à¶­à·à¶´à·‘ලේ à¶‘à¶± ලිපි වෙත à¶‘à¶± පණිවිඩ à¶‘à¶šà¶­à·” කිරීමට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_writeGeolocationPermissions" msgid="5962224158955273932">"à¶¶à·Šâ€à¶»à·€à·Šà·ƒà¶»à¶ºà·š à¶·à·– අවසර වෙනස් කිරීම"</string>
+ <string name="permdesc_writeGeolocationPermissions" msgid="1083743234522638747">"à¶¶à·Šâ€à¶»à·€à·”සරයේ à¶·à·– ස්ථà·à¶±à·“ය අවසර වෙනස් කිරීමට යෙදුමට අවසර දෙන්න. අභිමත වෙබ් අඩවි වලට ස්ථà·à¶±à·“ය තොරතුරු යà·à·€à·“මට අනිෂ්ට යෙදුම් මෙය à¶·à·à·€à·’ත෠කෙරේ."</string>
+ <string name="permlab_packageVerificationAgent" msgid="5568139100645829117">"à¶´à·à¶šà·šà¶¢ සත්â€à¶ºà·à¶´à¶±à¶º කරන්න"</string>
+ <string name="permdesc_packageVerificationAgent" msgid="8437590190990843381">"ස්ථà·à¶´à·’à¶­ කොට ඇති à¶´à·à¶šà·šà¶¢à¶ºà¶šà·Š සත්â€à¶ºà·à¶´à¶±à¶ºà¶§ යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_bindPackageVerifier" msgid="4187786793360326654">"à¶´à·à¶šà·šà¶¢ සත්â€à¶ºà·à¶´à¶šà¶ºà¶šà·Š වෙත බඳින්න"</string>
+ <string name="permdesc_bindPackageVerifier" msgid="3180741773233862126">"à¶´à·à¶šà·šà¶¢ සත්â€à¶ºà·à¶´à¶š ඉල්ලීම් වලට දරන්නà·à¶§ ඉඩ ලබ෠දේ. à·ƒà·à¶¸à·à¶±à·Šâ€à¶º යෙදුම් සඳහ෠කිසිසේත් à¶…à·€à·à·Šâ€à¶º නොවේ."</string>
+ <string name="permlab_serialPort" msgid="546083327654631076">"à·à·Šâ€à¶»à·šà¶«à·’ගත පොට à¶´à·Šâ€à¶»à·€à·šà· කිරීම"</string>
+ <string name="permdesc_serialPort" msgid="2991639985224598193">"SerialManager API à¶·à·à·€à·’තයෙන් අනුක්â€à¶»à¶¸ තොට වෙත à¶´à·Šâ€à¶»à·€à·šà· වීමට රඳවනයට අවසර දෙන්න."</string>
+ <string name="permlab_accessContentProvidersExternally" msgid="5077774297943409285">"à¶¶à·à·„à·’à¶» අන්තර්ගත à·ƒà·à¶´à¶ºà·”ම්කරුවන් වෙත à¶´à·Šâ€à¶»à·€à·šà·à¶º"</string>
+ <string name="permdesc_accessContentProvidersExternally" msgid="4544346486697853685">"අන්තර්ගත සපයන්නන්ට à¶´à·Šâ€à¶»à·€à·šà· වීමට දරන්නන්ට ෂෙල් à¶‘à¶šà·š සිට à¶´à·Šâ€à¶»à·€à·šà· වීමට අවසර දෙන්න. à·ƒà·à¶¸à·à¶±à·Šâ€à¶º යෙදුම් සඳහ෠කිසිසේත් අදà·à·… නොවේ."</string>
+ <string name="permlab_updateLock" msgid="3527558366616680889">"ස්වයංක්â€à¶»à·“ය à¶‹à¶´à·à¶‚à¶œ යවත්කà·à¶½ කිරීම් පසුබට කරන්න"</string>
+ <string name="permdesc_updateLock" msgid="1655625832166778492">"à¶‹à¶´à·à¶‚ගය à¶‹à¶­à·Šà·à·Šâ€à¶»à·šà¶«à·’කරණයට අන්තර්ක්â€à¶»à·’යà·à¶šà·à¶»à·“ නොවන යළි ඇරඹීමක් සඳහ෠සුදුසු වෙලà·à·€ කුමක්ද යන්න à¶œà·à¶± පද්ධතියට තොරතුරු ලබà·à¶¯à·“මට දරන්නà·à¶§ අවසර දෙන්න."</string>
+ <string name="save_password_message" msgid="767344687139195790">"à¶¶à·Šâ€à¶»à·€à·Šà·ƒà¶»à¶ºà¶§ මෙම මුරපදය මතක à¶­à¶¶à· à¶œà·à¶±à·“මට ඔබට à¶…à·€à·à·Šâ€à¶ºà¶¯?"</string>
+ <string name="save_password_notnow" msgid="6389675316706699758">"දà·à¶±à·Š නොවේ"</string>
+ <string name="save_password_remember" msgid="6491879678996749466">"මතක තබ෠ගන්න"</string>
+ <string name="save_password_never" msgid="8274330296785855105">"කවදà·à·€à¶­à·Š නොවේ"</string>
+ <string name="open_permission_deny" msgid="7374036708316629800">"මෙම පිටුව විවෘත කිරීමට ඔබට අවසර à¶±à·à¶­."</string>
+ <string name="text_copied" msgid="4985729524670131385">"පෙළ පසුරු පුවරුවට පිටපත් කරන ලදි."</string>
+ <string name="more_item_label" msgid="4650918923083320495">"à¶­à·€"</string>
+ <string name="prepend_shortcut_label" msgid="2572214461676015642">"මෙනුව+"</string>
+ <string name="menu_space_shortcut_label" msgid="2410328639272162537">"space"</string>
+ <string name="menu_enter_shortcut_label" msgid="2743362785111309668">"ඇතුල් කරන්න"</string>
+ <string name="menu_delete_shortcut_label" msgid="3658178007202748164">"මකන්න"</string>
+ <string name="search_go" msgid="8298016669822141719">"සෙවීම"</string>
+ <string name="searchview_description_search" msgid="6749826639098512120">"සෙවීම"</string>
+ <string name="searchview_description_query" msgid="5911778593125355124">"සෙවුම් විමසුම"</string>
+ <string name="searchview_description_clear" msgid="1330281990951833033">"විමසුම හිස් කරන්න"</string>
+ <string name="searchview_description_submit" msgid="2688450133297983542">"විමසුම යොමු කරන්න"</string>
+ <string name="searchview_description_voice" msgid="2453203695674994440">"හඬ සෙවීම"</string>
+ <string name="enable_explore_by_touch_warning_title" msgid="7460694070309730149">"ස්පර්෠කිරීමෙන් ගවේෂණය සබල කරන්න ද?"</string>
+ <string name="enable_explore_by_touch_warning_message" product="tablet" msgid="8655887539089910577">"ස්පර්à·à¶º වෙතින් ගවේෂණය සක්â€à¶»à·’ය කිරීමට <xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> à¶§ à¶…à·€à·à·Šâ€à¶ºà¶º. ස්පර්à·à¶º වෙතින් ගවේෂණය සක්â€à¶»à·’ය විට, ඔබගේ ඇඟිලිවලට à¶´à·„à·… විස්තර ඇසිය à·„à· à¶¶à·à¶½à·’ය à·„à·à¶š à·„à· à¶§à·à¶¶à·Šà¶½à¶§à¶º සමග අන්තර් à¶šà·Šâ€à¶»à·’යà·à¶šà·à¶»à·“ වීමට ඉංගිති සිදු à¶šà·… à·„à·à¶š."</string>
+ <string name="enable_explore_by_touch_warning_message" product="default" msgid="2708199672852373195">"ස්පර්à·à¶º වෙතින් ගවේෂණය සක්â€à¶»à·’ය කිරීමට <xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> à¶§ à¶…à·€à·à·Šâ€à¶ºà¶ºà·’. ස්පර්à·à¶º වෙතින් ගවේෂණය සක්â€à¶»à·’ය විට, ඔබගේ ඇඟිලිවලට à¶´à·„à·… විස්තර ඇසිය à·„à· à¶¶à·à¶½à·’ය à·„à·à¶š හ෠දුරකථනය සමග අන්තර් à¶šà·Šâ€à¶»à·’යà·à¶šà·à¶»à·“ වීමට ඉංගිති සිදු à¶šà·… à·„à·à¶š."</string>
+ <string name="oneMonthDurationPast" msgid="7396384508953779925">"මà·à·ƒ 1 à¶šà¶§ පෙර"</string>
+ <string name="beforeOneMonthDurationPast" msgid="909134546836499826">"මà·à·ƒ 1 à¶šà¶§ පෙර"</string>
+ <plurals name="num_seconds_ago">
+ <item quantity="one" msgid="4869870056547896011">"තත්පර 1 කට පෙර"</item>
+ <item quantity="other" msgid="3903706804349556379">"තත්පර <xliff:g id="COUNT">%d</xliff:g> ට පෙර"</item>
+ </plurals>
+ <plurals name="num_minutes_ago">
+ <item quantity="one" msgid="3306787433088810191">"මිනිත්තු 1 ට පෙර"</item>
+ <item quantity="other" msgid="2176942008915455116">"මිනිත්තු <xliff:g id="COUNT">%d</xliff:g> කට පෙර"</item>
+ </plurals>
+ <plurals name="num_hours_ago">
+ <item quantity="one" msgid="9150797944610821849">"à¶´à·à¶º 1 à¶šà¶§ පෙර"</item>
+ <item quantity="other" msgid="2467273239587587569">"à¶´à·à¶º <xliff:g id="COUNT">%d</xliff:g> à¶šà¶§ පෙර"</item>
+ </plurals>
+ <plurals name="last_num_days">
+ <item quantity="other" msgid="3069992808164318268">"අන්තිම දවස් <xliff:g id="COUNT">%d</xliff:g>"</item>
+ </plurals>
+ <string name="last_month" msgid="3959346739979055432">"අවසà·à¶± මà·à·ƒà¶º"</string>
+ <string name="older" msgid="5211975022815554840">"පරණ"</string>
+ <plurals name="num_days_ago">
+ <item quantity="one" msgid="861358534398115820">"ඊයේ"</item>
+ <item quantity="other" msgid="2479586466153314633">"දින <xliff:g id="COUNT">%d</xliff:g> කට පෙර"</item>
+ </plurals>
+ <plurals name="in_num_seconds">
+ <item quantity="one" msgid="2729745560954905102">"තත්පර 1 කින්"</item>
+ <item quantity="other" msgid="1241926116443974687">"තත්පර <xliff:g id="COUNT">%d</xliff:g> කදී"</item>
+ </plurals>
+ <plurals name="in_num_minutes">
+ <item quantity="one" msgid="8793095251325200395">"මිනිත්තු 1 කදී"</item>
+ <item quantity="other" msgid="3330713936399448749">"මිනිත්තු <xliff:g id="COUNT">%d</xliff:g> ක් තුළ"</item>
+ </plurals>
+ <plurals name="in_num_hours">
+ <item quantity="one" msgid="7164353342477769999">"à¶´à·à¶º 1 à¶šà·Š තුළ"</item>
+ <item quantity="other" msgid="547290677353727389">"à¶´à·à¶º <xliff:g id="COUNT">%d</xliff:g> à¶šà·Š තුළ"</item>
+ </plurals>
+ <plurals name="in_num_days">
+ <item quantity="one" msgid="5413088743009839518">"හෙට"</item>
+ <item quantity="other" msgid="5109449375100953247">"දින <xliff:g id="COUNT">%d</xliff:g> ක් තුළ"</item>
+ </plurals>
+ <plurals name="abbrev_num_seconds_ago">
+ <item quantity="one" msgid="1849036840200069118">"තත්පර 1 කට පෙර"</item>
+ <item quantity="other" msgid="3699169366650930415">"තත්පර <xliff:g id="COUNT">%d</xliff:g> කට පෙර"</item>
+ </plurals>
+ <plurals name="abbrev_num_minutes_ago">
+ <item quantity="one" msgid="6361490147113871545">"මිනිත්තු 1 කට පෙර"</item>
+ <item quantity="other" msgid="851164968597150710">"මිනිත්තු <xliff:g id="COUNT">%d</xliff:g> ට පෙර"</item>
+ </plurals>
+ <plurals name="abbrev_num_hours_ago">
+ <item quantity="one" msgid="4796212039724722116">"à¶´à·à¶º 1 à¶šà¶§ පෙර"</item>
+ <item quantity="other" msgid="6889970745748538901">"à¶´à·à¶º <xliff:g id="COUNT">%d</xliff:g> à¶§ පෙර"</item>
+ </plurals>
+ <plurals name="abbrev_num_days_ago">
+ <item quantity="one" msgid="8463161711492680309">"ඊයේ"</item>
+ <item quantity="other" msgid="3453342639616481191">"දින <xliff:g id="COUNT">%d</xliff:g> ට පෙර"</item>
+ </plurals>
+ <plurals name="abbrev_in_num_seconds">
+ <item quantity="one" msgid="5842225370795066299">"තත්පර 1 ක් තුළ"</item>
+ <item quantity="other" msgid="5495880108825805108">"තත්පර <xliff:g id="COUNT">%d</xliff:g> ක් තුළ"</item>
+ </plurals>
+ <plurals name="abbrev_in_num_minutes">
+ <item quantity="one" msgid="562786149928284878">"මිනිත්තු 1 ක් තුළ"</item>
+ <item quantity="other" msgid="4216113292706568726">"මිනිත්තු <xliff:g id="COUNT">%d</xliff:g> ක් තුළ"</item>
+ </plurals>
+ <plurals name="abbrev_in_num_hours">
+ <item quantity="one" msgid="3274708118124045246">"à¶´à·à¶º 1 à¶šà·Š තුළ"</item>
+ <item quantity="other" msgid="3705373766798013406">"à¶´à·à¶º <xliff:g id="COUNT">%d</xliff:g> à¶šà·Š තුළ"</item>
+ </plurals>
+ <plurals name="abbrev_in_num_days">
+ <item quantity="one" msgid="2178576254385739855">"හෙට"</item>
+ <item quantity="other" msgid="2973062968038355991">"දින <xliff:g id="COUNT">%d</xliff:g> ක් තුළ"</item>
+ </plurals>
+ <string name="preposition_for_date" msgid="9093949757757445117">"<xliff:g id="DATE">%s</xliff:g> වන දà·"</string>
+ <string name="preposition_for_time" msgid="5506831244263083793">"<xliff:g id="TIME">%s</xliff:g> à¶§"</string>
+ <string name="preposition_for_year" msgid="5040395640711867177">"<xliff:g id="YEAR">%s</xliff:g> තුළ"</string>
+ <string name="day" msgid="8144195776058119424">"දවස"</string>
+ <string name="days" msgid="4774547661021344602">"දින"</string>
+ <string name="hour" msgid="2126771916426189481">"à¶´à·à¶º"</string>
+ <string name="hours" msgid="894424005266852993">"à¶´à·à¶º"</string>
+ <string name="minute" msgid="9148878657703769868">"min"</string>
+ <string name="minutes" msgid="5646001005827034509">"මිනිත්තු"</string>
+ <string name="second" msgid="3184235808021478">"à¶­à¶­à·Š"</string>
+ <string name="seconds" msgid="3161515347216589235">"à¶­à¶­à·Šà¶´à¶»"</string>
+ <string name="week" msgid="5617961537173061583">"සතිය"</string>
+ <string name="weeks" msgid="6509623834583944518">"සති"</string>
+ <string name="year" msgid="4001118221013892076">"අවුරුද්ද"</string>
+ <string name="years" msgid="6881577717993213522">"අවුරුදු"</string>
+ <plurals name="duration_seconds">
+ <item quantity="one" msgid="6962015528372969481">"à¶­à¶­à·Šà¶´à¶» 1"</item>
+ <item quantity="other" msgid="1886107766577166786">"à¶­à¶­à·Šà¶´à¶» <xliff:g id="COUNT">%d</xliff:g>"</item>
+ </plurals>
+ <plurals name="duration_minutes">
+ <item quantity="one" msgid="4915414002546085617">"මිනිත්තු 1"</item>
+ <item quantity="other" msgid="3165187169224908775">"මිනිත්තු <xliff:g id="COUNT">%d</xliff:g>"</item>
+ </plurals>
+ <plurals name="duration_hours">
+ <item quantity="one" msgid="8917467491248809972">"à¶´à·à¶º 1"</item>
+ <item quantity="other" msgid="3863962854246773930">"à¶´à·à¶º <xliff:g id="COUNT">%d</xliff:g> à¶šà·Š"</item>
+ </plurals>
+ <string name="VideoView_error_title" msgid="3534509135438353077">"වීඩිය෠ගà·à¶§à¶½à·”à·€"</string>
+ <string name="VideoView_error_text_invalid_progressive_playback" msgid="3186670335938670444">"මේ වීඩියà·à·€ මෙම à¶‹à¶´à·à¶‚ගයට à¶´à·Šâ€à¶»à·€à·à·„නය සඳහ෠වලංගු à¶±à·à¶­."</string>
+ <string name="VideoView_error_text_unknown" msgid="3450439155187810085">"මෙම වීඩියà·à·€ à¶°à·à·€à¶±à¶º à¶šà·… නොහà·à¶š."</string>
+ <string name="VideoView_error_button" msgid="2822238215100679592">"හරි"</string>
+ <string name="relative_time" msgid="1818557177829411417">"<xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="noon" msgid="7245353528818587908">"මධ්â€à¶ºà·„නය"</string>
+ <string name="Noon" msgid="3342127745230013127">"මධ්â€à¶ºà·à·„නය"</string>
+ <string name="midnight" msgid="7166259508850457595">"මධ්â€à¶ºà¶¸ à¶»à·à¶­à·Šâ€à¶»à·’ය"</string>
+ <string name="Midnight" msgid="5630806906897892201">"මධ්â€à¶ºà¶¸ à¶»à·à¶­à·Šâ€à¶»à·’ය"</string>
+ <string name="elapsed_time_short_format_mm_ss" msgid="4431555943828711473">"<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" msgid="1846071997616654124">"<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" msgid="6876518925844129331">"සියල්ල à¶­à·à¶»à¶±à·Šà¶±"</string>
+ <string name="cut" msgid="3092569408438626261">"කපන්න"</string>
+ <string name="copy" msgid="2681946229533511987">"පිටපත් කරන්න"</string>
+ <string name="paste" msgid="5629880836805036433">"අලවන්න"</string>
+ <string name="replace" msgid="5781686059063148930">"à¶´à·Šâ€à¶»à¶­à·’ස්ථà·à¶´à¶±à¶º කරන්න..."</string>
+ <string name="delete" msgid="6098684844021697789">"මකන්න"</string>
+ <string name="copyUrl" msgid="2538211579596067402">"URL පිටපත් කරන්න"</string>
+ <string name="selectTextMode" msgid="1018691815143165326">"පෙළ à¶­à·à¶»à¶±à·Šà¶±"</string>
+ <string name="textSelectionCABTitle" msgid="5236850394370820357">"පෙළ තේරීම"</string>
+ <string name="addToDictionary" msgid="4352161534510057874">"à·à¶¶à·Šà¶¯ à¶šà·à·‚යට à¶‘à¶šà¶­à·” කරන්න"</string>
+ <string name="deleteText" msgid="6979668428458199034">"මකන්න"</string>
+ <string name="inputMethod" msgid="1653630062304567879">"ආදà·à¶± à¶šà·Šâ€à¶»à¶¸à¶º"</string>
+ <string name="editTextMenuTitle" msgid="4909135564941815494">"පෙළ à¶šà·Šâ€à¶»à·’යà·à·€à¶±à·Š"</string>
+ <string name="low_internal_storage_view_title" msgid="5576272496365684834">"ආචයනය ඉඩ à¶´à·Šâ€à¶»à¶¸à·à¶«à¶º à¶…à¶©à·” වී ඇත"</string>
+ <string name="low_internal_storage_view_text" msgid="6640505817617414371">"සමහර පද්ධති à¶šà·à¶»à·Šà¶ºà¶ºà¶±à·Š à¶šà·Šâ€à¶»à·’ය෠නොකරනු ඇත"</string>
+ <string name="app_running_notification_title" msgid="8718335121060787914">"<xliff:g id="APP_NAME">%1$s</xliff:g> à¶°à·à·€à¶±à¶º වේ"</string>
+ <string name="app_running_notification_text" msgid="4653586947747330058">"à·€à·à¶©à·’පුර තොරතුරු හ෠යෙදුම à¶±à·à·€à¶­à·“ම සඳහ෠ස්පර්෠කරන්න."</string>
+ <string name="ok" msgid="5970060430562524910">"හරි"</string>
+ <string name="cancel" msgid="6442560571259935130">"අවලංගු කරන්න"</string>
+ <string name="yes" msgid="5362982303337969312">"හරි"</string>
+ <string name="no" msgid="5141531044935541497">"අවලංගු කරන්න"</string>
+ <string name="dialog_alert_title" msgid="2049658708609043103">"අවධà·à¶±à¶º"</string>
+ <string name="loading" msgid="7933681260296021180">"පූරණය වෙමින්..."</string>
+ <string name="capital_on" msgid="1544682755514494298">"සක්â€à¶»à·“යයි"</string>
+ <string name="capital_off" msgid="6815870386972805832">"à¶…à¶šà·Šâ€à¶»à·’ය කරන්න"</string>
+ <string name="whichApplication" msgid="4533185947064773386">"à¶´à·„à¶­ à¶·à·à·€à·’තයෙන් à¶šà·Šâ€à¶»à·’යà·à·€ සම්පූර්ණ කරන්න"</string>
+ <string name="alwaysUse" msgid="4583018368000610438">"මෙම à¶šà·Šâ€à¶»à·’යà·à·€ සඳහ෠සුපුරුද්දෙන් à¶·à·à·€à·’à¶­ කරන්න."</string>
+ <string name="clearDefaultHintMsg" msgid="3252584689512077257">"පද්ධති à·ƒà·à¶šà·ƒà·“ම් &gt; යෙදුම් &gt; à¶¶à·à¶œà·à¶±à·“ම් තුළ ඇති සුපුරුද්ද හිස් කරන්න."</string>
+ <string name="chooseActivity" msgid="7486876147751803333">"à¶šà·Šâ€à¶»à·’යà·à·€à¶šà·Š à¶­à·à¶»à¶±à·Šà¶±"</string>
+ <string name="chooseUsbActivity" msgid="6894748416073583509">"USB à¶‹à¶´à·à¶‚ගය සඳහ෠යෙදුමක් à¶­à·à¶»à¶±à·Šà¶±"</string>
+ <string name="noApplications" msgid="2991814273936504689">"මෙම à¶šà·Šâ€à¶»à·’යà·à·€ සිදු කිරීමට කිසිදු යෙදුමකට නොහà·à¶šà·’ය."</string>
+ <string name="aerr_title" msgid="1905800560317137752"></string>
+ <string name="aerr_application" msgid="932628488013092776">"à¶…à·€à·à·ƒà¶±à·à·€à¶±à·Šà¶­ ලෙස <xliff:g id="APPLICATION">%1$s</xliff:g> à¶±à·à·€à¶­à·“ ඇත."</string>
+ <string name="aerr_process" msgid="4507058997035697579">"à¶…à·€à·à·ƒà¶±à·à·€à¶±à·Šà¶­ ලෙස, <xliff:g id="PROCESS">%1$s</xliff:g> à¶šà·Šâ€à¶»à·’යà·à·€à¶½à·’ය නතර විණි."</string>
+ <string name="anr_title" msgid="4351948481459135709"></string>
+ <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> à¶´à·Šâ€à¶»à¶­à·’à¶ à·à¶» නොදක්වයි.\n\nඔබට එය නතර කිරීමට à¶…à·€à·à·Šâ€à¶ºà¶¯?"</string>
+ <string name="anr_activity_process" msgid="5776209883299089767">"<xliff:g id="ACTIVITY">%1$s</xliff:g> à¶šà·Šâ€à¶»à·’යà·à¶šà·à¶»à¶šà¶¸ à¶´à·Šâ€à¶»à¶­à·’à¶ à·à¶» නොදක්වයි.\n\nඑය වස෠දà·à¶¸à·“මට ඔබට à¶…à·€à·à·Šâ€à¶ºà¶¯?"</string>
+ <string name="anr_application_process" msgid="8941757607340481057">"<xliff:g id="APPLICATION">%1$s</xliff:g> à¶´à·Šâ€à¶»à¶­à·’à¶ à·à¶» නොදක්වයි. එය වස෠දà·à¶¸à·“මට ඔබට à¶…à·€à·à·Šâ€à¶ºà¶¯?"</string>
+ <string name="anr_process" msgid="6513209874880517125">"<xliff:g id="PROCESS">%1$s</xliff:g> à¶šà·Šâ€à¶»à·’යà·à·€à¶½à·’ය à¶´à·Šâ€à¶»à¶­à·’à¶ à·à¶» නොදක්වයි.\n\nඔබට එය නතර කිරීමට à¶…à·€à·à·Šâ€à¶ºà¶¯?"</string>
+ <string name="force_close" msgid="8346072094521265605">"හරි"</string>
+ <string name="report" msgid="4060218260984795706">"à·€à·à¶»à·Šà¶­à·à·€"</string>
+ <string name="wait" msgid="7147118217226317732">"à¶»à·à¶³à·“ සිටින්න"</string>
+ <string name="webpage_unresponsive" msgid="3272758351138122503">"පිටුව à¶´à·Šâ€à¶»à¶­à·’à¶ à·à¶» නොදක්වන තත්වයට පත්වී ඇත.\n\nඔබට එය à·€à·à·ƒà·“මට à¶…à·€à·à·Šâ€à¶ºà¶¯?"</string>
+ <string name="launch_warning_title" msgid="1547997780506713581">"යෙදුම à¶±à·à·€à¶­ හරව෠යව෠ඇත"</string>
+ <string name="launch_warning_replace" msgid="6202498949970281412">"<xliff:g id="APP_NAME">%1$s</xliff:g> දà·à¶±à·Š à¶°à·à·€à¶±à¶º වෙයි."</string>
+ <string name="launch_warning_original" msgid="188102023021668683">"<xliff:g id="APP_NAME">%1$s</xliff:g> මුලින්ම අරඹ෠ඇත."</string>
+ <string name="screen_compat_mode_scale" msgid="3202955667675944499">"පරිමà·à¶«à¶º"</string>
+ <string name="screen_compat_mode_show" msgid="4013878876486655892">"à·ƒà·à¶¸à·€à·’ටම පෙන්වන්න"</string>
+ <string name="screen_compat_mode_hint" msgid="1064524084543304459">"පද්ධති à·ƒà·à¶šà·ƒà·“ම් තුළ මෙය à¶±à·à·€à¶­ à¶šà·Šâ€à¶»à·’යà·à¶­à·Šà¶¸à¶š කරන්න &gt; යෙදුම් &gt; à¶¶à·à¶œà¶±à·Šà¶±à· ලදි."</string>
+ <string name="smv_application" msgid="3307209192155442829">"<xliff:g id="APPLICATION">%1$s</xliff:g> යෙදුම (<xliff:g id="PROCESS">%2$s</xliff:g> à¶šà·Šâ€à¶»à·’යà·à·€à¶½à·’ය) à¶‘à·„à·’ StrictMode කොන්දේසිය උල්ලංà¶à¶±à¶º à¶šà¶» ඇත."</string>
+ <string name="smv_process" msgid="5120397012047462446">"<xliff:g id="PROCESS">%1$s</xliff:g> à¶šà·Šâ€à¶»à·’යà·à·€à¶½à·’ය à¶‘à·„à·’ StrictMode කොන්දේසිය උල්ලංà¶à¶±à¶º à¶šà¶» ඇත."</string>
+ <string name="android_upgrading_title" msgid="1584192285441405746">"Android à¶‹à¶­à·Šà·à·Šâ€à¶»à·šà¶«à·’ වෙමින් පවතී..."</string>
+ <string name="android_upgrading_apk" msgid="7904042682111526169">"<xliff:g id="NUMBER_1">%2$d</xliff:g> කින් <xliff:g id="NUMBER_0">%1$d</xliff:g> à·€à·à¶±à·’ යෙදුමප්†රà·à·ƒà·Šà¶­ කරමින්."</string>
+ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"යෙදුම් ආරම්භ කරමින්."</string>
+ <string name="android_upgrading_complete" msgid="1405954754112999229">"ඇරඹුම අවසà·à¶± කරමින්."</string>
+ <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> à¶°à·à·€à¶±à¶º වෙමින්"</string>
+ <string name="heavy_weight_notification_detail" msgid="1721681741617898865">"යෙදුමට මà·à¶»à·” වීමට ස්පර්෠කරන්න"</string>
+ <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"යෙදුම් මà·à¶»à·” වනවà·à¶¯?"</string>
+ <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"අලුත් යෙදුමක් ආරම්භ කිරීමට පෙර තවමත් à¶šà·Šâ€à¶»à·’යà·à·€à·™à·„à·’ යෙදෙමින් පවතින යෙදුම à¶±à·à·€à·à¶­à·Šà·€à·’ය යුතුයි."</string>
+ <string name="old_app_action" msgid="493129172238566282">"<xliff:g id="OLD_APP">%1$s</xliff:g> වෙත ආපසු යන්න"</string>
+ <string name="old_app_description" msgid="2082094275580358049">"නව යෙදුම ආරම්භ නොකරන්න."</string>
+ <string name="new_app_action" msgid="5472756926945440706">"<xliff:g id="OLD_APP">%1$s</xliff:g> අරඹන්න"</string>
+ <string name="new_app_description" msgid="1932143598371537340">"සුරà·à¶šà·“මකින් තොරව පරණ යෙදුම නවත්වන්න."</string>
+ <string name="sendText" msgid="5209874571959469142">"පෙළ සඳහ෠ක්â€à¶»à·’යà·à·€ à¶­à·à¶»à¶±à·Šà¶±"</string>
+ <string name="volume_ringtone" msgid="6885421406845734650">"හඬ නඟනයේ à·à¶¶à·Šà¶¯à¶º"</string>
+ <string name="volume_music" msgid="5421651157138628171">"මà·à¶°à·Šâ€à¶º à·à¶¶à·Šà¶¯à¶º à¶­à·Šâ€à¶»à·“වතà·à·€à¶º"</string>
+ <string name="volume_music_hint_playing_through_bluetooth" msgid="9165984379394601533">"බ්ලූටූත් හරහ෠ධà·à·€à¶±à¶º වෙයි"</string>
+ <string name="volume_music_hint_silent_ringtone_selected" msgid="8310739960973156272">"නිහඬ රිගින් à¶§à·à¶±à¶ºà¶šà·Š සකසන්න"</string>
+ <string name="volume_call" msgid="3941680041282788711">"ඇමතුම-තුළ à·à¶¶à·Šà¶¯ à¶­à·Šâ€à¶»à·“වතà·à·€"</string>
+ <string name="volume_bluetooth_call" msgid="2002891926351151534">"බ්ලූටූත් ඇමතුම-තුළ à·à¶¶à·Šà¶¯ à¶­à·Šâ€à¶»à·“වතà·à·€à¶º"</string>
+ <string name="volume_alarm" msgid="1985191616042689100">"සීනුවේ à·à¶¶à·Šà¶¯à¶º"</string>
+ <string name="volume_notification" msgid="2422265656744276715">"දà·à¶±à·”ම්දීමේ à·à¶¶à·Šà¶¯à¶º"</string>
+ <string name="volume_unknown" msgid="1400219669770445902">"à·à¶¶à·Šà¶¯à¶º à¶­à·Šâ€à¶»à·“වතà·à·€à¶º"</string>
+ <string name="volume_icon_description_bluetooth" msgid="6538894177255964340">"බ්ලූටූත් à·à¶¶à·Šà¶¯ à¶­à·Šâ€à¶»à·“වතà·à·€"</string>
+ <string name="volume_icon_description_ringer" msgid="3326003847006162496">"රින්ටà·à¶±à¶ºà·š à·à¶¶à·Šà¶¯à¶º"</string>
+ <string name="volume_icon_description_incall" msgid="8890073218154543397">"ඇමතුම් à·à¶¶à·Šà¶¯à¶º à¶­à·Šâ€à¶»à·“වතà·à·€à¶º"</string>
+ <string name="volume_icon_description_media" msgid="4217311719665194215">"මà·à¶°à·Šâ€à¶º à·à¶¶à·Šà¶¯à¶º à¶­à·Šâ€à¶»à·“වතà·à·€à¶º"</string>
+ <string name="volume_icon_description_notification" msgid="7044986546477282274">"දà·à¶±à·”ම්දීමේ à·à¶¶à·Šà¶¯ à¶­à·Šâ€à¶»à·“වතà·à·€"</string>
+ <string name="ringtone_default" msgid="3789758980357696936">"සුපුරුදු රින්ටà·à¶±à¶º සකසන්න"</string>
+ <string name="ringtone_default_with_actual" msgid="8129563480895990372">"සුපුරුදු රින්ටà·à¶±à¶º (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_silent" msgid="7937634392408977062">"කිසිවක් à¶±à·à¶­"</string>
+ <string name="ringtone_picker_title" msgid="3515143939175119094">"රිගින්ටà·à¶±"</string>
+ <string name="ringtone_unknown" msgid="5477919988701784788">"නොදන්න෠රින්ටà·à¶±à¶º"</string>
+ <plurals name="wifi_available">
+ <item quantity="one" msgid="6654123987418168693">"Wi-Fi à¶¢à·à¶½à¶ºà¶šà·Š à¶­à·’à¶¶à·š"</item>
+ <item quantity="other" msgid="4192424489168397386">"Wi-Fi à¶¢à·à¶½ ඇත"</item>
+ </plurals>
+ <plurals name="wifi_available_detailed">
+ <item quantity="one" msgid="1634101450343277345">"විවෘත Wi-Fi à¶¢à·à¶½à¶º ලබà·à¶œà¶­ à·„à·à¶š"</item>
+ <item quantity="other" msgid="7915895323644292768">"විවෘත Wi-Fi à¶¢à·à¶½ à¶­à·’à¶¶à·š"</item>
+ </plurals>
+ <string name="wifi_available_sign_in" msgid="4029489716605255386">"Wi-Fi ජලයට පුරනය වන්න"</string>
+ <string name="network_available_sign_in" msgid="8495155593358054676">"à¶¢à·à¶½à¶ºà¶§ පුරනය වන්න"</string>
+ <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
+ <skip />
+ <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Wi-Fi වෙත සම්බන්ධ විය නොහà·à¶š"</string>
+ <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" දුබල අන්තර්ජà·à¶½ සම්බන්ධතà·à·€à¶ºà¶šà·Š ඇත."</string>
+ <string name="wifi_p2p_dialog_title" msgid="97611782659324517">"à¶à¶¢à·” Wi-Fi"</string>
+ <string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"à¶à¶¢à·” Wi-Fi ආරම්භ කරන්න. මෙය Wi-Fi සේවà·à¶¯à·à¶ºà¶š/හොට්ස්පොට් à¶‘à¶š à¶…à¶šà·Šâ€à¶»à·’ය කරනු ඇත."</string>
+ <string name="wifi_p2p_failed_message" msgid="3763669677935623084">"à¶à¶¢à·” Wi-Fi ආරම්භ à¶šà·… නොහà·à¶š."</string>
+ <string name="wifi_p2p_enabled_notification_title" msgid="2068321881673734886">"Wi-Fi à¶à¶¢à·” සම්බන්ධතà·à·€ සක්â€à¶»à·’යයි"</string>
+ <string name="wifi_p2p_enabled_notification_message" msgid="1638949953993894335">"à·ƒà·à¶šà·ƒà·“ම් සඳහ෠ස්පර්෠කරන්න"</string>
+ <string name="accept" msgid="1645267259272829559">"පිළිගන්න"</string>
+ <string name="decline" msgid="2112225451706137894">"à¶´à·Šâ€à¶»à¶­à·’à¶šà·Šà·‚à·šà¶´ කරන්න"</string>
+ <string name="wifi_p2p_invitation_sent_title" msgid="1318975185112070734">"ආරà·à¶°à¶±à·à·€ යවන ලදි"</string>
+ <string name="wifi_p2p_invitation_to_connect_title" msgid="4958803948658533637">"සම්බන්ධතà·à·€à¶ºà¶§ ඇරයුමකි"</string>
+ <string name="wifi_p2p_from_message" msgid="570389174731951769">"වෙතින්:"</string>
+ <string name="wifi_p2p_to_message" msgid="248968974522044099">"වෙත:"</string>
+ <string name="wifi_p2p_enter_pin_message" msgid="5920929550367828970">"à¶…à·€à·à·Šâ€à¶º PIN à¶‘à¶š ටයිප් කරන්න:"</string>
+ <string name="wifi_p2p_show_pin_message" msgid="8530563323880921094">"PIN:"</string>
+ <string name="wifi_p2p_frequency_conflict_message" product="tablet" msgid="8012981257742232475">"à¶§à·à¶¶à·Šà¶½à¶§à¶º <xliff:g id="DEVICE_NAME">%1$s</xliff:g> වෙත සම්බන්ධ වන අතරතුර එය Wi-Fi වලින් à¶­à·à·€à¶šà·à¶½à·’à¶šà·€ විසන්ධි කෙරේ."</string>
+ <string name="wifi_p2p_frequency_conflict_message" product="default" msgid="7363907213787469151">"දුරකථනය <xliff:g id="DEVICE_NAME">%1$s</xliff:g> à¶§ සම්බන්ධ වී පවතින විට Wi-Fi වලින් එය à¶­à·à·€à¶šà·à¶½à·’à¶šà·€ විසන්ධි වෙයි."</string>
+ <string name="select_character" msgid="3365550120617701745">"අකුර ඇතුළත් කරන්න"</string>
+ <string name="sms_control_title" msgid="7296612781128917719">"SMS පණිවිඩ යවමින්"</string>
+ <string name="sms_control_message" msgid="3867899169651496433">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; SMS පණිවිඩ විà·à·à¶½ ගණනක් යවයි. මෙම යෙදුමට පණිවිඩ යà·à·€à·“ම නොනà·à·€à¶­à·“ කරගෙන යà·à¶¸à¶§ අවසර දීමට ඔබට à¶…à·€à·à·Šâ€à¶ºà¶¯?"</string>
+ <string name="sms_control_yes" msgid="3663725993855816807">"අවසර දෙන්න"</string>
+ <string name="sms_control_no" msgid="625438561395534982">"à¶´à·Šâ€à¶»à¶­à·’à¶šà·Šà·‚à·šà¶´ කරන්න"</string>
+ <string name="sms_short_code_confirm_message" msgid="1645436466285310855">"&lt;b&gt;<xliff:g id="DEST_ADDRESS">%2$s</xliff:g>&lt;b&gt; වෙත කෙටි පණිවීඩයක් යà·à·€à·“මට &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;b&gt; à¶šà·à¶¸à¶­à·’ය."</string>
+ <!-- syntax error in translation for sms_short_code_details (3492025719868078457) org.xmlpull.v1.XmlPullParserException: expected: /string read: font (position:END_TAG </font>@1:83 in <string name="sms_short_code_details" msgid="3492025719868078457">"මෙය "</font>"ඔබගේ ජංගම ගිණුමේ"<font fgcolor="#ffffb060">" අය වීම් වලට හේතුවක් වේ."</string>
+) -->
+ <string name="sms_premium_short_code_details" msgid="5523826349105123687"><font fgcolor="#ffffb060">"මෙය ඔබගේ ජංගම ගිණුමෙන් අයවීමට හේතු වේ."</font></string>
+ <string name="sms_short_code_confirm_allow" msgid="4458878637111023413">"යවන්න"</string>
+ <string name="sms_short_code_confirm_deny" msgid="2927389840209170706">"අවලංගු කරන්න"</string>
+ <string name="sms_short_code_remember_choice" msgid="5289538592272218136">"මගේ තේරීම මතක à¶­à¶¶à·à¶œà¶±à·Šà¶±"</string>
+ <string name="sms_short_code_remember_undo_instruction" msgid="4960944133052287484">"ඔබට මෙය à·ƒà·à¶šà·ƒà·“ම් තුළ වෙනස්කර à¶œà·à¶±à·“ම පසුව à¶šà·… à·„à·à¶šÂ &gt; යෙදුම්"</string>
+ <string name="sms_short_code_confirm_always_allow" msgid="3241181154869493368">"à·ƒà·à¶¸à·€à·’ටම ඉඩ දෙන්න"</string>
+ <string name="sms_short_code_confirm_never_allow" msgid="446992765774269673">"කිසිද෠අවසර නොදෙන්න"</string>
+ <string name="sim_removed_title" msgid="6227712319223226185">"SIM පත ඉවත් කරන ලදි"</string>
+ <string name="sim_removed_message" msgid="2333164559970958645">"ඔබ ඇතුළත් කරන ලද වලංගු SIM à¶´à¶­ සමඟ à¶±à·à·€à¶­ ඇරඹීම කරන තුරු ජංගම à¶¢à·à¶½à¶º නොතිබේ."</string>
+ <string name="sim_done_button" msgid="827949989369963775">"හරි"</string>
+ <string name="sim_added_title" msgid="3719670512889674693">"SIM පතක් එකතු කරන ලදි"</string>
+ <string name="sim_added_message" msgid="6599945301141050216">"ජංගම à¶¢à·à¶½à¶ºà¶§ à¶´à·Šâ€à¶»à·€à·šà· වීමට ඔබගේ à¶‹à¶´à·à¶‚ගය à¶±à·à·€à¶­ අරඹන්න."</string>
+ <string name="sim_restart_button" msgid="4722407842815232347">"යළි අරඹන්න"</string>
+ <string name="time_picker_dialog_title" msgid="8349362623068819295">"වේලà·à·€ සකසන්න"</string>
+ <string name="date_picker_dialog_title" msgid="5879450659453782278">"දිනය à·ƒà·à¶šà·ƒà·“ම"</string>
+ <string name="date_time_set" msgid="5777075614321087758">"සකසන්න"</string>
+ <string name="date_time_done" msgid="2507683751759308828">"හරි"</string>
+ <string name="perms_new_perm_prefix" msgid="8257740710754301407"><font size="12" fgcolor="#ff33b5e5">"අලුත්: "</font></string>
+ <string name="perms_description_app" msgid="5139836143293299417">"<xliff:g id="APP_NAME">%1$s</xliff:g> විසින් සපයන ලදි."</string>
+ <string name="no_permissions" msgid="7283357728219338112">"අවසර à¶…à·€à·à·Šâ€à¶º නොමà·à¶­"</string>
+ <string name="perm_costs_money" msgid="4902470324142151116">"මෙමඟින් ඔබට මුදල් à·€à·à¶º විය à·„à·à¶š"</string>
+ <string name="usb_storage_activity_title" msgid="4465055157209648641">"USB මහ෠ආචයනය"</string>
+ <string name="usb_storage_title" msgid="5901459041398751495">"USB සම්බන්ධිතයි"</string>
+ <string name="usb_storage_message" product="nosdcard" msgid="3308538094316477839">"ඔබ ඔබගේ පරිගණකයට සම්බන්ධ වී ඇත්තේ USB ස්පර්à·à¶º හරහà·à¶º. ඔබට ඔබේ පරිගණකය හ෠ඔබගේ Android USB ආචයනය à¶…à¶­à¶» ගොනු à¶´à·’à¶§à¶´à¶­à·Š කිරීමට à¶…à·€à·à·Šâ€à¶º නම් à¶´à·„à¶­ බොත්තම ඔබන්න."</string>
+ <string name="usb_storage_message" product="default" msgid="805351000446037811">"ඔබ ඔබගේ පරිගණකයට USB හරහ෠සම්බන්ධ වී ඇත. ඔබට ඔබේ පරිගණකය හ෠ඔබගේ Android SD à¶´à¶­ à¶…à¶­à¶» ගොනු à¶´à·’à¶§à¶´à¶­à·Š කිරීමට à¶…à·€à·à·Šâ€à¶º නම් à¶´à·„à¶­ බොත්තම ස්පර්෠කරන්න."</string>
+ <string name="usb_storage_button_mount" msgid="1052259930369508235">"USB ආචයනය සක්â€à¶»à·’ය කරන්න"</string>
+ <string name="usb_storage_error_message" product="nosdcard" msgid="3017045217365540658">"USB මහ෠ආචයනය සඳහ෠ඔබගේ USB ආචයනය à¶·à·à·€à·’තයේදී à¶œà·à¶§à·…ුවක් à¶­à·’à¶¶à·š."</string>
+ <string name="usb_storage_error_message" product="default" msgid="2876018512716970313">"USB මහ෠ආචයනය සඳහ෠ඔබගේ SD à¶´à¶­ à¶·à·à·€à·’තයේදී à¶œà·à¶§à·…ුවක් à¶­à·’à¶¶à·š."</string>
+ <string name="usb_storage_notification_title" msgid="8175892554757216525">"USB සම්බන්ධිතයි"</string>
+ <string name="usb_storage_notification_message" msgid="939822783828183763">"ඔබගේ පරිගණකය වෙතට/වෙතින් ගොනු පිටපත් කිරීමට ස්පර්෠කරන්න."</string>
+ <string name="usb_storage_stop_notification_title" msgid="2336058396663516017">"USB ආචයනය à¶…à¶šà·Šâ€à¶»à·’ය කරන්න"</string>
+ <string name="usb_storage_stop_notification_message" msgid="1656852098555623822">"USB ආචයනය à¶…à¶šà·Šâ€à¶»à·’ය කිරීමට ස්පර්෠කරන්න."</string>
+ <string name="usb_storage_stop_title" msgid="660129851708775853">"USB ආචයනය à¶·à·à·€à·’තයේ පවතී"</string>
+ <string name="usb_storage_stop_message" product="nosdcard" msgid="4264025280777219521">"USB ආචයනය à¶…à¶šà·Šâ€à¶»à·’ය කිරීමට පෙර, ඔබගේ පරිගණකයෙන් Android USB ආචයනය ගලව෠දමන්න (\"à¶´à·’à¶§ කරන්න\")."</string>
+ <string name="usb_storage_stop_message" product="default" msgid="8043969782460613114">"USB ආචයනය à¶…à¶šà·Šâ€à¶»à·’ය කිරීමට පෙර, ඔබගේ Android SD à¶´à¶­ පරිගණකයෙන් ගලවන්න."</string>
+ <string name="usb_storage_stop_button_mount" msgid="7060218034900696029">"USB ආචයනය à¶…à¶šà·Šâ€à¶»à·’ය කරන්න"</string>
+ <string name="usb_storage_stop_error_message" msgid="1970374898263063836">"USB ආචයනය à¶…à¶šà·Šâ€à¶»à·’ය කිරීමේදී à¶œà·à¶§à·…ුවක් ඇතිවිය. USB සංග්â€à¶»à·à·„කය ගලව෠ඇති දà·à¶ºà·’ පරීක්ෂ෠කරන්න, පසුව à¶±à·à·€à¶­à¶­à·Š උත්සහ කරන්න."</string>
+ <string name="dlg_confirm_kill_storage_users_title" msgid="963039033470478697">"USB ආචයනය සක්â€à¶»à·’ය කරන්න"</string>
+ <string name="dlg_confirm_kill_storage_users_text" msgid="5100428757107469454">"ඔබ USB ආචයනය සක්â€à¶»à·’ය නම්, ඔබ à¶·à·à·€à·’ත෠කරන සමහර යෙදුම් à¶±à·à·€à¶­à·“ම සහ ඔබ USB ආචයනය à¶…à¶šà·Šâ€à¶»à·’ය කරන තුරු නොතිබේවී."</string>
+ <string name="dlg_error_title" msgid="7323658469626514207">"USB à¶šà·Šâ€à¶»à·’යà·à·€à¶½à·’ය à¶…à·ƒà·à¶»à·Šà¶®à¶šà¶ºà·’"</string>
+ <string name="dlg_ok" msgid="7376953167039865701">"හරි"</string>
+ <string name="usb_mtp_notification_title" msgid="3699913097391550394">"මà·à¶°à·Šâ€à¶º à¶‹à¶´à·à¶‚ගයක් ලෙස සම්බන්ධිතයි"</string>
+ <string name="usb_ptp_notification_title" msgid="1960817192216064833">"à¶šà·à¶¸à¶»à·à·€à¶šà·Š ලෙස සම්බන්ධ à¶šà¶» ඇත"</string>
+ <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"ස්ථà·à¶´à·’තයක් ලෙස සම්බන්ධයි"</string>
+ <string name="usb_accessory_notification_title" msgid="7848236974087653666">"USB මෙවලමකට සම්බන්ධිතයි"</string>
+ <string name="usb_notification_message" msgid="2290859399983720271">"අනෙක් USB විකල්පය සඳහ෠ස්පර්෠කරන්න."</string>
+ <string name="extmedia_format_title" product="nosdcard" msgid="9020092196061007262">"USB ආචයනය à·†à·à¶¸à·à¶§à·Š කරන්නද?"</string>
+ <string name="extmedia_format_title" product="default" msgid="3648415921526526069">"SD à¶´à¶­ à·†à·à¶¸à·à¶§à·Š කරන්නද?"</string>
+ <string name="extmedia_format_message" product="nosdcard" msgid="3934016853425761078">"ඔබගේ USB ආචයනයේ ඇති සියලුම ගොනු මà·à¶šà·“ යනු ඇත. මෙම à¶šà·Šâ€à¶»à·’යà·à·€ ආපසු à·„à·à¶»à·€à·’ය නොහà·à¶š!"</string>
+ <string name="extmedia_format_message" product="default" msgid="14131895027543830">"ඔබගේ à¶´à¶­à·š සියලු දත්ත à¶±à·à¶­à·’ වනු ඇත."</string>
+ <string name="extmedia_format_button_format" msgid="4131064560127478695">"à·†à·à¶¸à·à¶§à·Š"</string>
+ <string name="adb_active_notification_title" msgid="6729044778949189918">"USB නිදොස්කරණය සම්බන්ධිතයි"</string>
+ <string name="adb_active_notification_message" msgid="1016654627626476142">"USB නිදොස්කරණය අබල කිරීමට ස්පර්෠කරන්න."</string>
+ <string name="select_input_method" msgid="4653387336791222978">"ආදà·à¶± à¶šà·Šâ€à¶»à¶¸à¶ºà¶šà·Š à¶­à·à¶»à¶±à·Šà¶±"</string>
+ <string name="configure_input_methods" msgid="9091652157722495116">"ආදà·à¶± à¶šà·Šâ€à¶»à¶¸ සකසන්න"</string>
+ <string name="use_physical_keyboard" msgid="6203112478095117625">"භෞතික යතුරු පුවරුව"</string>
+ <string name="hardware" msgid="7517821086888990278">"දෘඨà·à¶‚à¶œ"</string>
+ <string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"යතුරු පුවරුවට පිරිසà·à¶½à·à·ƒà·Šà¶¸ à¶­à·à¶»à¶±à·Šà¶±"</string>
+ <string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"යතුරු පුවරුවට පිරිසà·à¶½à·à·ƒà·Šà¶¸à¶šà·Š තේරීමට ස්පර්෠කරන්න."</string>
+ <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+ <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+ <string name="candidates_style" msgid="4333913089637062257"><u>"අපේක්ෂකයන්"</u></string>
+ <string name="ext_media_checking_notification_title" product="nosdcard" msgid="3449816005351468560">"USB ආචයනය සකසමින්"</string>
+ <string name="ext_media_checking_notification_title" product="default" msgid="5457603418970994050">"SD à¶´à¶­ සුදà·à¶±à¶¸à·Š කරමින්"</string>
+ <string name="ext_media_checking_notification_message" msgid="8287319882926737053">"à·€à·à¶»à¶¯à·’ සඳහ෠පරීක්ෂ෠කරමින්."</string>
+ <string name="ext_media_nofs_notification_title" product="nosdcard" msgid="7788040745686229307">"හිස් USB ආචයනය"</string>
+ <string name="ext_media_nofs_notification_title" product="default" msgid="780477838241212997">"හිස් SD පත"</string>
+ <string name="ext_media_nofs_notification_message" product="nosdcard" msgid="7840121067427269500">"SD à¶´à¶­ හිස් හ෠සහà·à¶º නොදක්වන ගොනු පද්ධතියක් ඇත."</string>
+ <string name="ext_media_nofs_notification_message" product="default" msgid="8641065641786923604">"SD පත හිස් හ෠සහය නොදක්වන ගොනු පද්ධතියක් ඇත"</string>
+ <string name="ext_media_unmountable_notification_title" product="nosdcard" msgid="2090046769532713563">"à·„à·à¶±à·’ වූ USB ආචයනය"</string>
+ <string name="ext_media_unmountable_notification_title" product="default" msgid="6410723906019100189">"à·„à·à¶±à·’ වූ SD à¶´à¶­"</string>
+ <string name="ext_media_unmountable_notification_message" product="nosdcard" msgid="1795917578395333280">"USB ආචයනයට à·„à·à¶±à·’ වී ඇත. එය à¶±à·à·€à¶­ à·†à·à¶¸à·à¶§à·Š à¶œà·à¶±à·Šà·€à·“මට උත්සහ කරන්න."</string>
+ <string name="ext_media_unmountable_notification_message" product="default" msgid="1753898567525568253">"SD à¶´à¶­à¶§ à·„à·à¶±à·’ වී ඇත. එය à¶±à·à·€à¶­ à·†à·à¶¸à·à¶§à·Š à¶œà·à¶±à·Šà·€à·“මට උත්සහ කරන්න."</string>
+ <string name="ext_media_badremoval_notification_title" product="nosdcard" msgid="1661683031330951073">"à¶¶à¶½à·à¶´à·œà¶»à·œà¶­à·Šà¶­à·” නොවූ ලෙස USB ආචයනය ඉවත් කෙරිණි"</string>
+ <string name="ext_media_badremoval_notification_title" product="default" msgid="6872152882604407837">"SD à¶´à¶­ à¶¶à¶½à·à¶´à·œà¶»à·œà¶­à·Šà¶­à·” රහිතව ඉවත් කරන ලදි"</string>
+ <string name="ext_media_badremoval_notification_message" product="nosdcard" msgid="4329848819865594241">"දත්ත à¶±à·à¶­à·’වීම à·€à·à·…ක්වීමට USB ආචයනය ඉවත්කිරීමට පෙර ගලවන්න."</string>
+ <string name="ext_media_badremoval_notification_message" product="default" msgid="7260183293747448241">"දත්ත à¶±à·à¶­à·’වීම à·€à·à·…ක්වීමට à¶œà·à¶½à·€à·“මට කලින් SD à¶´à¶­ ඉවත් කරන්න."</string>
+ <string name="ext_media_safe_unmount_notification_title" product="nosdcard" msgid="3967973893270360230">"ඉවත් කිරීමට USB ආචයනය ආරක්ෂිතයි"</string>
+ <string name="ext_media_safe_unmount_notification_title" product="default" msgid="6729801130790616200">"SD පත ඉවත් කිරීමට සුරක්ෂිතයි"</string>
+ <string name="ext_media_safe_unmount_notification_message" product="nosdcard" msgid="6142195361606493530">"ඔබට USB ආචයනය ආරක්ෂිතව ඉවත් කිරීමට පුළුවනි."</string>
+ <string name="ext_media_safe_unmount_notification_message" product="default" msgid="568841278138377604">"ඔබට ආරක්ෂිතව SD à¶´à¶­ ඉවත් à¶šà·… à·„à·à¶š"</string>
+ <string name="ext_media_nomedia_notification_title" product="nosdcard" msgid="4486377230140227651">"USB ආචයනය ඉවත් කරන ලදි"</string>
+ <string name="ext_media_nomedia_notification_title" product="default" msgid="8902518030404381318">"SD පත ඉවත් කර ඇත"</string>
+ <string name="ext_media_nomedia_notification_message" product="nosdcard" msgid="6921126162580574143">"USB ආචයනය ඉවත්කොට ඇත. අලුත් මà·à¶°à·Šâ€à¶ºà¶ºà¶šà·Š ඇතුළත් කරන්න."</string>
+ <string name="ext_media_nomedia_notification_message" product="default" msgid="3870120652983659641">"SD පත ඉවත් කරන ලදි. අලුත් එකක් ඇතුළත් කරන්න."</string>
+ <string name="activity_list_empty" msgid="1675388330786841066">"à¶œà·à¶½à¶´à·™à¶± à¶šà·Šâ€à¶»à·’යà·à¶šà·à¶»à¶šà¶¸à·Š හමු නොවුණි."</string>
+ <string name="permlab_pkgUsageStats" msgid="8787352074326748892">"සංරචකය à¶·à·à·€à·’à¶­ කිරීමේ සංඛ්â€à¶ºà·à¶± යà·à·€à¶­à·Šà¶šà·à¶½à·“à¶± කරන්න"</string>
+ <string name="permdesc_pkgUsageStats" msgid="1106612424254277630">"à¶‘à¶šà¶­à·” කරන ලද සංරචකය à¶·à·à·€à·’ත෠සංඛ්â€à¶ºà·à¶± වෙනස් කිරීමට යෙදුමට අවසර දෙන්න. à·ƒà·à¶¸à·à¶±à·Šâ€à¶º යෙදුම් සඳහ෠නොවේ."</string>
+ <string name="permlab_copyProtectedData" msgid="4341036311211406692">"අන්තර්ගතය පිටපත් කරන්න"</string>
+ <string name="permdesc_copyProtectedData" msgid="4390697124288317831">"අන්තර්ගතය à¶´à·’à¶§à¶´à¶­à·Š කිරීමට සුපුරුදු අන්තර්ගත සේවà·à·€ ඉල්ව෠සිටීමට යෙදුමට අවසර දෙන්න. à·ƒà·à¶¸à·à¶±à·Šâ€à¶º යෙදුම්වල à¶·à·à·€à·’තය සඳහ෠නොවේ."</string>
+ <string name="permlab_route_media_output" msgid="1642024455750414694">"මà·à¶°à·Šâ€à¶º à¶´à·Šâ€à¶»à¶­à·’දà·à¶±à¶ºà·š මà·à¶»à·Šà¶œà¶œà¶­ කිරීම"</string>
+ <string name="permdesc_route_media_output" msgid="4932818749547244346">"වෙනත් à¶¶à·à·„à·’à¶» à¶‹à¶´à·à¶‚à¶œ වෙත මà·à¶°à·Šâ€à¶º à¶´à·Šâ€à¶»à¶­à·’දà·à¶±à¶º යà·à·€à·“මට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_access_keyguard_secure_storage" msgid="7565552237977815047">"යතුරු à¶´à·à¶½à¶š ආරක්â€à·‚à·’à¶­ ආචයනය වෙත à¶´à·Šâ€à¶»à·€à·šà·à¶º"</string>
+ <string name="permdesc_access_keyguard_secure_storage" msgid="5866245484303285762">"යතුරු ආරක්ෂක ආචයනයට à¶´à·Šâ€à¶»à·€à·šà· වීමට යෙදුමට දෙයි."</string>
+ <string name="permlab_control_keyguard" msgid="172195184207828387">"පෙන්වීමේ à·„à· à·ƒà·à¶Ÿà·€à·“මේ යතුරු ආරක්ෂකය à¶´à·à¶½à¶±à¶º කරන්න"</string>
+ <string name="permdesc_control_keyguard" msgid="3043732290518629061">"යතුරු ආරක්ෂකය à¶´à·à¶½à¶±à¶ºà¶§ යෙදුමකට අවසර දෙන්න."</string>
+ <string name="tutorial_double_tap_to_zoom_message_short" msgid="4070433208160063538">"විà·à·à¶½à¶± à¶´à·à¶½à¶±à¶º සඳහ෠දෙවරක් ස්පර්෠කරන්න"</string>
+ <string name="gadget_host_error_inflating" msgid="4882004314906466162">"විජටය à¶‘à¶šà¶­à·” කිරීමට නොහà·à¶šà·’ විය."</string>
+ <string name="ime_action_go" msgid="8320845651737369027">"යන්න"</string>
+ <string name="ime_action_search" msgid="658110271822807811">"සෙවීම"</string>
+ <string name="ime_action_send" msgid="2316166556349314424">"යවන්න"</string>
+ <string name="ime_action_next" msgid="3138843904009813834">"මීලඟ"</string>
+ <string name="ime_action_done" msgid="8971516117910934605">"හරි"</string>
+ <string name="ime_action_previous" msgid="1443550039250105948">"පෙර"</string>
+ <string name="ime_action_default" msgid="2840921885558045721">"à¶šà·Šâ€à¶»à·’යà·à¶šà¶»à·€à¶±à·Šà¶±"</string>
+ <string name="dial_number_using" msgid="5789176425167573586">"<xliff:g id="NUMBER">%s</xliff:g> à¶·à·à·€à·’තයෙන්\nඅංකය අමතන්න"</string>
+ <string name="create_contact_using" msgid="4947405226788104538">"<xliff:g id="NUMBER">%s</xliff:g> à¶·à·à·€à·’තයෙන්\nසම්බන්ධතà·à·€à¶ºà¶šà·Š නිර්මà·à¶«à¶º කරන්න"</string>
+ <string name="grant_credentials_permission_message_header" msgid="2106103817937859662">"à¶´à·„à¶­ දà·à¶šà·Šà·€à·™à¶± à¶‘à¶šà¶šà·Š à·„à· à¶Šà¶§ à·€à·à¶©à·’ යෙදුම් ගණනක් ඔබගේ ගිණුමට à¶´à·Šâ€à¶»à·€à·šà· වීමට, දà·à¶±à·Š සහ ඉදිරියේදී අවසර ඉල්ලයි."</string>
+ <string name="grant_credentials_permission_message_footer" msgid="3125211343379376561">"මෙම ඉල්ලීමට අවසර දීමට ඔබට à¶…à·€à·à·Šâ€à¶ºà¶¯?"</string>
+ <string name="grant_permissions_header_text" msgid="6874497408201826708">"à¶´à·Šâ€à¶»à·€à·šà·à¶º ඉල්ලීම"</string>
+ <string name="allow" msgid="7225948811296386551">"අවසර දෙන්න"</string>
+ <string name="deny" msgid="2081879885755434506">"à¶´à·Šâ€à¶»à¶­à·’à¶šà·Šà·‚à·šà¶´ කරන්න"</string>
+ <string name="permission_request_notification_title" msgid="6486759795926237907">"අවසර ඉල්ල෠සිටී"</string>
+ <string name="permission_request_notification_with_subtitle" msgid="8530393139639560189">"<xliff:g id="ACCOUNT">%s</xliff:g> ගිණුම සඳහà·\nඅවසර ඉල්ලන ලදි."</string>
+ <string name="input_method_binding_label" msgid="1283557179944992649">"ආදà·à¶± à¶šà·Šâ€à¶»à¶¸à¶º"</string>
+ <string name="sync_binding_label" msgid="3687969138375092423">"සමමුහුර්තය"</string>
+ <string name="accessibility_binding_label" msgid="4148120742096474641">"à¶´à·Šâ€à¶»à·€à·šà·à·Šâ€à¶ºà¶­à·à·€"</string>
+ <string name="wallpaper_binding_label" msgid="1240087844304687662">"බිතුපත"</string>
+ <string name="chooser_wallpaper" msgid="7873476199295190279">"බිතුපත වෙනස් කරන්න"</string>
+ <string name="notification_listener_binding_label" msgid="2014162835481906429">"දà·à¶±à·”ම්දීම් අසන්නà·"</string>
+ <string name="vpn_title" msgid="19615213552042827">"VPN à¶šà·Šâ€à¶»à·’යà·à¶­à·Šà¶¸à¶šà¶ºà·’"</string>
+ <string name="vpn_title_long" msgid="6400714798049252294">"<xliff:g id="APP">%s</xliff:g> මඟින් VPN සක්â€à¶»à·“ය කරන ලදි"</string>
+ <string name="vpn_text" msgid="3011306607126450322">"à¶¢à·à¶½à¶º කළමනà·à¶šà¶»à¶«à¶º කිරීමට ස්පර්෠කරන්න."</string>
+ <string name="vpn_text_long" msgid="6407351006249174473">"<xliff:g id="SESSION">%s</xliff:g> වෙත සම්බන්ධ වුණි. à¶¢à·à¶½à¶º කළමනà·à¶šà¶»à¶«à¶º කිරීමට ස්පර්෠කරන්න."</string>
+ <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"à·ƒà·à¶¸à·€à·’ටම VPN සම්බන්ධ වෙමින්…"</string>
+ <string name="vpn_lockdown_connected" msgid="8202679674819213931">"නිරතුරුවම VPN සම්බන්ධ කර ඇත"</string>
+ <string name="vpn_lockdown_error" msgid="6009249814034708175">"à·ƒà·à¶¸à·€à·’à¶§ සක්â€à¶»à·’ය VPN දà·à·‚ය"</string>
+ <string name="vpn_lockdown_config" msgid="6415899150671537970">"වින්â€à¶ºà·à·ƒ කිරීමට ස්පර්෠කරන්න"</string>
+ <string name="upload_file" msgid="2897957172366730416">"ගොනුව à¶­à·à¶»à¶±à·Šà¶±"</string>
+ <string name="no_file_chosen" msgid="6363648562170759465">"ගොනුවක් à¶­à·à¶»à·à¶œà·™à¶± à¶±à·à¶­"</string>
+ <string name="reset" msgid="2448168080964209908">"යළි පිහිටුවන්න"</string>
+ <string name="submit" msgid="1602335572089911941">"යොමු කරන්න"</string>
+ <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"මà·à¶§à¶»à·Š රථ ආකà·à¶»à¶º සබල à¶šà¶» ඇත"</string>
+ <string name="car_mode_disable_notification_message" msgid="8035230537563503262">"මà·à¶§à¶»à·Š රථ ආකà·à¶»à¶ºà·™à¶±à·Š පිටවීමට ස්පර්෠කරන්න."</string>
+ <string name="tethered_notification_title" msgid="3146694234398202601">"ටෙදරින් හ෠හොට්ස්පොට් සක්â€à¶»à·“යයි"</string>
+ <string name="tethered_notification_message" msgid="6857031760103062982">"සකස් කිරීමට ස්පර්෠කරන්න."</string>
+ <string name="back_button_label" msgid="2300470004503343439">"ආපසු"</string>
+ <string name="next_button_label" msgid="1080555104677992408">"මීලඟ"</string>
+ <string name="skip_button_label" msgid="1275362299471631819">"මඟ හරින්න"</string>
+ <string name="throttle_warning_notification_title" msgid="4890894267454867276">"ඉහළ ජංගම දත්ත à¶·à·à·€à·’තය"</string>
+ <string name="throttle_warning_notification_message" msgid="3340822228599337743">"ජංගම දත්ත à¶·à·à·€à·’තය à¶œà·à¶± à¶­à·€ දà·à¶±à¶œà·à¶±à·“මට ස්පර්෠කරන්න."</string>
+ <string name="throttled_notification_title" msgid="6269541897729781332">"ජංගම දත්ත සීමà·à·€ ඉක්මව෠ඇත"</string>
+ <string name="throttled_notification_message" msgid="5443457321354907181">"ජංගම දත්ත à¶·à·à·€à·’තය à¶œà·à¶± à¶­à·€ දà·à¶±à¶œà·à¶±à·“මට ස්පර්෠කරන්න."</string>
+ <string name="no_matches" msgid="8129421908915840737">"à¶œà·à¶½à¶´à·“ම් à¶±à·à¶­"</string>
+ <string name="find_on_page" msgid="1946799233822820384">"පිටුවෙහි සෙවීම"</string>
+ <plurals name="matches_found">
+ <item quantity="one" msgid="8167147081136579439">"à¶œà·à·…පීම් 1 යි"</item>
+ <item quantity="other" msgid="4641872797067609177">"<xliff:g id="TOTAL">%d</xliff:g> කින් <xliff:g id="INDEX">%d</xliff:g>"</item>
+ </plurals>
+ <string name="action_mode_done" msgid="7217581640461922289">"හරි"</string>
+ <string name="progress_unmounting" product="nosdcard" msgid="3923810448507612746">"USB ආචයනය à¶œà·à¶½à·€à·“ම..."</string>
+ <string name="progress_unmounting" product="default" msgid="1327894998409537190">"SD පත ගලවමින්..."</string>
+ <string name="progress_erasing" product="nosdcard" msgid="4521573321524340058">"USB ආචයනය මකමින්..."</string>
+ <string name="progress_erasing" product="default" msgid="6596988875507043042">"SD පත මකමින්..."</string>
+ <string name="format_error" product="nosdcard" msgid="6299769563624776948">"USB ආචයනය මà·à¶šà·’ය නොහà·à¶š."</string>
+ <string name="format_error" product="default" msgid="7315248696644510935">"SD à¶´à¶­ මà·à¶šà·“මට නොහà·à¶šà·’ විය."</string>
+ <string name="media_bad_removal" msgid="7960864061016603281">"à¶œà·à¶½à·€à·“මට පෙර SD à¶´à¶­ ඉවත්කර ඇත."</string>
+ <string name="media_checking" product="nosdcard" msgid="418188720009569693">"USB ආචයනය මේ වනවිට පරීක්ෂ෠කරමින් පවතී."</string>
+ <string name="media_checking" product="default" msgid="7334762503904827481">"SD à¶´à¶­ දà·à¶±à·Š පරීක්ෂ෠කරමින් පවතී."</string>
+ <string name="media_removed" msgid="7001526905057952097">"SD පත ඉවත් කර ඇත."</string>
+ <string name="media_shared" product="nosdcard" msgid="5830814349250834225">"පරිගණකයක් විසින් දà·à¶±à·Š USB ආචයනය à¶·à·à·€à·’ත෠කරයි."</string>
+ <string name="media_shared" product="default" msgid="5706130568133540435">"SD à¶´à¶­ දà·à¶±à¶§ පරිගණකයකින් à¶´à·à·€à·’à¶ à·Šà¶ à·’ කරයි."</string>
+ <string name="media_unknown_state" msgid="729192782197290385">"à¶¶à·à·„à·’à¶» මà·à¶°à·Šâ€à¶ºà¶º නොදන්න෠අවස්ථà·à·€à·š පවතියි."</string>
+ <string name="share" msgid="1778686618230011964">"බෙදà·à¶œà¶±à·Šà¶±"</string>
+ <string name="find" msgid="4808270900322985960">"සොයන්න"</string>
+ <string name="websearch" msgid="4337157977400211589">"වෙබ් සෙවුම"</string>
+ <string name="find_next" msgid="5742124618942193978">"මීළඟ සොයන්න"</string>
+ <string name="find_previous" msgid="2196723669388360506">"පෙර එක සොයන්න"</string>
+ <string name="gpsNotifTicker" msgid="5622683912616496172">"<xliff:g id="NAME">%s</xliff:g> ගෙන් ස්ථà·à¶±à¶º ඉල්ලීම"</string>
+ <string name="gpsNotifTitle" msgid="5446858717157416839">"ස්ථà·à¶± ඉල්ලීම"</string>
+ <string name="gpsNotifMessage" msgid="1374718023224000702">"<xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>) විසින් ඉල්ලන ලද"</string>
+ <string name="gpsVerifYes" msgid="2346566072867213563">"ඔව්"</string>
+ <string name="gpsVerifNo" msgid="1146564937346454865">"à¶±à·à¶­"</string>
+ <string name="sync_too_many_deletes" msgid="5296321850662746890">"මà·à¶šà·“මේ සීමà·à·€ ඉක්මවන ලදි"</string>
+ <string name="sync_too_many_deletes_desc" msgid="496551671008694245">"<xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g> සඳහ෠<xliff:g id="ACCOUNT_NAME">%3$s</xliff:g> ගිණුමේ මකන ලද අයිතම <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> à¶šà·Š ඇත. ඔබට කුමක් කිරීමට à¶…à·€à·à·Šâ€à¶ºà¶¯?"</string>
+ <string name="sync_really_delete" msgid="2572600103122596243">"අයිතම මකන්න"</string>
+ <string name="sync_undo_deletes" msgid="2941317360600338602">"මà·à¶šà·“ම් අස් කරන්න"</string>
+ <string name="sync_do_nothing" msgid="3743764740430821845">"දà·à¶±à¶§ කිසිවක් නොකරන්න"</string>
+ <string name="choose_account_label" msgid="5655203089746423927">"ගිණුමක් à¶­à·à¶»à¶±à·Šà¶±"</string>
+ <string name="add_account_label" msgid="2935267344849993553">"ගිණුමක් එකතු කරන්න"</string>
+ <string name="add_account_button_label" msgid="3611982894853435874">"ගිණුමක් එකතු කරන්න"</string>
+ <string name="number_picker_increment_button" msgid="2412072272832284313">"à·€à·à¶©à·’ කරන්න"</string>
+ <string name="number_picker_decrement_button" msgid="476050778386779067">"අඩු කරන්න"</string>
+ <string name="number_picker_increment_scroll_mode" msgid="3073101067441638428">"<xliff:g id="VALUE">%s</xliff:g> ස්පර්෠කර රඳව෠සිටින්න."</string>
+ <string name="number_picker_increment_scroll_action" msgid="9101473045891835490">"à·€à·à¶©à·’ කිරීමට ඉහලට සර්පණය කරන්න සහ à¶…à¶©à·” කිරීමට පහලට සර්පණය කරන්න."</string>
+ <string name="time_picker_increment_minute_button" msgid="8865885114028614321">"මිනිත්තුවක් à·€à·à¶©à·’ කරන්න"</string>
+ <string name="time_picker_decrement_minute_button" msgid="6246834937080684791">"මිනිත්තුව අඩු කරන්න"</string>
+ <string name="time_picker_increment_hour_button" msgid="3652056055810223139">"à¶´à·à¶º à·€à·à¶©à·’කරන්න"</string>
+ <string name="time_picker_decrement_hour_button" msgid="1377479863429214792">"à¶´à·à¶º අඩුකරන්න"</string>
+ <string name="time_picker_increment_set_pm_button" msgid="4147590696151230863">"ප.ව.සකසන්න"</string>
+ <string name="time_picker_decrement_set_am_button" msgid="8302140353539486752">"පෙ.ව. සකස් කිරීම"</string>
+ <string name="date_picker_increment_month_button" msgid="5369998479067934110">"මà·à·ƒà¶º à·€à·à¶©à·’ කරන්න"</string>
+ <string name="date_picker_decrement_month_button" msgid="1832698995541726019">"මà·à·ƒà¶ºà¶šà·Š à¶…à¶©à·” කරන්න"</string>
+ <string name="date_picker_increment_day_button" msgid="7130465412308173903">"දවස à·€à·à¶©à·’ කරන්න"</string>
+ <string name="date_picker_decrement_day_button" msgid="4131881521818750031">"දවස අඩු කරන්න"</string>
+ <string name="date_picker_increment_year_button" msgid="6318697384310808899">"වසර à·€à·à¶©à·’ කරන්න"</string>
+ <string name="date_picker_decrement_year_button" msgid="4482021813491121717">"වසර අඩු කරන්න"</string>
+ <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
+ <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"අවලංගු කරන්න"</string>
+ <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"මකන්න"</string>
+ <string name="keyboardview_keycode_done" msgid="1992571118466679775">"හරි"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"ආකà·à¶»à¶º වෙනස් කරන්න"</string>
+ <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
+ <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"ඇතුල් කරන්න"</string>
+ <string name="activitychooserview_choose_application" msgid="2125168057199941199">"යෙදුමක් à¶­à·à¶»à¶±à·Šà¶±"</string>
+ <string name="shareactionprovider_share_with" msgid="806688056141131819">"සමඟ බෙදà·à¶œà¶±à·Šà¶±"</string>
+ <string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> සමඟින් බෙද෠ගන්න"</string>
+ <string name="content_description_sliding_handle" msgid="415975056159262248">"සර්පණ à·„à·à¶©à¶½à¶º. ස්පර්෠කර රඳව෠සිටීම."</string>
+ <string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> සඳහ෠උඩට සර්පණය කරන්න."</string>
+ <string name="description_direction_down" msgid="5087739728639014595">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> සඳහ෠පහලට සර්පණය කරන්න."</string>
+ <string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> සඳහ෠වමට සර්පණය කරන්න."</string>
+ <string name="description_direction_right" msgid="8034433242579600980">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> සඳහ෠දකුණට සර්පණය කරන්න."</string>
+ <string name="description_target_unlock" msgid="2228524900439801453">"අඟුල අරින්න"</string>
+ <string name="description_target_camera" msgid="969071997552486814">"à¶šà·à¶¸à¶»à·à·€"</string>
+ <string name="description_target_silent" msgid="893551287746522182">"නිහඬ"</string>
+ <string name="description_target_soundon" msgid="30052466675500172">"à·à¶¶à·Šà¶¯ සක්â€à¶»à·“ය කරන්න"</string>
+ <string name="description_target_search" msgid="3091587249776033139">"සෙවීම"</string>
+ <string name="description_target_unlock_tablet" msgid="3833195335629795055">"අගුළු ඇරීමට ස්වයිප් කරන්න."</string>
+ <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"මුරපද යතුරු කියවනු ඇසීමට ඉස් බණුවක් සම්බන්ධ කරන්න."</string>
+ <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"à¶±à·à·€à¶­à·”ම."</string>
+ <string name="action_bar_home_description" msgid="5293600496601490216">"මුල් පිටුවට සංචà·à¶½à¶±à¶º කරන්න"</string>
+ <string name="action_bar_up_description" msgid="2237496562952152589">"ඉහලට සංචà·à¶½à¶±à¶º කරන්න"</string>
+ <string name="action_menu_overflow_description" msgid="2295659037509008453">"තවත් විකල්ප"</string>
+ <string name="action_bar_home_description_format" msgid="7965984360903693903">"%1$s, %2$s"</string>
+ <string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string>
+ <string name="storage_internal" msgid="4891916833657929263">"à¶…à¶·à·Šâ€à¶ºà¶±à·Šà¶­à¶» ආචයනය"</string>
+ <string name="storage_sd_card" msgid="3282948861378286745">"SD à¶´à¶­"</string>
+ <string name="storage_usb" msgid="3017954059538517278">"USB ආචයනය"</string>
+ <string name="extract_edit_menu_button" msgid="8940478730496610137">"සංස්කරණය කරන්න"</string>
+ <string name="data_usage_warning_title" msgid="1955638862122232342">"දත්ත à¶·à·à·€à·’ත෠අවවà·à¶¯à¶º"</string>
+ <string name="data_usage_warning_body" msgid="2814673551471969954">"à¶·à·à·€à·’තය සහ à·ƒà·à¶šà·ƒà·“ම් à¶¶à·à¶½à·“මට ස්පර්෠කරන්න."</string>
+ <string name="data_usage_3g_limit_title" msgid="7093334419518706686">"2G-3G දත්ත අබලයි"</string>
+ <string name="data_usage_4g_limit_title" msgid="7636489436819470761">"4G දත්ත අබල කරන ලදි"</string>
+ <string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"ජංගම දත්ත අබල කර ඇත"</string>
+ <string name="data_usage_wifi_limit_title" msgid="8992154736441284865">"Wi-Fi දත්ත අබල කරන ලදි"</string>
+ <string name="data_usage_limit_body" msgid="3317964706973601386">"සබල කිරීමට ස්පර්෠කරන්න."</string>
+ <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"2G-3G දත්ත සීමà·à·€ ඉක්මවන ලදි"</string>
+ <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"4G දත්ත සීමà·à·€ ඉක්මව෠යන ලදි"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"ජංගම දත්ත සීමà·à·€ ඉක්මව෠යන ලදි"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"Wi-Fi දත්ත සීමà·à·€ ඉක්මව෠යන ලදි"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"සඳහන් à¶šà·… සීමà·à·€à¶§ වඩ෠<xliff:g id="SIZE">%s</xliff:g> à·€à·à¶©à·’ය."</string>
+ <string name="data_usage_restricted_title" msgid="5965157361036321914">"පසුබිම් දත්ත සිම෠කරන ලදි"</string>
+ <string name="data_usage_restricted_body" msgid="6741521330997452990">"සීම෠කිරීම ඉවත් කිරීමට ස්පර්෠කරන්න"</string>
+ <string name="ssl_certificate" msgid="6510040486049237639">"ආරක්â€à·‚à·’à¶­ සහතිකය"</string>
+ <string name="ssl_certificate_is_valid" msgid="6825263250774569373">"මෙම සහතිකය වලංගුයි."</string>
+ <string name="issued_to" msgid="454239480274921032">"ලබà·à¶¯à·”න්නේ:"</string>
+ <string name="common_name" msgid="2233209299434172646">"පොදු à¶±à·à¶¸à¶º:"</string>
+ <string name="org_name" msgid="6973561190762085236">"සංවිධà·à¶±à¶º:"</string>
+ <string name="org_unit" msgid="7265981890422070383">"සංවිධà·à¶±à·à¶­à·Šà¶¸à¶š ඒකකය:"</string>
+ <string name="issued_by" msgid="2647584988057481566">"ලබà·à¶¯à·™à¶± ලද්දේ:"</string>
+ <string name="validity_period" msgid="8818886137545983110">"වලංගුතà·à·€à¶º:"</string>
+ <string name="issued_on" msgid="5895017404361397232">"නිකුත් කරන ලද්දේ:"</string>
+ <string name="expires_on" msgid="3676242949915959821">"කල් ඉකුත් වන්නේ:"</string>
+ <string name="serial_number" msgid="758814067660862493">"අනුක්â€à¶»à¶¸à·à¶‚කය:"</string>
+ <string name="fingerprints" msgid="4516019619850763049">"ඇඟිලි සලකුණු:"</string>
+ <string name="sha256_fingerprint" msgid="4391271286477279263">"SHA-256 ඇඟිලිසලකුණ:"</string>
+ <string name="sha1_fingerprint" msgid="7930330235269404581">"SHA-1 ඇඟිලි සලකුණ:"</string>
+ <string name="activity_chooser_view_see_all" msgid="4292569383976636200">"සියල්ල බලන්න"</string>
+ <string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"à¶šà·Šâ€à¶»à·’යà·à¶šà·à¶»à¶šà¶¸ à¶­à·à¶»à¶±à·Šà¶±"</string>
+ <string name="share_action_provider_share_with" msgid="5247684435979149216">"සමඟ බෙදà·à¶œà¶±à·Šà¶±"</string>
+ <string name="status_bar_device_locked" msgid="3092703448690669768">"à¶‹à¶´à·à¶‚ගයට අගුළු à·€à·à¶§à·’ ඇත."</string>
+ <string name="list_delimeter" msgid="3975117572185494152">", "</string>
+ <string name="sending" msgid="3245653681008218030">"යවමින්..."</string>
+ <string name="launchBrowserDefault" msgid="2057951947297614725">"à¶¶à·Šâ€à¶»à·€à·”සරය දියත් කරන්නද?"</string>
+ <string name="SetupCallDefault" msgid="5834948469253758575">"ඇමතුම පිළිගන්නවà·à¶¯?"</string>
+ <string name="activity_resolver_use_always" msgid="8017770747801494933">"à·ƒà·à¶¸ විටම"</string>
+ <string name="activity_resolver_use_once" msgid="2404644797149173758">"à¶‘à¶šà·Š à·€à·à¶»à¶ºà¶ºà·’"</string>
+ <string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"à¶§à·à¶¶à·Šà¶½à¶§à·Šà¶º"</string>
+ <string name="default_audio_route_name" product="default" msgid="4239291273420140123">"දුරකථනය"</string>
+ <string name="default_audio_route_name_headphones" msgid="8119971843803439110">"ඉස් බණු"</string>
+ <string name="default_audio_route_name_dock_speakers" msgid="6240602982276591864">"à¶±à·à¶¯à¶š ඩොක් කරන්න"</string>
+ <string name="default_media_route_name_hdmi" msgid="2450970399023478055">"HDMI"</string>
+ <string name="default_audio_route_category_name" msgid="3722811174003886946">"පද්ධතිය"</string>
+ <string name="bluetooth_a2dp_audio_route_name" msgid="8575624030406771015">"බ්ලූටූත් à·à·Šâ€à¶»à·€à·Šâ€à¶º"</string>
+ <string name="wireless_display_route_description" msgid="9070346425023979651">"à¶»à·à·„à·à¶±à·Š රහිත දර්à·à¶±à¶º"</string>
+ <string name="media_route_chooser_grouping_done" msgid="7966438307723317169">"හරි"</string>
+ <string name="media_route_button_content_description" msgid="5758553567065145276">"මà·à¶°à·Šâ€à¶º à¶´à·Šâ€à¶»à¶­à·’දà·à¶±à¶º"</string>
+ <string name="media_route_status_scanning" msgid="7279908761758293783">"පරිලà·à¶šà¶±à¶º කරමින්…"</string>
+ <string name="media_route_status_connecting" msgid="6422571716007825440">"සම්බන්ධ වෙමින්…"</string>
+ <string name="media_route_status_available" msgid="6983258067194649391">"ලබà·à¶œà¶­ à·„à·à¶š"</string>
+ <string name="media_route_status_not_available" msgid="6739899962681886401">"ලබà·à¶œà¶­ නොහà·à¶š"</string>
+ <string name="media_route_status_in_use" msgid="4533786031090198063">"à¶·à·à·€à·’තයේ ඇත"</string>
+ <string name="display_manager_built_in_display_name" msgid="2583134294292563941">"à¶­à·’à·…à·à¶½à·’ තිරය"</string>
+ <string name="display_manager_hdmi_display_name" msgid="1555264559227470109">"HDMI තිරය"</string>
+ <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"à¶‹à¶©à·à¶­à·’රිය #<xliff:g id="ID">%1$d</xliff:g>"</string>
+ <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
+ <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", ආරක්â€à·‚à·’à¶­"</string>
+ <string name="wifi_display_notification_title" msgid="2223050649240326557">"නොරà·à·„à·à¶±à·Š සංදර්à·à¶šà¶º සම්බන්ධිතයි"</string>
+ <string name="wifi_display_notification_message" msgid="4498802012464170685">"වෙනත් à¶‹à¶´à·à¶‚ගයක් මත මෙම තිරය පෙන්වයි"</string>
+ <string name="wifi_display_notification_disconnect" msgid="6183754463561153372">"විසන්ධි කරන්න"</string>
+ <string name="kg_emergency_call_label" msgid="684946192523830531">"හදිසි ඇමතුම"</string>
+ <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"රටà·à·€ අමතකයි"</string>
+ <string name="kg_wrong_pattern" msgid="1850806070801358830">"à·€à·à¶»à¶¯à·’ රටà·à·€à¶šà·’"</string>
+ <string name="kg_wrong_password" msgid="2333281762128113157">"à·€à·à¶»à¶¯à·’ මුරපදය"</string>
+ <string name="kg_wrong_pin" msgid="1131306510833563801">"PIN à¶‘à¶š à·€à·à¶»à¶¯à·’යි"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"à¶­à¶­à·Šà¶´à¶» <xliff:g id="NUMBER">%1$d</xliff:g> à¶§ පසුව à¶±à·à·€à¶­ උත්සහ කරන්න."</string>
+ <string name="kg_pattern_instructions" msgid="398978611683075868">"ඔබගේ රටà·à·€ අඳින්න"</string>
+ <string name="kg_sim_pin_instructions" msgid="2319508550934557331">"SIM PIN ඇතුලු කරන්න"</string>
+ <string name="kg_pin_instructions" msgid="2377242233495111557">"PIN එක ඇතුළු කරන්න"</string>
+ <string name="kg_password_instructions" msgid="5753646556186936819">"මුරපදය ඇතුළු කරන්න"</string>
+ <string name="kg_puk_enter_puk_hint" msgid="453227143861735537">"දà·à¶±à·Š SIM à¶‘à¶š à¶…à¶¶à¶½ à¶šà¶» ඇත. ඉදිරියට යà·à¶¸à¶§ PUK කේතය යොදන්න. විස්තර සඳහ෠වà·à·„කය෠අමතන්න."</string>
+ <string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"අපේක්ෂිත PIN කේතය ඇතුළත් කරන්න"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"අපේක්ෂිත PIN කේතය ස්ථිර කරන්න"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"SIM පත අගුළු අරිමින්..."</string>
+ <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"à·€à·à¶»à¶¯à·’ PIN කේතයකි."</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"අංක 4 සිට 8 අතර වන PIN එකක් ටයිප් කරන්න."</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"PUK කේතය සංඛ්â€à¶ºà· 8 à¶šà·Š à·„à· à·€à·à¶©à·’ විය යුතුය."</string>
+ <string name="kg_invalid_puk" msgid="3638289409676051243">"නිවà·à¶»à¶¯à·’ PUK කේතය à¶±à·à·€à¶­ ඇතුලත් කරන්න. à¶±à·à·€à¶­ à¶±à·à·€à¶­ à¶‹à¶­à·Šà·ƒà·à·„ කිරීමෙන් SIM à¶‘à¶š ස්ථිරවම à¶…à¶¶à¶½ කරයි."</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"PIN à¶šà·šà¶­ à¶œà·à¶½à¶´à·“ à¶±à·à¶­"</string>
+ <string name="kg_login_too_many_attempts" msgid="6486842094005698475">"රට෠උත්සà·à·„ කිරීම් à·€à·à¶©à·’ය"</string>
+ <string name="kg_login_instructions" msgid="1100551261265506448">"අගුළු ඇරීමට, ඔබගේ Google ගිණුම සමග පුරනය වන්න."</string>
+ <string name="kg_login_username_hint" msgid="5718534272070920364">"පරිà·à·“ලක à¶±à·à¶¸à¶º (à¶Š-à¶­à·à¶´à·‘à¶½)"</string>
+ <string name="kg_login_password_hint" msgid="9057289103827298549">"මුරපදය"</string>
+ <string name="kg_login_submit_button" msgid="5355904582674054702">"පුරනය වන්න"</string>
+ <string name="kg_login_invalid_input" msgid="5754664119319872197">"වලංගු නොවන පරිà·à·“ලක à¶±à·à¶¸à¶ºà¶šà·Š හ෠මුරපදයක්."</string>
+ <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"ඔබගේ පරිà·à·“ලක à¶±à·à¶¸à¶º හ෠මුරපදය අමතකද?\n "<b>"google.com/accounts/recovery"</b>" වෙත යන්න."</string>
+ <string name="kg_login_checking_password" msgid="1052685197710252395">"ගිණුම පරීක්ෂ෠කරමින්…"</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"ඔබ PIN අංකය <xliff:g id="NUMBER_0">%d</xliff:g> à·€à·à¶»à¶ºà¶šà·Š à·€à·à¶»à¶¯à·’යට ටයිප් කොට ඇත.\n\n à¶­à¶­à·Šà¶´à¶» <xliff:g id="NUMBER_1">%d</xliff:g> à¶šà·Š ඇතුළත à¶±à·à·€à¶­ à¶‹à¶­à·Šà·ƒà·à·„ කරන්න."</string>
+ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"<xliff:g id="NUMBER_0">%d</xliff:g> වතà·à·€à¶šà·Š ඔබගේ මුරපදය ඔබ à·€à·à¶»à¶¯à·’යට ටයිප් à¶šà¶» ඇත. \n\nà¶­à¶­à·Šà¶´à¶» <xliff:g id="NUMBER_1">%d</xliff:g> à¶§ පසුව à¶±à·à·€à¶­ උත්සහ කරන්න."</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"ඔබ <xliff:g id="NUMBER_0">%d</xliff:g> à·€à·à¶»à¶ºà¶šà·Š අගුළු ඇරීමේ රටà·à·€ à·€à·à¶»à¶¯à·’යට ඇඳ ඇත. \n\nà¶­à¶­à·Šà¶´à¶» <xliff:g id="NUMBER_1">%d</xliff:g> à¶šà·Š ඇතුළත à¶±à·à·€à¶­ à¶‹à¶­à·Šà·ƒà·à·„ කරන්න."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1575557200627128949">"ඔබ à¶§à·à¶¶à·Šà¶½à¶§à¶º අගුළු à·„à·à¶»à·“මට à·€à·à¶»à¶¯à·’යට අවස්ථ෠<xliff:g id="NUMBER_0">%d</xliff:g> à¶šà·Š à¶‹à¶­à·Šà·ƒà·à·„ à¶šà¶» ඇත. අවස්ථ෠<xliff:g id="NUMBER_1">%d</xliff:g> à¶šà·Š à¶…à·ƒà·à¶»à·Šà¶®à¶šà·€ උත්සහ කිරීමකින් පසුව, කර්මà·à¶±à·Šà¶­ à·à·à¶½à· මුල් තත්වයට à¶±à·à·€à¶­ à¶´à¶­à·Š වන à¶…à¶­à¶» සියලු පරිà·à·“ලක දත්ත à¶±à·à¶­à·’ වෙයි."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="4051015943038199910">"ඔබ දුරකථනය අගුළු ඇරීමට à·€à·à¶» <xliff:g id="NUMBER_0">%d</xliff:g> කදී à·€à·à¶»à¶¯à·“ à¶´à·Šâ€à¶»à¶ºà¶­à·Šà¶±à¶ºà¶±à·Š ගෙන à¶­à·’à¶¶à·š. තවත් à¶…à·ƒà·à¶»à·Šà¶®à¶š à¶´à·Šâ€à¶»à¶ºà¶­à·Šà¶± <xliff:g id="NUMBER_1">%d</xliff:g> කින් පසුව, දුරකථනය කර්මà·à¶±à·Šà¶­ à·à·à¶½à·à·€à·š සුපුරුද්දට යළි පිහිටුවන à¶…à¶­à¶» සියලුම පරිà·à·“ලක දත්ත à¶±à·à¶­à·’ වී යයි."</string>
+ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="2072996269148483637">"à¶§à·à¶¶à·Šà¶½à¶§à¶ºà·š අගුළු ඇරීමට ඔබ à·€à·à¶»à¶¯à·’ à¶´à·Šâ€à¶»à¶ºà¶­à·Šà¶± <xliff:g id="NUMBER">%d</xliff:g> à·€à·à¶»à¶ºà¶šà·Š ගෙන ඇත. දà·à¶±à·Š à¶§à·à¶¶à·Šà¶½à¶§à¶º කර්මà·à¶±à·Šà¶­ à·à·à¶½à· සුපුරුද්ද වෙත යළි පිහිටුවීම කෙරේ."</string>
+ <string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"ඔබ දුරකථනය අගුළු ඇරීමට à·€à·à¶» <xliff:g id="NUMBER">%d</xliff:g> කදී à·€à·à¶»à¶¯à·“ à¶´à·Šâ€à¶»à¶ºà¶±à·Šà¶­à¶ºà¶±à·Š ගෙන à¶­à·’à¶¶à·š. දà·à¶±à·Š දුරකථනය කර්මà·à¶±à·Šà¶­à·à·à¶½à· සුපුරුද්දට පිහිටුවනු ලබයි."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"ඔබ අගුළු ඇරිමේ රටà·à·€ <xliff:g id="NUMBER_0">%d</xliff:g> වතà·à·€à¶šà·Š à·€à·à¶»à¶¯à·’යට ඇඳ ඇත. තවත් à¶…à·ƒà·à¶»à·Šà¶®à¶š à¶‹à¶­à·Šà·ƒà·à·„ <xliff:g id="NUMBER_1">%d</xliff:g> කින් පසුව, à¶Š-à¶­à·à¶´à·à¶½à·Š ගිණුම à¶·à·à·€à·’ත෠කරමින් ඔබගේ à¶§à·à¶¶à·Šà¶½à¶§à¶ºà·š අගුළු ඇරීමට ඔබට පවසනු ඇත.\n\n à¶±à·à·€à¶­ à¶­à¶­à·Šà¶´à¶» <xliff:g id="NUMBER_2">%d</xliff:g> කින් à¶‹à¶­à·Šà·ƒà·à·„ කරන්න."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"ඔබ à·€à·à¶»à¶¯à·’යට <xliff:g id="NUMBER_0">%d</xliff:g> වතà·à·€à¶šà·Š ඔබගේ අගුළු à·„à·à¶»à·“මේ රටà·à·€ ඇඳ ඇත. à¶…à·ƒà·à¶»à·Šà¶®à¶š උත්සහ කිරීම් <xliff:g id="NUMBER_1">%d</xliff:g> න් පසුව, ඔබගේ à¶Š-à¶­à·à¶´à·à¶½à·Š ලිපිනය à¶·à·à·€à·’තයෙන් ඔබගේ දුරකථනය අගුළු à·„à·à¶»à·“මට ඔබගෙන් අසයි.\n\n à¶­à¶­à·Šà¶´à¶» <xliff:g id="NUMBER_2">%d</xliff:g> න් පසුව à¶±à·à·€à¶­ උත්සහ කරන්න."</string>
+ <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
+ <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"ඉවත් කරන්න"</string>
+ <string name="safe_media_volume_warning" product="default" msgid="7324161939475478066">"නිර්දේà·à·’à¶­ මට්ටමෙන් ඉහළට à·à¶¶à·Šà¶¯à¶º à·€à·à¶©à·’ කරනවද?\nà·€à·à¶©à·’ à¶šà·à¶½à¶ºà¶šà·Š ඉහළ à·à¶¶à·Šà¶¯à¶ºà¶šà·Š à·à·Šâ€à¶»à·€à¶±à¶º කිරීමෙන් ඔබගේ à·à·Šâ€à¶»à·€à¶±à¶ºà¶§ à·„à·à¶±à·’ විය à·„à·à¶š."</string>
+ <string name="continue_to_enable_accessibility" msgid="1626427372316070258">"à¶´à·Šâ€à¶»à·€à·šà·à·Šâ€à¶ºà¶­à·à·€à¶º සබල කිරීමට ඇඟිලි දෙකක් à¶´à·„à·…à¶§ රඳව෠සිටින්න."</string>
+ <string name="accessibility_enabled" msgid="1381972048564547685">"à¶´â€à·Šâ€à¶»à·€à·šà·à·Šâ€à¶ºà¶­à·à·€ සබල කරන ලදි."</string>
+ <string name="enable_accessibility_canceled" msgid="3833923257966635673">"à¶´â€à·Šâ€à¶»à·€à·šà·à·Šâ€à¶ºà¶­à·à·€ අවලංගු à¶šà¶» ඇත."</string>
+ <string name="user_switched" msgid="3768006783166984410">"දà·à¶±à¶§ සිටින පරිà·à·“ලකය෠<xliff:g id="NAME">%1$s</xliff:g>."</string>
+ <string name="owner_name" msgid="2716755460376028154">"හිමිකරු"</string>
+ <string name="error_message_title" msgid="4510373083082500195">"දà·à·‚ය"</string>
+ <string name="app_no_restricted_accounts" msgid="5739463249673727736">"සීම෠සහිත à¶´à·à¶­à·’à¶šà¶© සඳහ෠වන ගිණුම් වෙත මෙම යෙදුම සහය නොදක්වයි"</string>
+ <string name="app_not_found" msgid="3429141853498927379">"මෙම à¶šà·Šâ€à¶»à·’යà·à·€ හසුරුවීමට යෙදුමක් සොයà·à¶œà¶­à·Šà¶­à·š à¶±à·à¶­"</string>
+ <string name="revoke" msgid="5404479185228271586">"à¶…à·„à·à·ƒà·’ කරන්න"</string>
+ <string name="mediaSize_iso_a0" msgid="7875427489420821793">"ISO A0"</string>
+ <string name="mediaSize_iso_a1" msgid="3760734499050875356">"ISO A1"</string>
+ <string name="mediaSize_iso_a2" msgid="5973266378020144382">"ISO A2"</string>
+ <string name="mediaSize_iso_a3" msgid="1373407105687300884">"ISO A3"</string>
+ <string name="mediaSize_iso_a4" msgid="6689772807982597254">"ISO A4"</string>
+ <string name="mediaSize_iso_a5" msgid="5353549652015741040">"ISO A5"</string>
+ <string name="mediaSize_iso_a6" msgid="8585038048674911907">"ISO A6"</string>
+ <string name="mediaSize_iso_a7" msgid="6641836716963839119">"ISO A7"</string>
+ <string name="mediaSize_iso_a8" msgid="7571139437465693355">"ISO A8"</string>
+ <string name="mediaSize_iso_a9" msgid="1378455891957115079">"ISO A9"</string>
+ <string name="mediaSize_iso_a10" msgid="2480747457429475344">"ISO A10"</string>
+ <string name="mediaSize_iso_b0" msgid="3965935097661108039">"ISO B0"</string>
+ <string name="mediaSize_iso_b1" msgid="2505753285010115437">"ISO B1"</string>
+ <string name="mediaSize_iso_b2" msgid="8763874709859458453">"ISO B2"</string>
+ <string name="mediaSize_iso_b3" msgid="4210506688191764076">"ISO B3"</string>
+ <string name="mediaSize_iso_b4" msgid="5749404165888526034">"ISO B4"</string>
+ <string name="mediaSize_iso_b5" msgid="7640627414621904733">"ISO B5"</string>
+ <string name="mediaSize_iso_b6" msgid="7342988864712748544">"ISO B6"</string>
+ <string name="mediaSize_iso_b7" msgid="5069844065235382429">"ISO B7"</string>
+ <string name="mediaSize_iso_b8" msgid="7316818922278779774">"ISO B8"</string>
+ <string name="mediaSize_iso_b9" msgid="5414727094026532341">"ISO B9"</string>
+ <string name="mediaSize_iso_b10" msgid="5251253731832048185">"ISO B10"</string>
+ <string name="mediaSize_iso_c0" msgid="4003138342671964217">"ISO C0"</string>
+ <string name="mediaSize_iso_c1" msgid="1935188063393553008">"ISO C1"</string>
+ <string name="mediaSize_iso_c2" msgid="3197307969712069904">"ISO C2"</string>
+ <string name="mediaSize_iso_c3" msgid="4335826087321913508">"ISO C3"</string>
+ <string name="mediaSize_iso_c4" msgid="3745639598281015005">"ISO C4"</string>
+ <string name="mediaSize_iso_c5" msgid="8269457765822791013">"ISO C5"</string>
+ <string name="mediaSize_iso_c6" msgid="566666105260346930">"ISO C6"</string>
+ <string name="mediaSize_iso_c7" msgid="8678413180782608498">"ISO C7"</string>
+ <string name="mediaSize_iso_c8" msgid="8392376206627041730">"ISO C8"</string>
+ <string name="mediaSize_iso_c9" msgid="9191613372324845405">"ISO C9"</string>
+ <string name="mediaSize_iso_c10" msgid="7327709699184920822">"ISO C10"</string>
+ <string name="mediaSize_na_letter" msgid="4191805615829472953">"අකුරු"</string>
+ <string name="mediaSize_na_gvrnmt_letter" msgid="7853382192649405507">"රජයේ ලිපිය"</string>
+ <string name="mediaSize_na_legal" msgid="6697982988283823150">"නීත්â€à¶ºà¶±à·”à¶šà·–à¶½"</string>
+ <string name="mediaSize_na_junior_legal" msgid="3727743969902758948">"à¶´à·Šâ€à¶»à·à¶®à¶¸à·’à¶š නීතිමය"</string>
+ <string name="mediaSize_na_ledger" msgid="281871464896601236">"ලෙජරය"</string>
+ <string name="mediaSize_na_tabloid" msgid="5775966416333578127">"කුඩ෠පුවත්පත"</string>
+ <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"අවලංගු කරන ලදි"</string>
+ <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"අන්තර්ගතය ලිවීමේදී දà·à·‚යකි"</string>
+ <string name="restr_pin_enter_pin" msgid="3395953421368476103">"PIN එක ඇතුළු කරන්න"</string>
+ <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"වත්මන් PIN"</string>
+ <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"නව PIN"</string>
+ <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"නව PIN තහවුරු කරන්න"</string>
+ <string name="restr_pin_create_pin" msgid="8017600000263450337">"සිම෠වà·à¶©à·’දියුණු කිරීමට PIN à·ƒà·à¶¯à¶±à·Šà¶±"</string>
+ <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"PIN නොගà·à·…පෙයි. à¶±à·à·€à¶­ උත්සහ කරන්න."</string>
+ <string name="restr_pin_error_too_short" msgid="8173982756265777792">"PIN කුඩ෠වà·à¶©à·’ය. ඉලක්කම් 4 වත් විය යුතුය."</string>
+ <plurals name="restr_pin_countdown">
+ <item quantity="one" msgid="4835639969503729874">"à·€à·à¶»à¶¯à·’ PIN. තත්පරයකින් à¶±à·à·€à¶­ උත්සහ කරන්න."</item>
+ <item quantity="other" msgid="8030607343223287654">"à·€à·à¶»à¶¯à·’ PIN. à¶­à¶­à·Šà¶´à¶» <xliff:g id="COUNT">%d</xliff:g> කින් à¶±à·à·€à¶­ උත්සහ කරන්න."</item>
+ </plurals>
+ <string name="transient_navigation_confirmation" msgid="4907844043611123426">"තීරුව à¶…à¶±à·à·€à¶»à¶«à¶ºà¶§ තිරයේ කෙලවර අදින්න"</string>
+ <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"පද්ධති තීරුව à¶…à¶±à·à·€à¶»à¶«à¶ºà¶§ තිරයේ කෙලවරින් අදින්න"</string>
+</resources>
diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml
index cd865aa..12acaad 100644
--- a/core/res/res/values-sk/strings.xml
+++ b/core/res/res/values-sk/strings.xml
@@ -50,6 +50,11 @@
<string name="invalidPuk" msgid="8761456210898036513">"Zadajte kód PUK, ktorý má 8 alebo viac Äísel."</string>
<string name="needPuk" msgid="919668385956251611">"Karta SIM je uzamknutá pomocou kódu PUK. Odomknite ju zadaním kódu PUK."</string>
<string name="needPuk2" msgid="4526033371987193070">"Ak chcete odblokovať kartu SIM, zadajte kód PUK2."</string>
+ <string name="enablePin" msgid="209412020907207950">"Neúspešné, povoľte uzamknutie SIM/RUIM."</string>
+ <plurals name="pinpuk_attempts">
+ <item quantity="one" msgid="6596245285809790142">"Zostáva vám <xliff:g id="NUMBER">%d</xliff:g> pokus, než sa vaša karta SIM uzamkne."</item>
+ <item quantity="other" msgid="7530597808358774740">"PoÄet zostávajúcich pokusov pred uzamknutím karty SIM: <xliff:g id="NUMBER">%d</xliff:g>."</item>
+ </plurals>
<string name="imei" msgid="2625429890869005782">"IMEI"</string>
<string name="meid" msgid="4841221237681254195">"MEID"</string>
<string name="ClipMmi" msgid="6952821216480289285">"Prichádzajúca identifikácia volajúceho"</string>
@@ -477,6 +482,8 @@
<string name="permdesc_accessSurfaceFlinger" msgid="1041619516733293551">"Umožňuje aplikácii používať funkcie nízkej úrovne aplikácie SurfaceFlinger."</string>
<string name="permlab_readFrameBuffer" msgid="6690504248178498136">"Äítanie vyrovnávacej pamäte snímok"</string>
<string name="permdesc_readFrameBuffer" msgid="4937405521809454680">"Umožňuje aplikácii ÄítaÅ¥ obsah vyrovnávacej pamäte snímok."</string>
+ <string name="permlab_accessInputFlinger" msgid="5348635270689553857">"prístup k aplikácii InputFlinger"</string>
+ <string name="permdesc_accessInputFlinger" msgid="2104864941201226616">"Umožňuje aplikácii používať funkcie nízkej úrovne aplikácie InputFlinger."</string>
<string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"konfigurovať displeje cez sieť Wi-Fi"</string>
<string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"Umožňuje aplikácii konfigurovať displeje a pripojiť sa k nim cez siete Wi-Fi."</string>
<string name="permlab_controlWifiDisplay" msgid="393641276723695496">"ovládať displeje cez sieť Wi-Fi"</string>
@@ -1414,6 +1421,7 @@
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
<string name="activitychooserview_choose_application" msgid="2125168057199941199">"Zvoľte aplikáciu"</string>
+ <string name="activitychooserview_choose_application_error" msgid="8624618365481126668">"Aplikáciu <xliff:g id="APPLICATION_NAME">%s</xliff:g> nie je možné spustiť"</string>
<string name="shareactionprovider_share_with" msgid="806688056141131819">"Zdieľať s"</string>
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Zdieľať s aplikáciou <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Posuvné tlaÄidlo. Dotknite sa a podržte."</string>
@@ -1649,5 +1657,16 @@
<item quantity="other" msgid="4730868920742952817">"Skúste to zas o <xliff:g id="COUNT">%d</xliff:g> s"</item>
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Skúste to znova neskôr"</string>
- <string name="immersive_mode_confirmation" msgid="7227416894979047467">"Režim celej obraz. ukonÄíte posunutím nadol"</string>
+ <string name="immersive_mode_confirmation" msgid="7227416894979047467">"Režim celej obrazovky ukonÄíte posunutím nadol."</string>
+ <string name="done_label" msgid="2093726099505892398">"Hotovo"</string>
+ <string name="hour_picker_description" msgid="6698199186859736512">"Kruhový posúvaÄ hodín"</string>
+ <string name="minute_picker_description" msgid="8606010966873791190">"Kruhový posúvaÄ minút"</string>
+ <string name="select_hours" msgid="6043079511766008245">"Vyberte hodiny"</string>
+ <string name="select_minutes" msgid="3974345615920336087">"Vyberte minúty"</string>
+ <string name="day_picker_description" msgid="8990847925961297968">"Tabuľka dní v mesiaci"</string>
+ <string name="year_picker_description" msgid="5524331207436052403">"Zoznam rokov"</string>
+ <string name="select_day" msgid="7774759604701773332">"Vyberte mesiac a deň"</string>
+ <string name="select_year" msgid="7952052866994196170">"Vyberte rok"</string>
+ <string name="item_is_selected" msgid="949687401682476608">"Bola vybratá položka <xliff:g id="ITEM">%1$s</xliff:g>"</string>
+ <string name="deleted_key" msgid="7659477886625566590">"Číslo <xliff:g id="KEY">%1$s</xliff:g> bolo odstránené"</string>
</resources>
diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml
index 43da811..454db73 100644
--- a/core/res/res/values-sl/strings.xml
+++ b/core/res/res/values-sl/strings.xml
@@ -50,6 +50,11 @@
<string name="invalidPuk" msgid="8761456210898036513">"Vnesite 8- ali veÄ mestni PUK."</string>
<string name="needPuk" msgid="919668385956251611">"Kartica SIM je zaklenjena s kodo PUK. Če jo želite odkleniti, vnesite kodo PUK."</string>
<string name="needPuk2" msgid="4526033371987193070">"Če želite odstraniti blokiranje kartice SIM, vnesite PUK2."</string>
+ <string name="enablePin" msgid="209412020907207950">"Ni uspelo. OmogoÄite zaklepanje kartice SIM/RUIM."</string>
+ <plurals name="pinpuk_attempts">
+ <item quantity="one" msgid="6596245285809790142">"Na voljo imate še <xliff:g id="NUMBER">%d</xliff:g> poskus. Potem se bo kartica SIM zaklenila."</item>
+ <item quantity="other" msgid="7530597808358774740">"Poskusite lahko še <xliff:g id="NUMBER">%d</xliff:g>-krat. Potem se bo kartica SIM zaklenila."</item>
+ </plurals>
<string name="imei" msgid="2625429890869005782">"IMEI"</string>
<string name="meid" msgid="4841221237681254195">"MEID"</string>
<string name="ClipMmi" msgid="6952821216480289285">"ID dohodnega klicatelja"</string>
@@ -477,6 +482,8 @@
<string name="permdesc_accessSurfaceFlinger" msgid="1041619516733293551">"Programu omogoÄa uporabo funkcij nizke ravni SurfaceFlinger."</string>
<string name="permlab_readFrameBuffer" msgid="6690504248178498136">"branje grafiÄnega/slikovnega medpomnilnika"</string>
<string name="permdesc_readFrameBuffer" msgid="4937405521809454680">"Programu omogoÄa branje vsebine grafiÄnega/slikovnega medpomnilnika."</string>
+ <string name="permlab_accessInputFlinger" msgid="5348635270689553857">"dostop do funkcij InputFlinger"</string>
+ <string name="permdesc_accessInputFlinger" msgid="2104864941201226616">"Aplikaciji dovoljuje uporabo funkcij InputFlinger nizke ravni."</string>
<string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"konfiguriranje zaslonov Wi-Fi"</string>
<string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"OmogoÄa aplikaciji konfiguriranje zaslonov Wi-Fi in povezovanje z njimi."</string>
<string name="permlab_controlWifiDisplay" msgid="393641276723695496">"nadzor zaslonov Wi-Fi"</string>
@@ -1414,6 +1421,7 @@
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Tipka Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Tipka Enter"</string>
<string name="activitychooserview_choose_application" msgid="2125168057199941199">"Izberite program"</string>
+ <string name="activitychooserview_choose_application_error" msgid="8624618365481126668">"Aplikacije <xliff:g id="APPLICATION_NAME">%s</xliff:g> ni bilo mogoÄe zagnati"</string>
<string name="shareactionprovider_share_with" msgid="806688056141131819">"Delite z"</string>
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Delite s programom <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Drsna roÄica. Dotaknite se in pridržite."</string>
@@ -1650,4 +1658,15 @@
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Poskusite znova pozneje"</string>
<string name="immersive_mode_confirmation" msgid="7227416894979047467">"Povlecite z vrha, da zaprete celozaslonski naÄin."</string>
+ <string name="done_label" msgid="2093726099505892398">"DokonÄano"</string>
+ <string name="hour_picker_description" msgid="6698199186859736512">"Okrogli drsnik za ure"</string>
+ <string name="minute_picker_description" msgid="8606010966873791190">"Okrogli drsnik za minute"</string>
+ <string name="select_hours" msgid="6043079511766008245">"Izberite ure"</string>
+ <string name="select_minutes" msgid="3974345615920336087">"Izberite minute"</string>
+ <string name="day_picker_description" msgid="8990847925961297968">"MeseÄna mreža dni"</string>
+ <string name="year_picker_description" msgid="5524331207436052403">"Seznam let"</string>
+ <string name="select_day" msgid="7774759604701773332">"Izberite mesec in dan"</string>
+ <string name="select_year" msgid="7952052866994196170">"Izberite leto"</string>
+ <string name="item_is_selected" msgid="949687401682476608">"Izbrano: <xliff:g id="ITEM">%1$s</xliff:g>"</string>
+ <string name="deleted_key" msgid="7659477886625566590">"Å tevilka <xliff:g id="KEY">%1$s</xliff:g> je izbrisana"</string>
</resources>
diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml
index 14b22cc..4829d6d 100644
--- a/core/res/res/values-sr/strings.xml
+++ b/core/res/res/values-sr/strings.xml
@@ -50,6 +50,11 @@
<string name="invalidPuk" msgid="8761456210898036513">"УнеÑите PUK који Ñе ÑаÑтоји од 8 цифара или више."</string>
<string name="needPuk" msgid="919668385956251611">"SIM картица је закључана PUK кодом. УнеÑите PUK кôд да биÑте је откључали."</string>
<string name="needPuk2" msgid="4526033371987193070">"УнеÑите PUK2 да биÑте деблокирали SIM картицу."</string>
+ <string name="enablePin" msgid="209412020907207950">"Ðије уÑпело. Омогућите закључавање SIM/RUIM картице."</string>
+ <plurals name="pinpuk_attempts">
+ <item quantity="one" msgid="6596245285809790142">"Имате још <xliff:g id="NUMBER">%d</xliff:g> покушај пре него што Ñе SIM картица закључа."</item>
+ <item quantity="other" msgid="7530597808358774740">"Имате још <xliff:g id="NUMBER">%d</xliff:g> покушаја пре него што Ñе SIM картица закључа."</item>
+ </plurals>
<string name="imei" msgid="2625429890869005782">"IMEI"</string>
<string name="meid" msgid="4841221237681254195">"MEID"</string>
<string name="ClipMmi" msgid="6952821216480289285">"Долазни ИД позиваоца"</string>
@@ -477,6 +482,8 @@
<string name="permdesc_accessSurfaceFlinger" msgid="1041619516733293551">"Дозвољава апликацији да кориÑти SurfaceFlinger функције ниÑког нивоа."</string>
<string name="permlab_readFrameBuffer" msgid="6690504248178498136">"читање бафера кадрова"</string>
<string name="permdesc_readFrameBuffer" msgid="4937405521809454680">"Дозвољава апликацији да чита Ñадржај међумеморије кадрова."</string>
+ <string name="permlab_accessInputFlinger" msgid="5348635270689553857">"приÑтуп InputFlinger функцијама"</string>
+ <string name="permdesc_accessInputFlinger" msgid="2104864941201226616">"Дозвољава апликацији да кориÑти InputFlinger функције ниÑког нивоа."</string>
<string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"конфигуриÑање Wi-Fi екрана"</string>
<string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"Дозвољава апликацији да конфигурише Wi-Fi екране и повезује Ñе Ñа њима."</string>
<string name="permlab_controlWifiDisplay" msgid="393641276723695496">"контрола Wi-Fi екрана"</string>
@@ -1414,6 +1421,7 @@
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
<string name="activitychooserview_choose_application" msgid="2125168057199941199">"Изаберите апликацију"</string>
+ <string name="activitychooserview_choose_application_error" msgid="8624618365481126668">"Ðије могуће покренути <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="shareactionprovider_share_with" msgid="806688056141131819">"Дели Ñа"</string>
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Дели Ñа апликацијом <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Клизна ручица. Додирните и задржите."</string>
@@ -1650,4 +1658,15 @@
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Покушајте поново каÑније"</string>
<string name="immersive_mode_confirmation" msgid="7227416894979047467">"Превуците прÑтом одозго надоле да биÑте изашли из целог екрана."</string>
+ <string name="done_label" msgid="2093726099505892398">"Готово"</string>
+ <string name="hour_picker_description" msgid="6698199186859736512">"Кружни клизач за Ñате"</string>
+ <string name="minute_picker_description" msgid="8606010966873791190">"Кружни клизач за минуте"</string>
+ <string name="select_hours" msgid="6043079511766008245">"Изаберите Ñате"</string>
+ <string name="select_minutes" msgid="3974345615920336087">"Изаберите минуте"</string>
+ <string name="day_picker_description" msgid="8990847925961297968">"Приказ дана у меÑецу у виду мреже"</string>
+ <string name="year_picker_description" msgid="5524331207436052403">"ЛиÑта година"</string>
+ <string name="select_day" msgid="7774759604701773332">"Изаберите меÑец и дан"</string>
+ <string name="select_year" msgid="7952052866994196170">"Изаберите годину"</string>
+ <string name="item_is_selected" msgid="949687401682476608">"Изабрали Ñте <xliff:g id="ITEM">%1$s</xliff:g>"</string>
+ <string name="deleted_key" msgid="7659477886625566590">"ИзбриÑали Ñте <xliff:g id="KEY">%1$s</xliff:g>"</string>
</resources>
diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml
index aa20a64..2276c97 100644
--- a/core/res/res/values-sv/strings.xml
+++ b/core/res/res/values-sv/strings.xml
@@ -50,6 +50,11 @@
<string name="invalidPuk" msgid="8761456210898036513">"Ange en PUK-kod med minst 8 siffror."</string>
<string name="needPuk" msgid="919668385956251611">"Ditt SIM-kort är PUK-låst. Ange PUK-koden om du vill låsa upp det."</string>
<string name="needPuk2" msgid="4526033371987193070">"Ange PUK2-koden för att häva spärren av SIM-kortet."</string>
+ <string name="enablePin" msgid="209412020907207950">"Försöket misslyckades. Aktivera SIM-/RUIM-lås."</string>
+ <plurals name="pinpuk_attempts">
+ <item quantity="one" msgid="6596245285809790142">"Du har <xliff:g id="NUMBER">%d</xliff:g> försök kvar innan SIM-kortet låses."</item>
+ <item quantity="other" msgid="7530597808358774740">"Du har <xliff:g id="NUMBER">%d</xliff:g> försök kvar innan SIM-kortet låses."</item>
+ </plurals>
<string name="imei" msgid="2625429890869005782">"IMEI-kod"</string>
<string name="meid" msgid="4841221237681254195">"MEID"</string>
<string name="ClipMmi" msgid="6952821216480289285">"Nummerpresentatör för inkommande samtal"</string>
@@ -477,6 +482,8 @@
<string name="permdesc_accessSurfaceFlinger" msgid="1041619516733293551">"Tillåter att appen använder lågnivåfunktioner i SurfaceFlinger."</string>
<string name="permlab_readFrameBuffer" msgid="6690504248178498136">"läsa rambuffert"</string>
<string name="permdesc_readFrameBuffer" msgid="4937405521809454680">"Tillåter att appen läser innehållet i rambufferten."</string>
+ <string name="permlab_accessInputFlinger" msgid="5348635270689553857">"få tillgång till InputFlinger"</string>
+ <string name="permdesc_accessInputFlinger" msgid="2104864941201226616">"Tillåter att appen använder lågnivåfunktioner i InputFlinger."</string>
<string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"konfigurerar Wi-Fi-skärmar"</string>
<string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"Tillåter att appen konfigurerar och ansluter till Wi-Fi-skärmar."</string>
<string name="permlab_controlWifiDisplay" msgid="393641276723695496">"kontrollerar Wi-Fi-skärmar"</string>
@@ -1414,6 +1421,7 @@
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Skift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Retur"</string>
<string name="activitychooserview_choose_application" msgid="2125168057199941199">"Välj en app"</string>
+ <string name="activitychooserview_choose_application_error" msgid="8624618365481126668">"Det gick inte att starta <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="shareactionprovider_share_with" msgid="806688056141131819">"Dela med"</string>
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Dela med <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Skärmlåsfunktion. Tryck och dra."</string>
@@ -1650,4 +1658,15 @@
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Försök igen senare"</string>
<string name="immersive_mode_confirmation" msgid="7227416894979047467">"Dra nedåt om du vill avbryta fullskärmsläget."</string>
+ <string name="done_label" msgid="2093726099505892398">"Klart"</string>
+ <string name="hour_picker_description" msgid="6698199186859736512">"Cirkelreglage för timmar"</string>
+ <string name="minute_picker_description" msgid="8606010966873791190">"Cirkelreglage för minuter"</string>
+ <string name="select_hours" msgid="6043079511766008245">"Välj timmar"</string>
+ <string name="select_minutes" msgid="3974345615920336087">"Välj minuter"</string>
+ <string name="day_picker_description" msgid="8990847925961297968">"Rutnät för månad"</string>
+ <string name="year_picker_description" msgid="5524331207436052403">"Lista över år"</string>
+ <string name="select_day" msgid="7774759604701773332">"Välj månad och dag"</string>
+ <string name="select_year" msgid="7952052866994196170">"Välj år"</string>
+ <string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> har markerats"</string>
+ <string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> har tagits bort"</string>
</resources>
diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml
index b066758..1291893 100644
--- a/core/res/res/values-sw/strings.xml
+++ b/core/res/res/values-sw/strings.xml
@@ -50,6 +50,11 @@
<string name="invalidPuk" msgid="8761456210898036513">"Andika PUK ambayo ina urefu wa nambari 8 au zaidi."</string>
<string name="needPuk" msgid="919668385956251611">"Kadi yako ya SIM imefungwa na PUK. Anika msimbo wa PUK ili kuifungua."</string>
<string name="needPuk2" msgid="4526033371987193070">"Chapisha PUK2 ili kufungua SIM kadi."</string>
+ <string name="enablePin" msgid="209412020907207950">"Imeshindwa, washa ufungaji wa SIM/RUIM."</string>
+ <plurals name="pinpuk_attempts">
+ <item quantity="one" msgid="6596245285809790142">"Umesalia na majaribio <xliff:g id="NUMBER">%d</xliff:g> kabla ya SIM kufungwa."</item>
+ <item quantity="other" msgid="7530597808358774740">"Umesalia na majaribio <xliff:g id="NUMBER">%d</xliff:g> kabla ya SIM kufungwa."</item>
+ </plurals>
<string name="imei" msgid="2625429890869005782">"IMEI"</string>
<string name="meid" msgid="4841221237681254195">"MEID"</string>
<string name="ClipMmi" msgid="6952821216480289285">"Kitambulisho cha Mpigaji wa Simu Inayoingia"</string>
@@ -477,6 +482,8 @@
<string name="permdesc_accessSurfaceFlinger" msgid="1041619516733293551">"Inaruhusu programu kutumia vipengee vya kiwango cha chini vya SurfaceFlinger."</string>
<string name="permlab_readFrameBuffer" msgid="6690504248178498136">"soma bafa ya fremu"</string>
<string name="permdesc_readFrameBuffer" msgid="4937405521809454680">"Inaruhusu programu kusoma maudhui ya fremu ya bafa."</string>
+ <string name="permlab_accessInputFlinger" msgid="5348635270689553857">"fikia InputFlinger"</string>
+ <string name="permdesc_accessInputFlinger" msgid="2104864941201226616">"Inaruhusu programu kutumia vipengele vya chini vya InputFlinger."</string>
<string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"sanidi maonyesho ya Wifi"</string>
<string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"Inaruhusu programu kusanidi na kuunganika kwenye maonyesho ya Wifi."</string>
<string name="permlab_controlWifiDisplay" msgid="393641276723695496">"dhibiti maonyesho ya Wifi"</string>
@@ -551,7 +558,7 @@
<string name="permlab_readPhoneState" msgid="9178228524507610486">"kusoma hali na kitambulisho cha simu"</string>
<string name="permdesc_readPhoneState" msgid="1639212771826125528">"Inaruhusu programu kufikia vipengele vya simu vya kifaa. Idhini hii inaruhusu programu kutambua nambari ya simu na kifaa, kama simu ni amilifu, na nambari ya mbali iliyounganishwa kwa simu."</string>
<string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"zuia kompyuta ndogo dhidi ya kulala"</string>
- <string name="permlab_wakeLock" product="default" msgid="573480187941496130">"zuia simu dhidi ya kulala"</string>
+ <string name="permlab_wakeLock" product="default" msgid="573480187941496130">"kuzuia simu isilale"</string>
<string name="permdesc_wakeLock" product="tablet" msgid="7311319824400447868">"Inaruhusu programu kuzuia kompyuta kibao kwenda kulala."</string>
<string name="permdesc_wakeLock" product="default" msgid="8559100677372928754">"Inaruhusu programu kuzuia simu isiende kulala."</string>
<string name="permlab_transmitIr" msgid="7545858504238530105">"sambaza infrared"</string>
@@ -1414,6 +1421,7 @@
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Songa"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
<string name="activitychooserview_choose_application" msgid="2125168057199941199">"Chagua programu"</string>
+ <string name="activitychooserview_choose_application_error" msgid="8624618365481126668">"Haikuweza kuzindua <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="shareactionprovider_share_with" msgid="806688056141131819">"Shiriki na"</string>
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Shiriki na <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Utambo unaosonga. Gusa &amp; shika"</string>
@@ -1649,5 +1657,16 @@
<item quantity="other" msgid="4730868920742952817">"Jaribu tena baada ya sekunde <xliff:g id="COUNT">%d</xliff:g>"</item>
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Jaribu tena baadaye"</string>
- <string name="immersive_mode_confirmation" msgid="7227416894979047467">"Telezesha kidole kwa kasi chini kuanzia juu ili uondoke kwenye skrini kamili"</string>
+ <string name="immersive_mode_confirmation" msgid="7227416894979047467">"Telezesha kidole kwa kasi chini kuanzia juu ili uondoke kwenye skrini zima."</string>
+ <string name="done_label" msgid="2093726099505892398">"Imekamilika"</string>
+ <string name="hour_picker_description" msgid="6698199186859736512">"Kitelezi cha mviringo wa saa"</string>
+ <string name="minute_picker_description" msgid="8606010966873791190">"Kitelezi cha mviringo wa dakika"</string>
+ <string name="select_hours" msgid="6043079511766008245">"Chagua saa"</string>
+ <string name="select_minutes" msgid="3974345615920336087">"Chagua dakika"</string>
+ <string name="day_picker_description" msgid="8990847925961297968">"Gridi ya mwezi ya siku"</string>
+ <string name="year_picker_description" msgid="5524331207436052403">"Orodha ya miaka"</string>
+ <string name="select_day" msgid="7774759604701773332">"Chagua mwezi na siku"</string>
+ <string name="select_year" msgid="7952052866994196170">"Chagua mwaka"</string>
+ <string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> kimechaguliwa"</string>
+ <string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> kimefutwa"</string>
</resources>
diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml
index 58f5268..64152da 100644
--- a/core/res/res/values-th/strings.xml
+++ b/core/res/res/values-th/strings.xml
@@ -50,6 +50,11 @@
<string name="invalidPuk" msgid="8761456210898036513">"พิมพ์รหัส PUK ซึ่งต้องเป็นตัวเลขอย่างน้อย 8 หลัà¸"</string>
<string name="needPuk" msgid="919668385956251611">"ซิมà¸à¸²à¸£à¹Œà¸”ของคุณถูà¸à¸¥à¹‡à¸­à¸à¸”้วย PUK พิมพ์รหัส PUK เพื่อปลดล็อà¸"</string>
<string name="needPuk2" msgid="4526033371987193070">"พิมพ์ PUK2 เพื่อยà¸à¹€à¸¥à¸´à¸à¸à¸²à¸£à¸›à¸´à¸”à¸à¸±à¹‰à¸™à¸‹à¸´à¸¡à¸à¸²à¸£à¹Œà¸”"</string>
+ <string name="enablePin" msgid="209412020907207950">"ไม่สำเร็จ เปิดใช้à¸à¸²à¸£à¸¥à¹‡à¸­à¸à¸‹à¸´à¸¡/RUIM"</string>
+ <plurals name="pinpuk_attempts">
+ <item quantity="one" msgid="6596245285809790142">"คุณพยายามได้อีภ<xliff:g id="NUMBER">%d</xliff:g> ครั้งà¸à¹ˆà¸­à¸™à¸—ี่ซิมจะถูà¸à¸¥à¹‡à¸­à¸"</item>
+ <item quantity="other" msgid="7530597808358774740">"คุณพยายามได้อีภ<xliff:g id="NUMBER">%d</xliff:g> ครั้งà¸à¹ˆà¸­à¸™à¸—ี่ซิมจะถูà¸à¸¥à¹‡à¸­à¸"</item>
+ </plurals>
<string name="imei" msgid="2625429890869005782">"IMEI"</string>
<string name="meid" msgid="4841221237681254195">"MEID"</string>
<string name="ClipMmi" msgid="6952821216480289285">"หมายเลขผู้โทรเข้า"</string>
@@ -477,6 +482,8 @@
<string name="permdesc_accessSurfaceFlinger" msgid="1041619516733293551">"อนุà¸à¸²à¸•ให้à¹à¸­à¸›à¸žà¸¥à¸´à¹€à¸„ชันใช้คุณลัà¸à¸©à¸“ะระดับต่ำของ SurfaceFlinger"</string>
<string name="permlab_readFrameBuffer" msgid="6690504248178498136">"อ่านเฟรมบัฟเฟอร์"</string>
<string name="permdesc_readFrameBuffer" msgid="4937405521809454680">"อนุà¸à¸²à¸•ให้à¹à¸­à¸›à¸žà¸¥à¸´à¹€à¸„ชันอ่านเนื้อหาในเฟรมบัฟเฟอร์"</string>
+ <string name="permlab_accessInputFlinger" msgid="5348635270689553857">"เข้าถึง InputFlinger"</string>
+ <string name="permdesc_accessInputFlinger" msgid="2104864941201226616">"อนุà¸à¸²à¸•ให้à¹à¸­à¸›à¹ƒà¸Šà¹‰à¸„ุณลัà¸à¸©à¸“ะระดับต่ำของ InputFlinger"</string>
<string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"à¸à¸³à¸«à¸™à¸”ค่าà¸à¸²à¸£à¹à¸ªà¸”งผลด้วย WiFi"</string>
<string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"อนุà¸à¸²à¸•ให้à¹à¸­à¸›à¸à¸³à¸«à¸™à¸”ค่าà¹à¸¥à¸°à¹€à¸Šà¸·à¹ˆà¸­à¸¡à¸•่อà¸à¸±à¸šà¸ˆà¸­à¹à¸ªà¸”งผล WiFi ได้"</string>
<string name="permlab_controlWifiDisplay" msgid="393641276723695496">"ควบคุมà¸à¸²à¸£à¹à¸ªà¸”งผลด้วย WiFi"</string>
@@ -1414,6 +1421,7 @@
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"ป้อน"</string>
<string name="activitychooserview_choose_application" msgid="2125168057199941199">"เลือà¸à¹à¸­à¸›à¸žà¸¥à¸´à¹€à¸„ชัน"</string>
+ <string name="activitychooserview_choose_application_error" msgid="8624618365481126668">"ไม่สามารถเปิด <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="shareactionprovider_share_with" msgid="806688056141131819">"à¹à¸šà¹ˆà¸‡à¸›à¸±à¸™à¸à¸±à¸š"</string>
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"à¹à¸šà¹ˆà¸‡à¸›à¸±à¸™à¸”้วย <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"ที่จับสำหรับเลื่อน à¹à¸•ะค้างไว้"</string>
@@ -1650,4 +1658,15 @@
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"ลองอีà¸à¸„รั้งในภายหลัง"</string>
<string name="immersive_mode_confirmation" msgid="7227416894979047467">"à¸à¸§à¸²à¸”นิ้วจาà¸à¸šà¸™à¸¥à¸‡à¸¥à¹ˆà¸²à¸‡à¹€à¸žà¸·à¹ˆà¸­à¸­à¸­à¸à¸ˆà¸²à¸à¹‚หมดเต็มหน้าจอ"</string>
+ <string name="done_label" msgid="2093726099505892398">"เสร็จสิ้น"</string>
+ <string name="hour_picker_description" msgid="6698199186859736512">"ตัวเลื่อนหมุนระบุชั่วโมง"</string>
+ <string name="minute_picker_description" msgid="8606010966873791190">"ตัวเลื่อนหมุนระบุนาที"</string>
+ <string name="select_hours" msgid="6043079511766008245">"เลือà¸à¸Šà¸±à¹ˆà¸§à¹‚มง"</string>
+ <string name="select_minutes" msgid="3974345615920336087">"เลือà¸à¸™à¸²à¸—ี"</string>
+ <string name="day_picker_description" msgid="8990847925961297968">"ตารางเดือนของวัน"</string>
+ <string name="year_picker_description" msgid="5524331207436052403">"รายà¸à¸²à¸£à¸›à¸µ"</string>
+ <string name="select_day" msgid="7774759604701773332">"เลือà¸à¹€à¸”ือนà¹à¸¥à¸°à¸§à¸±à¸™"</string>
+ <string name="select_year" msgid="7952052866994196170">"เลือà¸à¸›à¸µ"</string>
+ <string name="item_is_selected" msgid="949687401682476608">"เลือภ<xliff:g id="ITEM">%1$s</xliff:g>"</string>
+ <string name="deleted_key" msgid="7659477886625566590">"ลบ <xliff:g id="KEY">%1$s</xliff:g> à¹à¸¥à¹‰à¸§"</string>
</resources>
diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml
index bc396ed..fa9e148 100644
--- a/core/res/res/values-tl/strings.xml
+++ b/core/res/res/values-tl/strings.xml
@@ -50,6 +50,11 @@
<string name="invalidPuk" msgid="8761456210898036513">"Mag-type ng PUK na may 8 numbero o mas mahaba."</string>
<string name="needPuk" msgid="919668385956251611">"Na-PUK-lock ang iyong SIM card. I-type ang PUK code upang i-unlock ito."</string>
<string name="needPuk2" msgid="4526033371987193070">"I-type ang PUK2 upang i-unblock ang SIM card."</string>
+ <string name="enablePin" msgid="209412020907207950">"Hindi matagumpay, i-enable ang SIM/RUIM Lock."</string>
+ <plurals name="pinpuk_attempts">
+ <item quantity="one" msgid="6596245285809790142">"Mayroon kang <xliff:g id="NUMBER">%d</xliff:g> (na) natitirang pagsubok bago ma-lock ang SIM."</item>
+ <item quantity="other" msgid="7530597808358774740">"Mayroon kang <xliff:g id="NUMBER">%d</xliff:g> (na) natitirang pagsubok bago ma-lock ang SIM."</item>
+ </plurals>
<string name="imei" msgid="2625429890869005782">"IMEI"</string>
<string name="meid" msgid="4841221237681254195">"MEID"</string>
<string name="ClipMmi" msgid="6952821216480289285">"Papasok na Caller ID"</string>
@@ -477,6 +482,8 @@
<string name="permdesc_accessSurfaceFlinger" msgid="1041619516733293551">"Pinapayagan ang app na gamitin ang mababang antas na mga tampok ng SurfaceFlinger."</string>
<string name="permlab_readFrameBuffer" msgid="6690504248178498136">"basahin ang buffer ng frame"</string>
<string name="permdesc_readFrameBuffer" msgid="4937405521809454680">"Pinapayagan ang app na basahin ang nilalaman ng buffer ng frame."</string>
+ <string name="permlab_accessInputFlinger" msgid="5348635270689553857">"i-access ang InputFlinger"</string>
+ <string name="permdesc_accessInputFlinger" msgid="2104864941201226616">"Nagbibigay-daan sa app na gumamit ng mga tampok ng InputFlinger sa mababang antas."</string>
<string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"mag-configure ng mga Wifi display"</string>
<string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"Pinapayagan ang app na mag-configure at kumonekta sa mga Wifi display."</string>
<string name="permlab_controlWifiDisplay" msgid="393641276723695496">"magkontrol ng mga Wifi display"</string>
@@ -1414,6 +1421,7 @@
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
<string name="activitychooserview_choose_application" msgid="2125168057199941199">"Pumili ng isang app"</string>
+ <string name="activitychooserview_choose_application_error" msgid="8624618365481126668">"Hindi mailunsad ang <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="shareactionprovider_share_with" msgid="806688056141131819">"Ibahagi sa"</string>
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Ibahagi sa <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Hawakan sa pag-slide. Pindutin nang matagal."</string>
@@ -1649,5 +1657,16 @@
<item quantity="other" msgid="4730868920742952817">"Subukan muli sa <xliff:g id="COUNT">%d</xliff:g> seg"</item>
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Subukang muli sa ibang pagkakataon"</string>
- <string name="immersive_mode_confirmation" msgid="7227416894979047467">"Mag-swipe pababa upang lumabas sa full screen"</string>
+ <string name="immersive_mode_confirmation" msgid="7227416894979047467">"Mag-swipe pababa mula sa itaas upang lumabas sa full screen."</string>
+ <string name="done_label" msgid="2093726099505892398">"Tapos na"</string>
+ <string name="hour_picker_description" msgid="6698199186859736512">"Pabilog na slider ng mga oras"</string>
+ <string name="minute_picker_description" msgid="8606010966873791190">"Pabilog na slider ng mga minuto"</string>
+ <string name="select_hours" msgid="6043079511766008245">"Pumili ng mga oras"</string>
+ <string name="select_minutes" msgid="3974345615920336087">"Pumili ng mga minuto"</string>
+ <string name="day_picker_description" msgid="8990847925961297968">"Grid ng mga araw ayon sa buwan"</string>
+ <string name="year_picker_description" msgid="5524331207436052403">"Listahan ng taon"</string>
+ <string name="select_day" msgid="7774759604701773332">"Pumili ng buwan at araw"</string>
+ <string name="select_year" msgid="7952052866994196170">"Pumili ng taon"</string>
+ <string name="item_is_selected" msgid="949687401682476608">"Napili ang <xliff:g id="ITEM">%1$s</xliff:g>"</string>
+ <string name="deleted_key" msgid="7659477886625566590">"Tinanggal ang <xliff:g id="KEY">%1$s</xliff:g>"</string>
</resources>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index 99a137b..20e7f6c 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -50,6 +50,11 @@
<string name="invalidPuk" msgid="8761456210898036513">"8 veya daha uzun basamaklı bir PUK kodu yazın."</string>
<string name="needPuk" msgid="919668385956251611">"SIM kartınızın PUK kilidi devrede. Kilidi açmak için PUK kodunu yazın."</string>
<string name="needPuk2" msgid="4526033371987193070">"Engellenen SIM kartı açmak için PUK2 kodunu yazın."</string>
+ <string name="enablePin" msgid="209412020907207950">"Başarısız. SIM/RUIM Kilidini etkinleştirin."</string>
+ <plurals name="pinpuk_attempts">
+ <item quantity="one" msgid="6596245285809790142">"SIM kilitlenmeden önce <xliff:g id="NUMBER">%d</xliff:g> deneme hakkınız kaldı."</item>
+ <item quantity="other" msgid="7530597808358774740">"SIM kilitlenmeden önce <xliff:g id="NUMBER">%d</xliff:g> deneme hakkınız kaldı."</item>
+ </plurals>
<string name="imei" msgid="2625429890869005782">"IMEI"</string>
<string name="meid" msgid="4841221237681254195">"MEID"</string>
<string name="ClipMmi" msgid="6952821216480289285">"Gelen Çağrı Kimliği"</string>
@@ -477,6 +482,8 @@
<string name="permdesc_accessSurfaceFlinger" msgid="1041619516733293551">"Uygulamaya, SurfaceFlinger\'a ait düşük düzey özellikleri kullanma izni verir."</string>
<string name="permlab_readFrameBuffer" msgid="6690504248178498136">"çerçeve arabelleğini oku"</string>
<string name="permdesc_readFrameBuffer" msgid="4937405521809454680">"Uygulamaya, çerçeve arabelleğinin içeriğini okuma izni verir."</string>
+ <string name="permlab_accessInputFlinger" msgid="5348635270689553857">"InputFlinger\'a eriÅŸ"</string>
+ <string name="permdesc_accessInputFlinger" msgid="2104864941201226616">"Uygulamaya, alt düzey InputFlinger özelliklerini kullanma izni verir."</string>
<string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"Kablosuz ekranları yapılandır"</string>
<string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"Uygulamaya kablosuz ekranları yapılandırma ve bunlara bağlanma izni verir."</string>
<string name="permlab_controlWifiDisplay" msgid="393641276723695496">"Kablosuz ekranları denetle"</string>
@@ -1414,6 +1421,7 @@
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"ÜstKrkt"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"GiriÅŸ"</string>
<string name="activitychooserview_choose_application" msgid="2125168057199941199">"Bir uygulama seçin"</string>
+ <string name="activitychooserview_choose_application_error" msgid="8624618365481126668">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> başlatılamadı"</string>
<string name="shareactionprovider_share_with" msgid="806688056141131819">"Åžununla paylaÅŸ:"</string>
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> ile paylaÅŸ"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Kayan tutma yeri. Dokunun ve basılı tutun."</string>
@@ -1649,5 +1657,16 @@
<item quantity="other" msgid="4730868920742952817">"<xliff:g id="COUNT">%d</xliff:g> saniye içinde tekrar deneyin"</item>
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Daha sonra tekrar deneyin"</string>
- <string name="immersive_mode_confirmation" msgid="7227416894979047467">"Tam ekrandan çıkmak için aşağıya hızlıca kaydırın"</string>
+ <string name="immersive_mode_confirmation" msgid="7227416894979047467">"Tam ekrandan çıkmak için yukarıdan aşağıya hızlıca kaydırın."</string>
+ <string name="done_label" msgid="2093726099505892398">"Bitti"</string>
+ <string name="hour_picker_description" msgid="6698199186859736512">"Saat kaydırma çemberi"</string>
+ <string name="minute_picker_description" msgid="8606010966873791190">"Dakika kaydırma çemberi"</string>
+ <string name="select_hours" msgid="6043079511766008245">"Saati seçin"</string>
+ <string name="select_minutes" msgid="3974345615920336087">"Dakikayı seçin"</string>
+ <string name="day_picker_description" msgid="8990847925961297968">"Ayın günleri tablosu"</string>
+ <string name="year_picker_description" msgid="5524331207436052403">"Yıl listesi"</string>
+ <string name="select_day" msgid="7774759604701773332">"Ayı ve günü seçin"</string>
+ <string name="select_year" msgid="7952052866994196170">"Yılı seçin"</string>
+ <string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> seçildi"</string>
+ <string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> silindi"</string>
</resources>
diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml
index 61f45ec..dc8badc 100644
--- a/core/res/res/values-uk/strings.xml
+++ b/core/res/res/values-uk/strings.xml
@@ -50,6 +50,11 @@
<string name="invalidPuk" msgid="8761456210898036513">"Введіть PUK-код із 8 або більше цифр."</string>
<string name="needPuk" msgid="919668385956251611">"SIM-карта заблок. PUK-кодом. Введіть PUK-код, щоб її розблок."</string>
<string name="needPuk2" msgid="4526033371987193070">"Введ. PUK2, щоб розбл. SIM-карту."</string>
+ <string name="enablePin" msgid="209412020907207950">"Помилка. Увімкніть Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ SIM/RUIM."</string>
+ <plurals name="pinpuk_attempts">
+ <item quantity="one" msgid="6596245285809790142">"У Ð²Ð°Ñ Ð·Ð°Ð»Ð¸ÑˆÐ¸Ð»Ð°ÑÑŒ <xliff:g id="NUMBER">%d</xliff:g> Ñпроба. ПіÑÐ»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ SIM-карту буде заблоковано."</item>
+ <item quantity="other" msgid="7530597808358774740">"У Ð²Ð°Ñ Ð·Ð°Ð»Ð¸ÑˆÐ¸Ð»Ð¾ÑÑ Ñтільки Ñпроб: <xliff:g id="NUMBER">%d</xliff:g>. ПіÑÐ»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ SIM-карту буде заблоковано."</item>
+ </plurals>
<string name="imei" msgid="2625429890869005782">"IMEI"</string>
<string name="meid" msgid="4841221237681254195">"MEID"</string>
<string name="ClipMmi" msgid="6952821216480289285">"Вхідн. ід. абонента"</string>
@@ -477,6 +482,8 @@
<string name="permdesc_accessSurfaceFlinger" msgid="1041619516733293551">"ДозволÑÑ” програмі викориÑтовувати низькорівневі функції SurfaceFlinger."</string>
<string name="permlab_readFrameBuffer" msgid="6690504248178498136">"читати фрейм-буфер"</string>
<string name="permdesc_readFrameBuffer" msgid="4937405521809454680">"ДозволÑÑ” програмі читати вміÑÑ‚ буфера кадрів."</string>
+ <string name="permlab_accessInputFlinger" msgid="5348635270689553857">"отримувати доÑтуп до InputFlinger"</string>
+ <string name="permdesc_accessInputFlinger" msgid="2104864941201226616">"ДозволÑÑ” програмі викориÑтовувати низькорівневі функції InputFlinger."</string>
<string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"налаштувати екрани Wi-Fi"</string>
<string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"ДозволÑÑ” програмі налаштовувати екрани Wi-Fi Ñ– під’єднуватиÑÑ Ð´Ð¾ них."</string>
<string name="permlab_controlWifiDisplay" msgid="393641276723695496">"керувати екранами Wi-Fi"</string>
@@ -1414,6 +1421,7 @@
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
<string name="activitychooserview_choose_application" msgid="2125168057199941199">"Вибрати програму"</string>
+ <string name="activitychooserview_choose_application_error" msgid="8624618365481126668">"Ðе вдалоÑÑ Ð·Ð°Ð¿ÑƒÑтити програму <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="shareactionprovider_share_with" msgid="806688056141131819">"ÐадіÑлати через"</string>
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"ÐадіÑлати через <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Вказівник-повзунок. ТоркнітьÑÑ Ð¹ утримуйте."</string>
@@ -1650,4 +1658,15 @@
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Спробуйте пізніше"</string>
<string name="immersive_mode_confirmation" msgid="7227416894979047467">"Проведіть пальцем зверху вниз, щоб вийти з повноекранного режиму."</string>
+ <string name="done_label" msgid="2093726099505892398">"Готово"</string>
+ <string name="hour_picker_description" msgid="6698199186859736512">"Вибір годин на циферблаті"</string>
+ <string name="minute_picker_description" msgid="8606010966873791190">"Вибір хвилин на циферблаті"</string>
+ <string name="select_hours" msgid="6043079511766008245">"Виберіть години"</string>
+ <string name="select_minutes" msgid="3974345615920336087">"Виберіть хвилини"</string>
+ <string name="day_picker_description" msgid="8990847925961297968">"Вікно вибору дати"</string>
+ <string name="year_picker_description" msgid="5524331207436052403">"Меню вибору року"</string>
+ <string name="select_day" msgid="7774759604701773332">"Виберіть міÑÑць Ñ– день"</string>
+ <string name="select_year" msgid="7952052866994196170">"Виберіть рік"</string>
+ <string name="item_is_selected" msgid="949687401682476608">"Вибрано: <xliff:g id="ITEM">%1$s</xliff:g>"</string>
+ <string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> видалено"</string>
</resources>
diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml
index 82752b7..ae753a9 100644
--- a/core/res/res/values-vi/strings.xml
+++ b/core/res/res/values-vi/strings.xml
@@ -50,6 +50,11 @@
<string name="invalidPuk" msgid="8761456210898036513">"Nhập PUK có từ 8 số trở lên."</string>
<string name="needPuk" msgid="919668385956251611">"Thẻ SIM của bạn đã bị khóa PUK. Nhập mã PUK để mở khóa thẻ SIM đó."</string>
<string name="needPuk2" msgid="4526033371987193070">"Nhập mã PUK2 để bỠchặn thẻ SIM."</string>
+ <string name="enablePin" msgid="209412020907207950">"Không thành công, kích hoạt tính năng khóa SIM/RUIM."</string>
+ <plurals name="pinpuk_attempts">
+ <item quantity="one" msgid="6596245285809790142">"Bạn còn <xliff:g id="NUMBER">%d</xliff:g> lần thử trước khi SIM bị khóa."</item>
+ <item quantity="other" msgid="7530597808358774740">"Bạn còn <xliff:g id="NUMBER">%d</xliff:g> lần thử trước khi SIM bị khóa."</item>
+ </plurals>
<string name="imei" msgid="2625429890869005782">"IMEI"</string>
<string name="meid" msgid="4841221237681254195">"MEID"</string>
<string name="ClipMmi" msgid="6952821216480289285">"Số gá»i đến"</string>
@@ -477,6 +482,8 @@
<string name="permdesc_accessSurfaceFlinger" msgid="1041619516733293551">"Cho phép ứng dụng sử dụng các tính năng SurfaceFlinger cấp độ thấp."</string>
<string name="permlab_readFrameBuffer" msgid="6690504248178498136">"Ä‘á»c bá»™ đệm khung"</string>
<string name="permdesc_readFrameBuffer" msgid="4937405521809454680">"Cho phép ứng dụng Ä‘á»c ná»™i dung cá»§a bá»™ đệm khung."</string>
+ <string name="permlab_accessInputFlinger" msgid="5348635270689553857">"truy cập InputFlinger"</string>
+ <string name="permdesc_accessInputFlinger" msgid="2104864941201226616">"Cho phép ứng dụng sử dụng các tính năng InputFlinger cấp độ thấp."</string>
<string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"định cấu hình màn hình Wi-Fi"</string>
<string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"Cho phép ứng dụng định cấu hình và kết nối với màn hình Wi-Fi."</string>
<string name="permlab_controlWifiDisplay" msgid="393641276723695496">"kiểm soát màn hình Wi-Fi"</string>
@@ -1414,6 +1421,7 @@
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
<string name="activitychooserview_choose_application" msgid="2125168057199941199">"Chá»n má»™t ứng dụng"</string>
+ <string name="activitychooserview_choose_application_error" msgid="8624618365481126668">"Không thể khởi chạy <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="shareactionprovider_share_with" msgid="806688056141131819">"Chia sẻ với"</string>
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Chia sẻ với <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Tay trượt. Chạm &amp; giữ."</string>
@@ -1649,5 +1657,16 @@
<item quantity="other" msgid="4730868920742952817">"Hãy thử lại sau <xliff:g id="COUNT">%d</xliff:g> giây"</item>
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Hãy thử lại sau"</string>
- <string name="immersive_mode_confirmation" msgid="7227416894979047467">"Vuốt từ trên xuống để thoát toàn màn hình"</string>
+ <string name="immersive_mode_confirmation" msgid="7227416894979047467">"Vuốt từ trên xuống để thoát toàn màn hình."</string>
+ <string name="done_label" msgid="2093726099505892398">"Xong"</string>
+ <string name="hour_picker_description" msgid="6698199186859736512">"Thanh trượt giỠhình tròn"</string>
+ <string name="minute_picker_description" msgid="8606010966873791190">"Thanh trượt phút hình tròn"</string>
+ <string name="select_hours" msgid="6043079511766008245">"Chá»n giá»"</string>
+ <string name="select_minutes" msgid="3974345615920336087">"Chá»n phút"</string>
+ <string name="day_picker_description" msgid="8990847925961297968">"Lưới ngày theo tháng"</string>
+ <string name="year_picker_description" msgid="5524331207436052403">"Danh sách năm"</string>
+ <string name="select_day" msgid="7774759604701773332">"Chá»n tháng và ngày"</string>
+ <string name="select_year" msgid="7952052866994196170">"Chá»n năm"</string>
+ <string name="item_is_selected" msgid="949687401682476608">"Äã chá»n <xliff:g id="ITEM">%1$s</xliff:g>"</string>
+ <string name="deleted_key" msgid="7659477886625566590">"Äã xóa <xliff:g id="KEY">%1$s</xliff:g>"</string>
</resources>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index dbfd039..28ab455 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -50,6 +50,11 @@
<string name="invalidPuk" msgid="8761456210898036513">"请键入至少 8 使•°å­—çš„ PUK ç ã€‚"</string>
<string name="needPuk" msgid="919668385956251611">"已对 SIM å¡è¿›è¡Œ PUK ç é”定。键入 PUK ç å°†å…¶è§£é”。"</string>
<string name="needPuk2" msgid="4526033371987193070">"输入 PUK2 ç ä»¥è§£é” SIM å¡ã€‚"</string>
+ <string name="enablePin" msgid="209412020907207950">"失败,请å¯ç”¨ SIM/RUIM å¡é”定设置。"</string>
+ <plurals name="pinpuk_attempts">
+ <item quantity="one" msgid="6596245285809790142">"您还有<xliff:g id="NUMBER">%d</xliff:g>次å°è¯•机会。如果ä»ç„¶å¤±è´¥ï¼ŒSIM å¡å°†è¢«é”定。"</item>
+ <item quantity="other" msgid="7530597808358774740">"您还有<xliff:g id="NUMBER">%d</xliff:g>次å°è¯•机会。如果ä»ç„¶å¤±è´¥ï¼ŒSIM å¡å°†è¢«é”定。"</item>
+ </plurals>
<string name="imei" msgid="2625429890869005782">"IMEI"</string>
<string name="meid" msgid="4841221237681254195">"MEID"</string>
<string name="ClipMmi" msgid="6952821216480289285">"æ¥ç”µæ˜¾ç¤º"</string>
@@ -477,14 +482,16 @@
<string name="permdesc_accessSurfaceFlinger" msgid="1041619516733293551">"å…许应用使用 SurfaceFlinger 低级功能。"</string>
<string name="permlab_readFrameBuffer" msgid="6690504248178498136">"读å–帧缓冲区"</string>
<string name="permdesc_readFrameBuffer" msgid="4937405521809454680">"å…许应用读å–帧缓冲区的内容。"</string>
+ <string name="permlab_accessInputFlinger" msgid="5348635270689553857">"使用 InputFlinger"</string>
+ <string name="permdesc_accessInputFlinger" msgid="2104864941201226616">"å…许应用使用 InputFlinger 底层功能。"</string>
<string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"é…ç½® WLAN 显示设备"</string>
<string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"å…许应用é…置并连接到 WLAN 显示设备。"</string>
<string name="permlab_controlWifiDisplay" msgid="393641276723695496">"控制 WLAN 显示设备"</string>
<string name="permdesc_controlWifiDisplay" msgid="4543912292681826986">"å…许应用控制 WLAN 显示设备的基础功能。"</string>
<string name="permlab_captureAudioOutput" msgid="6857134498402346708">"æ•获音频输出"</string>
<string name="permdesc_captureAudioOutput" msgid="6210597754212208853">"å…许该应用æ•获和é‡å®šå‘音频输出。"</string>
- <string name="permlab_captureAudioHotword" msgid="1890553935650349808">"检测关键è¯"</string>
- <string name="permdesc_captureAudioHotword" msgid="9151807958153056810">"å…许应用æ•获音频以便检测语音指令的关键è¯ã€‚æ•获æ“作会在åŽå°è¿›è¡Œï¼Œä½†ä¸ä¼šå¦¨ç¢å…¶ä»–音频æ•èŽ·å·¥å…·ï¼ˆä¾‹å¦‚æ‘„åƒæœºï¼‰ã€‚"</string>
+ <string name="permlab_captureAudioHotword" msgid="1890553935650349808">"å¯åŠ¨æŒ‡ä»¤æ£€æµ‹"</string>
+ <string name="permdesc_captureAudioHotword" msgid="9151807958153056810">"å…许应用æ•获音频以便检测语音å¯åŠ¨æŒ‡ä»¤ã€‚æ•获æ“作会在åŽå°è¿›è¡Œï¼Œä½†ä¸ä¼šå¦¨ç¢å…¶ä»–音频æ•èŽ·å·¥å…·ï¼ˆä¾‹å¦‚æ‘„åƒæœºï¼‰ã€‚"</string>
<string name="permlab_captureVideoOutput" msgid="2246828773589094023">"æ•获视频输出"</string>
<string name="permdesc_captureVideoOutput" msgid="359481658034149860">"å…许该应用æ•获和é‡å®šå‘视频输出。"</string>
<string name="permlab_captureSecureVideoOutput" msgid="7815398969303382016">"æ•获安全视频输出"</string>
@@ -545,7 +552,7 @@
<string name="permlab_checkinProperties" msgid="7855259461268734914">"访问检入属性"</string>
<string name="permdesc_checkinProperties" msgid="4024526968630194128">"å…许应用对登记æœåŠ¡ä¸Šä¼ çš„å±žæ€§æ‹¥æœ‰è¯»å–/写入æƒé™ã€‚普通应用ä¸åº”使用此æƒé™ã€‚"</string>
<string name="permlab_bindGadget" msgid="776905339015863471">"选择å°éƒ¨ä»¶"</string>
- <string name="permdesc_bindGadget" msgid="8261326938599049290">"å…许应用告知系统哪些å°éƒ¨ä»¶å¯ä¾›å“ªä¸ªåº”用使用。拥有此æƒé™çš„应用å¯å‘其他应用授予对个人资料的访问æƒé™ã€‚普通应用ä¸åº”使用此æƒé™ã€‚"</string>
+ <string name="permdesc_bindGadget" msgid="8261326938599049290">"å…许应用告知系统哪些å°éƒ¨ä»¶å¯ä¾›å“ªä¸ªåº”用使用。拥有此æƒé™çš„应用å¯å‘其他应用授予对个人数æ®çš„访问æƒé™ã€‚普通应用ä¸åº”使用此æƒé™ã€‚"</string>
<string name="permlab_modifyPhoneState" msgid="8423923777659292228">"修改手机状æ€"</string>
<string name="permdesc_modifyPhoneState" msgid="1029877529007686732">"å…许应用控制设备的电è¯åŠŸèƒ½ã€‚æ‹¥æœ‰æ­¤æƒé™çš„应用å¯åœ¨ä¸é€šçŸ¥æ‚¨çš„æƒ…况下执行切æ¢ç½‘络ã€å¼€å…³æ‰‹æœºæ— çº¿è£…置等此类æ“作。"</string>
<string name="permlab_readPhoneState" msgid="9178228524507610486">"è¯»å–æ‰‹æœºçжæ€å’Œèº«ä»½"</string>
@@ -1414,6 +1421,7 @@
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
<string name="activitychooserview_choose_application" msgid="2125168057199941199">"选择应用"</string>
+ <string name="activitychooserview_choose_application_error" msgid="8624618365481126668">"无法å¯åŠ¨â€œ<xliff:g id="APPLICATION_NAME">%s</xliff:g>â€"</string>
<string name="shareactionprovider_share_with" msgid="806688056141131819">"分享方å¼"</string>
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"使用<xliff:g id="APPLICATION_NAME">%s</xliff:g>分享"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"滑动手柄。触摸并按ä½ã€‚"</string>
@@ -1649,5 +1657,16 @@
<item quantity="other" msgid="4730868920742952817">"<xliff:g id="COUNT">%d</xliff:g>ç§’åŽé‡è¯•"</item>
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"ç¨åŽé‡è¯•"</string>
- <string name="immersive_mode_confirmation" msgid="7227416894979047467">"从顶部å‘下滑动å³å¯é€€å‡ºå…¨å±æ¨¡å¼"</string>
+ <string name="immersive_mode_confirmation" msgid="7227416894979047467">"从顶部å‘下滑动å³å¯é€€å‡ºå…¨å±æ¨¡å¼ã€‚"</string>
+ <string name="done_label" msgid="2093726099505892398">"完æˆ"</string>
+ <string name="hour_picker_description" msgid="6698199186859736512">"å°æ—¶è½¬ç›˜"</string>
+ <string name="minute_picker_description" msgid="8606010966873791190">"分钟转盘"</string>
+ <string name="select_hours" msgid="6043079511766008245">"é€‰æ‹©å°æ—¶"</string>
+ <string name="select_minutes" msgid="3974345615920336087">"选择分钟"</string>
+ <string name="day_picker_description" msgid="8990847925961297968">"按月份划分的日期网格"</string>
+ <string name="year_picker_description" msgid="5524331207436052403">"年份列表"</string>
+ <string name="select_day" msgid="7774759604701773332">"选择月份和日期"</string>
+ <string name="select_year" msgid="7952052866994196170">"选择年份"</string>
+ <string name="item_is_selected" msgid="949687401682476608">"已选择<xliff:g id="ITEM">%1$s</xliff:g>"</string>
+ <string name="deleted_key" msgid="7659477886625566590">"已删除<xliff:g id="KEY">%1$s</xliff:g>"</string>
</resources>
diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml
index 2d2e77e..f10ae9b 100644
--- a/core/res/res/values-zh-rHK/strings.xml
+++ b/core/res/res/values-zh-rHK/strings.xml
@@ -50,6 +50,11 @@
<string name="invalidPuk" msgid="8761456210898036513">"輸入 8 使•¸ä»¥ä¸Šçš„ PUK。"</string>
<string name="needPuk" msgid="919668385956251611">"您的 SIM å¡å·²éŽ–å®š PUK,請輸入 PUK 碼以解除鎖定。"</string>
<string name="needPuk2" msgid="4526033371987193070">"輸入 PUK2 為 SIM å¡è§£é™¤å°éŽ–ã€‚"</string>
+ <string name="enablePin" msgid="209412020907207950">"æ“作失敗,請啟用「SIM/RUIM 鎖定ã€ã€‚"</string>
+ <plurals name="pinpuk_attempts">
+ <item quantity="one" msgid="6596245285809790142">"您剩下 <xliff:g id="NUMBER">%d</xliff:g> 次機會輸入。如果ä»ç„¶è¼¸å…¥éŒ¯èª¤ï¼ŒSIM 將會被鎖定。"</item>
+ <item quantity="other" msgid="7530597808358774740">"您剩下 <xliff:g id="NUMBER">%d</xliff:g> 次機會輸入。如果ä»ç„¶è¼¸å…¥éŒ¯èª¤ï¼ŒSIM 將會被鎖定。"</item>
+ </plurals>
<string name="imei" msgid="2625429890869005782">"IMEI"</string>
<string name="meid" msgid="4841221237681254195">"MEID"</string>
<string name="ClipMmi" msgid="6952821216480289285">"來電顯示"</string>
@@ -477,6 +482,8 @@
<string name="permdesc_accessSurfaceFlinger" msgid="1041619516733293551">"å…許應用程å¼ä½¿ç”¨ SurfaceFlinger 的低層功能。"</string>
<string name="permlab_readFrameBuffer" msgid="6690504248178498136">"è®€å–æ¡†æž¶ç·©è¡å€"</string>
<string name="permdesc_readFrameBuffer" msgid="4937405521809454680">"å…許應用程å¼è®€å–ç•«é¢ç·©è¡å€çš„內容。"</string>
+ <string name="permlab_accessInputFlinger" msgid="5348635270689553857">"å­˜å– InputFlinger"</string>
+ <string name="permdesc_accessInputFlinger" msgid="2104864941201226616">"å…許應用程å¼ä½¿ç”¨ InputFlinger 的低階功能。"</string>
<string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"設定 WiFi Display"</string>
<string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"å…許應用程å¼è¨­å®šåŠé€£æŽ¥ WiFi Display。"</string>
<string name="permlab_controlWifiDisplay" msgid="393641276723695496">"控制 WiFi Display"</string>
@@ -1414,6 +1421,7 @@
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift éµ"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter éµ"</string>
<string name="activitychooserview_choose_application" msgid="2125168057199941199">"鏿“‡æ‡‰ç”¨ç¨‹å¼"</string>
+ <string name="activitychooserview_choose_application_error" msgid="8624618365481126668">"無法啟動 <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="shareactionprovider_share_with" msgid="806688056141131819">"分享給"</string>
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"與「<xliff:g id="APPLICATION_NAME">%s</xliff:g>ã€åˆ†äº«"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"滑動控制。æŒçºŒè¼•觸。"</string>
@@ -1649,5 +1657,16 @@
<item quantity="other" msgid="4730868920742952817">"<xliff:g id="COUNT">%d</xliff:g> 秒後å†è©¦ä¸€æ¬¡"</item>
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"ç¨å¾Œå†è©¦"</string>
- <string name="immersive_mode_confirmation" msgid="7227416894979047467">"從頂端往下滑動å³å¯çµæŸå…¨èž¢å¹•。"</string>
+ <string name="immersive_mode_confirmation" msgid="7227416894979047467">"由頂端往下快速滑動å³å¯é›¢é–‹å…¨èž¢å¹•。"</string>
+ <string name="done_label" msgid="2093726099505892398">"完æˆ"</string>
+ <string name="hour_picker_description" msgid="6698199186859736512">"å°æ™‚環形滑桿"</string>
+ <string name="minute_picker_description" msgid="8606010966873791190">"分é˜ç’°å½¢æ»‘æ¡¿"</string>
+ <string name="select_hours" msgid="6043079511766008245">"é¸å–å°æ™‚"</string>
+ <string name="select_minutes" msgid="3974345615920336087">"é¸å–分é˜"</string>
+ <string name="day_picker_description" msgid="8990847925961297968">"é¡¯ç¤ºæ¯æ—¥çš„æœˆæ›†æ–¹æ ¼"</string>
+ <string name="year_picker_description" msgid="5524331207436052403">"年份清單"</string>
+ <string name="select_day" msgid="7774759604701773332">"é¸å–月份和日期"</string>
+ <string name="select_year" msgid="7952052866994196170">"é¸å–年份"</string>
+ <string name="item_is_selected" msgid="949687401682476608">"å·²é¸å–<xliff:g id="ITEM">%1$s</xliff:g>"</string>
+ <string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> 已刪除"</string>
</resources>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index 3ec8d4c..4c86abd 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -50,6 +50,11 @@
<string name="invalidPuk" msgid="8761456210898036513">"輸入 8 使•¸ä»¥ä¸Šçš„ PUK。"</string>
<string name="needPuk" msgid="919668385956251611">"SIM å¡çš„ PUK 已鎖定。請輸入 PUK 碼解除鎖定。"</string>
<string name="needPuk2" msgid="4526033371987193070">"請輸入 PUK2 以解鎖 SIM å¡ã€‚"</string>
+ <string name="enablePin" msgid="209412020907207950">"æ“作失敗,請啟用 SIM/RUIM 鎖定。"</string>
+ <plurals name="pinpuk_attempts">
+ <item quantity="one" msgid="6596245285809790142">"您還å¯ä»¥å†è©¦ <xliff:g id="NUMBER">%d</xliff:g> 次。如果ä»ç„¶å¤±æ•—,SIM å¡å°‡è¢«éŽ–ä½ã€‚"</item>
+ <item quantity="other" msgid="7530597808358774740">"您還å¯ä»¥å†è©¦ <xliff:g id="NUMBER">%d</xliff:g> 次。如果ä»ç„¶å¤±æ•—,SIM å¡å°‡è¢«éŽ–ä½ã€‚"</item>
+ </plurals>
<string name="imei" msgid="2625429890869005782">"IMEI"</string>
<string name="meid" msgid="4841221237681254195">"MEID"</string>
<string name="ClipMmi" msgid="6952821216480289285">"來電顯示"</string>
@@ -477,14 +482,16 @@
<string name="permdesc_accessSurfaceFlinger" msgid="1041619516733293551">"å…許應用程å¼ä½¿ç”¨ SurfaceFlinger 的低階功能。"</string>
<string name="permlab_readFrameBuffer" msgid="6690504248178498136">"è®€å–æ¡†æž¶ç·©è¡"</string>
<string name="permdesc_readFrameBuffer" msgid="4937405521809454680">"å…許應用程å¼è®€å–ç•«é¢ç·©è¡å€çš„內容。"</string>
+ <string name="permlab_accessInputFlinger" msgid="5348635270689553857">"å­˜å– InputFlinger"</string>
+ <string name="permdesc_accessInputFlinger" msgid="2104864941201226616">"å…許應用程å¼ä½¿ç”¨ InputFlinger 的低階功能。"</string>
<string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"設定 Wi-Fi 顯示è£ç½®"</string>
<string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"å…許應用程å¼è¨­å®šåŠé€£æŽ¥ Wi-Fi 顯示è£ç½®ã€‚"</string>
<string name="permlab_controlWifiDisplay" msgid="393641276723695496">"控制 Wi-Fi 顯示è£ç½®"</string>
<string name="permdesc_controlWifiDisplay" msgid="4543912292681826986">"å…è¨±æ‡‰ç”¨ç¨‹å¼æŽ§åˆ¶ Wi-Fi 顯示è£ç½®çš„低階功能。"</string>
<string name="permlab_captureAudioOutput" msgid="6857134498402346708">"æ“·å–音訊輸出"</string>
<string name="permdesc_captureAudioOutput" msgid="6210597754212208853">"å…è¨±æ‡‰ç”¨ç¨‹å¼æ“·å–åŠé‡æ–°å°Žå‘音訊輸出。"</string>
- <string name="permlab_captureAudioHotword" msgid="1890553935650349808">"ç†±é–€å­—è©žåµæ¸¬"</string>
- <string name="permdesc_captureAudioHotword" msgid="9151807958153056810">"å…è¨±æ‡‰ç”¨ç¨‹å¼æ“·å–éŸ³è¨Šç”¨æ–¼ç†±é–€å­—è©žåµæ¸¬ã€‚æ“·å–作業å¯åœ¨èƒŒæ™¯åŸ·è¡Œï¼Œä½†ä¸¦æœªç¦æ­¢ä½¿ç”¨å…¶ä»–音訊擷å–工具 (例如æ”錄影機)。"</string>
+ <string name="permlab_captureAudioHotword" msgid="1890553935650349808">"å•Ÿå‹•å­—è©žåµæ¸¬"</string>
+ <string name="permdesc_captureAudioHotword" msgid="9151807958153056810">"å…è¨±æ‡‰ç”¨ç¨‹å¼æ“·å–éŸ³è¨Šç”¨æ–¼å•Ÿå‹•å­—è©žåµæ¸¬ã€‚æ“·å–作業å¯åœ¨èƒŒæ™¯åŸ·è¡Œï¼Œä½†ä¸¦æœªç¦æ­¢ä½¿ç”¨å…¶ä»–音訊擷å–工具 (例如æ”錄影機)。"</string>
<string name="permlab_captureVideoOutput" msgid="2246828773589094023">"æ“·å–視訊輸出"</string>
<string name="permdesc_captureVideoOutput" msgid="359481658034149860">"å…è¨±æ‡‰ç”¨ç¨‹å¼æ“·å–åŠé‡æ–°å°Žå‘視訊輸出。"</string>
<string name="permlab_captureSecureVideoOutput" msgid="7815398969303382016">"æ“·å–安全視訊輸出"</string>
@@ -1414,6 +1421,7 @@
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift éµ"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter éµ"</string>
<string name="activitychooserview_choose_application" msgid="2125168057199941199">"鏿“‡æ‡‰ç”¨ç¨‹å¼"</string>
+ <string name="activitychooserview_choose_application_error" msgid="8624618365481126668">"無法啟動 <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="shareactionprovider_share_with" msgid="806688056141131819">"分享å°è±¡ï¼š"</string>
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"與「<xliff:g id="APPLICATION_NAME">%s</xliff:g>ã€åˆ†äº«"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"滑動控制。æŒçºŒè¼•觸。"</string>
@@ -1649,5 +1657,16 @@
<item quantity="other" msgid="4730868920742952817">"<xliff:g id="COUNT">%d</xliff:g> 秒後å†è©¦ä¸€æ¬¡"</item>
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"ç¨å¾Œå†è©¦"</string>
- <string name="immersive_mode_confirmation" msgid="7227416894979047467">"從頂端往下滑動å³å¯çµæŸå…¨èž¢å¹•。"</string>
+ <string name="immersive_mode_confirmation" msgid="7227416894979047467">"從頂端往下滑動å³å¯é€€å‡ºå…¨èž¢å¹•模å¼ã€‚"</string>
+ <string name="done_label" msgid="2093726099505892398">"完æˆ"</string>
+ <string name="hour_picker_description" msgid="6698199186859736512">"å°æ™‚數環狀滑桿"</string>
+ <string name="minute_picker_description" msgid="8606010966873791190">"åˆ†é˜æ•¸ç’°ç‹€æ»‘æ¡¿"</string>
+ <string name="select_hours" msgid="6043079511766008245">"é¸å–å°æ™‚數"</string>
+ <string name="select_minutes" msgid="3974345615920336087">"é¸å–åˆ†é˜æ•¸"</string>
+ <string name="day_picker_description" msgid="8990847925961297968">"日期網格 (按月顯示)"</string>
+ <string name="year_picker_description" msgid="5524331207436052403">"年份清單"</string>
+ <string name="select_day" msgid="7774759604701773332">"é¸å–月份和日期"</string>
+ <string name="select_year" msgid="7952052866994196170">"é¸å–年份"</string>
+ <string name="item_is_selected" msgid="949687401682476608">"å·²é¸å– <xliff:g id="ITEM">%1$s</xliff:g>"</string>
+ <string name="deleted_key" msgid="7659477886625566590">"已刪除 <xliff:g id="KEY">%1$s</xliff:g>"</string>
</resources>
diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml
index 57d59c3..d78b8d1 100644
--- a/core/res/res/values-zu/strings.xml
+++ b/core/res/res/values-zu/strings.xml
@@ -50,6 +50,11 @@
<string name="invalidPuk" msgid="8761456210898036513">"Thayipha i-PUK enezinombolo ezingu-8 noma ngaphezu."</string>
<string name="needPuk" msgid="919668385956251611">"Ikhadi lakho le-SIM livalwe nge-PUK. Thayipha ikhodi ye-PUK ukulivula."</string>
<string name="needPuk2" msgid="4526033371987193070">"Thayipha i-PUK2 ukuze uvule ikhadi le-SIM."</string>
+ <string name="enablePin" msgid="209412020907207950">"Akuphumelelanga, nika amandla ukhiye we-SIM/RUIM."</string>
+ <plurals name="pinpuk_attempts">
+ <item quantity="one" msgid="6596245285809790142">"Unemizamo engu-<xliff:g id="NUMBER">%d</xliff:g> ngaphambi kokuba i-SIM ikhiywe."</item>
+ <item quantity="other" msgid="7530597808358774740">"Unemizamo engu-<xliff:g id="NUMBER">%d</xliff:g> ngaphambi kokuba i-SIM ikhiywe."</item>
+ </plurals>
<string name="imei" msgid="2625429890869005782">"IMEI"</string>
<string name="meid" msgid="4841221237681254195">"MEID"</string>
<string name="ClipMmi" msgid="6952821216480289285">"I-ID Yocingo Olungenayo"</string>
@@ -477,6 +482,8 @@
<string name="permdesc_accessSurfaceFlinger" msgid="1041619516733293551">"Ivumela uhlelo lokusebenza ukuthi isebenzise okuqukethwe i-SurfaceFlinger okusezingeni eliphansi."</string>
<string name="permlab_readFrameBuffer" msgid="6690504248178498136">"funda isikhumbuli sesikhashana sendikimba"</string>
<string name="permdesc_readFrameBuffer" msgid="4937405521809454680">"Ivumela uhlelo lokusebenza ukuthi ifunde okuqukethwe ifreyimu yebhafa."</string>
+ <string name="permlab_accessInputFlinger" msgid="5348635270689553857">"finyelela ku-InputFlinger"</string>
+ <string name="permdesc_accessInputFlinger" msgid="2104864941201226616">"Ivumela uhlelo lokusebenza ukuthi lusebenzise izici zezinga eliphansi ze-InputFlinger."</string>
<string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"lungisa ukubukwa kwe-Wi-Fi"</string>
<string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"Ivumela uhlelo lokusebenza ukulungisa nokuxhuma ekubukisweni kwe-Wi-Fi."</string>
<string name="permlab_controlWifiDisplay" msgid="393641276723695496">"lawula ukubukwa kwe-Wi-Fi"</string>
@@ -1414,6 +1421,7 @@
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Beka kwenye indawo"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Faka"</string>
<string name="activitychooserview_choose_application" msgid="2125168057199941199">"Khetha uhlelo lokusebenza"</string>
+ <string name="activitychooserview_choose_application_error" msgid="8624618365481126668">"Ayikwazanga ukuqalisa i-<xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="shareactionprovider_share_with" msgid="806688056141131819">"Yabelana no"</string>
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Yabelana no <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Ihaambis isibambo. Thinta &amp; ubambe."</string>
@@ -1650,4 +1658,15 @@
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Zama futhi emva kwesikhathi"</string>
<string name="immersive_mode_confirmation" msgid="7227416894979047467">"Swayiphela phansi kusukela phezulu ukuze uphume kusikrini esigcwele."</string>
+ <string name="done_label" msgid="2093726099505892398">"Kwenziwe"</string>
+ <string name="hour_picker_description" msgid="6698199186859736512">"Amahora weslayidi esiyindingilizi"</string>
+ <string name="minute_picker_description" msgid="8606010966873791190">"Amaminithi weslayidi esiyindingilizi"</string>
+ <string name="select_hours" msgid="6043079511766008245">"Khetha amahora"</string>
+ <string name="select_minutes" msgid="3974345615920336087">"Khetha amaminithi"</string>
+ <string name="day_picker_description" msgid="8990847925961297968">"Igridi yenyanga yezinsuku"</string>
+ <string name="year_picker_description" msgid="5524331207436052403">"Uhlu lonyaka"</string>
+ <string name="select_day" msgid="7774759604701773332">"Khetha inyanga nosuku"</string>
+ <string name="select_year" msgid="7952052866994196170">"Khetha unyaka"</string>
+ <string name="item_is_selected" msgid="949687401682476608">"I-<xliff:g id="ITEM">%1$s</xliff:g> ekhethiwe"</string>
+ <string name="deleted_key" msgid="7659477886625566590">"I-<xliff:g id="KEY">%1$s</xliff:g> isusiwe"</string>
</resources>
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index 42e3b50..7254403 100644
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -607,6 +607,8 @@
<attr name="popupMenuStyle" format="reference" />
<!-- Default StackView style. -->
<attr name="stackViewStyle" format="reference" />
+ <!-- Default style for the FragmentBreadCrumbs widget. -->
+ <attr name="fragmentBreadCrumbsStyle" format="reference" />
<!-- NumberPicker style. -->
<attr name="numberPickerStyle" format="reference" />
@@ -617,6 +619,18 @@
<!-- The TimePicker style. -->
<attr name="timePickerStyle" format="reference" />
+ <!-- The TimePicker Header background color . -->
+ <attr name="timePickerHeaderBackgroundColor" format="reference" />
+
+ <!-- The TimePicker Header time label text appearance -->
+ <attr name="timePickerHeaderTimeLabelTextAppearance" format="reference" />
+
+ <!-- TimePicker Header am pm label text appearance -->
+ <attr name="timePickerHeaderAmPmLabelTextAppearance" format="reference" />
+
+ <!-- The TimePicker dialog theme. -->
+ <attr name="timePickerDialogTheme" format="reference" />
+
<!-- The DatePicker style. -->
<attr name="datePickerStyle" format="reference" />
@@ -2725,6 +2739,8 @@
<!-- Enables the fast scroll thumb that can be dragged to quickly scroll through
the list. -->
<attr name="fastScrollEnabled" format="boolean" />
+ <!-- Specifies the style of the fast scroll decorations. -->
+ <attr name="fastScrollStyle" format="reference" />
<!-- When set to true, the list will use a more refined calculation
method based on the pixels height of the items visible on screen. This
property is set to true by default but should be set to false if your adapter
@@ -2793,6 +2809,36 @@
</declare-styleable>
<declare-styleable name="EditText">
</declare-styleable>
+ <declare-styleable name="FastScroll">
+ <!-- Drawable used for the scroll bar thumb. -->
+ <attr name="thumbDrawable" format="reference" />
+ <!-- Minimum width of the thumb. -->
+ <attr name="thumbMinWidth" format="dimension" />
+ <!-- Minimum height of the thumb. -->
+ <attr name="thumbMinHeight" format="dimension" />
+ <!-- Drawable used for the scroll bar track. -->
+ <attr name="trackDrawable" format="reference" />
+ <!-- Drawable used for the section header preview when right-aligned. -->
+ <attr name="backgroundRight" format="reference" />
+ <!-- Drawable used for the section header preview when left-aligned. -->
+ <attr name="backgroundLeft" format="reference" />
+ <!-- Position of section header preview. -->
+ <attr name="position">
+ <!-- Floating at the top of the content. -->
+ <enum name="floating" value="0" />
+ <!-- Pinned alongside the thumb. -->
+ <enum name="atThumb" value="1" />
+ </attr>
+ <attr name="textAppearance" />
+ <attr name="textColor" />
+ <attr name="textSize" />
+ <!-- Minimum width of the section header preview. -->
+ <attr name="minWidth" />
+ <!-- Minimum height of the section header preview. -->
+ <attr name="minHeight" />
+ <!-- Padding for the section header preview. -->
+ <attr name="padding" />
+ </declare-styleable>
<declare-styleable name="FrameLayout">
<!-- Defines the drawable to draw over the content. This can be used as an overlay.
The foreground drawable participates in the padding of the content if the gravity
@@ -3958,6 +4004,30 @@
<declare-styleable name="TimePicker">
<!-- @hide The layout of the time picker. -->
<attr name="internalLayout" />
+ <!-- @hide The layout of the legacy time picker. -->
+ <attr name="legacyLayout" format="reference" />
+ <!-- @hide Enables or disable the use of the legacy layout for the TimePicker. -->
+ <attr name="legacyMode" format="boolean" />
+ <!-- @hide The color when the non legacy TimePicker is disabled. -->
+ <attr name="disabledColor" format="color|reference" />
+ <!-- @hide The color for selected text of the non legacy TimePicker. -->
+ <attr name="headerSelectedTextColor" format="color|reference" />
+ <!-- @hide The color for unselected text of the non legacy TimePicker. -->
+ <attr name="headerUnselectedTextColor" format="color|reference" />
+ <!-- @hide The background color for the header of the non legacy TimePicker. -->
+ <attr name="headerBackgroundColor" format="color|reference" />
+ <!-- @hide The color for the hours/minutes numbers of the non legacy TimePicker. -->
+ <attr name="numbersTextColor" format="color|reference" />
+ <!-- @hide The background color for the hours/minutes numbers of the non legacy TimePicker. -->
+ <attr name="numbersBackgroundColor" format="color|reference" />
+ <!-- @hide The color for the AM/PM selectors of the non legacy TimePicker. -->
+ <attr name="amPmTextColor" format="color|reference" />
+ <!-- @hide The background color for the AM/PM selectors of the non legacy TimePicker when unselected. -->
+ <attr name="amPmUnselectedBackgroundColor" format="color|reference" />
+ <!-- @hide The background color for the AM/PM selectors of the non legacy TimePicker when selected. -->
+ <attr name="amPmSelectedBackgroundColor" format="color|reference" />
+ <!-- @hide The color for the hours/minutes selector of the non legacy TimePicker. -->
+ <attr name="numbersSelectorColor" format="color|reference" />
</declare-styleable>
<!-- ========================= -->
diff --git a/core/res/res/values/colors.xml b/core/res/res/values/colors.xml
index 28e7af7..7cd2582 100644
--- a/core/res/res/values/colors.xml
+++ b/core/res/res/values/colors.xml
@@ -202,5 +202,22 @@
<color name="keyguard_avatar_frame_pressed_color">#ff35b5e5</color>
<color name="accessibility_focus_highlight">#80ffff00</color>
+
+ <!-- New TimePicker colors -->
+ <color name="timepicker_default_background_holo_light">@android:color/white</color>
+ <color name="timepicker_default_background_holo_dark">#ff303030</color>
+
+ <color name="timepicker_default_text_color_holo_light">#8c8c8c</color>
+ <color name="timepicker_default_text_color_holo_dark">@android:color/white</color>
+
+ <color name="timepicker_default_disabled_color_holo_light">#7f000000</color>
+ <color name="timepicker_default_disabled_color_holo_dark">#7f08c8c8</color>
+
+ <color name="timepicker_default_ampm_selected_background_color_holo_light">@android:color/holo_blue_light</color>
+ <color name="timepicker_default_ampm_selected_background_color_holo_dark">@android:color/holo_blue_light</color>
+
+ <color name="timepicker_default_ampm_unselected_background_color_holo_light">@android:color/white</color>
+ <color name="timepicker_default_ampm_unselected_background_color_holo_dark">@android:color/transparent</color>
+
</resources>
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 42ea384..db16e55 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -508,6 +508,12 @@
<item>40</item>
</integer-array>
+ <!-- Vibrator pattern for feedback when selecting an hour/minute tick of a Clock -->
+ <integer-array name="config_clockTickVibePattern">
+ <item>125</item>
+ <item>5</item>
+ </integer-array>
+
<!-- Vibrator pattern for feedback about booting with safe mode disabled -->
<integer-array name="config_safeModeDisabledVibePattern">
<item>0</item>
diff --git a/core/res/res/values/dimens.xml b/core/res/res/values/dimens.xml
index f96195c..c6d2947 100644
--- a/core/res/res/values/dimens.xml
+++ b/core/res/res/values/dimens.xml
@@ -50,16 +50,6 @@
<!-- Margin at the edge of the screen to ignore touch events for in the windowshade. -->
<dimen name="status_bar_edge_ignore">5dp</dimen>
- <!-- Minimum size of the fastscroll overlay -->
- <dimen name="fastscroll_overlay_size">104dp</dimen>
- <!-- Text size of the fastscroll overlay -->
- <dimen name="fastscroll_overlay_text_size">52sp</dimen>
- <!-- Padding of the fastscroll overlay -->
- <dimen name="fastscroll_overlay_padding">16dp</dimen>
- <!-- Width of the fastscroll thumb -->
- <dimen name="fastscroll_thumb_width">64dp</dimen>
- <!-- Height of the fastscroll thumb -->
- <dimen name="fastscroll_thumb_height">52dp</dimen>
<!-- Min width for a tablet device -->
<dimen name="min_xlarge_screen_width">800dp</dimen>
@@ -356,6 +346,32 @@
<!-- Outline width for video subtitles. -->
<dimen name="subtitle_outline_width">2dp</dimen>
+ <!-- New TimePicker dimensions. -->
+ <item name="timepicker_circle_radius_multiplier" format="float" type="string">0.82</item>
+ <item name="timepicker_circle_radius_multiplier_24HourMode" format="float" type="string">0.85</item>
+ <item name="timepicker_selection_radius_multiplier" format="float" type="string">0.16</item>
+ <item name="timepicker_ampm_circle_radius_multiplier" format="float" type="string">0.19</item>
+ <item name="timepicker_numbers_radius_multiplier_normal" format="float" type="string">0.81</item>
+ <item name="timepicker_numbers_radius_multiplier_inner" format="float" type="string">0.60</item>
+ <item name="timepicker_numbers_radius_multiplier_outer" format="float" type="string">0.83</item>
+ <item name="timepicker_text_size_multiplier_normal" format="float" type="string">0.17</item>
+ <item name="timepicker_text_size_multiplier_inner" format="float" type="string">0.14</item>
+ <item name="timepicker_text_size_multiplier_outer" format="float" type="string">0.11</item>
+ <item name="timepicker_transition_mid_radius_multiplier" format="float" type="string">0.95</item>
+ <item name="timepicker_transition_end_radius_multiplier" format="float" type="string">1.3</item>
+
+ <dimen name="timepicker_time_label_size">60sp</dimen>
+ <dimen name="timepicker_extra_time_label_margin">-30dp</dimen>
+ <dimen name="timepicker_ampm_label_size">16sp</dimen>
+ <dimen name="timepicker_done_label_size">14sp</dimen>
+ <dimen name="timepicker_ampm_left_padding">6dip</dimen>
+ <dimen name="timepicker_separator_padding">4dip</dimen>
+ <dimen name="timepicker_header_height">96dip</dimen>
+ <dimen name="timepicker_minimum_margin_sides">48dip</dimen>
+ <dimen name="timepicker_minimum_margin_top_bottom">24dip</dimen>
+ <dimen name="timepicker_radial_picker_dimen">270dip</dimen>
+
<!-- width of ImmersiveModeConfirmation (-1 for match_parent) -->
<dimen name="immersive_mode_cling_width">-1px</dimen>
+
</resources>
diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml
index 8187939..dcaf6b3 100644
--- a/core/res/res/values/public.xml
+++ b/core/res/res/values/public.xml
@@ -2087,4 +2087,22 @@
<public type="style" name="Theme.DeviceDefault.NoActionBar.TranslucentDecor" id="0x010301e3" />
<public type="style" name="Theme.DeviceDefault.Light.NoActionBar.TranslucentDecor" id="0x010301e4" />
+<!-- ===============================================================
+ Resources added in version 20 of the platform
+ =============================================================== -->
+ <eat-comment />
+
+ <public type="attr" name="fragmentBreadCrumbsStyle" />
+ <public type="attr" name="fastScrollStyle" />
+
+ <public type="style" name="Widget.Holo.FragmentBreadCrumbs" />
+ <public type="style" name="Widget.Holo.Light.FragmentBreadCrumbs" />
+ <public type="style" name="Widget.DeviceDefault.FragmentBreadCrumbs" />
+ <public type="style" name="Widget.DeviceDefault.Light.FragmentBreadCrumbs" />
+ <public type="style" name="Widget.FastScroll" />
+ <public type="style" name="Widget.Holo.FastScroll" />
+ <public type="style" name="Widget.Holo.Light.FastScroll" />
+ <public type="style" name="Widget.DeviceDefault.FastScroll" />
+ <public type="style" name="Widget.DeviceDefault.Light.FastScroll" />
+
</resources>
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index 62f26c6..a554407 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -1425,6 +1425,11 @@
<string name="permdesc_readFrameBuffer">Allows the app to read the content of the frame buffer.</string>
<!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permlab_accessInputFlinger">access InputFlinger</string>
+ <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permdesc_accessInputFlinger">Allows the app to use InputFlinger low-level features.</string>
+
+ <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permlab_configureWifiDisplay">configure Wifi displays</string>
<!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permdesc_configureWifiDisplay">Allows the app to configure and connect to Wifi displays.</string>
@@ -4499,4 +4504,55 @@
<!-- Cling help message when hiding the navigation bar entering immersive mode [CHAR LIMIT=none] -->
<string name="immersive_mode_confirmation" msgid="8554991488096662508">Swipe down from the top to exit full screen.</string>
+ <!-- Label for button to confirm chosen date or time [CHAR LIMIT=30] -->
+ <string name="done_label">Done</string>
+ <!--
+ Content description for the hour selector in the time picker, which displays
+ selectable hours of the day along the inside edge of a circle, as in an analog clock.
+ [CHAR LIMIT=50]
+ -->
+ <string name="hour_picker_description">Hours circular slider</string>
+ <!--
+ Content description for the minute selector in the time picker, which displays
+ selectable five-minute intervals along the inside edge of a circle, as in an analog clock.
+ [CHAR LIMIT=50]
+ -->
+ <string name="minute_picker_description">Minutes circular slider</string>
+ <!-- Accessibility announcement for hour circular picker [CHAR LIMIT=NONE] -->
+ <string name="select_hours">Select hours</string>
+ <!-- Accessibility announcement for minute circular picker [CHAR LIMIT=NONE] -->
+ <string name="select_minutes">Select minutes</string>
+
+ <!--
+ Content description for the month and day selector in the date picker, which displays
+ a selectable grid of days laid out by month.
+ [CHAR LIMIT=50]
+ -->
+ <string name="day_picker_description">Month grid of days</string>
+ <!--
+ Content description for the year selector in the date picker, which displays
+ a scrolling, vertical list of years.
+ [CHAR LIMIT=50]
+ -->
+ <string name="year_picker_description">Year list</string>
+ <!-- Accessibility announcement for the day picker [CHAR LIMIT=NONE] -->
+ <string name="select_day">Select month and day</string>
+ <!-- Accessibility announcement for the year picker [CHAR LIMIT=NONE] -->
+ <string name="select_year">Select year</string>
+ <!-- Accessibility description for the item that is currently selected. -->
+ <string name="item_is_selected"><xliff:g id="item" example="2013">%1$s</xliff:g> selected</string>
+ <!-- Accessibility announcement when a number that had been typed in is deleted [CHAR_LIMIT=NONE] -->
+ <string name="deleted_key"><xliff:g id="key" example="4">%1$s</xliff:g> deleted</string>
+
+ <!-- DO NOT TRANSLATE -->
+ <string name="time_placeholder">--</string>
+
+ <!-- DO NOT TRANSLATE -->
+ <string name="radial_numbers_typeface">sans-serif</string>
+ <!-- DO NOT TRANSLATE -->
+ <string name="sans_serif">sans-serif</string>
+
+ <!-- DO NOT TRANSLATE -->
+ <string name="day_of_week_label_typeface">sans-serif</string>
+
</resources>
diff --git a/core/res/res/values/styles.xml b/core/res/res/values/styles.xml
index cb2fd6d..b1a86f8c 100644
--- a/core/res/res/values/styles.xml
+++ b/core/res/res/values/styles.xml
@@ -292,6 +292,7 @@ please see styles_device_defaults.xml.
<style name="Widget.AbsListView">
<item name="android:scrollbars">vertical</item>
<item name="android:fadingEdge">vertical</item>
+ <item name="android:fastScrollStyle">?android:attr/fastScrollStyle</item>
</style>
<style name="Widget.GestureOverlayView">
@@ -510,6 +511,11 @@ please see styles_device_defaults.xml.
<item name="android:childDivider">@android:drawable/divider_horizontal_bright_opaque</item>
</style>
+ <style name="Widget.FragmentBreadCrumbs">
+ <item name="android:padding">4dp</item>
+ <item name="android:animateLayoutChanges">true</item>
+ </style>
+
<style name="Widget.ImageWell">
<item name="android:background">@android:drawable/panel_picture_frame_background</item>
</style>
@@ -544,7 +550,7 @@ please see styles_device_defaults.xml.
</style>
<style name="Widget.TimePicker">
- <item name="android:internalLayout">@android:layout/time_picker</item>
+ <item name="android:legacyLayout">@android:layout/time_picker_legacy</item>
</style>
<style name="Widget.DatePicker">
@@ -681,12 +687,6 @@ please see styles_device_defaults.xml.
<item name="android:popupAnimationStyle">@android:style/Animation.PopupWindow</item>
</style>
- <!-- Default style for {@link android.app.FragmentBreadCrumbs} view. -->
- <style name="Widget.FragmentBreadCrumbs">
- <item name="android:padding">4dp</item>
- <item name="android:animateLayoutChanges">true</item>
- </style>
-
<style name="Widget.KeyboardView" parent="android:Widget">
<item name="android:background">@android:drawable/keyboard_background</item>
<item name="android:keyBackground">@android:drawable/btn_keyboard_key</item>
@@ -1662,6 +1662,9 @@ please see styles_device_defaults.xml.
<style name="Widget.Holo.ExpandableListView.White">
</style>
+ <style name="Widget.Holo.FragmentBreadCrumbs" parent="Widget.FragmentBreadCrumbs">
+ </style>
+
<style name="Widget.Holo.Gallery" parent="Widget.Gallery">
</style>
@@ -1698,7 +1701,18 @@ please see styles_device_defaults.xml.
</style>
<style name="Widget.Holo.TimePicker" parent="Widget.TimePicker">
+ <item name="android:legacyLayout">@android:layout/time_picker_legacy_holo</item>
<item name="android:internalLayout">@android:layout/time_picker_holo</item>
+ <item name="android:disabledColor">@android:color/timepicker_default_disabled_color_holo_dark</item>
+ <item name="android:headerSelectedTextColor">@android:color/holo_blue_light</item>
+ <item name="android:headerUnselectedTextColor">@android:color/timepicker_default_text_color_holo_dark</item>
+ <item name="android:headerBackgroundColor">@android:color/timepicker_default_background_holo_dark</item>
+ <item name="android:numbersTextColor">@android:color/timepicker_default_text_color_holo_dark</item>
+ <item name="android:numbersBackgroundColor">@android:color/timepicker_default_background_holo_dark</item>
+ <item name="android:amPmTextColor">@android:color/timepicker_default_text_color_holo_dark</item>
+ <item name="android:amPmUnselectedBackgroundColor">@android:color/timepicker_default_background_holo_dark</item>
+ <item name="android:amPmSelectedBackgroundColor">@android:color/holo_blue_light</item>
+ <item name="android:numbersSelectorColor">@android:color/holo_blue_light</item>
</style>
<style name="Widget.Holo.DatePicker" parent="Widget.DatePicker">
@@ -2091,6 +2105,9 @@ please see styles_device_defaults.xml.
<style name="Widget.Holo.Light.ExpandableListView.White">
</style>
+ <style name="Widget.Holo.Light.FragmentBreadCrumbs" parent="Widget.FragmentBreadCrumbs">
+ </style>
+
<style name="Widget.Holo.Light.Gallery" parent="Widget.Gallery">
</style>
@@ -2116,7 +2133,19 @@ please see styles_device_defaults.xml.
<style name="Widget.Holo.Light.NumberPicker" parent="Widget.Holo.NumberPicker">
</style>
- <style name="Widget.Holo.Light.TimePicker" parent="Widget.Holo.TimePicker">
+ <style name="Widget.Holo.Light.TimePicker" parent="Widget.TimePicker">
+ <item name="android:legacyLayout">@android:layout/time_picker_legacy_holo</item>
+ <item name="android:internalLayout">@android:layout/time_picker_holo</item>
+ <item name="android:disabledColor">@android:color/timepicker_default_disabled_color_holo_light</item>
+ <item name="android:headerSelectedTextColor">@android:color/holo_blue_light</item>
+ <item name="android:headerUnselectedTextColor">@android:color/timepicker_default_text_color_holo_light</item>
+ <item name="android:headerBackgroundColor">@android:color/timepicker_default_background_holo_light</item>
+ <item name="android:numbersTextColor">@android:color/timepicker_default_text_color_holo_light</item>
+ <item name="android:numbersBackgroundColor">@android:color/timepicker_default_background_holo_light</item>
+ <item name="android:amPmTextColor">@android:color/timepicker_default_text_color_holo_light</item>
+ <item name="android:amPmUnselectedBackgroundColor">@android:color/timepicker_default_background_holo_light</item>
+ <item name="android:amPmSelectedBackgroundColor">@android:color/holo_blue_light</item>
+ <item name="android:numbersSelectorColor">@android:color/holo_blue_light</item>
</style>
<style name="Widget.Holo.Light.DatePicker" parent="Widget.Holo.DatePicker">
@@ -2531,4 +2560,57 @@ please see styles_device_defaults.xml.
<item name="android:textColor">#80ffffff</item>
</style>
+ <style name="TextAppearance.TimePicker.TimeLabel" parent="TextAppearance">
+ </style>
+
+ <style name="TextAppearance.TimePicker.AmPmLabel" parent="TextAppearance">
+ </style>
+
+ <style name="TextAppearance.Holo.TimePicker.TimeLabel" parent="TextAppearance.Holo">
+ <item name="android:textSize">@dimen/timepicker_time_label_size</item>
+ <item name="android:textColor">@android:color/timepicker_default_text_color_holo_dark</item>
+ </style>
+
+ <style name="TextAppearance.Holo.TimePicker.AmPmLabel" parent="TextAppearance.Holo">
+ <item name="android:textSize">@dimen/timepicker_ampm_label_size</item>
+ <item name="android:textAllCaps">true</item>
+ <item name="android:textColor">@android:color/timepicker_default_text_color_holo_dark</item>
+ <item name="android:textStyle">bold</item>
+ </style>
+
+ <style name="TextAppearance.Holo.Light.TimePicker.TimeLabel" parent="TextAppearance.Holo.Light">
+ <item name="android:textSize">@dimen/timepicker_time_label_size</item>
+ <item name="android:textColor">@color/timepicker_default_text_color_holo_light</item>
+ </style>
+
+ <style name="TextAppearance.Holo.Light.TimePicker.AmPmLabel" parent="TextAppearance.Holo.Light">
+ <item name="android:textSize">@dimen/timepicker_ampm_label_size</item>
+ <item name="android:textAllCaps">true</item>
+ <item name="android:textColor">@color/timepicker_default_text_color_holo_light</item>
+ <item name="android:textStyle">bold</item>
+ </style>
+
+ <style name="Widget.FastScroll">
+ <item name="android:thumbDrawable">?android:attr/fastScrollThumbDrawable</item>
+ <item name="android:trackDrawable">?android:attr/fastScrollTrackDrawable</item>
+ <item name="android:backgroundLeft">?android:attr/fastScrollPreviewBackgroundLeft</item>
+ <item name="android:backgroundRight">?android:attr/fastScrollPreviewBackgroundRight</item>
+ <item name="android:position">?android:attr/fastScrollOverlayPosition</item>
+ <item name="android:textColor">?android:attr/fastScrollTextColor</item>
+ <item name="android:thumbMinWidth">64dp</item>
+ <item name="android:thumbMinHeight">52dp</item>
+ <item name="android:textSize">52sp</item>
+ <item name="android:minWidth">72dp</item>
+ <item name="android:minHeight">72dp</item>
+ <item name="android:padding">16dp</item>
+ </style>
+
+ <style name="Widget.Holo.FastScroll" parent="Widget.FastScroll">
+ <item name="android:thumbMinWidth">0dp</item>
+ <item name="android:thumbMinHeight">0dp</item>
+ </style>
+
+ <style name="Widget.Holo.Light.FastScroll" parent="Widget.Holo.FastScroll">
+ </style>
+
</resources>
diff --git a/core/res/res/values/styles_device_defaults.xml b/core/res/res/values/styles_device_defaults.xml
index edeba02..512c9b8 100644
--- a/core/res/res/values/styles_device_defaults.xml
+++ b/core/res/res/values/styles_device_defaults.xml
@@ -206,6 +206,12 @@ easier.
<style name="Widget.DeviceDefault.ExpandableListView.White" parent="Widget.Holo.ExpandableListView.White">
</style>
+ <style name="Widget.DeviceDefault.FastScroll" parent="Widget.Holo.FastScroll">
+
+ </style>
+ <style name="Widget.DeviceDefault.FragmentBreadCrumbs" parent="Widget.Holo.FragmentBreadCrumbs">
+
+ </style>
<style name="Widget.DeviceDefault.Gallery" parent="Widget.Holo.Gallery">
</style>
@@ -309,6 +315,12 @@ easier.
<style name="Widget.DeviceDefault.Light.ExpandableListView" parent="Widget.Holo.Light.ExpandableListView" >
</style>
+ <style name="Widget.DeviceDefault.Light.FastScroll" parent="Widget.Holo.Light.FastScroll">
+
+ </style>
+ <style name="Widget.DeviceDefault.Light.FragmentBreadCrumbs" parent="Widget.Holo.Light.FragmentBreadCrumbs">
+
+ </style>
<style name="Widget.DeviceDefault.Light.GridView" parent="Widget.Holo.Light.GridView" >
</style>
@@ -729,4 +741,22 @@ easier.
<style name="Widget.DeviceDefault.MediaRouteButton" parent="Widget.Holo.MediaRouteButton" />
<style name="Widget.DeviceDefault.Light.MediaRouteButton" parent="Widget.Holo.Light.MediaRouteButton" />
+ <style name="TextAppearance.DeviceDefault.TimePicker.TimeLabel" parent="TextAppearance.Holo.TimePicker.TimeLabel">
+ </style>
+
+ <style name="TextAppearance.DeviceDefault.Light.TimePicker.TimeLabel" parent="TextAppearance.Holo.Light.TimePicker.TimeLabel">
+ </style>
+
+ <style name="TextAppearance.DeviceDefault.TimePicker.AmPmLabel" parent="TextAppearance.Holo.TimePicker.AmPmLabel">
+ </style>
+
+ <style name="TextAppearance.DeviceDefault.Light.TimePicker.AmPmLabel" parent="TextAppearance.Holo.Light.TimePicker.AmPmLabel">
+ </style>
+
+ <style name="Theme.DeviceDefault.Dialog.TimePicker" parent="Theme.Holo.Dialog.TimePicker">
+ </style>
+
+ <style name="Theme.DeviceDefault.Light.Dialog.TimePicker" parent="Theme.Holo.Light.Dialog.TimePicker">
+ </style>
+
</resources>
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index 22a9402..26a56a5 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -224,6 +224,7 @@
<java-symbol type="attr" name="actionModeShareDrawable" />
<java-symbol type="attr" name="alertDialogCenterButtons" />
+ <java-symbol type="attr" name="fragmentBreadCrumbsStyle" />
<java-symbol type="attr" name="gestureOverlayViewStyle" />
<java-symbol type="attr" name="keyboardViewStyle" />
<java-symbol type="attr" name="numberPickerStyle" />
@@ -331,11 +332,6 @@
<java-symbol type="dimen" name="default_gap" />
<java-symbol type="dimen" name="dropdownitem_icon_width" />
<java-symbol type="dimen" name="dropdownitem_text_padding_left" />
- <java-symbol type="dimen" name="fastscroll_overlay_size" />
- <java-symbol type="dimen" name="fastscroll_overlay_text_size" />
- <java-symbol type="dimen" name="fastscroll_overlay_padding" />
- <java-symbol type="dimen" name="fastscroll_thumb_height" />
- <java-symbol type="dimen" name="fastscroll_thumb_width" />
<java-symbol type="dimen" name="password_keyboard_spacebar_vertical_correction" />
<java-symbol type="dimen" name="search_view_preferred_width" />
<java-symbol type="dimen" name="textview_error_popup_default_width" />
@@ -1174,7 +1170,7 @@
<java-symbol type="layout" name="tab_content" />
<java-symbol type="layout" name="tab_indicator_holo" />
<java-symbol type="layout" name="textview_hint" />
- <java-symbol type="layout" name="time_picker" />
+ <java-symbol type="layout" name="time_picker_legacy" />
<java-symbol type="layout" name="time_picker_dialog" />
<java-symbol type="layout" name="transient_notification" />
<java-symbol type="layout" name="volume_adjust" />
@@ -1750,4 +1746,55 @@
<java-symbol type="dimen" name="subtitle_shadow_radius" />
<java-symbol type="dimen" name="subtitle_shadow_offset" />
<java-symbol type="dimen" name="subtitle_outline_width" />
+
+ <!-- From the new TimePicker -->
+ <java-symbol type="attr" name="timePickerHeaderBackgroundColor" />
+ <java-symbol type="attr" name="timePickerDialogTheme" />
+ <java-symbol type="attr" name="headerSelectedTextColor" />
+ <java-symbol type="attr" name="headerUnselectedTextColor" />
+ <java-symbol type="attr" name="numbersTextColor" />
+ <java-symbol type="attr" name="numbersBackgroundColor" />
+ <java-symbol type="attr" name="amPmTextColor" />
+ <java-symbol type="attr" name="amPmUnselectedBackgroundColor" />
+ <java-symbol type="attr" name="amPmSelectedBackgroundColor" />
+ <java-symbol type="attr" name="numbersSelectorColor" />
+ <java-symbol type="attr" name="timePickerHeaderTimeLabelTextAppearance" />
+ <java-symbol type="style" name="TextAppearance.Holo.TimePicker.TimeLabel" />
+ <java-symbol type="layout" name="time_picker_holo" />
+ <java-symbol type="layout" name="time_header_label" />
+ <java-symbol type="id" name="time_header" />
+ <java-symbol type="id" name="hours" />
+ <java-symbol type="id" name="minutes" />
+ <java-symbol type="id" name="ampm_label" />
+ <java-symbol type="id" name="radial_picker" />
+ <java-symbol type="id" name="separator" />
+ <java-symbol type="id" name="layout_buttons" />
+ <java-symbol type="id" name="done_button" />
+ <java-symbol type="string" name="done_label" />
+ <java-symbol type="string" name="hour_picker_description" />
+ <java-symbol type="string" name="minute_picker_description" />
+ <java-symbol type="string" name="select_hours" />
+ <java-symbol type="string" name="select_minutes" />
+ <java-symbol type="string" name="time_placeholder" />
+ <java-symbol type="string" name="timepicker_circle_radius_multiplier" />
+ <java-symbol type="string" name="timepicker_circle_radius_multiplier_24HourMode" />
+ <java-symbol type="string" name="timepicker_ampm_circle_radius_multiplier" />
+ <java-symbol type="string" name="deleted_key" />
+ <java-symbol type="string" name="sans_serif" />
+ <java-symbol type="string" name="radial_numbers_typeface" />
+ <java-symbol type="string" name="timepicker_text_size_multiplier_inner" />
+ <java-symbol type="string" name="timepicker_text_size_multiplier_outer" />
+ <java-symbol type="string" name="timepicker_text_size_multiplier_normal" />
+ <java-symbol type="string" name="timepicker_numbers_radius_multiplier_outer" />
+ <java-symbol type="string" name="timepicker_selection_radius_multiplier" />
+ <java-symbol type="string" name="timepicker_numbers_radius_multiplier_inner" />
+ <java-symbol type="string" name="timepicker_numbers_radius_multiplier_normal" />
+ <java-symbol type="string" name="timepicker_transition_mid_radius_multiplier" />
+ <java-symbol type="string" name="timepicker_transition_end_radius_multiplier" />
+ <java-symbol type="color" name="timepicker_default_text_color_holo_light" />
+ <java-symbol type="color" name="timepicker_default_disabled_color_holo_light" />
+ <java-symbol type="color" name="timepicker_default_ampm_unselected_background_color_holo_light" />
+ <java-symbol type="color" name="timepicker_default_ampm_selected_background_color_holo_light" />
+ <java-symbol type="array" name="config_clockTickVibePattern" />
+
</resources>
diff --git a/core/res/res/values/themes.xml b/core/res/res/values/themes.xml
index 4c80e7d..b79f916 100644
--- a/core/res/res/values/themes.xml
+++ b/core/res/res/values/themes.xml
@@ -249,6 +249,7 @@ please see themes_device_defaults.xml.
<item name="editTextStyle">@android:style/Widget.EditText</item>
<item name="expandableListViewStyle">@android:style/Widget.ExpandableListView</item>
<item name="expandableListViewWhiteStyle">@android:style/Widget.ExpandableListView.White</item>
+ <item name="fastScrollStyle">@android:style/Widget.FastScroll</item>
<item name="galleryStyle">@android:style/Widget.Gallery</item>
<item name="gestureOverlayViewStyle">@android:style/Widget.GestureOverlayView</item>
<item name="gridViewStyle">@android:style/Widget.GridView</item>
@@ -296,8 +297,8 @@ please see themes_device_defaults.xml.
<item name="listPopupWindowStyle">@android:style/Widget.ListPopupWindow</item>
<item name="popupMenuStyle">@android:style/Widget.PopupMenu</item>
<item name="activityChooserViewStyle">@android:style/Widget.ActivityChooserView</item>
-
<item name="mediaRouteButtonStyle">@android:style/Widget.DeviceDefault.MediaRouteButton</item>
+ <item name="fragmentBreadCrumbsStyle">@android:style/Widget.FragmentBreadCrumbs</item>
<!-- Preference styles -->
<item name="preferenceScreenStyle">@android:style/Preference.PreferenceScreen</item>
@@ -382,6 +383,18 @@ please see themes_device_defaults.xml.
<!-- TimePicker style -->
<item name="timePickerStyle">@style/Widget.TimePicker</item>
+ <!-- TimePicker background color -->
+ <item name="timePickerHeaderBackgroundColor">@android:color/darker_gray</item>
+
+ <!-- TimePicker Header time label text appearance -->
+ <item name="timePickerHeaderTimeLabelTextAppearance">@style/TextAppearance.TimePicker.TimeLabel</item>
+
+ <!-- TimePicker Header am pm label text appearance -->
+ <item name="timePickerHeaderAmPmLabelTextAppearance">@style/TextAppearance.TimePicker.AmPmLabel</item>
+
+ <!-- TimePicker dialog theme -->
+ <item name="timePickerDialogTheme">@android:style/Theme.Dialog.TimePicker</item>
+
<!-- DatePicker style -->
<item name="datePickerStyle">@style/Widget.DatePicker</item>
@@ -391,7 +404,6 @@ please see themes_device_defaults.xml.
<item name="fastScrollPreviewBackgroundLeft">@android:drawable/menu_submenu_background</item>
<item name="fastScrollOverlayPosition">floating</item>
<item name="fastScrollTextColor">@android:color/primary_text_dark</item>
-
<!-- Pointer style -->
<item name="pointerStyle">@android:style/Pointer</item>
@@ -688,7 +700,15 @@ please see themes_device_defaults.xml.
<item name="textAppearanceListItem">@android:style/TextAppearance.Large.Inverse</item>
<item name="textAppearanceListItemSmall">@android:style/TextAppearance.Large.Inverse</item>
</style>
-
+
+ <!-- Default heme for the TimePicker dialog windows, which is used by the
+ {@link android.app.TimePickerDialog} class. -->
+ <style name="Theme.Dialog.TimePicker">
+ <item name="windowBackground">@android:color/transparent</item>
+ <item name="windowTitleStyle">@android:style/DialogWindowTitle</item>
+ <item name="windowContentOverlay">@null</item>
+ </style>
+
<!-- Default dark theme for panel windows (on API level 10 and lower). This removes all
extraneous window decorations, so you basically have an empty rectangle in which
to place your content. It makes the window floating, with a transparent
@@ -1088,6 +1108,7 @@ please see themes_device_defaults.xml.
<item name="editTextStyle">@android:style/Widget.Holo.EditText</item>
<item name="expandableListViewStyle">@android:style/Widget.Holo.ExpandableListView</item>
<item name="expandableListViewWhiteStyle">@android:style/Widget.Holo.ExpandableListView.White</item>
+ <item name="fastScrollStyle">@android:style/Widget.Holo.FastScroll</item>
<item name="galleryStyle">@android:style/Widget.Holo.Gallery</item>
<item name="gestureOverlayViewStyle">@android:style/Widget.Holo.GestureOverlayView</item>
<item name="gridViewStyle">@android:style/Widget.Holo.GridView</item>
@@ -1135,6 +1156,7 @@ please see themes_device_defaults.xml.
<item name="popupMenuStyle">@android:style/Widget.Holo.PopupMenu</item>
<item name="stackViewStyle">@android:style/Widget.Holo.StackView</item>
<item name="activityChooserViewStyle">@android:style/Widget.Holo.ActivityChooserView</item>
+ <item name="fragmentBreadCrumbsStyle">@android:style/Widget.Holo.FragmentBreadCrumbs</item>
<!-- Preference styles -->
<item name="preferenceScreenStyle">@android:style/Preference.Holo.PreferenceScreen</item>
@@ -1202,6 +1224,18 @@ please see themes_device_defaults.xml.
<!-- TimePicker style -->
<item name="timePickerStyle">@style/Widget.Holo.TimePicker</item>
+ <!-- TimePicker background color -->
+ <item name="timePickerHeaderBackgroundColor">@android:color/timepicker_default_background_holo_dark</item>
+
+ <!-- TimePicker Header time label text appearance -->
+ <item name="timePickerHeaderTimeLabelTextAppearance">@style/TextAppearance.Holo.TimePicker.TimeLabel</item>
+
+ <!-- TimePicker Header am pm label text appearance -->
+ <item name="timePickerHeaderAmPmLabelTextAppearance">@style/TextAppearance.Holo.TimePicker.AmPmLabel</item>
+
+ <!-- TimePicker dialog theme -->
+ <item name="timePickerDialogTheme">@android:style/Theme.Holo.Dialog.TimePicker</item>
+
<!-- DatePicker style -->
<item name="datePickerStyle">@style/Widget.Holo.DatePicker</item>
@@ -1403,6 +1437,7 @@ please see themes_device_defaults.xml.
<item name="editTextStyle">@android:style/Widget.Holo.Light.EditText</item>
<item name="expandableListViewStyle">@android:style/Widget.Holo.Light.ExpandableListView</item>
<item name="expandableListViewWhiteStyle">@android:style/Widget.Holo.Light.ExpandableListView.White</item>
+ <item name="fastScrollStyle">@android:style/Widget.Holo.Light.FastScroll</item>
<item name="galleryStyle">@android:style/Widget.Holo.Light.Gallery</item>
<item name="gestureOverlayViewStyle">@android:style/Widget.Holo.Light.GestureOverlayView</item>
<item name="gridViewStyle">@android:style/Widget.Holo.Light.GridView</item>
@@ -1450,6 +1485,7 @@ please see themes_device_defaults.xml.
<item name="popupMenuStyle">@android:style/Widget.Holo.Light.PopupMenu</item>
<item name="stackViewStyle">@android:style/Widget.Holo.StackView</item>
<item name="activityChooserViewStyle">@android:style/Widget.Holo.Light.ActivityChooserView</item>
+ <item name="fragmentBreadCrumbsStyle">@android:style/Widget.Holo.Light.FragmentBreadCrumbs</item>
<!-- Preference styles -->
<item name="preferenceScreenStyle">@android:style/Preference.Holo.PreferenceScreen</item>
@@ -1517,6 +1553,18 @@ please see themes_device_defaults.xml.
<!-- TimePicker style -->
<item name="timePickerStyle">@style/Widget.Holo.Light.TimePicker</item>
+ <!-- TimePicker Header background color -->
+ <item name="timePickerHeaderBackgroundColor">@android:color/timepicker_default_background_holo_light</item>
+
+ <!-- TimePicker Header time label text appearance -->
+ <item name="timePickerHeaderTimeLabelTextAppearance">@style/TextAppearance.Holo.Light.TimePicker.TimeLabel</item>
+
+ <!-- TimePicker Header am pm label text appearance -->
+ <item name="timePickerHeaderAmPmLabelTextAppearance">@style/TextAppearance.Holo.Light.TimePicker.AmPmLabel</item>
+
+ <!-- TimePicker dialog theme -->
+ <item name="timePickerDialogTheme">@android:style/Theme.Holo.Light.Dialog.TimePicker</item>
+
<!-- DatePicker style -->
<item name="datePickerStyle">@style/Widget.Holo.Light.DatePicker</item>
@@ -1729,6 +1777,14 @@ please see themes_device_defaults.xml.
<item name="android:windowMinWidthMinor">@android:dimen/dialog_min_width_minor</item>
</style>
+ <!-- Holo theme for the TimePicker dialog windows, which is used by the
+ {@link android.app.TimePickerDialog} class. -->
+ <style name="Theme.Holo.Dialog.TimePicker">
+ <item name="windowBackground">@android:color/transparent</item>
+ <item name="windowTitleStyle">@android:style/DialogWindowTitle.Holo</item>
+ <item name="windowContentOverlay">@null</item>
+ </style>
+
<!-- Theme for a window that will be displayed either full-screen on
smaller screens (small, normal) or as a dialog on larger screens
(large, xlarge). -->
@@ -1844,6 +1900,14 @@ please see themes_device_defaults.xml.
<item name="android:windowMinWidthMinor">@android:dimen/dialog_min_width_minor</item>
</style>
+ <!-- Holo Light theme for the TimePicker dialog windows, which is used by the
+ {@link android.app.TimePickerDialog} class. -->
+ <style name="Theme.Holo.Light.Dialog.TimePicker">
+ <item name="windowBackground">@android:color/transparent</item>
+ <item name="windowTitleStyle">@android:style/DialogWindowTitle.Holo.Light</item>
+ <item name="windowContentOverlay">@null</item>
+ </style>
+
<!-- Theme for a presentation window on a secondary display. -->
<style name="Theme.Holo.Light.Dialog.Presentation" parent="@android:style/Theme.Holo.Light.NoActionBar.Fullscreen" >
</style>
diff --git a/core/res/res/values/themes_device_defaults.xml b/core/res/res/values/themes_device_defaults.xml
index 721c6b0..19556a1 100644
--- a/core/res/res/values/themes_device_defaults.xml
+++ b/core/res/res/values/themes_device_defaults.xml
@@ -194,6 +194,15 @@ easier.
<!-- TimePicker style -->
<item name="timePickerStyle">@style/Widget.DeviceDefault.TimePicker</item>
+ <!-- TimePicker Header time label text appearance -->
+ <item name="timePickerHeaderTimeLabelTextAppearance">@style/TextAppearance.DeviceDefault.TimePicker.TimeLabel</item>
+
+ <!-- TimePicker Header am pm label text appearance -->
+ <item name="timePickerHeaderAmPmLabelTextAppearance">@style/TextAppearance.DeviceDefault.TimePicker.AmPmLabel</item>
+
+ <!-- TimePicker dialog theme -->
+ <item name="timePickerDialogTheme">@android:style/Theme.DeviceDefault.Dialog.TimePicker</item>
+
<!-- DatePicker style -->
<item name="datePickerStyle">@style/Widget.DeviceDefault.DatePicker</item>
@@ -363,6 +372,15 @@ easier.
<!-- TimePicker style -->
<item name="timePickerStyle">@style/Widget.DeviceDefault.Light.TimePicker</item>
+ <!-- TimePicker Header time label text appearance -->
+ <item name="timePickerHeaderTimeLabelTextAppearance">@style/TextAppearance.DeviceDefault.Light.TimePicker.TimeLabel</item>
+
+ <!-- TimePicker Header am pm label text appearance -->
+ <item name="timePickerHeaderAmPmLabelTextAppearance">@style/TextAppearance.DeviceDefault.Light.TimePicker.AmPmLabel</item>
+
+ <!-- TimePicker dialog theme -->
+ <item name="timePickerDialogTheme">@android:style/Theme.DeviceDefault.Light.Dialog.TimePicker</item>
+
<!-- DatePicker style -->
<item name="datePickerStyle">@style/Widget.DeviceDefault.Light.DatePicker</item>
diff --git a/core/tests/coretests/Android.mk b/core/tests/coretests/Android.mk
index be55444..73a53cb 100644
--- a/core/tests/coretests/Android.mk
+++ b/core/tests/coretests/Android.mk
@@ -22,6 +22,7 @@ LOCAL_SRC_FILES := \
$(call all-java-files-under, EnabledTestApp/src)
LOCAL_DX_FLAGS := --core-library
+LOCAL_AAPT_FLAGS = -0 dat -0 gld
LOCAL_STATIC_JAVA_LIBRARIES := core-tests-support android-common frameworks-core-util-lib mockwebserver guava littlemock
LOCAL_JAVA_LIBRARIES := android.test.runner conscrypt telephony-common
LOCAL_PACKAGE_NAME := FrameworksCoreTests
diff --git a/core/tests/coretests/assets/backup_mock.dat b/core/tests/coretests/assets/backup_mock.dat
new file mode 100644
index 0000000..f70b573
--- /dev/null
+++ b/core/tests/coretests/assets/backup_mock.dat
Binary files differ
diff --git a/core/tests/coretests/assets/backup_mock.gld b/core/tests/coretests/assets/backup_mock.gld
new file mode 100644
index 0000000..5197c23
--- /dev/null
+++ b/core/tests/coretests/assets/backup_mock.gld
@@ -0,0 +1,4 @@
+key1:
+key2a:YWJjZGVmZw==
+key3bc:YWJjZGVmZ2g=
+key4dad:
diff --git a/core/tests/coretests/assets/backup_real.dat b/core/tests/coretests/assets/backup_real.dat
new file mode 100644
index 0000000..2262568
--- /dev/null
+++ b/core/tests/coretests/assets/backup_real.dat
Binary files differ
diff --git a/core/tests/coretests/assets/backup_real.gld b/core/tests/coretests/assets/backup_real.gld
new file mode 100644
index 0000000..ef28f9b
--- /dev/null
+++ b/core/tests/coretests/assets/backup_real.gld
@@ -0,0 +1,3 @@
+CAEYLw:CC8QABoIR0VMIFN0dWIgnP//////////ASgBMAJAAUgBapgBI0ludGVudDthY3Rpb249YW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU47Y2F0ZWdvcnk9YW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVI7bGF1bmNoRmxhZ3M9MHgxMDIwMDAwMDtjb21wb25lbnQ9Y29tLmdvb2dsZS5hbmRyb2lkLmdlbC8uU3R1YkFwcDtlbmQ=
+CAEYLQ:
+CAEYLA:
diff --git a/core/tests/coretests/src/android/app/backup/BackupDataTest.java b/core/tests/coretests/src/android/app/backup/BackupDataTest.java
new file mode 100644
index 0000000..0c204e0
--- /dev/null
+++ b/core/tests/coretests/src/android/app/backup/BackupDataTest.java
@@ -0,0 +1,291 @@
+/*
+ * Copyright (C) 2013 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.app.backup;
+
+import android.app.backup.BackupDataInput;
+import android.app.backup.BackupDataOutput;
+import android.content.res.AssetFileDescriptor;
+import android.content.res.AssetManager;
+import android.os.Bundle;
+import android.os.Environment;
+import android.os.ParcelFileDescriptor;
+import android.test.AndroidTestCase;
+import android.test.InstrumentationTestCase;
+import android.util.Base64;
+import android.util.Log;
+import org.json.JSONObject;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.lang.Exception;
+import java.nio.ByteBuffer;
+
+public class BackupDataTest extends AndroidTestCase {
+ private static final String KEY1 = "key1";
+ private static final String KEY2 = "key2a";
+ private static final String KEY3 = "key3bc";
+ private static final String KEY4 = "key4dad"; // variable key lengths to test padding
+ private static final String[] KEYS = {KEY1, KEY2, KEY3, KEY4};
+
+ private static final String DATA1 = "abcdef";
+ private static final String DATA2 = "abcdefg";
+ private static final String DATA3 = "abcdefgh";
+ private static final String DATA4 = "abcdeffhi"; //variable data lengths to test padding
+ private static final String[] DATA = {DATA1, DATA2, DATA3, DATA4};
+ private static final String TAG = "BackupDataTest";
+
+ private File mFile;
+ private ParcelFileDescriptor mDataFile;
+ private File mDirectory;
+ private Bundle mStatusBundle;
+ private AssetManager mAssets;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ mDirectory = new File(Environment.getExternalStorageDirectory(), "test_data");
+ mDirectory.mkdirs();
+ mAssets = mContext.getAssets();
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ if (mDataFile != null) {
+ mDataFile.close();
+ }
+ }
+
+ public void testSingle() throws IOException {
+ mFile = new File(mDirectory, "backup_mixed_sinlge.dat");
+ openForWriting();
+ BackupDataOutput bdo = new BackupDataOutput(mDataFile.getFileDescriptor());
+
+ writeEntity(bdo, KEY1, DATA1.getBytes());
+
+ mDataFile.close();
+ openForReading();
+
+ BackupDataInput bdi = new BackupDataInput(mDataFile.getFileDescriptor());
+ int count = 0;
+ while (bdi.readNextHeader()) {
+ readAndVerifyEntity(bdi, KEY1, DATA1.getBytes());
+ count++;
+ }
+ assertEquals("only one entity in this stream", 1, count);
+ }
+
+ public void testMultiple() throws IOException {
+ mFile = new File(mDirectory, "backup_multiple_test.dat");
+ openForWriting();
+ BackupDataOutput bdo = new BackupDataOutput(mDataFile.getFileDescriptor());
+
+ for(int i = 0; i < KEYS.length; i++) {
+ writeEntity(bdo, KEYS[i], DATA[i].getBytes());
+ }
+
+ mDataFile.close();
+ openForReading();
+
+ BackupDataInput bdi = new BackupDataInput(mDataFile.getFileDescriptor());
+ int count = 0;
+ while (bdi.readNextHeader()) {
+ readAndVerifyEntity(bdi, KEYS[count], DATA[count].getBytes());
+ count++;
+ }
+ assertEquals("four entities in this stream", KEYS.length, count);
+ }
+
+ public void testDelete() throws IOException {
+ mFile = new File(mDirectory, "backup_delete_test.dat");
+ openForWriting();
+ BackupDataOutput bdo = new BackupDataOutput(mDataFile.getFileDescriptor());
+
+ for(int i = 0; i < KEYS.length; i++) {
+ deleteEntity(bdo, KEYS[i]);
+ }
+
+ mDataFile.close();
+ openForReading();
+
+ BackupDataInput bdi = new BackupDataInput(mDataFile.getFileDescriptor());
+ int count = 0;
+ while (bdi.readNextHeader()) {
+ readAndVerifyDeletedEntity(bdi, KEYS[count]);
+ count++;
+ }
+ assertEquals("four deletes in this stream", KEYS.length, count);
+ }
+
+ public void testMixed() throws IOException {
+ mFile = new File(mDirectory, "backup_mixed_test.dat");
+ openForWriting();
+
+ BackupDataOutput bdo = new BackupDataOutput(mDataFile.getFileDescriptor());
+
+ int i = 0;
+ deleteEntity(bdo, KEYS[i]); i++;
+ writeEntity(bdo, KEYS[i], DATA[i].getBytes()); i++;
+ writeEntity(bdo, KEYS[i], DATA[i].getBytes()); i++;
+ deleteEntity(bdo, KEYS[i]); i++;
+
+ mDataFile.close();
+ openForReading();
+
+ BackupDataInput bdi = new BackupDataInput(mDataFile.getFileDescriptor());
+ int out = 0;
+ assertTrue(bdi.readNextHeader());
+ readAndVerifyDeletedEntity(bdi, KEYS[out]); out++;
+ assertTrue(bdi.readNextHeader());
+ readAndVerifyEntity(bdi, KEYS[out], DATA[out].getBytes()); out++;
+ assertTrue(bdi.readNextHeader());
+ readAndVerifyEntity(bdi, KEYS[out], DATA[out].getBytes()); out++;
+ assertTrue(bdi.readNextHeader());
+ readAndVerifyDeletedEntity(bdi, KEYS[out]); out++;
+ assertFalse("four items in this stream",
+ bdi.readNextHeader());
+ }
+
+ public void testReadMockData() throws IOException {
+ copyAssetToFile("backup_mock.dat", "backup_read_mock_test.dat");
+
+ openForReading();
+ BackupDataInput bdi = new BackupDataInput(mDataFile.getFileDescriptor());
+ BufferedReader truth = new BufferedReader(new InputStreamReader(
+ mAssets.openFd("backup_mock.gld").createInputStream()));
+ while( bdi.readNextHeader()) {
+ String[] expected = truth.readLine().split(":");
+ byte[] expectedBytes = null;
+ if (expected.length > 1) {
+ expectedBytes = Base64.decode(expected[1], Base64.DEFAULT);
+ }
+ String key = bdi.getKey();
+ int dataSize = bdi.getDataSize();
+
+ assertEquals("wrong key", expected[0], key);
+ assertEquals("wrong length for key " + key,
+ (expectedBytes == null ? -1: expectedBytes.length), dataSize);
+ if (dataSize != -1) {
+ byte[] buffer = new byte[dataSize];
+ bdi.readEntityData(buffer, 0, dataSize);
+ assertEquals("wrong data for key " + key, expected[1],
+ Base64.encodeToString(buffer, 0, dataSize, Base64.NO_WRAP));
+ }
+ }
+ assertNull("there are unused entries in the golden file", truth.readLine());
+ }
+
+ public void testReadRealData() throws IOException {
+ copyAssetToFile("backup_real.dat", "backup_read_real_test.dat");
+
+ openForReading();
+ BackupDataInput bdi = new BackupDataInput(mDataFile.getFileDescriptor());
+ BufferedReader truth = new BufferedReader(new InputStreamReader(
+ mAssets.openFd("backup_real.gld").createInputStream()));
+
+ while(bdi.readNextHeader()) {
+ String[] expected = truth.readLine().split(":");
+ byte[] expectedBytes = null;
+ if (expected.length > 1) {
+ expectedBytes = Base64.decode(expected[1], Base64.DEFAULT);
+ }
+ String key = bdi.getKey();
+ int dataSize = bdi.getDataSize();
+
+ assertEquals("wrong key", expected[0], key);
+ assertEquals("wrong length for key " + key,
+ (expectedBytes == null ? -1: expectedBytes.length), dataSize);
+ if (dataSize != -1) {
+ byte[] buffer = new byte[dataSize];
+ bdi.readEntityData(buffer, 0, dataSize);
+ assertEquals("wrong data for key " + key, expected[1],
+ Base64.encodeToString(buffer, 0, dataSize, Base64.NO_WRAP));
+ }
+ }
+ assertNull("there are unused entries in the golden file", truth.readLine());
+ }
+
+ private void copyAssetToFile(String source, String destination) throws IOException {
+ mFile = new File(mDirectory, destination);
+ openForWriting();
+ FileInputStream fileInputStream = mAssets.openFd(source).createInputStream();
+ FileOutputStream fileOutputStream = new FileOutputStream(mDataFile.getFileDescriptor());
+ byte[] copybuffer = new byte[1024];
+ int numBytes = fileInputStream.read(copybuffer);
+ fileOutputStream.write(copybuffer, 0, numBytes);
+ fileOutputStream.close();
+ }
+
+ private void openForWriting() throws FileNotFoundException {
+ mDataFile = ParcelFileDescriptor.open(mFile,
+ ParcelFileDescriptor.MODE_WRITE_ONLY |
+ ParcelFileDescriptor.MODE_CREATE |
+ ParcelFileDescriptor.MODE_TRUNCATE); // Make an empty file if necessary
+ }
+
+ private void openForReading() throws FileNotFoundException {
+ mDataFile = ParcelFileDescriptor.open(mFile,
+ ParcelFileDescriptor.MODE_READ_ONLY |
+ ParcelFileDescriptor.MODE_CREATE); // Make an empty file if necessary
+ }
+
+ private void writeEntity(BackupDataOutput bdo, String key, byte[] data) throws IOException {
+ int status = bdo.writeEntityHeader(key, data.length);
+ // documentation says "number of bytes written" but that's not what we get:
+ assertEquals(0, status);
+
+ status = bdo.writeEntityData(data, data.length);
+ // documentation says "number of bytes written" but that's not what we get:
+ assertEquals(0, status);
+ }
+
+ private void deleteEntity(BackupDataOutput bdo, String key) throws IOException {
+ int status = bdo.writeEntityHeader(key, -1);
+ // documentation says "number of bytes written" but that's not what we get:
+ assertEquals(0, status);
+ }
+
+ private void readAndVerifyEntity(BackupDataInput bdi, String expectedKey, byte[] expectedData)
+ throws IOException {
+ assertEquals("Key mismatch",
+ expectedKey, bdi.getKey());
+ assertEquals("data size mismatch",
+ expectedData.length, bdi.getDataSize());
+ byte[] data = new byte[bdi.getDataSize()];
+ bdi.readEntityData(data, 0, bdi.getDataSize());
+ assertEquals("payload size is wrong",
+ expectedData.length, data.length);
+ for (int i = 0; i < data.length; i++) {
+ assertEquals("payload mismatch",
+ expectedData[i], data[i]);
+ }
+ }
+ private void readAndVerifyDeletedEntity(BackupDataInput bdi, String expectedKey)
+ throws IOException {
+ assertEquals("Key mismatch",
+ expectedKey, bdi.getKey());
+ assertEquals("deletion mis-reported",
+ -1, bdi.getDataSize());
+ }
+}
diff --git a/core/tests/coretests/src/android/net/SSLSessionCacheTest.java b/core/tests/coretests/src/android/net/SSLSessionCacheTest.java
new file mode 100644
index 0000000..be19303
--- /dev/null
+++ b/core/tests/coretests/src/android/net/SSLSessionCacheTest.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright (C) 2013 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.net;
+
+import com.android.org.conscrypt.ClientSessionContext;
+import com.android.org.conscrypt.SSLClientSessionCache;
+
+import com.google.testing.littlemock.LittleMock;
+
+import junit.framework.TestCase;
+
+import java.security.KeyManagementException;
+import java.security.SecureRandom;
+
+import javax.net.ssl.KeyManager;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLContextSpi;
+import javax.net.ssl.SSLEngine;
+import javax.net.ssl.SSLServerSocketFactory;
+import javax.net.ssl.SSLSessionContext;
+import javax.net.ssl.SSLSocketFactory;
+import javax.net.ssl.TrustManager;
+
+public class SSLSessionCacheTest extends TestCase {
+
+ public void testInstall_compatibleContext() throws Exception {
+ final SSLContext ctx = SSLContext.getDefault();
+ final SSLClientSessionCache mock = LittleMock.mock(SSLClientSessionCache.class);
+ final ClientSessionContext clientCtx = (ClientSessionContext) ctx.getClientSessionContext();
+
+ try {
+ SSLSessionCache.install(new SSLSessionCache(mock), ctx);
+ clientCtx.getSession("www.foogle.com", 443);
+ LittleMock.verify(mock).getSessionData(LittleMock.anyString(), LittleMock.anyInt());
+ } finally {
+ // Restore cacheless behaviour.
+ SSLSessionCache.install(null, ctx);
+ clientCtx.getSession("www.foogle.com", 443);
+ LittleMock.verifyNoMoreInteractions(mock);
+ }
+ }
+
+ public void testInstall_incompatibleContext() {
+ try {
+ SSLSessionCache.install(
+ new SSLSessionCache(LittleMock.mock(SSLClientSessionCache.class)),
+ new FakeSSLContext());
+ fail();
+ } catch (IllegalArgumentException expected) {}
+ }
+
+ static final class FakeSSLContext extends SSLContext {
+ protected FakeSSLContext() {
+ super(new FakeSSLContextSpi(), null, "test");
+ }
+ }
+
+ static final class FakeSSLContextSpi extends SSLContextSpi {
+ @Override
+ protected void engineInit(KeyManager[] keyManagers, TrustManager[] trustManagers,
+ SecureRandom secureRandom) throws KeyManagementException {
+ }
+
+ @Override
+ protected SSLSocketFactory engineGetSocketFactory() {
+ return null;
+ }
+
+ @Override
+ protected SSLServerSocketFactory engineGetServerSocketFactory() {
+ return null;
+ }
+
+ @Override
+ protected SSLEngine engineCreateSSLEngine(String s, int i) {
+ return null;
+ }
+
+ @Override
+ protected SSLEngine engineCreateSSLEngine() {
+ return null;
+ }
+
+ @Override
+ protected SSLSessionContext engineGetServerSessionContext() {
+ return null;
+ }
+
+ @Override
+ protected SSLSessionContext engineGetClientSessionContext() {
+ return LittleMock.mock(SSLSessionContext.class);
+ }
+ }
+}
diff --git a/core/tests/coretests/src/android/text/HtmlTest.java b/core/tests/coretests/src/android/text/HtmlTest.java
deleted file mode 100644
index b2298f7..0000000
--- a/core/tests/coretests/src/android/text/HtmlTest.java
+++ /dev/null
@@ -1,247 +0,0 @@
-/*
- * 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 android.text;
-
-import android.content.res.ColorStateList;
-import android.content.res.Resources;
-import android.graphics.Typeface;
-import android.test.suitebuilder.annotation.SmallTest;
-import android.text.style.ForegroundColorSpan;
-import android.text.style.QuoteSpan;
-import android.text.style.StrikethroughSpan;
-import android.text.style.StyleSpan;
-import android.text.style.SubscriptSpan;
-import android.text.style.SuperscriptSpan;
-import android.text.style.TextAppearanceSpan;
-import android.text.style.TypefaceSpan;
-import android.text.style.URLSpan;
-import android.text.style.UnderlineSpan;
-
-import junit.framework.TestCase;
-
-public class HtmlTest extends TestCase {
-
- @SmallTest
- public void testSingleTagOnWhileString() {
- Spanned spanned = Html.fromHtml("<b>hello</b>");
- Object[] spans = spanned.getSpans(-1, 100, Object.class);
- assertEquals(1, spans.length);
- Object span = spans[0];
- assertEquals(0, spanned.getSpanStart(span));
- assertEquals(5, spanned.getSpanEnd(span));
- }
-
- @SmallTest
- public void testEmptyFontTag() {
- Spanned spanned = Html.fromHtml("Hello <font color=\"#ff00ff00\"></font>");
- Object[] spans = spanned.getSpans(0, 100, Object.class);
- // TODO: figure out what the spans should be after the crashes are fixed and assert them.
- }
-
- /** Tests that the parser can handle mal-formed HTML. */
- @SmallTest
- public void testBadHtml() {
- Spanned spanned = Html.fromHtml("Hello <b>b<i>bi</b>i</i>");
- Object[] spans = spanned.getSpans(0, 100, Object.class);
- assertEquals(Typeface.ITALIC, ((StyleSpan) spans[0]).getStyle());
- assertEquals(7, spanned.getSpanStart(spans[0]));
- assertEquals(9, spanned.getSpanEnd(spans[0]));
- assertEquals(Typeface.BOLD, ((StyleSpan) spans[1]).getStyle());
- assertEquals(6, spanned.getSpanStart(spans[1]));
- assertEquals(9, spanned.getSpanEnd(spans[1]));
- assertEquals(Typeface.ITALIC, ((StyleSpan) spans[2]).getStyle());
- assertEquals(9, spanned.getSpanStart(spans[2]));
- assertEquals(10, spanned.getSpanEnd(spans[2]));
- }
-
- @SmallTest
- public void testSymbols() {
- String spanned = Html.fromHtml("&copy; &gt; &lt").toString();
- assertEquals("\u00a9 > <", spanned);
- }
-
- @SmallTest
- public void testColor() throws Exception {
- Spanned s;
- ForegroundColorSpan[] colors;
-
- s = Html.fromHtml("<font color=\"#00FF00\">something</font>");
- colors = s.getSpans(0, s.length(), ForegroundColorSpan.class);
- assertEquals(1, colors.length);
- assertEquals(0xFF00FF00, colors[0].getForegroundColor());
-
- s = Html.fromHtml("<font color=\"navy\">something</font>");
- colors = s.getSpans(0, s.length(), ForegroundColorSpan.class);
- assertEquals(1, colors.length);
- assertEquals(0xFF000080, colors[0].getForegroundColor());
-
- s = Html.fromHtml("<font color=\"gibberish\">something</font>");
- colors = s.getSpans(0, s.length(), ForegroundColorSpan.class);
- assertEquals(0, colors.length);
- }
-
- @SmallTest
- public void testResourceColor() throws Exception {
- ColorStateList c =
- Resources.getSystem().getColorStateList(android.R.color.primary_text_dark);
- Spanned s;
- TextAppearanceSpan[] colors;
-
- s = Html.fromHtml("<font color=\"@android:color/primary_text_dark\">something</font>");
- colors = s.getSpans(0, s.length(), TextAppearanceSpan.class);
- assertEquals(1, colors.length);
- assertEquals(c.toString(), colors[0].getTextColor().toString());
-
- s = Html.fromHtml("<font color=\"@android:primary_text_dark\">something</font>");
- colors = s.getSpans(0, s.length(), TextAppearanceSpan.class);
- assertEquals(1, colors.length);
- assertEquals(c.toString(), colors[0].getTextColor().toString());
-
- s = Html.fromHtml("<font color=\"@color/primary_text_dark\">something</font>");
- colors = s.getSpans(0, s.length(), TextAppearanceSpan.class);
- assertEquals(1, colors.length);
- assertEquals(c.toString(), colors[0].getTextColor().toString());
-
- s = Html.fromHtml("<font color=\"@primary_text_dark\">something</font>");
- colors = s.getSpans(0, s.length(), TextAppearanceSpan.class);
- assertEquals(1, colors.length);
- assertEquals(c.toString(), colors[0].getTextColor().toString());
-
- s = Html.fromHtml("<font color=\"@" + android.R.color.primary_text_dark
- + "\">something</font>");
- colors = s.getSpans(0, s.length(), TextAppearanceSpan.class);
- assertEquals(1, colors.length);
- assertEquals(c.toString(), colors[0].getTextColor().toString());
-
- s = Html.fromHtml("<font color=\"gibberish\">something</font>");
- colors = s.getSpans(0, s.length(), TextAppearanceSpan.class);
- assertEquals(colors.length, 0);
- }
-
- @SmallTest
- public void testParagraphs() throws Exception {
- SpannableString s;
-
- s = new SpannableString("Hello world");
- assertEquals(Html.toHtml(s), "<p>Hello world</p>\n");
-
- s = new SpannableString("Hello world\nor something");
- assertEquals(Html.toHtml(s), "<p>Hello world<br>\nor something</p>\n");
-
- s = new SpannableString("Hello world\n\nor something");
- assertEquals(Html.toHtml(s), "<p>Hello world</p>\n<p>or something</p>\n");
-
- s = new SpannableString("Hello world\n\n\nor something");
- assertEquals(Html.toHtml(s), "<p>Hello world<br></p>\n<p>or something</p>\n");
-
- assertEquals("foo\nbar", Html.fromHtml("foo<br>bar").toString());
- assertEquals("foo\nbar", Html.fromHtml("foo<br>\nbar").toString());
- assertEquals("foo\nbar", Html.fromHtml("foo<br>\n \nbar").toString());
- }
-
- @SmallTest
- public void testBlockquote() throws Exception {
- SpannableString s;
-
- s = new SpannableString("Hello world");
- s.setSpan(new QuoteSpan(), 0, s.length(), Spannable.SPAN_PARAGRAPH);
- assertEquals(Html.toHtml(s), "<blockquote><p>Hello world</p>\n</blockquote>\n");
-
- s = new SpannableString("Hello\n\nworld");
- s.setSpan(new QuoteSpan(), 0, 7, Spannable.SPAN_PARAGRAPH);
- assertEquals(Html.toHtml(s), "<blockquote><p>Hello</p>\n</blockquote>\n<p>world</p>\n");
- }
-
- @SmallTest
- public void testEntities() throws Exception {
- SpannableString s;
-
- s = new SpannableString("Hello <&> world");
- assertEquals(Html.toHtml(s), "<p>Hello &lt;&amp;&gt; world</p>\n");
-
- s = new SpannableString("Hello \u03D5 world");
- assertEquals(Html.toHtml(s), "<p>Hello &#981; world</p>\n");
-
- s = new SpannableString("Hello world");
- assertEquals(Html.toHtml(s), "<p>Hello&nbsp; world</p>\n");
- }
-
- @SmallTest
- public void testMarkup() throws Exception {
- SpannableString s;
-
- s = new SpannableString("Hello bold world");
- s.setSpan(new StyleSpan(Typeface.BOLD), 6, s.length() - 6,
- Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
- assertEquals(Html.toHtml(s), "<p>Hello <b>bold</b> world</p>\n");
-
- s = new SpannableString("Hello italic world");
- s.setSpan(new StyleSpan(Typeface.ITALIC), 6, s.length() - 6,
- Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
- assertEquals(Html.toHtml(s), "<p>Hello <i>italic</i> world</p>\n");
-
- s = new SpannableString("Hello monospace world");
- s.setSpan(new TypefaceSpan("monospace"), 6, s.length() - 6,
- Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
- assertEquals(Html.toHtml(s), "<p>Hello <tt>monospace</tt> world</p>\n");
-
- s = new SpannableString("Hello superscript world");
- s.setSpan(new SuperscriptSpan(), 6, s.length() - 6,
- Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
- assertEquals(Html.toHtml(s), "<p>Hello <sup>superscript</sup> world</p>\n");
-
- s = new SpannableString("Hello subscript world");
- s.setSpan(new SubscriptSpan(), 6, s.length() - 6,
- Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
- assertEquals(Html.toHtml(s), "<p>Hello <sub>subscript</sub> world</p>\n");
-
- s = new SpannableString("Hello underline world");
- s.setSpan(new UnderlineSpan(), 6, s.length() - 6,
- Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
- assertEquals(Html.toHtml(s), "<p>Hello <u>underline</u> world</p>\n");
-
- s = new SpannableString("Hello struck world");
- s.setSpan(new StrikethroughSpan(), 6, s.length() - 6,
- Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
- assertEquals(Html.toHtml(s), "<p>Hello <strike>struck</strike> world</p>\n");
-
- s = new SpannableString("Hello linky world");
- s.setSpan(new URLSpan("http://www.google.com"), 6, s.length() - 6,
- Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
- assertEquals(Html.toHtml(s),
- "<p>Hello <a href=\"http://www.google.com\">linky</a> world</p>\n");
- }
-
- @SmallTest
- public void testImg() throws Exception {
- Spanned s;
-
- s = Html.fromHtml("yes<img src=\"http://example.com/foo.gif\">no");
-
- assertEquals("<p>yes<img src=\"http://example.com/foo.gif\">no</p>\n",
- Html.toHtml(s));
- }
-
- @SmallTest
- public void testUtf8() throws Exception {
- Spanned s;
-
- s = Html.fromHtml("<p>\u0124\u00eb\u0142\u0142o, world!</p>");
- assertEquals("<p>&#292;&#235;&#322;&#322;o, world!</p>\n", Html.toHtml(s));
- }
-
-}
diff --git a/data/keyboards/Generic.kl b/data/keyboards/Generic.kl
index 1413319..2042345 100644
--- a/data/keyboards/Generic.kl
+++ b/data/keyboards/Generic.kl
@@ -423,3 +423,16 @@ axis 0x09 GAS
axis 0x0a BRAKE
axis 0x10 HAT_X
axis 0x11 HAT_Y
+
+# LEDs
+led 0x00 NUM_LOCK
+led 0x01 CAPS_LOCK
+led 0x02 SCROLL_LOCK
+led 0x03 COMPOSE
+led 0x04 KANA
+led 0x05 SLEEP
+led 0x06 SUSPEND
+led 0x07 MUTE
+led 0x08 MISC
+led 0x09 MAIL
+led 0x0a CHARGING
diff --git a/graphics/java/android/graphics/BitmapFactory.java b/graphics/java/android/graphics/BitmapFactory.java
index 6fd1763..b73db74 100644
--- a/graphics/java/android/graphics/BitmapFactory.java
+++ b/graphics/java/android/graphics/BitmapFactory.java
@@ -288,17 +288,22 @@ public class BitmapFactory {
public boolean inPreferQualityOverSpeed;
/**
- * The resulting width of the bitmap, set independent of the state of
- * inJustDecodeBounds. However, if there is an error trying to decode,
- * outWidth will be set to -1.
+ * The resulting width of the bitmap. If {@link #inJustDecodeBounds} is
+ * set to false, this will be width of the output bitmap after any
+ * scaling is applied. If true, it will be the width of the input image
+ * without any accounting for scaling.
+ *
+ * <p>outWidth will be set to -1 if there is an error trying to decode.</p>
*/
-
public int outWidth;
/**
- * The resulting height of the bitmap, set independent of the state of
- * inJustDecodeBounds. However, if there is an error trying to decode,
- * outHeight will be set to -1.
+ * The resulting height of the bitmap. If {@link #inJustDecodeBounds} is
+ * set to false, this will be height of the output bitmap after any
+ * scaling is applied. If true, it will be the height of the input image
+ * without any accounting for scaling.
+ *
+ * <p>outHeight will be set to -1 if there is an error trying to decode.</p>
*/
public int outHeight;
diff --git a/graphics/java/android/graphics/ColorFilter.java b/graphics/java/android/graphics/ColorFilter.java
index e5cf830..8e0af77 100644
--- a/graphics/java/android/graphics/ColorFilter.java
+++ b/graphics/java/android/graphics/ColorFilter.java
@@ -21,22 +21,30 @@
package android.graphics;
-
+/**
+ * A color filter can be used with a {@link Paint} to modify the color of
+ * each pixel drawn with that paint. This is an abstract class that should
+ * never be used directly.
+ */
public class ColorFilter {
+ // Holds the pointer to the native SkColorFilter instance
int native_instance;
/**
+ * Holds the pointer to the native SkiaColorFilter instance, from libhwui.
+ *
* @hide
*/
public int nativeColorFilter;
+ @Override
protected void finalize() throws Throwable {
try {
super.finalize();
} finally {
- finalizer(native_instance, nativeColorFilter);
+ destroyFilter(native_instance, nativeColorFilter);
}
}
- private static native void finalizer(int native_instance, int nativeColorFilter);
+ static native void destroyFilter(int native_instance, int nativeColorFilter);
}
diff --git a/graphics/java/android/graphics/ColorMatrix.java b/graphics/java/android/graphics/ColorMatrix.java
index c22cda1..0ef037d 100644
--- a/graphics/java/android/graphics/ColorMatrix.java
+++ b/graphics/java/android/graphics/ColorMatrix.java
@@ -18,23 +18,29 @@ package android.graphics;
import android.util.FloatMath;
+import java.util.Arrays;
+
/**
- * 5x4 matrix for transforming the color+alpha components of a Bitmap.
- * The matrix is stored in a single array, and its treated as follows:
+ * 5x4 matrix for transforming the color+alpha components of a Bitmap.
+ * The matrix is stored in a single array, and its treated as follows:
+ * <pre>
* [ a, b, c, d, e,
* f, g, h, i, j,
* k, l, m, n, o,
* p, q, r, s, t ]
+ * </pre>
*
- * When applied to a color [r, g, b, a], the resulting color is computed as
- * (after clamping)
+ * When applied to a color <code>[r, g, b, a]</code>, the resulting color
+ * is computed as (after clamping):
+ * <pre>
* R' = a*R + b*G + c*B + d*A + e;
* G' = f*R + g*G + h*B + i*A + j;
* B' = k*R + l*G + m*B + n*A + o;
* A' = p*R + q*G + r*B + s*A + t;
+ * </pre>
*/
+@SuppressWarnings({ "MismatchedReadAndWriteOfArray", "PointlessArithmeticExpression" })
public class ColorMatrix {
-
private final float[] mArray = new float[20];
/**
@@ -66,17 +72,16 @@ public class ColorMatrix {
/**
* Set this colormatrix to identity:
+ * <pre>
* [ 1 0 0 0 0 - red vector
* 0 1 0 0 0 - green vector
* 0 0 1 0 0 - blue vector
* 0 0 0 1 0 ] - alpha vector
+ * </pre>
*/
public void reset() {
final float[] a = mArray;
-
- for (int i = 19; i > 0; --i) {
- a[i] = 0;
- }
+ Arrays.fill(a, 0);
a[0] = a[6] = a[12] = a[18] = 1;
}
@@ -112,9 +117,9 @@ public class ColorMatrix {
/**
* Set the rotation on a color axis by the specified values.
- * axis=0 correspond to a rotation around the RED color
- * axis=1 correspond to a rotation around the GREEN color
- * axis=2 correspond to a rotation around the BLUE color
+ * <code>axis=0</code> correspond to a rotation around the RED color
+ * <code>axis=1</code> correspond to a rotation around the GREEN color
+ * <code>axis=2</code> correspond to a rotation around the BLUE color
*/
public void setRotate(int axis, float degrees) {
reset();
@@ -144,7 +149,7 @@ public class ColorMatrix {
throw new RuntimeException();
}
}
-
+
/**
* Set this colormatrix to the concatenation of the two specified
* colormatrices, such that the resulting colormatrix has the same effect
@@ -152,12 +157,10 @@ public class ColorMatrix {
* matB to be the same colormatrix as this.
*/
public void setConcat(ColorMatrix matA, ColorMatrix matB) {
- float[] tmp = null;
-
+ float[] tmp;
if (matA == this || matB == this) {
tmp = new float[20];
- }
- else {
+ } else {
tmp = mArray;
}
@@ -178,7 +181,7 @@ public class ColorMatrix {
System.arraycopy(tmp, 0, mArray, 0, 20);
}
}
-
+
/**
* Concat this colormatrix with the specified prematrix. This is logically
* the same as calling setConcat(this, prematrix);
@@ -186,7 +189,7 @@ public class ColorMatrix {
public void preConcat(ColorMatrix prematrix) {
setConcat(this, prematrix);
}
-
+
/**
* Concat this colormatrix with the specified postmatrix. This is logically
* the same as calling setConcat(postmatrix, this);
@@ -194,7 +197,7 @@ public class ColorMatrix {
public void postConcat(ColorMatrix postmatrix) {
setConcat(postmatrix, this);
}
-
+
///////////////////////////////////////////////////////////////////////////
/**
diff --git a/graphics/java/android/graphics/ColorMatrixColorFilter.java b/graphics/java/android/graphics/ColorMatrixColorFilter.java
index 4f32342..8de32ec 100644
--- a/graphics/java/android/graphics/ColorMatrixColorFilter.java
+++ b/graphics/java/android/graphics/ColorMatrixColorFilter.java
@@ -16,24 +16,31 @@
package android.graphics;
+/**
+ * A color filter that transforms colors through a 4x5 color matrix. This filter
+ * can be used to change the saturation of pixels, convert from YUV to RGB, etc.
+ *
+ * @see ColorMatrix
+ */
public class ColorMatrixColorFilter extends ColorFilter {
+ private final ColorMatrix mMatrix = new ColorMatrix();
+
/**
- * Create a colorfilter that transforms colors through a 4x5 color matrix.
+ * Create a color filter that transforms colors through a 4x5 color matrix.
*
* @param matrix 4x5 matrix used to transform colors. It is copied into
* the filter, so changes made to the matrix after the filter
* is constructed will not be reflected in the filter.
*/
public ColorMatrixColorFilter(ColorMatrix matrix) {
- final float[] colorMatrix = matrix.getArray();
- native_instance = nativeColorMatrixFilter(colorMatrix);
- nativeColorFilter = nColorMatrixFilter(native_instance, colorMatrix);
+ mMatrix.set(matrix);
+ update();
}
/**
- * Create a colorfilter that transforms colors through a 4x5 color matrix.
+ * Create a color filter that transforms colors through a 4x5 color matrix.
*
- * @param array array of floats used to transform colors, treated as a 4x5
+ * @param array Array of floats used to transform colors, treated as a 4x5
* matrix. The first 20 entries of the array are copied into
* the filter. See ColorMatrix.
*/
@@ -41,8 +48,75 @@ public class ColorMatrixColorFilter extends ColorFilter {
if (array.length < 20) {
throw new ArrayIndexOutOfBoundsException();
}
- native_instance = nativeColorMatrixFilter(array);
- nativeColorFilter = nColorMatrixFilter(native_instance, array);
+ mMatrix.set(array);
+ update();
+ }
+
+ /**
+ * Returns the {@link ColorMatrix} used by this filter. The returned
+ * value is never null. Modifying the returned matrix does not have
+ * any effect until you call {@link #setColorMatrix(ColorMatrix)}.
+ *
+ * @see #setColorMatrix(ColorMatrix)
+ */
+ public ColorMatrix getColorMatrix() {
+ return mMatrix;
+ }
+
+ /**
+ * Specifies the color matrix used by this filter. If the specified
+ * color matrix is null, this filter's color matrix will be reset to
+ * the identity matrix.
+ *
+ * @param matrix A {@link ColorMatrix} or null
+ *
+ * @see #getColorMatrix()
+ * @see android.graphics.ColorMatrix#reset()
+ * @see #setColorMatrix(float[])
+ */
+ public void setColorMatrix(ColorMatrix matrix) {
+ if (matrix == null) {
+ mMatrix.reset();
+ } else if (matrix != mMatrix) {
+ mMatrix.set(matrix);
+ }
+ update();
+ }
+
+ /**
+ * Specifies the color matrix used by this filter. If the specified
+ * color matrix is null, this filter's color matrix will be reset to
+ * the identity matrix.
+ *
+ * @param array Array of floats used to transform colors, treated as a 4x5
+ * matrix. The first 20 entries of the array are copied into
+ * the filter. See {@link ColorMatrix}.
+ *
+ * @see #getColorMatrix()
+ * @see android.graphics.ColorMatrix#reset()
+ * @see #setColorMatrix(ColorMatrix)
+ *
+ * @throws ArrayIndexOutOfBoundsException if the specified array's
+ * length is < 20
+ */
+ public void setColorMatrix(float[] array) {
+ if (array == null) {
+ mMatrix.reset();
+ } else {
+ if (array.length < 20) {
+ throw new ArrayIndexOutOfBoundsException();
+ }
+
+ mMatrix.set(array);
+ }
+ update();
+ }
+
+ private void update() {
+ final float[] colorMatrix = mMatrix.getArray();
+ destroyFilter(native_instance, nativeColorFilter);
+ native_instance = nativeColorMatrixFilter(colorMatrix);
+ nativeColorFilter = nColorMatrixFilter(native_instance, colorMatrix);
}
private static native int nativeColorMatrixFilter(float[] array);
diff --git a/graphics/java/android/graphics/ImageFormat.java b/graphics/java/android/graphics/ImageFormat.java
index 1bcfc18..e08ed50 100644
--- a/graphics/java/android/graphics/ImageFormat.java
+++ b/graphics/java/android/graphics/ImageFormat.java
@@ -187,6 +187,10 @@ public class ImageFormat {
* == {@link android.media.Image.Plane#getPixelStride() vPlane.getPixelStride()};
* ).</p>
*
+ * <p>For example, the {@link android.media.Image} object can provide data
+ * in this format from a {@link android.hardware.camera2.CameraDevice}
+ * through a {@link android.media.ImageReader} object.</p>
+ *
* @see android.media.Image
* @see android.media.ImageReader
* @see android.hardware.camera2.CameraDevice
@@ -203,8 +207,6 @@ public class ImageFormat {
* needed information to interpret a raw sensor image must be queried from
* the {@link android.hardware.camera2.CameraDevice} which produced the
* image.</p>
- *
- * @hide
*/
public static final int RAW_SENSOR = 0x20;
diff --git a/graphics/java/android/graphics/LightingColorFilter.java b/graphics/java/android/graphics/LightingColorFilter.java
index c621de6..75f1827 100644
--- a/graphics/java/android/graphics/LightingColorFilter.java
+++ b/graphics/java/android/graphics/LightingColorFilter.java
@@ -21,16 +21,87 @@
package android.graphics;
+/**
+ * A color filter that can be used to simulate simple lighting effects.
+ * A <code>LightingColorFilter</code> is defined by two parameters, one
+ * used to multiply the source color (called <code>colorMultiply</code>)
+ * and one used to add to the source color (called <code>colorAdd</code>).
+ * The alpha channel is left untouched by this color filter.
+ *
+ * Given a source color RGB, the resulting R'G'B' color is computed thusly:
+ * <pre>
+ * R' = R * colorMultiply.R + colorAdd.R
+ * G' = G * colorMultiply.G + colorAdd.G
+ * B' = B * colorMultiply.B + colorAdd.B
+ * </pre>
+ * The result is pinned to the <code>[0..255]</code> range for each channel.
+ */
public class LightingColorFilter extends ColorFilter {
+ private int mMul;
+ private int mAdd;
/**
- * Create a colorfilter that multiplies the RGB channels by one color, and then adds a second color,
- * pinning the result for each component to [0..255]. The alpha components of the mul and add arguments
- * are ignored.
+ * Create a colorfilter that multiplies the RGB channels by one color,
+ * and then adds a second color. The alpha components of the mul and add
+ * arguments are ignored.
+ *
+ * @see #setColorMultiply(int)
+ * @see #setColorAdd(int)
*/
public LightingColorFilter(int mul, int add) {
- native_instance = native_CreateLightingFilter(mul, add);
- nativeColorFilter = nCreateLightingFilter(native_instance, mul, add);
+ mMul = mul;
+ mAdd = add;
+ update();
+ }
+
+ /**
+ * Returns the RGB color used to multiply the source color when the
+ * color filter is applied.
+ *
+ * @see #setColorMultiply(int)
+ */
+ public int getColorMultiply() {
+ return mMul;
+ }
+
+ /**
+ * Specifies the RGB color used to multiply the source color when the
+ * color filter is applied.
+ * The alpha channel of this color is ignored.
+ *
+ * @see #getColorMultiply()
+ */
+ public void setColorMultiply(int mul) {
+ mMul = mul;
+ update();
+ }
+
+ /**
+ * Returns the RGB color that will be added to the source color
+ * when the color filter is applied.
+ *
+ * @see #setColorAdd(int)
+ */
+ public int getColorAdd() {
+ return mAdd;
+ }
+
+ /**
+ * Specifies the RGB that will be added to the source color when
+ * the color filter is applied.
+ * The alpha channel of this color is ignored.
+ *
+ * @see #getColorAdd()
+ */
+ public void setColorAdd(int add) {
+ mAdd = add;
+ update();
+ }
+
+ private void update() {
+ destroyFilter(native_instance, nativeColorFilter);
+ native_instance = native_CreateLightingFilter(mMul, mAdd);
+ nativeColorFilter = nCreateLightingFilter(native_instance, mMul, mAdd);
}
private static native int native_CreateLightingFilter(int mul, int add);
diff --git a/graphics/java/android/graphics/PorterDuffColorFilter.java b/graphics/java/android/graphics/PorterDuffColorFilter.java
index ecc7c24..9870ad2 100644
--- a/graphics/java/android/graphics/PorterDuffColorFilter.java
+++ b/graphics/java/android/graphics/PorterDuffColorFilter.java
@@ -16,17 +16,84 @@
package android.graphics;
+/**
+ * A color filter that can be used to tint the source pixels using a single
+ * color and a specific {@link PorterDuff Porter-Duff composite mode}.
+ */
public class PorterDuffColorFilter extends ColorFilter {
+ private int mColor;
+ private PorterDuff.Mode mMode;
+
+ /**
+ * Create a color filter that uses the specified color and Porter-Duff mode.
+ *
+ * @param color The ARGB source color used with the specified Porter-Duff mode
+ * @param mode The porter-duff mode that is applied
+ *
+ * @see Color
+ * @see #setColor(int)
+ * @see #setMode(android.graphics.PorterDuff.Mode)
+ */
+ public PorterDuffColorFilter(int color, PorterDuff.Mode mode) {
+ mColor = color;
+ mMode = mode;
+ update();
+ }
+
+ /**
+ * Returns the ARGB color used to tint the source pixels when this filter
+ * is applied.
+ *
+ * @see Color
+ * @see #setColor(int)
+ */
+ public int getColor() {
+ return mColor;
+ }
+
/**
- * Create a colorfilter that uses the specified color and porter-duff mode.
+ * Specifies the color to tint the source pixels with when this color
+ * filter is applied.
*
- * @param srcColor The source color used with the specified
- * porter-duff mode
- * @param mode The porter-duff mode that is applied
+ * @param color An ARGB {@link Color color}
+ *
+ * @see Color
+ * @see #getColor()
+ * @see #getMode()
*/
- public PorterDuffColorFilter(int srcColor, PorterDuff.Mode mode) {
- native_instance = native_CreatePorterDuffFilter(srcColor, mode.nativeInt);
- nativeColorFilter = nCreatePorterDuffFilter(native_instance, srcColor, mode.nativeInt);
+ public void setColor(int color) {
+ mColor = color;
+ update();
+ }
+
+ /**
+ * Returns the Porter-Duff mode used to composite this color filter's
+ * color with the source pixel when this filter is applied.
+ *
+ * @see PorterDuff
+ * @see #setMode(android.graphics.PorterDuff.Mode)
+ */
+ public PorterDuff.Mode getMode() {
+ return mMode;
+ }
+
+ /**
+ * Specifies the Porter-Duff mode to use when compositing this color
+ * filter's color with the source pixel at draw time.
+ *
+ * @see PorterDuff
+ * @see #getMode()
+ * @see #getColor()
+ */
+ public void setMode(PorterDuff.Mode mode) {
+ mMode = mode;
+ update();
+ }
+
+ private void update() {
+ destroyFilter(native_instance, nativeColorFilter);
+ native_instance = native_CreatePorterDuffFilter(mColor, mMode.nativeInt);
+ nativeColorFilter = nCreatePorterDuffFilter(native_instance, mColor, mMode.nativeInt);
}
private static native int native_CreatePorterDuffFilter(int srcColor, int porterDuffMode);
diff --git a/graphics/java/android/graphics/drawable/Drawable.java b/graphics/java/android/graphics/drawable/Drawable.java
index 93738b0..c84cdb0 100644
--- a/graphics/java/android/graphics/drawable/Drawable.java
+++ b/graphics/java/android/graphics/drawable/Drawable.java
@@ -39,6 +39,7 @@ import android.util.DisplayMetrics;
import android.util.StateSet;
import android.util.TypedValue;
import android.util.Xml;
+import android.view.View;
import java.io.IOException;
import java.io.InputStream;
@@ -399,7 +400,7 @@ public abstract class Drawable {
*
* @hide
*/
- public void setLayoutDirection(int layoutDirection) {
+ public void setLayoutDirection(@View.ResolvedLayoutDir int layoutDirection) {
if (getLayoutDirection() != layoutDirection) {
mLayoutDirection = layoutDirection;
}
diff --git a/graphics/java/android/graphics/drawable/GradientDrawable.java b/graphics/java/android/graphics/drawable/GradientDrawable.java
index b340777..e51dfbc 100644
--- a/graphics/java/android/graphics/drawable/GradientDrawable.java
+++ b/graphics/java/android/graphics/drawable/GradientDrawable.java
@@ -16,6 +16,7 @@
package android.graphics.drawable;
+import android.content.res.ColorStateList;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.Canvas;
@@ -24,12 +25,12 @@ import android.graphics.ColorFilter;
import android.graphics.DashPathEffect;
import android.graphics.LinearGradient;
import android.graphics.Paint;
+import android.graphics.Path;
import android.graphics.PixelFormat;
+import android.graphics.RadialGradient;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.Shader;
-import android.graphics.Path;
-import android.graphics.RadialGradient;
import android.graphics.SweepGradient;
import android.util.AttributeSet;
import android.util.Log;
@@ -233,6 +234,23 @@ public class GradientDrawable extends Drawable {
}
/**
+ * <p>Set the stroke width and color state list for the drawable. If width
+ * is zero, then no stroke is drawn.</p>
+ * <p><strong>Note</strong>: changing this property will affect all instances
+ * of a drawable loaded from a resource. It is recommended to invoke
+ * {@link #mutate()} before changing this property.</p>
+ *
+ * @param width The width in pixels of the stroke
+ * @param colorStateList The color state list of the stroke
+ *
+ * @see #mutate()
+ * @see #setStroke(int, ColorStateList, float, float)
+ */
+ public void setStroke(int width, ColorStateList colorStateList) {
+ setStroke(width, colorStateList, 0, 0);
+ }
+
+ /**
* <p>Set the stroke width and color for the drawable. If width is zero,
* then no stroke is drawn. This method can also be used to dash the stroke.</p>
* <p><strong>Note</strong>: changing this property will affect all instances
@@ -249,7 +267,35 @@ public class GradientDrawable extends Drawable {
*/
public void setStroke(int width, int color, float dashWidth, float dashGap) {
mGradientState.setStroke(width, color, dashWidth, dashGap);
+ setStrokeInternal(width, color, dashWidth, dashGap);
+ }
+ /**
+ * <p>Set the stroke width and color state list for the drawable. If width
+ * is zero, then no stroke is drawn. This method can also be used to dash
+ * the stroke.</p>
+ * <p><strong>Note</strong>: changing this property will affect all instances
+ * of a drawable loaded from a resource. It is recommended to invoke
+ * {@link #mutate()} before changing this property.</p>
+ *
+ * @param width The width in pixels of the stroke
+ * @param colorStateList The color state list of the stroke
+ * @param dashWidth The length in pixels of the dashes, set to 0 to disable dashes
+ * @param dashGap The gap in pixels between dashes
+ *
+ * @see #mutate()
+ * @see #setStroke(int, ColorStateList)
+ */
+ public void setStroke(
+ int width, ColorStateList colorStateList, float dashWidth, float dashGap) {
+ mGradientState.setStroke(width, colorStateList, dashWidth, dashGap);
+
+ final int[] stateSet = getState();
+ final int color = colorStateList.getColorForState(stateSet, 0);
+ setStrokeInternal(width, color, dashWidth, dashGap);
+ }
+
+ private void setStrokeInternal(int width, int color, float dashWidth, float dashGap) {
if (mStrokePaint == null) {
mStrokePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mStrokePaint.setStyle(Paint.Style.STROKE);
@@ -479,7 +525,8 @@ public class GradientDrawable extends Drawable {
mFillPaint.setAlpha(currFillAlpha);
mFillPaint.setDither(mDither);
mFillPaint.setColorFilter(mColorFilter);
- if (mColorFilter != null && !mGradientState.mHasSolidColor) {
+ if (mColorFilter != null && !mGradientState.mHasSolidColor
+ && mGradientState.mColorStateList == null) {
mFillPaint.setColor(mAlpha << 24);
}
if (haveStroke) {
@@ -610,7 +657,7 @@ public class GradientDrawable extends Drawable {
}
/**
- * <p>Changes this drawbale to use a single color instead of a gradient.</p>
+ * <p>Changes this drawable to use a single color instead of a gradient.</p>
* <p><strong>Note</strong>: changing color will affect all instances
* of a drawable loaded from a resource. It is recommended to invoke
* {@link #mutate()} before changing the color.</p>
@@ -626,6 +673,65 @@ public class GradientDrawable extends Drawable {
invalidateSelf();
}
+ /**
+ * Changes this drawable to use a single color state list instead of a
+ * gradient.
+ * <p>
+ * <strong>Note</strong>: changing color will affect all instances of a
+ * drawable loaded from a resource. It is recommended to invoke
+ * {@link #mutate()} before changing the color.</p>
+ *
+ * @param colorStateList The color state list used to fill the shape
+ * @see #mutate()
+ */
+ public void setColor(ColorStateList colorStateList) {
+ final int color = colorStateList.getColorForState(getState(), 0);
+ mGradientState.setColorStateList(colorStateList);
+ mFillPaint.setColor(color);
+ invalidateSelf();
+ }
+
+ @Override
+ public boolean onStateChange(int[] stateSet) {
+ boolean invalidateSelf = false;
+
+ final GradientState s = mGradientState;
+ final ColorStateList stateList = s.mColorStateList;
+ if (stateList != null) {
+ final int newColor = stateList.getColorForState(stateSet, 0);
+ final int oldColor = mFillPaint.getColor();
+ if (oldColor != newColor) {
+ mFillPaint.setColor(newColor);
+ invalidateSelf |= true;
+ }
+ }
+
+ final ColorStateList strokeStateList = s.mStrokeColorStateList;
+ if (strokeStateList != null) {
+ final int newColor = stateList.getColorForState(stateSet, 0);
+ final int oldColor = mStrokePaint.getColor();
+ if (oldColor != newColor) {
+ mStrokePaint.setColor(newColor);
+ invalidateSelf |= true;
+ }
+ }
+
+ if (invalidateSelf) {
+ invalidateSelf();
+ return true;
+ }
+
+ return false;
+ }
+
+ @Override
+ public boolean isStateful() {
+ final GradientState s = mGradientState;
+ return super.isStateful()
+ || (s.mColorStateList != null && s.mColorStateList.isStateful())
+ || (s.mStrokeColorStateList != null && s.mStrokeColorStateList.isStateful());
+ }
+
@Override
public int getChangingConfigurations() {
return super.getChangingConfigurations() | mGradientState.mChangingConfigurations;
@@ -791,7 +897,7 @@ public class GradientDrawable extends Drawable {
// If we don't have a solid color, the alpha channel must be
// maxed out so that alpha modulation works correctly.
- if (!st.mHasSolidColor) {
+ if (!st.mHasSolidColor && st.mColorStateList == null) {
mFillPaint.setColor(Color.BLACK);
}
}
@@ -967,25 +1073,25 @@ public class GradientDrawable extends Drawable {
} else if (name.equals("solid")) {
a = r.obtainAttributes(attrs,
com.android.internal.R.styleable.GradientDrawableSolid);
- int argb = a.getColor(
- com.android.internal.R.styleable.GradientDrawableSolid_color, 0);
+ final ColorStateList colorStateList = a.getColorStateList(
+ com.android.internal.R.styleable.GradientDrawableSolid_color);
a.recycle();
- setColor(argb);
+ setColor(colorStateList);
} else if (name.equals("stroke")) {
a = r.obtainAttributes(attrs,
com.android.internal.R.styleable.GradientDrawableStroke);
- int width = a.getDimensionPixelSize(
+ final int width = a.getDimensionPixelSize(
com.android.internal.R.styleable.GradientDrawableStroke_width, 0);
- int color = a.getColor(
- com.android.internal.R.styleable.GradientDrawableStroke_color, 0);
- float dashWidth = a.getDimension(
+ final ColorStateList colorStateList = a.getColorStateList(
+ com.android.internal.R.styleable.GradientDrawableStroke_color);
+ final float dashWidth = a.getDimension(
com.android.internal.R.styleable.GradientDrawableStroke_dashWidth, 0);
if (dashWidth != 0.0f) {
- float dashGap = a.getDimension(
+ final float dashGap = a.getDimension(
com.android.internal.R.styleable.GradientDrawableStroke_dashGap, 0);
- setStroke(width, color, dashWidth, dashGap);
+ setStroke(width, colorStateList, dashWidth, dashGap);
} else {
- setStroke(width, color);
+ setStroke(width, colorStateList);
}
a.recycle();
} else if (name.equals("corners")) {
@@ -1077,6 +1183,8 @@ public class GradientDrawable extends Drawable {
public int mShape = RECTANGLE;
public int mGradient = LINEAR_GRADIENT;
public Orientation mOrientation;
+ public ColorStateList mColorStateList;
+ public ColorStateList mStrokeColorStateList;
public int[] mColors;
public int[] mTempColors; // no need to copy
public float[] mTempPositions; // no need to copy
@@ -1113,6 +1221,7 @@ public class GradientDrawable extends Drawable {
mShape = state.mShape;
mGradient = state.mGradient;
mOrientation = state.mOrientation;
+ mColorStateList = state.mColorStateList;
if (state.mColors != null) {
mColors = state.mColors.clone();
}
@@ -1178,6 +1287,7 @@ public class GradientDrawable extends Drawable {
public void setColors(int[] colors) {
mHasSolidColor = false;
mColors = colors;
+ mColorStateList = null;
computeOpacity();
}
@@ -1185,6 +1295,14 @@ public class GradientDrawable extends Drawable {
mHasSolidColor = true;
mSolidColor = argb;
mColors = null;
+ mColorStateList = null;
+ computeOpacity();
+ }
+
+ public void setColorStateList(ColorStateList colorStateList) {
+ mHasSolidColor = false;
+ mColors = null;
+ mColorStateList = colorStateList;
computeOpacity();
}
@@ -1199,11 +1317,23 @@ public class GradientDrawable extends Drawable {
return;
}
- if (mStrokeWidth > 0 && !isOpaque(mStrokeColor)) {
+ if (mStrokeWidth > 0) {
+ if (mStrokeColorStateList != null) {
+ if (!mStrokeColorStateList.isOpaque()) {
+ mOpaque = false;
+ return;
+ }
+ } else if (!isOpaque(mStrokeColor)) {
+ mOpaque = false;
+ return;
+ }
+ }
+
+ if (mColorStateList != null && !mColorStateList.isOpaque()) {
mOpaque = false;
return;
}
-
+
if (mHasSolidColor) {
mOpaque = isOpaque(mSolidColor);
return;
@@ -1228,12 +1358,23 @@ public class GradientDrawable extends Drawable {
public void setStroke(int width, int color) {
mStrokeWidth = width;
mStrokeColor = color;
+ mStrokeColorStateList = null;
computeOpacity();
}
public void setStroke(int width, int color, float dashWidth, float dashGap) {
mStrokeWidth = width;
mStrokeColor = color;
+ mStrokeColorStateList = null;
+ mStrokeDashWidth = dashWidth;
+ mStrokeDashGap = dashGap;
+ computeOpacity();
+ }
+
+ public void setStroke(
+ int width, ColorStateList colorStateList, float dashWidth, float dashGap) {
+ mStrokeWidth = width;
+ mStrokeColorStateList = colorStateList;
mStrokeDashWidth = dashWidth;
mStrokeDashGap = dashGap;
computeOpacity();
@@ -1274,6 +1415,10 @@ public class GradientDrawable extends Drawable {
private void initializeWithState(GradientState state) {
if (state.mHasSolidColor) {
mFillPaint.setColor(state.mSolidColor);
+ } else if (state.mColorStateList != null) {
+ final int[] currentState = getState();
+ final int stateColor = state.mColorStateList.getColorForState(currentState, 0);
+ mFillPaint.setColor(stateColor);
} else if (state.mColors == null) {
// If we don't have a solid color and we don't have a gradient,
// the app is stroking the shape, set the color to the default
diff --git a/graphics/java/android/renderscript/Allocation.java b/graphics/java/android/renderscript/Allocation.java
index dca934f..bb1e743 100644
--- a/graphics/java/android/renderscript/Allocation.java
+++ b/graphics/java/android/renderscript/Allocation.java
@@ -24,7 +24,6 @@ import android.content.res.AssetManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.view.Surface;
-import android.graphics.SurfaceTexture;
import android.util.Log;
import android.util.TypedValue;
import android.graphics.Canvas;
@@ -127,17 +126,17 @@ public class Allocation extends BaseObj {
public static final int USAGE_GRAPHICS_RENDER_TARGET = 0x0010;
/**
- * The Allocation will be used as a {@link android.graphics.SurfaceTexture}
- * consumer. This usage will cause the Allocation to be created as
- * read-only.
+ * The Allocation will be used as a {@link android.view.Surface}
+ * consumer. This usage will cause the Allocation to be created
+ * as read-only.
*
*/
public static final int USAGE_IO_INPUT = 0x0020;
/**
- * The Allocation will be used as a {@link android.graphics.SurfaceTexture}
+ * The Allocation will be used as a {@link android.view.Surface}
* producer. The dimensions and format of the {@link
- * android.graphics.SurfaceTexture} will be forced to those of the
+ * android.view.Surface} will be forced to those of the
* Allocation.
*
*/
@@ -412,14 +411,6 @@ public class Allocation extends BaseObj {
}
/**
- * Delete once code is updated.
- * @hide
- */
- public void ioSendOutput() {
- ioSend();
- }
-
- /**
* Receive the latest input into the Allocation. This operation
* is only valid if {@link #USAGE_IO_INPUT} is set on the Allocation.
*
@@ -1547,13 +1538,6 @@ public class Allocation extends BaseObj {
}
/**
- * @hide
- */
- public void setSurfaceTexture(SurfaceTexture st) {
- setSurface(new Surface(st));
- }
-
- /**
* Associate a {@link android.view.Surface} with this Allocation. This
* operation is only valid for Allocations with {@link #USAGE_IO_OUTPUT}.
*
diff --git a/graphics/java/android/renderscript/Type.java b/graphics/java/android/renderscript/Type.java
index e023739..db4b577 100644
--- a/graphics/java/android/renderscript/Type.java
+++ b/graphics/java/android/renderscript/Type.java
@@ -216,6 +216,81 @@ public class Type extends BaseObj {
}
/**
+ * Utility function for creating basic 1D types. The type is
+ * created without mipmaps enabled.
+ *
+ * @param rs The RenderScript context
+ * @param e The Element for the Type
+ * @param dimX The X dimension, must be > 0
+ *
+ * @return Type
+ */
+ static public Type createX(RenderScript rs, Element e, int dimX) {
+ if (dimX < 1) {
+ throw new RSInvalidStateException("Dimension must be >= 1.");
+ }
+
+ int id = rs.nTypeCreate(e.getID(rs), dimX, 0, 0, false, false, 0);
+ Type t = new Type(id, rs);
+ t.mElement = e;
+ t.mDimX = dimX;
+ t.calcElementCount();
+ return t;
+ }
+
+ /**
+ * Utility function for creating basic 2D types. The type is
+ * created without mipmaps or cubemaps.
+ *
+ * @param rs The RenderScript context
+ * @param e The Element for the Type
+ * @param dimX The X dimension, must be > 0
+ * @param dimY The Y dimension, must be > 0
+ *
+ * @return Type
+ */
+ static public Type createXY(RenderScript rs, Element e, int dimX, int dimY) {
+ if ((dimX < 1) || (dimY < 1)) {
+ throw new RSInvalidStateException("Dimension must be >= 1.");
+ }
+
+ int id = rs.nTypeCreate(e.getID(rs), dimX, dimY, 0, false, false, 0);
+ Type t = new Type(id, rs);
+ t.mElement = e;
+ t.mDimX = dimX;
+ t.mDimY = dimY;
+ t.calcElementCount();
+ return t;
+ }
+
+ /**
+ * Utility function for creating basic 3D types. The type is
+ * created without mipmaps.
+ *
+ * @param rs The RenderScript context
+ * @param e The Element for the Type
+ * @param dimX The X dimension, must be > 0
+ * @param dimY The Y dimension, must be > 0
+ * @param dimZ The Z dimension, must be > 0
+ *
+ * @return Type
+ */
+ static public Type createXYZ(RenderScript rs, Element e, int dimX, int dimY, int dimZ) {
+ if ((dimX < 1) || (dimY < 1) || (dimZ < 1)) {
+ throw new RSInvalidStateException("Dimension must be >= 1.");
+ }
+
+ int id = rs.nTypeCreate(e.getID(rs), dimX, dimY, dimZ, false, false, 0);
+ Type t = new Type(id, rs);
+ t.mElement = e;
+ t.mDimX = dimX;
+ t.mDimY = dimY;
+ t.mDimZ = dimZ;
+ t.calcElementCount();
+ return t;
+ }
+
+ /**
* Builder class for Type.
*
*/
diff --git a/include/androidfw/Asset.h b/include/androidfw/Asset.h
deleted file mode 100644
index 1fe0e06..0000000
--- a/include/androidfw/Asset.h
+++ /dev/null
@@ -1,322 +0,0 @@
-/*
- * Copyright (C) 2006 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-//
-// Class providing access to a read-only asset. Asset objects are NOT
-// thread-safe, and should not be shared across threads.
-//
-#ifndef __LIBS_ASSET_H
-#define __LIBS_ASSET_H
-
-#include <stdio.h>
-#include <sys/types.h>
-
-#include <utils/Compat.h>
-#include <utils/Errors.h>
-#include <utils/FileMap.h>
-#include <utils/String8.h>
-
-namespace android {
-
-/*
- * Instances of this class provide read-only operations on a byte stream.
- *
- * Access may be optimized for streaming, random, or whole buffer modes. All
- * operations are supported regardless of how the file was opened, but some
- * things will be less efficient. [pass that in??]
- *
- * "Asset" is the base class for all types of assets. The classes below
- * provide most of the implementation. The AssetManager uses one of the
- * static "create" functions defined here to create a new instance.
- */
-class Asset {
-public:
- virtual ~Asset(void);
-
- static int32_t getGlobalCount();
- static String8 getAssetAllocations();
-
- /* used when opening an asset */
- typedef enum AccessMode {
- ACCESS_UNKNOWN = 0,
-
- /* read chunks, and seek forward and backward */
- ACCESS_RANDOM,
-
- /* read sequentially, with an occasional forward seek */
- ACCESS_STREAMING,
-
- /* caller plans to ask for a read-only buffer with all data */
- ACCESS_BUFFER,
- } AccessMode;
-
- /*
- * Read data from the current offset. Returns the actual number of
- * bytes read, 0 on EOF, or -1 on error.
- */
- virtual ssize_t read(void* buf, size_t count) = 0;
-
- /*
- * Seek to the specified offset. "whence" uses the same values as
- * lseek/fseek. Returns the new position on success, or (off64_t) -1
- * on failure.
- */
- virtual off64_t seek(off64_t offset, int whence) = 0;
-
- /*
- * Close the asset, freeing all associated resources.
- */
- virtual void close(void) = 0;
-
- /*
- * Get a pointer to a buffer with the entire contents of the file.
- */
- virtual const void* getBuffer(bool wordAligned) = 0;
-
- /*
- * Get the total amount of data that can be read.
- */
- virtual off64_t getLength(void) const = 0;
-
- /*
- * Get the total amount of data that can be read from the current position.
- */
- virtual off64_t getRemainingLength(void) const = 0;
-
- /*
- * Open a new file descriptor that can be used to read this asset.
- * Returns -1 if you can not use the file descriptor (for example if the
- * asset is compressed).
- */
- virtual int openFileDescriptor(off64_t* outStart, off64_t* outLength) const = 0;
-
- /*
- * Return whether this asset's buffer is allocated in RAM (not mmapped).
- * Note: not virtual so it is safe to call even when being destroyed.
- */
- virtual bool isAllocated(void) const { return false; }
-
- /*
- * Get a string identifying the asset's source. This might be a full
- * path, it might be a colon-separated list of identifiers.
- *
- * This is NOT intended to be used for anything except debug output.
- * DO NOT try to parse this or use it to open a file.
- */
- const char* getAssetSource(void) const { return mAssetSource.string(); }
-
-protected:
- Asset(void); // constructor; only invoked indirectly
-
- /* handle common seek() housekeeping */
- off64_t handleSeek(off64_t offset, int whence, off64_t curPosn, off64_t maxPosn);
-
- /* set the asset source string */
- void setAssetSource(const String8& path) { mAssetSource = path; }
-
- AccessMode getAccessMode(void) const { return mAccessMode; }
-
-private:
- /* these operations are not implemented */
- Asset(const Asset& src);
- Asset& operator=(const Asset& src);
-
- /* AssetManager needs access to our "create" functions */
- friend class AssetManager;
-
- /*
- * Create the asset from a named file on disk.
- */
- static Asset* createFromFile(const char* fileName, AccessMode mode);
-
- /*
- * Create the asset from a named, compressed file on disk (e.g. ".gz").
- */
- static Asset* createFromCompressedFile(const char* fileName,
- AccessMode mode);
-
-#if 0
- /*
- * Create the asset from a segment of an open file. This will fail
- * if "offset" and "length" don't fit within the bounds of the file.
- *
- * The asset takes ownership of the file descriptor.
- */
- static Asset* createFromFileSegment(int fd, off64_t offset, size_t length,
- AccessMode mode);
-
- /*
- * Create from compressed data. "fd" should be seeked to the start of
- * the compressed data. This could be inside a gzip file or part of a
- * Zip archive.
- *
- * The asset takes ownership of the file descriptor.
- *
- * This may not verify the validity of the compressed data until first
- * use.
- */
- static Asset* createFromCompressedData(int fd, off64_t offset,
- int compressionMethod, size_t compressedLength,
- size_t uncompressedLength, AccessMode mode);
-#endif
-
- /*
- * Create the asset from a memory-mapped file segment.
- *
- * The asset takes ownership of the FileMap.
- */
- static Asset* createFromUncompressedMap(FileMap* dataMap, AccessMode mode);
-
- /*
- * Create the asset from a memory-mapped file segment with compressed
- * data. "method" is a Zip archive compression method constant.
- *
- * The asset takes ownership of the FileMap.
- */
- static Asset* createFromCompressedMap(FileMap* dataMap, int method,
- size_t uncompressedLen, AccessMode mode);
-
-
- /*
- * Create from a reference-counted chunk of shared memory.
- */
- // TODO
-
- AccessMode mAccessMode; // how the asset was opened
- String8 mAssetSource; // debug string
-
- Asset* mNext; // linked list.
- Asset* mPrev;
-};
-
-
-/*
- * ===========================================================================
- *
- * Innards follow. Do not use these classes directly.
- */
-
-/*
- * An asset based on an uncompressed file on disk. It may encompass the
- * entire file or just a piece of it. Access is through fread/fseek.
- */
-class _FileAsset : public Asset {
-public:
- _FileAsset(void);
- virtual ~_FileAsset(void);
-
- /*
- * Use a piece of an already-open file.
- *
- * On success, the object takes ownership of "fd".
- */
- status_t openChunk(const char* fileName, int fd, off64_t offset, size_t length);
-
- /*
- * Use a memory-mapped region.
- *
- * On success, the object takes ownership of "dataMap".
- */
- status_t openChunk(FileMap* dataMap);
-
- /*
- * Standard Asset interfaces.
- */
- virtual ssize_t read(void* buf, size_t count);
- virtual off64_t seek(off64_t offset, int whence);
- virtual void close(void);
- virtual const void* getBuffer(bool wordAligned);
- virtual off64_t getLength(void) const { return mLength; }
- virtual off64_t getRemainingLength(void) const { return mLength-mOffset; }
- virtual int openFileDescriptor(off64_t* outStart, off64_t* outLength) const;
- virtual bool isAllocated(void) const { return mBuf != NULL; }
-
-private:
- off64_t mStart; // absolute file offset of start of chunk
- off64_t mLength; // length of the chunk
- off64_t mOffset; // current local offset, 0 == mStart
- FILE* mFp; // for read/seek
- char* mFileName; // for opening
-
- /*
- * To support getBuffer() we either need to read the entire thing into
- * a buffer or memory-map it. For small files it's probably best to
- * just read them in.
- */
- enum { kReadVsMapThreshold = 4096 };
-
- FileMap* mMap; // for memory map
- unsigned char* mBuf; // for read
-
- const void* ensureAlignment(FileMap* map);
-};
-
-
-/*
- * An asset based on compressed data in a file.
- */
-class _CompressedAsset : public Asset {
-public:
- _CompressedAsset(void);
- virtual ~_CompressedAsset(void);
-
- /*
- * Use a piece of an already-open file.
- *
- * On success, the object takes ownership of "fd".
- */
- status_t openChunk(int fd, off64_t offset, int compressionMethod,
- size_t uncompressedLen, size_t compressedLen);
-
- /*
- * Use a memory-mapped region.
- *
- * On success, the object takes ownership of "fd".
- */
- status_t openChunk(FileMap* dataMap, int compressionMethod,
- size_t uncompressedLen);
-
- /*
- * Standard Asset interfaces.
- */
- virtual ssize_t read(void* buf, size_t count);
- virtual off64_t seek(off64_t offset, int whence);
- virtual void close(void);
- virtual const void* getBuffer(bool wordAligned);
- virtual off64_t getLength(void) const { return mUncompressedLen; }
- virtual off64_t getRemainingLength(void) const { return mUncompressedLen-mOffset; }
- virtual int openFileDescriptor(off64_t* outStart, off64_t* outLength) const { return -1; }
- virtual bool isAllocated(void) const { return mBuf != NULL; }
-
-private:
- off64_t mStart; // offset to start of compressed data
- off64_t mCompressedLen; // length of the compressed data
- off64_t mUncompressedLen; // length of the uncompressed data
- off64_t mOffset; // current offset, 0 == start of uncomp data
-
- FileMap* mMap; // for memory-mapped input
- int mFd; // for file input
-
- class StreamingZipInflater* mZipInflater; // for streaming large compressed assets
-
- unsigned char* mBuf; // for getBuffer()
-};
-
-// need: shared mmap version?
-
-}; // namespace android
-
-#endif // __LIBS_ASSET_H
diff --git a/include/androidfw/AssetDir.h b/include/androidfw/AssetDir.h
deleted file mode 100644
index bd89d7d..0000000
--- a/include/androidfw/AssetDir.h
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
- * Copyright (C) 2006 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-//
-// Access a chunk of the asset hierarchy as if it were a single directory.
-//
-#ifndef __LIBS_ASSETDIR_H
-#define __LIBS_ASSETDIR_H
-
-#include <androidfw/misc.h>
-#include <utils/String8.h>
-#include <utils/Vector.h>
-#include <utils/SortedVector.h>
-#include <sys/types.h>
-
-namespace android {
-
-/*
- * This provides vector-style access to a directory. We do this rather
- * than modeling opendir/readdir access because it's simpler and the
- * nature of the operation requires us to have all data on hand anyway.
- *
- * The list of files will be sorted in ascending order by ASCII value.
- *
- * The contents are populated by our friend, the AssetManager.
- */
-class AssetDir {
-public:
- AssetDir(void)
- : mFileInfo(NULL)
- {}
- virtual ~AssetDir(void) {
- delete mFileInfo;
- }
-
- /*
- * Vector-style access.
- */
- size_t getFileCount(void) { return mFileInfo->size(); }
- const String8& getFileName(int idx) {
- return mFileInfo->itemAt(idx).getFileName();
- }
- const String8& getSourceName(int idx) {
- return mFileInfo->itemAt(idx).getSourceName();
- }
-
- /*
- * Get the type of a file (usually regular or directory).
- */
- FileType getFileType(int idx) {
- return mFileInfo->itemAt(idx).getFileType();
- }
-
-private:
- /* these operations are not implemented */
- AssetDir(const AssetDir& src);
- const AssetDir& operator=(const AssetDir& src);
-
- friend class AssetManager;
-
- /*
- * This holds information about files in the asset hierarchy.
- */
- class FileInfo {
- public:
- FileInfo(void) {}
- FileInfo(const String8& path) // useful for e.g. svect.indexOf
- : mFileName(path), mFileType(kFileTypeUnknown)
- {}
- ~FileInfo(void) {}
- FileInfo(const FileInfo& src) {
- copyMembers(src);
- }
- const FileInfo& operator= (const FileInfo& src) {
- if (this != &src)
- copyMembers(src);
- return *this;
- }
-
- void copyMembers(const FileInfo& src) {
- mFileName = src.mFileName;
- mFileType = src.mFileType;
- mSourceName = src.mSourceName;
- }
-
- /* need this for SortedVector; must compare only on file name */
- bool operator< (const FileInfo& rhs) const {
- return mFileName < rhs.mFileName;
- }
-
- /* used by AssetManager */
- bool operator== (const FileInfo& rhs) const {
- return mFileName == rhs.mFileName;
- }
-
- void set(const String8& path, FileType type) {
- mFileName = path;
- mFileType = type;
- }
-
- const String8& getFileName(void) const { return mFileName; }
- void setFileName(const String8& path) { mFileName = path; }
-
- FileType getFileType(void) const { return mFileType; }
- void setFileType(FileType type) { mFileType = type; }
-
- const String8& getSourceName(void) const { return mSourceName; }
- void setSourceName(const String8& path) { mSourceName = path; }
-
- /*
- * Handy utility for finding an entry in a sorted vector of FileInfo.
- * Returns the index of the matching entry, or -1 if none found.
- */
- static int findEntry(const SortedVector<FileInfo>* pVector,
- const String8& fileName);
-
- private:
- String8 mFileName; // filename only
- FileType mFileType; // regular, directory, etc
-
- String8 mSourceName; // currently debug-only
- };
-
- /* AssetManager uses this to initialize us */
- void setFileList(SortedVector<FileInfo>* list) { mFileInfo = list; }
-
- SortedVector<FileInfo>* mFileInfo;
-};
-
-}; // namespace android
-
-#endif // __LIBS_ASSETDIR_H
diff --git a/include/androidfw/AssetManager.h b/include/androidfw/AssetManager.h
deleted file mode 100644
index d95b45e..0000000
--- a/include/androidfw/AssetManager.h
+++ /dev/null
@@ -1,374 +0,0 @@
-/*
- * Copyright (C) 2006 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-//
-// Asset management class. AssetManager objects are thread-safe.
-//
-#ifndef __LIBS_ASSETMANAGER_H
-#define __LIBS_ASSETMANAGER_H
-
-#include <androidfw/Asset.h>
-#include <androidfw/AssetDir.h>
-#include <androidfw/ZipFileRO.h>
-#include <utils/KeyedVector.h>
-#include <utils/SortedVector.h>
-#include <utils/String16.h>
-#include <utils/String8.h>
-#include <utils/threads.h>
-#include <utils/Vector.h>
-
-/*
- * Native-app access is via the opaque typedef struct AAssetManager in the C namespace.
- */
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-struct AAssetManager { };
-
-#ifdef __cplusplus
-};
-#endif
-
-
-/*
- * Now the proper C++ android-namespace definitions
- */
-
-namespace android {
-
-class Asset; // fwd decl for things that include Asset.h first
-class ResTable;
-struct ResTable_config;
-
-/*
- * Every application that uses assets needs one instance of this. A
- * single instance may be shared across multiple threads, and a single
- * thread may have more than one instance (the latter is discouraged).
- *
- * The purpose of the AssetManager is to create Asset objects. To do
- * this efficiently it may cache information about the locations of
- * files it has seen. This can be controlled with the "cacheMode"
- * argument.
- *
- * The asset hierarchy may be examined like a filesystem, using
- * AssetDir objects to peruse a single directory.
- */
-class AssetManager : public AAssetManager {
-public:
- typedef enum CacheMode {
- CACHE_UNKNOWN = 0,
- CACHE_OFF, // don't try to cache file locations
- CACHE_DEFER, // construct cache as pieces are needed
- //CACHE_SCAN, // scan full(!) asset hierarchy at init() time
- } CacheMode;
-
- AssetManager(CacheMode cacheMode = CACHE_OFF);
- virtual ~AssetManager(void);
-
- static int32_t getGlobalCount();
-
- /*
- * Add a new source for assets. This can be called multiple times to
- * look in multiple places for assets. It can be either a directory (for
- * finding assets as raw files on the disk) or a ZIP file. This newly
- * added asset path will be examined first when searching for assets,
- * before any that were previously added.
- *
- * Returns "true" on success, "false" on failure. If 'cookie' is non-NULL,
- * then on success, *cookie is set to the value corresponding to the
- * newly-added asset source.
- */
- bool addAssetPath(const String8& path, void** cookie);
-
- /*
- * Convenience for adding the standard system assets. Uses the
- * ANDROID_ROOT environment variable to find them.
- */
- bool addDefaultAssets();
-
- /*
- * Iterate over the asset paths in this manager. (Previously
- * added via addAssetPath() and addDefaultAssets().) On first call,
- * 'cookie' must be NULL, resulting in the first cookie being returned.
- * Each next cookie will be returned there-after, until NULL indicating
- * the end has been reached.
- */
- void* nextAssetPath(void* cookie) const;
-
- /*
- * Return an asset path in the manager. 'which' must be between 0 and
- * countAssetPaths().
- */
- String8 getAssetPath(void* cookie) const;
-
- /*
- * Set the current locale and vendor. The locale can change during
- * the lifetime of an AssetManager if the user updates the device's
- * language setting. The vendor is less likely to change.
- *
- * Pass in NULL to indicate no preference.
- */
- void setLocale(const char* locale);
- void setVendor(const char* vendor);
-
- /*
- * Choose screen orientation for resources values returned.
- */
- void setConfiguration(const ResTable_config& config, const char* locale = NULL);
-
- void getConfiguration(ResTable_config* outConfig) const;
-
- typedef Asset::AccessMode AccessMode; // typing shortcut
-
- /*
- * Open an asset.
- *
- * This will search through locale-specific and vendor-specific
- * directories and packages to find the file.
- *
- * The object returned does not depend on the AssetManager. It should
- * be freed by calling Asset::close().
- */
- Asset* open(const char* fileName, AccessMode mode);
-
- /*
- * Open a non-asset file as an asset.
- *
- * This is for opening files that are included in an asset package
- * but aren't assets. These sit outside the usual "locale/vendor"
- * path hierarchy, and will not be seen by "AssetDir" or included
- * in our filename cache.
- */
- Asset* openNonAsset(const char* fileName, AccessMode mode);
-
- /*
- * Explicit non-asset file. The file explicitly named by the cookie (the
- * resource set to look in) and fileName will be opened and returned.
- */
- Asset* openNonAsset(void* cookie, const char* fileName, AccessMode mode);
-
- /*
- * Open a directory within the asset hierarchy.
- *
- * The contents of the directory are an amalgam of vendor-specific,
- * locale-specific, and generic assets stored loosely or in asset
- * packages. Depending on the cache setting and previous accesses,
- * this call may incur significant disk overhead.
- *
- * To open the top-level directory, pass in "".
- */
- AssetDir* openDir(const char* dirName);
-
- /*
- * Open a directory within a particular path of the asset manager.
- *
- * The contents of the directory are an amalgam of vendor-specific,
- * locale-specific, and generic assets stored loosely or in asset
- * packages. Depending on the cache setting and previous accesses,
- * this call may incur significant disk overhead.
- *
- * To open the top-level directory, pass in "".
- */
- AssetDir* openNonAssetDir(void* cookie, const char* dirName);
-
- /*
- * Get the type of a file in the asset hierarchy. They will either
- * be "regular" or "directory". [Currently only works for "regular".]
- *
- * Can also be used as a quick test for existence of a file.
- */
- FileType getFileType(const char* fileName);
-
- /*
- * Return the complete resource table to find things in the package.
- */
- const ResTable& getResources(bool required = true) const;
-
- /*
- * Discard cached filename information. This only needs to be called
- * if somebody has updated the set of "loose" files, and we want to
- * discard our cached notion of what's where.
- */
- void purge(void) { purgeFileNameCacheLocked(); }
-
- /*
- * Return true if the files this AssetManager references are all
- * up-to-date (have not been changed since it was created). If false
- * is returned, you will need to create a new AssetManager to get
- * the current data.
- */
- bool isUpToDate();
-
- /**
- * Get the known locales for this asset manager object.
- */
- void getLocales(Vector<String8>* locales) const;
-
-private:
- struct asset_path
- {
- String8 path;
- FileType type;
- String8 idmap;
- };
-
- Asset* openInPathLocked(const char* fileName, AccessMode mode,
- const asset_path& path);
- Asset* openNonAssetInPathLocked(const char* fileName, AccessMode mode,
- const asset_path& path);
- Asset* openInLocaleVendorLocked(const char* fileName, AccessMode mode,
- const asset_path& path, const char* locale, const char* vendor);
- String8 createPathNameLocked(const asset_path& path, const char* locale,
- const char* vendor);
- String8 createPathNameLocked(const asset_path& path, const char* rootDir);
- String8 createZipSourceNameLocked(const String8& zipFileName,
- const String8& dirName, const String8& fileName);
-
- ZipFileRO* getZipFileLocked(const asset_path& path);
- Asset* openAssetFromFileLocked(const String8& fileName, AccessMode mode);
- Asset* openAssetFromZipLocked(const ZipFileRO* pZipFile,
- const ZipEntryRO entry, AccessMode mode, const String8& entryName);
-
- bool scanAndMergeDirLocked(SortedVector<AssetDir::FileInfo>* pMergedInfo,
- const asset_path& path, const char* rootDir, const char* dirName);
- SortedVector<AssetDir::FileInfo>* scanDirLocked(const String8& path);
- bool scanAndMergeZipLocked(SortedVector<AssetDir::FileInfo>* pMergedInfo,
- const asset_path& path, const char* rootDir, const char* dirName);
- void mergeInfoLocked(SortedVector<AssetDir::FileInfo>* pMergedInfo,
- const SortedVector<AssetDir::FileInfo>* pContents);
-
- void loadFileNameCacheLocked(void);
- void fncScanLocked(SortedVector<AssetDir::FileInfo>* pMergedInfo,
- const char* dirName);
- bool fncScanAndMergeDirLocked(
- SortedVector<AssetDir::FileInfo>* pMergedInfo,
- const asset_path& path, const char* locale, const char* vendor,
- const char* dirName);
- void purgeFileNameCacheLocked(void);
-
- const ResTable* getResTable(bool required = true) const;
- void setLocaleLocked(const char* locale);
- void updateResourceParamsLocked() const;
-
- bool createIdmapFileLocked(const String8& originalPath, const String8& overlayPath,
- const String8& idmapPath);
-
- bool isIdmapStaleLocked(const String8& originalPath, const String8& overlayPath,
- const String8& idmapPath);
-
- Asset* openIdmapLocked(const struct asset_path& ap) const;
-
- bool getZipEntryCrcLocked(const String8& zipPath, const char* entryFilename, uint32_t* pCrc);
-
- class SharedZip : public RefBase {
- public:
- static sp<SharedZip> get(const String8& path);
-
- ZipFileRO* getZip();
-
- Asset* getResourceTableAsset();
- Asset* setResourceTableAsset(Asset* asset);
-
- ResTable* getResourceTable();
- ResTable* setResourceTable(ResTable* res);
-
- bool isUpToDate();
-
- protected:
- ~SharedZip();
-
- private:
- SharedZip(const String8& path, time_t modWhen);
- SharedZip(); // <-- not implemented
-
- String8 mPath;
- ZipFileRO* mZipFile;
- time_t mModWhen;
-
- Asset* mResourceTableAsset;
- ResTable* mResourceTable;
-
- static Mutex gLock;
- static DefaultKeyedVector<String8, wp<SharedZip> > gOpen;
- };
-
- /*
- * Manage a set of Zip files. For each file we need a pointer to the
- * ZipFile and a time_t with the file's modification date.
- *
- * We currently only have two zip files (current app, "common" app).
- * (This was originally written for 8, based on app/locale/vendor.)
- */
- class ZipSet {
- public:
- ZipSet(void);
- ~ZipSet(void);
-
- /*
- * Return a ZipFileRO structure for a ZipFileRO with the specified
- * parameters.
- */
- ZipFileRO* getZip(const String8& path);
-
- Asset* getZipResourceTableAsset(const String8& path);
- Asset* setZipResourceTableAsset(const String8& path, Asset* asset);
-
- ResTable* getZipResourceTable(const String8& path);
- ResTable* setZipResourceTable(const String8& path, ResTable* res);
-
- // generate path, e.g. "common/en-US-noogle.zip"
- static String8 getPathName(const char* path);
-
- bool isUpToDate();
-
- private:
- void closeZip(int idx);
-
- int getIndex(const String8& zip) const;
- mutable Vector<String8> mZipPath;
- mutable Vector<sp<SharedZip> > mZipFile;
- };
-
- // Protect all internal state.
- mutable Mutex mLock;
-
- ZipSet mZipSet;
-
- Vector<asset_path> mAssetPaths;
- char* mLocale;
- char* mVendor;
-
- mutable ResTable* mResources;
- ResTable_config* mConfig;
-
- /*
- * Cached data for "loose" files. This lets us avoid poking at the
- * filesystem when searching for loose assets. Each entry is the
- * "extended partial" path, e.g. "default/default/foo/bar.txt". The
- * full set of files is present, including ".EXCLUDE" entries.
- *
- * We do not cache directory names. We don't retain the ".gz",
- * because to our clients "foo" and "foo.gz" both look like "foo".
- */
- CacheMode mCacheMode; // is the cache enabled?
- bool mCacheValid; // clear when locale or vendor changes
- SortedVector<AssetDir::FileInfo> mCache;
-};
-
-}; // namespace android
-
-#endif // __LIBS_ASSETMANAGER_H
diff --git a/include/androidfw/BackupHelpers.h b/include/androidfw/BackupHelpers.h
deleted file mode 100644
index 1bb04a7..0000000
--- a/include/androidfw/BackupHelpers.h
+++ /dev/null
@@ -1,169 +0,0 @@
-/*
- * 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.
- */
-
-#ifndef _UTILS_BACKUP_HELPERS_H
-#define _UTILS_BACKUP_HELPERS_H
-
-#include <utils/Errors.h>
-#include <utils/String8.h>
-#include <utils/KeyedVector.h>
-
-namespace android {
-
-enum {
- BACKUP_HEADER_ENTITY_V1 = 0x61746144, // Data (little endian)
-};
-
-typedef struct {
- int type; // BACKUP_HEADER_ENTITY_V1
- int keyLen; // length of the key name, not including the null terminator
- int dataSize; // size of the data, not including the padding, -1 means delete
-} entity_header_v1;
-
-struct SnapshotHeader {
- int magic0;
- int fileCount;
- int magic1;
- int totalSize;
-};
-
-struct FileState {
- int modTime_sec;
- int modTime_nsec;
- int mode;
- int size;
- int crc32;
- int nameLen;
-};
-
-struct FileRec {
- String8 file;
- bool deleted;
- FileState s;
-};
-
-
-/**
- * Writes the data.
- *
- * If an error occurs, it poisons this object and all write calls will fail
- * with the error that occurred.
- */
-class BackupDataWriter
-{
-public:
- BackupDataWriter(int fd);
- // does not close fd
- ~BackupDataWriter();
-
- status_t WriteEntityHeader(const String8& key, size_t dataSize);
-
- /* Note: WriteEntityData will write arbitrary data into the file without
- * validation or a previously-supplied header. The full backup implementation
- * uses it this way to generate a controlled binary stream that is not
- * entity-structured. If the implementation here is changed, either this
- * use case must remain valid, or the full backup implementation should be
- * adjusted to use some other appropriate mechanism.
- */
- status_t WriteEntityData(const void* data, size_t size);
-
- void SetKeyPrefix(const String8& keyPrefix);
-
-private:
- explicit BackupDataWriter();
- status_t write_padding_for(int n);
-
- int m_fd;
- status_t m_status;
- ssize_t m_pos;
- int m_entityCount;
- String8 m_keyPrefix;
-};
-
-/**
- * Reads the data.
- *
- * If an error occurs, it poisons this object and all write calls will fail
- * with the error that occurred.
- */
-class BackupDataReader
-{
-public:
- BackupDataReader(int fd);
- // does not close fd
- ~BackupDataReader();
-
- status_t Status();
- status_t ReadNextHeader(bool* done, int* type);
-
- bool HasEntities();
- status_t ReadEntityHeader(String8* key, size_t* dataSize);
- status_t SkipEntityData(); // must be called with the pointer at the beginning of the data.
- ssize_t ReadEntityData(void* data, size_t size);
-
-private:
- explicit BackupDataReader();
- status_t skip_padding();
-
- int m_fd;
- bool m_done;
- status_t m_status;
- ssize_t m_pos;
- ssize_t m_dataEndPos;
- int m_entityCount;
- union {
- int type;
- entity_header_v1 entity;
- } m_header;
- String8 m_key;
-};
-
-int back_up_files(int oldSnapshotFD, BackupDataWriter* dataStream, int newSnapshotFD,
- char const* const* files, char const* const *keys, int fileCount);
-
-int write_tarfile(const String8& packageName, const String8& domain,
- const String8& rootPath, const String8& filePath, BackupDataWriter* outputStream);
-
-class RestoreHelperBase
-{
-public:
- RestoreHelperBase();
- ~RestoreHelperBase();
-
- status_t WriteFile(const String8& filename, BackupDataReader* in);
- status_t WriteSnapshot(int fd);
-
-private:
- void* m_buf;
- bool m_loggedUnknownMetadata;
- KeyedVector<String8,FileRec> m_files;
-};
-
-#define TEST_BACKUP_HELPERS 1
-
-#if TEST_BACKUP_HELPERS
-int backup_helper_test_empty();
-int backup_helper_test_four();
-int backup_helper_test_files();
-int backup_helper_test_null_base();
-int backup_helper_test_missing_file();
-int backup_helper_test_data_writer();
-int backup_helper_test_data_reader();
-#endif
-
-} // namespace android
-
-#endif // _UTILS_BACKUP_HELPERS_H
diff --git a/include/androidfw/CursorWindow.h b/include/androidfw/CursorWindow.h
deleted file mode 100644
index 8a2979a..0000000
--- a/include/androidfw/CursorWindow.h
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- * Copyright (C) 2006 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _ANDROID__DATABASE_WINDOW_H
-#define _ANDROID__DATABASE_WINDOW_H
-
-#include <cutils/log.h>
-#include <stddef.h>
-#include <stdint.h>
-
-#include <binder/Parcel.h>
-#include <utils/String8.h>
-
-#if LOG_NDEBUG
-
-#define IF_LOG_WINDOW() if (false)
-#define LOG_WINDOW(...)
-
-#else
-
-#define IF_LOG_WINDOW() IF_ALOG(LOG_DEBUG, "CursorWindow")
-#define LOG_WINDOW(...) ALOG(LOG_DEBUG, "CursorWindow", __VA_ARGS__)
-
-#endif
-
-namespace android {
-
-/**
- * This class stores a set of rows from a database in a buffer. The begining of the
- * window has first chunk of RowSlots, which are offsets to the row directory, followed by
- * an offset to the next chunk in a linked-list of additional chunk of RowSlots in case
- * the pre-allocated chunk isn't big enough to refer to all rows. Each row directory has a
- * FieldSlot per column, which has the size, offset, and type of the data for that field.
- * Note that the data types come from sqlite3.h.
- *
- * Strings are stored in UTF-8.
- */
-class CursorWindow {
- CursorWindow(const String8& name, int ashmemFd,
- void* data, size_t size, bool readOnly);
-
-public:
- /* Field types. */
- enum {
- FIELD_TYPE_NULL = 0,
- FIELD_TYPE_INTEGER = 1,
- FIELD_TYPE_FLOAT = 2,
- FIELD_TYPE_STRING = 3,
- FIELD_TYPE_BLOB = 4,
- };
-
- /* Opaque type that describes a field slot. */
- struct FieldSlot {
- private:
- int32_t type;
- union {
- double d;
- int64_t l;
- struct {
- uint32_t offset;
- uint32_t size;
- } buffer;
- } data;
-
- friend class CursorWindow;
- } __attribute((packed));
-
- ~CursorWindow();
-
- static status_t create(const String8& name, size_t size, CursorWindow** outCursorWindow);
- static status_t createFromParcel(Parcel* parcel, CursorWindow** outCursorWindow);
-
- status_t writeToParcel(Parcel* parcel);
-
- inline String8 name() { return mName; }
- inline size_t size() { return mSize; }
- inline size_t freeSpace() { return mSize - mHeader->freeOffset; }
- inline uint32_t getNumRows() { return mHeader->numRows; }
- inline uint32_t getNumColumns() { return mHeader->numColumns; }
-
- status_t clear();
- status_t setNumColumns(uint32_t numColumns);
-
- /**
- * Allocate a row slot and its directory.
- * The row is initialized will null entries for each field.
- */
- status_t allocRow();
- status_t freeLastRow();
-
- status_t putBlob(uint32_t row, uint32_t column, const void* value, size_t size);
- status_t putString(uint32_t row, uint32_t column, const char* value, size_t sizeIncludingNull);
- status_t putLong(uint32_t row, uint32_t column, int64_t value);
- status_t putDouble(uint32_t row, uint32_t column, double value);
- status_t putNull(uint32_t row, uint32_t column);
-
- /**
- * Gets the field slot at the specified row and column.
- * Returns null if the requested row or column is not in the window.
- */
- FieldSlot* getFieldSlot(uint32_t row, uint32_t column);
-
- inline int32_t getFieldSlotType(FieldSlot* fieldSlot) {
- return fieldSlot->type;
- }
-
- inline int64_t getFieldSlotValueLong(FieldSlot* fieldSlot) {
- return fieldSlot->data.l;
- }
-
- inline double getFieldSlotValueDouble(FieldSlot* fieldSlot) {
- return fieldSlot->data.d;
- }
-
- inline const char* getFieldSlotValueString(FieldSlot* fieldSlot,
- size_t* outSizeIncludingNull) {
- *outSizeIncludingNull = fieldSlot->data.buffer.size;
- return static_cast<char*>(offsetToPtr(fieldSlot->data.buffer.offset));
- }
-
- inline const void* getFieldSlotValueBlob(FieldSlot* fieldSlot, size_t* outSize) {
- *outSize = fieldSlot->data.buffer.size;
- return offsetToPtr(fieldSlot->data.buffer.offset);
- }
-
-private:
- static const size_t ROW_SLOT_CHUNK_NUM_ROWS = 100;
-
- struct Header {
- // Offset of the lowest unused byte in the window.
- uint32_t freeOffset;
-
- // Offset of the first row slot chunk.
- uint32_t firstChunkOffset;
-
- uint32_t numRows;
- uint32_t numColumns;
- };
-
- struct RowSlot {
- uint32_t offset;
- };
-
- struct RowSlotChunk {
- RowSlot slots[ROW_SLOT_CHUNK_NUM_ROWS];
- uint32_t nextChunkOffset;
- };
-
- String8 mName;
- int mAshmemFd;
- void* mData;
- size_t mSize;
- bool mReadOnly;
- Header* mHeader;
-
- inline void* offsetToPtr(uint32_t offset) {
- return static_cast<uint8_t*>(mData) + offset;
- }
-
- inline uint32_t offsetFromPtr(void* ptr) {
- return static_cast<uint8_t*>(ptr) - static_cast<uint8_t*>(mData);
- }
-
- /**
- * Allocate a portion of the window. Returns the offset
- * of the allocation, or 0 if there isn't enough space.
- * If aligned is true, the allocation gets 4 byte alignment.
- */
- uint32_t alloc(size_t size, bool aligned = false);
-
- RowSlot* getRowSlot(uint32_t row);
- RowSlot* allocRowSlot();
-
- status_t putBlobOrString(uint32_t row, uint32_t column,
- const void* value, size_t size, int32_t type);
-};
-
-}; // namespace android
-
-#endif
diff --git a/include/androidfw/ObbFile.h b/include/androidfw/ObbFile.h
deleted file mode 100644
index 47559cd..0000000
--- a/include/androidfw/ObbFile.h
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef OBBFILE_H_
-#define OBBFILE_H_
-
-#include <stdint.h>
-#include <strings.h>
-
-#include <utils/RefBase.h>
-#include <utils/String8.h>
-
-namespace android {
-
-// OBB flags (bit 0)
-#define OBB_OVERLAY (1 << 0)
-#define OBB_SALTED (1 << 1)
-
-class ObbFile : public RefBase {
-protected:
- virtual ~ObbFile();
-
-public:
- ObbFile();
-
- bool readFrom(const char* filename);
- bool readFrom(int fd);
- bool writeTo(const char* filename);
- bool writeTo(int fd);
- bool removeFrom(const char* filename);
- bool removeFrom(int fd);
-
- const char* getFileName() const {
- return mFileName;
- }
-
- const String8 getPackageName() const {
- return mPackageName;
- }
-
- void setPackageName(String8 packageName) {
- mPackageName = packageName;
- }
-
- int32_t getVersion() const {
- return mVersion;
- }
-
- void setVersion(int32_t version) {
- mVersion = version;
- }
-
- int32_t getFlags() const {
- return mFlags;
- }
-
- void setFlags(int32_t flags) {
- mFlags = flags;
- }
-
- const unsigned char* getSalt(size_t* length) const {
- if ((mFlags & OBB_SALTED) == 0) {
- *length = 0;
- return NULL;
- }
-
- *length = sizeof(mSalt);
- return mSalt;
- }
-
- bool setSalt(const unsigned char* salt, size_t length) {
- if (length != sizeof(mSalt)) {
- return false;
- }
-
- memcpy(mSalt, salt, sizeof(mSalt));
- mFlags |= OBB_SALTED;
- return true;
- }
-
- bool isOverlay() {
- return (mFlags & OBB_OVERLAY) == OBB_OVERLAY;
- }
-
- void setOverlay(bool overlay) {
- if (overlay) {
- mFlags |= OBB_OVERLAY;
- } else {
- mFlags &= ~OBB_OVERLAY;
- }
- }
-
- static inline uint32_t get4LE(const unsigned char* buf) {
- return buf[0] | (buf[1] << 8) | (buf[2] << 16) | (buf[3] << 24);
- }
-
- static inline void put4LE(unsigned char* buf, uint32_t val) {
- buf[0] = val & 0xFF;
- buf[1] = (val >> 8) & 0xFF;
- buf[2] = (val >> 16) & 0xFF;
- buf[3] = (val >> 24) & 0xFF;
- }
-
-private:
- /* Package name this ObbFile is associated with */
- String8 mPackageName;
-
- /* Package version this ObbFile is associated with */
- int32_t mVersion;
-
- /* Flags for this OBB type. */
- int32_t mFlags;
-
- /* Whether the file is salted. */
- bool mSalted;
-
- /* The encryption salt. */
- unsigned char mSalt[8];
-
- const char* mFileName;
-
- size_t mFileSize;
-
- size_t mFooterStart;
-
- unsigned char* mReadBuf;
-
- bool parseObbFile(int fd);
-};
-
-}
-#endif /* OBBFILE_H_ */
diff --git a/include/androidfw/PowerManager.h b/include/androidfw/PowerManager.h
deleted file mode 100644
index ba98db0..0000000
--- a/include/androidfw/PowerManager.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _ANDROIDFW_POWER_MANAGER_H
-#define _ANDROIDFW_POWER_MANAGER_H
-
-
-namespace android {
-
-enum {
- USER_ACTIVITY_EVENT_OTHER = 0,
- USER_ACTIVITY_EVENT_BUTTON = 1,
- USER_ACTIVITY_EVENT_TOUCH = 2,
-
- USER_ACTIVITY_EVENT_LAST = USER_ACTIVITY_EVENT_TOUCH, // Last valid event code.
-};
-
-} // namespace android
-
-#endif // _ANDROIDFW_POWER_MANAGER_H
diff --git a/include/androidfw/ResourceTypes.h b/include/androidfw/ResourceTypes.h
deleted file mode 100644
index 97afa59..0000000
--- a/include/androidfw/ResourceTypes.h
+++ /dev/null
@@ -1,1605 +0,0 @@
-/*
- * Copyright (C) 2005 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.
- */
-
-//
-// Definitions of resource data structures.
-//
-#ifndef _LIBS_UTILS_RESOURCE_TYPES_H
-#define _LIBS_UTILS_RESOURCE_TYPES_H
-
-#include <androidfw/Asset.h>
-#include <utils/ByteOrder.h>
-#include <utils/Errors.h>
-#include <utils/String16.h>
-#include <utils/Vector.h>
-
-#include <utils/threads.h>
-
-#include <stdint.h>
-#include <sys/types.h>
-
-#include <android/configuration.h>
-
-namespace android {
-
-/** ********************************************************************
- * PNG Extensions
- *
- * New private chunks that may be placed in PNG images.
- *
- *********************************************************************** */
-
-/**
- * This chunk specifies how to split an image into segments for
- * scaling.
- *
- * There are J horizontal and K vertical segments. These segments divide
- * the image into J*K regions as follows (where J=4 and K=3):
- *
- * F0 S0 F1 S1
- * +-----+----+------+-------+
- * S2| 0 | 1 | 2 | 3 |
- * +-----+----+------+-------+
- * | | | | |
- * | | | | |
- * F2| 4 | 5 | 6 | 7 |
- * | | | | |
- * | | | | |
- * +-----+----+------+-------+
- * S3| 8 | 9 | 10 | 11 |
- * +-----+----+------+-------+
- *
- * Each horizontal and vertical segment is considered to by either
- * stretchable (marked by the Sx labels) or fixed (marked by the Fy
- * labels), in the horizontal or vertical axis, respectively. In the
- * above example, the first is horizontal segment (F0) is fixed, the
- * next is stretchable and then they continue to alternate. Note that
- * the segment list for each axis can begin or end with a stretchable
- * or fixed segment.
- *
- * The relative sizes of the stretchy segments indicates the relative
- * amount of stretchiness of the regions bordered by the segments. For
- * example, regions 3, 7 and 11 above will take up more horizontal space
- * than regions 1, 5 and 9 since the horizontal segment associated with
- * the first set of regions is larger than the other set of regions. The
- * ratios of the amount of horizontal (or vertical) space taken by any
- * two stretchable slices is exactly the ratio of their corresponding
- * segment lengths.
- *
- * xDivs and yDivs point to arrays of horizontal and vertical pixel
- * indices. The first pair of Divs (in either array) indicate the
- * starting and ending points of the first stretchable segment in that
- * axis. The next pair specifies the next stretchable segment, etc. So
- * in the above example xDiv[0] and xDiv[1] specify the horizontal
- * coordinates for the regions labeled 1, 5 and 9. xDiv[2] and
- * xDiv[3] specify the coordinates for regions 3, 7 and 11. Note that
- * the leftmost slices always start at x=0 and the rightmost slices
- * always end at the end of the image. So, for example, the regions 0,
- * 4 and 8 (which are fixed along the X axis) start at x value 0 and
- * go to xDiv[0] and slices 2, 6 and 10 start at xDiv[1] and end at
- * xDiv[2].
- *
- * The array pointed to by the colors field lists contains hints for
- * each of the regions. They are ordered according left-to-right and
- * top-to-bottom as indicated above. For each segment that is a solid
- * color the array entry will contain that color value; otherwise it
- * will contain NO_COLOR. Segments that are completely transparent
- * will always have the value TRANSPARENT_COLOR.
- *
- * The PNG chunk type is "npTc".
- */
-struct Res_png_9patch
-{
- Res_png_9patch() : wasDeserialized(false), xDivs(NULL),
- yDivs(NULL), colors(NULL) { }
-
- int8_t wasDeserialized;
- int8_t numXDivs;
- int8_t numYDivs;
- int8_t numColors;
-
- // These tell where the next section of a patch starts.
- // For example, the first patch includes the pixels from
- // 0 to xDivs[0]-1 and the second patch includes the pixels
- // from xDivs[0] to xDivs[1]-1.
- // Note: allocation/free of these pointers is left to the caller.
- int32_t* xDivs;
- int32_t* yDivs;
-
- int32_t paddingLeft, paddingRight;
- int32_t paddingTop, paddingBottom;
-
- enum {
- // The 9 patch segment is not a solid color.
- NO_COLOR = 0x00000001,
-
- // The 9 patch segment is completely transparent.
- TRANSPARENT_COLOR = 0x00000000
- };
- // Note: allocation/free of this pointer is left to the caller.
- uint32_t* colors;
-
- // Convert data from device representation to PNG file representation.
- void deviceToFile();
- // Convert data from PNG file representation to device representation.
- void fileToDevice();
- // Serialize/Marshall the patch data into a newly malloc-ed block
- void* serialize();
- // Serialize/Marshall the patch data
- void serialize(void* outData);
- // Deserialize/Unmarshall the patch data
- static Res_png_9patch* deserialize(const void* data);
- // Compute the size of the serialized data structure
- size_t serializedSize();
-};
-
-/** ********************************************************************
- * Base Types
- *
- * These are standard types that are shared between multiple specific
- * resource types.
- *
- *********************************************************************** */
-
-/**
- * Header that appears at the front of every data chunk in a resource.
- */
-struct ResChunk_header
-{
- // Type identifier for this chunk. The meaning of this value depends
- // on the containing chunk.
- uint16_t type;
-
- // Size of the chunk header (in bytes). Adding this value to
- // the address of the chunk allows you to find its associated data
- // (if any).
- uint16_t headerSize;
-
- // Total size of this chunk (in bytes). This is the chunkSize plus
- // the size of any data associated with the chunk. Adding this value
- // to the chunk allows you to completely skip its contents (including
- // any child chunks). If this value is the same as chunkSize, there is
- // no data associated with the chunk.
- uint32_t size;
-};
-
-enum {
- RES_NULL_TYPE = 0x0000,
- RES_STRING_POOL_TYPE = 0x0001,
- RES_TABLE_TYPE = 0x0002,
- RES_XML_TYPE = 0x0003,
-
- // Chunk types in RES_XML_TYPE
- RES_XML_FIRST_CHUNK_TYPE = 0x0100,
- RES_XML_START_NAMESPACE_TYPE= 0x0100,
- RES_XML_END_NAMESPACE_TYPE = 0x0101,
- RES_XML_START_ELEMENT_TYPE = 0x0102,
- RES_XML_END_ELEMENT_TYPE = 0x0103,
- RES_XML_CDATA_TYPE = 0x0104,
- RES_XML_LAST_CHUNK_TYPE = 0x017f,
- // This contains a uint32_t array mapping strings in the string
- // pool back to resource identifiers. It is optional.
- RES_XML_RESOURCE_MAP_TYPE = 0x0180,
-
- // Chunk types in RES_TABLE_TYPE
- RES_TABLE_PACKAGE_TYPE = 0x0200,
- RES_TABLE_TYPE_TYPE = 0x0201,
- RES_TABLE_TYPE_SPEC_TYPE = 0x0202
-};
-
-/**
- * Macros for building/splitting resource identifiers.
- */
-#define Res_VALIDID(resid) (resid != 0)
-#define Res_CHECKID(resid) ((resid&0xFFFF0000) != 0)
-#define Res_MAKEID(package, type, entry) \
- (((package+1)<<24) | (((type+1)&0xFF)<<16) | (entry&0xFFFF))
-#define Res_GETPACKAGE(id) ((id>>24)-1)
-#define Res_GETTYPE(id) (((id>>16)&0xFF)-1)
-#define Res_GETENTRY(id) (id&0xFFFF)
-
-#define Res_INTERNALID(resid) ((resid&0xFFFF0000) != 0 && (resid&0xFF0000) == 0)
-#define Res_MAKEINTERNAL(entry) (0x01000000 | (entry&0xFFFF))
-#define Res_MAKEARRAY(entry) (0x02000000 | (entry&0xFFFF))
-
-#define Res_MAXPACKAGE 255
-
-/**
- * Representation of a value in a resource, supplying type
- * information.
- */
-struct Res_value
-{
- // Number of bytes in this structure.
- uint16_t size;
-
- // Always set to 0.
- uint8_t res0;
-
- // Type of the data value.
- enum {
- // Contains no data.
- TYPE_NULL = 0x00,
- // The 'data' holds a ResTable_ref, a reference to another resource
- // table entry.
- TYPE_REFERENCE = 0x01,
- // The 'data' holds an attribute resource identifier.
- TYPE_ATTRIBUTE = 0x02,
- // The 'data' holds an index into the containing resource table's
- // global value string pool.
- TYPE_STRING = 0x03,
- // The 'data' holds a single-precision floating point number.
- TYPE_FLOAT = 0x04,
- // The 'data' holds a complex number encoding a dimension value,
- // such as "100in".
- TYPE_DIMENSION = 0x05,
- // The 'data' holds a complex number encoding a fraction of a
- // container.
- TYPE_FRACTION = 0x06,
-
- // Beginning of integer flavors...
- TYPE_FIRST_INT = 0x10,
-
- // The 'data' is a raw integer value of the form n..n.
- TYPE_INT_DEC = 0x10,
- // The 'data' is a raw integer value of the form 0xn..n.
- TYPE_INT_HEX = 0x11,
- // The 'data' is either 0 or 1, for input "false" or "true" respectively.
- TYPE_INT_BOOLEAN = 0x12,
-
- // Beginning of color integer flavors...
- TYPE_FIRST_COLOR_INT = 0x1c,
-
- // The 'data' is a raw integer value of the form #aarrggbb.
- TYPE_INT_COLOR_ARGB8 = 0x1c,
- // The 'data' is a raw integer value of the form #rrggbb.
- TYPE_INT_COLOR_RGB8 = 0x1d,
- // The 'data' is a raw integer value of the form #argb.
- TYPE_INT_COLOR_ARGB4 = 0x1e,
- // The 'data' is a raw integer value of the form #rgb.
- TYPE_INT_COLOR_RGB4 = 0x1f,
-
- // ...end of integer flavors.
- TYPE_LAST_COLOR_INT = 0x1f,
-
- // ...end of integer flavors.
- TYPE_LAST_INT = 0x1f
- };
- uint8_t dataType;
-
- // Structure of complex data values (TYPE_UNIT and TYPE_FRACTION)
- enum {
- // Where the unit type information is. This gives us 16 possible
- // types, as defined below.
- COMPLEX_UNIT_SHIFT = 0,
- COMPLEX_UNIT_MASK = 0xf,
-
- // TYPE_DIMENSION: Value is raw pixels.
- COMPLEX_UNIT_PX = 0,
- // TYPE_DIMENSION: Value is Device Independent Pixels.
- COMPLEX_UNIT_DIP = 1,
- // TYPE_DIMENSION: Value is a Scaled device independent Pixels.
- COMPLEX_UNIT_SP = 2,
- // TYPE_DIMENSION: Value is in points.
- COMPLEX_UNIT_PT = 3,
- // TYPE_DIMENSION: Value is in inches.
- COMPLEX_UNIT_IN = 4,
- // TYPE_DIMENSION: Value is in millimeters.
- COMPLEX_UNIT_MM = 5,
-
- // TYPE_FRACTION: A basic fraction of the overall size.
- COMPLEX_UNIT_FRACTION = 0,
- // TYPE_FRACTION: A fraction of the parent size.
- COMPLEX_UNIT_FRACTION_PARENT = 1,
-
- // Where the radix information is, telling where the decimal place
- // appears in the mantissa. This give us 4 possible fixed point
- // representations as defined below.
- COMPLEX_RADIX_SHIFT = 4,
- COMPLEX_RADIX_MASK = 0x3,
-
- // The mantissa is an integral number -- i.e., 0xnnnnnn.0
- COMPLEX_RADIX_23p0 = 0,
- // The mantissa magnitude is 16 bits -- i.e, 0xnnnn.nn
- COMPLEX_RADIX_16p7 = 1,
- // The mantissa magnitude is 8 bits -- i.e, 0xnn.nnnn
- COMPLEX_RADIX_8p15 = 2,
- // The mantissa magnitude is 0 bits -- i.e, 0x0.nnnnnn
- COMPLEX_RADIX_0p23 = 3,
-
- // Where the actual value is. This gives us 23 bits of
- // precision. The top bit is the sign.
- COMPLEX_MANTISSA_SHIFT = 8,
- COMPLEX_MANTISSA_MASK = 0xffffff
- };
-
- // The data for this item, as interpreted according to dataType.
- uint32_t data;
-
- void copyFrom_dtoh(const Res_value& src);
-};
-
-/**
- * This is a reference to a unique entry (a ResTable_entry structure)
- * in a resource table. The value is structured as: 0xpptteeee,
- * where pp is the package index, tt is the type index in that
- * package, and eeee is the entry index in that type. The package
- * and type values start at 1 for the first item, to help catch cases
- * where they have not been supplied.
- */
-struct ResTable_ref
-{
- uint32_t ident;
-};
-
-/**
- * Reference to a string in a string pool.
- */
-struct ResStringPool_ref
-{
- // Index into the string pool table (uint32_t-offset from the indices
- // immediately after ResStringPool_header) at which to find the location
- // of the string data in the pool.
- uint32_t index;
-};
-
-/** ********************************************************************
- * String Pool
- *
- * A set of strings that can be references by others through a
- * ResStringPool_ref.
- *
- *********************************************************************** */
-
-/**
- * Definition for a pool of strings. The data of this chunk is an
- * array of uint32_t providing indices into the pool, relative to
- * stringsStart. At stringsStart are all of the UTF-16 strings
- * concatenated together; each starts with a uint16_t of the string's
- * length and each ends with a 0x0000 terminator. If a string is >
- * 32767 characters, the high bit of the length is set meaning to take
- * those 15 bits as a high word and it will be followed by another
- * uint16_t containing the low word.
- *
- * If styleCount is not zero, then immediately following the array of
- * uint32_t indices into the string table is another array of indices
- * into a style table starting at stylesStart. Each entry in the
- * style table is an array of ResStringPool_span structures.
- */
-struct ResStringPool_header
-{
- struct ResChunk_header header;
-
- // Number of strings in this pool (number of uint32_t indices that follow
- // in the data).
- uint32_t stringCount;
-
- // Number of style span arrays in the pool (number of uint32_t indices
- // follow the string indices).
- uint32_t styleCount;
-
- // Flags.
- enum {
- // If set, the string index is sorted by the string values (based
- // on strcmp16()).
- SORTED_FLAG = 1<<0,
-
- // String pool is encoded in UTF-8
- UTF8_FLAG = 1<<8
- };
- uint32_t flags;
-
- // Index from header of the string data.
- uint32_t stringsStart;
-
- // Index from header of the style data.
- uint32_t stylesStart;
-};
-
-/**
- * This structure defines a span of style information associated with
- * a string in the pool.
- */
-struct ResStringPool_span
-{
- enum {
- END = 0xFFFFFFFF
- };
-
- // This is the name of the span -- that is, the name of the XML
- // tag that defined it. The special value END (0xFFFFFFFF) indicates
- // the end of an array of spans.
- ResStringPool_ref name;
-
- // The range of characters in the string that this span applies to.
- uint32_t firstChar, lastChar;
-};
-
-/**
- * Convenience class for accessing data in a ResStringPool resource.
- */
-class ResStringPool
-{
-public:
- ResStringPool();
- ResStringPool(const void* data, size_t size, bool copyData=false);
- ~ResStringPool();
-
- status_t setTo(const void* data, size_t size, bool copyData=false);
-
- status_t getError() const;
-
- void uninit();
-
- // Return string entry as UTF16; if the pool is UTF8, the string will
- // be converted before returning.
- inline const char16_t* stringAt(const ResStringPool_ref& ref, size_t* outLen) const {
- return stringAt(ref.index, outLen);
- }
- const char16_t* stringAt(size_t idx, size_t* outLen) const;
-
- // Note: returns null if the string pool is not UTF8.
- const char* string8At(size_t idx, size_t* outLen) const;
-
- // Return string whether the pool is UTF8 or UTF16. Does not allow you
- // to distinguish null.
- const String8 string8ObjectAt(size_t idx) const;
-
- const ResStringPool_span* styleAt(const ResStringPool_ref& ref) const;
- const ResStringPool_span* styleAt(size_t idx) const;
-
- ssize_t indexOfString(const char16_t* str, size_t strLen) const;
-
- size_t size() const;
- size_t styleCount() const;
- size_t bytes() const;
-
- bool isSorted() const;
- bool isUTF8() const;
-
-private:
- status_t mError;
- void* mOwnedData;
- const ResStringPool_header* mHeader;
- size_t mSize;
- mutable Mutex mDecodeLock;
- const uint32_t* mEntries;
- const uint32_t* mEntryStyles;
- const void* mStrings;
- char16_t mutable** mCache;
- uint32_t mStringPoolSize; // number of uint16_t
- const uint32_t* mStyles;
- uint32_t mStylePoolSize; // number of uint32_t
-};
-
-/** ********************************************************************
- * XML Tree
- *
- * Binary representation of an XML document. This is designed to
- * express everything in an XML document, in a form that is much
- * easier to parse on the device.
- *
- *********************************************************************** */
-
-/**
- * XML tree header. This appears at the front of an XML tree,
- * describing its content. It is followed by a flat array of
- * ResXMLTree_node structures; the hierarchy of the XML document
- * is described by the occurrance of RES_XML_START_ELEMENT_TYPE
- * and corresponding RES_XML_END_ELEMENT_TYPE nodes in the array.
- */
-struct ResXMLTree_header
-{
- struct ResChunk_header header;
-};
-
-/**
- * Basic XML tree node. A single item in the XML document. Extended info
- * about the node can be found after header.headerSize.
- */
-struct ResXMLTree_node
-{
- struct ResChunk_header header;
-
- // Line number in original source file at which this element appeared.
- uint32_t lineNumber;
-
- // Optional XML comment that was associated with this element; -1 if none.
- struct ResStringPool_ref comment;
-};
-
-/**
- * Extended XML tree node for CDATA tags -- includes the CDATA string.
- * Appears header.headerSize bytes after a ResXMLTree_node.
- */
-struct ResXMLTree_cdataExt
-{
- // The raw CDATA character data.
- struct ResStringPool_ref data;
-
- // The typed value of the character data if this is a CDATA node.
- struct Res_value typedData;
-};
-
-/**
- * Extended XML tree node for namespace start/end nodes.
- * Appears header.headerSize bytes after a ResXMLTree_node.
- */
-struct ResXMLTree_namespaceExt
-{
- // The prefix of the namespace.
- struct ResStringPool_ref prefix;
-
- // The URI of the namespace.
- struct ResStringPool_ref uri;
-};
-
-/**
- * Extended XML tree node for element start/end nodes.
- * Appears header.headerSize bytes after a ResXMLTree_node.
- */
-struct ResXMLTree_endElementExt
-{
- // String of the full namespace of this element.
- struct ResStringPool_ref ns;
-
- // String name of this node if it is an ELEMENT; the raw
- // character data if this is a CDATA node.
- struct ResStringPool_ref name;
-};
-
-/**
- * Extended XML tree node for start tags -- includes attribute
- * information.
- * Appears header.headerSize bytes after a ResXMLTree_node.
- */
-struct ResXMLTree_attrExt
-{
- // String of the full namespace of this element.
- struct ResStringPool_ref ns;
-
- // String name of this node if it is an ELEMENT; the raw
- // character data if this is a CDATA node.
- struct ResStringPool_ref name;
-
- // Byte offset from the start of this structure where the attributes start.
- uint16_t attributeStart;
-
- // Size of the ResXMLTree_attribute structures that follow.
- uint16_t attributeSize;
-
- // Number of attributes associated with an ELEMENT. These are
- // available as an array of ResXMLTree_attribute structures
- // immediately following this node.
- uint16_t attributeCount;
-
- // Index (1-based) of the "id" attribute. 0 if none.
- uint16_t idIndex;
-
- // Index (1-based) of the "class" attribute. 0 if none.
- uint16_t classIndex;
-
- // Index (1-based) of the "style" attribute. 0 if none.
- uint16_t styleIndex;
-};
-
-struct ResXMLTree_attribute
-{
- // Namespace of this attribute.
- struct ResStringPool_ref ns;
-
- // Name of this attribute.
- struct ResStringPool_ref name;
-
- // The original raw string value of this attribute.
- struct ResStringPool_ref rawValue;
-
- // Processesd typed value of this attribute.
- struct Res_value typedValue;
-};
-
-class ResXMLTree;
-
-class ResXMLParser
-{
-public:
- ResXMLParser(const ResXMLTree& tree);
-
- enum event_code_t {
- BAD_DOCUMENT = -1,
- START_DOCUMENT = 0,
- END_DOCUMENT = 1,
-
- FIRST_CHUNK_CODE = RES_XML_FIRST_CHUNK_TYPE,
-
- START_NAMESPACE = RES_XML_START_NAMESPACE_TYPE,
- END_NAMESPACE = RES_XML_END_NAMESPACE_TYPE,
- START_TAG = RES_XML_START_ELEMENT_TYPE,
- END_TAG = RES_XML_END_ELEMENT_TYPE,
- TEXT = RES_XML_CDATA_TYPE
- };
-
- struct ResXMLPosition
- {
- event_code_t eventCode;
- const ResXMLTree_node* curNode;
- const void* curExt;
- };
-
- void restart();
-
- const ResStringPool& getStrings() const;
-
- event_code_t getEventType() const;
- // Note, unlike XmlPullParser, the first call to next() will return
- // START_TAG of the first element.
- event_code_t next();
-
- // These are available for all nodes:
- int32_t getCommentID() const;
- const uint16_t* getComment(size_t* outLen) const;
- uint32_t getLineNumber() const;
-
- // This is available for TEXT:
- int32_t getTextID() const;
- const uint16_t* getText(size_t* outLen) const;
- ssize_t getTextValue(Res_value* outValue) const;
-
- // These are available for START_NAMESPACE and END_NAMESPACE:
- int32_t getNamespacePrefixID() const;
- const uint16_t* getNamespacePrefix(size_t* outLen) const;
- int32_t getNamespaceUriID() const;
- const uint16_t* getNamespaceUri(size_t* outLen) const;
-
- // These are available for START_TAG and END_TAG:
- int32_t getElementNamespaceID() const;
- const uint16_t* getElementNamespace(size_t* outLen) const;
- int32_t getElementNameID() const;
- const uint16_t* getElementName(size_t* outLen) const;
-
- // Remaining methods are for retrieving information about attributes
- // associated with a START_TAG:
-
- size_t getAttributeCount() const;
-
- // Returns -1 if no namespace, -2 if idx out of range.
- int32_t getAttributeNamespaceID(size_t idx) const;
- const uint16_t* getAttributeNamespace(size_t idx, size_t* outLen) const;
-
- int32_t getAttributeNameID(size_t idx) const;
- const uint16_t* getAttributeName(size_t idx, size_t* outLen) const;
- uint32_t getAttributeNameResID(size_t idx) const;
-
- // These will work only if the underlying string pool is UTF-8.
- const char* getAttributeNamespace8(size_t idx, size_t* outLen) const;
- const char* getAttributeName8(size_t idx, size_t* outLen) const;
-
- int32_t getAttributeValueStringID(size_t idx) const;
- const uint16_t* getAttributeStringValue(size_t idx, size_t* outLen) const;
-
- int32_t getAttributeDataType(size_t idx) const;
- int32_t getAttributeData(size_t idx) const;
- ssize_t getAttributeValue(size_t idx, Res_value* outValue) const;
-
- ssize_t indexOfAttribute(const char* ns, const char* attr) const;
- ssize_t indexOfAttribute(const char16_t* ns, size_t nsLen,
- const char16_t* attr, size_t attrLen) const;
-
- ssize_t indexOfID() const;
- ssize_t indexOfClass() const;
- ssize_t indexOfStyle() const;
-
- void getPosition(ResXMLPosition* pos) const;
- void setPosition(const ResXMLPosition& pos);
-
-private:
- friend class ResXMLTree;
-
- event_code_t nextNode();
-
- const ResXMLTree& mTree;
- event_code_t mEventCode;
- const ResXMLTree_node* mCurNode;
- const void* mCurExt;
-};
-
-/**
- * Convenience class for accessing data in a ResXMLTree resource.
- */
-class ResXMLTree : public ResXMLParser
-{
-public:
- ResXMLTree();
- ResXMLTree(const void* data, size_t size, bool copyData=false);
- ~ResXMLTree();
-
- status_t setTo(const void* data, size_t size, bool copyData=false);
-
- status_t getError() const;
-
- void uninit();
-
-private:
- friend class ResXMLParser;
-
- status_t validateNode(const ResXMLTree_node* node) const;
-
- status_t mError;
- void* mOwnedData;
- const ResXMLTree_header* mHeader;
- size_t mSize;
- const uint8_t* mDataEnd;
- ResStringPool mStrings;
- const uint32_t* mResIds;
- size_t mNumResIds;
- const ResXMLTree_node* mRootNode;
- const void* mRootExt;
- event_code_t mRootCode;
-};
-
-/** ********************************************************************
- * RESOURCE TABLE
- *
- *********************************************************************** */
-
-/**
- * Header for a resource table. Its data contains a series of
- * additional chunks:
- * * A ResStringPool_header containing all table values. This string pool
- * contains all of the string values in the entire resource table (not
- * the names of entries or type identifiers however).
- * * One or more ResTable_package chunks.
- *
- * Specific entries within a resource table can be uniquely identified
- * with a single integer as defined by the ResTable_ref structure.
- */
-struct ResTable_header
-{
- struct ResChunk_header header;
-
- // The number of ResTable_package structures.
- uint32_t packageCount;
-};
-
-/**
- * A collection of resource data types within a package. Followed by
- * one or more ResTable_type and ResTable_typeSpec structures containing the
- * entry values for each resource type.
- */
-struct ResTable_package
-{
- struct ResChunk_header header;
-
- // If this is a base package, its ID. Package IDs start
- // at 1 (corresponding to the value of the package bits in a
- // resource identifier). 0 means this is not a base package.
- uint32_t id;
-
- // Actual name of this package, \0-terminated.
- char16_t name[128];
-
- // Offset to a ResStringPool_header defining the resource
- // type symbol table. If zero, this package is inheriting from
- // another base package (overriding specific values in it).
- uint32_t typeStrings;
-
- // Last index into typeStrings that is for public use by others.
- uint32_t lastPublicType;
-
- // Offset to a ResStringPool_header defining the resource
- // key symbol table. If zero, this package is inheriting from
- // another base package (overriding specific values in it).
- uint32_t keyStrings;
-
- // Last index into keyStrings that is for public use by others.
- uint32_t lastPublicKey;
-};
-
-/**
- * Describes a particular resource configuration.
- */
-struct ResTable_config
-{
- // Number of bytes in this structure.
- uint32_t size;
-
- union {
- struct {
- // Mobile country code (from SIM). 0 means "any".
- uint16_t mcc;
- // Mobile network code (from SIM). 0 means "any".
- uint16_t mnc;
- };
- uint32_t imsi;
- };
-
- union {
- struct {
- // \0\0 means "any". Otherwise, en, fr, etc.
- char language[2];
-
- // \0\0 means "any". Otherwise, US, CA, etc.
- char country[2];
- };
- uint32_t locale;
- };
-
- enum {
- ORIENTATION_ANY = ACONFIGURATION_ORIENTATION_ANY,
- ORIENTATION_PORT = ACONFIGURATION_ORIENTATION_PORT,
- ORIENTATION_LAND = ACONFIGURATION_ORIENTATION_LAND,
- ORIENTATION_SQUARE = ACONFIGURATION_ORIENTATION_SQUARE,
- };
-
- enum {
- TOUCHSCREEN_ANY = ACONFIGURATION_TOUCHSCREEN_ANY,
- TOUCHSCREEN_NOTOUCH = ACONFIGURATION_TOUCHSCREEN_NOTOUCH,
- TOUCHSCREEN_STYLUS = ACONFIGURATION_TOUCHSCREEN_STYLUS,
- TOUCHSCREEN_FINGER = ACONFIGURATION_TOUCHSCREEN_FINGER,
- };
-
- enum {
- DENSITY_DEFAULT = ACONFIGURATION_DENSITY_DEFAULT,
- DENSITY_LOW = ACONFIGURATION_DENSITY_LOW,
- DENSITY_MEDIUM = ACONFIGURATION_DENSITY_MEDIUM,
- DENSITY_TV = ACONFIGURATION_DENSITY_TV,
- DENSITY_HIGH = ACONFIGURATION_DENSITY_HIGH,
- DENSITY_XHIGH = ACONFIGURATION_DENSITY_XHIGH,
- DENSITY_XXHIGH = ACONFIGURATION_DENSITY_XXHIGH,
- DENSITY_XXXHIGH = ACONFIGURATION_DENSITY_XXXHIGH,
- DENSITY_NONE = ACONFIGURATION_DENSITY_NONE
- };
-
- union {
- struct {
- uint8_t orientation;
- uint8_t touchscreen;
- uint16_t density;
- };
- uint32_t screenType;
- };
-
- enum {
- KEYBOARD_ANY = ACONFIGURATION_KEYBOARD_ANY,
- KEYBOARD_NOKEYS = ACONFIGURATION_KEYBOARD_NOKEYS,
- KEYBOARD_QWERTY = ACONFIGURATION_KEYBOARD_QWERTY,
- KEYBOARD_12KEY = ACONFIGURATION_KEYBOARD_12KEY,
- };
-
- enum {
- NAVIGATION_ANY = ACONFIGURATION_NAVIGATION_ANY,
- NAVIGATION_NONAV = ACONFIGURATION_NAVIGATION_NONAV,
- NAVIGATION_DPAD = ACONFIGURATION_NAVIGATION_DPAD,
- NAVIGATION_TRACKBALL = ACONFIGURATION_NAVIGATION_TRACKBALL,
- NAVIGATION_WHEEL = ACONFIGURATION_NAVIGATION_WHEEL,
- };
-
- enum {
- MASK_KEYSHIDDEN = 0x0003,
- KEYSHIDDEN_ANY = ACONFIGURATION_KEYSHIDDEN_ANY,
- KEYSHIDDEN_NO = ACONFIGURATION_KEYSHIDDEN_NO,
- KEYSHIDDEN_YES = ACONFIGURATION_KEYSHIDDEN_YES,
- KEYSHIDDEN_SOFT = ACONFIGURATION_KEYSHIDDEN_SOFT,
- };
-
- enum {
- MASK_NAVHIDDEN = 0x000c,
- SHIFT_NAVHIDDEN = 2,
- NAVHIDDEN_ANY = ACONFIGURATION_NAVHIDDEN_ANY << SHIFT_NAVHIDDEN,
- NAVHIDDEN_NO = ACONFIGURATION_NAVHIDDEN_NO << SHIFT_NAVHIDDEN,
- NAVHIDDEN_YES = ACONFIGURATION_NAVHIDDEN_YES << SHIFT_NAVHIDDEN,
- };
-
- union {
- struct {
- uint8_t keyboard;
- uint8_t navigation;
- uint8_t inputFlags;
- uint8_t inputPad0;
- };
- uint32_t input;
- };
-
- enum {
- SCREENWIDTH_ANY = 0
- };
-
- enum {
- SCREENHEIGHT_ANY = 0
- };
-
- union {
- struct {
- uint16_t screenWidth;
- uint16_t screenHeight;
- };
- uint32_t screenSize;
- };
-
- enum {
- SDKVERSION_ANY = 0
- };
-
- enum {
- MINORVERSION_ANY = 0
- };
-
- union {
- struct {
- uint16_t sdkVersion;
- // For now minorVersion must always be 0!!! Its meaning
- // is currently undefined.
- uint16_t minorVersion;
- };
- uint32_t version;
- };
-
- enum {
- // screenLayout bits for screen size class.
- MASK_SCREENSIZE = 0x0f,
- SCREENSIZE_ANY = ACONFIGURATION_SCREENSIZE_ANY,
- SCREENSIZE_SMALL = ACONFIGURATION_SCREENSIZE_SMALL,
- SCREENSIZE_NORMAL = ACONFIGURATION_SCREENSIZE_NORMAL,
- SCREENSIZE_LARGE = ACONFIGURATION_SCREENSIZE_LARGE,
- SCREENSIZE_XLARGE = ACONFIGURATION_SCREENSIZE_XLARGE,
-
- // screenLayout bits for wide/long screen variation.
- MASK_SCREENLONG = 0x30,
- SHIFT_SCREENLONG = 4,
- SCREENLONG_ANY = ACONFIGURATION_SCREENLONG_ANY << SHIFT_SCREENLONG,
- SCREENLONG_NO = ACONFIGURATION_SCREENLONG_NO << SHIFT_SCREENLONG,
- SCREENLONG_YES = ACONFIGURATION_SCREENLONG_YES << SHIFT_SCREENLONG,
-
- // screenLayout bits for layout direction.
- MASK_LAYOUTDIR = 0xC0,
- SHIFT_LAYOUTDIR = 6,
- LAYOUTDIR_ANY = ACONFIGURATION_LAYOUTDIR_ANY << SHIFT_LAYOUTDIR,
- LAYOUTDIR_LTR = ACONFIGURATION_LAYOUTDIR_LTR << SHIFT_LAYOUTDIR,
- LAYOUTDIR_RTL = ACONFIGURATION_LAYOUTDIR_RTL << SHIFT_LAYOUTDIR,
- };
-
- enum {
- // uiMode bits for the mode type.
- MASK_UI_MODE_TYPE = 0x0f,
- UI_MODE_TYPE_ANY = ACONFIGURATION_UI_MODE_TYPE_ANY,
- UI_MODE_TYPE_NORMAL = ACONFIGURATION_UI_MODE_TYPE_NORMAL,
- UI_MODE_TYPE_DESK = ACONFIGURATION_UI_MODE_TYPE_DESK,
- UI_MODE_TYPE_CAR = ACONFIGURATION_UI_MODE_TYPE_CAR,
- UI_MODE_TYPE_TELEVISION = ACONFIGURATION_UI_MODE_TYPE_TELEVISION,
- UI_MODE_TYPE_APPLIANCE = ACONFIGURATION_UI_MODE_TYPE_APPLIANCE,
-
- // uiMode bits for the night switch.
- MASK_UI_MODE_NIGHT = 0x30,
- SHIFT_UI_MODE_NIGHT = 4,
- UI_MODE_NIGHT_ANY = ACONFIGURATION_UI_MODE_NIGHT_ANY << SHIFT_UI_MODE_NIGHT,
- UI_MODE_NIGHT_NO = ACONFIGURATION_UI_MODE_NIGHT_NO << SHIFT_UI_MODE_NIGHT,
- UI_MODE_NIGHT_YES = ACONFIGURATION_UI_MODE_NIGHT_YES << SHIFT_UI_MODE_NIGHT,
- };
-
- union {
- struct {
- uint8_t screenLayout;
- uint8_t uiMode;
- uint16_t smallestScreenWidthDp;
- };
- uint32_t screenConfig;
- };
-
- union {
- struct {
- uint16_t screenWidthDp;
- uint16_t screenHeightDp;
- };
- uint32_t screenSizeDp;
- };
-
- void copyFromDeviceNoSwap(const ResTable_config& o);
-
- void copyFromDtoH(const ResTable_config& o);
-
- void swapHtoD();
-
- int compare(const ResTable_config& o) const;
- int compareLogical(const ResTable_config& o) const;
-
- // Flags indicating a set of config values. These flag constants must
- // match the corresponding ones in android.content.pm.ActivityInfo and
- // attrs_manifest.xml.
- enum {
- CONFIG_MCC = ACONFIGURATION_MCC,
- CONFIG_MNC = ACONFIGURATION_MCC,
- CONFIG_LOCALE = ACONFIGURATION_LOCALE,
- CONFIG_TOUCHSCREEN = ACONFIGURATION_TOUCHSCREEN,
- CONFIG_KEYBOARD = ACONFIGURATION_KEYBOARD,
- CONFIG_KEYBOARD_HIDDEN = ACONFIGURATION_KEYBOARD_HIDDEN,
- CONFIG_NAVIGATION = ACONFIGURATION_NAVIGATION,
- CONFIG_ORIENTATION = ACONFIGURATION_ORIENTATION,
- CONFIG_DENSITY = ACONFIGURATION_DENSITY,
- CONFIG_SCREEN_SIZE = ACONFIGURATION_SCREEN_SIZE,
- CONFIG_SMALLEST_SCREEN_SIZE = ACONFIGURATION_SMALLEST_SCREEN_SIZE,
- CONFIG_VERSION = ACONFIGURATION_VERSION,
- CONFIG_SCREEN_LAYOUT = ACONFIGURATION_SCREEN_LAYOUT,
- CONFIG_UI_MODE = ACONFIGURATION_UI_MODE,
- CONFIG_LAYOUTDIR = ACONFIGURATION_LAYOUTDIR,
- };
-
- // Compare two configuration, returning CONFIG_* flags set for each value
- // that is different.
- int diff(const ResTable_config& o) const;
-
- // Return true if 'this' is more specific than 'o'.
- bool isMoreSpecificThan(const ResTable_config& o) const;
-
- // Return true if 'this' is a better match than 'o' for the 'requested'
- // configuration. This assumes that match() has already been used to
- // remove any configurations that don't match the requested configuration
- // at all; if they are not first filtered, non-matching results can be
- // considered better than matching ones.
- // The general rule per attribute: if the request cares about an attribute
- // (it normally does), if the two (this and o) are equal it's a tie. If
- // they are not equal then one must be generic because only generic and
- // '==requested' will pass the match() call. So if this is not generic,
- // it wins. If this IS generic, o wins (return false).
- bool isBetterThan(const ResTable_config& o, const ResTable_config* requested) const;
-
- // Return true if 'this' can be considered a match for the parameters in
- // 'settings'.
- // Note this is asymetric. A default piece of data will match every request
- // but a request for the default should not match odd specifics
- // (ie, request with no mcc should not match a particular mcc's data)
- // settings is the requested settings
- bool match(const ResTable_config& settings) const;
-
- void getLocale(char str[6]) const;
-
- String8 toString() const;
-};
-
-/**
- * A specification of the resources defined by a particular type.
- *
- * There should be one of these chunks for each resource type.
- *
- * This structure is followed by an array of integers providing the set of
- * configuration change flags (ResTable_config::CONFIG_*) that have multiple
- * resources for that configuration. In addition, the high bit is set if that
- * resource has been made public.
- */
-struct ResTable_typeSpec
-{
- struct ResChunk_header header;
-
- // The type identifier this chunk is holding. Type IDs start
- // at 1 (corresponding to the value of the type bits in a
- // resource identifier). 0 is invalid.
- uint8_t id;
-
- // Must be 0.
- uint8_t res0;
- // Must be 0.
- uint16_t res1;
-
- // Number of uint32_t entry configuration masks that follow.
- uint32_t entryCount;
-
- enum {
- // Additional flag indicating an entry is public.
- SPEC_PUBLIC = 0x40000000
- };
-};
-
-/**
- * A collection of resource entries for a particular resource data
- * type. Followed by an array of uint32_t defining the resource
- * values, corresponding to the array of type strings in the
- * ResTable_package::typeStrings string block. Each of these hold an
- * index from entriesStart; a value of NO_ENTRY means that entry is
- * not defined.
- *
- * There may be multiple of these chunks for a particular resource type,
- * supply different configuration variations for the resource values of
- * that type.
- *
- * It would be nice to have an additional ordered index of entries, so
- * we can do a binary search if trying to find a resource by string name.
- */
-struct ResTable_type
-{
- struct ResChunk_header header;
-
- enum {
- NO_ENTRY = 0xFFFFFFFF
- };
-
- // The type identifier this chunk is holding. Type IDs start
- // at 1 (corresponding to the value of the type bits in a
- // resource identifier). 0 is invalid.
- uint8_t id;
-
- // Must be 0.
- uint8_t res0;
- // Must be 0.
- uint16_t res1;
-
- // Number of uint32_t entry indices that follow.
- uint32_t entryCount;
-
- // Offset from header where ResTable_entry data starts.
- uint32_t entriesStart;
-
- // Configuration this collection of entries is designed for.
- ResTable_config config;
-};
-
-/**
- * This is the beginning of information about an entry in the resource
- * table. It holds the reference to the name of this entry, and is
- * immediately followed by one of:
- * * A Res_value structure, if FLAG_COMPLEX is -not- set.
- * * An array of ResTable_map structures, if FLAG_COMPLEX is set.
- * These supply a set of name/value mappings of data.
- */
-struct ResTable_entry
-{
- // Number of bytes in this structure.
- uint16_t size;
-
- enum {
- // If set, this is a complex entry, holding a set of name/value
- // mappings. It is followed by an array of ResTable_map structures.
- FLAG_COMPLEX = 0x0001,
- // If set, this resource has been declared public, so libraries
- // are allowed to reference it.
- FLAG_PUBLIC = 0x0002
- };
- uint16_t flags;
-
- // Reference into ResTable_package::keyStrings identifying this entry.
- struct ResStringPool_ref key;
-};
-
-/**
- * Extended form of a ResTable_entry for map entries, defining a parent map
- * resource from which to inherit values.
- */
-struct ResTable_map_entry : public ResTable_entry
-{
- // Resource identifier of the parent mapping, or 0 if there is none.
- ResTable_ref parent;
- // Number of name/value pairs that follow for FLAG_COMPLEX.
- uint32_t count;
-};
-
-/**
- * A single name/value mapping that is part of a complex resource
- * entry.
- */
-struct ResTable_map
-{
- // The resource identifier defining this mapping's name. For attribute
- // resources, 'name' can be one of the following special resource types
- // to supply meta-data about the attribute; for all other resource types
- // it must be an attribute resource.
- ResTable_ref name;
-
- // Special values for 'name' when defining attribute resources.
- enum {
- // This entry holds the attribute's type code.
- ATTR_TYPE = Res_MAKEINTERNAL(0),
-
- // For integral attributes, this is the minimum value it can hold.
- ATTR_MIN = Res_MAKEINTERNAL(1),
-
- // For integral attributes, this is the maximum value it can hold.
- ATTR_MAX = Res_MAKEINTERNAL(2),
-
- // Localization of this resource is can be encouraged or required with
- // an aapt flag if this is set
- ATTR_L10N = Res_MAKEINTERNAL(3),
-
- // for plural support, see android.content.res.PluralRules#attrForQuantity(int)
- ATTR_OTHER = Res_MAKEINTERNAL(4),
- ATTR_ZERO = Res_MAKEINTERNAL(5),
- ATTR_ONE = Res_MAKEINTERNAL(6),
- ATTR_TWO = Res_MAKEINTERNAL(7),
- ATTR_FEW = Res_MAKEINTERNAL(8),
- ATTR_MANY = Res_MAKEINTERNAL(9)
-
- };
-
- // Bit mask of allowed types, for use with ATTR_TYPE.
- enum {
- // No type has been defined for this attribute, use generic
- // type handling. The low 16 bits are for types that can be
- // handled generically; the upper 16 require additional information
- // in the bag so can not be handled generically for TYPE_ANY.
- TYPE_ANY = 0x0000FFFF,
-
- // Attribute holds a references to another resource.
- TYPE_REFERENCE = 1<<0,
-
- // Attribute holds a generic string.
- TYPE_STRING = 1<<1,
-
- // Attribute holds an integer value. ATTR_MIN and ATTR_MIN can
- // optionally specify a constrained range of possible integer values.
- TYPE_INTEGER = 1<<2,
-
- // Attribute holds a boolean integer.
- TYPE_BOOLEAN = 1<<3,
-
- // Attribute holds a color value.
- TYPE_COLOR = 1<<4,
-
- // Attribute holds a floating point value.
- TYPE_FLOAT = 1<<5,
-
- // Attribute holds a dimension value, such as "20px".
- TYPE_DIMENSION = 1<<6,
-
- // Attribute holds a fraction value, such as "20%".
- TYPE_FRACTION = 1<<7,
-
- // Attribute holds an enumeration. The enumeration values are
- // supplied as additional entries in the map.
- TYPE_ENUM = 1<<16,
-
- // Attribute holds a bitmaks of flags. The flag bit values are
- // supplied as additional entries in the map.
- TYPE_FLAGS = 1<<17
- };
-
- // Enum of localization modes, for use with ATTR_L10N.
- enum {
- L10N_NOT_REQUIRED = 0,
- L10N_SUGGESTED = 1
- };
-
- // This mapping's value.
- Res_value value;
-};
-
-/**
- * Convenience class for accessing data in a ResTable resource.
- */
-class ResTable
-{
-public:
- ResTable();
- ResTable(const void* data, size_t size, void* cookie,
- bool copyData=false);
- ~ResTable();
-
- status_t add(const void* data, size_t size, void* cookie,
- bool copyData=false, const void* idmap = NULL);
- status_t add(Asset* asset, void* cookie,
- bool copyData=false, const void* idmap = NULL);
- status_t add(ResTable* src);
-
- status_t getError() const;
-
- void uninit();
-
- struct resource_name
- {
- const char16_t* package;
- size_t packageLen;
- const char16_t* type;
- const char* type8;
- size_t typeLen;
- const char16_t* name;
- const char* name8;
- size_t nameLen;
- };
-
- bool getResourceName(uint32_t resID, bool allowUtf8, resource_name* outName) const;
-
- /**
- * Retrieve the value of a resource. If the resource is found, returns a
- * value >= 0 indicating the table it is in (for use with
- * getTableStringBlock() and getTableCookie()) and fills in 'outValue'. If
- * not found, returns a negative error code.
- *
- * Note that this function does not do reference traversal. If you want
- * to follow references to other resources to get the "real" value to
- * use, you need to call resolveReference() after this function.
- *
- * @param resID The desired resoruce identifier.
- * @param outValue Filled in with the resource data that was found.
- *
- * @return ssize_t Either a >= 0 table index or a negative error code.
- */
- ssize_t getResource(uint32_t resID, Res_value* outValue, bool mayBeBag = false,
- uint16_t density = 0,
- uint32_t* outSpecFlags = NULL,
- ResTable_config* outConfig = NULL) const;
-
- inline ssize_t getResource(const ResTable_ref& res, Res_value* outValue,
- uint32_t* outSpecFlags=NULL) const {
- return getResource(res.ident, outValue, false, 0, outSpecFlags, NULL);
- }
-
- ssize_t resolveReference(Res_value* inOutValue,
- ssize_t blockIndex,
- uint32_t* outLastRef = NULL,
- uint32_t* inoutTypeSpecFlags = NULL,
- ResTable_config* outConfig = NULL) const;
-
- enum {
- TMP_BUFFER_SIZE = 16
- };
- const char16_t* valueToString(const Res_value* value, size_t stringBlock,
- char16_t tmpBuffer[TMP_BUFFER_SIZE],
- size_t* outLen);
-
- struct bag_entry {
- ssize_t stringBlock;
- ResTable_map map;
- };
-
- /**
- * Retrieve the bag of a resource. If the resoruce is found, returns the
- * number of bags it contains and 'outBag' points to an array of their
- * values. If not found, a negative error code is returned.
- *
- * Note that this function -does- do reference traversal of the bag data.
- *
- * @param resID The desired resource identifier.
- * @param outBag Filled inm with a pointer to the bag mappings.
- *
- * @return ssize_t Either a >= 0 bag count of negative error code.
- */
- ssize_t lockBag(uint32_t resID, const bag_entry** outBag) const;
-
- void unlockBag(const bag_entry* bag) const;
-
- void lock() const;
-
- ssize_t getBagLocked(uint32_t resID, const bag_entry** outBag,
- uint32_t* outTypeSpecFlags=NULL) const;
-
- void unlock() const;
-
- class Theme {
- public:
- Theme(const ResTable& table);
- ~Theme();
-
- inline const ResTable& getResTable() const { return mTable; }
-
- status_t applyStyle(uint32_t resID, bool force=false);
- status_t setTo(const Theme& other);
-
- /**
- * Retrieve a value in the theme. If the theme defines this
- * value, returns a value >= 0 indicating the table it is in
- * (for use with getTableStringBlock() and getTableCookie) and
- * fills in 'outValue'. If not found, returns a negative error
- * code.
- *
- * Note that this function does not do reference traversal. If you want
- * to follow references to other resources to get the "real" value to
- * use, you need to call resolveReference() after this function.
- *
- * @param resID A resource identifier naming the desired theme
- * attribute.
- * @param outValue Filled in with the theme value that was
- * found.
- *
- * @return ssize_t Either a >= 0 table index or a negative error code.
- */
- ssize_t getAttribute(uint32_t resID, Res_value* outValue,
- uint32_t* outTypeSpecFlags = NULL) const;
-
- /**
- * This is like ResTable::resolveReference(), but also takes
- * care of resolving attribute references to the theme.
- */
- ssize_t resolveAttributeReference(Res_value* inOutValue,
- ssize_t blockIndex, uint32_t* outLastRef = NULL,
- uint32_t* inoutTypeSpecFlags = NULL,
- ResTable_config* inoutConfig = NULL) const;
-
- void dumpToLog() const;
-
- private:
- Theme(const Theme&);
- Theme& operator=(const Theme&);
-
- struct theme_entry {
- ssize_t stringBlock;
- uint32_t typeSpecFlags;
- Res_value value;
- };
- struct type_info {
- size_t numEntries;
- theme_entry* entries;
- };
- struct package_info {
- size_t numTypes;
- type_info types[];
- };
-
- void free_package(package_info* pi);
- package_info* copy_package(package_info* pi);
-
- const ResTable& mTable;
- package_info* mPackages[Res_MAXPACKAGE];
- };
-
- void setParameters(const ResTable_config* params);
- void getParameters(ResTable_config* params) const;
-
- // Retrieve an identifier (which can be passed to getResource)
- // for a given resource name. The 'name' can be fully qualified
- // (<package>:<type>.<basename>) or the package or type components
- // can be dropped if default values are supplied here.
- //
- // Returns 0 if no such resource was found, else a valid resource ID.
- uint32_t identifierForName(const char16_t* name, size_t nameLen,
- const char16_t* type = 0, size_t typeLen = 0,
- const char16_t* defPackage = 0,
- size_t defPackageLen = 0,
- uint32_t* outTypeSpecFlags = NULL) const;
-
- static bool expandResourceRef(const uint16_t* refStr, size_t refLen,
- String16* outPackage,
- String16* outType,
- String16* outName,
- const String16* defType = NULL,
- const String16* defPackage = NULL,
- const char** outErrorMsg = NULL,
- bool* outPublicOnly = NULL);
-
- static bool stringToInt(const char16_t* s, size_t len, Res_value* outValue);
- static bool stringToFloat(const char16_t* s, size_t len, Res_value* outValue);
-
- // Used with stringToValue.
- class Accessor
- {
- public:
- inline virtual ~Accessor() { }
-
- virtual uint32_t getCustomResource(const String16& package,
- const String16& type,
- const String16& name) const = 0;
- virtual uint32_t getCustomResourceWithCreation(const String16& package,
- const String16& type,
- const String16& name,
- const bool createIfNeeded = false) = 0;
- virtual uint32_t getRemappedPackage(uint32_t origPackage) const = 0;
- virtual bool getAttributeType(uint32_t attrID, uint32_t* outType) = 0;
- virtual bool getAttributeMin(uint32_t attrID, uint32_t* outMin) = 0;
- virtual bool getAttributeMax(uint32_t attrID, uint32_t* outMax) = 0;
- virtual bool getAttributeEnum(uint32_t attrID,
- const char16_t* name, size_t nameLen,
- Res_value* outValue) = 0;
- virtual bool getAttributeFlags(uint32_t attrID,
- const char16_t* name, size_t nameLen,
- Res_value* outValue) = 0;
- virtual uint32_t getAttributeL10N(uint32_t attrID) = 0;
- virtual bool getLocalizationSetting() = 0;
- virtual void reportError(void* accessorCookie, const char* fmt, ...) = 0;
- };
-
- // Convert a string to a resource value. Handles standard "@res",
- // "#color", "123", and "0x1bd" types; performs escaping of strings.
- // The resulting value is placed in 'outValue'; if it is a string type,
- // 'outString' receives the string. If 'attrID' is supplied, the value is
- // type checked against this attribute and it is used to perform enum
- // evaluation. If 'acccessor' is supplied, it will be used to attempt to
- // resolve resources that do not exist in this ResTable. If 'attrType' is
- // supplied, the value will be type checked for this format if 'attrID'
- // is not supplied or found.
- bool stringToValue(Res_value* outValue, String16* outString,
- const char16_t* s, size_t len,
- bool preserveSpaces, bool coerceType,
- uint32_t attrID = 0,
- const String16* defType = NULL,
- const String16* defPackage = NULL,
- Accessor* accessor = NULL,
- void* accessorCookie = NULL,
- uint32_t attrType = ResTable_map::TYPE_ANY,
- bool enforcePrivate = true) const;
-
- // Perform processing of escapes and quotes in a string.
- static bool collectString(String16* outString,
- const char16_t* s, size_t len,
- bool preserveSpaces,
- const char** outErrorMsg = NULL,
- bool append = false);
-
- size_t getBasePackageCount() const;
- const char16_t* getBasePackageName(size_t idx) const;
- uint32_t getBasePackageId(size_t idx) const;
-
- // Return the number of resource tables that the object contains.
- size_t getTableCount() const;
- // Return the values string pool for the resource table at the given
- // index. This string pool contains all of the strings for values
- // contained in the resource table -- that is the item values themselves,
- // but not the names their entries or types.
- const ResStringPool* getTableStringBlock(size_t index) const;
- // Return unique cookie identifier for the given resource table.
- void* getTableCookie(size_t index) const;
-
- // Return the configurations (ResTable_config) that we know about
- void getConfigurations(Vector<ResTable_config>* configs) const;
-
- void getLocales(Vector<String8>* locales) const;
-
- // Generate an idmap.
- //
- // Return value: on success: NO_ERROR; caller is responsible for free-ing
- // outData (using free(3)). On failure, any status_t value other than
- // NO_ERROR; the caller should not free outData.
- status_t createIdmap(const ResTable& overlay, uint32_t originalCrc, uint32_t overlayCrc,
- void** outData, size_t* outSize) const;
-
- enum {
- IDMAP_HEADER_SIZE_BYTES = 3 * sizeof(uint32_t),
- };
- // Retrieve idmap meta-data.
- //
- // This function only requires the idmap header (the first
- // IDMAP_HEADER_SIZE_BYTES) bytes of an idmap file.
- static bool getIdmapInfo(const void* idmap, size_t size,
- uint32_t* pOriginalCrc, uint32_t* pOverlayCrc);
-
- void print(bool inclValues) const;
- static String8 normalizeForOutput(const char* input);
-
-private:
- struct Header;
- struct Type;
- struct Package;
- struct PackageGroup;
- struct bag_set;
-
- status_t add(const void* data, size_t size, void* cookie,
- Asset* asset, bool copyData, const Asset* idmap);
-
- ssize_t getResourcePackageIndex(uint32_t resID) const;
- ssize_t getEntry(
- const Package* package, int typeIndex, int entryIndex,
- const ResTable_config* config,
- const ResTable_type** outType, const ResTable_entry** outEntry,
- const Type** outTypeClass) const;
- status_t parsePackage(
- const ResTable_package* const pkg, const Header* const header, uint32_t idmap_id);
-
- void print_value(const Package* pkg, const Res_value& value) const;
-
- mutable Mutex mLock;
-
- status_t mError;
-
- ResTable_config mParams;
-
- // Array of all resource tables.
- Vector<Header*> mHeaders;
-
- // Array of packages in all resource tables.
- Vector<PackageGroup*> mPackageGroups;
-
- // Mapping from resource package IDs to indices into the internal
- // package array.
- uint8_t mPackageMap[256];
-};
-
-} // namespace android
-
-#endif // _LIBS_UTILS_RESOURCE_TYPES_H
diff --git a/include/androidfw/StreamingZipInflater.h b/include/androidfw/StreamingZipInflater.h
deleted file mode 100644
index 3ace5d5..0000000
--- a/include/androidfw/StreamingZipInflater.h
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef __LIBS_STREAMINGZIPINFLATER_H
-#define __LIBS_STREAMINGZIPINFLATER_H
-
-#include <unistd.h>
-#include <inttypes.h>
-#include <zlib.h>
-
-#include <utils/Compat.h>
-
-namespace android {
-
-class StreamingZipInflater {
-public:
- static const size_t INPUT_CHUNK_SIZE = 64 * 1024;
- static const size_t OUTPUT_CHUNK_SIZE = 64 * 1024;
-
- // Flavor that pages in the compressed data from a fd
- StreamingZipInflater(int fd, off64_t compDataStart, size_t uncompSize, size_t compSize);
-
- // Flavor that gets the compressed data from an in-memory buffer
- StreamingZipInflater(class FileMap* dataMap, size_t uncompSize);
-
- ~StreamingZipInflater();
-
- // read 'count' bytes of uncompressed data from the current position. outBuf may
- // be NULL, in which case the data is consumed and discarded.
- ssize_t read(void* outBuf, size_t count);
-
- // seeking backwards requires uncompressing fom the beginning, so is very
- // expensive. seeking forwards only requires uncompressing from the current
- // position to the destination.
- off64_t seekAbsolute(off64_t absoluteInputPosition);
-
-private:
- void initInflateState();
- int readNextChunk();
-
- // where to find the uncompressed data
- int mFd;
- off64_t mInFileStart; // where the compressed data lives in the file
- class FileMap* mDataMap;
-
- z_stream mInflateState;
- bool mStreamNeedsInit;
-
- // output invariants for this asset
- uint8_t* mOutBuf; // output buf for decompressed bytes
- size_t mOutBufSize; // allocated size of mOutBuf
- size_t mOutTotalSize; // total uncompressed size of the blob
-
- // current output state bookkeeping
- off64_t mOutCurPosition; // current position in total offset
- size_t mOutLastDecoded; // last decoded byte + 1 in mOutbuf
- size_t mOutDeliverable; // next undelivered byte of decoded output in mOutBuf
-
- // input invariants
- uint8_t* mInBuf;
- size_t mInBufSize; // allocated size of mInBuf;
- size_t mInTotalSize; // total size of compressed data for this blob
-
- // input state bookkeeping
- size_t mInNextChunkOffset; // offset from start of blob at which the next input chunk lies
- // the z_stream contains state about input block consumption
-};
-
-}
-
-#endif
diff --git a/include/androidfw/ZipFileRO.h b/include/androidfw/ZipFileRO.h
deleted file mode 100644
index 547e36a..0000000
--- a/include/androidfw/ZipFileRO.h
+++ /dev/null
@@ -1,262 +0,0 @@
-/*
- * 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.
- */
-
-/*
- * Read-only access to Zip archives, with minimal heap allocation.
- *
- * This is similar to the more-complete ZipFile class, but no attempt
- * has been made to make them interchangeable. This class operates under
- * a very different set of assumptions and constraints.
- *
- * One such assumption is that if you're getting file descriptors for
- * use with this class as a child of a fork() operation, you must be on
- * a pread() to guarantee correct operation. This is because pread() can
- * atomically read at a file offset without worrying about a lock around an
- * lseek() + read() pair.
- */
-#ifndef __LIBS_ZIPFILERO_H
-#define __LIBS_ZIPFILERO_H
-
-#include <utils/Compat.h>
-#include <utils/Errors.h>
-#include <utils/FileMap.h>
-#include <utils/threads.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <time.h>
-
-namespace android {
-
-/*
- * Trivial typedef to ensure that ZipEntryRO is not treated as a simple
- * integer. We use NULL to indicate an invalid value.
- */
-typedef void* ZipEntryRO;
-
-/*
- * Open a Zip archive for reading.
- *
- * We want "open" and "find entry by name" to be fast operations, and we
- * want to use as little memory as possible. We memory-map the file,
- * and load a hash table with pointers to the filenames (which aren't
- * null-terminated). The other fields are at a fixed offset from the
- * filename, so we don't need to extract those (but we do need to byte-read
- * and endian-swap them every time we want them).
- *
- * To speed comparisons when doing a lookup by name, we could make the mapping
- * "private" (copy-on-write) and null-terminate the filenames after verifying
- * the record structure. However, this requires a private mapping of
- * every page that the Central Directory touches. Easier to tuck a copy
- * of the string length into the hash table entry.
- *
- * NOTE: If this is used on file descriptors inherited from a fork() operation,
- * you must be on a platform that implements pread() to guarantee correctness
- * on the shared file descriptors.
- */
-class ZipFileRO {
-public:
- ZipFileRO()
- : mFd(-1), mFileName(NULL), mFileLength(-1),
- mDirectoryMap(NULL),
- mNumEntries(-1), mDirectoryOffset(-1),
- mHashTableSize(-1), mHashTable(NULL)
- {}
-
- ~ZipFileRO();
-
- /*
- * Open an archive.
- */
- status_t open(const char* zipFileName);
-
- /*
- * Find an entry, by name. Returns the entry identifier, or NULL if
- * not found.
- *
- * If two entries have the same name, one will be chosen at semi-random.
- */
- ZipEntryRO findEntryByName(const char* fileName) const;
-
- /*
- * Return the #of entries in the Zip archive.
- */
- int getNumEntries(void) const {
- return mNumEntries;
- }
-
- /*
- * Return the Nth entry. Zip file entries are not stored in sorted
- * order, and updated entries may appear at the end, so anyone walking
- * the archive needs to avoid making ordering assumptions. We take
- * that further by returning the Nth non-empty entry in the hash table
- * rather than the Nth entry in the archive.
- *
- * Valid values are [0..numEntries).
- *
- * [This is currently O(n). If it needs to be fast we can allocate an
- * additional data structure or provide an iterator interface.]
- */
- ZipEntryRO findEntryByIndex(int idx) const;
-
- /*
- * Copy the filename into the supplied buffer. Returns 0 on success,
- * -1 if "entry" is invalid, or the filename length if it didn't fit. The
- * length, and the returned string, include the null-termination.
- */
- int getEntryFileName(ZipEntryRO entry, char* buffer, int bufLen) const;
-
- /*
- * Get the vital stats for an entry. Pass in NULL pointers for anything
- * you don't need.
- *
- * "*pOffset" holds the Zip file offset of the entry's data.
- *
- * Returns "false" if "entry" is bogus or if the data in the Zip file
- * appears to be bad.
- */
- bool getEntryInfo(ZipEntryRO entry, int* pMethod, size_t* pUncompLen,
- size_t* pCompLen, off64_t* pOffset, long* pModWhen, long* pCrc32) const;
-
- /*
- * Create a new FileMap object that maps a subset of the archive. For
- * an uncompressed entry this effectively provides a pointer to the
- * actual data, for a compressed entry this provides the input buffer
- * for inflate().
- */
- FileMap* createEntryFileMap(ZipEntryRO entry) const;
-
- /*
- * Uncompress the data into a buffer. Depending on the compression
- * format, this is either an "inflate" operation or a memcpy.
- *
- * Use "uncompLen" from getEntryInfo() to determine the required
- * buffer size.
- *
- * Returns "true" on success.
- */
- bool uncompressEntry(ZipEntryRO entry, void* buffer) const;
-
- /*
- * Uncompress the data to an open file descriptor.
- */
- bool uncompressEntry(ZipEntryRO entry, int fd) const;
-
- /* Zip compression methods we support */
- enum {
- kCompressStored = 0, // no compression
- kCompressDeflated = 8, // standard deflate
- };
-
- /*
- * Utility function: uncompress deflated data, buffer to buffer.
- */
- static bool inflateBuffer(void* outBuf, const void* inBuf,
- size_t uncompLen, size_t compLen);
-
- /*
- * Utility function: uncompress deflated data, buffer to fd.
- */
- static bool inflateBuffer(int fd, const void* inBuf,
- size_t uncompLen, size_t compLen);
-
- /*
- * Utility function to convert ZIP's time format to a timespec struct.
- */
- static inline void zipTimeToTimespec(long when, struct tm* timespec) {
- const long date = when >> 16;
- timespec->tm_year = ((date >> 9) & 0x7F) + 80; // Zip is years since 1980
- timespec->tm_mon = (date >> 5) & 0x0F;
- timespec->tm_mday = date & 0x1F;
-
- timespec->tm_hour = (when >> 11) & 0x1F;
- timespec->tm_min = (when >> 5) & 0x3F;
- timespec->tm_sec = (when & 0x1F) << 1;
- }
-
- /*
- * Some basic functions for raw data manipulation. "LE" means
- * Little Endian.
- */
- static inline unsigned short get2LE(const unsigned char* buf) {
- return buf[0] | (buf[1] << 8);
- }
- static inline unsigned long get4LE(const unsigned char* buf) {
- return buf[0] | (buf[1] << 8) | (buf[2] << 16) | (buf[3] << 24);
- }
-
-private:
- /* these are private and not defined */
- ZipFileRO(const ZipFileRO& src);
- ZipFileRO& operator=(const ZipFileRO& src);
-
- /* locate and parse the central directory */
- bool mapCentralDirectory(void);
-
- /* parse the archive, prepping internal structures */
- bool parseZipArchive(void);
-
- /* add a new entry to the hash table */
- void addToHash(const char* str, int strLen, unsigned int hash);
-
- /* compute string hash code */
- static unsigned int computeHash(const char* str, int len);
-
- /* convert a ZipEntryRO back to a hash table index */
- int entryToIndex(const ZipEntryRO entry) const;
-
- /*
- * One entry in the hash table.
- */
- typedef struct HashEntry {
- const char* name;
- unsigned short nameLen;
- //unsigned int hash;
- } HashEntry;
-
- /* open Zip archive */
- int mFd;
-
- /* Lock for handling the file descriptor (seeks, etc) */
- mutable Mutex mFdLock;
-
- /* zip file name */
- char* mFileName;
-
- /* length of file */
- size_t mFileLength;
-
- /* mapped file */
- FileMap* mDirectoryMap;
-
- /* number of entries in the Zip archive */
- int mNumEntries;
-
- /* CD directory offset in the Zip archive */
- off64_t mDirectoryOffset;
-
- /*
- * We know how many entries are in the Zip archive, so we have a
- * fixed-size hash table. We probe for an empty slot.
- */
- int mHashTableSize;
- HashEntry* mHashTable;
-};
-
-}; // namespace android
-
-#endif /*__LIBS_ZIPFILERO_H*/
diff --git a/include/androidfw/ZipUtils.h b/include/androidfw/ZipUtils.h
deleted file mode 100644
index 42c42b6..0000000
--- a/include/androidfw/ZipUtils.h
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * 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.
- */
-
-//
-// Miscellaneous zip/gzip utility functions.
-//
-#ifndef __LIBS_ZIPUTILS_H
-#define __LIBS_ZIPUTILS_H
-
-#include <stdio.h>
-
-namespace android {
-
-/*
- * Container class for utility functions, primarily for namespace reasons.
- */
-class ZipUtils {
-public:
- /*
- * General utility function for uncompressing "deflate" data from a file
- * to a buffer.
- */
- static bool inflateToBuffer(int fd, void* buf, long uncompressedLen,
- long compressedLen);
- static bool inflateToBuffer(FILE* fp, void* buf, long uncompressedLen,
- long compressedLen);
-
- /*
- * Someday we might want to make this generic and handle bzip2 ".bz2"
- * files too.
- *
- * We could declare gzip to be a sub-class of zip that has exactly
- * one always-compressed entry, but we currently want to treat Zip
- * and gzip as distinct, so there's no value.
- *
- * The zlib library has some gzip utilities, but it has no interface
- * for extracting the uncompressed length of the file (you do *not*
- * want to gzseek to the end).
- *
- * Pass in a seeked file pointer for the gzip file. If this is a gzip
- * file, we set our return values appropriately and return "true" with
- * the file seeked to the start of the compressed data.
- */
- static bool examineGzip(FILE* fp, int* pCompressionMethod,
- long* pUncompressedLen, long* pCompressedLen, unsigned long* pCRC32);
-
-private:
- ZipUtils() {}
- ~ZipUtils() {}
-};
-
-}; // namespace android
-
-#endif /*__LIBS_ZIPUTILS_H*/
diff --git a/include/androidfw/misc.h b/include/androidfw/misc.h
deleted file mode 100644
index 5a5a0e2..0000000
--- a/include/androidfw/misc.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (C) 2005 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.
- */
-
-#include <sys/types.h>
-
-//
-// Handy utility functions and portability code.
-//
-#ifndef _LIBS_ANDROID_FW_MISC_H
-#define _LIBS_ANDROID_FW_MISC_H
-
-namespace android {
-
-/*
- * Some utility functions for working with files. These could be made
- * part of a "File" class.
- */
-typedef enum FileType {
- kFileTypeUnknown = 0,
- kFileTypeNonexistent, // i.e. ENOENT
- kFileTypeRegular,
- kFileTypeDirectory,
- kFileTypeCharDev,
- kFileTypeBlockDev,
- kFileTypeFifo,
- kFileTypeSymlink,
- kFileTypeSocket,
-} FileType;
-/* get the file's type; follows symlinks */
-FileType getFileType(const char* fileName);
-/* get the file's modification date; returns -1 w/errno set on failure */
-time_t getFileModDate(const char* fileName);
-
-}; // namespace android
-
-#endif // _LIBS_ANDROID_FW_MISC_H
diff --git a/libs/androidfw/Android.mk b/libs/androidfw/Android.mk
deleted file mode 100644
index d80612b..0000000
--- a/libs/androidfw/Android.mk
+++ /dev/null
@@ -1,93 +0,0 @@
-# Copyright (C) 2010 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-LOCAL_PATH:= $(call my-dir)
-
-# libandroidfw is partially built for the host (used by obbtool and others)
-# These files are common to host and target builds.
-
-commonSources := \
- Asset.cpp \
- AssetDir.cpp \
- AssetManager.cpp \
- misc.cpp \
- ObbFile.cpp \
- ResourceTypes.cpp \
- StreamingZipInflater.cpp \
- ZipFileRO.cpp \
- ZipUtils.cpp
-
-deviceSources := \
- $(commonSources) \
- BackupData.cpp \
- BackupHelpers.cpp \
- CursorWindow.cpp
-
-hostSources := \
- $(commonSources)
-
-# For the host
-# =====================================================
-
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES:= $(hostSources)
-
-LOCAL_MODULE:= libandroidfw
-
-LOCAL_MODULE_TAGS := optional
-
-LOCAL_CFLAGS += -DSTATIC_ANDROIDFW_FOR_TOOLS
-
-LOCAL_C_INCLUDES := \
- external/zlib
-
-LOCAL_STATIC_LIBRARIES := liblog
-
-include $(BUILD_HOST_STATIC_LIBRARY)
-
-
-# For the device
-# =====================================================
-
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES:= $(deviceSources)
-
-LOCAL_SHARED_LIBRARIES := \
- libbinder \
- liblog \
- libcutils \
- libutils \
- libz
-
-LOCAL_C_INCLUDES := \
- external/icu4c/common \
- external/zlib
-
-LOCAL_MODULE:= libandroidfw
-
-LOCAL_MODULE_TAGS := optional
-
-include $(BUILD_SHARED_LIBRARY)
-
-
-# Include subdirectory makefiles
-# ============================================================
-
-# If we're building with ONE_SHOT_MAKEFILE (mm, mmm), then what the framework
-# team really wants is to build the stuff defined by this makefile.
-ifeq (,$(ONE_SHOT_MAKEFILE))
-include $(call first-makefiles-under,$(LOCAL_PATH))
-endif
diff --git a/libs/androidfw/Asset.cpp b/libs/androidfw/Asset.cpp
deleted file mode 100644
index cb7628d..0000000
--- a/libs/androidfw/Asset.cpp
+++ /dev/null
@@ -1,897 +0,0 @@
-/*
- * Copyright (C) 2006 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-//
-// Provide access to a read-only asset.
-//
-
-#define LOG_TAG "asset"
-//#define NDEBUG 0
-
-#include <androidfw/Asset.h>
-#include <androidfw/StreamingZipInflater.h>
-#include <androidfw/ZipFileRO.h>
-#include <androidfw/ZipUtils.h>
-#include <utils/Atomic.h>
-#include <utils/FileMap.h>
-#include <utils/Log.h>
-#include <utils/threads.h>
-
-#include <assert.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <memory.h>
-#include <string.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <unistd.h>
-
-using namespace android;
-
-#ifndef O_BINARY
-# define O_BINARY 0
-#endif
-
-static Mutex gAssetLock;
-static int32_t gCount = 0;
-static Asset* gHead = NULL;
-static Asset* gTail = NULL;
-
-int32_t Asset::getGlobalCount()
-{
- AutoMutex _l(gAssetLock);
- return gCount;
-}
-
-String8 Asset::getAssetAllocations()
-{
- AutoMutex _l(gAssetLock);
- String8 res;
- Asset* cur = gHead;
- while (cur != NULL) {
- if (cur->isAllocated()) {
- res.append(" ");
- res.append(cur->getAssetSource());
- off64_t size = (cur->getLength()+512)/1024;
- char buf[64];
- sprintf(buf, ": %dK\n", (int)size);
- res.append(buf);
- }
- cur = cur->mNext;
- }
-
- return res;
-}
-
-Asset::Asset(void)
- : mAccessMode(ACCESS_UNKNOWN)
-{
- AutoMutex _l(gAssetLock);
- gCount++;
- mNext = mPrev = NULL;
- if (gTail == NULL) {
- gHead = gTail = this;
- } else {
- mPrev = gTail;
- gTail->mNext = this;
- gTail = this;
- }
- //ALOGI("Creating Asset %p #%d\n", this, gCount);
-}
-
-Asset::~Asset(void)
-{
- AutoMutex _l(gAssetLock);
- gCount--;
- if (gHead == this) {
- gHead = mNext;
- }
- if (gTail == this) {
- gTail = mPrev;
- }
- if (mNext != NULL) {
- mNext->mPrev = mPrev;
- }
- if (mPrev != NULL) {
- mPrev->mNext = mNext;
- }
- mNext = mPrev = NULL;
- //ALOGI("Destroying Asset in %p #%d\n", this, gCount);
-}
-
-/*
- * Create a new Asset from a file on disk. There is a fair chance that
- * the file doesn't actually exist.
- *
- * We can use "mode" to decide how we want to go about it.
- */
-/*static*/ Asset* Asset::createFromFile(const char* fileName, AccessMode mode)
-{
- _FileAsset* pAsset;
- status_t result;
- off64_t length;
- int fd;
-
- fd = open(fileName, O_RDONLY | O_BINARY);
- if (fd < 0)
- return NULL;
-
- /*
- * Under Linux, the lseek fails if we actually opened a directory. To
- * be correct we should test the file type explicitly, but since we
- * always open things read-only it doesn't really matter, so there's
- * no value in incurring the extra overhead of an fstat() call.
- */
- // TODO(kroot): replace this with fstat despite the plea above.
-#if 1
- length = lseek64(fd, 0, SEEK_END);
- if (length < 0) {
- ::close(fd);
- return NULL;
- }
- (void) lseek64(fd, 0, SEEK_SET);
-#else
- struct stat st;
- if (fstat(fd, &st) < 0) {
- ::close(fd);
- return NULL;
- }
-
- if (!S_ISREG(st.st_mode)) {
- ::close(fd);
- return NULL;
- }
-#endif
-
- pAsset = new _FileAsset;
- result = pAsset->openChunk(fileName, fd, 0, length);
- if (result != NO_ERROR) {
- delete pAsset;
- return NULL;
- }
-
- pAsset->mAccessMode = mode;
- return pAsset;
-}
-
-
-/*
- * Create a new Asset from a compressed file on disk. There is a fair chance
- * that the file doesn't actually exist.
- *
- * We currently support gzip files. We might want to handle .bz2 someday.
- */
-/*static*/ Asset* Asset::createFromCompressedFile(const char* fileName,
- AccessMode mode)
-{
- _CompressedAsset* pAsset;
- status_t result;
- off64_t fileLen;
- bool scanResult;
- long offset;
- int method;
- long uncompressedLen, compressedLen;
- int fd;
-
- fd = open(fileName, O_RDONLY | O_BINARY);
- if (fd < 0)
- return NULL;
-
- fileLen = lseek(fd, 0, SEEK_END);
- if (fileLen < 0) {
- ::close(fd);
- return NULL;
- }
- (void) lseek(fd, 0, SEEK_SET);
-
- /* want buffered I/O for the file scan; must dup so fclose() is safe */
- FILE* fp = fdopen(dup(fd), "rb");
- if (fp == NULL) {
- ::close(fd);
- return NULL;
- }
-
- unsigned long crc32;
- scanResult = ZipUtils::examineGzip(fp, &method, &uncompressedLen,
- &compressedLen, &crc32);
- offset = ftell(fp);
- fclose(fp);
- if (!scanResult) {
- ALOGD("File '%s' is not in gzip format\n", fileName);
- ::close(fd);
- return NULL;
- }
-
- pAsset = new _CompressedAsset;
- result = pAsset->openChunk(fd, offset, method, uncompressedLen,
- compressedLen);
- if (result != NO_ERROR) {
- delete pAsset;
- return NULL;
- }
-
- pAsset->mAccessMode = mode;
- return pAsset;
-}
-
-
-#if 0
-/*
- * Create a new Asset from part of an open file.
- */
-/*static*/ Asset* Asset::createFromFileSegment(int fd, off64_t offset,
- size_t length, AccessMode mode)
-{
- _FileAsset* pAsset;
- status_t result;
-
- pAsset = new _FileAsset;
- result = pAsset->openChunk(NULL, fd, offset, length);
- if (result != NO_ERROR)
- return NULL;
-
- pAsset->mAccessMode = mode;
- return pAsset;
-}
-
-/*
- * Create a new Asset from compressed data in an open file.
- */
-/*static*/ Asset* Asset::createFromCompressedData(int fd, off64_t offset,
- int compressionMethod, size_t uncompressedLen, size_t compressedLen,
- AccessMode mode)
-{
- _CompressedAsset* pAsset;
- status_t result;
-
- pAsset = new _CompressedAsset;
- result = pAsset->openChunk(fd, offset, compressionMethod,
- uncompressedLen, compressedLen);
- if (result != NO_ERROR)
- return NULL;
-
- pAsset->mAccessMode = mode;
- return pAsset;
-}
-#endif
-
-/*
- * Create a new Asset from a memory mapping.
- */
-/*static*/ Asset* Asset::createFromUncompressedMap(FileMap* dataMap,
- AccessMode mode)
-{
- _FileAsset* pAsset;
- status_t result;
-
- pAsset = new _FileAsset;
- result = pAsset->openChunk(dataMap);
- if (result != NO_ERROR)
- return NULL;
-
- pAsset->mAccessMode = mode;
- return pAsset;
-}
-
-/*
- * Create a new Asset from compressed data in a memory mapping.
- */
-/*static*/ Asset* Asset::createFromCompressedMap(FileMap* dataMap,
- int method, size_t uncompressedLen, AccessMode mode)
-{
- _CompressedAsset* pAsset;
- status_t result;
-
- pAsset = new _CompressedAsset;
- result = pAsset->openChunk(dataMap, method, uncompressedLen);
- if (result != NO_ERROR)
- return NULL;
-
- pAsset->mAccessMode = mode;
- return pAsset;
-}
-
-
-/*
- * Do generic seek() housekeeping. Pass in the offset/whence values from
- * the seek request, along with the current chunk offset and the chunk
- * length.
- *
- * Returns the new chunk offset, or -1 if the seek is illegal.
- */
-off64_t Asset::handleSeek(off64_t offset, int whence, off64_t curPosn, off64_t maxPosn)
-{
- off64_t newOffset;
-
- switch (whence) {
- case SEEK_SET:
- newOffset = offset;
- break;
- case SEEK_CUR:
- newOffset = curPosn + offset;
- break;
- case SEEK_END:
- newOffset = maxPosn + offset;
- break;
- default:
- ALOGW("unexpected whence %d\n", whence);
- // this was happening due to an off64_t size mismatch
- assert(false);
- return (off64_t) -1;
- }
-
- if (newOffset < 0 || newOffset > maxPosn) {
- ALOGW("seek out of range: want %ld, end=%ld\n",
- (long) newOffset, (long) maxPosn);
- return (off64_t) -1;
- }
-
- return newOffset;
-}
-
-
-/*
- * ===========================================================================
- * _FileAsset
- * ===========================================================================
- */
-
-/*
- * Constructor.
- */
-_FileAsset::_FileAsset(void)
- : mStart(0), mLength(0), mOffset(0), mFp(NULL), mFileName(NULL), mMap(NULL), mBuf(NULL)
-{
-}
-
-/*
- * Destructor. Release resources.
- */
-_FileAsset::~_FileAsset(void)
-{
- close();
-}
-
-/*
- * Operate on a chunk of an uncompressed file.
- *
- * Zero-length chunks are allowed.
- */
-status_t _FileAsset::openChunk(const char* fileName, int fd, off64_t offset, size_t length)
-{
- assert(mFp == NULL); // no reopen
- assert(mMap == NULL);
- assert(fd >= 0);
- assert(offset >= 0);
-
- /*
- * Seek to end to get file length.
- */
- off64_t fileLength;
- fileLength = lseek64(fd, 0, SEEK_END);
- if (fileLength == (off64_t) -1) {
- // probably a bad file descriptor
- ALOGD("failed lseek (errno=%d)\n", errno);
- return UNKNOWN_ERROR;
- }
-
- if ((off64_t) (offset + length) > fileLength) {
- ALOGD("start (%ld) + len (%ld) > end (%ld)\n",
- (long) offset, (long) length, (long) fileLength);
- return BAD_INDEX;
- }
-
- /* after fdopen, the fd will be closed on fclose() */
- mFp = fdopen(fd, "rb");
- if (mFp == NULL)
- return UNKNOWN_ERROR;
-
- mStart = offset;
- mLength = length;
- assert(mOffset == 0);
-
- /* seek the FILE* to the start of chunk */
- if (fseek(mFp, mStart, SEEK_SET) != 0) {
- assert(false);
- }
-
- mFileName = fileName != NULL ? strdup(fileName) : NULL;
-
- return NO_ERROR;
-}
-
-/*
- * Create the chunk from the map.
- */
-status_t _FileAsset::openChunk(FileMap* dataMap)
-{
- assert(mFp == NULL); // no reopen
- assert(mMap == NULL);
- assert(dataMap != NULL);
-
- mMap = dataMap;
- mStart = -1; // not used
- mLength = dataMap->getDataLength();
- assert(mOffset == 0);
-
- return NO_ERROR;
-}
-
-/*
- * Read a chunk of data.
- */
-ssize_t _FileAsset::read(void* buf, size_t count)
-{
- size_t maxLen;
- size_t actual;
-
- assert(mOffset >= 0 && mOffset <= mLength);
-
- if (getAccessMode() == ACCESS_BUFFER) {
- /*
- * On first access, read or map the entire file. The caller has
- * requested buffer access, either because they're going to be
- * using the buffer or because what they're doing has appropriate
- * performance needs and access patterns.
- */
- if (mBuf == NULL)
- getBuffer(false);
- }
-
- /* adjust count if we're near EOF */
- maxLen = mLength - mOffset;
- if (count > maxLen)
- count = maxLen;
-
- if (!count)
- return 0;
-
- if (mMap != NULL) {
- /* copy from mapped area */
- //printf("map read\n");
- memcpy(buf, (char*)mMap->getDataPtr() + mOffset, count);
- actual = count;
- } else if (mBuf != NULL) {
- /* copy from buffer */
- //printf("buf read\n");
- memcpy(buf, (char*)mBuf + mOffset, count);
- actual = count;
- } else {
- /* read from the file */
- //printf("file read\n");
- if (ftell(mFp) != mStart + mOffset) {
- ALOGE("Hosed: %ld != %ld+%ld\n",
- ftell(mFp), (long) mStart, (long) mOffset);
- assert(false);
- }
-
- /*
- * This returns 0 on error or eof. We need to use ferror() or feof()
- * to tell the difference, but we don't currently have those on the
- * device. However, we know how much data is *supposed* to be in the
- * file, so if we don't read the full amount we know something is
- * hosed.
- */
- actual = fread(buf, 1, count, mFp);
- if (actual == 0) // something failed -- I/O error?
- return -1;
-
- assert(actual == count);
- }
-
- mOffset += actual;
- return actual;
-}
-
-/*
- * Seek to a new position.
- */
-off64_t _FileAsset::seek(off64_t offset, int whence)
-{
- off64_t newPosn;
- off64_t actualOffset;
-
- // compute new position within chunk
- newPosn = handleSeek(offset, whence, mOffset, mLength);
- if (newPosn == (off64_t) -1)
- return newPosn;
-
- actualOffset = mStart + newPosn;
-
- if (mFp != NULL) {
- if (fseek(mFp, (long) actualOffset, SEEK_SET) != 0)
- return (off64_t) -1;
- }
-
- mOffset = actualOffset - mStart;
- return mOffset;
-}
-
-/*
- * Close the asset.
- */
-void _FileAsset::close(void)
-{
- if (mMap != NULL) {
- mMap->release();
- mMap = NULL;
- }
- if (mBuf != NULL) {
- delete[] mBuf;
- mBuf = NULL;
- }
-
- if (mFileName != NULL) {
- free(mFileName);
- mFileName = NULL;
- }
-
- if (mFp != NULL) {
- // can only be NULL when called from destructor
- // (otherwise we would never return this object)
- fclose(mFp);
- mFp = NULL;
- }
-}
-
-/*
- * Return a read-only pointer to a buffer.
- *
- * We can either read the whole thing in or map the relevant piece of
- * the source file. Ideally a map would be established at a higher
- * level and we'd be using a different object, but we didn't, so we
- * deal with it here.
- */
-const void* _FileAsset::getBuffer(bool wordAligned)
-{
- /* subsequent requests just use what we did previously */
- if (mBuf != NULL)
- return mBuf;
- if (mMap != NULL) {
- if (!wordAligned) {
- return mMap->getDataPtr();
- }
- return ensureAlignment(mMap);
- }
-
- assert(mFp != NULL);
-
- if (mLength < kReadVsMapThreshold) {
- unsigned char* buf;
- long allocLen;
-
- /* zero-length files are allowed; not sure about zero-len allocs */
- /* (works fine with gcc + x86linux) */
- allocLen = mLength;
- if (mLength == 0)
- allocLen = 1;
-
- buf = new unsigned char[allocLen];
- if (buf == NULL) {
- ALOGE("alloc of %ld bytes failed\n", (long) allocLen);
- return NULL;
- }
-
- ALOGV("Asset %p allocating buffer size %d (smaller than threshold)", this, (int)allocLen);
- if (mLength > 0) {
- long oldPosn = ftell(mFp);
- fseek(mFp, mStart, SEEK_SET);
- if (fread(buf, 1, mLength, mFp) != (size_t) mLength) {
- ALOGE("failed reading %ld bytes\n", (long) mLength);
- delete[] buf;
- return NULL;
- }
- fseek(mFp, oldPosn, SEEK_SET);
- }
-
- ALOGV(" getBuffer: loaded into buffer\n");
-
- mBuf = buf;
- return mBuf;
- } else {
- FileMap* map;
-
- map = new FileMap;
- if (!map->create(NULL, fileno(mFp), mStart, mLength, true)) {
- map->release();
- return NULL;
- }
-
- ALOGV(" getBuffer: mapped\n");
-
- mMap = map;
- if (!wordAligned) {
- return mMap->getDataPtr();
- }
- return ensureAlignment(mMap);
- }
-}
-
-int _FileAsset::openFileDescriptor(off64_t* outStart, off64_t* outLength) const
-{
- if (mMap != NULL) {
- const char* fname = mMap->getFileName();
- if (fname == NULL) {
- fname = mFileName;
- }
- if (fname == NULL) {
- return -1;
- }
- *outStart = mMap->getDataOffset();
- *outLength = mMap->getDataLength();
- return open(fname, O_RDONLY | O_BINARY);
- }
- if (mFileName == NULL) {
- return -1;
- }
- *outStart = mStart;
- *outLength = mLength;
- return open(mFileName, O_RDONLY | O_BINARY);
-}
-
-const void* _FileAsset::ensureAlignment(FileMap* map)
-{
- void* data = map->getDataPtr();
- if ((((size_t)data)&0x3) == 0) {
- // We can return this directly if it is aligned on a word
- // boundary.
- ALOGV("Returning aligned FileAsset %p (%s).", this,
- getAssetSource());
- return data;
- }
- // If not aligned on a word boundary, then we need to copy it into
- // our own buffer.
- ALOGV("Copying FileAsset %p (%s) to buffer size %d to make it aligned.", this,
- getAssetSource(), (int)mLength);
- unsigned char* buf = new unsigned char[mLength];
- if (buf == NULL) {
- ALOGE("alloc of %ld bytes failed\n", (long) mLength);
- return NULL;
- }
- memcpy(buf, data, mLength);
- mBuf = buf;
- return buf;
-}
-
-/*
- * ===========================================================================
- * _CompressedAsset
- * ===========================================================================
- */
-
-/*
- * Constructor.
- */
-_CompressedAsset::_CompressedAsset(void)
- : mStart(0), mCompressedLen(0), mUncompressedLen(0), mOffset(0),
- mMap(NULL), mFd(-1), mZipInflater(NULL), mBuf(NULL)
-{
-}
-
-/*
- * Destructor. Release resources.
- */
-_CompressedAsset::~_CompressedAsset(void)
-{
- close();
-}
-
-/*
- * Open a chunk of compressed data inside a file.
- *
- * This currently just sets up some values and returns. On the first
- * read, we expand the entire file into a buffer and return data from it.
- */
-status_t _CompressedAsset::openChunk(int fd, off64_t offset,
- int compressionMethod, size_t uncompressedLen, size_t compressedLen)
-{
- assert(mFd < 0); // no re-open
- assert(mMap == NULL);
- assert(fd >= 0);
- assert(offset >= 0);
- assert(compressedLen > 0);
-
- if (compressionMethod != ZipFileRO::kCompressDeflated) {
- assert(false);
- return UNKNOWN_ERROR;
- }
-
- mStart = offset;
- mCompressedLen = compressedLen;
- mUncompressedLen = uncompressedLen;
- assert(mOffset == 0);
- mFd = fd;
- assert(mBuf == NULL);
-
- if (uncompressedLen > StreamingZipInflater::OUTPUT_CHUNK_SIZE) {
- mZipInflater = new StreamingZipInflater(mFd, offset, uncompressedLen, compressedLen);
- }
-
- return NO_ERROR;
-}
-
-/*
- * Open a chunk of compressed data in a mapped region.
- *
- * Nothing is expanded until the first read call.
- */
-status_t _CompressedAsset::openChunk(FileMap* dataMap, int compressionMethod,
- size_t uncompressedLen)
-{
- assert(mFd < 0); // no re-open
- assert(mMap == NULL);
- assert(dataMap != NULL);
-
- if (compressionMethod != ZipFileRO::kCompressDeflated) {
- assert(false);
- return UNKNOWN_ERROR;
- }
-
- mMap = dataMap;
- mStart = -1; // not used
- mCompressedLen = dataMap->getDataLength();
- mUncompressedLen = uncompressedLen;
- assert(mOffset == 0);
-
- if (uncompressedLen > StreamingZipInflater::OUTPUT_CHUNK_SIZE) {
- mZipInflater = new StreamingZipInflater(dataMap, uncompressedLen);
- }
- return NO_ERROR;
-}
-
-/*
- * Read data from a chunk of compressed data.
- *
- * [For now, that's just copying data out of a buffer.]
- */
-ssize_t _CompressedAsset::read(void* buf, size_t count)
-{
- size_t maxLen;
- size_t actual;
-
- assert(mOffset >= 0 && mOffset <= mUncompressedLen);
-
- /* If we're relying on a streaming inflater, go through that */
- if (mZipInflater) {
- actual = mZipInflater->read(buf, count);
- } else {
- if (mBuf == NULL) {
- if (getBuffer(false) == NULL)
- return -1;
- }
- assert(mBuf != NULL);
-
- /* adjust count if we're near EOF */
- maxLen = mUncompressedLen - mOffset;
- if (count > maxLen)
- count = maxLen;
-
- if (!count)
- return 0;
-
- /* copy from buffer */
- //printf("comp buf read\n");
- memcpy(buf, (char*)mBuf + mOffset, count);
- actual = count;
- }
-
- mOffset += actual;
- return actual;
-}
-
-/*
- * Handle a seek request.
- *
- * If we're working in a streaming mode, this is going to be fairly
- * expensive, because it requires plowing through a bunch of compressed
- * data.
- */
-off64_t _CompressedAsset::seek(off64_t offset, int whence)
-{
- off64_t newPosn;
-
- // compute new position within chunk
- newPosn = handleSeek(offset, whence, mOffset, mUncompressedLen);
- if (newPosn == (off64_t) -1)
- return newPosn;
-
- if (mZipInflater) {
- mZipInflater->seekAbsolute(newPosn);
- }
- mOffset = newPosn;
- return mOffset;
-}
-
-/*
- * Close the asset.
- */
-void _CompressedAsset::close(void)
-{
- if (mMap != NULL) {
- mMap->release();
- mMap = NULL;
- }
-
- delete[] mBuf;
- mBuf = NULL;
-
- delete mZipInflater;
- mZipInflater = NULL;
-
- if (mFd > 0) {
- ::close(mFd);
- mFd = -1;
- }
-}
-
-/*
- * Get a pointer to a read-only buffer of data.
- *
- * The first time this is called, we expand the compressed data into a
- * buffer.
- */
-const void* _CompressedAsset::getBuffer(bool wordAligned)
-{
- unsigned char* buf = NULL;
-
- if (mBuf != NULL)
- return mBuf;
-
- /*
- * Allocate a buffer and read the file into it.
- */
- buf = new unsigned char[mUncompressedLen];
- if (buf == NULL) {
- ALOGW("alloc %ld bytes failed\n", (long) mUncompressedLen);
- goto bail;
- }
-
- if (mMap != NULL) {
- if (!ZipFileRO::inflateBuffer(buf, mMap->getDataPtr(),
- mUncompressedLen, mCompressedLen))
- goto bail;
- } else {
- assert(mFd >= 0);
-
- /*
- * Seek to the start of the compressed data.
- */
- if (lseek(mFd, mStart, SEEK_SET) != mStart)
- goto bail;
-
- /*
- * Expand the data into it.
- */
- if (!ZipUtils::inflateToBuffer(mFd, buf, mUncompressedLen,
- mCompressedLen))
- goto bail;
- }
-
- /*
- * Success - now that we have the full asset in RAM we
- * no longer need the streaming inflater
- */
- delete mZipInflater;
- mZipInflater = NULL;
-
- mBuf = buf;
- buf = NULL;
-
-bail:
- delete[] buf;
- return mBuf;
-}
-
diff --git a/libs/androidfw/AssetDir.cpp b/libs/androidfw/AssetDir.cpp
deleted file mode 100644
index 475f521..0000000
--- a/libs/androidfw/AssetDir.cpp
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright (C) 2006 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-//
-// Provide access to a virtual directory in "asset space". Most of the
-// implementation is in the header file or in friend functions in
-// AssetManager.
-//
-#include <androidfw/AssetDir.h>
-
-using namespace android;
-
-
-/*
- * Find a matching entry in a vector of FileInfo. Because it's sorted, we
- * can use a binary search.
- *
- * Assumes the vector is sorted in ascending order.
- */
-/*static*/ int AssetDir::FileInfo::findEntry(const SortedVector<FileInfo>* pVector,
- const String8& fileName)
-{
- FileInfo tmpInfo;
-
- tmpInfo.setFileName(fileName);
- return pVector->indexOf(tmpInfo);
-
-#if 0 // don't need this after all (uses 1/2 compares of SortedVector though)
- int lo, hi, cur;
-
- lo = 0;
- hi = pVector->size() -1;
- while (lo <= hi) {
- int cmp;
-
- cur = (hi + lo) / 2;
- cmp = strcmp(pVector->itemAt(cur).getFileName(), fileName);
- if (cmp == 0) {
- /* match, bail */
- return cur;
- } else if (cmp < 0) {
- /* too low */
- lo = cur + 1;
- } else {
- /* too high */
- hi = cur -1;
- }
- }
-
- return -1;
-#endif
-}
-
diff --git a/libs/androidfw/AssetManager.cpp b/libs/androidfw/AssetManager.cpp
deleted file mode 100644
index 1066715..0000000
--- a/libs/androidfw/AssetManager.cpp
+++ /dev/null
@@ -1,2034 +0,0 @@
-/*
- * Copyright (C) 2006 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-//
-// Provide access to read-only assets.
-//
-
-#define LOG_TAG "asset"
-#define ATRACE_TAG ATRACE_TAG_RESOURCES
-//#define LOG_NDEBUG 0
-
-#include <androidfw/Asset.h>
-#include <androidfw/AssetDir.h>
-#include <androidfw/AssetManager.h>
-#include <androidfw/misc.h>
-#include <androidfw/ResourceTypes.h>
-#include <androidfw/ZipFileRO.h>
-#include <utils/Atomic.h>
-#include <utils/Log.h>
-#include <utils/String8.h>
-#include <utils/String8.h>
-#include <utils/threads.h>
-#include <utils/Timers.h>
-#ifdef HAVE_ANDROID_OS
-#include <cutils/trace.h>
-#endif
-
-#include <assert.h>
-#include <dirent.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <strings.h>
-#include <sys/stat.h>
-#include <unistd.h>
-
-#ifndef TEMP_FAILURE_RETRY
-/* Used to retry syscalls that can return EINTR. */
-#define TEMP_FAILURE_RETRY(exp) ({ \
- typeof (exp) _rc; \
- do { \
- _rc = (exp); \
- } while (_rc == -1 && errno == EINTR); \
- _rc; })
-#endif
-
-#ifdef HAVE_ANDROID_OS
-#define MY_TRACE_BEGIN(x) ATRACE_BEGIN(x)
-#define MY_TRACE_END() ATRACE_END()
-#else
-#define MY_TRACE_BEGIN(x)
-#define MY_TRACE_END()
-#endif
-
-using namespace android;
-
-/*
- * Names for default app, locale, and vendor. We might want to change
- * these to be an actual locale, e.g. always use en-US as the default.
- */
-static const char* kDefaultLocale = "default";
-static const char* kDefaultVendor = "default";
-static const char* kAssetsRoot = "assets";
-static const char* kAppZipName = NULL; //"classes.jar";
-static const char* kSystemAssets = "framework/framework-res.apk";
-static const char* kIdmapCacheDir = "resource-cache";
-
-static const char* kExcludeExtension = ".EXCLUDE";
-
-static Asset* const kExcludedAsset = (Asset*) 0xd000000d;
-
-static volatile int32_t gCount = 0;
-
-namespace {
- // Transform string /a/b/c.apk to /data/resource-cache/a@b@c.apk@idmap
- String8 idmapPathForPackagePath(const String8& pkgPath)
- {
- const char* root = getenv("ANDROID_DATA");
- LOG_ALWAYS_FATAL_IF(root == NULL, "ANDROID_DATA not set");
- String8 path(root);
- path.appendPath(kIdmapCacheDir);
-
- char buf[256]; // 256 chars should be enough for anyone...
- strncpy(buf, pkgPath.string(), 255);
- buf[255] = '\0';
- char* filename = buf;
- while (*filename && *filename == '/') {
- ++filename;
- }
- char* p = filename;
- while (*p) {
- if (*p == '/') {
- *p = '@';
- }
- ++p;
- }
- path.appendPath(filename);
- path.append("@idmap");
-
- return path;
- }
-
- /*
- * Like strdup(), but uses C++ "new" operator instead of malloc.
- */
- static char* strdupNew(const char* str)
- {
- char* newStr;
- int len;
-
- if (str == NULL)
- return NULL;
-
- len = strlen(str);
- newStr = new char[len+1];
- memcpy(newStr, str, len+1);
-
- return newStr;
- }
-}
-
-/*
- * ===========================================================================
- * AssetManager
- * ===========================================================================
- */
-
-int32_t AssetManager::getGlobalCount()
-{
- return gCount;
-}
-
-AssetManager::AssetManager(CacheMode cacheMode)
- : mLocale(NULL), mVendor(NULL),
- mResources(NULL), mConfig(new ResTable_config),
- mCacheMode(cacheMode), mCacheValid(false)
-{
- int count = android_atomic_inc(&gCount)+1;
- //ALOGI("Creating AssetManager %p #%d\n", this, count);
- memset(mConfig, 0, sizeof(ResTable_config));
-}
-
-AssetManager::~AssetManager(void)
-{
- int count = android_atomic_dec(&gCount);
- //ALOGI("Destroying AssetManager in %p #%d\n", this, count);
-
- delete mConfig;
- delete mResources;
-
- // don't have a String class yet, so make sure we clean up
- delete[] mLocale;
- delete[] mVendor;
-}
-
-bool AssetManager::addAssetPath(const String8& path, void** cookie)
-{
- AutoMutex _l(mLock);
-
- asset_path ap;
-
- String8 realPath(path);
- if (kAppZipName) {
- realPath.appendPath(kAppZipName);
- }
- ap.type = ::getFileType(realPath.string());
- if (ap.type == kFileTypeRegular) {
- ap.path = realPath;
- } else {
- ap.path = path;
- ap.type = ::getFileType(path.string());
- if (ap.type != kFileTypeDirectory && ap.type != kFileTypeRegular) {
- ALOGW("Asset path %s is neither a directory nor file (type=%d).",
- path.string(), (int)ap.type);
- return false;
- }
- }
-
- // Skip if we have it already.
- for (size_t i=0; i<mAssetPaths.size(); i++) {
- if (mAssetPaths[i].path == ap.path) {
- if (cookie) {
- *cookie = (void*)(i+1);
- }
- return true;
- }
- }
-
- ALOGV("In %p Asset %s path: %s", this,
- ap.type == kFileTypeDirectory ? "dir" : "zip", ap.path.string());
-
- mAssetPaths.add(ap);
-
- // new paths are always added at the end
- if (cookie) {
- *cookie = (void*)mAssetPaths.size();
- }
-
- // add overlay packages for /system/framework; apps are handled by the
- // (Java) package manager
- if (strncmp(path.string(), "/system/framework/", 18) == 0) {
- // When there is an environment variable for /vendor, this
- // should be changed to something similar to how ANDROID_ROOT
- // and ANDROID_DATA are used in this file.
- String8 overlayPath("/vendor/overlay/framework/");
- overlayPath.append(path.getPathLeaf());
- if (TEMP_FAILURE_RETRY(access(overlayPath.string(), R_OK)) == 0) {
- asset_path oap;
- oap.path = overlayPath;
- oap.type = ::getFileType(overlayPath.string());
- bool addOverlay = (oap.type == kFileTypeRegular); // only .apks supported as overlay
- if (addOverlay) {
- oap.idmap = idmapPathForPackagePath(overlayPath);
-
- if (isIdmapStaleLocked(ap.path, oap.path, oap.idmap)) {
- addOverlay = createIdmapFileLocked(ap.path, oap.path, oap.idmap);
- }
- }
- if (addOverlay) {
- mAssetPaths.add(oap);
- } else {
- ALOGW("failed to add overlay package %s\n", overlayPath.string());
- }
- }
- }
-
- return true;
-}
-
-bool AssetManager::isIdmapStaleLocked(const String8& originalPath, const String8& overlayPath,
- const String8& idmapPath)
-{
- struct stat st;
- if (TEMP_FAILURE_RETRY(stat(idmapPath.string(), &st)) == -1) {
- if (errno == ENOENT) {
- return true; // non-existing idmap is always stale
- } else {
- ALOGW("failed to stat file %s: %s\n", idmapPath.string(), strerror(errno));
- return false;
- }
- }
- if (st.st_size < ResTable::IDMAP_HEADER_SIZE_BYTES) {
- ALOGW("file %s has unexpectedly small size=%zd\n", idmapPath.string(), (size_t)st.st_size);
- return false;
- }
- int fd = TEMP_FAILURE_RETRY(::open(idmapPath.string(), O_RDONLY));
- if (fd == -1) {
- ALOGW("failed to open file %s: %s\n", idmapPath.string(), strerror(errno));
- return false;
- }
- char buf[ResTable::IDMAP_HEADER_SIZE_BYTES];
- ssize_t bytesLeft = ResTable::IDMAP_HEADER_SIZE_BYTES;
- for (;;) {
- ssize_t r = TEMP_FAILURE_RETRY(read(fd, buf + ResTable::IDMAP_HEADER_SIZE_BYTES - bytesLeft,
- bytesLeft));
- if (r < 0) {
- TEMP_FAILURE_RETRY(close(fd));
- return false;
- }
- bytesLeft -= r;
- if (bytesLeft == 0) {
- break;
- }
- }
- TEMP_FAILURE_RETRY(close(fd));
-
- uint32_t cachedOriginalCrc, cachedOverlayCrc;
- if (!ResTable::getIdmapInfo(buf, ResTable::IDMAP_HEADER_SIZE_BYTES,
- &cachedOriginalCrc, &cachedOverlayCrc)) {
- return false;
- }
-
- uint32_t actualOriginalCrc, actualOverlayCrc;
- if (!getZipEntryCrcLocked(originalPath, "resources.arsc", &actualOriginalCrc)) {
- return false;
- }
- if (!getZipEntryCrcLocked(overlayPath, "resources.arsc", &actualOverlayCrc)) {
- return false;
- }
- return cachedOriginalCrc != actualOriginalCrc || cachedOverlayCrc != actualOverlayCrc;
-}
-
-bool AssetManager::getZipEntryCrcLocked(const String8& zipPath, const char* entryFilename,
- uint32_t* pCrc)
-{
- asset_path ap;
- ap.path = zipPath;
- const ZipFileRO* zip = getZipFileLocked(ap);
- if (zip == NULL) {
- return false;
- }
- const ZipEntryRO entry = zip->findEntryByName(entryFilename);
- if (entry == NULL) {
- return false;
- }
- if (!zip->getEntryInfo(entry, NULL, NULL, NULL, NULL, NULL, (long*)pCrc)) {
- return false;
- }
- return true;
-}
-
-bool AssetManager::createIdmapFileLocked(const String8& originalPath, const String8& overlayPath,
- const String8& idmapPath)
-{
- ALOGD("%s: originalPath=%s overlayPath=%s idmapPath=%s\n",
- __FUNCTION__, originalPath.string(), overlayPath.string(), idmapPath.string());
- ResTable tables[2];
- const String8* paths[2] = { &originalPath, &overlayPath };
- uint32_t originalCrc, overlayCrc;
- bool retval = false;
- ssize_t offset = 0;
- int fd = 0;
- uint32_t* data = NULL;
- size_t size;
-
- for (int i = 0; i < 2; ++i) {
- asset_path ap;
- ap.type = kFileTypeRegular;
- ap.path = *paths[i];
- Asset* ass = openNonAssetInPathLocked("resources.arsc", Asset::ACCESS_BUFFER, ap);
- if (ass == NULL) {
- ALOGW("failed to find resources.arsc in %s\n", ap.path.string());
- goto error;
- }
- tables[i].add(ass, (void*)1, false);
- }
-
- if (!getZipEntryCrcLocked(originalPath, "resources.arsc", &originalCrc)) {
- ALOGW("failed to retrieve crc for resources.arsc in %s\n", originalPath.string());
- goto error;
- }
- if (!getZipEntryCrcLocked(overlayPath, "resources.arsc", &overlayCrc)) {
- ALOGW("failed to retrieve crc for resources.arsc in %s\n", overlayPath.string());
- goto error;
- }
-
- if (tables[0].createIdmap(tables[1], originalCrc, overlayCrc,
- (void**)&data, &size) != NO_ERROR) {
- ALOGW("failed to generate idmap data for file %s\n", idmapPath.string());
- goto error;
- }
-
- // This should be abstracted (eg replaced by a stand-alone
- // application like dexopt, triggered by something equivalent to
- // installd).
- fd = TEMP_FAILURE_RETRY(::open(idmapPath.string(), O_WRONLY | O_CREAT | O_TRUNC, 0644));
- if (fd == -1) {
- ALOGW("failed to write idmap file %s (open: %s)\n", idmapPath.string(), strerror(errno));
- goto error_free;
- }
- for (;;) {
- ssize_t written = TEMP_FAILURE_RETRY(write(fd, data + offset, size));
- if (written < 0) {
- ALOGW("failed to write idmap file %s (write: %s)\n", idmapPath.string(),
- strerror(errno));
- goto error_close;
- }
- size -= (size_t)written;
- offset += written;
- if (size == 0) {
- break;
- }
- }
-
- retval = true;
-error_close:
- TEMP_FAILURE_RETRY(close(fd));
-error_free:
- free(data);
-error:
- return retval;
-}
-
-bool AssetManager::addDefaultAssets()
-{
- const char* root = getenv("ANDROID_ROOT");
- LOG_ALWAYS_FATAL_IF(root == NULL, "ANDROID_ROOT not set");
-
- String8 path(root);
- path.appendPath(kSystemAssets);
-
- return addAssetPath(path, NULL);
-}
-
-void* AssetManager::nextAssetPath(void* cookie) const
-{
- AutoMutex _l(mLock);
- size_t next = ((size_t)cookie)+1;
- return next > mAssetPaths.size() ? NULL : (void*)next;
-}
-
-String8 AssetManager::getAssetPath(void* cookie) const
-{
- AutoMutex _l(mLock);
- const size_t which = ((size_t)cookie)-1;
- if (which < mAssetPaths.size()) {
- return mAssetPaths[which].path;
- }
- return String8();
-}
-
-/*
- * Set the current locale. Use NULL to indicate no locale.
- *
- * Close and reopen Zip archives as appropriate, and reset cached
- * information in the locale-specific sections of the tree.
- */
-void AssetManager::setLocale(const char* locale)
-{
- AutoMutex _l(mLock);
- setLocaleLocked(locale);
-}
-
-void AssetManager::setLocaleLocked(const char* locale)
-{
- if (mLocale != NULL) {
- /* previously set, purge cached data */
- purgeFileNameCacheLocked();
- //mZipSet.purgeLocale();
- delete[] mLocale;
- }
- mLocale = strdupNew(locale);
-
- updateResourceParamsLocked();
-}
-
-/*
- * Set the current vendor. Use NULL to indicate no vendor.
- *
- * Close and reopen Zip archives as appropriate, and reset cached
- * information in the vendor-specific sections of the tree.
- */
-void AssetManager::setVendor(const char* vendor)
-{
- AutoMutex _l(mLock);
-
- if (mVendor != NULL) {
- /* previously set, purge cached data */
- purgeFileNameCacheLocked();
- //mZipSet.purgeVendor();
- delete[] mVendor;
- }
- mVendor = strdupNew(vendor);
-}
-
-void AssetManager::setConfiguration(const ResTable_config& config, const char* locale)
-{
- AutoMutex _l(mLock);
- *mConfig = config;
- if (locale) {
- setLocaleLocked(locale);
- } else if (config.language[0] != 0) {
- char spec[9];
- spec[0] = config.language[0];
- spec[1] = config.language[1];
- if (config.country[0] != 0) {
- spec[2] = '_';
- spec[3] = config.country[0];
- spec[4] = config.country[1];
- spec[5] = 0;
- } else {
- spec[3] = 0;
- }
- setLocaleLocked(spec);
- } else {
- updateResourceParamsLocked();
- }
-}
-
-void AssetManager::getConfiguration(ResTable_config* outConfig) const
-{
- AutoMutex _l(mLock);
- *outConfig = *mConfig;
-}
-
-/*
- * Open an asset.
- *
- * The data could be;
- * - In a file on disk (assetBase + fileName).
- * - In a compressed file on disk (assetBase + fileName.gz).
- * - In a Zip archive, uncompressed or compressed.
- *
- * It can be in a number of different directories and Zip archives.
- * The search order is:
- * - [appname]
- * - locale + vendor
- * - "default" + vendor
- * - locale + "default"
- * - "default + "default"
- * - "common"
- * - (same as above)
- *
- * To find a particular file, we have to try up to eight paths with
- * all three forms of data.
- *
- * We should probably reject requests for "illegal" filenames, e.g. those
- * with illegal characters or "../" backward relative paths.
- */
-Asset* AssetManager::open(const char* fileName, AccessMode mode)
-{
- AutoMutex _l(mLock);
-
- LOG_FATAL_IF(mAssetPaths.size() == 0, "No assets added to AssetManager");
-
-
- if (mCacheMode != CACHE_OFF && !mCacheValid)
- loadFileNameCacheLocked();
-
- String8 assetName(kAssetsRoot);
- assetName.appendPath(fileName);
-
- /*
- * For each top-level asset path, search for the asset.
- */
-
- size_t i = mAssetPaths.size();
- while (i > 0) {
- i--;
- ALOGV("Looking for asset '%s' in '%s'\n",
- assetName.string(), mAssetPaths.itemAt(i).path.string());
- Asset* pAsset = openNonAssetInPathLocked(assetName.string(), mode, mAssetPaths.itemAt(i));
- if (pAsset != NULL) {
- return pAsset != kExcludedAsset ? pAsset : NULL;
- }
- }
-
- return NULL;
-}
-
-/*
- * Open a non-asset file as if it were an asset.
- *
- * The "fileName" is the partial path starting from the application
- * name.
- */
-Asset* AssetManager::openNonAsset(const char* fileName, AccessMode mode)
-{
- AutoMutex _l(mLock);
-
- LOG_FATAL_IF(mAssetPaths.size() == 0, "No assets added to AssetManager");
-
-
- if (mCacheMode != CACHE_OFF && !mCacheValid)
- loadFileNameCacheLocked();
-
- /*
- * For each top-level asset path, search for the asset.
- */
-
- size_t i = mAssetPaths.size();
- while (i > 0) {
- i--;
- ALOGV("Looking for non-asset '%s' in '%s'\n", fileName, mAssetPaths.itemAt(i).path.string());
- Asset* pAsset = openNonAssetInPathLocked(
- fileName, mode, mAssetPaths.itemAt(i));
- if (pAsset != NULL) {
- return pAsset != kExcludedAsset ? pAsset : NULL;
- }
- }
-
- return NULL;
-}
-
-Asset* AssetManager::openNonAsset(void* cookie, const char* fileName, AccessMode mode)
-{
- const size_t which = ((size_t)cookie)-1;
-
- AutoMutex _l(mLock);
-
- LOG_FATAL_IF(mAssetPaths.size() == 0, "No assets added to AssetManager");
-
-
- if (mCacheMode != CACHE_OFF && !mCacheValid)
- loadFileNameCacheLocked();
-
- if (which < mAssetPaths.size()) {
- ALOGV("Looking for non-asset '%s' in '%s'\n", fileName,
- mAssetPaths.itemAt(which).path.string());
- Asset* pAsset = openNonAssetInPathLocked(
- fileName, mode, mAssetPaths.itemAt(which));
- if (pAsset != NULL) {
- return pAsset != kExcludedAsset ? pAsset : NULL;
- }
- }
-
- return NULL;
-}
-
-/*
- * Get the type of a file in the asset namespace.
- *
- * This currently only works for regular files. All others (including
- * directories) will return kFileTypeNonexistent.
- */
-FileType AssetManager::getFileType(const char* fileName)
-{
- Asset* pAsset = NULL;
-
- /*
- * Open the asset. This is less efficient than simply finding the
- * file, but it's not too bad (we don't uncompress or mmap data until
- * the first read() call).
- */
- pAsset = open(fileName, Asset::ACCESS_STREAMING);
- delete pAsset;
-
- if (pAsset == NULL)
- return kFileTypeNonexistent;
- else
- return kFileTypeRegular;
-}
-
-const ResTable* AssetManager::getResTable(bool required) const
-{
- ResTable* rt = mResources;
- if (rt) {
- return rt;
- }
-
- // Iterate through all asset packages, collecting resources from each.
-
- AutoMutex _l(mLock);
-
- if (mResources != NULL) {
- return mResources;
- }
-
- if (required) {
- LOG_FATAL_IF(mAssetPaths.size() == 0, "No assets added to AssetManager");
- }
-
- if (mCacheMode != CACHE_OFF && !mCacheValid)
- const_cast<AssetManager*>(this)->loadFileNameCacheLocked();
-
- const size_t N = mAssetPaths.size();
- for (size_t i=0; i<N; i++) {
- Asset* ass = NULL;
- ResTable* sharedRes = NULL;
- bool shared = true;
- const asset_path& ap = mAssetPaths.itemAt(i);
- MY_TRACE_BEGIN(ap.path.string());
- Asset* idmap = openIdmapLocked(ap);
- ALOGV("Looking for resource asset in '%s'\n", ap.path.string());
- if (ap.type != kFileTypeDirectory) {
- if (i == 0) {
- // The first item is typically the framework resources,
- // which we want to avoid parsing every time.
- sharedRes = const_cast<AssetManager*>(this)->
- mZipSet.getZipResourceTable(ap.path);
- }
- if (sharedRes == NULL) {
- ass = const_cast<AssetManager*>(this)->
- mZipSet.getZipResourceTableAsset(ap.path);
- if (ass == NULL) {
- ALOGV("loading resource table %s\n", ap.path.string());
- ass = const_cast<AssetManager*>(this)->
- openNonAssetInPathLocked("resources.arsc",
- Asset::ACCESS_BUFFER,
- ap);
- if (ass != NULL && ass != kExcludedAsset) {
- ass = const_cast<AssetManager*>(this)->
- mZipSet.setZipResourceTableAsset(ap.path, ass);
- }
- }
-
- if (i == 0 && ass != NULL) {
- // If this is the first resource table in the asset
- // manager, then we are going to cache it so that we
- // can quickly copy it out for others.
- ALOGV("Creating shared resources for %s", ap.path.string());
- sharedRes = new ResTable();
- sharedRes->add(ass, (void*)(i+1), false, idmap);
- sharedRes = const_cast<AssetManager*>(this)->
- mZipSet.setZipResourceTable(ap.path, sharedRes);
- }
- }
- } else {
- ALOGV("loading resource table %s\n", ap.path.string());
- ass = const_cast<AssetManager*>(this)->
- openNonAssetInPathLocked("resources.arsc",
- Asset::ACCESS_BUFFER,
- ap);
- shared = false;
- }
- if ((ass != NULL || sharedRes != NULL) && ass != kExcludedAsset) {
- if (rt == NULL) {
- mResources = rt = new ResTable();
- updateResourceParamsLocked();
- }
- ALOGV("Installing resource asset %p in to table %p\n", ass, mResources);
- if (sharedRes != NULL) {
- ALOGV("Copying existing resources for %s", ap.path.string());
- rt->add(sharedRes);
- } else {
- ALOGV("Parsing resources for %s", ap.path.string());
- rt->add(ass, (void*)(i+1), !shared, idmap);
- }
-
- if (!shared) {
- delete ass;
- }
- }
- if (idmap != NULL) {
- delete idmap;
- }
- MY_TRACE_END();
- }
-
- if (required && !rt) ALOGW("Unable to find resources file resources.arsc");
- if (!rt) {
- mResources = rt = new ResTable();
- }
- return rt;
-}
-
-void AssetManager::updateResourceParamsLocked() const
-{
- ResTable* res = mResources;
- if (!res) {
- return;
- }
-
- size_t llen = mLocale ? strlen(mLocale) : 0;
- mConfig->language[0] = 0;
- mConfig->language[1] = 0;
- mConfig->country[0] = 0;
- mConfig->country[1] = 0;
- if (llen >= 2) {
- mConfig->language[0] = mLocale[0];
- mConfig->language[1] = mLocale[1];
- }
- if (llen >= 5) {
- mConfig->country[0] = mLocale[3];
- mConfig->country[1] = mLocale[4];
- }
- mConfig->size = sizeof(*mConfig);
-
- res->setParameters(mConfig);
-}
-
-Asset* AssetManager::openIdmapLocked(const struct asset_path& ap) const
-{
- Asset* ass = NULL;
- if (ap.idmap.size() != 0) {
- ass = const_cast<AssetManager*>(this)->
- openAssetFromFileLocked(ap.idmap, Asset::ACCESS_BUFFER);
- if (ass) {
- ALOGV("loading idmap %s\n", ap.idmap.string());
- } else {
- ALOGW("failed to load idmap %s\n", ap.idmap.string());
- }
- }
- return ass;
-}
-
-const ResTable& AssetManager::getResources(bool required) const
-{
- const ResTable* rt = getResTable(required);
- return *rt;
-}
-
-bool AssetManager::isUpToDate()
-{
- AutoMutex _l(mLock);
- return mZipSet.isUpToDate();
-}
-
-void AssetManager::getLocales(Vector<String8>* locales) const
-{
- ResTable* res = mResources;
- if (res != NULL) {
- res->getLocales(locales);
- }
-}
-
-/*
- * Open a non-asset file as if it were an asset, searching for it in the
- * specified app.
- *
- * Pass in a NULL values for "appName" if the common app directory should
- * be used.
- */
-Asset* AssetManager::openNonAssetInPathLocked(const char* fileName, AccessMode mode,
- const asset_path& ap)
-{
- Asset* pAsset = NULL;
-
- /* look at the filesystem on disk */
- if (ap.type == kFileTypeDirectory) {
- String8 path(ap.path);
- path.appendPath(fileName);
-
- pAsset = openAssetFromFileLocked(path, mode);
-
- if (pAsset == NULL) {
- /* try again, this time with ".gz" */
- path.append(".gz");
- pAsset = openAssetFromFileLocked(path, mode);
- }
-
- if (pAsset != NULL) {
- //printf("FOUND NA '%s' on disk\n", fileName);
- pAsset->setAssetSource(path);
- }
-
- /* look inside the zip file */
- } else {
- String8 path(fileName);
-
- /* check the appropriate Zip file */
- ZipFileRO* pZip;
- ZipEntryRO entry;
-
- pZip = getZipFileLocked(ap);
- if (pZip != NULL) {
- //printf("GOT zip, checking NA '%s'\n", (const char*) path);
- entry = pZip->findEntryByName(path.string());
- if (entry != NULL) {
- //printf("FOUND NA in Zip file for %s\n", appName ? appName : kAppCommon);
- pAsset = openAssetFromZipLocked(pZip, entry, mode, path);
- }
- }
-
- if (pAsset != NULL) {
- /* create a "source" name, for debug/display */
- pAsset->setAssetSource(
- createZipSourceNameLocked(ZipSet::getPathName(ap.path.string()), String8(""),
- String8(fileName)));
- }
- }
-
- return pAsset;
-}
-
-/*
- * Open an asset, searching for it in the directory hierarchy for the
- * specified app.
- *
- * Pass in a NULL values for "appName" if the common app directory should
- * be used.
- */
-Asset* AssetManager::openInPathLocked(const char* fileName, AccessMode mode,
- const asset_path& ap)
-{
- Asset* pAsset = NULL;
-
- /*
- * Try various combinations of locale and vendor.
- */
- if (mLocale != NULL && mVendor != NULL)
- pAsset = openInLocaleVendorLocked(fileName, mode, ap, mLocale, mVendor);
- if (pAsset == NULL && mVendor != NULL)
- pAsset = openInLocaleVendorLocked(fileName, mode, ap, NULL, mVendor);
- if (pAsset == NULL && mLocale != NULL)
- pAsset = openInLocaleVendorLocked(fileName, mode, ap, mLocale, NULL);
- if (pAsset == NULL)
- pAsset = openInLocaleVendorLocked(fileName, mode, ap, NULL, NULL);
-
- return pAsset;
-}
-
-/*
- * Open an asset, searching for it in the directory hierarchy for the
- * specified locale and vendor.
- *
- * We also search in "app.jar".
- *
- * Pass in NULL values for "appName", "locale", and "vendor" if the
- * defaults should be used.
- */
-Asset* AssetManager::openInLocaleVendorLocked(const char* fileName, AccessMode mode,
- const asset_path& ap, const char* locale, const char* vendor)
-{
- Asset* pAsset = NULL;
-
- if (ap.type == kFileTypeDirectory) {
- if (mCacheMode == CACHE_OFF) {
- /* look at the filesystem on disk */
- String8 path(createPathNameLocked(ap, locale, vendor));
- path.appendPath(fileName);
-
- String8 excludeName(path);
- excludeName.append(kExcludeExtension);
- if (::getFileType(excludeName.string()) != kFileTypeNonexistent) {
- /* say no more */
- //printf("+++ excluding '%s'\n", (const char*) excludeName);
- return kExcludedAsset;
- }
-
- pAsset = openAssetFromFileLocked(path, mode);
-
- if (pAsset == NULL) {
- /* try again, this time with ".gz" */
- path.append(".gz");
- pAsset = openAssetFromFileLocked(path, mode);
- }
-
- if (pAsset != NULL)
- pAsset->setAssetSource(path);
- } else {
- /* find in cache */
- String8 path(createPathNameLocked(ap, locale, vendor));
- path.appendPath(fileName);
-
- AssetDir::FileInfo tmpInfo;
- bool found = false;
-
- String8 excludeName(path);
- excludeName.append(kExcludeExtension);
-
- if (mCache.indexOf(excludeName) != NAME_NOT_FOUND) {
- /* go no farther */
- //printf("+++ Excluding '%s'\n", (const char*) excludeName);
- return kExcludedAsset;
- }
-
- /*
- * File compression extensions (".gz") don't get stored in the
- * name cache, so we have to try both here.
- */
- if (mCache.indexOf(path) != NAME_NOT_FOUND) {
- found = true;
- pAsset = openAssetFromFileLocked(path, mode);
- if (pAsset == NULL) {
- /* try again, this time with ".gz" */
- path.append(".gz");
- pAsset = openAssetFromFileLocked(path, mode);
- }
- }
-
- if (pAsset != NULL)
- pAsset->setAssetSource(path);
-
- /*
- * Don't continue the search into the Zip files. Our cached info
- * said it was a file on disk; to be consistent with openDir()
- * we want to return the loose asset. If the cached file gets
- * removed, we fail.
- *
- * The alternative is to update our cache when files get deleted,
- * or make some sort of "best effort" promise, but for now I'm
- * taking the hard line.
- */
- if (found) {
- if (pAsset == NULL)
- ALOGD("Expected file not found: '%s'\n", path.string());
- return pAsset;
- }
- }
- }
-
- /*
- * Either it wasn't found on disk or on the cached view of the disk.
- * Dig through the currently-opened set of Zip files. If caching
- * is disabled, the Zip file may get reopened.
- */
- if (pAsset == NULL && ap.type == kFileTypeRegular) {
- String8 path;
-
- path.appendPath((locale != NULL) ? locale : kDefaultLocale);
- path.appendPath((vendor != NULL) ? vendor : kDefaultVendor);
- path.appendPath(fileName);
-
- /* check the appropriate Zip file */
- ZipFileRO* pZip;
- ZipEntryRO entry;
-
- pZip = getZipFileLocked(ap);
- if (pZip != NULL) {
- //printf("GOT zip, checking '%s'\n", (const char*) path);
- entry = pZip->findEntryByName(path.string());
- if (entry != NULL) {
- //printf("FOUND in Zip file for %s/%s-%s\n",
- // appName, locale, vendor);
- pAsset = openAssetFromZipLocked(pZip, entry, mode, path);
- }
- }
-
- if (pAsset != NULL) {
- /* create a "source" name, for debug/display */
- pAsset->setAssetSource(createZipSourceNameLocked(ZipSet::getPathName(ap.path.string()),
- String8(""), String8(fileName)));
- }
- }
-
- return pAsset;
-}
-
-/*
- * Create a "source name" for a file from a Zip archive.
- */
-String8 AssetManager::createZipSourceNameLocked(const String8& zipFileName,
- const String8& dirName, const String8& fileName)
-{
- String8 sourceName("zip:");
- sourceName.append(zipFileName);
- sourceName.append(":");
- if (dirName.length() > 0) {
- sourceName.appendPath(dirName);
- }
- sourceName.appendPath(fileName);
- return sourceName;
-}
-
-/*
- * Create a path to a loose asset (asset-base/app/locale/vendor).
- */
-String8 AssetManager::createPathNameLocked(const asset_path& ap, const char* locale,
- const char* vendor)
-{
- String8 path(ap.path);
- path.appendPath((locale != NULL) ? locale : kDefaultLocale);
- path.appendPath((vendor != NULL) ? vendor : kDefaultVendor);
- return path;
-}
-
-/*
- * Create a path to a loose asset (asset-base/app/rootDir).
- */
-String8 AssetManager::createPathNameLocked(const asset_path& ap, const char* rootDir)
-{
- String8 path(ap.path);
- if (rootDir != NULL) path.appendPath(rootDir);
- return path;
-}
-
-/*
- * Return a pointer to one of our open Zip archives. Returns NULL if no
- * matching Zip file exists.
- *
- * Right now we have 2 possible Zip files (1 each in app/"common").
- *
- * If caching is set to CACHE_OFF, to get the expected behavior we
- * need to reopen the Zip file on every request. That would be silly
- * and expensive, so instead we just check the file modification date.
- *
- * Pass in NULL values for "appName", "locale", and "vendor" if the
- * generics should be used.
- */
-ZipFileRO* AssetManager::getZipFileLocked(const asset_path& ap)
-{
- ALOGV("getZipFileLocked() in %p\n", this);
-
- return mZipSet.getZip(ap.path);
-}
-
-/*
- * Try to open an asset from a file on disk.
- *
- * If the file is compressed with gzip, we seek to the start of the
- * deflated data and pass that in (just like we would for a Zip archive).
- *
- * For uncompressed data, we may already have an mmap()ed version sitting
- * around. If so, we want to hand that to the Asset instead.
- *
- * This returns NULL if the file doesn't exist, couldn't be opened, or
- * claims to be a ".gz" but isn't.
- */
-Asset* AssetManager::openAssetFromFileLocked(const String8& pathName,
- AccessMode mode)
-{
- Asset* pAsset = NULL;
-
- if (strcasecmp(pathName.getPathExtension().string(), ".gz") == 0) {
- //printf("TRYING '%s'\n", (const char*) pathName);
- pAsset = Asset::createFromCompressedFile(pathName.string(), mode);
- } else {
- //printf("TRYING '%s'\n", (const char*) pathName);
- pAsset = Asset::createFromFile(pathName.string(), mode);
- }
-
- return pAsset;
-}
-
-/*
- * Given an entry in a Zip archive, create a new Asset object.
- *
- * If the entry is uncompressed, we may want to create or share a
- * slice of shared memory.
- */
-Asset* AssetManager::openAssetFromZipLocked(const ZipFileRO* pZipFile,
- const ZipEntryRO entry, AccessMode mode, const String8& entryName)
-{
- Asset* pAsset = NULL;
-
- // TODO: look for previously-created shared memory slice?
- int method;
- size_t uncompressedLen;
-
- //printf("USING Zip '%s'\n", pEntry->getFileName());
-
- //pZipFile->getEntryInfo(entry, &method, &uncompressedLen, &compressedLen,
- // &offset);
- if (!pZipFile->getEntryInfo(entry, &method, &uncompressedLen, NULL, NULL,
- NULL, NULL))
- {
- ALOGW("getEntryInfo failed\n");
- return NULL;
- }
-
- FileMap* dataMap = pZipFile->createEntryFileMap(entry);
- if (dataMap == NULL) {
- ALOGW("create map from entry failed\n");
- return NULL;
- }
-
- if (method == ZipFileRO::kCompressStored) {
- pAsset = Asset::createFromUncompressedMap(dataMap, mode);
- ALOGV("Opened uncompressed entry %s in zip %s mode %d: %p", entryName.string(),
- dataMap->getFileName(), mode, pAsset);
- } else {
- pAsset = Asset::createFromCompressedMap(dataMap, method,
- uncompressedLen, mode);
- ALOGV("Opened compressed entry %s in zip %s mode %d: %p", entryName.string(),
- dataMap->getFileName(), mode, pAsset);
- }
- if (pAsset == NULL) {
- /* unexpected */
- ALOGW("create from segment failed\n");
- }
-
- return pAsset;
-}
-
-
-
-/*
- * Open a directory in the asset namespace.
- *
- * An "asset directory" is simply the combination of all files in all
- * locations, with ".gz" stripped for loose files. With app, locale, and
- * vendor defined, we have 8 directories and 2 Zip archives to scan.
- *
- * Pass in "" for the root dir.
- */
-AssetDir* AssetManager::openDir(const char* dirName)
-{
- AutoMutex _l(mLock);
-
- AssetDir* pDir = NULL;
- SortedVector<AssetDir::FileInfo>* pMergedInfo = NULL;
-
- LOG_FATAL_IF(mAssetPaths.size() == 0, "No assets added to AssetManager");
- assert(dirName != NULL);
-
- //printf("+++ openDir(%s) in '%s'\n", dirName, (const char*) mAssetBase);
-
- if (mCacheMode != CACHE_OFF && !mCacheValid)
- loadFileNameCacheLocked();
-
- pDir = new AssetDir;
-
- /*
- * Scan the various directories, merging what we find into a single
- * vector. We want to scan them in reverse priority order so that
- * the ".EXCLUDE" processing works correctly. Also, if we decide we
- * want to remember where the file is coming from, we'll get the right
- * version.
- *
- * We start with Zip archives, then do loose files.
- */
- pMergedInfo = new SortedVector<AssetDir::FileInfo>;
-
- size_t i = mAssetPaths.size();
- while (i > 0) {
- i--;
- const asset_path& ap = mAssetPaths.itemAt(i);
- if (ap.type == kFileTypeRegular) {
- ALOGV("Adding directory %s from zip %s", dirName, ap.path.string());
- scanAndMergeZipLocked(pMergedInfo, ap, kAssetsRoot, dirName);
- } else {
- ALOGV("Adding directory %s from dir %s", dirName, ap.path.string());
- scanAndMergeDirLocked(pMergedInfo, ap, kAssetsRoot, dirName);
- }
- }
-
-#if 0
- printf("FILE LIST:\n");
- for (i = 0; i < (size_t) pMergedInfo->size(); i++) {
- printf(" %d: (%d) '%s'\n", i,
- pMergedInfo->itemAt(i).getFileType(),
- (const char*) pMergedInfo->itemAt(i).getFileName());
- }
-#endif
-
- pDir->setFileList(pMergedInfo);
- return pDir;
-}
-
-/*
- * Open a directory in the non-asset namespace.
- *
- * An "asset directory" is simply the combination of all files in all
- * locations, with ".gz" stripped for loose files. With app, locale, and
- * vendor defined, we have 8 directories and 2 Zip archives to scan.
- *
- * Pass in "" for the root dir.
- */
-AssetDir* AssetManager::openNonAssetDir(void* cookie, const char* dirName)
-{
- AutoMutex _l(mLock);
-
- AssetDir* pDir = NULL;
- SortedVector<AssetDir::FileInfo>* pMergedInfo = NULL;
-
- LOG_FATAL_IF(mAssetPaths.size() == 0, "No assets added to AssetManager");
- assert(dirName != NULL);
-
- //printf("+++ openDir(%s) in '%s'\n", dirName, (const char*) mAssetBase);
-
- if (mCacheMode != CACHE_OFF && !mCacheValid)
- loadFileNameCacheLocked();
-
- pDir = new AssetDir;
-
- pMergedInfo = new SortedVector<AssetDir::FileInfo>;
-
- const size_t which = ((size_t)cookie)-1;
-
- if (which < mAssetPaths.size()) {
- const asset_path& ap = mAssetPaths.itemAt(which);
- if (ap.type == kFileTypeRegular) {
- ALOGV("Adding directory %s from zip %s", dirName, ap.path.string());
- scanAndMergeZipLocked(pMergedInfo, ap, NULL, dirName);
- } else {
- ALOGV("Adding directory %s from dir %s", dirName, ap.path.string());
- scanAndMergeDirLocked(pMergedInfo, ap, NULL, dirName);
- }
- }
-
-#if 0
- printf("FILE LIST:\n");
- for (i = 0; i < (size_t) pMergedInfo->size(); i++) {
- printf(" %d: (%d) '%s'\n", i,
- pMergedInfo->itemAt(i).getFileType(),
- (const char*) pMergedInfo->itemAt(i).getFileName());
- }
-#endif
-
- pDir->setFileList(pMergedInfo);
- return pDir;
-}
-
-/*
- * Scan the contents of the specified directory and merge them into the
- * "pMergedInfo" vector, removing previous entries if we find "exclude"
- * directives.
- *
- * Returns "false" if we found nothing to contribute.
- */
-bool AssetManager::scanAndMergeDirLocked(SortedVector<AssetDir::FileInfo>* pMergedInfo,
- const asset_path& ap, const char* rootDir, const char* dirName)
-{
- SortedVector<AssetDir::FileInfo>* pContents;
- String8 path;
-
- assert(pMergedInfo != NULL);
-
- //printf("scanAndMergeDir: %s %s %s %s\n", appName, locale, vendor,dirName);
-
- if (mCacheValid) {
- int i, start, count;
-
- pContents = new SortedVector<AssetDir::FileInfo>;
-
- /*
- * Get the basic partial path and find it in the cache. That's
- * the start point for the search.
- */
- path = createPathNameLocked(ap, rootDir);
- if (dirName[0] != '\0')
- path.appendPath(dirName);
-
- start = mCache.indexOf(path);
- if (start == NAME_NOT_FOUND) {
- //printf("+++ not found in cache: dir '%s'\n", (const char*) path);
- delete pContents;
- return false;
- }
-
- /*
- * The match string looks like "common/default/default/foo/bar/".
- * The '/' on the end ensures that we don't match on the directory
- * itself or on ".../foo/barfy/".
- */
- path.append("/");
-
- count = mCache.size();
-
- /*
- * Pick out the stuff in the current dir by examining the pathname.
- * It needs to match the partial pathname prefix, and not have a '/'
- * (fssep) anywhere after the prefix.
- */
- for (i = start+1; i < count; i++) {
- if (mCache[i].getFileName().length() > path.length() &&
- strncmp(mCache[i].getFileName().string(), path.string(), path.length()) == 0)
- {
- const char* name = mCache[i].getFileName().string();
- // XXX THIS IS BROKEN! Looks like we need to store the full
- // path prefix separately from the file path.
- if (strchr(name + path.length(), '/') == NULL) {
- /* grab it, reducing path to just the filename component */
- AssetDir::FileInfo tmp = mCache[i];
- tmp.setFileName(tmp.getFileName().getPathLeaf());
- pContents->add(tmp);
- }
- } else {
- /* no longer in the dir or its subdirs */
- break;
- }
-
- }
- } else {
- path = createPathNameLocked(ap, rootDir);
- if (dirName[0] != '\0')
- path.appendPath(dirName);
- pContents = scanDirLocked(path);
- if (pContents == NULL)
- return false;
- }
-
- // if we wanted to do an incremental cache fill, we would do it here
-
- /*
- * Process "exclude" directives. If we find a filename that ends with
- * ".EXCLUDE", we look for a matching entry in the "merged" set, and
- * remove it if we find it. We also delete the "exclude" entry.
- */
- int i, count, exclExtLen;
-
- count = pContents->size();
- exclExtLen = strlen(kExcludeExtension);
- for (i = 0; i < count; i++) {
- const char* name;
- int nameLen;
-
- name = pContents->itemAt(i).getFileName().string();
- nameLen = strlen(name);
- if (nameLen > exclExtLen &&
- strcmp(name + (nameLen - exclExtLen), kExcludeExtension) == 0)
- {
- String8 match(name, nameLen - exclExtLen);
- int matchIdx;
-
- matchIdx = AssetDir::FileInfo::findEntry(pMergedInfo, match);
- if (matchIdx > 0) {
- ALOGV("Excluding '%s' [%s]\n",
- pMergedInfo->itemAt(matchIdx).getFileName().string(),
- pMergedInfo->itemAt(matchIdx).getSourceName().string());
- pMergedInfo->removeAt(matchIdx);
- } else {
- //printf("+++ no match on '%s'\n", (const char*) match);
- }
-
- ALOGD("HEY: size=%d removing %d\n", (int)pContents->size(), i);
- pContents->removeAt(i);
- i--; // adjust "for" loop
- count--; // and loop limit
- }
- }
-
- mergeInfoLocked(pMergedInfo, pContents);
-
- delete pContents;
-
- return true;
-}
-
-/*
- * Scan the contents of the specified directory, and stuff what we find
- * into a newly-allocated vector.
- *
- * Files ending in ".gz" will have their extensions removed.
- *
- * We should probably think about skipping files with "illegal" names,
- * e.g. illegal characters (/\:) or excessive length.
- *
- * Returns NULL if the specified directory doesn't exist.
- */
-SortedVector<AssetDir::FileInfo>* AssetManager::scanDirLocked(const String8& path)
-{
- SortedVector<AssetDir::FileInfo>* pContents = NULL;
- DIR* dir;
- struct dirent* entry;
- FileType fileType;
-
- ALOGV("Scanning dir '%s'\n", path.string());
-
- dir = opendir(path.string());
- if (dir == NULL)
- return NULL;
-
- pContents = new SortedVector<AssetDir::FileInfo>;
-
- while (1) {
- entry = readdir(dir);
- if (entry == NULL)
- break;
-
- if (strcmp(entry->d_name, ".") == 0 ||
- strcmp(entry->d_name, "..") == 0)
- continue;
-
-#ifdef _DIRENT_HAVE_D_TYPE
- if (entry->d_type == DT_REG)
- fileType = kFileTypeRegular;
- else if (entry->d_type == DT_DIR)
- fileType = kFileTypeDirectory;
- else
- fileType = kFileTypeUnknown;
-#else
- // stat the file
- fileType = ::getFileType(path.appendPathCopy(entry->d_name).string());
-#endif
-
- if (fileType != kFileTypeRegular && fileType != kFileTypeDirectory)
- continue;
-
- AssetDir::FileInfo info;
- info.set(String8(entry->d_name), fileType);
- if (strcasecmp(info.getFileName().getPathExtension().string(), ".gz") == 0)
- info.setFileName(info.getFileName().getBasePath());
- info.setSourceName(path.appendPathCopy(info.getFileName()));
- pContents->add(info);
- }
-
- closedir(dir);
- return pContents;
-}
-
-/*
- * Scan the contents out of the specified Zip archive, and merge what we
- * find into "pMergedInfo". If the Zip archive in question doesn't exist,
- * we return immediately.
- *
- * Returns "false" if we found nothing to contribute.
- */
-bool AssetManager::scanAndMergeZipLocked(SortedVector<AssetDir::FileInfo>* pMergedInfo,
- const asset_path& ap, const char* rootDir, const char* baseDirName)
-{
- ZipFileRO* pZip;
- Vector<String8> dirs;
- AssetDir::FileInfo info;
- SortedVector<AssetDir::FileInfo> contents;
- String8 sourceName, zipName, dirName;
-
- pZip = mZipSet.getZip(ap.path);
- if (pZip == NULL) {
- ALOGW("Failure opening zip %s\n", ap.path.string());
- return false;
- }
-
- zipName = ZipSet::getPathName(ap.path.string());
-
- /* convert "sounds" to "rootDir/sounds" */
- if (rootDir != NULL) dirName = rootDir;
- dirName.appendPath(baseDirName);
-
- /*
- * Scan through the list of files, looking for a match. The files in
- * the Zip table of contents are not in sorted order, so we have to
- * process the entire list. We're looking for a string that begins
- * with the characters in "dirName", is followed by a '/', and has no
- * subsequent '/' in the stuff that follows.
- *
- * What makes this especially fun is that directories are not stored
- * explicitly in Zip archives, so we have to infer them from context.
- * When we see "sounds/foo.wav" we have to leave a note to ourselves
- * to insert a directory called "sounds" into the list. We store
- * these in temporary vector so that we only return each one once.
- *
- * Name comparisons are case-sensitive to match UNIX filesystem
- * semantics.
- */
- int dirNameLen = dirName.length();
- for (int i = 0; i < pZip->getNumEntries(); i++) {
- ZipEntryRO entry;
- char nameBuf[256];
-
- entry = pZip->findEntryByIndex(i);
- if (pZip->getEntryFileName(entry, nameBuf, sizeof(nameBuf)) != 0) {
- // TODO: fix this if we expect to have long names
- ALOGE("ARGH: name too long?\n");
- continue;
- }
- //printf("Comparing %s in %s?\n", nameBuf, dirName.string());
- if (dirNameLen == 0 ||
- (strncmp(nameBuf, dirName.string(), dirNameLen) == 0 &&
- nameBuf[dirNameLen] == '/'))
- {
- const char* cp;
- const char* nextSlash;
-
- cp = nameBuf + dirNameLen;
- if (dirNameLen != 0)
- cp++; // advance past the '/'
-
- nextSlash = strchr(cp, '/');
-//xxx this may break if there are bare directory entries
- if (nextSlash == NULL) {
- /* this is a file in the requested directory */
-
- info.set(String8(nameBuf).getPathLeaf(), kFileTypeRegular);
-
- info.setSourceName(
- createZipSourceNameLocked(zipName, dirName, info.getFileName()));
-
- contents.add(info);
- //printf("FOUND: file '%s'\n", info.getFileName().string());
- } else {
- /* this is a subdir; add it if we don't already have it*/
- String8 subdirName(cp, nextSlash - cp);
- size_t j;
- size_t N = dirs.size();
-
- for (j = 0; j < N; j++) {
- if (subdirName == dirs[j]) {
- break;
- }
- }
- if (j == N) {
- dirs.add(subdirName);
- }
-
- //printf("FOUND: dir '%s'\n", subdirName.string());
- }
- }
- }
-
- /*
- * Add the set of unique directories.
- */
- for (int i = 0; i < (int) dirs.size(); i++) {
- info.set(dirs[i], kFileTypeDirectory);
- info.setSourceName(
- createZipSourceNameLocked(zipName, dirName, info.getFileName()));
- contents.add(info);
- }
-
- mergeInfoLocked(pMergedInfo, &contents);
-
- return true;
-}
-
-
-/*
- * Merge two vectors of FileInfo.
- *
- * The merged contents will be stuffed into *pMergedInfo.
- *
- * If an entry for a file exists in both "pMergedInfo" and "pContents",
- * we use the newer "pContents" entry.
- */
-void AssetManager::mergeInfoLocked(SortedVector<AssetDir::FileInfo>* pMergedInfo,
- const SortedVector<AssetDir::FileInfo>* pContents)
-{
- /*
- * Merge what we found in this directory with what we found in
- * other places.
- *
- * Two basic approaches:
- * (1) Create a new array that holds the unique values of the two
- * arrays.
- * (2) Take the elements from pContents and shove them into pMergedInfo.
- *
- * Because these are vectors of complex objects, moving elements around
- * inside the vector requires constructing new objects and allocating
- * storage for members. With approach #1, we're always adding to the
- * end, whereas with #2 we could be inserting multiple elements at the
- * front of the vector. Approach #1 requires a full copy of the
- * contents of pMergedInfo, but approach #2 requires the same copy for
- * every insertion at the front of pMergedInfo.
- *
- * (We should probably use a SortedVector interface that allows us to
- * just stuff items in, trusting us to maintain the sort order.)
- */
- SortedVector<AssetDir::FileInfo>* pNewSorted;
- int mergeMax, contMax;
- int mergeIdx, contIdx;
-
- pNewSorted = new SortedVector<AssetDir::FileInfo>;
- mergeMax = pMergedInfo->size();
- contMax = pContents->size();
- mergeIdx = contIdx = 0;
-
- while (mergeIdx < mergeMax || contIdx < contMax) {
- if (mergeIdx == mergeMax) {
- /* hit end of "merge" list, copy rest of "contents" */
- pNewSorted->add(pContents->itemAt(contIdx));
- contIdx++;
- } else if (contIdx == contMax) {
- /* hit end of "cont" list, copy rest of "merge" */
- pNewSorted->add(pMergedInfo->itemAt(mergeIdx));
- mergeIdx++;
- } else if (pMergedInfo->itemAt(mergeIdx) == pContents->itemAt(contIdx))
- {
- /* items are identical, add newer and advance both indices */
- pNewSorted->add(pContents->itemAt(contIdx));
- mergeIdx++;
- contIdx++;
- } else if (pMergedInfo->itemAt(mergeIdx) < pContents->itemAt(contIdx))
- {
- /* "merge" is lower, add that one */
- pNewSorted->add(pMergedInfo->itemAt(mergeIdx));
- mergeIdx++;
- } else {
- /* "cont" is lower, add that one */
- assert(pContents->itemAt(contIdx) < pMergedInfo->itemAt(mergeIdx));
- pNewSorted->add(pContents->itemAt(contIdx));
- contIdx++;
- }
- }
-
- /*
- * Overwrite the "merged" list with the new stuff.
- */
- *pMergedInfo = *pNewSorted;
- delete pNewSorted;
-
-#if 0 // for Vector, rather than SortedVector
- int i, j;
- for (i = pContents->size() -1; i >= 0; i--) {
- bool add = true;
-
- for (j = pMergedInfo->size() -1; j >= 0; j--) {
- /* case-sensitive comparisons, to behave like UNIX fs */
- if (strcmp(pContents->itemAt(i).mFileName,
- pMergedInfo->itemAt(j).mFileName) == 0)
- {
- /* match, don't add this entry */
- add = false;
- break;
- }
- }
-
- if (add)
- pMergedInfo->add(pContents->itemAt(i));
- }
-#endif
-}
-
-
-/*
- * Load all files into the file name cache. We want to do this across
- * all combinations of { appname, locale, vendor }, performing a recursive
- * directory traversal.
- *
- * This is not the most efficient data structure. Also, gathering the
- * information as we needed it (file-by-file or directory-by-directory)
- * would be faster. However, on the actual device, 99% of the files will
- * live in Zip archives, so this list will be very small. The trouble
- * is that we have to check the "loose" files first, so it's important
- * that we don't beat the filesystem silly looking for files that aren't
- * there.
- *
- * Note on thread safety: this is the only function that causes updates
- * to mCache, and anybody who tries to use it will call here if !mCacheValid,
- * so we need to employ a mutex here.
- */
-void AssetManager::loadFileNameCacheLocked(void)
-{
- assert(!mCacheValid);
- assert(mCache.size() == 0);
-
-#ifdef DO_TIMINGS // need to link against -lrt for this now
- DurationTimer timer;
- timer.start();
-#endif
-
- fncScanLocked(&mCache, "");
-
-#ifdef DO_TIMINGS
- timer.stop();
- ALOGD("Cache scan took %.3fms\n",
- timer.durationUsecs() / 1000.0);
-#endif
-
-#if 0
- int i;
- printf("CACHED FILE LIST (%d entries):\n", mCache.size());
- for (i = 0; i < (int) mCache.size(); i++) {
- printf(" %d: (%d) '%s'\n", i,
- mCache.itemAt(i).getFileType(),
- (const char*) mCache.itemAt(i).getFileName());
- }
-#endif
-
- mCacheValid = true;
-}
-
-/*
- * Scan up to 8 versions of the specified directory.
- */
-void AssetManager::fncScanLocked(SortedVector<AssetDir::FileInfo>* pMergedInfo,
- const char* dirName)
-{
- size_t i = mAssetPaths.size();
- while (i > 0) {
- i--;
- const asset_path& ap = mAssetPaths.itemAt(i);
- fncScanAndMergeDirLocked(pMergedInfo, ap, NULL, NULL, dirName);
- if (mLocale != NULL)
- fncScanAndMergeDirLocked(pMergedInfo, ap, mLocale, NULL, dirName);
- if (mVendor != NULL)
- fncScanAndMergeDirLocked(pMergedInfo, ap, NULL, mVendor, dirName);
- if (mLocale != NULL && mVendor != NULL)
- fncScanAndMergeDirLocked(pMergedInfo, ap, mLocale, mVendor, dirName);
- }
-}
-
-/*
- * Recursively scan this directory and all subdirs.
- *
- * This is similar to scanAndMergeDir, but we don't remove the .EXCLUDE
- * files, and we prepend the extended partial path to the filenames.
- */
-bool AssetManager::fncScanAndMergeDirLocked(
- SortedVector<AssetDir::FileInfo>* pMergedInfo,
- const asset_path& ap, const char* locale, const char* vendor,
- const char* dirName)
-{
- SortedVector<AssetDir::FileInfo>* pContents;
- String8 partialPath;
- String8 fullPath;
-
- // XXX This is broken -- the filename cache needs to hold the base
- // asset path separately from its filename.
-
- partialPath = createPathNameLocked(ap, locale, vendor);
- if (dirName[0] != '\0') {
- partialPath.appendPath(dirName);
- }
-
- fullPath = partialPath;
- pContents = scanDirLocked(fullPath);
- if (pContents == NULL) {
- return false; // directory did not exist
- }
-
- /*
- * Scan all subdirectories of the current dir, merging what we find
- * into "pMergedInfo".
- */
- for (int i = 0; i < (int) pContents->size(); i++) {
- if (pContents->itemAt(i).getFileType() == kFileTypeDirectory) {
- String8 subdir(dirName);
- subdir.appendPath(pContents->itemAt(i).getFileName());
-
- fncScanAndMergeDirLocked(pMergedInfo, ap, locale, vendor, subdir.string());
- }
- }
-
- /*
- * To be consistent, we want entries for the root directory. If
- * we're the root, add one now.
- */
- if (dirName[0] == '\0') {
- AssetDir::FileInfo tmpInfo;
-
- tmpInfo.set(String8(""), kFileTypeDirectory);
- tmpInfo.setSourceName(createPathNameLocked(ap, locale, vendor));
- pContents->add(tmpInfo);
- }
-
- /*
- * We want to prepend the extended partial path to every entry in
- * "pContents". It's the same value for each entry, so this will
- * not change the sorting order of the vector contents.
- */
- for (int i = 0; i < (int) pContents->size(); i++) {
- const AssetDir::FileInfo& info = pContents->itemAt(i);
- pContents->editItemAt(i).setFileName(partialPath.appendPathCopy(info.getFileName()));
- }
-
- mergeInfoLocked(pMergedInfo, pContents);
- return true;
-}
-
-/*
- * Trash the cache.
- */
-void AssetManager::purgeFileNameCacheLocked(void)
-{
- mCacheValid = false;
- mCache.clear();
-}
-
-/*
- * ===========================================================================
- * AssetManager::SharedZip
- * ===========================================================================
- */
-
-
-Mutex AssetManager::SharedZip::gLock;
-DefaultKeyedVector<String8, wp<AssetManager::SharedZip> > AssetManager::SharedZip::gOpen;
-
-AssetManager::SharedZip::SharedZip(const String8& path, time_t modWhen)
- : mPath(path), mZipFile(NULL), mModWhen(modWhen),
- mResourceTableAsset(NULL), mResourceTable(NULL)
-{
- //ALOGI("Creating SharedZip %p %s\n", this, (const char*)mPath);
- mZipFile = new ZipFileRO;
- ALOGV("+++ opening zip '%s'\n", mPath.string());
- if (mZipFile->open(mPath.string()) != NO_ERROR) {
- ALOGD("failed to open Zip archive '%s'\n", mPath.string());
- delete mZipFile;
- mZipFile = NULL;
- }
-}
-
-sp<AssetManager::SharedZip> AssetManager::SharedZip::get(const String8& path)
-{
- AutoMutex _l(gLock);
- time_t modWhen = getFileModDate(path);
- sp<SharedZip> zip = gOpen.valueFor(path).promote();
- if (zip != NULL && zip->mModWhen == modWhen) {
- return zip;
- }
- zip = new SharedZip(path, modWhen);
- gOpen.add(path, zip);
- return zip;
-
-}
-
-ZipFileRO* AssetManager::SharedZip::getZip()
-{
- return mZipFile;
-}
-
-Asset* AssetManager::SharedZip::getResourceTableAsset()
-{
- ALOGV("Getting from SharedZip %p resource asset %p\n", this, mResourceTableAsset);
- return mResourceTableAsset;
-}
-
-Asset* AssetManager::SharedZip::setResourceTableAsset(Asset* asset)
-{
- {
- AutoMutex _l(gLock);
- if (mResourceTableAsset == NULL) {
- mResourceTableAsset = asset;
- // This is not thread safe the first time it is called, so
- // do it here with the global lock held.
- asset->getBuffer(true);
- return asset;
- }
- }
- delete asset;
- return mResourceTableAsset;
-}
-
-ResTable* AssetManager::SharedZip::getResourceTable()
-{
- ALOGV("Getting from SharedZip %p resource table %p\n", this, mResourceTable);
- return mResourceTable;
-}
-
-ResTable* AssetManager::SharedZip::setResourceTable(ResTable* res)
-{
- {
- AutoMutex _l(gLock);
- if (mResourceTable == NULL) {
- mResourceTable = res;
- return res;
- }
- }
- delete res;
- return mResourceTable;
-}
-
-bool AssetManager::SharedZip::isUpToDate()
-{
- time_t modWhen = getFileModDate(mPath.string());
- return mModWhen == modWhen;
-}
-
-AssetManager::SharedZip::~SharedZip()
-{
- //ALOGI("Destroying SharedZip %p %s\n", this, (const char*)mPath);
- if (mResourceTable != NULL) {
- delete mResourceTable;
- }
- if (mResourceTableAsset != NULL) {
- delete mResourceTableAsset;
- }
- if (mZipFile != NULL) {
- delete mZipFile;
- ALOGV("Closed '%s'\n", mPath.string());
- }
-}
-
-/*
- * ===========================================================================
- * AssetManager::ZipSet
- * ===========================================================================
- */
-
-/*
- * Constructor.
- */
-AssetManager::ZipSet::ZipSet(void)
-{
-}
-
-/*
- * Destructor. Close any open archives.
- */
-AssetManager::ZipSet::~ZipSet(void)
-{
- size_t N = mZipFile.size();
- for (size_t i = 0; i < N; i++)
- closeZip(i);
-}
-
-/*
- * Close a Zip file and reset the entry.
- */
-void AssetManager::ZipSet::closeZip(int idx)
-{
- mZipFile.editItemAt(idx) = NULL;
-}
-
-
-/*
- * Retrieve the appropriate Zip file from the set.
- */
-ZipFileRO* AssetManager::ZipSet::getZip(const String8& path)
-{
- int idx = getIndex(path);
- sp<SharedZip> zip = mZipFile[idx];
- if (zip == NULL) {
- zip = SharedZip::get(path);
- mZipFile.editItemAt(idx) = zip;
- }
- return zip->getZip();
-}
-
-Asset* AssetManager::ZipSet::getZipResourceTableAsset(const String8& path)
-{
- int idx = getIndex(path);
- sp<SharedZip> zip = mZipFile[idx];
- if (zip == NULL) {
- zip = SharedZip::get(path);
- mZipFile.editItemAt(idx) = zip;
- }
- return zip->getResourceTableAsset();
-}
-
-Asset* AssetManager::ZipSet::setZipResourceTableAsset(const String8& path,
- Asset* asset)
-{
- int idx = getIndex(path);
- sp<SharedZip> zip = mZipFile[idx];
- // doesn't make sense to call before previously accessing.
- return zip->setResourceTableAsset(asset);
-}
-
-ResTable* AssetManager::ZipSet::getZipResourceTable(const String8& path)
-{
- int idx = getIndex(path);
- sp<SharedZip> zip = mZipFile[idx];
- if (zip == NULL) {
- zip = SharedZip::get(path);
- mZipFile.editItemAt(idx) = zip;
- }
- return zip->getResourceTable();
-}
-
-ResTable* AssetManager::ZipSet::setZipResourceTable(const String8& path,
- ResTable* res)
-{
- int idx = getIndex(path);
- sp<SharedZip> zip = mZipFile[idx];
- // doesn't make sense to call before previously accessing.
- return zip->setResourceTable(res);
-}
-
-/*
- * Generate the partial pathname for the specified archive. The caller
- * gets to prepend the asset root directory.
- *
- * Returns something like "common/en-US-noogle.jar".
- */
-/*static*/ String8 AssetManager::ZipSet::getPathName(const char* zipPath)
-{
- return String8(zipPath);
-}
-
-bool AssetManager::ZipSet::isUpToDate()
-{
- const size_t N = mZipFile.size();
- for (size_t i=0; i<N; i++) {
- if (mZipFile[i] != NULL && !mZipFile[i]->isUpToDate()) {
- return false;
- }
- }
- return true;
-}
-
-/*
- * Compute the zip file's index.
- *
- * "appName", "locale", and "vendor" should be set to NULL to indicate the
- * default directory.
- */
-int AssetManager::ZipSet::getIndex(const String8& zip) const
-{
- const size_t N = mZipPath.size();
- for (size_t i=0; i<N; i++) {
- if (mZipPath[i] == zip) {
- return i;
- }
- }
-
- mZipPath.add(zip);
- mZipFile.add(NULL);
-
- return mZipPath.size()-1;
-}
diff --git a/libs/androidfw/BackupData.cpp b/libs/androidfw/BackupData.cpp
deleted file mode 100644
index 4e3b522..0000000
--- a/libs/androidfw/BackupData.cpp
+++ /dev/null
@@ -1,382 +0,0 @@
-/*
- * 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.
- */
-
-#define LOG_TAG "backup_data"
-
-#include <androidfw/BackupHelpers.h>
-#include <utils/ByteOrder.h>
-
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-
-#include <cutils/log.h>
-
-namespace android {
-
-static const bool DEBUG = false;
-
-/*
- * File Format (v1):
- *
- * All ints are stored little-endian.
- *
- * - An app_header_v1 struct.
- * - The name of the package, utf-8, null terminated, padded to 4-byte boundary.
- * - A sequence of zero or more key/value paires (entities), each with
- * - A entity_header_v1 struct
- * - The key, utf-8, null terminated, padded to 4-byte boundary.
- * - The value, padded to 4 byte boundary
- */
-
-const static int ROUND_UP[4] = { 0, 3, 2, 1 };
-
-static inline size_t
-round_up(size_t n)
-{
- return n + ROUND_UP[n % 4];
-}
-
-static inline size_t
-padding_extra(size_t n)
-{
- return ROUND_UP[n % 4];
-}
-
-BackupDataWriter::BackupDataWriter(int fd)
- :m_fd(fd),
- m_status(NO_ERROR),
- m_pos(0),
- m_entityCount(0)
-{
-}
-
-BackupDataWriter::~BackupDataWriter()
-{
-}
-
-// Pad out anything they've previously written to the next 4 byte boundary.
-status_t
-BackupDataWriter::write_padding_for(int n)
-{
- ssize_t amt;
- ssize_t paddingSize;
-
- paddingSize = padding_extra(n);
- if (paddingSize > 0) {
- uint32_t padding = 0xbcbcbcbc;
- if (DEBUG) ALOGI("writing %d padding bytes for %d", paddingSize, n);
- amt = write(m_fd, &padding, paddingSize);
- if (amt != paddingSize) {
- m_status = errno;
- return m_status;
- }
- m_pos += amt;
- }
- return NO_ERROR;
-}
-
-status_t
-BackupDataWriter::WriteEntityHeader(const String8& key, size_t dataSize)
-{
- if (m_status != NO_ERROR) {
- return m_status;
- }
-
- ssize_t amt;
-
- amt = write_padding_for(m_pos);
- if (amt != 0) {
- return amt;
- }
-
- String8 k;
- if (m_keyPrefix.length() > 0) {
- k = m_keyPrefix;
- k += ":";
- k += key;
- } else {
- k = key;
- }
- if (DEBUG) {
- ALOGD("Writing header: prefix='%s' key='%s' dataSize=%d", m_keyPrefix.string(),
- key.string(), dataSize);
- }
-
- entity_header_v1 header;
- ssize_t keyLen;
-
- keyLen = k.length();
-
- header.type = tolel(BACKUP_HEADER_ENTITY_V1);
- header.keyLen = tolel(keyLen);
- header.dataSize = tolel(dataSize);
-
- if (DEBUG) ALOGI("writing entity header, %d bytes", sizeof(entity_header_v1));
- amt = write(m_fd, &header, sizeof(entity_header_v1));
- if (amt != sizeof(entity_header_v1)) {
- m_status = errno;
- return m_status;
- }
- m_pos += amt;
-
- if (DEBUG) ALOGI("writing entity header key, %d bytes", keyLen+1);
- amt = write(m_fd, k.string(), keyLen+1);
- if (amt != keyLen+1) {
- m_status = errno;
- return m_status;
- }
- m_pos += amt;
-
- amt = write_padding_for(keyLen+1);
-
- m_entityCount++;
-
- return amt;
-}
-
-status_t
-BackupDataWriter::WriteEntityData(const void* data, size_t size)
-{
- if (DEBUG) ALOGD("Writing data: size=%lu", (unsigned long) size);
-
- if (m_status != NO_ERROR) {
- if (DEBUG) {
- ALOGD("Not writing data - stream in error state %d (%s)", m_status, strerror(m_status));
- }
- return m_status;
- }
-
- // We don't write padding here, because they're allowed to call this several
- // times with smaller buffers. We write it at the end of WriteEntityHeader
- // instead.
- ssize_t amt = write(m_fd, data, size);
- if (amt != (ssize_t)size) {
- m_status = errno;
- if (DEBUG) ALOGD("write returned error %d (%s)", m_status, strerror(m_status));
- return m_status;
- }
- m_pos += amt;
- return NO_ERROR;
-}
-
-void
-BackupDataWriter::SetKeyPrefix(const String8& keyPrefix)
-{
- m_keyPrefix = keyPrefix;
-}
-
-
-BackupDataReader::BackupDataReader(int fd)
- :m_fd(fd),
- m_done(false),
- m_status(NO_ERROR),
- m_pos(0),
- m_entityCount(0)
-{
- memset(&m_header, 0, sizeof(m_header));
-}
-
-BackupDataReader::~BackupDataReader()
-{
-}
-
-status_t
-BackupDataReader::Status()
-{
- return m_status;
-}
-
-#define CHECK_SIZE(actual, expected) \
- do { \
- if ((actual) != (expected)) { \
- if ((actual) == 0) { \
- m_status = EIO; \
- m_done = true; \
- } else { \
- m_status = errno; \
- ALOGD("CHECK_SIZE(a=%ld e=%ld) failed at line %d m_status='%s'", \
- long(actual), long(expected), __LINE__, strerror(m_status)); \
- } \
- return m_status; \
- } \
- } while(0)
-#define SKIP_PADDING() \
- do { \
- status_t err = skip_padding(); \
- if (err != NO_ERROR) { \
- ALOGD("SKIP_PADDING FAILED at line %d", __LINE__); \
- m_status = err; \
- return err; \
- } \
- } while(0)
-
-status_t
-BackupDataReader::ReadNextHeader(bool* done, int* type)
-{
- *done = m_done;
- if (m_status != NO_ERROR) {
- return m_status;
- }
-
- int amt;
-
- amt = skip_padding();
- if (amt == EIO) {
- *done = m_done = true;
- return NO_ERROR;
- }
- else if (amt != NO_ERROR) {
- return amt;
- }
- amt = read(m_fd, &m_header, sizeof(m_header));
- *done = m_done = (amt == 0);
- if (*done) {
- return NO_ERROR;
- }
- CHECK_SIZE(amt, sizeof(m_header));
- m_pos += sizeof(m_header);
- if (type) {
- *type = m_header.type;
- }
-
- // validate and fix up the fields.
- m_header.type = fromlel(m_header.type);
- switch (m_header.type)
- {
- case BACKUP_HEADER_ENTITY_V1:
- {
- m_header.entity.keyLen = fromlel(m_header.entity.keyLen);
- if (m_header.entity.keyLen <= 0) {
- ALOGD("Entity header at %d has keyLen<=0: 0x%08x\n", (int)m_pos,
- (int)m_header.entity.keyLen);
- m_status = EINVAL;
- }
- m_header.entity.dataSize = fromlel(m_header.entity.dataSize);
- m_entityCount++;
-
- // read the rest of the header (filename)
- size_t size = m_header.entity.keyLen;
- char* buf = m_key.lockBuffer(size);
- if (buf == NULL) {
- m_status = ENOMEM;
- return m_status;
- }
- int amt = read(m_fd, buf, size+1);
- CHECK_SIZE(amt, (int)size+1);
- m_key.unlockBuffer(size);
- m_pos += size+1;
- SKIP_PADDING();
- m_dataEndPos = m_pos + m_header.entity.dataSize;
-
- break;
- }
- default:
- ALOGD("Chunk header at %d has invalid type: 0x%08x",
- (int)(m_pos - sizeof(m_header)), (int)m_header.type);
- m_status = EINVAL;
- }
-
- return m_status;
-}
-
-bool
-BackupDataReader::HasEntities()
-{
- return m_status == NO_ERROR && m_header.type == BACKUP_HEADER_ENTITY_V1;
-}
-
-status_t
-BackupDataReader::ReadEntityHeader(String8* key, size_t* dataSize)
-{
- if (m_status != NO_ERROR) {
- return m_status;
- }
- if (m_header.type != BACKUP_HEADER_ENTITY_V1) {
- return EINVAL;
- }
- *key = m_key;
- *dataSize = m_header.entity.dataSize;
- return NO_ERROR;
-}
-
-status_t
-BackupDataReader::SkipEntityData()
-{
- if (m_status != NO_ERROR) {
- return m_status;
- }
- if (m_header.type != BACKUP_HEADER_ENTITY_V1) {
- return EINVAL;
- }
- if (m_header.entity.dataSize > 0) {
- int pos = lseek(m_fd, m_dataEndPos, SEEK_SET);
- if (pos == -1) {
- return errno;
- }
- m_pos = pos;
- }
- SKIP_PADDING();
- return NO_ERROR;
-}
-
-ssize_t
-BackupDataReader::ReadEntityData(void* data, size_t size)
-{
- if (m_status != NO_ERROR) {
- return -1;
- }
- int remaining = m_dataEndPos - m_pos;
- //ALOGD("ReadEntityData size=%d m_pos=0x%x m_dataEndPos=0x%x remaining=%d\n",
- // size, m_pos, m_dataEndPos, remaining);
- if (remaining <= 0) {
- return 0;
- }
- if (((int)size) > remaining) {
- size = remaining;
- }
- //ALOGD(" reading %d bytes", size);
- int amt = read(m_fd, data, size);
- if (amt < 0) {
- m_status = errno;
- return -1;
- }
- if (amt == 0) {
- m_status = EIO;
- m_done = true;
- }
- m_pos += amt;
- return amt;
-}
-
-status_t
-BackupDataReader::skip_padding()
-{
- ssize_t amt;
- ssize_t paddingSize;
-
- paddingSize = padding_extra(m_pos);
- if (paddingSize > 0) {
- uint32_t padding;
- amt = read(m_fd, &padding, paddingSize);
- CHECK_SIZE(amt, paddingSize);
- m_pos += amt;
- }
- return NO_ERROR;
-}
-
-
-} // namespace android
diff --git a/libs/androidfw/BackupHelpers.cpp b/libs/androidfw/BackupHelpers.cpp
deleted file mode 100644
index b8d3f48..0000000
--- a/libs/androidfw/BackupHelpers.cpp
+++ /dev/null
@@ -1,1591 +0,0 @@
-/*
- * 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.
- */
-
-#define LOG_TAG "file_backup_helper"
-
-#include <androidfw/BackupHelpers.h>
-
-#include <utils/KeyedVector.h>
-#include <utils/ByteOrder.h>
-#include <utils/String8.h>
-
-#include <errno.h>
-#include <sys/types.h>
-#include <sys/uio.h>
-#include <sys/stat.h>
-#include <sys/time.h> // for utimes
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <utime.h>
-#include <fcntl.h>
-#include <zlib.h>
-
-#include <cutils/log.h>
-
-namespace android {
-
-#define MAGIC0 0x70616e53 // Snap
-#define MAGIC1 0x656c6946 // File
-
-/*
- * File entity data format (v1):
- *
- * - 4-byte version number of the metadata, little endian (0x00000001 for v1)
- * - 12 bytes of metadata
- * - the file data itself
- *
- * i.e. a 16-byte metadata header followed by the raw file data. If the
- * restore code does not recognize the metadata version, it can still
- * interpret the file data itself correctly.
- *
- * file_metadata_v1:
- *
- * - 4 byte version number === 0x00000001 (little endian)
- * - 4-byte access mode (little-endian)
- * - undefined (8 bytes)
- */
-
-struct file_metadata_v1 {
- int version;
- int mode;
- int undefined_1;
- int undefined_2;
-};
-
-const static int CURRENT_METADATA_VERSION = 1;
-
-#if 1
-#define LOGP(f, x...)
-#else
-#if TEST_BACKUP_HELPERS
-#define LOGP(f, x...) printf(f "\n", x)
-#else
-#define LOGP(x...) ALOGD(x)
-#endif
-#endif
-
-const static int ROUND_UP[4] = { 0, 3, 2, 1 };
-
-static inline int
-round_up(int n)
-{
- return n + ROUND_UP[n % 4];
-}
-
-static int
-read_snapshot_file(int fd, KeyedVector<String8,FileState>* snapshot)
-{
- int bytesRead = 0;
- int amt;
- SnapshotHeader header;
-
- amt = read(fd, &header, sizeof(header));
- if (amt != sizeof(header)) {
- return errno;
- }
- bytesRead += amt;
-
- if (header.magic0 != MAGIC0 || header.magic1 != MAGIC1) {
- ALOGW("read_snapshot_file header.magic0=0x%08x magic1=0x%08x", header.magic0, header.magic1);
- return 1;
- }
-
- for (int i=0; i<header.fileCount; i++) {
- FileState file;
- char filenameBuf[128];
-
- amt = read(fd, &file, sizeof(FileState));
- if (amt != sizeof(FileState)) {
- ALOGW("read_snapshot_file FileState truncated/error with read at %d bytes\n", bytesRead);
- return 1;
- }
- bytesRead += amt;
-
- // filename is not NULL terminated, but it is padded
- int nameBufSize = round_up(file.nameLen);
- char* filename = nameBufSize <= (int)sizeof(filenameBuf)
- ? filenameBuf
- : (char*)malloc(nameBufSize);
- amt = read(fd, filename, nameBufSize);
- if (amt == nameBufSize) {
- snapshot->add(String8(filename, file.nameLen), file);
- }
- bytesRead += amt;
- if (filename != filenameBuf) {
- free(filename);
- }
- if (amt != nameBufSize) {
- ALOGW("read_snapshot_file filename truncated/error with read at %d bytes\n", bytesRead);
- return 1;
- }
- }
-
- if (header.totalSize != bytesRead) {
- ALOGW("read_snapshot_file length mismatch: header.totalSize=%d bytesRead=%d\n",
- header.totalSize, bytesRead);
- return 1;
- }
-
- return 0;
-}
-
-static int
-write_snapshot_file(int fd, const KeyedVector<String8,FileRec>& snapshot)
-{
- int fileCount = 0;
- int bytesWritten = sizeof(SnapshotHeader);
- // preflight size
- const int N = snapshot.size();
- for (int i=0; i<N; i++) {
- const FileRec& g = snapshot.valueAt(i);
- if (!g.deleted) {
- const String8& name = snapshot.keyAt(i);
- bytesWritten += sizeof(FileState) + round_up(name.length());
- fileCount++;
- }
- }
-
- LOGP("write_snapshot_file fd=%d\n", fd);
-
- int amt;
- SnapshotHeader header = { MAGIC0, fileCount, MAGIC1, bytesWritten };
-
- amt = write(fd, &header, sizeof(header));
- if (amt != sizeof(header)) {
- ALOGW("write_snapshot_file error writing header %s", strerror(errno));
- return errno;
- }
-
- for (int i=0; i<N; i++) {
- FileRec r = snapshot.valueAt(i);
- if (!r.deleted) {
- const String8& name = snapshot.keyAt(i);
- int nameLen = r.s.nameLen = name.length();
-
- amt = write(fd, &r.s, sizeof(FileState));
- if (amt != sizeof(FileState)) {
- ALOGW("write_snapshot_file error writing header %s", strerror(errno));
- return 1;
- }
-
- // filename is not NULL terminated, but it is padded
- amt = write(fd, name.string(), nameLen);
- if (amt != nameLen) {
- ALOGW("write_snapshot_file error writing filename %s", strerror(errno));
- return 1;
- }
- int paddingLen = ROUND_UP[nameLen % 4];
- if (paddingLen != 0) {
- int padding = 0xabababab;
- amt = write(fd, &padding, paddingLen);
- if (amt != paddingLen) {
- ALOGW("write_snapshot_file error writing %d bytes of filename padding %s",
- paddingLen, strerror(errno));
- return 1;
- }
- }
- }
- }
-
- return 0;
-}
-
-static int
-write_delete_file(BackupDataWriter* dataStream, const String8& key)
-{
- LOGP("write_delete_file %s\n", key.string());
- return dataStream->WriteEntityHeader(key, -1);
-}
-
-static int
-write_update_file(BackupDataWriter* dataStream, int fd, int mode, const String8& key,
- char const* realFilename)
-{
- LOGP("write_update_file %s (%s) : mode 0%o\n", realFilename, key.string(), mode);
-
- const int bufsize = 4*1024;
- int err;
- int amt;
- int fileSize;
- int bytesLeft;
- file_metadata_v1 metadata;
-
- char* buf = (char*)malloc(bufsize);
- int crc = crc32(0L, Z_NULL, 0);
-
-
- fileSize = lseek(fd, 0, SEEK_END);
- lseek(fd, 0, SEEK_SET);
-
- if (sizeof(metadata) != 16) {
- ALOGE("ERROR: metadata block is the wrong size!");
- }
-
- bytesLeft = fileSize + sizeof(metadata);
- err = dataStream->WriteEntityHeader(key, bytesLeft);
- if (err != 0) {
- free(buf);
- return err;
- }
-
- // store the file metadata first
- metadata.version = tolel(CURRENT_METADATA_VERSION);
- metadata.mode = tolel(mode);
- metadata.undefined_1 = metadata.undefined_2 = 0;
- err = dataStream->WriteEntityData(&metadata, sizeof(metadata));
- if (err != 0) {
- free(buf);
- return err;
- }
- bytesLeft -= sizeof(metadata); // bytesLeft should == fileSize now
-
- // now store the file content
- while ((amt = read(fd, buf, bufsize)) != 0 && bytesLeft > 0) {
- bytesLeft -= amt;
- if (bytesLeft < 0) {
- amt += bytesLeft; // Plus a negative is minus. Don't write more than we promised.
- }
- err = dataStream->WriteEntityData(buf, amt);
- if (err != 0) {
- free(buf);
- return err;
- }
- }
- if (bytesLeft != 0) {
- if (bytesLeft > 0) {
- // Pad out the space we promised in the buffer. We can't corrupt the buffer,
- // even though the data we're sending is probably bad.
- memset(buf, 0, bufsize);
- while (bytesLeft > 0) {
- amt = bytesLeft < bufsize ? bytesLeft : bufsize;
- bytesLeft -= amt;
- err = dataStream->WriteEntityData(buf, amt);
- if (err != 0) {
- free(buf);
- return err;
- }
- }
- }
- ALOGE("write_update_file size mismatch for %s. expected=%d actual=%d."
- " You aren't doing proper locking!", realFilename, fileSize, fileSize-bytesLeft);
- }
-
- free(buf);
- return NO_ERROR;
-}
-
-static int
-write_update_file(BackupDataWriter* dataStream, const String8& key, char const* realFilename)
-{
- int err;
- struct stat st;
-
- err = stat(realFilename, &st);
- if (err < 0) {
- return errno;
- }
-
- int fd = open(realFilename, O_RDONLY);
- if (fd == -1) {
- return errno;
- }
-
- err = write_update_file(dataStream, fd, st.st_mode, key, realFilename);
- close(fd);
- return err;
-}
-
-static int
-compute_crc32(int fd)
-{
- const int bufsize = 4*1024;
- int amt;
-
- char* buf = (char*)malloc(bufsize);
- int crc = crc32(0L, Z_NULL, 0);
-
- lseek(fd, 0, SEEK_SET);
-
- while ((amt = read(fd, buf, bufsize)) != 0) {
- crc = crc32(crc, (Bytef*)buf, amt);
- }
-
- free(buf);
- return crc;
-}
-
-int
-back_up_files(int oldSnapshotFD, BackupDataWriter* dataStream, int newSnapshotFD,
- char const* const* files, char const* const* keys, int fileCount)
-{
- int err;
- KeyedVector<String8,FileState> oldSnapshot;
- KeyedVector<String8,FileRec> newSnapshot;
-
- if (oldSnapshotFD != -1) {
- err = read_snapshot_file(oldSnapshotFD, &oldSnapshot);
- if (err != 0) {
- // On an error, treat this as a full backup.
- oldSnapshot.clear();
- }
- }
-
- for (int i=0; i<fileCount; i++) {
- String8 key(keys[i]);
- FileRec r;
- char const* file = files[i];
- r.file = file;
- struct stat st;
-
- err = stat(file, &st);
- if (err != 0) {
- r.deleted = true;
- } else {
- r.deleted = false;
- r.s.modTime_sec = st.st_mtime;
- r.s.modTime_nsec = 0; // workaround sim breakage
- //r.s.modTime_nsec = st.st_mtime_nsec;
- r.s.mode = st.st_mode;
- r.s.size = st.st_size;
- // we compute the crc32 later down below, when we already have the file open.
-
- if (newSnapshot.indexOfKey(key) >= 0) {
- LOGP("back_up_files key already in use '%s'", key.string());
- return -1;
- }
- }
- newSnapshot.add(key, r);
- }
-
- int n = 0;
- int N = oldSnapshot.size();
- int m = 0;
-
- while (n<N && m<fileCount) {
- const String8& p = oldSnapshot.keyAt(n);
- const String8& q = newSnapshot.keyAt(m);
- FileRec& g = newSnapshot.editValueAt(m);
- int cmp = p.compare(q);
- if (g.deleted || cmp < 0) {
- // file removed
- LOGP("file removed: %s", p.string());
- g.deleted = true; // They didn't mention the file, but we noticed that it's gone.
- dataStream->WriteEntityHeader(p, -1);
- n++;
- }
- else if (cmp > 0) {
- // file added
- LOGP("file added: %s", g.file.string());
- write_update_file(dataStream, q, g.file.string());
- m++;
- }
- else {
- // both files exist, check them
- const FileState& f = oldSnapshot.valueAt(n);
-
- int fd = open(g.file.string(), O_RDONLY);
- if (fd < 0) {
- // We can't open the file. Don't report it as a delete either. Let the
- // server keep the old version. Maybe they'll be able to deal with it
- // on restore.
- LOGP("Unable to open file %s - skipping", g.file.string());
- } else {
- g.s.crc32 = compute_crc32(fd);
-
- LOGP("%s", q.string());
- LOGP(" new: modTime=%d,%d mode=%04o size=%-3d crc32=0x%08x",
- f.modTime_sec, f.modTime_nsec, f.mode, f.size, f.crc32);
- LOGP(" old: modTime=%d,%d mode=%04o size=%-3d crc32=0x%08x",
- g.s.modTime_sec, g.s.modTime_nsec, g.s.mode, g.s.size, g.s.crc32);
- if (f.modTime_sec != g.s.modTime_sec || f.modTime_nsec != g.s.modTime_nsec
- || f.mode != g.s.mode || f.size != g.s.size || f.crc32 != g.s.crc32) {
- write_update_file(dataStream, fd, g.s.mode, p, g.file.string());
- }
-
- close(fd);
- }
- n++;
- m++;
- }
- }
-
- // these were deleted
- while (n<N) {
- dataStream->WriteEntityHeader(oldSnapshot.keyAt(n), -1);
- n++;
- }
-
- // these were added
- while (m<fileCount) {
- const String8& q = newSnapshot.keyAt(m);
- FileRec& g = newSnapshot.editValueAt(m);
- write_update_file(dataStream, q, g.file.string());
- m++;
- }
-
- err = write_snapshot_file(newSnapshotFD, newSnapshot);
-
- return 0;
-}
-
-// Utility function, equivalent to stpcpy(): perform a strcpy, but instead of
-// returning the initial dest, return a pointer to the trailing NUL.
-static char* strcpy_ptr(char* dest, const char* str) {
- if (dest && str) {
- while ((*dest = *str) != 0) {
- dest++;
- str++;
- }
- }
- return dest;
-}
-
-static void calc_tar_checksum(char* buf) {
- // [ 148 : 8 ] checksum -- to be calculated with this field as space chars
- memset(buf + 148, ' ', 8);
-
- uint16_t sum = 0;
- for (uint8_t* p = (uint8_t*) buf; p < ((uint8_t*)buf) + 512; p++) {
- sum += *p;
- }
-
- // Now write the real checksum value:
- // [ 148 : 8 ] checksum: 6 octal digits [leading zeroes], NUL, SPC
- sprintf(buf + 148, "%06o", sum); // the trailing space is already in place
-}
-
-// Returns number of bytes written
-static int write_pax_header_entry(char* buf, const char* key, const char* value) {
- // start with the size of "1 key=value\n"
- int len = strlen(key) + strlen(value) + 4;
- if (len > 9) len++;
- if (len > 99) len++;
- if (len > 999) len++;
- // since PATH_MAX is 4096 we don't expect to have to generate any single
- // header entry longer than 9999 characters
-
- return sprintf(buf, "%d %s=%s\n", len, key, value);
-}
-
-// Wire format to the backup manager service is chunked: each chunk is prefixed by
-// a 4-byte count of its size. A chunk size of zero (four zero bytes) indicates EOD.
-void send_tarfile_chunk(BackupDataWriter* writer, const char* buffer, size_t size) {
- uint32_t chunk_size_no = htonl(size);
- writer->WriteEntityData(&chunk_size_no, 4);
- if (size != 0) writer->WriteEntityData(buffer, size);
-}
-
-int write_tarfile(const String8& packageName, const String8& domain,
- const String8& rootpath, const String8& filepath, BackupDataWriter* writer)
-{
- // In the output stream everything is stored relative to the root
- const char* relstart = filepath.string() + rootpath.length();
- if (*relstart == '/') relstart++; // won't be true when path == rootpath
- String8 relpath(relstart);
-
- // If relpath is empty, it means this is the top of one of the standard named
- // domain directories, so we should just skip it
- if (relpath.length() == 0) {
- return 0;
- }
-
- // Too long a name for the ustar format?
- // "apps/" + packagename + '/' + domainpath < 155 chars
- // relpath < 100 chars
- bool needExtended = false;
- if ((5 + packageName.length() + 1 + domain.length() >= 155) || (relpath.length() >= 100)) {
- needExtended = true;
- }
-
- // Non-7bit-clean path also means needing pax extended format
- if (!needExtended) {
- for (size_t i = 0; i < filepath.length(); i++) {
- if ((filepath[i] & 0x80) != 0) {
- needExtended = true;
- break;
- }
- }
- }
-
- int err = 0;
- struct stat64 s;
- if (lstat64(filepath.string(), &s) != 0) {
- err = errno;
- ALOGE("Error %d (%s) from lstat64(%s)", err, strerror(err), filepath.string());
- return err;
- }
-
- String8 fullname; // for pax later on
- String8 prefix;
-
- const int isdir = S_ISDIR(s.st_mode);
- if (isdir) s.st_size = 0; // directories get no actual data in the tar stream
-
- // !!! TODO: use mmap when possible to avoid churning the buffer cache
- // !!! TODO: this will break with symlinks; need to use readlink(2)
- int fd = open(filepath.string(), O_RDONLY);
- if (fd < 0) {
- err = errno;
- ALOGE("Error %d (%s) from open(%s)", err, strerror(err), filepath.string());
- return err;
- }
-
- // read/write up to this much at a time.
- const size_t BUFSIZE = 32 * 1024;
- char* buf = (char *)calloc(1,BUFSIZE);
- char* paxHeader = buf + 512; // use a different chunk of it as separate scratch
- char* paxData = buf + 1024;
-
- if (buf == NULL) {
- ALOGE("Out of mem allocating transfer buffer");
- err = ENOMEM;
- goto done;
- }
-
- // Magic fields for the ustar file format
- strcat(buf + 257, "ustar");
- strcat(buf + 263, "00");
-
- // [ 265 : 32 ] user name, ignored on restore
- // [ 297 : 32 ] group name, ignored on restore
-
- // [ 100 : 8 ] file mode
- snprintf(buf + 100, 8, "%06o ", s.st_mode & ~S_IFMT);
-
- // [ 108 : 8 ] uid -- ignored in Android format; uids are remapped at restore time
- // [ 116 : 8 ] gid -- ignored in Android format
- snprintf(buf + 108, 8, "0%lo", s.st_uid);
- snprintf(buf + 116, 8, "0%lo", s.st_gid);
-
- // [ 124 : 12 ] file size in bytes
- if (s.st_size > 077777777777LL) {
- // very large files need a pax extended size header
- needExtended = true;
- }
- snprintf(buf + 124, 12, "%011llo", (isdir) ? 0LL : s.st_size);
-
- // [ 136 : 12 ] last mod time as a UTC time_t
- snprintf(buf + 136, 12, "%0lo", s.st_mtime);
-
- // [ 156 : 1 ] link/file type
- uint8_t type;
- if (isdir) {
- type = '5'; // tar magic: '5' == directory
- } else if (S_ISREG(s.st_mode)) {
- type = '0'; // tar magic: '0' == normal file
- } else {
- ALOGW("Error: unknown file mode 0%o [%s]", s.st_mode, filepath.string());
- goto cleanup;
- }
- buf[156] = type;
-
- // [ 157 : 100 ] name of linked file [not implemented]
-
- {
- // Prefix and main relative path. Path lengths have been preflighted.
- if (packageName.length() > 0) {
- prefix = "apps/";
- prefix += packageName;
- }
- if (domain.length() > 0) {
- prefix.appendPath(domain);
- }
-
- // pax extended means we don't put in a prefix field, and put a different
- // string in the basic name field. We can also construct the full path name
- // out of the substrings we've now built.
- fullname = prefix;
- fullname.appendPath(relpath);
-
- // ustar:
- // [ 0 : 100 ]; file name/path
- // [ 345 : 155 ] filename path prefix
- // We only use the prefix area if fullname won't fit in the path
- if (fullname.length() > 100) {
- strncpy(buf, relpath.string(), 100);
- strncpy(buf + 345, prefix.string(), 155);
- } else {
- strncpy(buf, fullname.string(), 100);
- }
- }
-
- // [ 329 : 8 ] and [ 337 : 8 ] devmajor/devminor, not used
-
- ALOGI(" Name: %s", fullname.string());
-
- // If we're using a pax extended header, build & write that here; lengths are
- // already preflighted
- if (needExtended) {
- char sizeStr[32]; // big enough for a 64-bit unsigned value in decimal
- char* p = paxData;
-
- // construct the pax extended header data block
- memset(paxData, 0, BUFSIZE - (paxData - buf));
- int len;
-
- // size header -- calc len in digits by actually rendering the number
- // to a string - brute force but simple
- snprintf(sizeStr, sizeof(sizeStr), "%lld", s.st_size);
- p += write_pax_header_entry(p, "size", sizeStr);
-
- // fullname was generated above with the ustar paths
- p += write_pax_header_entry(p, "path", fullname.string());
-
- // Now we know how big the pax data is
- int paxLen = p - paxData;
-
- // Now build the pax *header* templated on the ustar header
- memcpy(paxHeader, buf, 512);
-
- String8 leaf = fullname.getPathLeaf();
- memset(paxHeader, 0, 100); // rewrite the name area
- snprintf(paxHeader, 100, "PaxHeader/%s", leaf.string());
- memset(paxHeader + 345, 0, 155); // rewrite the prefix area
- strncpy(paxHeader + 345, prefix.string(), 155);
-
- paxHeader[156] = 'x'; // mark it as a pax extended header
-
- // [ 124 : 12 ] size of pax extended header data
- memset(paxHeader + 124, 0, 12);
- snprintf(paxHeader + 124, 12, "%011o", p - paxData);
-
- // Checksum and write the pax block header
- calc_tar_checksum(paxHeader);
- send_tarfile_chunk(writer, paxHeader, 512);
-
- // Now write the pax data itself
- int paxblocks = (paxLen + 511) / 512;
- send_tarfile_chunk(writer, paxData, 512 * paxblocks);
- }
-
- // Checksum and write the 512-byte ustar file header block to the output
- calc_tar_checksum(buf);
- send_tarfile_chunk(writer, buf, 512);
-
- // Now write the file data itself, for real files. We honor tar's convention that
- // only full 512-byte blocks are sent to write().
- if (!isdir) {
- off64_t toWrite = s.st_size;
- while (toWrite > 0) {
- size_t toRead = (toWrite < BUFSIZE) ? toWrite : BUFSIZE;
- ssize_t nRead = read(fd, buf, toRead);
- if (nRead < 0) {
- err = errno;
- ALOGE("Unable to read file [%s], err=%d (%s)", filepath.string(),
- err, strerror(err));
- break;
- } else if (nRead == 0) {
- ALOGE("EOF but expect %lld more bytes in [%s]", (long long) toWrite,
- filepath.string());
- err = EIO;
- break;
- }
-
- // At EOF we might have a short block; NUL-pad that to a 512-byte multiple. This
- // depends on the OS guarantee that for ordinary files, read() will never return
- // less than the number of bytes requested.
- ssize_t partial = (nRead+512) % 512;
- if (partial > 0) {
- ssize_t remainder = 512 - partial;
- memset(buf + nRead, 0, remainder);
- nRead += remainder;
- }
- send_tarfile_chunk(writer, buf, nRead);
- toWrite -= nRead;
- }
- }
-
-cleanup:
- free(buf);
-done:
- close(fd);
- return err;
-}
-// end tarfile
-
-
-
-#define RESTORE_BUF_SIZE (8*1024)
-
-RestoreHelperBase::RestoreHelperBase()
-{
- m_buf = malloc(RESTORE_BUF_SIZE);
- m_loggedUnknownMetadata = false;
-}
-
-RestoreHelperBase::~RestoreHelperBase()
-{
- free(m_buf);
-}
-
-status_t
-RestoreHelperBase::WriteFile(const String8& filename, BackupDataReader* in)
-{
- ssize_t err;
- size_t dataSize;
- String8 key;
- int fd;
- void* buf = m_buf;
- ssize_t amt;
- int mode;
- int crc;
- struct stat st;
- FileRec r;
-
- err = in->ReadEntityHeader(&key, &dataSize);
- if (err != NO_ERROR) {
- return err;
- }
-
- // Get the metadata block off the head of the file entity and use that to
- // set up the output file
- file_metadata_v1 metadata;
- amt = in->ReadEntityData(&metadata, sizeof(metadata));
- if (amt != sizeof(metadata)) {
- ALOGW("Could not read metadata for %s -- %ld / %s", filename.string(),
- (long)amt, strerror(errno));
- return EIO;
- }
- metadata.version = fromlel(metadata.version);
- metadata.mode = fromlel(metadata.mode);
- if (metadata.version > CURRENT_METADATA_VERSION) {
- if (!m_loggedUnknownMetadata) {
- m_loggedUnknownMetadata = true;
- ALOGW("Restoring file with unsupported metadata version %d (currently %d)",
- metadata.version, CURRENT_METADATA_VERSION);
- }
- }
- mode = metadata.mode;
-
- // Write the file and compute the crc
- crc = crc32(0L, Z_NULL, 0);
- fd = open(filename.string(), O_CREAT|O_RDWR|O_TRUNC, mode);
- if (fd == -1) {
- ALOGW("Could not open file %s -- %s", filename.string(), strerror(errno));
- return errno;
- }
-
- while ((amt = in->ReadEntityData(buf, RESTORE_BUF_SIZE)) > 0) {
- err = write(fd, buf, amt);
- if (err != amt) {
- close(fd);
- ALOGW("Error '%s' writing '%s'", strerror(errno), filename.string());
- return errno;
- }
- crc = crc32(crc, (Bytef*)buf, amt);
- }
-
- close(fd);
-
- // Record for the snapshot
- err = stat(filename.string(), &st);
- if (err != 0) {
- ALOGW("Error stating file that we just created %s", filename.string());
- return errno;
- }
-
- r.file = filename;
- r.deleted = false;
- r.s.modTime_sec = st.st_mtime;
- r.s.modTime_nsec = 0; // workaround sim breakage
- //r.s.modTime_nsec = st.st_mtime_nsec;
- r.s.mode = st.st_mode;
- r.s.size = st.st_size;
- r.s.crc32 = crc;
-
- m_files.add(key, r);
-
- return NO_ERROR;
-}
-
-status_t
-RestoreHelperBase::WriteSnapshot(int fd)
-{
- return write_snapshot_file(fd, m_files);;
-}
-
-#if TEST_BACKUP_HELPERS
-
-#define SCRATCH_DIR "/data/backup_helper_test/"
-
-static int
-write_text_file(const char* path, const char* data)
-{
- int amt;
- int fd;
- int len;
-
- fd = creat(path, 0666);
- if (fd == -1) {
- fprintf(stderr, "creat %s failed\n", path);
- return errno;
- }
-
- len = strlen(data);
- amt = write(fd, data, len);
- if (amt != len) {
- fprintf(stderr, "error (%s) writing to file %s\n", strerror(errno), path);
- return errno;
- }
-
- close(fd);
-
- return 0;
-}
-
-static int
-compare_file(const char* path, const unsigned char* data, int len)
-{
- int fd;
- int amt;
-
- fd = open(path, O_RDONLY);
- if (fd == -1) {
- fprintf(stderr, "compare_file error (%s) opening %s\n", strerror(errno), path);
- return errno;
- }
-
- unsigned char* contents = (unsigned char*)malloc(len);
- if (contents == NULL) {
- fprintf(stderr, "malloc(%d) failed\n", len);
- return ENOMEM;
- }
-
- bool sizesMatch = true;
- amt = lseek(fd, 0, SEEK_END);
- if (amt != len) {
- fprintf(stderr, "compare_file file length should be %d, was %d\n", len, amt);
- sizesMatch = false;
- }
- lseek(fd, 0, SEEK_SET);
-
- int readLen = amt < len ? amt : len;
- amt = read(fd, contents, readLen);
- if (amt != readLen) {
- fprintf(stderr, "compare_file read expected %d bytes but got %d\n", len, amt);
- }
-
- bool contentsMatch = true;
- for (int i=0; i<readLen; i++) {
- if (data[i] != contents[i]) {
- if (contentsMatch) {
- fprintf(stderr, "compare_file contents are different: (index, expected, actual)\n");
- contentsMatch = false;
- }
- fprintf(stderr, " [%-2d] %02x %02x\n", i, data[i], contents[i]);
- }
- }
-
- free(contents);
- return contentsMatch && sizesMatch ? 0 : 1;
-}
-
-int
-backup_helper_test_empty()
-{
- int err;
- int fd;
- KeyedVector<String8,FileRec> snapshot;
- const char* filename = SCRATCH_DIR "backup_helper_test_empty.snap";
-
- system("rm -r " SCRATCH_DIR);
- mkdir(SCRATCH_DIR, 0777);
-
- // write
- fd = creat(filename, 0666);
- if (fd == -1) {
- fprintf(stderr, "error creating %s\n", filename);
- return 1;
- }
-
- err = write_snapshot_file(fd, snapshot);
-
- close(fd);
-
- if (err != 0) {
- fprintf(stderr, "write_snapshot_file reported error %d (%s)\n", err, strerror(err));
- return err;
- }
-
- static const unsigned char correct_data[] = {
- 0x53, 0x6e, 0x61, 0x70, 0x00, 0x00, 0x00, 0x00,
- 0x46, 0x69, 0x6c, 0x65, 0x10, 0x00, 0x00, 0x00
- };
-
- err = compare_file(filename, correct_data, sizeof(correct_data));
- if (err != 0) {
- return err;
- }
-
- // read
- fd = open(filename, O_RDONLY);
- if (fd == -1) {
- fprintf(stderr, "error opening for read %s\n", filename);
- return 1;
- }
-
- KeyedVector<String8,FileState> readSnapshot;
- err = read_snapshot_file(fd, &readSnapshot);
- if (err != 0) {
- fprintf(stderr, "read_snapshot_file failed %d\n", err);
- return err;
- }
-
- if (readSnapshot.size() != 0) {
- fprintf(stderr, "readSnapshot should be length 0\n");
- return 1;
- }
-
- return 0;
-}
-
-int
-backup_helper_test_four()
-{
- int err;
- int fd;
- KeyedVector<String8,FileRec> snapshot;
- const char* filename = SCRATCH_DIR "backup_helper_test_four.snap";
-
- system("rm -r " SCRATCH_DIR);
- mkdir(SCRATCH_DIR, 0777);
-
- // write
- fd = creat(filename, 0666);
- if (fd == -1) {
- fprintf(stderr, "error opening %s\n", filename);
- return 1;
- }
-
- String8 filenames[4];
- FileState states[4];
- FileRec r;
- r.deleted = false;
-
- states[0].modTime_sec = 0xfedcba98;
- states[0].modTime_nsec = 0xdeadbeef;
- states[0].mode = 0777; // decimal 511, hex 0x000001ff
- states[0].size = 0xababbcbc;
- states[0].crc32 = 0x12345678;
- states[0].nameLen = -12;
- r.s = states[0];
- filenames[0] = String8("bytes_of_padding");
- snapshot.add(filenames[0], r);
-
- states[1].modTime_sec = 0x93400031;
- states[1].modTime_nsec = 0xdeadbeef;
- states[1].mode = 0666; // decimal 438, hex 0x000001b6
- states[1].size = 0x88557766;
- states[1].crc32 = 0x22334422;
- states[1].nameLen = -1;
- r.s = states[1];
- filenames[1] = String8("bytes_of_padding3");
- snapshot.add(filenames[1], r);
-
- states[2].modTime_sec = 0x33221144;
- states[2].modTime_nsec = 0xdeadbeef;
- states[2].mode = 0744; // decimal 484, hex 0x000001e4
- states[2].size = 0x11223344;
- states[2].crc32 = 0x01122334;
- states[2].nameLen = 0;
- r.s = states[2];
- filenames[2] = String8("bytes_of_padding_2");
- snapshot.add(filenames[2], r);
-
- states[3].modTime_sec = 0x33221144;
- states[3].modTime_nsec = 0xdeadbeef;
- states[3].mode = 0755; // decimal 493, hex 0x000001ed
- states[3].size = 0x11223344;
- states[3].crc32 = 0x01122334;
- states[3].nameLen = 0;
- r.s = states[3];
- filenames[3] = String8("bytes_of_padding__1");
- snapshot.add(filenames[3], r);
-
- err = write_snapshot_file(fd, snapshot);
-
- close(fd);
-
- if (err != 0) {
- fprintf(stderr, "write_snapshot_file reported error %d (%s)\n", err, strerror(err));
- return err;
- }
-
- static const unsigned char correct_data[] = {
- // header
- 0x53, 0x6e, 0x61, 0x70, 0x04, 0x00, 0x00, 0x00,
- 0x46, 0x69, 0x6c, 0x65, 0xbc, 0x00, 0x00, 0x00,
-
- // bytes_of_padding
- 0x98, 0xba, 0xdc, 0xfe, 0xef, 0xbe, 0xad, 0xde,
- 0xff, 0x01, 0x00, 0x00, 0xbc, 0xbc, 0xab, 0xab,
- 0x78, 0x56, 0x34, 0x12, 0x10, 0x00, 0x00, 0x00,
- 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x6f, 0x66,
- 0x5f, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67,
-
- // bytes_of_padding3
- 0x31, 0x00, 0x40, 0x93, 0xef, 0xbe, 0xad, 0xde,
- 0xb6, 0x01, 0x00, 0x00, 0x66, 0x77, 0x55, 0x88,
- 0x22, 0x44, 0x33, 0x22, 0x11, 0x00, 0x00, 0x00,
- 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x6f, 0x66,
- 0x5f, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67,
- 0x33, 0xab, 0xab, 0xab,
-
- // bytes of padding2
- 0x44, 0x11, 0x22, 0x33, 0xef, 0xbe, 0xad, 0xde,
- 0xe4, 0x01, 0x00, 0x00, 0x44, 0x33, 0x22, 0x11,
- 0x34, 0x23, 0x12, 0x01, 0x12, 0x00, 0x00, 0x00,
- 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x6f, 0x66,
- 0x5f, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67,
- 0x5f, 0x32, 0xab, 0xab,
-
- // bytes of padding3
- 0x44, 0x11, 0x22, 0x33, 0xef, 0xbe, 0xad, 0xde,
- 0xed, 0x01, 0x00, 0x00, 0x44, 0x33, 0x22, 0x11,
- 0x34, 0x23, 0x12, 0x01, 0x13, 0x00, 0x00, 0x00,
- 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x6f, 0x66,
- 0x5f, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67,
- 0x5f, 0x5f, 0x31, 0xab
- };
-
- err = compare_file(filename, correct_data, sizeof(correct_data));
- if (err != 0) {
- return err;
- }
-
- // read
- fd = open(filename, O_RDONLY);
- if (fd == -1) {
- fprintf(stderr, "error opening for read %s\n", filename);
- return 1;
- }
-
-
- KeyedVector<String8,FileState> readSnapshot;
- err = read_snapshot_file(fd, &readSnapshot);
- if (err != 0) {
- fprintf(stderr, "read_snapshot_file failed %d\n", err);
- return err;
- }
-
- if (readSnapshot.size() != 4) {
- fprintf(stderr, "readSnapshot should be length 4 is %d\n", readSnapshot.size());
- return 1;
- }
-
- bool matched = true;
- for (size_t i=0; i<readSnapshot.size(); i++) {
- const String8& name = readSnapshot.keyAt(i);
- const FileState state = readSnapshot.valueAt(i);
-
- if (name != filenames[i] || states[i].modTime_sec != state.modTime_sec
- || states[i].modTime_nsec != state.modTime_nsec || states[i].mode != state.mode
- || states[i].size != state.size || states[i].crc32 != states[i].crc32) {
- fprintf(stderr, "state %d expected={%d/%d, 0x%08x, %04o, 0x%08x, %3d} '%s'\n"
- " actual={%d/%d, 0x%08x, %04o, 0x%08x, %3d} '%s'\n", i,
- states[i].modTime_sec, states[i].modTime_nsec, states[i].mode, states[i].size,
- states[i].crc32, name.length(), filenames[i].string(),
- state.modTime_sec, state.modTime_nsec, state.mode, state.size, state.crc32,
- state.nameLen, name.string());
- matched = false;
- }
- }
-
- return matched ? 0 : 1;
-}
-
-// hexdump -v -e '" " 8/1 " 0x%02x," "\n"' data_writer.data
-const unsigned char DATA_GOLDEN_FILE[] = {
- 0x44, 0x61, 0x74, 0x61, 0x0b, 0x00, 0x00, 0x00,
- 0x0c, 0x00, 0x00, 0x00, 0x6e, 0x6f, 0x5f, 0x70,
- 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x00,
- 0x6e, 0x6f, 0x5f, 0x70, 0x61, 0x64, 0x64, 0x69,
- 0x6e, 0x67, 0x5f, 0x00, 0x44, 0x61, 0x74, 0x61,
- 0x0c, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00,
- 0x70, 0x61, 0x64, 0x64, 0x65, 0x64, 0x5f, 0x74,
- 0x6f, 0x5f, 0x5f, 0x33, 0x00, 0xbc, 0xbc, 0xbc,
- 0x70, 0x61, 0x64, 0x64, 0x65, 0x64, 0x5f, 0x74,
- 0x6f, 0x5f, 0x5f, 0x33, 0x00, 0xbc, 0xbc, 0xbc,
- 0x44, 0x61, 0x74, 0x61, 0x0d, 0x00, 0x00, 0x00,
- 0x0e, 0x00, 0x00, 0x00, 0x70, 0x61, 0x64, 0x64,
- 0x65, 0x64, 0x5f, 0x74, 0x6f, 0x5f, 0x32, 0x5f,
- 0x5f, 0x00, 0xbc, 0xbc, 0x70, 0x61, 0x64, 0x64,
- 0x65, 0x64, 0x5f, 0x74, 0x6f, 0x5f, 0x32, 0x5f,
- 0x5f, 0x00, 0xbc, 0xbc, 0x44, 0x61, 0x74, 0x61,
- 0x0a, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00,
- 0x70, 0x61, 0x64, 0x64, 0x65, 0x64, 0x5f, 0x74,
- 0x6f, 0x31, 0x00, 0xbc, 0x70, 0x61, 0x64, 0x64,
- 0x65, 0x64, 0x5f, 0x74, 0x6f, 0x31, 0x00
-
-};
-const int DATA_GOLDEN_FILE_SIZE = sizeof(DATA_GOLDEN_FILE);
-
-static int
-test_write_header_and_entity(BackupDataWriter& writer, const char* str)
-{
- int err;
- String8 text(str);
-
- err = writer.WriteEntityHeader(text, text.length()+1);
- if (err != 0) {
- fprintf(stderr, "WriteEntityHeader failed with %s\n", strerror(err));
- return err;
- }
-
- err = writer.WriteEntityData(text.string(), text.length()+1);
- if (err != 0) {
- fprintf(stderr, "write failed for data '%s'\n", text.string());
- return errno;
- }
-
- return err;
-}
-
-int
-backup_helper_test_data_writer()
-{
- int err;
- int fd;
- const char* filename = SCRATCH_DIR "data_writer.data";
-
- system("rm -r " SCRATCH_DIR);
- mkdir(SCRATCH_DIR, 0777);
- mkdir(SCRATCH_DIR "data", 0777);
-
- fd = creat(filename, 0666);
- if (fd == -1) {
- fprintf(stderr, "error creating: %s\n", strerror(errno));
- return errno;
- }
-
- BackupDataWriter writer(fd);
-
- err = 0;
- err |= test_write_header_and_entity(writer, "no_padding_");
- err |= test_write_header_and_entity(writer, "padded_to__3");
- err |= test_write_header_and_entity(writer, "padded_to_2__");
- err |= test_write_header_and_entity(writer, "padded_to1");
-
- close(fd);
-
- err = compare_file(filename, DATA_GOLDEN_FILE, DATA_GOLDEN_FILE_SIZE);
- if (err != 0) {
- return err;
- }
-
- return err;
-}
-
-int
-test_read_header_and_entity(BackupDataReader& reader, const char* str)
-{
- int err;
- int bufSize = strlen(str)+1;
- char* buf = (char*)malloc(bufSize);
- String8 string;
- int cookie = 0x11111111;
- size_t actualSize;
- bool done;
- int type;
- ssize_t nRead;
-
- // printf("\n\n---------- test_read_header_and_entity -- %s\n\n", str);
-
- err = reader.ReadNextHeader(&done, &type);
- if (done) {
- fprintf(stderr, "should not be done yet\n");
- goto finished;
- }
- if (err != 0) {
- fprintf(stderr, "ReadNextHeader (for app header) failed with %s\n", strerror(err));
- goto finished;
- }
- if (type != BACKUP_HEADER_ENTITY_V1) {
- err = EINVAL;
- fprintf(stderr, "type=0x%08x expected 0x%08x\n", type, BACKUP_HEADER_ENTITY_V1);
- }
-
- err = reader.ReadEntityHeader(&string, &actualSize);
- if (err != 0) {
- fprintf(stderr, "ReadEntityHeader failed with %s\n", strerror(err));
- goto finished;
- }
- if (string != str) {
- fprintf(stderr, "ReadEntityHeader expected key '%s' got '%s'\n", str, string.string());
- err = EINVAL;
- goto finished;
- }
- if ((int)actualSize != bufSize) {
- fprintf(stderr, "ReadEntityHeader expected dataSize 0x%08x got 0x%08x\n", bufSize,
- actualSize);
- err = EINVAL;
- goto finished;
- }
-
- nRead = reader.ReadEntityData(buf, bufSize);
- if (nRead < 0) {
- err = reader.Status();
- fprintf(stderr, "ReadEntityData failed with %s\n", strerror(err));
- goto finished;
- }
-
- if (0 != memcmp(buf, str, bufSize)) {
- fprintf(stderr, "ReadEntityData expected '%s' but got something starting with "
- "%02x %02x %02x %02x '%c%c%c%c'\n", str, buf[0], buf[1], buf[2], buf[3],
- buf[0], buf[1], buf[2], buf[3]);
- err = EINVAL;
- goto finished;
- }
-
- // The next read will confirm whether it got the right amount of data.
-
-finished:
- if (err != NO_ERROR) {
- fprintf(stderr, "test_read_header_and_entity failed with %s\n", strerror(err));
- }
- free(buf);
- return err;
-}
-
-int
-backup_helper_test_data_reader()
-{
- int err;
- int fd;
- const char* filename = SCRATCH_DIR "data_reader.data";
-
- system("rm -r " SCRATCH_DIR);
- mkdir(SCRATCH_DIR, 0777);
- mkdir(SCRATCH_DIR "data", 0777);
-
- fd = creat(filename, 0666);
- if (fd == -1) {
- fprintf(stderr, "error creating: %s\n", strerror(errno));
- return errno;
- }
-
- err = write(fd, DATA_GOLDEN_FILE, DATA_GOLDEN_FILE_SIZE);
- if (err != DATA_GOLDEN_FILE_SIZE) {
- fprintf(stderr, "Error \"%s\" writing golden file %s\n", strerror(errno), filename);
- return errno;
- }
-
- close(fd);
-
- fd = open(filename, O_RDONLY);
- if (fd == -1) {
- fprintf(stderr, "Error \"%s\" opening golden file %s for read\n", strerror(errno),
- filename);
- return errno;
- }
-
- {
- BackupDataReader reader(fd);
-
- err = 0;
-
- if (err == NO_ERROR) {
- err = test_read_header_and_entity(reader, "no_padding_");
- }
-
- if (err == NO_ERROR) {
- err = test_read_header_and_entity(reader, "padded_to__3");
- }
-
- if (err == NO_ERROR) {
- err = test_read_header_and_entity(reader, "padded_to_2__");
- }
-
- if (err == NO_ERROR) {
- err = test_read_header_and_entity(reader, "padded_to1");
- }
- }
-
- close(fd);
-
- return err;
-}
-
-static int
-get_mod_time(const char* filename, struct timeval times[2])
-{
- int err;
- struct stat64 st;
- err = stat64(filename, &st);
- if (err != 0) {
- fprintf(stderr, "stat '%s' failed: %s\n", filename, strerror(errno));
- return errno;
- }
- times[0].tv_sec = st.st_atime;
- times[1].tv_sec = st.st_mtime;
-
- // If st_atime is a macro then struct stat64 uses struct timespec
- // to store the access and modif time values and typically
- // st_*time_nsec is not defined. In glibc, this is controlled by
- // __USE_MISC.
-#ifdef __USE_MISC
-#if !defined(st_atime) || defined(st_atime_nsec)
-#error "Check if this __USE_MISC conditional is still needed."
-#endif
- times[0].tv_usec = st.st_atim.tv_nsec / 1000;
- times[1].tv_usec = st.st_mtim.tv_nsec / 1000;
-#else
- times[0].tv_usec = st.st_atime_nsec / 1000;
- times[1].tv_usec = st.st_mtime_nsec / 1000;
-#endif
-
- return 0;
-}
-
-int
-backup_helper_test_files()
-{
- int err;
- int oldSnapshotFD;
- int dataStreamFD;
- int newSnapshotFD;
-
- system("rm -r " SCRATCH_DIR);
- mkdir(SCRATCH_DIR, 0777);
- mkdir(SCRATCH_DIR "data", 0777);
-
- write_text_file(SCRATCH_DIR "data/b", "b\nbb\n");
- write_text_file(SCRATCH_DIR "data/c", "c\ncc\n");
- write_text_file(SCRATCH_DIR "data/d", "d\ndd\n");
- write_text_file(SCRATCH_DIR "data/e", "e\nee\n");
- write_text_file(SCRATCH_DIR "data/f", "f\nff\n");
- write_text_file(SCRATCH_DIR "data/h", "h\nhh\n");
-
- char const* files_before[] = {
- SCRATCH_DIR "data/b",
- SCRATCH_DIR "data/c",
- SCRATCH_DIR "data/d",
- SCRATCH_DIR "data/e",
- SCRATCH_DIR "data/f"
- };
-
- char const* keys_before[] = {
- "data/b",
- "data/c",
- "data/d",
- "data/e",
- "data/f"
- };
-
- dataStreamFD = creat(SCRATCH_DIR "1.data", 0666);
- if (dataStreamFD == -1) {
- fprintf(stderr, "error creating: %s\n", strerror(errno));
- return errno;
- }
-
- newSnapshotFD = creat(SCRATCH_DIR "before.snap", 0666);
- if (newSnapshotFD == -1) {
- fprintf(stderr, "error creating: %s\n", strerror(errno));
- return errno;
- }
-
- {
- BackupDataWriter dataStream(dataStreamFD);
-
- err = back_up_files(-1, &dataStream, newSnapshotFD, files_before, keys_before, 5);
- if (err != 0) {
- return err;
- }
- }
-
- close(dataStreamFD);
- close(newSnapshotFD);
-
- sleep(3);
-
- struct timeval d_times[2];
- struct timeval e_times[2];
-
- err = get_mod_time(SCRATCH_DIR "data/d", d_times);
- err |= get_mod_time(SCRATCH_DIR "data/e", e_times);
- if (err != 0) {
- return err;
- }
-
- write_text_file(SCRATCH_DIR "data/a", "a\naa\n");
- unlink(SCRATCH_DIR "data/c");
- write_text_file(SCRATCH_DIR "data/c", "c\ncc\n");
- write_text_file(SCRATCH_DIR "data/d", "dd\ndd\n");
- utimes(SCRATCH_DIR "data/d", d_times);
- write_text_file(SCRATCH_DIR "data/e", "z\nzz\n");
- utimes(SCRATCH_DIR "data/e", e_times);
- write_text_file(SCRATCH_DIR "data/g", "g\ngg\n");
- unlink(SCRATCH_DIR "data/f");
-
- char const* files_after[] = {
- SCRATCH_DIR "data/a", // added
- SCRATCH_DIR "data/b", // same
- SCRATCH_DIR "data/c", // different mod time
- SCRATCH_DIR "data/d", // different size (same mod time)
- SCRATCH_DIR "data/e", // different contents (same mod time, same size)
- SCRATCH_DIR "data/g" // added
- };
-
- char const* keys_after[] = {
- "data/a", // added
- "data/b", // same
- "data/c", // different mod time
- "data/d", // different size (same mod time)
- "data/e", // different contents (same mod time, same size)
- "data/g" // added
- };
-
- oldSnapshotFD = open(SCRATCH_DIR "before.snap", O_RDONLY);
- if (oldSnapshotFD == -1) {
- fprintf(stderr, "error opening: %s\n", strerror(errno));
- return errno;
- }
-
- dataStreamFD = creat(SCRATCH_DIR "2.data", 0666);
- if (dataStreamFD == -1) {
- fprintf(stderr, "error creating: %s\n", strerror(errno));
- return errno;
- }
-
- newSnapshotFD = creat(SCRATCH_DIR "after.snap", 0666);
- if (newSnapshotFD == -1) {
- fprintf(stderr, "error creating: %s\n", strerror(errno));
- return errno;
- }
-
- {
- BackupDataWriter dataStream(dataStreamFD);
-
- err = back_up_files(oldSnapshotFD, &dataStream, newSnapshotFD, files_after, keys_after, 6);
- if (err != 0) {
- return err;
- }
-}
-
- close(oldSnapshotFD);
- close(dataStreamFD);
- close(newSnapshotFD);
-
- return 0;
-}
-
-int
-backup_helper_test_null_base()
-{
- int err;
- int oldSnapshotFD;
- int dataStreamFD;
- int newSnapshotFD;
-
- system("rm -r " SCRATCH_DIR);
- mkdir(SCRATCH_DIR, 0777);
- mkdir(SCRATCH_DIR "data", 0777);
-
- write_text_file(SCRATCH_DIR "data/a", "a\naa\n");
-
- char const* files[] = {
- SCRATCH_DIR "data/a",
- };
-
- char const* keys[] = {
- "a",
- };
-
- dataStreamFD = creat(SCRATCH_DIR "null_base.data", 0666);
- if (dataStreamFD == -1) {
- fprintf(stderr, "error creating: %s\n", strerror(errno));
- return errno;
- }
-
- newSnapshotFD = creat(SCRATCH_DIR "null_base.snap", 0666);
- if (newSnapshotFD == -1) {
- fprintf(stderr, "error creating: %s\n", strerror(errno));
- return errno;
- }
-
- {
- BackupDataWriter dataStream(dataStreamFD);
-
- err = back_up_files(-1, &dataStream, newSnapshotFD, files, keys, 1);
- if (err != 0) {
- return err;
- }
- }
-
- close(dataStreamFD);
- close(newSnapshotFD);
-
- return 0;
-}
-
-int
-backup_helper_test_missing_file()
-{
- int err;
- int oldSnapshotFD;
- int dataStreamFD;
- int newSnapshotFD;
-
- system("rm -r " SCRATCH_DIR);
- mkdir(SCRATCH_DIR, 0777);
- mkdir(SCRATCH_DIR "data", 0777);
-
- write_text_file(SCRATCH_DIR "data/b", "b\nbb\n");
-
- char const* files[] = {
- SCRATCH_DIR "data/a",
- SCRATCH_DIR "data/b",
- SCRATCH_DIR "data/c",
- };
-
- char const* keys[] = {
- "a",
- "b",
- "c",
- };
-
- dataStreamFD = creat(SCRATCH_DIR "null_base.data", 0666);
- if (dataStreamFD == -1) {
- fprintf(stderr, "error creating: %s\n", strerror(errno));
- return errno;
- }
-
- newSnapshotFD = creat(SCRATCH_DIR "null_base.snap", 0666);
- if (newSnapshotFD == -1) {
- fprintf(stderr, "error creating: %s\n", strerror(errno));
- return errno;
- }
-
- {
- BackupDataWriter dataStream(dataStreamFD);
-
- err = back_up_files(-1, &dataStream, newSnapshotFD, files, keys, 1);
- if (err != 0) {
- return err;
- }
- }
-
- close(dataStreamFD);
- close(newSnapshotFD);
-
- return 0;
-}
-
-
-#endif // TEST_BACKUP_HELPERS
-
-}
diff --git a/libs/androidfw/CursorWindow.cpp b/libs/androidfw/CursorWindow.cpp
deleted file mode 100644
index 0f54edb..0000000
--- a/libs/androidfw/CursorWindow.cpp
+++ /dev/null
@@ -1,352 +0,0 @@
-/*
- * Copyright (C) 2006-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.
- */
-
-#undef LOG_TAG
-#define LOG_TAG "CursorWindow"
-
-#include <androidfw/CursorWindow.h>
-#include <binder/Parcel.h>
-#include <utils/Log.h>
-
-#include <cutils/ashmem.h>
-#include <sys/mman.h>
-
-#include <assert.h>
-#include <string.h>
-#include <stdlib.h>
-
-namespace android {
-
-CursorWindow::CursorWindow(const String8& name, int ashmemFd,
- void* data, size_t size, bool readOnly) :
- mName(name), mAshmemFd(ashmemFd), mData(data), mSize(size), mReadOnly(readOnly) {
- mHeader = static_cast<Header*>(mData);
-}
-
-CursorWindow::~CursorWindow() {
- ::munmap(mData, mSize);
- ::close(mAshmemFd);
-}
-
-status_t CursorWindow::create(const String8& name, size_t size, CursorWindow** outCursorWindow) {
- String8 ashmemName("CursorWindow: ");
- ashmemName.append(name);
-
- status_t result;
- int ashmemFd = ashmem_create_region(ashmemName.string(), size);
- if (ashmemFd < 0) {
- result = -errno;
- } else {
- result = ashmem_set_prot_region(ashmemFd, PROT_READ | PROT_WRITE);
- if (result >= 0) {
- void* data = ::mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, ashmemFd, 0);
- if (data == MAP_FAILED) {
- result = -errno;
- } else {
- result = ashmem_set_prot_region(ashmemFd, PROT_READ);
- if (result >= 0) {
- CursorWindow* window = new CursorWindow(name, ashmemFd,
- data, size, false /*readOnly*/);
- result = window->clear();
- if (!result) {
- LOG_WINDOW("Created new CursorWindow: freeOffset=%d, "
- "numRows=%d, numColumns=%d, mSize=%d, mData=%p",
- window->mHeader->freeOffset,
- window->mHeader->numRows,
- window->mHeader->numColumns,
- window->mSize, window->mData);
- *outCursorWindow = window;
- return OK;
- }
- delete window;
- }
- }
- ::munmap(data, size);
- }
- ::close(ashmemFd);
- }
- *outCursorWindow = NULL;
- return result;
-}
-
-status_t CursorWindow::createFromParcel(Parcel* parcel, CursorWindow** outCursorWindow) {
- String8 name = parcel->readString8();
-
- status_t result;
- int ashmemFd = parcel->readFileDescriptor();
- if (ashmemFd == int(BAD_TYPE)) {
- result = BAD_TYPE;
- } else {
- ssize_t size = ashmem_get_size_region(ashmemFd);
- if (size < 0) {
- result = UNKNOWN_ERROR;
- } else {
- int dupAshmemFd = ::dup(ashmemFd);
- if (dupAshmemFd < 0) {
- result = -errno;
- } else {
- void* data = ::mmap(NULL, size, PROT_READ, MAP_SHARED, dupAshmemFd, 0);
- if (data == MAP_FAILED) {
- result = -errno;
- } else {
- CursorWindow* window = new CursorWindow(name, dupAshmemFd,
- data, size, true /*readOnly*/);
- LOG_WINDOW("Created CursorWindow from parcel: freeOffset=%d, "
- "numRows=%d, numColumns=%d, mSize=%d, mData=%p",
- window->mHeader->freeOffset,
- window->mHeader->numRows,
- window->mHeader->numColumns,
- window->mSize, window->mData);
- *outCursorWindow = window;
- return OK;
- }
- ::close(dupAshmemFd);
- }
- }
- }
- *outCursorWindow = NULL;
- return result;
-}
-
-status_t CursorWindow::writeToParcel(Parcel* parcel) {
- status_t status = parcel->writeString8(mName);
- if (!status) {
- status = parcel->writeDupFileDescriptor(mAshmemFd);
- }
- return status;
-}
-
-status_t CursorWindow::clear() {
- if (mReadOnly) {
- return INVALID_OPERATION;
- }
-
- mHeader->freeOffset = sizeof(Header) + sizeof(RowSlotChunk);
- mHeader->firstChunkOffset = sizeof(Header);
- mHeader->numRows = 0;
- mHeader->numColumns = 0;
-
- RowSlotChunk* firstChunk = static_cast<RowSlotChunk*>(offsetToPtr(mHeader->firstChunkOffset));
- firstChunk->nextChunkOffset = 0;
- return OK;
-}
-
-status_t CursorWindow::setNumColumns(uint32_t numColumns) {
- if (mReadOnly) {
- return INVALID_OPERATION;
- }
-
- uint32_t cur = mHeader->numColumns;
- if ((cur > 0 || mHeader->numRows > 0) && cur != numColumns) {
- ALOGE("Trying to go from %d columns to %d", cur, numColumns);
- return INVALID_OPERATION;
- }
- mHeader->numColumns = numColumns;
- return OK;
-}
-
-status_t CursorWindow::allocRow() {
- if (mReadOnly) {
- return INVALID_OPERATION;
- }
-
- // Fill in the row slot
- RowSlot* rowSlot = allocRowSlot();
- if (rowSlot == NULL) {
- return NO_MEMORY;
- }
-
- // Allocate the slots for the field directory
- size_t fieldDirSize = mHeader->numColumns * sizeof(FieldSlot);
- uint32_t fieldDirOffset = alloc(fieldDirSize, true /*aligned*/);
- if (!fieldDirOffset) {
- mHeader->numRows--;
- LOG_WINDOW("The row failed, so back out the new row accounting "
- "from allocRowSlot %d", mHeader->numRows);
- return NO_MEMORY;
- }
- FieldSlot* fieldDir = static_cast<FieldSlot*>(offsetToPtr(fieldDirOffset));
- memset(fieldDir, 0, fieldDirSize);
-
- LOG_WINDOW("Allocated row %u, rowSlot is at offset %u, fieldDir is %d bytes at offset %u\n",
- mHeader->numRows - 1, offsetFromPtr(rowSlot), fieldDirSize, fieldDirOffset);
- rowSlot->offset = fieldDirOffset;
- return OK;
-}
-
-status_t CursorWindow::freeLastRow() {
- if (mReadOnly) {
- return INVALID_OPERATION;
- }
-
- if (mHeader->numRows > 0) {
- mHeader->numRows--;
- }
- return OK;
-}
-
-uint32_t CursorWindow::alloc(size_t size, bool aligned) {
- uint32_t padding;
- if (aligned) {
- // 4 byte alignment
- padding = (~mHeader->freeOffset + 1) & 3;
- } else {
- padding = 0;
- }
-
- uint32_t offset = mHeader->freeOffset + padding;
- uint32_t nextFreeOffset = offset + size;
- if (nextFreeOffset > mSize) {
- ALOGW("Window is full: requested allocation %d bytes, "
- "free space %d bytes, window size %d bytes",
- size, freeSpace(), mSize);
- return 0;
- }
-
- mHeader->freeOffset = nextFreeOffset;
- return offset;
-}
-
-CursorWindow::RowSlot* CursorWindow::getRowSlot(uint32_t row) {
- uint32_t chunkPos = row;
- RowSlotChunk* chunk = static_cast<RowSlotChunk*>(
- offsetToPtr(mHeader->firstChunkOffset));
- while (chunkPos >= ROW_SLOT_CHUNK_NUM_ROWS) {
- chunk = static_cast<RowSlotChunk*>(offsetToPtr(chunk->nextChunkOffset));
- chunkPos -= ROW_SLOT_CHUNK_NUM_ROWS;
- }
- return &chunk->slots[chunkPos];
-}
-
-CursorWindow::RowSlot* CursorWindow::allocRowSlot() {
- uint32_t chunkPos = mHeader->numRows;
- RowSlotChunk* chunk = static_cast<RowSlotChunk*>(
- offsetToPtr(mHeader->firstChunkOffset));
- while (chunkPos > ROW_SLOT_CHUNK_NUM_ROWS) {
- chunk = static_cast<RowSlotChunk*>(offsetToPtr(chunk->nextChunkOffset));
- chunkPos -= ROW_SLOT_CHUNK_NUM_ROWS;
- }
- if (chunkPos == ROW_SLOT_CHUNK_NUM_ROWS) {
- if (!chunk->nextChunkOffset) {
- chunk->nextChunkOffset = alloc(sizeof(RowSlotChunk), true /*aligned*/);
- if (!chunk->nextChunkOffset) {
- return NULL;
- }
- }
- chunk = static_cast<RowSlotChunk*>(offsetToPtr(chunk->nextChunkOffset));
- chunk->nextChunkOffset = 0;
- chunkPos = 0;
- }
- mHeader->numRows += 1;
- return &chunk->slots[chunkPos];
-}
-
-CursorWindow::FieldSlot* CursorWindow::getFieldSlot(uint32_t row, uint32_t column) {
- if (row >= mHeader->numRows || column >= mHeader->numColumns) {
- ALOGE("Failed to read row %d, column %d from a CursorWindow which "
- "has %d rows, %d columns.",
- row, column, mHeader->numRows, mHeader->numColumns);
- return NULL;
- }
- RowSlot* rowSlot = getRowSlot(row);
- if (!rowSlot) {
- ALOGE("Failed to find rowSlot for row %d.", row);
- return NULL;
- }
- FieldSlot* fieldDir = static_cast<FieldSlot*>(offsetToPtr(rowSlot->offset));
- return &fieldDir[column];
-}
-
-status_t CursorWindow::putBlob(uint32_t row, uint32_t column, const void* value, size_t size) {
- return putBlobOrString(row, column, value, size, FIELD_TYPE_BLOB);
-}
-
-status_t CursorWindow::putString(uint32_t row, uint32_t column, const char* value,
- size_t sizeIncludingNull) {
- return putBlobOrString(row, column, value, sizeIncludingNull, FIELD_TYPE_STRING);
-}
-
-status_t CursorWindow::putBlobOrString(uint32_t row, uint32_t column,
- const void* value, size_t size, int32_t type) {
- if (mReadOnly) {
- return INVALID_OPERATION;
- }
-
- FieldSlot* fieldSlot = getFieldSlot(row, column);
- if (!fieldSlot) {
- return BAD_VALUE;
- }
-
- uint32_t offset = alloc(size);
- if (!offset) {
- return NO_MEMORY;
- }
-
- memcpy(offsetToPtr(offset), value, size);
-
- fieldSlot->type = type;
- fieldSlot->data.buffer.offset = offset;
- fieldSlot->data.buffer.size = size;
- return OK;
-}
-
-status_t CursorWindow::putLong(uint32_t row, uint32_t column, int64_t value) {
- if (mReadOnly) {
- return INVALID_OPERATION;
- }
-
- FieldSlot* fieldSlot = getFieldSlot(row, column);
- if (!fieldSlot) {
- return BAD_VALUE;
- }
-
- fieldSlot->type = FIELD_TYPE_INTEGER;
- fieldSlot->data.l = value;
- return OK;
-}
-
-status_t CursorWindow::putDouble(uint32_t row, uint32_t column, double value) {
- if (mReadOnly) {
- return INVALID_OPERATION;
- }
-
- FieldSlot* fieldSlot = getFieldSlot(row, column);
- if (!fieldSlot) {
- return BAD_VALUE;
- }
-
- fieldSlot->type = FIELD_TYPE_FLOAT;
- fieldSlot->data.d = value;
- return OK;
-}
-
-status_t CursorWindow::putNull(uint32_t row, uint32_t column) {
- if (mReadOnly) {
- return INVALID_OPERATION;
- }
-
- FieldSlot* fieldSlot = getFieldSlot(row, column);
- if (!fieldSlot) {
- return BAD_VALUE;
- }
-
- fieldSlot->type = FIELD_TYPE_NULL;
- fieldSlot->data.buffer.offset = 0;
- fieldSlot->data.buffer.size = 0;
- return OK;
-}
-
-}; // namespace android
diff --git a/libs/androidfw/MODULE_LICENSE_APACHE2 b/libs/androidfw/MODULE_LICENSE_APACHE2
deleted file mode 100644
index e69de29..0000000
--- a/libs/androidfw/MODULE_LICENSE_APACHE2
+++ /dev/null
diff --git a/libs/androidfw/NOTICE b/libs/androidfw/NOTICE
deleted file mode 100644
index c5b1efa..0000000
--- a/libs/androidfw/NOTICE
+++ /dev/null
@@ -1,190 +0,0 @@
-
- Copyright (c) 2005-2008, The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-
-
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
diff --git a/libs/androidfw/ObbFile.cpp b/libs/androidfw/ObbFile.cpp
deleted file mode 100644
index ec59f06..0000000
--- a/libs/androidfw/ObbFile.cpp
+++ /dev/null
@@ -1,345 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <errno.h>
-#include <fcntl.h>
-#include <stdint.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#define LOG_TAG "ObbFile"
-
-#include <androidfw/ObbFile.h>
-#include <utils/Compat.h>
-#include <utils/Log.h>
-
-//#define DEBUG 1
-
-#define kFooterTagSize 8 /* last two 32-bit integers */
-
-#define kFooterMinSize 33 /* 32-bit signature version (4 bytes)
- * 32-bit package version (4 bytes)
- * 32-bit flags (4 bytes)
- * 64-bit salt (8 bytes)
- * 32-bit package name size (4 bytes)
- * >=1-character package name (1 byte)
- * 32-bit footer size (4 bytes)
- * 32-bit footer marker (4 bytes)
- */
-
-#define kMaxBufSize 32768 /* Maximum file read buffer */
-
-#define kSignature 0x01059983U /* ObbFile signature */
-
-#define kSigVersion 1 /* We only know about signature version 1 */
-
-/* offsets in version 1 of the header */
-#define kPackageVersionOffset 4
-#define kFlagsOffset 8
-#define kSaltOffset 12
-#define kPackageNameLenOffset 20
-#define kPackageNameOffset 24
-
-/*
- * TEMP_FAILURE_RETRY is defined by some, but not all, versions of
- * <unistd.h>. (Alas, it is not as standard as we'd hoped!) So, if it's
- * not already defined, then define it here.
- */
-#ifndef TEMP_FAILURE_RETRY
-/* Used to retry syscalls that can return EINTR. */
-#define TEMP_FAILURE_RETRY(exp) ({ \
- typeof (exp) _rc; \
- do { \
- _rc = (exp); \
- } while (_rc == -1 && errno == EINTR); \
- _rc; })
-#endif
-
-
-namespace android {
-
-ObbFile::ObbFile()
- : mPackageName("")
- , mVersion(-1)
- , mFlags(0)
-{
- memset(mSalt, 0, sizeof(mSalt));
-}
-
-ObbFile::~ObbFile() {
-}
-
-bool ObbFile::readFrom(const char* filename)
-{
- int fd;
- bool success = false;
-
- fd = ::open(filename, O_RDONLY);
- if (fd < 0) {
- ALOGW("couldn't open file %s: %s", filename, strerror(errno));
- goto out;
- }
- success = readFrom(fd);
- close(fd);
-
- if (!success) {
- ALOGW("failed to read from %s (fd=%d)\n", filename, fd);
- }
-
-out:
- return success;
-}
-
-bool ObbFile::readFrom(int fd)
-{
- if (fd < 0) {
- ALOGW("attempt to read from invalid fd\n");
- return false;
- }
-
- return parseObbFile(fd);
-}
-
-bool ObbFile::parseObbFile(int fd)
-{
- off64_t fileLength = lseek64(fd, 0, SEEK_END);
-
- if (fileLength < kFooterMinSize) {
- if (fileLength < 0) {
- ALOGW("error seeking in ObbFile: %s\n", strerror(errno));
- } else {
- ALOGW("file is only %lld (less than %d minimum)\n", fileLength, kFooterMinSize);
- }
- return false;
- }
-
- ssize_t actual;
- size_t footerSize;
-
- {
- lseek64(fd, fileLength - kFooterTagSize, SEEK_SET);
-
- char footer[kFooterTagSize];
- actual = TEMP_FAILURE_RETRY(read(fd, footer, kFooterTagSize));
- if (actual != kFooterTagSize) {
- ALOGW("couldn't read footer signature: %s\n", strerror(errno));
- return false;
- }
-
- unsigned int fileSig = get4LE((unsigned char*)footer + sizeof(int32_t));
- if (fileSig != kSignature) {
- ALOGW("footer didn't match magic string (expected 0x%08x; got 0x%08x)\n",
- kSignature, fileSig);
- return false;
- }
-
- footerSize = get4LE((unsigned char*)footer);
- if (footerSize > (size_t)fileLength - kFooterTagSize
- || footerSize > kMaxBufSize) {
- ALOGW("claimed footer size is too large (0x%08zx; file size is 0x%08llx)\n",
- footerSize, fileLength);
- return false;
- }
-
- if (footerSize < (kFooterMinSize - kFooterTagSize)) {
- ALOGW("claimed footer size is too small (0x%zx; minimum size is 0x%x)\n",
- footerSize, kFooterMinSize - kFooterTagSize);
- return false;
- }
- }
-
- off64_t fileOffset = fileLength - footerSize - kFooterTagSize;
- if (lseek64(fd, fileOffset, SEEK_SET) != fileOffset) {
- ALOGW("seek %lld failed: %s\n", fileOffset, strerror(errno));
- return false;
- }
-
- mFooterStart = fileOffset;
-
- char* scanBuf = (char*)malloc(footerSize);
- if (scanBuf == NULL) {
- ALOGW("couldn't allocate scanBuf: %s\n", strerror(errno));
- return false;
- }
-
- actual = TEMP_FAILURE_RETRY(read(fd, scanBuf, footerSize));
- // readAmount is guaranteed to be less than kMaxBufSize
- if (actual != (ssize_t)footerSize) {
- ALOGI("couldn't read ObbFile footer: %s\n", strerror(errno));
- free(scanBuf);
- return false;
- }
-
-#ifdef DEBUG
- for (int i = 0; i < footerSize; ++i) {
- ALOGI("char: 0x%02x\n", scanBuf[i]);
- }
-#endif
-
- uint32_t sigVersion = get4LE((unsigned char*)scanBuf);
- if (sigVersion != kSigVersion) {
- ALOGW("Unsupported ObbFile version %d\n", sigVersion);
- free(scanBuf);
- return false;
- }
-
- mVersion = (int32_t) get4LE((unsigned char*)scanBuf + kPackageVersionOffset);
- mFlags = (int32_t) get4LE((unsigned char*)scanBuf + kFlagsOffset);
-
- memcpy(&mSalt, (unsigned char*)scanBuf + kSaltOffset, sizeof(mSalt));
-
- size_t packageNameLen = get4LE((unsigned char*)scanBuf + kPackageNameLenOffset);
- if (packageNameLen == 0
- || packageNameLen > (footerSize - kPackageNameOffset)) {
- ALOGW("bad ObbFile package name length (0x%04zx; 0x%04zx possible)\n",
- packageNameLen, footerSize - kPackageNameOffset);
- free(scanBuf);
- return false;
- }
-
- char* packageName = reinterpret_cast<char*>(scanBuf + kPackageNameOffset);
- mPackageName = String8(const_cast<char*>(packageName), packageNameLen);
-
- free(scanBuf);
-
-#ifdef DEBUG
- ALOGI("Obb scan succeeded: packageName=%s, version=%d\n", mPackageName.string(), mVersion);
-#endif
-
- return true;
-}
-
-bool ObbFile::writeTo(const char* filename)
-{
- int fd;
- bool success = false;
-
- fd = ::open(filename, O_WRONLY);
- if (fd < 0) {
- goto out;
- }
- success = writeTo(fd);
- close(fd);
-
-out:
- if (!success) {
- ALOGW("failed to write to %s: %s\n", filename, strerror(errno));
- }
- return success;
-}
-
-bool ObbFile::writeTo(int fd)
-{
- if (fd < 0) {
- return false;
- }
-
- lseek64(fd, 0, SEEK_END);
-
- if (mPackageName.size() == 0 || mVersion == -1) {
- ALOGW("tried to write uninitialized ObbFile data\n");
- return false;
- }
-
- unsigned char intBuf[sizeof(uint32_t)+1];
- memset(&intBuf, 0, sizeof(intBuf));
-
- put4LE(intBuf, kSigVersion);
- if (write(fd, &intBuf, sizeof(uint32_t)) != (ssize_t)sizeof(uint32_t)) {
- ALOGW("couldn't write signature version: %s\n", strerror(errno));
- return false;
- }
-
- put4LE(intBuf, mVersion);
- if (write(fd, &intBuf, sizeof(uint32_t)) != (ssize_t)sizeof(uint32_t)) {
- ALOGW("couldn't write package version\n");
- return false;
- }
-
- put4LE(intBuf, mFlags);
- if (write(fd, &intBuf, sizeof(uint32_t)) != (ssize_t)sizeof(uint32_t)) {
- ALOGW("couldn't write package version\n");
- return false;
- }
-
- if (write(fd, mSalt, sizeof(mSalt)) != (ssize_t)sizeof(mSalt)) {
- ALOGW("couldn't write salt: %s\n", strerror(errno));
- return false;
- }
-
- size_t packageNameLen = mPackageName.size();
- put4LE(intBuf, packageNameLen);
- if (write(fd, &intBuf, sizeof(uint32_t)) != (ssize_t)sizeof(uint32_t)) {
- ALOGW("couldn't write package name length: %s\n", strerror(errno));
- return false;
- }
-
- if (write(fd, mPackageName.string(), packageNameLen) != (ssize_t)packageNameLen) {
- ALOGW("couldn't write package name: %s\n", strerror(errno));
- return false;
- }
-
- put4LE(intBuf, kPackageNameOffset + packageNameLen);
- if (write(fd, &intBuf, sizeof(uint32_t)) != (ssize_t)sizeof(uint32_t)) {
- ALOGW("couldn't write footer size: %s\n", strerror(errno));
- return false;
- }
-
- put4LE(intBuf, kSignature);
- if (write(fd, &intBuf, sizeof(uint32_t)) != (ssize_t)sizeof(uint32_t)) {
- ALOGW("couldn't write footer magic signature: %s\n", strerror(errno));
- return false;
- }
-
- return true;
-}
-
-bool ObbFile::removeFrom(const char* filename)
-{
- int fd;
- bool success = false;
-
- fd = ::open(filename, O_RDWR);
- if (fd < 0) {
- goto out;
- }
- success = removeFrom(fd);
- close(fd);
-
-out:
- if (!success) {
- ALOGW("failed to remove signature from %s: %s\n", filename, strerror(errno));
- }
- return success;
-}
-
-bool ObbFile::removeFrom(int fd)
-{
- if (fd < 0) {
- return false;
- }
-
- if (!readFrom(fd)) {
- return false;
- }
-
- ftruncate(fd, mFooterStart);
-
- return true;
-}
-
-}
diff --git a/libs/androidfw/ResourceTypes.cpp b/libs/androidfw/ResourceTypes.cpp
deleted file mode 100644
index 1cc3563..0000000
--- a/libs/androidfw/ResourceTypes.cpp
+++ /dev/null
@@ -1,5796 +0,0 @@
-/*
- * 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.
- */
-
-#define LOG_TAG "ResourceType"
-//#define LOG_NDEBUG 0
-
-#include <androidfw/ResourceTypes.h>
-#include <utils/Atomic.h>
-#include <utils/ByteOrder.h>
-#include <utils/Debug.h>
-#include <utils/Log.h>
-#include <utils/String16.h>
-#include <utils/String8.h>
-
-#include <stdlib.h>
-#include <string.h>
-#include <memory.h>
-#include <ctype.h>
-#include <stdint.h>
-
-#ifndef INT32_MAX
-#define INT32_MAX ((int32_t)(2147483647))
-#endif
-
-#define STRING_POOL_NOISY(x) //x
-#define XML_NOISY(x) //x
-#define TABLE_NOISY(x) //x
-#define TABLE_GETENTRY(x) //x
-#define TABLE_SUPER_NOISY(x) //x
-#define LOAD_TABLE_NOISY(x) //x
-#define TABLE_THEME(x) //x
-
-namespace android {
-
-#ifdef HAVE_WINSOCK
-#undef nhtol
-#undef htonl
-
-#ifdef HAVE_LITTLE_ENDIAN
-#define ntohl(x) ( ((x) << 24) | (((x) >> 24) & 255) | (((x) << 8) & 0xff0000) | (((x) >> 8) & 0xff00) )
-#define htonl(x) ntohl(x)
-#define ntohs(x) ( (((x) << 8) & 0xff00) | (((x) >> 8) & 255) )
-#define htons(x) ntohs(x)
-#else
-#define ntohl(x) (x)
-#define htonl(x) (x)
-#define ntohs(x) (x)
-#define htons(x) (x)
-#endif
-#endif
-
-#define IDMAP_MAGIC 0x706d6469
-// size measured in sizeof(uint32_t)
-#define IDMAP_HEADER_SIZE (ResTable::IDMAP_HEADER_SIZE_BYTES / sizeof(uint32_t))
-
-static void printToLogFunc(void* cookie, const char* txt)
-{
- ALOGV("%s", txt);
-}
-
-// Standard C isspace() is only required to look at the low byte of its input, so
-// produces incorrect results for UTF-16 characters. For safety's sake, assume that
-// any high-byte UTF-16 code point is not whitespace.
-inline int isspace16(char16_t c) {
- return (c < 0x0080 && isspace(c));
-}
-
-// range checked; guaranteed to NUL-terminate within the stated number of available slots
-// NOTE: if this truncates the dst string due to running out of space, no attempt is
-// made to avoid splitting surrogate pairs.
-static void strcpy16_dtoh(uint16_t* dst, const uint16_t* src, size_t avail)
-{
- uint16_t* last = dst + avail - 1;
- while (*src && (dst < last)) {
- char16_t s = dtohs(*src);
- *dst++ = s;
- src++;
- }
- *dst = 0;
-}
-
-static status_t validate_chunk(const ResChunk_header* chunk,
- size_t minSize,
- const uint8_t* dataEnd,
- const char* name)
-{
- const uint16_t headerSize = dtohs(chunk->headerSize);
- const uint32_t size = dtohl(chunk->size);
-
- if (headerSize >= minSize) {
- if (headerSize <= size) {
- if (((headerSize|size)&0x3) == 0) {
- if ((ssize_t)size <= (dataEnd-((const uint8_t*)chunk))) {
- return NO_ERROR;
- }
- ALOGW("%s data size %p extends beyond resource end %p.",
- name, (void*)size,
- (void*)(dataEnd-((const uint8_t*)chunk)));
- return BAD_TYPE;
- }
- ALOGW("%s size 0x%x or headerSize 0x%x is not on an integer boundary.",
- name, (int)size, (int)headerSize);
- return BAD_TYPE;
- }
- ALOGW("%s size %p is smaller than header size %p.",
- name, (void*)size, (void*)(int)headerSize);
- return BAD_TYPE;
- }
- ALOGW("%s header size %p is too small.",
- name, (void*)(int)headerSize);
- return BAD_TYPE;
-}
-
-inline void Res_value::copyFrom_dtoh(const Res_value& src)
-{
- size = dtohs(src.size);
- res0 = src.res0;
- dataType = src.dataType;
- data = dtohl(src.data);
-}
-
-void Res_png_9patch::deviceToFile()
-{
- for (int i = 0; i < numXDivs; i++) {
- xDivs[i] = htonl(xDivs[i]);
- }
- for (int i = 0; i < numYDivs; i++) {
- yDivs[i] = htonl(yDivs[i]);
- }
- paddingLeft = htonl(paddingLeft);
- paddingRight = htonl(paddingRight);
- paddingTop = htonl(paddingTop);
- paddingBottom = htonl(paddingBottom);
- for (int i=0; i<numColors; i++) {
- colors[i] = htonl(colors[i]);
- }
-}
-
-void Res_png_9patch::fileToDevice()
-{
- for (int i = 0; i < numXDivs; i++) {
- xDivs[i] = ntohl(xDivs[i]);
- }
- for (int i = 0; i < numYDivs; i++) {
- yDivs[i] = ntohl(yDivs[i]);
- }
- paddingLeft = ntohl(paddingLeft);
- paddingRight = ntohl(paddingRight);
- paddingTop = ntohl(paddingTop);
- paddingBottom = ntohl(paddingBottom);
- for (int i=0; i<numColors; i++) {
- colors[i] = ntohl(colors[i]);
- }
-}
-
-size_t Res_png_9patch::serializedSize()
-{
- // The size of this struct is 32 bytes on the 32-bit target system
- // 4 * int8_t
- // 4 * int32_t
- // 3 * pointer
- return 32
- + numXDivs * sizeof(int32_t)
- + numYDivs * sizeof(int32_t)
- + numColors * sizeof(uint32_t);
-}
-
-void* Res_png_9patch::serialize()
-{
- // Use calloc since we're going to leave a few holes in the data
- // and want this to run cleanly under valgrind
- void* newData = calloc(1, serializedSize());
- serialize(newData);
- return newData;
-}
-
-void Res_png_9patch::serialize(void * outData)
-{
- char* data = (char*) outData;
- memmove(data, &wasDeserialized, 4); // copy wasDeserialized, numXDivs, numYDivs, numColors
- memmove(data + 12, &paddingLeft, 16); // copy paddingXXXX
- data += 32;
-
- memmove(data, this->xDivs, numXDivs * sizeof(int32_t));
- data += numXDivs * sizeof(int32_t);
- memmove(data, this->yDivs, numYDivs * sizeof(int32_t));
- data += numYDivs * sizeof(int32_t);
- memmove(data, this->colors, numColors * sizeof(uint32_t));
-}
-
-static void deserializeInternal(const void* inData, Res_png_9patch* outData) {
- char* patch = (char*) inData;
- if (inData != outData) {
- memmove(&outData->wasDeserialized, patch, 4); // copy wasDeserialized, numXDivs, numYDivs, numColors
- memmove(&outData->paddingLeft, patch + 12, 4); // copy wasDeserialized, numXDivs, numYDivs, numColors
- }
- outData->wasDeserialized = true;
- char* data = (char*)outData;
- data += sizeof(Res_png_9patch);
- outData->xDivs = (int32_t*) data;
- data += outData->numXDivs * sizeof(int32_t);
- outData->yDivs = (int32_t*) data;
- data += outData->numYDivs * sizeof(int32_t);
- outData->colors = (uint32_t*) data;
-}
-
-static bool assertIdmapHeader(const uint32_t* map, size_t sizeBytes)
-{
- if (sizeBytes < ResTable::IDMAP_HEADER_SIZE_BYTES) {
- ALOGW("idmap assertion failed: size=%d bytes\n", (int)sizeBytes);
- return false;
- }
- if (*map != htodl(IDMAP_MAGIC)) { // htodl: map data expected to be in correct endianess
- ALOGW("idmap assertion failed: invalid magic found (is 0x%08x, expected 0x%08x)\n",
- *map, htodl(IDMAP_MAGIC));
- return false;
- }
- return true;
-}
-
-static status_t idmapLookup(const uint32_t* map, size_t sizeBytes, uint32_t key, uint32_t* outValue)
-{
- // see README for details on the format of map
- if (!assertIdmapHeader(map, sizeBytes)) {
- return UNKNOWN_ERROR;
- }
- map = map + IDMAP_HEADER_SIZE; // skip ahead to data segment
- // size of data block, in uint32_t
- const size_t size = (sizeBytes - ResTable::IDMAP_HEADER_SIZE_BYTES) / sizeof(uint32_t);
- const uint32_t type = Res_GETTYPE(key) + 1; // add one, idmap stores "public" type id
- const uint32_t entry = Res_GETENTRY(key);
- const uint32_t typeCount = *map;
-
- if (type > typeCount) {
- ALOGW("Resource ID map: type=%d exceeds number of types=%d\n", type, typeCount);
- return UNKNOWN_ERROR;
- }
- if (typeCount > size) {
- ALOGW("Resource ID map: number of types=%d exceeds size of map=%d\n", typeCount, (int)size);
- return UNKNOWN_ERROR;
- }
- const uint32_t typeOffset = map[type];
- if (typeOffset == 0) {
- *outValue = 0;
- return NO_ERROR;
- }
- if (typeOffset + 1 > size) {
- ALOGW("Resource ID map: type offset=%d exceeds reasonable value, size of map=%d\n",
- typeOffset, (int)size);
- return UNKNOWN_ERROR;
- }
- const uint32_t entryCount = map[typeOffset];
- const uint32_t entryOffset = map[typeOffset + 1];
- if (entryCount == 0 || entry < entryOffset || entry - entryOffset > entryCount - 1) {
- *outValue = 0;
- return NO_ERROR;
- }
- const uint32_t index = typeOffset + 2 + entry - entryOffset;
- if (index > size) {
- ALOGW("Resource ID map: entry index=%d exceeds size of map=%d\n", index, (int)size);
- *outValue = 0;
- return NO_ERROR;
- }
- *outValue = map[index];
-
- return NO_ERROR;
-}
-
-static status_t getIdmapPackageId(const uint32_t* map, size_t mapSize, uint32_t *outId)
-{
- if (!assertIdmapHeader(map, mapSize)) {
- return UNKNOWN_ERROR;
- }
- const uint32_t* p = map + IDMAP_HEADER_SIZE + 1;
- while (*p == 0) {
- ++p;
- }
- *outId = (map[*p + IDMAP_HEADER_SIZE + 2] >> 24) & 0x000000ff;
- return NO_ERROR;
-}
-
-Res_png_9patch* Res_png_9patch::deserialize(const void* inData)
-{
- if (sizeof(void*) != sizeof(int32_t)) {
- ALOGE("Cannot deserialize on non 32-bit system\n");
- return NULL;
- }
- deserializeInternal(inData, (Res_png_9patch*) inData);
- return (Res_png_9patch*) inData;
-}
-
-// --------------------------------------------------------------------
-// --------------------------------------------------------------------
-// --------------------------------------------------------------------
-
-ResStringPool::ResStringPool()
- : mError(NO_INIT), mOwnedData(NULL), mHeader(NULL), mCache(NULL)
-{
-}
-
-ResStringPool::ResStringPool(const void* data, size_t size, bool copyData)
- : mError(NO_INIT), mOwnedData(NULL), mHeader(NULL), mCache(NULL)
-{
- setTo(data, size, copyData);
-}
-
-ResStringPool::~ResStringPool()
-{
- uninit();
-}
-
-status_t ResStringPool::setTo(const void* data, size_t size, bool copyData)
-{
- if (!data || !size) {
- return (mError=BAD_TYPE);
- }
-
- uninit();
-
- const bool notDeviceEndian = htods(0xf0) != 0xf0;
-
- if (copyData || notDeviceEndian) {
- mOwnedData = malloc(size);
- if (mOwnedData == NULL) {
- return (mError=NO_MEMORY);
- }
- memcpy(mOwnedData, data, size);
- data = mOwnedData;
- }
-
- mHeader = (const ResStringPool_header*)data;
-
- if (notDeviceEndian) {
- ResStringPool_header* h = const_cast<ResStringPool_header*>(mHeader);
- h->header.headerSize = dtohs(mHeader->header.headerSize);
- h->header.type = dtohs(mHeader->header.type);
- h->header.size = dtohl(mHeader->header.size);
- h->stringCount = dtohl(mHeader->stringCount);
- h->styleCount = dtohl(mHeader->styleCount);
- h->flags = dtohl(mHeader->flags);
- h->stringsStart = dtohl(mHeader->stringsStart);
- h->stylesStart = dtohl(mHeader->stylesStart);
- }
-
- if (mHeader->header.headerSize > mHeader->header.size
- || mHeader->header.size > size) {
- ALOGW("Bad string block: header size %d or total size %d is larger than data size %d\n",
- (int)mHeader->header.headerSize, (int)mHeader->header.size, (int)size);
- return (mError=BAD_TYPE);
- }
- mSize = mHeader->header.size;
- mEntries = (const uint32_t*)
- (((const uint8_t*)data)+mHeader->header.headerSize);
-
- if (mHeader->stringCount > 0) {
- if ((mHeader->stringCount*sizeof(uint32_t) < mHeader->stringCount) // uint32 overflow?
- || (mHeader->header.headerSize+(mHeader->stringCount*sizeof(uint32_t)))
- > size) {
- ALOGW("Bad string block: entry of %d items extends past data size %d\n",
- (int)(mHeader->header.headerSize+(mHeader->stringCount*sizeof(uint32_t))),
- (int)size);
- return (mError=BAD_TYPE);
- }
-
- size_t charSize;
- if (mHeader->flags&ResStringPool_header::UTF8_FLAG) {
- charSize = sizeof(uint8_t);
- } else {
- charSize = sizeof(char16_t);
- }
-
- mStrings = (const void*)
- (((const uint8_t*)data)+mHeader->stringsStart);
- if (mHeader->stringsStart >= (mHeader->header.size-sizeof(uint16_t))) {
- ALOGW("Bad string block: string pool starts at %d, after total size %d\n",
- (int)mHeader->stringsStart, (int)mHeader->header.size);
- return (mError=BAD_TYPE);
- }
- if (mHeader->styleCount == 0) {
- mStringPoolSize =
- (mHeader->header.size-mHeader->stringsStart)/charSize;
- } else {
- // check invariant: styles starts before end of data
- if (mHeader->stylesStart >= (mHeader->header.size-sizeof(uint16_t))) {
- ALOGW("Bad style block: style block starts at %d past data size of %d\n",
- (int)mHeader->stylesStart, (int)mHeader->header.size);
- return (mError=BAD_TYPE);
- }
- // check invariant: styles follow the strings
- if (mHeader->stylesStart <= mHeader->stringsStart) {
- ALOGW("Bad style block: style block starts at %d, before strings at %d\n",
- (int)mHeader->stylesStart, (int)mHeader->stringsStart);
- return (mError=BAD_TYPE);
- }
- mStringPoolSize =
- (mHeader->stylesStart-mHeader->stringsStart)/charSize;
- }
-
- // check invariant: stringCount > 0 requires a string pool to exist
- if (mStringPoolSize == 0) {
- ALOGW("Bad string block: stringCount is %d but pool size is 0\n", (int)mHeader->stringCount);
- return (mError=BAD_TYPE);
- }
-
- if (notDeviceEndian) {
- size_t i;
- uint32_t* e = const_cast<uint32_t*>(mEntries);
- for (i=0; i<mHeader->stringCount; i++) {
- e[i] = dtohl(mEntries[i]);
- }
- if (!(mHeader->flags&ResStringPool_header::UTF8_FLAG)) {
- const char16_t* strings = (const char16_t*)mStrings;
- char16_t* s = const_cast<char16_t*>(strings);
- for (i=0; i<mStringPoolSize; i++) {
- s[i] = dtohs(strings[i]);
- }
- }
- }
-
- if ((mHeader->flags&ResStringPool_header::UTF8_FLAG &&
- ((uint8_t*)mStrings)[mStringPoolSize-1] != 0) ||
- (!mHeader->flags&ResStringPool_header::UTF8_FLAG &&
- ((char16_t*)mStrings)[mStringPoolSize-1] != 0)) {
- ALOGW("Bad string block: last string is not 0-terminated\n");
- return (mError=BAD_TYPE);
- }
- } else {
- mStrings = NULL;
- mStringPoolSize = 0;
- }
-
- if (mHeader->styleCount > 0) {
- mEntryStyles = mEntries + mHeader->stringCount;
- // invariant: integer overflow in calculating mEntryStyles
- if (mEntryStyles < mEntries) {
- ALOGW("Bad string block: integer overflow finding styles\n");
- return (mError=BAD_TYPE);
- }
-
- if (((const uint8_t*)mEntryStyles-(const uint8_t*)mHeader) > (int)size) {
- ALOGW("Bad string block: entry of %d styles extends past data size %d\n",
- (int)((const uint8_t*)mEntryStyles-(const uint8_t*)mHeader),
- (int)size);
- return (mError=BAD_TYPE);
- }
- mStyles = (const uint32_t*)
- (((const uint8_t*)data)+mHeader->stylesStart);
- if (mHeader->stylesStart >= mHeader->header.size) {
- ALOGW("Bad string block: style pool starts %d, after total size %d\n",
- (int)mHeader->stylesStart, (int)mHeader->header.size);
- return (mError=BAD_TYPE);
- }
- mStylePoolSize =
- (mHeader->header.size-mHeader->stylesStart)/sizeof(uint32_t);
-
- if (notDeviceEndian) {
- size_t i;
- uint32_t* e = const_cast<uint32_t*>(mEntryStyles);
- for (i=0; i<mHeader->styleCount; i++) {
- e[i] = dtohl(mEntryStyles[i]);
- }
- uint32_t* s = const_cast<uint32_t*>(mStyles);
- for (i=0; i<mStylePoolSize; i++) {
- s[i] = dtohl(mStyles[i]);
- }
- }
-
- const ResStringPool_span endSpan = {
- { htodl(ResStringPool_span::END) },
- htodl(ResStringPool_span::END), htodl(ResStringPool_span::END)
- };
- if (memcmp(&mStyles[mStylePoolSize-(sizeof(endSpan)/sizeof(uint32_t))],
- &endSpan, sizeof(endSpan)) != 0) {
- ALOGW("Bad string block: last style is not 0xFFFFFFFF-terminated\n");
- return (mError=BAD_TYPE);
- }
- } else {
- mEntryStyles = NULL;
- mStyles = NULL;
- mStylePoolSize = 0;
- }
-
- return (mError=NO_ERROR);
-}
-
-status_t ResStringPool::getError() const
-{
- return mError;
-}
-
-void ResStringPool::uninit()
-{
- mError = NO_INIT;
- if (mHeader != NULL && mCache != NULL) {
- for (size_t x = 0; x < mHeader->stringCount; x++) {
- if (mCache[x] != NULL) {
- free(mCache[x]);
- mCache[x] = NULL;
- }
- }
- free(mCache);
- mCache = NULL;
- }
- if (mOwnedData) {
- free(mOwnedData);
- mOwnedData = NULL;
- }
-}
-
-/**
- * Strings in UTF-16 format have length indicated by a length encoded in the
- * stored data. It is either 1 or 2 characters of length data. This allows a
- * maximum length of 0x7FFFFFF (2147483647 bytes), but if you're storing that
- * much data in a string, you're abusing them.
- *
- * If the high bit is set, then there are two characters or 4 bytes of length
- * data encoded. In that case, drop the high bit of the first character and
- * add it together with the next character.
- */
-static inline size_t
-decodeLength(const char16_t** str)
-{
- size_t len = **str;
- if ((len & 0x8000) != 0) {
- (*str)++;
- len = ((len & 0x7FFF) << 16) | **str;
- }
- (*str)++;
- return len;
-}
-
-/**
- * Strings in UTF-8 format have length indicated by a length encoded in the
- * stored data. It is either 1 or 2 characters of length data. This allows a
- * maximum length of 0x7FFF (32767 bytes), but you should consider storing
- * text in another way if you're using that much data in a single string.
- *
- * If the high bit is set, then there are two characters or 2 bytes of length
- * data encoded. In that case, drop the high bit of the first character and
- * add it together with the next character.
- */
-static inline size_t
-decodeLength(const uint8_t** str)
-{
- size_t len = **str;
- if ((len & 0x80) != 0) {
- (*str)++;
- len = ((len & 0x7F) << 8) | **str;
- }
- (*str)++;
- return len;
-}
-
-const uint16_t* ResStringPool::stringAt(size_t idx, size_t* u16len) const
-{
- if (mError == NO_ERROR && idx < mHeader->stringCount) {
- const bool isUTF8 = (mHeader->flags&ResStringPool_header::UTF8_FLAG) != 0;
- const uint32_t off = mEntries[idx]/(isUTF8?sizeof(char):sizeof(char16_t));
- if (off < (mStringPoolSize-1)) {
- if (!isUTF8) {
- const char16_t* strings = (char16_t*)mStrings;
- const char16_t* str = strings+off;
-
- *u16len = decodeLength(&str);
- if ((uint32_t)(str+*u16len-strings) < mStringPoolSize) {
- return str;
- } else {
- ALOGW("Bad string block: string #%d extends to %d, past end at %d\n",
- (int)idx, (int)(str+*u16len-strings), (int)mStringPoolSize);
- }
- } else {
- const uint8_t* strings = (uint8_t*)mStrings;
- const uint8_t* u8str = strings+off;
-
- *u16len = decodeLength(&u8str);
- size_t u8len = decodeLength(&u8str);
-
- // encLen must be less than 0x7FFF due to encoding.
- if ((uint32_t)(u8str+u8len-strings) < mStringPoolSize) {
- AutoMutex lock(mDecodeLock);
-
- if (mCache == NULL) {
-#ifndef HAVE_ANDROID_OS
- STRING_POOL_NOISY(ALOGI("CREATING STRING CACHE OF %d bytes",
- mHeader->stringCount*sizeof(char16_t**)));
-#else
- // We do not want to be in this case when actually running Android.
- ALOGW("CREATING STRING CACHE OF %d bytes",
- mHeader->stringCount*sizeof(char16_t**));
-#endif
- mCache = (char16_t**)calloc(mHeader->stringCount, sizeof(char16_t**));
- if (mCache == NULL) {
- ALOGW("No memory trying to allocate decode cache table of %d bytes\n",
- (int)(mHeader->stringCount*sizeof(char16_t**)));
- return NULL;
- }
- }
-
- if (mCache[idx] != NULL) {
- return mCache[idx];
- }
-
- ssize_t actualLen = utf8_to_utf16_length(u8str, u8len);
- if (actualLen < 0 || (size_t)actualLen != *u16len) {
- ALOGW("Bad string block: string #%lld decoded length is not correct "
- "%lld vs %llu\n",
- (long long)idx, (long long)actualLen, (long long)*u16len);
- return NULL;
- }
-
- char16_t *u16str = (char16_t *)calloc(*u16len+1, sizeof(char16_t));
- if (!u16str) {
- ALOGW("No memory when trying to allocate decode cache for string #%d\n",
- (int)idx);
- return NULL;
- }
-
- STRING_POOL_NOISY(ALOGI("Caching UTF8 string: %s", u8str));
- utf8_to_utf16(u8str, u8len, u16str);
- mCache[idx] = u16str;
- return u16str;
- } else {
- ALOGW("Bad string block: string #%lld extends to %lld, past end at %lld\n",
- (long long)idx, (long long)(u8str+u8len-strings),
- (long long)mStringPoolSize);
- }
- }
- } else {
- ALOGW("Bad string block: string #%d entry is at %d, past end at %d\n",
- (int)idx, (int)(off*sizeof(uint16_t)),
- (int)(mStringPoolSize*sizeof(uint16_t)));
- }
- }
- return NULL;
-}
-
-const char* ResStringPool::string8At(size_t idx, size_t* outLen) const
-{
- if (mError == NO_ERROR && idx < mHeader->stringCount) {
- if ((mHeader->flags&ResStringPool_header::UTF8_FLAG) == 0) {
- return NULL;
- }
- const uint32_t off = mEntries[idx]/sizeof(char);
- if (off < (mStringPoolSize-1)) {
- const uint8_t* strings = (uint8_t*)mStrings;
- const uint8_t* str = strings+off;
- *outLen = decodeLength(&str);
- size_t encLen = decodeLength(&str);
- if ((uint32_t)(str+encLen-strings) < mStringPoolSize) {
- return (const char*)str;
- } else {
- ALOGW("Bad string block: string #%d extends to %d, past end at %d\n",
- (int)idx, (int)(str+encLen-strings), (int)mStringPoolSize);
- }
- } else {
- ALOGW("Bad string block: string #%d entry is at %d, past end at %d\n",
- (int)idx, (int)(off*sizeof(uint16_t)),
- (int)(mStringPoolSize*sizeof(uint16_t)));
- }
- }
- return NULL;
-}
-
-const String8 ResStringPool::string8ObjectAt(size_t idx) const
-{
- size_t len;
- const char *str = (const char*)string8At(idx, &len);
- if (str != NULL) {
- return String8(str);
- }
- return String8(stringAt(idx, &len));
-}
-
-const ResStringPool_span* ResStringPool::styleAt(const ResStringPool_ref& ref) const
-{
- return styleAt(ref.index);
-}
-
-const ResStringPool_span* ResStringPool::styleAt(size_t idx) const
-{
- if (mError == NO_ERROR && idx < mHeader->styleCount) {
- const uint32_t off = (mEntryStyles[idx]/sizeof(uint32_t));
- if (off < mStylePoolSize) {
- return (const ResStringPool_span*)(mStyles+off);
- } else {
- ALOGW("Bad string block: style #%d entry is at %d, past end at %d\n",
- (int)idx, (int)(off*sizeof(uint32_t)),
- (int)(mStylePoolSize*sizeof(uint32_t)));
- }
- }
- return NULL;
-}
-
-ssize_t ResStringPool::indexOfString(const char16_t* str, size_t strLen) const
-{
- if (mError != NO_ERROR) {
- return mError;
- }
-
- size_t len;
-
- if ((mHeader->flags&ResStringPool_header::UTF8_FLAG) != 0) {
- STRING_POOL_NOISY(ALOGI("indexOfString UTF-8: %s", String8(str, strLen).string()));
-
- // The string pool contains UTF 8 strings; we don't want to cause
- // temporary UTF-16 strings to be created as we search.
- if (mHeader->flags&ResStringPool_header::SORTED_FLAG) {
- // Do a binary search for the string... this is a little tricky,
- // because the strings are sorted with strzcmp16(). So to match
- // the ordering, we need to convert strings in the pool to UTF-16.
- // But we don't want to hit the cache, so instead we will have a
- // local temporary allocation for the conversions.
- char16_t* convBuffer = (char16_t*)malloc(strLen+4);
- ssize_t l = 0;
- ssize_t h = mHeader->stringCount-1;
-
- ssize_t mid;
- while (l <= h) {
- mid = l + (h - l)/2;
- const uint8_t* s = (const uint8_t*)string8At(mid, &len);
- int c;
- if (s != NULL) {
- char16_t* end = utf8_to_utf16_n(s, len, convBuffer, strLen+3);
- *end = 0;
- c = strzcmp16(convBuffer, end-convBuffer, str, strLen);
- } else {
- c = -1;
- }
- STRING_POOL_NOISY(ALOGI("Looking at %s, cmp=%d, l/mid/h=%d/%d/%d\n",
- (const char*)s, c, (int)l, (int)mid, (int)h));
- if (c == 0) {
- STRING_POOL_NOISY(ALOGI("MATCH!"));
- free(convBuffer);
- return mid;
- } else if (c < 0) {
- l = mid + 1;
- } else {
- h = mid - 1;
- }
- }
- free(convBuffer);
- } else {
- // It is unusual to get the ID from an unsorted string block...
- // most often this happens because we want to get IDs for style
- // span tags; since those always appear at the end of the string
- // block, start searching at the back.
- String8 str8(str, strLen);
- const size_t str8Len = str8.size();
- for (int i=mHeader->stringCount-1; i>=0; i--) {
- const char* s = string8At(i, &len);
- STRING_POOL_NOISY(ALOGI("Looking at %s, i=%d\n",
- String8(s).string(),
- i));
- if (s && str8Len == len && memcmp(s, str8.string(), str8Len) == 0) {
- STRING_POOL_NOISY(ALOGI("MATCH!"));
- return i;
- }
- }
- }
-
- } else {
- STRING_POOL_NOISY(ALOGI("indexOfString UTF-16: %s", String8(str, strLen).string()));
-
- if (mHeader->flags&ResStringPool_header::SORTED_FLAG) {
- // Do a binary search for the string...
- ssize_t l = 0;
- ssize_t h = mHeader->stringCount-1;
-
- ssize_t mid;
- while (l <= h) {
- mid = l + (h - l)/2;
- const char16_t* s = stringAt(mid, &len);
- int c = s ? strzcmp16(s, len, str, strLen) : -1;
- STRING_POOL_NOISY(ALOGI("Looking at %s, cmp=%d, l/mid/h=%d/%d/%d\n",
- String8(s).string(),
- c, (int)l, (int)mid, (int)h));
- if (c == 0) {
- STRING_POOL_NOISY(ALOGI("MATCH!"));
- return mid;
- } else if (c < 0) {
- l = mid + 1;
- } else {
- h = mid - 1;
- }
- }
- } else {
- // It is unusual to get the ID from an unsorted string block...
- // most often this happens because we want to get IDs for style
- // span tags; since those always appear at the end of the string
- // block, start searching at the back.
- for (int i=mHeader->stringCount-1; i>=0; i--) {
- const char16_t* s = stringAt(i, &len);
- STRING_POOL_NOISY(ALOGI("Looking at %s, i=%d\n",
- String8(s).string(),
- i));
- if (s && strLen == len && strzcmp16(s, len, str, strLen) == 0) {
- STRING_POOL_NOISY(ALOGI("MATCH!"));
- return i;
- }
- }
- }
- }
-
- return NAME_NOT_FOUND;
-}
-
-size_t ResStringPool::size() const
-{
- return (mError == NO_ERROR) ? mHeader->stringCount : 0;
-}
-
-size_t ResStringPool::styleCount() const
-{
- return (mError == NO_ERROR) ? mHeader->styleCount : 0;
-}
-
-size_t ResStringPool::bytes() const
-{
- return (mError == NO_ERROR) ? mHeader->header.size : 0;
-}
-
-bool ResStringPool::isSorted() const
-{
- return (mHeader->flags&ResStringPool_header::SORTED_FLAG)!=0;
-}
-
-bool ResStringPool::isUTF8() const
-{
- return (mHeader->flags&ResStringPool_header::UTF8_FLAG)!=0;
-}
-
-// --------------------------------------------------------------------
-// --------------------------------------------------------------------
-// --------------------------------------------------------------------
-
-ResXMLParser::ResXMLParser(const ResXMLTree& tree)
- : mTree(tree), mEventCode(BAD_DOCUMENT)
-{
-}
-
-void ResXMLParser::restart()
-{
- mCurNode = NULL;
- mEventCode = mTree.mError == NO_ERROR ? START_DOCUMENT : BAD_DOCUMENT;
-}
-const ResStringPool& ResXMLParser::getStrings() const
-{
- return mTree.mStrings;
-}
-
-ResXMLParser::event_code_t ResXMLParser::getEventType() const
-{
- return mEventCode;
-}
-
-ResXMLParser::event_code_t ResXMLParser::next()
-{
- if (mEventCode == START_DOCUMENT) {
- mCurNode = mTree.mRootNode;
- mCurExt = mTree.mRootExt;
- return (mEventCode=mTree.mRootCode);
- } else if (mEventCode >= FIRST_CHUNK_CODE) {
- return nextNode();
- }
- return mEventCode;
-}
-
-int32_t ResXMLParser::getCommentID() const
-{
- return mCurNode != NULL ? dtohl(mCurNode->comment.index) : -1;
-}
-
-const uint16_t* ResXMLParser::getComment(size_t* outLen) const
-{
- int32_t id = getCommentID();
- return id >= 0 ? mTree.mStrings.stringAt(id, outLen) : NULL;
-}
-
-uint32_t ResXMLParser::getLineNumber() const
-{
- return mCurNode != NULL ? dtohl(mCurNode->lineNumber) : -1;
-}
-
-int32_t ResXMLParser::getTextID() const
-{
- if (mEventCode == TEXT) {
- return dtohl(((const ResXMLTree_cdataExt*)mCurExt)->data.index);
- }
- return -1;
-}
-
-const uint16_t* ResXMLParser::getText(size_t* outLen) const
-{
- int32_t id = getTextID();
- return id >= 0 ? mTree.mStrings.stringAt(id, outLen) : NULL;
-}
-
-ssize_t ResXMLParser::getTextValue(Res_value* outValue) const
-{
- if (mEventCode == TEXT) {
- outValue->copyFrom_dtoh(((const ResXMLTree_cdataExt*)mCurExt)->typedData);
- return sizeof(Res_value);
- }
- return BAD_TYPE;
-}
-
-int32_t ResXMLParser::getNamespacePrefixID() const
-{
- if (mEventCode == START_NAMESPACE || mEventCode == END_NAMESPACE) {
- return dtohl(((const ResXMLTree_namespaceExt*)mCurExt)->prefix.index);
- }
- return -1;
-}
-
-const uint16_t* ResXMLParser::getNamespacePrefix(size_t* outLen) const
-{
- int32_t id = getNamespacePrefixID();
- //printf("prefix=%d event=%p\n", id, mEventCode);
- return id >= 0 ? mTree.mStrings.stringAt(id, outLen) : NULL;
-}
-
-int32_t ResXMLParser::getNamespaceUriID() const
-{
- if (mEventCode == START_NAMESPACE || mEventCode == END_NAMESPACE) {
- return dtohl(((const ResXMLTree_namespaceExt*)mCurExt)->uri.index);
- }
- return -1;
-}
-
-const uint16_t* ResXMLParser::getNamespaceUri(size_t* outLen) const
-{
- int32_t id = getNamespaceUriID();
- //printf("uri=%d event=%p\n", id, mEventCode);
- return id >= 0 ? mTree.mStrings.stringAt(id, outLen) : NULL;
-}
-
-int32_t ResXMLParser::getElementNamespaceID() const
-{
- if (mEventCode == START_TAG) {
- return dtohl(((const ResXMLTree_attrExt*)mCurExt)->ns.index);
- }
- if (mEventCode == END_TAG) {
- return dtohl(((const ResXMLTree_endElementExt*)mCurExt)->ns.index);
- }
- return -1;
-}
-
-const uint16_t* ResXMLParser::getElementNamespace(size_t* outLen) const
-{
- int32_t id = getElementNamespaceID();
- return id >= 0 ? mTree.mStrings.stringAt(id, outLen) : NULL;
-}
-
-int32_t ResXMLParser::getElementNameID() const
-{
- if (mEventCode == START_TAG) {
- return dtohl(((const ResXMLTree_attrExt*)mCurExt)->name.index);
- }
- if (mEventCode == END_TAG) {
- return dtohl(((const ResXMLTree_endElementExt*)mCurExt)->name.index);
- }
- return -1;
-}
-
-const uint16_t* ResXMLParser::getElementName(size_t* outLen) const
-{
- int32_t id = getElementNameID();
- return id >= 0 ? mTree.mStrings.stringAt(id, outLen) : NULL;
-}
-
-size_t ResXMLParser::getAttributeCount() const
-{
- if (mEventCode == START_TAG) {
- return dtohs(((const ResXMLTree_attrExt*)mCurExt)->attributeCount);
- }
- return 0;
-}
-
-int32_t ResXMLParser::getAttributeNamespaceID(size_t idx) const
-{
- if (mEventCode == START_TAG) {
- const ResXMLTree_attrExt* tag = (const ResXMLTree_attrExt*)mCurExt;
- if (idx < dtohs(tag->attributeCount)) {
- const ResXMLTree_attribute* attr = (const ResXMLTree_attribute*)
- (((const uint8_t*)tag)
- + dtohs(tag->attributeStart)
- + (dtohs(tag->attributeSize)*idx));
- return dtohl(attr->ns.index);
- }
- }
- return -2;
-}
-
-const uint16_t* ResXMLParser::getAttributeNamespace(size_t idx, size_t* outLen) const
-{
- int32_t id = getAttributeNamespaceID(idx);
- //printf("attribute namespace=%d idx=%d event=%p\n", id, idx, mEventCode);
- //XML_NOISY(printf("getAttributeNamespace 0x%x=0x%x\n", idx, id));
- return id >= 0 ? mTree.mStrings.stringAt(id, outLen) : NULL;
-}
-
-const char* ResXMLParser::getAttributeNamespace8(size_t idx, size_t* outLen) const
-{
- int32_t id = getAttributeNamespaceID(idx);
- //printf("attribute namespace=%d idx=%d event=%p\n", id, idx, mEventCode);
- //XML_NOISY(printf("getAttributeNamespace 0x%x=0x%x\n", idx, id));
- return id >= 0 ? mTree.mStrings.string8At(id, outLen) : NULL;
-}
-
-int32_t ResXMLParser::getAttributeNameID(size_t idx) const
-{
- if (mEventCode == START_TAG) {
- const ResXMLTree_attrExt* tag = (const ResXMLTree_attrExt*)mCurExt;
- if (idx < dtohs(tag->attributeCount)) {
- const ResXMLTree_attribute* attr = (const ResXMLTree_attribute*)
- (((const uint8_t*)tag)
- + dtohs(tag->attributeStart)
- + (dtohs(tag->attributeSize)*idx));
- return dtohl(attr->name.index);
- }
- }
- return -1;
-}
-
-const uint16_t* ResXMLParser::getAttributeName(size_t idx, size_t* outLen) const
-{
- int32_t id = getAttributeNameID(idx);
- //printf("attribute name=%d idx=%d event=%p\n", id, idx, mEventCode);
- //XML_NOISY(printf("getAttributeName 0x%x=0x%x\n", idx, id));
- return id >= 0 ? mTree.mStrings.stringAt(id, outLen) : NULL;
-}
-
-const char* ResXMLParser::getAttributeName8(size_t idx, size_t* outLen) const
-{
- int32_t id = getAttributeNameID(idx);
- //printf("attribute name=%d idx=%d event=%p\n", id, idx, mEventCode);
- //XML_NOISY(printf("getAttributeName 0x%x=0x%x\n", idx, id));
- return id >= 0 ? mTree.mStrings.string8At(id, outLen) : NULL;
-}
-
-uint32_t ResXMLParser::getAttributeNameResID(size_t idx) const
-{
- int32_t id = getAttributeNameID(idx);
- if (id >= 0 && (size_t)id < mTree.mNumResIds) {
- return dtohl(mTree.mResIds[id]);
- }
- return 0;
-}
-
-int32_t ResXMLParser::getAttributeValueStringID(size_t idx) const
-{
- if (mEventCode == START_TAG) {
- const ResXMLTree_attrExt* tag = (const ResXMLTree_attrExt*)mCurExt;
- if (idx < dtohs(tag->attributeCount)) {
- const ResXMLTree_attribute* attr = (const ResXMLTree_attribute*)
- (((const uint8_t*)tag)
- + dtohs(tag->attributeStart)
- + (dtohs(tag->attributeSize)*idx));
- return dtohl(attr->rawValue.index);
- }
- }
- return -1;
-}
-
-const uint16_t* ResXMLParser::getAttributeStringValue(size_t idx, size_t* outLen) const
-{
- int32_t id = getAttributeValueStringID(idx);
- //XML_NOISY(printf("getAttributeValue 0x%x=0x%x\n", idx, id));
- return id >= 0 ? mTree.mStrings.stringAt(id, outLen) : NULL;
-}
-
-int32_t ResXMLParser::getAttributeDataType(size_t idx) const
-{
- if (mEventCode == START_TAG) {
- const ResXMLTree_attrExt* tag = (const ResXMLTree_attrExt*)mCurExt;
- if (idx < dtohs(tag->attributeCount)) {
- const ResXMLTree_attribute* attr = (const ResXMLTree_attribute*)
- (((const uint8_t*)tag)
- + dtohs(tag->attributeStart)
- + (dtohs(tag->attributeSize)*idx));
- return attr->typedValue.dataType;
- }
- }
- return Res_value::TYPE_NULL;
-}
-
-int32_t ResXMLParser::getAttributeData(size_t idx) const
-{
- if (mEventCode == START_TAG) {
- const ResXMLTree_attrExt* tag = (const ResXMLTree_attrExt*)mCurExt;
- if (idx < dtohs(tag->attributeCount)) {
- const ResXMLTree_attribute* attr = (const ResXMLTree_attribute*)
- (((const uint8_t*)tag)
- + dtohs(tag->attributeStart)
- + (dtohs(tag->attributeSize)*idx));
- return dtohl(attr->typedValue.data);
- }
- }
- return 0;
-}
-
-ssize_t ResXMLParser::getAttributeValue(size_t idx, Res_value* outValue) const
-{
- if (mEventCode == START_TAG) {
- const ResXMLTree_attrExt* tag = (const ResXMLTree_attrExt*)mCurExt;
- if (idx < dtohs(tag->attributeCount)) {
- const ResXMLTree_attribute* attr = (const ResXMLTree_attribute*)
- (((const uint8_t*)tag)
- + dtohs(tag->attributeStart)
- + (dtohs(tag->attributeSize)*idx));
- outValue->copyFrom_dtoh(attr->typedValue);
- return sizeof(Res_value);
- }
- }
- return BAD_TYPE;
-}
-
-ssize_t ResXMLParser::indexOfAttribute(const char* ns, const char* attr) const
-{
- String16 nsStr(ns != NULL ? ns : "");
- String16 attrStr(attr);
- return indexOfAttribute(ns ? nsStr.string() : NULL, ns ? nsStr.size() : 0,
- attrStr.string(), attrStr.size());
-}
-
-ssize_t ResXMLParser::indexOfAttribute(const char16_t* ns, size_t nsLen,
- const char16_t* attr, size_t attrLen) const
-{
- if (mEventCode == START_TAG) {
- if (attr == NULL) {
- return NAME_NOT_FOUND;
- }
- const size_t N = getAttributeCount();
- if (mTree.mStrings.isUTF8()) {
- String8 ns8, attr8;
- if (ns != NULL) {
- ns8 = String8(ns, nsLen);
- }
- attr8 = String8(attr, attrLen);
- STRING_POOL_NOISY(ALOGI("indexOfAttribute UTF8 %s (%d) / %s (%d)", ns8.string(), nsLen,
- attr8.string(), attrLen));
- for (size_t i=0; i<N; i++) {
- size_t curNsLen = 0, curAttrLen = 0;
- const char* curNs = getAttributeNamespace8(i, &curNsLen);
- const char* curAttr = getAttributeName8(i, &curAttrLen);
- STRING_POOL_NOISY(ALOGI(" curNs=%s (%d), curAttr=%s (%d)", curNs, curNsLen,
- curAttr, curAttrLen));
- if (curAttr != NULL && curNsLen == nsLen && curAttrLen == attrLen
- && memcmp(attr8.string(), curAttr, attrLen) == 0) {
- if (ns == NULL) {
- if (curNs == NULL) {
- STRING_POOL_NOISY(ALOGI(" FOUND!"));
- return i;
- }
- } else if (curNs != NULL) {
- //printf(" --> ns=%s, curNs=%s\n",
- // String8(ns).string(), String8(curNs).string());
- if (memcmp(ns8.string(), curNs, nsLen) == 0) {
- STRING_POOL_NOISY(ALOGI(" FOUND!"));
- return i;
- }
- }
- }
- }
- } else {
- STRING_POOL_NOISY(ALOGI("indexOfAttribute UTF16 %s (%d) / %s (%d)",
- String8(ns, nsLen).string(), nsLen,
- String8(attr, attrLen).string(), attrLen));
- for (size_t i=0; i<N; i++) {
- size_t curNsLen = 0, curAttrLen = 0;
- const char16_t* curNs = getAttributeNamespace(i, &curNsLen);
- const char16_t* curAttr = getAttributeName(i, &curAttrLen);
- STRING_POOL_NOISY(ALOGI(" curNs=%s (%d), curAttr=%s (%d)",
- String8(curNs, curNsLen).string(), curNsLen,
- String8(curAttr, curAttrLen).string(), curAttrLen));
- if (curAttr != NULL && curNsLen == nsLen && curAttrLen == attrLen
- && (memcmp(attr, curAttr, attrLen*sizeof(char16_t)) == 0)) {
- if (ns == NULL) {
- if (curNs == NULL) {
- STRING_POOL_NOISY(ALOGI(" FOUND!"));
- return i;
- }
- } else if (curNs != NULL) {
- //printf(" --> ns=%s, curNs=%s\n",
- // String8(ns).string(), String8(curNs).string());
- if (memcmp(ns, curNs, nsLen*sizeof(char16_t)) == 0) {
- STRING_POOL_NOISY(ALOGI(" FOUND!"));
- return i;
- }
- }
- }
- }
- }
- }
-
- return NAME_NOT_FOUND;
-}
-
-ssize_t ResXMLParser::indexOfID() const
-{
- if (mEventCode == START_TAG) {
- const ssize_t idx = dtohs(((const ResXMLTree_attrExt*)mCurExt)->idIndex);
- if (idx > 0) return (idx-1);
- }
- return NAME_NOT_FOUND;
-}
-
-ssize_t ResXMLParser::indexOfClass() const
-{
- if (mEventCode == START_TAG) {
- const ssize_t idx = dtohs(((const ResXMLTree_attrExt*)mCurExt)->classIndex);
- if (idx > 0) return (idx-1);
- }
- return NAME_NOT_FOUND;
-}
-
-ssize_t ResXMLParser::indexOfStyle() const
-{
- if (mEventCode == START_TAG) {
- const ssize_t idx = dtohs(((const ResXMLTree_attrExt*)mCurExt)->styleIndex);
- if (idx > 0) return (idx-1);
- }
- return NAME_NOT_FOUND;
-}
-
-ResXMLParser::event_code_t ResXMLParser::nextNode()
-{
- if (mEventCode < 0) {
- return mEventCode;
- }
-
- do {
- const ResXMLTree_node* next = (const ResXMLTree_node*)
- (((const uint8_t*)mCurNode) + dtohl(mCurNode->header.size));
- //ALOGW("Next node: prev=%p, next=%p\n", mCurNode, next);
-
- if (((const uint8_t*)next) >= mTree.mDataEnd) {
- mCurNode = NULL;
- return (mEventCode=END_DOCUMENT);
- }
-
- if (mTree.validateNode(next) != NO_ERROR) {
- mCurNode = NULL;
- return (mEventCode=BAD_DOCUMENT);
- }
-
- mCurNode = next;
- const uint16_t headerSize = dtohs(next->header.headerSize);
- const uint32_t totalSize = dtohl(next->header.size);
- mCurExt = ((const uint8_t*)next) + headerSize;
- size_t minExtSize = 0;
- event_code_t eventCode = (event_code_t)dtohs(next->header.type);
- switch ((mEventCode=eventCode)) {
- case RES_XML_START_NAMESPACE_TYPE:
- case RES_XML_END_NAMESPACE_TYPE:
- minExtSize = sizeof(ResXMLTree_namespaceExt);
- break;
- case RES_XML_START_ELEMENT_TYPE:
- minExtSize = sizeof(ResXMLTree_attrExt);
- break;
- case RES_XML_END_ELEMENT_TYPE:
- minExtSize = sizeof(ResXMLTree_endElementExt);
- break;
- case RES_XML_CDATA_TYPE:
- minExtSize = sizeof(ResXMLTree_cdataExt);
- break;
- default:
- ALOGW("Unknown XML block: header type %d in node at %d\n",
- (int)dtohs(next->header.type),
- (int)(((const uint8_t*)next)-((const uint8_t*)mTree.mHeader)));
- continue;
- }
-
- if ((totalSize-headerSize) < minExtSize) {
- ALOGW("Bad XML block: header type 0x%x in node at 0x%x has size %d, need %d\n",
- (int)dtohs(next->header.type),
- (int)(((const uint8_t*)next)-((const uint8_t*)mTree.mHeader)),
- (int)(totalSize-headerSize), (int)minExtSize);
- return (mEventCode=BAD_DOCUMENT);
- }
-
- //printf("CurNode=%p, CurExt=%p, headerSize=%d, minExtSize=%d\n",
- // mCurNode, mCurExt, headerSize, minExtSize);
-
- return eventCode;
- } while (true);
-}
-
-void ResXMLParser::getPosition(ResXMLParser::ResXMLPosition* pos) const
-{
- pos->eventCode = mEventCode;
- pos->curNode = mCurNode;
- pos->curExt = mCurExt;
-}
-
-void ResXMLParser::setPosition(const ResXMLParser::ResXMLPosition& pos)
-{
- mEventCode = pos.eventCode;
- mCurNode = pos.curNode;
- mCurExt = pos.curExt;
-}
-
-
-// --------------------------------------------------------------------
-
-static volatile int32_t gCount = 0;
-
-ResXMLTree::ResXMLTree()
- : ResXMLParser(*this)
- , mError(NO_INIT), mOwnedData(NULL)
-{
- //ALOGI("Creating ResXMLTree %p #%d\n", this, android_atomic_inc(&gCount)+1);
- restart();
-}
-
-ResXMLTree::ResXMLTree(const void* data, size_t size, bool copyData)
- : ResXMLParser(*this)
- , mError(NO_INIT), mOwnedData(NULL)
-{
- //ALOGI("Creating ResXMLTree %p #%d\n", this, android_atomic_inc(&gCount)+1);
- setTo(data, size, copyData);
-}
-
-ResXMLTree::~ResXMLTree()
-{
- //ALOGI("Destroying ResXMLTree in %p #%d\n", this, android_atomic_dec(&gCount)-1);
- uninit();
-}
-
-status_t ResXMLTree::setTo(const void* data, size_t size, bool copyData)
-{
- uninit();
- mEventCode = START_DOCUMENT;
-
- if (!data || !size) {
- return (mError=BAD_TYPE);
- }
-
- if (copyData) {
- mOwnedData = malloc(size);
- if (mOwnedData == NULL) {
- return (mError=NO_MEMORY);
- }
- memcpy(mOwnedData, data, size);
- data = mOwnedData;
- }
-
- mHeader = (const ResXMLTree_header*)data;
- mSize = dtohl(mHeader->header.size);
- if (dtohs(mHeader->header.headerSize) > mSize || mSize > size) {
- ALOGW("Bad XML block: header size %d or total size %d is larger than data size %d\n",
- (int)dtohs(mHeader->header.headerSize),
- (int)dtohl(mHeader->header.size), (int)size);
- mError = BAD_TYPE;
- restart();
- return mError;
- }
- mDataEnd = ((const uint8_t*)mHeader) + mSize;
-
- mStrings.uninit();
- mRootNode = NULL;
- mResIds = NULL;
- mNumResIds = 0;
-
- // First look for a couple interesting chunks: the string block
- // and first XML node.
- const ResChunk_header* chunk =
- (const ResChunk_header*)(((const uint8_t*)mHeader) + dtohs(mHeader->header.headerSize));
- const ResChunk_header* lastChunk = chunk;
- while (((const uint8_t*)chunk) < (mDataEnd-sizeof(ResChunk_header)) &&
- ((const uint8_t*)chunk) < (mDataEnd-dtohl(chunk->size))) {
- status_t err = validate_chunk(chunk, sizeof(ResChunk_header), mDataEnd, "XML");
- if (err != NO_ERROR) {
- mError = err;
- goto done;
- }
- const uint16_t type = dtohs(chunk->type);
- const size_t size = dtohl(chunk->size);
- XML_NOISY(printf("Scanning @ %p: type=0x%x, size=0x%x\n",
- (void*)(((uint32_t)chunk)-((uint32_t)mHeader)), type, size));
- if (type == RES_STRING_POOL_TYPE) {
- mStrings.setTo(chunk, size);
- } else if (type == RES_XML_RESOURCE_MAP_TYPE) {
- mResIds = (const uint32_t*)
- (((const uint8_t*)chunk)+dtohs(chunk->headerSize));
- mNumResIds = (dtohl(chunk->size)-dtohs(chunk->headerSize))/sizeof(uint32_t);
- } else if (type >= RES_XML_FIRST_CHUNK_TYPE
- && type <= RES_XML_LAST_CHUNK_TYPE) {
- if (validateNode((const ResXMLTree_node*)chunk) != NO_ERROR) {
- mError = BAD_TYPE;
- goto done;
- }
- mCurNode = (const ResXMLTree_node*)lastChunk;
- if (nextNode() == BAD_DOCUMENT) {
- mError = BAD_TYPE;
- goto done;
- }
- mRootNode = mCurNode;
- mRootExt = mCurExt;
- mRootCode = mEventCode;
- break;
- } else {
- XML_NOISY(printf("Skipping unknown chunk!\n"));
- }
- lastChunk = chunk;
- chunk = (const ResChunk_header*)
- (((const uint8_t*)chunk) + size);
- }
-
- if (mRootNode == NULL) {
- ALOGW("Bad XML block: no root element node found\n");
- mError = BAD_TYPE;
- goto done;
- }
-
- mError = mStrings.getError();
-
-done:
- restart();
- return mError;
-}
-
-status_t ResXMLTree::getError() const
-{
- return mError;
-}
-
-void ResXMLTree::uninit()
-{
- mError = NO_INIT;
- mStrings.uninit();
- if (mOwnedData) {
- free(mOwnedData);
- mOwnedData = NULL;
- }
- restart();
-}
-
-status_t ResXMLTree::validateNode(const ResXMLTree_node* node) const
-{
- const uint16_t eventCode = dtohs(node->header.type);
-
- status_t err = validate_chunk(
- &node->header, sizeof(ResXMLTree_node),
- mDataEnd, "ResXMLTree_node");
-
- if (err >= NO_ERROR) {
- // Only perform additional validation on START nodes
- if (eventCode != RES_XML_START_ELEMENT_TYPE) {
- return NO_ERROR;
- }
-
- const uint16_t headerSize = dtohs(node->header.headerSize);
- const uint32_t size = dtohl(node->header.size);
- const ResXMLTree_attrExt* attrExt = (const ResXMLTree_attrExt*)
- (((const uint8_t*)node) + headerSize);
- // check for sensical values pulled out of the stream so far...
- if ((size >= headerSize + sizeof(ResXMLTree_attrExt))
- && ((void*)attrExt > (void*)node)) {
- const size_t attrSize = ((size_t)dtohs(attrExt->attributeSize))
- * dtohs(attrExt->attributeCount);
- if ((dtohs(attrExt->attributeStart)+attrSize) <= (size-headerSize)) {
- return NO_ERROR;
- }
- ALOGW("Bad XML block: node attributes use 0x%x bytes, only have 0x%x bytes\n",
- (unsigned int)(dtohs(attrExt->attributeStart)+attrSize),
- (unsigned int)(size-headerSize));
- }
- else {
- ALOGW("Bad XML start block: node header size 0x%x, size 0x%x\n",
- (unsigned int)headerSize, (unsigned int)size);
- }
- return BAD_TYPE;
- }
-
- return err;
-
-#if 0
- const bool isStart = dtohs(node->header.type) == RES_XML_START_ELEMENT_TYPE;
-
- const uint16_t headerSize = dtohs(node->header.headerSize);
- const uint32_t size = dtohl(node->header.size);
-
- if (headerSize >= (isStart ? sizeof(ResXMLTree_attrNode) : sizeof(ResXMLTree_node))) {
- if (size >= headerSize) {
- if (((const uint8_t*)node) <= (mDataEnd-size)) {
- if (!isStart) {
- return NO_ERROR;
- }
- if ((((size_t)dtohs(node->attributeSize))*dtohs(node->attributeCount))
- <= (size-headerSize)) {
- return NO_ERROR;
- }
- ALOGW("Bad XML block: node attributes use 0x%x bytes, only have 0x%x bytes\n",
- ((int)dtohs(node->attributeSize))*dtohs(node->attributeCount),
- (int)(size-headerSize));
- return BAD_TYPE;
- }
- ALOGW("Bad XML block: node at 0x%x extends beyond data end 0x%x\n",
- (int)(((const uint8_t*)node)-((const uint8_t*)mHeader)), (int)mSize);
- return BAD_TYPE;
- }
- ALOGW("Bad XML block: node at 0x%x header size 0x%x smaller than total size 0x%x\n",
- (int)(((const uint8_t*)node)-((const uint8_t*)mHeader)),
- (int)headerSize, (int)size);
- return BAD_TYPE;
- }
- ALOGW("Bad XML block: node at 0x%x header size 0x%x too small\n",
- (int)(((const uint8_t*)node)-((const uint8_t*)mHeader)),
- (int)headerSize);
- return BAD_TYPE;
-#endif
-}
-
-// --------------------------------------------------------------------
-// --------------------------------------------------------------------
-// --------------------------------------------------------------------
-
-void ResTable_config::copyFromDeviceNoSwap(const ResTable_config& o) {
- const size_t size = dtohl(o.size);
- if (size >= sizeof(ResTable_config)) {
- *this = o;
- } else {
- memcpy(this, &o, size);
- memset(((uint8_t*)this)+size, 0, sizeof(ResTable_config)-size);
- }
-}
-
-void ResTable_config::copyFromDtoH(const ResTable_config& o) {
- copyFromDeviceNoSwap(o);
- size = sizeof(ResTable_config);
- mcc = dtohs(mcc);
- mnc = dtohs(mnc);
- density = dtohs(density);
- screenWidth = dtohs(screenWidth);
- screenHeight = dtohs(screenHeight);
- sdkVersion = dtohs(sdkVersion);
- minorVersion = dtohs(minorVersion);
- smallestScreenWidthDp = dtohs(smallestScreenWidthDp);
- screenWidthDp = dtohs(screenWidthDp);
- screenHeightDp = dtohs(screenHeightDp);
-}
-
-void ResTable_config::swapHtoD() {
- size = htodl(size);
- mcc = htods(mcc);
- mnc = htods(mnc);
- density = htods(density);
- screenWidth = htods(screenWidth);
- screenHeight = htods(screenHeight);
- sdkVersion = htods(sdkVersion);
- minorVersion = htods(minorVersion);
- smallestScreenWidthDp = htods(smallestScreenWidthDp);
- screenWidthDp = htods(screenWidthDp);
- screenHeightDp = htods(screenHeightDp);
-}
-
-int ResTable_config::compare(const ResTable_config& o) const {
- int32_t diff = (int32_t)(imsi - o.imsi);
- if (diff != 0) return diff;
- diff = (int32_t)(locale - o.locale);
- if (diff != 0) return diff;
- diff = (int32_t)(screenType - o.screenType);
- if (diff != 0) return diff;
- diff = (int32_t)(input - o.input);
- if (diff != 0) return diff;
- diff = (int32_t)(screenSize - o.screenSize);
- if (diff != 0) return diff;
- diff = (int32_t)(version - o.version);
- if (diff != 0) return diff;
- diff = (int32_t)(screenLayout - o.screenLayout);
- if (diff != 0) return diff;
- diff = (int32_t)(uiMode - o.uiMode);
- if (diff != 0) return diff;
- diff = (int32_t)(smallestScreenWidthDp - o.smallestScreenWidthDp);
- if (diff != 0) return diff;
- diff = (int32_t)(screenSizeDp - o.screenSizeDp);
- return (int)diff;
-}
-
-int ResTable_config::compareLogical(const ResTable_config& o) const {
- if (mcc != o.mcc) {
- return mcc < o.mcc ? -1 : 1;
- }
- if (mnc != o.mnc) {
- return mnc < o.mnc ? -1 : 1;
- }
- if (language[0] != o.language[0]) {
- return language[0] < o.language[0] ? -1 : 1;
- }
- if (language[1] != o.language[1]) {
- return language[1] < o.language[1] ? -1 : 1;
- }
- if (country[0] != o.country[0]) {
- return country[0] < o.country[0] ? -1 : 1;
- }
- if (country[1] != o.country[1]) {
- return country[1] < o.country[1] ? -1 : 1;
- }
- if ((screenLayout & MASK_LAYOUTDIR) != (o.screenLayout & MASK_LAYOUTDIR)) {
- return (screenLayout & MASK_LAYOUTDIR) < (o.screenLayout & MASK_LAYOUTDIR) ? -1 : 1;
- }
- if (smallestScreenWidthDp != o.smallestScreenWidthDp) {
- return smallestScreenWidthDp < o.smallestScreenWidthDp ? -1 : 1;
- }
- if (screenWidthDp != o.screenWidthDp) {
- return screenWidthDp < o.screenWidthDp ? -1 : 1;
- }
- if (screenHeightDp != o.screenHeightDp) {
- return screenHeightDp < o.screenHeightDp ? -1 : 1;
- }
- if (screenWidth != o.screenWidth) {
- return screenWidth < o.screenWidth ? -1 : 1;
- }
- if (screenHeight != o.screenHeight) {
- return screenHeight < o.screenHeight ? -1 : 1;
- }
- if (density != o.density) {
- return density < o.density ? -1 : 1;
- }
- if (orientation != o.orientation) {
- return orientation < o.orientation ? -1 : 1;
- }
- if (touchscreen != o.touchscreen) {
- return touchscreen < o.touchscreen ? -1 : 1;
- }
- if (input != o.input) {
- return input < o.input ? -1 : 1;
- }
- if (screenLayout != o.screenLayout) {
- return screenLayout < o.screenLayout ? -1 : 1;
- }
- if (uiMode != o.uiMode) {
- return uiMode < o.uiMode ? -1 : 1;
- }
- if (version != o.version) {
- return version < o.version ? -1 : 1;
- }
- return 0;
-}
-
-int ResTable_config::diff(const ResTable_config& o) const {
- int diffs = 0;
- if (mcc != o.mcc) diffs |= CONFIG_MCC;
- if (mnc != o.mnc) diffs |= CONFIG_MNC;
- if (locale != o.locale) diffs |= CONFIG_LOCALE;
- if (orientation != o.orientation) diffs |= CONFIG_ORIENTATION;
- if (density != o.density) diffs |= CONFIG_DENSITY;
- if (touchscreen != o.touchscreen) diffs |= CONFIG_TOUCHSCREEN;
- if (((inputFlags^o.inputFlags)&(MASK_KEYSHIDDEN|MASK_NAVHIDDEN)) != 0)
- diffs |= CONFIG_KEYBOARD_HIDDEN;
- if (keyboard != o.keyboard) diffs |= CONFIG_KEYBOARD;
- if (navigation != o.navigation) diffs |= CONFIG_NAVIGATION;
- if (screenSize != o.screenSize) diffs |= CONFIG_SCREEN_SIZE;
- if (version != o.version) diffs |= CONFIG_VERSION;
- if ((screenLayout & MASK_LAYOUTDIR) != (o.screenLayout & MASK_LAYOUTDIR)) diffs |= CONFIG_LAYOUTDIR;
- if ((screenLayout & ~MASK_LAYOUTDIR) != (o.screenLayout & ~MASK_LAYOUTDIR)) diffs |= CONFIG_SCREEN_LAYOUT;
- if (uiMode != o.uiMode) diffs |= CONFIG_UI_MODE;
- if (smallestScreenWidthDp != o.smallestScreenWidthDp) diffs |= CONFIG_SMALLEST_SCREEN_SIZE;
- if (screenSizeDp != o.screenSizeDp) diffs |= CONFIG_SCREEN_SIZE;
- return diffs;
-}
-
-bool ResTable_config::isMoreSpecificThan(const ResTable_config& o) const {
- // The order of the following tests defines the importance of one
- // configuration parameter over another. Those tests first are more
- // important, trumping any values in those following them.
- if (imsi || o.imsi) {
- if (mcc != o.mcc) {
- if (!mcc) return false;
- if (!o.mcc) return true;
- }
-
- if (mnc != o.mnc) {
- if (!mnc) return false;
- if (!o.mnc) return true;
- }
- }
-
- if (locale || o.locale) {
- if (language[0] != o.language[0]) {
- if (!language[0]) return false;
- if (!o.language[0]) return true;
- }
-
- if (country[0] != o.country[0]) {
- if (!country[0]) return false;
- if (!o.country[0]) return true;
- }
- }
-
- if (screenLayout || o.screenLayout) {
- if (((screenLayout^o.screenLayout) & MASK_LAYOUTDIR) != 0) {
- if (!(screenLayout & MASK_LAYOUTDIR)) return false;
- if (!(o.screenLayout & MASK_LAYOUTDIR)) return true;
- }
- }
-
- if (smallestScreenWidthDp || o.smallestScreenWidthDp) {
- if (smallestScreenWidthDp != o.smallestScreenWidthDp) {
- if (!smallestScreenWidthDp) return false;
- if (!o.smallestScreenWidthDp) return true;
- }
- }
-
- if (screenSizeDp || o.screenSizeDp) {
- if (screenWidthDp != o.screenWidthDp) {
- if (!screenWidthDp) return false;
- if (!o.screenWidthDp) return true;
- }
-
- if (screenHeightDp != o.screenHeightDp) {
- if (!screenHeightDp) return false;
- if (!o.screenHeightDp) return true;
- }
- }
-
- if (screenLayout || o.screenLayout) {
- if (((screenLayout^o.screenLayout) & MASK_SCREENSIZE) != 0) {
- if (!(screenLayout & MASK_SCREENSIZE)) return false;
- if (!(o.screenLayout & MASK_SCREENSIZE)) return true;
- }
- if (((screenLayout^o.screenLayout) & MASK_SCREENLONG) != 0) {
- if (!(screenLayout & MASK_SCREENLONG)) return false;
- if (!(o.screenLayout & MASK_SCREENLONG)) return true;
- }
- }
-
- if (orientation != o.orientation) {
- if (!orientation) return false;
- if (!o.orientation) return true;
- }
-
- if (uiMode || o.uiMode) {
- if (((uiMode^o.uiMode) & MASK_UI_MODE_TYPE) != 0) {
- if (!(uiMode & MASK_UI_MODE_TYPE)) return false;
- if (!(o.uiMode & MASK_UI_MODE_TYPE)) return true;
- }
- if (((uiMode^o.uiMode) & MASK_UI_MODE_NIGHT) != 0) {
- if (!(uiMode & MASK_UI_MODE_NIGHT)) return false;
- if (!(o.uiMode & MASK_UI_MODE_NIGHT)) return true;
- }
- }
-
- // density is never 'more specific'
- // as the default just equals 160
-
- if (touchscreen != o.touchscreen) {
- if (!touchscreen) return false;
- if (!o.touchscreen) return true;
- }
-
- if (input || o.input) {
- if (((inputFlags^o.inputFlags) & MASK_KEYSHIDDEN) != 0) {
- if (!(inputFlags & MASK_KEYSHIDDEN)) return false;
- if (!(o.inputFlags & MASK_KEYSHIDDEN)) return true;
- }
-
- if (((inputFlags^o.inputFlags) & MASK_NAVHIDDEN) != 0) {
- if (!(inputFlags & MASK_NAVHIDDEN)) return false;
- if (!(o.inputFlags & MASK_NAVHIDDEN)) return true;
- }
-
- if (keyboard != o.keyboard) {
- if (!keyboard) return false;
- if (!o.keyboard) return true;
- }
-
- if (navigation != o.navigation) {
- if (!navigation) return false;
- if (!o.navigation) return true;
- }
- }
-
- if (screenSize || o.screenSize) {
- if (screenWidth != o.screenWidth) {
- if (!screenWidth) return false;
- if (!o.screenWidth) return true;
- }
-
- if (screenHeight != o.screenHeight) {
- if (!screenHeight) return false;
- if (!o.screenHeight) return true;
- }
- }
-
- if (version || o.version) {
- if (sdkVersion != o.sdkVersion) {
- if (!sdkVersion) return false;
- if (!o.sdkVersion) return true;
- }
-
- if (minorVersion != o.minorVersion) {
- if (!minorVersion) return false;
- if (!o.minorVersion) return true;
- }
- }
- return false;
-}
-
-bool ResTable_config::isBetterThan(const ResTable_config& o,
- const ResTable_config* requested) const {
- if (requested) {
- if (imsi || o.imsi) {
- if ((mcc != o.mcc) && requested->mcc) {
- return (mcc);
- }
-
- if ((mnc != o.mnc) && requested->mnc) {
- return (mnc);
- }
- }
-
- if (locale || o.locale) {
- if ((language[0] != o.language[0]) && requested->language[0]) {
- return (language[0]);
- }
-
- if ((country[0] != o.country[0]) && requested->country[0]) {
- return (country[0]);
- }
- }
-
- if (screenLayout || o.screenLayout) {
- if (((screenLayout^o.screenLayout) & MASK_LAYOUTDIR) != 0
- && (requested->screenLayout & MASK_LAYOUTDIR)) {
- int myLayoutDir = screenLayout & MASK_LAYOUTDIR;
- int oLayoutDir = o.screenLayout & MASK_LAYOUTDIR;
- return (myLayoutDir > oLayoutDir);
- }
- }
-
- if (smallestScreenWidthDp || o.smallestScreenWidthDp) {
- // The configuration closest to the actual size is best.
- // We assume that larger configs have already been filtered
- // out at this point. That means we just want the largest one.
- if (smallestScreenWidthDp != o.smallestScreenWidthDp) {
- return smallestScreenWidthDp > o.smallestScreenWidthDp;
- }
- }
-
- if (screenSizeDp || o.screenSizeDp) {
- // "Better" is based on the sum of the difference between both
- // width and height from the requested dimensions. We are
- // assuming the invalid configs (with smaller dimens) have
- // already been filtered. Note that if a particular dimension
- // is unspecified, we will end up with a large value (the
- // difference between 0 and the requested dimension), which is
- // good since we will prefer a config that has specified a
- // dimension value.
- int myDelta = 0, otherDelta = 0;
- if (requested->screenWidthDp) {
- myDelta += requested->screenWidthDp - screenWidthDp;
- otherDelta += requested->screenWidthDp - o.screenWidthDp;
- }
- if (requested->screenHeightDp) {
- myDelta += requested->screenHeightDp - screenHeightDp;
- otherDelta += requested->screenHeightDp - o.screenHeightDp;
- }
- //ALOGI("Comparing this %dx%d to other %dx%d in %dx%d: myDelta=%d otherDelta=%d",
- // screenWidthDp, screenHeightDp, o.screenWidthDp, o.screenHeightDp,
- // requested->screenWidthDp, requested->screenHeightDp, myDelta, otherDelta);
- if (myDelta != otherDelta) {
- return myDelta < otherDelta;
- }
- }
-
- if (screenLayout || o.screenLayout) {
- if (((screenLayout^o.screenLayout) & MASK_SCREENSIZE) != 0
- && (requested->screenLayout & MASK_SCREENSIZE)) {
- // A little backwards compatibility here: undefined is
- // considered equivalent to normal. But only if the
- // requested size is at least normal; otherwise, small
- // is better than the default.
- int mySL = (screenLayout & MASK_SCREENSIZE);
- int oSL = (o.screenLayout & MASK_SCREENSIZE);
- int fixedMySL = mySL;
- int fixedOSL = oSL;
- if ((requested->screenLayout & MASK_SCREENSIZE) >= SCREENSIZE_NORMAL) {
- if (fixedMySL == 0) fixedMySL = SCREENSIZE_NORMAL;
- if (fixedOSL == 0) fixedOSL = SCREENSIZE_NORMAL;
- }
- // For screen size, the best match is the one that is
- // closest to the requested screen size, but not over
- // (the not over part is dealt with in match() below).
- if (fixedMySL == fixedOSL) {
- // If the two are the same, but 'this' is actually
- // undefined, then the other is really a better match.
- if (mySL == 0) return false;
- return true;
- }
- if (fixedMySL != fixedOSL) {
- return fixedMySL > fixedOSL;
- }
- }
- if (((screenLayout^o.screenLayout) & MASK_SCREENLONG) != 0
- && (requested->screenLayout & MASK_SCREENLONG)) {
- return (screenLayout & MASK_SCREENLONG);
- }
- }
-
- if ((orientation != o.orientation) && requested->orientation) {
- return (orientation);
- }
-
- if (uiMode || o.uiMode) {
- if (((uiMode^o.uiMode) & MASK_UI_MODE_TYPE) != 0
- && (requested->uiMode & MASK_UI_MODE_TYPE)) {
- return (uiMode & MASK_UI_MODE_TYPE);
- }
- if (((uiMode^o.uiMode) & MASK_UI_MODE_NIGHT) != 0
- && (requested->uiMode & MASK_UI_MODE_NIGHT)) {
- return (uiMode & MASK_UI_MODE_NIGHT);
- }
- }
-
- if (screenType || o.screenType) {
- if (density != o.density) {
- // density is tough. Any density is potentially useful
- // because the system will scale it. Scaling down
- // is generally better than scaling up.
- // Default density counts as 160dpi (the system default)
- // TODO - remove 160 constants
- int h = (density?density:160);
- int l = (o.density?o.density:160);
- bool bImBigger = true;
- if (l > h) {
- int t = h;
- h = l;
- l = t;
- bImBigger = false;
- }
-
- int reqValue = (requested->density?requested->density:160);
- if (reqValue >= h) {
- // requested value higher than both l and h, give h
- return bImBigger;
- }
- if (l >= reqValue) {
- // requested value lower than both l and h, give l
- return !bImBigger;
- }
- // saying that scaling down is 2x better than up
- if (((2 * l) - reqValue) * h > reqValue * reqValue) {
- return !bImBigger;
- } else {
- return bImBigger;
- }
- }
-
- if ((touchscreen != o.touchscreen) && requested->touchscreen) {
- return (touchscreen);
- }
- }
-
- if (input || o.input) {
- const int keysHidden = inputFlags & MASK_KEYSHIDDEN;
- const int oKeysHidden = o.inputFlags & MASK_KEYSHIDDEN;
- if (keysHidden != oKeysHidden) {
- const int reqKeysHidden =
- requested->inputFlags & MASK_KEYSHIDDEN;
- if (reqKeysHidden) {
-
- if (!keysHidden) return false;
- if (!oKeysHidden) return true;
- // For compatibility, we count KEYSHIDDEN_NO as being
- // the same as KEYSHIDDEN_SOFT. Here we disambiguate
- // these by making an exact match more specific.
- if (reqKeysHidden == keysHidden) return true;
- if (reqKeysHidden == oKeysHidden) return false;
- }
- }
-
- const int navHidden = inputFlags & MASK_NAVHIDDEN;
- const int oNavHidden = o.inputFlags & MASK_NAVHIDDEN;
- if (navHidden != oNavHidden) {
- const int reqNavHidden =
- requested->inputFlags & MASK_NAVHIDDEN;
- if (reqNavHidden) {
-
- if (!navHidden) return false;
- if (!oNavHidden) return true;
- }
- }
-
- if ((keyboard != o.keyboard) && requested->keyboard) {
- return (keyboard);
- }
-
- if ((navigation != o.navigation) && requested->navigation) {
- return (navigation);
- }
- }
-
- if (screenSize || o.screenSize) {
- // "Better" is based on the sum of the difference between both
- // width and height from the requested dimensions. We are
- // assuming the invalid configs (with smaller sizes) have
- // already been filtered. Note that if a particular dimension
- // is unspecified, we will end up with a large value (the
- // difference between 0 and the requested dimension), which is
- // good since we will prefer a config that has specified a
- // size value.
- int myDelta = 0, otherDelta = 0;
- if (requested->screenWidth) {
- myDelta += requested->screenWidth - screenWidth;
- otherDelta += requested->screenWidth - o.screenWidth;
- }
- if (requested->screenHeight) {
- myDelta += requested->screenHeight - screenHeight;
- otherDelta += requested->screenHeight - o.screenHeight;
- }
- if (myDelta != otherDelta) {
- return myDelta < otherDelta;
- }
- }
-
- if (version || o.version) {
- if ((sdkVersion != o.sdkVersion) && requested->sdkVersion) {
- return (sdkVersion > o.sdkVersion);
- }
-
- if ((minorVersion != o.minorVersion) &&
- requested->minorVersion) {
- return (minorVersion);
- }
- }
-
- return false;
- }
- return isMoreSpecificThan(o);
-}
-
-bool ResTable_config::match(const ResTable_config& settings) const {
- if (imsi != 0) {
- if (mcc != 0 && mcc != settings.mcc) {
- return false;
- }
- if (mnc != 0 && mnc != settings.mnc) {
- return false;
- }
- }
- if (locale != 0) {
- if (language[0] != 0
- && (language[0] != settings.language[0]
- || language[1] != settings.language[1])) {
- return false;
- }
- if (country[0] != 0
- && (country[0] != settings.country[0]
- || country[1] != settings.country[1])) {
- return false;
- }
- }
- if (screenConfig != 0) {
- const int layoutDir = screenLayout&MASK_LAYOUTDIR;
- const int setLayoutDir = settings.screenLayout&MASK_LAYOUTDIR;
- if (layoutDir != 0 && layoutDir != setLayoutDir) {
- return false;
- }
-
- const int screenSize = screenLayout&MASK_SCREENSIZE;
- const int setScreenSize = settings.screenLayout&MASK_SCREENSIZE;
- // Any screen sizes for larger screens than the setting do not
- // match.
- if (screenSize != 0 && screenSize > setScreenSize) {
- return false;
- }
-
- const int screenLong = screenLayout&MASK_SCREENLONG;
- const int setScreenLong = settings.screenLayout&MASK_SCREENLONG;
- if (screenLong != 0 && screenLong != setScreenLong) {
- return false;
- }
-
- const int uiModeType = uiMode&MASK_UI_MODE_TYPE;
- const int setUiModeType = settings.uiMode&MASK_UI_MODE_TYPE;
- if (uiModeType != 0 && uiModeType != setUiModeType) {
- return false;
- }
-
- const int uiModeNight = uiMode&MASK_UI_MODE_NIGHT;
- const int setUiModeNight = settings.uiMode&MASK_UI_MODE_NIGHT;
- if (uiModeNight != 0 && uiModeNight != setUiModeNight) {
- return false;
- }
-
- if (smallestScreenWidthDp != 0
- && smallestScreenWidthDp > settings.smallestScreenWidthDp) {
- return false;
- }
- }
- if (screenSizeDp != 0) {
- if (screenWidthDp != 0 && screenWidthDp > settings.screenWidthDp) {
- //ALOGI("Filtering out width %d in requested %d", screenWidthDp, settings.screenWidthDp);
- return false;
- }
- if (screenHeightDp != 0 && screenHeightDp > settings.screenHeightDp) {
- //ALOGI("Filtering out height %d in requested %d", screenHeightDp, settings.screenHeightDp);
- return false;
- }
- }
- if (screenType != 0) {
- if (orientation != 0 && orientation != settings.orientation) {
- return false;
- }
- // density always matches - we can scale it. See isBetterThan
- if (touchscreen != 0 && touchscreen != settings.touchscreen) {
- return false;
- }
- }
- if (input != 0) {
- const int keysHidden = inputFlags&MASK_KEYSHIDDEN;
- const int setKeysHidden = settings.inputFlags&MASK_KEYSHIDDEN;
- if (keysHidden != 0 && keysHidden != setKeysHidden) {
- // For compatibility, we count a request for KEYSHIDDEN_NO as also
- // matching the more recent KEYSHIDDEN_SOFT. Basically
- // KEYSHIDDEN_NO means there is some kind of keyboard available.
- //ALOGI("Matching keysHidden: have=%d, config=%d\n", keysHidden, setKeysHidden);
- if (keysHidden != KEYSHIDDEN_NO || setKeysHidden != KEYSHIDDEN_SOFT) {
- //ALOGI("No match!");
- return false;
- }
- }
- const int navHidden = inputFlags&MASK_NAVHIDDEN;
- const int setNavHidden = settings.inputFlags&MASK_NAVHIDDEN;
- if (navHidden != 0 && navHidden != setNavHidden) {
- return false;
- }
- if (keyboard != 0 && keyboard != settings.keyboard) {
- return false;
- }
- if (navigation != 0 && navigation != settings.navigation) {
- return false;
- }
- }
- if (screenSize != 0) {
- if (screenWidth != 0 && screenWidth > settings.screenWidth) {
- return false;
- }
- if (screenHeight != 0 && screenHeight > settings.screenHeight) {
- return false;
- }
- }
- if (version != 0) {
- if (sdkVersion != 0 && sdkVersion > settings.sdkVersion) {
- return false;
- }
- if (minorVersion != 0 && minorVersion != settings.minorVersion) {
- return false;
- }
- }
- return true;
-}
-
-void ResTable_config::getLocale(char str[6]) const {
- memset(str, 0, 6);
- if (language[0]) {
- str[0] = language[0];
- str[1] = language[1];
- if (country[0]) {
- str[2] = '_';
- str[3] = country[0];
- str[4] = country[1];
- }
- }
-}
-
-String8 ResTable_config::toString() const {
- String8 res;
-
- if (mcc != 0) {
- if (res.size() > 0) res.append("-");
- res.appendFormat("%dmcc", dtohs(mcc));
- }
- if (mnc != 0) {
- if (res.size() > 0) res.append("-");
- res.appendFormat("%dmnc", dtohs(mnc));
- }
- if (language[0] != 0) {
- if (res.size() > 0) res.append("-");
- res.append(language, 2);
- }
- if (country[0] != 0) {
- if (res.size() > 0) res.append("-");
- res.append(country, 2);
- }
- if ((screenLayout&MASK_LAYOUTDIR) != 0) {
- if (res.size() > 0) res.append("-");
- switch (screenLayout&ResTable_config::MASK_LAYOUTDIR) {
- case ResTable_config::LAYOUTDIR_LTR:
- res.append("ldltr");
- break;
- case ResTable_config::LAYOUTDIR_RTL:
- res.append("ldrtl");
- break;
- default:
- res.appendFormat("layoutDir=%d",
- dtohs(screenLayout&ResTable_config::MASK_LAYOUTDIR));
- break;
- }
- }
- if (smallestScreenWidthDp != 0) {
- if (res.size() > 0) res.append("-");
- res.appendFormat("sw%ddp", dtohs(smallestScreenWidthDp));
- }
- if (screenWidthDp != 0) {
- if (res.size() > 0) res.append("-");
- res.appendFormat("w%ddp", dtohs(screenWidthDp));
- }
- if (screenHeightDp != 0) {
- if (res.size() > 0) res.append("-");
- res.appendFormat("h%ddp", dtohs(screenHeightDp));
- }
- if ((screenLayout&MASK_SCREENSIZE) != SCREENSIZE_ANY) {
- if (res.size() > 0) res.append("-");
- switch (screenLayout&ResTable_config::MASK_SCREENSIZE) {
- case ResTable_config::SCREENSIZE_SMALL:
- res.append("small");
- break;
- case ResTable_config::SCREENSIZE_NORMAL:
- res.append("normal");
- break;
- case ResTable_config::SCREENSIZE_LARGE:
- res.append("large");
- break;
- case ResTable_config::SCREENSIZE_XLARGE:
- res.append("xlarge");
- break;
- default:
- res.appendFormat("screenLayoutSize=%d",
- dtohs(screenLayout&ResTable_config::MASK_SCREENSIZE));
- break;
- }
- }
- if ((screenLayout&MASK_SCREENLONG) != 0) {
- if (res.size() > 0) res.append("-");
- switch (screenLayout&ResTable_config::MASK_SCREENLONG) {
- case ResTable_config::SCREENLONG_NO:
- res.append("notlong");
- break;
- case ResTable_config::SCREENLONG_YES:
- res.append("long");
- break;
- default:
- res.appendFormat("screenLayoutLong=%d",
- dtohs(screenLayout&ResTable_config::MASK_SCREENLONG));
- break;
- }
- }
- if (orientation != ORIENTATION_ANY) {
- if (res.size() > 0) res.append("-");
- switch (orientation) {
- case ResTable_config::ORIENTATION_PORT:
- res.append("port");
- break;
- case ResTable_config::ORIENTATION_LAND:
- res.append("land");
- break;
- case ResTable_config::ORIENTATION_SQUARE:
- res.append("square");
- break;
- default:
- res.appendFormat("orientation=%d", dtohs(orientation));
- break;
- }
- }
- if ((uiMode&MASK_UI_MODE_TYPE) != UI_MODE_TYPE_ANY) {
- if (res.size() > 0) res.append("-");
- switch (uiMode&ResTable_config::MASK_UI_MODE_TYPE) {
- case ResTable_config::UI_MODE_TYPE_DESK:
- res.append("desk");
- break;
- case ResTable_config::UI_MODE_TYPE_CAR:
- res.append("car");
- break;
- case ResTable_config::UI_MODE_TYPE_TELEVISION:
- res.append("television");
- break;
- case ResTable_config::UI_MODE_TYPE_APPLIANCE:
- res.append("appliance");
- break;
- default:
- res.appendFormat("uiModeType=%d",
- dtohs(screenLayout&ResTable_config::MASK_UI_MODE_TYPE));
- break;
- }
- }
- if ((uiMode&MASK_UI_MODE_NIGHT) != 0) {
- if (res.size() > 0) res.append("-");
- switch (uiMode&ResTable_config::MASK_UI_MODE_NIGHT) {
- case ResTable_config::UI_MODE_NIGHT_NO:
- res.append("notnight");
- break;
- case ResTable_config::UI_MODE_NIGHT_YES:
- res.append("night");
- break;
- default:
- res.appendFormat("uiModeNight=%d",
- dtohs(uiMode&MASK_UI_MODE_NIGHT));
- break;
- }
- }
- if (density != DENSITY_DEFAULT) {
- if (res.size() > 0) res.append("-");
- switch (density) {
- case ResTable_config::DENSITY_LOW:
- res.append("ldpi");
- break;
- case ResTable_config::DENSITY_MEDIUM:
- res.append("mdpi");
- break;
- case ResTable_config::DENSITY_TV:
- res.append("tvdpi");
- break;
- case ResTable_config::DENSITY_HIGH:
- res.append("hdpi");
- break;
- case ResTable_config::DENSITY_XHIGH:
- res.append("xhdpi");
- break;
- case ResTable_config::DENSITY_XXHIGH:
- res.append("xxhdpi");
- break;
- case ResTable_config::DENSITY_NONE:
- res.append("nodpi");
- break;
- default:
- res.appendFormat("%ddpi", dtohs(density));
- break;
- }
- }
- if (touchscreen != TOUCHSCREEN_ANY) {
- if (res.size() > 0) res.append("-");
- switch (touchscreen) {
- case ResTable_config::TOUCHSCREEN_NOTOUCH:
- res.append("notouch");
- break;
- case ResTable_config::TOUCHSCREEN_FINGER:
- res.append("finger");
- break;
- case ResTable_config::TOUCHSCREEN_STYLUS:
- res.append("stylus");
- break;
- default:
- res.appendFormat("touchscreen=%d", dtohs(touchscreen));
- break;
- }
- }
- if (keyboard != KEYBOARD_ANY) {
- if (res.size() > 0) res.append("-");
- switch (keyboard) {
- case ResTable_config::KEYBOARD_NOKEYS:
- res.append("nokeys");
- break;
- case ResTable_config::KEYBOARD_QWERTY:
- res.append("qwerty");
- break;
- case ResTable_config::KEYBOARD_12KEY:
- res.append("12key");
- break;
- default:
- res.appendFormat("keyboard=%d", dtohs(keyboard));
- break;
- }
- }
- if ((inputFlags&MASK_KEYSHIDDEN) != 0) {
- if (res.size() > 0) res.append("-");
- switch (inputFlags&MASK_KEYSHIDDEN) {
- case ResTable_config::KEYSHIDDEN_NO:
- res.append("keysexposed");
- break;
- case ResTable_config::KEYSHIDDEN_YES:
- res.append("keyshidden");
- break;
- case ResTable_config::KEYSHIDDEN_SOFT:
- res.append("keyssoft");
- break;
- }
- }
- if (navigation != NAVIGATION_ANY) {
- if (res.size() > 0) res.append("-");
- switch (navigation) {
- case ResTable_config::NAVIGATION_NONAV:
- res.append("nonav");
- break;
- case ResTable_config::NAVIGATION_DPAD:
- res.append("dpad");
- break;
- case ResTable_config::NAVIGATION_TRACKBALL:
- res.append("trackball");
- break;
- case ResTable_config::NAVIGATION_WHEEL:
- res.append("wheel");
- break;
- default:
- res.appendFormat("navigation=%d", dtohs(navigation));
- break;
- }
- }
- if ((inputFlags&MASK_NAVHIDDEN) != 0) {
- if (res.size() > 0) res.append("-");
- switch (inputFlags&MASK_NAVHIDDEN) {
- case ResTable_config::NAVHIDDEN_NO:
- res.append("navsexposed");
- break;
- case ResTable_config::NAVHIDDEN_YES:
- res.append("navhidden");
- break;
- default:
- res.appendFormat("inputFlagsNavHidden=%d",
- dtohs(inputFlags&MASK_NAVHIDDEN));
- break;
- }
- }
- if (screenSize != 0) {
- if (res.size() > 0) res.append("-");
- res.appendFormat("%dx%d", dtohs(screenWidth), dtohs(screenHeight));
- }
- if (version != 0) {
- if (res.size() > 0) res.append("-");
- res.appendFormat("v%d", dtohs(sdkVersion));
- if (minorVersion != 0) {
- res.appendFormat(".%d", dtohs(minorVersion));
- }
- }
-
- return res;
-}
-
-// --------------------------------------------------------------------
-// --------------------------------------------------------------------
-// --------------------------------------------------------------------
-
-struct ResTable::Header
-{
- Header(ResTable* _owner) : owner(_owner), ownedData(NULL), header(NULL),
- resourceIDMap(NULL), resourceIDMapSize(0) { }
-
- ~Header()
- {
- free(resourceIDMap);
- }
-
- ResTable* const owner;
- void* ownedData;
- const ResTable_header* header;
- size_t size;
- const uint8_t* dataEnd;
- size_t index;
- void* cookie;
-
- ResStringPool values;
- uint32_t* resourceIDMap;
- size_t resourceIDMapSize;
-};
-
-struct ResTable::Type
-{
- Type(const Header* _header, const Package* _package, size_t count)
- : header(_header), package(_package), entryCount(count),
- typeSpec(NULL), typeSpecFlags(NULL) { }
- const Header* const header;
- const Package* const package;
- const size_t entryCount;
- const ResTable_typeSpec* typeSpec;
- const uint32_t* typeSpecFlags;
- Vector<const ResTable_type*> configs;
-};
-
-struct ResTable::Package
-{
- Package(ResTable* _owner, const Header* _header, const ResTable_package* _package)
- : owner(_owner), header(_header), package(_package) { }
- ~Package()
- {
- size_t i = types.size();
- while (i > 0) {
- i--;
- delete types[i];
- }
- }
-
- ResTable* const owner;
- const Header* const header;
- const ResTable_package* const package;
- Vector<Type*> types;
-
- ResStringPool typeStrings;
- ResStringPool keyStrings;
-
- const Type* getType(size_t idx) const {
- return idx < types.size() ? types[idx] : NULL;
- }
-};
-
-// A group of objects describing a particular resource package.
-// The first in 'package' is always the root object (from the resource
-// table that defined the package); the ones after are skins on top of it.
-struct ResTable::PackageGroup
-{
- PackageGroup(ResTable* _owner, const String16& _name, uint32_t _id)
- : owner(_owner), name(_name), id(_id), typeCount(0), bags(NULL) { }
- ~PackageGroup() {
- clearBagCache();
- const size_t N = packages.size();
- for (size_t i=0; i<N; i++) {
- Package* pkg = packages[i];
- if (pkg->owner == owner) {
- delete pkg;
- }
- }
- }
-
- void clearBagCache() {
- if (bags) {
- TABLE_NOISY(printf("bags=%p\n", bags));
- Package* pkg = packages[0];
- TABLE_NOISY(printf("typeCount=%x\n", typeCount));
- for (size_t i=0; i<typeCount; i++) {
- TABLE_NOISY(printf("type=%d\n", i));
- const Type* type = pkg->getType(i);
- if (type != NULL) {
- bag_set** typeBags = bags[i];
- TABLE_NOISY(printf("typeBags=%p\n", typeBags));
- if (typeBags) {
- TABLE_NOISY(printf("type->entryCount=%x\n", type->entryCount));
- const size_t N = type->entryCount;
- for (size_t j=0; j<N; j++) {
- if (typeBags[j] && typeBags[j] != (bag_set*)0xFFFFFFFF)
- free(typeBags[j]);
- }
- free(typeBags);
- }
- }
- }
- free(bags);
- bags = NULL;
- }
- }
-
- ResTable* const owner;
- String16 const name;
- uint32_t const id;
- Vector<Package*> packages;
-
- // This is for finding typeStrings and other common package stuff.
- Package* basePackage;
-
- // For quick access.
- size_t typeCount;
-
- // Computed attribute bags, first indexed by the type and second
- // by the entry in that type.
- bag_set*** bags;
-};
-
-struct ResTable::bag_set
-{
- size_t numAttrs; // number in array
- size_t availAttrs; // total space in array
- uint32_t typeSpecFlags;
- // Followed by 'numAttr' bag_entry structures.
-};
-
-ResTable::Theme::Theme(const ResTable& table)
- : mTable(table)
-{
- memset(mPackages, 0, sizeof(mPackages));
-}
-
-ResTable::Theme::~Theme()
-{
- for (size_t i=0; i<Res_MAXPACKAGE; i++) {
- package_info* pi = mPackages[i];
- if (pi != NULL) {
- free_package(pi);
- }
- }
-}
-
-void ResTable::Theme::free_package(package_info* pi)
-{
- for (size_t j=0; j<pi->numTypes; j++) {
- theme_entry* te = pi->types[j].entries;
- if (te != NULL) {
- free(te);
- }
- }
- free(pi);
-}
-
-ResTable::Theme::package_info* ResTable::Theme::copy_package(package_info* pi)
-{
- package_info* newpi = (package_info*)malloc(
- sizeof(package_info) + (pi->numTypes*sizeof(type_info)));
- newpi->numTypes = pi->numTypes;
- for (size_t j=0; j<newpi->numTypes; j++) {
- size_t cnt = pi->types[j].numEntries;
- newpi->types[j].numEntries = cnt;
- theme_entry* te = pi->types[j].entries;
- if (te != NULL) {
- theme_entry* newte = (theme_entry*)malloc(cnt*sizeof(theme_entry));
- newpi->types[j].entries = newte;
- memcpy(newte, te, cnt*sizeof(theme_entry));
- } else {
- newpi->types[j].entries = NULL;
- }
- }
- return newpi;
-}
-
-status_t ResTable::Theme::applyStyle(uint32_t resID, bool force)
-{
- const bag_entry* bag;
- uint32_t bagTypeSpecFlags = 0;
- mTable.lock();
- const ssize_t N = mTable.getBagLocked(resID, &bag, &bagTypeSpecFlags);
- TABLE_NOISY(ALOGV("Applying style 0x%08x to theme %p, count=%d", resID, this, N));
- if (N < 0) {
- mTable.unlock();
- return N;
- }
-
- uint32_t curPackage = 0xffffffff;
- ssize_t curPackageIndex = 0;
- package_info* curPI = NULL;
- uint32_t curType = 0xffffffff;
- size_t numEntries = 0;
- theme_entry* curEntries = NULL;
-
- const bag_entry* end = bag + N;
- while (bag < end) {
- const uint32_t attrRes = bag->map.name.ident;
- const uint32_t p = Res_GETPACKAGE(attrRes);
- const uint32_t t = Res_GETTYPE(attrRes);
- const uint32_t e = Res_GETENTRY(attrRes);
-
- if (curPackage != p) {
- const ssize_t pidx = mTable.getResourcePackageIndex(attrRes);
- if (pidx < 0) {
- ALOGE("Style contains key with bad package: 0x%08x\n", attrRes);
- bag++;
- continue;
- }
- curPackage = p;
- curPackageIndex = pidx;
- curPI = mPackages[pidx];
- if (curPI == NULL) {
- PackageGroup* const grp = mTable.mPackageGroups[pidx];
- int cnt = grp->typeCount;
- curPI = (package_info*)malloc(
- sizeof(package_info) + (cnt*sizeof(type_info)));
- curPI->numTypes = cnt;
- memset(curPI->types, 0, cnt*sizeof(type_info));
- mPackages[pidx] = curPI;
- }
- curType = 0xffffffff;
- }
- if (curType != t) {
- if (t >= curPI->numTypes) {
- ALOGE("Style contains key with bad type: 0x%08x\n", attrRes);
- bag++;
- continue;
- }
- curType = t;
- curEntries = curPI->types[t].entries;
- if (curEntries == NULL) {
- PackageGroup* const grp = mTable.mPackageGroups[curPackageIndex];
- const Type* type = grp->packages[0]->getType(t);
- int cnt = type != NULL ? type->entryCount : 0;
- curEntries = (theme_entry*)malloc(cnt*sizeof(theme_entry));
- memset(curEntries, Res_value::TYPE_NULL, cnt*sizeof(theme_entry));
- curPI->types[t].numEntries = cnt;
- curPI->types[t].entries = curEntries;
- }
- numEntries = curPI->types[t].numEntries;
- }
- if (e >= numEntries) {
- ALOGE("Style contains key with bad entry: 0x%08x\n", attrRes);
- bag++;
- continue;
- }
- theme_entry* curEntry = curEntries + e;
- TABLE_NOISY(ALOGV("Attr 0x%08x: type=0x%x, data=0x%08x; curType=0x%x",
- attrRes, bag->map.value.dataType, bag->map.value.data,
- curEntry->value.dataType));
- if (force || curEntry->value.dataType == Res_value::TYPE_NULL) {
- curEntry->stringBlock = bag->stringBlock;
- curEntry->typeSpecFlags |= bagTypeSpecFlags;
- curEntry->value = bag->map.value;
- }
-
- bag++;
- }
-
- mTable.unlock();
-
- //ALOGI("Applying style 0x%08x (force=%d) theme %p...\n", resID, force, this);
- //dumpToLog();
-
- return NO_ERROR;
-}
-
-status_t ResTable::Theme::setTo(const Theme& other)
-{
- //ALOGI("Setting theme %p from theme %p...\n", this, &other);
- //dumpToLog();
- //other.dumpToLog();
-
- if (&mTable == &other.mTable) {
- for (size_t i=0; i<Res_MAXPACKAGE; i++) {
- if (mPackages[i] != NULL) {
- free_package(mPackages[i]);
- }
- if (other.mPackages[i] != NULL) {
- mPackages[i] = copy_package(other.mPackages[i]);
- } else {
- mPackages[i] = NULL;
- }
- }
- } else {
- // @todo: need to really implement this, not just copy
- // the system package (which is still wrong because it isn't
- // fixing up resource references).
- for (size_t i=0; i<Res_MAXPACKAGE; i++) {
- if (mPackages[i] != NULL) {
- free_package(mPackages[i]);
- }
- if (i == 0 && other.mPackages[i] != NULL) {
- mPackages[i] = copy_package(other.mPackages[i]);
- } else {
- mPackages[i] = NULL;
- }
- }
- }
-
- //ALOGI("Final theme:");
- //dumpToLog();
-
- return NO_ERROR;
-}
-
-ssize_t ResTable::Theme::getAttribute(uint32_t resID, Res_value* outValue,
- uint32_t* outTypeSpecFlags) const
-{
- int cnt = 20;
-
- if (outTypeSpecFlags != NULL) *outTypeSpecFlags = 0;
-
- do {
- const ssize_t p = mTable.getResourcePackageIndex(resID);
- const uint32_t t = Res_GETTYPE(resID);
- const uint32_t e = Res_GETENTRY(resID);
-
- TABLE_THEME(ALOGI("Looking up attr 0x%08x in theme %p", resID, this));
-
- if (p >= 0) {
- const package_info* const pi = mPackages[p];
- TABLE_THEME(ALOGI("Found package: %p", pi));
- if (pi != NULL) {
- TABLE_THEME(ALOGI("Desired type index is %ld in avail %d", t, pi->numTypes));
- if (t < pi->numTypes) {
- const type_info& ti = pi->types[t];
- TABLE_THEME(ALOGI("Desired entry index is %ld in avail %d", e, ti.numEntries));
- if (e < ti.numEntries) {
- const theme_entry& te = ti.entries[e];
- if (outTypeSpecFlags != NULL) {
- *outTypeSpecFlags |= te.typeSpecFlags;
- }
- TABLE_THEME(ALOGI("Theme value: type=0x%x, data=0x%08x",
- te.value.dataType, te.value.data));
- const uint8_t type = te.value.dataType;
- if (type == Res_value::TYPE_ATTRIBUTE) {
- if (cnt > 0) {
- cnt--;
- resID = te.value.data;
- continue;
- }
- ALOGW("Too many attribute references, stopped at: 0x%08x\n", resID);
- return BAD_INDEX;
- } else if (type != Res_value::TYPE_NULL) {
- *outValue = te.value;
- return te.stringBlock;
- }
- return BAD_INDEX;
- }
- }
- }
- }
- break;
-
- } while (true);
-
- return BAD_INDEX;
-}
-
-ssize_t ResTable::Theme::resolveAttributeReference(Res_value* inOutValue,
- ssize_t blockIndex, uint32_t* outLastRef,
- uint32_t* inoutTypeSpecFlags, ResTable_config* inoutConfig) const
-{
- //printf("Resolving type=0x%x\n", inOutValue->dataType);
- if (inOutValue->dataType == Res_value::TYPE_ATTRIBUTE) {
- uint32_t newTypeSpecFlags;
- blockIndex = getAttribute(inOutValue->data, inOutValue, &newTypeSpecFlags);
- TABLE_THEME(ALOGI("Resolving attr reference: blockIndex=%d, type=0x%x, data=%p\n",
- (int)blockIndex, (int)inOutValue->dataType, (void*)inOutValue->data));
- if (inoutTypeSpecFlags != NULL) *inoutTypeSpecFlags |= newTypeSpecFlags;
- //printf("Retrieved attribute new type=0x%x\n", inOutValue->dataType);
- if (blockIndex < 0) {
- return blockIndex;
- }
- }
- return mTable.resolveReference(inOutValue, blockIndex, outLastRef,
- inoutTypeSpecFlags, inoutConfig);
-}
-
-void ResTable::Theme::dumpToLog() const
-{
- ALOGI("Theme %p:\n", this);
- for (size_t i=0; i<Res_MAXPACKAGE; i++) {
- package_info* pi = mPackages[i];
- if (pi == NULL) continue;
-
- ALOGI(" Package #0x%02x:\n", (int)(i+1));
- for (size_t j=0; j<pi->numTypes; j++) {
- type_info& ti = pi->types[j];
- if (ti.numEntries == 0) continue;
-
- ALOGI(" Type #0x%02x:\n", (int)(j+1));
- for (size_t k=0; k<ti.numEntries; k++) {
- theme_entry& te = ti.entries[k];
- if (te.value.dataType == Res_value::TYPE_NULL) continue;
- ALOGI(" 0x%08x: t=0x%x, d=0x%08x (block=%d)\n",
- (int)Res_MAKEID(i, j, k),
- te.value.dataType, (int)te.value.data, (int)te.stringBlock);
- }
- }
- }
-}
-
-ResTable::ResTable()
- : mError(NO_INIT)
-{
- memset(&mParams, 0, sizeof(mParams));
- memset(mPackageMap, 0, sizeof(mPackageMap));
- //ALOGI("Creating ResTable %p\n", this);
-}
-
-ResTable::ResTable(const void* data, size_t size, void* cookie, bool copyData)
- : mError(NO_INIT)
-{
- memset(&mParams, 0, sizeof(mParams));
- memset(mPackageMap, 0, sizeof(mPackageMap));
- add(data, size, cookie, copyData);
- LOG_FATAL_IF(mError != NO_ERROR, "Error parsing resource table");
- //ALOGI("Creating ResTable %p\n", this);
-}
-
-ResTable::~ResTable()
-{
- //ALOGI("Destroying ResTable in %p\n", this);
- uninit();
-}
-
-inline ssize_t ResTable::getResourcePackageIndex(uint32_t resID) const
-{
- return ((ssize_t)mPackageMap[Res_GETPACKAGE(resID)+1])-1;
-}
-
-status_t ResTable::add(const void* data, size_t size, void* cookie, bool copyData,
- const void* idmap)
-{
- return add(data, size, cookie, NULL, copyData, reinterpret_cast<const Asset*>(idmap));
-}
-
-status_t ResTable::add(Asset* asset, void* cookie, bool copyData, const void* idmap)
-{
- const void* data = asset->getBuffer(true);
- if (data == NULL) {
- ALOGW("Unable to get buffer of resource asset file");
- return UNKNOWN_ERROR;
- }
- size_t size = (size_t)asset->getLength();
- return add(data, size, cookie, asset, copyData, reinterpret_cast<const Asset*>(idmap));
-}
-
-status_t ResTable::add(ResTable* src)
-{
- mError = src->mError;
-
- for (size_t i=0; i<src->mHeaders.size(); i++) {
- mHeaders.add(src->mHeaders[i]);
- }
-
- for (size_t i=0; i<src->mPackageGroups.size(); i++) {
- PackageGroup* srcPg = src->mPackageGroups[i];
- PackageGroup* pg = new PackageGroup(this, srcPg->name, srcPg->id);
- for (size_t j=0; j<srcPg->packages.size(); j++) {
- pg->packages.add(srcPg->packages[j]);
- }
- pg->basePackage = srcPg->basePackage;
- pg->typeCount = srcPg->typeCount;
- mPackageGroups.add(pg);
- }
-
- memcpy(mPackageMap, src->mPackageMap, sizeof(mPackageMap));
-
- return mError;
-}
-
-status_t ResTable::add(const void* data, size_t size, void* cookie,
- Asset* asset, bool copyData, const Asset* idmap)
-{
- if (!data) return NO_ERROR;
- Header* header = new Header(this);
- header->index = mHeaders.size();
- header->cookie = cookie;
- if (idmap != NULL) {
- const size_t idmap_size = idmap->getLength();
- const void* idmap_data = const_cast<Asset*>(idmap)->getBuffer(true);
- header->resourceIDMap = (uint32_t*)malloc(idmap_size);
- if (header->resourceIDMap == NULL) {
- delete header;
- return (mError = NO_MEMORY);
- }
- memcpy((void*)header->resourceIDMap, idmap_data, idmap_size);
- header->resourceIDMapSize = idmap_size;
- }
- mHeaders.add(header);
-
- const bool notDeviceEndian = htods(0xf0) != 0xf0;
-
- LOAD_TABLE_NOISY(
- ALOGV("Adding resources to ResTable: data=%p, size=0x%x, cookie=%p, asset=%p, copy=%d "
- "idmap=%p\n", data, size, cookie, asset, copyData, idmap));
-
- if (copyData || notDeviceEndian) {
- header->ownedData = malloc(size);
- if (header->ownedData == NULL) {
- return (mError=NO_MEMORY);
- }
- memcpy(header->ownedData, data, size);
- data = header->ownedData;
- }
-
- header->header = (const ResTable_header*)data;
- header->size = dtohl(header->header->header.size);
- //ALOGI("Got size 0x%x, again size 0x%x, raw size 0x%x\n", header->size,
- // dtohl(header->header->header.size), header->header->header.size);
- LOAD_TABLE_NOISY(ALOGV("Loading ResTable @%p:\n", header->header));
- LOAD_TABLE_NOISY(printHexData(2, header->header, header->size < 256 ? header->size : 256,
- 16, 16, 0, false, printToLogFunc));
- if (dtohs(header->header->header.headerSize) > header->size
- || header->size > size) {
- ALOGW("Bad resource table: header size 0x%x or total size 0x%x is larger than data size 0x%x\n",
- (int)dtohs(header->header->header.headerSize),
- (int)header->size, (int)size);
- return (mError=BAD_TYPE);
- }
- if (((dtohs(header->header->header.headerSize)|header->size)&0x3) != 0) {
- ALOGW("Bad resource table: header size 0x%x or total size 0x%x is not on an integer boundary\n",
- (int)dtohs(header->header->header.headerSize),
- (int)header->size);
- return (mError=BAD_TYPE);
- }
- header->dataEnd = ((const uint8_t*)header->header) + header->size;
-
- // Iterate through all chunks.
- size_t curPackage = 0;
-
- const ResChunk_header* chunk =
- (const ResChunk_header*)(((const uint8_t*)header->header)
- + dtohs(header->header->header.headerSize));
- while (((const uint8_t*)chunk) <= (header->dataEnd-sizeof(ResChunk_header)) &&
- ((const uint8_t*)chunk) <= (header->dataEnd-dtohl(chunk->size))) {
- status_t err = validate_chunk(chunk, sizeof(ResChunk_header), header->dataEnd, "ResTable");
- if (err != NO_ERROR) {
- return (mError=err);
- }
- TABLE_NOISY(ALOGV("Chunk: type=0x%x, headerSize=0x%x, size=0x%x, pos=%p\n",
- dtohs(chunk->type), dtohs(chunk->headerSize), dtohl(chunk->size),
- (void*)(((const uint8_t*)chunk) - ((const uint8_t*)header->header))));
- const size_t csize = dtohl(chunk->size);
- const uint16_t ctype = dtohs(chunk->type);
- if (ctype == RES_STRING_POOL_TYPE) {
- if (header->values.getError() != NO_ERROR) {
- // Only use the first string chunk; ignore any others that
- // may appear.
- status_t err = header->values.setTo(chunk, csize);
- if (err != NO_ERROR) {
- return (mError=err);
- }
- } else {
- ALOGW("Multiple string chunks found in resource table.");
- }
- } else if (ctype == RES_TABLE_PACKAGE_TYPE) {
- if (curPackage >= dtohl(header->header->packageCount)) {
- ALOGW("More package chunks were found than the %d declared in the header.",
- dtohl(header->header->packageCount));
- return (mError=BAD_TYPE);
- }
- uint32_t idmap_id = 0;
- if (idmap != NULL) {
- uint32_t tmp;
- if (getIdmapPackageId(header->resourceIDMap,
- header->resourceIDMapSize,
- &tmp) == NO_ERROR) {
- idmap_id = tmp;
- }
- }
- if (parsePackage((ResTable_package*)chunk, header, idmap_id) != NO_ERROR) {
- return mError;
- }
- curPackage++;
- } else {
- ALOGW("Unknown chunk type %p in table at %p.\n",
- (void*)(int)(ctype),
- (void*)(((const uint8_t*)chunk) - ((const uint8_t*)header->header)));
- }
- chunk = (const ResChunk_header*)
- (((const uint8_t*)chunk) + csize);
- }
-
- if (curPackage < dtohl(header->header->packageCount)) {
- ALOGW("Fewer package chunks (%d) were found than the %d declared in the header.",
- (int)curPackage, dtohl(header->header->packageCount));
- return (mError=BAD_TYPE);
- }
- mError = header->values.getError();
- if (mError != NO_ERROR) {
- ALOGW("No string values found in resource table!");
- }
-
- TABLE_NOISY(ALOGV("Returning from add with mError=%d\n", mError));
- return mError;
-}
-
-status_t ResTable::getError() const
-{
- return mError;
-}
-
-void ResTable::uninit()
-{
- mError = NO_INIT;
- size_t N = mPackageGroups.size();
- for (size_t i=0; i<N; i++) {
- PackageGroup* g = mPackageGroups[i];
- delete g;
- }
- N = mHeaders.size();
- for (size_t i=0; i<N; i++) {
- Header* header = mHeaders[i];
- if (header->owner == this) {
- if (header->ownedData) {
- free(header->ownedData);
- }
- delete header;
- }
- }
-
- mPackageGroups.clear();
- mHeaders.clear();
-}
-
-bool ResTable::getResourceName(uint32_t resID, bool allowUtf8, resource_name* outName) const
-{
- if (mError != NO_ERROR) {
- return false;
- }
-
- const ssize_t p = getResourcePackageIndex(resID);
- const int t = Res_GETTYPE(resID);
- const int e = Res_GETENTRY(resID);
-
- if (p < 0) {
- if (Res_GETPACKAGE(resID)+1 == 0) {
- ALOGW("No package identifier when getting name for resource number 0x%08x", resID);
- } else {
- ALOGW("No known package when getting name for resource number 0x%08x", resID);
- }
- return false;
- }
- if (t < 0) {
- ALOGW("No type identifier when getting name for resource number 0x%08x", resID);
- return false;
- }
-
- const PackageGroup* const grp = mPackageGroups[p];
- if (grp == NULL) {
- ALOGW("Bad identifier when getting name for resource number 0x%08x", resID);
- return false;
- }
- if (grp->packages.size() > 0) {
- const Package* const package = grp->packages[0];
-
- const ResTable_type* type;
- const ResTable_entry* entry;
- ssize_t offset = getEntry(package, t, e, NULL, &type, &entry, NULL);
- if (offset <= 0) {
- return false;
- }
-
- outName->package = grp->name.string();
- outName->packageLen = grp->name.size();
- if (allowUtf8) {
- outName->type8 = grp->basePackage->typeStrings.string8At(t, &outName->typeLen);
- outName->name8 = grp->basePackage->keyStrings.string8At(
- dtohl(entry->key.index), &outName->nameLen);
- } else {
- outName->type8 = NULL;
- outName->name8 = NULL;
- }
- if (outName->type8 == NULL) {
- outName->type = grp->basePackage->typeStrings.stringAt(t, &outName->typeLen);
- // If we have a bad index for some reason, we should abort.
- if (outName->type == NULL) {
- return false;
- }
- }
- if (outName->name8 == NULL) {
- outName->name = grp->basePackage->keyStrings.stringAt(
- dtohl(entry->key.index), &outName->nameLen);
- // If we have a bad index for some reason, we should abort.
- if (outName->name == NULL) {
- return false;
- }
- }
-
- return true;
- }
-
- return false;
-}
-
-ssize_t ResTable::getResource(uint32_t resID, Res_value* outValue, bool mayBeBag, uint16_t density,
- uint32_t* outSpecFlags, ResTable_config* outConfig) const
-{
- if (mError != NO_ERROR) {
- return mError;
- }
-
- const ssize_t p = getResourcePackageIndex(resID);
- const int t = Res_GETTYPE(resID);
- const int e = Res_GETENTRY(resID);
-
- if (p < 0) {
- if (Res_GETPACKAGE(resID)+1 == 0) {
- ALOGW("No package identifier when getting value for resource number 0x%08x", resID);
- } else {
- ALOGW("No known package when getting value for resource number 0x%08x", resID);
- }
- return BAD_INDEX;
- }
- if (t < 0) {
- ALOGW("No type identifier when getting value for resource number 0x%08x", resID);
- return BAD_INDEX;
- }
-
- const Res_value* bestValue = NULL;
- const Package* bestPackage = NULL;
- ResTable_config bestItem;
- memset(&bestItem, 0, sizeof(bestItem)); // make the compiler shut up
-
- if (outSpecFlags != NULL) *outSpecFlags = 0;
-
- // Look through all resource packages, starting with the most
- // recently added.
- const PackageGroup* const grp = mPackageGroups[p];
- if (grp == NULL) {
- ALOGW("Bad identifier when getting value for resource number 0x%08x", resID);
- return BAD_INDEX;
- }
-
- // Allow overriding density
- const ResTable_config* desiredConfig = &mParams;
- ResTable_config* overrideConfig = NULL;
- if (density > 0) {
- overrideConfig = (ResTable_config*) malloc(sizeof(ResTable_config));
- if (overrideConfig == NULL) {
- ALOGE("Couldn't malloc ResTable_config for overrides: %s", strerror(errno));
- return BAD_INDEX;
- }
- memcpy(overrideConfig, &mParams, sizeof(ResTable_config));
- overrideConfig->density = density;
- desiredConfig = overrideConfig;
- }
-
- ssize_t rc = BAD_VALUE;
- size_t ip = grp->packages.size();
- while (ip > 0) {
- ip--;
- int T = t;
- int E = e;
-
- const Package* const package = grp->packages[ip];
- if (package->header->resourceIDMap) {
- uint32_t overlayResID = 0x0;
- status_t retval = idmapLookup(package->header->resourceIDMap,
- package->header->resourceIDMapSize,
- resID, &overlayResID);
- if (retval == NO_ERROR && overlayResID != 0x0) {
- // for this loop iteration, this is the type and entry we really want
- ALOGV("resource map 0x%08x -> 0x%08x\n", resID, overlayResID);
- T = Res_GETTYPE(overlayResID);
- E = Res_GETENTRY(overlayResID);
- } else {
- // resource not present in overlay package, continue with the next package
- continue;
- }
- }
-
- const ResTable_type* type;
- const ResTable_entry* entry;
- const Type* typeClass;
- ssize_t offset = getEntry(package, T, E, desiredConfig, &type, &entry, &typeClass);
- if (offset <= 0) {
- // No {entry, appropriate config} pair found in package. If this
- // package is an overlay package (ip != 0), this simply means the
- // overlay package did not specify a default.
- // Non-overlay packages are still required to provide a default.
- if (offset < 0 && ip == 0) {
- ALOGW("Failure getting entry for 0x%08x (t=%d e=%d) in package %zd (error %d)\n",
- resID, T, E, ip, (int)offset);
- rc = offset;
- goto out;
- }
- continue;
- }
-
- if ((dtohs(entry->flags)&entry->FLAG_COMPLEX) != 0) {
- if (!mayBeBag) {
- ALOGW("Requesting resource %p failed because it is complex\n",
- (void*)resID);
- }
- continue;
- }
-
- TABLE_NOISY(aout << "Resource type data: "
- << HexDump(type, dtohl(type->header.size)) << endl);
-
- if ((size_t)offset > (dtohl(type->header.size)-sizeof(Res_value))) {
- ALOGW("ResTable_item at %d is beyond type chunk data %d",
- (int)offset, dtohl(type->header.size));
- rc = BAD_TYPE;
- goto out;
- }
-
- const Res_value* item =
- (const Res_value*)(((const uint8_t*)type) + offset);
- ResTable_config thisConfig;
- thisConfig.copyFromDtoH(type->config);
-
- if (outSpecFlags != NULL) {
- if (typeClass->typeSpecFlags != NULL) {
- *outSpecFlags |= dtohl(typeClass->typeSpecFlags[E]);
- } else {
- *outSpecFlags = -1;
- }
- }
-
- if (bestPackage != NULL &&
- (bestItem.isMoreSpecificThan(thisConfig) || bestItem.diff(thisConfig) == 0)) {
- // Discard thisConfig not only if bestItem is more specific, but also if the two configs
- // are identical (diff == 0), or overlay packages will not take effect.
- continue;
- }
-
- bestItem = thisConfig;
- bestValue = item;
- bestPackage = package;
- }
-
- TABLE_NOISY(printf("Found result: package %p\n", bestPackage));
-
- if (bestValue) {
- outValue->size = dtohs(bestValue->size);
- outValue->res0 = bestValue->res0;
- outValue->dataType = bestValue->dataType;
- outValue->data = dtohl(bestValue->data);
- if (outConfig != NULL) {
- *outConfig = bestItem;
- }
- TABLE_NOISY(size_t len;
- printf("Found value: pkg=%d, type=%d, str=%s, int=%d\n",
- bestPackage->header->index,
- outValue->dataType,
- outValue->dataType == bestValue->TYPE_STRING
- ? String8(bestPackage->header->values.stringAt(
- outValue->data, &len)).string()
- : "",
- outValue->data));
- rc = bestPackage->header->index;
- goto out;
- }
-
-out:
- if (overrideConfig != NULL) {
- free(overrideConfig);
- }
-
- return rc;
-}
-
-ssize_t ResTable::resolveReference(Res_value* value, ssize_t blockIndex,
- uint32_t* outLastRef, uint32_t* inoutTypeSpecFlags,
- ResTable_config* outConfig) const
-{
- int count=0;
- while (blockIndex >= 0 && value->dataType == value->TYPE_REFERENCE
- && value->data != 0 && count < 20) {
- if (outLastRef) *outLastRef = value->data;
- uint32_t lastRef = value->data;
- uint32_t newFlags = 0;
- const ssize_t newIndex = getResource(value->data, value, true, 0, &newFlags,
- outConfig);
- if (newIndex == BAD_INDEX) {
- return BAD_INDEX;
- }
- TABLE_THEME(ALOGI("Resolving reference %p: newIndex=%d, type=0x%x, data=%p\n",
- (void*)lastRef, (int)newIndex, (int)value->dataType, (void*)value->data));
- //printf("Getting reference 0x%08x: newIndex=%d\n", value->data, newIndex);
- if (inoutTypeSpecFlags != NULL) *inoutTypeSpecFlags |= newFlags;
- if (newIndex < 0) {
- // This can fail if the resource being referenced is a style...
- // in this case, just return the reference, and expect the
- // caller to deal with.
- return blockIndex;
- }
- blockIndex = newIndex;
- count++;
- }
- return blockIndex;
-}
-
-const char16_t* ResTable::valueToString(
- const Res_value* value, size_t stringBlock,
- char16_t tmpBuffer[TMP_BUFFER_SIZE], size_t* outLen)
-{
- if (!value) {
- return NULL;
- }
- if (value->dataType == value->TYPE_STRING) {
- return getTableStringBlock(stringBlock)->stringAt(value->data, outLen);
- }
- // XXX do int to string conversions.
- return NULL;
-}
-
-ssize_t ResTable::lockBag(uint32_t resID, const bag_entry** outBag) const
-{
- mLock.lock();
- ssize_t err = getBagLocked(resID, outBag);
- if (err < NO_ERROR) {
- //printf("*** get failed! unlocking\n");
- mLock.unlock();
- }
- return err;
-}
-
-void ResTable::unlockBag(const bag_entry* bag) const
-{
- //printf("<<< unlockBag %p\n", this);
- mLock.unlock();
-}
-
-void ResTable::lock() const
-{
- mLock.lock();
-}
-
-void ResTable::unlock() const
-{
- mLock.unlock();
-}
-
-ssize_t ResTable::getBagLocked(uint32_t resID, const bag_entry** outBag,
- uint32_t* outTypeSpecFlags) const
-{
- if (mError != NO_ERROR) {
- return mError;
- }
-
- const ssize_t p = getResourcePackageIndex(resID);
- const int t = Res_GETTYPE(resID);
- const int e = Res_GETENTRY(resID);
-
- if (p < 0) {
- ALOGW("Invalid package identifier when getting bag for resource number 0x%08x", resID);
- return BAD_INDEX;
- }
- if (t < 0) {
- ALOGW("No type identifier when getting bag for resource number 0x%08x", resID);
- return BAD_INDEX;
- }
-
- //printf("Get bag: id=0x%08x, p=%d, t=%d\n", resID, p, t);
- PackageGroup* const grp = mPackageGroups[p];
- if (grp == NULL) {
- ALOGW("Bad identifier when getting bag for resource number 0x%08x", resID);
- return false;
- }
-
- if (t >= (int)grp->typeCount) {
- ALOGW("Type identifier 0x%x is larger than type count 0x%x",
- t+1, (int)grp->typeCount);
- return BAD_INDEX;
- }
-
- const Package* const basePackage = grp->packages[0];
-
- const Type* const typeConfigs = basePackage->getType(t);
-
- const size_t NENTRY = typeConfigs->entryCount;
- if (e >= (int)NENTRY) {
- ALOGW("Entry identifier 0x%x is larger than entry count 0x%x",
- e, (int)typeConfigs->entryCount);
- return BAD_INDEX;
- }
-
- // First see if we've already computed this bag...
- if (grp->bags) {
- bag_set** typeSet = grp->bags[t];
- if (typeSet) {
- bag_set* set = typeSet[e];
- if (set) {
- if (set != (bag_set*)0xFFFFFFFF) {
- if (outTypeSpecFlags != NULL) {
- *outTypeSpecFlags = set->typeSpecFlags;
- }
- *outBag = (bag_entry*)(set+1);
- //ALOGI("Found existing bag for: %p\n", (void*)resID);
- return set->numAttrs;
- }
- ALOGW("Attempt to retrieve bag 0x%08x which is invalid or in a cycle.",
- resID);
- return BAD_INDEX;
- }
- }
- }
-
- // Bag not found, we need to compute it!
- if (!grp->bags) {
- grp->bags = (bag_set***)calloc(grp->typeCount, sizeof(bag_set*));
- if (!grp->bags) return NO_MEMORY;
- }
-
- bag_set** typeSet = grp->bags[t];
- if (!typeSet) {
- typeSet = (bag_set**)calloc(NENTRY, sizeof(bag_set*));
- if (!typeSet) return NO_MEMORY;
- grp->bags[t] = typeSet;
- }
-
- // Mark that we are currently working on this one.
- typeSet[e] = (bag_set*)0xFFFFFFFF;
-
- // This is what we are building.
- bag_set* set = NULL;
-
- TABLE_NOISY(ALOGI("Building bag: %p\n", (void*)resID));
-
- ResTable_config bestConfig;
- memset(&bestConfig, 0, sizeof(bestConfig));
-
- // Now collect all bag attributes from all packages.
- size_t ip = grp->packages.size();
- while (ip > 0) {
- ip--;
- int T = t;
- int E = e;
-
- const Package* const package = grp->packages[ip];
- if (package->header->resourceIDMap) {
- uint32_t overlayResID = 0x0;
- status_t retval = idmapLookup(package->header->resourceIDMap,
- package->header->resourceIDMapSize,
- resID, &overlayResID);
- if (retval == NO_ERROR && overlayResID != 0x0) {
- // for this loop iteration, this is the type and entry we really want
- ALOGV("resource map 0x%08x -> 0x%08x\n", resID, overlayResID);
- T = Res_GETTYPE(overlayResID);
- E = Res_GETENTRY(overlayResID);
- } else {
- // resource not present in overlay package, continue with the next package
- continue;
- }
- }
-
- const ResTable_type* type;
- const ResTable_entry* entry;
- const Type* typeClass;
- ALOGV("Getting entry pkg=%p, t=%d, e=%d\n", package, T, E);
- ssize_t offset = getEntry(package, T, E, &mParams, &type, &entry, &typeClass);
- ALOGV("Resulting offset=%d\n", offset);
- if (offset <= 0) {
- // No {entry, appropriate config} pair found in package. If this
- // package is an overlay package (ip != 0), this simply means the
- // overlay package did not specify a default.
- // Non-overlay packages are still required to provide a default.
- if (offset < 0 && ip == 0) {
- if (set) free(set);
- return offset;
- }
- continue;
- }
-
- if ((dtohs(entry->flags)&entry->FLAG_COMPLEX) == 0) {
- ALOGW("Skipping entry %p in package table %d because it is not complex!\n",
- (void*)resID, (int)ip);
- continue;
- }
-
- if (set != NULL && !type->config.isBetterThan(bestConfig, NULL)) {
- continue;
- }
- bestConfig = type->config;
- if (set) {
- free(set);
- set = NULL;
- }
-
- const uint16_t entrySize = dtohs(entry->size);
- const uint32_t parent = entrySize >= sizeof(ResTable_map_entry)
- ? dtohl(((const ResTable_map_entry*)entry)->parent.ident) : 0;
- const uint32_t count = entrySize >= sizeof(ResTable_map_entry)
- ? dtohl(((const ResTable_map_entry*)entry)->count) : 0;
-
- size_t N = count;
-
- TABLE_NOISY(ALOGI("Found map: size=%p parent=%p count=%d\n",
- entrySize, parent, count));
-
- // If this map inherits from another, we need to start
- // with its parent's values. Otherwise start out empty.
- TABLE_NOISY(printf("Creating new bag, entrySize=0x%08x, parent=0x%08x\n",
- entrySize, parent));
- if (parent) {
- const bag_entry* parentBag;
- uint32_t parentTypeSpecFlags = 0;
- const ssize_t NP = getBagLocked(parent, &parentBag, &parentTypeSpecFlags);
- const size_t NT = ((NP >= 0) ? NP : 0) + N;
- set = (bag_set*)malloc(sizeof(bag_set)+sizeof(bag_entry)*NT);
- if (set == NULL) {
- return NO_MEMORY;
- }
- if (NP > 0) {
- memcpy(set+1, parentBag, NP*sizeof(bag_entry));
- set->numAttrs = NP;
- TABLE_NOISY(ALOGI("Initialized new bag with %d inherited attributes.\n", NP));
- } else {
- TABLE_NOISY(ALOGI("Initialized new bag with no inherited attributes.\n"));
- set->numAttrs = 0;
- }
- set->availAttrs = NT;
- set->typeSpecFlags = parentTypeSpecFlags;
- } else {
- set = (bag_set*)malloc(sizeof(bag_set)+sizeof(bag_entry)*N);
- if (set == NULL) {
- return NO_MEMORY;
- }
- set->numAttrs = 0;
- set->availAttrs = N;
- set->typeSpecFlags = 0;
- }
-
- if (typeClass->typeSpecFlags != NULL) {
- set->typeSpecFlags |= dtohl(typeClass->typeSpecFlags[E]);
- } else {
- set->typeSpecFlags = -1;
- }
-
- // Now merge in the new attributes...
- ssize_t curOff = offset;
- const ResTable_map* map;
- bag_entry* entries = (bag_entry*)(set+1);
- size_t curEntry = 0;
- uint32_t pos = 0;
- TABLE_NOISY(ALOGI("Starting with set %p, entries=%p, avail=%d\n",
- set, entries, set->availAttrs));
- while (pos < count) {
- TABLE_NOISY(printf("Now at %p\n", (void*)curOff));
-
- if ((size_t)curOff > (dtohl(type->header.size)-sizeof(ResTable_map))) {
- ALOGW("ResTable_map at %d is beyond type chunk data %d",
- (int)curOff, dtohl(type->header.size));
- return BAD_TYPE;
- }
- map = (const ResTable_map*)(((const uint8_t*)type) + curOff);
- N++;
-
- const uint32_t newName = htodl(map->name.ident);
- bool isInside;
- uint32_t oldName = 0;
- while ((isInside=(curEntry < set->numAttrs))
- && (oldName=entries[curEntry].map.name.ident) < newName) {
- TABLE_NOISY(printf("#%d: Keeping existing attribute: 0x%08x\n",
- curEntry, entries[curEntry].map.name.ident));
- curEntry++;
- }
-
- if ((!isInside) || oldName != newName) {
- // This is a new attribute... figure out what to do with it.
- if (set->numAttrs >= set->availAttrs) {
- // Need to alloc more memory...
- const size_t newAvail = set->availAttrs+N;
- set = (bag_set*)realloc(set,
- sizeof(bag_set)
- + sizeof(bag_entry)*newAvail);
- if (set == NULL) {
- return NO_MEMORY;
- }
- set->availAttrs = newAvail;
- entries = (bag_entry*)(set+1);
- TABLE_NOISY(printf("Reallocated set %p, entries=%p, avail=%d\n",
- set, entries, set->availAttrs));
- }
- if (isInside) {
- // Going in the middle, need to make space.
- memmove(entries+curEntry+1, entries+curEntry,
- sizeof(bag_entry)*(set->numAttrs-curEntry));
- set->numAttrs++;
- }
- TABLE_NOISY(printf("#%d: Inserting new attribute: 0x%08x\n",
- curEntry, newName));
- } else {
- TABLE_NOISY(printf("#%d: Replacing existing attribute: 0x%08x\n",
- curEntry, oldName));
- }
-
- bag_entry* cur = entries+curEntry;
-
- cur->stringBlock = package->header->index;
- cur->map.name.ident = newName;
- cur->map.value.copyFrom_dtoh(map->value);
- TABLE_NOISY(printf("Setting entry #%d %p: block=%d, name=0x%08x, type=%d, data=0x%08x\n",
- curEntry, cur, cur->stringBlock, cur->map.name.ident,
- cur->map.value.dataType, cur->map.value.data));
-
- // On to the next!
- curEntry++;
- pos++;
- const size_t size = dtohs(map->value.size);
- curOff += size + sizeof(*map)-sizeof(map->value);
- };
- if (curEntry > set->numAttrs) {
- set->numAttrs = curEntry;
- }
- }
-
- // And this is it...
- typeSet[e] = set;
- if (set) {
- if (outTypeSpecFlags != NULL) {
- *outTypeSpecFlags = set->typeSpecFlags;
- }
- *outBag = (bag_entry*)(set+1);
- TABLE_NOISY(ALOGI("Returning %d attrs\n", set->numAttrs));
- return set->numAttrs;
- }
- return BAD_INDEX;
-}
-
-void ResTable::setParameters(const ResTable_config* params)
-{
- mLock.lock();
- TABLE_GETENTRY(ALOGI("Setting parameters: %s\n", params->toString().string()));
- mParams = *params;
- for (size_t i=0; i<mPackageGroups.size(); i++) {
- TABLE_NOISY(ALOGI("CLEARING BAGS FOR GROUP %d!", i));
- mPackageGroups[i]->clearBagCache();
- }
- mLock.unlock();
-}
-
-void ResTable::getParameters(ResTable_config* params) const
-{
- mLock.lock();
- *params = mParams;
- mLock.unlock();
-}
-
-struct id_name_map {
- uint32_t id;
- size_t len;
- char16_t name[6];
-};
-
-const static id_name_map ID_NAMES[] = {
- { ResTable_map::ATTR_TYPE, 5, { '^', 't', 'y', 'p', 'e' } },
- { ResTable_map::ATTR_L10N, 5, { '^', 'l', '1', '0', 'n' } },
- { ResTable_map::ATTR_MIN, 4, { '^', 'm', 'i', 'n' } },
- { ResTable_map::ATTR_MAX, 4, { '^', 'm', 'a', 'x' } },
- { ResTable_map::ATTR_OTHER, 6, { '^', 'o', 't', 'h', 'e', 'r' } },
- { ResTable_map::ATTR_ZERO, 5, { '^', 'z', 'e', 'r', 'o' } },
- { ResTable_map::ATTR_ONE, 4, { '^', 'o', 'n', 'e' } },
- { ResTable_map::ATTR_TWO, 4, { '^', 't', 'w', 'o' } },
- { ResTable_map::ATTR_FEW, 4, { '^', 'f', 'e', 'w' } },
- { ResTable_map::ATTR_MANY, 5, { '^', 'm', 'a', 'n', 'y' } },
-};
-
-uint32_t ResTable::identifierForName(const char16_t* name, size_t nameLen,
- const char16_t* type, size_t typeLen,
- const char16_t* package,
- size_t packageLen,
- uint32_t* outTypeSpecFlags) const
-{
- TABLE_SUPER_NOISY(printf("Identifier for name: error=%d\n", mError));
-
- // Check for internal resource identifier as the very first thing, so
- // that we will always find them even when there are no resources.
- if (name[0] == '^') {
- const int N = (sizeof(ID_NAMES)/sizeof(ID_NAMES[0]));
- size_t len;
- for (int i=0; i<N; i++) {
- const id_name_map* m = ID_NAMES + i;
- len = m->len;
- if (len != nameLen) {
- continue;
- }
- for (size_t j=1; j<len; j++) {
- if (m->name[j] != name[j]) {
- goto nope;
- }
- }
- if (outTypeSpecFlags) {
- *outTypeSpecFlags = ResTable_typeSpec::SPEC_PUBLIC;
- }
- return m->id;
-nope:
- ;
- }
- if (nameLen > 7) {
- if (name[1] == 'i' && name[2] == 'n'
- && name[3] == 'd' && name[4] == 'e' && name[5] == 'x'
- && name[6] == '_') {
- int index = atoi(String8(name + 7, nameLen - 7).string());
- if (Res_CHECKID(index)) {
- ALOGW("Array resource index: %d is too large.",
- index);
- return 0;
- }
- if (outTypeSpecFlags) {
- *outTypeSpecFlags = ResTable_typeSpec::SPEC_PUBLIC;
- }
- return Res_MAKEARRAY(index);
- }
- }
- return 0;
- }
-
- if (mError != NO_ERROR) {
- return 0;
- }
-
- bool fakePublic = false;
-
- // Figure out the package and type we are looking in...
-
- const char16_t* packageEnd = NULL;
- const char16_t* typeEnd = NULL;
- const char16_t* const nameEnd = name+nameLen;
- const char16_t* p = name;
- while (p < nameEnd) {
- if (*p == ':') packageEnd = p;
- else if (*p == '/') typeEnd = p;
- p++;
- }
- if (*name == '@') {
- name++;
- if (*name == '*') {
- fakePublic = true;
- name++;
- }
- }
- if (name >= nameEnd) {
- return 0;
- }
-
- if (packageEnd) {
- package = name;
- packageLen = packageEnd-name;
- name = packageEnd+1;
- } else if (!package) {
- return 0;
- }
-
- if (typeEnd) {
- type = name;
- typeLen = typeEnd-name;
- name = typeEnd+1;
- } else if (!type) {
- return 0;
- }
-
- if (name >= nameEnd) {
- return 0;
- }
- nameLen = nameEnd-name;
-
- TABLE_NOISY(printf("Looking for identifier: type=%s, name=%s, package=%s\n",
- String8(type, typeLen).string(),
- String8(name, nameLen).string(),
- String8(package, packageLen).string()));
-
- const size_t NG = mPackageGroups.size();
- for (size_t ig=0; ig<NG; ig++) {
- const PackageGroup* group = mPackageGroups[ig];
-
- if (strzcmp16(package, packageLen,
- group->name.string(), group->name.size())) {
- TABLE_NOISY(printf("Skipping package group: %s\n", String8(group->name).string()));
- continue;
- }
-
- const ssize_t ti = group->basePackage->typeStrings.indexOfString(type, typeLen);
- if (ti < 0) {
- TABLE_NOISY(printf("Type not found in package %s\n", String8(group->name).string()));
- continue;
- }
-
- const ssize_t ei = group->basePackage->keyStrings.indexOfString(name, nameLen);
- if (ei < 0) {
- TABLE_NOISY(printf("Name not found in package %s\n", String8(group->name).string()));
- continue;
- }
-
- TABLE_NOISY(printf("Search indices: type=%d, name=%d\n", ti, ei));
-
- const Type* const typeConfigs = group->packages[0]->getType(ti);
- if (typeConfigs == NULL || typeConfigs->configs.size() <= 0) {
- TABLE_NOISY(printf("Expected type structure not found in package %s for idnex %d\n",
- String8(group->name).string(), ti));
- }
-
- size_t NTC = typeConfigs->configs.size();
- for (size_t tci=0; tci<NTC; tci++) {
- const ResTable_type* const ty = typeConfigs->configs[tci];
- const uint32_t typeOffset = dtohl(ty->entriesStart);
-
- const uint8_t* const end = ((const uint8_t*)ty) + dtohl(ty->header.size);
- const uint32_t* const eindex = (const uint32_t*)
- (((const uint8_t*)ty) + dtohs(ty->header.headerSize));
-
- const size_t NE = dtohl(ty->entryCount);
- for (size_t i=0; i<NE; i++) {
- uint32_t offset = dtohl(eindex[i]);
- if (offset == ResTable_type::NO_ENTRY) {
- continue;
- }
-
- offset += typeOffset;
-
- if (offset > (dtohl(ty->header.size)-sizeof(ResTable_entry))) {
- ALOGW("ResTable_entry at %d is beyond type chunk data %d",
- offset, dtohl(ty->header.size));
- return 0;
- }
- if ((offset&0x3) != 0) {
- ALOGW("ResTable_entry at %d (pkg=%d type=%d ent=%d) is not on an integer boundary when looking for %s:%s/%s",
- (int)offset, (int)group->id, (int)ti+1, (int)i,
- String8(package, packageLen).string(),
- String8(type, typeLen).string(),
- String8(name, nameLen).string());
- return 0;
- }
-
- const ResTable_entry* const entry = (const ResTable_entry*)
- (((const uint8_t*)ty) + offset);
- if (dtohs(entry->size) < sizeof(*entry)) {
- ALOGW("ResTable_entry size %d is too small", dtohs(entry->size));
- return BAD_TYPE;
- }
-
- TABLE_SUPER_NOISY(printf("Looking at entry #%d: want str %d, have %d\n",
- i, ei, dtohl(entry->key.index)));
- if (dtohl(entry->key.index) == (size_t)ei) {
- if (outTypeSpecFlags) {
- *outTypeSpecFlags = typeConfigs->typeSpecFlags[i];
- if (fakePublic) {
- *outTypeSpecFlags |= ResTable_typeSpec::SPEC_PUBLIC;
- }
- }
- return Res_MAKEID(group->id-1, ti, i);
- }
- }
- }
- }
-
- return 0;
-}
-
-bool ResTable::expandResourceRef(const uint16_t* refStr, size_t refLen,
- String16* outPackage,
- String16* outType,
- String16* outName,
- const String16* defType,
- const String16* defPackage,
- const char** outErrorMsg,
- bool* outPublicOnly)
-{
- const char16_t* packageEnd = NULL;
- const char16_t* typeEnd = NULL;
- const char16_t* p = refStr;
- const char16_t* const end = p + refLen;
- while (p < end) {
- if (*p == ':') packageEnd = p;
- else if (*p == '/') {
- typeEnd = p;
- break;
- }
- p++;
- }
- p = refStr;
- if (*p == '@') p++;
-
- if (outPublicOnly != NULL) {
- *outPublicOnly = true;
- }
- if (*p == '*') {
- p++;
- if (outPublicOnly != NULL) {
- *outPublicOnly = false;
- }
- }
-
- if (packageEnd) {
- *outPackage = String16(p, packageEnd-p);
- p = packageEnd+1;
- } else {
- if (!defPackage) {
- if (outErrorMsg) {
- *outErrorMsg = "No resource package specified";
- }
- return false;
- }
- *outPackage = *defPackage;
- }
- if (typeEnd) {
- *outType = String16(p, typeEnd-p);
- p = typeEnd+1;
- } else {
- if (!defType) {
- if (outErrorMsg) {
- *outErrorMsg = "No resource type specified";
- }
- return false;
- }
- *outType = *defType;
- }
- *outName = String16(p, end-p);
- if(**outPackage == 0) {
- if(outErrorMsg) {
- *outErrorMsg = "Resource package cannot be an empty string";
- }
- return false;
- }
- if(**outType == 0) {
- if(outErrorMsg) {
- *outErrorMsg = "Resource type cannot be an empty string";
- }
- return false;
- }
- if(**outName == 0) {
- if(outErrorMsg) {
- *outErrorMsg = "Resource id cannot be an empty string";
- }
- return false;
- }
- return true;
-}
-
-static uint32_t get_hex(char c, bool* outError)
-{
- if (c >= '0' && c <= '9') {
- return c - '0';
- } else if (c >= 'a' && c <= 'f') {
- return c - 'a' + 0xa;
- } else if (c >= 'A' && c <= 'F') {
- return c - 'A' + 0xa;
- }
- *outError = true;
- return 0;
-}
-
-struct unit_entry
-{
- const char* name;
- size_t len;
- uint8_t type;
- uint32_t unit;
- float scale;
-};
-
-static const unit_entry unitNames[] = {
- { "px", strlen("px"), Res_value::TYPE_DIMENSION, Res_value::COMPLEX_UNIT_PX, 1.0f },
- { "dip", strlen("dip"), Res_value::TYPE_DIMENSION, Res_value::COMPLEX_UNIT_DIP, 1.0f },
- { "dp", strlen("dp"), Res_value::TYPE_DIMENSION, Res_value::COMPLEX_UNIT_DIP, 1.0f },
- { "sp", strlen("sp"), Res_value::TYPE_DIMENSION, Res_value::COMPLEX_UNIT_SP, 1.0f },
- { "pt", strlen("pt"), Res_value::TYPE_DIMENSION, Res_value::COMPLEX_UNIT_PT, 1.0f },
- { "in", strlen("in"), Res_value::TYPE_DIMENSION, Res_value::COMPLEX_UNIT_IN, 1.0f },
- { "mm", strlen("mm"), Res_value::TYPE_DIMENSION, Res_value::COMPLEX_UNIT_MM, 1.0f },
- { "%", strlen("%"), Res_value::TYPE_FRACTION, Res_value::COMPLEX_UNIT_FRACTION, 1.0f/100 },
- { "%p", strlen("%p"), Res_value::TYPE_FRACTION, Res_value::COMPLEX_UNIT_FRACTION_PARENT, 1.0f/100 },
- { NULL, 0, 0, 0, 0 }
-};
-
-static bool parse_unit(const char* str, Res_value* outValue,
- float* outScale, const char** outEnd)
-{
- const char* end = str;
- while (*end != 0 && !isspace((unsigned char)*end)) {
- end++;
- }
- const size_t len = end-str;
-
- const char* realEnd = end;
- while (*realEnd != 0 && isspace((unsigned char)*realEnd)) {
- realEnd++;
- }
- if (*realEnd != 0) {
- return false;
- }
-
- const unit_entry* cur = unitNames;
- while (cur->name) {
- if (len == cur->len && strncmp(cur->name, str, len) == 0) {
- outValue->dataType = cur->type;
- outValue->data = cur->unit << Res_value::COMPLEX_UNIT_SHIFT;
- *outScale = cur->scale;
- *outEnd = end;
- //printf("Found unit %s for %s\n", cur->name, str);
- return true;
- }
- cur++;
- }
-
- return false;
-}
-
-
-bool ResTable::stringToInt(const char16_t* s, size_t len, Res_value* outValue)
-{
- while (len > 0 && isspace16(*s)) {
- s++;
- len--;
- }
-
- if (len <= 0) {
- return false;
- }
-
- size_t i = 0;
- int32_t val = 0;
- bool neg = false;
-
- if (*s == '-') {
- neg = true;
- i++;
- }
-
- if (s[i] < '0' || s[i] > '9') {
- return false;
- }
-
- // Decimal or hex?
- if (s[i] == '0' && s[i+1] == 'x') {
- if (outValue)
- outValue->dataType = outValue->TYPE_INT_HEX;
- i += 2;
- bool error = false;
- while (i < len && !error) {
- val = (val*16) + get_hex(s[i], &error);
- i++;
- }
- if (error) {
- return false;
- }
- } else {
- if (outValue)
- outValue->dataType = outValue->TYPE_INT_DEC;
- while (i < len) {
- if (s[i] < '0' || s[i] > '9') {
- return false;
- }
- val = (val*10) + s[i]-'0';
- i++;
- }
- }
-
- if (neg) val = -val;
-
- while (i < len && isspace16(s[i])) {
- i++;
- }
-
- if (i == len) {
- if (outValue)
- outValue->data = val;
- return true;
- }
-
- return false;
-}
-
-bool ResTable::stringToFloat(const char16_t* s, size_t len, Res_value* outValue)
-{
- while (len > 0 && isspace16(*s)) {
- s++;
- len--;
- }
-
- if (len <= 0) {
- return false;
- }
-
- char buf[128];
- int i=0;
- while (len > 0 && *s != 0 && i < 126) {
- if (*s > 255) {
- return false;
- }
- buf[i++] = *s++;
- len--;
- }
-
- if (len > 0) {
- return false;
- }
- if (buf[0] < '0' && buf[0] > '9' && buf[0] != '.') {
- return false;
- }
-
- buf[i] = 0;
- const char* end;
- float f = strtof(buf, (char**)&end);
-
- if (*end != 0 && !isspace((unsigned char)*end)) {
- // Might be a unit...
- float scale;
- if (parse_unit(end, outValue, &scale, &end)) {
- f *= scale;
- const bool neg = f < 0;
- if (neg) f = -f;
- uint64_t bits = (uint64_t)(f*(1<<23)+.5f);
- uint32_t radix;
- uint32_t shift;
- if ((bits&0x7fffff) == 0) {
- // Always use 23p0 if there is no fraction, just to make
- // things easier to read.
- radix = Res_value::COMPLEX_RADIX_23p0;
- shift = 23;
- } else if ((bits&0xffffffffff800000LL) == 0) {
- // Magnitude is zero -- can fit in 0 bits of precision.
- radix = Res_value::COMPLEX_RADIX_0p23;
- shift = 0;
- } else if ((bits&0xffffffff80000000LL) == 0) {
- // Magnitude can fit in 8 bits of precision.
- radix = Res_value::COMPLEX_RADIX_8p15;
- shift = 8;
- } else if ((bits&0xffffff8000000000LL) == 0) {
- // Magnitude can fit in 16 bits of precision.
- radix = Res_value::COMPLEX_RADIX_16p7;
- shift = 16;
- } else {
- // Magnitude needs entire range, so no fractional part.
- radix = Res_value::COMPLEX_RADIX_23p0;
- shift = 23;
- }
- int32_t mantissa = (int32_t)(
- (bits>>shift) & Res_value::COMPLEX_MANTISSA_MASK);
- if (neg) {
- mantissa = (-mantissa) & Res_value::COMPLEX_MANTISSA_MASK;
- }
- outValue->data |=
- (radix<<Res_value::COMPLEX_RADIX_SHIFT)
- | (mantissa<<Res_value::COMPLEX_MANTISSA_SHIFT);
- //printf("Input value: %f 0x%016Lx, mult: %f, radix: %d, shift: %d, final: 0x%08x\n",
- // f * (neg ? -1 : 1), bits, f*(1<<23),
- // radix, shift, outValue->data);
- return true;
- }
- return false;
- }
-
- while (*end != 0 && isspace((unsigned char)*end)) {
- end++;
- }
-
- if (*end == 0) {
- if (outValue) {
- outValue->dataType = outValue->TYPE_FLOAT;
- *(float*)(&outValue->data) = f;
- return true;
- }
- }
-
- return false;
-}
-
-bool ResTable::stringToValue(Res_value* outValue, String16* outString,
- const char16_t* s, size_t len,
- bool preserveSpaces, bool coerceType,
- uint32_t attrID,
- const String16* defType,
- const String16* defPackage,
- Accessor* accessor,
- void* accessorCookie,
- uint32_t attrType,
- bool enforcePrivate) const
-{
- bool localizationSetting = accessor != NULL && accessor->getLocalizationSetting();
- const char* errorMsg = NULL;
-
- outValue->size = sizeof(Res_value);
- outValue->res0 = 0;
-
- // First strip leading/trailing whitespace. Do this before handling
- // escapes, so they can be used to force whitespace into the string.
- if (!preserveSpaces) {
- while (len > 0 && isspace16(*s)) {
- s++;
- len--;
- }
- while (len > 0 && isspace16(s[len-1])) {
- len--;
- }
- // If the string ends with '\', then we keep the space after it.
- if (len > 0 && s[len-1] == '\\' && s[len] != 0) {
- len++;
- }
- }
-
- //printf("Value for: %s\n", String8(s, len).string());
-
- uint32_t l10nReq = ResTable_map::L10N_NOT_REQUIRED;
- uint32_t attrMin = 0x80000000, attrMax = 0x7fffffff;
- bool fromAccessor = false;
- if (attrID != 0 && !Res_INTERNALID(attrID)) {
- const ssize_t p = getResourcePackageIndex(attrID);
- const bag_entry* bag;
- ssize_t cnt = p >= 0 ? lockBag(attrID, &bag) : -1;
- //printf("For attr 0x%08x got bag of %d\n", attrID, cnt);
- if (cnt >= 0) {
- while (cnt > 0) {
- //printf("Entry 0x%08x = 0x%08x\n", bag->map.name.ident, bag->map.value.data);
- switch (bag->map.name.ident) {
- case ResTable_map::ATTR_TYPE:
- attrType = bag->map.value.data;
- break;
- case ResTable_map::ATTR_MIN:
- attrMin = bag->map.value.data;
- break;
- case ResTable_map::ATTR_MAX:
- attrMax = bag->map.value.data;
- break;
- case ResTable_map::ATTR_L10N:
- l10nReq = bag->map.value.data;
- break;
- }
- bag++;
- cnt--;
- }
- unlockBag(bag);
- } else if (accessor && accessor->getAttributeType(attrID, &attrType)) {
- fromAccessor = true;
- if (attrType == ResTable_map::TYPE_ENUM
- || attrType == ResTable_map::TYPE_FLAGS
- || attrType == ResTable_map::TYPE_INTEGER) {
- accessor->getAttributeMin(attrID, &attrMin);
- accessor->getAttributeMax(attrID, &attrMax);
- }
- if (localizationSetting) {
- l10nReq = accessor->getAttributeL10N(attrID);
- }
- }
- }
-
- const bool canStringCoerce =
- coerceType && (attrType&ResTable_map::TYPE_STRING) != 0;
-
- if (*s == '@') {
- outValue->dataType = outValue->TYPE_REFERENCE;
-
- // Note: we don't check attrType here because the reference can
- // be to any other type; we just need to count on the client making
- // sure the referenced type is correct.
-
- //printf("Looking up ref: %s\n", String8(s, len).string());
-
- // It's a reference!
- if (len == 5 && s[1]=='n' && s[2]=='u' && s[3]=='l' && s[4]=='l') {
- outValue->data = 0;
- return true;
- } else {
- bool createIfNotFound = false;
- const char16_t* resourceRefName;
- int resourceNameLen;
- if (len > 2 && s[1] == '+') {
- createIfNotFound = true;
- resourceRefName = s + 2;
- resourceNameLen = len - 2;
- } else if (len > 2 && s[1] == '*') {
- enforcePrivate = false;
- resourceRefName = s + 2;
- resourceNameLen = len - 2;
- } else {
- createIfNotFound = false;
- resourceRefName = s + 1;
- resourceNameLen = len - 1;
- }
- String16 package, type, name;
- if (!expandResourceRef(resourceRefName,resourceNameLen, &package, &type, &name,
- defType, defPackage, &errorMsg)) {
- if (accessor != NULL) {
- accessor->reportError(accessorCookie, errorMsg);
- }
- return false;
- }
-
- uint32_t specFlags = 0;
- uint32_t rid = identifierForName(name.string(), name.size(), type.string(),
- type.size(), package.string(), package.size(), &specFlags);
- if (rid != 0) {
- if (enforcePrivate) {
- if ((specFlags&ResTable_typeSpec::SPEC_PUBLIC) == 0) {
- if (accessor != NULL) {
- accessor->reportError(accessorCookie, "Resource is not public.");
- }
- return false;
- }
- }
- if (!accessor) {
- outValue->data = rid;
- return true;
- }
- rid = Res_MAKEID(
- accessor->getRemappedPackage(Res_GETPACKAGE(rid)),
- Res_GETTYPE(rid), Res_GETENTRY(rid));
- TABLE_NOISY(printf("Incl %s:%s/%s: 0x%08x\n",
- String8(package).string(), String8(type).string(),
- String8(name).string(), rid));
- outValue->data = rid;
- return true;
- }
-
- if (accessor) {
- uint32_t rid = accessor->getCustomResourceWithCreation(package, type, name,
- createIfNotFound);
- if (rid != 0) {
- TABLE_NOISY(printf("Pckg %s:%s/%s: 0x%08x\n",
- String8(package).string(), String8(type).string(),
- String8(name).string(), rid));
- outValue->data = rid;
- return true;
- }
- }
- }
-
- if (accessor != NULL) {
- accessor->reportError(accessorCookie, "No resource found that matches the given name");
- }
- return false;
- }
-
- // if we got to here, and localization is required and it's not a reference,
- // complain and bail.
- if (l10nReq == ResTable_map::L10N_SUGGESTED) {
- if (localizationSetting) {
- if (accessor != NULL) {
- accessor->reportError(accessorCookie, "This attribute must be localized.");
- }
- }
- }
-
- if (*s == '#') {
- // It's a color! Convert to an integer of the form 0xaarrggbb.
- uint32_t color = 0;
- bool error = false;
- if (len == 4) {
- outValue->dataType = outValue->TYPE_INT_COLOR_RGB4;
- color |= 0xFF000000;
- color |= get_hex(s[1], &error) << 20;
- color |= get_hex(s[1], &error) << 16;
- color |= get_hex(s[2], &error) << 12;
- color |= get_hex(s[2], &error) << 8;
- color |= get_hex(s[3], &error) << 4;
- color |= get_hex(s[3], &error);
- } else if (len == 5) {
- outValue->dataType = outValue->TYPE_INT_COLOR_ARGB4;
- color |= get_hex(s[1], &error) << 28;
- color |= get_hex(s[1], &error) << 24;
- color |= get_hex(s[2], &error) << 20;
- color |= get_hex(s[2], &error) << 16;
- color |= get_hex(s[3], &error) << 12;
- color |= get_hex(s[3], &error) << 8;
- color |= get_hex(s[4], &error) << 4;
- color |= get_hex(s[4], &error);
- } else if (len == 7) {
- outValue->dataType = outValue->TYPE_INT_COLOR_RGB8;
- color |= 0xFF000000;
- color |= get_hex(s[1], &error) << 20;
- color |= get_hex(s[2], &error) << 16;
- color |= get_hex(s[3], &error) << 12;
- color |= get_hex(s[4], &error) << 8;
- color |= get_hex(s[5], &error) << 4;
- color |= get_hex(s[6], &error);
- } else if (len == 9) {
- outValue->dataType = outValue->TYPE_INT_COLOR_ARGB8;
- color |= get_hex(s[1], &error) << 28;
- color |= get_hex(s[2], &error) << 24;
- color |= get_hex(s[3], &error) << 20;
- color |= get_hex(s[4], &error) << 16;
- color |= get_hex(s[5], &error) << 12;
- color |= get_hex(s[6], &error) << 8;
- color |= get_hex(s[7], &error) << 4;
- color |= get_hex(s[8], &error);
- } else {
- error = true;
- }
- if (!error) {
- if ((attrType&ResTable_map::TYPE_COLOR) == 0) {
- if (!canStringCoerce) {
- if (accessor != NULL) {
- accessor->reportError(accessorCookie,
- "Color types not allowed");
- }
- return false;
- }
- } else {
- outValue->data = color;
- //printf("Color input=%s, output=0x%x\n", String8(s, len).string(), color);
- return true;
- }
- } else {
- if ((attrType&ResTable_map::TYPE_COLOR) != 0) {
- if (accessor != NULL) {
- accessor->reportError(accessorCookie, "Color value not valid --"
- " must be #rgb, #argb, #rrggbb, or #aarrggbb");
- }
- #if 0
- fprintf(stderr, "%s: Color ID %s value %s is not valid\n",
- "Resource File", //(const char*)in->getPrintableSource(),
- String8(*curTag).string(),
- String8(s, len).string());
- #endif
- return false;
- }
- }
- }
-
- if (*s == '?') {
- outValue->dataType = outValue->TYPE_ATTRIBUTE;
-
- // Note: we don't check attrType here because the reference can
- // be to any other type; we just need to count on the client making
- // sure the referenced type is correct.
-
- //printf("Looking up attr: %s\n", String8(s, len).string());
-
- static const String16 attr16("attr");
- String16 package, type, name;
- if (!expandResourceRef(s+1, len-1, &package, &type, &name,
- &attr16, defPackage, &errorMsg)) {
- if (accessor != NULL) {
- accessor->reportError(accessorCookie, errorMsg);
- }
- return false;
- }
-
- //printf("Pkg: %s, Type: %s, Name: %s\n",
- // String8(package).string(), String8(type).string(),
- // String8(name).string());
- uint32_t specFlags = 0;
- uint32_t rid =
- identifierForName(name.string(), name.size(),
- type.string(), type.size(),
- package.string(), package.size(), &specFlags);
- if (rid != 0) {
- if (enforcePrivate) {
- if ((specFlags&ResTable_typeSpec::SPEC_PUBLIC) == 0) {
- if (accessor != NULL) {
- accessor->reportError(accessorCookie, "Attribute is not public.");
- }
- return false;
- }
- }
- if (!accessor) {
- outValue->data = rid;
- return true;
- }
- rid = Res_MAKEID(
- accessor->getRemappedPackage(Res_GETPACKAGE(rid)),
- Res_GETTYPE(rid), Res_GETENTRY(rid));
- //printf("Incl %s:%s/%s: 0x%08x\n",
- // String8(package).string(), String8(type).string(),
- // String8(name).string(), rid);
- outValue->data = rid;
- return true;
- }
-
- if (accessor) {
- uint32_t rid = accessor->getCustomResource(package, type, name);
- if (rid != 0) {
- //printf("Mine %s:%s/%s: 0x%08x\n",
- // String8(package).string(), String8(type).string(),
- // String8(name).string(), rid);
- outValue->data = rid;
- return true;
- }
- }
-
- if (accessor != NULL) {
- accessor->reportError(accessorCookie, "No resource found that matches the given name");
- }
- return false;
- }
-
- if (stringToInt(s, len, outValue)) {
- if ((attrType&ResTable_map::TYPE_INTEGER) == 0) {
- // If this type does not allow integers, but does allow floats,
- // fall through on this error case because the float type should
- // be able to accept any integer value.
- if (!canStringCoerce && (attrType&ResTable_map::TYPE_FLOAT) == 0) {
- if (accessor != NULL) {
- accessor->reportError(accessorCookie, "Integer types not allowed");
- }
- return false;
- }
- } else {
- if (((int32_t)outValue->data) < ((int32_t)attrMin)
- || ((int32_t)outValue->data) > ((int32_t)attrMax)) {
- if (accessor != NULL) {
- accessor->reportError(accessorCookie, "Integer value out of range");
- }
- return false;
- }
- return true;
- }
- }
-
- if (stringToFloat(s, len, outValue)) {
- if (outValue->dataType == Res_value::TYPE_DIMENSION) {
- if ((attrType&ResTable_map::TYPE_DIMENSION) != 0) {
- return true;
- }
- if (!canStringCoerce) {
- if (accessor != NULL) {
- accessor->reportError(accessorCookie, "Dimension types not allowed");
- }
- return false;
- }
- } else if (outValue->dataType == Res_value::TYPE_FRACTION) {
- if ((attrType&ResTable_map::TYPE_FRACTION) != 0) {
- return true;
- }
- if (!canStringCoerce) {
- if (accessor != NULL) {
- accessor->reportError(accessorCookie, "Fraction types not allowed");
- }
- return false;
- }
- } else if ((attrType&ResTable_map::TYPE_FLOAT) == 0) {
- if (!canStringCoerce) {
- if (accessor != NULL) {
- accessor->reportError(accessorCookie, "Float types not allowed");
- }
- return false;
- }
- } else {
- return true;
- }
- }
-
- if (len == 4) {
- if ((s[0] == 't' || s[0] == 'T') &&
- (s[1] == 'r' || s[1] == 'R') &&
- (s[2] == 'u' || s[2] == 'U') &&
- (s[3] == 'e' || s[3] == 'E')) {
- if ((attrType&ResTable_map::TYPE_BOOLEAN) == 0) {
- if (!canStringCoerce) {
- if (accessor != NULL) {
- accessor->reportError(accessorCookie, "Boolean types not allowed");
- }
- return false;
- }
- } else {
- outValue->dataType = outValue->TYPE_INT_BOOLEAN;
- outValue->data = (uint32_t)-1;
- return true;
- }
- }
- }
-
- if (len == 5) {
- if ((s[0] == 'f' || s[0] == 'F') &&
- (s[1] == 'a' || s[1] == 'A') &&
- (s[2] == 'l' || s[2] == 'L') &&
- (s[3] == 's' || s[3] == 'S') &&
- (s[4] == 'e' || s[4] == 'E')) {
- if ((attrType&ResTable_map::TYPE_BOOLEAN) == 0) {
- if (!canStringCoerce) {
- if (accessor != NULL) {
- accessor->reportError(accessorCookie, "Boolean types not allowed");
- }
- return false;
- }
- } else {
- outValue->dataType = outValue->TYPE_INT_BOOLEAN;
- outValue->data = 0;
- return true;
- }
- }
- }
-
- if ((attrType&ResTable_map::TYPE_ENUM) != 0) {
- const ssize_t p = getResourcePackageIndex(attrID);
- const bag_entry* bag;
- ssize_t cnt = p >= 0 ? lockBag(attrID, &bag) : -1;
- //printf("Got %d for enum\n", cnt);
- if (cnt >= 0) {
- resource_name rname;
- while (cnt > 0) {
- if (!Res_INTERNALID(bag->map.name.ident)) {
- //printf("Trying attr #%08x\n", bag->map.name.ident);
- if (getResourceName(bag->map.name.ident, false, &rname)) {
- #if 0
- printf("Matching %s against %s (0x%08x)\n",
- String8(s, len).string(),
- String8(rname.name, rname.nameLen).string(),
- bag->map.name.ident);
- #endif
- if (strzcmp16(s, len, rname.name, rname.nameLen) == 0) {
- outValue->dataType = bag->map.value.dataType;
- outValue->data = bag->map.value.data;
- unlockBag(bag);
- return true;
- }
- }
-
- }
- bag++;
- cnt--;
- }
- unlockBag(bag);
- }
-
- if (fromAccessor) {
- if (accessor->getAttributeEnum(attrID, s, len, outValue)) {
- return true;
- }
- }
- }
-
- if ((attrType&ResTable_map::TYPE_FLAGS) != 0) {
- const ssize_t p = getResourcePackageIndex(attrID);
- const bag_entry* bag;
- ssize_t cnt = p >= 0 ? lockBag(attrID, &bag) : -1;
- //printf("Got %d for flags\n", cnt);
- if (cnt >= 0) {
- bool failed = false;
- resource_name rname;
- outValue->dataType = Res_value::TYPE_INT_HEX;
- outValue->data = 0;
- const char16_t* end = s + len;
- const char16_t* pos = s;
- while (pos < end && !failed) {
- const char16_t* start = pos;
- pos++;
- while (pos < end && *pos != '|') {
- pos++;
- }
- //printf("Looking for: %s\n", String8(start, pos-start).string());
- const bag_entry* bagi = bag;
- ssize_t i;
- for (i=0; i<cnt; i++, bagi++) {
- if (!Res_INTERNALID(bagi->map.name.ident)) {
- //printf("Trying attr #%08x\n", bagi->map.name.ident);
- if (getResourceName(bagi->map.name.ident, false, &rname)) {
- #if 0
- printf("Matching %s against %s (0x%08x)\n",
- String8(start,pos-start).string(),
- String8(rname.name, rname.nameLen).string(),
- bagi->map.name.ident);
- #endif
- if (strzcmp16(start, pos-start, rname.name, rname.nameLen) == 0) {
- outValue->data |= bagi->map.value.data;
- break;
- }
- }
- }
- }
- if (i >= cnt) {
- // Didn't find this flag identifier.
- failed = true;
- }
- if (pos < end) {
- pos++;
- }
- }
- unlockBag(bag);
- if (!failed) {
- //printf("Final flag value: 0x%lx\n", outValue->data);
- return true;
- }
- }
-
-
- if (fromAccessor) {
- if (accessor->getAttributeFlags(attrID, s, len, outValue)) {
- //printf("Final flag value: 0x%lx\n", outValue->data);
- return true;
- }
- }
- }
-
- if ((attrType&ResTable_map::TYPE_STRING) == 0) {
- if (accessor != NULL) {
- accessor->reportError(accessorCookie, "String types not allowed");
- }
- return false;
- }
-
- // Generic string handling...
- outValue->dataType = outValue->TYPE_STRING;
- if (outString) {
- bool failed = collectString(outString, s, len, preserveSpaces, &errorMsg);
- if (accessor != NULL) {
- accessor->reportError(accessorCookie, errorMsg);
- }
- return failed;
- }
-
- return true;
-}
-
-bool ResTable::collectString(String16* outString,
- const char16_t* s, size_t len,
- bool preserveSpaces,
- const char** outErrorMsg,
- bool append)
-{
- String16 tmp;
-
- char quoted = 0;
- const char16_t* p = s;
- while (p < (s+len)) {
- while (p < (s+len)) {
- const char16_t c = *p;
- if (c == '\\') {
- break;
- }
- if (!preserveSpaces) {
- if (quoted == 0 && isspace16(c)
- && (c != ' ' || isspace16(*(p+1)))) {
- break;
- }
- if (c == '"' && (quoted == 0 || quoted == '"')) {
- break;
- }
- if (c == '\'' && (quoted == 0 || quoted == '\'')) {
- /*
- * In practice, when people write ' instead of \'
- * in a string, they are doing it by accident
- * instead of really meaning to use ' as a quoting
- * character. Warn them so they don't lose it.
- */
- if (outErrorMsg) {
- *outErrorMsg = "Apostrophe not preceded by \\";
- }
- return false;
- }
- }
- p++;
- }
- if (p < (s+len)) {
- if (p > s) {
- tmp.append(String16(s, p-s));
- }
- if (!preserveSpaces && (*p == '"' || *p == '\'')) {
- if (quoted == 0) {
- quoted = *p;
- } else {
- quoted = 0;
- }
- p++;
- } else if (!preserveSpaces && isspace16(*p)) {
- // Space outside of a quote -- consume all spaces and
- // leave a single plain space char.
- tmp.append(String16(" "));
- p++;
- while (p < (s+len) && isspace16(*p)) {
- p++;
- }
- } else if (*p == '\\') {
- p++;
- if (p < (s+len)) {
- switch (*p) {
- case 't':
- tmp.append(String16("\t"));
- break;
- case 'n':
- tmp.append(String16("\n"));
- break;
- case '#':
- tmp.append(String16("#"));
- break;
- case '@':
- tmp.append(String16("@"));
- break;
- case '?':
- tmp.append(String16("?"));
- break;
- case '"':
- tmp.append(String16("\""));
- break;
- case '\'':
- tmp.append(String16("'"));
- break;
- case '\\':
- tmp.append(String16("\\"));
- break;
- case 'u':
- {
- char16_t chr = 0;
- int i = 0;
- while (i < 4 && p[1] != 0) {
- p++;
- i++;
- int c;
- if (*p >= '0' && *p <= '9') {
- c = *p - '0';
- } else if (*p >= 'a' && *p <= 'f') {
- c = *p - 'a' + 10;
- } else if (*p >= 'A' && *p <= 'F') {
- c = *p - 'A' + 10;
- } else {
- if (outErrorMsg) {
- *outErrorMsg = "Bad character in \\u unicode escape sequence";
- }
- return false;
- }
- chr = (chr<<4) | c;
- }
- tmp.append(String16(&chr, 1));
- } break;
- default:
- // ignore unknown escape chars.
- break;
- }
- p++;
- }
- }
- len -= (p-s);
- s = p;
- }
- }
-
- if (tmp.size() != 0) {
- if (len > 0) {
- tmp.append(String16(s, len));
- }
- if (append) {
- outString->append(tmp);
- } else {
- outString->setTo(tmp);
- }
- } else {
- if (append) {
- outString->append(String16(s, len));
- } else {
- outString->setTo(s, len);
- }
- }
-
- return true;
-}
-
-size_t ResTable::getBasePackageCount() const
-{
- if (mError != NO_ERROR) {
- return 0;
- }
- return mPackageGroups.size();
-}
-
-const char16_t* ResTable::getBasePackageName(size_t idx) const
-{
- if (mError != NO_ERROR) {
- return 0;
- }
- LOG_FATAL_IF(idx >= mPackageGroups.size(),
- "Requested package index %d past package count %d",
- (int)idx, (int)mPackageGroups.size());
- return mPackageGroups[idx]->name.string();
-}
-
-uint32_t ResTable::getBasePackageId(size_t idx) const
-{
- if (mError != NO_ERROR) {
- return 0;
- }
- LOG_FATAL_IF(idx >= mPackageGroups.size(),
- "Requested package index %d past package count %d",
- (int)idx, (int)mPackageGroups.size());
- return mPackageGroups[idx]->id;
-}
-
-size_t ResTable::getTableCount() const
-{
- return mHeaders.size();
-}
-
-const ResStringPool* ResTable::getTableStringBlock(size_t index) const
-{
- return &mHeaders[index]->values;
-}
-
-void* ResTable::getTableCookie(size_t index) const
-{
- return mHeaders[index]->cookie;
-}
-
-void ResTable::getConfigurations(Vector<ResTable_config>* configs) const
-{
- const size_t I = mPackageGroups.size();
- for (size_t i=0; i<I; i++) {
- const PackageGroup* packageGroup = mPackageGroups[i];
- const size_t J = packageGroup->packages.size();
- for (size_t j=0; j<J; j++) {
- const Package* package = packageGroup->packages[j];
- const size_t K = package->types.size();
- for (size_t k=0; k<K; k++) {
- const Type* type = package->types[k];
- if (type == NULL) continue;
- const size_t L = type->configs.size();
- for (size_t l=0; l<L; l++) {
- const ResTable_type* config = type->configs[l];
- const ResTable_config* cfg = &config->config;
- // only insert unique
- const size_t M = configs->size();
- size_t m;
- for (m=0; m<M; m++) {
- if (0 == (*configs)[m].compare(*cfg)) {
- break;
- }
- }
- // if we didn't find it
- if (m == M) {
- configs->add(*cfg);
- }
- }
- }
- }
- }
-}
-
-void ResTable::getLocales(Vector<String8>* locales) const
-{
- Vector<ResTable_config> configs;
- ALOGV("calling getConfigurations");
- getConfigurations(&configs);
- ALOGV("called getConfigurations size=%d", (int)configs.size());
- const size_t I = configs.size();
- for (size_t i=0; i<I; i++) {
- char locale[6];
- configs[i].getLocale(locale);
- const size_t J = locales->size();
- size_t j;
- for (j=0; j<J; j++) {
- if (0 == strcmp(locale, (*locales)[j].string())) {
- break;
- }
- }
- if (j == J) {
- locales->add(String8(locale));
- }
- }
-}
-
-ssize_t ResTable::getEntry(
- const Package* package, int typeIndex, int entryIndex,
- const ResTable_config* config,
- const ResTable_type** outType, const ResTable_entry** outEntry,
- const Type** outTypeClass) const
-{
- ALOGV("Getting entry from package %p\n", package);
- const ResTable_package* const pkg = package->package;
-
- const Type* allTypes = package->getType(typeIndex);
- ALOGV("allTypes=%p\n", allTypes);
- if (allTypes == NULL) {
- ALOGV("Skipping entry type index 0x%02x because type is NULL!\n", typeIndex);
- return 0;
- }
-
- if ((size_t)entryIndex >= allTypes->entryCount) {
- ALOGW("getEntry failing because entryIndex %d is beyond type entryCount %d",
- entryIndex, (int)allTypes->entryCount);
- return BAD_TYPE;
- }
-
- const ResTable_type* type = NULL;
- uint32_t offset = ResTable_type::NO_ENTRY;
- ResTable_config bestConfig;
- memset(&bestConfig, 0, sizeof(bestConfig)); // make the compiler shut up
-
- const size_t NT = allTypes->configs.size();
- for (size_t i=0; i<NT; i++) {
- const ResTable_type* const thisType = allTypes->configs[i];
- if (thisType == NULL) continue;
-
- ResTable_config thisConfig;
- thisConfig.copyFromDtoH(thisType->config);
-
- TABLE_GETENTRY(ALOGI("Match entry 0x%x in type 0x%x (sz 0x%x): %s\n",
- entryIndex, typeIndex+1, dtohl(thisType->config.size),
- thisConfig.toString().string()));
-
- // Check to make sure this one is valid for the current parameters.
- if (config && !thisConfig.match(*config)) {
- TABLE_GETENTRY(ALOGI("Does not match config!\n"));
- continue;
- }
-
- // Check if there is the desired entry in this type.
-
- const uint8_t* const end = ((const uint8_t*)thisType)
- + dtohl(thisType->header.size);
- const uint32_t* const eindex = (const uint32_t*)
- (((const uint8_t*)thisType) + dtohs(thisType->header.headerSize));
-
- uint32_t thisOffset = dtohl(eindex[entryIndex]);
- if (thisOffset == ResTable_type::NO_ENTRY) {
- TABLE_GETENTRY(ALOGI("Skipping because it is not defined!\n"));
- continue;
- }
-
- if (type != NULL) {
- // Check if this one is less specific than the last found. If so,
- // we will skip it. We check starting with things we most care
- // about to those we least care about.
- if (!thisConfig.isBetterThan(bestConfig, config)) {
- TABLE_GETENTRY(ALOGI("This config is worse than last!\n"));
- continue;
- }
- }
-
- type = thisType;
- offset = thisOffset;
- bestConfig = thisConfig;
- TABLE_GETENTRY(ALOGI("Best entry so far -- using it!\n"));
- if (!config) break;
- }
-
- if (type == NULL) {
- TABLE_GETENTRY(ALOGI("No value found for requested entry!\n"));
- return BAD_INDEX;
- }
-
- offset += dtohl(type->entriesStart);
- TABLE_NOISY(aout << "Looking in resource table " << package->header->header
- << ", typeOff="
- << (void*)(((const char*)type)-((const char*)package->header->header))
- << ", offset=" << (void*)offset << endl);
-
- if (offset > (dtohl(type->header.size)-sizeof(ResTable_entry))) {
- ALOGW("ResTable_entry at 0x%x is beyond type chunk data 0x%x",
- offset, dtohl(type->header.size));
- return BAD_TYPE;
- }
- if ((offset&0x3) != 0) {
- ALOGW("ResTable_entry at 0x%x is not on an integer boundary",
- offset);
- return BAD_TYPE;
- }
-
- const ResTable_entry* const entry = (const ResTable_entry*)
- (((const uint8_t*)type) + offset);
- if (dtohs(entry->size) < sizeof(*entry)) {
- ALOGW("ResTable_entry size 0x%x is too small", dtohs(entry->size));
- return BAD_TYPE;
- }
-
- *outType = type;
- *outEntry = entry;
- if (outTypeClass != NULL) {
- *outTypeClass = allTypes;
- }
- return offset + dtohs(entry->size);
-}
-
-status_t ResTable::parsePackage(const ResTable_package* const pkg,
- const Header* const header, uint32_t idmap_id)
-{
- const uint8_t* base = (const uint8_t*)pkg;
- status_t err = validate_chunk(&pkg->header, sizeof(*pkg),
- header->dataEnd, "ResTable_package");
- if (err != NO_ERROR) {
- return (mError=err);
- }
-
- const size_t pkgSize = dtohl(pkg->header.size);
-
- if (dtohl(pkg->typeStrings) >= pkgSize) {
- ALOGW("ResTable_package type strings at %p are past chunk size %p.",
- (void*)dtohl(pkg->typeStrings), (void*)pkgSize);
- return (mError=BAD_TYPE);
- }
- if ((dtohl(pkg->typeStrings)&0x3) != 0) {
- ALOGW("ResTable_package type strings at %p is not on an integer boundary.",
- (void*)dtohl(pkg->typeStrings));
- return (mError=BAD_TYPE);
- }
- if (dtohl(pkg->keyStrings) >= pkgSize) {
- ALOGW("ResTable_package key strings at %p are past chunk size %p.",
- (void*)dtohl(pkg->keyStrings), (void*)pkgSize);
- return (mError=BAD_TYPE);
- }
- if ((dtohl(pkg->keyStrings)&0x3) != 0) {
- ALOGW("ResTable_package key strings at %p is not on an integer boundary.",
- (void*)dtohl(pkg->keyStrings));
- return (mError=BAD_TYPE);
- }
-
- Package* package = NULL;
- PackageGroup* group = NULL;
- uint32_t id = idmap_id != 0 ? idmap_id : dtohl(pkg->id);
- // If at this point id == 0, pkg is an overlay package without a
- // corresponding idmap. During regular usage, overlay packages are
- // always loaded alongside their idmaps, but during idmap creation
- // the package is temporarily loaded by itself.
- if (id < 256) {
-
- package = new Package(this, header, pkg);
- if (package == NULL) {
- return (mError=NO_MEMORY);
- }
-
- size_t idx = mPackageMap[id];
- if (idx == 0) {
- idx = mPackageGroups.size()+1;
-
- char16_t tmpName[sizeof(pkg->name)/sizeof(char16_t)];
- strcpy16_dtoh(tmpName, pkg->name, sizeof(pkg->name)/sizeof(char16_t));
- group = new PackageGroup(this, String16(tmpName), id);
- if (group == NULL) {
- delete package;
- return (mError=NO_MEMORY);
- }
-
- err = package->typeStrings.setTo(base+dtohl(pkg->typeStrings),
- header->dataEnd-(base+dtohl(pkg->typeStrings)));
- if (err != NO_ERROR) {
- delete group;
- delete package;
- return (mError=err);
- }
- err = package->keyStrings.setTo(base+dtohl(pkg->keyStrings),
- header->dataEnd-(base+dtohl(pkg->keyStrings)));
- if (err != NO_ERROR) {
- delete group;
- delete package;
- return (mError=err);
- }
-
- //printf("Adding new package id %d at index %d\n", id, idx);
- err = mPackageGroups.add(group);
- if (err < NO_ERROR) {
- return (mError=err);
- }
- group->basePackage = package;
-
- mPackageMap[id] = (uint8_t)idx;
- } else {
- group = mPackageGroups.itemAt(idx-1);
- if (group == NULL) {
- return (mError=UNKNOWN_ERROR);
- }
- }
- err = group->packages.add(package);
- if (err < NO_ERROR) {
- return (mError=err);
- }
- } else {
- LOG_ALWAYS_FATAL("Package id out of range");
- return NO_ERROR;
- }
-
-
- // Iterate through all chunks.
- size_t curPackage = 0;
-
- const ResChunk_header* chunk =
- (const ResChunk_header*)(((const uint8_t*)pkg)
- + dtohs(pkg->header.headerSize));
- const uint8_t* endPos = ((const uint8_t*)pkg) + dtohs(pkg->header.size);
- while (((const uint8_t*)chunk) <= (endPos-sizeof(ResChunk_header)) &&
- ((const uint8_t*)chunk) <= (endPos-dtohl(chunk->size))) {
- TABLE_NOISY(ALOGV("PackageChunk: type=0x%x, headerSize=0x%x, size=0x%x, pos=%p\n",
- dtohs(chunk->type), dtohs(chunk->headerSize), dtohl(chunk->size),
- (void*)(((const uint8_t*)chunk) - ((const uint8_t*)header->header))));
- const size_t csize = dtohl(chunk->size);
- const uint16_t ctype = dtohs(chunk->type);
- if (ctype == RES_TABLE_TYPE_SPEC_TYPE) {
- const ResTable_typeSpec* typeSpec = (const ResTable_typeSpec*)(chunk);
- err = validate_chunk(&typeSpec->header, sizeof(*typeSpec),
- endPos, "ResTable_typeSpec");
- if (err != NO_ERROR) {
- return (mError=err);
- }
-
- const size_t typeSpecSize = dtohl(typeSpec->header.size);
-
- LOAD_TABLE_NOISY(printf("TypeSpec off %p: type=0x%x, headerSize=0x%x, size=%p\n",
- (void*)(base-(const uint8_t*)chunk),
- dtohs(typeSpec->header.type),
- dtohs(typeSpec->header.headerSize),
- (void*)typeSize));
- // look for block overrun or int overflow when multiplying by 4
- if ((dtohl(typeSpec->entryCount) > (INT32_MAX/sizeof(uint32_t))
- || dtohs(typeSpec->header.headerSize)+(sizeof(uint32_t)*dtohl(typeSpec->entryCount))
- > typeSpecSize)) {
- ALOGW("ResTable_typeSpec entry index to %p extends beyond chunk end %p.",
- (void*)(dtohs(typeSpec->header.headerSize)
- +(sizeof(uint32_t)*dtohl(typeSpec->entryCount))),
- (void*)typeSpecSize);
- return (mError=BAD_TYPE);
- }
-
- if (typeSpec->id == 0) {
- ALOGW("ResTable_type has an id of 0.");
- return (mError=BAD_TYPE);
- }
-
- while (package->types.size() < typeSpec->id) {
- package->types.add(NULL);
- }
- Type* t = package->types[typeSpec->id-1];
- if (t == NULL) {
- t = new Type(header, package, dtohl(typeSpec->entryCount));
- package->types.editItemAt(typeSpec->id-1) = t;
- } else if (dtohl(typeSpec->entryCount) != t->entryCount) {
- ALOGW("ResTable_typeSpec entry count inconsistent: given %d, previously %d",
- (int)dtohl(typeSpec->entryCount), (int)t->entryCount);
- return (mError=BAD_TYPE);
- }
- t->typeSpecFlags = (const uint32_t*)(
- ((const uint8_t*)typeSpec) + dtohs(typeSpec->header.headerSize));
- t->typeSpec = typeSpec;
-
- } else if (ctype == RES_TABLE_TYPE_TYPE) {
- const ResTable_type* type = (const ResTable_type*)(chunk);
- err = validate_chunk(&type->header, sizeof(*type)-sizeof(ResTable_config)+4,
- endPos, "ResTable_type");
- if (err != NO_ERROR) {
- return (mError=err);
- }
-
- const size_t typeSize = dtohl(type->header.size);
-
- LOAD_TABLE_NOISY(printf("Type off %p: type=0x%x, headerSize=0x%x, size=%p\n",
- (void*)(base-(const uint8_t*)chunk),
- dtohs(type->header.type),
- dtohs(type->header.headerSize),
- (void*)typeSize));
- if (dtohs(type->header.headerSize)+(sizeof(uint32_t)*dtohl(type->entryCount))
- > typeSize) {
- ALOGW("ResTable_type entry index to %p extends beyond chunk end %p.",
- (void*)(dtohs(type->header.headerSize)
- +(sizeof(uint32_t)*dtohl(type->entryCount))),
- (void*)typeSize);
- return (mError=BAD_TYPE);
- }
- if (dtohl(type->entryCount) != 0
- && dtohl(type->entriesStart) > (typeSize-sizeof(ResTable_entry))) {
- ALOGW("ResTable_type entriesStart at %p extends beyond chunk end %p.",
- (void*)dtohl(type->entriesStart), (void*)typeSize);
- return (mError=BAD_TYPE);
- }
- if (type->id == 0) {
- ALOGW("ResTable_type has an id of 0.");
- return (mError=BAD_TYPE);
- }
-
- while (package->types.size() < type->id) {
- package->types.add(NULL);
- }
- Type* t = package->types[type->id-1];
- if (t == NULL) {
- t = new Type(header, package, dtohl(type->entryCount));
- package->types.editItemAt(type->id-1) = t;
- } else if (dtohl(type->entryCount) != t->entryCount) {
- ALOGW("ResTable_type entry count inconsistent: given %d, previously %d",
- (int)dtohl(type->entryCount), (int)t->entryCount);
- return (mError=BAD_TYPE);
- }
-
- TABLE_GETENTRY(
- ResTable_config thisConfig;
- thisConfig.copyFromDtoH(type->config);
- ALOGI("Adding config to type %d: %s\n",
- type->id, thisConfig.toString().string()));
- t->configs.add(type);
- } else {
- status_t err = validate_chunk(chunk, sizeof(ResChunk_header),
- endPos, "ResTable_package:unknown");
- if (err != NO_ERROR) {
- return (mError=err);
- }
- }
- chunk = (const ResChunk_header*)
- (((const uint8_t*)chunk) + csize);
- }
-
- if (group->typeCount == 0) {
- group->typeCount = package->types.size();
- }
-
- return NO_ERROR;
-}
-
-status_t ResTable::createIdmap(const ResTable& overlay, uint32_t originalCrc, uint32_t overlayCrc,
- void** outData, size_t* outSize) const
-{
- // see README for details on the format of map
- if (mPackageGroups.size() == 0) {
- return UNKNOWN_ERROR;
- }
- if (mPackageGroups[0]->packages.size() == 0) {
- return UNKNOWN_ERROR;
- }
-
- Vector<Vector<uint32_t> > map;
- const PackageGroup* pg = mPackageGroups[0];
- const Package* pkg = pg->packages[0];
- size_t typeCount = pkg->types.size();
- // starting size is header + first item (number of types in map)
- *outSize = (IDMAP_HEADER_SIZE + 1) * sizeof(uint32_t);
- const String16 overlayPackage(overlay.mPackageGroups[0]->packages[0]->package->name);
- const uint32_t pkg_id = pkg->package->id << 24;
-
- for (size_t typeIndex = 0; typeIndex < typeCount; ++typeIndex) {
- ssize_t first = -1;
- ssize_t last = -1;
- const Type* typeConfigs = pkg->getType(typeIndex);
- ssize_t mapIndex = map.add();
- if (mapIndex < 0) {
- return NO_MEMORY;
- }
- Vector<uint32_t>& vector = map.editItemAt(mapIndex);
- for (size_t entryIndex = 0; entryIndex < typeConfigs->entryCount; ++entryIndex) {
- uint32_t resID = pkg_id
- | (0x00ff0000 & ((typeIndex+1)<<16))
- | (0x0000ffff & (entryIndex));
- resource_name resName;
- if (!this->getResourceName(resID, true, &resName)) {
- ALOGW("idmap: resource 0x%08x has spec but lacks values, skipping\n", resID);
- // add dummy value, or trimming leading/trailing zeroes later will fail
- vector.push(0);
- continue;
- }
-
- const String16 overlayType(resName.type, resName.typeLen);
- const String16 overlayName(resName.name, resName.nameLen);
- uint32_t overlayResID = overlay.identifierForName(overlayName.string(),
- overlayName.size(),
- overlayType.string(),
- overlayType.size(),
- overlayPackage.string(),
- overlayPackage.size());
- if (overlayResID != 0) {
- overlayResID = pkg_id | (0x00ffffff & overlayResID);
- last = Res_GETENTRY(resID);
- if (first == -1) {
- first = Res_GETENTRY(resID);
- }
- }
- vector.push(overlayResID);
-#if 0
- if (overlayResID != 0) {
- ALOGD("%s/%s 0x%08x -> 0x%08x\n",
- String8(String16(resName.type)).string(),
- String8(String16(resName.name)).string(),
- resID, overlayResID);
- }
-#endif
- }
-
- if (first != -1) {
- // shave off trailing entries which lack overlay values
- const size_t last_past_one = last + 1;
- if (last_past_one < vector.size()) {
- vector.removeItemsAt(last_past_one, vector.size() - last_past_one);
- }
- // shave off leading entries which lack overlay values
- vector.removeItemsAt(0, first);
- // store offset to first overlaid resource ID of this type
- vector.insertAt((uint32_t)first, 0, 1);
- // reserve space for number and offset of entries, and the actual entries
- *outSize += (2 + vector.size()) * sizeof(uint32_t);
- } else {
- // no entries of current type defined in overlay package
- vector.clear();
- // reserve space for type offset
- *outSize += 1 * sizeof(uint32_t);
- }
- }
-
- if ((*outData = malloc(*outSize)) == NULL) {
- return NO_MEMORY;
- }
- uint32_t* data = (uint32_t*)*outData;
- *data++ = htodl(IDMAP_MAGIC);
- *data++ = htodl(originalCrc);
- *data++ = htodl(overlayCrc);
- const size_t mapSize = map.size();
- *data++ = htodl(mapSize);
- size_t offset = mapSize;
- for (size_t i = 0; i < mapSize; ++i) {
- const Vector<uint32_t>& vector = map.itemAt(i);
- const size_t N = vector.size();
- if (N == 0) {
- *data++ = htodl(0);
- } else {
- offset++;
- *data++ = htodl(offset);
- offset += N;
- }
- }
- for (size_t i = 0; i < mapSize; ++i) {
- const Vector<uint32_t>& vector = map.itemAt(i);
- const size_t N = vector.size();
- if (N == 0) {
- continue;
- }
- if (N == 1) { // vector expected to hold (offset) + (N > 0 entries)
- ALOGW("idmap: type %d supposedly has entries, but no entries found\n", i);
- return UNKNOWN_ERROR;
- }
- *data++ = htodl(N - 1); // do not count the offset (which is vector's first element)
- for (size_t j = 0; j < N; ++j) {
- const uint32_t& overlayResID = vector.itemAt(j);
- *data++ = htodl(overlayResID);
- }
- }
-
- return NO_ERROR;
-}
-
-bool ResTable::getIdmapInfo(const void* idmap, size_t sizeBytes,
- uint32_t* pOriginalCrc, uint32_t* pOverlayCrc)
-{
- const uint32_t* map = (const uint32_t*)idmap;
- if (!assertIdmapHeader(map, sizeBytes)) {
- return false;
- }
- *pOriginalCrc = map[1];
- *pOverlayCrc = map[2];
- return true;
-}
-
-
-#define CHAR16_TO_CSTR(c16, len) (String8(String16(c16,len)).string())
-
-#define CHAR16_ARRAY_EQ(constant, var, len) \
- ((len == (sizeof(constant)/sizeof(constant[0]))) && (0 == memcmp((var), (constant), (len))))
-
-static void print_complex(uint32_t complex, bool isFraction)
-{
- const float MANTISSA_MULT =
- 1.0f / (1<<Res_value::COMPLEX_MANTISSA_SHIFT);
- const float RADIX_MULTS[] = {
- 1.0f*MANTISSA_MULT, 1.0f/(1<<7)*MANTISSA_MULT,
- 1.0f/(1<<15)*MANTISSA_MULT, 1.0f/(1<<23)*MANTISSA_MULT
- };
-
- float value = (complex&(Res_value::COMPLEX_MANTISSA_MASK
- <<Res_value::COMPLEX_MANTISSA_SHIFT))
- * RADIX_MULTS[(complex>>Res_value::COMPLEX_RADIX_SHIFT)
- & Res_value::COMPLEX_RADIX_MASK];
- printf("%f", value);
-
- if (!isFraction) {
- switch ((complex>>Res_value::COMPLEX_UNIT_SHIFT)&Res_value::COMPLEX_UNIT_MASK) {
- case Res_value::COMPLEX_UNIT_PX: printf("px"); break;
- case Res_value::COMPLEX_UNIT_DIP: printf("dp"); break;
- case Res_value::COMPLEX_UNIT_SP: printf("sp"); break;
- case Res_value::COMPLEX_UNIT_PT: printf("pt"); break;
- case Res_value::COMPLEX_UNIT_IN: printf("in"); break;
- case Res_value::COMPLEX_UNIT_MM: printf("mm"); break;
- default: printf(" (unknown unit)"); break;
- }
- } else {
- switch ((complex>>Res_value::COMPLEX_UNIT_SHIFT)&Res_value::COMPLEX_UNIT_MASK) {
- case Res_value::COMPLEX_UNIT_FRACTION: printf("%%"); break;
- case Res_value::COMPLEX_UNIT_FRACTION_PARENT: printf("%%p"); break;
- default: printf(" (unknown unit)"); break;
- }
- }
-}
-
-// Normalize a string for output
-String8 ResTable::normalizeForOutput( const char *input )
-{
- String8 ret;
- char buff[2];
- buff[1] = '\0';
-
- while (*input != '\0') {
- switch (*input) {
- // All interesting characters are in the ASCII zone, so we are making our own lives
- // easier by scanning the string one byte at a time.
- case '\\':
- ret += "\\\\";
- break;
- case '\n':
- ret += "\\n";
- break;
- case '"':
- ret += "\\\"";
- break;
- default:
- buff[0] = *input;
- ret += buff;
- break;
- }
-
- input++;
- }
-
- return ret;
-}
-
-void ResTable::print_value(const Package* pkg, const Res_value& value) const
-{
- if (value.dataType == Res_value::TYPE_NULL) {
- printf("(null)\n");
- } else if (value.dataType == Res_value::TYPE_REFERENCE) {
- printf("(reference) 0x%08x\n", value.data);
- } else if (value.dataType == Res_value::TYPE_ATTRIBUTE) {
- printf("(attribute) 0x%08x\n", value.data);
- } else if (value.dataType == Res_value::TYPE_STRING) {
- size_t len;
- const char* str8 = pkg->header->values.string8At(
- value.data, &len);
- if (str8 != NULL) {
- printf("(string8) \"%s\"\n", normalizeForOutput(str8).string());
- } else {
- const char16_t* str16 = pkg->header->values.stringAt(
- value.data, &len);
- if (str16 != NULL) {
- printf("(string16) \"%s\"\n",
- normalizeForOutput(String8(str16, len).string()).string());
- } else {
- printf("(string) null\n");
- }
- }
- } else if (value.dataType == Res_value::TYPE_FLOAT) {
- printf("(float) %g\n", *(const float*)&value.data);
- } else if (value.dataType == Res_value::TYPE_DIMENSION) {
- printf("(dimension) ");
- print_complex(value.data, false);
- printf("\n");
- } else if (value.dataType == Res_value::TYPE_FRACTION) {
- printf("(fraction) ");
- print_complex(value.data, true);
- printf("\n");
- } else if (value.dataType >= Res_value::TYPE_FIRST_COLOR_INT
- || value.dataType <= Res_value::TYPE_LAST_COLOR_INT) {
- printf("(color) #%08x\n", value.data);
- } else if (value.dataType == Res_value::TYPE_INT_BOOLEAN) {
- printf("(boolean) %s\n", value.data ? "true" : "false");
- } else if (value.dataType >= Res_value::TYPE_FIRST_INT
- || value.dataType <= Res_value::TYPE_LAST_INT) {
- printf("(int) 0x%08x or %d\n", value.data, value.data);
- } else {
- printf("(unknown type) t=0x%02x d=0x%08x (s=0x%04x r=0x%02x)\n",
- (int)value.dataType, (int)value.data,
- (int)value.size, (int)value.res0);
- }
-}
-
-void ResTable::print(bool inclValues) const
-{
- if (mError != 0) {
- printf("mError=0x%x (%s)\n", mError, strerror(mError));
- }
-#if 0
- printf("mParams=%c%c-%c%c,\n",
- mParams.language[0], mParams.language[1],
- mParams.country[0], mParams.country[1]);
-#endif
- size_t pgCount = mPackageGroups.size();
- printf("Package Groups (%d)\n", (int)pgCount);
- for (size_t pgIndex=0; pgIndex<pgCount; pgIndex++) {
- const PackageGroup* pg = mPackageGroups[pgIndex];
- printf("Package Group %d id=%d packageCount=%d name=%s\n",
- (int)pgIndex, pg->id, (int)pg->packages.size(),
- String8(pg->name).string());
-
- size_t pkgCount = pg->packages.size();
- for (size_t pkgIndex=0; pkgIndex<pkgCount; pkgIndex++) {
- const Package* pkg = pg->packages[pkgIndex];
- size_t typeCount = pkg->types.size();
- printf(" Package %d id=%d name=%s typeCount=%d\n", (int)pkgIndex,
- pkg->package->id, String8(String16(pkg->package->name)).string(),
- (int)typeCount);
- for (size_t typeIndex=0; typeIndex<typeCount; typeIndex++) {
- const Type* typeConfigs = pkg->getType(typeIndex);
- if (typeConfigs == NULL) {
- printf(" type %d NULL\n", (int)typeIndex);
- continue;
- }
- const size_t NTC = typeConfigs->configs.size();
- printf(" type %d configCount=%d entryCount=%d\n",
- (int)typeIndex, (int)NTC, (int)typeConfigs->entryCount);
- if (typeConfigs->typeSpecFlags != NULL) {
- for (size_t entryIndex=0; entryIndex<typeConfigs->entryCount; entryIndex++) {
- uint32_t resID = (0xff000000 & ((pkg->package->id)<<24))
- | (0x00ff0000 & ((typeIndex+1)<<16))
- | (0x0000ffff & (entryIndex));
- resource_name resName;
- if (this->getResourceName(resID, true, &resName)) {
- String8 type8;
- String8 name8;
- if (resName.type8 != NULL) {
- type8 = String8(resName.type8, resName.typeLen);
- } else {
- type8 = String8(resName.type, resName.typeLen);
- }
- if (resName.name8 != NULL) {
- name8 = String8(resName.name8, resName.nameLen);
- } else {
- name8 = String8(resName.name, resName.nameLen);
- }
- printf(" spec resource 0x%08x %s:%s/%s: flags=0x%08x\n",
- resID,
- CHAR16_TO_CSTR(resName.package, resName.packageLen),
- type8.string(), name8.string(),
- dtohl(typeConfigs->typeSpecFlags[entryIndex]));
- } else {
- printf(" INVALID TYPE CONFIG FOR RESOURCE 0x%08x\n", resID);
- }
- }
- }
- for (size_t configIndex=0; configIndex<NTC; configIndex++) {
- const ResTable_type* type = typeConfigs->configs[configIndex];
- if ((((uint64_t)type)&0x3) != 0) {
- printf(" NON-INTEGER ResTable_type ADDRESS: %p\n", type);
- continue;
- }
- String8 configStr = type->config.toString();
- printf(" config %s:\n", configStr.size() > 0
- ? configStr.string() : "(default)");
- size_t entryCount = dtohl(type->entryCount);
- uint32_t entriesStart = dtohl(type->entriesStart);
- if ((entriesStart&0x3) != 0) {
- printf(" NON-INTEGER ResTable_type entriesStart OFFSET: %p\n", (void*)entriesStart);
- continue;
- }
- uint32_t typeSize = dtohl(type->header.size);
- if ((typeSize&0x3) != 0) {
- printf(" NON-INTEGER ResTable_type header.size: %p\n", (void*)typeSize);
- continue;
- }
- for (size_t entryIndex=0; entryIndex<entryCount; entryIndex++) {
-
- const uint8_t* const end = ((const uint8_t*)type)
- + dtohl(type->header.size);
- const uint32_t* const eindex = (const uint32_t*)
- (((const uint8_t*)type) + dtohs(type->header.headerSize));
-
- uint32_t thisOffset = dtohl(eindex[entryIndex]);
- if (thisOffset == ResTable_type::NO_ENTRY) {
- continue;
- }
-
- uint32_t resID = (0xff000000 & ((pkg->package->id)<<24))
- | (0x00ff0000 & ((typeIndex+1)<<16))
- | (0x0000ffff & (entryIndex));
- resource_name resName;
- if (this->getResourceName(resID, true, &resName)) {
- String8 type8;
- String8 name8;
- if (resName.type8 != NULL) {
- type8 = String8(resName.type8, resName.typeLen);
- } else {
- type8 = String8(resName.type, resName.typeLen);
- }
- if (resName.name8 != NULL) {
- name8 = String8(resName.name8, resName.nameLen);
- } else {
- name8 = String8(resName.name, resName.nameLen);
- }
- printf(" resource 0x%08x %s:%s/%s: ", resID,
- CHAR16_TO_CSTR(resName.package, resName.packageLen),
- type8.string(), name8.string());
- } else {
- printf(" INVALID RESOURCE 0x%08x: ", resID);
- }
- if ((thisOffset&0x3) != 0) {
- printf("NON-INTEGER OFFSET: %p\n", (void*)thisOffset);
- continue;
- }
- if ((thisOffset+sizeof(ResTable_entry)) > typeSize) {
- printf("OFFSET OUT OF BOUNDS: %p+%p (size is %p)\n",
- (void*)entriesStart, (void*)thisOffset,
- (void*)typeSize);
- continue;
- }
-
- const ResTable_entry* ent = (const ResTable_entry*)
- (((const uint8_t*)type) + entriesStart + thisOffset);
- if (((entriesStart + thisOffset)&0x3) != 0) {
- printf("NON-INTEGER ResTable_entry OFFSET: %p\n",
- (void*)(entriesStart + thisOffset));
- continue;
- }
-
- uint16_t esize = dtohs(ent->size);
- if ((esize&0x3) != 0) {
- printf("NON-INTEGER ResTable_entry SIZE: %p\n", (void*)esize);
- continue;
- }
- if ((thisOffset+esize) > typeSize) {
- printf("ResTable_entry OUT OF BOUNDS: %p+%p+%p (size is %p)\n",
- (void*)entriesStart, (void*)thisOffset,
- (void*)esize, (void*)typeSize);
- continue;
- }
-
- const Res_value* valuePtr = NULL;
- const ResTable_map_entry* bagPtr = NULL;
- Res_value value;
- if ((dtohs(ent->flags)&ResTable_entry::FLAG_COMPLEX) != 0) {
- printf("<bag>");
- bagPtr = (const ResTable_map_entry*)ent;
- } else {
- valuePtr = (const Res_value*)
- (((const uint8_t*)ent) + esize);
- value.copyFrom_dtoh(*valuePtr);
- printf("t=0x%02x d=0x%08x (s=0x%04x r=0x%02x)",
- (int)value.dataType, (int)value.data,
- (int)value.size, (int)value.res0);
- }
-
- if ((dtohs(ent->flags)&ResTable_entry::FLAG_PUBLIC) != 0) {
- printf(" (PUBLIC)");
- }
- printf("\n");
-
- if (inclValues) {
- if (valuePtr != NULL) {
- printf(" ");
- print_value(pkg, value);
- } else if (bagPtr != NULL) {
- const int N = dtohl(bagPtr->count);
- const uint8_t* baseMapPtr = (const uint8_t*)ent;
- size_t mapOffset = esize;
- const ResTable_map* mapPtr = (ResTable_map*)(baseMapPtr+mapOffset);
- printf(" Parent=0x%08x, Count=%d\n",
- dtohl(bagPtr->parent.ident), N);
- for (int i=0; i<N && mapOffset < (typeSize-sizeof(ResTable_map)); i++) {
- printf(" #%i (Key=0x%08x): ",
- i, dtohl(mapPtr->name.ident));
- value.copyFrom_dtoh(mapPtr->value);
- print_value(pkg, value);
- const size_t size = dtohs(mapPtr->value.size);
- mapOffset += size + sizeof(*mapPtr)-sizeof(mapPtr->value);
- mapPtr = (ResTable_map*)(baseMapPtr+mapOffset);
- }
- }
- }
- }
- }
- }
- }
- }
-}
-
-} // namespace android
diff --git a/libs/androidfw/StreamingZipInflater.cpp b/libs/androidfw/StreamingZipInflater.cpp
deleted file mode 100644
index 1dfec23..0000000
--- a/libs/androidfw/StreamingZipInflater.cpp
+++ /dev/null
@@ -1,242 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-//#define LOG_NDEBUG 0
-#define LOG_TAG "szipinf"
-#include <utils/Log.h>
-
-#include <androidfw/StreamingZipInflater.h>
-#include <utils/FileMap.h>
-#include <string.h>
-#include <stddef.h>
-#include <assert.h>
-#include <unistd.h>
-#include <errno.h>
-
-/*
- * TEMP_FAILURE_RETRY is defined by some, but not all, versions of
- * <unistd.h>. (Alas, it is not as standard as we'd hoped!) So, if it's
- * not already defined, then define it here.
- */
-#ifndef TEMP_FAILURE_RETRY
-/* Used to retry syscalls that can return EINTR. */
-#define TEMP_FAILURE_RETRY(exp) ({ \
- typeof (exp) _rc; \
- do { \
- _rc = (exp); \
- } while (_rc == -1 && errno == EINTR); \
- _rc; })
-#endif
-
-static inline size_t min_of(size_t a, size_t b) { return (a < b) ? a : b; }
-
-using namespace android;
-
-/*
- * Streaming access to compressed asset data in an open fd
- */
-StreamingZipInflater::StreamingZipInflater(int fd, off64_t compDataStart,
- size_t uncompSize, size_t compSize) {
- mFd = fd;
- mDataMap = NULL;
- mInFileStart = compDataStart;
- mOutTotalSize = uncompSize;
- mInTotalSize = compSize;
-
- mInBufSize = StreamingZipInflater::INPUT_CHUNK_SIZE;
- mInBuf = new uint8_t[mInBufSize];
-
- mOutBufSize = StreamingZipInflater::OUTPUT_CHUNK_SIZE;
- mOutBuf = new uint8_t[mOutBufSize];
-
- initInflateState();
-}
-
-/*
- * Streaming access to compressed data held in an mmapped region of memory
- */
-StreamingZipInflater::StreamingZipInflater(FileMap* dataMap, size_t uncompSize) {
- mFd = -1;
- mDataMap = dataMap;
- mOutTotalSize = uncompSize;
- mInTotalSize = dataMap->getDataLength();
-
- mInBuf = (uint8_t*) dataMap->getDataPtr();
- mInBufSize = mInTotalSize;
-
- mOutBufSize = StreamingZipInflater::OUTPUT_CHUNK_SIZE;
- mOutBuf = new uint8_t[mOutBufSize];
-
- initInflateState();
-}
-
-StreamingZipInflater::~StreamingZipInflater() {
- // tear down the in-flight zip state just in case
- ::inflateEnd(&mInflateState);
-
- if (mDataMap == NULL) {
- delete [] mInBuf;
- }
- delete [] mOutBuf;
-}
-
-void StreamingZipInflater::initInflateState() {
- ALOGV("Initializing inflate state");
-
- memset(&mInflateState, 0, sizeof(mInflateState));
- mInflateState.zalloc = Z_NULL;
- mInflateState.zfree = Z_NULL;
- mInflateState.opaque = Z_NULL;
- mInflateState.next_in = (Bytef*)mInBuf;
- mInflateState.next_out = (Bytef*) mOutBuf;
- mInflateState.avail_out = mOutBufSize;
- mInflateState.data_type = Z_UNKNOWN;
-
- mOutLastDecoded = mOutDeliverable = mOutCurPosition = 0;
- mInNextChunkOffset = 0;
- mStreamNeedsInit = true;
-
- if (mDataMap == NULL) {
- ::lseek(mFd, mInFileStart, SEEK_SET);
- mInflateState.avail_in = 0; // set when a chunk is read in
- } else {
- mInflateState.avail_in = mInBufSize;
- }
-}
-
-/*
- * Basic approach:
- *
- * 1. If we have undelivered uncompressed data, send it. At this point
- * either we've satisfied the request, or we've exhausted the available
- * output data in mOutBuf.
- *
- * 2. While we haven't sent enough data to satisfy the request:
- * 0. if the request is for more data than exists, bail.
- * a. if there is no input data to decode, read some into the input buffer
- * and readjust the z_stream input pointers
- * b. point the output to the start of the output buffer and decode what we can
- * c. deliver whatever output data we can
- */
-ssize_t StreamingZipInflater::read(void* outBuf, size_t count) {
- uint8_t* dest = (uint8_t*) outBuf;
- size_t bytesRead = 0;
- size_t toRead = min_of(count, size_t(mOutTotalSize - mOutCurPosition));
- while (toRead > 0) {
- // First, write from whatever we already have decoded and ready to go
- size_t deliverable = min_of(toRead, mOutLastDecoded - mOutDeliverable);
- if (deliverable > 0) {
- if (outBuf != NULL) memcpy(dest, mOutBuf + mOutDeliverable, deliverable);
- mOutDeliverable += deliverable;
- mOutCurPosition += deliverable;
- dest += deliverable;
- bytesRead += deliverable;
- toRead -= deliverable;
- }
-
- // need more data? time to decode some.
- if (toRead > 0) {
- // if we don't have any data to decode, read some in. If we're working
- // from mmapped data this won't happen, because the clipping to total size
- // will prevent reading off the end of the mapped input chunk.
- if ((mInflateState.avail_in == 0) && (mDataMap == NULL)) {
- int err = readNextChunk();
- if (err < 0) {
- ALOGE("Unable to access asset data: %d", err);
- if (!mStreamNeedsInit) {
- ::inflateEnd(&mInflateState);
- initInflateState();
- }
- return -1;
- }
- }
- // we know we've drained whatever is in the out buffer now, so just
- // start from scratch there, reading all the input we have at present.
- mInflateState.next_out = (Bytef*) mOutBuf;
- mInflateState.avail_out = mOutBufSize;
-
- /*
- ALOGV("Inflating to outbuf: avail_in=%u avail_out=%u next_in=%p next_out=%p",
- mInflateState.avail_in, mInflateState.avail_out,
- mInflateState.next_in, mInflateState.next_out);
- */
- int result = Z_OK;
- if (mStreamNeedsInit) {
- ALOGV("Initializing zlib to inflate");
- result = inflateInit2(&mInflateState, -MAX_WBITS);
- mStreamNeedsInit = false;
- }
- if (result == Z_OK) result = ::inflate(&mInflateState, Z_SYNC_FLUSH);
- if (result < 0) {
- // Whoops, inflation failed
- ALOGE("Error inflating asset: %d", result);
- ::inflateEnd(&mInflateState);
- initInflateState();
- return -1;
- } else {
- if (result == Z_STREAM_END) {
- // we know we have to have reached the target size here and will
- // not try to read any further, so just wind things up.
- ::inflateEnd(&mInflateState);
- }
-
- // Note how much data we got, and off we go
- mOutDeliverable = 0;
- mOutLastDecoded = mOutBufSize - mInflateState.avail_out;
- }
- }
- }
- return bytesRead;
-}
-
-int StreamingZipInflater::readNextChunk() {
- assert(mDataMap == NULL);
-
- if (mInNextChunkOffset < mInTotalSize) {
- size_t toRead = min_of(mInBufSize, mInTotalSize - mInNextChunkOffset);
- if (toRead > 0) {
- ssize_t didRead = TEMP_FAILURE_RETRY(::read(mFd, mInBuf, toRead));
- //ALOGV("Reading input chunk, size %08x didread %08x", toRead, didRead);
- if (didRead < 0) {
- ALOGE("Error reading asset data: %s", strerror(errno));
- return didRead;
- } else {
- mInNextChunkOffset += didRead;
- mInflateState.next_in = (Bytef*) mInBuf;
- mInflateState.avail_in = didRead;
- }
- }
- }
- return 0;
-}
-
-// seeking backwards requires uncompressing fom the beginning, so is very
-// expensive. seeking forwards only requires uncompressing from the current
-// position to the destination.
-off64_t StreamingZipInflater::seekAbsolute(off64_t absoluteInputPosition) {
- if (absoluteInputPosition < mOutCurPosition) {
- // rewind and reprocess the data from the beginning
- if (!mStreamNeedsInit) {
- ::inflateEnd(&mInflateState);
- }
- initInflateState();
- read(NULL, absoluteInputPosition);
- } else if (absoluteInputPosition > mOutCurPosition) {
- read(NULL, absoluteInputPosition - mOutCurPosition);
- }
- // else if the target position *is* our current position, do nothing
- return absoluteInputPosition;
-}
diff --git a/libs/androidfw/ZipFileRO.cpp b/libs/androidfw/ZipFileRO.cpp
deleted file mode 100644
index ec5f95c..0000000
--- a/libs/androidfw/ZipFileRO.cpp
+++ /dev/null
@@ -1,995 +0,0 @@
-/*
- * 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.
- */
-
-//
-// Read-only access to Zip archives, with minimal heap allocation.
-//
-#define LOG_TAG "zipro"
-//#define LOG_NDEBUG 0
-#include <androidfw/ZipFileRO.h>
-#include <utils/Log.h>
-#include <utils/Compat.h>
-#include <utils/misc.h>
-#include <utils/threads.h>
-
-#include <zlib.h>
-
-#include <string.h>
-#include <fcntl.h>
-#include <errno.h>
-#include <assert.h>
-#include <unistd.h>
-
-/*
- * We must open binary files using open(path, ... | O_BINARY) under Windows.
- * Otherwise strange read errors will happen.
- */
-#ifndef O_BINARY
-# define O_BINARY 0
-#endif
-
-using namespace android;
-
-/*
- * Zip file constants.
- */
-#define kEOCDSignature 0x06054b50
-#define kEOCDLen 22
-#define kEOCDDiskNumber 4 // number of the current disk
-#define kEOCDDiskNumberForCD 6 // disk number with the Central Directory
-#define kEOCDNumEntries 8 // offset to #of entries in file
-#define kEOCDTotalNumEntries 10 // offset to total #of entries in spanned archives
-#define kEOCDSize 12 // size of the central directory
-#define kEOCDFileOffset 16 // offset to central directory
-#define kEOCDCommentSize 20 // offset to the length of the file comment
-
-#define kMaxCommentLen 65535 // longest possible in ushort
-#define kMaxEOCDSearch (kMaxCommentLen + kEOCDLen)
-
-#define kLFHSignature 0x04034b50
-#define kLFHLen 30 // excluding variable-len fields
-#define kLFHGPBFlags 6 // offset to GPB flags
-#define kLFHNameLen 26 // offset to filename length
-#define kLFHExtraLen 28 // offset to extra length
-
-#define kCDESignature 0x02014b50
-#define kCDELen 46 // excluding variable-len fields
-#define kCDEGPBFlags 8 // offset to GPB flags
-#define kCDEMethod 10 // offset to compression method
-#define kCDEModWhen 12 // offset to modification timestamp
-#define kCDECRC 16 // offset to entry CRC
-#define kCDECompLen 20 // offset to compressed length
-#define kCDEUncompLen 24 // offset to uncompressed length
-#define kCDENameLen 28 // offset to filename length
-#define kCDEExtraLen 30 // offset to extra length
-#define kCDECommentLen 32 // offset to comment length
-#define kCDELocalOffset 42 // offset to local hdr
-
-/* General Purpose Bit Flag */
-#define kGPFEncryptedFlag (1 << 0)
-#define kGPFUnsupportedMask (kGPFEncryptedFlag)
-
-/*
- * The values we return for ZipEntryRO use 0 as an invalid value, so we
- * want to adjust the hash table index by a fixed amount. Using a large
- * value helps insure that people don't mix & match arguments, e.g. to
- * findEntryByIndex().
- */
-#define kZipEntryAdj 10000
-
-ZipFileRO::~ZipFileRO() {
- free(mHashTable);
- if (mDirectoryMap)
- mDirectoryMap->release();
- if (mFd >= 0)
- TEMP_FAILURE_RETRY(close(mFd));
- if (mFileName)
- free(mFileName);
-}
-
-/*
- * Convert a ZipEntryRO to a hash table index, verifying that it's in a
- * valid range.
- */
-int ZipFileRO::entryToIndex(const ZipEntryRO entry) const
-{
- long ent = ((intptr_t) entry) - kZipEntryAdj;
- if (ent < 0 || ent >= mHashTableSize || mHashTable[ent].name == NULL) {
- ALOGW("Invalid ZipEntryRO %p (%ld)\n", entry, ent);
- return -1;
- }
- return ent;
-}
-
-
-/*
- * Open the specified file read-only. We memory-map the entire thing and
- * close the file before returning.
- */
-status_t ZipFileRO::open(const char* zipFileName)
-{
- int fd = -1;
-
- assert(mDirectoryMap == NULL);
-
- /*
- * Open and map the specified file.
- */
- fd = TEMP_FAILURE_RETRY(::open(zipFileName, O_RDONLY | O_BINARY));
- if (fd < 0) {
- ALOGW("Unable to open zip '%s': %s\n", zipFileName, strerror(errno));
- return NAME_NOT_FOUND;
- }
-
- mFileLength = lseek64(fd, 0, SEEK_END);
- if (mFileLength < kEOCDLen) {
- TEMP_FAILURE_RETRY(close(fd));
- return UNKNOWN_ERROR;
- }
-
- if (mFileName != NULL) {
- free(mFileName);
- }
- mFileName = strdup(zipFileName);
-
- mFd = fd;
-
- /*
- * Find the Central Directory and store its size and number of entries.
- */
- if (!mapCentralDirectory()) {
- goto bail;
- }
-
- /*
- * Verify Central Directory and create data structures for fast access.
- */
- if (!parseZipArchive()) {
- goto bail;
- }
-
- return OK;
-
-bail:
- free(mFileName);
- mFileName = NULL;
- TEMP_FAILURE_RETRY(close(fd));
- return UNKNOWN_ERROR;
-}
-
-/*
- * Parse the Zip archive, verifying its contents and initializing internal
- * data structures.
- */
-bool ZipFileRO::mapCentralDirectory(void)
-{
- ssize_t readAmount = kMaxEOCDSearch;
- if (readAmount > (ssize_t) mFileLength)
- readAmount = mFileLength;
-
- if (readAmount < kEOCDSize) {
- ALOGW("File too short to be a zip file");
- return false;
- }
-
- unsigned char* scanBuf = (unsigned char*) malloc(readAmount);
- if (scanBuf == NULL) {
- ALOGW("couldn't allocate scanBuf: %s", strerror(errno));
- free(scanBuf);
- return false;
- }
-
- /*
- * Make sure this is a Zip archive.
- */
- if (lseek64(mFd, 0, SEEK_SET) != 0) {
- ALOGW("seek to start failed: %s", strerror(errno));
- free(scanBuf);
- return false;
- }
-
- ssize_t actual = TEMP_FAILURE_RETRY(read(mFd, scanBuf, sizeof(int32_t)));
- if (actual != (ssize_t) sizeof(int32_t)) {
- ALOGI("couldn't read first signature from zip archive: %s", strerror(errno));
- free(scanBuf);
- return false;
- }
-
- unsigned int header = get4LE(scanBuf);
- if (header != kLFHSignature) {
- ALOGV("Not a Zip archive (found 0x%08x)\n", header);
- free(scanBuf);
- return false;
- }
-
- /*
- * Perform the traditional EOCD snipe hunt.
- *
- * We're searching for the End of Central Directory magic number,
- * which appears at the start of the EOCD block. It's followed by
- * 18 bytes of EOCD stuff and up to 64KB of archive comment. We
- * need to read the last part of the file into a buffer, dig through
- * it to find the magic number, parse some values out, and use those
- * to determine the extent of the CD.
- *
- * We start by pulling in the last part of the file.
- */
- off64_t searchStart = mFileLength - readAmount;
-
- if (lseek64(mFd, searchStart, SEEK_SET) != searchStart) {
- ALOGW("seek %ld failed: %s\n", (long) searchStart, strerror(errno));
- free(scanBuf);
- return false;
- }
- actual = TEMP_FAILURE_RETRY(read(mFd, scanBuf, readAmount));
- if (actual != (ssize_t) readAmount) {
- ALOGW("Zip: read " ZD ", expected " ZD ". Failed: %s\n",
- (ZD_TYPE) actual, (ZD_TYPE) readAmount, strerror(errno));
- free(scanBuf);
- return false;
- }
-
- /*
- * Scan backward for the EOCD magic. In an archive without a trailing
- * comment, we'll find it on the first try. (We may want to consider
- * doing an initial minimal read; if we don't find it, retry with a
- * second read as above.)
- */
- int i;
- for (i = readAmount - kEOCDLen; i >= 0; i--) {
- if (scanBuf[i] == 0x50 && get4LE(&scanBuf[i]) == kEOCDSignature) {
- ALOGV("+++ Found EOCD at buf+%d\n", i);
- break;
- }
- }
- if (i < 0) {
- ALOGD("Zip: EOCD not found, %s is not zip\n", mFileName);
- free(scanBuf);
- return false;
- }
-
- off64_t eocdOffset = searchStart + i;
- const unsigned char* eocdPtr = scanBuf + i;
-
- assert(eocdOffset < mFileLength);
-
- /*
- * Grab the CD offset and size, and the number of entries in the
- * archive. After that, we can release our EOCD hunt buffer.
- */
- unsigned int diskNumber = get2LE(eocdPtr + kEOCDDiskNumber);
- unsigned int diskWithCentralDir = get2LE(eocdPtr + kEOCDDiskNumberForCD);
- unsigned int numEntries = get2LE(eocdPtr + kEOCDNumEntries);
- unsigned int totalNumEntries = get2LE(eocdPtr + kEOCDTotalNumEntries);
- unsigned int centralDirSize = get4LE(eocdPtr + kEOCDSize);
- unsigned int centralDirOffset = get4LE(eocdPtr + kEOCDFileOffset);
- unsigned int commentSize = get2LE(eocdPtr + kEOCDCommentSize);
- free(scanBuf);
-
- // Verify that they look reasonable.
- if ((long long) centralDirOffset + (long long) centralDirSize > (long long) eocdOffset) {
- ALOGW("bad offsets (dir %ld, size %u, eocd %ld)\n",
- (long) centralDirOffset, centralDirSize, (long) eocdOffset);
- return false;
- }
- if (numEntries == 0) {
- ALOGW("empty archive?\n");
- return false;
- } else if (numEntries != totalNumEntries || diskNumber != 0 || diskWithCentralDir != 0) {
- ALOGW("spanned archives not supported");
- return false;
- }
-
- // Check to see if comment is a sane size
- if ((commentSize > (mFileLength - kEOCDLen))
- || (eocdOffset > (mFileLength - kEOCDLen) - commentSize)) {
- ALOGW("comment size runs off end of file");
- return false;
- }
-
- ALOGV("+++ numEntries=%d dirSize=%d dirOffset=%d\n",
- numEntries, centralDirSize, centralDirOffset);
-
- mDirectoryMap = new FileMap();
- if (mDirectoryMap == NULL) {
- ALOGW("Unable to create directory map: %s", strerror(errno));
- return false;
- }
-
- if (!mDirectoryMap->create(mFileName, mFd, centralDirOffset, centralDirSize, true)) {
- ALOGW("Unable to map '%s' (" ZD " to " ZD "): %s\n", mFileName,
- (ZD_TYPE) centralDirOffset, (ZD_TYPE) (centralDirOffset + centralDirSize), strerror(errno));
- return false;
- }
-
- mNumEntries = numEntries;
- mDirectoryOffset = centralDirOffset;
-
- return true;
-}
-
-
-/*
- * Round up to the next highest power of 2.
- *
- * Found on http://graphics.stanford.edu/~seander/bithacks.html.
- */
-static unsigned int roundUpPower2(unsigned int val)
-{
- val--;
- val |= val >> 1;
- val |= val >> 2;
- val |= val >> 4;
- val |= val >> 8;
- val |= val >> 16;
- val++;
-
- return val;
-}
-
-bool ZipFileRO::parseZipArchive(void)
-{
- bool result = false;
- const unsigned char* cdPtr = (const unsigned char*) mDirectoryMap->getDataPtr();
- size_t cdLength = mDirectoryMap->getDataLength();
- int numEntries = mNumEntries;
-
- /*
- * Create hash table. We have a minimum 75% load factor, possibly as
- * low as 50% after we round off to a power of 2.
- */
- mHashTableSize = roundUpPower2(1 + (numEntries * 4) / 3);
- mHashTable = (HashEntry*) calloc(mHashTableSize, sizeof(HashEntry));
-
- /*
- * Walk through the central directory, adding entries to the hash
- * table.
- */
- const unsigned char* ptr = cdPtr;
- for (int i = 0; i < numEntries; i++) {
- if (get4LE(ptr) != kCDESignature) {
- ALOGW("Missed a central dir sig (at %d)\n", i);
- goto bail;
- }
- if (ptr + kCDELen > cdPtr + cdLength) {
- ALOGW("Ran off the end (at %d)\n", i);
- goto bail;
- }
-
- long localHdrOffset = (long) get4LE(ptr + kCDELocalOffset);
- if (localHdrOffset >= mDirectoryOffset) {
- ALOGW("bad LFH offset %ld at entry %d\n", localHdrOffset, i);
- goto bail;
- }
-
- unsigned int gpbf = get2LE(ptr + kCDEGPBFlags);
- if ((gpbf & kGPFUnsupportedMask) != 0) {
- ALOGW("Invalid General Purpose Bit Flag: %d", gpbf);
- goto bail;
- }
-
- unsigned int nameLen = get2LE(ptr + kCDENameLen);
- unsigned int extraLen = get2LE(ptr + kCDEExtraLen);
- unsigned int commentLen = get2LE(ptr + kCDECommentLen);
-
- const char *name = (const char *) ptr + kCDELen;
-
- /* Check name for NULL characters */
- if (memchr(name, 0, nameLen) != NULL) {
- ALOGW("Filename contains NUL byte");
- goto bail;
- }
-
- /* add the CDE filename to the hash table */
- unsigned int hash = computeHash(name, nameLen);
- addToHash(name, nameLen, hash);
-
- /* We don't care about the comment or extra data. */
- ptr += kCDELen + nameLen + extraLen + commentLen;
- if ((size_t)(ptr - cdPtr) > cdLength) {
- ALOGW("bad CD advance (%d vs " ZD ") at entry %d\n",
- (int) (ptr - cdPtr), (ZD_TYPE) cdLength, i);
- goto bail;
- }
- }
- ALOGV("+++ zip good scan %d entries\n", numEntries);
- result = true;
-
-bail:
- return result;
-}
-
-/*
- * Simple string hash function for non-null-terminated strings.
- */
-/*static*/ unsigned int ZipFileRO::computeHash(const char* str, int len)
-{
- unsigned int hash = 0;
-
- while (len--)
- hash = hash * 31 + *str++;
-
- return hash;
-}
-
-/*
- * Add a new entry to the hash table.
- */
-void ZipFileRO::addToHash(const char* str, int strLen, unsigned int hash)
-{
- int ent = hash & (mHashTableSize-1);
-
- /*
- * We over-allocate the table, so we're guaranteed to find an empty slot.
- */
- while (mHashTable[ent].name != NULL)
- ent = (ent + 1) & (mHashTableSize-1);
-
- mHashTable[ent].name = str;
- mHashTable[ent].nameLen = strLen;
-}
-
-/*
- * Find a matching entry.
- *
- * Returns NULL if not found.
- */
-ZipEntryRO ZipFileRO::findEntryByName(const char* fileName) const
-{
- /*
- * If the ZipFileRO instance is not initialized, the entry number will
- * end up being garbage since mHashTableSize is -1.
- */
- if (mHashTableSize <= 0) {
- return NULL;
- }
-
- int nameLen = strlen(fileName);
- unsigned int hash = computeHash(fileName, nameLen);
- int ent = hash & (mHashTableSize-1);
-
- while (mHashTable[ent].name != NULL) {
- if (mHashTable[ent].nameLen == nameLen &&
- memcmp(mHashTable[ent].name, fileName, nameLen) == 0)
- {
- /* match */
- return (ZipEntryRO)(long)(ent + kZipEntryAdj);
- }
-
- ent = (ent + 1) & (mHashTableSize-1);
- }
-
- return NULL;
-}
-
-/*
- * Find the Nth entry.
- *
- * This currently involves walking through the sparse hash table, counting
- * non-empty entries. If we need to speed this up we can either allocate
- * a parallel lookup table or (perhaps better) provide an iterator interface.
- */
-ZipEntryRO ZipFileRO::findEntryByIndex(int idx) const
-{
- if (idx < 0 || idx >= mNumEntries) {
- ALOGW("Invalid index %d\n", idx);
- return NULL;
- }
-
- for (int ent = 0; ent < mHashTableSize; ent++) {
- if (mHashTable[ent].name != NULL) {
- if (idx-- == 0)
- return (ZipEntryRO) (intptr_t)(ent + kZipEntryAdj);
- }
- }
-
- return NULL;
-}
-
-/*
- * Get the useful fields from the zip entry.
- *
- * Returns "false" if the offsets to the fields or the contents of the fields
- * appear to be bogus.
- */
-bool ZipFileRO::getEntryInfo(ZipEntryRO entry, int* pMethod, size_t* pUncompLen,
- size_t* pCompLen, off64_t* pOffset, long* pModWhen, long* pCrc32) const
-{
- bool ret = false;
-
- const int ent = entryToIndex(entry);
- if (ent < 0) {
- ALOGW("cannot find entry");
- return false;
- }
-
- HashEntry hashEntry = mHashTable[ent];
-
- /*
- * Recover the start of the central directory entry from the filename
- * pointer. The filename is the first entry past the fixed-size data,
- * so we can just subtract back from that.
- */
- const unsigned char* ptr = (const unsigned char*) hashEntry.name;
- off64_t cdOffset = mDirectoryOffset;
-
- ptr -= kCDELen;
-
- int method = get2LE(ptr + kCDEMethod);
- if (pMethod != NULL)
- *pMethod = method;
-
- if (pModWhen != NULL)
- *pModWhen = get4LE(ptr + kCDEModWhen);
- if (pCrc32 != NULL)
- *pCrc32 = get4LE(ptr + kCDECRC);
-
- size_t compLen = get4LE(ptr + kCDECompLen);
- if (pCompLen != NULL)
- *pCompLen = compLen;
- size_t uncompLen = get4LE(ptr + kCDEUncompLen);
- if (pUncompLen != NULL)
- *pUncompLen = uncompLen;
-
- /*
- * If requested, determine the offset of the start of the data. All we
- * have is the offset to the Local File Header, which is variable size,
- * so we have to read the contents of the struct to figure out where
- * the actual data starts.
- *
- * We also need to make sure that the lengths are not so large that
- * somebody trying to map the compressed or uncompressed data runs
- * off the end of the mapped region.
- *
- * Note we don't verify compLen/uncompLen if they don't request the
- * dataOffset, because dataOffset is expensive to determine. However,
- * if they don't have the file offset, they're not likely to be doing
- * anything with the contents.
- */
- if (pOffset != NULL) {
- long localHdrOffset = get4LE(ptr + kCDELocalOffset);
- if (localHdrOffset + kLFHLen >= cdOffset) {
- ALOGE("ERROR: bad local hdr offset in zip\n");
- return false;
- }
-
- unsigned char lfhBuf[kLFHLen];
-
-#ifdef HAVE_PREAD
- /*
- * This file descriptor might be from zygote's preloaded assets,
- * so we need to do an pread64() instead of a lseek64() + read() to
- * guarantee atomicity across the processes with the shared file
- * descriptors.
- */
- ssize_t actual =
- TEMP_FAILURE_RETRY(pread64(mFd, lfhBuf, sizeof(lfhBuf), localHdrOffset));
-
- if (actual != sizeof(lfhBuf)) {
- ALOGW("failed reading lfh from offset %ld\n", localHdrOffset);
- return false;
- }
-
- if (get4LE(lfhBuf) != kLFHSignature) {
- ALOGW("didn't find signature at start of lfh; wanted: offset=%ld data=0x%08x; "
- "got: data=0x%08lx\n",
- localHdrOffset, kLFHSignature, get4LE(lfhBuf));
- return false;
- }
-#else /* HAVE_PREAD */
- /*
- * For hosts don't have pread64() we cannot guarantee atomic reads from
- * an offset in a file. Android should never run on those platforms.
- * File descriptors inherited from a fork() share file offsets and
- * there would be nothing to protect from two different processes
- * calling lseek64() concurrently.
- */
-
- {
- AutoMutex _l(mFdLock);
-
- if (lseek64(mFd, localHdrOffset, SEEK_SET) != localHdrOffset) {
- ALOGW("failed seeking to lfh at offset %ld\n", localHdrOffset);
- return false;
- }
-
- ssize_t actual =
- TEMP_FAILURE_RETRY(read(mFd, lfhBuf, sizeof(lfhBuf)));
- if (actual != sizeof(lfhBuf)) {
- ALOGW("failed reading lfh from offset %ld\n", localHdrOffset);
- return false;
- }
-
- if (get4LE(lfhBuf) != kLFHSignature) {
- off64_t actualOffset = lseek64(mFd, 0, SEEK_CUR);
- ALOGW("didn't find signature at start of lfh; wanted: offset=%ld data=0x%08x; "
- "got: offset=" ZD " data=0x%08lx\n",
- localHdrOffset, kLFHSignature, (ZD_TYPE) actualOffset, get4LE(lfhBuf));
- return false;
- }
- }
-#endif /* HAVE_PREAD */
-
- unsigned int gpbf = get2LE(lfhBuf + kLFHGPBFlags);
- if ((gpbf & kGPFUnsupportedMask) != 0) {
- ALOGW("Invalid General Purpose Bit Flag: %d", gpbf);
- return false;
- }
-
- off64_t dataOffset = localHdrOffset + kLFHLen
- + get2LE(lfhBuf + kLFHNameLen) + get2LE(lfhBuf + kLFHExtraLen);
- if (dataOffset >= cdOffset) {
- ALOGW("bad data offset %ld in zip\n", (long) dataOffset);
- return false;
- }
-
- /* check lengths */
- if ((dataOffset >= cdOffset) || (compLen > (cdOffset - dataOffset))) {
- ALOGW("bad compressed length in zip (%ld + " ZD " > %ld)\n",
- (long) dataOffset, (ZD_TYPE) compLen, (long) cdOffset);
- return false;
- }
-
- if (method == kCompressStored &&
- ((dataOffset >= cdOffset) ||
- (uncompLen > (cdOffset - dataOffset))))
- {
- ALOGE("ERROR: bad uncompressed length in zip (%ld + " ZD " > %ld)\n",
- (long) dataOffset, (ZD_TYPE) uncompLen, (long) cdOffset);
- return false;
- }
-
- *pOffset = dataOffset;
- }
-
- return true;
-}
-
-/*
- * Copy the entry's filename to the buffer.
- */
-int ZipFileRO::getEntryFileName(ZipEntryRO entry, char* buffer, int bufLen)
- const
-{
- int ent = entryToIndex(entry);
- if (ent < 0)
- return -1;
-
- int nameLen = mHashTable[ent].nameLen;
- if (bufLen < nameLen+1)
- return nameLen+1;
-
- memcpy(buffer, mHashTable[ent].name, nameLen);
- buffer[nameLen] = '\0';
- return 0;
-}
-
-/*
- * Create a new FileMap object that spans the data in "entry".
- */
-FileMap* ZipFileRO::createEntryFileMap(ZipEntryRO entry) const
-{
- /*
- * TODO: the efficient way to do this is to modify FileMap to allow
- * sub-regions of a file to be mapped. A reference-counting scheme
- * can manage the base memory mapping. For now, we just create a brand
- * new mapping off of the Zip archive file descriptor.
- */
-
- FileMap* newMap;
- int method;
- size_t uncompLen;
- size_t compLen;
- off64_t offset;
-
- if (!getEntryInfo(entry, &method, &uncompLen, &compLen, &offset, NULL, NULL)) {
- return NULL;
- }
-
- size_t actualLen;
- if (method == kCompressStored) {
- actualLen = uncompLen;
- } else {
- actualLen = compLen;
- }
-
- newMap = new FileMap();
- if (!newMap->create(mFileName, mFd, offset, actualLen, true)) {
- newMap->release();
- return NULL;
- }
-
- return newMap;
-}
-
-/*
- * Uncompress an entry, in its entirety, into the provided output buffer.
- *
- * This doesn't verify the data's CRC, which might be useful for
- * uncompressed data. The caller should be able to manage it.
- */
-bool ZipFileRO::uncompressEntry(ZipEntryRO entry, void* buffer) const
-{
- const size_t kSequentialMin = 32768;
- bool result = false;
- int ent = entryToIndex(entry);
- if (ent < 0) {
- return false;
- }
-
- int method;
- size_t uncompLen, compLen;
- off64_t offset;
- const unsigned char* ptr;
- FileMap *file;
-
- if (!getEntryInfo(entry, &method, &uncompLen, &compLen, &offset, NULL, NULL)) {
- goto bail;
- }
-
- file = createEntryFileMap(entry);
- if (file == NULL) {
- goto bail;
- }
-
- ptr = (const unsigned char*) file->getDataPtr();
-
- /*
- * Experiment with madvise hint. When we want to uncompress a file,
- * we pull some stuff out of the central dir entry and then hit a
- * bunch of compressed or uncompressed data sequentially. The CDE
- * visit will cause a limited amount of read-ahead because it's at
- * the end of the file. We could end up doing lots of extra disk
- * access if the file we're prying open is small. Bottom line is we
- * probably don't want to turn MADV_SEQUENTIAL on and leave it on.
- *
- * So, if the compressed size of the file is above a certain minimum
- * size, temporarily boost the read-ahead in the hope that the extra
- * pair of system calls are negated by a reduction in page faults.
- */
- if (compLen > kSequentialMin)
- file->advise(FileMap::SEQUENTIAL);
-
- if (method == kCompressStored) {
- memcpy(buffer, ptr, uncompLen);
- } else {
- if (!inflateBuffer(buffer, ptr, uncompLen, compLen))
- goto unmap;
- }
-
- if (compLen > kSequentialMin)
- file->advise(FileMap::NORMAL);
-
- result = true;
-
-unmap:
- file->release();
-bail:
- return result;
-}
-
-/*
- * Uncompress an entry, in its entirety, to an open file descriptor.
- *
- * This doesn't verify the data's CRC, but probably should.
- */
-bool ZipFileRO::uncompressEntry(ZipEntryRO entry, int fd) const
-{
- bool result = false;
- int ent = entryToIndex(entry);
- if (ent < 0) {
- return false;
- }
-
- int method;
- size_t uncompLen, compLen;
- off64_t offset;
- const unsigned char* ptr;
- FileMap *file;
-
- if (!getEntryInfo(entry, &method, &uncompLen, &compLen, &offset, NULL, NULL)) {
- goto bail;
- }
-
- file = createEntryFileMap(entry);
- if (file == NULL) {
- goto bail;
- }
-
- ptr = (const unsigned char*) file->getDataPtr();
-
- if (method == kCompressStored) {
- ssize_t actual = TEMP_FAILURE_RETRY(write(fd, ptr, uncompLen));
- if (actual < 0) {
- ALOGE("Write failed: %s\n", strerror(errno));
- goto unmap;
- } else if ((size_t) actual != uncompLen) {
- ALOGE("Partial write during uncompress (" ZD " of " ZD ")\n",
- (ZD_TYPE) actual, (ZD_TYPE) uncompLen);
- goto unmap;
- } else {
- ALOGI("+++ successful write\n");
- }
- } else {
- if (!inflateBuffer(fd, ptr, uncompLen, compLen)) {
- goto unmap;
- }
- }
-
- result = true;
-
-unmap:
- file->release();
-bail:
- return result;
-}
-
-/*
- * Uncompress "deflate" data from one buffer to another.
- */
-/*static*/ bool ZipFileRO::inflateBuffer(void* outBuf, const void* inBuf,
- size_t uncompLen, size_t compLen)
-{
- bool result = false;
- z_stream zstream;
- int zerr;
-
- /*
- * Initialize the zlib stream struct.
- */
- memset(&zstream, 0, sizeof(zstream));
- zstream.zalloc = Z_NULL;
- zstream.zfree = Z_NULL;
- zstream.opaque = Z_NULL;
- zstream.next_in = (Bytef*)inBuf;
- zstream.avail_in = compLen;
- zstream.next_out = (Bytef*) outBuf;
- zstream.avail_out = uncompLen;
- zstream.data_type = Z_UNKNOWN;
-
- /*
- * Use the undocumented "negative window bits" feature to tell zlib
- * that there's no zlib header waiting for it.
- */
- zerr = inflateInit2(&zstream, -MAX_WBITS);
- if (zerr != Z_OK) {
- if (zerr == Z_VERSION_ERROR) {
- ALOGE("Installed zlib is not compatible with linked version (%s)\n",
- ZLIB_VERSION);
- } else {
- ALOGE("Call to inflateInit2 failed (zerr=%d)\n", zerr);
- }
- goto bail;
- }
-
- /*
- * Expand data.
- */
- zerr = inflate(&zstream, Z_FINISH);
- if (zerr != Z_STREAM_END) {
- ALOGW("Zip inflate failed, zerr=%d (nIn=%p aIn=%u nOut=%p aOut=%u)\n",
- zerr, zstream.next_in, zstream.avail_in,
- zstream.next_out, zstream.avail_out);
- goto z_bail;
- }
-
- /* paranoia */
- if (zstream.total_out != uncompLen) {
- ALOGW("Size mismatch on inflated file (%ld vs " ZD ")\n",
- zstream.total_out, (ZD_TYPE) uncompLen);
- goto z_bail;
- }
-
- result = true;
-
-z_bail:
- inflateEnd(&zstream); /* free up any allocated structures */
-
-bail:
- return result;
-}
-
-/*
- * Uncompress "deflate" data from one buffer to an open file descriptor.
- */
-/*static*/ bool ZipFileRO::inflateBuffer(int fd, const void* inBuf,
- size_t uncompLen, size_t compLen)
-{
- bool result = false;
- const size_t kWriteBufSize = 32768;
- unsigned char writeBuf[kWriteBufSize];
- z_stream zstream;
- int zerr;
-
- /*
- * Initialize the zlib stream struct.
- */
- memset(&zstream, 0, sizeof(zstream));
- zstream.zalloc = Z_NULL;
- zstream.zfree = Z_NULL;
- zstream.opaque = Z_NULL;
- zstream.next_in = (Bytef*)inBuf;
- zstream.avail_in = compLen;
- zstream.next_out = (Bytef*) writeBuf;
- zstream.avail_out = sizeof(writeBuf);
- zstream.data_type = Z_UNKNOWN;
-
- /*
- * Use the undocumented "negative window bits" feature to tell zlib
- * that there's no zlib header waiting for it.
- */
- zerr = inflateInit2(&zstream, -MAX_WBITS);
- if (zerr != Z_OK) {
- if (zerr == Z_VERSION_ERROR) {
- ALOGE("Installed zlib is not compatible with linked version (%s)\n",
- ZLIB_VERSION);
- } else {
- ALOGE("Call to inflateInit2 failed (zerr=%d)\n", zerr);
- }
- goto bail;
- }
-
- /*
- * Loop while we have more to do.
- */
- do {
- /*
- * Expand data.
- */
- zerr = inflate(&zstream, Z_NO_FLUSH);
- if (zerr != Z_OK && zerr != Z_STREAM_END) {
- ALOGW("zlib inflate: zerr=%d (nIn=%p aIn=%u nOut=%p aOut=%u)\n",
- zerr, zstream.next_in, zstream.avail_in,
- zstream.next_out, zstream.avail_out);
- goto z_bail;
- }
-
- /* write when we're full or when we're done */
- if (zstream.avail_out == 0 ||
- (zerr == Z_STREAM_END && zstream.avail_out != sizeof(writeBuf)))
- {
- long writeSize = zstream.next_out - writeBuf;
- int cc = TEMP_FAILURE_RETRY(write(fd, writeBuf, writeSize));
- if (cc < 0) {
- ALOGW("write failed in inflate: %s", strerror(errno));
- goto z_bail;
- } else if (cc != (int) writeSize) {
- ALOGW("write failed in inflate (%d vs %ld)", cc, writeSize);
- goto z_bail;
- }
-
- zstream.next_out = writeBuf;
- zstream.avail_out = sizeof(writeBuf);
- }
- } while (zerr == Z_OK);
-
- assert(zerr == Z_STREAM_END); /* other errors should've been caught */
-
- /* paranoia */
- if (zstream.total_out != uncompLen) {
- ALOGW("Size mismatch on inflated file (%ld vs " ZD ")\n",
- zstream.total_out, (ZD_TYPE) uncompLen);
- goto z_bail;
- }
-
- result = true;
-
-z_bail:
- inflateEnd(&zstream); /* free up any allocated structures */
-
-bail:
- return result;
-}
diff --git a/libs/androidfw/ZipUtils.cpp b/libs/androidfw/ZipUtils.cpp
deleted file mode 100644
index 997eb7d..0000000
--- a/libs/androidfw/ZipUtils.cpp
+++ /dev/null
@@ -1,345 +0,0 @@
-/*
- * 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.
- */
-
-//
-// Misc zip/gzip utility functions.
-//
-
-#define LOG_TAG "ziputil"
-
-#include <androidfw/ZipUtils.h>
-#include <androidfw/ZipFileRO.h>
-#include <utils/Log.h>
-#include <utils/Compat.h>
-
-#include <stdlib.h>
-#include <string.h>
-#include <assert.h>
-
-#include <zlib.h>
-
-using namespace android;
-
-/*
- * Utility function that expands zip/gzip "deflate" compressed data
- * into a buffer.
- *
- * "fd" is an open file positioned at the start of the "deflate" data
- * "buf" must hold at least "uncompressedLen" bytes.
- */
-/*static*/ bool ZipUtils::inflateToBuffer(int fd, void* buf,
- long uncompressedLen, long compressedLen)
-{
- bool result = false;
- const unsigned long kReadBufSize = 32768;
- unsigned char* readBuf = NULL;
- z_stream zstream;
- int zerr;
- unsigned long compRemaining;
-
- assert(uncompressedLen >= 0);
- assert(compressedLen >= 0);
-
- readBuf = new unsigned char[kReadBufSize];
- if (readBuf == NULL)
- goto bail;
- compRemaining = compressedLen;
-
- /*
- * Initialize the zlib stream.
- */
- memset(&zstream, 0, sizeof(zstream));
- zstream.zalloc = Z_NULL;
- zstream.zfree = Z_NULL;
- zstream.opaque = Z_NULL;
- zstream.next_in = NULL;
- zstream.avail_in = 0;
- zstream.next_out = (Bytef*) buf;
- zstream.avail_out = uncompressedLen;
- zstream.data_type = Z_UNKNOWN;
-
- /*
- * Use the undocumented "negative window bits" feature to tell zlib
- * that there's no zlib header waiting for it.
- */
- zerr = inflateInit2(&zstream, -MAX_WBITS);
- if (zerr != Z_OK) {
- if (zerr == Z_VERSION_ERROR) {
- ALOGE("Installed zlib is not compatible with linked version (%s)\n",
- ZLIB_VERSION);
- } else {
- ALOGE("Call to inflateInit2 failed (zerr=%d)\n", zerr);
- }
- goto bail;
- }
-
- /*
- * Loop while we have data.
- */
- do {
- unsigned long getSize;
-
- /* read as much as we can */
- if (zstream.avail_in == 0) {
- getSize = (compRemaining > kReadBufSize) ?
- kReadBufSize : compRemaining;
- ALOGV("+++ reading %ld bytes (%ld left)\n",
- getSize, compRemaining);
-
- int cc = TEMP_FAILURE_RETRY(read(fd, readBuf, getSize));
- if (cc < 0) {
- ALOGW("inflate read failed: %s", strerror(errno));
- } else if (cc != (int) getSize) {
- ALOGW("inflate read failed (%d vs %ld)", cc, getSize);
- goto z_bail;
- }
-
- compRemaining -= getSize;
-
- zstream.next_in = readBuf;
- zstream.avail_in = getSize;
- }
-
- /* uncompress the data */
- zerr = inflate(&zstream, Z_NO_FLUSH);
- if (zerr != Z_OK && zerr != Z_STREAM_END) {
- ALOGD("zlib inflate call failed (zerr=%d)\n", zerr);
- goto z_bail;
- }
-
- /* output buffer holds all, so no need to write the output */
- } while (zerr == Z_OK);
-
- assert(zerr == Z_STREAM_END); /* other errors should've been caught */
-
- if ((long) zstream.total_out != uncompressedLen) {
- ALOGW("Size mismatch on inflated file (%ld vs %ld)\n",
- zstream.total_out, uncompressedLen);
- goto z_bail;
- }
-
- // success!
- result = true;
-
-z_bail:
- inflateEnd(&zstream); /* free up any allocated structures */
-
-bail:
- delete[] readBuf;
- return result;
-}
-
-/*
- * Utility function that expands zip/gzip "deflate" compressed data
- * into a buffer.
- *
- * (This is a clone of the previous function, but it takes a FILE* instead
- * of an fd. We could pass fileno(fd) to the above, but we can run into
- * trouble when "fp" has a different notion of what fd's file position is.)
- *
- * "fp" is an open file positioned at the start of the "deflate" data
- * "buf" must hold at least "uncompressedLen" bytes.
- */
-/*static*/ bool ZipUtils::inflateToBuffer(FILE* fp, void* buf,
- long uncompressedLen, long compressedLen)
-{
- bool result = false;
- const unsigned long kReadBufSize = 32768;
- unsigned char* readBuf = NULL;
- z_stream zstream;
- int zerr;
- unsigned long compRemaining;
-
- assert(uncompressedLen >= 0);
- assert(compressedLen >= 0);
-
- readBuf = new unsigned char[kReadBufSize];
- if (readBuf == NULL)
- goto bail;
- compRemaining = compressedLen;
-
- /*
- * Initialize the zlib stream.
- */
- memset(&zstream, 0, sizeof(zstream));
- zstream.zalloc = Z_NULL;
- zstream.zfree = Z_NULL;
- zstream.opaque = Z_NULL;
- zstream.next_in = NULL;
- zstream.avail_in = 0;
- zstream.next_out = (Bytef*) buf;
- zstream.avail_out = uncompressedLen;
- zstream.data_type = Z_UNKNOWN;
-
- /*
- * Use the undocumented "negative window bits" feature to tell zlib
- * that there's no zlib header waiting for it.
- */
- zerr = inflateInit2(&zstream, -MAX_WBITS);
- if (zerr != Z_OK) {
- if (zerr == Z_VERSION_ERROR) {
- ALOGE("Installed zlib is not compatible with linked version (%s)\n",
- ZLIB_VERSION);
- } else {
- ALOGE("Call to inflateInit2 failed (zerr=%d)\n", zerr);
- }
- goto bail;
- }
-
- /*
- * Loop while we have data.
- */
- do {
- unsigned long getSize;
-
- /* read as much as we can */
- if (zstream.avail_in == 0) {
- getSize = (compRemaining > kReadBufSize) ?
- kReadBufSize : compRemaining;
- ALOGV("+++ reading %ld bytes (%ld left)\n",
- getSize, compRemaining);
-
- int cc = fread(readBuf, 1, getSize, fp);
- if (cc != (int) getSize) {
- ALOGD("inflate read failed (%d vs %ld)\n",
- cc, getSize);
- goto z_bail;
- }
-
- compRemaining -= getSize;
-
- zstream.next_in = readBuf;
- zstream.avail_in = getSize;
- }
-
- /* uncompress the data */
- zerr = inflate(&zstream, Z_NO_FLUSH);
- if (zerr != Z_OK && zerr != Z_STREAM_END) {
- ALOGD("zlib inflate call failed (zerr=%d)\n", zerr);
- goto z_bail;
- }
-
- /* output buffer holds all, so no need to write the output */
- } while (zerr == Z_OK);
-
- assert(zerr == Z_STREAM_END); /* other errors should've been caught */
-
- if ((long) zstream.total_out != uncompressedLen) {
- ALOGW("Size mismatch on inflated file (%ld vs %ld)\n",
- zstream.total_out, uncompressedLen);
- goto z_bail;
- }
-
- // success!
- result = true;
-
-z_bail:
- inflateEnd(&zstream); /* free up any allocated structures */
-
-bail:
- delete[] readBuf;
- return result;
-}
-
-/*
- * Look at the contents of a gzip archive. We want to know where the
- * data starts, and how long it will be after it is uncompressed.
- *
- * We expect to find the CRC and length as the last 8 bytes on the file.
- * This is a pretty reasonable thing to expect for locally-compressed
- * files, but there's a small chance that some extra padding got thrown
- * on (the man page talks about compressed data written to tape). We
- * don't currently deal with that here. If "gzip -l" whines, we're going
- * to fail too.
- *
- * On exit, "fp" is pointing at the start of the compressed data.
- */
-/*static*/ bool ZipUtils::examineGzip(FILE* fp, int* pCompressionMethod,
- long* pUncompressedLen, long* pCompressedLen, unsigned long* pCRC32)
-{
- enum { // flags
- FTEXT = 0x01,
- FHCRC = 0x02,
- FEXTRA = 0x04,
- FNAME = 0x08,
- FCOMMENT = 0x10,
- };
- int ic;
- int method, flags;
- int i;
-
- ic = getc(fp);
- if (ic != 0x1f || getc(fp) != 0x8b)
- return false; // not gzip
- method = getc(fp);
- flags = getc(fp);
-
- /* quick sanity checks */
- if (method == EOF || flags == EOF)
- return false;
- if (method != ZipFileRO::kCompressDeflated)
- return false;
-
- /* skip over 4 bytes of mod time, 1 byte XFL, 1 byte OS */
- for (i = 0; i < 6; i++)
- (void) getc(fp);
- /* consume "extra" field, if present */
- if ((flags & FEXTRA) != 0) {
- int len;
-
- len = getc(fp);
- len |= getc(fp) << 8;
- while (len-- && getc(fp) != EOF)
- ;
- }
- /* consume filename, if present */
- if ((flags & FNAME) != 0) {
- do {
- ic = getc(fp);
- } while (ic != 0 && ic != EOF);
- }
- /* consume comment, if present */
- if ((flags & FCOMMENT) != 0) {
- do {
- ic = getc(fp);
- } while (ic != 0 && ic != EOF);
- }
- /* consume 16-bit header CRC, if present */
- if ((flags & FHCRC) != 0) {
- (void) getc(fp);
- (void) getc(fp);
- }
-
- if (feof(fp) || ferror(fp))
- return false;
-
- /* seek to the end; CRC and length are in the last 8 bytes */
- long curPosn = ftell(fp);
- unsigned char buf[8];
- fseek(fp, -8, SEEK_END);
- *pCompressedLen = ftell(fp) - curPosn;
-
- if (fread(buf, 1, 8, fp) != 8)
- return false;
- /* seek back to start of compressed data */
- fseek(fp, curPosn, SEEK_SET);
-
- *pCompressionMethod = method;
- *pCRC32 = ZipFileRO::get4LE(&buf[0]);
- *pUncompressedLen = ZipFileRO::get4LE(&buf[4]);
-
- return true;
-}
diff --git a/libs/androidfw/misc.cpp b/libs/androidfw/misc.cpp
deleted file mode 100644
index 29686ef..0000000
--- a/libs/androidfw/misc.cpp
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright (C) 2005 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.
- */
-
-#define LOG_TAG "misc"
-
-//
-// Miscellaneous utility functions.
-//
-#include <androidfw/misc.h>
-
-#include <sys/stat.h>
-#include <string.h>
-#include <errno.h>
-#include <stdio.h>
-
-using namespace android;
-
-namespace android {
-
-/*
- * Get a file's type.
- */
-FileType getFileType(const char* fileName)
-{
- struct stat sb;
-
- if (stat(fileName, &sb) < 0) {
- if (errno == ENOENT || errno == ENOTDIR)
- return kFileTypeNonexistent;
- else {
- fprintf(stderr, "getFileType got errno=%d on '%s'\n",
- errno, fileName);
- return kFileTypeUnknown;
- }
- } else {
- if (S_ISREG(sb.st_mode))
- return kFileTypeRegular;
- else if (S_ISDIR(sb.st_mode))
- return kFileTypeDirectory;
- else if (S_ISCHR(sb.st_mode))
- return kFileTypeCharDev;
- else if (S_ISBLK(sb.st_mode))
- return kFileTypeBlockDev;
- else if (S_ISFIFO(sb.st_mode))
- return kFileTypeFifo;
-#ifdef HAVE_SYMLINKS
- else if (S_ISLNK(sb.st_mode))
- return kFileTypeSymlink;
- else if (S_ISSOCK(sb.st_mode))
- return kFileTypeSocket;
-#endif
- else
- return kFileTypeUnknown;
- }
-}
-
-/*
- * Get a file's modification date.
- */
-time_t getFileModDate(const char* fileName)
-{
- struct stat sb;
-
- if (stat(fileName, &sb) < 0)
- return (time_t) -1;
-
- return sb.st_mtime;
-}
-
-}; // namespace android
diff --git a/libs/androidfw/tests/Android.mk b/libs/androidfw/tests/Android.mk
deleted file mode 100644
index 0522212..0000000
--- a/libs/androidfw/tests/Android.mk
+++ /dev/null
@@ -1,31 +0,0 @@
-# Build the unit tests.
-LOCAL_PATH:= $(call my-dir)
-include $(CLEAR_VARS)
-
-# Build the unit tests.
-test_src_files := \
- ObbFile_test.cpp \
- ZipFileRO_test.cpp
-
-shared_libraries := \
- libandroidfw \
- libcutils \
- libutils \
- libui \
- libstlport
-
-static_libraries := \
- libgtest \
- libgtest_main
-
-$(foreach file,$(test_src_files), \
- $(eval include $(CLEAR_VARS)) \
- $(eval LOCAL_SHARED_LIBRARIES := $(shared_libraries)) \
- $(eval LOCAL_STATIC_LIBRARIES := $(static_libraries)) \
- $(eval LOCAL_SRC_FILES := $(file)) \
- $(eval LOCAL_MODULE := $(notdir $(file:%.cpp=%))) \
- $(eval include $(BUILD_NATIVE_TEST)) \
-)
-
-# Build the manual test programs.
-include $(call all-makefiles-under, $(LOCAL_PATH))
diff --git a/libs/androidfw/tests/ObbFile_test.cpp b/libs/androidfw/tests/ObbFile_test.cpp
deleted file mode 100644
index 2c9f650..0000000
--- a/libs/androidfw/tests/ObbFile_test.cpp
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#define LOG_TAG "ObbFile_test"
-#include <androidfw/ObbFile.h>
-#include <utils/Log.h>
-#include <utils/RefBase.h>
-#include <utils/String8.h>
-
-#include <gtest/gtest.h>
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <string.h>
-
-namespace android {
-
-#define TEST_FILENAME "/test.obb"
-
-class ObbFileTest : public testing::Test {
-protected:
- sp<ObbFile> mObbFile;
- char* mExternalStorage;
- char* mFileName;
-
- virtual void SetUp() {
- mObbFile = new ObbFile();
- mExternalStorage = getenv("EXTERNAL_STORAGE");
-
- const int totalLen = strlen(mExternalStorage) + strlen(TEST_FILENAME) + 1;
- mFileName = new char[totalLen];
- snprintf(mFileName, totalLen, "%s%s", mExternalStorage, TEST_FILENAME);
-
- int fd = ::open(mFileName, O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR);
- if (fd < 0) {
- FAIL() << "Couldn't create " << mFileName << " for tests";
- }
- }
-
- virtual void TearDown() {
- }
-};
-
-TEST_F(ObbFileTest, ReadFailure) {
- EXPECT_FALSE(mObbFile->readFrom(-1))
- << "No failure on invalid file descriptor";
-}
-
-TEST_F(ObbFileTest, WriteThenRead) {
- const char* packageName = "com.example.obbfile";
- const int32_t versionNum = 1;
-
- mObbFile->setPackageName(String8(packageName));
- mObbFile->setVersion(versionNum);
-#define SALT_SIZE 8
- unsigned char salt[SALT_SIZE] = {0x01, 0x10, 0x55, 0xAA, 0xFF, 0x00, 0x5A, 0xA5};
- EXPECT_TRUE(mObbFile->setSalt(salt, SALT_SIZE))
- << "Salt should be successfully set";
-
- EXPECT_TRUE(mObbFile->writeTo(mFileName))
- << "couldn't write to fake .obb file";
-
- mObbFile = new ObbFile();
-
- EXPECT_TRUE(mObbFile->readFrom(mFileName))
- << "couldn't read from fake .obb file";
-
- EXPECT_EQ(versionNum, mObbFile->getVersion())
- << "version didn't come out the same as it went in";
- const char* currentPackageName = mObbFile->getPackageName().string();
- EXPECT_STREQ(packageName, currentPackageName)
- << "package name didn't come out the same as it went in";
-
- size_t saltLen;
- const unsigned char* newSalt = mObbFile->getSalt(&saltLen);
-
- EXPECT_EQ(sizeof(salt), saltLen)
- << "salt sizes were not the same";
-
- for (int i = 0; i < sizeof(salt); i++) {
- EXPECT_EQ(salt[i], newSalt[i])
- << "salt character " << i << " should be equal";
- }
- EXPECT_TRUE(memcmp(newSalt, salt, sizeof(salt)) == 0)
- << "salts should be the same";
-}
-
-}
diff --git a/libs/androidfw/tests/ZipFileRO_test.cpp b/libs/androidfw/tests/ZipFileRO_test.cpp
deleted file mode 100644
index cb9c721..0000000
--- a/libs/androidfw/tests/ZipFileRO_test.cpp
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright (C) 2011 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.
- */
-
-#define LOG_TAG "ZipFileRO_test"
-#include <utils/Log.h>
-#include <androidfw/ZipFileRO.h>
-
-#include <gtest/gtest.h>
-
-#include <fcntl.h>
-#include <string.h>
-
-namespace android {
-
-class ZipFileROTest : public testing::Test {
-protected:
- virtual void SetUp() {
- }
-
- virtual void TearDown() {
- }
-};
-
-TEST_F(ZipFileROTest, ZipTimeConvertSuccess) {
- struct tm t;
-
- // 2011-06-29 14:40:40
- long when = 0x3EDD7514;
-
- ZipFileRO::zipTimeToTimespec(when, &t);
-
- EXPECT_EQ(2011, t.tm_year + 1900)
- << "Year was improperly converted.";
-
- EXPECT_EQ(6, t.tm_mon)
- << "Month was improperly converted.";
-
- EXPECT_EQ(29, t.tm_mday)
- << "Day was improperly converted.";
-
- EXPECT_EQ(14, t.tm_hour)
- << "Hour was improperly converted.";
-
- EXPECT_EQ(40, t.tm_min)
- << "Minute was improperly converted.";
-
- EXPECT_EQ(40, t.tm_sec)
- << "Second was improperly converted.";
-}
-
-}
diff --git a/libs/hwui/Android.mk b/libs/hwui/Android.mk
index 411c133..ce8364e 100644
--- a/libs/hwui/Android.mk
+++ b/libs/hwui/Android.mk
@@ -58,6 +58,7 @@ ifeq ($(USE_OPENGL_RENDERER),true)
external/skia/include/utils
LOCAL_CFLAGS += -DUSE_OPENGL_RENDERER -DEGL_EGLEXT_PROTOTYPES -DGL_GLEXT_PROTOTYPES
+ LOCAL_CFLAGS += -Wno-unused-parameter
LOCAL_MODULE_CLASS := SHARED_LIBRARIES
LOCAL_SHARED_LIBRARIES := liblog libcutils libutils libEGL libGLESv2 libskia libui
LOCAL_MODULE := libhwui
diff --git a/libs/hwui/Caches.h b/libs/hwui/Caches.h
index 282aee9..f8f2284 100644
--- a/libs/hwui/Caches.h
+++ b/libs/hwui/Caches.h
@@ -62,7 +62,7 @@ namespace uirenderer {
static const uint32_t gMaxNumberOfQuads = 2048;
// Generates simple and textured vertices
-#define FV(x, y, u, v) { { x, y }, { u, v } }
+#define FV(x, y, u, v) { x, y, u, v }
// This array is never used directly but used as a memcpy source in the
// OpenGLRenderer constructor
diff --git a/libs/hwui/DisplayListOp.h b/libs/hwui/DisplayListOp.h
index 326805a..5816872 100644
--- a/libs/hwui/DisplayListOp.h
+++ b/libs/hwui/DisplayListOp.h
@@ -1028,8 +1028,8 @@ public:
TextureVertex* opVertices = opMesh->vertices;
for (uint32_t j = 0; j < vertexCount; j++, opVertices++) {
TextureVertex::set(vertex++,
- opVertices->position[0] + tx, opVertices->position[1] + ty,
- opVertices->texture[0], opVertices->texture[1]);
+ opVertices->x + tx, opVertices->y + ty,
+ opVertices->u, opVertices->v);
}
// Dirty the current layer if possible. When the 9-patch does not
diff --git a/libs/hwui/FontRenderer.cpp b/libs/hwui/FontRenderer.cpp
index 00e7870..67835a4 100644
--- a/libs/hwui/FontRenderer.cpp
+++ b/libs/hwui/FontRenderer.cpp
@@ -514,8 +514,8 @@ void FontRenderer::issueDrawCommand(Vector<CacheTexture*>& cacheTextures) {
texture->setLinearFiltering(mLinearFiltering, false);
TextureVertex* mesh = texture->mesh();
- caches.bindPositionVertexPointer(force, &mesh[0].position[0]);
- caches.bindTexCoordsVertexPointer(force, &mesh[0].texture[0]);
+ caches.bindPositionVertexPointer(force, &mesh[0].x);
+ caches.bindTexCoordsVertexPointer(force, &mesh[0].u);
force = false;
glDrawElements(GL_TRIANGLES, texture->meshElementCount(),
diff --git a/libs/hwui/GradientCache.cpp b/libs/hwui/GradientCache.cpp
index 0916942..ffd1e8c 100644
--- a/libs/hwui/GradientCache.cpp
+++ b/libs/hwui/GradientCache.cpp
@@ -115,7 +115,7 @@ void GradientCache::setMaxSize(uint32_t maxSize) {
// Callbacks
///////////////////////////////////////////////////////////////////////////////
-void GradientCache::operator()(GradientCacheEntry& shader, Texture*& texture) {
+void GradientCache::operator()(GradientCacheEntry&, Texture*& texture) {
if (texture) {
const uint32_t size = texture->width * texture->height * bytesPerPixel();
mSize -= size;
@@ -185,7 +185,7 @@ Texture* GradientCache::addLinearGradient(GradientCacheEntry& gradient,
mCache.removeOldest();
}
- generateTexture(colors, positions, count, texture);
+ generateTexture(colors, positions, texture);
mSize += size;
mCache.put(gradient, texture);
@@ -238,8 +238,7 @@ void GradientCache::mixFloats(GradientColor& start, GradientColor& end, float am
dst += 4 * sizeof(float);
}
-void GradientCache::generateTexture(uint32_t* colors, float* positions,
- int count, Texture* texture) {
+void GradientCache::generateTexture(uint32_t* colors, float* positions, Texture* texture) {
const uint32_t width = texture->width;
const GLsizei rowBytes = width * bytesPerPixel();
uint8_t pixels[rowBytes * texture->height];
diff --git a/libs/hwui/GradientCache.h b/libs/hwui/GradientCache.h
index 43934d9..6a783b1 100644
--- a/libs/hwui/GradientCache.h
+++ b/libs/hwui/GradientCache.h
@@ -151,7 +151,7 @@ private:
Texture* addLinearGradient(GradientCacheEntry& gradient,
uint32_t* colors, float* positions, int count);
- void generateTexture(uint32_t* colors, float* positions, int count, Texture* texture);
+ void generateTexture(uint32_t* colors, float* positions, Texture* texture);
struct GradientInfo {
uint32_t width;
diff --git a/libs/hwui/OpenGLRenderer.cpp b/libs/hwui/OpenGLRenderer.cpp
index 35fc804..29030d2 100644
--- a/libs/hwui/OpenGLRenderer.cpp
+++ b/libs/hwui/OpenGLRenderer.cpp
@@ -779,11 +779,10 @@ bool OpenGLRenderer::restoreSnapshot() {
int OpenGLRenderer::saveLayer(float left, float top, float right, float bottom,
int alpha, SkXfermode::Mode mode, int flags) {
- const GLuint previousFbo = mSnapshot->fbo;
const int count = saveSnapshot(flags);
if (!mSnapshot->isIgnored()) {
- createLayer(left, top, right, bottom, alpha, mode, flags, previousFbo);
+ createLayer(left, top, right, bottom, alpha, mode, flags);
}
return count;
@@ -835,7 +834,6 @@ void OpenGLRenderer::updateSnapshotIgnoreForLayer(const Rect& bounds, const Rect
int OpenGLRenderer::saveLayerDeferred(float left, float top, float right, float bottom,
int alpha, SkXfermode::Mode mode, int flags) {
- const GLuint previousFbo = mSnapshot->fbo;
const int count = saveSnapshot(flags);
if (!mSnapshot->isIgnored() && (flags & SkCanvas::kClipToLayer_SaveFlag)) {
@@ -911,7 +909,7 @@ int OpenGLRenderer::saveLayerDeferred(float left, float top, float right, float
* something actually gets drawn are the layers regions cleared.
*/
bool OpenGLRenderer::createLayer(float left, float top, float right, float bottom,
- int alpha, SkXfermode::Mode mode, int flags, GLuint previousFbo) {
+ int alpha, SkXfermode::Mode mode, int flags) {
LAYER_LOGD("Requesting layer %.2fx%.2f", right - left, bottom - top);
LAYER_LOGD("Layer cache size = %d", mCaches.layerCache.getSize());
@@ -948,7 +946,7 @@ bool OpenGLRenderer::createLayer(float left, float top, float right, float botto
startMark("SaveLayer");
if (fboLayer) {
- return createFboLayer(layer, bounds, clip, previousFbo);
+ return createFboLayer(layer, bounds, clip);
} else {
// Copy the framebuffer into the layer
layer->bindTexture();
@@ -974,7 +972,7 @@ bool OpenGLRenderer::createLayer(float left, float top, float right, float botto
return true;
}
-bool OpenGLRenderer::createFboLayer(Layer* layer, Rect& bounds, Rect& clip, GLuint previousFbo) {
+bool OpenGLRenderer::createFboLayer(Layer* layer, Rect& bounds, Rect& clip) {
layer->clipRect.set(clip);
layer->setFbo(mCaches.fboCache.get());
@@ -1122,7 +1120,7 @@ void OpenGLRenderer::drawTextureLayer(Layer* layer, const Rect& rect) {
setupDrawModelView(rect.left, rect.top, rect.right, rect.bottom);
}
setupDrawTextureTransformUniforms(layer->getTexTransform());
- setupDrawMesh(&mMeshVertices[0].position[0], &mMeshVertices[0].texture[0]);
+ setupDrawMesh(&mMeshVertices[0].x, &mMeshVertices[0].u);
glDrawArrays(GL_TRIANGLE_STRIP, 0, gMeshCount);
}
@@ -1155,7 +1153,7 @@ void OpenGLRenderer::composeLayerRect(Layer* layer, const Rect& rect, bool swap)
bool blend = layer->isBlend() || alpha < 1.0f;
drawTextureMesh(x, y, x + rect.getWidth(), y + rect.getHeight(),
layer->getTexture(), alpha, layer->getMode(), blend,
- &mMeshVertices[0].position[0], &mMeshVertices[0].texture[0],
+ &mMeshVertices[0].x, &mMeshVertices[0].u,
GL_TRIANGLE_STRIP, gMeshCount, swap, swap || simpleTransform);
resetDrawTextureTexCoords(0.0f, 0.0f, 1.0f, 1.0f);
@@ -1236,7 +1234,7 @@ void OpenGLRenderer::composeLayerRegion(Layer* layer, const Rect& rect) {
layer->setFilter(GL_LINEAR);
setupDrawModelViewTranslate(rect.left, rect.top, rect.right, rect.bottom);
}
- setupDrawMeshIndices(&mesh[0].position[0], &mesh[0].texture[0]);
+ setupDrawMeshIndices(&mesh[0].x, &mesh[0].u);
for (size_t i = 0; i < count; i++) {
const android::Rect* r = &rects[i];
@@ -1268,15 +1266,15 @@ void OpenGLRenderer::composeLayerRegion(Layer* layer, const Rect& rect) {
}
#if DEBUG_LAYERS_AS_REGIONS
- drawRegionRects(layer->region);
+ drawRegionRectsDebug(layer->region);
#endif
layer->region.clear();
}
}
-void OpenGLRenderer::drawRegionRects(const Region& region) {
#if DEBUG_LAYERS_AS_REGIONS
+void OpenGLRenderer::drawRegionRectsDebug(const Region& region) {
size_t count;
const android::Rect* rects = region.getArray(&count);
@@ -1298,8 +1296,8 @@ void OpenGLRenderer::drawRegionRects(const Region& region) {
drawColorRect(r.left, r.top, r.right, r.bottom, colors[offset + (i & 0x1)],
SkXfermode::kSrcOver_Mode);
}
-#endif
}
+#endif
void OpenGLRenderer::drawRegionRects(const SkRegion& region, int color,
SkXfermode::Mode mode, bool dirty) {
@@ -1350,7 +1348,7 @@ void OpenGLRenderer::drawIndexedQuads(Vertex* mesh, GLsizei quadsCount) {
while (elementsCount > 0) {
GLsizei drawCount = min(elementsCount, (GLsizei) gMaxNumberOfQuads * 6);
- setupDrawIndexedVertices(&mesh[0].position[0]);
+ setupDrawIndexedVertices(&mesh[0].x);
glDrawElements(GL_TRIANGLES, drawCount, GL_UNSIGNED_SHORT, NULL);
elementsCount -= drawCount;
@@ -1792,7 +1790,7 @@ void OpenGLRenderer::setupDrawColor(int color, int alpha) {
mColorG = mColorA * ((color >> 8) & 0xFF) / 255.0f;
mColorB = mColorA * ((color ) & 0xFF) / 255.0f;
mColorSet = true;
- mSetShaderColor = mDescription.setColor(mColorR, mColorG, mColorB, mColorA);
+ mSetShaderColor = mDescription.setColorModulate(mColorA);
}
void OpenGLRenderer::setupDrawAlpha8Color(int color, int alpha) {
@@ -1801,7 +1799,7 @@ void OpenGLRenderer::setupDrawAlpha8Color(int color, int alpha) {
mColorG = mColorA * ((color >> 8) & 0xFF) / 255.0f;
mColorB = mColorA * ((color ) & 0xFF) / 255.0f;
mColorSet = true;
- mSetShaderColor = mDescription.setAlpha8Color(mColorR, mColorG, mColorB, mColorA);
+ mSetShaderColor = mDescription.setAlpha8ColorModulate(mColorR, mColorG, mColorB, mColorA);
}
void OpenGLRenderer::setupDrawTextGamma(const SkPaint* paint) {
@@ -1814,7 +1812,7 @@ void OpenGLRenderer::setupDrawColor(float r, float g, float b, float a) {
mColorG = g;
mColorB = b;
mColorSet = true;
- mSetShaderColor = mDescription.setColor(r, g, b, a);
+ mSetShaderColor = mDescription.setColorModulate(a);
}
void OpenGLRenderer::setupDrawShader() {
@@ -2116,12 +2114,12 @@ status_t OpenGLRenderer::drawBitmaps(SkBitmap* bitmap, AssetAtlas::Entry* entry,
int color = paint != NULL ? paint->getColor() : 0;
drawAlpha8TextureMesh(x, y, x + bounds.getWidth(), y + bounds.getHeight(),
texture->id, paint != NULL, color, alpha, mode,
- &vertices[0].position[0], &vertices[0].texture[0],
+ &vertices[0].x, &vertices[0].u,
GL_TRIANGLES, bitmapCount * 6, true, true, false);
} else {
drawTextureMesh(x, y, x + bounds.getWidth(), y + bounds.getHeight(),
texture->id, alpha / 255.0f, mode, texture->blend,
- &vertices[0].position[0], &vertices[0].texture[0],
+ &vertices[0].x, &vertices[0].u,
GL_TRIANGLES, bitmapCount * 6, false, true, 0, true, false);
}
@@ -2303,7 +2301,7 @@ status_t OpenGLRenderer::drawBitmapMesh(SkBitmap* bitmap, int meshWidth, int mes
setupDrawTexture(texture->id);
setupDrawPureColorUniforms();
setupDrawColorFilterUniforms();
- setupDrawMesh(&mesh[0].position[0], &mesh[0].texture[0], &mesh[0].color[0]);
+ setupDrawMesh(&mesh[0].x, &mesh[0].u, &mesh[0].r);
glDrawArrays(GL_TRIANGLES, 0, count);
@@ -2391,12 +2389,12 @@ status_t OpenGLRenderer::drawBitmap(SkBitmap* bitmap,
int color = paint ? paint->getColor() : 0;
drawAlpha8TextureMesh(dstLeft, dstTop, dstRight, dstBottom,
texture->id, paint != NULL, color, alpha, mode,
- &mMeshVertices[0].position[0], &mMeshVertices[0].texture[0],
+ &mMeshVertices[0].x, &mMeshVertices[0].u,
GL_TRIANGLE_STRIP, gMeshCount, ignoreTransform);
} else {
drawTextureMesh(dstLeft, dstTop, dstRight, dstBottom,
texture->id, alpha / 255.0f, mode, texture->blend,
- &mMeshVertices[0].position[0], &mMeshVertices[0].texture[0],
+ &mMeshVertices[0].x, &mMeshVertices[0].u,
GL_TRIANGLE_STRIP, gMeshCount, false, ignoreTransform);
}
@@ -2501,7 +2499,7 @@ status_t OpenGLRenderer::drawPatches(SkBitmap* bitmap, AssetAtlas::Entry* entry,
getAlphaAndMode(paint, &alpha, &mode);
drawIndexedTextureMesh(0.0f, 0.0f, 1.0f, 1.0f, texture->id, alpha / 255.0f,
- mode, texture->blend, &vertices[0].position[0], &vertices[0].texture[0],
+ mode, texture->blend, &vertices[0].x, &vertices[0].u,
GL_TRIANGLES, indexCount, false, true, 0, true, false);
return DrawGlInfo::kStatusDrew;
@@ -2998,7 +2996,7 @@ status_t OpenGLRenderer::drawText(const char* text, int bytesCount, int count, f
dirtyLayerUnchecked(layerBounds, getRegion());
}
- drawTextDecorations(text, bytesCount, totalAdvance, oldX, oldY, paint);
+ drawTextDecorations(totalAdvance, oldX, oldY, paint);
return DrawGlInfo::kStatusDrew;
}
@@ -3121,7 +3119,7 @@ status_t OpenGLRenderer::drawLayer(Layer* layer, float x, float y) {
while (elementsCount > 0) {
GLsizei drawCount = min(elementsCount, (GLsizei) gMaxNumberOfQuads * 6);
- setupDrawMeshIndices(&mesh[0].position[0], &mesh[0].texture[0]);
+ setupDrawMeshIndices(&mesh[0].x, &mesh[0].u);
DRAW_DOUBLE_STENCIL_IF(!layer->hasDrawnSinceUpdate,
glDrawElements(GL_TRIANGLES, drawCount, GL_UNSIGNED_SHORT, NULL));
@@ -3132,7 +3130,7 @@ status_t OpenGLRenderer::drawLayer(Layer* layer, float x, float y) {
}
#if DEBUG_LAYERS_AS_REGIONS
- drawRegionRects(layer->region);
+ drawRegionRectsDebug(layer->region);
#endif
}
@@ -3272,8 +3270,7 @@ void OpenGLRenderer::drawPathTexture(const PathTexture* texture,
#define kStdUnderline_Offset (1.0f / 9.0f)
#define kStdUnderline_Thickness (1.0f / 18.0f)
-void OpenGLRenderer::drawTextDecorations(const char* text, int bytesCount, float underlineWidth,
- float x, float y, SkPaint* paint) {
+void OpenGLRenderer::drawTextDecorations(float underlineWidth, float x, float y, SkPaint* paint) {
// Handle underline and strike-through
uint32_t flags = paint->getFlags();
if (flags & (SkPaint::kUnderlineText_Flag | SkPaint::kStrikeThruText_Flag)) {
@@ -3424,8 +3421,8 @@ void OpenGLRenderer::drawTextureRect(float left, float top, float right, float b
GLvoid* texCoords = (GLvoid*) gMeshTextureOffset;
if (texture->uvMapper) {
- vertices = &mMeshVertices[0].position[0];
- texCoords = &mMeshVertices[0].texture[0];
+ vertices = &mMeshVertices[0].x;
+ texCoords = &mMeshVertices[0].u;
Rect uvs(0.0f, 0.0f, 1.0f, 1.0f);
texture->uvMapper->map(uvs);
diff --git a/libs/hwui/OpenGLRenderer.h b/libs/hwui/OpenGLRenderer.h
index 9afb7ad..6e9c747 100644
--- a/libs/hwui/OpenGLRenderer.h
+++ b/libs/hwui/OpenGLRenderer.h
@@ -654,12 +654,11 @@ private:
* @param alpha The translucency of the layer
* @param mode The blending mode of the layer
* @param flags The layer save flags
- * @param previousFbo The name of the current framebuffer
*
* @return True if the layer was successfully created, false otherwise
*/
bool createLayer(float left, float top, float right, float bottom,
- int alpha, SkXfermode::Mode mode, int flags, GLuint previousFbo);
+ int alpha, SkXfermode::Mode mode, int flags);
/**
* Creates a new layer stored in the specified snapshot as an FBO.
@@ -667,9 +666,8 @@ private:
* @param layer The layer to store as an FBO
* @param snapshot The snapshot associated with the new layer
* @param bounds The bounds of the layer
- * @param previousFbo The name of the current framebuffer
*/
- bool createFboLayer(Layer* layer, Rect& bounds, Rect& clip, GLuint previousFbo);
+ bool createFboLayer(Layer* layer, Rect& bounds, Rect& clip);
/**
* Compose the specified layer as a region.
@@ -868,8 +866,7 @@ private:
* @param y The y coordinate where the text will be drawn
* @param paint The paint to draw the text with
*/
- void drawTextDecorations(const char* text, int bytesCount, float totalAdvance,
- float x, float y, SkPaint* paint);
+ void drawTextDecorations(float totalAdvance, float x, float y, SkPaint* paint);
/**
* Draws shadow layer on text (with optional positions).
@@ -1004,11 +1001,13 @@ private:
void updateLayers();
void flushLayers();
+#if DEBUG_LAYERS_AS_REGIONS
/**
* Renders the specified region as a series of rectangles. This method
* is used for debugging only.
*/
- void drawRegionRects(const Region& region);
+ void drawRegionRectsDebug(const Region& region);
+#endif
/**
* Renders the specified region as a series of rectangles. The region
diff --git a/libs/hwui/PathTessellator.cpp b/libs/hwui/PathTessellator.cpp
index 3970913..03b2099 100644
--- a/libs/hwui/PathTessellator.cpp
+++ b/libs/hwui/PathTessellator.cpp
@@ -24,11 +24,11 @@
#define DEBUG_DUMP_ALPHA_BUFFER() \
for (unsigned int i = 0; i < vertexBuffer.getSize(); i++) { \
ALOGD("point %d at %f %f, alpha %f", \
- i, buffer[i].position[0], buffer[i].position[1], buffer[i].alpha); \
+ i, buffer[i].x, buffer[i].y, buffer[i].alpha); \
}
#define DEBUG_DUMP_BUFFER() \
for (unsigned int i = 0; i < vertexBuffer.getSize(); i++) { \
- ALOGD("point %d at %f %f", i, buffer[i].position[0], buffer[i].position[1]); \
+ ALOGD("point %d at %f %f", i, buffer[i].x, buffer[i].y); \
}
#else
#define DEBUG_DUMP_ALPHA_BUFFER()
@@ -67,11 +67,11 @@ void PathTessellator::expandBoundsForStroke(SkRect& bounds, const SkPaint* paint
}
inline static void copyVertex(Vertex* destPtr, const Vertex* srcPtr) {
- Vertex::set(destPtr, srcPtr->position[0], srcPtr->position[1]);
+ Vertex::set(destPtr, srcPtr->x, srcPtr->y);
}
inline static void copyAlphaVertex(AlphaVertex* destPtr, const AlphaVertex* srcPtr) {
- AlphaVertex::set(destPtr, srcPtr->position[0], srcPtr->position[1], srcPtr->alpha);
+ AlphaVertex::set(destPtr, srcPtr->x, srcPtr->y, srcPtr->alpha);
}
/**
@@ -192,25 +192,25 @@ void getStrokeVerticesFromPerimeter(const PaintInfo& paintInfo, const Vector<Ver
int currentIndex = 0;
const Vertex* last = &(perimeter[perimeter.size() - 1]);
const Vertex* current = &(perimeter[0]);
- vec2 lastNormal(current->position[1] - last->position[1],
- last->position[0] - current->position[0]);
+ vec2 lastNormal(current->y - last->y,
+ last->x - current->x);
lastNormal.normalize();
for (unsigned int i = 0; i < perimeter.size(); i++) {
const Vertex* next = &(perimeter[i + 1 >= perimeter.size() ? 0 : i + 1]);
- vec2 nextNormal(next->position[1] - current->position[1],
- current->position[0] - next->position[0]);
+ vec2 nextNormal(next->y - current->y,
+ current->x - next->x);
nextNormal.normalize();
vec2 totalOffset = totalOffsetFromNormals(lastNormal, nextNormal);
paintInfo.scaleOffsetForStrokeWidth(totalOffset);
Vertex::set(&buffer[currentIndex++],
- current->position[0] + totalOffset.x,
- current->position[1] + totalOffset.y);
+ current->x + totalOffset.x,
+ current->y + totalOffset.y);
Vertex::set(&buffer[currentIndex++],
- current->position[0] - totalOffset.x,
- current->position[1] - totalOffset.y);
+ current->x - totalOffset.x,
+ current->y - totalOffset.y);
last = current;
current = next;
@@ -229,7 +229,7 @@ static inline void storeBeginEnd(const PaintInfo& paintInfo, const Vertex& cente
vec2 strokeOffset = normal;
paintInfo.scaleOffsetForStrokeWidth(strokeOffset);
- vec2 referencePoint(center.position[0], center.position[1]);
+ vec2 referencePoint(center.x, center.y);
if (paintInfo.cap == SkPaint::kSquare_Cap) {
referencePoint += vec2(-strokeOffset.y, strokeOffset.x) * (begin ? -1 : 1);
}
@@ -255,11 +255,11 @@ void getStrokeVerticesFromUnclosedVertices(const PaintInfo& paintInfo,
if (extra > 0) {
// tessellate both round caps
float beginTheta = atan2(
- - (vertices[0].position[0] - vertices[1].position[0]),
- vertices[0].position[1] - vertices[1].position[1]);
+ - (vertices[0].x - vertices[1].x),
+ vertices[0].y - vertices[1].y);
float endTheta = atan2(
- - (vertices[lastIndex].position[0] - vertices[lastIndex - 1].position[0]),
- vertices[lastIndex].position[1] - vertices[lastIndex - 1].position[1]);
+ - (vertices[lastIndex].x - vertices[lastIndex - 1].x),
+ vertices[lastIndex].y - vertices[lastIndex - 1].y);
const float dTheta = PI / (extra + 1);
const float radialScale = 2.0f / (1 + cos(dTheta));
@@ -275,37 +275,37 @@ void getStrokeVerticesFromUnclosedVertices(const PaintInfo& paintInfo,
vec2 beginRadialOffset(cos(beginTheta), sin(beginTheta));
paintInfo.scaleOffsetForStrokeWidth(beginRadialOffset);
Vertex::set(&buffer[capOffset],
- vertices[0].position[0] + beginRadialOffset.x,
- vertices[0].position[1] + beginRadialOffset.y);
+ vertices[0].x + beginRadialOffset.x,
+ vertices[0].y + beginRadialOffset.y);
endTheta += dTheta;
vec2 endRadialOffset(cos(endTheta), sin(endTheta));
paintInfo.scaleOffsetForStrokeWidth(endRadialOffset);
Vertex::set(&buffer[allocSize - 1 - capOffset],
- vertices[lastIndex].position[0] + endRadialOffset.x,
- vertices[lastIndex].position[1] + endRadialOffset.y);
+ vertices[lastIndex].x + endRadialOffset.x,
+ vertices[lastIndex].y + endRadialOffset.y);
}
}
int currentIndex = extra;
const Vertex* last = &(vertices[0]);
const Vertex* current = &(vertices[1]);
- vec2 lastNormal(current->position[1] - last->position[1],
- last->position[0] - current->position[0]);
+ vec2 lastNormal(current->y - last->y,
+ last->x - current->x);
lastNormal.normalize();
storeBeginEnd(paintInfo, vertices[0], lastNormal, buffer, currentIndex, true);
for (unsigned int i = 1; i < vertices.size() - 1; i++) {
const Vertex* next = &(vertices[i + 1]);
- vec2 nextNormal(next->position[1] - current->position[1],
- current->position[0] - next->position[0]);
+ vec2 nextNormal(next->y - current->y,
+ current->x - next->x);
nextNormal.normalize();
vec2 strokeOffset = totalOffsetFromNormals(lastNormal, nextNormal);
paintInfo.scaleOffsetForStrokeWidth(strokeOffset);
- vec2 center(current->position[0], current->position[1]);
+ vec2 center(current->x, current->y);
Vertex::set(&buffer[currentIndex++], center + strokeOffset);
Vertex::set(&buffer[currentIndex++], center - strokeOffset);
@@ -337,13 +337,13 @@ void getFillVerticesFromPerimeterAA(const PaintInfo& paintInfo, const Vector<Ver
int currentIndex = 0;
const Vertex* last = &(perimeter[perimeter.size() - 1]);
const Vertex* current = &(perimeter[0]);
- vec2 lastNormal(current->position[1] - last->position[1],
- last->position[0] - current->position[0]);
+ vec2 lastNormal(current->y - last->y,
+ last->x - current->x);
lastNormal.normalize();
for (unsigned int i = 0; i < perimeter.size(); i++) {
const Vertex* next = &(perimeter[i + 1 >= perimeter.size() ? 0 : i + 1]);
- vec2 nextNormal(next->position[1] - current->position[1],
- current->position[0] - next->position[0]);
+ vec2 nextNormal(next->y - current->y,
+ current->x - next->x);
nextNormal.normalize();
// AA point offset from original point is that point's normal, such that each side is offset
@@ -351,12 +351,12 @@ void getFillVerticesFromPerimeterAA(const PaintInfo& paintInfo, const Vector<Ver
vec2 totalOffset = paintInfo.deriveAAOffset(totalOffsetFromNormals(lastNormal, nextNormal));
AlphaVertex::set(&buffer[currentIndex++],
- current->position[0] + totalOffset.x,
- current->position[1] + totalOffset.y,
+ current->x + totalOffset.x,
+ current->y + totalOffset.y,
0.0f);
AlphaVertex::set(&buffer[currentIndex++],
- current->position[0] - totalOffset.x,
- current->position[1] - totalOffset.y,
+ current->x - totalOffset.x,
+ current->y - totalOffset.y,
1.0f);
last = current;
@@ -416,7 +416,7 @@ inline static void storeCapAA(const PaintInfo& paintInfo, const Vector<Vertex>&
// determine referencePoint, the center point for the 4 primary cap vertices
const Vertex* point = isFirst ? vertices.begin() : (vertices.end() - 1);
- vec2 referencePoint(point->position[0], point->position[1]);
+ vec2 referencePoint(point->x, point->y);
if (paintInfo.cap == SkPaint::kSquare_Cap) {
// To account for square cap, move the primary cap vertices (that create the AA edge) by the
// stroke offset vector (rotated to be parallel to the stroke)
@@ -576,8 +576,8 @@ void getStrokeVerticesFromUnclosedVerticesAA(const PaintInfo& paintInfo,
const Vertex* last = &(vertices[0]);
const Vertex* current = &(vertices[1]);
- vec2 lastNormal(current->position[1] - last->position[1],
- last->position[0] - current->position[0]);
+ vec2 lastNormal(current->y - last->y,
+ last->x - current->x);
lastNormal.normalize();
// TODO: use normal from bezier traversal for cap, instead of from vertices
@@ -585,8 +585,8 @@ void getStrokeVerticesFromUnclosedVerticesAA(const PaintInfo& paintInfo,
for (unsigned int i = 1; i < vertices.size() - 1; i++) {
const Vertex* next = &(vertices[i + 1]);
- vec2 nextNormal(next->position[1] - current->position[1],
- current->position[0] - next->position[0]);
+ vec2 nextNormal(next->y - current->y,
+ current->x - next->x);
nextNormal.normalize();
vec2 totalOffset = totalOffsetFromNormals(lastNormal, nextNormal);
@@ -598,30 +598,30 @@ void getStrokeVerticesFromUnclosedVerticesAA(const PaintInfo& paintInfo,
innerOffset -= AAOffset;
AlphaVertex::set(&buffer[currentAAOuterIndex++],
- current->position[0] + outerOffset.x,
- current->position[1] + outerOffset.y,
+ current->x + outerOffset.x,
+ current->y + outerOffset.y,
0.0f);
AlphaVertex::set(&buffer[currentAAOuterIndex++],
- current->position[0] + innerOffset.x,
- current->position[1] + innerOffset.y,
+ current->x + innerOffset.x,
+ current->y + innerOffset.y,
paintInfo.maxAlpha);
AlphaVertex::set(&buffer[currentStrokeIndex++],
- current->position[0] + innerOffset.x,
- current->position[1] + innerOffset.y,
+ current->x + innerOffset.x,
+ current->y + innerOffset.y,
paintInfo.maxAlpha);
AlphaVertex::set(&buffer[currentStrokeIndex++],
- current->position[0] - innerOffset.x,
- current->position[1] - innerOffset.y,
+ current->x - innerOffset.x,
+ current->y - innerOffset.y,
paintInfo.maxAlpha);
AlphaVertex::set(&buffer[currentAAInnerIndex--],
- current->position[0] - innerOffset.x,
- current->position[1] - innerOffset.y,
+ current->x - innerOffset.x,
+ current->y - innerOffset.y,
paintInfo.maxAlpha);
AlphaVertex::set(&buffer[currentAAInnerIndex--],
- current->position[0] - outerOffset.x,
- current->position[1] - outerOffset.y,
+ current->x - outerOffset.x,
+ current->y - outerOffset.y,
0.0f);
current = next;
@@ -646,13 +646,13 @@ void getStrokeVerticesFromPerimeterAA(const PaintInfo& paintInfo, const Vector<V
const Vertex* last = &(perimeter[perimeter.size() - 1]);
const Vertex* current = &(perimeter[0]);
- vec2 lastNormal(current->position[1] - last->position[1],
- last->position[0] - current->position[0]);
+ vec2 lastNormal(current->y - last->y,
+ last->x - current->x);
lastNormal.normalize();
for (unsigned int i = 0; i < perimeter.size(); i++) {
const Vertex* next = &(perimeter[i + 1 >= perimeter.size() ? 0 : i + 1]);
- vec2 nextNormal(next->position[1] - current->position[1],
- current->position[0] - next->position[0]);
+ vec2 nextNormal(next->y - current->y,
+ current->x - next->x);
nextNormal.normalize();
vec2 totalOffset = totalOffsetFromNormals(lastNormal, nextNormal);
@@ -664,30 +664,30 @@ void getStrokeVerticesFromPerimeterAA(const PaintInfo& paintInfo, const Vector<V
innerOffset -= AAOffset;
AlphaVertex::set(&buffer[currentAAOuterIndex++],
- current->position[0] + outerOffset.x,
- current->position[1] + outerOffset.y,
+ current->x + outerOffset.x,
+ current->y + outerOffset.y,
0.0f);
AlphaVertex::set(&buffer[currentAAOuterIndex++],
- current->position[0] + innerOffset.x,
- current->position[1] + innerOffset.y,
+ current->x + innerOffset.x,
+ current->y + innerOffset.y,
paintInfo.maxAlpha);
AlphaVertex::set(&buffer[currentStrokeIndex++],
- current->position[0] + innerOffset.x,
- current->position[1] + innerOffset.y,
+ current->x + innerOffset.x,
+ current->y + innerOffset.y,
paintInfo.maxAlpha);
AlphaVertex::set(&buffer[currentStrokeIndex++],
- current->position[0] - innerOffset.x,
- current->position[1] - innerOffset.y,
+ current->x - innerOffset.x,
+ current->y - innerOffset.y,
paintInfo.maxAlpha);
AlphaVertex::set(&buffer[currentAAInnerIndex++],
- current->position[0] - innerOffset.x,
- current->position[1] - innerOffset.y,
+ current->x - innerOffset.x,
+ current->y - innerOffset.y,
paintInfo.maxAlpha);
AlphaVertex::set(&buffer[currentAAInnerIndex++],
- current->position[0] - outerOffset.x,
- current->position[1] - outerOffset.y,
+ current->x - outerOffset.x,
+ current->y - outerOffset.y,
0.0f);
last = current;
@@ -743,7 +743,7 @@ void PathTessellator::tessellatePath(const SkPath &path, const SkPaint* paint,
#if VERTEX_DEBUG
for (unsigned int i = 0; i < tempVertices.size(); i++) {
ALOGD("orig path: point at %f %f",
- tempVertices[i].position[0], tempVertices[i].position[1]);
+ tempVertices[i].x, tempVertices[i].y);
}
#endif
@@ -780,7 +780,7 @@ static void expandRectToCoverVertex(SkRect& rect, float x, float y) {
rect.fBottom = fmaxf(rect.fBottom, y);
}
static void expandRectToCoverVertex(SkRect& rect, const Vertex& vertex) {
- expandRectToCoverVertex(rect, vertex.position[0], vertex.position[1]);
+ expandRectToCoverVertex(rect, vertex.x, vertex.y);
}
template <class TYPE>
@@ -939,8 +939,8 @@ bool PathTessellator::approximatePathOutlineVertices(const SkPath& path, bool fo
}
int size = outputVertices.size();
- if (size >= 2 && outputVertices[0].position[0] == outputVertices[size - 1].position[0] &&
- outputVertices[0].position[1] == outputVertices[size - 1].position[1]) {
+ if (size >= 2 && outputVertices[0].x == outputVertices[size - 1].x &&
+ outputVertices[0].y == outputVertices[size - 1].y) {
outputVertices.pop();
return true;
}
diff --git a/libs/hwui/Program.h b/libs/hwui/Program.h
index 4f94afc..bc0f211 100644
--- a/libs/hwui/Program.h
+++ b/libs/hwui/Program.h
@@ -207,7 +207,7 @@ struct ProgramDescription {
* the fragment shader. When this method returns true, the program should
* be provided with a modulation color.
*/
- bool setColor(const float r, const float g, const float b, const float a) {
+ bool setColorModulate(const float a) {
modulate = a < COLOR_COMPONENT_THRESHOLD;
return modulate;
}
@@ -217,7 +217,7 @@ struct ProgramDescription {
* the fragment shader. When this method returns true, the program should
* be provided with a modulation color.
*/
- bool setAlpha8Color(const float r, const float g, const float b, const float a) {
+ bool setAlpha8ColorModulate(const float r, const float g, const float b, const float a) {
modulate = a < COLOR_COMPONENT_THRESHOLD || r > COLOR_COMPONENT_INV_THRESHOLD ||
g > COLOR_COMPONENT_INV_THRESHOLD || b > COLOR_COMPONENT_INV_THRESHOLD;
return modulate;
diff --git a/libs/hwui/SkiaShader.cpp b/libs/hwui/SkiaShader.cpp
index 797ed10..4f2a432 100644
--- a/libs/hwui/SkiaShader.cpp
+++ b/libs/hwui/SkiaShader.cpp
@@ -142,7 +142,7 @@ void SkiaBitmapShader::describe(ProgramDescription& description, const Extension
}
void SkiaBitmapShader::setupProgram(Program* program, const mat4& modelView,
- const Snapshot& snapshot, GLuint* textureUnit) {
+ const Snapshot&, GLuint* textureUnit) {
GLuint textureSlot = (*textureUnit)++;
Caches::getInstance().activeTexture(textureSlot);
@@ -228,7 +228,7 @@ void SkiaLinearGradientShader::describe(ProgramDescription& description,
}
void SkiaLinearGradientShader::setupProgram(Program* program, const mat4& modelView,
- const Snapshot& snapshot, GLuint* textureUnit) {
+ const Snapshot&, GLuint* textureUnit) {
if (CC_UNLIKELY(!mIsSimple)) {
GLuint textureSlot = (*textureUnit)++;
Caches::getInstance().activeTexture(textureSlot);
@@ -264,7 +264,7 @@ static void toCircularUnitMatrix(const float x, const float y, const float radiu
SkiaCircularGradientShader::SkiaCircularGradientShader(float x, float y, float radius,
uint32_t* colors, float* positions, int count, SkShader* key, SkShader::TileMode tileMode,
SkMatrix* matrix, bool blend):
- SkiaSweepGradientShader(kCircularGradient, x, y, colors, positions, count, key,
+ SkiaSweepGradientShader(kCircularGradient, colors, positions, count, key,
tileMode, matrix, blend) {
SkMatrix unitMatrix;
toCircularUnitMatrix(x, y, radius, &unitMatrix);
@@ -314,11 +314,12 @@ SkiaSweepGradientShader::SkiaSweepGradientShader(float x, float y, uint32_t* col
mIsSimple = count == 2;
}
-SkiaSweepGradientShader::SkiaSweepGradientShader(Type type, float x, float y, uint32_t* colors,
+SkiaSweepGradientShader::SkiaSweepGradientShader(Type type, uint32_t* colors,
float* positions, int count, SkShader* key, SkShader::TileMode tileMode,
SkMatrix* matrix, bool blend):
SkiaShader(type, key, tileMode, tileMode, matrix, blend),
mColors(colors), mPositions(positions), mCount(count) {
+ // protected method, that doesn't setup mUnitMatrix - should be handled by subclass
mIsSimple = count == 2 && tileMode == SkShader::kClamp_TileMode;
}
diff --git a/libs/hwui/SkiaShader.h b/libs/hwui/SkiaShader.h
index a63431c..9fc99a4 100644
--- a/libs/hwui/SkiaShader.h
+++ b/libs/hwui/SkiaShader.h
@@ -192,7 +192,7 @@ struct SkiaSweepGradientShader: public SkiaShader {
GLuint* textureUnit);
protected:
- SkiaSweepGradientShader(Type type, float x, float y, uint32_t* colors, float* positions,
+ SkiaSweepGradientShader(Type type, uint32_t* colors, float* positions,
int count, SkShader* key, SkShader::TileMode tileMode, SkMatrix* matrix, bool blend);
SkiaSweepGradientShader() {
}
diff --git a/libs/hwui/TextDropShadowCache.cpp b/libs/hwui/TextDropShadowCache.cpp
index 0b2c130..6f27b36 100644
--- a/libs/hwui/TextDropShadowCache.cpp
+++ b/libs/hwui/TextDropShadowCache.cpp
@@ -147,7 +147,7 @@ void TextDropShadowCache::setMaxSize(uint32_t maxSize) {
// Callbacks
///////////////////////////////////////////////////////////////////////////////
-void TextDropShadowCache::operator()(ShadowText& text, ShadowTexture*& texture) {
+void TextDropShadowCache::operator()(ShadowText&, ShadowTexture*& texture) {
if (texture) {
mSize -= texture->bitmapSize;
diff --git a/libs/hwui/TextureCache.cpp b/libs/hwui/TextureCache.cpp
index ed0a79a..a56eb33 100644
--- a/libs/hwui/TextureCache.cpp
+++ b/libs/hwui/TextureCache.cpp
@@ -103,7 +103,7 @@ void TextureCache::setFlushRate(float flushRate) {
// Callbacks
///////////////////////////////////////////////////////////////////////////////
-void TextureCache::operator()(SkBitmap*& bitmap, Texture*& texture) {
+void TextureCache::operator()(SkBitmap*&, Texture*& texture) {
// This will be called already locked
if (texture) {
mSize -= texture->bitmapSize;
diff --git a/libs/hwui/Vertex.h b/libs/hwui/Vertex.h
index 790d4fc..351ce71 100644
--- a/libs/hwui/Vertex.h
+++ b/libs/hwui/Vertex.h
@@ -35,11 +35,11 @@ struct Vertex {
*/
static const float gGeometryFudgeFactor = 0.0656f;
- float position[2];
+ float x, y;
static inline void set(Vertex* vertex, float x, float y) {
- vertex[0].position[0] = x;
- vertex[0].position[1] = y;
+ vertex[0].x = x;
+ vertex[0].y = y;
}
static inline void set(Vertex* vertex, vec2 val) {
@@ -47,7 +47,7 @@ struct Vertex {
}
static inline void copyWithOffset(Vertex* vertex, const Vertex& src, float x, float y) {
- set(vertex, src.position[0] + x, src.position[1] + y);
+ set(vertex, src.x + x, src.y + y);
}
}; // struct Vertex
@@ -56,19 +56,19 @@ struct Vertex {
* Simple structure to describe a vertex with a position and texture UV.
*/
struct TextureVertex {
- float position[2];
- float texture[2];
+ float x, y;
+ float u, v;
static inline void set(TextureVertex* vertex, float x, float y, float u, float v) {
- vertex[0].position[0] = x;
- vertex[0].position[1] = y;
- vertex[0].texture[0] = u;
- vertex[0].texture[1] = v;
+ vertex[0].x = x;
+ vertex[0].y = y;
+ vertex[0].u = u;
+ vertex[0].v = v;
}
static inline void setUV(TextureVertex* vertex, float u, float v) {
- vertex[0].texture[0] = u;
- vertex[0].texture[1] = v;
+ vertex[0].u = u;
+ vertex[0].v = v;
}
}; // struct TextureVertex
@@ -76,17 +76,17 @@ struct TextureVertex {
* Simple structure to describe a vertex with a position, texture UV and ARGB color.
*/
struct ColorTextureVertex : TextureVertex {
- float color[4];
+ float r, g, b, a;
static inline void set(ColorTextureVertex* vertex, float x, float y,
float u, float v, int color) {
TextureVertex::set(vertex, x, y, u, v);
const float a = ((color >> 24) & 0xff) / 255.0f;
- vertex[0].color[0] = a * ((color >> 16) & 0xff) / 255.0f;
- vertex[0].color[1] = a * ((color >> 8) & 0xff) / 255.0f;
- vertex[0].color[2] = a * ((color ) & 0xff) / 255.0f;
- vertex[0].color[3] = a;
+ vertex[0].r = a * ((color >> 16) & 0xff) / 255.0f;
+ vertex[0].g = a * ((color >> 8) & 0xff) / 255.0f;
+ vertex[0].b = a * ((color ) & 0xff) / 255.0f;
+ vertex[0].a = a;
}
}; // struct ColorTextureVertex
@@ -103,7 +103,7 @@ struct AlphaVertex : Vertex {
static inline void copyWithOffset(AlphaVertex* vertex, const AlphaVertex& src,
float x, float y) {
- Vertex::set(vertex, src.position[0] + x, src.position[1] + y);
+ Vertex::set(vertex, src.x + x, src.y + y);
vertex[0].alpha = src.alpha;
}
diff --git a/libs/hwui/font/CacheTexture.cpp b/libs/hwui/font/CacheTexture.cpp
index d5f38b5..24ffb80 100644
--- a/libs/hwui/font/CacheTexture.cpp
+++ b/libs/hwui/font/CacheTexture.cpp
@@ -114,7 +114,7 @@ CacheTexture::CacheTexture(uint16_t width, uint16_t height, GLenum format, uint3
mMesh(NULL), mCurrentQuad(0), mMaxQuadCount(maxQuadCount),
mCaches(Caches::getInstance()) {
mCacheBlocks = new CacheBlock(TEXTURE_BORDER_SIZE, TEXTURE_BORDER_SIZE,
- mWidth - TEXTURE_BORDER_SIZE, mHeight - TEXTURE_BORDER_SIZE, true);
+ mWidth - TEXTURE_BORDER_SIZE, mHeight - TEXTURE_BORDER_SIZE);
// OpenGL ES 3.0+ lets us specify the row length for unpack operations such
// as glTexSubImage2D(). This allows us to upload a sub-rectangle of a texture.
@@ -143,7 +143,7 @@ void CacheTexture::init() {
// reset, then create a new remainder space to start again
reset();
mCacheBlocks = new CacheBlock(TEXTURE_BORDER_SIZE, TEXTURE_BORDER_SIZE,
- mWidth - TEXTURE_BORDER_SIZE, mHeight - TEXTURE_BORDER_SIZE, true);
+ mWidth - TEXTURE_BORDER_SIZE, mHeight - TEXTURE_BORDER_SIZE);
}
void CacheTexture::releaseMesh() {
diff --git a/libs/hwui/font/CacheTexture.h b/libs/hwui/font/CacheTexture.h
index 61b38f8..4cc4f22 100644
--- a/libs/hwui/font/CacheTexture.h
+++ b/libs/hwui/font/CacheTexture.h
@@ -54,7 +54,7 @@ struct CacheBlock {
CacheBlock* mNext;
CacheBlock* mPrev;
- CacheBlock(uint16_t x, uint16_t y, uint16_t width, uint16_t height, bool empty = false):
+ CacheBlock(uint16_t x, uint16_t y, uint16_t width, uint16_t height):
mX(x), mY(y), mWidth(width), mHeight(height), mNext(NULL), mPrev(NULL) {
}
diff --git a/media/java/android/media/Image.java b/media/java/android/media/Image.java
index 23abce7..a346e17 100644
--- a/media/java/android/media/Image.java
+++ b/media/java/android/media/Image.java
@@ -21,7 +21,8 @@ import java.lang.AutoCloseable;
/**
* <p>A single complete image buffer to use with a media source such as a
- * {@link MediaCodec}.</p>
+ * {@link MediaCodec} or a
+ * {@link android.hardware.camera2.CameraDevice CameraDevice}.</p>
*
* <p>This class allows for efficient direct application access to the pixel
* data of the Image through one or more
@@ -82,6 +83,15 @@ public abstract class Image implements AutoCloseable {
* plane (4:2:0 subsampling). Each pixel sample in each plane has 8 bits.
* Each plane has its own row stride and pixel stride.</td>
* </tr>
+ * <tr>
+ * <td>{@link android.graphics.ImageFormat#RAW_SENSOR RAW_SENSOR}</td>
+ * <td>1</td>
+ * <td>A single plane of raw sensor image data, with 16 bits per color
+ * sample. The details of the layout need to be queried from the source of
+ * the raw sensor data, such as
+ * {@link android.hardware.camera2.CameraDevice CameraDevice}.
+ * </td>
+ * </tr>
* </table>
*
* @see android.graphics.ImageFormat
diff --git a/media/java/android/media/ImageReader.java b/media/java/android/media/ImageReader.java
index d454c42..1bd32c4 100644
--- a/media/java/android/media/ImageReader.java
+++ b/media/java/android/media/ImageReader.java
@@ -32,7 +32,8 @@ import java.nio.ByteOrder;
* rendered into a {@link android.view.Surface}</p>
*
* <p>Several Android media API classes accept Surface objects as targets to
- * render to, including {@link MediaPlayer}, {@link MediaCodec}, and
+ * render to, including {@link MediaPlayer}, {@link MediaCodec},
+ * {@link android.hardware.camera2.CameraDevice}, and
* {@link android.renderscript.Allocation RenderScript Allocations}. The image
* sizes and formats that can be used with each source vary, and should be
* checked in the documentation for the specific API.</p>
diff --git a/media/java/android/media/WebVttRenderer.java b/media/java/android/media/WebVttRenderer.java
index 4dec081..b09c5bd 100644
--- a/media/java/android/media/WebVttRenderer.java
+++ b/media/java/android/media/WebVttRenderer.java
@@ -1136,11 +1136,15 @@ class WebVttRenderingWidget extends ViewGroup implements SubtitleTrack.Rendering
}
public WebVttRenderingWidget(Context context, AttributeSet attrs) {
- this(context, null, 0);
+ this(context, attrs, 0);
}
- public WebVttRenderingWidget(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
+ public WebVttRenderingWidget(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
+ public WebVttRenderingWidget(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
// Cannot render text over video when layer type is hardware.
setLayerType(View.LAYER_TYPE_SOFTWARE, null);
diff --git a/packages/BackupRestoreConfirmation/res/values-az-rAZ/strings.xml b/packages/BackupRestoreConfirmation/res/values-az-rAZ/strings.xml
new file mode 100644
index 0000000..1f9e6aa
--- /dev/null
+++ b/packages/BackupRestoreConfirmation/res/values-az-rAZ/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="backup_confirm_title" msgid="827563724209303345">"Tam yedəkləmə"</string>
+ <string name="restore_confirm_title" msgid="5469365809567486602">"Tam bərpa"</string>
+ <string name="backup_confirm_text" msgid="1878021282758896593">"Bütün datanın qoÅŸulmuÅŸ masaüstü kompüterÉ™ rezerv olunması sorÄŸusu göndÉ™rilib. Buna icazÉ™ vermÉ™k istÉ™yirsiniz mi?\n\nÆgÉ™r bu sorÄŸunu göndÉ™rmÉ™misinizsÉ™, bu prosesin davam etmÉ™sinÉ™ icazÉ™ vermÉ™yin."</string>
+ <string name="allow_backup_button_label" msgid="4217228747769644068">"Məlumatlarımı yedəklə"</string>
+ <string name="deny_backup_button_label" msgid="6009119115581097708">"Rezerv etməyin"</string>
+ <string name="restore_confirm_text" msgid="7499866728030461776">"Qoşulmuş stolüstü kompüterdən tam bərpa tələb olunur. Buna icazə verilsin?\n\nBərpanı siz özünüz tələb etməmisinizsə, bu əməliyyatı davam etdirməyin. Bu cihazdakı istənilən məlumatı dəyişdirəcək."</string>
+ <string name="allow_restore_button_label" msgid="3081286752277127827">"Məlumatlarımı bərpa et"</string>
+ <string name="deny_restore_button_label" msgid="1724367334453104378">"Bərpa etməyin"</string>
+ <string name="current_password_text" msgid="8268189555578298067">"Lütfən, aşağıda cari yedək parolunuzu daxil edin:"</string>
+ <string name="device_encryption_restore_text" msgid="1570864916855208992">"Lütfən, aşağıda cihaz şifrələmə parolunu daxil edin."</string>
+ <string name="device_encryption_backup_text" msgid="5866590762672844664">"Lütfən, aşağıda cihaz şifrələmə parolunuzu daxil edin. Bu yedək arxivini şifrələmək üçün də istifadə olunacaq."</string>
+ <string name="backup_enc_password_text" msgid="4981585714795233099">"Tam yedÉ™k data ÅŸifrÉ™lÉ™mÉ™dÉ™n istifadÉ™ üçün ÅŸifrÉ™ daxil edin. ÆgÉ™r boÅŸ buraxılsa, cari yedÉ™k ÅŸifrÉ™ istifadÉ™ olunacaq:"</string>
+ <string name="backup_enc_password_optional" msgid="1350137345907579306">"Bütün yedək datanı şifrələmək istəyirsinizsə, aşağıda parol daxil edin:"</string>
+ <string name="restore_enc_password_text" msgid="6140898525580710823">"Bərpa məlumatları şifrələnibsə, şifrəni aşağıda daxil edin:"</string>
+ <string name="toast_backup_started" msgid="550354281452756121">"Rezerv edilir ..."</string>
+ <string name="toast_backup_ended" msgid="3818080769548726424">"Yedəkləmə sona çatdı"</string>
+ <string name="toast_restore_started" msgid="7881679218971277385">"Bərpa başlayır..."</string>
+ <string name="toast_restore_ended" msgid="1764041639199696132">"Bərpa sona çatdı"</string>
+ <string name="toast_timeout" msgid="5276598587087626877">"ÆmÉ™liyyat vaxtı bitdi"</string>
+</resources>
diff --git a/packages/BackupRestoreConfirmation/res/values-az/strings.xml b/packages/BackupRestoreConfirmation/res/values-az/strings.xml
new file mode 100644
index 0000000..1f9e6aa
--- /dev/null
+++ b/packages/BackupRestoreConfirmation/res/values-az/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="backup_confirm_title" msgid="827563724209303345">"Tam yedəkləmə"</string>
+ <string name="restore_confirm_title" msgid="5469365809567486602">"Tam bərpa"</string>
+ <string name="backup_confirm_text" msgid="1878021282758896593">"Bütün datanın qoÅŸulmuÅŸ masaüstü kompüterÉ™ rezerv olunması sorÄŸusu göndÉ™rilib. Buna icazÉ™ vermÉ™k istÉ™yirsiniz mi?\n\nÆgÉ™r bu sorÄŸunu göndÉ™rmÉ™misinizsÉ™, bu prosesin davam etmÉ™sinÉ™ icazÉ™ vermÉ™yin."</string>
+ <string name="allow_backup_button_label" msgid="4217228747769644068">"Məlumatlarımı yedəklə"</string>
+ <string name="deny_backup_button_label" msgid="6009119115581097708">"Rezerv etməyin"</string>
+ <string name="restore_confirm_text" msgid="7499866728030461776">"Qoşulmuş stolüstü kompüterdən tam bərpa tələb olunur. Buna icazə verilsin?\n\nBərpanı siz özünüz tələb etməmisinizsə, bu əməliyyatı davam etdirməyin. Bu cihazdakı istənilən məlumatı dəyişdirəcək."</string>
+ <string name="allow_restore_button_label" msgid="3081286752277127827">"Məlumatlarımı bərpa et"</string>
+ <string name="deny_restore_button_label" msgid="1724367334453104378">"Bərpa etməyin"</string>
+ <string name="current_password_text" msgid="8268189555578298067">"Lütfən, aşağıda cari yedək parolunuzu daxil edin:"</string>
+ <string name="device_encryption_restore_text" msgid="1570864916855208992">"Lütfən, aşağıda cihaz şifrələmə parolunu daxil edin."</string>
+ <string name="device_encryption_backup_text" msgid="5866590762672844664">"Lütfən, aşağıda cihaz şifrələmə parolunuzu daxil edin. Bu yedək arxivini şifrələmək üçün də istifadə olunacaq."</string>
+ <string name="backup_enc_password_text" msgid="4981585714795233099">"Tam yedÉ™k data ÅŸifrÉ™lÉ™mÉ™dÉ™n istifadÉ™ üçün ÅŸifrÉ™ daxil edin. ÆgÉ™r boÅŸ buraxılsa, cari yedÉ™k ÅŸifrÉ™ istifadÉ™ olunacaq:"</string>
+ <string name="backup_enc_password_optional" msgid="1350137345907579306">"Bütün yedək datanı şifrələmək istəyirsinizsə, aşağıda parol daxil edin:"</string>
+ <string name="restore_enc_password_text" msgid="6140898525580710823">"Bərpa məlumatları şifrələnibsə, şifrəni aşağıda daxil edin:"</string>
+ <string name="toast_backup_started" msgid="550354281452756121">"Rezerv edilir ..."</string>
+ <string name="toast_backup_ended" msgid="3818080769548726424">"Yedəkləmə sona çatdı"</string>
+ <string name="toast_restore_started" msgid="7881679218971277385">"Bərpa başlayır..."</string>
+ <string name="toast_restore_ended" msgid="1764041639199696132">"Bərpa sona çatdı"</string>
+ <string name="toast_timeout" msgid="5276598587087626877">"ÆmÉ™liyyat vaxtı bitdi"</string>
+</resources>
diff --git a/packages/BackupRestoreConfirmation/res/values-en-rIN/strings.xml b/packages/BackupRestoreConfirmation/res/values-en-rIN/strings.xml
new file mode 100644
index 0000000..d096d98
--- /dev/null
+++ b/packages/BackupRestoreConfirmation/res/values-en-rIN/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="backup_confirm_title" msgid="827563724209303345">"Full backup"</string>
+ <string name="restore_confirm_title" msgid="5469365809567486602">"Full restoration"</string>
+ <string name="backup_confirm_text" msgid="1878021282758896593">"A full backup of all data to a connected desktop computer has been requested. Do you want to allow this to happen?\n\nIf you did not request the backup yourself, do not allow the operation to proceed."</string>
+ <string name="allow_backup_button_label" msgid="4217228747769644068">"Back up my data"</string>
+ <string name="deny_backup_button_label" msgid="6009119115581097708">"Do not back up"</string>
+ <string name="restore_confirm_text" msgid="7499866728030461776">"A full restore of all data from a connected desktop computer has been requested. Do you want to allow this to happen?\n\nIf you did not request the restore yourself, do not allow the operation to proceed. This will replace any data currently on the device!"</string>
+ <string name="allow_restore_button_label" msgid="3081286752277127827">"Restore my data"</string>
+ <string name="deny_restore_button_label" msgid="1724367334453104378">"Do not restore"</string>
+ <string name="current_password_text" msgid="8268189555578298067">"Please enter your current backup password below:"</string>
+ <string name="device_encryption_restore_text" msgid="1570864916855208992">"Please enter your device encryption password below."</string>
+ <string name="device_encryption_backup_text" msgid="5866590762672844664">"Please enter your device encryption password below. This will also be used to encrypt the backup archive."</string>
+ <string name="backup_enc_password_text" msgid="4981585714795233099">"Please enter a password to use for encrypting the full backup data. If this is left blank, your current backup password will be used:"</string>
+ <string name="backup_enc_password_optional" msgid="1350137345907579306">"If you wish to encrypt the full backup data, enter a password below:"</string>
+ <string name="restore_enc_password_text" msgid="6140898525580710823">"If the restore data is encrypted, please enter the password below:"</string>
+ <string name="toast_backup_started" msgid="550354281452756121">"Backup starting..."</string>
+ <string name="toast_backup_ended" msgid="3818080769548726424">"Backup finished"</string>
+ <string name="toast_restore_started" msgid="7881679218971277385">"Restoration starting..."</string>
+ <string name="toast_restore_ended" msgid="1764041639199696132">"Restoration ended"</string>
+ <string name="toast_timeout" msgid="5276598587087626877">"Operation timed out"</string>
+</resources>
diff --git a/packages/BackupRestoreConfirmation/res/values-et-rEE/strings.xml b/packages/BackupRestoreConfirmation/res/values-et-rEE/strings.xml
new file mode 100644
index 0000000..0f5fde2
--- /dev/null
+++ b/packages/BackupRestoreConfirmation/res/values-et-rEE/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="backup_confirm_title" msgid="827563724209303345">"Täielik varundus"</string>
+ <string name="restore_confirm_title" msgid="5469365809567486602">"Täielik taastamine"</string>
+ <string name="backup_confirm_text" msgid="1878021282758896593">"Taotleti kõikide andmete varundamist ühendatud lauaarvutist. Kas soovite seda lubada?\n\nKui te ei taotlenud varundust, siis ärge lubage toimingut jätkata."</string>
+ <string name="allow_backup_button_label" msgid="4217228747769644068">"Varunda mu andmed"</string>
+ <string name="deny_backup_button_label" msgid="6009119115581097708">"Ära varunda"</string>
+ <string name="restore_confirm_text" msgid="7499866728030461776">"Taotletud on kõikide andmete taastamist ühendatud lauaarvutist. Kas soovite seda lubada?\n\nKui te ei taotlenud taastamist, siis ärge lubage toimingut jätkata. See asendab kõik praegu seadmes olevad andmed."</string>
+ <string name="allow_restore_button_label" msgid="3081286752277127827">"Taasta mu andmed"</string>
+ <string name="deny_restore_button_label" msgid="1724367334453104378">"Ära taasta"</string>
+ <string name="current_password_text" msgid="8268189555578298067">"Sisestage allpool praegune varunduse parool:"</string>
+ <string name="device_encryption_restore_text" msgid="1570864916855208992">"Sisestage allpool oma seadme krüpteerimise parool."</string>
+ <string name="device_encryption_backup_text" msgid="5866590762672844664">"Sisestage allpool oma seadme krüpteerimise parool. Seda kasutatakse ka varukoopiate arhiivi krüpteerimiseks."</string>
+ <string name="backup_enc_password_text" msgid="4981585714795233099">"Sisestage parool kõikide varundatud andmete krüpteerimise jaoks. Kui jätate selle tühjaks, siis kasutatakse teie praegust varunduse parooli:"</string>
+ <string name="backup_enc_password_optional" msgid="1350137345907579306">"Kui soovite kõik varundusandmed krüpteerida, siis sisestage allpool parool:"</string>
+ <string name="restore_enc_password_text" msgid="6140898525580710823">"Kui taasteandmed on krüpteeritud, siis sisestage allpool parool."</string>
+ <string name="toast_backup_started" msgid="550354281452756121">"Algab varundamine ..."</string>
+ <string name="toast_backup_ended" msgid="3818080769548726424">"Varundamine jõudis lõpule"</string>
+ <string name="toast_restore_started" msgid="7881679218971277385">"Algab taastamine ..."</string>
+ <string name="toast_restore_ended" msgid="1764041639199696132">"Taastamine jõudis lõpule"</string>
+ <string name="toast_timeout" msgid="5276598587087626877">"Toiming aegus"</string>
+</resources>
diff --git a/packages/BackupRestoreConfirmation/res/values-fr-rCA/strings.xml b/packages/BackupRestoreConfirmation/res/values-fr-rCA/strings.xml
new file mode 100644
index 0000000..8a70fb5
--- /dev/null
+++ b/packages/BackupRestoreConfirmation/res/values-fr-rCA/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="backup_confirm_title" msgid="827563724209303345">"Sauvegarde complète"</string>
+ <string name="restore_confirm_title" msgid="5469365809567486602">"Restauration complète"</string>
+ <string name="backup_confirm_text" msgid="1878021282758896593">"Vous avez demandé une sauvegarde complète de l\'ensemble des données vers un ordinateur de bureau connecté. Voulez-vous l\'autoriser?\n\nSi vous n\'avez pas demandé la sauvegarde vous-même, n\'autorisez pas la poursuite de l\'opération."</string>
+ <string name="allow_backup_button_label" msgid="4217228747769644068">"Sauvegarder mes données"</string>
+ <string name="deny_backup_button_label" msgid="6009119115581097708">"Ne pas sauvegarder"</string>
+ <string name="restore_confirm_text" msgid="7499866728030461776">"Vous avez demandé une restauration complète de l\'ensemble des données à partir d\'un ordinateur de bureau connecté. Voulez-vous l\'autoriser?\n\nSi vous n\'avez pas demandé vous-même la restauration, n\'autorisez pas sa poursuite. Cette opération remplacera toutes les données actuellement sur l\'appareil!"</string>
+ <string name="allow_restore_button_label" msgid="3081286752277127827">"Restaurer mes données"</string>
+ <string name="deny_restore_button_label" msgid="1724367334453104378">"Ne pas restaurer"</string>
+ <string name="current_password_text" msgid="8268189555578298067">"Veuillez saisir votre mot de passe de sauvegarde actuel ci-dessous :"</string>
+ <string name="device_encryption_restore_text" msgid="1570864916855208992">"Veuillez saisir le mot de passe de chiffrement de l\'appareil ci-dessous."</string>
+ <string name="device_encryption_backup_text" msgid="5866590762672844664">"Veuillez saisir le mot de passe de chiffrement de l\'appareil ci-dessous. Il permettra également de chiffrer les archives de sauvegarde."</string>
+ <string name="backup_enc_password_text" msgid="4981585714795233099">"Veuillez saisir un mot de passe à utiliser pour chiffrer les données de sauvegarde complète. Si ce champ n\'est pas renseigné, votre mot de passe de sauvegarde actuel sera utilisé :"</string>
+ <string name="backup_enc_password_optional" msgid="1350137345907579306">"Si vous souhaitez chiffrer l\'ensemble des données de sauvegarde, veuillez saisir un mot de passe ci-dessous :"</string>
+ <string name="restore_enc_password_text" msgid="6140898525580710823">"Si les données de restauration sont chiffrées, veuillez saisir le mot de passe ci-dessous :"</string>
+ <string name="toast_backup_started" msgid="550354281452756121">"Démarrage de la sauvegarde…"</string>
+ <string name="toast_backup_ended" msgid="3818080769548726424">"Sauvegarde terminée."</string>
+ <string name="toast_restore_started" msgid="7881679218971277385">"Démarrage de la restauration…"</string>
+ <string name="toast_restore_ended" msgid="1764041639199696132">"Restauration terminée."</string>
+ <string name="toast_timeout" msgid="5276598587087626877">"L\'opération a expiré."</string>
+</resources>
diff --git a/packages/BackupRestoreConfirmation/res/values-hi/strings.xml b/packages/BackupRestoreConfirmation/res/values-hi/strings.xml
index dd0c645..0b29804 100644
--- a/packages/BackupRestoreConfirmation/res/values-hi/strings.xml
+++ b/packages/BackupRestoreConfirmation/res/values-hi/strings.xml
@@ -16,22 +16,22 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="backup_confirm_title" msgid="827563724209303345">"पूरà¥à¤£ बैकअप"</string>
+ <string name="backup_confirm_title" msgid="827563724209303345">"पूरà¥à¤£ सà¥à¤°à¤•à¥à¤·à¤¾"</string>
<string name="restore_confirm_title" msgid="5469365809567486602">"पूरà¥à¤£ पà¥à¤¨à¤°à¥à¤¸à¥â€à¤¥à¤¾à¤ªà¤¨à¤¾"</string>
- <string name="backup_confirm_text" msgid="1878021282758896593">"कनेकà¥â€à¤Ÿ किâ€à¤ गठडेसà¥â€à¤•टॉप कंपà¥â€à¤¯à¥‚टर से सभी डेटा के संपूरà¥à¤£ बैकअप का अनà¥à¤°à¥‹à¤§ किâ€à¤¯à¤¾ गया है. कà¥â€à¤¯à¤¾ आप इसकी अनà¥à¤®à¤¤à¤¿â€ देना चाहते हैं?\n\nयदि†आपने सà¥â€à¤µà¤¯à¤‚ बैकअप का अनà¥à¤°à¥‹à¤§ नहीं किâ€à¤¯à¤¾ है, तो पà¥à¤°à¤•à¥à¤°à¤¿â€à¤¯à¤¾ जारी रखने की अनà¥à¤®à¤¤à¤¿â€ न दें."</string>
+ <string name="backup_confirm_text" msgid="1878021282758896593">"कनेकà¥â€à¤Ÿ किâ€à¤ गठडेसà¥â€à¤•टॉप कंपà¥â€à¤¯à¥‚टर से सभी डेटा के संपूरà¥à¤£ सà¥à¤°à¤•à¥à¤·à¤¾ का अनà¥à¤°à¥‹à¤§ किâ€à¤¯à¤¾ गया है. कà¥â€à¤¯à¤¾ आप इसकी अनà¥à¤®à¤¤à¤¿â€ देना चाहते हैं?\n\nयदि†आपने सà¥â€à¤µà¤¯à¤‚ बैकअप का अनà¥à¤°à¥‹à¤§ नहीं किâ€à¤¯à¤¾ है, तो पà¥à¤°à¤•à¥à¤°à¤¿â€à¤¯à¤¾ जारी रखने की अनà¥à¤®à¤¤à¤¿â€ न दें."</string>
<string name="allow_backup_button_label" msgid="4217228747769644068">"मेरे डेटा का बैकअप लें"</string>
<string name="deny_backup_button_label" msgid="6009119115581097708">"बैकअप न लें"</string>
<string name="restore_confirm_text" msgid="7499866728030461776">"कनेकà¥â€à¤Ÿ किâ€à¤ गठडेसà¥â€à¤•टॉप कंपà¥â€à¤¯à¥‚टर से सभी डेटा की पूरà¥à¤£ पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¨à¤¾ का अनà¥à¤°à¥‹à¤§ किâ€à¤¯à¤¾ गया है. कà¥â€à¤¯à¤¾ आप इसकी अनà¥à¤®à¤¤à¤¿â€ देना चाहते हैं?\n\nयदि†आपने सà¥â€à¤µà¤¯à¤‚ पà¥à¤¨à¤°à¥à¤ªà¥à¤°à¤¾à¤ªà¥à¤¤à¤¿â€ का अनà¥à¤°à¥‹à¤§ नहीं किâ€à¤¯à¤¾ है, तो पà¥à¤°à¤•à¥à¤°à¤¿â€à¤¯à¤¾ जारी रखने की अनà¥à¤®à¤¤à¤¿â€ न दें. इससे वरà¥à¤¤à¤®à¤¾à¤¨ में आपके उपकरण पर मौजूद डेटा बदल जाà¤à¤—ा!"</string>
<string name="allow_restore_button_label" msgid="3081286752277127827">"मेरा डेटा पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤ करें"</string>
<string name="deny_restore_button_label" msgid="1724367334453104378">"पà¥à¤¨à¤°à¥à¤¸à¥â€à¤¥à¤¾à¤ªà¤¿à¤¤ न करें"</string>
- <string name="current_password_text" msgid="8268189555578298067">"कृपया नीचे अपना वरà¥à¤¤à¤®à¤¾à¤¨ बैकअप पासवरà¥à¤¡ डालें:"</string>
+ <string name="current_password_text" msgid="8268189555578298067">"कृपया नीचे अपना वरà¥à¤¤à¤®à¤¾à¤¨ सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ करने का पासवरà¥à¤¡ डालें:"</string>
<string name="device_encryption_restore_text" msgid="1570864916855208992">"कृपया नीचे अपना उपकरण à¤à¤¨à¥â€à¤•à¥à¤°à¤¿à¤ªà¥à¤¶à¤¨ पासवरà¥à¤¡ डालें."</string>
- <string name="device_encryption_backup_text" msgid="5866590762672844664">"कृपया अपना उपकरण à¤à¤¨à¥à¤•à¥à¤°à¤¿à¤ªà¥à¤¶à¤¨ पासवरà¥à¤¡ नीचे दरà¥à¤œ करें. बैकअप संगà¥à¤°à¤¹à¤£ को à¤à¤¨à¥â€à¤•à¥à¤°à¤¿à¤ªà¥â€à¤Ÿ करने के लिठभी इसका उपयोग किया जाà¤à¤—ा."</string>
- <string name="backup_enc_password_text" msgid="4981585714795233099">"कृपया संपूरà¥à¤£ बैकअप डेटा को à¤à¤¨à¥â€à¤•à¥à¤°à¤¿â€à¤ªà¥â€à¤Ÿ करने में उपयोग के लिâ€à¤ पासवरà¥à¤¡ डालें. यदि†यह खाली छोड़ दिâ€à¤¯à¤¾ जाता है, तो आपके वरà¥à¤¤à¤®à¤¾à¤¨ बैकअप पासवरà¥à¤¡ का उपयोग किâ€à¤¯à¤¾ जाà¤à¤—ा:"</string>
- <string name="backup_enc_password_optional" msgid="1350137345907579306">"यदि†आप संपूरà¥à¤£ बैकअप डेटा à¤à¤¨à¥â€à¤•à¥à¤°à¤¿â€à¤ªà¥â€à¤Ÿ करना चाहते हैं, तो नीचे पासवरà¥à¤¡ डालें:"</string>
+ <string name="device_encryption_backup_text" msgid="5866590762672844664">"कृपया अपना उपकरण सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ तरीका पासवरà¥à¤¡ नीचे दरà¥à¤œ करें. बैकअप संगà¥à¤°à¤¹à¤£ को à¤à¤¨à¥â€à¤•à¥à¤°à¤¿à¤ªà¥â€à¤Ÿ करने के लिठभी इसका उपयोग किया जाà¤à¤—ा."</string>
+ <string name="backup_enc_password_text" msgid="4981585714795233099">"कृपया संपूरà¥à¤£ सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ डेटा को à¤à¤¨à¥â€à¤•à¥à¤°à¤¿â€à¤ªà¥â€à¤Ÿ करने में उपयोग के लिâ€à¤ पासवरà¥à¤¡ डालें. यदि†यह खाली छोड़ दिâ€à¤¯à¤¾ जाता है, तो आपके वरà¥à¤¤à¤®à¤¾à¤¨ बैकअप पासवरà¥à¤¡ का उपयोग किâ€à¤¯à¤¾ जाà¤à¤—ा:"</string>
+ <string name="backup_enc_password_optional" msgid="1350137345907579306">"यदि†आप संपूरà¥à¤£ सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ डेटा को à¤à¤¨à¥â€à¤•à¥à¤°à¤¿â€à¤ªà¥â€à¤Ÿ करना चाहते हैं, तो नीचे पासवरà¥à¤¡ डालें:"</string>
<string name="restore_enc_password_text" msgid="6140898525580710823">"यदि†पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤ डेटा को à¤à¤¨à¥â€à¤•à¥à¤°à¤¿â€à¤ªà¥â€à¤Ÿ किâ€à¤¯à¤¾ गया है, तो कृपया नीचे पासवरà¥à¤¡ डालें:"</string>
- <string name="toast_backup_started" msgid="550354281452756121">"बैकअप पà¥à¤°à¤¾à¤°à¤‚भ हो रहा है..."</string>
- <string name="toast_backup_ended" msgid="3818080769548726424">"बैकअप पूरà¥à¤£"</string>
+ <string name="toast_backup_started" msgid="550354281452756121">"सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ करना शà¥à¤°à¥ हो रहा है..."</string>
+ <string name="toast_backup_ended" msgid="3818080769548726424">"सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ करना पूरà¥à¤£"</string>
<string name="toast_restore_started" msgid="7881679218971277385">"पà¥à¤¨à¤°à¥à¤¸à¥â€à¤¥à¤¾à¤ªà¤¨à¤¾ पà¥à¤°à¤¾à¤°à¤‚भ हो रही है..."</string>
<string name="toast_restore_ended" msgid="1764041639199696132">"पà¥à¤¨à¤°à¥à¤¸à¥â€à¤¥à¤¾à¤ªà¤¨à¤¾ समापà¥à¤¤"</string>
<string name="toast_timeout" msgid="5276598587087626877">"कारà¥à¤¯à¤µà¤¾à¤¹à¥€ समयबाहà¥à¤¯ हो गई"</string>
diff --git a/packages/BackupRestoreConfirmation/res/values-hy-rAM/strings.xml b/packages/BackupRestoreConfirmation/res/values-hy-rAM/strings.xml
new file mode 100644
index 0000000..4db9080
--- /dev/null
+++ b/packages/BackupRestoreConfirmation/res/values-hy-rAM/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="backup_confirm_title" msgid="827563724209303345">"Ô±Õ´Õ¢Õ¸Õ²Õ»Õ¡Õ¯Õ¡Õ¶ ÕºÕ¡Õ°Õ¸Ö‚Õ½Õ¿Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´"</string>
+ <string name="restore_confirm_title" msgid="5469365809567486602">"Ô±Õ´Õ¢Õ¸Õ²Õ»Õ¡Õ¯Õ¡Õ¶ Õ¾Õ¥Ö€Õ¡Õ¯Õ¡Õ¶Õ£Õ¶Õ¸Ö‚Õ´"</string>
+ <string name="backup_confirm_text" msgid="1878021282758896593">"Ô¿Õ¡ÕºÕ¡Õ¯ÖÕ¾Õ¡Õ® Õ¡Õ·Õ­Õ¡Õ¿Õ¡Õ½Õ¥Õ²Õ¡Õ¶Õ¸Õ¾ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ¹Õ« Õ¾Ö€Õ¡ Õ¢Õ¸Õ¬Õ¸Ö€ Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ« Õ¬Ö€Õ«Õ¾ ÕºÕ¡Õ°Õ¸Ö‚Õ½Õ¿Õ¡Õ¾Õ¸Ö€Õ´Õ¡Õ¶ Õ°Õ¡Ö€ÖÕ¸Ö‚Õ´ Õ§ Õ¡Ö€Õ¾Õ¥Õ¬: Õ‘Õ¡Õ¶Õ¯Õ¡Õ¶Õ¸Ö‚ÕžÕ´ Õ¥Ö„ Õ©Õ¸Ö‚ÕµÕ¬Õ¡Õ¿Ö€Õ¥Õ¬ Õ°Õ¡Ö€ÖÕ´Õ¡Õ¶ Õ¯Õ¡Õ¿Õ¡Ö€Õ¸Ö‚Õ´Õ¨:\n\nÔµÕ©Õ¥ Õ¤Õ¸Ö‚Ö„ Õ«Õ¶Ö„Õ¶Õ¥Ö€Õ¤ ÕºÕ¡Õ°Õ¸Ö‚Õ½Õ¿Õ¡Õ¾Õ¸Ö€Õ´Õ¡Õ¶ Õ°Õ¡Ö€ÖÕ¸Ö‚Õ´ Õ¹Õ¥Ö„ Õ¡Ö€Õ¥Õ¬, Õ©Õ¸Ö‚ÕµÕ¬ Õ´Õ« Õ¿Õ¾Õ¥Ö„, Õ¸Ö€ÕºÕ¥Õ½Õ¦Õ« Õ£Õ¸Ö€Õ®Õ¸Õ²Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Õ·Õ¡Ö€Õ¸Ö‚Õ¶Õ¡Õ¯Õ¾Õ«:"</string>
+ <string name="allow_backup_button_label" msgid="4217228747769644068">"ÕŠÕ¡Õ°Õ¸Ö‚Õ½Õ¿Õ¡Õ¾Õ¸Ö€Õ¥Õ¬ Õ«Õ´ Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨"</string>
+ <string name="deny_backup_button_label" msgid="6009119115581097708">"Õ‰ÕºÕ¡Õ°Õ¸Ö‚Õ½Õ¿Õ¡Õ¾Õ¸Ö€Õ¥Õ¬"</string>
+ <string name="restore_confirm_text" msgid="7499866728030461776">"Õ€Õ¡ÕµÖÕ¾Õ¥Õ¬ Õ§ Õ¢Õ¸Õ¬Õ¸Ö€ Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ« Õ¡Õ´Õ¢Õ¸Õ²Õ»Õ¡Õ¯Õ¡Õ¶ Õ¾Õ¥Ö€Õ¡Õ¯Õ¡Õ¶Õ£Õ¶Õ¸Ö‚Õ´ Õ´Õ«Õ¡ÖÕ¾Õ¡Õ® Õ¡Õ·Õ­Õ¡Õ¿Õ¡Õ¶Ö„Õ¡ÕµÕ«Õ¶ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ¹Õ«Ö: Õ‘Õ¡Õ¶Õ¯Õ¡Õ¶Õ¸Ö‚ÕžÕ´ Õ¥Ö„ Õ©Õ¸Ö‚ÕµÕ¬Õ¡Õ¿Ö€Õ¥Õ¬, Õ¸Ö€ Õ¤Õ¡ Õ¿Õ¥Õ²Õ« Õ¸Ö‚Õ¶Õ¥Õ¶Õ¡:\n\nÔµÕ©Õ¥ Õ¾Õ¥Ö€Õ¡Õ¯Õ¡Õ¶Õ£Õ¶Õ¸Ö‚Õ´Õ¨ Õ«Õ¶Ö„Õ¶Õ¥Ö€Õ¤ Õ¹Õ¥Ö„ Õ°Õ¡ÕµÖÕ¥Õ¬, Õ©Õ¸Ö‚jÕ¬ Õ´Õ« Õ¿Õ¾Õ¥Ö„, Õ¸Ö€ Õ£Õ¸Ö€Õ®Õ¸Õ²Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Õ·Õ¡Ö€Õ¸Ö‚Õ¶Õ¡Õ¯Õ¾Õ«: Ô´Õ¡ Õ¯ÖƒÕ¸Õ­Õ¡Ö€Õ«Õ¶Õ« Õ¶Õ¥Ö€Õ¯Õ¡ÕµÕ¸Ö‚Õ´ Õ°Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ« Õ´Õ¥Õ» Õ£Õ¿Õ¶Õ¾Õ¸Õ² ÖÕ¡Õ¶Õ¯Õ¡ÖÕ¡Õ® Õ¿Õ¾ÕµÕ¡Õ¬:"</string>
+ <string name="allow_restore_button_label" msgid="3081286752277127827">"ÕŽÕ¥Ö€Õ¡Õ¯Õ¡Õ¶Õ£Õ¶Õ¥Õ¬ Õ«Õ´ Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨"</string>
+ <string name="deny_restore_button_label" msgid="1724367334453104378">"Õ‰Õ¾Õ¥Ö€Õ¡Õ¯Õ¡Õ¶Õ£Õ¶Õ¥Õ¬"</string>
+ <string name="current_password_text" msgid="8268189555578298067">"Ô½Õ¶Õ¤Ö€Õ¸Ö‚Õ´ Õ¥Õ¶Ö„ Õ´Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ¥Õ¬ Õ±Õ¥Ö€ Õ¨Õ¶Õ©Õ¡ÖÕ«Õ¯ ÕºÕ¡Õ°Õ¸Ö‚Õ½Õ¿Õ¡ÕµÕ«Õ¶ Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ¨ Õ¶Õ¥Ö€Ö„Ö‡Õ¸Ö‚Õ´`"</string>
+ <string name="device_encryption_restore_text" msgid="1570864916855208992">"Ô½Õ¶Õ¤Ö€Õ¸Ö‚Õ´ Õ¥Õ¶Ö„ Õ´Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ¥Õ¬ Õ±Õ¥Ö€ Õ½Õ¡Ö€Ö„Õ« Õ¯Õ¸Õ¤Õ¡Õ¾Õ¸Ö€Õ¾Õ¡Õ® Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ¨ Õ¶Õ¥Ö€Ö„Ö‡Õ¸Ö‚Õ´:"</string>
+ <string name="device_encryption_backup_text" msgid="5866590762672844664">"Ô½Õ¶Õ¤Ö€Õ¸Ö‚Õ´ Õ¥Õ¶Ö„ Õ´Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ¥Õ¬ Õ±Õ¥Ö€ Õ½Õ¡Ö€Ö„Õ« Õ¯Õ¸Õ¤Õ¡Õ¾Õ¸Ö€Õ¾Õ¡Õ® Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ¨ Õ¶Õ¥Ö€Ö„Ö‡Õ¸Ö‚Õ´: Ô±ÕµÕ¶ Õ¶Õ¡Ö‡ Õ¯Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¾Õ« ÕºÕ¡Õ°Õ¸Ö‚Õ½Õ¿Õ¡ÕµÕ«Õ¶ Õ¡Ö€Õ­Õ«Õ¾Õ« Õ¯Õ¸Õ¤Õ¡Õ¾Õ¸Ö€Õ´Õ¡Õ¶ Õ°Õ¡Õ´Õ¡Ö€:"</string>
+ <string name="backup_enc_password_text" msgid="4981585714795233099">"Խնդրում ենք մուտքագրել գաղտնաբառը` ամբողջական պահուստավորվող տվյալները կոդավորելու համար: Եթե ​​այն դատարկ թողնեք, ապա կօգտագործվի ձեր առկա պահուստավորման գաղտնաբառը`"</string>
+ <string name="backup_enc_password_optional" msgid="1350137345907579306">"ÔµÕ©Õ¥ ​​ÖÕ¡Õ¶Õ¯Õ¡Õ¶Õ¸Ö‚Õ´ Õ¥Ö„ Õ¯Õ¸Õ¤Õ¡Õ¾Õ¸Ö€Õ¥Õ¬ Õ¡Õ´Õ¢Õ¸Õ²Õ»Õ¡Õ¯Õ¡Õ¶ ÕºÕ¡Õ°Õ¸Ö‚Õ½Õ¿Õ¡Õ¾Õ¸Ö€Õ¾Õ¡Õ® Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨, Õ´Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ¥Ö„ Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼ Õ½Õ¿Õ¸Ö€Ö‡`"</string>
+ <string name="restore_enc_password_text" msgid="6140898525580710823">"Եթե ​​վերականգնվող տվյալները կոդավորված են, խնդրում ենք մուտքագրել գաղտնաբառը ստորև`"</string>
+ <string name="toast_backup_started" msgid="550354281452756121">"ÕŠÕ¡Õ°Õ¸Ö‚Õ½Õ¿Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´Õ¨ Õ½Õ¯Õ½Õ¾Õ¸Ö‚Õ´ Õ§..."</string>
+ <string name="toast_backup_ended" msgid="3818080769548726424">"ÕŠÕ¡Õ°Õ¸Ö‚Õ½Õ¿Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´Õ¶ Õ¡Õ¾Õ¡Ö€Õ¿Õ¾Õ¥Ö"</string>
+ <string name="toast_restore_started" msgid="7881679218971277385">"ÕŽÕ¥Ö€Õ¡Õ¯Õ¡Õ¶Õ£Õ¶Õ¸Ö‚Õ´Õ¨ Õ´Õ¥Õ¯Õ¶Õ¡Ö€Õ¯Õ¥Ö..."</string>
+ <string name="toast_restore_ended" msgid="1764041639199696132">"ÕŽÕ¥Ö€Õ¡Õ¯Õ¡Õ¶Õ£Õ¶Õ¸Ö‚Õ´Õ¶ Õ¡Õ¾Õ¡Ö€Õ¿Õ¾Õ¥Ö"</string>
+ <string name="toast_timeout" msgid="5276598587087626877">"Ô³Õ¸Ö€Õ®Õ¸Õ²Õ¸Ö‚Õ©ÕµÕ¡Õ¶ ÕªÕ¡Õ´Õ¡Õ¶Õ¡Õ¯Õ¨ Õ½ÕºÕ¡Õ¼Õ¾Õ¥Ö"</string>
+</resources>
diff --git a/packages/BackupRestoreConfirmation/res/values-hy/strings.xml b/packages/BackupRestoreConfirmation/res/values-hy/strings.xml
new file mode 100644
index 0000000..4db9080
--- /dev/null
+++ b/packages/BackupRestoreConfirmation/res/values-hy/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="backup_confirm_title" msgid="827563724209303345">"Ô±Õ´Õ¢Õ¸Õ²Õ»Õ¡Õ¯Õ¡Õ¶ ÕºÕ¡Õ°Õ¸Ö‚Õ½Õ¿Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´"</string>
+ <string name="restore_confirm_title" msgid="5469365809567486602">"Ô±Õ´Õ¢Õ¸Õ²Õ»Õ¡Õ¯Õ¡Õ¶ Õ¾Õ¥Ö€Õ¡Õ¯Õ¡Õ¶Õ£Õ¶Õ¸Ö‚Õ´"</string>
+ <string name="backup_confirm_text" msgid="1878021282758896593">"Ô¿Õ¡ÕºÕ¡Õ¯ÖÕ¾Õ¡Õ® Õ¡Õ·Õ­Õ¡Õ¿Õ¡Õ½Õ¥Õ²Õ¡Õ¶Õ¸Õ¾ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ¹Õ« Õ¾Ö€Õ¡ Õ¢Õ¸Õ¬Õ¸Ö€ Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ« Õ¬Ö€Õ«Õ¾ ÕºÕ¡Õ°Õ¸Ö‚Õ½Õ¿Õ¡Õ¾Õ¸Ö€Õ´Õ¡Õ¶ Õ°Õ¡Ö€ÖÕ¸Ö‚Õ´ Õ§ Õ¡Ö€Õ¾Õ¥Õ¬: Õ‘Õ¡Õ¶Õ¯Õ¡Õ¶Õ¸Ö‚ÕžÕ´ Õ¥Ö„ Õ©Õ¸Ö‚ÕµÕ¬Õ¡Õ¿Ö€Õ¥Õ¬ Õ°Õ¡Ö€ÖÕ´Õ¡Õ¶ Õ¯Õ¡Õ¿Õ¡Ö€Õ¸Ö‚Õ´Õ¨:\n\nÔµÕ©Õ¥ Õ¤Õ¸Ö‚Ö„ Õ«Õ¶Ö„Õ¶Õ¥Ö€Õ¤ ÕºÕ¡Õ°Õ¸Ö‚Õ½Õ¿Õ¡Õ¾Õ¸Ö€Õ´Õ¡Õ¶ Õ°Õ¡Ö€ÖÕ¸Ö‚Õ´ Õ¹Õ¥Ö„ Õ¡Ö€Õ¥Õ¬, Õ©Õ¸Ö‚ÕµÕ¬ Õ´Õ« Õ¿Õ¾Õ¥Ö„, Õ¸Ö€ÕºÕ¥Õ½Õ¦Õ« Õ£Õ¸Ö€Õ®Õ¸Õ²Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Õ·Õ¡Ö€Õ¸Ö‚Õ¶Õ¡Õ¯Õ¾Õ«:"</string>
+ <string name="allow_backup_button_label" msgid="4217228747769644068">"ÕŠÕ¡Õ°Õ¸Ö‚Õ½Õ¿Õ¡Õ¾Õ¸Ö€Õ¥Õ¬ Õ«Õ´ Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨"</string>
+ <string name="deny_backup_button_label" msgid="6009119115581097708">"Õ‰ÕºÕ¡Õ°Õ¸Ö‚Õ½Õ¿Õ¡Õ¾Õ¸Ö€Õ¥Õ¬"</string>
+ <string name="restore_confirm_text" msgid="7499866728030461776">"Õ€Õ¡ÕµÖÕ¾Õ¥Õ¬ Õ§ Õ¢Õ¸Õ¬Õ¸Ö€ Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ« Õ¡Õ´Õ¢Õ¸Õ²Õ»Õ¡Õ¯Õ¡Õ¶ Õ¾Õ¥Ö€Õ¡Õ¯Õ¡Õ¶Õ£Õ¶Õ¸Ö‚Õ´ Õ´Õ«Õ¡ÖÕ¾Õ¡Õ® Õ¡Õ·Õ­Õ¡Õ¿Õ¡Õ¶Ö„Õ¡ÕµÕ«Õ¶ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ¹Õ«Ö: Õ‘Õ¡Õ¶Õ¯Õ¡Õ¶Õ¸Ö‚ÕžÕ´ Õ¥Ö„ Õ©Õ¸Ö‚ÕµÕ¬Õ¡Õ¿Ö€Õ¥Õ¬, Õ¸Ö€ Õ¤Õ¡ Õ¿Õ¥Õ²Õ« Õ¸Ö‚Õ¶Õ¥Õ¶Õ¡:\n\nÔµÕ©Õ¥ Õ¾Õ¥Ö€Õ¡Õ¯Õ¡Õ¶Õ£Õ¶Õ¸Ö‚Õ´Õ¨ Õ«Õ¶Ö„Õ¶Õ¥Ö€Õ¤ Õ¹Õ¥Ö„ Õ°Õ¡ÕµÖÕ¥Õ¬, Õ©Õ¸Ö‚jÕ¬ Õ´Õ« Õ¿Õ¾Õ¥Ö„, Õ¸Ö€ Õ£Õ¸Ö€Õ®Õ¸Õ²Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Õ·Õ¡Ö€Õ¸Ö‚Õ¶Õ¡Õ¯Õ¾Õ«: Ô´Õ¡ Õ¯ÖƒÕ¸Õ­Õ¡Ö€Õ«Õ¶Õ« Õ¶Õ¥Ö€Õ¯Õ¡ÕµÕ¸Ö‚Õ´ Õ°Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ« Õ´Õ¥Õ» Õ£Õ¿Õ¶Õ¾Õ¸Õ² ÖÕ¡Õ¶Õ¯Õ¡ÖÕ¡Õ® Õ¿Õ¾ÕµÕ¡Õ¬:"</string>
+ <string name="allow_restore_button_label" msgid="3081286752277127827">"ÕŽÕ¥Ö€Õ¡Õ¯Õ¡Õ¶Õ£Õ¶Õ¥Õ¬ Õ«Õ´ Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨"</string>
+ <string name="deny_restore_button_label" msgid="1724367334453104378">"Õ‰Õ¾Õ¥Ö€Õ¡Õ¯Õ¡Õ¶Õ£Õ¶Õ¥Õ¬"</string>
+ <string name="current_password_text" msgid="8268189555578298067">"Ô½Õ¶Õ¤Ö€Õ¸Ö‚Õ´ Õ¥Õ¶Ö„ Õ´Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ¥Õ¬ Õ±Õ¥Ö€ Õ¨Õ¶Õ©Õ¡ÖÕ«Õ¯ ÕºÕ¡Õ°Õ¸Ö‚Õ½Õ¿Õ¡ÕµÕ«Õ¶ Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ¨ Õ¶Õ¥Ö€Ö„Ö‡Õ¸Ö‚Õ´`"</string>
+ <string name="device_encryption_restore_text" msgid="1570864916855208992">"Ô½Õ¶Õ¤Ö€Õ¸Ö‚Õ´ Õ¥Õ¶Ö„ Õ´Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ¥Õ¬ Õ±Õ¥Ö€ Õ½Õ¡Ö€Ö„Õ« Õ¯Õ¸Õ¤Õ¡Õ¾Õ¸Ö€Õ¾Õ¡Õ® Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ¨ Õ¶Õ¥Ö€Ö„Ö‡Õ¸Ö‚Õ´:"</string>
+ <string name="device_encryption_backup_text" msgid="5866590762672844664">"Ô½Õ¶Õ¤Ö€Õ¸Ö‚Õ´ Õ¥Õ¶Ö„ Õ´Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ¥Õ¬ Õ±Õ¥Ö€ Õ½Õ¡Ö€Ö„Õ« Õ¯Õ¸Õ¤Õ¡Õ¾Õ¸Ö€Õ¾Õ¡Õ® Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ¨ Õ¶Õ¥Ö€Ö„Ö‡Õ¸Ö‚Õ´: Ô±ÕµÕ¶ Õ¶Õ¡Ö‡ Õ¯Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¾Õ« ÕºÕ¡Õ°Õ¸Ö‚Õ½Õ¿Õ¡ÕµÕ«Õ¶ Õ¡Ö€Õ­Õ«Õ¾Õ« Õ¯Õ¸Õ¤Õ¡Õ¾Õ¸Ö€Õ´Õ¡Õ¶ Õ°Õ¡Õ´Õ¡Ö€:"</string>
+ <string name="backup_enc_password_text" msgid="4981585714795233099">"Խնդրում ենք մուտքագրել գաղտնաբառը` ամբողջական պահուստավորվող տվյալները կոդավորելու համար: Եթե ​​այն դատարկ թողնեք, ապա կօգտագործվի ձեր առկա պահուստավորման գաղտնաբառը`"</string>
+ <string name="backup_enc_password_optional" msgid="1350137345907579306">"ÔµÕ©Õ¥ ​​ÖÕ¡Õ¶Õ¯Õ¡Õ¶Õ¸Ö‚Õ´ Õ¥Ö„ Õ¯Õ¸Õ¤Õ¡Õ¾Õ¸Ö€Õ¥Õ¬ Õ¡Õ´Õ¢Õ¸Õ²Õ»Õ¡Õ¯Õ¡Õ¶ ÕºÕ¡Õ°Õ¸Ö‚Õ½Õ¿Õ¡Õ¾Õ¸Ö€Õ¾Õ¡Õ® Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨, Õ´Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ¥Ö„ Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼ Õ½Õ¿Õ¸Ö€Ö‡`"</string>
+ <string name="restore_enc_password_text" msgid="6140898525580710823">"Եթե ​​վերականգնվող տվյալները կոդավորված են, խնդրում ենք մուտքագրել գաղտնաբառը ստորև`"</string>
+ <string name="toast_backup_started" msgid="550354281452756121">"ÕŠÕ¡Õ°Õ¸Ö‚Õ½Õ¿Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´Õ¨ Õ½Õ¯Õ½Õ¾Õ¸Ö‚Õ´ Õ§..."</string>
+ <string name="toast_backup_ended" msgid="3818080769548726424">"ÕŠÕ¡Õ°Õ¸Ö‚Õ½Õ¿Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´Õ¶ Õ¡Õ¾Õ¡Ö€Õ¿Õ¾Õ¥Ö"</string>
+ <string name="toast_restore_started" msgid="7881679218971277385">"ÕŽÕ¥Ö€Õ¡Õ¯Õ¡Õ¶Õ£Õ¶Õ¸Ö‚Õ´Õ¨ Õ´Õ¥Õ¯Õ¶Õ¡Ö€Õ¯Õ¥Ö..."</string>
+ <string name="toast_restore_ended" msgid="1764041639199696132">"ÕŽÕ¥Ö€Õ¡Õ¯Õ¡Õ¶Õ£Õ¶Õ¸Ö‚Õ´Õ¶ Õ¡Õ¾Õ¡Ö€Õ¿Õ¾Õ¥Ö"</string>
+ <string name="toast_timeout" msgid="5276598587087626877">"Ô³Õ¸Ö€Õ®Õ¸Õ²Õ¸Ö‚Õ©ÕµÕ¡Õ¶ ÕªÕ¡Õ´Õ¡Õ¶Õ¡Õ¯Õ¨ Õ½ÕºÕ¡Õ¼Õ¾Õ¥Ö"</string>
+</resources>
diff --git a/packages/BackupRestoreConfirmation/res/values-ka-rGE/strings.xml b/packages/BackupRestoreConfirmation/res/values-ka-rGE/strings.xml
new file mode 100644
index 0000000..9c6f67e
--- /dev/null
+++ b/packages/BackupRestoreConfirmation/res/values-ka-rGE/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="backup_confirm_title" msgid="827563724209303345">"სრული სáƒáƒ áƒ”ზერვრკáƒáƒžáƒ˜áƒ áƒ”ბáƒ"</string>
+ <string name="restore_confirm_title" msgid="5469365809567486602">"სრულáƒáƒ“ áƒáƒ¦áƒ“გენáƒ"</string>
+ <string name="backup_confirm_text" msgid="1878021282758896593">"მáƒáƒ—ხáƒáƒ•ნილ იქნრსáƒáƒ›áƒáƒ’იდრკáƒáƒ›áƒžáƒ˜áƒ£áƒ¢áƒ”რთáƒáƒœ დáƒáƒ™áƒáƒ•შირებული ყველრმáƒáƒœáƒáƒªáƒ”მის სრულყáƒáƒ¤áƒ˜áƒšáƒ˜ სáƒáƒ áƒ”ზერვრáƒáƒ¡áƒšáƒ”ბი. \n\nთუ სáƒáƒ áƒ”ზერვრáƒáƒ¡áƒšáƒ”ბი თქვენ áƒáƒ  მáƒáƒ’ითხáƒáƒ•იáƒáƒ—, áƒáƒ  დáƒáƒ£áƒ¨áƒ•áƒáƒ— áƒáƒ› áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ’რძელებáƒ."</string>
+ <string name="allow_backup_button_label" msgid="4217228747769644068">"ჩემი მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ áƒ”ზერვრკáƒáƒžáƒ˜áƒ áƒ”ბáƒ"</string>
+ <string name="deny_backup_button_label" msgid="6009119115581097708">"სáƒáƒ áƒ”ზერვრáƒáƒ¡áƒšáƒ”ბი áƒáƒ  გáƒáƒáƒ™áƒ”თáƒ"</string>
+ <string name="restore_confirm_text" msgid="7499866728030461776">"დáƒáƒ™áƒáƒ•შირებული დესკტáƒáƒž კáƒáƒ›áƒžáƒ˜áƒ£áƒ¢áƒ”რიდáƒáƒœ მáƒáƒ®áƒ“რყველრმáƒáƒœáƒáƒªáƒ”მის სრული áƒáƒ¦áƒ“გენის მáƒáƒ—ხáƒáƒ•ნáƒ. გსურთ, დáƒáƒ£áƒ¨áƒ•áƒáƒ— ეს?\n\nთუ თქვენ თვითáƒáƒœ áƒáƒ  მáƒáƒ˜áƒ—ხáƒáƒ•ეთ áƒáƒ¦áƒ“გენáƒ, áƒáƒ  დáƒáƒ£áƒ¨áƒ•áƒáƒ— áƒáƒ› áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ’რძელებáƒ. ის ჩáƒáƒáƒœáƒáƒªáƒ•ლებს მáƒáƒ¬áƒ§áƒáƒ‘ილáƒáƒ‘áƒáƒ–ე áƒáƒ›áƒŸáƒáƒ›áƒáƒ“ áƒáƒ áƒ¡áƒ”ბულ ნებისმიერ მáƒáƒœáƒáƒªáƒ”მს!"</string>
+ <string name="allow_restore_button_label" msgid="3081286752277127827">"ჩემი მáƒáƒœáƒáƒªáƒ”მების áƒáƒ¦áƒ“გენáƒ"</string>
+ <string name="deny_restore_button_label" msgid="1724367334453104378">"áƒáƒ  áƒáƒ¦áƒáƒ“გინáƒ"</string>
+ <string name="current_password_text" msgid="8268189555578298067">"გთხáƒáƒ•თ, ქვემáƒáƒ— მიუთითáƒáƒ— თქვენი áƒáƒ›áƒŸáƒáƒ›áƒ˜áƒœáƒ“ელი სáƒáƒ—áƒáƒ“áƒáƒ áƒ˜áƒ’რპáƒáƒ áƒáƒšáƒ˜:"</string>
+ <string name="device_encryption_restore_text" msgid="1570864916855208992">"გთხáƒáƒ•თ, ქვემáƒáƒ— მიუთითáƒáƒ— თქვენი მáƒáƒ¬áƒ§áƒáƒ‘ილáƒáƒ‘ის დáƒáƒ¨áƒ˜áƒ¤áƒ•რის პáƒáƒ áƒáƒšáƒ˜."</string>
+ <string name="device_encryption_backup_text" msgid="5866590762672844664">"გთხáƒáƒ•თ, ქვემáƒáƒ— მიუთითáƒáƒ— თქვენი მáƒáƒ¬áƒ§áƒáƒ‘ილáƒáƒ‘ის დáƒáƒ¨áƒ˜áƒ¤áƒ•რის პáƒáƒ áƒáƒšáƒ˜. ეს áƒáƒ¡áƒ”ვე გáƒáƒ›áƒáƒ§áƒ”ნებული იქნებრსáƒáƒ—áƒáƒ“áƒáƒ áƒ˜áƒ’რáƒáƒ áƒ¥áƒ˜áƒ•ის დáƒáƒ¨áƒ˜áƒ¤áƒ áƒ•ისáƒáƒ—ვის."</string>
+ <string name="backup_enc_password_text" msgid="4981585714795233099">"გთხáƒáƒ•თ შეიყვáƒáƒœáƒáƒ— ყველრსáƒáƒ›áƒáƒ áƒ¥áƒáƒ¤áƒ áƒáƒ¡áƒšáƒ˜áƒ¡ დáƒáƒ¨áƒ˜áƒ¤áƒ áƒ•ის პáƒáƒ áƒáƒšáƒ˜. თუ áƒáƒ› ველს ცáƒáƒ áƒ˜áƒ”ლს დáƒáƒ¢áƒáƒ•ებთ, გáƒáƒ›áƒáƒ§áƒ”ნებული იქნებრმიმდინáƒáƒ áƒ” პáƒáƒ áƒáƒšáƒ˜:"</string>
+ <string name="backup_enc_password_optional" msgid="1350137345907579306">"თუ გსურთ სრული ლáƒáƒ™áƒáƒšáƒ£áƒ áƒ˜ სáƒáƒ áƒ”ზერვრკáƒáƒžáƒ˜áƒ˜áƒ¡ დáƒáƒ¨áƒ˜áƒ¤áƒ áƒ•áƒ, შეიყვáƒáƒœáƒ”თ პáƒáƒ áƒáƒšáƒ˜ ქვემáƒáƒ—:"</string>
+ <string name="restore_enc_password_text" msgid="6140898525580710823">"თუ áƒáƒ¦áƒ¡áƒáƒ“გენი მáƒáƒœáƒáƒªáƒ”მები დáƒáƒ¨áƒ˜áƒ¤áƒ áƒ£áƒšáƒ˜áƒ, გთხáƒáƒ•თ, შეიყვáƒáƒœáƒáƒ— პáƒáƒ áƒáƒšáƒ˜ ქვემáƒáƒ—:"</string>
+ <string name="toast_backup_started" msgid="550354281452756121">"áƒáƒ¡áƒšáƒ”ბის მáƒáƒ›áƒ–áƒáƒ“ებრიწყებáƒ..."</string>
+ <string name="toast_backup_ended" msgid="3818080769548726424">"სáƒáƒ áƒ”ზერვრკáƒáƒžáƒ˜áƒ áƒ”ბრდáƒáƒ¡áƒ áƒ£áƒšáƒ”ბულიáƒ"</string>
+ <string name="toast_restore_started" msgid="7881679218971277385">"áƒáƒ¦áƒ“გენრიწყებáƒ..."</string>
+ <string name="toast_restore_ended" msgid="1764041639199696132">"áƒáƒ¦áƒ“გენრდáƒáƒ¡áƒ áƒ£áƒšáƒ“áƒ"</string>
+ <string name="toast_timeout" msgid="5276598587087626877">"áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ˜áƒ¡ დრáƒáƒ˜áƒ¡ ლიმიტი áƒáƒ›áƒáƒ˜áƒ¬áƒ£áƒ áƒ"</string>
+</resources>
diff --git a/packages/BackupRestoreConfirmation/res/values-ka/strings.xml b/packages/BackupRestoreConfirmation/res/values-ka/strings.xml
new file mode 100644
index 0000000..49b72e1
--- /dev/null
+++ b/packages/BackupRestoreConfirmation/res/values-ka/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="backup_confirm_title" msgid="827563724209303345">"სრული დáƒáƒ›áƒáƒ áƒ¥áƒáƒ¤áƒ”ბáƒ"</string>
+ <string name="restore_confirm_title" msgid="5469365809567486602">"სრულáƒáƒ“ áƒáƒ¦áƒ“გენáƒ"</string>
+ <string name="backup_confirm_text" msgid="1878021282758896593">"მáƒáƒ—ხáƒáƒ•ნილ იქნრსáƒáƒ›áƒáƒ’იდრკáƒáƒ›áƒžáƒ˜áƒ£áƒ¢áƒ”რთáƒáƒœ დáƒáƒ™áƒáƒ•შირებული ყველრმáƒáƒœáƒáƒªáƒ”მის სრულყáƒáƒ¤áƒ˜áƒšáƒ˜ სáƒáƒ áƒ”ზერვრáƒáƒ¡áƒšáƒ”ბი. \n\nთუ სáƒáƒ áƒ”ზერვრáƒáƒ¡áƒšáƒ”ბი თქვენ áƒáƒ  მáƒáƒ’ითხáƒáƒ•იáƒáƒ—, áƒáƒ  დáƒáƒ£áƒ¨áƒ•áƒáƒ— áƒáƒ› áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ’რძელებáƒ."</string>
+ <string name="allow_backup_button_label" msgid="4217228747769644068">"ჩემი მáƒáƒœáƒáƒªáƒ”მების დáƒáƒ›áƒáƒ áƒ¥áƒáƒ¤áƒ”ბáƒ"</string>
+ <string name="deny_backup_button_label" msgid="6009119115581097708">"სáƒáƒ áƒ”ზერვრáƒáƒ¡áƒšáƒ”ბი áƒáƒ  გáƒáƒáƒ™áƒ”თáƒ"</string>
+ <string name="restore_confirm_text" msgid="7499866728030461776">"დáƒáƒ™áƒáƒ•შირებული დესკტáƒáƒž კáƒáƒ›áƒžáƒ˜áƒ£áƒ¢áƒ”რიდáƒáƒœ მáƒáƒ®áƒ“რყველრმáƒáƒœáƒáƒªáƒ”მის სრული áƒáƒ¦áƒ“გენის მáƒáƒ—ხáƒáƒ•ნáƒ. გსურთ, დáƒáƒ£áƒ¨áƒ•áƒáƒ— ეს?\n\nთუ თქვენ თვითáƒáƒœ áƒáƒ  მáƒáƒ˜áƒ—ხáƒáƒ•ეთ áƒáƒ¦áƒ“გენáƒ, áƒáƒ  დáƒáƒ£áƒ¨áƒ•áƒáƒ— áƒáƒ› áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ’რძელებáƒ. ის ჩáƒáƒáƒœáƒáƒªáƒ•ლებს მáƒáƒ¬áƒ§áƒáƒ‘ილáƒáƒ‘áƒáƒ–ე áƒáƒ›áƒŸáƒáƒ›áƒáƒ“ áƒáƒ áƒ¡áƒ”ბულ ნებისმიერ მáƒáƒœáƒáƒªáƒ”მს!"</string>
+ <string name="allow_restore_button_label" msgid="3081286752277127827">"ჩემი მáƒáƒœáƒáƒªáƒ”მების áƒáƒ¦áƒ“გენáƒ"</string>
+ <string name="deny_restore_button_label" msgid="1724367334453104378">"áƒáƒ  áƒáƒ¦áƒáƒ“გინáƒ"</string>
+ <string name="current_password_text" msgid="8268189555578298067">"გთხáƒáƒ•თ, ქვემáƒáƒ— მიუთითáƒáƒ— თქვენი áƒáƒ›áƒŸáƒáƒ›áƒ˜áƒœáƒ“ელი სáƒáƒ—áƒáƒ“áƒáƒ áƒ˜áƒ’რპáƒáƒ áƒáƒšáƒ˜:"</string>
+ <string name="device_encryption_restore_text" msgid="1570864916855208992">"გთხáƒáƒ•თ, ქვემáƒáƒ— მიუთითáƒáƒ— თქვენი მáƒáƒ¬áƒ§áƒáƒ‘ილáƒáƒ‘ის დáƒáƒ¨áƒ˜áƒ¤áƒ•რის პáƒáƒ áƒáƒšáƒ˜."</string>
+ <string name="device_encryption_backup_text" msgid="5866590762672844664">"გთხáƒáƒ•თ, ქვემáƒáƒ— მიუთითáƒáƒ— თქვენი მáƒáƒ¬áƒ§áƒáƒ‘ილáƒáƒ‘ის დáƒáƒ¨áƒ˜áƒ¤áƒ•რის პáƒáƒ áƒáƒšáƒ˜. ეს áƒáƒ¡áƒ”ვე გáƒáƒ›áƒáƒ§áƒ”ნებული იქნებრსáƒáƒ—áƒáƒ“áƒáƒ áƒ˜áƒ’რáƒáƒ áƒ¥áƒ˜áƒ•ის დáƒáƒ¨áƒ˜áƒ¤áƒ áƒ•ისáƒáƒ—ვის."</string>
+ <string name="backup_enc_password_text" msgid="4981585714795233099">"გთხáƒáƒ•თ შეიყვáƒáƒœáƒáƒ— ყველრსáƒáƒ›áƒáƒ áƒ¥áƒáƒ¤áƒ áƒáƒ¡áƒšáƒ˜áƒ¡ დáƒáƒ¨áƒ˜áƒ¤áƒ áƒ•ის პáƒáƒ áƒáƒšáƒ˜. თუ áƒáƒ› ველს ცáƒáƒ áƒ˜áƒ”ლს დáƒáƒ¢áƒáƒ•ებთ, გáƒáƒ›áƒáƒ§áƒ”ნებული იქნებრმიმდინáƒáƒ áƒ” პáƒáƒ áƒáƒšáƒ˜:"</string>
+ <string name="backup_enc_password_optional" msgid="1350137345907579306">"თუ გსურთ მთელი დáƒáƒ›áƒáƒ áƒ¥áƒáƒ¤áƒ”ბული მáƒáƒœáƒáƒªáƒ”მების დáƒáƒ¨áƒ˜áƒ¤áƒ áƒ•áƒ, შეიყვáƒáƒœáƒ”თ პáƒáƒ áƒáƒšáƒ˜ ქვემáƒáƒ—:"</string>
+ <string name="restore_enc_password_text" msgid="6140898525580710823">"თუ áƒáƒ¦áƒ¡áƒáƒ“გენი მáƒáƒœáƒáƒªáƒ”მები დáƒáƒ¨áƒ˜áƒ¤áƒ áƒ£áƒšáƒ˜áƒ, გთხáƒáƒ•თ, შეიყვáƒáƒœáƒáƒ— პáƒáƒ áƒáƒšáƒ˜ ქვემáƒáƒ—:"</string>
+ <string name="toast_backup_started" msgid="550354281452756121">"áƒáƒ¡áƒšáƒ”ბის მáƒáƒ›áƒ–áƒáƒ“ებრიწყებáƒ..."</string>
+ <string name="toast_backup_ended" msgid="3818080769548726424">"დáƒáƒ›áƒáƒ áƒ¥áƒáƒ¤áƒ”ბრდáƒáƒ¡áƒ áƒ£áƒšáƒ“áƒ"</string>
+ <string name="toast_restore_started" msgid="7881679218971277385">"áƒáƒ¦áƒ“გენრიწყებáƒ..."</string>
+ <string name="toast_restore_ended" msgid="1764041639199696132">"áƒáƒ¦áƒ“გენრდáƒáƒ¡áƒ áƒ£áƒšáƒ“áƒ"</string>
+ <string name="toast_timeout" msgid="5276598587087626877">"áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ˜áƒ¡ დრáƒáƒ˜áƒ¡ ლიმიტი áƒáƒ›áƒáƒ˜áƒ¬áƒ£áƒ áƒ"</string>
+</resources>
diff --git a/packages/BackupRestoreConfirmation/res/values-km-rKH/strings.xml b/packages/BackupRestoreConfirmation/res/values-km-rKH/strings.xml
new file mode 100644
index 0000000..956fdd7
--- /dev/null
+++ b/packages/BackupRestoreConfirmation/res/values-km-rKH/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="backup_confirm_title" msgid="827563724209303345">"ការ​បម្រុង​ទុក​ពáŸáž‰áž›áŸáž‰"</string>
+ <string name="restore_confirm_title" msgid="5469365809567486602">"ស្ដារ​ឡើងវិញ​ពáŸáž‰áž›áŸáž‰"</string>
+ <string name="backup_confirm_text" msgid="1878021282758896593">"ការ​បម្រុងទុក​ទិន្ននáŸáž™â€‹áž‘ាំងអស់​ពáŸáž‰áž›áŸáž‰â€‹â€‹áž‘ៅ​កុំព្យូទáŸážšâ€‹ážŠáŸ‚ល​បាន​ភ្ជាប់​ážáŸ’រូវ​បាន​ស្នើ។ ážáž¾â€‹áž¢áŸ’នក​ចង់ឲ្យ​វា​កើážâ€‹áž¡áž¾áž„​ដែរ​ឬទáŸ??\n\nបើ​អ្នក​មិន​បាន​ស្នើ​ការ​បម្រុងទុក​ដោយ​ážáŸ’លួន​អ្នក​ផ្ទាល់​ទ០កុំ​អនុញ្ញាážâ€‹áž”្រážáž·áž”ážáŸ’ážáž·áž€áž¶ážšâ€‹áž“áŸáŸ‡áŸ”"</string>
+ <string name="allow_backup_button_label" msgid="4217228747769644068">"បម្រុង​ទុក​ទិន្ននáŸáž™â€‹ážšáž”ស់​ážáŸ’ញុំ"</string>
+ <string name="deny_backup_button_label" msgid="6009119115581097708">"កុំ​បម្រុង​ទុក"</string>
+ <string name="restore_confirm_text" msgid="7499866728030461776">"ការ​ស្ដារ​ទិន្ននáŸáž™â€‹áž‘ាំងអស់​ពáŸáž‰áž›áŸáž‰â€‹áž–ី​កុំព្យូទáŸážšâ€‹ážŠáŸ‚ល​បាន​ážáž—្ជាប់​ážáŸ’រូវ​បាន​ស្នើ។ ážáž¾â€‹áž¢áŸ’នក​ចង់​អនុញ្ញាážâ€‹ážŠáŸ‚រ​ឬទáŸ?\n\n បើ​អ្នក​មិន​បាន​ស្នើ​ការ​ស្ដារ​ážáŸ’លួន​ឯង​ទ០កុំ​អនុញ្ញាážáŸ” វា​នឹង​ជំនួស​ទិន្ននáŸáž™â€‹ážŽáž¶áž˜áž½áž™â€‹ážŠáŸ‚ល​មាន​លើ​ឧបករណáŸ!"</string>
+ <string name="allow_restore_button_label" msgid="3081286752277127827">"ស្ដារ​ទិន្ននáŸáž™â€‹ážšáž”ស់​ážáŸ’ញុំ"</string>
+ <string name="deny_restore_button_label" msgid="1724367334453104378">"កុំ​ស្ដារ​ឡើងវិញ"</string>
+ <string name="current_password_text" msgid="8268189555578298067">"សូម​បញ្ចូល​ពាក្យ​សម្ងាážáŸ‹â€‹áž”ម្រុង​ទុក​បច្ចុប្បន្ន​របស់​អ្នក​ážáž¶áž„​ក្រោម៖"</string>
+ <string name="device_encryption_restore_text" msgid="1570864916855208992">"សូម​បញ្ចូល​ពាក្យ​សម្ងាážáŸ‹â€‹ážŠáž¶áž€áŸ‹â€‹áž›áŸážâ€‹áž€áž¼ážŠâ€‹â€‹áž§áž”ករណáŸâ€‹ážšáž”ស់​​អ្នក​ážáž¶áž„​ក្រោម។"</string>
+ <string name="device_encryption_backup_text" msgid="5866590762672844664">"សូម​បញ្ចូល​ពាក្យ​សម្ងាážáŸ‹â€‹ážŠáž¶áž€áŸ‹â€‹áž›áŸážâ€‹áž€áž¼ážŠâ€‹áž§áž”ករណáŸâ€‹ážšáž”ស់​អ្នក​ážáž¶áž„​ក្រោម។ វា​នឹង​ážáŸ’រូវ​បាន​ប្រើ ដើម្បី​ដាក់​លáŸážâ€‹áž€áž¼ážŠâ€‹áž”áŸážŽáŸ’ណសារ​បម្រុងទុក​ផង​ដែរ។"</string>
+ <string name="backup_enc_password_text" msgid="4981585714795233099">"សូម​បញ្ចូល​ពាក្យ​សម្ងាážáŸ‹â€‹ážŠáž¾áž˜áŸ’បី​ប្រើ​សម្រាប់​ដាក់លáŸážâ€‹áž€áž¼ážŠâ€‹áž‘ិន្ននáŸáž™â€‹áž”ម្រុងទុក​ពáŸáž‰áž›áŸáž‰áŸ” បើ​ទុក​វា​ទទ០ពាក្យ​សម្ងាážáŸ‹â€‹áž”ម្រុងទុក​បច្ចុប្បន្ន​របស់​អ្នក​នឹង​ážáŸ’រូវ​បាន​ប្រើ៖"</string>
+ <string name="backup_enc_password_optional" msgid="1350137345907579306">"បើ​អ្នក​ចង់​ដាក់​លáŸážâ€‹áž€áž¼ážŠâ€‹áž‘ិន្ននáŸáž™â€‹áž”ម្រុងទុក​ពáŸáž‰áž›áŸáž‰ បញ្ចូល​ពាក្យ​សម្ងាážáŸ‹â€‹ážáž¶áž„​ក្រោម៖"</string>
+ <string name="restore_enc_password_text" msgid="6140898525580710823">"បើ​​ទិន្ននáŸáž™â€‹ážŸáŸ’ដារ​ážáŸ’រូវ​បាន​ដាក់​លáŸážâ€‹áž€áž¼ážŠ សូម​បញ្ចូល​ពាក្យ​សម្ងាážáŸ‹â€‹ážáž¶áž„​ក្រោម៖"</string>
+ <string name="toast_backup_started" msgid="550354281452756121">"កំពុង​ចាប់ផ្ដើម​បម្រុងទុក..."</string>
+ <string name="toast_backup_ended" msgid="3818080769548726424">"ការ​​បម្រុង​ទុក​បាន​បញ្ចប់"</string>
+ <string name="toast_restore_started" msgid="7881679218971277385">"ការ​ស្ដារ​កំពុង​ចាប់ផ្ដើម..."</string>
+ <string name="toast_restore_ended" msgid="1764041639199696132">"ការ​ស្ážáž¶â€‹ážšâ€‹áž”ាន​បញ្ចប់"</string>
+ <string name="toast_timeout" msgid="5276598587087626877">"ប្រážáž·áž”ážáŸ’ážáž·áž€áž¶ážšâ€‹áž¢ážŸáŸ‹â€‹áž–áŸáž›"</string>
+</resources>
diff --git a/packages/BackupRestoreConfirmation/res/values-km/strings.xml b/packages/BackupRestoreConfirmation/res/values-km/strings.xml
new file mode 100644
index 0000000..956fdd7
--- /dev/null
+++ b/packages/BackupRestoreConfirmation/res/values-km/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="backup_confirm_title" msgid="827563724209303345">"ការ​បម្រុង​ទុក​ពáŸáž‰áž›áŸáž‰"</string>
+ <string name="restore_confirm_title" msgid="5469365809567486602">"ស្ដារ​ឡើងវិញ​ពáŸáž‰áž›áŸáž‰"</string>
+ <string name="backup_confirm_text" msgid="1878021282758896593">"ការ​បម្រុងទុក​ទិន្ននáŸáž™â€‹áž‘ាំងអស់​ពáŸáž‰áž›áŸáž‰â€‹â€‹áž‘ៅ​កុំព្យូទáŸážšâ€‹ážŠáŸ‚ល​បាន​ភ្ជាប់​ážáŸ’រូវ​បាន​ស្នើ។ ážáž¾â€‹áž¢áŸ’នក​ចង់ឲ្យ​វា​កើážâ€‹áž¡áž¾áž„​ដែរ​ឬទáŸ??\n\nបើ​អ្នក​មិន​បាន​ស្នើ​ការ​បម្រុងទុក​ដោយ​ážáŸ’លួន​អ្នក​ផ្ទាល់​ទ០កុំ​អនុញ្ញាážâ€‹áž”្រážáž·áž”ážáŸ’ážáž·áž€áž¶ážšâ€‹áž“áŸáŸ‡áŸ”"</string>
+ <string name="allow_backup_button_label" msgid="4217228747769644068">"បម្រុង​ទុក​ទិន្ននáŸáž™â€‹ážšáž”ស់​ážáŸ’ញុំ"</string>
+ <string name="deny_backup_button_label" msgid="6009119115581097708">"កុំ​បម្រុង​ទុក"</string>
+ <string name="restore_confirm_text" msgid="7499866728030461776">"ការ​ស្ដារ​ទិន្ននáŸáž™â€‹áž‘ាំងអស់​ពáŸáž‰áž›áŸáž‰â€‹áž–ី​កុំព្យូទáŸážšâ€‹ážŠáŸ‚ល​បាន​ážáž—្ជាប់​ážáŸ’រូវ​បាន​ស្នើ។ ážáž¾â€‹áž¢áŸ’នក​ចង់​អនុញ្ញាážâ€‹ážŠáŸ‚រ​ឬទáŸ?\n\n បើ​អ្នក​មិន​បាន​ស្នើ​ការ​ស្ដារ​ážáŸ’លួន​ឯង​ទ០កុំ​អនុញ្ញាážáŸ” វា​នឹង​ជំនួស​ទិន្ននáŸáž™â€‹ážŽáž¶áž˜áž½áž™â€‹ážŠáŸ‚ល​មាន​លើ​ឧបករណáŸ!"</string>
+ <string name="allow_restore_button_label" msgid="3081286752277127827">"ស្ដារ​ទិន្ននáŸáž™â€‹ážšáž”ស់​ážáŸ’ញុំ"</string>
+ <string name="deny_restore_button_label" msgid="1724367334453104378">"កុំ​ស្ដារ​ឡើងវិញ"</string>
+ <string name="current_password_text" msgid="8268189555578298067">"សូម​បញ្ចូល​ពាក្យ​សម្ងាážáŸ‹â€‹áž”ម្រុង​ទុក​បច្ចុប្បន្ន​របស់​អ្នក​ážáž¶áž„​ក្រោម៖"</string>
+ <string name="device_encryption_restore_text" msgid="1570864916855208992">"សូម​បញ្ចូល​ពាក្យ​សម្ងាážáŸ‹â€‹ážŠáž¶áž€áŸ‹â€‹áž›áŸážâ€‹áž€áž¼ážŠâ€‹â€‹áž§áž”ករណáŸâ€‹ážšáž”ស់​​អ្នក​ážáž¶áž„​ក្រោម។"</string>
+ <string name="device_encryption_backup_text" msgid="5866590762672844664">"សូម​បញ្ចូល​ពាក្យ​សម្ងាážáŸ‹â€‹ážŠáž¶áž€áŸ‹â€‹áž›áŸážâ€‹áž€áž¼ážŠâ€‹áž§áž”ករណáŸâ€‹ážšáž”ស់​អ្នក​ážáž¶áž„​ក្រោម។ វា​នឹង​ážáŸ’រូវ​បាន​ប្រើ ដើម្បី​ដាក់​លáŸážâ€‹áž€áž¼ážŠâ€‹áž”áŸážŽáŸ’ណសារ​បម្រុងទុក​ផង​ដែរ។"</string>
+ <string name="backup_enc_password_text" msgid="4981585714795233099">"សូម​បញ្ចូល​ពាក្យ​សម្ងាážáŸ‹â€‹ážŠáž¾áž˜áŸ’បី​ប្រើ​សម្រាប់​ដាក់លáŸážâ€‹áž€áž¼ážŠâ€‹áž‘ិន្ននáŸáž™â€‹áž”ម្រុងទុក​ពáŸáž‰áž›áŸáž‰áŸ” បើ​ទុក​វា​ទទ០ពាក្យ​សម្ងាážáŸ‹â€‹áž”ម្រុងទុក​បច្ចុប្បន្ន​របស់​អ្នក​នឹង​ážáŸ’រូវ​បាន​ប្រើ៖"</string>
+ <string name="backup_enc_password_optional" msgid="1350137345907579306">"បើ​អ្នក​ចង់​ដាក់​លáŸážâ€‹áž€áž¼ážŠâ€‹áž‘ិន្ននáŸáž™â€‹áž”ម្រុងទុក​ពáŸáž‰áž›áŸáž‰ បញ្ចូល​ពាក្យ​សម្ងាážáŸ‹â€‹ážáž¶áž„​ក្រោម៖"</string>
+ <string name="restore_enc_password_text" msgid="6140898525580710823">"បើ​​ទិន្ននáŸáž™â€‹ážŸáŸ’ដារ​ážáŸ’រូវ​បាន​ដាក់​លáŸážâ€‹áž€áž¼ážŠ សូម​បញ្ចូល​ពាក្យ​សម្ងាážáŸ‹â€‹ážáž¶áž„​ក្រោម៖"</string>
+ <string name="toast_backup_started" msgid="550354281452756121">"កំពុង​ចាប់ផ្ដើម​បម្រុងទុក..."</string>
+ <string name="toast_backup_ended" msgid="3818080769548726424">"ការ​​បម្រុង​ទុក​បាន​បញ្ចប់"</string>
+ <string name="toast_restore_started" msgid="7881679218971277385">"ការ​ស្ដារ​កំពុង​ចាប់ផ្ដើម..."</string>
+ <string name="toast_restore_ended" msgid="1764041639199696132">"ការ​ស្ážáž¶â€‹ážšâ€‹áž”ាន​បញ្ចប់"</string>
+ <string name="toast_timeout" msgid="5276598587087626877">"ប្រážáž·áž”ážáŸ’ážáž·áž€áž¶ážšâ€‹áž¢ážŸáŸ‹â€‹áž–áŸáž›"</string>
+</resources>
diff --git a/packages/BackupRestoreConfirmation/res/values-lo-rLA/strings.xml b/packages/BackupRestoreConfirmation/res/values-lo-rLA/strings.xml
new file mode 100644
index 0000000..fb28502
--- /dev/null
+++ b/packages/BackupRestoreConfirmation/res/values-lo-rLA/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="backup_confirm_title" msgid="827563724209303345">"ສຳຮອງຂà»à»‰àº¡àº¹àº™à»€àº•ັມຮູບà»àºšàºš"</string>
+ <string name="restore_confirm_title" msgid="5469365809567486602">"àºàº¹à»‰àº‚à»à»‰àº¡àº¹àº™à»€àº•ັມຮູບà»àºšàºš"</string>
+ <string name="backup_confirm_text" msgid="1878021282758896593">"ມີàºàº²àº™àº®à»‰àº­àº‡àº‚à»à»ƒàº«à»‰àºªàº³àº®àº­àº‡àº‚à»à»‰àº¡àº¹àº™àº—ັງà»àº»àº” ໄປໃສ່ຄອມພິວເຕີຕັ້ງໂຕະທີ່ເຊື່ອມຕà»à»ˆàº¢àº¹à»ˆ. ທ່ານຈະອະນຸມັດໃຫ້ດຳເນີນàºàº²àº™àº«àº¼àº·àºšà»à»ˆ?\n\nຫາàºàº—່ານບà»à»ˆà»„ດ້ຮ້ອງຂà»à»ƒàº«à»‰àºªàº³àº®àº­àº‡àº‚à»à»‰àº¡àº¹àº™àº”້ວàºàº•ົນເອງ, àºàº°àº¥àº¸àº™àº²àº¢à»ˆàº²àº­àº°àº™àº¸àºàº²àº”ໃຫ້ດຳເນີນàºàº²àº™àº•à»à»ˆà»„ປ."</string>
+ <string name="allow_backup_button_label" msgid="4217228747769644068">"ສຳຮອງຂà»à»‰àº¡àº¹àº™àº‚ອງຂ້ອàº"</string>
+ <string name="deny_backup_button_label" msgid="6009119115581097708">"ບà»à»ˆà»ƒàº«à»‰àºªàº³àº®àº­àº‡àº‚à»à»‰àº¡àº¹àº™"</string>
+ <string name="restore_confirm_text" msgid="7499866728030461776">"àºàº²àº™àºàº¹à»‰àº‚à»à»‰àº¡àº¹àº™àº—ັງà»àº»àº”ຈາàºàº„ອມພິວເຕີທີ່ເຊື່ອມຕà»à»ˆàº¢àº¹à»ˆàº™àº±à»‰àº™àº–ືàºàº®à»‰àº­àº‡àº‚à»à»àº¥à»‰àº§. ທ່ານຕ້ອງàºàº²àº™àº­àº°àº™àº¸àºàº²àº”ໃຫ້àºàº²àº™àºàº°àº—ຳນີ້ເàºàºµàº”ຂຶ້ນບà»à»ˆ?\n\nຫາàºàº—່ານບà»à»ˆà»„ດ້ເຮັດàºàº²àº™àº®à»‰àº­àº‡àº‚à»à»‰àºàº²àº™àºàº¹à»‰àº‚à»à»‰àº¡àº¹àº™àº”້ວàºà»‚ຕທ່ານເອງ, ທ່ານບà»à»ˆàº„ວນອະນຸàºàº²àº”ໃຫ້ມີàºàº²àº™àº”ຳເນີນàºàº²àº™à»ƒàº”ໆ ເນື່ອງຈາàºàº¡àº±àº™àºˆàº°à»„ປຂຽນທັບຂà»à»‰àº¡àº¹àº™àº—ັງà»àº»àº”ທີ່ຢູ່ໃນອຸປະàºàº­àº™!"</string>
+ <string name="allow_restore_button_label" msgid="3081286752277127827">"àºàº¹à»‰àº„ືນຂà»à»‰àº¡àº¹àº™àº‚ອງຂ້ອàº"</string>
+ <string name="deny_restore_button_label" msgid="1724367334453104378">"ບà»à»ˆà»ƒàº«à»‰àºàº¹à»‰àº„ືນ"</string>
+ <string name="current_password_text" msgid="8268189555578298067">"àºàº°àº¥àº¸àº™àº²àº›à»‰àº­àº™àº¥àº°àº«àº±àº”ຜ່ານàºàº²àº™àºªàº³àº®àº­àº‡àº‚à»à»‰àº¡àº¹àº™àº—ີ່ທ່ານໃຊ້ຢູ່ໃສ່ດ້ານລຸ່ມ:"</string>
+ <string name="device_encryption_restore_text" msgid="1570864916855208992">"àºàº°àº¥àº¸àº™àº²àº›à»‰àº­àº™àº¥àº°àº«àº±àº”ຜ່ານàºàº²àº™à»€àº‚ົ້າລະຫັດອຸປະàºàº­àº™àº‚ອງທ່ານໃສ່ດ້ານລຸ່ມ."</string>
+ <string name="device_encryption_backup_text" msgid="5866590762672844664">"àºàº°àº¥àº¸àº™àº²àº›à»‰àº­àº™àº¥àº°àº«àº±àº”ຜ່ານàºàº²àº™à»€àº‚ົ້າລະຫັດອຸປະàºàº­àº™àº‚ອງທ່ານໃສ່ດ້ານລຸ່ມ. ລະຫັດນີ້àºàº±àº‡àºˆàº°à»ƒàºŠà»‰à»€àºžàº·à»ˆàº­à»€àº‚ົ້າລະຫັດຂà»à»‰àº¡àº¹àº™àº—ີ່ສຳຮອງໄວ້."</string>
+ <string name="backup_enc_password_text" msgid="4981585714795233099">"àºàº°àº¥àº¸àº™àº²àº›à»‰àº­àº™àº¥àº°àº«àº±àº”ຜ່ານ ເພື່ອໃຊ້ໃນàºàº²àº™à»€àº‚ົ້າລະຫັດàºàº²àº™àºªàº³àº®àº­àº‡àº‚à»à»‰àº¡àº¹àº™à»€àº•ັມຮູບà»àºšàºš. ຖ້າປ່ອàºà»ƒàº«à»‰à»€àº›àº»à»ˆàº²àº«àº§à»ˆàº²àº‡à»„ວ້, ລະຫັດຜ່ານສຳຮອງຂà»à»‰àº¡àº¹àº™àº—ີ່ທ່ານໃຊ້ຢູ່ຈະຖືàºàº™àº³à»ƒàºŠà»‰à»àº—ນ:"</string>
+ <string name="backup_enc_password_optional" msgid="1350137345907579306">"ຫາàºàº—່ານຕ້ອງàºàº²àº™àº—ີ່ຈະເຂົ້າລະຫັດໃຫ້àºàº±àºšàºàº²àº™àºªàº³àº®àº­àº‡àº‚à»à»‰àº¡àº¹àº™àº—ັງà»àº»àº”, àºàº°àº¥àº¸àº™àº²à»ƒàºªà»ˆàº¥àº°àº«àº±àº”ທາງລຸ່ມນີ້:"</string>
+ <string name="restore_enc_password_text" msgid="6140898525580710823">"ຫາàºàº‚à»à»‰àº¡àº¹àº™àºªàº³àº®àº­àº‡àº–ືàºà»€àº‚ົ້າລະຫັດໄວ້, àºàº°àº¥àº¸àº™àº²à»ƒàºªà»ˆàº¥àº°àº«àº±àº”ຜ່ານທາງດ້ານລຸ່ມນີ້:"</string>
+ <string name="toast_backup_started" msgid="550354281452756121">"àºàº³àº¥àº±àº‡à»€àº¥àºµà»ˆàº¡àºàº²àº™àºªàº³àº®àº­àº‡àº‚à»à»‰àº¡àº¹àº™..."</string>
+ <string name="toast_backup_ended" msgid="3818080769548726424">"ສຳຮອງຂà»à»‰àº¡àº¹àº™àºªàº³à»€àº¥àº±àº”à»àº¥à»‰àº§"</string>
+ <string name="toast_restore_started" msgid="7881679218971277385">"àºàº²àº™àºàº¹à»‰àº‚à»à»‰àº¡àº¹àº™àºàº³àº¥àº±àº‡àºˆàº°à»€àº¥àºµà»ˆàº¡..."</string>
+ <string name="toast_restore_ended" msgid="1764041639199696132">"àºàº²àº™àºàº¹à»‰àº‚à»à»‰àº¡àº¹àº™àºªàº´à»‰àº™àºªàº¸àº”à»àº¥à»‰àº§"</string>
+ <string name="toast_timeout" msgid="5276598587087626877">"à»àº»àº”ເວລາປະຕິບັດàºàº²àº™"</string>
+</resources>
diff --git a/packages/BackupRestoreConfirmation/res/values-lo/strings.xml b/packages/BackupRestoreConfirmation/res/values-lo/strings.xml
new file mode 100644
index 0000000..fb28502
--- /dev/null
+++ b/packages/BackupRestoreConfirmation/res/values-lo/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="backup_confirm_title" msgid="827563724209303345">"ສຳຮອງຂà»à»‰àº¡àº¹àº™à»€àº•ັມຮູບà»àºšàºš"</string>
+ <string name="restore_confirm_title" msgid="5469365809567486602">"àºàº¹à»‰àº‚à»à»‰àº¡àº¹àº™à»€àº•ັມຮູບà»àºšàºš"</string>
+ <string name="backup_confirm_text" msgid="1878021282758896593">"ມີàºàº²àº™àº®à»‰àº­àº‡àº‚à»à»ƒàº«à»‰àºªàº³àº®àº­àº‡àº‚à»à»‰àº¡àº¹àº™àº—ັງà»àº»àº” ໄປໃສ່ຄອມພິວເຕີຕັ້ງໂຕະທີ່ເຊື່ອມຕà»à»ˆàº¢àº¹à»ˆ. ທ່ານຈະອະນຸມັດໃຫ້ດຳເນີນàºàº²àº™àº«àº¼àº·àºšà»à»ˆ?\n\nຫາàºàº—່ານບà»à»ˆà»„ດ້ຮ້ອງຂà»à»ƒàº«à»‰àºªàº³àº®àº­àº‡àº‚à»à»‰àº¡àº¹àº™àº”້ວàºàº•ົນເອງ, àºàº°àº¥àº¸àº™àº²àº¢à»ˆàº²àº­àº°àº™àº¸àºàº²àº”ໃຫ້ດຳເນີນàºàº²àº™àº•à»à»ˆà»„ປ."</string>
+ <string name="allow_backup_button_label" msgid="4217228747769644068">"ສຳຮອງຂà»à»‰àº¡àº¹àº™àº‚ອງຂ້ອàº"</string>
+ <string name="deny_backup_button_label" msgid="6009119115581097708">"ບà»à»ˆà»ƒàº«à»‰àºªàº³àº®àº­àº‡àº‚à»à»‰àº¡àº¹àº™"</string>
+ <string name="restore_confirm_text" msgid="7499866728030461776">"àºàº²àº™àºàº¹à»‰àº‚à»à»‰àº¡àº¹àº™àº—ັງà»àº»àº”ຈາàºàº„ອມພິວເຕີທີ່ເຊື່ອມຕà»à»ˆàº¢àº¹à»ˆàº™àº±à»‰àº™àº–ືàºàº®à»‰àº­àº‡àº‚à»à»àº¥à»‰àº§. ທ່ານຕ້ອງàºàº²àº™àº­àº°àº™àº¸àºàº²àº”ໃຫ້àºàº²àº™àºàº°àº—ຳນີ້ເàºàºµàº”ຂຶ້ນບà»à»ˆ?\n\nຫາàºàº—່ານບà»à»ˆà»„ດ້ເຮັດàºàº²àº™àº®à»‰àº­àº‡àº‚à»à»‰àºàº²àº™àºàº¹à»‰àº‚à»à»‰àº¡àº¹àº™àº”້ວàºà»‚ຕທ່ານເອງ, ທ່ານບà»à»ˆàº„ວນອະນຸàºàº²àº”ໃຫ້ມີàºàº²àº™àº”ຳເນີນàºàº²àº™à»ƒàº”ໆ ເນື່ອງຈາàºàº¡àº±àº™àºˆàº°à»„ປຂຽນທັບຂà»à»‰àº¡àº¹àº™àº—ັງà»àº»àº”ທີ່ຢູ່ໃນອຸປະàºàº­àº™!"</string>
+ <string name="allow_restore_button_label" msgid="3081286752277127827">"àºàº¹à»‰àº„ືນຂà»à»‰àº¡àº¹àº™àº‚ອງຂ້ອàº"</string>
+ <string name="deny_restore_button_label" msgid="1724367334453104378">"ບà»à»ˆà»ƒàº«à»‰àºàº¹à»‰àº„ືນ"</string>
+ <string name="current_password_text" msgid="8268189555578298067">"àºàº°àº¥àº¸àº™àº²àº›à»‰àº­àº™àº¥àº°àº«àº±àº”ຜ່ານàºàº²àº™àºªàº³àº®àº­àº‡àº‚à»à»‰àº¡àº¹àº™àº—ີ່ທ່ານໃຊ້ຢູ່ໃສ່ດ້ານລຸ່ມ:"</string>
+ <string name="device_encryption_restore_text" msgid="1570864916855208992">"àºàº°àº¥àº¸àº™àº²àº›à»‰àº­àº™àº¥àº°àº«àº±àº”ຜ່ານàºàº²àº™à»€àº‚ົ້າລະຫັດອຸປະàºàº­àº™àº‚ອງທ່ານໃສ່ດ້ານລຸ່ມ."</string>
+ <string name="device_encryption_backup_text" msgid="5866590762672844664">"àºàº°àº¥àº¸àº™àº²àº›à»‰àº­àº™àº¥àº°àº«àº±àº”ຜ່ານàºàº²àº™à»€àº‚ົ້າລະຫັດອຸປະàºàº­àº™àº‚ອງທ່ານໃສ່ດ້ານລຸ່ມ. ລະຫັດນີ້àºàº±àº‡àºˆàº°à»ƒàºŠà»‰à»€àºžàº·à»ˆàº­à»€àº‚ົ້າລະຫັດຂà»à»‰àº¡àº¹àº™àº—ີ່ສຳຮອງໄວ້."</string>
+ <string name="backup_enc_password_text" msgid="4981585714795233099">"àºàº°àº¥àº¸àº™àº²àº›à»‰àº­àº™àº¥àº°àº«àº±àº”ຜ່ານ ເພື່ອໃຊ້ໃນàºàº²àº™à»€àº‚ົ້າລະຫັດàºàº²àº™àºªàº³àº®àº­àº‡àº‚à»à»‰àº¡àº¹àº™à»€àº•ັມຮູບà»àºšàºš. ຖ້າປ່ອàºà»ƒàº«à»‰à»€àº›àº»à»ˆàº²àº«àº§à»ˆàº²àº‡à»„ວ້, ລະຫັດຜ່ານສຳຮອງຂà»à»‰àº¡àº¹àº™àº—ີ່ທ່ານໃຊ້ຢູ່ຈະຖືàºàº™àº³à»ƒàºŠà»‰à»àº—ນ:"</string>
+ <string name="backup_enc_password_optional" msgid="1350137345907579306">"ຫາàºàº—່ານຕ້ອງàºàº²àº™àº—ີ່ຈະເຂົ້າລະຫັດໃຫ້àºàº±àºšàºàº²àº™àºªàº³àº®àº­àº‡àº‚à»à»‰àº¡àº¹àº™àº—ັງà»àº»àº”, àºàº°àº¥àº¸àº™àº²à»ƒàºªà»ˆàº¥àº°àº«àº±àº”ທາງລຸ່ມນີ້:"</string>
+ <string name="restore_enc_password_text" msgid="6140898525580710823">"ຫາàºàº‚à»à»‰àº¡àº¹àº™àºªàº³àº®àº­àº‡àº–ືàºà»€àº‚ົ້າລະຫັດໄວ້, àºàº°àº¥àº¸àº™àº²à»ƒàºªà»ˆàº¥àº°àº«àº±àº”ຜ່ານທາງດ້ານລຸ່ມນີ້:"</string>
+ <string name="toast_backup_started" msgid="550354281452756121">"àºàº³àº¥àº±àº‡à»€àº¥àºµà»ˆàº¡àºàº²àº™àºªàº³àº®àº­àº‡àº‚à»à»‰àº¡àº¹àº™..."</string>
+ <string name="toast_backup_ended" msgid="3818080769548726424">"ສຳຮອງຂà»à»‰àº¡àº¹àº™àºªàº³à»€àº¥àº±àº”à»àº¥à»‰àº§"</string>
+ <string name="toast_restore_started" msgid="7881679218971277385">"àºàº²àº™àºàº¹à»‰àº‚à»à»‰àº¡àº¹àº™àºàº³àº¥àº±àº‡àºˆàº°à»€àº¥àºµà»ˆàº¡..."</string>
+ <string name="toast_restore_ended" msgid="1764041639199696132">"àºàº²àº™àºàº¹à»‰àº‚à»à»‰àº¡àº¹àº™àºªàº´à»‰àº™àºªàº¸àº”à»àº¥à»‰àº§"</string>
+ <string name="toast_timeout" msgid="5276598587087626877">"à»àº»àº”ເວລາປະຕິບັດàºàº²àº™"</string>
+</resources>
diff --git a/packages/BackupRestoreConfirmation/res/values-mn-rMN/strings.xml b/packages/BackupRestoreConfirmation/res/values-mn-rMN/strings.xml
new file mode 100644
index 0000000..b2738c0
--- /dev/null
+++ b/packages/BackupRestoreConfirmation/res/values-mn-rMN/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="backup_confirm_title" msgid="827563724209303345">"БүрÑн нөөшлөх"</string>
+ <string name="restore_confirm_title" msgid="5469365809567486602">"БүрÑн ÑÑргÑÑÑ…"</string>
+ <string name="backup_confirm_text" msgid="1878021282758896593">"ХолбогдÑон байгаа деÑктоп компьютерлүү бүх датаг бүрÑн нөөшлөх Ñ…Ò¯ÑÑлт тавигдав. Та Ñнийг зөвшөөрөх Ò¯Ò¯?\n\nÐ¥ÑÑ€Ñв та нөөшлөлт хийх Ñ…Ò¯ÑÑлт хийгÑÑгүй бол Ñнийг зөвшөөрч болохгүй."</string>
+ <string name="allow_backup_button_label" msgid="4217228747769644068">"Миний датаг нөөшлөх"</string>
+ <string name="deny_backup_button_label" msgid="6009119115581097708">"Ðөөшлөхгүй"</string>
+ <string name="restore_confirm_text" msgid="7499866728030461776">"ХолбогдÑон байгаа деÑктоп компьютерÑÑÑ Ð±Ò¯Ñ… датаг бүрÑн ÑÑргÑÑÑ… Ñ…Ò¯ÑÑлт тавигдав. Та Ñнийг зөвшөөрөх Ò¯Ò¯?\n\nÐ¥ÑÑ€Ñв та ÑÑргÑÑÑ… Ñ…Ò¯ÑÑлт хийгÑÑгүй бол Ñнийг зөвшөөрч болохгүй. Ð­Ð½Ñ Ð½ÑŒ төхөөрөмж дÑÑÑ€ одоо байгаа дурын датаг орлуулах болно!"</string>
+ <string name="allow_restore_button_label" msgid="3081286752277127827">"Миний датаг ÑÑргÑÑÑ…"</string>
+ <string name="deny_restore_button_label" msgid="1724367334453104378">"СÑргÑÑхгүй"</string>
+ <string name="current_password_text" msgid="8268189555578298067">"Одоогийн нөөшлөх нууц үгийг доор оруулна уу:"</string>
+ <string name="device_encryption_restore_text" msgid="1570864916855208992">"Төхөөрөмж шифрлÑÑ… нууц үгийг доор оруулна уу."</string>
+ <string name="device_encryption_backup_text" msgid="5866590762672844664">"Төхөөрөмж шифрлÑÑ… нууц үгийг доор оруулна уу. Ð­Ð½Ñ Ð½ÑƒÑƒÑ† үгийг нөөшлөх архивийг шифрлÑÑ…Ñд Ð±Ð°Ñ Ð°ÑˆÐ¸Ð³Ð»Ð°Ð½Ð°."</string>
+ <string name="backup_enc_password_text" msgid="4981585714795233099">"БүрÑн дата нөөшлөлтийг шифрлÑÑ…Ñд ашиглах нууц үгийг оруулна уу. Ð¥ÑÑ€Ñв та хооÑон үлдÑÑвÑл таны одоогийн нөөшлөлтийн нууц үг ашиглагдах болно:"</string>
+ <string name="backup_enc_password_optional" msgid="1350137345907579306">"Ð¥ÑÑ€Ñв та бүрÑн нөөшлөх датаг шифрлÑÑ… бол доор нууц үгийг оруулна уу:"</string>
+ <string name="restore_enc_password_text" msgid="6140898525580710823">"Ð¥ÑÑ€Ñв ÑÑргÑÑÑ… дата шифрлÑгдÑÑн бол доор нууц үгийг оруулна уу:"</string>
+ <string name="toast_backup_started" msgid="550354281452756121">"Ðөөшлөж ÑхлÑÑ…..."</string>
+ <string name="toast_backup_ended" msgid="3818080769548726424">"Ðөөшлөлт дууÑав"</string>
+ <string name="toast_restore_started" msgid="7881679218971277385">"СÑргÑÑлт ÑхлÑж байна..."</string>
+ <string name="toast_restore_ended" msgid="1764041639199696132">"СÑргÑÑлт дууÑав"</string>
+ <string name="toast_timeout" msgid="5276598587087626877">"Ðжиллагааны хугацаа Ñ…ÑтрÑв"</string>
+</resources>
diff --git a/packages/BackupRestoreConfirmation/res/values-mn/strings.xml b/packages/BackupRestoreConfirmation/res/values-mn/strings.xml
new file mode 100644
index 0000000..b2738c0
--- /dev/null
+++ b/packages/BackupRestoreConfirmation/res/values-mn/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="backup_confirm_title" msgid="827563724209303345">"БүрÑн нөөшлөх"</string>
+ <string name="restore_confirm_title" msgid="5469365809567486602">"БүрÑн ÑÑргÑÑÑ…"</string>
+ <string name="backup_confirm_text" msgid="1878021282758896593">"ХолбогдÑон байгаа деÑктоп компьютерлүү бүх датаг бүрÑн нөөшлөх Ñ…Ò¯ÑÑлт тавигдав. Та Ñнийг зөвшөөрөх Ò¯Ò¯?\n\nÐ¥ÑÑ€Ñв та нөөшлөлт хийх Ñ…Ò¯ÑÑлт хийгÑÑгүй бол Ñнийг зөвшөөрч болохгүй."</string>
+ <string name="allow_backup_button_label" msgid="4217228747769644068">"Миний датаг нөөшлөх"</string>
+ <string name="deny_backup_button_label" msgid="6009119115581097708">"Ðөөшлөхгүй"</string>
+ <string name="restore_confirm_text" msgid="7499866728030461776">"ХолбогдÑон байгаа деÑктоп компьютерÑÑÑ Ð±Ò¯Ñ… датаг бүрÑн ÑÑргÑÑÑ… Ñ…Ò¯ÑÑлт тавигдав. Та Ñнийг зөвшөөрөх Ò¯Ò¯?\n\nÐ¥ÑÑ€Ñв та ÑÑргÑÑÑ… Ñ…Ò¯ÑÑлт хийгÑÑгүй бол Ñнийг зөвшөөрч болохгүй. Ð­Ð½Ñ Ð½ÑŒ төхөөрөмж дÑÑÑ€ одоо байгаа дурын датаг орлуулах болно!"</string>
+ <string name="allow_restore_button_label" msgid="3081286752277127827">"Миний датаг ÑÑргÑÑÑ…"</string>
+ <string name="deny_restore_button_label" msgid="1724367334453104378">"СÑргÑÑхгүй"</string>
+ <string name="current_password_text" msgid="8268189555578298067">"Одоогийн нөөшлөх нууц үгийг доор оруулна уу:"</string>
+ <string name="device_encryption_restore_text" msgid="1570864916855208992">"Төхөөрөмж шифрлÑÑ… нууц үгийг доор оруулна уу."</string>
+ <string name="device_encryption_backup_text" msgid="5866590762672844664">"Төхөөрөмж шифрлÑÑ… нууц үгийг доор оруулна уу. Ð­Ð½Ñ Ð½ÑƒÑƒÑ† үгийг нөөшлөх архивийг шифрлÑÑ…Ñд Ð±Ð°Ñ Ð°ÑˆÐ¸Ð³Ð»Ð°Ð½Ð°."</string>
+ <string name="backup_enc_password_text" msgid="4981585714795233099">"БүрÑн дата нөөшлөлтийг шифрлÑÑ…Ñд ашиглах нууц үгийг оруулна уу. Ð¥ÑÑ€Ñв та хооÑон үлдÑÑвÑл таны одоогийн нөөшлөлтийн нууц үг ашиглагдах болно:"</string>
+ <string name="backup_enc_password_optional" msgid="1350137345907579306">"Ð¥ÑÑ€Ñв та бүрÑн нөөшлөх датаг шифрлÑÑ… бол доор нууц үгийг оруулна уу:"</string>
+ <string name="restore_enc_password_text" msgid="6140898525580710823">"Ð¥ÑÑ€Ñв ÑÑргÑÑÑ… дата шифрлÑгдÑÑн бол доор нууц үгийг оруулна уу:"</string>
+ <string name="toast_backup_started" msgid="550354281452756121">"Ðөөшлөж ÑхлÑÑ…..."</string>
+ <string name="toast_backup_ended" msgid="3818080769548726424">"Ðөөшлөлт дууÑав"</string>
+ <string name="toast_restore_started" msgid="7881679218971277385">"СÑргÑÑлт ÑхлÑж байна..."</string>
+ <string name="toast_restore_ended" msgid="1764041639199696132">"СÑргÑÑлт дууÑав"</string>
+ <string name="toast_timeout" msgid="5276598587087626877">"Ðжиллагааны хугацаа Ñ…ÑтрÑв"</string>
+</resources>
diff --git a/packages/BackupRestoreConfirmation/res/values-ms-rMY/strings.xml b/packages/BackupRestoreConfirmation/res/values-ms-rMY/strings.xml
new file mode 100644
index 0000000..65a9ede
--- /dev/null
+++ b/packages/BackupRestoreConfirmation/res/values-ms-rMY/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="backup_confirm_title" msgid="827563724209303345">"Sandaran penuh"</string>
+ <string name="restore_confirm_title" msgid="5469365809567486602">"Pemulihan penuh"</string>
+ <string name="backup_confirm_text" msgid="1878021282758896593">"Sandaran lengkap bagi semua data ke komputer meja yang bersambung telah diminta. Adakah anda mahu membenarkan ini berlaku?\n\nJika anda tidak meminta sandaran ini sendiri, jangan benarkan operasi diteruskan."</string>
+ <string name="allow_backup_button_label" msgid="4217228747769644068">"Sandarkan data saya"</string>
+ <string name="deny_backup_button_label" msgid="6009119115581097708">"Jangan buat sandaran"</string>
+ <string name="restore_confirm_text" msgid="7499866728030461776">"Pemulihan penuh semua data dari komputer meja yang bersambung telah diminta. Adakah anda mahu membenarkan ini berlaku?\n\nJika anda tidak meminta pemulihan ini sendiri, jangan benarkan operasi ini diteruskan. Ini akan menggantikan sebarang data semasa pada peranti!"</string>
+ <string name="allow_restore_button_label" msgid="3081286752277127827">"Pulihkan data saya"</string>
+ <string name="deny_restore_button_label" msgid="1724367334453104378">"Jangan kembalikan"</string>
+ <string name="current_password_text" msgid="8268189555578298067">"Sila masukkan kata laluan sandaran semasa anda di bawah:"</string>
+ <string name="device_encryption_restore_text" msgid="1570864916855208992">"Sila masukkan kata laluan penyulitan peranti anda di bawah."</string>
+ <string name="device_encryption_backup_text" msgid="5866590762672844664">"Sila masukkan kata laluan penyulitan peranti anda di bawah. Ini juga akan digunakan untuk menyulitkan arkib sandaran."</string>
+ <string name="backup_enc_password_text" msgid="4981585714795233099">"Sila masukkan kata laluan yang hendak digunakan untuk menyulitkan data sandaran lengkap. Jika dibiarkan kosong, kata laluan sandaran semasa anda akan digunakan:"</string>
+ <string name="backup_enc_password_optional" msgid="1350137345907579306">"Jika anda ingin menyulitkan data sandaran lengkap, masukkan kata laluan di bawah:"</string>
+ <string name="restore_enc_password_text" msgid="6140898525580710823">"Jika pemulihan data disulitkan, sila masukkan kata laluan di bawah:"</string>
+ <string name="toast_backup_started" msgid="550354281452756121">"Sandaran bermula..."</string>
+ <string name="toast_backup_ended" msgid="3818080769548726424">"Sandaran selesai"</string>
+ <string name="toast_restore_started" msgid="7881679218971277385">"Pemulihan bermula..."</string>
+ <string name="toast_restore_ended" msgid="1764041639199696132">"Pemulihan berakhir"</string>
+ <string name="toast_timeout" msgid="5276598587087626877">"Operasi tamat masa"</string>
+</resources>
diff --git a/packages/BackupRestoreConfirmation/res/values-ne-rNP/strings.xml b/packages/BackupRestoreConfirmation/res/values-ne-rNP/strings.xml
new file mode 100644
index 0000000..c56332f
--- /dev/null
+++ b/packages/BackupRestoreConfirmation/res/values-ne-rNP/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="backup_confirm_title" msgid="827563724209303345">"पूरà¥à¤£ बà¥à¤¯à¤¾à¤•अप"</string>
+ <string name="restore_confirm_title" msgid="5469365809567486602">"पूरà¥à¤£ पà¥à¤¨à¤ƒà¤ªà¥à¤°à¤¾à¤ªà¥à¤¤à¤¿"</string>
+ <string name="backup_confirm_text" msgid="1878021282758896593">"à¤à¤‰à¤Ÿà¤¾ जोडिà¤à¤•ो डेसà¥à¤•टप कमà¥à¤ªà¥à¤¯à¥à¤Ÿà¤°à¤®à¤¾ सबै डेटाको à¤à¤‰à¤Ÿà¤¾ पूरà¥à¤£ जगेडाको अनà¥à¤°à¥‹à¤§ गरिà¤à¤•ो छ। के तपाईठयो हà¥à¤¨ दिन चाहनà¥à¤¹à¥à¤¨à¥à¤›? \n\nयदि तपाईà¤à¤²à¥‡ जगेडाको लागि आफैठअनà¥à¤°à¥‹à¤§ गरà¥à¤¨à¥ भà¤à¤¨ भने पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾à¤²à¤¾à¤ˆ अगाडि बढà¥à¤¨ अनà¥à¤®à¤¤à¤¿ नदिनà¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="allow_backup_button_label" msgid="4217228747769644068">"मेरो डेटा बà¥à¤¯à¤¾à¤•अप गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="deny_backup_button_label" msgid="6009119115581097708">"जगेडा नगरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="restore_confirm_text" msgid="7499866728030461776">"à¤à¤‰à¤Ÿà¤¾ जडित डेसà¥à¤•टप कमà¥à¤ªà¥à¤¯à¥à¤Ÿà¤°à¤¬à¤¾à¤Ÿ सबै डेटाको पूरà¥à¤£ पà¥à¤¨à¤ƒà¤¬à¤¹à¤¾à¤²à¥€ अनà¥à¤°à¥‹à¤§ गरियो। के तपाईं यो हà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤¹à¥à¤¨à¥à¤›?\n\nयदि तपाईं आफैं पà¥à¤¨à¤ƒà¤¬à¤¹à¤¾à¤²à¥€ अनà¥à¤°à¥‹à¤§ गरà¥à¤¨à¥à¤¹à¥à¤¨à¥à¤¨ भने अपरेसनलाई अघि बढाउन अनà¥à¤®à¤¤à¤¿ नदिनà¥à¤¹à¥‹à¤¸à¥à¥¤ यसले उपकरणमा भà¤à¤•ो कà¥à¤¨à¥ˆ पनि डेटालाई बदलà¥à¤¨à¥‡ छ!"</string>
+ <string name="allow_restore_button_label" msgid="3081286752277127827">"मेरो डेटा पà¥à¤¨à¤ƒà¤¬à¤¹à¤¾à¤²à¥€ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="deny_restore_button_label" msgid="1724367334453104378">"पà¥à¤¨:सà¥à¤¥à¤¾à¤ªà¤¨à¤¾ नगरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="current_password_text" msgid="8268189555578298067">"कृपया तल तपाईंको हालको बà¥à¤¯à¤¾à¤•अप पासवरà¥à¤¡ पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¿ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥:"</string>
+ <string name="device_encryption_restore_text" msgid="1570864916855208992">"कृपया तल तपाईंको उपकरण à¤à¤¨à¥à¤•à¥à¤°à¤¿à¤ªà¥à¤¸à¤¨ पासवरà¥à¤¡ पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¿ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥:"</string>
+ <string name="device_encryption_backup_text" msgid="5866590762672844664">"कृपया तल तपाईंको उपकरण à¤à¤¨à¥à¤•à¥à¤°à¤¿à¤ªà¥à¤¸à¤¨ पासवरà¥à¤¡ पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¿ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥: यो बà¥à¤¯à¤¾à¤•प सà¤à¤—à¥à¤°à¤¹ à¤à¤¨à¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ गरà¥à¤¨ पनि पà¥à¤°à¤¯à¥‹à¤— हà¥à¤¨à¥‡ छ।"</string>
+ <string name="backup_enc_password_text" msgid="4981585714795233099">"बà¥à¤¯à¤¾à¤•प डेटालाई encrypt गरà¥à¤¨ पासवरà¥à¤¡ पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¿ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥, यदि यो खालि छोडिà¤à¤•ो खणà¥à¤¡à¤®à¤¾ तपाईको पà¥à¤°à¤¾à¤¨à¥ˆ पासवरà¥à¤¡ पà¥à¤°à¤¯à¥‹à¤— हà¥à¤¨à¥‡ छ।"</string>
+ <string name="backup_enc_password_optional" msgid="1350137345907579306">"यदि तपाईं पूरà¥à¤£ बà¥à¤¯à¤¾à¤•अप डेटा इनà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ गरà¥à¤¨ चाहनॠहà¥à¤¨à¥à¤› भने तल पासवरà¥à¤¡ पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¿ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="restore_enc_password_text" msgid="6140898525580710823">"यदि पà¥à¤¨à¤ƒà¤¬à¤¹à¤¾à¤²à¥€ डेटा इनà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ छ भने कृपया तल पासवरà¥à¤¡ पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¿ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥:"</string>
+ <string name="toast_backup_started" msgid="550354281452756121">"जगेडा राखà¥à¤¨ सà¥à¤°à¥ हà¥à¤à¤¦à¥ˆ..."</string>
+ <string name="toast_backup_ended" msgid="3818080769548726424">"बà¥à¤¯à¤¾à¤•अप सकियो"</string>
+ <string name="toast_restore_started" msgid="7881679218971277385">"पà¥à¤¨à¤ƒà¤¸à¥à¤¥à¤¾à¤ªà¤¨à¤¾ सà¥à¤°à¥ हà¥à¤à¤¦à¥ˆà¤›..."</string>
+ <string name="toast_restore_ended" msgid="1764041639199696132">"पà¥à¤¨à¤ƒà¤¬à¤¹à¤¾à¤²à¥€ समापà¥à¤¤ भयो"</string>
+ <string name="toast_timeout" msgid="5276598587087626877">"संचलन कारà¥à¤¯à¤•ो समय समापà¥à¤¤ भयो"</string>
+</resources>
diff --git a/packages/BackupRestoreConfirmation/res/values-ne/strings.xml b/packages/BackupRestoreConfirmation/res/values-ne/strings.xml
new file mode 100644
index 0000000..c56332f
--- /dev/null
+++ b/packages/BackupRestoreConfirmation/res/values-ne/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="backup_confirm_title" msgid="827563724209303345">"पूरà¥à¤£ बà¥à¤¯à¤¾à¤•अप"</string>
+ <string name="restore_confirm_title" msgid="5469365809567486602">"पूरà¥à¤£ पà¥à¤¨à¤ƒà¤ªà¥à¤°à¤¾à¤ªà¥à¤¤à¤¿"</string>
+ <string name="backup_confirm_text" msgid="1878021282758896593">"à¤à¤‰à¤Ÿà¤¾ जोडिà¤à¤•ो डेसà¥à¤•टप कमà¥à¤ªà¥à¤¯à¥à¤Ÿà¤°à¤®à¤¾ सबै डेटाको à¤à¤‰à¤Ÿà¤¾ पूरà¥à¤£ जगेडाको अनà¥à¤°à¥‹à¤§ गरिà¤à¤•ो छ। के तपाईठयो हà¥à¤¨ दिन चाहनà¥à¤¹à¥à¤¨à¥à¤›? \n\nयदि तपाईà¤à¤²à¥‡ जगेडाको लागि आफैठअनà¥à¤°à¥‹à¤§ गरà¥à¤¨à¥ भà¤à¤¨ भने पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾à¤²à¤¾à¤ˆ अगाडि बढà¥à¤¨ अनà¥à¤®à¤¤à¤¿ नदिनà¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="allow_backup_button_label" msgid="4217228747769644068">"मेरो डेटा बà¥à¤¯à¤¾à¤•अप गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="deny_backup_button_label" msgid="6009119115581097708">"जगेडा नगरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="restore_confirm_text" msgid="7499866728030461776">"à¤à¤‰à¤Ÿà¤¾ जडित डेसà¥à¤•टप कमà¥à¤ªà¥à¤¯à¥à¤Ÿà¤°à¤¬à¤¾à¤Ÿ सबै डेटाको पूरà¥à¤£ पà¥à¤¨à¤ƒà¤¬à¤¹à¤¾à¤²à¥€ अनà¥à¤°à¥‹à¤§ गरियो। के तपाईं यो हà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनà¥à¤¹à¥à¤¨à¥à¤›?\n\nयदि तपाईं आफैं पà¥à¤¨à¤ƒà¤¬à¤¹à¤¾à¤²à¥€ अनà¥à¤°à¥‹à¤§ गरà¥à¤¨à¥à¤¹à¥à¤¨à¥à¤¨ भने अपरेसनलाई अघि बढाउन अनà¥à¤®à¤¤à¤¿ नदिनà¥à¤¹à¥‹à¤¸à¥à¥¤ यसले उपकरणमा भà¤à¤•ो कà¥à¤¨à¥ˆ पनि डेटालाई बदलà¥à¤¨à¥‡ छ!"</string>
+ <string name="allow_restore_button_label" msgid="3081286752277127827">"मेरो डेटा पà¥à¤¨à¤ƒà¤¬à¤¹à¤¾à¤²à¥€ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="deny_restore_button_label" msgid="1724367334453104378">"पà¥à¤¨:सà¥à¤¥à¤¾à¤ªà¤¨à¤¾ नगरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="current_password_text" msgid="8268189555578298067">"कृपया तल तपाईंको हालको बà¥à¤¯à¤¾à¤•अप पासवरà¥à¤¡ पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¿ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥:"</string>
+ <string name="device_encryption_restore_text" msgid="1570864916855208992">"कृपया तल तपाईंको उपकरण à¤à¤¨à¥à¤•à¥à¤°à¤¿à¤ªà¥à¤¸à¤¨ पासवरà¥à¤¡ पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¿ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥:"</string>
+ <string name="device_encryption_backup_text" msgid="5866590762672844664">"कृपया तल तपाईंको उपकरण à¤à¤¨à¥à¤•à¥à¤°à¤¿à¤ªà¥à¤¸à¤¨ पासवरà¥à¤¡ पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¿ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥: यो बà¥à¤¯à¤¾à¤•प सà¤à¤—à¥à¤°à¤¹ à¤à¤¨à¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ गरà¥à¤¨ पनि पà¥à¤°à¤¯à¥‹à¤— हà¥à¤¨à¥‡ छ।"</string>
+ <string name="backup_enc_password_text" msgid="4981585714795233099">"बà¥à¤¯à¤¾à¤•प डेटालाई encrypt गरà¥à¤¨ पासवरà¥à¤¡ पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¿ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥, यदि यो खालि छोडिà¤à¤•ो खणà¥à¤¡à¤®à¤¾ तपाईको पà¥à¤°à¤¾à¤¨à¥ˆ पासवरà¥à¤¡ पà¥à¤°à¤¯à¥‹à¤— हà¥à¤¨à¥‡ छ।"</string>
+ <string name="backup_enc_password_optional" msgid="1350137345907579306">"यदि तपाईं पूरà¥à¤£ बà¥à¤¯à¤¾à¤•अप डेटा इनà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ गरà¥à¤¨ चाहनॠहà¥à¤¨à¥à¤› भने तल पासवरà¥à¤¡ पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¿ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="restore_enc_password_text" msgid="6140898525580710823">"यदि पà¥à¤¨à¤ƒà¤¬à¤¹à¤¾à¤²à¥€ डेटा इनà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ छ भने कृपया तल पासवरà¥à¤¡ पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¿ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥:"</string>
+ <string name="toast_backup_started" msgid="550354281452756121">"जगेडा राखà¥à¤¨ सà¥à¤°à¥ हà¥à¤à¤¦à¥ˆ..."</string>
+ <string name="toast_backup_ended" msgid="3818080769548726424">"बà¥à¤¯à¤¾à¤•अप सकियो"</string>
+ <string name="toast_restore_started" msgid="7881679218971277385">"पà¥à¤¨à¤ƒà¤¸à¥à¤¥à¤¾à¤ªà¤¨à¤¾ सà¥à¤°à¥ हà¥à¤à¤¦à¥ˆà¤›..."</string>
+ <string name="toast_restore_ended" msgid="1764041639199696132">"पà¥à¤¨à¤ƒà¤¬à¤¹à¤¾à¤²à¥€ समापà¥à¤¤ भयो"</string>
+ <string name="toast_timeout" msgid="5276598587087626877">"संचलन कारà¥à¤¯à¤•ो समय समापà¥à¤¤ भयो"</string>
+</resources>
diff --git a/packages/BackupRestoreConfirmation/res/values-si-rLK/strings.xml b/packages/BackupRestoreConfirmation/res/values-si-rLK/strings.xml
new file mode 100644
index 0000000..ed32e73
--- /dev/null
+++ b/packages/BackupRestoreConfirmation/res/values-si-rLK/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="backup_confirm_title" msgid="827563724209303345">"සම්පූර්ණ උපස්ථය"</string>
+ <string name="restore_confirm_title" msgid="5469365809567486602">"සම්පූර්ණයෙන් à¶±à·à·€à¶­ පිහිටුවන්න"</string>
+ <string name="backup_confirm_text" msgid="1878021282758896593">"ඩෙස්ක්ටොප් පරිගණකයකට සම්බන්ධිත සියලුම දත්ත වල සම්පූර්ණ උපස්ථයක් ඉල්ල෠තිබේ. මෙම සිදු වෙනවà·à¶§ අවසර දීමට ඔබට à¶…à·€à·à·Šâ€à¶ºà¶¯?\n\nඔබ විසින් උපස්ථය කිරීමට ඉල්ල෠නොතිබුණි නම්, මෙම මෙහෙයුම ඉදිරියට කරගෙන යà·à¶¸à¶§ අවසර දෙන්න à¶‘à¶´à·. 1"</string>
+ <string name="allow_backup_button_label" msgid="4217228747769644068">"මගේ දත්ත උපස්ථ කරන්න"</string>
+ <string name="deny_backup_button_label" msgid="6009119115581097708">"උපස්ථ කරන්න à¶‘à¶´à·"</string>
+ <string name="restore_confirm_text" msgid="7499866728030461776">"සම්බන්ධිත ඩෙස්ක්ටොප් පරිගණකයකින් සියලු දත්ත වල සම්පූර්ණ à¶´à·Šâ€à¶»à¶­à·’ස්ථà·à¶´à¶±à¶ºà¶šà·Š ඉල්ල෠ඇත. ඔබ මෙය සිදු වීමට අවසර දෙනව෠ද?\n\nඔබ විසින් à¶´à·Šâ€à¶»à¶­à·’ස්ථà·à¶´à¶±à¶º ඉල්ල෠නොමà·à¶­à·’ නම්, à¶šà·Šâ€à¶»à·’යà·à·€à¶½à·’යට ඉදිරියට යà·à¶¸à¶§ ඉඩ නොදෙන්න. à¶‹à¶´à·à¶‚ගයේ දà·à¶±à¶§ ඇති ඕනෑම දත්තයක් මෙමඟින් à¶´à·Šâ€à¶»à¶­à·’ස්ථà·à¶´à¶±à¶º වෙයි!"</string>
+ <string name="allow_restore_button_label" msgid="3081286752277127827">"මගේ දත්ත à¶±à·à·€à¶­ පිහිටුවන්න"</string>
+ <string name="deny_restore_button_label" msgid="1724367334453104378">"à¶±à·à·€à¶­ පිහිටුවන්න à¶‘à¶´à·"</string>
+ <string name="current_password_text" msgid="8268189555578298067">"කරුණà·à¶šà¶» ඔබගේ වර්තමà·à¶± උපස්ථ මුරපදය à¶´à·„à¶­ ඇතුලත් කරන්න:"</string>
+ <string name="device_encryption_restore_text" msgid="1570864916855208992">"කරුණà·à¶šà¶» ඔබගේ à¶‹à¶´à·à¶‚ගයේ සංකේතන මුරපදය à¶´à·„à¶­ ඇතුලත් කරන්න."</string>
+ <string name="device_encryption_backup_text" msgid="5866590762672844664">"කරුණà·à¶šà¶» ඔබගේ à¶‹à¶´à·à¶‚ගයේ සංකේතන මුරපදය à¶´à·„à¶­ ඇතුලත් කරන්න. සංරක්ෂිත උපස්ථ සංකේතනය කිරීමට මෙය à¶·à·à·€à·’à¶­ à¶šà·… à·„à·à¶š."</string>
+ <string name="backup_enc_password_text" msgid="4981585714795233099">"කරුණà·à¶šà¶» සියලු උපස්ථ දත්ත සංකේතනය කිරීම සඳහ෠භà·à·€à·’තයට මුරපදයක් ඇතුළත් කරන්න. මෙය හිස්ව à¶­à·à¶¶à·”වොත්, ඔබගේ වර්තමà·à¶± උපස්ථ මුරපදය à¶·à·à·€à·’à¶­ වෙයි:"</string>
+ <string name="backup_enc_password_optional" msgid="1350137345907579306">"සියලු උපස්ථ දත්ත සංකේතනය කිරීමට ඔබ අදහස් කරන්නේ නම්, මුරපදය පහලින් ඇතුලත් කරන්න:"</string>
+ <string name="restore_enc_password_text" msgid="6140898525580710823">"යළි පිහිටුවන දත්ත සංකේතනය කරන ලද à¶’à·€à·à¶±à¶¸à·Š, කරුණà·à¶šà¶» මුරපදය පහලින් ඇතුල් කරන්න:"</string>
+ <string name="toast_backup_started" msgid="550354281452756121">"උපස්ථ කිරීම ආරම්භ කරමින්..."</string>
+ <string name="toast_backup_ended" msgid="3818080769548726424">"උපස්ථය අවසන්"</string>
+ <string name="toast_restore_started" msgid="7881679218971277385">"යළි පිහිටුවීම අරඹයි..."</string>
+ <string name="toast_restore_ended" msgid="1764041639199696132">"යළි පිහිටුවීම අවසන්"</string>
+ <string name="toast_timeout" msgid="5276598587087626877">"à¶šà·Šâ€à¶»à·’යà·à·€à¶½à·’ය කල් ඉකුත් වී ඇත"</string>
+</resources>
diff --git a/packages/BackupRestoreConfirmation/res/values-si/strings.xml b/packages/BackupRestoreConfirmation/res/values-si/strings.xml
new file mode 100644
index 0000000..ed32e73
--- /dev/null
+++ b/packages/BackupRestoreConfirmation/res/values-si/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="backup_confirm_title" msgid="827563724209303345">"සම්පූර්ණ උපස්ථය"</string>
+ <string name="restore_confirm_title" msgid="5469365809567486602">"සම්පූර්ණයෙන් à¶±à·à·€à¶­ පිහිටුවන්න"</string>
+ <string name="backup_confirm_text" msgid="1878021282758896593">"ඩෙස්ක්ටොප් පරිගණකයකට සම්බන්ධිත සියලුම දත්ත වල සම්පූර්ණ උපස්ථයක් ඉල්ල෠තිබේ. මෙම සිදු වෙනවà·à¶§ අවසර දීමට ඔබට à¶…à·€à·à·Šâ€à¶ºà¶¯?\n\nඔබ විසින් උපස්ථය කිරීමට ඉල්ල෠නොතිබුණි නම්, මෙම මෙහෙයුම ඉදිරියට කරගෙන යà·à¶¸à¶§ අවසර දෙන්න à¶‘à¶´à·. 1"</string>
+ <string name="allow_backup_button_label" msgid="4217228747769644068">"මගේ දත්ත උපස්ථ කරන්න"</string>
+ <string name="deny_backup_button_label" msgid="6009119115581097708">"උපස්ථ කරන්න à¶‘à¶´à·"</string>
+ <string name="restore_confirm_text" msgid="7499866728030461776">"සම්බන්ධිත ඩෙස්ක්ටොප් පරිගණකයකින් සියලු දත්ත වල සම්පූර්ණ à¶´à·Šâ€à¶»à¶­à·’ස්ථà·à¶´à¶±à¶ºà¶šà·Š ඉල්ල෠ඇත. ඔබ මෙය සිදු වීමට අවසර දෙනව෠ද?\n\nඔබ විසින් à¶´à·Šâ€à¶»à¶­à·’ස්ථà·à¶´à¶±à¶º ඉල්ල෠නොමà·à¶­à·’ නම්, à¶šà·Šâ€à¶»à·’යà·à·€à¶½à·’යට ඉදිරියට යà·à¶¸à¶§ ඉඩ නොදෙන්න. à¶‹à¶´à·à¶‚ගයේ දà·à¶±à¶§ ඇති ඕනෑම දත්තයක් මෙමඟින් à¶´à·Šâ€à¶»à¶­à·’ස්ථà·à¶´à¶±à¶º වෙයි!"</string>
+ <string name="allow_restore_button_label" msgid="3081286752277127827">"මගේ දත්ත à¶±à·à·€à¶­ පිහිටුවන්න"</string>
+ <string name="deny_restore_button_label" msgid="1724367334453104378">"à¶±à·à·€à¶­ පිහිටුවන්න à¶‘à¶´à·"</string>
+ <string name="current_password_text" msgid="8268189555578298067">"කරුණà·à¶šà¶» ඔබගේ වර්තමà·à¶± උපස්ථ මුරපදය à¶´à·„à¶­ ඇතුලත් කරන්න:"</string>
+ <string name="device_encryption_restore_text" msgid="1570864916855208992">"කරුණà·à¶šà¶» ඔබගේ à¶‹à¶´à·à¶‚ගයේ සංකේතන මුරපදය à¶´à·„à¶­ ඇතුලත් කරන්න."</string>
+ <string name="device_encryption_backup_text" msgid="5866590762672844664">"කරුණà·à¶šà¶» ඔබගේ à¶‹à¶´à·à¶‚ගයේ සංකේතන මුරපදය à¶´à·„à¶­ ඇතුලත් කරන්න. සංරක්ෂිත උපස්ථ සංකේතනය කිරීමට මෙය à¶·à·à·€à·’à¶­ à¶šà·… à·„à·à¶š."</string>
+ <string name="backup_enc_password_text" msgid="4981585714795233099">"කරුණà·à¶šà¶» සියලු උපස්ථ දත්ත සංකේතනය කිරීම සඳහ෠භà·à·€à·’තයට මුරපදයක් ඇතුළත් කරන්න. මෙය හිස්ව à¶­à·à¶¶à·”වොත්, ඔබගේ වර්තමà·à¶± උපස්ථ මුරපදය à¶·à·à·€à·’à¶­ වෙයි:"</string>
+ <string name="backup_enc_password_optional" msgid="1350137345907579306">"සියලු උපස්ථ දත්ත සංකේතනය කිරීමට ඔබ අදහස් කරන්නේ නම්, මුරපදය පහලින් ඇතුලත් කරන්න:"</string>
+ <string name="restore_enc_password_text" msgid="6140898525580710823">"යළි පිහිටුවන දත්ත සංකේතනය කරන ලද à¶’à·€à·à¶±à¶¸à·Š, කරුණà·à¶šà¶» මුරපදය පහලින් ඇතුල් කරන්න:"</string>
+ <string name="toast_backup_started" msgid="550354281452756121">"උපස්ථ කිරීම ආරම්භ කරමින්..."</string>
+ <string name="toast_backup_ended" msgid="3818080769548726424">"උපස්ථය අවසන්"</string>
+ <string name="toast_restore_started" msgid="7881679218971277385">"යළි පිහිටුවීම අරඹයි..."</string>
+ <string name="toast_restore_ended" msgid="1764041639199696132">"යළි පිහිටුවීම අවසන්"</string>
+ <string name="toast_timeout" msgid="5276598587087626877">"à¶šà·Šâ€à¶»à·’යà·à·€à¶½à·’ය කල් ඉකුත් වී ඇත"</string>
+</resources>
diff --git a/packages/BackupRestoreConfirmation/res/values-zh-rHK/strings.xml b/packages/BackupRestoreConfirmation/res/values-zh-rHK/strings.xml
new file mode 100644
index 0000000..d3bcd6e
--- /dev/null
+++ b/packages/BackupRestoreConfirmation/res/values-zh-rHK/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="backup_confirm_title" msgid="827563724209303345">"完整備份"</string>
+ <string name="restore_confirm_title" msgid="5469365809567486602">"完整還原"</string>
+ <string name="backup_confirm_text" msgid="1878021282758896593">"ç³»çµ±æ”¶åˆ°å°‡æ‰€æœ‰è³‡æ–™å®Œæ•´å‚™ä»½åˆ°é€£ç·šæ¡Œä¸Šé›»è…¦çš„è¦æ±‚ï¼Œè«‹å•æ‚¨å…許進行備份嗎?\n\n如果您本人並未æå‡ºå‚™ä»½è¦æ±‚,請勿å…許繼續進行這項作業。"</string>
+ <string name="allow_backup_button_label" msgid="4217228747769644068">"備份我的資料"</string>
+ <string name="deny_backup_button_label" msgid="6009119115581097708">"ä¸è¦å‚™ä»½"</string>
+ <string name="restore_confirm_text" msgid="7499866728030461776">"ç³»çµ±æ”¶åˆ°å¾žé€£ç·šçš„æ¡Œä¸Šé›»è…¦å®Œæ•´é‚„åŽŸæ‰€æœ‰è³‡æ–™çš„è¦æ±‚ï¼Œè«‹å•æ‚¨å…許進行還原嗎?\n\n如果您本人並未æå‡ºé‚„åŽŸè¦æ±‚,請勿å…許繼續進行這項作業。這項作業將å–代è£ç½®ä¸Šç¾æœ‰çš„全部資料ï¼"</string>
+ <string name="allow_restore_button_label" msgid="3081286752277127827">"還原我的資料"</string>
+ <string name="deny_restore_button_label" msgid="1724367334453104378">"ä¸è¦é‚„原"</string>
+ <string name="current_password_text" msgid="8268189555578298067">"在下é¢è¼¸å…¥æ‚¨ç›®å‰çš„備份密碼:"</string>
+ <string name="device_encryption_restore_text" msgid="1570864916855208992">"請在下é¢è¼¸å…¥æ‚¨çš„è£ç½®åŠ å¯†å¯†ç¢¼ã€‚"</string>
+ <string name="device_encryption_backup_text" msgid="5866590762672844664">"請在下é¢è¼¸å…¥æ‚¨çš„è£ç½®åŠ å¯†å¯†ç¢¼ï¼Œé€™ä¹Ÿæœƒç”¨ä¾†å°‡å°å­˜å‚™ä»½åŠ å¯†ã€‚"</string>
+ <string name="backup_enc_password_text" msgid="4981585714795233099">"請輸入為完整備份資料加密的專用密碼。如果留空,系統將使用您目å‰çš„備份密碼:"</string>
+ <string name="backup_enc_password_optional" msgid="1350137345907579306">"如果您想將完整的備份資料加密,請在下é¢è¼¸å…¥ä¸€çµ„密碼:"</string>
+ <string name="restore_enc_password_text" msgid="6140898525580710823">"如果還原的資料經éŽåŠ å¯†è™•ç†ï¼Œè«‹åœ¨ä¸‹é¢è¼¸å…¥å¯†ç¢¼ï¼š"</string>
+ <string name="toast_backup_started" msgid="550354281452756121">"正在開始備份..."</string>
+ <string name="toast_backup_ended" msgid="3818080769548726424">"備份完畢"</string>
+ <string name="toast_restore_started" msgid="7881679218971277385">"正在開始還原..."</string>
+ <string name="toast_restore_ended" msgid="1764041639199696132">"還原完畢"</string>
+ <string name="toast_timeout" msgid="5276598587087626877">"æ“作逾時"</string>
+</resources>
diff --git a/packages/BackupRestoreConfirmation/res/values-zu/strings.xml b/packages/BackupRestoreConfirmation/res/values-zu/strings.xml
index b62b7af..955b26f 100644
--- a/packages/BackupRestoreConfirmation/res/values-zu/strings.xml
+++ b/packages/BackupRestoreConfirmation/res/values-zu/strings.xml
@@ -29,7 +29,7 @@
<string name="device_encryption_backup_text" msgid="5866590762672844664">"Uyacelwa ukuba ufake iphasiwedi efakwe kudivayisi yakho ngezansi. lokhu kuzosetshenziswa ukufaka kusilondoloza sokusiza lapho kudingeka."</string>
<string name="backup_enc_password_text" msgid="4981585714795233099">"Sicela ufake iphasiwedi ezosetshenziselwa ukubhala ngokufihlekileyo imininingo eyesekwe ngokulondoloza. Uma lokhu kushiywe kungabhalwe lutho, kuzosetshenziswa iphasiwedi yokweseka ngokulondoloza yamanje:"</string>
<string name="backup_enc_password_optional" msgid="1350137345907579306">"Uma ufuna ukufaka ikhowudi kwimininingo yonke eyesekelwe ngokulondoloza faka i-passowrd engezansi:"</string>
- <string name="restore_enc_password_text" msgid="6140898525580710823">"Uma insiza yokubuyiselwa esimweni kwmininingo ibhalwe ngokufihlekileyo, sicela ufake iphasiwedi engezansi:"</string>
+ <string name="restore_enc_password_text" msgid="6140898525580710823">"Uma uhlelo lokusebenza yokubuyiselwa esimweni kwmininingo ibhalwe ngokufihlekileyo, sicela ufake iphasiwedi engezansi:"</string>
<string name="toast_backup_started" msgid="550354281452756121">"Ukulondoloza kuyaqala..."</string>
<string name="toast_backup_ended" msgid="3818080769548726424">"Ukulondoloza kuphelile"</string>
<string name="toast_restore_started" msgid="7881679218971277385">"Ukubuyisa kuyaqala..."</string>
diff --git a/packages/DefaultContainerService/res/values-az-rAZ/strings.xml b/packages/DefaultContainerService/res/values-az-rAZ/strings.xml
new file mode 100644
index 0000000..cae7d02
--- /dev/null
+++ b/packages/DefaultContainerService/res/values-az-rAZ/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+**
+** Copyright 2008, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="service_name" msgid="4841491635055379553">"Paket Giriş Yardımçısı"</string>
+</resources>
diff --git a/packages/DefaultContainerService/res/values-az/strings.xml b/packages/DefaultContainerService/res/values-az/strings.xml
new file mode 100644
index 0000000..cae7d02
--- /dev/null
+++ b/packages/DefaultContainerService/res/values-az/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+**
+** Copyright 2008, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="service_name" msgid="4841491635055379553">"Paket Giriş Yardımçısı"</string>
+</resources>
diff --git a/packages/DefaultContainerService/res/values-en-rIN/strings.xml b/packages/DefaultContainerService/res/values-en-rIN/strings.xml
new file mode 100644
index 0000000..216d715
--- /dev/null
+++ b/packages/DefaultContainerService/res/values-en-rIN/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+**
+** Copyright 2008, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="service_name" msgid="4841491635055379553">"Package Access Helper"</string>
+</resources>
diff --git a/packages/DefaultContainerService/res/values-et-rEE/strings.xml b/packages/DefaultContainerService/res/values-et-rEE/strings.xml
new file mode 100644
index 0000000..216d715
--- /dev/null
+++ b/packages/DefaultContainerService/res/values-et-rEE/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+**
+** Copyright 2008, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="service_name" msgid="4841491635055379553">"Package Access Helper"</string>
+</resources>
diff --git a/packages/DefaultContainerService/res/values-fr-rCA/strings.xml b/packages/DefaultContainerService/res/values-fr-rCA/strings.xml
new file mode 100644
index 0000000..69c4e99
--- /dev/null
+++ b/packages/DefaultContainerService/res/values-fr-rCA/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+**
+** Copyright 2008, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="service_name" msgid="4841491635055379553">"Aide accès au paquet"</string>
+</resources>
diff --git a/packages/DefaultContainerService/res/values-hy-rAM/strings.xml b/packages/DefaultContainerService/res/values-hy-rAM/strings.xml
new file mode 100644
index 0000000..1e2f587
--- /dev/null
+++ b/packages/DefaultContainerService/res/values-hy-rAM/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+**
+** Copyright 2008, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="service_name" msgid="4841491635055379553">"Õ“Õ¡Õ©Õ¥Õ©Õ« Õ´Õ¸Ö‚Õ¿Ö„Õ« Ö…ÕªÕ¡Õ¶Õ¤Õ¡Õ¯Õ¸Õ²"</string>
+</resources>
diff --git a/packages/DefaultContainerService/res/values-hy/strings.xml b/packages/DefaultContainerService/res/values-hy/strings.xml
new file mode 100644
index 0000000..1e2f587
--- /dev/null
+++ b/packages/DefaultContainerService/res/values-hy/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+**
+** Copyright 2008, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="service_name" msgid="4841491635055379553">"Õ“Õ¡Õ©Õ¥Õ©Õ« Õ´Õ¸Ö‚Õ¿Ö„Õ« Ö…ÕªÕ¡Õ¶Õ¤Õ¡Õ¯Õ¸Õ²"</string>
+</resources>
diff --git a/packages/DefaultContainerService/res/values-ka-rGE/strings.xml b/packages/DefaultContainerService/res/values-ka-rGE/strings.xml
new file mode 100644
index 0000000..216d715
--- /dev/null
+++ b/packages/DefaultContainerService/res/values-ka-rGE/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+**
+** Copyright 2008, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="service_name" msgid="4841491635055379553">"Package Access Helper"</string>
+</resources>
diff --git a/packages/DefaultContainerService/res/values-ka/strings.xml b/packages/DefaultContainerService/res/values-ka/strings.xml
new file mode 100644
index 0000000..216d715
--- /dev/null
+++ b/packages/DefaultContainerService/res/values-ka/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+**
+** Copyright 2008, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="service_name" msgid="4841491635055379553">"Package Access Helper"</string>
+</resources>
diff --git a/packages/DefaultContainerService/res/values-km-rKH/strings.xml b/packages/DefaultContainerService/res/values-km-rKH/strings.xml
new file mode 100644
index 0000000..1006d56
--- /dev/null
+++ b/packages/DefaultContainerService/res/values-km-rKH/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+**
+** Copyright 2008, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="service_name" msgid="4841491635055379553">"កម្មវិធី​ជំនួយ​ចូល​ដំណើរការ​កញ្ចប់"</string>
+</resources>
diff --git a/packages/DefaultContainerService/res/values-km/strings.xml b/packages/DefaultContainerService/res/values-km/strings.xml
new file mode 100644
index 0000000..1006d56
--- /dev/null
+++ b/packages/DefaultContainerService/res/values-km/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+**
+** Copyright 2008, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="service_name" msgid="4841491635055379553">"កម្មវិធី​ជំនួយ​ចូល​ដំណើរការ​កញ្ចប់"</string>
+</resources>
diff --git a/packages/DefaultContainerService/res/values-lo-rLA/strings.xml b/packages/DefaultContainerService/res/values-lo-rLA/strings.xml
new file mode 100644
index 0000000..216d715
--- /dev/null
+++ b/packages/DefaultContainerService/res/values-lo-rLA/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+**
+** Copyright 2008, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="service_name" msgid="4841491635055379553">"Package Access Helper"</string>
+</resources>
diff --git a/packages/DefaultContainerService/res/values-lo/strings.xml b/packages/DefaultContainerService/res/values-lo/strings.xml
new file mode 100644
index 0000000..216d715
--- /dev/null
+++ b/packages/DefaultContainerService/res/values-lo/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+**
+** Copyright 2008, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="service_name" msgid="4841491635055379553">"Package Access Helper"</string>
+</resources>
diff --git a/packages/DefaultContainerService/res/values-mn-rMN/strings.xml b/packages/DefaultContainerService/res/values-mn-rMN/strings.xml
new file mode 100644
index 0000000..d9fe647
--- /dev/null
+++ b/packages/DefaultContainerService/res/values-mn-rMN/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+**
+** Copyright 2008, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="service_name" msgid="4841491635055379553">"Багц хандалтын туÑламж"</string>
+</resources>
diff --git a/packages/DefaultContainerService/res/values-mn/strings.xml b/packages/DefaultContainerService/res/values-mn/strings.xml
new file mode 100644
index 0000000..d9fe647
--- /dev/null
+++ b/packages/DefaultContainerService/res/values-mn/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+**
+** Copyright 2008, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="service_name" msgid="4841491635055379553">"Багц хандалтын туÑламж"</string>
+</resources>
diff --git a/packages/DefaultContainerService/res/values-ms-rMY/strings.xml b/packages/DefaultContainerService/res/values-ms-rMY/strings.xml
new file mode 100644
index 0000000..77d7927
--- /dev/null
+++ b/packages/DefaultContainerService/res/values-ms-rMY/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+**
+** Copyright 2008, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="service_name" msgid="4841491635055379553">"Pembantu Akses Pakej"</string>
+</resources>
diff --git a/packages/DefaultContainerService/res/values-ne-rNP/strings.xml b/packages/DefaultContainerService/res/values-ne-rNP/strings.xml
new file mode 100644
index 0000000..5b70ce1
--- /dev/null
+++ b/packages/DefaultContainerService/res/values-ne-rNP/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+**
+** Copyright 2008, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="service_name" msgid="4841491635055379553">"पà¥à¤¯à¤¾à¤•ेज पहà¥à¤à¤š सहयोगी"</string>
+</resources>
diff --git a/packages/DefaultContainerService/res/values-ne/strings.xml b/packages/DefaultContainerService/res/values-ne/strings.xml
new file mode 100644
index 0000000..5b70ce1
--- /dev/null
+++ b/packages/DefaultContainerService/res/values-ne/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+**
+** Copyright 2008, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="service_name" msgid="4841491635055379553">"पà¥à¤¯à¤¾à¤•ेज पहà¥à¤à¤š सहयोगी"</string>
+</resources>
diff --git a/packages/DefaultContainerService/res/values-si-rLK/strings.xml b/packages/DefaultContainerService/res/values-si-rLK/strings.xml
new file mode 100644
index 0000000..522ec6c
--- /dev/null
+++ b/packages/DefaultContainerService/res/values-si-rLK/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+**
+** Copyright 2008, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="service_name" msgid="4841491635055379553">"à¶´à·à¶šà·šà¶¢ à¶´à·Šâ€à¶»à·€à·šà· උදව්කරු"</string>
+</resources>
diff --git a/packages/DefaultContainerService/res/values-si/strings.xml b/packages/DefaultContainerService/res/values-si/strings.xml
new file mode 100644
index 0000000..522ec6c
--- /dev/null
+++ b/packages/DefaultContainerService/res/values-si/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+**
+** Copyright 2008, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="service_name" msgid="4841491635055379553">"à¶´à·à¶šà·šà¶¢ à¶´à·Šâ€à¶»à·€à·šà· උදව්කරු"</string>
+</resources>
diff --git a/packages/DefaultContainerService/res/values-zh-rHK/strings.xml b/packages/DefaultContainerService/res/values-zh-rHK/strings.xml
new file mode 100644
index 0000000..9a43509
--- /dev/null
+++ b/packages/DefaultContainerService/res/values-zh-rHK/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+**
+** Copyright 2008, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="service_name" msgid="4841491635055379553">"套件存å–輔助程å¼"</string>
+</resources>
diff --git a/packages/DocumentsUI/res/values-af/strings.xml b/packages/DocumentsUI/res/values-af/strings.xml
new file mode 100644
index 0000000..41fd63a
--- /dev/null
+++ b/packages/DocumentsUI/res/values-af/strings.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="2783841764617238354">"Dokumente"</string>
+ <string name="title_open" msgid="4353228937663917801">"Maak oop vanaf"</string>
+ <string name="title_save" msgid="2433679664882857999">"Stoor na"</string>
+ <string name="menu_create_dir" msgid="5947289605844398389">"Skep vouer"</string>
+ <string name="menu_grid" msgid="6878021334497835259">"Roosteraansig"</string>
+ <string name="menu_list" msgid="7279285939892417279">"Lysaansig"</string>
+ <string name="menu_sort" msgid="7677740407158414452">"Sorteer volgens"</string>
+ <string name="menu_search" msgid="3816712084502856974">"Soek"</string>
+ <string name="menu_settings" msgid="6008033148948428823">"Instellings"</string>
+ <string name="menu_open" msgid="432922957274920903">"Maak oop"</string>
+ <string name="menu_save" msgid="2394743337684426338">"Stoor"</string>
+ <string name="menu_share" msgid="3075149983979628146">"Deel"</string>
+ <string name="menu_delete" msgid="8138799623850614177">"Vee uit"</string>
+ <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> gekies"</string>
+ <string name="sort_name" msgid="9183560467917256779">"Volgens naam"</string>
+ <string name="sort_date" msgid="586080032956151448">"Volgens datum gewysig"</string>
+ <string name="sort_size" msgid="3350681319735474741">"Volgens grootte"</string>
+ <string name="drawer_open" msgid="4545466532430226949">"Wys wortels"</string>
+ <string name="drawer_close" msgid="7602734368552123318">"Versteek wortels"</string>
+ <string name="save_error" msgid="6167009778003223664">"Kon nie dokument stoor nie"</string>
+ <string name="create_error" msgid="3735649141335444215">"Kon nie vouer skep nie"</string>
+ <string name="query_error" msgid="1222448261663503501">"Kon nie navraag doen oor dokumente nie"</string>
+ <string name="root_recent" msgid="4470053704320518133">"Onlangs"</string>
+ <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> gratis"</string>
+ <string name="root_type_service" msgid="2178854894416775409">"Bergingdienste"</string>
+ <string name="root_type_shortcut" msgid="3318760609471618093">"Kortpaaie"</string>
+ <string name="root_type_device" msgid="7121342474653483538">"Toestelle"</string>
+ <string name="root_type_apps" msgid="8838065367985945189">"Nog programme"</string>
+ <string name="pref_advanced_devices" msgid="903257239609301276">"Wys gevorderde toestelle"</string>
+ <string name="pref_file_size" msgid="2826879315743961459">"Wys lêergrootte"</string>
+ <string name="pref_device_size" msgid="3542106883278997222">"Wys toestelgrootte"</string>
+ <string name="empty" msgid="7858882803708117596">"Geen items nie"</string>
+ <string name="toast_no_application" msgid="1339885974067891667">"Kan lêer nie oopmaak nie"</string>
+ <string name="toast_failed_delete" msgid="2180678019407244069">"Kan sommige dokumente nie uitvee nie"</string>
+ <string name="share_via" msgid="8966594246261344259">"Deel via"</string>
+</resources>
diff --git a/packages/DocumentsUI/res/values-am/strings.xml b/packages/DocumentsUI/res/values-am/strings.xml
new file mode 100644
index 0000000..c77a8ee
--- /dev/null
+++ b/packages/DocumentsUI/res/values-am/strings.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="2783841764617238354">"ሰáŠá‹¶á‰½"</string>
+ <string name="title_open" msgid="4353228937663917801">"ክáˆá‰µ ከ"</string>
+ <string name="title_save" msgid="2433679664882857999">"አስቀáˆáŒ¥ ወደ"</string>
+ <string name="menu_create_dir" msgid="5947289605844398389">"አቃአáጠር"</string>
+ <string name="menu_grid" msgid="6878021334497835259">"የáርáŒáˆ­áŒ እይታ"</string>
+ <string name="menu_list" msgid="7279285939892417279">"የá‹áˆ­á‹áˆ­ እይታ"</string>
+ <string name="menu_sort" msgid="7677740407158414452">"ደርድር በ"</string>
+ <string name="menu_search" msgid="3816712084502856974">"áˆáˆáŒ"</string>
+ <string name="menu_settings" msgid="6008033148948428823">"ቅንብሮች"</string>
+ <string name="menu_open" msgid="432922957274920903">"ክáˆá‰µ"</string>
+ <string name="menu_save" msgid="2394743337684426338">"አስቀáˆáŒ¥"</string>
+ <string name="menu_share" msgid="3075149983979628146">"አጋራ"</string>
+ <string name="menu_delete" msgid="8138799623850614177">"ሰርá‹"</string>
+ <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> ተመርጠዋáˆ"</string>
+ <string name="sort_name" msgid="9183560467917256779">"በስáˆ"</string>
+ <string name="sort_date" msgid="586080032956151448">"በተለወጠበት ቀን"</string>
+ <string name="sort_size" msgid="3350681319735474741">"በመጠን"</string>
+ <string name="drawer_open" msgid="4545466532430226949">"ስሮችን አሳይ"</string>
+ <string name="drawer_close" msgid="7602734368552123318">"ስሮችን ደብቅ"</string>
+ <string name="save_error" msgid="6167009778003223664">"ሰáŠá‹µ ማስቀመጥ አáˆá‰°áˆ³áŠ«áˆ"</string>
+ <string name="create_error" msgid="3735649141335444215">"አቃአመáጠር አáˆá‰°áˆ³áŠ«áˆ"</string>
+ <string name="query_error" msgid="1222448261663503501">"ለሰáŠá‹¶á‰½ መጠይቅ መስራት አáˆá‰°áˆ³áŠ«áˆ"</string>
+ <string name="root_recent" msgid="4470053704320518133">"የቅርብ ጊዜ"</string>
+ <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> áŠáƒ"</string>
+ <string name="root_type_service" msgid="2178854894416775409">"የማከማቻ አገáˆáŒáˆŽá‰¶á‰½"</string>
+ <string name="root_type_shortcut" msgid="3318760609471618093">"አቋራጮች"</string>
+ <string name="root_type_device" msgid="7121342474653483538">"መሣሪያዎች"</string>
+ <string name="root_type_apps" msgid="8838065367985945189">"ተጨማሪ መተáŒá‰ áˆªá‹«á‹Žá‰½"</string>
+ <string name="pref_advanced_devices" msgid="903257239609301276">"የላበመሳሪያዎችን አሳይ"</string>
+ <string name="pref_file_size" msgid="2826879315743961459">"የá‹á‹­áˆ መጠን አሳይ"</string>
+ <string name="pref_device_size" msgid="3542106883278997222">"የመሳሪያ መጠን አሳይ"</string>
+ <string name="empty" msgid="7858882803708117596">"áˆáŠ•áˆ áŠ•áŒ¥áˆŽá‰½ የሉáˆ"</string>
+ <string name="toast_no_application" msgid="1339885974067891667">"á‹á‹­áˆ መክáˆá‰µ አይቻáˆáˆ"</string>
+ <string name="toast_failed_delete" msgid="2180678019407244069">"አንዳንድ ሰáŠá‹¶á‰½áŠ• መሰረዠአáˆá‰°á‰»áˆˆáˆ"</string>
+ <string name="share_via" msgid="8966594246261344259">"በሚከተለዠበኩሠያጋሩ"</string>
+</resources>
diff --git a/packages/DocumentsUI/res/values-ar/strings.xml b/packages/DocumentsUI/res/values-ar/strings.xml
new file mode 100644
index 0000000..c59c0ee
--- /dev/null
+++ b/packages/DocumentsUI/res/values-ar/strings.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="2783841764617238354">"مستندات"</string>
+ <string name="title_open" msgid="4353228937663917801">"ÙØªØ­ من"</string>
+ <string name="title_save" msgid="2433679664882857999">"Ø­ÙØ¸ ÙÙŠ"</string>
+ <string name="menu_create_dir" msgid="5947289605844398389">"إنشاء مجلد"</string>
+ <string name="menu_grid" msgid="6878021334497835259">"عرض الشبكة"</string>
+ <string name="menu_list" msgid="7279285939892417279">"عرض القائمة"</string>
+ <string name="menu_sort" msgid="7677740407158414452">"ترتيب بحسب"</string>
+ <string name="menu_search" msgid="3816712084502856974">"بحث"</string>
+ <string name="menu_settings" msgid="6008033148948428823">"الإعدادات"</string>
+ <string name="menu_open" msgid="432922957274920903">"ÙØªØ­"</string>
+ <string name="menu_save" msgid="2394743337684426338">"Ø­ÙØ¸"</string>
+ <string name="menu_share" msgid="3075149983979628146">"مشاركة"</string>
+ <string name="menu_delete" msgid="8138799623850614177">"حذÙ"</string>
+ <string name="mode_selected_count" msgid="459111894725594625">"تم تحديد <xliff:g id="COUNT">%1$d</xliff:g>"</string>
+ <string name="sort_name" msgid="9183560467917256779">"بحسب الاسم"</string>
+ <string name="sort_date" msgid="586080032956151448">"بحسب تاريخ التعديل"</string>
+ <string name="sort_size" msgid="3350681319735474741">"بحسب الحجم"</string>
+ <string name="drawer_open" msgid="4545466532430226949">"عرض الجذور"</string>
+ <string name="drawer_close" msgid="7602734368552123318">"Ø¥Ø®ÙØ§Ø¡ الجذور"</string>
+ <string name="save_error" msgid="6167009778003223664">"أخÙÙ‚ Ø­ÙØ¸ المستند"</string>
+ <string name="create_error" msgid="3735649141335444215">"أخÙÙ‚ إنشاء المجلد"</string>
+ <string name="query_error" msgid="1222448261663503501">"أخÙÙ‚ إرسال طلب بحث عن المستندات"</string>
+ <string name="root_recent" msgid="4470053704320518133">"الأخيرة"</string>
+ <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> خالية"</string>
+ <string name="root_type_service" msgid="2178854894416775409">"خدمات التخزين"</string>
+ <string name="root_type_shortcut" msgid="3318760609471618093">"اختصارات"</string>
+ <string name="root_type_device" msgid="7121342474653483538">"أجهزة"</string>
+ <string name="root_type_apps" msgid="8838065367985945189">"المزيد من التطبيقات"</string>
+ <string name="pref_advanced_devices" msgid="903257239609301276">"عرض الأجهزة المتقدمة"</string>
+ <string name="pref_file_size" msgid="2826879315743961459">"عرض حجم الملÙ"</string>
+ <string name="pref_device_size" msgid="3542106883278997222">"عرض حجم الجهاز"</string>
+ <string name="empty" msgid="7858882803708117596">"ليس هناك أي عناصر"</string>
+ <string name="toast_no_application" msgid="1339885974067891667">"لا يمكن ÙØªØ­ الملÙ"</string>
+ <string name="toast_failed_delete" msgid="2180678019407244069">"تعذر حذ٠بعض المستندات"</string>
+ <string name="share_via" msgid="8966594246261344259">"مشاركة عبر"</string>
+</resources>
diff --git a/packages/DocumentsUI/res/values-az-rAZ/strings.xml b/packages/DocumentsUI/res/values-az-rAZ/strings.xml
new file mode 100644
index 0000000..1374982
--- /dev/null
+++ b/packages/DocumentsUI/res/values-az-rAZ/strings.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="2783841764617238354">"Sənədlər"</string>
+ <string name="title_open" msgid="4353228937663917801">"Vasitəsilə açın"</string>
+ <string name="title_save" msgid="2433679664882857999">"buraya saxlayın"</string>
+ <string name="menu_create_dir" msgid="5947289605844398389">"Qovluq yaradın"</string>
+ <string name="menu_grid" msgid="6878021334497835259">"Torlu görünüş"</string>
+ <string name="menu_list" msgid="7279285939892417279">"Siyahı görünüşü"</string>
+ <string name="menu_sort" msgid="7677740407158414452">"Bunlardan biri üzrə sırala"</string>
+ <string name="menu_search" msgid="3816712084502856974">"Axtarış"</string>
+ <string name="menu_settings" msgid="6008033148948428823">"Ayarlar"</string>
+ <string name="menu_open" msgid="432922957274920903">"Açın"</string>
+ <string name="menu_save" msgid="2394743337684426338">"Yadda saxlayın"</string>
+ <string name="menu_share" msgid="3075149983979628146">"Paylaşın"</string>
+ <string name="menu_delete" msgid="8138799623850614177">"Sil"</string>
+ <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> seçilmiş"</string>
+ <string name="sort_name" msgid="9183560467917256779">"Ad üzrə"</string>
+ <string name="sort_date" msgid="586080032956151448">"Tarix üzrə dəyişmiş"</string>
+ <string name="sort_size" msgid="3350681319735474741">"Ölçü üzrə"</string>
+ <string name="drawer_open" msgid="4545466532430226949">"Kökləri göstərin"</string>
+ <string name="drawer_close" msgid="7602734368552123318">"Kökləri gizlədin"</string>
+ <string name="save_error" msgid="6167009778003223664">"Sənədi yadda saxlaya bilmədi"</string>
+ <string name="root_recent" msgid="4470053704320518133">"Son"</string>
+ <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> ödənişsiz"</string>
+ <!-- no translation found for root_type_service (2178854894416775409) -->
+ <skip />
+ <string name="root_type_shortcut" msgid="3318760609471618093">"Qısa yollar"</string>
+ <string name="root_type_device" msgid="7121342474653483538">"Cihazlar"</string>
+ <string name="root_type_apps" msgid="8838065367985945189">"Daha çox tətbiq"</string>
+ <string name="pref_advanced_devices" msgid="903257239609301276">"Qabaqcıl cihazları görüntüləyin"</string>
+ <string name="pref_file_size" msgid="2826879315743961459">"Fayl ölçüsünü görüntüləyin"</string>
+ <string name="pref_device_size" msgid="3542106883278997222">"Cihaz ölçüsünü görüntüləyin"</string>
+ <string name="empty" msgid="7858882803708117596">"Element yoxdur"</string>
+ <string name="toast_no_application" msgid="1339885974067891667">"Faylı aça bilmir"</string>
+ <string name="toast_failed_delete" msgid="2180678019407244069">"Bəzi sənədləri silə bilmir"</string>
+ <string name="share_via" msgid="8966594246261344259">"Bunun vasitəsilə paylaş:"</string>
+</resources>
diff --git a/packages/DocumentsUI/res/values-az/strings.xml b/packages/DocumentsUI/res/values-az/strings.xml
new file mode 100644
index 0000000..806118b
--- /dev/null
+++ b/packages/DocumentsUI/res/values-az/strings.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="2783841764617238354">"Sənədlər"</string>
+ <string name="title_open" msgid="4353228937663917801">"Vasitəsilə açın"</string>
+ <string name="title_save" msgid="2433679664882857999">"buraya saxlayın"</string>
+ <string name="menu_create_dir" msgid="5947289605844398389">"Qovluq yaradın"</string>
+ <string name="menu_grid" msgid="6878021334497835259">"Torlu görünüş"</string>
+ <string name="menu_list" msgid="7279285939892417279">"Siyahı görünüşü"</string>
+ <string name="menu_sort" msgid="7677740407158414452">"Bunlardan biri üzrə sırala"</string>
+ <string name="menu_search" msgid="3816712084502856974">"Axtarış"</string>
+ <string name="menu_settings" msgid="6008033148948428823">"Ayarlar"</string>
+ <string name="menu_open" msgid="432922957274920903">"Açın"</string>
+ <string name="menu_save" msgid="2394743337684426338">"Yadda saxlayın"</string>
+ <string name="menu_share" msgid="3075149983979628146">"Paylaşın"</string>
+ <string name="menu_delete" msgid="8138799623850614177">"Sil"</string>
+ <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> seçilmiş"</string>
+ <string name="sort_name" msgid="9183560467917256779">"Ad üzrə"</string>
+ <string name="sort_date" msgid="586080032956151448">"Tarix üzrə dəyişmiş"</string>
+ <string name="sort_size" msgid="3350681319735474741">"Ölçü üzrə"</string>
+ <string name="drawer_open" msgid="4545466532430226949">"Kökləri göstərin"</string>
+ <string name="drawer_close" msgid="7602734368552123318">"Kökləri gizlədin"</string>
+ <string name="save_error" msgid="6167009778003223664">"Sənədi yadda saxlaya bilmədi"</string>
+ <string name="root_recent" msgid="4470053704320518133">"Son"</string>
+ <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> ödənişsiz"</string>
+ <string name="root_type_service" msgid="2857362700576006694">"Xidmətlər"</string>
+ <string name="root_type_shortcut" msgid="3318760609471618093">"Qısa yollar"</string>
+ <string name="root_type_device" msgid="7121342474653483538">"Cihazlar"</string>
+ <string name="root_type_apps" msgid="8838065367985945189">"Daha çox tətbiq"</string>
+ <string name="pref_advanced_devices" msgid="903257239609301276">"Qabaqcıl cihazları görüntüləyin"</string>
+ <string name="pref_file_size" msgid="2826879315743961459">"Fayl ölçüsünü görüntüləyin"</string>
+ <string name="pref_device_size" msgid="3542106883278997222">"Cihaz ölçüsünü görüntüləyin"</string>
+ <string name="empty" msgid="7858882803708117596">"Element yoxdur"</string>
+ <string name="toast_no_application" msgid="1339885974067891667">"Faylı aça bilmir"</string>
+ <string name="toast_failed_delete" msgid="2180678019407244069">"Bəzi sənədləri silə bilmir"</string>
+ <string name="more" msgid="7117420986529297171">"Daha çox"</string>
+ <string name="loading" msgid="7933681260296021180">"Yüklənir…"</string>
+</resources>
diff --git a/packages/DocumentsUI/res/values-bg/strings.xml b/packages/DocumentsUI/res/values-bg/strings.xml
new file mode 100644
index 0000000..c3242b2
--- /dev/null
+++ b/packages/DocumentsUI/res/values-bg/strings.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="2783841764617238354">"Документи"</string>
+ <string name="title_open" msgid="4353228937663917801">"ОтварÑне от"</string>
+ <string name="title_save" msgid="2433679664882857999">"Запазване в/ъв"</string>
+ <string name="menu_create_dir" msgid="5947289605844398389">"Създаване на папка"</string>
+ <string name="menu_grid" msgid="6878021334497835259">"Изглед в мрежа"</string>
+ <string name="menu_list" msgid="7279285939892417279">"СпиÑъчен изглед"</string>
+ <string name="menu_sort" msgid="7677740407158414452">"Сортиране по"</string>
+ <string name="menu_search" msgid="3816712084502856974">"ТърÑене"</string>
+ <string name="menu_settings" msgid="6008033148948428823">"ÐаÑтройки"</string>
+ <string name="menu_open" msgid="432922957274920903">"ОтварÑне"</string>
+ <string name="menu_save" msgid="2394743337684426338">"Запазване"</string>
+ <string name="menu_share" msgid="3075149983979628146">"СподелÑне"</string>
+ <string name="menu_delete" msgid="8138799623850614177">"Изтриване"</string>
+ <string name="mode_selected_count" msgid="459111894725594625">"Избрахте <xliff:g id="COUNT">%1$d</xliff:g>"</string>
+ <string name="sort_name" msgid="9183560467917256779">"По име"</string>
+ <string name="sort_date" msgid="586080032956151448">"По дата на промÑната"</string>
+ <string name="sort_size" msgid="3350681319735474741">"По размер"</string>
+ <string name="drawer_open" msgid="4545466532430226949">"Показване на оÑновните елементи"</string>
+ <string name="drawer_close" msgid="7602734368552123318">"Скриване на оÑновните елементи"</string>
+ <string name="save_error" msgid="6167009778003223664">"Запазването на документа не бе уÑпешно"</string>
+ <string name="create_error" msgid="3735649141335444215">"Създаването на папката не бе уÑпешно"</string>
+ <string name="query_error" msgid="1222448261663503501">"ЗаÑвката за документи не бе уÑпешна"</string>
+ <string name="root_recent" msgid="4470053704320518133">"Скорошно"</string>
+ <string name="root_available_bytes" msgid="8568452858617033281">"Свободно: <xliff:g id="SIZE">%1$s</xliff:g>"</string>
+ <string name="root_type_service" msgid="2178854894416775409">"УÑлуги за Ñъхранение"</string>
+ <string name="root_type_shortcut" msgid="3318760609471618093">"Преки пътища"</string>
+ <string name="root_type_device" msgid="7121342474653483538">"УÑтройÑтва"</string>
+ <string name="root_type_apps" msgid="8838065367985945189">"Още приложениÑ"</string>
+ <string name="pref_advanced_devices" msgid="903257239609301276">"УÑтройÑтва Ñ Ñ€Ð°Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð¸ Ñ„-ии"</string>
+ <string name="pref_file_size" msgid="2826879315743961459">"Показване на Ñ„Ð°Ð¹Ð»Ð¾Ð²Ð¸Ñ Ñ€Ð°Ð·Ð¼ÐµÑ€"</string>
+ <string name="pref_device_size" msgid="3542106883278997222">"Показване на размера на уÑтройÑтвото"</string>
+ <string name="empty" msgid="7858882803708117596">"ÐÑма елементи"</string>
+ <string name="toast_no_application" msgid="1339885974067891667">"Файлът не може да Ñе отвори"</string>
+ <string name="toast_failed_delete" msgid="2180678019407244069">"ÐÑкои документи не могат да бъдат изтрити"</string>
+ <string name="share_via" msgid="8966594246261344259">"СподелÑне чрез"</string>
+</resources>
diff --git a/packages/DocumentsUI/res/values-ca/strings.xml b/packages/DocumentsUI/res/values-ca/strings.xml
new file mode 100644
index 0000000..68c7b0e
--- /dev/null
+++ b/packages/DocumentsUI/res/values-ca/strings.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="2783841764617238354">"Documents"</string>
+ <string name="title_open" msgid="4353228937663917801">"Obre des de"</string>
+ <string name="title_save" msgid="2433679664882857999">"Desa a"</string>
+ <string name="menu_create_dir" msgid="5947289605844398389">"Crea una carpeta"</string>
+ <string name="menu_grid" msgid="6878021334497835259">"Visualització de quadrícula"</string>
+ <string name="menu_list" msgid="7279285939892417279">"Visualització de llista"</string>
+ <string name="menu_sort" msgid="7677740407158414452">"Ordena per"</string>
+ <string name="menu_search" msgid="3816712084502856974">"Cerca"</string>
+ <string name="menu_settings" msgid="6008033148948428823">"Configuració"</string>
+ <string name="menu_open" msgid="432922957274920903">"Obre"</string>
+ <string name="menu_save" msgid="2394743337684426338">"Desa"</string>
+ <string name="menu_share" msgid="3075149983979628146">"Comparteix"</string>
+ <string name="menu_delete" msgid="8138799623850614177">"Suprimeix"</string>
+ <string name="mode_selected_count" msgid="459111894725594625">"Seleccionats: <xliff:g id="COUNT">%1$d</xliff:g>"</string>
+ <string name="sort_name" msgid="9183560467917256779">"Per nom"</string>
+ <string name="sort_date" msgid="586080032956151448">"Per data de modificació"</string>
+ <string name="sort_size" msgid="3350681319735474741">"Per mida"</string>
+ <string name="drawer_open" msgid="4545466532430226949">"Mostra les arrels"</string>
+ <string name="drawer_close" msgid="7602734368552123318">"Amaga les arrels"</string>
+ <string name="save_error" msgid="6167009778003223664">"No s\'ha pogut desar el document."</string>
+ <string name="create_error" msgid="3735649141335444215">"No s\'ha pogut crear la carpeta"</string>
+ <string name="query_error" msgid="1222448261663503501">"No s\'han pogut consultar els documents"</string>
+ <string name="root_recent" msgid="4470053704320518133">"Recent"</string>
+ <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> lliures"</string>
+ <string name="root_type_service" msgid="2178854894416775409">"Serveis d\'emmagatzematge"</string>
+ <string name="root_type_shortcut" msgid="3318760609471618093">"Dreceres"</string>
+ <string name="root_type_device" msgid="7121342474653483538">"Dispositius"</string>
+ <string name="root_type_apps" msgid="8838065367985945189">"Més aplicacions"</string>
+ <string name="pref_advanced_devices" msgid="903257239609301276">"Mostra els dispositius avançats"</string>
+ <string name="pref_file_size" msgid="2826879315743961459">"Mostra la mida del fitxer"</string>
+ <string name="pref_device_size" msgid="3542106883278997222">"Mostra la mida del dispositiu"</string>
+ <string name="empty" msgid="7858882803708117596">"Sense elements"</string>
+ <string name="toast_no_application" msgid="1339885974067891667">"No es pot obrir el fitxer."</string>
+ <string name="toast_failed_delete" msgid="2180678019407244069">"No es poden suprimir alguns documents."</string>
+ <string name="share_via" msgid="8966594246261344259">"Comparteix mitjançant"</string>
+</resources>
diff --git a/packages/DocumentsUI/res/values-cs/strings.xml b/packages/DocumentsUI/res/values-cs/strings.xml
new file mode 100644
index 0000000..f089c8b
--- /dev/null
+++ b/packages/DocumentsUI/res/values-cs/strings.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="2783841764617238354">"Dokumenty"</string>
+ <string name="title_open" msgid="4353228937663917801">"Otevřít z"</string>
+ <string name="title_save" msgid="2433679664882857999">"Uložit do"</string>
+ <string name="menu_create_dir" msgid="5947289605844398389">"Vytvořit složku"</string>
+ <string name="menu_grid" msgid="6878021334497835259">"Mřížka"</string>
+ <string name="menu_list" msgid="7279285939892417279">"Seznam"</string>
+ <string name="menu_sort" msgid="7677740407158414452">"Řadit podle"</string>
+ <string name="menu_search" msgid="3816712084502856974">"Hledat"</string>
+ <string name="menu_settings" msgid="6008033148948428823">"Nastavení"</string>
+ <string name="menu_open" msgid="432922957274920903">"Otevřít"</string>
+ <string name="menu_save" msgid="2394743337684426338">"Uložit"</string>
+ <string name="menu_share" msgid="3075149983979628146">"Sdílet"</string>
+ <string name="menu_delete" msgid="8138799623850614177">"Smazat"</string>
+ <string name="mode_selected_count" msgid="459111894725594625">"Vybráno: <xliff:g id="COUNT">%1$d</xliff:g>"</string>
+ <string name="sort_name" msgid="9183560467917256779">"Podle názvu"</string>
+ <string name="sort_date" msgid="586080032956151448">"Podle data úpravy"</string>
+ <string name="sort_size" msgid="3350681319735474741">"Podle velikosti"</string>
+ <string name="drawer_open" msgid="4545466532430226949">"Zobrazit kořeny"</string>
+ <string name="drawer_close" msgid="7602734368552123318">"Skrýt kořeny"</string>
+ <string name="save_error" msgid="6167009778003223664">"Uložení dokumentu se nezdařilo"</string>
+ <string name="create_error" msgid="3735649141335444215">"Složku se nepodařilo vytvořit"</string>
+ <string name="query_error" msgid="1222448261663503501">"Seznam dokumentů se nepodaÅ™ilo naÄíst"</string>
+ <string name="root_recent" msgid="4470053704320518133">"Poslední"</string>
+ <string name="root_available_bytes" msgid="8568452858617033281">"Volný prostor: <xliff:g id="SIZE">%1$s</xliff:g>"</string>
+ <string name="root_type_service" msgid="2178854894416775409">"Služby úložiště"</string>
+ <string name="root_type_shortcut" msgid="3318760609471618093">"Klávesové zkratky"</string>
+ <string name="root_type_device" msgid="7121342474653483538">"Zařízení"</string>
+ <string name="root_type_apps" msgid="8838065367985945189">"Další aplikace"</string>
+ <string name="pref_advanced_devices" msgid="903257239609301276">"Zobrazit pokroÄilá zařízení"</string>
+ <string name="pref_file_size" msgid="2826879315743961459">"Zobrazit velikost souboru"</string>
+ <string name="pref_device_size" msgid="3542106883278997222">"Zobrazit velikost zařízení"</string>
+ <string name="empty" msgid="7858882803708117596">"Žádné položky"</string>
+ <string name="toast_no_application" msgid="1339885974067891667">"Soubor nelze otevřít"</string>
+ <string name="toast_failed_delete" msgid="2180678019407244069">"Některé dokumenty nelze smazat"</string>
+ <string name="share_via" msgid="8966594246261344259">"Sdílet pomocí"</string>
+</resources>
diff --git a/packages/DocumentsUI/res/values-da/strings.xml b/packages/DocumentsUI/res/values-da/strings.xml
new file mode 100644
index 0000000..816f9a7
--- /dev/null
+++ b/packages/DocumentsUI/res/values-da/strings.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="2783841764617238354">"Dokumenter"</string>
+ <string name="title_open" msgid="4353228937663917801">"Ã…bn fra"</string>
+ <string name="title_save" msgid="2433679664882857999">"Gem på"</string>
+ <string name="menu_create_dir" msgid="5947289605844398389">"Opret mappe"</string>
+ <string name="menu_grid" msgid="6878021334497835259">"Gittervisning"</string>
+ <string name="menu_list" msgid="7279285939892417279">"Listevisning"</string>
+ <string name="menu_sort" msgid="7677740407158414452">"Sortér efter"</string>
+ <string name="menu_search" msgid="3816712084502856974">"Søg"</string>
+ <string name="menu_settings" msgid="6008033148948428823">"Indstillinger"</string>
+ <string name="menu_open" msgid="432922957274920903">"Ã…bn"</string>
+ <string name="menu_save" msgid="2394743337684426338">"Gem"</string>
+ <string name="menu_share" msgid="3075149983979628146">"Del"</string>
+ <string name="menu_delete" msgid="8138799623850614177">"Slet"</string>
+ <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> er valgt"</string>
+ <string name="sort_name" msgid="9183560467917256779">"Efter navn"</string>
+ <string name="sort_date" msgid="586080032956151448">"Efter ændringsdato"</string>
+ <string name="sort_size" msgid="3350681319735474741">"Efter størrelse"</string>
+ <string name="drawer_open" msgid="4545466532430226949">"Vis rødder"</string>
+ <string name="drawer_close" msgid="7602734368552123318">"Skjul rødder"</string>
+ <string name="save_error" msgid="6167009778003223664">"Dokumentet kunne ikke gemmes"</string>
+ <string name="create_error" msgid="3735649141335444215">"Mappen kunne ikke oprettes"</string>
+ <string name="query_error" msgid="1222448261663503501">"Dokumenterne kunne ikke forespørges."</string>
+ <string name="root_recent" msgid="4470053704320518133">"Seneste"</string>
+ <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> ledig plads"</string>
+ <string name="root_type_service" msgid="2178854894416775409">"Lagringstjenester"</string>
+ <string name="root_type_shortcut" msgid="3318760609471618093">"Genveje"</string>
+ <string name="root_type_device" msgid="7121342474653483538">"Enheder"</string>
+ <string name="root_type_apps" msgid="8838065367985945189">"Flere apps"</string>
+ <string name="pref_advanced_devices" msgid="903257239609301276">"Vis avancerede enheder"</string>
+ <string name="pref_file_size" msgid="2826879315743961459">"Vis filstørrelse"</string>
+ <string name="pref_device_size" msgid="3542106883278997222">"Vis enhedens størrelse"</string>
+ <string name="empty" msgid="7858882803708117596">"Ingen elementer"</string>
+ <string name="toast_no_application" msgid="1339885974067891667">"Filen kan ikke åbnes"</string>
+ <string name="toast_failed_delete" msgid="2180678019407244069">"Nogle dokumenter kan ikke slettes"</string>
+ <string name="share_via" msgid="8966594246261344259">"Del via"</string>
+</resources>
diff --git a/packages/DocumentsUI/res/values-de/strings.xml b/packages/DocumentsUI/res/values-de/strings.xml
new file mode 100644
index 0000000..3b448d9
--- /dev/null
+++ b/packages/DocumentsUI/res/values-de/strings.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="2783841764617238354">"Dokumente"</string>
+ <string name="title_open" msgid="4353228937663917801">"Öffnen von"</string>
+ <string name="title_save" msgid="2433679664882857999">"Speichern unter"</string>
+ <string name="menu_create_dir" msgid="5947289605844398389">"Ordner erstellen"</string>
+ <string name="menu_grid" msgid="6878021334497835259">"Rasteransicht"</string>
+ <string name="menu_list" msgid="7279285939892417279">"Listenansicht"</string>
+ <string name="menu_sort" msgid="7677740407158414452">"Sortieren nach"</string>
+ <string name="menu_search" msgid="3816712084502856974">"Suchen"</string>
+ <string name="menu_settings" msgid="6008033148948428823">"Einstellungen"</string>
+ <string name="menu_open" msgid="432922957274920903">"Öffnen"</string>
+ <string name="menu_save" msgid="2394743337684426338">"Speichern"</string>
+ <string name="menu_share" msgid="3075149983979628146">"Teilen"</string>
+ <string name="menu_delete" msgid="8138799623850614177">"Löschen"</string>
+ <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> ausgewählt"</string>
+ <string name="sort_name" msgid="9183560467917256779">"Nach Name"</string>
+ <string name="sort_date" msgid="586080032956151448">"Nach Änderungsdatum"</string>
+ <string name="sort_size" msgid="3350681319735474741">"Nach Größe"</string>
+ <string name="drawer_open" msgid="4545466532430226949">"Root-Verzeichnis anzeigen"</string>
+ <string name="drawer_close" msgid="7602734368552123318">"Root-Verzeichnis ausblenden"</string>
+ <string name="save_error" msgid="6167009778003223664">"Dokument konnte nicht gespeichert werden."</string>
+ <string name="create_error" msgid="3735649141335444215">"Ordner konnte nicht erstellt werden."</string>
+ <string name="query_error" msgid="1222448261663503501">"Fehler bei der Anforderung von Dokumenten"</string>
+ <string name="root_recent" msgid="4470053704320518133">"Letzte"</string>
+ <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> verfügbar"</string>
+ <string name="root_type_service" msgid="2178854894416775409">"Speicherdienste"</string>
+ <string name="root_type_shortcut" msgid="3318760609471618093">"Verknüpfungen"</string>
+ <string name="root_type_device" msgid="7121342474653483538">"Geräte"</string>
+ <string name="root_type_apps" msgid="8838065367985945189">"Weitere Apps"</string>
+ <string name="pref_advanced_devices" msgid="903257239609301276">"Erweiterte Geräte anzeigen"</string>
+ <string name="pref_file_size" msgid="2826879315743961459">"Dateigröße anzeigen"</string>
+ <string name="pref_device_size" msgid="3542106883278997222">"Geräteabmessungen anzeigen"</string>
+ <string name="empty" msgid="7858882803708117596">"Keine Elemente"</string>
+ <string name="toast_no_application" msgid="1339885974067891667">"Datei kann nicht geöffnet werden."</string>
+ <string name="toast_failed_delete" msgid="2180678019407244069">"Einige Dokumente konnten nicht gelöscht werden."</string>
+ <string name="share_via" msgid="8966594246261344259">"Teilen über"</string>
+</resources>
diff --git a/packages/DocumentsUI/res/values-el/strings.xml b/packages/DocumentsUI/res/values-el/strings.xml
new file mode 100644
index 0000000..aec3318
--- /dev/null
+++ b/packages/DocumentsUI/res/values-el/strings.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="2783841764617238354">"ΈγγÏαφα"</string>
+ <string name="title_open" msgid="4353228937663917801">"Άνοιγμα από"</string>
+ <string name="title_save" msgid="2433679664882857999">"Αποθήκευση σε"</string>
+ <string name="menu_create_dir" msgid="5947289605844398389">"ΔημιουÏγία φακέλου"</string>
+ <string name="menu_grid" msgid="6878021334497835259">"ΠÏοβολή πλέγματος"</string>
+ <string name="menu_list" msgid="7279285939892417279">"ΠÏοβολή λίστας"</string>
+ <string name="menu_sort" msgid="7677740407158414452">"Ταξινόμηση κατά"</string>
+ <string name="menu_search" msgid="3816712084502856974">"Αναζήτηση"</string>
+ <string name="menu_settings" msgid="6008033148948428823">"Ρυθμίσεις"</string>
+ <string name="menu_open" msgid="432922957274920903">"Άνοιγμα"</string>
+ <string name="menu_save" msgid="2394743337684426338">"Αποθήκευση"</string>
+ <string name="menu_share" msgid="3075149983979628146">"Κοινή χÏήση"</string>
+ <string name="menu_delete" msgid="8138799623850614177">"ΔιαγÏαφή"</string>
+ <string name="mode_selected_count" msgid="459111894725594625">"Επιλέχθηκαν <xliff:g id="COUNT">%1$d</xliff:g>"</string>
+ <string name="sort_name" msgid="9183560467917256779">"Κατά όνομα"</string>
+ <string name="sort_date" msgid="586080032956151448">"Κατά ημεÏομηνία Ï„Ïοποποίησης"</string>
+ <string name="sort_size" msgid="3350681319735474741">"Κατά μέγεθος"</string>
+ <string name="drawer_open" msgid="4545466532430226949">"Εμφάνιση Ïίζας"</string>
+ <string name="drawer_close" msgid="7602734368552123318">"ΑπόκÏυψη Ïίζας"</string>
+ <string name="save_error" msgid="6167009778003223664">"Αποτυχία αποθήκευσης του εγγÏάφου"</string>
+ <string name="create_error" msgid="3735649141335444215">"Αποτυχία δημιουÏγίας φακέλου"</string>
+ <string name="query_error" msgid="1222448261663503501">"Αποτυχία υποβολής εÏωτήματος για έγγÏαφα"</string>
+ <string name="root_recent" msgid="4470053704320518133">"ΠÏόσφατα"</string>
+ <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> ελεÏθεÏα"</string>
+ <string name="root_type_service" msgid="2178854894416775409">"ΥπηÏεσίες αποθήκευσης"</string>
+ <string name="root_type_shortcut" msgid="3318760609471618093">"ΣυντομεÏσεις"</string>
+ <string name="root_type_device" msgid="7121342474653483538">"Συσκευές"</string>
+ <string name="root_type_apps" msgid="8838065367985945189">"ΠεÏισσότεÏες εφαÏμογές"</string>
+ <string name="pref_advanced_devices" msgid="903257239609301276">"Εμφάνιση Ï€Ïοηγμένων συσκευών"</string>
+ <string name="pref_file_size" msgid="2826879315743961459">"Εμφάνιση μεγέθους αÏχείου"</string>
+ <string name="pref_device_size" msgid="3542106883278997222">"Εμφάνιση μεγέθους συσκευής"</string>
+ <string name="empty" msgid="7858882803708117596">"Δεν υπάÏχουν στοιχεία"</string>
+ <string name="toast_no_application" msgid="1339885974067891667">"Δεν είναι δυνατό το άνοιγμα του αÏχείου"</string>
+ <string name="toast_failed_delete" msgid="2180678019407244069">"Δεν είναι δυνατή η διαγÏαφή οÏισμένων εγγÏάφων"</string>
+ <string name="share_via" msgid="8966594246261344259">"Κοινή χÏήση μέσω"</string>
+</resources>
diff --git a/packages/DocumentsUI/res/values-en-rGB/strings.xml b/packages/DocumentsUI/res/values-en-rGB/strings.xml
new file mode 100644
index 0000000..a95e7f1
--- /dev/null
+++ b/packages/DocumentsUI/res/values-en-rGB/strings.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="2783841764617238354">"Documents"</string>
+ <string name="title_open" msgid="4353228937663917801">"Open from"</string>
+ <string name="title_save" msgid="2433679664882857999">"Save to"</string>
+ <string name="menu_create_dir" msgid="5947289605844398389">"Create folder"</string>
+ <string name="menu_grid" msgid="6878021334497835259">"Grid view"</string>
+ <string name="menu_list" msgid="7279285939892417279">"List view"</string>
+ <string name="menu_sort" msgid="7677740407158414452">"Sort by"</string>
+ <string name="menu_search" msgid="3816712084502856974">"Search"</string>
+ <string name="menu_settings" msgid="6008033148948428823">"Settings"</string>
+ <string name="menu_open" msgid="432922957274920903">"Open"</string>
+ <string name="menu_save" msgid="2394743337684426338">"Save"</string>
+ <string name="menu_share" msgid="3075149983979628146">"Share"</string>
+ <string name="menu_delete" msgid="8138799623850614177">"Delete"</string>
+ <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> selected"</string>
+ <string name="sort_name" msgid="9183560467917256779">"By name"</string>
+ <string name="sort_date" msgid="586080032956151448">"By date modified"</string>
+ <string name="sort_size" msgid="3350681319735474741">"By size"</string>
+ <string name="drawer_open" msgid="4545466532430226949">"Show roots"</string>
+ <string name="drawer_close" msgid="7602734368552123318">"Hide roots"</string>
+ <string name="save_error" msgid="6167009778003223664">"Failed to save document"</string>
+ <string name="create_error" msgid="3735649141335444215">"Failed to create folder"</string>
+ <string name="query_error" msgid="1222448261663503501">"Failed to query documents"</string>
+ <string name="root_recent" msgid="4470053704320518133">"Recent"</string>
+ <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> free"</string>
+ <string name="root_type_service" msgid="2178854894416775409">"Storage services"</string>
+ <string name="root_type_shortcut" msgid="3318760609471618093">"Shortcuts"</string>
+ <string name="root_type_device" msgid="7121342474653483538">"Devices"</string>
+ <string name="root_type_apps" msgid="8838065367985945189">"More apps"</string>
+ <string name="pref_advanced_devices" msgid="903257239609301276">"Display advanced devices"</string>
+ <string name="pref_file_size" msgid="2826879315743961459">"Display file size"</string>
+ <string name="pref_device_size" msgid="3542106883278997222">"Display device size"</string>
+ <string name="empty" msgid="7858882803708117596">"No items"</string>
+ <string name="toast_no_application" msgid="1339885974067891667">"Cannot open file"</string>
+ <string name="toast_failed_delete" msgid="2180678019407244069">"Unable to delete some documents"</string>
+ <string name="share_via" msgid="8966594246261344259">"Share via"</string>
+</resources>
diff --git a/packages/DocumentsUI/res/values-en-rIN/strings.xml b/packages/DocumentsUI/res/values-en-rIN/strings.xml
new file mode 100644
index 0000000..a95e7f1
--- /dev/null
+++ b/packages/DocumentsUI/res/values-en-rIN/strings.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="2783841764617238354">"Documents"</string>
+ <string name="title_open" msgid="4353228937663917801">"Open from"</string>
+ <string name="title_save" msgid="2433679664882857999">"Save to"</string>
+ <string name="menu_create_dir" msgid="5947289605844398389">"Create folder"</string>
+ <string name="menu_grid" msgid="6878021334497835259">"Grid view"</string>
+ <string name="menu_list" msgid="7279285939892417279">"List view"</string>
+ <string name="menu_sort" msgid="7677740407158414452">"Sort by"</string>
+ <string name="menu_search" msgid="3816712084502856974">"Search"</string>
+ <string name="menu_settings" msgid="6008033148948428823">"Settings"</string>
+ <string name="menu_open" msgid="432922957274920903">"Open"</string>
+ <string name="menu_save" msgid="2394743337684426338">"Save"</string>
+ <string name="menu_share" msgid="3075149983979628146">"Share"</string>
+ <string name="menu_delete" msgid="8138799623850614177">"Delete"</string>
+ <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> selected"</string>
+ <string name="sort_name" msgid="9183560467917256779">"By name"</string>
+ <string name="sort_date" msgid="586080032956151448">"By date modified"</string>
+ <string name="sort_size" msgid="3350681319735474741">"By size"</string>
+ <string name="drawer_open" msgid="4545466532430226949">"Show roots"</string>
+ <string name="drawer_close" msgid="7602734368552123318">"Hide roots"</string>
+ <string name="save_error" msgid="6167009778003223664">"Failed to save document"</string>
+ <string name="create_error" msgid="3735649141335444215">"Failed to create folder"</string>
+ <string name="query_error" msgid="1222448261663503501">"Failed to query documents"</string>
+ <string name="root_recent" msgid="4470053704320518133">"Recent"</string>
+ <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> free"</string>
+ <string name="root_type_service" msgid="2178854894416775409">"Storage services"</string>
+ <string name="root_type_shortcut" msgid="3318760609471618093">"Shortcuts"</string>
+ <string name="root_type_device" msgid="7121342474653483538">"Devices"</string>
+ <string name="root_type_apps" msgid="8838065367985945189">"More apps"</string>
+ <string name="pref_advanced_devices" msgid="903257239609301276">"Display advanced devices"</string>
+ <string name="pref_file_size" msgid="2826879315743961459">"Display file size"</string>
+ <string name="pref_device_size" msgid="3542106883278997222">"Display device size"</string>
+ <string name="empty" msgid="7858882803708117596">"No items"</string>
+ <string name="toast_no_application" msgid="1339885974067891667">"Cannot open file"</string>
+ <string name="toast_failed_delete" msgid="2180678019407244069">"Unable to delete some documents"</string>
+ <string name="share_via" msgid="8966594246261344259">"Share via"</string>
+</resources>
diff --git a/packages/DocumentsUI/res/values-es-rUS/strings.xml b/packages/DocumentsUI/res/values-es-rUS/strings.xml
new file mode 100644
index 0000000..4a3ff33
--- /dev/null
+++ b/packages/DocumentsUI/res/values-es-rUS/strings.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="2783841764617238354">"Documentos"</string>
+ <string name="title_open" msgid="4353228937663917801">"Abrir desde"</string>
+ <string name="title_save" msgid="2433679664882857999">"Guardar en"</string>
+ <string name="menu_create_dir" msgid="5947289605844398389">"Crear carpeta"</string>
+ <string name="menu_grid" msgid="6878021334497835259">"Vista de cuadrícula"</string>
+ <string name="menu_list" msgid="7279285939892417279">"Vista de lista"</string>
+ <string name="menu_sort" msgid="7677740407158414452">"Ordenar por"</string>
+ <string name="menu_search" msgid="3816712084502856974">"Buscar"</string>
+ <string name="menu_settings" msgid="6008033148948428823">"Configuración"</string>
+ <string name="menu_open" msgid="432922957274920903">"Abrir"</string>
+ <string name="menu_save" msgid="2394743337684426338">"Guardar"</string>
+ <string name="menu_share" msgid="3075149983979628146">"Compartir"</string>
+ <string name="menu_delete" msgid="8138799623850614177">"Eliminar"</string>
+ <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> seleccionado(s)"</string>
+ <string name="sort_name" msgid="9183560467917256779">"Por nombre"</string>
+ <string name="sort_date" msgid="586080032956151448">"Por fecha de modificación"</string>
+ <string name="sort_size" msgid="3350681319735474741">"Por tamaño"</string>
+ <string name="drawer_open" msgid="4545466532430226949">"Mostrar raíces"</string>
+ <string name="drawer_close" msgid="7602734368552123318">"Ocultar raíces"</string>
+ <string name="save_error" msgid="6167009778003223664">"Error al guardar el documento"</string>
+ <string name="create_error" msgid="3735649141335444215">"Error al crear la carpeta"</string>
+ <string name="query_error" msgid="1222448261663503501">"Error al consultar documentos"</string>
+ <string name="root_recent" msgid="4470053704320518133">"Recientes"</string>
+ <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> de espacio libre"</string>
+ <string name="root_type_service" msgid="2178854894416775409">"Almacenamiento"</string>
+ <string name="root_type_shortcut" msgid="3318760609471618093">"Accesos directos"</string>
+ <string name="root_type_device" msgid="7121342474653483538">"Dispositivos"</string>
+ <string name="root_type_apps" msgid="8838065367985945189">"Más aplicaciones"</string>
+ <string name="pref_advanced_devices" msgid="903257239609301276">"Mostrar dispositivos avanzados"</string>
+ <string name="pref_file_size" msgid="2826879315743961459">"Mostrar tamaño del archivo"</string>
+ <string name="pref_device_size" msgid="3542106883278997222">"Mostrar tamaño del dispositivo"</string>
+ <string name="empty" msgid="7858882803708117596">"Sin elementos"</string>
+ <string name="toast_no_application" msgid="1339885974067891667">"No se puede abrir el archivo."</string>
+ <string name="toast_failed_delete" msgid="2180678019407244069">"No es posible eliminar algunos documentos."</string>
+ <string name="share_via" msgid="8966594246261344259">"Compartir mediante"</string>
+</resources>
diff --git a/packages/DocumentsUI/res/values-es/strings.xml b/packages/DocumentsUI/res/values-es/strings.xml
new file mode 100644
index 0000000..1682542
--- /dev/null
+++ b/packages/DocumentsUI/res/values-es/strings.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="2783841764617238354">"Documentos"</string>
+ <string name="title_open" msgid="4353228937663917801">"Abrir desde"</string>
+ <string name="title_save" msgid="2433679664882857999">"Guardar en"</string>
+ <string name="menu_create_dir" msgid="5947289605844398389">"Crear carpeta"</string>
+ <string name="menu_grid" msgid="6878021334497835259">"Vista de cuadrícula"</string>
+ <string name="menu_list" msgid="7279285939892417279">"Vista de lista"</string>
+ <string name="menu_sort" msgid="7677740407158414452">"Ordenar por"</string>
+ <string name="menu_search" msgid="3816712084502856974">"Buscar"</string>
+ <string name="menu_settings" msgid="6008033148948428823">"Ajustes"</string>
+ <string name="menu_open" msgid="432922957274920903">"Abrir"</string>
+ <string name="menu_save" msgid="2394743337684426338">"Guardar"</string>
+ <string name="menu_share" msgid="3075149983979628146">"Compartir"</string>
+ <string name="menu_delete" msgid="8138799623850614177">"Eliminar"</string>
+ <string name="mode_selected_count" msgid="459111894725594625">"Seleccionado: <xliff:g id="COUNT">%1$d</xliff:g>"</string>
+ <string name="sort_name" msgid="9183560467917256779">"Por nombre"</string>
+ <string name="sort_date" msgid="586080032956151448">"Por fecha de modificación"</string>
+ <string name="sort_size" msgid="3350681319735474741">"Por tamaño"</string>
+ <string name="drawer_open" msgid="4545466532430226949">"Mostrar raíces"</string>
+ <string name="drawer_close" msgid="7602734368552123318">"Ocultar raíces"</string>
+ <string name="save_error" msgid="6167009778003223664">"Error al guardar documento"</string>
+ <string name="create_error" msgid="3735649141335444215">"Error al crear la carpeta"</string>
+ <string name="query_error" msgid="1222448261663503501">"Error al consultar lista de documentos"</string>
+ <string name="root_recent" msgid="4470053704320518133">"Reciente"</string>
+ <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> de espacio libre"</string>
+ <string name="root_type_service" msgid="2178854894416775409">"Servicios almacenamiento"</string>
+ <string name="root_type_shortcut" msgid="3318760609471618093">"Accesos directos"</string>
+ <string name="root_type_device" msgid="7121342474653483538">"Dispositivos"</string>
+ <string name="root_type_apps" msgid="8838065367985945189">"Más aplicaciones"</string>
+ <string name="pref_advanced_devices" msgid="903257239609301276">"Mostrar dispositivos avanzados"</string>
+ <string name="pref_file_size" msgid="2826879315743961459">"Mostrar tamaño del archivo"</string>
+ <string name="pref_device_size" msgid="3542106883278997222">"Mostrar tamaño del dispositivo"</string>
+ <string name="empty" msgid="7858882803708117596">"Sin elementos"</string>
+ <string name="toast_no_application" msgid="1339885974067891667">"Error al abrir el archivo"</string>
+ <string name="toast_failed_delete" msgid="2180678019407244069">"No es posible eliminar algunos documentos"</string>
+ <string name="share_via" msgid="8966594246261344259">"Compartir a través de"</string>
+</resources>
diff --git a/packages/DocumentsUI/res/values-et-rEE/strings.xml b/packages/DocumentsUI/res/values-et-rEE/strings.xml
new file mode 100644
index 0000000..5412956
--- /dev/null
+++ b/packages/DocumentsUI/res/values-et-rEE/strings.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="2783841764617238354">"Dokumendid"</string>
+ <string name="title_open" msgid="4353228937663917801">"Ava:"</string>
+ <string name="title_save" msgid="2433679664882857999">"Salvesta:"</string>
+ <string name="menu_create_dir" msgid="5947289605844398389">"Loo kaust"</string>
+ <string name="menu_grid" msgid="6878021334497835259">"Ruudustikkuva"</string>
+ <string name="menu_list" msgid="7279285939892417279">"Loendikuva"</string>
+ <string name="menu_sort" msgid="7677740407158414452">"Sortimisalus:"</string>
+ <string name="menu_search" msgid="3816712084502856974">"Otsing"</string>
+ <string name="menu_settings" msgid="6008033148948428823">"Seaded"</string>
+ <string name="menu_open" msgid="432922957274920903">"Ava"</string>
+ <string name="menu_save" msgid="2394743337684426338">"Salvesta"</string>
+ <string name="menu_share" msgid="3075149983979628146">"Jaga"</string>
+ <string name="menu_delete" msgid="8138799623850614177">"Kustuta"</string>
+ <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> on valitud"</string>
+ <string name="sort_name" msgid="9183560467917256779">"Nime järgi"</string>
+ <string name="sort_date" msgid="586080032956151448">"Muutmiskuupäeva järgi"</string>
+ <string name="sort_size" msgid="3350681319735474741">"Suuruse järgi"</string>
+ <string name="drawer_open" msgid="4545466532430226949">"Kuva juured"</string>
+ <string name="drawer_close" msgid="7602734368552123318">"Peida juured"</string>
+ <string name="save_error" msgid="6167009778003223664">"Dokumendi salvestamine ebaõnnestus"</string>
+ <string name="create_error" msgid="3735649141335444215">"Kausta loomine ebaõnnestus"</string>
+ <string name="query_error" msgid="1222448261663503501">"Dokumentide päring ebaõnnestus"</string>
+ <string name="root_recent" msgid="4470053704320518133">"Hiljutised"</string>
+ <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> on vaba"</string>
+ <string name="root_type_service" msgid="2178854894416775409">"Mäluruumi teenused"</string>
+ <string name="root_type_shortcut" msgid="3318760609471618093">"Otseteed"</string>
+ <string name="root_type_device" msgid="7121342474653483538">"Seadmed"</string>
+ <string name="root_type_apps" msgid="8838065367985945189">"Rohkem rakendusi"</string>
+ <string name="pref_advanced_devices" msgid="903257239609301276">"Kuva tippseadmed"</string>
+ <string name="pref_file_size" msgid="2826879315743961459">"Kuva faili suurus"</string>
+ <string name="pref_device_size" msgid="3542106883278997222">"Kuva seadme suurus"</string>
+ <string name="empty" msgid="7858882803708117596">"Üksusi ei ole"</string>
+ <string name="toast_no_application" msgid="1339885974067891667">"Faili ei saa avada"</string>
+ <string name="toast_failed_delete" msgid="2180678019407244069">"Mõnda dokumenti ei õnnestu kustutada"</string>
+ <string name="share_via" msgid="8966594246261344259">"Jagage teenusega"</string>
+</resources>
diff --git a/packages/DocumentsUI/res/values-fa/strings.xml b/packages/DocumentsUI/res/values-fa/strings.xml
new file mode 100644
index 0000000..c922b37
--- /dev/null
+++ b/packages/DocumentsUI/res/values-fa/strings.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="2783841764617238354">"اسناد"</string>
+ <string name="title_open" msgid="4353228937663917801">"باز کردن از"</string>
+ <string name="title_save" msgid="2433679664882857999">"ذخیره در"</string>
+ <string name="menu_create_dir" msgid="5947289605844398389">"ایجاد پوشه"</string>
+ <string name="menu_grid" msgid="6878021334497835259">"نمای جدولی"</string>
+ <string name="menu_list" msgid="7279285939892417279">"نمای Ùهرست‌وار"</string>
+ <string name="menu_sort" msgid="7677740407158414452">"مرتب‌سازی بر اساس"</string>
+ <string name="menu_search" msgid="3816712084502856974">"جستجو"</string>
+ <string name="menu_settings" msgid="6008033148948428823">"تنظیمات"</string>
+ <string name="menu_open" msgid="432922957274920903">"باز کردن"</string>
+ <string name="menu_save" msgid="2394743337684426338">"ذخیره"</string>
+ <string name="menu_share" msgid="3075149983979628146">"اشتراک‌گذاری"</string>
+ <string name="menu_delete" msgid="8138799623850614177">"حذÙ"</string>
+ <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> انتخاب شد"</string>
+ <string name="sort_name" msgid="9183560467917256779">"بر اساس نام"</string>
+ <string name="sort_date" msgid="586080032956151448">"بر اساس تاریخ اصلاح"</string>
+ <string name="sort_size" msgid="3350681319735474741">"بر اساس اندازه"</string>
+ <string name="drawer_open" msgid="4545466532430226949">"نمایش ریشه‌ها"</string>
+ <string name="drawer_close" msgid="7602734368552123318">"پنهان کردن ریشه‌ها"</string>
+ <string name="save_error" msgid="6167009778003223664">"ذخیره سند انجام نشد"</string>
+ <string name="create_error" msgid="3735649141335444215">"ایجاد پوشه انجام نشد"</string>
+ <string name="query_error" msgid="1222448261663503501">"جستجوی اسناد ناموÙÙ‚ بود"</string>
+ <string name="root_recent" msgid="4470053704320518133">"اخیر"</string>
+ <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> آزاد"</string>
+ <string name="root_type_service" msgid="2178854894416775409">"خدمات ذخیره‌سازی"</string>
+ <string name="root_type_shortcut" msgid="3318760609471618093">"میانبرها"</string>
+ <string name="root_type_device" msgid="7121342474653483538">"دستگاه‌ها"</string>
+ <string name="root_type_apps" msgid="8838065367985945189">"برنامه‌های بیشتر"</string>
+ <string name="pref_advanced_devices" msgid="903257239609301276">"نمایش دستگاه‌های Ù¾ÛŒØ´Ø±ÙØªÙ‡"</string>
+ <string name="pref_file_size" msgid="2826879315743961459">"نمایش اندازه ÙØ§ÛŒÙ„"</string>
+ <string name="pref_device_size" msgid="3542106883278997222">"نمایش اندازه ØµÙØ­Ù‡ نمایش"</string>
+ <string name="empty" msgid="7858882803708117596">"موردی موجود نیست"</string>
+ <string name="toast_no_application" msgid="1339885974067891667">"ÙØ§ÛŒÙ„ باز نمی‌شود"</string>
+ <string name="toast_failed_delete" msgid="2180678019407244069">"برخی از اسناد حذ٠نمی‌شوند"</string>
+ <string name="share_via" msgid="8966594246261344259">"اشتراک‌گذاری از طریق"</string>
+</resources>
diff --git a/packages/DocumentsUI/res/values-fi/strings.xml b/packages/DocumentsUI/res/values-fi/strings.xml
new file mode 100644
index 0000000..5e40ecd
--- /dev/null
+++ b/packages/DocumentsUI/res/values-fi/strings.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="2783841764617238354">"Asiakirjat"</string>
+ <string name="title_open" msgid="4353228937663917801">"Avoinna alkaen"</string>
+ <string name="title_save" msgid="2433679664882857999">"Tallenna kohteeseen"</string>
+ <string name="menu_create_dir" msgid="5947289605844398389">"Luo kansio"</string>
+ <string name="menu_grid" msgid="6878021334497835259">"Ruudukkonäkymä"</string>
+ <string name="menu_list" msgid="7279285939892417279">"Luettelonäkymä"</string>
+ <string name="menu_sort" msgid="7677740407158414452">"Lajitteluperuste"</string>
+ <string name="menu_search" msgid="3816712084502856974">"Haku"</string>
+ <string name="menu_settings" msgid="6008033148948428823">"Asetukset"</string>
+ <string name="menu_open" msgid="432922957274920903">"Avaa"</string>
+ <string name="menu_save" msgid="2394743337684426338">"Tallenna"</string>
+ <string name="menu_share" msgid="3075149983979628146">"Jaa"</string>
+ <string name="menu_delete" msgid="8138799623850614177">"Poista"</string>
+ <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> valittua"</string>
+ <string name="sort_name" msgid="9183560467917256779">"Nimen mukaan"</string>
+ <string name="sort_date" msgid="586080032956151448">"Muokkauspäivän mukaan"</string>
+ <string name="sort_size" msgid="3350681319735474741">"Koon mukaan"</string>
+ <string name="drawer_open" msgid="4545466532430226949">"Näytä juuret"</string>
+ <string name="drawer_close" msgid="7602734368552123318">"Piilota juuret"</string>
+ <string name="save_error" msgid="6167009778003223664">"Asiakirjan tallennus epäonnistui"</string>
+ <string name="create_error" msgid="3735649141335444215">"Kansion luominen epäonnistui"</string>
+ <string name="query_error" msgid="1222448261663503501">"Dokumenttikysely epäonnistui"</string>
+ <string name="root_recent" msgid="4470053704320518133">"Viimeisimmät"</string>
+ <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> vapaana"</string>
+ <string name="root_type_service" msgid="2178854894416775409">"Tallennuspalvelut"</string>
+ <string name="root_type_shortcut" msgid="3318760609471618093">"Pikakuvakkeet"</string>
+ <string name="root_type_device" msgid="7121342474653483538">"Laitteet"</string>
+ <string name="root_type_apps" msgid="8838065367985945189">"Lisää sovelluksia"</string>
+ <string name="pref_advanced_devices" msgid="903257239609301276">"Näytä kehittyneet laitteet"</string>
+ <string name="pref_file_size" msgid="2826879315743961459">"Näytä tiedoston koko"</string>
+ <string name="pref_device_size" msgid="3542106883278997222">"Näytä laitteen koko"</string>
+ <string name="empty" msgid="7858882803708117596">"Ei kohteita"</string>
+ <string name="toast_no_application" msgid="1339885974067891667">"Tiedostoa ei voi avata"</string>
+ <string name="toast_failed_delete" msgid="2180678019407244069">"Joitakin asiakirjoja ei voi poistaa"</string>
+ <string name="share_via" msgid="8966594246261344259">"Jaa sovelluksessa"</string>
+</resources>
diff --git a/packages/DocumentsUI/res/values-fr-rCA/strings.xml b/packages/DocumentsUI/res/values-fr-rCA/strings.xml
new file mode 100644
index 0000000..a837379
--- /dev/null
+++ b/packages/DocumentsUI/res/values-fr-rCA/strings.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="2783841764617238354">"Documents"</string>
+ <string name="title_open" msgid="4353228937663917801">"Ouvert à partir de"</string>
+ <string name="title_save" msgid="2433679664882857999">"Enregistrer dans"</string>
+ <string name="menu_create_dir" msgid="5947289605844398389">"Créer un dossier"</string>
+ <string name="menu_grid" msgid="6878021334497835259">"Grille"</string>
+ <string name="menu_list" msgid="7279285939892417279">"Liste"</string>
+ <string name="menu_sort" msgid="7677740407158414452">"Trier par"</string>
+ <string name="menu_search" msgid="3816712084502856974">"Rechercher"</string>
+ <string name="menu_settings" msgid="6008033148948428823">"Paramètres"</string>
+ <string name="menu_open" msgid="432922957274920903">"Ouvrir"</string>
+ <string name="menu_save" msgid="2394743337684426338">"Enregistrer"</string>
+ <string name="menu_share" msgid="3075149983979628146">"Partager"</string>
+ <string name="menu_delete" msgid="8138799623850614177">"Supprimer"</string>
+ <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> sélectionné(s)"</string>
+ <string name="sort_name" msgid="9183560467917256779">"Par nom"</string>
+ <string name="sort_date" msgid="586080032956151448">"Par date de modification"</string>
+ <string name="sort_size" msgid="3350681319735474741">"Par taille"</string>
+ <string name="drawer_open" msgid="4545466532430226949">"Afficher les racines"</string>
+ <string name="drawer_close" msgid="7602734368552123318">"Masquer les racines"</string>
+ <string name="save_error" msgid="6167009778003223664">"Échec de l\'enregistrement du document"</string>
+ <string name="create_error" msgid="3735649141335444215">"Échec de la création du dossier"</string>
+ <string name="query_error" msgid="1222448261663503501">"Échec de la demande de document"</string>
+ <string name="root_recent" msgid="4470053704320518133">"Récents"</string>
+ <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> disponible"</string>
+ <string name="root_type_service" msgid="2178854894416775409">"Services de stockage"</string>
+ <string name="root_type_shortcut" msgid="3318760609471618093">"Raccourcis"</string>
+ <string name="root_type_device" msgid="7121342474653483538">"Appareils"</string>
+ <string name="root_type_apps" msgid="8838065367985945189">"Plus d\'applications"</string>
+ <string name="pref_advanced_devices" msgid="903257239609301276">"Afficher les appareils avancés"</string>
+ <string name="pref_file_size" msgid="2826879315743961459">"Afficher la taille du fichier"</string>
+ <string name="pref_device_size" msgid="3542106883278997222">"Taille de l\'écran de l\'appareil"</string>
+ <string name="empty" msgid="7858882803708117596">"Aucun élément"</string>
+ <string name="toast_no_application" msgid="1339885974067891667">"Impossible d\'ouvrir le fichier"</string>
+ <string name="toast_failed_delete" msgid="2180678019407244069">"Impossible de supprimer certains documents"</string>
+ <string name="share_via" msgid="8966594246261344259">"Partager par"</string>
+</resources>
diff --git a/packages/DocumentsUI/res/values-fr/strings.xml b/packages/DocumentsUI/res/values-fr/strings.xml
new file mode 100644
index 0000000..ff9aeda
--- /dev/null
+++ b/packages/DocumentsUI/res/values-fr/strings.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="2783841764617238354">"Documents"</string>
+ <string name="title_open" msgid="4353228937663917801">"Ouvrir à partir de"</string>
+ <string name="title_save" msgid="2433679664882857999">"Enregistrer sous"</string>
+ <string name="menu_create_dir" msgid="5947289605844398389">"Créer un dossier"</string>
+ <string name="menu_grid" msgid="6878021334497835259">"Grille"</string>
+ <string name="menu_list" msgid="7279285939892417279">"Liste"</string>
+ <string name="menu_sort" msgid="7677740407158414452">"Trier par"</string>
+ <string name="menu_search" msgid="3816712084502856974">"Rechercher"</string>
+ <string name="menu_settings" msgid="6008033148948428823">"Paramètres"</string>
+ <string name="menu_open" msgid="432922957274920903">"Ouvrir"</string>
+ <string name="menu_save" msgid="2394743337684426338">"Enregistrer"</string>
+ <string name="menu_share" msgid="3075149983979628146">"Partager"</string>
+ <string name="menu_delete" msgid="8138799623850614177">"Supprimer"</string>
+ <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> élément(s) sélectionné(s)"</string>
+ <string name="sort_name" msgid="9183560467917256779">"Par nom"</string>
+ <string name="sort_date" msgid="586080032956151448">"Par date de modification"</string>
+ <string name="sort_size" msgid="3350681319735474741">"Par taille"</string>
+ <string name="drawer_open" msgid="4545466532430226949">"Afficher les répertoires racines"</string>
+ <string name="drawer_close" msgid="7602734368552123318">"Masquer les répertoires racines"</string>
+ <string name="save_error" msgid="6167009778003223664">"Échec de l\'enregistrement du document."</string>
+ <string name="create_error" msgid="3735649141335444215">"Échec de la création du dossier."</string>
+ <string name="query_error" msgid="1222448261663503501">"Échec de la demande de documents."</string>
+ <string name="root_recent" msgid="4470053704320518133">"Récents"</string>
+ <string name="root_available_bytes" msgid="8568452858617033281">"Espace disponible : <xliff:g id="SIZE">%1$s</xliff:g>"</string>
+ <string name="root_type_service" msgid="2178854894416775409">"Services de stockage"</string>
+ <string name="root_type_shortcut" msgid="3318760609471618093">"Raccourcis"</string>
+ <string name="root_type_device" msgid="7121342474653483538">"Appareils"</string>
+ <string name="root_type_apps" msgid="8838065367985945189">"Autres applications"</string>
+ <string name="pref_advanced_devices" msgid="903257239609301276">"Afficher les appareils avancés"</string>
+ <string name="pref_file_size" msgid="2826879315743961459">"Afficher la taille des fichiers"</string>
+ <string name="pref_device_size" msgid="3542106883278997222">"Afficher la capacité de stockage des appareils"</string>
+ <string name="empty" msgid="7858882803708117596">"Aucun élément"</string>
+ <string name="toast_no_application" msgid="1339885974067891667">"Impossible d\'ouvrir le fichier."</string>
+ <string name="toast_failed_delete" msgid="2180678019407244069">"Impossible de supprimer certains documents."</string>
+ <string name="share_via" msgid="8966594246261344259">"Partager via"</string>
+</resources>
diff --git a/packages/DocumentsUI/res/values-hi/strings.xml b/packages/DocumentsUI/res/values-hi/strings.xml
new file mode 100644
index 0000000..8d7fcba
--- /dev/null
+++ b/packages/DocumentsUI/res/values-hi/strings.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="2783841764617238354">"दसà¥à¤¤à¤¾à¤µà¥‡à¤œà¤¼"</string>
+ <string name="title_open" msgid="4353228937663917801">"यहां से खोलें"</string>
+ <string name="title_save" msgid="2433679664882857999">"यहां सहेजें"</string>
+ <string name="menu_create_dir" msgid="5947289605844398389">"फ़ोलà¥à¤¡à¤° बनाà¤à¤‚"</string>
+ <string name="menu_grid" msgid="6878021334497835259">"गà¥à¤°à¤¿à¤¡ दृशà¥à¤¯"</string>
+ <string name="menu_list" msgid="7279285939892417279">"सूची दृशà¥à¤¯"</string>
+ <string name="menu_sort" msgid="7677740407158414452">"इससे कà¥à¤°à¤®à¤¿à¤¤ करें"</string>
+ <string name="menu_search" msgid="3816712084502856974">"खोजें"</string>
+ <string name="menu_settings" msgid="6008033148948428823">"सेटिंग"</string>
+ <string name="menu_open" msgid="432922957274920903">"खोलें"</string>
+ <string name="menu_save" msgid="2394743337684426338">"सहेजें"</string>
+ <string name="menu_share" msgid="3075149983979628146">"साà¤à¤¾ करें"</string>
+ <string name="menu_delete" msgid="8138799623850614177">"हटाà¤à¤‚"</string>
+ <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> चयनित"</string>
+ <string name="sort_name" msgid="9183560467917256779">"नाम के अनà¥à¤¸à¤¾à¤°"</string>
+ <string name="sort_date" msgid="586080032956151448">"बदलाव के दिनांक के अनà¥à¤¸à¤¾à¤°"</string>
+ <string name="sort_size" msgid="3350681319735474741">"आकार के अनà¥à¤¸à¤¾à¤°"</string>
+ <string name="drawer_open" msgid="4545466532430226949">"रूट दिखाà¤à¤‚"</string>
+ <string name="drawer_close" msgid="7602734368552123318">"रूट छिपाà¤à¤‚"</string>
+ <string name="save_error" msgid="6167009778003223664">"दसà¥à¤¤à¤¾à¤µà¥‡à¤œà¤¼ सहेजने में विफल रहा"</string>
+ <string name="create_error" msgid="3735649141335444215">"फ़ोलà¥à¤¡à¤° बनाने में विफल"</string>
+ <string name="query_error" msgid="1222448261663503501">"दसà¥à¤¤à¤¾à¤µà¥‡à¤œà¥‹à¤‚ के लिठकà¥à¤µà¥‡à¤°à¥€ करने में विफल रहा"</string>
+ <string name="root_recent" msgid="4470053704320518133">"हाल ही के"</string>
+ <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> रिकà¥à¤¤"</string>
+ <string name="root_type_service" msgid="2178854894416775409">"संगà¥à¤°à¤¹à¤£ सेवाà¤à¤‚"</string>
+ <string name="root_type_shortcut" msgid="3318760609471618093">"शॉरà¥à¤Ÿà¤•ट"</string>
+ <string name="root_type_device" msgid="7121342474653483538">"उपकरण"</string>
+ <string name="root_type_apps" msgid="8838065367985945189">"अधिक à¤à¤ªà¥à¤¸"</string>
+ <string name="pref_advanced_devices" msgid="903257239609301276">"उनà¥à¤¨à¤¤ उपकरणों को दिखाà¤à¤‚"</string>
+ <string name="pref_file_size" msgid="2826879315743961459">"फ़ाइल का आकार दिखाà¤à¤‚"</string>
+ <string name="pref_device_size" msgid="3542106883278997222">"उपकरण का आकार दिखाà¤à¤‚"</string>
+ <string name="empty" msgid="7858882803708117596">"कोई आइटम नहीं"</string>
+ <string name="toast_no_application" msgid="1339885974067891667">"फ़ाइल नहीं खोली जा सकती"</string>
+ <string name="toast_failed_delete" msgid="2180678019407244069">"कà¥à¤› दसà¥à¤¤à¤¾à¤µà¥‡à¤œà¤¼à¥‹à¤‚ को हटाने में अकà¥à¤·à¤®"</string>
+ <string name="share_via" msgid="8966594246261344259">"इसके दà¥à¤µà¤¾à¤°à¤¾ साà¤à¤¾ करें"</string>
+</resources>
diff --git a/packages/DocumentsUI/res/values-hr/strings.xml b/packages/DocumentsUI/res/values-hr/strings.xml
new file mode 100644
index 0000000..73c2f04
--- /dev/null
+++ b/packages/DocumentsUI/res/values-hr/strings.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="2783841764617238354">"Dokumenti"</string>
+ <string name="title_open" msgid="4353228937663917801">"Otvori iz"</string>
+ <string name="title_save" msgid="2433679664882857999">"Spremi u"</string>
+ <string name="menu_create_dir" msgid="5947289605844398389">"Izradi mapu"</string>
+ <string name="menu_grid" msgid="6878021334497835259">"Prikaz rešetke"</string>
+ <string name="menu_list" msgid="7279285939892417279">"Prikaz popisa"</string>
+ <string name="menu_sort" msgid="7677740407158414452">"Poredano po"</string>
+ <string name="menu_search" msgid="3816712084502856974">"Pretraživanje"</string>
+ <string name="menu_settings" msgid="6008033148948428823">"Postavke"</string>
+ <string name="menu_open" msgid="432922957274920903">"Otvaranje"</string>
+ <string name="menu_save" msgid="2394743337684426338">"Spremi"</string>
+ <string name="menu_share" msgid="3075149983979628146">"Dijeli"</string>
+ <string name="menu_delete" msgid="8138799623850614177">"Izbriši"</string>
+ <string name="mode_selected_count" msgid="459111894725594625">"Odabrano: <xliff:g id="COUNT">%1$d</xliff:g>"</string>
+ <string name="sort_name" msgid="9183560467917256779">"Po korisniku"</string>
+ <string name="sort_date" msgid="586080032956151448">"Po datumu izmjene"</string>
+ <string name="sort_size" msgid="3350681319735474741">"Po veliÄini"</string>
+ <string name="drawer_open" msgid="4545466532430226949">"Prikaži korijene"</string>
+ <string name="drawer_close" msgid="7602734368552123318">"Sakrij korijene"</string>
+ <string name="save_error" msgid="6167009778003223664">"Nije uspjelo spremanje dokumenta"</string>
+ <string name="create_error" msgid="3735649141335444215">"Izrada mape nije uspjela"</string>
+ <string name="query_error" msgid="1222448261663503501">"Traženje dokumenata nije uspjelo"</string>
+ <string name="root_recent" msgid="4470053704320518133">"Nedavno"</string>
+ <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> besplatno"</string>
+ <string name="root_type_service" msgid="2178854894416775409">"Usluge pohrane"</string>
+ <string name="root_type_shortcut" msgid="3318760609471618093">"PreÄaci"</string>
+ <string name="root_type_device" msgid="7121342474653483538">"Uređaji"</string>
+ <string name="root_type_apps" msgid="8838065367985945189">"Više aplikacija"</string>
+ <string name="pref_advanced_devices" msgid="903257239609301276">"Prikaži napredne uređaje"</string>
+ <string name="pref_file_size" msgid="2826879315743961459">"Prikaži veliÄinu datoteke"</string>
+ <string name="pref_device_size" msgid="3542106883278997222">"Prikaži veliÄinu ureÄ‘aja"</string>
+ <string name="empty" msgid="7858882803708117596">"Nema stavki"</string>
+ <string name="toast_no_application" msgid="1339885974067891667">"Datoteku nije moguće otvoriti"</string>
+ <string name="toast_failed_delete" msgid="2180678019407244069">"Nije moguće izbrisati neke dokumente"</string>
+ <string name="share_via" msgid="8966594246261344259">"Dijeli putem"</string>
+</resources>
diff --git a/packages/DocumentsUI/res/values-hu/strings.xml b/packages/DocumentsUI/res/values-hu/strings.xml
new file mode 100644
index 0000000..db7854b
--- /dev/null
+++ b/packages/DocumentsUI/res/values-hu/strings.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="2783841764617238354">"Dokumentumok"</string>
+ <string name="title_open" msgid="4353228937663917801">"Megnyitás innen"</string>
+ <string name="title_save" msgid="2433679664882857999">"Mentés ide"</string>
+ <string name="menu_create_dir" msgid="5947289605844398389">"Mappa létrehozása"</string>
+ <string name="menu_grid" msgid="6878021334497835259">"Rács"</string>
+ <string name="menu_list" msgid="7279285939892417279">"Lista"</string>
+ <string name="menu_sort" msgid="7677740407158414452">"Rendezés"</string>
+ <string name="menu_search" msgid="3816712084502856974">"Keresés"</string>
+ <string name="menu_settings" msgid="6008033148948428823">"Beállítások"</string>
+ <string name="menu_open" msgid="432922957274920903">"Megnyitás"</string>
+ <string name="menu_save" msgid="2394743337684426338">"Mentés"</string>
+ <string name="menu_share" msgid="3075149983979628146">"Megosztás"</string>
+ <string name="menu_delete" msgid="8138799623850614177">"Törlés"</string>
+ <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> kiválasztva"</string>
+ <string name="sort_name" msgid="9183560467917256779">"Név szerint"</string>
+ <string name="sort_date" msgid="586080032956151448">"Módosítás dátuma szerint"</string>
+ <string name="sort_size" msgid="3350681319735474741">"Méret szerint"</string>
+ <string name="drawer_open" msgid="4545466532430226949">"Gyökérszint megjelenítése"</string>
+ <string name="drawer_close" msgid="7602734368552123318">"Gyökérszint elrejtése"</string>
+ <string name="save_error" msgid="6167009778003223664">"Nem sikerült menteni a dokumentumot"</string>
+ <string name="create_error" msgid="3735649141335444215">"Nem sikerült létrehozni a mappát"</string>
+ <string name="query_error" msgid="1222448261663503501">"A dokumentumok lekérése nem sikerült"</string>
+ <string name="root_recent" msgid="4470053704320518133">"Legutóbbiak"</string>
+ <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> szabad"</string>
+ <string name="root_type_service" msgid="2178854894416775409">"Tárhelyszolgáltatások"</string>
+ <string name="root_type_shortcut" msgid="3318760609471618093">"Parancsikonok"</string>
+ <string name="root_type_device" msgid="7121342474653483538">"Eszközök"</string>
+ <string name="root_type_apps" msgid="8838065367985945189">"További alkalmazások"</string>
+ <string name="pref_advanced_devices" msgid="903257239609301276">"Speciális eszközök megjelenítése"</string>
+ <string name="pref_file_size" msgid="2826879315743961459">"Fájlméret megjelenítése"</string>
+ <string name="pref_device_size" msgid="3542106883278997222">"Eszközméret megjelenítése"</string>
+ <string name="empty" msgid="7858882803708117596">"Nincsenek elemek"</string>
+ <string name="toast_no_application" msgid="1339885974067891667">"A fájlt nem lehet megnyitni"</string>
+ <string name="toast_failed_delete" msgid="2180678019407244069">"Néhány dokumentumot nem lehet törölni"</string>
+ <string name="share_via" msgid="8966594246261344259">"Megosztás itt:"</string>
+</resources>
diff --git a/packages/DocumentsUI/res/values-hy-rAM/strings.xml b/packages/DocumentsUI/res/values-hy-rAM/strings.xml
new file mode 100644
index 0000000..c683f3e
--- /dev/null
+++ b/packages/DocumentsUI/res/values-hy-rAM/strings.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="2783841764617238354">"Õ“Õ¡Õ½Õ¿Õ¡Õ©Õ²Õ©Õ¥Ö€"</string>
+ <string name="title_open" msgid="4353228937663917801">"Ô²Õ¡ÖÕ¥Õ¬ Õ¡ÕµÕ½Õ¿Õ¥Õ²Õ«Ö"</string>
+ <string name="title_save" msgid="2433679664882857999">"ÕŠÕ¡Õ°Õ¥Õ¬ Õ¡ÕµÕ½Õ¿Õ¥Õ²"</string>
+ <string name="menu_create_dir" msgid="5947289605844398389">"ÕÕ¿Õ¥Õ²Õ®Õ¥Õ¬ Õ©Õ²Õ©Õ¡ÕºÕ¡Õ¶Õ¡Õ¯"</string>
+ <string name="menu_grid" msgid="6878021334497835259">"Õ‘Õ¡Õ¶ÖÕ¡ÕµÕ«Õ¶ Õ¿Õ¥Õ½Ö„"</string>
+ <string name="menu_list" msgid="7279285939892417279">"Õ‘Õ¸Ö‚ÖÕ¡Õ¯Õ« Õ¿Õ¥Õ½Ö„"</string>
+ <string name="menu_sort" msgid="7677740407158414452">"Ô´Õ¡Õ½Õ¡Õ¾Õ¸Ö€Õ¥Õ¬ Õ¨Õ½Õ¿"</string>
+ <string name="menu_search" msgid="3816712084502856974">"ÕˆÖ€Õ¸Õ¶Õ¥Õ¬"</string>
+ <string name="menu_settings" msgid="6008033148948428823">"Ô¿Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´Õ¶Õ¥Ö€"</string>
+ <string name="menu_open" msgid="432922957274920903">"Ô²Õ¡ÖÕ¥Õ¬"</string>
+ <string name="menu_save" msgid="2394743337684426338">"ÕŠÕ¡Õ°Õ¥Õ¬"</string>
+ <string name="menu_share" msgid="3075149983979628146">"Õ€Õ¡Õ´Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¥Õ¬"</string>
+ <string name="menu_delete" msgid="8138799623850614177">"Õ‹Õ¶Õ»Õ¥Õ¬"</string>
+ <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> Õ¨Õ¶Õ¿Ö€Õ¾Õ¡Õ®"</string>
+ <string name="sort_name" msgid="9183560467917256779">"Ô¸Õ½Õ¿ Õ¡Õ¶Õ¾Õ¡Õ¶"</string>
+ <string name="sort_date" msgid="586080032956151448">"Ô¸Õ½Õ¿ ÖƒÕ¸ÖƒÕ¸Õ­Õ´Õ¡Õ¶ Õ¡Õ´Õ½Õ¡Õ©Õ¾Õ«"</string>
+ <string name="sort_size" msgid="3350681319735474741">"Ô¸Õ½Õ¿ Õ¹Õ¡ÖƒÕ«"</string>
+ <string name="drawer_open" msgid="4545466532430226949">"Õ‘Õ¸Ö‚ÕµÖ Õ¿Õ¡Õ¬ Õ¡Ö€Õ´Õ¡Õ¿Õ¶Õ¥Ö€Õ¨"</string>
+ <string name="drawer_close" msgid="7602734368552123318">"Ô¹Õ¡Ö„ÖÕ¶Õ¥Õ¬ Õ¡Ö€Õ´Õ¡Õ¿Õ¶Õ¥Ö€Õ¨"</string>
+ <string name="save_error" msgid="6167009778003223664">"Õ‰Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Ö ÕºÕ¡Õ°Õ¥Õ¬ ÖƒÕ¡Õ½Õ¿Õ¡Õ©Õ¸Ö‚Õ²Õ©Õ¨"</string>
+ <string name="create_error" msgid="3735649141335444215">"Õ‰Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Ö Õ½Õ¿Õ¥Õ²Õ®Õ¥Õ¬ Õ©Õ²Õ©Õ¡ÕºÕ¡Õ¶Õ¡Õ¯Õ¨"</string>
+ <string name="query_error" msgid="1222448261663503501">"Õ“Õ¡Õ½Õ¿Õ¡Õ©Õ²Õ©Õ¥Ö€Õ«Õ¶ Õ°Õ¡Ö€ÖÕ¸Ö‚Õ´ Õ¯Õ¡Õ¿Õ¡Ö€Õ¥Õ¬Õ«Õ½ Õ½Õ­Õ¡Õ¬ Õ¿Õ¥Õ²Õ« Õ¸Ö‚Õ¶Õ¥ÖÕ¡Õ¾"</string>
+ <string name="root_recent" msgid="4470053704320518133">"ÕŽÕ¥Ö€Õ»Õ«Õ¶"</string>
+ <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> Õ¡Õ¦Õ¡Õ¿ Õ§"</string>
+ <string name="root_type_service" msgid="2178854894416775409">"ÕŠÕ¡Õ°Õ¸Ö‚Õ½Õ¿Õ« Õ®Õ¡Õ¼Õ¡ÕµÕ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€"</string>
+ <string name="root_type_shortcut" msgid="3318760609471618093">"Ô´ÕµÕ¸Ö‚Ö€Õ¡Õ¶ÖÕ¸Ö‚Õ´Õ¶Õ¥Ö€"</string>
+ <string name="root_type_device" msgid="7121342474653483538">"ÕÕ¡Ö€Ö„Õ¥Ö€"</string>
+ <string name="root_type_apps" msgid="8838065367985945189">"Õ€Õ¡Õ¾Õ¥Õ¬ÕµÕ¡Õ¬ Õ®Ö€Õ¡Õ£Ö€Õ¥Ö€"</string>
+ <string name="pref_advanced_devices" msgid="903257239609301276">"Õ‘Õ¸Ö‚ÖÕ¡Õ¤Ö€Õ¥Õ¬ Õ¨Õ¶Õ¤Õ¬Õ¡ÕµÕ¶Õ¾Õ¡Õ® Õ½Õ¡Ö€Ö„Õ¥Ö€Õ¨"</string>
+ <string name="pref_file_size" msgid="2826879315743961459">"Õ‘Õ¸Ö‚ÖÕ¡Õ¤Ö€Õ¥Õ¬ Ö†Õ¡ÕµÕ¬Õ« Õ¹Õ¡ÖƒÕ¨"</string>
+ <string name="pref_device_size" msgid="3542106883278997222">"Õ‘Õ¸Ö‚ÖÕ¡Õ¤Ö€Õ¥Õ¬ Õ½Õ¡Ö€Ö„Õ« Õ¹Õ¡ÖƒÕ¨"</string>
+ <string name="empty" msgid="7858882803708117596">"ÕÕ¡Ö€Ö€Õ¥Ö€ Õ¹Õ¯Õ¡Õ¶"</string>
+ <string name="toast_no_application" msgid="1339885974067891667">"Õ€Õ¶Õ¡Ö€Õ¡Õ¾Õ¸Ö€ Õ¹Õ§ Õ¢Õ¡ÖÕ¥Õ¬ Ö†Õ¡ÕµÕ¬Õ¨"</string>
+ <string name="toast_failed_delete" msgid="2180678019407244069">"Ô±Õ¶Õ°Õ¶Õ¡Ö€ Õ§ Õ»Õ¶Õ»Õ¥Õ¬ Õ¸Ö€Õ¸Õ· ÖƒÕ¡Õ½Õ¿Õ¡Õ©Õ²Õ©Õ¥Ö€"</string>
+ <string name="share_via" msgid="8966594246261344259">"ÕÕ¡Ö€Õ¡Õ®Õ¥Õ¬"</string>
+</resources>
diff --git a/packages/DocumentsUI/res/values-in/strings.xml b/packages/DocumentsUI/res/values-in/strings.xml
new file mode 100644
index 0000000..519b936
--- /dev/null
+++ b/packages/DocumentsUI/res/values-in/strings.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="2783841764617238354">"Dokumen"</string>
+ <string name="title_open" msgid="4353228937663917801">"Buka dari"</string>
+ <string name="title_save" msgid="2433679664882857999">"Simpan ke"</string>
+ <string name="menu_create_dir" msgid="5947289605844398389">"Buat folder"</string>
+ <string name="menu_grid" msgid="6878021334497835259">"Tampilan kisi"</string>
+ <string name="menu_list" msgid="7279285939892417279">"Tampilan daftar"</string>
+ <string name="menu_sort" msgid="7677740407158414452">"Sortir menurut"</string>
+ <string name="menu_search" msgid="3816712084502856974">"Telusuri"</string>
+ <string name="menu_settings" msgid="6008033148948428823">"Setelan"</string>
+ <string name="menu_open" msgid="432922957274920903">"Buka"</string>
+ <string name="menu_save" msgid="2394743337684426338">"Simpan"</string>
+ <string name="menu_share" msgid="3075149983979628146">"Bagikan"</string>
+ <string name="menu_delete" msgid="8138799623850614177">"Hapus"</string>
+ <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> dipilih"</string>
+ <string name="sort_name" msgid="9183560467917256779">"Menurut nama"</string>
+ <string name="sort_date" msgid="586080032956151448">"Menurut tanggal diubah"</string>
+ <string name="sort_size" msgid="3350681319735474741">"Menurut ukuran"</string>
+ <string name="drawer_open" msgid="4545466532430226949">"Tampilkan akar"</string>
+ <string name="drawer_close" msgid="7602734368552123318">"Sembunyikan akar"</string>
+ <string name="save_error" msgid="6167009778003223664">"Gagal menyimpan dokumen"</string>
+ <string name="create_error" msgid="3735649141335444215">"Gagal membuat folder"</string>
+ <string name="query_error" msgid="1222448261663503501">"Gagal mengirim kueri untuk dokumen"</string>
+ <string name="root_recent" msgid="4470053704320518133">"Terkini"</string>
+ <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> bebas"</string>
+ <string name="root_type_service" msgid="2178854894416775409">"Layanan penyimpanan"</string>
+ <string name="root_type_shortcut" msgid="3318760609471618093">"Pintasan"</string>
+ <string name="root_type_device" msgid="7121342474653483538">"Perangkat"</string>
+ <string name="root_type_apps" msgid="8838065367985945189">"Aplikasi lain"</string>
+ <string name="pref_advanced_devices" msgid="903257239609301276">"Tampilkan perangkat lanjutan"</string>
+ <string name="pref_file_size" msgid="2826879315743961459">"Tampilkan ukuran file"</string>
+ <string name="pref_device_size" msgid="3542106883278997222">"Tampilkan ukuran perangkat"</string>
+ <string name="empty" msgid="7858882803708117596">"Tidak ada item"</string>
+ <string name="toast_no_application" msgid="1339885974067891667">"Tidak dapat membuka file"</string>
+ <string name="toast_failed_delete" msgid="2180678019407244069">"Tidak dapat menghapus beberapa dokumen"</string>
+ <string name="share_via" msgid="8966594246261344259">"Bagikan melalui"</string>
+</resources>
diff --git a/packages/DocumentsUI/res/values-it/strings.xml b/packages/DocumentsUI/res/values-it/strings.xml
new file mode 100644
index 0000000..28323b6
--- /dev/null
+++ b/packages/DocumentsUI/res/values-it/strings.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="2783841764617238354">"Documenti"</string>
+ <string name="title_open" msgid="4353228937663917801">"Apri da"</string>
+ <string name="title_save" msgid="2433679664882857999">"Salva in"</string>
+ <string name="menu_create_dir" msgid="5947289605844398389">"Crea cartella"</string>
+ <string name="menu_grid" msgid="6878021334497835259">"Visualizzazione griglia"</string>
+ <string name="menu_list" msgid="7279285939892417279">"Visualizzazione elenco"</string>
+ <string name="menu_sort" msgid="7677740407158414452">"Ordina per"</string>
+ <string name="menu_search" msgid="3816712084502856974">"Cerca"</string>
+ <string name="menu_settings" msgid="6008033148948428823">"Impostazioni"</string>
+ <string name="menu_open" msgid="432922957274920903">"Apri"</string>
+ <string name="menu_save" msgid="2394743337684426338">"Salva"</string>
+ <string name="menu_share" msgid="3075149983979628146">"Condividi"</string>
+ <string name="menu_delete" msgid="8138799623850614177">"Elimina"</string>
+ <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> selezionati"</string>
+ <string name="sort_name" msgid="9183560467917256779">"Per nome"</string>
+ <string name="sort_date" msgid="586080032956151448">"Per data di modifica"</string>
+ <string name="sort_size" msgid="3350681319735474741">"Per dimensioni"</string>
+ <string name="drawer_open" msgid="4545466532430226949">"Mostra nodi principali"</string>
+ <string name="drawer_close" msgid="7602734368552123318">"Nascondi nodi principali"</string>
+ <string name="save_error" msgid="6167009778003223664">"Impossibile salvare il documento"</string>
+ <string name="create_error" msgid="3735649141335444215">"Impossibile creare la cartella"</string>
+ <string name="query_error" msgid="1222448261663503501">"Impossibile chiedere documenti"</string>
+ <string name="root_recent" msgid="4470053704320518133">"Recente"</string>
+ <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> liberi"</string>
+ <string name="root_type_service" msgid="2178854894416775409">"Servizi di archiviazione"</string>
+ <string name="root_type_shortcut" msgid="3318760609471618093">"Scorciatoie"</string>
+ <string name="root_type_device" msgid="7121342474653483538">"Dispositivi"</string>
+ <string name="root_type_apps" msgid="8838065367985945189">"Altre app"</string>
+ <string name="pref_advanced_devices" msgid="903257239609301276">"Visualizza dispositivi avanzati"</string>
+ <string name="pref_file_size" msgid="2826879315743961459">"Visualizza dimensioni file"</string>
+ <string name="pref_device_size" msgid="3542106883278997222">"Visualizza dimensioni dispositivi"</string>
+ <string name="empty" msgid="7858882803708117596">"Nessun articolo"</string>
+ <string name="toast_no_application" msgid="1339885974067891667">"Impossibile aprire il file"</string>
+ <string name="toast_failed_delete" msgid="2180678019407244069">"Impossibile eliminare alcuni documenti"</string>
+ <string name="share_via" msgid="8966594246261344259">"Condividi via"</string>
+</resources>
diff --git a/packages/DocumentsUI/res/values-iw/strings.xml b/packages/DocumentsUI/res/values-iw/strings.xml
new file mode 100644
index 0000000..712c060
--- /dev/null
+++ b/packages/DocumentsUI/res/values-iw/strings.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="2783841764617238354">"מסמכי×"</string>
+ <string name="title_open" msgid="4353228937663917801">"פתח מ-"</string>
+ <string name="title_save" msgid="2433679664882857999">"שמור ב-"</string>
+ <string name="menu_create_dir" msgid="5947289605844398389">"צור תיקיה"</string>
+ <string name="menu_grid" msgid="6878021334497835259">"תצוגת רשת"</string>
+ <string name="menu_list" msgid="7279285939892417279">"תצוגת רשימה"</string>
+ <string name="menu_sort" msgid="7677740407158414452">"מיין לפי"</string>
+ <string name="menu_search" msgid="3816712084502856974">"חפש"</string>
+ <string name="menu_settings" msgid="6008033148948428823">"הגדרות"</string>
+ <string name="menu_open" msgid="432922957274920903">"פתח"</string>
+ <string name="menu_save" msgid="2394743337684426338">"שמור"</string>
+ <string name="menu_share" msgid="3075149983979628146">"שתף"</string>
+ <string name="menu_delete" msgid="8138799623850614177">"מחק"</string>
+ <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> נבחרו"</string>
+ <string name="sort_name" msgid="9183560467917256779">"לפי ש×"</string>
+ <string name="sort_date" msgid="586080032956151448">"לפי ת×ריך שינוי"</string>
+ <string name="sort_size" msgid="3350681319735474741">"לפי גודל"</string>
+ <string name="drawer_open" msgid="4545466532430226949">"הצג שורשי×"</string>
+ <string name="drawer_close" msgid="7602734368552123318">"הסתר שורשי×"</string>
+ <string name="save_error" msgid="6167009778003223664">"שמירת המסמך נכשלה"</string>
+ <string name="create_error" msgid="3735649141335444215">"יצירת התיקיה נכשלה"</string>
+ <string name="query_error" msgid="1222448261663503501">"ש×ילתת ×”×ž×¡×ž×›×™× × ×›×©×œ×”"</string>
+ <string name="root_recent" msgid="4470053704320518133">"מהזמן ×”×חרון"</string>
+ <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> של שטח פנוי"</string>
+ <string name="root_type_service" msgid="2178854894416775409">"שירותי ×חסון"</string>
+ <string name="root_type_shortcut" msgid="3318760609471618093">"קיצורי דרך"</string>
+ <string name="root_type_device" msgid="7121342474653483538">"מכשירי×"</string>
+ <string name="root_type_apps" msgid="8838065367985945189">"עוד ×פליקציות"</string>
+ <string name="pref_advanced_devices" msgid="903257239609301276">"הצג ×ž×›×©×™×¨×™× ×ž×ª×§×“×ž×™×"</string>
+ <string name="pref_file_size" msgid="2826879315743961459">"הצג ×ת גודל הקובץ"</string>
+ <string name="pref_device_size" msgid="3542106883278997222">"הצג ×ת גודל המכשיר"</string>
+ <string name="empty" msgid="7858882803708117596">"×ין פריטי×"</string>
+ <string name="toast_no_application" msgid="1339885974067891667">"×œ× × ×™×ª×Ÿ לפתוח ×ת הקובץ"</string>
+ <string name="toast_failed_delete" msgid="2180678019407244069">"×œ× × ×™×ª×Ÿ למחוק חלק מהמסמכי×"</string>
+ <string name="share_via" msgid="8966594246261344259">"שתף ב×מצעות"</string>
+</resources>
diff --git a/packages/DocumentsUI/res/values-ja/strings.xml b/packages/DocumentsUI/res/values-ja/strings.xml
new file mode 100644
index 0000000..996496d
--- /dev/null
+++ b/packages/DocumentsUI/res/values-ja/strings.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="2783841764617238354">"ドキュメント"</string>
+ <string name="title_open" msgid="4353228937663917801">"次ã‹ã‚‰é–‹ã:"</string>
+ <string name="title_save" msgid="2433679664882857999">"次ã«ä¿å­˜:"</string>
+ <string name="menu_create_dir" msgid="5947289605844398389">"フォルダを作æˆ"</string>
+ <string name="menu_grid" msgid="6878021334497835259">"グリッド表示"</string>
+ <string name="menu_list" msgid="7279285939892417279">"リスト表示"</string>
+ <string name="menu_sort" msgid="7677740407158414452">"ä¸¦ã¹æ›¿ãˆ"</string>
+ <string name="menu_search" msgid="3816712084502856974">"検索"</string>
+ <string name="menu_settings" msgid="6008033148948428823">"設定"</string>
+ <string name="menu_open" msgid="432922957274920903">"é–‹ã"</string>
+ <string name="menu_save" msgid="2394743337684426338">"ä¿å­˜"</string>
+ <string name="menu_share" msgid="3075149983979628146">"共有"</string>
+ <string name="menu_delete" msgid="8138799623850614177">"削除"</string>
+ <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g>ä»¶é¸æŠžæ¸ˆã¿"</string>
+ <string name="sort_name" msgid="9183560467917256779">"åå‰é †"</string>
+ <string name="sort_date" msgid="586080032956151448">"更新日順"</string>
+ <string name="sort_size" msgid="3350681319735474741">"サイズ順"</string>
+ <string name="drawer_open" msgid="4545466532430226949">"ルートを表示ã™ã‚‹"</string>
+ <string name="drawer_close" msgid="7602734368552123318">"ルートをéžè¡¨ç¤ºã«ã™ã‚‹"</string>
+ <string name="save_error" msgid="6167009778003223664">"ドキュメントをä¿å­˜ã§ãã¾ã›ã‚“ã§ã—ãŸ"</string>
+ <string name="create_error" msgid="3735649141335444215">"フォルダを作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ"</string>
+ <string name="query_error" msgid="1222448261663503501">"ドキュメントã®ã‚¯ã‚¨ãƒªã«å¤±æ•—ã—ã¾ã—ãŸ"</string>
+ <string name="root_recent" msgid="4470053704320518133">"最近"</string>
+ <string name="root_available_bytes" msgid="8568452858617033281">"空ã容é‡: <xliff:g id="SIZE">%1$s</xliff:g>"</string>
+ <string name="root_type_service" msgid="2178854894416775409">"ストレージサービス"</string>
+ <string name="root_type_shortcut" msgid="3318760609471618093">"ショートカット"</string>
+ <string name="root_type_device" msgid="7121342474653483538">"端末"</string>
+ <string name="root_type_apps" msgid="8838065367985945189">"ãã®ä»–ã®ã‚¢ãƒ—リ"</string>
+ <string name="pref_advanced_devices" msgid="903257239609301276">"端末ã®è©³ç´°è¨­å®šã‚’表示"</string>
+ <string name="pref_file_size" msgid="2826879315743961459">"ファイルã®ã‚µã‚¤ã‚ºã‚’表示"</string>
+ <string name="pref_device_size" msgid="3542106883278997222">"端末ã®ã‚µã‚¤ã‚ºã‚’表示"</string>
+ <string name="empty" msgid="7858882803708117596">"アイテムãŒã‚りã¾ã›ã‚“"</string>
+ <string name="toast_no_application" msgid="1339885974067891667">"ファイルを開ã‘ã¾ã›ã‚“"</string>
+ <string name="toast_failed_delete" msgid="2180678019407244069">"一部ã®ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã‚’削除ã§ãã¾ã›ã‚“"</string>
+ <string name="share_via" msgid="8966594246261344259">"共有ツール"</string>
+</resources>
diff --git a/packages/DocumentsUI/res/values-ka-rGE/strings.xml b/packages/DocumentsUI/res/values-ka-rGE/strings.xml
new file mode 100644
index 0000000..f3e1274
--- /dev/null
+++ b/packages/DocumentsUI/res/values-ka-rGE/strings.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="2783841764617238354">"დáƒáƒ™áƒ£áƒ›áƒ”ნტები"</string>
+ <string name="title_open" msgid="4353228937663917801">"გáƒáƒ®áƒ¡áƒœáƒ áƒáƒ¥áƒ”დáƒáƒœ:"</string>
+ <string name="title_save" msgid="2433679664882857999">"შენáƒáƒ®áƒ•რáƒáƒ¥:"</string>
+ <string name="menu_create_dir" msgid="5947289605844398389">"სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის შექმნáƒ"</string>
+ <string name="menu_grid" msgid="6878021334497835259">"ბáƒáƒ“ის ხედი"</string>
+ <string name="menu_list" msgid="7279285939892417279">"სიის ხედი"</string>
+ <string name="menu_sort" msgid="7677740407158414452">"სáƒáƒ áƒ¢áƒ˜áƒ áƒ”ბáƒ:"</string>
+ <string name="menu_search" msgid="3816712084502856974">"ძიებáƒ"</string>
+ <string name="menu_settings" msgid="6008033148948428823">"პáƒáƒ áƒáƒ›áƒ”ტრები"</string>
+ <string name="menu_open" msgid="432922957274920903">"გáƒáƒ®áƒ¡áƒœáƒ"</string>
+ <string name="menu_save" msgid="2394743337684426338">"შენáƒáƒ®áƒ•áƒ"</string>
+ <string name="menu_share" msgid="3075149983979628146">"გáƒáƒ–იáƒáƒ áƒ”ბáƒ"</string>
+ <string name="menu_delete" msgid="8138799623850614177">"წáƒáƒ¨áƒšáƒ"</string>
+ <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> მáƒáƒœáƒ˜áƒ¨áƒœáƒ£áƒšáƒ˜"</string>
+ <string name="sort_name" msgid="9183560467917256779">"სáƒáƒ®áƒ”ლით"</string>
+ <string name="sort_date" msgid="586080032956151448">"ცვლილების თáƒáƒ áƒ˜áƒ¦áƒ˜áƒ—"</string>
+ <string name="sort_size" msgid="3350681319735474741">"ზáƒáƒ›áƒ˜áƒ—"</string>
+ <string name="drawer_open" msgid="4545466532430226949">"ფესვების ჩვენებáƒ"</string>
+ <string name="drawer_close" msgid="7602734368552123318">"ფესვების დáƒáƒ›áƒáƒšáƒ•áƒ"</string>
+ <string name="save_error" msgid="6167009778003223664">"დáƒáƒ™áƒ£áƒ›áƒ”ნტის შენáƒáƒ®áƒ•რვერ მáƒáƒ®áƒ”რხდáƒ"</string>
+ <string name="create_error" msgid="3735649141335444215">"სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის შექმნრვერ მáƒáƒ®áƒ”რხდáƒ"</string>
+ <string name="query_error" msgid="1222448261663503501">"დáƒáƒ™áƒ£áƒ›áƒ”ნტებზე მáƒáƒ—ხáƒáƒ•ნრვერ გáƒáƒ˜áƒ’ზáƒáƒ•ნáƒ"</string>
+ <string name="root_recent" msgid="4470053704320518133">"ბáƒáƒšáƒ"</string>
+ <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> თáƒáƒ•ისუფáƒáƒšáƒ˜áƒ"</string>
+ <string name="root_type_service" msgid="2178854894416775409">"მეხსიერების სერვისები"</string>
+ <string name="root_type_shortcut" msgid="3318760609471618093">"მáƒáƒšáƒ¡áƒáƒ®áƒ›áƒáƒ‘ები"</string>
+ <string name="root_type_device" msgid="7121342474653483538">"მáƒáƒ¬áƒ§áƒáƒ‘ილáƒáƒ‘ები"</string>
+ <string name="root_type_apps" msgid="8838065367985945189">"მეტი áƒáƒžáƒ”ბი"</string>
+ <string name="pref_advanced_devices" msgid="903257239609301276">"კáƒáƒ›áƒžáƒšáƒ”ქსური მáƒáƒ¬áƒ§áƒáƒ‘ილáƒáƒ‘ების ჩვენებáƒ"</string>
+ <string name="pref_file_size" msgid="2826879315743961459">"ფáƒáƒ˜áƒšáƒ˜áƒ¡ ზáƒáƒ›áƒ˜áƒ¡ ჩვენებáƒ"</string>
+ <string name="pref_device_size" msgid="3542106883278997222">"მáƒáƒ¬áƒ§áƒáƒ‘ილáƒáƒ‘ის ზáƒáƒ›áƒ˜áƒ¡ ჩვენებáƒ"</string>
+ <string name="empty" msgid="7858882803708117596">"ერთეულები áƒáƒ  áƒáƒ áƒ˜áƒ¡"</string>
+ <string name="toast_no_application" msgid="1339885974067891667">"ფáƒáƒ˜áƒšáƒ˜áƒ¡ გáƒáƒ®áƒ¡áƒœáƒ ვერ ხერხდებáƒ"</string>
+ <string name="toast_failed_delete" msgid="2180678019407244069">"ზáƒáƒ’იერთი დáƒáƒ™áƒ£áƒ›áƒ”ნტის წáƒáƒ¨áƒšáƒ ვერ ხერხდებáƒ"</string>
+ <string name="share_via" msgid="8966594246261344259">"გáƒáƒ–იáƒáƒ áƒ”ბáƒ:"</string>
+</resources>
diff --git a/packages/DocumentsUI/res/values-km-rKH/strings.xml b/packages/DocumentsUI/res/values-km-rKH/strings.xml
new file mode 100644
index 0000000..80f3698
--- /dev/null
+++ b/packages/DocumentsUI/res/values-km-rKH/strings.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="2783841764617238354">"ឯកសារ"</string>
+ <string name="title_open" msgid="4353228937663917801">"បើក​ពី"</string>
+ <string name="title_save" msgid="2433679664882857999">"រក្សា​ទុក​ទៅ"</string>
+ <string name="menu_create_dir" msgid="5947289605844398389">"បង្កើážâ€‹ážáž"</string>
+ <string name="menu_grid" msgid="6878021334497835259">"ទិដ្ឋភាព​ក្រឡា"</string>
+ <string name="menu_list" msgid="7279285939892417279">"ទិដ្ឋភាព​បញ្ជី"</string>
+ <string name="menu_sort" msgid="7677740407158414452">"ážáž˜áŸ’រៀប​ážáž¶áž˜"</string>
+ <string name="menu_search" msgid="3816712084502856974">"ស្វែងរក"</string>
+ <string name="menu_settings" msgid="6008033148948428823">"ការ​កំណážáŸ‹"</string>
+ <string name="menu_open" msgid="432922957274920903">"បើក"</string>
+ <string name="menu_save" msgid="2394743337684426338">"រក្សាទុក"</string>
+ <string name="menu_share" msgid="3075149983979628146">"ចែករំលែក"</string>
+ <string name="menu_delete" msgid="8138799623850614177">"លុប"</string>
+ <string name="mode_selected_count" msgid="459111894725594625">"បាន​ជ្រើស <xliff:g id="COUNT">%1$d</xliff:g>"</string>
+ <string name="sort_name" msgid="9183560467917256779">"ážáž¶áž˜â€‹ážˆáŸ’មោះ"</string>
+ <string name="sort_date" msgid="586080032956151448">"ážáž¶áž˜â€‹áž€áž¶áž›áž”រិច្ឆáŸáž‘​បាន​កែប្រែ"</string>
+ <string name="sort_size" msgid="3350681319735474741">"ážáž¶áž˜â€‹â€‹áž‘ំហំ"</string>
+ <string name="drawer_open" msgid="4545466532430226949">"បង្ហាញ roots"</string>
+ <string name="drawer_close" msgid="7602734368552123318">"លាក់ roots"</string>
+ <string name="save_error" msgid="6167009778003223664">"បាន​បរាជáŸáž™â€‹áž€áŸ’នុង​ការ​រក្សា​ទុក​ឯកសារ"</string>
+ <string name="create_error" msgid="3735649141335444215">"បាន​បរាជáŸáž™â€‹áž€áŸ’នុង​ការ​បង្កើážâ€‹ážáž"</string>
+ <string name="query_error" msgid="1222448261663503501">"បាន​បរាជáŸáž™â€‹áž€áŸ’នុង​ការ​​ច្រោះ​ឯកសារ"</string>
+ <string name="root_recent" msgid="4470053704320518133">"ážáŸ’មីៗ"</string>
+ <string name="root_available_bytes" msgid="8568452858617033281">"ទំនáŸážš <xliff:g id="SIZE">%1$s</xliff:g>"</string>
+ <string name="root_type_service" msgid="2178854894416775409">"សáŸážœáž¶áž€áž˜áŸ’ម​ផ្ដល់​ឧបករណáŸâ€‹áž•្ទុក"</string>
+ <string name="root_type_shortcut" msgid="3318760609471618093">"ផ្លូវកាážáŸ‹"</string>
+ <string name="root_type_device" msgid="7121342474653483538">"ឧបករណáŸ"</string>
+ <string name="root_type_apps" msgid="8838065367985945189">"កម្ម​វិធី​​ច្រើន​ទៀáž"</string>
+ <string name="pref_advanced_devices" msgid="903257239609301276">"បង្ហាញ​ឧបករណáŸâ€‹áž€áž˜áŸ’ážšáž·ážâ€‹ážáŸ’ពស់"</string>
+ <string name="pref_file_size" msgid="2826879315743961459">"បង្ហាញ​ទំហំ​ឯកសារ"</string>
+ <string name="pref_device_size" msgid="3542106883278997222">"បង្ហាញ​ទំហំ​ឧបករណáŸ"</string>
+ <string name="empty" msgid="7858882803708117596">"គ្មានធាážáž»"</string>
+ <string name="toast_no_application" msgid="1339885974067891667">"មិន​អាច​បើក​ឯកសារ"</string>
+ <string name="toast_failed_delete" msgid="2180678019407244069">"មិន​អាច​លុប​ឯកសារ​មួយ​ចំនួន"</string>
+ <string name="share_via" msgid="8966594246261344259">"ចែករំលែក​ážáž¶áž˜"</string>
+</resources>
diff --git a/packages/DocumentsUI/res/values-ko/strings.xml b/packages/DocumentsUI/res/values-ko/strings.xml
new file mode 100644
index 0000000..2cd0d44
--- /dev/null
+++ b/packages/DocumentsUI/res/values-ko/strings.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="2783841764617238354">"문서"</string>
+ <string name="title_open" msgid="4353228937663917801">"열기:"</string>
+ <string name="title_save" msgid="2433679664882857999">"저장 위치:"</string>
+ <string name="menu_create_dir" msgid="5947289605844398389">"í´ë” 만들기"</string>
+ <string name="menu_grid" msgid="6878021334497835259">"바둑íŒì‹ 보기"</string>
+ <string name="menu_list" msgid="7279285939892417279">"ëª©ë¡ ë³´ê¸°"</string>
+ <string name="menu_sort" msgid="7677740407158414452">"정렬 기준"</string>
+ <string name="menu_search" msgid="3816712084502856974">"검색"</string>
+ <string name="menu_settings" msgid="6008033148948428823">"설정"</string>
+ <string name="menu_open" msgid="432922957274920903">"열기"</string>
+ <string name="menu_save" msgid="2394743337684426338">"저장"</string>
+ <string name="menu_share" msgid="3075149983979628146">"공유"</string>
+ <string name="menu_delete" msgid="8138799623850614177">"삭제"</string>
+ <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g>ê°œ ì„ íƒë¨"</string>
+ <string name="sort_name" msgid="9183560467917256779">"ì´ë¦„순"</string>
+ <string name="sort_date" msgid="586080032956151448">"ìˆ˜ì •ëœ ë‚ ì§œìˆœ"</string>
+ <string name="sort_size" msgid="3350681319735474741">"í¬ê¸°ìˆœ"</string>
+ <string name="drawer_open" msgid="4545466532430226949">"루트 표시"</string>
+ <string name="drawer_close" msgid="7602734368552123318">"루트 숨기기"</string>
+ <string name="save_error" msgid="6167009778003223664">"문서 저장 실패"</string>
+ <string name="create_error" msgid="3735649141335444215">"í´ë”를 만들지 못함"</string>
+ <string name="query_error" msgid="1222448261663503501">"문서를 검색하지 못했습니다."</string>
+ <string name="root_recent" msgid="4470053704320518133">"최근"</string>
+ <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> 남ìŒ"</string>
+ <string name="root_type_service" msgid="2178854894416775409">"저장용량 서비스"</string>
+ <string name="root_type_shortcut" msgid="3318760609471618093">"바로가기"</string>
+ <string name="root_type_device" msgid="7121342474653483538">"기기"</string>
+ <string name="root_type_apps" msgid="8838065367985945189">"앱 ë”보기"</string>
+ <string name="pref_advanced_devices" msgid="903257239609301276">"고급 기기 표시"</string>
+ <string name="pref_file_size" msgid="2826879315743961459">"íŒŒì¼ í¬ê¸° 표시"</string>
+ <string name="pref_device_size" msgid="3542106883278997222">"기기 í¬ê¸° 표시"</string>
+ <string name="empty" msgid="7858882803708117596">"항목 ì—†ìŒ"</string>
+ <string name="toast_no_application" msgid="1339885974067891667">"파ì¼ì„ ì—´ 수 ì—†ìŒ"</string>
+ <string name="toast_failed_delete" msgid="2180678019407244069">"ì¼ë¶€ 문서를 삭제할 수 ì—†ìŒ"</string>
+ <string name="share_via" msgid="8966594246261344259">"공유 방법"</string>
+</resources>
diff --git a/packages/DocumentsUI/res/values-lo-rLA/strings.xml b/packages/DocumentsUI/res/values-lo-rLA/strings.xml
new file mode 100644
index 0000000..9a6f32f
--- /dev/null
+++ b/packages/DocumentsUI/res/values-lo-rLA/strings.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="2783841764617238354">"ເອ​àºàº°â€‹àºªàº²àº™"</string>
+ <string name="title_open" msgid="4353228937663917801">"ເປີດ​ຈາàº"</string>
+ <string name="title_save" msgid="2433679664882857999">"ບັນທຶàºà»„ປທີ່"</string>
+ <string name="menu_create_dir" msgid="5947289605844398389">"ສ້າງໂຟນເດີ"</string>
+ <string name="menu_grid" msgid="6878021334497835259">"ມຸມມອງà»àºšàºšàºŠà»ˆàº­àº‡"</string>
+ <string name="menu_list" msgid="7279285939892417279">"ມຸມມອງà»àºšàºšàº¥àº²àºàºŠàº·à»ˆ"</string>
+ <string name="menu_sort" msgid="7677740407158414452">"ຮຽງລຳດັບຕາມ"</string>
+ <string name="menu_search" msgid="3816712084502856974">"ຊອàºàº«àº²"</string>
+ <string name="menu_settings" msgid="6008033148948428823">"àºàº²àº™àº•ັ້ງຄ່າ"</string>
+ <string name="menu_open" msgid="432922957274920903">"ເປີດ"</string>
+ <string name="menu_save" msgid="2394743337684426338">"ບັນທຶàº"</string>
+ <string name="menu_share" msgid="3075149983979628146">"à»àºšà»ˆàº‡àº›àº±àº™"</string>
+ <string name="menu_delete" msgid="8138799623850614177">"ລຶບ"</string>
+ <string name="mode_selected_count" msgid="459111894725594625">"ເລືອàºà»àº¥à»‰àº§ <xliff:g id="COUNT">%1$d</xliff:g> ລາàºàºàº²àº™"</string>
+ <string name="sort_name" msgid="9183560467917256779">"ຕາມຊື່"</string>
+ <string name="sort_date" msgid="586080032956151448">"ຕາມວັນທີທີ່à»àºà»‰à»„ຂ"</string>
+ <string name="sort_size" msgid="3350681319735474741">"ຕາມຂະໜາດ"</string>
+ <string name="drawer_open" msgid="4545466532430226949">"ສະà»àº”ງ roots"</string>
+ <string name="drawer_close" msgid="7602734368552123318">"ເຊື່ອງ roots"</string>
+ <string name="save_error" msgid="6167009778003223664">"àºàº²àº™àºšàº±àº™àº—ຶàºà»€àº­àºàº°àºªàº²àº™àº¥àº»à»‰àº¡à»€àº«àº¥àº§"</string>
+ <string name="create_error" msgid="3735649141335444215">"àºàº²àº™â€‹àºªà»‰àº²àº‡â€‹à»‚ຟນ​ເດີລົ້ມເຫຼວ"</string>
+ <string name="query_error" msgid="1222448261663503501">"àºàº²àº™àºŠàº­àºàº«àº²à»€àº­àºàº°àºªàº²àº™àº¥àº»à»‰àº¡à»€àº«àº¼àº§"</string>
+ <string name="root_recent" msgid="4470053704320518133">"ຫາàºà»à»ƒàºŠà»‰"</string>
+ <string name="root_available_bytes" msgid="8568452858617033281">"ຟຣີ <xliff:g id="SIZE">%1$s</xliff:g>"</string>
+ <string name="root_type_service" msgid="2178854894416775409">"ບà»àº¥àº´àºàº²àº™àºšà»ˆàº­àº™àºˆàº±àº”ເàºàº±àºšàº‚à»à»‰àº¡àº¹àº™"</string>
+ <string name="root_type_shortcut" msgid="3318760609471618093">"ທາງລັດ"</string>
+ <string name="root_type_device" msgid="7121342474653483538">"ອຸປະàºàº­àº™"</string>
+ <string name="root_type_apps" msgid="8838065367985945189">"à»àº­àº±àºšàº¯àº­àº·à»ˆàº™à»†"</string>
+ <string name="pref_advanced_devices" msgid="903257239609301276">"ສະà»àº”ງອຸປະàºàº­àº™àº‚ັ້ນສູງ"</string>
+ <string name="pref_file_size" msgid="2826879315743961459">"ສະà»àº”ງຂະໜາດໄຟລ໌"</string>
+ <string name="pref_device_size" msgid="3542106883278997222">"ສະà»àº”ງຂະໜາດອຸປະàºàº­àº™"</string>
+ <string name="empty" msgid="7858882803708117596">"ບà»à»ˆàº¡àºµàº¥àº²àºàºàº²àº™"</string>
+ <string name="toast_no_application" msgid="1339885974067891667">"ບà»à»ˆàºªàº²àº¡àº”າເປີດໄຟລ໌ໄດ້"</string>
+ <string name="toast_failed_delete" msgid="2180678019407244069">"ບà»à»ˆàºªàº²àº¡àº²àº”ລຶບບາງເອàºàº°àºªàº²àº™à»„ດ້"</string>
+ <string name="share_via" msgid="8966594246261344259">"à»àºšà»ˆàº‡àº›àº±àº™àºœà»ˆàº²àº™"</string>
+</resources>
diff --git a/packages/DocumentsUI/res/values-lt/strings.xml b/packages/DocumentsUI/res/values-lt/strings.xml
new file mode 100644
index 0000000..f861b99
--- /dev/null
+++ b/packages/DocumentsUI/res/values-lt/strings.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="2783841764617238354">"Dokumentai"</string>
+ <string name="title_open" msgid="4353228937663917801">"Atidaryti iš"</string>
+ <string name="title_save" msgid="2433679664882857999">"Išsaugoti į"</string>
+ <string name="menu_create_dir" msgid="5947289605844398389">"Kurti aplankÄ…"</string>
+ <string name="menu_grid" msgid="6878021334497835259">"Tinklelio rodinys"</string>
+ <string name="menu_list" msgid="7279285939892417279">"Sąrašo rodinys"</string>
+ <string name="menu_sort" msgid="7677740407158414452">"Rūšiuoti pagal"</string>
+ <string name="menu_search" msgid="3816712084502856974">"Ieškoti"</string>
+ <string name="menu_settings" msgid="6008033148948428823">"Nustatymai"</string>
+ <string name="menu_open" msgid="432922957274920903">"Atidaryti"</string>
+ <string name="menu_save" msgid="2394743337684426338">"Išsaugoti"</string>
+ <string name="menu_share" msgid="3075149983979628146">"Bendrinti"</string>
+ <string name="menu_delete" msgid="8138799623850614177">"Ištrinti"</string>
+ <string name="mode_selected_count" msgid="459111894725594625">"Pasirinkta: <xliff:g id="COUNT">%1$d</xliff:g>"</string>
+ <string name="sort_name" msgid="9183560467917256779">"Pagal pavadinimÄ…"</string>
+ <string name="sort_date" msgid="586080032956151448">"Pagal keitimo datÄ…"</string>
+ <string name="sort_size" msgid="3350681319735474741">"Pagal dydį"</string>
+ <string name="drawer_open" msgid="4545466532430226949">"Rodyti šaknis"</string>
+ <string name="drawer_close" msgid="7602734368552123318">"Slėpti šaknis"</string>
+ <string name="save_error" msgid="6167009778003223664">"Nepavyko išsaugoti dokumento"</string>
+ <string name="create_error" msgid="3735649141335444215">"Nepavyko sukurti aplanko"</string>
+ <string name="query_error" msgid="1222448261663503501">"Nepavyko pateikti dokumentų užklausų"</string>
+ <string name="root_recent" msgid="4470053704320518133">"Naujausi"</string>
+ <string name="root_available_bytes" msgid="8568452858617033281">"Laisvos vietos: <xliff:g id="SIZE">%1$s</xliff:g>"</string>
+ <string name="root_type_service" msgid="2178854894416775409">"Saugyklos paslaugos"</string>
+ <string name="root_type_shortcut" msgid="3318760609471618093">"Spartieji klavišai"</string>
+ <string name="root_type_device" msgid="7121342474653483538">"Įrenginiai"</string>
+ <string name="root_type_apps" msgid="8838065367985945189">"Daugiau programų"</string>
+ <string name="pref_advanced_devices" msgid="903257239609301276">"Rodyti išplėstinius įrenginius"</string>
+ <string name="pref_file_size" msgid="2826879315743961459">"Rodyti failo dydį"</string>
+ <string name="pref_device_size" msgid="3542106883278997222">"Rodyti įrenginio dydį"</string>
+ <string name="empty" msgid="7858882803708117596">"Nėra elementų"</string>
+ <string name="toast_no_application" msgid="1339885974067891667">"Nepavyksta atidaryti failo"</string>
+ <string name="toast_failed_delete" msgid="2180678019407244069">"Nepavyko ištrinti kai kurių dokumentų"</string>
+ <string name="share_via" msgid="8966594246261344259">"Bendrinti naudojant"</string>
+</resources>
diff --git a/packages/DocumentsUI/res/values-lv/strings.xml b/packages/DocumentsUI/res/values-lv/strings.xml
new file mode 100644
index 0000000..651a59f
--- /dev/null
+++ b/packages/DocumentsUI/res/values-lv/strings.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="2783841764617238354">"Dokumenti"</string>
+ <string name="title_open" msgid="4353228937663917801">"Atvēršana no:"</string>
+ <string name="title_save" msgid="2433679664882857999">"SaglabÄÅ¡ana:"</string>
+ <string name="menu_create_dir" msgid="5947289605844398389">"Izveidot mapi"</string>
+ <string name="menu_grid" msgid="6878021334497835259">"Režģis"</string>
+ <string name="menu_list" msgid="7279285939892417279">"Saraksts"</string>
+ <string name="menu_sort" msgid="7677740407158414452">"KÄrtot pÄ“c"</string>
+ <string name="menu_search" msgid="3816712084502856974">"Meklēt"</string>
+ <string name="menu_settings" msgid="6008033148948428823">"Iestatījumi"</string>
+ <string name="menu_open" msgid="432922957274920903">"Atvērt"</string>
+ <string name="menu_save" msgid="2394743337684426338">"SaglabÄt"</string>
+ <string name="menu_share" msgid="3075149983979628146">"Kopīgot"</string>
+ <string name="menu_delete" msgid="8138799623850614177">"Dzēst"</string>
+ <string name="mode_selected_count" msgid="459111894725594625">"Atlasīts: <xliff:g id="COUNT">%1$d</xliff:g>"</string>
+ <string name="sort_name" msgid="9183560467917256779">"Pēc nosaukuma"</string>
+ <string name="sort_date" msgid="586080032956151448">"PÄ“c pÄrveidoÅ¡anas datuma"</string>
+ <string name="sort_size" msgid="3350681319735474741">"Pēc lieluma"</string>
+ <string name="drawer_open" msgid="4545466532430226949">"RÄdÄ«t saknes"</string>
+ <string name="drawer_close" msgid="7602734368552123318">"Slēpt saknes"</string>
+ <string name="save_error" msgid="6167009778003223664">"NeizdevÄs saglabÄt dokumentu."</string>
+ <string name="create_error" msgid="3735649141335444215">"NeizdevÄs izveidot mapi."</string>
+ <string name="query_error" msgid="1222448261663503501">"NeizdevÄs atrast vaicÄjumÄ norÄdÄ«tos dokumentus."</string>
+ <string name="root_recent" msgid="4470053704320518133">"Pēdējie"</string>
+ <string name="root_available_bytes" msgid="8568452858617033281">"Brīva vieta: <xliff:g id="SIZE">%1$s</xliff:g>"</string>
+ <string name="root_type_service" msgid="2178854894416775409">"GlabÄÅ¡anas pakalpojumi"</string>
+ <string name="root_type_shortcut" msgid="3318760609471618093">"Saīsnes"</string>
+ <string name="root_type_device" msgid="7121342474653483538">"Ierīces"</string>
+ <string name="root_type_apps" msgid="8838065367985945189">"VairÄk lietotņu"</string>
+ <string name="pref_advanced_devices" msgid="903257239609301276">"Attēlot papildu ierīces"</string>
+ <string name="pref_file_size" msgid="2826879315743961459">"Attēlot faila lielumu"</string>
+ <string name="pref_device_size" msgid="3542106883278997222">"Attēlot ierīces izmēru"</string>
+ <string name="empty" msgid="7858882803708117596">"Nav vienumu"</string>
+ <string name="toast_no_application" msgid="1339885974067891667">"Nevar atvērt failu."</string>
+ <string name="toast_failed_delete" msgid="2180678019407244069">"Nevar dzēst dažus dokumentus."</string>
+ <string name="share_via" msgid="8966594246261344259">"Kopīgot, izmantojot"</string>
+</resources>
diff --git a/packages/DocumentsUI/res/values-mn-rMN/strings.xml b/packages/DocumentsUI/res/values-mn-rMN/strings.xml
new file mode 100644
index 0000000..22c9fcd
--- /dev/null
+++ b/packages/DocumentsUI/res/values-mn-rMN/strings.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="2783841764617238354">"Документүүд"</string>
+ <string name="title_open" msgid="4353228937663917801">"ÐÑÑÑ…"</string>
+ <string name="title_save" msgid="2433679664882857999">"Хадгалах"</string>
+ <string name="menu_create_dir" msgid="5947289605844398389">"Фолдер Ò¯Ò¯ÑгÑÑ…"</string>
+ <string name="menu_grid" msgid="6878021334497835259">"Эгнүүлж харах"</string>
+ <string name="menu_list" msgid="7279285939892417279">"ЖагÑааж харах"</string>
+ <string name="menu_sort" msgid="7677740407158414452">"ЭрÑмбÑлÑÑ…"</string>
+ <string name="menu_search" msgid="3816712084502856974">"Хайх"</string>
+ <string name="menu_settings" msgid="6008033148948428823">"Тохиргоо"</string>
+ <string name="menu_open" msgid="432922957274920903">"ÐÑÑÑ…"</string>
+ <string name="menu_save" msgid="2394743337684426338">"Хадгалах"</string>
+ <string name="menu_share" msgid="3075149983979628146">"Хуваалцах"</string>
+ <string name="menu_delete" msgid="8138799623850614177">"УÑтгах"</string>
+ <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> ÑонгогдÑон"</string>
+ <string name="sort_name" msgid="9183560467917256779">"ÐÑÑ€ÑÑÑ€"</string>
+ <string name="sort_date" msgid="586080032956151448">"ӨөрчлөгдÑөн огноогоор"</string>
+ <string name="sort_size" msgid="3350681319735474741">"Ð¥ÑмжÑÑгÑÑÑ€"</string>
+ <string name="drawer_open" msgid="4545466532430226949">"Язгуурыг харуулах"</string>
+ <string name="drawer_close" msgid="7602734368552123318">"Язгуурыг нууцлах"</string>
+ <string name="save_error" msgid="6167009778003223664">"Документыг хадгалж чадÑангүй"</string>
+ <string name="create_error" msgid="3735649141335444215">"Фолдер Ò¯Ò¯ÑгÑж чадÑангүй"</string>
+ <string name="query_error" msgid="1222448261663503501">"Документын Ñ…Ò¯ÑÑлт гаргаж чадÑангүй"</string>
+ <string name="root_recent" msgid="4470053704320518133">"СаÑхны"</string>
+ <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> чөлөөтÑй"</string>
+ <string name="root_type_service" msgid="2178854894416775409">"Сангийн үйлчилгÑÑ"</string>
+ <string name="root_type_shortcut" msgid="3318760609471618093">"Товчлол"</string>
+ <string name="root_type_device" msgid="7121342474653483538">"Төхөөрөмжүүд"</string>
+ <string name="root_type_apps" msgid="8838065367985945189">"Өөр апп-ууд"</string>
+ <string name="pref_advanced_devices" msgid="903257239609301276">"ДÑвшилтÑÑ‚ төхөөрөмжүүдийг харуулах"</string>
+ <string name="pref_file_size" msgid="2826879315743961459">"Файлын Ñ…ÑмжÑÑг харуулах"</string>
+ <string name="pref_device_size" msgid="3542106883278997222">"Төхөөрөмжийн Ñ…ÑмжÑÑг харуулах"</string>
+ <string name="empty" msgid="7858882803708117596">"ХооÑон"</string>
+ <string name="toast_no_application" msgid="1339885974067891667">"Файлыг нÑÑÑ… боломжгүй"</string>
+ <string name="toast_failed_delete" msgid="2180678019407244069">"Зарим документуудыг уÑтгах боломжгүй"</string>
+ <string name="share_via" msgid="8966594246261344259">"Дараахаар дамжуулан хуваалцах"</string>
+</resources>
diff --git a/packages/DocumentsUI/res/values-mn/strings.xml b/packages/DocumentsUI/res/values-mn/strings.xml
new file mode 100644
index 0000000..66637b8
--- /dev/null
+++ b/packages/DocumentsUI/res/values-mn/strings.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="2783841764617238354">"Документүүд"</string>
+ <string name="title_open" msgid="4353228937663917801">"ÐÑÑÑ…"</string>
+ <string name="title_save" msgid="2433679664882857999">"Хадгалах"</string>
+ <string name="menu_create_dir" msgid="5947289605844398389">"Фолдер Ò¯Ò¯ÑгÑÑ…"</string>
+ <string name="menu_grid" msgid="6878021334497835259">"Эгнүүлж харах"</string>
+ <string name="menu_list" msgid="7279285939892417279">"ЖагÑааж харах"</string>
+ <string name="menu_sort" msgid="7677740407158414452">"ЭрÑмбÑлÑÑ…"</string>
+ <string name="menu_search" msgid="3816712084502856974">"Хайх"</string>
+ <string name="menu_settings" msgid="6008033148948428823">"Тохиргоо"</string>
+ <string name="menu_open" msgid="432922957274920903">"ÐÑÑÑ…"</string>
+ <string name="menu_save" msgid="2394743337684426338">"Хадгалах"</string>
+ <string name="menu_share" msgid="3075149983979628146">"Хуваалцах"</string>
+ <string name="menu_delete" msgid="8138799623850614177">"УÑтгах"</string>
+ <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> ÑонгогдÑон"</string>
+ <string name="sort_name" msgid="9183560467917256779">"ÐÑÑ€ÑÑÑ€"</string>
+ <string name="sort_date" msgid="586080032956151448">"ӨөрчлөгдÑөн огноогоор"</string>
+ <string name="sort_size" msgid="3350681319735474741">"Ð¥ÑмжÑÑгÑÑÑ€"</string>
+ <string name="drawer_open" msgid="4545466532430226949">"Язгуурыг харуулах"</string>
+ <string name="drawer_close" msgid="7602734368552123318">"Язгуурыг нууцлах"</string>
+ <string name="save_error" msgid="6167009778003223664">"Документыг хадгалж чадÑангүй"</string>
+ <string name="root_recent" msgid="4470053704320518133">"СаÑхны"</string>
+ <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> чөлөөтÑй"</string>
+ <string name="root_type_service" msgid="2857362700576006694">"ҮйлчилгÑÑнүүд"</string>
+ <string name="root_type_shortcut" msgid="3318760609471618093">"Товчлол"</string>
+ <string name="root_type_device" msgid="7121342474653483538">"Төхөөрөмжүүд"</string>
+ <string name="root_type_apps" msgid="8838065367985945189">"Өөр апп-ууд"</string>
+ <string name="pref_advanced_devices" msgid="903257239609301276">"ДÑвшилтÑÑ‚ төхөөрөмжүүдийг харуулах"</string>
+ <string name="pref_file_size" msgid="2826879315743961459">"Файлын Ñ…ÑмжÑÑг харуулах"</string>
+ <string name="pref_device_size" msgid="3542106883278997222">"Төхөөрөмжийн Ñ…ÑмжÑÑг харуулах"</string>
+ <string name="empty" msgid="7858882803708117596">"ХооÑон"</string>
+ <string name="toast_no_application" msgid="1339885974067891667">"Файлыг нÑÑÑ… боломжгүй"</string>
+ <string name="toast_failed_delete" msgid="2180678019407244069">"Зарим документуудыг уÑтгах боломжгүй"</string>
+ <string name="more" msgid="7117420986529297171">"Цааш"</string>
+ <string name="loading" msgid="7933681260296021180">"Ðчааллаж байна..."</string>
+</resources>
diff --git a/packages/DocumentsUI/res/values-ms-rMY/strings.xml b/packages/DocumentsUI/res/values-ms-rMY/strings.xml
new file mode 100644
index 0000000..7e09c57
--- /dev/null
+++ b/packages/DocumentsUI/res/values-ms-rMY/strings.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="2783841764617238354">"Dokumen"</string>
+ <string name="title_open" msgid="4353228937663917801">"Buka dari"</string>
+ <string name="title_save" msgid="2433679664882857999">"Simpan ke"</string>
+ <string name="menu_create_dir" msgid="5947289605844398389">"Buat folder"</string>
+ <string name="menu_grid" msgid="6878021334497835259">"Paparan grid"</string>
+ <string name="menu_list" msgid="7279285939892417279">"Paparan senarai"</string>
+ <string name="menu_sort" msgid="7677740407158414452">"Isih mengikut"</string>
+ <string name="menu_search" msgid="3816712084502856974">"Cari"</string>
+ <string name="menu_settings" msgid="6008033148948428823">"Tetapan"</string>
+ <string name="menu_open" msgid="432922957274920903">"Buka"</string>
+ <string name="menu_save" msgid="2394743337684426338">"Simpan"</string>
+ <string name="menu_share" msgid="3075149983979628146">"Kongsi"</string>
+ <string name="menu_delete" msgid="8138799623850614177">"Padam"</string>
+ <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> dipilih"</string>
+ <string name="sort_name" msgid="9183560467917256779">"Mengikut nama"</string>
+ <string name="sort_date" msgid="586080032956151448">"Diubah suai mengikut tarikh"</string>
+ <string name="sort_size" msgid="3350681319735474741">"Mengikut saiz"</string>
+ <string name="drawer_open" msgid="4545466532430226949">"Tunjukkan akar"</string>
+ <string name="drawer_close" msgid="7602734368552123318">"Sembunyikan akar"</string>
+ <string name="save_error" msgid="6167009778003223664">"Gagal menyimpan dokumen"</string>
+ <string name="create_error" msgid="3735649141335444215">"Gagal membuat folder"</string>
+ <string name="query_error" msgid="1222448261663503501">"Gagal menanyakan dokumen"</string>
+ <string name="root_recent" msgid="4470053704320518133">"Terbaharu"</string>
+ <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> kosong"</string>
+ <string name="root_type_service" msgid="2178854894416775409">"Perkhidmatan storan"</string>
+ <string name="root_type_shortcut" msgid="3318760609471618093">"Pintasan"</string>
+ <string name="root_type_device" msgid="7121342474653483538">"Peranti"</string>
+ <string name="root_type_apps" msgid="8838065367985945189">"Lebih banyak apl"</string>
+ <string name="pref_advanced_devices" msgid="903257239609301276">"Paparkan peranti terperinci"</string>
+ <string name="pref_file_size" msgid="2826879315743961459">"Paparkan saiz fail"</string>
+ <string name="pref_device_size" msgid="3542106883278997222">"Paparkan saiz peranti"</string>
+ <string name="empty" msgid="7858882803708117596">"Tiada item"</string>
+ <string name="toast_no_application" msgid="1339885974067891667">"Tidak dapat membuka fail"</string>
+ <string name="toast_failed_delete" msgid="2180678019407244069">"Tidak dapat memadam beberapa dokumen"</string>
+ <string name="share_via" msgid="8966594246261344259">"Kongsi melalui"</string>
+</resources>
diff --git a/packages/DocumentsUI/res/values-nb/strings.xml b/packages/DocumentsUI/res/values-nb/strings.xml
new file mode 100644
index 0000000..8831bd8
--- /dev/null
+++ b/packages/DocumentsUI/res/values-nb/strings.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="2783841764617238354">"Dokumenter"</string>
+ <string name="title_open" msgid="4353228937663917801">"Ã…pne fra"</string>
+ <string name="title_save" msgid="2433679664882857999">"Lagre i"</string>
+ <string name="menu_create_dir" msgid="5947289605844398389">"Opprett en mappe"</string>
+ <string name="menu_grid" msgid="6878021334497835259">"Rutenettvisning"</string>
+ <string name="menu_list" msgid="7279285939892417279">"Listevisning"</string>
+ <string name="menu_sort" msgid="7677740407158414452">"Sortér etter"</string>
+ <string name="menu_search" msgid="3816712084502856974">"Søk"</string>
+ <string name="menu_settings" msgid="6008033148948428823">"Innstillinger"</string>
+ <string name="menu_open" msgid="432922957274920903">"Ã…pne"</string>
+ <string name="menu_save" msgid="2394743337684426338">"Lagre"</string>
+ <string name="menu_share" msgid="3075149983979628146">"Del"</string>
+ <string name="menu_delete" msgid="8138799623850614177">"Slett"</string>
+ <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> valgt"</string>
+ <string name="sort_name" msgid="9183560467917256779">"Etter navn"</string>
+ <string name="sort_date" msgid="586080032956151448">"«Etter dato» endret"</string>
+ <string name="sort_size" msgid="3350681319735474741">"Etter størrelse"</string>
+ <string name="drawer_open" msgid="4545466532430226949">"Vis røtter"</string>
+ <string name="drawer_close" msgid="7602734368552123318">"Skjul røtter"</string>
+ <string name="save_error" msgid="6167009778003223664">"Kunne ikke lagre dokumentet"</string>
+ <string name="create_error" msgid="3735649141335444215">"Kunne ikke opprette mappen"</string>
+ <string name="query_error" msgid="1222448261663503501">"Kunne ikke undersøke dokumenter"</string>
+ <string name="root_recent" msgid="4470053704320518133">"Siste"</string>
+ <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> gratis"</string>
+ <string name="root_type_service" msgid="2178854894416775409">"Lagringstjenester"</string>
+ <string name="root_type_shortcut" msgid="3318760609471618093">"Snarveier"</string>
+ <string name="root_type_device" msgid="7121342474653483538">"Enheter"</string>
+ <string name="root_type_apps" msgid="8838065367985945189">"Flere apper"</string>
+ <string name="pref_advanced_devices" msgid="903257239609301276">"Vis avanserte enheter"</string>
+ <string name="pref_file_size" msgid="2826879315743961459">"Vis filstørrelse"</string>
+ <string name="pref_device_size" msgid="3542106883278997222">"Vis enhetsstørrelse"</string>
+ <string name="empty" msgid="7858882803708117596">"Ingen elementer"</string>
+ <string name="toast_no_application" msgid="1339885974067891667">"Kan ikke åpne filen"</string>
+ <string name="toast_failed_delete" msgid="2180678019407244069">"Enkelte dokumenter kunne ikke slettes"</string>
+ <string name="share_via" msgid="8966594246261344259">"Del via"</string>
+</resources>
diff --git a/packages/DocumentsUI/res/values-ne-rNP/strings.xml b/packages/DocumentsUI/res/values-ne-rNP/strings.xml
new file mode 100644
index 0000000..d2606df
--- /dev/null
+++ b/packages/DocumentsUI/res/values-ne-rNP/strings.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="2783841764617238354">"कागजातहरू"</string>
+ <string name="title_open" msgid="4353228937663917801">"यसबाट खोलà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="title_save" msgid="2433679664882857999">"यसमा सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="menu_create_dir" msgid="5947289605844398389">"फोलà¥à¤¡à¤° सिरà¥à¤œà¤¨à¤¾ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="menu_grid" msgid="6878021334497835259">"गà¥à¤°à¤¿à¤¡ दृशà¥à¤¯"</string>
+ <string name="menu_list" msgid="7279285939892417279">"सूची दृशà¥à¤¯"</string>
+ <string name="menu_sort" msgid="7677740407158414452">"यसदà¥à¤µà¤¾à¤°à¤¾ कà¥à¤°à¤®à¤µà¤¦à¥à¤˜ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="menu_search" msgid="3816712084502856974">"खोजà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="menu_settings" msgid="6008033148948428823">"सेटिङहरू"</string>
+ <string name="menu_open" msgid="432922957274920903">"खोलà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="menu_save" msgid="2394743337684426338">"सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="menu_share" msgid="3075149983979628146">"साà¤à¥‡à¤¦à¤¾à¤°à¥€ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="menu_delete" msgid="8138799623850614177">"मेटाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> चयन गरियो"</string>
+ <string name="sort_name" msgid="9183560467917256779">"नाम अनà¥à¤¸à¤¾à¤°"</string>
+ <string name="sort_date" msgid="586080032956151448">"परिमारà¥à¤œà¤¿à¤¤ मिति अनà¥à¤¸à¤¾à¤°"</string>
+ <string name="sort_size" msgid="3350681319735474741">"आकार अनà¥à¤¸à¤¾à¤°"</string>
+ <string name="drawer_open" msgid="4545466532430226949">"मूलहरू देखाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="drawer_close" msgid="7602734368552123318">"मूलहरू लà¥à¤•ाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="save_error" msgid="6167009778003223664">"कागजात सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ गरà¥à¤¨ विफल भयो"</string>
+ <string name="root_recent" msgid="4470053704320518133">"हालैको"</string>
+ <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> खाली"</string>
+ <!-- no translation found for root_type_service (2178854894416775409) -->
+ <skip />
+ <string name="root_type_shortcut" msgid="3318760609471618093">"सरà¥à¤Ÿà¤•टहरू"</string>
+ <string name="root_type_device" msgid="7121342474653483538">"उपकरणहरू"</string>
+ <string name="root_type_apps" msgid="8838065367985945189">"थप अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरू"</string>
+ <string name="pref_advanced_devices" msgid="903257239609301276">"उनà¥à¤¨à¤¤ उपकरणहरू पà¥à¤°à¤¦à¤°à¥à¤¶à¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="pref_file_size" msgid="2826879315743961459">"फाइल आकार पà¥à¤°à¤¦à¤°à¥à¤¶à¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="pref_device_size" msgid="3542106883278997222">"उपकरण आकार पà¥à¤°à¤¦à¤°à¥à¤¶à¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="empty" msgid="7858882803708117596">"कà¥à¤¨à¥ˆ वसà¥à¤¤à¥ छैन।"</string>
+ <string name="toast_no_application" msgid="1339885974067891667">"फाइल खोलà¥à¤¨ सकà¥à¤¦à¥ˆà¤¨"</string>
+ <string name="toast_failed_delete" msgid="2180678019407244069">"केही कागजातहरू मेटà¥à¤¨ असमरà¥à¤¥ छ"</string>
+ <string name="share_via" msgid="8966594246261344259">"माधà¥à¤¯à¤®à¤¬à¤¾à¤Ÿ साà¤à¥‡à¤¦à¤¾à¤°à¥€ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+</resources>
diff --git a/packages/DocumentsUI/res/values-nl/strings.xml b/packages/DocumentsUI/res/values-nl/strings.xml
new file mode 100644
index 0000000..08862e8
--- /dev/null
+++ b/packages/DocumentsUI/res/values-nl/strings.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="2783841764617238354">"Documenten"</string>
+ <string name="title_open" msgid="4353228937663917801">"Openen vanuit"</string>
+ <string name="title_save" msgid="2433679664882857999">"Opslaan in"</string>
+ <string name="menu_create_dir" msgid="5947289605844398389">"Map maken"</string>
+ <string name="menu_grid" msgid="6878021334497835259">"Rasterweergave"</string>
+ <string name="menu_list" msgid="7279285939892417279">"Lijstweergave"</string>
+ <string name="menu_sort" msgid="7677740407158414452">"Sorteren op"</string>
+ <string name="menu_search" msgid="3816712084502856974">"Zoeken"</string>
+ <string name="menu_settings" msgid="6008033148948428823">"Instellingen"</string>
+ <string name="menu_open" msgid="432922957274920903">"Openen"</string>
+ <string name="menu_save" msgid="2394743337684426338">"Opslaan"</string>
+ <string name="menu_share" msgid="3075149983979628146">"Delen"</string>
+ <string name="menu_delete" msgid="8138799623850614177">"Verwijderen"</string>
+ <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> geselecteerd"</string>
+ <string name="sort_name" msgid="9183560467917256779">"Op naam"</string>
+ <string name="sort_date" msgid="586080032956151448">"Op aanpassingsdatum"</string>
+ <string name="sort_size" msgid="3350681319735474741">"Op grootte"</string>
+ <string name="drawer_open" msgid="4545466532430226949">"Roots weergeven"</string>
+ <string name="drawer_close" msgid="7602734368552123318">"Roots verbergen"</string>
+ <string name="save_error" msgid="6167009778003223664">"Kan document niet opslaan"</string>
+ <string name="create_error" msgid="3735649141335444215">"Kan map niet maken"</string>
+ <string name="query_error" msgid="1222448261663503501">"Kan geen query\'s voor documenten verzenden"</string>
+ <string name="root_recent" msgid="4470053704320518133">"Recent"</string>
+ <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> vrij"</string>
+ <string name="root_type_service" msgid="2178854894416775409">"Opslagservices"</string>
+ <string name="root_type_shortcut" msgid="3318760609471618093">"Sneltoetsen"</string>
+ <string name="root_type_device" msgid="7121342474653483538">"Apparaten"</string>
+ <string name="root_type_apps" msgid="8838065367985945189">"Meer apps"</string>
+ <string name="pref_advanced_devices" msgid="903257239609301276">"Geavanceerde apparaten weergeven"</string>
+ <string name="pref_file_size" msgid="2826879315743961459">"Bestandsgrootte weergeven"</string>
+ <string name="pref_device_size" msgid="3542106883278997222">"Apparaatgrootte weergeven"</string>
+ <string name="empty" msgid="7858882803708117596">"Geen items"</string>
+ <string name="toast_no_application" msgid="1339885974067891667">"Kan bestand niet openen"</string>
+ <string name="toast_failed_delete" msgid="2180678019407244069">"Kan bepaalde documenten niet verwijderen"</string>
+ <string name="share_via" msgid="8966594246261344259">"Delen via"</string>
+</resources>
diff --git a/packages/DocumentsUI/res/values-pl/strings.xml b/packages/DocumentsUI/res/values-pl/strings.xml
new file mode 100644
index 0000000..f4e5582
--- /dev/null
+++ b/packages/DocumentsUI/res/values-pl/strings.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="2783841764617238354">"Dokumenty"</string>
+ <string name="title_open" msgid="4353228937663917801">"Otwórz z"</string>
+ <string name="title_save" msgid="2433679664882857999">"Zapisz w"</string>
+ <string name="menu_create_dir" msgid="5947289605844398389">"Utwórz folder"</string>
+ <string name="menu_grid" msgid="6878021334497835259">"Widok siatki"</string>
+ <string name="menu_list" msgid="7279285939892417279">"Widok listy"</string>
+ <string name="menu_sort" msgid="7677740407158414452">"Sortuj według"</string>
+ <string name="menu_search" msgid="3816712084502856974">"Szukaj"</string>
+ <string name="menu_settings" msgid="6008033148948428823">"Ustawienia"</string>
+ <string name="menu_open" msgid="432922957274920903">"Otwórz"</string>
+ <string name="menu_save" msgid="2394743337684426338">"Zapisz"</string>
+ <string name="menu_share" msgid="3075149983979628146">"Udostępnij"</string>
+ <string name="menu_delete" msgid="8138799623850614177">"Usuń"</string>
+ <string name="mode_selected_count" msgid="459111894725594625">"Wybrano: <xliff:g id="COUNT">%1$d</xliff:g>"</string>
+ <string name="sort_name" msgid="9183560467917256779">"Według nazwy"</string>
+ <string name="sort_date" msgid="586080032956151448">"Według daty edycji"</string>
+ <string name="sort_size" msgid="3350681319735474741">"Według rozmiaru"</string>
+ <string name="drawer_open" msgid="4545466532430226949">"Pokaż elementy główne"</string>
+ <string name="drawer_close" msgid="7602734368552123318">"Ukryj elementy główne"</string>
+ <string name="save_error" msgid="6167009778003223664">"Nie udało się zapisać dokumentu"</string>
+ <string name="create_error" msgid="3735649141335444215">"Nie udało się utworzyć folderu"</string>
+ <string name="query_error" msgid="1222448261663503501">"Nie udało się pobrać listy dokumentów"</string>
+ <string name="root_recent" msgid="4470053704320518133">"Ostatnie"</string>
+ <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> wolne"</string>
+ <string name="root_type_service" msgid="2178854894416775409">"Usługi pamięci masowej"</string>
+ <string name="root_type_shortcut" msgid="3318760609471618093">"Skróty"</string>
+ <string name="root_type_device" msgid="7121342474653483538">"UrzÄ…dzenia"</string>
+ <string name="root_type_apps" msgid="8838065367985945189">"Więcej aplikacji"</string>
+ <string name="pref_advanced_devices" msgid="903257239609301276">"Wyświetl urządzenia zaawansowane"</string>
+ <string name="pref_file_size" msgid="2826879315743961459">"Wyświetl rozmiar pliku"</string>
+ <string name="pref_device_size" msgid="3542106883278997222">"Wyświetl rozmiar urządzenia"</string>
+ <string name="empty" msgid="7858882803708117596">"Brak elementów"</string>
+ <string name="toast_no_application" msgid="1339885974067891667">"Nie można otworzyć pliku"</string>
+ <string name="toast_failed_delete" msgid="2180678019407244069">"Nie można usunąć niektórych dokumentów"</string>
+ <string name="share_via" msgid="8966594246261344259">"Udostępnij przez"</string>
+</resources>
diff --git a/packages/DocumentsUI/res/values-pt-rPT/strings.xml b/packages/DocumentsUI/res/values-pt-rPT/strings.xml
new file mode 100644
index 0000000..1c1ba8b
--- /dev/null
+++ b/packages/DocumentsUI/res/values-pt-rPT/strings.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="2783841764617238354">"Documentos"</string>
+ <string name="title_open" msgid="4353228937663917801">"Abrir de"</string>
+ <string name="title_save" msgid="2433679664882857999">"Guardar em"</string>
+ <string name="menu_create_dir" msgid="5947289605844398389">"Criar pasta"</string>
+ <string name="menu_grid" msgid="6878021334497835259">"Vista de grelha"</string>
+ <string name="menu_list" msgid="7279285939892417279">"Vista de lista"</string>
+ <string name="menu_sort" msgid="7677740407158414452">"Ordenar por"</string>
+ <string name="menu_search" msgid="3816712084502856974">"Pesquisar"</string>
+ <string name="menu_settings" msgid="6008033148948428823">"Definições"</string>
+ <string name="menu_open" msgid="432922957274920903">"Abrir"</string>
+ <string name="menu_save" msgid="2394743337684426338">"Guardar"</string>
+ <string name="menu_share" msgid="3075149983979628146">"Partilhar"</string>
+ <string name="menu_delete" msgid="8138799623850614177">"Eliminar"</string>
+ <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> selecionado(s)"</string>
+ <string name="sort_name" msgid="9183560467917256779">"Por nome"</string>
+ <string name="sort_date" msgid="586080032956151448">"Por data de modificação"</string>
+ <string name="sort_size" msgid="3350681319735474741">"Por tamanho"</string>
+ <string name="drawer_open" msgid="4545466532430226949">"Mostrar raízes"</string>
+ <string name="drawer_close" msgid="7602734368552123318">"Ocultar raízes"</string>
+ <string name="save_error" msgid="6167009778003223664">"Falha ao guardar o documento"</string>
+ <string name="create_error" msgid="3735649141335444215">"Falha ao criar a pasta"</string>
+ <string name="query_error" msgid="1222448261663503501">"Falha ao consultar os documentos"</string>
+ <string name="root_recent" msgid="4470053704320518133">"Recentes"</string>
+ <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> espaço livre"</string>
+ <string name="root_type_service" msgid="2178854894416775409">"Serv. de armazenamento"</string>
+ <string name="root_type_shortcut" msgid="3318760609471618093">"Atalhos"</string>
+ <string name="root_type_device" msgid="7121342474653483538">"Dispositivos"</string>
+ <string name="root_type_apps" msgid="8838065367985945189">"Mais aplicações"</string>
+ <string name="pref_advanced_devices" msgid="903257239609301276">"Apresentar dispositivos avançados"</string>
+ <string name="pref_file_size" msgid="2826879315743961459">"Apresentar tamanho do ficheiro"</string>
+ <string name="pref_device_size" msgid="3542106883278997222">"Apresentar tamanho do dispositivo"</string>
+ <string name="empty" msgid="7858882803708117596">"Sem itens"</string>
+ <string name="toast_no_application" msgid="1339885974067891667">"Não é possível abrir o ficheiro"</string>
+ <string name="toast_failed_delete" msgid="2180678019407244069">"Não é possível eliminar alguns documentos"</string>
+ <string name="share_via" msgid="8966594246261344259">"Partilhar através de"</string>
+</resources>
diff --git a/packages/DocumentsUI/res/values-pt/strings.xml b/packages/DocumentsUI/res/values-pt/strings.xml
new file mode 100644
index 0000000..78fcaf8
--- /dev/null
+++ b/packages/DocumentsUI/res/values-pt/strings.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="2783841764617238354">"Documentos"</string>
+ <string name="title_open" msgid="4353228937663917801">"Abrir de"</string>
+ <string name="title_save" msgid="2433679664882857999">"Salvar em"</string>
+ <string name="menu_create_dir" msgid="5947289605844398389">"Criar pasta"</string>
+ <string name="menu_grid" msgid="6878021334497835259">"Visualização em grade"</string>
+ <string name="menu_list" msgid="7279285939892417279">"Visualização em lista"</string>
+ <string name="menu_sort" msgid="7677740407158414452">"Classificar por"</string>
+ <string name="menu_search" msgid="3816712084502856974">"Pesquisar"</string>
+ <string name="menu_settings" msgid="6008033148948428823">"Configurações"</string>
+ <string name="menu_open" msgid="432922957274920903">"Abrir"</string>
+ <string name="menu_save" msgid="2394743337684426338">"Salvar"</string>
+ <string name="menu_share" msgid="3075149983979628146">"Compartilhar"</string>
+ <string name="menu_delete" msgid="8138799623850614177">"Excluir"</string>
+ <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> selecionados"</string>
+ <string name="sort_name" msgid="9183560467917256779">"Por nome"</string>
+ <string name="sort_date" msgid="586080032956151448">"Por data de modificação"</string>
+ <string name="sort_size" msgid="3350681319735474741">"Por tamanho"</string>
+ <string name="drawer_open" msgid="4545466532430226949">"Mostrar raízes"</string>
+ <string name="drawer_close" msgid="7602734368552123318">"Ocultar raízes"</string>
+ <string name="save_error" msgid="6167009778003223664">"Falha ao salvar o documento"</string>
+ <string name="create_error" msgid="3735649141335444215">"Falha ao criar a pasta"</string>
+ <string name="query_error" msgid="1222448261663503501">"Falha ao consultar documentos"</string>
+ <string name="root_recent" msgid="4470053704320518133">"Recentes"</string>
+ <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> livres"</string>
+ <string name="root_type_service" msgid="2178854894416775409">"Serviços de armazenamento"</string>
+ <string name="root_type_shortcut" msgid="3318760609471618093">"Atalhos"</string>
+ <string name="root_type_device" msgid="7121342474653483538">"Dispositivos"</string>
+ <string name="root_type_apps" msgid="8838065367985945189">"Mais aplicativos"</string>
+ <string name="pref_advanced_devices" msgid="903257239609301276">"Mostrar dispositivos avançados"</string>
+ <string name="pref_file_size" msgid="2826879315743961459">"Mostrar tamanho do arquivo"</string>
+ <string name="pref_device_size" msgid="3542106883278997222">"Mostrar tamanho do dispositivo"</string>
+ <string name="empty" msgid="7858882803708117596">"Nenhum item"</string>
+ <string name="toast_no_application" msgid="1339885974067891667">"Não é possível abrir o arquivo"</string>
+ <string name="toast_failed_delete" msgid="2180678019407244069">"Não foi possível excluir alguns documentos"</string>
+ <string name="share_via" msgid="8966594246261344259">"Compartilhar via"</string>
+</resources>
diff --git a/packages/DocumentsUI/res/values-ro/strings.xml b/packages/DocumentsUI/res/values-ro/strings.xml
new file mode 100644
index 0000000..5fd44c8
--- /dev/null
+++ b/packages/DocumentsUI/res/values-ro/strings.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="2783841764617238354">"Documente"</string>
+ <string name="title_open" msgid="4353228937663917801">"Deschideți din"</string>
+ <string name="title_save" msgid="2433679664882857999">"Salvați în"</string>
+ <string name="menu_create_dir" msgid="5947289605844398389">"Creați un dosar"</string>
+ <string name="menu_grid" msgid="6878021334497835259">"Afișare tip grilă"</string>
+ <string name="menu_list" msgid="7279285939892417279">"Afișare tip listă"</string>
+ <string name="menu_sort" msgid="7677740407158414452">"Sortați după"</string>
+ <string name="menu_search" msgid="3816712084502856974">"Căutați"</string>
+ <string name="menu_settings" msgid="6008033148948428823">"Setări"</string>
+ <string name="menu_open" msgid="432922957274920903">"Deschideți"</string>
+ <string name="menu_save" msgid="2394743337684426338">"Salvați"</string>
+ <string name="menu_share" msgid="3075149983979628146">"Distribuiți"</string>
+ <string name="menu_delete" msgid="8138799623850614177">"Ștergeți"</string>
+ <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> selectate"</string>
+ <string name="sort_name" msgid="9183560467917256779">"După nume"</string>
+ <string name="sort_date" msgid="586080032956151448">"După data modificării"</string>
+ <string name="sort_size" msgid="3350681319735474741">"După dimensiune"</string>
+ <string name="drawer_open" msgid="4545466532430226949">"Afișați directoarele rădăcină"</string>
+ <string name="drawer_close" msgid="7602734368552123318">"Ascundeți directoarele rădăcină"</string>
+ <string name="save_error" msgid="6167009778003223664">"Salvarea documentului nu a reușit"</string>
+ <string name="create_error" msgid="3735649141335444215">"Eroare la crearea dosarului"</string>
+ <string name="query_error" msgid="1222448261663503501">"Interogarea referitoare la documente nu a reușit"</string>
+ <string name="root_recent" msgid="4470053704320518133">"Recente"</string>
+ <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> spațiu liber"</string>
+ <string name="root_type_service" msgid="2178854894416775409">"Servicii de stocare"</string>
+ <string name="root_type_shortcut" msgid="3318760609471618093">"Comenzi rapide"</string>
+ <string name="root_type_device" msgid="7121342474653483538">"Dispozitive"</string>
+ <string name="root_type_apps" msgid="8838065367985945189">"Alte aplicații"</string>
+ <string name="pref_advanced_devices" msgid="903257239609301276">"Afișați dispozitive avansate"</string>
+ <string name="pref_file_size" msgid="2826879315743961459">"Afișați dimensiunile fișierelor"</string>
+ <string name="pref_device_size" msgid="3542106883278997222">"Afișați capacitatea de stocare a dispozitivelor"</string>
+ <string name="empty" msgid="7858882803708117596">"Nu există elemente"</string>
+ <string name="toast_no_application" msgid="1339885974067891667">"Fișierul nu poate fi deschis"</string>
+ <string name="toast_failed_delete" msgid="2180678019407244069">"Unele documente nu au putut fi șterse"</string>
+ <string name="share_via" msgid="8966594246261344259">"Distribuiți prin"</string>
+</resources>
diff --git a/packages/DocumentsUI/res/values-ru/strings.xml b/packages/DocumentsUI/res/values-ru/strings.xml
new file mode 100644
index 0000000..85fd70e
--- /dev/null
+++ b/packages/DocumentsUI/res/values-ru/strings.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="2783841764617238354">"Документы"</string>
+ <string name="title_open" msgid="4353228937663917801">"Открыть"</string>
+ <string name="title_save" msgid="2433679664882857999">"Сохранить"</string>
+ <string name="menu_create_dir" msgid="5947289605844398389">"ÐÐ¾Ð²Ð°Ñ Ð¿Ð°Ð¿ÐºÐ°"</string>
+ <string name="menu_grid" msgid="6878021334497835259">"Таблица"</string>
+ <string name="menu_list" msgid="7279285939892417279">"СпиÑок"</string>
+ <string name="menu_sort" msgid="7677740407158414452">"Сортировать"</string>
+ <string name="menu_search" msgid="3816712084502856974">"ПоиÑк"</string>
+ <string name="menu_settings" msgid="6008033148948428823">"ÐаÑтройки"</string>
+ <string name="menu_open" msgid="432922957274920903">"Открыть"</string>
+ <string name="menu_save" msgid="2394743337684426338">"Сохранить"</string>
+ <string name="menu_share" msgid="3075149983979628146">"ПоделитьÑÑ"</string>
+ <string name="menu_delete" msgid="8138799623850614177">"Удалить"</string>
+ <string name="mode_selected_count" msgid="459111894725594625">"Выбрано: <xliff:g id="COUNT">%1$d</xliff:g>"</string>
+ <string name="sort_name" msgid="9183560467917256779">"По названию"</string>
+ <string name="sort_date" msgid="586080032956151448">"По дате изменениÑ"</string>
+ <string name="sort_size" msgid="3350681319735474741">"По размеру"</string>
+ <string name="drawer_open" msgid="4545466532430226949">"Показать"</string>
+ <string name="drawer_close" msgid="7602734368552123318">"Скрыть"</string>
+ <string name="save_error" msgid="6167009778003223664">"Ðе удалоÑÑŒ Ñохранить документ"</string>
+ <string name="create_error" msgid="3735649141335444215">"Ðе удалоÑÑŒ Ñоздать папку"</string>
+ <string name="query_error" msgid="1222448261663503501">"Ðе удалоÑÑŒ отправить запроÑ"</string>
+ <string name="root_recent" msgid="4470053704320518133">"Ðедавние"</string>
+ <string name="root_available_bytes" msgid="8568452858617033281">"Свободно <xliff:g id="SIZE">%1$s</xliff:g>"</string>
+ <string name="root_type_service" msgid="2178854894416775409">"Службы хранениÑ"</string>
+ <string name="root_type_shortcut" msgid="3318760609471618093">"Ярлыки"</string>
+ <string name="root_type_device" msgid="7121342474653483538">"УÑтройÑтва"</string>
+ <string name="root_type_apps" msgid="8838065367985945189">"Другие приложениÑ"</string>
+ <string name="pref_advanced_devices" msgid="903257239609301276">"Показать другие уÑтройÑтва"</string>
+ <string name="pref_file_size" msgid="2826879315743961459">"Показать размер файла"</string>
+ <string name="pref_device_size" msgid="3542106883278997222">"Показать размер уÑтройÑтва"</string>
+ <string name="empty" msgid="7858882803708117596">"Ðичего нет"</string>
+ <string name="toast_no_application" msgid="1339885974067891667">"Ðе удалоÑÑŒ открыть файл"</string>
+ <string name="toast_failed_delete" msgid="2180678019407244069">"Ðе удалоÑÑŒ удалить некоторые документы"</string>
+ <string name="share_via" msgid="8966594246261344259">"ПоделитьÑÑ"</string>
+</resources>
diff --git a/packages/DocumentsUI/res/values-si-rLK/strings.xml b/packages/DocumentsUI/res/values-si-rLK/strings.xml
new file mode 100644
index 0000000..6263b82
--- /dev/null
+++ b/packages/DocumentsUI/res/values-si-rLK/strings.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="2783841764617238354">"ලේඛන"</string>
+ <string name="title_open" msgid="4353228937663917801">"විවෘත වන්නේ"</string>
+ <string name="title_save" msgid="2433679664882857999">"සුරකින්නේ"</string>
+ <string name="menu_create_dir" msgid="5947289605844398389">"à·†à·à¶½à·Šà¶©à¶»à¶ºà¶šà·Š à·ƒà·à¶¯à¶±à·Šà¶±"</string>
+ <string name="menu_grid" msgid="6878021334497835259">"à¶¢à·à¶½ පෙනුම"</string>
+ <string name="menu_list" msgid="7279285939892417279">"à¶½à·à¶ºà·’ස්තු පෙනුම"</string>
+ <string name="menu_sort" msgid="7677740407158414452">"අනුපිළිවෙලට සකස෠ඇත්තේ"</string>
+ <string name="menu_search" msgid="3816712084502856974">"සෙවීම"</string>
+ <string name="menu_settings" msgid="6008033148948428823">"à·ƒà·à¶šà·ƒà·“ම්"</string>
+ <string name="menu_open" msgid="432922957274920903">"විවෘත කරන්න"</string>
+ <string name="menu_save" msgid="2394743337684426338">"සුරකින්න"</string>
+ <string name="menu_share" msgid="3075149983979628146">"බෙදà·à¶œà¶±à·Šà¶±"</string>
+ <string name="menu_delete" msgid="8138799623850614177">"මකන්න"</string>
+ <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> à¶šà·Š à¶­à·à¶»à·à¶œà¶±à·Šà¶±à· ලදි"</string>
+ <string name="sort_name" msgid="9183560467917256779">"නමින්"</string>
+ <string name="sort_date" msgid="586080032956151448">"වෙනස් කරන ලද දිනයෙන්"</string>
+ <string name="sort_size" msgid="3350681319735474741">"à¶´à·Šâ€à¶»à¶¸à·à¶«à¶º මගින්"</string>
+ <string name="drawer_open" msgid="4545466532430226949">"මුල් පෙන්වන්න"</string>
+ <string name="drawer_close" msgid="7602734368552123318">"මුල් සඟවන්න"</string>
+ <string name="save_error" msgid="6167009778003223664">"ලේඛනය සුරà·à¶šà·“මට අපොහොසත් විය"</string>
+ <string name="root_recent" msgid="4470053704320518133">"මෑත"</string>
+ <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> ඉතිරියි"</string>
+ <!-- no translation found for root_type_service (2178854894416775409) -->
+ <skip />
+ <string name="root_type_shortcut" msgid="3318760609471618093">"කෙටිමං"</string>
+ <string name="root_type_device" msgid="7121342474653483538">"à¶‹à¶´à·à¶‚à¶œ"</string>
+ <string name="root_type_apps" msgid="8838065367985945189">"තවත් යෙදුම්"</string>
+ <string name="pref_advanced_devices" msgid="903257239609301276">"උසස් à¶‹à¶´à·à¶‚à¶œ දර්à·à¶±à¶º කරන්න"</string>
+ <string name="pref_file_size" msgid="2826879315743961459">"ගොනු à¶´à·Šâ€à¶»à¶¸à·à¶«à¶º දර්à·à¶±à¶º කරන්න"</string>
+ <string name="pref_device_size" msgid="3542106883278997222">"à¶‹à¶´à·à¶‚à¶œ à¶´à·Šâ€à¶»à¶¸à·à¶«à¶º දර්à·à¶±à¶º කරන්න"</string>
+ <string name="empty" msgid="7858882803708117596">"අයිතම à¶±à·à¶­"</string>
+ <string name="toast_no_application" msgid="1339885974067891667">"ගොනුව විවෘත à¶šà·… නොහà·à¶š"</string>
+ <string name="toast_failed_delete" msgid="2180678019407244069">"සමහර ලේඛන මà·à¶šà·“මට නොහà·à¶šà·’ විය"</string>
+ <string name="share_via" msgid="8966594246261344259">"හරහ෠බෙදà·à¶œà¶±à·Šà¶±"</string>
+</resources>
diff --git a/packages/DocumentsUI/res/values-sk/strings.xml b/packages/DocumentsUI/res/values-sk/strings.xml
new file mode 100644
index 0000000..2a96b1a
--- /dev/null
+++ b/packages/DocumentsUI/res/values-sk/strings.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="2783841764617238354">"Dokumenty"</string>
+ <string name="title_open" msgid="4353228937663917801">"Otvoriť z"</string>
+ <string name="title_save" msgid="2433679664882857999">"Uložiť do"</string>
+ <string name="menu_create_dir" msgid="5947289605844398389">"VytvoriÅ¥ prieÄinok"</string>
+ <string name="menu_grid" msgid="6878021334497835259">"Zobrazenie mriežky"</string>
+ <string name="menu_list" msgid="7279285939892417279">"Zobrazenie zoznamu"</string>
+ <string name="menu_sort" msgid="7677740407158414452">"Zoradiť podľa"</string>
+ <string name="menu_search" msgid="3816712084502856974">"Hľadať"</string>
+ <string name="menu_settings" msgid="6008033148948428823">"Nastavenia"</string>
+ <string name="menu_open" msgid="432922957274920903">"Otvoriť"</string>
+ <string name="menu_save" msgid="2394743337684426338">"Uložiť"</string>
+ <string name="menu_share" msgid="3075149983979628146">"Zdieľať"</string>
+ <string name="menu_delete" msgid="8138799623850614177">"Odstrániť"</string>
+ <string name="mode_selected_count" msgid="459111894725594625">"Vybraté: <xliff:g id="COUNT">%1$d</xliff:g>"</string>
+ <string name="sort_name" msgid="9183560467917256779">"Podľa názvu"</string>
+ <string name="sort_date" msgid="586080032956151448">"Podľa dátumu zmeny"</string>
+ <string name="sort_size" msgid="3350681319735474741">"Podľa veľkosti"</string>
+ <string name="drawer_open" msgid="4545466532430226949">"Zobraziť korene"</string>
+ <string name="drawer_close" msgid="7602734368552123318">"Skryť korene"</string>
+ <string name="save_error" msgid="6167009778003223664">"Dokument sa nepodarilo uložiť"</string>
+ <string name="create_error" msgid="3735649141335444215">"PrieÄinok sa nepodarilo vytvoriÅ¥"</string>
+ <string name="query_error" msgid="1222448261663503501">"Zoznam dokumentov sa nepodarilo naÄítaÅ¥"</string>
+ <string name="root_recent" msgid="4470053704320518133">"Nedávne"</string>
+ <string name="root_available_bytes" msgid="8568452858617033281">"Voľné: <xliff:g id="SIZE">%1$s</xliff:g>"</string>
+ <string name="root_type_service" msgid="2178854894416775409">"Služby úložiska"</string>
+ <string name="root_type_shortcut" msgid="3318760609471618093">"Skratky"</string>
+ <string name="root_type_device" msgid="7121342474653483538">"Zariadenia"</string>
+ <string name="root_type_apps" msgid="8838065367985945189">"Ďalšie aplikácie"</string>
+ <string name="pref_advanced_devices" msgid="903257239609301276">"Zobraziť rozšírené zariadenia"</string>
+ <string name="pref_file_size" msgid="2826879315743961459">"Zobraziť veľkosť súboru"</string>
+ <string name="pref_device_size" msgid="3542106883278997222">"Zobraziť veľkosť zariadenia"</string>
+ <string name="empty" msgid="7858882803708117596">"Žiadne položky"</string>
+ <string name="toast_no_application" msgid="1339885974067891667">"Súbor sa nepodarilo otvoriť"</string>
+ <string name="toast_failed_delete" msgid="2180678019407244069">"Niektoré dokumenty sa nepodarilo odstrániť"</string>
+ <string name="share_via" msgid="8966594246261344259">"Zdieľať pomocou"</string>
+</resources>
diff --git a/packages/DocumentsUI/res/values-sl/strings.xml b/packages/DocumentsUI/res/values-sl/strings.xml
new file mode 100644
index 0000000..f984a0a
--- /dev/null
+++ b/packages/DocumentsUI/res/values-sl/strings.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="2783841764617238354">"Dokumenti"</string>
+ <string name="title_open" msgid="4353228937663917801">"Odpiranje iz"</string>
+ <string name="title_save" msgid="2433679664882857999">"Shranjevanje v"</string>
+ <string name="menu_create_dir" msgid="5947289605844398389">"Ustvarjanje mape"</string>
+ <string name="menu_grid" msgid="6878021334497835259">"Mrežni pogled"</string>
+ <string name="menu_list" msgid="7279285939892417279">"Pogled seznama"</string>
+ <string name="menu_sort" msgid="7677740407158414452">"Razvrsti glede na"</string>
+ <string name="menu_search" msgid="3816712084502856974">"Iskanje"</string>
+ <string name="menu_settings" msgid="6008033148948428823">"Nastavitve"</string>
+ <string name="menu_open" msgid="432922957274920903">"Odpri"</string>
+ <string name="menu_save" msgid="2394743337684426338">"Shrani"</string>
+ <string name="menu_share" msgid="3075149983979628146">"Skupna raba"</string>
+ <string name="menu_delete" msgid="8138799623850614177">"Izbriši"</string>
+ <string name="mode_selected_count" msgid="459111894725594625">"Å t. izbranih: <xliff:g id="COUNT">%1$d</xliff:g>"</string>
+ <string name="sort_name" msgid="9183560467917256779">"Po imenu"</string>
+ <string name="sort_date" msgid="586080032956151448">"Po datumu spremembe"</string>
+ <string name="sort_size" msgid="3350681319735474741">"Po velikosti"</string>
+ <string name="drawer_open" msgid="4545466532430226949">"Pokaži korene"</string>
+ <string name="drawer_close" msgid="7602734368552123318">"Skrij korene"</string>
+ <string name="save_error" msgid="6167009778003223664">"Dokumenta ni bilo mogoÄe shraniti"</string>
+ <string name="create_error" msgid="3735649141335444215">"Mape ni bilo mogoÄe ustvariti"</string>
+ <string name="query_error" msgid="1222448261663503501">"Poizvedba za dokumente ni uspela"</string>
+ <string name="root_recent" msgid="4470053704320518133">"Nedavno"</string>
+ <string name="root_available_bytes" msgid="8568452858617033281">"Prosto: <xliff:g id="SIZE">%1$s</xliff:g>"</string>
+ <string name="root_type_service" msgid="2178854894416775409">"Storitve shrambe"</string>
+ <string name="root_type_shortcut" msgid="3318760609471618093">"Bližnjice"</string>
+ <string name="root_type_device" msgid="7121342474653483538">"Naprave"</string>
+ <string name="root_type_apps" msgid="8838065367985945189">"VeÄ aplikacij"</string>
+ <string name="pref_advanced_devices" msgid="903257239609301276">"Prikaz naprednih naprav"</string>
+ <string name="pref_file_size" msgid="2826879315743961459">"Prikaz velikosti datoteke"</string>
+ <string name="pref_device_size" msgid="3542106883278997222">"Prikaz velikosti naprave"</string>
+ <string name="empty" msgid="7858882803708117596">"Ni elementov"</string>
+ <string name="toast_no_application" msgid="1339885974067891667">"Datoteke ni mogoÄe odpreti"</string>
+ <string name="toast_failed_delete" msgid="2180678019407244069">"Nekaterih dokumentov ni mogoÄe izbrisati"</string>
+ <string name="share_via" msgid="8966594246261344259">"Deli z drugimi prek"</string>
+</resources>
diff --git a/packages/DocumentsUI/res/values-sr/strings.xml b/packages/DocumentsUI/res/values-sr/strings.xml
new file mode 100644
index 0000000..eb0b197
--- /dev/null
+++ b/packages/DocumentsUI/res/values-sr/strings.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="2783841764617238354">"Документи"</string>
+ <string name="title_open" msgid="4353228937663917801">"Отвори Ñа"</string>
+ <string name="title_save" msgid="2433679664882857999">"Сачувај у"</string>
+ <string name="menu_create_dir" msgid="5947289605844398389">"Ðаправи директоријум"</string>
+ <string name="menu_grid" msgid="6878021334497835259">"Приказ мреже"</string>
+ <string name="menu_list" msgid="7279285939892417279">"Приказ лиÑте"</string>
+ <string name="menu_sort" msgid="7677740407158414452">"Сортирај према"</string>
+ <string name="menu_search" msgid="3816712084502856974">"Претражи"</string>
+ <string name="menu_settings" msgid="6008033148948428823">"Подешавања"</string>
+ <string name="menu_open" msgid="432922957274920903">"Отвори"</string>
+ <string name="menu_save" msgid="2394743337684426338">"Сачувај"</string>
+ <string name="menu_share" msgid="3075149983979628146">"Дели"</string>
+ <string name="menu_delete" msgid="8138799623850614177">"Избриши"</string>
+ <string name="mode_selected_count" msgid="459111894725594625">"Изабрано је <xliff:g id="COUNT">%1$d</xliff:g>"</string>
+ <string name="sort_name" msgid="9183560467917256779">"Према имену"</string>
+ <string name="sort_date" msgid="586080032956151448">"Према датуму измене"</string>
+ <string name="sort_size" msgid="3350681319735474741">"Према величини"</string>
+ <string name="drawer_open" msgid="4545466532430226949">"Прикажи оÑновне елементе"</string>
+ <string name="drawer_close" msgid="7602734368552123318">"Сакриј оÑновне елементе"</string>
+ <string name="save_error" msgid="6167009778003223664">"Чување документа није уÑпело"</string>
+ <string name="create_error" msgid="3735649141335444215">"Директоријум није направљен"</string>
+ <string name="query_error" msgid="1222448261663503501">"Слање упита за документе није уÑпело"</string>
+ <string name="root_recent" msgid="4470053704320518133">"Ðедавно"</string>
+ <string name="root_available_bytes" msgid="8568452858617033281">"Слободно је <xliff:g id="SIZE">%1$s</xliff:g>"</string>
+ <string name="root_type_service" msgid="2178854894416775409">"УÑлуге Ñкладиштења"</string>
+ <string name="root_type_shortcut" msgid="3318760609471618093">"Пречице"</string>
+ <string name="root_type_device" msgid="7121342474653483538">"Уређаји"</string>
+ <string name="root_type_apps" msgid="8838065367985945189">"Још апликација"</string>
+ <string name="pref_advanced_devices" msgid="903257239609301276">"Прикажи напредне уређаје"</string>
+ <string name="pref_file_size" msgid="2826879315743961459">"Прикажи величину датотеке"</string>
+ <string name="pref_device_size" msgid="3542106883278997222">"Прикажи величину уређаја"</string>
+ <string name="empty" msgid="7858882803708117596">"Ðема Ñтавки"</string>
+ <string name="toast_no_application" msgid="1339885974067891667">"Ðије могуће отворити датотеку"</string>
+ <string name="toast_failed_delete" msgid="2180678019407244069">"Ðије могуће избриÑати неке документе"</string>
+ <string name="share_via" msgid="8966594246261344259">"Делите преко"</string>
+</resources>
diff --git a/packages/DocumentsUI/res/values-sv/strings.xml b/packages/DocumentsUI/res/values-sv/strings.xml
new file mode 100644
index 0000000..7aa5c50
--- /dev/null
+++ b/packages/DocumentsUI/res/values-sv/strings.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="2783841764617238354">"Dokument"</string>
+ <string name="title_open" msgid="4353228937663917801">"Öppna från"</string>
+ <string name="title_save" msgid="2433679664882857999">"Spara till"</string>
+ <string name="menu_create_dir" msgid="5947289605844398389">"Skapa mapp"</string>
+ <string name="menu_grid" msgid="6878021334497835259">"Rutnätsvy"</string>
+ <string name="menu_list" msgid="7279285939892417279">"Listvy"</string>
+ <string name="menu_sort" msgid="7677740407158414452">"Sortera efter"</string>
+ <string name="menu_search" msgid="3816712084502856974">"Sök"</string>
+ <string name="menu_settings" msgid="6008033148948428823">"Inställningar"</string>
+ <string name="menu_open" msgid="432922957274920903">"Öppna"</string>
+ <string name="menu_save" msgid="2394743337684426338">"Spara"</string>
+ <string name="menu_share" msgid="3075149983979628146">"Dela"</string>
+ <string name="menu_delete" msgid="8138799623850614177">"Ta bort"</string>
+ <string name="mode_selected_count" msgid="459111894725594625">"Har valt <xliff:g id="COUNT">%1$d</xliff:g>"</string>
+ <string name="sort_name" msgid="9183560467917256779">"Efter namn"</string>
+ <string name="sort_date" msgid="586080032956151448">"Efter ändringsdatum"</string>
+ <string name="sort_size" msgid="3350681319735474741">"Efter storlek"</string>
+ <string name="drawer_open" msgid="4545466532430226949">"Visa rötter"</string>
+ <string name="drawer_close" msgid="7602734368552123318">"Dölj rötter"</string>
+ <string name="save_error" msgid="6167009778003223664">"Det gick inte att spara dokumentet"</string>
+ <string name="create_error" msgid="3735649141335444215">"Det gick inte att skapa mappen"</string>
+ <string name="query_error" msgid="1222448261663503501">"Det gick inte att söka efter dokument"</string>
+ <string name="root_recent" msgid="4470053704320518133">"Senaste"</string>
+ <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> ledigt"</string>
+ <string name="root_type_service" msgid="2178854894416775409">"Lagringstjänster"</string>
+ <string name="root_type_shortcut" msgid="3318760609471618093">"Genvägar"</string>
+ <string name="root_type_device" msgid="7121342474653483538">"Enheter"</string>
+ <string name="root_type_apps" msgid="8838065367985945189">"Fler appar"</string>
+ <string name="pref_advanced_devices" msgid="903257239609301276">"Visa avancerade enheter"</string>
+ <string name="pref_file_size" msgid="2826879315743961459">"Visa filstorlek"</string>
+ <string name="pref_device_size" msgid="3542106883278997222">"Bildskärmsstorlek"</string>
+ <string name="empty" msgid="7858882803708117596">"Inga objekt"</string>
+ <string name="toast_no_application" msgid="1339885974067891667">"Det går inte att öppna filen"</string>
+ <string name="toast_failed_delete" msgid="2180678019407244069">"Det gick inte att ta bort vissa dokument"</string>
+ <string name="share_via" msgid="8966594246261344259">"Dela via"</string>
+</resources>
diff --git a/packages/DocumentsUI/res/values-sw/strings.xml b/packages/DocumentsUI/res/values-sw/strings.xml
new file mode 100644
index 0000000..299fda7
--- /dev/null
+++ b/packages/DocumentsUI/res/values-sw/strings.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="2783841764617238354">"Hati"</string>
+ <string name="title_open" msgid="4353228937663917801">"Fungua kutoka"</string>
+ <string name="title_save" msgid="2433679664882857999">"Hifadhi kwenye"</string>
+ <string name="menu_create_dir" msgid="5947289605844398389">"Unda folda"</string>
+ <string name="menu_grid" msgid="6878021334497835259">"Mwonekano gridi"</string>
+ <string name="menu_list" msgid="7279285939892417279">"Mwonekano orodha"</string>
+ <string name="menu_sort" msgid="7677740407158414452">"Panga kwa"</string>
+ <string name="menu_search" msgid="3816712084502856974">"Utafutaji"</string>
+ <string name="menu_settings" msgid="6008033148948428823">"Mipangilio"</string>
+ <string name="menu_open" msgid="432922957274920903">"Fungua"</string>
+ <string name="menu_save" msgid="2394743337684426338">"Hifadhi"</string>
+ <string name="menu_share" msgid="3075149983979628146">"Shiriki"</string>
+ <string name="menu_delete" msgid="8138799623850614177">"Futa"</string>
+ <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> zimechaguliwa"</string>
+ <string name="sort_name" msgid="9183560467917256779">"Kwa jina"</string>
+ <string name="sort_date" msgid="586080032956151448">"Kwa tarehe viliporekebishwa"</string>
+ <string name="sort_size" msgid="3350681319735474741">"Kwa ukubwa"</string>
+ <string name="drawer_open" msgid="4545466532430226949">"Onyesha usuli"</string>
+ <string name="drawer_close" msgid="7602734368552123318">"Ficha usuli"</string>
+ <string name="save_error" msgid="6167009778003223664">"Imeshindwa kuhifadhi hati"</string>
+ <string name="create_error" msgid="3735649141335444215">"Ilishindwa kuunda folda"</string>
+ <string name="query_error" msgid="1222448261663503501">"Ilishindwa kuhoji hati"</string>
+ <string name="root_recent" msgid="4470053704320518133">"Hivi karibuni"</string>
+ <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> bila malipo"</string>
+ <string name="root_type_service" msgid="2178854894416775409">"Huduma za hifadhi"</string>
+ <string name="root_type_shortcut" msgid="3318760609471618093">"Njia za mkato"</string>
+ <string name="root_type_device" msgid="7121342474653483538">"Vifaa"</string>
+ <string name="root_type_apps" msgid="8838065367985945189">"Programu zaidi"</string>
+ <string name="pref_advanced_devices" msgid="903257239609301276">"Onyesha vifaa mahiri"</string>
+ <string name="pref_file_size" msgid="2826879315743961459">"Onyesha ukubwa wa faili"</string>
+ <string name="pref_device_size" msgid="3542106883278997222">"Onyesha ukubwa wa kifaa"</string>
+ <string name="empty" msgid="7858882803708117596">"Hakuna vipengee"</string>
+ <string name="toast_no_application" msgid="1339885974067891667">"Haiwezi kufungua faili"</string>
+ <string name="toast_failed_delete" msgid="2180678019407244069">"Imeshindwa kufuta baadhi ya hati"</string>
+ <string name="share_via" msgid="8966594246261344259">"Shiriki kupitia"</string>
+</resources>
diff --git a/packages/DocumentsUI/res/values-th/strings.xml b/packages/DocumentsUI/res/values-th/strings.xml
new file mode 100644
index 0000000..6ac8810
--- /dev/null
+++ b/packages/DocumentsUI/res/values-th/strings.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="2783841764617238354">"เอà¸à¸ªà¸²à¸£"</string>
+ <string name="title_open" msgid="4353228937663917801">"เปิดจาà¸"</string>
+ <string name="title_save" msgid="2433679664882857999">"บันทึà¸à¹„ปยัง"</string>
+ <string name="menu_create_dir" msgid="5947289605844398389">"สร้างโฟลเดอร์"</string>
+ <string name="menu_grid" msgid="6878021334497835259">"มุมมองตาราง"</string>
+ <string name="menu_list" msgid="7279285939892417279">"มุมมองรายà¸à¸²à¸£"</string>
+ <string name="menu_sort" msgid="7677740407158414452">"จัดเรียงตาม"</string>
+ <string name="menu_search" msgid="3816712084502856974">"ค้นหา"</string>
+ <string name="menu_settings" msgid="6008033148948428823">"à¸à¸²à¸£à¸•ั้งค่า"</string>
+ <string name="menu_open" msgid="432922957274920903">"เปิด"</string>
+ <string name="menu_save" msgid="2394743337684426338">"บันทึà¸"</string>
+ <string name="menu_share" msgid="3075149983979628146">"à¹à¸Šà¸£à¹Œ"</string>
+ <string name="menu_delete" msgid="8138799623850614177">"ลบ"</string>
+ <string name="mode_selected_count" msgid="459111894725594625">"เลือà¸à¹„ว้ <xliff:g id="COUNT">%1$d</xliff:g>"</string>
+ <string name="sort_name" msgid="9183560467917256779">"ตามชื่อ"</string>
+ <string name="sort_date" msgid="586080032956151448">"ตามวันที่ที่ปรับเปลี่ยน"</string>
+ <string name="sort_size" msgid="3350681319735474741">"ตามขนาด"</string>
+ <string name="drawer_open" msgid="4545466532430226949">"à¹à¸ªà¸”งราà¸"</string>
+ <string name="drawer_close" msgid="7602734368552123318">"ซ่อนราà¸"</string>
+ <string name="save_error" msgid="6167009778003223664">"à¸à¸²à¸£à¸šà¸±à¸™à¸—ึà¸à¹€à¸­à¸à¸ªà¸²à¸£à¸¥à¹‰à¸¡à¹€à¸«à¸¥à¸§"</string>
+ <string name="create_error" msgid="3735649141335444215">"à¸à¸²à¸£à¸ªà¸£à¹‰à¸²à¸‡à¹‚ฟลเดอร์ล้มเหลว"</string>
+ <string name="query_error" msgid="1222448261663503501">"à¸à¸²à¸£à¸„้นหาเอà¸à¸ªà¸²à¸£à¸¥à¹‰à¸¡à¹€à¸«à¸¥à¸§"</string>
+ <string name="root_recent" msgid="4470053704320518133">"ล่าสุด"</string>
+ <string name="root_available_bytes" msgid="8568452858617033281">"ว่าง <xliff:g id="SIZE">%1$s</xliff:g>"</string>
+ <string name="root_type_service" msgid="2178854894416775409">"บริà¸à¸²à¸£à¸—ี่เà¸à¹‡à¸šà¸‚้อมูล"</string>
+ <string name="root_type_shortcut" msgid="3318760609471618093">"ทางลัด"</string>
+ <string name="root_type_device" msgid="7121342474653483538">"อุปà¸à¸£à¸“์"</string>
+ <string name="root_type_apps" msgid="8838065367985945189">"à¹à¸­à¸›à¹€à¸žà¸´à¹ˆà¸¡à¹€à¸•ิม"</string>
+ <string name="pref_advanced_devices" msgid="903257239609301276">"à¹à¸ªà¸”งอุปà¸à¸£à¸“์ขั้นสูง"</string>
+ <string name="pref_file_size" msgid="2826879315743961459">"à¹à¸ªà¸”งขนาดของไฟล์"</string>
+ <string name="pref_device_size" msgid="3542106883278997222">"à¹à¸ªà¸”งขนาดของอุปà¸à¸£à¸“์"</string>
+ <string name="empty" msgid="7858882803708117596">"ไม่มีรายà¸à¸²à¸£"</string>
+ <string name="toast_no_application" msgid="1339885974067891667">"ไม่สามารถเปิดไฟล์ได้"</string>
+ <string name="toast_failed_delete" msgid="2180678019407244069">"ไม่สามารถลบเอà¸à¸ªà¸²à¸£à¸šà¸²à¸‡à¸£à¸²à¸¢à¸à¸²à¸£"</string>
+ <string name="share_via" msgid="8966594246261344259">"à¹à¸Šà¸£à¹Œà¸œà¹ˆà¸²à¸™"</string>
+</resources>
diff --git a/packages/DocumentsUI/res/values-tl/strings.xml b/packages/DocumentsUI/res/values-tl/strings.xml
new file mode 100644
index 0000000..e0fd8c8
--- /dev/null
+++ b/packages/DocumentsUI/res/values-tl/strings.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="2783841764617238354">"Mga Dokumento"</string>
+ <string name="title_open" msgid="4353228937663917801">"Buksan mula sa"</string>
+ <string name="title_save" msgid="2433679664882857999">"I-save sa"</string>
+ <string name="menu_create_dir" msgid="5947289605844398389">"Gumawa ng folder"</string>
+ <string name="menu_grid" msgid="6878021334497835259">"View ng grid"</string>
+ <string name="menu_list" msgid="7279285939892417279">"View ng listahan"</string>
+ <string name="menu_sort" msgid="7677740407158414452">"Pag-uri-uriin ayon sa"</string>
+ <string name="menu_search" msgid="3816712084502856974">"Maghanap"</string>
+ <string name="menu_settings" msgid="6008033148948428823">"Mga Setting"</string>
+ <string name="menu_open" msgid="432922957274920903">"Buksan"</string>
+ <string name="menu_save" msgid="2394743337684426338">"I-save"</string>
+ <string name="menu_share" msgid="3075149983979628146">"Ibahagi"</string>
+ <string name="menu_delete" msgid="8138799623850614177">"Tanggalin"</string>
+ <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> ang pinili"</string>
+ <string name="sort_name" msgid="9183560467917256779">"Ayon sa pangalan"</string>
+ <string name="sort_date" msgid="586080032956151448">"Ayon sa petsa ng pagbago"</string>
+ <string name="sort_size" msgid="3350681319735474741">"Ayon sa laki"</string>
+ <string name="drawer_open" msgid="4545466532430226949">"Ipakita ang mga root"</string>
+ <string name="drawer_close" msgid="7602734368552123318">"Itago ang mga root"</string>
+ <string name="save_error" msgid="6167009778003223664">"Hindi na-save ang dokumento"</string>
+ <string name="create_error" msgid="3735649141335444215">"Hindi nagawa ang folder"</string>
+ <string name="query_error" msgid="1222448261663503501">"Hindi na-query ang mga dokumento"</string>
+ <string name="root_recent" msgid="4470053704320518133">"Kamakailan"</string>
+ <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> ang libre"</string>
+ <string name="root_type_service" msgid="2178854894416775409">"Mga serbisyo ng storage"</string>
+ <string name="root_type_shortcut" msgid="3318760609471618093">"Mga Shortcut"</string>
+ <string name="root_type_device" msgid="7121342474653483538">"Mga Device"</string>
+ <string name="root_type_apps" msgid="8838065367985945189">"Higit pang apps"</string>
+ <string name="pref_advanced_devices" msgid="903257239609301276">"Ipakita ang mga advanced na device"</string>
+ <string name="pref_file_size" msgid="2826879315743961459">"Ipakita ang laki ng file"</string>
+ <string name="pref_device_size" msgid="3542106883278997222">"Ipakita ang laki ng device"</string>
+ <string name="empty" msgid="7858882803708117596">"Walang mga item"</string>
+ <string name="toast_no_application" msgid="1339885974067891667">"Hindi mabuksan ang file"</string>
+ <string name="toast_failed_delete" msgid="2180678019407244069">"Hindi matanggal ang ilang dokumento"</string>
+ <string name="share_via" msgid="8966594246261344259">"Ibahagi sa pamamagitan ng"</string>
+</resources>
diff --git a/packages/DocumentsUI/res/values-tr/strings.xml b/packages/DocumentsUI/res/values-tr/strings.xml
new file mode 100644
index 0000000..699a5cd
--- /dev/null
+++ b/packages/DocumentsUI/res/values-tr/strings.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="2783841764617238354">"Dokümanlar"</string>
+ <string name="title_open" msgid="4353228937663917801">"Şuradan aç:"</string>
+ <string name="title_save" msgid="2433679664882857999">"Åžuraya kaydet:"</string>
+ <string name="menu_create_dir" msgid="5947289605844398389">"Klasör oluştur"</string>
+ <string name="menu_grid" msgid="6878021334497835259">"Tablo görünümü"</string>
+ <string name="menu_list" msgid="7279285939892417279">"Liste görünümü"</string>
+ <string name="menu_sort" msgid="7677740407158414452">"Sıralama ölçütü"</string>
+ <string name="menu_search" msgid="3816712084502856974">"Ara"</string>
+ <string name="menu_settings" msgid="6008033148948428823">"Ayarlar"</string>
+ <string name="menu_open" msgid="432922957274920903">"Aç"</string>
+ <string name="menu_save" msgid="2394743337684426338">"Kaydet"</string>
+ <string name="menu_share" msgid="3075149983979628146">"PaylaÅŸ"</string>
+ <string name="menu_delete" msgid="8138799623850614177">"Sil"</string>
+ <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> tane seçildi"</string>
+ <string name="sort_name" msgid="9183560467917256779">"Ada göre"</string>
+ <string name="sort_date" msgid="586080032956151448">"Değişiklik tarihine göre"</string>
+ <string name="sort_size" msgid="3350681319735474741">"Boyuta göre"</string>
+ <string name="drawer_open" msgid="4545466532430226949">"Kökleri göster"</string>
+ <string name="drawer_close" msgid="7602734368552123318">"Kökleri sakla"</string>
+ <string name="save_error" msgid="6167009778003223664">"Doküman kaydedilemedi"</string>
+ <string name="create_error" msgid="3735649141335444215">"Klasör oluşturulamadı"</string>
+ <string name="query_error" msgid="1222448261663503501">"Dokümanlar sorgulanamadı"</string>
+ <string name="root_recent" msgid="4470053704320518133">"En son"</string>
+ <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> boÅŸ"</string>
+ <string name="root_type_service" msgid="2178854894416775409">"Depolama hizmetleri"</string>
+ <string name="root_type_shortcut" msgid="3318760609471618093">"Kısayollar"</string>
+ <string name="root_type_device" msgid="7121342474653483538">"Cihazlar"</string>
+ <string name="root_type_apps" msgid="8838065367985945189">"DiÄŸer uygulamalar"</string>
+ <string name="pref_advanced_devices" msgid="903257239609301276">"Gelişmiş cihazları göster"</string>
+ <string name="pref_file_size" msgid="2826879315743961459">"Dosya boyutunu göster"</string>
+ <string name="pref_device_size" msgid="3542106883278997222">"Cihaz boyutunu göster"</string>
+ <string name="empty" msgid="7858882803708117596">"Öğe yok"</string>
+ <string name="toast_no_application" msgid="1339885974067891667">"Dosya açılamıyor"</string>
+ <string name="toast_failed_delete" msgid="2180678019407244069">"Bazı dokümanlar silinemiyor"</string>
+ <string name="share_via" msgid="8966594246261344259">"Åžunu kullanarak paylaÅŸ:"</string>
+</resources>
diff --git a/packages/DocumentsUI/res/values-uk/strings.xml b/packages/DocumentsUI/res/values-uk/strings.xml
new file mode 100644
index 0000000..f87b6a2
--- /dev/null
+++ b/packages/DocumentsUI/res/values-uk/strings.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="2783841764617238354">"Документи"</string>
+ <string name="title_open" msgid="4353228937663917801">"Відкрити в"</string>
+ <string name="title_save" msgid="2433679664882857999">"Зберегти в"</string>
+ <string name="menu_create_dir" msgid="5947289605844398389">"Створити папку"</string>
+ <string name="menu_grid" msgid="6878021334497835259">"Режим таблиці"</string>
+ <string name="menu_list" msgid="7279285939892417279">"Режим ÑпиÑку"</string>
+ <string name="menu_sort" msgid="7677740407158414452">"Параметри ÑортуваннÑ"</string>
+ <string name="menu_search" msgid="3816712084502856974">"Пошук"</string>
+ <string name="menu_settings" msgid="6008033148948428823">"ÐалаштуваннÑ"</string>
+ <string name="menu_open" msgid="432922957274920903">"Відкрити"</string>
+ <string name="menu_save" msgid="2394743337684426338">"Зберегти"</string>
+ <string name="menu_share" msgid="3075149983979628146">"ПоділитиÑÑ"</string>
+ <string name="menu_delete" msgid="8138799623850614177">"Видалити"</string>
+ <string name="mode_selected_count" msgid="459111894725594625">"Вибрано <xliff:g id="COUNT">%1$d</xliff:g>"</string>
+ <string name="sort_name" msgid="9183560467917256779">"За назвою"</string>
+ <string name="sort_date" msgid="586080032956151448">"За датою зміненнÑ"</string>
+ <string name="sort_size" msgid="3350681319735474741">"За розміром"</string>
+ <string name="drawer_open" msgid="4545466532430226949">"Показати кореневі каталоги"</string>
+ <string name="drawer_close" msgid="7602734368552123318">"Сховати кореневі каталоги"</string>
+ <string name="save_error" msgid="6167009778003223664">"Ðе вдалоÑÑ Ð·Ð±ÐµÑ€ÐµÐ³Ñ‚Ð¸ документ"</string>
+ <string name="create_error" msgid="3735649141335444215">"Помилка ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¿Ð°Ð¿ÐºÐ¸"</string>
+ <string name="query_error" msgid="1222448261663503501">"Помилка надÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñƒ на документи"</string>
+ <string name="root_recent" msgid="4470053704320518133">"ОÑтанні"</string>
+ <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> вільного міÑцÑ"</string>
+ <string name="root_type_service" msgid="2178854894416775409">"Онлайн-Ñховища"</string>
+ <string name="root_type_shortcut" msgid="3318760609471618093">"Ярлики"</string>
+ <string name="root_type_device" msgid="7121342474653483538">"ПриÑтрої"</string>
+ <string name="root_type_apps" msgid="8838065367985945189">"Інші програми"</string>
+ <string name="pref_advanced_devices" msgid="903257239609301276">"Показати покращені приÑтрої"</string>
+ <string name="pref_file_size" msgid="2826879315743961459">"Показати розмір файлу"</string>
+ <string name="pref_device_size" msgid="3542106883278997222">"Показати розмір приÑтрою"</string>
+ <string name="empty" msgid="7858882803708117596">"Ðемає елементів"</string>
+ <string name="toast_no_application" msgid="1339885974067891667">"Ðе вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл"</string>
+ <string name="toast_failed_delete" msgid="2180678019407244069">"Ðе вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ деÑкі документи"</string>
+ <string name="share_via" msgid="8966594246261344259">"ÐадіÑлати через"</string>
+</resources>
diff --git a/packages/DocumentsUI/res/values-vi/strings.xml b/packages/DocumentsUI/res/values-vi/strings.xml
new file mode 100644
index 0000000..41e29fa
--- /dev/null
+++ b/packages/DocumentsUI/res/values-vi/strings.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="2783841764617238354">"Tài liệu"</string>
+ <string name="title_open" msgid="4353228937663917801">"Mở từ"</string>
+ <string name="title_save" msgid="2433679664882857999">"Lưu vào"</string>
+ <string name="menu_create_dir" msgid="5947289605844398389">"Tạo thư mục"</string>
+ <string name="menu_grid" msgid="6878021334497835259">"Chế độ xem lưới"</string>
+ <string name="menu_list" msgid="7279285939892417279">"Chế độ xem danh sách"</string>
+ <string name="menu_sort" msgid="7677740407158414452">"Sắp xếp theo"</string>
+ <string name="menu_search" msgid="3816712084502856974">"Tìm kiếm"</string>
+ <string name="menu_settings" msgid="6008033148948428823">"Cài đặt"</string>
+ <string name="menu_open" msgid="432922957274920903">"Mở"</string>
+ <string name="menu_save" msgid="2394743337684426338">"Lưu"</string>
+ <string name="menu_share" msgid="3075149983979628146">"Chia sẻ"</string>
+ <string name="menu_delete" msgid="8138799623850614177">"Xóa"</string>
+ <string name="mode_selected_count" msgid="459111894725594625">"Äã chá»n <xliff:g id="COUNT">%1$d</xliff:g>"</string>
+ <string name="sort_name" msgid="9183560467917256779">"Theo tên"</string>
+ <string name="sort_date" msgid="586080032956151448">"Theo ngày sửa đổi"</string>
+ <string name="sort_size" msgid="3350681319735474741">"Theo kích thước"</string>
+ <string name="drawer_open" msgid="4545466532430226949">"Hiển thị gốc"</string>
+ <string name="drawer_close" msgid="7602734368552123318">"Ẩn gốc"</string>
+ <string name="save_error" msgid="6167009778003223664">"Không lưu tài liệu được"</string>
+ <string name="create_error" msgid="3735649141335444215">"Không thể tạo thư mục"</string>
+ <string name="query_error" msgid="1222448261663503501">"Không truy vấn được tài liệu"</string>
+ <string name="root_recent" msgid="4470053704320518133">"Gần đây"</string>
+ <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> còn trống"</string>
+ <string name="root_type_service" msgid="2178854894416775409">"Dịch vụ lưu trữ"</string>
+ <string name="root_type_shortcut" msgid="3318760609471618093">"Lối tắt"</string>
+ <string name="root_type_device" msgid="7121342474653483538">"Thiết bị"</string>
+ <string name="root_type_apps" msgid="8838065367985945189">"Các ứng dụng khác"</string>
+ <string name="pref_advanced_devices" msgid="903257239609301276">"Hiển thị các thiết bị nâng cao"</string>
+ <string name="pref_file_size" msgid="2826879315743961459">"Hiển thị kích thước tệp"</string>
+ <string name="pref_device_size" msgid="3542106883278997222">"Hiển thị kích thước thiết bị"</string>
+ <string name="empty" msgid="7858882803708117596">"Không có mục nào"</string>
+ <string name="toast_no_application" msgid="1339885974067891667">"Không thể mở tệp"</string>
+ <string name="toast_failed_delete" msgid="2180678019407244069">"Không thể xóa một số tài liệu"</string>
+ <string name="share_via" msgid="8966594246261344259">"Chia sẻ qua"</string>
+</resources>
diff --git a/packages/DocumentsUI/res/values-zh-rCN/strings.xml b/packages/DocumentsUI/res/values-zh-rCN/strings.xml
new file mode 100644
index 0000000..742cda7
--- /dev/null
+++ b/packages/DocumentsUI/res/values-zh-rCN/strings.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="2783841764617238354">"文档"</string>
+ <string name="title_open" msgid="4353228937663917801">"打开文件"</string>
+ <string name="title_save" msgid="2433679664882857999">"ä¿å­˜æ–‡ä»¶"</string>
+ <string name="menu_create_dir" msgid="5947289605844398389">"新建文件夹"</string>
+ <string name="menu_grid" msgid="6878021334497835259">"网格视图"</string>
+ <string name="menu_list" msgid="7279285939892417279">"列表视图"</string>
+ <string name="menu_sort" msgid="7677740407158414452">"排åºä¾æ®"</string>
+ <string name="menu_search" msgid="3816712084502856974">"æœç´¢"</string>
+ <string name="menu_settings" msgid="6008033148948428823">"设置"</string>
+ <string name="menu_open" msgid="432922957274920903">"打开"</string>
+ <string name="menu_save" msgid="2394743337684426338">"ä¿å­˜"</string>
+ <string name="menu_share" msgid="3075149983979628146">"分享"</string>
+ <string name="menu_delete" msgid="8138799623850614177">"删除"</string>
+ <string name="mode_selected_count" msgid="459111894725594625">"已选择<xliff:g id="COUNT">%1$d</xliff:g>项"</string>
+ <string name="sort_name" msgid="9183560467917256779">"按åç§°"</string>
+ <string name="sort_date" msgid="586080032956151448">"按修改日期"</string>
+ <string name="sort_size" msgid="3350681319735474741">"按大å°"</string>
+ <string name="drawer_open" msgid="4545466532430226949">"显示根目录"</string>
+ <string name="drawer_close" msgid="7602734368552123318">"éšè—根目录"</string>
+ <string name="save_error" msgid="6167009778003223664">"无法ä¿å­˜æ–‡æ¡£"</string>
+ <string name="create_error" msgid="3735649141335444215">"无法创建文件夹"</string>
+ <string name="query_error" msgid="1222448261663503501">"无法查询文档"</string>
+ <string name="root_recent" msgid="4470053704320518133">"最近"</string>
+ <string name="root_available_bytes" msgid="8568452858617033281">"å¯ç”¨ç©ºé—´ï¼š<xliff:g id="SIZE">%1$s</xliff:g>"</string>
+ <string name="root_type_service" msgid="2178854894416775409">"存储æœåŠ¡"</string>
+ <string name="root_type_shortcut" msgid="3318760609471618093">"æ·å¾„"</string>
+ <string name="root_type_device" msgid="7121342474653483538">"设备"</string>
+ <string name="root_type_apps" msgid="8838065367985945189">"更多应用"</string>
+ <string name="pref_advanced_devices" msgid="903257239609301276">"显示高级设备"</string>
+ <string name="pref_file_size" msgid="2826879315743961459">"显示文件大å°"</string>
+ <string name="pref_device_size" msgid="3542106883278997222">"显示设备大å°"</string>
+ <string name="empty" msgid="7858882803708117596">"无任何文件"</string>
+ <string name="toast_no_application" msgid="1339885974067891667">"无法打开文件"</string>
+ <string name="toast_failed_delete" msgid="2180678019407244069">"无法删除部分文档"</string>
+ <string name="share_via" msgid="8966594246261344259">"分享方å¼"</string>
+</resources>
diff --git a/packages/DocumentsUI/res/values-zh-rHK/strings.xml b/packages/DocumentsUI/res/values-zh-rHK/strings.xml
new file mode 100644
index 0000000..67ed587
--- /dev/null
+++ b/packages/DocumentsUI/res/values-zh-rHK/strings.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="2783841764617238354">"文件"</string>
+ <string name="title_open" msgid="4353228937663917801">"開啟自"</string>
+ <string name="title_save" msgid="2433679664882857999">"儲存至"</string>
+ <string name="menu_create_dir" msgid="5947289605844398389">"建立資料夾"</string>
+ <string name="menu_grid" msgid="6878021334497835259">"格狀檢視"</string>
+ <string name="menu_list" msgid="7279285939892417279">"清單檢視"</string>
+ <string name="menu_sort" msgid="7677740407158414452">"æŽ’åºæ–¹å¼"</string>
+ <string name="menu_search" msgid="3816712084502856974">"æœå°‹"</string>
+ <string name="menu_settings" msgid="6008033148948428823">"設定"</string>
+ <string name="menu_open" msgid="432922957274920903">"開啟"</string>
+ <string name="menu_save" msgid="2394743337684426338">"儲存"</string>
+ <string name="menu_share" msgid="3075149983979628146">"分享"</string>
+ <string name="menu_delete" msgid="8138799623850614177">"刪除"</string>
+ <string name="mode_selected_count" msgid="459111894725594625">"å·²é¸å– <xliff:g id="COUNT">%1$d</xliff:g> 個"</string>
+ <string name="sort_name" msgid="9183560467917256779">"按å稱"</string>
+ <string name="sort_date" msgid="586080032956151448">"按修改日期"</string>
+ <string name="sort_size" msgid="3350681319735474741">"按大å°"</string>
+ <string name="drawer_open" msgid="4545466532430226949">"顯示根目錄"</string>
+ <string name="drawer_close" msgid="7602734368552123318">"éš±è—æ ¹ç›®éŒ„"</string>
+ <string name="save_error" msgid="6167009778003223664">"無法儲存文件"</string>
+ <string name="create_error" msgid="3735649141335444215">"無法建立資料夾"</string>
+ <string name="query_error" msgid="1222448261663503501">"無法查詢文件"</string>
+ <string name="root_recent" msgid="4470053704320518133">"近期用éŽ"</string>
+ <string name="root_available_bytes" msgid="8568452858617033281">"å¯ç”¨ç©ºé–“:<xliff:g id="SIZE">%1$s</xliff:g>"</string>
+ <string name="root_type_service" msgid="2178854894416775409">"儲存空間æœå‹™"</string>
+ <string name="root_type_shortcut" msgid="3318760609471618093">"æ·å¾‘"</string>
+ <string name="root_type_device" msgid="7121342474653483538">"è£ç½®"</string>
+ <string name="root_type_apps" msgid="8838065367985945189">"更多應用程å¼"</string>
+ <string name="pref_advanced_devices" msgid="903257239609301276">"顯示進階è£ç½®"</string>
+ <string name="pref_file_size" msgid="2826879315743961459">"顯示檔案大å°"</string>
+ <string name="pref_device_size" msgid="3542106883278997222">"顯示è£ç½®å¤§å°"</string>
+ <string name="empty" msgid="7858882803708117596">"沒有項目"</string>
+ <string name="toast_no_application" msgid="1339885974067891667">"無法開啟檔案"</string>
+ <string name="toast_failed_delete" msgid="2180678019407244069">"無法刪除部分文件"</string>
+ <string name="share_via" msgid="8966594246261344259">"分享方å¼ï¼š"</string>
+</resources>
diff --git a/packages/DocumentsUI/res/values-zh-rTW/strings.xml b/packages/DocumentsUI/res/values-zh-rTW/strings.xml
new file mode 100644
index 0000000..269583a
--- /dev/null
+++ b/packages/DocumentsUI/res/values-zh-rTW/strings.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="2783841764617238354">"文件"</string>
+ <string name="title_open" msgid="4353228937663917801">"開啟工具"</string>
+ <string name="title_save" msgid="2433679664882857999">"儲存至"</string>
+ <string name="menu_create_dir" msgid="5947289605844398389">"建立資料夾"</string>
+ <string name="menu_grid" msgid="6878021334497835259">"格狀檢視"</string>
+ <string name="menu_list" msgid="7279285939892417279">"清單檢視"</string>
+ <string name="menu_sort" msgid="7677740407158414452">"排åºä¾æ“š"</string>
+ <string name="menu_search" msgid="3816712084502856974">"æœå°‹"</string>
+ <string name="menu_settings" msgid="6008033148948428823">"設定"</string>
+ <string name="menu_open" msgid="432922957274920903">"開啟"</string>
+ <string name="menu_save" msgid="2394743337684426338">"儲存"</string>
+ <string name="menu_share" msgid="3075149983979628146">"共用"</string>
+ <string name="menu_delete" msgid="8138799623850614177">"刪除"</string>
+ <string name="mode_selected_count" msgid="459111894725594625">"å·²é¸å– <xliff:g id="COUNT">%1$d</xliff:g> 個項目"</string>
+ <string name="sort_name" msgid="9183560467917256779">"ä¾å稱"</string>
+ <string name="sort_date" msgid="586080032956151448">"ä¾ä¿®æ”¹æ—¥æœŸ"</string>
+ <string name="sort_size" msgid="3350681319735474741">"ä¾å¤§å°"</string>
+ <string name="drawer_open" msgid="4545466532430226949">"顯示根目錄"</string>
+ <string name="drawer_close" msgid="7602734368552123318">"éš±è—æ ¹ç›®éŒ„"</string>
+ <string name="save_error" msgid="6167009778003223664">"無法儲存文件"</string>
+ <string name="create_error" msgid="3735649141335444215">"無法建立資料夾"</string>
+ <string name="query_error" msgid="1222448261663503501">"無法查詢文件"</string>
+ <string name="root_recent" msgid="4470053704320518133">"最近使用éŽçš„é …ç›®"</string>
+ <string name="root_available_bytes" msgid="8568452858617033281">"å¯ç”¨ç©ºé–“:<xliff:g id="SIZE">%1$s</xliff:g>"</string>
+ <string name="root_type_service" msgid="2178854894416775409">"儲存空間æœå‹™"</string>
+ <string name="root_type_shortcut" msgid="3318760609471618093">"æ·å¾‘"</string>
+ <string name="root_type_device" msgid="7121342474653483538">"è£ç½®"</string>
+ <string name="root_type_apps" msgid="8838065367985945189">"更多應用程å¼"</string>
+ <string name="pref_advanced_devices" msgid="903257239609301276">"顯示進階è£ç½®"</string>
+ <string name="pref_file_size" msgid="2826879315743961459">"顯示檔案大å°"</string>
+ <string name="pref_device_size" msgid="3542106883278997222">"顯示è£ç½®å¤§å°"</string>
+ <string name="empty" msgid="7858882803708117596">"沒有項目"</string>
+ <string name="toast_no_application" msgid="1339885974067891667">"無法開啟檔案"</string>
+ <string name="toast_failed_delete" msgid="2180678019407244069">"無法刪除部分文件"</string>
+ <string name="share_via" msgid="8966594246261344259">"分享方å¼ï¼š"</string>
+</resources>
diff --git a/packages/DocumentsUI/res/values-zu/strings.xml b/packages/DocumentsUI/res/values-zu/strings.xml
new file mode 100644
index 0000000..bedd2cd
--- /dev/null
+++ b/packages/DocumentsUI/res/values-zu/strings.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="2783841764617238354">"Amadokhumenti"</string>
+ <string name="title_open" msgid="4353228937663917801">"Vula kusuka ku-"</string>
+ <string name="title_save" msgid="2433679664882857999">"Londoloza ku-"</string>
+ <string name="menu_create_dir" msgid="5947289605844398389">"Dala ifolda"</string>
+ <string name="menu_grid" msgid="6878021334497835259">"Ukubuka kwegridi"</string>
+ <string name="menu_list" msgid="7279285939892417279">"Ukubuka uhlu"</string>
+ <string name="menu_sort" msgid="7677740407158414452">"Hlunga nge-"</string>
+ <string name="menu_search" msgid="3816712084502856974">"Sesha"</string>
+ <string name="menu_settings" msgid="6008033148948428823">"Izilungiselelo"</string>
+ <string name="menu_open" msgid="432922957274920903">"Vula"</string>
+ <string name="menu_save" msgid="2394743337684426338">"Londoloza"</string>
+ <string name="menu_share" msgid="3075149983979628146">"Yabelana"</string>
+ <string name="menu_delete" msgid="8138799623850614177">"Susa"</string>
+ <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> okukhethiwe"</string>
+ <string name="sort_name" msgid="9183560467917256779">"Ngegama"</string>
+ <string name="sort_date" msgid="586080032956151448">"Ngedethi yokuguqula"</string>
+ <string name="sort_size" msgid="3350681319735474741">"Ngosayizi"</string>
+ <string name="drawer_open" msgid="4545466532430226949">"Bonisa izimpande"</string>
+ <string name="drawer_close" msgid="7602734368552123318">"Fihla izimpande"</string>
+ <string name="save_error" msgid="6167009778003223664">"Yehlulekile ukulondoloza idokhumenti"</string>
+ <string name="create_error" msgid="3735649141335444215">"Yehlulekile ukudala ifolda"</string>
+ <string name="query_error" msgid="1222448261663503501">"Ihlulekile ukubuza amadokhumenti"</string>
+ <string name="root_recent" msgid="4470053704320518133">"Okwakamuva"</string>
+ <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> okhululekile"</string>
+ <string name="root_type_service" msgid="2178854894416775409">"Amasevisi wesitoreji"</string>
+ <string name="root_type_shortcut" msgid="3318760609471618093">"Izinqamuleli"</string>
+ <string name="root_type_device" msgid="7121342474653483538">"Amadivayisi"</string>
+ <string name="root_type_apps" msgid="8838065367985945189">"Izinhlelo zokusebenza eziningi"</string>
+ <string name="pref_advanced_devices" msgid="903257239609301276">"Bonisa amadivayisi aphakeme"</string>
+ <string name="pref_file_size" msgid="2826879315743961459">"Bonisa usayizi wefayela"</string>
+ <string name="pref_device_size" msgid="3542106883278997222">"Bonisa usayizi wedivayisi"</string>
+ <string name="empty" msgid="7858882803708117596">"Azikho izinto"</string>
+ <string name="toast_no_application" msgid="1339885974067891667">"Ayikwazi ukuvula ifayela"</string>
+ <string name="toast_failed_delete" msgid="2180678019407244069">"Ayikwazi ukususa amanye amadokhumenti"</string>
+ <string name="share_via" msgid="8966594246261344259">"Yabelana nge-"</string>
+</resources>
diff --git a/packages/ExternalStorageProvider/res/values-af/strings.xml b/packages/ExternalStorageProvider/res/values-af/strings.xml
new file mode 100644
index 0000000..1de881d
--- /dev/null
+++ b/packages/ExternalStorageProvider/res/values-af/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="7123375275748530234">"Eksterne berging"</string>
+ <string name="root_internal_storage" msgid="827844243068584127">"Interne berging"</string>
+ <string name="root_documents" msgid="4051252304075469250">"Dokumente"</string>
+</resources>
diff --git a/packages/ExternalStorageProvider/res/values-am/strings.xml b/packages/ExternalStorageProvider/res/values-am/strings.xml
new file mode 100644
index 0000000..230fb06
--- /dev/null
+++ b/packages/ExternalStorageProvider/res/values-am/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="7123375275748530234">"á‹áŒ«á‹Š ማከማቻ"</string>
+ <string name="root_internal_storage" msgid="827844243068584127">"á‹áˆµáŒ£á‹Š ማከማቻ"</string>
+ <string name="root_documents" msgid="4051252304075469250">"ሰáŠá‹¶á‰½"</string>
+</resources>
diff --git a/packages/ExternalStorageProvider/res/values-ar/strings.xml b/packages/ExternalStorageProvider/res/values-ar/strings.xml
new file mode 100644
index 0000000..b20a056
--- /dev/null
+++ b/packages/ExternalStorageProvider/res/values-ar/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="7123375275748530234">"وحدة تخزين خارجية"</string>
+ <string name="root_internal_storage" msgid="827844243068584127">"وحدة تخزين داخلية"</string>
+ <string name="root_documents" msgid="4051252304075469250">"مستندات"</string>
+</resources>
diff --git a/packages/ExternalStorageProvider/res/values-az-rAZ/strings.xml b/packages/ExternalStorageProvider/res/values-az-rAZ/strings.xml
new file mode 100644
index 0000000..a6a79ca8
--- /dev/null
+++ b/packages/ExternalStorageProvider/res/values-az-rAZ/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="7123375275748530234">"Xarici YaddaÅŸ"</string>
+ <string name="root_internal_storage" msgid="827844243068584127">"Daxili yaddaÅŸ"</string>
+</resources>
diff --git a/packages/ExternalStorageProvider/res/values-az/strings.xml b/packages/ExternalStorageProvider/res/values-az/strings.xml
new file mode 100644
index 0000000..a6a79ca8
--- /dev/null
+++ b/packages/ExternalStorageProvider/res/values-az/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="7123375275748530234">"Xarici YaddaÅŸ"</string>
+ <string name="root_internal_storage" msgid="827844243068584127">"Daxili yaddaÅŸ"</string>
+</resources>
diff --git a/packages/ExternalStorageProvider/res/values-bg/strings.xml b/packages/ExternalStorageProvider/res/values-bg/strings.xml
new file mode 100644
index 0000000..f5dce31
--- /dev/null
+++ b/packages/ExternalStorageProvider/res/values-bg/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="7123375275748530234">"Външно хранилище"</string>
+ <string name="root_internal_storage" msgid="827844243068584127">"Вътрешно хранилище"</string>
+ <string name="root_documents" msgid="4051252304075469250">"Документи"</string>
+</resources>
diff --git a/packages/ExternalStorageProvider/res/values-ca/strings.xml b/packages/ExternalStorageProvider/res/values-ca/strings.xml
new file mode 100644
index 0000000..15e9d46
--- /dev/null
+++ b/packages/ExternalStorageProvider/res/values-ca/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="7123375275748530234">"Emmagatzematge extern"</string>
+ <string name="root_internal_storage" msgid="827844243068584127">"Emmagatzematge intern"</string>
+ <string name="root_documents" msgid="4051252304075469250">"Documents"</string>
+</resources>
diff --git a/packages/ExternalStorageProvider/res/values-cs/strings.xml b/packages/ExternalStorageProvider/res/values-cs/strings.xml
new file mode 100644
index 0000000..b68a928
--- /dev/null
+++ b/packages/ExternalStorageProvider/res/values-cs/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="7123375275748530234">"Externí úložiště"</string>
+ <string name="root_internal_storage" msgid="827844243068584127">"Interní úložiště"</string>
+ <string name="root_documents" msgid="4051252304075469250">"Dokumenty"</string>
+</resources>
diff --git a/packages/ExternalStorageProvider/res/values-da/strings.xml b/packages/ExternalStorageProvider/res/values-da/strings.xml
new file mode 100644
index 0000000..a9ecb69
--- /dev/null
+++ b/packages/ExternalStorageProvider/res/values-da/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="7123375275748530234">"Ekstern lagring"</string>
+ <string name="root_internal_storage" msgid="827844243068584127">"Intern lagring"</string>
+ <string name="root_documents" msgid="4051252304075469250">"Dokumenter"</string>
+</resources>
diff --git a/packages/ExternalStorageProvider/res/values-de/strings.xml b/packages/ExternalStorageProvider/res/values-de/strings.xml
new file mode 100644
index 0000000..318634a
--- /dev/null
+++ b/packages/ExternalStorageProvider/res/values-de/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="7123375275748530234">"Externer Speicher"</string>
+ <string name="root_internal_storage" msgid="827844243068584127">"Interner Speicher"</string>
+ <string name="root_documents" msgid="4051252304075469250">"Dokumente"</string>
+</resources>
diff --git a/packages/ExternalStorageProvider/res/values-el/strings.xml b/packages/ExternalStorageProvider/res/values-el/strings.xml
new file mode 100644
index 0000000..b3aa792
--- /dev/null
+++ b/packages/ExternalStorageProvider/res/values-el/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="7123375275748530234">"ΕξωτεÏικός αποθηκευτικός χώÏος"</string>
+ <string name="root_internal_storage" msgid="827844243068584127">"ΕσωτεÏικός αποθηκευτικός χώÏος"</string>
+ <string name="root_documents" msgid="4051252304075469250">"ΈγγÏαφα"</string>
+</resources>
diff --git a/packages/ExternalStorageProvider/res/values-en-rGB/strings.xml b/packages/ExternalStorageProvider/res/values-en-rGB/strings.xml
new file mode 100644
index 0000000..f88eb9e
--- /dev/null
+++ b/packages/ExternalStorageProvider/res/values-en-rGB/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="7123375275748530234">"External Storage"</string>
+ <string name="root_internal_storage" msgid="827844243068584127">"Internal storage"</string>
+ <string name="root_documents" msgid="4051252304075469250">"Documents"</string>
+</resources>
diff --git a/packages/ExternalStorageProvider/res/values-en-rIN/strings.xml b/packages/ExternalStorageProvider/res/values-en-rIN/strings.xml
new file mode 100644
index 0000000..f88eb9e
--- /dev/null
+++ b/packages/ExternalStorageProvider/res/values-en-rIN/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="7123375275748530234">"External Storage"</string>
+ <string name="root_internal_storage" msgid="827844243068584127">"Internal storage"</string>
+ <string name="root_documents" msgid="4051252304075469250">"Documents"</string>
+</resources>
diff --git a/packages/ExternalStorageProvider/res/values-es-rUS/strings.xml b/packages/ExternalStorageProvider/res/values-es-rUS/strings.xml
new file mode 100644
index 0000000..e7e38b5
--- /dev/null
+++ b/packages/ExternalStorageProvider/res/values-es-rUS/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="7123375275748530234">"Almacenamiento externo"</string>
+ <string name="root_internal_storage" msgid="827844243068584127">"Almacenamiento interno"</string>
+ <string name="root_documents" msgid="4051252304075469250">"Documentos"</string>
+</resources>
diff --git a/packages/ExternalStorageProvider/res/values-es/strings.xml b/packages/ExternalStorageProvider/res/values-es/strings.xml
new file mode 100644
index 0000000..e7e38b5
--- /dev/null
+++ b/packages/ExternalStorageProvider/res/values-es/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="7123375275748530234">"Almacenamiento externo"</string>
+ <string name="root_internal_storage" msgid="827844243068584127">"Almacenamiento interno"</string>
+ <string name="root_documents" msgid="4051252304075469250">"Documentos"</string>
+</resources>
diff --git a/packages/ExternalStorageProvider/res/values-et-rEE/strings.xml b/packages/ExternalStorageProvider/res/values-et-rEE/strings.xml
new file mode 100644
index 0000000..6824e9d
--- /dev/null
+++ b/packages/ExternalStorageProvider/res/values-et-rEE/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="7123375275748530234">"Väline talletusruum"</string>
+ <string name="root_internal_storage" msgid="827844243068584127">"Sisemine salvestusruum"</string>
+ <string name="root_documents" msgid="4051252304075469250">"Dokumendid"</string>
+</resources>
diff --git a/packages/ExternalStorageProvider/res/values-fa/strings.xml b/packages/ExternalStorageProvider/res/values-fa/strings.xml
new file mode 100644
index 0000000..8471fc7
--- /dev/null
+++ b/packages/ExternalStorageProvider/res/values-fa/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="7123375275748530234">"ÙØ¶Ø§ÛŒ ذخیره خارجی"</string>
+ <string name="root_internal_storage" msgid="827844243068584127">"Ø­Ø§ÙØ¸Ù‡Ù” داخلی"</string>
+ <string name="root_documents" msgid="4051252304075469250">"اسناد"</string>
+</resources>
diff --git a/packages/ExternalStorageProvider/res/values-fi/strings.xml b/packages/ExternalStorageProvider/res/values-fi/strings.xml
new file mode 100644
index 0000000..9d1fbaa
--- /dev/null
+++ b/packages/ExternalStorageProvider/res/values-fi/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="7123375275748530234">"Ulkoinen tallennustila"</string>
+ <string name="root_internal_storage" msgid="827844243068584127">"Sisäinen tallennustila"</string>
+ <string name="root_documents" msgid="4051252304075469250">"Dokumentit"</string>
+</resources>
diff --git a/packages/ExternalStorageProvider/res/values-fr-rCA/strings.xml b/packages/ExternalStorageProvider/res/values-fr-rCA/strings.xml
new file mode 100644
index 0000000..b3fdd48
--- /dev/null
+++ b/packages/ExternalStorageProvider/res/values-fr-rCA/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="7123375275748530234">"Stockage externe"</string>
+ <string name="root_internal_storage" msgid="827844243068584127">"Mémoire de stockage interne"</string>
+ <string name="root_documents" msgid="4051252304075469250">"Documents"</string>
+</resources>
diff --git a/packages/ExternalStorageProvider/res/values-fr/strings.xml b/packages/ExternalStorageProvider/res/values-fr/strings.xml
new file mode 100644
index 0000000..b3fdd48
--- /dev/null
+++ b/packages/ExternalStorageProvider/res/values-fr/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="7123375275748530234">"Stockage externe"</string>
+ <string name="root_internal_storage" msgid="827844243068584127">"Mémoire de stockage interne"</string>
+ <string name="root_documents" msgid="4051252304075469250">"Documents"</string>
+</resources>
diff --git a/packages/ExternalStorageProvider/res/values-hi/strings.xml b/packages/ExternalStorageProvider/res/values-hi/strings.xml
new file mode 100644
index 0000000..1227bd4
--- /dev/null
+++ b/packages/ExternalStorageProvider/res/values-hi/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="7123375275748530234">"बाहरी संगà¥à¤°à¤¹à¤£"</string>
+ <string name="root_internal_storage" msgid="827844243068584127">"मोबाइल संगà¥à¤°à¤¹à¤£"</string>
+ <string name="root_documents" msgid="4051252304075469250">"दसà¥à¤¤à¤¾à¤µà¥‡à¤œà¤¼"</string>
+</resources>
diff --git a/packages/ExternalStorageProvider/res/values-hr/strings.xml b/packages/ExternalStorageProvider/res/values-hr/strings.xml
new file mode 100644
index 0000000..a74f8e8
--- /dev/null
+++ b/packages/ExternalStorageProvider/res/values-hr/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="7123375275748530234">"Vanjska pohrana"</string>
+ <string name="root_internal_storage" msgid="827844243068584127">"Unutarnja pohrana"</string>
+ <string name="root_documents" msgid="4051252304075469250">"Dokumenti"</string>
+</resources>
diff --git a/packages/ExternalStorageProvider/res/values-hu/strings.xml b/packages/ExternalStorageProvider/res/values-hu/strings.xml
new file mode 100644
index 0000000..3f72b41
--- /dev/null
+++ b/packages/ExternalStorageProvider/res/values-hu/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="7123375275748530234">"Külső tárhely"</string>
+ <string name="root_internal_storage" msgid="827844243068584127">"Belső tárhely"</string>
+ <string name="root_documents" msgid="4051252304075469250">"Dokumentumok"</string>
+</resources>
diff --git a/packages/ExternalStorageProvider/res/values-hy-rAM/strings.xml b/packages/ExternalStorageProvider/res/values-hy-rAM/strings.xml
new file mode 100644
index 0000000..5360124
--- /dev/null
+++ b/packages/ExternalStorageProvider/res/values-hy-rAM/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="7123375275748530234">"Ô±Ö€Õ¿Õ¡Ö„Õ«Õ¶ ÕºÕ¡Õ°Õ¸Ö"</string>
+ <string name="root_internal_storage" msgid="827844243068584127">"Õ†Õ¥Ö€Ö„Õ«Õ¶ ÕºÕ¡Õ°Õ¸Ö"</string>
+ <string name="root_documents" msgid="4051252304075469250">"Õ“Õ¡Õ½Õ¿Õ¡Õ©Õ²Õ©Õ¥Ö€"</string>
+</resources>
diff --git a/packages/ExternalStorageProvider/res/values-in/strings.xml b/packages/ExternalStorageProvider/res/values-in/strings.xml
new file mode 100644
index 0000000..42acde7
--- /dev/null
+++ b/packages/ExternalStorageProvider/res/values-in/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="7123375275748530234">"Penyimpanan Eksternal"</string>
+ <string name="root_internal_storage" msgid="827844243068584127">"Penyimpanan internal"</string>
+ <string name="root_documents" msgid="4051252304075469250">"Dokumen"</string>
+</resources>
diff --git a/packages/ExternalStorageProvider/res/values-it/strings.xml b/packages/ExternalStorageProvider/res/values-it/strings.xml
new file mode 100644
index 0000000..957b5ff
--- /dev/null
+++ b/packages/ExternalStorageProvider/res/values-it/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="7123375275748530234">"Archivio esterno"</string>
+ <string name="root_internal_storage" msgid="827844243068584127">"Memoria interna"</string>
+ <string name="root_documents" msgid="4051252304075469250">"Documenti"</string>
+</resources>
diff --git a/packages/ExternalStorageProvider/res/values-iw/strings.xml b/packages/ExternalStorageProvider/res/values-iw/strings.xml
new file mode 100644
index 0000000..775506a
--- /dev/null
+++ b/packages/ExternalStorageProvider/res/values-iw/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="7123375275748530234">"×חסון חיצוני"</string>
+ <string name="root_internal_storage" msgid="827844243068584127">"×חסון פנימי"</string>
+ <string name="root_documents" msgid="4051252304075469250">"מסמכי×"</string>
+</resources>
diff --git a/packages/ExternalStorageProvider/res/values-ja/strings.xml b/packages/ExternalStorageProvider/res/values-ja/strings.xml
new file mode 100644
index 0000000..188fca2
--- /dev/null
+++ b/packages/ExternalStorageProvider/res/values-ja/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="7123375275748530234">"外部ストレージ"</string>
+ <string name="root_internal_storage" msgid="827844243068584127">"内部ストレージ"</string>
+ <string name="root_documents" msgid="4051252304075469250">"ドキュメント"</string>
+</resources>
diff --git a/packages/ExternalStorageProvider/res/values-ka-rGE/strings.xml b/packages/ExternalStorageProvider/res/values-ka-rGE/strings.xml
new file mode 100644
index 0000000..cc04860
--- /dev/null
+++ b/packages/ExternalStorageProvider/res/values-ka-rGE/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="7123375275748530234">"გáƒáƒ áƒ” მეხსიერებáƒ"</string>
+ <string name="root_internal_storage" msgid="827844243068584127">"შიდრმეხსიერებáƒ"</string>
+ <string name="root_documents" msgid="4051252304075469250">"დáƒáƒ™áƒ£áƒ›áƒ”ნტები"</string>
+</resources>
diff --git a/packages/ExternalStorageProvider/res/values-km-rKH/strings.xml b/packages/ExternalStorageProvider/res/values-km-rKH/strings.xml
new file mode 100644
index 0000000..9cf76d4
--- /dev/null
+++ b/packages/ExternalStorageProvider/res/values-km-rKH/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="7123375275748530234">"ឧបករណáŸâ€‹â€‹áž•្ទុក​ážáž¶áž„ក្រៅ"</string>
+ <string name="root_internal_storage" msgid="827844243068584127">"ឧបករណáŸâ€‹áž•្ទុក​ážáž¶áž„​ក្នុង"</string>
+ <string name="root_documents" msgid="4051252304075469250">"ឯកសារ"</string>
+</resources>
diff --git a/packages/ExternalStorageProvider/res/values-ko/strings.xml b/packages/ExternalStorageProvider/res/values-ko/strings.xml
new file mode 100644
index 0000000..849d37e
--- /dev/null
+++ b/packages/ExternalStorageProvider/res/values-ko/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="7123375275748530234">"외부 저장소"</string>
+ <string name="root_internal_storage" msgid="827844243068584127">"내부 저장소"</string>
+ <string name="root_documents" msgid="4051252304075469250">"문서"</string>
+</resources>
diff --git a/packages/ExternalStorageProvider/res/values-lo-rLA/strings.xml b/packages/ExternalStorageProvider/res/values-lo-rLA/strings.xml
new file mode 100644
index 0000000..cecd9f5
--- /dev/null
+++ b/packages/ExternalStorageProvider/res/values-lo-rLA/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="7123375275748530234">"ບ່ອນຈັດເàºàº±àºšàº‚à»à»‰àº¡àº¹àº™àºžàº²àºàº™àº­àº"</string>
+ <string name="root_internal_storage" msgid="827844243068584127">"ບ່ອນຈັດເàºàº±àºšàº‚à»à»‰àº¡àº¹àº™àºžàº²àºà»ƒàº™"</string>
+ <string name="root_documents" msgid="4051252304075469250">"ເອ​àºàº°â€‹àºªàº²àº™"</string>
+</resources>
diff --git a/packages/ExternalStorageProvider/res/values-lt/strings.xml b/packages/ExternalStorageProvider/res/values-lt/strings.xml
new file mode 100644
index 0000000..240ea89
--- /dev/null
+++ b/packages/ExternalStorageProvider/res/values-lt/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="7123375275748530234">"Išorinė atmintinė"</string>
+ <string name="root_internal_storage" msgid="827844243068584127">"VidinÄ— atmintinÄ—"</string>
+ <string name="root_documents" msgid="4051252304075469250">"Dokumentai"</string>
+</resources>
diff --git a/packages/ExternalStorageProvider/res/values-lv/strings.xml b/packages/ExternalStorageProvider/res/values-lv/strings.xml
new file mode 100644
index 0000000..d308fe8
--- /dev/null
+++ b/packages/ExternalStorageProvider/res/values-lv/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="7123375275748530234">"Ä€rÄ“jÄ krÄtuve"</string>
+ <string name="root_internal_storage" msgid="827844243068584127">"IekšējÄ atmiņa"</string>
+ <string name="root_documents" msgid="4051252304075469250">"Dokumenti"</string>
+</resources>
diff --git a/packages/ExternalStorageProvider/res/values-mn-rMN/strings.xml b/packages/ExternalStorageProvider/res/values-mn-rMN/strings.xml
new file mode 100644
index 0000000..3d7b7f7
--- /dev/null
+++ b/packages/ExternalStorageProvider/res/values-mn-rMN/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="7123375275748530234">"Гадаад Ñан"</string>
+ <string name="root_internal_storage" msgid="827844243068584127">"Дотоод Ñан"</string>
+ <string name="root_documents" msgid="4051252304075469250">"Документүүд"</string>
+</resources>
diff --git a/packages/ExternalStorageProvider/res/values-mn/strings.xml b/packages/ExternalStorageProvider/res/values-mn/strings.xml
new file mode 100644
index 0000000..0193cdb
--- /dev/null
+++ b/packages/ExternalStorageProvider/res/values-mn/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="7123375275748530234">"Гадаад Ñан"</string>
+ <string name="root_internal_storage" msgid="827844243068584127">"Дотоод Ñан"</string>
+</resources>
diff --git a/packages/ExternalStorageProvider/res/values-ms-rMY/strings.xml b/packages/ExternalStorageProvider/res/values-ms-rMY/strings.xml
new file mode 100644
index 0000000..cb4d736
--- /dev/null
+++ b/packages/ExternalStorageProvider/res/values-ms-rMY/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="7123375275748530234">"Storan Luaran"</string>
+ <string name="root_internal_storage" msgid="827844243068584127">"Storan dalaman"</string>
+ <string name="root_documents" msgid="4051252304075469250">"Dokumen"</string>
+</resources>
diff --git a/packages/ExternalStorageProvider/res/values-nb/strings.xml b/packages/ExternalStorageProvider/res/values-nb/strings.xml
new file mode 100644
index 0000000..a9ecb69
--- /dev/null
+++ b/packages/ExternalStorageProvider/res/values-nb/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="7123375275748530234">"Ekstern lagring"</string>
+ <string name="root_internal_storage" msgid="827844243068584127">"Intern lagring"</string>
+ <string name="root_documents" msgid="4051252304075469250">"Dokumenter"</string>
+</resources>
diff --git a/packages/ExternalStorageProvider/res/values-ne-rNP/strings.xml b/packages/ExternalStorageProvider/res/values-ne-rNP/strings.xml
new file mode 100644
index 0000000..8a9454e
--- /dev/null
+++ b/packages/ExternalStorageProvider/res/values-ne-rNP/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="7123375275748530234">"बाहà¥à¤¯ भणà¥à¤¡à¤¾à¤°à¤£"</string>
+ <string name="root_internal_storage" msgid="827844243068584127">"आनà¥à¤¤à¤°à¤¿à¤• भणà¥à¤¡à¤¾à¤°à¤£"</string>
+</resources>
diff --git a/packages/ExternalStorageProvider/res/values-nl/strings.xml b/packages/ExternalStorageProvider/res/values-nl/strings.xml
new file mode 100644
index 0000000..bde6166
--- /dev/null
+++ b/packages/ExternalStorageProvider/res/values-nl/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="7123375275748530234">"Externe opslag"</string>
+ <string name="root_internal_storage" msgid="827844243068584127">"Interne opslag"</string>
+ <string name="root_documents" msgid="4051252304075469250">"Documenten"</string>
+</resources>
diff --git a/packages/ExternalStorageProvider/res/values-pl/strings.xml b/packages/ExternalStorageProvider/res/values-pl/strings.xml
new file mode 100644
index 0000000..6c5e7d7
--- /dev/null
+++ b/packages/ExternalStorageProvider/res/values-pl/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="7123375275748530234">"Pamięć zewnętrzna"</string>
+ <string name="root_internal_storage" msgid="827844243068584127">"Pamięć wewnętrzna"</string>
+ <string name="root_documents" msgid="4051252304075469250">"Dokumenty"</string>
+</resources>
diff --git a/packages/ExternalStorageProvider/res/values-pt-rPT/strings.xml b/packages/ExternalStorageProvider/res/values-pt-rPT/strings.xml
new file mode 100644
index 0000000..77c89b8
--- /dev/null
+++ b/packages/ExternalStorageProvider/res/values-pt-rPT/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="7123375275748530234">"Armazenamento externo"</string>
+ <string name="root_internal_storage" msgid="827844243068584127">"Armazenamento interno"</string>
+ <string name="root_documents" msgid="4051252304075469250">"Documentos"</string>
+</resources>
diff --git a/packages/ExternalStorageProvider/res/values-pt/strings.xml b/packages/ExternalStorageProvider/res/values-pt/strings.xml
new file mode 100644
index 0000000..77c89b8
--- /dev/null
+++ b/packages/ExternalStorageProvider/res/values-pt/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="7123375275748530234">"Armazenamento externo"</string>
+ <string name="root_internal_storage" msgid="827844243068584127">"Armazenamento interno"</string>
+ <string name="root_documents" msgid="4051252304075469250">"Documentos"</string>
+</resources>
diff --git a/packages/ExternalStorageProvider/res/values-ro/strings.xml b/packages/ExternalStorageProvider/res/values-ro/strings.xml
new file mode 100644
index 0000000..abd0b98
--- /dev/null
+++ b/packages/ExternalStorageProvider/res/values-ro/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="7123375275748530234">"Stocare externă"</string>
+ <string name="root_internal_storage" msgid="827844243068584127">"Stocare internă"</string>
+ <string name="root_documents" msgid="4051252304075469250">"Documente"</string>
+</resources>
diff --git a/packages/ExternalStorageProvider/res/values-ru/strings.xml b/packages/ExternalStorageProvider/res/values-ru/strings.xml
new file mode 100644
index 0000000..b6c1095
--- /dev/null
+++ b/packages/ExternalStorageProvider/res/values-ru/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="7123375275748530234">"Внешний накопитель"</string>
+ <string name="root_internal_storage" msgid="827844243068584127">"ВнутреннÑÑ Ð¿Ð°Ð¼Ñть"</string>
+ <string name="root_documents" msgid="4051252304075469250">"Документы"</string>
+</resources>
diff --git a/packages/ExternalStorageProvider/res/values-si-rLK/strings.xml b/packages/ExternalStorageProvider/res/values-si-rLK/strings.xml
new file mode 100644
index 0000000..de3f3e8
--- /dev/null
+++ b/packages/ExternalStorageProvider/res/values-si-rLK/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="7123375275748530234">"à¶¶à·à·„à·’à¶» ආචයනය"</string>
+ <string name="root_internal_storage" msgid="827844243068584127">"à¶…à¶·à·Šâ€à¶ºà¶±à·Šà¶­à¶» ආචයනය"</string>
+</resources>
diff --git a/packages/ExternalStorageProvider/res/values-sk/strings.xml b/packages/ExternalStorageProvider/res/values-sk/strings.xml
new file mode 100644
index 0000000..fd424c8
--- /dev/null
+++ b/packages/ExternalStorageProvider/res/values-sk/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="7123375275748530234">"Externý ukladací priestor"</string>
+ <string name="root_internal_storage" msgid="827844243068584127">"Interný ukladací priestor"</string>
+ <string name="root_documents" msgid="4051252304075469250">"Dokumenty"</string>
+</resources>
diff --git a/packages/ExternalStorageProvider/res/values-sl/strings.xml b/packages/ExternalStorageProvider/res/values-sl/strings.xml
new file mode 100644
index 0000000..6ffa698
--- /dev/null
+++ b/packages/ExternalStorageProvider/res/values-sl/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="7123375275748530234">"Zunanja shramba"</string>
+ <string name="root_internal_storage" msgid="827844243068584127">"Notranja shramba"</string>
+ <string name="root_documents" msgid="4051252304075469250">"Dokumenti"</string>
+</resources>
diff --git a/packages/ExternalStorageProvider/res/values-sr/strings.xml b/packages/ExternalStorageProvider/res/values-sr/strings.xml
new file mode 100644
index 0000000..54238a4
--- /dev/null
+++ b/packages/ExternalStorageProvider/res/values-sr/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="7123375275748530234">"Спољна меморија"</string>
+ <string name="root_internal_storage" msgid="827844243068584127">"Интерна меморија"</string>
+ <string name="root_documents" msgid="4051252304075469250">"Документи"</string>
+</resources>
diff --git a/packages/ExternalStorageProvider/res/values-sv/strings.xml b/packages/ExternalStorageProvider/res/values-sv/strings.xml
new file mode 100644
index 0000000..6eac11e
--- /dev/null
+++ b/packages/ExternalStorageProvider/res/values-sv/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="7123375275748530234">"Extern lagring"</string>
+ <string name="root_internal_storage" msgid="827844243068584127">"Intern lagring"</string>
+ <string name="root_documents" msgid="4051252304075469250">"Dokument"</string>
+</resources>
diff --git a/packages/ExternalStorageProvider/res/values-sw/strings.xml b/packages/ExternalStorageProvider/res/values-sw/strings.xml
new file mode 100644
index 0000000..0d0e483
--- /dev/null
+++ b/packages/ExternalStorageProvider/res/values-sw/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="7123375275748530234">"Hifadhi ya Nje"</string>
+ <string name="root_internal_storage" msgid="827844243068584127">"Hifadhi ya ndani"</string>
+ <string name="root_documents" msgid="4051252304075469250">"Hati"</string>
+</resources>
diff --git a/packages/ExternalStorageProvider/res/values-th/strings.xml b/packages/ExternalStorageProvider/res/values-th/strings.xml
new file mode 100644
index 0000000..796635e
--- /dev/null
+++ b/packages/ExternalStorageProvider/res/values-th/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="7123375275748530234">"ที่จัดเà¸à¹‡à¸šà¸‚้อมูลภายนอà¸"</string>
+ <string name="root_internal_storage" msgid="827844243068584127">"ที่จัดเà¸à¹‡à¸šà¸‚้อมูลภายใน"</string>
+ <string name="root_documents" msgid="4051252304075469250">"เอà¸à¸ªà¸²à¸£"</string>
+</resources>
diff --git a/packages/ExternalStorageProvider/res/values-tl/strings.xml b/packages/ExternalStorageProvider/res/values-tl/strings.xml
new file mode 100644
index 0000000..529cdc2
--- /dev/null
+++ b/packages/ExternalStorageProvider/res/values-tl/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="7123375275748530234">"External Storage"</string>
+ <string name="root_internal_storage" msgid="827844243068584127">"Internal storage"</string>
+ <string name="root_documents" msgid="4051252304075469250">"Mga Dokumento"</string>
+</resources>
diff --git a/packages/ExternalStorageProvider/res/values-tr/strings.xml b/packages/ExternalStorageProvider/res/values-tr/strings.xml
new file mode 100644
index 0000000..d6bd52a
--- /dev/null
+++ b/packages/ExternalStorageProvider/res/values-tr/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="7123375275748530234">"Harici Depolama"</string>
+ <string name="root_internal_storage" msgid="827844243068584127">"Dahili depolama"</string>
+ <string name="root_documents" msgid="4051252304075469250">"Dokümanlar"</string>
+</resources>
diff --git a/packages/ExternalStorageProvider/res/values-uk/strings.xml b/packages/ExternalStorageProvider/res/values-uk/strings.xml
new file mode 100644
index 0000000..b8206e0
--- /dev/null
+++ b/packages/ExternalStorageProvider/res/values-uk/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="7123375275748530234">"Ð—Ð¾Ð²Ð½Ñ–ÑˆÐ½Ñ Ð¿Ð°Ð¼â€™Ñть"</string>
+ <string name="root_internal_storage" msgid="827844243068584127">"Ð’Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð¿Ð°Ð¼â€™Ñть"</string>
+ <string name="root_documents" msgid="4051252304075469250">"Документи"</string>
+</resources>
diff --git a/packages/ExternalStorageProvider/res/values-vi/strings.xml b/packages/ExternalStorageProvider/res/values-vi/strings.xml
new file mode 100644
index 0000000..b171c93
--- /dev/null
+++ b/packages/ExternalStorageProvider/res/values-vi/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="7123375275748530234">"Bộ nhớ ngoài"</string>
+ <string name="root_internal_storage" msgid="827844243068584127">"Bá»™ nhá»› trong"</string>
+ <string name="root_documents" msgid="4051252304075469250">"Tài liệu"</string>
+</resources>
diff --git a/packages/ExternalStorageProvider/res/values-zh-rCN/strings.xml b/packages/ExternalStorageProvider/res/values-zh-rCN/strings.xml
new file mode 100644
index 0000000..7df77dd
--- /dev/null
+++ b/packages/ExternalStorageProvider/res/values-zh-rCN/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="7123375275748530234">"外部存储设备"</string>
+ <string name="root_internal_storage" msgid="827844243068584127">"内部存储空间"</string>
+ <string name="root_documents" msgid="4051252304075469250">"文档"</string>
+</resources>
diff --git a/packages/ExternalStorageProvider/res/values-zh-rHK/strings.xml b/packages/ExternalStorageProvider/res/values-zh-rHK/strings.xml
new file mode 100644
index 0000000..62d8afb
--- /dev/null
+++ b/packages/ExternalStorageProvider/res/values-zh-rHK/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="7123375275748530234">"外部儲存空間"</string>
+ <string name="root_internal_storage" msgid="827844243068584127">"內部儲存空間"</string>
+ <string name="root_documents" msgid="4051252304075469250">"文件"</string>
+</resources>
diff --git a/packages/ExternalStorageProvider/res/values-zh-rTW/strings.xml b/packages/ExternalStorageProvider/res/values-zh-rTW/strings.xml
new file mode 100644
index 0000000..62d8afb
--- /dev/null
+++ b/packages/ExternalStorageProvider/res/values-zh-rTW/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="7123375275748530234">"外部儲存空間"</string>
+ <string name="root_internal_storage" msgid="827844243068584127">"內部儲存空間"</string>
+ <string name="root_documents" msgid="4051252304075469250">"文件"</string>
+</resources>
diff --git a/packages/ExternalStorageProvider/res/values-zu/strings.xml b/packages/ExternalStorageProvider/res/values-zu/strings.xml
new file mode 100644
index 0000000..4a0a845
--- /dev/null
+++ b/packages/ExternalStorageProvider/res/values-zu/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="7123375275748530234">"Isitoreji sangaphandle"</string>
+ <string name="root_internal_storage" msgid="827844243068584127">"Isitoreji sangaphakathi"</string>
+ <string name="root_documents" msgid="4051252304075469250">"Amadokhumenti"</string>
+</resources>
diff --git a/packages/FusedLocation/res/values-af/strings.xml b/packages/FusedLocation/res/values-af/strings.xml
new file mode 100644
index 0000000..a321abe
--- /dev/null
+++ b/packages/FusedLocation/res/values-af/strings.xml
@@ -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="app_label" msgid="5379477904423203699">"Saamgesmelte ligging"</string>
+</resources>
diff --git a/packages/FusedLocation/res/values-am/strings.xml b/packages/FusedLocation/res/values-am/strings.xml
new file mode 100644
index 0000000..0d2cccc
--- /dev/null
+++ b/packages/FusedLocation/res/values-am/strings.xml
@@ -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="app_label" msgid="5379477904423203699">"Fused Location"</string>
+</resources>
diff --git a/packages/FusedLocation/res/values-ar/strings.xml b/packages/FusedLocation/res/values-ar/strings.xml
new file mode 100644
index 0000000..dfbcf7a
--- /dev/null
+++ b/packages/FusedLocation/res/values-ar/strings.xml
@@ -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="app_label" msgid="5379477904423203699">"الموقع المدمج"</string>
+</resources>
diff --git a/packages/FusedLocation/res/values-bg/strings.xml b/packages/FusedLocation/res/values-bg/strings.xml
new file mode 100644
index 0000000..0d2cccc
--- /dev/null
+++ b/packages/FusedLocation/res/values-bg/strings.xml
@@ -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="app_label" msgid="5379477904423203699">"Fused Location"</string>
+</resources>
diff --git a/packages/FusedLocation/res/values-ca/strings.xml b/packages/FusedLocation/res/values-ca/strings.xml
new file mode 100644
index 0000000..bdd55dd
--- /dev/null
+++ b/packages/FusedLocation/res/values-ca/strings.xml
@@ -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="app_label" msgid="5379477904423203699">"Ubicació unificada"</string>
+</resources>
diff --git a/packages/FusedLocation/res/values-cs/strings.xml b/packages/FusedLocation/res/values-cs/strings.xml
new file mode 100644
index 0000000..0d2cccc
--- /dev/null
+++ b/packages/FusedLocation/res/values-cs/strings.xml
@@ -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="app_label" msgid="5379477904423203699">"Fused Location"</string>
+</resources>
diff --git a/packages/FusedLocation/res/values-da/strings.xml b/packages/FusedLocation/res/values-da/strings.xml
new file mode 100644
index 0000000..0d2cccc
--- /dev/null
+++ b/packages/FusedLocation/res/values-da/strings.xml
@@ -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="app_label" msgid="5379477904423203699">"Fused Location"</string>
+</resources>
diff --git a/packages/FusedLocation/res/values-de/strings.xml b/packages/FusedLocation/res/values-de/strings.xml
new file mode 100644
index 0000000..0d2cccc
--- /dev/null
+++ b/packages/FusedLocation/res/values-de/strings.xml
@@ -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="app_label" msgid="5379477904423203699">"Fused Location"</string>
+</resources>
diff --git a/packages/FusedLocation/res/values-el/strings.xml b/packages/FusedLocation/res/values-el/strings.xml
new file mode 100644
index 0000000..1243b21
--- /dev/null
+++ b/packages/FusedLocation/res/values-el/strings.xml
@@ -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="app_label" msgid="5379477904423203699">"Ενοποιημένη τοποθεσία"</string>
+</resources>
diff --git a/packages/FusedLocation/res/values-en-rGB/strings.xml b/packages/FusedLocation/res/values-en-rGB/strings.xml
new file mode 100644
index 0000000..0d2cccc
--- /dev/null
+++ b/packages/FusedLocation/res/values-en-rGB/strings.xml
@@ -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="app_label" msgid="5379477904423203699">"Fused Location"</string>
+</resources>
diff --git a/packages/FusedLocation/res/values-en-rIN/strings.xml b/packages/FusedLocation/res/values-en-rIN/strings.xml
new file mode 100644
index 0000000..0d2cccc
--- /dev/null
+++ b/packages/FusedLocation/res/values-en-rIN/strings.xml
@@ -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="app_label" msgid="5379477904423203699">"Fused Location"</string>
+</resources>
diff --git a/packages/FusedLocation/res/values-es-rUS/strings.xml b/packages/FusedLocation/res/values-es-rUS/strings.xml
new file mode 100644
index 0000000..ec95314
--- /dev/null
+++ b/packages/FusedLocation/res/values-es-rUS/strings.xml
@@ -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="app_label" msgid="5379477904423203699">"Ubicación combinada"</string>
+</resources>
diff --git a/packages/FusedLocation/res/values-es/strings.xml b/packages/FusedLocation/res/values-es/strings.xml
new file mode 100644
index 0000000..ec95314
--- /dev/null
+++ b/packages/FusedLocation/res/values-es/strings.xml
@@ -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="app_label" msgid="5379477904423203699">"Ubicación combinada"</string>
+</resources>
diff --git a/packages/FusedLocation/res/values-et-rEE/strings.xml b/packages/FusedLocation/res/values-et-rEE/strings.xml
new file mode 100644
index 0000000..fcf4ef7
--- /dev/null
+++ b/packages/FusedLocation/res/values-et-rEE/strings.xml
@@ -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="app_label" msgid="5379477904423203699">"Liidetud asukoht"</string>
+</resources>
diff --git a/packages/FusedLocation/res/values-fa/strings.xml b/packages/FusedLocation/res/values-fa/strings.xml
new file mode 100644
index 0000000..0d2cccc
--- /dev/null
+++ b/packages/FusedLocation/res/values-fa/strings.xml
@@ -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="app_label" msgid="5379477904423203699">"Fused Location"</string>
+</resources>
diff --git a/packages/FusedLocation/res/values-fi/strings.xml b/packages/FusedLocation/res/values-fi/strings.xml
new file mode 100644
index 0000000..2d308b3
--- /dev/null
+++ b/packages/FusedLocation/res/values-fi/strings.xml
@@ -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="app_label" msgid="5379477904423203699">"Yhdistetty sijainti"</string>
+</resources>
diff --git a/packages/FusedLocation/res/values-fr-rCA/strings.xml b/packages/FusedLocation/res/values-fr-rCA/strings.xml
new file mode 100644
index 0000000..0d2cccc
--- /dev/null
+++ b/packages/FusedLocation/res/values-fr-rCA/strings.xml
@@ -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="app_label" msgid="5379477904423203699">"Fused Location"</string>
+</resources>
diff --git a/packages/FusedLocation/res/values-fr/strings.xml b/packages/FusedLocation/res/values-fr/strings.xml
new file mode 100644
index 0000000..0d2cccc
--- /dev/null
+++ b/packages/FusedLocation/res/values-fr/strings.xml
@@ -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="app_label" msgid="5379477904423203699">"Fused Location"</string>
+</resources>
diff --git a/packages/FusedLocation/res/values-hi/strings.xml b/packages/FusedLocation/res/values-hi/strings.xml
new file mode 100644
index 0000000..0d2cccc
--- /dev/null
+++ b/packages/FusedLocation/res/values-hi/strings.xml
@@ -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="app_label" msgid="5379477904423203699">"Fused Location"</string>
+</resources>
diff --git a/packages/FusedLocation/res/values-hr/strings.xml b/packages/FusedLocation/res/values-hr/strings.xml
new file mode 100644
index 0000000..b2a2cc9
--- /dev/null
+++ b/packages/FusedLocation/res/values-hr/strings.xml
@@ -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="app_label" msgid="5379477904423203699">"Lokacija iz kombiniranih izvora"</string>
+</resources>
diff --git a/packages/FusedLocation/res/values-hu/strings.xml b/packages/FusedLocation/res/values-hu/strings.xml
new file mode 100644
index 0000000..0d2cccc
--- /dev/null
+++ b/packages/FusedLocation/res/values-hu/strings.xml
@@ -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="app_label" msgid="5379477904423203699">"Fused Location"</string>
+</resources>
diff --git a/packages/FusedLocation/res/values-hy-rAM/strings.xml b/packages/FusedLocation/res/values-hy-rAM/strings.xml
new file mode 100644
index 0000000..0d2cccc
--- /dev/null
+++ b/packages/FusedLocation/res/values-hy-rAM/strings.xml
@@ -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="app_label" msgid="5379477904423203699">"Fused Location"</string>
+</resources>
diff --git a/packages/FusedLocation/res/values-in/strings.xml b/packages/FusedLocation/res/values-in/strings.xml
new file mode 100644
index 0000000..0d2cccc
--- /dev/null
+++ b/packages/FusedLocation/res/values-in/strings.xml
@@ -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="app_label" msgid="5379477904423203699">"Fused Location"</string>
+</resources>
diff --git a/packages/FusedLocation/res/values-it/strings.xml b/packages/FusedLocation/res/values-it/strings.xml
new file mode 100644
index 0000000..0d2cccc
--- /dev/null
+++ b/packages/FusedLocation/res/values-it/strings.xml
@@ -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="app_label" msgid="5379477904423203699">"Fused Location"</string>
+</resources>
diff --git a/packages/FusedLocation/res/values-iw/strings.xml b/packages/FusedLocation/res/values-iw/strings.xml
new file mode 100644
index 0000000..0d2cccc
--- /dev/null
+++ b/packages/FusedLocation/res/values-iw/strings.xml
@@ -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="app_label" msgid="5379477904423203699">"Fused Location"</string>
+</resources>
diff --git a/packages/FusedLocation/res/values-ja/strings.xml b/packages/FusedLocation/res/values-ja/strings.xml
new file mode 100644
index 0000000..0d2cccc
--- /dev/null
+++ b/packages/FusedLocation/res/values-ja/strings.xml
@@ -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="app_label" msgid="5379477904423203699">"Fused Location"</string>
+</resources>
diff --git a/packages/FusedLocation/res/values-ka-rGE/strings.xml b/packages/FusedLocation/res/values-ka-rGE/strings.xml
new file mode 100644
index 0000000..0d2cccc
--- /dev/null
+++ b/packages/FusedLocation/res/values-ka-rGE/strings.xml
@@ -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="app_label" msgid="5379477904423203699">"Fused Location"</string>
+</resources>
diff --git a/packages/FusedLocation/res/values-km-rKH/strings.xml b/packages/FusedLocation/res/values-km-rKH/strings.xml
new file mode 100644
index 0000000..649e4f7
--- /dev/null
+++ b/packages/FusedLocation/res/values-km-rKH/strings.xml
@@ -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="app_label" msgid="5379477904423203699">"ភ្ជាប់​ទីážáž¶áŸ†áž„"</string>
+</resources>
diff --git a/packages/FusedLocation/res/values-ko/strings.xml b/packages/FusedLocation/res/values-ko/strings.xml
new file mode 100644
index 0000000..0d2cccc
--- /dev/null
+++ b/packages/FusedLocation/res/values-ko/strings.xml
@@ -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="app_label" msgid="5379477904423203699">"Fused Location"</string>
+</resources>
diff --git a/packages/FusedLocation/res/values-lo-rLA/strings.xml b/packages/FusedLocation/res/values-lo-rLA/strings.xml
new file mode 100644
index 0000000..0d2cccc
--- /dev/null
+++ b/packages/FusedLocation/res/values-lo-rLA/strings.xml
@@ -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="app_label" msgid="5379477904423203699">"Fused Location"</string>
+</resources>
diff --git a/packages/FusedLocation/res/values-lt/strings.xml b/packages/FusedLocation/res/values-lt/strings.xml
new file mode 100644
index 0000000..0d2cccc
--- /dev/null
+++ b/packages/FusedLocation/res/values-lt/strings.xml
@@ -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="app_label" msgid="5379477904423203699">"Fused Location"</string>
+</resources>
diff --git a/packages/FusedLocation/res/values-lv/strings.xml b/packages/FusedLocation/res/values-lv/strings.xml
new file mode 100644
index 0000000..8c40cb2
--- /dev/null
+++ b/packages/FusedLocation/res/values-lv/strings.xml
@@ -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="app_label" msgid="5379477904423203699">"Apvienota atraÅ¡anÄs vieta"</string>
+</resources>
diff --git a/packages/FusedLocation/res/values-mn-rMN/strings.xml b/packages/FusedLocation/res/values-mn-rMN/strings.xml
new file mode 100644
index 0000000..8055ca8
--- /dev/null
+++ b/packages/FusedLocation/res/values-mn-rMN/strings.xml
@@ -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="app_label" msgid="5379477904423203699">"ÐÑгдмÑл байршил"</string>
+</resources>
diff --git a/packages/FusedLocation/res/values-ms-rMY/strings.xml b/packages/FusedLocation/res/values-ms-rMY/strings.xml
new file mode 100644
index 0000000..d345cb8
--- /dev/null
+++ b/packages/FusedLocation/res/values-ms-rMY/strings.xml
@@ -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="app_label" msgid="5379477904423203699">"Lokasi Terlakur"</string>
+</resources>
diff --git a/packages/FusedLocation/res/values-nb/strings.xml b/packages/FusedLocation/res/values-nb/strings.xml
new file mode 100644
index 0000000..0d2cccc
--- /dev/null
+++ b/packages/FusedLocation/res/values-nb/strings.xml
@@ -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="app_label" msgid="5379477904423203699">"Fused Location"</string>
+</resources>
diff --git a/packages/FusedLocation/res/values-nl/strings.xml b/packages/FusedLocation/res/values-nl/strings.xml
new file mode 100644
index 0000000..b3003c8
--- /dev/null
+++ b/packages/FusedLocation/res/values-nl/strings.xml
@@ -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="app_label" msgid="5379477904423203699">"Samengestelde locatie"</string>
+</resources>
diff --git a/packages/FusedLocation/res/values-pl/strings.xml b/packages/FusedLocation/res/values-pl/strings.xml
new file mode 100644
index 0000000..b3a9e2a
--- /dev/null
+++ b/packages/FusedLocation/res/values-pl/strings.xml
@@ -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="app_label" msgid="5379477904423203699">"Przybliżona lokalizacja"</string>
+</resources>
diff --git a/packages/FusedLocation/res/values-pt-rPT/strings.xml b/packages/FusedLocation/res/values-pt-rPT/strings.xml
new file mode 100644
index 0000000..2707fa9
--- /dev/null
+++ b/packages/FusedLocation/res/values-pt-rPT/strings.xml
@@ -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="app_label" msgid="5379477904423203699">"Localização Fundida"</string>
+</resources>
diff --git a/packages/FusedLocation/res/values-pt/strings.xml b/packages/FusedLocation/res/values-pt/strings.xml
new file mode 100644
index 0000000..cf5f5bf
--- /dev/null
+++ b/packages/FusedLocation/res/values-pt/strings.xml
@@ -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="app_label" msgid="5379477904423203699">"Localização fundida"</string>
+</resources>
diff --git a/packages/FusedLocation/res/values-ro/strings.xml b/packages/FusedLocation/res/values-ro/strings.xml
new file mode 100644
index 0000000..0d2cccc
--- /dev/null
+++ b/packages/FusedLocation/res/values-ro/strings.xml
@@ -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="app_label" msgid="5379477904423203699">"Fused Location"</string>
+</resources>
diff --git a/packages/FusedLocation/res/values-ru/strings.xml b/packages/FusedLocation/res/values-ru/strings.xml
new file mode 100644
index 0000000..40d9e6f
--- /dev/null
+++ b/packages/FusedLocation/res/values-ru/strings.xml
@@ -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="app_label" msgid="5379477904423203699">"Геоданные из неÑкольких иÑточников"</string>
+</resources>
diff --git a/packages/FusedLocation/res/values-sk/strings.xml b/packages/FusedLocation/res/values-sk/strings.xml
new file mode 100644
index 0000000..0d2cccc
--- /dev/null
+++ b/packages/FusedLocation/res/values-sk/strings.xml
@@ -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="app_label" msgid="5379477904423203699">"Fused Location"</string>
+</resources>
diff --git a/packages/FusedLocation/res/values-sl/strings.xml b/packages/FusedLocation/res/values-sl/strings.xml
new file mode 100644
index 0000000..928c50b
--- /dev/null
+++ b/packages/FusedLocation/res/values-sl/strings.xml
@@ -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="app_label" msgid="5379477904423203699">"Kombinirana lokacija"</string>
+</resources>
diff --git a/packages/FusedLocation/res/values-sr/strings.xml b/packages/FusedLocation/res/values-sr/strings.xml
new file mode 100644
index 0000000..0d2cccc
--- /dev/null
+++ b/packages/FusedLocation/res/values-sr/strings.xml
@@ -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="app_label" msgid="5379477904423203699">"Fused Location"</string>
+</resources>
diff --git a/packages/FusedLocation/res/values-sv/strings.xml b/packages/FusedLocation/res/values-sv/strings.xml
new file mode 100644
index 0000000..0d2cccc
--- /dev/null
+++ b/packages/FusedLocation/res/values-sv/strings.xml
@@ -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="app_label" msgid="5379477904423203699">"Fused Location"</string>
+</resources>
diff --git a/packages/FusedLocation/res/values-sw/strings.xml b/packages/FusedLocation/res/values-sw/strings.xml
new file mode 100644
index 0000000..60c235e
--- /dev/null
+++ b/packages/FusedLocation/res/values-sw/strings.xml
@@ -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="app_label" msgid="5379477904423203699">"Eneo Hakika"</string>
+</resources>
diff --git a/packages/FusedLocation/res/values-th/strings.xml b/packages/FusedLocation/res/values-th/strings.xml
new file mode 100644
index 0000000..0d2cccc
--- /dev/null
+++ b/packages/FusedLocation/res/values-th/strings.xml
@@ -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="app_label" msgid="5379477904423203699">"Fused Location"</string>
+</resources>
diff --git a/packages/FusedLocation/res/values-tl/strings.xml b/packages/FusedLocation/res/values-tl/strings.xml
new file mode 100644
index 0000000..94a2507
--- /dev/null
+++ b/packages/FusedLocation/res/values-tl/strings.xml
@@ -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="app_label" msgid="5379477904423203699">"Naka-fuse na Lokasyon"</string>
+</resources>
diff --git a/packages/FusedLocation/res/values-tr/strings.xml b/packages/FusedLocation/res/values-tr/strings.xml
new file mode 100644
index 0000000..0d2cccc
--- /dev/null
+++ b/packages/FusedLocation/res/values-tr/strings.xml
@@ -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="app_label" msgid="5379477904423203699">"Fused Location"</string>
+</resources>
diff --git a/packages/FusedLocation/res/values-uk/strings.xml b/packages/FusedLocation/res/values-uk/strings.xml
new file mode 100644
index 0000000..0d2cccc
--- /dev/null
+++ b/packages/FusedLocation/res/values-uk/strings.xml
@@ -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="app_label" msgid="5379477904423203699">"Fused Location"</string>
+</resources>
diff --git a/packages/FusedLocation/res/values-vi/strings.xml b/packages/FusedLocation/res/values-vi/strings.xml
new file mode 100644
index 0000000..e0e83a8
--- /dev/null
+++ b/packages/FusedLocation/res/values-vi/strings.xml
@@ -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="app_label" msgid="5379477904423203699">"Vị trí được hợp nhất"</string>
+</resources>
diff --git a/packages/FusedLocation/res/values-zh-rCN/strings.xml b/packages/FusedLocation/res/values-zh-rCN/strings.xml
new file mode 100644
index 0000000..e6d7bc1
--- /dev/null
+++ b/packages/FusedLocation/res/values-zh-rCN/strings.xml
@@ -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="app_label" msgid="5379477904423203699">"一体化ä½ç½®ä¿¡æ¯"</string>
+</resources>
diff --git a/packages/FusedLocation/res/values-zh-rHK/strings.xml b/packages/FusedLocation/res/values-zh-rHK/strings.xml
new file mode 100644
index 0000000..0d2cccc
--- /dev/null
+++ b/packages/FusedLocation/res/values-zh-rHK/strings.xml
@@ -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="app_label" msgid="5379477904423203699">"Fused Location"</string>
+</resources>
diff --git a/packages/FusedLocation/res/values-zh-rTW/strings.xml b/packages/FusedLocation/res/values-zh-rTW/strings.xml
new file mode 100644
index 0000000..0d2cccc
--- /dev/null
+++ b/packages/FusedLocation/res/values-zh-rTW/strings.xml
@@ -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="app_label" msgid="5379477904423203699">"Fused Location"</string>
+</resources>
diff --git a/packages/FusedLocation/res/values-zu/strings.xml b/packages/FusedLocation/res/values-zu/strings.xml
new file mode 100644
index 0000000..62d4359
--- /dev/null
+++ b/packages/FusedLocation/res/values-zu/strings.xml
@@ -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="app_label" msgid="5379477904423203699">"Indawo ehlanganisiwe"</string>
+</resources>
diff --git a/packages/InputDevices/res/values-af/strings.xml b/packages/InputDevices/res/values-af/strings.xml
new file mode 100644
index 0000000..13fcbb4
--- /dev/null
+++ b/packages/InputDevices/res/values-af/strings.xml
@@ -0,0 +1,37 @@
+<?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="app_label" msgid="8016145283189546017">"Invoertoestelle"</string>
+ <string name="keyboard_layouts_label" msgid="6688773268302087545">"Android-sleutelbord"</string>
+ <string name="keyboard_layout_english_uk_label" msgid="6664258463319999632">"Engels (VK)"</string>
+ <string name="keyboard_layout_english_us_label" msgid="8994890249649106291">"Engels (VS)"</string>
+ <string name="keyboard_layout_english_us_intl" msgid="3705168594034233583">"Engels (VS), internasionale styl"</string>
+ <string name="keyboard_layout_english_us_colemak_label" msgid="4194969610343455380">"Engels (VS), Colemak-styl"</string>
+ <string name="keyboard_layout_english_us_dvorak_label" msgid="793528923171145202">"Engels (VS), Dvorak-styl"</string>
+ <string name="keyboard_layout_german_label" msgid="8451565865467909999">"Duits"</string>
+ <string name="keyboard_layout_french_label" msgid="813450119589383723">"Frans"</string>
+ <string name="keyboard_layout_french_ca_label" msgid="365352601060604832">"Frans (Kanada)"</string>
+ <string name="keyboard_layout_russian_label" msgid="8724879775815042968">"Russies"</string>
+ <string name="keyboard_layout_russian_mac_label" msgid="3795866869038264796">"Russies, Mac-styl"</string>
+ <string name="keyboard_layout_spanish_label" msgid="7091555148131908240">"Spaans"</string>
+ <string name="keyboard_layout_swiss_french_label" msgid="4659191025396371684">"Switserse Frans"</string>
+ <string name="keyboard_layout_swiss_german_label" msgid="2305520941993314258">"Switserse Duits"</string>
+ <string name="keyboard_layout_belgian" msgid="2011984572838651558">"Belgies"</string>
+ <string name="keyboard_layout_bulgarian" msgid="8951224309972028398">"Bulgaars"</string>
+ <string name="keyboard_layout_italian" msgid="6497079660449781213">"Italiaans"</string>
+ <string name="keyboard_layout_danish" msgid="8036432066627127851">"Deens"</string>
+ <string name="keyboard_layout_norwegian" msgid="9090097917011040937">"Noors"</string>
+ <string name="keyboard_layout_swedish" msgid="732959109088479351">"Sweeds"</string>
+ <string name="keyboard_layout_finnish" msgid="5585659438924315466">"Fins"</string>
+ <string name="keyboard_layout_croatian" msgid="4172229471079281138">"Kroaties"</string>
+ <string name="keyboard_layout_czech" msgid="1349256901452975343">"Tsjeggies"</string>
+ <string name="keyboard_layout_estonian" msgid="8775830985185665274">"Estnies"</string>
+ <string name="keyboard_layout_hungarian" msgid="4154963661406035109">"Hongaars"</string>
+ <string name="keyboard_layout_icelandic" msgid="5836645650912489642">"Yslands"</string>
+ <string name="keyboard_layout_brazilian" msgid="5117896443147781939">"Brasiliaans"</string>
+ <string name="keyboard_layout_portuguese" msgid="2888198587329660305">"Portugees"</string>
+ <string name="keyboard_layout_slovak" msgid="2469379934672837296">"Slowaaks"</string>
+ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"Sloweens"</string>
+ <string name="keyboard_layout_turkish" msgid="7736163250907964898">"Turks"</string>
+ <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"Oekraïens"</string>
+</resources>
diff --git a/packages/InputDevices/res/values-am/strings.xml b/packages/InputDevices/res/values-am/strings.xml
new file mode 100644
index 0000000..d475772
--- /dev/null
+++ b/packages/InputDevices/res/values-am/strings.xml
@@ -0,0 +1,37 @@
+<?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="app_label" msgid="8016145283189546017">"የáŒá‰¤á‰µ መሣሪያዎች"</string>
+ <string name="keyboard_layouts_label" msgid="6688773268302087545">"የAndroid የá‰áˆá ሰሌዳ"</string>
+ <string name="keyboard_layout_english_uk_label" msgid="6664258463319999632">"እንáŒáˆŠá‹áŠ› (ዩኬ)"</string>
+ <string name="keyboard_layout_english_us_label" msgid="8994890249649106291">"እንáŒáˆŠá‹˜áŠ› (á‹©.ኤስ.)"</string>
+ <string name="keyboard_layout_english_us_intl" msgid="3705168594034233583">"እንáŒáˆŠá‹˜áŠ› (á‹©. ኤስ.)ᣠአለሠአቀá ቅጥ"</string>
+ <string name="keyboard_layout_english_us_colemak_label" msgid="4194969610343455380">"እንáŒáˆŠá‹˜áŠ› (á‹©. ኤስ.)ᣠየኮáˆáˆ›áˆ­áŠ­ ቅጥ"</string>
+ <string name="keyboard_layout_english_us_dvorak_label" msgid="793528923171145202">"እንáŒáˆŠá‹˜áŠ› (á‹©. ኤስ.)ᣠየድቮራክ ቅጥ"</string>
+ <string name="keyboard_layout_german_label" msgid="8451565865467909999">"ጀርመን"</string>
+ <string name="keyboard_layout_french_label" msgid="813450119589383723">"áˆáˆ¨áŠ•áˆ³á‹­áŠ›"</string>
+ <string name="keyboard_layout_french_ca_label" msgid="365352601060604832">"áˆáˆ¨áŠ•áˆ³á‹­áŠ› (ካናዳ)"</string>
+ <string name="keyboard_layout_russian_label" msgid="8724879775815042968">"ሩስያኛ"</string>
+ <string name="keyboard_layout_russian_mac_label" msgid="3795866869038264796">"ሩስያኛᣠMac ቅጥ"</string>
+ <string name="keyboard_layout_spanish_label" msgid="7091555148131908240">"ስá“ኒሽ"</string>
+ <string name="keyboard_layout_swiss_french_label" msgid="4659191025396371684">"የስዊዠáˆáˆ¨áŠ•áˆ³á‹­áŠ›"</string>
+ <string name="keyboard_layout_swiss_german_label" msgid="2305520941993314258">"የስዊዠጀርመን"</string>
+ <string name="keyboard_layout_belgian" msgid="2011984572838651558">"ቤáˆáŒ‚የáˆ"</string>
+ <string name="keyboard_layout_bulgarian" msgid="8951224309972028398">"ቡáˆáŒ‹áˆªá‹«"</string>
+ <string name="keyboard_layout_italian" msgid="6497079660449781213">"ጣሊያንኛ"</string>
+ <string name="keyboard_layout_danish" msgid="8036432066627127851">"ዴኒሽ"</string>
+ <string name="keyboard_layout_norwegian" msgid="9090097917011040937">"ኖርዌጂያ"</string>
+ <string name="keyboard_layout_swedish" msgid="732959109088479351">"ስዊድንኛ"</string>
+ <string name="keyboard_layout_finnish" msgid="5585659438924315466">"áŠáŠ’áˆ½"</string>
+ <string name="keyboard_layout_croatian" msgid="4172229471079281138">"ክሮሽያ"</string>
+ <string name="keyboard_layout_czech" msgid="1349256901452975343">"ቼክ"</string>
+ <string name="keyboard_layout_estonian" msgid="8775830985185665274">"ኤስቶኒያ"</string>
+ <string name="keyboard_layout_hungarian" msgid="4154963661406035109">"ሀንጋሪ"</string>
+ <string name="keyboard_layout_icelandic" msgid="5836645650912489642">"አይስላንድ"</string>
+ <string name="keyboard_layout_brazilian" msgid="5117896443147781939">"ብራዚáˆ"</string>
+ <string name="keyboard_layout_portuguese" msgid="2888198587329660305">"á–ርቹጋáˆ"</string>
+ <string name="keyboard_layout_slovak" msgid="2469379934672837296">"ስሎቫክ"</string>
+ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"ስሎቫኒያ"</string>
+ <string name="keyboard_layout_turkish" msgid="7736163250907964898">"ቱርክኛ"</string>
+ <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"ዩክሬን"</string>
+</resources>
diff --git a/packages/InputDevices/res/values-ar/strings.xml b/packages/InputDevices/res/values-ar/strings.xml
new file mode 100644
index 0000000..903d978
--- /dev/null
+++ b/packages/InputDevices/res/values-ar/strings.xml
@@ -0,0 +1,37 @@
+<?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="app_label" msgid="8016145283189546017">"أجهزة إدخال بيانات"</string>
+ <string name="keyboard_layouts_label" msgid="6688773268302087545">"â€Ù„وحة Ù…ÙØ§ØªÙŠØ­ Android"</string>
+ <string name="keyboard_layout_english_uk_label" msgid="6664258463319999632">"الإنجليزية (المملكة المتحدة)"</string>
+ <string name="keyboard_layout_english_us_label" msgid="8994890249649106291">"الإنجليزية (الولايات المتحدة)"</string>
+ <string name="keyboard_layout_english_us_intl" msgid="3705168594034233583">"الإنجليزية (الولايات المتحدة)، النمط الدولي"</string>
+ <string name="keyboard_layout_english_us_colemak_label" msgid="4194969610343455380">"â€Ø§Ù„إنجليزية (الولايات المتحدة)ØŒ نمط Colemak"</string>
+ <string name="keyboard_layout_english_us_dvorak_label" msgid="793528923171145202">"â€Ø§Ù„إنجليزية (الولايات المتحدة)ØŒ نمط Dvorak"</string>
+ <string name="keyboard_layout_german_label" msgid="8451565865467909999">"الألمانية"</string>
+ <string name="keyboard_layout_french_label" msgid="813450119589383723">"Ø§Ù„ÙØ±Ù†Ø³ÙŠØ©"</string>
+ <string name="keyboard_layout_french_ca_label" msgid="365352601060604832">"Ø§Ù„ÙØ±Ù†Ø³ÙŠØ© (كندا)"</string>
+ <string name="keyboard_layout_russian_label" msgid="8724879775815042968">"الروسية"</string>
+ <string name="keyboard_layout_russian_mac_label" msgid="3795866869038264796">"â€Ø§Ù„روسية، نمط Mac"</string>
+ <string name="keyboard_layout_spanish_label" msgid="7091555148131908240">"الإسبانية"</string>
+ <string name="keyboard_layout_swiss_french_label" msgid="4659191025396371684">"Ø§Ù„ÙØ±Ù†Ø³ÙŠØ© السويسرية"</string>
+ <string name="keyboard_layout_swiss_german_label" msgid="2305520941993314258">"الألمانية السويسرية"</string>
+ <string name="keyboard_layout_belgian" msgid="2011984572838651558">"البلجيكية"</string>
+ <string name="keyboard_layout_bulgarian" msgid="8951224309972028398">"البلغارية"</string>
+ <string name="keyboard_layout_italian" msgid="6497079660449781213">"الإيطالية"</string>
+ <string name="keyboard_layout_danish" msgid="8036432066627127851">"الدانماركية"</string>
+ <string name="keyboard_layout_norwegian" msgid="9090097917011040937">"النرويجية"</string>
+ <string name="keyboard_layout_swedish" msgid="732959109088479351">"السويدية"</string>
+ <string name="keyboard_layout_finnish" msgid="5585659438924315466">"الÙنلندية"</string>
+ <string name="keyboard_layout_croatian" msgid="4172229471079281138">"الكرواتية"</string>
+ <string name="keyboard_layout_czech" msgid="1349256901452975343">"التشيكية"</string>
+ <string name="keyboard_layout_estonian" msgid="8775830985185665274">"الإستونية"</string>
+ <string name="keyboard_layout_hungarian" msgid="4154963661406035109">"المجرية"</string>
+ <string name="keyboard_layout_icelandic" msgid="5836645650912489642">"الأيسلندية"</string>
+ <string name="keyboard_layout_brazilian" msgid="5117896443147781939">"البرازيلية"</string>
+ <string name="keyboard_layout_portuguese" msgid="2888198587329660305">"البرتغالية"</string>
+ <string name="keyboard_layout_slovak" msgid="2469379934672837296">"Ø§Ù„Ø³Ù„ÙˆÙØ§ÙƒÙŠØ©"</string>
+ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"السلوÙينية"</string>
+ <string name="keyboard_layout_turkish" msgid="7736163250907964898">"التركية"</string>
+ <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"الأوكرانية"</string>
+</resources>
diff --git a/packages/InputDevices/res/values-bg/strings.xml b/packages/InputDevices/res/values-bg/strings.xml
new file mode 100644
index 0000000..0c413a4
--- /dev/null
+++ b/packages/InputDevices/res/values-bg/strings.xml
@@ -0,0 +1,37 @@
+<?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="app_label" msgid="8016145283189546017">"Входни уÑтройÑтва"</string>
+ <string name="keyboard_layouts_label" msgid="6688773268302087545">"Клавиатура на Android"</string>
+ <string name="keyboard_layout_english_uk_label" msgid="6664258463319999632">"английÑки (ВеликобританиÑ)"</string>
+ <string name="keyboard_layout_english_us_label" msgid="8994890249649106291">"английÑки (СÐЩ)"</string>
+ <string name="keyboard_layout_english_us_intl" msgid="3705168594034233583">"англ. (СÐЩ) – Ñтил „Mеждународна“"</string>
+ <string name="keyboard_layout_english_us_colemak_label" msgid="4194969610343455380">"английÑки (СÐЩ) – Ñтил „Коулмак“"</string>
+ <string name="keyboard_layout_english_us_dvorak_label" msgid="793528923171145202">"английÑки (СÐЩ) – Ñтил „Дворак“"</string>
+ <string name="keyboard_layout_german_label" msgid="8451565865467909999">"немÑки"</string>
+ <string name="keyboard_layout_french_label" msgid="813450119589383723">"френÑки"</string>
+ <string name="keyboard_layout_french_ca_label" msgid="365352601060604832">"френÑки (Канада)"</string>
+ <string name="keyboard_layout_russian_label" msgid="8724879775815042968">"руÑки"</string>
+ <string name="keyboard_layout_russian_mac_label" msgid="3795866869038264796">"руÑки – Ñтил „Mac“"</string>
+ <string name="keyboard_layout_spanish_label" msgid="7091555148131908240">"иÑпанÑки"</string>
+ <string name="keyboard_layout_swiss_french_label" msgid="4659191025396371684">"швейцарÑки френÑки"</string>
+ <string name="keyboard_layout_swiss_german_label" msgid="2305520941993314258">"швейцарÑки немÑки"</string>
+ <string name="keyboard_layout_belgian" msgid="2011984572838651558">"белгийÑки"</string>
+ <string name="keyboard_layout_bulgarian" msgid="8951224309972028398">"българÑки"</string>
+ <string name="keyboard_layout_italian" msgid="6497079660449781213">"италианÑки"</string>
+ <string name="keyboard_layout_danish" msgid="8036432066627127851">"датÑки"</string>
+ <string name="keyboard_layout_norwegian" msgid="9090097917011040937">"норвежки"</string>
+ <string name="keyboard_layout_swedish" msgid="732959109088479351">"шведÑки"</string>
+ <string name="keyboard_layout_finnish" msgid="5585659438924315466">"финландÑки"</string>
+ <string name="keyboard_layout_croatian" msgid="4172229471079281138">"хърватÑки"</string>
+ <string name="keyboard_layout_czech" msgid="1349256901452975343">"чешки"</string>
+ <string name="keyboard_layout_estonian" msgid="8775830985185665274">"еÑтонÑки"</string>
+ <string name="keyboard_layout_hungarian" msgid="4154963661406035109">"унгарÑки"</string>
+ <string name="keyboard_layout_icelandic" msgid="5836645650912489642">"иÑландÑки"</string>
+ <string name="keyboard_layout_brazilian" msgid="5117896443147781939">"португалÑки (БразилиÑ)"</string>
+ <string name="keyboard_layout_portuguese" msgid="2888198587329660305">"португалÑки"</string>
+ <string name="keyboard_layout_slovak" msgid="2469379934672837296">"Ñловашки"</string>
+ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"ÑловенÑки"</string>
+ <string name="keyboard_layout_turkish" msgid="7736163250907964898">"турÑки"</string>
+ <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"украинÑки"</string>
+</resources>
diff --git a/packages/InputDevices/res/values-ca/strings.xml b/packages/InputDevices/res/values-ca/strings.xml
new file mode 100644
index 0000000..2021b8f
--- /dev/null
+++ b/packages/InputDevices/res/values-ca/strings.xml
@@ -0,0 +1,37 @@
+<?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="app_label" msgid="8016145283189546017">"Dispositius d’entrada"</string>
+ <string name="keyboard_layouts_label" msgid="6688773268302087545">"Teclat Android"</string>
+ <string name="keyboard_layout_english_uk_label" msgid="6664258463319999632">"Anglès (RU)"</string>
+ <string name="keyboard_layout_english_us_label" msgid="8994890249649106291">"Anglès (EUA)"</string>
+ <string name="keyboard_layout_english_us_intl" msgid="3705168594034233583">"Anglès (EUA), estil internacional"</string>
+ <string name="keyboard_layout_english_us_colemak_label" msgid="4194969610343455380">"Anglès (EUA), estil Colemak"</string>
+ <string name="keyboard_layout_english_us_dvorak_label" msgid="793528923171145202">"Anglès (EUA), estil Dvorak"</string>
+ <string name="keyboard_layout_german_label" msgid="8451565865467909999">"Alemany"</string>
+ <string name="keyboard_layout_french_label" msgid="813450119589383723">"Francès"</string>
+ <string name="keyboard_layout_french_ca_label" msgid="365352601060604832">"Francès (Canadà)"</string>
+ <string name="keyboard_layout_russian_label" msgid="8724879775815042968">"Rus"</string>
+ <string name="keyboard_layout_russian_mac_label" msgid="3795866869038264796">"Rus, estil Mac"</string>
+ <string name="keyboard_layout_spanish_label" msgid="7091555148131908240">"Espanyol"</string>
+ <string name="keyboard_layout_swiss_french_label" msgid="4659191025396371684">"Francès suís"</string>
+ <string name="keyboard_layout_swiss_german_label" msgid="2305520941993314258">"Alemany suís"</string>
+ <string name="keyboard_layout_belgian" msgid="2011984572838651558">"Belga"</string>
+ <string name="keyboard_layout_bulgarian" msgid="8951224309972028398">"Búlgar"</string>
+ <string name="keyboard_layout_italian" msgid="6497079660449781213">"Italià"</string>
+ <string name="keyboard_layout_danish" msgid="8036432066627127851">"Danès"</string>
+ <string name="keyboard_layout_norwegian" msgid="9090097917011040937">"Noruec"</string>
+ <string name="keyboard_layout_swedish" msgid="732959109088479351">"Suec"</string>
+ <string name="keyboard_layout_finnish" msgid="5585659438924315466">"Finès"</string>
+ <string name="keyboard_layout_croatian" msgid="4172229471079281138">"Croat"</string>
+ <string name="keyboard_layout_czech" msgid="1349256901452975343">"Txec"</string>
+ <string name="keyboard_layout_estonian" msgid="8775830985185665274">"Estonià"</string>
+ <string name="keyboard_layout_hungarian" msgid="4154963661406035109">"Hongarès"</string>
+ <string name="keyboard_layout_icelandic" msgid="5836645650912489642">"Islandès"</string>
+ <string name="keyboard_layout_brazilian" msgid="5117896443147781939">"Brasiler"</string>
+ <string name="keyboard_layout_portuguese" msgid="2888198587329660305">"Portuguès"</string>
+ <string name="keyboard_layout_slovak" msgid="2469379934672837296">"Eslovac"</string>
+ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"Eslovè"</string>
+ <string name="keyboard_layout_turkish" msgid="7736163250907964898">"Turc"</string>
+ <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"Ucraïnès"</string>
+</resources>
diff --git a/packages/InputDevices/res/values-cs/strings.xml b/packages/InputDevices/res/values-cs/strings.xml
new file mode 100644
index 0000000..33b420e
--- /dev/null
+++ b/packages/InputDevices/res/values-cs/strings.xml
@@ -0,0 +1,37 @@
+<?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="app_label" msgid="8016145283189546017">"Vstupní zařízení"</string>
+ <string name="keyboard_layouts_label" msgid="6688773268302087545">"Klávesnice Android"</string>
+ <string name="keyboard_layout_english_uk_label" msgid="6664258463319999632">"anglické (Spojené království)"</string>
+ <string name="keyboard_layout_english_us_label" msgid="8994890249649106291">"anglické (USA)"</string>
+ <string name="keyboard_layout_english_us_intl" msgid="3705168594034233583">"anglické (USA), mezinárodní"</string>
+ <string name="keyboard_layout_english_us_colemak_label" msgid="4194969610343455380">"anglické (USA), styl Colemak"</string>
+ <string name="keyboard_layout_english_us_dvorak_label" msgid="793528923171145202">"anglické (USA), styl Dvorak"</string>
+ <string name="keyboard_layout_german_label" msgid="8451565865467909999">"německé"</string>
+ <string name="keyboard_layout_french_label" msgid="813450119589383723">"francouzské"</string>
+ <string name="keyboard_layout_french_ca_label" msgid="365352601060604832">"francouzské (Kanada)"</string>
+ <string name="keyboard_layout_russian_label" msgid="8724879775815042968">"ruské"</string>
+ <string name="keyboard_layout_russian_mac_label" msgid="3795866869038264796">"ruské, styl Mac"</string>
+ <string name="keyboard_layout_spanish_label" msgid="7091555148131908240">"španělské"</string>
+ <string name="keyboard_layout_swiss_french_label" msgid="4659191025396371684">"švýcarské (francouzština)"</string>
+ <string name="keyboard_layout_swiss_german_label" msgid="2305520941993314258">"Å¡výcarské (nÄ›mÄina)"</string>
+ <string name="keyboard_layout_belgian" msgid="2011984572838651558">"belgické"</string>
+ <string name="keyboard_layout_bulgarian" msgid="8951224309972028398">"bulharské"</string>
+ <string name="keyboard_layout_italian" msgid="6497079660449781213">"italské"</string>
+ <string name="keyboard_layout_danish" msgid="8036432066627127851">"dánské"</string>
+ <string name="keyboard_layout_norwegian" msgid="9090097917011040937">"norské"</string>
+ <string name="keyboard_layout_swedish" msgid="732959109088479351">"švédské"</string>
+ <string name="keyboard_layout_finnish" msgid="5585659438924315466">"finské"</string>
+ <string name="keyboard_layout_croatian" msgid="4172229471079281138">"chorvatské"</string>
+ <string name="keyboard_layout_czech" msgid="1349256901452975343">"Äeské"</string>
+ <string name="keyboard_layout_estonian" msgid="8775830985185665274">"estonské"</string>
+ <string name="keyboard_layout_hungarian" msgid="4154963661406035109">"maÄarské"</string>
+ <string name="keyboard_layout_icelandic" msgid="5836645650912489642">"islandské"</string>
+ <string name="keyboard_layout_brazilian" msgid="5117896443147781939">"brazilské"</string>
+ <string name="keyboard_layout_portuguese" msgid="2888198587329660305">"portugalské"</string>
+ <string name="keyboard_layout_slovak" msgid="2469379934672837296">"slovenské"</string>
+ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"slovinské"</string>
+ <string name="keyboard_layout_turkish" msgid="7736163250907964898">"turecké"</string>
+ <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"ukrajinské"</string>
+</resources>
diff --git a/packages/InputDevices/res/values-da/strings.xml b/packages/InputDevices/res/values-da/strings.xml
new file mode 100644
index 0000000..fc07db2
--- /dev/null
+++ b/packages/InputDevices/res/values-da/strings.xml
@@ -0,0 +1,37 @@
+<?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="app_label" msgid="8016145283189546017">"Inputenheder"</string>
+ <string name="keyboard_layouts_label" msgid="6688773268302087545">"Android-tastatur"</string>
+ <string name="keyboard_layout_english_uk_label" msgid="6664258463319999632">"Engelsk (UK)"</string>
+ <string name="keyboard_layout_english_us_label" msgid="8994890249649106291">"Engelsk (USA)"</string>
+ <string name="keyboard_layout_english_us_intl" msgid="3705168594034233583">"Engelsk (USA), international stil"</string>
+ <string name="keyboard_layout_english_us_colemak_label" msgid="4194969610343455380">"Engelsk (USA), Colemak-stil"</string>
+ <string name="keyboard_layout_english_us_dvorak_label" msgid="793528923171145202">"Engelsk (USA), Dvorak-stil"</string>
+ <string name="keyboard_layout_german_label" msgid="8451565865467909999">"Tysk"</string>
+ <string name="keyboard_layout_french_label" msgid="813450119589383723">"Fransk"</string>
+ <string name="keyboard_layout_french_ca_label" msgid="365352601060604832">"Fransk (Canada)"</string>
+ <string name="keyboard_layout_russian_label" msgid="8724879775815042968">"Russisk"</string>
+ <string name="keyboard_layout_russian_mac_label" msgid="3795866869038264796">"Russisk, Mac-stil"</string>
+ <string name="keyboard_layout_spanish_label" msgid="7091555148131908240">"Spansk"</string>
+ <string name="keyboard_layout_swiss_french_label" msgid="4659191025396371684">"Schweizisk fransk"</string>
+ <string name="keyboard_layout_swiss_german_label" msgid="2305520941993314258">"Schweizertysk"</string>
+ <string name="keyboard_layout_belgian" msgid="2011984572838651558">"Belgisk"</string>
+ <string name="keyboard_layout_bulgarian" msgid="8951224309972028398">"Bulgarsk"</string>
+ <string name="keyboard_layout_italian" msgid="6497079660449781213">"Italiensk"</string>
+ <string name="keyboard_layout_danish" msgid="8036432066627127851">"Dansk"</string>
+ <string name="keyboard_layout_norwegian" msgid="9090097917011040937">"Norsk"</string>
+ <string name="keyboard_layout_swedish" msgid="732959109088479351">"Svensk"</string>
+ <string name="keyboard_layout_finnish" msgid="5585659438924315466">"Finsk"</string>
+ <string name="keyboard_layout_croatian" msgid="4172229471079281138">"Kroatisk"</string>
+ <string name="keyboard_layout_czech" msgid="1349256901452975343">"Tjekkisk"</string>
+ <string name="keyboard_layout_estonian" msgid="8775830985185665274">"Estisk"</string>
+ <string name="keyboard_layout_hungarian" msgid="4154963661406035109">"Ungarsk"</string>
+ <string name="keyboard_layout_icelandic" msgid="5836645650912489642">"Islandsk"</string>
+ <string name="keyboard_layout_brazilian" msgid="5117896443147781939">"Brasiliansk"</string>
+ <string name="keyboard_layout_portuguese" msgid="2888198587329660305">"Portugisisk"</string>
+ <string name="keyboard_layout_slovak" msgid="2469379934672837296">"Slovakisk"</string>
+ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"Slovensk"</string>
+ <string name="keyboard_layout_turkish" msgid="7736163250907964898">"Tyrkisk"</string>
+ <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"Ukrainsk"</string>
+</resources>
diff --git a/packages/InputDevices/res/values-de/strings.xml b/packages/InputDevices/res/values-de/strings.xml
new file mode 100644
index 0000000..b5c3b50
--- /dev/null
+++ b/packages/InputDevices/res/values-de/strings.xml
@@ -0,0 +1,37 @@
+<?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="app_label" msgid="8016145283189546017">"Eingabegeräte"</string>
+ <string name="keyboard_layouts_label" msgid="6688773268302087545">"Android-Tastatur"</string>
+ <string name="keyboard_layout_english_uk_label" msgid="6664258463319999632">"Englisch (Großbritannien)"</string>
+ <string name="keyboard_layout_english_us_label" msgid="8994890249649106291">"Englisch (USA)"</string>
+ <string name="keyboard_layout_english_us_intl" msgid="3705168594034233583">"Englisch (USA), international"</string>
+ <string name="keyboard_layout_english_us_colemak_label" msgid="4194969610343455380">"Englisch (USA), Colemak"</string>
+ <string name="keyboard_layout_english_us_dvorak_label" msgid="793528923171145202">"Englisch (USA), Dvorak"</string>
+ <string name="keyboard_layout_german_label" msgid="8451565865467909999">"Deutsch"</string>
+ <string name="keyboard_layout_french_label" msgid="813450119589383723">"Französisch"</string>
+ <string name="keyboard_layout_french_ca_label" msgid="365352601060604832">"Französisch (Kanada)"</string>
+ <string name="keyboard_layout_russian_label" msgid="8724879775815042968">"Russisch"</string>
+ <string name="keyboard_layout_russian_mac_label" msgid="3795866869038264796">"Russisch, Mac"</string>
+ <string name="keyboard_layout_spanish_label" msgid="7091555148131908240">"Spanisch"</string>
+ <string name="keyboard_layout_swiss_french_label" msgid="4659191025396371684">"Schweizer Französisch"</string>
+ <string name="keyboard_layout_swiss_german_label" msgid="2305520941993314258">"Schweizerdeutsch"</string>
+ <string name="keyboard_layout_belgian" msgid="2011984572838651558">"Belgisch"</string>
+ <string name="keyboard_layout_bulgarian" msgid="8951224309972028398">"Bulgarisch"</string>
+ <string name="keyboard_layout_italian" msgid="6497079660449781213">"Italienisch"</string>
+ <string name="keyboard_layout_danish" msgid="8036432066627127851">"Dänisch"</string>
+ <string name="keyboard_layout_norwegian" msgid="9090097917011040937">"Norwegisch"</string>
+ <string name="keyboard_layout_swedish" msgid="732959109088479351">"Schwedisch"</string>
+ <string name="keyboard_layout_finnish" msgid="5585659438924315466">"Finnisch"</string>
+ <string name="keyboard_layout_croatian" msgid="4172229471079281138">"Kroatisch"</string>
+ <string name="keyboard_layout_czech" msgid="1349256901452975343">"Tschechisch"</string>
+ <string name="keyboard_layout_estonian" msgid="8775830985185665274">"Estnisch"</string>
+ <string name="keyboard_layout_hungarian" msgid="4154963661406035109">"Ungarisch"</string>
+ <string name="keyboard_layout_icelandic" msgid="5836645650912489642">"Isländisch"</string>
+ <string name="keyboard_layout_brazilian" msgid="5117896443147781939">"Brasilianisch"</string>
+ <string name="keyboard_layout_portuguese" msgid="2888198587329660305">"Portugiesisch"</string>
+ <string name="keyboard_layout_slovak" msgid="2469379934672837296">"Slowakisch"</string>
+ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"Slowenisch"</string>
+ <string name="keyboard_layout_turkish" msgid="7736163250907964898">"Türkisch"</string>
+ <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"Ukrainisch"</string>
+</resources>
diff --git a/packages/InputDevices/res/values-el/strings.xml b/packages/InputDevices/res/values-el/strings.xml
new file mode 100644
index 0000000..f5d57a0
--- /dev/null
+++ b/packages/InputDevices/res/values-el/strings.xml
@@ -0,0 +1,37 @@
+<?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="app_label" msgid="8016145283189546017">"Συσκευές εισόδου"</string>
+ <string name="keyboard_layouts_label" msgid="6688773268302087545">"ΠληκτÏολόγιο Android"</string>
+ <string name="keyboard_layout_english_uk_label" msgid="6664258463319999632">"Αγγλικά (ΗΒ)"</string>
+ <string name="keyboard_layout_english_us_label" msgid="8994890249649106291">"Αγγλικά (ΗΠΑ)"</string>
+ <string name="keyboard_layout_english_us_intl" msgid="3705168594034233583">"Αγγλικά (ΗΠΑ), Ï„Ïπου International"</string>
+ <string name="keyboard_layout_english_us_colemak_label" msgid="4194969610343455380">"Αγγλικά (ΗΠΑ), Ï„Ïπου Colemak"</string>
+ <string name="keyboard_layout_english_us_dvorak_label" msgid="793528923171145202">"Αγγλικά (ΗΠΑ), Ï„Ïπου Dvorak"</string>
+ <string name="keyboard_layout_german_label" msgid="8451565865467909999">"ΓεÏμανικά"</string>
+ <string name="keyboard_layout_french_label" msgid="813450119589383723">"Γαλλικά"</string>
+ <string name="keyboard_layout_french_ca_label" msgid="365352601060604832">"Γαλλικά (Καναδά)"</string>
+ <string name="keyboard_layout_russian_label" msgid="8724879775815042968">"Ρωσικά"</string>
+ <string name="keyboard_layout_russian_mac_label" msgid="3795866869038264796">"Ρωσικά, Ï„Ïπου Mac"</string>
+ <string name="keyboard_layout_spanish_label" msgid="7091555148131908240">"Ισπανικά"</string>
+ <string name="keyboard_layout_swiss_french_label" msgid="4659191025396371684">"Γαλλικά Ελβετίας"</string>
+ <string name="keyboard_layout_swiss_german_label" msgid="2305520941993314258">"ΓεÏμανικά Ελβετίας"</string>
+ <string name="keyboard_layout_belgian" msgid="2011984572838651558">"Βελγικά"</string>
+ <string name="keyboard_layout_bulgarian" msgid="8951224309972028398">"ΒουλγαÏικά"</string>
+ <string name="keyboard_layout_italian" msgid="6497079660449781213">"Ιταλικά"</string>
+ <string name="keyboard_layout_danish" msgid="8036432066627127851">"Δανικά"</string>
+ <string name="keyboard_layout_norwegian" msgid="9090097917011040937">"ÎοÏβηγικά"</string>
+ <string name="keyboard_layout_swedish" msgid="732959109088479351">"Σουηδικά"</string>
+ <string name="keyboard_layout_finnish" msgid="5585659438924315466">"Φινλανδικά"</string>
+ <string name="keyboard_layout_croatian" msgid="4172229471079281138">"ΚÏοατικά"</string>
+ <string name="keyboard_layout_czech" msgid="1349256901452975343">"Τσεχικά"</string>
+ <string name="keyboard_layout_estonian" msgid="8775830985185665274">"Εσθονικά"</string>
+ <string name="keyboard_layout_hungarian" msgid="4154963661406035109">"ΟυγγÏικά"</string>
+ <string name="keyboard_layout_icelandic" msgid="5836645650912489642">"Ισλανδικά"</string>
+ <string name="keyboard_layout_brazilian" msgid="5117896443147781939">"Î’Ïαζιλιάνικα"</string>
+ <string name="keyboard_layout_portuguese" msgid="2888198587329660305">"ΠοÏτογαλικά"</string>
+ <string name="keyboard_layout_slovak" msgid="2469379934672837296">"Σλοβακικά"</string>
+ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"Σλοβενικά"</string>
+ <string name="keyboard_layout_turkish" msgid="7736163250907964898">"ΤουÏκικά"</string>
+ <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"ΟυκÏανικά"</string>
+</resources>
diff --git a/packages/InputDevices/res/values-en-rGB/strings.xml b/packages/InputDevices/res/values-en-rGB/strings.xml
new file mode 100644
index 0000000..2d794a6
--- /dev/null
+++ b/packages/InputDevices/res/values-en-rGB/strings.xml
@@ -0,0 +1,37 @@
+<?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="app_label" msgid="8016145283189546017">"Input Devices"</string>
+ <string name="keyboard_layouts_label" msgid="6688773268302087545">"Android keyboard"</string>
+ <string name="keyboard_layout_english_uk_label" msgid="6664258463319999632">"English (UK)"</string>
+ <string name="keyboard_layout_english_us_label" msgid="8994890249649106291">"English (US)"</string>
+ <string name="keyboard_layout_english_us_intl" msgid="3705168594034233583">"English (US), International style"</string>
+ <string name="keyboard_layout_english_us_colemak_label" msgid="4194969610343455380">"English (US), Colemak style"</string>
+ <string name="keyboard_layout_english_us_dvorak_label" msgid="793528923171145202">"English (US), Dvorak style"</string>
+ <string name="keyboard_layout_german_label" msgid="8451565865467909999">"German"</string>
+ <string name="keyboard_layout_french_label" msgid="813450119589383723">"French"</string>
+ <string name="keyboard_layout_french_ca_label" msgid="365352601060604832">"French (Canada)"</string>
+ <string name="keyboard_layout_russian_label" msgid="8724879775815042968">"Russian"</string>
+ <string name="keyboard_layout_russian_mac_label" msgid="3795866869038264796">"Russian, Mac style"</string>
+ <string name="keyboard_layout_spanish_label" msgid="7091555148131908240">"Spanish"</string>
+ <string name="keyboard_layout_swiss_french_label" msgid="4659191025396371684">"Swiss French"</string>
+ <string name="keyboard_layout_swiss_german_label" msgid="2305520941993314258">"Swiss German"</string>
+ <string name="keyboard_layout_belgian" msgid="2011984572838651558">"Belgian"</string>
+ <string name="keyboard_layout_bulgarian" msgid="8951224309972028398">"Bulgarian"</string>
+ <string name="keyboard_layout_italian" msgid="6497079660449781213">"Italian"</string>
+ <string name="keyboard_layout_danish" msgid="8036432066627127851">"Danish"</string>
+ <string name="keyboard_layout_norwegian" msgid="9090097917011040937">"Norwegian"</string>
+ <string name="keyboard_layout_swedish" msgid="732959109088479351">"Swedish"</string>
+ <string name="keyboard_layout_finnish" msgid="5585659438924315466">"Finnish"</string>
+ <string name="keyboard_layout_croatian" msgid="4172229471079281138">"Croatian"</string>
+ <string name="keyboard_layout_czech" msgid="1349256901452975343">"Czech"</string>
+ <string name="keyboard_layout_estonian" msgid="8775830985185665274">"Estonian"</string>
+ <string name="keyboard_layout_hungarian" msgid="4154963661406035109">"Hungarian"</string>
+ <string name="keyboard_layout_icelandic" msgid="5836645650912489642">"Icelandic"</string>
+ <string name="keyboard_layout_brazilian" msgid="5117896443147781939">"Brazilian"</string>
+ <string name="keyboard_layout_portuguese" msgid="2888198587329660305">"Portuguese"</string>
+ <string name="keyboard_layout_slovak" msgid="2469379934672837296">"Slovak"</string>
+ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"Slovenian"</string>
+ <string name="keyboard_layout_turkish" msgid="7736163250907964898">"Turkish"</string>
+ <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"Ukrainian"</string>
+</resources>
diff --git a/packages/InputDevices/res/values-en-rIN/strings.xml b/packages/InputDevices/res/values-en-rIN/strings.xml
new file mode 100644
index 0000000..2d794a6
--- /dev/null
+++ b/packages/InputDevices/res/values-en-rIN/strings.xml
@@ -0,0 +1,37 @@
+<?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="app_label" msgid="8016145283189546017">"Input Devices"</string>
+ <string name="keyboard_layouts_label" msgid="6688773268302087545">"Android keyboard"</string>
+ <string name="keyboard_layout_english_uk_label" msgid="6664258463319999632">"English (UK)"</string>
+ <string name="keyboard_layout_english_us_label" msgid="8994890249649106291">"English (US)"</string>
+ <string name="keyboard_layout_english_us_intl" msgid="3705168594034233583">"English (US), International style"</string>
+ <string name="keyboard_layout_english_us_colemak_label" msgid="4194969610343455380">"English (US), Colemak style"</string>
+ <string name="keyboard_layout_english_us_dvorak_label" msgid="793528923171145202">"English (US), Dvorak style"</string>
+ <string name="keyboard_layout_german_label" msgid="8451565865467909999">"German"</string>
+ <string name="keyboard_layout_french_label" msgid="813450119589383723">"French"</string>
+ <string name="keyboard_layout_french_ca_label" msgid="365352601060604832">"French (Canada)"</string>
+ <string name="keyboard_layout_russian_label" msgid="8724879775815042968">"Russian"</string>
+ <string name="keyboard_layout_russian_mac_label" msgid="3795866869038264796">"Russian, Mac style"</string>
+ <string name="keyboard_layout_spanish_label" msgid="7091555148131908240">"Spanish"</string>
+ <string name="keyboard_layout_swiss_french_label" msgid="4659191025396371684">"Swiss French"</string>
+ <string name="keyboard_layout_swiss_german_label" msgid="2305520941993314258">"Swiss German"</string>
+ <string name="keyboard_layout_belgian" msgid="2011984572838651558">"Belgian"</string>
+ <string name="keyboard_layout_bulgarian" msgid="8951224309972028398">"Bulgarian"</string>
+ <string name="keyboard_layout_italian" msgid="6497079660449781213">"Italian"</string>
+ <string name="keyboard_layout_danish" msgid="8036432066627127851">"Danish"</string>
+ <string name="keyboard_layout_norwegian" msgid="9090097917011040937">"Norwegian"</string>
+ <string name="keyboard_layout_swedish" msgid="732959109088479351">"Swedish"</string>
+ <string name="keyboard_layout_finnish" msgid="5585659438924315466">"Finnish"</string>
+ <string name="keyboard_layout_croatian" msgid="4172229471079281138">"Croatian"</string>
+ <string name="keyboard_layout_czech" msgid="1349256901452975343">"Czech"</string>
+ <string name="keyboard_layout_estonian" msgid="8775830985185665274">"Estonian"</string>
+ <string name="keyboard_layout_hungarian" msgid="4154963661406035109">"Hungarian"</string>
+ <string name="keyboard_layout_icelandic" msgid="5836645650912489642">"Icelandic"</string>
+ <string name="keyboard_layout_brazilian" msgid="5117896443147781939">"Brazilian"</string>
+ <string name="keyboard_layout_portuguese" msgid="2888198587329660305">"Portuguese"</string>
+ <string name="keyboard_layout_slovak" msgid="2469379934672837296">"Slovak"</string>
+ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"Slovenian"</string>
+ <string name="keyboard_layout_turkish" msgid="7736163250907964898">"Turkish"</string>
+ <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"Ukrainian"</string>
+</resources>
diff --git a/packages/InputDevices/res/values-es-rUS/strings.xml b/packages/InputDevices/res/values-es-rUS/strings.xml
new file mode 100644
index 0000000..2d61b80
--- /dev/null
+++ b/packages/InputDevices/res/values-es-rUS/strings.xml
@@ -0,0 +1,37 @@
+<?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="app_label" msgid="8016145283189546017">"Dispositivos de entrada"</string>
+ <string name="keyboard_layouts_label" msgid="6688773268302087545">"Teclado de Android"</string>
+ <string name="keyboard_layout_english_uk_label" msgid="6664258463319999632">"Inglés (Reino Unido)"</string>
+ <string name="keyboard_layout_english_us_label" msgid="8994890249649106291">"Inglés (EE. UU.)"</string>
+ <string name="keyboard_layout_english_us_intl" msgid="3705168594034233583">"Inglés (EE. UU.), internacional"</string>
+ <string name="keyboard_layout_english_us_colemak_label" msgid="4194969610343455380">"Inglés (EE. UU.), Colemak"</string>
+ <string name="keyboard_layout_english_us_dvorak_label" msgid="793528923171145202">"Inglés (EE. UU.), Dvorak"</string>
+ <string name="keyboard_layout_german_label" msgid="8451565865467909999">"Alemán"</string>
+ <string name="keyboard_layout_french_label" msgid="813450119589383723">"Francés"</string>
+ <string name="keyboard_layout_french_ca_label" msgid="365352601060604832">"Francés (Canadá)"</string>
+ <string name="keyboard_layout_russian_label" msgid="8724879775815042968">"Ruso"</string>
+ <string name="keyboard_layout_russian_mac_label" msgid="3795866869038264796">"Ruso, Mac"</string>
+ <string name="keyboard_layout_spanish_label" msgid="7091555148131908240">"Español"</string>
+ <string name="keyboard_layout_swiss_french_label" msgid="4659191025396371684">"Francés de Suiza"</string>
+ <string name="keyboard_layout_swiss_german_label" msgid="2305520941993314258">"Alemán de Suiza"</string>
+ <string name="keyboard_layout_belgian" msgid="2011984572838651558">"Belga"</string>
+ <string name="keyboard_layout_bulgarian" msgid="8951224309972028398">"Búlgaro"</string>
+ <string name="keyboard_layout_italian" msgid="6497079660449781213">"Italiano"</string>
+ <string name="keyboard_layout_danish" msgid="8036432066627127851">"Danés"</string>
+ <string name="keyboard_layout_norwegian" msgid="9090097917011040937">"Noruego"</string>
+ <string name="keyboard_layout_swedish" msgid="732959109088479351">"Sueco"</string>
+ <string name="keyboard_layout_finnish" msgid="5585659438924315466">"Finlandés"</string>
+ <string name="keyboard_layout_croatian" msgid="4172229471079281138">"Croata"</string>
+ <string name="keyboard_layout_czech" msgid="1349256901452975343">"Checo"</string>
+ <string name="keyboard_layout_estonian" msgid="8775830985185665274">"Estonio"</string>
+ <string name="keyboard_layout_hungarian" msgid="4154963661406035109">"Húngaro"</string>
+ <string name="keyboard_layout_icelandic" msgid="5836645650912489642">"Islandés"</string>
+ <string name="keyboard_layout_brazilian" msgid="5117896443147781939">"Brasileño"</string>
+ <string name="keyboard_layout_portuguese" msgid="2888198587329660305">"Portugués"</string>
+ <string name="keyboard_layout_slovak" msgid="2469379934672837296">"Eslovaco"</string>
+ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"Esloveno"</string>
+ <string name="keyboard_layout_turkish" msgid="7736163250907964898">"Turco"</string>
+ <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"Ucraniano"</string>
+</resources>
diff --git a/packages/InputDevices/res/values-es/strings.xml b/packages/InputDevices/res/values-es/strings.xml
new file mode 100644
index 0000000..82ea4d6
--- /dev/null
+++ b/packages/InputDevices/res/values-es/strings.xml
@@ -0,0 +1,37 @@
+<?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="app_label" msgid="8016145283189546017">"Dispositivos de entrada"</string>
+ <string name="keyboard_layouts_label" msgid="6688773268302087545">"Teclado de Android"</string>
+ <string name="keyboard_layout_english_uk_label" msgid="6664258463319999632">"Inglés (Reino Unido)"</string>
+ <string name="keyboard_layout_english_us_label" msgid="8994890249649106291">"Inglés (EE.UU.)"</string>
+ <string name="keyboard_layout_english_us_intl" msgid="3705168594034233583">"Inglés (EE.UU.), estilo internacional"</string>
+ <string name="keyboard_layout_english_us_colemak_label" msgid="4194969610343455380">"Inglés (EE.UU.), estilo Colemak"</string>
+ <string name="keyboard_layout_english_us_dvorak_label" msgid="793528923171145202">"Inglés (EE.UU.), estilo Dvorak"</string>
+ <string name="keyboard_layout_german_label" msgid="8451565865467909999">"Alemán"</string>
+ <string name="keyboard_layout_french_label" msgid="813450119589383723">"Francés"</string>
+ <string name="keyboard_layout_french_ca_label" msgid="365352601060604832">"Francés (Canadá)"</string>
+ <string name="keyboard_layout_russian_label" msgid="8724879775815042968">"Ruso"</string>
+ <string name="keyboard_layout_russian_mac_label" msgid="3795866869038264796">"Ruso, estilo Mac"</string>
+ <string name="keyboard_layout_spanish_label" msgid="7091555148131908240">"Español"</string>
+ <string name="keyboard_layout_swiss_french_label" msgid="4659191025396371684">"Francés de Suiza"</string>
+ <string name="keyboard_layout_swiss_german_label" msgid="2305520941993314258">"Alemán suizo"</string>
+ <string name="keyboard_layout_belgian" msgid="2011984572838651558">"Belga"</string>
+ <string name="keyboard_layout_bulgarian" msgid="8951224309972028398">"Búlgaro"</string>
+ <string name="keyboard_layout_italian" msgid="6497079660449781213">"Italiano"</string>
+ <string name="keyboard_layout_danish" msgid="8036432066627127851">"Danés"</string>
+ <string name="keyboard_layout_norwegian" msgid="9090097917011040937">"Noruego"</string>
+ <string name="keyboard_layout_swedish" msgid="732959109088479351">"Sueco"</string>
+ <string name="keyboard_layout_finnish" msgid="5585659438924315466">"Finlandés"</string>
+ <string name="keyboard_layout_croatian" msgid="4172229471079281138">"Croata"</string>
+ <string name="keyboard_layout_czech" msgid="1349256901452975343">"Checo"</string>
+ <string name="keyboard_layout_estonian" msgid="8775830985185665274">"Estonio"</string>
+ <string name="keyboard_layout_hungarian" msgid="4154963661406035109">"Húngaro"</string>
+ <string name="keyboard_layout_icelandic" msgid="5836645650912489642">"Islandés"</string>
+ <string name="keyboard_layout_brazilian" msgid="5117896443147781939">"Brasileño"</string>
+ <string name="keyboard_layout_portuguese" msgid="2888198587329660305">"Portugués"</string>
+ <string name="keyboard_layout_slovak" msgid="2469379934672837296">"Eslovaco"</string>
+ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"Esloveno"</string>
+ <string name="keyboard_layout_turkish" msgid="7736163250907964898">"Turco"</string>
+ <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"Ucraniano"</string>
+</resources>
diff --git a/packages/InputDevices/res/values-et-rEE/strings.xml b/packages/InputDevices/res/values-et-rEE/strings.xml
new file mode 100644
index 0000000..5b4fa3b
--- /dev/null
+++ b/packages/InputDevices/res/values-et-rEE/strings.xml
@@ -0,0 +1,37 @@
+<?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="app_label" msgid="8016145283189546017">"Sisendseadmed"</string>
+ <string name="keyboard_layouts_label" msgid="6688773268302087545">"Androidi klaviatuur"</string>
+ <string name="keyboard_layout_english_uk_label" msgid="6664258463319999632">"Inglise (Ühendkuningriik)"</string>
+ <string name="keyboard_layout_english_us_label" msgid="8994890249649106291">"Inglise (USA)"</string>
+ <string name="keyboard_layout_english_us_intl" msgid="3705168594034233583">"Inglise (USA), rahvusvaheline stiil"</string>
+ <string name="keyboard_layout_english_us_colemak_label" msgid="4194969610343455380">"Inglise (USA), Colemaki stiil"</string>
+ <string name="keyboard_layout_english_us_dvorak_label" msgid="793528923171145202">"Inglise (USA), Dvoraki stiil"</string>
+ <string name="keyboard_layout_german_label" msgid="8451565865467909999">"Saksa"</string>
+ <string name="keyboard_layout_french_label" msgid="813450119589383723">"Prantsuse"</string>
+ <string name="keyboard_layout_french_ca_label" msgid="365352601060604832">"Prantsuse (Kanada)"</string>
+ <string name="keyboard_layout_russian_label" msgid="8724879775815042968">"Vene"</string>
+ <string name="keyboard_layout_russian_mac_label" msgid="3795866869038264796">"Vene, Maci stiil"</string>
+ <string name="keyboard_layout_spanish_label" msgid="7091555148131908240">"Hispaania"</string>
+ <string name="keyboard_layout_swiss_french_label" msgid="4659191025396371684">"Å veitsi prantsuse"</string>
+ <string name="keyboard_layout_swiss_german_label" msgid="2305520941993314258">"Å veitsisaksa"</string>
+ <string name="keyboard_layout_belgian" msgid="2011984572838651558">"Belgia"</string>
+ <string name="keyboard_layout_bulgarian" msgid="8951224309972028398">"Bulgaaria"</string>
+ <string name="keyboard_layout_italian" msgid="6497079660449781213">"Itaalia"</string>
+ <string name="keyboard_layout_danish" msgid="8036432066627127851">"Taani"</string>
+ <string name="keyboard_layout_norwegian" msgid="9090097917011040937">"Norra"</string>
+ <string name="keyboard_layout_swedish" msgid="732959109088479351">"Rootsi"</string>
+ <string name="keyboard_layout_finnish" msgid="5585659438924315466">"Soome"</string>
+ <string name="keyboard_layout_croatian" msgid="4172229471079281138">"Horvaatia"</string>
+ <string name="keyboard_layout_czech" msgid="1349256901452975343">"Tšehhi"</string>
+ <string name="keyboard_layout_estonian" msgid="8775830985185665274">"Eesti"</string>
+ <string name="keyboard_layout_hungarian" msgid="4154963661406035109">"Ungari"</string>
+ <string name="keyboard_layout_icelandic" msgid="5836645650912489642">"Islandi"</string>
+ <string name="keyboard_layout_brazilian" msgid="5117896443147781939">"Brasiilia"</string>
+ <string name="keyboard_layout_portuguese" msgid="2888198587329660305">"Portugali"</string>
+ <string name="keyboard_layout_slovak" msgid="2469379934672837296">"Slovaki"</string>
+ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"Sloveenia"</string>
+ <string name="keyboard_layout_turkish" msgid="7736163250907964898">"Türgi"</string>
+ <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"Ukraina"</string>
+</resources>
diff --git a/packages/InputDevices/res/values-fa/strings.xml b/packages/InputDevices/res/values-fa/strings.xml
new file mode 100644
index 0000000..06c7f3a
--- /dev/null
+++ b/packages/InputDevices/res/values-fa/strings.xml
@@ -0,0 +1,37 @@
+<?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="app_label" msgid="8016145283189546017">"Input Devices"</string>
+ <string name="keyboard_layouts_label" msgid="6688773268302087545">"â€ØµÙحه‌کلید Android"</string>
+ <string name="keyboard_layout_english_uk_label" msgid="6664258463319999632">"انگلیسی (بریتانیا)"</string>
+ <string name="keyboard_layout_english_us_label" msgid="8994890249649106291">"انگلیسی (امریکا)"</string>
+ <string name="keyboard_layout_english_us_intl" msgid="3705168594034233583">"انگلیسی (ایالات متحده)، سبک بین‌المللی"</string>
+ <string name="keyboard_layout_english_us_colemak_label" msgid="4194969610343455380">"â€Ø§Ù†Ú¯Ù„یسی (ایالات متحده)ØŒ سبک Colemak"</string>
+ <string name="keyboard_layout_english_us_dvorak_label" msgid="793528923171145202">"â€Ø§Ù†Ú¯Ù„یسی (ایالات متحده)ØŒ سبک Dvorak"</string>
+ <string name="keyboard_layout_german_label" msgid="8451565865467909999">"آلمانی"</string>
+ <string name="keyboard_layout_french_label" msgid="813450119589383723">"ÙØ±Ø§Ù†Ø³ÙˆÛŒ"</string>
+ <string name="keyboard_layout_french_ca_label" msgid="365352601060604832">"ÙØ±Ø§Ù†Ø³ÙˆÛŒ (کانادا)â€"</string>
+ <string name="keyboard_layout_russian_label" msgid="8724879775815042968">"روسی"</string>
+ <string name="keyboard_layout_russian_mac_label" msgid="3795866869038264796">"â€Ø±ÙˆØ³ÛŒØŒ سبک Mac"</string>
+ <string name="keyboard_layout_spanish_label" msgid="7091555148131908240">"اسپانیایی"</string>
+ <string name="keyboard_layout_swiss_french_label" msgid="4659191025396371684">"ÙØ±Ø§Ù†Ø³ÙˆÛŒ سوئیس"</string>
+ <string name="keyboard_layout_swiss_german_label" msgid="2305520941993314258">"آلمانی سوئیسی"</string>
+ <string name="keyboard_layout_belgian" msgid="2011984572838651558">"بلژیکی"</string>
+ <string name="keyboard_layout_bulgarian" msgid="8951224309972028398">"بلغاری"</string>
+ <string name="keyboard_layout_italian" msgid="6497079660449781213">"ایتالیایی"</string>
+ <string name="keyboard_layout_danish" msgid="8036432066627127851">"دانمارکی"</string>
+ <string name="keyboard_layout_norwegian" msgid="9090097917011040937">"نروژی"</string>
+ <string name="keyboard_layout_swedish" msgid="732959109088479351">"سوئدی"</string>
+ <string name="keyboard_layout_finnish" msgid="5585659438924315466">"Ùنلاندی"</string>
+ <string name="keyboard_layout_croatian" msgid="4172229471079281138">"کرواسی"</string>
+ <string name="keyboard_layout_czech" msgid="1349256901452975343">"Ú†Ú©"</string>
+ <string name="keyboard_layout_estonian" msgid="8775830985185665274">"استونیایی"</string>
+ <string name="keyboard_layout_hungarian" msgid="4154963661406035109">"مجارستانی"</string>
+ <string name="keyboard_layout_icelandic" msgid="5836645650912489642">"ایسلندی"</string>
+ <string name="keyboard_layout_brazilian" msgid="5117896443147781939">"برزیلی"</string>
+ <string name="keyboard_layout_portuguese" msgid="2888198587329660305">"پرتغالی"</string>
+ <string name="keyboard_layout_slovak" msgid="2469379934672837296">"اسلوواکی"</string>
+ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"اسلوونیایی"</string>
+ <string name="keyboard_layout_turkish" msgid="7736163250907964898">"ترکی"</string>
+ <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"اوکراینی"</string>
+</resources>
diff --git a/packages/InputDevices/res/values-fi/strings.xml b/packages/InputDevices/res/values-fi/strings.xml
new file mode 100644
index 0000000..428eb30
--- /dev/null
+++ b/packages/InputDevices/res/values-fi/strings.xml
@@ -0,0 +1,37 @@
+<?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="app_label" msgid="8016145283189546017">"Syöttölaitteet"</string>
+ <string name="keyboard_layouts_label" msgid="6688773268302087545">"Android-näppäimistö"</string>
+ <string name="keyboard_layout_english_uk_label" msgid="6664258463319999632">"englanti (Iso-Britannia)"</string>
+ <string name="keyboard_layout_english_us_label" msgid="8994890249649106291">"englanti (Yhdysvallat)"</string>
+ <string name="keyboard_layout_english_us_intl" msgid="3705168594034233583">"englanti (Yhdysvallat), kansainvälinen"</string>
+ <string name="keyboard_layout_english_us_colemak_label" msgid="4194969610343455380">"englanti (Yhdysvallat), Colemak"</string>
+ <string name="keyboard_layout_english_us_dvorak_label" msgid="793528923171145202">"englanti (Yhdysvallat), Dvorak"</string>
+ <string name="keyboard_layout_german_label" msgid="8451565865467909999">"saksa"</string>
+ <string name="keyboard_layout_french_label" msgid="813450119589383723">"ranska"</string>
+ <string name="keyboard_layout_french_ca_label" msgid="365352601060604832">"ranska (Kanada)"</string>
+ <string name="keyboard_layout_russian_label" msgid="8724879775815042968">"venäjä"</string>
+ <string name="keyboard_layout_russian_mac_label" msgid="3795866869038264796">"venäjä, Mac"</string>
+ <string name="keyboard_layout_spanish_label" msgid="7091555148131908240">"espanja"</string>
+ <string name="keyboard_layout_swiss_french_label" msgid="4659191025396371684">"sveitsinranska"</string>
+ <string name="keyboard_layout_swiss_german_label" msgid="2305520941993314258">"sveitsinsaksa"</string>
+ <string name="keyboard_layout_belgian" msgid="2011984572838651558">"belgialainen"</string>
+ <string name="keyboard_layout_bulgarian" msgid="8951224309972028398">"bulgaria"</string>
+ <string name="keyboard_layout_italian" msgid="6497079660449781213">"italia"</string>
+ <string name="keyboard_layout_danish" msgid="8036432066627127851">"tanska"</string>
+ <string name="keyboard_layout_norwegian" msgid="9090097917011040937">"norja"</string>
+ <string name="keyboard_layout_swedish" msgid="732959109088479351">"ruotsi"</string>
+ <string name="keyboard_layout_finnish" msgid="5585659438924315466">"suomi"</string>
+ <string name="keyboard_layout_croatian" msgid="4172229471079281138">"kroaatti"</string>
+ <string name="keyboard_layout_czech" msgid="1349256901452975343">"tšekki"</string>
+ <string name="keyboard_layout_estonian" msgid="8775830985185665274">"viro"</string>
+ <string name="keyboard_layout_hungarian" msgid="4154963661406035109">"unkari"</string>
+ <string name="keyboard_layout_icelandic" msgid="5836645650912489642">"islanti"</string>
+ <string name="keyboard_layout_brazilian" msgid="5117896443147781939">"brasilialainen"</string>
+ <string name="keyboard_layout_portuguese" msgid="2888198587329660305">"portugali"</string>
+ <string name="keyboard_layout_slovak" msgid="2469379934672837296">"slovakki"</string>
+ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"sloveeni"</string>
+ <string name="keyboard_layout_turkish" msgid="7736163250907964898">"turkki"</string>
+ <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"ukraina"</string>
+</resources>
diff --git a/packages/InputDevices/res/values-fr-rCA/strings.xml b/packages/InputDevices/res/values-fr-rCA/strings.xml
new file mode 100644
index 0000000..c947634
--- /dev/null
+++ b/packages/InputDevices/res/values-fr-rCA/strings.xml
@@ -0,0 +1,37 @@
+<?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="app_label" msgid="8016145283189546017">"Périphériques d\'entrée"</string>
+ <string name="keyboard_layouts_label" msgid="6688773268302087545">"Clavier Android"</string>
+ <string name="keyboard_layout_english_uk_label" msgid="6664258463319999632">"Anglais (britannique)"</string>
+ <string name="keyboard_layout_english_us_label" msgid="8994890249649106291">"Anglais (États-Unis)"</string>
+ <string name="keyboard_layout_english_us_intl" msgid="3705168594034233583">"Anglais (États-Unis), international"</string>
+ <string name="keyboard_layout_english_us_colemak_label" msgid="4194969610343455380">"Anglais (États-Unis), type Colemak"</string>
+ <string name="keyboard_layout_english_us_dvorak_label" msgid="793528923171145202">"Anglais (États-Unis), type Dvorak"</string>
+ <string name="keyboard_layout_german_label" msgid="8451565865467909999">"Allemand"</string>
+ <string name="keyboard_layout_french_label" msgid="813450119589383723">"Français"</string>
+ <string name="keyboard_layout_french_ca_label" msgid="365352601060604832">"Français (Canada)"</string>
+ <string name="keyboard_layout_russian_label" msgid="8724879775815042968">"Russe"</string>
+ <string name="keyboard_layout_russian_mac_label" msgid="3795866869038264796">"Russe, type Mac"</string>
+ <string name="keyboard_layout_spanish_label" msgid="7091555148131908240">"Espagnol"</string>
+ <string name="keyboard_layout_swiss_french_label" msgid="4659191025396371684">"Français (Suisse)"</string>
+ <string name="keyboard_layout_swiss_german_label" msgid="2305520941993314258">"Allemand (Suisse)"</string>
+ <string name="keyboard_layout_belgian" msgid="2011984572838651558">"Belge"</string>
+ <string name="keyboard_layout_bulgarian" msgid="8951224309972028398">"Bulgare"</string>
+ <string name="keyboard_layout_italian" msgid="6497079660449781213">"Italien"</string>
+ <string name="keyboard_layout_danish" msgid="8036432066627127851">"Danois"</string>
+ <string name="keyboard_layout_norwegian" msgid="9090097917011040937">"Norvégien"</string>
+ <string name="keyboard_layout_swedish" msgid="732959109088479351">"Suédois"</string>
+ <string name="keyboard_layout_finnish" msgid="5585659438924315466">"Finnois"</string>
+ <string name="keyboard_layout_croatian" msgid="4172229471079281138">"Croate"</string>
+ <string name="keyboard_layout_czech" msgid="1349256901452975343">"Tchèque"</string>
+ <string name="keyboard_layout_estonian" msgid="8775830985185665274">"Estonien"</string>
+ <string name="keyboard_layout_hungarian" msgid="4154963661406035109">"Hongrois"</string>
+ <string name="keyboard_layout_icelandic" msgid="5836645650912489642">"Islandais"</string>
+ <string name="keyboard_layout_brazilian" msgid="5117896443147781939">"Brésilien"</string>
+ <string name="keyboard_layout_portuguese" msgid="2888198587329660305">"Portugais"</string>
+ <string name="keyboard_layout_slovak" msgid="2469379934672837296">"Slovaque"</string>
+ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"Slovène"</string>
+ <string name="keyboard_layout_turkish" msgid="7736163250907964898">"Turc"</string>
+ <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"Ukrainien"</string>
+</resources>
diff --git a/packages/InputDevices/res/values-fr/strings.xml b/packages/InputDevices/res/values-fr/strings.xml
new file mode 100644
index 0000000..4ad4ffa
--- /dev/null
+++ b/packages/InputDevices/res/values-fr/strings.xml
@@ -0,0 +1,37 @@
+<?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="app_label" msgid="8016145283189546017">"Input Devices"</string>
+ <string name="keyboard_layouts_label" msgid="6688773268302087545">"Clavier Android"</string>
+ <string name="keyboard_layout_english_uk_label" msgid="6664258463319999632">"Anglais (Royaume-Uni)"</string>
+ <string name="keyboard_layout_english_us_label" msgid="8994890249649106291">"Anglais (États-Unis)"</string>
+ <string name="keyboard_layout_english_us_intl" msgid="3705168594034233583">"Anglais (États-Unis), international"</string>
+ <string name="keyboard_layout_english_us_colemak_label" msgid="4194969610343455380">"Anglais (États-Unis), type Colemak"</string>
+ <string name="keyboard_layout_english_us_dvorak_label" msgid="793528923171145202">"Anglais (États-Unis), type Dvorak"</string>
+ <string name="keyboard_layout_german_label" msgid="8451565865467909999">"Allemand"</string>
+ <string name="keyboard_layout_french_label" msgid="813450119589383723">"Français"</string>
+ <string name="keyboard_layout_french_ca_label" msgid="365352601060604832">"Français (Canada)"</string>
+ <string name="keyboard_layout_russian_label" msgid="8724879775815042968">"Russe"</string>
+ <string name="keyboard_layout_russian_mac_label" msgid="3795866869038264796">"Russe, type Mac"</string>
+ <string name="keyboard_layout_spanish_label" msgid="7091555148131908240">"Espagnol"</string>
+ <string name="keyboard_layout_swiss_french_label" msgid="4659191025396371684">"Français (Suisse)"</string>
+ <string name="keyboard_layout_swiss_german_label" msgid="2305520941993314258">"Allemand (Suisse)"</string>
+ <string name="keyboard_layout_belgian" msgid="2011984572838651558">"Belge"</string>
+ <string name="keyboard_layout_bulgarian" msgid="8951224309972028398">"Bulgare"</string>
+ <string name="keyboard_layout_italian" msgid="6497079660449781213">"Italien"</string>
+ <string name="keyboard_layout_danish" msgid="8036432066627127851">"Danois"</string>
+ <string name="keyboard_layout_norwegian" msgid="9090097917011040937">"Norvégien"</string>
+ <string name="keyboard_layout_swedish" msgid="732959109088479351">"Suédois"</string>
+ <string name="keyboard_layout_finnish" msgid="5585659438924315466">"Finnois"</string>
+ <string name="keyboard_layout_croatian" msgid="4172229471079281138">"Croate"</string>
+ <string name="keyboard_layout_czech" msgid="1349256901452975343">"Tchèque"</string>
+ <string name="keyboard_layout_estonian" msgid="8775830985185665274">"Estonien"</string>
+ <string name="keyboard_layout_hungarian" msgid="4154963661406035109">"Hongrois"</string>
+ <string name="keyboard_layout_icelandic" msgid="5836645650912489642">"Islandais"</string>
+ <string name="keyboard_layout_brazilian" msgid="5117896443147781939">"Brésilien"</string>
+ <string name="keyboard_layout_portuguese" msgid="2888198587329660305">"Portugais"</string>
+ <string name="keyboard_layout_slovak" msgid="2469379934672837296">"Slovaque"</string>
+ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"Slovène"</string>
+ <string name="keyboard_layout_turkish" msgid="7736163250907964898">"Turc"</string>
+ <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"Ukrainien"</string>
+</resources>
diff --git a/packages/InputDevices/res/values-hi/strings.xml b/packages/InputDevices/res/values-hi/strings.xml
new file mode 100644
index 0000000..8e1864e
--- /dev/null
+++ b/packages/InputDevices/res/values-hi/strings.xml
@@ -0,0 +1,37 @@
+<?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="app_label" msgid="8016145283189546017">"इनपà¥à¤Ÿ उपकरण"</string>
+ <string name="keyboard_layouts_label" msgid="6688773268302087545">"Android कीबोरà¥à¤¡"</string>
+ <string name="keyboard_layout_english_uk_label" msgid="6664258463319999632">"अंगà¥à¤°à¥‡à¤œà¤¼à¥€ (यूके)"</string>
+ <string name="keyboard_layout_english_us_label" msgid="8994890249649106291">"अंगà¥à¤°à¥‡à¤œà¤¼à¥€ (यूà¤à¤¸)"</string>
+ <string name="keyboard_layout_english_us_intl" msgid="3705168594034233583">"अंगà¥à¤°à¥‡à¤œà¤¼à¥€ (यूà¤à¤¸), अंतरà¥à¤°à¤¾à¤·à¥à¤Ÿà¥à¤°à¥€à¤¯ शैली"</string>
+ <string name="keyboard_layout_english_us_colemak_label" msgid="4194969610343455380">"अंगà¥à¤°à¥‡à¤œà¤¼à¥€ (यूà¤à¤¸), कोलमैक शैली"</string>
+ <string name="keyboard_layout_english_us_dvorak_label" msgid="793528923171145202">"अंगà¥à¤°à¥‡à¤œà¤¼à¥€ (यूà¤à¤¸), डà¥à¤µà¥‹à¤°à¤• शैली"</string>
+ <string name="keyboard_layout_german_label" msgid="8451565865467909999">"जरà¥à¤®à¤¨"</string>
+ <string name="keyboard_layout_french_label" msgid="813450119589383723">"फ़à¥à¤°à¤¾à¤‚सीसी"</string>
+ <string name="keyboard_layout_french_ca_label" msgid="365352601060604832">"फ़à¥à¤°à¤¾à¤‚सीसी (कनाडा)"</string>
+ <string name="keyboard_layout_russian_label" msgid="8724879775815042968">"रूसी"</string>
+ <string name="keyboard_layout_russian_mac_label" msgid="3795866869038264796">"रूसी, मैक शैली"</string>
+ <string name="keyboard_layout_spanish_label" msgid="7091555148131908240">"सà¥à¤ªà¥ˆà¤¨à¤¿à¤¶"</string>
+ <string name="keyboard_layout_swiss_french_label" msgid="4659191025396371684">"सà¥à¤µà¤¿à¤¸ फ़à¥à¤°à¤¾à¤‚सीसी"</string>
+ <string name="keyboard_layout_swiss_german_label" msgid="2305520941993314258">"सà¥à¤µà¤¿à¤¸ जरà¥à¤®à¤¨"</string>
+ <string name="keyboard_layout_belgian" msgid="2011984572838651558">"बेलà¥à¤œà¤¿à¤¯à¤¾à¤ˆ"</string>
+ <string name="keyboard_layout_bulgarian" msgid="8951224309972028398">"बà¥à¤²à¥â€à¤—ारियाई"</string>
+ <string name="keyboard_layout_italian" msgid="6497079660449781213">"इतालवी"</string>
+ <string name="keyboard_layout_danish" msgid="8036432066627127851">"डैनिश"</string>
+ <string name="keyboard_layout_norwegian" msgid="9090097917011040937">"नारà¥à¤µà¥‡à¤œà¤¿à¤¯à¤¾à¤ˆ"</string>
+ <string name="keyboard_layout_swedish" msgid="732959109088479351">"सà¥à¤µà¥€à¤¡à¤¿à¤¶"</string>
+ <string name="keyboard_layout_finnish" msgid="5585659438924315466">"फ़िनिश"</string>
+ <string name="keyboard_layout_croatian" msgid="4172229471079281138">"कà¥à¤°à¥‹à¤à¤¶à¤¿à¤¯à¤¾à¤ˆ"</string>
+ <string name="keyboard_layout_czech" msgid="1349256901452975343">"चेक"</string>
+ <string name="keyboard_layout_estonian" msgid="8775830985185665274">"à¤à¤¸à¥à¤Ÿà¥‹à¤¨à¤¿à¤¯à¤¾à¤ˆ"</string>
+ <string name="keyboard_layout_hungarian" msgid="4154963661406035109">"हंगेरियाई"</string>
+ <string name="keyboard_layout_icelandic" msgid="5836645650912489642">"आइसलैंडिक"</string>
+ <string name="keyboard_layout_brazilian" msgid="5117896443147781939">"बà¥à¤°à¤¾à¤œà¤¼à¥€à¤²à¤¿à¤¯à¤¾à¤ˆ"</string>
+ <string name="keyboard_layout_portuguese" msgid="2888198587329660305">"पà¥à¤°à¥à¤¤à¤—ाली"</string>
+ <string name="keyboard_layout_slovak" msgid="2469379934672837296">"सà¥à¤²à¥‹à¤µà¤¾à¤•"</string>
+ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"सà¥à¤²à¥‹à¤µà¥‡à¤¨à¤¿à¤¯à¤¾à¤ˆ"</string>
+ <string name="keyboard_layout_turkish" msgid="7736163250907964898">"तà¥à¤°à¥à¤•ी"</string>
+ <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"यूकà¥à¤°à¥‡à¤¨à¤¿à¤¯à¤¾à¤ˆ"</string>
+</resources>
diff --git a/packages/InputDevices/res/values-hr/strings.xml b/packages/InputDevices/res/values-hr/strings.xml
new file mode 100644
index 0000000..6217bf0
--- /dev/null
+++ b/packages/InputDevices/res/values-hr/strings.xml
@@ -0,0 +1,37 @@
+<?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="app_label" msgid="8016145283189546017">"Uređaji za unos"</string>
+ <string name="keyboard_layouts_label" msgid="6688773268302087545">"Android tipkovnica"</string>
+ <string name="keyboard_layout_english_uk_label" msgid="6664258463319999632">"engleska (UK)"</string>
+ <string name="keyboard_layout_english_us_label" msgid="8994890249649106291">"engleska (SAD)"</string>
+ <string name="keyboard_layout_english_us_intl" msgid="3705168594034233583">"engleska (SAD), međunarodna"</string>
+ <string name="keyboard_layout_english_us_colemak_label" msgid="4194969610343455380">"engleska (SAD), Colemakov raspored"</string>
+ <string name="keyboard_layout_english_us_dvorak_label" msgid="793528923171145202">"engleska (SAD), Dvorakov raspored"</string>
+ <string name="keyboard_layout_german_label" msgid="8451565865467909999">"njemaÄka"</string>
+ <string name="keyboard_layout_french_label" msgid="813450119589383723">"francuska"</string>
+ <string name="keyboard_layout_french_ca_label" msgid="365352601060604832">"francuska (Kanada)"</string>
+ <string name="keyboard_layout_russian_label" msgid="8724879775815042968">"ruska"</string>
+ <string name="keyboard_layout_russian_mac_label" msgid="3795866869038264796">"ruska, raspored Maca"</string>
+ <string name="keyboard_layout_spanish_label" msgid="7091555148131908240">"španjolska"</string>
+ <string name="keyboard_layout_swiss_french_label" msgid="4659191025396371684">"švicarsko-francuska"</string>
+ <string name="keyboard_layout_swiss_german_label" msgid="2305520941993314258">"Å¡vicarsko-njemaÄka"</string>
+ <string name="keyboard_layout_belgian" msgid="2011984572838651558">"belgijska"</string>
+ <string name="keyboard_layout_bulgarian" msgid="8951224309972028398">"bugarska"</string>
+ <string name="keyboard_layout_italian" msgid="6497079660449781213">"talijanska"</string>
+ <string name="keyboard_layout_danish" msgid="8036432066627127851">"danska"</string>
+ <string name="keyboard_layout_norwegian" msgid="9090097917011040937">"norveška"</string>
+ <string name="keyboard_layout_swedish" msgid="732959109088479351">"švedska"</string>
+ <string name="keyboard_layout_finnish" msgid="5585659438924315466">"finska"</string>
+ <string name="keyboard_layout_croatian" msgid="4172229471079281138">"hrvatska"</string>
+ <string name="keyboard_layout_czech" msgid="1349256901452975343">"ÄeÅ¡ka"</string>
+ <string name="keyboard_layout_estonian" msgid="8775830985185665274">"estonska"</string>
+ <string name="keyboard_layout_hungarian" msgid="4154963661406035109">"mađarska"</string>
+ <string name="keyboard_layout_icelandic" msgid="5836645650912489642">"islandska"</string>
+ <string name="keyboard_layout_brazilian" msgid="5117896443147781939">"brazilska"</string>
+ <string name="keyboard_layout_portuguese" msgid="2888198587329660305">"portugalska"</string>
+ <string name="keyboard_layout_slovak" msgid="2469379934672837296">"slovaÄka"</string>
+ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"slovenska"</string>
+ <string name="keyboard_layout_turkish" msgid="7736163250907964898">"turska"</string>
+ <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"ukrajinska"</string>
+</resources>
diff --git a/packages/InputDevices/res/values-hu/strings.xml b/packages/InputDevices/res/values-hu/strings.xml
new file mode 100644
index 0000000..0cdbfb2
--- /dev/null
+++ b/packages/InputDevices/res/values-hu/strings.xml
@@ -0,0 +1,37 @@
+<?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="app_label" msgid="8016145283189546017">"Beviteli eszközök"</string>
+ <string name="keyboard_layouts_label" msgid="6688773268302087545">"Android-billentyűzet"</string>
+ <string name="keyboard_layout_english_uk_label" msgid="6664258463319999632">"angol (Egyesült Királyság)"</string>
+ <string name="keyboard_layout_english_us_label" msgid="8994890249649106291">"angol (USA)"</string>
+ <string name="keyboard_layout_english_us_intl" msgid="3705168594034233583">"angol (USA), nemzetközi stílus"</string>
+ <string name="keyboard_layout_english_us_colemak_label" msgid="4194969610343455380">"angol (USA), Colemak-stílus"</string>
+ <string name="keyboard_layout_english_us_dvorak_label" msgid="793528923171145202">"angol (USA), Dvorak-stílus"</string>
+ <string name="keyboard_layout_german_label" msgid="8451565865467909999">"német"</string>
+ <string name="keyboard_layout_french_label" msgid="813450119589383723">"francia"</string>
+ <string name="keyboard_layout_french_ca_label" msgid="365352601060604832">"francia (Kanada)"</string>
+ <string name="keyboard_layout_russian_label" msgid="8724879775815042968">"orosz"</string>
+ <string name="keyboard_layout_russian_mac_label" msgid="3795866869038264796">"orosz, Mac-stílus"</string>
+ <string name="keyboard_layout_spanish_label" msgid="7091555148131908240">"spanyol"</string>
+ <string name="keyboard_layout_swiss_french_label" msgid="4659191025396371684">"svájci francia"</string>
+ <string name="keyboard_layout_swiss_german_label" msgid="2305520941993314258">"svájci német"</string>
+ <string name="keyboard_layout_belgian" msgid="2011984572838651558">"belga"</string>
+ <string name="keyboard_layout_bulgarian" msgid="8951224309972028398">"bolgár"</string>
+ <string name="keyboard_layout_italian" msgid="6497079660449781213">"olasz"</string>
+ <string name="keyboard_layout_danish" msgid="8036432066627127851">"dán"</string>
+ <string name="keyboard_layout_norwegian" msgid="9090097917011040937">"norvég"</string>
+ <string name="keyboard_layout_swedish" msgid="732959109088479351">"svéd"</string>
+ <string name="keyboard_layout_finnish" msgid="5585659438924315466">"finn"</string>
+ <string name="keyboard_layout_croatian" msgid="4172229471079281138">"horvát"</string>
+ <string name="keyboard_layout_czech" msgid="1349256901452975343">"cseh"</string>
+ <string name="keyboard_layout_estonian" msgid="8775830985185665274">"észt"</string>
+ <string name="keyboard_layout_hungarian" msgid="4154963661406035109">"magyar"</string>
+ <string name="keyboard_layout_icelandic" msgid="5836645650912489642">"izlandi"</string>
+ <string name="keyboard_layout_brazilian" msgid="5117896443147781939">"brazil"</string>
+ <string name="keyboard_layout_portuguese" msgid="2888198587329660305">"portugál"</string>
+ <string name="keyboard_layout_slovak" msgid="2469379934672837296">"szlovák"</string>
+ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"szlovén"</string>
+ <string name="keyboard_layout_turkish" msgid="7736163250907964898">"török"</string>
+ <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"ukrán"</string>
+</resources>
diff --git a/packages/InputDevices/res/values-hy-rAM/strings.xml b/packages/InputDevices/res/values-hy-rAM/strings.xml
new file mode 100644
index 0000000..bc5bbfc
--- /dev/null
+++ b/packages/InputDevices/res/values-hy-rAM/strings.xml
@@ -0,0 +1,37 @@
+<?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="app_label" msgid="8016145283189546017">"Մուտքագրման ​​սարքեր"</string>
+ <string name="keyboard_layouts_label" msgid="6688773268302087545">"Android Õ½Õ¿Õ¥Õ²Õ¶Õ¡Õ·Õ¡Ö€"</string>
+ <string name="keyboard_layout_english_uk_label" msgid="6664258463319999632">"Ô±Õ¶Õ£Õ¬Õ¥Ö€Õ¥Õ¶ (Õ„Ô²)"</string>
+ <string name="keyboard_layout_english_us_label" msgid="8994890249649106291">"Ô±Õ¶Õ£Õ¬Õ¥Ö€Õ¥Õ¶ (Ô±Õ„Õ†)"</string>
+ <string name="keyboard_layout_english_us_intl" msgid="3705168594034233583">"Ô±Õ¶Õ£Õ¬Õ¥Ö€Õ¥Õ¶ (Ô±Õ„Õ†), Õ´Õ«Õ»Õ¡Õ¦Õ£Õ¡ÕµÕ«Õ¶ Õ¿Õ¥Õ½Õ¡Õ¯"</string>
+ <string name="keyboard_layout_english_us_colemak_label" msgid="4194969610343455380">"Ô±Õ¶Õ£Õ¬Õ¥Ö€Õ¥Õ¶ (Ô±Õ„Õ†), Colemak Õ¿Õ¥Õ½Õ¡Õ¯"</string>
+ <string name="keyboard_layout_english_us_dvorak_label" msgid="793528923171145202">"Ô±Õ¶Õ£Õ¬Õ¥Ö€Õ¥Õ¶ (Ô±Õ„Õ†), Dvorak Õ¿Õ¥Õ½Õ¡Õ¯"</string>
+ <string name="keyboard_layout_german_label" msgid="8451565865467909999">"Ô³Õ¥Ö€Õ´Õ¡Õ¶Õ¥Ö€Õ¥Õ¶"</string>
+ <string name="keyboard_layout_french_label" msgid="813450119589383723">"Õ–Ö€Õ¡Õ¶Õ½Õ¥Ö€Õ¥Õ¶"</string>
+ <string name="keyboard_layout_french_ca_label" msgid="365352601060604832">"Õ–Ö€Õ¡Õ¶Õ½Õ¥Ö€Õ¥Õ¶ (Ô¿Õ¡Õ¶Õ¡Õ¤Õ¡)"</string>
+ <string name="keyboard_layout_russian_label" msgid="8724879775815042968">"Ռուսերեն"</string>
+ <string name="keyboard_layout_russian_mac_label" msgid="3795866869038264796">"Ռուսերեն, Mac տեսակ"</string>
+ <string name="keyboard_layout_spanish_label" msgid="7091555148131908240">"Ô»Õ½ÕºÕ¡Õ¶Õ¥Ö€Õ¥Õ¶"</string>
+ <string name="keyboard_layout_swiss_french_label" msgid="4659191025396371684">"Õ‡Õ¾Õ¥ÕµÖÕ¡Ö€Õ¡Õ¯Õ¡Õ¶ Ö†Ö€Õ¡Õ¶Õ½Õ¥Ö€Õ¥Õ¶"</string>
+ <string name="keyboard_layout_swiss_german_label" msgid="2305520941993314258">"Õ‡Õ¾Õ¥ÕµÖÕ¡Ö€Õ¡Õ¯Õ¡Õ¶ Õ£Õ¥Ö€Õ´Õ¡Õ¶Õ¥Ö€Õ¥Õ¶"</string>
+ <string name="keyboard_layout_belgian" msgid="2011984572838651558">"Ô²Õ¥Õ¬Õ£Õ«Õ¡Õ¯Õ¡Õ¶"</string>
+ <string name="keyboard_layout_bulgarian" msgid="8951224309972028398">"Ô²Õ¸Ö‚Õ¬Õ²Õ¡Ö€Õ¥Ö€Õ¥Õ¶"</string>
+ <string name="keyboard_layout_italian" msgid="6497079660449781213">"Ô»Õ¿Õ¡Õ¬Õ¥Ö€Õ¥Õ¶"</string>
+ <string name="keyboard_layout_danish" msgid="8036432066627127851">"Ô´Õ¡Õ¶Õ«Õ¥Ö€Õ¥Õ¶"</string>
+ <string name="keyboard_layout_norwegian" msgid="9090097917011040937">"Õ†Õ¸Ö€Õ¾Õ¥Õ£Õ¥Ö€Õ¥Õ¶"</string>
+ <string name="keyboard_layout_swedish" msgid="732959109088479351">"Õ‡Õ¾Õ¥Õ¤Õ¥Ö€Õ¥Õ¶"</string>
+ <string name="keyboard_layout_finnish" msgid="5585659438924315466">"Õ–Õ«Õ¶Õ¶Õ¥Ö€Õ¥Õ¶"</string>
+ <string name="keyboard_layout_croatian" msgid="4172229471079281138">"Ô½Õ¸Ö€Õ¾Õ¡Õ©Õ¥Ö€Õ¥Õ¶"</string>
+ <string name="keyboard_layout_czech" msgid="1349256901452975343">"Õ‰Õ¥Õ­Õ¥Ö€Õ¥Õ¶"</string>
+ <string name="keyboard_layout_estonian" msgid="8775830985185665274">"Ô·Õ½Õ¿Õ¸Õ¶Õ¥Ö€Õ¥Õ¶"</string>
+ <string name="keyboard_layout_hungarian" msgid="4154963661406035109">"Õ€Õ¸Ö‚Õ¶Õ£Õ¡Ö€Õ¥Ö€Õ¥Õ¶"</string>
+ <string name="keyboard_layout_icelandic" msgid="5836645650912489642">"Ô»Õ½Õ¬Õ¡Õ¶Õ¤Õ¥Ö€Õ¥Õ¶"</string>
+ <string name="keyboard_layout_brazilian" msgid="5117896443147781939">"Ô²Ö€Õ¡Õ¦Õ«Õ¬Õ¥Ö€Õ¥Õ¶"</string>
+ <string name="keyboard_layout_portuguese" msgid="2888198587329660305">"ÕŠÕ¸Ö€Õ¿Õ¸Ö‚Õ£Õ¡Õ¬Õ¥Ö€Õ¥Õ¶"</string>
+ <string name="keyboard_layout_slovak" msgid="2469379934672837296">"ÕÕ¬Õ¸Õ¾Õ¡Õ¯Õ¥Ö€Õ¥Õ¶"</string>
+ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"ÕÕ¬Õ¸Õ¾Õ¥Õ¶Õ¥Ö€Õ¥Õ¶"</string>
+ <string name="keyboard_layout_turkish" msgid="7736163250907964898">"Ô¹Õ¸Ö‚Ö€Ö„Õ¥Ö€Õ¥Õ¶"</string>
+ <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"ÕˆÖ‚Õ¯Ö€Õ¡Õ«Õ¶Õ¥Ö€Õ¥Õ¶"</string>
+</resources>
diff --git a/packages/InputDevices/res/values-in/strings.xml b/packages/InputDevices/res/values-in/strings.xml
new file mode 100644
index 0000000..11e2dd0
--- /dev/null
+++ b/packages/InputDevices/res/values-in/strings.xml
@@ -0,0 +1,37 @@
+<?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="app_label" msgid="8016145283189546017">"Perangkat Masukan"</string>
+ <string name="keyboard_layouts_label" msgid="6688773268302087545">"Keyboard Android"</string>
+ <string name="keyboard_layout_english_uk_label" msgid="6664258463319999632">"Inggris (Britania)"</string>
+ <string name="keyboard_layout_english_us_label" msgid="8994890249649106291">"Inggris (Amerika)"</string>
+ <string name="keyboard_layout_english_us_intl" msgid="3705168594034233583">"Inggris (AS), gaya Internasional"</string>
+ <string name="keyboard_layout_english_us_colemak_label" msgid="4194969610343455380">"Inggris (AS), gaya Colemak"</string>
+ <string name="keyboard_layout_english_us_dvorak_label" msgid="793528923171145202">"Inggris (AS), gaya Dvorak"</string>
+ <string name="keyboard_layout_german_label" msgid="8451565865467909999">"Jerman"</string>
+ <string name="keyboard_layout_french_label" msgid="813450119589383723">"Prancis"</string>
+ <string name="keyboard_layout_french_ca_label" msgid="365352601060604832">"Prancis (Kanada)"</string>
+ <string name="keyboard_layout_russian_label" msgid="8724879775815042968">"Rusia"</string>
+ <string name="keyboard_layout_russian_mac_label" msgid="3795866869038264796">"Rusia, gaya Mac"</string>
+ <string name="keyboard_layout_spanish_label" msgid="7091555148131908240">"Spanyol"</string>
+ <string name="keyboard_layout_swiss_french_label" msgid="4659191025396371684">"Prancis Swiss"</string>
+ <string name="keyboard_layout_swiss_german_label" msgid="2305520941993314258">"Jerman Swiss"</string>
+ <string name="keyboard_layout_belgian" msgid="2011984572838651558">"Belgia"</string>
+ <string name="keyboard_layout_bulgarian" msgid="8951224309972028398">"Bulgaria"</string>
+ <string name="keyboard_layout_italian" msgid="6497079660449781213">"Italia"</string>
+ <string name="keyboard_layout_danish" msgid="8036432066627127851">"Denmark"</string>
+ <string name="keyboard_layout_norwegian" msgid="9090097917011040937">"Norwegia"</string>
+ <string name="keyboard_layout_swedish" msgid="732959109088479351">"Swedia"</string>
+ <string name="keyboard_layout_finnish" msgid="5585659438924315466">"Finlandia"</string>
+ <string name="keyboard_layout_croatian" msgid="4172229471079281138">"Kroasia"</string>
+ <string name="keyboard_layout_czech" msgid="1349256901452975343">"Cheska"</string>
+ <string name="keyboard_layout_estonian" msgid="8775830985185665274">"Estonia"</string>
+ <string name="keyboard_layout_hungarian" msgid="4154963661406035109">"Hungaria"</string>
+ <string name="keyboard_layout_icelandic" msgid="5836645650912489642">"Islandia"</string>
+ <string name="keyboard_layout_brazilian" msgid="5117896443147781939">"Brasil"</string>
+ <string name="keyboard_layout_portuguese" msgid="2888198587329660305">"Portugis"</string>
+ <string name="keyboard_layout_slovak" msgid="2469379934672837296">"Slowakia"</string>
+ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"Slovenia"</string>
+ <string name="keyboard_layout_turkish" msgid="7736163250907964898">"Turki"</string>
+ <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"Ukraina"</string>
+</resources>
diff --git a/packages/InputDevices/res/values-it/strings.xml b/packages/InputDevices/res/values-it/strings.xml
new file mode 100644
index 0000000..dbb7301
--- /dev/null
+++ b/packages/InputDevices/res/values-it/strings.xml
@@ -0,0 +1,37 @@
+<?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="app_label" msgid="8016145283189546017">"Dispositivi di input"</string>
+ <string name="keyboard_layouts_label" msgid="6688773268302087545">"Tastiera Android"</string>
+ <string name="keyboard_layout_english_uk_label" msgid="6664258463319999632">"Inglese (UK)"</string>
+ <string name="keyboard_layout_english_us_label" msgid="8994890249649106291">"Inglese (USA)"</string>
+ <string name="keyboard_layout_english_us_intl" msgid="3705168594034233583">"Inglese (USA), stile internazionale"</string>
+ <string name="keyboard_layout_english_us_colemak_label" msgid="4194969610343455380">"Inglese (USA), stile Colemak"</string>
+ <string name="keyboard_layout_english_us_dvorak_label" msgid="793528923171145202">"Inglese (USA), stile Dvorak"</string>
+ <string name="keyboard_layout_german_label" msgid="8451565865467909999">"Tedesco"</string>
+ <string name="keyboard_layout_french_label" msgid="813450119589383723">"Francese"</string>
+ <string name="keyboard_layout_french_ca_label" msgid="365352601060604832">"Francese (Canada)"</string>
+ <string name="keyboard_layout_russian_label" msgid="8724879775815042968">"Russo"</string>
+ <string name="keyboard_layout_russian_mac_label" msgid="3795866869038264796">"Russo, stile Mac"</string>
+ <string name="keyboard_layout_spanish_label" msgid="7091555148131908240">"Spagnolo"</string>
+ <string name="keyboard_layout_swiss_french_label" msgid="4659191025396371684">"Francese svizzero"</string>
+ <string name="keyboard_layout_swiss_german_label" msgid="2305520941993314258">"Tedesco svizzero"</string>
+ <string name="keyboard_layout_belgian" msgid="2011984572838651558">"Belga"</string>
+ <string name="keyboard_layout_bulgarian" msgid="8951224309972028398">"Bulgaro"</string>
+ <string name="keyboard_layout_italian" msgid="6497079660449781213">"Italiano"</string>
+ <string name="keyboard_layout_danish" msgid="8036432066627127851">"Danese"</string>
+ <string name="keyboard_layout_norwegian" msgid="9090097917011040937">"Norvegese"</string>
+ <string name="keyboard_layout_swedish" msgid="732959109088479351">"Svedese"</string>
+ <string name="keyboard_layout_finnish" msgid="5585659438924315466">"Finlandese"</string>
+ <string name="keyboard_layout_croatian" msgid="4172229471079281138">"Croato"</string>
+ <string name="keyboard_layout_czech" msgid="1349256901452975343">"Ceco"</string>
+ <string name="keyboard_layout_estonian" msgid="8775830985185665274">"Estone"</string>
+ <string name="keyboard_layout_hungarian" msgid="4154963661406035109">"Ungherese"</string>
+ <string name="keyboard_layout_icelandic" msgid="5836645650912489642">"Islandese"</string>
+ <string name="keyboard_layout_brazilian" msgid="5117896443147781939">"Brasiliano"</string>
+ <string name="keyboard_layout_portuguese" msgid="2888198587329660305">"Portoghese"</string>
+ <string name="keyboard_layout_slovak" msgid="2469379934672837296">"Slovacco"</string>
+ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"Sloveno"</string>
+ <string name="keyboard_layout_turkish" msgid="7736163250907964898">"Turco"</string>
+ <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"Ucraino"</string>
+</resources>
diff --git a/packages/InputDevices/res/values-iw/strings.xml b/packages/InputDevices/res/values-iw/strings.xml
new file mode 100644
index 0000000..a989391
--- /dev/null
+++ b/packages/InputDevices/res/values-iw/strings.xml
@@ -0,0 +1,37 @@
+<?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="app_label" msgid="8016145283189546017">"התקני קלט"</string>
+ <string name="keyboard_layouts_label" msgid="6688773268302087545">"â€×ž×§×œ×“ת Android"</string>
+ <string name="keyboard_layout_english_uk_label" msgid="6664258463319999632">"×נגלית (בריטניה)"</string>
+ <string name="keyboard_layout_english_us_label" msgid="8994890249649106291">"×נגלית (×רה\"ב)"</string>
+ <string name="keyboard_layout_english_us_intl" msgid="3705168594034233583">"×נגלית (×רה\"ב), סגנון בינ\"ל"</string>
+ <string name="keyboard_layout_english_us_colemak_label" msgid="4194969610343455380">"â€×נגלית (×רה\"ב), סגנון Colemak"</string>
+ <string name="keyboard_layout_english_us_dvorak_label" msgid="793528923171145202">"â€×נגלית (×רה\"ב), סגנון Dvorak"</string>
+ <string name="keyboard_layout_german_label" msgid="8451565865467909999">"גרמנית"</string>
+ <string name="keyboard_layout_french_label" msgid="813450119589383723">"צרפתית"</string>
+ <string name="keyboard_layout_french_ca_label" msgid="365352601060604832">"צרפתית (קנדה)"</string>
+ <string name="keyboard_layout_russian_label" msgid="8724879775815042968">"רוסית"</string>
+ <string name="keyboard_layout_russian_mac_label" msgid="3795866869038264796">"â€×¨×•סית, סגנון Mac"</string>
+ <string name="keyboard_layout_spanish_label" msgid="7091555148131908240">"ספרדית"</string>
+ <string name="keyboard_layout_swiss_french_label" msgid="4659191025396371684">"צרפתית שוויצרית"</string>
+ <string name="keyboard_layout_swiss_german_label" msgid="2305520941993314258">"גרמנית שוויצרית"</string>
+ <string name="keyboard_layout_belgian" msgid="2011984572838651558">"בלגית"</string>
+ <string name="keyboard_layout_bulgarian" msgid="8951224309972028398">"בולגרית"</string>
+ <string name="keyboard_layout_italian" msgid="6497079660449781213">"×יטלקית"</string>
+ <string name="keyboard_layout_danish" msgid="8036432066627127851">"דנית"</string>
+ <string name="keyboard_layout_norwegian" msgid="9090097917011040937">"נורווגית"</string>
+ <string name="keyboard_layout_swedish" msgid="732959109088479351">"שוודית"</string>
+ <string name="keyboard_layout_finnish" msgid="5585659438924315466">"פינית"</string>
+ <string name="keyboard_layout_croatian" msgid="4172229471079281138">"קרו×טית"</string>
+ <string name="keyboard_layout_czech" msgid="1349256901452975343">"צ\'כית"</string>
+ <string name="keyboard_layout_estonian" msgid="8775830985185665274">"×סטונית"</string>
+ <string name="keyboard_layout_hungarian" msgid="4154963661406035109">"הונגרית"</string>
+ <string name="keyboard_layout_icelandic" msgid="5836645650912489642">"×יסלנדית"</string>
+ <string name="keyboard_layout_brazilian" msgid="5117896443147781939">"ברזיל×ית"</string>
+ <string name="keyboard_layout_portuguese" msgid="2888198587329660305">"פורטוגזית"</string>
+ <string name="keyboard_layout_slovak" msgid="2469379934672837296">"סלובקית"</string>
+ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"סלובנית"</string>
+ <string name="keyboard_layout_turkish" msgid="7736163250907964898">"טורקית"</string>
+ <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"×וקר×ינית"</string>
+</resources>
diff --git a/packages/InputDevices/res/values-ja/strings.xml b/packages/InputDevices/res/values-ja/strings.xml
new file mode 100644
index 0000000..950b727
--- /dev/null
+++ b/packages/InputDevices/res/values-ja/strings.xml
@@ -0,0 +1,37 @@
+<?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="app_label" msgid="8016145283189546017">"Input Devices"</string>
+ <string name="keyboard_layouts_label" msgid="6688773268302087545">"Androidキーボード"</string>
+ <string name="keyboard_layout_english_uk_label" msgid="6664258463319999632">"英語(イギリス)"</string>
+ <string name="keyboard_layout_english_us_label" msgid="8994890249649106291">"英語(アメリカ)"</string>
+ <string name="keyboard_layout_english_us_intl" msgid="3705168594034233583">"英語(アメリカ)ã€ã‚¤ãƒ³ã‚¿ãƒ¼ãƒŠã‚·ãƒ§ãƒŠãƒ«é…列"</string>
+ <string name="keyboard_layout_english_us_colemak_label" msgid="4194969610343455380">"英語(アメリカ)ã€Colemaké…列"</string>
+ <string name="keyboard_layout_english_us_dvorak_label" msgid="793528923171145202">"英語(アメリカ)ã€Dvoraké…列"</string>
+ <string name="keyboard_layout_german_label" msgid="8451565865467909999">"ドイツ語"</string>
+ <string name="keyboard_layout_french_label" msgid="813450119589383723">"フランス語"</string>
+ <string name="keyboard_layout_french_ca_label" msgid="365352601060604832">"フランス語(カナダ)"</string>
+ <string name="keyboard_layout_russian_label" msgid="8724879775815042968">"ロシア語"</string>
+ <string name="keyboard_layout_russian_mac_label" msgid="3795866869038264796">"ロシア語(Macé…列)"</string>
+ <string name="keyboard_layout_spanish_label" msgid="7091555148131908240">"スペイン語"</string>
+ <string name="keyboard_layout_swiss_french_label" msgid="4659191025396371684">"フランス語(スイス)"</string>
+ <string name="keyboard_layout_swiss_german_label" msgid="2305520941993314258">"ドイツ語(スイス)"</string>
+ <string name="keyboard_layout_belgian" msgid="2011984572838651558">"ベルギー語"</string>
+ <string name="keyboard_layout_bulgarian" msgid="8951224309972028398">"ブルガリア語"</string>
+ <string name="keyboard_layout_italian" msgid="6497079660449781213">"イタリア語"</string>
+ <string name="keyboard_layout_danish" msgid="8036432066627127851">"デンマーク語"</string>
+ <string name="keyboard_layout_norwegian" msgid="9090097917011040937">"ノルウェー語"</string>
+ <string name="keyboard_layout_swedish" msgid="732959109088479351">"スウェーデン語"</string>
+ <string name="keyboard_layout_finnish" msgid="5585659438924315466">"フィンランド語"</string>
+ <string name="keyboard_layout_croatian" msgid="4172229471079281138">"クロアãƒã‚¢èªž"</string>
+ <string name="keyboard_layout_czech" msgid="1349256901452975343">"ãƒã‚§ã‚³èªž"</string>
+ <string name="keyboard_layout_estonian" msgid="8775830985185665274">"エストニア語"</string>
+ <string name="keyboard_layout_hungarian" msgid="4154963661406035109">"ãƒãƒ³ã‚¬ãƒªãƒ¼èªž"</string>
+ <string name="keyboard_layout_icelandic" msgid="5836645650912489642">"アイスランド語"</string>
+ <string name="keyboard_layout_brazilian" msgid="5117896443147781939">"ブラジルé…列"</string>
+ <string name="keyboard_layout_portuguese" msgid="2888198587329660305">"ãƒãƒ«ãƒˆã‚¬ãƒ«èªž"</string>
+ <string name="keyboard_layout_slovak" msgid="2469379934672837296">"スロãƒã‚­ã‚¢èªž"</string>
+ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"スロベニア語"</string>
+ <string name="keyboard_layout_turkish" msgid="7736163250907964898">"トルコ語"</string>
+ <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"ウクライナ語"</string>
+</resources>
diff --git a/packages/InputDevices/res/values-ka-rGE/strings.xml b/packages/InputDevices/res/values-ka-rGE/strings.xml
new file mode 100644
index 0000000..6e507aa
--- /dev/null
+++ b/packages/InputDevices/res/values-ka-rGE/strings.xml
@@ -0,0 +1,37 @@
+<?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="app_label" msgid="8016145283189546017">"შეყვáƒáƒœáƒ˜áƒ¡ მáƒáƒ¬áƒ§áƒáƒ‘ილáƒáƒ‘ები"</string>
+ <string name="keyboard_layouts_label" msgid="6688773268302087545">"Android-ის კლáƒáƒ•იáƒáƒ¢áƒ£áƒ áƒ"</string>
+ <string name="keyboard_layout_english_uk_label" msgid="6664258463319999632">"ინგლისური (გáƒáƒ áƒ—. სáƒáƒ›.)"</string>
+ <string name="keyboard_layout_english_us_label" msgid="8994890249649106291">"ინგლისური (áƒáƒ¨áƒ¨)"</string>
+ <string name="keyboard_layout_english_us_intl" msgid="3705168594034233583">"ინგლისური (áƒáƒ¨áƒ¨), სáƒáƒ”რთáƒáƒ¨áƒáƒ áƒ˜áƒ¡áƒ სტილი"</string>
+ <string name="keyboard_layout_english_us_colemak_label" msgid="4194969610343455380">"ინგლისური (áƒáƒ¨áƒ¨), Colemak სტილი"</string>
+ <string name="keyboard_layout_english_us_dvorak_label" msgid="793528923171145202">"ინგლისური (áƒáƒ¨áƒ¨), Dvorak სტილი"</string>
+ <string name="keyboard_layout_german_label" msgid="8451565865467909999">"გერმáƒáƒœáƒ£áƒšáƒ˜"</string>
+ <string name="keyboard_layout_french_label" msgid="813450119589383723">"ფრáƒáƒœáƒ’ული"</string>
+ <string name="keyboard_layout_french_ca_label" msgid="365352601060604832">"ფრáƒáƒœáƒ’ული (კáƒáƒœáƒáƒ“áƒ)"</string>
+ <string name="keyboard_layout_russian_label" msgid="8724879775815042968">"რუსული"</string>
+ <string name="keyboard_layout_russian_mac_label" msgid="3795866869038264796">"რუსული, Mac სტილი"</string>
+ <string name="keyboard_layout_spanish_label" msgid="7091555148131908240">"ესპáƒáƒœáƒ£áƒ áƒ˜"</string>
+ <string name="keyboard_layout_swiss_french_label" msgid="4659191025396371684">"შვეიცáƒáƒ áƒ˜áƒ£áƒšáƒ˜ ფრáƒáƒœáƒ’ული"</string>
+ <string name="keyboard_layout_swiss_german_label" msgid="2305520941993314258">"შვეიცáƒáƒ áƒ˜áƒ£áƒšáƒ˜ გერმáƒáƒœáƒ£áƒšáƒ˜"</string>
+ <string name="keyboard_layout_belgian" msgid="2011984572838651558">"ბელგიური"</string>
+ <string name="keyboard_layout_bulgarian" msgid="8951224309972028398">"ბულგáƒáƒ áƒ£áƒšáƒ˜"</string>
+ <string name="keyboard_layout_italian" msgid="6497079660449781213">"იტáƒáƒšáƒ˜áƒ£áƒ áƒ˜"</string>
+ <string name="keyboard_layout_danish" msgid="8036432066627127851">"დáƒáƒœáƒ˜áƒ£áƒ áƒ˜"</string>
+ <string name="keyboard_layout_norwegian" msgid="9090097917011040937">"ნáƒáƒ áƒ•ეგიული"</string>
+ <string name="keyboard_layout_swedish" msgid="732959109088479351">"შვედური"</string>
+ <string name="keyboard_layout_finnish" msgid="5585659438924315466">"ფინური"</string>
+ <string name="keyboard_layout_croatian" msgid="4172229471079281138">"ხáƒáƒ áƒ•áƒáƒ¢áƒ˜áƒ£áƒšáƒ˜"</string>
+ <string name="keyboard_layout_czech" msgid="1349256901452975343">"ჩეხური"</string>
+ <string name="keyboard_layout_estonian" msgid="8775830985185665274">"ესტáƒáƒœáƒ£áƒ áƒ˜"</string>
+ <string name="keyboard_layout_hungarian" msgid="4154963661406035109">"უნგრული"</string>
+ <string name="keyboard_layout_icelandic" msgid="5836645650912489642">"ისლáƒáƒœáƒ“იური"</string>
+ <string name="keyboard_layout_brazilian" msgid="5117896443147781939">"ბრáƒáƒ–ილიური"</string>
+ <string name="keyboard_layout_portuguese" msgid="2888198587329660305">"პáƒáƒ áƒ¢áƒ£áƒ’áƒáƒšáƒ˜áƒ£áƒ áƒ˜"</string>
+ <string name="keyboard_layout_slovak" msgid="2469379934672837296">"სლáƒáƒ•áƒáƒ™áƒ£áƒ áƒ˜"</string>
+ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"სლáƒáƒ•ენური"</string>
+ <string name="keyboard_layout_turkish" msgid="7736163250907964898">"თურქული"</string>
+ <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"უკრáƒáƒ˜áƒœáƒ£áƒšáƒ˜"</string>
+</resources>
diff --git a/packages/InputDevices/res/values-km-rKH/strings.xml b/packages/InputDevices/res/values-km-rKH/strings.xml
new file mode 100644
index 0000000..9a8c99b
--- /dev/null
+++ b/packages/InputDevices/res/values-km-rKH/strings.xml
@@ -0,0 +1,37 @@
+<?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="app_label" msgid="8016145283189546017">"ឧបករណáŸâ€‹áž”ញ្ចូល"</string>
+ <string name="keyboard_layouts_label" msgid="6688773268302087545">"ក្ដារចុច​ Android"</string>
+ <string name="keyboard_layout_english_uk_label" msgid="6664258463319999632">"អង់គ្លáŸážŸ (​ចក្រភព​អង់គ្លáŸážŸ)"</string>
+ <string name="keyboard_layout_english_us_label" msgid="8994890249649106291">"អង់គ្លáŸážŸ (​សហរដ្ឋ​អាមáŸážšáž·áž€)"</string>
+ <string name="keyboard_layout_english_us_intl" msgid="3705168594034233583">"អង់គ្លáŸážŸ (សហរដ្ឋ​អាមáŸážšáž·áž€â€‹)​, ​​រចនាបáŸáž‘្ម​​អន្ážážšáž‡áž¶ážáž·"</string>
+ <string name="keyboard_layout_english_us_colemak_label" msgid="4194969610343455380">"អង់គ្លáŸážŸ (សហរដ្ឋ​អាមáŸážšáž·áž€â€‹)​, ​​រចនាបáŸáž‘្ម Colemak"</string>
+ <string name="keyboard_layout_english_us_dvorak_label" msgid="793528923171145202">"អង់គ្លáŸážŸ (សហរដ្ឋ​អាមáŸážšáž·áž€â€‹)​, ​​រចនាបáŸáž‘្ម Dvorak"</string>
+ <string name="keyboard_layout_german_label" msgid="8451565865467909999">"អាល្លឺម៉ង់"</string>
+ <string name="keyboard_layout_french_label" msgid="813450119589383723">"បារាំង"</string>
+ <string name="keyboard_layout_french_ca_label" msgid="365352601060604832">"បារាំង (កាណាដា​)"</string>
+ <string name="keyboard_layout_russian_label" msgid="8724879775815042968">"រុស្សី"</string>
+ <string name="keyboard_layout_russian_mac_label" msgid="3795866869038264796">"រុស្សី ​រចនាបáŸáž‘្ម Mac"</string>
+ <string name="keyboard_layout_spanish_label" msgid="7091555148131908240">"អáŸážŸáŸ’ប៉ាញ"</string>
+ <string name="keyboard_layout_swiss_french_label" msgid="4659191025396371684">"​​បារាំង​ ស្វីស"</string>
+ <string name="keyboard_layout_swiss_german_label" msgid="2305520941993314258">"អាល្លឺម៉ង់ ស្វីស"</string>
+ <string name="keyboard_layout_belgian" msgid="2011984572838651558">"បែលហ្ស៊ិក"</string>
+ <string name="keyboard_layout_bulgarian" msgid="8951224309972028398">"ប៊ុលហ្ការី"</string>
+ <string name="keyboard_layout_italian" msgid="6497079660449781213">"អ៊ីážáž¶áž›áž¸"</string>
+ <string name="keyboard_layout_danish" msgid="8036432066627127851">"ដាណឺម៉ាក"</string>
+ <string name="keyboard_layout_norwegian" msgid="9090097917011040937">"áž“áŸážšážœáŸ‚ស"</string>
+ <string name="keyboard_layout_swedish" msgid="732959109088479351">"ស៊ុយអែដ"</string>
+ <string name="keyboard_layout_finnish" msgid="5585659438924315466">"ហ្វាំងឡង់"</string>
+ <string name="keyboard_layout_croatian" msgid="4172229471079281138">"ក្រូអាáž"</string>
+ <string name="keyboard_layout_czech" msgid="1349256901452975343">"ឆáŸáž€"</string>
+ <string name="keyboard_layout_estonian" msgid="8775830985185665274">"អáŸážŸáŸ’ážáž¼áž“ី"</string>
+ <string name="keyboard_layout_hungarian" msgid="4154963661406035109">"ហុងគ្រី"</string>
+ <string name="keyboard_layout_icelandic" msgid="5836645650912489642">"អ៊ីស្លង់"</string>
+ <string name="keyboard_layout_brazilian" msgid="5117896443147781939">"ប្រáŸážŸáŸŠáž¸áž›"</string>
+ <string name="keyboard_layout_portuguese" msgid="2888198587329660305">"áž–áŸážšáž‘ុយហ្គាល់"</string>
+ <string name="keyboard_layout_slovak" msgid="2469379934672837296">"ស្លូវ៉ាគី"</string>
+ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"ស្លូវ៉ានី"</string>
+ <string name="keyboard_layout_turkish" msgid="7736163250907964898">"ទួរគី"</string>
+ <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"អ៊ុយក្រែន"</string>
+</resources>
diff --git a/packages/InputDevices/res/values-ko/strings.xml b/packages/InputDevices/res/values-ko/strings.xml
new file mode 100644
index 0000000..8071586
--- /dev/null
+++ b/packages/InputDevices/res/values-ko/strings.xml
@@ -0,0 +1,37 @@
+<?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="app_label" msgid="8016145283189546017">"입력 기기"</string>
+ <string name="keyboard_layouts_label" msgid="6688773268302087545">"Android 키보드"</string>
+ <string name="keyboard_layout_english_uk_label" msgid="6664258463319999632">"ì˜ì–´(ì˜êµ­)"</string>
+ <string name="keyboard_layout_english_us_label" msgid="8994890249649106291">"ì˜ì–´(미국)"</string>
+ <string name="keyboard_layout_english_us_intl" msgid="3705168594034233583">"ì˜ì–´(미국), 글로벌 스타ì¼"</string>
+ <string name="keyboard_layout_english_us_colemak_label" msgid="4194969610343455380">"ì˜ì–´(미국), 콜맥 스타ì¼"</string>
+ <string name="keyboard_layout_english_us_dvorak_label" msgid="793528923171145202">"ì˜ì–´(미국), ë“œë³´ë½ ìŠ¤íƒ€ì¼"</string>
+ <string name="keyboard_layout_german_label" msgid="8451565865467909999">"ë…ì¼ì–´"</string>
+ <string name="keyboard_layout_french_label" msgid="813450119589383723">"프랑스어"</string>
+ <string name="keyboard_layout_french_ca_label" msgid="365352601060604832">"프랑스어(ìºë‚˜ë‹¤)"</string>
+ <string name="keyboard_layout_russian_label" msgid="8724879775815042968">"러시아어"</string>
+ <string name="keyboard_layout_russian_mac_label" msgid="3795866869038264796">"러시아어, Mac 스타ì¼"</string>
+ <string name="keyboard_layout_spanish_label" msgid="7091555148131908240">"스페ì¸ì–´"</string>
+ <string name="keyboard_layout_swiss_french_label" msgid="4659191025396371684">"프랑스어(스위스)"</string>
+ <string name="keyboard_layout_swiss_german_label" msgid="2305520941993314258">"ë…ì¼ì–´(스위스)"</string>
+ <string name="keyboard_layout_belgian" msgid="2011984572838651558">"벨기ì—ì–´"</string>
+ <string name="keyboard_layout_bulgarian" msgid="8951224309972028398">"불가리아어"</string>
+ <string name="keyboard_layout_italian" msgid="6497079660449781213">"ì´íƒˆë¦¬ì•„ì–´"</string>
+ <string name="keyboard_layout_danish" msgid="8036432066627127851">"ë´ë§ˆí¬ì–´"</string>
+ <string name="keyboard_layout_norwegian" msgid="9090097917011040937">"노르웨ì´ì–´"</string>
+ <string name="keyboard_layout_swedish" msgid="732959109088479351">"스웨ë´ì–´"</string>
+ <string name="keyboard_layout_finnish" msgid="5585659438924315466">"핀란드어"</string>
+ <string name="keyboard_layout_croatian" msgid="4172229471079281138">"í¬ë¡œì•„í‹°ì•„ì–´"</string>
+ <string name="keyboard_layout_czech" msgid="1349256901452975343">"체코어"</string>
+ <string name="keyboard_layout_estonian" msgid="8775830985185665274">"ì—스토니아어"</string>
+ <string name="keyboard_layout_hungarian" msgid="4154963661406035109">"í—가리어"</string>
+ <string name="keyboard_layout_icelandic" msgid="5836645650912489642">"ì•„ì´ìŠ¬ëž€ë“œì–´"</string>
+ <string name="keyboard_layout_brazilian" msgid="5117896443147781939">"브ë¼ì§ˆì–´"</string>
+ <string name="keyboard_layout_portuguese" msgid="2888198587329660305">"í¬ë¥´íˆ¬ê°ˆì–´"</string>
+ <string name="keyboard_layout_slovak" msgid="2469379934672837296">"슬로바키아어"</string>
+ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"슬로베니아어"</string>
+ <string name="keyboard_layout_turkish" msgid="7736163250907964898">"터키어"</string>
+ <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"ìš°í¬ë¼ì´ë‚˜ì–´"</string>
+</resources>
diff --git a/packages/InputDevices/res/values-lo-rLA/strings.xml b/packages/InputDevices/res/values-lo-rLA/strings.xml
new file mode 100644
index 0000000..2c97e11
--- /dev/null
+++ b/packages/InputDevices/res/values-lo-rLA/strings.xml
@@ -0,0 +1,37 @@
+<?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="app_label" msgid="8016145283189546017">"ອຸປະàºàº­àº™àº›à»‰àº­àº™àº‚à»à»‰àº¡àº¹àº™"</string>
+ <string name="keyboard_layouts_label" msgid="6688773268302087545">"à»àº›à»‰àº™àºžàº´àº¡ Android"</string>
+ <string name="keyboard_layout_english_uk_label" msgid="6664258463319999632">"ອັງàºàº´àº” (ສະຫະລັດຊະອານາຈັàº)"</string>
+ <string name="keyboard_layout_english_us_label" msgid="8994890249649106291">"ອັງàºàº´àº” (ສະຫະລັດຯ)"</string>
+ <string name="keyboard_layout_english_us_intl" msgid="3705168594034233583">"ອັງàºàº´àº” (ສະຫະລັດຯ), à»àºšàºšàºªàº²àºàº»àº™"</string>
+ <string name="keyboard_layout_english_us_colemak_label" msgid="4194969610343455380">"ອັງàºàº´àº” (ສະຫະລັດຯ), à»àºšàºš Colemak"</string>
+ <string name="keyboard_layout_english_us_dvorak_label" msgid="793528923171145202">"ອັງàºàº´àº” (ສະຫະລັດຯ), à»àºšàºš Dvorak"</string>
+ <string name="keyboard_layout_german_label" msgid="8451565865467909999">"ເຢàºàº¥àº°àº¡àº±àº™"</string>
+ <string name="keyboard_layout_french_label" msgid="813450119589383723">"àºàº£àº±à»ˆàº‡"</string>
+ <string name="keyboard_layout_french_ca_label" msgid="365352601060604832">"àºàº£àº±à»ˆàº‡ (ຄານາດາ)"</string>
+ <string name="keyboard_layout_russian_label" msgid="8724879775815042968">"ຣັດເຊàº"</string>
+ <string name="keyboard_layout_russian_mac_label" msgid="3795866869038264796">"ຣັດຊຽàº, à»àºšàºš Mac"</string>
+ <string name="keyboard_layout_spanish_label" msgid="7091555148131908240">"ສະà»àº›àº™àº™àº´àº”"</string>
+ <string name="keyboard_layout_swiss_french_label" msgid="4659191025396371684">"ສະວິສ àºàº£àº±à»ˆàº‡"</string>
+ <string name="keyboard_layout_swiss_german_label" msgid="2305520941993314258">"ສະວິສ ເຢàºàº¥àº°àº¡àº±àº™"</string>
+ <string name="keyboard_layout_belgian" msgid="2011984572838651558">"ເບວຢ້ຽນ"</string>
+ <string name="keyboard_layout_bulgarian" msgid="8951224309972028398">"ຮັງàºàº²àº£àº½àº™"</string>
+ <string name="keyboard_layout_italian" msgid="6497079660449781213">"ອິຕາລຽນ"</string>
+ <string name="keyboard_layout_danish" msgid="8036432066627127851">"ເດັນນິຊ"</string>
+ <string name="keyboard_layout_norwegian" msgid="9090097917011040937">"ນà»à»€àº§àºàº½àº™"</string>
+ <string name="keyboard_layout_swedish" msgid="732959109088479351">"ສະວີດິຊ"</string>
+ <string name="keyboard_layout_finnish" msgid="5585659438924315466">"ຟິນນິຊ"</string>
+ <string name="keyboard_layout_croatian" msgid="4172229471079281138">"ໂຄຣເອທຽນ"</string>
+ <string name="keyboard_layout_czech" msgid="1349256901452975343">"ເຊàº"</string>
+ <string name="keyboard_layout_estonian" msgid="8775830985185665274">"ເອສໂຕນຽນ"</string>
+ <string name="keyboard_layout_hungarian" msgid="4154963661406035109">"ຮັງàºàº²àº£àº½àº™"</string>
+ <string name="keyboard_layout_icelandic" msgid="5836645650912489642">"ໄອສà»àº¥àº™àº”ິàº"</string>
+ <string name="keyboard_layout_brazilian" msgid="5117896443147781939">"ບຣາຊິລຽນ"</string>
+ <string name="keyboard_layout_portuguese" msgid="2888198587329660305">"ປà»àº•ູàºàºµàºª"</string>
+ <string name="keyboard_layout_slovak" msgid="2469379934672837296">"ສະໂລà»àº§àº±àº"</string>
+ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"ສະໂລເວນຽນ"</string>
+ <string name="keyboard_layout_turkish" msgid="7736163250907964898">"ເຕີàºàº´àºª"</string>
+ <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"ຢູເຄຣນຽນ"</string>
+</resources>
diff --git a/packages/InputDevices/res/values-lt/strings.xml b/packages/InputDevices/res/values-lt/strings.xml
new file mode 100644
index 0000000..c0ed159
--- /dev/null
+++ b/packages/InputDevices/res/values-lt/strings.xml
@@ -0,0 +1,37 @@
+<?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="app_label" msgid="8016145283189546017">"Input Devices"</string>
+ <string name="keyboard_layouts_label" msgid="6688773268302087545">"„Android“ klaviatūra"</string>
+ <string name="keyboard_layout_english_uk_label" msgid="6664258463319999632">"Anglų k. (JK)"</string>
+ <string name="keyboard_layout_english_us_label" msgid="8994890249649106291">"Anglų k. (JAV)"</string>
+ <string name="keyboard_layout_english_us_intl" msgid="3705168594034233583">"Anglų k. (JAV), tarptautinis stilius"</string>
+ <string name="keyboard_layout_english_us_colemak_label" msgid="4194969610343455380">"Anglų k. (JAV), „Colemak“ stilius"</string>
+ <string name="keyboard_layout_english_us_dvorak_label" msgid="793528923171145202">"Anglų k. (JAV), „Dvorak“ stilius"</string>
+ <string name="keyboard_layout_german_label" msgid="8451565865467909999">"VokieÄių k."</string>
+ <string name="keyboard_layout_french_label" msgid="813450119589383723">"Prancūzų k."</string>
+ <string name="keyboard_layout_french_ca_label" msgid="365352601060604832">"Prancūzų k. (Kanada)"</string>
+ <string name="keyboard_layout_russian_label" msgid="8724879775815042968">"Rusų k."</string>
+ <string name="keyboard_layout_russian_mac_label" msgid="3795866869038264796">"Rusų k., „Mac“ stilius"</string>
+ <string name="keyboard_layout_spanish_label" msgid="7091555148131908240">"Ispanų k."</string>
+ <string name="keyboard_layout_swiss_french_label" msgid="4659191025396371684">"Šveicarijos prancūzų k."</string>
+ <string name="keyboard_layout_swiss_german_label" msgid="2305520941993314258">"Å veicarijos vokieÄių k."</string>
+ <string name="keyboard_layout_belgian" msgid="2011984572838651558">"Belgų k."</string>
+ <string name="keyboard_layout_bulgarian" msgid="8951224309972028398">"Bulgarų k."</string>
+ <string name="keyboard_layout_italian" msgid="6497079660449781213">"Italų k."</string>
+ <string name="keyboard_layout_danish" msgid="8036432066627127851">"Danų k."</string>
+ <string name="keyboard_layout_norwegian" msgid="9090097917011040937">"Norvegų k."</string>
+ <string name="keyboard_layout_swedish" msgid="732959109088479351">"Švedų k."</string>
+ <string name="keyboard_layout_finnish" msgid="5585659438924315466">"Suomių k."</string>
+ <string name="keyboard_layout_croatian" msgid="4172229471079281138">"Kroatų k."</string>
+ <string name="keyboard_layout_czech" msgid="1349256901452975343">"Čekų k."</string>
+ <string name="keyboard_layout_estonian" msgid="8775830985185665274">"Estų k."</string>
+ <string name="keyboard_layout_hungarian" msgid="4154963661406035109">"Vengrų k."</string>
+ <string name="keyboard_layout_icelandic" msgid="5836645650912489642">"Islandų k."</string>
+ <string name="keyboard_layout_brazilian" msgid="5117896443147781939">"Brazilų k."</string>
+ <string name="keyboard_layout_portuguese" msgid="2888198587329660305">"Portugalų k."</string>
+ <string name="keyboard_layout_slovak" msgid="2469379934672837296">"Slovakų k."</string>
+ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"Slovėnų k."</string>
+ <string name="keyboard_layout_turkish" msgid="7736163250907964898">"Turkų k."</string>
+ <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"UkrainieÄių k."</string>
+</resources>
diff --git a/packages/InputDevices/res/values-lv/strings.xml b/packages/InputDevices/res/values-lv/strings.xml
new file mode 100644
index 0000000..07a8654
--- /dev/null
+++ b/packages/InputDevices/res/values-lv/strings.xml
@@ -0,0 +1,37 @@
+<?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="app_label" msgid="8016145283189546017">"Ievadierīces"</string>
+ <string name="keyboard_layouts_label" msgid="6688773268302087545">"Android tastatūra"</string>
+ <string name="keyboard_layout_english_uk_label" msgid="6664258463319999632">"Angļu (LielbritÄnija)"</string>
+ <string name="keyboard_layout_english_us_label" msgid="8994890249649106291">"Angļu (ASV)"</string>
+ <string name="keyboard_layout_english_us_intl" msgid="3705168594034233583">"Angļu (ASV), starptautiska"</string>
+ <string name="keyboard_layout_english_us_colemak_label" msgid="4194969610343455380">"Angļu (ASV), Colemak"</string>
+ <string name="keyboard_layout_english_us_dvorak_label" msgid="793528923171145202">"Angļu (ASV), Dvorak"</string>
+ <string name="keyboard_layout_german_label" msgid="8451565865467909999">"VÄcu"</string>
+ <string name="keyboard_layout_french_label" msgid="813450119589383723">"FranÄu"</string>
+ <string name="keyboard_layout_french_ca_label" msgid="365352601060604832">"FranÄu (KanÄda)"</string>
+ <string name="keyboard_layout_russian_label" msgid="8724879775815042968">"Krievu"</string>
+ <string name="keyboard_layout_russian_mac_label" msgid="3795866869038264796">"Krievu, Mac"</string>
+ <string name="keyboard_layout_spanish_label" msgid="7091555148131908240">"SpÄņu"</string>
+ <string name="keyboard_layout_swiss_french_label" msgid="4659191025396371684">"FranÄu (Å veice)"</string>
+ <string name="keyboard_layout_swiss_german_label" msgid="2305520941993314258">"VÄcu (Å veice)"</string>
+ <string name="keyboard_layout_belgian" msgid="2011984572838651558">"Beļģu"</string>
+ <string name="keyboard_layout_bulgarian" msgid="8951224309972028398">"BulgÄru"</string>
+ <string name="keyboard_layout_italian" msgid="6497079660449781213">"ItÄļu"</string>
+ <string name="keyboard_layout_danish" msgid="8036432066627127851">"DÄņu"</string>
+ <string name="keyboard_layout_norwegian" msgid="9090097917011040937">"Norvēģu"</string>
+ <string name="keyboard_layout_swedish" msgid="732959109088479351">"Zviedru"</string>
+ <string name="keyboard_layout_finnish" msgid="5585659438924315466">"Somu"</string>
+ <string name="keyboard_layout_croatian" msgid="4172229471079281138">"HorvÄtu"</string>
+ <string name="keyboard_layout_czech" msgid="1349256901452975343">"ÄŒehu"</string>
+ <string name="keyboard_layout_estonian" msgid="8775830985185665274">"Igauņu"</string>
+ <string name="keyboard_layout_hungarian" msgid="4154963661406035109">"UngÄru"</string>
+ <string name="keyboard_layout_icelandic" msgid="5836645650912489642">"Īslandiešu"</string>
+ <string name="keyboard_layout_brazilian" msgid="5117896443147781939">"Brazīļu"</string>
+ <string name="keyboard_layout_portuguese" msgid="2888198587329660305">"PortugÄļu"</string>
+ <string name="keyboard_layout_slovak" msgid="2469379934672837296">"SlovÄku"</string>
+ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"Slovēņu"</string>
+ <string name="keyboard_layout_turkish" msgid="7736163250907964898">"Turku"</string>
+ <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"Ukraiņu"</string>
+</resources>
diff --git a/packages/InputDevices/res/values-mn-rMN/strings.xml b/packages/InputDevices/res/values-mn-rMN/strings.xml
new file mode 100644
index 0000000..0cfb085
--- /dev/null
+++ b/packages/InputDevices/res/values-mn-rMN/strings.xml
@@ -0,0 +1,37 @@
+<?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="app_label" msgid="8016145283189546017">"Оруулах Төхөөрөмж"</string>
+ <string name="keyboard_layouts_label" msgid="6688773268302087545">"Ðндройд гар"</string>
+ <string name="keyboard_layout_english_uk_label" msgid="6664258463319999632">"Ðнгли (ИБ)"</string>
+ <string name="keyboard_layout_english_us_label" msgid="8994890249649106291">"Ðнгли (ÐÐУ)"</string>
+ <string name="keyboard_layout_english_us_intl" msgid="3705168594034233583">"Ðнгли (ÐÐУ), Олон улÑын Ñтиль"</string>
+ <string name="keyboard_layout_english_us_colemak_label" msgid="4194969610343455380">"Ðнгли (ÐÐУ), Колемак Ñтиль"</string>
+ <string name="keyboard_layout_english_us_dvorak_label" msgid="793528923171145202">"Ðнгли (ÐÐУ), Дворак Ñтиль"</string>
+ <string name="keyboard_layout_german_label" msgid="8451565865467909999">"Герман"</string>
+ <string name="keyboard_layout_french_label" msgid="813450119589383723">"Франц"</string>
+ <string name="keyboard_layout_french_ca_label" msgid="365352601060604832">"Франц (Канад)"</string>
+ <string name="keyboard_layout_russian_label" msgid="8724879775815042968">"ОроÑ"</string>
+ <string name="keyboard_layout_russian_mac_label" msgid="3795866869038264796">"ОроÑ, Maк Ñтиль"</string>
+ <string name="keyboard_layout_spanish_label" msgid="7091555148131908240">"ИÑпани"</string>
+ <string name="keyboard_layout_swiss_french_label" msgid="4659191025396371684">"Швейцарийн Франц"</string>
+ <string name="keyboard_layout_swiss_german_label" msgid="2305520941993314258">"Швейцарийн Герман"</string>
+ <string name="keyboard_layout_belgian" msgid="2011984572838651558">"Бельги"</string>
+ <string name="keyboard_layout_bulgarian" msgid="8951224309972028398">"Болгар"</string>
+ <string name="keyboard_layout_italian" msgid="6497079660449781213">"Итали"</string>
+ <string name="keyboard_layout_danish" msgid="8036432066627127851">"Дани"</string>
+ <string name="keyboard_layout_norwegian" msgid="9090097917011040937">"Ðорвеги"</string>
+ <string name="keyboard_layout_swedish" msgid="732959109088479351">"Швед"</string>
+ <string name="keyboard_layout_finnish" msgid="5585659438924315466">"ФинлÑнд"</string>
+ <string name="keyboard_layout_croatian" msgid="4172229471079281138">"Хорват"</string>
+ <string name="keyboard_layout_czech" msgid="1349256901452975343">"Чех"</string>
+ <string name="keyboard_layout_estonian" msgid="8775830985185665274">"ЭÑтони"</string>
+ <string name="keyboard_layout_hungarian" msgid="4154963661406035109">"Унгар"</string>
+ <string name="keyboard_layout_icelandic" msgid="5836645650912489642">"ИÑланд"</string>
+ <string name="keyboard_layout_brazilian" msgid="5117896443147781939">"Бразил"</string>
+ <string name="keyboard_layout_portuguese" msgid="2888198587329660305">"Португал"</string>
+ <string name="keyboard_layout_slovak" msgid="2469379934672837296">"Словак"</string>
+ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"Словени"</string>
+ <string name="keyboard_layout_turkish" msgid="7736163250907964898">"Турк"</string>
+ <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"Украйн"</string>
+</resources>
diff --git a/packages/InputDevices/res/values-ms-rMY/strings.xml b/packages/InputDevices/res/values-ms-rMY/strings.xml
new file mode 100644
index 0000000..486f048
--- /dev/null
+++ b/packages/InputDevices/res/values-ms-rMY/strings.xml
@@ -0,0 +1,37 @@
+<?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="app_label" msgid="8016145283189546017">"Peranti Input"</string>
+ <string name="keyboard_layouts_label" msgid="6688773268302087545">"Papan kekunci Android"</string>
+ <string name="keyboard_layout_english_uk_label" msgid="6664258463319999632">"Bahasa Inggeris (UK)"</string>
+ <string name="keyboard_layout_english_us_label" msgid="8994890249649106291">"Bahasa Inggeris (AS)"</string>
+ <string name="keyboard_layout_english_us_intl" msgid="3705168594034233583">"Bahasa Inggeris (AS), gaya A/bangsa"</string>
+ <string name="keyboard_layout_english_us_colemak_label" msgid="4194969610343455380">"Bahasa Inggeris (AS), gaya Colemak"</string>
+ <string name="keyboard_layout_english_us_dvorak_label" msgid="793528923171145202">"Bahasa Inggeris (AS), gaya Dvorak"</string>
+ <string name="keyboard_layout_german_label" msgid="8451565865467909999">"Bahasa Jerman"</string>
+ <string name="keyboard_layout_french_label" msgid="813450119589383723">"Bahasa Perancis"</string>
+ <string name="keyboard_layout_french_ca_label" msgid="365352601060604832">"Bahasa Perancis (Kanada)"</string>
+ <string name="keyboard_layout_russian_label" msgid="8724879775815042968">"Bahasa Rusia"</string>
+ <string name="keyboard_layout_russian_mac_label" msgid="3795866869038264796">"Bahasa Rusia, gaya Mac"</string>
+ <string name="keyboard_layout_spanish_label" msgid="7091555148131908240">"Bahasa Sepanyol"</string>
+ <string name="keyboard_layout_swiss_french_label" msgid="4659191025396371684">"Perancis Switzerland"</string>
+ <string name="keyboard_layout_swiss_german_label" msgid="2305520941993314258">"Jerman Switzerland"</string>
+ <string name="keyboard_layout_belgian" msgid="2011984572838651558">"Bahasa Belgium"</string>
+ <string name="keyboard_layout_bulgarian" msgid="8951224309972028398">"Bahasa Bulgaria"</string>
+ <string name="keyboard_layout_italian" msgid="6497079660449781213">"Bahasa Itali"</string>
+ <string name="keyboard_layout_danish" msgid="8036432066627127851">"Bahasa Denmark"</string>
+ <string name="keyboard_layout_norwegian" msgid="9090097917011040937">"Bahasa Norway"</string>
+ <string name="keyboard_layout_swedish" msgid="732959109088479351">"Bahasa Sweden"</string>
+ <string name="keyboard_layout_finnish" msgid="5585659438924315466">"Bahasa Finland"</string>
+ <string name="keyboard_layout_croatian" msgid="4172229471079281138">"Bahasa Croatia"</string>
+ <string name="keyboard_layout_czech" msgid="1349256901452975343">"Bahasa Czech"</string>
+ <string name="keyboard_layout_estonian" msgid="8775830985185665274">"Bahasa Estonia"</string>
+ <string name="keyboard_layout_hungarian" msgid="4154963661406035109">"Bahasa Hungary"</string>
+ <string name="keyboard_layout_icelandic" msgid="5836645650912489642">"Bahasa Iceland"</string>
+ <string name="keyboard_layout_brazilian" msgid="5117896443147781939">"Bahasa Brazil"</string>
+ <string name="keyboard_layout_portuguese" msgid="2888198587329660305">"Bahasa Portugis"</string>
+ <string name="keyboard_layout_slovak" msgid="2469379934672837296">"Bahasa Slovakia"</string>
+ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"Bahasa Slovenia"</string>
+ <string name="keyboard_layout_turkish" msgid="7736163250907964898">"Bahasa Turki"</string>
+ <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"Bahasa Ukraine"</string>
+</resources>
diff --git a/packages/InputDevices/res/values-nb/strings.xml b/packages/InputDevices/res/values-nb/strings.xml
new file mode 100644
index 0000000..b646061
--- /dev/null
+++ b/packages/InputDevices/res/values-nb/strings.xml
@@ -0,0 +1,37 @@
+<?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="app_label" msgid="8016145283189546017">"Inndataenheter"</string>
+ <string name="keyboard_layouts_label" msgid="6688773268302087545">"Android-tastatur"</string>
+ <string name="keyboard_layout_english_uk_label" msgid="6664258463319999632">"Engelsk (Storbritannia)"</string>
+ <string name="keyboard_layout_english_us_label" msgid="8994890249649106291">"Engelsk (USA)"</string>
+ <string name="keyboard_layout_english_us_intl" msgid="3705168594034233583">"Engelsk (USA), internasjonal stil"</string>
+ <string name="keyboard_layout_english_us_colemak_label" msgid="4194969610343455380">"Engelsk (USA), Colemak-stil"</string>
+ <string name="keyboard_layout_english_us_dvorak_label" msgid="793528923171145202">"Engelsk (USA), Dvorak-stil"</string>
+ <string name="keyboard_layout_german_label" msgid="8451565865467909999">"Tysk"</string>
+ <string name="keyboard_layout_french_label" msgid="813450119589383723">"Fransk"</string>
+ <string name="keyboard_layout_french_ca_label" msgid="365352601060604832">"Fransk (Canada)"</string>
+ <string name="keyboard_layout_russian_label" msgid="8724879775815042968">"Russisk"</string>
+ <string name="keyboard_layout_russian_mac_label" msgid="3795866869038264796">"Russisk, Mac-stil"</string>
+ <string name="keyboard_layout_spanish_label" msgid="7091555148131908240">"Spansk"</string>
+ <string name="keyboard_layout_swiss_french_label" msgid="4659191025396371684">"Sveitsisk fransk"</string>
+ <string name="keyboard_layout_swiss_german_label" msgid="2305520941993314258">"Sveitsisk standardtysk"</string>
+ <string name="keyboard_layout_belgian" msgid="2011984572838651558">"Belgisk"</string>
+ <string name="keyboard_layout_bulgarian" msgid="8951224309972028398">"Bulgarsk"</string>
+ <string name="keyboard_layout_italian" msgid="6497079660449781213">"Italiensk"</string>
+ <string name="keyboard_layout_danish" msgid="8036432066627127851">"Dansk"</string>
+ <string name="keyboard_layout_norwegian" msgid="9090097917011040937">"Norsk"</string>
+ <string name="keyboard_layout_swedish" msgid="732959109088479351">"Svensk"</string>
+ <string name="keyboard_layout_finnish" msgid="5585659438924315466">"Finsk"</string>
+ <string name="keyboard_layout_croatian" msgid="4172229471079281138">"Kroatisk"</string>
+ <string name="keyboard_layout_czech" msgid="1349256901452975343">"Tsjekkisk"</string>
+ <string name="keyboard_layout_estonian" msgid="8775830985185665274">"Estisk"</string>
+ <string name="keyboard_layout_hungarian" msgid="4154963661406035109">"Ungarsk"</string>
+ <string name="keyboard_layout_icelandic" msgid="5836645650912489642">"Islandsk"</string>
+ <string name="keyboard_layout_brazilian" msgid="5117896443147781939">"Brasiliansk"</string>
+ <string name="keyboard_layout_portuguese" msgid="2888198587329660305">"Portugisisk"</string>
+ <string name="keyboard_layout_slovak" msgid="2469379934672837296">"Slovakisk"</string>
+ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"Slovensk"</string>
+ <string name="keyboard_layout_turkish" msgid="7736163250907964898">"Tyrkisk"</string>
+ <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"Ukrainsk"</string>
+</resources>
diff --git a/packages/InputDevices/res/values-nl/strings.xml b/packages/InputDevices/res/values-nl/strings.xml
new file mode 100644
index 0000000..56d84c9
--- /dev/null
+++ b/packages/InputDevices/res/values-nl/strings.xml
@@ -0,0 +1,37 @@
+<?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="app_label" msgid="8016145283189546017">"Invoerapparaten"</string>
+ <string name="keyboard_layouts_label" msgid="6688773268302087545">"Android-toetsenbord"</string>
+ <string name="keyboard_layout_english_uk_label" msgid="6664258463319999632">"Engels (Verenigd Koninkrijk)"</string>
+ <string name="keyboard_layout_english_us_label" msgid="8994890249649106291">"Engels (Verenigde Staten)"</string>
+ <string name="keyboard_layout_english_us_intl" msgid="3705168594034233583">"Engels (VS), internationaal"</string>
+ <string name="keyboard_layout_english_us_colemak_label" msgid="4194969610343455380">"Engels (VS), Colemak"</string>
+ <string name="keyboard_layout_english_us_dvorak_label" msgid="793528923171145202">"Engels (VS), Dvorak"</string>
+ <string name="keyboard_layout_german_label" msgid="8451565865467909999">"Duits"</string>
+ <string name="keyboard_layout_french_label" msgid="813450119589383723">"Frans"</string>
+ <string name="keyboard_layout_french_ca_label" msgid="365352601060604832">"Frans (Canada)"</string>
+ <string name="keyboard_layout_russian_label" msgid="8724879775815042968">"Russisch"</string>
+ <string name="keyboard_layout_russian_mac_label" msgid="3795866869038264796">"Russisch, Mac"</string>
+ <string name="keyboard_layout_spanish_label" msgid="7091555148131908240">"Spaans"</string>
+ <string name="keyboard_layout_swiss_french_label" msgid="4659191025396371684">"Zwitsers Frans"</string>
+ <string name="keyboard_layout_swiss_german_label" msgid="2305520941993314258">"Zwitsers Duits"</string>
+ <string name="keyboard_layout_belgian" msgid="2011984572838651558">"Belgisch"</string>
+ <string name="keyboard_layout_bulgarian" msgid="8951224309972028398">"Bulgaars"</string>
+ <string name="keyboard_layout_italian" msgid="6497079660449781213">"Italiaans"</string>
+ <string name="keyboard_layout_danish" msgid="8036432066627127851">"Deens"</string>
+ <string name="keyboard_layout_norwegian" msgid="9090097917011040937">"Noors"</string>
+ <string name="keyboard_layout_swedish" msgid="732959109088479351">"Zweeds"</string>
+ <string name="keyboard_layout_finnish" msgid="5585659438924315466">"Fins"</string>
+ <string name="keyboard_layout_croatian" msgid="4172229471079281138">"Kroatisch"</string>
+ <string name="keyboard_layout_czech" msgid="1349256901452975343">"Tsjechisch"</string>
+ <string name="keyboard_layout_estonian" msgid="8775830985185665274">"Estlands"</string>
+ <string name="keyboard_layout_hungarian" msgid="4154963661406035109">"Hongaars"</string>
+ <string name="keyboard_layout_icelandic" msgid="5836645650912489642">"IJslands"</string>
+ <string name="keyboard_layout_brazilian" msgid="5117896443147781939">"Braziliaans"</string>
+ <string name="keyboard_layout_portuguese" msgid="2888198587329660305">"Portugees"</string>
+ <string name="keyboard_layout_slovak" msgid="2469379934672837296">"Slowaaks"</string>
+ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"Sloveens"</string>
+ <string name="keyboard_layout_turkish" msgid="7736163250907964898">"Turks"</string>
+ <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"Oekraïens"</string>
+</resources>
diff --git a/packages/InputDevices/res/values-pl/strings.xml b/packages/InputDevices/res/values-pl/strings.xml
new file mode 100644
index 0000000..4522215
--- /dev/null
+++ b/packages/InputDevices/res/values-pl/strings.xml
@@ -0,0 +1,37 @@
+<?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="app_label" msgid="8016145283189546017">"Urządzenia wejściowe"</string>
+ <string name="keyboard_layouts_label" msgid="6688773268302087545">"Klawiatura Android"</string>
+ <string name="keyboard_layout_english_uk_label" msgid="6664258463319999632">"Angielski (Wielka Brytania)"</string>
+ <string name="keyboard_layout_english_us_label" msgid="8994890249649106291">"Angielski (USA)"</string>
+ <string name="keyboard_layout_english_us_intl" msgid="3705168594034233583">"Angielski (USA), międzynarodowy"</string>
+ <string name="keyboard_layout_english_us_colemak_label" msgid="4194969610343455380">"Angielski (USA), Colemak"</string>
+ <string name="keyboard_layout_english_us_dvorak_label" msgid="793528923171145202">"Angielski (USA), Dvorak"</string>
+ <string name="keyboard_layout_german_label" msgid="8451565865467909999">"Niemiecki"</string>
+ <string name="keyboard_layout_french_label" msgid="813450119589383723">"Francuski"</string>
+ <string name="keyboard_layout_french_ca_label" msgid="365352601060604832">"Francuski (Kanada)"</string>
+ <string name="keyboard_layout_russian_label" msgid="8724879775815042968">"Rosyjski"</string>
+ <string name="keyboard_layout_russian_mac_label" msgid="3795866869038264796">"Rosyjski, Mac"</string>
+ <string name="keyboard_layout_spanish_label" msgid="7091555148131908240">"Hiszpański"</string>
+ <string name="keyboard_layout_swiss_french_label" msgid="4659191025396371684">"Francuski (Szwajcaria)"</string>
+ <string name="keyboard_layout_swiss_german_label" msgid="2305520941993314258">"Niemiecki (Szwajcaria)"</string>
+ <string name="keyboard_layout_belgian" msgid="2011984572838651558">"Belgijski"</string>
+ <string name="keyboard_layout_bulgarian" msgid="8951224309972028398">"Bułgarski"</string>
+ <string name="keyboard_layout_italian" msgid="6497079660449781213">"Włoski"</string>
+ <string name="keyboard_layout_danish" msgid="8036432066627127851">"Duński"</string>
+ <string name="keyboard_layout_norwegian" msgid="9090097917011040937">"Norweski"</string>
+ <string name="keyboard_layout_swedish" msgid="732959109088479351">"Szwedzki"</string>
+ <string name="keyboard_layout_finnish" msgid="5585659438924315466">"Fiński"</string>
+ <string name="keyboard_layout_croatian" msgid="4172229471079281138">"Chorwacki"</string>
+ <string name="keyboard_layout_czech" msgid="1349256901452975343">"Czeski"</string>
+ <string name="keyboard_layout_estonian" msgid="8775830985185665274">"Estoński"</string>
+ <string name="keyboard_layout_hungarian" msgid="4154963661406035109">"Węgierski"</string>
+ <string name="keyboard_layout_icelandic" msgid="5836645650912489642">"Islandzki"</string>
+ <string name="keyboard_layout_brazilian" msgid="5117896443147781939">"Brazylijski"</string>
+ <string name="keyboard_layout_portuguese" msgid="2888198587329660305">"Portugalski"</string>
+ <string name="keyboard_layout_slovak" msgid="2469379934672837296">"Słowacki"</string>
+ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"Słoweński"</string>
+ <string name="keyboard_layout_turkish" msgid="7736163250907964898">"Turecki"</string>
+ <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"Ukraiński"</string>
+</resources>
diff --git a/packages/InputDevices/res/values-pt-rPT/strings.xml b/packages/InputDevices/res/values-pt-rPT/strings.xml
new file mode 100644
index 0000000..9a639cd
--- /dev/null
+++ b/packages/InputDevices/res/values-pt-rPT/strings.xml
@@ -0,0 +1,37 @@
+<?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="app_label" msgid="8016145283189546017">"Dispositivos de entrada"</string>
+ <string name="keyboard_layouts_label" msgid="6688773268302087545">"Teclado do Android"</string>
+ <string name="keyboard_layout_english_uk_label" msgid="6664258463319999632">"Inglês (RU)"</string>
+ <string name="keyboard_layout_english_us_label" msgid="8994890249649106291">"Inglês (EUA)"</string>
+ <string name="keyboard_layout_english_us_intl" msgid="3705168594034233583">"Inglês (EUA), est. Internacional"</string>
+ <string name="keyboard_layout_english_us_colemak_label" msgid="4194969610343455380">"Inglês (EUA), estilo Colemak"</string>
+ <string name="keyboard_layout_english_us_dvorak_label" msgid="793528923171145202">"Inglês (EUA), estilo Dvorak"</string>
+ <string name="keyboard_layout_german_label" msgid="8451565865467909999">"Alemão"</string>
+ <string name="keyboard_layout_french_label" msgid="813450119589383723">"Francês"</string>
+ <string name="keyboard_layout_french_ca_label" msgid="365352601060604832">"Francês (Canadá)"</string>
+ <string name="keyboard_layout_russian_label" msgid="8724879775815042968">"Russo"</string>
+ <string name="keyboard_layout_russian_mac_label" msgid="3795866869038264796">"Russo, estilo Mac"</string>
+ <string name="keyboard_layout_spanish_label" msgid="7091555148131908240">"Espanhol"</string>
+ <string name="keyboard_layout_swiss_french_label" msgid="4659191025396371684">"Francês (Suíça)"</string>
+ <string name="keyboard_layout_swiss_german_label" msgid="2305520941993314258">"Alemão (Suíça)"</string>
+ <string name="keyboard_layout_belgian" msgid="2011984572838651558">"Belga"</string>
+ <string name="keyboard_layout_bulgarian" msgid="8951224309972028398">"Búlgaro"</string>
+ <string name="keyboard_layout_italian" msgid="6497079660449781213">"Italiano"</string>
+ <string name="keyboard_layout_danish" msgid="8036432066627127851">"Dinamarquês"</string>
+ <string name="keyboard_layout_norwegian" msgid="9090097917011040937">"Norueguês"</string>
+ <string name="keyboard_layout_swedish" msgid="732959109088479351">"Sueco"</string>
+ <string name="keyboard_layout_finnish" msgid="5585659438924315466">"Finlandês"</string>
+ <string name="keyboard_layout_croatian" msgid="4172229471079281138">"Croata"</string>
+ <string name="keyboard_layout_czech" msgid="1349256901452975343">"Checo"</string>
+ <string name="keyboard_layout_estonian" msgid="8775830985185665274">"Estónio"</string>
+ <string name="keyboard_layout_hungarian" msgid="4154963661406035109">"Húngaro"</string>
+ <string name="keyboard_layout_icelandic" msgid="5836645650912489642">"Islandês"</string>
+ <string name="keyboard_layout_brazilian" msgid="5117896443147781939">"Brasileiro"</string>
+ <string name="keyboard_layout_portuguese" msgid="2888198587329660305">"Português"</string>
+ <string name="keyboard_layout_slovak" msgid="2469379934672837296">"Eslovaco"</string>
+ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"Esloveno"</string>
+ <string name="keyboard_layout_turkish" msgid="7736163250907964898">"Turco"</string>
+ <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"Ucraniano"</string>
+</resources>
diff --git a/packages/InputDevices/res/values-pt/strings.xml b/packages/InputDevices/res/values-pt/strings.xml
new file mode 100644
index 0000000..05a0cd0
--- /dev/null
+++ b/packages/InputDevices/res/values-pt/strings.xml
@@ -0,0 +1,37 @@
+<?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="app_label" msgid="8016145283189546017">"Dispositivos de entrada"</string>
+ <string name="keyboard_layouts_label" msgid="6688773268302087545">"Teclado do Android"</string>
+ <string name="keyboard_layout_english_uk_label" msgid="6664258463319999632">"Inglês (Reino Unido)"</string>
+ <string name="keyboard_layout_english_us_label" msgid="8994890249649106291">"Inglês (EUA)"</string>
+ <string name="keyboard_layout_english_us_intl" msgid="3705168594034233583">"Inglês (EUA), estilo internacional"</string>
+ <string name="keyboard_layout_english_us_colemak_label" msgid="4194969610343455380">"Inglês (EUA), estilo Colemak"</string>
+ <string name="keyboard_layout_english_us_dvorak_label" msgid="793528923171145202">"Inglês (EUA), estilo Dvorak"</string>
+ <string name="keyboard_layout_german_label" msgid="8451565865467909999">"Alemão"</string>
+ <string name="keyboard_layout_french_label" msgid="813450119589383723">"Francês"</string>
+ <string name="keyboard_layout_french_ca_label" msgid="365352601060604832">"Francês (Canadá)"</string>
+ <string name="keyboard_layout_russian_label" msgid="8724879775815042968">"Russo"</string>
+ <string name="keyboard_layout_russian_mac_label" msgid="3795866869038264796">"Russo, estilo Mac"</string>
+ <string name="keyboard_layout_spanish_label" msgid="7091555148131908240">"Espanhol"</string>
+ <string name="keyboard_layout_swiss_french_label" msgid="4659191025396371684">"Francês suíço"</string>
+ <string name="keyboard_layout_swiss_german_label" msgid="2305520941993314258">"Alemão suíço"</string>
+ <string name="keyboard_layout_belgian" msgid="2011984572838651558">"Belga"</string>
+ <string name="keyboard_layout_bulgarian" msgid="8951224309972028398">"Búlgaro"</string>
+ <string name="keyboard_layout_italian" msgid="6497079660449781213">"Italiano"</string>
+ <string name="keyboard_layout_danish" msgid="8036432066627127851">"Dinamarquês"</string>
+ <string name="keyboard_layout_norwegian" msgid="9090097917011040937">"Norueguês"</string>
+ <string name="keyboard_layout_swedish" msgid="732959109088479351">"Sueco"</string>
+ <string name="keyboard_layout_finnish" msgid="5585659438924315466">"Finlandês"</string>
+ <string name="keyboard_layout_croatian" msgid="4172229471079281138">"Croata"</string>
+ <string name="keyboard_layout_czech" msgid="1349256901452975343">"Tcheco"</string>
+ <string name="keyboard_layout_estonian" msgid="8775830985185665274">"Estoniano"</string>
+ <string name="keyboard_layout_hungarian" msgid="4154963661406035109">"Húngaro"</string>
+ <string name="keyboard_layout_icelandic" msgid="5836645650912489642">"Islandês"</string>
+ <string name="keyboard_layout_brazilian" msgid="5117896443147781939">"Brasileiro"</string>
+ <string name="keyboard_layout_portuguese" msgid="2888198587329660305">"Português"</string>
+ <string name="keyboard_layout_slovak" msgid="2469379934672837296">"Eslovaco"</string>
+ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"Esloveno"</string>
+ <string name="keyboard_layout_turkish" msgid="7736163250907964898">"Turco"</string>
+ <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"Ucraniano"</string>
+</resources>
diff --git a/packages/InputDevices/res/values-ro/strings.xml b/packages/InputDevices/res/values-ro/strings.xml
new file mode 100644
index 0000000..895d8f6
--- /dev/null
+++ b/packages/InputDevices/res/values-ro/strings.xml
@@ -0,0 +1,37 @@
+<?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="app_label" msgid="8016145283189546017">"Dispozitive de introducere de date"</string>
+ <string name="keyboard_layouts_label" msgid="6688773268302087545">"Tastatură Android"</string>
+ <string name="keyboard_layout_english_uk_label" msgid="6664258463319999632">"Engleză (Regatul Unit)"</string>
+ <string name="keyboard_layout_english_us_label" msgid="8994890249649106291">"Engleză (SUA)"</string>
+ <string name="keyboard_layout_english_us_intl" msgid="3705168594034233583">"Engleză (SUA), stil internațional"</string>
+ <string name="keyboard_layout_english_us_colemak_label" msgid="4194969610343455380">"Engleză (SUA), stil Colemak"</string>
+ <string name="keyboard_layout_english_us_dvorak_label" msgid="793528923171145202">"Engleză (SUA), stil Dvorak"</string>
+ <string name="keyboard_layout_german_label" msgid="8451565865467909999">"Germană"</string>
+ <string name="keyboard_layout_french_label" msgid="813450119589383723">"Franceză"</string>
+ <string name="keyboard_layout_french_ca_label" msgid="365352601060604832">"Franceză (Canada)"</string>
+ <string name="keyboard_layout_russian_label" msgid="8724879775815042968">"Rusă"</string>
+ <string name="keyboard_layout_russian_mac_label" msgid="3795866869038264796">"Rusă, stil Mac"</string>
+ <string name="keyboard_layout_spanish_label" msgid="7091555148131908240">"Spaniolă"</string>
+ <string name="keyboard_layout_swiss_french_label" msgid="4659191025396371684">"Franceză (Elveția)"</string>
+ <string name="keyboard_layout_swiss_german_label" msgid="2305520941993314258">"Germană (Elveția)"</string>
+ <string name="keyboard_layout_belgian" msgid="2011984572838651558">"Belgiană"</string>
+ <string name="keyboard_layout_bulgarian" msgid="8951224309972028398">"Bulgară"</string>
+ <string name="keyboard_layout_italian" msgid="6497079660449781213">"Italiană"</string>
+ <string name="keyboard_layout_danish" msgid="8036432066627127851">"Daneză"</string>
+ <string name="keyboard_layout_norwegian" msgid="9090097917011040937">"Norvegiană"</string>
+ <string name="keyboard_layout_swedish" msgid="732959109088479351">"Suedeză"</string>
+ <string name="keyboard_layout_finnish" msgid="5585659438924315466">"Finlandeză"</string>
+ <string name="keyboard_layout_croatian" msgid="4172229471079281138">"Croată"</string>
+ <string name="keyboard_layout_czech" msgid="1349256901452975343">"Cehă"</string>
+ <string name="keyboard_layout_estonian" msgid="8775830985185665274">"Estoniană"</string>
+ <string name="keyboard_layout_hungarian" msgid="4154963661406035109">"Maghiară"</string>
+ <string name="keyboard_layout_icelandic" msgid="5836645650912489642">"Islandeză"</string>
+ <string name="keyboard_layout_brazilian" msgid="5117896443147781939">"Braziliană"</string>
+ <string name="keyboard_layout_portuguese" msgid="2888198587329660305">"Portugheză"</string>
+ <string name="keyboard_layout_slovak" msgid="2469379934672837296">"Slovacă"</string>
+ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"Slovenă"</string>
+ <string name="keyboard_layout_turkish" msgid="7736163250907964898">"Turcă"</string>
+ <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"Ucraineană"</string>
+</resources>
diff --git a/packages/InputDevices/res/values-ru/strings.xml b/packages/InputDevices/res/values-ru/strings.xml
new file mode 100644
index 0000000..a4cbfd7
--- /dev/null
+++ b/packages/InputDevices/res/values-ru/strings.xml
@@ -0,0 +1,37 @@
+<?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="app_label" msgid="8016145283189546017">"УÑтройÑтва ввода"</string>
+ <string name="keyboard_layouts_label" msgid="6688773268302087545">"Клавиатура Android"</string>
+ <string name="keyboard_layout_english_uk_label" msgid="6664258463319999632">"английÑкий (ВеликобританиÑ)"</string>
+ <string name="keyboard_layout_english_us_label" msgid="8994890249649106291">"английÑкий (СШÐ)"</string>
+ <string name="keyboard_layout_english_us_intl" msgid="3705168594034233583">"английÑкий (СШÐ, международнаÑ)"</string>
+ <string name="keyboard_layout_english_us_colemak_label" msgid="4194969610343455380">"английÑкий (СШÐ, Colemak)"</string>
+ <string name="keyboard_layout_english_us_dvorak_label" msgid="793528923171145202">"английÑкий (СШÐ, Dvorak)"</string>
+ <string name="keyboard_layout_german_label" msgid="8451565865467909999">"немецкий"</string>
+ <string name="keyboard_layout_french_label" msgid="813450119589383723">"французÑкий"</string>
+ <string name="keyboard_layout_french_ca_label" msgid="365352601060604832">"французÑкий (Канада)"</string>
+ <string name="keyboard_layout_russian_label" msgid="8724879775815042968">"руÑÑкий"</string>
+ <string name="keyboard_layout_russian_mac_label" msgid="3795866869038264796">"руÑÑкий (Mac)"</string>
+ <string name="keyboard_layout_spanish_label" msgid="7091555148131908240">"иÑпанÑкий"</string>
+ <string name="keyboard_layout_swiss_french_label" msgid="4659191025396371684">"французÑкий (ШвейцариÑ)"</string>
+ <string name="keyboard_layout_swiss_german_label" msgid="2305520941993314258">"немецкий (ШвейцариÑ)"</string>
+ <string name="keyboard_layout_belgian" msgid="2011984572838651558">"нидерландÑкий (БельгиÑ)"</string>
+ <string name="keyboard_layout_bulgarian" msgid="8951224309972028398">"болгарÑкий"</string>
+ <string name="keyboard_layout_italian" msgid="6497079660449781213">"итальÑнÑкий"</string>
+ <string name="keyboard_layout_danish" msgid="8036432066627127851">"датÑкий"</string>
+ <string name="keyboard_layout_norwegian" msgid="9090097917011040937">"норвежÑкий"</string>
+ <string name="keyboard_layout_swedish" msgid="732959109088479351">"шведÑкий"</string>
+ <string name="keyboard_layout_finnish" msgid="5585659438924315466">"финÑкий"</string>
+ <string name="keyboard_layout_croatian" msgid="4172229471079281138">"хорватÑкий"</string>
+ <string name="keyboard_layout_czech" msgid="1349256901452975343">"чешÑкий"</string>
+ <string name="keyboard_layout_estonian" msgid="8775830985185665274">"ÑÑтонÑкий"</string>
+ <string name="keyboard_layout_hungarian" msgid="4154963661406035109">"венгерÑкий"</string>
+ <string name="keyboard_layout_icelandic" msgid="5836645650912489642">"иÑландÑкий"</string>
+ <string name="keyboard_layout_brazilian" msgid="5117896443147781939">"португальÑкий (БразилиÑ)"</string>
+ <string name="keyboard_layout_portuguese" msgid="2888198587329660305">"португальÑкий"</string>
+ <string name="keyboard_layout_slovak" msgid="2469379934672837296">"Ñловацкий"</string>
+ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"ÑловенÑкий"</string>
+ <string name="keyboard_layout_turkish" msgid="7736163250907964898">"турецкий"</string>
+ <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"украинÑкий"</string>
+</resources>
diff --git a/packages/InputDevices/res/values-sk/strings.xml b/packages/InputDevices/res/values-sk/strings.xml
new file mode 100644
index 0000000..01ab042
--- /dev/null
+++ b/packages/InputDevices/res/values-sk/strings.xml
@@ -0,0 +1,37 @@
+<?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="app_label" msgid="8016145283189546017">"Vstupné zariadenia"</string>
+ <string name="keyboard_layouts_label" msgid="6688773268302087545">"Klávesnica Android"</string>
+ <string name="keyboard_layout_english_uk_label" msgid="6664258463319999632">"anglické (Spojené kráľovstvo)"</string>
+ <string name="keyboard_layout_english_us_label" msgid="8994890249649106291">"anglické (USA)"</string>
+ <string name="keyboard_layout_english_us_intl" msgid="3705168594034233583">"anglické (USA), medzinárodné"</string>
+ <string name="keyboard_layout_english_us_colemak_label" msgid="4194969610343455380">"anglické (USA), štýl Colemak"</string>
+ <string name="keyboard_layout_english_us_dvorak_label" msgid="793528923171145202">"anglické (USA), štýl Dvorak"</string>
+ <string name="keyboard_layout_german_label" msgid="8451565865467909999">"nemecké"</string>
+ <string name="keyboard_layout_french_label" msgid="813450119589383723">"francúzske"</string>
+ <string name="keyboard_layout_french_ca_label" msgid="365352601060604832">"francúzske (Kanada)"</string>
+ <string name="keyboard_layout_russian_label" msgid="8724879775815042968">"ruské"</string>
+ <string name="keyboard_layout_russian_mac_label" msgid="3795866869038264796">"ruské, štýl Mac"</string>
+ <string name="keyboard_layout_spanish_label" msgid="7091555148131908240">"španielske"</string>
+ <string name="keyboard_layout_swiss_french_label" msgid="4659191025396371684">"Å¡vajÄiarske (francúzÅ¡tina)"</string>
+ <string name="keyboard_layout_swiss_german_label" msgid="2305520941993314258">"Å¡vajÄiarske (nemÄina)"</string>
+ <string name="keyboard_layout_belgian" msgid="2011984572838651558">"belgické"</string>
+ <string name="keyboard_layout_bulgarian" msgid="8951224309972028398">"bulharské"</string>
+ <string name="keyboard_layout_italian" msgid="6497079660449781213">"talianske"</string>
+ <string name="keyboard_layout_danish" msgid="8036432066627127851">"dánske"</string>
+ <string name="keyboard_layout_norwegian" msgid="9090097917011040937">"nórske"</string>
+ <string name="keyboard_layout_swedish" msgid="732959109088479351">"švédske"</string>
+ <string name="keyboard_layout_finnish" msgid="5585659438924315466">"fínske"</string>
+ <string name="keyboard_layout_croatian" msgid="4172229471079281138">"chorvátske"</string>
+ <string name="keyboard_layout_czech" msgid="1349256901452975343">"Äeské"</string>
+ <string name="keyboard_layout_estonian" msgid="8775830985185665274">"estónske"</string>
+ <string name="keyboard_layout_hungarian" msgid="4154963661406035109">"maÄarské"</string>
+ <string name="keyboard_layout_icelandic" msgid="5836645650912489642">"islandské"</string>
+ <string name="keyboard_layout_brazilian" msgid="5117896443147781939">"brazílske"</string>
+ <string name="keyboard_layout_portuguese" msgid="2888198587329660305">"portugalské"</string>
+ <string name="keyboard_layout_slovak" msgid="2469379934672837296">"slovenské"</string>
+ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"slovinské"</string>
+ <string name="keyboard_layout_turkish" msgid="7736163250907964898">"turecké"</string>
+ <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"ukrajinské"</string>
+</resources>
diff --git a/packages/InputDevices/res/values-sl/strings.xml b/packages/InputDevices/res/values-sl/strings.xml
new file mode 100644
index 0000000..30ff3c4
--- /dev/null
+++ b/packages/InputDevices/res/values-sl/strings.xml
@@ -0,0 +1,37 @@
+<?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="app_label" msgid="8016145283189546017">"Vhodne naprave"</string>
+ <string name="keyboard_layouts_label" msgid="6688773268302087545">"Tipkovnica Android"</string>
+ <string name="keyboard_layout_english_uk_label" msgid="6664258463319999632">"angleška (Združeno kraljestvo)"</string>
+ <string name="keyboard_layout_english_us_label" msgid="8994890249649106291">"angleška (ZDA)"</string>
+ <string name="keyboard_layout_english_us_intl" msgid="3705168594034233583">"angleška (ZDA), mednarodni slog"</string>
+ <string name="keyboard_layout_english_us_colemak_label" msgid="4194969610343455380">"angleška (ZDA), slog Colemak"</string>
+ <string name="keyboard_layout_english_us_dvorak_label" msgid="793528923171145202">"angleška (ZDA), slog Dvorak"</string>
+ <string name="keyboard_layout_german_label" msgid="8451565865467909999">"nemška"</string>
+ <string name="keyboard_layout_french_label" msgid="813450119589383723">"francoska"</string>
+ <string name="keyboard_layout_french_ca_label" msgid="365352601060604832">"francoska (Kanada)"</string>
+ <string name="keyboard_layout_russian_label" msgid="8724879775815042968">"ruska"</string>
+ <string name="keyboard_layout_russian_mac_label" msgid="3795866869038264796">"ruska, slog Mac"</string>
+ <string name="keyboard_layout_spanish_label" msgid="7091555148131908240">"španska"</string>
+ <string name="keyboard_layout_swiss_french_label" msgid="4659191025396371684">"švicarska francoska"</string>
+ <string name="keyboard_layout_swiss_german_label" msgid="2305520941993314258">"švicarska nemška"</string>
+ <string name="keyboard_layout_belgian" msgid="2011984572838651558">"belgijska"</string>
+ <string name="keyboard_layout_bulgarian" msgid="8951224309972028398">"bolgarska"</string>
+ <string name="keyboard_layout_italian" msgid="6497079660449781213">"italijanska"</string>
+ <string name="keyboard_layout_danish" msgid="8036432066627127851">"danska"</string>
+ <string name="keyboard_layout_norwegian" msgid="9090097917011040937">"norveška"</string>
+ <string name="keyboard_layout_swedish" msgid="732959109088479351">"švedska"</string>
+ <string name="keyboard_layout_finnish" msgid="5585659438924315466">"finska"</string>
+ <string name="keyboard_layout_croatian" msgid="4172229471079281138">"hrvaška"</string>
+ <string name="keyboard_layout_czech" msgid="1349256901452975343">"ÄeÅ¡ka"</string>
+ <string name="keyboard_layout_estonian" msgid="8775830985185665274">"estonska"</string>
+ <string name="keyboard_layout_hungarian" msgid="4154963661406035109">"madžarska"</string>
+ <string name="keyboard_layout_icelandic" msgid="5836645650912489642">"islandska"</string>
+ <string name="keyboard_layout_brazilian" msgid="5117896443147781939">"brazilska"</string>
+ <string name="keyboard_layout_portuguese" msgid="2888198587329660305">"portugalska"</string>
+ <string name="keyboard_layout_slovak" msgid="2469379934672837296">"slovaška"</string>
+ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"slovenska"</string>
+ <string name="keyboard_layout_turkish" msgid="7736163250907964898">"turška"</string>
+ <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"ukrajinska"</string>
+</resources>
diff --git a/packages/InputDevices/res/values-sr/strings.xml b/packages/InputDevices/res/values-sr/strings.xml
new file mode 100644
index 0000000..d23ac00
--- /dev/null
+++ b/packages/InputDevices/res/values-sr/strings.xml
@@ -0,0 +1,37 @@
+<?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="app_label" msgid="8016145283189546017">"Улазни уређаји"</string>
+ <string name="keyboard_layouts_label" msgid="6688773268302087545">"Android таÑтатура"</string>
+ <string name="keyboard_layout_english_uk_label" msgid="6664258463319999632">"енглеÑка (УК)"</string>
+ <string name="keyboard_layout_english_us_label" msgid="8994890249649106291">"енглеÑка (СÐД)"</string>
+ <string name="keyboard_layout_english_us_intl" msgid="3705168594034233583">"енглеÑка (СÐД), међународни Ñтил"</string>
+ <string name="keyboard_layout_english_us_colemak_label" msgid="4194969610343455380">"енглеÑка (СÐД), Colemak Ñтил"</string>
+ <string name="keyboard_layout_english_us_dvorak_label" msgid="793528923171145202">"енглеÑка (СÐД), Dvorak Ñтил"</string>
+ <string name="keyboard_layout_german_label" msgid="8451565865467909999">"немачка"</string>
+ <string name="keyboard_layout_french_label" msgid="813450119589383723">"француÑка"</string>
+ <string name="keyboard_layout_french_ca_label" msgid="365352601060604832">"француÑка (Канада)"</string>
+ <string name="keyboard_layout_russian_label" msgid="8724879775815042968">"руÑка"</string>
+ <string name="keyboard_layout_russian_mac_label" msgid="3795866869038264796">"руÑка, Mac Ñтил"</string>
+ <string name="keyboard_layout_spanish_label" msgid="7091555148131908240">"шпанÑка"</string>
+ <string name="keyboard_layout_swiss_french_label" msgid="4659191025396371684">"швајцарÑко француÑка"</string>
+ <string name="keyboard_layout_swiss_german_label" msgid="2305520941993314258">"швајцарÑко немачка"</string>
+ <string name="keyboard_layout_belgian" msgid="2011984572838651558">"белгијÑка"</string>
+ <string name="keyboard_layout_bulgarian" msgid="8951224309972028398">"бугарÑка"</string>
+ <string name="keyboard_layout_italian" msgid="6497079660449781213">"италијанÑка"</string>
+ <string name="keyboard_layout_danish" msgid="8036432066627127851">"данÑка"</string>
+ <string name="keyboard_layout_norwegian" msgid="9090097917011040937">"норвешка"</string>
+ <string name="keyboard_layout_swedish" msgid="732959109088479351">"шведÑка"</string>
+ <string name="keyboard_layout_finnish" msgid="5585659438924315466">"финÑка"</string>
+ <string name="keyboard_layout_croatian" msgid="4172229471079281138">"хрватÑка"</string>
+ <string name="keyboard_layout_czech" msgid="1349256901452975343">"чешка"</string>
+ <string name="keyboard_layout_estonian" msgid="8775830985185665274">"еÑтонÑка"</string>
+ <string name="keyboard_layout_hungarian" msgid="4154963661406035109">"мађарÑка"</string>
+ <string name="keyboard_layout_icelandic" msgid="5836645650912489642">"иÑландÑка"</string>
+ <string name="keyboard_layout_brazilian" msgid="5117896443147781939">"бразилÑка"</string>
+ <string name="keyboard_layout_portuguese" msgid="2888198587329660305">"португалÑка"</string>
+ <string name="keyboard_layout_slovak" msgid="2469379934672837296">"Ñловачка"</string>
+ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"Ñловеначка"</string>
+ <string name="keyboard_layout_turkish" msgid="7736163250907964898">"турÑка"</string>
+ <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"украјинÑка"</string>
+</resources>
diff --git a/packages/InputDevices/res/values-sv/strings.xml b/packages/InputDevices/res/values-sv/strings.xml
new file mode 100644
index 0000000..25a5ae8
--- /dev/null
+++ b/packages/InputDevices/res/values-sv/strings.xml
@@ -0,0 +1,37 @@
+<?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="app_label" msgid="8016145283189546017">"Indataenheter"</string>
+ <string name="keyboard_layouts_label" msgid="6688773268302087545">"Androids tangentbord"</string>
+ <string name="keyboard_layout_english_uk_label" msgid="6664258463319999632">"Engelskt (Storbritannien)"</string>
+ <string name="keyboard_layout_english_us_label" msgid="8994890249649106291">"Engelskt (USA)"</string>
+ <string name="keyboard_layout_english_us_intl" msgid="3705168594034233583">"Engelskt (USA), internationellt"</string>
+ <string name="keyboard_layout_english_us_colemak_label" msgid="4194969610343455380">"Engelskt (USA), colemak"</string>
+ <string name="keyboard_layout_english_us_dvorak_label" msgid="793528923171145202">"Engelskt (USA), dvorak"</string>
+ <string name="keyboard_layout_german_label" msgid="8451565865467909999">"Tyskt"</string>
+ <string name="keyboard_layout_french_label" msgid="813450119589383723">"Franskt"</string>
+ <string name="keyboard_layout_french_ca_label" msgid="365352601060604832">"Franskt (Kanada)"</string>
+ <string name="keyboard_layout_russian_label" msgid="8724879775815042968">"Ryskt"</string>
+ <string name="keyboard_layout_russian_mac_label" msgid="3795866869038264796">"Ryskt, Mac"</string>
+ <string name="keyboard_layout_spanish_label" msgid="7091555148131908240">"Spanskt"</string>
+ <string name="keyboard_layout_swiss_french_label" msgid="4659191025396371684">"Franskt (Schweiz)"</string>
+ <string name="keyboard_layout_swiss_german_label" msgid="2305520941993314258">"Tyskt (Schweiz)"</string>
+ <string name="keyboard_layout_belgian" msgid="2011984572838651558">"Belgiskt"</string>
+ <string name="keyboard_layout_bulgarian" msgid="8951224309972028398">"Bulgariskt"</string>
+ <string name="keyboard_layout_italian" msgid="6497079660449781213">"Italienskt"</string>
+ <string name="keyboard_layout_danish" msgid="8036432066627127851">"Danskt"</string>
+ <string name="keyboard_layout_norwegian" msgid="9090097917011040937">"Norskt"</string>
+ <string name="keyboard_layout_swedish" msgid="732959109088479351">"Svenskt"</string>
+ <string name="keyboard_layout_finnish" msgid="5585659438924315466">"Finskt"</string>
+ <string name="keyboard_layout_croatian" msgid="4172229471079281138">"Kroatiskt"</string>
+ <string name="keyboard_layout_czech" msgid="1349256901452975343">"Tjeckiskt"</string>
+ <string name="keyboard_layout_estonian" msgid="8775830985185665274">"Estniskt"</string>
+ <string name="keyboard_layout_hungarian" msgid="4154963661406035109">"Ungerskt"</string>
+ <string name="keyboard_layout_icelandic" msgid="5836645650912489642">"Isländskt"</string>
+ <string name="keyboard_layout_brazilian" msgid="5117896443147781939">"Portugisiskt (Brasilien)"</string>
+ <string name="keyboard_layout_portuguese" msgid="2888198587329660305">"Portugisiskt"</string>
+ <string name="keyboard_layout_slovak" msgid="2469379934672837296">"Slovakiskt"</string>
+ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"Slovenskt"</string>
+ <string name="keyboard_layout_turkish" msgid="7736163250907964898">"Turkiskt"</string>
+ <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"Ukrainskt"</string>
+</resources>
diff --git a/packages/InputDevices/res/values-sw/strings.xml b/packages/InputDevices/res/values-sw/strings.xml
new file mode 100644
index 0000000..65ab96a
--- /dev/null
+++ b/packages/InputDevices/res/values-sw/strings.xml
@@ -0,0 +1,37 @@
+<?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="app_label" msgid="8016145283189546017">"Vifaa Ingizi"</string>
+ <string name="keyboard_layouts_label" msgid="6688773268302087545">"Kibodi ya Android"</string>
+ <string name="keyboard_layout_english_uk_label" msgid="6664258463319999632">"Kiingereza (Uingereza)"</string>
+ <string name="keyboard_layout_english_us_label" msgid="8994890249649106291">"Kiingereza (Marekani)"</string>
+ <string name="keyboard_layout_english_us_intl" msgid="3705168594034233583">"Kiingereza (Marekani), Muundo wa Kimataifa"</string>
+ <string name="keyboard_layout_english_us_colemak_label" msgid="4194969610343455380">"Kiingereza (Marekani), Muundo wa Colemak"</string>
+ <string name="keyboard_layout_english_us_dvorak_label" msgid="793528923171145202">"Kiingereza (Marekani), Muundo wa Dvorak"</string>
+ <string name="keyboard_layout_german_label" msgid="8451565865467909999">"Kijerumani"</string>
+ <string name="keyboard_layout_french_label" msgid="813450119589383723">"Kifaransa"</string>
+ <string name="keyboard_layout_french_ca_label" msgid="365352601060604832">"Kifaransa (Kanada)"</string>
+ <string name="keyboard_layout_russian_label" msgid="8724879775815042968">"Kirusi"</string>
+ <string name="keyboard_layout_russian_mac_label" msgid="3795866869038264796">"Kirusi, Muundo wa Mac"</string>
+ <string name="keyboard_layout_spanish_label" msgid="7091555148131908240">"Kihispania"</string>
+ <string name="keyboard_layout_swiss_french_label" msgid="4659191025396371684">"Kifaransa cha Uswisi"</string>
+ <string name="keyboard_layout_swiss_german_label" msgid="2305520941993314258">"Kijerumani cha Uswisi"</string>
+ <string name="keyboard_layout_belgian" msgid="2011984572838651558">"Kibelgiji"</string>
+ <string name="keyboard_layout_bulgarian" msgid="8951224309972028398">"Kibulgaria"</string>
+ <string name="keyboard_layout_italian" msgid="6497079660449781213">"Kiitaliano"</string>
+ <string name="keyboard_layout_danish" msgid="8036432066627127851">"Kidenmarki"</string>
+ <string name="keyboard_layout_norwegian" msgid="9090097917011040937">"Kinorwei"</string>
+ <string name="keyboard_layout_swedish" msgid="732959109088479351">"Kiswidi"</string>
+ <string name="keyboard_layout_finnish" msgid="5585659438924315466">"Kifinlandi"</string>
+ <string name="keyboard_layout_croatian" msgid="4172229471079281138">"Kikroeshia"</string>
+ <string name="keyboard_layout_czech" msgid="1349256901452975343">"Kicheki"</string>
+ <string name="keyboard_layout_estonian" msgid="8775830985185665274">"Kiestonia"</string>
+ <string name="keyboard_layout_hungarian" msgid="4154963661406035109">"Kihungari"</string>
+ <string name="keyboard_layout_icelandic" msgid="5836645650912489642">"Kiaislandi"</string>
+ <string name="keyboard_layout_brazilian" msgid="5117896443147781939">"Kibrazili"</string>
+ <string name="keyboard_layout_portuguese" msgid="2888198587329660305">"Kireno"</string>
+ <string name="keyboard_layout_slovak" msgid="2469379934672837296">"Kislovakia"</string>
+ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"Kislovenia"</string>
+ <string name="keyboard_layout_turkish" msgid="7736163250907964898">"Kituruki"</string>
+ <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"Kiukrania"</string>
+</resources>
diff --git a/packages/InputDevices/res/values-th/strings.xml b/packages/InputDevices/res/values-th/strings.xml
new file mode 100644
index 0000000..0cc7d47
--- /dev/null
+++ b/packages/InputDevices/res/values-th/strings.xml
@@ -0,0 +1,37 @@
+<?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="app_label" msgid="8016145283189546017">"อุปà¸à¸£à¸“์อินพุต"</string>
+ <string name="keyboard_layouts_label" msgid="6688773268302087545">"à¹à¸›à¹‰à¸™à¸žà¸´à¸¡à¸žà¹Œà¹à¸­à¸™à¸”รอยด์"</string>
+ <string name="keyboard_layout_english_uk_label" msgid="6664258463319999632">"อังà¸à¸¤à¸© (สหราชอาณาจัà¸à¸£)"</string>
+ <string name="keyboard_layout_english_us_label" msgid="8994890249649106291">"อังà¸à¸¤à¸© (อเมริà¸à¸±à¸™)"</string>
+ <string name="keyboard_layout_english_us_intl" msgid="3705168594034233583">"อังà¸à¸¤à¸© (อเมริà¸à¸±à¸™), รูปà¹à¸šà¸šà¸™à¸²à¸™à¸²à¸Šà¸²à¸•ิ"</string>
+ <string name="keyboard_layout_english_us_colemak_label" msgid="4194969610343455380">"อังà¸à¸¤à¸© (อเมริà¸à¸±à¸™), รูปà¹à¸šà¸š Colemak"</string>
+ <string name="keyboard_layout_english_us_dvorak_label" msgid="793528923171145202">"อังà¸à¸¤à¸© (อเมริà¸à¸±à¸™), รูปà¹à¸šà¸š Dvorak"</string>
+ <string name="keyboard_layout_german_label" msgid="8451565865467909999">"เยอรมัน"</string>
+ <string name="keyboard_layout_french_label" msgid="813450119589383723">"à¸à¸£à¸±à¹ˆà¸‡à¹€à¸¨à¸ª"</string>
+ <string name="keyboard_layout_french_ca_label" msgid="365352601060604832">"à¸à¸£à¸±à¹ˆà¸‡à¹€à¸¨à¸ª (à¹à¸„นาดา)"</string>
+ <string name="keyboard_layout_russian_label" msgid="8724879775815042968">"รัสเซีย"</string>
+ <string name="keyboard_layout_russian_mac_label" msgid="3795866869038264796">"รัสเซีย, รูปà¹à¸šà¸š Mac"</string>
+ <string name="keyboard_layout_spanish_label" msgid="7091555148131908240">"สเปน"</string>
+ <string name="keyboard_layout_swiss_french_label" msgid="4659191025396371684">"à¸à¸£à¸±à¹ˆà¸‡à¹€à¸¨à¸ª (สวิส)"</string>
+ <string name="keyboard_layout_swiss_german_label" msgid="2305520941993314258">"เยอรมันสวิส"</string>
+ <string name="keyboard_layout_belgian" msgid="2011984572838651558">"เบลเยียม"</string>
+ <string name="keyboard_layout_bulgarian" msgid="8951224309972028398">"บัลà¹à¸à¹€à¸£à¸µà¸¢"</string>
+ <string name="keyboard_layout_italian" msgid="6497079660449781213">"อิตาลี"</string>
+ <string name="keyboard_layout_danish" msgid="8036432066627127851">"เดนมาร์à¸"</string>
+ <string name="keyboard_layout_norwegian" msgid="9090097917011040937">"นอร์เวย์"</string>
+ <string name="keyboard_layout_swedish" msgid="732959109088479351">"สวีเดน"</string>
+ <string name="keyboard_layout_finnish" msgid="5585659438924315466">"ฟินà¹à¸¥à¸™à¸”์"</string>
+ <string name="keyboard_layout_croatian" msgid="4172229471079281138">"โครเอเชีย"</string>
+ <string name="keyboard_layout_czech" msgid="1349256901452975343">"เช็à¸"</string>
+ <string name="keyboard_layout_estonian" msgid="8775830985185665274">"เอสโตเนีย"</string>
+ <string name="keyboard_layout_hungarian" msgid="4154963661406035109">"ฮังà¸à¸²à¸£à¸µ"</string>
+ <string name="keyboard_layout_icelandic" msgid="5836645650912489642">"ไอซ์à¹à¸¥à¸™à¸”ิà¸"</string>
+ <string name="keyboard_layout_brazilian" msgid="5117896443147781939">"บราซิล"</string>
+ <string name="keyboard_layout_portuguese" msgid="2888198587329660305">"โปรตุเà¸à¸ª"</string>
+ <string name="keyboard_layout_slovak" msgid="2469379934672837296">"สโลวัà¸"</string>
+ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"สโลวีเนีย"</string>
+ <string name="keyboard_layout_turkish" msgid="7736163250907964898">"ตุรà¸à¸µ"</string>
+ <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"ยูเครน"</string>
+</resources>
diff --git a/packages/InputDevices/res/values-tl/strings.xml b/packages/InputDevices/res/values-tl/strings.xml
new file mode 100644
index 0000000..08f34d2
--- /dev/null
+++ b/packages/InputDevices/res/values-tl/strings.xml
@@ -0,0 +1,37 @@
+<?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="app_label" msgid="8016145283189546017">"Mga Input Device"</string>
+ <string name="keyboard_layouts_label" msgid="6688773268302087545">"Android keyboard"</string>
+ <string name="keyboard_layout_english_uk_label" msgid="6664258463319999632">"Ingles (UK)"</string>
+ <string name="keyboard_layout_english_us_label" msgid="8994890249649106291">"Ingles (US)"</string>
+ <string name="keyboard_layout_english_us_intl" msgid="3705168594034233583">"Ingles (US), istilong International"</string>
+ <string name="keyboard_layout_english_us_colemak_label" msgid="4194969610343455380">"Ingles (US), istilong Colemak"</string>
+ <string name="keyboard_layout_english_us_dvorak_label" msgid="793528923171145202">"Ingles (US), istilong Dvorak"</string>
+ <string name="keyboard_layout_german_label" msgid="8451565865467909999">"German"</string>
+ <string name="keyboard_layout_french_label" msgid="813450119589383723">"French"</string>
+ <string name="keyboard_layout_french_ca_label" msgid="365352601060604832">"French (Canada)"</string>
+ <string name="keyboard_layout_russian_label" msgid="8724879775815042968">"Russian"</string>
+ <string name="keyboard_layout_russian_mac_label" msgid="3795866869038264796">"Russian, istilong Mac"</string>
+ <string name="keyboard_layout_spanish_label" msgid="7091555148131908240">"Spanish"</string>
+ <string name="keyboard_layout_swiss_french_label" msgid="4659191025396371684">"Swiss French"</string>
+ <string name="keyboard_layout_swiss_german_label" msgid="2305520941993314258">"Swiss German"</string>
+ <string name="keyboard_layout_belgian" msgid="2011984572838651558">"Belgian"</string>
+ <string name="keyboard_layout_bulgarian" msgid="8951224309972028398">"Bulgarian"</string>
+ <string name="keyboard_layout_italian" msgid="6497079660449781213">"Italian"</string>
+ <string name="keyboard_layout_danish" msgid="8036432066627127851">"Danish"</string>
+ <string name="keyboard_layout_norwegian" msgid="9090097917011040937">"Norwegian"</string>
+ <string name="keyboard_layout_swedish" msgid="732959109088479351">"Swedish"</string>
+ <string name="keyboard_layout_finnish" msgid="5585659438924315466">"Finnish"</string>
+ <string name="keyboard_layout_croatian" msgid="4172229471079281138">"Croatian"</string>
+ <string name="keyboard_layout_czech" msgid="1349256901452975343">"Czech"</string>
+ <string name="keyboard_layout_estonian" msgid="8775830985185665274">"Estonian"</string>
+ <string name="keyboard_layout_hungarian" msgid="4154963661406035109">"Hungarian"</string>
+ <string name="keyboard_layout_icelandic" msgid="5836645650912489642">"Icelandic"</string>
+ <string name="keyboard_layout_brazilian" msgid="5117896443147781939">"Brazilian"</string>
+ <string name="keyboard_layout_portuguese" msgid="2888198587329660305">"Portuguese"</string>
+ <string name="keyboard_layout_slovak" msgid="2469379934672837296">"Slovak"</string>
+ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"Slovenian"</string>
+ <string name="keyboard_layout_turkish" msgid="7736163250907964898">"Turkish"</string>
+ <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"Ukrainian"</string>
+</resources>
diff --git a/packages/InputDevices/res/values-tr/strings.xml b/packages/InputDevices/res/values-tr/strings.xml
new file mode 100644
index 0000000..f7c1262
--- /dev/null
+++ b/packages/InputDevices/res/values-tr/strings.xml
@@ -0,0 +1,37 @@
+<?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="app_label" msgid="8016145283189546017">"Input Devices"</string>
+ <string name="keyboard_layouts_label" msgid="6688773268302087545">"Android klavyesi"</string>
+ <string name="keyboard_layout_english_uk_label" msgid="6664258463319999632">"İngilizce (İngiltere)"</string>
+ <string name="keyboard_layout_english_us_label" msgid="8994890249649106291">"İngilizce (ABD)"</string>
+ <string name="keyboard_layout_english_us_intl" msgid="3705168594034233583">"İngilizce (ABD) Uluslararası stil"</string>
+ <string name="keyboard_layout_english_us_colemak_label" msgid="4194969610343455380">"İngilizce (ABD) Colemak stili"</string>
+ <string name="keyboard_layout_english_us_dvorak_label" msgid="793528923171145202">"İngilizce (ABD) Dvorak stili"</string>
+ <string name="keyboard_layout_german_label" msgid="8451565865467909999">"Almanca"</string>
+ <string name="keyboard_layout_french_label" msgid="813450119589383723">"Fransızca"</string>
+ <string name="keyboard_layout_french_ca_label" msgid="365352601060604832">"Fransızca (Kanada)"</string>
+ <string name="keyboard_layout_russian_label" msgid="8724879775815042968">"Rusça"</string>
+ <string name="keyboard_layout_russian_mac_label" msgid="3795866869038264796">"Rusça, Mac stili"</string>
+ <string name="keyboard_layout_spanish_label" msgid="7091555148131908240">"İspanyolca"</string>
+ <string name="keyboard_layout_swiss_french_label" msgid="4659191025396371684">"İsviçre Fransızcası"</string>
+ <string name="keyboard_layout_swiss_german_label" msgid="2305520941993314258">"İsviçre Almancası"</string>
+ <string name="keyboard_layout_belgian" msgid="2011984572838651558">"Belçika dili"</string>
+ <string name="keyboard_layout_bulgarian" msgid="8951224309972028398">"Bulgarca"</string>
+ <string name="keyboard_layout_italian" msgid="6497079660449781213">"İtalyanca"</string>
+ <string name="keyboard_layout_danish" msgid="8036432066627127851">"Danca"</string>
+ <string name="keyboard_layout_norwegian" msgid="9090097917011040937">"Norveççe"</string>
+ <string name="keyboard_layout_swedish" msgid="732959109088479351">"İsveççe"</string>
+ <string name="keyboard_layout_finnish" msgid="5585659438924315466">"Fince"</string>
+ <string name="keyboard_layout_croatian" msgid="4172229471079281138">"Hırvatça"</string>
+ <string name="keyboard_layout_czech" msgid="1349256901452975343">"Çekçe"</string>
+ <string name="keyboard_layout_estonian" msgid="8775830985185665274">"Estonca"</string>
+ <string name="keyboard_layout_hungarian" msgid="4154963661406035109">"Macarca"</string>
+ <string name="keyboard_layout_icelandic" msgid="5836645650912489642">"İzlandaca"</string>
+ <string name="keyboard_layout_brazilian" msgid="5117896443147781939">"Brezilya dili"</string>
+ <string name="keyboard_layout_portuguese" msgid="2888198587329660305">"Portekizce"</string>
+ <string name="keyboard_layout_slovak" msgid="2469379934672837296">"Slovakça"</string>
+ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"Slovence"</string>
+ <string name="keyboard_layout_turkish" msgid="7736163250907964898">"Türkçe"</string>
+ <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"Ukraynaca"</string>
+</resources>
diff --git a/packages/InputDevices/res/values-uk/strings.xml b/packages/InputDevices/res/values-uk/strings.xml
new file mode 100644
index 0000000..ee6ffc7
--- /dev/null
+++ b/packages/InputDevices/res/values-uk/strings.xml
@@ -0,0 +1,37 @@
+<?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="app_label" msgid="8016145283189546017">"ПриÑтрої вводу"</string>
+ <string name="keyboard_layouts_label" msgid="6688773268302087545">"Клавіатура Android"</string>
+ <string name="keyboard_layout_english_uk_label" msgid="6664258463319999632">"англійÑька (ВеликобританіÑ)"</string>
+ <string name="keyboard_layout_english_us_label" msgid="8994890249649106291">"англійÑька (СШÐ)"</string>
+ <string name="keyboard_layout_english_us_intl" msgid="3705168594034233583">"англійÑька (СШÐ), міжнародна"</string>
+ <string name="keyboard_layout_english_us_colemak_label" msgid="4194969610343455380">"англійÑька (СШÐ), розкладка Colemak"</string>
+ <string name="keyboard_layout_english_us_dvorak_label" msgid="793528923171145202">"англійÑька (СШÐ), розкладка Дворака"</string>
+ <string name="keyboard_layout_german_label" msgid="8451565865467909999">"німецька"</string>
+ <string name="keyboard_layout_french_label" msgid="813450119589383723">"французька"</string>
+ <string name="keyboard_layout_french_ca_label" msgid="365352601060604832">"французька (Канада)"</string>
+ <string name="keyboard_layout_russian_label" msgid="8724879775815042968">"роÑійÑька"</string>
+ <string name="keyboard_layout_russian_mac_label" msgid="3795866869038264796">"роÑійÑька, розкладка Mac"</string>
+ <string name="keyboard_layout_spanish_label" msgid="7091555148131908240">"Ñ–ÑпанÑька"</string>
+ <string name="keyboard_layout_swiss_french_label" msgid="4659191025396371684">"французька (ШвейцаріÑ)"</string>
+ <string name="keyboard_layout_swiss_german_label" msgid="2305520941993314258">"німецька (ШвейцаріÑ)"</string>
+ <string name="keyboard_layout_belgian" msgid="2011984572838651558">"бельгійÑька"</string>
+ <string name="keyboard_layout_bulgarian" msgid="8951224309972028398">"болгарÑька"</string>
+ <string name="keyboard_layout_italian" msgid="6497079660449781213">"італійÑька"</string>
+ <string name="keyboard_layout_danish" msgid="8036432066627127851">"данÑька"</string>
+ <string name="keyboard_layout_norwegian" msgid="9090097917011040937">"норвезька"</string>
+ <string name="keyboard_layout_swedish" msgid="732959109088479351">"шведÑька"</string>
+ <string name="keyboard_layout_finnish" msgid="5585659438924315466">"фінÑька"</string>
+ <string name="keyboard_layout_croatian" msgid="4172229471079281138">"хорватÑька"</string>
+ <string name="keyboard_layout_czech" msgid="1349256901452975343">"чеÑька"</string>
+ <string name="keyboard_layout_estonian" msgid="8775830985185665274">"еÑтонÑька"</string>
+ <string name="keyboard_layout_hungarian" msgid="4154963661406035109">"угорÑька"</string>
+ <string name="keyboard_layout_icelandic" msgid="5836645650912489642">"Ñ–ÑландÑька"</string>
+ <string name="keyboard_layout_brazilian" msgid="5117896443147781939">"бразильÑька"</string>
+ <string name="keyboard_layout_portuguese" msgid="2888198587329660305">"португальÑька"</string>
+ <string name="keyboard_layout_slovak" msgid="2469379934672837296">"Ñловацька"</string>
+ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"ÑловенÑька"</string>
+ <string name="keyboard_layout_turkish" msgid="7736163250907964898">"турецька"</string>
+ <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"українÑька"</string>
+</resources>
diff --git a/packages/InputDevices/res/values-vi/strings.xml b/packages/InputDevices/res/values-vi/strings.xml
new file mode 100644
index 0000000..7a65e45
--- /dev/null
+++ b/packages/InputDevices/res/values-vi/strings.xml
@@ -0,0 +1,37 @@
+<?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="app_label" msgid="8016145283189546017">"Thiết bị đầu vào"</string>
+ <string name="keyboard_layouts_label" msgid="6688773268302087545">"Bàn phím Android"</string>
+ <string name="keyboard_layout_english_uk_label" msgid="6664258463319999632">"Tiếng Anh (Anh)"</string>
+ <string name="keyboard_layout_english_us_label" msgid="8994890249649106291">"Tiếng Anh (Mỹ)"</string>
+ <string name="keyboard_layout_english_us_intl" msgid="3705168594034233583">"Tiếng Anh (Mỹ), kiểu Quốc tế"</string>
+ <string name="keyboard_layout_english_us_colemak_label" msgid="4194969610343455380">"Tiếng Anh (Mỹ), kiểu Colemak"</string>
+ <string name="keyboard_layout_english_us_dvorak_label" msgid="793528923171145202">"Tiếng Anh (Mỹ), kiểu Dvorak"</string>
+ <string name="keyboard_layout_german_label" msgid="8451565865467909999">"Tiếng Äức"</string>
+ <string name="keyboard_layout_french_label" msgid="813450119589383723">"Tiếng Pháp"</string>
+ <string name="keyboard_layout_french_ca_label" msgid="365352601060604832">"Tiếng Pháp (Canada)"</string>
+ <string name="keyboard_layout_russian_label" msgid="8724879775815042968">"Tiếng Nga"</string>
+ <string name="keyboard_layout_russian_mac_label" msgid="3795866869038264796">"Tiếng Nga, kiểu Mac"</string>
+ <string name="keyboard_layout_spanish_label" msgid="7091555148131908240">"Tiếng Tây Ban Nha"</string>
+ <string name="keyboard_layout_swiss_french_label" msgid="4659191025396371684">"Tiếng Pháp ở Thụy Sĩ"</string>
+ <string name="keyboard_layout_swiss_german_label" msgid="2305520941993314258">"Tiếng Äức Thụy SÄ©"</string>
+ <string name="keyboard_layout_belgian" msgid="2011984572838651558">"Tiếng Bỉ"</string>
+ <string name="keyboard_layout_bulgarian" msgid="8951224309972028398">"Tiếng Bungary"</string>
+ <string name="keyboard_layout_italian" msgid="6497079660449781213">"Tiếng Ã"</string>
+ <string name="keyboard_layout_danish" msgid="8036432066627127851">"Tiếng Äan Mạch"</string>
+ <string name="keyboard_layout_norwegian" msgid="9090097917011040937">"Tiếng Na Uy"</string>
+ <string name="keyboard_layout_swedish" msgid="732959109088479351">"Tiếng Thụy Äiển"</string>
+ <string name="keyboard_layout_finnish" msgid="5585659438924315466">"Tiếng Phần Lan"</string>
+ <string name="keyboard_layout_croatian" msgid="4172229471079281138">"Tiếng Croatia"</string>
+ <string name="keyboard_layout_czech" msgid="1349256901452975343">"Tiếng Séc"</string>
+ <string name="keyboard_layout_estonian" msgid="8775830985185665274">"Tiếng Estonia"</string>
+ <string name="keyboard_layout_hungarian" msgid="4154963661406035109">"Tiếng Hungary"</string>
+ <string name="keyboard_layout_icelandic" msgid="5836645650912489642">"Tiếng Ai-xơ-len"</string>
+ <string name="keyboard_layout_brazilian" msgid="5117896443147781939">"Tiếng Brazil"</string>
+ <string name="keyboard_layout_portuguese" msgid="2888198587329660305">"Tiếng Bồ Äào Nha"</string>
+ <string name="keyboard_layout_slovak" msgid="2469379934672837296">"Tiếng Slovak"</string>
+ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"Tiếng Sloven"</string>
+ <string name="keyboard_layout_turkish" msgid="7736163250907964898">"Tiếng Thổ Nhĩ Kỳ"</string>
+ <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"Tiếng Ukraina"</string>
+</resources>
diff --git a/packages/InputDevices/res/values-zh-rCN/strings.xml b/packages/InputDevices/res/values-zh-rCN/strings.xml
new file mode 100644
index 0000000..85b1c84
--- /dev/null
+++ b/packages/InputDevices/res/values-zh-rCN/strings.xml
@@ -0,0 +1,37 @@
+<?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="app_label" msgid="8016145283189546017">"输入设备"</string>
+ <string name="keyboard_layouts_label" msgid="6688773268302087545">"Android 键盘"</string>
+ <string name="keyboard_layout_english_uk_label" msgid="6664258463319999632">"英语(英国)"</string>
+ <string name="keyboard_layout_english_us_label" msgid="8994890249649106291">"英语(美国)"</string>
+ <string name="keyboard_layout_english_us_intl" msgid="3705168594034233583">"英语(美国),国际风格"</string>
+ <string name="keyboard_layout_english_us_colemak_label" msgid="4194969610343455380">"英语(美国),Colemak 风格"</string>
+ <string name="keyboard_layout_english_us_dvorak_label" msgid="793528923171145202">"英语(美国),Dvorak 风格"</string>
+ <string name="keyboard_layout_german_label" msgid="8451565865467909999">"德语"</string>
+ <string name="keyboard_layout_french_label" msgid="813450119589383723">"法语"</string>
+ <string name="keyboard_layout_french_ca_label" msgid="365352601060604832">"法语(加拿大)"</string>
+ <string name="keyboard_layout_russian_label" msgid="8724879775815042968">"俄语"</string>
+ <string name="keyboard_layout_russian_mac_label" msgid="3795866869038264796">"俄语,Mac 风格"</string>
+ <string name="keyboard_layout_spanish_label" msgid="7091555148131908240">"西ç­ç‰™è¯­"</string>
+ <string name="keyboard_layout_swiss_french_label" msgid="4659191025396371684">"瑞士法语"</string>
+ <string name="keyboard_layout_swiss_german_label" msgid="2305520941993314258">"瑞士德语"</string>
+ <string name="keyboard_layout_belgian" msgid="2011984572838651558">"比利时语"</string>
+ <string name="keyboard_layout_bulgarian" msgid="8951224309972028398">"ä¿åŠ åˆ©äºšè¯­"</string>
+ <string name="keyboard_layout_italian" msgid="6497079660449781213">"æ„大利语"</string>
+ <string name="keyboard_layout_danish" msgid="8036432066627127851">"丹麦语"</string>
+ <string name="keyboard_layout_norwegian" msgid="9090097917011040937">"挪å¨è¯­"</string>
+ <string name="keyboard_layout_swedish" msgid="732959109088479351">"瑞典语"</string>
+ <string name="keyboard_layout_finnish" msgid="5585659438924315466">"芬兰语"</string>
+ <string name="keyboard_layout_croatian" msgid="4172229471079281138">"克罗地亚语"</string>
+ <string name="keyboard_layout_czech" msgid="1349256901452975343">"æ·å…‹è¯­"</string>
+ <string name="keyboard_layout_estonian" msgid="8775830985185665274">"爱沙尼亚语"</string>
+ <string name="keyboard_layout_hungarian" msgid="4154963661406035109">"匈牙利语"</string>
+ <string name="keyboard_layout_icelandic" msgid="5836645650912489642">"冰岛语"</string>
+ <string name="keyboard_layout_brazilian" msgid="5117896443147781939">"巴西语"</string>
+ <string name="keyboard_layout_portuguese" msgid="2888198587329660305">"è‘¡è„牙语"</string>
+ <string name="keyboard_layout_slovak" msgid="2469379934672837296">"斯洛ä¼å…‹è¯­"</string>
+ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"斯洛文尼亚语"</string>
+ <string name="keyboard_layout_turkish" msgid="7736163250907964898">"土耳其语"</string>
+ <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"乌克兰语"</string>
+</resources>
diff --git a/packages/InputDevices/res/values-zh-rHK/strings.xml b/packages/InputDevices/res/values-zh-rHK/strings.xml
new file mode 100644
index 0000000..839c546
--- /dev/null
+++ b/packages/InputDevices/res/values-zh-rHK/strings.xml
@@ -0,0 +1,37 @@
+<?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="app_label" msgid="8016145283189546017">"輸入è£ç½®"</string>
+ <string name="keyboard_layouts_label" msgid="6688773268302087545">"Android éµç›¤"</string>
+ <string name="keyboard_layout_english_uk_label" msgid="6664258463319999632">"英文 (英國)"</string>
+ <string name="keyboard_layout_english_us_label" msgid="8994890249649106291">"英文 (美國)"</string>
+ <string name="keyboard_layout_english_us_intl" msgid="3705168594034233583">"英文 (美國),國際樣å¼"</string>
+ <string name="keyboard_layout_english_us_colemak_label" msgid="4194969610343455380">"英文 (美國),Colemak 樣å¼"</string>
+ <string name="keyboard_layout_english_us_dvorak_label" msgid="793528923171145202">"英文 (美國),Dvorak 樣å¼"</string>
+ <string name="keyboard_layout_german_label" msgid="8451565865467909999">"å¾·æ–‡"</string>
+ <string name="keyboard_layout_french_label" msgid="813450119589383723">"法文"</string>
+ <string name="keyboard_layout_french_ca_label" msgid="365352601060604832">"法文 (加拿大)"</string>
+ <string name="keyboard_layout_russian_label" msgid="8724879775815042968">"ä¿„æ–‡"</string>
+ <string name="keyboard_layout_russian_mac_label" msgid="3795866869038264796">"俄文,Mac 樣å¼"</string>
+ <string name="keyboard_layout_spanish_label" msgid="7091555148131908240">"西ç­ç‰™æ–‡"</string>
+ <string name="keyboard_layout_swiss_french_label" msgid="4659191025396371684">"法文 (瑞士)"</string>
+ <string name="keyboard_layout_swiss_german_label" msgid="2305520941993314258">"德文(瑞士)"</string>
+ <string name="keyboard_layout_belgian" msgid="2011984572838651558">"比利時文"</string>
+ <string name="keyboard_layout_bulgarian" msgid="8951224309972028398">"ä¿åŠ åˆ©äºžæ–‡"</string>
+ <string name="keyboard_layout_italian" msgid="6497079660449781213">"æ„大利文"</string>
+ <string name="keyboard_layout_danish" msgid="8036432066627127851">"丹麥文"</string>
+ <string name="keyboard_layout_norwegian" msgid="9090097917011040937">"æŒªå¨æ–‡"</string>
+ <string name="keyboard_layout_swedish" msgid="732959109088479351">"瑞典文"</string>
+ <string name="keyboard_layout_finnish" msgid="5585659438924315466">"芬蘭文"</string>
+ <string name="keyboard_layout_croatian" msgid="4172229471079281138">"克羅地亞文"</string>
+ <string name="keyboard_layout_czech" msgid="1349256901452975343">"æ·å…‹æ–‡"</string>
+ <string name="keyboard_layout_estonian" msgid="8775830985185665274">"愛沙尼亞文"</string>
+ <string name="keyboard_layout_hungarian" msgid="4154963661406035109">"匈牙利文"</string>
+ <string name="keyboard_layout_icelandic" msgid="5836645650912489642">"冰島文"</string>
+ <string name="keyboard_layout_brazilian" msgid="5117896443147781939">"巴西文"</string>
+ <string name="keyboard_layout_portuguese" msgid="2888198587329660305">"è‘¡è„牙文"</string>
+ <string name="keyboard_layout_slovak" msgid="2469379934672837296">"斯洛ä¼å…‹æ–‡"</string>
+ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"斯洛文尼亞文"</string>
+ <string name="keyboard_layout_turkish" msgid="7736163250907964898">"土耳其文"</string>
+ <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"çƒå…‹è˜­æ–‡"</string>
+</resources>
diff --git a/packages/InputDevices/res/values-zh-rTW/strings.xml b/packages/InputDevices/res/values-zh-rTW/strings.xml
new file mode 100644
index 0000000..ba9f132
--- /dev/null
+++ b/packages/InputDevices/res/values-zh-rTW/strings.xml
@@ -0,0 +1,37 @@
+<?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="app_label" msgid="8016145283189546017">"輸入è£ç½®"</string>
+ <string name="keyboard_layouts_label" msgid="6688773268302087545">"Android éµç›¤"</string>
+ <string name="keyboard_layout_english_uk_label" msgid="6664258463319999632">"英文 (英國)"</string>
+ <string name="keyboard_layout_english_us_label" msgid="8994890249649106291">"英文 (美國)"</string>
+ <string name="keyboard_layout_english_us_intl" msgid="3705168594034233583">"英文 (美國),國際樣å¼"</string>
+ <string name="keyboard_layout_english_us_colemak_label" msgid="4194969610343455380">"英文 (美國),Colemak 樣å¼"</string>
+ <string name="keyboard_layout_english_us_dvorak_label" msgid="793528923171145202">"英文 (美國),Dvorak 樣å¼"</string>
+ <string name="keyboard_layout_german_label" msgid="8451565865467909999">"å¾·æ–‡"</string>
+ <string name="keyboard_layout_french_label" msgid="813450119589383723">"法文"</string>
+ <string name="keyboard_layout_french_ca_label" msgid="365352601060604832">"法文 (加拿大)"</string>
+ <string name="keyboard_layout_russian_label" msgid="8724879775815042968">"ä¿„æ–‡"</string>
+ <string name="keyboard_layout_russian_mac_label" msgid="3795866869038264796">"俄文,Mac 樣å¼"</string>
+ <string name="keyboard_layout_spanish_label" msgid="7091555148131908240">"西ç­ç‰™æ–‡"</string>
+ <string name="keyboard_layout_swiss_french_label" msgid="4659191025396371684">"法文 (瑞士)"</string>
+ <string name="keyboard_layout_swiss_german_label" msgid="2305520941993314258">"德文 (瑞士)"</string>
+ <string name="keyboard_layout_belgian" msgid="2011984572838651558">"比利時å¼"</string>
+ <string name="keyboard_layout_bulgarian" msgid="8951224309972028398">"ä¿åŠ åˆ©äºžæ–‡"</string>
+ <string name="keyboard_layout_italian" msgid="6497079660449781213">"義大利文"</string>
+ <string name="keyboard_layout_danish" msgid="8036432066627127851">"丹麥文"</string>
+ <string name="keyboard_layout_norwegian" msgid="9090097917011040937">"æŒªå¨æ–‡"</string>
+ <string name="keyboard_layout_swedish" msgid="732959109088479351">"瑞典文"</string>
+ <string name="keyboard_layout_finnish" msgid="5585659438924315466">"芬蘭文"</string>
+ <string name="keyboard_layout_croatian" msgid="4172229471079281138">"克羅埃西亞文"</string>
+ <string name="keyboard_layout_czech" msgid="1349256901452975343">"æ·å…‹æ–‡"</string>
+ <string name="keyboard_layout_estonian" msgid="8775830985185665274">"愛沙尼亞文"</string>
+ <string name="keyboard_layout_hungarian" msgid="4154963661406035109">"匈牙利文"</string>
+ <string name="keyboard_layout_icelandic" msgid="5836645650912489642">"冰島文"</string>
+ <string name="keyboard_layout_brazilian" msgid="5117896443147781939">"巴西å¼"</string>
+ <string name="keyboard_layout_portuguese" msgid="2888198587329660305">"è‘¡è„牙文"</string>
+ <string name="keyboard_layout_slovak" msgid="2469379934672837296">"斯洛ä¼å…‹æ–‡"</string>
+ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"斯洛維尼亞文"</string>
+ <string name="keyboard_layout_turkish" msgid="7736163250907964898">"土耳其文"</string>
+ <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"çƒå…‹è˜­æ–‡"</string>
+</resources>
diff --git a/packages/InputDevices/res/values-zu/strings.xml b/packages/InputDevices/res/values-zu/strings.xml
new file mode 100644
index 0000000..fbf1074
--- /dev/null
+++ b/packages/InputDevices/res/values-zu/strings.xml
@@ -0,0 +1,37 @@
+<?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="app_label" msgid="8016145283189546017">"Amadivayisi wokufaka"</string>
+ <string name="keyboard_layouts_label" msgid="6688773268302087545">"Ikhibhodi ye-Android"</string>
+ <string name="keyboard_layout_english_uk_label" msgid="6664258463319999632">"I-English (UK)"</string>
+ <string name="keyboard_layout_english_us_label" msgid="8994890249649106291">"I-English (US)"</string>
+ <string name="keyboard_layout_english_us_intl" msgid="3705168594034233583">"I-English (US), isitayela sakwamanye amazwe"</string>
+ <string name="keyboard_layout_english_us_colemak_label" msgid="4194969610343455380">"I-English (US), isitayela se-Colemak"</string>
+ <string name="keyboard_layout_english_us_dvorak_label" msgid="793528923171145202">"I-English (US), isitayela se-Dvorak"</string>
+ <string name="keyboard_layout_german_label" msgid="8451565865467909999">"Isi-German"</string>
+ <string name="keyboard_layout_french_label" msgid="813450119589383723">"Isi-French"</string>
+ <string name="keyboard_layout_french_ca_label" msgid="365352601060604832">"Isi-French (Canada)"</string>
+ <string name="keyboard_layout_russian_label" msgid="8724879775815042968">"Isi-Russian"</string>
+ <string name="keyboard_layout_russian_mac_label" msgid="3795866869038264796">"Isi-Russian, isitayela se-Mac"</string>
+ <string name="keyboard_layout_spanish_label" msgid="7091555148131908240">"Isi-Spanish"</string>
+ <string name="keyboard_layout_swiss_french_label" msgid="4659191025396371684">"Isi-Swiss French"</string>
+ <string name="keyboard_layout_swiss_german_label" msgid="2305520941993314258">"Isi-Swiss German"</string>
+ <string name="keyboard_layout_belgian" msgid="2011984572838651558">"Isi-Belgian"</string>
+ <string name="keyboard_layout_bulgarian" msgid="8951224309972028398">"Isi-Bulgarian"</string>
+ <string name="keyboard_layout_italian" msgid="6497079660449781213">"Isi-Italian"</string>
+ <string name="keyboard_layout_danish" msgid="8036432066627127851">"Isi-Danish"</string>
+ <string name="keyboard_layout_norwegian" msgid="9090097917011040937">"Isi-Norwegian"</string>
+ <string name="keyboard_layout_swedish" msgid="732959109088479351">"Isi-Swedish"</string>
+ <string name="keyboard_layout_finnish" msgid="5585659438924315466">"Isi-Finnish"</string>
+ <string name="keyboard_layout_croatian" msgid="4172229471079281138">"Isi-Croatian"</string>
+ <string name="keyboard_layout_czech" msgid="1349256901452975343">"Isi-Czech"</string>
+ <string name="keyboard_layout_estonian" msgid="8775830985185665274">"Isi-Estonian"</string>
+ <string name="keyboard_layout_hungarian" msgid="4154963661406035109">"Isi-Hungarian"</string>
+ <string name="keyboard_layout_icelandic" msgid="5836645650912489642">"Isi-Icelandic"</string>
+ <string name="keyboard_layout_brazilian" msgid="5117896443147781939">"Isi-Brazilian"</string>
+ <string name="keyboard_layout_portuguese" msgid="2888198587329660305">"Isi-Portuguese"</string>
+ <string name="keyboard_layout_slovak" msgid="2469379934672837296">"Isi-Slovak"</string>
+ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"Isi-Slovenian"</string>
+ <string name="keyboard_layout_turkish" msgid="7736163250907964898">"Isi-Turkish"</string>
+ <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"Isi-Ukrainian"</string>
+</resources>
diff --git a/packages/Keyguard/res/values-af/strings.xml b/packages/Keyguard/res/values-af/strings.xml
index 7e1f0bf..2667ed2 100644
--- a/packages/Keyguard/res/values-af/strings.xml
+++ b/packages/Keyguard/res/values-af/strings.xml
@@ -21,9 +21,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"Voer PIN-kode in"</string>
- <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"Voer PUK en nuwe PIN-kode in"</string>
- <string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"PUK-kode"</string>
- <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"Nuwe PIN-kode"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="3035856550289724338">"Voer SIM PUK- en nuwe PIN-kode in"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="1801941051094974609">"SIM PUK-kode"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="3201151840570492538">"Nuwe SIM PIN-kode"</string>
<string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"Raak om wagwoord in te voer"</font></string>
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Voer wagwoord in om te ontsluit"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Voer PIN in om te ontsluit"</string>
@@ -71,6 +71,13 @@
<string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Laatwag-knoppie"</string>
<string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Speel-knoppie"</string>
<string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Stop-knoppie"</string>
+ <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Laaik baie"</string>
+ <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Laaik niks"</string>
+ <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Hart"</string>
+ <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Ontsluit om voort te gaan"</string>
+ <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Begin gekanselleer"</string>
+ <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Laat los <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> om uit te vee."</string>
+ <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> sal nie uitgevee word nie."</string>
<string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
<string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
<string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
@@ -105,7 +112,6 @@
<string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"Voer die gewenste PIN-kode in"</string>
<string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"Bevestig gewenste PIN-kode"</string>
<string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"Ontsluit tans SIM-kaart…"</string>
- <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"Verkeerde PIN-kode."</string>
<string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"Tik \'n PIN in wat 4 tot 8 syfers lank is."</string>
<string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"PUK-kode moet 8 of meer syfers wees."</string>
<string name="kg_invalid_puk" msgid="3638289409676051243">"Voer weer die korrekte PUK-kode in. Herhaalde pogings sal die SIM permanent deaktiveer."</string>
@@ -129,6 +135,19 @@
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Jy het jou ontsluitpatroon <xliff:g id="NUMBER_0">%d</xliff:g> keer verkeerdelik geteken. Na nog <xliff:g id="NUMBER_1">%d</xliff:g> onsuksesvolle pogings, sal jy gevra word om jou foon te ontsluit deur middel van \'n e-posrekening.\n\n Probeer weer oor <xliff:g id="NUMBER_2">%d</xliff:g> sekondes."</string>
<string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
<string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Verwyder"</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"Verkeerde SIM PIN-kode, jy sal nou jou diensverskaffer moet kontak om jou toestel te ontsluit."</string>
+ <plurals name="kg_password_wrong_pin_code">
+ <item quantity="one" msgid="8134313997799638254">"Verkeerde SIM PIN-kode, jy het <xliff:g id="NUMBER">%d</xliff:g> oorblywende poging voordat jy jou diensverskaffer sal moet kontak om jou toestel te ontsluit."</item>
+ <item quantity="other" msgid="2215723361575359486">"Verkeerde SIM PIN-kode, jy het <xliff:g id="NUMBER">%d</xliff:g> oorblywende pogings."</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="7077536808291316208">"SIM is onbruikbaar. Kontak jou diensverskaffer."</string>
+ <plurals name="kg_password_wrong_puk_code">
+ <item quantity="one" msgid="3256893607561060649">"Verkeerde SIM PUK-kode, jy het <xliff:g id="NUMBER">%d</xliff:g> oorblywende poging voordat SIM permanent onbruikbaar word."</item>
+ <item quantity="other" msgid="5477305226026342036">"Verkeerde SIM PUK-kode, jy het <xliff:g id="NUMBER">%d</xliff:g> oorblywende pogings voordat SIM permanent onbruikbaar word."</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="6268288093558031564">"SIM PIN-bewerking het misluk!"</string>
+ <string name="kg_password_puk_failed" msgid="2838824369502455984">"SIM PUK-bewerking het misluk!"</string>
+ <string name="kg_pin_accepted" msgid="1448241673570020097">"Kode is aanvaar!"</string>
<string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Vorigesnit-knoppie"</string>
<string name="keyguard_transport_next_description" msgid="4299258300283778305">"Volgendesnit-knoppie"</string>
<string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Laatwag-knoppie"</string>
diff --git a/packages/Keyguard/res/values-am/strings.xml b/packages/Keyguard/res/values-am/strings.xml
index 2f6dab0..fd4cf78 100644
--- a/packages/Keyguard/res/values-am/strings.xml
+++ b/packages/Keyguard/res/values-am/strings.xml
@@ -21,9 +21,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"á’ን ኮድ ተይብ"</string>
- <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"PUK እና አዲስ á’ን ተይብ"</string>
- <string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"የPUK ኮድ"</string>
- <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"አዲስ Pin ኮድ"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="3035856550289724338">"የሲሠPUK እና አዲሱን á’ን ኮድ ይተይቡ"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="1801941051094974609">"የሲሠPUK ኮድ"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="3201151840570492538">"አዲስ ሲሠá’ን ኮድ"</string>
<string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"የይለá ቃሠለመተየብ ንካ"</font></string>
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"ለመክáˆá‰µ የይለá ቃሠተይብ"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"ለመክáˆá‰µ á’ን ተይብ"</string>
@@ -71,6 +71,13 @@
<string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"ለአáታ አá‰áˆ አá‹áˆ«áˆ­"</string>
<string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"የአጫá‹á‰µ አá‹áˆ«áˆ­"</string>
<string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"አá‰áˆ አá‹áˆ«áˆ­"</string>
+ <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"አሪá"</string>
+ <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"ደባሪ"</string>
+ <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"áˆá‰¥"</string>
+ <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"ለመቀጠሠይክáˆá‰±"</string>
+ <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"ማስጀመር ተሰርዟáˆ"</string>
+ <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"ለመሰረዠ<xliff:g id="WIDGET_INDEX">%1$s</xliff:g>ን ጣሠያድርጉá¢"</string>
+ <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> አይሰርá‹áˆá¢"</string>
<string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
<string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
<string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
@@ -105,7 +112,6 @@
<string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"የተáˆáˆˆáŒˆá‹áŠ• የá’ን ኮድ ያስገቡ"</string>
<string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"የተáˆáˆˆáŒˆá‹áŠ• የá’ን ኮድ ያረጋáŒáŒ¡"</string>
<string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"ሲሠካርዱን በመክáˆá‰µ ላይ…"</string>
- <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"ትክክሠያáˆáˆ†áŠ á’ን ኮድá¢"</string>
<string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"ከ4 እስከ 8 á‰áŒ¥áˆ®á‰½ የያዘ á’ን ይተይቡá¢"</string>
<string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"የPUK ኮድ 8 ወይሠከዚያ በላይ á‰áŒ¥áˆ®á‰½ ሊኖረዠይገባáˆá¢"</string>
<string name="kg_invalid_puk" msgid="3638289409676051243">"ትክክለኛá‹áŠ• የPUK ኮድ እንደገና ያስገቡᢠተደጋጋሚ ሙከራዎች ሲሠካርዱን እስከመጨረሻዠያሰናክሉታáˆá¢"</string>
@@ -129,6 +135,19 @@
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"የመክáˆá‰» ስርዓተ ጥለቱን <xliff:g id="NUMBER_0">%d</xliff:g> ጊዜ በትክክሠአáˆáˆ³áˆ‰á‰µáˆá¢ ከ<xliff:g id="NUMBER_1">%d</xliff:g> ተጨማሪ á‹«áˆá‰°áˆ³áŠ© ሙከራዎች በኋላ የኢሜይሠመለያ ተጠቅመዠስáˆáŠ­á‹ŽáŠ• እንዲከáቱ ይጠየቃሉá¢\n\nእባክዎ ከ<xliff:g id="NUMBER_2">%d</xliff:g> ሰከንዶች በኋላ እንደገና ይሞክሩá¢"</string>
<string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
<string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"አስወáŒá‹µ"</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"áˆáŠ­ á‹«áˆáˆ†áŠ á‹¨áˆ²áˆ áŠ®á‹µá¢ áŠ áˆáŠ• መሳሪያዎን ለማስከáˆá‰µ ድáˆáŒ¸ ተያያዥ ሞደáˆá‹ŽáŠ• ማáŒáŠ˜á‰µ አለብዎá¢"</string>
+ <plurals name="kg_password_wrong_pin_code">
+ <item quantity="one" msgid="8134313997799638254">"áˆáŠ­ á‹«áˆáˆ†áŠ á‹¨áˆ²áˆ á’ን ኮድᣠመሳሪያዎን ለማስከáˆá‰µ ድáˆáŒ¸ ተያያዥ ሞደáˆá‹ŽáŠ• ማáŒáŠ˜á‰µ áŒá‹´á‰³á‹Ž ሊሆን <xliff:g id="NUMBER">%d</xliff:g> ሙከራ ይቀርዎታáˆá¢"</item>
+ <item quantity="other" msgid="2215723361575359486">"áˆáŠ­ á‹«áˆáˆ†áŠ á‹¨áˆ²áˆ á’ን ኮድᣠ<xliff:g id="NUMBER">%d</xliff:g> ሙከራዎች ይቀሩዎታáˆá¢"</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="7077536808291316208">"ሲሙ ጥቅሠላይ መዋሠእይችáˆáˆá¢ የእርስዎን ድáˆáŒ¸ ተያያዥ ሞደሠያáŒáŠ™á¢"</string>
+ <plurals name="kg_password_wrong_puk_code">
+ <item quantity="one" msgid="3256893607561060649">"áˆáŠ­ á‹«áˆáˆ†áŠ á‹¨áˆ²áˆ PUK ኮድᣠሲሠካርድዎ በቋሚáŠá‰µ ጥቅሠላይ መዋሠየማይችሠሊሆን <xliff:g id="NUMBER">%d</xliff:g> ሙከራ ይቀርዎታáˆá¢"</item>
+ <item quantity="other" msgid="5477305226026342036">"áˆáŠ­ á‹«áˆáˆ†áŠ á‹¨áˆ²áˆ PUK ኮድᣠሲሠካርድዎ በቋሚáŠá‰µ ጥቅሠላይ መዋሠየማይችሠሊሆን <xliff:g id="NUMBER">%d</xliff:g> ሙከራዎች ይቀሩዎታáˆá¢"</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="6268288093558031564">"የሲሠá’ን ክወና አáˆá‰°áˆ³áŠ«áˆ!"</string>
+ <string name="kg_password_puk_failed" msgid="2838824369502455984">"የሲሠPUK ክወና አáˆá‰°áˆ³áŠ«áˆ!"</string>
+ <string name="kg_pin_accepted" msgid="1448241673570020097">"ኮዱ ተቀባይáŠá‰µ አáŒáŠá‰·áˆ!"</string>
<string name="keyguard_transport_prev_description" msgid="8229108430245669854">"የቀዳሚ ትራክ አá‹áˆ«áˆ­"</string>
<string name="keyguard_transport_next_description" msgid="4299258300283778305">"የቀጣይ ትራክ አá‹áˆ«áˆ­"</string>
<string name="keyguard_transport_pause_description" msgid="5093073338238310224">"ለአáታ አá‰áˆ አá‹áˆ«áˆ­"</string>
diff --git a/packages/Keyguard/res/values-ar/strings.xml b/packages/Keyguard/res/values-ar/strings.xml
index bcfe7db..83d4b93 100644
--- a/packages/Keyguard/res/values-ar/strings.xml
+++ b/packages/Keyguard/res/values-ar/strings.xml
@@ -20,14 +20,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"اكتب رمز رقم التعري٠الشخصي"</string>
- <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"اكتب رمز PUK ورمز رقم التعري٠الشخصي الجديد"</string>
- <string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"رمز PUK"</string>
- <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"رمز رقم التعري٠الشخصي الجديد"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"â€Ø§ÙƒØªØ¨ رمز رمز PIN"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="3035856550289724338">"â€Ø£Ø¯Ø®Ù„ رمز PUK لبطاقة SIM ورمز \"رقم التعري٠الشخصي\" الجديد"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="1801941051094974609">"â€Ø±Ù…ز PUK لبطاقة SIM"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="3201151840570492538">"â€Ø±Ù…ز \"رقم تعري٠شخصي\" جديد لبطاقة SIM"</string>
<string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"المس لكتابة كلمة المرور"</font></string>
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"اكتب كلمة المرور لإلغاء التأمين"</string>
- <string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"اكتب رقم التعري٠الشخصي لإلغاء التأمين"</string>
- <string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"رقم التعري٠الشخصي غير صحيح."</string>
+ <string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"â€Ø§ÙƒØªØ¨ رمز PIN لإلغاء التأمين"</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"â€Ø±Ù…ز PIN غير صحيح."</string>
<string name="keyguard_label_text" msgid="861796461028298424">"لإلغاء التأمين، اضغط على \"القائمة\" ثم على 0."</string>
<string name="faceunlock_multiple_failures" msgid="754137583022792429">"تم تجاوز الحد الأقصى لعدد محاولات تأمين الجهاز بالوجه"</string>
<string name="keyguard_charged" msgid="3272223906073492454">"تم الشحن"</string>
@@ -35,17 +35,17 @@
<string name="keyguard_low_battery" msgid="8143808018719173859">"توصيل جهاز الشحن."</string>
<string name="keyguard_instructions_when_pattern_disabled" msgid="1332288268600329841">"اضغط على \"القائمة\" لإلغاء القÙÙ„."</string>
<string name="keyguard_network_locked_message" msgid="9169717779058037168">"الشبكة مؤمّنة"</string>
- <string name="keyguard_missing_sim_message_short" msgid="494980561304211931">"ليست هناك بطاقة SIM"</string>
- <string name="keyguard_missing_sim_message" product="tablet" msgid="1445849005909260039">"ليست هناك بطاقة SIM ÙÙŠ الجهاز اللوحي."</string>
- <string name="keyguard_missing_sim_message" product="default" msgid="3481110395508637643">"ليست هناك بطاقة SIM ÙÙŠ الهاتÙ."</string>
- <string name="keyguard_missing_sim_instructions" msgid="5210891509995942250">"أدخل بطاقة SIM."</string>
- <string name="keyguard_missing_sim_instructions_long" msgid="5968985489463870358">"بطاقة SIM Ù…Ùقودة أو غير قابلة للقراءة. أدخل بطاقة SIM."</string>
- <string name="keyguard_permanent_disabled_sim_message_short" msgid="8340813989586622356">"بطاقة SIM غير قابلة للاستخدام."</string>
- <string name="keyguard_permanent_disabled_sim_instructions" msgid="5892940909699723544">"تم تعطيل بطاقة SIM بشكل دائم.\n اتصل بمقدم خدمة اللاسلكي للحصول على بطاقة SIM أخرى."</string>
- <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"بطاقة SIM مؤمّنة."</string>
- <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"بطاقة SIM مؤمّنة بكود PUK."</string>
- <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"جار٠إلغاء تأمين بطاقة SIM…"</string>
- <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. الأداة %2$d من %3$d."</string>
+ <string name="keyguard_missing_sim_message_short" msgid="494980561304211931">"â€Ù„يست هناك بطاقة SIM"</string>
+ <string name="keyguard_missing_sim_message" product="tablet" msgid="1445849005909260039">"â€Ù„يست هناك بطاقة SIM ÙÙŠ الجهاز اللوحي."</string>
+ <string name="keyguard_missing_sim_message" product="default" msgid="3481110395508637643">"â€Ù„يست هناك بطاقة SIM ÙÙŠ الهاتÙ."</string>
+ <string name="keyguard_missing_sim_instructions" msgid="5210891509995942250">"â€Ø£Ø¯Ø®Ù„ بطاقة SIM."</string>
+ <string name="keyguard_missing_sim_instructions_long" msgid="5968985489463870358">"â€Ø¨Ø·Ø§Ù‚Ø© SIM Ù…Ùقودة أو غير قابلة للقراءة. أدخل بطاقة SIM."</string>
+ <string name="keyguard_permanent_disabled_sim_message_short" msgid="8340813989586622356">"â€Ø¨Ø·Ø§Ù‚Ø© SIM غير قابلة للاستخدام."</string>
+ <string name="keyguard_permanent_disabled_sim_instructions" msgid="5892940909699723544">"â€ØªÙ… تعطيل بطاقة SIM بشكل دائم.\n اتصل بمقدم خدمة اللاسلكي للحصول على بطاقة SIM أخرى."</string>
+ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"â€Ø¨Ø·Ø§Ù‚Ø© SIM مؤمّنة."</string>
+ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"â€Ø¨Ø·Ø§Ù‚Ø© SIM مؤمّنة بكود PUK."</string>
+ <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"â€Ø¬Ø§Ø±Ù إلغاء تأمين بطاقة SIM…"</string>
+ <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"â€%1$s. الأداة %2$d من %3$d."</string>
<string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Ø¥Ø¶Ø§ÙØ© أداة."</string>
<string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"ÙØ§Ø±ØºØ©"</string>
<string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"تم توسيع منطقة إلغاء القÙÙ„."</string>
@@ -62,7 +62,7 @@
<string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"إلغاء القÙÙ„ باستخدام التمرير."</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"إلغاء القÙÙ„ باستخدام النقش."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"تأمين الجهاز بالوجه."</string>
- <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"إلغاء القÙÙ„ باستخدام رقم التعري٠الشخصي."</string>
+ <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"â€Ø¥Ù„غاء القÙÙ„ باستخدام رمز PIN."</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"إلغاء القÙÙ„ باستخدام كلمة المرور."</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"منطقة النقش."</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"منطقة التمرير."</string>
@@ -71,6 +71,13 @@
<string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"زر الإيقا٠المؤقت"</string>
<string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"زر التشغيل"</string>
<string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"زر الإيقاÙ"</string>
+ <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"رائعة"</string>
+ <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"معارضة"</string>
+ <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"قلب"</string>
+ <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"إلغاء القÙÙ„ للمتابعة"</string>
+ <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"تم إلغاء التشغيل"</string>
+ <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"أسقط <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> للحذÙ."</string>
+ <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"لن يتم حذ٠<xliff:g id="WIDGET_INDEX">%1$s</xliff:g>."</string>
<string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
<string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ب ت ث"</string>
<string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
@@ -98,27 +105,26 @@
<string name="kg_wrong_pin" msgid="1131306510833563801">"رقم تعري٠شخصي خاطئ"</string>
<string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"حاول مرة أخرى خلال <xliff:g id="NUMBER">%d</xliff:g> ثانية."</string>
<string name="kg_pattern_instructions" msgid="398978611683075868">"ارسم نقشك"</string>
- <string name="kg_sim_pin_instructions" msgid="2319508550934557331">"أدخل رقم التعري٠الشخصي لبطاقة SIM"</string>
- <string name="kg_pin_instructions" msgid="2377242233495111557">"أدخل رقم التعري٠الشخصي"</string>
+ <string name="kg_sim_pin_instructions" msgid="2319508550934557331">"â€Ø£Ø¯Ø®Ù„ رمز PIN لبطاقة SIM"</string>
+ <string name="kg_pin_instructions" msgid="2377242233495111557">"â€Ø£Ø¯Ø®Ù„ رمز PIN"</string>
<string name="kg_password_instructions" msgid="5753646556186936819">"أدخل كلمة المرور"</string>
- <string name="kg_puk_enter_puk_hint" msgid="453227143861735537">"بطاقة SIM معطلة الآن. أدخل رمز PUK للمتابعة. اتصل بمشغل شبكة الجوال للاطلاع على Ø§Ù„ØªÙØ§ØµÙŠÙ„."</string>
- <string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"إدخال رمز رقم التعري٠الشخصي المراد"</string>
- <string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"تأكيد رمز رقم التعري٠الشخصي المراد"</string>
- <string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"جار٠إلغاء تأمين بطاقة SIM…"</string>
- <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"رقم التعري٠الشخصي غير صحيح."</string>
- <string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"اكتب رقم التعري٠الشخصي المكون من 4 إلى 8 أرقام."</string>
- <string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"يجب أن يتضمن رمز PUK†8 أرقام أو أكثر."</string>
- <string name="kg_invalid_puk" msgid="3638289409676051243">"أعد إدخال رمز PUK الصحيح. وستؤدي المحاولات المتكررة إلى تعطيل بطاقة SIM نهائيًا."</string>
- <string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"لا يتطابق رمزا رقم التعري٠الشخصي"</string>
+ <string name="kg_puk_enter_puk_hint" msgid="453227143861735537">"â€Ø¨Ø·Ø§Ù‚Ø© SIM معطلة الآن. أدخل رمز PUK للمتابعة. اتصل بمشغل شبكة الجوال للاطلاع على Ø§Ù„ØªÙØ§ØµÙŠÙ„."</string>
+ <string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"â€Ø¥Ø¯Ø®Ø§Ù„ رمز رمز PIN المراد"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"â€ØªØ£ÙƒÙŠØ¯ رمز رمز PIN المراد"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"â€Ø¬Ø§Ø±Ù إلغاء تأمين بطاقة SIM…"</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"â€Ø§ÙƒØªØ¨ رمز PIN المكون من 4 إلى 8 أرقام."</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"â€ÙŠØ¬Ø¨ أن يتضمن رمز PUK†8 أرقام أو أكثر."</string>
+ <string name="kg_invalid_puk" msgid="3638289409676051243">"â€Ø£Ø¹Ø¯ إدخال رمز PUK الصحيح. وستؤدي المحاولات المتكررة إلى تعطيل بطاقة SIM نهائيًا."</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"â€Ù„ا يتطابق رمزا رمز PIN"</string>
<string name="kg_login_too_many_attempts" msgid="6486842094005698475">"محاولات النقش كثيرة جدًا"</string>
- <string name="kg_login_instructions" msgid="1100551261265506448">"لإلغاء التأمين، سجّل الدخول بحسابك ÙÙŠ Google."</string>
+ <string name="kg_login_instructions" msgid="1100551261265506448">"â€Ù„إلغاء التأمين، سجّل الدخول بحسابك ÙÙŠ Google."</string>
<string name="kg_login_username_hint" msgid="5718534272070920364">"اسم المستخدم (البريد إلكتروني)"</string>
<string name="kg_login_password_hint" msgid="9057289103827298549">"كلمة المرور"</string>
<string name="kg_login_submit_button" msgid="5355904582674054702">"تسجيل الدخول"</string>
<string name="kg_login_invalid_input" msgid="5754664119319872197">"اسم مستخدم غير صحيح أو كلمة مرور غير صالحة."</string>
- <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"هل نسيت اسم المستخدم أو كلمة المرور؟\nانتقل إلى "<b>"google.com/accounts/recovery"</b>"."</string>
+ <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"â€Ù‡Ù„ نسيت اسم المستخدم أو كلمة المرور؟\nانتقل إلى "<b>"google.com/accounts/recovery"</b>"."</string>
<string name="kg_login_checking_password" msgid="1052685197710252395">"Ø¬Ø§Ø±Ù ÙØ­Øµ الحساب…"</string>
- <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"لقد كتبت رقم التعري٠الشخصي بشكل غير صحيح <xliff:g id="NUMBER_0">%d</xliff:g> مرة. \n\nأعد المحاولة خلال <xliff:g id="NUMBER_1">%d</xliff:g> ثانية."</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"â€Ù„قد كتبت رمز PIN بشكل غير صحيح <xliff:g id="NUMBER_0">%d</xliff:g> مرة. \n\nأعد المحاولة خلال <xliff:g id="NUMBER_1">%d</xliff:g> ثانية."</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"لقد كتبت كلمة المرور بشكل غير صحيح <xliff:g id="NUMBER_0">%d</xliff:g> مرة. \n\nأعد المحاولة خلال <xliff:g id="NUMBER_1">%d</xliff:g> ثانية."</string>
<string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"لقد رسمت نقش إلغاء التأمين بطريقة غير صحيحة <xliff:g id="NUMBER_0">%d</xliff:g> مرة. \n\nأعد المحاولة خلال <xliff:g id="NUMBER_1">%d</xliff:g> ثانية."</string>
<string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1575557200627128949">"لقد حاولت إلغاء تأمين الجهاز اللوحي بشكل غير صحيح <xliff:g id="NUMBER_0">%d</xliff:g> مرة. بعد إجراء <xliff:g id="NUMBER_1">%d</xliff:g> من المحاولات غير الناجحة الأخرى، ستتم إعادة تعيين الجهاز اللوحي على الإعدادات Ø§Ù„Ø§ÙØªØ±Ø§Ø¶ÙŠØ© للمصنع وسيتم Ùقد جميع بيانات المستخدم."</string>
@@ -129,6 +135,19 @@
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"لقد رسمت نقش إلغاء التأمين بشكل غير صحيح <xliff:g id="NUMBER_0">%d</xliff:g> مرة. بعد إجراء <xliff:g id="NUMBER_1">%d</xliff:g> من المحاولات غير الناجحة الأخرى، Ø³ØªÙØ·Ø§Ù„ب بإلغاء تأمين الهات٠باستخدام حساب بريد إلكتروني لإلغاء تأمين الهاتÙ.\n\n أعد المحاولة خلال <xliff:g id="NUMBER_2">%d</xliff:g> ثانية."</string>
<string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
<string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"إزالة"</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"â€Ø±Ù…ز \"رقم التعري٠الشخصي\" لبطاقة SIM غير صحيح، ويلزمك الاتصال الآن بمشغّل شبكة الجوّال لإلغاء Ù‚ÙÙ„ الجهاز."</string>
+ <plurals name="kg_password_wrong_pin_code">
+ <item quantity="one" msgid="8134313997799638254">"â€Ø±Ù…ز \"رقم التعري٠الشخصي\" لبطاقة SIM غير صحيح، ويتبقى لديك محاولة واحدة (<xliff:g id="NUMBER">%d</xliff:g>) يتعين عليك بعدها الاتصال بمشغّل شبكة الجوّال لإلغاء Ù‚ÙÙ„ الجهاز."</item>
+ <item quantity="other" msgid="2215723361575359486">"â€Ø±Ù…ز \"رقم التعري٠الشخصي\" لبطاقة SIM غير صحيح، يتبقى لديك <xliff:g id="NUMBER">%d</xliff:g> من المحاولات."</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="7077536808291316208">"â€Ø¨Ø·Ø§Ù‚Ø© SIM غير صالحة للاستخدام. ÙŠÙØ±Ø¬Ù‰ الاتصال بمشغّل شبكة الجوّال."</string>
+ <plurals name="kg_password_wrong_puk_code">
+ <item quantity="one" msgid="3256893607561060649">"â€Ø±Ù…ز PUK لبطاقة SIM غير صالح، ويتبقى لديك محاولة واحدة (<xliff:g id="NUMBER">%d</xliff:g>)ØŒ تصبح بعدها بطاقة SIM غير صالحة للاستخدام بشكل دائم."</item>
+ <item quantity="other" msgid="5477305226026342036">"â€Ø±Ù…ز PUK لبطاقة SIM غير صالح، ويتبقى لديك <xliff:g id="NUMBER">%d</xliff:g> من المحاولات، تصبح بعدها بطاقة SIM غير صالحة للاستخدام بشكل دائم."</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="6268288093558031564">"â€Ø£Ø®Ùقت عملية \"رقم التعري٠الشخصي\" لبطاقة SIM!"</string>
+ <string name="kg_password_puk_failed" msgid="2838824369502455984">"â€Ø£Ø®Ùقت عملية PUK لبطاقة SIM!"</string>
+ <string name="kg_pin_accepted" msgid="1448241673570020097">"تم قبول الرمز!"</string>
<string name="keyguard_transport_prev_description" msgid="8229108430245669854">"زر المقطع الصوتي السابق"</string>
<string name="keyguard_transport_next_description" msgid="4299258300283778305">"زر المقطع الصوتي التالي"</string>
<string name="keyguard_transport_pause_description" msgid="5093073338238310224">"زر الإيقا٠المؤقت"</string>
diff --git a/packages/Keyguard/res/values-az-rAZ/strings.xml b/packages/Keyguard/res/values-az-rAZ/strings.xml
new file mode 100644
index 0000000..5c8f6ac
--- /dev/null
+++ b/packages/Keyguard/res/values-az-rAZ/strings.xml
@@ -0,0 +1,138 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"PİN kodu daxil edin"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"PUK və yeni PİN kod daxil edin"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"PUK kod"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"Yeni PIN kodu"</string>
+ <string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"Şifrə daxil etmək üçün toxunun"</font></string>
+ <string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Kilidi açmaq üçün parol yazın"</string>
+ <string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Kilidi açmaq üçün PIN daxil edin"</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"Yanlış PIN kodu."</string>
+ <string name="keyguard_label_text" msgid="861796461028298424">"Kilidi açmaq üçün Menyu, sonra 0 basın."</string>
+ <string name="faceunlock_multiple_failures" msgid="754137583022792429">"Sifət kilidi cəhdləriniz bitdi"</string>
+ <string name="keyguard_charged" msgid="3272223906073492454">"DolmuÅŸ"</string>
+ <string name="keyguard_plugged_in" msgid="8117572000639998388">"Dolur, <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+ <string name="keyguard_low_battery" msgid="8143808018719173859">"ElektrikÉ™ qoÅŸun."</string>
+ <string name="keyguard_instructions_when_pattern_disabled" msgid="1332288268600329841">"Kilidi açmaq üçün Menyu düyməsinə baxın."</string>
+ <string name="keyguard_network_locked_message" msgid="9169717779058037168">"Şəbəkə kilidləndi"</string>
+ <string name="keyguard_missing_sim_message_short" msgid="494980561304211931">"SİM kart yoxdur"</string>
+ <string name="keyguard_missing_sim_message" product="tablet" msgid="1445849005909260039">"Planşetdə SİM kart yoxdur.."</string>
+ <string name="keyguard_missing_sim_message" product="default" msgid="3481110395508637643">"Telefonda SİM kart yoxdu."</string>
+ <string name="keyguard_missing_sim_instructions" msgid="5210891509995942250">"SIM kartı daxil edin."</string>
+ <string name="keyguard_missing_sim_instructions_long" msgid="5968985489463870358">"SİM kart yoxdur və ya oxuna bilinmir. SİM kart daxil edin."</string>
+ <string name="keyguard_permanent_disabled_sim_message_short" msgid="8340813989586622356">"Yararsız SIM kart."</string>
+ <string name="keyguard_permanent_disabled_sim_instructions" msgid="5892940909699723544">"Sizin SİM kartınız daimi olaraq deaktivləşib.\n Başqa SİM kart üçün simsiz xidmət provayderinizə müraciət edin."</string>
+ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM kart kilidlənib."</string>
+ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SİM kart PUK ilə kilidlənib."</string>
+ <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"SİM kartın kilidi açılır..."</string>
+ <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d of %3$d."</string>
+ <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Widget əlavə edin."</string>
+ <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"BoÅŸ"</string>
+ <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Kilidi açma sahəsi genişləndi."</string>
+ <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Kilidi açma sahəsi çökdü."</string>
+ <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> vidcet."</string>
+ <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"İstifadəçi selektoru"</string>
+ <string name="keyguard_accessibility_status" msgid="8008264603935930611">"Status"</string>
+ <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Kamera"</string>
+ <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Media kontrolları"</string>
+ <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Yenidən sıralama vidceti başladıldı."</string>
+ <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Vidcetin təkrar sifarişi sona çatdı."</string>
+ <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Vidcet <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> silindi."</string>
+ <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Kilidi açma sahəsini genişləndir."</string>
+ <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Sürüşdürmə kilidi."</string>
+ <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Kild açma modeli."</string>
+ <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Sifət Kilidi"</string>
+ <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Pin kilid açması."</string>
+ <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"ÅžifrÉ™ kilidi."</string>
+ <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Model sahəsi."</string>
+ <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Sürüşdürmə sahəsi."</string>
+ <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"ÆvvÉ™lki izlÉ™mÉ™ düymÉ™si"</string>
+ <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"Növbəti izləmə düyməsi"</string>
+ <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Pauza düyməsi"</string>
+ <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Oxutma düyməsi"</string>
+ <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Dayandırma düyməsi"</string>
+ <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
+ <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
+ <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
+ <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
+ <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"Ləğv et"</string>
+ <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Sil"</string>
+ <string name="keyboardview_keycode_done" msgid="1992571118466679775">"Hazırdır"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Rejim dəyişikliyi"</string>
+ <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
+ <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Daxil olun"</string>
+ <string name="description_target_unlock" msgid="2228524900439801453">"Kilidi aç"</string>
+ <string name="description_target_camera" msgid="969071997552486814">"Kamera"</string>
+ <string name="description_target_silent" msgid="893551287746522182">"Səssiz"</string>
+ <string name="description_target_soundon" msgid="30052466675500172">"Səs açıqdır"</string>
+ <string name="description_target_search" msgid="3091587249776033139">"Axtar"</string>
+ <string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> üçün yuxarı sürüşdürün."</string>
+ <string name="description_direction_down" msgid="5087739728639014595">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> üçün aşağı sürüşdürün."</string>
+ <string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> üçün sola sürüşdür."</string>
+ <string name="description_direction_right" msgid="8034433242579600980">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> üçün sağa sürüşdür."</string>
+ <string name="user_switched" msgid="3768006783166984410">"Cari istifadəçi <xliff:g id="NAME">%1$s</xliff:g>."</string>
+ <string name="kg_emergency_call_label" msgid="684946192523830531">"Təcili zəng"</string>
+ <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Åžablonu unutmuÅŸam"</string>
+ <string name="kg_wrong_pattern" msgid="1850806070801358830">"Yanlış Model"</string>
+ <string name="kg_wrong_password" msgid="2333281762128113157">"Yanlış Şifrə"</string>
+ <string name="kg_wrong_pin" msgid="1131306510833563801">"PIN səhvdir"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"<xliff:g id="NUMBER">%d</xliff:g> saniyə sonra yenidən cəhd edin."</string>
+ <string name="kg_pattern_instructions" msgid="398978611683075868">"Şablonunuzu çəkin"</string>
+ <string name="kg_sim_pin_instructions" msgid="2319508550934557331">"SIM PIN kodu daxil edin"</string>
+ <string name="kg_pin_instructions" msgid="2377242233495111557">"PİN kodu daxil edin"</string>
+ <string name="kg_password_instructions" msgid="5753646556186936819">"Parol daxil edin"</string>
+ <string name="kg_puk_enter_puk_hint" msgid="453227143861735537">"SIM indi deaktivdir. Davam etmÉ™k üçün PUK kodu daxil edin. ÆlavÉ™ mÉ™lumat üçün operatora müraciÉ™t edin."</string>
+ <string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"İstədiyiniz PİN kodu daxil edin"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"İstədiyiniz PIN kodu təsdiqləyin"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"SİM kartın kilidi açılır..."</string>
+ <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"Yanlış PİN kod."</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"4-dən 8-ə qədər rəqəmi olan PIN yazın."</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"PUK kod 8 rəqəm və ya daha çox olmalıdır."</string>
+ <string name="kg_invalid_puk" msgid="3638289409676051243">"Düzgün PUK kodu yenidən daxil edin. Təkrarlanan cəhdlər SIM\'i birdəfəlik sıradan çıxaracaq."</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"PIN kodları uyğun deyil"</string>
+ <string name="kg_login_too_many_attempts" msgid="6486842094005698475">"Həddindən çox cəhd edildi!"</string>
+ <string name="kg_login_instructions" msgid="1100551261265506448">"Kilidi açmaq üçün Google hesabınız ilə daxil olun."</string>
+ <string name="kg_login_username_hint" msgid="5718534272070920364">"İstifadəçi adı (e-poçt)"</string>
+ <string name="kg_login_password_hint" msgid="9057289103827298549">"ÅžifrÉ™"</string>
+ <string name="kg_login_submit_button" msgid="5355904582674054702">"Daxil ol"</string>
+ <string name="kg_login_invalid_input" msgid="5754664119319872197">"Yanlış istifadəçi adı və ya parol."</string>
+ <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"İstifadəçi adınızı və ya parolunuzu unutmusunuz?\n "<b>"google.com/accounts/recovery"</b>" linkinə daxil olun."</string>
+ <string name="kg_login_checking_password" msgid="1052685197710252395">"Hesab yoxlanılır..."</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"PIN kodunuzu <xliff:g id="NUMBER_0">%d</xliff:g> dəfə yanlış daxil etdiniz.\n\n <xliff:g id="NUMBER_1">%d</xliff:g> saniyə ərzində yenidən yoxlayın"</string>
+ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"Şifrənizi <xliff:g id="NUMBER_0">%d</xliff:g> dəfə yanlış daxil etdiniz. \n\n <xliff:g id="NUMBER_1">%d</xliff:g> saniyə ərzində yenidən yoxlayın."</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"Modelinizi <xliff:g id="NUMBER_0">%d</xliff:g> dəfə yanlış çəkmisiniz.\n\n <xliff:g id="NUMBER_1">%d</xliff:g> saniyə ərzində yenidən yoxlayın"</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1575557200627128949">"Siz planşet kilidini açmaq üçün <xliff:g id="NUMBER_0">%d</xliff:g> dəfə uğursuz cəhd etmisiniz. <xliff:g id="NUMBER_1">%d</xliff:g> dəfə də uğursuz cəhd etsəniz, planşet fabrik ayarlarına sıfırlanacaq və bütün məlumatlarınız itəcək."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="4051015943038199910">"Siz telefon kilidini açmaq üçün <xliff:g id="NUMBER_0">%d</xliff:g> dəfə uğursuz cəhd etmisiniz. <xliff:g id="NUMBER_1">%d</xliff:g> dəfə də uğursuz cəhd etsəniz, telefon fabrik ayarlarına sıfırlanacaq və bütün məlumatlarınız itəcək."</string>
+ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="2072996269148483637">"Siz planşet kilidini açmaq üçün <xliff:g id="NUMBER">%d</xliff:g> dəfə uğursuz cəhd etmisiniz. Planşet fabrik ayarlarına sıfırlanacaq."</string>
+ <string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"Siz telefonun kilidini açmaq üçün <xliff:g id="NUMBER">%d</xliff:g> yanlış cəhd etmisiniz. Telefon artıq defolt zavod halına sıfırlanacaq."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Siz kilidi açmaq üçün şablonu <xliff:g id="NUMBER_0">%d</xliff:g> dəfə səhv çəkdiniz. <xliff:g id="NUMBER_1">%d</xliff:g> daha uğursuz cəhddən sonra planşetinizin kilidini e-poçt hesabınızla açmaq tələb olunacaq.\n\n <xliff:g id="NUMBER_2">%d</xliff:g> saniyə ərzində bir daha yoxlayın."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Siz artıq modeli <xliff:g id="NUMBER_0">%d</xliff:g> dəfə yanlış daxil etmisiniz.<xliff:g id="NUMBER_1">%d</xliff:g> dəfə də yanlış daxil etsəniz, telefonun kilidinin açılması üçün elektron poçt ünvanınız tələb olunacaq.\n\n <xliff:g id="NUMBER_2">%d</xliff:g> saniyə ərzində yenidən cəhd edin."</string>
+ <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" - "</string>
+ <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Yığışdır"</string>
+ <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"ÆvvÉ™lki izlÉ™mÉ™ düymÉ™si"</string>
+ <string name="keyguard_transport_next_description" msgid="4299258300283778305">"Növbəti izləmə düyməsi"</string>
+ <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Pauza düyməsi"</string>
+ <string name="keyguard_transport_play_description" msgid="2924628863741150956">"Oxutma düyməsi"</string>
+ <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"Dayandırma düyməsi"</string>
+ <string name="keyguard_carrier_default" msgid="8700650403054042153">"Xidmət yoxdur."</string>
+</resources>
diff --git a/packages/Keyguard/res/values-az/strings.xml b/packages/Keyguard/res/values-az/strings.xml
new file mode 100644
index 0000000..5c8f6ac
--- /dev/null
+++ b/packages/Keyguard/res/values-az/strings.xml
@@ -0,0 +1,138 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"PİN kodu daxil edin"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"PUK və yeni PİN kod daxil edin"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"PUK kod"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"Yeni PIN kodu"</string>
+ <string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"Şifrə daxil etmək üçün toxunun"</font></string>
+ <string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Kilidi açmaq üçün parol yazın"</string>
+ <string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Kilidi açmaq üçün PIN daxil edin"</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"Yanlış PIN kodu."</string>
+ <string name="keyguard_label_text" msgid="861796461028298424">"Kilidi açmaq üçün Menyu, sonra 0 basın."</string>
+ <string name="faceunlock_multiple_failures" msgid="754137583022792429">"Sifət kilidi cəhdləriniz bitdi"</string>
+ <string name="keyguard_charged" msgid="3272223906073492454">"DolmuÅŸ"</string>
+ <string name="keyguard_plugged_in" msgid="8117572000639998388">"Dolur, <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+ <string name="keyguard_low_battery" msgid="8143808018719173859">"ElektrikÉ™ qoÅŸun."</string>
+ <string name="keyguard_instructions_when_pattern_disabled" msgid="1332288268600329841">"Kilidi açmaq üçün Menyu düyməsinə baxın."</string>
+ <string name="keyguard_network_locked_message" msgid="9169717779058037168">"Şəbəkə kilidləndi"</string>
+ <string name="keyguard_missing_sim_message_short" msgid="494980561304211931">"SİM kart yoxdur"</string>
+ <string name="keyguard_missing_sim_message" product="tablet" msgid="1445849005909260039">"Planşetdə SİM kart yoxdur.."</string>
+ <string name="keyguard_missing_sim_message" product="default" msgid="3481110395508637643">"Telefonda SİM kart yoxdu."</string>
+ <string name="keyguard_missing_sim_instructions" msgid="5210891509995942250">"SIM kartı daxil edin."</string>
+ <string name="keyguard_missing_sim_instructions_long" msgid="5968985489463870358">"SİM kart yoxdur və ya oxuna bilinmir. SİM kart daxil edin."</string>
+ <string name="keyguard_permanent_disabled_sim_message_short" msgid="8340813989586622356">"Yararsız SIM kart."</string>
+ <string name="keyguard_permanent_disabled_sim_instructions" msgid="5892940909699723544">"Sizin SİM kartınız daimi olaraq deaktivləşib.\n Başqa SİM kart üçün simsiz xidmət provayderinizə müraciət edin."</string>
+ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM kart kilidlənib."</string>
+ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SİM kart PUK ilə kilidlənib."</string>
+ <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"SİM kartın kilidi açılır..."</string>
+ <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d of %3$d."</string>
+ <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Widget əlavə edin."</string>
+ <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"BoÅŸ"</string>
+ <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Kilidi açma sahəsi genişləndi."</string>
+ <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Kilidi açma sahəsi çökdü."</string>
+ <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> vidcet."</string>
+ <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"İstifadəçi selektoru"</string>
+ <string name="keyguard_accessibility_status" msgid="8008264603935930611">"Status"</string>
+ <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Kamera"</string>
+ <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Media kontrolları"</string>
+ <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Yenidən sıralama vidceti başladıldı."</string>
+ <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Vidcetin təkrar sifarişi sona çatdı."</string>
+ <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Vidcet <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> silindi."</string>
+ <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Kilidi açma sahəsini genişləndir."</string>
+ <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Sürüşdürmə kilidi."</string>
+ <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Kild açma modeli."</string>
+ <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Sifət Kilidi"</string>
+ <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Pin kilid açması."</string>
+ <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"ÅžifrÉ™ kilidi."</string>
+ <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Model sahəsi."</string>
+ <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Sürüşdürmə sahəsi."</string>
+ <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"ÆvvÉ™lki izlÉ™mÉ™ düymÉ™si"</string>
+ <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"Növbəti izləmə düyməsi"</string>
+ <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Pauza düyməsi"</string>
+ <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Oxutma düyməsi"</string>
+ <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Dayandırma düyməsi"</string>
+ <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
+ <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
+ <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
+ <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
+ <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"Ləğv et"</string>
+ <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Sil"</string>
+ <string name="keyboardview_keycode_done" msgid="1992571118466679775">"Hazırdır"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Rejim dəyişikliyi"</string>
+ <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
+ <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Daxil olun"</string>
+ <string name="description_target_unlock" msgid="2228524900439801453">"Kilidi aç"</string>
+ <string name="description_target_camera" msgid="969071997552486814">"Kamera"</string>
+ <string name="description_target_silent" msgid="893551287746522182">"Səssiz"</string>
+ <string name="description_target_soundon" msgid="30052466675500172">"Səs açıqdır"</string>
+ <string name="description_target_search" msgid="3091587249776033139">"Axtar"</string>
+ <string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> üçün yuxarı sürüşdürün."</string>
+ <string name="description_direction_down" msgid="5087739728639014595">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> üçün aşağı sürüşdürün."</string>
+ <string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> üçün sola sürüşdür."</string>
+ <string name="description_direction_right" msgid="8034433242579600980">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> üçün sağa sürüşdür."</string>
+ <string name="user_switched" msgid="3768006783166984410">"Cari istifadəçi <xliff:g id="NAME">%1$s</xliff:g>."</string>
+ <string name="kg_emergency_call_label" msgid="684946192523830531">"Təcili zəng"</string>
+ <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Åžablonu unutmuÅŸam"</string>
+ <string name="kg_wrong_pattern" msgid="1850806070801358830">"Yanlış Model"</string>
+ <string name="kg_wrong_password" msgid="2333281762128113157">"Yanlış Şifrə"</string>
+ <string name="kg_wrong_pin" msgid="1131306510833563801">"PIN səhvdir"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"<xliff:g id="NUMBER">%d</xliff:g> saniyə sonra yenidən cəhd edin."</string>
+ <string name="kg_pattern_instructions" msgid="398978611683075868">"Şablonunuzu çəkin"</string>
+ <string name="kg_sim_pin_instructions" msgid="2319508550934557331">"SIM PIN kodu daxil edin"</string>
+ <string name="kg_pin_instructions" msgid="2377242233495111557">"PİN kodu daxil edin"</string>
+ <string name="kg_password_instructions" msgid="5753646556186936819">"Parol daxil edin"</string>
+ <string name="kg_puk_enter_puk_hint" msgid="453227143861735537">"SIM indi deaktivdir. Davam etmÉ™k üçün PUK kodu daxil edin. ÆlavÉ™ mÉ™lumat üçün operatora müraciÉ™t edin."</string>
+ <string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"İstədiyiniz PİN kodu daxil edin"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"İstədiyiniz PIN kodu təsdiqləyin"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"SİM kartın kilidi açılır..."</string>
+ <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"Yanlış PİN kod."</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"4-dən 8-ə qədər rəqəmi olan PIN yazın."</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"PUK kod 8 rəqəm və ya daha çox olmalıdır."</string>
+ <string name="kg_invalid_puk" msgid="3638289409676051243">"Düzgün PUK kodu yenidən daxil edin. Təkrarlanan cəhdlər SIM\'i birdəfəlik sıradan çıxaracaq."</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"PIN kodları uyğun deyil"</string>
+ <string name="kg_login_too_many_attempts" msgid="6486842094005698475">"Həddindən çox cəhd edildi!"</string>
+ <string name="kg_login_instructions" msgid="1100551261265506448">"Kilidi açmaq üçün Google hesabınız ilə daxil olun."</string>
+ <string name="kg_login_username_hint" msgid="5718534272070920364">"İstifadəçi adı (e-poçt)"</string>
+ <string name="kg_login_password_hint" msgid="9057289103827298549">"ÅžifrÉ™"</string>
+ <string name="kg_login_submit_button" msgid="5355904582674054702">"Daxil ol"</string>
+ <string name="kg_login_invalid_input" msgid="5754664119319872197">"Yanlış istifadəçi adı və ya parol."</string>
+ <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"İstifadəçi adınızı və ya parolunuzu unutmusunuz?\n "<b>"google.com/accounts/recovery"</b>" linkinə daxil olun."</string>
+ <string name="kg_login_checking_password" msgid="1052685197710252395">"Hesab yoxlanılır..."</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"PIN kodunuzu <xliff:g id="NUMBER_0">%d</xliff:g> dəfə yanlış daxil etdiniz.\n\n <xliff:g id="NUMBER_1">%d</xliff:g> saniyə ərzində yenidən yoxlayın"</string>
+ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"Şifrənizi <xliff:g id="NUMBER_0">%d</xliff:g> dəfə yanlış daxil etdiniz. \n\n <xliff:g id="NUMBER_1">%d</xliff:g> saniyə ərzində yenidən yoxlayın."</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"Modelinizi <xliff:g id="NUMBER_0">%d</xliff:g> dəfə yanlış çəkmisiniz.\n\n <xliff:g id="NUMBER_1">%d</xliff:g> saniyə ərzində yenidən yoxlayın"</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1575557200627128949">"Siz planşet kilidini açmaq üçün <xliff:g id="NUMBER_0">%d</xliff:g> dəfə uğursuz cəhd etmisiniz. <xliff:g id="NUMBER_1">%d</xliff:g> dəfə də uğursuz cəhd etsəniz, planşet fabrik ayarlarına sıfırlanacaq və bütün məlumatlarınız itəcək."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="4051015943038199910">"Siz telefon kilidini açmaq üçün <xliff:g id="NUMBER_0">%d</xliff:g> dəfə uğursuz cəhd etmisiniz. <xliff:g id="NUMBER_1">%d</xliff:g> dəfə də uğursuz cəhd etsəniz, telefon fabrik ayarlarına sıfırlanacaq və bütün məlumatlarınız itəcək."</string>
+ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="2072996269148483637">"Siz planşet kilidini açmaq üçün <xliff:g id="NUMBER">%d</xliff:g> dəfə uğursuz cəhd etmisiniz. Planşet fabrik ayarlarına sıfırlanacaq."</string>
+ <string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"Siz telefonun kilidini açmaq üçün <xliff:g id="NUMBER">%d</xliff:g> yanlış cəhd etmisiniz. Telefon artıq defolt zavod halına sıfırlanacaq."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Siz kilidi açmaq üçün şablonu <xliff:g id="NUMBER_0">%d</xliff:g> dəfə səhv çəkdiniz. <xliff:g id="NUMBER_1">%d</xliff:g> daha uğursuz cəhddən sonra planşetinizin kilidini e-poçt hesabınızla açmaq tələb olunacaq.\n\n <xliff:g id="NUMBER_2">%d</xliff:g> saniyə ərzində bir daha yoxlayın."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Siz artıq modeli <xliff:g id="NUMBER_0">%d</xliff:g> dəfə yanlış daxil etmisiniz.<xliff:g id="NUMBER_1">%d</xliff:g> dəfə də yanlış daxil etsəniz, telefonun kilidinin açılması üçün elektron poçt ünvanınız tələb olunacaq.\n\n <xliff:g id="NUMBER_2">%d</xliff:g> saniyə ərzində yenidən cəhd edin."</string>
+ <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" - "</string>
+ <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Yığışdır"</string>
+ <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"ÆvvÉ™lki izlÉ™mÉ™ düymÉ™si"</string>
+ <string name="keyguard_transport_next_description" msgid="4299258300283778305">"Növbəti izləmə düyməsi"</string>
+ <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Pauza düyməsi"</string>
+ <string name="keyguard_transport_play_description" msgid="2924628863741150956">"Oxutma düyməsi"</string>
+ <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"Dayandırma düyməsi"</string>
+ <string name="keyguard_carrier_default" msgid="8700650403054042153">"Xidmət yoxdur."</string>
+</resources>
diff --git a/packages/Keyguard/res/values-be/strings.xml b/packages/Keyguard/res/values-be/strings.xml
index 81020a0..e1794e0 100644
--- a/packages/Keyguard/res/values-be/strings.xml
+++ b/packages/Keyguard/res/values-be/strings.xml
@@ -21,9 +21,12 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"УвÑдзіце PIN-код"</string>
- <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"УвÑдзіце PUK-код Ñ– новы PIN-код"</string>
- <string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"PUK"</string>
- <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"Ðовы PIN-код"</string>
+ <!-- no translation found for keyguard_password_enter_puk_code (3035856550289724338) -->
+ <skip />
+ <!-- no translation found for keyguard_password_enter_puk_prompt (1801941051094974609) -->
+ <skip />
+ <!-- no translation found for keyguard_password_enter_pin_prompt (3201151840570492538) -->
+ <skip />
<string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"ДакраніцеÑÑ, каб увеÑці пароль"</font></string>
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"УвÑдзіце пароль Ð´Ð»Ñ Ñ€Ð°Ð·Ð±Ð»Ð°ÐºÐ°Ð²Ð°Ð½Ð½Ñ"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Каб разблакаваць, увÑдзіце PIN-код"</string>
@@ -71,6 +74,20 @@
<string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Кнопка паўзы"</string>
<string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Кнопка прайграваннÑ"</string>
<string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Кнопка ÑпыненнÑ"</string>
+ <!-- no translation found for keyguard_accessibility_transport_thumbs_up_description (4535938129663903194) -->
+ <skip />
+ <!-- no translation found for keyguard_accessibility_transport_thumbs_down_description (8101433677192177861) -->
+ <skip />
+ <!-- no translation found for keyguard_accessibility_transport_heart_description (2336943232474689887) -->
+ <skip />
+ <!-- no translation found for keyguard_accessibility_show_bouncer (5425837272418176176) -->
+ <skip />
+ <!-- no translation found for keyguard_accessibility_hide_bouncer (7896992171878309358) -->
+ <skip />
+ <!-- no translation found for keyguard_accessibility_delete_widget_start (4096550552634391451) -->
+ <skip />
+ <!-- no translation found for keyguard_accessibility_delete_widget_end (508833506780909393) -->
+ <skip />
<string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"123"</string>
<string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
<string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"Alt"</string>
@@ -105,7 +122,6 @@
<string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"УвÑдзіце жаданы PIN-код"</string>
<string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"Пацвердзіце жадан PIN-код"</string>
<string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"Разблакiроўка SIM-карты..."</string>
- <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"ÐÑправільны PIN-код."</string>
<string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"УвÑдзіце PIN-код, Ñкі змÑшчае ад 4 да 8 лічбаў."</string>
<string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"PUK-код павінен утрымлiваць 8 лiчбаў і больш."</string>
<string name="kg_invalid_puk" msgid="3638289409676051243">"Паўторна увÑдзіце правільны PUK-код. ÐÐµÐ°Ð´Ð½Ð°Ñ€Ð°Ð·Ð¾Ð²Ñ‹Ñ Ñпробы назаўжды адключаць SIM-карту."</string>
@@ -129,6 +145,20 @@
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Ð’Ñ‹ нÑправільна ўвÑлі графічны ключ разблакiроўкi пÑўную колькаÑць разоў: <xliff:g id="NUMBER_0">%d</xliff:g>. ПаÑÐ»Ñ ÑÑˆÑ‡Ñ Ð½ÐµÐºÐ°Ð»ÑŒÐºiÑ… нÑўдалых Ñпроб (<xliff:g id="NUMBER_1">%d</xliff:g>) вам будзе прапанавана разблакiраваць Ñ‚Ñлефон, увайшоўшы Ñž Google.\n\n Паўтарыце Ñпробу праз <xliff:g id="NUMBER_2">%d</xliff:g> Ñ."</string>
<string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
<string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Выдалiць"</string>
+ <!-- no translation found for kg_password_wrong_pin_code_pukked (30531039455764924) -->
+ <skip />
+ <!-- no translation found for kg_password_wrong_pin_code:one (8134313997799638254) -->
+ <!-- no translation found for kg_password_wrong_pin_code:other (2215723361575359486) -->
+ <!-- no translation found for kg_password_wrong_puk_code_dead (7077536808291316208) -->
+ <skip />
+ <!-- no translation found for kg_password_wrong_puk_code:one (3256893607561060649) -->
+ <!-- no translation found for kg_password_wrong_puk_code:other (5477305226026342036) -->
+ <!-- no translation found for kg_password_pin_failed (6268288093558031564) -->
+ <skip />
+ <!-- no translation found for kg_password_puk_failed (2838824369502455984) -->
+ <skip />
+ <!-- no translation found for kg_pin_accepted (1448241673570020097) -->
+ <skip />
<string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Кнопка папÑÑ€ÑднÑй кампазiцыі"</string>
<string name="keyguard_transport_next_description" msgid="4299258300283778305">"Кнопка наÑтупнай кампазiцыі"</string>
<string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Кнопка паўзы"</string>
diff --git a/packages/Keyguard/res/values-bg/strings.xml b/packages/Keyguard/res/values-bg/strings.xml
index 869ab7b..641adbd 100644
--- a/packages/Keyguard/res/values-bg/strings.xml
+++ b/packages/Keyguard/res/values-bg/strings.xml
@@ -21,9 +21,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"Въведете ПИРкода"</string>
- <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"Въведете PUK и Ð½Ð¾Ð²Ð¸Ñ ÐŸÐ˜Ð ÐºÐ¾Ð´"</string>
- <string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"PUK код"</string>
- <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"Ðов ПИРкод"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="3035856550289724338">"Въведете PUK за SIM картата и Ð½Ð¾Ð²Ð¸Ñ ÐŸÐ˜Ð ÐºÐ¾Ð´"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="1801941051094974609">"PUK код за SIM картата"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="3201151840570492538">"Ðов ПИРкод за SIM картата"</string>
<string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"ДокоÑнете и въведете парола"</font></string>
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Въведете парола, за да отключите"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Въведете ПИÐ, за да отключите"</string>
@@ -71,6 +71,13 @@
<string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Бутон за пауза"</string>
<string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Бутон за пуÑкане"</string>
<string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Бутон за Ñпиране"</string>
+ <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"ХареÑва ми"</string>
+ <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Ðе ми хареÑва"</string>
+ <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Сърце"</string>
+ <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Отключете, за да продължите"</string>
+ <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Стартирането е анулирано"</string>
+ <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"ПуÑнете <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>, за да изтриете."</string>
+ <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> нÑма да Ñе изтрие."</string>
<string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
<string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ÐБВ"</string>
<string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
@@ -105,7 +112,6 @@
<string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"Въведете Ð¶ÐµÐ»Ð°Ð½Ð¸Ñ ÐŸÐ˜Ð ÐºÐ¾Ð´"</string>
<string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"Потвърдете Ð¶ÐµÐ»Ð°Ð½Ð¸Ñ ÐŸÐ˜Ð ÐºÐ¾Ð´"</string>
<string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"SIM картата Ñе отключва…"</string>
- <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"Ðеправилен ПИРкод."</string>
<string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"Въведете ПИРкод Ñ Ñ‡ÐµÑ‚Ð¸Ñ€Ð¸ до оÑем цифри."</string>
<string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"PUK кодът трÑбва да е Ñ 8 или повече цифри."</string>
<string name="kg_invalid_puk" msgid="3638289409676051243">"Въведете отново Ð¿Ñ€Ð°Ð²Ð¸Ð»Ð½Ð¸Ñ PUK код. Многократните опити ще деактивират за поÑтоÑнно SIM картата."</string>
@@ -129,6 +135,19 @@
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Ðачертахте неправилно фигурата Ñи за отключване <xliff:g id="NUMBER_0">%d</xliff:g> пъти. След още <xliff:g id="NUMBER_1">%d</xliff:g> неуÑпешни опита ще бъдете помолени да отключите телефона поÑредÑтвом имейл адреÑ.\n\n Опитайте отново Ñлед <xliff:g id="NUMBER_2">%d</xliff:g> Ñекунди."</string>
<string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" – "</string>
<string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Премахване"</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"Ðеправилен ПИРкод за SIM картата – Ñега трÑбва да Ñе Ñвържете Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° Ñи, за да отключите уÑтройÑтвото."</string>
+ <plurals name="kg_password_wrong_pin_code">
+ <item quantity="one" msgid="8134313997799638254">"Ðеправилен ПИРкод за SIM картата – оÑтава ви <xliff:g id="NUMBER">%d</xliff:g> опит, преди да трÑбва да Ñе Ñвържете Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° Ñи, за да отключите уÑтройÑтвото."</item>
+ <item quantity="other" msgid="2215723361575359486">"Ðеправилен ПИРкод за SIM картата – оÑтават ви <xliff:g id="NUMBER">%d</xliff:g> опита."</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="7077536808291316208">"SIM картата е неизползваема. Свържете Ñе Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° Ñи."</string>
+ <plurals name="kg_password_wrong_puk_code">
+ <item quantity="one" msgid="3256893607561060649">"Ðеправилен PUK код за SIM картата – оÑтава ви <xliff:g id="NUMBER">%d</xliff:g> опит, преди SIM картата да Ñтане неизползваема завинаги."</item>
+ <item quantity="other" msgid="5477305226026342036">"Ðеправилен PUK код за SIM картата – оÑтават ви <xliff:g id="NUMBER">%d</xliff:g> опита, преди SIM картата да Ñтане неизползваема завинаги."</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="6268288093558031564">"ОперациÑта Ñ ÐŸÐ˜Ð ÐºÐ¾Ð´Ð° за SIM картата не бе уÑпешна!"</string>
+ <string name="kg_password_puk_failed" msgid="2838824369502455984">"ОперациÑта Ñ PUK кода за SIM картата не бе уÑпешна!"</string>
+ <string name="kg_pin_accepted" msgid="1448241673570020097">"Кодът е приет!"</string>
<string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Бутон за Ð¿Ñ€ÐµÐ´Ð¸ÑˆÐ½Ð¸Ñ Ð·Ð°Ð¿Ð¸Ñ"</string>
<string name="keyguard_transport_next_description" msgid="4299258300283778305">"Бутон за ÑÐ»ÐµÐ´Ð²Ð°Ñ‰Ð¸Ñ Ð·Ð°Ð¿Ð¸Ñ"</string>
<string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Бутон за пауза"</string>
diff --git a/packages/Keyguard/res/values-ca/strings.xml b/packages/Keyguard/res/values-ca/strings.xml
index 4f97c6b..8b81086 100644
--- a/packages/Keyguard/res/values-ca/strings.xml
+++ b/packages/Keyguard/res/values-ca/strings.xml
@@ -21,9 +21,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"Introdueix el codi PIN"</string>
- <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"Introdueix el codi PUK i el codi PIN nou"</string>
- <string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"Codi PUK"</string>
- <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"Codi PIN nou"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="3035856550289724338">"Escriu el PUK de la SIM i el codi PIN nou."</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="1801941051094974609">"Codi PUK de la SIM"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="3201151840570492538">"Codi PIN de la SIM nou"</string>
<string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"Toca per introduir contrasenya"</font></string>
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Introdueix la contrasenya per desbloquejar"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Introdueix la contrasenya per desbloquejar"</string>
@@ -71,6 +71,13 @@
<string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Botó de pausa"</string>
<string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Botó de reproducció"</string>
<string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Botó de parada"</string>
+ <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"M\'agrada"</string>
+ <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"No m\'agrada"</string>
+ <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Cor"</string>
+ <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Desbloqueja per continuar"</string>
+ <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"S\'ha cancel·lat l\'inici"</string>
+ <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Deixa anar <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> per suprimir-lo."</string>
+ <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"No se suprimirà <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>."</string>
<string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
<string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
<string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
@@ -105,7 +112,6 @@
<string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"Introdueix el codi PIN"</string>
<string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"Confirma el codi PIN"</string>
<string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"S\'està desbloquejant la targeta SIM..."</string>
- <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"Codi PIN incorrecte."</string>
<string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"Escriu un PIN que tingui de 4 a 8 números."</string>
<string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"El codi PUK ha de tenir 8 números o més."</string>
<string name="kg_invalid_puk" msgid="3638289409676051243">"Torna a introduir el codi PUK correcte. Els intents repetits faran que es desactivi la SIM de manera permanent."</string>
@@ -129,6 +135,19 @@
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Has dibuixat el patró de desbloqueig <xliff:g id="NUMBER_0">%d</xliff:g> vegades de manera incorrecta. Després de <xliff:g id="NUMBER_1">%d</xliff:g> intents incorrectes més, se\'t demanarà que desbloquegis el telèfon amb un compte de correu electrònic.\n\n Torna-ho a provar d\'aquí a <xliff:g id="NUMBER_2">%d</xliff:g> segons."</string>
<string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
<string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Elimina"</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"El codi PIN de la SIM no és correcte. Has de contactar amb l\'operador de telefonia mòbil per desbloquejar el dispositiu."</string>
+ <plurals name="kg_password_wrong_pin_code">
+ <item quantity="one" msgid="8134313997799638254">"El codi PIN de la SIM no és correcte. Et queda <xliff:g id="NUMBER">%d</xliff:g> intent; si no l\'encertes, contacta amb l\'operador de telefonia mòbil per desbloquejar el dispositiu."</item>
+ <item quantity="other" msgid="2215723361575359486">"El codi PIN de la SIM no és correcte. Et queden <xliff:g id="NUMBER">%d</xliff:g> intents."</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="7077536808291316208">"La SIM no es pot utilitzar. Contacta amb l\'operador de telefonia mòbil."</string>
+ <plurals name="kg_password_wrong_puk_code">
+ <item quantity="one" msgid="3256893607561060649">"El codi PUK de la SIM no és correcte. Et queda <xliff:g id="NUMBER">%d</xliff:g> intent; si no l\'encertes, la SIM no es podrà tornar a fer servir."</item>
+ <item quantity="other" msgid="5477305226026342036">"El codi PUK de la SIM no és correcte. Et queden <xliff:g id="NUMBER">%d</xliff:g> intents; si no l\'encertes, la SIM no es podrà tornar a fer servir."</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="6268288093558031564">"Hi ha hagut un problema en l\'operació del PIN de la SIM."</string>
+ <string name="kg_password_puk_failed" msgid="2838824369502455984">"Hi ha hagut un problema en l\'operació del PUK de la SIM."</string>
+ <string name="kg_pin_accepted" msgid="1448241673570020097">"S\'ha acceptat el codi."</string>
<string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Botó de pista anterior"</string>
<string name="keyguard_transport_next_description" msgid="4299258300283778305">"Botó de pista següent"</string>
<string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Botó de pausa"</string>
diff --git a/packages/Keyguard/res/values-cs/strings.xml b/packages/Keyguard/res/values-cs/strings.xml
index ec2833c..e4ed02a 100644
--- a/packages/Keyguard/res/values-cs/strings.xml
+++ b/packages/Keyguard/res/values-cs/strings.xml
@@ -21,9 +21,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"Zadejte kód PIN"</string>
- <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"Zadejte kód PUK a nový kód PIN."</string>
- <string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"Kód PUK"</string>
- <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"Nový kód PIN"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="3035856550289724338">"Zadejte kód PUK SIM karty a nový kód PIN."</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="1801941051094974609">"Kód PUK SIM karty"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="3201151840570492538">"Nový kód PIN SIM karty"</string>
<string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"Dotykem zadáte heslo"</font></string>
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Zadejte heslo pro odemknutí"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Zadejte kód PIN pro odemknutí"</string>
@@ -71,6 +71,13 @@
<string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"TlaÄítko Pozastavit"</string>
<string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"TlaÄítko PÅ™ehrát"</string>
<string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"TlaÄítko Zastavit"</string>
+ <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Líbí se mi"</string>
+ <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Nelíbí se mi"</string>
+ <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"SrdíÄko"</string>
+ <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"PokraÄujte odemknutím"</string>
+ <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Spuštění zrušeno"</string>
+ <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Uvolněním dotyku widget <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> vymažete."</string>
+ <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"Widget <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> nebude vymazán."</string>
<string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
<string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
<string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"Alt"</string>
@@ -105,7 +112,6 @@
<string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"Zadejte požadovaný kód PIN."</string>
<string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"PotvrÄte požadovaný kód PIN."</string>
<string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"Odblokování SIM karty..."</string>
- <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"Nesprávný kód PIN."</string>
<string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"Zadejte kód PIN o délce 4–8 Äíslic."</string>
<string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"Minimální délka kódu PUK je 8 Äíslic."</string>
<string name="kg_invalid_puk" msgid="3638289409676051243">"Znovu zadejte správný kód PUK. Opakovanými pokusy SIM kartu trvale deaktivujete."</string>
@@ -129,6 +135,19 @@
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Již <xliff:g id="NUMBER_0">%d</xliff:g>krát jste nesprávnÄ› nakreslili své heslo odemknutí. Po <xliff:g id="NUMBER_1">%d</xliff:g> dalších neúspěšných pokusech budete požádáni o odemÄení telefonu pomocí e-mailového úÄtu.\n\n Zkuste to znovu za <xliff:g id="NUMBER_2">%d</xliff:g> s."</string>
<string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" – "</string>
<string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Odebrat"</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"Zadali jste nesprávný kód PIN SIM karty. Nyní musíte za úÄelem odemknutí zařízení kontaktovat svého operátora."</string>
+ <plurals name="kg_password_wrong_pin_code">
+ <item quantity="one" msgid="8134313997799638254">"Zadali jste nesprávný kód PIN SIM karty. Máte ještě <xliff:g id="NUMBER">%d</xliff:g> pokus, poté budete muset o odemknutí zařízení požádat svého operátora."</item>
+ <item quantity="other" msgid="2215723361575359486">"Zadali jste nesprávný kód PIN SIM karty. PoÄet zbývajících pokusů: <xliff:g id="NUMBER">%d</xliff:g>."</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="7077536808291316208">"SIM kartu nelze použít. Kontaktujte operátora."</string>
+ <plurals name="kg_password_wrong_puk_code">
+ <item quantity="one" msgid="3256893607561060649">"Nesprávný kód PUK SIM karty. Máte ještě <xliff:g id="NUMBER">%d</xliff:g> pokus, poté bude SIM karta natrvalo zablokována."</item>
+ <item quantity="other" msgid="5477305226026342036">"Zadali jste nesprávný kód PUK SIM karty. PoÄet zbývajících pokusů, po kterých bude SIM karta natrvalo zablokována: <xliff:g id="NUMBER">%d</xliff:g>."</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="6268288093558031564">"Operace pomocí kódu PIN SIM karty se nezdařila!"</string>
+ <string name="kg_password_puk_failed" msgid="2838824369502455984">"Operace pomocí kódu PUK SIM karty se nezdařila!"</string>
+ <string name="kg_pin_accepted" msgid="1448241673570020097">"Kód byl přijat."</string>
<string name="keyguard_transport_prev_description" msgid="8229108430245669854">"TlaÄítko PÅ™edchozí stopa"</string>
<string name="keyguard_transport_next_description" msgid="4299258300283778305">"TlaÄítko Další stopa"</string>
<string name="keyguard_transport_pause_description" msgid="5093073338238310224">"TlaÄítko Pozastavit"</string>
diff --git a/packages/Keyguard/res/values-da/strings.xml b/packages/Keyguard/res/values-da/strings.xml
index cfc7464..f8f0a6f 100644
--- a/packages/Keyguard/res/values-da/strings.xml
+++ b/packages/Keyguard/res/values-da/strings.xml
@@ -21,9 +21,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"Indtast pinkode"</string>
- <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"Indtast PUK- og pinkode"</string>
- <string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"PUK-kode"</string>
- <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"Ny pinkode"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="3035856550289724338">"Indtast PUK-koden til SIM-kortet og den nye pinkode"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="1801941051094974609">"PUK-kode til SIM-kort"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="3201151840570492538">"Ny pinkode til SIM-kortet"</string>
<string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"Tryk for at angive adgangskode"</font></string>
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Indtast adgangskoden for at låse op"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Indtast pinkode for at låse op"</string>
@@ -71,6 +71,13 @@
<string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Pause-knap"</string>
<string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Afspil-knap"</string>
<string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Stop-knap"</string>
+ <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Synes om"</string>
+ <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Synes ikke om"</string>
+ <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Hjerte"</string>
+ <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Lås op for at gå videre"</string>
+ <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Starten blev annulleret"</string>
+ <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Slip <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> for at slette."</string>
+ <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> slettes ikke."</string>
<string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
<string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
<string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
@@ -105,7 +112,6 @@
<string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"Indtast den ønskede pinkode"</string>
<string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"Bekræft den ønskede pinkode"</string>
<string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"SIM-kortet låses op…"</string>
- <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"Forkert pinkode."</string>
<string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"Indtast en pinkode på mellem 4 og 8 tal."</string>
<string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"PUK-koden skal være på 8 tal eller mere."</string>
<string name="kg_invalid_puk" msgid="3638289409676051243">"Indtast den korrekte PUK-kode. Gentagne forsøg vil permanent deaktivere SIM-kortet."</string>
@@ -129,6 +135,19 @@
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Du har tegnet dit oplåsningsmønster forkert <xliff:g id="NUMBER_0">%d</xliff:g> gange. Efter <xliff:g id="NUMBER_1">%d</xliff:g> yderligere mislykkede forsøg til vil du blive bedt om at låse din telefon op ved hjælp af en e-mailkonto.\n\n Prøv igen om <xliff:g id="NUMBER_2">%d</xliff:g> sekunder."</string>
<string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" – "</string>
<string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Fjern"</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"Forkert pinkode til SIM-kort. Du skal nu kontakte dit mobilselskab for at låse din enhed op."</string>
+ <plurals name="kg_password_wrong_pin_code">
+ <item quantity="one" msgid="8134313997799638254">"Forkert pinkode til SIM-kort. Du har <xliff:g id="NUMBER">%d</xliff:g> forsøg tilbage, før du skal kontakte dit mobilselskab for at låse din enhed op."</item>
+ <item quantity="other" msgid="2215723361575359486">"Forkert pinkode til SIM-kort. Du har <xliff:g id="NUMBER">%d</xliff:g> forsøg tilbage."</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="7077536808291316208">"SIM-kortet er ubrugeligt. Kontakt dit mobilselskab."</string>
+ <plurals name="kg_password_wrong_puk_code">
+ <item quantity="one" msgid="3256893607561060649">"Forkert PUK-kode til SIM-kort. Du har <xliff:g id="NUMBER">%d</xliff:g> forsøg tilbage, før SIM-kortet bliver permanent ubrugeligt."</item>
+ <item quantity="other" msgid="5477305226026342036">"Forkert PUK-kode til SIM-kort. Du har <xliff:g id="NUMBER">%d</xliff:g> forsøg tilbage, før dit SIM-kort bliver permanent ubrugeligt."</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="6268288093558031564">"Pinkoden til SIM-kortet blev afvist."</string>
+ <string name="kg_password_puk_failed" msgid="2838824369502455984">"PUK-koden til SIM-kortet blev afvist."</string>
+ <string name="kg_pin_accepted" msgid="1448241673570020097">"Koden blev accepteret."</string>
<string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Knap til forrige nummer"</string>
<string name="keyguard_transport_next_description" msgid="4299258300283778305">"Knap til næste nummer"</string>
<string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Pause-knap"</string>
diff --git a/packages/Keyguard/res/values-de/strings.xml b/packages/Keyguard/res/values-de/strings.xml
index 85d1a4f9..4ece6d9 100644
--- a/packages/Keyguard/res/values-de/strings.xml
+++ b/packages/Keyguard/res/values-de/strings.xml
@@ -21,9 +21,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"PIN-Code eingeben"</string>
- <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"PUK und neuen PIN-Code eingeben"</string>
- <string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"PUK-Code"</string>
- <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"Neuer PIN-Code"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="3035856550289724338">"Geben Sie den PUK-Code der SIM-Karte und den neuen PIN-Code ein."</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="1801941051094974609">"PUK-Code der SIM-Karte"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="3201151840570492538">"Neuer PIN-Code der SIM-Karte"</string>
<string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"Zur Passworteingabe berühren"</font></string>
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Passwort zum Entsperren eingeben"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"PIN zum Entsperren eingeben"</string>
@@ -71,6 +71,13 @@
<string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Schaltfläche für Pause"</string>
<string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Schaltfläche für Wiedergabe"</string>
<string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Schaltfläche für Stopp"</string>
+ <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Mag ich"</string>
+ <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Mag ich nicht"</string>
+ <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Herz"</string>
+ <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Zum Fortfahren entsperren"</string>
+ <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Start abgebrochen"</string>
+ <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Legen Sie <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> zum Löschen ab."</string>
+ <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> wird nicht gelöscht."</string>
<string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
<string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
<string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
@@ -105,7 +112,6 @@
<string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"Gewünschten PIN-Code eingeben"</string>
<string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"Gewünschten PIN-Code bestätigen"</string>
<string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"SIM-Karte wird entsperrt…"</string>
- <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"Falscher PIN-Code"</string>
<string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"Geben Sie eine 4- bis 8-stellige PIN ein."</string>
<string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"Der PUK-Code muss mindestens 8 Ziffern betragen."</string>
<string name="kg_invalid_puk" msgid="3638289409676051243">"Geben Sie den richtigen PUK-Code ein. Bei wiederholten Versuchen wird die SIM-Karte dauerhaft deaktiviert."</string>
@@ -129,6 +135,19 @@
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Sie haben Ihr Entsperrungsmuster <xliff:g id="NUMBER_0">%d</xliff:g>-mal falsch gezeichnet. Nach <xliff:g id="NUMBER_1">%d</xliff:g> weiteren erfolglosen Versuchen werden Sie aufgefordert, Ihr Telefon mithilfe eines E-Mail-Kontos zu entsperren.\n\n Versuchen Sie es in <xliff:g id="NUMBER_2">%d</xliff:g> Sekunden erneut."</string>
<string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" – "</string>
<string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Entfernen"</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"Falscher PIN-Code der SIM-Karte. Bitte wenden Sie sich an Ihren Mobilfunkanbieter, damit er Ihr Gerät entsperrt."</string>
+ <plurals name="kg_password_wrong_pin_code">
+ <item quantity="one" msgid="8134313997799638254">"Falscher PIN-Code der SIM-Karte. Sie haben noch <xliff:g id="NUMBER">%d</xliff:g> Versuch, bevor Sie das Gerät von Ihrem Mobilfunkanbieter entsperren lassen müssen."</item>
+ <item quantity="other" msgid="2215723361575359486">"Falscher PIN-Code der SIM-Karte. Sie haben noch <xliff:g id="NUMBER">%d</xliff:g> Versuche."</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="7077536808291316208">"Die SIM-Karte kann nicht verwendet werden. Bitte wenden Sie sich an Ihren Mobilfunkanbieter."</string>
+ <plurals name="kg_password_wrong_puk_code">
+ <item quantity="one" msgid="3256893607561060649">"Falscher PUK-Code der SIM-Karte. Sie haben noch <xliff:g id="NUMBER">%d</xliff:g> Versuch, bevor Ihre SIM-Karte endgültig gesperrt wird."</item>
+ <item quantity="other" msgid="5477305226026342036">"Falscher PUK-Code der SIM-Karte. Sie haben noch <xliff:g id="NUMBER">%d</xliff:g> Versuche, bevor Ihre SIM-Karte endgültig gesperrt wird."</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="6268288093558031564">"Fehler beim Entsperren mit der PIN der SIM-Karte"</string>
+ <string name="kg_password_puk_failed" msgid="2838824369502455984">"Fehler beim Entsperren mithilfe des PUK-Codes der SIM-Karte"</string>
+ <string name="kg_pin_accepted" msgid="1448241673570020097">"Code akzeptiert"</string>
<string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Schaltfläche für vorherigen Titel"</string>
<string name="keyguard_transport_next_description" msgid="4299258300283778305">"Schaltfläche für nächsten Titel"</string>
<string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Schaltfläche für Pause"</string>
diff --git a/packages/Keyguard/res/values-el/strings.xml b/packages/Keyguard/res/values-el/strings.xml
index e86f24d..be07dcd 100644
--- a/packages/Keyguard/res/values-el/strings.xml
+++ b/packages/Keyguard/res/values-el/strings.xml
@@ -21,9 +21,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"ΠληκτÏολογήστε τον κωδικό αÏιθμό PIN"</string>
- <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"ΠληκτÏολογήστε τον κωδικό PUK και τον νέο κωδικό PIN"</string>
- <string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"Κωδικός PUK"</string>
- <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"Îέος κωδικός PIN"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="3035856550289724338">"ΠληκτÏολογήστε τον κωδικό PUK της κάÏτας SIM και τον νέο κωδικό PIN"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="1801941051094974609">"Κωδικός PUK κάÏτας SIM"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="3201151840570492538">"Îέος κώδικας αÏÎ¹Î¸Î¼Î¿Ï PIN της κάÏτας SIM"</string>
<string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"Αγγίξτε για εισαγ. κωδ. Ï€Ïόσβ."</font></string>
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"ΠληκτÏολογήστε τον κωδικό Ï€Ïόσβασης για ξεκλείδωμα"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"ΠληκτÏολογήστε τον αÏιθμό PIN για ξεκλείδωμα"</string>
@@ -71,6 +71,13 @@
<string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Κουμπί παÏσης"</string>
<string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Κουμπί αναπαÏαγωγής"</string>
<string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Κουμπί διακοπής"</string>
+ <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Επιδοκιμασία"</string>
+ <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Αποδοκιμασία"</string>
+ <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"ΚαÏδιά"</string>
+ <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Ξεκλειδώστε για να συνεχίσετε"</string>
+ <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Η εκκίνηση ακυÏώθηκε"</string>
+ <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Αποθέστε <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> για διαγÏαφή."</string>
+ <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> δεν θα διαγÏαφεί."</string>
<string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
<string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ΑΒΓ"</string>
<string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
@@ -105,7 +112,6 @@
<string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"Εισαγάγετε τον απαιτοÏμενο κωδικό PIN"</string>
<string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"Επιβεβαιώστε τον απαιτοÏμενο κωδικό PIN"</string>
<string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"Ξεκλείδωμα κάÏτας SIM..."</string>
- <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"Εσφαλμένος κωδικός PIN."</string>
<string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"ΠληκτÏολογήστε έναν αÏιθμό PIN που να αποτελείται από 4 έως 8 αÏιθμοÏÏ‚."</string>
<string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"Ο κωδικός PUK θα Ï€Ïέπει να πεÏιέχει τουλάχιστον 8 αÏιθμοÏÏ‚."</string>
<string name="kg_invalid_puk" msgid="3638289409676051243">"Εισαγάγετε ξανά τον κωδικό PUK. Οι επαναλαμβανόμενες Ï€Ïοσπάθειες θα απενεÏγοποιήσουν οÏιστικά την κάÏτα SIM."</string>
@@ -129,6 +135,19 @@
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Σχεδιάσατε το μοτίβο ξεκλειδώματος εσφαλμένα <xliff:g id="NUMBER_0">%d</xliff:g> φοÏές. Μετά από <xliff:g id="NUMBER_1">%d</xliff:g> ανεπιτυχείς Ï€Ïοσπάθειες ακόμη, θα σας ζητηθεί να ξεκλειδώσετε το τηλέφωνό σας με τη χÏήση ενός λογαÏÎ¹Î±ÏƒÎ¼Î¿Ï Î·Î»ÎµÎºÏ„ÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου.\n\n Δοκιμάστε ξανά σε <xliff:g id="NUMBER_2">%d</xliff:g> δευτεÏόλεπτα."</string>
<string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
<string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"ΚατάÏγηση"</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"Εσφαλμένος κωδικός PIN κάÏτας SIM. Θα Ï€Ïέπει να επικοινωνήσετε με τον πάÏοχο κινητής τηλεφωνίας σας για να ξεκλειδώσετε τη συσκευή σας."</string>
+ <plurals name="kg_password_wrong_pin_code">
+ <item quantity="one" msgid="8134313997799638254">"Εσφαλμένος κωδικός PIN κάÏτας SIM. Απομένει άλλη <xliff:g id="NUMBER">%d</xliff:g> Ï€Ïοσπάθεια. Στη συνέχεια, θα Ï€Ïέπει να επικοινωνήσετε με τον πάÏοχο κινητής τηλεφωνίας σας για να ξεκλειδώσετε τη συσκευή σας."</item>
+ <item quantity="other" msgid="2215723361575359486">"Εσφαλμένος κωδικός PIN κάÏτας SIM. Απομένουν <xliff:g id="NUMBER">%d</xliff:g> Ï€Ïοσπάθειες."</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="7077536808291316208">"Η κάÏτα SIM δεν μποÏεί να χÏησιμοποιηθεί. Επικοινωνήστε με τον πάÏοχο κινητής τηλεφωνίας σας."</string>
+ <plurals name="kg_password_wrong_puk_code">
+ <item quantity="one" msgid="3256893607561060649">"Εσφαλμένος κωδικός PUK κάÏτας SIM. Απομένει άλλη <xliff:g id="NUMBER">%d</xliff:g> Ï€Ïοσπάθεια Ï€ÏÎ¿Ï„Î¿Ï Î´ÎµÎ½ είναι πλέον δυνατή η χÏήση της κάÏτας SIM."</item>
+ <item quantity="other" msgid="5477305226026342036">"Εσφαλμένος κωδικός PUK κάÏτας SIM. Απομένουν <xliff:g id="NUMBER">%d</xliff:g> Ï€Ïοσπάθειες Ï€ÏÎ¿Ï„Î¿Ï Î´ÎµÎ½ είναι πλέον δυνατή η χÏήση της κάÏτας SIM."</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="6268288093558031564">"Αποτυχία λειτουÏγίας ÎºÏ‰Î´Î¹ÎºÎ¿Ï PIN κάÏτας SIM!"</string>
+ <string name="kg_password_puk_failed" msgid="2838824369502455984">"Αποτυχία λειτουÏγίας ÎºÏ‰Î´Î¹ÎºÎ¿Ï PUK κάÏτας SIM!"</string>
+ <string name="kg_pin_accepted" msgid="1448241673570020097">"Αποδεκτός κωδικός!"</string>
<string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Κουμπί Ï€ÏοηγοÏμενου κομματιοÏ"</string>
<string name="keyguard_transport_next_description" msgid="4299258300283778305">"Κουμπί επόμενου κομματιοÏ"</string>
<string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Κουμπί παÏσης"</string>
diff --git a/packages/Keyguard/res/values-en-rGB/strings.xml b/packages/Keyguard/res/values-en-rGB/strings.xml
index 967c3fa..f0d81b8 100644
--- a/packages/Keyguard/res/values-en-rGB/strings.xml
+++ b/packages/Keyguard/res/values-en-rGB/strings.xml
@@ -21,9 +21,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"Type PIN code"</string>
- <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"Type PUK and new PIN code"</string>
- <string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"PUK code"</string>
- <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"New PIN Code"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="3035856550289724338">"Type SIM PUK and new PIN code"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="1801941051094974609">"SIM PUK code"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="3201151840570492538">"New SIM PIN code"</string>
<string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"Touch to type password"</font></string>
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Type password to unlock"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Type PIN to unlock"</string>
@@ -71,6 +71,13 @@
<string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Pause button"</string>
<string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Play button"</string>
<string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Stop button"</string>
+ <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Thumbs up"</string>
+ <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Thumbs down"</string>
+ <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Heart"</string>
+ <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Unlock to continue"</string>
+ <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Launch cancelled"</string>
+ <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Drop <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> to delete."</string>
+ <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> will not be deleted."</string>
<string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
<string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
<string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
@@ -105,7 +112,6 @@
<string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"Enter desired PIN code"</string>
<string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"Confirm desired PIN code"</string>
<string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"Unlocking SIM card…"</string>
- <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"Incorrect PIN code."</string>
<string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"Type a PIN that is 4 to 8 numbers."</string>
<string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"PUK code should be 8 numbers or more."</string>
<string name="kg_invalid_puk" msgid="3638289409676051243">"Re-enter the correct PUK code. Repeated attempts will permanently disable the SIM."</string>
@@ -129,6 +135,19 @@
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"You have incorrectly drawn your unlock pattern <xliff:g id="NUMBER_0">%d</xliff:g> times. After <xliff:g id="NUMBER_1">%d</xliff:g> more unsuccessful attempts, you will be asked to unlock your phone using an email account.\n\n Try again in <xliff:g id="NUMBER_2">%d</xliff:g> seconds."</string>
<string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
<string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Remove"</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"Incorrect SIM PIN code; you must now contact your operator to unlock your device."</string>
+ <plurals name="kg_password_wrong_pin_code">
+ <item quantity="one" msgid="8134313997799638254">"Incorrect SIM PIN code; you have <xliff:g id="NUMBER">%d</xliff:g> remaining attempt/s before you must contact your carrier to unlock your device."</item>
+ <item quantity="other" msgid="2215723361575359486">"Incorrect SIM PIN code; you have <xliff:g id="NUMBER">%d</xliff:g> remaining attempt/s."</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="7077536808291316208">"SIM is unusable. Contact your operator."</string>
+ <plurals name="kg_password_wrong_puk_code">
+ <item quantity="one" msgid="3256893607561060649">"Incorrect SIM PUK code; you have <xliff:g id="NUMBER">%d</xliff:g> remaining attempt/s before SIM becomes permanently unusable."</item>
+ <item quantity="other" msgid="5477305226026342036">"Incorrect SIM PUK code; you have <xliff:g id="NUMBER">%d</xliff:g> remaining attempt/s before SIM becomes permanently unusable."</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="6268288093558031564">"SIM PIN operation failed!"</string>
+ <string name="kg_password_puk_failed" msgid="2838824369502455984">"SIM PUK operation failed!"</string>
+ <string name="kg_pin_accepted" msgid="1448241673570020097">"Code accepted"</string>
<string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Previous track button"</string>
<string name="keyguard_transport_next_description" msgid="4299258300283778305">"Next track button"</string>
<string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Pause button"</string>
diff --git a/packages/Keyguard/res/values-en-rIN/strings.xml b/packages/Keyguard/res/values-en-rIN/strings.xml
new file mode 100644
index 0000000..f0d81b8
--- /dev/null
+++ b/packages/Keyguard/res/values-en-rIN/strings.xml
@@ -0,0 +1,157 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"Type PIN code"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="3035856550289724338">"Type SIM PUK and new PIN code"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="1801941051094974609">"SIM PUK code"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="3201151840570492538">"New SIM PIN code"</string>
+ <string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"Touch to type password"</font></string>
+ <string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Type password to unlock"</string>
+ <string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Type PIN to unlock"</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"Incorrect PIN code."</string>
+ <string name="keyguard_label_text" msgid="861796461028298424">"To unlock, press Menu, then 0."</string>
+ <string name="faceunlock_multiple_failures" msgid="754137583022792429">"Maximum Face Unlock attempts exceeded"</string>
+ <string name="keyguard_charged" msgid="3272223906073492454">"Charged"</string>
+ <string name="keyguard_plugged_in" msgid="8117572000639998388">"Charging, <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+ <string name="keyguard_low_battery" msgid="8143808018719173859">"Connect your charger."</string>
+ <string name="keyguard_instructions_when_pattern_disabled" msgid="1332288268600329841">"Press Menu to unlock."</string>
+ <string name="keyguard_network_locked_message" msgid="9169717779058037168">"Network locked"</string>
+ <string name="keyguard_missing_sim_message_short" msgid="494980561304211931">"No SIM card"</string>
+ <string name="keyguard_missing_sim_message" product="tablet" msgid="1445849005909260039">"No SIM card in tablet."</string>
+ <string name="keyguard_missing_sim_message" product="default" msgid="3481110395508637643">"No SIM card in phone."</string>
+ <string name="keyguard_missing_sim_instructions" msgid="5210891509995942250">"Insert a SIM card."</string>
+ <string name="keyguard_missing_sim_instructions_long" msgid="5968985489463870358">"The SIM card is missing or not readable. Insert a SIM card."</string>
+ <string name="keyguard_permanent_disabled_sim_message_short" msgid="8340813989586622356">"Unusable SIM card."</string>
+ <string name="keyguard_permanent_disabled_sim_instructions" msgid="5892940909699723544">"Your SIM card has been permanently disabled.\n Contact your wireless service provider for another SIM card."</string>
+ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM card is locked."</string>
+ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM card is PUK-locked."</string>
+ <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Unlocking SIM card…"</string>
+ <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d of %3$d."</string>
+ <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Add widget"</string>
+ <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Empty"</string>
+ <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Unlock area expanded."</string>
+ <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Unlock area collapsed."</string>
+ <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> widget."</string>
+ <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"User selector"</string>
+ <string name="keyguard_accessibility_status" msgid="8008264603935930611">"Status"</string>
+ <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Camera"</string>
+ <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Media controls"</string>
+ <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Widget reordering started."</string>
+ <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Widget reordering ended."</string>
+ <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Widget <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> deleted."</string>
+ <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Expand unlock area."</string>
+ <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Slide unlock."</string>
+ <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Pattern unlock."</string>
+ <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Face unlock."</string>
+ <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Pin unlock."</string>
+ <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Password unlock."</string>
+ <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Pattern area."</string>
+ <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Slide area."</string>
+ <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"Previous track button"</string>
+ <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"Next track button"</string>
+ <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Pause button"</string>
+ <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Play button"</string>
+ <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Stop button"</string>
+ <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Thumbs up"</string>
+ <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Thumbs down"</string>
+ <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Heart"</string>
+ <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Unlock to continue"</string>
+ <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Launch cancelled"</string>
+ <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Drop <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> to delete."</string>
+ <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> will not be deleted."</string>
+ <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
+ <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
+ <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
+ <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
+ <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"Cancel"</string>
+ <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Delete"</string>
+ <string name="keyboardview_keycode_done" msgid="1992571118466679775">"Done"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Mode change"</string>
+ <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
+ <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
+ <string name="description_target_unlock" msgid="2228524900439801453">"Unlock"</string>
+ <string name="description_target_camera" msgid="969071997552486814">"Camera"</string>
+ <string name="description_target_silent" msgid="893551287746522182">"Silent"</string>
+ <string name="description_target_soundon" msgid="30052466675500172">"Sound on"</string>
+ <string name="description_target_search" msgid="3091587249776033139">"Search"</string>
+ <string name="description_direction_up" msgid="7169032478259485180">"Slide up for <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="5087739728639014595">"Slide down for <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="7207478719805562165">"Slide left for <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="8034433242579600980">"Slide right for <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="user_switched" msgid="3768006783166984410">"Current user <xliff:g id="NAME">%1$s</xliff:g>."</string>
+ <string name="kg_emergency_call_label" msgid="684946192523830531">"Emergency call"</string>
+ <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Forgot Pattern"</string>
+ <string name="kg_wrong_pattern" msgid="1850806070801358830">"Wrong Pattern"</string>
+ <string name="kg_wrong_password" msgid="2333281762128113157">"Wrong Password"</string>
+ <string name="kg_wrong_pin" msgid="1131306510833563801">"Wrong PIN"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"Try again in <xliff:g id="NUMBER">%d</xliff:g> seconds."</string>
+ <string name="kg_pattern_instructions" msgid="398978611683075868">"Draw your pattern"</string>
+ <string name="kg_sim_pin_instructions" msgid="2319508550934557331">"Enter SIM PIN"</string>
+ <string name="kg_pin_instructions" msgid="2377242233495111557">"Enter PIN"</string>
+ <string name="kg_password_instructions" msgid="5753646556186936819">"Enter Password"</string>
+ <string name="kg_puk_enter_puk_hint" msgid="453227143861735537">"SIM is now disabled. Enter PUK code to continue. Contact carrier for details."</string>
+ <string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"Enter desired PIN code"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"Confirm desired PIN code"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"Unlocking SIM card…"</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"Type a PIN that is 4 to 8 numbers."</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"PUK code should be 8 numbers or more."</string>
+ <string name="kg_invalid_puk" msgid="3638289409676051243">"Re-enter the correct PUK code. Repeated attempts will permanently disable the SIM."</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"PIN codes do not match"</string>
+ <string name="kg_login_too_many_attempts" msgid="6486842094005698475">"Too many pattern attempts"</string>
+ <string name="kg_login_instructions" msgid="1100551261265506448">"To unlock, sign in with your Google account."</string>
+ <string name="kg_login_username_hint" msgid="5718534272070920364">"Username (email)"</string>
+ <string name="kg_login_password_hint" msgid="9057289103827298549">"Password"</string>
+ <string name="kg_login_submit_button" msgid="5355904582674054702">"Sign in"</string>
+ <string name="kg_login_invalid_input" msgid="5754664119319872197">"Invalid username or password."</string>
+ <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"Forgot your username or password?\nVisit "<b>"google.com/accounts/recovery"</b>"."</string>
+ <string name="kg_login_checking_password" msgid="1052685197710252395">"Checking account…"</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"You have incorrectly typed your PIN <xliff:g id="NUMBER_0">%d</xliff:g> times. \n\nTry again in <xliff:g id="NUMBER_1">%d</xliff:g> seconds."</string>
+ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"You have incorrectly typed your password <xliff:g id="NUMBER_0">%d</xliff:g> times. \n\nTry again in <xliff:g id="NUMBER_1">%d</xliff:g> seconds."</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"You have incorrectly drawn your unlock pattern <xliff:g id="NUMBER_0">%d</xliff:g> times. \n\nTry again in <xliff:g id="NUMBER_1">%d</xliff:g> seconds."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1575557200627128949">"You have incorrectly attempted to unlock the tablet <xliff:g id="NUMBER_0">%d</xliff:g> times. After <xliff:g id="NUMBER_1">%d</xliff:g> more unsuccessful attempts, the tablet will be reset to factory default and all user data will be lost."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="4051015943038199910">"You have incorrectly attempted to unlock the phone <xliff:g id="NUMBER_0">%d</xliff:g> times. After <xliff:g id="NUMBER_1">%d</xliff:g> more unsuccessful attempts, the phone will be reset to factory default and all user data will be lost."</string>
+ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="2072996269148483637">"You have incorrectly attempted to unlock the tablet <xliff:g id="NUMBER">%d</xliff:g> times. The tablet will now be reset to factory default."</string>
+ <string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"You have incorrectly attempted to unlock the phone <xliff:g id="NUMBER">%d</xliff:g> times. The phone will now be reset to factory default."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"You have incorrectly drawn your unlock pattern <xliff:g id="NUMBER_0">%d</xliff:g> times. After <xliff:g id="NUMBER_1">%d</xliff:g> more unsuccessful attempts, you will be asked to unlock your tablet using an email account.\n\n Try again in <xliff:g id="NUMBER_2">%d</xliff:g> seconds."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"You have incorrectly drawn your unlock pattern <xliff:g id="NUMBER_0">%d</xliff:g> times. After <xliff:g id="NUMBER_1">%d</xliff:g> more unsuccessful attempts, you will be asked to unlock your phone using an email account.\n\n Try again in <xliff:g id="NUMBER_2">%d</xliff:g> seconds."</string>
+ <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
+ <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Remove"</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"Incorrect SIM PIN code; you must now contact your operator to unlock your device."</string>
+ <plurals name="kg_password_wrong_pin_code">
+ <item quantity="one" msgid="8134313997799638254">"Incorrect SIM PIN code; you have <xliff:g id="NUMBER">%d</xliff:g> remaining attempt/s before you must contact your carrier to unlock your device."</item>
+ <item quantity="other" msgid="2215723361575359486">"Incorrect SIM PIN code; you have <xliff:g id="NUMBER">%d</xliff:g> remaining attempt/s."</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="7077536808291316208">"SIM is unusable. Contact your operator."</string>
+ <plurals name="kg_password_wrong_puk_code">
+ <item quantity="one" msgid="3256893607561060649">"Incorrect SIM PUK code; you have <xliff:g id="NUMBER">%d</xliff:g> remaining attempt/s before SIM becomes permanently unusable."</item>
+ <item quantity="other" msgid="5477305226026342036">"Incorrect SIM PUK code; you have <xliff:g id="NUMBER">%d</xliff:g> remaining attempt/s before SIM becomes permanently unusable."</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="6268288093558031564">"SIM PIN operation failed!"</string>
+ <string name="kg_password_puk_failed" msgid="2838824369502455984">"SIM PUK operation failed!"</string>
+ <string name="kg_pin_accepted" msgid="1448241673570020097">"Code accepted"</string>
+ <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Previous track button"</string>
+ <string name="keyguard_transport_next_description" msgid="4299258300283778305">"Next track button"</string>
+ <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Pause button"</string>
+ <string name="keyguard_transport_play_description" msgid="2924628863741150956">"Play button"</string>
+ <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"Stop button"</string>
+ <string name="keyguard_carrier_default" msgid="8700650403054042153">"No service."</string>
+</resources>
diff --git a/packages/Keyguard/res/values-es-rUS/strings.xml b/packages/Keyguard/res/values-es-rUS/strings.xml
index 787581a..38beca3 100644
--- a/packages/Keyguard/res/values-es-rUS/strings.xml
+++ b/packages/Keyguard/res/values-es-rUS/strings.xml
@@ -21,9 +21,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"Ingresa el código PIN"</string>
- <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"Escribe el código PUK y un nuevo código PIN."</string>
- <string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"Código PUK"</string>
- <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"Nuevo código PIN"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="3035856550289724338">"Escribe el código PUK de la tarjeta SIM y un nuevo código PIN."</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="1801941051094974609">"Código PUK de la tarjeta SIM"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="3201151840570492538">"Nuevo código PIN de la tarjeta SIM"</string>
<string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"Toca para ingresar la contraseña"</font></string>
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Ingresar contraseña para desbloquear"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Ingresa el PIN para desbloquear"</string>
@@ -71,6 +71,13 @@
<string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Botón de pausa"</string>
<string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Botón de reproducción"</string>
<string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Botón de detención"</string>
+ <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Votos a favor"</string>
+ <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Votos en contra"</string>
+ <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Corazón"</string>
+ <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Desbloquea para continuar."</string>
+ <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Se canceló el inicio."</string>
+ <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Suelta <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> para eliminarlo."</string>
+ <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"No se eliminará <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>."</string>
<string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
<string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
<string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
@@ -105,7 +112,6 @@
<string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"Ingresa el código PIN deseado"</string>
<string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"Confirmar código PIN deseado"</string>
<string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"Desbloqueando tarjeta SIM…"</string>
- <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"Código PIN incorrecto"</string>
<string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"Escribe un PIN que tenga de cuatro a ocho números."</string>
<string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"El código PUK debe tener ocho números como mínimo."</string>
<string name="kg_invalid_puk" msgid="3638289409676051243">"Vuelve a ingresar el código PUK correcto. Si ingresas un código incorrecto varias veces, se inhabilitará la tarjeta SIM."</string>
@@ -129,6 +135,19 @@
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Dibujaste incorrectamente tu patrón de desbloqueo <xliff:g id="NUMBER_0">%d</xliff:g> veces. Luego de <xliff:g id="NUMBER_1">%d</xliff:g> intentos incorrectos más, se te solicitará que desbloquees tu dispositivo mediante el uso de una cuenta de correo.\n\n Vuelve a intentarlo en <xliff:g id="NUMBER_2">%d</xliff:g> segundos."</string>
<string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
<string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Eliminar"</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"El código PIN de la tarjeta SIM es incorrecto. Debes comunicarte con el proveedor para desbloquear el dispositivo."</string>
+ <plurals name="kg_password_wrong_pin_code">
+ <item quantity="one" msgid="8134313997799638254">"El código PIN de la tarjeta SIM es incorrecto. Te queda <xliff:g id="NUMBER">%d</xliff:g> intento antes de que debas comunicarte con el proveedor para desbloquear el dispositivo."</item>
+ <item quantity="other" msgid="2215723361575359486">"El código PIN de la tarjeta SIM es incorrecto. Te quedan <xliff:g id="NUMBER">%d</xliff:g> intentos."</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="7077536808291316208">"La tarjeta SIM no se puede utilizar. Comunícate con el proveedor."</string>
+ <plurals name="kg_password_wrong_puk_code">
+ <item quantity="one" msgid="3256893607561060649">"El código PUK de la tarjeta SIM es incorrecto. Te queda <xliff:g id="NUMBER">%d</xliff:g> intento antes de que la tarjeta SIM quede inutilizable permanentemente."</item>
+ <item quantity="other" msgid="5477305226026342036">"El código PUK de la tarjeta SIM es incorrecto. Te quedan <xliff:g id="NUMBER">%d</xliff:g> intentos antes de que la tarjeta SIM quede inutilizable permanentemente."</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="6268288093558031564">"Error al desbloquear la tarjeta SIM con el PIN"</string>
+ <string name="kg_password_puk_failed" msgid="2838824369502455984">"Error al desbloquear la tarjeta SIM con el PUK"</string>
+ <string name="kg_pin_accepted" msgid="1448241673570020097">"Código aceptado"</string>
<string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Botón de pista anterior"</string>
<string name="keyguard_transport_next_description" msgid="4299258300283778305">"Botón de pista siguiente"</string>
<string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Botón de pausa"</string>
diff --git a/packages/Keyguard/res/values-es/strings.xml b/packages/Keyguard/res/values-es/strings.xml
index d0c79eb..a93b10d 100644
--- a/packages/Keyguard/res/values-es/strings.xml
+++ b/packages/Keyguard/res/values-es/strings.xml
@@ -21,16 +21,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"Introduce el código PIN."</string>
- <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"Introduce el código PUK y un nuevo código PIN."</string>
- <string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"Código PUK"</string>
- <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"Nuevo código PIN"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="3035856550289724338">"Escribe el PUK de la tarjeta SIM y un nuevo código PIN"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="1801941051094974609">"Código PUK de la tarjeta SIM"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="3201151840570492538">"Nuevo código PIN de tarjeta SIM"</string>
<string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"Toca para introducir contraseña"</font></string>
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Introduce la contraseña para desbloquear."</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Introduce el código PIN para desbloquear."</string>
<string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"Código PIN incorrecto"</string>
<string name="keyguard_label_text" msgid="861796461028298424">"Para desbloquear el teléfono, pulsa la tecla de menú y, a continuación, pulsa 0."</string>
<string name="faceunlock_multiple_failures" msgid="754137583022792429">"Se ha superado el número máximo de intentos de desbloqueo facial."</string>
- <string name="keyguard_charged" msgid="3272223906073492454">"Cargado"</string>
+ <string name="keyguard_charged" msgid="3272223906073492454">"Cargada"</string>
<string name="keyguard_plugged_in" msgid="8117572000639998388">"Cargando (<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
<string name="keyguard_low_battery" msgid="8143808018719173859">"Conecta el cargador."</string>
<string name="keyguard_instructions_when_pattern_disabled" msgid="1332288268600329841">"Ve al menú para desbloquear la pantalla."</string>
@@ -71,6 +71,13 @@
<string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Botón de pausa"</string>
<string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Botón de reproducción"</string>
<string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Botón para detener la reproducción"</string>
+ <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Me gusta"</string>
+ <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"No me gusta"</string>
+ <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Corazón"</string>
+ <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Desbloquear para continuar"</string>
+ <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Inicio cancelado"</string>
+ <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Suelta <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> para eliminarlo."</string>
+ <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> no se eliminará."</string>
<string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
<string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
<string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
@@ -105,7 +112,6 @@
<string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"Introduce el código PIN deseado"</string>
<string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"Confirma el código PIN"</string>
<string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"Desbloqueando tarjeta SIM…"</string>
- <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"Código PIN incorrecto"</string>
<string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"Introduce un código PIN con una longitud comprendida entre cuatro y ocho dígitos."</string>
<string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"El código PUK debe tener ocho números como mínimo."</string>
<string name="kg_invalid_puk" msgid="3638289409676051243">"Vuelve a introducir el código PUK correcto. Si introduces un código incorrecto varias veces, se inhabilitará la tarjeta SIM."</string>
@@ -129,6 +135,19 @@
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Has fallado <xliff:g id="NUMBER_0">%d</xliff:g> veces al dibujar el patrón de desbloqueo. Si fallas otras <xliff:g id="NUMBER_1">%d</xliff:g> veces, deberás usar una cuenta de correo electrónico para desbloquear el teléfono.\n\n Inténtalo de nuevo en <xliff:g id="NUMBER_2">%d</xliff:g> segundos."</string>
<string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
<string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Eliminar"</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"Código PIN de la tarjeta SIM incorrecto. Debes ponerte en contacto con tu operador para desbloquear el dispositivo."</string>
+ <plurals name="kg_password_wrong_pin_code">
+ <item quantity="one" msgid="8134313997799638254">"Código PIN de la tarjeta SIM incorrecto. Queda <xliff:g id="NUMBER">%d</xliff:g> intento para tener que ponerte en contacto con tu operador para desbloquear el dispositivo."</item>
+ <item quantity="other" msgid="2215723361575359486">"Código PIN de la tarjeta SIM incorrecto. Quedan <xliff:g id="NUMBER">%d</xliff:g> intentos."</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="7077536808291316208">"La tarjeta SIM no se puede utilizar. Ponte en contacto con tu operador."</string>
+ <plurals name="kg_password_wrong_puk_code">
+ <item quantity="one" msgid="3256893607561060649">"Código PUK de la tarjeta SIM incorrecto. Te queda <xliff:g id="NUMBER">%d</xliff:g> intento para que la tarjeta SIM no se pueda utilizar de forma permanente."</item>
+ <item quantity="other" msgid="5477305226026342036">"Código PUK de la tarjeta SIM incorrecto. Quedan <xliff:g id="NUMBER">%d</xliff:g> intentos para que la tarjeta SIM no se pueda utilizar de forma permanente."</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="6268288093558031564">"Error al intentar desbloquear la tarjeta SIM con el código PIN"</string>
+ <string name="kg_password_puk_failed" msgid="2838824369502455984">"Error al intentar desbloquear la tarjeta SIM con el código PUK"</string>
+ <string name="kg_pin_accepted" msgid="1448241673570020097">"Código aceptado"</string>
<string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Botón de canción anterior"</string>
<string name="keyguard_transport_next_description" msgid="4299258300283778305">"Botón de siguiente canción"</string>
<string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Botón de pausa"</string>
diff --git a/packages/Keyguard/res/values-et-rEE/strings.xml b/packages/Keyguard/res/values-et-rEE/strings.xml
new file mode 100644
index 0000000..90bd829
--- /dev/null
+++ b/packages/Keyguard/res/values-et-rEE/strings.xml
@@ -0,0 +1,157 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"Sisestage PIN-kood"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="3035856550289724338">"Sisestage SIM-i PUK- ja uus PIN-kood"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="1801941051094974609">"SIM-i PUK-kood"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="3201151840570492538">"Uus SIM-i PIN-kood"</string>
+ <string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"Puudutage parooli sisestamiseks"</font></string>
+ <string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Avamiseks sisestage parool"</string>
+ <string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Avamiseks sisestage PIN-kood"</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"Vale PIN-kood."</string>
+ <string name="keyguard_label_text" msgid="861796461028298424">"Avamiseks vajutage menüüklahvi, seejärel klahvi 0."</string>
+ <string name="faceunlock_multiple_failures" msgid="754137583022792429">"Maksimaalne teenusega Face Unlock avamise katsete arv on ületatud"</string>
+ <string name="keyguard_charged" msgid="3272223906073492454">"Laetud"</string>
+ <string name="keyguard_plugged_in" msgid="8117572000639998388">"Laadimine, <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+ <string name="keyguard_low_battery" msgid="8143808018719173859">"Ühendage laadija."</string>
+ <string name="keyguard_instructions_when_pattern_disabled" msgid="1332288268600329841">"Avamiseks vajutage menüüklahvi."</string>
+ <string name="keyguard_network_locked_message" msgid="9169717779058037168">"Võrk on suletud"</string>
+ <string name="keyguard_missing_sim_message_short" msgid="494980561304211931">"SIM-kaarti pole"</string>
+ <string name="keyguard_missing_sim_message" product="tablet" msgid="1445849005909260039">"Tahvelarvutis pole SIM-kaarti."</string>
+ <string name="keyguard_missing_sim_message" product="default" msgid="3481110395508637643">"Telefonis pole SIM-kaarti."</string>
+ <string name="keyguard_missing_sim_instructions" msgid="5210891509995942250">"Sisestage SIM-kaart."</string>
+ <string name="keyguard_missing_sim_instructions_long" msgid="5968985489463870358">"SIM-kaart puudub või on loetamatu. Sisestage SIM-kaart."</string>
+ <string name="keyguard_permanent_disabled_sim_message_short" msgid="8340813989586622356">"Kasutamiskõlbmatu SIM-kaart."</string>
+ <string name="keyguard_permanent_disabled_sim_instructions" msgid="5892940909699723544">"SIM-kaart on jäädavalt keelatud.\n Uue SIM-kaardi saamiseks võtke ühendust oma mobiilsideoperaatoriga."</string>
+ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM-kaart on lukus."</string>
+ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM-kaart on PUK-lukus."</string>
+ <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"SIM-kaardi avamine ..."</string>
+ <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Vidin %2$d/%3$d."</string>
+ <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Vidina lisamine."</string>
+ <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Tühi"</string>
+ <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Avamisala on laiendatud."</string>
+ <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Avamisala on ahendatud."</string>
+ <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"Vidin <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>."</string>
+ <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"Kasutaja valija"</string>
+ <string name="keyguard_accessibility_status" msgid="8008264603935930611">"Olek"</string>
+ <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Kaamera"</string>
+ <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Meedia juhtnupud"</string>
+ <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Vidina ümberkorraldamine algas."</string>
+ <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Vidina ümberkorraldamine lõppes."</string>
+ <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Vidin <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> on kustutatud."</string>
+ <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Avamisala laiendamine."</string>
+ <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Lohistamisega avamine."</string>
+ <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Mustriga avamine."</string>
+ <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Näoga avamine."</string>
+ <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"PIN-koodiga avamine."</string>
+ <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Parooliga avamine."</string>
+ <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Mustri ala."</string>
+ <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Lohistamisala."</string>
+ <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"Nupp Eelmine lugu"</string>
+ <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"Nupp Järgmine lugu"</string>
+ <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Nupp Peata"</string>
+ <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Nupp Esita"</string>
+ <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Nupp Peata"</string>
+ <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Meeldib"</string>
+ <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Ei meeldi"</string>
+ <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Süda"</string>
+ <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Jätkamiseks tühistage lukustus"</string>
+ <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Käivitamine on tühistatud"</string>
+ <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Kustutamiseks laske vidin <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> lahti."</string>
+ <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"Vidinat <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> ei kustutata."</string>
+ <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
+ <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
+ <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
+ <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
+ <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"Tühista"</string>
+ <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Kustuta"</string>
+ <string name="keyboardview_keycode_done" msgid="1992571118466679775">"Valmis"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Režiimi muutmine"</string>
+ <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Tõstuklahv"</string>
+ <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Sisestusklahv"</string>
+ <string name="description_target_unlock" msgid="2228524900439801453">"Luku avamine"</string>
+ <string name="description_target_camera" msgid="969071997552486814">"Kaamera"</string>
+ <string name="description_target_silent" msgid="893551287746522182">"Hääletu"</string>
+ <string name="description_target_soundon" msgid="30052466675500172">"Heli on sees"</string>
+ <string name="description_target_search" msgid="3091587249776033139">"Otsing"</string>
+ <string name="description_direction_up" msgid="7169032478259485180">"Lohistage üles: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="5087739728639014595">"Lohistage alla: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="7207478719805562165">"Lohistage vasakule: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="8034433242579600980">"Lohistage paremale: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="user_switched" msgid="3768006783166984410">"Praegune kasutaja <xliff:g id="NAME">%1$s</xliff:g>."</string>
+ <string name="kg_emergency_call_label" msgid="684946192523830531">"Hädaabikõne"</string>
+ <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Unustasin mustri"</string>
+ <string name="kg_wrong_pattern" msgid="1850806070801358830">"Vale muster"</string>
+ <string name="kg_wrong_password" msgid="2333281762128113157">"Vale parool"</string>
+ <string name="kg_wrong_pin" msgid="1131306510833563801">"Vale PIN-kood"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"Proovige uuesti <xliff:g id="NUMBER">%d</xliff:g> sekundi pärast."</string>
+ <string name="kg_pattern_instructions" msgid="398978611683075868">"Joonistage oma muster"</string>
+ <string name="kg_sim_pin_instructions" msgid="2319508550934557331">"Sisestage SIM-i PIN-kood"</string>
+ <string name="kg_pin_instructions" msgid="2377242233495111557">"Sisestage PIN-kood"</string>
+ <string name="kg_password_instructions" msgid="5753646556186936819">"Sisestage parool"</string>
+ <string name="kg_puk_enter_puk_hint" msgid="453227143861735537">"SIM on nüüd keelatud. Jätkamiseks sisestage PUK-kood. Üksikasju küsige operaatorilt."</string>
+ <string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"Sisestage soovitud PIN-kood"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"Kinnitage soovitud PIN-kood"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"SIM-kaardi avamine ..."</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"Sisestage 4–8-numbriline PIN-kood."</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"PUK-koodi pikkus peab olema vähemalt 8 numbrit."</string>
+ <string name="kg_invalid_puk" msgid="3638289409676051243">"Sisestage uuesti õige PUK-kood. Korduvkatsete korral keelatakse SIM jäädavalt."</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"PIN-koodid ei ole vastavuses"</string>
+ <string name="kg_login_too_many_attempts" msgid="6486842094005698475">"Liiga palju mustrikatseid"</string>
+ <string name="kg_login_instructions" msgid="1100551261265506448">"Avamiseks logige sisse oma Google\'i kontoga."</string>
+ <string name="kg_login_username_hint" msgid="5718534272070920364">"Kasutajanimi (e-post)"</string>
+ <string name="kg_login_password_hint" msgid="9057289103827298549">"Parool"</string>
+ <string name="kg_login_submit_button" msgid="5355904582674054702">"Logi sisse"</string>
+ <string name="kg_login_invalid_input" msgid="5754664119319872197">"Vale kasutajanimi või parool."</string>
+ <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"Kas unustasite kasutajanime või parooli?\nKülastage aadressi "<b>"google.com/accounts/recovery"</b>"."</string>
+ <string name="kg_login_checking_password" msgid="1052685197710252395">"Konto kontrollimine ..."</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"Olete PIN-koodi <xliff:g id="NUMBER_0">%d</xliff:g> korda valesti sisestanud.\n\nProovige <xliff:g id="NUMBER_1">%d</xliff:g> sekundi pärast uuesti."</string>
+ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"Olete parooli <xliff:g id="NUMBER_0">%d</xliff:g> korda valesti sisestanud. \n\nProovige uuesti <xliff:g id="NUMBER_1">%d</xliff:g> sekundi pärast."</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"Joonistasite oma avamismustri <xliff:g id="NUMBER_0">%d</xliff:g> korda valesti.\n\nProovige <xliff:g id="NUMBER_1">%d</xliff:g> sekundi pärast uuesti."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1575557200627128949">"Olete üritanud <xliff:g id="NUMBER_0">%d</xliff:g> korda tahvelarvutit valesti avada. Pärast veel <xliff:g id="NUMBER_1">%d</xliff:g> ebaõnnestunud katset lähtestatakse tahvelarvuti tehase vaikeseadetele ja kõik kasutajaandmed lähevad kaotsi."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="4051015943038199910">"Olete üritanud <xliff:g id="NUMBER_0">%d</xliff:g> korda telefoni valesti avada. Pärast veel <xliff:g id="NUMBER_1">%d</xliff:g> ebaõnnestunud katset lähtestatakse telefon tehase vaikeseadetele ja kõik kasutajaandmed lähevad kaotsi."</string>
+ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="2072996269148483637">"Olete püüdnud tahvelarvutit <xliff:g id="NUMBER">%d</xliff:g> korda valesti avada. Tahvelarvuti lähtestatakse nüüd tehase vaikeseadetele."</string>
+ <string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"Olete püüdnud telefoni <xliff:g id="NUMBER">%d</xliff:g> korda valesti avada. Telefon lähtestatakse nüüd tehase vaikeseadetele."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Joonistasite oma avamismustri <xliff:g id="NUMBER_0">%d</xliff:g> korda valesti. Pärast veel <xliff:g id="NUMBER_1">%d</xliff:g> ebaõnnestunud katset palutakse teil tahvelarvuti avada meilikontoga.\n\n Proovige uuesti <xliff:g id="NUMBER_2">%d</xliff:g> sekundi pärast."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Joonistasite oma avamismustri <xliff:g id="NUMBER_0">%d</xliff:g> korda valesti. Pärast veel <xliff:g id="NUMBER_1">%d</xliff:g> ebaõnnestunud katset palutakse teil telefon avada meilikontoga.\n\n Proovige uuesti <xliff:g id="NUMBER_2">%d</xliff:g> sekundi pärast."</string>
+ <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
+ <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Eemalda"</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"Vale SIM-i PIN-kood, seadme avamiseks peate nüüd ühendust võtma oma operaatoriga."</string>
+ <plurals name="kg_password_wrong_pin_code">
+ <item quantity="one" msgid="8134313997799638254">"Vale SIM-i PIN-kood, teil on jäänud veel <xliff:g id="NUMBER">%d</xliff:g> katse, enne kui peate seadme avamiseks operaatoriga ühendust võtma."</item>
+ <item quantity="other" msgid="2215723361575359486">"Vale SIM-i PIN-kood, teil on jäänud veel <xliff:g id="NUMBER">%d</xliff:g> katset."</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="7077536808291316208">"SIM ei ole kasutatav. Võtke ühendust operaatoriga."</string>
+ <plurals name="kg_password_wrong_puk_code">
+ <item quantity="one" msgid="3256893607561060649">"Vale SIM-i PUK-kood, teil on jäänud veel <xliff:g id="NUMBER">%d</xliff:g> katse, enne kui SIM püsivalt lukustatakse."</item>
+ <item quantity="other" msgid="5477305226026342036">"Vale SIM-i PUK-kood, teil on jäänud veel <xliff:g id="NUMBER">%d</xliff:g> katset, enne kui SIM püsivalt lukustatakse."</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="6268288093558031564">"SIM-i PIN-koodi toiming ebaõnnestus."</string>
+ <string name="kg_password_puk_failed" msgid="2838824369502455984">"SIM-i PUK-koodi toiming ebaõnnestus."</string>
+ <string name="kg_pin_accepted" msgid="1448241673570020097">"Kood on õige."</string>
+ <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Nupp Eelmine lugu"</string>
+ <string name="keyguard_transport_next_description" msgid="4299258300283778305">"Nupp Järgmine lugu"</string>
+ <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Nupp Peata"</string>
+ <string name="keyguard_transport_play_description" msgid="2924628863741150956">"Nupp Esita"</string>
+ <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"Nupp Peata"</string>
+ <string name="keyguard_carrier_default" msgid="8700650403054042153">"Teenus puudub."</string>
+</resources>
diff --git a/packages/Keyguard/res/values-fa/strings.xml b/packages/Keyguard/res/values-fa/strings.xml
index 83c5a34..b4a4c61 100644
--- a/packages/Keyguard/res/values-fa/strings.xml
+++ b/packages/Keyguard/res/values-fa/strings.xml
@@ -21,15 +21,15 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"پین کد را وارد کنید"</string>
- <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"PUK و پین کد جدید را تایپ کنید"</string>
- <string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"کد PUK"</string>
- <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"پین کد جدید"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="3035856550289724338">"â€PUK سیم کارت Ùˆ کد پین جدید را تایپ کنید"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="1801941051094974609">"â€Ú©Ø¯ PUK سیم کارت"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="3201151840570492538">"کد پین جدید سیم کارت"</string>
<string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"برای تایپ گذرواژه لمس کنید"</font></string>
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"برای بازکردن Ù‚ÙÙ„ØŒ گذرواژه را وارد کنید"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"برای بازکردن Ù‚ÙÙ„ØŒ پین را تایپ کنید"</string>
<string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"پین کد اشتباه است."</string>
<string name="keyguard_label_text" msgid="861796461028298424">"برای بازگشایی Ù‚ÙÙ„ØŒ منو را ÙØ´Ø§Ø± دهید Ùˆ سپس 0 را ÙØ´Ø§Ø± دهید."</string>
- <string name="faceunlock_multiple_failures" msgid="754137583022792429">"Ø¯ÙØ¹Ø§Øª تلاش برای Face Unlock از حداکثر مجاز بیشتر شد"</string>
+ <string name="faceunlock_multiple_failures" msgid="754137583022792429">"â€Ø¯Ùعات تلاش برای Face Unlock از حداکثر مجاز بیشتر شد"</string>
<string name="keyguard_charged" msgid="3272223906073492454">"شارژ شد"</string>
<string name="keyguard_plugged_in" msgid="8117572000639998388">"شارژ، <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
<string name="keyguard_low_battery" msgid="8143808018719173859">"شارژر خود را وصل کنید."</string>
@@ -41,11 +41,11 @@
<string name="keyguard_missing_sim_instructions" msgid="5210891509995942250">"سیم کارت را وارد کنید."</string>
<string name="keyguard_missing_sim_instructions_long" msgid="5968985489463870358">"سیم کارت موجود نیست یا قابل خواندن نیست. یک سیم کارت وارد کنید."</string>
<string name="keyguard_permanent_disabled_sim_message_short" msgid="8340813989586622356">"سیم کارت غیرقابل Ø§Ø³ØªÙØ§Ø¯Ù‡ است."</string>
- <string name="keyguard_permanent_disabled_sim_instructions" msgid="5892940909699723544">"سیم کارت شما به طور دائم غیر ÙØ¹Ø§Ù„ شده است. \nبرای داشتن سیم کارت دیگر با ارائه‎دهنده سرویس بی‎سیم خود تماس بگیرید."</string>
+ <string name="keyguard_permanent_disabled_sim_instructions" msgid="5892940909699723544">"â€Ø³ÛŒÙ… کارت شما به طور دائم غیر ÙØ¹Ø§Ù„ شده است. \nبرای داشتن سیم کارت دیگر با ارائه‎دهنده سرویس بی‎سیم خود تماس بگیرید."</string>
<string name="keyguard_sim_locked_message" msgid="6875773413306380902">"سیم کارت Ù‚ÙÙ„ شد."</string>
- <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"سیم کارت با PUK Ù‚ÙÙ„ شده است."</string>
+ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"â€Ø³ÛŒÙ… کارت با PUK Ù‚ÙÙ„ شده است."</string>
<string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"درحال بازگشایی Ù‚ÙÙ„ سیم کارت..."</string>
- <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. ابزارک %2$d از %3$d."</string>
+ <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"â€%1$s. ابزارک %2$d از %3$d."</string>
<string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"ابزارک اضاÙÙ‡ کنید."</string>
<string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"خالی"</string>
<string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"منطقه بازگشایی گسترده شد."</string>
@@ -71,6 +71,13 @@
<string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"دکمه توق٠موقت"</string>
<string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"دکمه پخش"</string>
<string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"دکمه توقÙ"</string>
+ <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"رأی مواÙÙ‚"</string>
+ <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"رأی مخالÙ"</string>
+ <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"قلب"</string>
+ <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"برای ادامه Ù‚ÙÙ„ را باز کنید"</string>
+ <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"راه‌اندازی لغو شد"</string>
+ <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"جهت Ø­Ø°ÙØŒ <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> را بکشید."</string>
+ <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> پاک نخواهد شد."</string>
<string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
<string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
<string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
@@ -105,18 +112,17 @@
<string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"پین کد دلخواه را وارد کنید"</string>
<string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"تأیید پین کد دلخواه"</string>
<string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"بازگشایی Ù‚ÙÙ„ سیم کارت..."</string>
- <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"پین کد اشتباه است."</string>
<string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"یک پین ۴ تا ۸ رقمی را تایپ کنید."</string>
<string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"پین کد باید ۸ عدد یا بیشتر باشد."</string>
<string name="kg_invalid_puk" msgid="3638289409676051243">"پین کد صحیح را دوباره وارد کنید. تلاش‌های مکرر به‌طور دائم سیم کارت را ØºÛŒØ±ÙØ¹Ø§Ù„ خواهد کرد."</string>
<string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"پین کدها منطبق نیستند"</string>
- <string name="kg_login_too_many_attempts" msgid="6486842094005698475">"تلاش‎های زیادی برای کشیدن الگو صورت Ú¯Ø±ÙØªÙ‡ است"</string>
- <string name="kg_login_instructions" msgid="1100551261265506448">"برای بازگشایی Ù‚ÙÙ„ØŒ با حساب Google خود وارد سیستم شوید."</string>
+ <string name="kg_login_too_many_attempts" msgid="6486842094005698475">"â€ØªÙ„اش‎های زیادی برای کشیدن الگو صورت Ú¯Ø±ÙØªÙ‡ است"</string>
+ <string name="kg_login_instructions" msgid="1100551261265506448">"â€Ø¨Ø±Ø§ÛŒ بازگشایی Ù‚ÙÙ„ØŒ با حساب Google خود وارد سیستم شوید."</string>
<string name="kg_login_username_hint" msgid="5718534272070920364">"نام کاربری (ایمیل)"</string>
<string name="kg_login_password_hint" msgid="9057289103827298549">"گذرواژه"</string>
<string name="kg_login_submit_button" msgid="5355904582674054702">"ورود به سیستم"</string>
<string name="kg_login_invalid_input" msgid="5754664119319872197">"نام کاربری یا گذرواژه نامعتبر."</string>
- <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"نام کاربری یا گذرواژه خود را ÙØ±Ø§Ù…وش کردید؟\nاز "<b>"google.com/accounts/recovery"</b>" بازدید کنید."</string>
+ <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"â€Ù†Ø§Ù… کاربری یا گذرواژه خود را ÙØ±Ø§Ù…وش کردید؟\nاز "<b>"google.com/accounts/recovery"</b>" بازدید کنید."</string>
<string name="kg_login_checking_password" msgid="1052685197710252395">"درحال بررسی حساب..."</string>
<string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"پین خود را <xliff:g id="NUMBER_0">%d</xliff:g> بار اشتباه تایپ کردید. \n\nپس از <xliff:g id="NUMBER_1">%d</xliff:g> ثانیه دوباره امتحان کنید."</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"گذرواژه خود را <xliff:g id="NUMBER_0">%d</xliff:g> بار اشتباه تایپ کردید. \n\nپس از <xliff:g id="NUMBER_1">%d</xliff:g> ثانیه دوباره امتحان کنید."</string>
@@ -125,10 +131,23 @@
<string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="4051015943038199910">"شما به اشتباه <xliff:g id="NUMBER_0">%d</xliff:g> بار اقدام به باز کردن Ù‚ÙÙ„ تلÙÙ† کرده‌اید. پس از <xliff:g id="NUMBER_1">%d</xliff:g> تلاش ناموÙÙ‚ دیگر، تلÙÙ† به Ù¾ÛŒØ´â€ŒÙØ±Ø¶ کارخانه بازنشانی می‌شود Ùˆ تمام داده‌های کاربر از دست خواهد Ø±ÙØª."</string>
<string name="kg_failed_attempts_now_wiping" product="tablet" msgid="2072996269148483637">"شما به اشتباه <xliff:g id="NUMBER">%d</xliff:g> بار اقدام به باز کردن Ù‚ÙÙ„ رایانه لوحی کرده‌اید. رایانه لوحی اکنون به Ù¾ÛŒØ´â€ŒÙØ±Ø¶ کارخانه بازنشانی می‌شود."</string>
<string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"شما به اشتباه <xliff:g id="NUMBER">%d</xliff:g> بار اقدام به باز کردن Ù‚ÙÙ„ تلÙÙ† کرده‌اید. این تلÙÙ† اکنون به Ù¾ÛŒØ´â€ŒÙØ±Ø¶ کارخانه بازنشانی می‌شود."</string>
- <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"شما الگوی بازگشایی Ù‚ÙÙ„ خود را <xliff:g id="NUMBER_0">%d</xliff:g> بار اشتباه کشیده‎اید. بعد از <xliff:g id="NUMBER_1">%d</xliff:g> تلاش ناموÙÙ‚ØŒ از شما خواسته می‎شود Ú©Ù‡ با Ø§Ø³ØªÙØ§Ø¯Ù‡ از یک حساب ایمیل Ù‚ÙÙ„ رایانه لوحی خود را باز کنید.\n\n Ù„Ø·ÙØ§Ù‹ پس از <xliff:g id="NUMBER_2">%d</xliff:g> ثانیه دوباره امتحان کنید."</string>
- <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"شما الگوی بازگشایی Ù‚ÙÙ„ خود را <xliff:g id="NUMBER_0">%d</xliff:g> بار اشتباه کشیده‌اید. پس از <xliff:g id="NUMBER_1">%d</xliff:g> تلاش ناموÙÙ‚ØŒ از شما خواسته می‎شود Ú©Ù‡ با Ø§Ø³ØªÙØ§Ø¯Ù‡ از یک حساب ایمیل Ù‚ÙÙ„ تلÙÙ† خود را باز کنید.\n\n Ù„Ø·ÙØ§Ù‹ پس از <xliff:g id="NUMBER_2">%d</xliff:g> ثانیه دوباره امتحان کنید."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"â€Ø´Ù…ا الگوی بازگشایی Ù‚ÙÙ„ خود را <xliff:g id="NUMBER_0">%d</xliff:g> بار اشتباه کشیده‎اید. بعد از <xliff:g id="NUMBER_1">%d</xliff:g> تلاش ناموÙÙ‚ØŒ از شما خواسته می‎شود Ú©Ù‡ با Ø§Ø³ØªÙØ§Ø¯Ù‡ از یک حساب ایمیل Ù‚ÙÙ„ رایانه لوحی خود را باز کنید.\n\n Ù„Ø·ÙØ§Ù‹ پس از <xliff:g id="NUMBER_2">%d</xliff:g> ثانیه دوباره امتحان کنید."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"â€Ø´Ù…ا الگوی بازگشایی Ù‚ÙÙ„ خود را <xliff:g id="NUMBER_0">%d</xliff:g> بار اشتباه کشیده‌اید. پس از <xliff:g id="NUMBER_1">%d</xliff:g> تلاش ناموÙÙ‚ØŒ از شما خواسته می‎شود Ú©Ù‡ با Ø§Ø³ØªÙØ§Ø¯Ù‡ از یک حساب ایمیل Ù‚ÙÙ„ تلÙÙ† خود را باز کنید.\n\n Ù„Ø·ÙØ§Ù‹ پس از <xliff:g id="NUMBER_2">%d</xliff:g> ثانیه دوباره امتحان کنید."</string>
<string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
<string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"حذÙ"</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"کد پین سیم کارت اشتباه است، اکنون برای گشودن Ù‚ÙÙ„ دستگاهتان باید با شرکت مخابراتی تماس بگیرید."</string>
+ <plurals name="kg_password_wrong_pin_code">
+ <item quantity="one" msgid="8134313997799638254">"کد پین سیم کارت اشتباه است، <xliff:g id="NUMBER">%d</xliff:g> بار دیگر می‌توانید تلاش کنید Ùˆ پس از آن برای گشودن Ù‚ÙÙ„ دستگاهتان باید با شرکت مخابراتی تماس بگیرید."</item>
+ <item quantity="other" msgid="2215723361575359486">"کد پین سیم کارت اشتباه است، <xliff:g id="NUMBER">%d</xliff:g> بار دیگر می‌توانید تلاش کنید."</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="7077536808291316208">"سیم کارت غیر قابل Ø§Ø³ØªÙØ§Ø¯Ù‡ است. با شرکت مخابراتی‌تان تماس بگیرید."</string>
+ <plurals name="kg_password_wrong_puk_code">
+ <item quantity="one" msgid="3256893607561060649">"â€Ú©Ø¯ PUK سیم کارت اشتباه است، <xliff:g id="NUMBER">%d</xliff:g> بار دیگر می‌توانید تلاش کنید Ùˆ پس از آن سیم کارت به صورت دائم غیر قابل Ø§Ø³ØªÙØ§Ø¯Ù‡ می‌شود."</item>
+ <item quantity="other" msgid="5477305226026342036">"â€Ú©Ø¯ PUK سیم کارت اشتباه است، <xliff:g id="NUMBER">%d</xliff:g> بار دیگر می‌توانید تلاش کنید Ùˆ پس از آن سیم کارت به طور دائم غیر قابل Ø§Ø³ØªÙØ§Ø¯Ù‡ می‌شود."</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="6268288093558031564">"عملیات پین سیم کارت ناموÙÙ‚ بود!"</string>
+ <string name="kg_password_puk_failed" msgid="2838824369502455984">"â€Ø¹Ù…لیات PUK سیم کارت ناموÙÙ‚ بود!"</string>
+ <string name="kg_pin_accepted" msgid="1448241673570020097">"کد Ù¾Ø°ÛŒØ±ÙØªÙ‡ شد!"</string>
<string name="keyguard_transport_prev_description" msgid="8229108430245669854">"دکمه تراک قبلی"</string>
<string name="keyguard_transport_next_description" msgid="4299258300283778305">"دکمه تراک بعدی"</string>
<string name="keyguard_transport_pause_description" msgid="5093073338238310224">"دکمه توق٠موقت"</string>
diff --git a/packages/Keyguard/res/values-fi/strings.xml b/packages/Keyguard/res/values-fi/strings.xml
index dbca50d..e079ffa 100644
--- a/packages/Keyguard/res/values-fi/strings.xml
+++ b/packages/Keyguard/res/values-fi/strings.xml
@@ -21,9 +21,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"Anna PIN-koodi"</string>
- <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"Anna PUK-koodi ja uusi PIN-koodi"</string>
- <string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"PUK-koodi"</string>
- <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"Uusi PIN-koodi"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="3035856550289724338">"Anna SIM-kortin PUK-koodi ja uusi PIN-koodi"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="1801941051094974609">"SIM-kortin PUK-koodi"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="3201151840570492538">"Uusi SIM-kortin PIN-koodi"</string>
<string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"Kosketa ja anna salasana"</font></string>
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Poista lukitus antamalla salasana"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Poista lukitus antamalla PIN-koodi"</string>
@@ -71,6 +71,13 @@
<string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Tauko-painike"</string>
<string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Toista-painike"</string>
<string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Keskeytä-painike"</string>
+ <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Tykkään"</string>
+ <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"En tykkää"</string>
+ <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Sydän"</string>
+ <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Jatka poistamalla lukitus"</string>
+ <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Käynnistys peruutettu"</string>
+ <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Poista <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> pudottamalla."</string>
+ <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"Kohdetta <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> ei poisteta."</string>
<string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
<string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
<string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
@@ -105,7 +112,6 @@
<string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"Anna haluamasi PIN-koodi"</string>
<string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"Vahvista haluamasi PIN-koodi"</string>
<string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"SIM-kortin lukitusta poistetaan…"</string>
- <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"Virheellinen PIN-koodi."</string>
<string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"Anna 4–8-numeroinen PIN-koodi."</string>
<string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"PUK-koodissa tulee olla vähintään 8 numeroa."</string>
<string name="kg_invalid_puk" msgid="3638289409676051243">"Anna uudelleen oikea PUK-koodi. Jos teet liian monta yritystä, SIM-kortti poistetaan käytöstä pysyvästi."</string>
@@ -129,6 +135,19 @@
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Piirsit lukituksenpoistokuvion väärin <xliff:g id="NUMBER_0">%d</xliff:g> kertaa. Jos piirrät kuvion väärin vielä <xliff:g id="NUMBER_1">%d</xliff:g> kertaa, sinua pyydetään poistamaan puhelimesi lukitus sähköpostitilin avulla.\n\n Yritä uudelleen <xliff:g id="NUMBER_2">%d</xliff:g> sekunnin kuluttua."</string>
<string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" – "</string>
<string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Poista"</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"Virheellinen SIM-kortin PIN-koodi. Sinun on nyt otettava yhteys operaattoriin laitteen lukituksen avaamiseksi."</string>
+ <plurals name="kg_password_wrong_pin_code">
+ <item quantity="one" msgid="8134313997799638254">"Virheellinen SIM-kortin PIN-koodi. Sinulla on <xliff:g id="NUMBER">%d</xliff:g> yritys jäljellä, ennen kuin sinun on otettava yhteys operaattoriin laitteen lukituksen avaamiseksi."</item>
+ <item quantity="other" msgid="2215723361575359486">"Virheellinen SIM-kortin PIN-koodi. Sinulla on <xliff:g id="NUMBER">%d</xliff:g> yritystä jäljellä."</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="7077536808291316208">"SIM-kortti on käyttökelvoton. Ota yhteys operaattoriin."</string>
+ <plurals name="kg_password_wrong_puk_code">
+ <item quantity="one" msgid="3256893607561060649">"Virheellinen SIM-kortin PUK-koodi. Sinulla on <xliff:g id="NUMBER">%d</xliff:g> yritys jäljellä, ennen kuin SIM-kortista tulee pysyvästi käyttökelvoton."</item>
+ <item quantity="other" msgid="5477305226026342036">"Virheellinen SIM-kortin PUK-koodi. Sinulla on <xliff:g id="NUMBER">%d</xliff:g> yritystä jäljellä, ennen kuin SIM-kortista tulee pysyvästi käyttökelvoton."</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="6268288093558031564">"SIM-kortin PIN-toiminto epäonnistui!"</string>
+ <string name="kg_password_puk_failed" msgid="2838824369502455984">"SIM-kortin PUK-toiminto epäonnistui!"</string>
+ <string name="kg_pin_accepted" msgid="1448241673570020097">"Koodi hyväksytty!"</string>
<string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Edellinen kappale -painike"</string>
<string name="keyguard_transport_next_description" msgid="4299258300283778305">"Seuraava kappale -painike"</string>
<string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Tauko-painike"</string>
diff --git a/packages/Keyguard/res/values-fr-rCA/strings.xml b/packages/Keyguard/res/values-fr-rCA/strings.xml
new file mode 100644
index 0000000..59f27aa
--- /dev/null
+++ b/packages/Keyguard/res/values-fr-rCA/strings.xml
@@ -0,0 +1,157 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"Saisissez le NIP."</string>
+ <string name="keyguard_password_enter_puk_code" msgid="3035856550289724338">"Entrez le code PUK et le nouveau NIP de la carte SIM"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="1801941051094974609">"Code PUK de la carte SIM"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="3201151840570492538">"Nouveau NIP de la carte SIM"</string>
+ <string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"Appuyer pour saisir mot passe"</font></string>
+ <string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Saisissez le mot de passe pour déverrouiller le clavier."</string>
+ <string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Saisissez le NIP pour déverrouiller le clavier."</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"NIP erroné."</string>
+ <string name="keyguard_label_text" msgid="861796461028298424">"Pour déverrouiller le téléphone, appuyez sur \"Menu\", puis sur 0."</string>
+ <string name="faceunlock_multiple_failures" msgid="754137583022792429">"Nombre maximal autorisé de tentatives Face Unlock atteint."</string>
+ <string name="keyguard_charged" msgid="3272223906073492454">"Chargé"</string>
+ <string name="keyguard_plugged_in" msgid="8117572000639998388">"En charge (<xliff:g id="NUMBER">%d</xliff:g> <xliff:g id="PERCENT">%%</xliff:g>)"</string>
+ <string name="keyguard_low_battery" msgid="8143808018719173859">"Branchez votre chargeur."</string>
+ <string name="keyguard_instructions_when_pattern_disabled" msgid="1332288268600329841">"Appuyez sur \"Menu\" pour déverrouiller l\'appareil."</string>
+ <string name="keyguard_network_locked_message" msgid="9169717779058037168">"Réseau verrouillé"</string>
+ <string name="keyguard_missing_sim_message_short" msgid="494980561304211931">"Aucune carte SIM"</string>
+ <string name="keyguard_missing_sim_message" product="tablet" msgid="1445849005909260039">"Aucune carte SIM n\'est insérée dans la tablette."</string>
+ <string name="keyguard_missing_sim_message" product="default" msgid="3481110395508637643">"Aucune carte SIM n\'est insérée dans le téléphone."</string>
+ <string name="keyguard_missing_sim_instructions" msgid="5210891509995942250">"Insérez une carte SIM."</string>
+ <string name="keyguard_missing_sim_instructions_long" msgid="5968985489463870358">"Carte SIM absente ou illisible. Veuillez insérer une carte SIM."</string>
+ <string name="keyguard_permanent_disabled_sim_message_short" msgid="8340813989586622356">"Carte SIM inutilisable."</string>
+ <string name="keyguard_permanent_disabled_sim_instructions" msgid="5892940909699723544">"Votre carte SIM a été définitivement désactivée.\n Veuillez contacter votre opérateur de téléphonie mobile pour en obtenir une autre."</string>
+ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"La carte SIM est verrouillée."</string>
+ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"La carte SIM est verrouillée par clé PUK."</string>
+ <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Déverrouillage de la carte SIM en cours…"</string>
+ <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d sur %3$d."</string>
+ <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Ajouter un widget"</string>
+ <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Vide"</string>
+ <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Développement de la zone de déverrouillage"</string>
+ <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Réduction de la zone de déverrouillage"</string>
+ <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"Widget <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>"</string>
+ <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"Sélecteur d\'utilisateur"</string>
+ <string name="keyguard_accessibility_status" msgid="8008264603935930611">"État"</string>
+ <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Caméra"</string>
+ <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Commandes multimédias"</string>
+ <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Début de la réorganisation des widgets"</string>
+ <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Fin de la réorganisation des widgets"</string>
+ <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Le widget <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> a été supprimé."</string>
+ <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Développer la zone de déverrouillage"</string>
+ <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Déverrouillage en faisant glisser votre doigt sur l\'écran"</string>
+ <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Déverrouillage par schéma"</string>
+ <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Déverrouillage par reconnaissance faciale"</string>
+ <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Déverrouillage par NIP"</string>
+ <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Déverrouillage par mot de passe"</string>
+ <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Zone du schéma"</string>
+ <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Zone où faire glisser votre doigt sur l\'écran"</string>
+ <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"Bouton pour revenir au titre précédent"</string>
+ <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"Bouton pour atteindre le titre suivant"</string>
+ <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Bouton de pause"</string>
+ <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Bouton de lecture"</string>
+ <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Bouton d\'arrêt"</string>
+ <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"J\'aime"</string>
+ <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Je n\'aime pas"</string>
+ <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Cœur"</string>
+ <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Déverrouiller pour continuer"</string>
+ <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Lancement annulé"</string>
+ <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Déposez <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> pour supprimer."</string>
+ <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> ne sera pas supprimé."</string>
+ <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
+ <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
+ <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
+ <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
+ <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"Annuler"</string>
+ <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Supprimer"</string>
+ <string name="keyboardview_keycode_done" msgid="1992571118466679775">"Terminé"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Changement de mode"</string>
+ <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Maj"</string>
+ <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Entrée"</string>
+ <string name="description_target_unlock" msgid="2228524900439801453">"Déverrouiller"</string>
+ <string name="description_target_camera" msgid="969071997552486814">"Appareil photo"</string>
+ <string name="description_target_silent" msgid="893551287746522182">"Mode silencieux"</string>
+ <string name="description_target_soundon" msgid="30052466675500172">"Son activé"</string>
+ <string name="description_target_search" msgid="3091587249776033139">"Recherche"</string>
+ <string name="description_direction_up" msgid="7169032478259485180">"Faire glisser le doigt vers le haut : <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>"</string>
+ <string name="description_direction_down" msgid="5087739728639014595">"Faire glisser le doigt vers le bas : <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>"</string>
+ <string name="description_direction_left" msgid="7207478719805562165">"Faites glisser votre doigt vers la gauche pour <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="8034433242579600980">"Faites glisser votre doigt vers la droite pour <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="user_switched" msgid="3768006783166984410">"Utilisateur actuel : <xliff:g id="NAME">%1$s</xliff:g>"</string>
+ <string name="kg_emergency_call_label" msgid="684946192523830531">"Appel d\'urgence"</string>
+ <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"J\'ai oublié le schéma"</string>
+ <string name="kg_wrong_pattern" msgid="1850806070801358830">"Schéma incorrect."</string>
+ <string name="kg_wrong_password" msgid="2333281762128113157">"Mot de passe incorrect."</string>
+ <string name="kg_wrong_pin" msgid="1131306510833563801">"NIP incorrect."</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"Réessayez dans <xliff:g id="NUMBER">%d</xliff:g> secondes."</string>
+ <string name="kg_pattern_instructions" msgid="398978611683075868">"Dessinez votre schéma."</string>
+ <string name="kg_sim_pin_instructions" msgid="2319508550934557331">"Saisissez le NIP de la carte SIM"</string>
+ <string name="kg_pin_instructions" msgid="2377242233495111557">"Saisissez le NIP."</string>
+ <string name="kg_password_instructions" msgid="5753646556186936819">"Saisissez votre mot de passe."</string>
+ <string name="kg_puk_enter_puk_hint" msgid="453227143861735537">"La carte SIM est maintenant désactivée. Saisissez le code PUK pour continuer. Contactez votre opérateur pour en savoir plus."</string>
+ <string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"Saisir le NIP souhaité"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"Confirmer le NIP souhaité"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"Déblocage de la carte SIM en cours…"</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"Saisissez un NIP comprenant entre quatre et huit chiffres"</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"Le code PUK doit contenir au moins 8 chiffres."</string>
+ <string name="kg_invalid_puk" msgid="3638289409676051243">"Veuillez saisir de nouveau le code PUK correct. Des tentatives répétées désactivent définitivement la carte SIM."</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"Les codes PIN ne correspondent pas."</string>
+ <string name="kg_login_too_many_attempts" msgid="6486842094005698475">"Trop de tentatives."</string>
+ <string name="kg_login_instructions" msgid="1100551261265506448">"Pour déverrouiller l\'appareil, connectez-vous avec votre compte Google."</string>
+ <string name="kg_login_username_hint" msgid="5718534272070920364">"Nom d\'utilisateur (courriel)"</string>
+ <string name="kg_login_password_hint" msgid="9057289103827298549">"Mot de passe"</string>
+ <string name="kg_login_submit_button" msgid="5355904582674054702">"Connexion"</string>
+ <string name="kg_login_invalid_input" msgid="5754664119319872197">"Nom d\'utilisateur ou mot de passe non valide."</string>
+ <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"Vous avez oublié votre nom d\'utilisateur ou votre mot de passe?\nRendez-vous sur la page "<b>"google.com/accounts/recovery"</b>"."</string>
+ <string name="kg_login_checking_password" msgid="1052685197710252395">"Vérification du compte en cours…"</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"Vous avez saisi un NIP incorrect à <xliff:g id="NUMBER_0">%d</xliff:g> reprises. \n\nVeuillez réessayer dans <xliff:g id="NUMBER_1">%d</xliff:g> secondes."</string>
+ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"Vous avez saisi un mot de passe incorrect à <xliff:g id="NUMBER_0">%d</xliff:g> reprises. \n\nVeuillez réessayer dans <xliff:g id="NUMBER_1">%d</xliff:g> secondes."</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"Vous avez dessiné un schéma de déverrouillage incorrect à <xliff:g id="NUMBER_0">%d</xliff:g> reprises.\n\nVeuillez réessayer dans <xliff:g id="NUMBER_1">%d</xliff:g> secondes."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1575557200627128949">"Vous avez tenté de déverrouiller la tablette de façon incorrecte à <xliff:g id="NUMBER_0">%d</xliff:g> reprises. Si vous échouez encore <xliff:g id="NUMBER_1">%d</xliff:g> fois, sa configuration d\'usine sera rétablie, et toutes les données utilisateur seront perdues."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="4051015943038199910">"Vous avez tenté de déverrouiller le téléphone de façon incorrecte à <xliff:g id="NUMBER_0">%d</xliff:g> reprises. Si vous échouez encore <xliff:g id="NUMBER_1">%d</xliff:g> fois, sa configuration d\'usine sera rétablie, et toutes les données utilisateur seront perdues."</string>
+ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="2072996269148483637">"Vous avez tenté de déverrouiller la tablette de façon incorrecte à <xliff:g id="NUMBER">%d</xliff:g> reprises. Sa configuration d\'usine va être rétablie."</string>
+ <string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"Vous avez tenté de déverrouiller le téléphone de façon incorrecte à <xliff:g id="NUMBER">%d</xliff:g> reprises. Sa configuration d\'usine va être rétablie."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Vous avez dessiné un schéma de déverrouillage incorrect à <xliff:g id="NUMBER_0">%d</xliff:g> reprises. Si vous échouez encore <xliff:g id="NUMBER_1">%d</xliff:g> fois, vous devrez déverrouiller votre tablette à l\'aide d\'un compte de messagerie électronique.\n\n Veuillez réessayer dans <xliff:g id="NUMBER_2">%d</xliff:g> secondes."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Vous avez dessiné un schéma de déverrouillage incorrect à <xliff:g id="NUMBER_0">%d</xliff:g> reprises. Si vous échouez encore <xliff:g id="NUMBER_1">%d</xliff:g> fois, vous devrez déverrouiller votre téléphone à l\'aide d\'un compte de messagerie électronique.\n\n Veuillez réessayer dans <xliff:g id="NUMBER_2">%d</xliff:g> secondes."</string>
+ <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
+ <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Supprimer"</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"NIP de carte SIM incorrect. Vous devez maintenant communiquer avec votre fournisseur de services pour déverrouiller votre appareil."</string>
+ <plurals name="kg_password_wrong_pin_code">
+ <item quantity="one" msgid="8134313997799638254">"NIP de carte SIM incorrect. Il vous reste <xliff:g id="NUMBER">%d</xliff:g> tentative. Après cela, vous devrez communiquer avec votre fournisseur de services pour déverrouiller votre appareil."</item>
+ <item quantity="other" msgid="2215723361575359486">"NIP de carte SIM incorrect. Il vous reste <xliff:g id="NUMBER">%d</xliff:g> tentative(s)."</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="7077536808291316208">"La carte SIM est inutilisable. Communiquez avec votre fournisseur de services."</string>
+ <plurals name="kg_password_wrong_puk_code">
+ <item quantity="one" msgid="3256893607561060649">"Code PUK de la carte SIM incorrect. Il vous reste <xliff:g id="NUMBER">%d</xliff:g> tentative avant que votre carte SIM devienne définitivement inutilisable."</item>
+ <item quantity="other" msgid="5477305226026342036">"Code PUK de la carte SIM incorrect. Il vous reste <xliff:g id="NUMBER">%d</xliff:g> tentative(s) avant que votre carte SIM devienne définitivement inutilisable."</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="6268288093558031564">"Le déverrouillage par NIP de la carte SIM a échoué."</string>
+ <string name="kg_password_puk_failed" msgid="2838824369502455984">"Le déverrouillage de la carte SIM par code PUK a échoué."</string>
+ <string name="kg_pin_accepted" msgid="1448241673570020097">"Code accepté"</string>
+ <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Bouton pour revenir au titre précédent"</string>
+ <string name="keyguard_transport_next_description" msgid="4299258300283778305">"Bouton pour atteindre le titre suivant"</string>
+ <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Bouton de pause"</string>
+ <string name="keyguard_transport_play_description" msgid="2924628863741150956">"Bouton de lecture"</string>
+ <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"Bouton d\'arrêt"</string>
+ <string name="keyguard_carrier_default" msgid="8700650403054042153">"Aucun service"</string>
+</resources>
diff --git a/packages/Keyguard/res/values-fr/strings.xml b/packages/Keyguard/res/values-fr/strings.xml
index 250a136..b910dd4 100644
--- a/packages/Keyguard/res/values-fr/strings.xml
+++ b/packages/Keyguard/res/values-fr/strings.xml
@@ -21,9 +21,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"Saisissez le code PIN."</string>
- <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"Saisissez la clé PUK et le nouveau code PIN."</string>
- <string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"Code PUK"</string>
- <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"Nouveau code PIN"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="3035856550289724338">"Saisissez la clé PUK et le nouveau code PIN de la carte SIM."</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="1801941051094974609">"Clé PUK de la carte SIM"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="3201151840570492538">"Nouveau code PIN de la carte SIM"</string>
<string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"Appuyez pour saisir mot passe"</font></string>
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Saisissez le mot de passe pour déverrouiller le clavier."</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Saisissez le code PIN pour déverrouiller le clavier."</string>
@@ -71,6 +71,13 @@
<string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Bouton de pause"</string>
<string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Bouton de lecture"</string>
<string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Bouton d\'arrêt"</string>
+ <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"J\'aime"</string>
+ <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Je n\'aime pas"</string>
+ <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Cœur"</string>
+ <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Déverrouillez l\'appareil pour continuer."</string>
+ <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Lancement annulé."</string>
+ <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Relâchez le widget \"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g>\" pour le supprimer."</string>
+ <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"Le widget \"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g>\" ne va pas être supprimé."</string>
<string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
<string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
<string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
@@ -105,7 +112,6 @@
<string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"Saisir le code PIN souhaité"</string>
<string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"Confirmer le code PIN souhaité"</string>
<string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"Déblocage de la carte SIM en cours…"</string>
- <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"Le code PIN est erroné."</string>
<string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"Veuillez saisir un code PIN comprenant entre quatre et huit chiffres."</string>
<string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"Le code PUK doit contenir au moins 8 chiffres."</string>
<string name="kg_invalid_puk" msgid="3638289409676051243">"Veuillez saisir de nouveau le code PUK correct. Des tentatives répétées désactivent définitivement la carte SIM."</string>
@@ -129,6 +135,19 @@
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Vous avez dessiné un schéma de déverrouillage incorrect à <xliff:g id="NUMBER_0">%d</xliff:g> reprises. Si vous échouez encore <xliff:g id="NUMBER_1">%d</xliff:g> fois, vous devrez déverrouiller votre téléphone à l\'aide d\'un compte de messagerie électronique.\n\n Veuillez réessayer dans <xliff:g id="NUMBER_2">%d</xliff:g> secondes."</string>
<string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
<string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Supprimer"</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"Code PIN de la carte SIM incorrect. Vous devez désormais contacter votre opérateur pour déverrouiller votre appareil."</string>
+ <plurals name="kg_password_wrong_pin_code">
+ <item quantity="one" msgid="8134313997799638254">"Code PIN de la carte SIM incorrect. Il vous reste <xliff:g id="NUMBER">%d</xliff:g> tentative. Après cela, vous devrez contacter votre opérateur pour déverrouiller votre appareil."</item>
+ <item quantity="other" msgid="2215723361575359486">"Code PIN de la carte SIM incorrect. Il vous reste <xliff:g id="NUMBER">%d</xliff:g> tentatives."</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="7077536808291316208">"La carte SIM est inutilisable. Veuillez contacter votre opérateur."</string>
+ <plurals name="kg_password_wrong_puk_code">
+ <item quantity="one" msgid="3256893607561060649">"Clé PUK de la carte SIM incorrecte. Il vous reste <xliff:g id="NUMBER">%d</xliff:g> tentative avant que votre carte SIM ne devienne définitivement inutilisable."</item>
+ <item quantity="other" msgid="5477305226026342036">"Clé PUK de la carte SIM incorrecte. Il vous reste <xliff:g id="NUMBER">%d</xliff:g> tentatives avant que votre carte SIM ne devienne définitivement inutilisable."</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="6268288093558031564">"Échec du déverrouillage à l\'aide du code PIN de la carte SIM."</string>
+ <string name="kg_password_puk_failed" msgid="2838824369502455984">"Échec du déverrouillage à l\'aide de la clé PUK de la carte SIM."</string>
+ <string name="kg_pin_accepted" msgid="1448241673570020097">"Code accepté."</string>
<string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Bouton pour revenir au titre précédent"</string>
<string name="keyguard_transport_next_description" msgid="4299258300283778305">"Bouton pour atteindre le titre suivant"</string>
<string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Bouton de pause"</string>
diff --git a/packages/Keyguard/res/values-hi/strings.xml b/packages/Keyguard/res/values-hi/strings.xml
index 714d9fb..8c94eb3 100644
--- a/packages/Keyguard/res/values-hi/strings.xml
+++ b/packages/Keyguard/res/values-hi/strings.xml
@@ -21,9 +21,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"पिन कोड लिखें"</string>
- <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"PUK और नया पिन कोड लिखें"</string>
- <string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"PUK कोड"</string>
- <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"नया पिन कोड"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="3035856550289724338">"सिम PUK और नया PIN कोड लिखें"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="1801941051094974609">"सिम PUK कोड"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="3201151840570492538">"नया सिम PIN कोड"</string>
<string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"पासवरà¥à¤¡ लिखने के लिठसà¥à¤ªà¤°à¥à¤¶ करें"</font></string>
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"अनलॉक करने के लिठपासवरà¥à¤¡ लिखें"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"अनलॉक करने के लिठपिन लिखें"</string>
@@ -60,17 +60,24 @@
<string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"विजेट <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> को हटा दिया गया."</string>
<string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"अनलॉक कà¥à¤·à¥‡à¤¤à¥à¤° विसà¥à¤¤à¥ƒà¤¤ करें."</string>
<string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"सà¥à¤²à¤¾à¤‡à¤¡ अनलॉक."</string>
- <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"पà¥à¤°à¤¤à¤¿à¤®à¤¾à¤¨ अनलॉक."</string>
+ <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"आकार अनलॉक."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"फेस अनलॉक."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"पिन अनलॉक."</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"पासवरà¥à¤¡ अनलॉक."</string>
- <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"पà¥à¤°à¤¤à¤¿à¤®à¤¾à¤¨ कà¥à¤·à¥‡à¤¤à¥à¤°."</string>
+ <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"आकार कà¥à¤·à¥‡à¤¤à¥à¤°."</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"सà¥à¤²à¤¾à¤‡à¤¡ कà¥à¤·à¥‡à¤¤à¥à¤°."</string>
<string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"पिछला टà¥à¤°à¥ˆà¤• बटन"</string>
<string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"अगला टà¥à¤°à¥ˆà¤• बटन"</string>
<string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"पॉज़ करें बटन"</string>
<string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"चलाà¤à¤‚ बटन"</string>
<string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"रोकें बटन"</string>
+ <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"पसंद"</string>
+ <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"नापसंद"</string>
+ <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"दिल"</string>
+ <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"जारी रखने के लिठअनलॉक करें"</string>
+ <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"लॉनà¥â€à¤š रदà¥à¤¦ कर दिया गया"</string>
+ <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"हटाने के लिठ<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> खींचें."</string>
+ <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> को नहीं हटाया जाà¤à¤—ा."</string>
<string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
<string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
<string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
@@ -92,12 +99,12 @@
<string name="description_direction_right" msgid="8034433242579600980">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> के लिठदाà¤à¤‚ सà¥â€à¤²à¤¾à¤‡à¤¡ करें."</string>
<string name="user_switched" msgid="3768006783166984410">"वरà¥à¤¤à¤®à¤¾à¤¨ उपयोगकरà¥à¤¤à¤¾ <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="kg_emergency_call_label" msgid="684946192523830531">"आपातकालीन कॉल"</string>
- <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"पà¥à¤°à¤¤à¤¿à¤®à¤¾à¤¨ भूल गà¤"</string>
- <string name="kg_wrong_pattern" msgid="1850806070801358830">"गलत पà¥à¤°à¤¤à¤¿à¤®à¤¾à¤¨"</string>
+ <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"आकार भूल गà¤"</string>
+ <string name="kg_wrong_pattern" msgid="1850806070801358830">"गलत आकार"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"गलत पासवरà¥à¤¡"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"गलत PIN"</string>
<string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"<xliff:g id="NUMBER">%d</xliff:g> सेकंड में पà¥à¤¨: पà¥à¤°à¤¯à¤¾à¤¸ करें."</string>
- <string name="kg_pattern_instructions" msgid="398978611683075868">"अपना पà¥à¤°à¤¤à¤¿à¤®à¤¾à¤¨ आरेखित करें"</string>
+ <string name="kg_pattern_instructions" msgid="398978611683075868">"अपना आकार आरेखित करें"</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"सिम PIN डालें"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"PIN डालें"</string>
<string name="kg_password_instructions" msgid="5753646556186936819">"पासवरà¥à¤¡ डालें"</string>
@@ -105,30 +112,42 @@
<string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"इचà¥à¤›à¤¿à¤¤ पिन कोड डालें"</string>
<string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"इचà¥à¤›à¤¿à¤¤ पिन कोड की पà¥à¤·à¥à¤Ÿà¤¿ करें"</string>
<string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"SIM कारà¥à¤¡ अनलॉक कर रहा है…"</string>
- <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"गलत PIN कोड."</string>
<string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"à¤à¤¸à¤¾ PIN लिखें, जो 4 से 8 अंकों का हो."</string>
<string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"PUK कोड 8 या अधिक संखà¥à¤¯à¤¾ वाला होना चाहिà¤."</string>
<string name="kg_invalid_puk" msgid="3638289409676051243">"सही PUK कोड पà¥à¤¨: डालें. बार-बार पà¥à¤°à¤¯à¤¾à¤¸ करने से सिम सà¥à¤¥à¤¾à¤¯à¥€ रूप से अकà¥à¤·à¤® हो जाà¤à¤—ी."</string>
<string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"पिन कोड का मिलान नहीं होता"</string>
- <string name="kg_login_too_many_attempts" msgid="6486842094005698475">"बहà¥à¤¤ अधिक पà¥à¤°à¤¤à¤¿à¤®à¤¾à¤¨ पà¥à¤°à¤¯à¤¾à¤¸"</string>
- <string name="kg_login_instructions" msgid="1100551261265506448">"अनलॉक करने के लिà¤, अपने Google खाते से साइन इन करें."</string>
+ <string name="kg_login_too_many_attempts" msgid="6486842094005698475">"बहà¥à¤¤ अधिक आकार पà¥à¤°à¤¯à¤¾à¤¸"</string>
+ <string name="kg_login_instructions" msgid="1100551261265506448">"अनलॉक करने के लिà¤, अपने Google खाते से पà¥à¤°à¤µà¥‡à¤¶ करें."</string>
<string name="kg_login_username_hint" msgid="5718534272070920364">"उपयोगकरà¥à¤¤à¤¾ नाम (ईमेल)"</string>
<string name="kg_login_password_hint" msgid="9057289103827298549">"पासवरà¥à¤¡"</string>
- <string name="kg_login_submit_button" msgid="5355904582674054702">"साइन इन करें"</string>
+ <string name="kg_login_submit_button" msgid="5355904582674054702">"पà¥à¤°à¤µà¥‡à¤¶ करें"</string>
<string name="kg_login_invalid_input" msgid="5754664119319872197">"अमानà¥à¤¯ उपयोगकरà¥à¤¤à¤¾ नाम या पासवरà¥à¤¡."</string>
<string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"अपना उपयोगकरà¥à¤¤à¤¾ नाम या पासवरà¥à¤¡ भूल गà¤?\n "<b>"google.com/accounts/recovery"</b>" पर जाà¤à¤‚."</string>
<string name="kg_login_checking_password" msgid="1052685197710252395">"खाते की जांच की जा रही है…"</string>
<string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"आप अपना PIN <xliff:g id="NUMBER_0">%d</xliff:g> बार गलत तरीके से लिख चà¥à¤•े हैं. \n\n <xliff:g id="NUMBER_1">%d</xliff:g> सेकंड में पà¥à¤¨: पà¥à¤°à¤¯à¤¾à¤¸ करें."</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"आप अपना पासवरà¥à¤¡ <xliff:g id="NUMBER_0">%d</xliff:g> बार गलत तरीके से लिख चà¥à¤•े हैं. \n\n <xliff:g id="NUMBER_1">%d</xliff:g> सेकंड में पà¥à¤¨: पà¥à¤°à¤¯à¤¾à¤¸ करें."</string>
- <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"आपने अपना अनलॉक पà¥à¤°à¤¤à¤¿à¤®à¤¾à¤¨ <xliff:g id="NUMBER_0">%d</xliff:g> बार गलत तरीके से आरेखित किया है. \n\n <xliff:g id="NUMBER_1">%d</xliff:g> सेकंड में पà¥à¤¨: पà¥à¤°à¤¯à¤¾à¤¸ करें."</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"आपने अपना अनलॉक आकार <xliff:g id="NUMBER_0">%d</xliff:g> बार गलत तरीके से आरेखित किया है. \n\n <xliff:g id="NUMBER_1">%d</xliff:g> सेकंड में पà¥à¤¨: पà¥à¤°à¤¯à¤¾à¤¸ करें."</string>
<string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1575557200627128949">"आप टेबलेट को अनलॉक करने के लिठ<xliff:g id="NUMBER_0">%d</xliff:g> बार गलत तरीके से पà¥à¤°à¤¯à¤¾à¤¸ कर चà¥à¤•े हैं. <xliff:g id="NUMBER_1">%d</xliff:g> और असफल पà¥à¤°à¤¯à¤¾à¤¸à¥‹à¤‚ के बाद, टेबलेट फ़ैकà¥à¤Ÿà¤°à¥€ डिफ़ॉलà¥à¤Ÿ पर रीसेट हो जाà¤à¤—ा और सभी उपयोगकरà¥à¤¤à¤¾ डेटा खो जाà¤à¤—ा."</string>
<string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="4051015943038199910">"आप फ़ोन को अनलॉक करने के लिठ<xliff:g id="NUMBER_0">%d</xliff:g> बार गलत तरीके से पà¥à¤°à¤¯à¤¾à¤¸ कर चà¥à¤•े हैं. <xliff:g id="NUMBER_1">%d</xliff:g> और असफल पà¥à¤°à¤¯à¤¾à¤¸à¥‹à¤‚ के बाद, फ़ोन फ़ैकà¥à¤Ÿà¤°à¥€ डिफ़ॉलà¥à¤Ÿ पर रीसेट हो जाà¤à¤—ा और सभी उपयोगकरà¥à¤¤à¤¾ डेटा खो जाà¤à¤—ा."</string>
<string name="kg_failed_attempts_now_wiping" product="tablet" msgid="2072996269148483637">"आप टेबलेट को अनलॉक करने के लिठ<xliff:g id="NUMBER">%d</xliff:g> बार गलत तरीके से पà¥à¤°à¤¯à¤¾à¤¸ कर चà¥à¤•े हैं. टेबलेट अब फ़ैकà¥â€à¤Ÿà¤°à¥€ डिफ़ॉलà¥â€à¤Ÿ पर रीसेट हो जाà¤à¤—ा."</string>
<string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"आप फ़ोन को अनलॉक करने के लिठ<xliff:g id="NUMBER">%d</xliff:g> बार गलत तरीके से पà¥à¤°à¤¯à¤¾à¤¸ कर चà¥à¤•े हैं. फ़ोन अब फ़ैकà¥à¤Ÿà¤°à¥€ डिफ़ॉलà¥à¤Ÿ पर रीसेट हो जाà¤à¤—ा."</string>
- <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"आपने अपने अनलॉक पà¥à¤°à¤¤à¤¿à¤®à¤¾à¤¨ को <xliff:g id="NUMBER_0">%d</xliff:g> बार गलत तरीके से आरेखित किया है. <xliff:g id="NUMBER_1">%d</xliff:g> और असफल पà¥à¤°à¤¯à¤¾à¤¸à¥‹à¤‚ के बाद, आपसे अपने टेबलेट को किसी ईमेल खाते के उपयोग से अनलॉक करने के लिठकहा जाà¤à¤—ा.\n\n <xliff:g id="NUMBER_2">%d</xliff:g> सेकंड में पà¥à¤¨: पà¥à¤°à¤¯à¤¾à¤¸ करें."</string>
- <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"आपने अपने अनलॉक पà¥à¤°à¤¤à¤¿à¤®à¤¾à¤¨ को <xliff:g id="NUMBER_0">%d</xliff:g> बार गलत तरीके से आरेखित किया है. <xliff:g id="NUMBER_1">%d</xliff:g> और असफल पà¥à¤°à¤¯à¤¾à¤¸à¥‹à¤‚ के बाद, आपसे अपने फ़ोन को किसी ईमेल खाते का उपयोग करके अनलॉक करने के लिठकहा जाà¤à¤—ा.\n\n <xliff:g id="NUMBER_2">%d</xliff:g> सेकंड में पà¥à¤¨: पà¥à¤°à¤¯à¤¾à¤¸ करें."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"आपने अपने अनलॉक आकार को <xliff:g id="NUMBER_0">%d</xliff:g> बार गलत तरीके से आरेखित किया है. <xliff:g id="NUMBER_1">%d</xliff:g> और असफल पà¥à¤°à¤¯à¤¾à¤¸à¥‹à¤‚ के बाद, आपसे अपने टेबलेट को किसी ईमेल खाते के उपयोग से अनलॉक करने के लिठकहा जाà¤à¤—ा.\n\n <xliff:g id="NUMBER_2">%d</xliff:g> सेकंड में पà¥à¤¨: पà¥à¤°à¤¯à¤¾à¤¸ करें."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"आपने अपने अनलॉक आकार को <xliff:g id="NUMBER_0">%d</xliff:g> बार गलत तरीके से आरेखित किया है. <xliff:g id="NUMBER_1">%d</xliff:g> और असफल पà¥à¤°à¤¯à¤¾à¤¸à¥‹à¤‚ के बाद, आपसे अपने फ़ोन को किसी ईमेल खाते का उपयोग करके अनलॉक करने के लिठकहा जाà¤à¤—ा.\n\n <xliff:g id="NUMBER_2">%d</xliff:g> सेकंड में पà¥à¤¨: पà¥à¤°à¤¯à¤¾à¤¸ करें."</string>
<string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
<string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"निकालें"</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"गलत सिम PIN कोड अपने उपकरण को अनलॉक करने के लिठअब आपको अपने वाहक से संपरà¥à¤• करना होगा."</string>
+ <plurals name="kg_password_wrong_pin_code">
+ <item quantity="one" msgid="8134313997799638254">"गलत सिम PIN कोड, अपने उपकरण को अनलॉक करने के लिठअपने वाहक से संपरà¥à¤• करने से पहले आपके पास <xliff:g id="NUMBER">%d</xliff:g> पà¥à¤°à¤¯à¤¾à¤¸ शेष है."</item>
+ <item quantity="other" msgid="2215723361575359486">"गलत सिम PIN कोड, आपके पास <xliff:g id="NUMBER">%d</xliff:g> पà¥à¤°à¤¯à¤¾à¤¸ शेष हैं."</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="7077536808291316208">"सिम अनà¥à¤ªà¤¯à¥‹à¤—ी है. अपने वाहक से संपरà¥à¤• करें."</string>
+ <plurals name="kg_password_wrong_puk_code">
+ <item quantity="one" msgid="3256893607561060649">"गलत सिम PUK कोड, सिम के सà¥à¤¥à¤¾à¤¯à¥€ रूप से अनà¥à¤ªà¤¯à¥‹à¤—ी हो जाने से पहले आपके पास <xliff:g id="NUMBER">%d</xliff:g> पà¥à¤°à¤¯à¤¾à¤¸ शेष है."</item>
+ <item quantity="other" msgid="5477305226026342036">"गलत सिम PUK कोड, सिम के सà¥à¤¥à¤¾à¤¯à¥€ रूप से अनà¥à¤ªà¤¯à¥‹à¤—ी हो जाने से पहले आपके पास <xliff:g id="NUMBER">%d</xliff:g> पà¥à¤°à¤¯à¤¾à¤¸ शेष हैं."</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="6268288093558031564">"सिम PIN की कारà¥à¤¯à¤µà¤¾à¤¹à¥€ विफल रही!"</string>
+ <string name="kg_password_puk_failed" msgid="2838824369502455984">"सिम PUK की कारà¥à¤¯à¤µà¤¾à¤¹à¥€ विफल रही!"</string>
+ <string name="kg_pin_accepted" msgid="1448241673570020097">"कोड सà¥à¤µà¥€à¤•ार किया गया!"</string>
<string name="keyguard_transport_prev_description" msgid="8229108430245669854">"पिछला टà¥à¤°à¥ˆà¤• बटन"</string>
<string name="keyguard_transport_next_description" msgid="4299258300283778305">"अगला टà¥à¤°à¥ˆà¤• बटन"</string>
<string name="keyguard_transport_pause_description" msgid="5093073338238310224">"पॉज़ करें बटन"</string>
diff --git a/packages/Keyguard/res/values-hr/strings.xml b/packages/Keyguard/res/values-hr/strings.xml
index 70e6305..3843549 100644
--- a/packages/Keyguard/res/values-hr/strings.xml
+++ b/packages/Keyguard/res/values-hr/strings.xml
@@ -21,9 +21,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"Unesite PIN kôd"</string>
- <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"Unesite PUK i novi PIN kôd"</string>
- <string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"PUK kôd"</string>
- <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"Novi PIN kôd"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="3035856550289724338">"Unesite PUK i novi PIN kôd SIM kartice"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="1801941051094974609">"PUK kôd SIM kartice"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="3201151840570492538">"Novi PIN kôd SIM kartice"</string>
<string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"Dodirnite za tipkanje zaporke"</font></string>
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Unesite zaporku za otkljuÄavanje"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Unesite PIN za otkljuÄavanje"</string>
@@ -71,6 +71,13 @@
<string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Gumb Pauza"</string>
<string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Gumb Reprodukcija"</string>
<string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Gumb Zaustavi"</string>
+ <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Palac gore"</string>
+ <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Palac dolje"</string>
+ <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Srce"</string>
+ <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"OtkljuÄajte za nastavak"</string>
+ <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Pokretanje je otkazano"</string>
+ <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Ispustite widget <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> da biste ga izbrisali."</string>
+ <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"Widget <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> neće se izbrisati."</string>
<string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
<string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
<string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
@@ -105,7 +112,6 @@
<string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"Upišite željeni PIN kôd"</string>
<string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"Potvrdite željeni PIN kôd"</string>
<string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"OtkljuÄavanje SIM kartice…"</string>
- <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"NetoÄan PIN kôd."</string>
<string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"Unesite PIN koji ima od 4 do 8 brojeva."</string>
<string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"PUK kôd treba imati 8 brojeva ili više."</string>
<string name="kg_invalid_puk" msgid="3638289409676051243">"Ponovo unesite ispravan PUK kôd. Ponovljeni pokušaji trajno će onemogućiti SIM."</string>
@@ -129,6 +135,19 @@
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"NetoÄno ste iscrtali obrazac za otkljuÄavanje <xliff:g id="NUMBER_0">%d</xliff:g> puta. Nakon joÅ¡ ovoliko neuspjeÅ¡nih pokuÅ¡aja: <xliff:g id="NUMBER_1">%d</xliff:g> morat ćete otkljuÄati telefon pomoću raÄuna e-poÅ¡te.\n\n PokuÅ¡ajte ponovo za <xliff:g id="NUMBER_2">%d</xliff:g> s."</string>
<string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" – "</string>
<string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Ukloni"</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"NetoÄan PIN kôd SIM kartice; sada morate kontaktirati svog mobilnog operatera da bi otkljuÄao vaÅ¡ ureÄ‘aj."</string>
+ <plurals name="kg_password_wrong_pin_code">
+ <item quantity="one" msgid="8134313997799638254">"NetoÄan PIN kôd SIM kartice; imate joÅ¡ <xliff:g id="NUMBER">%d</xliff:g> pokuÅ¡aj prije nego Å¡to budete morali kontaktirati svog mobilnog operatera da bi otkljuÄao vaÅ¡ ureÄ‘aj."</item>
+ <item quantity="other" msgid="2215723361575359486">"NetoÄan PIN kôd SIM kartice; imate joÅ¡ ovoliko preostalih pokuÅ¡aja: <xliff:g id="NUMBER">%d</xliff:g>."</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="7077536808291316208">"SIM kartica nije upotrebljiva. Kontaktirajte svog mobilnog operatera."</string>
+ <plurals name="kg_password_wrong_puk_code">
+ <item quantity="one" msgid="3256893607561060649">"NetoÄan PUK kôd SIM kartice; imate joÅ¡ <xliff:g id="NUMBER">%d</xliff:g> pokuÅ¡aj prije nego Å¡to SIM kartica postane trajno neupotrebljiva."</item>
+ <item quantity="other" msgid="5477305226026342036">"NetoÄan PUK kôd SIM kartice; imate joÅ¡ nekoliko preostalih pokuÅ¡aja (<xliff:g id="NUMBER">%d</xliff:g>) prije nego Å¡to SIM kartica postane trajno neupotrebljiva."</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="6268288093558031564">"Operacija PIN-a SIM kartice nije uspjela!"</string>
+ <string name="kg_password_puk_failed" msgid="2838824369502455984">"Operacija PUK-a SIM kartice nije uspjela!"</string>
+ <string name="kg_pin_accepted" msgid="1448241673570020097">"Kôd je prihvaćen!"</string>
<string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Gumb Prethodni zapis"</string>
<string name="keyguard_transport_next_description" msgid="4299258300283778305">"Gumb Sljedeći zapis"</string>
<string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Gumb Pauza"</string>
diff --git a/packages/Keyguard/res/values-hu/strings.xml b/packages/Keyguard/res/values-hu/strings.xml
index 611602e..0f32019 100644
--- a/packages/Keyguard/res/values-hu/strings.xml
+++ b/packages/Keyguard/res/values-hu/strings.xml
@@ -21,9 +21,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"Ãrja be a PIN kódot"</string>
- <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"Ãrja be a PUK kódot, majd az új PIN kódot"</string>
- <string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"PUK kód"</string>
- <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"Új PIN kód"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="3035856550289724338">"Ãrja be a SIM kártya PUK kódját, majd az új PIN kódot"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="1801941051094974609">"SIM kártya PUK kódja"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="3201151840570492538">"Új PIN kód a SIM kártyához"</string>
<string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"Érintsen jelszó megadásához"</font></string>
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"A feloldáshoz írja be a jelszót"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Feloldáshoz írja be a PIN kódot"</string>
@@ -71,6 +71,13 @@
<string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Szünet gomb"</string>
<string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Lejátszás gomb"</string>
<string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Leállítás gomb"</string>
+ <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Tetszik"</string>
+ <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Nem tetszik"</string>
+ <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Szív"</string>
+ <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"A folytatáshoz oldja fel a billentyűzárat"</string>
+ <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Indítás törölve"</string>
+ <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Engedje el a(z) <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> törléséhez."</string>
+ <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"A(z) <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> nem lesz törölve."</string>
<string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
<string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
<string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
@@ -105,7 +112,6 @@
<string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"Kívánt PIN kód megadása"</string>
<string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"Kívánt PIN kód megerősítése"</string>
<string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"SIM kártya feloldása..."</string>
- <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"Helytelen PIN kód."</string>
<string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"4–8 számjegyű PIN kódot írjon be."</string>
<string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"A PUK kód legalább 8 számjegyből kell, hogy álljon."</string>
<string name="kg_invalid_puk" msgid="3638289409676051243">"Adja meg újra a helyes PUK kódot. Az ismételt próbálkozással véglegesen letiltja a SIM kártyát."</string>
@@ -129,6 +135,19 @@
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"<xliff:g id="NUMBER_0">%d</xliff:g> alkalommal helytelenül rajzolta le a feloldási mintát. További <xliff:g id="NUMBER_1">%d</xliff:g> sikertelen kísérlet után egy e-mail fiók használatával kell feloldania a telefonját.\n\n Kérjük, próbálja újra <xliff:g id="NUMBER_2">%d</xliff:g> másodperc múlva."</string>
<string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" – "</string>
<string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Eltávolítás"</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"Helytelen PIN kód a SIM kártyához; vegye fel a kapcsolatot szolgáltatójával az eszköz feloldásához."</string>
+ <plurals name="kg_password_wrong_pin_code">
+ <item quantity="one" msgid="8134313997799638254">"Helytelen PIN kód a SIM kártyához; még <xliff:g id="NUMBER">%d</xliff:g> próbálkozása van, mielőtt fel kellene vennie a kapcsolatot szolgáltatójával az eszköz feloldásához."</item>
+ <item quantity="other" msgid="2215723361575359486">"Helytelen PIN kód a SIM kártyához; még <xliff:g id="NUMBER">%d</xliff:g> próbálkozása van."</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="7077536808291316208">"A SIM kártya használhatatlan. Vegye fel a kapcsolatot szolgáltatójával."</string>
+ <plurals name="kg_password_wrong_puk_code">
+ <item quantity="one" msgid="3256893607561060649">"Helytelen PUK kód a SIM kártyához; még <xliff:g id="NUMBER">%d</xliff:g> próbálkozása van, mielőtt a SIM kártya végleg használhatatlan lesz."</item>
+ <item quantity="other" msgid="5477305226026342036">"Helytelen PUK kód a SIM kártyához; még <xliff:g id="NUMBER">%d</xliff:g> próbálkozása van, mielőtt a SIM kártya végleg használhatatlan lesz."</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="6268288093558031564">"A SIM kártya PIN-művelete sikertelen!"</string>
+ <string name="kg_password_puk_failed" msgid="2838824369502455984">"A SIM kártya PUK-művelete sikertelen!"</string>
+ <string name="kg_pin_accepted" msgid="1448241673570020097">"Kód elfogadva."</string>
<string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Előző szám gomb"</string>
<string name="keyguard_transport_next_description" msgid="4299258300283778305">"Következő szám gomb"</string>
<string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Szünet gomb"</string>
diff --git a/packages/Keyguard/res/values-hy-rAM/strings.xml b/packages/Keyguard/res/values-hy-rAM/strings.xml
new file mode 100644
index 0000000..ff87920
--- /dev/null
+++ b/packages/Keyguard/res/values-hy-rAM/strings.xml
@@ -0,0 +1,157 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"Õ„Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ¥Ö„ PIN Õ¯Õ¸Õ¤Õ¨"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="3035856550289724338">"Õ„Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ¥Ö„ SIM PUK-Õ¨ Ö‡ Õ¶Õ¸Ö€ PIN Õ¯Õ¸Õ¤Õ¨"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="1801941051094974609">"SIM PUK Õ¯Õ¸Õ¤Õ¨"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="3201151840570492538">"Õ†Õ¸Ö€ SIM PIN Õ¯Õ¸Õ¤Õ¨"</string>
+ <string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"Õ€ÕºÕ¥Ö„` Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ¨ Õ´Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€"</font></string>
+ <string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Õ„Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ¥Ö„ Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ¨ Õ¡ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ´Õ¡Õ¶ Õ°Õ¡Õ´Õ¡Ö€"</string>
+ <string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Õ„Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ¥Ö„ PIN-Õ¨ Õ¡ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ´Õ¡Õ¶ Õ°Õ¡Õ´Õ¡Ö€"</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"ÕÕ­Õ¡Õ¬ PIN Õ®Õ¡Õ®Õ¯Õ¡Õ£Õ«Ö€:"</string>
+ <string name="keyguard_label_text" msgid="861796461028298424">"Ô±ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ´Õ¡Õ¶ Õ°Õ¡Õ´Õ¡Ö€ Õ½Õ¥Õ²Õ´Õ¥Ö„ Õ‘Õ¡Õ¶Õ¯, Õ¡ÕºÕ¡ 0:"</string>
+ <string name="faceunlock_multiple_failures" msgid="754137583022792429">"Ô±Õ¼Õ¡Õ¾Õ¥Õ¬Õ¡Õ£Õ¸Ö‚ÕµÕ¶ Ô´Õ¥Õ´Ö„Õ¸Õ¾ Õ¡ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ´Õ¡Õ¶ ÖƒÕ¸Ö€Õ±Õ¥Ö€Õ¨ Õ£Õ¥Ö€Õ¡Õ¦Õ¡Õ¶ÖÕ¾Õ¡Õ® Õ¥Õ¶"</string>
+ <string name="keyguard_charged" msgid="3272223906073492454">"Ô¼Õ«ÖÖ„Õ¡Õ¾Õ¸Ö€Õ¾Õ¡Õ® Õ§"</string>
+ <string name="keyguard_plugged_in" msgid="8117572000639998388">"Ô¼Õ«ÖÖ„Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´, <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+ <string name="keyguard_low_battery" msgid="8143808018719173859">"Õ„Õ«Õ¡ÖÖ€Õ¥Ö„ Õ±Õ¥Ö€ Õ¬Õ«ÖÖ„Õ¡Õ¾Õ¸Ö€Õ«Õ¹Õ¨:"</string>
+ <string name="keyguard_instructions_when_pattern_disabled" msgid="1332288268600329841">"Ô±ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€ Õ½Õ¥Õ²Õ´Õ¥Ö„ Õ‘Õ¡Õ¶Õ¯Õ¨:"</string>
+ <string name="keyguard_network_locked_message" msgid="9169717779058037168">"Õ‘Õ¡Õ¶ÖÕ¨ Õ¯Õ¸Õ²ÕºÕ¾Õ¡Õ® Õ§"</string>
+ <string name="keyguard_missing_sim_message_short" msgid="494980561304211931">"SIM Ö„Õ¡Ö€Õ¿ Õ¹Õ¯Õ¡"</string>
+ <string name="keyguard_missing_sim_message" product="tablet" msgid="1445849005909260039">"Ô³Ö€Õ¡Õ½Õ¡Õ¬Õ«Õ¯Õ¸Ö‚Õ´ SIM Ö„Õ¡Ö€Õ¿ Õ¹Õ¯Õ¡:"</string>
+ <string name="keyguard_missing_sim_message" product="default" msgid="3481110395508637643">"Õ€Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ« Õ´Õ¥Õ» SIM Ö„Õ¡Ö€Õ¿ Õ¹Õ¯Õ¡:"</string>
+ <string name="keyguard_missing_sim_instructions" msgid="5210891509995942250">"Ô¶Õ¥Õ¿Õ¥Õ²Õ¥Ö„ SIM Ö„Õ¡Ö€Õ¿Õ¨:"</string>
+ <string name="keyguard_missing_sim_instructions_long" msgid="5968985489463870358">"SIM Ö„Õ¡Ö€Õ¿Õ¨ Õ¢Õ¡ÖÕ¡Õ¯Õ¡ÕµÕ¸Ö‚Õ´ Õ§ Õ¯Õ¡Õ´ Õ¹Õ« Õ¯Õ¡Ö€Õ¸Õ² Õ¯Õ¡Ö€Õ¤Õ¡ÖÕ¾Õ¥Õ¬: Õ„Õ¿ÖÖ€Õ¥Ö„ SIM Ö„Õ¡Ö€Õ¿:"</string>
+ <string name="keyguard_permanent_disabled_sim_message_short" msgid="8340813989586622356">"Ô±Õ¶ÕºÕ«Õ¿Õ¡Õ¶ SIM Ö„Õ¡Ö€Õ¿:"</string>
+ <string name="keyguard_permanent_disabled_sim_instructions" msgid="5892940909699723544">"ÕÕ¥Ö€ SIM Ö„Õ¡Ö€Õ¿Õ¨ Õ¨Õ¶Õ¤Õ´Õ«Õ·Õ¿ Õ¯Õ¡Õ½Õ¥ÖÕ¾Õ¥Õ¬ Õ§:\nÔ¿Õ¡ÕºÕ¾Õ¥Ö„ Õ±Õ¥Ö€ Õ¢Õ»Õ»Õ¡ÕµÕ«Õ¶ Õ®Õ¡Õ¼Õ¡ÕµÕ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ´Õ¡Õ¿Õ¡Õ¯Õ¡Ö€Õ¡Ö€Õ« Õ°Õ¥Õ¿ Õ¶Õ¸Ö€ SIM Ö„Õ¡Ö€Õ¿ Õ±Õ¥Õ¼Ö„ Õ¢Õ¥Ö€Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€:"</string>
+ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM Ö„Õ¡Ö€Õ¿Õ¨ Õ¯Õ¸Õ²ÕºÕ¾Õ¡Õ® Õ§:"</string>
+ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM Ö„Õ¡Ö€Õ¿Õ¨ PUK-Õ¸Õ¾ Õ¯Õ¸Õ²ÕºÕ¾Õ¡Õ® Õ§:"</string>
+ <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"SIM Ö„Õ¡Ö€Õ¿Õ¨ Õ¡ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ¾Õ¸Ö‚Õ´ Õ§..."</string>
+ <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. ÕŽÕ«Õ»Õ¥Õ© %2$d of %3$d:"</string>
+ <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Ô±Õ¾Õ¥Õ¬Õ¡ÖÕ¶Õ¥Õ¬ Õ¾Õ«Õ»Õ¥Õ©:"</string>
+ <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Ô´Õ¡Õ¿Õ¡Ö€Õ¯"</string>
+ <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Ô±ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ´Õ¡Õ¶ Õ¿Õ¡Ö€Õ¡Õ®Ö„Õ¶ Õ¨Õ¶Õ¤Õ¬Õ¡ÕµÕ¶Õ¾Õ¡Õ® Õ§:"</string>
+ <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Ô±ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ´Õ¡Õ¶ Õ¿Õ¡Ö€Õ¡Õ®Ö„Õ¨ Õ¥Õ¿ Õ§ Õ®Õ¡Õ¬Õ¾Õ¡Õ®:"</string>
+ <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> Õ¾Õ«Õ»Õ¥Õ©:"</string>
+ <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"Õ•Õ£Õ¿Õ¾Õ¸Õ²Õ« Õ¨Õ¶Õ¿Ö€Õ«Õ¹"</string>
+ <string name="keyguard_accessibility_status" msgid="8008264603935930611">"Ô¿Õ¡Ö€Õ£Õ¡Õ¾Õ«Õ³Õ¡Õ¯"</string>
+ <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Õ–Õ¸Õ¿Õ¸Õ­ÖÕ«Õ¯"</string>
+ <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Õ„Õ¥Õ¤Õ«Õ¡ Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´Õ¶Õ¥Ö€"</string>
+ <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"ÕŽÕ«Õ»Õ¥Õ©Õ¶Õ¥Ö€Õ« Õ¾Õ¥Ö€Õ¡Õ¤Õ¡Õ½Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´Õ¨ Õ´Õ¥Õ¯Õ¶Õ¡Ö€Õ¯Õ¥Õ¬ Õ§:"</string>
+ <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"ÕŽÕ«Õ»Õ¥Õ©Õ« Õ¾Õ¥Ö€Õ¡Õ¤Õ¡Õ½Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´Õ¶ Õ¡Õ¾Õ¡Ö€Õ¿Õ¾Õ¥Ö:"</string>
+ <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"ÕŽÕ«Õ»Õ¥Õ© <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>-Õ¨ Õ»Õ¶Õ»Õ¾Õ¡Õ® Õ§:"</string>
+ <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Ô¸Õ¶Õ¤Õ¬Õ¡ÕµÕ¶Õ¥Õ¬ Õ¡ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ´Õ¡Õ¶ Õ¿Õ¡Ö€Õ¡Õ®Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨:"</string>
+ <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Ô·Õ»Õ« Õ¡ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ¸Ö‚Õ´:"</string>
+ <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"ÕÕ­Õ¥Õ´Õ¡ÕµÕ¸Õ¾ Õ¡ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ¸Ö‚Õ´:"</string>
+ <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Ô´Õ¥Õ´Ö„Õ¸Õ¾ Õ¡ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ¸Ö‚Õ´:"</string>
+ <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Pin-Õ¶ Õ¡ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ¾Õ¡Õ® Õ§:"</string>
+ <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Ô³Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ« Õ¡ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ¸Ö‚Õ´:"</string>
+ <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"ÕÕ­Õ¥Õ´Õ¡ÕµÕ« Õ¿Õ¡Ö€Õ¡Õ®Ö„:"</string>
+ <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"ÕÕ¡Õ°Õ¥ÖÕ´Õ¡Õ¶ Õ¿Õ¡Ö€Õ¡Õ®Ö„:"</string>
+ <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"Õ†Õ¡Õ­Õ¸Ö€Õ¤ Õ°Õ¥Õ¿Õ¡Õ£Õ®Õ« Õ¯Õ¸Õ³Õ¡Õ¯Õ¨"</string>
+ <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"Õ€Õ¡Õ»Õ¸Ö€Õ¤ Õ°Õ¥Õ¿Õ¡Õ£Õ®Õ« Õ¯Õ¸Õ³Õ¡Õ¯Õ¨"</string>
+ <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Ô´Õ¡Õ¤Õ¡Ö€Õ« Õ¯Õ¸Õ³Õ¡Õ¯"</string>
+ <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Õ†Õ¾Õ¡Õ£Õ¡Ö€Õ¯Õ´Õ¡Õ¶ Õ¯Õ¸Õ³Õ¡Õ¯"</string>
+ <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Ô¿Õ¡Õ¶Õ£Õ« Õ¯Õ¸Õ³Õ¡Õ¯"</string>
+ <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Ô¼Õ¡Õ¾Õ¶ Õ§"</string>
+ <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Ô¼Õ¡Õ¾Õ¨ Õ¹Õ§"</string>
+ <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"ÕÕ«Ö€Õ¿"</string>
+ <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Õ‡Õ¡Ö€Õ¸Ö‚Õ¶Õ¡Õ¯Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€ Õ¡ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ¥Ö„"</string>
+ <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Ô³Õ¸Ö€Õ®Õ¡Ö€Õ¯Õ¸Ö‚Õ´Õ¨ Õ¹Õ¥Õ²Õ¡Ö€Õ¯Õ¾Õ¥Ö"</string>
+ <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> Õ¾Õ«Õ»Õ¥Õ©Õ¨ Õ»Õ¶Õ»Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€ Õ¢Õ¡Ö Õ©Õ¸Õ²Õ¥Ö„ Õ¡ÕµÕ¶ Õ¡ÕµÕ½Õ¿Õ¥Õ²:"</string>
+ <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> Õ¾Õ«Õ»Õ¥Õ©Õ¨ Õ¹Õ« Õ»Õ¶Õ»Õ¾Õ«:"</string>
+ <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
+ <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
+ <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
+ <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
+ <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"Õ‰Õ¥Õ²Õ¡Ö€Õ¯Õ¥Õ¬"</string>
+ <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Õ‹Õ¶Õ»Õ¥Õ¬"</string>
+ <string name="keyboardview_keycode_done" msgid="1992571118466679775">"Ô¿Õ¡Õ¿Õ¡Ö€Õ¾Õ¡Õ® Õ§"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Ռեժիմի փոփոխում"</string>
+ <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
+ <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Õ„Õ¸Ö‚Õ¿Ö„"</string>
+ <string name="description_target_unlock" msgid="2228524900439801453">"Ô±ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ¥Õ¬"</string>
+ <string name="description_target_camera" msgid="969071997552486814">"Õ–Õ¸Õ¿Õ¸Õ­ÖÕ«Õ¯"</string>
+ <string name="description_target_silent" msgid="893551287746522182">"Ô¼Õ¸Ö‚Õ¼"</string>
+ <string name="description_target_soundon" msgid="30052466675500172">"ÕÕ¡ÕµÕ¶Õ¨ Õ´Õ«Õ¡ÖÕ¶Õ¥Õ¬"</string>
+ <string name="description_target_search" msgid="3091587249776033139">"ÕˆÖ€Õ¸Õ¶Õ¥Õ¬"</string>
+ <string name="description_direction_up" msgid="7169032478259485180">"ÕÕ¡Õ°Õ¥ÖÖ€Õ¥Ö„ Õ¾Õ¥Ö€Ö‡ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>-Õ« Õ°Õ¡Õ´Õ¡Ö€:"</string>
+ <string name="description_direction_down" msgid="5087739728639014595">"ÕÕ¡Õ°Õ¥ÖÖ€Õ¥Ö„ ÖÕ¡Õ® <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>-Õ« Õ°Õ¡Õ´Õ¡Ö€:"</string>
+ <string name="description_direction_left" msgid="7207478719805562165">"ÕÕ¡Õ°Õ¥ÖÖ€Õ¥Ö„ Õ±Õ¡Õ­` <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>-Õ« Õ°Õ¡Õ´Õ¡Ö€:"</string>
+ <string name="description_direction_right" msgid="8034433242579600980">"ÕÕ¡Õ°Õ¥ÖÖ€Õ¥Ö„ Õ¡Õ»` <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>-Õ« Õ°Õ¡Õ´Õ¡Ö€:"</string>
+ <string name="user_switched" msgid="3768006783166984410">"Õ†Õ¥Ö€Õ¯Õ¡ÕµÕ«Õ½ Ö…Õ£Õ¿Õ¾Õ¸Õ²Õ¨ <xliff:g id="NAME">%1$s</xliff:g>:"</string>
+ <string name="kg_emergency_call_label" msgid="684946192523830531">"Ô±Ö€Õ¿Õ¡Õ¯Õ¡Ö€Õ£ Õ«Ö€Õ¡Õ¾Õ«Õ³Õ¡Õ¯Õ« Õ°Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ¡Õ¦Õ¡Õ¶Õ£"</string>
+ <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Õ„Õ¸Õ¼Õ¡ÖÕ¥Õ¬ Õ¥Õ´ Õ½Õ­Õ¥Õ´Õ¡Õ¶"</string>
+ <string name="kg_wrong_pattern" msgid="1850806070801358830">"ÕÕ­Õ¡Õ¬ Õ½Õ­Õ¥Õ´Õ¡"</string>
+ <string name="kg_wrong_password" msgid="2333281762128113157">"ÕÕ­Õ¡Õ¬ Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼"</string>
+ <string name="kg_wrong_pin" msgid="1131306510833563801">"ÕÕ­Õ¡Õ¬ PIN"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"Õ“Õ¸Ö€Õ±Õ¥Ö„ Õ¯Ö€Õ¯Õ«Õ¶ <xliff:g id="NUMBER">%d</xliff:g> Õ¾Õ¡ÕµÖ€Õ¯ÕµÕ¡Õ¶Õ«Ö:"</string>
+ <string name="kg_pattern_instructions" msgid="398978611683075868">"Õ€Õ¡Õ¾Õ¡Ö„Õ¥Ö„ Õ±Õ¥Ö€ Õ½Õ­Õ¥Õ´Õ¡Õ¶"</string>
+ <string name="kg_sim_pin_instructions" msgid="2319508550934557331">"Õ„Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ¥Ö„ SIM-Õ« PIN-Õ¨"</string>
+ <string name="kg_pin_instructions" msgid="2377242233495111557">"Õ„Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ¥Ö„ PIN-Õ¨"</string>
+ <string name="kg_password_instructions" msgid="5753646556186936819">"Õ„Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ¥Ö„ Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ¨"</string>
+ <string name="kg_puk_enter_puk_hint" msgid="453227143861735537">"SIM-Õ¨ Õ¡ÕµÕ½ ÕºÕ¡Õ°Õ«Õ¶ Õ¡Õ¶Õ»Õ¡Õ¿Õ¾Õ¡Õ® Õ§: Õ„Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ¥Ö„ PUK Õ¯Õ¸Õ¤Õ¨ Õ·Õ¡Ö€Õ¸Ö‚Õ¶Õ¡Õ¯Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€: Õ„Õ¡Õ¶Ö€Õ¡Õ´Õ¡Õ½Õ¶Õ¥Ö€Õ« Õ°Õ¡Õ´Õ¡Ö€ Õ¯Õ¡ÕºÕ¾Õ¥Ö„ Ö…ÕºÕ¥Ö€Õ¡Õ¿Õ¸Ö€Õ« Õ°Õ¥Õ¿:"</string>
+ <string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"Õ„Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ¥Ö„ ÖÕ¡Õ¶Õ¯Õ¡Õ¬Õ« PIN Õ®Õ¡Õ®Õ¯Õ¡Õ£Õ«Ö€Õ¨"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"Õ€Õ¡Õ½Õ¿Õ¡Õ¿Õ¥Ö„ ÖÕ¡Õ¶Õ¯Õ¡Õ¬Õ« PIN Õ®Õ¡Õ®Õ¯Õ¡Õ£Õ«Ö€Õ¨"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"Ô±ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ¸Ö‚Õ´ Õ§ SIM Ö„Õ¡Ö€Õ¿Õ¨ ..."</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"Մուտքագրեք PIN, Õ¸Ö€Õ¨ 4-Õ«Ö 8 Õ©Õ«Õ¾ Õ§:"</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"PUK Õ¯Õ¸Õ¤Õ¨ ÕºÕ¥Õ¿Ö„ Õ§ Õ¬Õ«Õ¶Õ« 8 Õ¯Õ¡Õ´ Õ¡Õ¾Õ¥Õ¬Õ« Õ©Õ«Õ¾:"</string>
+ <string name="kg_invalid_puk" msgid="3638289409676051243">"ÕŽÕ¥Ö€Õ¡Õ´Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ¥Ö„ Õ³Õ«Õ·Õ¿ PUK Õ®Õ¡Õ®Õ¯Õ¡Õ£Õ«Ö€Õ¨: Ô¿Ö€Õ¯Õ¶Õ¾Õ¸Õ² ÖƒÕ¸Ö€Õ±Õ¥Ö€Õ¨ Õ¨Õ¶Õ¤Õ´Õ«Õ·Õ¿ Õ¯Õ¯Õ¡Õ½Õ¥ÖÕ¶Õ¥Õ¶ SIM Ö„Õ¡Ö€Õ¿Õ¨:"</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"PIN Õ®Õ¡Õ®Õ¯Õ¡Õ£Ö€Õ¥Ö€Õ¨ Õ¹Õ¥Õ¶ Õ°Õ¡Õ´Õ¨Õ¶Õ¯Õ¶Õ¸Ö‚Õ´"</string>
+ <string name="kg_login_too_many_attempts" msgid="6486842094005698475">"Õ‰Õ¡ÖƒÕ«Ö Õ·Õ¡Õ¿ Õ½Õ­Õ¥Õ´Õ¡ÕµÕ« ÖƒÕ¸Ö€Õ±Õ¥Ö€"</string>
+ <string name="kg_login_instructions" msgid="1100551261265506448">"Ô±ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€` Õ´Õ¸Ö‚Õ¿Ö„ Õ£Õ¸Ö€Õ®Õ¥Ö„ Õ±Õ¥Ö€ Google Õ°Õ¡Õ·Õ¾Õ¸Õ¾:"</string>
+ <string name="kg_login_username_hint" msgid="5718534272070920364">"Õ•Õ£Õ¿Õ¡Õ¶Õ¸Ö‚Õ¶ (Õ§Õ¬ÖƒÕ¸Õ½Õ¿)"</string>
+ <string name="kg_login_password_hint" msgid="9057289103827298549">"Ô³Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ¨"</string>
+ <string name="kg_login_submit_button" msgid="5355904582674054702">"Õ„Õ¸Ö‚Õ¿Ö„ Õ£Õ¸Ö€Õ®Õ¥Õ¬"</string>
+ <string name="kg_login_invalid_input" msgid="5754664119319872197">"ÕÕ­Õ¡Õ¬ Ö…Õ£Õ¿Õ¡Õ¶Õ¸Ö‚Õ¶ Õ¯Õ¡Õ´ Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼:"</string>
+ <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"Õ„Õ¸Õ¼Õ¡ÖÕ¥ÕžÕ¬ Õ¥Ö„ Õ±Õ¥Ö€ Ö…Õ£Õ¿Õ¡Õ¶Õ¸Ö‚Õ¶Õ¨ Õ¯Õ¡Õ´ Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ¨:\nÔ±ÕµÖÕ¥Õ¬Õ¥Ö„ "<b>"google.com /accounts/recovery"</b>":"</string>
+ <string name="kg_login_checking_password" msgid="1052685197710252395">"Õ€Õ¡Õ·Õ«Õ¾Õ¨ Õ½Õ¿Õ¸Ö‚Õ£Õ¾Õ¸Ö‚Õ´ Õ§..."</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"Դուք <xliff:g id="NUMBER_0">%d</xliff:g> Õ¡Õ¶Õ£Õ¡Õ´ Õ½Õ­Õ¡Õ¬ Õ¥Ö„ Õ´Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ¥Õ¬ Õ±Õ¥Ö€ PIN-Õ¨: \n\nÕ“Õ¸Ö€Õ±Õ¥Ö„ Õ¯Ö€Õ¯Õ«Õ¶ <xliff:g id="NUMBER_1">%d</xliff:g> Õ¾Õ¡ÕµÖ€Õ¯ÕµÕ¡Õ¶Õ«Ö:"</string>
+ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"Ô´Õ¸Ö‚Ö„ Õ½Õ­Õ¡Õ¬ Õ¥Ö„ Õ´Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ¥Õ¬ Õ±Õ¥Ö€ Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ¨ <xliff:g id="NUMBER_0">%d</xliff:g> Õ¡Õ¶Õ£Õ¡Õ´: \n\nÕ“Õ¸Ö€Õ±Õ¥Ö„ Õ¯Ö€Õ¯Õ«Õ¶ <xliff:g id="NUMBER_1">%d</xliff:g> Õ¾Õ¡ÕµÖ€Õ¯ÕµÕ¡Õ¶Õ«Ö:"</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"Դուք <xliff:g id="NUMBER_0">%d</xliff:g> Õ¡Õ¶Õ£Õ¡Õ´ Õ½Õ­Õ¡Õ¬ Õ¥Ö„ Õ°Õ¡Õ¾Õ¡Ö„Õ¥Õ¬ Õ±Õ¥Ö€ Õ¡ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ´Õ¡Õ¶ Õ½Õ­Õ¥Õ´Õ¡Õ¶: \n\nÕ“Õ¸Ö€Õ±Õ¥Ö„ Õ¯Ö€Õ¯Õ«Õ¶ <xliff:g id="NUMBER_1">%d</xliff:g> Õ¾Õ¡ÕµÖ€Õ¯ÕµÕ¡Õ¶Õ«Ö:"</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1575557200627128949">"Դուք <xliff:g id="NUMBER_0">%d</xliff:g> Õ¡Õ¶Õ£Õ¡Õ´ Õ½Õ­Õ¡Õ¬ ÖƒÕ¸Ö€Õ± Õ¥Ö„ Õ¡Ö€Õ¥Õ¬ Õ£Ö€Õ¡Õ½Õ¡Õ¬Õ«Õ¯Õ¶ Õ¡ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€: <xliff:g id="NUMBER_1">%d</xliff:g> Õ¡Õ¶Õ£Õ¡Õ´Õ«Ö Õ¡Õ¾Õ¥Õ¬ Õ¡Õ¶Õ°Õ¡Õ»Õ¸Õ² ÖƒÕ¸Ö€Õ±Õ¥Ö€Õ«Ö Õ°Õ¥Õ¿Õ¸ Õ£Ö€Õ¡Õ½Õ¡Õ¬Õ«Õ¯Õ¨ Õ¯Õ¾Õ¥Ö€Õ¡Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¾Õ« Õ£Õ¸Ö€Õ®Õ¡Ö€Õ¡Õ¶Õ¡ÕµÕ«Õ¶ Õ¬Õ¼Õ¥Õ¬ÕµÕ¡ÕµÕ¶Õ«, Ö‡ Ö…Õ£Õ¿Õ¾Õ¸Õ²Õ« Õ¢Õ¸Õ¬Õ¸Ö€ Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨ Õ¯Õ¯Õ¸Ö€Õ¥Õ¶:"</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="4051015943038199910">"Դուք <xliff:g id="NUMBER_0">%d</xliff:g> Õ¡Õ¶Õ£Õ¡Õ´ Õ½Õ­Õ¡Õ¬ ÖƒÕ¸Ö€Õ± Õ¥Ö„ Õ¡Ö€Õ¥Õ¬ Õ°Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ¶ Õ¡ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€: <xliff:g id="NUMBER_1">%d</xliff:g> Õ¡Õ¶Õ£Õ¡Õ´Õ«Ö Õ¡Õ¾Õ¥Õ¬ Õ¡Õ¶Õ°Õ¡Õ»Õ¸Õ² ÖƒÕ¸Ö€Õ±Õ¥Ö€Õ«Ö Õ°Õ¥Õ¿Õ¸ Õ°Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ¨ Õ¯Õ¾Õ¥Ö€Õ¡Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¾Õ« Õ£Õ¸Ö€Õ®Õ¡Ö€Õ¡Õ¶Õ¡ÕµÕ«Õ¶ Õ¬Õ¼Õ¥Õ¬ÕµÕ¡ÕµÕ¶Õ«, Ö‡ Ö…Õ£Õ¿Õ¾Õ¸Õ²Õ« Õ¢Õ¸Õ¬Õ¸Ö€ Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨ Õ¯Õ¯Õ¸Ö€Õ¥Õ¶:"</string>
+ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="2072996269148483637">"Ô´Õ¸Ö‚Ö„ <xliff:g id="NUMBER">%d</xliff:g> Õ¡Õ¶Õ£Õ¡Õ´ Õ½Õ­Õ¡Õ¬ ÖƒÕ¸Ö€Õ± Õ¥Ö„ Õ¡Ö€Õ¥Õ¬ Õ£Ö€Õ¡Õ½Õ¡Õ¬Õ«Õ¯Õ¶ Õ¡ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€: Ô³Ö€Õ¡Õ½Õ¡Õ¬Õ«Õ¯Õ¶ Õ¡ÕµÕªÕ´ Õ¯Õ¾Õ¥Ö€Õ¡Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¾Õ« Õ£Õ¸Ö€Õ®Õ¡Ö€Õ¡Õ¶Õ¡ÕµÕ«Õ¶ Õ¬Õ¼Õ¥Õ¬ÕµÕ¡ÕµÕ¶Õ«:"</string>
+ <string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"Դուք <xliff:g id="NUMBER">%d</xliff:g> անգամ սխալ փորձ եք արել հեռախոսն ապակողպելու համար: Հեռախոսն այժմ կվերակարգավորվի գործարանային լռելյայնի:"</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Ô´Õ¸Ö‚Ö„ Õ½Õ­Õ¡Õ¬ Õ¥Ö„ Õ°Õ¡Õ¾Õ¡Ö„Õ¥Õ¬ Õ±Õ¥Ö€ Õ¡ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ´Õ¡Õ¶ Õ½Õ­Õ¥Õ´Õ¡Õ¶ <xliff:g id="NUMBER_0">%d</xliff:g> Õ¡Õ¶Õ£Õ¡Õ´: ÔµÕ¾Õ½ <xliff:g id="NUMBER_1">%d</xliff:g> Õ¡Õ¶Õ°Õ¡Õ»Õ¸Õ² ÖƒÕ¸Ö€Õ±Õ«Ö Õ°Õ¥Õ¿Õ¸ Õ±Õ¥Õ¦Õ¡Õ¶Õ«Ö Õ¯ÕºÕ¡Õ°Õ¡Õ¶Õ»Õ¾Õ« Õ¡ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ¥Õ¬ Õ±Õ¥Ö€ Õ£Ö€Õ¡Õ½Õ¡Õ¬Õ«Õ¯Õ¨` Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¥Õ¬Õ¸Õ¾ Õ§Õ¬ÖƒÕ¸Õ½Õ¿Õ« Õ°Õ¡Õ·Õ«Õ¾:\n\n Õ“Õ¸Ö€Õ±Õ¥Ö„ Õ¯Ö€Õ¯Õ«Õ¶ <xliff:g id="NUMBER_2">%d</xliff:g> Õ¾Õ¡ÕµÖ€Õ¯ÕµÕ¡Õ¶Õ«Ö:"</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Դուք <xliff:g id="NUMBER_0">%d</xliff:g> Õ¡Õ¶Õ£Õ¡Õ´ Õ½Õ­Õ¡Õ¬ Õ¥Ö„ Õ°Õ¡Õ¾Õ¡Ö„Õ¥Õ¬ Õ±Õ¥Ö€ Õ¡ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ´Õ¡Õ¶ Õ¶Õ´Õ¸Ö‚Õ·Õ¨: <xliff:g id="NUMBER_1">%d</xliff:g> Õ¡Õ¶Õ£Õ¡Õ´Õ«Ö Õ¡Õ¾Õ¥Õ¬ Õ¡Õ¶Õ°Õ¡Õ»Õ¸Õ² ÖƒÕ¸Ö€Õ±Õ¥Ö€Õ«Ö Õ°Õ¥Õ¿Õ¸ Õ±Õ¥Õ¦ Õ¯Õ¡Õ¼Õ¡Õ»Õ¡Ö€Õ¯Õ¾Õ« Õ¡ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ¥Õ¬ Õ±Õ¥Ö€ Õ°Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ¨` Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¥Õ¬Õ¸Õ¾ Õ§Õ¬ÖƒÕ¸Õ½Õ¿Õ« Õ°Õ¡Õ·Õ«Õ¾:\n\n Õ“Õ¸Ö€Õ±Õ¥Ö„ Õ¯Ö€Õ¯Õ«Õ¶ <xliff:g id="NUMBER_2">%d</xliff:g> Õ¾Õ¡ÕµÖ€Õ¯ÕµÕ¡Õ¶Õ«Ö:"</string>
+ <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
+ <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Õ€Õ¥Õ¼Õ¡ÖÕ¶Õ¥Õ¬"</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"ÕÕ­Õ¡Õ¬ SIM PIN Õ¯Õ¸Õ¤Õ« ÕºÕ¡Õ¿Õ³Õ¡Õ¼Õ¸Õ¾ ÕºÕ¥Õ¿Ö„ Õ§ Õ¤Õ«Õ´Õ¥Ö„ Õ±Õ¥Ö€ Ö…ÕºÕ¥Ö€Õ¡Õ¿Õ¸Ö€Õ«Õ¶Õ Õ½Õ¡Ö€Ö„Õ¶ Õ¡Ö€Õ£Õ¥Õ¬Õ¡Õ¢Õ¡ÖÕ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€:"</string>
+ <plurals name="kg_password_wrong_pin_code">
+ <item quantity="one" msgid="8134313997799638254">"SIM PIN Õ¯Õ¸Õ¤Õ¨ Õ½Õ­Õ¡Õ¬ Õ§: Õ„Õ¶Õ¡Ö <xliff:g id="NUMBER">%d</xliff:g> ÖƒÕ¸Ö€Õ±, Õ¸Ö€Õ«Ö Õ°Õ¥Õ¿Õ¸ ÕºÕ¥Õ¿Ö„ Õ§ Õ¤Õ«Õ´Õ¥Ö„ Õ±Õ¥Ö€ Ö…ÕºÕ¥Ö€Õ¡Õ¿Õ¸Ö€Õ«Õ¶Õ Õ½Õ¡Ö€Ö„Õ¶ Õ¡Ö€Õ£Õ¥Õ¬Õ¡Õ¢Õ¡ÖÕ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€:"</item>
+ <item quantity="other" msgid="2215723361575359486">"SIM PIN Õ¯Õ¸Õ¤Õ¨ Õ½Õ­Õ¡Õ¬ Õ§: Õ„Õ¶Õ¡Ö <xliff:g id="NUMBER">%d</xliff:g> ÖƒÕ¸Ö€Õ±:"</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="7077536808291316208">"SIM-Õ¨ Õ°Õ¶Õ¡Ö€Õ¡Õ¾Õ¸Ö€ Õ¹Õ§ Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¥Õ¬: Ô´Õ«Õ´Õ¥Ö„ Õ±Õ¥Ö€ Ö…ÕºÕ¥Ö€Õ¡Õ¿Õ¸Ö€Õ«Õ¶:"</string>
+ <plurals name="kg_password_wrong_puk_code">
+ <item quantity="one" msgid="3256893607561060649">"SIM PUK Õ¯Õ¸Õ¤Õ¨ Õ½Õ­Õ¡Õ¬ Õ§: Õ„Õ¶Õ¡Ö <xliff:g id="NUMBER">%d</xliff:g> ÖƒÕ¸Ö€Õ±Õ Õ´Õ«Õ¶Õ¹Ö‡ SIM-Õ« Õ¨Õ¶Õ¤Õ´Õ«Õ·Õ¿ Õ¡Ö€Õ£Õ¥Õ¬Õ¡ÖƒÕ¡Õ¯Õ¸Ö‚Õ´Õ¨:"</item>
+ <item quantity="other" msgid="5477305226026342036">"SIM PUK Õ¯Õ¸Õ¤Õ¨ Õ½Õ­Õ¡Õ¬ Õ§: Õ„Õ¶Õ¡Ö <xliff:g id="NUMBER">%d</xliff:g> ÖƒÕ¸Ö€Õ±Õ Õ´Õ«Õ¶Õ¹Ö‡ SIM-Õ« Õ¨Õ¶Õ¤Õ´Õ«Õ·Õ¿ Õ¡Ö€Õ£Õ¥Õ¬Õ¡ÖƒÕ¡Õ¯Õ¸Ö‚Õ´Õ¨:"</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="6268288093558031564">"SIM PIN Õ£Õ¸Ö€Õ®Õ¸Õ²Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Õ±Õ¡Õ­Õ¸Õ²Õ¾Õ¥Ö:"</string>
+ <string name="kg_password_puk_failed" msgid="2838824369502455984">"SIM PUK Õ£Õ¸Ö€Õ®Õ¸Õ²Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Õ±Õ¡Õ­Õ¸Õ²Õ¾Õ¥Ö:"</string>
+ <string name="kg_pin_accepted" msgid="1448241673570020097">"Ô¿Õ¸Õ¤Õ¶ Õ¨Õ¶Õ¤Õ¸Ö‚Õ¶Õ¾Õ¥Ö:"</string>
+ <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Õ†Õ¡Õ­Õ¸Ö€Õ¤ Õ°Õ¥Õ¿Õ¡Õ£Õ®Õ« Õ¯Õ¸Õ³Õ¡Õ¯"</string>
+ <string name="keyguard_transport_next_description" msgid="4299258300283778305">"Õ€Õ¡Õ»Õ¸Ö€Õ¤ Õ°Õ¥Õ¿Õ¡Õ£Õ®Õ« Õ¯Õ¸Õ³Õ¡Õ¯"</string>
+ <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Ô´Õ¡Õ¤Õ¡Ö€Õ« Õ¯Õ¸Õ³Õ¡Õ¯"</string>
+ <string name="keyguard_transport_play_description" msgid="2924628863741150956">"Õ†Õ¾Õ¡Õ£Õ¡Ö€Õ¯Õ´Õ¡Õ¶ Õ¯Õ¸Õ³Õ¡Õ¯"</string>
+ <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"Ô´Õ¡Õ¤Õ¡Ö€Õ« Õ¯Õ¸Õ³Õ¡Õ¯"</string>
+ <string name="keyguard_carrier_default" msgid="8700650403054042153">"Ô¾Õ¡Õ¼Õ¡ÕµÕ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶ Õ¹Õ¯Õ¡:"</string>
+</resources>
diff --git a/packages/Keyguard/res/values-hy/strings.xml b/packages/Keyguard/res/values-hy/strings.xml
new file mode 100644
index 0000000..19b3c79
--- /dev/null
+++ b/packages/Keyguard/res/values-hy/strings.xml
@@ -0,0 +1,138 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"Õ„Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ¥Ö„ PIN Õ¯Õ¸Õ¤Õ¨"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"Õ„Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ¥Ö„ PUK-Õ¨ Ö‡ Õ¶Õ¸Ö€ PIN Õ¯Õ¸Õ¤Õ¨"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"PUK Õ¯Õ¸Õ¤"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"Õ†Õ¸Ö€ PIN Õ®Õ¡Õ®Õ¯Õ¡Õ£Õ«Ö€"</string>
+ <string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"Õ€ÕºÕ¥Ö„` Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ¨ Õ´Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€"</font></string>
+ <string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Õ„Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ¥Ö„ Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ¨ Õ¡ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ´Õ¡Õ¶ Õ°Õ¡Õ´Õ¡Ö€"</string>
+ <string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Õ„Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ¥Ö„ PIN-Õ¨ Õ¡ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ´Õ¡Õ¶ Õ°Õ¡Õ´Õ¡Ö€"</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"ÕÕ­Õ¡Õ¬ PIN Õ®Õ¡Õ®Õ¯Õ¡Õ£Õ«Ö€:"</string>
+ <string name="keyguard_label_text" msgid="861796461028298424">"Ô±ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ´Õ¡Õ¶ Õ°Õ¡Õ´Õ¡Ö€ Õ½Õ¥Õ²Õ´Õ¥Ö„ Õ‘Õ¡Õ¶Õ¯, Õ¡ÕºÕ¡ 0:"</string>
+ <string name="faceunlock_multiple_failures" msgid="754137583022792429">"Ô±Õ¼Õ¡Õ¾Õ¥Õ¬Õ¡Õ£Õ¸Ö‚ÕµÕ¶ Ô´Õ¥Õ´Ö„Õ¸Õ¾ Õ¡ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ´Õ¡Õ¶ ÖƒÕ¸Ö€Õ±Õ¥Ö€Õ¨ Õ£Õ¥Ö€Õ¡Õ¦Õ¡Õ¶ÖÕ¾Õ¡Õ® Õ¥Õ¶"</string>
+ <string name="keyguard_charged" msgid="3272223906073492454">"Ô¼Õ«ÖÖ„Õ¡Õ¾Õ¸Ö€Õ¾Õ¡Õ® Õ§"</string>
+ <string name="keyguard_plugged_in" msgid="8117572000639998388">"Ô¼Õ«ÖÖ„Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´, <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+ <string name="keyguard_low_battery" msgid="8143808018719173859">"Õ„Õ«Õ¡ÖÖ€Õ¥Ö„ Õ±Õ¥Ö€ Õ¬Õ«ÖÖ„Õ¡Õ¾Õ¸Ö€Õ«Õ¹Õ¨:"</string>
+ <string name="keyguard_instructions_when_pattern_disabled" msgid="1332288268600329841">"Ô±ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€ Õ½Õ¥Õ²Õ´Õ¥Ö„ Õ‘Õ¡Õ¶Õ¯Õ¨:"</string>
+ <string name="keyguard_network_locked_message" msgid="9169717779058037168">"Õ‘Õ¡Õ¶ÖÕ¨ Õ¯Õ¸Õ²ÕºÕ¾Õ¡Õ® Õ§"</string>
+ <string name="keyguard_missing_sim_message_short" msgid="494980561304211931">"SIM Ö„Õ¡Ö€Õ¿ Õ¹Õ¯Õ¡"</string>
+ <string name="keyguard_missing_sim_message" product="tablet" msgid="1445849005909260039">"Ô³Ö€Õ¡Õ½Õ¡Õ¬Õ«Õ¯Õ¸Ö‚Õ´ SIM Ö„Õ¡Ö€Õ¿ Õ¹Õ¯Õ¡:"</string>
+ <string name="keyguard_missing_sim_message" product="default" msgid="3481110395508637643">"Õ€Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ« Õ´Õ¥Õ» SIM Ö„Õ¡Ö€Õ¿ Õ¹Õ¯Õ¡:"</string>
+ <string name="keyguard_missing_sim_instructions" msgid="5210891509995942250">"Ô¶Õ¥Õ¿Õ¥Õ²Õ¥Ö„ SIM Ö„Õ¡Ö€Õ¿Õ¨:"</string>
+ <string name="keyguard_missing_sim_instructions_long" msgid="5968985489463870358">"SIM Ö„Õ¡Ö€Õ¿Õ¨ Õ¢Õ¡ÖÕ¡Õ¯Õ¡ÕµÕ¸Ö‚Õ´ Õ§ Õ¯Õ¡Õ´ Õ¹Õ« Õ¯Õ¡Ö€Õ¸Õ² Õ¯Õ¡Ö€Õ¤Õ¡ÖÕ¾Õ¥Õ¬: Õ„Õ¿ÖÖ€Õ¥Ö„ SIM Ö„Õ¡Ö€Õ¿:"</string>
+ <string name="keyguard_permanent_disabled_sim_message_short" msgid="8340813989586622356">"Ô±Õ¶ÕºÕ«Õ¿Õ¡Õ¶ SIM Ö„Õ¡Ö€Õ¿:"</string>
+ <string name="keyguard_permanent_disabled_sim_instructions" msgid="5892940909699723544">"ÕÕ¥Ö€ SIM Ö„Õ¡Ö€Õ¿Õ¨ Õ¨Õ¶Õ¤Õ´Õ«Õ·Õ¿ Õ¯Õ¡Õ½Õ¥ÖÕ¾Õ¥Õ¬ Õ§:\nÔ¿Õ¡ÕºÕ¾Õ¥Ö„ Õ±Õ¥Ö€ Õ¢Õ»Õ»Õ¡ÕµÕ«Õ¶ Õ®Õ¡Õ¼Õ¡ÕµÕ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ´Õ¡Õ¿Õ¡Õ¯Õ¡Ö€Õ¡Ö€Õ« Õ°Õ¥Õ¿ Õ¶Õ¸Ö€ SIM Ö„Õ¡Ö€Õ¿ Õ±Õ¥Õ¼Ö„ Õ¢Õ¥Ö€Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€:"</string>
+ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM Ö„Õ¡Ö€Õ¿Õ¨ Õ¯Õ¸Õ²ÕºÕ¾Õ¡Õ® Õ§:"</string>
+ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM Ö„Õ¡Ö€Õ¿Õ¨ PUK-Õ¸Õ¾ Õ¯Õ¸Õ²ÕºÕ¾Õ¡Õ® Õ§:"</string>
+ <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"SIM Ö„Õ¡Ö€Õ¿Õ¨ Õ¡ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ¾Õ¸Ö‚Õ´ Õ§..."</string>
+ <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. ÕŽÕ«Õ»Õ¥Õ© %2$d of %3$d:"</string>
+ <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Ô±Õ¾Õ¥Õ¬Õ¡ÖÕ¶Õ¥Õ¬ Õ¾Õ«Õ»Õ¥Õ©:"</string>
+ <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Ô´Õ¡Õ¿Õ¡Ö€Õ¯"</string>
+ <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Ô±ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ´Õ¡Õ¶ Õ¿Õ¡Ö€Õ¡Õ®Ö„Õ¶ Õ¨Õ¶Õ¤Õ¬Õ¡ÕµÕ¶Õ¾Õ¡Õ® Õ§:"</string>
+ <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Ô±ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ´Õ¡Õ¶ Õ¿Õ¡Ö€Õ¡Õ®Ö„Õ¨ Õ¥Õ¿ Õ§ Õ®Õ¡Õ¬Õ¾Õ¡Õ®:"</string>
+ <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> Õ¾Õ«Õ»Õ¥Õ©:"</string>
+ <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"Õ•Õ£Õ¿Õ¾Õ¸Õ²Õ« Õ¨Õ¶Õ¿Ö€Õ«Õ¹"</string>
+ <string name="keyguard_accessibility_status" msgid="8008264603935930611">"Ô¿Õ¡Ö€Õ£Õ¡Õ¾Õ«Õ³Õ¡Õ¯"</string>
+ <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Õ–Õ¸Õ¿Õ¸Õ­ÖÕ«Õ¯"</string>
+ <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Õ„Õ¥Õ¤Õ«Õ¡ Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´Õ¶Õ¥Ö€"</string>
+ <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"ÕŽÕ«Õ»Õ¥Õ©Õ¶Õ¥Ö€Õ« Õ¾Õ¥Ö€Õ¡Õ¤Õ¡Õ½Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´Õ¨ Õ´Õ¥Õ¯Õ¶Õ¡Ö€Õ¯Õ¥Õ¬ Õ§:"</string>
+ <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"ÕŽÕ«Õ»Õ¥Õ©Õ« Õ¾Õ¥Ö€Õ¡Õ¤Õ¡Õ½Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´Õ¶ Õ¡Õ¾Õ¡Ö€Õ¿Õ¾Õ¥Ö:"</string>
+ <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"ÕŽÕ«Õ»Õ¥Õ© <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>-Õ¨ Õ»Õ¶Õ»Õ¾Õ¡Õ® Õ§:"</string>
+ <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Ô¸Õ¶Õ¤Õ¬Õ¡ÕµÕ¶Õ¥Õ¬ Õ¡ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ´Õ¡Õ¶ Õ¿Õ¡Ö€Õ¡Õ®Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨:"</string>
+ <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Ô·Õ»Õ« Õ¡ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ¸Ö‚Õ´:"</string>
+ <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"ÕÕ­Õ¥Õ´Õ¡ÕµÕ¸Õ¾ Õ¡ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ¸Ö‚Õ´:"</string>
+ <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Ô´Õ¥Õ´Ö„Õ¸Õ¾ Õ¡ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ¸Ö‚Õ´:"</string>
+ <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Pin-Õ¶ Õ¡ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ¾Õ¡Õ® Õ§:"</string>
+ <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Ô³Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ« Õ¡ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ¸Ö‚Õ´:"</string>
+ <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"ÕÕ­Õ¥Õ´Õ¡ÕµÕ« Õ¿Õ¡Ö€Õ¡Õ®Ö„:"</string>
+ <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"ÕÕ¡Õ°Õ¥ÖÕ´Õ¡Õ¶ Õ¿Õ¡Ö€Õ¡Õ®Ö„:"</string>
+ <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"Õ†Õ¡Õ­Õ¸Ö€Õ¤ Õ°Õ¥Õ¿Õ¡Õ£Õ®Õ« Õ¯Õ¸Õ³Õ¡Õ¯Õ¨"</string>
+ <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"Õ€Õ¡Õ»Õ¸Ö€Õ¤ Õ°Õ¥Õ¿Õ¡Õ£Õ®Õ« Õ¯Õ¸Õ³Õ¡Õ¯Õ¨"</string>
+ <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Ô´Õ¡Õ¤Õ¡Ö€Õ« Õ¯Õ¸Õ³Õ¡Õ¯"</string>
+ <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Õ†Õ¾Õ¡Õ£Õ¡Ö€Õ¯Õ´Õ¡Õ¶ Õ¯Õ¸Õ³Õ¡Õ¯"</string>
+ <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Ô¿Õ¡Õ¶Õ£Õ« Õ¯Õ¸Õ³Õ¡Õ¯"</string>
+ <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
+ <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
+ <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
+ <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
+ <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"Õ‰Õ¥Õ²Õ¡Ö€Õ¯Õ¥Õ¬"</string>
+ <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Õ‹Õ¶Õ»Õ¥Õ¬"</string>
+ <string name="keyboardview_keycode_done" msgid="1992571118466679775">"Ô¿Õ¡Õ¿Õ¡Ö€Õ¾Õ¡Õ® Õ§"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Ռեժիմի փոփոխում"</string>
+ <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
+ <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Õ„Õ¸Ö‚Õ¿Ö„"</string>
+ <string name="description_target_unlock" msgid="2228524900439801453">"Ô±ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ¥Õ¬"</string>
+ <string name="description_target_camera" msgid="969071997552486814">"Õ–Õ¸Õ¿Õ¸Õ­ÖÕ«Õ¯"</string>
+ <string name="description_target_silent" msgid="893551287746522182">"Ô¼Õ¸Ö‚Õ¼"</string>
+ <string name="description_target_soundon" msgid="30052466675500172">"ÕÕ¡ÕµÕ¶Õ¨ Õ´Õ«Õ¡ÖÕ¶Õ¥Õ¬"</string>
+ <string name="description_target_search" msgid="3091587249776033139">"ÕˆÖ€Õ¸Õ¶Õ¥Õ¬"</string>
+ <string name="description_direction_up" msgid="7169032478259485180">"ÕÕ¡Õ°Õ¥ÖÖ€Õ¥Ö„ Õ¾Õ¥Ö€Ö‡ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>-Õ« Õ°Õ¡Õ´Õ¡Ö€:"</string>
+ <string name="description_direction_down" msgid="5087739728639014595">"ÕÕ¡Õ°Õ¥ÖÖ€Õ¥Ö„ ÖÕ¡Õ® <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>-Õ« Õ°Õ¡Õ´Õ¡Ö€:"</string>
+ <string name="description_direction_left" msgid="7207478719805562165">"ÕÕ¡Õ°Õ¥ÖÖ€Õ¥Ö„ Õ±Õ¡Õ­` <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>-Õ« Õ°Õ¡Õ´Õ¡Ö€:"</string>
+ <string name="description_direction_right" msgid="8034433242579600980">"ÕÕ¡Õ°Õ¥ÖÖ€Õ¥Ö„ Õ¡Õ»` <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>-Õ« Õ°Õ¡Õ´Õ¡Ö€:"</string>
+ <string name="user_switched" msgid="3768006783166984410">"Õ†Õ¥Ö€Õ¯Õ¡ÕµÕ«Õ½ Ö…Õ£Õ¿Õ¾Õ¸Õ²Õ¨ <xliff:g id="NAME">%1$s</xliff:g>:"</string>
+ <string name="kg_emergency_call_label" msgid="684946192523830531">"Ô±Ö€Õ¿Õ¡Õ¯Õ¡Ö€Õ£ Õ«Ö€Õ¡Õ¾Õ«Õ³Õ¡Õ¯Õ« Õ°Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ¡Õ¦Õ¡Õ¶Õ£"</string>
+ <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Õ„Õ¸Õ¼Õ¡ÖÕ¥Õ¬ Õ¥Õ´ Õ½Õ­Õ¥Õ´Õ¡Õ¶"</string>
+ <string name="kg_wrong_pattern" msgid="1850806070801358830">"ÕÕ­Õ¡Õ¬ Õ½Õ­Õ¥Õ´Õ¡"</string>
+ <string name="kg_wrong_password" msgid="2333281762128113157">"ÕÕ­Õ¡Õ¬ Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼"</string>
+ <string name="kg_wrong_pin" msgid="1131306510833563801">"ÕÕ­Õ¡Õ¬ PIN"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"Õ“Õ¸Ö€Õ±Õ¥Ö„ Õ¯Ö€Õ¯Õ«Õ¶ <xliff:g id="NUMBER">%d</xliff:g> Õ¾Õ¡ÕµÖ€Õ¯ÕµÕ¡Õ¶Õ«Ö:"</string>
+ <string name="kg_pattern_instructions" msgid="398978611683075868">"Õ€Õ¡Õ¾Õ¡Ö„Õ¥Ö„ Õ±Õ¥Ö€ Õ½Õ­Õ¥Õ´Õ¡Õ¶"</string>
+ <string name="kg_sim_pin_instructions" msgid="2319508550934557331">"Õ„Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ¥Ö„ SIM-Õ« PIN-Õ¨"</string>
+ <string name="kg_pin_instructions" msgid="2377242233495111557">"Õ„Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ¥Ö„ PIN-Õ¨"</string>
+ <string name="kg_password_instructions" msgid="5753646556186936819">"Õ„Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ¥Ö„ Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ¨"</string>
+ <string name="kg_puk_enter_puk_hint" msgid="453227143861735537">"SIM-Õ¨ Õ¡ÕµÕ½ ÕºÕ¡Õ°Õ«Õ¶ Õ¡Õ¶Õ»Õ¡Õ¿Õ¾Õ¡Õ® Õ§: Õ„Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ¥Ö„ PUK Õ¯Õ¸Õ¤Õ¨ Õ·Õ¡Ö€Õ¸Ö‚Õ¶Õ¡Õ¯Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€: Õ„Õ¡Õ¶Ö€Õ¡Õ´Õ¡Õ½Õ¶Õ¥Ö€Õ« Õ°Õ¡Õ´Õ¡Ö€ Õ¯Õ¡ÕºÕ¾Õ¥Ö„ Ö…ÕºÕ¥Ö€Õ¡Õ¿Õ¸Ö€Õ« Õ°Õ¥Õ¿:"</string>
+ <string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"Õ„Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ¥Ö„ ÖÕ¡Õ¶Õ¯Õ¡Õ¬Õ« PIN Õ®Õ¡Õ®Õ¯Õ¡Õ£Õ«Ö€Õ¨"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"Õ€Õ¡Õ½Õ¿Õ¡Õ¿Õ¥Ö„ ÖÕ¡Õ¶Õ¯Õ¡Õ¬Õ« PIN Õ®Õ¡Õ®Õ¯Õ¡Õ£Õ«Ö€Õ¨"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"Ô±ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ¸Ö‚Õ´ Õ§ SIM Ö„Õ¡Ö€Õ¿Õ¨ ..."</string>
+ <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"ÕÕ­Õ¡Õ¬ PIN Õ®Õ¡Õ®Õ¯Õ¡Õ£Õ«Ö€:"</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"Մուտքագրեք PIN, Õ¸Ö€Õ¨ 4-Õ«Ö 8 Õ©Õ«Õ¾ Õ§:"</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"PUK Õ¯Õ¸Õ¤Õ¨ ÕºÕ¥Õ¿Ö„ Õ§ Õ¬Õ«Õ¶Õ« 8 Õ¯Õ¡Õ´ Õ¡Õ¾Õ¥Õ¬Õ« Õ©Õ«Õ¾:"</string>
+ <string name="kg_invalid_puk" msgid="3638289409676051243">"ÕŽÕ¥Ö€Õ¡Õ´Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ¥Ö„ Õ³Õ«Õ·Õ¿ PUK Õ®Õ¡Õ®Õ¯Õ¡Õ£Õ«Ö€Õ¨: Ô¿Ö€Õ¯Õ¶Õ¾Õ¸Õ² ÖƒÕ¸Ö€Õ±Õ¥Ö€Õ¨ Õ¨Õ¶Õ¤Õ´Õ«Õ·Õ¿ Õ¯Õ¯Õ¡Õ½Õ¥ÖÕ¶Õ¥Õ¶ SIM Ö„Õ¡Ö€Õ¿Õ¨:"</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"PIN Õ®Õ¡Õ®Õ¯Õ¡Õ£Ö€Õ¥Ö€Õ¨ Õ¹Õ¥Õ¶ Õ°Õ¡Õ´Õ¨Õ¶Õ¯Õ¶Õ¸Ö‚Õ´"</string>
+ <string name="kg_login_too_many_attempts" msgid="6486842094005698475">"Õ‰Õ¡ÖƒÕ«Ö Õ·Õ¡Õ¿ Õ½Õ­Õ¥Õ´Õ¡ÕµÕ« ÖƒÕ¸Ö€Õ±Õ¥Ö€"</string>
+ <string name="kg_login_instructions" msgid="1100551261265506448">"Ô±ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€` Õ´Õ¸Ö‚Õ¿Ö„ Õ£Õ¸Ö€Õ®Õ¥Ö„ Õ±Õ¥Ö€ Google Õ°Õ¡Õ·Õ¾Õ¸Õ¾:"</string>
+ <string name="kg_login_username_hint" msgid="5718534272070920364">"Õ•Õ£Õ¿Õ¡Õ¶Õ¸Ö‚Õ¶ (Õ§Õ¬ÖƒÕ¸Õ½Õ¿)"</string>
+ <string name="kg_login_password_hint" msgid="9057289103827298549">"Ô³Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ¨"</string>
+ <string name="kg_login_submit_button" msgid="5355904582674054702">"Õ„Õ¸Ö‚Õ¿Ö„ Õ£Õ¸Ö€Õ®Õ¥Õ¬"</string>
+ <string name="kg_login_invalid_input" msgid="5754664119319872197">"ÕÕ­Õ¡Õ¬ Ö…Õ£Õ¿Õ¡Õ¶Õ¸Ö‚Õ¶ Õ¯Õ¡Õ´ Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼:"</string>
+ <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"Õ„Õ¸Õ¼Õ¡ÖÕ¥ÕžÕ¬ Õ¥Ö„ Õ±Õ¥Ö€ Ö…Õ£Õ¿Õ¡Õ¶Õ¸Ö‚Õ¶Õ¨ Õ¯Õ¡Õ´ Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ¨:\nÔ±ÕµÖÕ¥Õ¬Õ¥Ö„ "<b>"google.com /accounts/recovery"</b>":"</string>
+ <string name="kg_login_checking_password" msgid="1052685197710252395">"Õ€Õ¡Õ·Õ«Õ¾Õ¨ Õ½Õ¿Õ¸Ö‚Õ£Õ¾Õ¸Ö‚Õ´ Õ§..."</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"Դուք <xliff:g id="NUMBER_0">%d</xliff:g> Õ¡Õ¶Õ£Õ¡Õ´ Õ½Õ­Õ¡Õ¬ Õ¥Ö„ Õ´Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ¥Õ¬ Õ±Õ¥Ö€ PIN-Õ¨: \n\nÕ“Õ¸Ö€Õ±Õ¥Ö„ Õ¯Ö€Õ¯Õ«Õ¶ <xliff:g id="NUMBER_1">%d</xliff:g> Õ¾Õ¡ÕµÖ€Õ¯ÕµÕ¡Õ¶Õ«Ö:"</string>
+ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"Ô´Õ¸Ö‚Ö„ Õ½Õ­Õ¡Õ¬ Õ¥Ö„ Õ´Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ¥Õ¬ Õ±Õ¥Ö€ Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ¨ <xliff:g id="NUMBER_0">%d</xliff:g> Õ¡Õ¶Õ£Õ¡Õ´: \n\nÕ“Õ¸Ö€Õ±Õ¥Ö„ Õ¯Ö€Õ¯Õ«Õ¶ <xliff:g id="NUMBER_1">%d</xliff:g> Õ¾Õ¡ÕµÖ€Õ¯ÕµÕ¡Õ¶Õ«Ö:"</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"Դուք <xliff:g id="NUMBER_0">%d</xliff:g> Õ¡Õ¶Õ£Õ¡Õ´ Õ½Õ­Õ¡Õ¬ Õ¥Ö„ Õ°Õ¡Õ¾Õ¡Ö„Õ¥Õ¬ Õ±Õ¥Ö€ Õ¡ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ´Õ¡Õ¶ Õ½Õ­Õ¥Õ´Õ¡Õ¶: \n\nÕ“Õ¸Ö€Õ±Õ¥Ö„ Õ¯Ö€Õ¯Õ«Õ¶ <xliff:g id="NUMBER_1">%d</xliff:g> Õ¾Õ¡ÕµÖ€Õ¯ÕµÕ¡Õ¶Õ«Ö:"</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1575557200627128949">"Դուք <xliff:g id="NUMBER_0">%d</xliff:g> Õ¡Õ¶Õ£Õ¡Õ´ Õ½Õ­Õ¡Õ¬ ÖƒÕ¸Ö€Õ± Õ¥Ö„ Õ¡Ö€Õ¥Õ¬ Õ£Ö€Õ¡Õ½Õ¡Õ¬Õ«Õ¯Õ¶ Õ¡ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€: <xliff:g id="NUMBER_1">%d</xliff:g> Õ¡Õ¶Õ£Õ¡Õ´Õ«Ö Õ¡Õ¾Õ¥Õ¬ Õ¡Õ¶Õ°Õ¡Õ»Õ¸Õ² ÖƒÕ¸Ö€Õ±Õ¥Ö€Õ«Ö Õ°Õ¥Õ¿Õ¸ Õ£Ö€Õ¡Õ½Õ¡Õ¬Õ«Õ¯Õ¨ Õ¯Õ¾Õ¥Ö€Õ¡Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¾Õ« Õ£Õ¸Ö€Õ®Õ¡Ö€Õ¡Õ¶Õ¡ÕµÕ«Õ¶ Õ¬Õ¼Õ¥Õ¬ÕµÕ¡ÕµÕ¶Õ«, Ö‡ Ö…Õ£Õ¿Õ¾Õ¸Õ²Õ« Õ¢Õ¸Õ¬Õ¸Ö€ Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨ Õ¯Õ¯Õ¸Ö€Õ¥Õ¶:"</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="4051015943038199910">"Դուք <xliff:g id="NUMBER_0">%d</xliff:g> Õ¡Õ¶Õ£Õ¡Õ´ Õ½Õ­Õ¡Õ¬ ÖƒÕ¸Ö€Õ± Õ¥Ö„ Õ¡Ö€Õ¥Õ¬ Õ°Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ¶ Õ¡ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€: <xliff:g id="NUMBER_1">%d</xliff:g> Õ¡Õ¶Õ£Õ¡Õ´Õ«Ö Õ¡Õ¾Õ¥Õ¬ Õ¡Õ¶Õ°Õ¡Õ»Õ¸Õ² ÖƒÕ¸Ö€Õ±Õ¥Ö€Õ«Ö Õ°Õ¥Õ¿Õ¸ Õ°Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ¨ Õ¯Õ¾Õ¥Ö€Õ¡Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¾Õ« Õ£Õ¸Ö€Õ®Õ¡Ö€Õ¡Õ¶Õ¡ÕµÕ«Õ¶ Õ¬Õ¼Õ¥Õ¬ÕµÕ¡ÕµÕ¶Õ«, Ö‡ Ö…Õ£Õ¿Õ¾Õ¸Õ²Õ« Õ¢Õ¸Õ¬Õ¸Ö€ Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨ Õ¯Õ¯Õ¸Ö€Õ¥Õ¶:"</string>
+ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="2072996269148483637">"Ô´Õ¸Ö‚Ö„ <xliff:g id="NUMBER">%d</xliff:g> Õ¡Õ¶Õ£Õ¡Õ´ Õ½Õ­Õ¡Õ¬ ÖƒÕ¸Ö€Õ± Õ¥Ö„ Õ¡Ö€Õ¥Õ¬ Õ£Ö€Õ¡Õ½Õ¡Õ¬Õ«Õ¯Õ¶ Õ¡ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€: Ô³Ö€Õ¡Õ½Õ¡Õ¬Õ«Õ¯Õ¶ Õ¡ÕµÕªÕ´ Õ¯Õ¾Õ¥Ö€Õ¡Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¾Õ« Õ£Õ¸Ö€Õ®Õ¡Ö€Õ¡Õ¶Õ¡ÕµÕ«Õ¶ Õ¬Õ¼Õ¥Õ¬ÕµÕ¡ÕµÕ¶Õ«:"</string>
+ <string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"Դուք <xliff:g id="NUMBER">%d</xliff:g> անգամ սխալ փորձ եք արել հեռախոսն ապակողպելու համար: Հեռախոսն այժմ կվերակարգավորվի գործարանային լռելյայնի:"</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Ô´Õ¸Ö‚Ö„ Õ½Õ­Õ¡Õ¬ Õ¥Ö„ Õ°Õ¡Õ¾Õ¡Ö„Õ¥Õ¬ Õ±Õ¥Ö€ Õ¡ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ´Õ¡Õ¶ Õ½Õ­Õ¥Õ´Õ¡Õ¶ <xliff:g id="NUMBER_0">%d</xliff:g> Õ¡Õ¶Õ£Õ¡Õ´: ÔµÕ¾Õ½ <xliff:g id="NUMBER_1">%d</xliff:g> Õ¡Õ¶Õ°Õ¡Õ»Õ¸Õ² ÖƒÕ¸Ö€Õ±Õ«Ö Õ°Õ¥Õ¿Õ¸ Õ±Õ¥Õ¦Õ¡Õ¶Õ«Ö Õ¯ÕºÕ¡Õ°Õ¡Õ¶Õ»Õ¾Õ« Õ¡ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ¥Õ¬ Õ±Õ¥Ö€ Õ£Ö€Õ¡Õ½Õ¡Õ¬Õ«Õ¯Õ¨` Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¥Õ¬Õ¸Õ¾ Õ§Õ¬ÖƒÕ¸Õ½Õ¿Õ« Õ°Õ¡Õ·Õ«Õ¾:\n\n Õ“Õ¸Ö€Õ±Õ¥Ö„ Õ¯Ö€Õ¯Õ«Õ¶ <xliff:g id="NUMBER_2">%d</xliff:g> Õ¾Õ¡ÕµÖ€Õ¯ÕµÕ¡Õ¶Õ«Ö:"</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Դուք <xliff:g id="NUMBER_0">%d</xliff:g> Õ¡Õ¶Õ£Õ¡Õ´ Õ½Õ­Õ¡Õ¬ Õ¥Ö„ Õ°Õ¡Õ¾Õ¡Ö„Õ¥Õ¬ Õ±Õ¥Ö€ Õ¡ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ´Õ¡Õ¶ Õ¶Õ´Õ¸Ö‚Õ·Õ¨: <xliff:g id="NUMBER_1">%d</xliff:g> Õ¡Õ¶Õ£Õ¡Õ´Õ«Ö Õ¡Õ¾Õ¥Õ¬ Õ¡Õ¶Õ°Õ¡Õ»Õ¸Õ² ÖƒÕ¸Ö€Õ±Õ¥Ö€Õ«Ö Õ°Õ¥Õ¿Õ¸ Õ±Õ¥Õ¦ Õ¯Õ¡Õ¼Õ¡Õ»Õ¡Ö€Õ¯Õ¾Õ« Õ¡ÕºÕ¡Õ¯Õ¸Õ²ÕºÕ¥Õ¬ Õ±Õ¥Ö€ Õ°Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ¨` Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¥Õ¬Õ¸Õ¾ Õ§Õ¬ÖƒÕ¸Õ½Õ¿Õ« Õ°Õ¡Õ·Õ«Õ¾:\n\n Õ“Õ¸Ö€Õ±Õ¥Ö„ Õ¯Ö€Õ¯Õ«Õ¶ <xliff:g id="NUMBER_2">%d</xliff:g> Õ¾Õ¡ÕµÖ€Õ¯ÕµÕ¡Õ¶Õ«Ö:"</string>
+ <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
+ <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Õ€Õ¥Õ¼Õ¡ÖÕ¶Õ¥Õ¬"</string>
+ <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Õ†Õ¡Õ­Õ¸Ö€Õ¤ Õ°Õ¥Õ¿Õ¡Õ£Õ®Õ« Õ¯Õ¸Õ³Õ¡Õ¯"</string>
+ <string name="keyguard_transport_next_description" msgid="4299258300283778305">"Õ€Õ¡Õ»Õ¸Ö€Õ¤ Õ°Õ¥Õ¿Õ¡Õ£Õ®Õ« Õ¯Õ¸Õ³Õ¡Õ¯"</string>
+ <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Ô´Õ¡Õ¤Õ¡Ö€Õ« Õ¯Õ¸Õ³Õ¡Õ¯"</string>
+ <string name="keyguard_transport_play_description" msgid="2924628863741150956">"Õ†Õ¾Õ¡Õ£Õ¡Ö€Õ¯Õ´Õ¡Õ¶ Õ¯Õ¸Õ³Õ¡Õ¯"</string>
+ <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"Ô´Õ¡Õ¤Õ¡Ö€Õ« Õ¯Õ¸Õ³Õ¡Õ¯"</string>
+ <string name="keyguard_carrier_default" msgid="8700650403054042153">"Ô¾Õ¡Õ¼Õ¡ÕµÕ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶ Õ¹Õ¯Õ¡:"</string>
+</resources>
diff --git a/packages/Keyguard/res/values-in/strings.xml b/packages/Keyguard/res/values-in/strings.xml
index 9f731ab..9e19472 100644
--- a/packages/Keyguard/res/values-in/strings.xml
+++ b/packages/Keyguard/res/values-in/strings.xml
@@ -21,9 +21,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"Ketik kode PIN"</string>
- <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"Ketik kode PUK dan PIN baru"</string>
- <string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"Kode PUK"</string>
- <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"Kode Pin baru"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="3035856550289724338">"Ketik kode PIN baru dan PUK SIM"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="1801941051094974609">"Kode PUK SIM"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="3201151840570492538">"Kode PIN SIM baru"</string>
<string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"Sentuh untuk mengetikkan sandi"</font></string>
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Ketik sandi untuk membuka kunci"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Ketik PIN untuk membuka kunci"</string>
@@ -71,6 +71,13 @@
<string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Tombol jeda"</string>
<string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Tombol putar"</string>
<string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Tombol hentikan"</string>
+ <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Bagus"</string>
+ <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Jelek"</string>
+ <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Hati"</string>
+ <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Buka kunci untuk melanjutkan"</string>
+ <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Peluncuran dibatalkan"</string>
+ <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Jatuhkan <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> untuk menghapus."</string>
+ <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> tidak akan dihapus."</string>
<string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
<string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
<string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
@@ -105,7 +112,6 @@
<string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"Masukkan kode PIN yang diinginkan"</string>
<string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"Konfirmasi kode PIN yang diinginkan"</string>
<string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"Membuka kunci kartu SIM…"</string>
- <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"Kode PIN salah."</string>
<string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"Ketik PIN yang terdiri dari 4 sampai 8 angka."</string>
<string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"Kode PUK harus terdiri dari 8 angka atau lebih."</string>
<string name="kg_invalid_puk" msgid="3638289409676051243">"Masukkan kembali kode PUK yang benar. Jika berulang kali gagal, SIM akan dinonaktifkan secara permanen."</string>
@@ -129,6 +135,19 @@
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Anda telah <xliff:g id="NUMBER_0">%d</xliff:g> kali salah menggambar pola pembuka kunci. Setelah <xliff:g id="NUMBER_1">%d</xliff:g> lagi upaya gagal, Anda akan diminta membuka kunci ponsel menggunakan akun email.\n\nCoba lagi dalam <xliff:g id="NUMBER_2">%d</xliff:g> detik."</string>
<string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
<string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Hapus"</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"Kode PIN SIM salah. Hubungi operator untuk membuka kunci perangkat."</string>
+ <plurals name="kg_password_wrong_pin_code">
+ <item quantity="one" msgid="8134313997799638254">"Kode PIN SIM salah, sisa <xliff:g id="NUMBER">%d</xliff:g> percobaan sebelum Anda harus menghubungi operator untuk membuka kunci perangkat."</item>
+ <item quantity="other" msgid="2215723361575359486">"Kode PIN SIM salah, sisa <xliff:g id="NUMBER">%d</xliff:g> percobaan."</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="7077536808291316208">"SIM tidak dapat digunakan. Hubungi operator Anda."</string>
+ <plurals name="kg_password_wrong_puk_code">
+ <item quantity="one" msgid="3256893607561060649">"Kode PUK SIM salah, sisa <xliff:g id="NUMBER">%d</xliff:g> percobaan sebelum SIM tidak dapat digunakan selamanya."</item>
+ <item quantity="other" msgid="5477305226026342036">"Kode PUK SIM salah, sisa <xliff:g id="NUMBER">%d</xliff:g> percobaan sebelum SIM tidak dapat digunakan selamanya."</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="6268288093558031564">"Operasi PIN SIM gagal!"</string>
+ <string name="kg_password_puk_failed" msgid="2838824369502455984">"Operasi PUK SIM gagal!"</string>
+ <string name="kg_pin_accepted" msgid="1448241673570020097">"Kode Diterima!"</string>
<string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Tombol lagu sebelumnya"</string>
<string name="keyguard_transport_next_description" msgid="4299258300283778305">"Tombol lagu berikutnya"</string>
<string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Tombol jeda"</string>
diff --git a/packages/Keyguard/res/values-it/strings.xml b/packages/Keyguard/res/values-it/strings.xml
index 4eda348..7212e5e 100644
--- a/packages/Keyguard/res/values-it/strings.xml
+++ b/packages/Keyguard/res/values-it/strings.xml
@@ -21,9 +21,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"Inserisci il codice PIN"</string>
- <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"Inserisci il PUK e il nuovo codice PIN"</string>
- <string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"Codice PUK"</string>
- <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"Nuovo codice PIN"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="3035856550289724338">"Digita il PUK della SIM e il nuovo codice PIN"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="1801941051094974609">"Codice PUK della SIM"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="3201151840570492538">"Nuovo PIN della SIM"</string>
<string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"Tocca per inserire la password"</font></string>
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Inserisci password per sbloccare"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Inserisci PIN per sbloccare"</string>
@@ -71,6 +71,13 @@
<string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Pulsante Pausa"</string>
<string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Pulsante Riproduci"</string>
<string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Pulsante di arresto"</string>
+ <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Mi piace"</string>
+ <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Pollice giù"</string>
+ <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Cuore"</string>
+ <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Sblocca per continuare"</string>
+ <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Avvio annullato"</string>
+ <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Rilascia <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> per eliminarlo."</string>
+ <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> non sarà eliminato."</string>
<string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
<string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
<string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
@@ -105,7 +112,6 @@
<string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"Inserisci il codice PIN desiderato"</string>
<string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"Conferma il codice PIN desiderato"</string>
<string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"Sblocco scheda SIM..."</string>
- <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"Codice PIN errato."</string>
<string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"Il PIN deve essere di 4-8 numeri."</string>
<string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"Il codice PUK dovrebbe avere almeno otto numeri."</string>
<string name="kg_invalid_puk" msgid="3638289409676051243">"Inserisci di nuovo il codice PUK corretto. Ripetuti tentativi comportano la disattivazione definitiva della scheda SIM."</string>
@@ -129,6 +135,19 @@
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"<xliff:g id="NUMBER_0">%d</xliff:g> tentativi errati di inserimento della sequenza di sblocco. Dopo altri <xliff:g id="NUMBER_1">%d</xliff:g> tentativi falliti, ti verrà chiesto di sbloccare il telefono con un account email.\n\n Riprova tra <xliff:g id="NUMBER_2">%d</xliff:g> secondi."</string>
<string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" – "</string>
<string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Rimuovi"</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"Codice PIN della SIM errato. Devi contattare l\'operatore per sbloccare il dispositivo."</string>
+ <plurals name="kg_password_wrong_pin_code">
+ <item quantity="one" msgid="8134313997799638254">"Codice PIN della SIM errato. Hai ancora <xliff:g id="NUMBER">%d</xliff:g> tentativo a disposizione, dopodiché dovrai contattare l\'operatore per sbloccare il dispositivo."</item>
+ <item quantity="other" msgid="2215723361575359486">"Codice PIN della SIM errato. Hai ancora <xliff:g id="NUMBER">%d</xliff:g> tentativi a disposizione."</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="7077536808291316208">"SIM inutilizzabile. Contatta il tuo operatore."</string>
+ <plurals name="kg_password_wrong_puk_code">
+ <item quantity="one" msgid="3256893607561060649">"Codice PUK della SIM errato. Hai ancora <xliff:g id="NUMBER">%d</xliff:g> tentativo a disposizione prima che la SIM diventi definitivamente inutilizzabile."</item>
+ <item quantity="other" msgid="5477305226026342036">"Codice PUK della SIM errato. Hai ancora <xliff:g id="NUMBER">%d</xliff:g> tentativi a disposizione prima che la SIM diventi definitivamente inutilizzabile."</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="6268288093558031564">"Operazione con PIN della SIM non riuscita."</string>
+ <string name="kg_password_puk_failed" msgid="2838824369502455984">"Operazione con PUK della SIM non riuscita."</string>
+ <string name="kg_pin_accepted" msgid="1448241673570020097">"Codice accettato."</string>
<string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Pulsante traccia precedente"</string>
<string name="keyguard_transport_next_description" msgid="4299258300283778305">"Pulsante traccia successiva"</string>
<string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Pulsante Pausa"</string>
diff --git a/packages/Keyguard/res/values-iw/strings.xml b/packages/Keyguard/res/values-iw/strings.xml
index 8d36309..12b45e4 100644
--- a/packages/Keyguard/res/values-iw/strings.xml
+++ b/packages/Keyguard/res/values-iw/strings.xml
@@ -20,49 +20,49 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"הקלד קוד PIN"</string>
- <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"הקלד ×ת קוד ×”-PUK וקוד ×”-PIN החדש"</string>
- <string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"קוד PUK"</string>
- <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"קוד PIN חדש"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"â€×”קלד קוד PIN"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="3035856550289724338">"â€×”קלד קוד PUK של כרטיס SIM וקוד PIN חדש"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="1801941051094974609">"â€×§×•ד PUK של כרטיס SIM"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="3201151840570492538">"â€×ž×¡×¤×¨ PIN חדש של כרטיס SIM"</string>
<string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"×’×¢ כדי להקליד ×ת הסיסמה"</font></string>
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"הקלד סיסמה לביטול הנעילה"</string>
- <string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"הקלד קוד PIN לביטול הנעילה"</string>
- <string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"קוד PIN שגוי"</string>
+ <string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"â€×”קלד קוד PIN לביטול הנעילה"</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"â€×§×•ד PIN שגוי"</string>
<string name="keyguard_label_text" msgid="861796461028298424">"כדי לבטל ×ת הנעילה, לחץ על \'תפריט\' ול×חר מכן על 0."</string>
- <string name="faceunlock_multiple_failures" msgid="754137583022792429">"חרגת ממספר הניסיונות המרבי של זיהוי פרצוף"</string>
+ <string name="faceunlock_multiple_failures" msgid="754137583022792429">"חרגת ממספר הניסיונות המרבי של זיהוי פני×"</string>
<string name="keyguard_charged" msgid="3272223906073492454">"טעון"</string>
<string name="keyguard_plugged_in" msgid="8117572000639998388">"טוען, <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
<string name="keyguard_low_battery" msgid="8143808018719173859">"חבר ×ת המטען."</string>
<string name="keyguard_instructions_when_pattern_disabled" msgid="1332288268600329841">"לחץ על \'תפריט\' כדי לבטל ×ת הנעילה."</string>
<string name="keyguard_network_locked_message" msgid="9169717779058037168">"רשת נעולה"</string>
- <string name="keyguard_missing_sim_message_short" msgid="494980561304211931">"×ין כרטיס SIM"</string>
- <string name="keyguard_missing_sim_message" product="tablet" msgid="1445849005909260039">"×ין כרטיס SIM בט×בלט."</string>
- <string name="keyguard_missing_sim_message" product="default" msgid="3481110395508637643">"×ין כרטיס SIM בטלפון."</string>
- <string name="keyguard_missing_sim_instructions" msgid="5210891509995942250">"הכנס כרטיס SIM."</string>
- <string name="keyguard_missing_sim_instructions_long" msgid="5968985489463870358">"כרטיס ×”-SIM חסר ×ו ×©×œ× × ×™×ª×Ÿ ×œ×§×¨×•× ×ותו. הכנס כרטיס SIM."</string>
- <string name="keyguard_permanent_disabled_sim_message_short" msgid="8340813989586622356">"×œ× × ×™×ª×Ÿ להשתמש בכרטיס SIM ×–×”."</string>
- <string name="keyguard_permanent_disabled_sim_instructions" msgid="5892940909699723544">"כרטיס ×”-SIM שלך הושבת לצמיתות.\nפנה לספק השירות ×”×לחוטי שלך לקבלת כרטיס SIM ×חר."</string>
- <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"כרטיס ה-SIM נעול."</string>
- <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"כרטיס SIM נעול ב×מצעות PUK."</string>
- <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"מבטל נעילה של כרטיס SIM…"</string>
- <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d מתוך %3$d."</string>
- <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"הוסף Widget."</string>
+ <string name="keyguard_missing_sim_message_short" msgid="494980561304211931">"â€×ין כרטיס SIM"</string>
+ <string name="keyguard_missing_sim_message" product="tablet" msgid="1445849005909260039">"â€×ין כרטיס SIM בט×בלט."</string>
+ <string name="keyguard_missing_sim_message" product="default" msgid="3481110395508637643">"â€×ין כרטיס SIM בטלפון."</string>
+ <string name="keyguard_missing_sim_instructions" msgid="5210891509995942250">"â€×”כנס כרטיס SIM."</string>
+ <string name="keyguard_missing_sim_instructions_long" msgid="5968985489463870358">"â€×›×¨×˜×™×¡ ×”-SIM חסר ×ו ×©×œ× × ×™×ª×Ÿ ×œ×§×¨×•× ×ותו. הכנס כרטיס SIM."</string>
+ <string name="keyguard_permanent_disabled_sim_message_short" msgid="8340813989586622356">"â€×œ× ניתן להשתמש בכרטיס SIM ×–×”."</string>
+ <string name="keyguard_permanent_disabled_sim_instructions" msgid="5892940909699723544">"â€×›×¨×˜×™×¡ ×”-SIM שלך הושבת לצמיתות.\nפנה לספק השירות ×”×לחוטי שלך לקבלת כרטיס SIM ×חר."</string>
+ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"â€×›×¨×˜×™×¡ ×”-SIM נעול."</string>
+ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"â€×›×¨×˜×™×¡ SIM נעול ב×מצעות PUK."</string>
+ <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"â€×ž×‘טל נעילה של כרטיס SIM…"</string>
+ <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"â€%1$s. Widget %2$d מתוך %3$d."</string>
+ <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"â€×”וסף Widget."</string>
<string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"ריק"</string>
<string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"×זור ביטול הנעילה הורחב."</string>
<string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"×זור ביטול הנעילה כווץ."</string>
- <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"Widget â€<xliff:g id="WIDGET_INDEX">%1$s</xliff:g>."</string>
+ <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"â€Widget â€<xliff:g id="WIDGET_INDEX">%1$s</xliff:g>."</string>
<string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"בוחר משתמשי×"</string>
<string name="keyguard_accessibility_status" msgid="8008264603935930611">"סטטוס"</string>
<string name="keyguard_accessibility_camera" msgid="8904231194181114603">"מצלמה"</string>
<string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"פקדי מדיה"</string>
- <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"סידור מחדש של Widgets התחיל."</string>
- <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"סידור מחדש של Widgets הסתיי×."</string>
- <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Widget â€<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> נמחק."</string>
+ <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"â€×¡×™×“ור מחדש של Widgets התחיל."</string>
+ <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"â€×¡×™×“ור מחדש של Widgets הסתיי×."</string>
+ <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"â€Widget â€<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> נמחק."</string>
<string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"הרחב ×ת ×זור ביטול הנעילה."</string>
<string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"ביטול נעילה ב×מצעות הסטה."</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"ביטול נעילה ב×מצעות ציור קו."</string>
- <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"ביטול נעילה ב×מצעות זיהוי פרצוף."</string>
- <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"ביטול נעילה ב×מצעות מספר PIN."</string>
+ <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"ביטול נעילה ב×מצעות זיהוי פני×."</string>
+ <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"â€×‘יטול נעילה ב×מצעות מספר PIN."</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"ביטול נעילה ב×מצעות סיסמה."</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"×זור ציור קו."</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"×זור הסטה."</string>
@@ -71,6 +71,13 @@
<string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"לחצן \'השהה\'"</string>
<string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"לחצן \'הפעל\'"</string>
<string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"לחצן \'הפסק\'"</string>
+ <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"×הבתי"</string>
+ <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"×œ× ×הבתי"</string>
+ <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"לב"</string>
+ <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"בטל נעילה כדי להמשיך"</string>
+ <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"ההפעלה בוטלה"</string>
+ <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"שחרר ×ת <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> למחיקה."</string>
+ <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> ×œ× ×™×™×ž×—×§."</string>
<string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
<string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"×בג"</string>
<string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
@@ -95,30 +102,29 @@
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"שכחת ×ת הקו"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"קו ביטול נעילה שגוי"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"סיסמה שגויה"</string>
- <string name="kg_wrong_pin" msgid="1131306510833563801">"מספר PIN שגוי"</string>
+ <string name="kg_wrong_pin" msgid="1131306510833563801">"â€×ž×¡×¤×¨ PIN שגוי"</string>
<string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"נסה שוב בעוד <xliff:g id="NUMBER">%d</xliff:g> שניות."</string>
<string name="kg_pattern_instructions" msgid="398978611683075868">"שרטט ×ת קו ביטול הנעילה"</string>
- <string name="kg_sim_pin_instructions" msgid="2319508550934557331">"הזן מספר PIN ל-SIM"</string>
- <string name="kg_pin_instructions" msgid="2377242233495111557">"הזן מספר PIN"</string>
+ <string name="kg_sim_pin_instructions" msgid="2319508550934557331">"â€×”זן מספר PIN ל-SIM"</string>
+ <string name="kg_pin_instructions" msgid="2377242233495111557">"â€×”זן מספר PIN"</string>
<string name="kg_password_instructions" msgid="5753646556186936819">"הזן ×ת הסיסמה"</string>
- <string name="kg_puk_enter_puk_hint" msgid="453227143861735537">"כרטיס ×”-SIM מושבת כעת. הזן קוד PUK כדי להמשיך. פנה ×ל הספק לפרטי×."</string>
- <string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"הזן ×ת קוד ×”-PIN הרצוי"</string>
- <string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"×שר ×ת קוד ×”-PIN הרצוי"</string>
- <string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"מבטל נעילה של כרטיס SIM…"</string>
- <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"קוד PIN שגוי."</string>
- <string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"הקלד מספר PIN ש×ורכו 4 עד 8 ספרות."</string>
- <string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"קוד PUK צריך להיות בן 8 ספרות ×ו יותר."</string>
- <string name="kg_invalid_puk" msgid="3638289409676051243">"הזן מחדש ×ת קוד PUK הנכון. ניסיונות ×—×•×–×¨×™× ×™×©×‘×™×ª×• לצמיתות ×ת כרטיס ×”-SIM."</string>
- <string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"קודי ×”-PIN ××™× × ×ª×•×מי×"</string>
+ <string name="kg_puk_enter_puk_hint" msgid="453227143861735537">"â€×›×¨×˜×™×¡ ×”-SIM מושבת כעת. הזן קוד PUK כדי להמשיך. פנה ×ל הספק לפרטי×."</string>
+ <string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"â€×”זן ×ת קוד ×”-PIN הרצוי"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"â€×שר ×ת קוד ×”-PIN הרצוי"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"â€×ž×‘טל נעילה של כרטיס SIM…"</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"â€×”קלד מספר PIN ש×ורכו 4 עד 8 ספרות."</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"â€×§×•ד PUK צריך להיות בן 8 ספרות ×ו יותר."</string>
+ <string name="kg_invalid_puk" msgid="3638289409676051243">"â€×”זן מחדש ×ת קוד PUK הנכון. ניסיונות ×—×•×–×¨×™× ×™×©×‘×™×ª×• לצמיתות ×ת כרטיס ×”-SIM."</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"â€×§×•די ×”-PIN ××™× × ×ª×•×מי×"</string>
<string name="kg_login_too_many_attempts" msgid="6486842094005698475">"ניסיונות ×¨×‘×™× ×ž×“×™ לשרטוט קו ביטול נעילה."</string>
- <string name="kg_login_instructions" msgid="1100551261265506448">"כדי לבטל ×ת הנעילה, היכנס ב×מצעות חשבון Google שלך."</string>
+ <string name="kg_login_instructions" msgid="1100551261265506448">"â€×›×“×™ לבטל ×ת הנעילה, היכנס ב×מצעות חשבון Google שלך."</string>
<string name="kg_login_username_hint" msgid="5718534272070920364">"×©× ×ž×©×ª×ž×© (דו×\"ל)"</string>
<string name="kg_login_password_hint" msgid="9057289103827298549">"סיסמה"</string>
<string name="kg_login_submit_button" msgid="5355904582674054702">"היכנס"</string>
<string name="kg_login_invalid_input" msgid="5754664119319872197">"×©× ×ž×©×ª×ž×© ×ו סיסמה ×œ× ×—×•×§×™×™×."</string>
- <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"שכחת ×ת ×©× ×”×ž×©×ª×ž×© ×ו הסיסמה?\nבקר בכתובת "<b>"google.com/accounts/recovery"</b></string>
+ <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"â€×©×›×—ת ×ת ×©× ×”×ž×©×ª×ž×© ×ו הסיסמה?\nבקר בכתובת "<b>"google.com/accounts/recovery"</b></string>
<string name="kg_login_checking_password" msgid="1052685197710252395">"בודק חשבון…"</string>
- <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"הקלדת מספר PIN שגוי <xliff:g id="NUMBER_0">%d</xliff:g> פעמי×. \n\nנסה שוב בעוד <xliff:g id="NUMBER_1">%d</xliff:g> שניות."</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"â€×”קלדת מספר PIN שגוי <xliff:g id="NUMBER_0">%d</xliff:g> פעמי×. \n\nנסה שוב בעוד <xliff:g id="NUMBER_1">%d</xliff:g> שניות."</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"הקלדת סיסמה שגויה <xliff:g id="NUMBER_0">%d</xliff:g> פעמי×.\n\nנסה שוב בעוד <xliff:g id="NUMBER_1">%d</xliff:g> שניות."</string>
<string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"שרטטת ×ת קו ביטול הנעילה ב×ופן שגוי <xliff:g id="NUMBER_0">%d</xliff:g> פעמי×. \n\nנסה שוב בעוד <xliff:g id="NUMBER_1">%d</xliff:g> שניות."</string>
<string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1575557200627128949">"ביצעת <xliff:g id="NUMBER_0">%d</xliff:g> ניסיונות ×©×’×•×™×™× ×œ×‘×™×˜×•×œ נעילת הטלפון. ל×חר <xliff:g id="NUMBER_1">%d</xliff:g> ניסיונות ×›×•×©×œ×™× × ×•×¡×¤×™×, הט×בלט יעבור ×יפוס לברירת המחדל של היצרן וכל נתוני המשתמש ×™×בדו."</string>
@@ -129,6 +135,19 @@
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"שרטטת ×ת קו ביטול הנעילה ב×ופן שגוי <xliff:g id="NUMBER_0">%d</xliff:g> פעמי×. ל×חר <xliff:g id="NUMBER_1">%d</xliff:g> ניסיונות ×›×•×©×œ×™× × ×•×¡×¤×™×, תתבקש לבטל ×ת נעילת הטלפון ב×מצעות חשבון דו×\"לâ€.\n\nנסה שוב בעוד <xliff:g id="NUMBER_2">%d</xliff:g> שניות."</string>
<string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
<string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"הסר"</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"â€×ž×¡×¤×¨ PIN שגוי של כרטיס ×”-SIM. עליך ליצור כעת קשר ×¢× ×”×¡×¤×§ על מנת לבטל ×ת נעילת המכשיר."</string>
+ <plurals name="kg_password_wrong_pin_code">
+ <item quantity="one" msgid="8134313997799638254">"â€×ž×¡×¤×¨ PIN שגוי של כרטיס ×”-SIM. נותר לך ניסיון <xliff:g id="NUMBER">%d</xliff:g> נוסף לפני שיהיה עליך ליצור קשר ×¢× ×”×¡×¤×§ על מנת לבטל ×ת נעילת המכשיר."</item>
+ <item quantity="other" msgid="2215723361575359486">"â€×ž×¡×¤×¨ PIN שגוי של כרטיס ×”-SIM. נותרו לך <xliff:g id="NUMBER">%d</xliff:g> ניסיונות נוספי×."</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="7077536808291316208">"â€×œ× ניתן להשתמש בכרטיס ×”-SIM. צור קשר ×¢× ×”×¡×¤×§."</string>
+ <plurals name="kg_password_wrong_puk_code">
+ <item quantity="one" msgid="3256893607561060649">"â€×§×•ד PUK שגוי של כרטיס ×”-SIM. נותר לך ניסיון <xliff:g id="NUMBER">%d</xliff:g> נוסף לפני שכרטיס ×”-SIM ינעל לצמיתות."</item>
+ <item quantity="other" msgid="5477305226026342036">"â€×§×•ד PUK שגוי של כרטיס ×”-SIM. נותרו לך <xliff:g id="NUMBER">%d</xliff:g> ניסיונות × ×•×¡×¤×™× ×œ×¤× ×™ שכרטיס ×”-SIM ינעל לצמיתות."</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="6268288093558031564">"â€×¤×¢×•לת מספר ×”-PIN של כרטיס ×”-SIM נכשלה!"</string>
+ <string name="kg_password_puk_failed" msgid="2838824369502455984">"â€×¤×¢×•לת קוד ×”-PUK של כרטיס ×”-SIM נכשלה!"</string>
+ <string name="kg_pin_accepted" msgid="1448241673570020097">"הקוד התקבל!"</string>
<string name="keyguard_transport_prev_description" msgid="8229108430245669854">"לחצן \'הרצועה הקודמת\'"</string>
<string name="keyguard_transport_next_description" msgid="4299258300283778305">"לחצן \'הרצועה הב××”\'"</string>
<string name="keyguard_transport_pause_description" msgid="5093073338238310224">"לחצן \'השהה\'"</string>
diff --git a/packages/Keyguard/res/values-ja/strings.xml b/packages/Keyguard/res/values-ja/strings.xml
index 92e308b..5106271 100644
--- a/packages/Keyguard/res/values-ja/strings.xml
+++ b/packages/Keyguard/res/values-ja/strings.xml
@@ -21,9 +21,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"PINコードを入力"</string>
- <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"PUKã¨æ–°ã—ã„PINコードを入力"</string>
- <string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"PUKコード"</string>
- <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"æ–°ã—ã„PINコード"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="3035856550289724338">"PUKã¨æ–°ã—ã„PINコードを入力"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="1801941051094974609">"SIM PUKコード"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="3201151840570492538">"æ–°ã—ã„SIM PINコード"</string>
<string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"タップã—ã¦ãƒ‘スワードを入力"</font></string>
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"ロックを解除ã™ã‚‹ã«ã¯ãƒ‘スワードを入力"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"ロックを解除ã™ã‚‹ã«ã¯PINを入力"</string>
@@ -71,6 +71,13 @@
<string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"ä¸€æ™‚åœæ­¢ãƒœã‚¿ãƒ³"</string>
<string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"å†ç”Ÿãƒœã‚¿ãƒ³"</string>
<string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"åœæ­¢ãƒœã‚¿ãƒ³"</string>
+ <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"グッド"</string>
+ <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"イマイãƒ"</string>
+ <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"ãƒãƒ¼ãƒˆ"</string>
+ <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"続行ã™ã‚‹ã«ã¯ãƒ­ãƒƒã‚¯ã‚’解除ã—ã¦ãã ã•ã„"</string>
+ <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"起動をキャンセルã—ã¾ã—ãŸ"</string>
+ <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"削除ã™ã‚‹ã«ã¯<xliff:g id="WIDGET_INDEX">%1$s</xliff:g>をドロップã—ã¦ãã ã•ã„。"</string>
+ <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g>ã¯å‰Šé™¤ã•れã¾ã›ã‚“。"</string>
<string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
<string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
<string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
@@ -105,7 +112,6 @@
<string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"希望ã®PINコードを入力ã—ã¦ãã ã•ã„"</string>
<string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"希望ã®PINコードを確èªã—ã¦ãã ã•ã„"</string>
<string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"SIMカードã®ãƒ­ãƒƒã‚¯è§£é™¤ä¸­â€¦"</string>
- <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"PINã‚³ãƒ¼ãƒ‰ãŒæ­£ã—ãã‚りã¾ã›ã‚“。"</string>
<string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"PINã¯4~8æ¡ã®æ•°å­—ã§å…¥åŠ›ã—ã¦ãã ã•ã„。"</string>
<string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"PUKコードã¯8æ¡ä»¥ä¸Šã®ç•ªå·ã§ã™ã€‚"</string>
<string name="kg_invalid_puk" msgid="3638289409676051243">"æ­£ã—ã„PUKコードをå†å…¥åŠ›ã—ã¦ãã ã•ã„。誤入力を繰り返ã™ã¨ã€SIMãŒæ°¸ä¹…ã«ç„¡åйã«ãªã‚‹ãŠãれãŒã‚りã¾ã™ã€‚"</string>
@@ -129,6 +135,19 @@
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"ロック解除パターンã®å…¥åŠ›ã‚’<xliff:g id="NUMBER_0">%d</xliff:g>回間é•ãˆã¾ã—ãŸã€‚ã‚ã¨<xliff:g id="NUMBER_1">%d</xliff:g>回間é•ãˆã‚‹ã¨ã€æºå¸¯ç«¯æœ«ã®ãƒ­ãƒƒã‚¯è§£é™¤ã«ãƒ¡ãƒ¼ãƒ«ã‚¢ã‚«ã‚¦ãƒ³ãƒˆãŒå¿…è¦ã«ãªã‚Šã¾ã™ã€‚\n\n<xliff:g id="NUMBER_2">%d</xliff:g>秒後ã«ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。"</string>
<string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" - "</string>
<string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"削除"</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"SIM PINコードãŒç„¡åйã§ã™ã€‚ãŠä½¿ã„ã®ç«¯æœ«ã‚’ロック解除ã™ã‚‹ã«ã¯æºå¸¯é€šä¿¡ä¼šç¤¾ã«ãŠå•ã„åˆã‚ã›ã„ãŸã ãå¿…è¦ãŒã‚りã¾ã™ã€‚"</string>
+ <plurals name="kg_password_wrong_pin_code">
+ <item quantity="one" msgid="8134313997799638254">"SIM PINコードãŒç„¡åйã§ã™ã€‚入力ã§ãã‚‹ã®ã¯ã‚ã¨<xliff:g id="NUMBER">%d</xliff:g>回ã§ã™ã€‚ã“ã®å›žæ•°ã‚’è¶…ãˆã‚‹ã¨ã€ãŠä½¿ã„ã®ç«¯æœ«ã‚’ロック解除ã™ã‚‹ã®ã«æºå¸¯é€šä¿¡ä¼šç¤¾ã«ãŠå•ã„åˆã‚ã›ã„ãŸã ãå¿…è¦ãŒã‚りã¾ã™ã€‚"</item>
+ <item quantity="other" msgid="2215723361575359486">"SIM PINコードãŒç„¡åйã§ã™ã€‚入力ã§ãã‚‹ã®ã¯ã‚ã¨<xliff:g id="NUMBER">%d</xliff:g>回ã§ã™ã€‚"</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="7077536808291316208">"SIMã¯ä½¿ç”¨ã§ãã¾ã›ã‚“。æºå¸¯é€šä¿¡ä¼šç¤¾ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。"</string>
+ <plurals name="kg_password_wrong_puk_code">
+ <item quantity="one" msgid="3256893607561060649">"SIM PUKコードãŒç„¡åйã§ã™ã€‚入力ã§ãã‚‹ã®ã¯ã‚ã¨<xliff:g id="NUMBER">%d</xliff:g>回ã§ã™ã€‚ã“ã®å›žæ•°ã‚’è¶…ãˆã‚‹ã¨SIMã¯å®Œå…¨ã«ä½¿ç”¨ã§ããªããªã‚Šã¾ã™ã€‚"</item>
+ <item quantity="other" msgid="5477305226026342036">"SIM PUKコードãŒç„¡åйã§ã™ã€‚入力ã§ãã‚‹ã®ã¯ã‚ã¨<xliff:g id="NUMBER">%d</xliff:g>回ã§ã™ã€‚ã“ã®å›žæ•°ã‚’è¶…ãˆã‚‹ã¨SIMã¯å®Œå…¨ã«ä½¿ç”¨ã§ããªããªã‚Šã¾ã™ã€‚"</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="6268288093558031564">"SIM PINæ“作ã«å¤±æ•—ã—ã¾ã—ãŸã€‚"</string>
+ <string name="kg_password_puk_failed" msgid="2838824369502455984">"SIM PUKæ“作ã«å¤±æ•—ã—ã¾ã—ãŸã€‚"</string>
+ <string name="kg_pin_accepted" msgid="1448241673570020097">"ã‚³ãƒ¼ãƒ‰ãŒæ‰¿èªã•れã¾ã—ãŸã€‚"</string>
<string name="keyguard_transport_prev_description" msgid="8229108430245669854">"å‰ã®ãƒˆãƒ©ãƒƒã‚¯ãƒœã‚¿ãƒ³"</string>
<string name="keyguard_transport_next_description" msgid="4299258300283778305">"次ã®ãƒˆãƒ©ãƒƒã‚¯ãƒœã‚¿ãƒ³"</string>
<string name="keyguard_transport_pause_description" msgid="5093073338238310224">"ä¸€æ™‚åœæ­¢ãƒœã‚¿ãƒ³"</string>
diff --git a/packages/Keyguard/res/values-ka-rGE/strings.xml b/packages/Keyguard/res/values-ka-rGE/strings.xml
new file mode 100644
index 0000000..3d7af75
--- /dev/null
+++ b/packages/Keyguard/res/values-ka-rGE/strings.xml
@@ -0,0 +1,157 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"áƒáƒ™áƒ áƒ˜áƒ¤áƒ”თ PIN კáƒáƒ“ი"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="3035856550289724338">"დáƒáƒ‘ეჭდეთ SIM-ის PUK კáƒáƒ“ი დრáƒáƒ®áƒáƒšáƒ˜ PIN კáƒáƒ“ი"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="1801941051094974609">"SIM PUK კáƒáƒ“ი"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="3201151840570492538">"SIM-ის áƒáƒ®áƒáƒšáƒ˜ PIN-ის კáƒáƒ“ი"</string>
+ <string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384">"შეეხეთ "<font size="17">"-ს პáƒáƒ áƒáƒšáƒ˜áƒ¡"</font>" დáƒáƒ¡áƒáƒ‘ეჭდáƒáƒ“."</string>
+ <string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"გáƒáƒœáƒ¡áƒáƒ‘ლáƒáƒ™áƒáƒ“ áƒáƒ™áƒ áƒ˜áƒ¤áƒ”თ პáƒáƒ áƒáƒšáƒ˜"</string>
+ <string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"გáƒáƒœáƒ¡áƒáƒ‘ლáƒáƒ™áƒáƒ“ áƒáƒ™áƒ áƒ˜áƒ¤áƒ”თ PIN კáƒáƒ“ი"</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ PIN კáƒáƒ“ი."</string>
+ <string name="keyguard_label_text" msgid="861796461028298424">"გáƒáƒœáƒ‘ლáƒáƒ™áƒ•ისáƒáƒ—ვის დáƒáƒáƒ­áƒ˜áƒ áƒ”თ მენიუს დრშემდეგ 0-ს."</string>
+ <string name="faceunlock_multiple_failures" msgid="754137583022792429">"სáƒáƒ®áƒ˜áƒ¡ áƒáƒ›áƒáƒªáƒœáƒáƒ‘ით გáƒáƒœáƒ‘ლáƒáƒ™áƒ•ის მცდელáƒáƒ‘áƒáƒ› დáƒáƒ¨áƒ•ებულ რáƒáƒáƒ“ენáƒáƒ‘áƒáƒ¡ გáƒáƒ“áƒáƒáƒ­áƒáƒ áƒ‘áƒ"</string>
+ <string name="keyguard_charged" msgid="3272223906073492454">"დáƒáƒ›áƒ£áƒ®áƒ¢áƒ£áƒšáƒ˜áƒ"</string>
+ <string name="keyguard_plugged_in" msgid="8117572000639998388">"მიმდინáƒáƒ áƒ”áƒáƒ‘ს დáƒáƒ›áƒ£áƒ®áƒ¢áƒ•რ(<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
+ <string name="keyguard_low_battery" msgid="8143808018719173859">"შეáƒáƒ”რთეთ დáƒáƒ›áƒ¢áƒ”ნი."</string>
+ <string name="keyguard_instructions_when_pattern_disabled" msgid="1332288268600329841">"გáƒáƒœáƒ‘ლáƒáƒ™áƒ•ისთვის დáƒáƒáƒ­áƒ˜áƒ áƒ”თ მენიუს."</string>
+ <string name="keyguard_network_locked_message" msgid="9169717779058037168">"ქსელი ჩáƒáƒ™áƒ”ტილიáƒ"</string>
+ <string name="keyguard_missing_sim_message_short" msgid="494980561304211931">"SIM ბáƒáƒ áƒáƒ—ი áƒáƒ  áƒáƒ áƒ˜áƒ¡"</string>
+ <string name="keyguard_missing_sim_message" product="tablet" msgid="1445849005909260039">"ტáƒáƒ‘ლეტში áƒáƒ  დევს SIM ბáƒáƒ áƒáƒ—ი."</string>
+ <string name="keyguard_missing_sim_message" product="default" msgid="3481110395508637643">"áƒáƒ  áƒáƒ áƒ˜áƒ¡ SIM ბáƒáƒ áƒáƒ—ი ტელეფáƒáƒœáƒ¨áƒ˜."</string>
+ <string name="keyguard_missing_sim_instructions" msgid="5210891509995942250">"ჩáƒáƒ“ეთ SIM ბáƒáƒ áƒáƒ—ი."</string>
+ <string name="keyguard_missing_sim_instructions_long" msgid="5968985489463870358">"SIM ბáƒáƒ áƒáƒ—ი áƒáƒ  áƒáƒ áƒ˜áƒ¡ áƒáƒœ áƒáƒ  იკითხებáƒ. ჩáƒáƒ“ეთ SIM ბáƒáƒ áƒáƒ—ი."</string>
+ <string name="keyguard_permanent_disabled_sim_message_short" msgid="8340813989586622356">"áƒáƒ áƒáƒ›áƒáƒ®áƒ›áƒáƒ áƒ”ბáƒáƒ“ი SIM ბáƒáƒ áƒáƒ—ი."</string>
+ <string name="keyguard_permanent_disabled_sim_instructions" msgid="5892940909699723544">"თქვენი SIM ბáƒáƒ áƒáƒ—ი გáƒáƒ›áƒ£áƒ“მებით გáƒáƒ›áƒáƒ áƒ—ული იყáƒ.\n დáƒáƒ£áƒ™áƒáƒ•შირდით თქვენი უკáƒáƒ‘ელრსერვისის პრáƒáƒ•áƒáƒ˜áƒ“ერს სხვრSIM ბáƒáƒ áƒáƒ—ისთვის."</string>
+ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM ბáƒáƒ áƒáƒ—ი დáƒáƒ‘ლáƒáƒ™áƒ˜áƒšáƒ˜áƒ."</string>
+ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM ბáƒáƒ áƒáƒ—ი დáƒáƒ‘ლáƒáƒ™áƒ˜áƒšáƒ˜áƒ PUK კáƒáƒ“ით."</string>
+ <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"მიმდინáƒáƒ áƒ”áƒáƒ‘ს SIM ბáƒáƒ áƒáƒ—ის გáƒáƒœáƒ‘ლáƒáƒ™áƒ•áƒâ€¦"</string>
+ <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. ვიჯეტი %2$d of %3$d."</string>
+ <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"ვიჯეტის დáƒáƒ›áƒáƒ¢áƒ”ბáƒ"</string>
+ <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"ცáƒáƒ áƒ˜áƒ”ლი"</string>
+ <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"გáƒáƒœáƒ‘ლáƒáƒ™áƒ•ის სივრცე გáƒáƒ¨áƒšáƒ˜áƒšáƒ˜áƒ."</string>
+ <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"გáƒáƒœáƒ‘ლáƒáƒ™áƒ•ის სივრცე ჩáƒáƒ™áƒ”ცილიáƒ."</string>
+ <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> ვიჯეტი."</string>
+ <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის áƒáƒ›áƒáƒ›áƒ áƒ©áƒ”ველი"</string>
+ <string name="keyguard_accessibility_status" msgid="8008264603935930611">"სტáƒáƒ¢áƒ£áƒ¡áƒ˜"</string>
+ <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"კáƒáƒ›áƒ”რáƒ"</string>
+ <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"მედიის მáƒáƒ áƒ—ვის ელემენტები"</string>
+ <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"დáƒáƒ˜áƒ¬áƒ§áƒ ვიჯეტის ხელáƒáƒ®áƒšáƒ გáƒáƒœáƒšáƒáƒ’ებáƒ."</string>
+ <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"ვიჯეტების გáƒáƒ“áƒáƒ®áƒáƒ áƒ˜áƒ¡áƒ®áƒ”ბრდáƒáƒ¡áƒ áƒ£áƒšáƒ”ბულიáƒ."</string>
+ <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"ვიჯეტი <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> წáƒáƒ˜áƒ¨áƒáƒšáƒ."</string>
+ <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"გáƒáƒœáƒ‘ლáƒáƒ™áƒ•ის სივრცის გáƒáƒ¨áƒšáƒ."</string>
+ <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"გáƒáƒ¡áƒ áƒ˜áƒáƒšáƒ”ბით გáƒáƒœáƒ‘ლáƒáƒ™áƒ•áƒ"</string>
+ <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"გáƒáƒœáƒ‘ლáƒáƒ™áƒ•რნიმუშით."</string>
+ <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"გáƒáƒœáƒ‘ლáƒáƒ™áƒ•რსáƒáƒ®áƒ˜áƒ—"</string>
+ <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"გáƒáƒœáƒ‘ლáƒáƒ™áƒ•რPin-ით."</string>
+ <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"პáƒáƒ áƒáƒšáƒ˜áƒ¡ გáƒáƒœáƒ‘ლáƒáƒ™áƒ•áƒ"</string>
+ <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"ნიმუშების სივრცე."</string>
+ <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"გáƒáƒ“áƒáƒ¡áƒ áƒ˜áƒáƒšáƒ”ბის სივრცე."</string>
+ <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"წინრჩáƒáƒœáƒáƒ¬áƒ”რის ღილáƒáƒ™áƒ˜"</string>
+ <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"შემდეგი ჩáƒáƒœáƒáƒ¬áƒ”რის ღილáƒáƒ™áƒ˜"</string>
+ <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"პáƒáƒ£áƒ–ის ღილáƒáƒ™áƒ˜"</string>
+ <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"დáƒáƒ™áƒ•რის ღილáƒáƒ™áƒ˜"</string>
+ <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Stop ღილáƒáƒ™áƒ˜"</string>
+ <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"ზევით áƒáƒ¬áƒ”ული ცერი"</string>
+ <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"ქვევით დáƒáƒ®áƒ áƒ˜áƒšáƒ˜ ცერი"</string>
+ <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"გული"</string>
+ <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"გáƒáƒœáƒ‘ლáƒáƒ™áƒ”თ გáƒáƒ¡áƒáƒ’რძელებლáƒáƒ“"</string>
+ <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"გáƒáƒ›áƒáƒ«áƒáƒ®áƒ”ბრგáƒáƒ£áƒ¥áƒ›áƒ“áƒ"</string>
+ <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"ჩáƒáƒáƒ’დეთ <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> წáƒáƒ¡áƒáƒ¨áƒšáƒ”ლáƒáƒ“."</string>
+ <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> áƒáƒ  წáƒáƒ˜áƒ¨áƒšáƒ”ბáƒ."</string>
+ <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
+ <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
+ <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
+ <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
+ <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"გáƒáƒ£áƒ¥áƒ›áƒ”ბáƒ"</string>
+ <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"წáƒáƒ¨áƒšáƒ"</string>
+ <string name="keyboardview_keycode_done" msgid="1992571118466679775">"დáƒáƒ¡áƒ áƒ£áƒšáƒ“áƒ"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"რეჟიმის შეცვლáƒ"</string>
+ <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift-"</string>
+ <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"შეყვáƒáƒœáƒ"</string>
+ <string name="description_target_unlock" msgid="2228524900439801453">"გáƒáƒœáƒ‘ლáƒáƒ™áƒ•áƒ"</string>
+ <string name="description_target_camera" msgid="969071997552486814">"კáƒáƒ›áƒ”რáƒ"</string>
+ <string name="description_target_silent" msgid="893551287746522182">"უხმáƒ"</string>
+ <string name="description_target_soundon" msgid="30052466675500172">"ხმის ჩáƒáƒ áƒ—ვáƒ"</string>
+ <string name="description_target_search" msgid="3091587249776033139">"ძიებáƒ"</string>
+ <string name="description_direction_up" msgid="7169032478259485180">"გáƒáƒáƒ¡áƒ áƒ˜áƒáƒšáƒ”თ ზემáƒáƒ— <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>-თვის."</string>
+ <string name="description_direction_down" msgid="5087739728639014595">"გáƒáƒáƒ¡áƒ áƒ˜áƒáƒšáƒ”თ ქვემáƒáƒ— <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>-თვის."</string>
+ <string name="description_direction_left" msgid="7207478719805562165">"გáƒáƒáƒ¡áƒ áƒ˜áƒáƒšáƒ”თ მáƒáƒ áƒªáƒ®áƒœáƒ˜áƒ• <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>-თვის."</string>
+ <string name="description_direction_right" msgid="8034433242579600980">"გáƒáƒáƒ¡áƒ áƒ˜áƒáƒšáƒ”თ მáƒáƒ áƒ¯áƒ•ნივ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>-თვის."</string>
+ <string name="user_switched" msgid="3768006783166984410">"áƒáƒ›áƒŸáƒáƒ›áƒ˜áƒœáƒ“ელი მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი <xliff:g id="NAME">%1$s</xliff:g>."</string>
+ <string name="kg_emergency_call_label" msgid="684946192523830531">"გáƒáƒ“áƒáƒ£áƒ“ებელი დáƒáƒ®áƒ›áƒáƒ áƒ”ბის ზáƒáƒ áƒ˜"</string>
+ <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"დáƒáƒ’áƒáƒ•იწყდáƒáƒ— ნიმუში"</string>
+ <string name="kg_wrong_pattern" msgid="1850806070801358830">"áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ნიმუში"</string>
+ <string name="kg_wrong_password" msgid="2333281762128113157">"áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ პáƒáƒ áƒáƒšáƒ˜"</string>
+ <string name="kg_wrong_pin" msgid="1131306510833563801">"áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ PIN"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"კიდევ სცáƒáƒ“ეთ <xliff:g id="NUMBER">%d</xliff:g> წáƒáƒ›áƒ¨áƒ˜."</string>
+ <string name="kg_pattern_instructions" msgid="398978611683075868">"დáƒáƒ®áƒáƒ¢áƒ”თ თქვენი ნიმუში."</string>
+ <string name="kg_sim_pin_instructions" msgid="2319508550934557331">"SIM PIN-ის შეყვáƒáƒœáƒ"</string>
+ <string name="kg_pin_instructions" msgid="2377242233495111557">"შეიყვáƒáƒœáƒ”თ PIN"</string>
+ <string name="kg_password_instructions" msgid="5753646556186936819">"პáƒáƒ áƒáƒšáƒ˜áƒ¡ შეყვáƒáƒœáƒ"</string>
+ <string name="kg_puk_enter_puk_hint" msgid="453227143861735537">"SIM áƒáƒ›áƒŸáƒáƒ›áƒáƒ“ დეáƒáƒ¥áƒ¢áƒ˜áƒ•ირებულიáƒ. გáƒáƒ¡áƒáƒ’რძელებლáƒáƒ“ შეიყვáƒáƒœáƒ”თ PUK კáƒáƒ“ი. დეტáƒáƒšáƒ”ბისთვის მიმáƒáƒ áƒ—ეთ მáƒáƒ‘ილურ áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ¡."</string>
+ <string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"სáƒáƒ¡áƒ£áƒ áƒ•ელი PIN კáƒáƒ“ის შეყვáƒáƒœáƒ"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"სáƒáƒ¡áƒ£áƒ áƒ•ელი PIN კáƒáƒ“ის დáƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ”ბáƒ"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"SIM ბáƒáƒ áƒáƒ—ის გáƒáƒœáƒ‘ლáƒáƒ™áƒ•áƒâ€¦"</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"áƒáƒ™áƒ áƒ˜áƒ¤áƒ”თ PIN, რáƒáƒ›áƒ”ლიც შედგებრ4-დáƒáƒœ 8 ციფრáƒáƒ›áƒ“ე."</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"PUK კáƒáƒ“ი უნდრიყáƒáƒ¡ რვრáƒáƒœ მეტი ციფრისგáƒáƒœ შემდგáƒáƒ áƒ˜."</string>
+ <string name="kg_invalid_puk" msgid="3638289409676051243">"ხელáƒáƒ®áƒšáƒ შეიყვáƒáƒœáƒ”თ სწáƒáƒ áƒ˜ PUK კáƒáƒ“ი. რáƒáƒ›áƒ“ენიმე წáƒáƒ áƒ£áƒ›áƒáƒ¢áƒ”ბელი მცდელáƒáƒ‘რგáƒáƒ›áƒáƒ˜áƒ¬áƒ•ევს SIM ბáƒáƒ áƒáƒ—ის დáƒáƒ‘ლáƒáƒ™áƒ•áƒáƒ¡."</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"PIN კáƒáƒ“ები áƒáƒ  ემთხვევáƒ"</string>
+ <string name="kg_login_too_many_attempts" msgid="6486842094005698475">"ნáƒáƒ®áƒáƒ¢áƒ˜ ნიმუშის ძáƒáƒšáƒ˜áƒáƒœ ბევრი მცდელáƒáƒ‘áƒ"</string>
+ <string name="kg_login_instructions" msgid="1100551261265506448">"გáƒáƒœáƒ‘ლáƒáƒ™áƒ•ისთვის გáƒáƒ˜áƒáƒ áƒ”თ áƒáƒ•ტáƒáƒ áƒ˜áƒ–áƒáƒªáƒ˜áƒ თქვენი Google áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜áƒ—."</string>
+ <string name="kg_login_username_hint" msgid="5718534272070920364">"მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი (ელფáƒáƒ¡áƒ¢áƒ)"</string>
+ <string name="kg_login_password_hint" msgid="9057289103827298549">"პáƒáƒ áƒáƒšáƒ˜"</string>
+ <string name="kg_login_submit_button" msgid="5355904582674054702">"შესვლáƒ"</string>
+ <string name="kg_login_invalid_input" msgid="5754664119319872197">"áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სáƒáƒ®áƒ”ლი, áƒáƒœ პáƒáƒ áƒáƒšáƒ˜."</string>
+ <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"დáƒáƒ’áƒáƒ•იწყდáƒáƒ— მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი დრპáƒáƒ áƒáƒšáƒ˜?\nეწვიეთ "<b>"google.com/accounts/recovery"</b>"."</string>
+ <string name="kg_login_checking_password" msgid="1052685197710252395">"მიმდინáƒáƒ áƒ”áƒáƒ‘ს áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜áƒ¡ შემáƒáƒ¬áƒ›áƒ”ბáƒâ€¦"</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"თქვენ <xliff:g id="NUMBER_0">%d</xliff:g>-ჯერ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒáƒ“ შეიყვáƒáƒœáƒ”თ PIN კáƒáƒ“ი. \n\nსცáƒáƒ“ეთ ხელáƒáƒ®áƒšáƒ <xliff:g id="NUMBER_1">%d</xliff:g> წáƒáƒ›áƒ¨áƒ˜."</string>
+ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"თქვენ <xliff:g id="NUMBER_0">%d</xliff:g>-ჯერ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒáƒ“ დáƒáƒ‘ეჭდეთ თქვენი პáƒáƒ áƒáƒšáƒ˜. \n\nხელáƒáƒ®áƒšáƒ სცáƒáƒ“ეთ <xliff:g id="NUMBER_1">%d</xliff:g> წáƒáƒ›áƒ¨áƒ˜."</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"თქვენ <xliff:g id="NUMBER_0">%d</xliff:g>-ჯერ დáƒáƒ®áƒáƒ¢áƒ”თ გáƒáƒœáƒ‘ლáƒáƒ™áƒ•ის ნიმუში. \n\nსცáƒáƒ“ეთ ხელáƒáƒ®áƒšáƒ <xliff:g id="NUMBER_1">%d</xliff:g> წáƒáƒ›áƒ¨áƒ˜."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1575557200627128949">"თქვენ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒáƒ“ სცáƒáƒ“ეთ ტáƒáƒ‘ლეტის გáƒáƒœáƒ‘ლáƒáƒ™áƒ•რ<xliff:g id="NUMBER_0">%d</xliff:g>-ჯერ. კიდევ <xliff:g id="NUMBER_1">%d</xliff:g> წáƒáƒ áƒ£áƒ›áƒáƒ¢áƒ”ბელი ცდის შემდეგ ტáƒáƒ‘ლეტზე დáƒáƒ§áƒ”ნდებრსáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜, ქáƒáƒ áƒ®áƒœáƒ£áƒšáƒ˜ პáƒáƒ áƒáƒ›áƒ”ტრები დრმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ყველრმáƒáƒœáƒáƒªáƒ”მი დáƒáƒ˜áƒ™áƒáƒ áƒ’ებáƒ."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="4051015943038199910">"თქვენ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒáƒ“ სცáƒáƒ“ეთ ტელეფáƒáƒœáƒ˜áƒ¡ გáƒáƒœáƒ‘ლáƒáƒ™áƒ•რ<xliff:g id="NUMBER_0">%d</xliff:g>-ჯერ. კიდევ <xliff:g id="NUMBER_1">%d</xliff:g> წáƒáƒ áƒ£áƒ›áƒáƒ¢áƒ”ბელი ცდის შემდეგ ტელეფáƒáƒœáƒ–ე დáƒáƒ§áƒ”ნდებრსáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜, ქáƒáƒ áƒ®áƒœáƒ£áƒšáƒ˜ პáƒáƒ áƒáƒ›áƒ”ტრები დრმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ყველრმáƒáƒœáƒáƒªáƒ”მი დáƒáƒ˜áƒ™áƒáƒ áƒ’ებáƒ."</string>
+ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="2072996269148483637">"თქვენ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒáƒ“ სცáƒáƒ“ეთ ტáƒáƒ‘ლეტის გáƒáƒœáƒ‘ლáƒáƒ™áƒ•რ<xliff:g id="NUMBER">%d</xliff:g>-ჯერ. ტáƒáƒ‘ლეტზე დáƒáƒ§áƒ”ნდებრსáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜, ქáƒáƒ áƒ®áƒœáƒ£áƒšáƒ˜ პáƒáƒ áƒáƒ›áƒ”ტრები დრმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ყველრმáƒáƒœáƒáƒªáƒ”მი დáƒáƒ˜áƒ™áƒáƒ áƒ’ებáƒ."</string>
+ <string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"თქვენ <xliff:g id="NUMBER">%d</xliff:g>-ჯერ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒáƒ“ სცáƒáƒ“ეთ ტელეფáƒáƒœáƒ˜áƒ¡ გáƒáƒœáƒ‘ლáƒáƒ™áƒ•áƒ. áƒáƒ›áƒ˜áƒ¢áƒáƒ› ტელეფáƒáƒœáƒ–ე დáƒáƒ“გებრსáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜, ქáƒáƒ áƒ®áƒœáƒ£áƒšáƒ˜ პáƒáƒ áƒáƒ›áƒ”ტრები."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"თქვენ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒáƒ“ დáƒáƒ®áƒáƒ¢áƒ”თ თქვენი გáƒáƒœáƒ‘ლáƒáƒ™áƒ•ის ნიმუში <xliff:g id="NUMBER_0">%d</xliff:g> ჯერ. კიდევ <xliff:g id="NUMBER_1">%d</xliff:g> წáƒáƒ áƒ£áƒ›áƒáƒ¢áƒ”ბელი ცდის შემდეგ მáƒáƒ’თხáƒáƒ•თ ტáƒáƒ‘ლეტის გáƒáƒœáƒ‘ლáƒáƒ™áƒ•áƒáƒ¡ ელფáƒáƒ¡áƒ¢áƒ˜áƒ¡ áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜áƒ¡ გáƒáƒ›áƒáƒ§áƒ”ნებით.\n\n ხელáƒáƒ®áƒšáƒ სცáƒáƒ“ეთ <xliff:g id="NUMBER_2">%d</xliff:g> წáƒáƒ›áƒ¨áƒ˜."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"თქვენ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒáƒ“ დáƒáƒ®áƒáƒ¢áƒ”თ თქვენი გáƒáƒœáƒ‘ლáƒáƒ™áƒ•ის ნიმუში <xliff:g id="NUMBER_0">%d</xliff:g>-ჯერ. კიდევ <xliff:g id="NUMBER_1">%d</xliff:g> წáƒáƒ áƒ£áƒ›áƒáƒ¢áƒ”ბელი ცდის შემდეგ, დáƒáƒ’ჭირდებáƒáƒ— თქვენი ტელეფáƒáƒœáƒ˜áƒ¡ გáƒáƒœáƒ‘ლáƒáƒ™áƒ•რელფáƒáƒ¡áƒ¢áƒ˜áƒ¡ áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜áƒ¡ გáƒáƒ›áƒáƒ§áƒ”ნებით.\n\n ხელáƒáƒ®áƒšáƒ სცáƒáƒ“ეთ <xliff:g id="NUMBER_2">%d</xliff:g> წáƒáƒ›áƒ¨áƒ˜."</string>
+ <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
+ <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"áƒáƒ›áƒáƒ¨áƒšáƒ"</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"SIM-ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ PIN კáƒáƒ“ი. თქვენ áƒáƒ®áƒšáƒ მáƒáƒ’იწევთ მáƒáƒ¬áƒ§áƒáƒ‘ილáƒáƒ‘ის გáƒáƒœáƒ¡áƒáƒ‘ლáƒáƒ™áƒáƒ“ მიმáƒáƒ áƒ—áƒáƒ— áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ¡."</string>
+ <plurals name="kg_password_wrong_pin_code">
+ <item quantity="one" msgid="8134313997799638254">"SIM-ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ PIN კáƒáƒ“ი. თქვენ დáƒáƒ’რჩáƒáƒ— <xliff:g id="NUMBER">%d</xliff:g> მცდელáƒáƒ‘áƒ, სáƒáƒœáƒáƒ› მáƒáƒ’იწევთ თქვენი მáƒáƒ¬áƒ§áƒáƒ‘ილáƒáƒ‘ის გáƒáƒœáƒ¡áƒáƒ‘ლáƒáƒ™áƒáƒ“ áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ—áƒáƒœ დáƒáƒ™áƒáƒ•შირებáƒ."</item>
+ <item quantity="other" msgid="2215723361575359486">"SIM-ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ PIN კáƒáƒ“ი. თქვენ დáƒáƒ’რჩáƒáƒ— <xliff:g id="NUMBER">%d</xliff:g> მცდელáƒáƒ‘áƒ."</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="7077536808291316208">"SIM გáƒáƒ›áƒáƒ£áƒ¡áƒáƒ“ეგáƒáƒ áƒ˜áƒ. დáƒáƒ£áƒ™áƒáƒ•შირდით áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ¡."</string>
+ <plurals name="kg_password_wrong_puk_code">
+ <item quantity="one" msgid="3256893607561060649">"áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ SIM PUK კáƒáƒ“ი. თქვენ დáƒáƒ’რჩáƒáƒ— <xliff:g id="NUMBER">%d</xliff:g> მცდელáƒáƒ‘áƒ, სáƒáƒœáƒáƒ› SIM სáƒáƒ›áƒ£áƒ“áƒáƒ›áƒáƒ“ გáƒáƒ›áƒáƒ£áƒ¡áƒáƒ“ეგáƒáƒ áƒ˜ გáƒáƒ®áƒ“ებáƒáƒ“ეს."</item>
+ <item quantity="other" msgid="5477305226026342036">"áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ SIM PUK კáƒáƒ“ი. თქვენ დáƒáƒ’რჩáƒáƒ— <xliff:g id="NUMBER">%d</xliff:g> მცდელáƒáƒ‘áƒ, სáƒáƒœáƒáƒ› SIM სáƒáƒ›áƒ£áƒ“áƒáƒ›áƒáƒ“ გáƒáƒ›áƒáƒ£áƒ¡áƒáƒ“ეგáƒáƒ áƒ˜ გáƒáƒ®áƒ“ებáƒáƒ“ეს."</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="6268288093558031564">"SIM PIN áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ ჩáƒáƒ˜áƒ¨áƒáƒšáƒ!"</string>
+ <string name="kg_password_puk_failed" msgid="2838824369502455984">"SIM PUK áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ ჩáƒáƒ˜áƒ¨áƒáƒšáƒ!"</string>
+ <string name="kg_pin_accepted" msgid="1448241673570020097">"კáƒáƒ“ი მიღებულიáƒ!"</string>
+ <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"წინრჩáƒáƒœáƒáƒ¬áƒ”რზე გáƒáƒ“áƒáƒ¡áƒ•ლის ღილáƒáƒ™áƒ˜"</string>
+ <string name="keyguard_transport_next_description" msgid="4299258300283778305">"შემდეგი ჩáƒáƒœáƒáƒ¬áƒ”რის ღილáƒáƒ™áƒ˜"</string>
+ <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"პáƒáƒ£áƒ–ის ღილáƒáƒ™áƒ˜"</string>
+ <string name="keyguard_transport_play_description" msgid="2924628863741150956">"დáƒáƒ™áƒ•რის ღილáƒáƒ™áƒ˜"</string>
+ <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"შეჩერების ღილáƒáƒ™áƒ˜"</string>
+ <string name="keyguard_carrier_default" msgid="8700650403054042153">"áƒáƒ  áƒáƒ áƒ˜áƒ¡ სერვისი."</string>
+</resources>
diff --git a/packages/Keyguard/res/values-ka/strings.xml b/packages/Keyguard/res/values-ka/strings.xml
new file mode 100644
index 0000000..b901bf4
--- /dev/null
+++ b/packages/Keyguard/res/values-ka/strings.xml
@@ -0,0 +1,138 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"áƒáƒ™áƒ áƒ˜áƒ¤áƒ”თ PIN კáƒáƒ“ი"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"დáƒáƒ‘ეჭდეთ PUK კáƒáƒ“ი დრáƒáƒ®áƒáƒšáƒ˜ PIN კáƒáƒ“ი."</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"PUK კáƒáƒ“ი"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"áƒáƒ®áƒáƒšáƒ˜ PIN კáƒáƒ“ი"</string>
+ <string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384">"შეეხეთ "<font size="17">"-ს პáƒáƒ áƒáƒšáƒ˜áƒ¡"</font>" დáƒáƒ¡áƒáƒ‘ეჭდáƒáƒ“."</string>
+ <string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"გáƒáƒœáƒ¡áƒáƒ‘ლáƒáƒ™áƒáƒ“ áƒáƒ™áƒ áƒ˜áƒ¤áƒ”თ პáƒáƒ áƒáƒšáƒ˜"</string>
+ <string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"გáƒáƒœáƒ¡áƒáƒ‘ლáƒáƒ™áƒáƒ“ áƒáƒ™áƒ áƒ˜áƒ¤áƒ”თ PIN კáƒáƒ“ი"</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ PIN კáƒáƒ“ი."</string>
+ <string name="keyguard_label_text" msgid="861796461028298424">"გáƒáƒœáƒ‘ლáƒáƒ™áƒ•ისáƒáƒ—ვის დáƒáƒáƒ­áƒ˜áƒ áƒ”თ მენიუს დრშემდეგ 0-ს."</string>
+ <string name="faceunlock_multiple_failures" msgid="754137583022792429">"სáƒáƒ®áƒ˜áƒ¡ áƒáƒ›áƒáƒªáƒœáƒáƒ‘ით გáƒáƒœáƒ‘ლáƒáƒ™áƒ•ის მცდელáƒáƒ‘áƒáƒ› დáƒáƒ¨áƒ•ებულ რáƒáƒáƒ“ენáƒáƒ‘áƒáƒ¡ გáƒáƒ“áƒáƒáƒ­áƒáƒ áƒ‘áƒ"</string>
+ <string name="keyguard_charged" msgid="3272223906073492454">"დáƒáƒ›áƒ£áƒ®áƒ¢áƒ£áƒšáƒ˜áƒ"</string>
+ <string name="keyguard_plugged_in" msgid="8117572000639998388">"მიმდინáƒáƒ áƒ”áƒáƒ‘ს დáƒáƒ›áƒ£áƒ®áƒ¢áƒ•რ(<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
+ <string name="keyguard_low_battery" msgid="8143808018719173859">"შეáƒáƒ”რთეთ დáƒáƒ›áƒ¢áƒ”ნი."</string>
+ <string name="keyguard_instructions_when_pattern_disabled" msgid="1332288268600329841">"გáƒáƒœáƒ‘ლáƒáƒ™áƒ•ისთვის დáƒáƒáƒ­áƒ˜áƒ áƒ”თ მენიუს."</string>
+ <string name="keyguard_network_locked_message" msgid="9169717779058037168">"ქსელი ჩáƒáƒ™áƒ”ტილიáƒ"</string>
+ <string name="keyguard_missing_sim_message_short" msgid="494980561304211931">"SIM ბáƒáƒ áƒáƒ—ი áƒáƒ  áƒáƒ áƒ˜áƒ¡"</string>
+ <string name="keyguard_missing_sim_message" product="tablet" msgid="1445849005909260039">"ტáƒáƒ‘ლეტში áƒáƒ  დევს SIM ბáƒáƒ áƒáƒ—ი."</string>
+ <string name="keyguard_missing_sim_message" product="default" msgid="3481110395508637643">"áƒáƒ  áƒáƒ áƒ˜áƒ¡ SIM ბáƒáƒ áƒáƒ—ი ტელეფáƒáƒœáƒ¨áƒ˜."</string>
+ <string name="keyguard_missing_sim_instructions" msgid="5210891509995942250">"ჩáƒáƒ“ეთ SIM ბáƒáƒ áƒáƒ—ი."</string>
+ <string name="keyguard_missing_sim_instructions_long" msgid="5968985489463870358">"SIM ბáƒáƒ áƒáƒ—ი áƒáƒ  áƒáƒ áƒ˜áƒ¡ áƒáƒœ áƒáƒ  იკითხებáƒ. ჩáƒáƒ“ეთ SIM ბáƒáƒ áƒáƒ—ი."</string>
+ <string name="keyguard_permanent_disabled_sim_message_short" msgid="8340813989586622356">"áƒáƒ áƒáƒ›áƒáƒ®áƒ›áƒáƒ áƒ”ბáƒáƒ“ი SIM ბáƒáƒ áƒáƒ—ი."</string>
+ <string name="keyguard_permanent_disabled_sim_instructions" msgid="5892940909699723544">"თქვენი SIM ბáƒáƒ áƒáƒ—ი გáƒáƒ›áƒ£áƒ“მებით გáƒáƒ›áƒáƒ áƒ—ული იყáƒ.\n დáƒáƒ£áƒ™áƒáƒ•შირდით თქვენი უკáƒáƒ‘ელრსერვისის პრáƒáƒ•áƒáƒ˜áƒ“ერს სხვრSIM ბáƒáƒ áƒáƒ—ისთვის."</string>
+ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM ბáƒáƒ áƒáƒ—ი დáƒáƒ‘ლáƒáƒ™áƒ˜áƒšáƒ˜áƒ."</string>
+ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM ბáƒáƒ áƒáƒ—ი დáƒáƒ‘ლáƒáƒ™áƒ˜áƒšáƒ˜áƒ PUK კáƒáƒ“ით."</string>
+ <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"მიმდინáƒáƒ áƒ”áƒáƒ‘ს SIM ბáƒáƒ áƒáƒ—ის გáƒáƒœáƒ‘ლáƒáƒ™áƒ•áƒâ€¦"</string>
+ <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. ვიჯეტი %2$d of %3$d."</string>
+ <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"ვიჯეტის დáƒáƒ›áƒáƒ¢áƒ”ბáƒ"</string>
+ <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"ცáƒáƒ áƒ˜áƒ”ლი"</string>
+ <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"გáƒáƒœáƒ‘ლáƒáƒ™áƒ•ის სივრცე გáƒáƒ¨áƒšáƒ˜áƒšáƒ˜áƒ."</string>
+ <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"გáƒáƒœáƒ‘ლáƒáƒ™áƒ•ის სივრცე ჩáƒáƒ™áƒ”ცილიáƒ."</string>
+ <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> ვიჯეტი."</string>
+ <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის áƒáƒ›áƒáƒ›áƒ áƒ©áƒ”ველი"</string>
+ <string name="keyguard_accessibility_status" msgid="8008264603935930611">"სტáƒáƒ¢áƒ£áƒ¡áƒ˜"</string>
+ <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"კáƒáƒ›áƒ”რáƒ"</string>
+ <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"მედიის მáƒáƒ áƒ—ვის ელემენტები"</string>
+ <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"დáƒáƒ˜áƒ¬áƒ§áƒ ვიჯეტის ხელáƒáƒ®áƒšáƒ გáƒáƒœáƒšáƒáƒ’ებáƒ."</string>
+ <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"ვიჯეტების გáƒáƒ“áƒáƒ®áƒáƒ áƒ˜áƒ¡áƒ®áƒ”ბრდáƒáƒ¡áƒ áƒ£áƒšáƒ”ბულიáƒ."</string>
+ <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"ვიჯეტი <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> წáƒáƒ˜áƒ¨áƒáƒšáƒ."</string>
+ <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"გáƒáƒœáƒ‘ლáƒáƒ™áƒ•ის სივრცის გáƒáƒ¨áƒšáƒ."</string>
+ <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"გáƒáƒ¡áƒ áƒ˜áƒáƒšáƒ”ბით გáƒáƒœáƒ‘ლáƒáƒ™áƒ•áƒ"</string>
+ <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"გáƒáƒœáƒ‘ლáƒáƒ™áƒ•რნიმუშით."</string>
+ <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"გáƒáƒœáƒ‘ლáƒáƒ™áƒ•რსáƒáƒ®áƒ˜áƒ—"</string>
+ <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"გáƒáƒœáƒ‘ლáƒáƒ™áƒ•რPin-ით."</string>
+ <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"პáƒáƒ áƒáƒšáƒ˜áƒ¡ გáƒáƒœáƒ‘ლáƒáƒ™áƒ•áƒ"</string>
+ <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"ნიმუშების სივრცე."</string>
+ <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"გáƒáƒ“áƒáƒ¡áƒ áƒ˜áƒáƒšáƒ”ბის სივრცე."</string>
+ <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"წინრჩáƒáƒœáƒáƒ¬áƒ”რის ღილáƒáƒ™áƒ˜"</string>
+ <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"შემდეგი ჩáƒáƒœáƒáƒ¬áƒ”რის ღილáƒáƒ™áƒ˜"</string>
+ <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"პáƒáƒ£áƒ–ის ღილáƒáƒ™áƒ˜"</string>
+ <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"დáƒáƒ™áƒ•რის ღილáƒáƒ™áƒ˜"</string>
+ <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Stop ღილáƒáƒ™áƒ˜"</string>
+ <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
+ <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
+ <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
+ <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
+ <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"გáƒáƒ£áƒ¥áƒ›áƒ”ბáƒ"</string>
+ <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"წáƒáƒ¨áƒšáƒ"</string>
+ <string name="keyboardview_keycode_done" msgid="1992571118466679775">"დáƒáƒ¡áƒ áƒ£áƒšáƒ“áƒ"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"რეჟიმის შეცვლáƒ"</string>
+ <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift-"</string>
+ <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"შეყვáƒáƒœáƒ"</string>
+ <string name="description_target_unlock" msgid="2228524900439801453">"გáƒáƒœáƒ‘ლáƒáƒ™áƒ•áƒ"</string>
+ <string name="description_target_camera" msgid="969071997552486814">"კáƒáƒ›áƒ”რáƒ"</string>
+ <string name="description_target_silent" msgid="893551287746522182">"უხმáƒ"</string>
+ <string name="description_target_soundon" msgid="30052466675500172">"ხმის ჩáƒáƒ áƒ—ვáƒ"</string>
+ <string name="description_target_search" msgid="3091587249776033139">"ძიებáƒ"</string>
+ <string name="description_direction_up" msgid="7169032478259485180">"გáƒáƒáƒ¡áƒ áƒ˜áƒáƒšáƒ”თ ზემáƒáƒ— <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>-თვის."</string>
+ <string name="description_direction_down" msgid="5087739728639014595">"გáƒáƒáƒ¡áƒ áƒ˜áƒáƒšáƒ”თ ქვემáƒáƒ— <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>-თვის."</string>
+ <string name="description_direction_left" msgid="7207478719805562165">"გáƒáƒáƒ¡áƒ áƒ˜áƒáƒšáƒ”თ მáƒáƒ áƒªáƒ®áƒœáƒ˜áƒ• <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>-თვის."</string>
+ <string name="description_direction_right" msgid="8034433242579600980">"გáƒáƒáƒ¡áƒ áƒ˜áƒáƒšáƒ”თ მáƒáƒ áƒ¯áƒ•ნივ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>-თვის."</string>
+ <string name="user_switched" msgid="3768006783166984410">"áƒáƒ›áƒŸáƒáƒ›áƒ˜áƒœáƒ“ელი მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი <xliff:g id="NAME">%1$s</xliff:g>."</string>
+ <string name="kg_emergency_call_label" msgid="684946192523830531">"გáƒáƒ“áƒáƒ£áƒ“ებელი დáƒáƒ®áƒ›áƒáƒ áƒ”ბის ზáƒáƒ áƒ˜"</string>
+ <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"დáƒáƒ’áƒáƒ•იწყდáƒáƒ— ნიმუში"</string>
+ <string name="kg_wrong_pattern" msgid="1850806070801358830">"áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ნიმუში"</string>
+ <string name="kg_wrong_password" msgid="2333281762128113157">"áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ პáƒáƒ áƒáƒšáƒ˜"</string>
+ <string name="kg_wrong_pin" msgid="1131306510833563801">"áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ PIN"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"კიდევ სცáƒáƒ“ეთ <xliff:g id="NUMBER">%d</xliff:g> წáƒáƒ›áƒ¨áƒ˜."</string>
+ <string name="kg_pattern_instructions" msgid="398978611683075868">"დáƒáƒ®áƒáƒ¢áƒ”თ თქვენი ნიმუში."</string>
+ <string name="kg_sim_pin_instructions" msgid="2319508550934557331">"SIM PIN-ის შეყვáƒáƒœáƒ"</string>
+ <string name="kg_pin_instructions" msgid="2377242233495111557">"შეიყვáƒáƒœáƒ”თ PIN"</string>
+ <string name="kg_password_instructions" msgid="5753646556186936819">"პáƒáƒ áƒáƒšáƒ˜áƒ¡ შეყვáƒáƒœáƒ"</string>
+ <string name="kg_puk_enter_puk_hint" msgid="453227143861735537">"SIM áƒáƒ›áƒŸáƒáƒ›áƒáƒ“ დეáƒáƒ¥áƒ¢áƒ˜áƒ•ირებულიáƒ. გáƒáƒ¡áƒáƒ’რძელებლáƒáƒ“ შეიყვáƒáƒœáƒ”თ PUK კáƒáƒ“ი. დეტáƒáƒšáƒ”ბისთვის მიმáƒáƒ áƒ—ეთ მáƒáƒ‘ილურ áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ¡."</string>
+ <string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"სáƒáƒ¡áƒ£áƒ áƒ•ელი PIN კáƒáƒ“ის შეყვáƒáƒœáƒ"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"სáƒáƒ¡áƒ£áƒ áƒ•ელი PIN კáƒáƒ“ის დáƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ”ბáƒ"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"SIM ბáƒáƒ áƒáƒ—ის გáƒáƒœáƒ‘ლáƒáƒ™áƒ•áƒâ€¦"</string>
+ <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ PIN კáƒáƒ“ი."</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"áƒáƒ™áƒ áƒ˜áƒ¤áƒ”თ PIN, რáƒáƒ›áƒ”ლიც შედგებრ4-დáƒáƒœ 8 ციფრáƒáƒ›áƒ“ე."</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"PUK კáƒáƒ“ი უნდრიყáƒáƒ¡ რვრáƒáƒœ მეტი ციფრისგáƒáƒœ შემდგáƒáƒ áƒ˜."</string>
+ <string name="kg_invalid_puk" msgid="3638289409676051243">"ხელáƒáƒ®áƒšáƒ შეიყვáƒáƒœáƒ”თ სწáƒáƒ áƒ˜ PUK კáƒáƒ“ი. რáƒáƒ›áƒ“ენიმე წáƒáƒ áƒ£áƒ›áƒáƒ¢áƒ”ბელი მცდელáƒáƒ‘რგáƒáƒ›áƒáƒ˜áƒ¬áƒ•ევს SIM ბáƒáƒ áƒáƒ—ის დáƒáƒ‘ლáƒáƒ™áƒ•áƒáƒ¡."</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"PIN კáƒáƒ“ები áƒáƒ  ემთხვევáƒ"</string>
+ <string name="kg_login_too_many_attempts" msgid="6486842094005698475">"ნáƒáƒ®áƒáƒ¢áƒ˜ ნიმუშის ძáƒáƒšáƒ˜áƒáƒœ ბევრი მცდელáƒáƒ‘áƒ"</string>
+ <string name="kg_login_instructions" msgid="1100551261265506448">"გáƒáƒœáƒ‘ლáƒáƒ™áƒ•ისთვის გáƒáƒ˜áƒáƒ áƒ”თ áƒáƒ•ტáƒáƒ áƒ˜áƒ–áƒáƒªáƒ˜áƒ თქვენი Google áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜áƒ—."</string>
+ <string name="kg_login_username_hint" msgid="5718534272070920364">"მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი (ელფáƒáƒ¡áƒ¢áƒ)"</string>
+ <string name="kg_login_password_hint" msgid="9057289103827298549">"პáƒáƒ áƒáƒšáƒ˜"</string>
+ <string name="kg_login_submit_button" msgid="5355904582674054702">"შესვლáƒ"</string>
+ <string name="kg_login_invalid_input" msgid="5754664119319872197">"áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სáƒáƒ®áƒ”ლი, áƒáƒœ პáƒáƒ áƒáƒšáƒ˜."</string>
+ <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"დáƒáƒ’áƒáƒ•იწყდáƒáƒ— მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი დრპáƒáƒ áƒáƒšáƒ˜?\nეწვიეთ "<b>"google.com/accounts/recovery"</b>"."</string>
+ <string name="kg_login_checking_password" msgid="1052685197710252395">"მიმდინáƒáƒ áƒ”áƒáƒ‘ს áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜áƒ¡ შემáƒáƒ¬áƒ›áƒ”ბáƒâ€¦"</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"თქვენ <xliff:g id="NUMBER_0">%d</xliff:g>-ჯერ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒáƒ“ შეიყვáƒáƒœáƒ”თ PIN კáƒáƒ“ი. \n\nსცáƒáƒ“ეთ ხელáƒáƒ®áƒšáƒ <xliff:g id="NUMBER_1">%d</xliff:g> წáƒáƒ›áƒ¨áƒ˜."</string>
+ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"თქვენ <xliff:g id="NUMBER_0">%d</xliff:g>-ჯერ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒáƒ“ დáƒáƒ‘ეჭდეთ თქვენი პáƒáƒ áƒáƒšáƒ˜. \n\nხელáƒáƒ®áƒšáƒ სცáƒáƒ“ეთ <xliff:g id="NUMBER_1">%d</xliff:g> წáƒáƒ›áƒ¨áƒ˜."</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"თქვენ <xliff:g id="NUMBER_0">%d</xliff:g>-ჯერ დáƒáƒ®áƒáƒ¢áƒ”თ გáƒáƒœáƒ‘ლáƒáƒ™áƒ•ის ნიმუში. \n\nსცáƒáƒ“ეთ ხელáƒáƒ®áƒšáƒ <xliff:g id="NUMBER_1">%d</xliff:g> წáƒáƒ›áƒ¨áƒ˜."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1575557200627128949">"თქვენ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒáƒ“ სცáƒáƒ“ეთ ტáƒáƒ‘ლეტის გáƒáƒœáƒ‘ლáƒáƒ™áƒ•რ<xliff:g id="NUMBER_0">%d</xliff:g>-ჯერ. კიდევ <xliff:g id="NUMBER_1">%d</xliff:g> წáƒáƒ áƒ£áƒ›áƒáƒ¢áƒ”ბელი ცდის შემდეგ ტáƒáƒ‘ლეტზე დáƒáƒ§áƒ”ნდებრსáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜, ქáƒáƒ áƒ®áƒœáƒ£áƒšáƒ˜ პáƒáƒ áƒáƒ›áƒ”ტრები დრმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ყველრმáƒáƒœáƒáƒªáƒ”მი დáƒáƒ˜áƒ™áƒáƒ áƒ’ებáƒ."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="4051015943038199910">"თქვენ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒáƒ“ სცáƒáƒ“ეთ ტელეფáƒáƒœáƒ˜áƒ¡ გáƒáƒœáƒ‘ლáƒáƒ™áƒ•რ<xliff:g id="NUMBER_0">%d</xliff:g>-ჯერ. კიდევ <xliff:g id="NUMBER_1">%d</xliff:g> წáƒáƒ áƒ£áƒ›áƒáƒ¢áƒ”ბელი ცდის შემდეგ ტელეფáƒáƒœáƒ–ე დáƒáƒ§áƒ”ნდებრსáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜, ქáƒáƒ áƒ®áƒœáƒ£áƒšáƒ˜ პáƒáƒ áƒáƒ›áƒ”ტრები დრმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ყველრმáƒáƒœáƒáƒªáƒ”მი დáƒáƒ˜áƒ™áƒáƒ áƒ’ებáƒ."</string>
+ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="2072996269148483637">"თქვენ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒáƒ“ სცáƒáƒ“ეთ ტáƒáƒ‘ლეტის გáƒáƒœáƒ‘ლáƒáƒ™áƒ•რ<xliff:g id="NUMBER">%d</xliff:g>-ჯერ. ტáƒáƒ‘ლეტზე დáƒáƒ§áƒ”ნდებრსáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜, ქáƒáƒ áƒ®áƒœáƒ£áƒšáƒ˜ პáƒáƒ áƒáƒ›áƒ”ტრები დრმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ყველრმáƒáƒœáƒáƒªáƒ”მი დáƒáƒ˜áƒ™áƒáƒ áƒ’ებáƒ."</string>
+ <string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"თქვენ <xliff:g id="NUMBER">%d</xliff:g>-ჯერ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒáƒ“ სცáƒáƒ“ეთ ტელეფáƒáƒœáƒ˜áƒ¡ გáƒáƒœáƒ‘ლáƒáƒ™áƒ•áƒ. áƒáƒ›áƒ˜áƒ¢áƒáƒ› ტელეფáƒáƒœáƒ–ე დáƒáƒ“გებრსáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜, ქáƒáƒ áƒ®áƒœáƒ£áƒšáƒ˜ პáƒáƒ áƒáƒ›áƒ”ტრები."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"თქვენ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒáƒ“ დáƒáƒ®áƒáƒ¢áƒ”თ თქვენი გáƒáƒœáƒ‘ლáƒáƒ™áƒ•ის ნიმუში <xliff:g id="NUMBER_0">%d</xliff:g> ჯერ. კიდევ <xliff:g id="NUMBER_1">%d</xliff:g> წáƒáƒ áƒ£áƒ›áƒáƒ¢áƒ”ბელი ცდის შემდეგ მáƒáƒ’თხáƒáƒ•თ ტáƒáƒ‘ლეტის გáƒáƒœáƒ‘ლáƒáƒ™áƒ•áƒáƒ¡ ელფáƒáƒ¡áƒ¢áƒ˜áƒ¡ áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜áƒ¡ გáƒáƒ›áƒáƒ§áƒ”ნებით.\n\n ხელáƒáƒ®áƒšáƒ სცáƒáƒ“ეთ <xliff:g id="NUMBER_2">%d</xliff:g> წáƒáƒ›áƒ¨áƒ˜."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"თქვენ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒáƒ“ დáƒáƒ®áƒáƒ¢áƒ”თ თქვენი გáƒáƒœáƒ‘ლáƒáƒ™áƒ•ის ნიმუში <xliff:g id="NUMBER_0">%d</xliff:g>-ჯერ. კიდევ <xliff:g id="NUMBER_1">%d</xliff:g> წáƒáƒ áƒ£áƒ›áƒáƒ¢áƒ”ბელი ცდის შემდეგ, დáƒáƒ’ჭირდებáƒáƒ— თქვენი ტელეფáƒáƒœáƒ˜áƒ¡ გáƒáƒœáƒ‘ლáƒáƒ™áƒ•რელფáƒáƒ¡áƒ¢áƒ˜áƒ¡ áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜áƒ¡ გáƒáƒ›áƒáƒ§áƒ”ნებით.\n\n ხელáƒáƒ®áƒšáƒ სცáƒáƒ“ეთ <xliff:g id="NUMBER_2">%d</xliff:g> წáƒáƒ›áƒ¨áƒ˜."</string>
+ <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
+ <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"áƒáƒ›áƒáƒ¨áƒšáƒ"</string>
+ <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"წინრჩáƒáƒœáƒáƒ¬áƒ”რზე გáƒáƒ“áƒáƒ¡áƒ•ლის ღილáƒáƒ™áƒ˜"</string>
+ <string name="keyguard_transport_next_description" msgid="4299258300283778305">"შემდეგი ჩáƒáƒœáƒáƒ¬áƒ”რის ღილáƒáƒ™áƒ˜"</string>
+ <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"პáƒáƒ£áƒ–ის ღილáƒáƒ™áƒ˜"</string>
+ <string name="keyguard_transport_play_description" msgid="2924628863741150956">"დáƒáƒ™áƒ•რის ღილáƒáƒ™áƒ˜"</string>
+ <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"შეჩერების ღილáƒáƒ™áƒ˜"</string>
+ <string name="keyguard_carrier_default" msgid="8700650403054042153">"áƒáƒ  áƒáƒ áƒ˜áƒ¡ სერვისი."</string>
+</resources>
diff --git a/packages/Keyguard/res/values-km-rKH/strings.xml b/packages/Keyguard/res/values-km-rKH/strings.xml
new file mode 100644
index 0000000..b09c749
--- /dev/null
+++ b/packages/Keyguard/res/values-km-rKH/strings.xml
@@ -0,0 +1,157 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"បញ្ចូល​កូដ PIN"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="3035856550289724338">"បញ្ចូល​លáŸážâ€‹áž€áž¼ážŠ PUK និង​​ PIN ážáŸ’មី​របស់​ស៊ីម"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="1801941051094974609">"áž›áŸážâ€‹áž€áž¼ážŠ PUK ស៊ីម"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="3201151840570492538">"áž›áŸážâ€‹áž€áž¼ážŠ PIN ស៊ីម​ážáŸ’មី"</string>
+ <string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"ប៉ះ ដើម្បី​បញ្ចូល​ពាក្យ​សម្ងាážáŸ‹"</font></string>
+ <string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"បញ្ចូល​ពាក្យ​សម្ងាážáŸ‹â€‹ ​ដើម្បី​ដោះ​សោ"</string>
+ <string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"បញ្ចូល​កូដ PIN ដើម្បី​ដោះ​សោ"</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"កូដ PIN មិន​ážáŸ’រឹមážáŸ’រូវ។"</string>
+ <string name="keyguard_label_text" msgid="861796461028298424">"ដើម្បី​ដោះ​សោ​​ ចុច​ម៉ឺនុយ​ បន្ទាប់មក 0 ។"</string>
+ <string name="faceunlock_multiple_failures" msgid="754137583022792429">"បាន​លើស​ការ​ព្យាយាម​ដោះ​សោ​ážáž¶áž˜â€‹áž‘ម្រង់​មុáž"</string>
+ <string name="keyguard_charged" msgid="3272223906073492454">"បាន​បញ្ចូល​​ពáŸáž‰"</string>
+ <string name="keyguard_plugged_in" msgid="8117572000639998388">"បញ្ចូល​ážáŸ’ម <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+ <string name="keyguard_low_battery" msgid="8143808018719173859">"ភ្ជាប់​ឧបករណáŸâ€‹áž”ញ្ចូល​ážáŸ’ម​។"</string>
+ <string name="keyguard_instructions_when_pattern_disabled" msgid="1332288268600329841">"ចុច​ម៉ឺនុយ ដើម្បី​ដោះ​សោ។"</string>
+ <string name="keyguard_network_locked_message" msgid="9169717779058037168">"បណ្ដាញ​ជាប់​សោ"</string>
+ <string name="keyguard_missing_sim_message_short" msgid="494980561304211931">"គ្មាន​ស៊ី​ម​កាáž"</string>
+ <string name="keyguard_missing_sim_message" product="tablet" msgid="1445849005909260039">"គ្មាន​ស៊ី​ម​កាážâ€‹áž“ៅ​ក្នុង​កុំព្យូទáŸážšâ€‹áž”ន្ទះ​។"</string>
+ <string name="keyguard_missing_sim_message" product="default" msgid="3481110395508637643">"គ្មាន​ស៊ីមកាážâ€‹áž€áŸ’នុង​ទូរសáŸáž–្ទ។"</string>
+ <string name="keyguard_missing_sim_instructions" msgid="5210891509995942250">"បញ្ចូល​​​ស៊ី​ម​កាážâ€‹áŸ”"</string>
+ <string name="keyguard_missing_sim_instructions_long" msgid="5968985489463870358">"បាážáŸ‹â€‹ážŸáŸŠáž¸áž˜áž€áž¶áž ឬ​មិន​អាច​អាន។ បញ្ចូល​ស៊ីម​កាážáŸ”"</string>
+ <string name="keyguard_permanent_disabled_sim_message_short" msgid="8340813989586622356">"ស៊ីម​កាážâ€‹áž˜áž·áž“​អាច​ប្រើ​បាន។"</string>
+ <string name="keyguard_permanent_disabled_sim_instructions" msgid="5892940909699723544">"បាន​បិទ​ស៊ីម​កាážâ€‹ážšáž”ស់​អ្នក​ជា​អចិន្ážáŸ’រៃយáŸáŸ”\n ទាក់ទង​​ក្រុមហ៊ុន​ផ្ដល់​សáŸážœáž¶áž€áž˜áŸ’ម​ឥážâ€‹ážáŸ’សែ​សម្រាប់​ស៊ីម​កាážâ€‹áž•្សáŸáž„។"</string>
+ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"ស៊ីម​កាážâ€‹â€‹áž‡áž¶áž”់​សោ។"</string>
+ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"ស៊ីម​កាážâ€‹áž‡áž¶áž”់​កូដ​​ PUK ។"</string>
+ <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"កំពុង​ដោះ​សោ​ស៊ីម​កាáž..."</string>
+ <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. áž’áž¶ážáž»â€‹áž€áŸ’រាហ្វិក %2$d នៃ %3$d ។"</string>
+ <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"បន្ážáŸ‚ម​ធាážáž»â€‹áž€áŸ’រាហ្វិក​។"</string>
+ <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"ទទáŸ"</string>
+ <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"បាន​ពង្រីក​ផ្ទៃ​ដោះ​សោ។"</string>
+ <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"បាន​បង្រួម​ផ្ទៃ​ដោះ​សោ។"</string>
+ <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> áž’áž¶ážáž»â€‹áž€áŸ’រាហ្វិក។"</string>
+ <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"ឧបករណáŸâ€‹áž‡áŸ’រើស​អ្នក​ប្រើ"</string>
+ <string name="keyguard_accessibility_status" msgid="8008264603935930611">"ស្ážáž¶áž“áž—áž¶áž–"</string>
+ <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"ម៉ាស៊ីន​ážáž"</string>
+ <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"ពិនិážáŸ’យ​មáŸážŒáŸ€"</string>
+ <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"បាន​ចាប់ផ្ដើម​ážáž˜áŸ’រៀប​ធាážáž»â€‹áž€áŸ’រាហ្វិក​ឡើងវិញ។"</string>
+ <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"បាន​បញ្ចប់​ការ​បង្ហាញ​ធាážáž»â€‹áž€áŸ’រាហ្វិក។"</string>
+ <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"បាន​លុប​ធាážáž»â€‹áž€áŸ’រាហ្វិក <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> ។"</string>
+ <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"ពង្រីក​ážáŸ†áž”ន់​ដោះ​សោ។"</string>
+ <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"រុញ​ដោះ​សោ។"</string>
+ <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"លំនាំ​ដោះ​សោ​។"</string>
+ <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"ដោះ​សោ​ážáž¶áž˜â€‹â€‹áž‘ម្រង់​មុážáŸ”"</string>
+ <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"កូដ PIN ដោះ​សោ។"</string>
+ <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"ពាក្យ​សម្ងាážáŸ‹â€‹ážŠáŸ„ះ​សោ​។"</string>
+ <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"ផ្ទៃ​លំនាំ។"</string>
+ <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"ផ្ទៃ​រុញ។"</string>
+ <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"ប៊ូážáž»áž„​បទ​មុន"</string>
+ <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"ប៊ូážáž»áž„​បទ​បន្ទាប់"</string>
+ <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"ប៊ូážáž»áž„​ផ្អាក"</string>
+ <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"ប៊ូážáž»áž„​ចាក់"</string>
+ <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"ប៊ូážáž»áž„​បញ្ឈប់"</string>
+ <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"មáŸážŠáŸƒâ€‹áž¡áž¾áž„"</string>
+ <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"មáŸážŠáŸƒâ€‹áž…ុះ"</string>
+ <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"áž”áŸáŸ‡ážŠáž¼áž„"</string>
+ <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"ដោះ​សោ ​ដើម្បី​បន្áž"</string>
+ <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"បាន​បោះបង់​ការ​ចាប់ផ្ដើម"</string>
+ <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"ទម្លាក់ <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> ដើម្បី​លុប។"</string>
+ <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> នឹង​មិន​ážáŸ’រូវ​បាន​លុប​។"</string>
+ <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
+ <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
+ <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
+ <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
+ <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"បោះ​បង់"</string>
+ <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"លុប"</string>
+ <string name="keyboardview_keycode_done" msgid="1992571118466679775">"រួចរាល់"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"ប្ដូរ​របៀប"</string>
+ <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
+ <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
+ <string name="description_target_unlock" msgid="2228524900439801453">"ដោះ​​សោ"</string>
+ <string name="description_target_camera" msgid="969071997552486814">"ម៉ាស៊ីន​ážáž"</string>
+ <string name="description_target_silent" msgid="893551287746522182">"ស្ងាážáŸ‹"</string>
+ <string name="description_target_soundon" msgid="30052466675500172">"បើក​សំឡáŸáž„"</string>
+ <string name="description_target_search" msgid="3091587249776033139">"ស្វែងរក"</string>
+ <string name="description_direction_up" msgid="7169032478259485180">"រុញ​ឡើង​លើ​ដើម្បី <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ។"</string>
+ <string name="description_direction_down" msgid="5087739728639014595">"រុញ​ចុះក្រោម​សម្រាប់ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ។"</string>
+ <string name="description_direction_left" msgid="7207478719805562165">"រុញ​ទៅ​ឆ្វáŸáž„​ដើម្បី <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ។"</string>
+ <string name="description_direction_right" msgid="8034433242579600980">"រុញ​​ទៅ​ស្ដាំ​ដើម្បី <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ។"</string>
+ <string name="user_switched" msgid="3768006783166984410">"អ្នក​ប្រើ​បច្ចុប្បន្ន <xliff:g id="NAME">%1$s</xliff:g> ។"</string>
+ <string name="kg_emergency_call_label" msgid="684946192523830531">"ការ​ហៅ​ពáŸáž›â€‹áž¢áž¶ážŸáž“្ន"</string>
+ <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"ភ្លáŸáž…​​លំនាំ"</string>
+ <string name="kg_wrong_pattern" msgid="1850806070801358830">"លំនាំ​មិន​ážáŸ’រឹមážáŸ’រូវ"</string>
+ <string name="kg_wrong_password" msgid="2333281762128113157">"ពាក្យ​សម្ងាážáŸ‹â€‹áž˜áž·áž“​ážáŸ’រឹមážáŸ’រូវ"</string>
+ <string name="kg_wrong_pin" msgid="1131306510833563801">"កូដ PIN មិន​ážáŸ’រឹមážáŸ’រូវ"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"ព្យាយាម​ម្ដង​ទៀážâ€‹áž€áŸ’នុង​រយៈ​ពáŸáž› <xliff:g id="NUMBER">%d</xliff:g> វិនាទី។"</string>
+ <string name="kg_pattern_instructions" msgid="398978611683075868">"គូរ​លំនាំ​របស់​អ្នក"</string>
+ <string name="kg_sim_pin_instructions" msgid="2319508550934557331">"បញ្ចូល​កូដ PIN ស៊ីម​កាáž"</string>
+ <string name="kg_pin_instructions" msgid="2377242233495111557">"បញ្ចូល​​កូដ PIN"</string>
+ <string name="kg_password_instructions" msgid="5753646556186936819">"បញ្ចូល​ពាក្យ​សម្ងាážáŸ‹"</string>
+ <string name="kg_puk_enter_puk_hint" msgid="453227143861735537">"ឥឡូវ​ស៊ីមកាážâ€‹ážáŸ’រូវ​បាន​បិទ។ បញ្ចូល​កូដ PUK ដើម្បី​បន្ážáŸ” ចំពោះ​ពáŸážáŸŒáž˜áž¶áž“​លម្អិážâ€‹áž‘ាក់ទង​ក្រុមហ៊ុន​បញ្ជូន​របស់​អ្នក។"</string>
+ <string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"បញ្ចូល​កូដ PIN ដែល​ចង់​បាន"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"បញ្ជាក់​កូដ PIN ដែល​ចង់​បាន"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"កំពុង​ដោះ​សោ​​ស៊ីម​កាáž..."</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"បញ្ចូល​កូដ PIN ដែល​មាន​ពី ៤ ដល់ ៨ áž›áŸážáŸ”"</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"កូដ PUK គួរ​ážáŸ‚​មាន​​ ៨ áž›áŸáž ឬ​​ច្រើន​ជាង​នáŸáŸ‡áŸ”"</string>
+ <string name="kg_invalid_puk" msgid="3638289409676051243">"បញ្ចូល​កូដ PUK ម្ដង​ទៀážáŸ” ការ​ព្យាយាម​ដដែល​ច្រើន​ដឹង​នឹង​បិទ​ស៊ីម​កាážâ€‹áž‡áž¶â€‹áž¢áž…ិន្ážáŸ’រៃយáŸáŸ”"</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"កូដ PIN មិន​ដូច​គ្នា"</string>
+ <string name="kg_login_too_many_attempts" msgid="6486842094005698475">"ព្យាយាម​លំនាំ​ច្រើន​ពáŸáž€"</string>
+ <string name="kg_login_instructions" msgid="1100551261265506448">"ដើម្បី​ដោះ​សោ ចូល​ក្នុង​គណនី Google ។"</string>
+ <string name="kg_login_username_hint" msgid="5718534272070920364">"ឈ្មោះ​អ្នក​ប្រើ (អ៊ី​ម៉ែ​ល​)"</string>
+ <string name="kg_login_password_hint" msgid="9057289103827298549">"ពាក្យសម្ងាážáŸ‹"</string>
+ <string name="kg_login_submit_button" msgid="5355904582674054702">"ចូល"</string>
+ <string name="kg_login_invalid_input" msgid="5754664119319872197">"ឈ្មោះ​អ្នកប្រើ ឬ​ពាក្យ​សម្ងាážáŸ‹â€‹áž˜áž·áž“​ážáŸ’រឹមážáŸ’រូវ។"</string>
+ <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"ភ្លáŸáž…​ឈ្មោះ​អ្នកប្រើ ឬ​ពាក្យ​សម្ងាážáŸ‹â€‹ážšáž”ស់​អ្នក?\nមើល "<b>"google.com/accounts/recovery"</b>" ។"</string>
+ <string name="kg_login_checking_password" msgid="1052685197710252395">"កំពុង​ពិនិážáŸ’យ​មើល​គណនី..."</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"អ្នក​បាន​បញ្ចូល​កូដ PIN របស់​អ្នក​មិន​ážáŸ’រឹមážáŸ’រូវ​ចំនួន <xliff:g id="NUMBER_0">%d</xliff:g> ដង។\n\n ព្យាយាម​ម្ដង​ទៀážâ€‹áž€áŸ’នុង​រយៈ​ពáŸáž› <xliff:g id="NUMBER_1">%d</xliff:g> វិនាទី។"</string>
+ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"អ្នក​បាន​បញ្ចូល​ពាក្យ​សម្ងាážáŸ‹â€‹áž˜áž·áž“​ážáŸ’រឹមážáŸ’រូវ <xliff:g id="NUMBER_0">%d</xliff:g> ដង។\n\nព្យាយាម​ម្ដង​ទៀážâ€‹áž€áŸ’នុង​រយៈ​ពáŸáž› <xliff:g id="NUMBER_1">%d</xliff:g> វិនាទី។"</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"អ្នក​បាន​​គូរ​លំនាំ​ដោះ​សោ​របស់​អ្នក​មិន​ážáŸ’រឹមážáŸ’រូវ​ចំនួន <xliff:g id="NUMBER_0">%d</xliff:g> ដង។\n\nព្យាយាម​ម្ដង​ទៀážâ€‹áž€áŸ’នុង​រយៈ​ពáŸáž› <xliff:g id="NUMBER_1">%d</xliff:g> វិនាទី។"</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1575557200627128949">"អ្នក​បាន​ព្យាយាម​ដោះ​សោ​​កុំព្យូទáŸážšâ€‹áž”ន្ទះ​​មិន​ážáŸ’រឹមážáŸ’រូវ​ចំនួន <xliff:g id="NUMBER_0">%d</xliff:g> ដង។ បន្ទាប់​ពី​ការ​ព្យាយាម​មិន​ជោគជáŸáž™â€‹â€‹áž…្រើន​ជាង <xliff:g id="NUMBER_1">%d</xliff:g> ដង កុំព្យូទáŸážšâ€‹áž”ន្ទះ​​នឹង​ážáŸ’រូវ​បាន​កំណážáŸ‹â€‹áž‘ៅ​លំនាំដើម​ដូច​ចáŸáž‰â€‹áž–ី​រោងចក្រ ហើយ​ទិន្ននáŸáž™â€‹áž¢áŸ’នកប្រើ​នឹង​បាážáŸ‹áž”ង់។"</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="4051015943038199910">"អ្នក​បាន​ព្យាយាម​ដោះ​សោ​ទូរសáŸáž–្ទ​មិន​ážáŸ’រឹមážáŸ’រូវ​ចំនួន <xliff:g id="NUMBER_0">%d</xliff:g> ដង។ បន្ទាប់​ពី​ការ​ព្យាយាម​មិន​ជោគជáŸáž™â€‹â€‹áž…្រើន​ជាង <xliff:g id="NUMBER_1">%d</xliff:g> ដង ទូរសáŸáž–្ទ​នឹង​ážáŸ’រូវ​បាន​កំណážáŸ‹â€‹áž‘ៅ​លំនាំដើម​ដូច​ចáŸáž‰â€‹áž–ី​រោងចក្រ ហើយ​ទិន្ននáŸáž™â€‹áž¢áŸ’នកប្រើ​នឹង​បាážáŸ‹áž”ង់។"</string>
+ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="2072996269148483637">"អ្នក​បាន​ព្យាយាម​ដោះ​សោ​កុំព្យូទáŸážšâ€‹áž”ន្ទះ​មិន​ážáŸ’រឹមážáŸ’រូវ​ចំនួន​ <xliff:g id="NUMBER">%d</xliff:g> ដង។ កុំព្យូទáŸážšâ€‹áž”ន្ទះ​នឹង​ážáŸ’រូវ​បាន​កំណážáŸ‹â€‹áž‘ៅ​លំនាំដើម​ដូច​ចáŸáž‰â€‹áž–ី​រោងចក្រ"</string>
+ <string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"អ្នក​បាន​ព្យាយាម​ដោះ​សោ​ទូរសáŸáž–្ទ​មិន​ážáŸ’រឹមážáŸ’រូវ​ចំនួន <xliff:g id="NUMBER">%d</xliff:g> ដង។ ឥឡូវ​ទូរសáŸáž–្ទ​នឹង​កំណážáŸ‹â€‹áž‘ៅ​លំនាំ​ដើម​ដូច​ចáŸáž‰â€‹áž–ី​រោងចក្រ។"</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"អ្នក​បាន​គូរ​លំនាំ​ដោះ​សោ​មិន​ážáŸ’រឹមážáŸ’រូវ <xliff:g id="NUMBER_0">%d</xliff:g> ដង។ បន្ទាប់​ពី​ការ​ព្យាយាម <xliff:g id="NUMBER_1">%d</xliff:g> ដង​មិន​ជោគជáŸáž™ អ្នក​នឹង​ážáŸ’រូវ​បាន​ស្នើ​ឲ្យ​ដោះ​សោ​កុំព្យូទáŸážšâ€‹áž”ន្ទះ​របស់​អ្នក ដោយ​ប្រើ​គណនី​អ៊ីមែល។\n\n ព្យាយាម​ម្ដង​ទៀážâ€‹áž€áŸ’នុង​រយៈ​ពáŸáž› <xliff:g id="NUMBER_2">%d</xliff:g> វិនាទី។"</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"អ្នក​បាន​គូរ​លំនាំ​ដោះ​​សោ​របស់​អ្នក​មិន​ážáŸ’រឹមážáŸ’រូវ​ចំនួន <xliff:g id="NUMBER_0">%d</xliff:g> ដង។ បន្ទាប់​ពី​ការ​ព្យាយាម​មិន​ជោគជáŸáž™â€‹â€‹áž…្រើនជាង <xliff:g id="NUMBER_1">%d</xliff:g> ដង អ្នក​នឹង​ážáŸ’រូវ​បាន​​ស្នើ​ឲ្យ​ដោះ​សោ​ទូរសáŸáž–្ទ​របស់​អ្នក​ដោយ​ប្រើ​គណនី​អ៊ីមែល។\n\n ព្យាយាម​ម្ដង​ទៀážâ€‹áž€áŸ’នុង​រយៈ​ពáŸáž› <xliff:g id="NUMBER_2">%d</xliff:g> វិនាទី។"</string>
+ <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
+ <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"លុប​ចáŸáž‰"</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"áž›áŸážâ€‹áž€áž¼ážŠ PIN ស៊ីម​មិន​ážáŸ’រឹមážáŸ’រូវ អ្នក​ážáŸ’រូវ​ទាក់ទង​ក្រុមហ៊ុន​បញ្ជូន​របស់​អ្នក​ឥឡូវ​នáŸáŸ‡ ដើម្បី​ដោះ​សោ​ឧបករណáŸâ€‹ážšáž”ស់​អ្នក។"</string>
+ <plurals name="kg_password_wrong_pin_code">
+ <item quantity="one" msgid="8134313997799638254">"áž›áŸážâ€‹áž€áž¼ážŠ PIN ស៊ីម​មិន​​ážáŸ’រឹមážáŸ’រូវ​, អ្នក​មាន <xliff:g id="NUMBER">%d</xliff:g> ការ​ព្យាយាម​ដែល​នៅសល់​មុន​ពáŸáž›â€‹áž¢áŸ’នក​ážáŸ’រូវ​​ទាក់ទង​ក្រុម​ហ៊ុន​​​បញ្ជូន​របស់​អ្នក​​ ដើម្បី​​​ដោះ​សោ​ឧបករណáŸâ€‹ážšáž”ស់​អ្នក​។"</item>
+ <item quantity="other" msgid="2215723361575359486">"áž›áŸážâ€‹áž€áž¼ážŠâ€‹ PIN ស៊ីម​មិន​ážáŸ’រឹមážáŸ’រូវ​, អ្នក​មាន <xliff:g id="NUMBER">%d</xliff:g> ការ​ព្យាយាម​ដែល​នៅ​​សល់​។"</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="7077536808291316208">"ស៊ីម​មិន​អាច​ប្រើ​បាន។ ទាក់ទង​ក្រុមហ៊ុន​បញ្ជូន​របស់​អ្នក។"</string>
+ <plurals name="kg_password_wrong_puk_code">
+ <item quantity="one" msgid="3256893607561060649">"áž›áŸážâ€‹áž€áž¼ážŠ PUK ស៊ីម​មិន​ážáŸ’រឹមážáŸ’រូវ, អ្នក​មាន <xliff:g id="NUMBER">%d</xliff:g> ការ​ព្យាយាម​ដែល​នៅ​សល់ មុន​ពáŸáž›â€‹ážŸáŸŠáž¸áž˜â€‹â€‹áž€áŸ’លាយ​ជា​មិន​អាច​ប្រើ​បាន​ជា​អចិន្ážáŸ’រៃយáŸâ€‹áŸ”"</item>
+ <item quantity="other" msgid="5477305226026342036">"áž›áŸážâ€‹áž€áž¼ážŠ PUK ស៊ីម​មិន​ážáŸ’រឹមážáŸ’រូវ, អ្នក​មាន <xliff:g id="NUMBER">%d</xliff:g> ការ​ព្យាយាម​ដែល​នៅ​សល់ មុន​ពáŸáž›â€‹ážŸáŸŠáž¸áž˜â€‹â€‹áž€áŸ’លាយ​ជា​មិន​អាច​ប្រើ​បាន​ជា​អចិន្ážáŸ’រៃយáŸâ€‹áŸ”"</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="6268288093558031564">"បាន​បរាជáŸáž™â€‹áž€áŸ’នុង​ការ​ប្រážáž·áž”ážáŸ’ážáž·â€‹áž›áŸážâ€‹áž€áž¼ážŠ PIN ស៊ីម!"</string>
+ <string name="kg_password_puk_failed" msgid="2838824369502455984">"បាន​បរាជáŸáž™â€‹áž€áŸ’នុង​ការ​ប្រážáž·áž”ážáŸ’ážáž·â€‹â€‹áž›áŸážâ€‹áž€áž¼ážŠ PUK ស៊ីម!"</string>
+ <string name="kg_pin_accepted" msgid="1448241673570020097">"បាន​ទទួល​យក​លáŸážâ€‹áž€áž¼ážŠâ€‹!"</string>
+ <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"ប៊ូážáž»áž„​បទ​មុន"</string>
+ <string name="keyguard_transport_next_description" msgid="4299258300283778305">"ប៊ូážáž»áž„​បទ​បន្ទាប់"</string>
+ <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"ប៊ូážáž»áž„​ផ្អាក"</string>
+ <string name="keyguard_transport_play_description" msgid="2924628863741150956">"ប៊ូážáž»áž„​ចាក់"</string>
+ <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"ប៊ូážáž»áž„​បញ្ឈប់"</string>
+ <string name="keyguard_carrier_default" msgid="8700650403054042153">"គ្មាន​សáŸážœáž¶â€‹áŸ”"</string>
+</resources>
diff --git a/packages/Keyguard/res/values-km/strings.xml b/packages/Keyguard/res/values-km/strings.xml
new file mode 100644
index 0000000..586169e
--- /dev/null
+++ b/packages/Keyguard/res/values-km/strings.xml
@@ -0,0 +1,138 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"បញ្ចូល​កូដ PIN"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"បញ្ចូល​កូដ PUK និង​ PIN ážáŸ’មី"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"កូដ PUK"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"កូដ PIN ážáŸ’មី"</string>
+ <string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"ប៉ះ ដើម្បី​បញ្ចូល​ពាក្យ​សម្ងាážáŸ‹"</font></string>
+ <string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"បញ្ចូល​ពាក្យ​សម្ងាážáŸ‹â€‹ ​ដើម្បី​ដោះ​សោ"</string>
+ <string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"បញ្ចូល​កូដ PIN ដើម្បី​ដោះ​សោ"</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"កូដ PIN មិន​ážáŸ’រឹមážáŸ’រូវ។"</string>
+ <string name="keyguard_label_text" msgid="861796461028298424">"ដើម្បី​ដោះ​សោ​​ ចុច​ម៉ឺនុយ​ បន្ទាប់មក 0 ។"</string>
+ <string name="faceunlock_multiple_failures" msgid="754137583022792429">"បាន​លើស​ការ​ព្យាយាម​ដោះ​សោ​ážáž¶áž˜â€‹áž‘ម្រង់​មុáž"</string>
+ <string name="keyguard_charged" msgid="3272223906073492454">"បាន​បញ្ចូល​​ពáŸáž‰"</string>
+ <string name="keyguard_plugged_in" msgid="8117572000639998388">"បញ្ចូល​ážáŸ’ម <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+ <string name="keyguard_low_battery" msgid="8143808018719173859">"ភ្ជាប់​ឧបករណáŸâ€‹áž”ញ្ចូល​ážáŸ’ម​។"</string>
+ <string name="keyguard_instructions_when_pattern_disabled" msgid="1332288268600329841">"ចុច​ម៉ឺនុយ ដើម្បី​ដោះ​សោ។"</string>
+ <string name="keyguard_network_locked_message" msgid="9169717779058037168">"បណ្ដាញ​ជាប់​សោ"</string>
+ <string name="keyguard_missing_sim_message_short" msgid="494980561304211931">"គ្មាន​ស៊ី​ម​កាáž"</string>
+ <string name="keyguard_missing_sim_message" product="tablet" msgid="1445849005909260039">"គ្មាន​ស៊ី​ម​កាážâ€‹áž“ៅ​ក្នុង​កុំព្យូទáŸážšâ€‹áž”ន្ទះ​។"</string>
+ <string name="keyguard_missing_sim_message" product="default" msgid="3481110395508637643">"គ្មាន​ស៊ីមកាážâ€‹áž€áŸ’នុង​ទូរសáŸáž–្ទ។"</string>
+ <string name="keyguard_missing_sim_instructions" msgid="5210891509995942250">"បញ្ចូល​​​ស៊ី​ម​កាážâ€‹áŸ”"</string>
+ <string name="keyguard_missing_sim_instructions_long" msgid="5968985489463870358">"បាážáŸ‹â€‹ážŸáŸŠáž¸áž˜áž€áž¶áž ឬ​មិន​អាច​អាន។ បញ្ចូល​ស៊ីម​កាážáŸ”"</string>
+ <string name="keyguard_permanent_disabled_sim_message_short" msgid="8340813989586622356">"ស៊ីម​កាážâ€‹áž˜áž·áž“​អាច​ប្រើ​បាន។"</string>
+ <string name="keyguard_permanent_disabled_sim_instructions" msgid="5892940909699723544">"បាន​បិទ​ស៊ីម​កាážâ€‹ážšáž”ស់​អ្នក​ជា​អចិន្ážáŸ’រៃយáŸáŸ”\n ទាក់ទង​​ក្រុមហ៊ុន​ផ្ដល់​សáŸážœáž¶áž€áž˜áŸ’ម​ឥážâ€‹ážáŸ’សែ​សម្រាប់​ស៊ីម​កាážâ€‹áž•្សáŸáž„។"</string>
+ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"ស៊ីម​កាážâ€‹â€‹áž‡áž¶áž”់​សោ។"</string>
+ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"ស៊ីម​កាážâ€‹áž‡áž¶áž”់​កូដ​​ PUK ។"</string>
+ <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"កំពុង​ដោះ​សោ​ស៊ីម​កាáž..."</string>
+ <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. áž’áž¶ážáž»â€‹áž€áŸ’រាហ្វិក %2$d នៃ %3$d ។"</string>
+ <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"បន្ážáŸ‚ម​ធាážáž»â€‹áž€áŸ’រាហ្វិក​។"</string>
+ <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"ទទáŸ"</string>
+ <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"បាន​ពង្រីក​ផ្ទៃ​ដោះ​សោ។"</string>
+ <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"បាន​បង្រួម​ផ្ទៃ​ដោះ​សោ។"</string>
+ <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> áž’áž¶ážáž»â€‹áž€áŸ’រាហ្វិក។"</string>
+ <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"ឧបករណáŸâ€‹áž‡áŸ’រើស​អ្នក​ប្រើ"</string>
+ <string name="keyguard_accessibility_status" msgid="8008264603935930611">"ស្ážáž¶áž“áž—áž¶áž–"</string>
+ <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"ម៉ាស៊ីន​ážáž"</string>
+ <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"ពិនិážáŸ’យ​មáŸážŒáŸ€"</string>
+ <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"បាន​ចាប់ផ្ដើម​ážáž˜áŸ’រៀប​ធាážáž»â€‹áž€áŸ’រាហ្វិក​ឡើងវិញ។"</string>
+ <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"បាន​បញ្ចប់​ការ​បង្ហាញ​ធាážáž»â€‹áž€áŸ’រាហ្វិក។"</string>
+ <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"បាន​លុប​ធាážáž»â€‹áž€áŸ’រាហ្វិក <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> ។"</string>
+ <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"ពង្រីក​ážáŸ†áž”ន់​ដោះ​សោ។"</string>
+ <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"រុញ​ដោះ​សោ។"</string>
+ <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"លំនាំ​ដោះ​សោ​។"</string>
+ <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"ដោះ​សោ​ážáž¶áž˜â€‹â€‹áž‘ម្រង់​មុážáŸ”"</string>
+ <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"កូដ PIN ដោះ​សោ។"</string>
+ <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"ពាក្យ​សម្ងាážáŸ‹â€‹ážŠáŸ„ះ​សោ​។"</string>
+ <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"ផ្ទៃ​លំនាំ។"</string>
+ <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"ផ្ទៃ​រុញ។"</string>
+ <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"ប៊ូážáž»áž„​បទ​មុន"</string>
+ <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"ប៊ូážáž»áž„​បទ​បន្ទាប់"</string>
+ <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"ប៊ូážáž»áž„​ផ្អាក"</string>
+ <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"ប៊ូážáž»áž„​ចាក់"</string>
+ <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"ប៊ូážáž»áž„​បញ្ឈប់"</string>
+ <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
+ <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
+ <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
+ <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
+ <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"បោះ​បង់"</string>
+ <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"លុប"</string>
+ <string name="keyboardview_keycode_done" msgid="1992571118466679775">"រួចរាល់"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"ប្ដូរ​របៀប"</string>
+ <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
+ <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
+ <string name="description_target_unlock" msgid="2228524900439801453">"ដោះ​​សោ"</string>
+ <string name="description_target_camera" msgid="969071997552486814">"ម៉ាស៊ីន​ážáž"</string>
+ <string name="description_target_silent" msgid="893551287746522182">"ស្ងាážáŸ‹"</string>
+ <string name="description_target_soundon" msgid="30052466675500172">"បើក​សំឡáŸáž„"</string>
+ <string name="description_target_search" msgid="3091587249776033139">"ស្វែងរក"</string>
+ <string name="description_direction_up" msgid="7169032478259485180">"រុញ​ឡើង​លើ​ដើម្បី <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ។"</string>
+ <string name="description_direction_down" msgid="5087739728639014595">"រុញ​ចុះក្រោម​សម្រាប់ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ។"</string>
+ <string name="description_direction_left" msgid="7207478719805562165">"រុញ​ទៅ​ឆ្វáŸáž„​ដើម្បី <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ។"</string>
+ <string name="description_direction_right" msgid="8034433242579600980">"រុញ​​ទៅ​ស្ដាំ​ដើម្បី <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ។"</string>
+ <string name="user_switched" msgid="3768006783166984410">"អ្នក​ប្រើ​បច្ចុប្បន្ន <xliff:g id="NAME">%1$s</xliff:g> ។"</string>
+ <string name="kg_emergency_call_label" msgid="684946192523830531">"ការ​ហៅ​ពáŸáž›â€‹áž¢áž¶ážŸáž“្ន"</string>
+ <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"ភ្លáŸáž…​​លំនាំ"</string>
+ <string name="kg_wrong_pattern" msgid="1850806070801358830">"លំនាំ​មិន​ážáŸ’រឹមážáŸ’រូវ"</string>
+ <string name="kg_wrong_password" msgid="2333281762128113157">"ពាក្យ​សម្ងាážáŸ‹â€‹áž˜áž·áž“​ážáŸ’រឹមážáŸ’រូវ"</string>
+ <string name="kg_wrong_pin" msgid="1131306510833563801">"កូដ PIN មិន​ážáŸ’រឹមážáŸ’រូវ"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"ព្យាយាម​ម្ដង​ទៀážâ€‹áž€áŸ’នុង​រយៈ​ពáŸáž› <xliff:g id="NUMBER">%d</xliff:g> វិនាទី។"</string>
+ <string name="kg_pattern_instructions" msgid="398978611683075868">"គូរ​លំនាំ​របស់​អ្នក"</string>
+ <string name="kg_sim_pin_instructions" msgid="2319508550934557331">"បញ្ចូល​កូដ PIN ស៊ីម​កាáž"</string>
+ <string name="kg_pin_instructions" msgid="2377242233495111557">"បញ្ចូល​​កូដ PIN"</string>
+ <string name="kg_password_instructions" msgid="5753646556186936819">"បញ្ចូល​ពាក្យ​សម្ងាážáŸ‹"</string>
+ <string name="kg_puk_enter_puk_hint" msgid="453227143861735537">"ឥឡូវ​ស៊ីមកាážâ€‹ážáŸ’រូវ​បាន​បិទ។ បញ្ចូល​កូដ PUK ដើម្បី​បន្ážáŸ” ចំពោះ​ពáŸážáŸŒáž˜áž¶áž“​លម្អិážâ€‹áž‘ាក់ទង​ក្រុមហ៊ុន​បញ្ជូន​របស់​អ្នក។"</string>
+ <string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"បញ្ចូល​កូដ PIN ដែល​ចង់​បាន"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"បញ្ជាក់​កូដ PIN ដែល​ចង់​បាន"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"កំពុង​ដោះ​សោ​​ស៊ីម​កាáž..."</string>
+ <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"កូដ PIN មិន​ážáŸ’រឹមážáŸ’រូវ។"</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"បញ្ចូល​កូដ PIN ដែល​មាន​ពី ៤ ដល់ ៨ áž›áŸážáŸ”"</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"កូដ PUK គួរ​ážáŸ‚​មាន​​ ៨ áž›áŸáž ឬ​​ច្រើន​ជាង​នáŸáŸ‡áŸ”"</string>
+ <string name="kg_invalid_puk" msgid="3638289409676051243">"បញ្ចូល​កូដ PUK ម្ដង​ទៀážáŸ” ការ​ព្យាយាម​ដដែល​ច្រើន​ដឹង​នឹង​បិទ​ស៊ីម​កាážâ€‹áž‡áž¶â€‹áž¢áž…ិន្ážáŸ’រៃយáŸáŸ”"</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"កូដ PIN មិន​ដូច​គ្នា"</string>
+ <string name="kg_login_too_many_attempts" msgid="6486842094005698475">"ព្យាយាម​លំនាំ​ច្រើន​ពáŸáž€"</string>
+ <string name="kg_login_instructions" msgid="1100551261265506448">"ដើម្បី​ដោះ​សោ ចូល​ក្នុង​គណនី Google ។"</string>
+ <string name="kg_login_username_hint" msgid="5718534272070920364">"ឈ្មោះ​អ្នក​ប្រើ (អ៊ី​ម៉ែ​ល​)"</string>
+ <string name="kg_login_password_hint" msgid="9057289103827298549">"ពាក្យសម្ងាážáŸ‹"</string>
+ <string name="kg_login_submit_button" msgid="5355904582674054702">"ចូល"</string>
+ <string name="kg_login_invalid_input" msgid="5754664119319872197">"ឈ្មោះ​អ្នកប្រើ ឬ​ពាក្យ​សម្ងាážáŸ‹â€‹áž˜áž·áž“​ážáŸ’រឹមážáŸ’រូវ។"</string>
+ <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"ភ្លáŸáž…​ឈ្មោះ​អ្នកប្រើ ឬ​ពាក្យ​សម្ងាážáŸ‹â€‹ážšáž”ស់​អ្នក?\nមើល "<b>"google.com/accounts/recovery"</b>" ។"</string>
+ <string name="kg_login_checking_password" msgid="1052685197710252395">"កំពុង​ពិនិážáŸ’យ​មើល​គណនី..."</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"អ្នក​បាន​បញ្ចូល​កូដ PIN របស់​អ្នក​មិន​ážáŸ’រឹមážáŸ’រូវ​ចំនួន <xliff:g id="NUMBER_0">%d</xliff:g> ដង។\n\n ព្យាយាម​ម្ដង​ទៀážâ€‹áž€áŸ’នុង​រយៈ​ពáŸáž› <xliff:g id="NUMBER_1">%d</xliff:g> វិនាទី។"</string>
+ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"អ្នក​បាន​បញ្ចូល​ពាក្យ​សម្ងាážáŸ‹â€‹áž˜áž·áž“​ážáŸ’រឹមážáŸ’រូវ <xliff:g id="NUMBER_0">%d</xliff:g> ដង។\n\nព្យាយាម​ម្ដង​ទៀážâ€‹áž€áŸ’នុង​រយៈ​ពáŸáž› <xliff:g id="NUMBER_1">%d</xliff:g> វិនាទី។"</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"អ្នក​បាន​​គូរ​លំនាំ​ដោះ​សោ​របស់​អ្នក​មិន​ážáŸ’រឹមážáŸ’រូវ​ចំនួន <xliff:g id="NUMBER_0">%d</xliff:g> ដង។\n\nព្យាយាម​ម្ដង​ទៀážâ€‹áž€áŸ’នុង​រយៈ​ពáŸáž› <xliff:g id="NUMBER_1">%d</xliff:g> វិនាទី។"</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1575557200627128949">"អ្នក​បាន​ព្យាយាម​ដោះ​សោ​​កុំព្យូទáŸážšâ€‹áž”ន្ទះ​​មិន​ážáŸ’រឹមážáŸ’រូវ​ចំនួន <xliff:g id="NUMBER_0">%d</xliff:g> ដង។ បន្ទាប់​ពី​ការ​ព្យាយាម​មិន​ជោគជáŸáž™â€‹â€‹áž…្រើន​ជាង <xliff:g id="NUMBER_1">%d</xliff:g> ដង កុំព្យូទáŸážšâ€‹áž”ន្ទះ​​នឹង​ážáŸ’រូវ​បាន​កំណážáŸ‹â€‹áž‘ៅ​លំនាំដើម​ដូច​ចáŸáž‰â€‹áž–ី​រោងចក្រ ហើយ​ទិន្ននáŸáž™â€‹áž¢áŸ’នកប្រើ​នឹង​បាážáŸ‹áž”ង់។"</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="4051015943038199910">"អ្នក​បាន​ព្យាយាម​ដោះ​សោ​ទូរសáŸáž–្ទ​មិន​ážáŸ’រឹមážáŸ’រូវ​ចំនួន <xliff:g id="NUMBER_0">%d</xliff:g> ដង។ បន្ទាប់​ពី​ការ​ព្យាយាម​មិន​ជោគជáŸáž™â€‹â€‹áž…្រើន​ជាង <xliff:g id="NUMBER_1">%d</xliff:g> ដង ទូរសáŸáž–្ទ​នឹង​ážáŸ’រូវ​បាន​កំណážáŸ‹â€‹áž‘ៅ​លំនាំដើម​ដូច​ចáŸáž‰â€‹áž–ី​រោងចក្រ ហើយ​ទិន្ននáŸáž™â€‹áž¢áŸ’នកប្រើ​នឹង​បាážáŸ‹áž”ង់។"</string>
+ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="2072996269148483637">"អ្នក​បាន​ព្យាយាម​ដោះ​សោ​កុំព្យូទáŸážšâ€‹áž”ន្ទះ​មិន​ážáŸ’រឹមážáŸ’រូវ​ចំនួន​ <xliff:g id="NUMBER">%d</xliff:g> ដង។ កុំព្យូទáŸážšâ€‹áž”ន្ទះ​នឹង​ážáŸ’រូវ​បាន​កំណážáŸ‹â€‹áž‘ៅ​លំនាំដើម​ដូច​ចáŸáž‰â€‹áž–ី​រោងចក្រ"</string>
+ <string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"អ្នក​បាន​ព្យាយាម​ដោះ​សោ​ទូរសáŸáž–្ទ​មិន​ážáŸ’រឹមážáŸ’រូវ​ចំនួន <xliff:g id="NUMBER">%d</xliff:g> ដង។ ឥឡូវ​ទូរសáŸáž–្ទ​នឹង​កំណážáŸ‹â€‹áž‘ៅ​លំនាំ​ដើម​ដូច​ចáŸáž‰â€‹áž–ី​រោងចក្រ។"</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"អ្នក​បាន​គូរ​លំនាំ​ដោះ​សោ​មិន​ážáŸ’រឹមážáŸ’រូវ <xliff:g id="NUMBER_0">%d</xliff:g> ដង។ បន្ទាប់​ពី​ការ​ព្យាយាម <xliff:g id="NUMBER_1">%d</xliff:g> ដង​មិន​ជោគជáŸáž™ អ្នក​នឹង​ážáŸ’រូវ​បាន​ស្នើ​ឲ្យ​ដោះ​សោ​កុំព្យូទáŸážšâ€‹áž”ន្ទះ​របស់​អ្នក ដោយ​ប្រើ​គណនី​អ៊ីមែល។\n\n ព្យាយាម​ម្ដង​ទៀážâ€‹áž€áŸ’នុង​រយៈ​ពáŸáž› <xliff:g id="NUMBER_2">%d</xliff:g> វិនាទី។"</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"អ្នក​បាន​គូរ​លំនាំ​ដោះ​​សោ​របស់​អ្នក​មិន​ážáŸ’រឹមážáŸ’រូវ​ចំនួន <xliff:g id="NUMBER_0">%d</xliff:g> ដង។ បន្ទាប់​ពី​ការ​ព្យាយាម​មិន​ជោគជáŸáž™â€‹â€‹áž…្រើនជាង <xliff:g id="NUMBER_1">%d</xliff:g> ដង អ្នក​នឹង​ážáŸ’រូវ​បាន​​ស្នើ​ឲ្យ​ដោះ​សោ​ទូរសáŸáž–្ទ​របស់​អ្នក​ដោយ​ប្រើ​គណនី​អ៊ីមែល។\n\n ព្យាយាម​ម្ដង​ទៀážâ€‹áž€áŸ’នុង​រយៈ​ពáŸáž› <xliff:g id="NUMBER_2">%d</xliff:g> វិនាទី។"</string>
+ <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
+ <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"លុប​ចáŸáž‰"</string>
+ <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"ប៊ូážáž»áž„​បទ​មុន"</string>
+ <string name="keyguard_transport_next_description" msgid="4299258300283778305">"ប៊ូážáž»áž„​បទ​បន្ទាប់"</string>
+ <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"ប៊ូážáž»áž„​ផ្អាក"</string>
+ <string name="keyguard_transport_play_description" msgid="2924628863741150956">"ប៊ូážáž»áž„​ចាក់"</string>
+ <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"ប៊ូážáž»áž„​បញ្ឈប់"</string>
+ <string name="keyguard_carrier_default" msgid="8700650403054042153">"គ្មាន​សáŸážœáž¶â€‹áŸ”"</string>
+</resources>
diff --git a/packages/Keyguard/res/values-ko/strings.xml b/packages/Keyguard/res/values-ko/strings.xml
index dfac106..2a7200c 100644
--- a/packages/Keyguard/res/values-ko/strings.xml
+++ b/packages/Keyguard/res/values-ko/strings.xml
@@ -21,9 +21,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"PIN 코드 입력"</string>
- <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"PUK ë° ìƒˆ PIN 코드 ìž…ë ¥"</string>
- <string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"PUK 코드"</string>
- <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"새 PIN 코드"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="3035856550289724338">"SIM PUK ë° ìƒˆ PIN 코드 ìž…ë ¥"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="1801941051094974609">"SIM PUK 코드"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="3201151840570492538">"새 SIM PIN 코드"</string>
<string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"비밀번호를 입력하려면 터치"</font></string>
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"잠금 해제하려면 비밀번호 입력"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"ìž ê¸ˆì„ í•´ì œí•˜ë ¤ë©´ PIN ìž…ë ¥"</string>
@@ -71,6 +71,13 @@
<string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"ì¼ì‹œì¤‘ì§€ 버튼"</string>
<string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"ìž¬ìƒ ë²„íŠ¼"</string>
<string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"중지 버튼"</string>
+ <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"좋아요"</string>
+ <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"ì‹«ì–´ìš”"</string>
+ <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"하트"</string>
+ <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"계ì†í•˜ë ¤ë©´ 잠금해제합니다."</string>
+ <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"실행 취소ë¨"</string>
+ <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"삭제하려면 <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>ì„(를) 드롭합니다."</string>
+ <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g>ì€(는) ì‚­ì œë˜ì§€ 않습니다."</string>
<string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
<string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
<string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
@@ -105,7 +112,6 @@
<string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"ì›í•˜ëŠ” PIN 코드 ìž…ë ¥"</string>
<string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"ì›í•˜ëŠ” PIN 코드 확ì¸"</string>
<string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"SIM 카드 잠금해제 중..."</string>
- <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"PIN 코드가 잘못ë˜ì—ˆìŠµë‹ˆë‹¤."</string>
<string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"4~8ìžë¦¬ 숫ìžë¡œ ëœ PINì„ ìž…ë ¥í•˜ì„¸ìš”."</string>
<string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"PUK 코드는 8ìžë¦¬ ì´ìƒì˜ 숫ìžì—¬ì•¼ 합니다."</string>
<string name="kg_invalid_puk" msgid="3638289409676051243">"올바른 PUK 코드를 다시 입력하세요. ìž…ë ¥ì„ ë°˜ë³µí•´ì„œ 시ë„하면 SIMì„ ì˜êµ¬ì ìœ¼ë¡œ 사용할 수 없게 ë©ë‹ˆë‹¤."</string>
@@ -129,6 +135,19 @@
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"잠금해제 íŒ¨í„´ì„ <xliff:g id="NUMBER_0">%d</xliff:g>회 잘못 그렸습니다. <xliff:g id="NUMBER_1">%d</xliff:g>회 ë” ì‹¤íŒ¨í•˜ë©´ ì´ë©”ì¼ ê³„ì •ì„ ì‚¬ìš©í•˜ì—¬ 휴대전화를 잠금해제해야 합니다.\n\n <xliff:g id="NUMBER_2">%d</xliff:g>ì´ˆ í›„ì— ë‹¤ì‹œ 시ë„í•´ 주세요."</string>
<string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
<string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"삭제"</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"SIM PIN 코드가 잘못ë˜ì—ˆìŠµë‹ˆë‹¤. ì´ë™í†µì‹ ì‚¬ì— 문ì˜í•˜ì—¬ 기기를 잠금 해제해야 합니다."</string>
+ <plurals name="kg_password_wrong_pin_code">
+ <item quantity="one" msgid="8134313997799638254">"SIM PIN 코드가 잘못ë˜ì—ˆìŠµë‹ˆë‹¤. <xliff:g id="NUMBER">%d</xliff:g>회 ì´ìƒ 실패할 경우 ì´ë™í†µì‹ ì‚¬ì— 문ì˜í•˜ì—¬ 기기를 잠금 해제해야 합니다."</item>
+ <item quantity="other" msgid="2215723361575359486">"SIM PIN 코드가 잘못ë˜ì—ˆìŠµë‹ˆë‹¤. <xliff:g id="NUMBER">%d</xliff:g>ë²ˆì˜ ê¸°íšŒê°€ 남았습니다."</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="7077536808291316208">"SIMì„ ì‚¬ìš©í•  수 없습니다. ì´ë™í†µì‹ ì‚¬ì— 문ì˜í•˜ì„¸ìš”."</string>
+ <plurals name="kg_password_wrong_puk_code">
+ <item quantity="one" msgid="3256893607561060649">"SIM PUK 코드가 잘못ë˜ì—ˆìŠµë‹ˆë‹¤. <xliff:g id="NUMBER">%d</xliff:g>회 ì´ìƒ 실패할 경우 SIMì„ ì™„ì „ížˆ 사용할 수 없습니다."</item>
+ <item quantity="other" msgid="5477305226026342036">"SIM PUK 코드가 잘못ë˜ì—ˆìŠµë‹ˆë‹¤. <xliff:g id="NUMBER">%d</xliff:g>회 ì´ìƒ 실패할 경우 SIMì„ ì™„ì „ížˆ 사용할 수 없습니다."</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="6268288093558031564">"SIM PIN ìž‘ì—…ì´ ì‹¤íŒ¨í–ˆìŠµë‹ˆë‹¤."</string>
+ <string name="kg_password_puk_failed" msgid="2838824369502455984">"SIM PUK ìž‘ì—…ì´ ì‹¤íŒ¨í–ˆìŠµë‹ˆë‹¤."</string>
+ <string name="kg_pin_accepted" msgid="1448241673570020097">"코드 ìŠ¹ì¸ ì™„ë£Œ"</string>
<string name="keyguard_transport_prev_description" msgid="8229108430245669854">"ì´ì „ 트랙 버튼"</string>
<string name="keyguard_transport_next_description" msgid="4299258300283778305">"ë‹¤ìŒ íŠ¸ëž™ 버튼"</string>
<string name="keyguard_transport_pause_description" msgid="5093073338238310224">"ì¼ì‹œì¤‘ì§€ 버튼"</string>
diff --git a/packages/Keyguard/res/values-lo-rLA/strings.xml b/packages/Keyguard/res/values-lo-rLA/strings.xml
new file mode 100644
index 0000000..81c1018
--- /dev/null
+++ b/packages/Keyguard/res/values-lo-rLA/strings.xml
@@ -0,0 +1,157 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"ພິມລະຫັດ PIN"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="3035856550289724338">"ປະເພດ PUK ຂອງ SIM à»àº¥àº°àº¥àº°àº«àº±àº” PIN ໃà»à»ˆ"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="1801941051094974609">"ລະຫັດ PUK ຂອງ SIM"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="3201151840570492538">"ລະຫັດ PIN ໃà»à»ˆàº‚ອງ SIM"</string>
+ <string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"à»àº•ະເພື່ອພິມລະຫັດຜ່ານ"</font></string>
+ <string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"ພິມລະຫັດເພື່ອປົດລັອàº"</string>
+ <string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"ພິມລະຫັດ PIN ເພື່ອປົດລັອàº"</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"ລະຫັດ PIN ບà»à»ˆàº–ືàºàº•້ອງ."</string>
+ <string name="keyguard_label_text" msgid="861796461028298424">"ເພື່ອປົດລັອàº, ໃຫ້àºàº»àº”ເມນູ à»àº¥à»‰àº§àºàº»àº” 0."</string>
+ <string name="faceunlock_multiple_failures" msgid="754137583022792429">"ຄວາມພະàºàº²àºàº²àº¡àº›àº»àº”ລັອàºàº”້ວàºà»œà»‰àº²àº™àº±à»‰àº™ ເàºàºµàº™àºˆàº³àº™àº§àº™àº—ີ່àºàº³àº™àº»àº”à»àº¥à»‰àº§"</string>
+ <string name="keyguard_charged" msgid="3272223906073492454">"ສາàºà»€àº•ັມà»àº¥à»‰àº§"</string>
+ <string name="keyguard_plugged_in" msgid="8117572000639998388">"àºàº³àº¥àº±àº‡àºªàº²àº, <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+ <string name="keyguard_low_battery" msgid="8143808018719173859">"ເຊື່ອມຕà»à»ˆàº­àº¸àº›àº°àºàº­àº™àºªàº²àºàº‚ອງທ່ານ."</string>
+ <string name="keyguard_instructions_when_pattern_disabled" msgid="1332288268600329841">"àºàº»àº”ເມນູເພື່ອປົດລັອàº."</string>
+ <string name="keyguard_network_locked_message" msgid="9169717779058037168">"ເຄືອຂ່າàºàº–ືàºàº¥àº±àº­àº"</string>
+ <string name="keyguard_missing_sim_message_short" msgid="494980561304211931">"ບà»à»ˆàº¡àºµàºŠàº´àº¡àºàº²àº”"</string>
+ <string name="keyguard_missing_sim_message" product="tablet" msgid="1445849005909260039">"ບà»à»ˆàº¡àºµàºŠàº´àº¡àºàº²àº”ໃນà»àº—ັບເລັດ."</string>
+ <string name="keyguard_missing_sim_message" product="default" msgid="3481110395508637643">"ບà»à»ˆàº¡àºµàºŠàº´àº¡àºàº²àº”ຢູ່ໃນໂທລະສັບ."</string>
+ <string name="keyguard_missing_sim_instructions" msgid="5210891509995942250">"ໃສ່ SIM card."</string>
+ <string name="keyguard_missing_sim_instructions_long" msgid="5968985489463870358">"ບà»à»ˆàºžàº»àºšà»€àº«àº±àº™àºŠàº´àº¡àºàº²àº” ຫຼືບà»à»ˆàºªàº²àº¡àº²àº”ອ່ານຊິມàºàº²àº”ໄດ້. àºàº°àº¥àº¸àº™àº²à»ƒàºªà»ˆàºŠàº´àº¡àºàº²àº”ໃà»à»ˆ."</string>
+ <string name="keyguard_permanent_disabled_sim_message_short" msgid="8340813989586622356">"SIM card ບà»à»ˆàºªàº²àº¡àº²àº”ໃຊ້ໄດ້."</string>
+ <string name="keyguard_permanent_disabled_sim_instructions" msgid="5892940909699723544">"SIM card ຂອງທ່ານຖືàºàº›àº´àº”àºàº²àº™àº™àº³à»ƒàºŠà»‰àº¢à»ˆàº²àº‡àº–າວອນà»àº¥à»‰àº§.\n ຕິດຕà»à»ˆàºœàº¹à»ˆà»ƒàº«à»‰àºšà»àº¥àº´àºàº²àº™àº¥àº°àºšàº»àºšàº‚ອງທ່ານເພື່ອຂ໠SIM card ໃà»à»ˆ."</string>
+ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"ຊິມàºàº²àº”ຖືàºàº¥àº±àº­àº."</string>
+ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"ຊິມàºàº²àº”ຖືàºàº¥àº±àº­àºàº”້ວàºàº¥àº°àº«àº±àº” PUK."</string>
+ <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"àºàº³àº¥àº±àº‡àº›àº»àº”ລັອàºàºŠàº´àº¡àºàº²àº”..."</string>
+ <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. ວິດເຈັດ %2$d ຈາàºàº—ັງà»àº»àº” %3$d."</string>
+ <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"ເພີ່ມວິດເຈັດ"</string>
+ <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"ຫວ່າງເປົ່າ"</string>
+ <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"ຂະຫàºàº²àºàºžàº·à»‰àº™àº—ີ່ປົດລັອàºà»àº¥à»‰àº§."</string>
+ <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"ຫàºà»à»‰àºžàº·à»‰àº™àº—ີ່ປົດລັອàºà»àº¥à»‰àº§."</string>
+ <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> ວິດເຈັດ."</string>
+ <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"ໂຕເລືອàºàº‚ອງຜູ່ໃຊ້"</string>
+ <string name="keyguard_accessibility_status" msgid="8008264603935930611">"ສະຖານະ"</string>
+ <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"àºà»‰àº­àº‡"</string>
+ <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"àºàº²àº™àº„ວບຄຸມສື່"</string>
+ <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"àºàº²àº™àºˆàº±àº”ຮຽງວິເຈັດໃà»à»ˆà»€àº¥àºµà»ˆàº¡àº•ົ້ນà»àº¥à»‰àº§."</string>
+ <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"àºàº²àº™àºˆàº±àº”ຮຽງວິດເຈັດຄືນໃà»à»ˆàºªàº³à»€àº¥àº±àº”à»àº¥à»‰àº§."</string>
+ <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"ລຶບວິດເຈັດ <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> à»àº¥à»‰àº§."</string>
+ <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"ຂະຫàºàº²àºàº‚ອບເຂດປົດລັອàº."</string>
+ <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"àºàº²àº™àº›àº»àº”ລັອàºàº”້ວàºàºàº²àº™à»€àº¥àº·à»ˆàº­àº™."</string>
+ <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"ປົດລັອàºàº”້ວàºàº®àº¹àºšà»àºšàºš."</string>
+ <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"ປົດລັອàºàº”້ວàºà»œà»‰àº²."</string>
+ <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"ປົດລັອàºàº”້ວຠPIN."</string>
+ <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"àºàº²àº™àº›àº»àº”ລັອàºàº”້ວàºàº¥àº°àº«àº±àº”ຜ່ານ."</string>
+ <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"ພື້ນທີ່ຮູບà»àºšàºš."</string>
+ <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"ເລື່ອນພື້ນທີ່."</string>
+ <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"ປຸ່ມເພງàºà»ˆàº­àº™à»œà»‰àº²"</string>
+ <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"ປຸ່ມເພງຕà»à»ˆà»„ປ"</string>
+ <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"ປຸ່ມຢຸດຊົ່ວຄາວ"</string>
+ <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"ປຸ່ມຫຼິ້ນ"</string>
+ <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"ປຸ່ມຢຸດ"</string>
+ <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"ເລື່ອນນິ້ວໂປ້ຂຶ້ນ"</string>
+ <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"ເລື່ອນນິ້ວໂປ້ລົງ"</string>
+ <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"ຫົວໃຈ"</string>
+ <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"ປົດລັອàºà»€àºžàº·à»ˆàº­àº”ຳເນີນàºàº²àº™àº•à»à»ˆ"</string>
+ <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"àºàº²àº™à»€àº›àºµàº”ໃຊ້ຖືàºàºàº»àºà»€àº¥àºµàº"</string>
+ <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"ວາງ <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> ເພື່ອລຶບ."</string>
+ <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> ຈະບà»à»ˆàº–ືàºàº¥àº¶àºšàº­àº­àº"</string>
+ <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
+ <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
+ <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
+ <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
+ <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"àºàº»àºà»€àº¥àºµàº"</string>
+ <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"ລຶບ"</string>
+ <string name="keyboardview_keycode_done" msgid="1992571118466679775">"à»àº¥à»‰àº§à»†"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"ປ່ຽນຮູບà»àºšàºš"</string>
+ <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
+ <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
+ <string name="description_target_unlock" msgid="2228524900439801453">"ປົດລັອàº"</string>
+ <string name="description_target_camera" msgid="969071997552486814">"àºà»‰àº­àº‡"</string>
+ <string name="description_target_silent" msgid="893551287746522182">"ປິດສຽງ"</string>
+ <string name="description_target_soundon" msgid="30052466675500172">"ເປີດສຽງ"</string>
+ <string name="description_target_search" msgid="3091587249776033139">"ຊອàºàº«àº²"</string>
+ <string name="description_direction_up" msgid="7169032478259485180">"ເລື່ອນຂຶ້ນເພື່ອ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="5087739728639014595">"ເລື່ອນລົງເພື່ອ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="7207478719805562165">"ເລື່ອນໄປທາງຊ້າàºà»€àºžàº·à»ˆàº­ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="8034433242579600980">"ເລື່ອນໄປທາງຂວາເພື່ອ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="user_switched" msgid="3768006783166984410">"ຜູ່ໃຊ້ປັດຈຸບັນ <xliff:g id="NAME">%1$s</xliff:g> ."</string>
+ <string name="kg_emergency_call_label" msgid="684946192523830531">"àºàº²àº™à»‚ທສຸàºà»€àºªàºµàº™"</string>
+ <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"ລືມຮູບà»àºšàºšàº›àº»àº”ລັອàº?"</string>
+ <string name="kg_wrong_pattern" msgid="1850806070801358830">"ຮູບà»àºšàºšàºœàº´àº”"</string>
+ <string name="kg_wrong_password" msgid="2333281762128113157">"ລະຫັດຜ່ານບà»à»ˆàº–ືàºàº•້ອງ"</string>
+ <string name="kg_wrong_pin" msgid="1131306510833563801">"ລະຫັດ PIN ຜິດ"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"ລອງໃà»à»ˆà»ƒàº™àº­àºµàº <xliff:g id="NUMBER">%d</xliff:g> ວິນາທີ."</string>
+ <string name="kg_pattern_instructions" msgid="398978611683075868">"à»àº•້ມຮູບà»àºšàºšàº›àº»àº”ລັອàºàº‚ອງທ່ານ"</string>
+ <string name="kg_sim_pin_instructions" msgid="2319508550934557331">"ໃສ່ລະຫັດ PIN ຂອງຊິມ"</string>
+ <string name="kg_pin_instructions" msgid="2377242233495111557">"ໃສ່ລະຫັດ PIN"</string>
+ <string name="kg_password_instructions" msgid="5753646556186936819">"ໃສ່ລະຫັດຜ່ານ"</string>
+ <string name="kg_puk_enter_puk_hint" msgid="453227143861735537">"ຊິມຖືàºàº›àº´àº”àºàº²àº™àº™àº³à»ƒàºŠà»‰à»àº¥à»‰àº§. ປ້ອນລະຫັດ PUK ເພື່ອດຳເນີນàºàº²àº™àº•à»à»ˆ. ຕິດຕà»à»ˆàºœàº¹à»ˆà»ƒàº«à»‰àºšà»àº¥àº´àºàº²àº™àºªàº³àº¥àº±àºšàº¥àº²àºàº¥àº°àº­àº½àº”."</string>
+ <string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"ໃສ່ລະຫັດ PIN ທີ່ຕ້ອງàºàº²àº™."</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"ຢືນຢັນລະຫັດ PIN ທີ່ຕ້ອງàºàº²àº™"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"ປົດລັອຠSIM card..."</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"ພິມລະຫັດ PIN ຄວາມàºàº²àº§ 4 ເຖິງ 8 ໂຕເລàº."</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"ລະຫັດ PUK ຄວນມີຢ່າງໜ້ອຠ8 ໂຕເລàº."</string>
+ <string name="kg_invalid_puk" msgid="3638289409676051243">"ປ້ອນລະຫັດ PUK ທີ່ຖືàºàº•້ອງຄືນໃà»à»ˆ. àºàº²àº™àºžàº°àºàº²àºàº²àº¡à»ƒàºªà»ˆàº«àº¼àº²àºà»€àº—ື່ອຈະເຮັດໃຫ້ຊິມàºàº²àº”ໃຊ້ບà»à»ˆà»„ດ້ຖາວອນ."</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"ລະຫັດ PIN ບà»à»ˆàºàº»àº‡àºàº±àº™"</string>
+ <string name="kg_login_too_many_attempts" msgid="6486842094005698475">"à»àº•້ມຮູບà»àºšàºšàº›àº»àº”ລັອàºàº«àº¼àº²àºà»€àºàºµàº™à»„ປ"</string>
+ <string name="kg_login_instructions" msgid="1100551261265506448">"ເພື່ອປົດລັອàº, ເຂົ້າສູ່ລະບົບດ້ວàºàºšàº±àº™àºŠàºµ Google ຂອງທ່ານ."</string>
+ <string name="kg_login_username_hint" msgid="5718534272070920364">"ຊື່ຜູ່ໃຊ້ (ອີເມວ)"</string>
+ <string name="kg_login_password_hint" msgid="9057289103827298549">"ລະຫັດຜ່ານ"</string>
+ <string name="kg_login_submit_button" msgid="5355904582674054702">"ເຂົ້າສູ່ລະບົບ"</string>
+ <string name="kg_login_invalid_input" msgid="5754664119319872197">"ຊື່ຜູ່ໃຊ້ ຫຼືລະຫັດຜ່ານບà»à»ˆàº–ືàºàº•້ອງ."</string>
+ <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"ລືມຊື່ຜູ່ໃຊ້ ຫຼືລະຫັດຜ່ານຂອງທ່ານບà»à»ˆ?\nໄປທີ່ "<b>"google.com/accounts/recovery"</b>"."</string>
+ <string name="kg_login_checking_password" msgid="1052685197710252395">"àºàº³àº¥àº±àº‡àºàº§àº”ສອບບັນຊີ..."</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"ທ່ານພິມລະຫັດ PIN​ ຂອງທ່ານຜິດ <xliff:g id="NUMBER_0">%d</xliff:g> ເທື່ອà»àº¥à»‰àº§. \n\nàºàº°àº¥àº¸àº™àº²àº¥àº­àº‡à»ƒà»à»ˆà»ƒàº™àº­àºµàº <xliff:g id="NUMBER_1">%d</xliff:g> ວິນາທີ."</string>
+ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"ທ່ານພິມລະຫັດຜິດ <xliff:g id="NUMBER_0">%d</xliff:g> ເທື່ອà»àº¥à»‰àº§. \n\nລອງໃà»à»ˆà»ƒàº™àº­àºµàº <xliff:g id="NUMBER_1">%d</xliff:g> ວິນາທີ."</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"ທ່ານà»àº•້ມຮູບà»àºšàºšàº›àº»àº”ລັອàºàº‚ອງທ່ານຜິດ <xliff:g id="NUMBER_0">%d</xliff:g> ເທື່ອà»àº¥à»‰àº§. \n\nàºàº°àº¥àº¸àº™àº²àº¥àº­àº‡à»ƒà»à»ˆà»ƒàº™àº­àºµàº <xliff:g id="NUMBER_1">%d</xliff:g> ວິນາທີ."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1575557200627128949">"ທ່ານໄດ້ພະàºàº²àºàº²àº¡àº›àº»àº”ລັອàºà»àº—ັບເລັດບà»à»ˆàºªàº³à»€àº¥àº±àº” <xliff:g id="NUMBER_0">%d</xliff:g> ເທື່ອà»àº¥à»‰àº§. ຫຼັງຈາàºàº„ວາມພະàºàº²àºàº²àº¡àº­àºµàº <xliff:g id="NUMBER_1">%d</xliff:g> ເທື່ອ à»àº—ັບເລັດຂອງທ່ານຈະຖືàºàº•ັ້ງ ໃຫ້àºàº±àºšà»„ປໃຊ້ຄ່າເລີ່ມຕົ້ນຈາàºà»‚ຮງງານຄືນໃà»à»ˆ à»àº¥àº°àº‚à»à»‰àº¡àº¹àº™àºœàº¹à»ˆà»ƒàºŠà»‰àº—ັງà»àº»àº”ຈະສູນຫາàºà»„ປ."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="4051015943038199910">"ທ່ານໄດ້ພະàºàº²àºàº²àº¡àº›àº»àº”ລັອàºà»‚ທລະສັບບà»à»ˆàºªàº³à»€àº¥àº±àº” <xliff:g id="NUMBER_0">%d</xliff:g> ເທື່ອà»àº¥à»‰àº§. ຫຼັງຈາàºàº„ວາມພະàºàº²àºàº²àº¡àº­àºµàº <xliff:g id="NUMBER_1">%d</xliff:g> ເທື່ອ ໂທລະສັບຂອງທ່ານຈະຖືàºàº•ັ້ງ ໃຫ້àºàº±àºšà»„ປໃຊ້ຄ່າເລີ່ມຕົ້ນຈາàºà»‚ຮງງານຄືນໃà»à»ˆ à»àº¥àº°àº‚à»à»‰àº¡àº¹àº™àºœàº¹à»ˆà»ƒàºŠà»‰àº—ັງà»àº»àº”ຈະສູນຫາàºà»„ປ."</string>
+ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="2072996269148483637">"ທ່ານໄດ້ພະàºàº²àºàº²àº¡àº›àº»àº”ລັອàºà»àº—ັບເລັດບà»à»ˆàºªàº³à»€àº¥àº±àº” <xliff:g id="NUMBER">%d</xliff:g> ເທື່ອà»àº¥à»‰àº§. ຕອນນີ້à»àº—ັບເລັດຈະຖືàºàº•ັ້ງໃຫ້àºàº±àºšà»„ປໃຊ້ຄ່າເລີ່ມຕົ້ນຈາàºà»‚ຮງງານ."</string>
+ <string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"ທ່ານໄດ້ພະàºàº²àºàº²àº¡àº›àº»àº”ລັອàºà»‚ທລະສັບບà»à»ˆàº–ືຠ<xliff:g id="NUMBER">%d</xliff:g> ເທື່ອà»àº¥à»‰àº§. ຕອນນີ້ໂທລະສັບຈະຖືàºàº£àºµà»€àºŠàº±àº”ເປັນຄ່າຈາàºà»‚ຮງງານ."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"ທ່ານà»àº•້ມຮູບà»àºšàºšàº›àº»àº”ລັອàºàºœàº´àº” <xliff:g id="NUMBER_0">%d</xliff:g> ເທື່ອà»àº¥à»‰àº§. ຫຼັງຈາàºà»àº•້ມຜິດອີຠ<xliff:g id="NUMBER_1">%d</xliff:g> ເທື່ອ, ທ່ານຈະຖືàºàº–າມໃຫ້ປົດລັອàºà»àº—ັບເລັດຂອງທ່ານ ດ້ວàºàºàº²àº™à»€àº‚ົ້າສູ່ລະບົບໂດàºà»ƒàºŠà»‰àº­àºµà»€àº¡àº§àº‚ອງທ່ານ.\n\n àºàº°àº¥àº¸àº™àº²àº¥àº­àº‡à»ƒà»à»ˆàº­àºµàºàº„ັ້ງໃນອີຠ<xliff:g id="NUMBER_2">%d</xliff:g> ວິນາທີ."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"ທ່ານà»àº•້ມຮູບà»àºšàºšàº›àº»àº”ລັອàºàº‚ອງທ່ານຜິດ <xliff:g id="NUMBER_0">%d</xliff:g> ເທື່ອà»àº¥à»‰àº§. ຫຼັງຈາàºàº„ວາມພະàºàº²àºàº²àº¡àº­àºµàº <xliff:g id="NUMBER_1">%d</xliff:g> ເທື່ອ ທ່ານຈະຖືàºàº–າມໃຫ້ປົດລັອàºà»‚ທລະສັບຂອງທ່ານດ້ວàºàºšàº±àº™àºŠàºµàº­àºµà»€àº¡àº§.\n\n ລອງໃà»à»ˆàº­àºµàºàº„ັ້ງໃນ <xliff:g id="NUMBER_2">%d</xliff:g> ວິນາທີ."</string>
+ <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
+ <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"ລຶບອອàº"</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"ລະຫັດ PIN ຂອງ SIM ບà»à»ˆàº–ືàºàº•້ອງທ່ານຕ້ອງຕິດຕà»à»ˆàº«àº²àºœàº¹à»ˆà»ƒàº«à»‰àºšà»àº¥àº´àºàº²àº™ ເພື່ອປົດລັອàºàº­àº¸àº›àº°àºàº­àº™àº‚ອງທ່ານ."</string>
+ <plurals name="kg_password_wrong_pin_code">
+ <item quantity="one" msgid="8134313997799638254">"ລະຫັດ PIN ຂອງ SIM ບà»à»ˆàº–ືàºàº•້ອງ, ທ່ານສາມາດລອງໄດ້ອີຠ<xliff:g id="NUMBER">%d</xliff:g> ເທື່ອàºà»ˆàº­àº™àº—ີ່ທ່ານຈະຕ້ອງຕິດຕà»à»ˆàº«àº²àºœàº¹à»ˆà»ƒàº«à»‰àºšà»àº¥àº´àºàº²àº™àº‚ອງທ່ານ ເພື່ອປົດລັອàºàº­àº¸àº›àº°àºàº­àº™àº‚ອງທ່ານ."</item>
+ <item quantity="other" msgid="2215723361575359486">"ລະຫັດ PIN ຂອງ SIM ບà»à»ˆàº–ືàºàº•້ອງ, ທ່ານສາມາດລອງໄດ້ອີຠ<xliff:g id="NUMBER">%d</xliff:g> ເທື່ອ."</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="7077536808291316208">"SIM ໃຊ້ບà»à»ˆà»„ດ້à»àº¥à»‰àº§. àºàº°àº¥àº¸àº™àº²àº•ິດຕà»à»ˆàº«àº²àºœàº¹à»ˆà»ƒàº«à»‰àºšà»àº¥àº´àºàº²àº™àº‚ອງທ່ານ."</string>
+ <plurals name="kg_password_wrong_puk_code">
+ <item quantity="one" msgid="3256893607561060649">"ລະຫັດ PUK ຂອງ SIM ບà»à»ˆàº–ືàºàº•້ອງ, ທ່ານສາມາດລອງໄດ້ອີຠ<xliff:g id="NUMBER">%d</xliff:g> ເທື່ອàºà»ˆàº­àº™àº—ີ່ SIM ຂອງທ່ານຈະໃຊ້ບà»à»ˆà»„ດ້ຢ່າງຖາວອນ."</item>
+ <item quantity="other" msgid="5477305226026342036">"ລະຫັດ PUK ຂອງ SIM ບà»à»ˆàº–ືàºàº•້ອງ, ທ່ານສາມາດລອງໄດ້ອີຠ<xliff:g id="NUMBER">%d</xliff:g> ເທື່ອàºà»ˆàº­àº™àº—ີ່ SIM ຂອງທ່ານຈະໃຊ້ບà»à»ˆà»„ດ້ຢ່າງຖາວອນ."</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="6268288093558031564">"PIN ຂອງ SIM ເຮັດວຽàºàº¥àº»à»‰àº¡à»€àº«àº¼àº§!"</string>
+ <string name="kg_password_puk_failed" msgid="2838824369502455984">"PUK ຂອງ SIM ເຮັດວຽàºàº¥àº»à»‰àº¡à»€àº«àº¼àº§!"</string>
+ <string name="kg_pin_accepted" msgid="1448241673570020097">"ລະ​ຫັດ​ຖືàºàº•ອບຮັບà»àº¥à»‰àº§!"</string>
+ <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"ປຸ່ມເພງàºà»ˆàº­àº™à»œà»‰àº²"</string>
+ <string name="keyguard_transport_next_description" msgid="4299258300283778305">"ປຸ່ມເພງຕà»à»ˆà»„ປ"</string>
+ <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"ປຸ່ມຢຸດຊົ່ວຄາວ"</string>
+ <string name="keyguard_transport_play_description" msgid="2924628863741150956">"ປຸ່ມຫຼິ້ນ"</string>
+ <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"ປຸ່ມຢຸດ"</string>
+ <string name="keyguard_carrier_default" msgid="8700650403054042153">"ບà»à»ˆàº¡àºµàºšà»àº¥àº´àºàº²àº™"</string>
+</resources>
diff --git a/packages/Keyguard/res/values-lo/strings.xml b/packages/Keyguard/res/values-lo/strings.xml
new file mode 100644
index 0000000..0dcb7d1
--- /dev/null
+++ b/packages/Keyguard/res/values-lo/strings.xml
@@ -0,0 +1,138 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"ພິມລະຫັດ PIN"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"ພິມລະຫັດ PUK à»àº¥àº°â€‹àº¥àº°â€‹àº«àº±àº” PIN ອັນໃà»à»ˆ"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"ລະ​ຫັດ PUK"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"ລະຫັດ PIN ໃà»à»ˆ"</string>
+ <string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"à»àº•ະເພື່ອພິມລະຫັດຜ່ານ"</font></string>
+ <string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"ພິມລະຫັດເພື່ອປົດລັອàº"</string>
+ <string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"ພິມລະຫັດ PIN ເພື່ອປົດລັອàº"</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"ລະຫັດ PIN ບà»à»ˆàº–ືàºàº•້ອງ."</string>
+ <string name="keyguard_label_text" msgid="861796461028298424">"ເພື່ອປົດລັອàº, ໃຫ້àºàº»àº”ເມນູ à»àº¥à»‰àº§àºàº»àº” 0."</string>
+ <string name="faceunlock_multiple_failures" msgid="754137583022792429">"ຄວາມພະàºàº²àºàº²àº¡àº›àº»àº”ລັອàºàº”້ວàºà»œà»‰àº²àº™àº±à»‰àº™ ເàºàºµàº™àºˆàº³àº™àº§àº™àº—ີ່àºàº³àº™àº»àº”à»àº¥à»‰àº§"</string>
+ <string name="keyguard_charged" msgid="3272223906073492454">"ສາàºà»€àº•ັມà»àº¥à»‰àº§"</string>
+ <string name="keyguard_plugged_in" msgid="8117572000639998388">"àºàº³àº¥àº±àº‡àºªàº²àº, <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+ <string name="keyguard_low_battery" msgid="8143808018719173859">"ເຊື່ອມຕà»à»ˆàº­àº¸àº›àº°àºàº­àº™àºªàº²àºàº‚ອງທ່ານ."</string>
+ <string name="keyguard_instructions_when_pattern_disabled" msgid="1332288268600329841">"àºàº»àº”ເມນູເພື່ອປົດລັອàº."</string>
+ <string name="keyguard_network_locked_message" msgid="9169717779058037168">"ເຄືອຂ່າàºàº–ືàºàº¥àº±àº­àº"</string>
+ <string name="keyguard_missing_sim_message_short" msgid="494980561304211931">"ບà»à»ˆàº¡àºµàºŠàº´àº¡àºàº²àº”"</string>
+ <string name="keyguard_missing_sim_message" product="tablet" msgid="1445849005909260039">"ບà»à»ˆàº¡àºµàºŠàº´àº¡àºàº²àº”ໃນà»àº—ັບເລັດ."</string>
+ <string name="keyguard_missing_sim_message" product="default" msgid="3481110395508637643">"ບà»à»ˆàº¡àºµàºŠàº´àº¡àºàº²àº”ຢູ່ໃນໂທລະສັບ."</string>
+ <string name="keyguard_missing_sim_instructions" msgid="5210891509995942250">"ໃສ່ SIM card."</string>
+ <string name="keyguard_missing_sim_instructions_long" msgid="5968985489463870358">"ບà»à»ˆàºžàº»àºšà»€àº«àº±àº™àºŠàº´àº¡àºàº²àº” ຫຼືບà»à»ˆàºªàº²àº¡àº²àº”ອ່ານຊິມàºàº²àº”ໄດ້. àºàº°àº¥àº¸àº™àº²à»ƒàºªà»ˆàºŠàº´àº¡àºàº²àº”ໃà»à»ˆ."</string>
+ <string name="keyguard_permanent_disabled_sim_message_short" msgid="8340813989586622356">"SIM card ບà»à»ˆàºªàº²àº¡àº²àº”ໃຊ້ໄດ້."</string>
+ <string name="keyguard_permanent_disabled_sim_instructions" msgid="5892940909699723544">"SIM card ຂອງທ່ານຖືàºàº›àº´àº”àºàº²àº™àº™àº³à»ƒàºŠà»‰àº¢à»ˆàº²àº‡àº–າວອນà»àº¥à»‰àº§.\n ຕິດຕà»à»ˆàºœàº¹à»ˆà»ƒàº«à»‰àºšà»àº¥àº´àºàº²àº™àº¥àº°àºšàº»àºšàº‚ອງທ່ານເພື່ອຂ໠SIM card ໃà»à»ˆ."</string>
+ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"ຊິມàºàº²àº”ຖືàºàº¥àº±àº­àº."</string>
+ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"ຊິມàºàº²àº”ຖືàºàº¥àº±àº­àºàº”້ວàºàº¥àº°àº«àº±àº” PUK."</string>
+ <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"àºàº³àº¥àº±àº‡àº›àº»àº”ລັອàºàºŠàº´àº¡àºàº²àº”..."</string>
+ <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. ວິດເຈັດ %2$d ຈາàºàº—ັງà»àº»àº” %3$d."</string>
+ <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"ເພີ່ມວິດເຈັດ"</string>
+ <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"ຫວ່າງເປົ່າ"</string>
+ <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"ຂະຫàºàº²àºàºžàº·à»‰àº™àº—ີ່ປົດລັອàºà»àº¥à»‰àº§."</string>
+ <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"ຫàºà»à»‰àºžàº·à»‰àº™àº—ີ່ປົດລັອàºà»àº¥à»‰àº§."</string>
+ <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> ວິດເຈັດ."</string>
+ <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"ໂຕເລືອàºàº‚ອງຜູ່ໃຊ້"</string>
+ <string name="keyguard_accessibility_status" msgid="8008264603935930611">"ສະຖານະ"</string>
+ <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"àºà»‰àº­àº‡"</string>
+ <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"àºàº²àº™àº„ວບຄຸມສື່"</string>
+ <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"àºàº²àº™àºˆàº±àº”ຮຽງວິເຈັດໃà»à»ˆà»€àº¥àºµà»ˆàº¡àº•ົ້ນà»àº¥à»‰àº§."</string>
+ <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"àºàº²àº™àºˆàº±àº”ຮຽງວິດເຈັດຄືນໃà»à»ˆàºªàº³à»€àº¥àº±àº”à»àº¥à»‰àº§."</string>
+ <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"ລຶບວິດເຈັດ <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> à»àº¥à»‰àº§."</string>
+ <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"ຂະຫàºàº²àºàº‚ອບເຂດປົດລັອàº."</string>
+ <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"àºàº²àº™àº›àº»àº”ລັອàºàº”້ວàºàºàº²àº™à»€àº¥àº·à»ˆàº­àº™."</string>
+ <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"ປົດລັອàºàº”້ວàºàº®àº¹àºšà»àºšàºš."</string>
+ <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"ປົດລັອàºàº”້ວàºà»œà»‰àº²."</string>
+ <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"ປົດລັອàºàº”້ວຠPIN."</string>
+ <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"àºàº²àº™àº›àº»àº”ລັອàºàº”້ວàºàº¥àº°àº«àº±àº”ຜ່ານ."</string>
+ <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"ພື້ນທີ່ຮູບà»àºšàºš."</string>
+ <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"ເລື່ອນພື້ນທີ່."</string>
+ <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"ປຸ່ມເພງàºà»ˆàº­àº™à»œà»‰àº²"</string>
+ <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"ປຸ່ມເພງຕà»à»ˆà»„ປ"</string>
+ <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"ປຸ່ມຢຸດຊົ່ວຄາວ"</string>
+ <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"ປຸ່ມຫຼິ້ນ"</string>
+ <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"ປຸ່ມຢຸດ"</string>
+ <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
+ <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
+ <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
+ <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
+ <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"àºàº»àºà»€àº¥àºµàº"</string>
+ <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"ລຶບ"</string>
+ <string name="keyboardview_keycode_done" msgid="1992571118466679775">"à»àº¥à»‰àº§à»†"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"ປ່ຽນຮູບà»àºšàºš"</string>
+ <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
+ <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
+ <string name="description_target_unlock" msgid="2228524900439801453">"ປົດລັອàº"</string>
+ <string name="description_target_camera" msgid="969071997552486814">"àºà»‰àº­àº‡"</string>
+ <string name="description_target_silent" msgid="893551287746522182">"ປິດສຽງ"</string>
+ <string name="description_target_soundon" msgid="30052466675500172">"ເປີດສຽງ"</string>
+ <string name="description_target_search" msgid="3091587249776033139">"ຊອàºàº«àº²"</string>
+ <string name="description_direction_up" msgid="7169032478259485180">"ເລື່ອນຂຶ້ນເພື່ອ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="5087739728639014595">"ເລື່ອນລົງເພື່ອ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="7207478719805562165">"ເລື່ອນໄປທາງຊ້າàºà»€àºžàº·à»ˆàº­ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="8034433242579600980">"ເລື່ອນໄປທາງຂວາເພື່ອ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="user_switched" msgid="3768006783166984410">"ຜູ່ໃຊ້ປັດຈຸບັນ <xliff:g id="NAME">%1$s</xliff:g> ."</string>
+ <string name="kg_emergency_call_label" msgid="684946192523830531">"àºàº²àº™à»‚ທສຸàºà»€àºªàºµàº™"</string>
+ <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"ລືມຮູບà»àºšàºšàº›àº»àº”ລັອàº?"</string>
+ <string name="kg_wrong_pattern" msgid="1850806070801358830">"ຮູບà»àºšàºšàºœàº´àº”"</string>
+ <string name="kg_wrong_password" msgid="2333281762128113157">"ລະຫັດຜ່ານບà»à»ˆàº–ືàºàº•້ອງ"</string>
+ <string name="kg_wrong_pin" msgid="1131306510833563801">"ລະຫັດ PIN ຜິດ"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"ລອງໃà»à»ˆà»ƒàº™àº­àºµàº <xliff:g id="NUMBER">%d</xliff:g> ວິນາທີ."</string>
+ <string name="kg_pattern_instructions" msgid="398978611683075868">"à»àº•້ມຮູບà»àºšàºšàº›àº»àº”ລັອàºàº‚ອງທ່ານ"</string>
+ <string name="kg_sim_pin_instructions" msgid="2319508550934557331">"ໃສ່ລະຫັດ PIN ຂອງຊິມ"</string>
+ <string name="kg_pin_instructions" msgid="2377242233495111557">"ໃສ່ລະຫັດ PIN"</string>
+ <string name="kg_password_instructions" msgid="5753646556186936819">"ໃສ່ລະຫັດຜ່ານ"</string>
+ <string name="kg_puk_enter_puk_hint" msgid="453227143861735537">"ຊິມຖືàºàº›àº´àº”àºàº²àº™àº™àº³à»ƒàºŠà»‰à»àº¥à»‰àº§. ປ້ອນລະຫັດ PUK ເພື່ອດຳເນີນàºàº²àº™àº•à»à»ˆ. ຕິດຕà»à»ˆàºœàº¹à»ˆà»ƒàº«à»‰àºšà»àº¥àº´àºàº²àº™àºªàº³àº¥àº±àºšàº¥àº²àºàº¥àº°àº­àº½àº”."</string>
+ <string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"ໃສ່ລະຫັດ PIN ທີ່ຕ້ອງàºàº²àº™."</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"ຢືນຢັນລະຫັດ PIN ທີ່ຕ້ອງàºàº²àº™"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"ປົດລັອຠSIM card..."</string>
+ <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"ລະຫັດ PIN ບà»à»ˆàº–ືàºàº•້ອງ."</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"ພິມລະຫັດ PIN ຄວາມàºàº²àº§ 4 ເຖິງ 8 ໂຕເລàº."</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"ລະຫັດ PUK ຄວນມີຢ່າງໜ້ອຠ8 ໂຕເລàº."</string>
+ <string name="kg_invalid_puk" msgid="3638289409676051243">"ປ້ອນລະຫັດ PUK ທີ່ຖືàºàº•້ອງຄືນໃà»à»ˆ. àºàº²àº™àºžàº°àºàº²àºàº²àº¡à»ƒàºªà»ˆàº«àº¼àº²àºà»€àº—ື່ອຈະເຮັດໃຫ້ຊິມàºàº²àº”ໃຊ້ບà»à»ˆà»„ດ້ຖາວອນ."</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"ລະຫັດ PIN ບà»à»ˆàºàº»àº‡àºàº±àº™"</string>
+ <string name="kg_login_too_many_attempts" msgid="6486842094005698475">"à»àº•້ມຮູບà»àºšàºšàº›àº»àº”ລັອàºàº«àº¼àº²àºà»€àºàºµàº™à»„ປ"</string>
+ <string name="kg_login_instructions" msgid="1100551261265506448">"ເພື່ອປົດລັອàº, ເຂົ້າສູ່ລະບົບດ້ວàºàºšàº±àº™àºŠàºµ Google ຂອງທ່ານ."</string>
+ <string name="kg_login_username_hint" msgid="5718534272070920364">"ຊື່ຜູ່ໃຊ້ (ອີເມວ)"</string>
+ <string name="kg_login_password_hint" msgid="9057289103827298549">"ລະຫັດຜ່ານ"</string>
+ <string name="kg_login_submit_button" msgid="5355904582674054702">"ເຂົ້າສູ່ລະບົບ"</string>
+ <string name="kg_login_invalid_input" msgid="5754664119319872197">"ຊື່ຜູ່ໃຊ້ ຫຼືລະຫັດຜ່ານບà»à»ˆàº–ືàºàº•້ອງ."</string>
+ <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"ລືມຊື່ຜູ່ໃຊ້ ຫຼືລະຫັດຜ່ານຂອງທ່ານບà»à»ˆ?\nໄປທີ່ "<b>"google.com/accounts/recovery"</b>"."</string>
+ <string name="kg_login_checking_password" msgid="1052685197710252395">"àºàº³àº¥àº±àº‡àºàº§àº”ສອບບັນຊີ..."</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"ທ່ານພິມລະຫັດ PIN​ ຂອງທ່ານຜິດ <xliff:g id="NUMBER_0">%d</xliff:g> ເທື່ອà»àº¥à»‰àº§. \n\nàºàº°àº¥àº¸àº™àº²àº¥àº­àº‡à»ƒà»à»ˆà»ƒàº™àº­àºµàº <xliff:g id="NUMBER_1">%d</xliff:g> ວິນາທີ."</string>
+ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"ທ່ານພິມລະຫັດຜິດ <xliff:g id="NUMBER_0">%d</xliff:g> ເທື່ອà»àº¥à»‰àº§. \n\nລອງໃà»à»ˆà»ƒàº™àº­àºµàº <xliff:g id="NUMBER_1">%d</xliff:g> ວິນາທີ."</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"ທ່ານà»àº•້ມຮູບà»àºšàºšàº›àº»àº”ລັອàºàº‚ອງທ່ານຜິດ <xliff:g id="NUMBER_0">%d</xliff:g> ເທື່ອà»àº¥à»‰àº§. \n\nàºàº°àº¥àº¸àº™àº²àº¥àº­àº‡à»ƒà»à»ˆà»ƒàº™àº­àºµàº <xliff:g id="NUMBER_1">%d</xliff:g> ວິນາທີ."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1575557200627128949">"ທ່ານໄດ້ພະàºàº²àºàº²àº¡àº›àº»àº”ລັອàºà»àº—ັບເລັດບà»à»ˆàºªàº³à»€àº¥àº±àº” <xliff:g id="NUMBER_0">%d</xliff:g> ເທື່ອà»àº¥à»‰àº§. ຫຼັງຈາàºàº„ວາມພະàºàº²àºàº²àº¡àº­àºµàº <xliff:g id="NUMBER_1">%d</xliff:g> ເທື່ອ à»àº—ັບເລັດຂອງທ່ານຈະຖືàºàº•ັ້ງ ໃຫ້àºàº±àºšà»„ປໃຊ້ຄ່າເລີ່ມຕົ້ນຈາàºà»‚ຮງງານຄືນໃà»à»ˆ à»àº¥àº°àº‚à»à»‰àº¡àº¹àº™àºœàº¹à»ˆà»ƒàºŠà»‰àº—ັງà»àº»àº”ຈະສູນຫາàºà»„ປ."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="4051015943038199910">"ທ່ານໄດ້ພະàºàº²àºàº²àº¡àº›àº»àº”ລັອàºà»‚ທລະສັບບà»à»ˆàºªàº³à»€àº¥àº±àº” <xliff:g id="NUMBER_0">%d</xliff:g> ເທື່ອà»àº¥à»‰àº§. ຫຼັງຈາàºàº„ວາມພະàºàº²àºàº²àº¡àº­àºµàº <xliff:g id="NUMBER_1">%d</xliff:g> ເທື່ອ ໂທລະສັບຂອງທ່ານຈະຖືàºàº•ັ້ງ ໃຫ້àºàº±àºšà»„ປໃຊ້ຄ່າເລີ່ມຕົ້ນຈາàºà»‚ຮງງານຄືນໃà»à»ˆ à»àº¥àº°àº‚à»à»‰àº¡àº¹àº™àºœàº¹à»ˆà»ƒàºŠà»‰àº—ັງà»àº»àº”ຈະສູນຫາàºà»„ປ."</string>
+ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="2072996269148483637">"ທ່ານໄດ້ພະàºàº²àºàº²àº¡àº›àº»àº”ລັອàºà»àº—ັບເລັດບà»à»ˆàºªàº³à»€àº¥àº±àº” <xliff:g id="NUMBER">%d</xliff:g> ເທື່ອà»àº¥à»‰àº§. ຕອນນີ້à»àº—ັບເລັດຈະຖືàºàº•ັ້ງໃຫ້àºàº±àºšà»„ປໃຊ້ຄ່າເລີ່ມຕົ້ນຈາàºà»‚ຮງງານ."</string>
+ <string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"ທ່ານໄດ້ພະàºàº²àºàº²àº¡àº›àº»àº”ລັອàºà»‚ທລະສັບບà»à»ˆàº–ືຠ<xliff:g id="NUMBER">%d</xliff:g> ເທື່ອà»àº¥à»‰àº§. ຕອນນີ້ໂທລະສັບຈະຖືàºàº£àºµà»€àºŠàº±àº”ເປັນຄ່າຈາàºà»‚ຮງງານ."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"ທ່ານà»àº•້ມຮູບà»àºšàºšàº›àº»àº”ລັອàºàºœàº´àº” <xliff:g id="NUMBER_0">%d</xliff:g> ເທື່ອà»àº¥à»‰àº§. ຫຼັງຈາàºà»àº•້ມຜິດອີຠ<xliff:g id="NUMBER_1">%d</xliff:g> ເທື່ອ, ທ່ານຈະຖືàºàº–າມໃຫ້ປົດລັອàºà»àº—ັບເລັດຂອງທ່ານ ດ້ວàºàºàº²àº™à»€àº‚ົ້າສູ່ລະບົບໂດàºà»ƒàºŠà»‰àº­àºµà»€àº¡àº§àº‚ອງທ່ານ.\n\n àºàº°àº¥àº¸àº™àº²àº¥àº­àº‡à»ƒà»à»ˆàº­àºµàºàº„ັ້ງໃນອີຠ<xliff:g id="NUMBER_2">%d</xliff:g> ວິນາທີ."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"ທ່ານà»àº•້ມຮູບà»àºšàºšàº›àº»àº”ລັອàºàº‚ອງທ່ານຜິດ <xliff:g id="NUMBER_0">%d</xliff:g> ເທື່ອà»àº¥à»‰àº§. ຫຼັງຈາàºàº„ວາມພະàºàº²àºàº²àº¡àº­àºµàº <xliff:g id="NUMBER_1">%d</xliff:g> ເທື່ອ ທ່ານຈະຖືàºàº–າມໃຫ້ປົດລັອàºà»‚ທລະສັບຂອງທ່ານດ້ວàºàºšàº±àº™àºŠàºµàº­àºµà»€àº¡àº§.\n\n ລອງໃà»à»ˆàº­àºµàºàº„ັ້ງໃນ <xliff:g id="NUMBER_2">%d</xliff:g> ວິນາທີ."</string>
+ <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
+ <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"ລຶບອອàº"</string>
+ <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"ປຸ່ມເພງàºà»ˆàº­àº™à»œà»‰àº²"</string>
+ <string name="keyguard_transport_next_description" msgid="4299258300283778305">"ປຸ່ມເພງຕà»à»ˆà»„ປ"</string>
+ <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"ປຸ່ມຢຸດຊົ່ວຄາວ"</string>
+ <string name="keyguard_transport_play_description" msgid="2924628863741150956">"ປຸ່ມຫຼິ້ນ"</string>
+ <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"ປຸ່ມຢຸດ"</string>
+ <string name="keyguard_carrier_default" msgid="8700650403054042153">"ບà»à»ˆàº¡àºµàºšà»àº¥àº´àºàº²àº™"</string>
+</resources>
diff --git a/packages/Keyguard/res/values-lt/strings.xml b/packages/Keyguard/res/values-lt/strings.xml
index 29f62a7..ff3034a 100644
--- a/packages/Keyguard/res/values-lt/strings.xml
+++ b/packages/Keyguard/res/values-lt/strings.xml
@@ -21,9 +21,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"Įveskite PIN kodą"</string>
- <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"Įveskite PUK ir naują PIN kodus"</string>
- <string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"PUK kodas"</string>
- <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"Naujas PIN kodas"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="3035856550289724338">"Įveskite SIM kortelės PUK kodą ir naują PIN kodą"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="1801941051094974609">"SIM kortelÄ—s PUK kodas"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="3201151840570492538">"Naujas SIM kortelÄ—s PIN kodas"</string>
<string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"Palieskite, kad įves. slaptaž."</font></string>
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Jei norite atrakinti, įveskite slaptažodį"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Jei norite atrakinti, įveskite PIN kodą"</string>
@@ -71,6 +71,13 @@
<string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Pristabdymo mygtukas"</string>
<string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Paleidimo mygtukas"</string>
<string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Sustabdymo mygtukas"</string>
+ <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Patinka"</string>
+ <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Nepatinka"</string>
+ <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Å irdis"</string>
+ <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Jei norite tęsti, atrakinkite"</string>
+ <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Paleidimas atšauktas"</string>
+ <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Paleiskite „<xliff:g id="WIDGET_INDEX">%1$s</xliff:g>“, kad jį ištrintumėte."</string>
+ <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"„<xliff:g id="WIDGET_INDEX">%1$s</xliff:g>“ nebus ištrintas."</string>
<string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
<string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
<string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
@@ -105,7 +112,6 @@
<string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"Įveskite pageidaujamą PIN kodą"</string>
<string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"Patvirtinkite pageidaujamÄ… PIN kodÄ…"</string>
<string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"Atrakinama SIM kortelė…"</string>
- <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"Netinkamas PIN kodas."</string>
<string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"Ä®veskite PIN kodÄ…, sudarytÄ… iÅ¡ 4–8 skaiÄių."</string>
<string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"PUK kodas turėtų būti mažiausiai 8 skaitmenų."</string>
<string name="kg_invalid_puk" msgid="3638289409676051243">"Pakartotinai įveskite tinkamą PUK kodą. Pakartotinai bandant SIM bus neleidžiama visam laikui."</string>
@@ -129,6 +135,19 @@
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Netinkamai nupiešėte atrakinimo piešinį <xliff:g id="NUMBER_0">%d</xliff:g> k. Po dar <xliff:g id="NUMBER_1">%d</xliff:g> nesėkm. band. būsite paprašyti atrakinti telefoną naudodami „Google“ prisijungimo duomenis.\n\n Bandykite dar kartą po <xliff:g id="NUMBER_2">%d</xliff:g> sek."</string>
<string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" – "</string>
<string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Pašalinti"</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"Netinkamas SIM kortelės PIN kodas. Reikės susisiekti su operatoriumi, kad atrakintų įrenginį."</string>
+ <plurals name="kg_password_wrong_pin_code">
+ <item quantity="one" msgid="8134313997799638254">"Netinkamas SIM kortelės PIN kodas. Jums liko <xliff:g id="NUMBER">%d</xliff:g> band. Paskui reikės susisiekti su operatoriumi, kad jis atrakintų įrenginį."</item>
+ <item quantity="other" msgid="2215723361575359486">"Netinkamas SIM kortelÄ—s PIN kodas, liko <xliff:g id="NUMBER">%d</xliff:g> band."</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="7077536808291316208">"Nebegalima naudoti SIM kortelÄ—s. Susisiekite su operatoriumi."</string>
+ <plurals name="kg_password_wrong_puk_code">
+ <item quantity="one" msgid="3256893607561060649">"Netinkamas SIM kortelės PUK kodas. Liko <xliff:g id="NUMBER">%d</xliff:g> band. Paskui visiškai nebegalėsite naudoti SIM kortelės."</item>
+ <item quantity="other" msgid="5477305226026342036">"Netinkamas SIM kortelės PUK kodas. Liko <xliff:g id="NUMBER">%d</xliff:g> band. Paskui visiškai nebegalėsite naudoti SIM kortelės."</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="6268288093558031564">"Nepavyko atlikti SIM kortelÄ—s PIN kodo operacijos."</string>
+ <string name="kg_password_puk_failed" msgid="2838824369502455984">"Nepavyko atlikti SIM kortelÄ—s PUK kodo operacijos."</string>
+ <string name="kg_pin_accepted" msgid="1448241673570020097">"Kodas priimtas."</string>
<string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Ankstesnio takelio mygtukas"</string>
<string name="keyguard_transport_next_description" msgid="4299258300283778305">"Kito takelio mygtukas"</string>
<string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Pristabdymo mygtukas"</string>
diff --git a/packages/Keyguard/res/values-lv/strings.xml b/packages/Keyguard/res/values-lv/strings.xml
index aa13934..539f91d 100644
--- a/packages/Keyguard/res/values-lv/strings.xml
+++ b/packages/Keyguard/res/values-lv/strings.xml
@@ -21,9 +21,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"Ievadiet PIN kodu."</string>
- <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"Ievadiet PUK kodu un jaunu PIN kodu."</string>
- <string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"PUK kods"</string>
- <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"Jauns PIN kods"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="3035856550289724338">"Ievadiet SIM kartes PUK kodu un jaunu PIN kodu."</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="1801941051094974609">"SIM kartes PUK kods"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="3201151840570492538">"Jauns SIM kartes PIN kods"</string>
<string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"Pieskarieties, lai ievadītu paroli"</font>"."</string>
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Ievadiet paroli, lai atbloķētu."</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Lai atbloķētu, ievadiet PIN."</string>
@@ -71,6 +71,13 @@
<string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"PÄrtraukÅ¡anas poga"</string>
<string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Atskaņošanas poga"</string>
<string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Apturēšanas poga"</string>
+ <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Patīk"</string>
+ <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Nepatīk"</string>
+ <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Sirds"</string>
+ <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"AtbloÄ·Ä“jiet, lai turpinÄtu."</string>
+ <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Palaišana atcelta"</string>
+ <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Velciet logrīku <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>, lai to izdzēstu."</string>
+ <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"Logrīks <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> netiks izdzēsts."</string>
<string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
<string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
<string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
@@ -105,7 +112,6 @@
<string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"Ievadiet vēlamo PIN kodu."</string>
<string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"Apstipriniet vēlamo PIN."</string>
<string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"Notiek SIM kartes atbloķēšana..."</string>
- <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"PIN kods nav pareizs."</string>
<string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"Ievadiet PIN, kas sastÄv no 4 lÄ«dz 8 cipariem."</string>
<string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"PUK kodam ir jÄbÅ«t vismaz 8 ciparus garam."</string>
<string name="kg_invalid_puk" msgid="3638289409676051243">"AtkÄrtoti ievadiet pareizo PUK kodu. Ja vairÄkas reizes ievadÄ«siet to nepareizi, SIM karte tiks neatgriezeniski atspÄ“jota."</string>
@@ -129,6 +135,19 @@
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"JÅ«s nepareizi norÄdÄ«jÄt atbloķēšanas kombinÄciju <xliff:g id="NUMBER_0">%d</xliff:g> reizes. PÄ“c vÄ“l <xliff:g id="NUMBER_1">%d</xliff:g> neveiksmÄ«giem mēģinÄjumiem tÄlrunis bÅ«s jÄatbloÄ·Ä“, izmantojot e-pasta kontu.\n\nMēģiniet vÄ“lreiz pÄ“c <xliff:g id="NUMBER_2">%d</xliff:g> sekundÄ“m."</string>
<string name="kg_text_message_separator" product="default" msgid="4160700433287233771">"  — "</string>
<string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Noņemt"</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"Nepareizs SIM kartes PIN kods. Lai atbloķētu ierīci, sazinieties ar mobilo sakaru operatoru."</string>
+ <plurals name="kg_password_wrong_pin_code">
+ <item quantity="one" msgid="8134313997799638254">"Nepareizs SIM kartes PIN kods. Varat mēģinÄt vÄ“l <xliff:g id="NUMBER">%d</xliff:g> reizi. Kļūdas gadÄ«jumÄ bÅ«s jÄsazinÄs ar mobilo sakaru operatoru, lai tas atbloÄ·Ä“tu jÅ«su ierÄ«ci."</item>
+ <item quantity="other" msgid="2215723361575359486">"Nepareizs SIM kartes PIN kods. Varat mēģinÄt vÄ“l <xliff:g id="NUMBER">%d</xliff:g> reizi(-es)."</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="7077536808291316208">"SIM karte nav izmantojama. Sazinieties ar mobilo sakaru operatoru."</string>
+ <plurals name="kg_password_wrong_puk_code">
+ <item quantity="one" msgid="3256893607561060649">"Nepareizs SIM kartes PUK kods. Varat mēģinÄt vÄ“l <xliff:g id="NUMBER">%d</xliff:g> reizi. Kļūdas gadÄ«jumÄ SIM karte kļūs neizmantojama."</item>
+ <item quantity="other" msgid="5477305226026342036">"Nepareizs SIM kartes PUK kods. Varat mēģinÄt vÄ“l <xliff:g id="NUMBER">%d</xliff:g> reizi(-es). Kļūdas gadÄ«jumÄ SIM karte kļūs neizmantojama."</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="6268288093558031564">"SIM kartes PIN koda ievadīšana neizdevÄs."</string>
+ <string name="kg_password_puk_failed" msgid="2838824369502455984">"SIM kartes PUK koda ievadīšana neizdevÄs."</string>
+ <string name="kg_pin_accepted" msgid="1448241673570020097">"Kods ir pieņemts!"</string>
<string name="keyguard_transport_prev_description" msgid="8229108430245669854">"IepriekšējÄ ieraksta poga"</string>
<string name="keyguard_transport_next_description" msgid="4299258300283778305">"NÄkamÄ ieraksta poga"</string>
<string name="keyguard_transport_pause_description" msgid="5093073338238310224">"PÄrtraukÅ¡anas poga"</string>
diff --git a/packages/Keyguard/res/values-mn-rMN/strings.xml b/packages/Keyguard/res/values-mn-rMN/strings.xml
new file mode 100644
index 0000000..e1b833e
--- /dev/null
+++ b/packages/Keyguard/res/values-mn-rMN/strings.xml
@@ -0,0 +1,157 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"PIN кодыг Ð±Ð¸Ñ‡Ð½Ñ Ò¯Ò¯"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="3035856550289724338">"СИМ ПҮК-г бичÑÑд ÑˆÐ¸Ð½Ñ ÐŸÐ˜Ð ÐºÐ¾Ð´ оруулна уу"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="1801941051094974609">"СИМ ПҮК код"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="3201151840570492538">"Ð¨Ð¸Ð½Ñ Ð¡Ð˜Ðœ ПИРкод"</string>
+ <string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"Ðууц үг бичих бол Ñ…Ò¯Ñ€Ð½Ñ Ò¯Ò¯"</font></string>
+ <string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Тайлах нууц үгийг Ð±Ð¸Ñ‡Ð½Ñ Ò¯Ò¯"</string>
+ <string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Тайлах PIN-г оруулна уу"</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"Буруу PIN код."</string>
+ <string name="keyguard_label_text" msgid="861796461028298424">"Тайлах бол ЦÑÑийг дараад 0."</string>
+ <string name="faceunlock_multiple_failures" msgid="754137583022792429">"ÐүүрÑÑÑ€ түгжÑÑ Ñ‚Ð°Ð¹Ð»Ð°Ñ… оролдлогын тоо дÑÑд Ñ…ÑмжÑÑнÑÑÑ Ñ…ÑÑ‚ÑÑ€ÑÑн"</string>
+ <string name="keyguard_charged" msgid="3272223906073492454">"ЦÑнÑглÑгдÑв"</string>
+ <string name="keyguard_plugged_in" msgid="8117572000639998388">"ЦÑнÑглÑж байна, <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+ <string name="keyguard_low_battery" msgid="8143808018719173859">"ЦÑнÑглÑгчÑÑ Ñ…Ð¾Ð»Ð±Ð¾Ð½Ð¾ уу."</string>
+ <string name="keyguard_instructions_when_pattern_disabled" msgid="1332288268600329841">"Тайлх бол цÑÑийг дарна уу."</string>
+ <string name="keyguard_network_locked_message" msgid="9169717779058037168">"СүлжÑÑ Ñ‚Ò¯Ð³Ð¶Ð¸Ð³Ð´ÑÑн"</string>
+ <string name="keyguard_missing_sim_message_short" msgid="494980561304211931">"SIM карт байхгүй"</string>
+ <string name="keyguard_missing_sim_message" product="tablet" msgid="1445849005909260039">"Таблет SIM картгүй."</string>
+ <string name="keyguard_missing_sim_message" product="default" msgid="3481110395508637643">"УтÑанд SIM карт байхгүй."</string>
+ <string name="keyguard_missing_sim_instructions" msgid="5210891509995942250">"SIM картыг оруулна уу."</string>
+ <string name="keyguard_missing_sim_instructions_long" msgid="5968985489463870358">"SIM карт байхгүй ÑÑвÑл унших боломжгүй. SIM карт оруулна уу."</string>
+ <string name="keyguard_permanent_disabled_sim_message_short" msgid="8340813989586622356">"Ðшиглаж болохгүй SIM карт."</string>
+ <string name="keyguard_permanent_disabled_sim_instructions" msgid="5892940909699723544">"Таны SIM карт бүрмөÑөн идÑвхгүй болов.\n Ó¨Ó©Ñ€ SIM карт авах бол өөрийн утаÑгүй үйлчилгÑÑний нийлүүлÑгчтÑй холбогдоно уу."</string>
+ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM карт түгжигдÑÑн."</string>
+ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM картны PUK-түгжигдÑÑн."</string>
+ <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"SIM картны түгжÑÑг гаргаж байна…"</string>
+ <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. %3$d. -н %2$d виджет"</string>
+ <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Виджет нÑмÑÑ…."</string>
+ <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"ХооÑон"</string>
+ <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Тайлах Ñ…ÑÑÑг нÑÑгдÑÑн."</string>
+ <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Тайлах Ñ…ÑÑÑг хаагдÑан."</string>
+ <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> виджет."</string>
+ <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"Ð¥ÑÑ€ÑглÑгч Ñонгоч"</string>
+ <string name="keyguard_accessibility_status" msgid="8008264603935930611">"СтатуÑ"</string>
+ <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Камер"</string>
+ <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Медиа контрол"</string>
+ <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Виджет дахин ÑÑ€ÑмбÑлж ÑхлÑв."</string>
+ <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Виджетийг дахин ÑÑ€ÑмбÑлж дууÑав."</string>
+ <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> виджет уÑÑ‚Ñан."</string>
+ <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"ТүгжÑÑгүй Ñ…ÑÑгийг өргөÑгөх."</string>
+ <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Тайлах гулÑуулалт."</string>
+ <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Тайлах Ñ…ÑÑ."</string>
+ <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"ÐүүрÑÑÑ€ тайлах"</string>
+ <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Тайлах пин."</string>
+ <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Тайлах нууц үг."</string>
+ <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Ð¥ÑÑний Ñ…ÑÑÑг."</string>
+ <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"ГулÑуулах Ñ…ÑÑÑг."</string>
+ <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"Өмнөх бичлÑг товч"</string>
+ <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"Дараагийн бичлÑг товч"</string>
+ <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Түр зогÑоох товч"</string>
+ <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Тоглуулах товч"</string>
+ <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"ЗогÑоох товч"</string>
+ <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Сайн"</string>
+ <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Онцгүй"</string>
+ <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Зүрх"</string>
+ <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"ҮргÑлжлүүлÑхийн тулд түгжÑÑг тайлна уу"</string>
+ <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"ЭхлүүлÑхийг цуцалÑан"</string>
+ <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"УÑтгахын тулд <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>-г тавина уу."</string>
+ <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> уÑтахгүй."</string>
+ <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
+ <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ÐБВ"</string>
+ <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
+ <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
+ <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"Цуцлах"</string>
+ <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"УÑтгах"</string>
+ <string name="keyboardview_keycode_done" msgid="1992571118466679775">"ДууÑгах"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Горим өөрчлөх"</string>
+ <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Шифт"</string>
+ <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Оруулах"</string>
+ <string name="description_target_unlock" msgid="2228524900439801453">"Тайлах"</string>
+ <string name="description_target_camera" msgid="969071997552486814">"Камер"</string>
+ <string name="description_target_silent" msgid="893551287746522182">"ЧимÑÑгүй"</string>
+ <string name="description_target_soundon" msgid="30052466675500172">"Дуунууд идÑвхтÑй"</string>
+ <string name="description_target_search" msgid="3091587249776033139">"Хайх"</string>
+ <string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>-г гулÑуулах."</string>
+ <string name="description_direction_down" msgid="5087739728639014595">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> хийх бол доош гулÑуулах."</string>
+ <string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> хийх зүүнлүү гулÑуулах."</string>
+ <string name="description_direction_right" msgid="8034433242579600980">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> хийх бол баруунлуу гулÑуулах."</string>
+ <string name="user_switched" msgid="3768006783166984410">"Одоогийн Ñ…ÑÑ€ÑглÑгч <xliff:g id="NAME">%1$s</xliff:g>."</string>
+ <string name="kg_emergency_call_label" msgid="684946192523830531">"Яаралтай дуудлага"</string>
+ <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Ð¥ÑÑг мартÑан"</string>
+ <string name="kg_wrong_pattern" msgid="1850806070801358830">"Буруу Ñ…ÑÑ"</string>
+ <string name="kg_wrong_password" msgid="2333281762128113157">"Ðууц үг буруу"</string>
+ <string name="kg_wrong_pin" msgid="1131306510833563801">"PIN буруу"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"<xliff:g id="NUMBER">%d</xliff:g> Ñекундын дараа дахин оролдоно уу."</string>
+ <string name="kg_pattern_instructions" msgid="398978611683075868">"Ð¥ÑÑг зурах"</string>
+ <string name="kg_sim_pin_instructions" msgid="2319508550934557331">"SIM PIN оруулна уу"</string>
+ <string name="kg_pin_instructions" msgid="2377242233495111557">"PIN оруулна уу"</string>
+ <string name="kg_password_instructions" msgid="5753646556186936819">"Ðууц үгÑÑ Ð¾Ñ€ÑƒÑƒÐ»Ð½Ð° уу"</string>
+ <string name="kg_puk_enter_puk_hint" msgid="453227143861735537">"SIM идÑвхгүй байна. ҮргÑлжлүүлÑÑ… бол PUK кодыг оруулна уу. ДÑлгÑÑ€Ñнгүй мÑдÑÑллийг Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð¾Ñ Ð°Ñууна ууу"</string>
+ <string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"Ð¥Ò¯ÑÑÑн PIN кодоо оруулна уу"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"Ð¥Ò¯ÑÑÑн PIN кодоо дахин оруулна уу"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"SIM картны түгжÑÑг гаргаж байна…"</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"4-8 Ñ‚Ð¾Ð¾Ð½Ð¾Ð¾Ñ Ð±Ò¯Ñ‚ÑÑ… PIN-г Ð±Ð¸Ñ‡Ð½Ñ Ò¯Ò¯."</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"PUK код 8-Ñ Ñ†Ó©Ó©Ð½Ð³Ò¯Ð¹ Ñ‚Ð¾Ð¾Ð½Ð¾Ð¾Ñ Ð±Ò¯Ñ‚Ð½Ñ."</string>
+ <string name="kg_invalid_puk" msgid="3638289409676051243">"Зөв PUK кодыг дахин оруулна уу. Давтан оролдвол SIM нь бүрмөÑөн идÑвхгүй болгоно."</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"PIN кодууд таарахгүй байна"</string>
+ <string name="kg_login_too_many_attempts" msgid="6486842094005698475">"Ð¥ÑÑ Ð¾Ñ€ÑƒÑƒÐ»Ð°Ñ… оролдлого Ñ…ÑÑ‚ олон"</string>
+ <string name="kg_login_instructions" msgid="1100551261265506448">"ТүгжÑÑг тайлах бол Google акаунтаараа нÑвтÑÑ€Ð½Ñ Ò¯Ò¯."</string>
+ <string name="kg_login_username_hint" msgid="5718534272070920364">"Ð¥ÑÑ€ÑглÑгчийн нÑÑ€ (имÑйл)"</string>
+ <string name="kg_login_password_hint" msgid="9057289103827298549">"Ðууц үг"</string>
+ <string name="kg_login_submit_button" msgid="5355904582674054702">"ÐÑвтрÑÑ…"</string>
+ <string name="kg_login_invalid_input" msgid="5754664119319872197">"Ð¥ÑÑ€ÑглÑгчийн нÑÑ€ ÑÑвÑл нууц үг буруу."</string>
+ <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"Ð¥ÑÑ€ÑглÑгчийн нÑÑ€ нууц үгÑÑ Ð¼Ð°Ñ€Ñ‚Ñан уу?\n"<b>"google.com/accounts/recovery"</b>"-д зочилно уу."</string>
+ <string name="kg_login_checking_password" msgid="1052685197710252395">"Ðкаунт шалгаж байна…"</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"Та PIN кодоо <xliff:g id="NUMBER_0">%d</xliff:g> удаа буруу бичив. \n\n<xliff:g id="NUMBER_1">%d</xliff:g> Ñекундын дараа дахин оролдоно уу."</string>
+ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"Та PIN кодоо <xliff:g id="NUMBER_0">%d</xliff:g> удаа буруу бичив. \n\n<xliff:g id="NUMBER_1">%d</xliff:g> Ñекундын дараа дахин оролдоно уу."</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"Та тайлах Ñ…ÑÑг <xliff:g id="NUMBER_0">%d</xliff:g> удаа буруу зурлаа. \n\n<xliff:g id="NUMBER_1">%d</xliff:g> Ñекундын дараа дахин оролдоно уу."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1575557200627128949">"Та таблетыг тайлах гÑж <xliff:g id="NUMBER_0">%d</xliff:g> удаа буруу оролдлоо. <xliff:g id="NUMBER_1">%d</xliff:g> удаа дахин буруу оролдвол таблет үйлдвÑрийн үндÑÑн утгаараа тохируулагдах ба Ñ…ÑÑ€ÑглÑгчийн дата бүхÑлдÑÑ ÑƒÑтана."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="4051015943038199910">"Та утÑыг тайлах гÑж <xliff:g id="NUMBER_0">%d</xliff:g> удаа буруу оролдлоо. <xliff:g id="NUMBER_1">%d</xliff:g> удаа дахин буруу оролдвол ÑƒÑ‚Ð°Ñ Ò¯Ð¹Ð»Ð´Ð²Ñрийн үндÑÑн утгаараа тохируулагдах ба Ñ…ÑÑ€ÑглÑгчийн дата бүхÑлдÑÑ ÑƒÑтана."</string>
+ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="2072996269148483637">"Та таблетыг тайлах гÑж <xliff:g id="NUMBER">%d</xliff:g> удаа буруу оролдлоо. Таблет одоо үйлдвÑрийн үндÑÑн утгаараа тохируулагдах болно."</string>
+ <string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"Та утÑыг тайлах гÑж <xliff:g id="NUMBER">%d</xliff:g> удаа буруу оролдлоо. Ð£Ñ‚Ð°Ñ Ð¾Ð´Ð¾Ð¾ үйлдвÑрийн үндÑÑн утгаараа тохируулагдах болно."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Та тайлах Ñ…ÑÑг <xliff:g id="NUMBER_0">%d</xliff:g> удаа буруу зурлаа. <xliff:g id="NUMBER_1">%d</xliff:g> удаа дахин буруу оруулбал, та таблетаа тайлахын тулд имÑйл акаунт шаардлагатай болно.\n\n <xliff:g id="NUMBER_2">%d</xliff:g> Ñекундын дараа дахин оролдоно уу."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Та тайлах Ñ…ÑÑг <xliff:g id="NUMBER_0">%d</xliff:g> удаа буруу зурлаа. <xliff:g id="NUMBER_1">%d</xliff:g> удаа дахин буруу оруулбал, та утÑаа тайлахын тулд имÑйл акаунтаа ашиглах шаардлагатай болно.\n\n <xliff:g id="NUMBER_2">%d</xliff:g> Ñекундын дараа дахин оролдоно уу."</string>
+ <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
+ <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"УÑтгах"</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"СИМ ПИРкод буруу, та төхөөрөмжийн түгжÑÑг тайлахын тулд оператор компанитай холбоо барих шаардлагатай."</string>
+ <plurals name="kg_password_wrong_pin_code">
+ <item quantity="one" msgid="8134313997799638254">"СИМ ПИРкод буруу байна, танд мобайл оператор компанитай холбогдохгүйгÑÑÑ€ төхөөрөмжийн түгжÑÑг тайлахад <xliff:g id="NUMBER">%d</xliff:g> оролдлого хийх боломж үлдÑÑн байна."</item>
+ <item quantity="other" msgid="2215723361575359486">"СИМ ПИРкод буруу байна, танд <xliff:g id="NUMBER">%d</xliff:g> оролдлого хийх боломж үлдлÑÑ."</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="7077536808291316208">"СИМ ашиглах боломжгүй. Өөрийн оператор компанитай холбоо барина уу."</string>
+ <plurals name="kg_password_wrong_puk_code">
+ <item quantity="one" msgid="3256893607561060649">"СИМ ПҮК код буруу, таны СИМ бүрмөÑөн ашиглалтгүй Ð±Ð¾Ð»Ð¾Ñ…Ð¾Ð¾Ñ Ó©Ð¼Ð½Ó© <xliff:g id="NUMBER">%d</xliff:g> оролдлого хийх боломж үлдлÑÑ."</item>
+ <item quantity="other" msgid="5477305226026342036">"СИМ ПҮК код буруу, таны СИМ бүрмөÑөн ашиглалтгүй Ð±Ð¾Ð»Ð¾Ñ…Ð¾Ð¾Ñ Ó©Ð¼Ð½Ó© <xliff:g id="NUMBER">%d</xliff:g> оролдлого хийх боломж үлдлÑÑ."</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="6268288093558031564">"СИМ ПИРажиллуулах амжилтгүй боллоо!"</string>
+ <string name="kg_password_puk_failed" msgid="2838824369502455984">"СИМ ПҮК ажиллуулах амжилтгүй боллоо!"</string>
+ <string name="kg_pin_accepted" msgid="1448241673570020097">"Код зөвшөөрөгдлөө!"</string>
+ <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Өмнөх дуу товч"</string>
+ <string name="keyguard_transport_next_description" msgid="4299258300283778305">"Дараагийн дуу товч"</string>
+ <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Түр зогÑох товч"</string>
+ <string name="keyguard_transport_play_description" msgid="2924628863741150956">"Тоглуулах товч"</string>
+ <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"ЗогÑоох товч"</string>
+ <string name="keyguard_carrier_default" msgid="8700650403054042153">"ҮйлчилгÑÑ Ð±Ð°Ð¹Ñ…Ð³Ò¯Ð¹."</string>
+</resources>
diff --git a/packages/Keyguard/res/values-mn/strings.xml b/packages/Keyguard/res/values-mn/strings.xml
new file mode 100644
index 0000000..4ae7220
--- /dev/null
+++ b/packages/Keyguard/res/values-mn/strings.xml
@@ -0,0 +1,138 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"PIN кодыг Ð±Ð¸Ñ‡Ð½Ñ Ò¯Ò¯"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"PUK-г бичÑÑд ÑˆÐ¸Ð½Ñ PIN код оруулна уу"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"PUK код"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"Ð¨Ð¸Ð½Ñ PIN код"</string>
+ <string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"Ðууц үг бичих бол Ñ…Ò¯Ñ€Ð½Ñ Ò¯Ò¯"</font></string>
+ <string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Тайлах нууц үгийг Ð±Ð¸Ñ‡Ð½Ñ Ò¯Ò¯"</string>
+ <string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Тайлах PIN-г оруулна уу"</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"Буруу PIN код."</string>
+ <string name="keyguard_label_text" msgid="861796461028298424">"Тайлах бол ЦÑÑийг дараад 0."</string>
+ <string name="faceunlock_multiple_failures" msgid="754137583022792429">"ÐүүрÑÑÑ€ түгжÑÑ Ñ‚Ð°Ð¹Ð»Ð°Ñ… оролдлогын тоо дÑÑд Ñ…ÑмжÑÑнÑÑÑ Ñ…ÑÑ‚ÑÑ€ÑÑн"</string>
+ <string name="keyguard_charged" msgid="3272223906073492454">"ЦÑнÑглÑгдÑв"</string>
+ <string name="keyguard_plugged_in" msgid="8117572000639998388">"ЦÑнÑглÑж байна, <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+ <string name="keyguard_low_battery" msgid="8143808018719173859">"ЦÑнÑглÑгчÑÑ Ñ…Ð¾Ð»Ð±Ð¾Ð½Ð¾ уу."</string>
+ <string name="keyguard_instructions_when_pattern_disabled" msgid="1332288268600329841">"Тайлх бол цÑÑийг дарна уу."</string>
+ <string name="keyguard_network_locked_message" msgid="9169717779058037168">"СүлжÑÑ Ñ‚Ò¯Ð³Ð¶Ð¸Ð³Ð´ÑÑн"</string>
+ <string name="keyguard_missing_sim_message_short" msgid="494980561304211931">"SIM карт байхгүй"</string>
+ <string name="keyguard_missing_sim_message" product="tablet" msgid="1445849005909260039">"Таблет SIM картгүй."</string>
+ <string name="keyguard_missing_sim_message" product="default" msgid="3481110395508637643">"УтÑанд SIM карт байхгүй."</string>
+ <string name="keyguard_missing_sim_instructions" msgid="5210891509995942250">"SIM картыг оруулна уу."</string>
+ <string name="keyguard_missing_sim_instructions_long" msgid="5968985489463870358">"SIM карт байхгүй ÑÑвÑл унших боломжгүй. SIM карт оруулна уу."</string>
+ <string name="keyguard_permanent_disabled_sim_message_short" msgid="8340813989586622356">"Ðшиглаж болохгүй SIM карт."</string>
+ <string name="keyguard_permanent_disabled_sim_instructions" msgid="5892940909699723544">"Таны SIM карт бүрмөÑөн идÑвхгүй болов.\n Ó¨Ó©Ñ€ SIM карт авах бол өөрийн утаÑгүй үйлчилгÑÑний нийлүүлÑгчтÑй холбогдоно уу."</string>
+ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM карт түгжигдÑÑн."</string>
+ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM картны PUK-түгжигдÑÑн."</string>
+ <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"SIM картны түгжÑÑг гаргаж байна…"</string>
+ <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. %3$d. -н %2$d виджет"</string>
+ <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Виджет нÑмÑÑ…."</string>
+ <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"ХооÑон"</string>
+ <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Тайлах Ñ…ÑÑÑг нÑÑгдÑÑн."</string>
+ <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Тайлах Ñ…ÑÑÑг хаагдÑан."</string>
+ <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> виджет."</string>
+ <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"Ð¥ÑÑ€ÑглÑгч Ñонгоч"</string>
+ <string name="keyguard_accessibility_status" msgid="8008264603935930611">"СтатуÑ"</string>
+ <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Камер"</string>
+ <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Медиа контрол"</string>
+ <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Виджет дахин ÑÑ€ÑмбÑлж ÑхлÑв."</string>
+ <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Виджетийг дахин ÑÑ€ÑмбÑлж дууÑав."</string>
+ <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> виджет уÑÑ‚Ñан."</string>
+ <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"ТүгжÑÑгүй Ñ…ÑÑгийг өргөÑгөх."</string>
+ <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Тайлах гулÑуулалт."</string>
+ <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Тайлах Ñ…ÑÑ."</string>
+ <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"ÐүүрÑÑÑ€ тайлах"</string>
+ <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Тайлах пин."</string>
+ <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Тайлах нууц үг."</string>
+ <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Ð¥ÑÑний Ñ…ÑÑÑг."</string>
+ <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"ГулÑуулах Ñ…ÑÑÑг."</string>
+ <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"Өмнөх бичлÑг товч"</string>
+ <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"Дараагийн бичлÑг товч"</string>
+ <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Түр зогÑоох товч"</string>
+ <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Тоглуулах товч"</string>
+ <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"ЗогÑоох товч"</string>
+ <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
+ <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ÐБВ"</string>
+ <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
+ <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
+ <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"Цуцлах"</string>
+ <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"УÑтгах"</string>
+ <string name="keyboardview_keycode_done" msgid="1992571118466679775">"ДууÑгах"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Горим өөрчлөх"</string>
+ <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Шифт"</string>
+ <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Оруулах"</string>
+ <string name="description_target_unlock" msgid="2228524900439801453">"Тайлах"</string>
+ <string name="description_target_camera" msgid="969071997552486814">"Камер"</string>
+ <string name="description_target_silent" msgid="893551287746522182">"ЧимÑÑгүй"</string>
+ <string name="description_target_soundon" msgid="30052466675500172">"Дуунууд идÑвхтÑй"</string>
+ <string name="description_target_search" msgid="3091587249776033139">"Хайх"</string>
+ <string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>-г гулÑуулах."</string>
+ <string name="description_direction_down" msgid="5087739728639014595">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> хийх бол доош гулÑуулах."</string>
+ <string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> хийх зүүнлүү гулÑуулах."</string>
+ <string name="description_direction_right" msgid="8034433242579600980">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> хийх бол баруунлуу гулÑуулах."</string>
+ <string name="user_switched" msgid="3768006783166984410">"Одоогийн Ñ…ÑÑ€ÑглÑгч <xliff:g id="NAME">%1$s</xliff:g>."</string>
+ <string name="kg_emergency_call_label" msgid="684946192523830531">"Яаралтай дуудлага"</string>
+ <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Ð¥ÑÑг мартÑан"</string>
+ <string name="kg_wrong_pattern" msgid="1850806070801358830">"Буруу Ñ…ÑÑ"</string>
+ <string name="kg_wrong_password" msgid="2333281762128113157">"Ðууц үг буруу"</string>
+ <string name="kg_wrong_pin" msgid="1131306510833563801">"PIN буруу"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"<xliff:g id="NUMBER">%d</xliff:g> Ñекундын дараа дахин оролдоно уу."</string>
+ <string name="kg_pattern_instructions" msgid="398978611683075868">"Ð¥ÑÑг зурах"</string>
+ <string name="kg_sim_pin_instructions" msgid="2319508550934557331">"SIM PIN оруулна уу"</string>
+ <string name="kg_pin_instructions" msgid="2377242233495111557">"PIN оруулна уу"</string>
+ <string name="kg_password_instructions" msgid="5753646556186936819">"Ðууц үгÑÑ Ð¾Ñ€ÑƒÑƒÐ»Ð½Ð° уу"</string>
+ <string name="kg_puk_enter_puk_hint" msgid="453227143861735537">"SIM идÑвхгүй байна. ҮргÑлжлүүлÑÑ… бол PUK кодыг оруулна уу. ДÑлгÑÑ€Ñнгүй мÑдÑÑллийг Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð¾Ñ Ð°Ñууна ууу"</string>
+ <string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"Ð¥Ò¯ÑÑÑн PIN кодоо оруулна уу"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"Ð¥Ò¯ÑÑÑн PIN кодоо дахин оруулна уу"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"SIM картны түгжÑÑг гаргаж байна…"</string>
+ <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"Буруу PIN код."</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"4-8 Ñ‚Ð¾Ð¾Ð½Ð¾Ð¾Ñ Ð±Ò¯Ñ‚ÑÑ… PIN-г Ð±Ð¸Ñ‡Ð½Ñ Ò¯Ò¯."</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"PUK код 8-Ñ Ñ†Ó©Ó©Ð½Ð³Ò¯Ð¹ Ñ‚Ð¾Ð¾Ð½Ð¾Ð¾Ñ Ð±Ò¯Ñ‚Ð½Ñ."</string>
+ <string name="kg_invalid_puk" msgid="3638289409676051243">"Зөв PUK кодыг дахин оруулна уу. Давтан оролдвол SIM нь бүрмөÑөн идÑвхгүй болгоно."</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"PIN кодууд таарахгүй байна"</string>
+ <string name="kg_login_too_many_attempts" msgid="6486842094005698475">"Ð¥ÑÑ Ð¾Ñ€ÑƒÑƒÐ»Ð°Ñ… оролдлого Ñ…ÑÑ‚ олон"</string>
+ <string name="kg_login_instructions" msgid="1100551261265506448">"ТүгжÑÑг тайлах бол Google акаунтаараа нÑвтÑÑ€Ð½Ñ Ò¯Ò¯."</string>
+ <string name="kg_login_username_hint" msgid="5718534272070920364">"Ð¥ÑÑ€ÑглÑгчийн нÑÑ€ (имÑйл)"</string>
+ <string name="kg_login_password_hint" msgid="9057289103827298549">"Ðууц үг"</string>
+ <string name="kg_login_submit_button" msgid="5355904582674054702">"ÐÑвтрÑÑ…"</string>
+ <string name="kg_login_invalid_input" msgid="5754664119319872197">"Ð¥ÑÑ€ÑглÑгчийн нÑÑ€ ÑÑвÑл нууц үг буруу."</string>
+ <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"Ð¥ÑÑ€ÑглÑгчийн нÑÑ€ нууц үгÑÑ Ð¼Ð°Ñ€Ñ‚Ñан уу?\n"<b>"google.com/accounts/recovery"</b>"-д зочилно уу."</string>
+ <string name="kg_login_checking_password" msgid="1052685197710252395">"Ðкаунт шалгаж байна…"</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"Та PIN кодоо <xliff:g id="NUMBER_0">%d</xliff:g> удаа буруу бичив. \n\n<xliff:g id="NUMBER_1">%d</xliff:g> Ñекундын дараа дахин оролдоно уу."</string>
+ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"Та PIN кодоо <xliff:g id="NUMBER_0">%d</xliff:g> удаа буруу бичив. \n\n<xliff:g id="NUMBER_1">%d</xliff:g> Ñекундын дараа дахин оролдоно уу."</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"Та тайлах Ñ…ÑÑг <xliff:g id="NUMBER_0">%d</xliff:g> удаа буруу зурлаа. \n\n<xliff:g id="NUMBER_1">%d</xliff:g> Ñекундын дараа дахин оролдоно уу."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1575557200627128949">"Та таблетыг тайлах гÑж <xliff:g id="NUMBER_0">%d</xliff:g> удаа буруу оролдлоо. <xliff:g id="NUMBER_1">%d</xliff:g> удаа дахин буруу оролдвол таблет үйлдвÑрийн үндÑÑн утгаараа тохируулагдах ба Ñ…ÑÑ€ÑглÑгчийн дата бүхÑлдÑÑ ÑƒÑтана."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="4051015943038199910">"Та утÑыг тайлах гÑж <xliff:g id="NUMBER_0">%d</xliff:g> удаа буруу оролдлоо. <xliff:g id="NUMBER_1">%d</xliff:g> удаа дахин буруу оролдвол ÑƒÑ‚Ð°Ñ Ò¯Ð¹Ð»Ð´Ð²Ñрийн үндÑÑн утгаараа тохируулагдах ба Ñ…ÑÑ€ÑглÑгчийн дата бүхÑлдÑÑ ÑƒÑтана."</string>
+ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="2072996269148483637">"Та таблетыг тайлах гÑж <xliff:g id="NUMBER">%d</xliff:g> удаа буруу оролдлоо. Таблет одоо үйлдвÑрийн үндÑÑн утгаараа тохируулагдах болно."</string>
+ <string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"Та утÑыг тайлах гÑж <xliff:g id="NUMBER">%d</xliff:g> удаа буруу оролдлоо. Ð£Ñ‚Ð°Ñ Ð¾Ð´Ð¾Ð¾ үйлдвÑрийн үндÑÑн утгаараа тохируулагдах болно."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Та тайлах Ñ…ÑÑг <xliff:g id="NUMBER_0">%d</xliff:g> удаа буруу зурлаа. <xliff:g id="NUMBER_1">%d</xliff:g> удаа дахин буруу оруулбал, та таблетаа тайлахын тулд имÑйл акаунт шаардлагатай болно.\n\n <xliff:g id="NUMBER_2">%d</xliff:g> Ñекундын дараа дахин оролдоно уу."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Та тайлах Ñ…ÑÑг <xliff:g id="NUMBER_0">%d</xliff:g> удаа буруу зурлаа. <xliff:g id="NUMBER_1">%d</xliff:g> удаа дахин буруу оруулбал, та утÑаа тайлахын тулд имÑйл акаунтаа ашиглах шаардлагатай болно.\n\n <xliff:g id="NUMBER_2">%d</xliff:g> Ñекундын дараа дахин оролдоно уу."</string>
+ <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
+ <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"УÑтгах"</string>
+ <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Өмнөх дуу товч"</string>
+ <string name="keyguard_transport_next_description" msgid="4299258300283778305">"Дараагийн дуу товч"</string>
+ <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Түр зогÑох товч"</string>
+ <string name="keyguard_transport_play_description" msgid="2924628863741150956">"Тоглуулах товч"</string>
+ <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"ЗогÑоох товч"</string>
+ <string name="keyguard_carrier_default" msgid="8700650403054042153">"ҮйлчилгÑÑ Ð±Ð°Ð¹Ñ…Ð³Ò¯Ð¹."</string>
+</resources>
diff --git a/packages/Keyguard/res/values-ms-rMY/strings.xml b/packages/Keyguard/res/values-ms-rMY/strings.xml
new file mode 100644
index 0000000..a6845bc
--- /dev/null
+++ b/packages/Keyguard/res/values-ms-rMY/strings.xml
@@ -0,0 +1,157 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"Taip kod PIN"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="3035856550289724338">"Taip PUK SIM dan kod PIN baharu"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="1801941051094974609">"Kod PUK SIM"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="3201151840570492538">"Kod PIN SIM baharu"</string>
+ <string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"Sentuh untuk menaip kata laluan"</font></string>
+ <string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Taip kata laluan untuk membuka kunci"</string>
+ <string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Taip PIN untuk membuka kunci"</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"Kod PIN salah."</string>
+ <string name="keyguard_label_text" msgid="861796461028298424">"Untuk membuka kunci, tekan Menu, kemudian 0."</string>
+ <string name="faceunlock_multiple_failures" msgid="754137583022792429">"Telah melepasi had cubaan Buka Kunci Wajah"</string>
+ <string name="keyguard_charged" msgid="3272223906073492454">"Sudah dicas"</string>
+ <string name="keyguard_plugged_in" msgid="8117572000639998388">"Mengecas, <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+ <string name="keyguard_low_battery" msgid="8143808018719173859">"Sambungkan pengecas anda."</string>
+ <string name="keyguard_instructions_when_pattern_disabled" msgid="1332288268600329841">"Tekan Menu untuk membuka kunci."</string>
+ <string name="keyguard_network_locked_message" msgid="9169717779058037168">"Rangkaian dikunci"</string>
+ <string name="keyguard_missing_sim_message_short" msgid="494980561304211931">"Tiada kad SIM"</string>
+ <string name="keyguard_missing_sim_message" product="tablet" msgid="1445849005909260039">"Tiada kad SIM dalam tablet."</string>
+ <string name="keyguard_missing_sim_message" product="default" msgid="3481110395508637643">"Tiada kad SIM dalam telefon."</string>
+ <string name="keyguard_missing_sim_instructions" msgid="5210891509995942250">"Masukkan kad SIM."</string>
+ <string name="keyguard_missing_sim_instructions_long" msgid="5968985489463870358">"Kad SIM tiada atau tidak boleh dibaca. Sila masukkan kad SIM."</string>
+ <string name="keyguard_permanent_disabled_sim_message_short" msgid="8340813989586622356">"Kad SIM tidak boleh digunakan."</string>
+ <string name="keyguard_permanent_disabled_sim_instructions" msgid="5892940909699723544">"Kad SIM anda telah dilumpuhkan secara kekal.\n Hubungi pembekal perkhidmatan wayarles anda untuk mendapatkan kad SIM lain."</string>
+ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"Kad SIM dikunci."</string>
+ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"Kad SIM dikunci dengan PUK."</string>
+ <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Membuka kunci kad SIM..."</string>
+ <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d dari %3$d."</string>
+ <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Tambah widget."</string>
+ <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Kosong"</string>
+ <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Bahagian buka kunci dikembangkan."</string>
+ <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Bahagian buka kunci diruntuhkan."</string>
+ <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"Widget <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>."</string>
+ <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"Pemilih pengguna"</string>
+ <string name="keyguard_accessibility_status" msgid="8008264603935930611">"Status"</string>
+ <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Kamera"</string>
+ <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Kawalan media"</string>
+ <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Penyusunan semula widget dimulakan."</string>
+ <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Penyusunan semula widget tamat."</string>
+ <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Widget <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> dipadamkan."</string>
+ <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Kembangkan bahagian buka kunci."</string>
+ <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Buka kunci luncur."</string>
+ <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Buka kunci corak."</string>
+ <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Wajah Buka Kunci"</string>
+ <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Buka kunci pin."</string>
+ <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Buka kunci kata laluan."</string>
+ <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Kawasan corak."</string>
+ <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Kawasan luncur."</string>
+ <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"Butang lagu sebelumnya"</string>
+ <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"Butang lagu seterusnya"</string>
+ <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Butang jeda"</string>
+ <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Butang main"</string>
+ <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Butang berhenti"</string>
+ <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Menyukai"</string>
+ <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Tidak diterima"</string>
+ <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Jantung"</string>
+ <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Buka kunci untuk meneruskan"</string>
+ <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Pelancaran dibatalkan"</string>
+ <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Jatuhkan <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> untuk memadam."</string>
+ <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> tidak akan dipadamkan."</string>
+ <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
+ <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
+ <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
+ <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
+ <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"Batal"</string>
+ <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Padam"</string>
+ <string name="keyboardview_keycode_done" msgid="1992571118466679775">"Selesai"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Perubahan mod"</string>
+ <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
+ <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Masuk"</string>
+ <string name="description_target_unlock" msgid="2228524900439801453">"Buka kunci"</string>
+ <string name="description_target_camera" msgid="969071997552486814">"Kamera"</string>
+ <string name="description_target_silent" msgid="893551287746522182">"Senyap"</string>
+ <string name="description_target_soundon" msgid="30052466675500172">"Bunyi dihidupkan"</string>
+ <string name="description_target_search" msgid="3091587249776033139">"Carian"</string>
+ <string name="description_direction_up" msgid="7169032478259485180">"Luncurkan ke atas untuk <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="5087739728639014595">"Luncurkan ke bawah untuk <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="7207478719805562165">"Luncurkan ke kiri untuk <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="8034433242579600980">"Luncurkan ke kanan untuk <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="user_switched" msgid="3768006783166984410">"Pengguna semasa <xliff:g id="NAME">%1$s</xliff:g>."</string>
+ <string name="kg_emergency_call_label" msgid="684946192523830531">"Panggilan kecemasan"</string>
+ <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Lupa Corak"</string>
+ <string name="kg_wrong_pattern" msgid="1850806070801358830">"Corak Salah"</string>
+ <string name="kg_wrong_password" msgid="2333281762128113157">"Kata Laluan Salah"</string>
+ <string name="kg_wrong_pin" msgid="1131306510833563801">"PIN salah"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"Cuba lagi dalam <xliff:g id="NUMBER">%d</xliff:g> saat."</string>
+ <string name="kg_pattern_instructions" msgid="398978611683075868">"Lukiskan corak anda"</string>
+ <string name="kg_sim_pin_instructions" msgid="2319508550934557331">"Masukkan PIN SIM"</string>
+ <string name="kg_pin_instructions" msgid="2377242233495111557">"Masukkan PIN"</string>
+ <string name="kg_password_instructions" msgid="5753646556186936819">"Masukkan Kata Laluan"</string>
+ <string name="kg_puk_enter_puk_hint" msgid="453227143861735537">"Kini SIM dilumpuhkan. Masukkan kod PUK untuk meneruskan. Hubungi pembawa untuk butiran."</string>
+ <string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"Masukkan kod PIN yang diingini"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"Sahkan kod PIN yang diingini"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"Membuka kunci kad SIM..."</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"Taipkan PIN yang mengandungi 4 hingga 8 nombor."</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"Kod PUK mestilah 8 nombor atau lebih."</string>
+ <string name="kg_invalid_puk" msgid="3638289409676051243">"Masukkan semula kod PIN yang betul. Percubaan berulang akan melumpuhkan SIM secara kekal."</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"Kod PIN tidak sepadan"</string>
+ <string name="kg_login_too_many_attempts" msgid="6486842094005698475">"Terlalu banyak percubaan melukis corak"</string>
+ <string name="kg_login_instructions" msgid="1100551261265506448">"Untuk membuka kunci, log masuk dengan akaun Google anda."</string>
+ <string name="kg_login_username_hint" msgid="5718534272070920364">"Nama Pengguna (E-mel)"</string>
+ <string name="kg_login_password_hint" msgid="9057289103827298549">"Kata laluan"</string>
+ <string name="kg_login_submit_button" msgid="5355904582674054702">"Log masuk"</string>
+ <string name="kg_login_invalid_input" msgid="5754664119319872197">"Nama pengguna atau kata laluan tidak sah."</string>
+ <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"Lupa nama pengguna atau kata laluan anda?\nLawati"<b>"google.com/accounts/recovery"</b>"."</string>
+ <string name="kg_login_checking_password" msgid="1052685197710252395">"Menyemak akaun…"</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"Anda telah menaip PIN anda secara salah sebanyak <xliff:g id="NUMBER_0">%d</xliff:g> kali. \n\nCuba lagi dalam <xliff:g id="NUMBER_1">%d</xliff:g> saat."</string>
+ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"Anda telah menaip kata laluan anda secara salah sebanyak <xliff:g id="NUMBER_0">%d</xliff:g> kali. \n\nCuba lagi dalam <xliff:g id="NUMBER_1">%d</xliff:g> saat."</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"Anda telah tersilap melukis corak buka kunci anda sebanyak <xliff:g id="NUMBER_0">%d</xliff:g> kali. \n\nCuba lagi dalam <xliff:g id="NUMBER_1">%d</xliff:g> saat."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1575557200627128949">"Anda telah mencuba untuk membuka kunci tablet dengan salah sebanyak <xliff:g id="NUMBER_0">%d</xliff:g> kali. Selepas <xliff:g id="NUMBER_1">%d</xliff:g> lagi percubaan yang tidak berjaya, tablet akan ditetapkan semula kepada tetapan lalai kilang dan semua data pengguna akan hilang."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="4051015943038199910">"Anda telah mencuba untuk membuka kunci telefon dengan salah sebanyak <xliff:g id="NUMBER_0">%d</xliff:g> kali. Selepas <xliff:g id="NUMBER_1">%d</xliff:g> lagi percubaan yang tidak berjaya, telefon akan ditetapkan semula kepada tetapan lalai kilang dan semua data pengguna akan hilang."</string>
+ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="2072996269148483637">"Anda telah mencuba untuk membuka kunci tablet secara salah sebanyak <xliff:g id="NUMBER">%d</xliff:g> kali. Tablet kini akan ditetapkan semula ke tetapan lalai kilang."</string>
+ <string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"Anda telah mencuba untuk membuka kunci telefon secara salah sebanyak <xliff:g id="NUMBER">%d</xliff:g> kali. Telefon kini akan ditetapkan semula ke tetapan lalai kilang."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Anda telah tersilap melukis corak buka kunci sebanyak <xliff:g id="NUMBER_0">%d</xliff:g> kali. Selepas <xliff:g id="NUMBER_1">%d</xliff:g> lagi percubaan yang tidak berjaya, anda akan diminta membuka kunci tablet anda menggunakan log masuk Google anda.\n\n Cuba lagi dalam <xliff:g id="NUMBER_2">%d</xliff:g> saat."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Anda telah tersilap lukis corak buka kunci sebanyak <xliff:g id="NUMBER_0">%d</xliff:g> kali. Selepas <xliff:g id="NUMBER_1">%d</xliff:g> lagi percubaan yang tidak berjaya, anda akan diminta membuka kunci telefon anda menggunakan log masuk Google anda.\n\n Cuba lagi dalam <xliff:g id="NUMBER_2">%d</xliff:g> saat."</string>
+ <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
+ <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Alih keluar"</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"Kod PIN SIM tidak betul, jadi anda harus menghubungi pembawa anda untuk membuka kunci peranti."</string>
+ <plurals name="kg_password_wrong_pin_code">
+ <item quantity="one" msgid="8134313997799638254">"Kod PIN SIM tidak betul. Anda mempunyai <xliff:g id="NUMBER">%d</xliff:g> percubaan lagi sebelum anda harus menghubungi pembawa anda untuk membuka kunci peranti."</item>
+ <item quantity="other" msgid="2215723361575359486">"Kod PIN SIM tidak betul, anda mempunyai <xliff:g id="NUMBER">%d</xliff:g> percubaan lagi."</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="7077536808291316208">"SIM tidak boleh digunakan. Hubungi pembawa anda."</string>
+ <plurals name="kg_password_wrong_puk_code">
+ <item quantity="one" msgid="3256893607561060649">"Kod PUK SIM tidak betul, anda mempunyai <xliff:g id="NUMBER">%d</xliff:g> percubaan lagi sebelum SIM tidak boleh digunakan secara kekal."</item>
+ <item quantity="other" msgid="5477305226026342036">"Kod PUK SIM tidak betul, anda mempunyai <xliff:g id="NUMBER">%d</xliff:g> percubaan lagi sebelum SIM tidak boleh digunakan secara kekal."</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="6268288093558031564">"Operasi PIN SIM gagal!"</string>
+ <string name="kg_password_puk_failed" msgid="2838824369502455984">"Operasi PUK SIM gagal!"</string>
+ <string name="kg_pin_accepted" msgid="1448241673570020097">"Kod Diterima!"</string>
+ <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Butang lagu sebelumnya"</string>
+ <string name="keyguard_transport_next_description" msgid="4299258300283778305">"Butang lagu seterusnya"</string>
+ <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Butang jeda"</string>
+ <string name="keyguard_transport_play_description" msgid="2924628863741150956">"Butang main"</string>
+ <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"Butang berhenti"</string>
+ <string name="keyguard_carrier_default" msgid="8700650403054042153">"Tiada perkhidmatan."</string>
+</resources>
diff --git a/packages/Keyguard/res/values-nb/strings.xml b/packages/Keyguard/res/values-nb/strings.xml
index 6a5bfa9..c25a772 100644
--- a/packages/Keyguard/res/values-nb/strings.xml
+++ b/packages/Keyguard/res/values-nb/strings.xml
@@ -21,9 +21,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"Skriv inn PIN-kode"</string>
- <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"Skriv inn PUK-kode og ny personlig kode"</string>
- <string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"PUK-kode"</string>
- <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"Ny PIN-kode"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="3035856550289724338">"Skriv inn PUK-koden for SIM-kortet og en ny PIN-kode"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="1801941051094974609">"PUK-koden for SIM-kortet"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="3201151840570492538">"Ny PIN-kode for SIM-kortet"</string>
<string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"Trykk for å skrive inn passord"</font></string>
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Skriv inn passord for å låse opp"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Skriv inn PIN-kode for å låse opp"</string>
@@ -71,6 +71,13 @@
<string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Pause-knapp"</string>
<string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Avspillingsknapp"</string>
<string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Stopp-knapp"</string>
+ <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Likt av meg"</string>
+ <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Sanger du ikke liker"</string>
+ <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Hjerte"</string>
+ <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Lås opp for å fortsette"</string>
+ <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Starten ble kansellert"</string>
+ <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Slipp <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> for å slette den."</string>
+ <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> blir ikke slettet."</string>
<string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
<string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
<string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
@@ -105,7 +112,6 @@
<string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"Tast inn ønsket PIN-kode"</string>
<string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"Bekreft ønsket PIN-kode"</string>
<string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"LÃ¥ser opp SIM-kortet ..."</string>
- <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"Feil PIN-kode."</string>
<string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"Skriv inn en PIN-kode på fire til åtte sifre."</string>
<string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"PUK-koden skal være på åtte eller flere siffer."</string>
<string name="kg_invalid_puk" msgid="3638289409676051243">"Skriv inn den korrekte PUK-koden på nytt. Gjentatte forsøk kommer til å deaktivere SIM-kortet."</string>
@@ -129,6 +135,19 @@
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Du har tegnet opplåsningsmønsteret feil <xliff:g id="NUMBER_0">%d</xliff:g> ganger. Etter ytterligere <xliff:g id="NUMBER_1">%d</xliff:g> gale forsøk, blir du bedt om å låse opp telefonen via en e-postkonto.\n\n Prøv på nytt om <xliff:g id="NUMBER_2">%d</xliff:g> sekunder."</string>
<string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
<string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Fjern"</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"Feil PIN-kode for SIM-kortet. Du må nå kontakte operatøren din for å låse opp enheten."</string>
+ <plurals name="kg_password_wrong_pin_code">
+ <item quantity="one" msgid="8134313997799638254">"Feil PIN-kode for SIM-kortet. Du har <xliff:g id="NUMBER">%d</xliff:g> forsøk igjen før du må kontakte operatøren din for å låse opp enheten."</item>
+ <item quantity="other" msgid="2215723361575359486">"Feil PIN-kode for SIM-kortet. Du har <xliff:g id="NUMBER">%d</xliff:g> forsøk igjen."</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="7077536808291316208">"SIM-kortet er ubrukelig. Kontakt operatøren din."</string>
+ <plurals name="kg_password_wrong_puk_code">
+ <item quantity="one" msgid="3256893607561060649">"Feil PUK-kode for SIM-kortet. Du har <xliff:g id="NUMBER">%d</xliff:g> forsøk igjen før SIM-kortet blir permanent ubrukelig."</item>
+ <item quantity="other" msgid="5477305226026342036">"Feil PUK-kode for SIM-kortet. Du har <xliff:g id="NUMBER">%d</xliff:g> forsøk igjen før SIM-kortet blir permanent ubrukelig."</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="6268288093558031564">"PIN-koden for SIM-kortet ble avvist."</string>
+ <string name="kg_password_puk_failed" msgid="2838824369502455984">"PUK-koden for SIM-kortet ble avvist."</string>
+ <string name="kg_pin_accepted" msgid="1448241673570020097">"Koden er godkjent."</string>
<string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Forrige spor-knapp"</string>
<string name="keyguard_transport_next_description" msgid="4299258300283778305">"Neste spor-knapp"</string>
<string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Pause-knapp"</string>
diff --git a/packages/Keyguard/res/values-ne-rNP/strings.xml b/packages/Keyguard/res/values-ne-rNP/strings.xml
new file mode 100644
index 0000000..0fa1182
--- /dev/null
+++ b/packages/Keyguard/res/values-ne-rNP/strings.xml
@@ -0,0 +1,138 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"PIN कोड टाइप गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"PUK र नयाठPIN कोड टाइप गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"PUK कोड"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"नयाठPIN कोड"</string>
+ <string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"पासवरà¥à¤¡ टाइप गरà¥à¤¨ छà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</font></string>
+ <string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"अनलक गरà¥à¤¨ पासवरà¥à¤¡ टाइप गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"अनलक गरà¥à¤¨ PIN कोड टाइप गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"गलत PIN कोड।"</string>
+ <string name="keyguard_label_text" msgid="861796461028298424">"अनलक गरà¥à¤¨ मेनॠथिचà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ र तà¥à¤¯à¤¸à¤ªà¤›à¤¿ ० थिचà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="faceunlock_multiple_failures" msgid="754137583022792429">"अतà¥à¤¯à¤¾à¤§à¤¿à¤• मोहडा खोलà¥à¤¨à¥‡ पà¥à¤°à¤¯à¤¾à¤¸à¤¹à¤°à¥‚ बढी भà¤à¥¤"</string>
+ <string name="keyguard_charged" msgid="3272223906073492454">"चारà¥à¤œ भयो"</string>
+ <string name="keyguard_plugged_in" msgid="8117572000639998388">"चारà¥à¤œ गरà¥à¤¦à¥ˆ, <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+ <string name="keyguard_low_battery" msgid="8143808018719173859">"तपाईà¤à¤•ो चारà¥à¤œà¤° जोडà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="keyguard_instructions_when_pattern_disabled" msgid="1332288268600329841">"अनलक गरà¥à¤¨ मेनॠथिचà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="keyguard_network_locked_message" msgid="9169717779058037168">"नेटवरà¥à¤• लक गरिà¤à¤•ो छ"</string>
+ <string name="keyguard_missing_sim_message_short" msgid="494980561304211931">"SIM कारà¥à¤¡ छैन"</string>
+ <string name="keyguard_missing_sim_message" product="tablet" msgid="1445849005909260039">"टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿà¤®à¤¾ SIM कारà¥à¤¡ छैन।"</string>
+ <string name="keyguard_missing_sim_message" product="default" msgid="3481110395508637643">"फोनमा कà¥à¤¨à¥ˆ SIM कारà¥à¤¡ छैन।"</string>
+ <string name="keyguard_missing_sim_instructions" msgid="5210891509995942250">"SIM कारà¥à¤¡ भितà¥à¤° राखà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="keyguard_missing_sim_instructions_long" msgid="5968985489463870358">"SIM कारà¥à¤¡ हराइरहेको छ वा पढà¥à¤¨ योगà¥à¤¯ छैन। SIM कारà¥à¤¡ हालà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="keyguard_permanent_disabled_sim_message_short" msgid="8340813989586622356">"पà¥à¤°à¤¯à¥‹à¤— अयोगà¥à¤¯ SIM कारà¥à¤¡à¥¤"</string>
+ <string name="keyguard_permanent_disabled_sim_instructions" msgid="5892940909699723544">"तपाईà¤à¤•ो SIM कारà¥à¤¡ सà¥à¤¥à¤¾à¤¯à¥€ रूपमा असकà¥à¤·à¤® पारिà¤à¤•ो छ।\n अरà¥à¤•ो SIM कारà¥à¤¡à¤•ो लागि तपाईà¤à¤•ो ताररहित सेवा पà¥à¤°à¤¦à¤¾à¤¯à¤•सà¤à¤— समà¥à¤ªà¤°à¥à¤• गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM कारà¥à¤¡ लक गरियो।"</string>
+ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM कारà¥à¤¡ PUK-लक छ।"</string>
+ <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"SIM कारà¥à¤¡ अनलक हà¥à¤à¤¦à¥ˆâ€¦"</string>
+ <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. विजेट %2$d of %3$d।"</string>
+ <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"विजेट थप गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"खाली"</string>
+ <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"अनलक कà¥à¤·à¥‡à¤¤à¥à¤° विसà¥à¤¤à¤¾à¤° भयो।"</string>
+ <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"अनलक कà¥à¤·à¥‡à¤¤à¥à¤° भतà¥à¤•ियो।"</string>
+ <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> विजेट।"</string>
+ <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ छनौटकरà¥à¤¤à¤¾"</string>
+ <string name="keyguard_accessibility_status" msgid="8008264603935930611">"सà¥à¤¥à¤¿à¤¤à¤¿"</string>
+ <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"कà¥à¤¯à¤¾à¤®à¥‡à¤°à¤¾"</string>
+ <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"मिडिया नियनà¥à¤¤à¥à¤°à¤£à¤¹à¤°à¥‚"</string>
+ <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"विजेट पà¥à¤¨à¤ƒà¤•à¥à¤°à¤® गरà¥à¤¨à¥‡ सà¥à¤°à¥ भयो।"</string>
+ <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"विजेट पà¥à¤¨à¤ƒà¤•à¥à¤°à¤® समापà¥à¤¤ भà¤à¤•ो छ।"</string>
+ <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"विजेट <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> मेटाइयो।"</string>
+ <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"अनलक कà¥à¤·à¥‡à¤¤à¥à¤° बढाउनà¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"सà¥à¤²à¤¾à¤‡à¤¡ अनलक।"</string>
+ <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"ढाà¤à¤šà¤¾ अनलक।"</string>
+ <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"फेस अनलक"</string>
+ <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Pin अनलक"</string>
+ <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"पासवरà¥à¤¡ अनलक।"</string>
+ <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"ढाà¤à¤šà¤¾ कà¥à¤·à¥‡à¤¤à¥à¤°à¥¤"</string>
+ <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"सà¥à¤²à¤¾à¤‡à¤¡ कà¥à¤·à¥‡à¤¤à¥à¤°à¥¤"</string>
+ <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"अघिलà¥à¤²à¥‹ पथ बटन"</string>
+ <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"अरà¥à¤•ो पथ बटन"</string>
+ <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"रोकà¥à¤¨à¥‡ बटन"</string>
+ <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"बजाउने बटन"</string>
+ <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"बटन रोकà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?१२३"</string>
+ <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
+ <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
+ <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
+ <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"रदà¥à¤¦ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"मेटà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="keyboardview_keycode_done" msgid="1992571118466679775">"भयो"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"मोड परिवरà¥à¤¤à¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
+ <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¿ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="description_target_unlock" msgid="2228524900439801453">"अनलक गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="description_target_camera" msgid="969071997552486814">"कà¥à¤¯à¤¾à¤®à¥‡à¤°à¤¾"</string>
+ <string name="description_target_silent" msgid="893551287746522182">"मौन"</string>
+ <string name="description_target_soundon" msgid="30052466675500172">"आवाज चालू"</string>
+ <string name="description_target_search" msgid="3091587249776033139">"खोजà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>को लागि माथि धिसारà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="description_direction_down" msgid="5087739728639014595">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> को लागि तल सà¥à¤²à¤¾à¤‡à¤¡ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="description_direction_left" msgid="7207478719805562165">"सà¥à¤²à¤¾à¤‡à¤¡ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>को लागि बायाà¤à¥¤"</string>
+ <string name="description_direction_right" msgid="8034433242579600980">"सà¥à¤²à¤¾à¤‡à¤¡ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>को लागि दायाà¤à¥¤"</string>
+ <string name="user_switched" msgid="3768006783166984410">"अहिलेको पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ <xliff:g id="NAME">%1$s</xliff:g>।"</string>
+ <string name="kg_emergency_call_label" msgid="684946192523830531">"आपतकालीन कल"</string>
+ <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"ढाà¤à¤šà¤¾ बिरà¥à¤¸à¤¨à¥ भयो"</string>
+ <string name="kg_wrong_pattern" msgid="1850806070801358830">"गलत ढाà¤à¤šà¤¾"</string>
+ <string name="kg_wrong_password" msgid="2333281762128113157">"गलत पासवरà¥à¤¡"</string>
+ <string name="kg_wrong_pin" msgid="1131306510833563801">"गलत PIN"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"<xliff:g id="NUMBER">%d</xliff:g>सेकेनà¥à¤¡à¤®à¤¾ फेरि पà¥à¤°à¤¯à¤¾à¤¸ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="kg_pattern_instructions" msgid="398978611683075868">"आफà¥à¤¨à¥‹ ढाà¤à¤šà¤¾ कोरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="kg_sim_pin_instructions" msgid="2319508550934557331">"SIM PIN पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¿ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="kg_pin_instructions" msgid="2377242233495111557">"PIN पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¿ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="kg_password_instructions" msgid="5753646556186936819">"पासवरà¥à¤¡ पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¿ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="kg_puk_enter_puk_hint" msgid="453227143861735537">"SIM कारà¥à¤¡ अहिले असकà¥à¤·à¤® छ। सà¥à¤šà¤¾à¤°à¥ गरà¥à¤¨à¤•ो लागि PUK कोड पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¿ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤ विवरणको लागि वाहकलाई समà¥à¤ªà¤°à¥à¤• गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"इचà¥à¤›à¤¿à¤¤ PIN कोड पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¿ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"मनपरà¥à¤¦à¥‹ PIN कोड निशà¥à¤šà¤¿à¤¤ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"SIM कारà¥à¤¡ अनलक गरà¥à¤¦à¥ˆâ€¦"</string>
+ <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"गलत PIN कोड।"</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"४ देखि ८ वाट नमà¥à¤¬à¤° भà¤à¤•ो à¤à¤‰à¤Ÿà¤¾ PIN टाइप गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"PUK कोड ८ वटा नमà¥à¤¬à¤° वा सो भनà¥à¤¦à¤¾ बढी हà¥à¤¨à¥à¤ªà¤°à¥à¤›à¥¤"</string>
+ <string name="kg_invalid_puk" msgid="3638289409676051243">"PUK कोड पà¥à¤¨:पà¥à¤°à¤¦à¤¾à¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤ धेरै पà¥à¤¨:पà¥à¤°à¤¯à¤¾à¤¸à¤¹à¤°à¥‚ले SIMलाई सà¥à¤¥à¤¾à¤¯à¥€ रूपमा निषà¥à¤•à¥à¤°à¤¿à¤¯ गरिदिने छ।"</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"PIN कोडहरू मेल खाà¤à¤¨"</string>
+ <string name="kg_login_too_many_attempts" msgid="6486842094005698475">"निकै धेरै ढाà¤à¤šà¤¾ कोसिसहरू"</string>
+ <string name="kg_login_instructions" msgid="1100551261265506448">"अनलक गरà¥à¤¨à¤•ो लागि, तपाईà¤à¤•ो Google खाताको साथ साइन इन गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="kg_login_username_hint" msgid="5718534272070920364">"पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ नाम (इमेल)"</string>
+ <string name="kg_login_password_hint" msgid="9057289103827298549">"पासवरà¥à¤¡"</string>
+ <string name="kg_login_submit_button" msgid="5355904582674054702">"साइन इन गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="kg_login_invalid_input" msgid="5754664119319872197">"अमानà¥à¤¯ पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤¨à¤¾à¤® वा पासवरà¥à¤¡à¥¤"</string>
+ <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"के तपाईà¤à¤²à¥‡ उपयोगकरà¥à¤¤à¤¾ नाम वा पासवरà¥à¤¡ बिरà¥à¤¸à¤¨à¥à¤­à¤¯à¥‹?\n"<b>"google.com/accounts/recovery"</b>" मा जानà¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="kg_login_checking_password" msgid="1052685197710252395">"खाता जाà¤à¤š हà¥à¤à¤¦à¥ˆâ€¦"</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"तपाईà¤à¤²à¥‡ गलत तरिकाले तपाईà¤à¤•ो PIN <xliff:g id="NUMBER_0">%d</xliff:g> पटक टाइप गरà¥à¤¨à¥ भà¤à¤•ो छ। \n\n<xliff:g id="NUMBER_1">%d</xliff:g> सेकेनà¥à¤¡à¤®à¤¾ फेरि पà¥à¤°à¤¯à¤¾à¤¸ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"तपाईà¤à¤²à¥‡ तपाईà¤à¤• पासवरà¥à¤¡ <xliff:g id="NUMBER_0">%d</xliff:g> पटक गलत टाइप गरà¥à¤¨à¥à¤­à¤à¤•ो छ। \n\n <xliff:g id="NUMBER_1">%d</xliff:g> सेकेनà¥à¤¡à¤®à¤¾ फेरि पà¥à¤°à¤¯à¤¾à¤¸ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"तपाईà¤à¤²à¥‡ तपाईà¤à¤•ो अनलक ढाà¤à¤šà¤¾ गलत तरिकाले <xliff:g id="NUMBER_0">%d</xliff:g> पटक खिचà¥à¤¨à¥ भà¤à¤•ो छ। \n\n <xliff:g id="NUMBER_1">%d</xliff:g> सेकेनà¥à¤¡à¤®à¤¾ फेरि कोसिस गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1575557200627128949">"तपाईà¤à¤²à¥‡ टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿà¤²à¤¾à¤ˆ अनलक गरà¥à¤¨ गलत तरिकाले <xliff:g id="NUMBER_0">%d</xliff:g> पटक कोसिस गरà¥à¤¨à¥ भà¤à¤•ो छ। <xliff:g id="NUMBER_1">%d</xliff:g> पछि थप असफल पà¥à¤°à¤¯à¤¾à¤¸à¤¹à¤°à¥‚, टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿ पूरà¥à¤µà¤¨à¤¿à¤°à¥à¤§à¤¾à¤°à¤¿à¤¤ कारà¥à¤¯à¤¶à¤¾à¤²à¤¾à¤®à¤¾ पà¥à¤¨à¤ƒà¤¸à¥‡à¤Ÿ गरिने छ र सबै पà¥à¤°à¤¯à¥‹à¤— डेटा हराउने छ।"</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="4051015943038199910">"तपाईà¤à¤²à¥‡ गलतसà¤à¤— फोनलाई अनलक गरà¥à¤¨ <xliff:g id="NUMBER_0">%d</xliff:g> पटक कोसिस गरà¥à¤¨à¥ भयो। <xliff:g id="NUMBER_1">%d</xliff:g> पछि थप असफल कोसिसहरू, फोनलाई पूरà¥à¤µà¤¨à¤¿à¤°à¥à¤§à¤¾à¤°à¤¿à¤¤ कारà¥à¤¯à¤¶à¤¾à¤²à¤¾à¤®à¤¾ पà¥à¤¨à¤ƒà¤¸à¥‡à¤Ÿ गरिने छ र सबै पà¥à¤°à¤¯à¥‹à¤— डेटा हराउने छ।"</string>
+ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="2072996269148483637">"तपाईà¤à¤²à¥‡ टà¥à¤¯à¤¬à¥à¤²à¥‡à¤Ÿà¤²à¤¾à¤ˆ अनलक गरà¥à¤¨ गलत तरिकाले <xliff:g id="NUMBER">%d</xliff:g> पटक पà¥à¤°à¤¯à¤¾à¤¸ गरà¥à¤¨à¥ भà¤à¤•ो छ। अब टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿà¤²à¤¾à¤ˆ पूरà¥à¤µà¤¨à¤¿à¤°à¥à¤§à¤¾à¤°à¤¿à¤¤ कारà¥à¤¯à¤¶à¤¾à¤²à¤¾à¤®à¤¾ पà¥à¤¨à¤ƒà¤¸à¥‡à¤Ÿ गरिने छ।"</string>
+ <string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"तपाईंले गलत तरिकाले फोन <xliff:g id="NUMBER">%d</xliff:g> पटक अनलक गरà¥à¤¨à¥‡ पà¥à¤°à¤¯à¤¤à¥à¤¨ गरà¥à¤¨à¥à¤­à¤¯à¥‹à¥¤ अब फोन फà¥à¤¯à¤¾à¤•à¥à¤Ÿà¥à¤°à¤¿ पूरà¥à¤µà¤¨à¤¿à¤°à¥à¤§à¤¾à¤°à¤¿à¤¤à¤®à¤¾ पà¥à¤¨à¤ƒà¤¸à¥‡à¤Ÿ हà¥à¤¨à¥‡ छ।"</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"तपाईंले गलत तरिकाले आफà¥à¤¨à¥‹ अनलक ढाà¤à¤šà¤¾ <xliff:g id="NUMBER_0">%d</xliff:g> पटक कोरà¥à¤¨à¥à¤­à¤¯à¥‹à¥¤ <xliff:g id="NUMBER_1">%d</xliff:g> विफल पà¥à¤°à¤¯à¤¤à¥à¤¨à¤¹à¤°à¥‚ पछि, तपाईंलाई आफà¥à¤¨à¥‹ टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿ इमेल खाता पà¥à¤°à¤¯à¥‹à¤— गरेर अनलक गरà¥à¤¨ सोधिने छ।\n\n फेरि पà¥à¤°à¤¯à¤¾à¤¸ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ <xliff:g id="NUMBER_2">%d</xliff:g> सेकेनà¥à¤¡à¤¹à¤°à¥‚मा।"</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"तपाईà¤à¤²à¥‡ आफà¥à¤¨à¥‹ अनलक ढाà¤à¤šà¤¾ गलत रूपमा <xliff:g id="NUMBER_0">%d</xliff:g> पटक तानà¥à¤¨à¥ भà¤à¤•ो छ। <xliff:g id="NUMBER_1">%d</xliff:g> धेरै असफल पà¥à¤°à¤¯à¤¾à¤¸à¤¹à¤°à¥‚पछि, तपाईà¤à¤²à¤¾à¤ˆ à¤à¤‰à¤Ÿà¤¾ इमेल खाताको पà¥à¤°à¤¯à¥‹à¤— गरेर तपाईà¤à¤•ो फोन अनलक गरà¥à¤¨ सोधिने छ।\n\n फेरि <xliff:g id="NUMBER_2">%d</xliff:g> सेकेनà¥à¤¡à¤®à¤¾ पà¥à¤°à¤¯à¤¾à¤¸ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
+ <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"हटाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"अघिलà¥à¤²à¥‹ टà¥à¤°à¤¯à¤¾à¤• बटन"</string>
+ <string name="keyguard_transport_next_description" msgid="4299258300283778305">"अरà¥à¤•ो टà¥à¤°à¤¯à¤¾à¤• बटन"</string>
+ <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"रोकà¥à¤¨à¥‡ बटन"</string>
+ <string name="keyguard_transport_play_description" msgid="2924628863741150956">"बटन बजाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"बटन रोकà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="keyguard_carrier_default" msgid="8700650403054042153">"कà¥à¤¨à¥ˆ सेवा छैन।"</string>
+</resources>
diff --git a/packages/Keyguard/res/values-ne/strings.xml b/packages/Keyguard/res/values-ne/strings.xml
new file mode 100644
index 0000000..0fa1182
--- /dev/null
+++ b/packages/Keyguard/res/values-ne/strings.xml
@@ -0,0 +1,138 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"PIN कोड टाइप गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"PUK र नयाठPIN कोड टाइप गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"PUK कोड"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"नयाठPIN कोड"</string>
+ <string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"पासवरà¥à¤¡ टाइप गरà¥à¤¨ छà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</font></string>
+ <string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"अनलक गरà¥à¤¨ पासवरà¥à¤¡ टाइप गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"अनलक गरà¥à¤¨ PIN कोड टाइप गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"गलत PIN कोड।"</string>
+ <string name="keyguard_label_text" msgid="861796461028298424">"अनलक गरà¥à¤¨ मेनॠथिचà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ र तà¥à¤¯à¤¸à¤ªà¤›à¤¿ ० थिचà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="faceunlock_multiple_failures" msgid="754137583022792429">"अतà¥à¤¯à¤¾à¤§à¤¿à¤• मोहडा खोलà¥à¤¨à¥‡ पà¥à¤°à¤¯à¤¾à¤¸à¤¹à¤°à¥‚ बढी भà¤à¥¤"</string>
+ <string name="keyguard_charged" msgid="3272223906073492454">"चारà¥à¤œ भयो"</string>
+ <string name="keyguard_plugged_in" msgid="8117572000639998388">"चारà¥à¤œ गरà¥à¤¦à¥ˆ, <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+ <string name="keyguard_low_battery" msgid="8143808018719173859">"तपाईà¤à¤•ो चारà¥à¤œà¤° जोडà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="keyguard_instructions_when_pattern_disabled" msgid="1332288268600329841">"अनलक गरà¥à¤¨ मेनॠथिचà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="keyguard_network_locked_message" msgid="9169717779058037168">"नेटवरà¥à¤• लक गरिà¤à¤•ो छ"</string>
+ <string name="keyguard_missing_sim_message_short" msgid="494980561304211931">"SIM कारà¥à¤¡ छैन"</string>
+ <string name="keyguard_missing_sim_message" product="tablet" msgid="1445849005909260039">"टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿà¤®à¤¾ SIM कारà¥à¤¡ छैन।"</string>
+ <string name="keyguard_missing_sim_message" product="default" msgid="3481110395508637643">"फोनमा कà¥à¤¨à¥ˆ SIM कारà¥à¤¡ छैन।"</string>
+ <string name="keyguard_missing_sim_instructions" msgid="5210891509995942250">"SIM कारà¥à¤¡ भितà¥à¤° राखà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="keyguard_missing_sim_instructions_long" msgid="5968985489463870358">"SIM कारà¥à¤¡ हराइरहेको छ वा पढà¥à¤¨ योगà¥à¤¯ छैन। SIM कारà¥à¤¡ हालà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="keyguard_permanent_disabled_sim_message_short" msgid="8340813989586622356">"पà¥à¤°à¤¯à¥‹à¤— अयोगà¥à¤¯ SIM कारà¥à¤¡à¥¤"</string>
+ <string name="keyguard_permanent_disabled_sim_instructions" msgid="5892940909699723544">"तपाईà¤à¤•ो SIM कारà¥à¤¡ सà¥à¤¥à¤¾à¤¯à¥€ रूपमा असकà¥à¤·à¤® पारिà¤à¤•ो छ।\n अरà¥à¤•ो SIM कारà¥à¤¡à¤•ो लागि तपाईà¤à¤•ो ताररहित सेवा पà¥à¤°à¤¦à¤¾à¤¯à¤•सà¤à¤— समà¥à¤ªà¤°à¥à¤• गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM कारà¥à¤¡ लक गरियो।"</string>
+ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM कारà¥à¤¡ PUK-लक छ।"</string>
+ <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"SIM कारà¥à¤¡ अनलक हà¥à¤à¤¦à¥ˆâ€¦"</string>
+ <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. विजेट %2$d of %3$d।"</string>
+ <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"विजेट थप गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"खाली"</string>
+ <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"अनलक कà¥à¤·à¥‡à¤¤à¥à¤° विसà¥à¤¤à¤¾à¤° भयो।"</string>
+ <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"अनलक कà¥à¤·à¥‡à¤¤à¥à¤° भतà¥à¤•ियो।"</string>
+ <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> विजेट।"</string>
+ <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ छनौटकरà¥à¤¤à¤¾"</string>
+ <string name="keyguard_accessibility_status" msgid="8008264603935930611">"सà¥à¤¥à¤¿à¤¤à¤¿"</string>
+ <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"कà¥à¤¯à¤¾à¤®à¥‡à¤°à¤¾"</string>
+ <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"मिडिया नियनà¥à¤¤à¥à¤°à¤£à¤¹à¤°à¥‚"</string>
+ <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"विजेट पà¥à¤¨à¤ƒà¤•à¥à¤°à¤® गरà¥à¤¨à¥‡ सà¥à¤°à¥ भयो।"</string>
+ <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"विजेट पà¥à¤¨à¤ƒà¤•à¥à¤°à¤® समापà¥à¤¤ भà¤à¤•ो छ।"</string>
+ <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"विजेट <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> मेटाइयो।"</string>
+ <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"अनलक कà¥à¤·à¥‡à¤¤à¥à¤° बढाउनà¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"सà¥à¤²à¤¾à¤‡à¤¡ अनलक।"</string>
+ <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"ढाà¤à¤šà¤¾ अनलक।"</string>
+ <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"फेस अनलक"</string>
+ <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Pin अनलक"</string>
+ <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"पासवरà¥à¤¡ अनलक।"</string>
+ <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"ढाà¤à¤šà¤¾ कà¥à¤·à¥‡à¤¤à¥à¤°à¥¤"</string>
+ <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"सà¥à¤²à¤¾à¤‡à¤¡ कà¥à¤·à¥‡à¤¤à¥à¤°à¥¤"</string>
+ <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"अघिलà¥à¤²à¥‹ पथ बटन"</string>
+ <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"अरà¥à¤•ो पथ बटन"</string>
+ <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"रोकà¥à¤¨à¥‡ बटन"</string>
+ <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"बजाउने बटन"</string>
+ <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"बटन रोकà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?१२३"</string>
+ <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
+ <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
+ <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
+ <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"रदà¥à¤¦ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"मेटà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="keyboardview_keycode_done" msgid="1992571118466679775">"भयो"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"मोड परिवरà¥à¤¤à¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
+ <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¿ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="description_target_unlock" msgid="2228524900439801453">"अनलक गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="description_target_camera" msgid="969071997552486814">"कà¥à¤¯à¤¾à¤®à¥‡à¤°à¤¾"</string>
+ <string name="description_target_silent" msgid="893551287746522182">"मौन"</string>
+ <string name="description_target_soundon" msgid="30052466675500172">"आवाज चालू"</string>
+ <string name="description_target_search" msgid="3091587249776033139">"खोजà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>को लागि माथि धिसारà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="description_direction_down" msgid="5087739728639014595">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> को लागि तल सà¥à¤²à¤¾à¤‡à¤¡ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="description_direction_left" msgid="7207478719805562165">"सà¥à¤²à¤¾à¤‡à¤¡ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>को लागि बायाà¤à¥¤"</string>
+ <string name="description_direction_right" msgid="8034433242579600980">"सà¥à¤²à¤¾à¤‡à¤¡ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>को लागि दायाà¤à¥¤"</string>
+ <string name="user_switched" msgid="3768006783166984410">"अहिलेको पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ <xliff:g id="NAME">%1$s</xliff:g>।"</string>
+ <string name="kg_emergency_call_label" msgid="684946192523830531">"आपतकालीन कल"</string>
+ <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"ढाà¤à¤šà¤¾ बिरà¥à¤¸à¤¨à¥ भयो"</string>
+ <string name="kg_wrong_pattern" msgid="1850806070801358830">"गलत ढाà¤à¤šà¤¾"</string>
+ <string name="kg_wrong_password" msgid="2333281762128113157">"गलत पासवरà¥à¤¡"</string>
+ <string name="kg_wrong_pin" msgid="1131306510833563801">"गलत PIN"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"<xliff:g id="NUMBER">%d</xliff:g>सेकेनà¥à¤¡à¤®à¤¾ फेरि पà¥à¤°à¤¯à¤¾à¤¸ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="kg_pattern_instructions" msgid="398978611683075868">"आफà¥à¤¨à¥‹ ढाà¤à¤šà¤¾ कोरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="kg_sim_pin_instructions" msgid="2319508550934557331">"SIM PIN पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¿ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="kg_pin_instructions" msgid="2377242233495111557">"PIN पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¿ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="kg_password_instructions" msgid="5753646556186936819">"पासवरà¥à¤¡ पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¿ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="kg_puk_enter_puk_hint" msgid="453227143861735537">"SIM कारà¥à¤¡ अहिले असकà¥à¤·à¤® छ। सà¥à¤šà¤¾à¤°à¥ गरà¥à¤¨à¤•ो लागि PUK कोड पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¿ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤ विवरणको लागि वाहकलाई समà¥à¤ªà¤°à¥à¤• गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"इचà¥à¤›à¤¿à¤¤ PIN कोड पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¿ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"मनपरà¥à¤¦à¥‹ PIN कोड निशà¥à¤šà¤¿à¤¤ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"SIM कारà¥à¤¡ अनलक गरà¥à¤¦à¥ˆâ€¦"</string>
+ <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"गलत PIN कोड।"</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"४ देखि ८ वाट नमà¥à¤¬à¤° भà¤à¤•ो à¤à¤‰à¤Ÿà¤¾ PIN टाइप गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"PUK कोड ८ वटा नमà¥à¤¬à¤° वा सो भनà¥à¤¦à¤¾ बढी हà¥à¤¨à¥à¤ªà¤°à¥à¤›à¥¤"</string>
+ <string name="kg_invalid_puk" msgid="3638289409676051243">"PUK कोड पà¥à¤¨:पà¥à¤°à¤¦à¤¾à¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤ धेरै पà¥à¤¨:पà¥à¤°à¤¯à¤¾à¤¸à¤¹à¤°à¥‚ले SIMलाई सà¥à¤¥à¤¾à¤¯à¥€ रूपमा निषà¥à¤•à¥à¤°à¤¿à¤¯ गरिदिने छ।"</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"PIN कोडहरू मेल खाà¤à¤¨"</string>
+ <string name="kg_login_too_many_attempts" msgid="6486842094005698475">"निकै धेरै ढाà¤à¤šà¤¾ कोसिसहरू"</string>
+ <string name="kg_login_instructions" msgid="1100551261265506448">"अनलक गरà¥à¤¨à¤•ो लागि, तपाईà¤à¤•ो Google खाताको साथ साइन इन गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="kg_login_username_hint" msgid="5718534272070920364">"पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ नाम (इमेल)"</string>
+ <string name="kg_login_password_hint" msgid="9057289103827298549">"पासवरà¥à¤¡"</string>
+ <string name="kg_login_submit_button" msgid="5355904582674054702">"साइन इन गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="kg_login_invalid_input" msgid="5754664119319872197">"अमानà¥à¤¯ पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤¨à¤¾à¤® वा पासवरà¥à¤¡à¥¤"</string>
+ <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"के तपाईà¤à¤²à¥‡ उपयोगकरà¥à¤¤à¤¾ नाम वा पासवरà¥à¤¡ बिरà¥à¤¸à¤¨à¥à¤­à¤¯à¥‹?\n"<b>"google.com/accounts/recovery"</b>" मा जानà¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="kg_login_checking_password" msgid="1052685197710252395">"खाता जाà¤à¤š हà¥à¤à¤¦à¥ˆâ€¦"</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"तपाईà¤à¤²à¥‡ गलत तरिकाले तपाईà¤à¤•ो PIN <xliff:g id="NUMBER_0">%d</xliff:g> पटक टाइप गरà¥à¤¨à¥ भà¤à¤•ो छ। \n\n<xliff:g id="NUMBER_1">%d</xliff:g> सेकेनà¥à¤¡à¤®à¤¾ फेरि पà¥à¤°à¤¯à¤¾à¤¸ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"तपाईà¤à¤²à¥‡ तपाईà¤à¤• पासवरà¥à¤¡ <xliff:g id="NUMBER_0">%d</xliff:g> पटक गलत टाइप गरà¥à¤¨à¥à¤­à¤à¤•ो छ। \n\n <xliff:g id="NUMBER_1">%d</xliff:g> सेकेनà¥à¤¡à¤®à¤¾ फेरि पà¥à¤°à¤¯à¤¾à¤¸ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"तपाईà¤à¤²à¥‡ तपाईà¤à¤•ो अनलक ढाà¤à¤šà¤¾ गलत तरिकाले <xliff:g id="NUMBER_0">%d</xliff:g> पटक खिचà¥à¤¨à¥ भà¤à¤•ो छ। \n\n <xliff:g id="NUMBER_1">%d</xliff:g> सेकेनà¥à¤¡à¤®à¤¾ फेरि कोसिस गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1575557200627128949">"तपाईà¤à¤²à¥‡ टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿà¤²à¤¾à¤ˆ अनलक गरà¥à¤¨ गलत तरिकाले <xliff:g id="NUMBER_0">%d</xliff:g> पटक कोसिस गरà¥à¤¨à¥ भà¤à¤•ो छ। <xliff:g id="NUMBER_1">%d</xliff:g> पछि थप असफल पà¥à¤°à¤¯à¤¾à¤¸à¤¹à¤°à¥‚, टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿ पूरà¥à¤µà¤¨à¤¿à¤°à¥à¤§à¤¾à¤°à¤¿à¤¤ कारà¥à¤¯à¤¶à¤¾à¤²à¤¾à¤®à¤¾ पà¥à¤¨à¤ƒà¤¸à¥‡à¤Ÿ गरिने छ र सबै पà¥à¤°à¤¯à¥‹à¤— डेटा हराउने छ।"</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="4051015943038199910">"तपाईà¤à¤²à¥‡ गलतसà¤à¤— फोनलाई अनलक गरà¥à¤¨ <xliff:g id="NUMBER_0">%d</xliff:g> पटक कोसिस गरà¥à¤¨à¥ भयो। <xliff:g id="NUMBER_1">%d</xliff:g> पछि थप असफल कोसिसहरू, फोनलाई पूरà¥à¤µà¤¨à¤¿à¤°à¥à¤§à¤¾à¤°à¤¿à¤¤ कारà¥à¤¯à¤¶à¤¾à¤²à¤¾à¤®à¤¾ पà¥à¤¨à¤ƒà¤¸à¥‡à¤Ÿ गरिने छ र सबै पà¥à¤°à¤¯à¥‹à¤— डेटा हराउने छ।"</string>
+ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="2072996269148483637">"तपाईà¤à¤²à¥‡ टà¥à¤¯à¤¬à¥à¤²à¥‡à¤Ÿà¤²à¤¾à¤ˆ अनलक गरà¥à¤¨ गलत तरिकाले <xliff:g id="NUMBER">%d</xliff:g> पटक पà¥à¤°à¤¯à¤¾à¤¸ गरà¥à¤¨à¥ भà¤à¤•ो छ। अब टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿà¤²à¤¾à¤ˆ पूरà¥à¤µà¤¨à¤¿à¤°à¥à¤§à¤¾à¤°à¤¿à¤¤ कारà¥à¤¯à¤¶à¤¾à¤²à¤¾à¤®à¤¾ पà¥à¤¨à¤ƒà¤¸à¥‡à¤Ÿ गरिने छ।"</string>
+ <string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"तपाईंले गलत तरिकाले फोन <xliff:g id="NUMBER">%d</xliff:g> पटक अनलक गरà¥à¤¨à¥‡ पà¥à¤°à¤¯à¤¤à¥à¤¨ गरà¥à¤¨à¥à¤­à¤¯à¥‹à¥¤ अब फोन फà¥à¤¯à¤¾à¤•à¥à¤Ÿà¥à¤°à¤¿ पूरà¥à¤µà¤¨à¤¿à¤°à¥à¤§à¤¾à¤°à¤¿à¤¤à¤®à¤¾ पà¥à¤¨à¤ƒà¤¸à¥‡à¤Ÿ हà¥à¤¨à¥‡ छ।"</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"तपाईंले गलत तरिकाले आफà¥à¤¨à¥‹ अनलक ढाà¤à¤šà¤¾ <xliff:g id="NUMBER_0">%d</xliff:g> पटक कोरà¥à¤¨à¥à¤­à¤¯à¥‹à¥¤ <xliff:g id="NUMBER_1">%d</xliff:g> विफल पà¥à¤°à¤¯à¤¤à¥à¤¨à¤¹à¤°à¥‚ पछि, तपाईंलाई आफà¥à¤¨à¥‹ टà¥à¤¯à¤¾à¤¬à¥à¤²à¥‡à¤Ÿ इमेल खाता पà¥à¤°à¤¯à¥‹à¤— गरेर अनलक गरà¥à¤¨ सोधिने छ।\n\n फेरि पà¥à¤°à¤¯à¤¾à¤¸ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ <xliff:g id="NUMBER_2">%d</xliff:g> सेकेनà¥à¤¡à¤¹à¤°à¥‚मा।"</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"तपाईà¤à¤²à¥‡ आफà¥à¤¨à¥‹ अनलक ढाà¤à¤šà¤¾ गलत रूपमा <xliff:g id="NUMBER_0">%d</xliff:g> पटक तानà¥à¤¨à¥ भà¤à¤•ो छ। <xliff:g id="NUMBER_1">%d</xliff:g> धेरै असफल पà¥à¤°à¤¯à¤¾à¤¸à¤¹à¤°à¥‚पछि, तपाईà¤à¤²à¤¾à¤ˆ à¤à¤‰à¤Ÿà¤¾ इमेल खाताको पà¥à¤°à¤¯à¥‹à¤— गरेर तपाईà¤à¤•ो फोन अनलक गरà¥à¤¨ सोधिने छ।\n\n फेरि <xliff:g id="NUMBER_2">%d</xliff:g> सेकेनà¥à¤¡à¤®à¤¾ पà¥à¤°à¤¯à¤¾à¤¸ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
+ <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"हटाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"अघिलà¥à¤²à¥‹ टà¥à¤°à¤¯à¤¾à¤• बटन"</string>
+ <string name="keyguard_transport_next_description" msgid="4299258300283778305">"अरà¥à¤•ो टà¥à¤°à¤¯à¤¾à¤• बटन"</string>
+ <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"रोकà¥à¤¨à¥‡ बटन"</string>
+ <string name="keyguard_transport_play_description" msgid="2924628863741150956">"बटन बजाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"बटन रोकà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="keyguard_carrier_default" msgid="8700650403054042153">"कà¥à¤¨à¥ˆ सेवा छैन।"</string>
+</resources>
diff --git a/packages/Keyguard/res/values-nl/strings.xml b/packages/Keyguard/res/values-nl/strings.xml
index b94cb70..34149c9 100644
--- a/packages/Keyguard/res/values-nl/strings.xml
+++ b/packages/Keyguard/res/values-nl/strings.xml
@@ -21,9 +21,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"Pincode typen"</string>
- <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"Geef de PUK-code en de nieuwe pincode op"</string>
- <string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"PUK-code"</string>
- <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"Nieuwe pincode"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="3035856550289724338">"Typ de pukcode voor de simkaart en de nieuwe pincode"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="1801941051094974609">"Pukcode voor simkaart"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="3201151840570492538">"Nieuwe pincode voor simkaart"</string>
<string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"Raak aan om wachtwoord in te voeren"</font></string>
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Typ het wachtwoord om te ontgrendelen"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Typ pincode om te ontgrendelen"</string>
@@ -71,6 +71,13 @@
<string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Knop voor onderbreken"</string>
<string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Knop voor afspelen"</string>
<string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Knop voor stoppen"</string>
+ <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Leuk"</string>
+ <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Niet leuk"</string>
+ <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Hart"</string>
+ <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Ontgrendel om door te gaan"</string>
+ <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Start geannuleerd"</string>
+ <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Zet <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> neer om te verwijderen."</string>
+ <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> wordt niet verwijderd."</string>
<string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
<string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
<string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"Alt"</string>
@@ -105,7 +112,6 @@
<string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"Gewenste pincode opgeven"</string>
<string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"Gewenste pincode bevestigen"</string>
<string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"Simkaart ontgrendelen..."</string>
- <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"Onjuiste pincode."</string>
<string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"Voer een pincode van 4 tot 8 cijfers in."</string>
<string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"De PUK-code is minimaal acht nummers lang."</string>
<string name="kg_invalid_puk" msgid="3638289409676051243">"Geef de juiste PUK-code opnieuw op. Bij herhaalde pogingen wordt de simkaart permanent uitgeschakeld."</string>
@@ -129,6 +135,19 @@
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"U heeft uw ontgrendelingspatroon <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 uw telefoon te ontgrendelen via een e-mailaccount.\n\n Probeer het over <xliff:g id="NUMBER_2">%d</xliff:g> seconden opnieuw."</string>
<string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
<string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Verwijderen"</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"Onjuiste pincode voor simkaart. U moet nu contact opnemen met uw provider om uw apparaat te ontgrendelen."</string>
+ <plurals name="kg_password_wrong_pin_code">
+ <item quantity="one" msgid="8134313997799638254">"Onjuiste pincode voor simkaart. U heeft nog <xliff:g id="NUMBER">%d</xliff:g> poging over voordat u contact met uw provider moet opnemen om uw apparaat te ontgrendelen."</item>
+ <item quantity="other" msgid="2215723361575359486">"Onjuiste pincode voor simkaart. U heeft nog <xliff:g id="NUMBER">%d</xliff:g> pogingen over."</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="7077536808291316208">"Simkaart is onbruikbaar. Neem contact op met uw provider."</string>
+ <plurals name="kg_password_wrong_puk_code">
+ <item quantity="one" msgid="3256893607561060649">"Onjuiste pukcode voor simkaart. U heeft nog <xliff:g id="NUMBER">%d</xliff:g> poging over voordat de simkaart definitief onbruikbaar wordt."</item>
+ <item quantity="other" msgid="5477305226026342036">"Onjuiste pukcode voor simkaart. U heeft nog <xliff:g id="NUMBER">%d</xliff:g> pogingen over voordat de simkaart definitief onbruikbaar wordt."</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="6268288093558031564">"Bewerking met pincode voor simkaart mislukt."</string>
+ <string name="kg_password_puk_failed" msgid="2838824369502455984">"Bewerking met pukcode voor simkaart is mislukt."</string>
+ <string name="kg_pin_accepted" msgid="1448241673570020097">"Code geaccepteerd."</string>
<string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Knop voor vorig nummer"</string>
<string name="keyguard_transport_next_description" msgid="4299258300283778305">"Knop voor volgend nummer"</string>
<string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Knop voor onderbreken"</string>
diff --git a/packages/Keyguard/res/values-pl/strings.xml b/packages/Keyguard/res/values-pl/strings.xml
index 15a4a7c..cfcbc46 100644
--- a/packages/Keyguard/res/values-pl/strings.xml
+++ b/packages/Keyguard/res/values-pl/strings.xml
@@ -21,9 +21,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"Wpisz kod PIN."</string>
- <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"Wpisz kod PUK i nowy kod PIN."</string>
- <string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"Kod PUK"</string>
- <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"Nowy PIN"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="3035856550289724338">"Wpisz PUK i nowy kod PIN karty SIM"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="1801941051094974609">"Kod PUK karty SIM"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="3201151840570492538">"Nowy kod PIN karty SIM"</string>
<string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"Dotknij, aby wpisać hasło."</font></string>
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Wpisz hasło, aby odblokować."</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Wpisz kod PIN, aby odblokować."</string>
@@ -71,6 +71,13 @@
<string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Przycisk wstrzymania"</string>
<string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Przycisk odtwarzania"</string>
<string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Przycisk zatrzymania"</string>
+ <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Podoba mi siÄ™"</string>
+ <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Nie podoba mi siÄ™"</string>
+ <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Serce"</string>
+ <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Odblokuj, by kontynuować"</string>
+ <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Uruchomienie anulowane"</string>
+ <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Upuść <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>, by usunąć."</string>
+ <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> nie zostanie usunięty."</string>
<string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
<string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
<string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
@@ -105,7 +112,6 @@
<string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"Podaj wybrany kod PIN"</string>
<string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"Potwierdź wybrany kod PIN"</string>
<string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"Odblokowuję kartę SIM…"</string>
- <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"Nieprawidłowy PIN."</string>
<string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"Wpisz PIN o długości od 4 do 8 cyfr."</string>
<string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"Kod PUK musi mieć co najmniej 8 cyfr."</string>
<string name="kg_invalid_puk" msgid="3638289409676051243">"Ponownie podaj poprawny kod PUK. Nieudane próby spowodują trwałe wyłączenie karty SIM."</string>
@@ -129,6 +135,19 @@
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Po raz <xliff:g id="NUMBER_0">%d</xliff:g> nieprawidłowo narysowałeś wzór odblokowania. Po kolejnych <xliff:g id="NUMBER_1">%d</xliff:g> nieudanych próbach konieczne będzie odblokowanie telefonu przy użyciu danych logowania na konto Google.\n\n Spróbuj ponownie za <xliff:g id="NUMBER_2">%d</xliff:g> s."</string>
<string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" – "</string>
<string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Usuń"</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"Nieprawidłowy kod PIN karty SIM. Musisz teraz skontaktować się z operatorem, by odblokował Twoje urządzenie."</string>
+ <plurals name="kg_password_wrong_pin_code">
+ <item quantity="one" msgid="8134313997799638254">"Nieprawidłowy kod PIN karty SIM. Masz jeszcze <xliff:g id="NUMBER">%d</xliff:g> próbę, zanim będziesz musiał skontaktować się z operatorem, by odblokował Twoje urządzenie."</item>
+ <item quantity="other" msgid="2215723361575359486">"Nieprawidłowy kod PIN karty SIM. Masz jeszcze <xliff:g id="NUMBER">%d</xliff:g> prób(y)."</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="7077536808291316208">"Karta SIM została trwale zablokowana. Skontaktuj się z operatorem."</string>
+ <plurals name="kg_password_wrong_puk_code">
+ <item quantity="one" msgid="3256893607561060649">"Nieprawidłowy kod PUK karty SIM. Masz jeszcze <xliff:g id="NUMBER">%d</xliff:g> próbę, zanim karta SIM zostanie trwale zablokowana."</item>
+ <item quantity="other" msgid="5477305226026342036">"Nieprawidłowy kod PUK karty SIM. Masz jeszcze <xliff:g id="NUMBER">%d</xliff:g> prób(y), zanim karta SIM zostanie trwale zablokowana."</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="6268288093558031564">"Operacja z kodem PIN karty SIM nie udała się."</string>
+ <string name="kg_password_puk_failed" msgid="2838824369502455984">"Operacja z kodem PUK karty SIM nie udała się."</string>
+ <string name="kg_pin_accepted" msgid="1448241673570020097">"Kod został zaakceptowany."</string>
<string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Przycisk poprzedniego utworu"</string>
<string name="keyguard_transport_next_description" msgid="4299258300283778305">"Przycisk następnego utworu"</string>
<string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Przycisk wstrzymania"</string>
diff --git a/packages/Keyguard/res/values-pt-rPT/strings.xml b/packages/Keyguard/res/values-pt-rPT/strings.xml
index 222051c..abd4fcd 100644
--- a/packages/Keyguard/res/values-pt-rPT/strings.xml
+++ b/packages/Keyguard/res/values-pt-rPT/strings.xml
@@ -21,9 +21,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"Escreva o código PIN"</string>
- <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"Escreva o PUK e o novo código PIN"</string>
- <string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"Código PUK"</string>
- <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"Novo código PIN"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="3035856550289724338">"Introduzir PUK do cartão SIM e o novo código PIN"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="1801941051094974609">"Código PUK do cartão SIM"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="3201151840570492538">"Novo código PIN do cartão SIM"</string>
<string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"Toque para escrever a palavra-passe"</font></string>
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Escreva a palavra-passe para desbloquear"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Escreva o PIN para desbloquear"</string>
@@ -71,6 +71,13 @@
<string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Botão Pausa"</string>
<string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Botão Reproduzir"</string>
<string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Botão Parar"</string>
+ <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Gosto"</string>
+ <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Não gosto"</string>
+ <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Coração"</string>
+ <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Desbloquear para continuar"</string>
+ <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Lançamento cancelado"</string>
+ <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Largue <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> para eliminar."</string>
+ <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> não será eliminado."</string>
<string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
<string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
<string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
@@ -105,7 +112,6 @@
<string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"Introduza o código PIN pretendido"</string>
<string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"Confirme o código PIN pretendido"</string>
<string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"A desbloquear cartão SIM..."</string>
- <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"Código PIN incorreto."</string>
<string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"Introduza um PIN entre 4 e 8 números."</string>
<string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"O código PUK deve ter 8 ou mais números."</string>
<string name="kg_invalid_puk" msgid="3638289409676051243">"Volte a introduzir o código PUK correto. Demasiadas tentativas consecutivas irão desativar permanentemente o SIM."</string>
@@ -129,6 +135,19 @@
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Desenhou a sequência de desbloqueio incorretamente <xliff:g id="NUMBER_0">%d</xliff:g> vezes. Depois de mais <xliff:g id="NUMBER_1">%d</xliff:g> tentativas sem sucesso, ser-lhe-á pedido para desbloquear o telemóvel através de uma conta de email.\n\n Tente novamente dentro de <xliff:g id="NUMBER_2">%d</xliff:g> segundos."</string>
<string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" - "</string>
<string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Remover"</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"Código PIN do cartão SIM incorreto. Tem de contactar o seu operador para desbloquear o dispositivo."</string>
+ <plurals name="kg_password_wrong_pin_code">
+ <item quantity="one" msgid="8134313997799638254">"Código PIN do cartão SIM incorreto. Tem mais <xliff:g id="NUMBER">%d</xliff:g> tentativa antes de necessitar de contactar o seu operador para desbloquear o dispositivo."</item>
+ <item quantity="other" msgid="2215723361575359486">"Código PIN do cartão SIM incorreto. Tem mais <xliff:g id="NUMBER">%d</xliff:g> tentativas."</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="7077536808291316208">"Cartão SIM inutilizável. Contacte o seu operador."</string>
+ <plurals name="kg_password_wrong_puk_code">
+ <item quantity="one" msgid="3256893607561060649">"Código PUK do cartão SIM incorreto. Tem mais <xliff:g id="NUMBER">%d</xliff:g> tentativa antes de o cartão SIM ficar permanentemente inutilizável."</item>
+ <item quantity="other" msgid="5477305226026342036">"Código PUK do cartão SIM incorreto. Tem mais <xliff:g id="NUMBER">%d</xliff:g> tentativas antes de o cartão SIM ficar permanentemente inutilizável."</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="6268288093558031564">"Falha ao introduzir o PIN do cartão SIM!"</string>
+ <string name="kg_password_puk_failed" msgid="2838824369502455984">"Falha ao introduzir o PUK do cartão SIM!"</string>
+ <string name="kg_pin_accepted" msgid="1448241673570020097">"Código aceite!"</string>
<string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Botão Faixa anterior"</string>
<string name="keyguard_transport_next_description" msgid="4299258300283778305">"Botão Faixa seguinte"</string>
<string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Botão Pausa"</string>
diff --git a/packages/Keyguard/res/values-pt/strings.xml b/packages/Keyguard/res/values-pt/strings.xml
index a563372..24d78e5 100644
--- a/packages/Keyguard/res/values-pt/strings.xml
+++ b/packages/Keyguard/res/values-pt/strings.xml
@@ -21,9 +21,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"Insira o código PIN"</string>
- <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"Insira o PUK e o novo código PIN"</string>
- <string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"Código PUK"</string>
- <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"Novo código PIN"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="3035856550289724338">"Digite o PUK do SIM e o novo código PIN."</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="1801941051094974609">"Código PUK do SIM"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="3201151840570492538">"Novo código PIN do SIM"</string>
<string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"Toque para inserir a senha"</font></string>
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Digite a senha para desbloquear"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Insira o PIN para desbloquear"</string>
@@ -71,6 +71,13 @@
<string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Botão \"Pausar\""</string>
<string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Botão \"Reproduzir\""</string>
<string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Botão \"Parar\""</string>
+ <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Gostei"</string>
+ <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Não gostei"</string>
+ <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Coração"</string>
+ <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Desbloqueie para continuar"</string>
+ <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Inicialização cancelada"</string>
+ <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Solte <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> para excluir."</string>
+ <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> não será excluído."</string>
<string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
<string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
<string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
@@ -105,7 +112,6 @@
<string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"Digite o código PIN desejado"</string>
<string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"Confirme o código PIN desejado"</string>
<string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"Desbloqueando o cartão SIM…"</string>
- <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"Código PIN incorreto."</string>
<string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"Digite um PIN com quatro a oito números."</string>
<string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"O código PUK deve ter 8 números ou mais."</string>
<string name="kg_invalid_puk" msgid="3638289409676051243">"Introduza novamente o código PUK correto. Muitas tentativas malsucedidas desativarão permanentemente o SIM."</string>
@@ -129,6 +135,19 @@
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Você desenhou sua sequência de desbloqueio incorretamente <xliff:g id="NUMBER_0">%d</xliff:g> vezes. Se fizer mais <xliff:g id="NUMBER_1">%d</xliff:g> tentativas incorretas, será solicitado que você use o login do Google para desbloquear.\n\n Tente novamente em <xliff:g id="NUMBER_2">%d</xliff:g> segundos."</string>
<string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
<string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Remover"</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"Código PIN do SIM incorreto. Entre em contato com a operadora para desbloquear o dispositivo."</string>
+ <plurals name="kg_password_wrong_pin_code">
+ <item quantity="one" msgid="8134313997799638254">"Código PIN do SIM incorreto. Tentativas restantes: <xliff:g id="NUMBER">%d</xliff:g>. Caso o código correto não seja digitado, será necessário entrar em contato com a operadora para desbloquear o dispositivo."</item>
+ <item quantity="other" msgid="2215723361575359486">"Código PIN do SIM incorreto. Tentativas restantes: <xliff:g id="NUMBER">%d</xliff:g>."</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="7077536808291316208">"O SIM está inutilizável. Entre em contato com a operadora."</string>
+ <plurals name="kg_password_wrong_puk_code">
+ <item quantity="one" msgid="3256893607561060649">"Código PUK do SIM incorreto. Tentativas restantes: <xliff:g id="NUMBER">%d</xliff:g> Caso o código correto não seja digitado, o SIM se tornará permanentemente inutilizável."</item>
+ <item quantity="other" msgid="5477305226026342036">"Código PUK do SIM incorreto. Tentativas restantes: <xliff:g id="NUMBER">%d</xliff:g>. Caso o código correto não seja digitado, o SIM se tornará permanentemente inutilizável."</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="6268288093558031564">"Falha na operação de PIN do SIM."</string>
+ <string name="kg_password_puk_failed" msgid="2838824369502455984">"Falha na operação de PUK do SIM."</string>
+ <string name="kg_pin_accepted" msgid="1448241673570020097">"Código aceito."</string>
<string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Botão \"Faixa anterior\""</string>
<string name="keyguard_transport_next_description" msgid="4299258300283778305">"Botão \"Próxima faixa\""</string>
<string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Botão \"Pausar\""</string>
diff --git a/packages/Keyguard/res/values-rm/strings.xml b/packages/Keyguard/res/values-rm/strings.xml
index 8dda055..ee26a3d 100644
--- a/packages/Keyguard/res/values-rm/strings.xml
+++ b/packages/Keyguard/res/values-rm/strings.xml
@@ -22,11 +22,11 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<!-- no translation found for keyguard_password_enter_pin_code (3037685796058495017) -->
<skip />
- <!-- no translation found for keyguard_password_enter_puk_code (4800725266925845333) -->
+ <!-- no translation found for keyguard_password_enter_puk_code (3035856550289724338) -->
<skip />
- <!-- no translation found for keyguard_password_enter_puk_prompt (1341112146710087048) -->
+ <!-- no translation found for keyguard_password_enter_puk_prompt (1801941051094974609) -->
<skip />
- <!-- no translation found for keyguard_password_enter_pin_prompt (8027680321614196258) -->
+ <!-- no translation found for keyguard_password_enter_pin_prompt (3201151840570492538) -->
<skip />
<!-- no translation found for keyguard_password_entry_touch_hint (7858547464982981384) -->
<skip />
@@ -121,6 +121,20 @@
<skip />
<!-- no translation found for keyguard_accessibility_transport_stop_description (7656358482980912216) -->
<skip />
+ <!-- no translation found for keyguard_accessibility_transport_thumbs_up_description (4535938129663903194) -->
+ <skip />
+ <!-- no translation found for keyguard_accessibility_transport_thumbs_down_description (8101433677192177861) -->
+ <skip />
+ <!-- no translation found for keyguard_accessibility_transport_heart_description (2336943232474689887) -->
+ <skip />
+ <!-- no translation found for keyguard_accessibility_show_bouncer (5425837272418176176) -->
+ <skip />
+ <!-- no translation found for keyguard_accessibility_hide_bouncer (7896992171878309358) -->
+ <skip />
+ <!-- no translation found for keyguard_accessibility_delete_widget_start (4096550552634391451) -->
+ <skip />
+ <!-- no translation found for keyguard_accessibility_delete_widget_end (508833506780909393) -->
+ <skip />
<string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
<string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
<string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
@@ -186,8 +200,6 @@
<skip />
<!-- no translation found for kg_sim_unlock_progress_dialog_message (8950398016976865762) -->
<skip />
- <!-- no translation found for kg_password_wrong_pin_code (1139324887413846912) -->
- <skip />
<!-- no translation found for kg_invalid_sim_pin_hint (8795159358110620001) -->
<skip />
<!-- no translation found for kg_invalid_sim_puk_hint (7553388325654369575) -->
@@ -234,6 +246,20 @@
<skip />
<!-- no translation found for kg_reordering_delete_drop_target_text (7899202978204438708) -->
<skip />
+ <!-- no translation found for kg_password_wrong_pin_code_pukked (30531039455764924) -->
+ <skip />
+ <!-- no translation found for kg_password_wrong_pin_code:one (8134313997799638254) -->
+ <!-- no translation found for kg_password_wrong_pin_code:other (2215723361575359486) -->
+ <!-- no translation found for kg_password_wrong_puk_code_dead (7077536808291316208) -->
+ <skip />
+ <!-- no translation found for kg_password_wrong_puk_code:one (3256893607561060649) -->
+ <!-- no translation found for kg_password_wrong_puk_code:other (5477305226026342036) -->
+ <!-- no translation found for kg_password_pin_failed (6268288093558031564) -->
+ <skip />
+ <!-- no translation found for kg_password_puk_failed (2838824369502455984) -->
+ <skip />
+ <!-- no translation found for kg_pin_accepted (1448241673570020097) -->
+ <skip />
<!-- no translation found for keyguard_transport_prev_description (8229108430245669854) -->
<skip />
<!-- no translation found for keyguard_transport_next_description (4299258300283778305) -->
diff --git a/packages/Keyguard/res/values-ro/strings.xml b/packages/Keyguard/res/values-ro/strings.xml
index 01d79f8..1c7e88f 100644
--- a/packages/Keyguard/res/values-ro/strings.xml
+++ b/packages/Keyguard/res/values-ro/strings.xml
@@ -21,9 +21,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"Introduceţi codul PIN"</string>
- <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"Introduceţi codul PUK şi noul cod PIN"</string>
- <string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"Codul PUK"</string>
- <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"Noul cod PIN"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="3035856550289724338">"Introduceți codul PUK pentru cardul SIM și codul PIN nou"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="1801941051094974609">"Codul PUK pentru cardul SIM"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="3201151840570492538">"Codul PIN nou pentru cardul SIM"</string>
<string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"Atingeţi şi introduceţi parola"</font></string>
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Introduceţi parola pentru a debloca"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Introduceţi codul PIN pentru a debloca"</string>
@@ -71,6 +71,13 @@
<string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Butonul Întrerupeți"</string>
<string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Butonul Redați"</string>
<string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Butonul Opriți"</string>
+ <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Vot pozitiv"</string>
+ <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Vot negativ"</string>
+ <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Inimă"</string>
+ <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Deblocați pentru a continua"</string>
+ <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Lansare anulată"</string>
+ <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Eliberați <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> pentru a șterge."</string>
+ <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"Widgetul <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> nu va fi șters."</string>
<string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
<string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
<string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
@@ -105,7 +112,6 @@
<string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"Introduceţi codul PIN dorit"</string>
<string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"Confirmaţi codul PIN dorit"</string>
<string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"Se deblochează cardul SIM..."</string>
- <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"Cod PIN incorect."</string>
<string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"Introduceţi un cod PIN format din 4 până la 8 cifre."</string>
<string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"Codul PUK trebuie să aibă minimum 8 cifre."</string>
<string name="kg_invalid_puk" msgid="3638289409676051243">"Reintroduceţi codul PUK corect. Încercările repetate vor dezactiva definitiv cardul SIM."</string>
@@ -129,6 +135,19 @@
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Aţi desenat incorect modelul pentru deblocare de <xliff:g id="NUMBER_0">%d</xliff:g> ori. După încă <xliff:g id="NUMBER_1">%d</xliff:g> încercări nereuşite, vi se va solicita să deblocaţi telefonul cu ajutorul unui cont de e-mail.\n\n Încercaţi din nou peste <xliff:g id="NUMBER_2">%d</xliff:g> (de) secunde."</string>
<string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
<string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Eliminaţi"</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"Codul PIN pentru cardul SIM este incorect. Contactați operatorul pentru a vă debloca dispozitivul."</string>
+ <plurals name="kg_password_wrong_pin_code">
+ <item quantity="one" msgid="8134313997799638254">"Codul PIN pentru cardul SIM este incorect. V-a mai rămas <xliff:g id="NUMBER">%d</xliff:g> încercare, după care va trebui să contactați operatorul pentru a vă debloca dispozitivul."</item>
+ <item quantity="other" msgid="2215723361575359486">"Codul PIN pentru cardul SIM este incorect. V-au mai rămas <xliff:g id="NUMBER">%d</xliff:g> încercări."</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="7077536808291316208">"Cardul SIM nu poate fi utilizat. Contactați operatorul."</string>
+ <plurals name="kg_password_wrong_puk_code">
+ <item quantity="one" msgid="3256893607561060649">"Codul PUK pentru cardul SIM este incorect. V-a mai rămas <xliff:g id="NUMBER">%d</xliff:g> încercare până când cardul SIM va deveni inutilizabil definitiv."</item>
+ <item quantity="other" msgid="5477305226026342036">"Codul PUK pentru cardul SIM este incorect. V-au mai rămas <xliff:g id="NUMBER">%d</xliff:g> încercări până când cardul SIM va deveni inutilizabil definitiv."</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="6268288093558031564">"Deblocarea cu ajutorul codului PIN pentru cardul SIM nu a reușit!"</string>
+ <string name="kg_password_puk_failed" msgid="2838824369502455984">"Deblocarea cu ajutorul codului PUK pentru cardul SIM nu a reușit!"</string>
+ <string name="kg_pin_accepted" msgid="1448241673570020097">"Cod acceptat!"</string>
<string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Butonul Melodia anterioară"</string>
<string name="keyguard_transport_next_description" msgid="4299258300283778305">"Butonul Melodia următoare"</string>
<string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Butonul Întrerupeți"</string>
diff --git a/packages/Keyguard/res/values-ru/strings.xml b/packages/Keyguard/res/values-ru/strings.xml
index 136982a..48c7442 100644
--- a/packages/Keyguard/res/values-ru/strings.xml
+++ b/packages/Keyguard/res/values-ru/strings.xml
@@ -21,9 +21,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"Введите PIN-код"</string>
- <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"Введите PUK-код и новый PIN-код"</string>
- <string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"PUK-код"</string>
- <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"Ðовый PIN-код"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="3035856550289724338">"Введите PUK-код и новый PIN-код"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="1801941051094974609">"PUK-код"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="3201151840570492538">"Ðовый PIN-код"</string>
<string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"Ðажмите Ð´Ð»Ñ Ð²Ð²Ð¾Ð´Ð° паролÑ"</font></string>
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Введите пароль"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Введите PIN-код"</string>
@@ -71,6 +71,13 @@
<string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Кнопка паузы"</string>
<string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Кнопка воÑпроизведениÑ"</string>
<string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Кнопка выключениÑ"</string>
+ <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"ÐравитÑÑ"</string>
+ <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Ðе нравитÑÑ"</string>
+ <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Рейтинг"</string>
+ <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Разблокируйте Ñкран, чтобы продолжить."</string>
+ <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"ЗапуÑк отменен."</string>
+ <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"ОтпуÑтите виджет \"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g>\", чтобы удалить его."</string>
+ <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"Виджет \"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g>\" не будет удален."</string>
<string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
<string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ÐБВ"</string>
<string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
@@ -105,7 +112,6 @@
<string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"Введите желаемый PIN-код"</string>
<string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"Введите PIN-код ещё раз"</string>
<string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"Разблокировка SIM-карты…"</string>
- <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"Ðеверный PIN-код."</string>
<string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"Введите PIN-код (от 4 до 8 цифр)."</string>
<string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"PUK-код должен Ñодержать не менее 8 Ñимволов."</string>
<string name="kg_invalid_puk" msgid="3638289409676051243">"Введите правильный PUK-код. ПоÑле неÑкольких неудачных попыток SIM-карта будет заблокирована."</string>
@@ -129,6 +135,19 @@
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Ð’Ñ‹ <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="kg_text_message_separator" product="default" msgid="4160700433287233771">" – "</string>
<string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Удалить"</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"Ðеверный PIN-код. ОбратитеÑÑŒ к оператору ÑвÑзи, чтобы разблокировать SIM-карту."</string>
+ <plurals name="kg_password_wrong_pin_code">
+ <item quantity="one" msgid="8134313997799638254">"Ðеверный PIN-код. ОÑталоÑÑŒ попыток: <xliff:g id="NUMBER">%d</xliff:g>. ПоÑле Ñтого SIM-карта будет заблокирована и вам придетÑÑ Ð¾Ð±Ñ€Ð°Ñ‚Ð¸Ñ‚ÑŒÑÑ Ðº оператору ÑвÑзи."</item>
+ <item quantity="other" msgid="2215723361575359486">"Ðеверный PIN-код. ОÑталоÑÑŒ попыток: <xliff:g id="NUMBER">%d</xliff:g>."</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="7077536808291316208">"SIM-карта заблокирована навÑегда. ОбратитеÑÑŒ к оператору ÑвÑзи."</string>
+ <plurals name="kg_password_wrong_puk_code">
+ <item quantity="one" msgid="3256893607561060649">"Ðеверный PUK-код. ОÑталоÑÑŒ попыток: <xliff:g id="NUMBER">%d</xliff:g>. ПоÑле Ñтого SIM-карта будет заблокирована навÑегда."</item>
+ <item quantity="other" msgid="5477305226026342036">"Ðеверный PUK-код. ОÑталоÑÑŒ попыток: <xliff:g id="NUMBER">%d</xliff:g>. ПоÑле Ñтого SIM-карта будет заблокирована навÑегда."</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="6268288093558031564">"Ðе удалоÑÑŒ разблокировать SIM-карту"</string>
+ <string name="kg_password_puk_failed" msgid="2838824369502455984">"Ðе удалоÑÑŒ разблокировать SIM-карту"</string>
+ <string name="kg_pin_accepted" msgid="1448241673570020097">"Код принÑÑ‚"</string>
<string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Кнопка перехода к предыдущему треку"</string>
<string name="keyguard_transport_next_description" msgid="4299258300283778305">"Кнопка перехода к Ñледующему треку"</string>
<string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Кнопка паузы"</string>
diff --git a/packages/Keyguard/res/values-si-rLK/strings.xml b/packages/Keyguard/res/values-si-rLK/strings.xml
new file mode 100644
index 0000000..8904c7e
--- /dev/null
+++ b/packages/Keyguard/res/values-si-rLK/strings.xml
@@ -0,0 +1,140 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"PIN කේතය ටයිප් කරන්න"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"PUK සහ නව PIN කේතය ටයිප් කරන්න"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"PUK කේතය"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"නව PIN කේතය"</string>
+ <string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"මුරපදය ටයිප් කිරීමට ස්පර්෠කරන්න"</font></string>
+ <string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"අගුළු ඇරීමට මුරපදය ටයිප් කරන්න"</string>
+ <string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"අගුළු à·„à·à¶»à·“මට PIN à¶‘à¶š ටයිප් කරන්න"</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"à·€à·à¶»à¶¯à·’ PIN කේතයකි."</string>
+ <string name="keyguard_label_text" msgid="861796461028298424">"අගුළු ඇරීමට, මෙනුව ඔබ෠පසුව 0 ද ඔබන්න."</string>
+ <string name="faceunlock_multiple_failures" msgid="754137583022792429">"මුහුණ à¶·à·à·€à·’තයෙන් අඟුළු à·„à·à¶»à·“මේ උපරිම à¶´à·Šâ€à¶»à¶ºà¶±à·Šà¶­à¶ºà¶±à·Š ගණන ඉක්මව෠ඇත"</string>
+ <string name="keyguard_charged" msgid="3272223906073492454">"à¶…à¶»à·à¶´à·’තයි"</string>
+ <string name="keyguard_plugged_in" msgid="8117572000639998388">"ආරà·à¶´à¶«à¶º වෙමින්, <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+ <string name="keyguard_low_battery" msgid="8143808018719173859">"ඔබගේ ආරà·à¶´à¶šà¶ºà¶§ සම්බන්ධ කරන්න."</string>
+ <string name="keyguard_instructions_when_pattern_disabled" msgid="1332288268600329841">"අගුළු ඇරීමට මෙනුව ඔබන්න."</string>
+ <string name="keyguard_network_locked_message" msgid="9169717779058037168">"à¶¢à·à¶½ අගුළු දම෠ඇත"</string>
+ <string name="keyguard_missing_sim_message_short" msgid="494980561304211931">"SIM à¶´à¶­ නොමà·à¶­"</string>
+ <string name="keyguard_missing_sim_message" product="tablet" msgid="1445849005909260039">"à¶§à·à¶¶à·Šà¶½à¶§à¶ºà·š SIM à¶´à¶­ නොමà·à¶­."</string>
+ <string name="keyguard_missing_sim_message" product="default" msgid="3481110395508637643">"දුරකථනය තුල SIM à¶´à¶­à¶šà·Š à¶±à·à¶­."</string>
+ <string name="keyguard_missing_sim_instructions" msgid="5210891509995942250">"SIM පත ඇතුල් කරන්න."</string>
+ <string name="keyguard_missing_sim_instructions_long" msgid="5968985489463870358">"SIM à¶´à¶­ නොමà·à¶­ හ෠කියවිය නොහà·à¶š. SIM à¶´à¶­à¶šà·Š ඇතුල් කරන්න."</string>
+ <string name="keyguard_permanent_disabled_sim_message_short" msgid="8340813989586622356">"à¶·à·à·€à·’à¶­à· à¶šà·… නොහà·à¶šà·’ SIM à¶´à¶­."</string>
+ <string name="keyguard_permanent_disabled_sim_instructions" msgid="5892940909699723544">"ඔබගේ SIM à¶´à¶­ ස්ථිරව à¶…à¶¶à¶½ à¶šà¶» ඇත.\n වෙනත් SIM à¶´à¶­à¶šà·Š සඳහ෠ඔබගේ නොරà·à·„à·à¶±à·Š සේව෠සà·à¶´à¶ºà·”ම්කරු සම්බන්ධ කරගන්න."</string>
+ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM පත අගුළු දම෠ඇත."</string>
+ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM පත PUK අගුළු ල෠ඇත."</string>
+ <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"SIM පත අගුළු හරිමින්..."</string>
+ <!-- String.format failed for translation -->
+ <!-- no translation found for keyguard_accessibility_widget_changed (5678624624681400191) -->
+ <skip />
+ <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"විජටය එකතු කරන්න."</string>
+ <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"හිස්"</string>
+ <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"අගුළු අරින à¶´à·Šâ€à¶»à¶¯à·šà·à¶º විදහ෠ඇත."</string>
+ <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"අගුළු අරින à¶´à·Šâ€à¶»à¶¯à·šà·à¶º à·„à·à¶šà·’ලී ඇත."</string>
+ <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> විජට්."</string>
+ <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"පරිà·à·“ලක à¶­à·à¶»à¶±à·Šà¶±à·"</string>
+ <string name="keyguard_accessibility_status" msgid="8008264603935930611">"තත්වය"</string>
+ <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"à¶šà·à¶¸à¶»à·à·€"</string>
+ <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"මà·à¶°à·Šâ€à¶º à¶´à·à¶½à¶š"</string>
+ <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"විජටය à¶±à·à·€à¶­ අනුපිළිවෙළට à·ƒà·à¶šà·ƒà·’ම ඇරඹුණි."</string>
+ <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"විජට් à¶±à·à·€à¶­ අනුපිළිවෙලට à·ƒà·à¶šà·ƒà·“ම අවසà·à¶±à¶º."</string>
+ <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> විජටය මà·à¶šà·“ ඇත."</string>
+ <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"අගුළු නොදà·à¶¸à·– à¶´à·Šâ€à¶»à¶¯à·šà·à¶º පුළුල් කරන්න."</string>
+ <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"සර්පණ අගුළු ඇරීම."</string>
+ <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"රට෠අගුළු ඇරීම."</string>
+ <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"මුහුණ à¶·à·à·€à·’තයෙන් අඟුළු à·„à·à¶»à·“ම."</string>
+ <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"PIN අගුළු ඇරීම."</string>
+ <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"මුරපද අගුළු ඇරීම."</string>
+ <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"රට෠ප්â€à¶»à¶¯à·šà·à¶º."</string>
+ <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"සර්පණ à¶´à·Šâ€à¶»à¶¯à·šà·à¶º."</string>
+ <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"පෙර ගීත බොත්තම"</string>
+ <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"ඉදිරි ගීත බොත්තම"</string>
+ <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"විරà·à¶¸ බොත්තම"</string>
+ <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"à¶°à·à·€à¶š බොත්තම"</string>
+ <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"à¶±à·à·€à¶­à·“මේ බොත්තම"</string>
+ <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
+ <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
+ <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
+ <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
+ <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"අවලංගු කරන්න"</string>
+ <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"මකන්න"</string>
+ <string name="keyboardview_keycode_done" msgid="1992571118466679775">"හරි"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"ආකà·à¶»à¶º වෙනස් කරන්න"</string>
+ <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
+ <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"ඇතුල් කරන්න"</string>
+ <string name="description_target_unlock" msgid="2228524900439801453">"අඟුල අරින්න"</string>
+ <string name="description_target_camera" msgid="969071997552486814">"à¶šà·à¶¸à¶»à·à·€"</string>
+ <string name="description_target_silent" msgid="893551287746522182">"නිහඬ"</string>
+ <string name="description_target_soundon" msgid="30052466675500172">"à·à¶¶à·Šà¶¯ සක්â€à¶»à·“ය කරන්න"</string>
+ <string name="description_target_search" msgid="3091587249776033139">"සෙවීම"</string>
+ <string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> සඳහ෠උඩට සර්පණය කරන්න."</string>
+ <string name="description_direction_down" msgid="5087739728639014595">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> සඳහ෠පහලට සර්පණය කරන්න."</string>
+ <string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> සඳහ෠වමට සර්පණය කරන්න."</string>
+ <string name="description_direction_right" msgid="8034433242579600980">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> සඳහ෠දකුණට සර්පණය කරන්න."</string>
+ <string name="user_switched" msgid="3768006783166984410">"දà·à¶±à¶§ සිටින පරිà·à·“ලකය෠<xliff:g id="NAME">%1$s</xliff:g>."</string>
+ <string name="kg_emergency_call_label" msgid="684946192523830531">"හදිසි ඇමතුම"</string>
+ <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"රටà·à·€ අමතකයි"</string>
+ <string name="kg_wrong_pattern" msgid="1850806070801358830">"à·€à·à¶»à¶¯à·’ රටà·à·€à¶šà·’"</string>
+ <string name="kg_wrong_password" msgid="2333281762128113157">"à·€à·à¶»à¶¯à·’ මුරපදය"</string>
+ <string name="kg_wrong_pin" msgid="1131306510833563801">"PIN à¶‘à¶š à·€à·à¶»à¶¯à·’යි"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"à¶­à¶­à·Šà¶´à¶» <xliff:g id="NUMBER">%d</xliff:g> à¶§ පසුව à¶±à·à·€à¶­ උත්සහ කරන්න."</string>
+ <string name="kg_pattern_instructions" msgid="398978611683075868">"ඔබගේ රටà·à·€ අඳින්න"</string>
+ <string name="kg_sim_pin_instructions" msgid="2319508550934557331">"SIM PIN ඇතුලු කරන්න"</string>
+ <string name="kg_pin_instructions" msgid="2377242233495111557">"PIN එක ඇතුළු කරන්න"</string>
+ <string name="kg_password_instructions" msgid="5753646556186936819">"මුරපදය ඇතුළු කරන්න"</string>
+ <string name="kg_puk_enter_puk_hint" msgid="453227143861735537">"දà·à¶±à·Š SIM à¶‘à¶š à¶…à¶¶à¶½ à¶šà¶» ඇත. ඉදිරියට යà·à¶¸à¶§ PUK කේතය යොදන්න. විස්තර සඳහ෠වà·à·„කය෠අමතන්න."</string>
+ <string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"අපේක්ෂිත PIN කේතය ඇතුළත් කරන්න"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"අපේක්ෂිත PIN කේතය ස්ථිර කරන්න"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"SIM පත අගුළු අරිමින්..."</string>
+ <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"à·€à·à¶»à¶¯à·’ PIN කේතයකි."</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"අංක 4 සිට 8 අතර වන PIN එකක් ටයිප් කරන්න."</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"PUK කේතය සංඛ්â€à¶ºà· 8 à¶šà·Š à·„à· à·€à·à¶©à·’ විය යුතුය."</string>
+ <string name="kg_invalid_puk" msgid="3638289409676051243">"නිවà·à¶»à¶¯à·’ PUK කේතය à¶±à·à·€à¶­ ඇතුලත් කරන්න. à¶±à·à·€à¶­ à¶±à·à·€à¶­ à¶‹à¶­à·Šà·ƒà·à·„ කිරීමෙන් SIM à¶‘à¶š ස්ථිරවම à¶…à¶¶à¶½ කරයි."</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"PIN à¶šà·šà¶­ à¶œà·à¶½à¶´à·“ à¶±à·à¶­"</string>
+ <string name="kg_login_too_many_attempts" msgid="6486842094005698475">"රට෠උත්සà·à·„ කිරීම් à·€à·à¶©à·’ය"</string>
+ <string name="kg_login_instructions" msgid="1100551261265506448">"අගුළු ඇරීමට, ඔබගේ Google ගිණුම සමග පුරනය වන්න."</string>
+ <string name="kg_login_username_hint" msgid="5718534272070920364">"පරිà·à·“ලක à¶±à·à¶¸à¶º (à¶Š-à¶­à·à¶´à·‘à¶½)"</string>
+ <string name="kg_login_password_hint" msgid="9057289103827298549">"මුරපදය"</string>
+ <string name="kg_login_submit_button" msgid="5355904582674054702">"පුරනය වන්න"</string>
+ <string name="kg_login_invalid_input" msgid="5754664119319872197">"වලංගු නොවන පරිà·à·“ලක à¶±à·à¶¸à¶ºà¶šà·Š හ෠මුරපදයක්."</string>
+ <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"ඔබගේ පරිà·à·“ලක à¶±à·à¶¸à¶º හ෠මුරපදය අමතකද?\n "<b>"google.com/accounts/recovery"</b>" වෙත යන්න."</string>
+ <string name="kg_login_checking_password" msgid="1052685197710252395">"ගිණුම පරීක්ෂ෠කරමින්…"</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"ඔබ PIN අංකය <xliff:g id="NUMBER_0">%d</xliff:g> à·€à·à¶»à¶ºà¶šà·Š à·€à·à¶»à¶¯à·’යට ටයිප් කොට ඇත.\n\n à¶­à¶­à·Šà¶´à¶» <xliff:g id="NUMBER_1">%d</xliff:g> à¶šà·Š ඇතුළත à¶±à·à·€à¶­ à¶‹à¶­à·Šà·ƒà·à·„ කරන්න."</string>
+ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"<xliff:g id="NUMBER_0">%d</xliff:g> වතà·à·€à¶šà·Š ඔබගේ මුරපදය ඔබ à·€à·à¶»à¶¯à·’යට ටයිප් à¶šà¶» ඇත. \n\nà¶­à¶­à·Šà¶´à¶» <xliff:g id="NUMBER_1">%d</xliff:g> à¶§ පසුව à¶±à·à·€à¶­ උත්සහ කරන්න."</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"ඔබ <xliff:g id="NUMBER_0">%d</xliff:g> à·€à·à¶»à¶ºà¶šà·Š අගුළු ඇරීමේ රටà·à·€ à·€à·à¶»à¶¯à·’යට ඇඳ ඇත. \n\nà¶­à¶­à·Šà¶´à¶» <xliff:g id="NUMBER_1">%d</xliff:g> à¶šà·Š ඇතුළත à¶±à·à·€à¶­ à¶‹à¶­à·Šà·ƒà·à·„ කරන්න."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1575557200627128949">"ඔබ à¶§à·à¶¶à·Šà¶½à¶§à¶º අගුළු à·„à·à¶»à·“මට à·€à·à¶»à¶¯à·’යට අවස්ථ෠<xliff:g id="NUMBER_0">%d</xliff:g> à¶šà·Š à¶‹à¶­à·Šà·ƒà·à·„ à¶šà¶» ඇත. අවස්ථ෠<xliff:g id="NUMBER_1">%d</xliff:g> à¶šà·Š à¶…à·ƒà·à¶»à·Šà¶®à¶šà·€ උත්සහ කිරීමකින් පසුව, කර්මà·à¶±à·Šà¶­ à·à·à¶½à· මුල් තත්වයට à¶±à·à·€à¶­ à¶´à¶­à·Š වන à¶…à¶­à¶» සියලු පරිà·à·“ලක දත්ත à¶±à·à¶­à·’ වෙයි."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="4051015943038199910">"ඔබ දුරකථනය අගුළු ඇරීමට à·€à·à¶» <xliff:g id="NUMBER_0">%d</xliff:g> කදී à·€à·à¶»à¶¯à·“ à¶´à·Šâ€à¶»à¶ºà¶­à·Šà¶±à¶ºà¶±à·Š ගෙන à¶­à·’à¶¶à·š. තවත් à¶…à·ƒà·à¶»à·Šà¶®à¶š à¶´à·Šâ€à¶»à¶ºà¶­à·Šà¶± <xliff:g id="NUMBER_1">%d</xliff:g> කින් පසුව, දුරකථනය කර්මà·à¶±à·Šà¶­ à·à·à¶½à·à·€à·š සුපුරුද්දට යළි පිහිටුවන à¶…à¶­à¶» සියලුම පරිà·à·“ලක දත්ත à¶±à·à¶­à·’ වී යයි."</string>
+ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="2072996269148483637">"à¶§à·à¶¶à·Šà¶½à¶§à¶ºà·š අගුළු ඇරීමට ඔබ à·€à·à¶»à¶¯à·’ à¶´à·Šâ€à¶»à¶ºà¶­à·Šà¶± <xliff:g id="NUMBER">%d</xliff:g> à·€à·à¶»à¶ºà¶šà·Š ගෙන ඇත. දà·à¶±à·Š à¶§à·à¶¶à·Šà¶½à¶§à¶º කර්මà·à¶±à·Šà¶­ à·à·à¶½à· සුපුරුද්ද වෙත යළි පිහිටුවීම කෙරේ."</string>
+ <string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"ඔබ දුරකථනය අගුළු ඇරීමට à·€à·à¶» <xliff:g id="NUMBER">%d</xliff:g> කදී à·€à·à¶»à¶¯à·“ à¶´à·Šâ€à¶»à¶ºà¶±à·Šà¶­à¶ºà¶±à·Š ගෙන à¶­à·’à¶¶à·š. දà·à¶±à·Š දුරකථනය කර්මà·à¶±à·Šà¶­à·à·à¶½à· සුපුරුද්දට පිහිටුවනු ලබයි."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"ඔබ අගුළු ඇරිමේ රටà·à·€ <xliff:g id="NUMBER_0">%d</xliff:g> වතà·à·€à¶šà·Š à·€à·à¶»à¶¯à·’යට ඇඳ ඇත. තවත් à¶…à·ƒà·à¶»à·Šà¶®à¶š à¶‹à¶­à·Šà·ƒà·à·„ <xliff:g id="NUMBER_1">%d</xliff:g> කින් පසුව, à¶Š-à¶­à·à¶´à·à¶½à·Š ගිණුම à¶·à·à·€à·’ත෠කරමින් ඔබගේ à¶§à·à¶¶à·Šà¶½à¶§à¶ºà·š අගුළු ඇරීමට ඔබට පවසනු ඇත.\n\n à¶±à·à·€à¶­ à¶­à¶­à·Šà¶´à¶» <xliff:g id="NUMBER_2">%d</xliff:g> කින් à¶‹à¶­à·Šà·ƒà·à·„ කරන්න."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"ඔබ à·€à·à¶»à¶¯à·’යට <xliff:g id="NUMBER_0">%d</xliff:g> වතà·à·€à¶šà·Š ඔබගේ අගුළු à·„à·à¶»à·“මේ රටà·à·€ ඇඳ ඇත. à¶…à·ƒà·à¶»à·Šà¶®à¶š උත්සහ කිරීම් <xliff:g id="NUMBER_1">%d</xliff:g> න් පසුව, ඔබගේ à¶Š-à¶­à·à¶´à·à¶½à·Š ලිපිනය à¶·à·à·€à·’තයෙන් ඔබගේ දුරකථනය අගුළු à·„à·à¶»à·“මට ඔබගෙන් අසයි.\n\n à¶­à¶­à·Šà¶´à¶» <xliff:g id="NUMBER_2">%d</xliff:g> න් පසුව à¶±à·à·€à¶­ උත්සහ කරන්න."</string>
+ <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
+ <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"ඉවත් කරන්න"</string>
+ <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"පෙර ගීත බොත්තම"</string>
+ <string name="keyguard_transport_next_description" msgid="4299258300283778305">"ඉදිරි ගීත යතුර"</string>
+ <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"විරà·à¶¸ බොත්තම"</string>
+ <string name="keyguard_transport_play_description" msgid="2924628863741150956">"à¶°à·à·€à¶± බොත්තම"</string>
+ <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"à¶±à·à·€à¶­à·”ම් බොත්තම"</string>
+ <string name="keyguard_carrier_default" msgid="8700650403054042153">"සේවà·à·€ à¶±à·à¶­."</string>
+</resources>
diff --git a/packages/Keyguard/res/values-si/strings.xml b/packages/Keyguard/res/values-si/strings.xml
new file mode 100644
index 0000000..8904c7e
--- /dev/null
+++ b/packages/Keyguard/res/values-si/strings.xml
@@ -0,0 +1,140 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"PIN කේතය ටයිප් කරන්න"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"PUK සහ නව PIN කේතය ටයිප් කරන්න"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"PUK කේතය"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"නව PIN කේතය"</string>
+ <string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"මුරපදය ටයිප් කිරීමට ස්පර්෠කරන්න"</font></string>
+ <string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"අගුළු ඇරීමට මුරපදය ටයිප් කරන්න"</string>
+ <string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"අගුළු à·„à·à¶»à·“මට PIN à¶‘à¶š ටයිප් කරන්න"</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"à·€à·à¶»à¶¯à·’ PIN කේතයකි."</string>
+ <string name="keyguard_label_text" msgid="861796461028298424">"අගුළු ඇරීමට, මෙනුව ඔබ෠පසුව 0 ද ඔබන්න."</string>
+ <string name="faceunlock_multiple_failures" msgid="754137583022792429">"මුහුණ à¶·à·à·€à·’තයෙන් අඟුළු à·„à·à¶»à·“මේ උපරිම à¶´à·Šâ€à¶»à¶ºà¶±à·Šà¶­à¶ºà¶±à·Š ගණන ඉක්මව෠ඇත"</string>
+ <string name="keyguard_charged" msgid="3272223906073492454">"à¶…à¶»à·à¶´à·’තයි"</string>
+ <string name="keyguard_plugged_in" msgid="8117572000639998388">"ආරà·à¶´à¶«à¶º වෙමින්, <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+ <string name="keyguard_low_battery" msgid="8143808018719173859">"ඔබගේ ආරà·à¶´à¶šà¶ºà¶§ සම්බන්ධ කරන්න."</string>
+ <string name="keyguard_instructions_when_pattern_disabled" msgid="1332288268600329841">"අගුළු ඇරීමට මෙනුව ඔබන්න."</string>
+ <string name="keyguard_network_locked_message" msgid="9169717779058037168">"à¶¢à·à¶½ අගුළු දම෠ඇත"</string>
+ <string name="keyguard_missing_sim_message_short" msgid="494980561304211931">"SIM à¶´à¶­ නොමà·à¶­"</string>
+ <string name="keyguard_missing_sim_message" product="tablet" msgid="1445849005909260039">"à¶§à·à¶¶à·Šà¶½à¶§à¶ºà·š SIM à¶´à¶­ නොමà·à¶­."</string>
+ <string name="keyguard_missing_sim_message" product="default" msgid="3481110395508637643">"දුරකථනය තුල SIM à¶´à¶­à¶šà·Š à¶±à·à¶­."</string>
+ <string name="keyguard_missing_sim_instructions" msgid="5210891509995942250">"SIM පත ඇතුල් කරන්න."</string>
+ <string name="keyguard_missing_sim_instructions_long" msgid="5968985489463870358">"SIM à¶´à¶­ නොමà·à¶­ හ෠කියවිය නොහà·à¶š. SIM à¶´à¶­à¶šà·Š ඇතුල් කරන්න."</string>
+ <string name="keyguard_permanent_disabled_sim_message_short" msgid="8340813989586622356">"à¶·à·à·€à·’à¶­à· à¶šà·… නොහà·à¶šà·’ SIM à¶´à¶­."</string>
+ <string name="keyguard_permanent_disabled_sim_instructions" msgid="5892940909699723544">"ඔබගේ SIM à¶´à¶­ ස්ථිරව à¶…à¶¶à¶½ à¶šà¶» ඇත.\n වෙනත් SIM à¶´à¶­à¶šà·Š සඳහ෠ඔබගේ නොරà·à·„à·à¶±à·Š සේව෠සà·à¶´à¶ºà·”ම්කරු සම්බන්ධ කරගන්න."</string>
+ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM පත අගුළු දම෠ඇත."</string>
+ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM පත PUK අගුළු ල෠ඇත."</string>
+ <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"SIM පත අගුළු හරිමින්..."</string>
+ <!-- String.format failed for translation -->
+ <!-- no translation found for keyguard_accessibility_widget_changed (5678624624681400191) -->
+ <skip />
+ <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"විජටය එකතු කරන්න."</string>
+ <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"හිස්"</string>
+ <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"අගුළු අරින à¶´à·Šâ€à¶»à¶¯à·šà·à¶º විදහ෠ඇත."</string>
+ <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"අගුළු අරින à¶´à·Šâ€à¶»à¶¯à·šà·à¶º à·„à·à¶šà·’ලී ඇත."</string>
+ <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> විජට්."</string>
+ <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"පරිà·à·“ලක à¶­à·à¶»à¶±à·Šà¶±à·"</string>
+ <string name="keyguard_accessibility_status" msgid="8008264603935930611">"තත්වය"</string>
+ <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"à¶šà·à¶¸à¶»à·à·€"</string>
+ <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"මà·à¶°à·Šâ€à¶º à¶´à·à¶½à¶š"</string>
+ <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"විජටය à¶±à·à·€à¶­ අනුපිළිවෙළට à·ƒà·à¶šà·ƒà·’ම ඇරඹුණි."</string>
+ <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"විජට් à¶±à·à·€à¶­ අනුපිළිවෙලට à·ƒà·à¶šà·ƒà·“ම අවසà·à¶±à¶º."</string>
+ <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> විජටය මà·à¶šà·“ ඇත."</string>
+ <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"අගුළු නොදà·à¶¸à·– à¶´à·Šâ€à¶»à¶¯à·šà·à¶º පුළුල් කරන්න."</string>
+ <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"සර්පණ අගුළු ඇරීම."</string>
+ <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"රට෠අගුළු ඇරීම."</string>
+ <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"මුහුණ à¶·à·à·€à·’තයෙන් අඟුළු à·„à·à¶»à·“ම."</string>
+ <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"PIN අගුළු ඇරීම."</string>
+ <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"මුරපද අගුළු ඇරීම."</string>
+ <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"රට෠ප්â€à¶»à¶¯à·šà·à¶º."</string>
+ <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"සර්පණ à¶´à·Šâ€à¶»à¶¯à·šà·à¶º."</string>
+ <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"පෙර ගීත බොත්තම"</string>
+ <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"ඉදිරි ගීත බොත්තම"</string>
+ <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"විරà·à¶¸ බොත්තම"</string>
+ <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"à¶°à·à·€à¶š බොත්තම"</string>
+ <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"à¶±à·à·€à¶­à·“මේ බොත්තම"</string>
+ <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
+ <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
+ <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
+ <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
+ <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"අවලංගු කරන්න"</string>
+ <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"මකන්න"</string>
+ <string name="keyboardview_keycode_done" msgid="1992571118466679775">"හරි"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"ආකà·à¶»à¶º වෙනස් කරන්න"</string>
+ <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
+ <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"ඇතුල් කරන්න"</string>
+ <string name="description_target_unlock" msgid="2228524900439801453">"අඟුල අරින්න"</string>
+ <string name="description_target_camera" msgid="969071997552486814">"à¶šà·à¶¸à¶»à·à·€"</string>
+ <string name="description_target_silent" msgid="893551287746522182">"නිහඬ"</string>
+ <string name="description_target_soundon" msgid="30052466675500172">"à·à¶¶à·Šà¶¯ සක්â€à¶»à·“ය කරන්න"</string>
+ <string name="description_target_search" msgid="3091587249776033139">"සෙවීම"</string>
+ <string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> සඳහ෠උඩට සර්පණය කරන්න."</string>
+ <string name="description_direction_down" msgid="5087739728639014595">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> සඳහ෠පහලට සර්පණය කරන්න."</string>
+ <string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> සඳහ෠වමට සර්පණය කරන්න."</string>
+ <string name="description_direction_right" msgid="8034433242579600980">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> සඳහ෠දකුණට සර්පණය කරන්න."</string>
+ <string name="user_switched" msgid="3768006783166984410">"දà·à¶±à¶§ සිටින පරිà·à·“ලකය෠<xliff:g id="NAME">%1$s</xliff:g>."</string>
+ <string name="kg_emergency_call_label" msgid="684946192523830531">"හදිසි ඇමතුම"</string>
+ <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"රටà·à·€ අමතකයි"</string>
+ <string name="kg_wrong_pattern" msgid="1850806070801358830">"à·€à·à¶»à¶¯à·’ රටà·à·€à¶šà·’"</string>
+ <string name="kg_wrong_password" msgid="2333281762128113157">"à·€à·à¶»à¶¯à·’ මුරපදය"</string>
+ <string name="kg_wrong_pin" msgid="1131306510833563801">"PIN à¶‘à¶š à·€à·à¶»à¶¯à·’යි"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"à¶­à¶­à·Šà¶´à¶» <xliff:g id="NUMBER">%d</xliff:g> à¶§ පසුව à¶±à·à·€à¶­ උත්සහ කරන්න."</string>
+ <string name="kg_pattern_instructions" msgid="398978611683075868">"ඔබගේ රටà·à·€ අඳින්න"</string>
+ <string name="kg_sim_pin_instructions" msgid="2319508550934557331">"SIM PIN ඇතුලු කරන්න"</string>
+ <string name="kg_pin_instructions" msgid="2377242233495111557">"PIN එක ඇතුළු කරන්න"</string>
+ <string name="kg_password_instructions" msgid="5753646556186936819">"මුරපදය ඇතුළු කරන්න"</string>
+ <string name="kg_puk_enter_puk_hint" msgid="453227143861735537">"දà·à¶±à·Š SIM à¶‘à¶š à¶…à¶¶à¶½ à¶šà¶» ඇත. ඉදිරියට යà·à¶¸à¶§ PUK කේතය යොදන්න. විස්තර සඳහ෠වà·à·„කය෠අමතන්න."</string>
+ <string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"අපේක්ෂිත PIN කේතය ඇතුළත් කරන්න"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"අපේක්ෂිත PIN කේතය ස්ථිර කරන්න"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"SIM පත අගුළු අරිමින්..."</string>
+ <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"à·€à·à¶»à¶¯à·’ PIN කේතයකි."</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"අංක 4 සිට 8 අතර වන PIN එකක් ටයිප් කරන්න."</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"PUK කේතය සංඛ්â€à¶ºà· 8 à¶šà·Š à·„à· à·€à·à¶©à·’ විය යුතුය."</string>
+ <string name="kg_invalid_puk" msgid="3638289409676051243">"නිවà·à¶»à¶¯à·’ PUK කේතය à¶±à·à·€à¶­ ඇතුලත් කරන්න. à¶±à·à·€à¶­ à¶±à·à·€à¶­ à¶‹à¶­à·Šà·ƒà·à·„ කිරීමෙන් SIM à¶‘à¶š ස්ථිරවම à¶…à¶¶à¶½ කරයි."</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"PIN à¶šà·šà¶­ à¶œà·à¶½à¶´à·“ à¶±à·à¶­"</string>
+ <string name="kg_login_too_many_attempts" msgid="6486842094005698475">"රට෠උත්සà·à·„ කිරීම් à·€à·à¶©à·’ය"</string>
+ <string name="kg_login_instructions" msgid="1100551261265506448">"අගුළු ඇරීමට, ඔබගේ Google ගිණුම සමග පුරනය වන්න."</string>
+ <string name="kg_login_username_hint" msgid="5718534272070920364">"පරිà·à·“ලක à¶±à·à¶¸à¶º (à¶Š-à¶­à·à¶´à·‘à¶½)"</string>
+ <string name="kg_login_password_hint" msgid="9057289103827298549">"මුරපදය"</string>
+ <string name="kg_login_submit_button" msgid="5355904582674054702">"පුරනය වන්න"</string>
+ <string name="kg_login_invalid_input" msgid="5754664119319872197">"වලංගු නොවන පරිà·à·“ලක à¶±à·à¶¸à¶ºà¶šà·Š හ෠මුරපදයක්."</string>
+ <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"ඔබගේ පරිà·à·“ලක à¶±à·à¶¸à¶º හ෠මුරපදය අමතකද?\n "<b>"google.com/accounts/recovery"</b>" වෙත යන්න."</string>
+ <string name="kg_login_checking_password" msgid="1052685197710252395">"ගිණුම පරීක්ෂ෠කරමින්…"</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"ඔබ PIN අංකය <xliff:g id="NUMBER_0">%d</xliff:g> à·€à·à¶»à¶ºà¶šà·Š à·€à·à¶»à¶¯à·’යට ටයිප් කොට ඇත.\n\n à¶­à¶­à·Šà¶´à¶» <xliff:g id="NUMBER_1">%d</xliff:g> à¶šà·Š ඇතුළත à¶±à·à·€à¶­ à¶‹à¶­à·Šà·ƒà·à·„ කරන්න."</string>
+ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"<xliff:g id="NUMBER_0">%d</xliff:g> වතà·à·€à¶šà·Š ඔබගේ මුරපදය ඔබ à·€à·à¶»à¶¯à·’යට ටයිප් à¶šà¶» ඇත. \n\nà¶­à¶­à·Šà¶´à¶» <xliff:g id="NUMBER_1">%d</xliff:g> à¶§ පසුව à¶±à·à·€à¶­ උත්සහ කරන්න."</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"ඔබ <xliff:g id="NUMBER_0">%d</xliff:g> à·€à·à¶»à¶ºà¶šà·Š අගුළු ඇරීමේ රටà·à·€ à·€à·à¶»à¶¯à·’යට ඇඳ ඇත. \n\nà¶­à¶­à·Šà¶´à¶» <xliff:g id="NUMBER_1">%d</xliff:g> à¶šà·Š ඇතුළත à¶±à·à·€à¶­ à¶‹à¶­à·Šà·ƒà·à·„ කරන්න."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1575557200627128949">"ඔබ à¶§à·à¶¶à·Šà¶½à¶§à¶º අගුළු à·„à·à¶»à·“මට à·€à·à¶»à¶¯à·’යට අවස්ථ෠<xliff:g id="NUMBER_0">%d</xliff:g> à¶šà·Š à¶‹à¶­à·Šà·ƒà·à·„ à¶šà¶» ඇත. අවස්ථ෠<xliff:g id="NUMBER_1">%d</xliff:g> à¶šà·Š à¶…à·ƒà·à¶»à·Šà¶®à¶šà·€ උත්සහ කිරීමකින් පසුව, කර්මà·à¶±à·Šà¶­ à·à·à¶½à· මුල් තත්වයට à¶±à·à·€à¶­ à¶´à¶­à·Š වන à¶…à¶­à¶» සියලු පරිà·à·“ලක දත්ත à¶±à·à¶­à·’ වෙයි."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="4051015943038199910">"ඔබ දුරකථනය අගුළු ඇරීමට à·€à·à¶» <xliff:g id="NUMBER_0">%d</xliff:g> කදී à·€à·à¶»à¶¯à·“ à¶´à·Šâ€à¶»à¶ºà¶­à·Šà¶±à¶ºà¶±à·Š ගෙන à¶­à·’à¶¶à·š. තවත් à¶…à·ƒà·à¶»à·Šà¶®à¶š à¶´à·Šâ€à¶»à¶ºà¶­à·Šà¶± <xliff:g id="NUMBER_1">%d</xliff:g> කින් පසුව, දුරකථනය කර්මà·à¶±à·Šà¶­ à·à·à¶½à·à·€à·š සුපුරුද්දට යළි පිහිටුවන à¶…à¶­à¶» සියලුම පරිà·à·“ලක දත්ත à¶±à·à¶­à·’ වී යයි."</string>
+ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="2072996269148483637">"à¶§à·à¶¶à·Šà¶½à¶§à¶ºà·š අගුළු ඇරීමට ඔබ à·€à·à¶»à¶¯à·’ à¶´à·Šâ€à¶»à¶ºà¶­à·Šà¶± <xliff:g id="NUMBER">%d</xliff:g> à·€à·à¶»à¶ºà¶šà·Š ගෙන ඇත. දà·à¶±à·Š à¶§à·à¶¶à·Šà¶½à¶§à¶º කර්මà·à¶±à·Šà¶­ à·à·à¶½à· සුපුරුද්ද වෙත යළි පිහිටුවීම කෙරේ."</string>
+ <string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"ඔබ දුරකථනය අගුළු ඇරීමට à·€à·à¶» <xliff:g id="NUMBER">%d</xliff:g> කදී à·€à·à¶»à¶¯à·“ à¶´à·Šâ€à¶»à¶ºà¶±à·Šà¶­à¶ºà¶±à·Š ගෙන à¶­à·’à¶¶à·š. දà·à¶±à·Š දුරකථනය කර්මà·à¶±à·Šà¶­à·à·à¶½à· සුපුරුද්දට පිහිටුවනු ලබයි."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"ඔබ අගුළු ඇරිමේ රටà·à·€ <xliff:g id="NUMBER_0">%d</xliff:g> වතà·à·€à¶šà·Š à·€à·à¶»à¶¯à·’යට ඇඳ ඇත. තවත් à¶…à·ƒà·à¶»à·Šà¶®à¶š à¶‹à¶­à·Šà·ƒà·à·„ <xliff:g id="NUMBER_1">%d</xliff:g> කින් පසුව, à¶Š-à¶­à·à¶´à·à¶½à·Š ගිණුම à¶·à·à·€à·’ත෠කරමින් ඔබගේ à¶§à·à¶¶à·Šà¶½à¶§à¶ºà·š අගුළු ඇරීමට ඔබට පවසනු ඇත.\n\n à¶±à·à·€à¶­ à¶­à¶­à·Šà¶´à¶» <xliff:g id="NUMBER_2">%d</xliff:g> කින් à¶‹à¶­à·Šà·ƒà·à·„ කරන්න."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"ඔබ à·€à·à¶»à¶¯à·’යට <xliff:g id="NUMBER_0">%d</xliff:g> වතà·à·€à¶šà·Š ඔබගේ අගුළු à·„à·à¶»à·“මේ රටà·à·€ ඇඳ ඇත. à¶…à·ƒà·à¶»à·Šà¶®à¶š උත්සහ කිරීම් <xliff:g id="NUMBER_1">%d</xliff:g> න් පසුව, ඔබගේ à¶Š-à¶­à·à¶´à·à¶½à·Š ලිපිනය à¶·à·à·€à·’තයෙන් ඔබගේ දුරකථනය අගුළු à·„à·à¶»à·“මට ඔබගෙන් අසයි.\n\n à¶­à¶­à·Šà¶´à¶» <xliff:g id="NUMBER_2">%d</xliff:g> න් පසුව à¶±à·à·€à¶­ උත්සහ කරන්න."</string>
+ <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
+ <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"ඉවත් කරන්න"</string>
+ <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"පෙර ගීත බොත්තම"</string>
+ <string name="keyguard_transport_next_description" msgid="4299258300283778305">"ඉදිරි ගීත යතුර"</string>
+ <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"විරà·à¶¸ බොත්තම"</string>
+ <string name="keyguard_transport_play_description" msgid="2924628863741150956">"à¶°à·à·€à¶± බොත්තම"</string>
+ <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"à¶±à·à·€à¶­à·”ම් බොත්තම"</string>
+ <string name="keyguard_carrier_default" msgid="8700650403054042153">"සේවà·à·€ à¶±à·à¶­."</string>
+</resources>
diff --git a/packages/Keyguard/res/values-sk/strings.xml b/packages/Keyguard/res/values-sk/strings.xml
index 4b2e1e3..cdf8ca9 100644
--- a/packages/Keyguard/res/values-sk/strings.xml
+++ b/packages/Keyguard/res/values-sk/strings.xml
@@ -21,9 +21,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"Zadajte kód PIN"</string>
- <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"Zadajte kód PUK a nový kód PIN"</string>
- <string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"Kód PUK"</string>
- <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"Nový kód PIN"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="3035856550289724338">"Zadajte kód PUK karty SIM a nový kód PIN"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="1801941051094974609">"Kód PUK karty SIM"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="3201151840570492538">"Nový kód PIN karty SIM"</string>
<string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"Dotknutím zadajte heslo"</font></string>
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Zadajte heslo na odomknutie"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Zadajte kód PIN na odomknutie"</string>
@@ -71,6 +71,13 @@
<string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"TlaÄidlo PozastaviÅ¥"</string>
<string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"TlaÄidlo PrehraÅ¥"</string>
<string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"TlaÄidlo ZastaviÅ¥"</string>
+ <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"PáÄi sa mi"</string>
+ <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"NepáÄi sa mi"</string>
+ <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Srdce"</string>
+ <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Odomknite zariadenie a pokraÄujte"</string>
+ <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Spustenie bolo zrušené"</string>
+ <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Uvoľnením dotyku miniaplikáciu <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> odstránite."</string>
+ <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"Miniaplikácia <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> nebude odstránená."</string>
<string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
<string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
<string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
@@ -105,7 +112,6 @@
<string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"Zadajte požadovaný kód PIN"</string>
<string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"PotvrÄte požadovaný kód PIN"</string>
<string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"Prebieha odomykanie karty SIM..."</string>
- <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"Nesprávny kód PIN."</string>
<string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"Zadajte kód PIN s dĺžkou 4 až 8 Äíslic."</string>
<string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"Kód PUK musí obsahovaÅ¥ 8 alebo viac Äíslic."</string>
<string name="kg_invalid_puk" msgid="3638289409676051243">"Znova zadajte správny kód PUK. Opakované pokusy zakážu kartu SIM natrvalo."</string>
@@ -129,6 +135,19 @@
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"<xliff:g id="NUMBER_0">%d</xliff:g>-krát ste nesprávne nakreslili svoj bezpeÄnostný vzor. Po <xliff:g id="NUMBER_1">%d</xliff:g> Äalších neúspeÅ¡ných pokusoch sa zobrazí výzva na odomknutie telefónu pomocou e-mailového úÄtu.\n\n Skúste to znova o <xliff:g id="NUMBER_2">%d</xliff:g> s."</string>
<string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
<string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Odstrániť"</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"Nesprávny kód PIN karty SIM. Teraz musíte kontaktovať svojho operátora, aby vám odomkol zariadenie."</string>
+ <plurals name="kg_password_wrong_pin_code">
+ <item quantity="one" msgid="8134313997799638254">"Nesprávny kód PIN karty SIM. Zostáva vám <xliff:g id="NUMBER">%d</xliff:g> pokus, inak budete musieť kontaktovať svojho operátora, aby vám odomkol zariadenie."</item>
+ <item quantity="other" msgid="2215723361575359486">"Nesprávny kód PIN karty SIM. PoÄet zostávajúcich pokusov: <xliff:g id="NUMBER">%d</xliff:g>."</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="7077536808291316208">"Karta SIM je nepoužiteľná. Kontaktujte svojho operátora."</string>
+ <plurals name="kg_password_wrong_puk_code">
+ <item quantity="one" msgid="3256893607561060649">"Nesprávny kód PUK karty SIM. Zostáva vám <xliff:g id="NUMBER">%d</xliff:g> pokus, inak sa vaša karta SIM natrvalo zablokuje."</item>
+ <item quantity="other" msgid="5477305226026342036">"Nesprávny kód PUK karty SIM. PoÄet zostávajúcich pokusov pred trvalým zablokovaním karty SIM: <xliff:g id="NUMBER">%d</xliff:g>."</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="6268288093558031564">"Operácia kódu PIN karty SIM zlyhala!"</string>
+ <string name="kg_password_puk_failed" msgid="2838824369502455984">"Operácia kódu PUK karty SIM zlyhala!"</string>
+ <string name="kg_pin_accepted" msgid="1448241673570020097">"Kód bol prijatý!"</string>
<string name="keyguard_transport_prev_description" msgid="8229108430245669854">"TlaÄidlo Predchádzajúca stopa"</string>
<string name="keyguard_transport_next_description" msgid="4299258300283778305">"TlaÄidlo ÄŽalÅ¡ia stopa"</string>
<string name="keyguard_transport_pause_description" msgid="5093073338238310224">"TlaÄidlo PozastaviÅ¥"</string>
diff --git a/packages/Keyguard/res/values-sl/strings.xml b/packages/Keyguard/res/values-sl/strings.xml
index b6cfc1c..b0ec84e 100644
--- a/packages/Keyguard/res/values-sl/strings.xml
+++ b/packages/Keyguard/res/values-sl/strings.xml
@@ -21,9 +21,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"Vnesite kodo PIN"</string>
- <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"Vnesite kodo PUK in novo kodo PIN"</string>
- <string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"Koda PUK"</string>
- <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"Nova koda PIN"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="3035856550289724338">"Vnesite kodo PUK in novo kodo PIN kartice SIM"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="1801941051094974609">"Koda PUK kartice SIM"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="3201151840570492538">"Nova koda PIN kartice SIM"</string>
<string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"Dotaknite se za vnos gesla"</font></string>
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Vnesite geslo za odklepanje"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Vnesite PIN za odklepanje"</string>
@@ -71,6 +71,13 @@
<string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Gumb za zaÄasno ustavitev"</string>
<string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Gumb za predvajanje"</string>
<string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Gumb za ustavitev"</string>
+ <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"VÅ¡eÄ mi je"</string>
+ <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Ni mi vÅ¡eÄ"</string>
+ <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Srce"</string>
+ <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Za nadaljevanje odklenite"</string>
+ <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Zagon je preklican"</string>
+ <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Izpustite pripomoÄek <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>, da ga izbriÅ¡ete."</string>
+ <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"PripomoÄek <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> ne bo izbrisan."</string>
<string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
<string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
<string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
@@ -105,7 +112,6 @@
<string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"Vnesite želeno kodo PIN"</string>
<string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"Potrdite želeno kodo PIN"</string>
<string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"Odklepanje kartice SIM ..."</string>
- <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"NapaÄna koda PIN."</string>
<string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"Vnesite PIN, ki vsebuje od štiri do osem številk."</string>
<string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"Koda PUK mora vsebovati 8 ali veÄ Å¡tevk."</string>
<string name="kg_invalid_puk" msgid="3638289409676051243">"VnoviÄ vnesite pravilno kodo PUK. VeÄkratni poskusi bodo trajno onemogoÄili kartico SIM."</string>
@@ -129,6 +135,19 @@
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Vzorec za odklepanje ste <xliff:g id="NUMBER_0">%d</xliff:g>-krat napaÄno vnesli. Po nadaljnjih <xliff:g id="NUMBER_1">%d</xliff:g> neuspeÅ¡nih poskusih boste pozvani, da odklenete telefon z Googlovimi podatki za prijavo.\n\nPoskusite znova Äez <xliff:g id="NUMBER_2">%d</xliff:g> s."</string>
<string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" – "</string>
<string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Odstrani"</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"NapaÄna koda PIN kartice SIM. Zdaj se boste morali za odklenitev naprave obrniti na operaterja."</string>
+ <plurals name="kg_password_wrong_pin_code">
+ <item quantity="one" msgid="8134313997799638254">"NapaÄna koda PIN kartice SIM. Na voljo imate Å¡e <xliff:g id="NUMBER">%d</xliff:g> poskus. Potem se boste morali za odklenitev naprave obrniti na operaterja."</item>
+ <item quantity="other" msgid="2215723361575359486">"NapaÄna koda PIN kartice SIM. Poskusite lahko Å¡e <xliff:g id="NUMBER">%d</xliff:g>-krat."</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="7077536808291316208">"Kartica SIM ni veÄ uporabna. Obrnite se na operaterja."</string>
+ <plurals name="kg_password_wrong_puk_code">
+ <item quantity="one" msgid="3256893607561060649">"NapaÄna koda PUK kartice SIM. Na voljo imate Å¡e <xliff:g id="NUMBER">%d</xliff:g> poskus. Potem bo kartica SIM postala trajno neuporabna."</item>
+ <item quantity="other" msgid="5477305226026342036">"NapaÄna koda PUK kartice SIM. Poskusite lahko Å¡e <xliff:g id="NUMBER">%d</xliff:g>-krat. Potem bo kartica SIM postala trajno neuporabna."</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="6268288093558031564">"Postopek za odklepanje s kodo PIN kartice SIM ni uspel."</string>
+ <string name="kg_password_puk_failed" msgid="2838824369502455984">"Postopek za odklepanje s kodo PUK kartice SIM ni uspel."</string>
+ <string name="kg_pin_accepted" msgid="1448241673570020097">"Koda je sprejeta."</string>
<string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Gumb za prejšnjo skladbo"</string>
<string name="keyguard_transport_next_description" msgid="4299258300283778305">"Gumb za naslednjo skladbo"</string>
<string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Gumb za zaÄasno ustavitev"</string>
diff --git a/packages/Keyguard/res/values-sr/strings.xml b/packages/Keyguard/res/values-sr/strings.xml
index 664b85e..2bdd8f5 100644
--- a/packages/Keyguard/res/values-sr/strings.xml
+++ b/packages/Keyguard/res/values-sr/strings.xml
@@ -21,9 +21,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"УнеÑите PIN кôд"</string>
- <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"УнеÑите PUK и нови PIN кôд"</string>
- <string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"PUK кôд"</string>
- <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"Ðови PIN кôд"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="3035856550289724338">"УнеÑите SIM PUK кôд и нови PIN кôд"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="1801941051094974609">"SIM PUK кôд"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="3201151840570492538">"Ðови SIM PIN кôд"</string>
<string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"Додирните да биÑте унели лозинку"</font></string>
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Откуцајте лозинку да биÑте откључали"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"УнеÑите PIN за откључавање"</string>
@@ -71,6 +71,13 @@
<string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Дугме за паузу"</string>
<string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Дугме за репродукцију"</string>
<string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Дугме за зауÑтављање"</string>
+ <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Свиђа ми Ñе"</string>
+ <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Ðе Ñвиђа ми Ñе"</string>
+ <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Срце"</string>
+ <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Откључајте да биÑте наÑтавили"</string>
+ <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Покретање је отказано"</string>
+ <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"ОтпуÑтите виџет <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> да биÑте га избриÑали."</string>
+ <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"Виџет <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> неће бити избриÑан."</string>
<string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
<string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
<string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
@@ -105,7 +112,6 @@
<string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"УнеÑите жељени PIN кôд"</string>
<string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"Потврдите жељени PIN кôд"</string>
<string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"Откључавање SIM картице…"</string>
- <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"PIN кôд је нетачан."</string>
<string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"УнеÑите PIN који има од 4 до 8 бројева."</string>
<string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"PUK кôд треба да има 8 или више бројева."</string>
<string name="kg_invalid_puk" msgid="3638289409676051243">"Поново унеÑите иÑправни PUK кôд. Поновљени покушаји ће трајно онемогућити SIM."</string>
@@ -129,10 +135,23 @@
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Ðацртали Ñте шаблон за откључавање неиÑправно <xliff:g id="NUMBER_0">%d</xliff:g> пута. ПоÑле још <xliff:g id="NUMBER_1">%d</xliff:g> неуÑпешна(их) покушаја, од Ð²Ð°Ñ Ñ›Ðµ бити затражено да откључате телефон помоћу налога е-поште.\n\nПокушајте поново за <xliff:g id="NUMBER_2">%d</xliff:g> Ñекунде(и)."</string>
<string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" – "</string>
<string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Уклони"</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"Ðетачан SIM PIN кôд. Сада морате да контактирате мобилног оператера да биÑте откључали уређај."</string>
+ <plurals name="kg_password_wrong_pin_code">
+ <item quantity="one" msgid="8134313997799638254">"Ðетачан SIM PIN кôд. Имате још <xliff:g id="NUMBER">%d</xliff:g> покушај, а онда морате да контактирате мобилног оператера да биÑте откључали уређај."</item>
+ <item quantity="other" msgid="2215723361575359486">"Ðетачан SIM PIN кôд. Имате још <xliff:g id="NUMBER">%d</xliff:g> покушаја."</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="7077536808291316208">"SIM картица је неупотребљива. Контактирајте мобилног оператера."</string>
+ <plurals name="kg_password_wrong_puk_code">
+ <item quantity="one" msgid="3256893607561060649">"Ðетачан SIM PUK кôд. Имате још <xliff:g id="NUMBER">%d</xliff:g> покушај пре него што SIM картица поÑтане трајно неупотребљива."</item>
+ <item quantity="other" msgid="5477305226026342036">"Ðетачан SIM PUK кôд. Имате још <xliff:g id="NUMBER">%d</xliff:g> покушаја пре него што SIM картица поÑтане трајно неупотребљива."</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="6268288093558031564">"Радња Ñа SIM PIN кодом није уÑпела!"</string>
+ <string name="kg_password_puk_failed" msgid="2838824369502455984">"Радња Ñа SIM PUK кодом није уÑпела!"</string>
+ <string name="kg_pin_accepted" msgid="1448241673570020097">"Кôд је прихваћен!"</string>
<string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Дугме за претходну пеÑму"</string>
<string name="keyguard_transport_next_description" msgid="4299258300283778305">"Дугме за Ñледећу пеÑму"</string>
<string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Дугме за паузу"</string>
<string name="keyguard_transport_play_description" msgid="2924628863741150956">"Дугме за репродукцију"</string>
<string name="keyguard_transport_stop_description" msgid="3084179324810575787">"Дугме за зауÑтављање"</string>
- <string name="keyguard_carrier_default" msgid="8700650403054042153">"Ван мреже Ñте."</string>
+ <string name="keyguard_carrier_default" msgid="8700650403054042153">"Офлајн Ñте."</string>
</resources>
diff --git a/packages/Keyguard/res/values-sv/strings.xml b/packages/Keyguard/res/values-sv/strings.xml
index fb0f912..e446f61 100644
--- a/packages/Keyguard/res/values-sv/strings.xml
+++ b/packages/Keyguard/res/values-sv/strings.xml
@@ -21,9 +21,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"Ange PIN-kod"</string>
- <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"Ange PUK-koden och en ny PIN-kod"</string>
- <string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"PUK-kod"</string>
- <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"Ny PIN-kod"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="3035856550289724338">"Ange PUK-koden och en ny pinkod för SIM-kortet"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="1801941051094974609">"PUK-kod för SIM-kortet"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="3201151840570492538">"Ny pinkod för SIM-kort"</string>
<string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"Tryck om du vill ange lösenord"</font></string>
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Ange lösenord för att låsa upp"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Ange PIN-kod för att låsa upp"</string>
@@ -71,6 +71,13 @@
<string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Pausknappen"</string>
<string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Uppspelningsknappen"</string>
<string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Stoppknappen"</string>
+ <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Gillar"</string>
+ <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Tummen ned"</string>
+ <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Hjärta"</string>
+ <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Lås upp om du vill fortsätta"</string>
+ <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Lanseringen har avbrutits"</string>
+ <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Ta bort genom att släppa <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> här."</string>
+ <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> kommer inte att tas bort."</string>
<string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
<string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
<string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
@@ -105,7 +112,6 @@
<string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"Ange önskad PIN-kod"</string>
<string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"Bekräfta önskad PIN-kod"</string>
<string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"Låser upp SIM-kort …"</string>
- <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"Fel PIN-kod."</string>
<string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"Ange en PIN-kod med 4 till 8 siffror."</string>
<string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"PUK-koden ska vara minst åtta siffror."</string>
<string name="kg_invalid_puk" msgid="3638289409676051243">"Ange rätt PUK-kod igen. Om försöken upprepas inaktiveras SIM-kortet permanent."</string>
@@ -129,6 +135,19 @@
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Du har ritat ditt grafiska lösenord fel <xliff:g id="NUMBER_0">%d</xliff:g> gånger. Efter ytterligare <xliff:g id="NUMBER_1">%d</xliff:g> försök ombeds du låsa upp mobilen med hjälp av ett e-postkonto.\n\n Försök igen om <xliff:g id="NUMBER_2">%d</xliff:g> sekunder."</string>
<string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" – "</string>
<string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Ta bort"</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"Du angav fel pinkod för SIM-kortet och måste nu kontakta operatören för att låsa upp enheten."</string>
+ <plurals name="kg_password_wrong_pin_code">
+ <item quantity="one" msgid="8134313997799638254">"Du angav fel pinkod för SIM-kortet. <xliff:g id="NUMBER">%d</xliff:g> försök återstår innan du måste kontakta operatören för att låsa upp enheten."</item>
+ <item quantity="other" msgid="2215723361575359486">"Du angav fel pinkod för SIM-kortet. <xliff:g id="NUMBER">%d</xliff:g> försök återstår."</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="7077536808291316208">"SIM-kortet är obrukbart. Kontakta operatören."</string>
+ <plurals name="kg_password_wrong_puk_code">
+ <item quantity="one" msgid="3256893607561060649">"Du angav fel PUK-kod för SIM-kortet. <xliff:g id="NUMBER">%d</xliff:g> försök återstår innan SIM-kortet blir obrukbart."</item>
+ <item quantity="other" msgid="5477305226026342036">"Du angav fel PUK-kod för SIM-kortet. <xliff:g id="NUMBER">%d</xliff:g> försök återstår innan SIM-kortet blir obrukbart."</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="6268288093558031564">"Det gick inte att låsa upp med pinkoden för SIM-kortet."</string>
+ <string name="kg_password_puk_failed" msgid="2838824369502455984">"Det gick inte att låsa upp med PUK-koden för SIM-kortet."</string>
+ <string name="kg_pin_accepted" msgid="1448241673570020097">"Koden godkändes!"</string>
<string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Knapp för föregående spår"</string>
<string name="keyguard_transport_next_description" msgid="4299258300283778305">"Knapp för nästa spår"</string>
<string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Pausknappen"</string>
diff --git a/packages/Keyguard/res/values-sw/strings.xml b/packages/Keyguard/res/values-sw/strings.xml
index 27f1f30..c7abd98 100644
--- a/packages/Keyguard/res/values-sw/strings.xml
+++ b/packages/Keyguard/res/values-sw/strings.xml
@@ -21,9 +21,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"Ingiza msimbo wa PIN"</string>
- <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"Ingiza PUK na msimbo mpya wa PIN"</string>
- <string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"Msimbo wa PUK"</string>
- <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"Msimbo mpya wa PIN"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="3035856550289724338">"Chapa PUK ya SIM na msimbo mpya wa PIN"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="1801941051094974609">"Msimbo wa PUK ya SIM"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="3201151840570492538">"Msimbo mpya wa PIN ya SIM"</string>
<string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"Gusa kuingiza nenosiri "</font></string>
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Charaza nenosiri ili kufungua"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Ingiza PIN ili kufungua"</string>
@@ -71,6 +71,13 @@
<string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Kitufe cha kusitisha"</string>
<string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Kitufe cha kucheza"</string>
<string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Kitufe cha kusitisha"</string>
+ <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Bomba"</string>
+ <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Si bomba"</string>
+ <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Moyo"</string>
+ <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Fungua ili uendelee"</string>
+ <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Uzinduzi umeghairiwa"</string>
+ <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Dondosha <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> ili ufute."</string>
+ <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> haitafutwa."</string>
<string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
<string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
<string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
@@ -105,7 +112,6 @@
<string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"Ingiza msimbo wa PIN unaopendelewa"</string>
<string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"Thibitisha msimbo wa PIN unaopendelewa"</string>
<string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"Inafungua SIM kadi..."</string>
- <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"Msimbo wa PIN usio sahihi."</string>
<string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"Charaza PIN iliyo na tarakimu kati ya 4 na 8."</string>
<string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"Msimbo wa PUK unafaa kuwa na nambari 8 au zaidi."</string>
<string name="kg_invalid_puk" msgid="3638289409676051243">"Ingiza upya msimbo sahihi wa PUK. Majaribio yanayorudiwa yatalemaza SIM kabisa."</string>
@@ -129,6 +135,19 @@
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Umekosea kuchora mchoro wako wa kufungua mara <xliff:g id="NUMBER_0">%d</xliff:g>. Baada ya majaribio <xliff:g id="NUMBER_1">%d</xliff:g> yasiyofaulu, utaombwa kufungua simu yako kwa kutumia akaunti ya barua pepe.\n\n Jaribu tena baada ya sekunde <xliff:g id="NUMBER_2">%d</xliff:g>."</string>
<string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
<string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Ondoa"</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"Msimbo wa PIN ya SIM usiosahihi sasa lazima uwasiliane na mtoa huduma wako ili ufungue kifaa chako."</string>
+ <plurals name="kg_password_wrong_pin_code">
+ <item quantity="one" msgid="8134313997799638254">"Msimbo wa PIN ya SIM usio sahihi, umesalia na majaribio <xliff:g id="NUMBER">%d</xliff:g> kabla ulazimike kuwasiliana na mtoa huduma wako ili ufungue kifaa chako."</item>
+ <item quantity="other" msgid="2215723361575359486">"Msimbo wa PIN ya SIM usio sahihi, umesalia na majaribio <xliff:g id="NUMBER">%d</xliff:g>."</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="7077536808291316208">"SIM haiwezi kutumika. Wasiliana na mtoa huduma wako."</string>
+ <plurals name="kg_password_wrong_puk_code">
+ <item quantity="one" msgid="3256893607561060649">"Msimbo wa PUK ya SIM usio sahihi, umesalia na majaribio <xliff:g id="NUMBER">%d</xliff:g> kabla ya SIM kuacha kutumika kabisa."</item>
+ <item quantity="other" msgid="5477305226026342036">"Msimbo wa PUK ya SIM usio sahihi, umesalia na majaribio <xliff:g id="NUMBER">%d</xliff:g> kabla ya SIM kuacha kutumika kabisa."</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="6268288093558031564">"Utendakazi wa PIN ya SIM umeshindwa!"</string>
+ <string name="kg_password_puk_failed" msgid="2838824369502455984">"Utendakazi wa PUK ya SIM umeshindwa!"</string>
+ <string name="kg_pin_accepted" msgid="1448241673570020097">"Msimbo Umekubaliwa!"</string>
<string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Kitufe cha wimbo wa awali"</string>
<string name="keyguard_transport_next_description" msgid="4299258300283778305">"Kitufe cha wimbo unaofuata"</string>
<string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Kitufe cha kusitisha"</string>
diff --git a/packages/Keyguard/res/values-th/strings.xml b/packages/Keyguard/res/values-th/strings.xml
index d6308b6..a44f9fe 100644
--- a/packages/Keyguard/res/values-th/strings.xml
+++ b/packages/Keyguard/res/values-th/strings.xml
@@ -21,9 +21,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"พิมพ์รหัส PIN"</string>
- <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"พิมพ์ PUK à¹à¸¥à¸°à¸£à¸«à¸±à¸ª PIN ใหม่"</string>
- <string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"รหัส PUK"</string>
- <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"รหัส PIN ใหม่"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="3035856550289724338">"พิมพ์ PUK à¹à¸¥à¸°à¸£à¸«à¸±à¸ª PIN ใหม่"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="1801941051094974609">"รหัส PUK ของซิม"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="3201151840570492538">"รหัส PIN ของซิมใหม่"</string>
<string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"à¹à¸•ะเพื่อพิมพ์รหัสผ่าน"</font></string>
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"พิมพ์รหัสผ่านเพื่อปลดล็อà¸"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"พิมพ์ PIN เพื่อปลดล็อà¸"</string>
@@ -71,6 +71,13 @@
<string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"ปุ่มหยุดชั่วคราว"</string>
<string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"ปุ่มเล่น"</string>
<string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"ปุ่มหยุด"</string>
+ <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"สุดยอด"</string>
+ <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"ไม่ชอบ"</string>
+ <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"หัวใจ"</string>
+ <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"ปลดล็อà¸à¹€à¸žà¸·à¹ˆà¸­à¸”ำเนินà¸à¸²à¸£à¸•่อ"</string>
+ <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"ยà¸à¹€à¸¥à¸´à¸à¸à¸²à¸£à¹€à¸›à¸´à¸”ใช้งานà¹à¸¥à¹‰à¸§"</string>
+ <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"ลาภ<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> เพื่อลบ"</string>
+ <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> จะไม่ถูà¸à¸¥à¸š"</string>
<string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
<string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
<string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
@@ -105,7 +112,6 @@
<string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"ป้อนรหัส PIN ที่ต้องà¸à¸²à¸£"</string>
<string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"ยืนยันรหัส PIN ที่ต้องà¸à¸²à¸£"</string>
<string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"à¸à¸³à¸¥à¸±à¸‡à¸›à¸¥à¸”ล็อà¸à¸‹à¸´à¸¡à¸à¸²à¸£à¹Œà¸”…"</string>
- <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"รหัส PIN ไม่ถูà¸à¸•้อง"</string>
<string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"พิมพ์ PIN ซึ่งเป็นเลข 4 ถึง 8 หลัà¸"</string>
<string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"รหัส PUK ต้องเป็นตัวเลขอย่างน้อย 8 หลัà¸"</string>
<string name="kg_invalid_puk" msgid="3638289409676051243">"ใส่รหัส PUK ที่ถูà¸à¸•้องอีà¸à¸„รั้ง à¸à¸²à¸£à¸žà¸¢à¸²à¸¢à¸²à¸¡à¸‹à¹‰à¸³à¸«à¸¥à¸²à¸¢à¸„รั้งจะทำให้ซิมà¸à¸²à¸£à¹Œà¸”ถูà¸à¸›à¸´à¸”ใช้งานอย่างถาวร"</string>
@@ -129,6 +135,19 @@
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"คุณวาดรูปà¹à¸šà¸šà¸à¸²à¸£à¸›à¸¥à¸”ล็อà¸à¹„ม่ถูà¸à¸•้อง <xliff:g id="NUMBER_0">%d</xliff:g> ครั้งà¹à¸¥à¹‰à¸§ หาà¸à¸—ำไม่สำเร็จอีภ<xliff:g id="NUMBER_1">%d</xliff:g> ครั้ง ระบบจะขอให้คุณปลดล็อà¸à¹‚ทรศัพท์โดยใช้ับัà¸à¸Šà¸µà¸­à¸µà¹€à¸¡à¸¥\n\n โปรดลองอีà¸à¸„รั้งในอีภ<xliff:g id="NUMBER_2">%d</xliff:g> วินาที"</string>
<string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
<string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"นำออà¸"</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"รหัส PIN ของซิมไม่ถูà¸à¸•้อง ตอนนี้คุณต้องติดต่อผู้ให้บริà¸à¸²à¸£à¹€à¸žà¸·à¹ˆà¸­à¸›à¸¥à¸”ล็อà¸à¸­à¸¸à¸›à¸à¸£à¸“์ของคุณ"</string>
+ <plurals name="kg_password_wrong_pin_code">
+ <item quantity="one" msgid="8134313997799638254">"รหัส PIN ของซิมไม่ถูà¸à¸•้อง คุณพยายามได้อีภ<xliff:g id="NUMBER">%d</xliff:g> ครั้งà¸à¹ˆà¸­à¸™à¸—ี่จะต้องติดต่อผู้ให้บริà¸à¸²à¸£à¹€à¸žà¸·à¹ˆà¸­à¸›à¸¥à¸”ล็อà¸à¸­à¸¸à¸›à¸à¸£à¸“์ของคุณ"</item>
+ <item quantity="other" msgid="2215723361575359486">"รหัส PIN ของซิมไม่ถูà¸à¸•้อง คุณพยายามได้อีภ<xliff:g id="NUMBER">%d</xliff:g> ครั้ง"</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="7077536808291316208">"ซิมไม่สามารถใช้งานได้ ติดต่อผู้ให้บริà¸à¸²à¸£à¸‚องคุณ"</string>
+ <plurals name="kg_password_wrong_puk_code">
+ <item quantity="one" msgid="3256893607561060649">"รหัส PUK ของซิมไม่ถูà¸à¸•้อง คุณพยายามได้อีภ<xliff:g id="NUMBER">%d</xliff:g> ครั้งà¸à¹ˆà¸­à¸™à¸—ี่ซิมจะไม่สามารถใช้งานได้อย่างถาวร"</item>
+ <item quantity="other" msgid="5477305226026342036">"รหัส PUK ของซิมไม่ถูà¸à¸•้อง คุณพยายามได้อีภ<xliff:g id="NUMBER">%d</xliff:g> ครั้งà¸à¹ˆà¸­à¸™à¸—ี่ซิมจะไม่สามารถใช้งานได้อย่างถาวร"</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="6268288093558031564">"à¸à¸²à¸£à¸›à¸¥à¸”ล็อà¸à¸”้วย PIN ของซิมล้มเหลว!"</string>
+ <string name="kg_password_puk_failed" msgid="2838824369502455984">"à¸à¸²à¸£à¸›à¸¥à¸”ล็อà¸à¸”้วย PUK ของซิมล้มเหลว!"</string>
+ <string name="kg_pin_accepted" msgid="1448241673570020097">"รหัสได้รับà¸à¸²à¸£à¸¢à¸­à¸¡à¸£à¸±à¸š!"</string>
<string name="keyguard_transport_prev_description" msgid="8229108430245669854">"ปุ่มà¹à¸—ร็à¸à¸à¹ˆà¸­à¸™à¸«à¸™à¹‰à¸²"</string>
<string name="keyguard_transport_next_description" msgid="4299258300283778305">"ปุ่มà¹à¸—ร็à¸à¸–ัดไป"</string>
<string name="keyguard_transport_pause_description" msgid="5093073338238310224">"ปุ่มหยุดชั่วคราว"</string>
diff --git a/packages/Keyguard/res/values-tl/strings.xml b/packages/Keyguard/res/values-tl/strings.xml
index a41d268..6516766 100644
--- a/packages/Keyguard/res/values-tl/strings.xml
+++ b/packages/Keyguard/res/values-tl/strings.xml
@@ -21,9 +21,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"I-type ang PIN code"</string>
- <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"I-type ang PUK at bagong PIN code"</string>
- <string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"PUK code"</string>
- <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"Bagong PIN code"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="3035856550289724338">"I-type ang SIM PUK at bagong PIN code"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="1801941051094974609">"PUK code ng SIM"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="3201151840570492538">"Bagong PIN code ng SIM"</string>
<string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"Pindutin upang i-type password"</font></string>
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"I-type ang password upang i-unlock"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"I-type ang PIN upang i-unlock"</string>
@@ -71,6 +71,13 @@
<string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Button na I-pause"</string>
<string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Button na I-play"</string>
<string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Button na Ihinto"</string>
+ <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Thumbs up"</string>
+ <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Thumbs down"</string>
+ <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Heart"</string>
+ <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"I-unlock upang magpatuloy"</string>
+ <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Nakansela ang paglunsad"</string>
+ <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"I-drop ang <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> upang tanggalin."</string>
+ <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"Hindi tatanggalin ang <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>."</string>
<string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
<string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
<string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
@@ -105,7 +112,6 @@
<string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"Ilagay ang ninanais na PIN code"</string>
<string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"Kumpirmahin ang ninanais na PIN code"</string>
<string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"Ina-unlock ang SIM card…"</string>
- <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"Hindi tamang PIN code."</string>
<string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"Mag-type ng PIN na 4 hanggang 8 numero."</string>
<string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"Dapat ay 8 numero o higit pa ang PUK code."</string>
<string name="kg_invalid_puk" msgid="3638289409676051243">"Muling ilagay ang tamang PUK code. Permanenteng hindi pagaganahin ang SIM ng mga paulit-ulit na pagtatangka."</string>
@@ -129,6 +135,19 @@
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Naguhit mo nang hindi tama ang iyong pattern sa pag-unlock nang <xliff:g id="NUMBER_0">%d</xliff:g> (na) beses. Pagkatapos ng <xliff:g id="NUMBER_1">%d</xliff:g> pang hindi matagumpay na pagtatangka, hihilingin sa iyong i-unlock ang telepono mo gamit ang isang email account.\n\n Subukang muli sa loob ng <xliff:g id="NUMBER_2">%d</xliff:g> (na) segundo."</string>
<string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
<string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Alisin"</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"Maling PIN code ng SIM, dapat ka nang makipag-ugnay sa iyong carrier upang i-unlock ang iyong device."</string>
+ <plurals name="kg_password_wrong_pin_code">
+ <item quantity="one" msgid="8134313997799638254">"Maling PIN code ng SIM, mayroon kang <xliff:g id="NUMBER">%d</xliff:g> (na) natitirang pagsubok bago ka dapat makipag-ugnay sa iyong carrier upang i-unlock ang iyong device."</item>
+ <item quantity="other" msgid="2215723361575359486">"Maling PIN code ng SIM, mayroon kang <xliff:g id="NUMBER">%d</xliff:g> (na) natitirang pagsubok."</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="7077536808291316208">"Hindi magagamit ang SIM. Makipag-ugnay sa iyong carrier."</string>
+ <plurals name="kg_password_wrong_puk_code">
+ <item quantity="one" msgid="3256893607561060649">"Maling PUK code ng SIM, mayroon kang <xliff:g id="NUMBER">%d</xliff:g> (na) natitirang pagsubok bago maging permanenteng hindi magagamit ang SIM."</item>
+ <item quantity="other" msgid="5477305226026342036">"Maling PUK code ng SIM, mayroon kang <xliff:g id="NUMBER">%d</xliff:g> (na) natitirang pagsubok bago maging permanenteng hindi magagamit ang SIM."</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="6268288093558031564">"Nabigo ang operasyon ng SIM PIN!"</string>
+ <string name="kg_password_puk_failed" msgid="2838824369502455984">"Nabigo ang operasyon ng SIM PUK!"</string>
+ <string name="kg_pin_accepted" msgid="1448241673570020097">"Tinanggap ang Code!"</string>
<string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Button na Nakaraang track"</string>
<string name="keyguard_transport_next_description" msgid="4299258300283778305">"Button na Susunod na track"</string>
<string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Button na I-pause"</string>
diff --git a/packages/Keyguard/res/values-tr/strings.xml b/packages/Keyguard/res/values-tr/strings.xml
index 0af7740..aed8a47 100644
--- a/packages/Keyguard/res/values-tr/strings.xml
+++ b/packages/Keyguard/res/values-tr/strings.xml
@@ -21,9 +21,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"PIN kodunu yazın"</string>
- <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"PUK ve yeni PIN kodunu yazın"</string>
- <string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"PUK kodu"</string>
- <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"Yeni PIN kodu"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="3035856550289724338">"SIM PUK kodunu ve yeni bir PIN kodu yazın."</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="1801941051094974609">"SIM PUK kodu"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="3201151840570492538">"Yeni SIM PIN kodu"</string>
<string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"Şifre yazmak için dokunun"</font></string>
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Kilidi açmak için şifreyi yazın"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Kilidi açmak için PIN kodunu yazın"</string>
@@ -71,6 +71,13 @@
<string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Duraklat düğmesi"</string>
<string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Oynat düğmesi"</string>
<string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Durdur düğmesi"</string>
+ <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"BeÄŸen"</string>
+ <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"BeÄŸenme"</string>
+ <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Kalp"</string>
+ <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Devam etmek için kilidini açın"</string>
+ <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"BaÅŸlatma iptal edildi"</string>
+ <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Silmek için <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> widget\'ını bırakın."</string>
+ <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> silinmeyecek."</string>
<string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
<string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
<string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
@@ -105,7 +112,6 @@
<string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"İstenen PIN kodunu girin"</string>
<string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"İstenen PIN kodunu onaylayın"</string>
<string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"SIM kart kilidi açılıyor…"</string>
- <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"Yanlış PIN kodu."</string>
<string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"4-8 rakamdan oluÅŸan bir PIN girin."</string>
<string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"PUK kodu 8 veya daha çok basamaklı bir sayı olmalıdır."</string>
<string name="kg_invalid_puk" msgid="3638289409676051243">"Doğru PUK kodunu tekrar girin. Çok sayıda deneme yapılırsa SIM kart kalıcı olarak devre dışı bırakılır."</string>
@@ -129,6 +135,19 @@
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Kilit açma deseninizi <xliff:g id="NUMBER_0">%d</xliff:g> kez yanlış çizdiniz. <xliff:g id="NUMBER_1">%d</xliff:g> başarısız denemeden sonra telefonunuzu bir e-posta hesabı kullanarak açmanız istenir.\n\n <xliff:g id="NUMBER_2">%d</xliff:g> saniye içinde tekrar deneyin."</string>
<string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
<string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Kaldır"</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"Yanlış SIM PIN kodu. Cihazınızın kilidini açmak için artık operatörünüzle bağlantı kurmanız gerekiyor."</string>
+ <plurals name="kg_password_wrong_pin_code">
+ <item quantity="one" msgid="8134313997799638254">"Yanlış SIM PIN kodu. Cihazının kilidini açmak için operatörünüzle bağlantı kurmak zorunda kalmadan önce <xliff:g id="NUMBER">%d</xliff:g> deneme hakkınız kaldı."</item>
+ <item quantity="other" msgid="2215723361575359486">"Yanlış SIM PIN kodu. <xliff:g id="NUMBER">%d</xliff:g> deneme hakkınız kaldı."</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="7077536808291316208">"SIM kullanılamaz. Operatörünüzle bağlantı kurun."</string>
+ <plurals name="kg_password_wrong_puk_code">
+ <item quantity="one" msgid="3256893607561060649">"Yanlış SIM PUK kodu. SIM kalıcı olarak kullanılmaz hale gelmeden önce <xliff:g id="NUMBER">%d</xliff:g> deneme hakkınız kaldı."</item>
+ <item quantity="other" msgid="5477305226026342036">"Yanlış SIM PUK kodu. SIM kalıcı olarak kullanılmaz hale gelmeden önce <xliff:g id="NUMBER">%d</xliff:g> deneme hakkınız kaldı."</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="6268288093558031564">"SIM PIN işlemi başarısız oldu!"</string>
+ <string name="kg_password_puk_failed" msgid="2838824369502455984">"SIM PUK işlemi başarısız oldu!"</string>
+ <string name="kg_pin_accepted" msgid="1448241673570020097">"Kod Kabul Edildi!"</string>
<string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Önceki parça düğmesi"</string>
<string name="keyguard_transport_next_description" msgid="4299258300283778305">"Sonraki parça düğmesi"</string>
<string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Duraklat düğmesi"</string>
diff --git a/packages/Keyguard/res/values-uk/strings.xml b/packages/Keyguard/res/values-uk/strings.xml
index 2879e87..5e355e4 100644
--- a/packages/Keyguard/res/values-uk/strings.xml
+++ b/packages/Keyguard/res/values-uk/strings.xml
@@ -21,9 +21,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"Введіть PIN-код"</string>
- <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"Введіть PUK-код і новий PIN-код"</string>
- <string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"PUK-код"</string>
- <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"Ðовий PIN-код"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="3035856550289724338">"Введіть PUK-код і новий PIN-код SIM-карти"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="1801941051094974609">"PUK-код SIM-карти"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="3201151840570492538">"Ðовий PIN-код SIM-карти"</string>
<string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"ТоркнітьÑÑ, щоб ввеÑти пароль"</font></string>
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Введіть пароль, щоб розблокувати"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Введіть PIN-код, щоб розблокувати"</string>
@@ -71,6 +71,13 @@
<string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Кнопка \"Призупинити\""</string>
<string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Кнопка \"Відтворити\""</string>
<string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Кнопка \"Зупинити\""</string>
+ <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"ПодобаєтьÑÑ"</string>
+ <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Ðе подобаєтьÑÑ"</string>
+ <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Рейтинг"</string>
+ <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Розблокуйте, щоб продовжити"</string>
+ <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"ЗапуÑк ÑкаÑовано"</string>
+ <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"ВідпуÑтіть <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>, щоб видалити."</string>
+ <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> не буде видалено."</string>
<string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
<string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
<string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
@@ -105,7 +112,6 @@
<string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"Введіть потрібний PIN-код"</string>
<string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"Підтвердьте потрібний PIN-код"</string>
<string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"Ð Ð¾Ð·Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ SIM-карти…"</string>
- <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"Ðеправильний PIN-код."</string>
<string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"Введіть PIN-код із 4–8 цифр."</string>
<string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"PUK-код має ÑкладатиÑÑ Ð·Ñ– щонайменше 8 цифр."</string>
<string name="kg_invalid_puk" msgid="3638289409676051243">"Повторно введіть правильний PUK-код. ЧиÑленні Ñпроби назавжди вимкнуть SIM-карту."</string>
@@ -129,6 +135,19 @@
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Ключ Ñ€Ð¾Ð·Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð½ÐµÐ¿Ñ€Ð°Ð²Ð¸Ð»ÑŒÐ½Ð¾ намальовано Ñтільки разів: <xliff:g id="NUMBER_0">%d</xliff:g>. У Ð²Ð°Ñ Ñ” ще Ñтільки Ñпроб: <xliff:g id="NUMBER_1">%d</xliff:g>. У разі невдачі з’ÑвитьÑÑ Ð·Ð°Ð¿Ð¸Ñ‚ розблокувати телефон за допомогою облікового запиÑу електронної пошти.\n\n Повторіть Ñпробу через <xliff:g id="NUMBER_2">%d</xliff:g> Ñек."</string>
<string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" – "</string>
<string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Вилучити"</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"Ðеправильний PIN-код SIM-карти. Зв’ÑжітьÑÑ Ð·Ñ– Ñвоїм оператором, щоб розблокувати приÑтрій."</string>
+ <plurals name="kg_password_wrong_pin_code">
+ <item quantity="one" msgid="8134313997799638254">"Ðеправильний PIN-код SIM-карти. У Ð²Ð°Ñ Ð·Ð°Ð»Ð¸ÑˆÐ¸Ð»Ð°ÑÑŒ <xliff:g id="NUMBER">%d</xliff:g> Ñпроба. ПіÑÐ»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ потрібно буде зв’ÑзатиÑÑ Ð· оператором, щоб розблокувати приÑтрій."</item>
+ <item quantity="other" msgid="2215723361575359486">"Ðеправильний PIN-код SIM-карти. У Ð²Ð°Ñ Ð·Ð°Ð»Ð¸ÑˆÐ¸Ð»Ð¾ÑÑ Ñтільки Ñпроб: <xliff:g id="NUMBER">%d</xliff:g>."</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="7077536808291316208">"SIM-карту заблоковано. Зв’ÑжітьÑÑ Ð· оператором."</string>
+ <plurals name="kg_password_wrong_puk_code">
+ <item quantity="one" msgid="3256893607561060649">"Ðеправильний PUK-код SIM-карти. У Ð²Ð°Ñ Ð·Ð°Ð»Ð¸ÑˆÐ¸Ð»Ð°ÑÑŒ <xliff:g id="NUMBER">%d</xliff:g> Ñпроба. ПіÑÐ»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ SIM-карту буде назавжди заблоковано."</item>
+ <item quantity="other" msgid="5477305226026342036">"Ðеправильний PUK-код SIM-карти. У Ð²Ð°Ñ Ð·Ð°Ð»Ð¸ÑˆÐ¸Ð»Ð¾ÑÑ Ñтільки Ñпроб: <xliff:g id="NUMBER">%d</xliff:g>. ПіÑÐ»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ SIM-карту буде назавжди заблоковано."</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="6268288093558031564">"Помилка Ð²Ð²ÐµÐ´ÐµÐ½Ð½Ñ PIN-коду SIM-карти."</string>
+ <string name="kg_password_puk_failed" msgid="2838824369502455984">"Помилка Ð²Ð²ÐµÐ´ÐµÐ½Ð½Ñ PUK-коду SIM-карти."</string>
+ <string name="kg_pin_accepted" msgid="1448241673570020097">"Код прийнÑто."</string>
<string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Кнопка \"ÐŸÐ¾Ð¿ÐµÑ€ÐµÐ´Ð½Ñ ÐºÐ¾Ð¼Ð¿Ð¾Ð·Ð¸Ñ†Ñ–Ñ\""</string>
<string name="keyguard_transport_next_description" msgid="4299258300283778305">"Кнопка \"ÐаÑтупна композиціÑ\""</string>
<string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Кнопка \"Призупинити\""</string>
diff --git a/packages/Keyguard/res/values-vi/strings.xml b/packages/Keyguard/res/values-vi/strings.xml
index 70d3c73..19eb4c5 100644
--- a/packages/Keyguard/res/values-vi/strings.xml
+++ b/packages/Keyguard/res/values-vi/strings.xml
@@ -21,9 +21,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"Nhập mã PIN"</string>
- <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"Nhập PUK và mã PIN mới"</string>
- <string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"Mã PUK"</string>
- <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"Mã PIN mới"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="3035856550289724338">"Nhập mã PIN mới và mã PUK của SIM"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="1801941051094974609">"Mã PUK của SIM"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="3201151840570492538">"Mã PIN mới của SIM"</string>
<string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"Chạm để nhập mật khẩu"</font></string>
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Nhập mật khẩu để mở khóa"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Nhập mã PIN để mở khóa"</string>
@@ -71,6 +71,13 @@
<string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Nút tạm dừng"</string>
<string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Nút phát"</string>
<string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Nút dừng"</string>
+ <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Bài hát được đánh dấu thích"</string>
+ <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Bài hát được đánh dấu không thích"</string>
+ <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Trái tim"</string>
+ <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Mở khóa để tiếp tục"</string>
+ <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Quá trình khởi chạy bị hủy"</string>
+ <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Thả <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> để xóa."</string>
+ <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> sẽ không bị xóa."</string>
<string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
<string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
<string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
@@ -105,7 +112,6 @@
<string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"Nhập mã PIN mong muốn"</string>
<string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"Xác nhận mã PIN mong muốn"</string>
<string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"Äang mở khóa thẻ SIM…"</string>
- <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"Mã PIN không chính xác."</string>
<string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"Nhập mã PIN có từ 4 đến 8 số."</string>
<string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"Mã PUK phải có từ 8 số trở lên."</string>
<string name="kg_invalid_puk" msgid="3638289409676051243">"Hãy nhập lại mã PUK chính xác. Nhiá»u lần lặp lại sẽ vô hiệu hóa vÄ©nh viá»…n thẻ SIM."</string>
@@ -129,6 +135,19 @@
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Bạn đã <xliff:g id="NUMBER_0">%d</xliff:g> lần vẽ không chính xác hình mở khóa của mình. Sau <xliff:g id="NUMBER_1">%d</xliff:g> lần thử không thành công nữa, bạn sẽ được yêu cầu mở khóa điện thoại bằng tài khoản email.\n\n Vui lòng thử lại sau <xliff:g id="NUMBER_2">%d</xliff:g> giây."</string>
<string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
<string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Xóa"</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"Mã PIN của SIM không chính xác, bây giỠbạn phải liên hệ với nhà cung cấp dịch vụ để mở khóa thiết bị của bạn."</string>
+ <plurals name="kg_password_wrong_pin_code">
+ <item quantity="one" msgid="8134313997799638254">"Mã PIN của SIM không chính xác, bạn còn <xliff:g id="NUMBER">%d</xliff:g> lần thử trước khi bạn phải liên hệ với nhà cung cấp dịch vụ để mở khóa thiết bị của bạn."</item>
+ <item quantity="other" msgid="2215723361575359486">"Mã PIN của SIM không chính xác, bạn còn <xliff:g id="NUMBER">%d</xliff:g> lần thử."</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="7077536808291316208">"SIM không thể sử dụng được. Liên hệ với nhà cung cấp dịch vụ của bạn."</string>
+ <plurals name="kg_password_wrong_puk_code">
+ <item quantity="one" msgid="3256893607561060649">"Mã PUK của SIM không chính xác, bạn còn <xliff:g id="NUMBER">%d</xliff:g> lần thử trước khi SIM vĩnh viễn không thể sử dụng được."</item>
+ <item quantity="other" msgid="5477305226026342036">"Mã PUK của SIM không chính xác, bạn còn <xliff:g id="NUMBER">%d</xliff:g> lần thử trước khi SIM vĩnh viễn không thể sử dụng được."</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="6268288093558031564">"Thao tác mã PIN của SIM không thành công!"</string>
+ <string name="kg_password_puk_failed" msgid="2838824369502455984">"Thao tác mã PUK của SIM không thành công!"</string>
+ <string name="kg_pin_accepted" msgid="1448241673570020097">"Mã được chấp nhận!"</string>
<string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Nút bản nhạc trước"</string>
<string name="keyguard_transport_next_description" msgid="4299258300283778305">"Nút bản nhạc tiếp theo"</string>
<string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Nút tạm dừng"</string>
diff --git a/packages/Keyguard/res/values-zh-rCN/strings.xml b/packages/Keyguard/res/values-zh-rCN/strings.xml
index cdb1944..18578e4 100644
--- a/packages/Keyguard/res/values-zh-rCN/strings.xml
+++ b/packages/Keyguard/res/values-zh-rCN/strings.xml
@@ -21,9 +21,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"输入 PIN ç "</string>
- <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"请输入 PUK ç å’Œæ–°çš„ PIN ç "</string>
- <string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"PUK ç "</string>
- <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"æ–°çš„ PIN ç "</string>
+ <string name="keyguard_password_enter_puk_code" msgid="3035856550289724338">"请输入 SIM å¡ PUK ç å’Œæ–°çš„ PIN ç "</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="1801941051094974609">"SIM å¡ PUK ç "</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="3201151840570492538">"æ–° SIM å¡ PIN ç "</string>
<string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"触摸å¯è¾“入密ç "</font></string>
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"输入密ç ä»¥è§£é”"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"输入 PIN 进行解é”"</string>
@@ -71,6 +71,13 @@
<string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"æš‚åœæŒ‰é’®"</string>
<string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"播放按钮"</string>
<string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"åœæ­¢æŒ‰é’®"</string>
+ <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"我喜欢"</string>
+ <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"ä¸å–œæ¬¢"</string>
+ <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"爱心"</string>
+ <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"è§£é”å³å¯ç»§ç»­"</string>
+ <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"å¯åЍ已喿¶ˆ"</string>
+ <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"放下<xliff:g id="WIDGET_INDEX">%1$s</xliff:g>å³å¯å°†å…¶åˆ é™¤ã€‚"</string>
+ <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g>å°†ä¸ä¼šè¢«åˆ é™¤ã€‚"</string>
<string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
<string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
<string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
@@ -105,7 +112,6 @@
<string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"请输入所需 PIN ç "</string>
<string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"请确认所需 PIN ç "</string>
<string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"æ­£åœ¨è§£é” SIM å¡..."</string>
- <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"PIN ç æœ‰è¯¯ã€‚"</string>
<string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"请输入 4 至 8 使•°çš„ PIN。"</string>
<string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"PUK ç åº”è‡³å°‘åŒ…å« 8 使•°å­—。"</string>
<string name="kg_invalid_puk" msgid="3638289409676051243">"è¯·é‡æ–°è¾“入正确的 PUK ç ã€‚如果å°è¯•错误次数过多,SIM å¡å°†æ°¸ä¹…åœç”¨ã€‚"</string>
@@ -129,6 +135,19 @@
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"æ‚¨å·²ç» <xliff:g id="NUMBER_0">%d</xliff:g> 次错误地绘制了解é”图案。如果å†å°è¯• <xliff:g id="NUMBER_1">%d</xliff:g> 次åŽä»ä¸æˆåŠŸï¼Œç³»ç»Ÿå°±ä¼šè¦æ±‚您使用自己的电å­é‚®ä»¶å¸æˆ·è§£é”手机。\n\n请在 <xliff:g id="NUMBER_2">%d</xliff:g> ç§’åŽé‡è¯•。"</string>
<string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
<string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"删除"</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"SIM å¡ PIN ç ä¸æ­£ç¡®ï¼Œæ‚¨çŽ°åœ¨å¿…é¡»è”ç³»è¿è¥å•†ä¸ºæ‚¨è§£é”设备。"</string>
+ <plurals name="kg_password_wrong_pin_code">
+ <item quantity="one" msgid="8134313997799638254">"SIM å¡ PIN ç ä¸æ­£ç¡®ï¼Œæ‚¨è¿˜æœ‰<xliff:g id="NUMBER">%d</xliff:g>次å°è¯•机会。如果ä»ç„¶å¤±è´¥ï¼Œåˆ™å¿…é¡»è”ç³»è¿è¥å•†å¸®æ‚¨è§£é”设备。"</item>
+ <item quantity="other" msgid="2215723361575359486">"SIM å¡ PIN ç ä¸æ­£ç¡®ï¼Œæ‚¨è¿˜æœ‰<xliff:g id="NUMBER">%d</xliff:g>次å°è¯•机会。"</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="7077536808291316208">"SIM 塿— æ³•使用,请与您的è¿è¥å•†è”系。"</string>
+ <plurals name="kg_password_wrong_puk_code">
+ <item quantity="one" msgid="3256893607561060649">"SIM å¡ PUK ç ä¸æ­£ç¡®ï¼Œæ‚¨è¿˜æœ‰<xliff:g id="NUMBER">%d</xliff:g>次å°è¯•机会。如果ä»ç„¶å¤±è´¥ï¼ŒSIM å¡å°†æ°¸è¿œæ— æ³•使用。"</item>
+ <item quantity="other" msgid="5477305226026342036">"SIM å¡ PUK ç ä¸æ­£ç¡®ï¼Œæ‚¨è¿˜æœ‰<xliff:g id="NUMBER">%d</xliff:g>次å°è¯•机会。如果ä»ç„¶å¤±è´¥ï¼ŒSIM å¡å°†æ°¸è¿œæ— æ³•使用。"</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="6268288093558031564">"SIM å¡ PIN ç æ“作失败ï¼"</string>
+ <string name="kg_password_puk_failed" msgid="2838824369502455984">"SIM å¡ PUK ç æ“作失败ï¼"</string>
+ <string name="kg_pin_accepted" msgid="1448241673570020097">"ä»£ç æ­£ç¡®ï¼"</string>
<string name="keyguard_transport_prev_description" msgid="8229108430245669854">"â€œä¸Šä¸€æ›²â€æŒ‰é’®"</string>
<string name="keyguard_transport_next_description" msgid="4299258300283778305">"â€œä¸‹ä¸€æ›²â€æŒ‰é’®"</string>
<string name="keyguard_transport_pause_description" msgid="5093073338238310224">"“暂åœâ€æŒ‰é’®"</string>
diff --git a/packages/Keyguard/res/values-zh-rHK/strings.xml b/packages/Keyguard/res/values-zh-rHK/strings.xml
new file mode 100644
index 0000000..010ad2f
--- /dev/null
+++ b/packages/Keyguard/res/values-zh-rHK/strings.xml
@@ -0,0 +1,157 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"輸入 PIN 碼"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="3035856550289724338">"請輸入 SIM PUK 碼和新 PIN 碼"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="1801941051094974609">"SIM PUK 碼"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="3201151840570492538">"新 SIM PIN 碼"</string>
+ <string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"輕觸å³å¯è¼¸å…¥å¯†ç¢¼"</font></string>
+ <string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"輸入密碼å³å¯è§£éŽ–"</string>
+ <string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"輸入 PIN 碼å³å¯è§£éŽ–"</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"PIN ç¢¼ä¸æ­£ç¢ºã€‚"</string>
+ <string name="keyguard_label_text" msgid="861796461028298424">"如è¦è§£éŽ–ï¼Œè«‹æŒ‰é¸å–®éµï¼Œç„¶å¾ŒæŒ‰ 0。"</string>
+ <string name="faceunlock_multiple_failures" msgid="754137583022792429">"已超éŽè‡‰å®¹è§£éŽ–å˜—è©¦æ¬¡æ•¸ä¸Šé™"</string>
+ <string name="keyguard_charged" msgid="3272223906073492454">"充電完æˆ"</string>
+ <string name="keyguard_plugged_in" msgid="8117572000639998388">"充電中 (<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
+ <string name="keyguard_low_battery" msgid="8143808018719173859">"請連接充電器。"</string>
+ <string name="keyguard_instructions_when_pattern_disabled" msgid="1332288268600329841">"按é¸å–®éµè§£éŽ–ã€‚"</string>
+ <string name="keyguard_network_locked_message" msgid="9169717779058037168">"網絡已鎖定"</string>
+ <string name="keyguard_missing_sim_message_short" msgid="494980561304211931">"找ä¸åˆ° SIM å¡"</string>
+ <string name="keyguard_missing_sim_message" product="tablet" msgid="1445849005909260039">"å¹³æ¿é›»è…¦ä¸­æ²’有 SIM å¡ã€‚"</string>
+ <string name="keyguard_missing_sim_message" product="default" msgid="3481110395508637643">"手機中沒有 SIM å¡ã€‚"</string>
+ <string name="keyguard_missing_sim_instructions" msgid="5210891509995942250">"è«‹æ’å…¥ SIM å¡ã€‚"</string>
+ <string name="keyguard_missing_sim_instructions_long" msgid="5968985489463870358">"找ä¸åˆ° SIM 塿ˆ–ç„¡æ³•è®€å– SIM å¡ï¼Œè«‹æ’å…¥ SIM å¡ã€‚"</string>
+ <string name="keyguard_permanent_disabled_sim_message_short" msgid="8340813989586622356">"SIM å¡ç„¡æ³•使用。"</string>
+ <string name="keyguard_permanent_disabled_sim_instructions" msgid="5892940909699723544">"您的 SIM å¡å·²è¢«æ°¸ä¹…åœç”¨ã€‚\n請與您的無線æœå‹™ä¾›æ‡‰å•†è¯çµ¡ï¼Œä»¥å–å¾—å¦ä¸€å¼µ SIM å¡ã€‚"</string>
+ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM å¡è™•於鎖定狀態。"</string>
+ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM å¡è™•æ–¼ PUK 鎖定狀態。"</string>
+ <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"正在解開上鎖的 SIM å¡..."</string>
+ <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s。第 %2$d 個å°å·¥å…·ï¼Œå…± %3$d 個。"</string>
+ <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"新增å°å·¥å…·ã€‚"</string>
+ <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"空白"</string>
+ <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"解鎖å€åŸŸå·²å±•開。"</string>
+ <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"解鎖å€åŸŸå·²æ”¶åˆã€‚"</string>
+ <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g>å°å·¥å…·ã€‚"</string>
+ <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"用戶é¸å–工具"</string>
+ <string name="keyguard_accessibility_status" msgid="8008264603935930611">"狀態"</string>
+ <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"相機"</string>
+ <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"媒體控制"</string>
+ <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"已開始為å°å·¥å…·é‡æ–°æŽ’列次åºã€‚"</string>
+ <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"已完æˆç‚ºå°å·¥å…·é‡æ–°æŽ’列次åºã€‚"</string>
+ <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g>å°å·¥å…·å·²åˆªé™¤ã€‚"</string>
+ <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"展開解鎖å€åŸŸã€‚"</string>
+ <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"滑動解鎖。"</string>
+ <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"圖案解鎖。"</string>
+ <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"臉容解鎖。"</string>
+ <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"PIN 解鎖。"</string>
+ <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"密碼解鎖。"</string>
+ <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"圖案å€åŸŸã€‚"</string>
+ <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"滑動å€åŸŸã€‚"</string>
+ <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"[上一首曲目] 按鈕"</string>
+ <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"[下一首曲目] 按鈕"</string>
+ <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"[æš«åœ] 按鈕"</string>
+ <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"[播放] 按鈕"</string>
+ <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"[åœæ­¢] 按鈕"</string>
+ <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"喜歡"</string>
+ <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"ä¸å–œæ­¡"</string>
+ <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"心形"</string>
+ <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"請解鎖以繼續"</string>
+ <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"已喿¶ˆå•Ÿå‹•"</string>
+ <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"拖放「<xliff:g id="WIDGET_INDEX">%1$s</xliff:g>ã€å³å¯åˆªé™¤ã€‚"</string>
+ <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"「<xliff:g id="WIDGET_INDEX">%1$s</xliff:g>ã€å°‡ä¸æœƒè¢«åˆªé™¤ã€‚"</string>
+ <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
+ <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
+ <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
+ <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
+ <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"å–æ¶ˆ"</string>
+ <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"刪除"</string>
+ <string name="keyboardview_keycode_done" msgid="1992571118466679775">"完æˆ"</string>
+ <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"æ¨¡å¼æ›´æ”¹"</string>
+ <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift éµ"</string>
+ <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter éµ"</string>
+ <string name="description_target_unlock" msgid="2228524900439801453">"解鎖"</string>
+ <string name="description_target_camera" msgid="969071997552486814">"相機"</string>
+ <string name="description_target_silent" msgid="893551287746522182">"éœéŸ³"</string>
+ <string name="description_target_soundon" msgid="30052466675500172">"音效已開啟"</string>
+ <string name="description_target_search" msgid="3091587249776033139">"æœå°‹"</string>
+ <string name="description_direction_up" msgid="7169032478259485180">"å‘上滑動å³å¯<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>。"</string>
+ <string name="description_direction_down" msgid="5087739728639014595">"å‘下滑動å³å¯<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>。"</string>
+ <string name="description_direction_left" msgid="7207478719805562165">"å‘左滑動å³å¯<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>。"</string>
+ <string name="description_direction_right" msgid="8034433242579600980">"å‘峿»‘å‹•å³å¯<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>。"</string>
+ <string name="user_switched" msgid="3768006783166984410">"ç›®å‰çš„用戶是<xliff:g id="NAME">%1$s</xliff:g>。"</string>
+ <string name="kg_emergency_call_label" msgid="684946192523830531">"緊急電話"</string>
+ <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"忘記圖案"</string>
+ <string name="kg_wrong_pattern" msgid="1850806070801358830">"圖案錯誤"</string>
+ <string name="kg_wrong_password" msgid="2333281762128113157">"密碼錯誤"</string>
+ <string name="kg_wrong_pin" msgid="1131306510833563801">"PIN 錯誤"</string>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"請在 <xliff:g id="NUMBER">%d</xliff:g> 秒後å†è©¦ä¸€æ¬¡ã€‚"</string>
+ <string name="kg_pattern_instructions" msgid="398978611683075868">"畫出圖案"</string>
+ <string name="kg_sim_pin_instructions" msgid="2319508550934557331">"輸入 SIM å¡ PIN 碼"</string>
+ <string name="kg_pin_instructions" msgid="2377242233495111557">"輸入 PIN 碼"</string>
+ <string name="kg_password_instructions" msgid="5753646556186936819">"輸入密碼"</string>
+ <string name="kg_puk_enter_puk_hint" msgid="453227143861735537">"SIM å¡ç¾å·²åœç”¨ï¼Œè«‹è¼¸å…¥ PUK 碼以繼續。詳情請與æµå‹•網絡供應商è¯çµ¡ã€‚"</string>
+ <string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"輸入所需的 PIN 碼"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"ç¢ºèªæ‰€éœ€çš„ PIN 碼"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"正在解開上鎖的 SIM å¡..."</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"請輸入一個 4 至 8 使•¸çš„ PIN 碼。"</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"PUK 碼應由 8 個或以上數字組æˆã€‚"</string>
+ <string name="kg_invalid_puk" msgid="3638289409676051243">"è«‹é‡æ–°è¼¸å…¥æ­£ç¢ºçš„ PUK 碼。如果嘗試輸入的次數éŽå¤šï¼ŒSIM å¡å°‡æ°¸ä¹…åœç”¨ã€‚"</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"PIN 碼ä¸ç¬¦"</string>
+ <string name="kg_login_too_many_attempts" msgid="6486842094005698475">"圖案嘗試次數éŽå¤š"</string>
+ <string name="kg_login_instructions" msgid="1100551261265506448">"如è¦è§£éŽ–ï¼Œè«‹ä»¥ Google 帳戶登入。"</string>
+ <string name="kg_login_username_hint" msgid="5718534272070920364">"用戶å稱 (é›»å­éƒµä»¶)"</string>
+ <string name="kg_login_password_hint" msgid="9057289103827298549">"密碼"</string>
+ <string name="kg_login_submit_button" msgid="5355904582674054702">"登入"</string>
+ <string name="kg_login_invalid_input" msgid="5754664119319872197">"無效的用戶å稱或密碼。"</string>
+ <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"忘記用戶å稱或密碼?\nè«‹ç€è¦½ "<b>"google.com/accounts/recovery"</b>"。"</string>
+ <string name="kg_login_checking_password" msgid="1052685197710252395">"正在檢查帳戶…"</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"您已輸入錯誤的 PIN 碼 <xliff:g id="NUMBER_0">%d</xliff:g> 次。\n\n請在 <xliff:g id="NUMBER_1">%d</xliff:g> 秒後å†è©¦ä¸€æ¬¡ã€‚"</string>
+ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"您已輸入錯誤的密碼 <xliff:g id="NUMBER_0">%d</xliff:g> 次。\n\n請在 <xliff:g id="NUMBER_1">%d</xliff:g> 秒後å†è©¦ä¸€æ¬¡ã€‚"</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"您已畫錯解鎖圖案 <xliff:g id="NUMBER_0">%d</xliff:g> 次。\n\n請在 <xliff:g id="NUMBER_1">%d</xliff:g> 秒後å†è©¦ä¸€æ¬¡ã€‚"</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1575557200627128949">"您嘗試了 <xliff:g id="NUMBER_0">%d</xliff:g> æ¬¡ä»æœªèƒ½æˆåŠŸè§£é–‹é€™éƒ¨ä¸ŠéŽ–çš„å¹³æ¿é›»è…¦ã€‚如果å†å˜—試 <xliff:g id="NUMBER_1">%d</xliff:g> æ¬¡ä»æœªæˆåŠŸï¼Œå¹³æ¿é›»è…¦å°‡å›žå¾©åŽŸå» è¨­å®šï¼Œæ‰€æœ‰ç”¨æˆ¶è³‡æ–™å‡æœƒå¤±åŽ»ã€‚"</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="4051015943038199910">"您嘗試了 <xliff:g id="NUMBER_0">%d</xliff:g> æ¬¡ä»æœªèƒ½æˆåŠŸè§£é–‹é€™éƒ¨ä¸ŠéŽ–çš„æ‰‹æ©Ÿã€‚å¦‚æžœå†å˜—試 <xliff:g id="NUMBER_1">%d</xliff:g> æ¬¡ä»æœªæˆåŠŸï¼Œæ‰‹æ©Ÿå°‡å›žå¾©åŽŸå» è¨­å®šï¼Œæ‰€æœ‰ç”¨æˆ¶è³‡æ–™å‡æœƒå¤±åŽ»ã€‚"</string>
+ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="2072996269148483637">"您嘗試了 <xliff:g id="NUMBER">%d</xliff:g> æ¬¡ä»æœªèƒ½æˆåŠŸè§£é–‹é€™éƒ¨ä¸ŠéŽ–çš„å¹³æ¿é›»è…¦ã€‚å¹³æ¿é›»è…¦ç¾åœ¨å°‡å›žå¾©åŽŸå» è¨­å®šã€‚"</string>
+ <string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"您嘗試了 <xliff:g id="NUMBER">%d</xliff:g> æ¬¡ä»æœªèƒ½æˆåŠŸè§£é–‹é€™éƒ¨ä¸ŠéŽ–çš„æ‰‹æ©Ÿã€‚æ‰‹æ©Ÿç¾åœ¨å°‡å›žå¾©åŽŸå» è¨­å®šã€‚"</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"您已畫錯解鎖圖案 <xliff:g id="NUMBER_0">%d</xliff:g> 次,如果å†å˜—試 <xliff:g id="NUMBER_1">%d</xliff:g> æ¬¡ä»æœªæˆåŠŸï¼Œç³»çµ±æœƒè¦æ±‚您é€éŽé›»éƒµå¸³æˆ¶è§£é–‹ä¸ŠéŽ–çš„å¹³æ¿é›»è…¦ã€‚\n\n請在 <xliff:g id="NUMBER_2">%d</xliff:g> 秒後å†è©¦ä¸€æ¬¡ã€‚"</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"您已畫錯解鎖圖案 <xliff:g id="NUMBER_0">%d</xliff:g> 次,如果å†å˜—試 <xliff:g id="NUMBER_1">%d</xliff:g> æ¬¡ä»æœªæˆåŠŸï¼Œç³»çµ±æœƒè¦æ±‚您é€éŽé›»éƒµå¸³æˆ¶è§£é–‹ä¸ŠéŽ–çš„æ‰‹æ©Ÿã€‚\n\n請在 <xliff:g id="NUMBER_2">%d</xliff:g> 秒後å†è©¦ä¸€æ¬¡ã€‚"</string>
+ <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
+ <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"移除"</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"SIM PIN ç¢¼ä¸æ­£ç¢ºï¼Œæ‚¨ç¾åœ¨å¿…é ˆè¯çµ¡æµå‹•網絡供應商為您的è£ç½®è§£éŽ–ã€‚"</string>
+ <plurals name="kg_password_wrong_pin_code">
+ <item quantity="one" msgid="8134313997799638254">"SIM PIN ç¢¼ä¸æ­£ç¢ºï¼Œæ‚¨å‰©ä¸‹ <xliff:g id="NUMBER">%d</xliff:g> 次機會輸入。如果ä»ç„¶è¼¸å…¥éŒ¯èª¤ï¼Œæ‚¨å¿…é ˆè¯çµ¡æµå‹•網絡供應商為您的è£ç½®è§£éŽ–ã€‚"</item>
+ <item quantity="other" msgid="2215723361575359486">"SIM PIN ç¢¼ä¸æ­£ç¢ºï¼Œæ‚¨å‰©ä¸‹ <xliff:g id="NUMBER">%d</xliff:g> 次機會輸入。"</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="7077536808291316208">"SIM 無法使用,請è¯çµ¡æ‚¨çš„æµå‹•ç¶²çµ¡ä¾›æ‡‰å•†ã€‚"</string>
+ <plurals name="kg_password_wrong_puk_code">
+ <item quantity="one" msgid="3256893607561060649">"SIM PUK ç¢¼ä¸æ­£ç¢ºï¼Œæ‚¨å‰©ä¸‹ <xliff:g id="NUMBER">%d</xliff:g> 次機會輸入。如果ä»ç„¶è¼ªå…¥éŒ¯èª¤ï¼ŒSIM 將永久無法使用。"</item>
+ <item quantity="other" msgid="5477305226026342036">"SIM PUK ç¢¼ä¸æ­£ç¢ºï¼Œæ‚¨å‰©ä¸‹ <xliff:g id="NUMBER">%d</xliff:g> 次機會輸入。如果ä»ç„¶è¼¸å…¥éŒ¯èª¤ï¼ŒSIM 將永久無法使用。"</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="6268288093558031564">"SIM PIN 碼æ“作失敗ï¼"</string>
+ <string name="kg_password_puk_failed" msgid="2838824369502455984">"SIM PUK 碼æ“作失敗ï¼"</string>
+ <string name="kg_pin_accepted" msgid="1448241673570020097">"密碼正確ï¼"</string>
+ <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"[上一首曲目] 按鈕"</string>
+ <string name="keyguard_transport_next_description" msgid="4299258300283778305">"[下一首曲目] 按鈕"</string>
+ <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"[æš«åœ] 按鈕"</string>
+ <string name="keyguard_transport_play_description" msgid="2924628863741150956">"[播放] 按鈕"</string>
+ <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"[åœæ­¢] 按鈕"</string>
+ <string name="keyguard_carrier_default" msgid="8700650403054042153">"沒有æœå‹™ã€‚"</string>
+</resources>
diff --git a/packages/Keyguard/res/values-zh-rTW/strings.xml b/packages/Keyguard/res/values-zh-rTW/strings.xml
index 72a1c0f..d81cc16 100644
--- a/packages/Keyguard/res/values-zh-rTW/strings.xml
+++ b/packages/Keyguard/res/values-zh-rTW/strings.xml
@@ -21,9 +21,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"輸入 PIN 碼"</string>
- <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"輸入 PUK 碼和新 PIN 碼"</string>
- <string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"PUK 碼"</string>
- <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"新 PIN 碼"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="3035856550289724338">"輸入 SIM å¡ PUK 碼和新 PIN 碼"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="1801941051094974609">"SIM å¡ PUK 碼"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="3201151840570492538">"新增 SIM å¡ PIN 碼"</string>
<string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"輕觸å³å¯è¼¸å…¥å¯†ç¢¼"</font></string>
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"輸入密碼å³å¯è§£éŽ–"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"輸入 PIN å³å¯è§£éŽ–"</string>
@@ -71,6 +71,13 @@
<string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"[æš«åœ] 按鈕"</string>
<string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"[播放] 按鈕"</string>
<string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"[åœæ­¢] 按鈕"</string>
+ <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"喜歡"</string>
+ <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"ä¸å–œæ­¡"</string>
+ <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"愛心"</string>
+ <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"先解鎖æ‰èƒ½ç¹¼çºŒæ“作"</string>
+ <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"已喿¶ˆå•Ÿå‹•"</string>
+ <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"拖放「<xliff:g id="WIDGET_INDEX">%1$s</xliff:g>ã€å³å¯å°‡å…¶åˆªé™¤ã€‚"</string>
+ <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"「<xliff:g id="WIDGET_INDEX">%1$s</xliff:g>ã€å°‡ä¸æœƒé­åˆ°åˆªé™¤ã€‚"</string>
<string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
<string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
<string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
@@ -105,7 +112,6 @@
<string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"輸入所需的 PIN 碼"</string>
<string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"ç¢ºèªæ‰€éœ€çš„ PIN 碼"</string>
<string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"正在解除 SIM å¡éŽ–å®š..."</string>
- <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"PIN ç¢¼ä¸æ­£ç¢ºã€‚"</string>
<string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"請輸入 4 到 8 碼的 PIN。"</string>
<string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"PUK 碼至少必須為 8 碼。"</string>
<string name="kg_invalid_puk" msgid="3638289409676051243">"釿–°è¼¸å…¥æ­£ç¢ºçš„ PUK 碼。如果錯誤次數éŽå¤šï¼ŒSIM å¡å°‡æœƒæ°¸ä¹…åœç”¨ã€‚"</string>
@@ -129,6 +135,19 @@
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"您的解鎖圖形已畫錯 <xliff:g id="NUMBER_0">%d</xliff:g> 次,如果å†å˜—試 <xliff:g id="NUMBER_1">%d</xliff:g> æ¬¡ä»æœªæˆåŠŸï¼Œç³»çµ±å°±æœƒè¦æ±‚您é€éŽé›»å­éƒµä»¶å¸³æˆ¶è§£é™¤æ‰‹æ©Ÿçš„鎖定狀態。\n\n請在 <xliff:g id="NUMBER_2">%d</xliff:g> 秒後å†è©¦ä¸€æ¬¡ã€‚"</string>
<string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
<string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"移除"</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"SIM å¡çš„ PIN 碼輸入錯誤,您ç¾åœ¨å¿…須請行動通訊業者為è£ç½®è§£éŽ–ã€‚"</string>
+ <plurals name="kg_password_wrong_pin_code">
+ <item quantity="one" msgid="8134313997799638254">"SIM å¡çš„ PIN 碼輸入錯誤,您還å¯ä»¥å†è©¦ <xliff:g id="NUMBER">%d</xliff:g> 次。如果ä»ç„¶å¤±æ•—,就必須請行動通訊業者為è£ç½®è§£éŽ–ã€‚"</item>
+ <item quantity="other" msgid="2215723361575359486">"SIM å¡çš„ PIN 碼輸入錯誤,您還å¯ä»¥å†è©¦ <xliff:g id="NUMBER">%d</xliff:g> 次。"</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="7077536808291316208">"SIM å¡ç„¡æ³•使用,請與您的行動通訊業者è¯çµ¡ã€‚"</string>
+ <plurals name="kg_password_wrong_puk_code">
+ <item quantity="one" msgid="3256893607561060649">"SIM å¡çš„ PUK 碼輸入錯誤,您還å¯ä»¥å†è©¦ <xliff:g id="NUMBER">%d</xliff:g> 次。如果ä»ç„¶å¤±æ•—,SIM å¡å°‡æ°¸ä¹…無法使用。"</item>
+ <item quantity="other" msgid="5477305226026342036">"SIM å¡çš„ PUK 碼輸入錯誤,您還å¯ä»¥å†è©¦ <xliff:g id="NUMBER">%d</xliff:g> 次。如果ä»ç„¶å¤±æ•—,SIM å¡å°‡æ°¸ä¹…無法使用。"</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="6268288093558031564">"SIM å¡ PIN 碼æ“作失敗ï¼"</string>
+ <string name="kg_password_puk_failed" msgid="2838824369502455984">"SIM å¡ PUK 碼æ“作失敗ï¼"</string>
+ <string name="kg_pin_accepted" msgid="1448241673570020097">"密碼正確ï¼"</string>
<string name="keyguard_transport_prev_description" msgid="8229108430245669854">"[上一首曲目] 按鈕"</string>
<string name="keyguard_transport_next_description" msgid="4299258300283778305">"[下一首曲目] 按鈕"</string>
<string name="keyguard_transport_pause_description" msgid="5093073338238310224">"[æš«åœ] 按鈕"</string>
diff --git a/packages/Keyguard/res/values-zu/strings.xml b/packages/Keyguard/res/values-zu/strings.xml
index 185ea03..b205634 100644
--- a/packages/Keyguard/res/values-zu/strings.xml
+++ b/packages/Keyguard/res/values-zu/strings.xml
@@ -21,9 +21,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"Faka ikhodi ye-PIN"</string>
- <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"Faka i-PUK nephinikhodi entsha"</string>
- <string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"Ikhodi le-PUK"</string>
- <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"Iphinikhodi entsha"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="3035856550289724338">"Thayipha i-PUK ye-SIM nekhodi yephinikhodi entsha"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="1801941051094974609">"Ikhodi ye-PUK ye-SIM"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="3201151840570492538">"Ikhodi entsha yephinikhodi ye-SIM"</string>
<string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"Thinta ukubhala iphasiwedi"</font></string>
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Bhala iphasiwedi ukuze kuvuleke"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Faka i-PIN ukuvula"</string>
@@ -71,6 +71,13 @@
<string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Inkinobho yokumiswa isikhashana"</string>
<string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Inkinobho yokudlala"</string>
<string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Inkinobho yokumisa"</string>
+ <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Okushaphu"</string>
+ <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Akulungile"</string>
+ <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Inhliziyo"</string>
+ <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Vula ukuze uqhubeke"</string>
+ <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Ukuqalisa kukhanseliwe"</string>
+ <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Lahla i-<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> ukuze uyisuse."</string>
+ <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> ngeke isuswe."</string>
<string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
<string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
<string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
@@ -105,7 +112,6 @@
<string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"Faka iphinikhodi oyithandayo"</string>
<string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"Qiniseka iphinikhodi oyithandayo"</string>
<string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"Ivula ikhadi le-SIM..."</string>
- <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"Iphinikhodi engalungile."</string>
<string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"Thayipha iphinikhodi enezinombolo ezingu-4 kuya kwezingu-8."</string>
<string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"Ikhodi ye-PUK kufanele ibe yizinombolo ezingu-8 noma eziningi."</string>
<string name="kg_invalid_puk" msgid="3638289409676051243">"Faka kabusha ikhodi ye-PUK elungile. Imizamo ephindiwe izokhubaza unaphakade i-SIM."</string>
@@ -129,6 +135,19 @@
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Ukulayisha ungenisa iphathini yakho yokuvula ngendlela engalungile izikhathi ezi-<xliff:g id="NUMBER_0">%d</xliff:g> Emva kweminye imizamo engu-<xliff:g id="NUMBER_1">%d</xliff:g>, uzocelwa ukuvula ifoni yakho usebenzisa ukungena ngemvume ku-Google\n\n Zame futhi emumva kwengu- <xliff:g id="NUMBER_2">%d</xliff:g> amasekhondi."</string>
<string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
<string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Susa"</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"Ikhodi yephinikhodi ye-SIM engalungile manje kumele uxhumane nenkampini yenethiwekhi yakho ukuvula idivayisi yakho."</string>
+ <plurals name="kg_password_wrong_pin_code">
+ <item quantity="one" msgid="8134313997799638254">"Ikhodi yephinikhodi ye-SIM engalungile, unemizamo engu-<xliff:g id="NUMBER">%d</xliff:g> esele ngaphambi kokuba uxhumane nenkampini yenethiwekhi."</item>
+ <item quantity="other" msgid="2215723361575359486">"Ikhodi yephinikhodi ye-SIM engalungile, unemizamo esele engu-<xliff:g id="NUMBER">%d</xliff:g>."</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="7077536808291316208">"I-SIM ayisebenziseki. Xhumana nemkampini yenethiwekhi yakho."</string>
+ <plurals name="kg_password_wrong_puk_code">
+ <item quantity="one" msgid="3256893607561060649">"Ikhodi ye-PUK ye-SIM engalungile, unemizamo engu-<xliff:g id="NUMBER">%d</xliff:g> esele ngaphambi kokuba i-SIM ibe engasebenziseki unaphakade."</item>
+ <item quantity="other" msgid="5477305226026342036">"Ikhodi ye-PUK ye-SIM engalungile, unemizamo engu-<xliff:g id="NUMBER">%d</xliff:g> esele ngaphambi kokuba i-SIM iba engasebenziseki unaphakade."</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="6268288093558031564">"Umsebenzi wephinikhodi ye-SIM wehlulekile!"</string>
+ <string name="kg_password_puk_failed" msgid="2838824369502455984">"Umsebenzi we-PUK ye-SIM wehlulekile!"</string>
+ <string name="kg_pin_accepted" msgid="1448241673570020097">"Ikhodi yamukelwe!"</string>
<string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Inkinombo yethrekhi yangaphambilini"</string>
<string name="keyguard_transport_next_description" msgid="4299258300283778305">"Inkinobho yethrekhi elandelayo"</string>
<string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Inkinobho yokumiswa isikhashana"</string>
diff --git a/packages/PrintSpooler/res/values-af/strings.xml b/packages/PrintSpooler/res/values-af/strings.xml
new file mode 100644
index 0000000..b8287ae
--- /dev/null
+++ b/packages/PrintSpooler/res/values-af/strings.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4469836075319831821">"Drukwaglys"</string>
+ <string name="advanced_settings_button" msgid="5764225091289415632">"Drukkerinstellings"</string>
+ <string name="print_button" msgid="645164566271246268">"Druk"</string>
+ <string name="save_button" msgid="1921310454071758999">"Stoor"</string>
+ <string name="label_destination" msgid="9132510997381599275">"Bestemming"</string>
+ <string name="label_copies" msgid="3634531042822968308">"Afskrifte"</string>
+ <string name="label_paper_size" msgid="8681895607876809323">"Papiergrootte"</string>
+ <string name="label_color" msgid="1108690305218188969">"Kleur"</string>
+ <string name="label_orientation" msgid="2853142581990496477">"Oriëntasie"</string>
+ <string name="label_pages" msgid="6300874667546617333">"Bladsye (<xliff:g id="PAGE_COUNT">%1$s</xliff:g>)"</string>
+ <string name="pages_range_example" msgid="8558694453556945172">"bv. 1—5,8,11—13"</string>
+ <string name="print_preview" msgid="8010217796057763343">"Drukvoorskou"</string>
+ <string name="install_for_print_preview" msgid="6366303997385509332">"Installeer PDF-bekyker vir voorskou"</string>
+ <string name="printing_app_crashed" msgid="854477616686566398">"Drukkerprogram het omgeval"</string>
+ <string name="page_count_unknown" msgid="6058852665954511124">"Bladsye"</string>
+ <string name="generating_print_job" msgid="3119608742651698916">"Genereer uitdruktaak"</string>
+ <string name="save_as_pdf" msgid="5718454119847596853">"Stoor as PDF"</string>
+ <string name="all_printers" msgid="5018829726861876202">"Alle drukkers…"</string>
+ <string name="print_dialog" msgid="32628687461331979">"Drukdialoog"</string>
+ <string name="search" msgid="5421724265322228497">"Deursoek"</string>
+ <string name="all_printers_label" msgid="3178848870161526399">"Alle drukkers"</string>
+ <string name="add_print_service_label" msgid="5356702546188981940">"Voeg diens by"</string>
+ <string name="print_search_box_shown_utterance" msgid="7967404953901376090">"Soekkassie vertoon"</string>
+ <string name="print_search_box_hidden_utterance" msgid="5727755169343113351">"Soekkassie weggesteek"</string>
+ <string name="print_add_printer" msgid="1088656468360653455">"Voeg drukker by"</string>
+ <plurals name="print_search_result_count_utterance">
+ <item quantity="one" msgid="4484953260685964252">"<xliff:g id="COUNT">%1$s</xliff:g> drukker gekry"</item>
+ <item quantity="other" msgid="6533817036607128241">"<xliff:g id="COUNT">%1$s</xliff:g> drukkers gekry"</item>
+ </plurals>
+ <string name="choose_print_service" msgid="3740309762324459694">"Kies drukdiens"</string>
+ <string name="print_searching_for_printers" msgid="6550424555079932867">"Soek tans vir drukkers"</string>
+ <string name="print_no_printers" msgid="4869403323900054866">"Geen drukkers gekry nie"</string>
+ <string name="printing_notification_title_template" msgid="295903957762447362">"Druk tans <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Kanselleer tans <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="failed_notification_title_template" msgid="2256217208186530973">"Drukkerfout by <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="blocked_notification_title_template" msgid="1175435827331588646">"Drukker het <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> geblokkeer"</string>
+ <plurals name="composite_notification_title_template">
+ <item quantity="one" msgid="5866624638054847057">"<xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g>-uitdruktaak"</item>
+ <item quantity="other" msgid="8746611264734222865">"<xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g>-uitdruktake"</item>
+ </plurals>
+ <string name="cancel" msgid="4373674107267141885">"Kanselleer"</string>
+ <string name="restart" msgid="2472034227037808749">"Herbegin"</string>
+ <string name="no_connection_to_printer" msgid="2159246915977282728">"Geen verbinding met drukker nie"</string>
+ <string name="reason_unknown" msgid="5507940196503246139">"onbekend"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – nie beskikbaar nie"</string>
+ <string name="print_error_default_message" msgid="8568506918983980567">"Kon nie uitdruktaak genereer nie"</string>
+ <string-array name="color_mode_labels">
+ <item msgid="7602948745415174937">"Swart en wit"</item>
+ <item msgid="2762241247228983754">"Kleur"</item>
+ </string-array>
+ <string-array name="orientation_labels">
+ <item msgid="4061931020926489228">"Portret"</item>
+ <item msgid="3199660090246166812">"Landskap"</item>
+ </string-array>
+ <string-array name="page_options_labels">
+ <item msgid="7421377442011699994">"Alles"</item>
+ <item msgid="6812869625222503603">"Reikwydte"</item>
+ </string-array>
+</resources>
diff --git a/packages/PrintSpooler/res/values-am/strings.xml b/packages/PrintSpooler/res/values-am/strings.xml
new file mode 100644
index 0000000..d73cdd9
--- /dev/null
+++ b/packages/PrintSpooler/res/values-am/strings.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4469836075319831821">"የህትመት አስተላላáŠ"</string>
+ <string name="advanced_settings_button" msgid="5764225091289415632">"የአታሚ ቅንብሮች"</string>
+ <string name="print_button" msgid="645164566271246268">"አትáˆ"</string>
+ <string name="save_button" msgid="1921310454071758999">"አስቀáˆáŒ¥"</string>
+ <string name="label_destination" msgid="9132510997381599275">"መድረሻ"</string>
+ <string name="label_copies" msgid="3634531042822968308">"ቅጂዎች"</string>
+ <string name="label_paper_size" msgid="8681895607876809323">"የወረቀት መጠን"</string>
+ <string name="label_color" msgid="1108690305218188969">"ቀለáˆ"</string>
+ <string name="label_orientation" msgid="2853142581990496477">"አቀማመጠ ገá…"</string>
+ <string name="label_pages" msgid="6300874667546617333">"ገጾች (<xliff:g id="PAGE_COUNT">%1$s</xliff:g>)"</string>
+ <string name="pages_range_example" msgid="8558694453556945172">"ለáˆáˆ³áˆŒá¦ 1–5,8,11–13"</string>
+ <string name="print_preview" msgid="8010217796057763343">"የህትመት ቅድመ እይታ"</string>
+ <string name="install_for_print_preview" msgid="6366303997385509332">"ለቅድመ-እይታ የᒠዲ ኤá መመáˆáŠ¨á‰» ይጫኑ"</string>
+ <string name="printing_app_crashed" msgid="854477616686566398">"የአታሚ መተáŒá‰ áˆªá‹« ተበላሽቷáˆ"</string>
+ <string name="page_count_unknown" msgid="6058852665954511124">"ገá†á‰½"</string>
+ <string name="generating_print_job" msgid="3119608742651698916">"የህትመት ስራን በማመንጨት ላይ"</string>
+ <string name="save_as_pdf" msgid="5718454119847596853">"እንደ ᒠዲ ኤá አስቀáˆáŒ¥"</string>
+ <string name="all_printers" msgid="5018829726861876202">"áˆáˆ‰áˆ አታሚዎች…"</string>
+ <string name="print_dialog" msgid="32628687461331979">"የህትመት መገናኛ"</string>
+ <string name="search" msgid="5421724265322228497">"áለጋ"</string>
+ <string name="all_printers_label" msgid="3178848870161526399">"áˆáˆ‰áˆ አታሚዎች"</string>
+ <string name="add_print_service_label" msgid="5356702546188981940">"አገáˆáŒáˆŽá‰µ አክáˆ"</string>
+ <string name="print_search_box_shown_utterance" msgid="7967404953901376090">"የáለጋ ሳጥን ይታያáˆ"</string>
+ <string name="print_search_box_hidden_utterance" msgid="5727755169343113351">"የáለጋ ሳጥን ተደብቋáˆ"</string>
+ <string name="print_add_printer" msgid="1088656468360653455">"አታሚ አክáˆ"</string>
+ <plurals name="print_search_result_count_utterance">
+ <item quantity="one" msgid="4484953260685964252">"<xliff:g id="COUNT">%1$s</xliff:g> አታሚ ተገáŠá‰·áˆ"</item>
+ <item quantity="other" msgid="6533817036607128241">"<xliff:g id="COUNT">%1$s</xliff:g> አታሚዎች ተገáŠá‰°á‹‹áˆ"</item>
+ </plurals>
+ <string name="choose_print_service" msgid="3740309762324459694">"የህትመት አገáˆáŒáˆŽá‰µ á‹­áˆáˆ¨áŒ¡"</string>
+ <string name="print_searching_for_printers" msgid="6550424555079932867">"አታሚዎችን በመáˆáˆˆáŒ ላይ"</string>
+ <string name="print_no_printers" msgid="4869403323900054866">"áˆáŠ•áˆ áŠ á‰³áˆšá‹Žá‰½ አáˆá‰°áŒˆáŠ™áˆ"</string>
+ <string name="printing_notification_title_template" msgid="295903957762447362">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>ን በማተሠላይ"</string>
+ <string name="cancelling_notification_title_template" msgid="1821759594704703197">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>ን በመተዠላይ"</string>
+ <string name="failed_notification_title_template" msgid="2256217208186530973">"የአታሚ ስህተት <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="blocked_notification_title_template" msgid="1175435827331588646">"አታሚ <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>ን አáŒá‹·áˆ"</string>
+ <plurals name="composite_notification_title_template">
+ <item quantity="one" msgid="5866624638054847057">"<xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g> የህትመት ስራ"</item>
+ <item quantity="other" msgid="8746611264734222865">"<xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g> የህትመት ስራዎች"</item>
+ </plurals>
+ <string name="cancel" msgid="4373674107267141885">"ሰርá‹"</string>
+ <string name="restart" msgid="2472034227037808749">"እንደገና ጀáˆáˆ­"</string>
+ <string name="no_connection_to_printer" msgid="2159246915977282728">"ከአታሚ ጋር áˆáŠ•áˆ áŒáŠ•áŠ™áŠá‰µ የለáˆ"</string>
+ <string name="reason_unknown" msgid="5507940196503246139">"አይታወቅáˆ"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – አይገáŠáˆ"</string>
+ <string name="print_error_default_message" msgid="8568506918983980567">"የህትመት ስራን ማመንጨት አáˆá‰°á‰»áˆˆáˆ"</string>
+ <string-array name="color_mode_labels">
+ <item msgid="7602948745415174937">"ጥá‰áˆ­ እና áŠáŒ­"</item>
+ <item msgid="2762241247228983754">"ቀለáˆ"</item>
+ </string-array>
+ <string-array name="orientation_labels">
+ <item msgid="4061931020926489228">"የá‰áˆ"</item>
+ <item msgid="3199660090246166812">"የወርድ"</item>
+ </string-array>
+ <string-array name="page_options_labels">
+ <item msgid="7421377442011699994">"áˆáˆ‰áˆ"</item>
+ <item msgid="6812869625222503603">"áˆáŒ¥áŒ¥áŠ áŒˆáŒ½á‰³"</item>
+ </string-array>
+</resources>
diff --git a/packages/PrintSpooler/res/values-ar/strings.xml b/packages/PrintSpooler/res/values-ar/strings.xml
new file mode 100644
index 0000000..14b6467
--- /dev/null
+++ b/packages/PrintSpooler/res/values-ar/strings.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4469836075319831821">"Print Spooler"</string>
+ <string name="advanced_settings_button" msgid="5764225091289415632">"إعدادات الطابعة"</string>
+ <string name="print_button" msgid="645164566271246268">"طباعة"</string>
+ <string name="save_button" msgid="1921310454071758999">"Ø­ÙØ¸"</string>
+ <string name="label_destination" msgid="9132510997381599275">"الوجهة"</string>
+ <string name="label_copies" msgid="3634531042822968308">"عدد النسخ"</string>
+ <string name="label_paper_size" msgid="8681895607876809323">"حجم الورق"</string>
+ <string name="label_color" msgid="1108690305218188969">"اللون"</string>
+ <string name="label_orientation" msgid="2853142581990496477">"الاتجاه"</string>
+ <string name="label_pages" msgid="6300874667546617333">"Ø§Ù„ØµÙØ­Ø§Øª (<xliff:g id="PAGE_COUNT">%1$s</xliff:g>)"</string>
+ <string name="pages_range_example" msgid="8558694453556945172">"على سبيل المثال، 1—5،8،11—13"</string>
+ <string name="print_preview" msgid="8010217796057763343">"معاينة قبل الطباعة"</string>
+ <string name="install_for_print_preview" msgid="6366303997385509332">"â€ØªØ«Ø¨ÙŠØª برنامج عرض PDF للمعاينة"</string>
+ <string name="printing_app_crashed" msgid="854477616686566398">"تعطّل تطبيق الطباعة"</string>
+ <string name="page_count_unknown" msgid="6058852665954511124">"Ø§Ù„ØµÙØ­Ø§Øª"</string>
+ <string name="generating_print_job" msgid="3119608742651698916">"جار٠إنشاء مهمة الطباعة"</string>
+ <string name="save_as_pdf" msgid="5718454119847596853">"â€Ø­Ùظ بتنسيق PDF"</string>
+ <string name="all_printers" msgid="5018829726861876202">"جميع الطابعات…"</string>
+ <string name="print_dialog" msgid="32628687461331979">"مربع حوار الطباعة"</string>
+ <string name="search" msgid="5421724265322228497">"بحث"</string>
+ <string name="all_printers_label" msgid="3178848870161526399">"جميع الطابعات"</string>
+ <string name="add_print_service_label" msgid="5356702546188981940">"Ø¥Ø¶Ø§ÙØ© خدمة"</string>
+ <string name="print_search_box_shown_utterance" msgid="7967404953901376090">"تم إظهار مربع البحث"</string>
+ <string name="print_search_box_hidden_utterance" msgid="5727755169343113351">"تم Ø¥Ø®ÙØ§Ø¡ مربع البحث"</string>
+ <string name="print_add_printer" msgid="1088656468360653455">"Ø¥Ø¶Ø§ÙØ© طابعة"</string>
+ <plurals name="print_search_result_count_utterance">
+ <item quantity="one" msgid="4484953260685964252">"تم العثور على <xliff:g id="COUNT">%1$s</xliff:g> طابعة"</item>
+ <item quantity="other" msgid="6533817036607128241">"تم العثور على <xliff:g id="COUNT">%1$s</xliff:g> من الطابعات"</item>
+ </plurals>
+ <string name="choose_print_service" msgid="3740309762324459694">"اختر خدمة طباعة"</string>
+ <string name="print_searching_for_printers" msgid="6550424555079932867">"البحث عن طابعات"</string>
+ <string name="print_no_printers" msgid="4869403323900054866">"لم يتم العثور على طابعات"</string>
+ <string name="printing_notification_title_template" msgid="295903957762447362">"جار٠طباعة <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="cancelling_notification_title_template" msgid="1821759594704703197">"جار٠إلغاء <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="failed_notification_title_template" msgid="2256217208186530973">"خطا ÙÙŠ الطابعة <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="blocked_notification_title_template" msgid="1175435827331588646">"Ø±ÙØ¶Øª الطابعة <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <plurals name="composite_notification_title_template">
+ <item quantity="one" msgid="5866624638054847057">"<xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g> مهمة طباعة"</item>
+ <item quantity="other" msgid="8746611264734222865">"<xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g> من مهام الطباعة"</item>
+ </plurals>
+ <string name="cancel" msgid="4373674107267141885">"إلغاء"</string>
+ <string name="restart" msgid="2472034227037808749">"إعادة تشغيل"</string>
+ <string name="no_connection_to_printer" msgid="2159246915977282728">"لا يوجد اتصال بالطابعة"</string>
+ <string name="reason_unknown" msgid="5507940196503246139">"غير معروÙ"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – غير متاحة"</string>
+ <string name="print_error_default_message" msgid="8568506918983980567">"تعذر إنشاء عملية الطباعة"</string>
+ <string-array name="color_mode_labels">
+ <item msgid="7602948745415174937">"أبيض وأسود"</item>
+ <item msgid="2762241247228983754">"اللون"</item>
+ </string-array>
+ <string-array name="orientation_labels">
+ <item msgid="4061931020926489228">"عمودي"</item>
+ <item msgid="3199660090246166812">"Ø£Ùقية"</item>
+ </string-array>
+ <string-array name="page_options_labels">
+ <item msgid="7421377442011699994">"الكل"</item>
+ <item msgid="6812869625222503603">"النطاق"</item>
+ </string-array>
+</resources>
diff --git a/packages/PrintSpooler/res/values-be/arrays.xml b/packages/PrintSpooler/res/values-be/arrays.xml
deleted file mode 100644
index d40278c..0000000
--- a/packages/PrintSpooler/res/values-be/arrays.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2013 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<resources>
-
- <string-array name="pdf_printer_media_sizes" translatable="false">
- <item>NA_LETTER</item>
- <item>NA_GOVT_LETTER</item>
- <item>NA_LEGAL</item>
- <item>NA_JUNIOR_LEGAL</item>
- <item>NA_LEDGER</item>
- <item>NA_TABLOID</item>
- <item>NA_INDEX_3X5</item>
- <item>NA_INDEX_4X6</item>
- <item>NA_INDEX_5X8</item>
- <item>NA_MONARCH</item>
- <item>NA_QUARTO</item>
- <item>NA_FOOLSCAP</item>
- </string-array>
-
-</resources>
diff --git a/packages/PrintSpooler/res/values-bg/strings.xml b/packages/PrintSpooler/res/values-bg/strings.xml
new file mode 100644
index 0000000..47f86c6
--- /dev/null
+++ b/packages/PrintSpooler/res/values-bg/strings.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4469836075319831821">"Спулер за печат"</string>
+ <string name="advanced_settings_button" msgid="5764225091289415632">"ÐаÑтройки на принтера"</string>
+ <string name="print_button" msgid="645164566271246268">"Печат"</string>
+ <string name="save_button" msgid="1921310454071758999">"Запазване"</string>
+ <string name="label_destination" msgid="9132510997381599275">"МеÑтоназначение"</string>
+ <string name="label_copies" msgid="3634531042822968308">"КопиÑ"</string>
+ <string name="label_paper_size" msgid="8681895607876809323">"Размер на хартиÑта"</string>
+ <string name="label_color" msgid="1108690305218188969">"ЦвÑÑ‚"</string>
+ <string name="label_orientation" msgid="2853142581990496477">"ОриентациÑ"</string>
+ <string name="label_pages" msgid="6300874667546617333">"Страници (<xliff:g id="PAGE_COUNT">%1$s</xliff:g>)"</string>
+ <string name="pages_range_example" msgid="8558694453556945172">"напр. 1–5, 8, 11–13"</string>
+ <string name="print_preview" msgid="8010217796057763343">"Ð’Ð¸Ð·ÑƒÐ°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð·Ð° печат"</string>
+ <string name="install_for_print_preview" msgid="6366303997385509332">"ИнÑталиране на визуализатор на PDF"</string>
+ <string name="printing_app_crashed" msgid="854477616686566398">"Получи Ñе Ñрив в приложението за отпечатване"</string>
+ <string name="page_count_unknown" msgid="6058852665954511124">"Страници"</string>
+ <string name="generating_print_job" msgid="3119608742651698916">"Заданието за печат Ñе генерира"</string>
+ <string name="save_as_pdf" msgid="5718454119847596853">"Запазване като PDF"</string>
+ <string name="all_printers" msgid="5018829726861876202">"Ð’Ñички принтери…"</string>
+ <string name="print_dialog" msgid="32628687461331979">"Диалогов прозорец за отпечатване"</string>
+ <string name="search" msgid="5421724265322228497">"ТърÑене"</string>
+ <string name="all_printers_label" msgid="3178848870161526399">"Ð’Ñички принтери"</string>
+ <string name="add_print_service_label" msgid="5356702546188981940">"ДобавÑне на уÑлуга"</string>
+ <string name="print_search_box_shown_utterance" msgid="7967404953901376090">"Полето за търÑене е показано"</string>
+ <string name="print_search_box_hidden_utterance" msgid="5727755169343113351">"Полето за търÑене е Ñкрито"</string>
+ <string name="print_add_printer" msgid="1088656468360653455">"ДобавÑне на принтер"</string>
+ <plurals name="print_search_result_count_utterance">
+ <item quantity="one" msgid="4484953260685964252">"Ðамерен е <xliff:g id="COUNT">%1$s</xliff:g> принтер"</item>
+ <item quantity="other" msgid="6533817036607128241">"Ðамерени Ñа <xliff:g id="COUNT">%1$s</xliff:g> принтера"</item>
+ </plurals>
+ <string name="choose_print_service" msgid="3740309762324459694">"Избиране на уÑлуга за отпечатване"</string>
+ <string name="print_searching_for_printers" msgid="6550424555079932867">"ТърÑÑÑ‚ Ñе принтери"</string>
+ <string name="print_no_printers" msgid="4869403323900054866">"ÐÑма намерени принтери"</string>
+ <string name="printing_notification_title_template" msgid="295903957762447362">"„<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>“ Ñе отпечатва"</string>
+ <string name="cancelling_notification_title_template" msgid="1821759594704703197">"„<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>“ Ñе анулира"</string>
+ <string name="failed_notification_title_template" msgid="2256217208186530973">"Грешка в принтера при „<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>“"</string>
+ <string name="blocked_notification_title_template" msgid="1175435827331588646">"Принтерът блокира при „<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>“"</string>
+ <plurals name="composite_notification_title_template">
+ <item quantity="one" msgid="5866624638054847057">"Задание за отпечатване: <xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g>"</item>
+ <item quantity="other" msgid="8746611264734222865">"Ð—Ð°Ð´Ð°Ð½Ð¸Ñ Ð·Ð° отпечатване: <xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g>"</item>
+ </plurals>
+ <string name="cancel" msgid="4373674107267141885">"Отказ"</string>
+ <string name="restart" msgid="2472034227037808749">"РеÑтартиране"</string>
+ <string name="no_connection_to_printer" msgid="2159246915977282728">"ÐÑма връзка Ñ Ð¿Ñ€Ð¸Ð½Ñ‚ÐµÑ€Ð°"</string>
+ <string name="reason_unknown" msgid="5507940196503246139">"нÑма данни"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – не е налице"</string>
+ <string name="print_error_default_message" msgid="8568506918983980567">"Заданието за отпечатване не можа да Ñе генерира"</string>
+ <string-array name="color_mode_labels">
+ <item msgid="7602948745415174937">"Черно-бÑло"</item>
+ <item msgid="2762241247228983754">"Цветно"</item>
+ </string-array>
+ <string-array name="orientation_labels">
+ <item msgid="4061931020926489228">"Вертикално"</item>
+ <item msgid="3199660090246166812">"Хоризонтално"</item>
+ </string-array>
+ <string-array name="page_options_labels">
+ <item msgid="7421377442011699994">"Ð’Ñички"</item>
+ <item msgid="6812869625222503603">"Поредица"</item>
+ </string-array>
+</resources>
diff --git a/packages/PrintSpooler/res/values-ca/arrays.xml b/packages/PrintSpooler/res/values-ca/arrays.xml
deleted file mode 100644
index d40278c..0000000
--- a/packages/PrintSpooler/res/values-ca/arrays.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2013 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<resources>
-
- <string-array name="pdf_printer_media_sizes" translatable="false">
- <item>NA_LETTER</item>
- <item>NA_GOVT_LETTER</item>
- <item>NA_LEGAL</item>
- <item>NA_JUNIOR_LEGAL</item>
- <item>NA_LEDGER</item>
- <item>NA_TABLOID</item>
- <item>NA_INDEX_3X5</item>
- <item>NA_INDEX_4X6</item>
- <item>NA_INDEX_5X8</item>
- <item>NA_MONARCH</item>
- <item>NA_QUARTO</item>
- <item>NA_FOOLSCAP</item>
- </string-array>
-
-</resources>
diff --git a/packages/PrintSpooler/res/values-ca/strings.xml b/packages/PrintSpooler/res/values-ca/strings.xml
new file mode 100644
index 0000000..fc60b0a
--- /dev/null
+++ b/packages/PrintSpooler/res/values-ca/strings.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4469836075319831821">"Gest. cues impr."</string>
+ <string name="advanced_settings_button" msgid="5764225091289415632">"Configuració impressora"</string>
+ <string name="print_button" msgid="645164566271246268">"Imprimeix"</string>
+ <string name="save_button" msgid="1921310454071758999">"Desa"</string>
+ <string name="label_destination" msgid="9132510997381599275">"Destinació"</string>
+ <string name="label_copies" msgid="3634531042822968308">"Còpies"</string>
+ <string name="label_paper_size" msgid="8681895607876809323">"Mida del paper"</string>
+ <string name="label_color" msgid="1108690305218188969">"Color"</string>
+ <string name="label_orientation" msgid="2853142581990496477">"Orientació"</string>
+ <string name="label_pages" msgid="6300874667546617333">"Pàgines (<xliff:g id="PAGE_COUNT">%1$s</xliff:g>)"</string>
+ <string name="pages_range_example" msgid="8558694453556945172">"p. ex. 1-5, 8, 11-13"</string>
+ <string name="print_preview" msgid="8010217796057763343">"Visualització prèvia impressió"</string>
+ <string name="install_for_print_preview" msgid="6366303997385509332">"Instal·la un lector de PDF per a visualitz. prèvia"</string>
+ <string name="printing_app_crashed" msgid="854477616686566398">"L\'aplicació d\'impressió ha fallat"</string>
+ <string name="page_count_unknown" msgid="6058852665954511124">"Pàgines"</string>
+ <string name="generating_print_job" msgid="3119608742651698916">"Generant tasca impressió"</string>
+ <string name="save_as_pdf" msgid="5718454119847596853">"Desa com a PDF"</string>
+ <string name="all_printers" msgid="5018829726861876202">"Totes les impressores…"</string>
+ <string name="print_dialog" msgid="32628687461331979">"Diàleg d\'impressió"</string>
+ <string name="search" msgid="5421724265322228497">"Cerca"</string>
+ <string name="all_printers_label" msgid="3178848870161526399">"Totes les impressores"</string>
+ <string name="add_print_service_label" msgid="5356702546188981940">"Afegeix un servei"</string>
+ <string name="print_search_box_shown_utterance" msgid="7967404953901376090">"Es mostra el quadre de cerca"</string>
+ <string name="print_search_box_hidden_utterance" msgid="5727755169343113351">"S\'ha amagat el quadre de cerca"</string>
+ <string name="print_add_printer" msgid="1088656468360653455">"Afegeix una impressora"</string>
+ <plurals name="print_search_result_count_utterance">
+ <item quantity="one" msgid="4484953260685964252">"S\'ha trobat <xliff:g id="COUNT">%1$s</xliff:g> impressora"</item>
+ <item quantity="other" msgid="6533817036607128241">"S\'han trobat <xliff:g id="COUNT">%1$s</xliff:g> impressores"</item>
+ </plurals>
+ <string name="choose_print_service" msgid="3740309762324459694">"Selecció del servei d\'impressió"</string>
+ <string name="print_searching_for_printers" msgid="6550424555079932867">"Cerca d\'impressores"</string>
+ <string name="print_no_printers" msgid="4869403323900054866">"No s\'ha trobat cap impressora"</string>
+ <string name="printing_notification_title_template" msgid="295903957762447362">"S\'està imprimint <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="cancelling_notification_title_template" msgid="1821759594704703197">"S\'està cancel·lant <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="failed_notification_title_template" msgid="2256217208186530973">"Error d\'impressora <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="blocked_notification_title_template" msgid="1175435827331588646">"Impressora bloquejada <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <plurals name="composite_notification_title_template">
+ <item quantity="one" msgid="5866624638054847057">"Tasca d\'impressió per a <xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g>"</item>
+ <item quantity="other" msgid="8746611264734222865">"Tasques d\'impressió per a <xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g>"</item>
+ </plurals>
+ <string name="cancel" msgid="4373674107267141885">"Cancel·la"</string>
+ <string name="restart" msgid="2472034227037808749">"Reinicia"</string>
+ <string name="no_connection_to_printer" msgid="2159246915977282728">"No hi ha connexió amb la impressora"</string>
+ <string name="reason_unknown" msgid="5507940196503246139">"desconegut"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>: no disponible"</string>
+ <string name="print_error_default_message" msgid="8568506918983980567">"No s\'ha pogut generar la tasca d\'impressió"</string>
+ <string-array name="color_mode_labels">
+ <item msgid="7602948745415174937">"Blanc i negre"</item>
+ <item msgid="2762241247228983754">"Color"</item>
+ </string-array>
+ <string-array name="orientation_labels">
+ <item msgid="4061931020926489228">"Vertical"</item>
+ <item msgid="3199660090246166812">"Horitzontal"</item>
+ </string-array>
+ <string-array name="page_options_labels">
+ <item msgid="7421377442011699994">"Tots"</item>
+ <item msgid="6812869625222503603">"Interval"</item>
+ </string-array>
+</resources>
diff --git a/packages/PrintSpooler/res/values-cs/strings.xml b/packages/PrintSpooler/res/values-cs/strings.xml
new file mode 100644
index 0000000..3f806d6
--- /dev/null
+++ b/packages/PrintSpooler/res/values-cs/strings.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4469836075319831821">"Print Spooler"</string>
+ <string name="advanced_settings_button" msgid="5764225091289415632">"Nastavení tiskárny"</string>
+ <string name="print_button" msgid="645164566271246268">"Tisk"</string>
+ <string name="save_button" msgid="1921310454071758999">"Uložit"</string>
+ <string name="label_destination" msgid="9132510997381599275">"Cíl"</string>
+ <string name="label_copies" msgid="3634531042822968308">"Kopie"</string>
+ <string name="label_paper_size" msgid="8681895607876809323">"Velikost papíru"</string>
+ <string name="label_color" msgid="1108690305218188969">"Barva"</string>
+ <string name="label_orientation" msgid="2853142581990496477">"Orientace"</string>
+ <string name="label_pages" msgid="6300874667546617333">"STRÃNKY (<xliff:g id="PAGE_COUNT">%1$s</xliff:g>)"</string>
+ <string name="pages_range_example" msgid="8558694453556945172">"např. 1–5, 8, 11–13"</string>
+ <string name="print_preview" msgid="8010217796057763343">"Náhled tisku"</string>
+ <string name="install_for_print_preview" msgid="6366303997385509332">"Nainstalovat prohlížeÄ PDF (umožní náhled)"</string>
+ <string name="printing_app_crashed" msgid="854477616686566398">"Aplikace tisku selhala"</string>
+ <string name="page_count_unknown" msgid="6058852665954511124">"Stránky"</string>
+ <string name="generating_print_job" msgid="3119608742651698916">"Generování úlohy tisku"</string>
+ <string name="save_as_pdf" msgid="5718454119847596853">"Uložit ve formátu PDF"</string>
+ <string name="all_printers" msgid="5018829726861876202">"Všechny tiskárny…"</string>
+ <string name="print_dialog" msgid="32628687461331979">"Dialog tisku"</string>
+ <string name="search" msgid="5421724265322228497">"Hledat"</string>
+ <string name="all_printers_label" msgid="3178848870161526399">"Všechny tiskárny"</string>
+ <string name="add_print_service_label" msgid="5356702546188981940">"Přidat službu"</string>
+ <string name="print_search_box_shown_utterance" msgid="7967404953901376090">"Vyhledávací pole se zobrazuje"</string>
+ <string name="print_search_box_hidden_utterance" msgid="5727755169343113351">"Vyhledávací pole je skryto"</string>
+ <string name="print_add_printer" msgid="1088656468360653455">"Přidat tiskárnu"</string>
+ <plurals name="print_search_result_count_utterance">
+ <item quantity="one" msgid="4484953260685964252">"PoÄet nalezených tiskáren: <xliff:g id="COUNT">%1$s</xliff:g>"</item>
+ <item quantity="other" msgid="6533817036607128241">"PoÄet nalezených tiskáren: <xliff:g id="COUNT">%1$s</xliff:g>"</item>
+ </plurals>
+ <string name="choose_print_service" msgid="3740309762324459694">"Zvolte službu tisku"</string>
+ <string name="print_searching_for_printers" msgid="6550424555079932867">"Vyhledávání tiskáren"</string>
+ <string name="print_no_printers" msgid="4869403323900054866">"Nebyly nalezeny žádné tiskárny"</string>
+ <string name="printing_notification_title_template" msgid="295903957762447362">"Tisk úlohy <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Rušení úlohy <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="failed_notification_title_template" msgid="2256217208186530973">"Chyba tiskárny u úlohy <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="blocked_notification_title_template" msgid="1175435827331588646">"Tiskárna blokuje úlohu <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <plurals name="composite_notification_title_template">
+ <item quantity="one" msgid="5866624638054847057">"PoÄet tiskových úloh: <xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g>"</item>
+ <item quantity="other" msgid="8746611264734222865">"PoÄet tiskových úloh: <xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g>"</item>
+ </plurals>
+ <string name="cancel" msgid="4373674107267141885">"Zrušit"</string>
+ <string name="restart" msgid="2472034227037808749">"Restartovat"</string>
+ <string name="no_connection_to_printer" msgid="2159246915977282728">"Nelze se připojit k tiskárně"</string>
+ <string name="reason_unknown" msgid="5507940196503246139">"neznámé"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – není k dispozici"</string>
+ <string name="print_error_default_message" msgid="8568506918983980567">"Tiskovou úlohu nelze vytvořit"</string>
+ <string-array name="color_mode_labels">
+ <item msgid="7602948745415174937">"Černobíle"</item>
+ <item msgid="2762241247228983754">"BarevnÄ›"</item>
+ </string-array>
+ <string-array name="orientation_labels">
+ <item msgid="4061931020926489228">"Na výšku"</item>
+ <item msgid="3199660090246166812">"Na šířku"</item>
+ </string-array>
+ <string-array name="page_options_labels">
+ <item msgid="7421377442011699994">"Vše"</item>
+ <item msgid="6812869625222503603">"Rozsah"</item>
+ </string-array>
+</resources>
diff --git a/packages/PrintSpooler/res/values-da/strings.xml b/packages/PrintSpooler/res/values-da/strings.xml
new file mode 100644
index 0000000..60c22bb
--- /dev/null
+++ b/packages/PrintSpooler/res/values-da/strings.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4469836075319831821">"Print Spooler"</string>
+ <string name="advanced_settings_button" msgid="5764225091289415632">"Printerindstillinger"</string>
+ <string name="print_button" msgid="645164566271246268">"Udskriv"</string>
+ <string name="save_button" msgid="1921310454071758999">"Gem"</string>
+ <string name="label_destination" msgid="9132510997381599275">"Destination"</string>
+ <string name="label_copies" msgid="3634531042822968308">"Kopier"</string>
+ <string name="label_paper_size" msgid="8681895607876809323">"Papirstørrelse"</string>
+ <string name="label_color" msgid="1108690305218188969">"Farve"</string>
+ <string name="label_orientation" msgid="2853142581990496477">"Retning"</string>
+ <string name="label_pages" msgid="6300874667546617333">"Sider (<xliff:g id="PAGE_COUNT">%1$s</xliff:g>)"</string>
+ <string name="pages_range_example" msgid="8558694453556945172">"f.eks. 1-5,8,11-13"</string>
+ <string name="print_preview" msgid="8010217796057763343">"Vis udskrift"</string>
+ <string name="install_for_print_preview" msgid="6366303997385509332">"Installer et PDF-visningsprog. for at se eksempel"</string>
+ <string name="printing_app_crashed" msgid="854477616686566398">"Udskrivningsapp gik ned"</string>
+ <string name="page_count_unknown" msgid="6058852665954511124">"Sider"</string>
+ <string name="generating_print_job" msgid="3119608742651698916">"Udskriften generes"</string>
+ <string name="save_as_pdf" msgid="5718454119847596853">"Gem som PDF"</string>
+ <string name="all_printers" msgid="5018829726861876202">"Alle printere..."</string>
+ <string name="print_dialog" msgid="32628687461331979">"Udskriftsdialog"</string>
+ <string name="search" msgid="5421724265322228497">"Søg"</string>
+ <string name="all_printers_label" msgid="3178848870161526399">"Alle printere"</string>
+ <string name="add_print_service_label" msgid="5356702546188981940">"Tilføj tjeneste"</string>
+ <string name="print_search_box_shown_utterance" msgid="7967404953901376090">"Søgefeltet vises"</string>
+ <string name="print_search_box_hidden_utterance" msgid="5727755169343113351">"Søgefeltet er skjult"</string>
+ <string name="print_add_printer" msgid="1088656468360653455">"Tilføj printer"</string>
+ <plurals name="print_search_result_count_utterance">
+ <item quantity="one" msgid="4484953260685964252">"Der blev fundet <xliff:g id="COUNT">%1$s</xliff:g> printer"</item>
+ <item quantity="other" msgid="6533817036607128241">"Der blev fundet <xliff:g id="COUNT">%1$s</xliff:g> printere"</item>
+ </plurals>
+ <string name="choose_print_service" msgid="3740309762324459694">"Vælg udskriftstjeneste"</string>
+ <string name="print_searching_for_printers" msgid="6550424555079932867">"Søger efter printere"</string>
+ <string name="print_no_printers" msgid="4869403323900054866">"Der blev ikke fundet nogen printere"</string>
+ <string name="printing_notification_title_template" msgid="295903957762447362">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> udskrives"</string>
+ <string name="cancelling_notification_title_template" msgid="1821759594704703197">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> annulleres"</string>
+ <string name="failed_notification_title_template" msgid="2256217208186530973">"Udskriften <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> mislykkedes"</string>
+ <string name="blocked_notification_title_template" msgid="1175435827331588646">"Printeren har blokeret <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <plurals name="composite_notification_title_template">
+ <item quantity="one" msgid="5866624638054847057">"<xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g>-udskriftsjob"</item>
+ <item quantity="other" msgid="8746611264734222865">"<xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g>-udskriftsjobs"</item>
+ </plurals>
+ <string name="cancel" msgid="4373674107267141885">"Annuller"</string>
+ <string name="restart" msgid="2472034227037808749">"Genstart"</string>
+ <string name="no_connection_to_printer" msgid="2159246915977282728">"Ingen forbindelse til printer"</string>
+ <string name="reason_unknown" msgid="5507940196503246139">"ukendt"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – ikke tilgængelig"</string>
+ <string name="print_error_default_message" msgid="8568506918983980567">"Der kunne ikke genereres et udskriftsjob"</string>
+ <string-array name="color_mode_labels">
+ <item msgid="7602948745415174937">"Sort/hvid"</item>
+ <item msgid="2762241247228983754">"Farve"</item>
+ </string-array>
+ <string-array name="orientation_labels">
+ <item msgid="4061931020926489228">"Portræt"</item>
+ <item msgid="3199660090246166812">"Landskab"</item>
+ </string-array>
+ <string-array name="page_options_labels">
+ <item msgid="7421377442011699994">"Alle"</item>
+ <item msgid="6812869625222503603">"Interval"</item>
+ </string-array>
+</resources>
diff --git a/packages/PrintSpooler/res/values-de/strings.xml b/packages/PrintSpooler/res/values-de/strings.xml
new file mode 100644
index 0000000..54c936f
--- /dev/null
+++ b/packages/PrintSpooler/res/values-de/strings.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4469836075319831821">"Druck-Spooler"</string>
+ <string name="advanced_settings_button" msgid="5764225091289415632">"Druckereinstellungen"</string>
+ <string name="print_button" msgid="645164566271246268">"Drucken"</string>
+ <string name="save_button" msgid="1921310454071758999">"Speichern"</string>
+ <string name="label_destination" msgid="9132510997381599275">"Ziel"</string>
+ <string name="label_copies" msgid="3634531042822968308">"Exemplare"</string>
+ <string name="label_paper_size" msgid="8681895607876809323">"Papiergröße"</string>
+ <string name="label_color" msgid="1108690305218188969">"Farbe"</string>
+ <string name="label_orientation" msgid="2853142581990496477">"Ausrichtung"</string>
+ <string name="label_pages" msgid="6300874667546617333">"Seiten (<xliff:g id="PAGE_COUNT">%1$s</xliff:g>)"</string>
+ <string name="pages_range_example" msgid="8558694453556945172">"z. B. 1–5, 8, 11–13"</string>
+ <string name="print_preview" msgid="8010217796057763343">"Vorschau drucken"</string>
+ <string name="install_for_print_preview" msgid="6366303997385509332">"PDF-Viewer für Vorschau installieren"</string>
+ <string name="printing_app_crashed" msgid="854477616686566398">"Druck-App abgestürzt"</string>
+ <string name="page_count_unknown" msgid="6058852665954511124">"Seiten"</string>
+ <string name="generating_print_job" msgid="3119608742651698916">"Druckauftrag wird generiert..."</string>
+ <string name="save_as_pdf" msgid="5718454119847596853">"Als PDF speichern"</string>
+ <string name="all_printers" msgid="5018829726861876202">"Alle Drucker…"</string>
+ <string name="print_dialog" msgid="32628687461331979">"Druckdialogfeld"</string>
+ <string name="search" msgid="5421724265322228497">"Suchen"</string>
+ <string name="all_printers_label" msgid="3178848870161526399">"Alle Drucker"</string>
+ <string name="add_print_service_label" msgid="5356702546188981940">"Dienst hinzufügen"</string>
+ <string name="print_search_box_shown_utterance" msgid="7967404953901376090">"Suchfeld angezeigt"</string>
+ <string name="print_search_box_hidden_utterance" msgid="5727755169343113351">"Suchfeld ausgeblendet"</string>
+ <string name="print_add_printer" msgid="1088656468360653455">"Drucker hinzufügen"</string>
+ <plurals name="print_search_result_count_utterance">
+ <item quantity="one" msgid="4484953260685964252">"<xliff:g id="COUNT">%1$s</xliff:g> Drucker gefunden"</item>
+ <item quantity="other" msgid="6533817036607128241">"<xliff:g id="COUNT">%1$s</xliff:g> Drucker gefunden"</item>
+ </plurals>
+ <string name="choose_print_service" msgid="3740309762324459694">"Druckdienst auswählen"</string>
+ <string name="print_searching_for_printers" msgid="6550424555079932867">"Suche nach Druckern"</string>
+ <string name="print_no_printers" msgid="4869403323900054866">"Keine Drucker gefunden"</string>
+ <string name="printing_notification_title_template" msgid="295903957762447362">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> wird gedruckt..."</string>
+ <string name="cancelling_notification_title_template" msgid="1821759594704703197">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> wird abgebrochen..."</string>
+ <string name="failed_notification_title_template" msgid="2256217208186530973">"Druckerfehler <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="blocked_notification_title_template" msgid="1175435827331588646">"Drucker hat <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> blockiert."</string>
+ <plurals name="composite_notification_title_template">
+ <item quantity="one" msgid="5866624638054847057">"Druckauftrag \"<xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g>\""</item>
+ <item quantity="other" msgid="8746611264734222865">"Druckaufträge \"<xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g>\""</item>
+ </plurals>
+ <string name="cancel" msgid="4373674107267141885">"Abbrechen"</string>
+ <string name="restart" msgid="2472034227037808749">"Neu starten"</string>
+ <string name="no_connection_to_printer" msgid="2159246915977282728">"Keine Verbindung zum Drucker"</string>
+ <string name="reason_unknown" msgid="5507940196503246139">"unbekannt"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – nicht verfügbar"</string>
+ <string name="print_error_default_message" msgid="8568506918983980567">"Druckauftrag konnte nicht generiert werden."</string>
+ <string-array name="color_mode_labels">
+ <item msgid="7602948745415174937">"Schwarz-weiß"</item>
+ <item msgid="2762241247228983754">"Farbe"</item>
+ </string-array>
+ <string-array name="orientation_labels">
+ <item msgid="4061931020926489228">"Hochformat"</item>
+ <item msgid="3199660090246166812">"Querformat"</item>
+ </string-array>
+ <string-array name="page_options_labels">
+ <item msgid="7421377442011699994">"Alle"</item>
+ <item msgid="6812869625222503603">"Bereich"</item>
+ </string-array>
+</resources>
diff --git a/packages/PrintSpooler/res/values-el/strings.xml b/packages/PrintSpooler/res/values-el/strings.xml
new file mode 100644
index 0000000..168f87b
--- /dev/null
+++ b/packages/PrintSpooler/res/values-el/strings.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4469836075319831821">"Λογισμικό ουÏάς εκτÏπωσης"</string>
+ <string name="advanced_settings_button" msgid="5764225091289415632">"Ρυθμίσεις εκτυπωτή"</string>
+ <string name="print_button" msgid="645164566271246268">"ΕκτÏπωση"</string>
+ <string name="save_button" msgid="1921310454071758999">"Αποθήκευση"</string>
+ <string name="label_destination" msgid="9132510997381599275">"ΠÏοοÏισμός"</string>
+ <string name="label_copies" msgid="3634531042822968308">"ΑντίγÏαφα"</string>
+ <string name="label_paper_size" msgid="8681895607876809323">"Μέγεθος χαÏτιοÏ"</string>
+ <string name="label_color" msgid="1108690305218188969">"ΧÏώμα"</string>
+ <string name="label_orientation" msgid="2853142581990496477">"ΠÏοσανατολισμός"</string>
+ <string name="label_pages" msgid="6300874667546617333">"Σελίδες (<xliff:g id="PAGE_COUNT">%1$s</xliff:g>)"</string>
+ <string name="pages_range_example" msgid="8558694453556945172">"π.χ. 1-5,8,11-13"</string>
+ <string name="print_preview" msgid="8010217796057763343">"ΠÏοεπισκόπηση εκτÏπωσης"</string>
+ <string name="install_for_print_preview" msgid="6366303997385509332">"Εγκαταστήστε το PDF viewer για Ï€Ïοεπισκόπηση"</string>
+ <string name="printing_app_crashed" msgid="854477616686566398">"Διακοπή λειτουÏγίας εφαÏμογής εκτÏπωσης"</string>
+ <string name="page_count_unknown" msgid="6058852665954511124">"Σελίδες"</string>
+ <string name="generating_print_job" msgid="3119608742651698916">"ΔημιουÏγία εÏγασίας εκτÏπωσης"</string>
+ <string name="save_as_pdf" msgid="5718454119847596853">"Αποθήκευση ως PDF"</string>
+ <string name="all_printers" msgid="5018829726861876202">"Όλοι οι εκτυπωτές…"</string>
+ <string name="print_dialog" msgid="32628687461331979">"Πλαίσιο διαλόγου εκτÏπωσης"</string>
+ <string name="search" msgid="5421724265322228497">"Αναζήτηση"</string>
+ <string name="all_printers_label" msgid="3178848870161526399">"Όλοι οι εκτυπωτές"</string>
+ <string name="add_print_service_label" msgid="5356702546188981940">"ΠÏοσθήκη υπηÏεσίας"</string>
+ <string name="print_search_box_shown_utterance" msgid="7967404953901376090">"Εμφάνιση πλαισίου αναζήτησης"</string>
+ <string name="print_search_box_hidden_utterance" msgid="5727755169343113351">"ΑπόκÏυψη πλαισίου αναζήτησης"</string>
+ <string name="print_add_printer" msgid="1088656468360653455">"ΠÏοσθήκη εκτυπωτή"</string>
+ <plurals name="print_search_result_count_utterance">
+ <item quantity="one" msgid="4484953260685964252">"Î’Ïέθηκε <xliff:g id="COUNT">%1$s</xliff:g> εκτυπωτής"</item>
+ <item quantity="other" msgid="6533817036607128241">"Î’Ïέθηκαν <xliff:g id="COUNT">%1$s</xliff:g> εκτυπωτές"</item>
+ </plurals>
+ <string name="choose_print_service" msgid="3740309762324459694">"Επιλέξτε υπηÏεσία εκτÏπωσης"</string>
+ <string name="print_searching_for_printers" msgid="6550424555079932867">"Αναζήτηση για εκτυπωτές"</string>
+ <string name="print_no_printers" msgid="4869403323900054866">"Δεν βÏέθηκαν εκτυπωτές"</string>
+ <string name="printing_notification_title_template" msgid="295903957762447362">"ΕκτÏπωση <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="cancelling_notification_title_template" msgid="1821759594704703197">"ΑκÏÏωση <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="failed_notification_title_template" msgid="2256217208186530973">"Σφάλμα εκτυπωτή <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="blocked_notification_title_template" msgid="1175435827331588646">"Ο εκτυπωτής απέκλεισε <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <plurals name="composite_notification_title_template">
+ <item quantity="one" msgid="5866624638054847057">"εÏγασία εκτÏπωσης <xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g>"</item>
+ <item quantity="other" msgid="8746611264734222865">"εÏγασίες εκτÏπωσης <xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g>"</item>
+ </plurals>
+ <string name="cancel" msgid="4373674107267141885">"ΑκÏÏωση"</string>
+ <string name="restart" msgid="2472034227037808749">"Επανεκκίνηση"</string>
+ <string name="no_connection_to_printer" msgid="2159246915977282728">"Δεν υπάÏχει σÏνδεση με εκτυπωτή"</string>
+ <string name="reason_unknown" msgid="5507940196503246139">"άγνωστο"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – μη διαθέσιμο"</string>
+ <string name="print_error_default_message" msgid="8568506918983980567">"Δεν ήταν δυνατή η δημιουÏγία εÏγασίας εκτÏπωσης"</string>
+ <string-array name="color_mode_labels">
+ <item msgid="7602948745415174937">"ΑσπÏόμαυÏο"</item>
+ <item msgid="2762241247228983754">"ΧÏώμα"</item>
+ </string-array>
+ <string-array name="orientation_labels">
+ <item msgid="4061931020926489228">"ΠοÏÏ„Ïαίτο"</item>
+ <item msgid="3199660090246166812">"ΟÏιζόντια"</item>
+ </string-array>
+ <string-array name="page_options_labels">
+ <item msgid="7421377442011699994">"Όλα"</item>
+ <item msgid="6812869625222503603">"ΕÏÏος"</item>
+ </string-array>
+</resources>
diff --git a/packages/PrintSpooler/res/values-en-rGB/strings.xml b/packages/PrintSpooler/res/values-en-rGB/strings.xml
new file mode 100644
index 0000000..98c3688
--- /dev/null
+++ b/packages/PrintSpooler/res/values-en-rGB/strings.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4469836075319831821">"Print Spooler"</string>
+ <string name="advanced_settings_button" msgid="5764225091289415632">"Printer settings"</string>
+ <string name="print_button" msgid="645164566271246268">"Print"</string>
+ <string name="save_button" msgid="1921310454071758999">"Save"</string>
+ <string name="label_destination" msgid="9132510997381599275">"Destination"</string>
+ <string name="label_copies" msgid="3634531042822968308">"Copies"</string>
+ <string name="label_paper_size" msgid="8681895607876809323">"Paper Size"</string>
+ <string name="label_color" msgid="1108690305218188969">"Colour"</string>
+ <string name="label_orientation" msgid="2853142581990496477">"Orientation"</string>
+ <string name="label_pages" msgid="6300874667546617333">"Pages (<xliff:g id="PAGE_COUNT">%1$s</xliff:g>)"</string>
+ <string name="pages_range_example" msgid="8558694453556945172">"e.g. 1–5,8,11–13"</string>
+ <string name="print_preview" msgid="8010217796057763343">"Print preview"</string>
+ <string name="install_for_print_preview" msgid="6366303997385509332">"Install PDF viewer for preview"</string>
+ <string name="printing_app_crashed" msgid="854477616686566398">"Printing app crashed"</string>
+ <string name="page_count_unknown" msgid="6058852665954511124">"Pages"</string>
+ <string name="generating_print_job" msgid="3119608742651698916">"Generating print job"</string>
+ <string name="save_as_pdf" msgid="5718454119847596853">"Save as PDF"</string>
+ <string name="all_printers" msgid="5018829726861876202">"All printers…"</string>
+ <string name="print_dialog" msgid="32628687461331979">"Print dialogue"</string>
+ <string name="search" msgid="5421724265322228497">"Search"</string>
+ <string name="all_printers_label" msgid="3178848870161526399">"All printers"</string>
+ <string name="add_print_service_label" msgid="5356702546188981940">"Add service"</string>
+ <string name="print_search_box_shown_utterance" msgid="7967404953901376090">"Search box shown"</string>
+ <string name="print_search_box_hidden_utterance" msgid="5727755169343113351">"Search box hidden"</string>
+ <string name="print_add_printer" msgid="1088656468360653455">"Add printer"</string>
+ <plurals name="print_search_result_count_utterance">
+ <item quantity="one" msgid="4484953260685964252">"<xliff:g id="COUNT">%1$s</xliff:g> printer found"</item>
+ <item quantity="other" msgid="6533817036607128241">"<xliff:g id="COUNT">%1$s</xliff:g> printers found"</item>
+ </plurals>
+ <string name="choose_print_service" msgid="3740309762324459694">"Choose print service"</string>
+ <string name="print_searching_for_printers" msgid="6550424555079932867">"Searching for printers"</string>
+ <string name="print_no_printers" msgid="4869403323900054866">"No printers found"</string>
+ <string name="printing_notification_title_template" msgid="295903957762447362">"Printing <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Cancelling <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="failed_notification_title_template" msgid="2256217208186530973">"Printer error <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="blocked_notification_title_template" msgid="1175435827331588646">"Printer blocked <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <plurals name="composite_notification_title_template">
+ <item quantity="one" msgid="5866624638054847057">"<xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g> print job"</item>
+ <item quantity="other" msgid="8746611264734222865">"<xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g> print jobs"</item>
+ </plurals>
+ <string name="cancel" msgid="4373674107267141885">"Cancel"</string>
+ <string name="restart" msgid="2472034227037808749">"Restart"</string>
+ <string name="no_connection_to_printer" msgid="2159246915977282728">"No connection to printer"</string>
+ <string name="reason_unknown" msgid="5507940196503246139">"unknown"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – unavailable"</string>
+ <string name="print_error_default_message" msgid="8568506918983980567">"Couldn\'t generate print job"</string>
+ <string-array name="color_mode_labels">
+ <item msgid="7602948745415174937">"Black &amp; White"</item>
+ <item msgid="2762241247228983754">"Colour"</item>
+ </string-array>
+ <string-array name="orientation_labels">
+ <item msgid="4061931020926489228">"Portrait"</item>
+ <item msgid="3199660090246166812">"Landscape"</item>
+ </string-array>
+ <string-array name="page_options_labels">
+ <item msgid="7421377442011699994">"All"</item>
+ <item msgid="6812869625222503603">"Range"</item>
+ </string-array>
+</resources>
diff --git a/packages/PrintSpooler/res/values-en-rIN/strings.xml b/packages/PrintSpooler/res/values-en-rIN/strings.xml
new file mode 100644
index 0000000..98c3688
--- /dev/null
+++ b/packages/PrintSpooler/res/values-en-rIN/strings.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4469836075319831821">"Print Spooler"</string>
+ <string name="advanced_settings_button" msgid="5764225091289415632">"Printer settings"</string>
+ <string name="print_button" msgid="645164566271246268">"Print"</string>
+ <string name="save_button" msgid="1921310454071758999">"Save"</string>
+ <string name="label_destination" msgid="9132510997381599275">"Destination"</string>
+ <string name="label_copies" msgid="3634531042822968308">"Copies"</string>
+ <string name="label_paper_size" msgid="8681895607876809323">"Paper Size"</string>
+ <string name="label_color" msgid="1108690305218188969">"Colour"</string>
+ <string name="label_orientation" msgid="2853142581990496477">"Orientation"</string>
+ <string name="label_pages" msgid="6300874667546617333">"Pages (<xliff:g id="PAGE_COUNT">%1$s</xliff:g>)"</string>
+ <string name="pages_range_example" msgid="8558694453556945172">"e.g. 1–5,8,11–13"</string>
+ <string name="print_preview" msgid="8010217796057763343">"Print preview"</string>
+ <string name="install_for_print_preview" msgid="6366303997385509332">"Install PDF viewer for preview"</string>
+ <string name="printing_app_crashed" msgid="854477616686566398">"Printing app crashed"</string>
+ <string name="page_count_unknown" msgid="6058852665954511124">"Pages"</string>
+ <string name="generating_print_job" msgid="3119608742651698916">"Generating print job"</string>
+ <string name="save_as_pdf" msgid="5718454119847596853">"Save as PDF"</string>
+ <string name="all_printers" msgid="5018829726861876202">"All printers…"</string>
+ <string name="print_dialog" msgid="32628687461331979">"Print dialogue"</string>
+ <string name="search" msgid="5421724265322228497">"Search"</string>
+ <string name="all_printers_label" msgid="3178848870161526399">"All printers"</string>
+ <string name="add_print_service_label" msgid="5356702546188981940">"Add service"</string>
+ <string name="print_search_box_shown_utterance" msgid="7967404953901376090">"Search box shown"</string>
+ <string name="print_search_box_hidden_utterance" msgid="5727755169343113351">"Search box hidden"</string>
+ <string name="print_add_printer" msgid="1088656468360653455">"Add printer"</string>
+ <plurals name="print_search_result_count_utterance">
+ <item quantity="one" msgid="4484953260685964252">"<xliff:g id="COUNT">%1$s</xliff:g> printer found"</item>
+ <item quantity="other" msgid="6533817036607128241">"<xliff:g id="COUNT">%1$s</xliff:g> printers found"</item>
+ </plurals>
+ <string name="choose_print_service" msgid="3740309762324459694">"Choose print service"</string>
+ <string name="print_searching_for_printers" msgid="6550424555079932867">"Searching for printers"</string>
+ <string name="print_no_printers" msgid="4869403323900054866">"No printers found"</string>
+ <string name="printing_notification_title_template" msgid="295903957762447362">"Printing <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Cancelling <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="failed_notification_title_template" msgid="2256217208186530973">"Printer error <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="blocked_notification_title_template" msgid="1175435827331588646">"Printer blocked <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <plurals name="composite_notification_title_template">
+ <item quantity="one" msgid="5866624638054847057">"<xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g> print job"</item>
+ <item quantity="other" msgid="8746611264734222865">"<xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g> print jobs"</item>
+ </plurals>
+ <string name="cancel" msgid="4373674107267141885">"Cancel"</string>
+ <string name="restart" msgid="2472034227037808749">"Restart"</string>
+ <string name="no_connection_to_printer" msgid="2159246915977282728">"No connection to printer"</string>
+ <string name="reason_unknown" msgid="5507940196503246139">"unknown"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – unavailable"</string>
+ <string name="print_error_default_message" msgid="8568506918983980567">"Couldn\'t generate print job"</string>
+ <string-array name="color_mode_labels">
+ <item msgid="7602948745415174937">"Black &amp; White"</item>
+ <item msgid="2762241247228983754">"Colour"</item>
+ </string-array>
+ <string-array name="orientation_labels">
+ <item msgid="4061931020926489228">"Portrait"</item>
+ <item msgid="3199660090246166812">"Landscape"</item>
+ </string-array>
+ <string-array name="page_options_labels">
+ <item msgid="7421377442011699994">"All"</item>
+ <item msgid="6812869625222503603">"Range"</item>
+ </string-array>
+</resources>
diff --git a/packages/PrintSpooler/res/values-es-rUS/arrays.xml b/packages/PrintSpooler/res/values-es-rUS/arrays.xml
deleted file mode 100644
index d40278c..0000000
--- a/packages/PrintSpooler/res/values-es-rUS/arrays.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2013 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<resources>
-
- <string-array name="pdf_printer_media_sizes" translatable="false">
- <item>NA_LETTER</item>
- <item>NA_GOVT_LETTER</item>
- <item>NA_LEGAL</item>
- <item>NA_JUNIOR_LEGAL</item>
- <item>NA_LEDGER</item>
- <item>NA_TABLOID</item>
- <item>NA_INDEX_3X5</item>
- <item>NA_INDEX_4X6</item>
- <item>NA_INDEX_5X8</item>
- <item>NA_MONARCH</item>
- <item>NA_QUARTO</item>
- <item>NA_FOOLSCAP</item>
- </string-array>
-
-</resources>
diff --git a/packages/PrintSpooler/res/values-es-rUS/strings.xml b/packages/PrintSpooler/res/values-es-rUS/strings.xml
new file mode 100644
index 0000000..bfdf933
--- /dev/null
+++ b/packages/PrintSpooler/res/values-es-rUS/strings.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4469836075319831821">"Cola de impresión"</string>
+ <string name="advanced_settings_button" msgid="5764225091289415632">"Config. de impresora"</string>
+ <string name="print_button" msgid="645164566271246268">"Imprimir"</string>
+ <string name="save_button" msgid="1921310454071758999">"Guardar"</string>
+ <string name="label_destination" msgid="9132510997381599275">"Destino"</string>
+ <string name="label_copies" msgid="3634531042822968308">"Copias"</string>
+ <string name="label_paper_size" msgid="8681895607876809323">"Tamaño del papel"</string>
+ <string name="label_color" msgid="1108690305218188969">"Color"</string>
+ <string name="label_orientation" msgid="2853142581990496477">"Orientación"</string>
+ <string name="label_pages" msgid="6300874667546617333">"Páginas (<xliff:g id="PAGE_COUNT">%1$s</xliff:g>)"</string>
+ <string name="pages_range_example" msgid="8558694453556945172">"Ej.: 1-5, 8, 11-13"</string>
+ <string name="print_preview" msgid="8010217796057763343">"Vista previa de impresión"</string>
+ <string name="install_for_print_preview" msgid="6366303997385509332">"Instalar visualizador de PDF para vista previa"</string>
+ <string name="printing_app_crashed" msgid="854477616686566398">"La aplicación de impresión falló"</string>
+ <string name="page_count_unknown" msgid="6058852665954511124">"Páginas"</string>
+ <string name="generating_print_job" msgid="3119608742651698916">"Generando trabajo de impresión"</string>
+ <string name="save_as_pdf" msgid="5718454119847596853">"Guardar como PDF"</string>
+ <string name="all_printers" msgid="5018829726861876202">"Todas las impresoras…"</string>
+ <string name="print_dialog" msgid="32628687461331979">"Cuadro de diálogo de impresión"</string>
+ <string name="search" msgid="5421724265322228497">"Buscar"</string>
+ <string name="all_printers_label" msgid="3178848870161526399">"Todas las impresoras"</string>
+ <string name="add_print_service_label" msgid="5356702546188981940">"Agregar servicio"</string>
+ <string name="print_search_box_shown_utterance" msgid="7967404953901376090">"Cuadro de búsqueda visible"</string>
+ <string name="print_search_box_hidden_utterance" msgid="5727755169343113351">"Cuadro de búsqueda oculto"</string>
+ <string name="print_add_printer" msgid="1088656468360653455">"Agregar impresora"</string>
+ <plurals name="print_search_result_count_utterance">
+ <item quantity="one" msgid="4484953260685964252">"Se encontró <xliff:g id="COUNT">%1$s</xliff:g> impresora."</item>
+ <item quantity="other" msgid="6533817036607128241">"Se encontraron <xliff:g id="COUNT">%1$s</xliff:g> impresoras."</item>
+ </plurals>
+ <string name="choose_print_service" msgid="3740309762324459694">"Elegir servicio de impresión"</string>
+ <string name="print_searching_for_printers" msgid="6550424555079932867">"Buscando impresoras"</string>
+ <string name="print_no_printers" msgid="4869403323900054866">"No se encontraron impresoras"</string>
+ <string name="printing_notification_title_template" msgid="295903957762447362">"Imprimiendo <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Cancelando <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="failed_notification_title_template" msgid="2256217208186530973">"Error de impresora <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="blocked_notification_title_template" msgid="1175435827331588646">"La impresora bloqueó <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>."</string>
+ <plurals name="composite_notification_title_template">
+ <item quantity="one" msgid="5866624638054847057">"Trabajo de impresión <xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g>"</item>
+ <item quantity="other" msgid="8746611264734222865">"Trabajos de impresión <xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g>"</item>
+ </plurals>
+ <string name="cancel" msgid="4373674107267141885">"Cancelar"</string>
+ <string name="restart" msgid="2472034227037808749">"Reiniciar"</string>
+ <string name="no_connection_to_printer" msgid="2159246915977282728">"No hay conexión con la impresora."</string>
+ <string name="reason_unknown" msgid="5507940196503246139">"desconocido"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>: no disponible"</string>
+ <string name="print_error_default_message" msgid="8568506918983980567">"Error al generar el trabajo de impresión"</string>
+ <string-array name="color_mode_labels">
+ <item msgid="7602948745415174937">"Blanco y negro"</item>
+ <item msgid="2762241247228983754">"Color"</item>
+ </string-array>
+ <string-array name="orientation_labels">
+ <item msgid="4061931020926489228">"Vertical"</item>
+ <item msgid="3199660090246166812">"Horizontal"</item>
+ </string-array>
+ <string-array name="page_options_labels">
+ <item msgid="7421377442011699994">"Todas"</item>
+ <item msgid="6812869625222503603">"Intervalo"</item>
+ </string-array>
+</resources>
diff --git a/packages/PrintSpooler/res/values-es/strings.xml b/packages/PrintSpooler/res/values-es/strings.xml
new file mode 100644
index 0000000..28df5f0
--- /dev/null
+++ b/packages/PrintSpooler/res/values-es/strings.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4469836075319831821">"Cola de impresión"</string>
+ <string name="advanced_settings_button" msgid="5764225091289415632">"Ajustes de impresora"</string>
+ <string name="print_button" msgid="645164566271246268">"Imprimir"</string>
+ <string name="save_button" msgid="1921310454071758999">"Guardar"</string>
+ <string name="label_destination" msgid="9132510997381599275">"Destino"</string>
+ <string name="label_copies" msgid="3634531042822968308">"Copias"</string>
+ <string name="label_paper_size" msgid="8681895607876809323">"Tamaño del papel"</string>
+ <string name="label_color" msgid="1108690305218188969">"Color"</string>
+ <string name="label_orientation" msgid="2853142581990496477">"Orientación"</string>
+ <string name="label_pages" msgid="6300874667546617333">"Páginas (<xliff:g id="PAGE_COUNT">%1$s</xliff:g>)"</string>
+ <string name="pages_range_example" msgid="8558694453556945172">"p. ej.: 1-5, 8, 11-13"</string>
+ <string name="print_preview" msgid="8010217796057763343">"Vista previa de impresión"</string>
+ <string name="install_for_print_preview" msgid="6366303997385509332">"Instalar visor PDF para obtener vista previa"</string>
+ <string name="printing_app_crashed" msgid="854477616686566398">"Error de aplicación de impresión"</string>
+ <string name="page_count_unknown" msgid="6058852665954511124">"Páginas"</string>
+ <string name="generating_print_job" msgid="3119608742651698916">"Generando trabajo de impresión"</string>
+ <string name="save_as_pdf" msgid="5718454119847596853">"Guardar como PDF"</string>
+ <string name="all_printers" msgid="5018829726861876202">"Todas las impresoras…"</string>
+ <string name="print_dialog" msgid="32628687461331979">"Cuadro de diálogo de impresión"</string>
+ <string name="search" msgid="5421724265322228497">"Buscar"</string>
+ <string name="all_printers_label" msgid="3178848870161526399">"Todas las impresoras"</string>
+ <string name="add_print_service_label" msgid="5356702546188981940">"Añadir servicio"</string>
+ <string name="print_search_box_shown_utterance" msgid="7967404953901376090">"Cuadro de búsqueda visible"</string>
+ <string name="print_search_box_hidden_utterance" msgid="5727755169343113351">"Cuadro de búsqueda oculto"</string>
+ <string name="print_add_printer" msgid="1088656468360653455">"Añadir impresora"</string>
+ <plurals name="print_search_result_count_utterance">
+ <item quantity="one" msgid="4484953260685964252">"Se ha encontrado <xliff:g id="COUNT">%1$s</xliff:g> impresora"</item>
+ <item quantity="other" msgid="6533817036607128241">"Se han encontrado <xliff:g id="COUNT">%1$s</xliff:g> impresoras"</item>
+ </plurals>
+ <string name="choose_print_service" msgid="3740309762324459694">"Seleccionar servicio de impresión"</string>
+ <string name="print_searching_for_printers" msgid="6550424555079932867">"Buscando impresoras"</string>
+ <string name="print_no_printers" msgid="4869403323900054866">"No se encontraron impresoras"</string>
+ <string name="printing_notification_title_template" msgid="295903957762447362">"Imprimiendo <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Cancelando <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="failed_notification_title_template" msgid="2256217208186530973">"Error de impresora <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="blocked_notification_title_template" msgid="1175435827331588646">"La impresora ha bloqueado <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <plurals name="composite_notification_title_template">
+ <item quantity="one" msgid="5866624638054847057">"Trabajo de impresión <xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g>"</item>
+ <item quantity="other" msgid="8746611264734222865">"Trabajos de impresión <xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g>"</item>
+ </plurals>
+ <string name="cancel" msgid="4373674107267141885">"Cancelar"</string>
+ <string name="restart" msgid="2472034227037808749">"Volver a empezar"</string>
+ <string name="no_connection_to_printer" msgid="2159246915977282728">"No hay conexión con la impresora"</string>
+ <string name="reason_unknown" msgid="5507940196503246139">"desconocido"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – no disponible"</string>
+ <string name="print_error_default_message" msgid="8568506918983980567">"Error al generar el trabajo de impresión"</string>
+ <string-array name="color_mode_labels">
+ <item msgid="7602948745415174937">"Blanco y negro"</item>
+ <item msgid="2762241247228983754">"Color"</item>
+ </string-array>
+ <string-array name="orientation_labels">
+ <item msgid="4061931020926489228">"Vertical"</item>
+ <item msgid="3199660090246166812">"Horizontal"</item>
+ </string-array>
+ <string-array name="page_options_labels">
+ <item msgid="7421377442011699994">"Todo"</item>
+ <item msgid="6812869625222503603">"Intervalo"</item>
+ </string-array>
+</resources>
diff --git a/packages/PrintSpooler/res/values-et-rEE/strings.xml b/packages/PrintSpooler/res/values-et-rEE/strings.xml
new file mode 100644
index 0000000..1114f9f
--- /dev/null
+++ b/packages/PrintSpooler/res/values-et-rEE/strings.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4469836075319831821">"Prindispuuler"</string>
+ <string name="advanced_settings_button" msgid="5764225091289415632">"Printeri seaded"</string>
+ <string name="print_button" msgid="645164566271246268">"Prindi"</string>
+ <string name="save_button" msgid="1921310454071758999">"Salvesta"</string>
+ <string name="label_destination" msgid="9132510997381599275">"Sihtkoht"</string>
+ <string name="label_copies" msgid="3634531042822968308">"Koopiaid"</string>
+ <string name="label_paper_size" msgid="8681895607876809323">"Paberiformaat"</string>
+ <string name="label_color" msgid="1108690305218188969">"Värv"</string>
+ <string name="label_orientation" msgid="2853142581990496477">"Suund"</string>
+ <string name="label_pages" msgid="6300874667546617333">"Lehti (<xliff:g id="PAGE_COUNT">%1$s</xliff:g>)"</string>
+ <string name="pages_range_example" msgid="8558694453556945172">"nt 1–5, 8, 11–13"</string>
+ <string name="print_preview" msgid="8010217796057763343">"Prindi eelvaade"</string>
+ <string name="install_for_print_preview" msgid="6366303997385509332">"PDF-vaaturi installimine eelvaate kuvamiseks"</string>
+ <string name="printing_app_crashed" msgid="854477616686566398">"Printimisrakendus jooksis kokku"</string>
+ <string name="page_count_unknown" msgid="6058852665954511124">"Lehed"</string>
+ <string name="generating_print_job" msgid="3119608742651698916">"Prinditöö loomine"</string>
+ <string name="save_as_pdf" msgid="5718454119847596853">"Salvesta PDF-ina"</string>
+ <string name="all_printers" msgid="5018829726861876202">"Kõik printerid …"</string>
+ <string name="print_dialog" msgid="32628687461331979">"Printimisdialoog"</string>
+ <string name="search" msgid="5421724265322228497">"Otsing"</string>
+ <string name="all_printers_label" msgid="3178848870161526399">"Kõik printerid"</string>
+ <string name="add_print_service_label" msgid="5356702546188981940">"Lisa teenus"</string>
+ <string name="print_search_box_shown_utterance" msgid="7967404953901376090">"Otsingukast on kuvatud"</string>
+ <string name="print_search_box_hidden_utterance" msgid="5727755169343113351">"Otsingukast on peidetud"</string>
+ <string name="print_add_printer" msgid="1088656468360653455">"Lisa printer"</string>
+ <plurals name="print_search_result_count_utterance">
+ <item quantity="one" msgid="4484953260685964252">"Leiti <xliff:g id="COUNT">%1$s</xliff:g> printer"</item>
+ <item quantity="other" msgid="6533817036607128241">"Leiti <xliff:g id="COUNT">%1$s</xliff:g> printerit"</item>
+ </plurals>
+ <string name="choose_print_service" msgid="3740309762324459694">"Prinditeenuse valimine"</string>
+ <string name="print_searching_for_printers" msgid="6550424555079932867">"Printerite otsimine"</string>
+ <string name="print_no_printers" msgid="4869403323900054866">"Printereid ei leitud"</string>
+ <string name="printing_notification_title_template" msgid="295903957762447362">"Prinditöö <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> printimine"</string>
+ <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Prinditöö <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> tühistamine"</string>
+ <string name="failed_notification_title_template" msgid="2256217208186530973">"Printeri viga: <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="blocked_notification_title_template" msgid="1175435827331588646">"Printer blokeeris töö <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <plurals name="composite_notification_title_template">
+ <item quantity="one" msgid="5866624638054847057">"Prinditöö <xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g>"</item>
+ <item quantity="other" msgid="8746611264734222865">"Prinditööd <xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g>"</item>
+ </plurals>
+ <string name="cancel" msgid="4373674107267141885">"Tühista"</string>
+ <string name="restart" msgid="2472034227037808749">"Taaskäivita"</string>
+ <string name="no_connection_to_printer" msgid="2159246915977282728">"Printeriühendus puudub"</string>
+ <string name="reason_unknown" msgid="5507940196503246139">"teadmata"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – pole saadaval"</string>
+ <string name="print_error_default_message" msgid="8568506918983980567">"Prinditööd ei saanud luua"</string>
+ <string-array name="color_mode_labels">
+ <item msgid="7602948745415174937">"Mustvalge"</item>
+ <item msgid="2762241247228983754">"Värv"</item>
+ </string-array>
+ <string-array name="orientation_labels">
+ <item msgid="4061931020926489228">"Vertikaalpaigutus"</item>
+ <item msgid="3199660090246166812">"Horisontaalpaigutus"</item>
+ </string-array>
+ <string-array name="page_options_labels">
+ <item msgid="7421377442011699994">"Kõik"</item>
+ <item msgid="6812869625222503603">"Vahemik"</item>
+ </string-array>
+</resources>
diff --git a/packages/PrintSpooler/res/values-fa/strings.xml b/packages/PrintSpooler/res/values-fa/strings.xml
new file mode 100644
index 0000000..950ef92
--- /dev/null
+++ b/packages/PrintSpooler/res/values-fa/strings.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4469836075319831821">"هماهنگ‌کننده چاپ"</string>
+ <string name="advanced_settings_button" msgid="5764225091289415632">"تنظیمات چاپگر"</string>
+ <string name="print_button" msgid="645164566271246268">"چاپ"</string>
+ <string name="save_button" msgid="1921310454071758999">"ذخیره"</string>
+ <string name="label_destination" msgid="9132510997381599275">"مقصد"</string>
+ <string name="label_copies" msgid="3634531042822968308">"کپی‌ها"</string>
+ <string name="label_paper_size" msgid="8681895607876809323">"اندازه کاغذ"</string>
+ <string name="label_color" msgid="1108690305218188969">"رنگی"</string>
+ <string name="label_orientation" msgid="2853142581990496477">"جهت"</string>
+ <string name="label_pages" msgid="6300874667546617333">"ØµÙØ­Ø§Øª (<xliff:g id="PAGE_COUNT">%1$s</xliff:g>)"</string>
+ <string name="pages_range_example" msgid="8558694453556945172">"â€â€â€ŽÙ…ثلاً ۱—۵،â€Û¹ØŒÛ·â€”Û±Û°"</string>
+ <string name="print_preview" msgid="8010217796057763343">"پیش‌نمایش چاپ"</string>
+ <string name="install_for_print_preview" msgid="6366303997385509332">"â€Ù†ØµØ¨ نمایشگر PDF برای پیش‌نمایش"</string>
+ <string name="printing_app_crashed" msgid="854477616686566398">"برنامه چاپ خراب شد"</string>
+ <string name="page_count_unknown" msgid="6058852665954511124">"ØµÙØ­Ø§Øª"</string>
+ <string name="generating_print_job" msgid="3119608742651698916">"در حال ایجاد کار چاپ"</string>
+ <string name="save_as_pdf" msgid="5718454119847596853">"â€Ø°Ø®ÛŒØ±Ù‡ به‌عنوان PDF"</string>
+ <string name="all_printers" msgid="5018829726861876202">"همه چاپگرها..."</string>
+ <string name="print_dialog" msgid="32628687461331979">"چاپ Ú¯ÙØªÚ¯Ùˆ"</string>
+ <string name="search" msgid="5421724265322228497">"جستجو"</string>
+ <string name="all_printers_label" msgid="3178848870161526399">"همه چاپگرها"</string>
+ <string name="add_print_service_label" msgid="5356702546188981940">"Ø§ÙØ²ÙˆØ¯Ù† سرویس"</string>
+ <string name="print_search_box_shown_utterance" msgid="7967404953901376090">"کادر جستجو نمایان شد"</string>
+ <string name="print_search_box_hidden_utterance" msgid="5727755169343113351">"کادر جستجو پنهان شد"</string>
+ <string name="print_add_printer" msgid="1088656468360653455">"Ø§ÙØ²ÙˆØ¯Ù† چاپگر"</string>
+ <plurals name="print_search_result_count_utterance">
+ <item quantity="one" msgid="4484953260685964252">"<xliff:g id="COUNT">%1$s</xliff:g> چاپگر ÛŒØ§ÙØª شد"</item>
+ <item quantity="other" msgid="6533817036607128241">"<xliff:g id="COUNT">%1$s</xliff:g> چاپگر ÛŒØ§ÙØª شد"</item>
+ </plurals>
+ <string name="choose_print_service" msgid="3740309762324459694">"انتخاب سرویس چاپ"</string>
+ <string name="print_searching_for_printers" msgid="6550424555079932867">"در حال جستجو برای چاپگرها"</string>
+ <string name="print_no_printers" msgid="4869403323900054866">"هیچ چاپگری ÛŒØ§ÙØª نشد"</string>
+ <string name="printing_notification_title_template" msgid="295903957762447362">"در حال چاپ <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="cancelling_notification_title_template" msgid="1821759594704703197">"در حال لغو <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="failed_notification_title_template" msgid="2256217208186530973">"خطای چاپگر <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="blocked_notification_title_template" msgid="1175435827331588646">"چاپگر، کار <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> را مسدود کرد"</string>
+ <plurals name="composite_notification_title_template">
+ <item quantity="one" msgid="5866624638054847057">"کار چاپ <xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g>"</item>
+ <item quantity="other" msgid="8746611264734222865">"کارهای چاپ <xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g>"</item>
+ </plurals>
+ <string name="cancel" msgid="4373674107267141885">"لغو"</string>
+ <string name="restart" msgid="2472034227037808749">"راه‌اندازی مجدد"</string>
+ <string name="no_connection_to_printer" msgid="2159246915977282728">"اتصال با چاپگر برقرار نیست"</string>
+ <string name="reason_unknown" msgid="5507940196503246139">"نامعلوم"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> - در دسترس نیست"</string>
+ <string name="print_error_default_message" msgid="8568506918983980567">"کار چاپ ایجاد نشد"</string>
+ <string-array name="color_mode_labels">
+ <item msgid="7602948745415174937">"سیاه Ùˆ سÙید"</item>
+ <item msgid="2762241247228983754">"رنگی"</item>
+ </string-array>
+ <string-array name="orientation_labels">
+ <item msgid="4061931020926489228">"عمودی"</item>
+ <item msgid="3199660090246166812">"اÙÙ‚ÛŒ"</item>
+ </string-array>
+ <string-array name="page_options_labels">
+ <item msgid="7421377442011699994">"همه"</item>
+ <item msgid="6812869625222503603">"محدوده"</item>
+ </string-array>
+</resources>
diff --git a/packages/PrintSpooler/res/values-fi/strings.xml b/packages/PrintSpooler/res/values-fi/strings.xml
new file mode 100644
index 0000000..239afcf
--- /dev/null
+++ b/packages/PrintSpooler/res/values-fi/strings.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4469836075319831821">"Taustatulostus"</string>
+ <string name="advanced_settings_button" msgid="5764225091289415632">"Tulostimen asetukset"</string>
+ <string name="print_button" msgid="645164566271246268">"Tulosta"</string>
+ <string name="save_button" msgid="1921310454071758999">"Tallenna"</string>
+ <string name="label_destination" msgid="9132510997381599275">"Kohde"</string>
+ <string name="label_copies" msgid="3634531042822968308">"Kopiot"</string>
+ <string name="label_paper_size" msgid="8681895607876809323">"Paperikoko"</string>
+ <string name="label_color" msgid="1108690305218188969">"Väri"</string>
+ <string name="label_orientation" msgid="2853142581990496477">"Suunta"</string>
+ <string name="label_pages" msgid="6300874667546617333">"Sivut (<xliff:g id="PAGE_COUNT">%1$s</xliff:g>)"</string>
+ <string name="pages_range_example" msgid="8558694453556945172">"esim. 1–5,8,11–13"</string>
+ <string name="print_preview" msgid="8010217796057763343">"Tulostuksen esikatselu"</string>
+ <string name="install_for_print_preview" msgid="6366303997385509332">"Asenna PDF-katseluohjelma esikatselua varten"</string>
+ <string name="printing_app_crashed" msgid="854477616686566398">"Tulostussovellus kaatui"</string>
+ <string name="page_count_unknown" msgid="6058852665954511124">"Sivut"</string>
+ <string name="generating_print_job" msgid="3119608742651698916">"Luodaan tulostustyö"</string>
+ <string name="save_as_pdf" msgid="5718454119847596853">"Tallenna PDF"</string>
+ <string name="all_printers" msgid="5018829726861876202">"Kaikki tulostimet…"</string>
+ <string name="print_dialog" msgid="32628687461331979">"Tulostusikkuna"</string>
+ <string name="search" msgid="5421724265322228497">"Haku"</string>
+ <string name="all_printers_label" msgid="3178848870161526399">"Kaikki tulostimet"</string>
+ <string name="add_print_service_label" msgid="5356702546188981940">"Lisää palvelu"</string>
+ <string name="print_search_box_shown_utterance" msgid="7967404953901376090">"Hakukenttä näkyvissä"</string>
+ <string name="print_search_box_hidden_utterance" msgid="5727755169343113351">"Hakukenttä piilotettu"</string>
+ <string name="print_add_printer" msgid="1088656468360653455">"Lisää tulostin"</string>
+ <plurals name="print_search_result_count_utterance">
+ <item quantity="one" msgid="4484953260685964252">"Löytyi <xliff:g id="COUNT">%1$s</xliff:g> tulostin"</item>
+ <item quantity="other" msgid="6533817036607128241">"Löytyi <xliff:g id="COUNT">%1$s</xliff:g> tulostinta"</item>
+ </plurals>
+ <string name="choose_print_service" msgid="3740309762324459694">"Valitse tulostuspalvelu"</string>
+ <string name="print_searching_for_printers" msgid="6550424555079932867">"Etsitään tulostimia"</string>
+ <string name="print_no_printers" msgid="4869403323900054866">"Tulostimia ei löydy"</string>
+ <string name="printing_notification_title_template" msgid="295903957762447362">"Tulostetaan <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Peruutetaan työ <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="failed_notification_title_template" msgid="2256217208186530973">"Tulostinvirhe työlle <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="blocked_notification_title_template" msgid="1175435827331588646">"Tulostin esti työn <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <plurals name="composite_notification_title_template">
+ <item quantity="one" msgid="5866624638054847057">"Tulostustyö <xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g>"</item>
+ <item quantity="other" msgid="8746611264734222865">"Tulostustyöt <xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g>"</item>
+ </plurals>
+ <string name="cancel" msgid="4373674107267141885">"Peruuta"</string>
+ <string name="restart" msgid="2472034227037808749">"Käynnistä uudelleen"</string>
+ <string name="no_connection_to_printer" msgid="2159246915977282728">"Ei yhteyttä tulostimeen"</string>
+ <string name="reason_unknown" msgid="5507940196503246139">"tuntematon"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – ei käytettävissä"</string>
+ <string name="print_error_default_message" msgid="8568506918983980567">"Tulostustyötä ei voitu luoda"</string>
+ <string-array name="color_mode_labels">
+ <item msgid="7602948745415174937">"Mustavalkoinen"</item>
+ <item msgid="2762241247228983754">"Väri"</item>
+ </string-array>
+ <string-array name="orientation_labels">
+ <item msgid="4061931020926489228">"Pysty"</item>
+ <item msgid="3199660090246166812">"Vaaka"</item>
+ </string-array>
+ <string-array name="page_options_labels">
+ <item msgid="7421377442011699994">"Kaikki"</item>
+ <item msgid="6812869625222503603">"Väli"</item>
+ </string-array>
+</resources>
diff --git a/packages/PrintSpooler/res/values-fr-rCA/strings.xml b/packages/PrintSpooler/res/values-fr-rCA/strings.xml
new file mode 100644
index 0000000..3880745
--- /dev/null
+++ b/packages/PrintSpooler/res/values-fr-rCA/strings.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4469836075319831821">"File d\'att. impr."</string>
+ <string name="advanced_settings_button" msgid="5764225091289415632">"Paramètres de l\'imprimante"</string>
+ <string name="print_button" msgid="645164566271246268">"Imprimer"</string>
+ <string name="save_button" msgid="1921310454071758999">"Enregistrer"</string>
+ <string name="label_destination" msgid="9132510997381599275">"Destination"</string>
+ <string name="label_copies" msgid="3634531042822968308">"Copies"</string>
+ <string name="label_paper_size" msgid="8681895607876809323">"Format du papier"</string>
+ <string name="label_color" msgid="1108690305218188969">"Couleur"</string>
+ <string name="label_orientation" msgid="2853142581990496477">"Orientation"</string>
+ <string name="label_pages" msgid="6300874667546617333">"Pages (<xliff:g id="PAGE_COUNT">%1$s</xliff:g>)"</string>
+ <string name="pages_range_example" msgid="8558694453556945172">"p. ex. 1-5, 8, 11-13"</string>
+ <string name="print_preview" msgid="8010217796057763343">"Aperçu avant impression"</string>
+ <string name="install_for_print_preview" msgid="6366303997385509332">"Installer un lecteur PDF pour voir l\'aperçu"</string>
+ <string name="printing_app_crashed" msgid="854477616686566398">"L\'application à l\'origine de l\'impression a planté"</string>
+ <string name="page_count_unknown" msgid="6058852665954511124">"Pages"</string>
+ <string name="generating_print_job" msgid="3119608742651698916">"Génération tâche impression…"</string>
+ <string name="save_as_pdf" msgid="5718454119847596853">"Enregistrer en format PDF"</string>
+ <string name="all_printers" msgid="5018829726861876202">"Toutes les imprimantes…"</string>
+ <string name="print_dialog" msgid="32628687461331979">"Boîte de dialogue d\'impression"</string>
+ <string name="search" msgid="5421724265322228497">"Rechercher"</string>
+ <string name="all_printers_label" msgid="3178848870161526399">"Toutes les imprimantes"</string>
+ <string name="add_print_service_label" msgid="5356702546188981940">"Ajouter le service"</string>
+ <string name="print_search_box_shown_utterance" msgid="7967404953901376090">"Champ de recherche affiché"</string>
+ <string name="print_search_box_hidden_utterance" msgid="5727755169343113351">"Champ de recherche masqué"</string>
+ <string name="print_add_printer" msgid="1088656468360653455">"Ajouter une imprimante"</string>
+ <plurals name="print_search_result_count_utterance">
+ <item quantity="one" msgid="4484953260685964252">"<xliff:g id="COUNT">%1$s</xliff:g> imprimante trouvée"</item>
+ <item quantity="other" msgid="6533817036607128241">"<xliff:g id="COUNT">%1$s</xliff:g> imprimantes trouvées"</item>
+ </plurals>
+ <string name="choose_print_service" msgid="3740309762324459694">"Sélectionner le service d\'impression"</string>
+ <string name="print_searching_for_printers" msgid="6550424555079932867">"Recherche d\'imprimantes en cours..."</string>
+ <string name="print_no_printers" msgid="4869403323900054866">"Aucune imprimante trouvée"</string>
+ <string name="printing_notification_title_template" msgid="295903957762447362">"Impression de <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> en cours…"</string>
+ <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Annulation de « <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> »…"</string>
+ <string name="failed_notification_title_template" msgid="2256217208186530973">"Erreur impression : « <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> »"</string>
+ <string name="blocked_notification_title_template" msgid="1175435827331588646">"Impression de « <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> » bloquée"</string>
+ <plurals name="composite_notification_title_template">
+ <item quantity="one" msgid="5866624638054847057">"Tâche d\'impression <xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g>"</item>
+ <item quantity="other" msgid="8746611264734222865">"Tâches d\'impression <xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g>"</item>
+ </plurals>
+ <string name="cancel" msgid="4373674107267141885">"Annuler"</string>
+ <string name="restart" msgid="2472034227037808749">"Recommencer"</string>
+ <string name="no_connection_to_printer" msgid="2159246915977282728">"Aucune connexion à l\'imprimante"</string>
+ <string name="reason_unknown" msgid="5507940196503246139">"inconnu"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> — indisponible"</string>
+ <string name="print_error_default_message" msgid="8568506918983980567">"Impossible de générer la tâche d\'impression"</string>
+ <string-array name="color_mode_labels">
+ <item msgid="7602948745415174937">"Noir et blanc"</item>
+ <item msgid="2762241247228983754">"Couleur"</item>
+ </string-array>
+ <string-array name="orientation_labels">
+ <item msgid="4061931020926489228">"Portrait"</item>
+ <item msgid="3199660090246166812">"Paysage"</item>
+ </string-array>
+ <string-array name="page_options_labels">
+ <item msgid="7421377442011699994">"Tous"</item>
+ <item msgid="6812869625222503603">"Plage"</item>
+ </string-array>
+</resources>
diff --git a/packages/PrintSpooler/res/values-fr/strings.xml b/packages/PrintSpooler/res/values-fr/strings.xml
new file mode 100644
index 0000000..961d344
--- /dev/null
+++ b/packages/PrintSpooler/res/values-fr/strings.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4469836075319831821">"Spouler impress."</string>
+ <string name="advanced_settings_button" msgid="5764225091289415632">"Paramètres de l\'imprimante"</string>
+ <string name="print_button" msgid="645164566271246268">"Imprimer"</string>
+ <string name="save_button" msgid="1921310454071758999">"Enregistrer"</string>
+ <string name="label_destination" msgid="9132510997381599275">"Destination"</string>
+ <string name="label_copies" msgid="3634531042822968308">"Copies"</string>
+ <string name="label_paper_size" msgid="8681895607876809323">"Format du papier"</string>
+ <string name="label_color" msgid="1108690305218188969">"Couleur"</string>
+ <string name="label_orientation" msgid="2853142581990496477">"Orientation"</string>
+ <string name="label_pages" msgid="6300874667546617333">"Pages (<xliff:g id="PAGE_COUNT">%1$s</xliff:g>)"</string>
+ <string name="pages_range_example" msgid="8558694453556945172">"ex. : 1-5, 8, 11-13"</string>
+ <string name="print_preview" msgid="8010217796057763343">"Aperçu avant impression"</string>
+ <string name="install_for_print_preview" msgid="6366303997385509332">"Installer un lecteur PDF pour afficher l\'aperçu"</string>
+ <string name="printing_app_crashed" msgid="854477616686566398">"L\'application à l\'origine de l\'impression a planté"</string>
+ <string name="page_count_unknown" msgid="6058852665954511124">"Pages"</string>
+ <string name="generating_print_job" msgid="3119608742651698916">"Génération tâche impression…"</string>
+ <string name="save_as_pdf" msgid="5718454119847596853">"Enregistrer au format .PDF"</string>
+ <string name="all_printers" msgid="5018829726861876202">"Toutes les imprimantes…"</string>
+ <string name="print_dialog" msgid="32628687461331979">"Boîte de dialogue d\'impression"</string>
+ <string name="search" msgid="5421724265322228497">"Rechercher"</string>
+ <string name="all_printers_label" msgid="3178848870161526399">"Toutes les imprimantes"</string>
+ <string name="add_print_service_label" msgid="5356702546188981940">"Ajouter un service"</string>
+ <string name="print_search_box_shown_utterance" msgid="7967404953901376090">"Champ de recherche affiché."</string>
+ <string name="print_search_box_hidden_utterance" msgid="5727755169343113351">"Champ de recherche masqué."</string>
+ <string name="print_add_printer" msgid="1088656468360653455">"Ajouter une imprimante"</string>
+ <plurals name="print_search_result_count_utterance">
+ <item quantity="one" msgid="4484953260685964252">"<xliff:g id="COUNT">%1$s</xliff:g> imprimante trouvée."</item>
+ <item quantity="other" msgid="6533817036607128241">"<xliff:g id="COUNT">%1$s</xliff:g> imprimantes trouvées."</item>
+ </plurals>
+ <string name="choose_print_service" msgid="3740309762324459694">"Sélectionner le service d\'impression"</string>
+ <string name="print_searching_for_printers" msgid="6550424555079932867">"Recherche d\'imprimantes en cours"</string>
+ <string name="print_no_printers" msgid="4869403323900054866">"Aucune imprimante trouvée"</string>
+ <string name="printing_notification_title_template" msgid="295903957762447362">"Impression de \"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>\" en cours…"</string>
+ <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Annulation de \"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>\" en cours…"</string>
+ <string name="failed_notification_title_template" msgid="2256217208186530973">"Erreur impression pour \"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>\""</string>
+ <string name="blocked_notification_title_template" msgid="1175435827331588646">"Impression de \"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>\" bloquée"</string>
+ <plurals name="composite_notification_title_template">
+ <item quantity="one" msgid="5866624638054847057">"<xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g> tâche d\'impression"</item>
+ <item quantity="other" msgid="8746611264734222865">"<xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g> tâches d\'impression"</item>
+ </plurals>
+ <string name="cancel" msgid="4373674107267141885">"Annuler"</string>
+ <string name="restart" msgid="2472034227037808749">"Redémarrer"</string>
+ <string name="no_connection_to_printer" msgid="2159246915977282728">"Aucune connexion à l\'imprimante."</string>
+ <string name="reason_unknown" msgid="5507940196503246139">"inconnue"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – indisponible"</string>
+ <string name="print_error_default_message" msgid="8568506918983980567">"Impossible de générer la tâche d\'impression."</string>
+ <string-array name="color_mode_labels">
+ <item msgid="7602948745415174937">"Noir et blanc"</item>
+ <item msgid="2762241247228983754">"Couleur"</item>
+ </string-array>
+ <string-array name="orientation_labels">
+ <item msgid="4061931020926489228">"Portrait"</item>
+ <item msgid="3199660090246166812">"Paysage"</item>
+ </string-array>
+ <string-array name="page_options_labels">
+ <item msgid="7421377442011699994">"Tout"</item>
+ <item msgid="6812869625222503603">"Plage"</item>
+ </string-array>
+</resources>
diff --git a/packages/PrintSpooler/res/values-hi/strings.xml b/packages/PrintSpooler/res/values-hi/strings.xml
new file mode 100644
index 0000000..4d1ddd8
--- /dev/null
+++ b/packages/PrintSpooler/res/values-hi/strings.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4469836075319831821">"पà¥à¤°à¤¿à¤‚ट सà¥à¤ªà¥‚लर"</string>
+ <string name="advanced_settings_button" msgid="5764225091289415632">"पà¥à¤°à¤¿à¤‚टर सेटिंग"</string>
+ <string name="print_button" msgid="645164566271246268">"पà¥à¤°à¤¿à¤‚ट करें"</string>
+ <string name="save_button" msgid="1921310454071758999">"सहेजें"</string>
+ <string name="label_destination" msgid="9132510997381599275">"गंतवà¥à¤¯"</string>
+ <string name="label_copies" msgid="3634531042822968308">"पà¥à¤°à¤¤à¤¿à¤¯à¤¾à¤‚"</string>
+ <string name="label_paper_size" msgid="8681895607876809323">"कागज़ का आकार"</string>
+ <string name="label_color" msgid="1108690305218188969">"रंग"</string>
+ <string name="label_orientation" msgid="2853142581990496477">"अभिविनà¥â€à¤¯à¤¾à¤¸"</string>
+ <string name="label_pages" msgid="6300874667546617333">"पृषà¥â€à¤  (<xliff:g id="PAGE_COUNT">%1$s</xliff:g>)"</string>
+ <string name="pages_range_example" msgid="8558694453556945172">"उदा. 1—5,8,11—13"</string>
+ <string name="print_preview" msgid="8010217796057763343">"पà¥à¤°à¤¿à¤‚ट पूरà¥à¤µà¤¾à¤µà¤²à¥‹à¤•न"</string>
+ <string name="install_for_print_preview" msgid="6366303997385509332">"पूरà¥à¤µà¤¾à¤µà¤²à¥‹à¤•न के लिठPDF वà¥à¤¯à¥‚अर इंसà¥à¤Ÿà¥‰à¤² करें"</string>
+ <string name="printing_app_crashed" msgid="854477616686566398">"पà¥à¤°à¤¿à¤‚टिंग à¤à¤ªà¥à¤²à¤¿à¤•ेशन कà¥à¤°à¥ˆà¤¶ हो गया"</string>
+ <string name="page_count_unknown" msgid="6058852665954511124">"पृषà¥à¤ "</string>
+ <string name="generating_print_job" msgid="3119608742651698916">"पà¥à¤°à¤¿à¤‚ट कारà¥à¤¯ जनरेट हो रहा है"</string>
+ <string name="save_as_pdf" msgid="5718454119847596853">"PDF के रूप में सहेजें"</string>
+ <string name="all_printers" msgid="5018829726861876202">"सभी पà¥à¤°à¤¿à¤‚टर..."</string>
+ <string name="print_dialog" msgid="32628687461331979">"पà¥à¤°à¤¿à¤‚ट संवाद"</string>
+ <string name="search" msgid="5421724265322228497">"खोजें"</string>
+ <string name="all_printers_label" msgid="3178848870161526399">"सभी पà¥à¤°à¤¿à¤‚टर"</string>
+ <string name="add_print_service_label" msgid="5356702546188981940">"सेवा जोड़ें"</string>
+ <string name="print_search_box_shown_utterance" msgid="7967404953901376090">"खोज बॉकà¥à¤¸ पà¥à¤°à¤¦à¤°à¥à¤¶à¤¿à¤¤ है"</string>
+ <string name="print_search_box_hidden_utterance" msgid="5727755169343113351">"खोज बॉकà¥à¤¸ छिपा हà¥à¤† है"</string>
+ <string name="print_add_printer" msgid="1088656468360653455">"पà¥à¤°à¤¿à¤‚टर जोड़ें"</string>
+ <plurals name="print_search_result_count_utterance">
+ <item quantity="one" msgid="4484953260685964252">"<xliff:g id="COUNT">%1$s</xliff:g> पà¥à¤°à¤¿à¤‚टर मिला"</item>
+ <item quantity="other" msgid="6533817036607128241">"<xliff:g id="COUNT">%1$s</xliff:g> पà¥à¤°à¤¿à¤‚टर मिले"</item>
+ </plurals>
+ <string name="choose_print_service" msgid="3740309762324459694">"पà¥à¤°à¤¿à¤‚ट सेवा चà¥à¤¨à¥‡à¤‚"</string>
+ <string name="print_searching_for_printers" msgid="6550424555079932867">"पà¥à¤°à¤¿à¤‚टर खोज रहा है"</string>
+ <string name="print_no_printers" msgid="4869403323900054866">"कोई पà¥à¤°à¤¿à¤‚टर नहीं मिले"</string>
+ <string name="printing_notification_title_template" msgid="295903957762447362">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> पà¥à¤°à¤¿à¤‚ट हो रहा है"</string>
+ <string name="cancelling_notification_title_template" msgid="1821759594704703197">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> रदà¥à¤¦ हो रहा है"</string>
+ <string name="failed_notification_title_template" msgid="2256217208186530973">"पà¥à¤°à¤¿à¤‚टर तà¥à¤°à¥à¤Ÿà¤¿ <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="blocked_notification_title_template" msgid="1175435827331588646">"पà¥à¤°à¤¿à¤‚टर अवरोधित <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <plurals name="composite_notification_title_template">
+ <item quantity="one" msgid="5866624638054847057">"<xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g> पà¥à¤°à¤¿à¤‚ट कारà¥à¤¯"</item>
+ <item quantity="other" msgid="8746611264734222865">"<xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g> पà¥à¤°à¤¿à¤‚ट कारà¥à¤¯"</item>
+ </plurals>
+ <string name="cancel" msgid="4373674107267141885">"रदà¥à¤¦ करें"</string>
+ <string name="restart" msgid="2472034227037808749">"पà¥à¤¨: आरंभ करें"</string>
+ <string name="no_connection_to_printer" msgid="2159246915977282728">"पà¥à¤°à¤¿à¤‚टर के लिठकोई कनेकà¥à¤¶à¤¨ नहीं"</string>
+ <string name="reason_unknown" msgid="5507940196503246139">"अजà¥à¤žà¤¾à¤¤"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – अनà¥à¤ªà¤²à¤¬à¥à¤§"</string>
+ <string name="print_error_default_message" msgid="8568506918983980567">"पà¥à¤°à¤¿à¤‚ट कारà¥à¤¯ जनरेट नहीं किया जा सका"</string>
+ <string-array name="color_mode_labels">
+ <item msgid="7602948745415174937">"शà¥à¤¯à¤¾à¤® और शà¥à¤µà¥‡à¤¤"</item>
+ <item msgid="2762241247228983754">"रंग"</item>
+ </string-array>
+ <string-array name="orientation_labels">
+ <item msgid="4061931020926489228">"पोरà¥à¤Ÿà¥à¤°à¥‡à¤Ÿ"</item>
+ <item msgid="3199660090246166812">"लैंडसà¥à¤•ेप"</item>
+ </string-array>
+ <string-array name="page_options_labels">
+ <item msgid="7421377442011699994">"सभी"</item>
+ <item msgid="6812869625222503603">"सीमा"</item>
+ </string-array>
+</resources>
diff --git a/packages/PrintSpooler/res/values-hr/strings.xml b/packages/PrintSpooler/res/values-hr/strings.xml
new file mode 100644
index 0000000..50b56ff
--- /dev/null
+++ b/packages/PrintSpooler/res/values-hr/strings.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4469836075319831821">"Print Spooler"</string>
+ <string name="advanced_settings_button" msgid="5764225091289415632">"Postavke pisaÄa"</string>
+ <string name="print_button" msgid="645164566271246268">"Ispis"</string>
+ <string name="save_button" msgid="1921310454071758999">"Spremi"</string>
+ <string name="label_destination" msgid="9132510997381599275">"Odredište"</string>
+ <string name="label_copies" msgid="3634531042822968308">"Kopije"</string>
+ <string name="label_paper_size" msgid="8681895607876809323">"VeliÄina papira"</string>
+ <string name="label_color" msgid="1108690305218188969">"U boji"</string>
+ <string name="label_orientation" msgid="2853142581990496477">"Orijentacija"</string>
+ <string name="label_pages" msgid="6300874667546617333">"Stranice (<xliff:g id="PAGE_COUNT">%1$s</xliff:g>)"</string>
+ <string name="pages_range_example" msgid="8558694453556945172">"npr. 1 – 5,8,11 – 13"</string>
+ <string name="print_preview" msgid="8010217796057763343">"Pregled ispisa"</string>
+ <string name="install_for_print_preview" msgid="6366303997385509332">"Instaliraj PDF preglednik za pregled"</string>
+ <string name="printing_app_crashed" msgid="854477616686566398">"Srušila se aplikacija za ispis"</string>
+ <string name="page_count_unknown" msgid="6058852665954511124">"Stranice"</string>
+ <string name="generating_print_job" msgid="3119608742651698916">"Generiranje zadatka ispisa"</string>
+ <string name="save_as_pdf" msgid="5718454119847596853">"Spremi kao PDF"</string>
+ <string name="all_printers" msgid="5018829726861876202">"Svi pisaÄi…"</string>
+ <string name="print_dialog" msgid="32628687461331979">"Dijaloški okvir za ispis"</string>
+ <string name="search" msgid="5421724265322228497">"Pretraživanje"</string>
+ <string name="all_printers_label" msgid="3178848870161526399">"Svi pisaÄi"</string>
+ <string name="add_print_service_label" msgid="5356702546188981940">"Dodaj uslugu"</string>
+ <string name="print_search_box_shown_utterance" msgid="7967404953901376090">"Okvir za pretraživanje prikazan je"</string>
+ <string name="print_search_box_hidden_utterance" msgid="5727755169343113351">"Okvir za pretraživanje skriven je"</string>
+ <string name="print_add_printer" msgid="1088656468360653455">"Dodaj pisaÄ"</string>
+ <plurals name="print_search_result_count_utterance">
+ <item quantity="one" msgid="4484953260685964252">"PronaÄ‘en je <xliff:g id="COUNT">%1$s</xliff:g> pisaÄ"</item>
+ <item quantity="other" msgid="6533817036607128241">"PronaÄ‘en je sljedeći broj pisaÄa: <xliff:g id="COUNT">%1$s</xliff:g>"</item>
+ </plurals>
+ <string name="choose_print_service" msgid="3740309762324459694">"Odaberite uslugu ispisa"</string>
+ <string name="print_searching_for_printers" msgid="6550424555079932867">"Traženje pisaÄa"</string>
+ <string name="print_no_printers" msgid="4869403323900054866">"Nije pronaÄ‘en nijedan pisaÄ"</string>
+ <string name="printing_notification_title_template" msgid="295903957762447362">"Ispisivanje <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Otkazivanje zadatka <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="failed_notification_title_template" msgid="2256217208186530973">"PogreÅ¡ka pisaÄa <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="blocked_notification_title_template" msgid="1175435827331588646">"PisaÄ je blokirao <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <plurals name="composite_notification_title_template">
+ <item quantity="one" msgid="5866624638054847057">"Zadatak ispisa <xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g>"</item>
+ <item quantity="other" msgid="8746611264734222865">"Broj zadataka ispisa: <xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g>"</item>
+ </plurals>
+ <string name="cancel" msgid="4373674107267141885">"Odustani"</string>
+ <string name="restart" msgid="2472034227037808749">"Ponovo pokreni"</string>
+ <string name="no_connection_to_printer" msgid="2159246915977282728">"Nema veze s pisaÄem"</string>
+ <string name="reason_unknown" msgid="5507940196503246139">"nepoznato"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – zadatak nije dostupan"</string>
+ <string name="print_error_default_message" msgid="8568506918983980567">"Zadatak ispisa nije generiran"</string>
+ <string-array name="color_mode_labels">
+ <item msgid="7602948745415174937">"Crno-bijelo"</item>
+ <item msgid="2762241247228983754">"U boji"</item>
+ </string-array>
+ <string-array name="orientation_labels">
+ <item msgid="4061931020926489228">"Portret"</item>
+ <item msgid="3199660090246166812">"Pejzaž"</item>
+ </string-array>
+ <string-array name="page_options_labels">
+ <item msgid="7421377442011699994">"Sve"</item>
+ <item msgid="6812869625222503603">"Raspon"</item>
+ </string-array>
+</resources>
diff --git a/packages/PrintSpooler/res/values-hu/strings.xml b/packages/PrintSpooler/res/values-hu/strings.xml
new file mode 100644
index 0000000..79912fc
--- /dev/null
+++ b/packages/PrintSpooler/res/values-hu/strings.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4469836075319831821">"Nyomtatásisor-kezelő"</string>
+ <string name="advanced_settings_button" msgid="5764225091289415632">"Nyomtatóbeállítások"</string>
+ <string name="print_button" msgid="645164566271246268">"Nyomtatás"</string>
+ <string name="save_button" msgid="1921310454071758999">"Mentés"</string>
+ <string name="label_destination" msgid="9132510997381599275">"Cél"</string>
+ <string name="label_copies" msgid="3634531042822968308">"Példányszám"</string>
+ <string name="label_paper_size" msgid="8681895607876809323">"Papírméret"</string>
+ <string name="label_color" msgid="1108690305218188969">"Szín"</string>
+ <string name="label_orientation" msgid="2853142581990496477">"Tájolás"</string>
+ <string name="label_pages" msgid="6300874667546617333">"Oldalszám (<xliff:g id="PAGE_COUNT">%1$s</xliff:g>)"</string>
+ <string name="pages_range_example" msgid="8558694453556945172">"pl. 1–5, 8, 11–13"</string>
+ <string name="print_preview" msgid="8010217796057763343">"Előnézet nyomtatása"</string>
+ <string name="install_for_print_preview" msgid="6366303997385509332">"Az előnézethez telepítse a PDF-megtekintőt."</string>
+ <string name="printing_app_crashed" msgid="854477616686566398">"A nyomtatási alkalmazás összeomlott."</string>
+ <string name="page_count_unknown" msgid="6058852665954511124">"Oldalak"</string>
+ <string name="generating_print_job" msgid="3119608742651698916">"Nyomtatási feladat létrehozása"</string>
+ <string name="save_as_pdf" msgid="5718454119847596853">"Mentés PDF-ként"</string>
+ <string name="all_printers" msgid="5018829726861876202">"Az összes nyomtató…"</string>
+ <string name="print_dialog" msgid="32628687461331979">"Nyomtatási párbeszédablak"</string>
+ <string name="search" msgid="5421724265322228497">"Keresés"</string>
+ <string name="all_printers_label" msgid="3178848870161526399">"Az összes nyomtató"</string>
+ <string name="add_print_service_label" msgid="5356702546188981940">"Szolgáltatás hozzáadása"</string>
+ <string name="print_search_box_shown_utterance" msgid="7967404953901376090">"Keresőmező megjelenítve"</string>
+ <string name="print_search_box_hidden_utterance" msgid="5727755169343113351">"Keresőmező elrejtve"</string>
+ <string name="print_add_printer" msgid="1088656468360653455">"Nyomtató hozzáadása"</string>
+ <plurals name="print_search_result_count_utterance">
+ <item quantity="one" msgid="4484953260685964252">"<xliff:g id="COUNT">%1$s</xliff:g> nyomtató észlelve"</item>
+ <item quantity="other" msgid="6533817036607128241">"<xliff:g id="COUNT">%1$s</xliff:g> nyomtató észlelve"</item>
+ </plurals>
+ <string name="choose_print_service" msgid="3740309762324459694">"Nyomtatási szolgáltatás kiválasztása"</string>
+ <string name="print_searching_for_printers" msgid="6550424555079932867">"Nyomtatók keresése"</string>
+ <string name="print_no_printers" msgid="4869403323900054866">"Nem található nyomtató"</string>
+ <string name="printing_notification_title_template" msgid="295903957762447362">"A(z) <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> nyomtatása"</string>
+ <string name="cancelling_notification_title_template" msgid="1821759594704703197">"A(z) <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> törlése"</string>
+ <string name="failed_notification_title_template" msgid="2256217208186530973">"Nyomtatási hiba: <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="blocked_notification_title_template" msgid="1175435827331588646">"A(z) <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> letiltva."</string>
+ <plurals name="composite_notification_title_template">
+ <item quantity="one" msgid="5866624638054847057">"<xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g> – nyomtatási feladat"</item>
+ <item quantity="other" msgid="8746611264734222865">"<xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g> – nyomtatási feladatok"</item>
+ </plurals>
+ <string name="cancel" msgid="4373674107267141885">"Mégse"</string>
+ <string name="restart" msgid="2472034227037808749">"Újraindítás"</string>
+ <string name="no_connection_to_printer" msgid="2159246915977282728">"Nincs kapcsolat a nyomtatóval"</string>
+ <string name="reason_unknown" msgid="5507940196503246139">"ismeretlen"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – nem érhető el"</string>
+ <string name="print_error_default_message" msgid="8568506918983980567">"Nem sikerült létrehozni a nyomtatási feladatot."</string>
+ <string-array name="color_mode_labels">
+ <item msgid="7602948745415174937">"Fekete-fehér"</item>
+ <item msgid="2762241247228983754">"Szín"</item>
+ </string-array>
+ <string-array name="orientation_labels">
+ <item msgid="4061931020926489228">"Ãlló"</item>
+ <item msgid="3199660090246166812">"Fekvő"</item>
+ </string-array>
+ <string-array name="page_options_labels">
+ <item msgid="7421377442011699994">"Összes"</item>
+ <item msgid="6812869625222503603">"Tartomány"</item>
+ </string-array>
+</resources>
diff --git a/packages/PrintSpooler/res/values-hy-rAM/strings.xml b/packages/PrintSpooler/res/values-hy-rAM/strings.xml
new file mode 100644
index 0000000..7d95f7b
--- /dev/null
+++ b/packages/PrintSpooler/res/values-hy-rAM/strings.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4469836075319831821">"ÕÕºÕ´Õ¡Õ¶ Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ¡Ö€"</string>
+ <string name="advanced_settings_button" msgid="5764225091289415632">"ÕÕºÕ«Õ¹Õ« Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´Õ¶Õ¥Ö€"</string>
+ <string name="print_button" msgid="645164566271246268">"ÕÕºÕ¥Õ¬"</string>
+ <string name="save_button" msgid="1921310454071758999">"ÕŠÕ¡Õ°Õ¥Õ¬"</string>
+ <string name="label_destination" msgid="9132510997381599275">"Õ†ÕºÕ¡Õ¿Õ¡Õ¯Õ¡Õ¯Õ¥Õ¿"</string>
+ <string name="label_copies" msgid="3634531042822968308">"ÕŠÕ¡Õ¿Õ³Õ¥Õ¶Õ¶Õ¥Ö€"</string>
+ <string name="label_paper_size" msgid="8681895607876809323">"Ô¹Õ²Õ©Õ« Õ¹Õ¡ÖƒÕ¨"</string>
+ <string name="label_color" msgid="1108690305218188969">"Ô³Õ¸Ö‚ÕµÕ¶Õ¨"</string>
+ <string name="label_orientation" msgid="2853142581990496477">"Ô´Õ«Ö€Ö„Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´"</string>
+ <string name="label_pages" msgid="6300874667546617333">"Ô·Õ»Õ¥Ö€ (<xliff:g id="PAGE_COUNT">%1$s</xliff:g>)"</string>
+ <string name="pages_range_example" msgid="8558694453556945172">"Ö…Ö€.Õ 1-5, 8, 11-13"</string>
+ <string name="print_preview" msgid="8010217796057763343">"ÕÕºÕ¥Õ¬Õ¸Ö‚ Õ¶Õ¡Õ­Õ¡Õ¤Õ«Õ¿Õ¸Ö‚Õ´"</string>
+ <string name="install_for_print_preview" msgid="6366303997385509332">"Õ†Õ¡Õ­Õ¡Õ¤Õ«Õ¿Õ´Õ¡Õ¶ Õ°Õ¡Õ´Õ¡Ö€ Õ¿Õ¥Õ²Õ¡Õ¤Ö€Õ¥Ö„ PDF Õ¤Õ«Õ¿Õ¡Ö€Õ¯Õ«Õ¹"</string>
+ <string name="printing_app_crashed" msgid="854477616686566398">"ÕÕºÕ¥Õ¬Õ¸Ö‚ Õ®Ö€Õ¡Õ£Õ«Ö€Õ¨ Õ¾Õ©Õ¡Ö€Õ« Õ§ Õ¥Õ¶Õ©Õ¡Ö€Õ¯Õ¾Õ¥Õ¬"</string>
+ <string name="page_count_unknown" msgid="6058852665954511124">"Ô·Õ»Õ¥Ö€"</string>
+ <string name="generating_print_job" msgid="3119608742651698916">"ÕÖ‡Õ¡Õ¾Õ¸Ö€Õ¾Õ¸Ö‚Õ´ Õ§ Õ¿ÕºÕ¥Õ¬Õ¸Ö‚ Õ¡Õ·Õ­Õ¡Õ¿Õ¡Õ¶Ö„Õ¨"</string>
+ <string name="save_as_pdf" msgid="5718454119847596853">"ÕŠÕ¡Õ°Õ¥Õ¬ Õ¸Ö€ÕºÕ¥Õ½ PDF"</string>
+ <string name="all_printers" msgid="5018829726861876202">"Ô²Õ¸Õ¬Õ¸Ö€ Õ¿ÕºÕ«Õ¹Õ¶Õ¥Ö€Õ¨..."</string>
+ <string name="print_dialog" msgid="32628687461331979">"ÕÕºÕ¥Õ¬Õ¸Ö‚ Õ¥Ö€Õ¯Õ­Õ¸Õ½Õ¸Ö‚Õ©ÕµÕ¡Õ¶ ÕºÕ¡Õ¿Õ¸Ö‚Õ°Õ¡Õ¶"</string>
+ <string name="search" msgid="5421724265322228497">"ÕˆÖ€Õ¸Õ¶Õ¥Õ¬"</string>
+ <string name="all_printers_label" msgid="3178848870161526399">"Ô²Õ¸Õ¬Õ¸Ö€ Õ¿ÕºÕ«Õ¹Õ¶Õ¥Ö€Õ¨"</string>
+ <string name="add_print_service_label" msgid="5356702546188981940">"Ô±Õ¾Õ¥Õ¬Õ¡ÖÕ¶Õ¥Õ¬ Õ®Õ¡Õ¼Õ¡ÕµÕ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶"</string>
+ <string name="print_search_box_shown_utterance" msgid="7967404953901376090">"ÕˆÖ€Õ¸Õ¶Õ´Õ¡Õ¶ Õ¾Õ¡Õ¶Õ¤Õ¡Õ¯Õ¨ ÖÕ¸Ö‚ÖÕ¡Õ¤Ö€Õ¾Õ¡Õ® Õ§"</string>
+ <string name="print_search_box_hidden_utterance" msgid="5727755169343113351">"ÕˆÖ€Õ¸Õ¶Õ´Õ¡Õ¶ Õ¾Õ¡Õ¶Õ¤Õ¡Õ¯Õ¨ Õ©Õ¡Ö„ÖÕ¾Õ¥Õ¬ Õ§"</string>
+ <string name="print_add_printer" msgid="1088656468360653455">"Ô±Õ¾Õ¥Õ¬Õ¡ÖÕ¶Õ¥Õ¬ Õ¿ÕºÕ«Õ¹"</string>
+ <plurals name="print_search_result_count_utterance">
+ <item quantity="one" msgid="4484953260685964252">"<xliff:g id="COUNT">%1$s</xliff:g> Õ¿ÕºÕ«Õ¹ Õ§ Õ£Õ¿Õ¶Õ¾Õ¥Õ¬"</item>
+ <item quantity="other" msgid="6533817036607128241">"<xliff:g id="COUNT">%1$s</xliff:g> Õ¿ÕºÕ«Õ¹ Õ§ Õ£Õ¿Õ¶Õ¾Õ¥Õ¬"</item>
+ </plurals>
+ <string name="choose_print_service" msgid="3740309762324459694">"Ô¸Õ¶Õ¿Ö€Õ¥Ö„ Õ¿ÕºÕ¥Õ¬Õ¸Ö‚ Õ®Õ¡Õ¼Õ¡ÕµÕ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨"</string>
+ <string name="print_searching_for_printers" msgid="6550424555079932867">"ÕÕºÕ«Õ¹Õ¶Õ¥Ö€Õ« Õ¸Ö€Õ¸Õ¶Õ¸Ö‚Õ´"</string>
+ <string name="print_no_printers" msgid="4869403323900054866">"ÕÕºÕ«Õ¹Õ¶Õ¥Ö€ Õ¹Õ¥Õ¶ Õ£Õ¿Õ¶Õ¾Õ¥Õ¬"</string>
+ <string name="printing_notification_title_template" msgid="295903957762447362">"ÕÕºÕ¾Õ¸Ö‚Õ´ Õ§Õ <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="cancelling_notification_title_template" msgid="1821759594704703197">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>-Õ¨ Õ¹Õ¥Õ²Õ¡Ö€Õ¯Õ¾Õ¸Ö‚Õ´ Õ§"</string>
+ <string name="failed_notification_title_template" msgid="2256217208186530973">"ÕÕºÕ«Õ¹Õ« Õ½Õ­Õ¡Õ¬ <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="blocked_notification_title_template" msgid="1175435827331588646">"ÕÕºÕ«Õ¹Õ¶ Õ¡Ö€Õ£Õ¥Õ¬Õ¡ÖƒÕ¡Õ¯Õ¥Õ¬ Õ§ <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>-Õ¨"</string>
+ <plurals name="composite_notification_title_template">
+ <item quantity="one" msgid="5866624638054847057">"<xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g> Õ¿ÕºÕ´Õ¡Õ¶ Õ¡Õ·Õ­Õ¡Õ¿Õ¡Õ¶Ö„"</item>
+ <item quantity="other" msgid="8746611264734222865">"<xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g> Õ¿ÕºÕ´Õ¡Õ¶ Õ¡Õ·Õ­Õ¡Õ¿Õ¡Õ¶Ö„Õ¶Õ¥Ö€"</item>
+ </plurals>
+ <string name="cancel" msgid="4373674107267141885">"Õ‰Õ¥Õ²Õ¡Ö€Õ¯Õ¥Õ¬"</string>
+ <string name="restart" msgid="2472034227037808749">"ÕŽÕ¥Ö€Õ¡Õ£Õ¸Ö€Õ®Õ¡Ö€Õ¯Õ¥Õ¬"</string>
+ <string name="no_connection_to_printer" msgid="2159246915977282728">"ÕÕºÕ«Õ¹Õ« Õ°Õ¥Õ¿ Õ¯Õ¡Õº Õ¹Õ¯Õ¡"</string>
+ <string name="reason_unknown" msgid="5507940196503246139">"Õ¡Õ¶Õ°Õ¡ÕµÕ¿"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> Õ¿ÕºÕ«Õ¹Õ¶ Õ¡Õ¶Õ°Õ¡Õ½Õ¡Õ¶Õ¥Õ¬Õ« Õ§"</string>
+ <string name="print_error_default_message" msgid="8568506918983980567">"Õ‰Õ¯Õ¡Ö€Õ¸Õ²Õ¡ÖÕ¡Õ¶Ö„ Õ´Õ·Õ¡Õ¯Õ¥Õ¬ Õ¿ÕºÕ´Õ¡Õ¶ Õ¡Õ·Õ­Õ¡Õ¿Õ¡Õ¶Ö„Õ¨"</string>
+ <string-array name="color_mode_labels">
+ <item msgid="7602948745415174937">"ÕÖ‡ Õ¸Ö‚ Õ½ÕºÕ«Õ¿Õ¡Õ¯"</item>
+ <item msgid="2762241247228983754">"Ô³Õ¸Ö‚ÕµÕ¶Õ¨"</item>
+ </string-array>
+ <string-array name="orientation_labels">
+ <item msgid="4061931020926489228">"Ô´Õ«Õ´Õ¡Õ¶Õ¯Õ¡Ö€"</item>
+ <item msgid="3199660090246166812">"Ô¼Õ¡Õ¶Õ¤Õ·Õ¡Ö†Õ¿"</item>
+ </string-array>
+ <string-array name="page_options_labels">
+ <item msgid="7421377442011699994">"Ô²Õ¸Õ¬Õ¸Ö€Õ¨"</item>
+ <item msgid="6812869625222503603">"Õ„Õ«Õ»Õ¡Õ¯Õ¡ÕµÖ„"</item>
+ </string-array>
+</resources>
diff --git a/packages/PrintSpooler/res/values-in/strings.xml b/packages/PrintSpooler/res/values-in/strings.xml
new file mode 100644
index 0000000..1206676
--- /dev/null
+++ b/packages/PrintSpooler/res/values-in/strings.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4469836075319831821">"Print Spooler"</string>
+ <string name="advanced_settings_button" msgid="5764225091289415632">"Setelan printer"</string>
+ <string name="print_button" msgid="645164566271246268">"Cetak"</string>
+ <string name="save_button" msgid="1921310454071758999">"Simpan"</string>
+ <string name="label_destination" msgid="9132510997381599275">"Tujuan"</string>
+ <string name="label_copies" msgid="3634531042822968308">"Salinan"</string>
+ <string name="label_paper_size" msgid="8681895607876809323">"Ukuran Kertas"</string>
+ <string name="label_color" msgid="1108690305218188969">"Warna"</string>
+ <string name="label_orientation" msgid="2853142581990496477">"Orientasi"</string>
+ <string name="label_pages" msgid="6300874667546617333">"(<xliff:g id="PAGE_COUNT">%1$s</xliff:g>) halaman"</string>
+ <string name="pages_range_example" msgid="8558694453556945172">"misalnya 1—5,8,11—13"</string>
+ <string name="print_preview" msgid="8010217796057763343">"Pratinjau cetak"</string>
+ <string name="install_for_print_preview" msgid="6366303997385509332">"Pasang penampil PDF untuk pratinjau"</string>
+ <string name="printing_app_crashed" msgid="854477616686566398">"Aplikasi pencetakan mogok"</string>
+ <string name="page_count_unknown" msgid="6058852665954511124">"Halaman"</string>
+ <string name="generating_print_job" msgid="3119608742651698916">"Membuat tugas pencetakan"</string>
+ <string name="save_as_pdf" msgid="5718454119847596853">"Simpan sebagai PDF"</string>
+ <string name="all_printers" msgid="5018829726861876202">"Semua printer…"</string>
+ <string name="print_dialog" msgid="32628687461331979">"Cetak dialog"</string>
+ <string name="search" msgid="5421724265322228497">"Cari"</string>
+ <string name="all_printers_label" msgid="3178848870161526399">"Semua printer"</string>
+ <string name="add_print_service_label" msgid="5356702546188981940">"Tambahkan layanan"</string>
+ <string name="print_search_box_shown_utterance" msgid="7967404953901376090">"Kotak telusur ditampilkan"</string>
+ <string name="print_search_box_hidden_utterance" msgid="5727755169343113351">"Kotak telusur disembunyikan"</string>
+ <string name="print_add_printer" msgid="1088656468360653455">"Tambahkan printer"</string>
+ <plurals name="print_search_result_count_utterance">
+ <item quantity="one" msgid="4484953260685964252">"<xliff:g id="COUNT">%1$s</xliff:g> printer ditemukan"</item>
+ <item quantity="other" msgid="6533817036607128241">"<xliff:g id="COUNT">%1$s</xliff:g> printer ditemukan"</item>
+ </plurals>
+ <string name="choose_print_service" msgid="3740309762324459694">"Pilih layanan cetak"</string>
+ <string name="print_searching_for_printers" msgid="6550424555079932867">"Mencari printer"</string>
+ <string name="print_no_printers" msgid="4869403323900054866">"Tidak ditemukan printer"</string>
+ <string name="printing_notification_title_template" msgid="295903957762447362">"Mencetak <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Membatalkan <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="failed_notification_title_template" msgid="2256217208186530973">"Ada kesalahan printer <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="blocked_notification_title_template" msgid="1175435827331588646">"Printer memblokir <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <plurals name="composite_notification_title_template">
+ <item quantity="one" msgid="5866624638054847057">"Tugas cetak <xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g>"</item>
+ <item quantity="other" msgid="8746611264734222865">"Tugas cetak <xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g>"</item>
+ </plurals>
+ <string name="cancel" msgid="4373674107267141885">"Batal"</string>
+ <string name="restart" msgid="2472034227037808749">"Mulai Ulang"</string>
+ <string name="no_connection_to_printer" msgid="2159246915977282728">"Tidak ada sambungan ke printer"</string>
+ <string name="reason_unknown" msgid="5507940196503246139">"tak diketahui"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – tidak tersedia"</string>
+ <string name="print_error_default_message" msgid="8568506918983980567">"Tidak dapat membuat tugas cetak"</string>
+ <string-array name="color_mode_labels">
+ <item msgid="7602948745415174937">"Hitam &amp; Putih"</item>
+ <item msgid="2762241247228983754">"Warna"</item>
+ </string-array>
+ <string-array name="orientation_labels">
+ <item msgid="4061931020926489228">"Potret"</item>
+ <item msgid="3199660090246166812">"Lanskap"</item>
+ </string-array>
+ <string-array name="page_options_labels">
+ <item msgid="7421377442011699994">"Semua"</item>
+ <item msgid="6812869625222503603">"Rentang"</item>
+ </string-array>
+</resources>
diff --git a/packages/PrintSpooler/res/values-it/strings.xml b/packages/PrintSpooler/res/values-it/strings.xml
new file mode 100644
index 0000000..4223188
--- /dev/null
+++ b/packages/PrintSpooler/res/values-it/strings.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4469836075319831821">"Print Spooler"</string>
+ <string name="advanced_settings_button" msgid="5764225091289415632">"Impostazioni stampante"</string>
+ <string name="print_button" msgid="645164566271246268">"Stampa"</string>
+ <string name="save_button" msgid="1921310454071758999">"Salva"</string>
+ <string name="label_destination" msgid="9132510997381599275">"Destinazione"</string>
+ <string name="label_copies" msgid="3634531042822968308">"Copie"</string>
+ <string name="label_paper_size" msgid="8681895607876809323">"Formato carta"</string>
+ <string name="label_color" msgid="1108690305218188969">"A colori"</string>
+ <string name="label_orientation" msgid="2853142581990496477">"Orientamento"</string>
+ <string name="label_pages" msgid="6300874667546617333">"Pagine (<xliff:g id="PAGE_COUNT">%1$s</xliff:g>)"</string>
+ <string name="pages_range_example" msgid="8558694453556945172">"Es.: 1-5, 8, 11-13"</string>
+ <string name="print_preview" msgid="8010217796057763343">"Anteprima di stampa"</string>
+ <string name="install_for_print_preview" msgid="6366303997385509332">"Installa visualizzatore PDF per anteprima"</string>
+ <string name="printing_app_crashed" msgid="854477616686566398">"Arresto anomalo dell\'app di stampa"</string>
+ <string name="page_count_unknown" msgid="6058852665954511124">"Pagine"</string>
+ <string name="generating_print_job" msgid="3119608742651698916">"Generazione processo di stampa"</string>
+ <string name="save_as_pdf" msgid="5718454119847596853">"Salva in PDF"</string>
+ <string name="all_printers" msgid="5018829726861876202">"Tutte le stampanti…"</string>
+ <string name="print_dialog" msgid="32628687461331979">"Finestra di dialogo Stampa"</string>
+ <string name="search" msgid="5421724265322228497">"Cerca"</string>
+ <string name="all_printers_label" msgid="3178848870161526399">"Tutte le stampanti"</string>
+ <string name="add_print_service_label" msgid="5356702546188981940">"Aggiungi servizio"</string>
+ <string name="print_search_box_shown_utterance" msgid="7967404953901376090">"Casella di ricerca visualizzata"</string>
+ <string name="print_search_box_hidden_utterance" msgid="5727755169343113351">"Casella di ricerca nascosta"</string>
+ <string name="print_add_printer" msgid="1088656468360653455">"Aggiungi stampante"</string>
+ <plurals name="print_search_result_count_utterance">
+ <item quantity="one" msgid="4484953260685964252">"<xliff:g id="COUNT">%1$s</xliff:g> stampante trovata"</item>
+ <item quantity="other" msgid="6533817036607128241">"<xliff:g id="COUNT">%1$s</xliff:g> stampanti trovate"</item>
+ </plurals>
+ <string name="choose_print_service" msgid="3740309762324459694">"Scegli servizio di stampa"</string>
+ <string name="print_searching_for_printers" msgid="6550424555079932867">"Ricerca di stampanti"</string>
+ <string name="print_no_printers" msgid="4869403323900054866">"Nessuna stampante trovata"</string>
+ <string name="printing_notification_title_template" msgid="295903957762447362">"Stampa di <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Annullamento di <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="failed_notification_title_template" msgid="2256217208186530973">"Errore della stampante: <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="blocked_notification_title_template" msgid="1175435827331588646">"La stampante ha bloccato <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <plurals name="composite_notification_title_template">
+ <item quantity="one" msgid="5866624638054847057">"Processo di stampa <xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g>"</item>
+ <item quantity="other" msgid="8746611264734222865">"Processi di stampa <xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g>"</item>
+ </plurals>
+ <string name="cancel" msgid="4373674107267141885">"Annulla"</string>
+ <string name="restart" msgid="2472034227037808749">"Riavvia"</string>
+ <string name="no_connection_to_printer" msgid="2159246915977282728">"Nessun collegamento alla stampante"</string>
+ <string name="reason_unknown" msgid="5507940196503246139">"sconosciuto"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> - non disponibile"</string>
+ <string name="print_error_default_message" msgid="8568506918983980567">"Impossibile generare processo di stampa"</string>
+ <string-array name="color_mode_labels">
+ <item msgid="7602948745415174937">"Bianco e nero"</item>
+ <item msgid="2762241247228983754">"A colori"</item>
+ </string-array>
+ <string-array name="orientation_labels">
+ <item msgid="4061931020926489228">"Verticale"</item>
+ <item msgid="3199660090246166812">"Orizzontale"</item>
+ </string-array>
+ <string-array name="page_options_labels">
+ <item msgid="7421377442011699994">"Tutte"</item>
+ <item msgid="6812869625222503603">"Intervallo"</item>
+ </string-array>
+</resources>
diff --git a/packages/PrintSpooler/res/values-iw/strings.xml b/packages/PrintSpooler/res/values-iw/strings.xml
new file mode 100644
index 0000000..2a9e0df
--- /dev/null
+++ b/packages/PrintSpooler/res/values-iw/strings.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4469836075319831821">"Print Spooler"</string>
+ <string name="advanced_settings_button" msgid="5764225091289415632">"הגדרות מדפסת"</string>
+ <string name="print_button" msgid="645164566271246268">"הדפס"</string>
+ <string name="save_button" msgid="1921310454071758999">"שמור"</string>
+ <string name="label_destination" msgid="9132510997381599275">"יעד"</string>
+ <string name="label_copies" msgid="3634531042822968308">"עותקי×"</string>
+ <string name="label_paper_size" msgid="8681895607876809323">"גודל נייר"</string>
+ <string name="label_color" msgid="1108690305218188969">"צבע"</string>
+ <string name="label_orientation" msgid="2853142581990496477">"כיוון"</string>
+ <string name="label_pages" msgid="6300874667546617333">"×¢×ž×•×“×™× (<xliff:g id="PAGE_COUNT">%1$s</xliff:g>)"</string>
+ <string name="pages_range_example" msgid="8558694453556945172">"למשל 1–5â€,8,â€11–13"</string>
+ <string name="print_preview" msgid="8010217796057763343">"תצוגה מקדימה של הדפסה"</string>
+ <string name="install_for_print_preview" msgid="6366303997385509332">"â€×”תקן מציג PDF ליצירת תצוגה מקדימה"</string>
+ <string name="printing_app_crashed" msgid="854477616686566398">"×פליקציית ההדפסה קרסה"</string>
+ <string name="page_count_unknown" msgid="6058852665954511124">"עמודי×"</string>
+ <string name="generating_print_job" msgid="3119608742651698916">"יוצר עבודת הדפסה"</string>
+ <string name="save_as_pdf" msgid="5718454119847596853">"â€×©×ž×•ר ×›-PDF"</string>
+ <string name="all_printers" msgid="5018829726861876202">"כל המדפסות…"</string>
+ <string name="print_dialog" msgid="32628687461331979">"תיבת דו שיח של מדפסת"</string>
+ <string name="search" msgid="5421724265322228497">"חפש"</string>
+ <string name="all_printers_label" msgid="3178848870161526399">"כל המדפסות"</string>
+ <string name="add_print_service_label" msgid="5356702546188981940">"הוסף שירות"</string>
+ <string name="print_search_box_shown_utterance" msgid="7967404953901376090">"תיבת החיפוש מוצגת"</string>
+ <string name="print_search_box_hidden_utterance" msgid="5727755169343113351">"תיבת החיפוש מוסתרת"</string>
+ <string name="print_add_printer" msgid="1088656468360653455">"הוסף מדפסת"</string>
+ <plurals name="print_search_result_count_utterance">
+ <item quantity="one" msgid="4484953260685964252">"נמצ××” מדפסת <xliff:g id="COUNT">%1$s</xliff:g>"</item>
+ <item quantity="other" msgid="6533817036607128241">"נמצ×ו <xliff:g id="COUNT">%1$s</xliff:g> מדפסות"</item>
+ </plurals>
+ <string name="choose_print_service" msgid="3740309762324459694">"בחר שירות הדפסה"</string>
+ <string name="print_searching_for_printers" msgid="6550424555079932867">"מחפש מדפסות"</string>
+ <string name="print_no_printers" msgid="4869403323900054866">"×œ× × ×ž×¦×ו מדפסות"</string>
+ <string name="printing_notification_title_template" msgid="295903957762447362">"מדפיס ×ת <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="cancelling_notification_title_template" msgid="1821759594704703197">"מבטל ×ת <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="failed_notification_title_template" msgid="2256217208186530973">"שגי×ת מדפסת ב-<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="blocked_notification_title_template" msgid="1175435827331588646">"המדפסת חסמה ×ת <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <plurals name="composite_notification_title_template">
+ <item quantity="one" msgid="5866624638054847057">"עבודת הדפסה <xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g>"</item>
+ <item quantity="other" msgid="8746611264734222865">"<xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g> עבודות הדפסה"</item>
+ </plurals>
+ <string name="cancel" msgid="4373674107267141885">"בטל"</string>
+ <string name="restart" msgid="2472034227037808749">"הפעל מחדש"</string>
+ <string name="no_connection_to_printer" msgid="2159246915977282728">"×ין חיבור למדפסת"</string>
+ <string name="reason_unknown" msgid="5507940196503246139">"×œ× ×™×“×•×¢"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – ×œ× ×–×ž×™× ×”"</string>
+ <string name="print_error_default_message" msgid="8568506918983980567">"×œ× × ×™×ª×Ÿ ×”×™×” ליצור ×ת עבודת ההדפסה"</string>
+ <string-array name="color_mode_labels">
+ <item msgid="7602948745415174937">"שחור ולבן"</item>
+ <item msgid="2762241247228983754">"צבע"</item>
+ </string-array>
+ <string-array name="orientation_labels">
+ <item msgid="4061931020926489228">"ל×ורך"</item>
+ <item msgid="3199660090246166812">"לרוחב"</item>
+ </string-array>
+ <string-array name="page_options_labels">
+ <item msgid="7421377442011699994">"הכל"</item>
+ <item msgid="6812869625222503603">"טווח"</item>
+ </string-array>
+</resources>
diff --git a/packages/PrintSpooler/res/values-ja/arrays.xml b/packages/PrintSpooler/res/values-ja/arrays.xml
deleted file mode 100644
index 3364979..0000000
--- a/packages/PrintSpooler/res/values-ja/arrays.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2013 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<resources>
-
- <string-array name="pdf_printer_media_sizes" translatable="false">
- <item>JIS_B10</item>
- <item>JIS_B9</item>
- <item>JIS_B8</item>
- <item>JIS_B7</item>
- <item>JIS_b6</item>
- <item>JIS_b5</item>
- <item>JIS_b4</item>
- <item>JIS_b3</item>
- <item>JIS_b2</item>
- <item>JIS_b1</item>
- <item>JIS_b0</item>
- <item>JIS_EXEC</item>
- <item>JPN_CHOU4</item>
- <item>JPN_CHOU3</item>
- <item>JPN_CHOU2</item>
- <item>JPN_HAGAKI</item>
- <item>JPN_OUFUKU</item>
- <item>JPN_KAHU</item>
- <item>JPN_KAKU2</item>
- <item>JPN_YOU4</item>
- </string-array>
-
-</resources>
diff --git a/packages/PrintSpooler/res/values-ja/strings.xml b/packages/PrintSpooler/res/values-ja/strings.xml
new file mode 100644
index 0000000..e6ae97a
--- /dev/null
+++ b/packages/PrintSpooler/res/values-ja/strings.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4469836075319831821">"å°åˆ·ã‚¹ãƒ—ーラ"</string>
+ <string name="advanced_settings_button" msgid="5764225091289415632">"プリンタã®è¨­å®š"</string>
+ <string name="print_button" msgid="645164566271246268">"å°åˆ·"</string>
+ <string name="save_button" msgid="1921310454071758999">"ä¿å­˜"</string>
+ <string name="label_destination" msgid="9132510997381599275">"å°åˆ·å…ˆ"</string>
+ <string name="label_copies" msgid="3634531042822968308">"部数"</string>
+ <string name="label_paper_size" msgid="8681895607876809323">"用紙サイズ"</string>
+ <string name="label_color" msgid="1108690305218188969">"色"</string>
+ <string name="label_orientation" msgid="2853142581990496477">"æ–¹å‘"</string>
+ <string name="label_pages" msgid="6300874667546617333">"ページ(<xliff:g id="PAGE_COUNT">%1$s</xliff:g>)"</string>
+ <string name="pages_range_example" msgid="8558694453556945172">"例: 1-5,8,11-13"</string>
+ <string name="print_preview" msgid="8010217796057763343">"å°åˆ·ãƒ—レビュー"</string>
+ <string name="install_for_print_preview" msgid="6366303997385509332">"プレビュー用PDFビューアをインストール"</string>
+ <string name="printing_app_crashed" msgid="854477616686566398">"å°åˆ·ã‚¢ãƒ—リã§ã®éšœå®³ç™ºç”Ÿ"</string>
+ <string name="page_count_unknown" msgid="6058852665954511124">"ページ数"</string>
+ <string name="generating_print_job" msgid="3119608742651698916">"å°åˆ·ã‚¸ãƒ§ãƒ–を生æˆã—ã¦ã„ã¾ã™"</string>
+ <string name="save_as_pdf" msgid="5718454119847596853">"PDFå½¢å¼ã§ä¿å­˜"</string>
+ <string name="all_printers" msgid="5018829726861876202">"ã™ã¹ã¦ã®ãƒ—リンタ…"</string>
+ <string name="print_dialog" msgid="32628687461331979">"å°åˆ·ãƒ€ã‚¤ã‚¢ãƒ­ã‚°"</string>
+ <string name="search" msgid="5421724265322228497">"検索"</string>
+ <string name="all_printers_label" msgid="3178848870161526399">"ã™ã¹ã¦ã®ãƒ—リンタ"</string>
+ <string name="add_print_service_label" msgid="5356702546188981940">"サービスを追加"</string>
+ <string name="print_search_box_shown_utterance" msgid="7967404953901376090">"検索ボックスã¯è¡¨ç¤ºã•れã¦ã„ã¾ã™"</string>
+ <string name="print_search_box_hidden_utterance" msgid="5727755169343113351">"検索ボックスã¯è¡¨ç¤ºã•れã¦ã„ã¾ã›ã‚“"</string>
+ <string name="print_add_printer" msgid="1088656468360653455">"プリンタを追加"</string>
+ <plurals name="print_search_result_count_utterance">
+ <item quantity="one" msgid="4484953260685964252">"<xliff:g id="COUNT">%1$s</xliff:g>å°ã®ãƒ—リンタãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸ"</item>
+ <item quantity="other" msgid="6533817036607128241">"<xliff:g id="COUNT">%1$s</xliff:g>å°ã®ãƒ—リンタãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸ"</item>
+ </plurals>
+ <string name="choose_print_service" msgid="3740309762324459694">"å°åˆ·ã‚µãƒ¼ãƒ“スã®é¸æŠž"</string>
+ <string name="print_searching_for_printers" msgid="6550424555079932867">"ãƒ—ãƒªãƒ³ã‚¿ã®æ¤œç´¢ä¸­"</string>
+ <string name="print_no_printers" msgid="4869403323900054866">"プリンタãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"</string>
+ <string name="printing_notification_title_template" msgid="295903957762447362">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>ã‚’å°åˆ·ã—ã¦ã„ã¾ã™"</string>
+ <string name="cancelling_notification_title_template" msgid="1821759594704703197">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>をキャンセルã—ã¦ã„ã¾ã™"</string>
+ <string name="failed_notification_title_template" msgid="2256217208186530973">"プリンタエラー: <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="blocked_notification_title_template" msgid="1175435827331588646">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>をブロックã—ã¾ã—ãŸ"</string>
+ <plurals name="composite_notification_title_template">
+ <item quantity="one" msgid="5866624638054847057">"<xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g>ã®å°åˆ·ã‚¸ãƒ§ãƒ–"</item>
+ <item quantity="other" msgid="8746611264734222865">"<xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g>ã®å°åˆ·ã‚¸ãƒ§ãƒ–"</item>
+ </plurals>
+ <string name="cancel" msgid="4373674107267141885">"キャンセル"</string>
+ <string name="restart" msgid="2472034227037808749">"å†èµ·å‹•"</string>
+ <string name="no_connection_to_printer" msgid="2159246915977282728">"ãƒ—ãƒªãƒ³ã‚¿ã«æŽ¥ç¶šã•れã¦ã„ã¾ã›ã‚“"</string>
+ <string name="reason_unknown" msgid="5507940196503246139">"䏿˜Ž"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>–使用ä¸å¯"</string>
+ <string name="print_error_default_message" msgid="8568506918983980567">"å°åˆ·ã‚¸ãƒ§ãƒ–を生æˆã§ãã¾ã›ã‚“ã§ã—ãŸ"</string>
+ <string-array name="color_mode_labels">
+ <item msgid="7602948745415174937">"モノクロ"</item>
+ <item msgid="2762241247228983754">"色"</item>
+ </string-array>
+ <string-array name="orientation_labels">
+ <item msgid="4061931020926489228">"縦å‘ã"</item>
+ <item msgid="3199660090246166812">"横å‘ã"</item>
+ </string-array>
+ <string-array name="page_options_labels">
+ <item msgid="7421377442011699994">"ã™ã¹ã¦"</item>
+ <item msgid="6812869625222503603">"範囲"</item>
+ </string-array>
+</resources>
diff --git a/packages/PrintSpooler/res/values-ka-rGE/strings.xml b/packages/PrintSpooler/res/values-ka-rGE/strings.xml
new file mode 100644
index 0000000..3fc1f3a
--- /dev/null
+++ b/packages/PrintSpooler/res/values-ka-rGE/strings.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4469836075319831821">"ბეჭდვის Spooler"</string>
+ <string name="advanced_settings_button" msgid="5764225091289415632">"პრინტერის პáƒáƒ áƒáƒ›áƒ”ტრები"</string>
+ <string name="print_button" msgid="645164566271246268">"ბეჭდვáƒ"</string>
+ <string name="save_button" msgid="1921310454071758999">"შენáƒáƒ®áƒ•áƒ"</string>
+ <string name="label_destination" msgid="9132510997381599275">"დáƒáƒœáƒ˜áƒ¨áƒœáƒ£áƒšáƒ”ბáƒ"</string>
+ <string name="label_copies" msgid="3634531042822968308">"áƒáƒ¡áƒšáƒ”ბი"</string>
+ <string name="label_paper_size" msgid="8681895607876809323">"ფურცლის ზáƒáƒ›áƒ"</string>
+ <string name="label_color" msgid="1108690305218188969">"ფერი"</string>
+ <string name="label_orientation" msgid="2853142581990496477">"áƒáƒ áƒ˜áƒ”ნტáƒáƒªáƒ˜áƒ"</string>
+ <string name="label_pages" msgid="6300874667546617333">"გვერდები (<xliff:g id="PAGE_COUNT">%1$s</xliff:g>)"</string>
+ <string name="pages_range_example" msgid="8558694453556945172">"მáƒáƒ’. 1–5, 8, 11–13"</string>
+ <string name="print_preview" msgid="8010217796057763343">"ნáƒáƒ®áƒ•რáƒáƒ›áƒáƒ‘ეჭდვáƒáƒ›áƒ“ე"</string>
+ <string name="install_for_print_preview" msgid="6366303997385509332">"გáƒáƒ“áƒáƒ®áƒ”დვისთვის დáƒáƒáƒ§áƒ”ნეთ PDF მნáƒáƒ®áƒ•ელი"</string>
+ <string name="printing_app_crashed" msgid="854477616686566398">"ბეჭდვის áƒáƒžáƒ˜ áƒáƒ•áƒáƒ áƒ˜áƒ£áƒšáƒáƒ“ გáƒáƒ˜áƒ—იშáƒ"</string>
+ <string name="page_count_unknown" msgid="6058852665954511124">"გვერდები"</string>
+ <string name="generating_print_job" msgid="3119608742651698916">"მიმდინáƒáƒ áƒ”áƒáƒ‘ის ბეჭდვის დáƒáƒ•áƒáƒšáƒ”ბის შექმნáƒ"</string>
+ <string name="save_as_pdf" msgid="5718454119847596853">"PDF-áƒáƒ“ შენáƒáƒ®áƒ•áƒ"</string>
+ <string name="all_printers" msgid="5018829726861876202">"ყველრპრინტერი…"</string>
+ <string name="print_dialog" msgid="32628687461331979">"ბეჭდვის სáƒáƒ áƒ™áƒ›áƒ”ლი"</string>
+ <string name="search" msgid="5421724265322228497">"ძიებáƒ"</string>
+ <string name="all_printers_label" msgid="3178848870161526399">"ყველრპრინტერი"</string>
+ <string name="add_print_service_label" msgid="5356702546188981940">"სერვისის დáƒáƒ›áƒáƒ¢áƒ”ბáƒ"</string>
+ <string name="print_search_box_shown_utterance" msgid="7967404953901376090">"სáƒáƒ«áƒ˜áƒ”ბრველი ნáƒáƒ©áƒ•ენებიáƒ"</string>
+ <string name="print_search_box_hidden_utterance" msgid="5727755169343113351">"სáƒáƒ«áƒ˜áƒ”ბრველი დáƒáƒ›áƒáƒšáƒ£áƒšáƒ˜áƒ"</string>
+ <string name="print_add_printer" msgid="1088656468360653455">"პრინტერის დáƒáƒ›áƒáƒ¢áƒ”ბáƒ"</string>
+ <plurals name="print_search_result_count_utterance">
+ <item quantity="one" msgid="4484953260685964252">"ნáƒáƒžáƒáƒ•ნირ<xliff:g id="COUNT">%1$s</xliff:g> პრინტერი"</item>
+ <item quantity="other" msgid="6533817036607128241">"ნáƒáƒžáƒáƒ•ნირ<xliff:g id="COUNT">%1$s</xliff:g> პრინტერი"</item>
+ </plurals>
+ <string name="choose_print_service" msgid="3740309762324459694">"áƒáƒ˜áƒ áƒ©áƒ˜áƒ”თ ბეჭდვის სერვისი"</string>
+ <string name="print_searching_for_printers" msgid="6550424555079932867">"მიმდინáƒáƒ áƒ”áƒáƒ‘ს პრინტერების ძიებáƒ"</string>
+ <string name="print_no_printers" msgid="4869403323900054866">"პრინტერები ვერ მáƒáƒ˜áƒ«áƒ”ბნáƒ"</string>
+ <string name="printing_notification_title_template" msgid="295903957762447362">"იბეჭდებრ<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="cancelling_notification_title_template" msgid="1821759594704703197">"მიმდინáƒáƒ áƒ”áƒáƒ‘ს <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>-ის გáƒáƒ£áƒ¥áƒ›áƒ”ბáƒ"</string>
+ <string name="failed_notification_title_template" msgid="2256217208186530973">"ბეჭდვის შეცდáƒáƒ›áƒ <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="blocked_notification_title_template" msgid="1175435827331588646">"პრინტერმრდáƒáƒ‘ლáƒáƒ™áƒ <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <plurals name="composite_notification_title_template">
+ <item quantity="one" msgid="5866624638054847057">"ბეჭდვის <xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g> დáƒáƒ•áƒáƒšáƒ”ბáƒ"</item>
+ <item quantity="other" msgid="8746611264734222865">"ბეჭდვის <xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g> დáƒáƒ•áƒáƒšáƒ”ბáƒ"</item>
+ </plurals>
+ <string name="cancel" msgid="4373674107267141885">"გáƒáƒ£áƒ¥áƒ›áƒ”ბáƒ"</string>
+ <string name="restart" msgid="2472034227037808749">"გáƒáƒ“áƒáƒ¢áƒ•ირთვáƒ"</string>
+ <string name="no_connection_to_printer" msgid="2159246915977282728">"პრინტერთáƒáƒœ კáƒáƒ•შირი áƒáƒ  áƒáƒ áƒ˜áƒ¡"</string>
+ <string name="reason_unknown" msgid="5507940196503246139">"უცნáƒáƒ‘ი"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – მიუწვდáƒáƒ›áƒ”ლიáƒ"</string>
+ <string name="print_error_default_message" msgid="8568506918983980567">"ბეჭდვის დáƒáƒ•áƒáƒšáƒ”ბის გენერáƒáƒªáƒ˜áƒ ვერ ხერხდებáƒ"</string>
+ <string-array name="color_mode_labels">
+ <item msgid="7602948745415174937">"შáƒáƒ•-თეთრი"</item>
+ <item msgid="2762241247228983754">"ფერი"</item>
+ </string-array>
+ <string-array name="orientation_labels">
+ <item msgid="4061931020926489228">"პáƒáƒ áƒ¢áƒ áƒ”ტი"</item>
+ <item msgid="3199660090246166812">"პეიზáƒáƒŸáƒ˜áƒ¡ რეჟიმი"</item>
+ </string-array>
+ <string-array name="page_options_labels">
+ <item msgid="7421377442011699994">"ყველáƒ"</item>
+ <item msgid="6812869625222503603">"დიáƒáƒžáƒáƒ–áƒáƒœáƒ˜"</item>
+ </string-array>
+</resources>
diff --git a/packages/PrintSpooler/res/values-km-rKH/strings.xml b/packages/PrintSpooler/res/values-km-rKH/strings.xml
new file mode 100644
index 0000000..8ed8527
--- /dev/null
+++ b/packages/PrintSpooler/res/values-km-rKH/strings.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4469836075319831821">"បោះពុម្ព​ស្ពូលáŸážš"</string>
+ <string name="advanced_settings_button" msgid="5764225091289415632">"ការ​កំណážáŸ‹â€‹áž˜áŸ‰áž¶ážŸáŸŠáž¸áž“​បោះពុម្ព"</string>
+ <string name="print_button" msgid="645164566271246268">"បោះពុម្ព"</string>
+ <string name="save_button" msgid="1921310454071758999">"រក្សាទុក"</string>
+ <string name="label_destination" msgid="9132510997381599275">"ទិសដៅ"</string>
+ <string name="label_copies" msgid="3634531042822968308">"ច្បាប់​ចម្លង"</string>
+ <string name="label_paper_size" msgid="8681895607876809323">"ទំហំ​ក្រដាស"</string>
+ <string name="label_color" msgid="1108690305218188969">"ពណ៌"</string>
+ <string name="label_orientation" msgid="2853142581990496477">"ទិស"</string>
+ <string name="label_pages" msgid="6300874667546617333">"ទំពáŸážš (<xliff:g id="PAGE_COUNT">%1$s</xliff:g>)"</string>
+ <string name="pages_range_example" msgid="8558694453556945172">"ឧ. 1—5,8,11—13"</string>
+ <string name="print_preview" msgid="8010217796057763343">"មើល​មុន​បោះពុម្ព"</string>
+ <string name="install_for_print_preview" msgid="6366303997385509332">"ដំឡើង​កម្មវិធី​មើល PDF សម្រាប់​ការ​មើល​ជា​មុន"</string>
+ <string name="printing_app_crashed" msgid="854477616686566398">"កម្មវិធី​បោះពុម្ព​គាំង"</string>
+ <string name="page_count_unknown" msgid="6058852665954511124">"ទំពáŸážš"</string>
+ <string name="generating_print_job" msgid="3119608742651698916">"​បង្កើážâ€‹áž€áž¶ážšâ€‹áž„ារ​បោះពុម្ព"</string>
+ <string name="save_as_pdf" msgid="5718454119847596853">"រក្សា​ទុក​ជា PDF"</string>
+ <string name="all_printers" msgid="5018829726861876202">"ម៉ាស៊ីន​បោះពុម្ព​ទាំងអស់ ..."</string>
+ <string name="print_dialog" msgid="32628687461331979">"ប្រអប់​បោះពុម្ព"</string>
+ <string name="search" msgid="5421724265322228497">"ស្វែងរក"</string>
+ <string name="all_printers_label" msgid="3178848870161526399">"ម៉ាស៊ីន​បោះពុម្ព​ទាំងអស់"</string>
+ <string name="add_print_service_label" msgid="5356702546188981940">"បន្ážáŸ‚ម​សáŸážœáž¶áž€áž˜áŸ’ម"</string>
+ <string name="print_search_box_shown_utterance" msgid="7967404953901376090">"បាន​បង្ហាញ​ប្រ​អប់​ស្វែងរក"</string>
+ <string name="print_search_box_hidden_utterance" msgid="5727755169343113351">"បាន​លាក់​ប្រអប់​ស្វែងរក"</string>
+ <string name="print_add_printer" msgid="1088656468360653455">"បន្ážáŸ‚ម​ម៉ាស៊ីន​បោះពុម្ព"</string>
+ <plurals name="print_search_result_count_utterance">
+ <item quantity="one" msgid="4484953260685964252">"រក​ឃើញ​ម៉ាស៊ីន​បោះពុម្ព <xliff:g id="COUNT">%1$s</xliff:g>"</item>
+ <item quantity="other" msgid="6533817036607128241">"រក​ឃើញ​ម៉ាស៊ីន​បោះពុម្ព <xliff:g id="COUNT">%1$s</xliff:g>"</item>
+ </plurals>
+ <string name="choose_print_service" msgid="3740309762324459694">"ជ្រើស​សáŸážœáž¶â€‹áž”ោះពុម្ព"</string>
+ <string name="print_searching_for_printers" msgid="6550424555079932867">"ស្វែងរក​ម៉ាស៊ីន​បោះពុម្ព"</string>
+ <string name="print_no_printers" msgid="4869403323900054866">"រក​មិន​ឃើញ​ម៉ាស៊ីន​បោះពុម្ព"</string>
+ <string name="printing_notification_title_template" msgid="295903957762447362">"កំពុង​​បោះពុម្ព <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="cancelling_notification_title_template" msgid="1821759594704703197">"ការ​បោះបង់ <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="failed_notification_title_template" msgid="2256217208186530973">"កំហុស​ម៉ាស៊ីន​បោះពុម្ព <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="blocked_notification_title_template" msgid="1175435827331588646">"ម៉ាស៊ីន​បោះពុម្ព​បាន​ទប់ស្កាážáŸ‹ <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <plurals name="composite_notification_title_template">
+ <item quantity="one" msgid="5866624638054847057">"ការងារ​បោះពុម្ព <xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g>"</item>
+ <item quantity="other" msgid="8746611264734222865">"ការងារ​បោះពុម្ព <xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g>"</item>
+ </plurals>
+ <string name="cancel" msgid="4373674107267141885">"បោះបង់"</string>
+ <string name="restart" msgid="2472034227037808749">"ចាប់ផ្ដើម​ឡើងវិញ"</string>
+ <string name="no_connection_to_printer" msgid="2159246915977282728">"គ្មាន​​​ការ​ភ្ជាប់​ទៅ​ម៉ាស៊ីន​បោះពុម្ព"</string>
+ <string name="reason_unknown" msgid="5507940196503246139">"មិន​ស្គាល់"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – មិន​អាច​ប្រើ​បាន"</string>
+ <string name="print_error_default_message" msgid="8568506918983980567">"មិន​អាច​បង្កើážâ€‹áž€áž¶ážšâ€‹áž„ារ​បោះពុម្ព"</string>
+ <string-array name="color_mode_labels">
+ <item msgid="7602948745415174937">"ស &amp; ážáŸ’មៅ"</item>
+ <item msgid="2762241247228983754">"ពណ៌"</item>
+ </string-array>
+ <string-array name="orientation_labels">
+ <item msgid="4061931020926489228">"បញ្ឈរ"</item>
+ <item msgid="3199660090246166812">"ផ្ដáŸáž€"</item>
+ </string-array>
+ <string-array name="page_options_labels">
+ <item msgid="7421377442011699994">"ទាំង​អស់"</item>
+ <item msgid="6812869625222503603">"ជួរ"</item>
+ </string-array>
+</resources>
diff --git a/packages/PrintSpooler/res/values-ko/strings.xml b/packages/PrintSpooler/res/values-ko/strings.xml
new file mode 100644
index 0000000..83155fd
--- /dev/null
+++ b/packages/PrintSpooler/res/values-ko/strings.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4469836075319831821">"ì¸ì‡„ 스풀러"</string>
+ <string name="advanced_settings_button" msgid="5764225091289415632">"프린터 설정"</string>
+ <string name="print_button" msgid="645164566271246268">"ì¸ì‡„"</string>
+ <string name="save_button" msgid="1921310454071758999">"저장"</string>
+ <string name="label_destination" msgid="9132510997381599275">"대ìƒ"</string>
+ <string name="label_copies" msgid="3634531042822968308">"매수"</string>
+ <string name="label_paper_size" msgid="8681895607876809323">"용지 í¬ê¸°"</string>
+ <string name="label_color" msgid="1108690305218188969">"색ìƒ"</string>
+ <string name="label_orientation" msgid="2853142581990496477">"ë°©í–¥"</string>
+ <string name="label_pages" msgid="6300874667546617333">"페ì´ì§€ 수(<xliff:g id="PAGE_COUNT">%1$s</xliff:g>)"</string>
+ <string name="pages_range_example" msgid="8558694453556945172">"예: 1-5, 8, 11-13"</string>
+ <string name="print_preview" msgid="8010217796057763343">"ì¸ì‡„ 미리보기"</string>
+ <string name="install_for_print_preview" msgid="6366303997385509332">"미리보기용 PDF 뷰어 설치"</string>
+ <string name="printing_app_crashed" msgid="854477616686566398">"ì¸ì‡„ ì•±ì— ì˜¤ë¥˜ ë°œìƒ"</string>
+ <string name="page_count_unknown" msgid="6058852665954511124">"페ì´ì§€"</string>
+ <string name="generating_print_job" msgid="3119608742651698916">"ì¸ì‡„ 작업 ìƒì„± 중"</string>
+ <string name="save_as_pdf" msgid="5718454119847596853">"PDF로 저장"</string>
+ <string name="all_printers" msgid="5018829726861876202">"모든 프린터…"</string>
+ <string name="print_dialog" msgid="32628687461331979">"ì¸ì‡„ 대화ìƒìž"</string>
+ <string name="search" msgid="5421724265322228497">"검색"</string>
+ <string name="all_printers_label" msgid="3178848870161526399">"모든 프린터"</string>
+ <string name="add_print_service_label" msgid="5356702546188981940">"서비스 추가"</string>
+ <string name="print_search_box_shown_utterance" msgid="7967404953901376090">"검색창 표시ë¨"</string>
+ <string name="print_search_box_hidden_utterance" msgid="5727755169343113351">"검색창 숨겨ì§"</string>
+ <string name="print_add_printer" msgid="1088656468360653455">"프린터 추가"</string>
+ <plurals name="print_search_result_count_utterance">
+ <item quantity="one" msgid="4484953260685964252">"프린터 <xliff:g id="COUNT">%1$s</xliff:g>대 검색ë¨"</item>
+ <item quantity="other" msgid="6533817036607128241">"프린터 <xliff:g id="COUNT">%1$s</xliff:g>대 검색ë¨"</item>
+ </plurals>
+ <string name="choose_print_service" msgid="3740309762324459694">"ì¸ì‡„ 서비스 ì„ íƒ"</string>
+ <string name="print_searching_for_printers" msgid="6550424555079932867">"프린터 검색 중"</string>
+ <string name="print_no_printers" msgid="4869403323900054866">"프린터 ì—†ìŒ"</string>
+ <string name="printing_notification_title_template" msgid="295903957762447362">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> ì¸ì‡„ 중"</string>
+ <string name="cancelling_notification_title_template" msgid="1821759594704703197">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> 취소 중"</string>
+ <string name="failed_notification_title_template" msgid="2256217208186530973">"프린터 오류: <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="blocked_notification_title_template" msgid="1175435827331588646">"ì°¨ë‹¨ëœ í”„ë¦°í„°: <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <plurals name="composite_notification_title_template">
+ <item quantity="one" msgid="5866624638054847057">"<xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g> ì¸ì‡„ 작업"</item>
+ <item quantity="other" msgid="8746611264734222865">"<xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g> ì¸ì‡„ 작업"</item>
+ </plurals>
+ <string name="cancel" msgid="4373674107267141885">"취소"</string>
+ <string name="restart" msgid="2472034227037808749">"다시 시작"</string>
+ <string name="no_connection_to_printer" msgid="2159246915977282728">"프린터와 ì—°ê²°ë˜ì§€ 않ìŒ"</string>
+ <string name="reason_unknown" msgid="5507940196503246139">"알 수 ì—†ìŒ"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – 사용할 수 ì—†ìŒ"</string>
+ <string name="print_error_default_message" msgid="8568506918983980567">"ì¸ì‡„ ìž‘ì—…ì„ ìƒì„±í•  수 없습니다."</string>
+ <string-array name="color_mode_labels">
+ <item msgid="7602948745415174937">"í‘ë°±"</item>
+ <item msgid="2762241247228983754">"컬러"</item>
+ </string-array>
+ <string-array name="orientation_labels">
+ <item msgid="4061931020926489228">"세로"</item>
+ <item msgid="3199660090246166812">"가로"</item>
+ </string-array>
+ <string-array name="page_options_labels">
+ <item msgid="7421377442011699994">"모ë‘"</item>
+ <item msgid="6812869625222503603">"범위"</item>
+ </string-array>
+</resources>
diff --git a/packages/PrintSpooler/res/values-lo-rLA/strings.xml b/packages/PrintSpooler/res/values-lo-rLA/strings.xml
new file mode 100644
index 0000000..45bb9bc
--- /dev/null
+++ b/packages/PrintSpooler/res/values-lo-rLA/strings.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4469836075319831821">"ຕົວຈັດຄິວàºàº²àº™àºžàº´àº¡"</string>
+ <string name="advanced_settings_button" msgid="5764225091289415632">"àºàº²àº™àº•ັ້ງຄ່າເຄື່ອງພິມ"</string>
+ <string name="print_button" msgid="645164566271246268">"ພິມ"</string>
+ <string name="save_button" msgid="1921310454071758999">"ບັນທຶàº"</string>
+ <string name="label_destination" msgid="9132510997381599275">"ປາàºàº—າງ"</string>
+ <string name="label_copies" msgid="3634531042822968308">"ສຳເນົາ"</string>
+ <string name="label_paper_size" msgid="8681895607876809323">"ຂະໜາດຂອງໜ້າເຈ້àº"</string>
+ <string name="label_color" msgid="1108690305218188969">"ສີ"</string>
+ <string name="label_orientation" msgid="2853142581990496477">"ລວງ"</string>
+ <string name="label_pages" msgid="6300874667546617333">"(<xliff:g id="PAGE_COUNT">%1$s</xliff:g>) ໜ້າ"</string>
+ <string name="pages_range_example" msgid="8558694453556945172">"ຕົວຢ່າງ: 1—5,8,11—13"</string>
+ <string name="print_preview" msgid="8010217796057763343">"ເບິ່ງàºà»ˆàº­àº™àºžàº´àº¡"</string>
+ <string name="install_for_print_preview" msgid="6366303997385509332">"ຕິດຕັ້ງໂປຼà»àºàº¼àº¡à»€àºšàº´à»ˆàº‡ PDF ເພື່ອເບິ່ງຕົວຢ່າງ"</string>
+ <string name="printing_app_crashed" msgid="854477616686566398">"à»àº­àº±àºšàº¯àºžàº´àº¡àº¥àº»à»‰àº¡à»€àº«àº¥àº§"</string>
+ <string name="page_count_unknown" msgid="6058852665954511124">"ໜ້າ"</string>
+ <string name="generating_print_job" msgid="3119608742651698916">"àºàº³àº¥àº±àº‡àºªà»‰àº²àº‡àº§àº½àºàºžàº´àº¡"</string>
+ <string name="save_as_pdf" msgid="5718454119847596853">"ບັນທຶàºà»€àº›àº±â€‹â€‹àº™ PDF"</string>
+ <string name="all_printers" msgid="5018829726861876202">"ທຸàºà»€àº„ື່ອງພິມ..."</string>
+ <string name="print_dialog" msgid="32628687461331979">"ໜ້າຕ່າງàºàº²àº™àºžàº´àº¡"</string>
+ <string name="search" msgid="5421724265322228497">"ຊອàºàº«àº²"</string>
+ <string name="all_printers_label" msgid="3178848870161526399">"ທຸàºà»€àº„ື່ອງພິມ"</string>
+ <string name="add_print_service_label" msgid="5356702546188981940">"ເພີ່ມບà»àº¥àº´àºàº²àº™"</string>
+ <string name="print_search_box_shown_utterance" msgid="7967404953901376090">"àºà»ˆàº­àº‡àºŠàº­àºàº«àº²àº–ືàºàºªàº°à»àº”ງ"</string>
+ <string name="print_search_box_hidden_utterance" msgid="5727755169343113351">"àºà»ˆàº­àº‡àºŠàº­àºàº«àº²àº–ືàºà»€àºŠàº·à»ˆàº­àº‡"</string>
+ <string name="print_add_printer" msgid="1088656468360653455">"ເພີ່ມເຄື່ອງພິມ"</string>
+ <plurals name="print_search_result_count_utterance">
+ <item quantity="one" msgid="4484953260685964252">"ພົບ <xliff:g id="COUNT">%1$s</xliff:g> ເຄື່ອງພິມ"</item>
+ <item quantity="other" msgid="6533817036607128241">"ພົບ <xliff:g id="COUNT">%1$s</xliff:g> ເຄື່ອງພິມ"</item>
+ </plurals>
+ <string name="choose_print_service" msgid="3740309762324459694">"ເລືອàºàºšà»àº¥àº´àºàº²àº™àºàº²àº™àºžàº´àº¡"</string>
+ <string name="print_searching_for_printers" msgid="6550424555079932867">"àºàº³àº¥àº±àº‡àºŠàº­àºàº«àº²à»€àº„ື່ອງພິມ"</string>
+ <string name="print_no_printers" msgid="4869403323900054866">"ບà»à»ˆàºžàº»àºšà»€àº„ື່ອງພິມ"</string>
+ <string name="printing_notification_title_template" msgid="295903957762447362">"àºàº³àº¥àº±àº‡àºžàº´àº¡ <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="cancelling_notification_title_template" msgid="1821759594704703197">"àºàº³àº¥àº±àº‡àºàº»àºà»€àº¥àºµàº <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="failed_notification_title_template" msgid="2256217208186530973">"ເຄື່ອງພິມເàºàºµàº”ຂà»à»‰àºœàº´àº”ພາດ <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="blocked_notification_title_template" msgid="1175435827331588646">"ເຄື່ອງພິມຖືàºàºšàº¥àº­àº <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <plurals name="composite_notification_title_template">
+ <item quantity="one" msgid="5866624638054847057">"ງານພິມ <xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g>"</item>
+ <item quantity="other" msgid="8746611264734222865">"ງານພິມ <xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g>"</item>
+ </plurals>
+ <string name="cancel" msgid="4373674107267141885">"àºàº»àºà»€àº¥àºµàº"</string>
+ <string name="restart" msgid="2472034227037808749">"ປິດເປີດໃà»à»ˆ"</string>
+ <string name="no_connection_to_printer" msgid="2159246915977282728">"ບà»à»ˆàº¡àºµàºàº²àº™à»€àºŠàº·à»ˆàº­àº¡àº•à»à»ˆàº«àº²à»€àº„ື່ອງພິມ"</string>
+ <string name="reason_unknown" msgid="5507940196503246139">"ບà»à»ˆàº®àº¹à»‰àºˆàº±àº"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> - ບà»à»ˆàº¡àºµàº¢àº¹à»ˆ"</string>
+ <string name="print_error_default_message" msgid="8568506918983980567">"ບà»à»ˆâ€‹àºªàº²â€‹àº¡àº²àº”​ສ້າງວຽàºàºžàº´àº¡à»„ດ້"</string>
+ <string-array name="color_mode_labels">
+ <item msgid="7602948745415174937">"ຂາວດຳ"</item>
+ <item msgid="2762241247228983754">"ສີ"</item>
+ </string-array>
+ <string-array name="orientation_labels">
+ <item msgid="4061931020926489228">"ລວງຕັ້ງ"</item>
+ <item msgid="3199660090246166812">"ລວງນອນ"</item>
+ </string-array>
+ <string-array name="page_options_labels">
+ <item msgid="7421377442011699994">"ທັງà»àº»àº”"</item>
+ <item msgid="6812869625222503603">"ໄລàºàº°"</item>
+ </string-array>
+</resources>
diff --git a/packages/PrintSpooler/res/values-lt/strings.xml b/packages/PrintSpooler/res/values-lt/strings.xml
new file mode 100644
index 0000000..1560dce
--- /dev/null
+++ b/packages/PrintSpooler/res/values-lt/strings.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4469836075319831821">"Print Spooler"</string>
+ <string name="advanced_settings_button" msgid="5764225091289415632">"Spausdintuvo nustatymai"</string>
+ <string name="print_button" msgid="645164566271246268">"Spausdinti"</string>
+ <string name="save_button" msgid="1921310454071758999">"Išsaugoti"</string>
+ <string name="label_destination" msgid="9132510997381599275">"Paskirties vieta"</string>
+ <string name="label_copies" msgid="3634531042822968308">"Kopijos"</string>
+ <string name="label_paper_size" msgid="8681895607876809323">"Popieriaus dydis"</string>
+ <string name="label_color" msgid="1108690305218188969">"Spalva"</string>
+ <string name="label_orientation" msgid="2853142581990496477">"Orientacija"</string>
+ <string name="label_pages" msgid="6300874667546617333">"Puslapiai (<xliff:g id="PAGE_COUNT">%1$s</xliff:g>)"</string>
+ <string name="pages_range_example" msgid="8558694453556945172">"pvz., 1–5, 8, 11–13"</string>
+ <string name="print_preview" msgid="8010217796057763343">"Spaudinio peržiūra"</string>
+ <string name="install_for_print_preview" msgid="6366303997385509332">"Įdiegti PDF peržiūros priemonę"</string>
+ <string name="printing_app_crashed" msgid="854477616686566398">"Spausdinimo programa užstrigo"</string>
+ <string name="page_count_unknown" msgid="6058852665954511124">"Puslapiai"</string>
+ <string name="generating_print_job" msgid="3119608742651698916">"Generuojama spausd. užduotis"</string>
+ <string name="save_as_pdf" msgid="5718454119847596853">"Išsaugoti kaip PDF"</string>
+ <string name="all_printers" msgid="5018829726861876202">"Visi spausdintuvai…"</string>
+ <string name="print_dialog" msgid="32628687461331979">"Spausdinimo dialogo langas"</string>
+ <string name="search" msgid="5421724265322228497">"Ieškoti"</string>
+ <string name="all_printers_label" msgid="3178848870161526399">"Visi spausdintuvai"</string>
+ <string name="add_print_service_label" msgid="5356702546188981940">"PridÄ—ti paslaugÄ…"</string>
+ <string name="print_search_box_shown_utterance" msgid="7967404953901376090">"Paieškos laukelis rodomas"</string>
+ <string name="print_search_box_hidden_utterance" msgid="5727755169343113351">"Paieškos laukelis paslėptas"</string>
+ <string name="print_add_printer" msgid="1088656468360653455">"PridÄ—ti spausdintuvÄ…"</string>
+ <plurals name="print_search_result_count_utterance">
+ <item quantity="one" msgid="4484953260685964252">"Rasta spausdintuvų: <xliff:g id="COUNT">%1$s</xliff:g>"</item>
+ <item quantity="other" msgid="6533817036607128241">"Rasta spausdintuvų: <xliff:g id="COUNT">%1$s</xliff:g>"</item>
+ </plurals>
+ <string name="choose_print_service" msgid="3740309762324459694">"Pasirinkite spausdinimo paslaugÄ…"</string>
+ <string name="print_searching_for_printers" msgid="6550424555079932867">"Ieškoma spausdintuvų"</string>
+ <string name="print_no_printers" msgid="4869403323900054866">"Nerasta spausdintuvų"</string>
+ <string name="printing_notification_title_template" msgid="295903957762447362">"Spausdinama: <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Atšaukiama: <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="failed_notification_title_template" msgid="2256217208186530973">"Spausdintuvo klaida: <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="blocked_notification_title_template" msgid="1175435827331588646">"Spausdintuvas užblokavo: <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <plurals name="composite_notification_title_template">
+ <item quantity="one" msgid="5866624638054847057">"Spausdinimo užduotis: <xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g>"</item>
+ <item quantity="other" msgid="8746611264734222865">"Spausdinimo užduotys: <xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g>"</item>
+ </plurals>
+ <string name="cancel" msgid="4373674107267141885">"Atšaukti"</string>
+ <string name="restart" msgid="2472034227037808749">"Paleisti iš naujo"</string>
+ <string name="no_connection_to_printer" msgid="2159246915977282728">"Nėra ryšio su spausdintuvu"</string>
+ <string name="reason_unknown" msgid="5507940196503246139">"nežinoma"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"„<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>“ – nepasiekiama"</string>
+ <string name="print_error_default_message" msgid="8568506918983980567">"Nepavyko sukurti spausdinimo užduoties"</string>
+ <string-array name="color_mode_labels">
+ <item msgid="7602948745415174937">"Nespalvotas"</item>
+ <item msgid="2762241247228983754">"Spalva"</item>
+ </string-array>
+ <string-array name="orientation_labels">
+ <item msgid="4061931020926489228">"StaÄias"</item>
+ <item msgid="3199660090246166812">"GulsÄias"</item>
+ </string-array>
+ <string-array name="page_options_labels">
+ <item msgid="7421377442011699994">"Visi"</item>
+ <item msgid="6812869625222503603">"Diapazonas"</item>
+ </string-array>
+</resources>
diff --git a/packages/PrintSpooler/res/values-lv/strings.xml b/packages/PrintSpooler/res/values-lv/strings.xml
new file mode 100644
index 0000000..3a6049c
--- /dev/null
+++ b/packages/PrintSpooler/res/values-lv/strings.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4469836075319831821">"Print Spooler"</string>
+ <string name="advanced_settings_button" msgid="5764225091289415632">"Printera iestatījumi"</string>
+ <string name="print_button" msgid="645164566271246268">"DrukÄt"</string>
+ <string name="save_button" msgid="1921310454071758999">"SaglabÄt"</string>
+ <string name="label_destination" msgid="9132510997381599275">"Galamērķis"</string>
+ <string name="label_copies" msgid="3634531042822968308">"EksemplÄri"</string>
+ <string name="label_paper_size" msgid="8681895607876809323">"Papīra izmērs"</string>
+ <string name="label_color" msgid="1108690305218188969">"KrÄsa"</string>
+ <string name="label_orientation" msgid="2853142581990496477">"Virziens"</string>
+ <string name="label_pages" msgid="6300874667546617333">"Lapas (<xliff:g id="PAGE_COUNT">%1$s</xliff:g>)"</string>
+ <string name="pages_range_example" msgid="8558694453556945172">"piem., 1–5,8,11–13"</string>
+ <string name="print_preview" msgid="8010217796057763343">"Drukas priekšskatījums"</string>
+ <string name="install_for_print_preview" msgid="6366303997385509332">"InstalÄ“t PDF skatÄ«tÄju priekÅ¡skatīšanai"</string>
+ <string name="printing_app_crashed" msgid="854477616686566398">"Drukas lietotne avarēja"</string>
+ <string name="page_count_unknown" msgid="6058852665954511124">"Lapas"</string>
+ <string name="generating_print_job" msgid="3119608742651698916">"Ģenerē drukas darbu…"</string>
+ <string name="save_as_pdf" msgid="5718454119847596853">"SaglabÄt kÄ PDF"</string>
+ <string name="all_printers" msgid="5018829726861876202">"Visi printeri…"</string>
+ <string name="print_dialog" msgid="32628687461331979">"DrukÄÅ¡anas dialoglodziņš"</string>
+ <string name="search" msgid="5421724265322228497">"Meklēt"</string>
+ <string name="all_printers_label" msgid="3178848870161526399">"Visi printeri"</string>
+ <string name="add_print_service_label" msgid="5356702546188981940">"Pievienot pakalpojumu"</string>
+ <string name="print_search_box_shown_utterance" msgid="7967404953901376090">"Meklēšanas lodziņš ir redzams."</string>
+ <string name="print_search_box_hidden_utterance" msgid="5727755169343113351">"Meklēšanas lodziņš ir paslēpts."</string>
+ <string name="print_add_printer" msgid="1088656468360653455">"Pievienot printeri"</string>
+ <plurals name="print_search_result_count_utterance">
+ <item quantity="one" msgid="4484953260685964252">"Atrasts <xliff:g id="COUNT">%1$s</xliff:g> printeris"</item>
+ <item quantity="other" msgid="6533817036607128241">"Atrasti <xliff:g id="COUNT">%1$s</xliff:g> printeri"</item>
+ </plurals>
+ <string name="choose_print_service" msgid="3740309762324459694">"IzvÄ“lieties drukÄÅ¡anas pakalpojumu"</string>
+ <string name="print_searching_for_printers" msgid="6550424555079932867">"Printeru meklēšana"</string>
+ <string name="print_no_printers" msgid="4869403323900054866">"Netika atrasts neviens printeris."</string>
+ <string name="printing_notification_title_template" msgid="295903957762447362">"Notiek darba <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> drukÄÅ¡ana…"</string>
+ <string name="cancelling_notification_title_template" msgid="1821759594704703197">"PÄrtrauc drukas darbu <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>…"</string>
+ <string name="failed_notification_title_template" msgid="2256217208186530973">"Printera kļūda ar darbu <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="blocked_notification_title_template" msgid="1175435827331588646">"Printeris bloķēja darbu <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <plurals name="composite_notification_title_template">
+ <item quantity="one" msgid="5866624638054847057">"Drukas darbs <xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g>"</item>
+ <item quantity="other" msgid="8746611264734222865">"Drukas darbi <xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g>"</item>
+ </plurals>
+ <string name="cancel" msgid="4373674107267141885">"Atcelt"</string>
+ <string name="restart" msgid="2472034227037808749">"Restartēt"</string>
+ <string name="no_connection_to_printer" msgid="2159246915977282728">"Nav savienojuma ar printeri"</string>
+ <string name="reason_unknown" msgid="5507940196503246139">"nezinÄms"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> — nav pieejams"</string>
+ <string name="print_error_default_message" msgid="8568506918983980567">"Nevarēja ģenerēt drukas darbu"</string>
+ <string-array name="color_mode_labels">
+ <item msgid="7602948745415174937">"Melnbalts"</item>
+ <item msgid="2762241247228983754">"KrÄsa"</item>
+ </string-array>
+ <string-array name="orientation_labels">
+ <item msgid="4061931020926489228">"Portrets"</item>
+ <item msgid="3199660090246166812">"Ainava"</item>
+ </string-array>
+ <string-array name="page_options_labels">
+ <item msgid="7421377442011699994">"Visi"</item>
+ <item msgid="6812869625222503603">"Diapazons"</item>
+ </string-array>
+</resources>
diff --git a/packages/PrintSpooler/res/values-mn-rMN/strings.xml b/packages/PrintSpooler/res/values-mn-rMN/strings.xml
new file mode 100644
index 0000000..8062eb1
--- /dev/null
+++ b/packages/PrintSpooler/res/values-mn-rMN/strings.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4469836075319831821">"Ð¥ÑвлÑгчийн буфер"</string>
+ <string name="advanced_settings_button" msgid="5764225091289415632">"Принтерийн тохиргоо"</string>
+ <string name="print_button" msgid="645164566271246268">"Ð¥ÑвлÑÑ…"</string>
+ <string name="save_button" msgid="1921310454071758999">"Хадгалах"</string>
+ <string name="label_destination" msgid="9132510997381599275">"ХүлÑÑн авагч"</string>
+ <string name="label_copies" msgid="3634531042822968308">"Хуулбарууд"</string>
+ <string name="label_paper_size" msgid="8681895607876809323">"ЦааÑны Ñ…ÑмжÑÑ"</string>
+ <string name="label_color" msgid="1108690305218188969">"Өнгө"</string>
+ <string name="label_orientation" msgid="2853142581990496477">"ЧиглÑл"</string>
+ <string name="label_pages" msgid="6300874667546617333">"(<xliff:g id="PAGE_COUNT">%1$s</xliff:g>) хуудаÑ"</string>
+ <string name="pages_range_example" msgid="8558694453556945172">"ж.нь. 1–5, 8, 11–13"</string>
+ <string name="print_preview" msgid="8010217796057763343">"Ð¥ÑвлÑÑ…ÑÑÑ€ урьдчилан харах"</string>
+ <string name="install_for_print_preview" msgid="6366303997385509332">"Урьдчилан харахын тулд PDF харагчийг Ñуулгах"</string>
+ <string name="printing_app_crashed" msgid="854477616686566398">"Ð¥ÑвлÑгч апп гацÑан"</string>
+ <string name="page_count_unknown" msgid="6058852665954511124">"ХуудаÑ"</string>
+ <string name="generating_print_job" msgid="3119608742651698916">"Ð¥ÑвлÑÑ… ажил Ò¯Ò¯ÑгÑж байна"</string>
+ <string name="save_as_pdf" msgid="5718454119847596853">"PDF болгож хадгалах"</string>
+ <string name="all_printers" msgid="5018829726861876202">"Бүх принтерүүд…"</string>
+ <string name="print_dialog" msgid="32628687461331979">"Ð¥ÑвлÑÑ… диалоги"</string>
+ <string name="search" msgid="5421724265322228497">"Хайх"</string>
+ <string name="all_printers_label" msgid="3178848870161526399">"Бүх принтерүүд"</string>
+ <string name="add_print_service_label" msgid="5356702546188981940">"ҮйлчилгÑÑ Ð½ÑмÑÑ…"</string>
+ <string name="print_search_box_shown_utterance" msgid="7967404953901376090">"Хайлтын нүдийг гаргах"</string>
+ <string name="print_search_box_hidden_utterance" msgid="5727755169343113351">"Хайлтын нүдийг далдлах"</string>
+ <string name="print_add_printer" msgid="1088656468360653455">"Принтер нÑмÑÑ…"</string>
+ <plurals name="print_search_result_count_utterance">
+ <item quantity="one" msgid="4484953260685964252">"<xliff:g id="COUNT">%1$s</xliff:g> принтер олдÑон"</item>
+ <item quantity="other" msgid="6533817036607128241">"<xliff:g id="COUNT">%1$s</xliff:g> принтер олдÑон"</item>
+ </plurals>
+ <string name="choose_print_service" msgid="3740309762324459694">"Ð¥ÑвлÑÑ… үйлчилгÑÑг Ñонгох"</string>
+ <string name="print_searching_for_printers" msgid="6550424555079932867">"Принтер хайж байна"</string>
+ <string name="print_no_printers" msgid="4869403323900054866">"Принтер олдÑонгүй"</string>
+ <string name="printing_notification_title_template" msgid="295903957762447362">"Ð¥ÑвлÑж байна <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Цуцлаж байна <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="failed_notification_title_template" msgid="2256217208186530973">"Принтерийн алдаа <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="blocked_notification_title_template" msgid="1175435827331588646">"Принтер хориглогдÑон <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <plurals name="composite_notification_title_template">
+ <item quantity="one" msgid="5866624638054847057">"<xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g> Ñ…ÑвлÑÑ… ажил"</item>
+ <item quantity="other" msgid="8746611264734222865">"<xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g> Ñ…ÑвлÑÑ… ажлууд"</item>
+ </plurals>
+ <string name="cancel" msgid="4373674107267141885">"Цуцлах"</string>
+ <string name="restart" msgid="2472034227037808749">"Дахин ÑхлүүлÑÑ…"</string>
+ <string name="no_connection_to_printer" msgid="2159246915977282728">"Принтер холбогдоогүй байна"</string>
+ <string name="reason_unknown" msgid="5507940196503246139">"тодорхойгүй"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – ашиглах боломжгүй"</string>
+ <string name="print_error_default_message" msgid="8568506918983980567">"Ð¥ÑвлÑÑ… ажлыг Ò¯Ò¯ÑгÑж чадÑангүй"</string>
+ <string-array name="color_mode_labels">
+ <item msgid="7602948745415174937">"Хар &amp; Цагаан"</item>
+ <item msgid="2762241247228983754">"Өнгө"</item>
+ </string-array>
+ <string-array name="orientation_labels">
+ <item msgid="4061931020926489228">"БоÑоо"</item>
+ <item msgid="3199660090246166812">"Ð¥ÑвтÑÑ"</item>
+ </string-array>
+ <string-array name="page_options_labels">
+ <item msgid="7421377442011699994">"Бүгд"</item>
+ <item msgid="6812869625222503603">"ХүрÑÑ"</item>
+ </string-array>
+</resources>
diff --git a/packages/PrintSpooler/res/values-ms-rMY/strings.xml b/packages/PrintSpooler/res/values-ms-rMY/strings.xml
new file mode 100644
index 0000000..d113749
--- /dev/null
+++ b/packages/PrintSpooler/res/values-ms-rMY/strings.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4469836075319831821">"Penspul Cetakan"</string>
+ <string name="advanced_settings_button" msgid="5764225091289415632">"Tetapan pencetak"</string>
+ <string name="print_button" msgid="645164566271246268">"Cetak"</string>
+ <string name="save_button" msgid="1921310454071758999">"Simpan"</string>
+ <string name="label_destination" msgid="9132510997381599275">"Destinasi"</string>
+ <string name="label_copies" msgid="3634531042822968308">"Salinan"</string>
+ <string name="label_paper_size" msgid="8681895607876809323">"Saiz Kertas"</string>
+ <string name="label_color" msgid="1108690305218188969">"Warna"</string>
+ <string name="label_orientation" msgid="2853142581990496477">"Orientasi"</string>
+ <string name="label_pages" msgid="6300874667546617333">"Halaman (<xliff:g id="PAGE_COUNT">%1$s</xliff:g>)"</string>
+ <string name="pages_range_example" msgid="8558694453556945172">"cth. 1—5,8,11—13"</string>
+ <string name="print_preview" msgid="8010217796057763343">"Pratonton cetak"</string>
+ <string name="install_for_print_preview" msgid="6366303997385509332">"Pasang pemapar PDF untuk pratonton"</string>
+ <string name="printing_app_crashed" msgid="854477616686566398">"Apl percetakan ranap"</string>
+ <string name="page_count_unknown" msgid="6058852665954511124">"Halaman"</string>
+ <string name="generating_print_job" msgid="3119608742651698916">"Menjana kerja cetak"</string>
+ <string name="save_as_pdf" msgid="5718454119847596853">"Simpan sebagai PDF"</string>
+ <string name="all_printers" msgid="5018829726861876202">"Semua pencetak..."</string>
+ <string name="print_dialog" msgid="32628687461331979">"Dialog cetakan"</string>
+ <string name="search" msgid="5421724265322228497">"Cari"</string>
+ <string name="all_printers_label" msgid="3178848870161526399">"Semua pencetak"</string>
+ <string name="add_print_service_label" msgid="5356702546188981940">"Tambahkan perkhidmatan"</string>
+ <string name="print_search_box_shown_utterance" msgid="7967404953901376090">"Kotak carian ditunjukkan"</string>
+ <string name="print_search_box_hidden_utterance" msgid="5727755169343113351">"Kotak carian tersembunyi"</string>
+ <string name="print_add_printer" msgid="1088656468360653455">"Tambah pencetak"</string>
+ <plurals name="print_search_result_count_utterance">
+ <item quantity="one" msgid="4484953260685964252">"<xliff:g id="COUNT">%1$s</xliff:g> pencetak ditemui"</item>
+ <item quantity="other" msgid="6533817036607128241">"<xliff:g id="COUNT">%1$s</xliff:g> pencetak ditemui"</item>
+ </plurals>
+ <string name="choose_print_service" msgid="3740309762324459694">"Pilih perkhidmatan cetak"</string>
+ <string name="print_searching_for_printers" msgid="6550424555079932867">"Mencari pencetak"</string>
+ <string name="print_no_printers" msgid="4869403323900054866">"Tiada pencetak ditemui"</string>
+ <string name="printing_notification_title_template" msgid="295903957762447362">"Mencetak <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Membatalkan <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="failed_notification_title_template" msgid="2256217208186530973">"Ralat pencetak <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="blocked_notification_title_template" msgid="1175435827331588646">"Pencetak disekat <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <plurals name="composite_notification_title_template">
+ <item quantity="one" msgid="5866624638054847057">"Kerja cetakan <xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g>"</item>
+ <item quantity="other" msgid="8746611264734222865">"Kerja cetakan <xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g>"</item>
+ </plurals>
+ <string name="cancel" msgid="4373674107267141885">"Batal"</string>
+ <string name="restart" msgid="2472034227037808749">"Mulakan semula"</string>
+ <string name="no_connection_to_printer" msgid="2159246915977282728">"Tiada sambungan ke pencetak"</string>
+ <string name="reason_unknown" msgid="5507940196503246139">"tidak diketahui"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – tidak tersedia"</string>
+ <string name="print_error_default_message" msgid="8568506918983980567">"Tidak dapat menjana kerja cetakan"</string>
+ <string-array name="color_mode_labels">
+ <item msgid="7602948745415174937">"Hitam &amp; Putih"</item>
+ <item msgid="2762241247228983754">"Warna"</item>
+ </string-array>
+ <string-array name="orientation_labels">
+ <item msgid="4061931020926489228">"Potret"</item>
+ <item msgid="3199660090246166812">"Landskap"</item>
+ </string-array>
+ <string-array name="page_options_labels">
+ <item msgid="7421377442011699994">"Semua"</item>
+ <item msgid="6812869625222503603">"Julat"</item>
+ </string-array>
+</resources>
diff --git a/packages/PrintSpooler/res/values-nb/strings.xml b/packages/PrintSpooler/res/values-nb/strings.xml
new file mode 100644
index 0000000..abed60d
--- /dev/null
+++ b/packages/PrintSpooler/res/values-nb/strings.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4469836075319831821">"Utskriftskø"</string>
+ <string name="advanced_settings_button" msgid="5764225091289415632">"Skriverinnstillinger"</string>
+ <string name="print_button" msgid="645164566271246268">"Skriv ut"</string>
+ <string name="save_button" msgid="1921310454071758999">"Lagre"</string>
+ <string name="label_destination" msgid="9132510997381599275">"Destinasjon"</string>
+ <string name="label_copies" msgid="3634531042822968308">"Kopier"</string>
+ <string name="label_paper_size" msgid="8681895607876809323">"Papirstørrelse"</string>
+ <string name="label_color" msgid="1108690305218188969">"Farge"</string>
+ <string name="label_orientation" msgid="2853142581990496477">"Retning"</string>
+ <string name="label_pages" msgid="6300874667546617333">"Sider (<xliff:g id="PAGE_COUNT">%1$s</xliff:g>)"</string>
+ <string name="pages_range_example" msgid="8558694453556945172">"f.eks. 1–5, 8,11–13"</string>
+ <string name="print_preview" msgid="8010217796057763343">"Utskriftsforhåndsvisning"</string>
+ <string name="install_for_print_preview" msgid="6366303997385509332">"Installer PDF-leser for forhåndsvisning"</string>
+ <string name="printing_app_crashed" msgid="854477616686566398">"Utskriftsappen krasjet"</string>
+ <string name="page_count_unknown" msgid="6058852665954511124">"Sider"</string>
+ <string name="generating_print_job" msgid="3119608742651698916">"Genererer utskriftsjobb"</string>
+ <string name="save_as_pdf" msgid="5718454119847596853">"Lagre som PDF"</string>
+ <string name="all_printers" msgid="5018829726861876202">"Alle skrivere"</string>
+ <string name="print_dialog" msgid="32628687461331979">"Skriv ut dialog"</string>
+ <string name="search" msgid="5421724265322228497">"Søk"</string>
+ <string name="all_printers_label" msgid="3178848870161526399">"Alle skrivere"</string>
+ <string name="add_print_service_label" msgid="5356702546188981940">"Legg til tjeneste"</string>
+ <string name="print_search_box_shown_utterance" msgid="7967404953901376090">"Søkefeltet vises"</string>
+ <string name="print_search_box_hidden_utterance" msgid="5727755169343113351">"Søkefeltet er skjult"</string>
+ <string name="print_add_printer" msgid="1088656468360653455">"Legg til skriver"</string>
+ <plurals name="print_search_result_count_utterance">
+ <item quantity="one" msgid="4484953260685964252">"<xliff:g id="COUNT">%1$s</xliff:g> skriver ble funnet"</item>
+ <item quantity="other" msgid="6533817036607128241">"<xliff:g id="COUNT">%1$s</xliff:g> skrivere ble funnet"</item>
+ </plurals>
+ <string name="choose_print_service" msgid="3740309762324459694">"Velg utskriftstjeneste"</string>
+ <string name="print_searching_for_printers" msgid="6550424555079932867">"Søker etter skrivere"</string>
+ <string name="print_no_printers" msgid="4869403323900054866">"Fant ingen skrivere"</string>
+ <string name="printing_notification_title_template" msgid="295903957762447362">"Skriver ut <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Avbryter <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="failed_notification_title_template" msgid="2256217208186530973">"Skriverfeil <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="blocked_notification_title_template" msgid="1175435827331588646">"Skriveren blokkerte <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <plurals name="composite_notification_title_template">
+ <item quantity="one" msgid="5866624638054847057">"Utskriftsjobb for <xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g>"</item>
+ <item quantity="other" msgid="8746611264734222865">"Utskriftsjobber for <xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g>"</item>
+ </plurals>
+ <string name="cancel" msgid="4373674107267141885">"Avbryt"</string>
+ <string name="restart" msgid="2472034227037808749">"Start på nytt"</string>
+ <string name="no_connection_to_printer" msgid="2159246915977282728">"Ingen forbindelse med skriveren"</string>
+ <string name="reason_unknown" msgid="5507940196503246139">"ukjent"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – utilgjengelig"</string>
+ <string name="print_error_default_message" msgid="8568506918983980567">"Kunne ikke generere utskriftsjobben"</string>
+ <string-array name="color_mode_labels">
+ <item msgid="7602948745415174937">"Svart og hvitt"</item>
+ <item msgid="2762241247228983754">"Farge"</item>
+ </string-array>
+ <string-array name="orientation_labels">
+ <item msgid="4061931020926489228">"Stående"</item>
+ <item msgid="3199660090246166812">"Liggende"</item>
+ </string-array>
+ <string-array name="page_options_labels">
+ <item msgid="7421377442011699994">"Alle"</item>
+ <item msgid="6812869625222503603">"Område"</item>
+ </string-array>
+</resources>
diff --git a/packages/PrintSpooler/res/values-nl/strings.xml b/packages/PrintSpooler/res/values-nl/strings.xml
new file mode 100644
index 0000000..3289d12
--- /dev/null
+++ b/packages/PrintSpooler/res/values-nl/strings.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4469836075319831821">"Afdrukspooler"</string>
+ <string name="advanced_settings_button" msgid="5764225091289415632">"Printerinstellingen"</string>
+ <string name="print_button" msgid="645164566271246268">"Afdrukken"</string>
+ <string name="save_button" msgid="1921310454071758999">"Opslaan"</string>
+ <string name="label_destination" msgid="9132510997381599275">"Bestemming"</string>
+ <string name="label_copies" msgid="3634531042822968308">"Aantal exemplaren"</string>
+ <string name="label_paper_size" msgid="8681895607876809323">"Papierformaat"</string>
+ <string name="label_color" msgid="1108690305218188969">"Kleur"</string>
+ <string name="label_orientation" msgid="2853142581990496477">"Stand"</string>
+ <string name="label_pages" msgid="6300874667546617333">"Pagina\'s (<xliff:g id="PAGE_COUNT">%1$s</xliff:g>)"</string>
+ <string name="pages_range_example" msgid="8558694453556945172">"bijv. 1—5,8,11—13"</string>
+ <string name="print_preview" msgid="8010217796057763343">"Afdrukvoorbeeld"</string>
+ <string name="install_for_print_preview" msgid="6366303997385509332">"Pdf-viewer installeren voor voorbeeld"</string>
+ <string name="printing_app_crashed" msgid="854477616686566398">"Afdruk-app gecrasht"</string>
+ <string name="page_count_unknown" msgid="6058852665954511124">"Pagina\'s"</string>
+ <string name="generating_print_job" msgid="3119608742651698916">"Afdruktaak genereren"</string>
+ <string name="save_as_pdf" msgid="5718454119847596853">"Opslaan als pdf"</string>
+ <string name="all_printers" msgid="5018829726861876202">"Alle printers…"</string>
+ <string name="print_dialog" msgid="32628687461331979">"Afdrukdialoogvenster"</string>
+ <string name="search" msgid="5421724265322228497">"Zoeken"</string>
+ <string name="all_printers_label" msgid="3178848870161526399">"Alle printers"</string>
+ <string name="add_print_service_label" msgid="5356702546188981940">"Service toevoegen"</string>
+ <string name="print_search_box_shown_utterance" msgid="7967404953901376090">"Zoekvak weergegeven"</string>
+ <string name="print_search_box_hidden_utterance" msgid="5727755169343113351">"Zoekvak verborgen"</string>
+ <string name="print_add_printer" msgid="1088656468360653455">"Printer toevoegen"</string>
+ <plurals name="print_search_result_count_utterance">
+ <item quantity="one" msgid="4484953260685964252">"<xliff:g id="COUNT">%1$s</xliff:g> printer gevonden"</item>
+ <item quantity="other" msgid="6533817036607128241">"<xliff:g id="COUNT">%1$s</xliff:g> printers gevonden"</item>
+ </plurals>
+ <string name="choose_print_service" msgid="3740309762324459694">"Afdrukservice kiezen"</string>
+ <string name="print_searching_for_printers" msgid="6550424555079932867">"Printers zoeken"</string>
+ <string name="print_no_printers" msgid="4869403323900054866">"Geen printers gevonden"</string>
+ <string name="printing_notification_title_template" msgid="295903957762447362">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> afdrukken"</string>
+ <string name="cancelling_notification_title_template" msgid="1821759594704703197">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> annuleren"</string>
+ <string name="failed_notification_title_template" msgid="2256217208186530973">"Printerfout <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="blocked_notification_title_template" msgid="1175435827331588646">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> geblokkeerd door printer"</string>
+ <plurals name="composite_notification_title_template">
+ <item quantity="one" msgid="5866624638054847057">"<xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g> afdruktaak"</item>
+ <item quantity="other" msgid="8746611264734222865">"<xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g> afdruktaken"</item>
+ </plurals>
+ <string name="cancel" msgid="4373674107267141885">"Annuleren"</string>
+ <string name="restart" msgid="2472034227037808749">"Opnieuw starten"</string>
+ <string name="no_connection_to_printer" msgid="2159246915977282728">"Geen verbinding met printer"</string>
+ <string name="reason_unknown" msgid="5507940196503246139">"onbekend"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – niet beschikbaar"</string>
+ <string name="print_error_default_message" msgid="8568506918983980567">"Kan de afdruktaak niet genereren"</string>
+ <string-array name="color_mode_labels">
+ <item msgid="7602948745415174937">"Zwart-wit"</item>
+ <item msgid="2762241247228983754">"Kleur"</item>
+ </string-array>
+ <string-array name="orientation_labels">
+ <item msgid="4061931020926489228">"Portret"</item>
+ <item msgid="3199660090246166812">"Landschap"</item>
+ </string-array>
+ <string-array name="page_options_labels">
+ <item msgid="7421377442011699994">"Alle"</item>
+ <item msgid="6812869625222503603">"Bereik"</item>
+ </string-array>
+</resources>
diff --git a/packages/PrintSpooler/res/values-pl/strings.xml b/packages/PrintSpooler/res/values-pl/strings.xml
new file mode 100644
index 0000000..10cb2e7
--- /dev/null
+++ b/packages/PrintSpooler/res/values-pl/strings.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4469836075319831821">"Bufor wydruku"</string>
+ <string name="advanced_settings_button" msgid="5764225091289415632">"Ustawienia drukarki"</string>
+ <string name="print_button" msgid="645164566271246268">"Drukuj"</string>
+ <string name="save_button" msgid="1921310454071758999">"Zapisz"</string>
+ <string name="label_destination" msgid="9132510997381599275">"Miejsce docelowe"</string>
+ <string name="label_copies" msgid="3634531042822968308">"Kopie"</string>
+ <string name="label_paper_size" msgid="8681895607876809323">"Rozmiar papieru"</string>
+ <string name="label_color" msgid="1108690305218188969">"Kolor"</string>
+ <string name="label_orientation" msgid="2853142581990496477">"Orientacja"</string>
+ <string name="label_pages" msgid="6300874667546617333">"Strony (<xliff:g id="PAGE_COUNT">%1$s</xliff:g>)"</string>
+ <string name="pages_range_example" msgid="8558694453556945172">"np. 1-5, 8, 11-13"</string>
+ <string name="print_preview" msgid="8010217796057763343">"PodglÄ…d wydruku"</string>
+ <string name="install_for_print_preview" msgid="6366303997385509332">"Zainstaluj przeglądarkę PDF, by zobaczyć podgląd"</string>
+ <string name="printing_app_crashed" msgid="854477616686566398">"Aplikacja drukująca uległa awarii"</string>
+ <string name="page_count_unknown" msgid="6058852665954511124">"Strony"</string>
+ <string name="generating_print_job" msgid="3119608742651698916">"Generowanie zadania wydruku"</string>
+ <string name="save_as_pdf" msgid="5718454119847596853">"Zapisz jako PDF"</string>
+ <string name="all_printers" msgid="5018829726861876202">"Wszystkie drukarki…"</string>
+ <string name="print_dialog" msgid="32628687461331979">"Okno drukowania"</string>
+ <string name="search" msgid="5421724265322228497">"Szukaj"</string>
+ <string name="all_printers_label" msgid="3178848870161526399">"Wszystkie drukarki"</string>
+ <string name="add_print_service_label" msgid="5356702546188981940">"Dodaj usługę"</string>
+ <string name="print_search_box_shown_utterance" msgid="7967404953901376090">"Pole wyszukiwania jest widoczne"</string>
+ <string name="print_search_box_hidden_utterance" msgid="5727755169343113351">"Pole wyszukiwania jest ukryte"</string>
+ <string name="print_add_printer" msgid="1088656468360653455">"Dodaj drukarkÄ™"</string>
+ <plurals name="print_search_result_count_utterance">
+ <item quantity="one" msgid="4484953260685964252">"Znaleziono <xliff:g id="COUNT">%1$s</xliff:g> drukarkÄ™"</item>
+ <item quantity="other" msgid="6533817036607128241">"Znalezione drukarki: <xliff:g id="COUNT">%1$s</xliff:g>"</item>
+ </plurals>
+ <string name="choose_print_service" msgid="3740309762324459694">"Wybierz usługę drukowania"</string>
+ <string name="print_searching_for_printers" msgid="6550424555079932867">"Szukanie drukarek"</string>
+ <string name="print_no_printers" msgid="4869403323900054866">"Nie znaleziono drukarek"</string>
+ <string name="printing_notification_title_template" msgid="295903957762447362">"Drukowanie: <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Anulowanie: <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="failed_notification_title_template" msgid="2256217208186530973">"Błąd drukarki: <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="blocked_notification_title_template" msgid="1175435827331588646">"Drukarka zablokowała <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <plurals name="composite_notification_title_template">
+ <item quantity="one" msgid="5866624638054847057">"<xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g> zadanie drukowania"</item>
+ <item quantity="other" msgid="8746611264734222865">"Zadania drukowania: <xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g>"</item>
+ </plurals>
+ <string name="cancel" msgid="4373674107267141885">"Anuluj"</string>
+ <string name="restart" msgid="2472034227037808749">"Od nowa"</string>
+ <string name="no_connection_to_printer" msgid="2159246915977282728">"Brak połączenia z drukarką"</string>
+ <string name="reason_unknown" msgid="5507940196503246139">"brak informacji"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – niedostępne"</string>
+ <string name="print_error_default_message" msgid="8568506918983980567">"Nie udało się wygenerować zadania drukowania"</string>
+ <string-array name="color_mode_labels">
+ <item msgid="7602948745415174937">"Czarno-białe"</item>
+ <item msgid="2762241247228983754">"Kolor"</item>
+ </string-array>
+ <string-array name="orientation_labels">
+ <item msgid="4061931020926489228">"Pionowa"</item>
+ <item msgid="3199660090246166812">"Pozioma"</item>
+ </string-array>
+ <string-array name="page_options_labels">
+ <item msgid="7421377442011699994">"Wszystkie"</item>
+ <item msgid="6812869625222503603">"Zakres"</item>
+ </string-array>
+</resources>
diff --git a/packages/PrintSpooler/res/values-pt-rPT/strings.xml b/packages/PrintSpooler/res/values-pt-rPT/strings.xml
new file mode 100644
index 0000000..630fe03
--- /dev/null
+++ b/packages/PrintSpooler/res/values-pt-rPT/strings.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4469836075319831821">"Print Spooler"</string>
+ <string name="advanced_settings_button" msgid="5764225091289415632">"Definições da impressora"</string>
+ <string name="print_button" msgid="645164566271246268">"Imprimir"</string>
+ <string name="save_button" msgid="1921310454071758999">"Guardar"</string>
+ <string name="label_destination" msgid="9132510997381599275">"Destino"</string>
+ <string name="label_copies" msgid="3634531042822968308">"Cópias"</string>
+ <string name="label_paper_size" msgid="8681895607876809323">"Tamanho do papel"</string>
+ <string name="label_color" msgid="1108690305218188969">"Cor"</string>
+ <string name="label_orientation" msgid="2853142581990496477">"Orientação"</string>
+ <string name="label_pages" msgid="6300874667546617333">"Páginas (<xliff:g id="PAGE_COUNT">%1$s</xliff:g>)"</string>
+ <string name="pages_range_example" msgid="8558694453556945172">"p. ex. 1-5, 8, 11-13"</string>
+ <string name="print_preview" msgid="8010217796057763343">"Pré-visualização de impressão"</string>
+ <string name="install_for_print_preview" msgid="6366303997385509332">"Instalar o leitor de PDF para pré-visualização"</string>
+ <string name="printing_app_crashed" msgid="854477616686566398">"A aplicação de impressão bloqueou"</string>
+ <string name="page_count_unknown" msgid="6058852665954511124">"Páginas"</string>
+ <string name="generating_print_job" msgid="3119608742651698916">"A gerar tarefa de impressão"</string>
+ <string name="save_as_pdf" msgid="5718454119847596853">"Guardar como PDF"</string>
+ <string name="all_printers" msgid="5018829726861876202">"Todas as impressoras..."</string>
+ <string name="print_dialog" msgid="32628687461331979">"Caixa de diálogo de impressão"</string>
+ <string name="search" msgid="5421724265322228497">"Pesquisar"</string>
+ <string name="all_printers_label" msgid="3178848870161526399">"Todas as impressoras"</string>
+ <string name="add_print_service_label" msgid="5356702546188981940">"Adicionar serviço"</string>
+ <string name="print_search_box_shown_utterance" msgid="7967404953901376090">"Caixa de pesquisa apresentada"</string>
+ <string name="print_search_box_hidden_utterance" msgid="5727755169343113351">"Caixa de pesquisa ocultada"</string>
+ <string name="print_add_printer" msgid="1088656468360653455">"Adicionar impressora"</string>
+ <plurals name="print_search_result_count_utterance">
+ <item quantity="one" msgid="4484953260685964252">"<xliff:g id="COUNT">%1$s</xliff:g> impressora encontrada"</item>
+ <item quantity="other" msgid="6533817036607128241">"<xliff:g id="COUNT">%1$s</xliff:g> impressoras encontradas"</item>
+ </plurals>
+ <string name="choose_print_service" msgid="3740309762324459694">"Escolher o serviço de impressão"</string>
+ <string name="print_searching_for_printers" msgid="6550424555079932867">"A procurar impressoras"</string>
+ <string name="print_no_printers" msgid="4869403323900054866">"Nenhuma impressora encontrada"</string>
+ <string name="printing_notification_title_template" msgid="295903957762447362">"A imprimir <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="cancelling_notification_title_template" msgid="1821759594704703197">"A cancelar <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="failed_notification_title_template" msgid="2256217208186530973">"Erro da impressora <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="blocked_notification_title_template" msgid="1175435827331588646">"A impressora bloqueou <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <plurals name="composite_notification_title_template">
+ <item quantity="one" msgid="5866624638054847057">"Tarefa de impressão: <xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g>"</item>
+ <item quantity="other" msgid="8746611264734222865">"Tarefas de impressão: <xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g>"</item>
+ </plurals>
+ <string name="cancel" msgid="4373674107267141885">"Cancelar"</string>
+ <string name="restart" msgid="2472034227037808749">"Reiniciar"</string>
+ <string name="no_connection_to_printer" msgid="2159246915977282728">"Sem ligação à impressora"</string>
+ <string name="reason_unknown" msgid="5507940196503246139">"desconhecido"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – indisponível"</string>
+ <string name="print_error_default_message" msgid="8568506918983980567">"Não foi possível gerar a tarefa de impressão"</string>
+ <string-array name="color_mode_labels">
+ <item msgid="7602948745415174937">"Preto e branco"</item>
+ <item msgid="2762241247228983754">"Cor"</item>
+ </string-array>
+ <string-array name="orientation_labels">
+ <item msgid="4061931020926489228">"Vertical"</item>
+ <item msgid="3199660090246166812">"Horizontal"</item>
+ </string-array>
+ <string-array name="page_options_labels">
+ <item msgid="7421377442011699994">"Todas"</item>
+ <item msgid="6812869625222503603">"Intervalo"</item>
+ </string-array>
+</resources>
diff --git a/packages/PrintSpooler/res/values-pt/strings.xml b/packages/PrintSpooler/res/values-pt/strings.xml
new file mode 100644
index 0000000..6e5eab1
--- /dev/null
+++ b/packages/PrintSpooler/res/values-pt/strings.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4469836075319831821">"Sp. de impressão"</string>
+ <string name="advanced_settings_button" msgid="5764225091289415632">"Configur. da impressora"</string>
+ <string name="print_button" msgid="645164566271246268">"Imprimir"</string>
+ <string name="save_button" msgid="1921310454071758999">"Salvar"</string>
+ <string name="label_destination" msgid="9132510997381599275">"Destino"</string>
+ <string name="label_copies" msgid="3634531042822968308">"Cópias"</string>
+ <string name="label_paper_size" msgid="8681895607876809323">"Tamanho do papel"</string>
+ <string name="label_color" msgid="1108690305218188969">"Cor"</string>
+ <string name="label_orientation" msgid="2853142581990496477">"Orientação"</string>
+ <string name="label_pages" msgid="6300874667546617333">"Páginas (<xliff:g id="PAGE_COUNT">%1$s</xliff:g>)"</string>
+ <string name="pages_range_example" msgid="8558694453556945172">"Ex.: 1–5, 8, 11–13"</string>
+ <string name="print_preview" msgid="8010217796057763343">"Visualização de impressão"</string>
+ <string name="install_for_print_preview" msgid="6366303997385509332">"Instalar o visualizador de PDF"</string>
+ <string name="printing_app_crashed" msgid="854477616686566398">"O aplicativo de impressão falhou"</string>
+ <string name="page_count_unknown" msgid="6058852665954511124">"Páginas"</string>
+ <string name="generating_print_job" msgid="3119608742651698916">"Gerando trabalho de impressão"</string>
+ <string name="save_as_pdf" msgid="5718454119847596853">"Salvar como PDF"</string>
+ <string name="all_printers" msgid="5018829726861876202">"Todas as impressoras…"</string>
+ <string name="print_dialog" msgid="32628687461331979">"Diálogo de impressão"</string>
+ <string name="search" msgid="5421724265322228497">"Pesquisar"</string>
+ <string name="all_printers_label" msgid="3178848870161526399">"Todas as impressoras"</string>
+ <string name="add_print_service_label" msgid="5356702546188981940">"Adicionar serviço"</string>
+ <string name="print_search_box_shown_utterance" msgid="7967404953901376090">"Caixa de pesquisa exibida"</string>
+ <string name="print_search_box_hidden_utterance" msgid="5727755169343113351">"Caixa de pesquisa oculta"</string>
+ <string name="print_add_printer" msgid="1088656468360653455">"Adicionar impressora"</string>
+ <plurals name="print_search_result_count_utterance">
+ <item quantity="one" msgid="4484953260685964252">"<xliff:g id="COUNT">%1$s</xliff:g> impressora encontrada"</item>
+ <item quantity="other" msgid="6533817036607128241">"<xliff:g id="COUNT">%1$s</xliff:g> impressoras encontradas"</item>
+ </plurals>
+ <string name="choose_print_service" msgid="3740309762324459694">"Selecione o serviço de impressão"</string>
+ <string name="print_searching_for_printers" msgid="6550424555079932867">"Procurando impressoras"</string>
+ <string name="print_no_printers" msgid="4869403323900054866">"Nenhuma impressora encontrada"</string>
+ <string name="printing_notification_title_template" msgid="295903957762447362">"Imprimindo <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Cancelando <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="failed_notification_title_template" msgid="2256217208186530973">"Erro ao imprimir <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="blocked_notification_title_template" msgid="1175435827331588646">"A impressora bloqueou <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <plurals name="composite_notification_title_template">
+ <item quantity="one" msgid="5866624638054847057">"Trabalho de impressão <xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g>"</item>
+ <item quantity="other" msgid="8746611264734222865">"Trabalhos de impressão <xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g>"</item>
+ </plurals>
+ <string name="cancel" msgid="4373674107267141885">"Cancelar"</string>
+ <string name="restart" msgid="2472034227037808749">"Reiniciar"</string>
+ <string name="no_connection_to_printer" msgid="2159246915977282728">"Sem conexão com a impressora"</string>
+ <string name="reason_unknown" msgid="5507940196503246139">"desconhecido"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – não disponível"</string>
+ <string name="print_error_default_message" msgid="8568506918983980567">"Não foi possível gerar o trabalho de impressão"</string>
+ <string-array name="color_mode_labels">
+ <item msgid="7602948745415174937">"Preto e branco"</item>
+ <item msgid="2762241247228983754">"Cor"</item>
+ </string-array>
+ <string-array name="orientation_labels">
+ <item msgid="4061931020926489228">"Retrato"</item>
+ <item msgid="3199660090246166812">"Paisagem"</item>
+ </string-array>
+ <string-array name="page_options_labels">
+ <item msgid="7421377442011699994">"Todas"</item>
+ <item msgid="6812869625222503603">"Intervalo"</item>
+ </string-array>
+</resources>
diff --git a/packages/PrintSpooler/res/values-ro/strings.xml b/packages/PrintSpooler/res/values-ro/strings.xml
new file mode 100644
index 0000000..c4d9f8e
--- /dev/null
+++ b/packages/PrintSpooler/res/values-ro/strings.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4469836075319831821">"Derulator print."</string>
+ <string name="advanced_settings_button" msgid="5764225091289415632">"Setările imprimantei"</string>
+ <string name="print_button" msgid="645164566271246268">"Printați"</string>
+ <string name="save_button" msgid="1921310454071758999">"Salvați"</string>
+ <string name="label_destination" msgid="9132510997381599275">"Destinație"</string>
+ <string name="label_copies" msgid="3634531042822968308">"Copii"</string>
+ <string name="label_paper_size" msgid="8681895607876809323">"Formatul hârtiei"</string>
+ <string name="label_color" msgid="1108690305218188969">"Color"</string>
+ <string name="label_orientation" msgid="2853142581990496477">"Orientare"</string>
+ <string name="label_pages" msgid="6300874667546617333">"Pagini (<xliff:g id="PAGE_COUNT">%1$s</xliff:g>)"</string>
+ <string name="pages_range_example" msgid="8558694453556945172">"de ex. 1-5, 8, 11-13"</string>
+ <string name="print_preview" msgid="8010217796057763343">"Previzualizați printarea"</string>
+ <string name="install_for_print_preview" msgid="6366303997385509332">"Instalați PDF viewer pentru previzualizare"</string>
+ <string name="printing_app_crashed" msgid="854477616686566398">"Aplicația de printare s-a blocat"</string>
+ <string name="page_count_unknown" msgid="6058852665954511124">"Pagini"</string>
+ <string name="generating_print_job" msgid="3119608742651698916">"Se generează sarcină printare"</string>
+ <string name="save_as_pdf" msgid="5718454119847596853">"Salvați ca PDF"</string>
+ <string name="all_printers" msgid="5018829726861876202">"Toate imprimantele..."</string>
+ <string name="print_dialog" msgid="32628687461331979">"Caseta de dialog de printare"</string>
+ <string name="search" msgid="5421724265322228497">"Căutați"</string>
+ <string name="all_printers_label" msgid="3178848870161526399">"Toate imprimantele"</string>
+ <string name="add_print_service_label" msgid="5356702546188981940">"Adăugați un serviciu"</string>
+ <string name="print_search_box_shown_utterance" msgid="7967404953901376090">"Caseta de căutare este afișată"</string>
+ <string name="print_search_box_hidden_utterance" msgid="5727755169343113351">"Caseta de căutare este ascunsă"</string>
+ <string name="print_add_printer" msgid="1088656468360653455">"Adăugați o imprimantă"</string>
+ <plurals name="print_search_result_count_utterance">
+ <item quantity="one" msgid="4484953260685964252">"<xliff:g id="COUNT">%1$s</xliff:g> imprimantă găsită"</item>
+ <item quantity="other" msgid="6533817036607128241">"<xliff:g id="COUNT">%1$s</xliff:g> (de) imprimante găsite"</item>
+ </plurals>
+ <string name="choose_print_service" msgid="3740309762324459694">"Alegeți serviciul de printare"</string>
+ <string name="print_searching_for_printers" msgid="6550424555079932867">"Se caută imprimante"</string>
+ <string name="print_no_printers" msgid="4869403323900054866">"Nu au fost găsite imprimante"</string>
+ <string name="printing_notification_title_template" msgid="295903957762447362">"Se printează <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Se anulează <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="failed_notification_title_template" msgid="2256217208186530973">"Eroare de printare: <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="blocked_notification_title_template" msgid="1175435827331588646">"Printare blocată: <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <plurals name="composite_notification_title_template">
+ <item quantity="one" msgid="5866624638054847057">"Sarcină de printare <xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g>"</item>
+ <item quantity="other" msgid="8746611264734222865">"Sarcini de printare <xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g>"</item>
+ </plurals>
+ <string name="cancel" msgid="4373674107267141885">"Anulați"</string>
+ <string name="restart" msgid="2472034227037808749">"Reporniți"</string>
+ <string name="no_connection_to_printer" msgid="2159246915977282728">"Nu există conexiune la o imprimantă"</string>
+ <string name="reason_unknown" msgid="5507940196503246139">"necunoscut"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> - indisponibil"</string>
+ <string name="print_error_default_message" msgid="8568506918983980567">"Nu s-a putut genera sarcina de printare"</string>
+ <string-array name="color_mode_labels">
+ <item msgid="7602948745415174937">"Alb-negru"</item>
+ <item msgid="2762241247228983754">"Color"</item>
+ </string-array>
+ <string-array name="orientation_labels">
+ <item msgid="4061931020926489228">"Portret"</item>
+ <item msgid="3199660090246166812">"Peisaj"</item>
+ </string-array>
+ <string-array name="page_options_labels">
+ <item msgid="7421377442011699994">"Toate"</item>
+ <item msgid="6812869625222503603">"Interval"</item>
+ </string-array>
+</resources>
diff --git a/packages/PrintSpooler/res/values-ru/strings.xml b/packages/PrintSpooler/res/values-ru/strings.xml
new file mode 100644
index 0000000..b1335a0
--- /dev/null
+++ b/packages/PrintSpooler/res/values-ru/strings.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4469836075319831821">"Спулер печати"</string>
+ <string name="advanced_settings_button" msgid="5764225091289415632">"ÐаÑтройки принтера"</string>
+ <string name="print_button" msgid="645164566271246268">"Печать"</string>
+ <string name="save_button" msgid="1921310454071758999">"Сохранить"</string>
+ <string name="label_destination" msgid="9132510997381599275">"Принтер"</string>
+ <string name="label_copies" msgid="3634531042822968308">"Копии"</string>
+ <string name="label_paper_size" msgid="8681895607876809323">"Размер бумаги"</string>
+ <string name="label_color" msgid="1108690305218188969">"Цветной"</string>
+ <string name="label_orientation" msgid="2853142581990496477">"ОриентациÑ"</string>
+ <string name="label_pages" msgid="6300874667546617333">"СТРÐÐИЦЫ (<xliff:g id="PAGE_COUNT">%1$s</xliff:g>)"</string>
+ <string name="pages_range_example" msgid="8558694453556945172">"напр., 1–5, 8, 11–13"</string>
+ <string name="print_preview" msgid="8010217796057763343">"Предварительный проÑмотр"</string>
+ <string name="install_for_print_preview" msgid="6366303997385509332">"УÑтановить ÑредÑтво проÑмотра PDF"</string>
+ <string name="printing_app_crashed" msgid="854477616686566398">"Сбой Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¿ÐµÑ‡Ð°Ñ‚Ð¸"</string>
+ <string name="page_count_unknown" msgid="6058852665954511124">"КоличеÑтво Ñтраниц"</string>
+ <string name="generating_print_job" msgid="3119608742651698916">"Создание Ð·Ð°Ð´Ð°Ð½Ð¸Ñ Ð¿ÐµÑ‡Ð°Ñ‚Ð¸â€¦"</string>
+ <string name="save_as_pdf" msgid="5718454119847596853">"Сохранить как PDF-файл"</string>
+ <string name="all_printers" msgid="5018829726861876202">"Ð’Ñе принтеры"</string>
+ <string name="print_dialog" msgid="32628687461331979">"Диалоговое окно печати"</string>
+ <string name="search" msgid="5421724265322228497">"ПоиÑк"</string>
+ <string name="all_printers_label" msgid="3178848870161526399">"Ð’Ñе принтеры"</string>
+ <string name="add_print_service_label" msgid="5356702546188981940">"Добавить Ñлужбу печати"</string>
+ <string name="print_search_box_shown_utterance" msgid="7967404953901376090">"Окно поиÑка показано"</string>
+ <string name="print_search_box_hidden_utterance" msgid="5727755169343113351">"Окно поиÑка Ñкрыто"</string>
+ <string name="print_add_printer" msgid="1088656468360653455">"Добавить принтер"</string>
+ <plurals name="print_search_result_count_utterance">
+ <item quantity="one" msgid="4484953260685964252">"Ðайден <xliff:g id="COUNT">%1$s</xliff:g> принтер"</item>
+ <item quantity="other" msgid="6533817036607128241">"Ðайдено принтеров: <xliff:g id="COUNT">%1$s</xliff:g>"</item>
+ </plurals>
+ <string name="choose_print_service" msgid="3740309762324459694">"Выберите Ñлужбу печати"</string>
+ <string name="print_searching_for_printers" msgid="6550424555079932867">"ПоиÑк принтеров…"</string>
+ <string name="print_no_printers" msgid="4869403323900054866">"Ðичего не найдено"</string>
+ <string name="printing_notification_title_template" msgid="295903957762447362">"Печать Ð·Ð°Ð´Ð°Ð½Ð¸Ñ \"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>\"…"</string>
+ <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Отмена Ð·Ð°Ð´Ð°Ð½Ð¸Ñ <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>…"</string>
+ <string name="failed_notification_title_template" msgid="2256217208186530973">"Ошибка Ð·Ð°Ð´Ð°Ð½Ð¸Ñ \"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>\""</string>
+ <string name="blocked_notification_title_template" msgid="1175435827331588646">"Задание \"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>\" заблокировано"</string>
+ <plurals name="composite_notification_title_template">
+ <item quantity="one" msgid="5866624638054847057">"Задание печати: <xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g>"</item>
+ <item quantity="other" msgid="8746611264734222865">"Ð—Ð°Ð´Ð°Ð½Ð¸Ñ Ð¿ÐµÑ‡Ð°Ñ‚Ð¸: <xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g>"</item>
+ </plurals>
+ <string name="cancel" msgid="4373674107267141885">"Отмена"</string>
+ <string name="restart" msgid="2472034227037808749">"Повторить"</string>
+ <string name="no_connection_to_printer" msgid="2159246915977282728">"Ðет ÑвÑзи Ñ Ð¿Ñ€Ð¸Ð½Ñ‚ÐµÑ€Ð¾Ð¼"</string>
+ <string name="reason_unknown" msgid="5507940196503246139">"неизвеÑтно"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – недоÑтупен"</string>
+ <string name="print_error_default_message" msgid="8568506918983980567">"Ðе удалоÑÑŒ отправить документ на печать."</string>
+ <string-array name="color_mode_labels">
+ <item msgid="7602948745415174937">"Черно-белое"</item>
+ <item msgid="2762241247228983754">"Цветное"</item>
+ </string-array>
+ <string-array name="orientation_labels">
+ <item msgid="4061931020926489228">"КнижнаÑ"</item>
+ <item msgid="3199660090246166812">"ÐльбомнаÑ"</item>
+ </string-array>
+ <string-array name="page_options_labels">
+ <item msgid="7421377442011699994">"Ð’Ñе"</item>
+ <item msgid="6812869625222503603">"Диапазон"</item>
+ </string-array>
+</resources>
diff --git a/packages/PrintSpooler/res/values-sk/strings.xml b/packages/PrintSpooler/res/values-sk/strings.xml
new file mode 100644
index 0000000..922a759
--- /dev/null
+++ b/packages/PrintSpooler/res/values-sk/strings.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4469836075319831821">"ZaraÄovaÄ tlaÄe"</string>
+ <string name="advanced_settings_button" msgid="5764225091289415632">"Nastavenia tlaÄiarne"</string>
+ <string name="print_button" msgid="645164566271246268">"TlaÄiÅ¥"</string>
+ <string name="save_button" msgid="1921310454071758999">"Uložiť"</string>
+ <string name="label_destination" msgid="9132510997381599275">"Cieľ"</string>
+ <string name="label_copies" msgid="3634531042822968308">"Kópie"</string>
+ <string name="label_paper_size" msgid="8681895607876809323">"Veľkosť papiera"</string>
+ <string name="label_color" msgid="1108690305218188969">"Farba"</string>
+ <string name="label_orientation" msgid="2853142581990496477">"Orientácia"</string>
+ <string name="label_pages" msgid="6300874667546617333">"STRÃNKY (<xliff:g id="PAGE_COUNT">%1$s</xliff:g>)"</string>
+ <string name="pages_range_example" msgid="8558694453556945172">"napr. 1–5, 8, 11–13"</string>
+ <string name="print_preview" msgid="8010217796057763343">"Ukážka pred tlaÄou"</string>
+ <string name="install_for_print_preview" msgid="6366303997385509332">"InÅ¡talovaÅ¥ zobrazovaÄ PDF na zobrazenie ukážky"</string>
+ <string name="printing_app_crashed" msgid="854477616686566398">"Aplikácia pre tlaÄ zlyhala"</string>
+ <string name="page_count_unknown" msgid="6058852665954511124">"Strany"</string>
+ <string name="generating_print_job" msgid="3119608742651698916">"Generuje sa tlaÄová úloha"</string>
+ <string name="save_as_pdf" msgid="5718454119847596853">"Uložiť ako PDF"</string>
+ <string name="all_printers" msgid="5018829726861876202">"VÅ¡etky tlaÄiarne..."</string>
+ <string name="print_dialog" msgid="32628687461331979">"Dialógové okno tlaÄe"</string>
+ <string name="search" msgid="5421724265322228497">"VYHĽADÃVANIE"</string>
+ <string name="all_printers_label" msgid="3178848870161526399">"VÅ¡etky tlaÄiarne"</string>
+ <string name="add_print_service_label" msgid="5356702546188981940">"Pridať službu"</string>
+ <string name="print_search_box_shown_utterance" msgid="7967404953901376090">"Vyhľadávacie pole sa zobrazuje"</string>
+ <string name="print_search_box_hidden_utterance" msgid="5727755169343113351">"Vyhľadávacie pole je skryté"</string>
+ <string name="print_add_printer" msgid="1088656468360653455">"PridaÅ¥ tlaÄiareň"</string>
+ <plurals name="print_search_result_count_utterance">
+ <item quantity="one" msgid="4484953260685964252">"NaÅ¡la sa <xliff:g id="COUNT">%1$s</xliff:g> tlaÄiareň"</item>
+ <item quantity="other" msgid="6533817036607128241">"PoÄet nájdených tlaÄiarní: <xliff:g id="COUNT">%1$s</xliff:g>"</item>
+ </plurals>
+ <string name="choose_print_service" msgid="3740309762324459694">"Výber tlaÄovej služby"</string>
+ <string name="print_searching_for_printers" msgid="6550424555079932867">"Vyhľadávanie tlaÄiarní"</string>
+ <string name="print_no_printers" msgid="4869403323900054866">"NenaÅ¡li sa žiadne tlaÄiarne"</string>
+ <string name="printing_notification_title_template" msgid="295903957762447362">"Prebieha tlaÄ Ãºlohy <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Prebieha zrušenie úlohy <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="failed_notification_title_template" msgid="2256217208186530973">"Chyba tlaÄiarne – úloha <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="blocked_notification_title_template" msgid="1175435827331588646">"TlaÄiareň zablok. úlohu <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <plurals name="composite_notification_title_template">
+ <item quantity="one" msgid="5866624638054847057">"PoÄet tlaÄových úloh: <xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g>"</item>
+ <item quantity="other" msgid="8746611264734222865">"PoÄet tlaÄových úloh: <xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g>"</item>
+ </plurals>
+ <string name="cancel" msgid="4373674107267141885">"Zrušiť"</string>
+ <string name="restart" msgid="2472034227037808749">"Spustiť znova"</string>
+ <string name="no_connection_to_printer" msgid="2159246915977282728">"Žiadne pripojenie k tlaÄiarni"</string>
+ <string name="reason_unknown" msgid="5507940196503246139">"neznáme"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – nie je k dispozícii"</string>
+ <string name="print_error_default_message" msgid="8568506918983980567">"TlaÄovú úlohu nie je možné vytvoriÅ¥"</string>
+ <string-array name="color_mode_labels">
+ <item msgid="7602948745415174937">"ÄŒiernobiele"</item>
+ <item msgid="2762241247228983754">"Farba"</item>
+ </string-array>
+ <string-array name="orientation_labels">
+ <item msgid="4061931020926489228">"Na výšku"</item>
+ <item msgid="3199660090246166812">"Na šírku"</item>
+ </string-array>
+ <string-array name="page_options_labels">
+ <item msgid="7421377442011699994">"Všetky"</item>
+ <item msgid="6812869625222503603">"Rozsah"</item>
+ </string-array>
+</resources>
diff --git a/packages/PrintSpooler/res/values-sl/strings.xml b/packages/PrintSpooler/res/values-sl/strings.xml
new file mode 100644
index 0000000..abd07c6
--- /dev/null
+++ b/packages/PrintSpooler/res/values-sl/strings.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4469836075319831821">"Tisk. v ozadju"</string>
+ <string name="advanced_settings_button" msgid="5764225091289415632">"Nastavitve tiskalnika"</string>
+ <string name="print_button" msgid="645164566271246268">"Natisni"</string>
+ <string name="save_button" msgid="1921310454071758999">"Shrani"</string>
+ <string name="label_destination" msgid="9132510997381599275">"Cilj"</string>
+ <string name="label_copies" msgid="3634531042822968308">"Å t. kopij"</string>
+ <string name="label_paper_size" msgid="8681895607876809323">"Velikost papirja"</string>
+ <string name="label_color" msgid="1108690305218188969">"Barvno"</string>
+ <string name="label_orientation" msgid="2853142581990496477">"Postavitev"</string>
+ <string name="label_pages" msgid="6300874667546617333">"Å t. strani (<xliff:g id="PAGE_COUNT">%1$s</xliff:g>)"</string>
+ <string name="pages_range_example" msgid="8558694453556945172">"npr. 1–5, 8, 11–13"</string>
+ <string name="print_preview" msgid="8010217796057763343">"Predogled tiskanja"</string>
+ <string name="install_for_print_preview" msgid="6366303997385509332">"Za predogled namestite pregledovalnik za PDF-je"</string>
+ <string name="printing_app_crashed" msgid="854477616686566398">"Aplikacija za tiskanje se je zrušila"</string>
+ <string name="page_count_unknown" msgid="6058852665954511124">"Å t. strani:"</string>
+ <string name="generating_print_job" msgid="3119608742651698916">"Ustvarjanje zahteve za tisk"</string>
+ <string name="save_as_pdf" msgid="5718454119847596853">"Shrani kot PDF"</string>
+ <string name="all_printers" msgid="5018829726861876202">"Vsi tiskalniki …"</string>
+ <string name="print_dialog" msgid="32628687461331979">"Pogovorno okno za tiskanje"</string>
+ <string name="search" msgid="5421724265322228497">"Iskanje"</string>
+ <string name="all_printers_label" msgid="3178848870161526399">"Vsi tiskalniki"</string>
+ <string name="add_print_service_label" msgid="5356702546188981940">"Dodaj storitev"</string>
+ <string name="print_search_box_shown_utterance" msgid="7967404953901376090">"Iskalno polje je prikazano"</string>
+ <string name="print_search_box_hidden_utterance" msgid="5727755169343113351">"Iskalno polje je skrito"</string>
+ <string name="print_add_printer" msgid="1088656468360653455">"Dodajanje tiskalnika"</string>
+ <plurals name="print_search_result_count_utterance">
+ <item quantity="one" msgid="4484953260685964252">"Najden <xliff:g id="COUNT">%1$s</xliff:g> tiskalnik"</item>
+ <item quantity="other" msgid="6533817036607128241">"Å tevilo najdenih tiskalnikov: <xliff:g id="COUNT">%1$s</xliff:g>"</item>
+ </plurals>
+ <string name="choose_print_service" msgid="3740309762324459694">"Izberite tiskalno storitev"</string>
+ <string name="print_searching_for_printers" msgid="6550424555079932867">"Iskanje tiskalnikov"</string>
+ <string name="print_no_printers" msgid="4869403323900054866">"Tiskalnikov ni mogoÄe najti"</string>
+ <string name="printing_notification_title_template" msgid="295903957762447362">"Tiskanje: <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Preklic: <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="failed_notification_title_template" msgid="2256217208186530973">"Napaka tiskalnika: <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="blocked_notification_title_template" msgid="1175435827331588646">"Tiskalnik je blokiral <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <plurals name="composite_notification_title_template">
+ <item quantity="one" msgid="5866624638054847057">"Tiskalno opravilo: <xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g>"</item>
+ <item quantity="other" msgid="8746611264734222865">"Tiskalna opravila: <xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g>"</item>
+ </plurals>
+ <string name="cancel" msgid="4373674107267141885">"PrekliÄi"</string>
+ <string name="restart" msgid="2472034227037808749">"ZaÄni znova"</string>
+ <string name="no_connection_to_printer" msgid="2159246915977282728">"Ni povezave s tiskalnikom"</string>
+ <string name="reason_unknown" msgid="5507940196503246139">"neznano"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – ni na voljo"</string>
+ <string name="print_error_default_message" msgid="8568506918983980567">"Tiskalnega opravila ni bilo mogoÄe ustvariti"</string>
+ <string-array name="color_mode_labels">
+ <item msgid="7602948745415174937">"ÄŒrno-belo"</item>
+ <item msgid="2762241247228983754">"Barvno"</item>
+ </string-array>
+ <string-array name="orientation_labels">
+ <item msgid="4061931020926489228">"NavpiÄno"</item>
+ <item msgid="3199660090246166812">"LežeÄe"</item>
+ </string-array>
+ <string-array name="page_options_labels">
+ <item msgid="7421377442011699994">"Vse"</item>
+ <item msgid="6812869625222503603">"Obseg"</item>
+ </string-array>
+</resources>
diff --git a/packages/PrintSpooler/res/values-sr/strings.xml b/packages/PrintSpooler/res/values-sr/strings.xml
new file mode 100644
index 0000000..24f4797
--- /dev/null
+++ b/packages/PrintSpooler/res/values-sr/strings.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4469836075319831821">"Штамп. из мемор."</string>
+ <string name="advanced_settings_button" msgid="5764225091289415632">"Подешавања штампача"</string>
+ <string name="print_button" msgid="645164566271246268">"Штампај"</string>
+ <string name="save_button" msgid="1921310454071758999">"Сачувај"</string>
+ <string name="label_destination" msgid="9132510997381599275">"Одредиште"</string>
+ <string name="label_copies" msgid="3634531042822968308">"Копије"</string>
+ <string name="label_paper_size" msgid="8681895607876809323">"Величина папира"</string>
+ <string name="label_color" msgid="1108690305218188969">"Боја"</string>
+ <string name="label_orientation" msgid="2853142581990496477">"Положај"</string>
+ <string name="label_pages" msgid="6300874667546617333">"Странице (<xliff:g id="PAGE_COUNT">%1$s</xliff:g>)"</string>
+ <string name="pages_range_example" msgid="8558694453556945172">"нпр. 1–5, 8, 11–13"</string>
+ <string name="print_preview" msgid="8010217796057763343">"Преглед пре штампања"</string>
+ <string name="install_for_print_preview" msgid="6366303997385509332">"ИнÑталирај PDF приказивач за преглед"</string>
+ <string name="printing_app_crashed" msgid="854477616686566398">"Ðпликација за штампање је отказала"</string>
+ <string name="page_count_unknown" msgid="6058852665954511124">"Странице"</string>
+ <string name="generating_print_job" msgid="3119608742651698916">"ГенериÑање задатка за штампање"</string>
+ <string name="save_as_pdf" msgid="5718454119847596853">"Сачувај као PDF"</string>
+ <string name="all_printers" msgid="5018829726861876202">"Сви штампачи…"</string>
+ <string name="print_dialog" msgid="32628687461331979">"Дијалог за штампање"</string>
+ <string name="search" msgid="5421724265322228497">"Претражи"</string>
+ <string name="all_printers_label" msgid="3178848870161526399">"Сви штампачи"</string>
+ <string name="add_print_service_label" msgid="5356702546188981940">"Додај уÑлугу"</string>
+ <string name="print_search_box_shown_utterance" msgid="7967404953901376090">"Оквир за претрагу је приказан"</string>
+ <string name="print_search_box_hidden_utterance" msgid="5727755169343113351">"Оквир за претрагу је Ñакривен"</string>
+ <string name="print_add_printer" msgid="1088656468360653455">"Додај штампач"</string>
+ <plurals name="print_search_result_count_utterance">
+ <item quantity="one" msgid="4484953260685964252">"Пронађен је <xliff:g id="COUNT">%1$s</xliff:g> штампач"</item>
+ <item quantity="other" msgid="6533817036607128241">"Пронађено је <xliff:g id="COUNT">%1$s</xliff:g> штампача"</item>
+ </plurals>
+ <string name="choose_print_service" msgid="3740309762324459694">"Изаберите уÑлугу штампања"</string>
+ <string name="print_searching_for_printers" msgid="6550424555079932867">"Претрага штампача"</string>
+ <string name="print_no_printers" msgid="4869403323900054866">"Ðије пронађен ниједан штампач"</string>
+ <string name="printing_notification_title_template" msgid="295903957762447362">"Штампа Ñе <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Отказује Ñе <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="failed_notification_title_template" msgid="2256217208186530973">"Грешка штампача <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="blocked_notification_title_template" msgid="1175435827331588646">"Штампач је блокирао <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <plurals name="composite_notification_title_template">
+ <item quantity="one" msgid="5866624638054847057">"Задатак штампања <xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g>"</item>
+ <item quantity="other" msgid="8746611264734222865">"Задаци штампања <xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g>"</item>
+ </plurals>
+ <string name="cancel" msgid="4373674107267141885">"Откажи"</string>
+ <string name="restart" msgid="2472034227037808749">"Поново покрени"</string>
+ <string name="no_connection_to_printer" msgid="2159246915977282728">"Ðема везе Ñа штампачем"</string>
+ <string name="reason_unknown" msgid="5507940196503246139">"непознато"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – недоÑтупан"</string>
+ <string name="print_error_default_message" msgid="8568506918983980567">"Ðије могуће генериÑати задатак за штампање"</string>
+ <string-array name="color_mode_labels">
+ <item msgid="7602948745415174937">"Црно-бело"</item>
+ <item msgid="2762241247228983754">"Боја"</item>
+ </string-array>
+ <string-array name="orientation_labels">
+ <item msgid="4061931020926489228">"УÑправно"</item>
+ <item msgid="3199660090246166812">"Водоравно"</item>
+ </string-array>
+ <string-array name="page_options_labels">
+ <item msgid="7421377442011699994">"Све"</item>
+ <item msgid="6812869625222503603">"ОпÑег"</item>
+ </string-array>
+</resources>
diff --git a/packages/PrintSpooler/res/values-sv/strings.xml b/packages/PrintSpooler/res/values-sv/strings.xml
new file mode 100644
index 0000000..2d80858
--- /dev/null
+++ b/packages/PrintSpooler/res/values-sv/strings.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4469836075319831821">"Utskriftskö"</string>
+ <string name="advanced_settings_button" msgid="5764225091289415632">"Skrivarinställningar"</string>
+ <string name="print_button" msgid="645164566271246268">"Skriv ut"</string>
+ <string name="save_button" msgid="1921310454071758999">"Spara"</string>
+ <string name="label_destination" msgid="9132510997381599275">"Destination"</string>
+ <string name="label_copies" msgid="3634531042822968308">"Kopior"</string>
+ <string name="label_paper_size" msgid="8681895607876809323">"Pappersstorlek"</string>
+ <string name="label_color" msgid="1108690305218188969">"Färg"</string>
+ <string name="label_orientation" msgid="2853142581990496477">"Orientering"</string>
+ <string name="label_pages" msgid="6300874667546617333">"Sidor (<xliff:g id="PAGE_COUNT">%1$s</xliff:g>)"</string>
+ <string name="pages_range_example" msgid="8558694453556945172">"t.ex. 1–5,8,11–13"</string>
+ <string name="print_preview" msgid="8010217796057763343">"Förhandsgranskning"</string>
+ <string name="install_for_print_preview" msgid="6366303997385509332">"Installera PDF-läsare för förhandsgranskning"</string>
+ <string name="printing_app_crashed" msgid="854477616686566398">"Utskriftsappen kraschade"</string>
+ <string name="page_count_unknown" msgid="6058852665954511124">"Sidor"</string>
+ <string name="generating_print_job" msgid="3119608742651698916">"Genererar utskriftsjobb"</string>
+ <string name="save_as_pdf" msgid="5718454119847596853">"Spara som PDF"</string>
+ <string name="all_printers" msgid="5018829726861876202">"Alla skrivare ..."</string>
+ <string name="print_dialog" msgid="32628687461331979">"Dialogrutan Skriv ut"</string>
+ <string name="search" msgid="5421724265322228497">"Sök"</string>
+ <string name="all_printers_label" msgid="3178848870161526399">"Alla skrivare"</string>
+ <string name="add_print_service_label" msgid="5356702546188981940">"Lägg till tjänst"</string>
+ <string name="print_search_box_shown_utterance" msgid="7967404953901376090">"Sökrutan visas"</string>
+ <string name="print_search_box_hidden_utterance" msgid="5727755169343113351">"Sökrutan är dold"</string>
+ <string name="print_add_printer" msgid="1088656468360653455">"Lägg till skrivare"</string>
+ <plurals name="print_search_result_count_utterance">
+ <item quantity="one" msgid="4484953260685964252">"<xliff:g id="COUNT">%1$s</xliff:g> skrivare hittades"</item>
+ <item quantity="other" msgid="6533817036607128241">"<xliff:g id="COUNT">%1$s</xliff:g> skrivare hittades"</item>
+ </plurals>
+ <string name="choose_print_service" msgid="3740309762324459694">"Välj utskriftstjänst"</string>
+ <string name="print_searching_for_printers" msgid="6550424555079932867">"Söker efter skrivare"</string>
+ <string name="print_no_printers" msgid="4869403323900054866">"Det gick inte att hitta några skrivare"</string>
+ <string name="printing_notification_title_template" msgid="295903957762447362">"Skriver ut <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Avbryter <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="failed_notification_title_template" msgid="2256217208186530973">"Skrivarfel för <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="blocked_notification_title_template" msgid="1175435827331588646">"Skrivaren har blockerat <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <plurals name="composite_notification_title_template">
+ <item quantity="one" msgid="5866624638054847057">"Utskriftsjobb – <xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g>"</item>
+ <item quantity="other" msgid="8746611264734222865">"Utskriftsjobb – <xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g>"</item>
+ </plurals>
+ <string name="cancel" msgid="4373674107267141885">"Avbryt"</string>
+ <string name="restart" msgid="2472034227037808749">"Starta om"</string>
+ <string name="no_connection_to_printer" msgid="2159246915977282728">"Ingen anslutning till skrivaren"</string>
+ <string name="reason_unknown" msgid="5507940196503246139">"okänt"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – inte tillgänglig"</string>
+ <string name="print_error_default_message" msgid="8568506918983980567">"Det gick inte att skapa utskriftsjobbet"</string>
+ <string-array name="color_mode_labels">
+ <item msgid="7602948745415174937">"Svartvit"</item>
+ <item msgid="2762241247228983754">"Färg"</item>
+ </string-array>
+ <string-array name="orientation_labels">
+ <item msgid="4061931020926489228">"Stående"</item>
+ <item msgid="3199660090246166812">"Liggande"</item>
+ </string-array>
+ <string-array name="page_options_labels">
+ <item msgid="7421377442011699994">"Alla"</item>
+ <item msgid="6812869625222503603">"Intervall"</item>
+ </string-array>
+</resources>
diff --git a/packages/PrintSpooler/res/values-sw/strings.xml b/packages/PrintSpooler/res/values-sw/strings.xml
new file mode 100644
index 0000000..3873d37
--- /dev/null
+++ b/packages/PrintSpooler/res/values-sw/strings.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4469836075319831821">"Programu ya kuandaa Printa kwa ajili ya Kuchapisha"</string>
+ <string name="advanced_settings_button" msgid="5764225091289415632">"Mipangilio ya printa"</string>
+ <string name="print_button" msgid="645164566271246268">"Chapisha"</string>
+ <string name="save_button" msgid="1921310454071758999">"Hifadhi"</string>
+ <string name="label_destination" msgid="9132510997381599275">"Itakapofika"</string>
+ <string name="label_copies" msgid="3634531042822968308">"Nakala"</string>
+ <string name="label_paper_size" msgid="8681895607876809323">"Ukubwa wa Karatasi"</string>
+ <string name="label_color" msgid="1108690305218188969">"Rangi"</string>
+ <string name="label_orientation" msgid="2853142581990496477">"Mkao"</string>
+ <string name="label_pages" msgid="6300874667546617333">"Kurasa (<xliff:g id="PAGE_COUNT">%1$s</xliff:g>)"</string>
+ <string name="pages_range_example" msgid="8558694453556945172">"k.m. 1–5, 8, 11–13"</string>
+ <string name="print_preview" msgid="8010217796057763343">"Chungulia kwanza kabla ya kuchapisha"</string>
+ <string name="install_for_print_preview" msgid="6366303997385509332">"Sakinisha kitazamaji cha PDF kwa onyesho la kuchungulia"</string>
+ <string name="printing_app_crashed" msgid="854477616686566398">"Programu ya kuchapisha imeacha kufanya kazi"</string>
+ <string name="page_count_unknown" msgid="6058852665954511124">"Kurasa"</string>
+ <string name="generating_print_job" msgid="3119608742651698916">"Inazanzisha kazi ya kuchapisha"</string>
+ <string name="save_as_pdf" msgid="5718454119847596853">"Hifadhi kama PDF"</string>
+ <string name="all_printers" msgid="5018829726861876202">"Printa zote..."</string>
+ <string name="print_dialog" msgid="32628687461331979">"Chapisha mazungumzo"</string>
+ <string name="search" msgid="5421724265322228497">"Tafuta"</string>
+ <string name="all_printers_label" msgid="3178848870161526399">"Printa zote"</string>
+ <string name="add_print_service_label" msgid="5356702546188981940">"Ongeza huduma"</string>
+ <string name="print_search_box_shown_utterance" msgid="7967404953901376090">"Kisanduku cha kutafutia kimeonyeshwa"</string>
+ <string name="print_search_box_hidden_utterance" msgid="5727755169343113351">"Kisanduku cha kutafutia kimefichwa"</string>
+ <string name="print_add_printer" msgid="1088656468360653455">"Ongeza printa"</string>
+ <plurals name="print_search_result_count_utterance">
+ <item quantity="one" msgid="4484953260685964252">"Printa <xliff:g id="COUNT">%1$s</xliff:g> imepatikana"</item>
+ <item quantity="other" msgid="6533817036607128241">"Printa <xliff:g id="COUNT">%1$s</xliff:g> zimepatikana"</item>
+ </plurals>
+ <string name="choose_print_service" msgid="3740309762324459694">"Chagua huduma ya printa"</string>
+ <string name="print_searching_for_printers" msgid="6550424555079932867">"Inatafuta printa"</string>
+ <string name="print_no_printers" msgid="4869403323900054866">"Hakuna printa zilizopatikana"</string>
+ <string name="printing_notification_title_template" msgid="295903957762447362">"Inachapisha <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Inaghairi <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="failed_notification_title_template" msgid="2256217208186530973">"Hitilafu ya kuchapisha <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="blocked_notification_title_template" msgid="1175435827331588646">"Printa imefungwa <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <plurals name="composite_notification_title_template">
+ <item quantity="one" msgid="5866624638054847057">"Kazi ya kuchapisha ya <xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g>"</item>
+ <item quantity="other" msgid="8746611264734222865">"Kazi za kuchapisha za <xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g>"</item>
+ </plurals>
+ <string name="cancel" msgid="4373674107267141885">"Ghairi"</string>
+ <string name="restart" msgid="2472034227037808749">"Anzisha upya"</string>
+ <string name="no_connection_to_printer" msgid="2159246915977282728">"Hakuna muunganisho kwa printa"</string>
+ <string name="reason_unknown" msgid="5507940196503246139">"haijulikani"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> - haipatikani"</string>
+ <string name="print_error_default_message" msgid="8568506918983980567">"Haikuweza kuunda kazi ya kuchapisha"</string>
+ <string-array name="color_mode_labels">
+ <item msgid="7602948745415174937">"Nyeusi na Nyeupe"</item>
+ <item msgid="2762241247228983754">"Rangi"</item>
+ </string-array>
+ <string-array name="orientation_labels">
+ <item msgid="4061931020926489228">"Wima"</item>
+ <item msgid="3199660090246166812">"Mlalo"</item>
+ </string-array>
+ <string-array name="page_options_labels">
+ <item msgid="7421377442011699994">"Zote"</item>
+ <item msgid="6812869625222503603">"Masafa"</item>
+ </string-array>
+</resources>
diff --git a/packages/PrintSpooler/res/values-th/strings.xml b/packages/PrintSpooler/res/values-th/strings.xml
new file mode 100644
index 0000000..7d6523e
--- /dev/null
+++ b/packages/PrintSpooler/res/values-th/strings.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4469836075319831821">"Print Spooler"</string>
+ <string name="advanced_settings_button" msgid="5764225091289415632">"à¸à¸²à¸£à¸•ั้งค่าเครื่องพิมพ์"</string>
+ <string name="print_button" msgid="645164566271246268">"พิมพ์"</string>
+ <string name="save_button" msgid="1921310454071758999">"บันทึà¸"</string>
+ <string name="label_destination" msgid="9132510997381599275">"ปลายทาง"</string>
+ <string name="label_copies" msgid="3634531042822968308">"สำเนา"</string>
+ <string name="label_paper_size" msgid="8681895607876809323">"ขนาดของà¸à¸£à¸°à¸”าษ"</string>
+ <string name="label_color" msgid="1108690305218188969">"สี"</string>
+ <string name="label_orientation" msgid="2853142581990496477">"à¸à¸²à¸£à¸§à¸²à¸‡à¹à¸™à¸§"</string>
+ <string name="label_pages" msgid="6300874667546617333">"หน้า (<xliff:g id="PAGE_COUNT">%1$s</xliff:g>)"</string>
+ <string name="pages_range_example" msgid="8558694453556945172">"เช่น 1—5,8,11—13"</string>
+ <string name="print_preview" msgid="8010217796057763343">"ตัวอย่างà¸à¹ˆà¸­à¸™à¸žà¸´à¸¡à¸žà¹Œ"</string>
+ <string name="install_for_print_preview" msgid="6366303997385509332">"ติดตั้งโปรà¹à¸à¸£à¸¡à¸”ู PDF เพื่อดูหน้าตัวอย่าง"</string>
+ <string name="printing_app_crashed" msgid="854477616686566398">"à¹à¸­à¸›à¸à¸²à¸£à¸žà¸´à¸¡à¸žà¹Œà¸‚ัดข้อง"</string>
+ <string name="page_count_unknown" msgid="6058852665954511124">"หน้า"</string>
+ <string name="generating_print_job" msgid="3119608742651698916">"à¸à¸³à¸¥à¸±à¸‡à¸ªà¸£à¹‰à¸²à¸‡à¸‡à¸²à¸™à¸žà¸´à¸¡à¸žà¹Œ"</string>
+ <string name="save_as_pdf" msgid="5718454119847596853">"บันทึà¸à¹€à¸›à¹‡à¸™ PDF"</string>
+ <string name="all_printers" msgid="5018829726861876202">"เครื่องพิมพ์ทั้งหมด…"</string>
+ <string name="print_dialog" msgid="32628687461331979">"ช่องโต้ตอบà¸à¸²à¸£à¸žà¸´à¸¡à¸žà¹Œ"</string>
+ <string name="search" msgid="5421724265322228497">"ค้นหา"</string>
+ <string name="all_printers_label" msgid="3178848870161526399">"เครื่องพิมพ์ทั้งหมด"</string>
+ <string name="add_print_service_label" msgid="5356702546188981940">"เพิ่มบริà¸à¸²à¸£"</string>
+ <string name="print_search_box_shown_utterance" msgid="7967404953901376090">"à¹à¸ªà¸”งช่องค้นหาอยู่"</string>
+ <string name="print_search_box_hidden_utterance" msgid="5727755169343113351">"ซ่อนช่องค้นหาอยู่"</string>
+ <string name="print_add_printer" msgid="1088656468360653455">"เพิ่มเครื่องพิมพ์"</string>
+ <plurals name="print_search_result_count_utterance">
+ <item quantity="one" msgid="4484953260685964252">"พบเครื่องพิมพ์ <xliff:g id="COUNT">%1$s</xliff:g> เครื่อง"</item>
+ <item quantity="other" msgid="6533817036607128241">"พบเครื่องพิมพ์ <xliff:g id="COUNT">%1$s</xliff:g> เครื่อง"</item>
+ </plurals>
+ <string name="choose_print_service" msgid="3740309762324459694">"เลือà¸à¸šà¸£à¸´à¸à¸²à¸£à¸žà¸´à¸¡à¸žà¹Œ"</string>
+ <string name="print_searching_for_printers" msgid="6550424555079932867">"à¸à¸³à¸¥à¸±à¸‡à¸„้นหาเครื่องพิมพ์"</string>
+ <string name="print_no_printers" msgid="4869403323900054866">"ไม่พบเครื่องพิมพ์"</string>
+ <string name="printing_notification_title_template" msgid="295903957762447362">"à¸à¸³à¸¥à¸±à¸‡à¸žà¸´à¸¡à¸žà¹Œ <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="cancelling_notification_title_template" msgid="1821759594704703197">"à¸à¸³à¸¥à¸±à¸‡à¸¢à¸à¹€à¸¥à¸´à¸ <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="failed_notification_title_template" msgid="2256217208186530973">"ข้อผิดพลาดเครื่องพิมพ์ <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="blocked_notification_title_template" msgid="1175435827331588646">"เครื่องพิมพ์ได้บล็อภ<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <plurals name="composite_notification_title_template">
+ <item quantity="one" msgid="5866624638054847057">"งานพิมพ์ <xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g>"</item>
+ <item quantity="other" msgid="8746611264734222865">"งานพิมพ์ <xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g>"</item>
+ </plurals>
+ <string name="cancel" msgid="4373674107267141885">"ยà¸à¹€à¸¥à¸´à¸"</string>
+ <string name="restart" msgid="2472034227037808749">"เริ่มต้นใหม่"</string>
+ <string name="no_connection_to_printer" msgid="2159246915977282728">"ไม่มีà¸à¸²à¸£à¹€à¸Šà¸·à¹ˆà¸­à¸¡à¸•่อไปยังเครื่องพิมพ์"</string>
+ <string name="reason_unknown" msgid="5507940196503246139">"ไม่ทราบ"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> ไม่พร้อมใช้งาน"</string>
+ <string name="print_error_default_message" msgid="8568506918983980567">"ไม่สามารถสร้างงานพิมพ์"</string>
+ <string-array name="color_mode_labels">
+ <item msgid="7602948745415174937">"ขาวดำ"</item>
+ <item msgid="2762241247228983754">"สี"</item>
+ </string-array>
+ <string-array name="orientation_labels">
+ <item msgid="4061931020926489228">"à¹à¸™à¸§à¸•ั้ง"</item>
+ <item msgid="3199660090246166812">"à¹à¸™à¸§à¸™à¸­à¸™"</item>
+ </string-array>
+ <string-array name="page_options_labels">
+ <item msgid="7421377442011699994">"ทั้งหมด"</item>
+ <item msgid="6812869625222503603">"ช่วง"</item>
+ </string-array>
+</resources>
diff --git a/packages/PrintSpooler/res/values-tl/strings.xml b/packages/PrintSpooler/res/values-tl/strings.xml
new file mode 100644
index 0000000..238c6bc
--- /dev/null
+++ b/packages/PrintSpooler/res/values-tl/strings.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4469836075319831821">"Print Spooler"</string>
+ <string name="advanced_settings_button" msgid="5764225091289415632">"Mga setting ng printer"</string>
+ <string name="print_button" msgid="645164566271246268">"I-print"</string>
+ <string name="save_button" msgid="1921310454071758999">"I-save"</string>
+ <string name="label_destination" msgid="9132510997381599275">"Patutunguhan"</string>
+ <string name="label_copies" msgid="3634531042822968308">"Mga Kopya"</string>
+ <string name="label_paper_size" msgid="8681895607876809323">"Laki ng Papel"</string>
+ <string name="label_color" msgid="1108690305218188969">"Kulay"</string>
+ <string name="label_orientation" msgid="2853142581990496477">"Oryentasyon"</string>
+ <string name="label_pages" msgid="6300874667546617333">"Mga Pahina (<xliff:g id="PAGE_COUNT">%1$s</xliff:g>)"</string>
+ <string name="pages_range_example" msgid="8558694453556945172">"hal. 1—5,8,11—13"</string>
+ <string name="print_preview" msgid="8010217796057763343">"Preview sa pag-print"</string>
+ <string name="install_for_print_preview" msgid="6366303997385509332">"Mag-install ng PDF viewer para sa pag-preview"</string>
+ <string name="printing_app_crashed" msgid="854477616686566398">"Nag-crash ang app sa pag-print"</string>
+ <string name="page_count_unknown" msgid="6058852665954511124">"Mga Pahina"</string>
+ <string name="generating_print_job" msgid="3119608742651698916">"Gumagawa ng pag-print"</string>
+ <string name="save_as_pdf" msgid="5718454119847596853">"I-save bilang PDF"</string>
+ <string name="all_printers" msgid="5018829726861876202">"Lahat ng printer…"</string>
+ <string name="print_dialog" msgid="32628687461331979">"Dialog ng pag-print"</string>
+ <string name="search" msgid="5421724265322228497">"Hanapin"</string>
+ <string name="all_printers_label" msgid="3178848870161526399">"Lahat ng printer"</string>
+ <string name="add_print_service_label" msgid="5356702546188981940">"Magdagdag ng serbisyo"</string>
+ <string name="print_search_box_shown_utterance" msgid="7967404953901376090">"Ipinapakita ang box para sa paghahanap"</string>
+ <string name="print_search_box_hidden_utterance" msgid="5727755169343113351">"Nakatago ang box para sa paghahanap"</string>
+ <string name="print_add_printer" msgid="1088656468360653455">"Magdagdag ng printer"</string>
+ <plurals name="print_search_result_count_utterance">
+ <item quantity="one" msgid="4484953260685964252">"<xliff:g id="COUNT">%1$s</xliff:g> printer ang nakita"</item>
+ <item quantity="other" msgid="6533817036607128241">"<xliff:g id="COUNT">%1$s</xliff:g> (na) printer ang nakita"</item>
+ </plurals>
+ <string name="choose_print_service" msgid="3740309762324459694">"Pumili ng serbisyo ng pag-print"</string>
+ <string name="print_searching_for_printers" msgid="6550424555079932867">"Naghahanap ng mga printer"</string>
+ <string name="print_no_printers" msgid="4869403323900054866">"Walang mga printer na nakita"</string>
+ <string name="printing_notification_title_template" msgid="295903957762447362">"Pini-print ang <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Kinakansela ang <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="failed_notification_title_template" msgid="2256217208186530973">"Error sa printer <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="blocked_notification_title_template" msgid="1175435827331588646">"Naka-block ang Printer <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <plurals name="composite_notification_title_template">
+ <item quantity="one" msgid="5866624638054847057">"Pag-print ng <xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g>"</item>
+ <item quantity="other" msgid="8746611264734222865">"Mga pag-print ng <xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g>"</item>
+ </plurals>
+ <string name="cancel" msgid="4373674107267141885">"Kanselahin"</string>
+ <string name="restart" msgid="2472034227037808749">"I-restart"</string>
+ <string name="no_connection_to_printer" msgid="2159246915977282728">"Hindi nakakonekta sa printer"</string>
+ <string name="reason_unknown" msgid="5507940196503246139">"hindi alam"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – hindi available"</string>
+ <string name="print_error_default_message" msgid="8568506918983980567">"Hindi mabuo ang pag-print"</string>
+ <string-array name="color_mode_labels">
+ <item msgid="7602948745415174937">"Black &amp; White"</item>
+ <item msgid="2762241247228983754">"Kulay"</item>
+ </string-array>
+ <string-array name="orientation_labels">
+ <item msgid="4061931020926489228">"Portrait"</item>
+ <item msgid="3199660090246166812">"Landscape"</item>
+ </string-array>
+ <string-array name="page_options_labels">
+ <item msgid="7421377442011699994">"Lahat"</item>
+ <item msgid="6812869625222503603">"Sakop"</item>
+ </string-array>
+</resources>
diff --git a/packages/PrintSpooler/res/values-tr/strings.xml b/packages/PrintSpooler/res/values-tr/strings.xml
new file mode 100644
index 0000000..f851f20
--- /dev/null
+++ b/packages/PrintSpooler/res/values-tr/strings.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4469836075319831821">"Print Spooler"</string>
+ <string name="advanced_settings_button" msgid="5764225091289415632">"Yazıcı ayarları"</string>
+ <string name="print_button" msgid="645164566271246268">"Yazdır"</string>
+ <string name="save_button" msgid="1921310454071758999">"Kaydet"</string>
+ <string name="label_destination" msgid="9132510997381599275">"Hedef"</string>
+ <string name="label_copies" msgid="3634531042822968308">"Kopya sayısı"</string>
+ <string name="label_paper_size" msgid="8681895607876809323">"Kağıt Boyutu"</string>
+ <string name="label_color" msgid="1108690305218188969">"Renkli"</string>
+ <string name="label_orientation" msgid="2853142581990496477">"Sayfa yönü"</string>
+ <string name="label_pages" msgid="6300874667546617333">"Sayfa (<xliff:g id="PAGE_COUNT">%1$s</xliff:g>)"</string>
+ <string name="pages_range_example" msgid="8558694453556945172">"ör. 1-5,8,11-13"</string>
+ <string name="print_preview" msgid="8010217796057763343">"Yazdırmayı önizle"</string>
+ <string name="install_for_print_preview" msgid="6366303997385509332">"Önizlemek için PDF görüntüleyici yükleyin"</string>
+ <string name="printing_app_crashed" msgid="854477616686566398">"Yazdırma uygulaması kilitlendi"</string>
+ <string name="page_count_unknown" msgid="6058852665954511124">"Sayfa"</string>
+ <string name="generating_print_job" msgid="3119608742651698916">"Yazdırma işi oluşturuluyor"</string>
+ <string name="save_as_pdf" msgid="5718454119847596853">"PDF olarak kaydet"</string>
+ <string name="all_printers" msgid="5018829726861876202">"Tüm yazıcılar…"</string>
+ <string name="print_dialog" msgid="32628687461331979">"Yazdırma iletişim kutusu"</string>
+ <string name="search" msgid="5421724265322228497">"Ara"</string>
+ <string name="all_printers_label" msgid="3178848870161526399">"Tüm yazıcılar"</string>
+ <string name="add_print_service_label" msgid="5356702546188981940">"Hizmet ekle"</string>
+ <string name="print_search_box_shown_utterance" msgid="7967404953901376090">"Arama kutusu gösteriliyor"</string>
+ <string name="print_search_box_hidden_utterance" msgid="5727755169343113351">"Arama kutusu gizli"</string>
+ <string name="print_add_printer" msgid="1088656468360653455">"Yazıcı ekle"</string>
+ <plurals name="print_search_result_count_utterance">
+ <item quantity="one" msgid="4484953260685964252">"<xliff:g id="COUNT">%1$s</xliff:g> yazıcı bulundu"</item>
+ <item quantity="other" msgid="6533817036607128241">"<xliff:g id="COUNT">%1$s</xliff:g> yazıcı bulundu"</item>
+ </plurals>
+ <string name="choose_print_service" msgid="3740309762324459694">"Yazdırma hizmetini seçin"</string>
+ <string name="print_searching_for_printers" msgid="6550424555079932867">"Yazıcılar aranıyor"</string>
+ <string name="print_no_printers" msgid="4869403323900054866">"Yazıcı bulunamadı"</string>
+ <string name="printing_notification_title_template" msgid="295903957762447362">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> yazdırılıyor"</string>
+ <string name="cancelling_notification_title_template" msgid="1821759594704703197">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> iptal ediliyor"</string>
+ <string name="failed_notification_title_template" msgid="2256217208186530973">"Yazıcı hatası: <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="blocked_notification_title_template" msgid="1175435827331588646">"Yazıcı <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> işini engelledi"</string>
+ <plurals name="composite_notification_title_template">
+ <item quantity="one" msgid="5866624638054847057">"<xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g> yazdırma işi"</item>
+ <item quantity="other" msgid="8746611264734222865">"<xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g> yazdırma işleri"</item>
+ </plurals>
+ <string name="cancel" msgid="4373674107267141885">"İptal"</string>
+ <string name="restart" msgid="2472034227037808749">"Yeniden baÅŸlat"</string>
+ <string name="no_connection_to_printer" msgid="2159246915977282728">"Yazıcı bağlantısı yok"</string>
+ <string name="reason_unknown" msgid="5507940196503246139">"bilinmiyor"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – kullanılamıyor"</string>
+ <string name="print_error_default_message" msgid="8568506918983980567">"Yazdırma işi oluşturulamadı"</string>
+ <string-array name="color_mode_labels">
+ <item msgid="7602948745415174937">"Siyah Beyaz"</item>
+ <item msgid="2762241247228983754">"Renkli"</item>
+ </string-array>
+ <string-array name="orientation_labels">
+ <item msgid="4061931020926489228">"Dikey"</item>
+ <item msgid="3199660090246166812">"Yatay"</item>
+ </string-array>
+ <string-array name="page_options_labels">
+ <item msgid="7421377442011699994">"Tümü"</item>
+ <item msgid="6812869625222503603">"Aralık"</item>
+ </string-array>
+</resources>
diff --git a/packages/PrintSpooler/res/values-uk/strings.xml b/packages/PrintSpooler/res/values-uk/strings.xml
new file mode 100644
index 0000000..8a340f1
--- /dev/null
+++ b/packages/PrintSpooler/res/values-uk/strings.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4469836075319831821">"Print Spooler"</string>
+ <string name="advanced_settings_button" msgid="5764225091289415632">"ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¸Ð½Ñ‚ÐµÑ€Ð°"</string>
+ <string name="print_button" msgid="645164566271246268">"Друк"</string>
+ <string name="save_button" msgid="1921310454071758999">"Зберегти"</string>
+ <string name="label_destination" msgid="9132510997381599275">"МіÑце признач-нÑ"</string>
+ <string name="label_copies" msgid="3634531042822968308">"Копії"</string>
+ <string name="label_paper_size" msgid="8681895607876809323">"Розмір паперу"</string>
+ <string name="label_color" msgid="1108690305218188969">"Колір"</string>
+ <string name="label_orientation" msgid="2853142581990496477">"ОрієнтаціÑ"</string>
+ <string name="label_pages" msgid="6300874667546617333">"Сторінки (<xliff:g id="PAGE_COUNT">%1$s</xliff:g>)"</string>
+ <string name="pages_range_example" msgid="8558694453556945172">"напр.,1–5, 8, 11–13"</string>
+ <string name="print_preview" msgid="8010217796057763343">"ВерÑÑ–Ñ Ð´Ð»Ñ Ð´Ñ€ÑƒÐºÑƒ"</string>
+ <string name="install_for_print_preview" msgid="6366303997385509332">"УÑтановити заÑіб переглÑду PDF"</string>
+ <string name="printing_app_crashed" msgid="854477616686566398">"Програма друку аварійно завершила роботу"</string>
+ <string name="page_count_unknown" msgid="6058852665954511124">"Сторінки"</string>
+ <string name="generating_print_job" msgid="3119608742651698916">"СтворюєтьÑÑ Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ð´Ñ€ÑƒÐºÑƒ"</string>
+ <string name="save_as_pdf" msgid="5718454119847596853">"Зберегти Ñк PDF"</string>
+ <string name="all_printers" msgid="5018829726861876202">"УÑÑ– принтери…"</string>
+ <string name="print_dialog" msgid="32628687461331979">"Діалогове вікно друку"</string>
+ <string name="search" msgid="5421724265322228497">"Пошук"</string>
+ <string name="all_printers_label" msgid="3178848870161526399">"УÑÑ– принтери"</string>
+ <string name="add_print_service_label" msgid="5356702546188981940">"Додати Ñлужбу"</string>
+ <string name="print_search_box_shown_utterance" msgid="7967404953901376090">"Вікно пошуку показано"</string>
+ <string name="print_search_box_hidden_utterance" msgid="5727755169343113351">"Вікно пошуку Ñховано"</string>
+ <string name="print_add_printer" msgid="1088656468360653455">"Додати принтер"</string>
+ <plurals name="print_search_result_count_utterance">
+ <item quantity="one" msgid="4484953260685964252">"Знайдено принтерів: <xliff:g id="COUNT">%1$s</xliff:g>"</item>
+ <item quantity="other" msgid="6533817036607128241">"Знайдено принтерів: <xliff:g id="COUNT">%1$s</xliff:g>"</item>
+ </plurals>
+ <string name="choose_print_service" msgid="3740309762324459694">"Вибрати Ñлужбу друку"</string>
+ <string name="print_searching_for_printers" msgid="6550424555079932867">"Пошук принтерів"</string>
+ <string name="print_no_printers" msgid="4869403323900054866">"Принтери не знайдено"</string>
+ <string name="printing_notification_title_template" msgid="295903957762447362">"Ð—Ð°Ð²Ð´Ð°Ð½Ð½Ñ \"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>\" друкуєтьÑÑ"</string>
+ <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Ð—Ð°Ð²Ð´Ð°Ð½Ð½Ñ \"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>\" ÑкаÑовуєтьÑÑ"</string>
+ <string name="failed_notification_title_template" msgid="2256217208186530973">"Помилка Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ \"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>\""</string>
+ <string name="blocked_notification_title_template" msgid="1175435827331588646">"Ð—Ð°Ð²Ð´Ð°Ð½Ð½Ñ \"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>\" заблоковано"</string>
+ <plurals name="composite_notification_title_template">
+ <item quantity="one" msgid="5866624638054847057">"Ð—Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ð´Ñ€ÑƒÐºÑƒ <xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g>"</item>
+ <item quantity="other" msgid="8746611264734222865">"Ð—Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ð´Ñ€ÑƒÐºÑƒ <xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g>"</item>
+ </plurals>
+ <string name="cancel" msgid="4373674107267141885">"СкаÑувати"</string>
+ <string name="restart" msgid="2472034227037808749">"ПерезапуÑтити"</string>
+ <string name="no_connection_to_printer" msgid="2159246915977282728">"Ðемає Ð·â€™Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð· принтером"</string>
+ <string name="reason_unknown" msgid="5507940196503246139">"невідомо"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"Ð—Ð°Ð²Ð´Ð°Ð½Ð½Ñ \"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>\" не доÑтупне"</string>
+ <string name="print_error_default_message" msgid="8568506918983980567">"Ðе вдалоÑÑ Ñтворити Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ð´Ñ€ÑƒÐºÑƒ"</string>
+ <string-array name="color_mode_labels">
+ <item msgid="7602948745415174937">"Чорно-білий"</item>
+ <item msgid="2762241247228983754">"Колір"</item>
+ </string-array>
+ <string-array name="orientation_labels">
+ <item msgid="4061931020926489228">"Книжкова"</item>
+ <item msgid="3199660090246166812">"Ðльбомна"</item>
+ </string-array>
+ <string-array name="page_options_labels">
+ <item msgid="7421377442011699994">"УÑÑ–"</item>
+ <item msgid="6812869625222503603">"Діапазон"</item>
+ </string-array>
+</resources>
diff --git a/packages/PrintSpooler/res/values-vi/strings.xml b/packages/PrintSpooler/res/values-vi/strings.xml
new file mode 100644
index 0000000..7d086ad
--- /dev/null
+++ b/packages/PrintSpooler/res/values-vi/strings.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4469836075319831821">"Print Spooler"</string>
+ <string name="advanced_settings_button" msgid="5764225091289415632">"Cài đặt máy in"</string>
+ <string name="print_button" msgid="645164566271246268">"In"</string>
+ <string name="save_button" msgid="1921310454071758999">"Lưu"</string>
+ <string name="label_destination" msgid="9132510997381599275">"Äích"</string>
+ <string name="label_copies" msgid="3634531042822968308">"Bản sao"</string>
+ <string name="label_paper_size" msgid="8681895607876809323">"Kích thước trang"</string>
+ <string name="label_color" msgid="1108690305218188969">"Màu"</string>
+ <string name="label_orientation" msgid="2853142581990496477">"Hướng"</string>
+ <string name="label_pages" msgid="6300874667546617333">"Trang (<xliff:g id="PAGE_COUNT">%1$s</xliff:g>)"</string>
+ <string name="pages_range_example" msgid="8558694453556945172">"Ví dụ: 1—5, 8, 11—13"</string>
+ <string name="print_preview" msgid="8010217796057763343">"Xem trước bản in"</string>
+ <string name="install_for_print_preview" msgid="6366303997385509332">"Cài đặt trình xem PDF để xem trước"</string>
+ <string name="printing_app_crashed" msgid="854477616686566398">"Ứng dụng in gặp lỗi"</string>
+ <string name="page_count_unknown" msgid="6058852665954511124">"Trang"</string>
+ <string name="generating_print_job" msgid="3119608742651698916">"Äang tạo lệnh in"</string>
+ <string name="save_as_pdf" msgid="5718454119847596853">"Lưu dưới dạng PDF"</string>
+ <string name="all_printers" msgid="5018829726861876202">"Tất cả máy in…"</string>
+ <string name="print_dialog" msgid="32628687461331979">"Hộp thoại in"</string>
+ <string name="search" msgid="5421724265322228497">"Tìm kiếm"</string>
+ <string name="all_printers_label" msgid="3178848870161526399">"Tất cả máy in"</string>
+ <string name="add_print_service_label" msgid="5356702546188981940">"Thêm dịch vụ"</string>
+ <string name="print_search_box_shown_utterance" msgid="7967404953901376090">"Hiển thị hộp tìm kiếm"</string>
+ <string name="print_search_box_hidden_utterance" msgid="5727755169343113351">"Ẩn hộp tìm kiếm"</string>
+ <string name="print_add_printer" msgid="1088656468360653455">"Thêm máy in"</string>
+ <plurals name="print_search_result_count_utterance">
+ <item quantity="one" msgid="4484953260685964252">"Äã tìm thấy <xliff:g id="COUNT">%1$s</xliff:g> máy in"</item>
+ <item quantity="other" msgid="6533817036607128241">"Äã tìm thấy <xliff:g id="COUNT">%1$s</xliff:g> máy in"</item>
+ </plurals>
+ <string name="choose_print_service" msgid="3740309762324459694">"Chá»n dịch vụ in"</string>
+ <string name="print_searching_for_printers" msgid="6550424555079932867">"Äang tìm kiếm máy in"</string>
+ <string name="print_no_printers" msgid="4869403323900054866">"Không tìm thấy máy in"</string>
+ <string name="printing_notification_title_template" msgid="295903957762447362">"In <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Há»§y <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="failed_notification_title_template" msgid="2256217208186530973">"Lỗi máy in <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="blocked_notification_title_template" msgid="1175435827331588646">"Máy in đã chặn <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <plurals name="composite_notification_title_template">
+ <item quantity="one" msgid="5866624638054847057">"Lệnh in <xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g>"</item>
+ <item quantity="other" msgid="8746611264734222865">"Lệnh in <xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g>"</item>
+ </plurals>
+ <string name="cancel" msgid="4373674107267141885">"Há»§y"</string>
+ <string name="restart" msgid="2472034227037808749">"Bắt đầu lại"</string>
+ <string name="no_connection_to_printer" msgid="2159246915977282728">"Không có kết nối nào với máy in"</string>
+ <string name="reason_unknown" msgid="5507940196503246139">"không xác định"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – không khả dụng"</string>
+ <string name="print_error_default_message" msgid="8568506918983980567">"Không thể tạo lệnh in"</string>
+ <string-array name="color_mode_labels">
+ <item msgid="7602948745415174937">"Äen trắng"</item>
+ <item msgid="2762241247228983754">"Màu"</item>
+ </string-array>
+ <string-array name="orientation_labels">
+ <item msgid="4061931020926489228">"Dá»c"</item>
+ <item msgid="3199660090246166812">"Ngang"</item>
+ </string-array>
+ <string-array name="page_options_labels">
+ <item msgid="7421377442011699994">"Tất cả"</item>
+ <item msgid="6812869625222503603">"Dãy"</item>
+ </string-array>
+</resources>
diff --git a/packages/PrintSpooler/res/values-zh-rCN/arrays.xml b/packages/PrintSpooler/res/values-zh-rCN/arrays.xml
deleted file mode 100644
index 4fc75db..0000000
--- a/packages/PrintSpooler/res/values-zh-rCN/arrays.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2013 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<resources>
-
- <string-array name="pdf_printer_media_sizes" translatable="false">
- <item>ROC_8K</item>
- <item>ROC_16K</item>
- <item>PRC_1</item>
- <item>PRC_2</item>
- <item>PRC_3</item>
- <item>PRC_4</item>
- <item>PRC_5</item>
- <item>PRC_6</item>
- <item>PRC_7</item>
- <item>PRC_8</item>
- <item>PRC_9</item>
- <item>PRC_10</item>
- <item>PRC_16K</item>
- <item>OM_PA_KAI</item>
- <item>OM_DAI_PA_KAI</item>
- <item>OM_JUURO_KU_KAI</item>
- </string-array>
-
-</resources>
diff --git a/packages/PrintSpooler/res/values-zh-rCN/strings.xml b/packages/PrintSpooler/res/values-zh-rCN/strings.xml
new file mode 100644
index 0000000..7e501f1
--- /dev/null
+++ b/packages/PrintSpooler/res/values-zh-rCN/strings.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4469836075319831821">"打å°å¤„ç†æœåŠ¡"</string>
+ <string name="advanced_settings_button" msgid="5764225091289415632">"æ‰“å°æœºè®¾ç½®"</string>
+ <string name="print_button" msgid="645164566271246268">"打å°"</string>
+ <string name="save_button" msgid="1921310454071758999">"ä¿å­˜"</string>
+ <string name="label_destination" msgid="9132510997381599275">"目的地"</string>
+ <string name="label_copies" msgid="3634531042822968308">"份数"</string>
+ <string name="label_paper_size" msgid="8681895607876809323">"纸张尺寸"</string>
+ <string name="label_color" msgid="1108690305218188969">"颜色"</string>
+ <string name="label_orientation" msgid="2853142581990496477">"æ–¹å‘"</string>
+ <string name="label_pages" msgid="6300874667546617333">"页数 (<xliff:g id="PAGE_COUNT">%1$s</xliff:g>)"</string>
+ <string name="pages_range_example" msgid="8558694453556945172">"例如:1-5ã€8ã€11-13"</string>
+ <string name="print_preview" msgid="8010217796057763343">"打å°é¢„览"</string>
+ <string name="install_for_print_preview" msgid="6366303997385509332">"安装 PDF 查看器以便预览"</string>
+ <string name="printing_app_crashed" msgid="854477616686566398">"打å°åº”用崩溃了"</string>
+ <string name="page_count_unknown" msgid="6058852665954511124">"页数"</string>
+ <string name="generating_print_job" msgid="3119608742651698916">"æ­£åœ¨ç”Ÿæˆæ‰“å°ä½œä¸š"</string>
+ <string name="save_as_pdf" msgid="5718454119847596853">"ä¿å­˜ä¸º PDF"</string>
+ <string name="all_printers" msgid="5018829726861876202">"æ‰€æœ‰æ‰“å°æœºâ€¦"</string>
+ <string name="print_dialog" msgid="32628687461331979">"打å°å¯¹è¯æ¡†"</string>
+ <string name="search" msgid="5421724265322228497">"æœç´¢"</string>
+ <string name="all_printers_label" msgid="3178848870161526399">"æ‰€æœ‰æ‰“å°æœº"</string>
+ <string name="add_print_service_label" msgid="5356702546188981940">"添加æœåŠ¡"</string>
+ <string name="print_search_box_shown_utterance" msgid="7967404953901376090">"æœç´¢æ¡†å·²æ˜¾ç¤º"</string>
+ <string name="print_search_box_hidden_utterance" msgid="5727755169343113351">"æœç´¢æ¡†å·²éšè—"</string>
+ <string name="print_add_printer" msgid="1088656468360653455">"æ·»åŠ æ‰“å°æœº"</string>
+ <plurals name="print_search_result_count_utterance">
+ <item quantity="one" msgid="4484953260685964252">"找到<xliff:g id="COUNT">%1$s</xliff:g>å°æ‰“å°æœº"</item>
+ <item quantity="other" msgid="6533817036607128241">"找到<xliff:g id="COUNT">%1$s</xliff:g>å°æ‰“å°æœº"</item>
+ </plurals>
+ <string name="choose_print_service" msgid="3740309762324459694">"é€‰æ‹©æ‰“å°æœåŠ¡"</string>
+ <string name="print_searching_for_printers" msgid="6550424555079932867">"正在æœç´¢æ‰“å°æœº"</string>
+ <string name="print_no_printers" msgid="4869403323900054866">"找ä¸åˆ°æ‰“å°æœº"</string>
+ <string name="printing_notification_title_template" msgid="295903957762447362">"正在打å°â€œ<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>â€"</string>
+ <string name="cancelling_notification_title_template" msgid="1821759594704703197">"æ­£åœ¨å–æ¶ˆæ‰“å°â€œ<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>â€"</string>
+ <string name="failed_notification_title_template" msgid="2256217208186530973">"æ‰“å°æœºåœ¨æ‰“å°â€œ<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>â€æ—¶å‡ºé”™"</string>
+ <string name="blocked_notification_title_template" msgid="1175435827331588646">"æ‰“å°æœºæ‹’ç»æ‰“å°â€œ<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>â€"</string>
+ <plurals name="composite_notification_title_template">
+ <item quantity="one" msgid="5866624638054847057">"“<xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g>â€æ‰“å°ä½œä¸š"</item>
+ <item quantity="other" msgid="8746611264734222865">"“<xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g>â€æ‰“å°ä½œä¸š"</item>
+ </plurals>
+ <string name="cancel" msgid="4373674107267141885">"å–æ¶ˆ"</string>
+ <string name="restart" msgid="2472034227037808749">"釿–°å¼€å§‹"</string>
+ <string name="no_connection_to_printer" msgid="2159246915977282728">"æœªä¸Žæ‰“å°æœºå»ºç«‹è¿žæŽ¥"</string>
+ <string name="reason_unknown" msgid="5507940196503246139">"未知"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> - 无法使用"</string>
+ <string name="print_error_default_message" msgid="8568506918983980567">"æ— æ³•ç”Ÿæˆæ‰“å°ä½œä¸š"</string>
+ <string-array name="color_mode_labels">
+ <item msgid="7602948745415174937">"黑白"</item>
+ <item msgid="2762241247228983754">"彩色"</item>
+ </string-array>
+ <string-array name="orientation_labels">
+ <item msgid="4061931020926489228">"纵å‘"</item>
+ <item msgid="3199660090246166812">"横å‘"</item>
+ </string-array>
+ <string-array name="page_options_labels">
+ <item msgid="7421377442011699994">"全部"</item>
+ <item msgid="6812869625222503603">"范围"</item>
+ </string-array>
+</resources>
diff --git a/packages/PrintSpooler/res/values-zh-rHK/strings.xml b/packages/PrintSpooler/res/values-zh-rHK/strings.xml
new file mode 100644
index 0000000..3856c75
--- /dev/null
+++ b/packages/PrintSpooler/res/values-zh-rHK/strings.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4469836075319831821">"列å°å¤šå·¥ç·©è¡è™•ç†å™¨"</string>
+ <string name="advanced_settings_button" msgid="5764225091289415632">"æ‰“å°æ©Ÿè¨­å®š"</string>
+ <string name="print_button" msgid="645164566271246268">"列å°"</string>
+ <string name="save_button" msgid="1921310454071758999">"儲存"</string>
+ <string name="label_destination" msgid="9132510997381599275">"目的地"</string>
+ <string name="label_copies" msgid="3634531042822968308">"份數"</string>
+ <string name="label_paper_size" msgid="8681895607876809323">"紙張大å°"</string>
+ <string name="label_color" msgid="1108690305218188969">"é¡è‰²"</string>
+ <string name="label_orientation" msgid="2853142581990496477">"æ–¹å‘"</string>
+ <string name="label_pages" msgid="6300874667546617333">"é æ•¸ (<xliff:g id="PAGE_COUNT">%1$s</xliff:g>)"</string>
+ <string name="pages_range_example" msgid="8558694453556945172">"例如:1-5,8,11-13"</string>
+ <string name="print_preview" msgid="8010217796057763343">"é è¦½åˆ—å°"</string>
+ <string name="install_for_print_preview" msgid="6366303997385509332">"安è£é è¦½æ‰€éœ€çš„ PDF 檢視器"</string>
+ <string name="printing_app_crashed" msgid="854477616686566398">"åˆ—å°æ‡‰ç”¨ç¨‹å¼ç•¶æ©Ÿäº†"</string>
+ <string name="page_count_unknown" msgid="6058852665954511124">"é æ•¸"</string>
+ <string name="generating_print_job" msgid="3119608742651698916">"正在產生列å°å·¥ä½œ"</string>
+ <string name="save_as_pdf" msgid="5718454119847596853">"儲存為 PDF"</string>
+ <string name="all_printers" msgid="5018829726861876202">"æ‰€æœ‰æ‰“å°æ©Ÿâ€¦"</string>
+ <string name="print_dialog" msgid="32628687461331979">"列å°å°è©±æ–¹å¡Š"</string>
+ <string name="search" msgid="5421724265322228497">"æœå°‹"</string>
+ <string name="all_printers_label" msgid="3178848870161526399">"æ‰€æœ‰æ‰“å°æ©Ÿ"</string>
+ <string name="add_print_service_label" msgid="5356702546188981940">"新增æœå‹™"</string>
+ <string name="print_search_box_shown_utterance" msgid="7967404953901376090">"æœå°‹æ¡†å·²é¡¯ç¤º"</string>
+ <string name="print_search_box_hidden_utterance" msgid="5727755169343113351">"æœå°‹æ¡†å·²éš±è—"</string>
+ <string name="print_add_printer" msgid="1088656468360653455">"æ–°å¢žæ‰“å°æ©Ÿ"</string>
+ <plurals name="print_search_result_count_utterance">
+ <item quantity="one" msgid="4484953260685964252">"找到 <xliff:g id="COUNT">%1$s</xliff:g> éƒ¨æ‰“å°æ©Ÿ"</item>
+ <item quantity="other" msgid="6533817036607128241">"找到 <xliff:g id="COUNT">%1$s</xliff:g> éƒ¨æ‰“å°æ©Ÿ"</item>
+ </plurals>
+ <string name="choose_print_service" msgid="3740309762324459694">"鏿“‡åˆ—å°æœå‹™"</string>
+ <string name="print_searching_for_printers" msgid="6550424555079932867">"正在æœå°‹æ‰“å°æ©Ÿ"</string>
+ <string name="print_no_printers" msgid="4869403323900054866">"找ä¸åˆ°æ‰“å°æ©Ÿ"</string>
+ <string name="printing_notification_title_template" msgid="295903957762447362">"æ­£åœ¨åˆ—å° <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="cancelling_notification_title_template" msgid="1821759594704703197">"æ­£åœ¨å–æ¶ˆ <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="failed_notification_title_template" msgid="2256217208186530973">"æ‰“å°æ©ŸéŒ¯èª¤ï¼š<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="blocked_notification_title_template" msgid="1175435827331588646">"æ‰“å°æ©Ÿå·²å°éŽ– <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <plurals name="composite_notification_title_template">
+ <item quantity="one" msgid="5866624638054847057">"一項 <xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g> 列å°å·¥ä½œ"</item>
+ <item quantity="other" msgid="8746611264734222865">"多項 <xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g> 列å°å·¥ä½œ"</item>
+ </plurals>
+ <string name="cancel" msgid="4373674107267141885">"å–æ¶ˆ"</string>
+ <string name="restart" msgid="2472034227037808749">"釿–°é–‹å§‹"</string>
+ <string name="no_connection_to_printer" msgid="2159246915977282728">"å°šæœªèˆ‡æ‰“å°æ©Ÿé€£ç·š"</string>
+ <string name="reason_unknown" msgid="5507940196503246139">"䏿˜Ž"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – 無法使用"</string>
+ <string name="print_error_default_message" msgid="8568506918983980567">"無法產生列å°å·¥ä½œ"</string>
+ <string-array name="color_mode_labels">
+ <item msgid="7602948745415174937">"黑白"</item>
+ <item msgid="2762241247228983754">"彩色"</item>
+ </string-array>
+ <string-array name="orientation_labels">
+ <item msgid="4061931020926489228">"ç›´å‘"</item>
+ <item msgid="3199660090246166812">"æ©«å‘"</item>
+ </string-array>
+ <string-array name="page_options_labels">
+ <item msgid="7421377442011699994">"全部"</item>
+ <item msgid="6812869625222503603">"範åœ"</item>
+ </string-array>
+</resources>
diff --git a/packages/PrintSpooler/res/values-zh-rTW/strings.xml b/packages/PrintSpooler/res/values-zh-rTW/strings.xml
new file mode 100644
index 0000000..81e0627
--- /dev/null
+++ b/packages/PrintSpooler/res/values-zh-rTW/strings.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4469836075319831821">"列å°å¤šå·¥ç·©è¡è™•ç†å™¨"</string>
+ <string name="advanced_settings_button" msgid="5764225091289415632">"å°è¡¨æ©Ÿè¨­å®š"</string>
+ <string name="print_button" msgid="645164566271246268">"列å°"</string>
+ <string name="save_button" msgid="1921310454071758999">"儲存"</string>
+ <string name="label_destination" msgid="9132510997381599275">"目的地"</string>
+ <string name="label_copies" msgid="3634531042822968308">"份數"</string>
+ <string name="label_paper_size" msgid="8681895607876809323">"紙張大å°"</string>
+ <string name="label_color" msgid="1108690305218188969">"色彩"</string>
+ <string name="label_orientation" msgid="2853142581990496477">"æ–¹å‘"</string>
+ <string name="label_pages" msgid="6300874667546617333">"é æ•¸ (<xliff:g id="PAGE_COUNT">%1$s</xliff:g>)"</string>
+ <string name="pages_range_example" msgid="8558694453556945172">"例如:1—5,8,11—13"</string>
+ <string name="print_preview" msgid="8010217796057763343">"列å°é è¦½"</string>
+ <string name="install_for_print_preview" msgid="6366303997385509332">"安è£é è¦½æ‰€éœ€çš„ PDF 檢視器"</string>
+ <string name="printing_app_crashed" msgid="854477616686566398">"åˆ—å°æ‡‰ç”¨ç¨‹å¼ç•¶æ©Ÿäº†"</string>
+ <string name="page_count_unknown" msgid="6058852665954511124">"é æ•¸"</string>
+ <string name="generating_print_job" msgid="3119608742651698916">"正在產生列å°å·¥ä½œ"</string>
+ <string name="save_as_pdf" msgid="5718454119847596853">"儲存為 PDF"</string>
+ <string name="all_printers" msgid="5018829726861876202">"所有å°è¡¨æ©Ÿâ€¦"</string>
+ <string name="print_dialog" msgid="32628687461331979">"å°è¡¨æ©Ÿå°è©±æ–¹å¡Š"</string>
+ <string name="search" msgid="5421724265322228497">"æœå°‹"</string>
+ <string name="all_printers_label" msgid="3178848870161526399">"所有å°è¡¨æ©Ÿ"</string>
+ <string name="add_print_service_label" msgid="5356702546188981940">"新增æœå‹™"</string>
+ <string name="print_search_box_shown_utterance" msgid="7967404953901376090">"æœå°‹æ¡†å·²é¡¯ç¤º"</string>
+ <string name="print_search_box_hidden_utterance" msgid="5727755169343113351">"æœå°‹æ¡†å·²éš±è—"</string>
+ <string name="print_add_printer" msgid="1088656468360653455">"新增å°è¡¨æ©Ÿ"</string>
+ <plurals name="print_search_result_count_utterance">
+ <item quantity="one" msgid="4484953260685964252">"找到 <xliff:g id="COUNT">%1$s</xliff:g> å°å°è¡¨æ©Ÿ"</item>
+ <item quantity="other" msgid="6533817036607128241">"找到 <xliff:g id="COUNT">%1$s</xliff:g> å°å°è¡¨æ©Ÿ"</item>
+ </plurals>
+ <string name="choose_print_service" msgid="3740309762324459694">"鏿“‡åˆ—å°æœå‹™"</string>
+ <string name="print_searching_for_printers" msgid="6550424555079932867">"正在æœå°‹å°è¡¨æ©Ÿ"</string>
+ <string name="print_no_printers" msgid="4869403323900054866">"找ä¸åˆ°å°è¡¨æ©Ÿ"</string>
+ <string name="printing_notification_title_template" msgid="295903957762447362">"æ­£åœ¨åˆ—å° <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="cancelling_notification_title_template" msgid="1821759594704703197">"æ­£åœ¨å–æ¶ˆ <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="failed_notification_title_template" msgid="2256217208186530973">"å°è¡¨æ©Ÿç™¼ç”ŸéŒ¯èª¤ï¼š<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="blocked_notification_title_template" msgid="1175435827331588646">"å°è¡¨æ©Ÿå°éŽ–äº† <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <plurals name="composite_notification_title_template">
+ <item quantity="one" msgid="5866624638054847057">"<xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g> 個列å°å·¥ä½œ"</item>
+ <item quantity="other" msgid="8746611264734222865">"<xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g> 個列å°å·¥ä½œ"</item>
+ </plurals>
+ <string name="cancel" msgid="4373674107267141885">"å–æ¶ˆ"</string>
+ <string name="restart" msgid="2472034227037808749">"釿–°é–‹å§‹"</string>
+ <string name="no_connection_to_printer" msgid="2159246915977282728">"尚未與å°è¡¨æ©Ÿå»ºç«‹é€£ç·š"</string>
+ <string name="reason_unknown" msgid="5507940196503246139">"䏿˜Ž"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – 無法使用"</string>
+ <string name="print_error_default_message" msgid="8568506918983980567">"無法產生列å°å·¥ä½œ"</string>
+ <string-array name="color_mode_labels">
+ <item msgid="7602948745415174937">"黑白"</item>
+ <item msgid="2762241247228983754">"彩色"</item>
+ </string-array>
+ <string-array name="orientation_labels">
+ <item msgid="4061931020926489228">"縱å‘"</item>
+ <item msgid="3199660090246166812">"æ©«å‘"</item>
+ </string-array>
+ <string-array name="page_options_labels">
+ <item msgid="7421377442011699994">"全部"</item>
+ <item msgid="6812869625222503603">"範åœ"</item>
+ </string-array>
+</resources>
diff --git a/packages/PrintSpooler/res/values-zu/strings.xml b/packages/PrintSpooler/res/values-zu/strings.xml
new file mode 100644
index 0000000..03c499f
--- /dev/null
+++ b/packages/PrintSpooler/res/values-zu/strings.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4469836075319831821">"Ispuli sephrinta"</string>
+ <string name="advanced_settings_button" msgid="5764225091289415632">"Izilungiselelo zephrinta"</string>
+ <string name="print_button" msgid="645164566271246268">"Phrinta"</string>
+ <string name="save_button" msgid="1921310454071758999">"Londoloza"</string>
+ <string name="label_destination" msgid="9132510997381599275">"Indawo"</string>
+ <string name="label_copies" msgid="3634531042822968308">"Amakhophi"</string>
+ <string name="label_paper_size" msgid="8681895607876809323">"Usayizi wephepha"</string>
+ <string name="label_color" msgid="1108690305218188969">"Umbala"</string>
+ <string name="label_orientation" msgid="2853142581990496477">"Umumo"</string>
+ <string name="label_pages" msgid="6300874667546617333">"Amakhasi (<xliff:g id="PAGE_COUNT">%1$s</xliff:g>)"</string>
+ <string name="pages_range_example" msgid="8558694453556945172">"isb. 1—5, 8, 11—13"</string>
+ <string name="print_preview" msgid="8010217796057763343">"Ukubuka kuqala kokuphrinta"</string>
+ <string name="install_for_print_preview" msgid="6366303997385509332">"Faka isibukeli se-PDF ukuze uhlole kuqala"</string>
+ <string name="printing_app_crashed" msgid="854477616686566398">"Ukuphrinta uhlelo lokusebenza kukhubazekile"</string>
+ <string name="page_count_unknown" msgid="6058852665954511124">"Amakhasi"</string>
+ <string name="generating_print_job" msgid="3119608742651698916">"Ikhiqiza umsebenzi wokuphrinta"</string>
+ <string name="save_as_pdf" msgid="5718454119847596853">"Londoloza njenge-PDF"</string>
+ <string name="all_printers" msgid="5018829726861876202">"Wonke amaphrinta…"</string>
+ <string name="print_dialog" msgid="32628687461331979">"Ingxoxo yokuphrinta"</string>
+ <string name="search" msgid="5421724265322228497">"Sesha"</string>
+ <string name="all_printers_label" msgid="3178848870161526399">"Wonke amaphrinta"</string>
+ <string name="add_print_service_label" msgid="5356702546188981940">"Engeza isevisi"</string>
+ <string name="print_search_box_shown_utterance" msgid="7967404953901376090">"Ibhokisi lokuhlola libonisiwe"</string>
+ <string name="print_search_box_hidden_utterance" msgid="5727755169343113351">"Ibhokisi lokusesha lifihliwe"</string>
+ <string name="print_add_printer" msgid="1088656468360653455">"Engeza iphrinta"</string>
+ <plurals name="print_search_result_count_utterance">
+ <item quantity="one" msgid="4484953260685964252">"<xliff:g id="COUNT">%1$s</xliff:g> iphrinta itholiwe"</item>
+ <item quantity="other" msgid="6533817036607128241">"<xliff:g id="COUNT">%1$s</xliff:g> amaphrinta atholiwe"</item>
+ </plurals>
+ <string name="choose_print_service" msgid="3740309762324459694">"Khetha isevisi yephrinta"</string>
+ <string name="print_searching_for_printers" msgid="6550424555079932867">"Isesha amaphrinta"</string>
+ <string name="print_no_printers" msgid="4869403323900054866">"Awekho amaphrinta atholiwe"</string>
+ <string name="printing_notification_title_template" msgid="295903957762447362">"Iphrinta i-<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Ikhansela i-<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="failed_notification_title_template" msgid="2256217208186530973">"Iphutha lephrinta ye-<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="blocked_notification_title_template" msgid="1175435827331588646">"Iphrinta engu-<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> ivinjelwe"</string>
+ <plurals name="composite_notification_title_template">
+ <item quantity="one" msgid="5866624638054847057">"<xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g> umsebenzi wokuphrinta"</item>
+ <item quantity="other" msgid="8746611264734222865">"<xliff:g id="PRINT_JOB_NAME">%1$d</xliff:g> imisebenzi yokuphrinta"</item>
+ </plurals>
+ <string name="cancel" msgid="4373674107267141885">"Khansela"</string>
+ <string name="restart" msgid="2472034227037808749">"Qala kabusha"</string>
+ <string name="no_connection_to_printer" msgid="2159246915977282728">"Akukho ukuxhumana kuphrinta"</string>
+ <string name="reason_unknown" msgid="5507940196503246139">"akwaziwa"</string>
+ <string name="printer_unavailable" msgid="2434170617003315690">"I-<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – ayitholakali"</string>
+ <string name="print_error_default_message" msgid="8568506918983980567">"Ayikwazanga ukukhiqiza umsebenzi wokuphrinta"</string>
+ <string-array name="color_mode_labels">
+ <item msgid="7602948745415174937">"Okumnyama nokumhlophe"</item>
+ <item msgid="2762241247228983754">"Umbala"</item>
+ </string-array>
+ <string-array name="orientation_labels">
+ <item msgid="4061931020926489228">"Ukuma ngobude"</item>
+ <item msgid="3199660090246166812">"Ukwakheka kwezwe"</item>
+ </string-array>
+ <string-array name="page_options_labels">
+ <item msgid="7421377442011699994">"Konke"</item>
+ <item msgid="6812869625222503603">"Ibanga"</item>
+ </string-array>
+</resources>
diff --git a/packages/SettingsProvider/res/values-az-rAZ/strings.xml b/packages/SettingsProvider/res/values-az-rAZ/strings.xml
new file mode 100644
index 0000000..a4d0d43
--- /dev/null
+++ b/packages/SettingsProvider/res/values-az-rAZ/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2007, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4567566098528588863">"Parametrlər Deposu"</string>
+</resources>
diff --git a/packages/SettingsProvider/res/values-az/strings.xml b/packages/SettingsProvider/res/values-az/strings.xml
new file mode 100644
index 0000000..a4d0d43
--- /dev/null
+++ b/packages/SettingsProvider/res/values-az/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2007, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4567566098528588863">"Parametrlər Deposu"</string>
+</resources>
diff --git a/packages/SettingsProvider/res/values-en-rIN/strings.xml b/packages/SettingsProvider/res/values-en-rIN/strings.xml
new file mode 100644
index 0000000..c19fdd7
--- /dev/null
+++ b/packages/SettingsProvider/res/values-en-rIN/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2007, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4567566098528588863">"Settings Storage"</string>
+</resources>
diff --git a/packages/SettingsProvider/res/values-et-rEE/strings.xml b/packages/SettingsProvider/res/values-et-rEE/strings.xml
new file mode 100644
index 0000000..30b7293
--- /dev/null
+++ b/packages/SettingsProvider/res/values-et-rEE/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2007, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4567566098528588863">"Seadete talletusruum"</string>
+</resources>
diff --git a/packages/SettingsProvider/res/values-fr-rCA/strings.xml b/packages/SettingsProvider/res/values-fr-rCA/strings.xml
new file mode 100644
index 0000000..c90eb09
--- /dev/null
+++ b/packages/SettingsProvider/res/values-fr-rCA/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2007, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4567566098528588863">"Stockage des paramètres"</string>
+</resources>
diff --git a/packages/SettingsProvider/res/values-hy-rAM/strings.xml b/packages/SettingsProvider/res/values-hy-rAM/strings.xml
new file mode 100644
index 0000000..b1f1afb
--- /dev/null
+++ b/packages/SettingsProvider/res/values-hy-rAM/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2007, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4567566098528588863">"Ô¿Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´Õ¶Õ¥Ö€Õ« ÕºÕ¡Õ°Õ¸Ö‚Õ½Õ¿"</string>
+</resources>
diff --git a/packages/SettingsProvider/res/values-hy/strings.xml b/packages/SettingsProvider/res/values-hy/strings.xml
new file mode 100644
index 0000000..b1f1afb
--- /dev/null
+++ b/packages/SettingsProvider/res/values-hy/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2007, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4567566098528588863">"Ô¿Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´Õ¶Õ¥Ö€Õ« ÕºÕ¡Õ°Õ¸Ö‚Õ½Õ¿"</string>
+</resources>
diff --git a/packages/SettingsProvider/res/values-ka-rGE/strings.xml b/packages/SettingsProvider/res/values-ka-rGE/strings.xml
new file mode 100644
index 0000000..691a2e9
--- /dev/null
+++ b/packages/SettingsProvider/res/values-ka-rGE/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2007, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4567566098528588863">"პáƒáƒ áƒáƒ›áƒ”ტრების სáƒáƒªáƒáƒ•ი"</string>
+</resources>
diff --git a/packages/SettingsProvider/res/values-ka/strings.xml b/packages/SettingsProvider/res/values-ka/strings.xml
new file mode 100644
index 0000000..691a2e9
--- /dev/null
+++ b/packages/SettingsProvider/res/values-ka/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2007, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4567566098528588863">"პáƒáƒ áƒáƒ›áƒ”ტრების სáƒáƒªáƒáƒ•ი"</string>
+</resources>
diff --git a/packages/SettingsProvider/res/values-km-rKH/strings.xml b/packages/SettingsProvider/res/values-km-rKH/strings.xml
new file mode 100644
index 0000000..7be6242
--- /dev/null
+++ b/packages/SettingsProvider/res/values-km-rKH/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2007, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4567566098528588863">"កំណážáŸ‹â€‹áž€áž¶ážšâ€‹áž•្ទុក"</string>
+</resources>
diff --git a/packages/SettingsProvider/res/values-km/strings.xml b/packages/SettingsProvider/res/values-km/strings.xml
new file mode 100644
index 0000000..7be6242
--- /dev/null
+++ b/packages/SettingsProvider/res/values-km/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2007, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4567566098528588863">"កំណážáŸ‹â€‹áž€áž¶ážšâ€‹áž•្ទុក"</string>
+</resources>
diff --git a/packages/SettingsProvider/res/values-lo-rLA/strings.xml b/packages/SettingsProvider/res/values-lo-rLA/strings.xml
new file mode 100644
index 0000000..4e57936
--- /dev/null
+++ b/packages/SettingsProvider/res/values-lo-rLA/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2007, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4567566098528588863">"ບ່ອນເàºàº±àºšàº‚à»à»‰àº¡àº¹àº™àºàº²àº™àº•ັ້ງຄ່າ"</string>
+</resources>
diff --git a/packages/SettingsProvider/res/values-lo/strings.xml b/packages/SettingsProvider/res/values-lo/strings.xml
new file mode 100644
index 0000000..4e57936
--- /dev/null
+++ b/packages/SettingsProvider/res/values-lo/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2007, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4567566098528588863">"ບ່ອນເàºàº±àºšàº‚à»à»‰àº¡àº¹àº™àºàº²àº™àº•ັ້ງຄ່າ"</string>
+</resources>
diff --git a/packages/SettingsProvider/res/values-mn-rMN/strings.xml b/packages/SettingsProvider/res/values-mn-rMN/strings.xml
new file mode 100644
index 0000000..9452145
--- /dev/null
+++ b/packages/SettingsProvider/res/values-mn-rMN/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2007, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4567566098528588863">"Тохиргооны Сан"</string>
+</resources>
diff --git a/packages/SettingsProvider/res/values-mn/strings.xml b/packages/SettingsProvider/res/values-mn/strings.xml
new file mode 100644
index 0000000..9452145
--- /dev/null
+++ b/packages/SettingsProvider/res/values-mn/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2007, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4567566098528588863">"Тохиргооны Сан"</string>
+</resources>
diff --git a/packages/SettingsProvider/res/values-ms-rMY/strings.xml b/packages/SettingsProvider/res/values-ms-rMY/strings.xml
new file mode 100644
index 0000000..9108b07
--- /dev/null
+++ b/packages/SettingsProvider/res/values-ms-rMY/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2007, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4567566098528588863">"Storan Tetapan"</string>
+</resources>
diff --git a/packages/SettingsProvider/res/values-ne-rNP/strings.xml b/packages/SettingsProvider/res/values-ne-rNP/strings.xml
new file mode 100644
index 0000000..af6ef62
--- /dev/null
+++ b/packages/SettingsProvider/res/values-ne-rNP/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2007, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4567566098528588863">"सेटिङहरू भणà¥à¤¡à¤¾à¤°à¤£"</string>
+</resources>
diff --git a/packages/SettingsProvider/res/values-ne/strings.xml b/packages/SettingsProvider/res/values-ne/strings.xml
new file mode 100644
index 0000000..af6ef62
--- /dev/null
+++ b/packages/SettingsProvider/res/values-ne/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2007, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4567566098528588863">"सेटिङहरू भणà¥à¤¡à¤¾à¤°à¤£"</string>
+</resources>
diff --git a/packages/SettingsProvider/res/values-si-rLK/strings.xml b/packages/SettingsProvider/res/values-si-rLK/strings.xml
new file mode 100644
index 0000000..24ef798
--- /dev/null
+++ b/packages/SettingsProvider/res/values-si-rLK/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2007, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4567566098528588863">"à·ƒà·à¶šà·ƒà·“ම් ගබඩà·à·€"</string>
+</resources>
diff --git a/packages/SettingsProvider/res/values-si/strings.xml b/packages/SettingsProvider/res/values-si/strings.xml
new file mode 100644
index 0000000..24ef798
--- /dev/null
+++ b/packages/SettingsProvider/res/values-si/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2007, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4567566098528588863">"à·ƒà·à¶šà·ƒà·“ම් ගබඩà·à·€"</string>
+</resources>
diff --git a/packages/SettingsProvider/res/values-zh-rHK/strings.xml b/packages/SettingsProvider/res/values-zh-rHK/strings.xml
new file mode 100644
index 0000000..977c9b9
--- /dev/null
+++ b/packages/SettingsProvider/res/values-zh-rHK/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2007, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="4567566098528588863">"設定儲存空間"</string>
+</resources>
diff --git a/packages/Shell/res/values-az-rAZ/strings.xml b/packages/Shell/res/values-az-rAZ/strings.xml
new file mode 100644
index 0000000..da08e38
--- /dev/null
+++ b/packages/Shell/res/values-az-rAZ/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="3701846017049540910">"Shell"</string>
+ <string name="bugreport_finished_title" msgid="2293711546892863898">"Baq raport alındı"</string>
+ <string name="bugreport_finished_text" msgid="3559904746859400732">"Xətanı şikayətini paylaşmaq üçün toxunun"</string>
+ <string name="bugreport_confirm" msgid="5130698467795669780">"Baq raportları sistemin müxtəlif jurnal fayllarından data içərir ki, buna şəxsi və konfidensial məlumatlar da aiddir. Yalnız inandığınız adamlarla baq raportlarını paylaşın."</string>
+ <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Bu mesajı növbəti dəfə göstər"</string>
+</resources>
diff --git a/packages/Shell/res/values-az/strings.xml b/packages/Shell/res/values-az/strings.xml
new file mode 100644
index 0000000..da08e38
--- /dev/null
+++ b/packages/Shell/res/values-az/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="3701846017049540910">"Shell"</string>
+ <string name="bugreport_finished_title" msgid="2293711546892863898">"Baq raport alındı"</string>
+ <string name="bugreport_finished_text" msgid="3559904746859400732">"Xətanı şikayətini paylaşmaq üçün toxunun"</string>
+ <string name="bugreport_confirm" msgid="5130698467795669780">"Baq raportları sistemin müxtəlif jurnal fayllarından data içərir ki, buna şəxsi və konfidensial məlumatlar da aiddir. Yalnız inandığınız adamlarla baq raportlarını paylaşın."</string>
+ <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Bu mesajı növbəti dəfə göstər"</string>
+</resources>
diff --git a/packages/Shell/res/values-cs/strings.xml b/packages/Shell/res/values-cs/strings.xml
index effdcb9..3f1c921 100644
--- a/packages/Shell/res/values-cs/strings.xml
+++ b/packages/Shell/res/values-cs/strings.xml
@@ -17,8 +17,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="3701846017049540910">"Prostředí"</string>
- <string name="bugreport_finished_title" msgid="2293711546892863898">"Byla vytvořena zpráva o chybě"</string>
- <string name="bugreport_finished_text" msgid="3559904746859400732">"Zprávu o chybě můžete sdílet klepnutím."</string>
- <string name="bugreport_confirm" msgid="5130698467795669780">"Zprávy o chybách obsahují data z různých souborů protokolů systému vÄetnÄ› osobních a soukromých informací. Zprávy o chybách sdílejte pouze s aplikacemi a uživateli, kterým důvěřujete."</string>
+ <string name="bugreport_finished_title" msgid="2293711546892863898">"Bylo vytvořeno chybové hlášení"</string>
+ <string name="bugreport_finished_text" msgid="3559904746859400732">"Chybové hlášení můžete sdílet klepnutím."</string>
+ <string name="bugreport_confirm" msgid="5130698467795669780">"Chybová hlášení obsahují data z různých souborů protokolů systému vÄetnÄ› osobních a soukromých informací. Chybová hlášení sdílejte pouze s aplikacemi a uživateli, kterým důvěřujete."</string>
<string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Zobrazit tuto zprávu příště"</string>
</resources>
diff --git a/packages/Shell/res/values-da/strings.xml b/packages/Shell/res/values-da/strings.xml
index 01ea42b..a8a3605 100644
--- a/packages/Shell/res/values-da/strings.xml
+++ b/packages/Shell/res/values-da/strings.xml
@@ -19,6 +19,6 @@
<string name="app_label" msgid="3701846017049540910">"Shell"</string>
<string name="bugreport_finished_title" msgid="2293711546892863898">"Fejlrapporten er registreret"</string>
<string name="bugreport_finished_text" msgid="3559904746859400732">"Tryk for at dele din fejlrapport"</string>
- <string name="bugreport_confirm" msgid="5130698467795669780">"Fejlrapporter indeholder data fra systemets forskellige logfiler, herunder personlige og private oplysninger. Del kun fejlrapporter med apps og personer, du har tillid til."</string>
+ <string name="bugreport_confirm" msgid="5130698467795669780">"Fejlrapporter indeholder data fra systemets forskellige logfiler, f.eks. personlige og private oplysninger. Del kun fejlrapporter med apps og personer, du har tillid til."</string>
<string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Vis denne meddelelse næste gang"</string>
</resources>
diff --git a/packages/Shell/res/values-en-rIN/strings.xml b/packages/Shell/res/values-en-rIN/strings.xml
new file mode 100644
index 0000000..68708e0
--- /dev/null
+++ b/packages/Shell/res/values-en-rIN/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="3701846017049540910">"Shell"</string>
+ <string name="bugreport_finished_title" msgid="2293711546892863898">"Bug report captured"</string>
+ <string name="bugreport_finished_text" msgid="3559904746859400732">"Touch to share your bug report"</string>
+ <string name="bugreport_confirm" msgid="5130698467795669780">"Bug reports contain data from the system\'s various log files, including personal and private information. Only share bug reports with apps and people that you trust."</string>
+ <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Show this message next time"</string>
+</resources>
diff --git a/packages/Shell/res/values-et-rEE/strings.xml b/packages/Shell/res/values-et-rEE/strings.xml
new file mode 100644
index 0000000..7788158
--- /dev/null
+++ b/packages/Shell/res/values-et-rEE/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="3701846017049540910">"Kest"</string>
+ <string name="bugreport_finished_title" msgid="2293711546892863898">"Veaaruanne jäädvustati"</string>
+ <string name="bugreport_finished_text" msgid="3559904746859400732">"Veaaruande jagamiseks puudutage"</string>
+ <string name="bugreport_confirm" msgid="5130698467795669780">"Veaaruanded sisaldavad andmeid erinevatest süsteemi logifailidest, sh isiklikku ja privaatset teavet. Jagage veaaruandeid ainult usaldusväärsete rakenduste ja inimestega."</string>
+ <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Kuva see sõnum järgmisel korral"</string>
+</resources>
diff --git a/packages/Shell/res/values-fr-rCA/strings.xml b/packages/Shell/res/values-fr-rCA/strings.xml
new file mode 100644
index 0000000..c672f23
--- /dev/null
+++ b/packages/Shell/res/values-fr-rCA/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="3701846017049540910">"Shell"</string>
+ <string name="bugreport_finished_title" msgid="2293711546892863898">"Rapport de bogue enregistré"</string>
+ <string name="bugreport_finished_text" msgid="3559904746859400732">"Appuyer ici pour partager votre rapport de bogue"</string>
+ <string name="bugreport_confirm" msgid="5130698467795669780">"Les rapports de bogue contiennent des données des fichiers journaux du système, y compris des informations personnelles et privées. Ne partagez les rapports de bogue qu\'avec les applications et les personnes que vous estimez fiables."</string>
+ <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Afficher ce message la prochaine fois"</string>
+</resources>
diff --git a/packages/Shell/res/values-hi/strings.xml b/packages/Shell/res/values-hi/strings.xml
index 4ea0664..f889311 100644
--- a/packages/Shell/res/values-hi/strings.xml
+++ b/packages/Shell/res/values-hi/strings.xml
@@ -19,6 +19,6 @@
<string name="app_label" msgid="3701846017049540910">"शेल"</string>
<string name="bugreport_finished_title" msgid="2293711546892863898">"बग रिपोरà¥à¤Ÿ कैपà¥à¤šà¤° कर ली गई"</string>
<string name="bugreport_finished_text" msgid="3559904746859400732">"अपनी बग रिपोरà¥à¤Ÿ साà¤à¤¾ करने के लिठसà¥à¤ªà¤°à¥à¤¶ करें"</string>
- <string name="bugreport_confirm" msgid="5130698467795669780">"बग रिपोरà¥à¤Ÿ में वà¥à¤¯à¤•à¥à¤¤à¤¿à¤—त और निजी जानकारी सहित, सिसà¥à¤Ÿà¤® की विभिनà¥à¤¨ लॉग फ़ाइलों का डेटा होता है. बग रिपोरà¥à¤Ÿ केवल विशà¥à¤µà¤¸à¤¨à¥€à¤¯ à¤à¤ªà¥à¤²à¤¿à¤•ेशन और वà¥à¤¯à¤•à¥à¤¤à¤¿à¤¯à¥‹à¤‚ से ही साà¤à¤¾ करें."</string>
+ <string name="bugreport_confirm" msgid="5130698467795669780">"बग रिपोरà¥à¤Ÿ में वà¥à¤¯à¤•à¥à¤¤à¤¿à¤—त और निजी जानकारी सहित, सिसà¥à¤Ÿà¤® की विभिनà¥à¤¨ लॉग फ़ाइलों का डेटा होता है. बग रिपोरà¥à¤Ÿ केवल विशà¥à¤µà¤¸à¤¨à¥€à¤¯ à¤à¤ªà¥à¤¸ और वà¥à¤¯à¤•à¥à¤¤à¤¿à¤¯à¥‹à¤‚ से ही साà¤à¤¾ करें."</string>
<string name="bugreport_confirm_repeat" msgid="4926842460688645058">"यह संदेश अगली बार दिखाà¤à¤‚"</string>
</resources>
diff --git a/packages/Shell/res/values-hy-rAM/strings.xml b/packages/Shell/res/values-hy-rAM/strings.xml
new file mode 100644
index 0000000..ea7fa9f
--- /dev/null
+++ b/packages/Shell/res/values-hy-rAM/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="3701846017049540910">"Ô½Õ¥ÖÕ«"</string>
+ <string name="bugreport_finished_title" msgid="2293711546892863898">"ÕŽÖ€Õ«ÕºÕ¡Õ¯Õ« Õ¦Õ¥Õ¯Õ¸Ö‚ÕµÖ Õ½Õ¿Õ¡ÖÕ¾Õ¥Ö"</string>
+ <string name="bugreport_finished_text" msgid="3559904746859400732">"Õ€ÕºÕ¥Ö„` Õ±Õ¥Ö€ Õ¾Ö€Õ«ÕºÕ¡Õ¯Õ« Õ´Õ¡Õ½Õ«Õ¶ Õ¦Õ¥Õ¯Õ¸Ö‚ÕµÖÕ¨ Õ¿Õ¡Ö€Õ¡Õ®Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€"</string>
+ <string name="bugreport_confirm" msgid="5130698467795669780">"ÕŽÖ€Õ«ÕºÕ¡Õ¯Õ« Õ¦Õ¥Õ¯Õ¸Ö‚ÕµÖÕ¶Õ¥Ö€Õ¨ ÕºÕ¡Ö€Õ¸Ö‚Õ¶Õ¡Õ¯Õ¸Ö‚Õ´ Õ¥Õ¶ Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ« Õ¿Õ¡Ö€Õ¢Õ¥Ö€ Õ´Õ¸Ö‚Õ¿Ö„Õ« Ö†Õ¡ÕµÕ¬Õ¥Ö€Õ«Ö, Õ¡ÕµÕ¤ Õ©Õ¾Õ¸Ö‚Õ´ Õ¶Õ¡Ö‡ Õ¡Õ¶Õ°Õ¡Õ¿Õ¡Õ¯Õ¡Õ¶ ​​և Õ£Õ¡Õ²Õ¿Õ¶Õ« Õ¿Õ¥Õ²Õ¥Õ¯Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€: ÕŽÖ€Õ«ÕºÕ¡Õ¯Õ« Õ¦Õ¥Õ¯Õ¸Ö‚ÕµÖները կիսեք Õ´Õ«Õ¡ÕµÕ¶ Õ¡ÕµÕ¶ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ« Ö‡ Õ´Õ¡Ö€Õ¤Õ¯Õ¡Õ¶Ö Õ°Õ¥Õ¿, Õ¸Ö€Õ¸Õ¶Ö Õ¾Õ½Õ¿Õ¡Õ°Õ¸Ö‚Õ´ Õ¥Ö„:"</string>
+ <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Ô±ÕµÕ½ Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ ÖÕ¸Ö‚ÕµÖ Õ¿Õ¡Õ¬ Õ°Õ¡Õ»Õ¸Ö€Õ¤ Õ¡Õ¶Õ£Õ¡Õ´"</string>
+</resources>
diff --git a/packages/Shell/res/values-hy/strings.xml b/packages/Shell/res/values-hy/strings.xml
new file mode 100644
index 0000000..ea7fa9f
--- /dev/null
+++ b/packages/Shell/res/values-hy/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="3701846017049540910">"Ô½Õ¥ÖÕ«"</string>
+ <string name="bugreport_finished_title" msgid="2293711546892863898">"ÕŽÖ€Õ«ÕºÕ¡Õ¯Õ« Õ¦Õ¥Õ¯Õ¸Ö‚ÕµÖ Õ½Õ¿Õ¡ÖÕ¾Õ¥Ö"</string>
+ <string name="bugreport_finished_text" msgid="3559904746859400732">"Õ€ÕºÕ¥Ö„` Õ±Õ¥Ö€ Õ¾Ö€Õ«ÕºÕ¡Õ¯Õ« Õ´Õ¡Õ½Õ«Õ¶ Õ¦Õ¥Õ¯Õ¸Ö‚ÕµÖÕ¨ Õ¿Õ¡Ö€Õ¡Õ®Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€"</string>
+ <string name="bugreport_confirm" msgid="5130698467795669780">"ÕŽÖ€Õ«ÕºÕ¡Õ¯Õ« Õ¦Õ¥Õ¯Õ¸Ö‚ÕµÖÕ¶Õ¥Ö€Õ¨ ÕºÕ¡Ö€Õ¸Ö‚Õ¶Õ¡Õ¯Õ¸Ö‚Õ´ Õ¥Õ¶ Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ« Õ¿Õ¡Ö€Õ¢Õ¥Ö€ Õ´Õ¸Ö‚Õ¿Ö„Õ« Ö†Õ¡ÕµÕ¬Õ¥Ö€Õ«Ö, Õ¡ÕµÕ¤ Õ©Õ¾Õ¸Ö‚Õ´ Õ¶Õ¡Ö‡ Õ¡Õ¶Õ°Õ¡Õ¿Õ¡Õ¯Õ¡Õ¶ ​​և Õ£Õ¡Õ²Õ¿Õ¶Õ« Õ¿Õ¥Õ²Õ¥Õ¯Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€: ÕŽÖ€Õ«ÕºÕ¡Õ¯Õ« Õ¦Õ¥Õ¯Õ¸Ö‚ÕµÖները կիսեք Õ´Õ«Õ¡ÕµÕ¶ Õ¡ÕµÕ¶ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ« Ö‡ Õ´Õ¡Ö€Õ¤Õ¯Õ¡Õ¶Ö Õ°Õ¥Õ¿, Õ¸Ö€Õ¸Õ¶Ö Õ¾Õ½Õ¿Õ¡Õ°Õ¸Ö‚Õ´ Õ¥Ö„:"</string>
+ <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Ô±ÕµÕ½ Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ ÖÕ¸Ö‚ÕµÖ Õ¿Õ¡Õ¬ Õ°Õ¡Õ»Õ¸Ö€Õ¤ Õ¡Õ¶Õ£Õ¡Õ´"</string>
+</resources>
diff --git a/packages/Shell/res/values-iw/strings.xml b/packages/Shell/res/values-iw/strings.xml
index e7715e9..ded860c 100644
--- a/packages/Shell/res/values-iw/strings.xml
+++ b/packages/Shell/res/values-iw/strings.xml
@@ -19,6 +19,6 @@
<string name="app_label" msgid="3701846017049540910">"מעטפת"</string>
<string name="bugreport_finished_title" msgid="2293711546892863898">"דוח הב××’×™× ×¦×•×œ×"</string>
<string name="bugreport_finished_text" msgid="3559904746859400732">"×’×¢ כדי לשתף ×ת דוח הב××’×™× ×©×œ×š"</string>
- <string name="bugreport_confirm" msgid="5130698467795669780">"דוחות על ב××’×™× ×›×•×œ×œ×™× × ×ª×•× ×™× ×ž×§×•×‘×¦×™ היומן ×”×©×•× ×™× ×‘×ž×¢×¨×›×ª, כולל מידע ×ישי ופרטי. שתף דוחות ב××’×™× ×¨×§ ×¢× ×™×™×©×•×ž×™× ×•×× ×©×™× ×©×תה סומך עליה×."</string>
+ <string name="bugreport_confirm" msgid="5130698467795669780">"דוחות על ב××’×™× ×›×•×œ×œ×™× × ×ª×•× ×™× ×ž×§×•×‘×¦×™ היומן ×”×©×•× ×™× ×‘×ž×¢×¨×›×ª, כולל מידע ×ישי ופרטי. שתף דוחות ב××’×™× ×¨×§ ×¢× ×פליקציות ו×× ×©×™× ×©×תה סומך עליה×."</string>
<string name="bugreport_confirm_repeat" msgid="4926842460688645058">"הצג ×ת ההודעה הזו ×‘×¤×¢× ×”×‘××”"</string>
</resources>
diff --git a/packages/Shell/res/values-ka-rGE/strings.xml b/packages/Shell/res/values-ka-rGE/strings.xml
new file mode 100644
index 0000000..7d9c72a
--- /dev/null
+++ b/packages/Shell/res/values-ka-rGE/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="3701846017049540910">"გáƒáƒ áƒ”კáƒáƒœáƒ˜"</string>
+ <string name="bugreport_finished_title" msgid="2293711546892863898">"áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜ ხáƒáƒ áƒ•ეზების შესáƒáƒ®áƒ”ბ შექმნილიáƒ"</string>
+ <string name="bugreport_finished_text" msgid="3559904746859400732">"შეეხეთ თქვენი ხáƒáƒ áƒ•ეზების áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜áƒ¡ გáƒáƒ¡áƒáƒ–იáƒáƒ áƒ”ბლáƒáƒ“"</string>
+ <string name="bugreport_confirm" msgid="5130698467795669780">"ხáƒáƒ áƒ•ეზის áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ”ბი მáƒáƒ˜áƒªáƒáƒ•ს მáƒáƒœáƒáƒªáƒ”მებს სხვáƒáƒ“áƒáƒ¡áƒ®áƒ•რსისტემური ჟურნáƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ”ბიდáƒáƒœ, მáƒáƒ— შáƒáƒ áƒ˜áƒ¡ პირáƒáƒ“ დრკáƒáƒœáƒ¤áƒ˜áƒ“ენციáƒáƒšáƒ£áƒ  ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒáƒ¡."</string>
+ <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"შემდგáƒáƒ›áƒ¨áƒ˜ áƒáƒ©áƒ•ენე ეს შეტყáƒáƒ‘ინებáƒ"</string>
+</resources>
diff --git a/packages/Shell/res/values-ka/strings.xml b/packages/Shell/res/values-ka/strings.xml
new file mode 100644
index 0000000..7d9c72a
--- /dev/null
+++ b/packages/Shell/res/values-ka/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="3701846017049540910">"გáƒáƒ áƒ”კáƒáƒœáƒ˜"</string>
+ <string name="bugreport_finished_title" msgid="2293711546892863898">"áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜ ხáƒáƒ áƒ•ეზების შესáƒáƒ®áƒ”ბ შექმნილიáƒ"</string>
+ <string name="bugreport_finished_text" msgid="3559904746859400732">"შეეხეთ თქვენი ხáƒáƒ áƒ•ეზების áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜áƒ¡ გáƒáƒ¡áƒáƒ–იáƒáƒ áƒ”ბლáƒáƒ“"</string>
+ <string name="bugreport_confirm" msgid="5130698467795669780">"ხáƒáƒ áƒ•ეზის áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ”ბი მáƒáƒ˜áƒªáƒáƒ•ს მáƒáƒœáƒáƒªáƒ”მებს სხვáƒáƒ“áƒáƒ¡áƒ®áƒ•რსისტემური ჟურნáƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ”ბიდáƒáƒœ, მáƒáƒ— შáƒáƒ áƒ˜áƒ¡ პირáƒáƒ“ დრკáƒáƒœáƒ¤áƒ˜áƒ“ენციáƒáƒšáƒ£áƒ  ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒáƒ¡."</string>
+ <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"შემდგáƒáƒ›áƒ¨áƒ˜ áƒáƒ©áƒ•ენე ეს შეტყáƒáƒ‘ინებáƒ"</string>
+</resources>
diff --git a/packages/Shell/res/values-km-rKH/strings.xml b/packages/Shell/res/values-km-rKH/strings.xml
new file mode 100644
index 0000000..efb345c
--- /dev/null
+++ b/packages/Shell/res/values-km-rKH/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="3701846017049540910">"សែល"</string>
+ <string name="bugreport_finished_title" msgid="2293711546892863898">"បាន​ចាប់​យក​របាយការណáŸâ€‹áž€áŸ†áž áž»ážŸ"</string>
+ <string name="bugreport_finished_text" msgid="3559904746859400732">"ប៉ះ​ ដើម្បី​ចែក​រំលែក​របាយការណáŸâ€‹áž€áŸ†áž áž»ážŸâ€‹ážšáž”ស់​អ្នក"</string>
+ <string name="bugreport_confirm" msgid="5130698467795669780">"របាយការណáŸâ€‹áž€áŸ†áž áž»ážŸâ€‹ážšáž½áž˜áž˜áž¶áž“​ឯកសារ​កំណážáŸ‹â€‹áž áŸážáž»â€‹áž•្សáŸáž„ៗ​របស់​ប្រពáŸáž“្ធ រួមមាន​ពáŸážáŸŒáž˜áž¶áž“​ផ្ទាល់ážáŸ’លួន និង​ឯកជន។ ចែករំលែក​របាយការណáŸâ€‹áž€áŸ†áž áž»ážŸâ€‹áž‡áž¶â€‹áž˜áž½áž™â€‹áž€áž˜áŸ’មវិធី និង​មនុស្ស​ដែល​អ្នក​ទុក​ចិážáŸ’ážáŸ”"</string>
+ <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"បង្ហាញ​សារ​នáŸáŸ‡â€‹áž–áŸáž›â€‹áž€áŸ’រោយ"</string>
+</resources>
diff --git a/packages/Shell/res/values-km/strings.xml b/packages/Shell/res/values-km/strings.xml
new file mode 100644
index 0000000..efb345c
--- /dev/null
+++ b/packages/Shell/res/values-km/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="3701846017049540910">"សែល"</string>
+ <string name="bugreport_finished_title" msgid="2293711546892863898">"បាន​ចាប់​យក​របាយការណáŸâ€‹áž€áŸ†áž áž»ážŸ"</string>
+ <string name="bugreport_finished_text" msgid="3559904746859400732">"ប៉ះ​ ដើម្បី​ចែក​រំលែក​របាយការណáŸâ€‹áž€áŸ†áž áž»ážŸâ€‹ážšáž”ស់​អ្នក"</string>
+ <string name="bugreport_confirm" msgid="5130698467795669780">"របាយការណáŸâ€‹áž€áŸ†áž áž»ážŸâ€‹ážšáž½áž˜áž˜áž¶áž“​ឯកសារ​កំណážáŸ‹â€‹áž áŸážáž»â€‹áž•្សáŸáž„ៗ​របស់​ប្រពáŸáž“្ធ រួមមាន​ពáŸážáŸŒáž˜áž¶áž“​ផ្ទាល់ážáŸ’លួន និង​ឯកជន។ ចែករំលែក​របាយការណáŸâ€‹áž€áŸ†áž áž»ážŸâ€‹áž‡áž¶â€‹áž˜áž½áž™â€‹áž€áž˜áŸ’មវិធី និង​មនុស្ស​ដែល​អ្នក​ទុក​ចិážáŸ’ážáŸ”"</string>
+ <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"បង្ហាញ​សារ​នáŸáŸ‡â€‹áž–áŸáž›â€‹áž€áŸ’រោយ"</string>
+</resources>
diff --git a/packages/Shell/res/values-lo-rLA/strings.xml b/packages/Shell/res/values-lo-rLA/strings.xml
new file mode 100644
index 0000000..a237d48
--- /dev/null
+++ b/packages/Shell/res/values-lo-rLA/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="3701846017049540910">"Shell"</string>
+ <string name="bugreport_finished_title" msgid="2293711546892863898">"ລາàºàº‡àº²àº™àºˆàº¸àº”ບົàºàºžà»ˆàº­àº‡àº–ືàºà»€àºàº±àºšàºàº³à»àº¥à»‰àº§"</string>
+ <string name="bugreport_finished_text" msgid="3559904746859400732">"à»àº•ະເພື່ອສົ່ງàºàº²àº™àº¥àº²àºàº‡àº²àº™àº›àº±àº™àº«àº²àº‚ອງທ່ານ"</string>
+ <string name="bugreport_confirm" msgid="5130698467795669780">"àºàº²àº™àº¥àº²àºàº‡àº²àº™àº‚à»à»‰àºœàº´àº”ພາດປະàºàº­àºšàº¡àºµ ຂà»à»‰àº¡àº¹àº™àºˆàº²àºà»„ຟລ໌ບັນທຶàºàº‚ອງລະບົບຫຼາàºà»„ຟລ໌, ຮວມທັງຂà»à»‰àº¡àº¹àº™àºªà»ˆàº§àº™à»‚ຕນຳ. ທ່ານຕ້ອງà»àºšà»ˆàº‡àº›àº±àº™àº¥àº²àºàº‡àº²àº™àº‚à»à»‰àºœàº´àº”ພາດໃຫ້à»àº­àº±àºšàº¯ à»àº¥àº°àº„ົນທີ່ທ່ານເຊື່ອຖືໄດ້ເທົ່ານັ້ນ."</string>
+ <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"ສະà»àº”ງຂà»à»‰àº„ວາມນີ້ອີàºà»ƒàº™à»€àº—ື່ອຕà»à»ˆà»„ປ"</string>
+</resources>
diff --git a/packages/Shell/res/values-lo/strings.xml b/packages/Shell/res/values-lo/strings.xml
new file mode 100644
index 0000000..a237d48
--- /dev/null
+++ b/packages/Shell/res/values-lo/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="3701846017049540910">"Shell"</string>
+ <string name="bugreport_finished_title" msgid="2293711546892863898">"ລາàºàº‡àº²àº™àºˆàº¸àº”ບົàºàºžà»ˆàº­àº‡àº–ືàºà»€àºàº±àºšàºàº³à»àº¥à»‰àº§"</string>
+ <string name="bugreport_finished_text" msgid="3559904746859400732">"à»àº•ະເພື່ອສົ່ງàºàº²àº™àº¥àº²àºàº‡àº²àº™àº›àº±àº™àº«àº²àº‚ອງທ່ານ"</string>
+ <string name="bugreport_confirm" msgid="5130698467795669780">"àºàº²àº™àº¥àº²àºàº‡àº²àº™àº‚à»à»‰àºœàº´àº”ພາດປະàºàº­àºšàº¡àºµ ຂà»à»‰àº¡àº¹àº™àºˆàº²àºà»„ຟລ໌ບັນທຶàºàº‚ອງລະບົບຫຼາàºà»„ຟລ໌, ຮວມທັງຂà»à»‰àº¡àº¹àº™àºªà»ˆàº§àº™à»‚ຕນຳ. ທ່ານຕ້ອງà»àºšà»ˆàº‡àº›àº±àº™àº¥àº²àºàº‡àº²àº™àº‚à»à»‰àºœàº´àº”ພາດໃຫ້à»àº­àº±àºšàº¯ à»àº¥àº°àº„ົນທີ່ທ່ານເຊື່ອຖືໄດ້ເທົ່ານັ້ນ."</string>
+ <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"ສະà»àº”ງຂà»à»‰àº„ວາມນີ້ອີàºà»ƒàº™à»€àº—ື່ອຕà»à»ˆà»„ປ"</string>
+</resources>
diff --git a/packages/Shell/res/values-mn-rMN/strings.xml b/packages/Shell/res/values-mn-rMN/strings.xml
new file mode 100644
index 0000000..f74298d
--- /dev/null
+++ b/packages/Shell/res/values-mn-rMN/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="3701846017049540910">"Шел"</string>
+ <string name="bugreport_finished_title" msgid="2293711546892863898">"Ðлдааны мÑдÑÑлÑл хүлÑÑн авав"</string>
+ <string name="bugreport_finished_text" msgid="3559904746859400732">"Та алдааны мÑдÑгдлийг хуваалцах бол Ñ…Ò¯Ñ€Ð½Ñ Ò¯Ò¯"</string>
+ <string name="bugreport_confirm" msgid="5130698467795669780">"Ðлдааны репорт нь хувийн болон нууц мÑдÑÑлÑл зÑргийг агуулÑан ÑиÑтемийн төрөл бүрийн лог файлын датаг агуулна. Ðлдааны репортыг зөвхөн итгÑлтÑй апп болон хүмүүÑÑ‚ хуваалцана уу."</string>
+ <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Ð­Ð½Ñ Ð¼ÐµÑÑежийг дараагийн удаа харуулах"</string>
+</resources>
diff --git a/packages/Shell/res/values-mn/strings.xml b/packages/Shell/res/values-mn/strings.xml
new file mode 100644
index 0000000..f74298d
--- /dev/null
+++ b/packages/Shell/res/values-mn/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="3701846017049540910">"Шел"</string>
+ <string name="bugreport_finished_title" msgid="2293711546892863898">"Ðлдааны мÑдÑÑлÑл хүлÑÑн авав"</string>
+ <string name="bugreport_finished_text" msgid="3559904746859400732">"Та алдааны мÑдÑгдлийг хуваалцах бол Ñ…Ò¯Ñ€Ð½Ñ Ò¯Ò¯"</string>
+ <string name="bugreport_confirm" msgid="5130698467795669780">"Ðлдааны репорт нь хувийн болон нууц мÑдÑÑлÑл зÑргийг агуулÑан ÑиÑтемийн төрөл бүрийн лог файлын датаг агуулна. Ðлдааны репортыг зөвхөн итгÑлтÑй апп болон хүмүүÑÑ‚ хуваалцана уу."</string>
+ <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Ð­Ð½Ñ Ð¼ÐµÑÑежийг дараагийн удаа харуулах"</string>
+</resources>
diff --git a/packages/Shell/res/values-ms-rMY/strings.xml b/packages/Shell/res/values-ms-rMY/strings.xml
new file mode 100644
index 0000000..8d1e4a2
--- /dev/null
+++ b/packages/Shell/res/values-ms-rMY/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="3701846017049540910">"Shell"</string>
+ <string name="bugreport_finished_title" msgid="2293711546892863898">"Laporan pepijat telah ditangkap"</string>
+ <string name="bugreport_finished_text" msgid="3559904746859400732">"Sentuh untuk berkongsi laporan pepijat anda"</string>
+ <string name="bugreport_confirm" msgid="5130698467795669780">"Laporan pepijat mengandungi data dari pelbagai fail log sistem, termasuk maklumat peribadi dan sulit. Kongsikan laporan pepijat hanya dengan apl dan orang yang anda percayai."</string>
+ <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Tunjukkan mesej ini pada masa akan datang"</string>
+</resources>
diff --git a/packages/Shell/res/values-ne-rNP/strings.xml b/packages/Shell/res/values-ne-rNP/strings.xml
new file mode 100644
index 0000000..cf09433
--- /dev/null
+++ b/packages/Shell/res/values-ne-rNP/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="3701846017049540910">"सेल"</string>
+ <string name="bugreport_finished_title" msgid="2293711546892863898">"बग पà¥à¤°à¤¤à¤¿à¤µà¥‡à¤¦à¤¨ समातियो"</string>
+ <string name="bugreport_finished_text" msgid="3559904746859400732">"तपाईंको बग रिपोरà¥à¤Ÿ साà¤à¥‡à¤¦à¤¾à¤°à¥€ गरà¥à¤¨ छà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="bugreport_confirm" msgid="5130698467795669780">"बग रिपोरà¥à¤Ÿà¤¹à¤°à¥‚मा पà¥à¤°à¤£à¤¾à¤²à¥€à¤•ा विभिनà¥à¤¨ लग फाइलहरूबाट वà¥à¤¯à¤•à¥à¤¤à¤¿à¤—त तथा नीजि सूचनासहितको डेटा रहनà¥à¤›à¥¤ बग रिपोरà¥à¤Ÿà¤¹à¤°à¥‚ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरू र तपाईà¤à¤²à¥‡ विशà¥à¤µà¤¾à¤¸ गरेका वà¥à¤¯à¤•à¥à¤¤à¤¿à¤¹à¤°à¥‚सà¤à¤— मातà¥à¤° साà¤à¥‡à¤¦à¤¾à¤°à¥€ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"यो सनà¥à¤¦à¥‡à¤¶ अरà¥à¤•ो पटक देखाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+</resources>
diff --git a/packages/Shell/res/values-ne/strings.xml b/packages/Shell/res/values-ne/strings.xml
new file mode 100644
index 0000000..cf09433
--- /dev/null
+++ b/packages/Shell/res/values-ne/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="3701846017049540910">"सेल"</string>
+ <string name="bugreport_finished_title" msgid="2293711546892863898">"बग पà¥à¤°à¤¤à¤¿à¤µà¥‡à¤¦à¤¨ समातियो"</string>
+ <string name="bugreport_finished_text" msgid="3559904746859400732">"तपाईंको बग रिपोरà¥à¤Ÿ साà¤à¥‡à¤¦à¤¾à¤°à¥€ गरà¥à¤¨ छà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="bugreport_confirm" msgid="5130698467795669780">"बग रिपोरà¥à¤Ÿà¤¹à¤°à¥‚मा पà¥à¤°à¤£à¤¾à¤²à¥€à¤•ा विभिनà¥à¤¨ लग फाइलहरूबाट वà¥à¤¯à¤•à¥à¤¤à¤¿à¤—त तथा नीजि सूचनासहितको डेटा रहनà¥à¤›à¥¤ बग रिपोरà¥à¤Ÿà¤¹à¤°à¥‚ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरू र तपाईà¤à¤²à¥‡ विशà¥à¤µà¤¾à¤¸ गरेका वà¥à¤¯à¤•à¥à¤¤à¤¿à¤¹à¤°à¥‚सà¤à¤— मातà¥à¤° साà¤à¥‡à¤¦à¤¾à¤°à¥€ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"यो सनà¥à¤¦à¥‡à¤¶ अरà¥à¤•ो पटक देखाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+</resources>
diff --git a/packages/Shell/res/values-si-rLK/strings.xml b/packages/Shell/res/values-si-rLK/strings.xml
new file mode 100644
index 0000000..0780789
--- /dev/null
+++ b/packages/Shell/res/values-si-rLK/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="3701846017049540910">"ෂෙල්"</string>
+ <string name="bugreport_finished_title" msgid="2293711546892863898">"දà·à·‚ à·€à·à¶»à·Šà¶­à·à·€ ලබà·à¶œà¶±à·Šà¶±à· ලදි"</string>
+ <string name="bugreport_finished_text" msgid="3559904746859400732">"ඔබගේ දà·à·‚ à·€à·à¶»à·Šà¶­à·à·€ බෙද෠ගà·à¶±à·“මට ස්පර්෠කරන්න"</string>
+ <string name="bugreport_confirm" msgid="5130698467795669780">"පුද්ගලික සහ පෞද්ගලික තොරතුරු ඇතුළත්ව පද්ධතියේ විවිධ ලොග් ගොනු වල දත්ත දà·à·‚ à·€à·à¶»à·Šà¶­à·à·€à·š අඩංගු වේ. ඔබට විà·à·Šà·€à·à·ƒà·€à¶±à·Šà¶­ යෙදුම් සහ පුද්ගලයින් සමඟ පමණක් දà·à·‚ à·€à·à¶»à·Šà¶­à· බෙද෠ගන්න."</string>
+ <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"à¶Šà·…à¶Ÿ වෙලà·à·€à·š මෙම පණිවිඩය පෙන්වන්න"</string>
+</resources>
diff --git a/packages/Shell/res/values-si/strings.xml b/packages/Shell/res/values-si/strings.xml
new file mode 100644
index 0000000..0780789
--- /dev/null
+++ b/packages/Shell/res/values-si/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="3701846017049540910">"ෂෙල්"</string>
+ <string name="bugreport_finished_title" msgid="2293711546892863898">"දà·à·‚ à·€à·à¶»à·Šà¶­à·à·€ ලබà·à¶œà¶±à·Šà¶±à· ලදි"</string>
+ <string name="bugreport_finished_text" msgid="3559904746859400732">"ඔබගේ දà·à·‚ à·€à·à¶»à·Šà¶­à·à·€ බෙද෠ගà·à¶±à·“මට ස්පර්෠කරන්න"</string>
+ <string name="bugreport_confirm" msgid="5130698467795669780">"පුද්ගලික සහ පෞද්ගලික තොරතුරු ඇතුළත්ව පද්ධතියේ විවිධ ලොග් ගොනු වල දත්ත දà·à·‚ à·€à·à¶»à·Šà¶­à·à·€à·š අඩංගු වේ. ඔබට විà·à·Šà·€à·à·ƒà·€à¶±à·Šà¶­ යෙදුම් සහ පුද්ගලයින් සමඟ පමණක් දà·à·‚ à·€à·à¶»à·Šà¶­à· බෙද෠ගන්න."</string>
+ <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"à¶Šà·…à¶Ÿ වෙලà·à·€à·š මෙම පණිවිඩය පෙන්වන්න"</string>
+</resources>
diff --git a/packages/Shell/res/values-zh-rHK/strings.xml b/packages/Shell/res/values-zh-rHK/strings.xml
new file mode 100644
index 0000000..b5f1935
--- /dev/null
+++ b/packages/Shell/res/values-zh-rHK/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="3701846017049540910">"命令介é¢"</string>
+ <string name="bugreport_finished_title" msgid="2293711546892863898">"已擷å–錯誤報告"</string>
+ <string name="bugreport_finished_text" msgid="3559904746859400732">"輕觸å³å¯åˆ†äº«æ‚¨çš„錯誤報告"</string>
+ <string name="bugreport_confirm" msgid="5130698467795669780">"錯誤報告中有來自系統å„個記錄檔案的資料,包括個人和ç§äººè³‡æ–™ã€‚è«‹åªèˆ‡æ‚¨ä¿¡ä»»çš„æ‡‰ç”¨ç¨‹å¼å’Œç”¨æˆ¶åˆ†äº«éŒ¯èª¤å ±å‘Šã€‚"</string>
+ <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"下次å†é¡¯ç¤ºé€™å‰‡è¨Šæ¯"</string>
+</resources>
diff --git a/packages/SystemUI/proguard.flags b/packages/SystemUI/proguard.flags
index ab45d99..1ff93d2 100644
--- a/packages/SystemUI/proguard.flags
+++ b/packages/SystemUI/proguard.flags
@@ -7,4 +7,5 @@
public void setGlowScale(float);
}
+-keep class com.android.systemui.statusbar.phone.PhoneStatusBar
-keep class com.android.systemui.statusbar.tv.TvStatusBar
diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml
index 9ddf42a..ed9bc8f 100644
--- a/packages/SystemUI/res/values-af/strings.xml
+++ b/packages/SystemUI/res/values-af/strings.xml
@@ -61,8 +61,6 @@
<string name="usb_debugging_always" msgid="303335496705863070">"Laat altyd toe van hierdie rekenaar af"</string>
<string name="compat_mode_on" msgid="6623839244840638213">"Zoem om skerm te vul"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Strek om skerm te vul"</string>
- <string name="compat_mode_help_header" msgid="7969493989397529910">"Versoenbaarheidszoem"</string>
- <string name="compat_mode_help_body" msgid="4946726776359270040">"As \'n program vir \'n kleiner skerm ontwerp is, sal \'n zoemkontrole naby die horlosie verskyn"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Stoor tans skermkiekie..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Stoor tans skermkiekie..."</string>
<string name="screenshot_saving_text" msgid="2419718443411738818">"Skermkiekie word tans gestoor."</string>
@@ -78,6 +76,8 @@
<string name="accessibility_home" msgid="8217216074895377641">"Tuis"</string>
<string name="accessibility_menu" msgid="316839303324695949">"Kieslys"</string>
<string name="accessibility_recent" msgid="8571350598987952883">"Onlangse programme"</string>
+ <string name="accessibility_search_light" msgid="1103867596330271848">"Deursoek"</string>
+ <string name="accessibility_camera_button" msgid="8064671582820358152">"Kamera"</string>
<string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Knoppie vir wissel van invoermetode."</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Versoenbaarheid-zoem se knoppie."</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Zoem kleiner na groter skerm."</string>
@@ -153,6 +153,7 @@
<string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"Battery <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_airplane" msgid="4196876722090224753">"Vliegtuigmodus <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="5749054971341882340">"Bluetooth <xliff:g id="STATE">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_location" msgid="4577282329866813100">"Ligging <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"Wekker gestel vir <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"2G-3G-data gedeaktiveer"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"4G data gedeaktiveer"</string>
@@ -164,12 +165,13 @@
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Wi-Fi gekoppel"</string>
<string name="gps_notification_searching_text" msgid="8574247005642736060">"Soek vir GPS"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"Ligging deur GPS gestel"</string>
+ <string name="accessibility_location_active" msgid="2427290146138169014">"Liggingversoeke aktief"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"Verwyder alle kennisgewings."</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Programinligting"</string>
<string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Die skerm sal outomaties draai."</string>
<string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Skerm is in landskapsoriëntasie gesluit."</string>
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Skerm is in portretoriëntasie gesluit."</string>
- <string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
+ <string name="dessert_case" msgid="1295161776223959221">"Nageregkas"</string>
<string name="start_dreams" msgid="7219575858348719790">"Sluimer"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
<string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Vliegtuigmodus"</string>
@@ -182,10 +184,8 @@
<string name="quick_settings_rotation_unlocked_label" msgid="336054930362580584">"Outoroteer"</string>
<string name="quick_settings_rotation_locked_label" msgid="8058646447242565486">"Rotasie gesluit"</string>
<string name="quick_settings_ime_label" msgid="7073463064369468429">"Invoermetode"</string>
- <!-- no translation found for quick_settings_location_label (5011327048748762257) -->
- <skip />
- <!-- no translation found for quick_settings_location_off_label (7464544086507331459) -->
- <skip />
+ <string name="quick_settings_location_label" msgid="5011327048748762257">"Ligging"</string>
+ <string name="quick_settings_location_off_label" msgid="7464544086507331459">"Ligging af"</string>
<string name="quick_settings_media_device_label" msgid="1302906836372603762">"Mediatoestel"</string>
<string name="quick_settings_rssi_label" msgid="7725671335550695589">"RSSI"</string>
<string name="quick_settings_rssi_emergency_only" msgid="2713774041672886750">"Net noodoproepe"</string>
@@ -200,8 +200,8 @@
<string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Draadlose aansig"</string>
<string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Helderheid"</string>
<string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"OUTO"</string>
- <string name="status_bar_help_title" msgid="1199237744086469217">"Kennisgewings verskyn hier"</string>
- <string name="status_bar_help_text" msgid="7874607155052076323">"Verkry enige tyd toegang tot hulle deur af te sleep.\nSleep weer af vir stelselkontroles."</string>
- <string name="hideybar_confirmation_message" msgid="9050869548951044371">"Sleep rand van skerm om balk te wys"</string>
- <string name="hideybar_confirmation_message_long" msgid="7117692795163620626">"Sleep van rand van skerm af om stelselbalk te wys"</string>
+ <string name="quick_settings_inversion_label" msgid="1666358784283020762">"Kleur-omkeringmodus"</string>
+ <string name="quick_settings_contrast_label" msgid="3319507551689108692">"Verbeterde kontrasmodus"</string>
+ <string name="quick_settings_color_space_label" msgid="853443689745584770">"Kleurregstellingmodus"</string>
+ <string name="ssl_ca_cert_warning" msgid="9005954106902053641">"Netwerk word\ndalk gemonitor"</string>
</resources>
diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml
index 1d81ea7..7054d15 100644
--- a/packages/SystemUI/res/values-am/strings.xml
+++ b/packages/SystemUI/res/values-am/strings.xml
@@ -61,8 +61,6 @@
<string name="usb_debugging_always" msgid="303335496705863070">"áˆáˆáŒŠá‹œ ከዚህ ኮáˆá’á‹á‰°áˆ­ áቀድ"</string>
<string name="compat_mode_on" msgid="6623839244840638213">"ማያ እንዲሞላ አጉላ"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"ማያ ለመሙለት ሳብ"</string>
- <string name="compat_mode_help_header" msgid="7969493989397529910">"የተኳኋáŠáŠá‰µ አጉላ"</string>
- <string name="compat_mode_help_body" msgid="4946726776359270040">"ትáŒá‰ áˆ« ለትንሽ ማያ ሲáŠá‹°áᣠየአጉላ መቆመጣጠሪያ በሰዓት በኩሠብቅ ይላáˆá¢"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"ቅጽበታዊ ገጽ እይታ በማስቀመጥ ላይ..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"ቅጽበታዊ ገጽ እይታ በማስቀመጥ ላይ..."</string>
<string name="screenshot_saving_text" msgid="2419718443411738818">"ቅጽበታዊ ገጽ እይታ እየተቀመጠ áŠá‹::"</string>
@@ -78,6 +76,8 @@
<string name="accessibility_home" msgid="8217216074895377641">"መáŠáˆ»"</string>
<string name="accessibility_menu" msgid="316839303324695949">"áˆáŠ“áˆŒ"</string>
<string name="accessibility_recent" msgid="8571350598987952883">"የቅርብ ጊዜ መተáŒá‰ áˆªá‹«á‹Žá‰½"</string>
+ <string name="accessibility_search_light" msgid="1103867596330271848">"áˆáˆáŒ"</string>
+ <string name="accessibility_camera_button" msgid="8064671582820358152">"ካሜራ"</string>
<string name="accessibility_ime_switch_button" msgid="5032926134740456424">"የáŒá‰¤á‰µ ስáˆá‰µ አá‹áˆ«áˆ­ ቀይር"</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"የተኳኋáŠáŠ áŒ‰áˆ‹ አá‹áˆ«áˆ­á¢"</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"አáŠáˆµá‰°áŠ›á‹áŠ• ማያ ወደ ትáˆá‰… አጉላá¢"</string>
@@ -153,6 +153,7 @@
<string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"ባትሪ <xliff:g id="STATE">%s</xliff:g>á¢"</string>
<string name="accessibility_quick_settings_airplane" msgid="4196876722090224753">"የአá‹áˆ®á•ላን áˆáŠá‰³ <xliff:g id="STATE">%s</xliff:g>á¢"</string>
<string name="accessibility_quick_settings_bluetooth" msgid="5749054971341882340">"ብሉቱዠ<xliff:g id="STATE">%s</xliff:g>á¢"</string>
+ <string name="accessibility_quick_settings_location" msgid="4577282329866813100">"አካባቢ <xliff:g id="STATE">%s</xliff:g>á¢"</string>
<string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"ማንቂያ ለ<xliff:g id="TIME">%s</xliff:g> ተዋቅሯáˆá¢"</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"2G-3G á‹áˆ‚ብ ቦá‹áŠ—áˆ"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"4G á‹áˆ‚ብ ቦá‹áŠ—áˆ"</string>
@@ -164,12 +165,13 @@
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Wi-Fi ተያይዟáˆ"</string>
<string name="gps_notification_searching_text" msgid="8574247005642736060">"ለGPS በመáˆáˆˆáŒ ላይ"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"በ GPS የተዘጋጀ ሥáራ"</string>
+ <string name="accessibility_location_active" msgid="2427290146138169014">"የአካባቢ ጥያቄዎች áŠá‰…ተዋáˆ"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"áˆáˆ‰áŠ•áˆ áˆ›áˆ³á‹ˆá‰‚á‹«á‹Žá‰½ አጽዳ"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"የመተáŒá‰ áˆªá‹« መረጃ"</string>
<string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"ማያ ገጽ በራስ ሰር ይዞራáˆá¢"</string>
<string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"ማያ ገጽ በወርድ áŒˆá… áŠ á‰€áˆ›áˆ˜áŒ¥ ተቆáˆááˆá¢"</string>
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"ማያ ገጽ በá‰áˆ áŒˆá… áŠ á‰€áˆ›áˆ˜áŒ¥ ተቆáˆááˆá¢"</string>
- <string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
+ <string name="dessert_case" msgid="1295161776223959221">"የማወራረጃ áˆáŒá‰¦á‰½ መያዣ"</string>
<string name="start_dreams" msgid="7219575858348719790">"የቀን ህáˆáˆ"</string>
<string name="ethernet_label" msgid="7967563676324087464">"ኤተርኔት"</string>
<string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"የአá‹áˆ®á•ላን áˆáŠá‰³"</string>
@@ -198,8 +200,8 @@
<string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"ገመድ አáˆá‰£ ማሳያ"</string>
<string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"ብሩህáŠá‰µ"</string>
<string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"ራስ-ሰር"</string>
- <string name="status_bar_help_title" msgid="1199237744086469217">"ማሳወቂያዎች እዚህ ላይ ይታያሉ"</string>
- <string name="status_bar_help_text" msgid="7874607155052076323">"ወደ ታች በማንሸራተት በማንኛá‹áˆ ጊዜ ይድረሱባቸá‹á¢\nSwipe የስርዓት መቆጣጠሪያዎችን ለማáˆáŒ£á‰µ እንደገና ወደ ታች ያንሸራትቱá¢"</string>
- <string name="hideybar_confirmation_message" msgid="9050869548951044371">"አሞሌá‹áŠ• ለማሳየት የማያ ገጹን ጠርዠላይ ያንሸራትቱ"</string>
- <string name="hideybar_confirmation_message_long" msgid="7117692795163620626">"አሞሌá‹áŠ• ለማሳየት ከማያ ገጹ ጠርዠጀáˆáˆ¨á‹ ያንሸራትቱ"</string>
+ <string name="quick_settings_inversion_label" msgid="1666358784283020762">"የተቃራኒ ቀለሠáˆáŠá‰³"</string>
+ <string name="quick_settings_contrast_label" msgid="3319507551689108692">"የተሻሻለ ንá…á…ር áˆáŠá‰³"</string>
+ <string name="quick_settings_color_space_label" msgid="853443689745584770">"የቀለሠእርማት áˆáŠá‰³"</string>
+ <string name="ssl_ca_cert_warning" msgid="9005954106902053641">"አá‹á‰³áˆ¨ መረብ\nክትትሠሊደረáŒá‰ á‰µ ይችላáˆ"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml
index c31d6d9..70586de 100644
--- a/packages/SystemUI/res/values-ar/strings.xml
+++ b/packages/SystemUI/res/values-ar/strings.xml
@@ -27,15 +27,15 @@
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"إزالة التطبيقات الحديثة"</string>
<plurals name="status_bar_accessibility_recent_apps">
<item quantity="one" msgid="5854176083865845541">"تطبيق حديث واحد"</item>
- <item quantity="other" msgid="1040784359794890744">"%d من التطبيقات الحديثة"</item>
+ <item quantity="other" msgid="1040784359794890744">"â€%d من التطبيقات الحديثة"</item>
</plurals>
- <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"ليس هناك أي تنبيهات"</string>
+ <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"ليس هناك أي اشعارات"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"مستمر"</string>
- <string name="status_bar_latest_events_title" msgid="6594767438577593172">"التنبيهات"</string>
+ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"الإشعارات"</string>
<string name="battery_low_title" msgid="2783104807551211639">"توصيل الشاحن"</string>
<string name="battery_low_subtitle" msgid="1752040062087829196">"Ø§Ù†Ø®ÙØ¶Øª طاقة البطارية."</string>
<string name="battery_low_percent_format" msgid="1077244949318261761">"المتبقي: <xliff:g id="NUMBER">%d%%</xliff:g>"</string>
- <string name="invalid_charger" msgid="4549105996740522523">"شحن USB غير معتمد.\nاستخدم الشاحن Ø§Ù„Ù…ÙˆÙØ± Ùقط."</string>
+ <string name="invalid_charger" msgid="4549105996740522523">"â€Ø´Ø­Ù† USB غير معتمد.\nاستخدم الشاحن Ø§Ù„Ù…ÙˆÙØ± Ùقط."</string>
<string name="battery_low_why" msgid="7279169609518386372">"استخدام البطارية"</string>
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"الإعدادات"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
@@ -43,26 +43,24 @@
<string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"التدوير التلقائي للشاشة"</string>
<string name="status_bar_settings_mute_label" msgid="554682549917429396">"كتم"</string>
<string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"تلقائي"</string>
- <string name="status_bar_settings_notifications" msgid="397146176280905137">"التنبيهات"</string>
+ <string name="status_bar_settings_notifications" msgid="397146176280905137">"الإشعارات"</string>
<string name="bluetooth_tethered" msgid="7094101612161133267">"تم إنشاء الاتصال بالإنترنت عن طريق البلوتوث."</string>
<string name="status_bar_input_method_settings_configure_input_methods" msgid="3504292471512317827">"إعداد أسلوب الإدخال"</string>
<string name="status_bar_use_physical_keyboard" msgid="7551903084416057810">"لوحة Ù…ÙØ§ØªÙŠØ­ ÙØ¹Ù„ية"</string>
- <string name="usb_device_permission_prompt" msgid="834698001271562057">"هل تريد السماح للتطبيق <xliff:g id="APPLICATION">%1$s</xliff:g> بالدخول إلى جهاز USB؟"</string>
- <string name="usb_accessory_permission_prompt" msgid="5171775411178865750">"هل تريد السماح للتطبيق <xliff:g id="APPLICATION">%1$s</xliff:g> بالدخول إلى ملحق USB؟"</string>
- <string name="usb_device_confirm_prompt" msgid="5161205258635253206">"هل تريد ÙØªØ­ <xliff:g id="ACTIVITY">%1$s</xliff:g> عند توصيل جهاز USB هذا؟"</string>
- <string name="usb_accessory_confirm_prompt" msgid="3808984931830229888">"هل تريد ÙØªØ­ <xliff:g id="ACTIVITY">%1$s</xliff:g> عند توصيل ملحق USB هذا؟"</string>
- <string name="usb_accessory_uri_prompt" msgid="513450621413733343">"لا يعمل أي تطبيق مثبت مع ملحق UEB هذا. مزيد من المعلومات عن هذا الملحق على <xliff:g id="URL">%1$s</xliff:g>."</string>
- <string name="title_usb_accessory" msgid="4966265263465181372">"ملحق USB"</string>
+ <string name="usb_device_permission_prompt" msgid="834698001271562057">"â€Ù‡Ù„ تريد السماح للتطبيق <xliff:g id="APPLICATION">%1$s</xliff:g> بالدخول إلى جهاز USBØŸ"</string>
+ <string name="usb_accessory_permission_prompt" msgid="5171775411178865750">"â€Ù‡Ù„ تريد السماح للتطبيق <xliff:g id="APPLICATION">%1$s</xliff:g> بالدخول إلى ملحق USBØŸ"</string>
+ <string name="usb_device_confirm_prompt" msgid="5161205258635253206">"â€Ù‡Ù„ تريد ÙØªØ­ <xliff:g id="ACTIVITY">%1$s</xliff:g> عند توصيل جهاز USB هذا؟"</string>
+ <string name="usb_accessory_confirm_prompt" msgid="3808984931830229888">"â€Ù‡Ù„ تريد ÙØªØ­ <xliff:g id="ACTIVITY">%1$s</xliff:g> عند توصيل ملحق USB هذا؟"</string>
+ <string name="usb_accessory_uri_prompt" msgid="513450621413733343">"â€Ù„ا يعمل أي تطبيق مثبت مع ملحق UEB هذا. مزيد من المعلومات عن هذا الملحق على <xliff:g id="URL">%1$s</xliff:g>."</string>
+ <string name="title_usb_accessory" msgid="4966265263465181372">"â€Ù…لحق USB"</string>
<string name="label_view" msgid="6304565553218192990">"عرض"</string>
- <string name="always_use_device" msgid="1450287437017315906">"الاستخدام بشكل Ø§ÙØªØ±Ø§Ø¶ÙŠ Ù„Ø¬Ù‡Ø§Ø² USB هذا"</string>
- <string name="always_use_accessory" msgid="1210954576979621596">"الاستخدام بشكل Ø§ÙØªØ±Ø§Ø¶ÙŠ Ù„Ù…Ù„Ø­Ù‚ USB هذا"</string>
- <string name="usb_debugging_title" msgid="4513918393387141949">"هل تريد السماح بتصحيح أخطاء USB؟"</string>
- <string name="usb_debugging_message" msgid="2220143855912376496">"المل٠المرجعي الرئيسي لـ RSA ÙÙŠ هذا الكمبيوتر هو:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
+ <string name="always_use_device" msgid="1450287437017315906">"â€Ø§Ù„استخدام بشكل Ø§ÙØªØ±Ø§Ø¶ÙŠ Ù„Ø¬Ù‡Ø§Ø² USB هذا"</string>
+ <string name="always_use_accessory" msgid="1210954576979621596">"â€Ø§Ù„استخدام بشكل Ø§ÙØªØ±Ø§Ø¶ÙŠ Ù„Ù…Ù„Ø­Ù‚ USB هذا"</string>
+ <string name="usb_debugging_title" msgid="4513918393387141949">"â€Ù‡Ù„ تريد السماح بتصحيح أخطاء USBØŸ"</string>
+ <string name="usb_debugging_message" msgid="2220143855912376496">"â€Ø§Ù„مل٠المرجعي الرئيسي لـ RSA ÙÙŠ هذا الكمبيوتر هو:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"السماح دائمًا من هذا الكمبيوتر"</string>
<string name="compat_mode_on" msgid="6623839244840638213">"تكبير/تصغير لملء الشاشة"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"توسيع بملء الشاشة"</string>
- <string name="compat_mode_help_header" msgid="7969493989397529910">"تكبير/تصغير التواÙÙ‚"</string>
- <string name="compat_mode_help_body" msgid="4946726776359270040">"عند تصميم تطبيق لشاشة أصغر، سيظهر عنصر تحكم ÙÙŠ التكبير/التصغير بجوار الساعة."</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Ø¬Ø§Ø±Ù Ø­ÙØ¸ لقطة الشاشة..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Ø¬Ø§Ø±Ù Ø­ÙØ¸ لقطة الشاشة..."</string>
<string name="screenshot_saving_text" msgid="2419718443411738818">"يتم Ø­ÙØ¸ لقطة."</string>
@@ -70,14 +68,16 @@
<string name="screenshot_saved_text" msgid="1152839647677558815">"المس لعرض لقطة الشاشة."</string>
<string name="screenshot_failed_title" msgid="705781116746922771">"تعذر التقاط لقطة الشاشة."</string>
<string name="screenshot_failed_text" msgid="8134011269572415402">"تعذر Ø­ÙØ¸ لقطة الشاشة. قد يكون التخزين قيد الاستخدام."</string>
- <string name="usb_preference_title" msgid="6551050377388882787">"خيارات نقل Ø§Ù„Ù…Ù„ÙØ§Øª عبر USB"</string>
- <string name="use_mtp_button_title" msgid="4333504413563023626">"تحميل كمشغل وسائط (MTP)"</string>
- <string name="use_ptp_button_title" msgid="7517127540301625751">"تحميل ككاميرا (PTP)"</string>
- <string name="installer_cd_button_title" msgid="2312667578562201583">"تثبيت تطبيق Android File Transfer لـ Mac"</string>
+ <string name="usb_preference_title" msgid="6551050377388882787">"â€Ø®ÙŠØ§Ø±Ø§Øª نقل Ø§Ù„Ù…Ù„ÙØ§Øª عبر USB"</string>
+ <string name="use_mtp_button_title" msgid="4333504413563023626">"â€ØªØ­Ù…يل كمشغل وسائط (MTP)"</string>
+ <string name="use_ptp_button_title" msgid="7517127540301625751">"â€ØªØ­Ù…يل ككاميرا (PTP)"</string>
+ <string name="installer_cd_button_title" msgid="2312667578562201583">"â€ØªØ«Ø¨ÙŠØª تطبيق Android File Transfer لـ Mac"</string>
<string name="accessibility_back" msgid="567011538994429120">"رجوع"</string>
<string name="accessibility_home" msgid="8217216074895377641">"الرئيسية"</string>
<string name="accessibility_menu" msgid="316839303324695949">"القائمة"</string>
<string name="accessibility_recent" msgid="8571350598987952883">"التطبيقات الحديثة"</string>
+ <string name="accessibility_search_light" msgid="1103867596330271848">"بحث"</string>
+ <string name="accessibility_camera_button" msgid="8064671582820358152">"الكاميرا"</string>
<string name="accessibility_ime_switch_button" msgid="5032926134740456424">"زر تبديل طريقة الإدخال."</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"زر تكبير/تصغير للتواÙÙ‚."</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"استخدام التكبير/التصغير لتحويل شاشة صغيرة إلى شاشة أكبر"</string>
@@ -98,17 +98,17 @@
<string name="accessibility_data_two_bars" msgid="6166018492360432091">"إشارة البيانات تتكون من شريطين."</string>
<string name="accessibility_data_three_bars" msgid="9167670452395038520">"إشارة البيانات تتكون من ثلاثة أشرطة."</string>
<string name="accessibility_data_signal_full" msgid="2708384608124519369">"إشارة البيانات كاملة."</string>
- <string name="accessibility_wifi_off" msgid="3177380296697933627">"تم إيقا٠Wi-Fi."</string>
- <string name="accessibility_no_wifi" msgid="1425476551827924474">"تم قطع اتصال Wi-Fi."</string>
- <string name="accessibility_wifi_one_bar" msgid="7735893178010724377">"إشارة Wi-Fi تتكون من شريط واحد."</string>
- <string name="accessibility_wifi_two_bars" msgid="4994274250497262434">"إشارة Wi-Fi تتكون من شريطين."</string>
- <string name="accessibility_wifi_three_bars" msgid="3495755044276588384">"إشارة Wi-Fi تتكون من ثلاثة أشرطة."</string>
- <string name="accessibility_wifi_signal_full" msgid="6853561303586480376">"إشارة Wi-Fi كاملة."</string>
- <string name="accessibility_no_wimax" msgid="4329180129727630368">"ليس هناك WiMAX."</string>
- <string name="accessibility_wimax_one_bar" msgid="4170994299011863648">"شريط WiMAX واحد."</string>
- <string name="accessibility_wimax_two_bars" msgid="9176236858336502288">"شريطا WiMAX."</string>
- <string name="accessibility_wimax_three_bars" msgid="6116551636752103927">"أشرطة WiMAX الثلاثة."</string>
- <string name="accessibility_wimax_signal_full" msgid="2768089986795579558">"إشارة WiMAX كاملة."</string>
+ <string name="accessibility_wifi_off" msgid="3177380296697933627">"â€ØªÙ… إيقا٠Wi-Fi."</string>
+ <string name="accessibility_no_wifi" msgid="1425476551827924474">"â€ØªÙ… قطع اتصال Wi-Fi."</string>
+ <string name="accessibility_wifi_one_bar" msgid="7735893178010724377">"â€Ø¥Ø´Ø§Ø±Ø© Wi-Fi تتكون من شريط واحد."</string>
+ <string name="accessibility_wifi_two_bars" msgid="4994274250497262434">"â€Ø¥Ø´Ø§Ø±Ø© Wi-Fi تتكون من شريطين."</string>
+ <string name="accessibility_wifi_three_bars" msgid="3495755044276588384">"â€Ø¥Ø´Ø§Ø±Ø© Wi-Fi تتكون من ثلاثة أشرطة."</string>
+ <string name="accessibility_wifi_signal_full" msgid="6853561303586480376">"â€Ø¥Ø´Ø§Ø±Ø© Wi-Fi كاملة."</string>
+ <string name="accessibility_no_wimax" msgid="4329180129727630368">"â€Ù„يس هناك WiMAX."</string>
+ <string name="accessibility_wimax_one_bar" msgid="4170994299011863648">"â€Ø´Ø±ÙŠØ· WiMAX واحد."</string>
+ <string name="accessibility_wimax_two_bars" msgid="9176236858336502288">"â€Ø´Ø±ÙŠØ·Ø§ WiMAX."</string>
+ <string name="accessibility_wimax_three_bars" msgid="6116551636752103927">"â€Ø£Ø´Ø±Ø·Ø© WiMAX الثلاثة."</string>
+ <string name="accessibility_wimax_signal_full" msgid="2768089986795579558">"â€Ø¥Ø´Ø§Ø±Ø© WiMAX كاملة."</string>
<string name="accessibility_no_signal" msgid="7064645320782585167">"ليست هناك إشارة."</string>
<string name="accessibility_not_connected" msgid="6395326276213402883">"غير متصل."</string>
<string name="accessibility_zero_bars" msgid="3806060224467027887">"ليست هناك أشرطة."</string>
@@ -123,22 +123,22 @@
<string name="accessibility_data_connection_1x" msgid="994133468120244018">"1‎ X‎"</string>
<string name="accessibility_data_connection_hspa" msgid="2032328855462645198">"HSPA"</string>
<string name="accessibility_data_connection_3g" msgid="8628562305003568260">"شبكة الجيل الثالث"</string>
- <string name="accessibility_data_connection_3.5g" msgid="8664845609981692001">"شبكة 3.5G"</string>
+ <string name="accessibility_data_connection_3.5g" msgid="8664845609981692001">"â€Ø´Ø¨ÙƒØ© 3.5G"</string>
<string name="accessibility_data_connection_4g" msgid="7741000750630089612">"شبكة الجيل الرابع"</string>
<string name="accessibility_data_connection_lte" msgid="5413468808637540658">"LTE"</string>
<string name="accessibility_data_connection_cdma" msgid="6132648193978823023">"CDMA"</string>
<string name="accessibility_data_connection_roaming" msgid="5977362333466556094">"تجوال"</string>
<string name="accessibility_data_connection_edge" msgid="4477457051631979278">"Edge"</string>
<string name="accessibility_data_connection_wifi" msgid="2324496756590645221">"Wi-Fi"</string>
- <string name="accessibility_no_sim" msgid="8274017118472455155">"ليست هناك بطاقة SIM."</string>
+ <string name="accessibility_no_sim" msgid="8274017118472455155">"â€Ù„يست هناك بطاقة SIM."</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"ربط البلوتوث."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"وضع الطائرة."</string>
<string name="accessibility_battery_level" msgid="7451474187113371965">"مستوى البطارية <xliff:g id="NUMBER">%d</xliff:g> ÙÙŠ المائة."</string>
<string name="accessibility_settings_button" msgid="799583911231893380">"إعدادات النظام."</string>
<string name="accessibility_notifications_button" msgid="4498000369779421892">"الإشعارات."</string>
<string name="accessibility_remove_notification" msgid="3603099514902182350">"محو الإشعار."</string>
- <string name="accessibility_gps_enabled" msgid="3511469499240123019">"تم تمكين GPS."</string>
- <string name="accessibility_gps_acquiring" msgid="8959333351058967158">"الحصول على GPS."</string>
+ <string name="accessibility_gps_enabled" msgid="3511469499240123019">"â€ØªÙ… تمكين GPS."</string>
+ <string name="accessibility_gps_acquiring" msgid="8959333351058967158">"â€Ø§Ù„حصول على GPS."</string>
<string name="accessibility_tty_enabled" msgid="4613200365379426561">"تم تمكين المبرقة الكاتبة."</string>
<string name="accessibility_ringer_vibrate" msgid="666585363364155055">"رنين مع الاهتزاز."</string>
<string name="accessibility_ringer_silent" msgid="9061243307939135383">"رنين صامت."</string>
@@ -153,6 +153,7 @@
<string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"البطارية <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_airplane" msgid="4196876722090224753">"وضع الطائرة <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="5749054971341882340">"البلوتوث <xliff:g id="STATE">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_location" msgid="4577282329866813100">"حالة الموقع: <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"تم ضبط المنبه على <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"تم تعطيل بيانات شبكات الجيل الثاني والجيل الثالث"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"تم تعطيل بيانات شبكة الجيل الرابع"</string>
@@ -161,15 +162,16 @@
<string name="data_usage_disabled_dialog" msgid="3853117269051806280">"لقد وصلت إلى حد استخدام البيانات المحدد. \n \n إذا أعدت تمكين البيانات ØŒ Ùقد يتم تحصيل رسوم منك من قبل مشغل شبكة الجوال."</string>
<string name="data_usage_disabled_dialog_enable" msgid="7729772039208664606">"إعادة تمكين البيانات"</string>
<string name="status_bar_settings_signal_meter_disconnected" msgid="1940231521274147771">"لا يوجد اتصال إنترنت"</string>
- <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Wi-Fi متصل"</string>
- <string name="gps_notification_searching_text" msgid="8574247005642736060">"جار٠البحث عن GPS"</string>
- <string name="gps_notification_found_text" msgid="4619274244146446464">"تم تعيين الموقع بواسطة GPS"</string>
+ <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"â€Wi-Fi متصل"</string>
+ <string name="gps_notification_searching_text" msgid="8574247005642736060">"â€Ø¬Ø§Ø±Ù البحث عن GPS"</string>
+ <string name="gps_notification_found_text" msgid="4619274244146446464">"â€ØªÙ… تعيين الموقع بواسطة GPS"</string>
+ <string name="accessibility_location_active" msgid="2427290146138169014">"طلبات الموقع نشطة"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"محو جميع الإشعارات."</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"معلومات التطبيق"</string>
<string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"سيتم تدوير الشاشة تلقائيًا."</string>
<string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"تم تأمين الشاشة ÙÙŠ الاتجاه الأÙقي."</string>
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"تم تأمين الشاشة ÙÙŠ الاتجاه العمودي."</string>
- <string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
+ <string name="dessert_case" msgid="1295161776223959221">"حالة الحلويات"</string>
<string name="start_dreams" msgid="7219575858348719790">"حلم اليقظة"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
<string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"وضع الطائرة"</string>
@@ -193,13 +195,13 @@
<string name="quick_settings_wifi_label" msgid="9135344704899546041">"Wi-Fi"</string>
<string name="quick_settings_wifi_not_connected" msgid="7171904845345573431">"ليست متصلة"</string>
<string name="quick_settings_wifi_no_network" msgid="2221993077220856376">"لا ØªØªÙˆÙØ± شبكة"</string>
- <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"إيقا٠Wi-Fi"</string>
- <string name="quick_settings_wifi_display_label" msgid="6893592964463624333">"عرض Wi-Fi"</string>
+ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"â€Ø¥ÙŠÙ‚ا٠Wi-Fi"</string>
+ <string name="quick_settings_wifi_display_label" msgid="6893592964463624333">"â€Ø¹Ø±Ø¶ Wi-Fi"</string>
<string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"عرض شاشة لاسلكي"</string>
<string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"السطوع"</string>
<string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"تلقائي"</string>
- <string name="status_bar_help_title" msgid="1199237744086469217">"تظهر الإشعارات هنا"</string>
- <string name="status_bar_help_text" msgid="7874607155052076323">"يمكنك الدخول إليها ÙÙŠ أي وقت بالتمرير السريع إلى أسÙÙ„.\nيمكنك التمرير السريع إلى أسÙÙ„ مرة أخرى للوصول إلى عناصر تحكم النظام."</string>
- <string name="hideybar_confirmation_message" msgid="9050869548951044371">"مرر سريعًا Ù„Ø­Ø§ÙØ© الشاشة لإظهار الشريط"</string>
- <string name="hideybar_confirmation_message_long" msgid="7117692795163620626">"مرر سريعًا من Ø­Ø§ÙØ© الشاشة لإظهار شريط النظام"</string>
+ <string name="quick_settings_inversion_label" msgid="1666358784283020762">"وضع انعكاس اللون"</string>
+ <string name="quick_settings_contrast_label" msgid="3319507551689108692">"وضع التباين المحسن"</string>
+ <string name="quick_settings_color_space_label" msgid="853443689745584770">"وضع تصحيح الألوان"</string>
+ <string name="ssl_ca_cert_warning" msgid="9005954106902053641">"قد تكون الشبكة\nخاضعة للرقابة"</string>
</resources>
diff --git a/packages/SystemUI/res/values-az-land/strings.xml b/packages/SystemUI/res/values-az-land/strings.xml
new file mode 100644
index 0000000..8eb6978
--- /dev/null
+++ b/packages/SystemUI/res/values-az-land/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2010, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="toast_rotation_locked" msgid="7609673011431556092">"Hazırda ekran landşaft orientasiyasında kilidlənib."</string>
+</resources>
diff --git a/packages/SystemUI/res/values-az-rAZ-land/strings.xml b/packages/SystemUI/res/values-az-rAZ-land/strings.xml
new file mode 100644
index 0000000..8eb6978
--- /dev/null
+++ b/packages/SystemUI/res/values-az-rAZ-land/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2010, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="toast_rotation_locked" msgid="7609673011431556092">"Hazırda ekran landşaft orientasiyasında kilidlənib."</string>
+</resources>
diff --git a/packages/SystemUI/res/values-az-rAZ/strings.xml b/packages/SystemUI/res/values-az-rAZ/strings.xml
new file mode 100644
index 0000000..9565eee
--- /dev/null
+++ b/packages/SystemUI/res/values-az-rAZ/strings.xml
@@ -0,0 +1,206 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="7164937344850004466">"Sistemin İstifadə İnterfeysi"</string>
+ <string name="status_bar_clear_all_button" msgid="7774721344716731603">"Təmizlə"</string>
+ <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Siyahıdan sil"</string>
+ <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Tətbiq infosu"</string>
+ <string name="status_bar_no_recent_apps" msgid="6576392951053994640">"Yeni tətbiq yoxdur"</string>
+ <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Son tətbiqləri kənarlaşdır"</string>
+ <plurals name="status_bar_accessibility_recent_apps">
+ <item quantity="one" msgid="5854176083865845541">"1 son tətbiq"</item>
+ <item quantity="other" msgid="1040784359794890744">"%d son tətbiq"</item>
+ </plurals>
+ <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"BildiriÅŸ yoxdu"</string>
+ <string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Davam edir"</string>
+ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Bildirişlər"</string>
+ <string name="battery_low_title" msgid="2783104807551211639">"Adapteri qoÅŸun"</string>
+ <string name="battery_low_subtitle" msgid="1752040062087829196">"Batareya azalır."</string>
+ <string name="battery_low_percent_format" msgid="1077244949318261761">"<xliff:g id="NUMBER">%d%%</xliff:g> qalıb"</string>
+ <string name="invalid_charger" msgid="4549105996740522523">"USB ilə elektrik doldurma dəstəklənmir.\nYalnız adapter istifadə edin."</string>
+ <string name="battery_low_why" msgid="7279169609518386372">"Batareya istifadəsi"</string>
+ <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Ayarlar"</string>
+ <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
+ <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Təyyarə rejimi"</string>
+ <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"Ekranın avto-dönüşü"</string>
+ <string name="status_bar_settings_mute_label" msgid="554682549917429396">"SUSDUR"</string>
+ <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"AVTO"</string>
+ <string name="status_bar_settings_notifications" msgid="397146176280905137">"Bildirişlər"</string>
+ <string name="bluetooth_tethered" msgid="7094101612161133267">"Bluetooth tezerinq"</string>
+ <string name="status_bar_input_method_settings_configure_input_methods" msgid="3504292471512317827">"Daxiletmə metodlarını ayarlayın"</string>
+ <string name="status_bar_use_physical_keyboard" msgid="7551903084416057810">"Fiziki klaviatura"</string>
+ <string name="usb_device_permission_prompt" msgid="834698001271562057">"<xliff:g id="APPLICATION">%1$s</xliff:g> tətbiqinə USB cihazına daxil olmağa icazə verilsin?"</string>
+ <string name="usb_accessory_permission_prompt" msgid="5171775411178865750">"<xliff:g id="APPLICATION">%1$s</xliff:g> tətbiqinə USB aksesuarına qoşulmağa icazə verirsiniz?"</string>
+ <string name="usb_device_confirm_prompt" msgid="5161205258635253206">"USB cihaz qoşulu olan zaman <xliff:g id="ACTIVITY">%1$s</xliff:g> açılsın mı?"</string>
+ <string name="usb_accessory_confirm_prompt" msgid="3808984931830229888">"USB aksesuar qoşulu olan zaman <xliff:g id="ACTIVITY">%1$s</xliff:g> açılsın mı?"</string>
+ <string name="usb_accessory_uri_prompt" msgid="513450621413733343">"Heç bir quraşdırılmış tətbiq bu USB aksesuar ilə işləmir. Bu aksesuar haqqında daha ətraflı məlumatı <xliff:g id="URL">%1$s</xliff:g> adresindən öyrənin"</string>
+ <string name="title_usb_accessory" msgid="4966265263465181372">"USB aksesuar"</string>
+ <string name="label_view" msgid="6304565553218192990">"Göstər"</string>
+ <string name="always_use_device" msgid="1450287437017315906">"Bu USB cihaz üçün defolt olaraq istifadə edin."</string>
+ <string name="always_use_accessory" msgid="1210954576979621596">"Bu USB aksesuar üçün defolt istifadə edin"</string>
+ <string name="usb_debugging_title" msgid="4513918393387141949">"USB sazlamaya icazÉ™ verilsin?"</string>
+ <string name="usb_debugging_message" msgid="2220143855912376496">"Kompüterin RSA barmaq izi: \n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
+ <string name="usb_debugging_always" msgid="303335496705863070">"Bu kompüterdən həmişə icazə verilsin"</string>
+ <string name="compat_mode_on" msgid="6623839244840638213">"Ekranı doldurmaq üçün yaxınlaşdır"</string>
+ <string name="compat_mode_off" msgid="4434467572461327898">"Ekranı doldurmaq üçün uzat"</string>
+ <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Skrinşot yadda saxlanılır..."</string>
+ <string name="screenshot_saving_title" msgid="8242282144535555697">"Skrinşot yadda saxlanır..."</string>
+ <string name="screenshot_saving_text" msgid="2419718443411738818">"Skrinşot yadda saxlanır."</string>
+ <string name="screenshot_saved_title" msgid="6461865960961414961">"Skrinşot çəkildi."</string>
+ <string name="screenshot_saved_text" msgid="1152839647677558815">"Skrinşotunuza baxmaq üçün toxunun"</string>
+ <string name="screenshot_failed_title" msgid="705781116746922771">"Skrinşot götürülə bilinmədi."</string>
+ <string name="screenshot_failed_text" msgid="8134011269572415402">"Skrinşotu yadda saxlamaq alınmadı, yəqin yaddaş istifadə olunur."</string>
+ <string name="usb_preference_title" msgid="6551050377388882787">"USB fayl transferi seçimləri"</string>
+ <string name="use_mtp_button_title" msgid="4333504413563023626">"Media pleyer (MTP) kimi montaj edin"</string>
+ <string name="use_ptp_button_title" msgid="7517127540301625751">"Kamera kimi birləşdir (PTP)"</string>
+ <string name="installer_cd_button_title" msgid="2312667578562201583">"Mac üçün Android File Transfer tətbiqini quraşdırın"</string>
+ <string name="accessibility_back" msgid="567011538994429120">"Geri"</string>
+ <string name="accessibility_home" msgid="8217216074895377641">"Ana səhifə"</string>
+ <string name="accessibility_menu" msgid="316839303324695949">"Menyu"</string>
+ <string name="accessibility_recent" msgid="8571350598987952883">"Son tətbiqlər"</string>
+ <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Daxiletmə metodu düyməsinə keç"</string>
+ <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Uyğunluq zoom düyməsi."</string>
+ <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Daha böyük ekranda uzaqlaşdır."</string>
+ <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth qoÅŸulub."</string>
+ <string name="accessibility_bluetooth_disconnected" msgid="7416648669976870175">"Bluetooth əlaqəsi kəsildi."</string>
+ <string name="accessibility_no_battery" msgid="358343022352820946">"Batareya yoxdur."</string>
+ <string name="accessibility_battery_one_bar" msgid="7774887721891057523">"Batareya bir xətdir."</string>
+ <string name="accessibility_battery_two_bars" msgid="8500650438735009973">"Batareya iki xətdir."</string>
+ <string name="accessibility_battery_three_bars" msgid="2302983330865040446">"Batareya üç xətdir."</string>
+ <string name="accessibility_battery_full" msgid="8909122401720158582">"Batareya doludur"</string>
+ <string name="accessibility_no_phone" msgid="4894708937052611281">"Telefon yoxdur."</string>
+ <string name="accessibility_phone_one_bar" msgid="687699278132664115">"Şəbəkə bir xətdir."</string>
+ <string name="accessibility_phone_two_bars" msgid="8384905382804815201">"Şəbəkə iki xətdir."</string>
+ <string name="accessibility_phone_three_bars" msgid="8521904843919971885">"Şəbəkə üç xətdir."</string>
+ <string name="accessibility_phone_signal_full" msgid="6471834868580757898">"Tam şəbəkə."</string>
+ <string name="accessibility_no_data" msgid="4791966295096867555">"Məlumat yoxdur."</string>
+ <string name="accessibility_data_one_bar" msgid="1415625833238273628">"Data bir xətdir."</string>
+ <string name="accessibility_data_two_bars" msgid="6166018492360432091">"Data iki xətdir."</string>
+ <string name="accessibility_data_three_bars" msgid="9167670452395038520">"Data üç xətdir."</string>
+ <string name="accessibility_data_signal_full" msgid="2708384608124519369">"Data siqnalı tamdır."</string>
+ <string name="accessibility_wifi_off" msgid="3177380296697933627">"Wifi sönülüdür."</string>
+ <string name="accessibility_no_wifi" msgid="1425476551827924474">"Wifi bağlantı kəsildi."</string>
+ <string name="accessibility_wifi_one_bar" msgid="7735893178010724377">"Wifi bir xətdir."</string>
+ <string name="accessibility_wifi_two_bars" msgid="4994274250497262434">"Wifi iki xətdir."</string>
+ <string name="accessibility_wifi_three_bars" msgid="3495755044276588384">"Wifi üç xətdir."</string>
+ <string name="accessibility_wifi_signal_full" msgid="6853561303586480376">"Wifi siqnalı tamdır."</string>
+ <string name="accessibility_no_wimax" msgid="4329180129727630368">"WiMAX yoxdur."</string>
+ <string name="accessibility_wimax_one_bar" msgid="4170994299011863648">"WiMAX bir xətt."</string>
+ <string name="accessibility_wimax_two_bars" msgid="9176236858336502288">"WiMAX iki xətdir."</string>
+ <string name="accessibility_wimax_three_bars" msgid="6116551636752103927">"WiMAX üç xətdir."</string>
+ <string name="accessibility_wimax_signal_full" msgid="2768089986795579558">"WiMAX siqnalı tamdır."</string>
+ <string name="accessibility_no_signal" msgid="7064645320782585167">"Siqnal yoxdur."</string>
+ <string name="accessibility_not_connected" msgid="6395326276213402883">"QoÅŸulu deyil."</string>
+ <string name="accessibility_zero_bars" msgid="3806060224467027887">"Sıfır xətt."</string>
+ <string name="accessibility_one_bar" msgid="1685730113192081895">"Bir xətt."</string>
+ <string name="accessibility_two_bars" msgid="6437363648385206679">"İki xətt."</string>
+ <string name="accessibility_three_bars" msgid="2648241415119396648">"Üç xətdir."</string>
+ <string name="accessibility_signal_full" msgid="9122922886519676839">"Siqnal tamdır."</string>
+ <string name="accessibility_desc_on" msgid="2385254693624345265">"Aktiv."</string>
+ <string name="accessibility_desc_off" msgid="6475508157786853157">"Deaktiv"</string>
+ <string name="accessibility_desc_connected" msgid="8366256693719499665">"QoÅŸuludur."</string>
+ <string name="accessibility_data_connection_gprs" msgid="1606477224486747751">"GPRS"</string>
+ <string name="accessibility_data_connection_1x" msgid="994133468120244018">"1 X"</string>
+ <string name="accessibility_data_connection_hspa" msgid="2032328855462645198">"HSPA"</string>
+ <string name="accessibility_data_connection_3g" msgid="8628562305003568260">"3G"</string>
+ <string name="accessibility_data_connection_3.5g" msgid="8664845609981692001">"3.5G"</string>
+ <string name="accessibility_data_connection_4g" msgid="7741000750630089612">"4G"</string>
+ <string name="accessibility_data_connection_lte" msgid="5413468808637540658">"LTE"</string>
+ <string name="accessibility_data_connection_cdma" msgid="6132648193978823023">"CDMA"</string>
+ <string name="accessibility_data_connection_roaming" msgid="5977362333466556094">"Rouminq"</string>
+ <string name="accessibility_data_connection_edge" msgid="4477457051631979278">"Edge"</string>
+ <string name="accessibility_data_connection_wifi" msgid="2324496756590645221">"Wi-Fi"</string>
+ <string name="accessibility_no_sim" msgid="8274017118472455155">"SIM yoxdur"</string>
+ <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Bluetooth tezering."</string>
+ <string name="accessibility_airplane_mode" msgid="834748999790763092">"Uçuş rejimi"</string>
+ <string name="accessibility_battery_level" msgid="7451474187113371965">"Batareya <xliff:g id="NUMBER">%d</xliff:g> faizdir."</string>
+ <string name="accessibility_settings_button" msgid="799583911231893380">"Sistem parametrləri"</string>
+ <string name="accessibility_notifications_button" msgid="4498000369779421892">"Bildirişlər."</string>
+ <string name="accessibility_remove_notification" msgid="3603099514902182350">"Bildirişi təmizlə."</string>
+ <string name="accessibility_gps_enabled" msgid="3511469499240123019">"GPS aktivdir."</string>
+ <string name="accessibility_gps_acquiring" msgid="8959333351058967158">"GPS əldə edilir."</string>
+ <string name="accessibility_tty_enabled" msgid="4613200365379426561">"TeleTypewriter aktivləşdirilib."</string>
+ <string name="accessibility_ringer_vibrate" msgid="666585363364155055">"Zəng vibrasiyası"</string>
+ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"Zəngvuran səssiz."</string>
+ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> çıxarıldı."</string>
+ <string name="accessibility_notification_dismissed" msgid="854211387186306927">"Bildiriş uzaqlaşdırıldı."</string>
+ <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Bildiriş kölgəsi."</string>
+ <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Tez ayarlar."</string>
+ <string name="accessibility_desc_recent_apps" msgid="9014032916410590027">"Axırıncı tətbiqlər."</string>
+ <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"İstifadəçi <xliff:g id="USER">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_wifi" msgid="6099781031669728709">"<xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="NETWORK">%2$s</xliff:g>"</string>
+ <string name="accessibility_quick_settings_mobile" msgid="4876806564086241341">"Mobil <xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="TYPE">%2$s</xliff:g>. <xliff:g id="NETWORK">%3$s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"Batareya <xliff:g id="STATE">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_airplane" msgid="4196876722090224753">"Təyyarə Rejimi <xliff:g id="STATE">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_bluetooth" msgid="5749054971341882340">"Bluetooth <xliff:g id="STATE">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"Alarm <xliff:g id="TIME">%s</xliff:g> üçün qurulub."</string>
+ <string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"2G-3G data qeyri-aktivdir"</string>
+ <string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"4G data deaktiv edildi"</string>
+ <string name="data_usage_disabled_dialog_mobile_title" msgid="1046047248844821202">"Mobil data qeyri-aktivdir"</string>
+ <string name="data_usage_disabled_dialog_title" msgid="2086815304858964954">"Data qeyri-aktivdir"</string>
+ <string name="data_usage_disabled_dialog" msgid="3853117269051806280">"GöstÉ™rilmiÅŸ data istifadÉ™ limitinÉ™ çatdınız.\n\nÆgÉ™r datanı yenidÉ™n aktivləşdirsÉ™niz, operator tÉ™rÉ™findÉ™n É™lavÉ™ tariflÉ™r tÉ™tbiq oluna bilÉ™r."</string>
+ <string name="data_usage_disabled_dialog_enable" msgid="7729772039208664606">"Datanı yenidən aktiv et"</string>
+ <string name="status_bar_settings_signal_meter_disconnected" msgid="1940231521274147771">"İnternet bağlantısı yoxdur"</string>
+ <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Wi-Fi qoÅŸulub"</string>
+ <string name="gps_notification_searching_text" msgid="8574247005642736060">"GPS Axtarışı"</string>
+ <string name="gps_notification_found_text" msgid="4619274244146446464">"Yer GPS tərəfindən müəyyən edildi"</string>
+ <string name="accessibility_location_active" msgid="2427290146138169014">"Məkan sorğuları arxivi"</string>
+ <string name="accessibility_clear_all" msgid="5235938559247164925">"Bütün bildirişləri sil."</string>
+ <string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Tətbiq infosu"</string>
+ <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Ekran avtomatik döndəriləcək."</string>
+ <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Ekran landşaft orientasiyasında kilidlənib."</string>
+ <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Ekran portret orientasiyasında kilidlənib."</string>
+ <string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
+ <string name="start_dreams" msgid="7219575858348719790">"Xəyal"</string>
+ <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
+ <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Uçuş rejimi"</string>
+ <string name="quick_settings_battery_charging_label" msgid="490074774465309209">"Dolur, <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+ <string name="quick_settings_battery_charged_label" msgid="8865413079414246081">"Dolub"</string>
+ <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string>
+ <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (<xliff:g id="NUMBER">%d</xliff:g> Cihaz)"</string>
+ <string name="quick_settings_bluetooth_off_label" msgid="8159652146149219937">"Bluetooth bağlıdır"</string>
+ <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Parlaqlıq"</string>
+ <string name="quick_settings_rotation_unlocked_label" msgid="336054930362580584">"Avtofırlanma"</string>
+ <string name="quick_settings_rotation_locked_label" msgid="8058646447242565486">"Fırlatma kilidlidir"</string>
+ <string name="quick_settings_ime_label" msgid="7073463064369468429">"DaxiletmÉ™ metodu"</string>
+ <string name="quick_settings_location_label" msgid="5011327048748762257">"Yer"</string>
+ <string name="quick_settings_location_off_label" msgid="7464544086507331459">"Yer Deaktiv"</string>
+ <string name="quick_settings_media_device_label" msgid="1302906836372603762">"Media cihazı"</string>
+ <string name="quick_settings_rssi_label" msgid="7725671335550695589">"RSSI"</string>
+ <string name="quick_settings_rssi_emergency_only" msgid="2713774041672886750">"Yalnız fövqəladə zənglər"</string>
+ <string name="quick_settings_settings_label" msgid="5326556592578065401">"Nizamlar"</string>
+ <string name="quick_settings_time_label" msgid="4635969182239736408">"Vaxt"</string>
+ <string name="quick_settings_user_label" msgid="5238995632130897840">"Mən"</string>
+ <string name="quick_settings_wifi_label" msgid="9135344704899546041">"Wi-Fi"</string>
+ <string name="quick_settings_wifi_not_connected" msgid="7171904845345573431">"Bağlantı yoxdur"</string>
+ <string name="quick_settings_wifi_no_network" msgid="2221993077220856376">"Şəbəkə yoxdur"</string>
+ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi sönülüdür"</string>
+ <string name="quick_settings_wifi_display_label" msgid="6893592964463624333">"Wi-Fi Ekran"</string>
+ <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Simsiz Ekran"</string>
+ <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Parlaqlıq"</string>
+ <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AVTO"</string>
+ <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Şəbəkə monitor edilə bilər"</string>
+ <string name="done_button" msgid="1759387181766603361">"Hazırdır"</string>
+ <string name="ssl_ca_cert_dialog_title" msgid="1273796967092027291">"Şəbəkə Monitorinqi"</string>
+ <string name="ssl_ca_cert_info_message" msgid="5430320539555358452">"Bu cihaz <xliff:g id="MANAGING_DOMAIN">%s</xliff:g> tÉ™rÉ™findÉ™n idarÉ™ edilir . \n \n Sizin administrator ÅŸÉ™bÉ™kÉ™ fÉ™aliyyÉ™tinizin, hÉ™mçinin e-poçt, tÉ™tbiqlÉ™r vÉ™ tÉ™hlükÉ™siz veb saytlarınızın monitorinqini etmÉ™yÉ™ qadirdir. \n \n Ætraflı mÉ™lumat üçün administrator ilÉ™ É™laqÉ™ saxlayın."</string>
+ <string name="ssl_ca_cert_warning_message" msgid="2033091656129963669">"Üçüncü tərəf \n şəbəkə fəaliyyətinizin, həmçinin e-poçt, tətbiqlər və təhlükəsiz veb saytlarınızın monitorinqini etməyə qadirdir. . \n \nCihanzınıza yüklənmiş etibarlı etimad bunu mümkün edir."</string>
+ <string name="ssl_ca_cert_settings_button" msgid="7946956977377166709">"Etibarlı etimadları yoxlayın"</string>
+</resources>
diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml
new file mode 100644
index 0000000..cb48aa0
--- /dev/null
+++ b/packages/SystemUI/res/values-az/strings.xml
@@ -0,0 +1,208 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="7164937344850004466">"Sistemin İstifadə İnterfeysi"</string>
+ <string name="status_bar_clear_all_button" msgid="7774721344716731603">"Təmizlə"</string>
+ <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Siyahıdan sil"</string>
+ <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Tətbiq infosu"</string>
+ <string name="status_bar_no_recent_apps" msgid="6576392951053994640">"Yeni tətbiq yoxdur"</string>
+ <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Son tətbiqləri kənarlaşdır"</string>
+ <plurals name="status_bar_accessibility_recent_apps">
+ <item quantity="one" msgid="5854176083865845541">"1 son tətbiq"</item>
+ <item quantity="other" msgid="1040784359794890744">"%d son tətbiq"</item>
+ </plurals>
+ <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"BildiriÅŸ yoxdu"</string>
+ <string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Davam edir"</string>
+ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Bildirişlər"</string>
+ <string name="battery_low_title" msgid="2783104807551211639">"Adapteri qoÅŸun"</string>
+ <string name="battery_low_subtitle" msgid="1752040062087829196">"Batareya azalır."</string>
+ <string name="battery_low_percent_format" msgid="1077244949318261761">"<xliff:g id="NUMBER">%d%%</xliff:g> qalıb"</string>
+ <string name="invalid_charger" msgid="4549105996740522523">"USB ilə elektrik doldurma dəstəklənmir.\nYalnız adapter istifadə edin."</string>
+ <string name="battery_low_why" msgid="7279169609518386372">"Batareya istifadəsi"</string>
+ <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Ayarlar"</string>
+ <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
+ <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Təyyarə rejimi"</string>
+ <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"Ekranın avto-dönüşü"</string>
+ <string name="status_bar_settings_mute_label" msgid="554682549917429396">"SUSDUR"</string>
+ <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"AVTO"</string>
+ <string name="status_bar_settings_notifications" msgid="397146176280905137">"Bildirişlər"</string>
+ <string name="bluetooth_tethered" msgid="7094101612161133267">"Bluetooth tezerinq"</string>
+ <string name="status_bar_input_method_settings_configure_input_methods" msgid="3504292471512317827">"Daxiletmə metodlarını ayarlayın"</string>
+ <string name="status_bar_use_physical_keyboard" msgid="7551903084416057810">"Fiziki klaviatura"</string>
+ <string name="usb_device_permission_prompt" msgid="834698001271562057">"<xliff:g id="APPLICATION">%1$s</xliff:g> tətbiqinə USB cihazına daxil olmağa icazə verilsin?"</string>
+ <string name="usb_accessory_permission_prompt" msgid="5171775411178865750">"<xliff:g id="APPLICATION">%1$s</xliff:g> tətbiqinə USB aksesuarına qoşulmağa icazə verirsiniz?"</string>
+ <string name="usb_device_confirm_prompt" msgid="5161205258635253206">"USB cihaz qoşulu olan zaman <xliff:g id="ACTIVITY">%1$s</xliff:g> açılsın mı?"</string>
+ <string name="usb_accessory_confirm_prompt" msgid="3808984931830229888">"USB aksesuar qoşulu olan zaman <xliff:g id="ACTIVITY">%1$s</xliff:g> açılsın mı?"</string>
+ <string name="usb_accessory_uri_prompt" msgid="513450621413733343">"Heç bir quraşdırılmış tətbiq bu USB aksesuar ilə işləmir. Bu aksesuar haqqında daha ətraflı məlumatı <xliff:g id="URL">%1$s</xliff:g> adresindən öyrənin"</string>
+ <string name="title_usb_accessory" msgid="4966265263465181372">"USB aksesuar"</string>
+ <string name="label_view" msgid="6304565553218192990">"Göstər"</string>
+ <string name="always_use_device" msgid="1450287437017315906">"Bu USB cihaz üçün defolt olaraq istifadə edin."</string>
+ <string name="always_use_accessory" msgid="1210954576979621596">"Bu USB aksesuar üçün defolt istifadə edin"</string>
+ <string name="usb_debugging_title" msgid="4513918393387141949">"USB sazlamaya icazÉ™ verilsin?"</string>
+ <string name="usb_debugging_message" msgid="2220143855912376496">"Kompüterin RSA barmaq izi: \n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
+ <string name="usb_debugging_always" msgid="303335496705863070">"Bu kompüterdən həmişə icazə verilsin"</string>
+ <string name="compat_mode_on" msgid="6623839244840638213">"Ekranı doldurmaq üçün yaxınlaşdır"</string>
+ <string name="compat_mode_off" msgid="4434467572461327898">"Ekranı doldurmaq üçün uzat"</string>
+ <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Skrinşot yadda saxlanılır..."</string>
+ <string name="screenshot_saving_title" msgid="8242282144535555697">"Skrinşot yadda saxlanır..."</string>
+ <string name="screenshot_saving_text" msgid="2419718443411738818">"Skrinşot yadda saxlanır."</string>
+ <string name="screenshot_saved_title" msgid="6461865960961414961">"Skrinşot çəkildi."</string>
+ <string name="screenshot_saved_text" msgid="1152839647677558815">"Skrinşotunuza baxmaq üçün toxunun"</string>
+ <string name="screenshot_failed_title" msgid="705781116746922771">"Skrinşot götürülə bilinmədi."</string>
+ <string name="screenshot_failed_text" msgid="8134011269572415402">"Skrinşotu yadda saxlamaq alınmadı, yəqin yaddaş istifadə olunur."</string>
+ <string name="usb_preference_title" msgid="6551050377388882787">"USB fayl transferi seçimləri"</string>
+ <string name="use_mtp_button_title" msgid="4333504413563023626">"Media pleyer (MTP) kimi montaj edin"</string>
+ <string name="use_ptp_button_title" msgid="7517127540301625751">"Kamera kimi birləşdir (PTP)"</string>
+ <string name="installer_cd_button_title" msgid="2312667578562201583">"Mac üçün Android File Transfer tətbiqini quraşdırın"</string>
+ <string name="accessibility_back" msgid="567011538994429120">"Geri"</string>
+ <string name="accessibility_home" msgid="8217216074895377641">"Ana səhifə"</string>
+ <string name="accessibility_menu" msgid="316839303324695949">"Menyu"</string>
+ <string name="accessibility_recent" msgid="8571350598987952883">"Son tətbiqlər"</string>
+ <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Daxiletmə metodu düyməsinə keç"</string>
+ <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Uyğunluq zoom düyməsi."</string>
+ <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Daha böyük ekranda uzaqlaşdır."</string>
+ <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth qoÅŸulub."</string>
+ <string name="accessibility_bluetooth_disconnected" msgid="7416648669976870175">"Bluetooth əlaqəsi kəsildi."</string>
+ <string name="accessibility_no_battery" msgid="358343022352820946">"Batareya yoxdur."</string>
+ <string name="accessibility_battery_one_bar" msgid="7774887721891057523">"Batareya bir xətdir."</string>
+ <string name="accessibility_battery_two_bars" msgid="8500650438735009973">"Batareya iki xətdir."</string>
+ <string name="accessibility_battery_three_bars" msgid="2302983330865040446">"Batareya üç xətdir."</string>
+ <string name="accessibility_battery_full" msgid="8909122401720158582">"Batareya doludur"</string>
+ <string name="accessibility_no_phone" msgid="4894708937052611281">"Telefon yoxdur."</string>
+ <string name="accessibility_phone_one_bar" msgid="687699278132664115">"Şəbəkə bir xətdir."</string>
+ <string name="accessibility_phone_two_bars" msgid="8384905382804815201">"Şəbəkə iki xətdir."</string>
+ <string name="accessibility_phone_three_bars" msgid="8521904843919971885">"Şəbəkə üç xətdir."</string>
+ <string name="accessibility_phone_signal_full" msgid="6471834868580757898">"Tam şəbəkə."</string>
+ <string name="accessibility_no_data" msgid="4791966295096867555">"Məlumat yoxdur."</string>
+ <string name="accessibility_data_one_bar" msgid="1415625833238273628">"Data bir xətdir."</string>
+ <string name="accessibility_data_two_bars" msgid="6166018492360432091">"Data iki xətdir."</string>
+ <string name="accessibility_data_three_bars" msgid="9167670452395038520">"Data üç xətdir."</string>
+ <string name="accessibility_data_signal_full" msgid="2708384608124519369">"Data siqnalı tamdır."</string>
+ <string name="accessibility_wifi_off" msgid="3177380296697933627">"Wifi sönülüdür."</string>
+ <string name="accessibility_no_wifi" msgid="1425476551827924474">"Wifi bağlantı kəsildi."</string>
+ <string name="accessibility_wifi_one_bar" msgid="7735893178010724377">"Wifi bir xətdir."</string>
+ <string name="accessibility_wifi_two_bars" msgid="4994274250497262434">"Wifi iki xətdir."</string>
+ <string name="accessibility_wifi_three_bars" msgid="3495755044276588384">"Wifi üç xətdir."</string>
+ <string name="accessibility_wifi_signal_full" msgid="6853561303586480376">"Wifi siqnalı tamdır."</string>
+ <string name="accessibility_no_wimax" msgid="4329180129727630368">"WiMAX yoxdur."</string>
+ <string name="accessibility_wimax_one_bar" msgid="4170994299011863648">"WiMAX bir xətt."</string>
+ <string name="accessibility_wimax_two_bars" msgid="9176236858336502288">"WiMAX iki xətdir."</string>
+ <string name="accessibility_wimax_three_bars" msgid="6116551636752103927">"WiMAX üç xətdir."</string>
+ <string name="accessibility_wimax_signal_full" msgid="2768089986795579558">"WiMAX siqnalı tamdır."</string>
+ <string name="accessibility_no_signal" msgid="7064645320782585167">"Siqnal yoxdur."</string>
+ <string name="accessibility_not_connected" msgid="6395326276213402883">"QoÅŸulu deyil."</string>
+ <string name="accessibility_zero_bars" msgid="3806060224467027887">"Sıfır xətt."</string>
+ <string name="accessibility_one_bar" msgid="1685730113192081895">"Bir xətt."</string>
+ <string name="accessibility_two_bars" msgid="6437363648385206679">"İki xətt."</string>
+ <string name="accessibility_three_bars" msgid="2648241415119396648">"Üç xətdir."</string>
+ <string name="accessibility_signal_full" msgid="9122922886519676839">"Siqnal tamdır."</string>
+ <string name="accessibility_desc_on" msgid="2385254693624345265">"Aktiv."</string>
+ <string name="accessibility_desc_off" msgid="6475508157786853157">"Deaktiv"</string>
+ <string name="accessibility_desc_connected" msgid="8366256693719499665">"QoÅŸuludur."</string>
+ <string name="accessibility_data_connection_gprs" msgid="1606477224486747751">"GPRS"</string>
+ <string name="accessibility_data_connection_1x" msgid="994133468120244018">"1 X"</string>
+ <string name="accessibility_data_connection_hspa" msgid="2032328855462645198">"HSPA"</string>
+ <string name="accessibility_data_connection_3g" msgid="8628562305003568260">"3G"</string>
+ <string name="accessibility_data_connection_3.5g" msgid="8664845609981692001">"3.5G"</string>
+ <string name="accessibility_data_connection_4g" msgid="7741000750630089612">"4G"</string>
+ <string name="accessibility_data_connection_lte" msgid="5413468808637540658">"LTE"</string>
+ <string name="accessibility_data_connection_cdma" msgid="6132648193978823023">"CDMA"</string>
+ <string name="accessibility_data_connection_roaming" msgid="5977362333466556094">"Rouminq"</string>
+ <string name="accessibility_data_connection_edge" msgid="4477457051631979278">"Edge"</string>
+ <string name="accessibility_data_connection_wifi" msgid="2324496756590645221">"Wi-Fi"</string>
+ <string name="accessibility_no_sim" msgid="8274017118472455155">"SIM yoxdur"</string>
+ <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Bluetooth tezering."</string>
+ <string name="accessibility_airplane_mode" msgid="834748999790763092">"Uçuş rejimi"</string>
+ <string name="accessibility_battery_level" msgid="7451474187113371965">"Batareya <xliff:g id="NUMBER">%d</xliff:g> faizdir."</string>
+ <string name="accessibility_settings_button" msgid="799583911231893380">"Sistem parametrləri"</string>
+ <string name="accessibility_notifications_button" msgid="4498000369779421892">"Bildirişlər."</string>
+ <string name="accessibility_remove_notification" msgid="3603099514902182350">"Bildirişi təmizlə."</string>
+ <string name="accessibility_gps_enabled" msgid="3511469499240123019">"GPS aktivdir."</string>
+ <string name="accessibility_gps_acquiring" msgid="8959333351058967158">"GPS əldə edilir."</string>
+ <string name="accessibility_tty_enabled" msgid="4613200365379426561">"TeleTypewriter aktivləşdirilib."</string>
+ <string name="accessibility_ringer_vibrate" msgid="666585363364155055">"Zəng vibrasiyası"</string>
+ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"Zəngvuran səssiz."</string>
+ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> çıxarıldı."</string>
+ <string name="accessibility_notification_dismissed" msgid="854211387186306927">"Bildiriş uzaqlaşdırıldı."</string>
+ <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Bildiriş kölgəsi."</string>
+ <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Tez ayarlar."</string>
+ <string name="accessibility_desc_recent_apps" msgid="9014032916410590027">"Axırıncı tətbiqlər."</string>
+ <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"İstifadəçi <xliff:g id="USER">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_wifi" msgid="6099781031669728709">"<xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="NETWORK">%2$s</xliff:g>"</string>
+ <string name="accessibility_quick_settings_mobile" msgid="4876806564086241341">"Mobil <xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="TYPE">%2$s</xliff:g>. <xliff:g id="NETWORK">%3$s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"Batareya <xliff:g id="STATE">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_airplane" msgid="4196876722090224753">"Təyyarə Rejimi <xliff:g id="STATE">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_bluetooth" msgid="5749054971341882340">"Bluetooth <xliff:g id="STATE">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"Alarm <xliff:g id="TIME">%s</xliff:g> üçün qurulub."</string>
+ <string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"2G-3G data qeyri-aktivdir"</string>
+ <string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"4G data deaktiv edildi"</string>
+ <string name="data_usage_disabled_dialog_mobile_title" msgid="1046047248844821202">"Mobil data qeyri-aktivdir"</string>
+ <string name="data_usage_disabled_dialog_title" msgid="2086815304858964954">"Data qeyri-aktivdir"</string>
+ <string name="data_usage_disabled_dialog" msgid="3853117269051806280">"GöstÉ™rilmiÅŸ data istifadÉ™ limitinÉ™ çatdınız.\n\nÆgÉ™r datanı yenidÉ™n aktivləşdirsÉ™niz, operator tÉ™rÉ™findÉ™n É™lavÉ™ tariflÉ™r tÉ™tbiq oluna bilÉ™r."</string>
+ <string name="data_usage_disabled_dialog_enable" msgid="7729772039208664606">"Datanı yenidən aktiv et"</string>
+ <string name="status_bar_settings_signal_meter_disconnected" msgid="1940231521274147771">"İnternet bağlantısı yoxdur"</string>
+ <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Wi-Fi qoÅŸulub"</string>
+ <string name="gps_notification_searching_text" msgid="8574247005642736060">"GPS Axtarışı"</string>
+ <string name="gps_notification_found_text" msgid="4619274244146446464">"Yer GPS tərəfindən müəyyən edildi"</string>
+ <string name="accessibility_location_active" msgid="2427290146138169014">"Məkan sorğuları arxivi"</string>
+ <string name="accessibility_clear_all" msgid="5235938559247164925">"Bütün bildirişləri sil."</string>
+ <string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Tətbiq infosu"</string>
+ <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Ekran avtomatik döndəriləcək."</string>
+ <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Ekran landşaft orientasiyasında kilidlənib."</string>
+ <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Ekran portret orientasiyasında kilidlənib."</string>
+ <string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
+ <string name="start_dreams" msgid="7219575858348719790">"Xəyal"</string>
+ <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
+ <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Uçuş rejimi"</string>
+ <string name="quick_settings_battery_charging_label" msgid="490074774465309209">"Dolur, <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+ <string name="quick_settings_battery_charged_label" msgid="8865413079414246081">"Dolub"</string>
+ <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string>
+ <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (<xliff:g id="NUMBER">%d</xliff:g> Cihaz)"</string>
+ <string name="quick_settings_bluetooth_off_label" msgid="8159652146149219937">"Bluetooth bağlıdır"</string>
+ <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Parlaqlıq"</string>
+ <string name="quick_settings_rotation_unlocked_label" msgid="336054930362580584">"Avtofırlanma"</string>
+ <string name="quick_settings_rotation_locked_label" msgid="8058646447242565486">"Fırlatma kilidlidir"</string>
+ <string name="quick_settings_ime_label" msgid="7073463064369468429">"DaxiletmÉ™ metodu"</string>
+ <string name="quick_settings_location_label" msgid="5011327048748762257">"Yer"</string>
+ <string name="quick_settings_location_off_label" msgid="7464544086507331459">"Yer Deaktiv"</string>
+ <string name="quick_settings_media_device_label" msgid="1302906836372603762">"Media cihazı"</string>
+ <string name="quick_settings_rssi_label" msgid="7725671335550695589">"RSSI"</string>
+ <string name="quick_settings_rssi_emergency_only" msgid="2713774041672886750">"Yalnız fövqəladə zənglər"</string>
+ <string name="quick_settings_settings_label" msgid="5326556592578065401">"Nizamlar"</string>
+ <string name="quick_settings_time_label" msgid="4635969182239736408">"Vaxt"</string>
+ <string name="quick_settings_user_label" msgid="5238995632130897840">"Mən"</string>
+ <string name="quick_settings_wifi_label" msgid="9135344704899546041">"Wi-Fi"</string>
+ <string name="quick_settings_wifi_not_connected" msgid="7171904845345573431">"Bağlantı yoxdur"</string>
+ <string name="quick_settings_wifi_no_network" msgid="2221993077220856376">"Şəbəkə yoxdur"</string>
+ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi sönülüdür"</string>
+ <string name="quick_settings_wifi_display_label" msgid="6893592964463624333">"Wi-Fi Ekran"</string>
+ <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Simsiz Ekran"</string>
+ <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Parlaqlıq"</string>
+ <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AVTO"</string>
+ <string name="status_bar_help_title" msgid="1199237744086469217">"Bildirişlər burada görünür"</string>
+ <string name="status_bar_help_text" msgid="7874607155052076323">"Aşağı sürüşdürməklə istənilən vaxt onları əldə edin.\nSistemi nəzarəti üçün yenə də aşağı sürüşdürün."</string>
+ <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Şəbəkə monitor edilə bilər"</string>
+ <string name="done_button" msgid="1759387181766603361">"Hazırdır"</string>
+ <string name="ssl_ca_cert_dialog_title" msgid="1273796967092027291">"Şəbəkə Monitorinqi"</string>
+ <string name="ssl_ca_cert_info_message" msgid="5430320539555358452">"Bu cihaz <xliff:g id="MANAGING_DOMAIN">%s</xliff:g> tÉ™rÉ™findÉ™n idarÉ™ edilir . \n \n Sizin administrator ÅŸÉ™bÉ™kÉ™ fÉ™aliyyÉ™tinizin, hÉ™mçinin e-poçt, tÉ™tbiqlÉ™r vÉ™ tÉ™hlükÉ™siz veb saytlarınızın monitorinqini etmÉ™yÉ™ qadirdir. \n \n Ætraflı mÉ™lumat üçün administrator ilÉ™ É™laqÉ™ saxlayın."</string>
+ <string name="ssl_ca_cert_warning_message" msgid="2033091656129963669">"Üçüncü tərəf \n şəbəkə fəaliyyətinizin, həmçinin e-poçt, tətbiqlər və təhlükəsiz veb saytlarınızın monitorinqini etməyə qadirdir. . \n \nCihanzınıza yüklənmiş etibarlı etimad bunu mümkün edir."</string>
+ <string name="ssl_ca_cert_settings_button" msgid="7946956977377166709">"Etibarlı etimadları yoxlayın"</string>
+</resources>
diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml
index 6608b79..10655d8 100644
--- a/packages/SystemUI/res/values-be/strings.xml
+++ b/packages/SystemUI/res/values-be/strings.xml
@@ -61,8 +61,6 @@
<string name="usb_debugging_always" msgid="303335496705863070">"ЗаўÑёды дазвалÑць з гÑтага камп\'ютара"</string>
<string name="compat_mode_on" msgid="6623839244840638213">"ПавÑл. на ўвеÑÑŒ Ñкран"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"РаÑцÑгн. на ўвеÑÑŒ Ñкран"</string>
- <string name="compat_mode_help_header" msgid="7969493989397529910">"Маштабаванне Ð´Ð»Ñ ÑумÑшчальнаÑцi"</string>
- <string name="compat_mode_help_body" msgid="4946726776359270040">"Калі прыкладанне раÑпрацаванае Ð´Ð»Ñ Ð½ÐµÐ²Ñлікіх Ñкранаў, ÐºÐ°Ð»Ñ Ð³Ð°Ð´Ð·Ñ–Ð½Ð½Ñ–ÐºÐ° з\'Ñвіцца кіраванне маштабаваннем."</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Захаванне Ñкрыншота..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Захаванне Ñкрыншота..."</string>
<string name="screenshot_saving_text" msgid="2419718443411738818">"Скрыншот захаваны."</string>
@@ -78,6 +76,10 @@
<string name="accessibility_home" msgid="8217216074895377641">"Ðа Галоўную Ñтаронку"</string>
<string name="accessibility_menu" msgid="316839303324695949">"Меню"</string>
<string name="accessibility_recent" msgid="8571350598987952883">"ÐÑÐ´Ð°ÑžÐ½Ñ–Ñ Ð¿Ñ€Ñ‹ÐºÐ»Ð°Ð´Ð°Ð½Ð½Ñ–"</string>
+ <!-- no translation found for accessibility_search_light (1103867596330271848) -->
+ <skip />
+ <!-- no translation found for accessibility_camera_button (8064671582820358152) -->
+ <skip />
<string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Кнопка пераключÑÐ½Ð½Ñ Ð¼ÐµÑ‚Ð°Ð´Ñƒ ўводу."</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Кнопка ÑумÑшчальнаÑці маштаба."</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Маштабаванне малых Ñлементаў Ð´Ð»Ñ Ð±Ð¾Ð»ÑŒÑˆÐ°Ð³Ð° Ñкрана."</string>
@@ -155,6 +157,8 @@
<string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"ÐкумулÑтар: <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_airplane" msgid="4196876722090224753">"РÑжым палёту: <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="5749054971341882340">"Bluetooth: <xliff:g id="STATE">%s</xliff:g>."</string>
+ <!-- no translation found for accessibility_quick_settings_location (4577282329866813100) -->
+ <skip />
<string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"Ðаладжаны будзiльнiк: <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"Ð”Ð°Ð´Ð·ÐµÐ½Ñ‹Ñ 2G-3G адключаныÑ"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"Ð”Ð°Ð´Ð·ÐµÐ½Ñ‹Ñ 4G адключаныÑ"</string>
@@ -166,12 +170,15 @@
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Wi-Fi падключаны"</string>
<string name="gps_notification_searching_text" msgid="8574247005642736060">"Пошук GPS"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"МеÑца задана праз GPS"</string>
+ <!-- no translation found for accessibility_location_active (2427290146138169014) -->
+ <skip />
<string name="accessibility_clear_all" msgid="5235938559247164925">"Выдалiць уÑе апавÑшчÑннi."</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Ð†Ð½Ñ„Ð°Ñ€Ð¼Ð°Ñ†Ñ‹Ñ Ð¿Ñ€Ð° прыкладанне"</string>
<string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Экран паварочваецца аўтаматычна."</string>
<string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Экран заблакiраваны ў альбомнай арыентацыі."</string>
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Экран заблакiраваны Ñž партрÑтнай арыентацыі."</string>
- <string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
+ <!-- no translation found for dessert_case (1295161776223959221) -->
+ <skip />
<string name="start_dreams" msgid="7219575858348719790">"Мроi"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
<string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"РÑжым палёту"</string>
@@ -202,10 +209,12 @@
<string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"БеÑправадны дыÑплей"</string>
<string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"ЯркаÑць"</string>
<string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"ÐЎТÐ"</string>
- <string name="status_bar_help_title" msgid="1199237744086469217">"ÐпавÑшчÑнні з\'ÑўлÑюцца тут"</string>
- <string name="status_bar_help_text" msgid="7874607155052076323">"Ðтрымлівайце доÑтуп да Ñ–Ñ… у любы чаÑ, праводзÑчы пальцам уніз.\nПравÑдзіце пальцам уніз ÑÑˆÑ‡Ñ Ñ€Ð°Ð·, каб атрымаць доÑтуп да Ñродкаў ÐºÑ–Ñ€Ð°Ð²Ð°Ð½Ð½Ñ ÑÑ–ÑÑ‚Ñмай."</string>
- <!-- no translation found for hideybar_confirmation_message (9050869548951044371) -->
+ <!-- no translation found for quick_settings_inversion_label (1666358784283020762) -->
+ <skip />
+ <!-- no translation found for quick_settings_contrast_label (3319507551689108692) -->
+ <skip />
+ <!-- no translation found for quick_settings_color_space_label (853443689745584770) -->
<skip />
- <!-- no translation found for hideybar_confirmation_message_long (7117692795163620626) -->
+ <!-- no translation found for ssl_ca_cert_warning (9005954106902053641) -->
<skip />
</resources>
diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml
index 6194fd8..bb1f18b 100644
--- a/packages/SystemUI/res/values-bg/strings.xml
+++ b/packages/SystemUI/res/values-bg/strings.xml
@@ -61,8 +61,6 @@
<string name="usb_debugging_always" msgid="303335496705863070">"Винаги да Ñе разрешава от този компютър"</string>
<string name="compat_mode_on" msgid="6623839244840638213">"Мащаб – запълва екрана"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Разпъване – запълва екрана"</string>
- <string name="compat_mode_help_header" msgid="7969493989397529910">"ПромÑна на мащаба за ÑъвмеÑтимоÑÑ‚"</string>
- <string name="compat_mode_help_body" msgid="4946726776359270040">"Когато дадено приложение е Ñъздадено за по-малък екран, до чаÑовника ще Ñе покаже управление за промÑна на мащаба."</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Екранната Ñнимка Ñе запазва..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Екранната Ñнимка Ñе запазва..."</string>
<string name="screenshot_saving_text" msgid="2419718443411738818">"Екранната Ñнимка Ñе запазва."</string>
@@ -78,6 +76,8 @@
<string name="accessibility_home" msgid="8217216074895377641">"Ðачало"</string>
<string name="accessibility_menu" msgid="316839303324695949">"Меню"</string>
<string name="accessibility_recent" msgid="8571350598987952883">"Скорошни приложениÑ"</string>
+ <string name="accessibility_search_light" msgid="1103867596330271848">"ТърÑене"</string>
+ <string name="accessibility_camera_button" msgid="8064671582820358152">"Камера"</string>
<string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Бутон за превключване на метода на въвеждане."</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Бутон за промÑна на мащаба Ñ Ñ†ÐµÐ» ÑъвмеÑтимоÑÑ‚."</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"ПромÑна на мащаба на екрана от по-малък до по-голÑм."</string>
@@ -153,6 +153,7 @@
<string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"БатериÑ: <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_airplane" msgid="4196876722090224753">"Самолетен режим: <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="5749054971341882340">"Bluetooth: <xliff:g id="STATE">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_location" msgid="4577282329866813100">"МеÑтоположението е <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"Будилникът е навит за <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"2G-3G данните Ñа деактивирани"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"4G данните Ñа деактивирани"</string>
@@ -164,12 +165,13 @@
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Wi-Fi: Има връзка"</string>
<string name="gps_notification_searching_text" msgid="8574247005642736060">"ТърÑи Ñе GPS"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"МеÑтоположението е зададено от GPS"</string>
+ <string name="accessibility_location_active" msgid="2427290146138169014">"Ðктивни заÑвки за меÑтоположение"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"ИзчиÑтване на вÑички извеÑтиÑ."</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° приложението"</string>
<string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Екранът ще Ñе завърта автоматично."</string>
<string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Екранът е заключен в хоризонтална ориентациÑ."</string>
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Екранът е заключен във вертикална ориентациÑ."</string>
- <string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
+ <string name="dessert_case" msgid="1295161776223959221">"Витрина Ñ Ð´ÐµÑерти"</string>
<string name="start_dreams" msgid="7219575858348719790">"Мечта"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
<string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Самолетен режим"</string>
@@ -182,10 +184,8 @@
<string name="quick_settings_rotation_unlocked_label" msgid="336054930362580584">"Ðвтоматична ориентациÑ"</string>
<string name="quick_settings_rotation_locked_label" msgid="8058646447242565486">"ОриентациÑта е заключена"</string>
<string name="quick_settings_ime_label" msgid="7073463064369468429">"Метод на въвеждане"</string>
- <!-- no translation found for quick_settings_location_label (5011327048748762257) -->
- <skip />
- <!-- no translation found for quick_settings_location_off_label (7464544086507331459) -->
- <skip />
+ <string name="quick_settings_location_label" msgid="5011327048748762257">"МеÑтоположение"</string>
+ <string name="quick_settings_location_off_label" msgid="7464544086507331459">"МеÑтоположението е изключено"</string>
<string name="quick_settings_media_device_label" msgid="1302906836372603762">"Мултимедийно уÑтройÑтво"</string>
<string name="quick_settings_rssi_label" msgid="7725671335550695589">"Индикатор за Ñилата на Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ñигнал (RSSI)"</string>
<string name="quick_settings_rssi_emergency_only" msgid="2713774041672886750">"Само Ñпешни обажданиÑ"</string>
@@ -200,8 +200,8 @@
<string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Безжичен диÑплей"</string>
<string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"ЯркоÑÑ‚"</string>
<string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"ÐВТ."</string>
- <string name="status_bar_help_title" msgid="1199237744086469217">"ИзвеÑтиÑта Ñе показват тук"</string>
- <string name="status_bar_help_text" msgid="7874607155052076323">"ОÑъщеÑтвÑвайте доÑтъп до Ñ‚ÑÑ… по вÑÑко време, като прекарате пръÑÑ‚ надолу.\nÐаправете го отново за ÑиÑтемните контроли."</string>
- <string name="hideybar_confirmation_message" msgid="9050869548951044371">"Прекарайте пръÑÑ‚ по ръба на екрана, за да Ñе покаже лентата"</string>
- <string name="hideybar_confirmation_message_long" msgid="7117692795163620626">"Прекарайте пръÑÑ‚ от ръба на екрана, за да Ñе покаже ÑиÑтемната лента"</string>
+ <string name="quick_settings_inversion_label" msgid="1666358784283020762">"Режим на инвертиране на цветовете"</string>
+ <string name="quick_settings_contrast_label" msgid="3319507551689108692">"Режим на подобрен контраÑÑ‚"</string>
+ <string name="quick_settings_color_space_label" msgid="853443689745584770">"Режим на коригиране на цветовете"</string>
+ <string name="ssl_ca_cert_warning" msgid="9005954106902053641">"Мрежата може\nда Ñе наблюдава"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml
index eddeda3..1cd5e1d 100644
--- a/packages/SystemUI/res/values-ca/strings.xml
+++ b/packages/SystemUI/res/values-ca/strings.xml
@@ -61,9 +61,7 @@
<string name="usb_debugging_always" msgid="303335496705863070">"Dóna sempre permís des d\'aquest equip"</string>
<string name="compat_mode_on" msgid="6623839244840638213">"Zoom per omplir pantalla"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Estira per omplir pant."</string>
- <string name="compat_mode_help_header" msgid="7969493989397529910">"Zoom de compatibilitat"</string>
- <string name="compat_mode_help_body" msgid="4946726776359270040">"Quan una aplicació s\'hagi dissenyat per a una pantalla més petita, apareixerà un control de zoom al costat del rellotge."</string>
- <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Desant captura de pantalla..."</string>
+ <string name="screenshot_saving_ticker" msgid="7403652894056693515">"S\'està desant captura de pantalla..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"S\'està desant la captura de pantalla..."</string>
<string name="screenshot_saving_text" msgid="2419718443411738818">"La captura de pantalla s\'ha desat."</string>
<string name="screenshot_saved_title" msgid="6461865960961414961">"S\'ha fet una captura de pantalla."</string>
@@ -78,6 +76,8 @@
<string name="accessibility_home" msgid="8217216074895377641">"Pàgina d\'inici"</string>
<string name="accessibility_menu" msgid="316839303324695949">"Menú"</string>
<string name="accessibility_recent" msgid="8571350598987952883">"Aplicacions recents"</string>
+ <string name="accessibility_search_light" msgid="1103867596330271848">"Cerca"</string>
+ <string name="accessibility_camera_button" msgid="8064671582820358152">"Càmera"</string>
<string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Botó de canvi del mètode d\'entrada."</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Botó de zoom de compatibilitat."</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Amplia menys com més gran sigui la pantalla."</string>
@@ -155,6 +155,7 @@
<string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"Bateria <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_airplane" msgid="4196876722090224753">"Mode d\'avió <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="5749054971341882340">"Bluetooth <xliff:g id="STATE">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_location" msgid="4577282329866813100">"Ubicació: <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"Alarma establerta a les <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"Dades 2G-3G desactivades"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"Dades 4G desactivades"</string>
@@ -166,12 +167,13 @@
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Wi-Fi: connectada"</string>
<string name="gps_notification_searching_text" msgid="8574247005642736060">"S\'està cercant un GPS"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"S\'ha establert la ubicació per GPS"</string>
+ <string name="accessibility_location_active" msgid="2427290146138169014">"Sol·licituds d\'ubicació actives"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"Esborra totes les notificacions."</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Informació de l\'aplicació"</string>
<string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"La pantalla girarà automàticament."</string>
<string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"La pantalla està bloquejada en orientació horitzontal."</string>
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"La pantalla està bloquejada en orientació vertical."</string>
- <string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
+ <string name="dessert_case" msgid="1295161776223959221">"Capsa de postres"</string>
<string name="start_dreams" msgid="7219575858348719790">"Estalvi de pantalla"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
<string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Mode d\'avió"</string>
@@ -200,8 +202,8 @@
<string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Pantalla sense fil"</string>
<string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Brillantor"</string>
<string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTOMÀTICA"</string>
- <string name="status_bar_help_title" msgid="1199237744086469217">"Les notificacions apareixen aquí"</string>
- <string name="status_bar_help_text" msgid="7874607155052076323">"Accedeix-hi en qualsevol moment: només has de fer lliscar el dit cap avall.\nTorna a fer lliscar el dit cap avall per fer que es mostrin els controls del sistema."</string>
- <string name="hideybar_confirmation_message" msgid="9050869548951044371">"Fes lliscar el dit per la vora de la pantalla perquè es mostri la barra"</string>
- <string name="hideybar_confirmation_message_long" msgid="7117692795163620626">"Fes lliscar el dit des de la vora de la pantalla perquè es mostri la barra del sistema"</string>
+ <string name="quick_settings_inversion_label" msgid="1666358784283020762">"Mode d\'inversió de color"</string>
+ <string name="quick_settings_contrast_label" msgid="3319507551689108692">"Mode de contrast millorat"</string>
+ <string name="quick_settings_color_space_label" msgid="853443689745584770">"Mode de correcció de color"</string>
+ <string name="ssl_ca_cert_warning" msgid="9005954106902053641">"És possible que la xarxa\nestigui controlada"</string>
</resources>
diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml
index 87ba67a..ba72b81 100644
--- a/packages/SystemUI/res/values-cs/strings.xml
+++ b/packages/SystemUI/res/values-cs/strings.xml
@@ -61,8 +61,6 @@
<string name="usb_debugging_always" msgid="303335496705863070">"Vždy povolit z tohoto poÄítaÄe"</string>
<string name="compat_mode_on" msgid="6623839244840638213">"Přiblížit na celou obrazovku"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Na celou obrazovku"</string>
- <string name="compat_mode_help_header" msgid="7969493989397529910">"Úprava velikosti z důvodu kompatibility"</string>
- <string name="compat_mode_help_body" msgid="4946726776359270040">"Pokud je aplikace navržena pro menší obrazovku, zobrazí se vedle hodin ovládací prvek přiblížení."</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Ukládání snímku obrazovky..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Ukládání snímku obrazovky..."</string>
<string name="screenshot_saving_text" msgid="2419718443411738818">"Probíhá ukládání snímku obrazovky."</string>
@@ -78,6 +76,8 @@
<string name="accessibility_home" msgid="8217216074895377641">"Domů"</string>
<string name="accessibility_menu" msgid="316839303324695949">"Menu"</string>
<string name="accessibility_recent" msgid="8571350598987952883">"Nové aplikace"</string>
+ <string name="accessibility_search_light" msgid="1103867596330271848">"Hledat"</string>
+ <string name="accessibility_camera_button" msgid="8064671582820358152">"Fotoaparát"</string>
<string name="accessibility_ime_switch_button" msgid="5032926134740456424">"TlaÄítko pÅ™epnutí metody zadávání"</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"TlaÄítko úpravy velikosti z důvodu kompatibility"</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Zvětšit menší obrázek na větší obrazovku."</string>
@@ -155,6 +155,7 @@
<string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"Baterie: <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_airplane" msgid="4196876722090224753">"Režim V letadle: <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="5749054971341882340">"Bluetooth: <xliff:g id="STATE">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_location" msgid="4577282329866813100">"Poloha: <xliff:g id="STATE">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"Budík je nastaven na <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"Datové přenosy 2G a 3G jsou zakázány"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"Datové přenosy 4G jsou zakázány"</string>
@@ -166,12 +167,13 @@
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Wi-Fi: připojeno"</string>
<string name="gps_notification_searching_text" msgid="8574247005642736060">"Vyhledávání satelitů GPS"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"Poloha nastavena pomocí systému GPS"</string>
+ <string name="accessibility_location_active" msgid="2427290146138169014">"Aktivní žádosti o polohu"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"Vymazat všechna oznámení."</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Informace o aplikaci"</string>
<string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Obrazovka se automaticky otoÄí."</string>
<string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Obrazovka je uzamÄena v orientaci na šířku."</string>
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Obrazovka je uzamÄena v orientaci na výšku."</string>
- <string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
+ <string name="dessert_case" msgid="1295161776223959221">"Pult se sladkostmi"</string>
<string name="start_dreams" msgid="7219575858348719790">"SpoÅ™iÄ obrazovky"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
<string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Režim V letadle"</string>
@@ -184,10 +186,8 @@
<string name="quick_settings_rotation_unlocked_label" msgid="336054930362580584">"Automatické otáÄení"</string>
<string name="quick_settings_rotation_locked_label" msgid="8058646447242565486">"OtáÄení je uzamÄeno"</string>
<string name="quick_settings_ime_label" msgid="7073463064369468429">"Metoda zadávání dat"</string>
- <!-- no translation found for quick_settings_location_label (5011327048748762257) -->
- <skip />
- <!-- no translation found for quick_settings_location_off_label (7464544086507331459) -->
- <skip />
+ <string name="quick_settings_location_label" msgid="5011327048748762257">"Poloha"</string>
+ <string name="quick_settings_location_off_label" msgid="7464544086507331459">"Poloha vypnuta"</string>
<string name="quick_settings_media_device_label" msgid="1302906836372603762">"Mediální zařízení"</string>
<string name="quick_settings_rssi_label" msgid="7725671335550695589">"RSSI"</string>
<string name="quick_settings_rssi_emergency_only" msgid="2713774041672886750">"Pouze tísňová volání"</string>
@@ -202,8 +202,8 @@
<string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Bezdrátový displej"</string>
<string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Jas"</string>
<string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTOMATICKY"</string>
- <string name="status_bar_help_title" msgid="1199237744086469217">"Zde se zobrazují oznámení"</string>
- <string name="status_bar_help_text" msgid="7874607155052076323">"Můžete je kdykoli zobrazit tím, že přejedete prstem dolů.\nPřejedete-li prstem dolů ještě jednou, zobrazí se ovládací prvky systému."</string>
- <string name="hideybar_confirmation_message" msgid="9050869548951044371">"Panel zobrazíte přejetím přes okraj obrazovky"</string>
- <string name="hideybar_confirmation_message_long" msgid="7117692795163620626">"Systémový panel zobrazíte přejetím přes okraj obrazovky"</string>
+ <string name="quick_settings_inversion_label" msgid="1666358784283020762">"Režim převrácení barev"</string>
+ <string name="quick_settings_contrast_label" msgid="3319507551689108692">"Režim zvýšeného kontrastu"</string>
+ <string name="quick_settings_color_space_label" msgid="853443689745584770">"Režim korekce barev"</string>
+ <string name="ssl_ca_cert_warning" msgid="9005954106902053641">"Síť může být\nmonitorována"</string>
</resources>
diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml
index af4bb33..30c41bf 100644
--- a/packages/SystemUI/res/values-da/strings.xml
+++ b/packages/SystemUI/res/values-da/strings.xml
@@ -44,7 +44,7 @@
<string name="status_bar_settings_mute_label" msgid="554682549917429396">"LYDLØS"</string>
<string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"AUTO"</string>
<string name="status_bar_settings_notifications" msgid="397146176280905137">"Underretninger"</string>
- <string name="bluetooth_tethered" msgid="7094101612161133267">"Bluetooth-tethering anvendt"</string>
+ <string name="bluetooth_tethered" msgid="7094101612161133267">"Netdeling via Bluetooth anvendt"</string>
<string name="status_bar_input_method_settings_configure_input_methods" msgid="3504292471512317827">"Konfigurer inputmetoder"</string>
<string name="status_bar_use_physical_keyboard" msgid="7551903084416057810">"Fysisk tastatur"</string>
<string name="usb_device_permission_prompt" msgid="834698001271562057">"Tillad, at appen <xliff:g id="APPLICATION">%1$s</xliff:g> kan få adgang til USB-enheden?"</string>
@@ -61,8 +61,6 @@
<string name="usb_debugging_always" msgid="303335496705863070">"Tillad altid fra denne computer"</string>
<string name="compat_mode_on" msgid="6623839244840638213">"Zoom til fuld skærm"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Stræk til fuld skærm"</string>
- <string name="compat_mode_help_header" msgid="7969493989397529910">"Kompatibilitetszoom"</string>
- <string name="compat_mode_help_body" msgid="4946726776359270040">"Når en app er udviklet til en mindre skærm, vises der en zoomfunktion ved uret."</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Gemmer skærmbillede..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Gemmer skærmbillede..."</string>
<string name="screenshot_saving_text" msgid="2419718443411738818">"Skærmbilledet gemmes."</string>
@@ -75,9 +73,11 @@
<string name="use_ptp_button_title" msgid="7517127540301625751">"Isæt som et kamera (PTP)"</string>
<string name="installer_cd_button_title" msgid="2312667578562201583">"Installer appen Android Filoverførsel til Mac"</string>
<string name="accessibility_back" msgid="567011538994429120">"Tilbage"</string>
- <string name="accessibility_home" msgid="8217216074895377641">"Startside"</string>
+ <string name="accessibility_home" msgid="8217216074895377641">"Startskærm"</string>
<string name="accessibility_menu" msgid="316839303324695949">"Menu"</string>
<string name="accessibility_recent" msgid="8571350598987952883">"Seneste apps"</string>
+ <string name="accessibility_search_light" msgid="1103867596330271848">"Søg"</string>
+ <string name="accessibility_camera_button" msgid="8064671582820358152">"Kamera"</string>
<string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Skift indtastningsmetode-knappen."</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Knap for kompatibilitetszoom."</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Zoom mindre til større skærm."</string>
@@ -153,6 +153,7 @@
<string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"Batteri <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_airplane" msgid="4196876722090224753">"Flytilstand <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="5749054971341882340">"Bluetooth <xliff:g id="STATE">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_location" msgid="4577282329866813100">"Placering <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"Alarmen er indstillet til <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"2G-3G-data er deaktiveret"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"4G-data er deaktiveret"</string>
@@ -164,12 +165,13 @@
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Wi-Fi er forbundet"</string>
<string name="gps_notification_searching_text" msgid="8574247005642736060">"Søger efter GPS"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"Placeringen er angivet ved hjælp af GPS"</string>
+ <string name="accessibility_location_active" msgid="2427290146138169014">"Aktive placeringsanmodninger"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"Ryd alle meddelelser."</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Oplysninger om appen"</string>
<string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Skærmen roterer automatisk."</string>
<string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Skærmen er nu låst i liggende retning."</string>
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Skærmen er nu låst i stående retning."</string>
- <string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
+ <string name="dessert_case" msgid="1295161776223959221">"Dessertcase"</string>
<string name="start_dreams" msgid="7219575858348719790">"Dagdrøm"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
<string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Flytilstand"</string>
@@ -198,8 +200,8 @@
<string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Trådløs skærm"</string>
<string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Lysstyrke"</string>
<string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTO"</string>
- <string name="status_bar_help_title" msgid="1199237744086469217">"Underretninger vises her"</string>
- <string name="status_bar_help_text" msgid="7874607155052076323">"Få adgang til dem når som helst ved at stryge ned.\nStryg ned igen for at komme til systemindstillingerne."</string>
- <string name="hideybar_confirmation_message" msgid="9050869548951044371">"Stryg kanten af skærmen for at se bjælken"</string>
- <string name="hideybar_confirmation_message_long" msgid="7117692795163620626">"Stryg fra skærmens kant for at se systembjælken"</string>
+ <string name="quick_settings_inversion_label" msgid="1666358784283020762">"Farveinverteringstilstand"</string>
+ <string name="quick_settings_contrast_label" msgid="3319507551689108692">"Tilstand for forbedret kontrast"</string>
+ <string name="quick_settings_color_space_label" msgid="853443689745584770">"Farvekorrigeringstilstand"</string>
+ <string name="ssl_ca_cert_warning" msgid="9005954106902053641">"Netværket kan\nvære overvåget"</string>
</resources>
diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml
index ec52ede..ff785be 100644
--- a/packages/SystemUI/res/values-de/strings.xml
+++ b/packages/SystemUI/res/values-de/strings.xml
@@ -61,8 +61,6 @@
<string name="usb_debugging_always" msgid="303335496705863070">"Von diesem Computer immer zulassen"</string>
<string name="compat_mode_on" msgid="6623839244840638213">"Zoom auf Bildschirmgröße"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Auf Bildschirmgröße anpassen"</string>
- <string name="compat_mode_help_header" msgid="7969493989397529910">"Kompatibilitätszoom"</string>
- <string name="compat_mode_help_body" msgid="4946726776359270040">"Wenn eine App für einen kleineren Bildschirm ausgelegt ist, wird ein Zoom-Steuerelement neben der Uhr angezeigt."</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Screenshot wird gespeichert..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Screenshot wird gespeichert..."</string>
<string name="screenshot_saving_text" msgid="2419718443411738818">"Screenshot wird gespeichert..."</string>
@@ -78,6 +76,8 @@
<string name="accessibility_home" msgid="8217216074895377641">"Startbildschirm"</string>
<string name="accessibility_menu" msgid="316839303324695949">"Menü"</string>
<string name="accessibility_recent" msgid="8571350598987952883">"Kürzlich geöffnete Apps"</string>
+ <string name="accessibility_search_light" msgid="1103867596330271848">"Suchen"</string>
+ <string name="accessibility_camera_button" msgid="8064671582820358152">"Kamera"</string>
<string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Schaltfläche zum Ändern der Eingabemethode"</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Schaltfläche für Kompatibilitätszoom"</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Zoom auf einen größeren Bildschirm"</string>
@@ -155,6 +155,7 @@
<string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"Akku: <xliff:g id="STATE">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_airplane" msgid="4196876722090224753">"Flugmodus: <xliff:g id="STATE">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_bluetooth" msgid="5749054971341882340">"Bluetooth: <xliff:g id="STATE">%s</xliff:g>"</string>
+ <string name="accessibility_quick_settings_location" msgid="4577282329866813100">"Standort <xliff:g id="STATE">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"Wecker gestellt für <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"2G-/3G-Daten deaktiviert"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"4G-Daten deaktiviert"</string>
@@ -166,12 +167,13 @@
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"WLAN verbunden"</string>
<string name="gps_notification_searching_text" msgid="8574247005642736060">"GPS wird gesucht"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"Standort durch GPS festgelegt"</string>
+ <string name="accessibility_location_active" msgid="2427290146138169014">"Standortanfragen aktiv"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"Alle Benachrichtigungen löschen"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"App-Details"</string>
<string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Bildschirm wird automatisch gedreht."</string>
<string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Bildschirm bleibt im Querformat."</string>
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Bildschirm bleibt im Hochformat."</string>
- <string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
+ <string name="dessert_case" msgid="1295161776223959221">"Dessertbehälter"</string>
<string name="start_dreams" msgid="7219575858348719790">"Daydream"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
<string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Flugmodus"</string>
@@ -184,10 +186,8 @@
<string name="quick_settings_rotation_unlocked_label" msgid="336054930362580584">"Autom. drehen"</string>
<string name="quick_settings_rotation_locked_label" msgid="8058646447242565486">"Drehung gesperrt"</string>
<string name="quick_settings_ime_label" msgid="7073463064369468429">"Eingabemethode"</string>
- <!-- no translation found for quick_settings_location_label (5011327048748762257) -->
- <skip />
- <!-- no translation found for quick_settings_location_off_label (7464544086507331459) -->
- <skip />
+ <string name="quick_settings_location_label" msgid="5011327048748762257">"Standort"</string>
+ <string name="quick_settings_location_off_label" msgid="7464544086507331459">"Standort aus"</string>
<string name="quick_settings_media_device_label" msgid="1302906836372603762">"Mediengerät"</string>
<string name="quick_settings_rssi_label" msgid="7725671335550695589">"RSSI"</string>
<string name="quick_settings_rssi_emergency_only" msgid="2713774041672886750">"Nur Notrufe"</string>
@@ -202,8 +202,8 @@
<string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Kabellose Übertragung (WiDi)"</string>
<string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Helligkeit"</string>
<string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTO"</string>
- <string name="status_bar_help_title" msgid="1199237744086469217">"Benachrichtigungen erscheinen hier"</string>
- <string name="status_bar_help_text" msgid="7874607155052076323">"Greifen Sie jederzeit auf sie zu, indem Sie nach unten wischen.\nWischen Sie für Systemeinstellungen erneut nach unten."</string>
- <string name="hideybar_confirmation_message" msgid="9050869548951044371">"Zum Einblenden der Leiste vom Rand wischen"</string>
- <string name="hideybar_confirmation_message_long" msgid="7117692795163620626">"Zum Einblenden der Systemleiste vom Display-Rand weg wischen"</string>
+ <string name="quick_settings_inversion_label" msgid="1666358784283020762">"Farbinversionsmodus"</string>
+ <string name="quick_settings_contrast_label" msgid="3319507551689108692">"Kontrastverbesserungsmodus"</string>
+ <string name="quick_settings_color_space_label" msgid="853443689745584770">"Farbkorrekturmodus"</string>
+ <string name="ssl_ca_cert_warning" msgid="9005954106902053641">"Netzwerk wird\neventuell überwacht."</string>
</resources>
diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml
index ab43081..0129a93 100644
--- a/packages/SystemUI/res/values-el/strings.xml
+++ b/packages/SystemUI/res/values-el/strings.xml
@@ -61,8 +61,6 @@
<string name="usb_debugging_always" msgid="303335496705863070">"Îα επιτÏέπεται πάντα από αυτόν τον υπολογιστή"</string>
<string name="compat_mode_on" msgid="6623839244840638213">"Ζουμ σε πλήÏη οθόνη"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"ΠÏοβoλή σε πλήÏη οθ."</string>
- <string name="compat_mode_help_header" msgid="7969493989397529910">"Ζουμ για συμβατότητα"</string>
- <string name="compat_mode_help_body" msgid="4946726776359270040">"Όταν μια εφαÏμογή έχει σχεδιαστεί για Ï€Ïοβολή σε μικÏότεÏη οθόνη, δίπλα από το Ïολόι θα εμφανιστεί ένα στοιχείο ελέγχου ζουμ."</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Αποθήκ. στιγμιότυπου οθόνης..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Αποθήκευση στιγμιότυπου οθόνης..."</string>
<string name="screenshot_saving_text" msgid="2419718443411738818">"Γίνεται αποθήκευση του στιγμιότυπου οθόνης."</string>
@@ -78,6 +76,8 @@
<string name="accessibility_home" msgid="8217216074895377641">"ΑÏχική σελίδα"</string>
<string name="accessibility_menu" msgid="316839303324695949">"ΜενοÏ"</string>
<string name="accessibility_recent" msgid="8571350598987952883">"ΠÏόσφατες εφαÏμογές"</string>
+ <string name="accessibility_search_light" msgid="1103867596330271848">"Αναζήτηση"</string>
+ <string name="accessibility_camera_button" msgid="8064671582820358152">"ΦωτογÏαφική μηχανή"</string>
<string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Κουμπί εναλλαγής μεθόδου εισόδου"</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Κουμπί εστίασης συμβατότητας."</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Ζουμ από μικÏότεÏη σε μεγαλÏτεÏη οθόνη."</string>
@@ -155,6 +155,7 @@
<string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"ΜπαταÏία <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_airplane" msgid="4196876722090224753">"ΛειτουÏγία πτήσης <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="5749054971341882340">"Bluetooth <xliff:g id="STATE">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_location" msgid="4577282329866813100">"Τοποθεσία <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"Το ξυπνητήÏι έχει οÏιστεί στις <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"Τα δεδομένα 2G-3G απενεÏγοποιήθηκαν"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"Τα δεδομένα 4G απενεÏγοποιήθηκαν"</string>
@@ -166,12 +167,13 @@
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Wi-Fi συνδεδεμένο"</string>
<string name="gps_notification_searching_text" msgid="8574247005642736060">"Αναζήτηση για GPS"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"ΡÏθμιση τοποθεσίας με GPS"</string>
+ <string name="accessibility_location_active" msgid="2427290146138169014">"Τα αιτήματα τοποθεσίας έχουν ενεÏγοποιηθεί"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"ΕκκαθάÏιση όλων των ειδοποιήσεων."</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"ΠληÏοφοÏίες εφαÏμογής"</string>
<string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Θα γίνεται αυτόματη πεÏιστÏοφή της οθόνης."</string>
<string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Η οθόνη έχει κλειδωθεί σε οÏιζόντιο Ï€Ïοσανατολισμό."</string>
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Η οθόνη έχει κλειδωθεί σε κατακόÏυφο Ï€Ïοσανατολισμό."</string>
- <string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
+ <string name="dessert_case" msgid="1295161776223959221">"ΕπιδόÏπιο"</string>
<string name="start_dreams" msgid="7219575858348719790">"Daydream"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
<string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"ΛειτουÏγία πτήσης"</string>
@@ -200,8 +202,8 @@
<string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"ΑσÏÏματη οθόνη"</string>
<string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Φωτεινότητα"</string>
<string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"ΑΥΤΟΜΑΤΗ"</string>
- <string name="status_bar_help_title" msgid="1199237744086469217">"Οι ειδοποιήσεις εμφανίζονται εδώ"</string>
- <string name="status_bar_help_text" msgid="7874607155052076323">"Μεταβείτε σε αυτές ανά πάσα στιγμή σÏÏοντας Ï€Ïος τα κάτω.\nΣÏÏετε ξανά Ï€Ïος τα κάτω για τα στοιχεία ελέγχου συστήματος."</string>
- <string name="hideybar_confirmation_message" msgid="9050869548951044371">"ΣÏÏετε από την άκÏη της οθόνης για να εμφανίσετε τη γÏαμμή"</string>
- <string name="hideybar_confirmation_message_long" msgid="7117692795163620626">"ΣÏÏετε από την άκÏη της οθόνης για να εμφανίσετε τη γÏαμμή συστήματος"</string>
+ <string name="quick_settings_inversion_label" msgid="1666358784283020762">"ΛειτουÏγία αναστÏοφής χÏώματος"</string>
+ <string name="quick_settings_contrast_label" msgid="3319507551689108692">"ΛειτουÏγία βελτίωσης αντίθεσης"</string>
+ <string name="quick_settings_color_space_label" msgid="853443689745584770">"ΛειτουÏγία διόÏθωσης χÏώματος"</string>
+ <string name="ssl_ca_cert_warning" msgid="9005954106902053641">"Το δίκτυο μποÏεί\nνα παÏακολουθείται"</string>
</resources>
diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml
index 6027553..1c22c86 100644
--- a/packages/SystemUI/res/values-en-rGB/strings.xml
+++ b/packages/SystemUI/res/values-en-rGB/strings.xml
@@ -61,8 +61,6 @@
<string name="usb_debugging_always" msgid="303335496705863070">"Always allow from this computer"</string>
<string name="compat_mode_on" msgid="6623839244840638213">"Zoom to fill screen"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Stretch to fill screen"</string>
- <string name="compat_mode_help_header" msgid="7969493989397529910">"Compatibility zoom"</string>
- <string name="compat_mode_help_body" msgid="4946726776359270040">"When an app was designed for a smaller screen, a zoom control will appear by the clock."</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Saving screenshot…"</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Saving screenshot…"</string>
<string name="screenshot_saving_text" msgid="2419718443411738818">"Screenshot is being saved."</string>
@@ -78,6 +76,8 @@
<string name="accessibility_home" msgid="8217216074895377641">"Home"</string>
<string name="accessibility_menu" msgid="316839303324695949">"Menu"</string>
<string name="accessibility_recent" msgid="8571350598987952883">"Recent apps"</string>
+ <string name="accessibility_search_light" msgid="1103867596330271848">"Search"</string>
+ <string name="accessibility_camera_button" msgid="8064671582820358152">"Camera"</string>
<string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Switch input method button."</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Compatibility zoom button."</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Zoom smaller to larger screen."</string>
@@ -153,6 +153,7 @@
<string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"Battery <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_airplane" msgid="4196876722090224753">"Aeroplane Mode <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="5749054971341882340">"Bluetooth <xliff:g id="STATE">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_location" msgid="4577282329866813100">"Location <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"Alarm set for <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"2G-3G data disabled"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"4G data disabled"</string>
@@ -164,12 +165,13 @@
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Wi-Fi connected"</string>
<string name="gps_notification_searching_text" msgid="8574247005642736060">"Searching for GPS"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"Location set by GPS"</string>
+ <string name="accessibility_location_active" msgid="2427290146138169014">"Location requests active"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"Clear all notifications."</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"App info"</string>
<string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Screen will rotate automatically."</string>
<string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Screen is locked in landscape orientation."</string>
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Screen is locked in portrait orientation."</string>
- <string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
+ <string name="dessert_case" msgid="1295161776223959221">"Dessert Case"</string>
<string name="start_dreams" msgid="7219575858348719790">"Daydream"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
<string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Aeroplane mode"</string>
@@ -198,8 +200,8 @@
<string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Wireless Display"</string>
<string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Brightness"</string>
<string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTO"</string>
- <string name="status_bar_help_title" msgid="1199237744086469217">"Notifications appear here"</string>
- <string name="status_bar_help_text" msgid="7874607155052076323">"Access them any time by swiping down.\nSwipe down again for system controls."</string>
- <string name="hideybar_confirmation_message" msgid="9050869548951044371">"Swipe edge of screen to reveal bar"</string>
- <string name="hideybar_confirmation_message_long" msgid="7117692795163620626">"Swipe from edge of screen to reveal system bar"</string>
+ <string name="quick_settings_inversion_label" msgid="1666358784283020762">"Colour inversion mode"</string>
+ <string name="quick_settings_contrast_label" msgid="3319507551689108692">"Enhanced contrast mode"</string>
+ <string name="quick_settings_color_space_label" msgid="853443689745584770">"Colour correction mode"</string>
+ <string name="ssl_ca_cert_warning" msgid="9005954106902053641">"Network may\nbe monitored"</string>
</resources>
diff --git a/packages/SystemUI/res/values-en-rIN-land/strings.xml b/packages/SystemUI/res/values-en-rIN-land/strings.xml
new file mode 100644
index 0000000..ba773b8
--- /dev/null
+++ b/packages/SystemUI/res/values-en-rIN-land/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2010, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="toast_rotation_locked" msgid="7609673011431556092">"Screen is now locked in landscape orientation."</string>
+</resources>
diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml
new file mode 100644
index 0000000..1c22c86
--- /dev/null
+++ b/packages/SystemUI/res/values-en-rIN/strings.xml
@@ -0,0 +1,207 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="7164937344850004466">"System UI"</string>
+ <string name="status_bar_clear_all_button" msgid="7774721344716731603">"Clear"</string>
+ <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Remove from list"</string>
+ <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"App info"</string>
+ <string name="status_bar_no_recent_apps" msgid="6576392951053994640">"No recent apps"</string>
+ <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Dismiss recent apps"</string>
+ <plurals name="status_bar_accessibility_recent_apps">
+ <item quantity="one" msgid="5854176083865845541">"1 recent app"</item>
+ <item quantity="other" msgid="1040784359794890744">"%d recent apps"</item>
+ </plurals>
+ <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"No notifications"</string>
+ <string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Ongoing"</string>
+ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Notifications"</string>
+ <string name="battery_low_title" msgid="2783104807551211639">"Connect charger"</string>
+ <string name="battery_low_subtitle" msgid="1752040062087829196">"The battery is getting low."</string>
+ <string name="battery_low_percent_format" msgid="1077244949318261761">"<xliff:g id="NUMBER">%d%%</xliff:g> remaining"</string>
+ <string name="invalid_charger" msgid="4549105996740522523">"USB charging not supported.\nUse only the supplied charger."</string>
+ <string name="battery_low_why" msgid="7279169609518386372">"Battery use"</string>
+ <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Settings"</string>
+ <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
+ <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Aeroplane mode"</string>
+ <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"Auto-rotate screen"</string>
+ <string name="status_bar_settings_mute_label" msgid="554682549917429396">"MUTE"</string>
+ <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"AUTO"</string>
+ <string name="status_bar_settings_notifications" msgid="397146176280905137">"Notifications"</string>
+ <string name="bluetooth_tethered" msgid="7094101612161133267">"Bluetooth tethered"</string>
+ <string name="status_bar_input_method_settings_configure_input_methods" msgid="3504292471512317827">"Set up input methods"</string>
+ <string name="status_bar_use_physical_keyboard" msgid="7551903084416057810">"Physical keyboard"</string>
+ <string name="usb_device_permission_prompt" msgid="834698001271562057">"Allow the app <xliff:g id="APPLICATION">%1$s</xliff:g> to access the USB device?"</string>
+ <string name="usb_accessory_permission_prompt" msgid="5171775411178865750">"Allow the app <xliff:g id="APPLICATION">%1$s</xliff:g> to access the USB accessory?"</string>
+ <string name="usb_device_confirm_prompt" msgid="5161205258635253206">"Open <xliff:g id="ACTIVITY">%1$s</xliff:g> when this USB device is connected?"</string>
+ <string name="usb_accessory_confirm_prompt" msgid="3808984931830229888">"Open <xliff:g id="ACTIVITY">%1$s</xliff:g> when this USB accessory is connected?"</string>
+ <string name="usb_accessory_uri_prompt" msgid="513450621413733343">"No installed apps work with this USB accessory. Learn more about this accessory at <xliff:g id="URL">%1$s</xliff:g>"</string>
+ <string name="title_usb_accessory" msgid="4966265263465181372">"USB accessory"</string>
+ <string name="label_view" msgid="6304565553218192990">"View"</string>
+ <string name="always_use_device" msgid="1450287437017315906">"Use by default for this USB device"</string>
+ <string name="always_use_accessory" msgid="1210954576979621596">"Use by default for this USB accessory"</string>
+ <string name="usb_debugging_title" msgid="4513918393387141949">"Allow USB debugging?"</string>
+ <string name="usb_debugging_message" msgid="2220143855912376496">"The computer\'s RSA key fingerprint is:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
+ <string name="usb_debugging_always" msgid="303335496705863070">"Always allow from this computer"</string>
+ <string name="compat_mode_on" msgid="6623839244840638213">"Zoom to fill screen"</string>
+ <string name="compat_mode_off" msgid="4434467572461327898">"Stretch to fill screen"</string>
+ <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Saving screenshot…"</string>
+ <string name="screenshot_saving_title" msgid="8242282144535555697">"Saving screenshot…"</string>
+ <string name="screenshot_saving_text" msgid="2419718443411738818">"Screenshot is being saved."</string>
+ <string name="screenshot_saved_title" msgid="6461865960961414961">"Screenshot captured."</string>
+ <string name="screenshot_saved_text" msgid="1152839647677558815">"Touch to view your screenshot."</string>
+ <string name="screenshot_failed_title" msgid="705781116746922771">"Couldn\'t capture screenshot."</string>
+ <string name="screenshot_failed_text" msgid="8134011269572415402">"Couldn\'t save screenshot. Storage may be in use."</string>
+ <string name="usb_preference_title" msgid="6551050377388882787">"USB file transfer options"</string>
+ <string name="use_mtp_button_title" msgid="4333504413563023626">"Mount as a media player (MTP)"</string>
+ <string name="use_ptp_button_title" msgid="7517127540301625751">"Mount as a camera (PTP)"</string>
+ <string name="installer_cd_button_title" msgid="2312667578562201583">"Install Android File Transfer application for Mac"</string>
+ <string name="accessibility_back" msgid="567011538994429120">"Back"</string>
+ <string name="accessibility_home" msgid="8217216074895377641">"Home"</string>
+ <string name="accessibility_menu" msgid="316839303324695949">"Menu"</string>
+ <string name="accessibility_recent" msgid="8571350598987952883">"Recent apps"</string>
+ <string name="accessibility_search_light" msgid="1103867596330271848">"Search"</string>
+ <string name="accessibility_camera_button" msgid="8064671582820358152">"Camera"</string>
+ <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Switch input method button."</string>
+ <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Compatibility zoom button."</string>
+ <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Zoom smaller to larger screen."</string>
+ <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth connected."</string>
+ <string name="accessibility_bluetooth_disconnected" msgid="7416648669976870175">"Bluetooth disconnected."</string>
+ <string name="accessibility_no_battery" msgid="358343022352820946">"No battery."</string>
+ <string name="accessibility_battery_one_bar" msgid="7774887721891057523">"Battery one bar."</string>
+ <string name="accessibility_battery_two_bars" msgid="8500650438735009973">"Battery two bars."</string>
+ <string name="accessibility_battery_three_bars" msgid="2302983330865040446">"Battery three bars."</string>
+ <string name="accessibility_battery_full" msgid="8909122401720158582">"Battery full."</string>
+ <string name="accessibility_no_phone" msgid="4894708937052611281">"No phone."</string>
+ <string name="accessibility_phone_one_bar" msgid="687699278132664115">"Phone one bar."</string>
+ <string name="accessibility_phone_two_bars" msgid="8384905382804815201">"Phone two bars."</string>
+ <string name="accessibility_phone_three_bars" msgid="8521904843919971885">"Phone three bars."</string>
+ <string name="accessibility_phone_signal_full" msgid="6471834868580757898">"Phone signal full."</string>
+ <string name="accessibility_no_data" msgid="4791966295096867555">"No data."</string>
+ <string name="accessibility_data_one_bar" msgid="1415625833238273628">"Data one bar."</string>
+ <string name="accessibility_data_two_bars" msgid="6166018492360432091">"Data two bars."</string>
+ <string name="accessibility_data_three_bars" msgid="9167670452395038520">"Data three bars."</string>
+ <string name="accessibility_data_signal_full" msgid="2708384608124519369">"Data signal full."</string>
+ <string name="accessibility_wifi_off" msgid="3177380296697933627">"Wi-Fi off."</string>
+ <string name="accessibility_no_wifi" msgid="1425476551827924474">"Wi-Fi disconnected."</string>
+ <string name="accessibility_wifi_one_bar" msgid="7735893178010724377">"Wi-Fi one bar."</string>
+ <string name="accessibility_wifi_two_bars" msgid="4994274250497262434">"Wi-Fi two bars."</string>
+ <string name="accessibility_wifi_three_bars" msgid="3495755044276588384">"Wi-Fi three bars."</string>
+ <string name="accessibility_wifi_signal_full" msgid="6853561303586480376">"Wi-Fi signal full."</string>
+ <string name="accessibility_no_wimax" msgid="4329180129727630368">"No WiMAX."</string>
+ <string name="accessibility_wimax_one_bar" msgid="4170994299011863648">"WiMAX one bar."</string>
+ <string name="accessibility_wimax_two_bars" msgid="9176236858336502288">"WiMAX two bars."</string>
+ <string name="accessibility_wimax_three_bars" msgid="6116551636752103927">"WiMAX three bars."</string>
+ <string name="accessibility_wimax_signal_full" msgid="2768089986795579558">"WiMAX signal full."</string>
+ <string name="accessibility_no_signal" msgid="7064645320782585167">"No signal."</string>
+ <string name="accessibility_not_connected" msgid="6395326276213402883">"Not connected."</string>
+ <string name="accessibility_zero_bars" msgid="3806060224467027887">"Zero bars."</string>
+ <string name="accessibility_one_bar" msgid="1685730113192081895">"One bar."</string>
+ <string name="accessibility_two_bars" msgid="6437363648385206679">"Two bars."</string>
+ <string name="accessibility_three_bars" msgid="2648241415119396648">"Three bars."</string>
+ <string name="accessibility_signal_full" msgid="9122922886519676839">"Signal full."</string>
+ <string name="accessibility_desc_on" msgid="2385254693624345265">"On."</string>
+ <string name="accessibility_desc_off" msgid="6475508157786853157">"Off."</string>
+ <string name="accessibility_desc_connected" msgid="8366256693719499665">"Connected."</string>
+ <string name="accessibility_data_connection_gprs" msgid="1606477224486747751">"GPRS"</string>
+ <string name="accessibility_data_connection_1x" msgid="994133468120244018">"1 X"</string>
+ <string name="accessibility_data_connection_hspa" msgid="2032328855462645198">"HSPA"</string>
+ <string name="accessibility_data_connection_3g" msgid="8628562305003568260">"3G"</string>
+ <string name="accessibility_data_connection_3.5g" msgid="8664845609981692001">"3.5G"</string>
+ <string name="accessibility_data_connection_4g" msgid="7741000750630089612">"4G"</string>
+ <string name="accessibility_data_connection_lte" msgid="5413468808637540658">"LTE"</string>
+ <string name="accessibility_data_connection_cdma" msgid="6132648193978823023">"CDMA"</string>
+ <string name="accessibility_data_connection_roaming" msgid="5977362333466556094">"Roaming"</string>
+ <string name="accessibility_data_connection_edge" msgid="4477457051631979278">"Edge"</string>
+ <string name="accessibility_data_connection_wifi" msgid="2324496756590645221">"Wi-Fi"</string>
+ <string name="accessibility_no_sim" msgid="8274017118472455155">"No SIM."</string>
+ <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Bluetooth tethering"</string>
+ <string name="accessibility_airplane_mode" msgid="834748999790763092">"Aeroplane mode"</string>
+ <string name="accessibility_battery_level" msgid="7451474187113371965">"Battery <xliff:g id="NUMBER">%d</xliff:g> per cent."</string>
+ <string name="accessibility_settings_button" msgid="799583911231893380">"System settings"</string>
+ <string name="accessibility_notifications_button" msgid="4498000369779421892">"Notifications."</string>
+ <string name="accessibility_remove_notification" msgid="3603099514902182350">"Clear notification."</string>
+ <string name="accessibility_gps_enabled" msgid="3511469499240123019">"GPS enabled."</string>
+ <string name="accessibility_gps_acquiring" msgid="8959333351058967158">"GPS acquiring."</string>
+ <string name="accessibility_tty_enabled" msgid="4613200365379426561">"TeleTypewriter enabled."</string>
+ <string name="accessibility_ringer_vibrate" msgid="666585363364155055">"Ringer vibrate."</string>
+ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"Ringer silent."</string>
+ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> dismissed."</string>
+ <string name="accessibility_notification_dismissed" msgid="854211387186306927">"Notification dismissed."</string>
+ <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Notification shade."</string>
+ <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Quick settings."</string>
+ <string name="accessibility_desc_recent_apps" msgid="9014032916410590027">"Recent apps"</string>
+ <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"User <xliff:g id="USER">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_wifi" msgid="6099781031669728709">"<xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="NETWORK">%2$s</xliff:g>"</string>
+ <string name="accessibility_quick_settings_mobile" msgid="4876806564086241341">"Mobile <xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="TYPE">%2$s</xliff:g>. <xliff:g id="NETWORK">%3$s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"Battery <xliff:g id="STATE">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_airplane" msgid="4196876722090224753">"Aeroplane Mode <xliff:g id="STATE">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_bluetooth" msgid="5749054971341882340">"Bluetooth <xliff:g id="STATE">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_location" msgid="4577282329866813100">"Location <xliff:g id="STATE">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"Alarm set for <xliff:g id="TIME">%s</xliff:g>."</string>
+ <string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"2G-3G data disabled"</string>
+ <string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"4G data disabled"</string>
+ <string name="data_usage_disabled_dialog_mobile_title" msgid="1046047248844821202">"Mobile data disabled"</string>
+ <string name="data_usage_disabled_dialog_title" msgid="2086815304858964954">"Data disabled"</string>
+ <string name="data_usage_disabled_dialog" msgid="3853117269051806280">"You\'ve reached the specified data usage limit.\n\nIf you re-enable data, you may be charged by the operator."</string>
+ <string name="data_usage_disabled_dialog_enable" msgid="7729772039208664606">"Reenable data"</string>
+ <string name="status_bar_settings_signal_meter_disconnected" msgid="1940231521274147771">"No Internet connection"</string>
+ <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Wi-Fi connected"</string>
+ <string name="gps_notification_searching_text" msgid="8574247005642736060">"Searching for GPS"</string>
+ <string name="gps_notification_found_text" msgid="4619274244146446464">"Location set by GPS"</string>
+ <string name="accessibility_location_active" msgid="2427290146138169014">"Location requests active"</string>
+ <string name="accessibility_clear_all" msgid="5235938559247164925">"Clear all notifications."</string>
+ <string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"App info"</string>
+ <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Screen will rotate automatically."</string>
+ <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Screen is locked in landscape orientation."</string>
+ <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Screen is locked in portrait orientation."</string>
+ <string name="dessert_case" msgid="1295161776223959221">"Dessert Case"</string>
+ <string name="start_dreams" msgid="7219575858348719790">"Daydream"</string>
+ <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
+ <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Aeroplane mode"</string>
+ <string name="quick_settings_battery_charging_label" msgid="490074774465309209">"Charging, <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+ <string name="quick_settings_battery_charged_label" msgid="8865413079414246081">"Charged"</string>
+ <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string>
+ <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (<xliff:g id="NUMBER">%d</xliff:g> Devices)"</string>
+ <string name="quick_settings_bluetooth_off_label" msgid="8159652146149219937">"Bluetooth Off"</string>
+ <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Brightness"</string>
+ <string name="quick_settings_rotation_unlocked_label" msgid="336054930362580584">"Auto Rotate"</string>
+ <string name="quick_settings_rotation_locked_label" msgid="8058646447242565486">"Rotation Locked"</string>
+ <string name="quick_settings_ime_label" msgid="7073463064369468429">"Input Method"</string>
+ <string name="quick_settings_location_label" msgid="5011327048748762257">"Location"</string>
+ <string name="quick_settings_location_off_label" msgid="7464544086507331459">"Location Off"</string>
+ <string name="quick_settings_media_device_label" msgid="1302906836372603762">"Media device"</string>
+ <string name="quick_settings_rssi_label" msgid="7725671335550695589">"RSSI"</string>
+ <string name="quick_settings_rssi_emergency_only" msgid="2713774041672886750">"Emergency Calls Only"</string>
+ <string name="quick_settings_settings_label" msgid="5326556592578065401">"Settings"</string>
+ <string name="quick_settings_time_label" msgid="4635969182239736408">"Time"</string>
+ <string name="quick_settings_user_label" msgid="5238995632130897840">"Me"</string>
+ <string name="quick_settings_wifi_label" msgid="9135344704899546041">"Wi-Fi"</string>
+ <string name="quick_settings_wifi_not_connected" msgid="7171904845345573431">"Not Connected"</string>
+ <string name="quick_settings_wifi_no_network" msgid="2221993077220856376">"No Network"</string>
+ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi Off"</string>
+ <string name="quick_settings_wifi_display_label" msgid="6893592964463624333">"Wi-Fi Display"</string>
+ <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Wireless Display"</string>
+ <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Brightness"</string>
+ <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTO"</string>
+ <string name="quick_settings_inversion_label" msgid="1666358784283020762">"Colour inversion mode"</string>
+ <string name="quick_settings_contrast_label" msgid="3319507551689108692">"Enhanced contrast mode"</string>
+ <string name="quick_settings_color_space_label" msgid="853443689745584770">"Colour correction mode"</string>
+ <string name="ssl_ca_cert_warning" msgid="9005954106902053641">"Network may\nbe monitored"</string>
+</resources>
diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml
index 62f6c20..86a6b96 100644
--- a/packages/SystemUI/res/values-es-rUS/strings.xml
+++ b/packages/SystemUI/res/values-es-rUS/strings.xml
@@ -61,8 +61,6 @@
<string name="usb_debugging_always" msgid="303335496705863070">"Permitir siempre desde esta computadora"</string>
<string name="compat_mode_on" msgid="6623839244840638213">"Zoom para ocupar la pantalla"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Estirar p/ ocupar la pantalla"</string>
- <string name="compat_mode_help_header" msgid="7969493989397529910">"Zoom de compatibilidad"</string>
- <string name="compat_mode_help_body" msgid="4946726776359270040">"Cuando una aplicación fue diseñada para una pantalla más pequeña, aparece un control de zoom junto al reloj."</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Guardando captura de pantalla"</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Guardando la captura de pantalla..."</string>
<string name="screenshot_saving_text" msgid="2419718443411738818">"La captura de pantalla se está guardando."</string>
@@ -78,6 +76,8 @@
<string name="accessibility_home" msgid="8217216074895377641">"Página principal"</string>
<string name="accessibility_menu" msgid="316839303324695949">"Menú"</string>
<string name="accessibility_recent" msgid="8571350598987952883">"Aplicaciones recientes"</string>
+ <string name="accessibility_search_light" msgid="1103867596330271848">"Buscar"</string>
+ <string name="accessibility_camera_button" msgid="8064671582820358152">"Cámara"</string>
<string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Botón Cambiar método de entrada"</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Botón de zoom de compatibilidad"</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Zoom de pantalla más pequeña a más grande"</string>
@@ -155,6 +155,7 @@
<string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"Batería <xliff:g id="STATE">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_airplane" msgid="4196876722090224753">"Modo avión <xliff:g id="STATE">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_bluetooth" msgid="5749054971341882340">"Bluetooth <xliff:g id="STATE">%s</xliff:g>"</string>
+ <string name="accessibility_quick_settings_location" msgid="4577282329866813100">"Ubicación <xliff:g id="STATE">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"Alarma: <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"Datos de 2G-3G inhabilitados"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"Datos de 4G inhabilitados"</string>
@@ -166,12 +167,13 @@
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Wi-Fi conectado"</string>
<string name="gps_notification_searching_text" msgid="8574247005642736060">"Buscando GPS"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"La ubicación se estableció por GPS"</string>
+ <string name="accessibility_location_active" msgid="2427290146138169014">"Solicitudes de ubicación activas"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"Eliminar todas las notificaciones"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Información de la aplicación"</string>
<string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"La pantalla girará automáticamente."</string>
<string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"La pantalla está bloqueada en modo horizontal."</string>
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"La pantalla está bloqueada en modo vertical."</string>
- <string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
+ <string name="dessert_case" msgid="1295161776223959221">"Caja para postres"</string>
<string name="start_dreams" msgid="7219575858348719790">"Activar protector"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
<string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Modo avión"</string>
@@ -184,10 +186,8 @@
<string name="quick_settings_rotation_unlocked_label" msgid="336054930362580584">"Girar automáticamente"</string>
<string name="quick_settings_rotation_locked_label" msgid="8058646447242565486">"Rotación bloqueada"</string>
<string name="quick_settings_ime_label" msgid="7073463064369468429">"Método de introducción"</string>
- <!-- no translation found for quick_settings_location_label (5011327048748762257) -->
- <skip />
- <!-- no translation found for quick_settings_location_off_label (7464544086507331459) -->
- <skip />
+ <string name="quick_settings_location_label" msgid="5011327048748762257">"Ubicación"</string>
+ <string name="quick_settings_location_off_label" msgid="7464544086507331459">"Ubicación desactivada"</string>
<string name="quick_settings_media_device_label" msgid="1302906836372603762">"Dispositivo multimedia"</string>
<string name="quick_settings_rssi_label" msgid="7725671335550695589">"RSSI"</string>
<string name="quick_settings_rssi_emergency_only" msgid="2713774041672886750">"Solo emergencia"</string>
@@ -202,8 +202,8 @@
<string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Pantalla inalámbrica"</string>
<string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Brillo"</string>
<string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTOMÃTICO"</string>
- <string name="status_bar_help_title" msgid="1199237744086469217">"Las notificaciones aparecen aquí."</string>
- <string name="status_bar_help_text" msgid="7874607155052076323">"Desliza el dedo hacia abajo para acceder al contenido.\nVuelve a deslizar el dedo hacia abajo para acceder a los controles del sistema."</string>
- <string name="hideybar_confirmation_message" msgid="9050869548951044371">"Desliza el dedo desde el borde de la pantalla para mostrar la barra."</string>
- <string name="hideybar_confirmation_message_long" msgid="7117692795163620626">"Desliza el dedo desde el borde de la pantalla para mostrar la barra del sistema."</string>
+ <string name="quick_settings_inversion_label" msgid="1666358784283020762">"Modo de inversión de color"</string>
+ <string name="quick_settings_contrast_label" msgid="3319507551689108692">"Modo de contraste mejorado"</string>
+ <string name="quick_settings_color_space_label" msgid="853443689745584770">"Modo de corrección de color"</string>
+ <string name="ssl_ca_cert_warning" msgid="9005954106902053641">"Es posible que la red\nesté supervisada."</string>
</resources>
diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml
index 64c3cab..200b066 100644
--- a/packages/SystemUI/res/values-es/strings.xml
+++ b/packages/SystemUI/res/values-es/strings.xml
@@ -61,8 +61,6 @@
<string name="usb_debugging_always" msgid="303335496705863070">"Permitir siempre desde este ordenador"</string>
<string name="compat_mode_on" msgid="6623839244840638213">"Zoom para ajustar"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Expandir para ajustar"</string>
- <string name="compat_mode_help_header" msgid="7969493989397529910">"Zoom de compatibilidad"</string>
- <string name="compat_mode_help_body" msgid="4946726776359270040">"Si la aplicación se ha diseñado para una pantalla más pequeña, aparecerá un control de zoom junto al reloj."</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Guardando captura..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Guardando captura..."</string>
<string name="screenshot_saving_text" msgid="2419718443411738818">"La captura de pantalla se está guardando."</string>
@@ -78,6 +76,8 @@
<string name="accessibility_home" msgid="8217216074895377641">"Inicio"</string>
<string name="accessibility_menu" msgid="316839303324695949">"Menú"</string>
<string name="accessibility_recent" msgid="8571350598987952883">"Aplicaciones recientes"</string>
+ <string name="accessibility_search_light" msgid="1103867596330271848">"Buscar"</string>
+ <string name="accessibility_camera_button" msgid="8064671582820358152">"Cámara"</string>
<string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Botón Cambiar método de entrada"</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Botón de zoom de compatibilidad"</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Zoom de pantalla más pequeña a más grande"</string>
@@ -153,6 +153,7 @@
<string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"Batería <xliff:g id="STATE">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_airplane" msgid="4196876722090224753">"Modo avión <xliff:g id="STATE">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_bluetooth" msgid="5749054971341882340">"Bluetooth <xliff:g id="STATE">%s</xliff:g>"</string>
+ <string name="accessibility_quick_settings_location" msgid="4577282329866813100">"Ubicación <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"La alarma sonará a la(s) <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"Datos 2G-3G inhabilitados"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"Datos 4G inhabilitados"</string>
@@ -164,12 +165,13 @@
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Con conexión Wi-Fi"</string>
<string name="gps_notification_searching_text" msgid="8574247005642736060">"Buscando GPS"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"Ubicación definida por GPS"</string>
+ <string name="accessibility_location_active" msgid="2427290146138169014">"Solicitudes de ubicación activas"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"Borrar todas las notificaciones"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Información de la aplicación"</string>
<string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"La pantalla girará automáticamente."</string>
<string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"La pantalla está bloqueada en modo horizontal."</string>
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"La pantalla está bloqueada en modo vertical."</string>
- <string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
+ <string name="dessert_case" msgid="1295161776223959221">"Caja para postres"</string>
<string name="start_dreams" msgid="7219575858348719790">"Salvapantallas"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
<string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Modo avión"</string>
@@ -198,8 +200,8 @@
<string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Pantalla inalámbrica"</string>
<string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Brillo"</string>
<string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTO"</string>
- <string name="status_bar_help_title" msgid="1199237744086469217">"Las notificaciones aparecen aquí"</string>
- <string name="status_bar_help_text" msgid="7874607155052076323">"Desliza el dedo hacia abajo para acceder al contenido.\nVuelve a deslizar el dedo hacia abajo para acceder a los controles del sistema."</string>
- <string name="hideybar_confirmation_message" msgid="9050869548951044371">"Desliza el borde de la pantalla para mostrar la barra"</string>
- <string name="hideybar_confirmation_message_long" msgid="7117692795163620626">"Desliza el borde de la pantalla para mostrar la barra del sistema"</string>
+ <string name="quick_settings_inversion_label" msgid="1666358784283020762">"Modo de inversión de color"</string>
+ <string name="quick_settings_contrast_label" msgid="3319507551689108692">"Modo de contraste mejorado"</string>
+ <string name="quick_settings_color_space_label" msgid="853443689745584770">"Modo de corrección de color"</string>
+ <string name="ssl_ca_cert_warning" msgid="9005954106902053641">"La red se\npuede supervisar"</string>
</resources>
diff --git a/packages/SystemUI/res/values-et-rEE-land/strings.xml b/packages/SystemUI/res/values-et-rEE-land/strings.xml
new file mode 100644
index 0000000..77b0ce1
--- /dev/null
+++ b/packages/SystemUI/res/values-et-rEE-land/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2010, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="toast_rotation_locked" msgid="7609673011431556092">"Ekraan on nüüd lukustatud horisontaalasendisse."</string>
+</resources>
diff --git a/packages/SystemUI/res/values-et-rEE/strings.xml b/packages/SystemUI/res/values-et-rEE/strings.xml
new file mode 100644
index 0000000..aefeb9d
--- /dev/null
+++ b/packages/SystemUI/res/values-et-rEE/strings.xml
@@ -0,0 +1,207 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="7164937344850004466">"Süsteemi UI"</string>
+ <string name="status_bar_clear_all_button" msgid="7774721344716731603">"Kustuta"</string>
+ <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Loendist eemaldamine"</string>
+ <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Rakenduse teave"</string>
+ <string name="status_bar_no_recent_apps" msgid="6576392951053994640">"Uusi rakendusi pole"</string>
+ <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Loobu hiljutistest rakendustest"</string>
+ <plurals name="status_bar_accessibility_recent_apps">
+ <item quantity="one" msgid="5854176083865845541">"1 hiljutine rakendus"</item>
+ <item quantity="other" msgid="1040784359794890744">"%d hiljutist rakendust"</item>
+ </plurals>
+ <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Teatisi pole"</string>
+ <string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Jätkuv"</string>
+ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Teadistused"</string>
+ <string name="battery_low_title" msgid="2783104807551211639">"Ühendage laadija"</string>
+ <string name="battery_low_subtitle" msgid="1752040062087829196">"Aku hakkab tühjenema."</string>
+ <string name="battery_low_percent_format" msgid="1077244949318261761">"<xliff:g id="NUMBER">%d%%</xliff:g> on alles"</string>
+ <string name="invalid_charger" msgid="4549105996740522523">"USB laadimist ei toetata.\nKasutage ainult tootja laadija."</string>
+ <string name="battery_low_why" msgid="7279169609518386372">"Akukasutus"</string>
+ <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Seaded"</string>
+ <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"WiFi"</string>
+ <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Lennurežiim"</string>
+ <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"Pööra ekraani automaatselt"</string>
+ <string name="status_bar_settings_mute_label" msgid="554682549917429396">"SUMMUTA"</string>
+ <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"AUTO"</string>
+ <string name="status_bar_settings_notifications" msgid="397146176280905137">"Teatised"</string>
+ <string name="bluetooth_tethered" msgid="7094101612161133267">"Bluetooth on jagatud"</string>
+ <string name="status_bar_input_method_settings_configure_input_methods" msgid="3504292471512317827">"Seadista sisestusmeetodeid"</string>
+ <string name="status_bar_use_physical_keyboard" msgid="7551903084416057810">"Füüsiline klaviatuur"</string>
+ <string name="usb_device_permission_prompt" msgid="834698001271562057">"Kas lubate rakendusel <xliff:g id="APPLICATION">%1$s</xliff:g> USB-seadmele juurde pääseda?"</string>
+ <string name="usb_accessory_permission_prompt" msgid="5171775411178865750">"Kas lubate rakendusel <xliff:g id="APPLICATION">%1$s</xliff:g> USB-seadmele juurde pääseda?"</string>
+ <string name="usb_device_confirm_prompt" msgid="5161205258635253206">"Kas avada <xliff:g id="ACTIVITY">%1$s</xliff:g>, kui see USB-seade on ühendatud?"</string>
+ <string name="usb_accessory_confirm_prompt" msgid="3808984931830229888">"Kas avada <xliff:g id="ACTIVITY">%1$s</xliff:g>, kui USB-lisaseade on ühendatud?"</string>
+ <string name="usb_accessory_uri_prompt" msgid="513450621413733343">"Inst. rak. ei tööta selle USB-seadmega. Lisateavet lisaseadme kohta vt siit: <xliff:g id="URL">%1$s</xliff:g>"</string>
+ <string name="title_usb_accessory" msgid="4966265263465181372">"USB-lisaseade"</string>
+ <string name="label_view" msgid="6304565553218192990">"Kuva"</string>
+ <string name="always_use_device" msgid="1450287437017315906">"Kasuta vaikimisi selle USB-seadme jaoks"</string>
+ <string name="always_use_accessory" msgid="1210954576979621596">"Vaikimisi kasuta seda USB-lisaseadet"</string>
+ <string name="usb_debugging_title" msgid="4513918393387141949">"Kas luban USB silumise?"</string>
+ <string name="usb_debugging_message" msgid="2220143855912376496">"Arvuti RSA-võtme sõrmejälg:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
+ <string name="usb_debugging_always" msgid="303335496705863070">"Luba alati sellest arvutist"</string>
+ <string name="compat_mode_on" msgid="6623839244840638213">"Suumi ekraani täitmiseks"</string>
+ <string name="compat_mode_off" msgid="4434467572461327898">"Venita ekraani täitmiseks"</string>
+ <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Kuvatõmmise salvestamine ..."</string>
+ <string name="screenshot_saving_title" msgid="8242282144535555697">"Kuvatõmmise salvestamine ..."</string>
+ <string name="screenshot_saving_text" msgid="2419718443411738818">"Kuvatõmmist salvestatakse."</string>
+ <string name="screenshot_saved_title" msgid="6461865960961414961">"Ekraanipilt on jäädvustatud."</string>
+ <string name="screenshot_saved_text" msgid="1152839647677558815">"Puudutage kuvatõmmise vaatamiseks."</string>
+ <string name="screenshot_failed_title" msgid="705781116746922771">"Kuvatõmmist ei saanud jäädvustada."</string>
+ <string name="screenshot_failed_text" msgid="8134011269572415402">"Kuvatõmmist ei saa salvestada. Mäluseade võib olla kasutuses."</string>
+ <string name="usb_preference_title" msgid="6551050377388882787">"USB-failiedastuse valikud"</string>
+ <string name="use_mtp_button_title" msgid="4333504413563023626">"Paigalda meediumimängijana (MTP)"</string>
+ <string name="use_ptp_button_title" msgid="7517127540301625751">"Paigalda kaamerana (PTP)"</string>
+ <string name="installer_cd_button_title" msgid="2312667578562201583">"Android File Transferi installimine Macile"</string>
+ <string name="accessibility_back" msgid="567011538994429120">"Tagasi"</string>
+ <string name="accessibility_home" msgid="8217216074895377641">"Kodu"</string>
+ <string name="accessibility_menu" msgid="316839303324695949">"Menüü"</string>
+ <string name="accessibility_recent" msgid="8571350598987952883">"Hiljutised rakendused"</string>
+ <string name="accessibility_search_light" msgid="1103867596330271848">"Otsing"</string>
+ <string name="accessibility_camera_button" msgid="8064671582820358152">"Kaamera"</string>
+ <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Sisestusmeetodi vahetamise nupp."</string>
+ <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Sobivussuumi nupp."</string>
+ <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Suumi suuremale ekraanile vähem."</string>
+ <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth on ühendatud."</string>
+ <string name="accessibility_bluetooth_disconnected" msgid="7416648669976870175">"Bluetoothi ühendus katkestatud."</string>
+ <string name="accessibility_no_battery" msgid="358343022352820946">"Aku puudub."</string>
+ <string name="accessibility_battery_one_bar" msgid="7774887721891057523">"Aku: üks pulk."</string>
+ <string name="accessibility_battery_two_bars" msgid="8500650438735009973">"Aku: kaks pulka."</string>
+ <string name="accessibility_battery_three_bars" msgid="2302983330865040446">"Aku: kolm pulka."</string>
+ <string name="accessibility_battery_full" msgid="8909122401720158582">"Aku täis."</string>
+ <string name="accessibility_no_phone" msgid="4894708937052611281">"Telefonisignaal puudub"</string>
+ <string name="accessibility_phone_one_bar" msgid="687699278132664115">"Telefonisignaal: üks pulk."</string>
+ <string name="accessibility_phone_two_bars" msgid="8384905382804815201">"Telefonisignaal: kaks pulka."</string>
+ <string name="accessibility_phone_three_bars" msgid="8521904843919971885">"Telefonisignaal: kolm pulka."</string>
+ <string name="accessibility_phone_signal_full" msgid="6471834868580757898">"Telefonisignaal on tugev."</string>
+ <string name="accessibility_no_data" msgid="4791966295096867555">"Andmed puuduvad."</string>
+ <string name="accessibility_data_one_bar" msgid="1415625833238273628">"Andmesignaal: üks pulk."</string>
+ <string name="accessibility_data_two_bars" msgid="6166018492360432091">"Andmeside: kaks pulka."</string>
+ <string name="accessibility_data_three_bars" msgid="9167670452395038520">"Andmeside: kolm pulka."</string>
+ <string name="accessibility_data_signal_full" msgid="2708384608124519369">"Andmesignaal on tugev."</string>
+ <string name="accessibility_wifi_off" msgid="3177380296697933627">"Wifi on väljas."</string>
+ <string name="accessibility_no_wifi" msgid="1425476551827924474">"Wifi-ühendus on katkestatud."</string>
+ <string name="accessibility_wifi_one_bar" msgid="7735893178010724377">"WiFi: üks pulk."</string>
+ <string name="accessibility_wifi_two_bars" msgid="4994274250497262434">"WiFi: kaks pulka."</string>
+ <string name="accessibility_wifi_three_bars" msgid="3495755044276588384">"WiFi: kolm pulka."</string>
+ <string name="accessibility_wifi_signal_full" msgid="6853561303586480376">"WiFi-signaal on tugev."</string>
+ <string name="accessibility_no_wimax" msgid="4329180129727630368">"WiMAX-i pole."</string>
+ <string name="accessibility_wimax_one_bar" msgid="4170994299011863648">"WiMAX-i on üks riba."</string>
+ <string name="accessibility_wimax_two_bars" msgid="9176236858336502288">"WiMAX-i on kaks riba."</string>
+ <string name="accessibility_wimax_three_bars" msgid="6116551636752103927">"WiMAX-i on kolm riba."</string>
+ <string name="accessibility_wimax_signal_full" msgid="2768089986795579558">"WiMAX-i signaal on tugev."</string>
+ <string name="accessibility_no_signal" msgid="7064645320782585167">"Signaal puudub."</string>
+ <string name="accessibility_not_connected" msgid="6395326276213402883">"Ühendus puudub."</string>
+ <string name="accessibility_zero_bars" msgid="3806060224467027887">"Null pulka."</string>
+ <string name="accessibility_one_bar" msgid="1685730113192081895">"Üks pulk."</string>
+ <string name="accessibility_two_bars" msgid="6437363648385206679">"Kaks pulka."</string>
+ <string name="accessibility_three_bars" msgid="2648241415119396648">"Kolm pulka."</string>
+ <string name="accessibility_signal_full" msgid="9122922886519676839">"Signaal on tugev."</string>
+ <string name="accessibility_desc_on" msgid="2385254693624345265">"Sees."</string>
+ <string name="accessibility_desc_off" msgid="6475508157786853157">"Väljas."</string>
+ <string name="accessibility_desc_connected" msgid="8366256693719499665">"Ühendatud."</string>
+ <string name="accessibility_data_connection_gprs" msgid="1606477224486747751">"GPRS"</string>
+ <string name="accessibility_data_connection_1x" msgid="994133468120244018">"1 X"</string>
+ <string name="accessibility_data_connection_hspa" msgid="2032328855462645198">"HSPA"</string>
+ <string name="accessibility_data_connection_3g" msgid="8628562305003568260">"3G"</string>
+ <string name="accessibility_data_connection_3.5g" msgid="8664845609981692001">"3,5G"</string>
+ <string name="accessibility_data_connection_4g" msgid="7741000750630089612">"4G"</string>
+ <string name="accessibility_data_connection_lte" msgid="5413468808637540658">"LTE"</string>
+ <string name="accessibility_data_connection_cdma" msgid="6132648193978823023">"CDMA"</string>
+ <string name="accessibility_data_connection_roaming" msgid="5977362333466556094">"Rändlus"</string>
+ <string name="accessibility_data_connection_edge" msgid="4477457051631979278">"Serv"</string>
+ <string name="accessibility_data_connection_wifi" msgid="2324496756590645221">"WiFi"</string>
+ <string name="accessibility_no_sim" msgid="8274017118472455155">"SIM-kaarti pole."</string>
+ <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Bluetoothi jagamine."</string>
+ <string name="accessibility_airplane_mode" msgid="834748999790763092">"Lennurežiim."</string>
+ <string name="accessibility_battery_level" msgid="7451474187113371965">"Aku: <xliff:g id="NUMBER">%d</xliff:g> protsenti."</string>
+ <string name="accessibility_settings_button" msgid="799583911231893380">"Süsteemiseaded"</string>
+ <string name="accessibility_notifications_button" msgid="4498000369779421892">"Teatised"</string>
+ <string name="accessibility_remove_notification" msgid="3603099514902182350">"Teatise kustutamine"</string>
+ <string name="accessibility_gps_enabled" msgid="3511469499240123019">"GPS on lubatud."</string>
+ <string name="accessibility_gps_acquiring" msgid="8959333351058967158">"GPS-signaali otsimine."</string>
+ <string name="accessibility_tty_enabled" msgid="4613200365379426561">"TeleTypewriter lubatud."</string>
+ <string name="accessibility_ringer_vibrate" msgid="666585363364155055">"Vibreeriv kõlisti."</string>
+ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"Vaikne kõlisti."</string>
+ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"Loobusite rakendusest <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_notification_dismissed" msgid="854211387186306927">"Märguandest on loobutud."</string>
+ <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Märguande vari."</string>
+ <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Kiirseaded."</string>
+ <string name="accessibility_desc_recent_apps" msgid="9014032916410590027">"Hiljutised rakendused"</string>
+ <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Kasutaja <xliff:g id="USER">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_wifi" msgid="6099781031669728709">"<xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="NETWORK">%2$s</xliff:g>"</string>
+ <string name="accessibility_quick_settings_mobile" msgid="4876806564086241341">"Mobiili <xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="TYPE">%2$s</xliff:g>. <xliff:g id="NETWORK">%3$s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"Aku: <xliff:g id="STATE">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_airplane" msgid="4196876722090224753">"Lennukirežiim: <xliff:g id="STATE">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_bluetooth" msgid="5749054971341882340">"Bluetooth: <xliff:g id="STATE">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_location" msgid="4577282329866813100">"Asukoht: <xliff:g id="STATE">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"Määratud äratus: <xliff:g id="TIME">%s</xliff:g>"</string>
+ <string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"2G–3G andmeside keelatud"</string>
+ <string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"4G andmeside keelatud"</string>
+ <string name="data_usage_disabled_dialog_mobile_title" msgid="1046047248844821202">"Mobiilne andmeside keelatud"</string>
+ <string name="data_usage_disabled_dialog_title" msgid="2086815304858964954">"Andmekasutus keelatud."</string>
+ <string name="data_usage_disabled_dialog" msgid="3853117269051806280">"Olete jõudnud määratud andmekasutuse piirini.\n\nKui lülitate andmeside uuesti sisse, siis võib operaator teilt tasu võtta."</string>
+ <string name="data_usage_disabled_dialog_enable" msgid="7729772039208664606">"Luba andmeside uuesti"</string>
+ <string name="status_bar_settings_signal_meter_disconnected" msgid="1940231521274147771">"Interneti-ühendus puudub"</string>
+ <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"WiFi on ühendatud"</string>
+ <string name="gps_notification_searching_text" msgid="8574247005642736060">"GPS-i otsimine"</string>
+ <string name="gps_notification_found_text" msgid="4619274244146446464">"GPS-i määratud asukoht"</string>
+ <string name="accessibility_location_active" msgid="2427290146138169014">"Asukoha taotlused on aktiivsed"</string>
+ <string name="accessibility_clear_all" msgid="5235938559247164925">"Kustuta kõik teatised."</string>
+ <string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Rakenduse teave"</string>
+ <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Ekraani pööramine toimub automaatselt."</string>
+ <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Ekraan on lukustatud horisontaalsuunas."</string>
+ <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Ekraan on lukustatud vertikaalsuunas."</string>
+ <string name="dessert_case" msgid="1295161776223959221">"Maiustusekorv"</string>
+ <string name="start_dreams" msgid="7219575858348719790">"Unistus"</string>
+ <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
+ <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Lennurežiim"</string>
+ <string name="quick_settings_battery_charging_label" msgid="490074774465309209">"Laadimine, <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+ <string name="quick_settings_battery_charged_label" msgid="8865413079414246081">"Laetud"</string>
+ <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string>
+ <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (<xliff:g id="NUMBER">%d</xliff:g> seadet)"</string>
+ <string name="quick_settings_bluetooth_off_label" msgid="8159652146149219937">"Bluetooth on väljas"</string>
+ <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Heledus"</string>
+ <string name="quick_settings_rotation_unlocked_label" msgid="336054930362580584">"Automaatne pööramine"</string>
+ <string name="quick_settings_rotation_locked_label" msgid="8058646447242565486">"Pööramine lukus"</string>
+ <string name="quick_settings_ime_label" msgid="7073463064369468429">"Sisestusmeetod"</string>
+ <string name="quick_settings_location_label" msgid="5011327048748762257">"Asukoht"</string>
+ <string name="quick_settings_location_off_label" msgid="7464544086507331459">"Asukoht on väljas"</string>
+ <string name="quick_settings_media_device_label" msgid="1302906836372603762">"Meediaseade"</string>
+ <string name="quick_settings_rssi_label" msgid="7725671335550695589">"RSSI"</string>
+ <string name="quick_settings_rssi_emergency_only" msgid="2713774041672886750">"Ainult hädaabikõned"</string>
+ <string name="quick_settings_settings_label" msgid="5326556592578065401">"Seaded"</string>
+ <string name="quick_settings_time_label" msgid="4635969182239736408">"Aeg"</string>
+ <string name="quick_settings_user_label" msgid="5238995632130897840">"Mina"</string>
+ <string name="quick_settings_wifi_label" msgid="9135344704899546041">"WiFi"</string>
+ <string name="quick_settings_wifi_not_connected" msgid="7171904845345573431">"Ühendus puudub"</string>
+ <string name="quick_settings_wifi_no_network" msgid="2221993077220856376">"Võrku pole"</string>
+ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"WiFi-ühendus on väljas"</string>
+ <string name="quick_settings_wifi_display_label" msgid="6893592964463624333">"WiFi-ekraan"</string>
+ <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Juhtmeta ekraaniühendus"</string>
+ <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Heledus"</string>
+ <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTOMAATNE"</string>
+ <string name="quick_settings_inversion_label" msgid="1666358784283020762">"Värvide ümberpööramise režiim"</string>
+ <string name="quick_settings_contrast_label" msgid="3319507551689108692">"Täiustatud kontrasti režiim"</string>
+ <string name="quick_settings_color_space_label" msgid="853443689745584770">"Värviparandusrežiim"</string>
+ <string name="ssl_ca_cert_warning" msgid="9005954106902053641">"Võrku võidakse\njälgida"</string>
+</resources>
diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml
index 6d9c838..28ece65 100644
--- a/packages/SystemUI/res/values-et/strings.xml
+++ b/packages/SystemUI/res/values-et/strings.xml
@@ -164,6 +164,7 @@
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"WiFi on ühendatud"</string>
<string name="gps_notification_searching_text" msgid="8574247005642736060">"GPS-i otsimine"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"GPS-i määratud asukoht"</string>
+ <string name="accessibility_location_active" msgid="2427290146138169014">"Asukoha taotlused on aktiivsed"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"Kustuta kõik teatised."</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Rakenduse teave"</string>
<string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Ekraani pööramine toimub automaatselt."</string>
@@ -200,6 +201,4 @@
<string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTOMAATNE"</string>
<string name="status_bar_help_title" msgid="1199237744086469217">"Märguanded ilmuvad siia"</string>
<string name="status_bar_help_text" msgid="7874607155052076323">"Juurdepääs igal ajal sõrmega alla pühkides.\nSüsteemi juhtnuppude jaoks pühkige uuesti alla."</string>
- <string name="hideybar_confirmation_message" msgid="9050869548951044371">"Riba kuvamiseks pühkige ekraani serva"</string>
- <string name="hideybar_confirmation_message_long" msgid="7117692795163620626">"Süsteemiriba kuvamiseks pühkige ekraani servast"</string>
</resources>
diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml
index b095519..ea6c102 100644
--- a/packages/SystemUI/res/values-fa/strings.xml
+++ b/packages/SystemUI/res/values-fa/strings.xml
@@ -27,7 +27,7 @@
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"رد کردن برنامه‌های اخیر"</string>
<plurals name="status_bar_accessibility_recent_apps">
<item quantity="one" msgid="5854176083865845541">"1 برنامه اخیر"</item>
- <item quantity="other" msgid="1040784359794890744">"%d برنامه‌ اخیر"</item>
+ <item quantity="other" msgid="1040784359794890744">"â€%d برنامه‌ اخیر"</item>
</plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"اعلانی موجود نیست"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"در حال انجام"</string>
@@ -35,7 +35,7 @@
<string name="battery_low_title" msgid="2783104807551211639">"شارژر را متصل کنید"</string>
<string name="battery_low_subtitle" msgid="1752040062087829196">"باتری در حال کم شدن است."</string>
<string name="battery_low_percent_format" msgid="1077244949318261761">"<xliff:g id="NUMBER">%d%%</xliff:g> باقیمانده است"</string>
- <string name="invalid_charger" msgid="4549105996740522523">"شارژ USB پشتیبانی نمی‌شود.\nÙقط از شارژر ارائه شده Ø§Ø³ØªÙØ§Ø¯Ù‡ کنید."</string>
+ <string name="invalid_charger" msgid="4549105996740522523">"â€Ø´Ø§Ø±Ú˜ USB پشتیبانی نمی‌شود.\nÙقط از شارژر ارائه شده Ø§Ø³ØªÙØ§Ø¯Ù‡ کنید."</string>
<string name="battery_low_why" msgid="7279169609518386372">"Ø§Ø³ØªÙØ§Ø¯Ù‡ از باتری"</string>
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"تنظیمات"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
@@ -47,22 +47,20 @@
<string name="bluetooth_tethered" msgid="7094101612161133267">"اتصال اینترنتی با بلوتوث تلÙÙ† همراه"</string>
<string name="status_bar_input_method_settings_configure_input_methods" msgid="3504292471512317827">"تنظیم روش‌های ورودی"</string>
<string name="status_bar_use_physical_keyboard" msgid="7551903084416057810">"ØµÙØ­Ù‡â€ŒÚ©Ù„ید Ùیزیکی"</string>
- <string name="usb_device_permission_prompt" msgid="834698001271562057">"به برنامه <xliff:g id="APPLICATION">%1$s</xliff:g> اجازه می‌دهید به دستگاه USB دسترسی داشته باشد؟"</string>
- <string name="usb_accessory_permission_prompt" msgid="5171775411178865750">"به برنامه <xliff:g id="APPLICATION">%1$s</xliff:g> اجازه می‌دهد تا به وسیله جانبی USB دسترسی داشته باشد؟"</string>
- <string name="usb_device_confirm_prompt" msgid="5161205258635253206">"وقتی این دستگاه USB وصل است، <xliff:g id="ACTIVITY">%1$s</xliff:g> باز شود؟"</string>
- <string name="usb_accessory_confirm_prompt" msgid="3808984931830229888">"وقتی این وسیله جانبی USB وصل است، <xliff:g id="ACTIVITY">%1$s</xliff:g> باز شود؟"</string>
- <string name="usb_accessory_uri_prompt" msgid="513450621413733343">"هیچ برنامهٔ کاربردی نصب شده‌ای با این وسیله جانبی USB کار نمی‌کند. در <xliff:g id="URL">%1$s</xliff:g> دربارهٔ این وسیله جانبی اطلاعات بیشتری کسب کنید"</string>
- <string name="title_usb_accessory" msgid="4966265263465181372">"لوازم جانبی USB"</string>
+ <string name="usb_device_permission_prompt" msgid="834698001271562057">"â€Ø¨Ù‡ برنامه <xliff:g id="APPLICATION">%1$s</xliff:g> اجازه می‌دهید به دستگاه USB دسترسی داشته باشد؟"</string>
+ <string name="usb_accessory_permission_prompt" msgid="5171775411178865750">"â€Ø¨Ù‡ برنامه <xliff:g id="APPLICATION">%1$s</xliff:g> اجازه می‌دهد تا به وسیله جانبی USB دسترسی داشته باشد؟"</string>
+ <string name="usb_device_confirm_prompt" msgid="5161205258635253206">"â€ÙˆÙ‚تی این دستگاه USB وصل است، <xliff:g id="ACTIVITY">%1$s</xliff:g> باز شود؟"</string>
+ <string name="usb_accessory_confirm_prompt" msgid="3808984931830229888">"â€ÙˆÙ‚تی این وسیله جانبی USB وصل است، <xliff:g id="ACTIVITY">%1$s</xliff:g> باز شود؟"</string>
+ <string name="usb_accessory_uri_prompt" msgid="513450621413733343">"â€Ù‡ÛŒÚ† برنامهٔ کاربردی نصب شده‌ای با این وسیله جانبی USB کار نمی‌کند. در <xliff:g id="URL">%1$s</xliff:g> دربارهٔ این وسیله جانبی اطلاعات بیشتری کسب کنید"</string>
+ <string name="title_usb_accessory" msgid="4966265263465181372">"â€Ù„وازم جانبی USB"</string>
<string name="label_view" msgid="6304565553218192990">"مشاهده"</string>
- <string name="always_use_device" msgid="1450287437017315906">"Ø§Ø³ØªÙØ§Ø¯Ù‡ به صورت Ù¾ÛŒØ´â€ŒÙØ±Ø¶ برای این دستگاه USB"</string>
- <string name="always_use_accessory" msgid="1210954576979621596">"Ø§Ø³ØªÙØ§Ø¯Ù‡ به صورت Ù¾ÛŒØ´â€ŒÙØ±Ø¶ برای این دستگاه USB"</string>
- <string name="usb_debugging_title" msgid="4513918393387141949">"اجازه به اشکال‌زدایی USB؟"</string>
- <string name="usb_debugging_message" msgid="2220143855912376496">"اثر انگشت کلید RSA رایانه: \n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
+ <string name="always_use_device" msgid="1450287437017315906">"â€Ø§Ø³ØªÙاده به صورت Ù¾ÛŒØ´â€ŒÙØ±Ø¶ برای این دستگاه USB"</string>
+ <string name="always_use_accessory" msgid="1210954576979621596">"â€Ø§Ø³ØªÙاده به صورت Ù¾ÛŒØ´â€ŒÙØ±Ø¶ برای این دستگاه USB"</string>
+ <string name="usb_debugging_title" msgid="4513918393387141949">"â€Ø§Ø¬Ø§Ø²Ù‡ به اشکال‌زدایی USBØŸ"</string>
+ <string name="usb_debugging_message" msgid="2220143855912376496">"â€Ø§Ø«Ø± انگشت کلید RSA رایانه: \n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"همیشه از این رایانه انجام شود"</string>
<string name="compat_mode_on" msgid="6623839244840638213">"بزرگنمایی برای پر کردن ØµÙØ­Ù‡"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"گسترده کردن برای پر کردن ØµÙØ­Ù‡"</string>
- <string name="compat_mode_help_header" msgid="7969493989397529910">"بزرگنمایی سازگاری"</string>
- <string name="compat_mode_help_body" msgid="4946726776359270040">"اگر یک برنامه برای ØµÙØ­Ù‡ Ú©ÙˆÚ†Ú© تری طراحی شده باشد، یک کنترل بزرگنمایی توسط ساعت نشان داده می‌شود."</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"در حال ذخیره تصویر ØµÙØ­Ù‡..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"در حال ذخیره تصویر ØµÙØ­Ù‡..."</string>
<string name="screenshot_saving_text" msgid="2419718443411738818">"تصویر ØµÙØ­Ù‡ ذخیره شد."</string>
@@ -70,14 +68,16 @@
<string name="screenshot_saved_text" msgid="1152839647677558815">"برای مشاهده تصویر ØµÙØ­Ù‡ خود، لمس کنید."</string>
<string name="screenshot_failed_title" msgid="705781116746922771">"تصویر ØµÙØ­Ù‡ Ú¯Ø±ÙØªÙ‡ نشد."</string>
<string name="screenshot_failed_text" msgid="8134011269572415402">"تصویر ØµÙØ­Ù‡ ذخیره نشد. ممکن است دستگاه ذخیره‌ در حال Ø§Ø³ØªÙØ§Ø¯Ù‡ باشد."</string>
- <string name="usb_preference_title" msgid="6551050377388882787">"گزینه‌های انتقال ÙØ§ÛŒÙ„ USB"</string>
- <string name="use_mtp_button_title" msgid="4333504413563023626">"نصب به‌عنوان دستگاه پخش رسانه (MTP)"</string>
- <string name="use_ptp_button_title" msgid="7517127540301625751">"تصب به‌عنوان دوربین (PTP)"</string>
- <string name="installer_cd_button_title" msgid="2312667578562201583">"برنامه Android File Transfer را برای Mac نصب کنید"</string>
+ <string name="usb_preference_title" msgid="6551050377388882787">"â€Ú¯Ø²ÛŒÙ†Ù‡â€ŒÙ‡Ø§ÛŒ انتقال ÙØ§ÛŒÙ„ USB"</string>
+ <string name="use_mtp_button_title" msgid="4333504413563023626">"â€Ù†ØµØ¨ به‌عنوان دستگاه پخش رسانه (MTP)"</string>
+ <string name="use_ptp_button_title" msgid="7517127540301625751">"â€ØªØµØ¨ به‌عنوان دوربین (PTP)"</string>
+ <string name="installer_cd_button_title" msgid="2312667578562201583">"â€Ø¨Ø±Ù†Ø§Ù…Ù‡ Android File Transfer را برای Mac نصب کنید"</string>
<string name="accessibility_back" msgid="567011538994429120">"برگشت"</string>
<string name="accessibility_home" msgid="8217216074895377641">"ØµÙØ­Ù‡Ù” اصلی"</string>
<string name="accessibility_menu" msgid="316839303324695949">"منو"</string>
<string name="accessibility_recent" msgid="8571350598987952883">"برنامه‌های اخیر"</string>
+ <string name="accessibility_search_light" msgid="1103867596330271848">"جستجو"</string>
+ <string name="accessibility_camera_button" msgid="8064671582820358152">"دوربین"</string>
<string name="accessibility_ime_switch_button" msgid="5032926134740456424">"کلید تغییر روش ورود متن."</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"دکمه بزرگنمایی سازگار."</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"بزرگنمایی از ØµÙØ­Ù‡â€ŒÙ‡Ø§ÛŒ Ú©ÙˆÚ†Ú© تا بزرگ."</string>
@@ -98,17 +98,17 @@
<string name="accessibility_data_two_bars" msgid="6166018492360432091">"دو نوار برای داده."</string>
<string name="accessibility_data_three_bars" msgid="9167670452395038520">"سه نوار برای داده."</string>
<string name="accessibility_data_signal_full" msgid="2708384608124519369">"قدرت سیگنال داده کامل است."</string>
- <string name="accessibility_wifi_off" msgid="3177380296697933627">"Wi‑Fi خاموش."</string>
- <string name="accessibility_no_wifi" msgid="1425476551827924474">"Wi-Fi قطع‌شد."</string>
- <string name="accessibility_wifi_one_bar" msgid="7735893178010724377">"یک نوار برای Wi‑Fi."</string>
- <string name="accessibility_wifi_two_bars" msgid="4994274250497262434">"دو نوار برای Wi‑Fi."</string>
- <string name="accessibility_wifi_three_bars" msgid="3495755044276588384">"سه نوار برای Wi‑Fi."</string>
- <string name="accessibility_wifi_signal_full" msgid="6853561303586480376">"قدرت سیگنال Wi‑Fi کامل است."</string>
- <string name="accessibility_no_wimax" msgid="4329180129727630368">"WiMAX وجود ندارد."</string>
- <string name="accessibility_wimax_one_bar" msgid="4170994299011863648">"WiMAX دارای یک نوار است."</string>
- <string name="accessibility_wimax_two_bars" msgid="9176236858336502288">"WiMAX دارای دو نوار است."</string>
- <string name="accessibility_wimax_three_bars" msgid="6116551636752103927">"WiMAX دارای سه نوار است."</string>
- <string name="accessibility_wimax_signal_full" msgid="2768089986795579558">"قدرت سیگنال WiMAX کامل است."</string>
+ <string name="accessibility_wifi_off" msgid="3177380296697933627">"â€Wi‑Fi خاموش."</string>
+ <string name="accessibility_no_wifi" msgid="1425476551827924474">"â€Wi-Fi قطع‌شد."</string>
+ <string name="accessibility_wifi_one_bar" msgid="7735893178010724377">"â€ÛŒÚ© نوار برای Wi‑Fi."</string>
+ <string name="accessibility_wifi_two_bars" msgid="4994274250497262434">"â€Ø¯Ùˆ نوار برای Wi‑Fi."</string>
+ <string name="accessibility_wifi_three_bars" msgid="3495755044276588384">"â€Ø³Ù‡ نوار برای Wi‑Fi."</string>
+ <string name="accessibility_wifi_signal_full" msgid="6853561303586480376">"â€Ù‚درت سیگنال Wi‑Fi کامل است."</string>
+ <string name="accessibility_no_wimax" msgid="4329180129727630368">"â€WiMAX وجود ندارد."</string>
+ <string name="accessibility_wimax_one_bar" msgid="4170994299011863648">"â€WiMAX دارای یک نوار است."</string>
+ <string name="accessibility_wimax_two_bars" msgid="9176236858336502288">"â€WiMAX دارای دو نوار است."</string>
+ <string name="accessibility_wimax_three_bars" msgid="6116551636752103927">"â€WiMAX دارای سه نوار است."</string>
+ <string name="accessibility_wimax_signal_full" msgid="2768089986795579558">"â€Ù‚درت سیگنال WiMAX کامل است."</string>
<string name="accessibility_no_signal" msgid="7064645320782585167">"ÙØ§Ù‚د سیگنال."</string>
<string name="accessibility_not_connected" msgid="6395326276213402883">"متصل نیست."</string>
<string name="accessibility_zero_bars" msgid="3806060224467027887">"بدون میله."</string>
@@ -137,9 +137,9 @@
<string name="accessibility_settings_button" msgid="799583911231893380">"تنظیمات سیستم."</string>
<string name="accessibility_notifications_button" msgid="4498000369779421892">"اعلان‌ها."</string>
<string name="accessibility_remove_notification" msgid="3603099514902182350">"پاک کردن اعلان"</string>
- <string name="accessibility_gps_enabled" msgid="3511469499240123019">"GPS ÙØ¹Ø§Ù„ شد."</string>
- <string name="accessibility_gps_acquiring" msgid="8959333351058967158">"دستیابی به GPS."</string>
- <string name="accessibility_tty_enabled" msgid="4613200365379426561">"TeleTypewriter ÙØ¹Ø§Ù„ شد."</string>
+ <string name="accessibility_gps_enabled" msgid="3511469499240123019">"â€GPS ÙØ¹Ø§Ù„ شد."</string>
+ <string name="accessibility_gps_acquiring" msgid="8959333351058967158">"â€Ø¯Ø³ØªÛŒØ§Ø¨ÛŒ به GPS."</string>
+ <string name="accessibility_tty_enabled" msgid="4613200365379426561">"â€TeleTypewriter ÙØ¹Ø§Ù„ شد."</string>
<string name="accessibility_ringer_vibrate" msgid="666585363364155055">"زنگ لرزشی."</string>
<string name="accessibility_ringer_silent" msgid="9061243307939135383">"زنگ بی‌صدا."</string>
<string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> نادیده Ú¯Ø±ÙØªÙ‡ شد."</string>
@@ -153,23 +153,25 @@
<string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"باتری <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_airplane" msgid="4196876722090224753">"حالت هواپیما <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="5749054971341882340">"بلوتوث <xliff:g id="STATE">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_location" msgid="4577282329866813100">"مکان <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"هشدار برای <xliff:g id="TIME">%s</xliff:g> تنظیم شد."</string>
- <string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"داده 2G-3G ØºÛŒØ±ÙØ¹Ø§Ù„ شد"</string>
- <string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"داده 4G غیر ÙØ¹Ø§Ù„ شد"</string>
+ <string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"â€Ø¯Ø§Ø¯Ù‡ 2G-3G ØºÛŒØ±ÙØ¹Ø§Ù„ شد"</string>
+ <string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"â€Ø¯Ø§Ø¯Ù‡ 4G غیر ÙØ¹Ø§Ù„ شد"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="1046047248844821202">"داده‌های تلÙÙ† همراه ØºÛŒØ±ÙØ¹Ø§Ù„ است"</string>
<string name="data_usage_disabled_dialog_title" msgid="2086815304858964954">"داده ØºÛŒØ±ÙØ¹Ø§Ù„ شد"</string>
<string name="data_usage_disabled_dialog" msgid="3853117269051806280">"به حداکثر محدوده مشخص شده برای Ø§Ø³ØªÙØ§Ø¯Ù‡ از داده رسیده‌اید.\n\nدر صورت ÙØ¹Ø§Ù„ کردن مجدد داده، ممکن است از طر٠اپراتور برای شما هزینه محاسبه شود."</string>
<string name="data_usage_disabled_dialog_enable" msgid="7729772039208664606">"ÙØ¹Ø§Ù„ کردن مجدد داده"</string>
<string name="status_bar_settings_signal_meter_disconnected" msgid="1940231521274147771">"اتصال اینترنتی وجود ندارد"</string>
- <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Wi-Fi متصل شد"</string>
- <string name="gps_notification_searching_text" msgid="8574247005642736060">"جستجو برای GPS"</string>
- <string name="gps_notification_found_text" msgid="4619274244146446464">"مکان تنظیم شده توسط GPS"</string>
+ <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"â€Wi-Fi متصل شد"</string>
+ <string name="gps_notification_searching_text" msgid="8574247005642736060">"â€Ø¬Ø³ØªØ¬Ùˆ برای GPS"</string>
+ <string name="gps_notification_found_text" msgid="4619274244146446464">"â€Ù…کان تنظیم شده توسط GPS"</string>
+ <string name="accessibility_location_active" msgid="2427290146138169014">"درخواست‌های موقعیت مکانی ÙØ¹Ø§Ù„ است"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"پاک کردن تمام اعلان‌ها"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"اطلاعات برنامه"</string>
<string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"ØµÙØ­Ù‡ به صورت خودکار می‌چرخد."</string>
<string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"ØµÙØ­Ù‡ اکنون در جهت اÙÙ‚ÛŒ Ù‚ÙÙ„ است."</string>
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"ØµÙØ­Ù‡ اکنون در جهت عمودی Ù‚ÙÙ„ است."</string>
- <string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
+ <string name="dessert_case" msgid="1295161776223959221">"ویترین دسر"</string>
<string name="start_dreams" msgid="7219575858348719790">"رویاپردازی"</string>
<string name="ethernet_label" msgid="7967563676324087464">"اترنت"</string>
<string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"حالت هواپیما"</string>
@@ -182,10 +184,8 @@
<string name="quick_settings_rotation_unlocked_label" msgid="336054930362580584">"چرخش خودکار"</string>
<string name="quick_settings_rotation_locked_label" msgid="8058646447242565486">"چرخش Ù‚ÙÙ„ شد"</string>
<string name="quick_settings_ime_label" msgid="7073463064369468429">"روش ورودی"</string>
- <!-- no translation found for quick_settings_location_label (5011327048748762257) -->
- <skip />
- <!-- no translation found for quick_settings_location_off_label (7464544086507331459) -->
- <skip />
+ <string name="quick_settings_location_label" msgid="5011327048748762257">"مکان"</string>
+ <string name="quick_settings_location_off_label" msgid="7464544086507331459">"مکان خاموش"</string>
<string name="quick_settings_media_device_label" msgid="1302906836372603762">"دستگاه رسانه"</string>
<string name="quick_settings_rssi_label" msgid="7725671335550695589">"RSSI"</string>
<string name="quick_settings_rssi_emergency_only" msgid="2713774041672886750">"Ùقط تماس‌های اضطراری"</string>
@@ -195,13 +195,13 @@
<string name="quick_settings_wifi_label" msgid="9135344704899546041">"Wi-Fi"</string>
<string name="quick_settings_wifi_not_connected" msgid="7171904845345573431">"متصل نیست"</string>
<string name="quick_settings_wifi_no_network" msgid="2221993077220856376">"شبکه‌ای موجود نیست"</string>
- <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi خاموش است"</string>
+ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"â€Wi-Fi خاموش است"</string>
<string name="quick_settings_wifi_display_label" msgid="6893592964463624333">"Wi-Fi Display"</string>
<string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"نمایش بدون سیم"</string>
<string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"روشنایی"</string>
<string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"خودکار"</string>
- <string name="status_bar_help_title" msgid="1199237744086469217">"اعلان‌ها در اینجا نمایش داده می‌شوند"</string>
- <string name="status_bar_help_text" msgid="7874607155052076323">"با کشیدن انگشت به طر٠پایین به آنها دسترسی پیدا کنید.\nبرای کنترل‌های سیستم دوباره انگشت خود را به سمت پایین بکشید."</string>
- <string name="hideybar_confirmation_message" msgid="9050869548951044371">"برای نمایش نوار، انگشت خود را از لبه‌ ØµÙØ­Ù‡ به داخل بکشید"</string>
- <string name="hideybar_confirmation_message_long" msgid="7117692795163620626">"برای نمایش نوار سیستم، انگشت خود را از لبه‌ ØµÙØ­Ù‡ به داخل بکشید"</string>
+ <string name="quick_settings_inversion_label" msgid="1666358784283020762">"حالت وارونگی رنگ"</string>
+ <string name="quick_settings_contrast_label" msgid="3319507551689108692">"حالت کنتراست Ø¨Ù‡Ø¨ÙˆØ¯ÛŒØ§ÙØªÙ‡"</string>
+ <string name="quick_settings_color_space_label" msgid="853443689745584770">"حالت تصحیح رنگ"</string>
+ <string name="ssl_ca_cert_warning" msgid="9005954106902053641">"ممکن است شبکه\nتحت نظارت باشد"</string>
</resources>
diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml
index 06e1926..2e9c5f3 100644
--- a/packages/SystemUI/res/values-fi/strings.xml
+++ b/packages/SystemUI/res/values-fi/strings.xml
@@ -61,8 +61,6 @@
<string name="usb_debugging_always" msgid="303335496705863070">"Salli aina tällä tietokoneella"</string>
<string name="compat_mode_on" msgid="6623839244840638213">"Zoomaa koko näyttöön"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Venytä koko näyttöön"</string>
- <string name="compat_mode_help_header" msgid="7969493989397529910">"Yhteensopivuuszoomaus"</string>
- <string name="compat_mode_help_body" msgid="4946726776359270040">"Jos sovellus on suunniteltu pienemmälle näytölle, kellon viereen tulee näkyviin zoomaussäädin."</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Tallennetaan kuvakaappausta..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Tallennetaan kuvakaappausta..."</string>
<string name="screenshot_saving_text" msgid="2419718443411738818">"Kuvakaappausta tallennetaan."</string>
@@ -78,6 +76,8 @@
<string name="accessibility_home" msgid="8217216074895377641">"Aloituspainike"</string>
<string name="accessibility_menu" msgid="316839303324695949">"Valikko"</string>
<string name="accessibility_recent" msgid="8571350598987952883">"Viimeaikaiset sovellukset"</string>
+ <string name="accessibility_search_light" msgid="1103867596330271848">"Haku"</string>
+ <string name="accessibility_camera_button" msgid="8064671582820358152">"Kamera"</string>
<string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Syöttötavan vaihtopainike."</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Yhteensopivuuszoomaus-painike."</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Zoomaa pienemmältä suuremmalle ruudulle."</string>
@@ -153,6 +153,7 @@
<string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"Akku: <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_airplane" msgid="4196876722090224753">"Lentokonetila <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="5749054971341882340">"Bluetooth: <xliff:g id="STATE">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_location" msgid="4577282329866813100">"Sijainti <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"Hälytys asetettu, aika: <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"2G-3G-tiedonsiirto pois käytöstä"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"4G-tiedonsiirto pois käytöstä"</string>
@@ -164,12 +165,13 @@
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Wifi yhdistetty"</string>
<string name="gps_notification_searching_text" msgid="8574247005642736060">"Haetaan GPS-yhteyttä"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"Sijainti määritetty GPS:n avulla"</string>
+ <string name="accessibility_location_active" msgid="2427290146138169014">"Sijaintipyynnöt aktiiviset"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"Tyhjennä kaikki ilmoitukset."</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Sovelluksen tiedot"</string>
<string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Ruutu kääntyy automaattisesti."</string>
<string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Ruutu on lukittu vaakasuuntaan."</string>
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Ruutu on lukittu pystysuuntaan."</string>
- <string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
+ <string name="dessert_case" msgid="1295161776223959221">"Jälkiruokavitriini"</string>
<string name="start_dreams" msgid="7219575858348719790">"Unelmat"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
<string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Lentokonetila"</string>
@@ -198,8 +200,8 @@
<string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Langaton näyttö"</string>
<string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Kirkkaus"</string>
<string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTO"</string>
- <string name="status_bar_help_title" msgid="1199237744086469217">"Ilmoitukset näkyvät tässä"</string>
- <string name="status_bar_help_text" msgid="7874607155052076323">"Näet ilmoitukset liu\'uttamalla sormea alas ruudulla.\nVoit palauttaa järjestelmän ohjaimet näkyviin liu\'uttamalla sormea alas uudelleen."</string>
- <string name="hideybar_confirmation_message" msgid="9050869548951044371">"Tuo palkki näkyviin liu\'uttamalla ruudun reunasta"</string>
- <string name="hideybar_confirmation_message_long" msgid="7117692795163620626">"Tuo järjestelmäpalkki näkyviin liu\'uttamalla ruudun reunasta"</string>
+ <string name="quick_settings_inversion_label" msgid="1666358784283020762">"Käänteinen väritila"</string>
+ <string name="quick_settings_contrast_label" msgid="3319507551689108692">"Kontrastinparannustila"</string>
+ <string name="quick_settings_color_space_label" msgid="853443689745584770">"Värinkorjaustila"</string>
+ <string name="ssl_ca_cert_warning" msgid="9005954106902053641">"Verkkoa saatetaan\nvalvoa"</string>
</resources>
diff --git a/packages/SystemUI/res/values-fr-rCA-land/strings.xml b/packages/SystemUI/res/values-fr-rCA-land/strings.xml
new file mode 100644
index 0000000..4775fc6
--- /dev/null
+++ b/packages/SystemUI/res/values-fr-rCA-land/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2010, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="toast_rotation_locked" msgid="7609673011431556092">"L\'écran est désormais verrouillé au format paysage."</string>
+</resources>
diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml
new file mode 100644
index 0000000..a0cc012
--- /dev/null
+++ b/packages/SystemUI/res/values-fr-rCA/strings.xml
@@ -0,0 +1,209 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="7164937344850004466">"IU système"</string>
+ <string name="status_bar_clear_all_button" msgid="7774721344716731603">"Effacer"</string>
+ <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Supprimer de la liste"</string>
+ <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Informations sur l\'application"</string>
+ <string name="status_bar_no_recent_apps" msgid="6576392951053994640">"Aucune application récente"</string>
+ <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Masquer les applications récentes"</string>
+ <plurals name="status_bar_accessibility_recent_apps">
+ <item quantity="one" msgid="5854176083865845541">"1 application récente"</item>
+ <item quantity="other" msgid="1040784359794890744">"%d applications récentes"</item>
+ </plurals>
+ <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Aucune notification"</string>
+ <string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"En cours"</string>
+ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Notifications"</string>
+ <string name="battery_low_title" msgid="2783104807551211639">"Brancher le chargeur"</string>
+ <string name="battery_low_subtitle" msgid="1752040062087829196">"Le niveau de la batterie est faible."</string>
+ <string name="battery_low_percent_format" msgid="1077244949318261761">"<xliff:g id="NUMBER">%d%%</xliff:g> restant(s)"</string>
+ <string name="invalid_charger" msgid="4549105996740522523">"Chargement USB non compatible.\nVous devez utiliser le chargeur fourni."</string>
+ <string name="battery_low_why" msgid="7279169609518386372">"Utilisation de la batterie"</string>
+ <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Paramètres"</string>
+ <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
+ <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Mode Avion"</string>
+ <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"Rotation auto de l\'écran"</string>
+ <string name="status_bar_settings_mute_label" msgid="554682549917429396">"MUET"</string>
+ <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"AUTOMATIQUE"</string>
+ <string name="status_bar_settings_notifications" msgid="397146176280905137">"Notifications"</string>
+ <string name="bluetooth_tethered" msgid="7094101612161133267">"Connexion Bluetooth partagée"</string>
+ <string name="status_bar_input_method_settings_configure_input_methods" msgid="3504292471512317827">"Configurer les modes de saisie"</string>
+ <string name="status_bar_use_physical_keyboard" msgid="7551903084416057810">"Clavier physique"</string>
+ <string name="usb_device_permission_prompt" msgid="834698001271562057">"Autoriser l\'application <xliff:g id="APPLICATION">%1$s</xliff:g> à accéder au périphérique USB?"</string>
+ <string name="usb_accessory_permission_prompt" msgid="5171775411178865750">"Autoriser l\'application <xliff:g id="APPLICATION">%1$s</xliff:g> à accéder à l\'accessoire USB?"</string>
+ <string name="usb_device_confirm_prompt" msgid="5161205258635253206">"Ouvrir <xliff:g id="ACTIVITY">%1$s</xliff:g> lors de la connexion de ce périphérique USB?"</string>
+ <string name="usb_accessory_confirm_prompt" msgid="3808984931830229888">"Ouvrir <xliff:g id="ACTIVITY">%1$s</xliff:g> lors de la connexion de cet accessoire USB?"</string>
+ <string name="usb_accessory_uri_prompt" msgid="513450621413733343">"Aucune application installée compatible avec accessoire USB. En savoir plus sur <xliff:g id="URL">%1$s</xliff:g>"</string>
+ <string name="title_usb_accessory" msgid="4966265263465181372">"Accessoire USB"</string>
+ <string name="label_view" msgid="6304565553218192990">"Afficher"</string>
+ <string name="always_use_device" msgid="1450287437017315906">"Utiliser par défaut pour ce périphérique USB"</string>
+ <string name="always_use_accessory" msgid="1210954576979621596">"Utiliser par défaut pour cet accessoire USB"</string>
+ <string name="usb_debugging_title" msgid="4513918393387141949">"Autoriser le débogage USB?"</string>
+ <string name="usb_debugging_message" msgid="2220143855912376496">"Empreinte numérique de la clé RSA de l\'ordinateur : \n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
+ <string name="usb_debugging_always" msgid="303335496705863070">"Toujours autoriser sur cet ordinateur"</string>
+ <string name="compat_mode_on" msgid="6623839244840638213">"Zoomer pour remplir l\'écran"</string>
+ <string name="compat_mode_off" msgid="4434467572461327898">"Étirer pour remplir l\'écran"</string>
+ <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Enregistrement capture écran…"</string>
+ <string name="screenshot_saving_title" msgid="8242282144535555697">"Enregistrement capture écran…"</string>
+ <string name="screenshot_saving_text" msgid="2419718443411738818">"Enregistrement de la capture d\'écran en cours…"</string>
+ <string name="screenshot_saved_title" msgid="6461865960961414961">"Capture d\'écran réussie"</string>
+ <string name="screenshot_saved_text" msgid="1152839647677558815">"Appuyez pour afficher votre capture d\'écran."</string>
+ <string name="screenshot_failed_title" msgid="705781116746922771">"Impossible de réaliser une capture d\'écran"</string>
+ <string name="screenshot_failed_text" msgid="8134011269572415402">"Impossible enregistrer capture d\'écran. Périphérique de stockage peut-être en cours d\'utilisation."</string>
+ <string name="usb_preference_title" msgid="6551050377388882787">"Options transfert fichiers USB"</string>
+ <string name="use_mtp_button_title" msgid="4333504413563023626">"Installer comme un lecteur multimédia (MTP)"</string>
+ <string name="use_ptp_button_title" msgid="7517127540301625751">"Installer comme un appareil photo (PTP)"</string>
+ <string name="installer_cd_button_title" msgid="2312667578562201583">"Installer application Android File Transfer (Mac)"</string>
+ <string name="accessibility_back" msgid="567011538994429120">"Précédent"</string>
+ <string name="accessibility_home" msgid="8217216074895377641">"Domicile"</string>
+ <string name="accessibility_menu" msgid="316839303324695949">"Menu"</string>
+ <string name="accessibility_recent" msgid="8571350598987952883">"Applications récentes"</string>
+ <string name="accessibility_search_light" msgid="1103867596330271848">"Rechercher"</string>
+ <string name="accessibility_camera_button" msgid="8064671582820358152">"Appareil photo"</string>
+ <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Bouton \"Changer le mode de saisie\""</string>
+ <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Bouton \"Zoom de compatibilité\""</string>
+ <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Zoom de compatibilité avec la taille de l\'écran"</string>
+ <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth connecté"</string>
+ <string name="accessibility_bluetooth_disconnected" msgid="7416648669976870175">"Bluetooth déconnecté"</string>
+ <string name="accessibility_no_battery" msgid="358343022352820946">"Batterie vide"</string>
+ <string name="accessibility_battery_one_bar" msgid="7774887721891057523">"Niveau de batterie : faible"</string>
+ <string name="accessibility_battery_two_bars" msgid="8500650438735009973">"Niveau de batterie : moyen"</string>
+ <string name="accessibility_battery_three_bars" msgid="2302983330865040446">"Niveau de batterie : bon"</string>
+ <string name="accessibility_battery_full" msgid="8909122401720158582">"Batterie pleine"</string>
+ <string name="accessibility_no_phone" msgid="4894708937052611281">"Aucun signal"</string>
+ <string name="accessibility_phone_one_bar" msgid="687699278132664115">"Signal : faible"</string>
+ <string name="accessibility_phone_two_bars" msgid="8384905382804815201">"Signal : moyen"</string>
+ <string name="accessibility_phone_three_bars" msgid="8521904843919971885">"Signal : bon"</string>
+ <string name="accessibility_phone_signal_full" msgid="6471834868580757898">"Signal excellent"</string>
+ <string name="accessibility_no_data" msgid="4791966295096867555">"Aucun signal"</string>
+ <string name="accessibility_data_one_bar" msgid="1415625833238273628">"Signal faible"</string>
+ <string name="accessibility_data_two_bars" msgid="6166018492360432091">"Signal moyen"</string>
+ <string name="accessibility_data_three_bars" msgid="9167670452395038520">"Signal bon"</string>
+ <string name="accessibility_data_signal_full" msgid="2708384608124519369">"Signal excellent"</string>
+ <string name="accessibility_wifi_off" msgid="3177380296697933627">"Wi-Fi désactivé"</string>
+ <string name="accessibility_no_wifi" msgid="1425476551827924474">"Wi-Fi déconnecté"</string>
+ <string name="accessibility_wifi_one_bar" msgid="7735893178010724377">"Signal Wi-Fi faible"</string>
+ <string name="accessibility_wifi_two_bars" msgid="4994274250497262434">"Signal Wi-Fi moyen"</string>
+ <string name="accessibility_wifi_three_bars" msgid="3495755044276588384">"Signal Wi-Fi bon"</string>
+ <string name="accessibility_wifi_signal_full" msgid="6853561303586480376">"Signal Wi-Fi excellent"</string>
+ <string name="accessibility_no_wimax" msgid="4329180129727630368">"Aucun signal WiMAX"</string>
+ <string name="accessibility_wimax_one_bar" msgid="4170994299011863648">"Signal WiMAX : faible"</string>
+ <string name="accessibility_wimax_two_bars" msgid="9176236858336502288">"Signal WiMAX : moyen"</string>
+ <string name="accessibility_wimax_three_bars" msgid="6116551636752103927">"Signal WiMAX : bon"</string>
+ <string name="accessibility_wimax_signal_full" msgid="2768089986795579558">"Signal WiMAX : excellent"</string>
+ <string name="accessibility_no_signal" msgid="7064645320782585167">"Aucun signal"</string>
+ <string name="accessibility_not_connected" msgid="6395326276213402883">"Non connecté"</string>
+ <string name="accessibility_zero_bars" msgid="3806060224467027887">"Aucun signal"</string>
+ <string name="accessibility_one_bar" msgid="1685730113192081895">"Signal faible"</string>
+ <string name="accessibility_two_bars" msgid="6437363648385206679">"Moyen"</string>
+ <string name="accessibility_three_bars" msgid="2648241415119396648">"Bon"</string>
+ <string name="accessibility_signal_full" msgid="9122922886519676839">"Signal excellent"</string>
+ <string name="accessibility_desc_on" msgid="2385254693624345265">"Activé"</string>
+ <string name="accessibility_desc_off" msgid="6475508157786853157">"Désactivé"</string>
+ <string name="accessibility_desc_connected" msgid="8366256693719499665">"Connecté"</string>
+ <string name="accessibility_data_connection_gprs" msgid="1606477224486747751">"GPRS"</string>
+ <string name="accessibility_data_connection_1x" msgid="994133468120244018">"1x"</string>
+ <string name="accessibility_data_connection_hspa" msgid="2032328855462645198">"3G+"</string>
+ <string name="accessibility_data_connection_3g" msgid="8628562305003568260">"3G"</string>
+ <string name="accessibility_data_connection_3.5g" msgid="8664845609981692001">"3G+"</string>
+ <string name="accessibility_data_connection_4g" msgid="7741000750630089612">"4G"</string>
+ <string name="accessibility_data_connection_lte" msgid="5413468808637540658">"LTE"</string>
+ <string name="accessibility_data_connection_cdma" msgid="6132648193978823023">"CDMA"</string>
+ <string name="accessibility_data_connection_roaming" msgid="5977362333466556094">"Itinérance"</string>
+ <string name="accessibility_data_connection_edge" msgid="4477457051631979278">"EDGE"</string>
+ <string name="accessibility_data_connection_wifi" msgid="2324496756590645221">"Wi-Fi"</string>
+ <string name="accessibility_no_sim" msgid="8274017118472455155">"Aucune carte SIM"</string>
+ <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Partage de connexion Bluetooth"</string>
+ <string name="accessibility_airplane_mode" msgid="834748999790763092">"Mode Avion"</string>
+ <!-- String.format failed for translation -->
+ <!-- no translation found for accessibility_battery_level (7451474187113371965) -->
+ <skip />
+ <string name="accessibility_settings_button" msgid="799583911231893380">"Paramètres système"</string>
+ <string name="accessibility_notifications_button" msgid="4498000369779421892">"Notifications"</string>
+ <string name="accessibility_remove_notification" msgid="3603099514902182350">"Supprimer la notification"</string>
+ <string name="accessibility_gps_enabled" msgid="3511469499240123019">"GPS activé"</string>
+ <string name="accessibility_gps_acquiring" msgid="8959333351058967158">"Acquisition de données GPS"</string>
+ <string name="accessibility_tty_enabled" msgid="4613200365379426561">"Téléscripteur activé"</string>
+ <string name="accessibility_ringer_vibrate" msgid="666585363364155055">"Sonnerie en mode vibreur"</string>
+ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"Sonnerie en mode silencieux"</string>
+ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"Application \"<xliff:g id="APP">%s</xliff:g>\" ignorée."</string>
+ <string name="accessibility_notification_dismissed" msgid="854211387186306927">"Notification masquée"</string>
+ <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Volet des notifications"</string>
+ <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Paramètres rapides"</string>
+ <string name="accessibility_desc_recent_apps" msgid="9014032916410590027">"Applications récentes"</string>
+ <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Utilisateur : <xliff:g id="USER">%s</xliff:g>"</string>
+ <string name="accessibility_quick_settings_wifi" msgid="6099781031669728709">"<xliff:g id="SIGNAL">%1$s</xliff:g>, <xliff:g id="NETWORK">%2$s</xliff:g>"</string>
+ <string name="accessibility_quick_settings_mobile" msgid="4876806564086241341">"Signal mobile : <xliff:g id="SIGNAL">%1$s</xliff:g>, <xliff:g id="TYPE">%2$s</xliff:g>, <xliff:g id="NETWORK">%3$s</xliff:g>"</string>
+ <string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"Batterie : <xliff:g id="STATE">%s</xliff:g>"</string>
+ <string name="accessibility_quick_settings_airplane" msgid="4196876722090224753">"Mode Avion : <xliff:g id="STATE">%s</xliff:g>"</string>
+ <string name="accessibility_quick_settings_bluetooth" msgid="5749054971341882340">"Bluetooth : <xliff:g id="STATE">%s</xliff:g>"</string>
+ <string name="accessibility_quick_settings_location" msgid="4577282329866813100">"Localisation <xliff:g id="STATE">%s</xliff:g>"</string>
+ <string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"Alarme réglée sur <xliff:g id="TIME">%s</xliff:g>"</string>
+ <string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"Données 2G-3G désactivées"</string>
+ <string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"Données 4G désactivées"</string>
+ <string name="data_usage_disabled_dialog_mobile_title" msgid="1046047248844821202">"Données mobiles désactivées"</string>
+ <string name="data_usage_disabled_dialog_title" msgid="2086815304858964954">"Données désactivées"</string>
+ <string name="data_usage_disabled_dialog" msgid="3853117269051806280">"Vous avez atteint le plafond de consommation de données spécifié.\n\nSi vous utilisez des données supplémentaires, celles-ci pourront être facturées par l\'opérateur."</string>
+ <string name="data_usage_disabled_dialog_enable" msgid="7729772039208664606">"Réactiver connexion données"</string>
+ <string name="status_bar_settings_signal_meter_disconnected" msgid="1940231521274147771">"Aucune connexion Internet"</string>
+ <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Connecté au Wi-Fi"</string>
+ <string name="gps_notification_searching_text" msgid="8574247005642736060">"Recherche de GPS..."</string>
+ <string name="gps_notification_found_text" msgid="4619274244146446464">"Position définie par GPS"</string>
+ <string name="accessibility_location_active" msgid="2427290146138169014">"Demandes de localisation actives"</string>
+ <string name="accessibility_clear_all" msgid="5235938559247164925">"Supprimer toutes les notifications"</string>
+ <string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Informations sur l\'application"</string>
+ <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"L\'écran pivote automatiquement."</string>
+ <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"L\'écran est verrouillé en mode paysage."</string>
+ <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"L\'écran est verrouillé en mode portrait."</string>
+ <string name="dessert_case" msgid="1295161776223959221">"Vitrine des desserts"</string>
+ <string name="start_dreams" msgid="7219575858348719790">"Écran de veille"</string>
+ <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
+ <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Mode Avion"</string>
+ <string name="quick_settings_battery_charging_label" msgid="490074774465309209">"En charge (<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
+ <string name="quick_settings_battery_charged_label" msgid="8865413079414246081">"Chargée"</string>
+ <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string>
+ <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (<xliff:g id="NUMBER">%d</xliff:g> appareils)"</string>
+ <string name="quick_settings_bluetooth_off_label" msgid="8159652146149219937">"BLUETOOTH DÉSACTIVÉ"</string>
+ <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Luminosité"</string>
+ <string name="quick_settings_rotation_unlocked_label" msgid="336054930362580584">"Rotation automatique"</string>
+ <string name="quick_settings_rotation_locked_label" msgid="8058646447242565486">"Rotation verrouillée"</string>
+ <string name="quick_settings_ime_label" msgid="7073463064369468429">"Mode de saisie"</string>
+ <string name="quick_settings_location_label" msgid="5011327048748762257">"Position"</string>
+ <string name="quick_settings_location_off_label" msgid="7464544086507331459">"Localisation désactivée"</string>
+ <string name="quick_settings_media_device_label" msgid="1302906836372603762">"Appareil multimédia"</string>
+ <string name="quick_settings_rssi_label" msgid="7725671335550695589">"RSSI"</string>
+ <string name="quick_settings_rssi_emergency_only" msgid="2713774041672886750">"Appels d\'urgence uniquement"</string>
+ <string name="quick_settings_settings_label" msgid="5326556592578065401">"Paramètres"</string>
+ <string name="quick_settings_time_label" msgid="4635969182239736408">"Heures"</string>
+ <string name="quick_settings_user_label" msgid="5238995632130897840">"Moi"</string>
+ <string name="quick_settings_wifi_label" msgid="9135344704899546041">"Wi-Fi"</string>
+ <string name="quick_settings_wifi_not_connected" msgid="7171904845345573431">"Non connecté"</string>
+ <string name="quick_settings_wifi_no_network" msgid="2221993077220856376">"Aucun réseau"</string>
+ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi désactivé"</string>
+ <string name="quick_settings_wifi_display_label" msgid="6893592964463624333">"Affichage Wi-Fi"</string>
+ <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Affichage sans fil"</string>
+ <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Luminosité"</string>
+ <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTOMATIQUE"</string>
+ <string name="quick_settings_inversion_label" msgid="1666358784283020762">"Mode d\'inversion des couleurs"</string>
+ <string name="quick_settings_contrast_label" msgid="3319507551689108692">"Mode d\'accentuation du contraste"</string>
+ <string name="quick_settings_color_space_label" msgid="853443689745584770">"Mode de correction des couleurs"</string>
+ <string name="ssl_ca_cert_warning" msgid="9005954106902053641">"Le réseau peut\nêtre surveillé."</string>
+</resources>
diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml
index 7db07e2..7b1e100 100644
--- a/packages/SystemUI/res/values-fr/strings.xml
+++ b/packages/SystemUI/res/values-fr/strings.xml
@@ -61,8 +61,6 @@
<string name="usb_debugging_always" msgid="303335496705863070">"Toujours autoriser sur cet ordinateur"</string>
<string name="compat_mode_on" msgid="6623839244840638213">"Zoomer pour remplir l\'écran"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Étirer pour remplir l\'écran"</string>
- <string name="compat_mode_help_header" msgid="7969493989397529910">"Zoom de compatibilité"</string>
- <string name="compat_mode_help_body" msgid="4946726776359270040">"Si une application a été conçue pour un écran plus petit, une commande de zoom s\'affiche à côté de l\'horloge."</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Enregistrement capture écran…"</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Enregistrement de la capture d\'écran…"</string>
<string name="screenshot_saving_text" msgid="2419718443411738818">"Enregistrement de la capture d\'écran en cours…"</string>
@@ -78,6 +76,8 @@
<string name="accessibility_home" msgid="8217216074895377641">"Accueil"</string>
<string name="accessibility_menu" msgid="316839303324695949">"Menu"</string>
<string name="accessibility_recent" msgid="8571350598987952883">"Applications récentes"</string>
+ <string name="accessibility_search_light" msgid="1103867596330271848">"Rechercher"</string>
+ <string name="accessibility_camera_button" msgid="8064671582820358152">"Appareil photo"</string>
<string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Bouton \"Changer le mode de saisie\""</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Bouton \"Zoom de compatibilité\""</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Zoom de compatibilité avec la taille de l\'écran"</string>
@@ -155,6 +155,7 @@
<string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"Batterie : <xliff:g id="STATE">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_airplane" msgid="4196876722090224753">"Mode Avion : <xliff:g id="STATE">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_bluetooth" msgid="5749054971341882340">"Bluetooth : <xliff:g id="STATE">%s</xliff:g>"</string>
+ <string name="accessibility_quick_settings_location" msgid="4577282329866813100">"Localisation <xliff:g id="STATE">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"Alarme réglée sur <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"Données 2G-3G désactivées"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"Données 4G désactivées"</string>
@@ -166,12 +167,13 @@
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Connecté au Wi-Fi"</string>
<string name="gps_notification_searching_text" msgid="8574247005642736060">"Recherche de GPS..."</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"Position définie par GPS"</string>
+ <string name="accessibility_location_active" msgid="2427290146138169014">"Demandes de localisation actives"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"Supprimer toutes les notifications"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Informations sur l\'application"</string>
<string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"L\'écran pivote automatiquement."</string>
<string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"L\'écran est verrouillé en mode paysage."</string>
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"L\'écran est verrouillé en mode portrait."</string>
- <string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
+ <string name="dessert_case" msgid="1295161776223959221">"Vitrine des desserts"</string>
<string name="start_dreams" msgid="7219575858348719790">"Écran de veille interactif"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
<string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Mode avion"</string>
@@ -184,10 +186,8 @@
<string name="quick_settings_rotation_unlocked_label" msgid="336054930362580584">"Rotation auto"</string>
<string name="quick_settings_rotation_locked_label" msgid="8058646447242565486">"Rotation bloquée"</string>
<string name="quick_settings_ime_label" msgid="7073463064369468429">"Mode de saisie"</string>
- <!-- no translation found for quick_settings_location_label (5011327048748762257) -->
- <skip />
- <!-- no translation found for quick_settings_location_off_label (7464544086507331459) -->
- <skip />
+ <string name="quick_settings_location_label" msgid="5011327048748762257">"Localisation"</string>
+ <string name="quick_settings_location_off_label" msgid="7464544086507331459">"Localisation désactivée"</string>
<string name="quick_settings_media_device_label" msgid="1302906836372603762">"Appareil multimédia"</string>
<string name="quick_settings_rssi_label" msgid="7725671335550695589">"RSSI"</string>
<string name="quick_settings_rssi_emergency_only" msgid="2713774041672886750">"Appels d\'urgence uniquement"</string>
@@ -202,8 +202,8 @@
<string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Affichage sans fil"</string>
<string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Luminosité"</string>
<string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTOMATIQUE"</string>
- <string name="status_bar_help_title" msgid="1199237744086469217">"Les notifications s’affichent ici"</string>
- <string name="status_bar_help_text" msgid="7874607155052076323">"Accédez-y à tout moment en faisant glisser le doigt vers le bas.\nRépétez l\'opération pour accéder aux commandes du système."</string>
- <string name="hideybar_confirmation_message" msgid="9050869548951044371">"Faites glisser votre doigt sur le côté de l\'écran pour afficher la barre."</string>
- <string name="hideybar_confirmation_message_long" msgid="7117692795163620626">"Faites glisser votre doigt à partir d\'un côté de l\'écran pour afficher la barre système."</string>
+ <string name="quick_settings_inversion_label" msgid="1666358784283020762">"Mode d\'inversion des couleurs"</string>
+ <string name="quick_settings_contrast_label" msgid="3319507551689108692">"Mode d\'accentuation du contraste"</string>
+ <string name="quick_settings_color_space_label" msgid="853443689745584770">"Mode de correction des couleurs"</string>
+ <string name="ssl_ca_cert_warning" msgid="9005954106902053641">"Le réseau peut\nêtre surveillé."</string>
</resources>
diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml
index 862e2ef..59c5dbd 100644
--- a/packages/SystemUI/res/values-hi/strings.xml
+++ b/packages/SystemUI/res/values-hi/strings.xml
@@ -22,12 +22,12 @@
<string name="app_label" msgid="7164937344850004466">"सिसà¥â€à¤Ÿà¤® UI"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"साफ़ करें"</string>
<string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"सूची से निकालें"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"à¤à¤ªà¥â€à¤²à¤¿à¤•ेशन जानकारी"</string>
- <string name="status_bar_no_recent_apps" msgid="6576392951053994640">"कोई हाल ही के à¤à¤ªà¥à¤²à¤¿à¤•ेशन नहीं"</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"हाल ही के à¤à¤ªà¥à¤²à¤¿à¤•ेशन खारिज करें"</string>
+ <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"à¤à¤ªà¥à¤¸ जानकारी"</string>
+ <string name="status_bar_no_recent_apps" msgid="6576392951053994640">"कोई हाल ही के à¤à¤ªà¥à¤¸ नहीं"</string>
+ <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"हाल ही के à¤à¤ªà¥à¤¸ खारिज करें"</string>
<plurals name="status_bar_accessibility_recent_apps">
- <item quantity="one" msgid="5854176083865845541">"1 हाल ही का à¤à¤ªà¥à¤²à¤¿à¤•ेशन"</item>
- <item quantity="other" msgid="1040784359794890744">"%d हाल ही के à¤à¤ªà¥à¤²à¤¿à¤•ेशन"</item>
+ <item quantity="one" msgid="5854176083865845541">"1 हाल ही का à¤à¤ªà¥à¤¸"</item>
+ <item quantity="other" msgid="1040784359794890744">"%d हाल ही के à¤à¤ªà¥à¤¸"</item>
</plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"कोई सूचना नहीं"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"ऑनगोइंग"</string>
@@ -40,18 +40,18 @@
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"सेटिंग"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
<string name="status_bar_settings_airplane" msgid="4879879698500955300">"हवाई जहाज मोड"</string>
- <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"सà¥â€à¤•à¥à¤°à¥€à¤¨ सà¥â€à¤µà¤¤: घà¥à¤®à¤¾à¤à¤‚"</string>
+ <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"सà¥â€à¤•à¥à¤°à¥€à¤¨ अपनेआप घà¥à¤®à¤¾à¤à¤‚"</string>
<string name="status_bar_settings_mute_label" msgid="554682549917429396">"मà¥à¤¯à¥‚ट करें"</string>
<string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"सà¥à¤µà¤¤:"</string>
<string name="status_bar_settings_notifications" msgid="397146176280905137">"सूचनाà¤à¤‚"</string>
<string name="bluetooth_tethered" msgid="7094101612161133267">"Bluetooth टीदर किया गया"</string>
<string name="status_bar_input_method_settings_configure_input_methods" msgid="3504292471512317827">"इनपà¥à¤Ÿ पदà¥à¤§à¤¤à¤¿ सेट करें"</string>
<string name="status_bar_use_physical_keyboard" msgid="7551903084416057810">"भौतिक कीबोरà¥à¤¡"</string>
- <string name="usb_device_permission_prompt" msgid="834698001271562057">"à¤à¤ªà¥à¤²à¤¿à¤•ेशन <xliff:g id="APPLICATION">%1$s</xliff:g> को USB उपकरण तक पहà¥à¤‚चने दें?"</string>
- <string name="usb_accessory_permission_prompt" msgid="5171775411178865750">"à¤à¤ªà¥à¤²à¤¿à¤•ेशन <xliff:g id="APPLICATION">%1$s</xliff:g> को USB सहायक उपकरण तक पहà¥à¤‚चने दें?"</string>
+ <string name="usb_device_permission_prompt" msgid="834698001271562057">"à¤à¤ªà¥à¤¸ <xliff:g id="APPLICATION">%1$s</xliff:g> को USB उपकरण तक पहà¥à¤‚चने दें?"</string>
+ <string name="usb_accessory_permission_prompt" msgid="5171775411178865750">"à¤à¤ªà¥à¤¸ <xliff:g id="APPLICATION">%1$s</xliff:g> को USB सहायक उपकरण तक पहà¥à¤‚चने दें?"</string>
<string name="usb_device_confirm_prompt" msgid="5161205258635253206">"जब यह USB उपकरण कनेकà¥à¤Ÿ किया जाà¤, तब <xliff:g id="ACTIVITY">%1$s</xliff:g> को खोलें?"</string>
<string name="usb_accessory_confirm_prompt" msgid="3808984931830229888">"जब यह USB à¤à¤¸à¥‡à¤¸à¤°à¥€ कनेकà¥à¤Ÿ की जाà¤, तब <xliff:g id="ACTIVITY">%1$s</xliff:g> को खोलें?"</string>
- <string name="usb_accessory_uri_prompt" msgid="513450621413733343">"इस USB सहायक उपकरण के साथ कोई भी इंसà¥à¤Ÿà¥‰à¤² à¤à¤ªà¥à¤²à¤¿à¤•ेशन काम नहीं करता. इस सहायक उपकरण के बारे में यहां अधिक जानें: <xliff:g id="URL">%1$s</xliff:g>"</string>
+ <string name="usb_accessory_uri_prompt" msgid="513450621413733343">"इस USB सहायक उपकरण के साथ कोई भी इंसà¥à¤Ÿà¥‰à¤² à¤à¤ªà¥à¤¸ काम नहीं करता. इस सहायक उपकरण के बारे में यहां अधिक जानें: <xliff:g id="URL">%1$s</xliff:g>"</string>
<string name="title_usb_accessory" msgid="4966265263465181372">"USB सहायक साधन"</string>
<string name="label_view" msgid="6304565553218192990">"देखें"</string>
<string name="always_use_device" msgid="1450287437017315906">"इस USB उपकरण के लिठडिफ़ॉलà¥â€à¤Ÿ रूप से उपयोग करें"</string>
@@ -61,8 +61,6 @@
<string name="usb_debugging_always" msgid="303335496705863070">"इस कंपà¥à¤¯à¥‚टर से हमेशा अनà¥à¤®à¤¤à¤¿ दें"</string>
<string name="compat_mode_on" msgid="6623839244840638213">"सà¥â€à¤•à¥à¤°à¥€à¤¨ भरने हेतॠज़ूम करें"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"सà¥â€à¤•à¥à¤°à¥€à¤¨ को भरने के लिठखींचें"</string>
- <string name="compat_mode_help_header" msgid="7969493989397529910">"संगतता ज़ूम"</string>
- <string name="compat_mode_help_body" msgid="4946726776359270040">"जब किसी छोटी सà¥â€à¤•à¥à¤°à¥€à¤¨ के लिठà¤à¤ªà¥â€à¤²à¤¿à¤•ेशन को डिज़ाइन किया जाता है, तो ज़ूम नियंतà¥à¤°à¤£ कà¥à¤²à¥‰à¤• के पास दिखाई देगा."</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"सà¥à¤•à¥à¤°à¥€à¤¨à¤¶à¥‰à¤Ÿ सहेजा जा रहा है..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"सà¥à¤•à¥à¤°à¥€à¤¨à¤¶à¥‰à¤Ÿ सहेजा जा रहा है..."</string>
<string name="screenshot_saving_text" msgid="2419718443411738818">"सà¥à¤•à¥à¤°à¥€à¤¨à¤¶à¥‰à¤Ÿ सहेजा जा रहा है."</string>
@@ -73,11 +71,13 @@
<string name="usb_preference_title" msgid="6551050377388882787">"USB फ़ाइल सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरण विकलà¥à¤ª"</string>
<string name="use_mtp_button_title" msgid="4333504413563023626">"मीडिया पà¥à¤²à¥‡à¤¯à¤° के रूप में माउंट करें (MTP)"</string>
<string name="use_ptp_button_title" msgid="7517127540301625751">"कैमरे के रूप में माउंट करें (PTP)"</string>
- <string name="installer_cd_button_title" msgid="2312667578562201583">"Mac के लिठAndroid File Transfer à¤à¤ªà¥à¤²à¤¿. इंसà¥à¤Ÿà¥‰à¤² करें"</string>
+ <string name="installer_cd_button_title" msgid="2312667578562201583">"Mac के लिठAndroid File Transfer à¤à¤ªà¥à¤¸ इंसà¥à¤Ÿà¥‰à¤² करें"</string>
<string name="accessibility_back" msgid="567011538994429120">"वापस जाà¤à¤‚"</string>
<string name="accessibility_home" msgid="8217216074895377641">"होम"</string>
<string name="accessibility_menu" msgid="316839303324695949">"मेनू"</string>
- <string name="accessibility_recent" msgid="8571350598987952883">"हाल ही के à¤à¤ªà¥â€à¤²à¤¿à¤•ेशन"</string>
+ <string name="accessibility_recent" msgid="8571350598987952883">"हाल ही के à¤à¤ªà¥à¤¸"</string>
+ <string name="accessibility_search_light" msgid="1103867596330271848">"खोजें"</string>
+ <string name="accessibility_camera_button" msgid="8064671582820358152">"कैमरा"</string>
<string name="accessibility_ime_switch_button" msgid="5032926134740456424">"इनपà¥à¤Ÿ पदà¥à¤§à¤¤à¤¿â€ बटन सà¥à¤µà¤¿à¤š करें."</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"संगतता ज़ूम बटन."</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"छोटी से बड़ी सà¥â€à¤•à¥à¤°à¥€à¤¨ पर ज़ूम करें."</string>
@@ -146,13 +146,14 @@
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"सूचना खारिज की गई."</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"सूचना शेड."</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"तà¥à¤µà¤°à¤¿à¤¤ सेटिंग."</string>
- <string name="accessibility_desc_recent_apps" msgid="9014032916410590027">"हाल ही के à¤à¤ªà¥â€à¤²à¤¿à¤•ेशन."</string>
+ <string name="accessibility_desc_recent_apps" msgid="9014032916410590027">"हाल ही के à¤à¤ªà¥à¤¸."</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"उपयोगकरà¥à¤¤à¤¾ <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="6099781031669728709">"<xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="NETWORK">%2$s</xliff:g>"</string>
<string name="accessibility_quick_settings_mobile" msgid="4876806564086241341">"मोबाइल <xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="TYPE">%2$s</xliff:g>. <xliff:g id="NETWORK">%3$s</xliff:g>."</string>
<string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"बैटरी <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_airplane" msgid="4196876722090224753">"हवाई जहाज़ मोड <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="5749054971341882340">"Bluetooth <xliff:g id="STATE">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_location" msgid="4577282329866813100">"सà¥à¤¥à¤¾à¤¨ <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"<xliff:g id="TIME">%s</xliff:g> के लिठअलारà¥à¤® सेट किया गया."</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"2G-3G डेटा अकà¥à¤·à¤®"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"4G डेटा अकà¥à¤·à¤®"</string>
@@ -164,13 +165,14 @@
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Wi-Fi कनेकà¥â€à¤Ÿ किया गया"</string>
<string name="gps_notification_searching_text" msgid="8574247005642736060">"GPS को खोजा जा रहा है"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"GPS दà¥à¤µà¤¾à¤°à¤¾ सेट किया गया सà¥â€à¤¥à¤¾à¤¨"</string>
+ <string name="accessibility_location_active" msgid="2427290146138169014">"सà¥à¤¥à¤¾à¤¨ अनà¥à¤°à¥‹à¤§ सकà¥à¤°à¤¿à¤¯"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"सभी सूचनाà¤à¤‚ साफ़ करें."</string>
- <string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"à¤à¤ªà¥â€à¤²à¤¿à¤•ेशन जानकारी"</string>
+ <string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"à¤à¤ªà¥à¤¸ जानकारी"</string>
<string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"सà¥â€à¤•à¥à¤°à¥€à¤¨ सà¥â€à¤µà¤šà¤¾à¤²à¤¿à¤¤ रूप से घूमेगी."</string>
<string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"सà¥â€à¤•à¥à¤°à¥€à¤¨ लैंडसà¥à¤•ेप अभिविनà¥à¤¯à¤¾à¤¸ में लॉक है."</string>
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"सà¥â€à¤•à¥à¤°à¥€à¤¨ पोरà¥à¤Ÿà¥à¤°à¥‡à¤Ÿ अभिविनà¥â€à¤¯à¤¾à¤¸ में लॉक है."</string>
- <string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
- <string name="start_dreams" msgid="7219575858348719790">"Daydream"</string>
+ <string name="dessert_case" msgid="1295161776223959221">"मिठाई का डिबà¥à¤¬à¤¾"</string>
+ <string name="start_dreams" msgid="7219575858348719790">"दिवासà¥à¤µà¤ªà¥à¤¨"</string>
<string name="ethernet_label" msgid="7967563676324087464">"ईथरनेट"</string>
<string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"हवाई जहाज़ मोड"</string>
<string name="quick_settings_battery_charging_label" msgid="490074774465309209">"चारà¥à¤œ हो रही है, <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
@@ -178,7 +180,7 @@
<string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string>
<string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (<xliff:g id="NUMBER">%d</xliff:g> उपकरण)"</string>
<string name="quick_settings_bluetooth_off_label" msgid="8159652146149219937">"Bluetooth बंद"</string>
- <string name="quick_settings_brightness_label" msgid="6968372297018755815">"चमक"</string>
+ <string name="quick_settings_brightness_label" msgid="6968372297018755815">"सà¥à¤•à¥à¤°à¥€à¤¨ की रोशनी"</string>
<string name="quick_settings_rotation_unlocked_label" msgid="336054930362580584">"सà¥à¤µà¤¤: रोटेट"</string>
<string name="quick_settings_rotation_locked_label" msgid="8058646447242565486">"रोटेशन लॉक किया गया"</string>
<string name="quick_settings_ime_label" msgid="7073463064369468429">"इनपà¥à¤Ÿ विधि"</string>
@@ -196,10 +198,10 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi बंद"</string>
<string name="quick_settings_wifi_display_label" msgid="6893592964463624333">"Wi-Fi पà¥à¤°à¤¦à¤°à¥à¤¶à¤¨"</string>
<string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"वायरलेस डिसà¥à¤ªà¥à¤²à¥‡"</string>
- <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"चमक"</string>
+ <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"सà¥à¤•à¥à¤°à¥€à¤¨ की रोशनी"</string>
<string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"सà¥à¤µà¤¤:"</string>
- <string name="status_bar_help_title" msgid="1199237744086469217">"सूचनाà¤à¤‚ यहां दिखाई देती हैं"</string>
- <string name="status_bar_help_text" msgid="7874607155052076323">"नीचे सà¥à¤µà¤¾à¤‡à¤ª करके उन तक कभी भी पहà¥à¤‚चें.\nसिसà¥à¤Ÿà¤® नियंतà¥à¤°à¤£à¥‹à¤‚ के लिठपà¥à¤¨: नीचे सà¥à¤µà¤¾à¤‡à¤ª करें."</string>
- <string name="hideybar_confirmation_message" msgid="9050869548951044371">"बार दिखाने के लिठसà¥à¤•à¥à¤°à¥€à¤¨ के किनारे को सà¥à¤µà¤¾à¤‡à¤ª करें"</string>
- <string name="hideybar_confirmation_message_long" msgid="7117692795163620626">"सिसà¥à¤Ÿà¤® बार दिखाने के लिठसà¥à¤•à¥à¤°à¥€à¤¨ के किनारे से सà¥à¤µà¤¾à¤‡à¤ª करें"</string>
+ <string name="quick_settings_inversion_label" msgid="1666358784283020762">"रंग वà¥à¤¯à¥à¤¤à¥à¤•à¥à¤°à¤® मोड"</string>
+ <string name="quick_settings_contrast_label" msgid="3319507551689108692">"उनà¥à¤¨à¤¤ कंटà¥à¤°à¤¾à¤¸à¥à¤Ÿ मोड"</string>
+ <string name="quick_settings_color_space_label" msgid="853443689745584770">"रंग सà¥à¤§à¤¾à¤° मोड"</string>
+ <string name="ssl_ca_cert_warning" msgid="9005954106902053641">"नेटवरà¥à¤• को\nमॉनीटर किया जा सकता है"</string>
</resources>
diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml
index 631d549..6d21e44 100644
--- a/packages/SystemUI/res/values-hr/strings.xml
+++ b/packages/SystemUI/res/values-hr/strings.xml
@@ -61,8 +61,6 @@
<string name="usb_debugging_always" msgid="303335496705863070">"Uvijek dopusti s ovog raÄunala"</string>
<string name="compat_mode_on" msgid="6623839244840638213">"Zumiraj i ispuni zaslon"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Rastegni i ispuni zaslon"</string>
- <string name="compat_mode_help_header" msgid="7969493989397529910">"Kompatibilno zumiranje"</string>
- <string name="compat_mode_help_body" msgid="4946726776359270040">"Kada je aplikacija dizajnirana za manji zaslon, kontrole zumiranja prikazuju se pored sata."</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Spremanje snimke zaslona..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Spremanje snimke zaslona..."</string>
<string name="screenshot_saving_text" msgid="2419718443411738818">"Spremanje snimke zaslona."</string>
@@ -78,6 +76,8 @@
<string name="accessibility_home" msgid="8217216074895377641">"PoÄetna"</string>
<string name="accessibility_menu" msgid="316839303324695949">"Izbornik"</string>
<string name="accessibility_recent" msgid="8571350598987952883">"Nedavne aplikacije"</string>
+ <string name="accessibility_search_light" msgid="1103867596330271848">"Pretraži"</string>
+ <string name="accessibility_camera_button" msgid="8064671582820358152">"Fotoaparat"</string>
<string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Gumb za promjenu naÄina unosa."</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Gumb za kompatibilnost zumiranja."</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Zumiranje manjeg zaslona na veći."</string>
@@ -153,6 +153,7 @@
<string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"Baterija – <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_airplane" msgid="4196876722090224753">"NaÄin rada u zrakoplovu <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="5749054971341882340">"Bluetooth – <xliff:g id="STATE">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_location" msgid="4577282329866813100">"Lokacija <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"Vrijeme alarma: <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"Onemogućeni su 2G-3G podaci"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"Onemogućeni su 4G podaci"</string>
@@ -164,12 +165,13 @@
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Wi-Fi povezan"</string>
<string name="gps_notification_searching_text" msgid="8574247005642736060">"Traženje GPS-a"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"Lokaciju utvrdio GPS"</string>
+ <string name="accessibility_location_active" msgid="2427290146138169014">"Zahtjevi za lokaciju aktivni su"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"Brisanje svih obavijesti."</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Informacije o aplikaciji"</string>
<string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Zaslon će se automatski zakrenuti."</string>
<string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Zaslon je zakljuÄan u pejzažnoj orijentaciji."</string>
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Zaslon je zakljuÄan u portretnoj orijentaciji."</string>
- <string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
+ <string name="dessert_case" msgid="1295161776223959221">"Izlog za slastice"</string>
<string name="start_dreams" msgid="7219575858348719790">"Sanjarenje"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
<string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"NaÄin rada u zrakoplovu"</string>
@@ -198,8 +200,8 @@
<string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"BežiÄni prikaz"</string>
<string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Svjetlina"</string>
<string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTOMATSKI"</string>
- <string name="status_bar_help_title" msgid="1199237744086469217">"Obavijesti se prikazuju ovdje"</string>
- <string name="status_bar_help_text" msgid="7874607155052076323">"Pristupite im u bilo kojem trenutku tako da prstom trznete prema dolje. \nPonovo prstom trznite prema dolje za kontrole sustava."</string>
- <string name="hideybar_confirmation_message" msgid="9050869548951044371">"Prijeđite prstom po rubu zaslona da bi se prikazala traka"</string>
- <string name="hideybar_confirmation_message_long" msgid="7117692795163620626">"Prijeđite prstom od ruba zaslona da bi se prikazala traka sustava"</string>
+ <string name="quick_settings_inversion_label" msgid="1666358784283020762">"NaÄin inverzije boje"</string>
+ <string name="quick_settings_contrast_label" msgid="3319507551689108692">"NaÄin pojaÄanog kontrasta"</string>
+ <string name="quick_settings_color_space_label" msgid="853443689745584770">"NaÄin korekcije boje"</string>
+ <string name="ssl_ca_cert_warning" msgid="9005954106902053641">"Mreža se\nmožda prati"</string>
</resources>
diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml
index c1c9136..ca78170 100644
--- a/packages/SystemUI/res/values-hu/strings.xml
+++ b/packages/SystemUI/res/values-hu/strings.xml
@@ -61,8 +61,6 @@
<string name="usb_debugging_always" msgid="303335496705863070">"Mindig engedélyezze erről a számítógépről"</string>
<string name="compat_mode_on" msgid="6623839244840638213">"Nagyítás a kitöltéshez"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Nyújtás kitöltéshez"</string>
- <string name="compat_mode_help_header" msgid="7969493989397529910">"Kompatibilitás -- nagyítás/kicsinyítés"</string>
- <string name="compat_mode_help_body" msgid="4946726776359270040">"Ha egy alkalmazást kisebb képernyőre terveztek, akkor a nagyítás/kicsinyítés vezérlője az óra mellett jelenik meg."</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Képernyőkép mentése..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Képernyőkép mentése..."</string>
<string name="screenshot_saving_text" msgid="2419718443411738818">"Képernyőkép mentése."</string>
@@ -78,6 +76,8 @@
<string name="accessibility_home" msgid="8217216074895377641">"Főoldal"</string>
<string name="accessibility_menu" msgid="316839303324695949">"Menü"</string>
<string name="accessibility_recent" msgid="8571350598987952883">"Legújabb alkalmazás"</string>
+ <string name="accessibility_search_light" msgid="1103867596330271848">"Keresés"</string>
+ <string name="accessibility_camera_button" msgid="8064671582820358152">"Kamera"</string>
<string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Beviteli mód váltása gomb."</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Kompatibilitási zoom gomb."</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Kicsinyítsen a nagyobb képernyőhöz."</string>
@@ -153,6 +153,7 @@
<string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"Akkumulátor <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_airplane" msgid="4196876722090224753">"Repülős üzemmód <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="5749054971341882340">"Bluetooth <xliff:g id="STATE">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_location" msgid="4577282329866813100">"Helyadatok: <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"Ébresztés időpontja: <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"2G-3G adatforgalom letiltva"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"4G adatforgalom letiltva"</string>
@@ -164,12 +165,13 @@
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Wi-Fi csatlakoztatva"</string>
<string name="gps_notification_searching_text" msgid="8574247005642736060">"GPS keresése"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"A GPS beállította a helyet"</string>
+ <string name="accessibility_location_active" msgid="2427290146138169014">"Aktív helylekérések"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"Minden értesítés törlése"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Alkalmazásinformáció"</string>
<string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"A képernyő automatikusan forogni fog."</string>
<string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"A képernyő zárolva van fekvő tájolásban."</string>
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"A képernyő zárolva van álló tájolásban."</string>
- <string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
+ <string name="dessert_case" msgid="1295161776223959221">"Dessert Case"</string>
<string name="start_dreams" msgid="7219575858348719790">"Ãlmodozás"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
<string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Repülőgép üzemmód"</string>
@@ -198,8 +200,8 @@
<string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Vezeték nélküli kijelző"</string>
<string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Fényerő"</string>
<string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"automatikus"</string>
- <string name="status_bar_help_title" msgid="1199237744086469217">"Az értesítések itt jelennek meg."</string>
- <string name="status_bar_help_text" msgid="7874607155052076323">"Bármikor elérheti őket, ha lefelé húzza az ujját.\nHúzza le az ujját még egyszer a rendszerbeállítások eléréséhez."</string>
- <string name="hideybar_confirmation_message" msgid="9050869548951044371">"Csúsztassa ujját a képernyő szélén a sáv megjelenítéséhez"</string>
- <string name="hideybar_confirmation_message_long" msgid="7117692795163620626">"Csúsztassa ujját a képernyő szélétől a rendszersáv megjelenítéséhez"</string>
+ <string name="quick_settings_inversion_label" msgid="1666358784283020762">"Színinvertálás mód"</string>
+ <string name="quick_settings_contrast_label" msgid="3319507551689108692">"Kontrasztjavítás mód"</string>
+ <string name="quick_settings_color_space_label" msgid="853443689745584770">"Színjavítás mód"</string>
+ <string name="ssl_ca_cert_warning" msgid="9005954106902053641">"Lehet, hogy a\nhálózat felügyelt"</string>
</resources>
diff --git a/packages/SystemUI/res/values-hy-land/strings.xml b/packages/SystemUI/res/values-hy-land/strings.xml
new file mode 100644
index 0000000..7c0535c
--- /dev/null
+++ b/packages/SystemUI/res/values-hy-land/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2010, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="toast_rotation_locked" msgid="7609673011431556092">"Ô·Õ¯Ö€Õ¡Õ¶Õ¶ Õ¡ÕµÕªÕ´ Õ¯Õ¸Õ²ÕºÕ¾Õ¡Õ® Õ§ Õ°Õ¸Ö€Õ«Õ¦Õ¸Õ¶Õ¡Õ¯Õ¡Õ¶ Õ¤Õ«Ö€Ö„Õ¡Õ¾Õ¸Ö€Õ´Õ¡Õ¶ Õ´Õ¥Õ»:"</string>
+</resources>
diff --git a/packages/SystemUI/res/values-hy-rAM-land/strings.xml b/packages/SystemUI/res/values-hy-rAM-land/strings.xml
new file mode 100644
index 0000000..7c0535c
--- /dev/null
+++ b/packages/SystemUI/res/values-hy-rAM-land/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2010, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="toast_rotation_locked" msgid="7609673011431556092">"Ô·Õ¯Ö€Õ¡Õ¶Õ¶ Õ¡ÕµÕªÕ´ Õ¯Õ¸Õ²ÕºÕ¾Õ¡Õ® Õ§ Õ°Õ¸Ö€Õ«Õ¦Õ¸Õ¶Õ¡Õ¯Õ¡Õ¶ Õ¤Õ«Ö€Ö„Õ¡Õ¾Õ¸Ö€Õ´Õ¡Õ¶ Õ´Õ¥Õ»:"</string>
+</resources>
diff --git a/packages/SystemUI/res/values-hy-rAM/strings.xml b/packages/SystemUI/res/values-hy-rAM/strings.xml
new file mode 100644
index 0000000..342c6be
--- /dev/null
+++ b/packages/SystemUI/res/values-hy-rAM/strings.xml
@@ -0,0 +1,207 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="7164937344850004466">"Õ€Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ¡ÕµÕ«Õ¶ UI"</string>
+ <string name="status_bar_clear_all_button" msgid="7774721344716731603">"Õ„Õ¡Ö„Ö€Õ¥Õ¬"</string>
+ <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Õ€Õ¥Õ¼Õ¡ÖÕ¶Õ¥Õ¬ ÖÕ¡Õ¶Õ¯Õ«Ö"</string>
+ <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"ÕÕ¥Õ²Õ¥Õ¯Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€ Õ®Ö€Õ¡Õ£Ö€Õ« Õ´Õ¡Õ½Õ«Õ¶"</string>
+ <string name="status_bar_no_recent_apps" msgid="6576392951053994640">"Ô¹Õ¡Ö€Õ´ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€ Õ¹Õ¯Õ¡Õ¶"</string>
+ <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Ô±Õ¶Õ¿Õ¥Õ½Õ¥Õ¬ Õ¾Õ¥Ö€Õ»Õ«Õ¶ Õ®Ö€Õ¡Õ£Ö€Õ¥Ö€Õ¨"</string>
+ <plurals name="status_bar_accessibility_recent_apps">
+ <item quantity="one" msgid="5854176083865845541">"1 Õ¶Õ¸Ö€ Õ®Ö€Õ¡Õ£Õ«Ö€"</item>
+ <item quantity="other" msgid="1040784359794890744">"%d Õ¶Õ¸Ö€ Õ®Ö€Õ¡Õ£Õ«Ö€"</item>
+ </plurals>
+ <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Ô¾Õ¡Õ¶Õ¸Ö‚ÖÕ¸Ö‚Õ´Õ¶Õ¥Ö€ Õ¹Õ¯Õ¡Õ¶"</string>
+ <string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Ô¸Õ¶Õ©Õ¡ÖÕ«Õ¯"</string>
+ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Ô¾Õ¡Õ¶Õ¸Ö‚ÖÕ¸Ö‚Õ´Õ¶Õ¥Ö€"</string>
+ <string name="battery_low_title" msgid="2783104807551211639">"Õ„Õ«Õ¡ÖÖ€Õ¥Ö„ Õ¬Õ«ÖÖ„Õ¡Õ¾Õ¸Ö€Õ«Õ¹Õ¨"</string>
+ <string name="battery_low_subtitle" msgid="1752040062087829196">"Õ„Õ¡Ö€Õ¿Õ¯Õ¸ÖÕ¨ Õ¬Õ«ÖÖ„Õ¡Õ©Õ¡ÖƒÕ¾Õ¸Ö‚Õ´ Õ§:"</string>
+ <string name="battery_low_percent_format" msgid="1077244949318261761">"Õ´Õ¶Õ¸Ö‚Õ´ Õ§ <xliff:g id="NUMBER">%d%%</xliff:g>"</string>
+ <string name="invalid_charger" msgid="4549105996740522523">"USB Õ¬Õ«ÖÖ„Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´Õ¨ Õ¹Õ« Õ¡Õ»Õ¡Õ¯ÖÕ¾Õ¸Ö‚Õ´:\nÕ•Õ£Õ¿Õ¾Õ¥Ö„ Õ´Õ«Õ¡ÕµÕ¶ Õ£Õ¸Ö€Õ®Õ¸Õ² Õ¬Õ«ÖÖ„Õ¡Õ¾Õ¸Ö€Õ«Õ¹Õ«Ö:"</string>
+ <string name="battery_low_why" msgid="7279169609518386372">"Õ„Õ¡Ö€Õ¿Õ¯Õ¸ÖÕ« Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¸Ö‚Õ´Õ¨"</string>
+ <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Ô¿Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´Õ¶Õ¥Ö€"</string>
+ <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
+ <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Ô»Õ¶Ö„Õ¶Õ¡Õ©Õ«Õ¼Õ¡ÕµÕ«Õ¶ Õ¼Õ¥ÕªÕ«Õ´"</string>
+ <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"Ô»Õ¶Ö„Õ¶Õ¡ÕºÕ¿Õ¿Õ¾Õ¸Õ² Õ§Õ¯Ö€Õ¡Õ¶"</string>
+ <string name="status_bar_settings_mute_label" msgid="554682549917429396">"Õ€Õ¡Õ´Ö€Õ¥ÖÕ¶Õ¥Õ¬"</string>
+ <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"Ô»Õ¶Ö„Õ¶Õ¡Õ·Õ­Õ¡Õ¿"</string>
+ <string name="status_bar_settings_notifications" msgid="397146176280905137">"Ô¾Õ¡Õ¶Õ¸Ö‚ÖÕ¸Ö‚Õ´Õ¶Õ¥Ö€"</string>
+ <string name="bluetooth_tethered" msgid="7094101612161133267">"Bluetooth-Õ¨ Õ¯Õ¡ÕºÕ¾Õ¡Õ® Õ§"</string>
+ <string name="status_bar_input_method_settings_configure_input_methods" msgid="3504292471512317827">"Ô¿Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¥Õ¬ Õ´Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ´Õ¡Õ¶ Õ¥Õ²Õ¡Õ¶Õ¡Õ¯Õ¶Õ¥Ö€Õ¨"</string>
+ <string name="status_bar_use_physical_keyboard" msgid="7551903084416057810">"Õ–Õ«Õ¦Õ«Õ¯Õ¡Õ¯Õ¡Õ¶ Õ½Õ¿Õ¥Õ²Õ¶Õ¡Õ·Õ¡Ö€"</string>
+ <string name="usb_device_permission_prompt" msgid="834698001271562057">"Ô¹Õ¸Ö‚ÕµÕ¬Õ¡Õ¿Ö€Õ¥ÕžÕ¬ <xliff:g id="APPLICATION">%1$s</xliff:g> Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ« Õ´Õ¸Ö‚Õ¿Ö„Õ¨ USB Õ½Õ¡Ö€Ö„:"</string>
+ <string name="usb_accessory_permission_prompt" msgid="5171775411178865750">"Ô¹Õ¸Ö‚ÕµÕ¬Õ¡Õ¿Ö€Õ¥ÕžÕ¬, Õ¸Ö€ <xliff:g id="APPLICATION">%1$s</xliff:g> Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¨ Õ´Õ¸Ö‚Õ¿Ö„ Õ£Õ¸Ö€Õ®Õ« USB Õ¬Ö€Õ¡Õ½Õ¡Ö€Ö„:"</string>
+ <string name="usb_device_confirm_prompt" msgid="5161205258635253206">"Ô²Õ¡ÖÕ¥ÕžÕ¬ <xliff:g id="ACTIVITY">%1$s</xliff:g>-Õ¨, Õ¥Ö€Õ¢ Õ¡ÕµÕ½ USB Õ¯Ö€Õ«Õ¹Õ¨ Õ¯Õ¡ÕºÕ¡Õ¯ÖÕ¾Õ¡Õ® Õ§:"</string>
+ <string name="usb_accessory_confirm_prompt" msgid="3808984931830229888">"Ô²Õ¡ÖÕ¥ÕžÕ¬ <xliff:g id="ACTIVITY">%1$s</xliff:g>-Õ¨, Õ¥Ö€Õ¢ Õ¡ÕµÕ½ USB Õ¬Ö€Õ¡Õ½Õ¡Ö€Ö„Õ¨ Õ¯Õ¡ÕºÕ¡Õ¯ÖÕ¾Õ¡Õ® Õ§:"</string>
+ <string name="usb_accessory_uri_prompt" msgid="513450621413733343">"Ô±ÕµÕ½ USB Õ¬Ö€Õ¡Õ½Õ¡Ö€Ö„Õ« Õ°Õ¥Õ¿ Õ¸Õ¹ Õ´Õ« Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ® Õ¹Õ« Õ¡Õ·Õ­Õ¡Õ¿Õ¸Ö‚Õ´: Ô»Õ´Õ¡ÖÕ¥Ö„ Õ¡Õ¾Õ¥Õ¬Õ«Õ¶ այս լրասարքի Õ´Õ¡Õ½Õ«Õ¶ <xliff:g id="URL">%1$s</xliff:g>-Õ¸Ö‚Õ´"</string>
+ <string name="title_usb_accessory" msgid="4966265263465181372">"USB Õ¬Ö€Õ¡Õ½Õ¡Ö€Ö„"</string>
+ <string name="label_view" msgid="6304565553218192990">"Ô´Õ«Õ¿Õ¥Õ¬"</string>
+ <string name="always_use_device" msgid="1450287437017315906">"Õ•Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¥Õ¬ Õ¬Õ¼Õ¥Õ¬ÕµÕ¡ÕµÕ¶ Õ¡ÕµÕ½ USB Õ½Õ¡Ö€Ö„Õ« Õ°Õ¡Õ´Õ¡Ö€"</string>
+ <string name="always_use_accessory" msgid="1210954576979621596">"Õ•Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¥Õ¬ Õ¬Õ¼Õ¥Õ¬ÕµÕ¡ÕµÕ¶ Õ¡ÕµÕ½ USB Õ¬Ö€Õ¡Õ½Õ¡Ö€Ö„Õ« Õ°Õ¡Õ´Õ¡Ö€"</string>
+ <string name="usb_debugging_title" msgid="4513918393387141949">"Ô¹Õ¸Ö‚ÕµÕ¬Õ¡Õ¿Ö€Õ¥ÕžÕ¬ USB-Õ« Õ¯Õ¡Ö€Õ£Õ¡Õ¢Õ¥Ö€Õ¸Ö‚Õ´Õ¨:"</string>
+ <string name="usb_debugging_message" msgid="2220143855912376496">"Õ€Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ¹Õ« RSA-Õ« Õ¢Õ¡Õ¶Õ¡Õ¬Õ« Õ´Õ¡Õ¿Õ¶Õ¡Õ°Õ¥Õ¿Ö„Õ¶ Õ§`\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
+ <string name="usb_debugging_always" msgid="303335496705863070">"Õ„Õ«Õ·Õ¿ Õ©Õ¸Ö‚ÕµÕ¬Õ¡Õ¿Ö€Õ¥Õ¬ Õ¡ÕµÕ½ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ¹Õ«Ö"</string>
+ <string name="compat_mode_on" msgid="6623839244840638213">"Ô½Õ¸Õ·Õ¸Ö€Õ¡ÖÕ¶Õ¥Õ¬` Õ§Õ¯Ö€Õ¡Õ¶Õ¨ Õ¬ÖÕ¶Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€"</string>
+ <string name="compat_mode_off" msgid="4434467572461327898">"ÕÕ£Õ¥Õ¬` Õ§Õ¯Ö€Õ¡Õ¶Õ¨ Õ¬ÖÕ¶Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€"</string>
+ <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Պահում է էկրանի հանույթը…"</string>
+ <string name="screenshot_saving_title" msgid="8242282144535555697">"ÕŠÕ¡Õ°Õ¸Ö‚Õ´ Õ§ Õ§Õ¯Ö€Õ¡Õ¶Õ« Õ°Õ¡Õ¶Õ¸Ö‚ÕµÕ©Õ¨..."</string>
+ <string name="screenshot_saving_text" msgid="2419718443411738818">"Ô·Õ¯Ö€Õ¡Õ¶Õ« Õ°Õ¡Õ¶Õ¸Ö‚ÕµÕ©Õ¨ ÕºÕ¡Õ°Õ¾Õ¸Ö‚Õ´ Õ§:"</string>
+ <string name="screenshot_saved_title" msgid="6461865960961414961">"Ô·Õ¯Ö€Õ¡Õ¶Õ« Õ°Õ¡Õ¶Õ¸Ö‚ÕµÕ©Õ¨ Õ¬Õ¸Ö‚Õ½Õ¡Õ¶Õ¯Õ¡Ö€Õ¾Õ¥Õ¬ Õ§:"</string>
+ <string name="screenshot_saved_text" msgid="1152839647677558815">"Õ€ÕºÕ¥Ö„ Õ±Õ¥Ö€ Õ§Õ¯Ö€Õ¡Õ¶Õ« Õ°Õ¡Õ¶Õ¸Ö‚ÕµÕ©Õ¨ Õ¿Õ¥Õ½Õ¶Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€:"</string>
+ <string name="screenshot_failed_title" msgid="705781116746922771">"Õ‰Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Ö Õ¬Õ¸Ö‚Õ½Õ¡Õ¶Õ¯Õ¡Ö€Õ¥Õ¬ Õ§Õ¯Ö€Õ¡Õ¶Õ« Õ°Õ¡Õ¶Õ¸Ö‚ÕµÕ©Õ¨:"</string>
+ <string name="screenshot_failed_text" msgid="8134011269572415402">"Õ‰Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Ö ÕºÕ¡Õ°Õ¥Õ¬ Õ§Õ¯Ö€Õ¡Õ¶Õ« Õ°Õ¡Õ¶Õ¸Ö‚ÕµÕ©Õ¨: Õ€Õ¶Õ¡Ö€Õ¡Õ¾Õ¸Ö€ Õ§` ÕºÕ¡Õ°Õ¸ÖÕ¶ Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ´Õ¡Õ¶ Õ´Õ¥Õ» Õ§:"</string>
+ <string name="usb_preference_title" msgid="6551050377388882787">"USB Ö†Õ¡ÕµÕ¬Õ¥Ö€Õ« ÖƒÕ¸Õ­Õ¡Õ¶ÖÕ´Õ¡Õ¶ Õ¨Õ¶Õ¿Ö€Õ¡Õ¶Ö„Õ¶Õ¥Ö€"</string>
+ <string name="use_mtp_button_title" msgid="4333504413563023626">"Õ„Õ«Õ¡ÖÕ¶Õ¥Õ¬ Õ¸Ö€ÕºÕ¥Õ½ Õ´Õ¥Õ¤Õ«Õ¡ Õ¶Õ¾Õ¡Õ£Õ¡Ö€Õ¯Õ«Õ¹ (MTP)"</string>
+ <string name="use_ptp_button_title" msgid="7517127540301625751">"Õ„Õ«Õ¡ÖÕ¶Õ¥Õ¬ Õ¸Ö€ÕºÕ¥Õ½ Ö†Õ¸Õ¿Õ¸Õ­ÖÕ«Õ¯ (PTP)"</string>
+ <string name="installer_cd_button_title" msgid="2312667578562201583">"ÕÕ¥Õ²Õ¡Õ¤Ö€Õ¥Õ¬ Android Ö†Õ¡ÕµÕ¬Õ¥Ö€Õ« ÖƒÕ¸Õ­Õ¡Õ¶ÖÕ´Õ¡Õ¶ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¨ Mac-Õ« Õ°Õ¡Õ´Õ¡Ö€"</string>
+ <string name="accessibility_back" msgid="567011538994429120">"Õ€Õ¥Õ¿"</string>
+ <string name="accessibility_home" msgid="8217216074895377641">"ÕÕ¸Ö‚Õ¶"</string>
+ <string name="accessibility_menu" msgid="316839303324695949">"Õ‘Õ¡Õ¶Õ¯"</string>
+ <string name="accessibility_recent" msgid="8571350598987952883">"ÕŽÕ¥Ö€Õ»Õ«Õ¶ Õ®Ö€Õ¡Õ£Ö€Õ¥Ö€Õ¨"</string>
+ <string name="accessibility_search_light" msgid="1103867596330271848">"ÕˆÖ€Õ¸Õ¶Õ¥Õ¬"</string>
+ <string name="accessibility_camera_button" msgid="8064671582820358152">"Õ–Õ¸Õ¿Õ¸Õ­ÖÕ«Õ¯"</string>
+ <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Õ„Õ«Õ¡ÖÕ¶Õ¥Õ¬ Õ´Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ´Õ¡Õ¶ Õ¥Õ²Õ¡Õ¶Õ¡Õ¯Õ« Õ¯Õ¸Õ³Õ¡Õ¯Õ¨:"</string>
+ <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Õ€Õ¡Õ´Õ¡Õ¿Õ¥Õ²Õ¥Õ¬Õ«Õ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ­Õ¸Õ·Õ¸Ö€Õ¡ÖÕ´Õ¡Õ¶ Õ¯Õ¸Õ³Õ¡Õ¯Õ¨:"</string>
+ <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Ô´Õ«Õ¿Õ¡ÖƒÕ¸Õ­Õ¥Õ¬ ÖƒÕ¸Ö„Ö€Õ«Ö Õ¡Õ¾Õ¥Õ¬Õ« Õ´Õ¥Õ® Õ§Õ¯Ö€Õ¡Õ¶:"</string>
+ <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth-Õ¨ Õ´Õ«Õ¡ÖÕ¾Õ¡Õ® Õ§:"</string>
+ <string name="accessibility_bluetooth_disconnected" msgid="7416648669976870175">"Bluetooth-Õ¶ Õ¡Õ¶Õ»Õ¡Õ¿Õ¾Õ¡Õ® Õ§:"</string>
+ <string name="accessibility_no_battery" msgid="358343022352820946">"Õ„Õ¡Ö€Õ¿Õ¯Õ¸Ö Õ¹Õ¯Õ¡:"</string>
+ <string name="accessibility_battery_one_bar" msgid="7774887721891057523">"Õ„Õ¡Ö€Õ¿Õ¯Õ¸ÖÕ« Õ´Õ¥Õ¯ Õ£Õ«Õ®:"</string>
+ <string name="accessibility_battery_two_bars" msgid="8500650438735009973">"Õ„Õ¡Ö€Õ¿Õ¯Õ¸ÖÕ« Õ¥Ö€Õ¯Õ¸Ö‚ Õ£Õ«Õ®:"</string>
+ <string name="accessibility_battery_three_bars" msgid="2302983330865040446">"Õ„Õ¡Ö€Õ¿Õ¯Õ¸ÖÕ« Õ¥Ö€Õ¥Ö„ Õ£Õ«Õ®:"</string>
+ <string name="accessibility_battery_full" msgid="8909122401720158582">"Õ„Õ¡Ö€Õ¿Õ¯Õ¸ÖÕ¨ Õ¬Õ«Ö„Õ¶ Õ§:"</string>
+ <string name="accessibility_no_phone" msgid="4894708937052611281">"Õ€Õ¥Õ¼Õ¡Õ­Õ¸Õ½ Õ¹Õ¯Õ¡:"</string>
+ <string name="accessibility_phone_one_bar" msgid="687699278132664115">"Õ€Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ« Õ´Õ¥Õ¯ Õ£Õ«Õ®:"</string>
+ <string name="accessibility_phone_two_bars" msgid="8384905382804815201">"Õ€Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ« Õ¥Ö€Õ¯Õ¸Ö‚ Õ£Õ«Õ®:"</string>
+ <string name="accessibility_phone_three_bars" msgid="8521904843919971885">"Õ€Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ« Õ¥Ö€Õ¥Ö„ Õ£Õ«Õ®:"</string>
+ <string name="accessibility_phone_signal_full" msgid="6471834868580757898">"Õ€Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ« Õ¡Õ¦Õ¤Õ¡Õ¶Õ·Õ¡Õ¶Õ¨ Õ¬Õ«Ö„Õ¶ Õ§:"</string>
+ <string name="accessibility_no_data" msgid="4791966295096867555">"ÕÕ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€ Õ¹Õ¯Õ¡Õ¶:"</string>
+ <string name="accessibility_data_one_bar" msgid="1415625833238273628">"ÕÕ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ« Õ´Õ¥Õ¯ Õ£Õ«Õ®:"</string>
+ <string name="accessibility_data_two_bars" msgid="6166018492360432091">"ÕÕ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ« Õ¥Ö€Õ¯Õ¸Ö‚ Õ£Õ«Õ®:"</string>
+ <string name="accessibility_data_three_bars" msgid="9167670452395038520">"ÕÕ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ« Õ¥Ö€Õ¥Ö„ Õ£Õ«Õ®:"</string>
+ <string name="accessibility_data_signal_full" msgid="2708384608124519369">"ÕÕ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ« Õ¡Õ¦Õ¤Õ¡Õ¶Õ·Õ¡Õ¶Õ¨ Õ¬Ö€Õ«Õ¾ Õ§:"</string>
+ <string name="accessibility_wifi_off" msgid="3177380296697933627">"Wifi-Õ¨ Õ¡Õ¶Õ»Õ¡Õ¿Õ¾Õ¡Õ® Õ§:"</string>
+ <string name="accessibility_no_wifi" msgid="1425476551827924474">"WiFi-Õ¨ Õ¡Õ¶Õ»Õ¡Õ¿Õ¾Õ¡Õ® Õ§:"</string>
+ <string name="accessibility_wifi_one_bar" msgid="7735893178010724377">"Wifi-Õ« Õ´Õ¥Õ¯ Õ£Õ«Õ®:"</string>
+ <string name="accessibility_wifi_two_bars" msgid="4994274250497262434">"Wifi-Õ« Õ¥Ö€Õ¯Õ¸Ö‚ Õ£Õ«Õ®:"</string>
+ <string name="accessibility_wifi_three_bars" msgid="3495755044276588384">"WiFi-Õ« Õ¥Ö€Õ¥Ö„ Õ£Õ«Õ®:"</string>
+ <string name="accessibility_wifi_signal_full" msgid="6853561303586480376">"Wifi-Õ« Õ¡Õ¦Õ¤Õ¡Õ¶Õ·Õ¡Õ¶Õ¨ Õ¬Õ«Ö„Õ¶ Õ§:"</string>
+ <string name="accessibility_no_wimax" msgid="4329180129727630368">"WiMAX Õ¹Õ¯Õ¡:"</string>
+ <string name="accessibility_wimax_one_bar" msgid="4170994299011863648">"WiMAX-Õ« Õ´Õ¥Õ¯ Õ£Õ«Õ®:"</string>
+ <string name="accessibility_wimax_two_bars" msgid="9176236858336502288">"WiMAX-Õ« Õ¥Ö€Õ¯Õ¸Ö‚ Õ£Õ«Õ®:"</string>
+ <string name="accessibility_wimax_three_bars" msgid="6116551636752103927">"WiMAX-Õ« Õ¥Ö€Õ¥Ö„ Õ£Õ«Õ®:"</string>
+ <string name="accessibility_wimax_signal_full" msgid="2768089986795579558">"WiMAX-Õ« Õ¡Õ¦Õ¤Õ¡Õ¶Õ·Õ¡Õ¶Õ¨ Õ¬Õ«Ö„Õ¶ Õ§:"</string>
+ <string name="accessibility_no_signal" msgid="7064645320782585167">"Ô±Õ¦Õ¤Õ¡Õ¶Õ·Õ¡Õ¶ Õ¹Õ¯Õ¡:"</string>
+ <string name="accessibility_not_connected" msgid="6395326276213402883">"Õ„Õ«Õ¡ÖÕ¾Õ¡Õ® Õ¹Õ§:"</string>
+ <string name="accessibility_zero_bars" msgid="3806060224467027887">"Ô¶Ö€Õ¸ Õ£Õ«Õ®:"</string>
+ <string name="accessibility_one_bar" msgid="1685730113192081895">"Õ„Õ¥Õ¯ Õ£Õ«Õ®:"</string>
+ <string name="accessibility_two_bars" msgid="6437363648385206679">"ÔµÖ€Õ¯Õ¸Ö‚ Õ£Õ«Õ®:"</string>
+ <string name="accessibility_three_bars" msgid="2648241415119396648">"ÔµÖ€Õ¥Ö„ Õ£Õ«Õ®:"</string>
+ <string name="accessibility_signal_full" msgid="9122922886519676839">"Ô±Õ¦Õ¤Õ¡Õ¶Õ·Õ¡Õ¶Õ¨ Õ¬Ö€Õ«Õ¾ Õ§:"</string>
+ <string name="accessibility_desc_on" msgid="2385254693624345265">"Õ„Õ«Õ¡ÖÕ¾Õ¡Õ® Õ§:"</string>
+ <string name="accessibility_desc_off" msgid="6475508157786853157">"Ô±Õ¶Õ»Õ¡Õ¿Õ¾Õ¡Õ® Õ§:"</string>
+ <string name="accessibility_desc_connected" msgid="8366256693719499665">"Õ„Õ«Õ¡ÖÕ¾Õ¡Õ® Õ§:"</string>
+ <string name="accessibility_data_connection_gprs" msgid="1606477224486747751">"GPRS"</string>
+ <string name="accessibility_data_connection_1x" msgid="994133468120244018">"1 X"</string>
+ <string name="accessibility_data_connection_hspa" msgid="2032328855462645198">"HSPA"</string>
+ <string name="accessibility_data_connection_3g" msgid="8628562305003568260">"3G"</string>
+ <string name="accessibility_data_connection_3.5g" msgid="8664845609981692001">"3.5G"</string>
+ <string name="accessibility_data_connection_4g" msgid="7741000750630089612">"4G"</string>
+ <string name="accessibility_data_connection_lte" msgid="5413468808637540658">"LTE"</string>
+ <string name="accessibility_data_connection_cdma" msgid="6132648193978823023">"CDMA"</string>
+ <string name="accessibility_data_connection_roaming" msgid="5977362333466556094">"Ռոումինգ"</string>
+ <string name="accessibility_data_connection_edge" msgid="4477457051631979278">"Edge"</string>
+ <string name="accessibility_data_connection_wifi" msgid="2324496756590645221">"Wi-Fi"</string>
+ <string name="accessibility_no_sim" msgid="8274017118472455155">"SIM Õ¹Õ¯Õ¡:"</string>
+ <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Bluetooth-Õ¨ Õ¯Õ¡ÕºÕ¾Õ¸Ö‚Õ´ Õ§:"</string>
+ <string name="accessibility_airplane_mode" msgid="834748999790763092">"Ô»Õ¶Ö„Õ¶Õ¡Õ©Õ«Õ¼Õ¡ÕµÕ«Õ¶ Õ¼Õ¥ÕªÕ«Õ´"</string>
+ <string name="accessibility_battery_level" msgid="7451474187113371965">"Õ„Õ¡Ö€Õ¿Õ¯Õ¸ÖÕ¨ <xliff:g id="NUMBER">%d</xliff:g> Õ¿Õ¸Õ¯Õ¸Õ½ Õ§:"</string>
+ <string name="accessibility_settings_button" msgid="799583911231893380">"Õ€Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ« Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´Õ¶Õ¥Ö€:"</string>
+ <string name="accessibility_notifications_button" msgid="4498000369779421892">"Ô¾Õ¡Õ¶Õ¸Ö‚ÖÕ¸Ö‚Õ´Õ¶Õ¥Ö€:"</string>
+ <string name="accessibility_remove_notification" msgid="3603099514902182350">"Õ„Õ¡Ö„Ö€Õ¥Õ¬ Õ®Õ¡Õ¶Õ¸Ö‚ÖÕ¸Ö‚Õ´Õ¨:"</string>
+ <string name="accessibility_gps_enabled" msgid="3511469499240123019">"GPS-Õ¨ Õ´Õ«Õ¡ÖÕ¾Õ¡Õ® Õ§:"</string>
+ <string name="accessibility_gps_acquiring" msgid="8959333351058967158">"GPS-Õ« Õ½Õ¿Õ¡ÖÕ¸Ö‚Õ´:"</string>
+ <string name="accessibility_tty_enabled" msgid="4613200365379426561">"Õ€Õ¥Õ¼Õ¡Õ´Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ«Õ¹Õ¨ Õ´Õ«Õ¡ÖÕ¾Õ¡Õ® Õ§:"</string>
+ <string name="accessibility_ringer_vibrate" msgid="666585363364155055">"Ô¶Õ¡Õ¶Õ£Õ« Õ©Ö€Õ©Õ¼Õ¸Ö:"</string>
+ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"Ô¶Õ¡Õ¶Õ£Õ¡Õ¯Õ¨ Õ¬Õ¼Õ¥ÖÕ¾Õ¡Õ® Õ§:"</string>
+ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g>-Õ¨ Õ¡Õ¶Õ¿Õ¥Õ½Õ¾Õ¡Õ® Õ§:"</string>
+ <string name="accessibility_notification_dismissed" msgid="854211387186306927">"Ô¾Õ¡Õ¶Õ¸Ö‚ÖÕ¸Ö‚Õ´Õ¨ Õ¡Õ¶Õ¿Õ¥Õ½Õ¾Õ¥Ö:"</string>
+ <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Ô¾Õ¡Õ¶Õ¸Ö‚ÖÕ¸Ö‚Õ´Õ¶Õ¥Ö€Õ« Õ¾Õ¡Õ°Õ¡Õ¶Õ¡Õ¯:"</string>
+ <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Ô±Ö€Õ¡Õ£ Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´Õ¶Õ¥Ö€:"</string>
+ <string name="accessibility_desc_recent_apps" msgid="9014032916410590027">"ÕŽÕ¥Ö€Õ»Õ«Õ¶ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ¨:"</string>
+ <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Õ•Õ£Õ¿Õ¾Õ¸Õ² <xliff:g id="USER">%s</xliff:g>:"</string>
+ <string name="accessibility_quick_settings_wifi" msgid="6099781031669728709">"<xliff:g id="SIGNAL">%1$s</xliff:g>: <xliff:g id="NETWORK">%2$s</xliff:g>"</string>
+ <string name="accessibility_quick_settings_mobile" msgid="4876806564086241341">"Õ‡Õ¡Ö€ÕªÕ¡Õ¯Õ¡Õ¶ <xliff:g id="SIGNAL">%1$s</xliff:g>: <xliff:g id="TYPE">%2$s</xliff:g>: <xliff:g id="NETWORK">%3$s</xliff:g>:"</string>
+ <string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"Õ„Õ¡Ö€Õ¿Õ¯Õ¸ÖÕ¨ <xliff:g id="STATE">%s</xliff:g> Õ§:"</string>
+ <string name="accessibility_quick_settings_airplane" msgid="4196876722090224753">"Ô»Õ¶Ö„Õ¶Õ¡Õ©Õ«Õ¼Õ¡ÕµÕ«Õ¶ Õ¼Õ¥ÕªÕ«Õ´Õ¨ <xliff:g id="STATE">%s</xliff:g> Õ§:"</string>
+ <string name="accessibility_quick_settings_bluetooth" msgid="5749054971341882340">"Bluetooth-Õ¨ <xliff:g id="STATE">%s</xliff:g> Õ§:"</string>
+ <string name="accessibility_quick_settings_location" msgid="4577282329866813100">"ÕÕ¥Õ²Õ¡Õ¤Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨Õ <xliff:g id="STATE">%s</xliff:g>:"</string>
+ <string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"Ô¶Õ¡Ö€Õ©Õ¸Ö‚ÖÕ«Õ¹Õ¨ Õ¤Ö€Õ¾Õ¡Õ® Õ§ <xliff:g id="TIME">%s</xliff:g>-Õ«Õ¶:"</string>
+ <string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"2G-3G Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨ Õ¡Õ¶Õ»Õ¡Õ¿Õ¾Õ¡Õ® Õ¥Õ¶"</string>
+ <string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"4G Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨ Õ¡Õ¶Õ»Õ¡Õ¿Õ¾Õ¡Õ® Õ¥Õ¶"</string>
+ <string name="data_usage_disabled_dialog_mobile_title" msgid="1046047248844821202">"Õ‡Õ¡Ö€ÕªÕ¡Õ¯Õ¡Õ¶ Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨ Õ¡Õ¶Õ»Õ¡Õ¿Õ¾Õ¡Õ® Õ¥Õ¶"</string>
+ <string name="data_usage_disabled_dialog_title" msgid="2086815304858964954">"ÕÕ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨ Õ¡Õ¶Õ»Õ¡Õ¿Õ¾Õ¡Õ® Õ¥Õ¶"</string>
+ <string name="data_usage_disabled_dialog" msgid="3853117269051806280">"Ô´Õ¸Ö‚Ö„ Õ°Õ¡Õ½Õ¥Õ¬ Õ¥Ö„ Õ¶Õ·Õ¾Õ¡Õ® Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ« Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ´Õ¡Õ¶ Õ½Õ¡Õ°Õ´Õ¡Õ¶Õ«Õ¶:\n\n ÔµÕ©Õ¥ Õ¤Õ¸Ö‚Ö„ Õ¯Ö€Õ¯Õ«Õ¶ Õ¡Õ¯Õ¿Õ«Õ¾Õ¡ÖÕ¶Õ¥Ö„ Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨, Õ¡ÕµÕ¶ Õ¯Õ¡Ö€Õ¸Õ² Õ§ Õ£Õ¡Õ¶Õ±Õ¾Õ¥Õ¬ Ö…ÕºÕ¥Ö€Õ¡Õ¿Õ¸Ö€Õ« Õ¯Õ¸Õ²Õ´Õ«Ö:"</string>
+ <string name="data_usage_disabled_dialog_enable" msgid="7729772039208664606">"ÕŽÕ¥Ö€Õ¡Õ´Õ«Õ¡ÖÕ¶Õ¥Õ¬ Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨"</string>
+ <string name="status_bar_settings_signal_meter_disconnected" msgid="1940231521274147771">"Ô»Õ¶Õ¿Õ¥Ö€Õ¶Õ¥Õ¿ Õ¯Õ¡Õº Õ¹Õ¯Õ¡"</string>
+ <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Wi-Fi-Õ¨ Õ´Õ«Õ¡ÖÕ¾Õ¡Õ® Õ§"</string>
+ <string name="gps_notification_searching_text" msgid="8574247005642736060">"ÕˆÖ€Õ¸Õ¶Õ¸Ö‚Õ´ Õ§ GPS"</string>
+ <string name="gps_notification_found_text" msgid="4619274244146446464">"ÕÕ¥Õ²Õ¡Õ¤Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¾Õ¥Õ¬ Õ§ GPS-Õ« Õ¯Õ¸Õ²Õ´Õ«Ö"</string>
+ <string name="accessibility_location_active" msgid="2427290146138169014">"ÕÕ¥Õ²Õ¡Õ¤Ö€Õ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ°Õ¡Ö€ÖÕ¸Ö‚Õ´Õ¶Õ¥Ö€Õ¶ Õ¡Õ¯Õ¿Õ«Õ¾ Õ¥Õ¶"</string>
+ <string name="accessibility_clear_all" msgid="5235938559247164925">"Õ„Õ¡Ö„Ö€Õ¥Õ¬ Õ¢Õ¸Õ¬Õ¸Ö€ Õ®Õ¡Õ¶Õ¸Ö‚ÖÕ¸Ö‚Õ´Õ¶Õ¥Ö€Õ¨:"</string>
+ <string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"ÕÕ¥Õ²Õ¥Õ¯Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€ Õ®Ö€Õ¡Õ£Ö€Õ« Õ´Õ¡Õ½Õ«Õ¶"</string>
+ <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Ô·Õ¯Ö€Õ¡Õ¶Õ¨ Õ«Õ¶Ö„Õ¶Õ¸Ö‚Ö€Õ¸Ö‚ÕµÕ¶ Õ¯ÕºÕ¿Õ¿Õ¾Õ«:"</string>
+ <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Ô·Õ¯Ö€Õ¡Õ¶Õ¨ Õ¯Õ¸Õ²ÕºÕ¾Õ¡Õ® Õ§ Õ°Õ¸Ö€Õ«Õ¦Õ¸Õ¶Õ¡Õ¯Õ¡Õ¶ Õ¤Õ«Ö€Ö„Õ¡Õ¾Õ¸Ö€Õ´Õ¡Õ¶ Õ´Õ¥Õ»:"</string>
+ <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Ô·Õ¯Ö€Õ¡Õ¶Õ¨ Õ¯Õ¸Õ²ÕºÕ¾Õ¡Õ® Õ§ Õ¸Ö‚Õ²Õ²Õ¡Õ±Õ«Õ£ Õ¤Õ«Ö€Ö„Õ¡Õ¾Õ¸Ö€Õ´Õ¡Õ´Õ¢:"</string>
+ <string name="dessert_case" msgid="1295161776223959221">"Dessert Case"</string>
+ <string name="start_dreams" msgid="7219575858348719790">"Õ‘Õ¥Ö€Õ¥Õ¯Õ¡ÕµÕ«Õ¶ Õ¼Õ¥ÕªÕ«Õ´"</string>
+ <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
+ <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Ô»Õ¶Ö„Õ¶Õ¡Õ©Õ«Õ¼Õ¡ÕµÕ«Õ¶ Õ¼Õ¥ÕªÕ«Õ´"</string>
+ <string name="quick_settings_battery_charging_label" msgid="490074774465309209">"Ô¼Õ«ÖÖ„Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´` <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+ <string name="quick_settings_battery_charged_label" msgid="8865413079414246081">"Ô¼Õ«ÖÖ„Õ¡Õ¾Õ¸Ö€Õ¾Õ¡Õ® Õ§"</string>
+ <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string>
+ <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (<xliff:g id="NUMBER">%d</xliff:g> Õ½Õ¡Ö€Ö„)"</string>
+ <string name="quick_settings_bluetooth_off_label" msgid="8159652146149219937">"Bluetooth-Õ¶ Õ¡Õ¶Õ»Õ¡Õ¿Õ¾Õ¡Õ® Õ§"</string>
+ <string name="quick_settings_brightness_label" msgid="6968372297018755815">"ÕŠÕ¡ÕµÕ®Õ¡Õ¼Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶"</string>
+ <string name="quick_settings_rotation_unlocked_label" msgid="336054930362580584">"Ô»Õ¶Ö„Õ¶Õ¡ÕºÕ¿Õ¿Õ¸Ö‚Õ´"</string>
+ <string name="quick_settings_rotation_locked_label" msgid="8058646447242565486">"ÕŠÕ¿Õ¿Õ¸Ö‚Õ´Õ¨ Õ¯Õ¸Õ²ÕºÕ¾Õ¡Õ® Õ§"</string>
+ <string name="quick_settings_ime_label" msgid="7073463064369468429">"Õ„Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ´Õ¡Õ¶ Õ¥Õ²Õ¡Õ¶Õ¡Õ¯Õ¨"</string>
+ <string name="quick_settings_location_label" msgid="5011327048748762257">"ÕÕ¥Õ²Õ¡Õ¤Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶"</string>
+ <string name="quick_settings_location_off_label" msgid="7464544086507331459">"Ô±Õ¶Õ»Õ¡Õ¿Õ¥Õ¬ Õ¿Õ¥Õ²Õ¡Õ¤Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨"</string>
+ <string name="quick_settings_media_device_label" msgid="1302906836372603762">"Õ„Õ¥Õ¤Õ«Õ¡ Õ½Õ¡Ö€Ö„"</string>
+ <string name="quick_settings_rssi_label" msgid="7725671335550695589">"RSSI"</string>
+ <string name="quick_settings_rssi_emergency_only" msgid="2713774041672886750">"Õ„Õ«Õ¡ÕµÕ¶ Õ¡Ö€Õ¿Õ¡Õ¯Õ¡Ö€Õ£ Õ«Ö€Õ¡Õ¾Õ«Õ³Õ¡Õ¯Õ¶Õ¥Ö€Õ« Õ¦Õ¡Õ¶Õ£Õ¥Ö€"</string>
+ <string name="quick_settings_settings_label" msgid="5326556592578065401">"Ô¿Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´Õ¶Õ¥Ö€"</string>
+ <string name="quick_settings_time_label" msgid="4635969182239736408">"ÔºÕ¡Õ´Õ¡Õ¶Õ¡Õ¯Õ¨"</string>
+ <string name="quick_settings_user_label" msgid="5238995632130897840">"ÔµÕ½"</string>
+ <string name="quick_settings_wifi_label" msgid="9135344704899546041">"Wi-Fi"</string>
+ <string name="quick_settings_wifi_not_connected" msgid="7171904845345573431">"Õ„Õ«Õ¡ÖÕ¾Õ¡Õ® Õ¹Õ§"</string>
+ <string name="quick_settings_wifi_no_network" msgid="2221993077220856376">"Õ‘Õ¡Õ¶Ö Õ¹Õ¯Õ¡"</string>
+ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi-Õ¨ Õ¡Õ¶Õ»Õ¡Õ¿Õ¾Õ¡Õ® Õ§"</string>
+ <string name="quick_settings_wifi_display_label" msgid="6893592964463624333">"Wi-Fi ÖÕ¸Ö‚ÖÕ¡Õ¤Ö€Õ«Õ¹"</string>
+ <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Ô±Õ¶Õ¬Õ¡Ö€ Õ§Õ¯Ö€Õ¡Õ¶"</string>
+ <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"ÕŠÕ¡ÕµÕ®Õ¡Õ¼Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶"</string>
+ <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"Ô»Õ¶Ö„Õ¶Õ¡Õ·Õ­Õ¡Õ¿"</string>
+ <string name="quick_settings_inversion_label" msgid="1666358784283020762">"Ô³Õ¸Ö‚Õ¶Õ¡Õ·Ö€Õ»Õ´Õ¡Õ¶ Õ¼Õ¥ÕªÕ«Õ´"</string>
+ <string name="quick_settings_contrast_label" msgid="3319507551689108692">"Ô¸Õ¶Õ¤Õ¬Õ¡ÕµÕ¶Õ¾Õ¡Õ® ÖÕ¡ÕµÕ¿Õ¸Ö‚Õ¶Õ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ¼Õ¥ÕªÕ«Õ´"</string>
+ <string name="quick_settings_color_space_label" msgid="853443689745584770">"Ô³Õ¸Ö‚ÕµÕ¶Õ¥Ö€Õ« Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ´Õ¡Õ¶ Õ¼Õ¥ÕªÕ«Õ´"</string>
+ <string name="ssl_ca_cert_warning" msgid="9005954106902053641">"Õ‘Õ¡Õ¶ÖÕ¨ Õ¯Õ¡Ö€Õ¸Õ² Õ§\nÕ¾Õ¥Ö€Õ¡Õ°Õ½Õ¯Õ¾Õ¥Õ¬"</string>
+</resources>
diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml
new file mode 100644
index 0000000..4241898
--- /dev/null
+++ b/packages/SystemUI/res/values-hy/strings.xml
@@ -0,0 +1,204 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="7164937344850004466">"Õ€Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ¡ÕµÕ«Õ¶ UI"</string>
+ <string name="status_bar_clear_all_button" msgid="7774721344716731603">"Õ„Õ¡Ö„Ö€Õ¥Õ¬"</string>
+ <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Õ€Õ¥Õ¼Õ¡ÖÕ¶Õ¥Õ¬ ÖÕ¡Õ¶Õ¯Õ«Ö"</string>
+ <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"ÕÕ¥Õ²Õ¥Õ¯Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€ Õ®Ö€Õ¡Õ£Ö€Õ« Õ´Õ¡Õ½Õ«Õ¶"</string>
+ <string name="status_bar_no_recent_apps" msgid="6576392951053994640">"Ô¹Õ¡Ö€Õ´ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€ Õ¹Õ¯Õ¡Õ¶"</string>
+ <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Ô±Õ¶Õ¿Õ¥Õ½Õ¥Õ¬ Õ¾Õ¥Ö€Õ»Õ«Õ¶ Õ®Ö€Õ¡Õ£Ö€Õ¥Ö€Õ¨"</string>
+ <plurals name="status_bar_accessibility_recent_apps">
+ <item quantity="one" msgid="5854176083865845541">"1 Õ¶Õ¸Ö€ Õ®Ö€Õ¡Õ£Õ«Ö€"</item>
+ <item quantity="other" msgid="1040784359794890744">"%d Õ¶Õ¸Ö€ Õ®Ö€Õ¡Õ£Õ«Ö€"</item>
+ </plurals>
+ <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Ô¾Õ¡Õ¶Õ¸Ö‚ÖÕ¸Ö‚Õ´Õ¶Õ¥Ö€ Õ¹Õ¯Õ¡Õ¶"</string>
+ <string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Ô¸Õ¶Õ©Õ¡ÖÕ«Õ¯"</string>
+ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Ô¾Õ¡Õ¶Õ¸Ö‚ÖÕ¸Ö‚Õ´Õ¶Õ¥Ö€"</string>
+ <string name="battery_low_title" msgid="2783104807551211639">"Õ„Õ«Õ¡ÖÖ€Õ¥Ö„ Õ¬Õ«ÖÖ„Õ¡Õ¾Õ¸Ö€Õ«Õ¹Õ¨"</string>
+ <string name="battery_low_subtitle" msgid="1752040062087829196">"Õ„Õ¡Ö€Õ¿Õ¯Õ¸ÖÕ¨ Õ¬Õ«ÖÖ„Õ¡Õ©Õ¡ÖƒÕ¾Õ¸Ö‚Õ´ Õ§:"</string>
+ <string name="battery_low_percent_format" msgid="1077244949318261761">"Õ´Õ¶Õ¸Ö‚Õ´ Õ§ <xliff:g id="NUMBER">%d%%</xliff:g>"</string>
+ <string name="invalid_charger" msgid="4549105996740522523">"USB Õ¬Õ«ÖÖ„Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´Õ¨ Õ¹Õ« Õ¡Õ»Õ¡Õ¯ÖÕ¾Õ¸Ö‚Õ´:\nÕ•Õ£Õ¿Õ¾Õ¥Ö„ Õ´Õ«Õ¡ÕµÕ¶ Õ£Õ¸Ö€Õ®Õ¸Õ² Õ¬Õ«ÖÖ„Õ¡Õ¾Õ¸Ö€Õ«Õ¹Õ«Ö:"</string>
+ <string name="battery_low_why" msgid="7279169609518386372">"Õ„Õ¡Ö€Õ¿Õ¯Õ¸ÖÕ« Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¸Ö‚Õ´Õ¨"</string>
+ <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Ô¿Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´Õ¶Õ¥Ö€"</string>
+ <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
+ <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Ô»Õ¶Ö„Õ¶Õ¡Õ©Õ«Õ¼Õ¡ÕµÕ«Õ¶ Õ¼Õ¥ÕªÕ«Õ´"</string>
+ <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"Ô»Õ¶Ö„Õ¶Õ¡ÕºÕ¿Õ¿Õ¾Õ¸Õ² Õ§Õ¯Ö€Õ¡Õ¶"</string>
+ <string name="status_bar_settings_mute_label" msgid="554682549917429396">"Õ€Õ¡Õ´Ö€Õ¥ÖÕ¶Õ¥Õ¬"</string>
+ <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"Ô»Õ¶Ö„Õ¶Õ¡Õ·Õ­Õ¡Õ¿"</string>
+ <string name="status_bar_settings_notifications" msgid="397146176280905137">"Ô¾Õ¡Õ¶Õ¸Ö‚ÖÕ¸Ö‚Õ´Õ¶Õ¥Ö€"</string>
+ <string name="bluetooth_tethered" msgid="7094101612161133267">"Bluetooth-Õ¨ Õ¯Õ¡ÕºÕ¾Õ¡Õ® Õ§"</string>
+ <string name="status_bar_input_method_settings_configure_input_methods" msgid="3504292471512317827">"Ô¿Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¥Õ¬ Õ´Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ´Õ¡Õ¶ Õ¥Õ²Õ¡Õ¶Õ¡Õ¯Õ¶Õ¥Ö€Õ¨"</string>
+ <string name="status_bar_use_physical_keyboard" msgid="7551903084416057810">"Õ–Õ«Õ¦Õ«Õ¯Õ¡Õ¯Õ¡Õ¶ Õ½Õ¿Õ¥Õ²Õ¶Õ¡Õ·Õ¡Ö€"</string>
+ <string name="usb_device_permission_prompt" msgid="834698001271562057">"Ô¹Õ¸Ö‚ÕµÕ¬Õ¡Õ¿Ö€Õ¥ÕžÕ¬ <xliff:g id="APPLICATION">%1$s</xliff:g> Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ« Õ´Õ¸Ö‚Õ¿Ö„Õ¨ USB Õ½Õ¡Ö€Ö„:"</string>
+ <string name="usb_accessory_permission_prompt" msgid="5171775411178865750">"Ô¹Õ¸Ö‚ÕµÕ¬Õ¡Õ¿Ö€Õ¥ÕžÕ¬, Õ¸Ö€ <xliff:g id="APPLICATION">%1$s</xliff:g> Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¨ Õ´Õ¸Ö‚Õ¿Ö„ Õ£Õ¸Ö€Õ®Õ« USB Õ¬Ö€Õ¡Õ½Õ¡Ö€Ö„:"</string>
+ <string name="usb_device_confirm_prompt" msgid="5161205258635253206">"Ô²Õ¡ÖÕ¥ÕžÕ¬ <xliff:g id="ACTIVITY">%1$s</xliff:g>-Õ¨, Õ¥Ö€Õ¢ Õ¡ÕµÕ½ USB Õ¯Ö€Õ«Õ¹Õ¨ Õ¯Õ¡ÕºÕ¡Õ¯ÖÕ¾Õ¡Õ® Õ§:"</string>
+ <string name="usb_accessory_confirm_prompt" msgid="3808984931830229888">"Ô²Õ¡ÖÕ¥ÕžÕ¬ <xliff:g id="ACTIVITY">%1$s</xliff:g>-Õ¨, Õ¥Ö€Õ¢ Õ¡ÕµÕ½ USB Õ¬Ö€Õ¡Õ½Õ¡Ö€Ö„Õ¨ Õ¯Õ¡ÕºÕ¡Õ¯ÖÕ¾Õ¡Õ® Õ§:"</string>
+ <string name="usb_accessory_uri_prompt" msgid="513450621413733343">"Ô±ÕµÕ½ USB Õ¬Ö€Õ¡Õ½Õ¡Ö€Ö„Õ« Õ°Õ¥Õ¿ Õ¸Õ¹ Õ´Õ« Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ® Õ¹Õ« Õ¡Õ·Õ­Õ¡Õ¿Õ¸Ö‚Õ´: Ô»Õ´Õ¡ÖÕ¥Ö„ Õ¡Õ¾Õ¥Õ¬Õ«Õ¶ այս լրասարքի Õ´Õ¡Õ½Õ«Õ¶ <xliff:g id="URL">%1$s</xliff:g>-Õ¸Ö‚Õ´"</string>
+ <string name="title_usb_accessory" msgid="4966265263465181372">"USB Õ¬Ö€Õ¡Õ½Õ¡Ö€Ö„"</string>
+ <string name="label_view" msgid="6304565553218192990">"Ô´Õ«Õ¿Õ¥Õ¬"</string>
+ <string name="always_use_device" msgid="1450287437017315906">"Õ•Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¥Õ¬ Õ¬Õ¼Õ¥Õ¬ÕµÕ¡ÕµÕ¶ Õ¡ÕµÕ½ USB Õ½Õ¡Ö€Ö„Õ« Õ°Õ¡Õ´Õ¡Ö€"</string>
+ <string name="always_use_accessory" msgid="1210954576979621596">"Õ•Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¥Õ¬ Õ¬Õ¼Õ¥Õ¬ÕµÕ¡ÕµÕ¶ Õ¡ÕµÕ½ USB Õ¬Ö€Õ¡Õ½Õ¡Ö€Ö„Õ« Õ°Õ¡Õ´Õ¡Ö€"</string>
+ <string name="usb_debugging_title" msgid="4513918393387141949">"Ô¹Õ¸Ö‚ÕµÕ¬Õ¡Õ¿Ö€Õ¥ÕžÕ¬ USB-Õ« Õ¯Õ¡Ö€Õ£Õ¡Õ¢Õ¥Ö€Õ¸Ö‚Õ´Õ¨:"</string>
+ <string name="usb_debugging_message" msgid="2220143855912376496">"Õ€Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ¹Õ« RSA-Õ« Õ¢Õ¡Õ¶Õ¡Õ¬Õ« Õ´Õ¡Õ¿Õ¶Õ¡Õ°Õ¥Õ¿Ö„Õ¶ Õ§`\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
+ <string name="usb_debugging_always" msgid="303335496705863070">"Õ„Õ«Õ·Õ¿ Õ©Õ¸Ö‚ÕµÕ¬Õ¡Õ¿Ö€Õ¥Õ¬ Õ¡ÕµÕ½ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ¹Õ«Ö"</string>
+ <string name="compat_mode_on" msgid="6623839244840638213">"Ô½Õ¸Õ·Õ¸Ö€Õ¡ÖÕ¶Õ¥Õ¬` Õ§Õ¯Ö€Õ¡Õ¶Õ¨ Õ¬ÖÕ¶Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€"</string>
+ <string name="compat_mode_off" msgid="4434467572461327898">"ÕÕ£Õ¥Õ¬` Õ§Õ¯Ö€Õ¡Õ¶Õ¨ Õ¬ÖÕ¶Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€"</string>
+ <string name="compat_mode_help_header" msgid="7969493989397529910">"Õ€Õ¡Õ´Õ¡Õ¿Õ¥Õ²Õ¥Õ¬Õ«Õ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ­Õ¸Õ·Õ¸Ö€Õ¡ÖÕ¸Ö‚Õ´"</string>
+ <string name="compat_mode_help_body" msgid="4946726776359270040">"ÔµÖ€Õ¢ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¨ Õ¶Õ¡Õ­Õ¡Õ£Õ®Õ¾Õ¡Õ® Õ§ Õ¡Õ¾Õ¥Õ¬Õ« ÖƒÕ¸Ö„Ö€ Õ§Õ¯Ö€Õ¡Õ¶Õ« Õ°Õ¡Õ´Õ¡Ö€, Õ­Õ¸Õ·Õ¸Ö€Õ¡ÖÕ´Õ¡Õ¶ Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ«Õ¹Õ¨ Õ¯Õ°Õ¡ÕµÕ¿Õ¶Õ¾Õ« ÕªÕ¡Õ´Õ¡ÖÕ¸Ö‚ÕµÖÕ« Õ¯Õ¸Õ²Ö„Õ«Õ¶:"</string>
+ <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Պահում է էկրանի հանույթը…"</string>
+ <string name="screenshot_saving_title" msgid="8242282144535555697">"ÕŠÕ¡Õ°Õ¸Ö‚Õ´ Õ§ Õ§Õ¯Ö€Õ¡Õ¶Õ« Õ°Õ¡Õ¶Õ¸Ö‚ÕµÕ©Õ¨..."</string>
+ <string name="screenshot_saving_text" msgid="2419718443411738818">"Ô·Õ¯Ö€Õ¡Õ¶Õ« Õ°Õ¡Õ¶Õ¸Ö‚ÕµÕ©Õ¨ ÕºÕ¡Õ°Õ¾Õ¸Ö‚Õ´ Õ§:"</string>
+ <string name="screenshot_saved_title" msgid="6461865960961414961">"Ô·Õ¯Ö€Õ¡Õ¶Õ« Õ°Õ¡Õ¶Õ¸Ö‚ÕµÕ©Õ¨ Õ¬Õ¸Ö‚Õ½Õ¡Õ¶Õ¯Õ¡Ö€Õ¾Õ¥Õ¬ Õ§:"</string>
+ <string name="screenshot_saved_text" msgid="1152839647677558815">"Õ€ÕºÕ¥Ö„ Õ±Õ¥Ö€ Õ§Õ¯Ö€Õ¡Õ¶Õ« Õ°Õ¡Õ¶Õ¸Ö‚ÕµÕ©Õ¨ Õ¿Õ¥Õ½Õ¶Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€:"</string>
+ <string name="screenshot_failed_title" msgid="705781116746922771">"Õ‰Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Ö Õ¬Õ¸Ö‚Õ½Õ¡Õ¶Õ¯Õ¡Ö€Õ¥Õ¬ Õ§Õ¯Ö€Õ¡Õ¶Õ« Õ°Õ¡Õ¶Õ¸Ö‚ÕµÕ©Õ¨:"</string>
+ <string name="screenshot_failed_text" msgid="8134011269572415402">"Õ‰Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Ö ÕºÕ¡Õ°Õ¥Õ¬ Õ§Õ¯Ö€Õ¡Õ¶Õ« Õ°Õ¡Õ¶Õ¸Ö‚ÕµÕ©Õ¨: Õ€Õ¶Õ¡Ö€Õ¡Õ¾Õ¸Ö€ Õ§` ÕºÕ¡Õ°Õ¸ÖÕ¶ Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ´Õ¡Õ¶ Õ´Õ¥Õ» Õ§:"</string>
+ <string name="usb_preference_title" msgid="6551050377388882787">"USB Ö†Õ¡ÕµÕ¬Õ¥Ö€Õ« ÖƒÕ¸Õ­Õ¡Õ¶ÖÕ´Õ¡Õ¶ Õ¨Õ¶Õ¿Ö€Õ¡Õ¶Ö„Õ¶Õ¥Ö€"</string>
+ <string name="use_mtp_button_title" msgid="4333504413563023626">"Õ„Õ«Õ¡ÖÕ¶Õ¥Õ¬ Õ¸Ö€ÕºÕ¥Õ½ Õ´Õ¥Õ¤Õ«Õ¡ Õ¶Õ¾Õ¡Õ£Õ¡Ö€Õ¯Õ«Õ¹ (MTP)"</string>
+ <string name="use_ptp_button_title" msgid="7517127540301625751">"Õ„Õ«Õ¡ÖÕ¶Õ¥Õ¬ Õ¸Ö€ÕºÕ¥Õ½ Ö†Õ¸Õ¿Õ¸Õ­ÖÕ«Õ¯ (PTP)"</string>
+ <string name="installer_cd_button_title" msgid="2312667578562201583">"ÕÕ¥Õ²Õ¡Õ¤Ö€Õ¥Õ¬ Android Ö†Õ¡ÕµÕ¬Õ¥Ö€Õ« ÖƒÕ¸Õ­Õ¡Õ¶ÖÕ´Õ¡Õ¶ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¨ Mac-Õ« Õ°Õ¡Õ´Õ¡Ö€"</string>
+ <string name="accessibility_back" msgid="567011538994429120">"Õ€Õ¥Õ¿"</string>
+ <string name="accessibility_home" msgid="8217216074895377641">"ÕÕ¸Ö‚Õ¶"</string>
+ <string name="accessibility_menu" msgid="316839303324695949">"Õ‘Õ¡Õ¶Õ¯"</string>
+ <string name="accessibility_recent" msgid="8571350598987952883">"ÕŽÕ¥Ö€Õ»Õ«Õ¶ Õ®Ö€Õ¡Õ£Ö€Õ¥Ö€Õ¨"</string>
+ <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Õ„Õ«Õ¡ÖÕ¶Õ¥Õ¬ Õ´Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ´Õ¡Õ¶ Õ¥Õ²Õ¡Õ¶Õ¡Õ¯Õ« Õ¯Õ¸Õ³Õ¡Õ¯Õ¨:"</string>
+ <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Õ€Õ¡Õ´Õ¡Õ¿Õ¥Õ²Õ¥Õ¬Õ«Õ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ­Õ¸Õ·Õ¸Ö€Õ¡ÖÕ´Õ¡Õ¶ Õ¯Õ¸Õ³Õ¡Õ¯Õ¨:"</string>
+ <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Ô´Õ«Õ¿Õ¡ÖƒÕ¸Õ­Õ¥Õ¬ ÖƒÕ¸Ö„Ö€Õ«Ö Õ¡Õ¾Õ¥Õ¬Õ« Õ´Õ¥Õ® Õ§Õ¯Ö€Õ¡Õ¶:"</string>
+ <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth-Õ¨ Õ´Õ«Õ¡ÖÕ¾Õ¡Õ® Õ§:"</string>
+ <string name="accessibility_bluetooth_disconnected" msgid="7416648669976870175">"Bluetooth-Õ¶ Õ¡Õ¶Õ»Õ¡Õ¿Õ¾Õ¡Õ® Õ§:"</string>
+ <string name="accessibility_no_battery" msgid="358343022352820946">"Õ„Õ¡Ö€Õ¿Õ¯Õ¸Ö Õ¹Õ¯Õ¡:"</string>
+ <string name="accessibility_battery_one_bar" msgid="7774887721891057523">"Õ„Õ¡Ö€Õ¿Õ¯Õ¸ÖÕ« Õ´Õ¥Õ¯ Õ£Õ«Õ®:"</string>
+ <string name="accessibility_battery_two_bars" msgid="8500650438735009973">"Õ„Õ¡Ö€Õ¿Õ¯Õ¸ÖÕ« Õ¥Ö€Õ¯Õ¸Ö‚ Õ£Õ«Õ®:"</string>
+ <string name="accessibility_battery_three_bars" msgid="2302983330865040446">"Õ„Õ¡Ö€Õ¿Õ¯Õ¸ÖÕ« Õ¥Ö€Õ¥Ö„ Õ£Õ«Õ®:"</string>
+ <string name="accessibility_battery_full" msgid="8909122401720158582">"Õ„Õ¡Ö€Õ¿Õ¯Õ¸ÖÕ¨ Õ¬Õ«Ö„Õ¶ Õ§:"</string>
+ <string name="accessibility_no_phone" msgid="4894708937052611281">"Õ€Õ¥Õ¼Õ¡Õ­Õ¸Õ½ Õ¹Õ¯Õ¡:"</string>
+ <string name="accessibility_phone_one_bar" msgid="687699278132664115">"Õ€Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ« Õ´Õ¥Õ¯ Õ£Õ«Õ®:"</string>
+ <string name="accessibility_phone_two_bars" msgid="8384905382804815201">"Õ€Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ« Õ¥Ö€Õ¯Õ¸Ö‚ Õ£Õ«Õ®:"</string>
+ <string name="accessibility_phone_three_bars" msgid="8521904843919971885">"Õ€Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ« Õ¥Ö€Õ¥Ö„ Õ£Õ«Õ®:"</string>
+ <string name="accessibility_phone_signal_full" msgid="6471834868580757898">"Õ€Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ« Õ¡Õ¦Õ¤Õ¡Õ¶Õ·Õ¡Õ¶Õ¨ Õ¬Õ«Ö„Õ¶ Õ§:"</string>
+ <string name="accessibility_no_data" msgid="4791966295096867555">"ÕÕ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€ Õ¹Õ¯Õ¡Õ¶:"</string>
+ <string name="accessibility_data_one_bar" msgid="1415625833238273628">"ÕÕ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ« Õ´Õ¥Õ¯ Õ£Õ«Õ®:"</string>
+ <string name="accessibility_data_two_bars" msgid="6166018492360432091">"ÕÕ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ« Õ¥Ö€Õ¯Õ¸Ö‚ Õ£Õ«Õ®:"</string>
+ <string name="accessibility_data_three_bars" msgid="9167670452395038520">"ÕÕ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ« Õ¥Ö€Õ¥Ö„ Õ£Õ«Õ®:"</string>
+ <string name="accessibility_data_signal_full" msgid="2708384608124519369">"ÕÕ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ« Õ¡Õ¦Õ¤Õ¡Õ¶Õ·Õ¡Õ¶Õ¨ Õ¬Ö€Õ«Õ¾ Õ§:"</string>
+ <string name="accessibility_wifi_off" msgid="3177380296697933627">"Wifi-Õ¨ Õ¡Õ¶Õ»Õ¡Õ¿Õ¾Õ¡Õ® Õ§:"</string>
+ <string name="accessibility_no_wifi" msgid="1425476551827924474">"WiFi-Õ¨ Õ¡Õ¶Õ»Õ¡Õ¿Õ¾Õ¡Õ® Õ§:"</string>
+ <string name="accessibility_wifi_one_bar" msgid="7735893178010724377">"Wifi-Õ« Õ´Õ¥Õ¯ Õ£Õ«Õ®:"</string>
+ <string name="accessibility_wifi_two_bars" msgid="4994274250497262434">"Wifi-Õ« Õ¥Ö€Õ¯Õ¸Ö‚ Õ£Õ«Õ®:"</string>
+ <string name="accessibility_wifi_three_bars" msgid="3495755044276588384">"WiFi-Õ« Õ¥Ö€Õ¥Ö„ Õ£Õ«Õ®:"</string>
+ <string name="accessibility_wifi_signal_full" msgid="6853561303586480376">"Wifi-Õ« Õ¡Õ¦Õ¤Õ¡Õ¶Õ·Õ¡Õ¶Õ¨ Õ¬Õ«Ö„Õ¶ Õ§:"</string>
+ <string name="accessibility_no_wimax" msgid="4329180129727630368">"WiMAX Õ¹Õ¯Õ¡:"</string>
+ <string name="accessibility_wimax_one_bar" msgid="4170994299011863648">"WiMAX-Õ« Õ´Õ¥Õ¯ Õ£Õ«Õ®:"</string>
+ <string name="accessibility_wimax_two_bars" msgid="9176236858336502288">"WiMAX-Õ« Õ¥Ö€Õ¯Õ¸Ö‚ Õ£Õ«Õ®:"</string>
+ <string name="accessibility_wimax_three_bars" msgid="6116551636752103927">"WiMAX-Õ« Õ¥Ö€Õ¥Ö„ Õ£Õ«Õ®:"</string>
+ <string name="accessibility_wimax_signal_full" msgid="2768089986795579558">"WiMAX-Õ« Õ¡Õ¦Õ¤Õ¡Õ¶Õ·Õ¡Õ¶Õ¨ Õ¬Õ«Ö„Õ¶ Õ§:"</string>
+ <string name="accessibility_no_signal" msgid="7064645320782585167">"Ô±Õ¦Õ¤Õ¡Õ¶Õ·Õ¡Õ¶ Õ¹Õ¯Õ¡:"</string>
+ <string name="accessibility_not_connected" msgid="6395326276213402883">"Õ„Õ«Õ¡ÖÕ¾Õ¡Õ® Õ¹Õ§:"</string>
+ <string name="accessibility_zero_bars" msgid="3806060224467027887">"Ô¶Ö€Õ¸ Õ£Õ«Õ®:"</string>
+ <string name="accessibility_one_bar" msgid="1685730113192081895">"Õ„Õ¥Õ¯ Õ£Õ«Õ®:"</string>
+ <string name="accessibility_two_bars" msgid="6437363648385206679">"ÔµÖ€Õ¯Õ¸Ö‚ Õ£Õ«Õ®:"</string>
+ <string name="accessibility_three_bars" msgid="2648241415119396648">"ÔµÖ€Õ¥Ö„ Õ£Õ«Õ®:"</string>
+ <string name="accessibility_signal_full" msgid="9122922886519676839">"Ô±Õ¦Õ¤Õ¡Õ¶Õ·Õ¡Õ¶Õ¨ Õ¬Ö€Õ«Õ¾ Õ§:"</string>
+ <string name="accessibility_desc_on" msgid="2385254693624345265">"Õ„Õ«Õ¡ÖÕ¾Õ¡Õ® Õ§:"</string>
+ <string name="accessibility_desc_off" msgid="6475508157786853157">"Ô±Õ¶Õ»Õ¡Õ¿Õ¾Õ¡Õ® Õ§:"</string>
+ <string name="accessibility_desc_connected" msgid="8366256693719499665">"Õ„Õ«Õ¡ÖÕ¾Õ¡Õ® Õ§:"</string>
+ <string name="accessibility_data_connection_gprs" msgid="1606477224486747751">"GPRS"</string>
+ <string name="accessibility_data_connection_1x" msgid="994133468120244018">"1 X"</string>
+ <string name="accessibility_data_connection_hspa" msgid="2032328855462645198">"HSPA"</string>
+ <string name="accessibility_data_connection_3g" msgid="8628562305003568260">"3G"</string>
+ <string name="accessibility_data_connection_3.5g" msgid="8664845609981692001">"3.5G"</string>
+ <string name="accessibility_data_connection_4g" msgid="7741000750630089612">"4G"</string>
+ <string name="accessibility_data_connection_lte" msgid="5413468808637540658">"LTE"</string>
+ <string name="accessibility_data_connection_cdma" msgid="6132648193978823023">"CDMA"</string>
+ <string name="accessibility_data_connection_roaming" msgid="5977362333466556094">"Ռոումինգ"</string>
+ <string name="accessibility_data_connection_edge" msgid="4477457051631979278">"Edge"</string>
+ <string name="accessibility_data_connection_wifi" msgid="2324496756590645221">"Wi-Fi"</string>
+ <string name="accessibility_no_sim" msgid="8274017118472455155">"SIM Õ¹Õ¯Õ¡:"</string>
+ <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Bluetooth-Õ¨ Õ¯Õ¡ÕºÕ¾Õ¸Ö‚Õ´ Õ§:"</string>
+ <string name="accessibility_airplane_mode" msgid="834748999790763092">"Ô»Õ¶Ö„Õ¶Õ¡Õ©Õ«Õ¼Õ¡ÕµÕ«Õ¶ Õ¼Õ¥ÕªÕ«Õ´"</string>
+ <string name="accessibility_battery_level" msgid="7451474187113371965">"Õ„Õ¡Ö€Õ¿Õ¯Õ¸ÖÕ¨ <xliff:g id="NUMBER">%d</xliff:g> Õ¿Õ¸Õ¯Õ¸Õ½ Õ§:"</string>
+ <string name="accessibility_settings_button" msgid="799583911231893380">"Õ€Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ« Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´Õ¶Õ¥Ö€:"</string>
+ <string name="accessibility_notifications_button" msgid="4498000369779421892">"Ô¾Õ¡Õ¶Õ¸Ö‚ÖÕ¸Ö‚Õ´Õ¶Õ¥Ö€:"</string>
+ <string name="accessibility_remove_notification" msgid="3603099514902182350">"Õ„Õ¡Ö„Ö€Õ¥Õ¬ Õ®Õ¡Õ¶Õ¸Ö‚ÖÕ¸Ö‚Õ´Õ¨:"</string>
+ <string name="accessibility_gps_enabled" msgid="3511469499240123019">"GPS-Õ¨ Õ´Õ«Õ¡ÖÕ¾Õ¡Õ® Õ§:"</string>
+ <string name="accessibility_gps_acquiring" msgid="8959333351058967158">"GPS-Õ« Õ½Õ¿Õ¡ÖÕ¸Ö‚Õ´:"</string>
+ <string name="accessibility_tty_enabled" msgid="4613200365379426561">"Õ€Õ¥Õ¼Õ¡Õ´Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ«Õ¹Õ¨ Õ´Õ«Õ¡ÖÕ¾Õ¡Õ® Õ§:"</string>
+ <string name="accessibility_ringer_vibrate" msgid="666585363364155055">"Ô¶Õ¡Õ¶Õ£Õ« Õ©Ö€Õ©Õ¼Õ¸Ö:"</string>
+ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"Ô¶Õ¡Õ¶Õ£Õ¡Õ¯Õ¨ Õ¬Õ¼Õ¥ÖÕ¾Õ¡Õ® Õ§:"</string>
+ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g>-Õ¨ Õ¡Õ¶Õ¿Õ¥Õ½Õ¾Õ¡Õ® Õ§:"</string>
+ <string name="accessibility_notification_dismissed" msgid="854211387186306927">"Ô¾Õ¡Õ¶Õ¸Ö‚ÖÕ¸Ö‚Õ´Õ¨ Õ¡Õ¶Õ¿Õ¥Õ½Õ¾Õ¥Ö:"</string>
+ <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Ô¾Õ¡Õ¶Õ¸Ö‚ÖÕ¸Ö‚Õ´Õ¶Õ¥Ö€Õ« Õ¾Õ¡Õ°Õ¡Õ¶Õ¡Õ¯:"</string>
+ <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Ô±Ö€Õ¡Õ£ Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´Õ¶Õ¥Ö€:"</string>
+ <string name="accessibility_desc_recent_apps" msgid="9014032916410590027">"ÕŽÕ¥Ö€Õ»Õ«Õ¶ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ¨:"</string>
+ <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Õ•Õ£Õ¿Õ¾Õ¸Õ² <xliff:g id="USER">%s</xliff:g>:"</string>
+ <string name="accessibility_quick_settings_wifi" msgid="6099781031669728709">"<xliff:g id="SIGNAL">%1$s</xliff:g>: <xliff:g id="NETWORK">%2$s</xliff:g>"</string>
+ <string name="accessibility_quick_settings_mobile" msgid="4876806564086241341">"Õ‡Õ¡Ö€ÕªÕ¡Õ¯Õ¡Õ¶ <xliff:g id="SIGNAL">%1$s</xliff:g>: <xliff:g id="TYPE">%2$s</xliff:g>: <xliff:g id="NETWORK">%3$s</xliff:g>:"</string>
+ <string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"Õ„Õ¡Ö€Õ¿Õ¯Õ¸ÖÕ¨ <xliff:g id="STATE">%s</xliff:g> Õ§:"</string>
+ <string name="accessibility_quick_settings_airplane" msgid="4196876722090224753">"Ô»Õ¶Ö„Õ¶Õ¡Õ©Õ«Õ¼Õ¡ÕµÕ«Õ¶ Õ¼Õ¥ÕªÕ«Õ´Õ¨ <xliff:g id="STATE">%s</xliff:g> Õ§:"</string>
+ <string name="accessibility_quick_settings_bluetooth" msgid="5749054971341882340">"Bluetooth-Õ¨ <xliff:g id="STATE">%s</xliff:g> Õ§:"</string>
+ <string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"Ô¶Õ¡Ö€Õ©Õ¸Ö‚ÖÕ«Õ¹Õ¨ Õ¤Ö€Õ¾Õ¡Õ® Õ§ <xliff:g id="TIME">%s</xliff:g>-Õ«Õ¶:"</string>
+ <string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"2G-3G Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨ Õ¡Õ¶Õ»Õ¡Õ¿Õ¾Õ¡Õ® Õ¥Õ¶"</string>
+ <string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"4G Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨ Õ¡Õ¶Õ»Õ¡Õ¿Õ¾Õ¡Õ® Õ¥Õ¶"</string>
+ <string name="data_usage_disabled_dialog_mobile_title" msgid="1046047248844821202">"Õ‡Õ¡Ö€ÕªÕ¡Õ¯Õ¡Õ¶ Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨ Õ¡Õ¶Õ»Õ¡Õ¿Õ¾Õ¡Õ® Õ¥Õ¶"</string>
+ <string name="data_usage_disabled_dialog_title" msgid="2086815304858964954">"ÕÕ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨ Õ¡Õ¶Õ»Õ¡Õ¿Õ¾Õ¡Õ® Õ¥Õ¶"</string>
+ <string name="data_usage_disabled_dialog" msgid="3853117269051806280">"Ô´Õ¸Ö‚Ö„ Õ°Õ¡Õ½Õ¥Õ¬ Õ¥Ö„ Õ¶Õ·Õ¾Õ¡Õ® Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ« Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ´Õ¡Õ¶ Õ½Õ¡Õ°Õ´Õ¡Õ¶Õ«Õ¶:\n\n ÔµÕ©Õ¥ Õ¤Õ¸Ö‚Ö„ Õ¯Ö€Õ¯Õ«Õ¶ Õ¡Õ¯Õ¿Õ«Õ¾Õ¡ÖÕ¶Õ¥Ö„ Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨, Õ¡ÕµÕ¶ Õ¯Õ¡Ö€Õ¸Õ² Õ§ Õ£Õ¡Õ¶Õ±Õ¾Õ¥Õ¬ Ö…ÕºÕ¥Ö€Õ¡Õ¿Õ¸Ö€Õ« Õ¯Õ¸Õ²Õ´Õ«Ö:"</string>
+ <string name="data_usage_disabled_dialog_enable" msgid="7729772039208664606">"ÕŽÕ¥Ö€Õ¡Õ´Õ«Õ¡ÖÕ¶Õ¥Õ¬ Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨"</string>
+ <string name="status_bar_settings_signal_meter_disconnected" msgid="1940231521274147771">"Ô»Õ¶Õ¿Õ¥Ö€Õ¶Õ¥Õ¿ Õ¯Õ¡Õº Õ¹Õ¯Õ¡"</string>
+ <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Wi-Fi-Õ¨ Õ´Õ«Õ¡ÖÕ¾Õ¡Õ® Õ§"</string>
+ <string name="gps_notification_searching_text" msgid="8574247005642736060">"ÕˆÖ€Õ¸Õ¶Õ¸Ö‚Õ´ Õ§ GPS"</string>
+ <string name="gps_notification_found_text" msgid="4619274244146446464">"ÕÕ¥Õ²Õ¡Õ¤Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¾Õ¥Õ¬ Õ§ GPS-Õ« Õ¯Õ¸Õ²Õ´Õ«Ö"</string>
+ <string name="accessibility_location_active" msgid="2427290146138169014">"ÕÕ¥Õ²Õ¡Õ¤Ö€Õ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ°Õ¡Ö€ÖÕ¸Ö‚Õ´Õ¶Õ¥Ö€Õ¶ Õ¡Õ¯Õ¿Õ«Õ¾ Õ¥Õ¶"</string>
+ <string name="accessibility_clear_all" msgid="5235938559247164925">"Õ„Õ¡Ö„Ö€Õ¥Õ¬ Õ¢Õ¸Õ¬Õ¸Ö€ Õ®Õ¡Õ¶Õ¸Ö‚ÖÕ¸Ö‚Õ´Õ¶Õ¥Ö€Õ¨:"</string>
+ <string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"ÕÕ¥Õ²Õ¥Õ¯Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€ Õ®Ö€Õ¡Õ£Ö€Õ« Õ´Õ¡Õ½Õ«Õ¶"</string>
+ <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Ô·Õ¯Ö€Õ¡Õ¶Õ¨ Õ«Õ¶Ö„Õ¶Õ¸Ö‚Ö€Õ¸Ö‚ÕµÕ¶ Õ¯ÕºÕ¿Õ¿Õ¾Õ«:"</string>
+ <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Ô·Õ¯Ö€Õ¡Õ¶Õ¨ Õ¯Õ¸Õ²ÕºÕ¾Õ¡Õ® Õ§ Õ°Õ¸Ö€Õ«Õ¦Õ¸Õ¶Õ¡Õ¯Õ¡Õ¶ Õ¤Õ«Ö€Ö„Õ¡Õ¾Õ¸Ö€Õ´Õ¡Õ¶ Õ´Õ¥Õ»:"</string>
+ <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Ô·Õ¯Ö€Õ¡Õ¶Õ¨ Õ¯Õ¸Õ²ÕºÕ¾Õ¡Õ® Õ§ Õ¸Ö‚Õ²Õ²Õ¡Õ±Õ«Õ£ Õ¤Õ«Ö€Ö„Õ¡Õ¾Õ¸Ö€Õ´Õ¡Õ´Õ¢:"</string>
+ <string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
+ <string name="start_dreams" msgid="7219575858348719790">"Õ‘Õ¥Ö€Õ¥Õ¯Õ¡ÕµÕ«Õ¶ Õ¼Õ¥ÕªÕ«Õ´"</string>
+ <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
+ <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Ô»Õ¶Ö„Õ¶Õ¡Õ©Õ«Õ¼Õ¡ÕµÕ«Õ¶ Õ¼Õ¥ÕªÕ«Õ´"</string>
+ <string name="quick_settings_battery_charging_label" msgid="490074774465309209">"Ô¼Õ«ÖÖ„Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´` <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+ <string name="quick_settings_battery_charged_label" msgid="8865413079414246081">"Ô¼Õ«ÖÖ„Õ¡Õ¾Õ¸Ö€Õ¾Õ¡Õ® Õ§"</string>
+ <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string>
+ <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (<xliff:g id="NUMBER">%d</xliff:g> Õ½Õ¡Ö€Ö„)"</string>
+ <string name="quick_settings_bluetooth_off_label" msgid="8159652146149219937">"Bluetooth-Õ¶ Õ¡Õ¶Õ»Õ¡Õ¿Õ¾Õ¡Õ® Õ§"</string>
+ <string name="quick_settings_brightness_label" msgid="6968372297018755815">"ÕŠÕ¡ÕµÕ®Õ¡Õ¼Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶"</string>
+ <string name="quick_settings_rotation_unlocked_label" msgid="336054930362580584">"Ô»Õ¶Ö„Õ¶Õ¡ÕºÕ¿Õ¿Õ¸Ö‚Õ´"</string>
+ <string name="quick_settings_rotation_locked_label" msgid="8058646447242565486">"ÕŠÕ¿Õ¿Õ¸Ö‚Õ´Õ¨ Õ¯Õ¸Õ²ÕºÕ¾Õ¡Õ® Õ§"</string>
+ <string name="quick_settings_ime_label" msgid="7073463064369468429">"Õ„Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ´Õ¡Õ¶ Õ¥Õ²Õ¡Õ¶Õ¡Õ¯Õ¨"</string>
+ <string name="quick_settings_location_label" msgid="5011327048748762257">"ÕÕ¥Õ²Õ¡Õ¤Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶"</string>
+ <string name="quick_settings_location_off_label" msgid="7464544086507331459">"Ô±Õ¶Õ»Õ¡Õ¿Õ¥Õ¬ Õ¿Õ¥Õ²Õ¡Õ¤Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨"</string>
+ <string name="quick_settings_media_device_label" msgid="1302906836372603762">"Õ„Õ¥Õ¤Õ«Õ¡ Õ½Õ¡Ö€Ö„"</string>
+ <string name="quick_settings_rssi_label" msgid="7725671335550695589">"RSSI"</string>
+ <string name="quick_settings_rssi_emergency_only" msgid="2713774041672886750">"Õ„Õ«Õ¡ÕµÕ¶ Õ¡Ö€Õ¿Õ¡Õ¯Õ¡Ö€Õ£ Õ«Ö€Õ¡Õ¾Õ«Õ³Õ¡Õ¯Õ¶Õ¥Ö€Õ« Õ¦Õ¡Õ¶Õ£Õ¥Ö€"</string>
+ <string name="quick_settings_settings_label" msgid="5326556592578065401">"Ô¿Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´Õ¶Õ¥Ö€"</string>
+ <string name="quick_settings_time_label" msgid="4635969182239736408">"ÔºÕ¡Õ´Õ¡Õ¶Õ¡Õ¯Õ¨"</string>
+ <string name="quick_settings_user_label" msgid="5238995632130897840">"ÔµÕ½"</string>
+ <string name="quick_settings_wifi_label" msgid="9135344704899546041">"Wi-Fi"</string>
+ <string name="quick_settings_wifi_not_connected" msgid="7171904845345573431">"Õ„Õ«Õ¡ÖÕ¾Õ¡Õ® Õ¹Õ§"</string>
+ <string name="quick_settings_wifi_no_network" msgid="2221993077220856376">"Õ‘Õ¡Õ¶Ö Õ¹Õ¯Õ¡"</string>
+ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi-Õ¨ Õ¡Õ¶Õ»Õ¡Õ¿Õ¾Õ¡Õ® Õ§"</string>
+ <string name="quick_settings_wifi_display_label" msgid="6893592964463624333">"Wi-Fi ÖÕ¸Ö‚ÖÕ¡Õ¤Ö€Õ«Õ¹"</string>
+ <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Ô±Õ¶Õ¬Õ¡Ö€ Õ§Õ¯Ö€Õ¡Õ¶"</string>
+ <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"ÕŠÕ¡ÕµÕ®Õ¡Õ¼Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶"</string>
+ <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"Ô»Õ¶Ö„Õ¶Õ¡Õ·Õ­Õ¡Õ¿"</string>
+ <string name="status_bar_help_title" msgid="1199237744086469217">"Ô¾Õ¡Õ¶Õ¸Ö‚ÖÕ¸Ö‚Õ´Õ¶Õ¥Ö€Õ¨ Õ°Õ¡ÕµÕ¿Õ¶Õ¾Õ¸Ö‚Õ´ Õ¥Õ¶ Õ¡ÕµÕ½Õ¿Õ¥Õ²"</string>
+ <string name="status_bar_help_text" msgid="7874607155052076323">"Ô´Ö€Õ¡Õ¶Ö„ Õ´Õ¡Õ¿Õ¹Õ¥Ö„ ÖÕ¡Õ¶Õ¯Õ¡ÖÕ¡Õ® ÕºÕ¡Õ°Õ«` Õ½Õ¡Õ°Õ¡Õ°Õ¡Ö€Õ¾Õ¡Õ®Õ¥Õ¬Õ¸Õ¾:\nÔ¿Ö€Õ¯Õ«Õ¶ Õ½Õ¡Õ°Õ¡Õ°Õ¡Ö€Õ¾Õ¡Õ®Õ¥Ö„ Õ¶Õ¥Ö€Ö„Ö‡` Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ¡ÕµÕ«Õ¶ Õ¯Õ¡Õ¼Õ¡Õ¾Õ¡Ö€Õ´Õ¡Õ¶ Õ°Õ¡Õ´Õ¡Ö€:"</string>
+</resources>
diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml
index 6a702b9..1d58eda9 100644
--- a/packages/SystemUI/res/values-in/strings.xml
+++ b/packages/SystemUI/res/values-in/strings.xml
@@ -61,8 +61,6 @@
<string name="usb_debugging_always" msgid="303335496705863070">"Selalu izinkan dari komputer ini"</string>
<string name="compat_mode_on" msgid="6623839244840638213">"Perbesar utk mengisi layar"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Rentangkn utk mngisi layar"</string>
- <string name="compat_mode_help_header" msgid="7969493989397529910">"Perbesar/perkecil untuk kompatibilitas"</string>
- <string name="compat_mode_help_body" msgid="4946726776359270040">"Saat apl dirancang untuk layar yang lebih kecil, kontrol zoom akan tampil di dekat jam."</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Menyimpan tangkapan layar..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Menyimpan tangkapan layar..."</string>
<string name="screenshot_saving_text" msgid="2419718443411738818">"Tangkapan layar sedang disimpan."</string>
@@ -78,6 +76,8 @@
<string name="accessibility_home" msgid="8217216074895377641">"Utama"</string>
<string name="accessibility_menu" msgid="316839303324695949">"Menu"</string>
<string name="accessibility_recent" msgid="8571350598987952883">"Apl terbaru"</string>
+ <string name="accessibility_search_light" msgid="1103867596330271848">"Telusuri"</string>
+ <string name="accessibility_camera_button" msgid="8064671582820358152">"Kamera"</string>
<string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Tombol beralih metode masukan."</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Tombol perbesar/perkecil kompatibilitas."</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Perbesar dari layar kecil ke besar."</string>
@@ -153,6 +153,7 @@
<string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"Baterai <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_airplane" msgid="4196876722090224753">"Mode Pesawat <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="5749054971341882340">"Bluetooth <xliff:g id="STATE">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_location" msgid="4577282329866813100">"Lokasi <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"Alarm disetel ke <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"Data 2G-3G dinonaktifkan"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"Data 4G dinonaktifkan"</string>
@@ -164,12 +165,13 @@
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Wi-Fi tersambung"</string>
<string name="gps_notification_searching_text" msgid="8574247005642736060">"Menelusuri GPS"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"Lokasi yang disetel oleh GPS"</string>
+ <string name="accessibility_location_active" msgid="2427290146138169014">"Permintaan lokasi aktif"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"Menghapus semua pemberitahuan."</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Info aplikasi"</string>
<string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Layar akan diputar secara otomatis."</string>
<string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Layar dikunci dalam orientasi lanskap."</string>
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Layar dikunci dalam orientasi potret."</string>
- <string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
+ <string name="dessert_case" msgid="1295161776223959221">"Etalase Hidangan Penutup"</string>
<string name="start_dreams" msgid="7219575858348719790">"Lamunan"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
<string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Mode pesawat"</string>
@@ -182,10 +184,8 @@
<string name="quick_settings_rotation_unlocked_label" msgid="336054930362580584">"Rotasi Otomatis"</string>
<string name="quick_settings_rotation_locked_label" msgid="8058646447242565486">"Rotasi Dikunci"</string>
<string name="quick_settings_ime_label" msgid="7073463064369468429">"Metode Masukan"</string>
- <!-- no translation found for quick_settings_location_label (5011327048748762257) -->
- <skip />
- <!-- no translation found for quick_settings_location_off_label (7464544086507331459) -->
- <skip />
+ <string name="quick_settings_location_label" msgid="5011327048748762257">"Lokasi"</string>
+ <string name="quick_settings_location_off_label" msgid="7464544086507331459">"Lokasi Mati"</string>
<string name="quick_settings_media_device_label" msgid="1302906836372603762">"Perangkat media"</string>
<string name="quick_settings_rssi_label" msgid="7725671335550695589">"RSSI"</string>
<string name="quick_settings_rssi_emergency_only" msgid="2713774041672886750">"Panggilan Darurat Saja"</string>
@@ -200,8 +200,8 @@
<string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Layar Nirkabel"</string>
<string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Kecerahan"</string>
<string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"OTOMATIS"</string>
- <string name="status_bar_help_title" msgid="1199237744086469217">"Pemberitahuan muncul di sini"</string>
- <string name="status_bar_help_text" msgid="7874607155052076323">"Akses kapan saja dengan menggesek ke bawah.\nGesek ke bawah sekali lagi untuk kontrol sistem."</string>
- <string name="hideybar_confirmation_message" msgid="9050869548951044371">"Gesek tepi layar untuk membuka bilah"</string>
- <string name="hideybar_confirmation_message_long" msgid="7117692795163620626">"Gesek dari bagian tepi layar untuk membuka bilah sistem"</string>
+ <string name="quick_settings_inversion_label" msgid="1666358784283020762">"Mode inversi warna"</string>
+ <string name="quick_settings_contrast_label" msgid="3319507551689108692">"Mode kontras yang disempurnakan"</string>
+ <string name="quick_settings_color_space_label" msgid="853443689745584770">"Mode koreksi warna"</string>
+ <string name="ssl_ca_cert_warning" msgid="9005954106902053641">"Jaringan bisa\ndiawasi"</string>
</resources>
diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml
index a350d38..4efe75c 100644
--- a/packages/SystemUI/res/values-it/strings.xml
+++ b/packages/SystemUI/res/values-it/strings.xml
@@ -61,8 +61,6 @@
<string name="usb_debugging_always" msgid="303335496705863070">"Consenti sempre da questo computer"</string>
<string name="compat_mode_on" msgid="6623839244840638213">"Zoom per riempire schermo"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Estendi per riemp. schermo"</string>
- <string name="compat_mode_help_header" msgid="7969493989397529910">"Zoom compatibilità"</string>
- <string name="compat_mode_help_body" msgid="4946726776359270040">"Se un\'applicazione è stata progettata per uno schermo più piccolo, accanto all\'orologio viene visualizzato un controllo dello zoom."</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Salvataggio screenshot..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Salvataggio screenshot..."</string>
<string name="screenshot_saving_text" msgid="2419718443411738818">"Screenshot in corso di salvataggio."</string>
@@ -78,6 +76,8 @@
<string name="accessibility_home" msgid="8217216074895377641">"Home"</string>
<string name="accessibility_menu" msgid="316839303324695949">"Menu"</string>
<string name="accessibility_recent" msgid="8571350598987952883">"Applicazioni recenti"</string>
+ <string name="accessibility_search_light" msgid="1103867596330271848">"Cerca"</string>
+ <string name="accessibility_camera_button" msgid="8064671582820358152">"Fotocamera"</string>
<string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Pulsante per cambiare metodo di immissione."</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Pulsante zoom compatibilità."</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Zoom inferiore per schermo più grande."</string>
@@ -116,8 +116,8 @@
<string name="accessibility_two_bars" msgid="6437363648385206679">"Due barre."</string>
<string name="accessibility_three_bars" msgid="2648241415119396648">"Tre barre."</string>
<string name="accessibility_signal_full" msgid="9122922886519676839">"Massimo segnale."</string>
- <string name="accessibility_desc_on" msgid="2385254693624345265">"Attivo."</string>
- <string name="accessibility_desc_off" msgid="6475508157786853157">"Non attivo."</string>
+ <string name="accessibility_desc_on" msgid="2385254693624345265">"ON"</string>
+ <string name="accessibility_desc_off" msgid="6475508157786853157">"OFF"</string>
<string name="accessibility_desc_connected" msgid="8366256693719499665">"Connesso."</string>
<string name="accessibility_data_connection_gprs" msgid="1606477224486747751">"GPRS"</string>
<string name="accessibility_data_connection_1x" msgid="994133468120244018">"1 X"</string>
@@ -155,6 +155,7 @@
<string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"Batteria: <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_airplane" msgid="4196876722090224753">"Modalità aereo: <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="5749054971341882340">"Bluetooth: <xliff:g id="STATE">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_location" msgid="4577282329866813100">"Posizione: <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"Allarme impostato per: <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"Dati 2G-3G disattivati"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"Dati 4G disattivati"</string>
@@ -166,12 +167,13 @@
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Wi-Fi connesso"</string>
<string name="gps_notification_searching_text" msgid="8574247005642736060">"Ricerca del GPS"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"Posizione stabilita dal GPS"</string>
+ <string name="accessibility_location_active" msgid="2427290146138169014">"Richieste di accesso alla posizione attive"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"Cancella tutte le notifiche."</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Informazioni applicazione"</string>
<string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Lo schermo ruoterà automaticamente."</string>
<string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Lo schermo è bloccato in orientamento orizzontale."</string>
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Lo schermo è bloccato in orientamento verticale."</string>
- <string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
+ <string name="dessert_case" msgid="1295161776223959221">"Vetrina di dolci"</string>
<string name="start_dreams" msgid="7219575858348719790">"Daydream"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
<string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Modalità aereo"</string>
@@ -184,7 +186,7 @@
<string name="quick_settings_rotation_unlocked_label" msgid="336054930362580584">"Rotazione autom."</string>
<string name="quick_settings_rotation_locked_label" msgid="8058646447242565486">"Rotazione bloccata"</string>
<string name="quick_settings_ime_label" msgid="7073463064369468429">"Metodo di immissione"</string>
- <string name="quick_settings_location_label" msgid="5011327048748762257">"Posizione"</string>
+ <string name="quick_settings_location_label" msgid="5011327048748762257">"Geolocalizzazione"</string>
<string name="quick_settings_location_off_label" msgid="7464544086507331459">"Posizione non attiva"</string>
<string name="quick_settings_media_device_label" msgid="1302906836372603762">"Dispositivo multimediale"</string>
<string name="quick_settings_rssi_label" msgid="7725671335550695589">"RSSI"</string>
@@ -200,8 +202,8 @@
<string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Visualizzazione wireless"</string>
<string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Luminosità"</string>
<string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTO"</string>
- <string name="status_bar_help_title" msgid="1199237744086469217">"Le notifiche vengono visualizzate qui"</string>
- <string name="status_bar_help_text" msgid="7874607155052076323">"Puoi accedervi in qualsiasi momento scorrendo verso il basso.\nFai scorrere di nuovo verso il basso per visualizzare i controlli del sistema."</string>
- <string name="hideybar_confirmation_message" msgid="9050869548951044371">"Fai scorrere il bordo dello schermo per visualizzare la barra"</string>
- <string name="hideybar_confirmation_message_long" msgid="7117692795163620626">"Fai scorrere il dito dal bordo dello schermo per visualizzare la barra di sistema"</string>
+ <string name="quick_settings_inversion_label" msgid="1666358784283020762">"Modalità inversione colori"</string>
+ <string name="quick_settings_contrast_label" msgid="3319507551689108692">"Modalità di contrasto avanzata"</string>
+ <string name="quick_settings_color_space_label" msgid="853443689745584770">"Modalità di correzione del colore"</string>
+ <string name="ssl_ca_cert_warning" msgid="9005954106902053641">"La rete potrebbe\nessere monitorata"</string>
</resources>
diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml
index b274dcc..0ed3f97 100644
--- a/packages/SystemUI/res/values-iw/strings.xml
+++ b/packages/SystemUI/res/values-iw/strings.xml
@@ -22,12 +22,12 @@
<string name="app_label" msgid="7164937344850004466">"ממשק משתמש של המערכת"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"× ×§×”"</string>
<string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"הסר מהרשימה"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"פרטי יישו×"</string>
- <string name="status_bar_no_recent_apps" msgid="6576392951053994640">"×ין ×™×™×©×•×ž×™× ×חרוני×"</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"סגור ×™×™×©×•×ž×™× ×חרוני×"</string>
+ <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"פרטי ×פליקציה"</string>
+ <string name="status_bar_no_recent_apps" msgid="6576392951053994640">"×ין ×פליקציות ×חרונות"</string>
+ <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"סגור ×פליקציות ×חרונות"</string>
<plurals name="status_bar_accessibility_recent_apps">
- <item quantity="one" msgid="5854176083865845541">"×™×™×©×•× ×חרון ×חד"</item>
- <item quantity="other" msgid="1040784359794890744">"%d ×”×™×™×©×•×ž×™× ×”×חרוני×"</item>
+ <item quantity="one" msgid="5854176083865845541">"×פליקציה ×חרונה ×חת"</item>
+ <item quantity="other" msgid="1040784359794890744">"â€%d ×”×פליקציות ×”×חרונות"</item>
</plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"×ין התר×ות"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"מתמשך"</string>
@@ -35,7 +35,7 @@
<string name="battery_low_title" msgid="2783104807551211639">"חבר מטען"</string>
<string name="battery_low_subtitle" msgid="1752040062087829196">"הסוללה נחלשת."</string>
<string name="battery_low_percent_format" msgid="1077244949318261761">"נותרו <xliff:g id="NUMBER">%d%%</xliff:g>"</string>
- <string name="invalid_charger" msgid="4549105996740522523">"טעינה ב×מצעות USB ××™× ×” נתמכת.\nהשתמש ×ך ורק במטען שסופק."</string>
+ <string name="invalid_charger" msgid="4549105996740522523">"â€×˜×¢×™× ×” ב×מצעות USB ××™× ×” נתמכת.\nהשתמש ×ך ורק במטען שסופק."</string>
<string name="battery_low_why" msgid="7279169609518386372">"צריכת סוללה"</string>
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"הגדרות"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
@@ -44,25 +44,23 @@
<string name="status_bar_settings_mute_label" msgid="554682549917429396">"השתק"</string>
<string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"×וטומטי"</string>
<string name="status_bar_settings_notifications" msgid="397146176280905137">"התר×ות"</string>
- <string name="bluetooth_tethered" msgid="7094101612161133267">"Bluetooth קשור"</string>
+ <string name="bluetooth_tethered" msgid="7094101612161133267">"â€Bluetooth קשור"</string>
<string name="status_bar_input_method_settings_configure_input_methods" msgid="3504292471512317827">"הגדר שיטות קלט"</string>
<string name="status_bar_use_physical_keyboard" msgid="7551903084416057810">"מקלדת פיזית"</string>
- <string name="usb_device_permission_prompt" msgid="834698001271562057">"ל×פשר ×œ×™×™×©×•× <xliff:g id="APPLICATION">%1$s</xliff:g> גישה להתקן ×”-USB?"</string>
- <string name="usb_accessory_permission_prompt" msgid="5171775411178865750">"ל×פשר ×œ×™×™×©×•× <xliff:g id="APPLICATION">%1$s</xliff:g> גישה ל×ביזר ×”-USB?"</string>
- <string name="usb_device_confirm_prompt" msgid="5161205258635253206">"×”×× ×œ×¤×ª×•×— ×ת <xliff:g id="ACTIVITY">%1$s</xliff:g> ×›×שר מכשיר USB ×–×” מחובר?"</string>
- <string name="usb_accessory_confirm_prompt" msgid="3808984931830229888">"×”×× ×œ×¤×ª×•×— ×ת <xliff:g id="ACTIVITY">%1$s</xliff:g> ×›×שר ×ביזר USB ×–×” מחובר?"</string>
- <string name="usb_accessory_uri_prompt" msgid="513450621413733343">"×ין ×™×™×©×•×ž×™× ×ž×•×ª×§× ×™× ×”×¤×•×¢×œ×™× ×¢× ×ביזר ×”-USB. למידע נוסף על ×ביזר ×–×” בקר בכתובת <xliff:g id="URL">%1$s</xliff:g>"</string>
- <string name="title_usb_accessory" msgid="4966265263465181372">"×ביזר USB"</string>
+ <string name="usb_device_permission_prompt" msgid="834698001271562057">"â€×œ×פשר ל×פליקציה <xliff:g id="APPLICATION">%1$s</xliff:g> גישה להתקן ×”-USB?"</string>
+ <string name="usb_accessory_permission_prompt" msgid="5171775411178865750">"â€×œ×פשר ל×פליקציה <xliff:g id="APPLICATION">%1$s</xliff:g> גישה ל×ביזר ×”-USB?"</string>
+ <string name="usb_device_confirm_prompt" msgid="5161205258635253206">"â€×”×× ×œ×¤×ª×•×— ×ת <xliff:g id="ACTIVITY">%1$s</xliff:g> ×›×שר מכשיר USB ×–×” מחובר?"</string>
+ <string name="usb_accessory_confirm_prompt" msgid="3808984931830229888">"â€×”×× ×œ×¤×ª×•×— ×ת <xliff:g id="ACTIVITY">%1$s</xliff:g> ×›×שר ×ביזר USB ×–×” מחובר?"</string>
+ <string name="usb_accessory_uri_prompt" msgid="513450621413733343">"â€×ין ×פליקציות מותקנות הפועלות ×¢× ×ביזר ×”-USB. למידע נוסף על ×ביזר ×–×” בקר בכתובת <xliff:g id="URL">%1$s</xliff:g>"</string>
+ <string name="title_usb_accessory" msgid="4966265263465181372">"â€×ביזר USB"</string>
<string name="label_view" msgid="6304565553218192990">"הצג"</string>
- <string name="always_use_device" msgid="1450287437017315906">"השתמש כברירת מחדל עבור מכשיר USB זה"</string>
- <string name="always_use_accessory" msgid="1210954576979621596">"השתמש כברירת מחדל עבור ×ביזר USB ×–×”"</string>
- <string name="usb_debugging_title" msgid="4513918393387141949">"×”×× ×œ×פשר ניקוי ב××’×™× ×‘-USB?"</string>
- <string name="usb_debugging_message" msgid="2220143855912376496">"טביעת ×”×צבע של מפתח ×”-RSA של המחשב ×”×™×:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
+ <string name="always_use_device" msgid="1450287437017315906">"â€×”שתמש כברירת מחדל עבור מכשיר USB ×–×”"</string>
+ <string name="always_use_accessory" msgid="1210954576979621596">"â€×”שתמש כברירת מחדל עבור ×ביזר USB ×–×”"</string>
+ <string name="usb_debugging_title" msgid="4513918393387141949">"â€×”×× ×œ×פשר ניקוי ב××’×™× ×‘-USB?"</string>
+ <string name="usb_debugging_message" msgid="2220143855912376496">"â€×˜×‘יעת ×”×צבע של מפתח ×”-RSA של המחשב ×”×™×:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"×פשר תמיד ממחשב ×–×”"</string>
<string name="compat_mode_on" msgid="6623839244840638213">"הגדל תצוגה כדי ×œ×ž×œ× ×ת המסך"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"מתח כדי ×œ×ž×œ× ×ת המסך"</string>
- <string name="compat_mode_help_header" msgid="7969493989397529910">"שינוי מרחק מתצוגה לצורך ת×ימות"</string>
- <string name="compat_mode_help_body" msgid="4946726776359270040">"×›×שר ×™×™×©×•× ×ž×™×•×¢×“ למסך קטן יותר, פקד של מרחק מתצוגה יופיע ליד השעון."</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"שומר ×¦×™×œ×•× ×ž×¡×š..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"שומר ×¦×™×œ×•× ×ž×¡×š..."</string>
<string name="screenshot_saving_text" msgid="2419718443411738818">"מתבצעת שמירה של ×¦×™×œ×•× ×”×ž×¡×š."</string>
@@ -70,19 +68,21 @@
<string name="screenshot_saved_text" msgid="1152839647677558815">"×’×¢ כדי להציג ×ת ×¦×™×œ×•× ×”×ž×¡×š שלך"</string>
<string name="screenshot_failed_title" msgid="705781116746922771">"×œ× × ×™×ª×Ÿ לבצע ×¦×™×œ×•× ×ž×¡×š."</string>
<string name="screenshot_failed_text" msgid="8134011269572415402">"×œ× × ×™×ª×Ÿ לשמור ×ת ×¦×™×œ×•× ×”×ž×¡×š. ייתכן שנעשה שימוש ב×מצעי ×חסון."</string>
- <string name="usb_preference_title" msgid="6551050377388882787">"×פשרויות העברת ×§×‘×¦×™× ×‘-USB"</string>
- <string name="use_mtp_button_title" msgid="4333504413563023626">"טען כנגן מדיה (MTP)"</string>
- <string name="use_ptp_button_title" msgid="7517127540301625751">"טען כמצלמה (PTP)"</string>
- <string name="installer_cd_button_title" msgid="2312667578562201583">"התקן ×ת ×™×™×©×•× ×”×¢×‘×¨×ª ×”×§×‘×¦×™× ×©×œ Android עבור Mac"</string>
+ <string name="usb_preference_title" msgid="6551050377388882787">"â€×פשרויות העברת ×§×‘×¦×™× ×‘-USB"</string>
+ <string name="use_mtp_button_title" msgid="4333504413563023626">"â€×˜×¢×Ÿ כנגן מדיה (MTP)"</string>
+ <string name="use_ptp_button_title" msgid="7517127540301625751">"â€×˜×¢×Ÿ כמצלמה (PTP)"</string>
+ <string name="installer_cd_button_title" msgid="2312667578562201583">"â€×”תקן ×ת ×פליקציית העברת ×”×§×‘×¦×™× ×©×œ Android עבור Mac"</string>
<string name="accessibility_back" msgid="567011538994429120">"הקוד×"</string>
<string name="accessibility_home" msgid="8217216074895377641">"בית"</string>
<string name="accessibility_menu" msgid="316839303324695949">"תפריט"</string>
- <string name="accessibility_recent" msgid="8571350598987952883">"×™×™×©×•×ž×™× ×חרוני×"</string>
+ <string name="accessibility_recent" msgid="8571350598987952883">"×פליקציות ×חרונות"</string>
+ <string name="accessibility_search_light" msgid="1103867596330271848">"חפש"</string>
+ <string name="accessibility_camera_button" msgid="8064671582820358152">"מצלמה"</string>
<string name="accessibility_ime_switch_button" msgid="5032926134740456424">"לחצן החלפת שיטת קלט."</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"לחצן מרחק מתצוגה של ת×ימות."</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"שנה מרחק מתצוגה של מסך קטן לגדול יותר."</string>
- <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth מחובר."</string>
- <string name="accessibility_bluetooth_disconnected" msgid="7416648669976870175">"Bluetooth מנותק."</string>
+ <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"â€Bluetooth מחובר."</string>
+ <string name="accessibility_bluetooth_disconnected" msgid="7416648669976870175">"â€Bluetooth מנותק."</string>
<string name="accessibility_no_battery" msgid="358343022352820946">"×ין סוללה."</string>
<string name="accessibility_battery_one_bar" msgid="7774887721891057523">"פס ×חד של סוללה."</string>
<string name="accessibility_battery_two_bars" msgid="8500650438735009973">"שני ×¤×¡×™× ×©×œ סוללה."</string>
@@ -98,17 +98,17 @@
<string name="accessibility_data_two_bars" msgid="6166018492360432091">"שני ×¤×¡×™× ×©×œ נתוני×."</string>
<string name="accessibility_data_three_bars" msgid="9167670452395038520">"שלושה ×¤×¡×™× ×©×œ נתוני×."</string>
<string name="accessibility_data_signal_full" msgid="2708384608124519369">"×ות ×”× ×ª×•× ×™× ×ž×œ×."</string>
- <string name="accessibility_wifi_off" msgid="3177380296697933627">"Wi-Fi כבוי."</string>
- <string name="accessibility_no_wifi" msgid="1425476551827924474">"Wi-Fi מנותק."</string>
- <string name="accessibility_wifi_one_bar" msgid="7735893178010724377">"פס ×חד של Wi-Fi."</string>
- <string name="accessibility_wifi_two_bars" msgid="4994274250497262434">"שני ×¤×¡×™× ×©×œ Wi-Fi."</string>
- <string name="accessibility_wifi_three_bars" msgid="3495755044276588384">"שלושה ×¤×¡×™× ×©×œ Wi-Fi."</string>
- <string name="accessibility_wifi_signal_full" msgid="6853561303586480376">"×ות ×”-Wi-Fi מל×."</string>
- <string name="accessibility_no_wimax" msgid="4329180129727630368">"×œ×œ× WiMAX."</string>
- <string name="accessibility_wimax_one_bar" msgid="4170994299011863648">"פס ×חד של WiMAX."</string>
- <string name="accessibility_wimax_two_bars" msgid="9176236858336502288">"שני ×¤×¡×™× ×©×œ WiMAX."</string>
- <string name="accessibility_wimax_three_bars" msgid="6116551636752103927">"שלושה ×¤×¡×™× ×©×œ WiMAX."</string>
- <string name="accessibility_wimax_signal_full" msgid="2768089986795579558">"×ות ×”-WiMAX מל×."</string>
+ <string name="accessibility_wifi_off" msgid="3177380296697933627">"â€Wi-Fi כבוי."</string>
+ <string name="accessibility_no_wifi" msgid="1425476551827924474">"â€Wi-Fi מנותק."</string>
+ <string name="accessibility_wifi_one_bar" msgid="7735893178010724377">"â€×¤×¡ ×חד של Wi-Fi."</string>
+ <string name="accessibility_wifi_two_bars" msgid="4994274250497262434">"â€×©× ×™ ×¤×¡×™× ×©×œ Wi-Fi."</string>
+ <string name="accessibility_wifi_three_bars" msgid="3495755044276588384">"â€×©×œ×•שה ×¤×¡×™× ×©×œ Wi-Fi."</string>
+ <string name="accessibility_wifi_signal_full" msgid="6853561303586480376">"â€×ות ×”-Wi-Fi מל×."</string>
+ <string name="accessibility_no_wimax" msgid="4329180129727630368">"â€×œ×œ× WiMAX."</string>
+ <string name="accessibility_wimax_one_bar" msgid="4170994299011863648">"â€×¤×¡ ×חד של WiMAX."</string>
+ <string name="accessibility_wimax_two_bars" msgid="9176236858336502288">"â€×©× ×™ ×¤×¡×™× ×©×œ WiMAX."</string>
+ <string name="accessibility_wimax_three_bars" msgid="6116551636752103927">"â€×©×œ×•שה ×¤×¡×™× ×©×œ WiMAX."</string>
+ <string name="accessibility_wimax_signal_full" msgid="2768089986795579558">"â€×ות ×”-WiMAX מל×."</string>
<string name="accessibility_no_signal" msgid="7064645320782585167">"×ין ×ות."</string>
<string name="accessibility_not_connected" msgid="6395326276213402883">"×œ× ×ž×—×•×‘×¨."</string>
<string name="accessibility_zero_bars" msgid="3806060224467027887">"×פס פסי×."</string>
@@ -130,54 +130,56 @@
<string name="accessibility_data_connection_roaming" msgid="5977362333466556094">"נדידה"</string>
<string name="accessibility_data_connection_edge" msgid="4477457051631979278">"קצה"</string>
<string name="accessibility_data_connection_wifi" msgid="2324496756590645221">"Wi-Fi"</string>
- <string name="accessibility_no_sim" msgid="8274017118472455155">"×ין כרטיס SIM."</string>
- <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"שיתוף ×ינטרנט בין × ×™×™×“×™× ×©×œ Bluetooth"</string>
+ <string name="accessibility_no_sim" msgid="8274017118472455155">"â€×ין כרטיס SIM."</string>
+ <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"â€×©×™×ª×•×£ ×ינטרנט בין × ×™×™×“×™× ×©×œ Bluetooth"</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"מצב טיסה"</string>
<string name="accessibility_battery_level" msgid="7451474187113371965">"<xliff:g id="NUMBER">%d</xliff:g> ××—×•×–×™× ×©×œ סוללה."</string>
<string name="accessibility_settings_button" msgid="799583911231893380">"הגדרות מערכת"</string>
<string name="accessibility_notifications_button" msgid="4498000369779421892">"התר×ות"</string>
<string name="accessibility_remove_notification" msgid="3603099514902182350">"× ×§×” התר××”"</string>
- <string name="accessibility_gps_enabled" msgid="3511469499240123019">"GPS מופעל."</string>
- <string name="accessibility_gps_acquiring" msgid="8959333351058967158">"השגת GPS."</string>
- <string name="accessibility_tty_enabled" msgid="4613200365379426561">"TeleTypewriter מופעל"</string>
+ <string name="accessibility_gps_enabled" msgid="3511469499240123019">"â€GPS מופעל."</string>
+ <string name="accessibility_gps_acquiring" msgid="8959333351058967158">"â€×”שגת GPS."</string>
+ <string name="accessibility_tty_enabled" msgid="4613200365379426561">"â€TeleTypewriter מופעל"</string>
<string name="accessibility_ringer_vibrate" msgid="666585363364155055">"צלצול ורטט."</string>
<string name="accessibility_ringer_silent" msgid="9061243307939135383">"צלצול שקט."</string>
<string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> נדחה."</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"הודעה נדחתה."</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"תריס התר×ות."</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"הגדרות מהירות."</string>
- <string name="accessibility_desc_recent_apps" msgid="9014032916410590027">"×™×™×©×•×ž×™× ×חרוני×"</string>
+ <string name="accessibility_desc_recent_apps" msgid="9014032916410590027">"×פליקציות ×חרונות"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"משתמש <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="6099781031669728709">"<xliff:g id="SIGNAL">%1$s</xliff:g>â€. <xliff:g id="NETWORK">%2$s</xliff:g>"</string>
<string name="accessibility_quick_settings_mobile" msgid="4876806564086241341">"נייד <xliff:g id="SIGNAL">%1$s</xliff:g>.†<xliff:g id="TYPE">%2$s</xliff:g>.†<xliff:g id="NETWORK">%3$s</xliff:g>.â€"</string>
<string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"סוללה <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_airplane" msgid="4196876722090224753">"מצב טיסה <xliff:g id="STATE">%s</xliff:g>."</string>
- <string name="accessibility_quick_settings_bluetooth" msgid="5749054971341882340">"Bluetooth â€<xliff:g id="STATE">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_bluetooth" msgid="5749054971341882340">"â€Bluetooth â€<xliff:g id="STATE">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_location" msgid="4577282329866813100">"×”×ž×™×§×•× <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"ההתר××” נקבעה ל-<xliff:g id="TIME">%s</xliff:g>."</string>
- <string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"נתוני 2G-3G מושבתי×"</string>
- <string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"נתוני 4G מושבתי×"</string>
+ <string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"â€× ×ª×•× ×™ 2G-3G מושבתי×"</string>
+ <string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"â€× ×ª×•× ×™ 4G מושבתי×"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="1046047248844821202">"× ×ª×•× ×™× ×œ× ×™×™×“ מושבתי×"</string>
<string name="data_usage_disabled_dialog_title" msgid="2086815304858964954">"×”× ×ª×•× ×™× ×ž×•×©×‘×ª×™×"</string>
<string name="data_usage_disabled_dialog" msgid="3853117269051806280">"הגעת לגבול המוגדר של שימוש בנתוני×.\n\n×× ×ª×¤×¢×™×œ מחדש נתוני×, ייתכן שתחויב על ידי הספק שלך."</string>
<string name="data_usage_disabled_dialog_enable" msgid="7729772039208664606">"הפעל מחדש ×ת הנתוני×"</string>
<string name="status_bar_settings_signal_meter_disconnected" msgid="1940231521274147771">"×ין חיבור ל×ינטרנט"</string>
- <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Wi-Fi מחובר"</string>
- <string name="gps_notification_searching_text" msgid="8574247005642736060">"מחפש GPS"</string>
- <string name="gps_notification_found_text" msgid="4619274244146446464">"×ž×™×§×•× ×ž×•×’×“×¨ על ידי GPS"</string>
+ <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"â€Wi-Fi מחובר"</string>
+ <string name="gps_notification_searching_text" msgid="8574247005642736060">"â€×ž×—פש GPS"</string>
+ <string name="gps_notification_found_text" msgid="4619274244146446464">"â€×ž×™×§×•× ×ž×•×’×“×¨ על ידי GPS"</string>
+ <string name="accessibility_location_active" msgid="2427290146138169014">"בקשות ×ž×™×§×•× ×¤×¢×™×œ×•×ª"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"× ×§×” ×ת כל ההתר×ות."</string>
- <string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"פרטי יישו×"</string>
+ <string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"פרטי ×פליקציה"</string>
<string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"המסך יסתובב ב×ופן ×וטומטי."</string>
<string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"המסך נעול כעת לרוחב."</string>
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"המסך נעול כעת ל×ורך."</string>
- <string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
+ <string name="dessert_case" msgid="1295161776223959221">"מזנון קינוחי×"</string>
<string name="start_dreams" msgid="7219575858348719790">"×—×œ×•× ×‘×”×§×™×¥"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
<string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"מצב טיסה"</string>
<string name="quick_settings_battery_charging_label" msgid="490074774465309209">"טוען (<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
<string name="quick_settings_battery_charged_label" msgid="8865413079414246081">"מל××”"</string>
<string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string>
- <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth â€(<xliff:g id="NUMBER">%d</xliff:g> מכשירי×)"</string>
- <string name="quick_settings_bluetooth_off_label" msgid="8159652146149219937">"Bluetooth מופסק"</string>
+ <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"â€Bluetooth â€(<xliff:g id="NUMBER">%d</xliff:g> מכשירי×)"</string>
+ <string name="quick_settings_bluetooth_off_label" msgid="8159652146149219937">"â€Bluetooth מופסק"</string>
<string name="quick_settings_brightness_label" msgid="6968372297018755815">"בהירות"</string>
<string name="quick_settings_rotation_unlocked_label" msgid="336054930362580584">"סיבוב ×וטומטי"</string>
<string name="quick_settings_rotation_locked_label" msgid="8058646447242565486">"סיבוב נעול"</string>
@@ -193,13 +195,13 @@
<string name="quick_settings_wifi_label" msgid="9135344704899546041">"Wi-Fi"</string>
<string name="quick_settings_wifi_not_connected" msgid="7171904845345573431">"×œ× ×ž×—×•×‘×¨"</string>
<string name="quick_settings_wifi_no_network" msgid="2221993077220856376">"×ין רשת"</string>
- <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi כבוי"</string>
- <string name="quick_settings_wifi_display_label" msgid="6893592964463624333">"תצוגת Wi-Fi"</string>
- <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"תצוגת Wi-Fi"</string>
+ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"â€Wi-Fi כבוי"</string>
+ <string name="quick_settings_wifi_display_label" msgid="6893592964463624333">"â€×ª×¦×•גת Wi-Fi"</string>
+ <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"â€×ª×¦×•גת Wi-Fi"</string>
<string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"בהירות"</string>
<string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"×וטומטי"</string>
- <string name="status_bar_help_title" msgid="1199237744086469217">"הודעות מופיעות ×›×ן"</string>
- <string name="status_bar_help_text" msgid="7874607155052076323">"גש ××œ×™×”× ×‘×›×œ עת על ידי החלקה למטה.\nהחלק למטה שוב למעבר למרכז הבקרה של המערכת."</string>
- <string name="hideybar_confirmation_message" msgid="9050869548951044371">"החלק מקצה המסך כדי להציג ×ת הסרגל"</string>
- <string name="hideybar_confirmation_message_long" msgid="7117692795163620626">"החלק מקצה המסך כדי להציג ×ת סרגל המערכת"</string>
+ <string name="quick_settings_inversion_label" msgid="1666358784283020762">"מצב היפוך צבעי×"</string>
+ <string name="quick_settings_contrast_label" msgid="3319507551689108692">"מצב ניגודיות מוגברת"</string>
+ <string name="quick_settings_color_space_label" msgid="853443689745584770">"מצב תיקון צבע"</string>
+ <string name="ssl_ca_cert_warning" msgid="9005954106902053641">"ייתכן שהרשת\nמנוטרת"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml
index 7392ae9..0e0f027 100644
--- a/packages/SystemUI/res/values-ja/strings.xml
+++ b/packages/SystemUI/res/values-ja/strings.xml
@@ -61,8 +61,6 @@
<string name="usb_debugging_always" msgid="303335496705863070">"ã“ã®ãƒ‘ソコンã‹ã‚‰ã®USBデãƒãƒƒã‚°ã‚’常ã«è¨±å¯ã™ã‚‹"</string>
<string name="compat_mode_on" msgid="6623839244840638213">"ç”»é¢ã‚µã‚¤ã‚ºã«åˆã‚ã›ã¦æ‹¡å¤§"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"ç”»é¢ã‚µã‚¤ã‚ºã«åˆã‚ã›ã¦æ‹¡å¤§"</string>
- <string name="compat_mode_help_header" msgid="7969493989397529910">"互æ›ã‚ºãƒ¼ãƒ "</string>
- <string name="compat_mode_help_body" msgid="4946726776359270040">"よりå°åž‹ã®ç”»é¢å‘ã‘ã®ã‚¢ãƒ—リã®å ´åˆã¯ã€ã‚ºãƒ¼ãƒ ã‚³ãƒ³ãƒˆãƒ­ãƒ¼ãƒ«ãŒæ™‚計ã®ãã°ã«è¡¨ç¤ºã•れã¾ã™ã€‚"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"スクリーンショットをä¿å­˜ä¸­..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"スクリーンショットをä¿å­˜ã—ã¦ã„ã¾ã™..."</string>
<string name="screenshot_saving_text" msgid="2419718443411738818">"スクリーンショットをä¿å­˜ã—ã¦ã„ã¾ã™ã€‚"</string>
@@ -78,6 +76,8 @@
<string name="accessibility_home" msgid="8217216074895377641">"ホーム"</string>
<string name="accessibility_menu" msgid="316839303324695949">"メニュー"</string>
<string name="accessibility_recent" msgid="8571350598987952883">"最近使ã£ãŸã‚¢ãƒ—リ"</string>
+ <string name="accessibility_search_light" msgid="1103867596330271848">"検索"</string>
+ <string name="accessibility_camera_button" msgid="8064671582820358152">"カメラ"</string>
<string name="accessibility_ime_switch_button" msgid="5032926134740456424">"入力方法ã®åˆ‡ã‚Šæ›¿ãˆãƒœã‚¿ãƒ³ã€‚"</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"互æ›ã‚ºãƒ¼ãƒ ãƒœã‚¿ãƒ³ã€‚"</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"å°ã•ã„ç”»é¢ã‹ã‚‰å¤§ãã„ç”»é¢ã«æ‹¡å¤§ã€‚"</string>
@@ -155,6 +155,7 @@
<string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"電池<xliff:g id="STATE">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_airplane" msgid="4196876722090224753">"機内モード<xliff:g id="STATE">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_bluetooth" msgid="5749054971341882340">"Bluetooth <xliff:g id="STATE">%s</xliff:g>"</string>
+ <string name="accessibility_quick_settings_location" msgid="4577282329866813100">"ç¾åœ¨åœ°: <xliff:g id="STATE">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"アラームã¯<xliff:g id="TIME">%s</xliff:g>ã«è¨­å®šã•れã¦ã„ã¾ã™ã€‚"</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"2G~3GデータãŒç„¡åйã«ãªã‚Šã¾ã—ãŸ"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"4GデータãŒç„¡åйã«ãªã‚Šã¾ã—ãŸ"</string>
@@ -166,12 +167,13 @@
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Wi-Fi接続済ã¿"</string>
<string name="gps_notification_searching_text" msgid="8574247005642736060">"GPSã§æ¤œç´¢ä¸­"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"GPSã«ã‚ˆã‚Šç¾åœ¨åœ°ãŒè¨­å®šã•れã¾ã—ãŸ"</string>
+ <string name="accessibility_location_active" msgid="2427290146138169014">"ç¾åœ¨åœ°ãƒªã‚¯ã‚¨ã‚¹ãƒˆãŒã‚¢ã‚¯ãƒ†ã‚£ãƒ–"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"通知をã™ã¹ã¦æ¶ˆåŽ»ã€‚"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"アプリ情報"</string>
<string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"ç”»é¢ã¯è‡ªå‹•çš„ã«å›žè»¢ã—ã¾ã™ã€‚"</string>
<string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"ç”»é¢ã¯æ¨ªå‘ãã«ãƒ­ãƒƒã‚¯ã•れã¦ã„ã¾ã™ã€‚"</string>
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"ç”»é¢ã¯ç¸¦å‘ãã«ãƒ­ãƒƒã‚¯ã•れã¦ã„ã¾ã™ã€‚"</string>
- <string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
+ <string name="dessert_case" msgid="1295161776223959221">"デザートケース"</string>
<string name="start_dreams" msgid="7219575858348719790">"スクリーンセーãƒãƒ¼"</string>
<string name="ethernet_label" msgid="7967563676324087464">"イーサãƒãƒƒãƒˆ"</string>
<string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"機内モード"</string>
@@ -200,8 +202,8 @@
<string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"ワイヤレスディスプレイ"</string>
<string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"ç”»é¢ã®æ˜Žã‚‹ã•"</string>
<string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"自動"</string>
- <string name="status_bar_help_title" msgid="1199237744086469217">"ã“ã“ã«é€šçŸ¥ãŒè¡¨ç¤ºã•れã¾ã™"</string>
- <string name="status_bar_help_text" msgid="7874607155052076323">"下ã«ã‚¹ãƒ¯ã‚¤ãƒ—ã™ã‚‹ã¨ã€ã„ã¤ã§ã‚‚通知を表示ã§ãã¾ã™ã€‚\nシステムを管ç†ã™ã‚‹ã«ã¯ã‚‚ã†ä¸€åº¦ä¸‹ã«ã‚¹ãƒ¯ã‚¤ãƒ—ã—ã¦ãã ã•ã„。"</string>
- <string name="hideybar_confirmation_message" msgid="9050869548951044371">"ãƒãƒ¼ã‚’表示ã™ã‚‹ã«ã¯ã€ç”»é¢ã®ç«¯ã‹ã‚‰ã‚¹ãƒ¯ã‚¤ãƒ—ã—ã¾ã™"</string>
- <string name="hideybar_confirmation_message_long" msgid="7117692795163620626">"システムãƒãƒ¼ã‚’表示ã™ã‚‹ã«ã¯ã€ç”»é¢ã®ç«¯ã‹ã‚‰ã‚¹ãƒ¯ã‚¤ãƒ—ã—ã¾ã™"</string>
+ <string name="quick_settings_inversion_label" msgid="1666358784283020762">"色å転モード"</string>
+ <string name="quick_settings_contrast_label" msgid="3319507551689108692">"拡張コントラストモード"</string>
+ <string name="quick_settings_color_space_label" msgid="853443689745584770">"色補正モード"</string>
+ <string name="ssl_ca_cert_warning" msgid="9005954106902053641">"ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ãŒç›£è¦–ã•れる\nå ´åˆãŒã‚りã¾ã™"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ka-land/strings.xml b/packages/SystemUI/res/values-ka-land/strings.xml
new file mode 100644
index 0000000..3f20938
--- /dev/null
+++ b/packages/SystemUI/res/values-ka-land/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2010, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="toast_rotation_locked" msgid="7609673011431556092">"ეკრáƒáƒœáƒ˜ áƒáƒ›áƒŸáƒáƒ›áƒáƒ“ დáƒáƒ‘ლáƒáƒ™áƒ˜áƒšáƒ˜áƒ თáƒáƒ áƒáƒ–ულ áƒáƒ áƒ˜áƒ”ნტáƒáƒªáƒ˜áƒáƒ¨áƒ˜"</string>
+</resources>
diff --git a/packages/SystemUI/res/values-ka-rGE-land/strings.xml b/packages/SystemUI/res/values-ka-rGE-land/strings.xml
new file mode 100644
index 0000000..3f20938
--- /dev/null
+++ b/packages/SystemUI/res/values-ka-rGE-land/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2010, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="toast_rotation_locked" msgid="7609673011431556092">"ეკრáƒáƒœáƒ˜ áƒáƒ›áƒŸáƒáƒ›áƒáƒ“ დáƒáƒ‘ლáƒáƒ™áƒ˜áƒšáƒ˜áƒ თáƒáƒ áƒáƒ–ულ áƒáƒ áƒ˜áƒ”ნტáƒáƒªáƒ˜áƒáƒ¨áƒ˜"</string>
+</resources>
diff --git a/packages/SystemUI/res/values-ka-rGE/strings.xml b/packages/SystemUI/res/values-ka-rGE/strings.xml
new file mode 100644
index 0000000..5d751fc
--- /dev/null
+++ b/packages/SystemUI/res/values-ka-rGE/strings.xml
@@ -0,0 +1,207 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="7164937344850004466">"სისტემის UI"</string>
+ <string name="status_bar_clear_all_button" msgid="7774721344716731603">"გáƒáƒ¡áƒ£áƒ¤áƒ—áƒáƒ•ებáƒ"</string>
+ <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"სიიდáƒáƒœ áƒáƒ›áƒáƒ¨áƒšáƒ"</string>
+ <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"áƒáƒžáƒ˜áƒ¡ შესáƒáƒ®áƒ”ბ"</string>
+ <string name="status_bar_no_recent_apps" msgid="6576392951053994640">"ბáƒáƒšáƒáƒ¡ გáƒáƒ›áƒáƒ§áƒ”ნებული áƒáƒžáƒ”ბის სირცáƒáƒ áƒ˜áƒ”ლიáƒ"</string>
+ <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"ბáƒáƒšáƒ áƒáƒžáƒ”ბის გáƒáƒ£áƒ¥áƒ›áƒ”ბáƒ"</string>
+ <plurals name="status_bar_accessibility_recent_apps">
+ <item quantity="one" msgid="5854176083865845541">"1 ბáƒáƒšáƒ áƒáƒžáƒ˜"</item>
+ <item quantity="other" msgid="1040784359794890744">"%d ბáƒáƒšáƒ áƒáƒžáƒ˜"</item>
+ </plurals>
+ <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"შეტყáƒáƒ‘ინებები áƒáƒ  áƒáƒ áƒ˜áƒ¡."</string>
+ <string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"მიმდინáƒáƒ áƒ”"</string>
+ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"შეტყáƒáƒ‘ინებები"</string>
+ <string name="battery_low_title" msgid="2783104807551211639">"შეáƒáƒ”რთეთ დáƒáƒ›áƒ¢áƒ”ნი."</string>
+ <string name="battery_low_subtitle" msgid="1752040062087829196">"ბáƒáƒ¢áƒáƒ áƒ”რჯდებáƒ."</string>
+ <string name="battery_low_percent_format" msgid="1077244949318261761">"დáƒáƒ áƒ©áƒ”ნილირ<xliff:g id="NUMBER">%d%%</xliff:g>"</string>
+ <string name="invalid_charger" msgid="4549105996740522523">"USB-ით დáƒáƒ¢áƒ”ნვრáƒáƒ  áƒáƒ áƒ˜áƒ¡ მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი.\nგáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ მხáƒáƒšáƒáƒ“ ელექტრáƒ-დáƒáƒ›áƒ¢áƒ”ნი."</string>
+ <string name="battery_low_why" msgid="7279169609518386372">"ელემენტის გáƒáƒ›áƒáƒ§áƒ”ნებáƒ"</string>
+ <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"პáƒáƒ áƒáƒ›áƒ”ტრები"</string>
+ <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
+ <string name="status_bar_settings_airplane" msgid="4879879698500955300">"თვითმფრინáƒáƒ•ის რეჟიმი"</string>
+ <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"áƒáƒ•ტáƒáƒ áƒáƒ¢áƒáƒªáƒ˜áƒ˜áƒ¡ ეკრáƒáƒœáƒ˜"</string>
+ <string name="status_bar_settings_mute_label" msgid="554682549917429396">"დáƒáƒ“უმებáƒ"</string>
+ <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"áƒáƒ•ტáƒ."</string>
+ <string name="status_bar_settings_notifications" msgid="397146176280905137">"შეტყáƒáƒ‘ინებები"</string>
+ <string name="bluetooth_tethered" msgid="7094101612161133267">"Bluetooth მიერთებულიáƒ."</string>
+ <string name="status_bar_input_method_settings_configure_input_methods" msgid="3504292471512317827">"შეყვáƒáƒœáƒ˜áƒ¡ მეთáƒáƒ“ების დáƒáƒ§áƒ”ნებáƒ"</string>
+ <string name="status_bar_use_physical_keyboard" msgid="7551903084416057810">"ფიზიკური კლáƒáƒ•იáƒáƒ¢áƒ£áƒ áƒ"</string>
+ <string name="usb_device_permission_prompt" msgid="834698001271562057">"გსურთ, მისცეთ áƒáƒžáƒšáƒ˜áƒ™áƒáƒªáƒ˜áƒáƒ¡ „<xliff:g id="APPLICATION">%1$s</xliff:g>“ USB მეხსიერებáƒáƒ¡áƒ—áƒáƒœ წვდáƒáƒ›áƒ˜áƒ¡ უფლებáƒ?"</string>
+ <string name="usb_accessory_permission_prompt" msgid="5171775411178865750">"გსურთ, მისცეთ áƒáƒžáƒšáƒ˜áƒ™áƒáƒªáƒ˜áƒáƒ¡ „<xliff:g id="APPLICATION">%1$s</xliff:g>“ USB áƒáƒ¥áƒ¡áƒ”სუáƒáƒ áƒ—áƒáƒœ წვდáƒáƒ›áƒ˜áƒ¡ უფლებáƒ?"</string>
+ <string name="usb_device_confirm_prompt" msgid="5161205258635253206">"გსურთ <xliff:g id="ACTIVITY">%1$s</xliff:g> , რáƒáƒ“ესáƒáƒª ეს USB მáƒáƒ¬áƒ§áƒáƒ‘ილáƒáƒ‘რშეერთებულიáƒ?"</string>
+ <string name="usb_accessory_confirm_prompt" msgid="3808984931830229888">"გსურთ <xliff:g id="ACTIVITY">%1$s</xliff:g> , რáƒáƒ“ესáƒáƒª ეს USB მáƒáƒ¬áƒ§áƒáƒ‘ილáƒáƒ‘რშეერთებულიáƒ?"</string>
+ <string name="usb_accessory_uri_prompt" msgid="513450621413733343">"áƒáƒ áƒªáƒ”რთი დáƒáƒ§áƒ”ნებული áƒáƒžáƒ˜ áƒáƒ  მუშáƒáƒáƒ‘ს áƒáƒ› USB áƒáƒ¥áƒ¡áƒ”სუáƒáƒ áƒ—áƒáƒœ. შეიტყვეთ მეტი áƒáƒ› áƒáƒ¥áƒ¡áƒ”სუáƒáƒ áƒ˜áƒ¡ შესáƒáƒ®áƒ”ბ <xliff:g id="URL">%1$s</xliff:g>"</string>
+ <string name="title_usb_accessory" msgid="4966265263465181372">"USB áƒáƒ¥áƒ¡áƒ”სუáƒáƒ áƒ˜"</string>
+ <string name="label_view" msgid="6304565553218192990">"ნáƒáƒ®áƒ•áƒ"</string>
+ <string name="always_use_device" msgid="1450287437017315906">"áƒáƒ› USB მáƒáƒ¬áƒ§áƒáƒ‘ილáƒáƒ‘ის ნáƒáƒ’ულისხმევáƒáƒ“ გáƒáƒ›áƒáƒ§áƒ”ნებáƒ"</string>
+ <string name="always_use_accessory" msgid="1210954576979621596">"áƒáƒ•ტáƒáƒ›áƒáƒ¢áƒ£áƒ áƒáƒ“ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნე áƒáƒ› USB áƒáƒ¥áƒ¡áƒ”სუáƒáƒ áƒ˜áƒ¡áƒ—ვის."</string>
+ <string name="usb_debugging_title" msgid="4513918393387141949">"გáƒáƒáƒ¥áƒ¢áƒ˜áƒ£áƒ áƒ“ეს USB გáƒáƒ›áƒáƒ áƒ—ვáƒ?"</string>
+ <string name="usb_debugging_message" msgid="2220143855912376496">"კáƒáƒ›áƒžáƒ˜áƒ£áƒ¢áƒ”რის RSA გáƒáƒ¡áƒáƒ¦áƒ”ბის თითის áƒáƒœáƒáƒ‘ეჭდიáƒ:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
+ <string name="usb_debugging_always" msgid="303335496705863070">"ყáƒáƒ•ელთვის დáƒáƒ áƒ—ე ნებრáƒáƒ› კáƒáƒ›áƒžáƒ˜áƒ£áƒ¢áƒ”რიდáƒáƒœ."</string>
+ <string name="compat_mode_on" msgid="6623839244840638213">"მáƒáƒ¡áƒ¨áƒ¢áƒáƒ‘ი შეცვáƒáƒšáƒ”თ ეკრáƒáƒœáƒ˜áƒ¡ შესáƒáƒ•სებáƒáƒ“."</string>
+ <string name="compat_mode_off" msgid="4434467572461327898">"გáƒáƒ¬áƒ˜áƒ”თ ეკრáƒáƒœáƒ˜áƒ¡ შესáƒáƒ•სებáƒáƒ“."</string>
+ <string name="screenshot_saving_ticker" msgid="7403652894056693515">"სკრინშáƒáƒ¢áƒ˜áƒ¡ შენáƒáƒ®áƒ•áƒâ€¦"</string>
+ <string name="screenshot_saving_title" msgid="8242282144535555697">"ეკრáƒáƒœáƒ˜áƒ¡ სურáƒáƒ—ის შენáƒáƒ®áƒ•áƒâ€¦"</string>
+ <string name="screenshot_saving_text" msgid="2419718443411738818">"ეკრáƒáƒœáƒ˜áƒ¡ სურáƒáƒ—ი შენáƒáƒ®áƒ£áƒšáƒ˜áƒ."</string>
+ <string name="screenshot_saved_title" msgid="6461865960961414961">"სკრინშáƒáƒ¢áƒ˜ გáƒáƒ“áƒáƒ¦áƒ”ბულიáƒ."</string>
+ <string name="screenshot_saved_text" msgid="1152839647677558815">"შეეხეთ ეკრáƒáƒœáƒ˜áƒ¡ სურáƒáƒ—ის სáƒáƒœáƒáƒ®áƒáƒ•áƒáƒ“."</string>
+ <string name="screenshot_failed_title" msgid="705781116746922771">"ვერ მáƒáƒ®áƒ”რხდრეკრáƒáƒœáƒ˜áƒ¡ áƒáƒœáƒáƒ‘ეჭდის გáƒáƒ“áƒáƒ¦áƒ”ბáƒ."</string>
+ <string name="screenshot_failed_text" msgid="8134011269572415402">"ეკრáƒáƒœáƒ˜áƒ¡ სურáƒáƒ—ი ვერ შეინáƒáƒ®áƒ. შესáƒáƒ«áƒšáƒáƒ, მეხსიერებრუკვე დáƒáƒ™áƒáƒ•ებულიáƒ."</string>
+ <string name="usb_preference_title" msgid="6551050377388882787">"USB ფáƒáƒ˜áƒšáƒ˜áƒ¡ ტრáƒáƒœáƒ¡áƒ¤áƒ”რის პáƒáƒ áƒáƒ›áƒ”ტრები"</string>
+ <string name="use_mtp_button_title" msgid="4333504413563023626">"მედიáƒ-სáƒáƒ™áƒ áƒáƒ•áƒáƒ“ (MTP) ჩáƒáƒ áƒ—ვáƒ"</string>
+ <string name="use_ptp_button_title" msgid="7517127540301625751">"მიუერთეთ რáƒáƒ’áƒáƒ áƒª კáƒáƒ›áƒ”რრ(PTP)"</string>
+ <string name="installer_cd_button_title" msgid="2312667578562201583">"Android File Transfer áƒáƒžáƒ˜áƒ¡ დáƒáƒ§áƒ”ნებრMac-თვის"</string>
+ <string name="accessibility_back" msgid="567011538994429120">"უკáƒáƒœ"</string>
+ <string name="accessibility_home" msgid="8217216074895377641">"სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜"</string>
+ <string name="accessibility_menu" msgid="316839303324695949">"მენიუ"</string>
+ <string name="accessibility_recent" msgid="8571350598987952883">"ბáƒáƒšáƒáƒ¡ გáƒáƒ›áƒáƒ§áƒ”ნებული áƒáƒžáƒ”ბი"</string>
+ <string name="accessibility_search_light" msgid="1103867596330271848">"ძიებáƒ"</string>
+ <string name="accessibility_camera_button" msgid="8064671582820358152">"კáƒáƒ›áƒ”რáƒ"</string>
+ <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"შეყვáƒáƒœáƒ˜áƒ¡ მეთáƒáƒ“ის გáƒáƒ“áƒáƒ áƒ—ვის ღილáƒáƒ™áƒ˜."</string>
+ <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"თáƒáƒ•სებáƒáƒ“ი მáƒáƒ¡áƒ¨áƒ¢áƒáƒ‘ირების ღილáƒáƒ™áƒ˜."</string>
+ <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"შეცვáƒáƒšáƒ”თ პáƒáƒ¢áƒáƒ áƒ ეკრáƒáƒœáƒ˜ უფრრდიდით."</string>
+ <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth დáƒáƒ™áƒáƒ•შირებულიáƒ."</string>
+ <string name="accessibility_bluetooth_disconnected" msgid="7416648669976870175">"Bluetooth კáƒáƒ•შირი გáƒáƒ¬áƒ§áƒ•ეტილიáƒ."</string>
+ <string name="accessibility_no_battery" msgid="358343022352820946">"ბáƒáƒ¢áƒáƒ áƒ”რდáƒáƒ›áƒ¯áƒ“áƒáƒ áƒ˜áƒ."</string>
+ <string name="accessibility_battery_one_bar" msgid="7774887721891057523">"ბáƒáƒ¢áƒáƒ áƒ”ირერთ ზáƒáƒšáƒ–ეáƒ."</string>
+ <string name="accessibility_battery_two_bars" msgid="8500650438735009973">"ელემენტი áƒáƒ  ზáƒáƒšáƒ–ე."</string>
+ <string name="accessibility_battery_three_bars" msgid="2302983330865040446">"ელემენტი სáƒáƒ› ზáƒáƒšáƒ–ე."</string>
+ <string name="accessibility_battery_full" msgid="8909122401720158582">"ელემენტი სáƒáƒ•სეáƒ."</string>
+ <string name="accessibility_no_phone" msgid="4894708937052611281">"ტელეფáƒáƒœáƒ˜ áƒáƒ  áƒáƒ áƒ˜áƒ¡."</string>
+ <string name="accessibility_phone_one_bar" msgid="687699278132664115">"ტელეფáƒáƒœáƒ˜áƒ¡ სიგნáƒáƒšáƒ˜ ერთ ზáƒáƒšáƒ–ეáƒ."</string>
+ <string name="accessibility_phone_two_bars" msgid="8384905382804815201">"ტელეფáƒáƒœáƒ˜áƒ¡ სიგნáƒáƒšáƒ˜ áƒáƒ  ზáƒáƒšáƒ–ეáƒ."</string>
+ <string name="accessibility_phone_three_bars" msgid="8521904843919971885">"ტელეფáƒáƒœáƒ˜áƒ¡ სიგნáƒáƒšáƒ˜ სáƒáƒ› ზáƒáƒšáƒ–ეáƒ."</string>
+ <string name="accessibility_phone_signal_full" msgid="6471834868580757898">"ტელეფáƒáƒœáƒ˜áƒ¡ სიგნáƒáƒšáƒ˜ სრულიáƒ."</string>
+ <string name="accessibility_no_data" msgid="4791966295096867555">"მáƒáƒœáƒáƒªáƒ”მები áƒáƒ  áƒáƒ áƒ˜áƒ¡."</string>
+ <string name="accessibility_data_one_bar" msgid="1415625833238273628">"თáƒáƒ áƒ˜áƒ¦áƒ˜ ზáƒáƒšáƒ–ე."</string>
+ <string name="accessibility_data_two_bars" msgid="6166018492360432091">"მáƒáƒœáƒáƒªáƒ”მების გáƒáƒ“áƒáƒªáƒ”მáƒ: áƒáƒ áƒ˜ ზáƒáƒšáƒ˜"</string>
+ <string name="accessibility_data_three_bars" msgid="9167670452395038520">"მáƒáƒœáƒáƒªáƒ”მების გáƒáƒ“áƒáƒªáƒ”მáƒ: სáƒáƒ›áƒ˜ ზáƒáƒšáƒ˜"</string>
+ <string name="accessibility_data_signal_full" msgid="2708384608124519369">"მáƒáƒœáƒáƒªáƒ”მთრგáƒáƒ“áƒáƒªáƒ”მის სáƒáƒ˜áƒ›áƒ”დრსიგნáƒáƒšáƒ˜."</string>
+ <string name="accessibility_wifi_off" msgid="3177380296697933627">"Wifi გáƒáƒ›áƒáƒ áƒ—ულიáƒ."</string>
+ <string name="accessibility_no_wifi" msgid="1425476551827924474">"Wifi áƒáƒ  áƒáƒ áƒ˜áƒ¡ დáƒáƒ™áƒáƒ•შირებული."</string>
+ <string name="accessibility_wifi_one_bar" msgid="7735893178010724377">"Wifi სიგნáƒáƒšáƒ˜ ერთ ზáƒáƒšáƒ–ეáƒ."</string>
+ <string name="accessibility_wifi_two_bars" msgid="4994274250497262434">"Wifi სიგნáƒáƒšáƒ˜ áƒáƒ  ზáƒáƒšáƒ–ეáƒ."</string>
+ <string name="accessibility_wifi_three_bars" msgid="3495755044276588384">"Wifi სáƒáƒ›áƒ˜ ზáƒáƒšáƒ˜."</string>
+ <string name="accessibility_wifi_signal_full" msgid="6853561303586480376">"Wifi სიგნáƒáƒšáƒ˜ სრულიáƒ."</string>
+ <string name="accessibility_no_wimax" msgid="4329180129727630368">"WiMAX áƒáƒ  áƒáƒ áƒ˜áƒ¡."</string>
+ <string name="accessibility_wimax_one_bar" msgid="4170994299011863648">"WiMAX ერთი სვეტი."</string>
+ <string name="accessibility_wimax_two_bars" msgid="9176236858336502288">"WiMAX-ის áƒáƒ áƒ˜ ზáƒáƒšáƒ˜."</string>
+ <string name="accessibility_wimax_three_bars" msgid="6116551636752103927">"WiMAX-ის სáƒáƒ›áƒ˜ ზáƒáƒšáƒ˜."</string>
+ <string name="accessibility_wimax_signal_full" msgid="2768089986795579558">"WiMAX სიგნáƒáƒšáƒ˜ სრულიáƒ."</string>
+ <string name="accessibility_no_signal" msgid="7064645320782585167">"სიგნáƒáƒšáƒ˜ áƒáƒ  áƒáƒ áƒ˜áƒ¡."</string>
+ <string name="accessibility_not_connected" msgid="6395326276213402883">"áƒáƒ  áƒáƒ áƒ˜áƒ¡ დáƒáƒ™áƒáƒ•შირებული."</string>
+ <string name="accessibility_zero_bars" msgid="3806060224467027887">"სიგნáƒáƒšáƒ˜ ნულ ზáƒáƒšáƒ–ეáƒ."</string>
+ <string name="accessibility_one_bar" msgid="1685730113192081895">"ერთი ზáƒáƒšáƒ˜."</string>
+ <string name="accessibility_two_bars" msgid="6437363648385206679">"áƒáƒ áƒ˜ სვეტი."</string>
+ <string name="accessibility_three_bars" msgid="2648241415119396648">"სáƒáƒ›áƒ˜ ზáƒáƒšáƒ˜."</string>
+ <string name="accessibility_signal_full" msgid="9122922886519676839">"სრული სიგნáƒáƒšáƒ˜."</string>
+ <string name="accessibility_desc_on" msgid="2385254693624345265">"ჩáƒáƒ áƒ—ული"</string>
+ <string name="accessibility_desc_off" msgid="6475508157786853157">"გáƒáƒ›áƒáƒ áƒ—ულიáƒ."</string>
+ <string name="accessibility_desc_connected" msgid="8366256693719499665">"დáƒáƒ™áƒáƒ•შირებულიáƒ."</string>
+ <string name="accessibility_data_connection_gprs" msgid="1606477224486747751">"GPRS"</string>
+ <string name="accessibility_data_connection_1x" msgid="994133468120244018">"1 X"</string>
+ <string name="accessibility_data_connection_hspa" msgid="2032328855462645198">"HSPA"</string>
+ <string name="accessibility_data_connection_3g" msgid="8628562305003568260">"3G"</string>
+ <string name="accessibility_data_connection_3.5g" msgid="8664845609981692001">"3.5გბ"</string>
+ <string name="accessibility_data_connection_4g" msgid="7741000750630089612">"4G"</string>
+ <string name="accessibility_data_connection_lte" msgid="5413468808637540658">"LTE"</string>
+ <string name="accessibility_data_connection_cdma" msgid="6132648193978823023">"CDMA"</string>
+ <string name="accessibility_data_connection_roaming" msgid="5977362333466556094">"რáƒáƒ£áƒ›áƒ˜áƒœáƒ’ი"</string>
+ <string name="accessibility_data_connection_edge" msgid="4477457051631979278">"Edge"</string>
+ <string name="accessibility_data_connection_wifi" msgid="2324496756590645221">"Wi-Fi"</string>
+ <string name="accessibility_no_sim" msgid="8274017118472455155">"SIM áƒáƒ  áƒáƒ áƒ˜áƒ¡."</string>
+ <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Bluetooth-ის ჩáƒáƒ áƒ—ვáƒ"</string>
+ <string name="accessibility_airplane_mode" msgid="834748999790763092">"თვითმფრინáƒáƒ•ის რეჟიმი"</string>
+ <string name="accessibility_battery_level" msgid="7451474187113371965">"ბáƒáƒ¢áƒáƒ áƒ”áƒ: <xliff:g id="NUMBER">%d</xliff:g> პრáƒáƒªáƒ”ნტი."</string>
+ <string name="accessibility_settings_button" msgid="799583911231893380">"სისტემის პáƒáƒ áƒáƒ›áƒ”ტრები."</string>
+ <string name="accessibility_notifications_button" msgid="4498000369779421892">"შეტყáƒáƒ‘ინებები"</string>
+ <string name="accessibility_remove_notification" msgid="3603099514902182350">"შეტყáƒáƒ‘ინებების გáƒáƒ¡áƒ£áƒ¤áƒ—áƒáƒ•ებáƒ."</string>
+ <string name="accessibility_gps_enabled" msgid="3511469499240123019">"GPS გáƒáƒáƒ¥áƒ¢áƒ˜áƒ£áƒ áƒ“áƒ."</string>
+ <string name="accessibility_gps_acquiring" msgid="8959333351058967158">"GPS-ის დáƒáƒ“გენáƒ."</string>
+ <string name="accessibility_tty_enabled" msgid="4613200365379426561">"ტელეტáƒáƒ˜áƒžáƒ˜ ჩáƒáƒ áƒ—ულიáƒ."</string>
+ <string name="accessibility_ringer_vibrate" msgid="666585363364155055">"ვიბრáƒáƒªáƒ˜áƒ˜áƒ¡ რეჟიმი."</string>
+ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"უხმრრეჟიმი."</string>
+ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> áƒáƒ›áƒáƒ¨áƒšáƒ˜áƒšáƒ˜áƒ სიიდáƒáƒœ."</string>
+ <string name="accessibility_notification_dismissed" msgid="854211387186306927">"შეტყáƒáƒ‘ინებრწáƒáƒ˜áƒ¨áƒáƒšáƒ."</string>
+ <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"შეტყáƒáƒ‘ინებების ფáƒáƒ áƒ“áƒ"</string>
+ <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"სწრáƒáƒ¤áƒ˜ პáƒáƒ áƒáƒ›áƒ”ტრები"</string>
+ <string name="accessibility_desc_recent_apps" msgid="9014032916410590027">"ბáƒáƒšáƒ áƒáƒžáƒ”ბი."</string>
+ <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი: <xliff:g id="USER">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_wifi" msgid="6099781031669728709">"<xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="NETWORK">%2$s</xliff:g>"</string>
+ <string name="accessibility_quick_settings_mobile" msgid="4876806564086241341">"მáƒáƒ‘ილურის <xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="TYPE">%2$s</xliff:g>. <xliff:g id="NETWORK">%3$s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"ელემენტი: <xliff:g id="STATE">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_airplane" msgid="4196876722090224753">"თვითმფრინáƒáƒ•ის რეჟიმი <xliff:g id="STATE">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_bluetooth" msgid="5749054971341882340">"Bluetooth <xliff:g id="STATE">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_location" msgid="4577282329866813100">"მდებáƒáƒ áƒ”áƒáƒ‘რ<xliff:g id="STATE">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"მáƒáƒ¦áƒ•იძáƒáƒ áƒ დáƒáƒ§áƒ”ნებულიáƒ: <xliff:g id="TIME">%s</xliff:g>"</string>
+ <string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"2G-3G ინტერნეტი გáƒáƒ˜áƒ—იშáƒ."</string>
+ <string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"4G მáƒáƒœáƒáƒªáƒ”მები გáƒáƒ—იშულიáƒ"</string>
+ <string name="data_usage_disabled_dialog_mobile_title" msgid="1046047248844821202">"მáƒáƒ‘ილური ინტერნეტი გáƒáƒ˜áƒ—იშáƒ."</string>
+ <string name="data_usage_disabled_dialog_title" msgid="2086815304858964954">"ინტერნეტი გáƒáƒ˜áƒ—იშáƒ."</string>
+ <string name="data_usage_disabled_dialog" msgid="3853117269051806280">"თქვენ მიáƒáƒ¦áƒ¬áƒ˜áƒ”თ ინტერნეტის გáƒáƒ›áƒáƒ§áƒ”ნების გáƒáƒœáƒ¡áƒáƒ–ღვრულ ლიმიტს.\n\nთუ გáƒáƒáƒ¥áƒ¢áƒ˜áƒ£áƒ áƒ”ბთ ინტერნეტს, შესáƒáƒ«áƒšáƒáƒ მáƒáƒ‘ილური áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡áƒ—ვის დáƒáƒ›áƒáƒ¢áƒ”ბითი თáƒáƒœáƒ®áƒ˜áƒ¡ გáƒáƒ“áƒáƒ®áƒ“რმáƒáƒ’იწიáƒáƒ—."</string>
+ <string name="data_usage_disabled_dialog_enable" msgid="7729772039208664606">"მáƒáƒœáƒáƒªáƒ”მების ხელáƒáƒ®áƒšáƒ ჩáƒáƒ áƒ—ვáƒ"</string>
+ <string name="status_bar_settings_signal_meter_disconnected" msgid="1940231521274147771">"ინტერნეტ კáƒáƒ•შირი áƒáƒ  áƒáƒ áƒ˜áƒ¡"</string>
+ <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Wi-Fi დáƒáƒ™áƒáƒ•შირებულიáƒ"</string>
+ <string name="gps_notification_searching_text" msgid="8574247005642736060">"GPS-ის ძებნáƒ"</string>
+ <string name="gps_notification_found_text" msgid="4619274244146446464">"GPS-ით დáƒáƒ“გენილი მდებáƒáƒ áƒ”áƒáƒ‘áƒ"</string>
+ <string name="accessibility_location_active" msgid="2427290146138169014">"მდებáƒáƒ áƒ”áƒáƒ‘ის მáƒáƒ—ხáƒáƒ•ნები áƒáƒ¥áƒ¢áƒ˜áƒ£áƒ áƒ˜áƒ"</string>
+ <string name="accessibility_clear_all" msgid="5235938559247164925">"ყველრშეტყáƒáƒ‘ინების წáƒáƒ¨áƒšáƒ"</string>
+ <string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"áƒáƒžáƒ˜áƒ¡ შესáƒáƒ®áƒ”ბ"</string>
+ <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"ეკრáƒáƒœáƒ˜ შეტრიáƒáƒšáƒ“ებრáƒáƒ•ტáƒáƒ›áƒáƒ¢áƒ£áƒ áƒáƒ“."</string>
+ <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"ეკრáƒáƒœáƒ˜ დáƒáƒ‘ლáƒáƒ™áƒ˜áƒšáƒ˜áƒ თáƒáƒ áƒáƒ–ულ áƒáƒ áƒ˜áƒ”ნტáƒáƒªáƒ˜áƒáƒ¨áƒ˜"</string>
+ <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"ეკრáƒáƒœáƒ˜ დáƒáƒ‘ლáƒáƒ™áƒ˜áƒšáƒ˜áƒ პáƒáƒ áƒ¢áƒ áƒ”ტის áƒáƒ áƒ˜áƒ”ნტáƒáƒªáƒ˜áƒáƒ¨áƒ˜."</string>
+ <string name="dessert_case" msgid="1295161776223959221">"სáƒáƒ“ესერტრყუთი"</string>
+ <string name="start_dreams" msgid="7219575858348719790">"Daydream"</string>
+ <string name="ethernet_label" msgid="7967563676324087464">"ეთერნეტი"</string>
+ <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"თვითმფრინáƒáƒ•ის რეჟიმი"</string>
+ <string name="quick_settings_battery_charging_label" msgid="490074774465309209">"დáƒáƒ›áƒ£áƒ®áƒ¢áƒ•áƒ, <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+ <string name="quick_settings_battery_charged_label" msgid="8865413079414246081">"დáƒáƒ›áƒ£áƒ®áƒ¢áƒ£áƒšáƒ˜áƒ"</string>
+ <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string>
+ <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (<xliff:g id="NUMBER">%d</xliff:g> მáƒáƒ¬áƒ§áƒáƒ‘ილáƒáƒ‘áƒ)"</string>
+ <string name="quick_settings_bluetooth_off_label" msgid="8159652146149219937">"Bluetooth გáƒáƒ›áƒáƒ áƒ—ულიáƒ"</string>
+ <string name="quick_settings_brightness_label" msgid="6968372297018755815">"სიკáƒáƒ¨áƒ™áƒáƒ¨áƒ”"</string>
+ <string name="quick_settings_rotation_unlocked_label" msgid="336054930362580584">"áƒáƒ•ტრმáƒáƒ‘რუნებáƒ"</string>
+ <string name="quick_settings_rotation_locked_label" msgid="8058646447242565486">"რáƒáƒ¢áƒáƒªáƒ˜áƒ˜áƒ¡ ჩáƒáƒ™áƒ”ტვáƒ"</string>
+ <string name="quick_settings_ime_label" msgid="7073463064369468429">"შეყვáƒáƒœáƒ˜áƒ¡ მეთáƒáƒ“ი"</string>
+ <string name="quick_settings_location_label" msgid="5011327048748762257">"მდებáƒáƒ áƒ”áƒáƒ‘áƒ"</string>
+ <string name="quick_settings_location_off_label" msgid="7464544086507331459">"მდებáƒáƒ áƒ”áƒáƒ‘რგáƒáƒ›áƒáƒ áƒ—ულიáƒ"</string>
+ <string name="quick_settings_media_device_label" msgid="1302906836372603762">"მედირმáƒáƒ¬áƒ§áƒáƒ‘ილáƒáƒ‘áƒ"</string>
+ <string name="quick_settings_rssi_label" msgid="7725671335550695589">"RSSI"</string>
+ <string name="quick_settings_rssi_emergency_only" msgid="2713774041672886750">"მხáƒáƒšáƒáƒ“ გáƒáƒ“áƒáƒ£áƒ“ებელი დáƒáƒ®áƒ›áƒáƒ áƒ”ბის ზáƒáƒ áƒ”ბისთვის"</string>
+ <string name="quick_settings_settings_label" msgid="5326556592578065401">"პáƒáƒ áƒáƒ›áƒ”ტრები"</string>
+ <string name="quick_settings_time_label" msgid="4635969182239736408">"დრáƒ"</string>
+ <string name="quick_settings_user_label" msgid="5238995632130897840">"მე"</string>
+ <string name="quick_settings_wifi_label" msgid="9135344704899546041">"Wi-Fi"</string>
+ <string name="quick_settings_wifi_not_connected" msgid="7171904845345573431">"áƒáƒ  áƒáƒ áƒ˜áƒ¡ დáƒáƒ™áƒáƒ•შირებული."</string>
+ <string name="quick_settings_wifi_no_network" msgid="2221993077220856376">"ქსელი áƒáƒ  áƒáƒ áƒ˜áƒ¡"</string>
+ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi გáƒáƒ›áƒáƒ áƒ—ულიáƒ"</string>
+ <string name="quick_settings_wifi_display_label" msgid="6893592964463624333">"Wi-Fi ეკრáƒáƒœáƒ˜"</string>
+ <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"უსáƒáƒ“ენრეკრáƒáƒœáƒ˜"</string>
+ <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"გáƒáƒœáƒáƒ—ებáƒ"</string>
+ <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"áƒáƒ•ტáƒáƒ›áƒáƒ¢áƒ£áƒ áƒáƒ“"</string>
+ <string name="quick_settings_inversion_label" msgid="1666358784283020762">"ფერთრინვერსიის რეჟიმი"</string>
+ <string name="quick_settings_contrast_label" msgid="3319507551689108692">"გáƒáƒ£áƒ›áƒ¯áƒáƒ‘ესებული კáƒáƒœáƒ¢áƒ áƒáƒ¡áƒ¢áƒ˜áƒ¡ რეჟიმი"</string>
+ <string name="quick_settings_color_space_label" msgid="853443689745584770">"ფერთრკáƒáƒ áƒ”ქციის რეჟიმი"</string>
+ <string name="ssl_ca_cert_warning" msgid="9005954106902053641">"შესáƒáƒ«áƒšáƒáƒ ქსელზე\nმáƒáƒœáƒ˜áƒ¢áƒáƒ áƒ˜áƒœáƒ’ი ხáƒáƒ áƒªáƒ˜áƒ”ლდებáƒáƒ“ეს"</string>
+</resources>
diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml
new file mode 100644
index 0000000..bcbe4de
--- /dev/null
+++ b/packages/SystemUI/res/values-ka/strings.xml
@@ -0,0 +1,204 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="7164937344850004466">"სისტემის UI"</string>
+ <string name="status_bar_clear_all_button" msgid="7774721344716731603">"გáƒáƒ¡áƒ£áƒ¤áƒ—áƒáƒ•ებáƒ"</string>
+ <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"სიიდáƒáƒœ áƒáƒ›áƒáƒ¨áƒšáƒ"</string>
+ <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"áƒáƒžáƒ˜áƒ¡ შესáƒáƒ®áƒ”ბ"</string>
+ <string name="status_bar_no_recent_apps" msgid="6576392951053994640">"ბáƒáƒšáƒáƒ¡ გáƒáƒ›áƒáƒ§áƒ”ნებული áƒáƒžáƒ”ბის სირცáƒáƒ áƒ˜áƒ”ლიáƒ"</string>
+ <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"ბáƒáƒšáƒ áƒáƒžáƒ”ბის გáƒáƒ£áƒ¥áƒ›áƒ”ბáƒ"</string>
+ <plurals name="status_bar_accessibility_recent_apps">
+ <item quantity="one" msgid="5854176083865845541">"1 ბáƒáƒšáƒ áƒáƒžáƒ˜"</item>
+ <item quantity="other" msgid="1040784359794890744">"%d ბáƒáƒšáƒ áƒáƒžáƒ˜"</item>
+ </plurals>
+ <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"შეტყáƒáƒ‘ინებები áƒáƒ  áƒáƒ áƒ˜áƒ¡."</string>
+ <string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"მიმდინáƒáƒ áƒ”"</string>
+ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"შეტყáƒáƒ‘ინებები"</string>
+ <string name="battery_low_title" msgid="2783104807551211639">"შეáƒáƒ”რთეთ დáƒáƒ›áƒ¢áƒ”ნი."</string>
+ <string name="battery_low_subtitle" msgid="1752040062087829196">"ბáƒáƒ¢áƒáƒ áƒ”რჯდებáƒ."</string>
+ <string name="battery_low_percent_format" msgid="1077244949318261761">"დáƒáƒ áƒ©áƒ”ნილირ<xliff:g id="NUMBER">%d%%</xliff:g>"</string>
+ <string name="invalid_charger" msgid="4549105996740522523">"USB-ით დáƒáƒ¢áƒ”ნვრáƒáƒ  áƒáƒ áƒ˜áƒ¡ მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი.\nგáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ მხáƒáƒšáƒáƒ“ ელექტრáƒ-დáƒáƒ›áƒ¢áƒ”ნი."</string>
+ <string name="battery_low_why" msgid="7279169609518386372">"ელემენტის გáƒáƒ›áƒáƒ§áƒ”ნებáƒ"</string>
+ <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"პáƒáƒ áƒáƒ›áƒ”ტრები"</string>
+ <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
+ <string name="status_bar_settings_airplane" msgid="4879879698500955300">"თვითმფრინáƒáƒ•ის რეჟიმი"</string>
+ <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"áƒáƒ•ტáƒáƒ áƒáƒ¢áƒáƒªáƒ˜áƒ˜áƒ¡ ეკრáƒáƒœáƒ˜"</string>
+ <string name="status_bar_settings_mute_label" msgid="554682549917429396">"დáƒáƒ“უმებáƒ"</string>
+ <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"áƒáƒ•ტáƒáƒ›áƒáƒ¢áƒ£áƒ áƒ˜"</string>
+ <string name="status_bar_settings_notifications" msgid="397146176280905137">"შეტყáƒáƒ‘ინებები"</string>
+ <string name="bluetooth_tethered" msgid="7094101612161133267">"Bluetooth მიერთებულიáƒ."</string>
+ <string name="status_bar_input_method_settings_configure_input_methods" msgid="3504292471512317827">"შეყვáƒáƒœáƒ˜áƒ¡ მეთáƒáƒ“ების დáƒáƒ§áƒ”ნებáƒ"</string>
+ <string name="status_bar_use_physical_keyboard" msgid="7551903084416057810">"ფიზიკური კლáƒáƒ•იáƒáƒ¢áƒ£áƒ áƒ"</string>
+ <string name="usb_device_permission_prompt" msgid="834698001271562057">"გსურთ, მისცეთ áƒáƒžáƒšáƒ˜áƒ™áƒáƒªáƒ˜áƒáƒ¡ „<xliff:g id="APPLICATION">%1$s</xliff:g>“ USB მეხსიერებáƒáƒ¡áƒ—áƒáƒœ წვდáƒáƒ›áƒ˜áƒ¡ უფლებáƒ?"</string>
+ <string name="usb_accessory_permission_prompt" msgid="5171775411178865750">"გსურთ, მისცეთ áƒáƒžáƒšáƒ˜áƒ™áƒáƒªáƒ˜áƒáƒ¡ „<xliff:g id="APPLICATION">%1$s</xliff:g>“ USB áƒáƒ¥áƒ¡áƒ”სუáƒáƒ áƒ—áƒáƒœ წვდáƒáƒ›áƒ˜áƒ¡ უფლებáƒ?"</string>
+ <string name="usb_device_confirm_prompt" msgid="5161205258635253206">"გსურთ <xliff:g id="ACTIVITY">%1$s</xliff:g> , რáƒáƒ“ესáƒáƒª ეს USB მáƒáƒ¬áƒ§áƒáƒ‘ილáƒáƒ‘რშეერთებულიáƒ?"</string>
+ <string name="usb_accessory_confirm_prompt" msgid="3808984931830229888">"გსურთ <xliff:g id="ACTIVITY">%1$s</xliff:g> , რáƒáƒ“ესáƒáƒª ეს USB მáƒáƒ¬áƒ§áƒáƒ‘ილáƒáƒ‘რშეერთებულიáƒ?"</string>
+ <string name="usb_accessory_uri_prompt" msgid="513450621413733343">"áƒáƒ áƒªáƒ”რთი დáƒáƒ§áƒ”ნებული áƒáƒžáƒ˜ áƒáƒ  მუშáƒáƒáƒ‘ს áƒáƒ› USB áƒáƒ¥áƒ¡áƒ”სუáƒáƒ áƒ—áƒáƒœ. შეიტყვეთ მეტი áƒáƒ› áƒáƒ¥áƒ¡áƒ”სუáƒáƒ áƒ˜áƒ¡ შესáƒáƒ®áƒ”ბ <xliff:g id="URL">%1$s</xliff:g>"</string>
+ <string name="title_usb_accessory" msgid="4966265263465181372">"USB áƒáƒ¥áƒ¡áƒ”სუáƒáƒ áƒ˜"</string>
+ <string name="label_view" msgid="6304565553218192990">"ნáƒáƒ®áƒ•áƒ"</string>
+ <string name="always_use_device" msgid="1450287437017315906">"áƒáƒ› USB მáƒáƒ¬áƒ§áƒáƒ‘ილáƒáƒ‘ის ნáƒáƒ’ულისხმევáƒáƒ“ გáƒáƒ›áƒáƒ§áƒ”ნებáƒ"</string>
+ <string name="always_use_accessory" msgid="1210954576979621596">"áƒáƒ•ტáƒáƒ›áƒáƒ¢áƒ£áƒ áƒáƒ“ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნე áƒáƒ› USB áƒáƒ¥áƒ¡áƒ”სუáƒáƒ áƒ˜áƒ¡áƒ—ვის."</string>
+ <string name="usb_debugging_title" msgid="4513918393387141949">"გáƒáƒáƒ¥áƒ¢áƒ˜áƒ£áƒ áƒ“ეს USB გáƒáƒ›áƒáƒ áƒ—ვáƒ?"</string>
+ <string name="usb_debugging_message" msgid="2220143855912376496">"კáƒáƒ›áƒžáƒ˜áƒ£áƒ¢áƒ”რის RSA გáƒáƒ¡áƒáƒ¦áƒ”ბის თითის áƒáƒœáƒáƒ‘ეჭდიáƒ:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
+ <string name="usb_debugging_always" msgid="303335496705863070">"ყáƒáƒ•ელთვის დáƒáƒ áƒ—ე ნებრáƒáƒ› კáƒáƒ›áƒžáƒ˜áƒ£áƒ¢áƒ”რიდáƒáƒœ."</string>
+ <string name="compat_mode_on" msgid="6623839244840638213">"მáƒáƒ¡áƒ¨áƒ¢áƒáƒ‘ი შეცვáƒáƒšáƒ”თ ეკრáƒáƒœáƒ˜áƒ¡ შესáƒáƒ•სებáƒáƒ“."</string>
+ <string name="compat_mode_off" msgid="4434467572461327898">"გáƒáƒ¬áƒ˜áƒ”თ ეკრáƒáƒœáƒ˜áƒ¡ შესáƒáƒ•სებáƒáƒ“."</string>
+ <string name="compat_mode_help_header" msgid="7969493989397529910">"თáƒáƒ•სებáƒáƒ“áƒáƒ‘ის მáƒáƒ¡áƒ¨áƒ¢áƒáƒ‘ი"</string>
+ <string name="compat_mode_help_body" msgid="4946726776359270040">"თუ áƒáƒžáƒ˜ გáƒáƒ—ვლილირმცირე ეკრáƒáƒœáƒ˜áƒ¡áƒ—ვის, სáƒáƒáƒ—ის გვერდით გáƒáƒ©áƒœáƒ“ებრმáƒáƒ¡áƒ¨áƒ¢áƒáƒ‘ის მáƒáƒ áƒ—ვის ელემენტი."</string>
+ <string name="screenshot_saving_ticker" msgid="7403652894056693515">"სკრინშáƒáƒ¢áƒ˜áƒ¡ შენáƒáƒ®áƒ•áƒâ€¦"</string>
+ <string name="screenshot_saving_title" msgid="8242282144535555697">"ეკრáƒáƒœáƒ˜áƒ¡ სურáƒáƒ—ის შენáƒáƒ®áƒ•áƒâ€¦"</string>
+ <string name="screenshot_saving_text" msgid="2419718443411738818">"ეკრáƒáƒœáƒ˜áƒ¡ სურáƒáƒ—ი შენáƒáƒ®áƒ£áƒšáƒ˜áƒ."</string>
+ <string name="screenshot_saved_title" msgid="6461865960961414961">"სკრინშáƒáƒ¢áƒ˜ გáƒáƒ“áƒáƒ¦áƒ”ბულიáƒ."</string>
+ <string name="screenshot_saved_text" msgid="1152839647677558815">"შეეხეთ ეკრáƒáƒœáƒ˜áƒ¡ სურáƒáƒ—ის სáƒáƒœáƒáƒ®áƒáƒ•áƒáƒ“."</string>
+ <string name="screenshot_failed_title" msgid="705781116746922771">"ვერ მáƒáƒ®áƒ”რხდრეკრáƒáƒœáƒ˜áƒ¡ áƒáƒœáƒáƒ‘ეჭდის გáƒáƒ“áƒáƒ¦áƒ”ბáƒ."</string>
+ <string name="screenshot_failed_text" msgid="8134011269572415402">"ეკრáƒáƒœáƒ˜áƒ¡ სურáƒáƒ—ი ვერ შეინáƒáƒ®áƒ. შესáƒáƒ«áƒšáƒáƒ, მეხსიერებრუკვე დáƒáƒ™áƒáƒ•ებულიáƒ."</string>
+ <string name="usb_preference_title" msgid="6551050377388882787">"USB ფáƒáƒ˜áƒšáƒ˜áƒ¡ ტრáƒáƒœáƒ¡áƒ¤áƒ”რის პáƒáƒ áƒáƒ›áƒ”ტრები"</string>
+ <string name="use_mtp_button_title" msgid="4333504413563023626">"მედიáƒ-სáƒáƒ™áƒ áƒáƒ•áƒáƒ“ (MTP) ჩáƒáƒ áƒ—ვáƒ"</string>
+ <string name="use_ptp_button_title" msgid="7517127540301625751">"მიუერთეთ რáƒáƒ’áƒáƒ áƒª კáƒáƒ›áƒ”რრ(PTP)"</string>
+ <string name="installer_cd_button_title" msgid="2312667578562201583">"Android File Transfer áƒáƒžáƒ˜áƒ¡ დáƒáƒ§áƒ”ნებრMac-თვის"</string>
+ <string name="accessibility_back" msgid="567011538994429120">"უკáƒáƒœ"</string>
+ <string name="accessibility_home" msgid="8217216074895377641">"სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜"</string>
+ <string name="accessibility_menu" msgid="316839303324695949">"მენიუ"</string>
+ <string name="accessibility_recent" msgid="8571350598987952883">"ბáƒáƒšáƒáƒ¡ გáƒáƒ›áƒáƒ§áƒ”ნებული áƒáƒžáƒ”ბი"</string>
+ <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"შეყვáƒáƒœáƒ˜áƒ¡ მეთáƒáƒ“ის გáƒáƒ“áƒáƒ áƒ—ვის ღილáƒáƒ™áƒ˜."</string>
+ <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"თáƒáƒ•სებáƒáƒ“ი მáƒáƒ¡áƒ¨áƒ¢áƒáƒ‘ირების ღილáƒáƒ™áƒ˜."</string>
+ <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"შეცვáƒáƒšáƒ”თ პáƒáƒ¢áƒáƒ áƒ ეკრáƒáƒœáƒ˜ უფრრდიდით."</string>
+ <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth დáƒáƒ™áƒáƒ•შირებულიáƒ."</string>
+ <string name="accessibility_bluetooth_disconnected" msgid="7416648669976870175">"Bluetooth კáƒáƒ•შირი გáƒáƒ¬áƒ§áƒ•ეტილიáƒ."</string>
+ <string name="accessibility_no_battery" msgid="358343022352820946">"ბáƒáƒ¢áƒáƒ áƒ”რდáƒáƒ›áƒ¯áƒ“áƒáƒ áƒ˜áƒ."</string>
+ <string name="accessibility_battery_one_bar" msgid="7774887721891057523">"ბáƒáƒ¢áƒáƒ áƒ”ირერთ ზáƒáƒšáƒ–ეáƒ."</string>
+ <string name="accessibility_battery_two_bars" msgid="8500650438735009973">"ელემენტი áƒáƒ  ზáƒáƒšáƒ–ე."</string>
+ <string name="accessibility_battery_three_bars" msgid="2302983330865040446">"ელემენტი სáƒáƒ› ზáƒáƒšáƒ–ე."</string>
+ <string name="accessibility_battery_full" msgid="8909122401720158582">"ელემენტი სáƒáƒ•სეáƒ."</string>
+ <string name="accessibility_no_phone" msgid="4894708937052611281">"ტელეფáƒáƒœáƒ˜ áƒáƒ  áƒáƒ áƒ˜áƒ¡."</string>
+ <string name="accessibility_phone_one_bar" msgid="687699278132664115">"ტელეფáƒáƒœáƒ˜áƒ¡ სიგნáƒáƒšáƒ˜ ერთ ზáƒáƒšáƒ–ეáƒ."</string>
+ <string name="accessibility_phone_two_bars" msgid="8384905382804815201">"ტელეფáƒáƒœáƒ˜áƒ¡ სიგნáƒáƒšáƒ˜ áƒáƒ  ზáƒáƒšáƒ–ეáƒ."</string>
+ <string name="accessibility_phone_three_bars" msgid="8521904843919971885">"ტელეფáƒáƒœáƒ˜áƒ¡ სიგნáƒáƒšáƒ˜ სáƒáƒ› ზáƒáƒšáƒ–ეáƒ."</string>
+ <string name="accessibility_phone_signal_full" msgid="6471834868580757898">"ტელეფáƒáƒœáƒ˜áƒ¡ სიგნáƒáƒšáƒ˜ სრულიáƒ."</string>
+ <string name="accessibility_no_data" msgid="4791966295096867555">"მáƒáƒœáƒáƒªáƒ”მები áƒáƒ  áƒáƒ áƒ˜áƒ¡."</string>
+ <string name="accessibility_data_one_bar" msgid="1415625833238273628">"თáƒáƒ áƒ˜áƒ¦áƒ˜ ზáƒáƒšáƒ–ე."</string>
+ <string name="accessibility_data_two_bars" msgid="6166018492360432091">"მáƒáƒœáƒáƒªáƒ”მების გáƒáƒ“áƒáƒªáƒ”მáƒ: áƒáƒ áƒ˜ ზáƒáƒšáƒ˜"</string>
+ <string name="accessibility_data_three_bars" msgid="9167670452395038520">"მáƒáƒœáƒáƒªáƒ”მების გáƒáƒ“áƒáƒªáƒ”მáƒ: სáƒáƒ›áƒ˜ ზáƒáƒšáƒ˜"</string>
+ <string name="accessibility_data_signal_full" msgid="2708384608124519369">"მáƒáƒœáƒáƒªáƒ”მთრგáƒáƒ“áƒáƒªáƒ”მის სáƒáƒ˜áƒ›áƒ”დრსიგნáƒáƒšáƒ˜."</string>
+ <string name="accessibility_wifi_off" msgid="3177380296697933627">"Wifi გáƒáƒ›áƒáƒ áƒ—ულიáƒ."</string>
+ <string name="accessibility_no_wifi" msgid="1425476551827924474">"Wifi áƒáƒ  áƒáƒ áƒ˜áƒ¡ დáƒáƒ™áƒáƒ•შირებული."</string>
+ <string name="accessibility_wifi_one_bar" msgid="7735893178010724377">"Wifi სიგნáƒáƒšáƒ˜ ერთ ზáƒáƒšáƒ–ეáƒ."</string>
+ <string name="accessibility_wifi_two_bars" msgid="4994274250497262434">"Wifi სიგნáƒáƒšáƒ˜ áƒáƒ  ზáƒáƒšáƒ–ეáƒ."</string>
+ <string name="accessibility_wifi_three_bars" msgid="3495755044276588384">"Wifi სáƒáƒ›áƒ˜ ზáƒáƒšáƒ˜."</string>
+ <string name="accessibility_wifi_signal_full" msgid="6853561303586480376">"Wifi სიგნáƒáƒšáƒ˜ სრულიáƒ."</string>
+ <string name="accessibility_no_wimax" msgid="4329180129727630368">"WiMAX áƒáƒ  áƒáƒ áƒ˜áƒ¡."</string>
+ <string name="accessibility_wimax_one_bar" msgid="4170994299011863648">"WiMAX ერთი სვეტი."</string>
+ <string name="accessibility_wimax_two_bars" msgid="9176236858336502288">"WiMAX-ის áƒáƒ áƒ˜ ზáƒáƒšáƒ˜."</string>
+ <string name="accessibility_wimax_three_bars" msgid="6116551636752103927">"WiMAX-ის სáƒáƒ›áƒ˜ ზáƒáƒšáƒ˜."</string>
+ <string name="accessibility_wimax_signal_full" msgid="2768089986795579558">"WiMAX სიგნáƒáƒšáƒ˜ სრულიáƒ."</string>
+ <string name="accessibility_no_signal" msgid="7064645320782585167">"სიგნáƒáƒšáƒ˜ áƒáƒ  áƒáƒ áƒ˜áƒ¡."</string>
+ <string name="accessibility_not_connected" msgid="6395326276213402883">"áƒáƒ  áƒáƒ áƒ˜áƒ¡ დáƒáƒ™áƒáƒ•შირებული."</string>
+ <string name="accessibility_zero_bars" msgid="3806060224467027887">"სიგნáƒáƒšáƒ˜ ნულ ზáƒáƒšáƒ–ეáƒ."</string>
+ <string name="accessibility_one_bar" msgid="1685730113192081895">"ერთი ზáƒáƒšáƒ˜."</string>
+ <string name="accessibility_two_bars" msgid="6437363648385206679">"áƒáƒ áƒ˜ სვეტი."</string>
+ <string name="accessibility_three_bars" msgid="2648241415119396648">"სáƒáƒ›áƒ˜ ზáƒáƒšáƒ˜."</string>
+ <string name="accessibility_signal_full" msgid="9122922886519676839">"სრული სიგნáƒáƒšáƒ˜."</string>
+ <string name="accessibility_desc_on" msgid="2385254693624345265">"ჩáƒáƒ áƒ—ული"</string>
+ <string name="accessibility_desc_off" msgid="6475508157786853157">"გáƒáƒ›áƒáƒ áƒ—ულიáƒ."</string>
+ <string name="accessibility_desc_connected" msgid="8366256693719499665">"დáƒáƒ™áƒáƒ•შირებულიáƒ."</string>
+ <string name="accessibility_data_connection_gprs" msgid="1606477224486747751">"GPRS"</string>
+ <string name="accessibility_data_connection_1x" msgid="994133468120244018">"1 X"</string>
+ <string name="accessibility_data_connection_hspa" msgid="2032328855462645198">"HSPA"</string>
+ <string name="accessibility_data_connection_3g" msgid="8628562305003568260">"3G"</string>
+ <string name="accessibility_data_connection_3.5g" msgid="8664845609981692001">"3.5გბ"</string>
+ <string name="accessibility_data_connection_4g" msgid="7741000750630089612">"4G"</string>
+ <string name="accessibility_data_connection_lte" msgid="5413468808637540658">"LTE"</string>
+ <string name="accessibility_data_connection_cdma" msgid="6132648193978823023">"CDMA"</string>
+ <string name="accessibility_data_connection_roaming" msgid="5977362333466556094">"რáƒáƒ£áƒ›áƒ˜áƒœáƒ’ი"</string>
+ <string name="accessibility_data_connection_edge" msgid="4477457051631979278">"Edge"</string>
+ <string name="accessibility_data_connection_wifi" msgid="2324496756590645221">"Wi-Fi"</string>
+ <string name="accessibility_no_sim" msgid="8274017118472455155">"SIM áƒáƒ  áƒáƒ áƒ˜áƒ¡."</string>
+ <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Bluetooth-ის ჩáƒáƒ áƒ—ვáƒ"</string>
+ <string name="accessibility_airplane_mode" msgid="834748999790763092">"თვითმფრინáƒáƒ•ის რეჟიმი"</string>
+ <string name="accessibility_battery_level" msgid="7451474187113371965">"ბáƒáƒ¢áƒáƒ áƒ”áƒ: <xliff:g id="NUMBER">%d</xliff:g> პრáƒáƒªáƒ”ნტი."</string>
+ <string name="accessibility_settings_button" msgid="799583911231893380">"სისტემის პáƒáƒ áƒáƒ›áƒ”ტრები."</string>
+ <string name="accessibility_notifications_button" msgid="4498000369779421892">"შეტყáƒáƒ‘ინებები"</string>
+ <string name="accessibility_remove_notification" msgid="3603099514902182350">"შეტყáƒáƒ‘ინებების გáƒáƒ¡áƒ£áƒ¤áƒ—áƒáƒ•ებáƒ."</string>
+ <string name="accessibility_gps_enabled" msgid="3511469499240123019">"GPS გáƒáƒáƒ¥áƒ¢áƒ˜áƒ£áƒ áƒ“áƒ."</string>
+ <string name="accessibility_gps_acquiring" msgid="8959333351058967158">"GPS-ის დáƒáƒ“გენáƒ."</string>
+ <string name="accessibility_tty_enabled" msgid="4613200365379426561">"ტელეტáƒáƒ˜áƒžáƒ˜ ჩáƒáƒ áƒ—ულიáƒ."</string>
+ <string name="accessibility_ringer_vibrate" msgid="666585363364155055">"ვიბრáƒáƒªáƒ˜áƒ˜áƒ¡ რეჟიმი."</string>
+ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"უხმრრეჟიმი."</string>
+ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> áƒáƒ›áƒáƒ¨áƒšáƒ˜áƒšáƒ˜áƒ სიიდáƒáƒœ."</string>
+ <string name="accessibility_notification_dismissed" msgid="854211387186306927">"შეტყáƒáƒ‘ინებრწáƒáƒ˜áƒ¨áƒáƒšáƒ."</string>
+ <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"შეტყáƒáƒ‘ინებების ფáƒáƒ áƒ“áƒ"</string>
+ <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"სწრáƒáƒ¤áƒ˜ პáƒáƒ áƒáƒ›áƒ”ტრები"</string>
+ <string name="accessibility_desc_recent_apps" msgid="9014032916410590027">"ბáƒáƒšáƒ áƒáƒžáƒ”ბი."</string>
+ <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი: <xliff:g id="USER">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_wifi" msgid="6099781031669728709">"<xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="NETWORK">%2$s</xliff:g>"</string>
+ <string name="accessibility_quick_settings_mobile" msgid="4876806564086241341">"მáƒáƒ‘ილურის <xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="TYPE">%2$s</xliff:g>. <xliff:g id="NETWORK">%3$s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"ელემენტი: <xliff:g id="STATE">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_airplane" msgid="4196876722090224753">"თვითმფრინáƒáƒ•ის რეჟიმი <xliff:g id="STATE">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_bluetooth" msgid="5749054971341882340">"Bluetooth <xliff:g id="STATE">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"მáƒáƒ¦áƒ•იძáƒáƒ áƒ დáƒáƒ§áƒ”ნებულიáƒ: <xliff:g id="TIME">%s</xliff:g>"</string>
+ <string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"2G-3G ინტერნეტი გáƒáƒ˜áƒ—იშáƒ."</string>
+ <string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"4G მáƒáƒœáƒáƒªáƒ”მები გáƒáƒ—იშულიáƒ"</string>
+ <string name="data_usage_disabled_dialog_mobile_title" msgid="1046047248844821202">"მáƒáƒ‘ილური ინტერნეტი გáƒáƒ˜áƒ—იშáƒ."</string>
+ <string name="data_usage_disabled_dialog_title" msgid="2086815304858964954">"ინტერნეტი გáƒáƒ˜áƒ—იშáƒ."</string>
+ <string name="data_usage_disabled_dialog" msgid="3853117269051806280">"თქვენ მიáƒáƒ¦áƒ¬áƒ˜áƒ”თ ინტერნეტის გáƒáƒ›áƒáƒ§áƒ”ნების გáƒáƒœáƒ¡áƒáƒ–ღვრულ ლიმიტს.\n\nთუ გáƒáƒáƒ¥áƒ¢áƒ˜áƒ£áƒ áƒ”ბთ ინტერნეტს, შესáƒáƒ«áƒšáƒáƒ მáƒáƒ‘ილური áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡áƒ—ვის დáƒáƒ›áƒáƒ¢áƒ”ბითი თáƒáƒœáƒ®áƒ˜áƒ¡ გáƒáƒ“áƒáƒ®áƒ“რმáƒáƒ’იწიáƒáƒ—."</string>
+ <string name="data_usage_disabled_dialog_enable" msgid="7729772039208664606">"მáƒáƒœáƒáƒªáƒ”მების ხელáƒáƒ®áƒšáƒ ჩáƒáƒ áƒ—ვáƒ"</string>
+ <string name="status_bar_settings_signal_meter_disconnected" msgid="1940231521274147771">"ინტერნეტ კáƒáƒ•შირი áƒáƒ  áƒáƒ áƒ˜áƒ¡"</string>
+ <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Wi-Fi დáƒáƒ™áƒáƒ•შირებულიáƒ"</string>
+ <string name="gps_notification_searching_text" msgid="8574247005642736060">"GPS-ის ძებნáƒ"</string>
+ <string name="gps_notification_found_text" msgid="4619274244146446464">"GPS-ით დáƒáƒ“გენილი მდებáƒáƒ áƒ”áƒáƒ‘áƒ"</string>
+ <string name="accessibility_location_active" msgid="2427290146138169014">"მდებáƒáƒ áƒ”áƒáƒ‘ის მáƒáƒ—ხáƒáƒ•ნები áƒáƒ¥áƒ¢áƒ˜áƒ£áƒ áƒ˜áƒ"</string>
+ <string name="accessibility_clear_all" msgid="5235938559247164925">"ყველრშეტყáƒáƒ‘ინების წáƒáƒ¨áƒšáƒ"</string>
+ <string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"áƒáƒžáƒ˜áƒ¡ შესáƒáƒ®áƒ”ბ"</string>
+ <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"ეკრáƒáƒœáƒ˜ შეტრიáƒáƒšáƒ“ებრáƒáƒ•ტáƒáƒ›áƒáƒ¢áƒ£áƒ áƒáƒ“."</string>
+ <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"ეკრáƒáƒœáƒ˜ დáƒáƒ‘ლáƒáƒ™áƒ˜áƒšáƒ˜áƒ თáƒáƒ áƒáƒ–ულ áƒáƒ áƒ˜áƒ”ნტáƒáƒªáƒ˜áƒáƒ¨áƒ˜"</string>
+ <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"ეკრáƒáƒœáƒ˜ დáƒáƒ‘ლáƒáƒ™áƒ˜áƒšáƒ˜áƒ პáƒáƒ áƒ¢áƒ áƒ”ტის áƒáƒ áƒ˜áƒ”ნტáƒáƒªáƒ˜áƒáƒ¨áƒ˜."</string>
+ <string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
+ <string name="start_dreams" msgid="7219575858348719790">"Daydream"</string>
+ <string name="ethernet_label" msgid="7967563676324087464">"ეთერნეტი"</string>
+ <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"თვითმფრინáƒáƒ•ის რეჟიმი"</string>
+ <string name="quick_settings_battery_charging_label" msgid="490074774465309209">"დáƒáƒ›áƒ£áƒ®áƒ¢áƒ•áƒ, <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+ <string name="quick_settings_battery_charged_label" msgid="8865413079414246081">"დáƒáƒ›áƒ£áƒ®áƒ¢áƒ£áƒšáƒ˜áƒ"</string>
+ <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string>
+ <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (<xliff:g id="NUMBER">%d</xliff:g> მáƒáƒ¬áƒ§áƒáƒ‘ილáƒáƒ‘áƒ)"</string>
+ <string name="quick_settings_bluetooth_off_label" msgid="8159652146149219937">"Bluetooth გáƒáƒ›áƒáƒ áƒ—ულიáƒ"</string>
+ <string name="quick_settings_brightness_label" msgid="6968372297018755815">"სიკáƒáƒ¨áƒ™áƒáƒ¨áƒ”"</string>
+ <string name="quick_settings_rotation_unlocked_label" msgid="336054930362580584">"áƒáƒ•ტáƒáƒ áƒáƒ¢áƒáƒªáƒ˜áƒ"</string>
+ <string name="quick_settings_rotation_locked_label" msgid="8058646447242565486">"რáƒáƒ¢áƒáƒªáƒ˜áƒ˜áƒ¡ ჩáƒáƒ™áƒ”ტვáƒ"</string>
+ <string name="quick_settings_ime_label" msgid="7073463064369468429">"შეყვáƒáƒœáƒ˜áƒ¡ მეთáƒáƒ“ი"</string>
+ <string name="quick_settings_location_label" msgid="5011327048748762257">"მდებáƒáƒ áƒ”áƒáƒ‘áƒ"</string>
+ <string name="quick_settings_location_off_label" msgid="7464544086507331459">"მდებáƒáƒ áƒ”áƒáƒ‘რგáƒáƒ›áƒáƒ áƒ—ულიáƒ"</string>
+ <string name="quick_settings_media_device_label" msgid="1302906836372603762">"მედირმáƒáƒ¬áƒ§áƒáƒ‘ილáƒáƒ‘áƒ"</string>
+ <string name="quick_settings_rssi_label" msgid="7725671335550695589">"RSSI"</string>
+ <string name="quick_settings_rssi_emergency_only" msgid="2713774041672886750">"მხáƒáƒšáƒáƒ“ გáƒáƒ“áƒáƒ£áƒ“ებელი დáƒáƒ®áƒ›áƒáƒ áƒ”ბის ზáƒáƒ áƒ”ბისთვის"</string>
+ <string name="quick_settings_settings_label" msgid="5326556592578065401">"პáƒáƒ áƒáƒ›áƒ”ტრები"</string>
+ <string name="quick_settings_time_label" msgid="4635969182239736408">"დრáƒ"</string>
+ <string name="quick_settings_user_label" msgid="5238995632130897840">"მე"</string>
+ <string name="quick_settings_wifi_label" msgid="9135344704899546041">"Wi-Fi"</string>
+ <string name="quick_settings_wifi_not_connected" msgid="7171904845345573431">"áƒáƒ  áƒáƒ áƒ˜áƒ¡ დáƒáƒ™áƒáƒ•შირებული."</string>
+ <string name="quick_settings_wifi_no_network" msgid="2221993077220856376">"ქსელი áƒáƒ  áƒáƒ áƒ˜áƒ¡"</string>
+ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi გáƒáƒ›áƒáƒ áƒ—ულიáƒ"</string>
+ <string name="quick_settings_wifi_display_label" msgid="6893592964463624333">"Wi-Fi ეკრáƒáƒœáƒ˜"</string>
+ <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"უსáƒáƒ“ენრეკრáƒáƒœáƒ˜"</string>
+ <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"გáƒáƒœáƒáƒ—ებáƒ"</string>
+ <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"áƒáƒ•ტáƒáƒ›áƒáƒ¢áƒ£áƒ áƒáƒ“"</string>
+ <string name="status_bar_help_title" msgid="1199237744086469217">"შეტყáƒáƒ‘ინებები áƒáƒ¥ გáƒáƒ›áƒáƒ©áƒœáƒ“ებáƒ"</string>
+ <string name="status_bar_help_text" msgid="7874607155052076323">"მáƒáƒ—ზე წვდáƒáƒ›áƒ˜áƒ¡áƒáƒ—ვის, ნებისმიერ დრáƒáƒ¡ გáƒáƒ“áƒáƒ¤áƒ£áƒ áƒªáƒšáƒ”თ ქვემáƒáƒ—.\nსისტემის კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜áƒ¡áƒ—ვისáƒáƒª გáƒáƒ“áƒáƒ¤áƒ£áƒ áƒªáƒšáƒ”თ ქვემáƒáƒ—."</string>
+</resources>
diff --git a/packages/SystemUI/res/values-km-land/strings.xml b/packages/SystemUI/res/values-km-land/strings.xml
new file mode 100644
index 0000000..f148cc3
--- /dev/null
+++ b/packages/SystemUI/res/values-km-land/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2010, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="toast_rotation_locked" msgid="7609673011431556092">"ឥឡូវ​អáŸáž€áŸ’រង់​​ជាប់​សោ​ក្នុង​ទិស​ផ្ដáŸáž€áŸ”"</string>
+</resources>
diff --git a/packages/SystemUI/res/values-km-rKH-land/strings.xml b/packages/SystemUI/res/values-km-rKH-land/strings.xml
new file mode 100644
index 0000000..f148cc3
--- /dev/null
+++ b/packages/SystemUI/res/values-km-rKH-land/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2010, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="toast_rotation_locked" msgid="7609673011431556092">"ឥឡូវ​អáŸáž€áŸ’រង់​​ជាប់​សោ​ក្នុង​ទិស​ផ្ដáŸáž€áŸ”"</string>
+</resources>
diff --git a/packages/SystemUI/res/values-km-rKH/strings.xml b/packages/SystemUI/res/values-km-rKH/strings.xml
new file mode 100644
index 0000000..22e1d92
--- /dev/null
+++ b/packages/SystemUI/res/values-km-rKH/strings.xml
@@ -0,0 +1,207 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="7164937344850004466">"ចំណុច​ប្រទាក់​ប្រពáŸáž“្ធ"</string>
+ <string name="status_bar_clear_all_button" msgid="7774721344716731603">"សម្អាáž"</string>
+ <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"យក​ចáŸáž‰â€‹áž–ី​បញ្ជី"</string>
+ <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"áž–áŸážáŸŒáž˜áž¶áž“​កម្មវិធី"</string>
+ <string name="status_bar_no_recent_apps" msgid="6576392951053994640">"គ្មាន​កម្មវិធី​ážáŸ’មីៗ"</string>
+ <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"បដិសáŸáž’​កម្មវិធី​ážáŸ’មីៗ"</string>
+ <plurals name="status_bar_accessibility_recent_apps">
+ <item quantity="one" msgid="5854176083865845541">"កម្មវិធី​ážáŸ’មី ១"</item>
+ <item quantity="other" msgid="1040784359794890744">"កម្មវិធី​ážáŸ’មីៗ %d"</item>
+ </plurals>
+ <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"គ្មាន​ការ​ជូន​ដំណឹង"</string>
+ <string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"បន្áž"</string>
+ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"ការ​ជូន​ដំណឹង"</string>
+ <string name="battery_low_title" msgid="2783104807551211639">"ភ្ជាប់​ឧបករណáŸâ€‹áž”ញ្ចូល​ážáŸ’ម"</string>
+ <string name="battery_low_subtitle" msgid="1752040062087829196">"ជិážâ€‹áž¢ážŸáŸ‹â€‹ážáŸ’ម​ហើយ។"</string>
+ <string name="battery_low_percent_format" msgid="1077244949318261761">"នៅ​សល់ <xliff:g id="NUMBER">%d%%</xliff:g>"</string>
+ <string name="invalid_charger" msgid="4549105996740522523">"មិន​គាំទ្រ​ការ​បញ្ចូល​ážáž¶áž˜â€‹áž™áž¼áž¢áŸážŸáž”៊ី។\nប្រើ​ážáŸ‚​ឧបករណáŸâ€‹áž”ញ្ចូល​ážáŸ’ម​ដែល​បាន​ផ្ដល់។"</string>
+ <string name="battery_low_why" msgid="7279169609518386372">"ការ​ប្រើ​ážáŸ’ម"</string>
+ <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"ការ​កំណážáŸ‹"</string>
+ <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"វ៉ាយហ្វាយ"</string>
+ <string name="status_bar_settings_airplane" msgid="4879879698500955300">"áž–áŸáž›â€‹áž‡áž·áŸ‡â€‹áž™áž“្ážáž áŸ„ះ"</string>
+ <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"បង្វិល​អáŸáž€áŸ’រង់​ស្វáŸáž™â€‹áž”្រវážáŸ’ážáž·"</string>
+ <string name="status_bar_settings_mute_label" msgid="554682549917429396">"ស្ងាážáŸ‹"</string>
+ <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"ស្វáŸáž™áž”្រវážáŸ’ážáž·"</string>
+ <string name="status_bar_settings_notifications" msgid="397146176280905137">"ការ​ជូន​ដំណឹង"</string>
+ <string name="bluetooth_tethered" msgid="7094101612161133267">"បាន​ភ្ជាប់​ប៊្លូធូស"</string>
+ <string name="status_bar_input_method_settings_configure_input_methods" msgid="3504292471512317827">"រៀបចំ​វិធីសាស្ážáŸ’រ​បញ្ចូល"</string>
+ <string name="status_bar_use_physical_keyboard" msgid="7551903084416057810">"ក្ដារ​ចុច​ពិážáž”្រាកដ"</string>
+ <string name="usb_device_permission_prompt" msgid="834698001271562057">"ឲ្យ​កម្មវិធី <xliff:g id="APPLICATION">%1$s</xliff:g> ចូល​ដំណើរការ​ឧបករណáŸâ€‹áž™áž¼áž¢áŸážŸáž”៊ី?"</string>
+ <string name="usb_accessory_permission_prompt" msgid="5171775411178865750">"ឲ្យ​កម្មវិធី <xliff:g id="APPLICATION">%1$s</xliff:g> ចូល​ដំណើរការ​ឧបករណáŸâ€‹áž™áž¼áž¢áŸážŸáž”៊ី?"</string>
+ <string name="usb_device_confirm_prompt" msgid="5161205258635253206">"បើក <xliff:g id="ACTIVITY">%1$s</xliff:g> áž–áŸáž›â€‹áž”ាន​ភ្ជាប់​ឧបករណáŸâ€‹áž™áž¼áž¢áŸážŸáž”៊ី​នáŸáŸ‡?"</string>
+ <string name="usb_accessory_confirm_prompt" msgid="3808984931830229888">"បើក <xliff:g id="ACTIVITY">%1$s</xliff:g> áž–áŸáž›â€‹áž”ាន​ភ្ជាប់​ឧបករណáŸâ€‹áž™áž¼áž¢áŸážŸáž”៊ី?"</string>
+ <string name="usb_accessory_uri_prompt" msgid="513450621413733343">"គ្មាន​កម្មវិធី​បាន​ដំឡើង​ដំណើរការ​ជា​មួយ​ឧបករណáŸâ€‹áž™áž¼áž¢áŸážŸáž”៊ី។ ស្វែងយល់​បន្ážáŸ‚ម​អំពី​ឧបករណáŸâ€‹áž“áŸáŸ‡â€‹áž“ៅ <xliff:g id="URL">%1$s</xliff:g>"</string>
+ <string name="title_usb_accessory" msgid="4966265263465181372">"ឧបករណáŸâ€‹áž™áž¼áž¢áŸážŸáž”៊ី"</string>
+ <string name="label_view" msgid="6304565553218192990">"មើល"</string>
+ <string name="always_use_device" msgid="1450287437017315906">"ប្រើ​ážáž¶áž˜â€‹áž›áŸ†áž“ាំដើម​សម្រាប់​ឧបករណáŸâ€‹áž™áž¼áž¢áŸážŸáž”៊ី​នáŸáŸ‡"</string>
+ <string name="always_use_accessory" msgid="1210954576979621596">"ប្រើ​ážáž¶áž˜â€‹áž›áŸ†áž“ាំដើម​សម្រាប់​ážáŸ’សែ​យូអáŸážŸáž”៊ី​នáŸáŸ‡"</string>
+ <string name="usb_debugging_title" msgid="4513918393387141949">"អនុញ្ញាážâ€‹áž€áž¶ážšâ€‹áž€áŸ‚​កំហុស​យូអáŸážŸáž”៊ី?"</string>
+ <string name="usb_debugging_message" msgid="2220143855912376496">"ស្នាម​ម្រាម​ដៃ​ RSA របស់​កុំព្យូទáŸážšâ€‹áž‚ឺ៖ \n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
+ <string name="usb_debugging_always" msgid="303335496705863070">"អនុញ្ញាážâ€‹áž‡áž¶â€‹áž“ិច្ច​សម្រាប់​កុំព្យូទáŸážšâ€‹áž“áŸáŸ‡"</string>
+ <string name="compat_mode_on" msgid="6623839244840638213">"ពង្រីក​​ដើម្បី​ឲ្យ​ពáŸáž‰â€‹áž¢áŸáž€áŸ’រង់"</string>
+ <string name="compat_mode_off" msgid="4434467572461327898">"ទាញ​ដើម្បី​ឲ្យ​ពáŸáž‰â€‹áž¢áŸáž€áŸ’រង់"</string>
+ <string name="screenshot_saving_ticker" msgid="7403652894056693515">"កំពុង​រក្សាទុក​រូបážážâ€‹áž¢áŸáž€áŸ’រង់…"</string>
+ <string name="screenshot_saving_title" msgid="8242282144535555697">"កំពុង​រក្សាទុក​រូបážážâ€‹áž¢áŸáž€áŸ’រង់..."</string>
+ <string name="screenshot_saving_text" msgid="2419718443411738818">"រូបážážâ€‹áž¢áŸáž€áŸ’រង់​កំពុង​ážáŸ’រូវ​បាន​រក្សាទុក។"</string>
+ <string name="screenshot_saved_title" msgid="6461865960961414961">"បាន​ចាប់​យក​រូបážážâ€‹áž¢áŸáž€áŸ’រង់។"</string>
+ <string name="screenshot_saved_text" msgid="1152839647677558815">"ប៉ះ ​ដើម្បី​មើល​រូបážážâ€‹áž¢áŸáž€áŸ’រង់​របស់​អ្នក​។"</string>
+ <string name="screenshot_failed_title" msgid="705781116746922771">"មិន​អាច​ចាប់​យក​រូប​ážážâ€‹áž¢áŸáž€áŸ’រង់​។"</string>
+ <string name="screenshot_failed_text" msgid="8134011269572415402">"មិន​អាច​រក្សាទុក​រូបážážâ€‹áž¢áŸáž€áŸ’រង់​។ ឧបករណáŸâ€‹áž•្ទុក​អាច​កំពុង​ប្រើ​​។"</string>
+ <string name="usb_preference_title" msgid="6551050377388882787">"ជម្រើស​ផ្ទáŸážšâ€‹áž¯áž€ážŸáž¶ážšâ€‹ážáž¶áž˜â€‹áž™áž¼áž¢áŸážŸáž”៊ី"</string>
+ <string name="use_mtp_button_title" msgid="4333504413563023626">"ភ្ជាប់​ជា​កម្មវិធី​ចាក់​មáŸážŒáŸ€ (MTP)"</string>
+ <string name="use_ptp_button_title" msgid="7517127540301625751">"ភ្ជាប់​ជា​ម៉ាស៊ីន​ážáž (PTP)"</string>
+ <string name="installer_cd_button_title" msgid="2312667578562201583">"ដំឡើង​កម្មវិធី​ផ្ទáŸážšâ€‹áž¯áž€ážŸáž¶ážš Android សម្រាប់ Mac"</string>
+ <string name="accessibility_back" msgid="567011538994429120">"ážáž™áž€áŸ’រោយ"</string>
+ <string name="accessibility_home" msgid="8217216074895377641">"áž‚áŸáž â€‹áž‘ំពáŸážš"</string>
+ <string name="accessibility_menu" msgid="316839303324695949">"ម៉ឺនុយ"</string>
+ <string name="accessibility_recent" msgid="8571350598987952883">"កម្មវិធី​ážáŸ’មីៗ"</string>
+ <string name="accessibility_search_light" msgid="1103867596330271848">"ស្វែងរក"</string>
+ <string name="accessibility_camera_button" msgid="8064671582820358152">"ម៉ាស៊ីន​ážáž"</string>
+ <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"ប្ដូរ​ប៊ូážáž»áž„​វិធីសាស្ážáŸ’រ​បញ្ចូល។"</string>
+ <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"ប៊ូážáž»áž„​ពង្រីក​ážáŸ’រូវ​គ្នា។"</string>
+ <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"ពង្រីក/បង្រួម​​អáŸáž€áŸ’រង់​ពី​​ទៅធំ"</string>
+ <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"បាន​ážáž—្ជាប់​ប៊្លូធូស។"</string>
+ <string name="accessibility_bluetooth_disconnected" msgid="7416648669976870175">"បាន​ផ្ដាច់​​ប៊្លូធូស។"</string>
+ <string name="accessibility_no_battery" msgid="358343022352820946">"គ្មាន​ážáŸ’ម។"</string>
+ <string name="accessibility_battery_one_bar" msgid="7774887721891057523">"ážáŸ’ម​មួយ​កាំ។"</string>
+ <string name="accessibility_battery_two_bars" msgid="8500650438735009973">"ážáŸ’ម​ពីរ​កាំ។"</string>
+ <string name="accessibility_battery_three_bars" msgid="2302983330865040446">"ážáŸ’ម​ទាំង​បី​​កាំ​។"</string>
+ <string name="accessibility_battery_full" msgid="8909122401720158582">"ážáŸ’ម​ពáŸáž‰â€‹áž áž¾áž™áŸ”"</string>
+ <string name="accessibility_no_phone" msgid="4894708937052611281">"គ្មាន​ទូរសáŸáž–្ទ។"</string>
+ <string name="accessibility_phone_one_bar" msgid="687699278132664115">"សáŸážœáž¶â€‹áž‘ូរសáŸáž–្ទ​មួយ​កាំ។"</string>
+ <string name="accessibility_phone_two_bars" msgid="8384905382804815201">"សáŸážœáž¶â€‹áž‘ូរសáŸáž–្ទ​ពីរ​កាំ។"</string>
+ <string name="accessibility_phone_three_bars" msgid="8521904843919971885">"សáŸážœáž¶â€‹áž‘ូរសáŸáž–្ទ​បី​កាំ​។"</string>
+ <string name="accessibility_phone_signal_full" msgid="6471834868580757898">"សáŸážœáž¶â€‹áž‘ូរសáŸáž–្ទ​ពáŸáž‰áŸ”"</string>
+ <string name="accessibility_no_data" msgid="4791966295096867555">"គ្មាន​ទិន្ននáŸáž™â€‹áŸ”"</string>
+ <string name="accessibility_data_one_bar" msgid="1415625833238273628">"ទិន្ននáŸáž™â€‹áž˜áž½áž™â€‹â€‹áž€áž¶áŸ†áŸ”"</string>
+ <string name="accessibility_data_two_bars" msgid="6166018492360432091">"ទិន្ននáŸáž™â€‹áž–ីរ​​កាំ។"</string>
+ <string name="accessibility_data_three_bars" msgid="9167670452395038520">"ទិន្ននáŸáž™â€‹áž”ី​កាំ។"</string>
+ <string name="accessibility_data_signal_full" msgid="2708384608124519369">"សញ្ញា​ទិន្ននáŸáž™â€‹áž–áŸáž‰áŸ”"</string>
+ <string name="accessibility_wifi_off" msgid="3177380296697933627">"បិទ​វ៉ាយហ្វាយ។"</string>
+ <string name="accessibility_no_wifi" msgid="1425476551827924474">"បាន​ផ្ដាច់​វ៉ាយហ្វាយ។"</string>
+ <string name="accessibility_wifi_one_bar" msgid="7735893178010724377">"សញ្ញា​វ៉ាយហ្វាយ​មួយ​កាំ។"</string>
+ <string name="accessibility_wifi_two_bars" msgid="4994274250497262434">"សáŸážœáž¶â€‹ážœáŸ‰áž¶áž™áž áŸ’វាយ​ពីរ​កាំ។"</string>
+ <string name="accessibility_wifi_three_bars" msgid="3495755044276588384">"វ៉ាយហ្វាយ​បី​កាំ។"</string>
+ <string name="accessibility_wifi_signal_full" msgid="6853561303586480376">"សញ្ញា​វ៉ាយហ្វាយ​ពáŸáž‰áŸ”"</string>
+ <string name="accessibility_no_wimax" msgid="4329180129727630368">"គ្មាន WiMAX ។"</string>
+ <string name="accessibility_wimax_one_bar" msgid="4170994299011863648">"WiMAX មួយ​កាំ។"</string>
+ <string name="accessibility_wimax_two_bars" msgid="9176236858336502288">"WiMAX ពីរ​កាំ។"</string>
+ <string name="accessibility_wimax_three_bars" msgid="6116551636752103927">"WiMAX បី​កាំ។"</string>
+ <string name="accessibility_wimax_signal_full" msgid="2768089986795579558">"សញ្ញា WiMAX áž–áŸáž‰áŸ”"</string>
+ <string name="accessibility_no_signal" msgid="7064645320782585167">"គ្មាន​សញ្ញា។"</string>
+ <string name="accessibility_not_connected" msgid="6395326276213402883">"មិន​បាន​ážáž—្ជាប់​។"</string>
+ <string name="accessibility_zero_bars" msgid="3806060224467027887">"សូន្យ​កាំ។"</string>
+ <string name="accessibility_one_bar" msgid="1685730113192081895">"មួយ​កាំ។"</string>
+ <string name="accessibility_two_bars" msgid="6437363648385206679">"ពីរ​កាំ។"</string>
+ <string name="accessibility_three_bars" msgid="2648241415119396648">"បី​កាំ។"</string>
+ <string name="accessibility_signal_full" msgid="9122922886519676839">"សញ្ញា​ពáŸáž‰â€‹â€‹áŸ”"</string>
+ <string name="accessibility_desc_on" msgid="2385254693624345265">"បើក។"</string>
+ <string name="accessibility_desc_off" msgid="6475508157786853157">"បិទ"</string>
+ <string name="accessibility_desc_connected" msgid="8366256693719499665">"បាន​ážáž—្ជាប់។"</string>
+ <string name="accessibility_data_connection_gprs" msgid="1606477224486747751">"GPRS"</string>
+ <string name="accessibility_data_connection_1x" msgid="994133468120244018">"1 X"</string>
+ <string name="accessibility_data_connection_hspa" msgid="2032328855462645198">"HSPA"</string>
+ <string name="accessibility_data_connection_3g" msgid="8628562305003568260">"3G"</string>
+ <string name="accessibility_data_connection_3.5g" msgid="8664845609981692001">"3.5G"</string>
+ <string name="accessibility_data_connection_4g" msgid="7741000750630089612">"4G"</string>
+ <string name="accessibility_data_connection_lte" msgid="5413468808637540658">"LTE"</string>
+ <string name="accessibility_data_connection_cdma" msgid="6132648193978823023">"CDMA"</string>
+ <string name="accessibility_data_connection_roaming" msgid="5977362333466556094">"រ៉ូ​មីង"</string>
+ <string name="accessibility_data_connection_edge" msgid="4477457051631979278">"Edge"</string>
+ <string name="accessibility_data_connection_wifi" msgid="2324496756590645221">"វ៉ាយហ្វាយ"</string>
+ <string name="accessibility_no_sim" msgid="8274017118472455155">"គ្មាន​ស៊ីម​កាážáŸ”"</string>
+ <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"ការ​ភ្ជាប់​ប៊្លូធូស។"</string>
+ <string name="accessibility_airplane_mode" msgid="834748999790763092">"របៀប​​ពáŸáž›áž‡áž·áŸ‡â€‹áž™áž“្ážáž áŸ„ះ"</string>
+ <string name="accessibility_battery_level" msgid="7451474187113371965">"ážáŸ’ម <xliff:g id="NUMBER">%d</xliff:g> ភាគរយ។"</string>
+ <string name="accessibility_settings_button" msgid="799583911231893380">"ការ​កំណážáŸ‹â€‹áž”្រពáŸáž“្ធ​។"</string>
+ <string name="accessibility_notifications_button" msgid="4498000369779421892">"ការ​ជូន​ដំណឹង។"</string>
+ <string name="accessibility_remove_notification" msgid="3603099514902182350">"សម្អាážâ€‹áž€áž¶ážšâ€‹áž‡áž¼áž“​ដំណឹង។"</string>
+ <string name="accessibility_gps_enabled" msgid="3511469499240123019">"បាន​បើក GPS ។"</string>
+ <string name="accessibility_gps_acquiring" msgid="8959333351058967158">"ទទួល​​ GPS ។"</string>
+ <string name="accessibility_tty_enabled" msgid="4613200365379426561">"បាន​បើក​ម៉ាស៊ីន​អង្គុលីលáŸáž"</string>
+ <string name="accessibility_ringer_vibrate" msgid="666585363364155055">"កម្មវិធី​រោទáŸâ€‹áž‰áŸážšáŸ”"</string>
+ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"កម្មវិធី​រោទáŸâ€‹ážŸáŸ’ងាážáŸ‹áŸ”"</string>
+ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> បដិសáŸáž’។"</string>
+ <string name="accessibility_notification_dismissed" msgid="854211387186306927">"បាន​បដិសáŸáž’​ការ​ជូនដំណឹង"</string>
+ <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"ពណ៌​ការ​ជូន​ដំណឹង"</string>
+ <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"ការ​កំណážáŸ‹â€‹ážšáž áŸážŸáŸ”"</string>
+ <string name="accessibility_desc_recent_apps" msgid="9014032916410590027">"កម្មវិធី​ážáŸ’មី​ៗ។"</string>
+ <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"អ្នក​ប្រើ <xliff:g id="USER">%s</xliff:g> ។"</string>
+ <string name="accessibility_quick_settings_wifi" msgid="6099781031669728709">"<xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="NETWORK">%2$s</xliff:g>"</string>
+ <string name="accessibility_quick_settings_mobile" msgid="4876806564086241341">"áž…áž›áŸáž <xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="TYPE">%2$s</xliff:g>. <xliff:g id="NETWORK">%3$s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"ážáŸ’ម <xliff:g id="STATE">%s</xliff:g> ។"</string>
+ <string name="accessibility_quick_settings_airplane" msgid="4196876722090224753">"របៀបពáŸáž›â€‹áž‡áž·áŸ‡â€‹áž™áž“្ážâ€‹áž áŸ„ះ <xliff:g id="STATE">%s</xliff:g> ។"</string>
+ <string name="accessibility_quick_settings_bluetooth" msgid="5749054971341882340">"ប៊្លូធូស <xliff:g id="STATE">%s</xliff:g> ។"</string>
+ <string name="accessibility_quick_settings_location" msgid="4577282329866813100">"ទីážáž¶áŸ†áž„ <xliff:g id="STATE">%s</xliff:g> ។"</string>
+ <string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"កំណážáŸ‹â€‹ážŸáŸ†áž¡áŸáž„​រោទáŸâ€‹ážŸáž˜áŸ’រាប់ <xliff:g id="TIME">%s</xliff:g> ។"</string>
+ <string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"បាន​បិទ​ទិន្ននáŸáž™ 2G-3G"</string>
+ <string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"បាន​បិទ​ទិន្ននáŸáž™ 4G"</string>
+ <string name="data_usage_disabled_dialog_mobile_title" msgid="1046047248844821202">"បាន​បិទ​ទិន្ននáŸáž™â€‹áž…áž›áŸáž"</string>
+ <string name="data_usage_disabled_dialog_title" msgid="2086815304858964954">"បាន​បិទ​ទិន្ននáŸáž™"</string>
+ <string name="data_usage_disabled_dialog" msgid="3853117269051806280">"អ្នក​បាន​ដល់​ដែន​កំណážáŸ‹â€‹áž”្រើ​ទិន្ននáŸáž™â€‹áž”ាន​បញ្ជាក់។\n\nបើ​អ្នក​បើក​ទិន្ននáŸáž™â€‹áž¡áž¾áž„វិញ អ្នក​អាច​ážáŸ’រូវ​បាន​ប្ដូរ​ដោយ​ប្រážáž·áž”ážáŸ’ážáž·â€‹áž€ážšáŸ”"</string>
+ <string name="data_usage_disabled_dialog_enable" msgid="7729772039208664606">"បើក​​ទិន្ននáŸáž™â€‹áž¡áž¾áž„វិញ"</string>
+ <string name="status_bar_settings_signal_meter_disconnected" msgid="1940231521274147771">"គ្មាន​ការ​ážáž—្ជាប់​អ៊ីនធឺណិáž"</string>
+ <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"បាន​ភ្ជាប់​វ៉ាយហ្វាយ"</string>
+ <string name="gps_notification_searching_text" msgid="8574247005642736060">"ស្វែងរក GPS"</string>
+ <string name="gps_notification_found_text" msgid="4619274244146446464">"ទីážáž¶áŸ†áž„​​​​​កំណážáŸ‹â€‹ážŠáŸ„áž™ GPS"</string>
+ <string name="accessibility_location_active" msgid="2427290146138169014">"សំណើ​ទីážáž¶áŸ†áž„​សកម្ម"</string>
+ <string name="accessibility_clear_all" msgid="5235938559247164925">"សម្អាážâ€‹áž€áž¶ážšâ€‹áž‡áž¼áž“​ដំណឹង​ទាំងអស់។"</string>
+ <string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"áž–áŸážáŸŒáž˜áž¶áž“​កម្មវិធី"</string>
+ <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"នឹង​បង្វិល​អáŸáž€áŸ’រង់​ស្វáŸáž™â€‹áž”្រវážáŸ’ážáž·áŸ”"</string>
+ <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"អáŸáž€áŸ’រង់​ជាប់​សោ​ក្នុង​ទិស​ផ្ដáŸáž€áŸ”"</string>
+ <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"បា​ន​ចាក់​សោ​អáŸáž€áŸ’រង់​​ក្នុង​ទិស​បញ្ឈរ។"</string>
+ <string name="dessert_case" msgid="1295161776223959221">"ករណី Dessert"</string>
+ <string name="start_dreams" msgid="7219575858348719790">"ស្រមើ​ស្រមៃ"</string>
+ <string name="ethernet_label" msgid="7967563676324087464">"អ៊ីសឺរណិáž"</string>
+ <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"របៀបពáŸáž›â€‹â€‹áž‡áž·áŸ‡â€‹áž™áž“្ážáž áŸ„ះ"</string>
+ <string name="quick_settings_battery_charging_label" msgid="490074774465309209">"បញ្ចូល​ážáŸ’ម <xliff:g id="NUMBER">%d</xliff:g> <xliff:g id="PERCENT">%%</xliff:g>"</string>
+ <string name="quick_settings_battery_charged_label" msgid="8865413079414246081">"បាន​បញ្ចូល​ពáŸáž‰"</string>
+ <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"ប៊្លូធូស"</string>
+ <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"ប៊្លូធូស (ឧបករណ០<xliff:g id="NUMBER">%d</xliff:g>)"</string>
+ <string name="quick_settings_bluetooth_off_label" msgid="8159652146149219937">"បិទ​ប៊្លូធូស"</string>
+ <string name="quick_settings_brightness_label" msgid="6968372297018755815">"ពន្លឺ"</string>
+ <string name="quick_settings_rotation_unlocked_label" msgid="336054930362580584">"បង្វិល​​ស្វáŸáž™â€‹áž”្រវážáŸ’ážáž·"</string>
+ <string name="quick_settings_rotation_locked_label" msgid="8058646447242565486">"បាន​ចាក់​សោ​ការ​បង្វិល"</string>
+ <string name="quick_settings_ime_label" msgid="7073463064369468429">"វិធីសាស្ážáŸ’រ​បញ្ចូល"</string>
+ <string name="quick_settings_location_label" msgid="5011327048748762257">"ទី​ážáž¶áŸ†áž„"</string>
+ <string name="quick_settings_location_off_label" msgid="7464544086507331459">"ទីážáž¶áŸ†áž„​បិទ"</string>
+ <string name="quick_settings_media_device_label" msgid="1302906836372603762">"ឧបករណáŸâ€‹áž˜áŸážŒáŸ€"</string>
+ <string name="quick_settings_rssi_label" msgid="7725671335550695589">"RSSI"</string>
+ <string name="quick_settings_rssi_emergency_only" msgid="2713774041672886750">"សម្រាប់​ážáŸ‚​ការ​ហៅ​ពáŸáž›â€‹áž¢áž¶ážŸáž“្ន"</string>
+ <string name="quick_settings_settings_label" msgid="5326556592578065401">"ការ​កំណážáŸ‹"</string>
+ <string name="quick_settings_time_label" msgid="4635969182239736408">"áž–áŸáž›ážœáŸáž›áž¶"</string>
+ <string name="quick_settings_user_label" msgid="5238995632130897840">"ážáŸ’ញុំ"</string>
+ <string name="quick_settings_wifi_label" msgid="9135344704899546041">"វ៉ាយហ្វាយ"</string>
+ <string name="quick_settings_wifi_not_connected" msgid="7171904845345573431">"មិន​បាន​ážáž—្ជាប់"</string>
+ <string name="quick_settings_wifi_no_network" msgid="2221993077220856376">"គ្មាន​បណ្ដាញ"</string>
+ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"បិទ​វ៉ាយហ្វាយ"</string>
+ <string name="quick_settings_wifi_display_label" msgid="6893592964463624333">"បង្ហា​ញ​វ៉ាយហ្វាយ"</string>
+ <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"​បង្ហាញ​បណ្ដាញ​ឥážâ€‹ážáŸ’សែ"</string>
+ <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"ពន្លឺ"</string>
+ <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"ស្វáŸáž™áž”្រវážáŸ’ážáž·"</string>
+ <string name="quick_settings_inversion_label" msgid="1666358784283020762">"របៀប​​បញ្ច្រាស​ពណ៌"</string>
+ <string name="quick_settings_contrast_label" msgid="3319507551689108692">"របៀប​កម្រិážâ€‹áž–ណ៌​ប្រ​សើ​រ​ឡើង"</string>
+ <string name="quick_settings_color_space_label" msgid="853443689745584770">"របៀប​កែ​ពណ៌"</string>
+ <string name="ssl_ca_cert_warning" msgid="9005954106902053641">"បណ្ដាញ​អាច​\nážáŸ’រូវ​បាន​ážáŸ’ážšáž½ážáž–ិនិážáŸ’áž™"</string>
+</resources>
diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml
new file mode 100644
index 0000000..f972925
--- /dev/null
+++ b/packages/SystemUI/res/values-km/strings.xml
@@ -0,0 +1,204 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="7164937344850004466">"ចំណុច​ប្រទាក់​ប្រពáŸáž“្ធ"</string>
+ <string name="status_bar_clear_all_button" msgid="7774721344716731603">"សម្អាáž"</string>
+ <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"យក​ចáŸáž‰â€‹áž–ី​បញ្ជី"</string>
+ <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"áž–áŸážáŸŒáž˜áž¶áž“​កម្មវិធី"</string>
+ <string name="status_bar_no_recent_apps" msgid="6576392951053994640">"គ្មាន​កម្មវិធី​ážáŸ’មីៗ"</string>
+ <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"បដិសáŸáž’​កម្មវិធី​ážáŸ’មីៗ"</string>
+ <plurals name="status_bar_accessibility_recent_apps">
+ <item quantity="one" msgid="5854176083865845541">"កម្មវិធី​ážáŸ’មី ១"</item>
+ <item quantity="other" msgid="1040784359794890744">"កម្មវិធី​ážáŸ’មីៗ %d"</item>
+ </plurals>
+ <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"គ្មាន​ការ​ជូន​ដំណឹង"</string>
+ <string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"បន្áž"</string>
+ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"ការ​ជូន​ដំណឹង"</string>
+ <string name="battery_low_title" msgid="2783104807551211639">"ភ្ជាប់​ឧបករណáŸâ€‹áž”ញ្ចូល​ážáŸ’ម"</string>
+ <string name="battery_low_subtitle" msgid="1752040062087829196">"ជិážâ€‹áž¢ážŸáŸ‹â€‹ážáŸ’ម​ហើយ។"</string>
+ <string name="battery_low_percent_format" msgid="1077244949318261761">"នៅ​សល់ <xliff:g id="NUMBER">%d%%</xliff:g>"</string>
+ <string name="invalid_charger" msgid="4549105996740522523">"មិន​គាំទ្រ​ការ​បញ្ចូល​ážáž¶áž˜â€‹áž™áž¼áž¢áŸážŸáž”៊ី។\nប្រើ​ážáŸ‚​ឧបករណáŸâ€‹áž”ញ្ចូល​ážáŸ’ម​ដែល​បាន​ផ្ដល់។"</string>
+ <string name="battery_low_why" msgid="7279169609518386372">"ការ​ប្រើ​ážáŸ’ម"</string>
+ <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"ការ​កំណážáŸ‹"</string>
+ <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"វ៉ាយហ្វាយ"</string>
+ <string name="status_bar_settings_airplane" msgid="4879879698500955300">"áž–áŸáž›â€‹áž‡áž·áŸ‡â€‹áž™áž“្ážáž áŸ„ះ"</string>
+ <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"បង្វិល​អáŸáž€áŸ’រង់​ស្វáŸáž™â€‹áž”្រវážáŸ’ážáž·"</string>
+ <string name="status_bar_settings_mute_label" msgid="554682549917429396">"ស្ងាážáŸ‹"</string>
+ <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"ស្វáŸáž™áž”្រវážáŸ’ážáž·"</string>
+ <string name="status_bar_settings_notifications" msgid="397146176280905137">"ការ​ជូន​ដំណឹង"</string>
+ <string name="bluetooth_tethered" msgid="7094101612161133267">"បាន​ភ្ជាប់​ប៊្លូធូស"</string>
+ <string name="status_bar_input_method_settings_configure_input_methods" msgid="3504292471512317827">"រៀបចំ​វិធីសាស្ážáŸ’រ​បញ្ចូល"</string>
+ <string name="status_bar_use_physical_keyboard" msgid="7551903084416057810">"ក្ដារ​ចុច​ពិážáž”្រាកដ"</string>
+ <string name="usb_device_permission_prompt" msgid="834698001271562057">"ឲ្យ​កម្មវិធី <xliff:g id="APPLICATION">%1$s</xliff:g> ចូល​ដំណើរការ​ឧបករណáŸâ€‹áž™áž¼áž¢áŸážŸáž”៊ី?"</string>
+ <string name="usb_accessory_permission_prompt" msgid="5171775411178865750">"ឲ្យ​កម្មវិធី <xliff:g id="APPLICATION">%1$s</xliff:g> ចូល​ដំណើរការ​ឧបករណáŸâ€‹áž™áž¼áž¢áŸážŸáž”៊ី?"</string>
+ <string name="usb_device_confirm_prompt" msgid="5161205258635253206">"បើក <xliff:g id="ACTIVITY">%1$s</xliff:g> áž–áŸáž›â€‹áž”ាន​ភ្ជាប់​ឧបករណáŸâ€‹áž™áž¼áž¢áŸážŸáž”៊ី​នáŸáŸ‡?"</string>
+ <string name="usb_accessory_confirm_prompt" msgid="3808984931830229888">"បើក <xliff:g id="ACTIVITY">%1$s</xliff:g> áž–áŸáž›â€‹áž”ាន​ភ្ជាប់​ឧបករណáŸâ€‹áž™áž¼áž¢áŸážŸáž”៊ី?"</string>
+ <string name="usb_accessory_uri_prompt" msgid="513450621413733343">"គ្មាន​កម្មវិធី​បាន​ដំឡើង​ដំណើរការ​ជា​មួយ​ឧបករណáŸâ€‹áž™áž¼áž¢áŸážŸáž”៊ី។ ស្វែងយល់​បន្ážáŸ‚ម​អំពី​ឧបករណáŸâ€‹áž“áŸáŸ‡â€‹áž“ៅ <xliff:g id="URL">%1$s</xliff:g>"</string>
+ <string name="title_usb_accessory" msgid="4966265263465181372">"ឧបករណáŸâ€‹áž™áž¼áž¢áŸážŸáž”៊ី"</string>
+ <string name="label_view" msgid="6304565553218192990">"មើល"</string>
+ <string name="always_use_device" msgid="1450287437017315906">"ប្រើ​ážáž¶áž˜â€‹áž›áŸ†áž“ាំដើម​សម្រាប់​ឧបករណáŸâ€‹áž™áž¼áž¢áŸážŸáž”៊ី​នáŸáŸ‡"</string>
+ <string name="always_use_accessory" msgid="1210954576979621596">"ប្រើ​ážáž¶áž˜â€‹áž›áŸ†áž“ាំដើម​សម្រាប់​ážáŸ’សែ​យូអáŸážŸáž”៊ី​នáŸáŸ‡"</string>
+ <string name="usb_debugging_title" msgid="4513918393387141949">"អនុញ្ញាážâ€‹áž€áž¶ážšâ€‹áž€áŸ‚​កំហុស​យូអáŸážŸáž”៊ី?"</string>
+ <string name="usb_debugging_message" msgid="2220143855912376496">"ស្នាម​ម្រាម​ដៃ​ RSA របស់​កុំព្យូទáŸážšâ€‹áž‚ឺ៖ \n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
+ <string name="usb_debugging_always" msgid="303335496705863070">"អនុញ្ញាážâ€‹áž‡áž¶â€‹áž“ិច្ច​សម្រាប់​កុំព្យូទáŸážšâ€‹áž“áŸáŸ‡"</string>
+ <string name="compat_mode_on" msgid="6623839244840638213">"ពង្រីក​​ដើម្បី​ឲ្យ​ពáŸáž‰â€‹áž¢áŸáž€áŸ’រង់"</string>
+ <string name="compat_mode_off" msgid="4434467572461327898">"ទាញ​ដើម្បី​ឲ្យ​ពáŸáž‰â€‹áž¢áŸáž€áŸ’រង់"</string>
+ <string name="compat_mode_help_header" msgid="7969493989397529910">"ការ​ពង្រីក​ážáŸ’រូវ​គ្នា"</string>
+ <string name="compat_mode_help_body" msgid="4946726776359270040">"áž–áŸáž›â€‹áž€áž˜áŸ’មវិធី​ážáŸ’រូវ​បាន​រៀបចំ​សម្រាប់​អáŸáž€áŸ’រង់​ážáž¼áž… ការ​គ្រប់គ្រង​ការ​ពង្រីក​នឹង​បង្ហាញ​ážáž¶áž˜â€‹áž“ាឡិកា។"</string>
+ <string name="screenshot_saving_ticker" msgid="7403652894056693515">"កំពុង​រក្សាទុក​រូបážážâ€‹áž¢áŸáž€áŸ’រង់…"</string>
+ <string name="screenshot_saving_title" msgid="8242282144535555697">"កំពុង​រក្សាទុក​រូបážážâ€‹áž¢áŸáž€áŸ’រង់..."</string>
+ <string name="screenshot_saving_text" msgid="2419718443411738818">"រូបážážâ€‹áž¢áŸáž€áŸ’រង់​កំពុង​ážáŸ’រូវ​បាន​រក្សាទុក។"</string>
+ <string name="screenshot_saved_title" msgid="6461865960961414961">"បាន​ចាប់​យក​រូបážážâ€‹áž¢áŸáž€áŸ’រង់។"</string>
+ <string name="screenshot_saved_text" msgid="1152839647677558815">"ប៉ះ ​ដើម្បី​មើល​រូបážážâ€‹áž¢áŸáž€áŸ’រង់​របស់​អ្នក​។"</string>
+ <string name="screenshot_failed_title" msgid="705781116746922771">"មិន​អាច​ចាប់​យក​រូប​ážážâ€‹áž¢áŸáž€áŸ’រង់​។"</string>
+ <string name="screenshot_failed_text" msgid="8134011269572415402">"មិន​អាច​រក្សាទុក​រូបážážâ€‹áž¢áŸáž€áŸ’រង់​។ ឧបករណáŸâ€‹áž•្ទុក​អាច​កំពុង​ប្រើ​​។"</string>
+ <string name="usb_preference_title" msgid="6551050377388882787">"ជម្រើស​ផ្ទáŸážšâ€‹áž¯áž€ážŸáž¶ážšâ€‹ážáž¶áž˜â€‹áž™áž¼áž¢áŸážŸáž”៊ី"</string>
+ <string name="use_mtp_button_title" msgid="4333504413563023626">"ភ្ជាប់​ជា​កម្មវិធី​ចាក់​មáŸážŒáŸ€ (MTP)"</string>
+ <string name="use_ptp_button_title" msgid="7517127540301625751">"ភ្ជាប់​ជា​ម៉ាស៊ីន​ážáž (PTP)"</string>
+ <string name="installer_cd_button_title" msgid="2312667578562201583">"ដំឡើង​កម្មវិធី​ផ្ទáŸážšâ€‹áž¯áž€ážŸáž¶ážš Android សម្រាប់ Mac"</string>
+ <string name="accessibility_back" msgid="567011538994429120">"ážáž™áž€áŸ’រោយ"</string>
+ <string name="accessibility_home" msgid="8217216074895377641">"áž‚áŸáž â€‹áž‘ំពáŸážš"</string>
+ <string name="accessibility_menu" msgid="316839303324695949">"ម៉ឺនុយ"</string>
+ <string name="accessibility_recent" msgid="8571350598987952883">"កម្មវិធី​ážáŸ’មីៗ"</string>
+ <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"ប្ដូរ​ប៊ូážáž»áž„​វិធីសាស្ážáŸ’រ​បញ្ចូល។"</string>
+ <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"ប៊ូážáž»áž„​ពង្រីក​ážáŸ’រូវ​គ្នា។"</string>
+ <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"ពង្រីក/បង្រួម​​អáŸáž€áŸ’រង់​ពី​​ទៅធំ"</string>
+ <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"បាន​ážáž—្ជាប់​ប៊្លូធូស។"</string>
+ <string name="accessibility_bluetooth_disconnected" msgid="7416648669976870175">"បាន​ផ្ដាច់​​ប៊្លូធូស។"</string>
+ <string name="accessibility_no_battery" msgid="358343022352820946">"គ្មាន​ážáŸ’ម។"</string>
+ <string name="accessibility_battery_one_bar" msgid="7774887721891057523">"ážáŸ’ម​មួយ​កាំ។"</string>
+ <string name="accessibility_battery_two_bars" msgid="8500650438735009973">"ážáŸ’ម​ពីរ​កាំ។"</string>
+ <string name="accessibility_battery_three_bars" msgid="2302983330865040446">"ážáŸ’ម​ទាំង​បី​​កាំ​។"</string>
+ <string name="accessibility_battery_full" msgid="8909122401720158582">"ážáŸ’ម​ពáŸáž‰â€‹áž áž¾áž™áŸ”"</string>
+ <string name="accessibility_no_phone" msgid="4894708937052611281">"គ្មាន​ទូរសáŸáž–្ទ។"</string>
+ <string name="accessibility_phone_one_bar" msgid="687699278132664115">"សáŸážœáž¶â€‹áž‘ូរសáŸáž–្ទ​មួយ​កាំ។"</string>
+ <string name="accessibility_phone_two_bars" msgid="8384905382804815201">"សáŸážœáž¶â€‹áž‘ូរសáŸáž–្ទ​ពីរ​កាំ។"</string>
+ <string name="accessibility_phone_three_bars" msgid="8521904843919971885">"សáŸážœáž¶â€‹áž‘ូរសáŸáž–្ទ​បី​កាំ​។"</string>
+ <string name="accessibility_phone_signal_full" msgid="6471834868580757898">"សáŸážœáž¶â€‹áž‘ូរសáŸáž–្ទ​ពáŸáž‰áŸ”"</string>
+ <string name="accessibility_no_data" msgid="4791966295096867555">"គ្មាន​ទិន្ននáŸáž™â€‹áŸ”"</string>
+ <string name="accessibility_data_one_bar" msgid="1415625833238273628">"ទិន្ននáŸáž™â€‹áž˜áž½áž™â€‹â€‹áž€áž¶áŸ†áŸ”"</string>
+ <string name="accessibility_data_two_bars" msgid="6166018492360432091">"ទិន្ននáŸáž™â€‹áž–ីរ​​កាំ។"</string>
+ <string name="accessibility_data_three_bars" msgid="9167670452395038520">"ទិន្ននáŸáž™â€‹áž”ី​កាំ។"</string>
+ <string name="accessibility_data_signal_full" msgid="2708384608124519369">"សញ្ញា​ទិន្ននáŸáž™â€‹áž–áŸáž‰áŸ”"</string>
+ <string name="accessibility_wifi_off" msgid="3177380296697933627">"បិទ​វ៉ាយហ្វាយ។"</string>
+ <string name="accessibility_no_wifi" msgid="1425476551827924474">"បាន​ផ្ដាច់​វ៉ាយហ្វាយ។"</string>
+ <string name="accessibility_wifi_one_bar" msgid="7735893178010724377">"សញ្ញា​វ៉ាយហ្វាយ​មួយ​កាំ។"</string>
+ <string name="accessibility_wifi_two_bars" msgid="4994274250497262434">"សáŸážœáž¶â€‹ážœáŸ‰áž¶áž™áž áŸ’វាយ​ពីរ​កាំ។"</string>
+ <string name="accessibility_wifi_three_bars" msgid="3495755044276588384">"វ៉ាយហ្វាយ​បី​កាំ។"</string>
+ <string name="accessibility_wifi_signal_full" msgid="6853561303586480376">"សញ្ញា​វ៉ាយហ្វាយ​ពáŸáž‰áŸ”"</string>
+ <string name="accessibility_no_wimax" msgid="4329180129727630368">"គ្មាន WiMAX ។"</string>
+ <string name="accessibility_wimax_one_bar" msgid="4170994299011863648">"WiMAX មួយ​កាំ។"</string>
+ <string name="accessibility_wimax_two_bars" msgid="9176236858336502288">"WiMAX ពីរ​កាំ។"</string>
+ <string name="accessibility_wimax_three_bars" msgid="6116551636752103927">"WiMAX បី​កាំ។"</string>
+ <string name="accessibility_wimax_signal_full" msgid="2768089986795579558">"សញ្ញា WiMAX áž–áŸáž‰áŸ”"</string>
+ <string name="accessibility_no_signal" msgid="7064645320782585167">"គ្មាន​សញ្ញា។"</string>
+ <string name="accessibility_not_connected" msgid="6395326276213402883">"មិន​បាន​ážáž—្ជាប់​។"</string>
+ <string name="accessibility_zero_bars" msgid="3806060224467027887">"សូន្យ​កាំ។"</string>
+ <string name="accessibility_one_bar" msgid="1685730113192081895">"មួយ​កាំ។"</string>
+ <string name="accessibility_two_bars" msgid="6437363648385206679">"ពីរ​កាំ។"</string>
+ <string name="accessibility_three_bars" msgid="2648241415119396648">"បី​កាំ។"</string>
+ <string name="accessibility_signal_full" msgid="9122922886519676839">"សញ្ញា​ពáŸáž‰â€‹â€‹áŸ”"</string>
+ <string name="accessibility_desc_on" msgid="2385254693624345265">"បើក។"</string>
+ <string name="accessibility_desc_off" msgid="6475508157786853157">"បិទ"</string>
+ <string name="accessibility_desc_connected" msgid="8366256693719499665">"បាន​ážáž—្ជាប់។"</string>
+ <string name="accessibility_data_connection_gprs" msgid="1606477224486747751">"GPRS"</string>
+ <string name="accessibility_data_connection_1x" msgid="994133468120244018">"1 X"</string>
+ <string name="accessibility_data_connection_hspa" msgid="2032328855462645198">"HSPA"</string>
+ <string name="accessibility_data_connection_3g" msgid="8628562305003568260">"3G"</string>
+ <string name="accessibility_data_connection_3.5g" msgid="8664845609981692001">"3.5G"</string>
+ <string name="accessibility_data_connection_4g" msgid="7741000750630089612">"4G"</string>
+ <string name="accessibility_data_connection_lte" msgid="5413468808637540658">"LTE"</string>
+ <string name="accessibility_data_connection_cdma" msgid="6132648193978823023">"CDMA"</string>
+ <string name="accessibility_data_connection_roaming" msgid="5977362333466556094">"រ៉ូ​មីង"</string>
+ <string name="accessibility_data_connection_edge" msgid="4477457051631979278">"Edge"</string>
+ <string name="accessibility_data_connection_wifi" msgid="2324496756590645221">"វ៉ាយហ្វាយ"</string>
+ <string name="accessibility_no_sim" msgid="8274017118472455155">"គ្មាន​ស៊ីម​កាážáŸ”"</string>
+ <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"ការ​ភ្ជាប់​ប៊្លូធូស។"</string>
+ <string name="accessibility_airplane_mode" msgid="834748999790763092">"របៀប​​ជិះ​យន្ážáž áŸ„ះ"</string>
+ <string name="accessibility_battery_level" msgid="7451474187113371965">"ážáŸ’ម <xliff:g id="NUMBER">%d</xliff:g> ភាគរយ។"</string>
+ <string name="accessibility_settings_button" msgid="799583911231893380">"ការ​កំណážáŸ‹â€‹áž”្រពáŸáž“្ធ​។"</string>
+ <string name="accessibility_notifications_button" msgid="4498000369779421892">"ការ​ជូន​ដំណឹង។"</string>
+ <string name="accessibility_remove_notification" msgid="3603099514902182350">"សម្អាážâ€‹áž€áž¶ážšâ€‹áž‡áž¼áž“​ដំណឹង។"</string>
+ <string name="accessibility_gps_enabled" msgid="3511469499240123019">"បាន​បើក GPS ។"</string>
+ <string name="accessibility_gps_acquiring" msgid="8959333351058967158">"ទទួល​​ GPS ។"</string>
+ <string name="accessibility_tty_enabled" msgid="4613200365379426561">"បាន​បើក​ម៉ាស៊ីន​អង្គុលីលáŸáž"</string>
+ <string name="accessibility_ringer_vibrate" msgid="666585363364155055">"កម្មវិធី​រោទáŸâ€‹áž‰áŸážšáŸ”"</string>
+ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"កម្មវិធី​រោទáŸâ€‹ážŸáŸ’ងាážáŸ‹áŸ”"</string>
+ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> បដិសáŸáž’។"</string>
+ <string name="accessibility_notification_dismissed" msgid="854211387186306927">"បាន​បដិសáŸáž’​ការ​ជូនដំណឹង"</string>
+ <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"ពណ៌​ការ​ជូន​ដំណឹង"</string>
+ <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"ការ​កំណážáŸ‹â€‹ážšáž áŸážŸáŸ”"</string>
+ <string name="accessibility_desc_recent_apps" msgid="9014032916410590027">"កម្មវិធី​ážáŸ’មី​ៗ។"</string>
+ <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"អ្នក​ប្រើ <xliff:g id="USER">%s</xliff:g> ។"</string>
+ <string name="accessibility_quick_settings_wifi" msgid="6099781031669728709">"<xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="NETWORK">%2$s</xliff:g>"</string>
+ <string name="accessibility_quick_settings_mobile" msgid="4876806564086241341">"áž…áž›áŸáž <xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="TYPE">%2$s</xliff:g>. <xliff:g id="NETWORK">%3$s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"ážáŸ’ម <xliff:g id="STATE">%s</xliff:g> ។"</string>
+ <string name="accessibility_quick_settings_airplane" msgid="4196876722090224753">"របៀប​ជិះ​យន្ážâ€‹áž áŸ„ះ <xliff:g id="STATE">%s</xliff:g> ។"</string>
+ <string name="accessibility_quick_settings_bluetooth" msgid="5749054971341882340">"ប៊្លូធូស <xliff:g id="STATE">%s</xliff:g> ។"</string>
+ <string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"កំណážáŸ‹â€‹ážŸáŸ†áž¡áŸáž„​រោទáŸâ€‹ážŸáž˜áŸ’រាប់ <xliff:g id="TIME">%s</xliff:g> ។"</string>
+ <string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"បាន​បិទ​ទិន្ននáŸáž™ 2G-3G"</string>
+ <string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"បាន​បិទ​ទិន្ននáŸáž™ 4G"</string>
+ <string name="data_usage_disabled_dialog_mobile_title" msgid="1046047248844821202">"បាន​បិទ​ទិន្ននáŸáž™â€‹áž…áž›áŸáž"</string>
+ <string name="data_usage_disabled_dialog_title" msgid="2086815304858964954">"បាន​បិទ​ទិន្ននáŸáž™"</string>
+ <string name="data_usage_disabled_dialog" msgid="3853117269051806280">"អ្នក​បាន​ដល់​ដែន​កំណážáŸ‹â€‹áž”្រើ​ទិន្ននáŸáž™â€‹áž”ាន​បញ្ជាក់។\n\nបើ​អ្នក​បើក​ទិន្ននáŸáž™â€‹áž¡áž¾áž„វិញ អ្នក​អាច​ážáŸ’រូវ​បាន​ប្ដូរ​ដោយ​ប្រážáž·áž”ážáŸ’ážáž·â€‹áž€ážšáŸ”"</string>
+ <string name="data_usage_disabled_dialog_enable" msgid="7729772039208664606">"បើក​​ទិន្ននáŸáž™â€‹áž¡áž¾áž„វិញ"</string>
+ <string name="status_bar_settings_signal_meter_disconnected" msgid="1940231521274147771">"គ្មាន​ការ​ážáž—្ជាប់​អ៊ីនធឺណិáž"</string>
+ <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"បាន​ភ្ជាប់​វ៉ាយហ្វាយ"</string>
+ <string name="gps_notification_searching_text" msgid="8574247005642736060">"ស្វែងរក GPS"</string>
+ <string name="gps_notification_found_text" msgid="4619274244146446464">"ទីážáž¶áŸ†áž„​​​​​កំណážáŸ‹â€‹ážŠáŸ„áž™ GPS"</string>
+ <string name="accessibility_location_active" msgid="2427290146138169014">"សំណើ​ទីážáž¶áŸ†áž„​សកម្ម"</string>
+ <string name="accessibility_clear_all" msgid="5235938559247164925">"សម្អាážâ€‹áž€áž¶ážšâ€‹áž‡áž¼áž“​ដំណឹង​ទាំងអស់។"</string>
+ <string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"áž–áŸážáŸŒáž˜áž¶áž“​កម្មវិធី"</string>
+ <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"នឹង​បង្វិល​អáŸáž€áŸ’រង់​ស្វáŸáž™â€‹áž”្រវážáŸ’ážáž·áŸ”"</string>
+ <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"អáŸáž€áŸ’រង់​ជាប់​សោ​ក្នុង​ទិស​ផ្ដáŸáž€áŸ”"</string>
+ <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"បា​ន​ចាក់​សោ​អáŸáž€áŸ’រង់​​ក្នុង​ទិស​បញ្ឈរ។"</string>
+ <string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
+ <string name="start_dreams" msgid="7219575858348719790">"ស្រមើ​ស្រមៃ"</string>
+ <string name="ethernet_label" msgid="7967563676324087464">"អ៊ីសឺរណិáž"</string>
+ <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"របៀប​​ជិះ​យន្ážáž áŸ„ះ"</string>
+ <string name="quick_settings_battery_charging_label" msgid="490074774465309209">"បញ្ចូល​ážáŸ’ម <xliff:g id="NUMBER">%d</xliff:g> <xliff:g id="PERCENT">%%</xliff:g>"</string>
+ <string name="quick_settings_battery_charged_label" msgid="8865413079414246081">"បាន​បញ្ចូល​ពáŸáž‰"</string>
+ <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"ប៊្លូធូស"</string>
+ <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"ប៊្លូធូស (ឧបករណ០<xliff:g id="NUMBER">%d</xliff:g>)"</string>
+ <string name="quick_settings_bluetooth_off_label" msgid="8159652146149219937">"បិទ​ប៊្លូធូស"</string>
+ <string name="quick_settings_brightness_label" msgid="6968372297018755815">"ពន្លឺ"</string>
+ <string name="quick_settings_rotation_unlocked_label" msgid="336054930362580584">"បង្វិល​​ស្វáŸáž™â€‹áž”្រវážáŸ’ážáž·"</string>
+ <string name="quick_settings_rotation_locked_label" msgid="8058646447242565486">"បាន​ចាក់​សោ​ការ​បង្វិល"</string>
+ <string name="quick_settings_ime_label" msgid="7073463064369468429">"វិធីសាស្ážáŸ’រ​បញ្ចូល"</string>
+ <string name="quick_settings_location_label" msgid="5011327048748762257">"ទី​ážáž¶áŸ†áž„"</string>
+ <string name="quick_settings_location_off_label" msgid="7464544086507331459">"ទីážáž¶áŸ†áž„​បិទ"</string>
+ <string name="quick_settings_media_device_label" msgid="1302906836372603762">"ឧបករណáŸâ€‹áž˜áŸážŒáŸ€"</string>
+ <string name="quick_settings_rssi_label" msgid="7725671335550695589">"RSSI"</string>
+ <string name="quick_settings_rssi_emergency_only" msgid="2713774041672886750">"សម្រាប់​ážáŸ‚​ការ​ហៅ​ពáŸáž›â€‹áž¢áž¶ážŸáž“្ន"</string>
+ <string name="quick_settings_settings_label" msgid="5326556592578065401">"ការ​កំណážáŸ‹"</string>
+ <string name="quick_settings_time_label" msgid="4635969182239736408">"áž–áŸáž›ážœáŸáž›áž¶"</string>
+ <string name="quick_settings_user_label" msgid="5238995632130897840">"ážáŸ’ញុំ"</string>
+ <string name="quick_settings_wifi_label" msgid="9135344704899546041">"វ៉ាយហ្វាយ"</string>
+ <string name="quick_settings_wifi_not_connected" msgid="7171904845345573431">"មិន​បាន​ážáž—្ជាប់"</string>
+ <string name="quick_settings_wifi_no_network" msgid="2221993077220856376">"គ្មាន​បណ្ដាញ"</string>
+ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"បិទ​វ៉ាយហ្វាយ"</string>
+ <string name="quick_settings_wifi_display_label" msgid="6893592964463624333">"បង្ហា​ញ​វ៉ាយហ្វាយ"</string>
+ <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"​បង្ហាញ​បណ្ដាញ​ឥážâ€‹ážáŸ’សែ"</string>
+ <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"ពន្លឺ"</string>
+ <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"ស្វáŸáž™áž”្រវážáŸ’ážáž·"</string>
+ <string name="status_bar_help_title" msgid="1199237744086469217">"ការ​ជូន​ដំណឹង​​បង្ហាញ​​នៅ​ទីនáŸáŸ‡"</string>
+ <string name="status_bar_help_text" msgid="7874607155052076323">"ចូល​ដំណើរការ​ពួក​វា​ពáŸáž›â€‹ážŽáž¶â€‹áž˜áž½áž™â€‹ážŠáŸ„យ​អូស​ចុះក្រោម។\nអូស​ចុះក្រោម​ម្ដង​ទៀážâ€‹ ដើម្បី​ពិនិážáŸ’យ​ប្រពáŸáž“្ធ។"</string>
+</resources>
diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml
index 1437601..9477bac 100644
--- a/packages/SystemUI/res/values-ko/strings.xml
+++ b/packages/SystemUI/res/values-ko/strings.xml
@@ -61,8 +61,6 @@
<string name="usb_debugging_always" msgid="303335496705863070">"ì´ ì»´í“¨í„°ì—서 í•­ìƒ í—ˆìš©"</string>
<string name="compat_mode_on" msgid="6623839244840638213">"전체화면 모드로 확대"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"전체화면 모드로 확대"</string>
- <string name="compat_mode_help_header" msgid="7969493989397529910">"호환성 확대/축소"</string>
- <string name="compat_mode_help_body" msgid="4946726776359270040">"ì•±ì´ ìž‘ì€ í™”ë©´ì— ë§žë„ë¡ ì„¤ê³„ëœ ê²½ìš° 시계 ì˜†ì— í™•ëŒ€/축소 ì»¨íŠ¸ë¡¤ì´ í‘œì‹œë©ë‹ˆë‹¤."</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"캡ì³í™”ë©´ 저장 중..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"캡ì³í™”ë©´ 저장 중..."</string>
<string name="screenshot_saving_text" msgid="2419718443411738818">"캡ì³í™”ë©´ì„ ì €ìž¥í•˜ëŠ” 중입니다."</string>
@@ -78,6 +76,8 @@
<string name="accessibility_home" msgid="8217216074895377641">"홈"</string>
<string name="accessibility_menu" msgid="316839303324695949">"메뉴"</string>
<string name="accessibility_recent" msgid="8571350598987952883">"ìµœê·¼ì— ì‚¬ìš©í•œ 앱"</string>
+ <string name="accessibility_search_light" msgid="1103867596330271848">"검색"</string>
+ <string name="accessibility_camera_button" msgid="8064671582820358152">"ì¹´ë©”ë¼"</string>
<string name="accessibility_ime_switch_button" msgid="5032926134740456424">"ìž…ë ¥ 방법 ë²„íŠ¼ì„ ì „í™˜í•©ë‹ˆë‹¤."</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"호환성 확대/축소 버튼입니다."</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"ìž‘ì€ í™”ë©´ì„ í° í™”ë©´ìœ¼ë¡œ 확대합니다."</string>
@@ -153,6 +153,7 @@
<string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"배터리 <xliff:g id="STATE">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_airplane" msgid="4196876722090224753">"비행기 모드가 <xliff:g id="STATE">%s</xliff:g> ìƒíƒœìž…니다."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="5749054971341882340">"블루투스 <xliff:g id="STATE">%s</xliff:g>"</string>
+ <string name="accessibility_quick_settings_location" msgid="4577282329866813100">"위치 <xliff:g id="STATE">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"ì•ŒëžŒì´ <xliff:g id="TIME">%s</xliff:g>(으)로 설정ë˜ì—ˆìŠµë‹ˆë‹¤."</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"2G-3G ë°ì´í„° 사용중지ë¨"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"4G ë°ì´í„° 사용중지ë¨"</string>
@@ -164,12 +165,13 @@
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Wi-Fi ì—°ê²°ë¨"</string>
<string name="gps_notification_searching_text" msgid="8574247005642736060">"GPS 검색 중"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"GPSì—서 위치 설정"</string>
+ <string name="accessibility_location_active" msgid="2427290146138169014">"위치 요청 있ìŒ"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"모든 알림 지우기"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"앱 정보"</string>
<string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"í™”ë©´ì´ ìžë™ìœ¼ë¡œ 회전ë©ë‹ˆë‹¤."</string>
<string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"í™”ë©´ì´ ê°€ë¡œ 방향으로 잠겨 있습니다."</string>
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"í™”ë©´ì´ ì„¸ë¡œ 방향으로 잠겨 있습니다."</string>
- <string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
+ <string name="dessert_case" msgid="1295161776223959221">"디저트 ì¼€ì´ìФ"</string>
<string name="start_dreams" msgid="7219575858348719790">"화면 보호기"</string>
<string name="ethernet_label" msgid="7967563676324087464">"ì´ë”ë„·"</string>
<string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"비행기 모드"</string>
@@ -182,10 +184,8 @@
<string name="quick_settings_rotation_unlocked_label" msgid="336054930362580584">"ìžë™ 회전"</string>
<string name="quick_settings_rotation_locked_label" msgid="8058646447242565486">"회전 잠금"</string>
<string name="quick_settings_ime_label" msgid="7073463064369468429">"입력 방법"</string>
- <!-- no translation found for quick_settings_location_label (5011327048748762257) -->
- <skip />
- <!-- no translation found for quick_settings_location_off_label (7464544086507331459) -->
- <skip />
+ <string name="quick_settings_location_label" msgid="5011327048748762257">"위치"</string>
+ <string name="quick_settings_location_off_label" msgid="7464544086507331459">"위치 사용 중지"</string>
<string name="quick_settings_media_device_label" msgid="1302906836372603762">"미디어 기기"</string>
<string name="quick_settings_rssi_label" msgid="7725671335550695589">"RSSI"</string>
<string name="quick_settings_rssi_emergency_only" msgid="2713774041672886750">"긴급 통화만 허용"</string>
@@ -200,8 +200,8 @@
<string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"무선 디스플레ì´"</string>
<string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"ë°ê¸°"</string>
<string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"ìžë™"</string>
- <string name="status_bar_help_title" msgid="1199237744086469217">"ì•Œë¦¼ì´ ì—¬ê¸°ì— í‘œì‹œë¨"</string>
- <string name="status_bar_help_text" msgid="7874607155052076323">"아래로 스와ì´í”„하여 언제든 액세스하세요.\n한 번 ë” ì•„ëž˜ë¡œ 스와ì´í”„하면 시스템 관리로 ì´ë™í•©ë‹ˆë‹¤."</string>
- <string name="hideybar_confirmation_message" msgid="9050869548951044371">"화면 가장ìžë¦¬ì—서 스와ì´í”„하여 표시줄 표시"</string>
- <string name="hideybar_confirmation_message_long" msgid="7117692795163620626">"화면 가장ìžë¦¬ì—서 스와ì´í”„하여 시스템 표시줄 표시"</string>
+ <string name="quick_settings_inversion_label" msgid="1666358784283020762">"ìƒ‰ìƒ ë°˜ì „ 모드"</string>
+ <string name="quick_settings_contrast_label" msgid="3319507551689108692">"í–¥ìƒëœ 대비 모드"</string>
+ <string name="quick_settings_color_space_label" msgid="853443689745584770">"ìƒ‰ìƒ ë³´ì • 모드"</string>
+ <string name="ssl_ca_cert_warning" msgid="9005954106902053641">"네트워í¬ê°€\n모니터ë§ë  수 있ìŒ"</string>
</resources>
diff --git a/packages/SystemUI/res/values-lo-land/strings.xml b/packages/SystemUI/res/values-lo-land/strings.xml
new file mode 100644
index 0000000..a838a15
--- /dev/null
+++ b/packages/SystemUI/res/values-lo-land/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2010, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="toast_rotation_locked" msgid="7609673011431556092">"ໜ້າຈà»àº•ອນນີ້ຖືàºàº¥àº±àº­àºà»„ວ້ໃນà»àºšàºšàº¥àº§àº‡àº™àº­àº™."</string>
+</resources>
diff --git a/packages/SystemUI/res/values-lo-rLA-land/strings.xml b/packages/SystemUI/res/values-lo-rLA-land/strings.xml
new file mode 100644
index 0000000..a838a15
--- /dev/null
+++ b/packages/SystemUI/res/values-lo-rLA-land/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2010, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="toast_rotation_locked" msgid="7609673011431556092">"ໜ້າຈà»àº•ອນນີ້ຖືàºàº¥àº±àº­àºà»„ວ້ໃນà»àºšàºšàº¥àº§àº‡àº™àº­àº™."</string>
+</resources>
diff --git a/packages/SystemUI/res/values-lo-rLA/strings.xml b/packages/SystemUI/res/values-lo-rLA/strings.xml
new file mode 100644
index 0000000..d5ba666
--- /dev/null
+++ b/packages/SystemUI/res/values-lo-rLA/strings.xml
@@ -0,0 +1,207 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="7164937344850004466">"ສ່ວນຕິດຕà»à»ˆàºœàº¹à»ˆà»ƒàºŠà»‰àº‚ອງລະບົບ"</string>
+ <string name="status_bar_clear_all_button" msgid="7774721344716731603">"ລຶບ"</string>
+ <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"ເອົາອອàºàºˆàº²àºàº¥àº²àºàºàº²àº™"</string>
+ <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"ຂà»à»‰àº¡àº¹àº™à»àº­àº±àºšàº¯"</string>
+ <string name="status_bar_no_recent_apps" msgid="6576392951053994640">"ບà»à»ˆàº¡àºµà»àº­àº±àºšàº¯àº—ີ່ຫາàºà»à»ƒàºŠà»‰"</string>
+ <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"ປິດà»àº­àº±àºšàº¯àº«àº¼à»‰àº²àºªàº¸àº”ທີ່ໃຊ້"</string>
+ <plurals name="status_bar_accessibility_recent_apps">
+ <item quantity="one" msgid="5854176083865845541">"1 à»àº­àº±àºšàº¯àº«àº¼à»‰àº²àºªàº¸àº”"</item>
+ <item quantity="other" msgid="1040784359794890744">"%d à»àº­àº±àºšàº¯àº«àº¼à»‰àº²àºªàº¸àº”"</item>
+ </plurals>
+ <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"ບà»à»ˆàº¡àºµàºàº²àº™à»àºˆà»‰àº‡à»€àº•ືອນ"</string>
+ <string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"ດຳເນີນຢູ່"</string>
+ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"àºàº²àº™à»àºˆà»‰àº‡à»€àº•ືອນ"</string>
+ <string name="battery_low_title" msgid="2783104807551211639">"ເຊື່ອມຕà»à»ˆàºªàº²àºàºªàº²àº"</string>
+ <string name="battery_low_subtitle" msgid="1752040062087829196">"à»àºšàº±àº”ເຕີຣີເຫຼືອໜ້ອàºà»àº¥à»‰àº§."</string>
+ <string name="battery_low_percent_format" msgid="1077244949318261761">"àºàº±àº‡à»€àº«àº¼àº·àº­àº­àºµàº <xliff:g id="NUMBER">%d%%</xliff:g>"</string>
+ <string name="invalid_charger" msgid="4549105996740522523">"ບà»à»ˆàº®àº­àº‡àº®àº±àºšàºàº²àº™àºªàº²àºà»„ຟດ້ວຠUSB.\nຕ້ອງໃຊ້ສະເພາະເຄື່ອງສາàºàº—ີ່à»àº–ມມານຳເທົ່ານັ້ນ."</string>
+ <string name="battery_low_why" msgid="7279169609518386372">"àºàº²àº™àº™àº³à»ƒàºŠà»‰à»àºšàº±àº”ເຕີຣີ"</string>
+ <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"àºàº²àº™àº•ັ້ງຄ່າ"</string>
+ <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
+ <string name="status_bar_settings_airplane" msgid="4879879698500955300">"ໂà»àº”ເທິງàºàº»àº™"</string>
+ <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"à»àº¸àº™à»œà»‰àº²àºˆà»àº­àº±àº”ຕະໂນມັດ"</string>
+ <string name="status_bar_settings_mute_label" msgid="554682549917429396">"ປິດສຽງ"</string>
+ <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"ອັດຕະໂນມັດ"</string>
+ <string name="status_bar_settings_notifications" msgid="397146176280905137">"àºàº²àº™à»àºˆà»‰àº‡à»€àº•ືອນ"</string>
+ <string name="bluetooth_tethered" msgid="7094101612161133267">"ປ່ອàºàºªàº±àº™àºàº²àº™àºœà»ˆàº²àº™ Bluetooth à»àº¥à»‰àº§"</string>
+ <string name="status_bar_input_method_settings_configure_input_methods" msgid="3504292471512317827">"ຕັ້ງຄ່າວິທີàºàº²àº™àº›à»‰àº­àº™àº‚à»à»‰àº¡àº¹àº™"</string>
+ <string name="status_bar_use_physical_keyboard" msgid="7551903084416057810">"à»àº›à»‰àº™àºžàº´àº¡à»àº—້"</string>
+ <string name="usb_device_permission_prompt" msgid="834698001271562057">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯ <xliff:g id="APPLICATION">%1$s</xliff:g> ເຂົ້າເຖິງອຸປະàºàº­àº™ USB?"</string>
+ <string name="usb_accessory_permission_prompt" msgid="5171775411178865750">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯ <xliff:g id="APPLICATION">%1$s</xliff:g> ເຂົ້າເຖິງອຸປະàºàº­àº™àºžà»ˆàº§àº‡ USB?"</string>
+ <string name="usb_device_confirm_prompt" msgid="5161205258635253206">"ເປີດ <xliff:g id="ACTIVITY">%1$s</xliff:g> ເມື່ອເຊື່ອມຕà»à»ˆàºàº±àºšàº­àº¸àº›àº°àºàº­àº™ USB ນີ້ຫຼືບà»à»ˆ?"</string>
+ <string name="usb_accessory_confirm_prompt" msgid="3808984931830229888">"ເປີດ <xliff:g id="ACTIVITY">%1$s</xliff:g> ເມື່ອມີàºàº²àº™à»€àºŠàº·à»ˆàº­àº¡àº•à»à»ˆàºàº±àºšàº­àº¸àº›àº°àºàº­àº™à»€àºªàºµàº¡ USB ນີ້ຫຼືບà»à»ˆ?"</string>
+ <string name="usb_accessory_uri_prompt" msgid="513450621413733343">"ບà»à»ˆàº¡àºµà»àº­àº±àºšàº¯à»ƒàº”ທີ່ຕິດຕັ້ງໄປà»àº¥à»‰àº§ ສາມາດເຮັດວຽàºàº®à»ˆàº§àº¡àºàº±àºšàº­àº¸àº›àº°àºàº­àº™à»€àºªàºµàº¡ USB ນີ້ໄດ້. ສຶàºàºªàº²à»€àºžàºµà»ˆàº¡à»€àº•ີມàºà»ˆàº½àº§àºàº±àºšàº­àº¸àº›àº°àºàº­àº™à»€àºªàºµàº¡àº™àºµà»‰àº—ີ່ <xliff:g id="URL">%1$s</xliff:g>"</string>
+ <string name="title_usb_accessory" msgid="4966265263465181372">"ອຸປະàºàº­àº™à»€àºªàºµàº¡ USB"</string>
+ <string name="label_view" msgid="6304565553218192990">"ເບິ່ງ"</string>
+ <string name="always_use_device" msgid="1450287437017315906">"ໃຊ້ເປັນຄ່າເລີ່ມຕົ້ນສຳລັບອຸປະàºàº­àº™ USB ນີ້"</string>
+ <string name="always_use_accessory" msgid="1210954576979621596">"ໃຊ້ຄ່າເລີ່ມຕົ້ນສຳລັບອຸປະàºàº­àº™à»€àºªàºµàº¡ USB ນີ້."</string>
+ <string name="usb_debugging_title" msgid="4513918393387141949">"ອະນຸàºàº²àº”àºàº²àº™àº”ີບັ໊àºàºœà»ˆàº²àº™ USB?"</string>
+ <string name="usb_debugging_message" msgid="2220143855912376496">"ລາàºàº™àº´à»‰àº¡àº· RSA ຂອງຄອມພິວເຕີà»àº¡à»ˆàº™:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
+ <string name="usb_debugging_always" msgid="303335496705863070">"ອະນຸàºàº²àº”ຈາàºàº„ອມພິວເຕີນີ້ຕະຫຼອດ"</string>
+ <string name="compat_mode_on" msgid="6623839244840638213">"ຊູມໃຫ້ເຕັມໜ້າຈà»"</string>
+ <string name="compat_mode_off" msgid="4434467572461327898">"ປັບໃຫ້ເຕັມໜ້າຈà»"</string>
+ <string name="screenshot_saving_ticker" msgid="7403652894056693515">"àºàº³àº¥àº±àº‡àºšàº±àº™àº—ຶàºàº®àº¹àºšà»œà»‰àº²àºˆà»"</string>
+ <string name="screenshot_saving_title" msgid="8242282144535555697">"àºàº³àº¥àº±àº‡àºšàº±àº™àº—ຶàºàºžàº²àºšà»œà»‰àº²àºˆà»..."</string>
+ <string name="screenshot_saving_text" msgid="2419718443411738818">"àºàº³àº¥àº±àº‡àºšàº±àº™àº—ຶàºàºžàº²àºšà»œà»‰àº²àºˆà»."</string>
+ <string name="screenshot_saved_title" msgid="6461865960961414961">"ຖ່າàºàº®àº¹àºšà»œà»‰àº²àºˆà»à»àº¥à»‰àº§"</string>
+ <string name="screenshot_saved_text" msgid="1152839647677558815">"à»àº•ະເພື່ອເບິ່ງພາບໜ້າຈà»àº‚ອງທ່ານ."</string>
+ <string name="screenshot_failed_title" msgid="705781116746922771">"ບà»à»ˆàºªàº²àº¡àº²àº”ຖ່າàºàº®àº¹àºšà»œà»‰àº²àºˆà»à»„ດ້"</string>
+ <string name="screenshot_failed_text" msgid="8134011269572415402">"ບà»à»ˆàºªàº²àº¡àº²àº”ບັນທຶàºàºžàº²àºšà»œà»‰àº²àºˆà»à»„ດ້. ບ່ອນຈັດເàºàº±àºšàº­àº²àº”àºàº³àº¥àº±àº‡àº–ືàºàº™àº³à»ƒàºŠà»‰àº¢àº¹à»ˆ."</string>
+ <string name="usb_preference_title" msgid="6551050377388882787">"USB ໂຕເລືອàºàºàº²àº™àºà»‰àº²àºà»„ຟລ໌"</string>
+ <string name="use_mtp_button_title" msgid="4333504413563023626">"ເຊື່ອມຕà»à»ˆà»€àº›àº±àº™ media player (MTP)"</string>
+ <string name="use_ptp_button_title" msgid="7517127540301625751">"ເຊື່ອມຕà»à»ˆà»€àº›àº±àº™àºà»‰àº­àº‡àº–່າàºàº®àº¹àºš (PTP)"</string>
+ <string name="installer_cd_button_title" msgid="2312667578562201583">"ຕິດຕັ້ງà»àº­àº±àºšàº¯ Android File Transfer ສຳລັບ Mac"</string>
+ <string name="accessibility_back" msgid="567011538994429120">"àºàº±àºšàº„ືນ"</string>
+ <string name="accessibility_home" msgid="8217216074895377641">"ໜ້າທຳອິດ"</string>
+ <string name="accessibility_menu" msgid="316839303324695949">"ເມນູ"</string>
+ <string name="accessibility_recent" msgid="8571350598987952883">"à»àº­àº±àºšàº¯àº«àº¼à»‰àº²àºªàº¸àº”"</string>
+ <string name="accessibility_search_light" msgid="1103867596330271848">"ຊອàºàº«àº²"</string>
+ <string name="accessibility_camera_button" msgid="8064671582820358152">"àºà»‰àº­àº‡"</string>
+ <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"ປຸ່ມສະລັບຮູບà»àºšàºšàºàº²àº™àº›à»‰àº­àº™àº‚à»à»‰àº¡àº¹àº™."</string>
+ <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"ປຸ່ມຊູມທີ່ໃຊ້ຮ່ວມàºàº±àº™à»„ດ້."</string>
+ <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"ຊູມຈà»àº™à»‰àº­àºà»„ປເປັນຈà»àº‚ະຫນາດໃຫàºà»ˆ."</string>
+ <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"ເຊື່ອມຕà»à»ˆ Bluetooth à»àº¥à»‰àº§."</string>
+ <string name="accessibility_bluetooth_disconnected" msgid="7416648669976870175">"Bluetooth ຖືàºàº•ັດàºàº²àº™à»€àºŠàº·à»ˆàº­àº¡àº•à»à»ˆà»àº¥à»‰àº§."</string>
+ <string name="accessibility_no_battery" msgid="358343022352820946">"à»àºšàº±àº”ເຕີຣີà»àº»àº”."</string>
+ <string name="accessibility_battery_one_bar" msgid="7774887721891057523">"à»àºšàº±àº”ເຕີຣີນຶ່ງຂີດ."</string>
+ <string name="accessibility_battery_two_bars" msgid="8500650438735009973">"à»àºšàº±àº”ເຕີຣີສອງຂີດ."</string>
+ <string name="accessibility_battery_three_bars" msgid="2302983330865040446">"à»àºšàº±àº”ເຕີຣີສາມຂີດ."</string>
+ <string name="accessibility_battery_full" msgid="8909122401720158582">"à»àºšàº±àº”ເຕີຣີເຕັມ."</string>
+ <string name="accessibility_no_phone" msgid="4894708937052611281">"ບà»à»ˆàº¡àºµà»‚ທລະສັບ."</string>
+ <string name="accessibility_phone_one_bar" msgid="687699278132664115">"ສັນàºàº²àº™àº™àº¶à»ˆàº‡àº‚ີດ."</string>
+ <string name="accessibility_phone_two_bars" msgid="8384905382804815201">"ສັນàºàº²àº™àºªàº­àº‡àº‚ີດ."</string>
+ <string name="accessibility_phone_three_bars" msgid="8521904843919971885">"ສັນàºàº²àº™àºªàº²àº¡àº‚ີດ."</string>
+ <string name="accessibility_phone_signal_full" msgid="6471834868580757898">"ສັນàºàº²àº™à»€àº•ັມ."</string>
+ <string name="accessibility_no_data" msgid="4791966295096867555">"ບà»à»ˆàº¡àºµàº‚à»à»‰àº¡àº¹àº™."</string>
+ <string name="accessibility_data_one_bar" msgid="1415625833238273628">"ຂà»à»‰àº¡àº¹àº™àº™àº¶à»ˆàº‡àº‚ີດ."</string>
+ <string name="accessibility_data_two_bars" msgid="6166018492360432091">"ຂà»à»‰àº¡àº¹àº™àºªàº­àº‡àº‚ີດ."</string>
+ <string name="accessibility_data_three_bars" msgid="9167670452395038520">"ຂà»à»‰àº¡àº¹àº™àºªàº²àº¡àº‚ີດ."</string>
+ <string name="accessibility_data_signal_full" msgid="2708384608124519369">"ສັນ​àºàº²àº™àº‚à»à»‰àº¡àº¹àº™â€‹à»€àº•ັມ."</string>
+ <string name="accessibility_wifi_off" msgid="3177380296697933627">"WiFi ປິດຢູ່."</string>
+ <string name="accessibility_no_wifi" msgid="1425476551827924474">"ຕັດàºàº²àº™à»€àºŠàº·à»ˆàº­àº¡àº•à»à»ˆ Wi-Fi à»àº¥à»‰àº§."</string>
+ <string name="accessibility_wifi_one_bar" msgid="7735893178010724377">"ສັນàºàº²àº™ Wi-Fi ນຶ່ງຂີດ."</string>
+ <string name="accessibility_wifi_two_bars" msgid="4994274250497262434">"ສັນàºàº²àº™ Wi-Fi ສອງຂີດ."</string>
+ <string name="accessibility_wifi_three_bars" msgid="3495755044276588384">"Wifi ສາມຂີດ."</string>
+ <string name="accessibility_wifi_signal_full" msgid="6853561303586480376">"ສັນàºàº²àº™ Wi-Fi ເຕັມ"</string>
+ <string name="accessibility_no_wimax" msgid="4329180129727630368">"ບà»à»ˆàº¡àºµ WiMAX."</string>
+ <string name="accessibility_wimax_one_bar" msgid="4170994299011863648">"WiMAX ນຶ່ງຂີດ."</string>
+ <string name="accessibility_wimax_two_bars" msgid="9176236858336502288">"WiMAX ສອງຂີດ."</string>
+ <string name="accessibility_wimax_three_bars" msgid="6116551636752103927">"WiMAX ສາມຂີດ."</string>
+ <string name="accessibility_wimax_signal_full" msgid="2768089986795579558">"ສັນ​àºàº²àº™ WiMAX ເຕັມ."</string>
+ <string name="accessibility_no_signal" msgid="7064645320782585167">"ບà»à»ˆàº¡àºµàºªàº±àº™àºàº²àº™."</string>
+ <string name="accessibility_not_connected" msgid="6395326276213402883">"ບà»à»ˆà»„ດ້ເຊື່ອມຕà»à»ˆ."</string>
+ <string name="accessibility_zero_bars" msgid="3806060224467027887">"ບà»à»ˆàº¡àºµàºˆàº±àºàº‚ີດ."</string>
+ <string name="accessibility_one_bar" msgid="1685730113192081895">"ນຶ່ງຂີດ."</string>
+ <string name="accessibility_two_bars" msgid="6437363648385206679">"ສອງຂີດ."</string>
+ <string name="accessibility_three_bars" msgid="2648241415119396648">"ສາມຂີດ."</string>
+ <string name="accessibility_signal_full" msgid="9122922886519676839">"ສັນàºàº²àº™à»€àº•ັມ."</string>
+ <string name="accessibility_desc_on" msgid="2385254693624345265">"ເປີດ."</string>
+ <string name="accessibility_desc_off" msgid="6475508157786853157">"ປິດ."</string>
+ <string name="accessibility_desc_connected" msgid="8366256693719499665">"ເຊື່ອມ​ຕà»à»ˆà»àº¥à»‰àº§."</string>
+ <string name="accessibility_data_connection_gprs" msgid="1606477224486747751">"GPRS"</string>
+ <string name="accessibility_data_connection_1x" msgid="994133468120244018">"1 X"</string>
+ <string name="accessibility_data_connection_hspa" msgid="2032328855462645198">"HSPA"</string>
+ <string name="accessibility_data_connection_3g" msgid="8628562305003568260">"3G"</string>
+ <string name="accessibility_data_connection_3.5g" msgid="8664845609981692001">"3.5G"</string>
+ <string name="accessibility_data_connection_4g" msgid="7741000750630089612">"4G"</string>
+ <string name="accessibility_data_connection_lte" msgid="5413468808637540658">"LTE"</string>
+ <string name="accessibility_data_connection_cdma" msgid="6132648193978823023">"CDMA"</string>
+ <string name="accessibility_data_connection_roaming" msgid="5977362333466556094">"ໂຣມມິງ"</string>
+ <string name="accessibility_data_connection_edge" msgid="4477457051631979278">"Edge"</string>
+ <string name="accessibility_data_connection_wifi" msgid="2324496756590645221">"Wi-Fi"</string>
+ <string name="accessibility_no_sim" msgid="8274017118472455155">"ບà»à»ˆàº¡àºµàºŠàº´àº¡."</string>
+ <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"àºàº²àº™àº›à»ˆàº­àºàºªàº±àº™àºàº²àº™ Bluetooth."</string>
+ <string name="accessibility_airplane_mode" msgid="834748999790763092">"ໂà»àº”ໃນàºàº»àº™."</string>
+ <string name="accessibility_battery_level" msgid="7451474187113371965">"à»àºšàº±àº”ເຕີຣີ <xliff:g id="NUMBER">%d</xliff:g> ເປີເຊັນ."</string>
+ <string name="accessibility_settings_button" msgid="799583911231893380">"àºàº²àº™àº•ັ້ງຄ່າລະບົບ."</string>
+ <string name="accessibility_notifications_button" msgid="4498000369779421892">"àºàº²àº™à»àºˆà»‰àº‡à»€àº•ືອນ."</string>
+ <string name="accessibility_remove_notification" msgid="3603099514902182350">"ລຶບລ້າງàºàº²àº™à»àºˆà»‰àº‡à»€àº•ືອນ."</string>
+ <string name="accessibility_gps_enabled" msgid="3511469499240123019">"GPS ເປີດà»àº¥à»‰àº§."</string>
+ <string name="accessibility_gps_acquiring" msgid="8959333351058967158">"àºàº³àº¥àº±àº‡àºŠàº­àºàº«àº² GPS."</string>
+ <string name="accessibility_tty_enabled" msgid="4613200365379426561">"TeleTypewriter ຖືàºà»€àº›àºµàº”ຢູ່."</string>
+ <string name="accessibility_ringer_vibrate" msgid="666585363364155055">"ສັ່ນເຕືອນພ້ອມສຽງເອີ້ນເຂົ້າ."</string>
+ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"ປິດສຽງ."</string>
+ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"ປິດ <xliff:g id="APP">%s</xliff:g> à»àº¥à»‰àº§."</string>
+ <string name="accessibility_notification_dismissed" msgid="854211387186306927">"ປິດàºàº²àº™à»àºˆà»‰àº‡à»€àº•ືອນà»àº¥à»‰àº§."</string>
+ <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"ໜ້າຈà»à»àºˆà»‰àº‡à»€àº•ືອນ."</string>
+ <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"àºàº²àº™àº•ັ້ງຄ່າດ່ວນ."</string>
+ <string name="accessibility_desc_recent_apps" msgid="9014032916410590027">"à»àº­àº±àºšàº¯àº—ີ່ຫາàºà»à»ƒàºŠà»‰."</string>
+ <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"ຜູ່ໃຊ້ <xliff:g id="USER">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_wifi" msgid="6099781031669728709">"<xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="NETWORK">%2$s</xliff:g>"</string>
+ <string name="accessibility_quick_settings_mobile" msgid="4876806564086241341">"ມືຖື <xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="TYPE">%2$s</xliff:g>. <xliff:g id="NETWORK">%3$s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"à»àºšàº±àº”ເຕີຣີ <xliff:g id="STATE">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_airplane" msgid="4196876722090224753">"ໂà»àº”ໃນàºàº»àº™ <xliff:g id="STATE">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_bluetooth" msgid="5749054971341882340">"Bluetooth <xliff:g id="STATE">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_location" msgid="4577282329866813100">"ສະ​ຖານ​ທີ່ <xliff:g id="STATE">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"ຕັ້ງໂມງປຸຠ<xliff:g id="TIME">%s</xliff:g> à»àº¥à»‰àº§."</string>
+ <string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"ອິນເຕີເນັດ 2G​, 3G ຖືàºàº›àº´àº”à»àº¥à»‰àº§"</string>
+ <string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"àºàº²àº™àº™àº³à»ƒàºŠà»‰àº‚à»à»‰àº¡àº¹àº™ 4G ຖືàºàº›àº´àº”à»àº¥à»‰àº§"</string>
+ <string name="data_usage_disabled_dialog_mobile_title" msgid="1046047248844821202">"ອິນເຕີເນັດໃນມືຖືຖືàºàº›àº´àº”àºàº²àº™àº™àº³à»ƒàºŠà»‰à»àº¥à»‰àº§"</string>
+ <string name="data_usage_disabled_dialog_title" msgid="2086815304858964954">"ອິນເຕີເນັດຖືàºàº›àº´àº”àºàº²àº™àº™àº³à»ƒàºŠà»‰à»àº¥à»‰àº§"</string>
+ <string name="data_usage_disabled_dialog" msgid="3853117269051806280">"ທ່ານໄດ້ໃຊ້ຂà»à»‰àº¡àº¹àº™àºˆàº»àº™àº®àº­àº”ຈຳນວນທີ່ຈຳàºàº±àº”ໄວ້à»àº¥à»‰àº§.\n\nຫາàºàº—່ານເປີດນຳໃຊ້ຂà»à»‰àº¡àº¹àº™àº„ືນອີàºàº„ັ້ງ, ທ່ານອາດຖືàºàº®àº½àºà»€àºàº±àºšà»€àº‡àº´àº™à»‚ດàºàºœàº¹à»ˆà»ƒàº«à»‰àºšà»àº¥àº´àºàº²àº™à»„ດ້."</string>
+ <string name="data_usage_disabled_dialog_enable" msgid="7729772039208664606">"ເປີດນຳໃຊ້ຂà»à»‰àº¡àº¹àº™àº„ືນໃà»à»ˆ"</string>
+ <string name="status_bar_settings_signal_meter_disconnected" msgid="1940231521274147771">"ບà»à»ˆàº¡àºµàºàº²àº™à»€àºŠàº·à»ˆàº­àº¡àº•à»à»ˆàº­àº´àº™à»€àº•ີເນັດ"</string>
+ <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"ເຊື່ອມ​ຕà»à»ˆ Wi-​-Fi à»àº¥à»‰àº§"</string>
+ <string name="gps_notification_searching_text" msgid="8574247005642736060">"àºàº³àº¥àº±àº‡àºŠàº­àºàº«àº² GPS"</string>
+ <string name="gps_notification_found_text" msgid="4619274244146446464">"ສະຖານທີ່àºàº³àº™àº»àº”ໂດຠGPS"</string>
+ <string name="accessibility_location_active" msgid="2427290146138169014">"àºàº²àº™àº®à»‰àº­àº‡àº‚à»àºªàº°àº–ານທີ່ທີ່ເຮັດວຽàºàº¢àº¹à»ˆ"</string>
+ <string name="accessibility_clear_all" msgid="5235938559247164925">"ລຶບàºàº²àº™à»àºˆà»‰àº‡à»€àº•ືອນທັງà»àº»àº”."</string>
+ <string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"ຂà»à»‰àº¡àº¹àº™à»àº­àº±àºšàº¯"</string>
+ <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"ໜ້າຈà»àºˆàº°à»àº¸àº™à»‚ດàºàº­àº±àº”ຕະໂນມັດ."</string>
+ <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"ໜ້າຈà»àº–ືàºàº¥àº±àº­àºà»ƒàº™àº¥àº§àº‡àº™àº­àº™."</string>
+ <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"ໜ້າຈà»àº–ືàºàº¥àº±àº­àºàº¢àº¹à»ˆà»ƒàº™à»‚à»àº”à»àº™àº§àº•ັ້ງ."</string>
+ <string name="dessert_case" msgid="1295161776223959221">"àºà»ˆàº­àº‡àº‚ອງຫວານ"</string>
+ <string name="start_dreams" msgid="7219575858348719790">"Daydream"</string>
+ <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
+ <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"ໂà»àº”ຢູ່ໃນàºàº»àº™"</string>
+ <string name="quick_settings_battery_charging_label" msgid="490074774465309209">"àºàº³àº¥àº±àº‡àºªàº²àº, <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+ <string name="quick_settings_battery_charged_label" msgid="8865413079414246081">"ສາàºà»€àº•ັມà»àº¥à»‰àº§"</string>
+ <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string>
+ <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (<xliff:g id="NUMBER">%d</xliff:g> ອຸປະàºàº­àº™)"</string>
+ <string name="quick_settings_bluetooth_off_label" msgid="8159652146149219937">"Bluetooth ປິດ"</string>
+ <string name="quick_settings_brightness_label" msgid="6968372297018755815">"ຄວາມສະຫວ່າງ"</string>
+ <string name="quick_settings_rotation_unlocked_label" msgid="336054930362580584">"à»àº¸àº™à»œà»‰àº²àºˆà»àº­àº±àº”ຕະໂນມັດ"</string>
+ <string name="quick_settings_rotation_locked_label" msgid="8058646447242565486">"ລັອàºàºàº²àº™àº›à»ˆàº½àº™àº¥àº§àº‡"</string>
+ <string name="quick_settings_ime_label" msgid="7073463064369468429">"ວິທີàºàº²àº™àº›à»‰àº­àº™àº‚à»à»‰àº¡àº¹àº™"</string>
+ <string name="quick_settings_location_label" msgid="5011327048748762257">"ສະຖານທີ່"</string>
+ <string name="quick_settings_location_off_label" msgid="7464544086507331459">"ຂà»à»‰àº¡àº¹àº™àºªàº°àº–ານທີ່ປິດຢູ່"</string>
+ <string name="quick_settings_media_device_label" msgid="1302906836372603762">"ອຸປະàºàº­àº™àºªàº·à»ˆ"</string>
+ <string name="quick_settings_rssi_label" msgid="7725671335550695589">"RSSI"</string>
+ <string name="quick_settings_rssi_emergency_only" msgid="2713774041672886750">"ໂທສຸàºà»€àºªàºµàº™à»€àº—ົ່ານັ້ນ"</string>
+ <string name="quick_settings_settings_label" msgid="5326556592578065401">"àºàº²àº™àº•ັ້ງຄ່າ"</string>
+ <string name="quick_settings_time_label" msgid="4635969182239736408">"ເວລາ"</string>
+ <string name="quick_settings_user_label" msgid="5238995632130897840">"ຂ້ອàº"</string>
+ <string name="quick_settings_wifi_label" msgid="9135344704899546041">"Wi​-Fi"</string>
+ <string name="quick_settings_wifi_not_connected" msgid="7171904845345573431">"ບà»à»ˆà»„ດ້ເຊື່ອມຕà»à»ˆ"</string>
+ <string name="quick_settings_wifi_no_network" msgid="2221993077220856376">"ບà»à»ˆàº¡àºµà»€àº„ືອຂ່າàº"</string>
+ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi​-Fi ປິດ"</string>
+ <string name="quick_settings_wifi_display_label" msgid="6893592964463624333">"ຈà»àºªàº°à»àº”ງຜົນ Wi-Fi"</string>
+ <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"àºàº²àº™àºªàº°à»àº”ງຜົນໄຮ້ສາàº"</string>
+ <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"ຄວາມà»àºˆà»‰àº‡"</string>
+ <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"ອັດຕະໂນມັດ"</string>
+ <string name="quick_settings_inversion_label" msgid="1666358784283020762">"ໂà»àº”ສະລັບສີ"</string>
+ <string name="quick_settings_contrast_label" msgid="3319507551689108692">"ໂà»àº”ຄວາມຕ່າງà»àºªàº‡"</string>
+ <string name="quick_settings_color_space_label" msgid="853443689745584770">"ໂà»àº”àºàº²àº™à»àºà»‰à»„ຂສີ"</string>
+ <string name="ssl_ca_cert_warning" msgid="9005954106902053641">"ເຄືອຄ່າàºàº­àº²àº”\nຖືàºàº•ິດຕາມ"</string>
+</resources>
diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml
new file mode 100644
index 0000000..85b10f7
--- /dev/null
+++ b/packages/SystemUI/res/values-lo/strings.xml
@@ -0,0 +1,204 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="7164937344850004466">"ສ່ວນຕິດຕà»à»ˆàºœàº¹à»ˆà»ƒàºŠà»‰àº‚ອງລະບົບ"</string>
+ <string name="status_bar_clear_all_button" msgid="7774721344716731603">"ລຶບ"</string>
+ <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"ເອົາອອàºàºˆàº²àºàº¥àº²àºàºàº²àº™"</string>
+ <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"ຂà»à»‰àº¡àº¹àº™à»àº­àº±àºšàº¯"</string>
+ <string name="status_bar_no_recent_apps" msgid="6576392951053994640">"ບà»à»ˆàº¡àºµà»àº­àº±àºšàº¯àº—ີ່ຫາàºà»à»ƒàºŠà»‰"</string>
+ <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"ປິດà»àº­àº±àºšàº¯àº«àº¼à»‰àº²àºªàº¸àº”ທີ່ໃຊ້"</string>
+ <plurals name="status_bar_accessibility_recent_apps">
+ <item quantity="one" msgid="5854176083865845541">"1 à»àº­àº±àºšàº¯àº«àº¼à»‰àº²àºªàº¸àº”"</item>
+ <item quantity="other" msgid="1040784359794890744">"%d à»àº­àº±àºšàº¯àº«àº¼à»‰àº²àºªàº¸àº”"</item>
+ </plurals>
+ <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"ບà»à»ˆàº¡àºµàºàº²àº™à»àºˆà»‰àº‡à»€àº•ືອນ"</string>
+ <string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"ດຳເນີນຢູ່"</string>
+ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"àºàº²àº™à»àºˆà»‰àº‡à»€àº•ືອນ"</string>
+ <string name="battery_low_title" msgid="2783104807551211639">"ເຊື່ອມຕà»à»ˆàºªàº²àºàºªàº²àº"</string>
+ <string name="battery_low_subtitle" msgid="1752040062087829196">"à»àºšàº±àº”ເຕີຣີເຫຼືອໜ້ອàºà»àº¥à»‰àº§."</string>
+ <string name="battery_low_percent_format" msgid="1077244949318261761">"àºàº±àº‡à»€àº«àº¼àº·àº­àº­àºµàº <xliff:g id="NUMBER">%d%%</xliff:g>"</string>
+ <string name="invalid_charger" msgid="4549105996740522523">"ບà»à»ˆàº®àº­àº‡àº®àº±àºšàºàº²àº™àºªàº²àºà»„ຟດ້ວຠUSB.\nຕ້ອງໃຊ້ສະເພາະເຄື່ອງສາàºàº—ີ່à»àº–ມມານຳເທົ່ານັ້ນ."</string>
+ <string name="battery_low_why" msgid="7279169609518386372">"àºàº²àº™àº™àº³à»ƒàºŠà»‰à»àºšàº±àº”ເຕີຣີ"</string>
+ <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"àºàº²àº™àº•ັ້ງຄ່າ"</string>
+ <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
+ <string name="status_bar_settings_airplane" msgid="4879879698500955300">"ໂà»àº”ເທິງàºàº»àº™"</string>
+ <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"à»àº¸àº™à»œà»‰àº²àºˆà»àº­àº±àº”ຕະໂນມັດ"</string>
+ <string name="status_bar_settings_mute_label" msgid="554682549917429396">"ປິດສຽງ"</string>
+ <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"ອັດຕະໂນມັດ"</string>
+ <string name="status_bar_settings_notifications" msgid="397146176280905137">"àºàº²àº™à»àºˆà»‰àº‡à»€àº•ືອນ"</string>
+ <string name="bluetooth_tethered" msgid="7094101612161133267">"ປ່ອàºàºªàº±àº™àºàº²àº™àºœà»ˆàº²àº™ Bluetooth à»àº¥à»‰àº§"</string>
+ <string name="status_bar_input_method_settings_configure_input_methods" msgid="3504292471512317827">"ຕັ້ງຄ່າວິທີàºàº²àº™àº›à»‰àº­àº™àº‚à»à»‰àº¡àº¹àº™"</string>
+ <string name="status_bar_use_physical_keyboard" msgid="7551903084416057810">"à»àº›à»‰àº™àºžàº´àº¡à»àº—້"</string>
+ <string name="usb_device_permission_prompt" msgid="834698001271562057">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯ <xliff:g id="APPLICATION">%1$s</xliff:g> ເຂົ້າເຖິງອຸປະàºàº­àº™ USB?"</string>
+ <string name="usb_accessory_permission_prompt" msgid="5171775411178865750">"ອະນຸàºàº²àº”ໃຫ້à»àº­àº±àºšàº¯ <xliff:g id="APPLICATION">%1$s</xliff:g> ເຂົ້າເຖິງອຸປະàºàº­àº™àºžà»ˆàº§àº‡ USB?"</string>
+ <string name="usb_device_confirm_prompt" msgid="5161205258635253206">"ເປີດ <xliff:g id="ACTIVITY">%1$s</xliff:g> ເມື່ອເຊື່ອມຕà»à»ˆàºàº±àºšàº­àº¸àº›àº°àºàº­àº™ USB ນີ້ຫຼືບà»à»ˆ?"</string>
+ <string name="usb_accessory_confirm_prompt" msgid="3808984931830229888">"ເປີດ <xliff:g id="ACTIVITY">%1$s</xliff:g> ເມື່ອມີàºàº²àº™à»€àºŠàº·à»ˆàº­àº¡àº•à»à»ˆàºàº±àºšàº­àº¸àº›àº°àºàº­àº™à»€àºªàºµàº¡ USB ນີ້ຫຼືບà»à»ˆ?"</string>
+ <string name="usb_accessory_uri_prompt" msgid="513450621413733343">"ບà»à»ˆàº¡àºµà»àº­àº±àºšàº¯à»ƒàº”ທີ່ຕິດຕັ້ງໄປà»àº¥à»‰àº§ ສາມາດເຮັດວຽàºàº®à»ˆàº§àº¡àºàº±àºšàº­àº¸àº›àº°àºàº­àº™à»€àºªàºµàº¡ USB ນີ້ໄດ້. ສຶàºàºªàº²à»€àºžàºµà»ˆàº¡à»€àº•ີມàºà»ˆàº½àº§àºàº±àºšàº­àº¸àº›àº°àºàº­àº™à»€àºªàºµàº¡àº™àºµà»‰àº—ີ່ <xliff:g id="URL">%1$s</xliff:g>"</string>
+ <string name="title_usb_accessory" msgid="4966265263465181372">"ອຸປະàºàº­àº™à»€àºªàºµàº¡ USB"</string>
+ <string name="label_view" msgid="6304565553218192990">"ເບິ່ງ"</string>
+ <string name="always_use_device" msgid="1450287437017315906">"ໃຊ້ເປັນຄ່າເລີ່ມຕົ້ນສຳລັບອຸປະàºàº­àº™ USB ນີ້"</string>
+ <string name="always_use_accessory" msgid="1210954576979621596">"ໃຊ້ຄ່າເລີ່ມຕົ້ນສຳລັບອຸປະàºàº­àº™à»€àºªàºµàº¡ USB ນີ້."</string>
+ <string name="usb_debugging_title" msgid="4513918393387141949">"ອະນຸàºàº²àº”àºàº²àº™àº”ີບັ໊àºàºœà»ˆàº²àº™ USB?"</string>
+ <string name="usb_debugging_message" msgid="2220143855912376496">"ລາàºàº™àº´à»‰àº¡àº· RSA ຂອງຄອມພິວເຕີà»àº¡à»ˆàº™:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
+ <string name="usb_debugging_always" msgid="303335496705863070">"ອະນຸàºàº²àº”ຈາàºàº„ອມພິວເຕີນີ້ຕະຫຼອດ"</string>
+ <string name="compat_mode_on" msgid="6623839244840638213">"ຊູມໃຫ້ເຕັມໜ້າຈà»"</string>
+ <string name="compat_mode_off" msgid="4434467572461327898">"ປັບໃຫ້ເຕັມໜ້າຈà»"</string>
+ <string name="compat_mode_help_header" msgid="7969493989397529910">"ຄວາມເຂົ້າàºàº±àº™à»„ດ້ຂອງàºàº²àº™àºŠàº¹àº¡"</string>
+ <string name="compat_mode_help_body" msgid="4946726776359270040">"ເມື່ອà»àº­àº±àºšàº¯àº–ືàºàº­àº­àºà»àºšàºšàº¡àº²àºªàº³àº¥àº±àºšà»œà»‰àº²àºˆà»àº™à»‰àº­àºàºàº§à»ˆàº²â€‹, ຕົວຄວບຄຸມàºàº²àº™àºŠàº¹àº¡àºˆàº°àº›àº²àºàº»àº”ຢູ່ໃàºà»‰àºàº±àºšà»‚ມງ."</string>
+ <string name="screenshot_saving_ticker" msgid="7403652894056693515">"àºàº³àº¥àº±àº‡àºšàº±àº™àº—ຶàºàº®àº¹àºšà»œà»‰àº²àºˆà»"</string>
+ <string name="screenshot_saving_title" msgid="8242282144535555697">"àºàº³àº¥àº±àº‡àºšàº±àº™àº—ຶàºàºžàº²àºšà»œà»‰àº²àºˆà»..."</string>
+ <string name="screenshot_saving_text" msgid="2419718443411738818">"àºàº³àº¥àº±àº‡àºšàº±àº™àº—ຶàºàºžàº²àºšà»œà»‰àº²àºˆà»."</string>
+ <string name="screenshot_saved_title" msgid="6461865960961414961">"ຖ່າàºàº®àº¹àºšà»œà»‰àº²àºˆà»à»àº¥à»‰àº§"</string>
+ <string name="screenshot_saved_text" msgid="1152839647677558815">"à»àº•ະເພື່ອເບິ່ງພາບໜ້າຈà»àº‚ອງທ່ານ."</string>
+ <string name="screenshot_failed_title" msgid="705781116746922771">"ບà»à»ˆàºªàº²àº¡àº²àº”ຖ່າàºàº®àº¹àºšà»œà»‰àº²àºˆà»à»„ດ້"</string>
+ <string name="screenshot_failed_text" msgid="8134011269572415402">"ບà»à»ˆàºªàº²àº¡àº²àº”ບັນທຶàºàºžàº²àºšà»œà»‰àº²àºˆà»à»„ດ້. ບ່ອນຈັດເàºàº±àºšàº­àº²àº”àºàº³àº¥àº±àº‡àº–ືàºàº™àº³à»ƒàºŠà»‰àº¢àº¹à»ˆ."</string>
+ <string name="usb_preference_title" msgid="6551050377388882787">"USB ໂຕເລືອàºàºàº²àº™àºà»‰àº²àºà»„ຟລ໌"</string>
+ <string name="use_mtp_button_title" msgid="4333504413563023626">"ເຊື່ອມຕà»à»ˆà»€àº›àº±àº™ media player (MTP)"</string>
+ <string name="use_ptp_button_title" msgid="7517127540301625751">"ເຊື່ອມຕà»à»ˆà»€àº›àº±àº™àºà»‰àº­àº‡àº–່າàºàº®àº¹àºš (PTP)"</string>
+ <string name="installer_cd_button_title" msgid="2312667578562201583">"ຕິດຕັ້ງà»àº­àº±àºšàº¯ Android File Transfer ສຳລັບ Mac"</string>
+ <string name="accessibility_back" msgid="567011538994429120">"àºàº±àºšàº„ືນ"</string>
+ <string name="accessibility_home" msgid="8217216074895377641">"ໜ້າທຳອິດ"</string>
+ <string name="accessibility_menu" msgid="316839303324695949">"ເມນູ"</string>
+ <string name="accessibility_recent" msgid="8571350598987952883">"à»àº­àº±àºšàº¯àº«àº¼à»‰àº²àºªàº¸àº”"</string>
+ <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"ປຸ່ມສະລັບຮູບà»àºšàºšàºàº²àº™àº›à»‰àº­àº™àº‚à»à»‰àº¡àº¹àº™."</string>
+ <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"ປຸ່ມຊູມທີ່ໃຊ້ຮ່ວມàºàº±àº™à»„ດ້."</string>
+ <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"ຊູມຈà»àº™à»‰àº­àºà»„ປເປັນຈà»àº‚ະຫນາດໃຫàºà»ˆ."</string>
+ <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"ເຊື່ອມຕà»à»ˆ Bluetooth à»àº¥à»‰àº§."</string>
+ <string name="accessibility_bluetooth_disconnected" msgid="7416648669976870175">"Bluetooth ຖືàºàº•ັດàºàº²àº™à»€àºŠàº·à»ˆàº­àº¡àº•à»à»ˆà»àº¥à»‰àº§."</string>
+ <string name="accessibility_no_battery" msgid="358343022352820946">"à»àºšàº±àº”ເຕີຣີà»àº»àº”."</string>
+ <string name="accessibility_battery_one_bar" msgid="7774887721891057523">"à»àºšàº±àº”ເຕີຣີນຶ່ງຂີດ."</string>
+ <string name="accessibility_battery_two_bars" msgid="8500650438735009973">"à»àºšàº±àº”ເຕີຣີສອງຂີດ."</string>
+ <string name="accessibility_battery_three_bars" msgid="2302983330865040446">"à»àºšàº±àº”ເຕີຣີສາມຂີດ."</string>
+ <string name="accessibility_battery_full" msgid="8909122401720158582">"à»àºšàº±àº”ເຕີຣີເຕັມ."</string>
+ <string name="accessibility_no_phone" msgid="4894708937052611281">"ບà»à»ˆàº¡àºµà»‚ທລະສັບ."</string>
+ <string name="accessibility_phone_one_bar" msgid="687699278132664115">"ສັນàºàº²àº™àº™àº¶à»ˆàº‡àº‚ີດ."</string>
+ <string name="accessibility_phone_two_bars" msgid="8384905382804815201">"ສັນàºàº²àº™àºªàº­àº‡àº‚ີດ."</string>
+ <string name="accessibility_phone_three_bars" msgid="8521904843919971885">"ສັນàºàº²àº™àºªàº²àº¡àº‚ີດ."</string>
+ <string name="accessibility_phone_signal_full" msgid="6471834868580757898">"ສັນàºàº²àº™à»€àº•ັມ."</string>
+ <string name="accessibility_no_data" msgid="4791966295096867555">"ບà»à»ˆàº¡àºµàº‚à»à»‰àº¡àº¹àº™."</string>
+ <string name="accessibility_data_one_bar" msgid="1415625833238273628">"ຂà»à»‰àº¡àº¹àº™àº™àº¶à»ˆàº‡àº‚ີດ."</string>
+ <string name="accessibility_data_two_bars" msgid="6166018492360432091">"ຂà»à»‰àº¡àº¹àº™àºªàº­àº‡àº‚ີດ."</string>
+ <string name="accessibility_data_three_bars" msgid="9167670452395038520">"ຂà»à»‰àº¡àº¹àº™àºªàº²àº¡àº‚ີດ."</string>
+ <string name="accessibility_data_signal_full" msgid="2708384608124519369">"ສັນ​àºàº²àº™àº‚à»à»‰àº¡àº¹àº™â€‹à»€àº•ັມ."</string>
+ <string name="accessibility_wifi_off" msgid="3177380296697933627">"WiFi ປິດຢູ່."</string>
+ <string name="accessibility_no_wifi" msgid="1425476551827924474">"ຕັດàºàº²àº™à»€àºŠàº·à»ˆàº­àº¡àº•à»à»ˆ Wi-Fi à»àº¥à»‰àº§."</string>
+ <string name="accessibility_wifi_one_bar" msgid="7735893178010724377">"ສັນàºàº²àº™ Wi-Fi ນຶ່ງຂີດ."</string>
+ <string name="accessibility_wifi_two_bars" msgid="4994274250497262434">"ສັນàºàº²àº™ Wi-Fi ສອງຂີດ."</string>
+ <string name="accessibility_wifi_three_bars" msgid="3495755044276588384">"Wifi ສາມຂີດ."</string>
+ <string name="accessibility_wifi_signal_full" msgid="6853561303586480376">"ສັນàºàº²àº™ Wi-Fi ເຕັມ"</string>
+ <string name="accessibility_no_wimax" msgid="4329180129727630368">"ບà»à»ˆàº¡àºµ WiMAX."</string>
+ <string name="accessibility_wimax_one_bar" msgid="4170994299011863648">"WiMAX ນຶ່ງຂີດ."</string>
+ <string name="accessibility_wimax_two_bars" msgid="9176236858336502288">"WiMAX ສອງຂີດ."</string>
+ <string name="accessibility_wimax_three_bars" msgid="6116551636752103927">"WiMAX ສາມຂີດ."</string>
+ <string name="accessibility_wimax_signal_full" msgid="2768089986795579558">"ສັນ​àºàº²àº™ WiMAX ເຕັມ."</string>
+ <string name="accessibility_no_signal" msgid="7064645320782585167">"ບà»à»ˆàº¡àºµàºªàº±àº™àºàº²àº™."</string>
+ <string name="accessibility_not_connected" msgid="6395326276213402883">"ບà»à»ˆà»„ດ້ເຊື່ອມຕà»à»ˆ."</string>
+ <string name="accessibility_zero_bars" msgid="3806060224467027887">"ບà»à»ˆàº¡àºµàºˆàº±àºàº‚ີດ."</string>
+ <string name="accessibility_one_bar" msgid="1685730113192081895">"ນຶ່ງຂີດ."</string>
+ <string name="accessibility_two_bars" msgid="6437363648385206679">"ສອງຂີດ."</string>
+ <string name="accessibility_three_bars" msgid="2648241415119396648">"ສາມຂີດ."</string>
+ <string name="accessibility_signal_full" msgid="9122922886519676839">"ສັນàºàº²àº™à»€àº•ັມ."</string>
+ <string name="accessibility_desc_on" msgid="2385254693624345265">"ເປີດ."</string>
+ <string name="accessibility_desc_off" msgid="6475508157786853157">"ປິດ."</string>
+ <string name="accessibility_desc_connected" msgid="8366256693719499665">"ເຊື່ອມ​ຕà»à»ˆà»àº¥à»‰àº§."</string>
+ <string name="accessibility_data_connection_gprs" msgid="1606477224486747751">"GPRS"</string>
+ <string name="accessibility_data_connection_1x" msgid="994133468120244018">"1 X"</string>
+ <string name="accessibility_data_connection_hspa" msgid="2032328855462645198">"HSPA"</string>
+ <string name="accessibility_data_connection_3g" msgid="8628562305003568260">"3G"</string>
+ <string name="accessibility_data_connection_3.5g" msgid="8664845609981692001">"3.5G"</string>
+ <string name="accessibility_data_connection_4g" msgid="7741000750630089612">"4G"</string>
+ <string name="accessibility_data_connection_lte" msgid="5413468808637540658">"LTE"</string>
+ <string name="accessibility_data_connection_cdma" msgid="6132648193978823023">"CDMA"</string>
+ <string name="accessibility_data_connection_roaming" msgid="5977362333466556094">"ໂຣມມິງ"</string>
+ <string name="accessibility_data_connection_edge" msgid="4477457051631979278">"Edge"</string>
+ <string name="accessibility_data_connection_wifi" msgid="2324496756590645221">"Wi-Fi"</string>
+ <string name="accessibility_no_sim" msgid="8274017118472455155">"ບà»à»ˆàº¡àºµàºŠàº´àº¡."</string>
+ <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"àºàº²àº™àº›à»ˆàº­àºàºªàº±àº™àºàº²àº™ Bluetooth."</string>
+ <string name="accessibility_airplane_mode" msgid="834748999790763092">"ໂà»àº”ໃນàºàº»àº™."</string>
+ <string name="accessibility_battery_level" msgid="7451474187113371965">"à»àºšàº±àº”ເຕີຣີ <xliff:g id="NUMBER">%d</xliff:g> ເປີເຊັນ."</string>
+ <string name="accessibility_settings_button" msgid="799583911231893380">"àºàº²àº™àº•ັ້ງຄ່າລະບົບ."</string>
+ <string name="accessibility_notifications_button" msgid="4498000369779421892">"àºàº²àº™à»àºˆà»‰àº‡à»€àº•ືອນ."</string>
+ <string name="accessibility_remove_notification" msgid="3603099514902182350">"ລຶບລ້າງàºàº²àº™à»àºˆà»‰àº‡à»€àº•ືອນ."</string>
+ <string name="accessibility_gps_enabled" msgid="3511469499240123019">"GPS ເປີດà»àº¥à»‰àº§."</string>
+ <string name="accessibility_gps_acquiring" msgid="8959333351058967158">"àºàº³àº¥àº±àº‡àºŠàº­àºàº«àº² GPS."</string>
+ <string name="accessibility_tty_enabled" msgid="4613200365379426561">"TeleTypewriter ຖືàºà»€àº›àºµàº”ຢູ່."</string>
+ <string name="accessibility_ringer_vibrate" msgid="666585363364155055">"ສັ່ນເຕືອນພ້ອມສຽງເອີ້ນເຂົ້າ."</string>
+ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"ປິດສຽງ."</string>
+ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"ປິດ <xliff:g id="APP">%s</xliff:g> à»àº¥à»‰àº§."</string>
+ <string name="accessibility_notification_dismissed" msgid="854211387186306927">"ປິດàºàº²àº™à»àºˆà»‰àº‡à»€àº•ືອນà»àº¥à»‰àº§."</string>
+ <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"ໜ້າຈà»à»àºˆà»‰àº‡à»€àº•ືອນ."</string>
+ <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"àºàº²àº™àº•ັ້ງຄ່າດ່ວນ."</string>
+ <string name="accessibility_desc_recent_apps" msgid="9014032916410590027">"à»àº­àº±àºšàº¯àº—ີ່ຫາàºà»à»ƒàºŠà»‰."</string>
+ <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"ຜູ່ໃຊ້ <xliff:g id="USER">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_wifi" msgid="6099781031669728709">"<xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="NETWORK">%2$s</xliff:g>"</string>
+ <string name="accessibility_quick_settings_mobile" msgid="4876806564086241341">"ມືຖື <xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="TYPE">%2$s</xliff:g>. <xliff:g id="NETWORK">%3$s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"à»àºšàº±àº”ເຕີຣີ <xliff:g id="STATE">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_airplane" msgid="4196876722090224753">"ໂà»àº”ໃນàºàº»àº™ <xliff:g id="STATE">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_bluetooth" msgid="5749054971341882340">"Bluetooth <xliff:g id="STATE">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"ຕັ້ງໂມງປຸຠ<xliff:g id="TIME">%s</xliff:g> à»àº¥à»‰àº§."</string>
+ <string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"ອິນເຕີເນັດ 2G​, 3G ຖືàºàº›àº´àº”à»àº¥à»‰àº§"</string>
+ <string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"àºàº²àº™àº™àº³à»ƒàºŠà»‰àº‚à»à»‰àº¡àº¹àº™ 4G ຖືàºàº›àº´àº”à»àº¥à»‰àº§"</string>
+ <string name="data_usage_disabled_dialog_mobile_title" msgid="1046047248844821202">"ອິນເຕີເນັດໃນມືຖືຖືàºàº›àº´àº”àºàº²àº™àº™àº³à»ƒàºŠà»‰à»àº¥à»‰àº§"</string>
+ <string name="data_usage_disabled_dialog_title" msgid="2086815304858964954">"ອິນເຕີເນັດຖືàºàº›àº´àº”àºàº²àº™àº™àº³à»ƒàºŠà»‰à»àº¥à»‰àº§"</string>
+ <string name="data_usage_disabled_dialog" msgid="3853117269051806280">"ທ່ານໄດ້ໃຊ້ຂà»à»‰àº¡àº¹àº™àºˆàº»àº™àº®àº­àº”ຈຳນວນທີ່ຈຳàºàº±àº”ໄວ້à»àº¥à»‰àº§.\n\nຫາàºàº—່ານເປີດນຳໃຊ້ຂà»à»‰àº¡àº¹àº™àº„ືນອີàºàº„ັ້ງ, ທ່ານອາດຖືàºàº®àº½àºà»€àºàº±àºšà»€àº‡àº´àº™à»‚ດàºàºœàº¹à»ˆà»ƒàº«à»‰àºšà»àº¥àº´àºàº²àº™à»„ດ້."</string>
+ <string name="data_usage_disabled_dialog_enable" msgid="7729772039208664606">"ເປີດນຳໃຊ້ຂà»à»‰àº¡àº¹àº™àº„ືນໃà»à»ˆ"</string>
+ <string name="status_bar_settings_signal_meter_disconnected" msgid="1940231521274147771">"ບà»à»ˆàº¡àºµàºàº²àº™à»€àºŠàº·à»ˆàº­àº¡àº•à»à»ˆàº­àº´àº™à»€àº•ີເນັດ"</string>
+ <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"ເຊື່ອມ​ຕà»à»ˆ Wi-​-Fi à»àº¥à»‰àº§"</string>
+ <string name="gps_notification_searching_text" msgid="8574247005642736060">"àºàº³àº¥àº±àº‡àºŠàº­àºàº«àº² GPS"</string>
+ <string name="gps_notification_found_text" msgid="4619274244146446464">"ສະຖານທີ່àºàº³àº™àº»àº”ໂດຠGPS"</string>
+ <string name="accessibility_location_active" msgid="2427290146138169014">"àºàº²àº™àº®à»‰àº­àº‡àº‚à»àºªàº°àº–ານທີ່ທີ່ເຮັດວຽàºàº¢àº¹à»ˆ"</string>
+ <string name="accessibility_clear_all" msgid="5235938559247164925">"ລຶບàºàº²àº™à»àºˆà»‰àº‡à»€àº•ືອນທັງà»àº»àº”."</string>
+ <string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"ຂà»à»‰àº¡àº¹àº™à»àº­àº±àºšàº¯"</string>
+ <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"ໜ້າຈà»àºˆàº°à»àº¸àº™à»‚ດàºàº­àº±àº”ຕະໂນມັດ."</string>
+ <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"ໜ້າຈà»àº–ືàºàº¥àº±àº­àºà»ƒàº™àº¥àº§àº‡àº™àº­àº™."</string>
+ <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"ໜ້າຈà»àº–ືàºàº¥àº±àº­àºàº¢àº¹à»ˆà»ƒàº™à»‚à»àº”à»àº™àº§àº•ັ້ງ."</string>
+ <string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
+ <string name="start_dreams" msgid="7219575858348719790">"Daydream"</string>
+ <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
+ <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"ໂà»àº”ຢູ່ໃນàºàº»àº™"</string>
+ <string name="quick_settings_battery_charging_label" msgid="490074774465309209">"àºàº³àº¥àº±àº‡àºªàº²àº, <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+ <string name="quick_settings_battery_charged_label" msgid="8865413079414246081">"ສາàºà»€àº•ັມà»àº¥à»‰àº§"</string>
+ <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string>
+ <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (<xliff:g id="NUMBER">%d</xliff:g> ອຸປະàºàº­àº™)"</string>
+ <string name="quick_settings_bluetooth_off_label" msgid="8159652146149219937">"Bluetooth ປິດ"</string>
+ <string name="quick_settings_brightness_label" msgid="6968372297018755815">"ຄວາມສະຫວ່າງ"</string>
+ <string name="quick_settings_rotation_unlocked_label" msgid="336054930362580584">"à»àº¸àº™à»œà»‰àº²àºˆà»àº­àº±àº”ຕະໂນມັດ"</string>
+ <string name="quick_settings_rotation_locked_label" msgid="8058646447242565486">"ລັອàºàºàº²àº™àº›à»ˆàº½àº™àº¥àº§àº‡"</string>
+ <string name="quick_settings_ime_label" msgid="7073463064369468429">"ວິທີàºàº²àº™àº›à»‰àº­àº™àº‚à»à»‰àº¡àº¹àº™"</string>
+ <string name="quick_settings_location_label" msgid="5011327048748762257">"ສະຖານທີ່"</string>
+ <string name="quick_settings_location_off_label" msgid="7464544086507331459">"ຂà»à»‰àº¡àº¹àº™àºªàº°àº–ານທີ່ປິດຢູ່"</string>
+ <string name="quick_settings_media_device_label" msgid="1302906836372603762">"ອຸປະàºàº­àº™àºªàº·à»ˆ"</string>
+ <string name="quick_settings_rssi_label" msgid="7725671335550695589">"RSSI"</string>
+ <string name="quick_settings_rssi_emergency_only" msgid="2713774041672886750">"ໂທສຸàºà»€àºªàºµàº™à»€àº—ົ່ານັ້ນ"</string>
+ <string name="quick_settings_settings_label" msgid="5326556592578065401">"àºàº²àº™àº•ັ້ງຄ່າ"</string>
+ <string name="quick_settings_time_label" msgid="4635969182239736408">"ເວລາ"</string>
+ <string name="quick_settings_user_label" msgid="5238995632130897840">"ຂ້ອàº"</string>
+ <string name="quick_settings_wifi_label" msgid="9135344704899546041">"Wi​-Fi"</string>
+ <string name="quick_settings_wifi_not_connected" msgid="7171904845345573431">"ບà»à»ˆà»„ດ້ເຊື່ອມຕà»à»ˆ"</string>
+ <string name="quick_settings_wifi_no_network" msgid="2221993077220856376">"ບà»à»ˆàº¡àºµà»€àº„ືອຂ່າàº"</string>
+ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi​-Fi ປິດ"</string>
+ <string name="quick_settings_wifi_display_label" msgid="6893592964463624333">"ຈà»àºªàº°à»àº”ງຜົນ Wi-Fi"</string>
+ <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"àºàº²àº™àºªàº°à»àº”ງຜົນໄຮ້ສາàº"</string>
+ <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"ຄວາມà»àºˆà»‰àº‡"</string>
+ <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"ອັດຕະໂນມັດ"</string>
+ <string name="status_bar_help_title" msgid="1199237744086469217">"àºàº²àº™à»àºˆà»‰àº‡à»€àº•ືອນຈະປາàºàº»àº”ບ່ອນນີ້"</string>
+ <string name="status_bar_help_text" msgid="7874607155052076323">"ເຂົ້າເຖິງໄດ້ທຸàºà»€àº¡àº·à»ˆàº­à»‚ດàºàºàº²àº™àº›àº±àº”ນິ້ວລົງ.\nປັດລົງອີàºà»€àº—ື່ອນຶ່ງສຳລັບàºàº²àº™àº„ວບຄຸມລະບົບ."</string>
+</resources>
diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml
index bf8662a..3fae805 100644
--- a/packages/SystemUI/res/values-lt/strings.xml
+++ b/packages/SystemUI/res/values-lt/strings.xml
@@ -61,8 +61,6 @@
<string name="usb_debugging_always" msgid="303335496705863070">"Visada leisti iš šio kompiuterio"</string>
<string name="compat_mode_on" msgid="6623839244840638213">"Keisti mast., kad atit. ekr."</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Ištempti, kad atit. ekr."</string>
- <string name="compat_mode_help_header" msgid="7969493989397529910">"Suderinamumo mastelio keitimas"</string>
- <string name="compat_mode_help_body" msgid="4946726776359270040">"Kai programa bus pritaikyta mažesniam ekranui, mastelio keitimo valdiklis bus parodytas šalia laikrodžio."</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Išsaugoma ekrano kopija..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Išsaugoma ekrano kopija..."</string>
<string name="screenshot_saving_text" msgid="2419718443411738818">"Išsaugoma ekrano kopija."</string>
@@ -78,6 +76,8 @@
<string name="accessibility_home" msgid="8217216074895377641">"Pagrindinis"</string>
<string name="accessibility_menu" msgid="316839303324695949">"Meniu"</string>
<string name="accessibility_recent" msgid="8571350598987952883">"Naujausios programos"</string>
+ <string name="accessibility_search_light" msgid="1103867596330271848">"Ieškoti"</string>
+ <string name="accessibility_camera_button" msgid="8064671582820358152">"Fotoaparatas"</string>
<string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Perjungti įvesties metodo mygtuką."</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Suderinamumo priartinimo mygtukas."</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Padidinti ekranÄ…."</string>
@@ -153,6 +153,7 @@
<string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"Akumuliatorius <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_airplane" msgid="4196876722090224753">"Lėktuvo režimas <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="5749054971341882340">"„Bluetooth“ <xliff:g id="STATE">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_location" msgid="4577282329866813100">"Vietovė – <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"Signalas nustatytas <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"2G–3G duomenys neleidžiami"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"4G duomenys neleidžiami"</string>
@@ -164,12 +165,13 @@
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Prisij. prie „Wi-Fi“"</string>
<string name="gps_notification_searching_text" msgid="8574247005642736060">"Ieškoma GPS"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"GPS nustatyta vieta"</string>
+ <string name="accessibility_location_active" msgid="2427290146138169014">"Vietovės užklausos aktyvios"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"Išvalyti visus pranešimus."</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Programos informacija"</string>
<string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Ekranas bus sukamas automatiškai."</string>
<string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Užrakintas ekranas yra horizontalios orientacijos."</string>
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Užrakintas ekranas yra vertikalios orientacijos."</string>
- <string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
+ <string name="dessert_case" msgid="1295161776223959221">"Desertų dėklas"</string>
<string name="start_dreams" msgid="7219575858348719790">"SvajonÄ—"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Eternetas"</string>
<string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Lėktuvo režimas"</string>
@@ -198,8 +200,8 @@
<string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Belaidis rodymas"</string>
<string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Skaistis"</string>
<string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTOMATINIS"</string>
- <string name="status_bar_help_title" msgid="1199237744086469217">"PraneÅ¡imai rodomi Äia"</string>
- <string name="status_bar_help_text" msgid="7874607155052076323">"Perbraukę žemyn bet kuriuo metu pasieksite pranešimus.\nJei norite naudoti sistemos valdiklius, perbraukite žemyn dar kartą."</string>
- <string name="hideybar_confirmation_message" msgid="9050869548951044371">"Jei norite, kad būtų rodoma juosta, perbraukite ekrano krašte"</string>
- <string name="hideybar_confirmation_message_long" msgid="7117692795163620626">"Jei norite, kad būtų rodoma sistemos juosta, perbraukite iš ekrano krašto"</string>
+ <string name="quick_settings_inversion_label" msgid="1666358784283020762">"Spalvų inversijos režimas"</string>
+ <string name="quick_settings_contrast_label" msgid="3319507551689108692">"Patobulinto kontrasto režimas"</string>
+ <string name="quick_settings_color_space_label" msgid="853443689745584770">"Spalvų taisymo režimas"</string>
+ <string name="ssl_ca_cert_warning" msgid="9005954106902053641">"Tinklas gali\nbūti stebimas"</string>
</resources>
diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml
index b96a786..2a3a333 100644
--- a/packages/SystemUI/res/values-lv/strings.xml
+++ b/packages/SystemUI/res/values-lv/strings.xml
@@ -61,8 +61,6 @@
<string name="usb_debugging_always" msgid="303335496705863070">"Vienmēr atļaut no šī datora"</string>
<string name="compat_mode_on" msgid="6623839244840638213">"TÄlumm., lai aizp. ekr."</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Stiepiet, lai aizp. ekr."</string>
- <string name="compat_mode_help_header" msgid="7969493989397529910">"SaderÄ«bas tÄlummaiņa"</string>
- <string name="compat_mode_help_body" msgid="4946726776359270040">"Ja lietotne ir paredzÄ“ta mazÄkam ekrÄnam, blakus pulkstenim tiks parÄdÄ«ta tÄlummaiņas vadÄ«kla."</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"SaglabÄ ekrÄnuzņēmumu…"</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Notiek ekrÄnuzņēmuma saglabÄÅ¡ana..."</string>
<string name="screenshot_saving_text" msgid="2419718443411738818">"Notiek ekrÄnuzņēmuma saglabÄÅ¡ana."</string>
@@ -78,6 +76,8 @@
<string name="accessibility_home" msgid="8217216074895377641">"SÄkums"</string>
<string name="accessibility_menu" msgid="316839303324695949">"Izvēlne"</string>
<string name="accessibility_recent" msgid="8571350598987952883">"Nesen izmantotÄs lietotnes"</string>
+ <string name="accessibility_search_light" msgid="1103867596330271848">"Meklēt"</string>
+ <string name="accessibility_camera_button" msgid="8064671582820358152">"Kamera"</string>
<string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Ievades metodes maiņas poga."</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"SaderÄ«bas tÄlummaiņas poga."</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Veikt tÄlummaiņu no mazÄka ekrÄna uz lielÄku."</string>
@@ -153,6 +153,7 @@
<string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"Akumulatora statuss: <xliff:g id="STATE">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_airplane" msgid="4196876722090224753">"Lidojuma režīma statuss: <xliff:g id="STATE">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_bluetooth" msgid="5749054971341882340">"Bluetooth statuss: <xliff:g id="STATE">%s</xliff:g>"</string>
+ <string name="accessibility_quick_settings_location" msgid="4577282329866813100">"AtraÅ¡anÄs vieta: <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"SignÄls ir iestatÄ«ts uz: <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"2G–3G dati atspējoti"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"4G dati atspējoti"</string>
@@ -164,12 +165,13 @@
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Izv. sav. ar Wi-Fi"</string>
<string name="gps_notification_searching_text" msgid="8574247005642736060">"Notiek GPS meklēšana..."</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"GPS iestatÄ«tÄ atraÅ¡anÄs vieta"</string>
+ <string name="accessibility_location_active" msgid="2427290146138169014">"AktÄ«vi atraÅ¡anÄs vietu pieprasÄ«jumi"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"Notīrīt visus paziņojumus"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"InformÄcija par lietotni"</string>
<string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"EkrÄns tiks pagriezts automÄtiski."</string>
<string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"EkrÄns tagad ir bloÄ·Ä“ts ainavas orientÄcijÄ."</string>
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"EkrÄns tagad ir bloÄ·Ä“ts portreta orientÄcijÄ."</string>
- <string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
+ <string name="dessert_case" msgid="1295161776223959221">"Saldo ēdienu stends"</string>
<string name="start_dreams" msgid="7219575858348719790">"EkrÄnsaudzÄ“tÄjs"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Tīkls Ethernet"</string>
<string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Lidojuma režīms"</string>
@@ -198,8 +200,8 @@
<string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Bezvadu attēlošana"</string>
<string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Spilgtums"</string>
<string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTOMÄ€TISKI"</string>
- <string name="status_bar_help_title" msgid="1199237744086469217">"Å eit tiek rÄdÄ«ti paziņojumi"</string>
- <string name="status_bar_help_text" msgid="7874607155052076323">"Piekļūstiet tiem jebkurÄ laikÄ, velkot uz leju.\nVÄ“lreiz velciet, lai tiktu parÄdÄ«tas sistÄ“mas vadÄ«klas."</string>
- <string name="hideybar_confirmation_message" msgid="9050869548951044371">"Velciet no ekrÄna malas, lai piekļūtu joslai."</string>
- <string name="hideybar_confirmation_message_long" msgid="7117692795163620626">"Velciet no ekrÄna malas, lai piekļūtu sistÄ“mas joslai."</string>
+ <string name="quick_settings_inversion_label" msgid="1666358784283020762">"KrÄsu inversijas režīms"</string>
+ <string name="quick_settings_contrast_label" msgid="3319507551689108692">"Uzlabota kontrasta režīms"</string>
+ <string name="quick_settings_color_space_label" msgid="853443689745584770">"KrÄsu korekcijas režīms"</string>
+ <string name="ssl_ca_cert_warning" msgid="9005954106902053641">"Tīkls var\ntikt uzraudzīts"</string>
</resources>
diff --git a/packages/SystemUI/res/values-mn-land/strings.xml b/packages/SystemUI/res/values-mn-land/strings.xml
new file mode 100644
index 0000000..ec4616f
--- /dev/null
+++ b/packages/SystemUI/res/values-mn-land/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2010, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="toast_rotation_locked" msgid="7609673011431556092">"ДÑлгÑц Ñ…ÑвтÑÑ Ñ‡Ð¸Ð³Ð»Ñлд түгжигдÑÑн."</string>
+</resources>
diff --git a/packages/SystemUI/res/values-mn-rMN-land/strings.xml b/packages/SystemUI/res/values-mn-rMN-land/strings.xml
new file mode 100644
index 0000000..ec4616f
--- /dev/null
+++ b/packages/SystemUI/res/values-mn-rMN-land/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2010, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="toast_rotation_locked" msgid="7609673011431556092">"ДÑлгÑц Ñ…ÑвтÑÑ Ñ‡Ð¸Ð³Ð»Ñлд түгжигдÑÑн."</string>
+</resources>
diff --git a/packages/SystemUI/res/values-mn-rMN/strings.xml b/packages/SystemUI/res/values-mn-rMN/strings.xml
new file mode 100644
index 0000000..bbcf943
--- /dev/null
+++ b/packages/SystemUI/res/values-mn-rMN/strings.xml
@@ -0,0 +1,207 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="7164937344850004466">"СиÑтем UI"</string>
+ <string name="status_bar_clear_all_button" msgid="7774721344716731603">"ЦÑвÑрлÑÑ…"</string>
+ <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"ЖагÑÐ°Ð°Ð»Ñ‚Ð°Ð°Ñ ÑƒÑтгах"</string>
+ <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Ðпп мÑдÑÑлÑл"</string>
+ <string name="status_bar_no_recent_apps" msgid="6576392951053994640">"Сүүлийн апп хооÑон"</string>
+ <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Сүүлийн апп-уудыг хаах"</string>
+ <plurals name="status_bar_accessibility_recent_apps">
+ <item quantity="one" msgid="5854176083865845541">"1 Ñүүлийн апп"</item>
+ <item quantity="other" msgid="1040784359794890744">"%d Ñүүлийн апп"</item>
+ </plurals>
+ <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"МÑдÑгдÑл байхгүй"</string>
+ <string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"ГарÑан"</string>
+ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"МÑдÑгдÑл"</string>
+ <string name="battery_low_title" msgid="2783104807551211639">"ЦÑнÑглÑгчийг холбоно уу"</string>
+ <string name="battery_low_subtitle" msgid="1752040062087829196">"Батерей дууÑаж байна."</string>
+ <string name="battery_low_percent_format" msgid="1077244949318261761">"<xliff:g id="NUMBER">%d%%</xliff:g> үлдÑÑн"</string>
+ <string name="invalid_charger" msgid="4549105996740522523">"USB цÑнÑглÑлт дÑмжигдÑхгүй байна.\nЗөвхөн нийлүүлÑгдÑÑн цÑнÑглÑгчийг ашиглана уу."</string>
+ <string name="battery_low_why" msgid="7279169609518386372">"Батерей ашиглах"</string>
+ <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Тохиргоо"</string>
+ <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
+ <string name="status_bar_settings_airplane" msgid="4879879698500955300">"ÐиÑлÑгийн горим"</string>
+ <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"ДÑлгÑцийг автоматаар ÑргүүлÑÑ…"</string>
+ <string name="status_bar_settings_mute_label" msgid="554682549917429396">"Ð¥ÐÐÐ¥"</string>
+ <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"ÐВТОМÐТ"</string>
+ <string name="status_bar_settings_notifications" msgid="397146176280905137">"МÑдÑгдÑл"</string>
+ <string name="bluetooth_tethered" msgid="7094101612161133267">"Блютүүтыг модем болгож байна"</string>
+ <string name="status_bar_input_method_settings_configure_input_methods" msgid="3504292471512317827">"Оруулах аргыг тохируулах"</string>
+ <string name="status_bar_use_physical_keyboard" msgid="7551903084416057810">"Бодит гар"</string>
+ <string name="usb_device_permission_prompt" msgid="834698001271562057">"<xliff:g id="APPLICATION">%1$s</xliff:g> апп-г USB төхөөрөмжид хандахыг зөвшөөрөх үү?"</string>
+ <string name="usb_accessory_permission_prompt" msgid="5171775411178865750">"<xliff:g id="APPLICATION">%1$s</xliff:g> апп-г USB төхөөрөмжид хандахыг зөвшөөрөх үү?"</string>
+ <string name="usb_device_confirm_prompt" msgid="5161205258635253206">"Ð­Ð½Ñ USB төхөөрөмж холбогдох үед <xliff:g id="ACTIVITY">%1$s</xliff:g>-г нÑÑÑ… Ò¯Ò¯?"</string>
+ <string name="usb_accessory_confirm_prompt" msgid="3808984931830229888">"Ð­Ð½Ñ USB төхөөрөмж холбогдох үед <xliff:g id="ACTIVITY">%1$s</xliff:g>-г нÑÑÑ… Ò¯Ò¯?"</string>
+ <string name="usb_accessory_uri_prompt" msgid="513450621413733343">"Ð­Ð½Ñ USB Ñ…ÑÑ€ÑгÑÑл дÑÑÑ€ ÑуулгаÑан апп ажиллаагүй байна. Ð­Ð½Ñ Ñ…ÑÑ€ÑгÑлийн талаар <xliff:g id="URL">%1$s</xliff:g>-Ñ Ð´ÑлгÑÑ€Ñнгүй Ò¯Ð·Ð½Ñ Ò¯Ò¯."</string>
+ <string name="title_usb_accessory" msgid="4966265263465181372">"USB төхөөрөмж"</string>
+ <string name="label_view" msgid="6304565553218192990">"ҮзÑÑ…"</string>
+ <string name="always_use_device" msgid="1450287437017315906">"Ð­Ð½Ñ USB төхөөрөмжийг үндÑÑн болгон ашиглах"</string>
+ <string name="always_use_accessory" msgid="1210954576979621596">"Ð­Ð½Ñ USB төхөөрөмжийг үндÑÑн болгон ашиглах"</string>
+ <string name="usb_debugging_title" msgid="4513918393387141949">"USB дебаг хийхийг зөвшөөрөх үү?"</string>
+ <string name="usb_debugging_message" msgid="2220143855912376496">"Компьютерийн RSA түлхүүрийн хурууны Ñ…ÑÑ :\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
+ <string name="usb_debugging_always" msgid="303335496705863070">"Ð­Ð½Ñ ÐºÐ¾Ð¼Ð¿ÑŒÑŽÑ‚ÐµÑ€ÑÑÑ Ð¾Ñ€Ð¾Ñ…Ñ‹Ð³ байнга зөвшөөрөх"</string>
+ <string name="compat_mode_on" msgid="6623839244840638213">"ДÑлгÑц дүүргÑÑ… бол Ó©Ñгөнө Ò¯Ò¯"</string>
+ <string name="compat_mode_off" msgid="4434467572461327898">"ДÑлгÑц дүүргÑÑ… бол татна уу"</string>
+ <string name="screenshot_saving_ticker" msgid="7403652894056693515">"ДÑлгÑцийн агшинг хадгалж байна…"</string>
+ <string name="screenshot_saving_title" msgid="8242282144535555697">"ДÑлгÑцийн агшинг хадгалж байна…"</string>
+ <string name="screenshot_saving_text" msgid="2419718443411738818">"ДÑлгÑцийн агшин хадгалагдав."</string>
+ <string name="screenshot_saved_title" msgid="6461865960961414961">"ДÑлгÑцийн агшинг авÑан."</string>
+ <string name="screenshot_saved_text" msgid="1152839647677558815">"ДÑлгÑцийн агшныг харах бол Ñ…Ò¯Ñ€Ð½Ñ Ò¯Ò¯."</string>
+ <string name="screenshot_failed_title" msgid="705781116746922771">"ДÑлгÑцийн агшинг авч чадÑангүй."</string>
+ <string name="screenshot_failed_text" msgid="8134011269572415402">"ДÑлгÑцийн агшинг хадгалж чадÑангүй. Сан ашиглагдаж байгаа бололтой."</string>
+ <string name="usb_preference_title" msgid="6551050377388882787">"USB файл шилжүүлÑÑ… Ñонголт"</string>
+ <string name="use_mtp_button_title" msgid="4333504413563023626">"Медиа тоглуулагч(MTP) болгон залгах"</string>
+ <string name="use_ptp_button_title" msgid="7517127540301625751">"Камер болгон(PTP) залгах"</string>
+ <string name="installer_cd_button_title" msgid="2312667578562201583">"МаÑ-д зориулÑан Ðндройд Файл ШилжүүлÑÑ… апп-г Ñуулгана уу"</string>
+ <string name="accessibility_back" msgid="567011538994429120">"Буцах"</string>
+ <string name="accessibility_home" msgid="8217216074895377641">"ГÑрийн"</string>
+ <string name="accessibility_menu" msgid="316839303324695949">"ЦÑÑ"</string>
+ <string name="accessibility_recent" msgid="8571350598987952883">"Сүүлийн апп"</string>
+ <string name="accessibility_search_light" msgid="1103867596330271848">"Хайх"</string>
+ <string name="accessibility_camera_button" msgid="8064671582820358152">"Камер"</string>
+ <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Оруулах аргыг ÑÑлгÑÑ… товч."</string>
+ <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Тохиромжтой Ó©Ñгөх товч."</string>
+ <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"ЖижгÑÑÑ Ñ‚Ð¾Ð¼ дÑлгÑцрүү Ó©Ñгөх."</string>
+ <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Блютүүт холбогдÑон."</string>
+ <string name="accessibility_bluetooth_disconnected" msgid="7416648669976870175">"Блютүүт таÑрав."</string>
+ <string name="accessibility_no_battery" msgid="358343022352820946">"Батерей байхгүй."</string>
+ <string name="accessibility_battery_one_bar" msgid="7774887721891057523">"Батерей нÑг баганатай."</string>
+ <string name="accessibility_battery_two_bars" msgid="8500650438735009973">"Батерей хоёр баганатай."</string>
+ <string name="accessibility_battery_three_bars" msgid="2302983330865040446">"Батерей гурван баганатай."</string>
+ <string name="accessibility_battery_full" msgid="8909122401720158582">"Батерей дүүрÑн."</string>
+ <string name="accessibility_no_phone" msgid="4894708937052611281">"Ð£Ñ‚Ð°Ñ Ð±Ð°Ð¹Ñ…Ð³Ò¯Ð¹."</string>
+ <string name="accessibility_phone_one_bar" msgid="687699278132664115">"Ð£Ñ‚Ð°Ñ Ð½Ñг баганатай."</string>
+ <string name="accessibility_phone_two_bars" msgid="8384905382804815201">"Ð£Ñ‚Ð°Ñ Ñ…Ð¾Ñ‘Ñ€ баганатай."</string>
+ <string name="accessibility_phone_three_bars" msgid="8521904843919971885">"Ð£Ñ‚Ð°Ñ Ð³ÑƒÑ€Ð²Ð°Ð½ баганатай."</string>
+ <string name="accessibility_phone_signal_full" msgid="6471834868580757898">"УтаÑны дохио дүүрÑн."</string>
+ <string name="accessibility_no_data" msgid="4791966295096867555">"Дата байхгүй."</string>
+ <string name="accessibility_data_one_bar" msgid="1415625833238273628">"Дата нÑг баганатай."</string>
+ <string name="accessibility_data_two_bars" msgid="6166018492360432091">"Дата хоёр баганатай."</string>
+ <string name="accessibility_data_three_bars" msgid="9167670452395038520">"Дата гурван баганатай."</string>
+ <string name="accessibility_data_signal_full" msgid="2708384608124519369">"Дата дохио дүүрÑн."</string>
+ <string name="accessibility_wifi_off" msgid="3177380296697933627">"Wifi унтарÑан."</string>
+ <string name="accessibility_no_wifi" msgid="1425476551827924474">"Wifi Ñалав."</string>
+ <string name="accessibility_wifi_one_bar" msgid="7735893178010724377">"Wifi нÑг баганатай."</string>
+ <string name="accessibility_wifi_two_bars" msgid="4994274250497262434">"Wifi хоёр баганатай."</string>
+ <string name="accessibility_wifi_three_bars" msgid="3495755044276588384">"Wifi гурван баганатай."</string>
+ <string name="accessibility_wifi_signal_full" msgid="6853561303586480376">"Wifi дохио дүүрÑн."</string>
+ <string name="accessibility_no_wimax" msgid="4329180129727630368">"WiMAX байхгүй."</string>
+ <string name="accessibility_wimax_one_bar" msgid="4170994299011863648">"WiMAX нÑг багана."</string>
+ <string name="accessibility_wimax_two_bars" msgid="9176236858336502288">"WiMAX хоёр баганатай."</string>
+ <string name="accessibility_wimax_three_bars" msgid="6116551636752103927">"WiMAX гурван баганатай."</string>
+ <string name="accessibility_wimax_signal_full" msgid="2768089986795579558">"WiMAX дохио дүүрÑн."</string>
+ <string name="accessibility_no_signal" msgid="7064645320782585167">"Дохио байхгүй."</string>
+ <string name="accessibility_not_connected" msgid="6395326276213402883">"Холбогдоогүй."</string>
+ <string name="accessibility_zero_bars" msgid="3806060224467027887">"ТÑг баганатай."</string>
+ <string name="accessibility_one_bar" msgid="1685730113192081895">"ÐÑг баганатай."</string>
+ <string name="accessibility_two_bars" msgid="6437363648385206679">"Хоёр багана."</string>
+ <string name="accessibility_three_bars" msgid="2648241415119396648">"Гурван баганатай."</string>
+ <string name="accessibility_signal_full" msgid="9122922886519676839">"Дохио дүүрÑн."</string>
+ <string name="accessibility_desc_on" msgid="2385254693624345265">"ИдÑвхижÑÑн."</string>
+ <string name="accessibility_desc_off" msgid="6475508157786853157">"Унтраах"</string>
+ <string name="accessibility_desc_connected" msgid="8366256693719499665">"ХолбогдÑон."</string>
+ <string name="accessibility_data_connection_gprs" msgid="1606477224486747751">"GPRS"</string>
+ <string name="accessibility_data_connection_1x" msgid="994133468120244018">"1 X"</string>
+ <string name="accessibility_data_connection_hspa" msgid="2032328855462645198">"HSPA"</string>
+ <string name="accessibility_data_connection_3g" msgid="8628562305003568260">"3G"</string>
+ <string name="accessibility_data_connection_3.5g" msgid="8664845609981692001">"3.5G"</string>
+ <string name="accessibility_data_connection_4g" msgid="7741000750630089612">"4G"</string>
+ <string name="accessibility_data_connection_lte" msgid="5413468808637540658">"LTE"</string>
+ <string name="accessibility_data_connection_cdma" msgid="6132648193978823023">"CDMA"</string>
+ <string name="accessibility_data_connection_roaming" msgid="5977362333466556094">"Рүүминг"</string>
+ <string name="accessibility_data_connection_edge" msgid="4477457051631979278">"Edge"</string>
+ <string name="accessibility_data_connection_wifi" msgid="2324496756590645221">"Wi-Fi"</string>
+ <string name="accessibility_no_sim" msgid="8274017118472455155">"SIM байхгүй."</string>
+ <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Блютүүт модем болж байна."</string>
+ <string name="accessibility_airplane_mode" msgid="834748999790763092">"ÐиÑлÑгийн горим"</string>
+ <string name="accessibility_battery_level" msgid="7451474187113371965">"Батерей <xliff:g id="NUMBER">%d</xliff:g> хувьтай."</string>
+ <string name="accessibility_settings_button" msgid="799583911231893380">"СиÑтемийн тохиргоо."</string>
+ <string name="accessibility_notifications_button" msgid="4498000369779421892">"МÑдÑгдÑл."</string>
+ <string name="accessibility_remove_notification" msgid="3603099514902182350">"МÑдÑгдлийг цÑвÑрлÑÑ…."</string>
+ <string name="accessibility_gps_enabled" msgid="3511469499240123019">"GPS идÑвхтÑй."</string>
+ <string name="accessibility_gps_acquiring" msgid="8959333351058967158">"GPS хайж байна."</string>
+ <string name="accessibility_tty_enabled" msgid="4613200365379426561">"TeleTypewriter идÑвхтÑй болов."</string>
+ <string name="accessibility_ringer_vibrate" msgid="666585363364155055">"Хонхны чичиргÑÑ."</string>
+ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"Хонхыг хаах."</string>
+ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> байхгүй."</string>
+ <string name="accessibility_notification_dismissed" msgid="854211387186306927">"МÑдÑгдÑл хаагдÑан."</string>
+ <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"МÑдÑгдлийн хураангуй Ñамбар"</string>
+ <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Шуурхай тохиргоо."</string>
+ <string name="accessibility_desc_recent_apps" msgid="9014032916410590027">"Сүүлийн апп"</string>
+ <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Ð¥ÑÑ€ÑглÑгч <xliff:g id="USER">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_wifi" msgid="6099781031669728709">"<xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="NETWORK">%2$s</xliff:g>"</string>
+ <string name="accessibility_quick_settings_mobile" msgid="4876806564086241341">"Мобайл <xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="TYPE">%2$s</xliff:g>. <xliff:g id="NETWORK">%3$s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"Батерей <xliff:g id="STATE">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_airplane" msgid="4196876722090224753">"ÐиÑлÑгийн горим <xliff:g id="STATE">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_bluetooth" msgid="5749054971341882340">"Блютүүт <xliff:g id="STATE">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_location" msgid="4577282329866813100">"Байршил <xliff:g id="STATE">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"СÑрүүлгийг <xliff:g id="TIME">%s</xliff:g>-д тохируулÑан."</string>
+ <string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"2G-3G дата идÑвхгүй болов"</string>
+ <string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"4G дата идÑвхгүй байна"</string>
+ <string name="data_usage_disabled_dialog_mobile_title" msgid="1046047248844821202">"Мобайл дата идÑвхгүй болов"</string>
+ <string name="data_usage_disabled_dialog_title" msgid="2086815304858964954">"Дата идÑвхгүй болов"</string>
+ <string name="data_usage_disabled_dialog" msgid="3853117269051806280">"Та зааÑан дата ашиглалтын Ñ…Ñзгаарт хүрÑв.\n\nÐ¥ÑÑ€Ñв та датаг дахин идÑвхжүүлбÑл операторт төлбөр төлөх Ñ…ÑÑ€ÑгтÑй."</string>
+ <string name="data_usage_disabled_dialog_enable" msgid="7729772039208664606">"Дата дахин идÑвхжүүлÑÑ…"</string>
+ <string name="status_bar_settings_signal_meter_disconnected" msgid="1940231521274147771">"Интернет холболт байхгүй"</string>
+ <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Wi-Fi холбогдÑон"</string>
+ <string name="gps_notification_searching_text" msgid="8574247005642736060">"GPS хайж байна"</string>
+ <string name="gps_notification_found_text" msgid="4619274244146446464">"GPS байршил"</string>
+ <string name="accessibility_location_active" msgid="2427290146138169014">"Байршлын Ñ…Ò¯ÑÑлтүүд идÑвхтÑй"</string>
+ <string name="accessibility_clear_all" msgid="5235938559247164925">"Бүх мÑдÑгдлийг цÑвÑрлÑÑ…."</string>
+ <string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Ðпп мÑдÑÑлÑл"</string>
+ <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"ДÑлгÑц автоматаар ÑргÑнÑ."</string>
+ <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"ДÑлгÑц Ñ…ÑвтÑÑ Ñ‡Ð¸Ð³Ð»Ñлд түгжигдÑÑн."</string>
+ <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"ДÑлгÑц боÑоо чиглÑлÑÑÑ€ түгжигдÑÑн."</string>
+ <string name="dessert_case" msgid="1295161776223959221">"Ðмттаны хайрцаг"</string>
+ <string name="start_dreams" msgid="7219575858348719790">"Daydream"</string>
+ <string name="ethernet_label" msgid="7967563676324087464">"Этернет"</string>
+ <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"ÐиÑлÑгийн горим"</string>
+ <string name="quick_settings_battery_charging_label" msgid="490074774465309209">"ЦÑнÑглÑж байна, <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+ <string name="quick_settings_battery_charged_label" msgid="8865413079414246081">"ЦÑнÑглÑгдÑÑн"</string>
+ <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Блютүүт"</string>
+ <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Блютүүт (<xliff:g id="NUMBER">%d</xliff:g> төхөөрөмж)"</string>
+ <string name="quick_settings_bluetooth_off_label" msgid="8159652146149219937">"Блютүүт унтраалттай"</string>
+ <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Тодрол"</string>
+ <string name="quick_settings_rotation_unlocked_label" msgid="336054930362580584">"Ðвтомат ÑргÑÑ…"</string>
+ <string name="quick_settings_rotation_locked_label" msgid="8058646447242565486">"ЭргүүлÑлт түгжигдÑÑн"</string>
+ <string name="quick_settings_ime_label" msgid="7073463064369468429">"Оруулах арга"</string>
+ <string name="quick_settings_location_label" msgid="5011327048748762257">"Байршил"</string>
+ <string name="quick_settings_location_off_label" msgid="7464544086507331459">"Байршил идÑвхгүй"</string>
+ <string name="quick_settings_media_device_label" msgid="1302906836372603762">"Медиа төхөөрөмж"</string>
+ <string name="quick_settings_rssi_label" msgid="7725671335550695589">"RSSI"</string>
+ <string name="quick_settings_rssi_emergency_only" msgid="2713774041672886750">"Зөвхөн Ñаралтай дуудлага"</string>
+ <string name="quick_settings_settings_label" msgid="5326556592578065401">"Тохиргоо"</string>
+ <string name="quick_settings_time_label" msgid="4635969182239736408">"Цаг"</string>
+ <string name="quick_settings_user_label" msgid="5238995632130897840">"Би"</string>
+ <string name="quick_settings_wifi_label" msgid="9135344704899546041">"Wi-Fi"</string>
+ <string name="quick_settings_wifi_not_connected" msgid="7171904845345573431">"Холбогдоогүй"</string>
+ <string name="quick_settings_wifi_no_network" msgid="2221993077220856376">"СүлжÑÑгүй"</string>
+ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi унтарÑан"</string>
+ <string name="quick_settings_wifi_display_label" msgid="6893592964463624333">"Wi-Fi ДÑлгÑц"</string>
+ <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"УтаÑгүй дÑлгÑц"</string>
+ <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Тодрол"</string>
+ <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"ÐВТОМÐТ"</string>
+ <string name="quick_settings_inversion_label" msgid="1666358784283020762">"Өнгө урвуулах горим"</string>
+ <string name="quick_settings_contrast_label" msgid="3319507551689108692">"СайжруулÑан Ñлгаралтай горим"</string>
+ <string name="quick_settings_color_space_label" msgid="853443689745584770">"Өнгө залруулах горим"</string>
+ <string name="ssl_ca_cert_warning" msgid="9005954106902053641">"СүлжÑÑ Ñ…Ñнагдаж\nбайж болзошгүй"</string>
+</resources>
diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml
new file mode 100644
index 0000000..aea7be1
--- /dev/null
+++ b/packages/SystemUI/res/values-mn/strings.xml
@@ -0,0 +1,208 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="7164937344850004466">"СиÑтем UI"</string>
+ <string name="status_bar_clear_all_button" msgid="7774721344716731603">"ЦÑвÑрлÑÑ…"</string>
+ <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"ЖагÑÐ°Ð°Ð»Ñ‚Ð°Ð°Ñ ÑƒÑтгах"</string>
+ <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Ðпп мÑдÑÑлÑл"</string>
+ <string name="status_bar_no_recent_apps" msgid="6576392951053994640">"Сүүлийн апп хооÑон"</string>
+ <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Сүүлийн апп-уудыг хаах"</string>
+ <plurals name="status_bar_accessibility_recent_apps">
+ <item quantity="one" msgid="5854176083865845541">"1 Ñүүлийн апп"</item>
+ <item quantity="other" msgid="1040784359794890744">"%d Ñүүлийн апп"</item>
+ </plurals>
+ <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"МÑдÑгдÑл байхгүй"</string>
+ <string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"ГарÑан"</string>
+ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"МÑдÑгдÑл"</string>
+ <string name="battery_low_title" msgid="2783104807551211639">"ЦÑнÑглÑгчийг холбоно уу"</string>
+ <string name="battery_low_subtitle" msgid="1752040062087829196">"Батерей дууÑаж байна."</string>
+ <string name="battery_low_percent_format" msgid="1077244949318261761">"<xliff:g id="NUMBER">%d%%</xliff:g> үлдÑÑн"</string>
+ <string name="invalid_charger" msgid="4549105996740522523">"USB цÑнÑглÑлт дÑмжигдÑхгүй байна.\nЗөвхөн нийлүүлÑгдÑÑн цÑнÑглÑгчийг ашиглана уу."</string>
+ <string name="battery_low_why" msgid="7279169609518386372">"Батерей ашиглах"</string>
+ <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Тохиргоо"</string>
+ <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
+ <string name="status_bar_settings_airplane" msgid="4879879698500955300">"ÐиÑлÑгийн горим"</string>
+ <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"ДÑлгÑцийг автоматаар ÑргүүлÑÑ…"</string>
+ <string name="status_bar_settings_mute_label" msgid="554682549917429396">"Ð¥ÐÐÐ¥"</string>
+ <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"ÐВТОМÐТ"</string>
+ <string name="status_bar_settings_notifications" msgid="397146176280905137">"МÑдÑгдÑл"</string>
+ <string name="bluetooth_tethered" msgid="7094101612161133267">"Блютүүтыг модем болгож байна"</string>
+ <string name="status_bar_input_method_settings_configure_input_methods" msgid="3504292471512317827">"Оруулах аргыг тохируулах"</string>
+ <string name="status_bar_use_physical_keyboard" msgid="7551903084416057810">"Бодит гар"</string>
+ <string name="usb_device_permission_prompt" msgid="834698001271562057">"<xliff:g id="APPLICATION">%1$s</xliff:g> апп-г USB төхөөрөмжид хандахыг зөвшөөрөх үү?"</string>
+ <string name="usb_accessory_permission_prompt" msgid="5171775411178865750">"<xliff:g id="APPLICATION">%1$s</xliff:g> апп-г USB төхөөрөмжид хандахыг зөвшөөрөх үү?"</string>
+ <string name="usb_device_confirm_prompt" msgid="5161205258635253206">"Ð­Ð½Ñ USB төхөөрөмж холбогдох үед <xliff:g id="ACTIVITY">%1$s</xliff:g>-г нÑÑÑ… Ò¯Ò¯?"</string>
+ <string name="usb_accessory_confirm_prompt" msgid="3808984931830229888">"Ð­Ð½Ñ USB төхөөрөмж холбогдох үед <xliff:g id="ACTIVITY">%1$s</xliff:g>-г нÑÑÑ… Ò¯Ò¯?"</string>
+ <string name="usb_accessory_uri_prompt" msgid="513450621413733343">"Ð­Ð½Ñ USB Ñ…ÑÑ€ÑгÑÑл дÑÑÑ€ ÑуулгаÑан апп ажиллаагүй байна. Ð­Ð½Ñ Ñ…ÑÑ€ÑгÑлийн талаар <xliff:g id="URL">%1$s</xliff:g>-Ñ Ð´ÑлгÑÑ€Ñнгүй Ò¯Ð·Ð½Ñ Ò¯Ò¯."</string>
+ <string name="title_usb_accessory" msgid="4966265263465181372">"USB төхөөрөмж"</string>
+ <string name="label_view" msgid="6304565553218192990">"ҮзÑÑ…"</string>
+ <string name="always_use_device" msgid="1450287437017315906">"Ð­Ð½Ñ USB төхөөрөмжийг үндÑÑн болгон ашиглах"</string>
+ <string name="always_use_accessory" msgid="1210954576979621596">"Ð­Ð½Ñ USB төхөөрөмжийг үндÑÑн болгон ашиглах"</string>
+ <string name="usb_debugging_title" msgid="4513918393387141949">"USB дебаг хийхийг зөвшөөрөх үү?"</string>
+ <string name="usb_debugging_message" msgid="2220143855912376496">"Компьютерийн RSA түлхүүрийн хурууны Ñ…ÑÑ :\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
+ <string name="usb_debugging_always" msgid="303335496705863070">"Ð­Ð½Ñ ÐºÐ¾Ð¼Ð¿ÑŒÑŽÑ‚ÐµÑ€ÑÑÑ Ð¾Ñ€Ð¾Ñ…Ñ‹Ð³ байнга зөвшөөрөх"</string>
+ <string name="compat_mode_on" msgid="6623839244840638213">"ДÑлгÑц дүүргÑÑ… бол Ó©Ñгөнө Ò¯Ò¯"</string>
+ <string name="compat_mode_off" msgid="4434467572461327898">"ДÑлгÑц дүүргÑÑ… бол татна уу"</string>
+ <string name="screenshot_saving_ticker" msgid="7403652894056693515">"ДÑлгÑцийн агшинг хадгалж байна…"</string>
+ <string name="screenshot_saving_title" msgid="8242282144535555697">"ДÑлгÑцийн агшинг хадгалж байна…"</string>
+ <string name="screenshot_saving_text" msgid="2419718443411738818">"ДÑлгÑцийн агшин хадгалагдав."</string>
+ <string name="screenshot_saved_title" msgid="6461865960961414961">"ДÑлгÑцийн агшинг авÑан."</string>
+ <string name="screenshot_saved_text" msgid="1152839647677558815">"ДÑлгÑцийн агшныг харах бол Ñ…Ò¯Ñ€Ð½Ñ Ò¯Ò¯."</string>
+ <string name="screenshot_failed_title" msgid="705781116746922771">"ДÑлгÑцийн агшинг авч чадÑангүй."</string>
+ <string name="screenshot_failed_text" msgid="8134011269572415402">"ДÑлгÑцийн агшинг хадгалж чадÑангүй. Сан ашиглагдаж байгаа бололтой."</string>
+ <string name="usb_preference_title" msgid="6551050377388882787">"USB файл шилжүүлÑÑ… Ñонголт"</string>
+ <string name="use_mtp_button_title" msgid="4333504413563023626">"Медиа тоглуулагч(MTP) болгон залгах"</string>
+ <string name="use_ptp_button_title" msgid="7517127540301625751">"Камер болгон(PTP) залгах"</string>
+ <string name="installer_cd_button_title" msgid="2312667578562201583">"МаÑ-д зориулÑан Ðндройд Файл ШилжүүлÑÑ… апп-г Ñуулгана уу"</string>
+ <string name="accessibility_back" msgid="567011538994429120">"Буцах"</string>
+ <string name="accessibility_home" msgid="8217216074895377641">"ГÑрийн"</string>
+ <string name="accessibility_menu" msgid="316839303324695949">"ЦÑÑ"</string>
+ <string name="accessibility_recent" msgid="8571350598987952883">"Сүүлийн апп"</string>
+ <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Оруулах аргыг ÑÑлгÑÑ… товч."</string>
+ <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Тохиромжтой Ó©Ñгөх товч."</string>
+ <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"ЖижгÑÑÑ Ñ‚Ð¾Ð¼ дÑлгÑцрүү Ó©Ñгөх."</string>
+ <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Блютүүт холбогдÑон."</string>
+ <string name="accessibility_bluetooth_disconnected" msgid="7416648669976870175">"Блютүүт таÑрав."</string>
+ <string name="accessibility_no_battery" msgid="358343022352820946">"Батерей байхгүй."</string>
+ <string name="accessibility_battery_one_bar" msgid="7774887721891057523">"Батерей нÑг баганатай."</string>
+ <string name="accessibility_battery_two_bars" msgid="8500650438735009973">"Батерей хоёр баганатай."</string>
+ <string name="accessibility_battery_three_bars" msgid="2302983330865040446">"Батерей гурван баганатай."</string>
+ <string name="accessibility_battery_full" msgid="8909122401720158582">"Батерей дүүрÑн."</string>
+ <string name="accessibility_no_phone" msgid="4894708937052611281">"Ð£Ñ‚Ð°Ñ Ð±Ð°Ð¹Ñ…Ð³Ò¯Ð¹."</string>
+ <string name="accessibility_phone_one_bar" msgid="687699278132664115">"Ð£Ñ‚Ð°Ñ Ð½Ñг баганатай."</string>
+ <string name="accessibility_phone_two_bars" msgid="8384905382804815201">"Ð£Ñ‚Ð°Ñ Ñ…Ð¾Ñ‘Ñ€ баганатай."</string>
+ <string name="accessibility_phone_three_bars" msgid="8521904843919971885">"Ð£Ñ‚Ð°Ñ Ð³ÑƒÑ€Ð²Ð°Ð½ баганатай."</string>
+ <string name="accessibility_phone_signal_full" msgid="6471834868580757898">"УтаÑны дохио дүүрÑн."</string>
+ <string name="accessibility_no_data" msgid="4791966295096867555">"Дата байхгүй."</string>
+ <string name="accessibility_data_one_bar" msgid="1415625833238273628">"Дата нÑг баганатай."</string>
+ <string name="accessibility_data_two_bars" msgid="6166018492360432091">"Дата хоёр баганатай."</string>
+ <string name="accessibility_data_three_bars" msgid="9167670452395038520">"Дата гурван баганатай."</string>
+ <string name="accessibility_data_signal_full" msgid="2708384608124519369">"Дата дохио дүүрÑн."</string>
+ <string name="accessibility_wifi_off" msgid="3177380296697933627">"Wifi унтарÑан."</string>
+ <string name="accessibility_no_wifi" msgid="1425476551827924474">"Wifi Ñалав."</string>
+ <string name="accessibility_wifi_one_bar" msgid="7735893178010724377">"Wifi нÑг баганатай."</string>
+ <string name="accessibility_wifi_two_bars" msgid="4994274250497262434">"Wifi хоёр баганатай."</string>
+ <string name="accessibility_wifi_three_bars" msgid="3495755044276588384">"Wifi гурван баганатай."</string>
+ <string name="accessibility_wifi_signal_full" msgid="6853561303586480376">"Wifi дохио дүүрÑн."</string>
+ <string name="accessibility_no_wimax" msgid="4329180129727630368">"WiMAX байхгүй."</string>
+ <string name="accessibility_wimax_one_bar" msgid="4170994299011863648">"WiMAX нÑг багана."</string>
+ <string name="accessibility_wimax_two_bars" msgid="9176236858336502288">"WiMAX хоёр баганатай."</string>
+ <string name="accessibility_wimax_three_bars" msgid="6116551636752103927">"WiMAX гурван баганатай."</string>
+ <string name="accessibility_wimax_signal_full" msgid="2768089986795579558">"WiMAX дохио дүүрÑн."</string>
+ <string name="accessibility_no_signal" msgid="7064645320782585167">"Дохио байхгүй."</string>
+ <string name="accessibility_not_connected" msgid="6395326276213402883">"Холбогдоогүй."</string>
+ <string name="accessibility_zero_bars" msgid="3806060224467027887">"ТÑг баганатай."</string>
+ <string name="accessibility_one_bar" msgid="1685730113192081895">"ÐÑг баганатай."</string>
+ <string name="accessibility_two_bars" msgid="6437363648385206679">"Хоёр багана."</string>
+ <string name="accessibility_three_bars" msgid="2648241415119396648">"Гурван баганатай."</string>
+ <string name="accessibility_signal_full" msgid="9122922886519676839">"Дохио дүүрÑн."</string>
+ <string name="accessibility_desc_on" msgid="2385254693624345265">"ИдÑвхижÑÑн."</string>
+ <string name="accessibility_desc_off" msgid="6475508157786853157">"Унтраах"</string>
+ <string name="accessibility_desc_connected" msgid="8366256693719499665">"ХолбогдÑон."</string>
+ <string name="accessibility_data_connection_gprs" msgid="1606477224486747751">"GPRS"</string>
+ <string name="accessibility_data_connection_1x" msgid="994133468120244018">"1 X"</string>
+ <string name="accessibility_data_connection_hspa" msgid="2032328855462645198">"HSPA"</string>
+ <string name="accessibility_data_connection_3g" msgid="8628562305003568260">"3G"</string>
+ <string name="accessibility_data_connection_3.5g" msgid="8664845609981692001">"3.5G"</string>
+ <string name="accessibility_data_connection_4g" msgid="7741000750630089612">"4G"</string>
+ <string name="accessibility_data_connection_lte" msgid="5413468808637540658">"LTE"</string>
+ <string name="accessibility_data_connection_cdma" msgid="6132648193978823023">"CDMA"</string>
+ <string name="accessibility_data_connection_roaming" msgid="5977362333466556094">"Рүүминг"</string>
+ <string name="accessibility_data_connection_edge" msgid="4477457051631979278">"Edge"</string>
+ <string name="accessibility_data_connection_wifi" msgid="2324496756590645221">"Wi-Fi"</string>
+ <string name="accessibility_no_sim" msgid="8274017118472455155">"SIM байхгүй."</string>
+ <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Блютүүт модем болж байна."</string>
+ <string name="accessibility_airplane_mode" msgid="834748999790763092">"ÐиÑлÑгийн горим"</string>
+ <string name="accessibility_battery_level" msgid="7451474187113371965">"Батерей <xliff:g id="NUMBER">%d</xliff:g> хувьтай."</string>
+ <string name="accessibility_settings_button" msgid="799583911231893380">"СиÑтемийн тохиргоо."</string>
+ <string name="accessibility_notifications_button" msgid="4498000369779421892">"МÑдÑгдÑл."</string>
+ <string name="accessibility_remove_notification" msgid="3603099514902182350">"МÑдÑгдлийг цÑвÑрлÑÑ…."</string>
+ <string name="accessibility_gps_enabled" msgid="3511469499240123019">"GPS идÑвхтÑй."</string>
+ <string name="accessibility_gps_acquiring" msgid="8959333351058967158">"GPS хайж байна."</string>
+ <string name="accessibility_tty_enabled" msgid="4613200365379426561">"TeleTypewriter идÑвхтÑй болов."</string>
+ <string name="accessibility_ringer_vibrate" msgid="666585363364155055">"Хонхны чичиргÑÑ."</string>
+ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"Хонхыг хаах."</string>
+ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> байхгүй."</string>
+ <string name="accessibility_notification_dismissed" msgid="854211387186306927">"МÑдÑгдÑл хаагдÑан."</string>
+ <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"МÑдÑгдлийн хураангуй Ñамбар"</string>
+ <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Шуурхай тохиргоо."</string>
+ <string name="accessibility_desc_recent_apps" msgid="9014032916410590027">"Сүүлийн апп"</string>
+ <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Ð¥ÑÑ€ÑглÑгч <xliff:g id="USER">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_wifi" msgid="6099781031669728709">"<xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="NETWORK">%2$s</xliff:g>"</string>
+ <string name="accessibility_quick_settings_mobile" msgid="4876806564086241341">"Мобайл <xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="TYPE">%2$s</xliff:g>. <xliff:g id="NETWORK">%3$s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"Батерей <xliff:g id="STATE">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_airplane" msgid="4196876722090224753">"ÐиÑлÑгийн горим <xliff:g id="STATE">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_bluetooth" msgid="5749054971341882340">"Блютүүт <xliff:g id="STATE">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"СÑрүүлгийг <xliff:g id="TIME">%s</xliff:g>-д тохируулÑан."</string>
+ <string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"2G-3G дата идÑвхгүй болов"</string>
+ <string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"4G дата идÑвхгүй байна"</string>
+ <string name="data_usage_disabled_dialog_mobile_title" msgid="1046047248844821202">"Мобайл дата идÑвхгүй болов"</string>
+ <string name="data_usage_disabled_dialog_title" msgid="2086815304858964954">"Дата идÑвхгүй болов"</string>
+ <string name="data_usage_disabled_dialog" msgid="3853117269051806280">"Та зааÑан дата ашиглалтын Ñ…Ñзгаарт хүрÑв.\n\nÐ¥ÑÑ€Ñв та датаг дахин идÑвхжүүлбÑл операторт төлбөр төлөх Ñ…ÑÑ€ÑгтÑй."</string>
+ <string name="data_usage_disabled_dialog_enable" msgid="7729772039208664606">"Дата дахин идÑвхжүүлÑÑ…"</string>
+ <string name="status_bar_settings_signal_meter_disconnected" msgid="1940231521274147771">"Интернет холболт байхгүй"</string>
+ <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Wi-Fi холбогдÑон"</string>
+ <string name="gps_notification_searching_text" msgid="8574247005642736060">"GPS хайж байна"</string>
+ <string name="gps_notification_found_text" msgid="4619274244146446464">"GPS байршил"</string>
+ <string name="accessibility_location_active" msgid="2427290146138169014">"Байршлын Ñ…Ò¯ÑÑлтүүд идÑвхтÑй"</string>
+ <string name="accessibility_clear_all" msgid="5235938559247164925">"Бүх мÑдÑгдлийг цÑвÑрлÑÑ…."</string>
+ <string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Ðпп мÑдÑÑлÑл"</string>
+ <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"ДÑлгÑц автоматаар ÑргÑнÑ."</string>
+ <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"ДÑлгÑц Ñ…ÑвтÑÑ Ñ‡Ð¸Ð³Ð»Ñлд түгжигдÑÑн."</string>
+ <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"ДÑлгÑц боÑоо чиглÑлÑÑÑ€ түгжигдÑÑн."</string>
+ <string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
+ <string name="start_dreams" msgid="7219575858348719790">"Daydream"</string>
+ <string name="ethernet_label" msgid="7967563676324087464">"Этернет"</string>
+ <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"ÐиÑлÑгийн горим"</string>
+ <string name="quick_settings_battery_charging_label" msgid="490074774465309209">"ЦÑнÑглÑж байна, <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+ <string name="quick_settings_battery_charged_label" msgid="8865413079414246081">"ЦÑнÑглÑгдÑÑн"</string>
+ <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Блютүүт"</string>
+ <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Блютүүт (<xliff:g id="NUMBER">%d</xliff:g> төхөөрөмж)"</string>
+ <string name="quick_settings_bluetooth_off_label" msgid="8159652146149219937">"Блютүүт унтраалттай"</string>
+ <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Тодрол"</string>
+ <string name="quick_settings_rotation_unlocked_label" msgid="336054930362580584">"Ðвтомат ÑргÑÑ…"</string>
+ <string name="quick_settings_rotation_locked_label" msgid="8058646447242565486">"ЭргүүлÑлт түгжигдÑÑн"</string>
+ <string name="quick_settings_ime_label" msgid="7073463064369468429">"Оруулах арга"</string>
+ <string name="quick_settings_location_label" msgid="5011327048748762257">"Байршил"</string>
+ <string name="quick_settings_location_off_label" msgid="7464544086507331459">"Байршил идÑвхгүй"</string>
+ <string name="quick_settings_media_device_label" msgid="1302906836372603762">"Медиа төхөөрөмж"</string>
+ <string name="quick_settings_rssi_label" msgid="7725671335550695589">"RSSI"</string>
+ <string name="quick_settings_rssi_emergency_only" msgid="2713774041672886750">"Зөвхөн Ñаралтай дуудлага"</string>
+ <string name="quick_settings_settings_label" msgid="5326556592578065401">"Тохиргоо"</string>
+ <string name="quick_settings_time_label" msgid="4635969182239736408">"Цаг"</string>
+ <string name="quick_settings_user_label" msgid="5238995632130897840">"Би"</string>
+ <string name="quick_settings_wifi_label" msgid="9135344704899546041">"Wi-Fi"</string>
+ <string name="quick_settings_wifi_not_connected" msgid="7171904845345573431">"Холбогдоогүй"</string>
+ <string name="quick_settings_wifi_no_network" msgid="2221993077220856376">"СүлжÑÑгүй"</string>
+ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi унтарÑан"</string>
+ <string name="quick_settings_wifi_display_label" msgid="6893592964463624333">"Wi-Fi ДÑлгÑц"</string>
+ <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"УтаÑгүй дÑлгÑц"</string>
+ <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Тодрол"</string>
+ <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"ÐВТОМÐТ"</string>
+ <string name="status_bar_help_title" msgid="1199237744086469217">"МÑдÑгдÑл Ñнд харагдана"</string>
+ <string name="status_bar_help_text" msgid="7874607155052076323">"Доош татаад Ñ‚ÑдгÑÑрт хандана уу.\nДахин доош татаад ÑиÑтем контролд хандана уу."</string>
+ <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"СүлжÑÑ Ñ…Ñнагдаж байж болзошгүй"</string>
+ <string name="done_button" msgid="1759387181766603361">"ДууÑÑан"</string>
+ <string name="ssl_ca_cert_dialog_title" msgid="1273796967092027291">"СүлжÑÑний Ð¥Ñналт"</string>
+ <string name="ssl_ca_cert_info_message" msgid="5430320539555358452">"Ð­Ð½Ñ Ñ‚Ó©Ñ…Ó©Ó©Ñ€Ó©Ð¼Ð¶Ð¸Ð¹Ð³ удирдагч: <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>.\n\nТаны админ имÑйл, апп-ууд болон аюулгүй вебÑайтуудыг оруулан таны ÑүлжÑÑний үйл ажиллагааг Ñ…Ñнах боломжтой.\n\nДÑлгÑÑ€Ñнгүй мÑдÑÑллийг өөрийн админтай холбогдож авна уу."</string>
+ <string name="ssl_ca_cert_warning_message" msgid="2033091656129963669">"Гуравдагч талын ÑтгÑÑд таны ÑүлжÑÑг Ñ…Ñнаж байж болзошгүй\nүүнд имÑйл, апп-ууд болон аюулгүй вебÑайтууд багтана.\n\nТаны төхөөрөмж дÑÑÑ€ ÑуулгаÑан итгÑмжлÑгдÑÑн жуух ÑÐ½Ñ Ð±Ð¾Ð»Ð¾Ð¼Ð¶Ð¾Ð¾Ñ€ хангаж байна."</string>
+ <string name="ssl_ca_cert_settings_button" msgid="7946956977377166709">"ИтгÑмжлÑгдÑÑн жуухуудыг шалгах"</string>
+</resources>
diff --git a/packages/SystemUI/res/values-ms-rMY-land/strings.xml b/packages/SystemUI/res/values-ms-rMY-land/strings.xml
new file mode 100644
index 0000000..175b0fa
--- /dev/null
+++ b/packages/SystemUI/res/values-ms-rMY-land/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2010, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="toast_rotation_locked" msgid="7609673011431556092">"Skrin kini dikunci dalam orientasi landskap."</string>
+</resources>
diff --git a/packages/SystemUI/res/values-ms-rMY/strings.xml b/packages/SystemUI/res/values-ms-rMY/strings.xml
new file mode 100644
index 0000000..aa81268
--- /dev/null
+++ b/packages/SystemUI/res/values-ms-rMY/strings.xml
@@ -0,0 +1,207 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="7164937344850004466">"Sistem UI"</string>
+ <string name="status_bar_clear_all_button" msgid="7774721344716731603">"Pdm bersih"</string>
+ <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Alih keluar dari senarai"</string>
+ <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Maklumat aplikasi"</string>
+ <string name="status_bar_no_recent_apps" msgid="6576392951053994640">"Tiada aplikasi terbaharu"</string>
+ <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Buang aplikasi terbaharu"</string>
+ <plurals name="status_bar_accessibility_recent_apps">
+ <item quantity="one" msgid="5854176083865845541">"1 aplikasi terbaharu"</item>
+ <item quantity="other" msgid="1040784359794890744">"%d aplikasi terbaharu"</item>
+ </plurals>
+ <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Tiada pemberitahuan"</string>
+ <string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Sedang berlangsung"</string>
+ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Pemberitahuan"</string>
+ <string name="battery_low_title" msgid="2783104807551211639">"Sambungkan pengecas"</string>
+ <string name="battery_low_subtitle" msgid="1752040062087829196">"Bateri semakin lemah."</string>
+ <string name="battery_low_percent_format" msgid="1077244949318261761">"Berbaki <xliff:g id="NUMBER">%d%%</xliff:g>"</string>
+ <string name="invalid_charger" msgid="4549105996740522523">"Pengecasan USB tidak disokong.\nGunakan hanya pengecas yang dibekalkan."</string>
+ <string name="battery_low_why" msgid="7279169609518386372">"Penggunaan bateri"</string>
+ <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Tetapan"</string>
+ <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
+ <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Mod pesawat"</string>
+ <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"Autoputar skrin"</string>
+ <string name="status_bar_settings_mute_label" msgid="554682549917429396">"REDAM"</string>
+ <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"AUTO"</string>
+ <string name="status_bar_settings_notifications" msgid="397146176280905137">"Pemberitahuan"</string>
+ <string name="bluetooth_tethered" msgid="7094101612161133267">"Bluetooth ditambatkan"</string>
+ <string name="status_bar_input_method_settings_configure_input_methods" msgid="3504292471512317827">"Sediakan kaedah input"</string>
+ <string name="status_bar_use_physical_keyboard" msgid="7551903084416057810">"Papan kekunci fizikal"</string>
+ <string name="usb_device_permission_prompt" msgid="834698001271562057">"Benarkan aplikasi <xliff:g id="APPLICATION">%1$s</xliff:g> mengakses peranti USB?"</string>
+ <string name="usb_accessory_permission_prompt" msgid="5171775411178865750">"Benarkan aplikasi <xliff:g id="APPLICATION">%1$s</xliff:g> mengakses aksesori USB?"</string>
+ <string name="usb_device_confirm_prompt" msgid="5161205258635253206">"Buka <xliff:g id="ACTIVITY">%1$s</xliff:g> apabila peranti USB ini disambungkan?"</string>
+ <string name="usb_accessory_confirm_prompt" msgid="3808984931830229888">"Buka <xliff:g id="ACTIVITY">%1$s</xliff:g> apabila aksesori USB ini disambungkan?"</string>
+ <string name="usb_accessory_uri_prompt" msgid="513450621413733343">"Tiada apl yg dipsg bfungsi dgn aksesori USB ini. Ketahui lg ttg aksesori ini di <xliff:g id="URL">%1$s</xliff:g>"</string>
+ <string name="title_usb_accessory" msgid="4966265263465181372">"Aksesori USB"</string>
+ <string name="label_view" msgid="6304565553218192990">"Lihat"</string>
+ <string name="always_use_device" msgid="1450287437017315906">"Gunakan secara lalai untuk peranti USB ini"</string>
+ <string name="always_use_accessory" msgid="1210954576979621596">"Gunakan secara lalai untuk aksesori USB ini"</string>
+ <string name="usb_debugging_title" msgid="4513918393387141949">"Benarkan penyahpepijatan USB?"</string>
+ <string name="usb_debugging_message" msgid="2220143855912376496">"Cap jari kekunci RSA komputer ialah:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
+ <string name="usb_debugging_always" msgid="303335496705863070">"Sentiasa benarkan komputer ini"</string>
+ <string name="compat_mode_on" msgid="6623839244840638213">"Zum untuk memenuhi skrin"</string>
+ <string name="compat_mode_off" msgid="4434467572461327898">"Regang utk memenuhi skrin"</string>
+ <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Menyimpan tangkapan skrin..."</string>
+ <string name="screenshot_saving_title" msgid="8242282144535555697">"Menyimpan tangkapan skrin..."</string>
+ <string name="screenshot_saving_text" msgid="2419718443411738818">"Tangkapan skrin sedang disimpan."</string>
+ <string name="screenshot_saved_title" msgid="6461865960961414961">"Tangkapan skrin ditangkap."</string>
+ <string name="screenshot_saved_text" msgid="1152839647677558815">"Sentuh untuk melihat tangkapan skrin anda."</string>
+ <string name="screenshot_failed_title" msgid="705781116746922771">"Tidak dapat menangkap tangkapan skrin."</string>
+ <string name="screenshot_failed_text" msgid="8134011269572415402">"Tidak boleh menyimpan tangkapan skrin. Storan mungkin sedang digunakan."</string>
+ <string name="usb_preference_title" msgid="6551050377388882787">"Pilihan pemindahan fail USB"</string>
+ <string name="use_mtp_button_title" msgid="4333504413563023626">"Lekapkan sebagai pemain media (MTP)"</string>
+ <string name="use_ptp_button_title" msgid="7517127540301625751">"Lekapkan sebagai kamera (PTP)"</string>
+ <string name="installer_cd_button_title" msgid="2312667578562201583">"Pasang aplikasi Pindahan Fail Android untuk Mac"</string>
+ <string name="accessibility_back" msgid="567011538994429120">"Kembali"</string>
+ <string name="accessibility_home" msgid="8217216074895377641">"Rumah"</string>
+ <string name="accessibility_menu" msgid="316839303324695949">"Menu"</string>
+ <string name="accessibility_recent" msgid="8571350598987952883">"Aplikasi terbaharu"</string>
+ <string name="accessibility_search_light" msgid="1103867596330271848">"Cari"</string>
+ <string name="accessibility_camera_button" msgid="8064671582820358152">"Kamera"</string>
+ <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Butang tukar kaedah input."</string>
+ <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Butang zum keserasian."</string>
+ <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Skrin zum lebih kecil kepada lebih besar."</string>
+ <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth disambungkan."</string>
+ <string name="accessibility_bluetooth_disconnected" msgid="7416648669976870175">"Bluetooth diputuskan sambungan."</string>
+ <string name="accessibility_no_battery" msgid="358343022352820946">"Tiada bateri."</string>
+ <string name="accessibility_battery_one_bar" msgid="7774887721891057523">"Bateri satu bar."</string>
+ <string name="accessibility_battery_two_bars" msgid="8500650438735009973">"Bateri dua bar."</string>
+ <string name="accessibility_battery_three_bars" msgid="2302983330865040446">"Bateri tiga bar."</string>
+ <string name="accessibility_battery_full" msgid="8909122401720158582">"Bateri penuh."</string>
+ <string name="accessibility_no_phone" msgid="4894708937052611281">"Tiada telefon."</string>
+ <string name="accessibility_phone_one_bar" msgid="687699278132664115">"Telefon satu bar."</string>
+ <string name="accessibility_phone_two_bars" msgid="8384905382804815201">"Telefon dua bar."</string>
+ <string name="accessibility_phone_three_bars" msgid="8521904843919971885">"Telefon tiga bar."</string>
+ <string name="accessibility_phone_signal_full" msgid="6471834868580757898">"Isyarat telefon penuh."</string>
+ <string name="accessibility_no_data" msgid="4791966295096867555">"Tiada data."</string>
+ <string name="accessibility_data_one_bar" msgid="1415625833238273628">"Data satu bar."</string>
+ <string name="accessibility_data_two_bars" msgid="6166018492360432091">"Data dua bar."</string>
+ <string name="accessibility_data_three_bars" msgid="9167670452395038520">"Data tiga bar."</string>
+ <string name="accessibility_data_signal_full" msgid="2708384608124519369">"Isyarat data penuh."</string>
+ <string name="accessibility_wifi_off" msgid="3177380296697933627">"Wifi dimatikan."</string>
+ <string name="accessibility_no_wifi" msgid="1425476551827924474">"Wifi diputuskan sambungannya."</string>
+ <string name="accessibility_wifi_one_bar" msgid="7735893178010724377">"WiFi satu bar."</string>
+ <string name="accessibility_wifi_two_bars" msgid="4994274250497262434">"WiFi dua bar."</string>
+ <string name="accessibility_wifi_three_bars" msgid="3495755044276588384">"WiFi tiga bar."</string>
+ <string name="accessibility_wifi_signal_full" msgid="6853561303586480376">"Isyarat WiFi penuh."</string>
+ <string name="accessibility_no_wimax" msgid="4329180129727630368">"Tiada WiMAX"</string>
+ <string name="accessibility_wimax_one_bar" msgid="4170994299011863648">"WiMAX satu bar."</string>
+ <string name="accessibility_wimax_two_bars" msgid="9176236858336502288">"WiMAX dua bar."</string>
+ <string name="accessibility_wimax_three_bars" msgid="6116551636752103927">"WiMAX tiga bar."</string>
+ <string name="accessibility_wimax_signal_full" msgid="2768089986795579558">"Isyarat WiMAX penuh."</string>
+ <string name="accessibility_no_signal" msgid="7064645320782585167">"Tiada isyarat."</string>
+ <string name="accessibility_not_connected" msgid="6395326276213402883">"Tidak disambungkan."</string>
+ <string name="accessibility_zero_bars" msgid="3806060224467027887">"Tiada bar."</string>
+ <string name="accessibility_one_bar" msgid="1685730113192081895">"Satu bar."</string>
+ <string name="accessibility_two_bars" msgid="6437363648385206679">"Dua bar."</string>
+ <string name="accessibility_three_bars" msgid="2648241415119396648">"Tiga bar."</string>
+ <string name="accessibility_signal_full" msgid="9122922886519676839">"Isyarat penuh."</string>
+ <string name="accessibility_desc_on" msgid="2385254693624345265">"Dihidupkan."</string>
+ <string name="accessibility_desc_off" msgid="6475508157786853157">"Dimatikan."</string>
+ <string name="accessibility_desc_connected" msgid="8366256693719499665">"Disambungkan."</string>
+ <string name="accessibility_data_connection_gprs" msgid="1606477224486747751">"GPRS"</string>
+ <string name="accessibility_data_connection_1x" msgid="994133468120244018">"1 X"</string>
+ <string name="accessibility_data_connection_hspa" msgid="2032328855462645198">"HSPA"</string>
+ <string name="accessibility_data_connection_3g" msgid="8628562305003568260">"3G"</string>
+ <string name="accessibility_data_connection_3.5g" msgid="8664845609981692001">"3.5G"</string>
+ <string name="accessibility_data_connection_4g" msgid="7741000750630089612">"4G"</string>
+ <string name="accessibility_data_connection_lte" msgid="5413468808637540658">"LTE"</string>
+ <string name="accessibility_data_connection_cdma" msgid="6132648193978823023">"CDMA"</string>
+ <string name="accessibility_data_connection_roaming" msgid="5977362333466556094">"Perayauan"</string>
+ <string name="accessibility_data_connection_edge" msgid="4477457051631979278">"Edge"</string>
+ <string name="accessibility_data_connection_wifi" msgid="2324496756590645221">"Wi-Fi"</string>
+ <string name="accessibility_no_sim" msgid="8274017118472455155">"Tiada SIM."</string>
+ <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Penambatan Bluetooth."</string>
+ <string name="accessibility_airplane_mode" msgid="834748999790763092">"Mod pesawat"</string>
+ <string name="accessibility_battery_level" msgid="7451474187113371965">"Bateri <xliff:g id="NUMBER">%d</xliff:g> peratus."</string>
+ <string name="accessibility_settings_button" msgid="799583911231893380">"Tetapan sistem."</string>
+ <string name="accessibility_notifications_button" msgid="4498000369779421892">"Pemberitahuan."</string>
+ <string name="accessibility_remove_notification" msgid="3603099514902182350">"Padamkan pemberitahuan."</string>
+ <string name="accessibility_gps_enabled" msgid="3511469499240123019">"GPS didayakan."</string>
+ <string name="accessibility_gps_acquiring" msgid="8959333351058967158">"GPS sedang mendapatkan."</string>
+ <string name="accessibility_tty_enabled" msgid="4613200365379426561">"Mesin Teletaip didayakan."</string>
+ <string name="accessibility_ringer_vibrate" msgid="666585363364155055">"Pendering bergetar."</string>
+ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"Pendering senyap."</string>
+ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> ditolak."</string>
+ <string name="accessibility_notification_dismissed" msgid="854211387186306927">"Pemberitahuan diketepikan."</string>
+ <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Bidai pemberitahuan."</string>
+ <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Tetapan pantas."</string>
+ <string name="accessibility_desc_recent_apps" msgid="9014032916410590027">"Apl terbaru."</string>
+ <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Pengguna <xliff:g id="USER">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_wifi" msgid="6099781031669728709">"<xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="NETWORK">%2$s</xliff:g>"</string>
+ <string name="accessibility_quick_settings_mobile" msgid="4876806564086241341">"Mudah Alih <xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="TYPE">%2$s</xliff:g>. <xliff:g id="NETWORK">%3$s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"Bateri <xliff:g id="STATE">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_airplane" msgid="4196876722090224753">"Mod Pesawat <xliff:g id="STATE">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_bluetooth" msgid="5749054971341882340">"Bluetooth <xliff:g id="STATE">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_location" msgid="4577282329866813100">"Lokasi <xliff:g id="STATE">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"Penggera ditetapkan pada <xliff:g id="TIME">%s</xliff:g>."</string>
+ <string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"Data 2G-3G dilumpuhkan"</string>
+ <string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"Data 4G dilumpuhkan"</string>
+ <string name="data_usage_disabled_dialog_mobile_title" msgid="1046047248844821202">"Data mudah alih dilumpuhkan"</string>
+ <string name="data_usage_disabled_dialog_title" msgid="2086815304858964954">"Data dilumpuhkan"</string>
+ <string name="data_usage_disabled_dialog" msgid="3853117269051806280">"Anda telah mencapai had penggunaan data yang dinyatakan.\n\nJika anda mendayakan semula data, anda mungkin dikenakan caj oleh operator."</string>
+ <string name="data_usage_disabled_dialog_enable" msgid="7729772039208664606">"Dayakan semula data"</string>
+ <string name="status_bar_settings_signal_meter_disconnected" msgid="1940231521274147771">"Tiada smbg Internet"</string>
+ <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Wi-Fi disambungkan"</string>
+ <string name="gps_notification_searching_text" msgid="8574247005642736060">"Mencari GPS"</string>
+ <string name="gps_notification_found_text" msgid="4619274244146446464">"Lokasi ditetapkan oleh GPS"</string>
+ <string name="accessibility_location_active" msgid="2427290146138169014">"Permintaan lokasi aktif"</string>
+ <string name="accessibility_clear_all" msgid="5235938559247164925">"Padamkan semua pemberitahuan."</string>
+ <string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Maklumat apl"</string>
+ <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Skrin akan berputar secara automatik."</string>
+ <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Skrin dikunci dalam orientasi landskap."</string>
+ <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Skrin dikunci dalam orientasi potret."</string>
+ <string name="dessert_case" msgid="1295161776223959221">"Bekas Pencuci Mulut"</string>
+ <string name="start_dreams" msgid="7219575858348719790">"Lamun"</string>
+ <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
+ <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Mod kapal terbang"</string>
+ <string name="quick_settings_battery_charging_label" msgid="490074774465309209">"Mengecas, <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+ <string name="quick_settings_battery_charged_label" msgid="8865413079414246081">"Sudah dicas"</string>
+ <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string>
+ <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (<xliff:g id="NUMBER">%d</xliff:g> Peranti)"</string>
+ <string name="quick_settings_bluetooth_off_label" msgid="8159652146149219937">"Bluetooth Dimatikan"</string>
+ <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Kecerahan"</string>
+ <string name="quick_settings_rotation_unlocked_label" msgid="336054930362580584">"Auto Putar"</string>
+ <string name="quick_settings_rotation_locked_label" msgid="8058646447242565486">"Putaran Dikunci"</string>
+ <string name="quick_settings_ime_label" msgid="7073463064369468429">"Kaedah Input"</string>
+ <string name="quick_settings_location_label" msgid="5011327048748762257">"Lokasi"</string>
+ <string name="quick_settings_location_off_label" msgid="7464544086507331459">"Lokasi Dimatikan"</string>
+ <string name="quick_settings_media_device_label" msgid="1302906836372603762">"Peranti media"</string>
+ <string name="quick_settings_rssi_label" msgid="7725671335550695589">"RSSI"</string>
+ <string name="quick_settings_rssi_emergency_only" msgid="2713774041672886750">"Panggilan Kecemasan Sahaja"</string>
+ <string name="quick_settings_settings_label" msgid="5326556592578065401">"Tetapan"</string>
+ <string name="quick_settings_time_label" msgid="4635969182239736408">"Masa"</string>
+ <string name="quick_settings_user_label" msgid="5238995632130897840">"Saya"</string>
+ <string name="quick_settings_wifi_label" msgid="9135344704899546041">"Wi-Fi"</string>
+ <string name="quick_settings_wifi_not_connected" msgid="7171904845345573431">"Tidak Disambungkan"</string>
+ <string name="quick_settings_wifi_no_network" msgid="2221993077220856376">"Tiada Rangkaian"</string>
+ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi Dimatikan"</string>
+ <string name="quick_settings_wifi_display_label" msgid="6893592964463624333">"Paparan Wi-Fi"</string>
+ <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Paparan Wayarles"</string>
+ <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Kecerahan"</string>
+ <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTO"</string>
+ <string name="quick_settings_inversion_label" msgid="1666358784283020762">"Mod penyongsangan warna"</string>
+ <string name="quick_settings_contrast_label" msgid="3319507551689108692">"Mod kontras dipertingkat"</string>
+ <string name="quick_settings_color_space_label" msgid="853443689745584770">"Mod pembetulan warna"</string>
+ <string name="ssl_ca_cert_warning" msgid="9005954106902053641">"Rangkaian mungkin\nboleh dipantau"</string>
+</resources>
diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml
index 5312ccb..9c76eae 100644
--- a/packages/SystemUI/res/values-ms/strings.xml
+++ b/packages/SystemUI/res/values-ms/strings.xml
@@ -164,6 +164,7 @@
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Wi-Fi disambungkan"</string>
<string name="gps_notification_searching_text" msgid="8574247005642736060">"Mencari GPS"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"Lokasi ditetapkan oleh GPS"</string>
+ <string name="accessibility_location_active" msgid="2427290146138169014">"Permintaan lokasi aktif"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"Padamkan semua pemberitahuan."</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Maklumat apl"</string>
<string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Skrin akan berputar secara automatik."</string>
@@ -182,10 +183,8 @@
<string name="quick_settings_rotation_unlocked_label" msgid="336054930362580584">"Auto Putar"</string>
<string name="quick_settings_rotation_locked_label" msgid="8058646447242565486">"Putaran Dikunci"</string>
<string name="quick_settings_ime_label" msgid="7073463064369468429">"Kaedah Input"</string>
- <!-- no translation found for quick_settings_location_label (5011327048748762257) -->
- <skip />
- <!-- no translation found for quick_settings_location_off_label (7464544086507331459) -->
- <skip />
+ <string name="quick_settings_location_label" msgid="5011327048748762257">"Lokasi"</string>
+ <string name="quick_settings_location_off_label" msgid="7464544086507331459">"Lokasi Dimatikan"</string>
<string name="quick_settings_media_device_label" msgid="1302906836372603762">"Peranti media"</string>
<string name="quick_settings_rssi_label" msgid="7725671335550695589">"RSSI"</string>
<string name="quick_settings_rssi_emergency_only" msgid="2713774041672886750">"Panggilan Kecemasan Sahaja"</string>
@@ -202,6 +201,4 @@
<string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTO"</string>
<string name="status_bar_help_title" msgid="1199237744086469217">"Pemberitahuan dipaparkan di sini"</string>
<string name="status_bar_help_text" msgid="7874607155052076323">"Akses panel pada bila-bila masa dengan meleret ke bawah.\nLeret ke bawah sekali lagi untuk mendapatkan kawalan sistem."</string>
- <string name="hideybar_confirmation_message" msgid="9050869548951044371">"Leret ke bahagian tepi skrin untuk menampakkan bar"</string>
- <string name="hideybar_confirmation_message_long" msgid="7117692795163620626">"Leret dari tepi skrin untuk menampakkan bar sistem"</string>
</resources>
diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml
index 778be83..8e31781 100644
--- a/packages/SystemUI/res/values-nb/strings.xml
+++ b/packages/SystemUI/res/values-nb/strings.xml
@@ -61,8 +61,6 @@
<string name="usb_debugging_always" msgid="303335496705863070">"Tillat alltid fra denne datamaskinen"</string>
<string name="compat_mode_on" msgid="6623839244840638213">"Zoom for å fylle skjermen"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Strekk for å fylle skjerm"</string>
- <string name="compat_mode_help_header" msgid="7969493989397529910">"Kompatibilitets-zooming"</string>
- <string name="compat_mode_help_body" msgid="4946726776359270040">"NÃ¥r en app er utformet for en mindre skjerm, vises det en zoomkontroll ved klokken."</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Lagrer skjermdumpen …"</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Lagrer skjermdumpen …"</string>
<string name="screenshot_saving_text" msgid="2419718443411738818">"Skjermdumpen lagres."</string>
@@ -78,6 +76,8 @@
<string name="accessibility_home" msgid="8217216074895377641">"Startside"</string>
<string name="accessibility_menu" msgid="316839303324695949">"Meny"</string>
<string name="accessibility_recent" msgid="8571350598987952883">"Nylige apper"</string>
+ <string name="accessibility_search_light" msgid="1103867596330271848">"Søk"</string>
+ <string name="accessibility_camera_button" msgid="8064671582820358152">"Kamera"</string>
<string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Bytt knapp for inndatametode."</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Zoomknapp for kompatibilitet."</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Zoom fra mindre til større skjerm."</string>
@@ -153,6 +153,7 @@
<string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"Batteri – <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_airplane" msgid="4196876722090224753">"Flymodus – <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="5749054971341882340">"Bluetooth – <xliff:g id="STATE">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_location" msgid="4577282329866813100">"Posisjon <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"Alarmen ble stilt for <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"2G-3G-data er deaktivert"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"4G-data er deaktivert"</string>
@@ -164,12 +165,13 @@
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Wi-Fi tilkoblet"</string>
<string name="gps_notification_searching_text" msgid="8574247005642736060">"Søker etter GPS"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"Posisjon angitt av GPS"</string>
+ <string name="accessibility_location_active" msgid="2427290146138169014">"Aktive stedsforespørsler"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"Fjern alle varslinger."</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Info om app"</string>
<string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Skjermen roterer automatisk."</string>
<string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Skjermen er låst i liggende retning."</string>
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Skjermen er låst i stående retning."</string>
- <string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
+ <string name="dessert_case" msgid="1295161776223959221">"Dessertmonter"</string>
<string name="start_dreams" msgid="7219575858348719790">"Dagdrøm"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
<string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Flymodus"</string>
@@ -198,8 +200,8 @@
<string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Trådløs skjerm"</string>
<string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Lysstyrke"</string>
<string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTO"</string>
- <string name="status_bar_help_title" msgid="1199237744086469217">"Varslene vises her"</string>
- <string name="status_bar_help_text" msgid="7874607155052076323">"Bruk dem når som helst ved å sveipe nedover.\nSveip nedover igjen for å gå til systemkontrollene."</string>
- <string name="hideybar_confirmation_message" msgid="9050869548951044371">"Sveip på kanten av skjermen for å få frem feltet"</string>
- <string name="hideybar_confirmation_message_long" msgid="7117692795163620626">"Sveip fra kanten på skjermen for å få frem systemfeltet"</string>
+ <string name="quick_settings_inversion_label" msgid="1666358784283020762">"Modus for fargeinvertering"</string>
+ <string name="quick_settings_contrast_label" msgid="3319507551689108692">"Forbedret kontrastmodus"</string>
+ <string name="quick_settings_color_space_label" msgid="853443689745584770">"Modus for fargekorrigering"</string>
+ <string name="ssl_ca_cert_warning" msgid="9005954106902053641">"Nettverket kan\nvære overvåket"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ne-land/strings.xml b/packages/SystemUI/res/values-ne-land/strings.xml
new file mode 100644
index 0000000..8d5286e
--- /dev/null
+++ b/packages/SystemUI/res/values-ne-land/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2010, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="toast_rotation_locked" msgid="7609673011431556092">"सà¥à¤•à¥à¤°à¤¿à¤¨ अहिले लà¥à¤¯à¤¾à¤¨à¥à¤¡à¤¸à¥à¤•ेप अवसà¥à¤¥à¤¾à¤®à¤¾ बनà¥à¤¦ छ।"</string>
+</resources>
diff --git a/packages/SystemUI/res/values-ne-rNP-land/strings.xml b/packages/SystemUI/res/values-ne-rNP-land/strings.xml
new file mode 100644
index 0000000..8d5286e
--- /dev/null
+++ b/packages/SystemUI/res/values-ne-rNP-land/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2010, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="toast_rotation_locked" msgid="7609673011431556092">"सà¥à¤•à¥à¤°à¤¿à¤¨ अहिले लà¥à¤¯à¤¾à¤¨à¥à¤¡à¤¸à¥à¤•ेप अवसà¥à¤¥à¤¾à¤®à¤¾ बनà¥à¤¦ छ।"</string>
+</resources>
diff --git a/packages/SystemUI/res/values-ne-rNP/strings.xml b/packages/SystemUI/res/values-ne-rNP/strings.xml
new file mode 100644
index 0000000..19e2744
--- /dev/null
+++ b/packages/SystemUI/res/values-ne-rNP/strings.xml
@@ -0,0 +1,206 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="7164937344850004466">"पà¥à¤°à¤£à¤¾à¤²à¥€ UI"</string>
+ <string name="status_bar_clear_all_button" msgid="7774721344716731603">"हटाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"सूचीबाट हटाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—को जानकारी"</string>
+ <string name="status_bar_no_recent_apps" msgid="6576392951053994640">"कà¥à¤¨à¥ˆ नयाठअनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरू छैननà¥"</string>
+ <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"नयाठअनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरू खारेज गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <plurals name="status_bar_accessibility_recent_apps">
+ <item quantity="one" msgid="5854176083865845541">"१ भरखरै अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—"</item>
+ <item quantity="other" msgid="1040784359794890744">"%d भरखरैका अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरू"</item>
+ </plurals>
+ <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"कà¥à¤¨à¥ˆ सूचनाहरू छैन"</string>
+ <string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"चलिरहेको"</string>
+ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"सूचनाहरू"</string>
+ <string name="battery_low_title" msgid="2783104807551211639">"चारà¥à¤œà¤° जडान गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="battery_low_subtitle" msgid="1752040062087829196">"बà¥à¤¯à¤¾à¤Ÿà¥à¤°à¤¿ नà¥à¤¯à¥‚न हà¥à¤à¤¦à¥ˆ छ।"</string>
+ <string name="battery_low_percent_format" msgid="1077244949318261761">"<xliff:g id="NUMBER">%d%%</xliff:g> बाà¤à¤•ी"</string>
+ <string name="invalid_charger" msgid="4549105996740522523">"USB चारà¥à¤œ गरà¥à¤¨ समरà¥à¤¥à¤¿à¤¤ छैन।\n आपूरà¥à¤¤à¤¿ गरिà¤à¤•ो चारà¥à¤œà¤° मातà¥à¤° पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="battery_low_why" msgid="7279169609518386372">"बà¥à¤¯à¤¾à¤Ÿà¥à¤°à¤¿ पà¥à¤°à¤¯à¥‹à¤—"</string>
+ <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"सेटिङहरू"</string>
+ <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"वाइ-फाइ"</string>
+ <string name="status_bar_settings_airplane" msgid="4879879698500955300">"हवाइजहाज मोड"</string>
+ <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"सà¥à¤µà¤¤:घà¥à¤®à¥à¤¨à¥‡ सà¥à¤•à¥à¤°à¤¿à¤¨"</string>
+ <string name="status_bar_settings_mute_label" msgid="554682549917429396">"मà¥à¤¯à¥à¤Ÿ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"सà¥à¤µà¤¤à¤ƒ"</string>
+ <string name="status_bar_settings_notifications" msgid="397146176280905137">"सूचनाहरू"</string>
+ <string name="bluetooth_tethered" msgid="7094101612161133267">"बà¥à¤²à¥à¤Ÿà¥à¤¥ टेथर भयो"</string>
+ <string name="status_bar_input_method_settings_configure_input_methods" msgid="3504292471512317827">"इनपà¥à¤Ÿ विधिहरू सेटअप गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="status_bar_use_physical_keyboard" msgid="7551903084416057810">"फिजिकल किबोरà¥à¤¡"</string>
+ <string name="usb_device_permission_prompt" msgid="834698001271562057">"<xliff:g id="APPLICATION">%1$s</xliff:g> USB उपकरणलाई पहà¥à¤à¤š दिनको लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिने हो?"</string>
+ <string name="usb_accessory_permission_prompt" msgid="5171775411178865750">"<xliff:g id="APPLICATION">%1$s</xliff:g> USB पाटपà¥à¤°à¥à¤œà¤¾à¤²à¤¾à¤ˆ पहà¥à¤à¤š दिनको लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिने हो?"</string>
+ <string name="usb_device_confirm_prompt" msgid="5161205258635253206">"यो USB उपकरण जोडिà¤à¤•ो बेला <xliff:g id="ACTIVITY">%1$s</xliff:g> खोलà¥à¤¨à¥‡ हो?"</string>
+ <string name="usb_accessory_confirm_prompt" msgid="3808984931830229888">"यो USB सहायक जडान हà¥à¤à¤¦à¤¾ <xliff:g id="ACTIVITY">%1$s</xliff:g> खोलà¥à¤¨à¥‡ हो?"</string>
+ <string name="usb_accessory_uri_prompt" msgid="513450621413733343">"यस USB उपकरणसà¤à¤— सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— काम गरà¥à¤¦à¥ˆà¤¨à¥¤ यस उपकरणको बारेमा <xliff:g id="URL">%1$s</xliff:g> मा धेरै जानà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="title_usb_accessory" msgid="4966265263465181372">"USB सहयोगी"</string>
+ <string name="label_view" msgid="6304565553218192990">"दृशà¥à¤¯"</string>
+ <string name="always_use_device" msgid="1450287437017315906">"यो USB उपकरणको लागि पूरà¥à¤µà¤¨à¤¿à¤°à¥à¤§à¤¾à¤°à¤¿à¤¤à¤¬à¤¾à¤Ÿ पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="always_use_accessory" msgid="1210954576979621596">"यस USB सहायक सामानको लागि पूरà¥à¤µà¤¨à¤¿à¤°à¥à¤§à¤¾à¤°à¤¿à¤¤à¤¦à¥à¤µà¤¾à¤°à¤¾ पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="usb_debugging_title" msgid="4513918393387141949">"USB डिबग गरà¥à¤¨à¤•ो लागि अनà¥à¤®à¤¤à¤¿ दिने हो?"</string>
+ <string name="usb_debugging_message" msgid="2220143855912376496">"कमà¥à¤ªà¥à¤¯à¥à¤Ÿà¤°à¤•ो RSA कà¥à¤žà¥à¤œà¥€ औंलाछाप:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
+ <string name="usb_debugging_always" msgid="303335496705863070">"यो कमà¥à¤ªà¥à¤¯à¥à¤Ÿà¤°à¤¬à¤¾à¤Ÿ सधैठअनà¥à¤®à¤¤à¤¿ दिनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="compat_mode_on" msgid="6623839244840638213">"सà¥à¤•à¥à¤°à¤¿à¤¨ भरà¥à¤¨ जà¥à¤® गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="compat_mode_off" msgid="4434467572461327898">"सà¥à¤•à¥à¤°à¤¿à¤¨ भरà¥à¤¨ तनà¥à¤•ाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="screenshot_saving_ticker" msgid="7403652894056693515">"सà¥à¤•à¥à¤°à¤¿à¤¨à¤¸à¤Ÿ बचत गरà¥à¤¦à¥ˆâ€¦"</string>
+ <string name="screenshot_saving_title" msgid="8242282144535555697">"सà¥à¤•à¥à¤°à¤¿à¤¨à¤¸à¤Ÿ बचत गरà¥à¤¦à¥ˆâ€¦"</string>
+ <string name="screenshot_saving_text" msgid="2419718443411738818">"सà¥à¤•à¥à¤°à¤¿à¤¨à¤¸à¤Ÿ बचत हà¥à¤à¤¦à¥ˆ छ।"</string>
+ <string name="screenshot_saved_title" msgid="6461865960961414961">"सà¥à¤•à¥à¤°à¤¿à¤¨à¤¸à¤Ÿ कà¥à¤¯à¤¾à¤ªà¥à¤šà¤° गरियो।"</string>
+ <string name="screenshot_saved_text" msgid="1152839647677558815">"तपाईà¤à¤•ो सà¥à¤•à¥à¤°à¤¿à¤¨à¤¸à¤Ÿ हेरà¥à¤¨ छà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="screenshot_failed_title" msgid="705781116746922771">"सà¥à¤•à¥à¤°à¤¿à¤¨à¤¸à¤Ÿ कà¥à¤¯à¤¾à¤ªà¥à¤šà¤° गरà¥à¤¨ सकिà¤à¤¨à¥¤"</string>
+ <string name="screenshot_failed_text" msgid="8134011269572415402">"सà¥à¤•à¥à¤°à¤¿à¤¨à¤¸à¤Ÿà¤²à¤¾à¤ˆ बचत गरà¥à¤¨ सकेन। भणà¥à¤¡à¤¾à¤°à¤£ उपयोगमा हà¥à¤¨ सकà¥à¤›à¥¤"</string>
+ <string name="usb_preference_title" msgid="6551050377388882787">"USB फाइल सारà¥à¤¨à¥‡ विकलà¥à¤ªà¤¹à¤°à¥‚"</string>
+ <string name="use_mtp_button_title" msgid="4333504413563023626">"मिडिया पà¥à¤²à¥‡à¤¯à¤°(MTP)को रूपमा माउनà¥à¤Ÿ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="use_ptp_button_title" msgid="7517127540301625751">"कà¥à¤¯à¤¾à¤®à¥‡à¤°à¤¾à¤•ो रूपमा माउनà¥à¤Ÿ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ (PTP)"</string>
+ <string name="installer_cd_button_title" msgid="2312667578562201583">"मà¥à¤¯à¤¾à¤•को लागि à¤à¤¨à¥à¤¡à¥à¤°à¥‹à¤‡à¤¡ फाइल टà¥à¤°à¤¾à¤¨à¥à¤¸à¤«à¤° अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— सà¥à¤¥à¤¾à¤ªà¤¨à¤¾ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="accessibility_back" msgid="567011538994429120">"पछाडि"</string>
+ <string name="accessibility_home" msgid="8217216074895377641">"गृह"</string>
+ <string name="accessibility_menu" msgid="316839303324695949">"मेनà¥"</string>
+ <string name="accessibility_recent" msgid="8571350598987952883">"भरà¥à¤–रका अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरू"</string>
+ <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"इनपà¥à¤Ÿ विधि बटन सà¥à¤µà¤¿à¤š गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"मिलाउने जà¥à¤® बटन।"</string>
+ <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"सà¥à¤•à¥à¤°à¤¿à¤¨à¤²à¤¾à¤ˆ सानोबाट ठूलो पारà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"बà¥à¤²à¥à¤Ÿà¥à¤¥ जडान भयो।"</string>
+ <string name="accessibility_bluetooth_disconnected" msgid="7416648669976870175">"बà¥à¤²à¥à¤Ÿà¥à¤¥à¤¸à¤à¤— विचà¥à¤›à¥‡à¤¦ गरियो।"</string>
+ <string name="accessibility_no_battery" msgid="358343022352820946">"कà¥à¤¨à¥ˆ बà¥à¤¯à¤¾à¤Ÿà¥à¤°à¤¿ छैन।"</string>
+ <string name="accessibility_battery_one_bar" msgid="7774887721891057523">"बà¥à¤¯à¤¾à¤Ÿà¥à¤°à¤¿ à¤à¤‰à¤Ÿà¤¾ पटà¥à¤Ÿà¤¿à¥¤"</string>
+ <string name="accessibility_battery_two_bars" msgid="8500650438735009973">"बà¥à¤¯à¤¾à¤Ÿà¥à¤°à¤¿à¤•ा दà¥à¤ˆà¤µà¤Ÿà¤¾ पटà¥à¤Ÿà¤¿à¤¹à¤°à¥‚"</string>
+ <string name="accessibility_battery_three_bars" msgid="2302983330865040446">"बà¥à¤¯à¤¾à¤Ÿà¥à¤°à¤¿à¤•ा तिनवटा पटà¥à¤Ÿà¤¿à¤¹à¤°à¥‚"</string>
+ <string name="accessibility_battery_full" msgid="8909122401720158582">"बà¥à¤¯à¤¾à¤Ÿà¥à¤°à¤¿ पूरà¥à¤£ छ।"</string>
+ <string name="accessibility_no_phone" msgid="4894708937052611281">"फोन छैनà¥à¥¤"</string>
+ <string name="accessibility_phone_one_bar" msgid="687699278132664115">"फोन à¤à¤‰à¤Ÿà¤¾ पटà¥à¤Ÿà¤¿à¥¤"</string>
+ <string name="accessibility_phone_two_bars" msgid="8384905382804815201">"फोन दà¥à¤ˆ पटà¥à¤Ÿà¤¿à¥¤"</string>
+ <string name="accessibility_phone_three_bars" msgid="8521904843919971885">"फोन तिन पटà¥à¤Ÿà¤¿à¤¹à¤°à¥‚।"</string>
+ <string name="accessibility_phone_signal_full" msgid="6471834868580757898">"फोन सङà¥à¤•ेत भरिà¤à¤•ो।"</string>
+ <string name="accessibility_no_data" msgid="4791966295096867555">"डेटा छैन।"</string>
+ <string name="accessibility_data_one_bar" msgid="1415625833238273628">"डेटाको à¤à¤‰à¤Ÿà¤¾ पटà¥à¤Ÿà¤¿à¥¤"</string>
+ <string name="accessibility_data_two_bars" msgid="6166018492360432091">"डेटा दà¥à¤ˆ बाधाहरू।"</string>
+ <string name="accessibility_data_three_bars" msgid="9167670452395038520">"डेटा तिन बाधाहरू।"</string>
+ <string name="accessibility_data_signal_full" msgid="2708384608124519369">"डेटा संकेत पूरà¥à¤£à¥¤"</string>
+ <string name="accessibility_wifi_off" msgid="3177380296697933627">"वाइफाइ बनà¥à¤¦à¥¤"</string>
+ <string name="accessibility_no_wifi" msgid="1425476551827924474">"वाइफाइ विचà¥à¤›à¥‡à¤¦ भयो।"</string>
+ <string name="accessibility_wifi_one_bar" msgid="7735893178010724377">"वाइफाइ à¤à¤• पटà¥à¤Ÿà¤¿à¥¤"</string>
+ <string name="accessibility_wifi_two_bars" msgid="4994274250497262434">"वाइफाइ दà¥à¤ˆ पटà¥à¤Ÿà¤¿à¥¤"</string>
+ <string name="accessibility_wifi_three_bars" msgid="3495755044276588384">"वाइफाइ तिन बारहरू।"</string>
+ <string name="accessibility_wifi_signal_full" msgid="6853561303586480376">"वाइफाइ सङà¥à¤•ेत भरिà¤à¤•ो।"</string>
+ <string name="accessibility_no_wimax" msgid="4329180129727630368">"वाइमà¥à¤¯à¤¾à¤¸ छैन।"</string>
+ <string name="accessibility_wimax_one_bar" msgid="4170994299011863648">"WiMAX à¤à¤‰à¤Ÿà¤¾ पटà¥à¤Ÿà¤¿à¥¤"</string>
+ <string name="accessibility_wimax_two_bars" msgid="9176236858336502288">"वाइमà¥à¤¯à¤¾à¤•à¥à¤¸ दà¥à¤ˆà¤µà¤Ÿà¤¾ बारहरू।"</string>
+ <string name="accessibility_wimax_three_bars" msgid="6116551636752103927">"वाइमà¥à¤¯à¤¾à¤•à¥à¤¸ तिनवटा बारहरू।"</string>
+ <string name="accessibility_wimax_signal_full" msgid="2768089986795579558">"वाइमà¥à¤¯à¤¾à¤•à¥à¤¸ सङà¥à¤•ेत भरिà¤à¤•ा।"</string>
+ <string name="accessibility_no_signal" msgid="7064645320782585167">"सङà¥à¤•ेत छैन।"</string>
+ <string name="accessibility_not_connected" msgid="6395326276213402883">"जडान नगरिà¤à¤•ो।"</string>
+ <string name="accessibility_zero_bars" msgid="3806060224467027887">"शूनà¥à¤¯ पटà¥à¤Ÿà¤¿à¥¤"</string>
+ <string name="accessibility_one_bar" msgid="1685730113192081895">"à¤à¤‰à¤Ÿà¤¾ बार।"</string>
+ <string name="accessibility_two_bars" msgid="6437363648385206679">"दà¥à¤ˆ पटà¥à¤Ÿà¤¿à¤¹à¤°à¥‚।"</string>
+ <string name="accessibility_three_bars" msgid="2648241415119396648">"तिनवटा पटà¥à¤Ÿà¤¿à¤¹à¤°à¥‚"</string>
+ <string name="accessibility_signal_full" msgid="9122922886519676839">"सङà¥à¤•ेत पूरà¥à¤£ छ।"</string>
+ <string name="accessibility_desc_on" msgid="2385254693624345265">"चालà¥à¥¤"</string>
+ <string name="accessibility_desc_off" msgid="6475508157786853157">"बनà¥à¤¦ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="accessibility_desc_connected" msgid="8366256693719499665">"जडान गरिà¤à¤•ो।"</string>
+ <string name="accessibility_data_connection_gprs" msgid="1606477224486747751">"GPRS"</string>
+ <string name="accessibility_data_connection_1x" msgid="994133468120244018">"1 X"</string>
+ <string name="accessibility_data_connection_hspa" msgid="2032328855462645198">"HSPA"</string>
+ <string name="accessibility_data_connection_3g" msgid="8628562305003568260">"3G"</string>
+ <string name="accessibility_data_connection_3.5g" msgid="8664845609981692001">"3.5G"</string>
+ <string name="accessibility_data_connection_4g" msgid="7741000750630089612">"4G"</string>
+ <string name="accessibility_data_connection_lte" msgid="5413468808637540658">"LTE"</string>
+ <string name="accessibility_data_connection_cdma" msgid="6132648193978823023">"CDMA"</string>
+ <string name="accessibility_data_connection_roaming" msgid="5977362333466556094">"रोमिङ"</string>
+ <string name="accessibility_data_connection_edge" msgid="4477457051631979278">"Edge"</string>
+ <string name="accessibility_data_connection_wifi" msgid="2324496756590645221">"वाइ-फाइ"</string>
+ <string name="accessibility_no_sim" msgid="8274017118472455155">"SIM छैन।"</string>
+ <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"बà¥à¤²à¥à¤Ÿà¥à¤¥ टिथर गरà¥à¤¦à¥ˆà¥¤"</string>
+ <string name="accessibility_airplane_mode" msgid="834748999790763092">"हवाइजहाज मोड।"</string>
+ <string name="accessibility_battery_level" msgid="7451474187113371965">"बà¥à¤¯à¤¾à¤Ÿà¥à¤°à¤¿ <xliff:g id="NUMBER">%d</xliff:g> पà¥à¤°à¤¤à¤¿à¤¶à¤¤"</string>
+ <string name="accessibility_settings_button" msgid="799583911231893380">"पà¥à¤°à¤£à¤¾à¤²à¥€ सेटिङहरू"</string>
+ <string name="accessibility_notifications_button" msgid="4498000369779421892">"सूचनाहरू।"</string>
+ <string name="accessibility_remove_notification" msgid="3603099514902182350">"सूचना खाली गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="accessibility_gps_enabled" msgid="3511469499240123019">"GPS सकà¥à¤·à¤® गरिà¤à¤•ो"</string>
+ <string name="accessibility_gps_acquiring" msgid="8959333351058967158">"GPS पà¥à¤°à¤¾à¤ªà¥à¤¤ हà¥à¤à¤¦à¥ˆà¤›à¥¤"</string>
+ <string name="accessibility_tty_enabled" msgid="4613200365379426561">"टेलि टाइपराइटर सकà¥à¤·à¤® गरियो।"</string>
+ <string name="accessibility_ringer_vibrate" msgid="666585363364155055">"बजà¥à¤¨à¥‡ कमà¥à¤ªà¤¨ हà¥à¤¨à¥à¤›à¥¤"</string>
+ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"घनà¥à¤Ÿà¥€ मौन।"</string>
+ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> खारेज गरिà¤à¤•ो छ।"</string>
+ <string name="accessibility_notification_dismissed" msgid="854211387186306927">"सूचना खारेज।"</string>
+ <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"सूचना ककà¥à¤·à¥¤"</string>
+ <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"दà¥à¤°à¥à¤¤ सेटिङहरू"</string>
+ <string name="accessibility_desc_recent_apps" msgid="9014032916410590027">"वरà¥à¤¤à¤®à¤¾à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरू"</string>
+ <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ <xliff:g id="USER">%s</xliff:g>।"</string>
+ <string name="accessibility_quick_settings_wifi" msgid="6099781031669728709">"<xliff:g id="SIGNAL">%1$s</xliff:g>। <xliff:g id="NETWORK">%2$s</xliff:g>"</string>
+ <string name="accessibility_quick_settings_mobile" msgid="4876806564086241341">"मोवाइल <xliff:g id="SIGNAL">%1$s</xliff:g>। <xliff:g id="TYPE">%2$s</xliff:g>। <xliff:g id="NETWORK">%3$s</xliff:g>।"</string>
+ <string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"बà¥à¤¯à¤¾à¤Ÿà¥à¤°à¤¿ <xliff:g id="STATE">%s</xliff:g>।"</string>
+ <string name="accessibility_quick_settings_airplane" msgid="4196876722090224753">"हवाजहाज मोड <xliff:g id="STATE">%s</xliff:g>।"</string>
+ <string name="accessibility_quick_settings_bluetooth" msgid="5749054971341882340">"बà¥à¤²à¥à¤Ÿà¥à¤¥ <xliff:g id="STATE">%s</xliff:g>।"</string>
+ <string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"<xliff:g id="TIME">%s</xliff:g>को लागि सङà¥à¤•ेत घनà¥à¤Ÿà¥€ सेट गरिà¤à¤•ो"</string>
+ <string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"2G-3G डेटा अकà¥à¤·à¤® गरियो"</string>
+ <string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"4G डेटा असकà¥à¤·à¤® गरियो"</string>
+ <string name="data_usage_disabled_dialog_mobile_title" msgid="1046047248844821202">"मोबाइल डेटा अकà¥à¤·à¤® गरियो"</string>
+ <string name="data_usage_disabled_dialog_title" msgid="2086815304858964954">"डेटा अकà¥à¤·à¤® गरियो"</string>
+ <string name="data_usage_disabled_dialog" msgid="3853117269051806280">"तपाईठनिरà¥à¤¦à¤¿à¤·à¥à¤Ÿ डेटा उपयोग सीमामा पà¥à¤—à¥à¤¨à¥ भà¤à¤•ो छ।\n\nयदि तपाईà¤à¤²à¥‡ डेटालाई पà¥à¤¨à¤ƒà¤¸à¤•à¥à¤·à¤® पारà¥à¤¨à¥ भयो भने तपाईà¤à¤²à¤¾à¤ˆ अरà¥à¤•ो संचालकबाट शà¥à¤²à¥à¤• लगाउन सकà¥à¤›à¥¤"</string>
+ <string name="data_usage_disabled_dialog_enable" msgid="7729772039208664606">"डेटा पà¥à¤¨à¤ƒ सकà¥à¤·à¤® गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="status_bar_settings_signal_meter_disconnected" msgid="1940231521274147771">"इनà¥à¤Ÿà¤°à¤¨à¥‡à¤Ÿ जडान छैन"</string>
+ <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"वाइ-फाइ जडित"</string>
+ <string name="gps_notification_searching_text" msgid="8574247005642736060">"GPSको लागि खोजी गरà¥à¤¦à¥ˆ"</string>
+ <string name="gps_notification_found_text" msgid="4619274244146446464">"GPS दà¥à¤µà¤¾à¤°à¤¾ सà¥à¤¥à¤¾à¤¨ सेट गरिà¤à¤•ो"</string>
+ <string name="accessibility_location_active" msgid="2427290146138169014">"सà¥à¤¥à¤¾à¤¨ अनà¥à¤°à¥‹à¤§à¤¹à¤°à¥‚ सकà¥à¤°à¤¿à¤¯"</string>
+ <string name="accessibility_clear_all" msgid="5235938559247164925">"सबै सूचनाहरू हटाउनà¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—को जानकारी"</string>
+ <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"सà¥à¤•à¥à¤°à¤¿à¤¨ सà¥à¤µà¤¤à¤ƒ घà¥à¤®à¥à¤¨à¥‡ छ।"</string>
+ <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"सà¥à¤•à¥à¤°à¤¿à¤¨à¤²à¤¾à¤ˆ लà¥à¤¯à¤¾à¤¨à¥à¤¡à¤¸à¥à¤•ेप अवसà¥à¤¥à¤¾à¤®à¤¾ बनà¥à¤¦ गरिà¤à¤•ो छ।"</string>
+ <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"सà¥à¤•à¥à¤°à¤¿à¤¨ पोरà¥à¤Ÿà¥‡à¤Ÿ अभिमूखमा लक गरिà¤à¤•ो छ।"</string>
+ <string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
+ <string name="start_dreams" msgid="7219575858348719790">"दिवासपना"</string>
+ <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
+ <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"हवाइजहाज मोड"</string>
+ <string name="quick_settings_battery_charging_label" msgid="490074774465309209">"चारà¥à¤œ हà¥à¤à¤¦à¥ˆ, <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+ <string name="quick_settings_battery_charged_label" msgid="8865413079414246081">"चारà¥à¤œ भयो"</string>
+ <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"बà¥à¤²à¥à¤Ÿà¥à¤¥"</string>
+ <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"बà¥à¤²à¥à¤Ÿà¥à¤¥ (<xliff:g id="NUMBER">%d</xliff:g> उपकरणहरू)"</string>
+ <string name="quick_settings_bluetooth_off_label" msgid="8159652146149219937">"बà¥à¤²à¥à¤Ÿà¥à¤¥ बनà¥à¤¦"</string>
+ <string name="quick_settings_brightness_label" msgid="6968372297018755815">"चमक"</string>
+ <string name="quick_settings_rotation_unlocked_label" msgid="336054930362580584">"सà¥à¤µà¤¤à¤ƒ घà¥à¤®à¤¾à¤‡"</string>
+ <string name="quick_settings_rotation_locked_label" msgid="8058646447242565486">"घà¥à¤®à¥à¤¨à¥‡ लक गरेको"</string>
+ <string name="quick_settings_ime_label" msgid="7073463064369468429">"आगत विधि"</string>
+ <string name="quick_settings_location_label" msgid="5011327048748762257">"सà¥à¤¥à¤¾à¤¨"</string>
+ <string name="quick_settings_location_off_label" msgid="7464544086507331459">"सà¥à¤¥à¤¾à¤¨ बनà¥à¤¦ छ"</string>
+ <string name="quick_settings_media_device_label" msgid="1302906836372603762">"मिडिया उपकरण"</string>
+ <string name="quick_settings_rssi_label" msgid="7725671335550695589">"RSSI"</string>
+ <string name="quick_settings_rssi_emergency_only" msgid="2713774041672886750">"आकसà¥à¤®à¤¿à¤• कल मातà¥à¤°"</string>
+ <string name="quick_settings_settings_label" msgid="5326556592578065401">"सेटिङहरू"</string>
+ <string name="quick_settings_time_label" msgid="4635969182239736408">"समय"</string>
+ <string name="quick_settings_user_label" msgid="5238995632130897840">"मलाई"</string>
+ <string name="quick_settings_wifi_label" msgid="9135344704899546041">"वाइ-फाइ"</string>
+ <string name="quick_settings_wifi_not_connected" msgid="7171904845345573431">"जोडिà¤à¤•ो छैन"</string>
+ <string name="quick_settings_wifi_no_network" msgid="2221993077220856376">"नेटवरà¥à¤• छैन"</string>
+ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"वाइ-फाइ बनà¥à¤¦"</string>
+ <string name="quick_settings_wifi_display_label" msgid="6893592964463624333">"वाइ-फाइ पà¥à¤°à¤¦à¤°à¥à¤¶à¤¨"</string>
+ <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"ताररहित पà¥à¤°à¤¦à¤°à¥à¤¶à¤¨"</string>
+ <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"उजà¥à¤¯à¤¾à¤²à¤ªà¤¨"</string>
+ <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"सà¥à¤µà¤¤à¤ƒ"</string>
+ <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"सञà¥à¤œà¤¾à¤² अनà¥à¤—मित हà¥à¤¨ सकà¥à¤›"</string>
+ <string name="done_button" msgid="1759387181766603361">"भयो"</string>
+ <string name="ssl_ca_cert_dialog_title" msgid="1273796967092027291">"सञà¥à¤œà¤¾à¤² निगरानी"</string>
+ <string name="ssl_ca_cert_info_message" msgid="5430320539555358452">"यो उपकरण <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>दà¥à¤µà¤¾à¤°à¤¾ पà¥à¤°à¤¬à¤¨à¥à¤§à¤¿à¤¤ छ। \n \n तपाईà¤à¤•ो पà¥à¤°à¤¶à¤¾à¤¸à¤• तपाईà¤à¤•ो अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— र सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ वेब साइट लगायत सञà¥à¤œà¤¾à¤² गतिविधि अनà¥à¤—मन गरà¥à¤¨ सकà¥à¤·à¤® छ। \n \n थप जानकारीको लागि तपाईà¤à¤•ो पà¥à¤°à¤¶à¤¾à¤¸à¤•सà¤à¤— समà¥à¤ªà¤°à¥à¤• राखà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="ssl_ca_cert_warning_message" msgid="2033091656129963669">"à¤à¤• तेसà¥à¤°à¥‹ पकà¥à¤· तपाईà¤à¤•ो सञà¥à¤œà¤¾à¤²\n गतिविधि, इमेल, अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— र सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ वेबसाइट अनà¥à¤—मन गरà¥à¤¨ सकà¥à¤·à¤® छ। \n \n तपाईà¤à¤•ो उपकरणमा सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ à¤à¤• विशà¥à¤µà¤¸à¤¨à¥€à¤¯ पà¥à¤°à¤¾à¤®à¤¾à¤£à¤¿à¤• डेटाले समà¥à¤­à¤µ तà¥à¤²à¥à¤¯à¤¾à¤‡à¤°à¤¹à¥‡à¤•ो छ।"</string>
+ <string name="ssl_ca_cert_settings_button" msgid="7946956977377166709">"विशà¥à¤µà¤¸à¤¨à¥€à¤¯ पà¥à¤°à¤¾à¤®à¤¾à¤£à¤¿à¤• डेटा जाà¤à¤š गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+</resources>
diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml
new file mode 100644
index 0000000..c3eee01
--- /dev/null
+++ b/packages/SystemUI/res/values-ne/strings.xml
@@ -0,0 +1,204 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="7164937344850004466">"पà¥à¤°à¤£à¤¾à¤²à¥€ UI"</string>
+ <string name="status_bar_clear_all_button" msgid="7774721344716731603">"हटाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"सूचीबाट हटाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—को जानकारी"</string>
+ <string name="status_bar_no_recent_apps" msgid="6576392951053994640">"कà¥à¤¨à¥ˆ नयाठअनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरू छैननà¥"</string>
+ <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"नयाठअनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरू खारेज गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <plurals name="status_bar_accessibility_recent_apps">
+ <item quantity="one" msgid="5854176083865845541">"१ भरखरै अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—"</item>
+ <item quantity="other" msgid="1040784359794890744">"%d भरखरैका अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरू"</item>
+ </plurals>
+ <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"कà¥à¤¨à¥ˆ सूचनाहरू छैन"</string>
+ <string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"चलिरहेको"</string>
+ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"सूचनाहरू"</string>
+ <string name="battery_low_title" msgid="2783104807551211639">"चारà¥à¤œà¤° जडान गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="battery_low_subtitle" msgid="1752040062087829196">"बà¥à¤¯à¤¾à¤Ÿà¥à¤°à¤¿ नà¥à¤¯à¥‚न हà¥à¤à¤¦à¥ˆ छ।"</string>
+ <string name="battery_low_percent_format" msgid="1077244949318261761">"<xliff:g id="NUMBER">%d%%</xliff:g> बाà¤à¤•ी"</string>
+ <string name="invalid_charger" msgid="4549105996740522523">"USB चारà¥à¤œ गरà¥à¤¨ समरà¥à¤¥à¤¿à¤¤ छैन।\n आपूरà¥à¤¤à¤¿ गरिà¤à¤•ो चारà¥à¤œà¤° मातà¥à¤° पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="battery_low_why" msgid="7279169609518386372">"बà¥à¤¯à¤¾à¤Ÿà¥à¤°à¤¿ पà¥à¤°à¤¯à¥‹à¤—"</string>
+ <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"सेटिङहरू"</string>
+ <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"वाइ-फाइ"</string>
+ <string name="status_bar_settings_airplane" msgid="4879879698500955300">"हवाइजहाज मोड"</string>
+ <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"सà¥à¤µà¤¤:घà¥à¤®à¥à¤¨à¥‡ सà¥à¤•à¥à¤°à¤¿à¤¨"</string>
+ <string name="status_bar_settings_mute_label" msgid="554682549917429396">"मà¥à¤¯à¥à¤Ÿ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"सà¥à¤µà¤¤à¤ƒ"</string>
+ <string name="status_bar_settings_notifications" msgid="397146176280905137">"सूचनाहरू"</string>
+ <string name="bluetooth_tethered" msgid="7094101612161133267">"बà¥à¤²à¥à¤Ÿà¥à¤¥ टेथर भयो"</string>
+ <string name="status_bar_input_method_settings_configure_input_methods" msgid="3504292471512317827">"इनपà¥à¤Ÿ विधिहरू सेटअप गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="status_bar_use_physical_keyboard" msgid="7551903084416057810">"फिजिकल किबोरà¥à¤¡"</string>
+ <string name="usb_device_permission_prompt" msgid="834698001271562057">"<xliff:g id="APPLICATION">%1$s</xliff:g> USB उपकरणलाई पहà¥à¤à¤š दिनको लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिने हो?"</string>
+ <string name="usb_accessory_permission_prompt" msgid="5171775411178865750">"<xliff:g id="APPLICATION">%1$s</xliff:g> USB पाटपà¥à¤°à¥à¤œà¤¾à¤²à¤¾à¤ˆ पहà¥à¤à¤š दिनको लागि अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई अनà¥à¤®à¤¤à¤¿ दिने हो?"</string>
+ <string name="usb_device_confirm_prompt" msgid="5161205258635253206">"यो USB उपकरण जोडिà¤à¤•ो बेला <xliff:g id="ACTIVITY">%1$s</xliff:g> खोलà¥à¤¨à¥‡ हो?"</string>
+ <string name="usb_accessory_confirm_prompt" msgid="3808984931830229888">"यो USB सहायक जडान हà¥à¤à¤¦à¤¾ <xliff:g id="ACTIVITY">%1$s</xliff:g> खोलà¥à¤¨à¥‡ हो?"</string>
+ <string name="usb_accessory_uri_prompt" msgid="513450621413733343">"यस USB उपकरणसà¤à¤— सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— काम गरà¥à¤¦à¥ˆà¤¨à¥¤ यस उपकरणको बारेमा <xliff:g id="URL">%1$s</xliff:g> मा धेरै जानà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="title_usb_accessory" msgid="4966265263465181372">"USB सहयोगी"</string>
+ <string name="label_view" msgid="6304565553218192990">"दृशà¥à¤¯"</string>
+ <string name="always_use_device" msgid="1450287437017315906">"यो USB उपकरणको लागि पूरà¥à¤µà¤¨à¤¿à¤°à¥à¤§à¤¾à¤°à¤¿à¤¤à¤¬à¤¾à¤Ÿ पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="always_use_accessory" msgid="1210954576979621596">"यस USB सहायक सामानको लागि पूरà¥à¤µà¤¨à¤¿à¤°à¥à¤§à¤¾à¤°à¤¿à¤¤à¤¦à¥à¤µà¤¾à¤°à¤¾ पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="usb_debugging_title" msgid="4513918393387141949">"USB डिबग गरà¥à¤¨à¤•ो लागि अनà¥à¤®à¤¤à¤¿ दिने हो?"</string>
+ <string name="usb_debugging_message" msgid="2220143855912376496">"कमà¥à¤ªà¥à¤¯à¥à¤Ÿà¤°à¤•ो RSA कà¥à¤žà¥à¤œà¥€ औंलाछाप:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
+ <string name="usb_debugging_always" msgid="303335496705863070">"यो कमà¥à¤ªà¥à¤¯à¥à¤Ÿà¤°à¤¬à¤¾à¤Ÿ सधैठअनà¥à¤®à¤¤à¤¿ दिनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="compat_mode_on" msgid="6623839244840638213">"सà¥à¤•à¥à¤°à¤¿à¤¨ भरà¥à¤¨ जà¥à¤® गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="compat_mode_off" msgid="4434467572461327898">"सà¥à¤•à¥à¤°à¤¿à¤¨ भरà¥à¤¨ तनà¥à¤•ाउनà¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="compat_mode_help_header" msgid="7969493989397529910">"अनà¥à¤•ूलता जà¥à¤®"</string>
+ <string name="compat_mode_help_body" msgid="4946726776359270040">"जब कà¥à¤¨à¥ˆ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— सानो सà¥à¤•à¥à¤°à¤¿à¤¨à¤•ो लागि बनाइà¤à¤•ो हà¥à¤¨à¥à¤›, तब जà¥à¤® नियनà¥à¤¤à¥à¤°à¤£ घडीको नजिक देखिनà¥à¤›à¥¤"</string>
+ <string name="screenshot_saving_ticker" msgid="7403652894056693515">"सà¥à¤•à¥à¤°à¤¿à¤¨à¤¸à¤Ÿ बचत गरà¥à¤¦à¥ˆâ€¦"</string>
+ <string name="screenshot_saving_title" msgid="8242282144535555697">"सà¥à¤•à¥à¤°à¤¿à¤¨à¤¸à¤Ÿ बचत गरà¥à¤¦à¥ˆâ€¦"</string>
+ <string name="screenshot_saving_text" msgid="2419718443411738818">"सà¥à¤•à¥à¤°à¤¿à¤¨à¤¸à¤Ÿ बचत हà¥à¤à¤¦à¥ˆ छ।"</string>
+ <string name="screenshot_saved_title" msgid="6461865960961414961">"सà¥à¤•à¥à¤°à¤¿à¤¨à¤¸à¤Ÿ कà¥à¤¯à¤¾à¤ªà¥à¤šà¤° गरियो।"</string>
+ <string name="screenshot_saved_text" msgid="1152839647677558815">"तपाईà¤à¤•ो सà¥à¤•à¥à¤°à¤¿à¤¨à¤¸à¤Ÿ हेरà¥à¤¨ छà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="screenshot_failed_title" msgid="705781116746922771">"सà¥à¤•à¥à¤°à¤¿à¤¨à¤¸à¤Ÿ कà¥à¤¯à¤¾à¤ªà¥à¤šà¤° गरà¥à¤¨ सकिà¤à¤¨à¥¤"</string>
+ <string name="screenshot_failed_text" msgid="8134011269572415402">"सà¥à¤•à¥à¤°à¤¿à¤¨à¤¸à¤Ÿà¤²à¤¾à¤ˆ बचत गरà¥à¤¨ सकेन। भणà¥à¤¡à¤¾à¤°à¤£ उपयोगमा हà¥à¤¨ सकà¥à¤›à¥¤"</string>
+ <string name="usb_preference_title" msgid="6551050377388882787">"USB फाइल सारà¥à¤¨à¥‡ विकलà¥à¤ªà¤¹à¤°à¥‚"</string>
+ <string name="use_mtp_button_title" msgid="4333504413563023626">"मिडिया पà¥à¤²à¥‡à¤¯à¤°(MTP)को रूपमा माउनà¥à¤Ÿ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="use_ptp_button_title" msgid="7517127540301625751">"कà¥à¤¯à¤¾à¤®à¥‡à¤°à¤¾à¤•ो रूपमा माउनà¥à¤Ÿ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ (PTP)"</string>
+ <string name="installer_cd_button_title" msgid="2312667578562201583">"मà¥à¤¯à¤¾à¤•को लागि à¤à¤¨à¥à¤¡à¥à¤°à¥‹à¤‡à¤¡ फाइल टà¥à¤°à¤¾à¤¨à¥à¤¸à¤«à¤° अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— सà¥à¤¥à¤¾à¤ªà¤¨à¤¾ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="accessibility_back" msgid="567011538994429120">"पछाडि"</string>
+ <string name="accessibility_home" msgid="8217216074895377641">"गृह"</string>
+ <string name="accessibility_menu" msgid="316839303324695949">"मेनà¥"</string>
+ <string name="accessibility_recent" msgid="8571350598987952883">"भरà¥à¤–रका अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरू"</string>
+ <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"इनपà¥à¤Ÿ विधि बटन सà¥à¤µà¤¿à¤š गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"मिलाउने जà¥à¤® बटन।"</string>
+ <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"सà¥à¤•à¥à¤°à¤¿à¤¨à¤²à¤¾à¤ˆ सानोबाट ठूलो पारà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"बà¥à¤²à¥à¤Ÿà¥à¤¥ जडान भयो।"</string>
+ <string name="accessibility_bluetooth_disconnected" msgid="7416648669976870175">"बà¥à¤²à¥à¤Ÿà¥à¤¥à¤¸à¤à¤— विचà¥à¤›à¥‡à¤¦ गरियो।"</string>
+ <string name="accessibility_no_battery" msgid="358343022352820946">"कà¥à¤¨à¥ˆ बà¥à¤¯à¤¾à¤Ÿà¥à¤°à¤¿ छैन।"</string>
+ <string name="accessibility_battery_one_bar" msgid="7774887721891057523">"बà¥à¤¯à¤¾à¤Ÿà¥à¤°à¤¿ à¤à¤‰à¤Ÿà¤¾ पटà¥à¤Ÿà¤¿à¥¤"</string>
+ <string name="accessibility_battery_two_bars" msgid="8500650438735009973">"बà¥à¤¯à¤¾à¤Ÿà¥à¤°à¤¿à¤•ा दà¥à¤ˆà¤µà¤Ÿà¤¾ पटà¥à¤Ÿà¤¿à¤¹à¤°à¥‚"</string>
+ <string name="accessibility_battery_three_bars" msgid="2302983330865040446">"बà¥à¤¯à¤¾à¤Ÿà¥à¤°à¤¿à¤•ा तिनवटा पटà¥à¤Ÿà¤¿à¤¹à¤°à¥‚"</string>
+ <string name="accessibility_battery_full" msgid="8909122401720158582">"बà¥à¤¯à¤¾à¤Ÿà¥à¤°à¤¿ पूरà¥à¤£ छ।"</string>
+ <string name="accessibility_no_phone" msgid="4894708937052611281">"फोन छैनà¥à¥¤"</string>
+ <string name="accessibility_phone_one_bar" msgid="687699278132664115">"फोन à¤à¤‰à¤Ÿà¤¾ पटà¥à¤Ÿà¤¿à¥¤"</string>
+ <string name="accessibility_phone_two_bars" msgid="8384905382804815201">"फोन दà¥à¤ˆ पटà¥à¤Ÿà¤¿à¥¤"</string>
+ <string name="accessibility_phone_three_bars" msgid="8521904843919971885">"फोन तिन पटà¥à¤Ÿà¤¿à¤¹à¤°à¥‚।"</string>
+ <string name="accessibility_phone_signal_full" msgid="6471834868580757898">"फोन सङà¥à¤•ेत भरिà¤à¤•ो।"</string>
+ <string name="accessibility_no_data" msgid="4791966295096867555">"डेटा छैन।"</string>
+ <string name="accessibility_data_one_bar" msgid="1415625833238273628">"डेटाको à¤à¤‰à¤Ÿà¤¾ पटà¥à¤Ÿà¤¿à¥¤"</string>
+ <string name="accessibility_data_two_bars" msgid="6166018492360432091">"डेटा दà¥à¤ˆ बाधाहरू।"</string>
+ <string name="accessibility_data_three_bars" msgid="9167670452395038520">"डेटा तिन बाधाहरू।"</string>
+ <string name="accessibility_data_signal_full" msgid="2708384608124519369">"डेटा संकेत पूरà¥à¤£à¥¤"</string>
+ <string name="accessibility_wifi_off" msgid="3177380296697933627">"वाइफाइ बनà¥à¤¦à¥¤"</string>
+ <string name="accessibility_no_wifi" msgid="1425476551827924474">"वाइफाइ विचà¥à¤›à¥‡à¤¦ भयो।"</string>
+ <string name="accessibility_wifi_one_bar" msgid="7735893178010724377">"वाइफाइ à¤à¤• पटà¥à¤Ÿà¤¿à¥¤"</string>
+ <string name="accessibility_wifi_two_bars" msgid="4994274250497262434">"वाइफाइ दà¥à¤ˆ पटà¥à¤Ÿà¤¿à¥¤"</string>
+ <string name="accessibility_wifi_three_bars" msgid="3495755044276588384">"वाइफाइ तिन बारहरू।"</string>
+ <string name="accessibility_wifi_signal_full" msgid="6853561303586480376">"वाइफाइ सङà¥à¤•ेत भरिà¤à¤•ो।"</string>
+ <string name="accessibility_no_wimax" msgid="4329180129727630368">"वाइमà¥à¤¯à¤¾à¤¸ छैन।"</string>
+ <string name="accessibility_wimax_one_bar" msgid="4170994299011863648">"WiMAX à¤à¤‰à¤Ÿà¤¾ पटà¥à¤Ÿà¤¿à¥¤"</string>
+ <string name="accessibility_wimax_two_bars" msgid="9176236858336502288">"वाइमà¥à¤¯à¤¾à¤•à¥à¤¸ दà¥à¤ˆà¤µà¤Ÿà¤¾ बारहरू।"</string>
+ <string name="accessibility_wimax_three_bars" msgid="6116551636752103927">"वाइमà¥à¤¯à¤¾à¤•à¥à¤¸ तिनवटा बारहरू।"</string>
+ <string name="accessibility_wimax_signal_full" msgid="2768089986795579558">"वाइमà¥à¤¯à¤¾à¤•à¥à¤¸ सङà¥à¤•ेत भरिà¤à¤•ा।"</string>
+ <string name="accessibility_no_signal" msgid="7064645320782585167">"सङà¥à¤•ेत छैन।"</string>
+ <string name="accessibility_not_connected" msgid="6395326276213402883">"जडान नगरिà¤à¤•ो।"</string>
+ <string name="accessibility_zero_bars" msgid="3806060224467027887">"शूनà¥à¤¯ पटà¥à¤Ÿà¤¿à¥¤"</string>
+ <string name="accessibility_one_bar" msgid="1685730113192081895">"à¤à¤‰à¤Ÿà¤¾ बार।"</string>
+ <string name="accessibility_two_bars" msgid="6437363648385206679">"दà¥à¤ˆ पटà¥à¤Ÿà¤¿à¤¹à¤°à¥‚।"</string>
+ <string name="accessibility_three_bars" msgid="2648241415119396648">"तिनवटा पटà¥à¤Ÿà¤¿à¤¹à¤°à¥‚"</string>
+ <string name="accessibility_signal_full" msgid="9122922886519676839">"सङà¥à¤•ेत पूरà¥à¤£ छ।"</string>
+ <string name="accessibility_desc_on" msgid="2385254693624345265">"चालà¥à¥¤"</string>
+ <string name="accessibility_desc_off" msgid="6475508157786853157">"बनà¥à¤¦ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="accessibility_desc_connected" msgid="8366256693719499665">"जडान गरिà¤à¤•ो।"</string>
+ <string name="accessibility_data_connection_gprs" msgid="1606477224486747751">"GPRS"</string>
+ <string name="accessibility_data_connection_1x" msgid="994133468120244018">"1 X"</string>
+ <string name="accessibility_data_connection_hspa" msgid="2032328855462645198">"HSPA"</string>
+ <string name="accessibility_data_connection_3g" msgid="8628562305003568260">"3G"</string>
+ <string name="accessibility_data_connection_3.5g" msgid="8664845609981692001">"3.5G"</string>
+ <string name="accessibility_data_connection_4g" msgid="7741000750630089612">"4G"</string>
+ <string name="accessibility_data_connection_lte" msgid="5413468808637540658">"LTE"</string>
+ <string name="accessibility_data_connection_cdma" msgid="6132648193978823023">"CDMA"</string>
+ <string name="accessibility_data_connection_roaming" msgid="5977362333466556094">"रोमिङ"</string>
+ <string name="accessibility_data_connection_edge" msgid="4477457051631979278">"Edge"</string>
+ <string name="accessibility_data_connection_wifi" msgid="2324496756590645221">"वाइ-फाइ"</string>
+ <string name="accessibility_no_sim" msgid="8274017118472455155">"SIM छैन।"</string>
+ <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"बà¥à¤²à¥à¤Ÿà¥à¤¥ टिथर गरà¥à¤¦à¥ˆà¥¤"</string>
+ <string name="accessibility_airplane_mode" msgid="834748999790763092">"हवाइजहाज मोड।"</string>
+ <string name="accessibility_battery_level" msgid="7451474187113371965">"बà¥à¤¯à¤¾à¤Ÿà¥à¤°à¤¿ <xliff:g id="NUMBER">%d</xliff:g> पà¥à¤°à¤¤à¤¿à¤¶à¤¤"</string>
+ <string name="accessibility_settings_button" msgid="799583911231893380">"पà¥à¤°à¤£à¤¾à¤²à¥€ सेटिङहरू"</string>
+ <string name="accessibility_notifications_button" msgid="4498000369779421892">"सूचनाहरू।"</string>
+ <string name="accessibility_remove_notification" msgid="3603099514902182350">"सूचना खाली गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="accessibility_gps_enabled" msgid="3511469499240123019">"GPS सकà¥à¤·à¤® गरिà¤à¤•ो"</string>
+ <string name="accessibility_gps_acquiring" msgid="8959333351058967158">"GPS पà¥à¤°à¤¾à¤ªà¥à¤¤ हà¥à¤à¤¦à¥ˆà¤›à¥¤"</string>
+ <string name="accessibility_tty_enabled" msgid="4613200365379426561">"टेलि टाइपराइटर सकà¥à¤·à¤® गरियो।"</string>
+ <string name="accessibility_ringer_vibrate" msgid="666585363364155055">"बजà¥à¤¨à¥‡ कमà¥à¤ªà¤¨ हà¥à¤¨à¥à¤›à¥¤"</string>
+ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"घनà¥à¤Ÿà¥€ मौन।"</string>
+ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> खारेज गरिà¤à¤•ो छ।"</string>
+ <string name="accessibility_notification_dismissed" msgid="854211387186306927">"सूचना खारेज।"</string>
+ <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"सूचना ककà¥à¤·à¥¤"</string>
+ <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"दà¥à¤°à¥à¤¤ सेटिङहरू"</string>
+ <string name="accessibility_desc_recent_apps" msgid="9014032916410590027">"वरà¥à¤¤à¤®à¤¾à¤¨ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरू"</string>
+ <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ <xliff:g id="USER">%s</xliff:g>।"</string>
+ <string name="accessibility_quick_settings_wifi" msgid="6099781031669728709">"<xliff:g id="SIGNAL">%1$s</xliff:g>। <xliff:g id="NETWORK">%2$s</xliff:g>"</string>
+ <string name="accessibility_quick_settings_mobile" msgid="4876806564086241341">"मोवाइल <xliff:g id="SIGNAL">%1$s</xliff:g>। <xliff:g id="TYPE">%2$s</xliff:g>। <xliff:g id="NETWORK">%3$s</xliff:g>।"</string>
+ <string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"बà¥à¤¯à¤¾à¤Ÿà¥à¤°à¤¿ <xliff:g id="STATE">%s</xliff:g>।"</string>
+ <string name="accessibility_quick_settings_airplane" msgid="4196876722090224753">"हवाजहाज मोड <xliff:g id="STATE">%s</xliff:g>।"</string>
+ <string name="accessibility_quick_settings_bluetooth" msgid="5749054971341882340">"बà¥à¤²à¥à¤Ÿà¥à¤¥ <xliff:g id="STATE">%s</xliff:g>।"</string>
+ <string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"<xliff:g id="TIME">%s</xliff:g>को लागि सङà¥à¤•ेत घनà¥à¤Ÿà¥€ सेट गरिà¤à¤•ो"</string>
+ <string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"2G-3G डेटा अकà¥à¤·à¤® गरियो"</string>
+ <string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"4G डेटा असकà¥à¤·à¤® गरियो"</string>
+ <string name="data_usage_disabled_dialog_mobile_title" msgid="1046047248844821202">"मोबाइल डेटा अकà¥à¤·à¤® गरियो"</string>
+ <string name="data_usage_disabled_dialog_title" msgid="2086815304858964954">"डेटा अकà¥à¤·à¤® गरियो"</string>
+ <string name="data_usage_disabled_dialog" msgid="3853117269051806280">"तपाईठनिरà¥à¤¦à¤¿à¤·à¥à¤Ÿ डेटा उपयोग सीमामा पà¥à¤—à¥à¤¨à¥ भà¤à¤•ो छ।\n\nयदि तपाईà¤à¤²à¥‡ डेटालाई पà¥à¤¨à¤ƒà¤¸à¤•à¥à¤·à¤® पारà¥à¤¨à¥ भयो भने तपाईà¤à¤²à¤¾à¤ˆ अरà¥à¤•ो संचालकबाट शà¥à¤²à¥à¤• लगाउन सकà¥à¤›à¥¤"</string>
+ <string name="data_usage_disabled_dialog_enable" msgid="7729772039208664606">"डेटा पà¥à¤¨à¤ƒ सकà¥à¤·à¤® गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="status_bar_settings_signal_meter_disconnected" msgid="1940231521274147771">"इनà¥à¤Ÿà¤°à¤¨à¥‡à¤Ÿ जडान छैन"</string>
+ <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"वाइ-फाइ जडित"</string>
+ <string name="gps_notification_searching_text" msgid="8574247005642736060">"GPSको लागि खोजी गरà¥à¤¦à¥ˆ"</string>
+ <string name="gps_notification_found_text" msgid="4619274244146446464">"GPS दà¥à¤µà¤¾à¤°à¤¾ सà¥à¤¥à¤¾à¤¨ सेट गरिà¤à¤•ो"</string>
+ <string name="accessibility_location_active" msgid="2427290146138169014">"सà¥à¤¥à¤¾à¤¨ अनà¥à¤°à¥‹à¤§à¤¹à¤°à¥‚ सकà¥à¤°à¤¿à¤¯"</string>
+ <string name="accessibility_clear_all" msgid="5235938559247164925">"सबै सूचनाहरू हटाउनà¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
+ <string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—को जानकारी"</string>
+ <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"सà¥à¤•à¥à¤°à¤¿à¤¨ सà¥à¤µà¤¤à¤ƒ घà¥à¤®à¥à¤¨à¥‡ छ।"</string>
+ <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"सà¥à¤•à¥à¤°à¤¿à¤¨à¤²à¤¾à¤ˆ लà¥à¤¯à¤¾à¤¨à¥à¤¡à¤¸à¥à¤•ेप अवसà¥à¤¥à¤¾à¤®à¤¾ बनà¥à¤¦ गरिà¤à¤•ो छ।"</string>
+ <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"सà¥à¤•à¥à¤°à¤¿à¤¨ पोरà¥à¤Ÿà¥‡à¤Ÿ अभिमूखमा लक गरिà¤à¤•ो छ।"</string>
+ <string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
+ <string name="start_dreams" msgid="7219575858348719790">"दिवासपना"</string>
+ <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
+ <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"उडान मोड"</string>
+ <string name="quick_settings_battery_charging_label" msgid="490074774465309209">"चारà¥à¤œ हà¥à¤à¤¦à¥ˆ, <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+ <string name="quick_settings_battery_charged_label" msgid="8865413079414246081">"चारà¥à¤œ भयो"</string>
+ <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"बà¥à¤²à¥à¤Ÿà¥à¤¥"</string>
+ <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"बà¥à¤²à¥à¤Ÿà¥à¤¥ (<xliff:g id="NUMBER">%d</xliff:g> उपकरणहरू)"</string>
+ <string name="quick_settings_bluetooth_off_label" msgid="8159652146149219937">"बà¥à¤²à¥à¤Ÿà¥à¤¥ बनà¥à¤¦"</string>
+ <string name="quick_settings_brightness_label" msgid="6968372297018755815">"चमक"</string>
+ <string name="quick_settings_rotation_unlocked_label" msgid="336054930362580584">"सà¥à¤µà¤¤à¤ƒ घà¥à¤®à¤¾à¤‡"</string>
+ <string name="quick_settings_rotation_locked_label" msgid="8058646447242565486">"घà¥à¤®à¥à¤¨à¥‡ लक गरेको"</string>
+ <string name="quick_settings_ime_label" msgid="7073463064369468429">"आगत विधि"</string>
+ <string name="quick_settings_location_label" msgid="5011327048748762257">"सà¥à¤¥à¤¾à¤¨"</string>
+ <string name="quick_settings_location_off_label" msgid="7464544086507331459">"सà¥à¤¥à¤¾à¤¨ बनà¥à¤¦ छ"</string>
+ <string name="quick_settings_media_device_label" msgid="1302906836372603762">"मिडिया उपकरण"</string>
+ <string name="quick_settings_rssi_label" msgid="7725671335550695589">"RSSI"</string>
+ <string name="quick_settings_rssi_emergency_only" msgid="2713774041672886750">"आकसà¥à¤®à¤¿à¤• कल मातà¥à¤°"</string>
+ <string name="quick_settings_settings_label" msgid="5326556592578065401">"सेटिङहरू"</string>
+ <string name="quick_settings_time_label" msgid="4635969182239736408">"समय"</string>
+ <string name="quick_settings_user_label" msgid="5238995632130897840">"मलाई"</string>
+ <string name="quick_settings_wifi_label" msgid="9135344704899546041">"वाइ-फाइ"</string>
+ <string name="quick_settings_wifi_not_connected" msgid="7171904845345573431">"जोडिà¤à¤•ो छैन"</string>
+ <string name="quick_settings_wifi_no_network" msgid="2221993077220856376">"नेटवरà¥à¤• छैन"</string>
+ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"वाइ-फाइ बनà¥à¤¦"</string>
+ <string name="quick_settings_wifi_display_label" msgid="6893592964463624333">"वाइ-फाइ पà¥à¤°à¤¦à¤°à¥à¤¶à¤¨"</string>
+ <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"ताररहित पà¥à¤°à¤¦à¤°à¥à¤¶à¤¨"</string>
+ <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"उजà¥à¤¯à¤¾à¤²à¤ªà¤¨"</string>
+ <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"सà¥à¤µà¤¤à¤ƒ"</string>
+ <string name="status_bar_help_title" msgid="1199237744086469217">"यहाठजानकारीहरू देखा परà¥à¤›à¤¨à¥"</string>
+ <string name="status_bar_help_text" msgid="7874607155052076323">"तल हà¥à¤¤à¥à¤¤à¥à¤¯à¤¾à¤à¤° तिनीहरूलाई सधैं पहà¥à¤à¤š गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥\nपà¥à¤°à¤£à¤¾à¤²à¥€ नियनà¥à¤¤à¥à¤°à¤£à¤•ो लागि पà¥à¤¨à¤ƒ तल हà¥à¤¤à¥à¤¤à¥à¤¯à¤¾à¤‰à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+</resources>
diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml
index ab77839..d4b0dee 100644
--- a/packages/SystemUI/res/values-nl/strings.xml
+++ b/packages/SystemUI/res/values-nl/strings.xml
@@ -61,8 +61,6 @@
<string name="usb_debugging_always" msgid="303335496705863070">"Altijd toestaan vanaf deze computer"</string>
<string name="compat_mode_on" msgid="6623839244840638213">"Zoom om scherm te vullen"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Rek uit v. schermvulling"</string>
- <string name="compat_mode_help_header" msgid="7969493989397529910">"Compatibiliteitszoom"</string>
- <string name="compat_mode_help_body" msgid="4946726776359270040">"Wanneer een app is ontworpen voor een kleiner scherm, wordt naast de klok een zoomknop weergegeven."</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Screenshot opslaan..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Screenshot opslaan..."</string>
<string name="screenshot_saving_text" msgid="2419718443411738818">"Screenshot wordt opgeslagen."</string>
@@ -78,6 +76,8 @@
<string name="accessibility_home" msgid="8217216074895377641">"Startpagina"</string>
<string name="accessibility_menu" msgid="316839303324695949">"Menu"</string>
<string name="accessibility_recent" msgid="8571350598987952883">"Recente apps"</string>
+ <string name="accessibility_search_light" msgid="1103867596330271848">"Zoeken"</string>
+ <string name="accessibility_camera_button" msgid="8064671582820358152">"Camera"</string>
<string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Knop voor wijzigen invoermethode."</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Knop voor compatibiliteitszoom."</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Kleiner scherm uitzoomen naar groter scherm."</string>
@@ -153,6 +153,7 @@
<string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"Accu: <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_airplane" msgid="4196876722090224753">"Vliegmodus: <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="5749054971341882340">"Bluetooth: <xliff:g id="STATE">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_location" msgid="4577282329866813100">"Locatie <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"Alarm is ingesteld op <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"2G-/3G-gegevens uitgeschakeld"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"4G-gegevens uitgeschakeld"</string>
@@ -164,12 +165,13 @@
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Verbonden via wifi"</string>
<string name="gps_notification_searching_text" msgid="8574247005642736060">"Zoeken naar GPS"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"Locatie bepaald met GPS"</string>
+ <string name="accessibility_location_active" msgid="2427290146138169014">"Locatieverzoeken actief"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"Alle meldingen wissen."</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"App-info"</string>
<string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Scherm wordt automatisch geroteerd."</string>
<string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Het scherm is nu vergrendeld in liggende stand."</string>
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Het scherm is nu vergrendeld in staande stand."</string>
- <string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
+ <string name="dessert_case" msgid="1295161776223959221">"Dessertshowcase"</string>
<string name="start_dreams" msgid="7219575858348719790">"Dagdroom"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
<string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Vliegmodus"</string>
@@ -195,11 +197,11 @@
<string name="quick_settings_wifi_no_network" msgid="2221993077220856376">"Geen netwerk"</string>
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wifi uit"</string>
<string name="quick_settings_wifi_display_label" msgid="6893592964463624333">"Wifi-weergave"</string>
- <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Draadloze display"</string>
+ <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Draadloze weergave"</string>
<string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Helderheid"</string>
<string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTOMATISCH"</string>
- <string name="status_bar_help_title" msgid="1199237744086469217">"Meldingen worden hier weergegeven"</string>
- <string name="status_bar_help_text" msgid="7874607155052076323">"U kunt de meldingen op elk gewenst moment openen door met uw vinger omlaag te vegen.\nVeeg nogmaals met uw vinger omlaag om de systeembesturingselementen weer te geven."</string>
- <string name="hideybar_confirmation_message" msgid="9050869548951044371">"Veeg vanaf de rand om balk weer te geven"</string>
- <string name="hideybar_confirmation_message_long" msgid="7117692795163620626">"Veeg vanaf de rand van het scherm om de systeembalk weer te geven"</string>
+ <string name="quick_settings_inversion_label" msgid="1666358784283020762">"Modus voor kleurinversie"</string>
+ <string name="quick_settings_contrast_label" msgid="3319507551689108692">"Modus voor verbeterd contrast"</string>
+ <string name="quick_settings_color_space_label" msgid="853443689745584770">"Modus voor kleurcorrectie"</string>
+ <string name="ssl_ca_cert_warning" msgid="9005954106902053641">"Netwerk kan\nworden gecontroleerd"</string>
</resources>
diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml
index c94cfc8..6abaea0 100644
--- a/packages/SystemUI/res/values-pl/strings.xml
+++ b/packages/SystemUI/res/values-pl/strings.xml
@@ -61,8 +61,6 @@
<string name="usb_debugging_always" msgid="303335496705863070">"Zawsze zezwalaj z tego komputera"</string>
<string name="compat_mode_on" msgid="6623839244840638213">"Powiększ, aby wypełnić ekran"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Rozciągnij, aby wypełnić ekran"</string>
- <string name="compat_mode_help_header" msgid="7969493989397529910">"Powiększenie w trybie zgodności"</string>
- <string name="compat_mode_help_body" msgid="4946726776359270040">"Jeśli aplikacja została przystosowana do mniejszego ekranu, obok zegara zostanie wyświetlony element sterujący powiększeniem."</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Zapisywanie zrzutu ekranu..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Zapisywanie zrzutu ekranu..."</string>
<string name="screenshot_saving_text" msgid="2419718443411738818">"Zapisywanie zrzutu ekranu."</string>
@@ -78,6 +76,8 @@
<string name="accessibility_home" msgid="8217216074895377641">"Ekran główny"</string>
<string name="accessibility_menu" msgid="316839303324695949">"Menu"</string>
<string name="accessibility_recent" msgid="8571350598987952883">"Ostatnie aplikacje"</string>
+ <string name="accessibility_search_light" msgid="1103867596330271848">"Szukaj"</string>
+ <string name="accessibility_camera_button" msgid="8064671582820358152">"Aparat"</string>
<string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Przycisk przełączania metody wprowadzania."</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Przycisk powiększenia na potrzeby zgodności."</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Powiększa mniejszy ekran do większego."</string>
@@ -153,6 +153,7 @@
<string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"Bateria: <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_airplane" msgid="4196876722090224753">"Tryb samolotowy: <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="5749054971341882340">"Bluetooth: <xliff:g id="STATE">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_location" msgid="4577282329866813100">"Lokalizacja <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"Alarm ustawiony na <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"Wyłączono transmisję danych 2G/3G"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"Wyłączono transmisję danych 4G"</string>
@@ -164,12 +165,13 @@
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Wi-Fi: połączono"</string>
<string name="gps_notification_searching_text" msgid="8574247005642736060">"Wyszukiwanie sygnału GPS"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"Lokalizacja z GPSa"</string>
+ <string name="accessibility_location_active" msgid="2427290146138169014">"Prośby o lokalizację są aktywne"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"Usuń wszystkie powiadomienia."</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"O aplikacji"</string>
<string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Ekran zostanie obrócony automatycznie."</string>
<string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Ekran jest zablokowany w orientacji poziomej."</string>
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Ekran jest zablokowany w orientacji pionowej."</string>
- <string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
+ <string name="dessert_case" msgid="1295161776223959221">"Półka ze słodkościami"</string>
<string name="start_dreams" msgid="7219575858348719790">"Wygaszacz ekranu"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
<string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Tryb samolotowy"</string>
@@ -198,8 +200,8 @@
<string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Wyświetlacz bezprzewodowy"</string>
<string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Jasność"</string>
<string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTOMATYCZNA"</string>
- <string name="status_bar_help_title" msgid="1199237744086469217">"Tutaj pokazujÄ… siÄ™ powiadomienia"</string>
- <string name="status_bar_help_text" msgid="7874607155052076323">"Możesz je otworzyć w dowolnej chwili, przesuwając w dół.\nPrzesuń jeszcze raz w dół, by otworzyć ustawienia systemowe."</string>
- <string name="hideybar_confirmation_message" msgid="9050869548951044371">"Przesuń palcem od krawędzi ekranu, by odkryć pasek"</string>
- <string name="hideybar_confirmation_message_long" msgid="7117692795163620626">"Przesuń palcem od krawędzi ekranu, by odkryć pasek systemu"</string>
+ <string name="quick_settings_inversion_label" msgid="1666358784283020762">"Tryb odwrócenia kolorów"</string>
+ <string name="quick_settings_contrast_label" msgid="3319507551689108692">"Tryb zwiększonego kontrastu"</string>
+ <string name="quick_settings_color_space_label" msgid="853443689745584770">"Tryb korekcji kolorów"</string>
+ <string name="ssl_ca_cert_warning" msgid="9005954106902053641">"Sieć może być\nmonitorowana"</string>
</resources>
diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml
index c106329..1921581 100644
--- a/packages/SystemUI/res/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res/values-pt-rPT/strings.xml
@@ -61,8 +61,6 @@
<string name="usb_debugging_always" msgid="303335496705863070">"Permitir sempre a partir deste computador"</string>
<string name="compat_mode_on" msgid="6623839244840638213">"Zoom para preencher o ecrã"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Esticar p. caber em ec. int."</string>
- <string name="compat_mode_help_header" msgid="7969493989397529910">"Zoom de compatibilidade"</string>
- <string name="compat_mode_help_body" msgid="4946726776359270040">"Sempre que uma aplicação tiver sido concebida para ecrãs mais pequenos, aparecerá um controlo de zoom junto ao relógio."</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"A guardar captura de ecrã..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"A guardar captura de ecrã..."</string>
<string name="screenshot_saving_text" msgid="2419718443411738818">"A guardar captura de ecrã."</string>
@@ -78,6 +76,8 @@
<string name="accessibility_home" msgid="8217216074895377641">"Página inicial"</string>
<string name="accessibility_menu" msgid="316839303324695949">"Menu"</string>
<string name="accessibility_recent" msgid="8571350598987952883">"Aplicações recentes"</string>
+ <string name="accessibility_search_light" msgid="1103867596330271848">"Pesquisar"</string>
+ <string name="accessibility_camera_button" msgid="8064671582820358152">"Câmara"</string>
<string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Alternar botão de método de introdução."</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Botão zoom de compatibilidade."</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Zoom menor para ecrã maior."</string>
@@ -153,6 +153,7 @@
<string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"Bateria <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_airplane" msgid="4196876722090224753">"Modo de Avião <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="5749054971341882340">"Bluetooth <xliff:g id="STATE">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_location" msgid="4577282329866813100">"Localização <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"Alarme definido para <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"Os dados 2G-3G estão desativados"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"Os dados 4G estão desativados"</string>
@@ -164,12 +165,13 @@
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Wi-Fi ligado"</string>
<string name="gps_notification_searching_text" msgid="8574247005642736060">"A procurar GPS"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"Localização definida por GPS"</string>
+ <string name="accessibility_location_active" msgid="2427290146138169014">"Pedidos de localização ativos"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"Limpar todas as notificações."</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Informações da aplicação"</string>
<string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"O ecrã será rodado automaticamente."</string>
<string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"O ecrã está bloqueado na orientação horizontal."</string>
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"O ecrã está bloqueado na orientação vertical."</string>
- <string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
+ <string name="dessert_case" msgid="1295161776223959221">"Vitrina de sobremesas"</string>
<string name="start_dreams" msgid="7219575858348719790">"Daydream"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
<string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Modo de avião"</string>
@@ -198,8 +200,8 @@
<string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Display Sem Fios"</string>
<string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Brilho"</string>
<string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTOMÃTICO"</string>
- <string name="status_bar_help_title" msgid="1199237744086469217">"As notificações são apresentadas aqui"</string>
- <string name="status_bar_help_text" msgid="7874607155052076323">"Pode aceder em qualquer altura, deslizando rapidamente para baixo com o dedo.\nDeslize novamente para baixo para aceder aos controlos do sistema."</string>
- <string name="hideybar_confirmation_message" msgid="9050869548951044371">"Deslize da extremidade do ecrã para revelar a barra"</string>
- <string name="hideybar_confirmation_message_long" msgid="7117692795163620626">"Deslize da extremidade do ecrã para revelar a barra do sistema"</string>
+ <string name="quick_settings_inversion_label" msgid="1666358784283020762">"Modo de inversão de cor"</string>
+ <string name="quick_settings_contrast_label" msgid="3319507551689108692">"Modo de contraste melhorado"</string>
+ <string name="quick_settings_color_space_label" msgid="853443689745584770">"Modo de correção de cor"</string>
+ <string name="ssl_ca_cert_warning" msgid="9005954106902053641">"A rede pode ser\nmonitorizada"</string>
</resources>
diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml
index 91e7f02..d6e6d6e 100644
--- a/packages/SystemUI/res/values-pt/strings.xml
+++ b/packages/SystemUI/res/values-pt/strings.xml
@@ -61,8 +61,6 @@
<string name="usb_debugging_always" msgid="303335496705863070">"Sempre permitir a partir deste computador"</string>
<string name="compat_mode_on" msgid="6623839244840638213">"Zoom p/ preencher a tela"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Ampliar p/ preencher tela"</string>
- <string name="compat_mode_help_header" msgid="7969493989397529910">"Zoom em modo de compatibilidade"</string>
- <string name="compat_mode_help_body" msgid="4946726776359270040">"Quando um aplicativo é desenvolvido para uma tela menor, um controle de zoom é exibido perto do relógio."</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Salvando captura de tela..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Salvando captura de tela..."</string>
<string name="screenshot_saving_text" msgid="2419718443411738818">"A captura de tela está sendo salva."</string>
@@ -78,6 +76,8 @@
<string name="accessibility_home" msgid="8217216074895377641">"Página inicial"</string>
<string name="accessibility_menu" msgid="316839303324695949">"Menu"</string>
<string name="accessibility_recent" msgid="8571350598987952883">"Aplicativos recentes"</string>
+ <string name="accessibility_search_light" msgid="1103867596330271848">"Pesquisar"</string>
+ <string name="accessibility_camera_button" msgid="8064671582820358152">"Câmera"</string>
<string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Alterar botão do método de entrada."</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Botão de zoom da compatibilidade."</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Aumentar a tela com zoom."</string>
@@ -155,6 +155,7 @@
<string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"Bateria <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_airplane" msgid="4196876722090224753">"Modo avião <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="5749054971341882340">"Bluetooth <xliff:g id="STATE">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_location" msgid="4577282329866813100">"Localização <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"Alarme definido para <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"Dados 2G e 3G desativados"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"Dados 4G desativados"</string>
@@ -166,12 +167,13 @@
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Wi-Fi conectado"</string>
<string name="gps_notification_searching_text" msgid="8574247005642736060">"Buscando GPS"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"Local definido por GPS"</string>
+ <string name="accessibility_location_active" msgid="2427290146138169014">"Solicitações de localização ativas"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"Limpar todas as notificações."</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Informações do aplicativo"</string>
<string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"A tela girará automaticamente."</string>
<string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"A tela está bloqueada na orientação paisagem."</string>
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"A tela está bloqueada na orientação retrato."</string>
- <string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
+ <string name="dessert_case" msgid="1295161776223959221">"Mostruário de sobremesas"</string>
<string name="start_dreams" msgid="7219575858348719790">"Daydream"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
<string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Modo avião"</string>
@@ -184,10 +186,8 @@
<string name="quick_settings_rotation_unlocked_label" msgid="336054930362580584">"Girar automat."</string>
<string name="quick_settings_rotation_locked_label" msgid="8058646447242565486">"Rotação bloqueada"</string>
<string name="quick_settings_ime_label" msgid="7073463064369468429">"Método de entrada"</string>
- <!-- no translation found for quick_settings_location_label (5011327048748762257) -->
- <skip />
- <!-- no translation found for quick_settings_location_off_label (7464544086507331459) -->
- <skip />
+ <string name="quick_settings_location_label" msgid="5011327048748762257">"Localização"</string>
+ <string name="quick_settings_location_off_label" msgid="7464544086507331459">"Localização desativada"</string>
<string name="quick_settings_media_device_label" msgid="1302906836372603762">"Dispositivo de mídia"</string>
<string name="quick_settings_rssi_label" msgid="7725671335550695589">"RSSI"</string>
<string name="quick_settings_rssi_emergency_only" msgid="2713774041672886750">"Somente chamadas de emergência"</string>
@@ -202,8 +202,8 @@
<string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Display sem fio"</string>
<string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Brilho"</string>
<string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTO"</string>
- <string name="status_bar_help_title" msgid="1199237744086469217">"As notificações aparecem aqui"</string>
- <string name="status_bar_help_text" msgid="7874607155052076323">"Acesse a qualquer momento deslizando para baixo.\nDeslize para baixo novamente para acessar os controles do sistema."</string>
- <string name="hideybar_confirmation_message" msgid="9050869548951044371">"Deslize a borda da tela para ver a barra"</string>
- <string name="hideybar_confirmation_message_long" msgid="7117692795163620626">"Deslize a partir da borda da tela ver a barra do sistema"</string>
+ <string name="quick_settings_inversion_label" msgid="1666358784283020762">"Modo de inversão de cores"</string>
+ <string name="quick_settings_contrast_label" msgid="3319507551689108692">"Modo de contraste aprimorado"</string>
+ <string name="quick_settings_color_space_label" msgid="853443689745584770">"Modo de correção de cor"</string>
+ <string name="ssl_ca_cert_warning" msgid="9005954106902053641">"A rede pode estar\nsob monitoração"</string>
</resources>
diff --git a/packages/SystemUI/res/values-rm/strings.xml b/packages/SystemUI/res/values-rm/strings.xml
index d7772ed..dd5a231 100644
--- a/packages/SystemUI/res/values-rm/strings.xml
+++ b/packages/SystemUI/res/values-rm/strings.xml
@@ -92,10 +92,6 @@
<skip />
<!-- no translation found for compat_mode_off (4434467572461327898) -->
<skip />
- <!-- no translation found for compat_mode_help_header (7969493989397529910) -->
- <skip />
- <!-- no translation found for compat_mode_help_body (4946726776359270040) -->
- <skip />
<!-- no translation found for screenshot_saving_ticker (7403652894056693515) -->
<skip />
<!-- no translation found for screenshot_saving_title (8242282144535555697) -->
@@ -126,6 +122,10 @@
<skip />
<!-- no translation found for accessibility_recent (8571350598987952883) -->
<skip />
+ <!-- no translation found for accessibility_search_light (1103867596330271848) -->
+ <skip />
+ <!-- no translation found for accessibility_camera_button (8064671582820358152) -->
+ <skip />
<!-- no translation found for accessibility_ime_switch_button (5032926134740456424) -->
<skip />
<!-- no translation found for accessibility_compatibility_zoom_button (8461115318742350699) -->
@@ -276,6 +276,8 @@
<skip />
<!-- no translation found for accessibility_quick_settings_bluetooth (5749054971341882340) -->
<skip />
+ <!-- no translation found for accessibility_quick_settings_location (4577282329866813100) -->
+ <skip />
<!-- no translation found for accessibility_quick_settings_alarm (3959908972897295660) -->
<skip />
<!-- no translation found for data_usage_disabled_dialog_3g_title (5257833881698644687) -->
@@ -298,6 +300,8 @@
<skip />
<!-- no translation found for gps_notification_found_text (4619274244146446464) -->
<skip />
+ <!-- no translation found for accessibility_location_active (2427290146138169014) -->
+ <skip />
<!-- no translation found for accessibility_clear_all (5235938559247164925) -->
<skip />
<!-- no translation found for status_bar_notification_inspect_item_title (1163547729015390250) -->
@@ -308,7 +312,7 @@
<skip />
<!-- no translation found for accessibility_rotation_lock_on_portrait (5809367521644012115) -->
<skip />
- <!-- no translation found for jelly_bean_dream_name (5992026543636816792) -->
+ <!-- no translation found for dessert_case (1295161776223959221) -->
<skip />
<!-- no translation found for start_dreams (7219575858348719790) -->
<skip />
@@ -366,12 +370,12 @@
<skip />
<!-- no translation found for quick_settings_brightness_dialog_auto_brightness_label (5064982743784071218) -->
<skip />
- <!-- no translation found for status_bar_help_title (1199237744086469217) -->
+ <!-- no translation found for quick_settings_inversion_label (1666358784283020762) -->
<skip />
- <!-- no translation found for status_bar_help_text (7874607155052076323) -->
+ <!-- no translation found for quick_settings_contrast_label (3319507551689108692) -->
<skip />
- <!-- no translation found for hideybar_confirmation_message (9050869548951044371) -->
+ <!-- no translation found for quick_settings_color_space_label (853443689745584770) -->
<skip />
- <!-- no translation found for hideybar_confirmation_message_long (7117692795163620626) -->
+ <!-- no translation found for ssl_ca_cert_warning (9005954106902053641) -->
<skip />
</resources>
diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml
index 42e2d48..606aff1 100644
--- a/packages/SystemUI/res/values-ro/strings.xml
+++ b/packages/SystemUI/res/values-ro/strings.xml
@@ -61,8 +61,6 @@
<string name="usb_debugging_always" msgid="303335496705863070">"Permiteţi întotdeauna de pe acest computer"</string>
<string name="compat_mode_on" msgid="6623839244840638213">"Zoom pt. a umple ecranul"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"ÃŽnt. pt. a umple ecranul"</string>
- <string name="compat_mode_help_header" msgid="7969493989397529910">"Zoom de compatibilitate"</string>
- <string name="compat_mode_help_body" msgid="4946726776359270040">"Atunci când o aplicaţie a fost concepută pentru un ecran mai mic, o comandă pentru mărire/micşorare va apărea alături de ceas."</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Se salv. captura de ecran..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Se salvează captura de ecran..."</string>
<string name="screenshot_saving_text" msgid="2419718443411738818">"Captura de ecran este salvată."</string>
@@ -78,6 +76,8 @@
<string name="accessibility_home" msgid="8217216074895377641">"Ecranul de pornire"</string>
<string name="accessibility_menu" msgid="316839303324695949">"Meniu"</string>
<string name="accessibility_recent" msgid="8571350598987952883">"Aplicaţii recente"</string>
+ <string name="accessibility_search_light" msgid="1103867596330271848">"Căutați"</string>
+ <string name="accessibility_camera_button" msgid="8064671582820358152">"Cameră foto"</string>
<string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Buton pentru comutarea metodei de introducere."</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Buton zoom pentru compatibilitate."</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Faceţi zoom de la o imagine mai mică la una mai mare."</string>
@@ -153,6 +153,7 @@
<string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"Baterie <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_airplane" msgid="4196876722090224753">"Mod Avion <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="5749054971341882340">"Bluetooth <xliff:g id="STATE">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_location" msgid="4577282329866813100">"Locație: <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"Alarmă setată pentru <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"Datele 2G-3G au fost dezactivate"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"Datele 4G au fost dezactivate"</string>
@@ -164,12 +165,13 @@
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Wi-Fi conectat"</string>
<string name="gps_notification_searching_text" msgid="8574247005642736060">"Se caută GPS"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"Locaţie setată prin GPS"</string>
+ <string name="accessibility_location_active" msgid="2427290146138169014">"Solicitări locație active"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"Ștergeţi toate notificările."</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Informaţii despre aplicaţie"</string>
<string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Ecranul se va roti în mod automat."</string>
<string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Ecranul este blocat în orientarea de tip peisaj."</string>
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Ecranul este blocat în orientarea de tip portret."</string>
- <string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
+ <string name="dessert_case" msgid="1295161776223959221">"Vitrina cu dulciuri"</string>
<string name="start_dreams" msgid="7219575858348719790">"Daydream"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
<string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Mod Avion"</string>
@@ -182,10 +184,8 @@
<string name="quick_settings_rotation_unlocked_label" msgid="336054930362580584">"Rotire automată"</string>
<string name="quick_settings_rotation_locked_label" msgid="8058646447242565486">"Rotire blocată"</string>
<string name="quick_settings_ime_label" msgid="7073463064369468429">"Metodă de introducere"</string>
- <!-- no translation found for quick_settings_location_label (5011327048748762257) -->
- <skip />
- <!-- no translation found for quick_settings_location_off_label (7464544086507331459) -->
- <skip />
+ <string name="quick_settings_location_label" msgid="5011327048748762257">"Locație"</string>
+ <string name="quick_settings_location_off_label" msgid="7464544086507331459">"Localizarea este dezactivată"</string>
<string name="quick_settings_media_device_label" msgid="1302906836372603762">"Dispozitiv media"</string>
<string name="quick_settings_rssi_label" msgid="7725671335550695589">"RSSI"</string>
<string name="quick_settings_rssi_emergency_only" msgid="2713774041672886750">"Numai apeluri de urgenţă"</string>
@@ -200,8 +200,8 @@
<string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Ecran wireless"</string>
<string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Luminozitate"</string>
<string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTOMAT"</string>
- <string name="status_bar_help_title" msgid="1199237744086469217">"Notificările se afişează aici"</string>
- <string name="status_bar_help_text" msgid="7874607155052076323">"Accesaţi-le oricând glisând în jos.\nGlisaţi în jos din nou pentru comenzile sistemului."</string>
- <string name="hideybar_confirmation_message" msgid="9050869548951044371">"Glisați dinspre marginea ecranului pentru a afișa bara"</string>
- <string name="hideybar_confirmation_message_long" msgid="7117692795163620626">"Glisați dinspre marginea ecranului pentru a afișa bara de sistem"</string>
+ <string name="quick_settings_inversion_label" msgid="1666358784283020762">"Mod de inversare a culorilor"</string>
+ <string name="quick_settings_contrast_label" msgid="3319507551689108692">"Mod contrast îmbunătățit"</string>
+ <string name="quick_settings_color_space_label" msgid="853443689745584770">"Mod de corectare a culorilor"</string>
+ <string name="ssl_ca_cert_warning" msgid="9005954106902053641">"Rețeaua poate\nfi monitorizată"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml
index 233fee8..7f7198b 100644
--- a/packages/SystemUI/res/values-ru/strings.xml
+++ b/packages/SystemUI/res/values-ru/strings.xml
@@ -61,8 +61,6 @@
<string name="usb_debugging_always" msgid="303335496705863070">"Ð’Ñегда разрешать отладку Ñ Ñтого компьютера"</string>
<string name="compat_mode_on" msgid="6623839244840638213">"Подогнать по размерам Ñкрана"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"РаÑÑ‚Ñнуть на веÑÑŒ Ñкран"</string>
- <string name="compat_mode_help_header" msgid="7969493989397529910">"МаÑштаб и ÑовмеÑтимоÑть"</string>
- <string name="compat_mode_help_body" msgid="4946726776359270040">"ЕÑли приложение раÑÑчитано на Ñкран меньших размеров, Ñ€Ñдом Ñ Ñ‡Ð°Ñами поÑвÑÑ‚ÑÑ ÑредÑтва маÑштабированиÑ."</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Сохранение..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Сохранение..."</string>
<string name="screenshot_saving_text" msgid="2419718443411738818">"Сохранение..."</string>
@@ -78,6 +76,8 @@
<string name="accessibility_home" msgid="8217216074895377641">"Домой"</string>
<string name="accessibility_menu" msgid="316839303324695949">"Меню"</string>
<string name="accessibility_recent" msgid="8571350598987952883">"Ðедавние приложениÑ"</string>
+ <string name="accessibility_search_light" msgid="1103867596330271848">"ПоиÑк"</string>
+ <string name="accessibility_camera_button" msgid="8064671582820358152">"Камера"</string>
<string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Кнопка Ð¿ÐµÑ€ÐµÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ ÑпоÑоба ввода."</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Кнопка маÑÑˆÑ‚Ð°Ð±Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ (режим ÑовмеÑтимоÑти)"</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Уменьшение Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð´Ð»Ñ ÑƒÐ²ÐµÐ»Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ñвободного меÑта на Ñкране."</string>
@@ -155,6 +155,7 @@
<string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"БатареÑ: <xliff:g id="STATE">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_airplane" msgid="4196876722090224753">"Режим полета <xliff:g id="STATE">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_bluetooth" msgid="5749054971341882340">"Bluetooth <xliff:g id="STATE">%s</xliff:g>"</string>
+ <string name="accessibility_quick_settings_location" msgid="4577282329866813100">"ДоÑтуп к геоданным <xliff:g id="STATE">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"Будильник уÑтановлен на <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"Передача данных по каналам 2G и 3G отключена"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"Передача данных по каналу 4G отключена"</string>
@@ -166,12 +167,13 @@
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Wi-Fi подключено"</string>
<string name="gps_notification_searching_text" msgid="8574247005642736060">"ПоиÑк GPS"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"Координаты по GPS"</string>
+ <string name="accessibility_location_active" msgid="2427290146138169014">"ЕÑть активные запроÑÑ‹ на определение меÑтоположениÑ"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"Удалить вÑе уведомлениÑ"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"О приложении"</string>
<string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Экран будет поворачиватьÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки."</string>
<string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Выбрана только Ð°Ð»ÑŒÐ±Ð¾Ð¼Ð½Ð°Ñ Ð¾Ñ€Ð¸ÐµÐ½Ñ‚Ð°Ñ†Ð¸Ñ Ñкрана."</string>
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Выбрана только ÐºÐ½Ð¸Ð¶Ð½Ð°Ñ Ð¾Ñ€Ð¸ÐµÐ½Ñ‚Ð°Ñ†Ð¸Ñ Ñкрана."</string>
- <string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
+ <string name="dessert_case" msgid="1295161776223959221">"Коробка Ñо ÑладоÑÑ‚Ñми"</string>
<string name="start_dreams" msgid="7219575858348719790">"ЗаÑтавка"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
<string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Режим полета"</string>
@@ -186,10 +188,8 @@
<string name="quick_settings_rotation_unlocked_label" msgid="336054930362580584">"Ðвтоповорот"</string>
<string name="quick_settings_rotation_locked_label" msgid="8058646447242565486">"Ðвтоповорот выкл."</string>
<string name="quick_settings_ime_label" msgid="7073463064369468429">"СпоÑоб ввода"</string>
- <!-- no translation found for quick_settings_location_label (5011327048748762257) -->
- <skip />
- <!-- no translation found for quick_settings_location_off_label (7464544086507331459) -->
- <skip />
+ <string name="quick_settings_location_label" msgid="5011327048748762257">"Передача геоданных"</string>
+ <string name="quick_settings_location_off_label" msgid="7464544086507331459">"МеÑтоположение выкл."</string>
<string name="quick_settings_media_device_label" msgid="1302906836372603762">"Режим медиа"</string>
<string name="quick_settings_rssi_label" msgid="7725671335550695589">"RSSI"</string>
<string name="quick_settings_rssi_emergency_only" msgid="2713774041672886750">"ЭкÑтр. вызов"</string>
@@ -204,8 +204,8 @@
<string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Wi-Fi-монитор"</string>
<string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"ЯркоÑть"</string>
<string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"ÐВТОÐÐСТРОЙКÐ"</string>
- <string name="status_bar_help_title" msgid="1199237744086469217">"Это панель уведомлений"</string>
- <string name="status_bar_help_text" msgid="7874607155052076323">"Ее можно открыть, пролиÑтнув Ñкран вниз.\nЧтобы открыть наÑтройки, проведите пальцем вниз ещё раз."</string>
- <string name="hideybar_confirmation_message" msgid="9050869548951044371">"Чтобы открыть панель, проведите пальцем от ÐºÑ€Ð°Ñ Ðº центру Ñкрана"</string>
- <string name="hideybar_confirmation_message_long" msgid="7117692795163620626">"Чтобы открыть панель навигации, проведите пальцем от ÐºÑ€Ð°Ñ Ðº центру Ñкрана"</string>
+ <string name="quick_settings_inversion_label" msgid="1666358784283020762">"ИнверÑÐ¸Ñ Ñ†Ð²ÐµÑ‚Ð°"</string>
+ <string name="quick_settings_contrast_label" msgid="3319507551689108692">"КонтраÑтноÑть"</string>
+ <string name="quick_settings_color_space_label" msgid="853443689745584770">"ÐšÐ¾Ñ€Ñ€ÐµÐºÑ†Ð¸Ñ Ñ†Ð²ÐµÑ‚Ð°"</string>
+ <string name="ssl_ca_cert_warning" msgid="9005954106902053641">"ДейÑÑ‚Ð²Ð¸Ñ Ð² Ñети\nмогут отÑлеживатьÑÑ"</string>
</resources>
diff --git a/packages/SystemUI/res/values-si-land/strings.xml b/packages/SystemUI/res/values-si-land/strings.xml
new file mode 100644
index 0000000..b5aba2a
--- /dev/null
+++ b/packages/SystemUI/res/values-si-land/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2010, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="toast_rotation_locked" msgid="7609673011431556092">"තිරය දà·à¶±à·Š තිරස් දිà·à·à¶±à¶­à·’ය අගුළු දම෠ඇත."</string>
+</resources>
diff --git a/packages/SystemUI/res/values-si-rLK-land/strings.xml b/packages/SystemUI/res/values-si-rLK-land/strings.xml
new file mode 100644
index 0000000..b5aba2a
--- /dev/null
+++ b/packages/SystemUI/res/values-si-rLK-land/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2010, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="toast_rotation_locked" msgid="7609673011431556092">"තිරය දà·à¶±à·Š තිරස් දිà·à·à¶±à¶­à·’ය අගුළු දම෠ඇත."</string>
+</resources>
diff --git a/packages/SystemUI/res/values-si-rLK/strings.xml b/packages/SystemUI/res/values-si-rLK/strings.xml
new file mode 100644
index 0000000..24accd1
--- /dev/null
+++ b/packages/SystemUI/res/values-si-rLK/strings.xml
@@ -0,0 +1,206 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="7164937344850004466">"පද්ධති UI"</string>
+ <string name="status_bar_clear_all_button" msgid="7774721344716731603">"හිස් කරන්න"</string>
+ <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"à¶½à·à¶ºà·’ස්තුවෙන් ඉවත් කරන්න"</string>
+ <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"යෙදුම් තොරතුරු"</string>
+ <string name="status_bar_no_recent_apps" msgid="6576392951053994640">"මෑත à¶‹à¶´à·à¶‚à¶œ à¶±à·à¶­"</string>
+ <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"මෑත යෙදුම් ඉවතලන්න"</string>
+ <plurals name="status_bar_accessibility_recent_apps">
+ <item quantity="one" msgid="5854176083865845541">"මෑත යෙදුම් 1 ක්"</item>
+ <item quantity="other" msgid="1040784359794890744">"මෑත යෙදුම් %d ක්"</item>
+ </plurals>
+ <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"දà·à¶±à·”ම්දීම් à¶±à·à¶­"</string>
+ <string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"දà·à¶±à¶§ පවතින"</string>
+ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"දà·à¶±à·”ම්දීම්"</string>
+ <string name="battery_low_title" msgid="2783104807551211639">"à¶…à¶»à·à¶´à¶šà¶ºà¶§ සම්බන්ධ කරන්න"</string>
+ <string name="battery_low_subtitle" msgid="1752040062087829196">"à¶¶à·à¶§à¶»à·’ය à¶…à¶©à·” වෙමින් පවතී."</string>
+ <string name="battery_low_percent_format" msgid="1077244949318261761">"<xliff:g id="NUMBER">%d%%</xliff:g> ක් ඉතිරියි"</string>
+ <string name="invalid_charger" msgid="4549105996740522523">"USB ආරà·à¶´à¶«à¶º සහය නොදක්වයි.\nසපයන ලද ආරà·à¶´à¶šà¶º පමණක් à¶·à·à·€à·’ත෠කරන්න."</string>
+ <string name="battery_low_why" msgid="7279169609518386372">"à¶¶à·à¶§à¶»à·’ à¶·à·à·€à·’තය"</string>
+ <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"à·ƒà·à¶šà·ƒà·“ම්"</string>
+ <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
+ <string name="status_bar_settings_airplane" msgid="4879879698500955300">"අහස්යà·à¶±à· ආකà·à¶»à¶º"</string>
+ <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"ස්වයංක්â€à¶»à·“යව-à¶·à·Šâ€à¶»à¶¸à¶«à¶º වන තිරය"</string>
+ <string name="status_bar_settings_mute_label" msgid="554682549917429396">"නිà·à·Šà·à¶¶à·Šà¶¯ කරන්න"</string>
+ <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"ස්වයංක්â€à¶»à·“ය"</string>
+ <string name="status_bar_settings_notifications" msgid="397146176280905137">"දà·à¶±à·”ම්දීම්"</string>
+ <string name="bluetooth_tethered" msgid="7094101612161133267">"බ්ලූටූත් ටෙදර් à¶šà¶»à·"</string>
+ <string name="status_bar_input_method_settings_configure_input_methods" msgid="3504292471512317827">"ආදà·à¶± à¶šà·Šâ€à¶»à¶¸ සකසන්න"</string>
+ <string name="status_bar_use_physical_keyboard" msgid="7551903084416057810">"භෞතික යතුරු පුවරුව"</string>
+ <string name="usb_device_permission_prompt" msgid="834698001271562057">"USB à¶‹à¶´à·à¶‚ගය à¶´à·Šâ€à¶»à·€à·šà· කිරීමට <xliff:g id="APPLICATION">%1$s</xliff:g> යෙදුමට අවසර දෙනවà·à¶¯?"</string>
+ <string name="usb_accessory_permission_prompt" msgid="5171775411178865750">"USB මෙවලම à¶´à·Šâ€à¶»à·€à·šà· කිරීමට <xliff:g id="APPLICATION">%1$s</xliff:g> යෙදුමට අවසර දෙනවà·à¶¯?"</string>
+ <string name="usb_device_confirm_prompt" msgid="5161205258635253206">"මෙම USB à¶‹à¶´à·à¶‚ගය සම්බන්ධ විට <xliff:g id="ACTIVITY">%1$s</xliff:g> විවෘත කරන්නද?"</string>
+ <string name="usb_accessory_confirm_prompt" msgid="3808984931830229888">"මෙම USB මෙවලමට සම්බන්ධ වී ඇති විට <xliff:g id="ACTIVITY">%1$s</xliff:g> විවෘත කරන්නද?"</string>
+ <string name="usb_accessory_uri_prompt" msgid="513450621413733343">"මෙම USB මෙවලම සමග à¶šà·Šâ€à¶»à·’ය෠කරන ස්ථà·à¶´à·’à¶­ යෙදුම් නොමà·à¶­. <xliff:g id="URL">%1$s</xliff:g> වලින් මෙම මෙවලම à¶œà·à¶± à¶­à·€ දà·à¶±à¶œà¶±à·Šà¶±"</string>
+ <string name="title_usb_accessory" msgid="4966265263465181372">"USB මෙවලම"</string>
+ <string name="label_view" msgid="6304565553218192990">"පෙනුම"</string>
+ <string name="always_use_device" msgid="1450287437017315906">"මෙම USB à¶‹à¶´à·à¶‚ගය සඳහ෠සුපුරුද්දෙන් à¶·à·à·€à·’ත෠කරන්න"</string>
+ <string name="always_use_accessory" msgid="1210954576979621596">"මේ USB මෙවලම සඳහ෠සුපුරුද්දෙන් à¶·à·à·€à·’ත෠කරන්න."</string>
+ <string name="usb_debugging_title" msgid="4513918393387141949">"USB නිදොස්කරණයට අවසර දෙනවද?"</string>
+ <string name="usb_debugging_message" msgid="2220143855912376496">"මෙම පරිගණකයේ RSA යතුරු ඇඟිලි සටහන වන්නේ:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
+ <string name="usb_debugging_always" msgid="303335496705863070">"à·ƒà·à¶¸ විටම මෙම පරිගණකයෙන් ඉඩ ලබ෠දෙන්න"</string>
+ <string name="compat_mode_on" msgid="6623839244840638213">"තිරය පිරවීමට විà·à·à¶½à¶±à¶º කරන්න"</string>
+ <string name="compat_mode_off" msgid="4434467572461327898">"තිරය පිරවීමට අදින්න"</string>
+ <string name="screenshot_saving_ticker" msgid="7403652894056693515">"තිර රුව සුරකිමින්…"</string>
+ <string name="screenshot_saving_title" msgid="8242282144535555697">"à¶­à·’à¶» රුව සුරà·à¶šà·™à¶¸à·’න් පවතී…"</string>
+ <string name="screenshot_saving_text" msgid="2419718443411738818">"à¶­à·’à¶» රුව සුරà·à¶šà·™à¶¸à·’න් පවතී."</string>
+ <string name="screenshot_saved_title" msgid="6461865960961414961">"à¶­à·’à¶» රුව ග්â€à¶»à·„ණය කරන ලදි."</string>
+ <string name="screenshot_saved_text" msgid="1152839647677558815">"ඔබගේ à¶­à·’à¶» රුව à¶¶à·à¶½à·“මට ස්පර්෠කරන්න."</string>
+ <string name="screenshot_failed_title" msgid="705781116746922771">"à¶­à·’à¶» රුව ග්â€à¶»à·„ණය කිරීමට නොහà·à¶šà·’ විය."</string>
+ <string name="screenshot_failed_text" msgid="8134011269572415402">"à¶­à·’à¶» රුව සුරà·à¶šà·“මට නොහà·à¶šà·’ විය. ආචයනය à¶·à·à·€à·’à¶­à·à·€à·š තිබෙනව෠විය à·„à·à¶š."</string>
+ <string name="usb_preference_title" msgid="6551050377388882787">"USB ගොනු හුවමà·à¶»à·” විකල්ප"</string>
+ <string name="use_mtp_button_title" msgid="4333504413563023626">"මධ්â€à¶º à¶°à·à·€à¶šà¶ºà¶šà·Š (MTP) ලෙස සවි කරන්න"</string>
+ <string name="use_ptp_button_title" msgid="7517127540301625751">"à¶šà·à¶¸à¶»à·à·€à¶šà·Š (PTP) ලෙස සවි කරන්න"</string>
+ <string name="installer_cd_button_title" msgid="2312667578562201583">"Mac සඳහ෠Android ගොනු හුවමà·à¶»à·” යෙදුම ස්ථà·à¶´à¶±à¶º කරන්න"</string>
+ <string name="accessibility_back" msgid="567011538994429120">"ආපසු"</string>
+ <string name="accessibility_home" msgid="8217216074895377641">"මුල් පිටුව"</string>
+ <string name="accessibility_menu" msgid="316839303324695949">"මෙනුව"</string>
+ <string name="accessibility_recent" msgid="8571350598987952883">"මෑත යෙදුම්"</string>
+ <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"ආදà·à¶± à¶šà·Šâ€à¶»à¶¸à¶º මà·à¶»à·” කිරීමේ බොත්තම."</string>
+ <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"à¶œà·à·…පෙන විà·à·à¶½à¶± බොත්තම."</string>
+ <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"විà·à·à¶½ තිරය වෙත කුඩà·à·€ විà·à·à¶½à¶±à¶º කරන්න."</string>
+ <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"බ්ලූටූත් සම්බන්ධිතයි."</string>
+ <string name="accessibility_bluetooth_disconnected" msgid="7416648669976870175">"බ්ලූටූත් විසන්ධි කර ඇත."</string>
+ <string name="accessibility_no_battery" msgid="358343022352820946">"à¶¶à·à¶§à¶»à·’ය à¶±à·à¶­."</string>
+ <string name="accessibility_battery_one_bar" msgid="7774887721891057523">"à¶¶à·à¶§à¶»à·’ය තීරු එකයි."</string>
+ <string name="accessibility_battery_two_bars" msgid="8500650438735009973">"à¶¶à·à¶§à¶»à·’ය තීරු දෙකයි."</string>
+ <string name="accessibility_battery_three_bars" msgid="2302983330865040446">"à¶¶à·à¶§à¶»à·’ය තීරු තුනයි."</string>
+ <string name="accessibility_battery_full" msgid="8909122401720158582">"à¶¶à·à¶§à¶»à·’ය පිරී ඇත."</string>
+ <string name="accessibility_no_phone" msgid="4894708937052611281">"දුරකථනයක් à¶±à·à¶­."</string>
+ <string name="accessibility_phone_one_bar" msgid="687699278132664115">"දුරකථනය තීරු එකයි."</string>
+ <string name="accessibility_phone_two_bars" msgid="8384905382804815201">"දුරකථනය තීරු දෙකයි."</string>
+ <string name="accessibility_phone_three_bars" msgid="8521904843919971885">"දුරකථනය තීරු තුනයි."</string>
+ <string name="accessibility_phone_signal_full" msgid="6471834868580757898">"දුරකථනයේ සංඥà·à·€ පිරී ඇත."</string>
+ <string name="accessibility_no_data" msgid="4791966295096867555">"දත්ත à¶±à·à¶­."</string>
+ <string name="accessibility_data_one_bar" msgid="1415625833238273628">"දත්ත තීරු එකයි."</string>
+ <string name="accessibility_data_two_bars" msgid="6166018492360432091">"දත්ත තීරු 2."</string>
+ <string name="accessibility_data_three_bars" msgid="9167670452395038520">"දත්ත තීරු 3."</string>
+ <string name="accessibility_data_signal_full" msgid="2708384608124519369">"දත්ත සංඥà·à·€ පිරී ඇත."</string>
+ <string name="accessibility_wifi_off" msgid="3177380296697933627">"Wifi à¶…à¶šà·Šâ€à¶»à·’යයි."</string>
+ <string name="accessibility_no_wifi" msgid="1425476551827924474">"Wifi සම්බන්ධ à¶šà¶» නොමà·à¶­."</string>
+ <string name="accessibility_wifi_one_bar" msgid="7735893178010724377">"Wifi තීරු එකයි."</string>
+ <string name="accessibility_wifi_two_bars" msgid="4994274250497262434">"Wifi තීරු දෙකයි."</string>
+ <string name="accessibility_wifi_three_bars" msgid="3495755044276588384">"WiFi තීරු තුනයි."</string>
+ <string name="accessibility_wifi_signal_full" msgid="6853561303586480376">"Wifi සංඥà·à·€ පිරී ඇත."</string>
+ <string name="accessibility_no_wimax" msgid="4329180129727630368">"WiMAX à¶±à·à¶­."</string>
+ <string name="accessibility_wimax_one_bar" msgid="4170994299011863648">"WiMAX තීරු එකයි."</string>
+ <string name="accessibility_wimax_two_bars" msgid="9176236858336502288">"WiMAX තීරු දෙකයි."</string>
+ <string name="accessibility_wimax_three_bars" msgid="6116551636752103927">"WiMAX තීරු තුනයි."</string>
+ <string name="accessibility_wimax_signal_full" msgid="2768089986795579558">"WiMAX සංඥà·à·€ පිරී ඇත."</string>
+ <string name="accessibility_no_signal" msgid="7064645320782585167">"සංඥ෠නà·à¶­."</string>
+ <string name="accessibility_not_connected" msgid="6395326276213402883">"සම්බන්ධ වී à¶±à·à¶­."</string>
+ <string name="accessibility_zero_bars" msgid="3806060224467027887">"තීරු à·à·”න්â€à¶ºà¶ºà·’."</string>
+ <string name="accessibility_one_bar" msgid="1685730113192081895">"තීරු එක."</string>
+ <string name="accessibility_two_bars" msgid="6437363648385206679">"තීරු දෙකයි."</string>
+ <string name="accessibility_three_bars" msgid="2648241415119396648">"තීරු තුනයි."</string>
+ <string name="accessibility_signal_full" msgid="9122922886519676839">"සංඥà·à·€ පිරී ඇත."</string>
+ <string name="accessibility_desc_on" msgid="2385254693624345265">"සක්â€à¶»à·“යයි."</string>
+ <string name="accessibility_desc_off" msgid="6475508157786853157">"à¶…à¶šà·Šâ€à¶»à·’ය කරන්න."</string>
+ <string name="accessibility_desc_connected" msgid="8366256693719499665">"සම්බන්ධිතයි."</string>
+ <string name="accessibility_data_connection_gprs" msgid="1606477224486747751">"GPRS"</string>
+ <string name="accessibility_data_connection_1x" msgid="994133468120244018">"1 X"</string>
+ <string name="accessibility_data_connection_hspa" msgid="2032328855462645198">"HSPA"</string>
+ <string name="accessibility_data_connection_3g" msgid="8628562305003568260">"3G"</string>
+ <string name="accessibility_data_connection_3.5g" msgid="8664845609981692001">"3.5G"</string>
+ <string name="accessibility_data_connection_4g" msgid="7741000750630089612">"4G"</string>
+ <string name="accessibility_data_connection_lte" msgid="5413468808637540658">"LTE"</string>
+ <string name="accessibility_data_connection_cdma" msgid="6132648193978823023">"CDMA"</string>
+ <string name="accessibility_data_connection_roaming" msgid="5977362333466556094">"à¶»à·à¶¸à·’à¶‚"</string>
+ <string name="accessibility_data_connection_edge" msgid="4477457051631979278">"Edge"</string>
+ <string name="accessibility_data_connection_wifi" msgid="2324496756590645221">"Wi-Fi"</string>
+ <string name="accessibility_no_sim" msgid="8274017118472455155">"SIM à¶±à·à¶­."</string>
+ <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"බ්ලූටූත් ටෙදරින්."</string>
+ <string name="accessibility_airplane_mode" msgid="834748999790763092">"අහස්යà·à¶±à· ආකà·à¶»à¶º."</string>
+ <string name="accessibility_battery_level" msgid="7451474187113371965">"à¶¶à·à¶§à¶»à·’ à¶´à·Šâ€à¶»à¶­à·’à·à¶­à¶º <xliff:g id="NUMBER">%d</xliff:g>"</string>
+ <string name="accessibility_settings_button" msgid="799583911231893380">"පද්ධති à·ƒà·à¶šà·ƒà·“ම්."</string>
+ <string name="accessibility_notifications_button" msgid="4498000369779421892">"දà·à¶±à·”ම්දීම්."</string>
+ <string name="accessibility_remove_notification" msgid="3603099514902182350">"දà·à¶±à·”ම්දීම හිස් කරන්න."</string>
+ <string name="accessibility_gps_enabled" msgid="3511469499240123019">"GPS සබල කර ඇත."</string>
+ <string name="accessibility_gps_acquiring" msgid="8959333351058967158">"GPS ලබ෠ගනිමින්."</string>
+ <string name="accessibility_tty_enabled" msgid="4613200365379426561">"TeleTypewriter à¶šà·Šâ€à¶»à·’යà·à¶­à·Šà¶¸à¶šà¶ºà·’."</string>
+ <string name="accessibility_ringer_vibrate" msgid="666585363364155055">"හඬ නඟනය කම්පනය වේ."</string>
+ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"හඬ නඟනය නිà·à·Šà·à¶¶à·Šà¶¯à¶ºà·’."</string>
+ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> අස් කර ඇත."</string>
+ <string name="accessibility_notification_dismissed" msgid="854211387186306927">"දà·à¶±à·”ම්දීම නිෂ්ප්â€à¶»à¶·à· කරඇත."</string>
+ <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"දà·à¶±à·”ම්දීම් ආවරණය."</string>
+ <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"à¶šà·Šà·‚à¶«à·’à¶š à·ƒà·à¶šà·ƒà·“ම්."</string>
+ <string name="accessibility_desc_recent_apps" msgid="9014032916410590027">"මෑත à¶šà·à¶½à·“à¶± යෙදුම්."</string>
+ <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"පරිà·à·“ලකය෠<xliff:g id="USER">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_wifi" msgid="6099781031669728709">"<xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="NETWORK">%2$s</xliff:g>"</string>
+ <string name="accessibility_quick_settings_mobile" msgid="4876806564086241341">"ජංගම <xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="TYPE">%2$s</xliff:g>. <xliff:g id="NETWORK">%3$s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"à¶¶à·à¶§à¶»à·’ය <xliff:g id="STATE">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_airplane" msgid="4196876722090224753">"අහස්යà·à¶±à· ආකà·à¶»à¶º <xliff:g id="STATE">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_bluetooth" msgid="5749054971341882340">"බ්ලූටූත් <xliff:g id="STATE">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"<xliff:g id="TIME">%s</xliff:g> සඳහ෠සීනුව සකස් කර ඇත."</string>
+ <string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"2G-3G දත්ත අබල කර ඇත"</string>
+ <string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"4G දත්ත අබල කරන ලදි"</string>
+ <string name="data_usage_disabled_dialog_mobile_title" msgid="1046047248844821202">"ජංගම දත්ත අබල කර ඇත"</string>
+ <string name="data_usage_disabled_dialog_title" msgid="2086815304858964954">"දත්ත අබල කර ඇත"</string>
+ <string name="data_usage_disabled_dialog" msgid="3853117269051806280">"ඔබ නියමිත දත්ත à¶·à·à·€à·’à¶­ සීමà·à·€à¶§ ළඟ෠වී ඇත.\n\nඔබ දත්ත à¶±à·à·€à¶­ සබල කළහොත් à·€à·à·„කය෠ඔබගෙන් ඇතà·à¶¸à·Š විට අය කරගත à·„à·à¶š."</string>
+ <string name="data_usage_disabled_dialog_enable" msgid="7729772039208664606">"à¶±à·à·€à¶­ දත්ත සබල කරන්න"</string>
+ <string name="status_bar_settings_signal_meter_disconnected" msgid="1940231521274147771">"අන්තර්ජà·à¶½ සම්බන්ධතà·à·€à¶ºà¶šà·Š à¶±à·à¶­"</string>
+ <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Wi-Fi සම්බන්ධිතයි"</string>
+ <string name="gps_notification_searching_text" msgid="8574247005642736060">"GPS සඳහ෠සොයමින්"</string>
+ <string name="gps_notification_found_text" msgid="4619274244146446464">"GPS මඟින් ස්ථà·à¶±à¶º සකස෠ඇත"</string>
+ <string name="accessibility_location_active" msgid="2427290146138169014">"පිහිටීම් ඉල්ලීම් සක්â€à¶»à·’යයි"</string>
+ <string name="accessibility_clear_all" msgid="5235938559247164925">"සියලු දà·à¶±à·”ම්දීම් හිස් කරන්න."</string>
+ <string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"යෙදුම් තොරතුරු"</string>
+ <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"තිරය ස්වයංක්â€à¶»à·“යව කරකà·à·€à·š."</string>
+ <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"තිරය තිරස් දිà·à·à¶±à¶­à·’යෙහි අගුළු දම෠ඇත."</string>
+ <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"තිරය සිරස් දිà·à·à¶±à¶­à·’ය තුළ අගුළු à·€à·à¶§à·“ ඇත."</string>
+ <string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
+ <string name="start_dreams" msgid="7219575858348719790">"දවල් හීනය"</string>
+ <string name="ethernet_label" msgid="7967563676324087464">"ඊතර නෙට්"</string>
+ <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"අහස්යà·à¶±à· ආකà·à¶»à¶º"</string>
+ <string name="quick_settings_battery_charging_label" msgid="490074774465309209">"ආරà·à¶´à¶«à¶º වෙමින්, <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+ <string name="quick_settings_battery_charged_label" msgid="8865413079414246081">"à¶…à¶»à·à¶´à·’තයි"</string>
+ <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"බ්ලූටූත්"</string>
+ <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"බ්ලූටූත් (à¶‹à¶´à·à¶‚à¶œ <xliff:g id="NUMBER">%d</xliff:g>)"</string>
+ <string name="quick_settings_bluetooth_off_label" msgid="8159652146149219937">"බ්ලූටූත් à¶…à¶šà·Šâ€à¶»à·’යයි"</string>
+ <string name="quick_settings_brightness_label" msgid="6968372297018755815">"දීප්තිය"</string>
+ <string name="quick_settings_rotation_unlocked_label" msgid="336054930362580584">"ස්වයංක්â€à¶»à·“ය කරකà·à·€à·“ම"</string>
+ <string name="quick_settings_rotation_locked_label" msgid="8058646447242565486">"à¶·à·Šâ€à¶»à¶¸à¶«à¶º අගුළු දම෠ඇත"</string>
+ <string name="quick_settings_ime_label" msgid="7073463064369468429">"ආදà·à¶± à¶šà·Šâ€à¶»à¶¸à¶º"</string>
+ <string name="quick_settings_location_label" msgid="5011327048748762257">"ස්ථà·à¶±à¶º"</string>
+ <string name="quick_settings_location_off_label" msgid="7464544086507331459">"ස්ථà·à¶±à¶º à¶…à¶šà·Šâ€à¶»à·’යයි"</string>
+ <string name="quick_settings_media_device_label" msgid="1302906836372603762">"මà·à¶°à·Šâ€à¶º à¶‹à¶´à·à¶‚ගය"</string>
+ <string name="quick_settings_rssi_label" msgid="7725671335550695589">"RSSI"</string>
+ <string name="quick_settings_rssi_emergency_only" msgid="2713774041672886750">"හදිසි ඇමතුම් පමණි"</string>
+ <string name="quick_settings_settings_label" msgid="5326556592578065401">"à·ƒà·à¶šà·ƒà·“ම්"</string>
+ <string name="quick_settings_time_label" msgid="4635969182239736408">"වේලà·à·€"</string>
+ <string name="quick_settings_user_label" msgid="5238995632130897840">"මම"</string>
+ <string name="quick_settings_wifi_label" msgid="9135344704899546041">"Wi-Fi"</string>
+ <string name="quick_settings_wifi_not_connected" msgid="7171904845345573431">"සම්බන්ධ වී නොමà·à¶­"</string>
+ <string name="quick_settings_wifi_no_network" msgid="2221993077220856376">"à¶¢à·à¶½à¶ºà¶šà·Š à¶±à·à¶­"</string>
+ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi à¶…à¶šà·Šâ€à¶»à·’යයි"</string>
+ <string name="quick_settings_wifi_display_label" msgid="6893592964463624333">"Wi-Fi සංදර්à·à¶šà¶º"</string>
+ <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"නොරà·à·„à·à¶±à·Š සංදර්à·à¶šà¶º"</string>
+ <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"දීප්තිමත් බව"</string>
+ <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"ස්වයංක්â€à¶»à·“ය"</string>
+ <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"ඇතà·à¶¸à·Š විට à¶¢à·à¶½à¶º නිරීක්ෂණය විය à·„à·à¶š"</string>
+ <string name="done_button" msgid="1759387181766603361">"හරි"</string>
+ <string name="ssl_ca_cert_dialog_title" msgid="1273796967092027291">"à¶¢à·à¶½ නිරීක්ෂණය කිරීම"</string>
+ <string name="ssl_ca_cert_info_message" msgid="5430320539555358452">"මෙම à¶‹à¶´à·à¶‚ගය කළමනà·à¶šà¶»à¶«à¶º කරනුයේ: <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>.\n\nඔබගේ පරිපà·à¶½à¶šà¶ºà· à¶Š-à¶­à·à¶´à·à¶½à·Š, යෙදුම්, සහ ආරක්â€à·‚à·’à¶­ වෙබ් අඩවි ඇතුළුව ඔබගේ à¶¢à·à¶½ à¶šà·Šâ€à¶»à·’යà·à¶šà·à¶»à¶šà¶¸à·Š නිරීක්ෂණය කිරීමට à·„à·à¶šà·’යà·à·€ ඇත.\n\nà·€à·à¶©à·’ විස්තර සඳහà·, ඔබේ පරිපà·à¶½à¶šà¶ºà· සම්බන්ධ කරගන්න."</string>
+ <string name="ssl_ca_cert_warning_message" msgid="2033091656129963669">"තුන්වන à¶´à·à¶»à·Šà·à·€à¶ºà¶šà¶§ ඔබගේ à¶¢à·à¶½à¶º නිරීක්ෂණය කිරීමට à·„à·à¶šà·’යà·à·€ ඇත\nà¶šà·Šâ€à¶»à·’යà·à¶šà·à¶»à¶šà¶¸à·Š, à¶Š-à¶­à·à¶´à·à¶½à·Š, යෙදුම් සහ ආරක්â€à·‚à·’à¶­ වෙබ් අඩවි ඇතුළුව.\n\nඔබගේ à¶‹à¶´à·à¶‚ගය මත ස්ථà·à¶´à·’à¶­ විà·à·Šà·€à·à·ƒà¶¯à¶ºà·“ à¶…à¶šà·Šà¶­à¶´à¶­à·Šâ€à¶» මෙය සිදුවීමේ à·„à·à¶šà·’යà·à·€ ඇතිකරයි."</string>
+ <string name="ssl_ca_cert_settings_button" msgid="7946956977377166709">"විà·à·Šà·€à·à·ƒà¶¯à·à¶ºà·“ à¶…à¶šà·Šà¶­à¶´à¶­à·Šâ€à¶» පරික්ෂ෠කරන්න"</string>
+</resources>
diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml
new file mode 100644
index 0000000..f28cd16
--- /dev/null
+++ b/packages/SystemUI/res/values-si/strings.xml
@@ -0,0 +1,204 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="7164937344850004466">"පද්ධති UI"</string>
+ <string name="status_bar_clear_all_button" msgid="7774721344716731603">"හිස් කරන්න"</string>
+ <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"à¶½à·à¶ºà·’ස්තුවෙන් ඉවත් කරන්න"</string>
+ <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"යෙදුම් තොරතුරු"</string>
+ <string name="status_bar_no_recent_apps" msgid="6576392951053994640">"මෑත à¶‹à¶´à·à¶‚à¶œ à¶±à·à¶­"</string>
+ <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"මෑත යෙදුම් ඉවතලන්න"</string>
+ <plurals name="status_bar_accessibility_recent_apps">
+ <item quantity="one" msgid="5854176083865845541">"මෑත යෙදුම් 1 ක්"</item>
+ <item quantity="other" msgid="1040784359794890744">"මෑත යෙදුම් %d ක්"</item>
+ </plurals>
+ <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"දà·à¶±à·”ම්දීම් à¶±à·à¶­"</string>
+ <string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"දà·à¶±à¶§ පවතින"</string>
+ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"දà·à¶±à·”ම්දීම්"</string>
+ <string name="battery_low_title" msgid="2783104807551211639">"à¶…à¶»à·à¶´à¶šà¶ºà¶§ සම්බන්ධ කරන්න"</string>
+ <string name="battery_low_subtitle" msgid="1752040062087829196">"à¶¶à·à¶§à¶»à·’ය à¶…à¶©à·” වෙමින් පවතී."</string>
+ <string name="battery_low_percent_format" msgid="1077244949318261761">"<xliff:g id="NUMBER">%d%%</xliff:g> ක් ඉතිරියි"</string>
+ <string name="invalid_charger" msgid="4549105996740522523">"USB ආරà·à¶´à¶«à¶º සහය නොදක්වයි.\nසපයන ලද ආරà·à¶´à¶šà¶º පමණක් à¶·à·à·€à·’ත෠කරන්න."</string>
+ <string name="battery_low_why" msgid="7279169609518386372">"à¶¶à·à¶§à¶»à·’ à¶·à·à·€à·’තය"</string>
+ <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"à·ƒà·à¶šà·ƒà·“ම්"</string>
+ <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
+ <string name="status_bar_settings_airplane" msgid="4879879698500955300">"අහස්යà·à¶±à· ආකà·à¶»à¶º"</string>
+ <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"ස්වයංක්â€à¶»à·“යව-à¶·à·Šâ€à¶»à¶¸à¶«à¶º වන තිරය"</string>
+ <string name="status_bar_settings_mute_label" msgid="554682549917429396">"නිà·à·Šà·à¶¶à·Šà¶¯ කරන්න"</string>
+ <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"ස්වයංක්â€à¶»à·“ය"</string>
+ <string name="status_bar_settings_notifications" msgid="397146176280905137">"දà·à¶±à·”ම්දීම්"</string>
+ <string name="bluetooth_tethered" msgid="7094101612161133267">"බ්ලූටූත් ටෙදර් à¶šà¶»à·"</string>
+ <string name="status_bar_input_method_settings_configure_input_methods" msgid="3504292471512317827">"ආදà·à¶± à¶šà·Šâ€à¶»à¶¸ සකසන්න"</string>
+ <string name="status_bar_use_physical_keyboard" msgid="7551903084416057810">"භෞතික යතුරු පුවරුව"</string>
+ <string name="usb_device_permission_prompt" msgid="834698001271562057">"USB à¶‹à¶´à·à¶‚ගය à¶´à·Šâ€à¶»à·€à·šà· කිරීමට <xliff:g id="APPLICATION">%1$s</xliff:g> යෙදුමට අවසර දෙනවà·à¶¯?"</string>
+ <string name="usb_accessory_permission_prompt" msgid="5171775411178865750">"USB මෙවලම à¶´à·Šâ€à¶»à·€à·šà· කිරීමට <xliff:g id="APPLICATION">%1$s</xliff:g> යෙදුමට අවසර දෙනවà·à¶¯?"</string>
+ <string name="usb_device_confirm_prompt" msgid="5161205258635253206">"මෙම USB à¶‹à¶´à·à¶‚ගය සම්බන්ධ විට <xliff:g id="ACTIVITY">%1$s</xliff:g> විවෘත කරන්නද?"</string>
+ <string name="usb_accessory_confirm_prompt" msgid="3808984931830229888">"මෙම USB මෙවලමට සම්බන්ධ වී ඇති විට <xliff:g id="ACTIVITY">%1$s</xliff:g> විවෘත කරන්නද?"</string>
+ <string name="usb_accessory_uri_prompt" msgid="513450621413733343">"මෙම USB මෙවලම සමග à¶šà·Šâ€à¶»à·’ය෠කරන ස්ථà·à¶´à·’à¶­ යෙදුම් නොමà·à¶­. <xliff:g id="URL">%1$s</xliff:g> වලින් මෙම මෙවලම à¶œà·à¶± à¶­à·€ දà·à¶±à¶œà¶±à·Šà¶±"</string>
+ <string name="title_usb_accessory" msgid="4966265263465181372">"USB මෙවලම"</string>
+ <string name="label_view" msgid="6304565553218192990">"පෙනුම"</string>
+ <string name="always_use_device" msgid="1450287437017315906">"මෙම USB à¶‹à¶´à·à¶‚ගය සඳහ෠සුපුරුද්දෙන් à¶·à·à·€à·’ත෠කරන්න"</string>
+ <string name="always_use_accessory" msgid="1210954576979621596">"මේ USB මෙවලම සඳහ෠සුපුරුද්දෙන් à¶·à·à·€à·’ත෠කරන්න."</string>
+ <string name="usb_debugging_title" msgid="4513918393387141949">"USB නිදොස්කරණයට අවසර දෙනවද?"</string>
+ <string name="usb_debugging_message" msgid="2220143855912376496">"මෙම පරිගණකයේ RSA යතුරු ඇඟිලි සටහන වන්නේ:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
+ <string name="usb_debugging_always" msgid="303335496705863070">"à·ƒà·à¶¸ විටම මෙම පරිගණකයෙන් ඉඩ ලබ෠දෙන්න"</string>
+ <string name="compat_mode_on" msgid="6623839244840638213">"තිරය පිරවීමට විà·à·à¶½à¶±à¶º කරන්න"</string>
+ <string name="compat_mode_off" msgid="4434467572461327898">"තිරය පිරවීමට අදින්න"</string>
+ <string name="compat_mode_help_header" msgid="7969493989397529910">"à¶œà·à·…පෙන විà·à·à¶½à¶±à¶º"</string>
+ <string name="compat_mode_help_body" msgid="4946726776359270040">"කුඩ෠තිරයක් සඳහ෠යෙදුමක් නිර්මà·à¶«à¶º à¶šà·… විට, විà·à·à¶½à¶±à¶º à¶´à·à¶½à¶šà¶º ඔරලà·à·ƒà·”à·€ ළඟින් පෙන්වයි."</string>
+ <string name="screenshot_saving_ticker" msgid="7403652894056693515">"තිර රුව සුරකිමින්…"</string>
+ <string name="screenshot_saving_title" msgid="8242282144535555697">"à¶­à·’à¶» රුව සුරà·à¶šà·™à¶¸à·’න් පවතී…"</string>
+ <string name="screenshot_saving_text" msgid="2419718443411738818">"à¶­à·’à¶» රුව සුරà·à¶šà·™à¶¸à·’න් පවතී."</string>
+ <string name="screenshot_saved_title" msgid="6461865960961414961">"à¶­à·’à¶» රුව ග්â€à¶»à·„ණය කරන ලදි."</string>
+ <string name="screenshot_saved_text" msgid="1152839647677558815">"ඔබගේ à¶­à·’à¶» රුව à¶¶à·à¶½à·“මට ස්පර්෠කරන්න."</string>
+ <string name="screenshot_failed_title" msgid="705781116746922771">"à¶­à·’à¶» රුව ග්â€à¶»à·„ණය කිරීමට නොහà·à¶šà·’ විය."</string>
+ <string name="screenshot_failed_text" msgid="8134011269572415402">"à¶­à·’à¶» රුව සුරà·à¶šà·“මට නොහà·à¶šà·’ විය. ආචයනය à¶·à·à·€à·’à¶­à·à·€à·š තිබෙනව෠විය à·„à·à¶š."</string>
+ <string name="usb_preference_title" msgid="6551050377388882787">"USB ගොනු හුවමà·à¶»à·” විකල්ප"</string>
+ <string name="use_mtp_button_title" msgid="4333504413563023626">"මධ්â€à¶º à¶°à·à·€à¶šà¶ºà¶šà·Š (MTP) ලෙස සවි කරන්න"</string>
+ <string name="use_ptp_button_title" msgid="7517127540301625751">"à¶šà·à¶¸à¶»à·à·€à¶šà·Š (PTP) ලෙස සවි කරන්න"</string>
+ <string name="installer_cd_button_title" msgid="2312667578562201583">"Mac සඳහ෠Android ගොනු හුවමà·à¶»à·” යෙදුම ස්ථà·à¶´à¶±à¶º කරන්න"</string>
+ <string name="accessibility_back" msgid="567011538994429120">"ආපසු"</string>
+ <string name="accessibility_home" msgid="8217216074895377641">"මුල් පිටුව"</string>
+ <string name="accessibility_menu" msgid="316839303324695949">"මෙනුව"</string>
+ <string name="accessibility_recent" msgid="8571350598987952883">"මෑත යෙදුම්"</string>
+ <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"ආදà·à¶± à¶šà·Šâ€à¶»à¶¸à¶º මà·à¶»à·” කිරීමේ බොත්තම."</string>
+ <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"à¶œà·à·…පෙන විà·à·à¶½à¶± බොත්තම."</string>
+ <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"විà·à·à¶½ තිරය වෙත කුඩà·à·€ විà·à·à¶½à¶±à¶º කරන්න."</string>
+ <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"බ්ලූටූත් සම්බන්ධිතයි."</string>
+ <string name="accessibility_bluetooth_disconnected" msgid="7416648669976870175">"බ්ලූටූත් විසන්ධි කර ඇත."</string>
+ <string name="accessibility_no_battery" msgid="358343022352820946">"à¶¶à·à¶§à¶»à·’ය à¶±à·à¶­."</string>
+ <string name="accessibility_battery_one_bar" msgid="7774887721891057523">"à¶¶à·à¶§à¶»à·’ය තීරු එකයි."</string>
+ <string name="accessibility_battery_two_bars" msgid="8500650438735009973">"à¶¶à·à¶§à¶»à·’ය තීරු දෙකයි."</string>
+ <string name="accessibility_battery_three_bars" msgid="2302983330865040446">"à¶¶à·à¶§à¶»à·’ය තීරු තුනයි."</string>
+ <string name="accessibility_battery_full" msgid="8909122401720158582">"à¶¶à·à¶§à¶»à·’ය පිරී ඇත."</string>
+ <string name="accessibility_no_phone" msgid="4894708937052611281">"දුරකථනයක් à¶±à·à¶­."</string>
+ <string name="accessibility_phone_one_bar" msgid="687699278132664115">"දුරකථනය තීරු එකයි."</string>
+ <string name="accessibility_phone_two_bars" msgid="8384905382804815201">"දුරකථනය තීරු දෙකයි."</string>
+ <string name="accessibility_phone_three_bars" msgid="8521904843919971885">"දුරකථනය තීරු තුනයි."</string>
+ <string name="accessibility_phone_signal_full" msgid="6471834868580757898">"දුරකථනයේ සංඥà·à·€ පිරී ඇත."</string>
+ <string name="accessibility_no_data" msgid="4791966295096867555">"දත්ත à¶±à·à¶­."</string>
+ <string name="accessibility_data_one_bar" msgid="1415625833238273628">"දත්ත තීරු එකයි."</string>
+ <string name="accessibility_data_two_bars" msgid="6166018492360432091">"දත්ත තීරු 2."</string>
+ <string name="accessibility_data_three_bars" msgid="9167670452395038520">"දත්ත තීරු 3."</string>
+ <string name="accessibility_data_signal_full" msgid="2708384608124519369">"දත්ත සංඥà·à·€ පිරී ඇත."</string>
+ <string name="accessibility_wifi_off" msgid="3177380296697933627">"Wifi à¶…à¶šà·Šâ€à¶»à·’යයි."</string>
+ <string name="accessibility_no_wifi" msgid="1425476551827924474">"Wifi සම්බන්ධ à¶šà¶» නොමà·à¶­."</string>
+ <string name="accessibility_wifi_one_bar" msgid="7735893178010724377">"Wifi තීරු එකයි."</string>
+ <string name="accessibility_wifi_two_bars" msgid="4994274250497262434">"Wifi තීරු දෙකයි."</string>
+ <string name="accessibility_wifi_three_bars" msgid="3495755044276588384">"WiFi තීරු තුනයි."</string>
+ <string name="accessibility_wifi_signal_full" msgid="6853561303586480376">"Wifi සංඥà·à·€ පිරී ඇත."</string>
+ <string name="accessibility_no_wimax" msgid="4329180129727630368">"WiMAX à¶±à·à¶­."</string>
+ <string name="accessibility_wimax_one_bar" msgid="4170994299011863648">"WiMAX තීරු එකයි."</string>
+ <string name="accessibility_wimax_two_bars" msgid="9176236858336502288">"WiMAX තීරු දෙකයි."</string>
+ <string name="accessibility_wimax_three_bars" msgid="6116551636752103927">"WiMAX තීරු තුනයි."</string>
+ <string name="accessibility_wimax_signal_full" msgid="2768089986795579558">"WiMAX සංඥà·à·€ පිරී ඇත."</string>
+ <string name="accessibility_no_signal" msgid="7064645320782585167">"සංඥ෠නà·à¶­."</string>
+ <string name="accessibility_not_connected" msgid="6395326276213402883">"සම්බන්ධ වී à¶±à·à¶­."</string>
+ <string name="accessibility_zero_bars" msgid="3806060224467027887">"තීරු à·à·”න්â€à¶ºà¶ºà·’."</string>
+ <string name="accessibility_one_bar" msgid="1685730113192081895">"තීරු එක."</string>
+ <string name="accessibility_two_bars" msgid="6437363648385206679">"තීරු දෙකයි."</string>
+ <string name="accessibility_three_bars" msgid="2648241415119396648">"තීරු තුනයි."</string>
+ <string name="accessibility_signal_full" msgid="9122922886519676839">"සංඥà·à·€ පිරී ඇත."</string>
+ <string name="accessibility_desc_on" msgid="2385254693624345265">"සක්â€à¶»à·“යයි."</string>
+ <string name="accessibility_desc_off" msgid="6475508157786853157">"à¶…à¶šà·Šâ€à¶»à·’ය කරන්න."</string>
+ <string name="accessibility_desc_connected" msgid="8366256693719499665">"සම්බන්ධිතයි."</string>
+ <string name="accessibility_data_connection_gprs" msgid="1606477224486747751">"GPRS"</string>
+ <string name="accessibility_data_connection_1x" msgid="994133468120244018">"1 X"</string>
+ <string name="accessibility_data_connection_hspa" msgid="2032328855462645198">"HSPA"</string>
+ <string name="accessibility_data_connection_3g" msgid="8628562305003568260">"3G"</string>
+ <string name="accessibility_data_connection_3.5g" msgid="8664845609981692001">"3.5G"</string>
+ <string name="accessibility_data_connection_4g" msgid="7741000750630089612">"4G"</string>
+ <string name="accessibility_data_connection_lte" msgid="5413468808637540658">"LTE"</string>
+ <string name="accessibility_data_connection_cdma" msgid="6132648193978823023">"CDMA"</string>
+ <string name="accessibility_data_connection_roaming" msgid="5977362333466556094">"à¶»à·à¶¸à·’à¶‚"</string>
+ <string name="accessibility_data_connection_edge" msgid="4477457051631979278">"Edge"</string>
+ <string name="accessibility_data_connection_wifi" msgid="2324496756590645221">"Wi-Fi"</string>
+ <string name="accessibility_no_sim" msgid="8274017118472455155">"SIM à¶±à·à¶­."</string>
+ <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"බ්ලූටූත් ටෙදරින්."</string>
+ <string name="accessibility_airplane_mode" msgid="834748999790763092">"අහස්යà·à¶±à· ආකà·à¶»à¶º."</string>
+ <string name="accessibility_battery_level" msgid="7451474187113371965">"à¶¶à·à¶§à¶»à·’ à¶´à·Šâ€à¶»à¶­à·’à·à¶­à¶º <xliff:g id="NUMBER">%d</xliff:g>"</string>
+ <string name="accessibility_settings_button" msgid="799583911231893380">"පද්ධති à·ƒà·à¶šà·ƒà·“ම්."</string>
+ <string name="accessibility_notifications_button" msgid="4498000369779421892">"දà·à¶±à·”ම්දීම්."</string>
+ <string name="accessibility_remove_notification" msgid="3603099514902182350">"දà·à¶±à·”ම්දීම හිස් කරන්න."</string>
+ <string name="accessibility_gps_enabled" msgid="3511469499240123019">"GPS සබල කර ඇත."</string>
+ <string name="accessibility_gps_acquiring" msgid="8959333351058967158">"GPS ලබ෠ගනිමින්."</string>
+ <string name="accessibility_tty_enabled" msgid="4613200365379426561">"TeleTypewriter à¶šà·Šâ€à¶»à·’යà·à¶­à·Šà¶¸à¶šà¶ºà·’."</string>
+ <string name="accessibility_ringer_vibrate" msgid="666585363364155055">"හඬ නඟනය කම්පනය වේ."</string>
+ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"හඬ නඟනය නිà·à·Šà·à¶¶à·Šà¶¯à¶ºà·’."</string>
+ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> අස් කර ඇත."</string>
+ <string name="accessibility_notification_dismissed" msgid="854211387186306927">"දà·à¶±à·”ම්දීම නිෂ්ප්â€à¶»à¶·à· කරඇත."</string>
+ <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"දà·à¶±à·”ම්දීම් ආවරණය."</string>
+ <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"à¶šà·Šà·‚à¶«à·’à¶š à·ƒà·à¶šà·ƒà·“ම්."</string>
+ <string name="accessibility_desc_recent_apps" msgid="9014032916410590027">"මෑත à¶šà·à¶½à·“à¶± යෙදුම්."</string>
+ <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"පරිà·à·“ලකය෠<xliff:g id="USER">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_wifi" msgid="6099781031669728709">"<xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="NETWORK">%2$s</xliff:g>"</string>
+ <string name="accessibility_quick_settings_mobile" msgid="4876806564086241341">"ජංගම <xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="TYPE">%2$s</xliff:g>. <xliff:g id="NETWORK">%3$s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"à¶¶à·à¶§à¶»à·’ය <xliff:g id="STATE">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_airplane" msgid="4196876722090224753">"අහස්යà·à¶±à· ආකà·à¶»à¶º <xliff:g id="STATE">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_bluetooth" msgid="5749054971341882340">"බ්ලූටූත් <xliff:g id="STATE">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"<xliff:g id="TIME">%s</xliff:g> සඳහ෠සීනුව සකස් කර ඇත."</string>
+ <string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"2G-3G දත්ත අබල කර ඇත"</string>
+ <string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"4G දත්ත අබල කරන ලදි"</string>
+ <string name="data_usage_disabled_dialog_mobile_title" msgid="1046047248844821202">"ජංගම දත්ත අබල කර ඇත"</string>
+ <string name="data_usage_disabled_dialog_title" msgid="2086815304858964954">"දත්ත අබල කර ඇත"</string>
+ <string name="data_usage_disabled_dialog" msgid="3853117269051806280">"ඔබ නියමිත දත්ත à¶·à·à·€à·’à¶­ සීමà·à·€à¶§ ළඟ෠වී ඇත.\n\nඔබ දත්ත à¶±à·à·€à¶­ සබල කළහොත් à·€à·à·„කය෠ඔබගෙන් ඇතà·à¶¸à·Š විට අය කරගත à·„à·à¶š."</string>
+ <string name="data_usage_disabled_dialog_enable" msgid="7729772039208664606">"à¶±à·à·€à¶­ දත්ත සබල කරන්න"</string>
+ <string name="status_bar_settings_signal_meter_disconnected" msgid="1940231521274147771">"අන්තර්ජà·à¶½ සම්බන්ධතà·à·€à¶ºà¶šà·Š à¶±à·à¶­"</string>
+ <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Wi-Fi සම්බන්ධිතයි"</string>
+ <string name="gps_notification_searching_text" msgid="8574247005642736060">"GPS සඳහ෠සොයමින්"</string>
+ <string name="gps_notification_found_text" msgid="4619274244146446464">"GPS මඟින් ස්ථà·à¶±à¶º සකස෠ඇත"</string>
+ <string name="accessibility_location_active" msgid="2427290146138169014">"පිහිටීම් ඉල්ලීම් සක්â€à¶»à·’යයි"</string>
+ <string name="accessibility_clear_all" msgid="5235938559247164925">"සියලු දà·à¶±à·”ම්දීම් හිස් කරන්න."</string>
+ <string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"යෙදුම් තොරතුරු"</string>
+ <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"තිරය ස්වයංක්â€à¶»à·“යව කරකà·à·€à·š."</string>
+ <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"තිරය තිරස් දිà·à·à¶±à¶­à·’යෙහි අගුළු දම෠ඇත."</string>
+ <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"තිරය සිරස් දිà·à·à¶±à¶­à·’ය තුළ අගුළු à·€à·à¶§à·“ ඇත."</string>
+ <string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
+ <string name="start_dreams" msgid="7219575858348719790">"දවල් හීනය"</string>
+ <string name="ethernet_label" msgid="7967563676324087464">"ඊතර නෙට්"</string>
+ <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"අහස්යà·à¶±à· ආකà·à¶»à¶º"</string>
+ <string name="quick_settings_battery_charging_label" msgid="490074774465309209">"ආරà·à¶´à¶«à¶º වෙමින්, <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+ <string name="quick_settings_battery_charged_label" msgid="8865413079414246081">"à¶…à¶»à·à¶´à·’තයි"</string>
+ <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"බ්ලූටූත්"</string>
+ <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"බ්ලූටූත් (à¶‹à¶´à·à¶‚à¶œ <xliff:g id="NUMBER">%d</xliff:g>)"</string>
+ <string name="quick_settings_bluetooth_off_label" msgid="8159652146149219937">"බ්ලූටූත් à¶…à¶šà·Šâ€à¶»à·’යයි"</string>
+ <string name="quick_settings_brightness_label" msgid="6968372297018755815">"දීප්තිය"</string>
+ <string name="quick_settings_rotation_unlocked_label" msgid="336054930362580584">"ස්වයංක්â€à¶»à·“ය කරකà·à·€à·“ම"</string>
+ <string name="quick_settings_rotation_locked_label" msgid="8058646447242565486">"à¶·à·Šâ€à¶»à¶¸à¶«à¶º අගුළු දම෠ඇත"</string>
+ <string name="quick_settings_ime_label" msgid="7073463064369468429">"ආදà·à¶± à¶šà·Šâ€à¶»à¶¸à¶º"</string>
+ <string name="quick_settings_location_label" msgid="5011327048748762257">"ස්ථà·à¶±à¶º"</string>
+ <string name="quick_settings_location_off_label" msgid="7464544086507331459">"ස්ථà·à¶±à¶º à¶…à¶šà·Šâ€à¶»à·’යයි"</string>
+ <string name="quick_settings_media_device_label" msgid="1302906836372603762">"මà·à¶°à·Šâ€à¶º à¶‹à¶´à·à¶‚ගය"</string>
+ <string name="quick_settings_rssi_label" msgid="7725671335550695589">"RSSI"</string>
+ <string name="quick_settings_rssi_emergency_only" msgid="2713774041672886750">"හදිසි ඇමතුම් පමණි"</string>
+ <string name="quick_settings_settings_label" msgid="5326556592578065401">"à·ƒà·à¶šà·ƒà·“ම්"</string>
+ <string name="quick_settings_time_label" msgid="4635969182239736408">"වේලà·à·€"</string>
+ <string name="quick_settings_user_label" msgid="5238995632130897840">"මම"</string>
+ <string name="quick_settings_wifi_label" msgid="9135344704899546041">"Wi-Fi"</string>
+ <string name="quick_settings_wifi_not_connected" msgid="7171904845345573431">"සම්බන්ධ වී නොමà·à¶­"</string>
+ <string name="quick_settings_wifi_no_network" msgid="2221993077220856376">"à¶¢à·à¶½à¶ºà¶šà·Š à¶±à·à¶­"</string>
+ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi à¶…à¶šà·Šâ€à¶»à·’යයි"</string>
+ <string name="quick_settings_wifi_display_label" msgid="6893592964463624333">"Wi-Fi සංදර්à·à¶šà¶º"</string>
+ <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"නොරà·à·„à·à¶±à·Š සංදර්à·à¶šà¶º"</string>
+ <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"දීප්තිමත් බව"</string>
+ <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"ස්වයංක්â€à¶»à·“ය"</string>
+ <string name="status_bar_help_title" msgid="1199237744086469217">"දà·à¶±à·”ම්දීම් මෙතන පෙන්නුම් කරයි"</string>
+ <string name="status_bar_help_text" msgid="7874607155052076323">"පහලට සර්පණය කිරීමෙන් ඕනෑම වෙලà·à·€à¶š ඒව෠වෙත පිවිසෙන්න.\nපද්ධති à¶´à·à¶½à¶š සඳහ෠නà·à·€à¶­ à¶´à·„à·…à¶§ සර්පණය කරන්න."</string>
+</resources>
diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml
index c54540c..3996f77 100644
--- a/packages/SystemUI/res/values-sk/strings.xml
+++ b/packages/SystemUI/res/values-sk/strings.xml
@@ -61,8 +61,6 @@
<string name="usb_debugging_always" msgid="303335496705863070">"Vždy povoliÅ¥ z tohto poÄítaÄa"</string>
<string name="compat_mode_on" msgid="6623839244840638213">"Priblížiť na celú obrazovku"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Na celú obrazovku"</string>
- <string name="compat_mode_help_header" msgid="7969493989397529910">"Úprava veľkosti z dôvodu kompatibility"</string>
- <string name="compat_mode_help_body" msgid="4946726776359270040">"Ak je aplikácia navrhnutá pre menšiu obrazovku, zobrazí sa vedľa hodín ovládací prvok priblíženia."</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Prebieha ukladanie snímky obrazovky..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Prebieha ukladanie snímky obrazovky..."</string>
<string name="screenshot_saving_text" msgid="2419718443411738818">"Snímka obrazovky sa ukladá."</string>
@@ -78,6 +76,8 @@
<string name="accessibility_home" msgid="8217216074895377641">"Plocha"</string>
<string name="accessibility_menu" msgid="316839303324695949">"Menu"</string>
<string name="accessibility_recent" msgid="8571350598987952883">"Nové aplikácie"</string>
+ <string name="accessibility_search_light" msgid="1103867596330271848">"Hľadať"</string>
+ <string name="accessibility_camera_button" msgid="8064671582820358152">"Fotoaparát"</string>
<string name="accessibility_ime_switch_button" msgid="5032926134740456424">"TlaÄidlo prepnutia metódy vstupu."</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"TlaÄidlo úpravy veľkosti z dôvodu kompatibility."</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"ZväÄÅ¡iÅ¥ menší obrázok na väÄÅ¡iu obrazovku."</string>
@@ -155,6 +155,7 @@
<string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"Batéria: <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_airplane" msgid="4196876722090224753">"Režim V lietadle: <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="5749054971341882340">"Bluetooth: <xliff:g id="STATE">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_location" msgid="4577282329866813100">"Poloha: <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"Budík nastavený na <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"Dátové prenosy 2G a 3G sú zakázané"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"Dátové prenosy 4G sú zakázané"</string>
@@ -166,12 +167,13 @@
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Wi-Fi: pripojené"</string>
<string name="gps_notification_searching_text" msgid="8574247005642736060">"Vyhľadávanie satelitov GPS"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"Poloha nastavená pomocou GPS"</string>
+ <string name="accessibility_location_active" msgid="2427290146138169014">"Žiadosti o polohu sú aktívne"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"Vymazať všetky upozornenia."</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Informácie o aplikácii"</string>
<string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Obrazovka sa automaticky otoÄí."</string>
<string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Obrazovka je uzamknutá v orientácii na šírku."</string>
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Obrazovka je uzamknutá v orientácii na výšku."</string>
- <string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
+ <string name="dessert_case" msgid="1295161776223959221">"Pult s dezertami"</string>
<string name="start_dreams" msgid="7219575858348719790">"Å etriÄ obrazovky"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
<string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Režim V lietadle"</string>
@@ -200,8 +202,8 @@
<string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Bezdrôtový displej"</string>
<string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Jas"</string>
<string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTOMATICKY"</string>
- <string name="status_bar_help_title" msgid="1199237744086469217">"Tu sa zobrazujú upozornenia"</string>
- <string name="status_bar_help_text" msgid="7874607155052076323">"Môžete ich kedykoľvek zobraziť tak, že posuniete prstom nadol.\nAk posuniete prstom nadol ešte raz, zobrazia sa ovládacie prvky systému."</string>
- <string name="hideybar_confirmation_message" msgid="9050869548951044371">"Panel zobrazíte posunutím cez okraj obrazovky"</string>
- <string name="hideybar_confirmation_message_long" msgid="7117692795163620626">"Systémový panel zobrazíte posunutím cez okraj obrazovky"</string>
+ <string name="quick_settings_inversion_label" msgid="1666358784283020762">"Režim prevrátenia farieb"</string>
+ <string name="quick_settings_contrast_label" msgid="3319507551689108692">"Režim zvýšeného kontrastu"</string>
+ <string name="quick_settings_color_space_label" msgid="853443689745584770">"Režim korekcie farieb"</string>
+ <string name="ssl_ca_cert_warning" msgid="9005954106902053641">"Sieť môže byť\nmonitorovaná"</string>
</resources>
diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml
index 3fc4882..637b5b9 100644
--- a/packages/SystemUI/res/values-sl/strings.xml
+++ b/packages/SystemUI/res/values-sl/strings.xml
@@ -61,8 +61,6 @@
<string name="usb_debugging_always" msgid="303335496705863070">"Vedno dovoli iz tega raÄunalnika"</string>
<string name="compat_mode_on" msgid="6623839244840638213">"PoveÄava Äez cel zaslon"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Raztegnitev Äez zaslon"</string>
- <string name="compat_mode_help_header" msgid="7969493989397529910">"Razširitev združljivosti"</string>
- <string name="compat_mode_help_body" msgid="4946726776359270040">"ÄŒe je program izdelan za manjÅ¡e zaslone, se ob uri pokaže kontrolnik za poveÄavo."</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Shranjev. posnetka zaslona ..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Shranjevanje posnetka zaslona ..."</string>
<string name="screenshot_saving_text" msgid="2419718443411738818">"Shranjevanje posnetka zaslona."</string>
@@ -78,6 +76,8 @@
<string name="accessibility_home" msgid="8217216074895377641">"ZaÄetni zaslon"</string>
<string name="accessibility_menu" msgid="316839303324695949">"Meni"</string>
<string name="accessibility_recent" msgid="8571350598987952883">"Nedavni programi"</string>
+ <string name="accessibility_search_light" msgid="1103867596330271848">"Iskanje"</string>
+ <string name="accessibility_camera_button" msgid="8064671582820358152">"Fotoaparat"</string>
<string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Gumb za preklop naÄina vnosa."</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Gumb poveÄave za združljivost."</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"PoveÄava manjÅ¡ega na veÄji zaslon."</string>
@@ -153,6 +153,7 @@
<string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"Baterija: <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_airplane" msgid="4196876722090224753">"Letalski naÄin: <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="5749054971341882340">"Bluetooth: <xliff:g id="STATE">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_location" msgid="4577282329866813100">"Lokacija: <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"Alarm je nastavljen na <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"Podatki 2G-3G so onemogoÄeni"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"Podatki 4G so onemogoÄeni"</string>
@@ -164,12 +165,13 @@
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Wi-Fi povezan"</string>
<string name="gps_notification_searching_text" msgid="8574247005642736060">"Iskanje GPS-a"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"Lokacija nastavljena z GPS-om"</string>
+ <string name="accessibility_location_active" msgid="2427290146138169014">"Aktivne zahteve za lokacijo"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"Izbriši vsa obvestila."</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Podatki o aplikaciji"</string>
<string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Zaslon se bo samodejno zasukal."</string>
<string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Zaslon je zaklenjen v ležeÄi usmerjenosti."</string>
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Zaslon je zaklenjen v pokonÄni usmerjenosti."</string>
- <string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
+ <string name="dessert_case" msgid="1295161776223959221">"Vitrina za sladice"</string>
<string name="start_dreams" msgid="7219575858348719790">"Sanjarjenje"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
<string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"NaÄin za letalo"</string>
@@ -198,8 +200,8 @@
<string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Prikaz brezžiÄnih naprav"</string>
<string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Svetlost"</string>
<string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"SAMODEJNO"</string>
- <string name="status_bar_help_title" msgid="1199237744086469217">"Obvestila so prikazana tukaj"</string>
- <string name="status_bar_help_text" msgid="7874607155052076323">"Do njih lahko kadar koli dostopate tako, da povleÄete navzdol.\nZa prikaz sistemskih kontrolnikov znova povlecite navzdol."</string>
- <string name="hideybar_confirmation_message" msgid="9050869548951044371">"Vrstico prikažete tako, da povleÄete z roba zaslona"</string>
- <string name="hideybar_confirmation_message_long" msgid="7117692795163620626">"Sistemsko vrstico prikažete tako, da povleÄete z roba zaslona"</string>
+ <string name="quick_settings_inversion_label" msgid="1666358784283020762">"NaÄin inverzije barv"</string>
+ <string name="quick_settings_contrast_label" msgid="3319507551689108692">"NaÄin izboljÅ¡anega kontrasta"</string>
+ <string name="quick_settings_color_space_label" msgid="853443689745584770">"NaÄin popravljanja barv"</string>
+ <string name="ssl_ca_cert_warning" msgid="9005954106902053641">"Omrežje je\nlahko spremljano"</string>
</resources>
diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml
index 7ba2da5..42fd7ac 100644
--- a/packages/SystemUI/res/values-sr/strings.xml
+++ b/packages/SystemUI/res/values-sr/strings.xml
@@ -61,8 +61,6 @@
<string name="usb_debugging_always" msgid="303335496705863070">"Увек дозволи Ñа овог рачунара"</string>
<string name="compat_mode_on" msgid="6623839244840638213">"Зумирај на целом екрану"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Развуци на цео екран"</string>
- <string name="compat_mode_help_header" msgid="7969493989397529910">"Компатибилно зумирање"</string>
- <string name="compat_mode_help_body" msgid="4946726776359270040">"Када је апликација намењена мањем екрану, контрола зумирања приказује Ñе поред Ñата."</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Чување Ñнимка екрана..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Чување Ñнимка екрана..."</string>
<string name="screenshot_saving_text" msgid="2419718443411738818">"Снимак екрана Ñе чува."</string>
@@ -78,6 +76,8 @@
<string name="accessibility_home" msgid="8217216074895377641">"Почетна"</string>
<string name="accessibility_menu" msgid="316839303324695949">"Мени"</string>
<string name="accessibility_recent" msgid="8571350598987952883">"Ðедавне апликације"</string>
+ <string name="accessibility_search_light" msgid="1103867596330271848">"Претражите"</string>
+ <string name="accessibility_camera_button" msgid="8064671582820358152">"Камера"</string>
<string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Дугме Промени метод уноÑа."</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Дугме Зум компатибилноÑти."</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Зумирање Ñа мањег на већи екран."</string>
@@ -153,6 +153,7 @@
<string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"Батерија: <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_airplane" msgid="4196876722090224753">"Режим рада у авиону: <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="5749054971341882340">"Bluetooth: <xliff:g id="STATE">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_location" msgid="4577282329866813100">"Локација је <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"Ðларм је подешен за <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"2G–3G подаци Ñу онемогућени"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"4G подаци Ñу онемогућени"</string>
@@ -164,12 +165,13 @@
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Wi-Fi је повезан"</string>
<string name="gps_notification_searching_text" msgid="8574247005642736060">"Тражи Ñе GPS"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"Локацију је подеÑио GPS"</string>
+ <string name="accessibility_location_active" msgid="2427290146138169014">"Има активних захтева за локацију"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"Обриши Ñва обавештења."</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Информације о апликацији"</string>
<string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Екран ће Ñе аутоматÑки ротирати."</string>
<string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Екран је закључан у хоризонталном положају."</string>
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Екран је закључан у вертикалном положају."</string>
- <string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
+ <string name="dessert_case" msgid="1295161776223959221">"Витрина Ñа поÑлаÑтицама"</string>
<string name="start_dreams" msgid="7219575858348719790">"Сањарење"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Етернет"</string>
<string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Режим рада у авиону"</string>
@@ -198,8 +200,8 @@
<string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Бежични екран"</string>
<string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"ОÑветљеноÑÑ‚"</string>
<string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"ÐУТОМÐТСКÐ"</string>
- <string name="status_bar_help_title" msgid="1199237744086469217">"Обавештења Ñе појављују овде"</string>
- <string name="status_bar_help_text" msgid="7874607155052076323">"ПриÑтупите им у било ком тренутку лиÑтањем надоле.\nПоново лиÑтајте надоле да би Ñе приказале ÑиÑтемÑке контроле."</string>
- <string name="hideybar_confirmation_message" msgid="9050869548951044371">"Превуците по ивици екрана да би Ñе приказала трака"</string>
- <string name="hideybar_confirmation_message_long" msgid="7117692795163620626">"Превуците од ивице екрана да би Ñе приказала ÑиÑтемÑка трака"</string>
+ <string name="quick_settings_inversion_label" msgid="1666358784283020762">"Режим инверзије боје"</string>
+ <string name="quick_settings_contrast_label" msgid="3319507551689108692">"Режим унапређеног контраÑта"</string>
+ <string name="quick_settings_color_space_label" msgid="853443689745584770">"Режим корекције боје"</string>
+ <string name="ssl_ca_cert_warning" msgid="9005954106902053641">"Мрежа Ñе можда\nнадгледа"</string>
</resources>
diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml
index 022e2f2..558c5b4 100644
--- a/packages/SystemUI/res/values-sv/strings.xml
+++ b/packages/SystemUI/res/values-sv/strings.xml
@@ -61,8 +61,6 @@
<string name="usb_debugging_always" msgid="303335496705863070">"Tillåt alltid på den här datorn"</string>
<string name="compat_mode_on" msgid="6623839244840638213">"Zooma för att fylla skärm"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Dra för att fylla skärmen"</string>
- <string name="compat_mode_help_header" msgid="7969493989397529910">"Zoom i kompatibilitetsläge"</string>
- <string name="compat_mode_help_body" msgid="4946726776359270040">"När en app är anpassad för en mindre skärm visas ett zoomreglage vid klockan."</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Skärmdumpen sparas ..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Skärmdumpen sparas ..."</string>
<string name="screenshot_saving_text" msgid="2419718443411738818">"Skärmdumpen sparas."</string>
@@ -78,6 +76,8 @@
<string name="accessibility_home" msgid="8217216074895377641">"Startsida"</string>
<string name="accessibility_menu" msgid="316839303324695949">"Meny"</string>
<string name="accessibility_recent" msgid="8571350598987952883">"Senaste apparna"</string>
+ <string name="accessibility_search_light" msgid="1103867596330271848">"Sök"</string>
+ <string name="accessibility_camera_button" msgid="8064671582820358152">"Kamera"</string>
<string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Knapp för byte av inmatningsmetod."</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Knapp för kompatibilitetszoom."</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Zooma mindre skärm till större."</string>
@@ -153,6 +153,7 @@
<string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"Batteri <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_airplane" msgid="4196876722090224753">"Flygplansläge <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="5749054971341882340">"Bluetooth <xliff:g id="STATE">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_location" msgid="4577282329866813100">"Plats <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"Alarmet ringer <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"Data via 2G-3G har inaktiverats"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"Data via 4G har inaktiverats"</string>
@@ -164,12 +165,13 @@
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Wi-Fi-ansluten"</string>
<string name="gps_notification_searching_text" msgid="8574247005642736060">"Sökning efter GPS pågår"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"Platsen har identifierats av GPS"</string>
+ <string name="accessibility_location_active" msgid="2427290146138169014">"Det finns aktiva platsbegäranden"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"Ta bort alla meddelanden."</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Info om appen"</string>
<string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Skärmen roteras automatiskt."</string>
<string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Bildskärmens riktning är nu låst i liggande format."</string>
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Bildskärmens riktning är nu låst i stående format."</string>
- <string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
+ <string name="dessert_case" msgid="1295161776223959221">"Dessertdisken"</string>
<string name="start_dreams" msgid="7219575858348719790">"Dagdröm"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
<string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Flygplansläge"</string>
@@ -198,8 +200,8 @@
<string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Trådlös skärm"</string>
<string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Ljusstyrka"</string>
<string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTO"</string>
- <string name="status_bar_help_title" msgid="1199237744086469217">"Meddelanden visas här"</string>
- <string name="status_bar_help_text" msgid="7874607155052076323">"Du kommer åt dem när som helst genom att dra nedåt.\nDra nedåt igen om du vill visa systemkontroller."</string>
- <string name="hideybar_confirmation_message" msgid="9050869548951044371">"Dra från kanten av skärmen om du vill visa fältet"</string>
- <string name="hideybar_confirmation_message_long" msgid="7117692795163620626">"Dra från kanten av skärmen om du vill visa systemfältet"</string>
+ <string name="quick_settings_inversion_label" msgid="1666358784283020762">"Färginverteringsläge"</string>
+ <string name="quick_settings_contrast_label" msgid="3319507551689108692">"Kontrastförbättringsläge"</string>
+ <string name="quick_settings_color_space_label" msgid="853443689745584770">"Färgkorrigeringsläge"</string>
+ <string name="ssl_ca_cert_warning" msgid="9005954106902053641">"Nätverket kan\nvara övervakat"</string>
</resources>
diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml
index 27f556c..a548110 100644
--- a/packages/SystemUI/res/values-sw/strings.xml
+++ b/packages/SystemUI/res/values-sw/strings.xml
@@ -59,8 +59,6 @@
<string name="usb_debugging_always" msgid="303335496705863070">"Ruhusu kutoka kwenye kompyuta hii kila wakati"</string>
<string name="compat_mode_on" msgid="6623839244840638213">"Kuza ili kujaza skrini"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Tanua ili kujaza skrini"</string>
- <string name="compat_mode_help_header" msgid="7969493989397529910">"Kukuza kwa Utangamanifu"</string>
- <string name="compat_mode_help_body" msgid="4946726776359270040">"Wakati programu ilibuniwa kwa skrini ndogo, kidhibiti cha kukuza kitaonekana kwa saa."</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Inahifadhi picha ya skrini..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Inahifadhi picha ya skrini..."</string>
<string name="screenshot_saving_text" msgid="2419718443411738818">"Picha ya skrini inahifadhiwa"</string>
@@ -76,6 +74,8 @@
<string name="accessibility_home" msgid="8217216074895377641">"Nyumbani"</string>
<string name="accessibility_menu" msgid="316839303324695949">"Menyu"</string>
<string name="accessibility_recent" msgid="8571350598987952883">"Programu za hivi karibuni"</string>
+ <string name="accessibility_search_light" msgid="1103867596330271848">"Tafuta"</string>
+ <string name="accessibility_camera_button" msgid="8064671582820358152">"Kamera"</string>
<string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Swichi kitufe cha mbinu ingizi."</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Kichupo cha kukuza kwa utangamanifu"</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Kuza kidogo kwa skrini kubwa."</string>
@@ -130,7 +130,7 @@
<string name="accessibility_data_connection_wifi" msgid="2324496756590645221">"Wi-Fi"</string>
<string name="accessibility_no_sim" msgid="8274017118472455155">"Hakuna SIM."</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Shiriki intaneti kwa Bluetooth."</string>
- <string name="accessibility_airplane_mode" msgid="834748999790763092">"Modi ya ndege."</string>
+ <string name="accessibility_airplane_mode" msgid="834748999790763092">"Hali ya ndege."</string>
<string name="accessibility_battery_level" msgid="7451474187113371965">"Asilimia <xliff:g id="NUMBER">%d</xliff:g> ya betri"</string>
<string name="accessibility_settings_button" msgid="799583911231893380">"Mipangilio ya mfumo."</string>
<string name="accessibility_notifications_button" msgid="4498000369779421892">"Arifa."</string>
@@ -151,6 +151,7 @@
<string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"Betri <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_airplane" msgid="4196876722090224753">"Hali ya Ndege <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="5749054971341882340">"Bluetooth <xliff:g id="STATE">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_location" msgid="4577282329866813100">"Mahali <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"Kengele imewekwa <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"Data ya 2G-3G imelemazwa"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"Data ya 4G imelemazwa"</string>
@@ -162,15 +163,16 @@
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Mtandao-hewa umeunganishwa"</string>
<string name="gps_notification_searching_text" msgid="8574247005642736060">"Inatafuta GPS"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"Mahali pamewekwa na GPS"</string>
+ <string name="accessibility_location_active" msgid="2427290146138169014">"Maombi ya eneo yanatumika"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"Futa arifa zote."</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Taarifa ya programu"</string>
<string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Skrini itazunguka kiotomatiki."</string>
<string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Skrini imefungwa sasa katika uelekezo wa mandhari."</string>
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Skrini imefungwa katika uelekeo wa picha."</string>
- <string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
+ <string name="dessert_case" msgid="1295161776223959221">"Sanduku la Vitindamlo"</string>
<string name="start_dreams" msgid="7219575858348719790">"Hali Tulivu"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
- <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Modi ya ndege"</string>
+ <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Hali ya ndege"</string>
<string name="quick_settings_battery_charging_label" msgid="490074774465309209">"Inachaji, <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
<string name="quick_settings_battery_charged_label" msgid="8865413079414246081">"Imechajiwa"</string>
<string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string>
@@ -180,10 +182,8 @@
<string name="quick_settings_rotation_unlocked_label" msgid="336054930362580584">"Zungusha Otomatiki"</string>
<string name="quick_settings_rotation_locked_label" msgid="8058646447242565486">"Mzunguko Umefungwa"</string>
<string name="quick_settings_ime_label" msgid="7073463064369468429">"Mbinu ya uingizaji"</string>
- <!-- no translation found for quick_settings_location_label (5011327048748762257) -->
- <skip />
- <!-- no translation found for quick_settings_location_off_label (7464544086507331459) -->
- <skip />
+ <string name="quick_settings_location_label" msgid="5011327048748762257">"Kutambua Eneo"</string>
+ <string name="quick_settings_location_off_label" msgid="7464544086507331459">"Kitambua eneo kimezimwa"</string>
<string name="quick_settings_media_device_label" msgid="1302906836372603762">"Kifaa cha midia"</string>
<string name="quick_settings_rssi_label" msgid="7725671335550695589">"RSSI"</string>
<string name="quick_settings_rssi_emergency_only" msgid="2713774041672886750">"Simu za Dharura Pekee"</string>
@@ -198,8 +198,8 @@
<string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Uonyeshaji Pasiwaya"</string>
<string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Ung\'avu"</string>
<string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"KIOTOMATIKI"</string>
- <string name="status_bar_help_title" msgid="1199237744086469217">"Arifa zitaonekana hapa"</string>
- <string name="status_bar_help_text" msgid="7874607155052076323">"Zifikie wakati wowote kwa kutelezesha chini.\nTelezesha chini tena kupata vidhibiti vya mfumo."</string>
- <string name="hideybar_confirmation_message" msgid="9050869548951044371">"Papasa kwa kasi kutoka ukingo wa skrini ili kuonyesha upau"</string>
- <string name="hideybar_confirmation_message_long" msgid="7117692795163620626">"Papasa kwa kasi kutoka ukingo wa skrini ili kuonyesha upau wa mfumo"</string>
+ <string name="quick_settings_inversion_label" msgid="1666358784283020762">"Hali ya ugeuzaji kinyume wa rangi"</string>
+ <string name="quick_settings_contrast_label" msgid="3319507551689108692">"Hali ya utofautishaji ulioboreshwa"</string>
+ <string name="quick_settings_color_space_label" msgid="853443689745584770">"Hali ya kusahihisha rangi"</string>
+ <string name="ssl_ca_cert_warning" msgid="9005954106902053641">"Huenda mtandao\nunafuatiliwa"</string>
</resources>
diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml
index dc643c4..962fc7e 100644
--- a/packages/SystemUI/res/values-th/strings.xml
+++ b/packages/SystemUI/res/values-th/strings.xml
@@ -61,8 +61,6 @@
<string name="usb_debugging_always" msgid="303335496705863070">"อนุà¸à¸²à¸•จาà¸à¸„อมพิวเตอร์เครื่องนี้เสมอ"</string>
<string name="compat_mode_on" msgid="6623839244840638213">"ขยายจนเต็มหน้าจอ"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"ยืดจนเต็มหน้าจอ"</string>
- <string name="compat_mode_help_header" msgid="7969493989397529910">"ความเข้าà¸à¸±à¸™à¹„ด้ของà¸à¸²à¸£à¸¢à¹ˆà¸­/ขยาย"</string>
- <string name="compat_mode_help_body" msgid="4946726776359270040">"สำหรับà¹à¸­à¸›à¸žà¸¥à¸´à¹€à¸„ชันที่ออà¸à¹à¸šà¸šà¸¡à¸²à¸ªà¸³à¸«à¸£à¸±à¸šà¸«à¸™à¹‰à¸²à¸ˆà¸­à¸‚นาดเล็ภตัวควบคุมà¸à¸²à¸£à¸¢à¹ˆà¸­/ขยายจะปราà¸à¸à¸‚ึ้นข้างนาฬิà¸à¸²"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"à¸à¸³à¸¥à¸±à¸‡à¸šà¸±à¸™à¸—ึà¸à¸ à¸²à¸žà¸«à¸™à¹‰à¸²à¸ˆà¸­..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"à¸à¸³à¸¥à¸±à¸‡à¸šà¸±à¸™à¸—ึà¸à¸ à¸²à¸žà¸«à¸™à¹‰à¸²à¸ˆà¸­..."</string>
<string name="screenshot_saving_text" msgid="2419718443411738818">"à¸à¸³à¸¥à¸±à¸‡à¸šà¸±à¸™à¸—ึà¸à¸ à¸²à¸žà¸«à¸™à¹‰à¸²à¸ˆà¸­"</string>
@@ -78,6 +76,8 @@
<string name="accessibility_home" msgid="8217216074895377641">"หน้าà¹à¸£à¸"</string>
<string name="accessibility_menu" msgid="316839303324695949">"เมนู"</string>
<string name="accessibility_recent" msgid="8571350598987952883">"à¹à¸­à¸›à¸žà¸¥à¸´à¹€à¸„ชันล่าสุด"</string>
+ <string name="accessibility_search_light" msgid="1103867596330271848">"ค้นหา"</string>
+ <string name="accessibility_camera_button" msgid="8064671582820358152">"à¸à¸¥à¹‰à¸­à¸‡à¸–่ายรูป"</string>
<string name="accessibility_ime_switch_button" msgid="5032926134740456424">"ปุ่มสลับวิธีà¸à¸²à¸£à¸›à¹‰à¸­à¸™à¸‚้อมูล"</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"ปุ่มซูมที่ใช้งานร่วมà¸à¸±à¸™à¹„ด้"</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"ซูมหน้าจอให้มีขนาดใหà¸à¹ˆà¸‚ึ้น"</string>
@@ -153,6 +153,7 @@
<string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"à¹à¸šà¸•เตอรี่ <xliff:g id="STATE">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_airplane" msgid="4196876722090224753">"โหมดใช้งานบนเครื่องบิน <xliff:g id="STATE">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_bluetooth" msgid="5749054971341882340">"บลูทูธ <xliff:g id="STATE">%s</xliff:g>"</string>
+ <string name="accessibility_quick_settings_location" msgid="4577282329866813100">"สถานที่ <xliff:g id="STATE">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"ตั้งเวลาปลุà¸à¹„ว้ที่ <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"ปิดใช้งานข้อมูล 2G-3G à¹à¸¥à¹‰à¸§"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"ปิดใช้งานข้อมูล 4G à¹à¸¥à¹‰à¸§"</string>
@@ -164,12 +165,13 @@
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"เชื่อมต่อ WiFi à¹à¸¥à¹‰à¸§"</string>
<string name="gps_notification_searching_text" msgid="8574247005642736060">"à¸à¸³à¸¥à¸±à¸‡à¸„้นหา GPS"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"ตำà¹à¸«à¸™à¹ˆà¸‡à¸—ี่à¸à¸³à¸«à¸™à¸”โดย GPS"</string>
+ <string name="accessibility_location_active" msgid="2427290146138169014">"คำขอตำà¹à¸«à¸™à¹ˆà¸‡à¸—ี่มีà¸à¸²à¸£à¹ƒà¸Šà¹‰à¸‡à¸²à¸™"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"ล้างà¸à¸²à¸£à¹à¸ˆà¹‰à¸‡à¹€à¸•ือนทั้งหมด"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"ข้อมูลà¹à¸­à¸›"</string>
<string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"หน้าจอจะหมุนโดยอัตโนมัติ"</string>
<string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"ขณะนี้หน้าจอถูà¸à¸¥à¹‡à¸­à¸à¹ƒà¸«à¹‰à¸§à¸²à¸‡à¹ƒà¸™à¹à¸™à¸§à¸™à¸­à¸™"</string>
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"ขณะนี้หน้าจอถูà¸à¸¥à¹‡à¸­à¸à¹ƒà¸«à¹‰à¸§à¸²à¸‡à¹ƒà¸™à¹à¸™à¸§à¸•ั้ง"</string>
- <string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
+ <string name="dessert_case" msgid="1295161776223959221">"ชั้นà¹à¸ªà¸”งของหวาน"</string>
<string name="start_dreams" msgid="7219575858348719790">"Daydream"</string>
<string name="ethernet_label" msgid="7967563676324087464">"อีเทอร์เน็ต"</string>
<string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"โหมดใช้งานบนเครื่องบิน"</string>
@@ -198,8 +200,8 @@
<string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"จอà¹à¸ªà¸”งผลไร้สาย"</string>
<string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"ความสว่าง"</string>
<string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"อัตโนมัติ"</string>
- <string name="status_bar_help_title" msgid="1199237744086469217">"à¸à¸²à¸£à¹à¸ˆà¹‰à¸‡à¹€à¸•ือนจะà¹à¸ªà¸”งขึ้นที่นี่"</string>
- <string name="status_bar_help_text" msgid="7874607155052076323">"เข้าถึงได้ทุà¸à¹€à¸¡à¸·à¹ˆà¸­à¸”้วยà¸à¸²à¸£à¸à¸§à¸²à¸”นิ้วลง\nà¸à¸§à¸²à¸”นิ้วลงอีà¸à¸„รั้งสำหรับà¸à¸²à¸£à¸„วบคุมระบบ"</string>
- <string name="hideybar_confirmation_message" msgid="9050869548951044371">"à¸à¸§à¸²à¸”ขอบของหน้าจอเพื่อà¹à¸ªà¸”งà¹à¸–บ"</string>
- <string name="hideybar_confirmation_message_long" msgid="7117692795163620626">"à¸à¸§à¸²à¸”จาà¸à¸‚อบของหน้าจอเพื่อà¹à¸ªà¸”งà¹à¸–บระบบ"</string>
+ <string name="quick_settings_inversion_label" msgid="1666358784283020762">"โหมดà¸à¸²à¸£à¸à¸¥à¸±à¸šà¸ªà¸µ"</string>
+ <string name="quick_settings_contrast_label" msgid="3319507551689108692">"โหมดคอนทราสต์ที่ปรับปรุงà¹à¸¥à¹‰à¸§"</string>
+ <string name="quick_settings_color_space_label" msgid="853443689745584770">"โหมดà¸à¸²à¸£à¹à¸à¹‰à¹„ขสี"</string>
+ <string name="ssl_ca_cert_warning" msgid="9005954106902053641">"เครือข่ายอาจ\nถูà¸à¸•รวจสอบ"</string>
</resources>
diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml
index 0053be4..3de0f06 100644
--- a/packages/SystemUI/res/values-tl/strings.xml
+++ b/packages/SystemUI/res/values-tl/strings.xml
@@ -61,8 +61,6 @@
<string name="usb_debugging_always" msgid="303335496705863070">"Palaging payagan mula sa computer na ito"</string>
<string name="compat_mode_on" msgid="6623839244840638213">"I-zoom upang punan screen"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"I-stretch upang mapuno screen"</string>
- <string name="compat_mode_help_header" msgid="7969493989397529910">"Zoom sa pagiging Tugma"</string>
- <string name="compat_mode_help_body" msgid="4946726776359270040">"Kapag nakadisenyo ang isang app para sa mas maliit na screen, isang kontrol ng zoom ang lalabas sa may orasan."</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Sine-save ang screenshot…"</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Sine-save ang screenshot…"</string>
<string name="screenshot_saving_text" msgid="2419718443411738818">"Sine-save ang screenshot."</string>
@@ -78,6 +76,8 @@
<string name="accessibility_home" msgid="8217216074895377641">"Home"</string>
<string name="accessibility_menu" msgid="316839303324695949">"Menu"</string>
<string name="accessibility_recent" msgid="8571350598987952883">"Kamakailang apps"</string>
+ <string name="accessibility_search_light" msgid="1103867596330271848">"Hanapin"</string>
+ <string name="accessibility_camera_button" msgid="8064671582820358152">"Camera"</string>
<string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Ilipat ang button na pamamaraan ng pag-input."</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Button ng zoom ng pagiging tugma."</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Mag-zoom nang mas maliit sa mas malaking screen."</string>
@@ -153,6 +153,7 @@
<string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"<xliff:g id="STATE">%s</xliff:g> ng baterya."</string>
<string name="accessibility_quick_settings_airplane" msgid="4196876722090224753">"<xliff:g id="STATE">%s</xliff:g> ng Airplane Mode."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="5749054971341882340">"<xliff:g id="STATE">%s</xliff:g> ng Bluetooth."</string>
+ <string name="accessibility_quick_settings_location" msgid="4577282329866813100">"Lokasyon <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"Alarm set para sa <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"Di pinapagana ang 2G-3G na data"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"Hindi pinapagana ang 4G na data"</string>
@@ -164,12 +165,13 @@
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"nakakonekta ang Wi-Fi"</string>
<string name="gps_notification_searching_text" msgid="8574247005642736060">"Naghahanap ng GPS"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"Lokasyong itinatakda ng GPS"</string>
+ <string name="accessibility_location_active" msgid="2427290146138169014">"Aktibo ang mga kahilingan ng lokasyon"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"I-clear ang lahat ng notification."</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Impormasyon ng app"</string>
<string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Awtomatikong iikot ang screen."</string>
<string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Naka-lock ang screen sa pahigang oryentasyon."</string>
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Naka-lock ang screen sa patayong oryentasyon."</string>
- <string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
+ <string name="dessert_case" msgid="1295161776223959221">"Dessert Case"</string>
<string name="start_dreams" msgid="7219575858348719790">"Daydream"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
<string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Airplane mode"</string>
@@ -198,8 +200,8 @@
<string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Wireless Display"</string>
<string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Brightness"</string>
<string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTO"</string>
- <string name="status_bar_help_title" msgid="1199237744086469217">"Dito lumalabas ang mga notification"</string>
- <string name="status_bar_help_text" msgid="7874607155052076323">"I-access ang mga ito anumang oras sa pamamagitan ng pag-swipe pababa.\nMuling mag-swipe pababa para sa mga kontrol ng system."</string>
- <string name="hideybar_confirmation_message" msgid="9050869548951044371">"Mag-swipe sa gilid ng screen upang ipakita ang bar"</string>
- <string name="hideybar_confirmation_message_long" msgid="7117692795163620626">"Mag-swipe mula sa gilid ng screen upang ipakita ang system bar"</string>
+ <string name="quick_settings_inversion_label" msgid="1666358784283020762">"Mode ng pag-invert ng kulay"</string>
+ <string name="quick_settings_contrast_label" msgid="3319507551689108692">"Mode na dinagdagan ang contrast"</string>
+ <string name="quick_settings_color_space_label" msgid="853443689745584770">"Mode ng pagtatama ng kulay"</string>
+ <string name="ssl_ca_cert_warning" msgid="9005954106902053641">"Maaaring\nsinusubaybayan ang network"</string>
</resources>
diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml
index f39f8bc..9a68f38 100644
--- a/packages/SystemUI/res/values-tr/strings.xml
+++ b/packages/SystemUI/res/values-tr/strings.xml
@@ -61,8 +61,6 @@
<string name="usb_debugging_always" msgid="303335496705863070">"Bu bilgisayardan her zaman izin ver"</string>
<string name="compat_mode_on" msgid="6623839244840638213">"Yakınlaştır (ekranı kaplasın)"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Genişlet (ekran kapansın)"</string>
- <string name="compat_mode_help_header" msgid="7969493989397529910">"Uyumluluk yakınlaştırması"</string>
- <string name="compat_mode_help_body" msgid="4946726776359270040">"Uygulama küçük bir ekran için tasarlanmışsa saatin yanında bir yakınlaştırma denetimi görünür."</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Ekran görüntüsü kaydediliyor..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Ekran görüntüsü kaydediliyor..."</string>
<string name="screenshot_saving_text" msgid="2419718443411738818">"Ekran görüntüsü kaydediliyor."</string>
@@ -78,6 +76,8 @@
<string name="accessibility_home" msgid="8217216074895377641">"Ana sayfa"</string>
<string name="accessibility_menu" msgid="316839303324695949">"Menü"</string>
<string name="accessibility_recent" msgid="8571350598987952883">"Son uygulamalar"</string>
+ <string name="accessibility_search_light" msgid="1103867596330271848">"Ara"</string>
+ <string name="accessibility_camera_button" msgid="8064671582820358152">"Kamera"</string>
<string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Giriş yöntemini değiştirme düğmesi."</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Uyumluluk zum düğmesi."</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Daha büyük ekrana daha küçük yakınlaştır."</string>
@@ -153,6 +153,7 @@
<string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"Pil <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_airplane" msgid="4196876722090224753">"Uçak Modu <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="5749054971341882340">"Bluetooth <xliff:g id="STATE">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_location" msgid="4577282329866813100">"Konum: <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"Alarm saati: <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"2G-3G verileri devre dışı bırakıldı"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"4G verileri devre dışı"</string>
@@ -164,12 +165,13 @@
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Kablosuz bağlandı"</string>
<string name="gps_notification_searching_text" msgid="8574247005642736060">"GPS aranıyor"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"Konum GPS ile belirlendi"</string>
+ <string name="accessibility_location_active" msgid="2427290146138169014">"Konum bilgisi istekleri etkin"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"Tüm bildirimleri temizle"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Uygulama bilgileri"</string>
<string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Ekran otomatik olarak dönecektir."</string>
<string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Ekran yatay yönde kilitlendi."</string>
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Ekran dikey yönde kilitlendi."</string>
- <string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
+ <string name="dessert_case" msgid="1295161776223959221">"Tatlı Kutusu"</string>
<string name="start_dreams" msgid="7219575858348719790">"Hafif uyku"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
<string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Uçak modu"</string>
@@ -182,10 +184,8 @@
<string name="quick_settings_rotation_unlocked_label" msgid="336054930362580584">"Otomatik Döndür"</string>
<string name="quick_settings_rotation_locked_label" msgid="8058646447242565486">"Dönme Kilitlendi"</string>
<string name="quick_settings_ime_label" msgid="7073463064369468429">"Giriş Yöntemi"</string>
- <!-- no translation found for quick_settings_location_label (5011327048748762257) -->
- <skip />
- <!-- no translation found for quick_settings_location_off_label (7464544086507331459) -->
- <skip />
+ <string name="quick_settings_location_label" msgid="5011327048748762257">"Konum"</string>
+ <string name="quick_settings_location_off_label" msgid="7464544086507331459">"Konum Bilgisi Kapalı"</string>
<string name="quick_settings_media_device_label" msgid="1302906836372603762">"Medya cihazı"</string>
<string name="quick_settings_rssi_label" msgid="7725671335550695589">"RSSI"</string>
<string name="quick_settings_rssi_emergency_only" msgid="2713774041672886750">"Yalnızca Acil Çağrılar İçin"</string>
@@ -200,8 +200,8 @@
<string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Kablosuz Ekran"</string>
<string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Parlaklık"</string>
<string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"OTOMATİK"</string>
- <string name="status_bar_help_title" msgid="1199237744086469217">"Bildirimler burada görünür"</string>
- <string name="status_bar_help_text" msgid="7874607155052076323">"Aşağıya hızlıca kaydırarak bunlara istediğiniz zaman erişebilirsiniz.\nSistem denetimleri için tekrar hızlıca aşağı kaydırın."</string>
- <string name="hideybar_confirmation_message" msgid="9050869548951044371">"Çubuğu görüntülemek için ekranın kenarından hızlıca kaydırın"</string>
- <string name="hideybar_confirmation_message_long" msgid="7117692795163620626">"Sistem çubuğunu görüntülemek için ekranın kenarından hızlıca kaydırın"</string>
+ <string name="quick_settings_inversion_label" msgid="1666358784283020762">"Renk ters çevirme modu"</string>
+ <string name="quick_settings_contrast_label" msgid="3319507551689108692">"GeliÅŸtirilmiÅŸ kontrast modu"</string>
+ <string name="quick_settings_color_space_label" msgid="853443689745584770">"Renk düzeltme modu"</string>
+ <string name="ssl_ca_cert_warning" msgid="9005954106902053641">"AÄŸ izleniyor\nolabilir"</string>
</resources>
diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml
index 18f67a2..fe64274 100644
--- a/packages/SystemUI/res/values-uk/strings.xml
+++ b/packages/SystemUI/res/values-uk/strings.xml
@@ -61,8 +61,6 @@
<string name="usb_debugging_always" msgid="303335496705863070">"Завжди дозволÑти з цього комп’ютера"</string>
<string name="compat_mode_on" msgid="6623839244840638213">"МаÑштабув. на веÑÑŒ екран"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"РозтÑгнути на веÑÑŒ екран"</string>
- <string name="compat_mode_help_header" msgid="7969493989397529910">"МаÑÑˆÑ‚Ð°Ð±ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð»Ñ ÑуміÑноÑті"</string>
- <string name="compat_mode_help_body" msgid="4946726776359270040">"Якщо програму призначено Ð´Ð»Ñ Ð¼ÐµÐ½ÑˆÐ¸Ñ… екранів, елемент ÐºÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð¼Ð°Ñштабом буде відображатиÑÑ Ð±Ñ–Ð»Ñ Ð³Ð¾Ð´Ð¸Ð½Ð½Ð¸ÐºÐ°."</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Ð—Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ð·Ð½Ñ–Ð¼ÐºÐ° екрана..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Ð—Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ð·Ð½Ñ–Ð¼ÐºÐ° екрана..."</string>
<string name="screenshot_saving_text" msgid="2419718443411738818">"ЗберігаєтьÑÑ Ð·Ð½Ñ–Ð¼Ð¾Ðº екрана."</string>
@@ -78,6 +76,8 @@
<string name="accessibility_home" msgid="8217216074895377641">"Головна"</string>
<string name="accessibility_menu" msgid="316839303324695949">"Меню"</string>
<string name="accessibility_recent" msgid="8571350598987952883">"ОÑтанні програми"</string>
+ <string name="accessibility_search_light" msgid="1103867596330271848">"Пошук"</string>
+ <string name="accessibility_camera_button" msgid="8064671582820358152">"Камера"</string>
<string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Кнопка Ð¿ÐµÑ€ÐµÐ¼Ð¸ÐºÐ°Ð½Ð½Ñ Ð¼ÐµÑ‚Ð¾Ð´Ñƒ введеннÑ."</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Кнопка маÑÑˆÑ‚Ð°Ð±ÑƒÐ²Ð°Ð½Ð½Ñ ÑуміÑноÑті."</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Ð—Ð±Ñ–Ð»ÑŒÑˆÐµÐ½Ð½Ñ ÐµÐºÑ€Ð°Ð½Ð°."</string>
@@ -153,6 +153,7 @@
<string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"ÐкумулÑтор: <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_airplane" msgid="4196876722090224753">"Режим польоту: <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="5749054971341882340">"Bluetooth: <xliff:g id="STATE">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_location" msgid="4577282329866813100">"МіÑÑ†ÐµÐ·Ð½Ð°Ñ…Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"Сигнал уÑтановлено на <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"Дані 2G–3G вимкнено"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"Дані 4G вимкнено"</string>
@@ -164,12 +165,13 @@
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Wi-Fi під’єднано"</string>
<string name="gps_notification_searching_text" msgid="8574247005642736060">"ВиконуєтьÑÑ Ð¿Ð¾ÑˆÑƒÐº GPS-Ñигналу"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"МіÑÑ†ÐµÐ·Ð½Ð°Ñ…Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ Ð²Ñтановлено за допомогою GPS"</string>
+ <string name="accessibility_location_active" msgid="2427290146138169014">"Запити про міÑÑ†ÐµÐ·Ð½Ð°Ñ…Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ Ð°ÐºÑ‚Ð¸Ð²Ð½Ñ–"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"ОчиÑтити вÑÑ– ÑповіщеннÑ."</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Ð†Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¾ програму"</string>
<string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Екран обертатиметьÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾."</string>
<string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Екран заблоковано в альбомній орієнтації."</string>
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Екран заблоковано в книжковій орієнтації."</string>
- <string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
+ <string name="dessert_case" msgid="1295161776223959221">"Вітрина деÑертів"</string>
<string name="start_dreams" msgid="7219575858348719790">"ЗаÑтавка"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
<string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Режим польоту"</string>
@@ -198,8 +200,8 @@
<string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Бездротове відображеннÑ"</string>
<string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"ЯÑкравіÑть"</string>
<string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"ÐВТО"</string>
- <string name="status_bar_help_title" msgid="1199237744086469217">"Ð¡Ð¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð·â€™ÑвлÑютьÑÑ Ñ‚ÑƒÑ‚"</string>
- <string name="status_bar_help_text" msgid="7874607155052076323">"Отримуйте до них доÑтуп будь-коли, провівши пальцем униз.\nЗнову проведіть униз, щоб відкрити елементи ÐºÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ ÑиÑтеми."</string>
- <string name="hideybar_confirmation_message" msgid="9050869548951044371">"Гортайте від краю екрана, щоб з’ÑвилаÑÑŒ панель"</string>
- <string name="hideybar_confirmation_message_long" msgid="7117692795163620626">"Проведіть пальцем від краю екрана, щоб з’ÑвилаÑÑŒ навігаційна панель"</string>
+ <string name="quick_settings_inversion_label" msgid="1666358784283020762">"Режим інверÑÑ–Ñ— кольорів"</string>
+ <string name="quick_settings_contrast_label" msgid="3319507551689108692">"Режим поÑиленого контраÑту"</string>
+ <string name="quick_settings_color_space_label" msgid="853443689745584770">"Режим ÐºÐ¾Ñ€Ð¸Ð³ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ¾Ð»ÑŒÐ¾Ñ€Ñƒ"</string>
+ <string name="ssl_ca_cert_warning" msgid="9005954106902053641">"Мережа може\nвідÑтежуватиÑÑ"</string>
</resources>
diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml
index acc7e0e..fb4e377 100644
--- a/packages/SystemUI/res/values-vi/strings.xml
+++ b/packages/SystemUI/res/values-vi/strings.xml
@@ -61,8 +61,6 @@
<string name="usb_debugging_always" msgid="303335496705863070">"Luôn cho phép từ máy tính này"</string>
<string name="compat_mode_on" msgid="6623839244840638213">"T.phóng để lấp đầy m.hình"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Giãn ra để lấp đầy m.hình"</string>
- <string name="compat_mode_help_header" msgid="7969493989397529910">"Thu phóng tương thích"</string>
- <string name="compat_mode_help_body" msgid="4946726776359270040">"Khi ứng dụng được thiết kế cho má»™t màn hình nhá» hÆ¡n, Ä‘iá»u khiển thu phóng sẽ xuất hiện bên cạnh đồng hồ."</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Äang lưu ảnh chụp màn hình..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Äang lưu ảnh chụp màn hình..."</string>
<string name="screenshot_saving_text" msgid="2419718443411738818">"Ảnh chụp màn hình đang được lưu."</string>
@@ -78,6 +76,8 @@
<string name="accessibility_home" msgid="8217216074895377641">"Trang chá»§"</string>
<string name="accessibility_menu" msgid="316839303324695949">"Trình đơn"</string>
<string name="accessibility_recent" msgid="8571350598987952883">"Ứng dụng gần đây"</string>
+ <string name="accessibility_search_light" msgid="1103867596330271848">"Tìm kiếm"</string>
+ <string name="accessibility_camera_button" msgid="8064671582820358152">"Máy ảnh"</string>
<string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Nút chuyển phương thức nhập."</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Nút thu phóng khả năng tương thích."</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Thu phóng màn hình lớn hơn hoặc nhỠhơn."</string>
@@ -153,6 +153,7 @@
<string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"Pin <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_airplane" msgid="4196876722090224753">"Chế độ trên máy bay <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="5749054971341882340">"Bluetooth <xliff:g id="STATE">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_location" msgid="4577282329866813100">"Vị trí <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"Báo thức được đặt cho <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"Äã tắt dữ liệu 2G-3G"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"Äã tắt dữ liệu 4G"</string>
@@ -164,12 +165,13 @@
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Äã kết nối Wi-Fi"</string>
<string name="gps_notification_searching_text" msgid="8574247005642736060">"Äang tìm kiếm GPS"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"Vị trí đặt bởi GPS"</string>
+ <string name="accessibility_location_active" msgid="2427290146138169014">"Yêu cầu vỠthông tin vị trí đang hoạt động"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"Xóa tất cả thông báo."</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Thông tin vỠứng dụng"</string>
<string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Màn hình sẽ xoay tự động."</string>
<string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Màn hình hiện bị khóa theo hướng ngang."</string>
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Màn hình hiện bị khóa theo hướng dá»c."</string>
- <string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
+ <string name="dessert_case" msgid="1295161776223959221">"Tá»§ trưng bày bánh ngá»t"</string>
<string name="start_dreams" msgid="7219575858348719790">"Chế độ ngủ"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
<string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Chế độ trên máy bay"</string>
@@ -198,8 +200,8 @@
<string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Hiển thị không dây"</string>
<string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Äá»™ sáng"</string>
<string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"Tá»° ÄỘNG"</string>
- <string name="status_bar_help_title" msgid="1199237744086469217">"Thông báo xuất hiện tại đây"</string>
- <string name="status_bar_help_text" msgid="7874607155052076323">"Truy cập vào chúng bất kỳ lúc nào bằng cách vuốt xuống.\nVuốt lại xuống để hiển thị các Ä‘iá»u khiển hệ thống."</string>
- <string name="hideybar_confirmation_message" msgid="9050869548951044371">"Vuốt cạnh màn hình để hiển thị thanh"</string>
- <string name="hideybar_confirmation_message_long" msgid="7117692795163620626">"Vuốt từ cạnh màn hình để hiển thị thanh hệ thống"</string>
+ <string name="quick_settings_inversion_label" msgid="1666358784283020762">"Chế độ đảo ngược màu sắc"</string>
+ <string name="quick_settings_contrast_label" msgid="3319507551689108692">"Chế độ tương phản tăng cưá»ng"</string>
+ <string name="quick_settings_color_space_label" msgid="853443689745584770">"Chế độ hiệu chỉnh màu sắc"</string>
+ <string name="ssl_ca_cert_warning" msgid="9005954106902053641">"Mạng có thể\nđược giám sát"</string>
</resources>
diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml
index 0a62ee3..c5708ac 100644
--- a/packages/SystemUI/res/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/res/values-zh-rCN/strings.xml
@@ -61,8 +61,6 @@
<string name="usb_debugging_always" msgid="303335496705863070">"一律å…许使用这å°è®¡ç®—机进行调试"</string>
<string name="compat_mode_on" msgid="6623839244840638213">"缩放以填满å±å¹•"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"拉伸以填满å±å¹•"</string>
- <string name="compat_mode_help_header" msgid="7969493989397529910">"兼容性缩放"</string>
- <string name="compat_mode_help_body" msgid="4946726776359270040">"如果应用是针对较å°å±å¹•设计的,则时钟æ—会显示缩放控件。"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"正在ä¿å­˜å±å¹•截图..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"正在ä¿å­˜å±å¹•截图..."</string>
<string name="screenshot_saving_text" msgid="2419718443411738818">"正在ä¿å­˜å±å¹•截图。"</string>
@@ -78,6 +76,8 @@
<string name="accessibility_home" msgid="8217216074895377641">"主å±å¹•"</string>
<string name="accessibility_menu" msgid="316839303324695949">"èœå•"</string>
<string name="accessibility_recent" msgid="8571350598987952883">"最近è¿è¡Œçš„应用"</string>
+ <string name="accessibility_search_light" msgid="1103867596330271848">"æœç´¢"</string>
+ <string name="accessibility_camera_button" msgid="8064671582820358152">"相机"</string>
<string name="accessibility_ime_switch_button" msgid="5032926134740456424">"è¾“å…¥æ³•åˆ‡æ¢æŒ‰é’®ã€‚"</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"兼容性缩放按钮。"</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"å°†å°å±å¹•的图片放大在较大å±å¹•上显示。"</string>
@@ -147,7 +147,7 @@
<string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"已删除<xliff:g id="APP">%s</xliff:g>"</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"已关闭通知。"</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"通知æ ã€‚"</string>
- <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"快速设置。"</string>
+ <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"å¿«æ·è®¾ç½®ã€‚"</string>
<string name="accessibility_desc_recent_apps" msgid="9014032916410590027">"最近使用的应用。"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"用户:<xliff:g id="USER">%s</xliff:g>。"</string>
<string name="accessibility_quick_settings_wifi" msgid="6099781031669728709">"<xliff:g id="SIGNAL">%1$s</xliff:g>,<xliff:g id="NETWORK">%2$s</xliff:g>"</string>
@@ -155,23 +155,25 @@
<string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"电池电é‡ï¼š<xliff:g id="STATE">%s</xliff:g>。"</string>
<string name="accessibility_quick_settings_airplane" msgid="4196876722090224753">"飞行模å¼ï¼š<xliff:g id="STATE">%s</xliff:g>。"</string>
<string name="accessibility_quick_settings_bluetooth" msgid="5749054971341882340">"è“牙:<xliff:g id="STATE">%s</xliff:g>。"</string>
+ <string name="accessibility_quick_settings_location" msgid="4577282329866813100">"ä½ç½®ä¿¡æ¯æœåŠ¡<xliff:g id="STATE">%s</xliff:g>。"</string>
<string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"闹钟已设置为:<xliff:g id="TIME">%s</xliff:g>。"</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"2G-3G æ•°æ®ç½‘络已åœç”¨"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"4G æ•°æ®ç½‘络已åœç”¨"</string>
- <string name="data_usage_disabled_dialog_mobile_title" msgid="1046047248844821202">"移动数æ®å·²åœç”¨"</string>
- <string name="data_usage_disabled_dialog_title" msgid="2086815304858964954">"æ•°æ®å·²åœç”¨"</string>
+ <string name="data_usage_disabled_dialog_mobile_title" msgid="1046047248844821202">"移动数æ®ç½‘络已åœç”¨"</string>
+ <string name="data_usage_disabled_dialog_title" msgid="2086815304858964954">"æ•°æ®ç½‘络已åœç”¨"</string>
<string name="data_usage_disabled_dialog" msgid="3853117269051806280">"æ‚¨å·²è¾¾åˆ°æŒ‡å®šçš„æ•°æ®æµé‡ä¸Šé™ã€‚\n\nå¦‚æžœæ‚¨é‡æ–°å¯ç”¨æ•°æ®ï¼Œè¿è¥å•†å¯èƒ½ä¼šæ”¶å–相应的费用。"</string>
<string name="data_usage_disabled_dialog_enable" msgid="7729772039208664606">"釿–°å¯ç”¨æ•°æ®è¿žæŽ¥"</string>
<string name="status_bar_settings_signal_meter_disconnected" msgid="1940231521274147771">"未连接互è”网"</string>
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"WLAN 已连接"</string>
<string name="gps_notification_searching_text" msgid="8574247005642736060">"正在æœç´¢ GPS"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"已通过 GPS 确定ä½ç½®"</string>
+ <string name="accessibility_location_active" msgid="2427290146138169014">"应用å‘出了有效ä½ç½®ä¿¡æ¯è¯·æ±‚"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"清除所有通知。"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"应用信æ¯"</string>
<string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"å±å¹•会自动旋转。"</string>
<string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"å±å¹•é”å®šä¸ºæ¨ªå‘æ¨¡å¼ã€‚"</string>
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"å±å¹•é”å®šä¸ºçºµå‘æ¨¡å¼ã€‚"</string>
- <string name="jelly_bean_dream_name" msgid="5992026543636816792">"果冻豆大乱舞"</string>
+ <string name="dessert_case" msgid="1295161776223959221">"甜å“ç›’"</string>
<string name="start_dreams" msgid="7219575858348719790">"互动å±ä¿"</string>
<string name="ethernet_label" msgid="7967563676324087464">"以太网"</string>
<string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"飞行模å¼"</string>
@@ -179,15 +181,13 @@
<string name="quick_settings_battery_charged_label" msgid="8865413079414246081">"充电完æˆ"</string>
<string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"è“牙"</string>
<string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"è“牙(<xliff:g id="NUMBER">%d</xliff:g> å°è®¾å¤‡ï¼‰"</string>
- <string name="quick_settings_bluetooth_off_label" msgid="8159652146149219937">"è“牙已关闭"</string>
+ <string name="quick_settings_bluetooth_off_label" msgid="8159652146149219937">"è“牙:关闭"</string>
<string name="quick_settings_brightness_label" msgid="6968372297018755815">"亮度"</string>
<string name="quick_settings_rotation_unlocked_label" msgid="336054930362580584">"自动旋转"</string>
- <string name="quick_settings_rotation_locked_label" msgid="8058646447242565486">"å±å¹•æ–¹å‘å·²é”定"</string>
+ <string name="quick_settings_rotation_locked_label" msgid="8058646447242565486">"å±å¹•æ–¹å‘:é”定"</string>
<string name="quick_settings_ime_label" msgid="7073463064369468429">"输入法"</string>
- <!-- no translation found for quick_settings_location_label (5011327048748762257) -->
- <skip />
- <!-- no translation found for quick_settings_location_off_label (7464544086507331459) -->
- <skip />
+ <string name="quick_settings_location_label" msgid="5011327048748762257">"ä½ç½®ä¿¡æ¯"</string>
+ <string name="quick_settings_location_off_label" msgid="7464544086507331459">"ä½ç½®ä¿¡æ¯æœåС已关闭"</string>
<string name="quick_settings_media_device_label" msgid="1302906836372603762">"媒体设备"</string>
<string name="quick_settings_rssi_label" msgid="7725671335550695589">"RSSI"</string>
<string name="quick_settings_rssi_emergency_only" msgid="2713774041672886750">"åªèƒ½æ‹¨æ‰“紧急呼救电è¯"</string>
@@ -202,8 +202,8 @@
<string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"无线显示"</string>
<string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"亮度"</string>
<string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"自动"</string>
- <string name="status_bar_help_title" msgid="1199237744086469217">"通知会显示在这里"</string>
- <string name="status_bar_help_text" msgid="7874607155052076323">"å‘下滑动å¯éšæ—¶æŸ¥çœ‹é€šçŸ¥ã€‚\n冿¬¡å‘下滑动å¯ä½¿ç”¨ç³»ç»ŸæŽ§åˆ¶åŠŸèƒ½ã€‚"</string>
- <string name="hideybar_confirmation_message" msgid="9050869548951044371">"从边缘å‘é‡Œæ»‘å¯æ˜¾ç¤ºç³»ç»Ÿæ "</string>
- <string name="hideybar_confirmation_message_long" msgid="7117692795163620626">"从å±å¹•边缘å‘里滑动å³å¯æ˜¾ç¤ºç³»ç»Ÿæ "</string>
+ <string name="quick_settings_inversion_label" msgid="1666358784283020762">"颜色å转模å¼"</string>
+ <string name="quick_settings_contrast_label" msgid="3319507551689108692">"增强对比度模å¼"</string>
+ <string name="quick_settings_color_space_label" msgid="853443689745584770">"颜色校正模å¼"</string>
+ <string name="ssl_ca_cert_warning" msgid="9005954106902053641">"网络å¯èƒ½ä¼š\nå—到监控"</string>
</resources>
diff --git a/packages/SystemUI/res/values-zh-rHK-land/strings.xml b/packages/SystemUI/res/values-zh-rHK-land/strings.xml
new file mode 100644
index 0000000..8d55df4
--- /dev/null
+++ b/packages/SystemUI/res/values-zh-rHK-land/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2010, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="toast_rotation_locked" msgid="7609673011431556092">"å±å¹•ç¾å·²éŽ–å®šç‚ºæ©«å‘æ¨¡å¼"</string>
+</resources>
diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml
new file mode 100644
index 0000000..2cbe82d
--- /dev/null
+++ b/packages/SystemUI/res/values-zh-rHK/strings.xml
@@ -0,0 +1,209 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="7164937344850004466">"系統用戶介é¢"</string>
+ <string name="status_bar_clear_all_button" msgid="7774721344716731603">"清除"</string>
+ <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"從清單中移除"</string>
+ <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"應用程å¼è³‡è¨Š"</string>
+ <string name="status_bar_no_recent_apps" msgid="6576392951053994640">"沒有最近的應用程å¼"</string>
+ <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"關閉最近使用的應用程å¼"</string>
+ <plurals name="status_bar_accessibility_recent_apps">
+ <item quantity="one" msgid="5854176083865845541">"1 個最近使用的應用程å¼"</item>
+ <item quantity="other" msgid="1040784359794890744">"%d 個最近使用的應用程å¼"</item>
+ </plurals>
+ <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"無通知"</string>
+ <string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"æŒçºŒé€²è¡Œ"</string>
+ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"通知"</string>
+ <string name="battery_low_title" msgid="2783104807551211639">"連接充電器"</string>
+ <string name="battery_low_subtitle" msgid="1752040062087829196">"電池å³å°‡ç”¨ç›¡ã€‚"</string>
+ <string name="battery_low_percent_format" msgid="1077244949318261761">"剩餘 <xliff:g id="NUMBER">%d%%</xliff:g>"</string>
+ <string name="invalid_charger" msgid="4549105996740522523">"䏿”¯æ´ USB 充電。\n僅能使用隨附的充電器。"</string>
+ <string name="battery_low_why" msgid="7279169609518386372">"電池使用情æ³"</string>
+ <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"設定"</string>
+ <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
+ <string name="status_bar_settings_airplane" msgid="4879879698500955300">"飛行模å¼"</string>
+ <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"自動旋轉螢幕"</string>
+ <string name="status_bar_settings_mute_label" msgid="554682549917429396">"關閉"</string>
+ <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"自動"</string>
+ <string name="status_bar_settings_notifications" msgid="397146176280905137">"通知"</string>
+ <string name="bluetooth_tethered" msgid="7094101612161133267">"已經由è—牙進行網絡共享"</string>
+ <string name="status_bar_input_method_settings_configure_input_methods" msgid="3504292471512317827">"設定輸入方å¼"</string>
+ <string name="status_bar_use_physical_keyboard" msgid="7551903084416057810">"實體éµç›¤"</string>
+ <string name="usb_device_permission_prompt" msgid="834698001271562057">"å…許「<xliff:g id="APPLICATION">%1$s</xliff:g>ã€æ‡‰ç”¨ç¨‹å¼å­˜å– USB è£ç½®å—Žï¼Ÿ"</string>
+ <string name="usb_accessory_permission_prompt" msgid="5171775411178865750">"å…許「<xliff:g id="APPLICATION">%1$s</xliff:g>ã€æ‡‰ç”¨ç¨‹å¼å­˜å– USB é…件嗎?"</string>
+ <string name="usb_device_confirm_prompt" msgid="5161205258635253206">"連接這個 USB è£ç½®æ™‚啟用 <xliff:g id="ACTIVITY">%1$s</xliff:g> 嗎?"</string>
+ <string name="usb_accessory_confirm_prompt" msgid="3808984931830229888">"連接這個 USB é…件時啟用 <xliff:g id="ACTIVITY">%1$s</xliff:g> 嗎?"</string>
+ <string name="usb_accessory_uri_prompt" msgid="513450621413733343">"已安è£çš„æ‡‰ç”¨ç¨‹å¼å‡ç„¡æ³•å­˜å–這個 USB é…件,如è¦é€²ä¸€æ­¥çž­è§£é€™å€‹é…件,請ç€è¦½ <xliff:g id="URL">%1$s</xliff:g>"</string>
+ <string name="title_usb_accessory" msgid="4966265263465181372">"USB é…ä»¶"</string>
+ <string name="label_view" msgid="6304565553218192990">"觀看"</string>
+ <string name="always_use_device" msgid="1450287437017315906">"é è¨­ç”¨æ–¼é€™å€‹ USB è£ç½®"</string>
+ <string name="always_use_accessory" msgid="1210954576979621596">"é è¨­ç”¨æ–¼é€™å€‹ USB é…ä»¶"</string>
+ <string name="usb_debugging_title" msgid="4513918393387141949">"å…許 USB 除錯嗎?"</string>
+ <string name="usb_debugging_message" msgid="2220143855912376496">"這部電腦的 RSA 密鑰指紋如下:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
+ <string name="usb_debugging_always" msgid="303335496705863070">"一律å…許é€éŽé€™éƒ¨é›»è…¦é€²è¡Œ"</string>
+ <string name="compat_mode_on" msgid="6623839244840638213">"放大為全螢幕"</string>
+ <string name="compat_mode_off" msgid="4434467572461327898">"放大為全螢幕"</string>
+ <string name="screenshot_saving_ticker" msgid="7403652894056693515">"正在儲存å±å¹•æ“·å–ç•«é¢..."</string>
+ <string name="screenshot_saving_title" msgid="8242282144535555697">"正在儲存å±å¹•æ“·å–ç•«é¢..."</string>
+ <string name="screenshot_saving_text" msgid="2419718443411738818">"正在儲存å±å¹•æ“·å–ç•«é¢ã€‚"</string>
+ <string name="screenshot_saved_title" msgid="6461865960961414961">"已擷å–å±å¹•ç•«é¢ã€‚"</string>
+ <string name="screenshot_saved_text" msgid="1152839647677558815">"輕觸å³å¯æŸ¥çœ‹å±å¹•æ“·å–ç•«é¢ã€‚"</string>
+ <string name="screenshot_failed_title" msgid="705781116746922771">"無法擷å–å±å¹•ç•«é¢ã€‚"</string>
+ <string name="screenshot_failed_text" msgid="8134011269572415402">"無法儲存å±å¹•æ“·å–ç•«é¢ï¼Œå„²å­˜è£ç½®å¯èƒ½æ­£åœ¨ä½¿ç”¨ã€‚"</string>
+ <string name="usb_preference_title" msgid="6551050377388882787">"USB 檔案傳輸é¸é …"</string>
+ <string name="use_mtp_button_title" msgid="4333504413563023626">"掛接為媒體播放器 (MTP)"</string>
+ <string name="use_ptp_button_title" msgid="7517127540301625751">"掛接為相機 (PTP)"</string>
+ <string name="installer_cd_button_title" msgid="2312667578562201583">"å®‰è£ Mac 專用的「Android æª”æ¡ˆå‚³è¼¸ã€æ‡‰ç”¨ç¨‹å¼"</string>
+ <string name="accessibility_back" msgid="567011538994429120">"返回"</string>
+ <string name="accessibility_home" msgid="8217216074895377641">"首é "</string>
+ <string name="accessibility_menu" msgid="316839303324695949">"é¸å–®"</string>
+ <string name="accessibility_recent" msgid="8571350598987952883">"最近使用的應用程å¼"</string>
+ <string name="accessibility_search_light" msgid="1103867596330271848">"æœå°‹"</string>
+ <string name="accessibility_camera_button" msgid="8064671582820358152">"相機"</string>
+ <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"切æ›è¼¸å…¥æ³•按鈕。"</string>
+ <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"相容性縮放按鈕。"</string>
+ <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"將較å°èž¢å¹•çš„ç•«é¢æ”¾å¤§åœ¨è¼ƒå¤§èž¢å¹•上顯示。"</string>
+ <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"è—牙連線已建立。"</string>
+ <string name="accessibility_bluetooth_disconnected" msgid="7416648669976870175">"è—牙連線已中斷。"</string>
+ <string name="accessibility_no_battery" msgid="358343022352820946">"未安è£é›»æ± ã€‚"</string>
+ <string name="accessibility_battery_one_bar" msgid="7774887721891057523">"電池電é‡ç‚ºä¸€æ ¼ã€‚"</string>
+ <string name="accessibility_battery_two_bars" msgid="8500650438735009973">"電池電é‡ç‚ºå…©æ ¼ã€‚"</string>
+ <string name="accessibility_battery_three_bars" msgid="2302983330865040446">"電池電é‡ç‚ºä¸‰æ ¼ã€‚"</string>
+ <string name="accessibility_battery_full" msgid="8909122401720158582">"電池已滿。"</string>
+ <string name="accessibility_no_phone" msgid="4894708937052611281">"沒有電話訊號。"</string>
+ <string name="accessibility_phone_one_bar" msgid="687699278132664115">"電話訊號強度為一格。"</string>
+ <string name="accessibility_phone_two_bars" msgid="8384905382804815201">"電話訊號強度為兩格。"</string>
+ <string name="accessibility_phone_three_bars" msgid="8521904843919971885">"電話訊號強度為三格。"</string>
+ <string name="accessibility_phone_signal_full" msgid="6471834868580757898">"電話訊號滿格。"</string>
+ <string name="accessibility_no_data" msgid="4791966295096867555">"沒有數據網絡。"</string>
+ <string name="accessibility_data_one_bar" msgid="1415625833238273628">"數據網絡訊號強度為一格。"</string>
+ <string name="accessibility_data_two_bars" msgid="6166018492360432091">"數據網絡訊號強度為兩格。"</string>
+ <string name="accessibility_data_three_bars" msgid="9167670452395038520">"數據網絡訊號強度為三格。"</string>
+ <string name="accessibility_data_signal_full" msgid="2708384608124519369">"數據網絡訊號滿格。"</string>
+ <string name="accessibility_wifi_off" msgid="3177380296697933627">"WiFi 已關閉。"</string>
+ <string name="accessibility_no_wifi" msgid="1425476551827924474">"WiFi 連線已中斷。"</string>
+ <string name="accessibility_wifi_one_bar" msgid="7735893178010724377">"WiFi 訊號強度為一格。"</string>
+ <string name="accessibility_wifi_two_bars" msgid="4994274250497262434">"WiFi 訊號強度為兩格。"</string>
+ <string name="accessibility_wifi_three_bars" msgid="3495755044276588384">"WiFi 訊號強度為三格。"</string>
+ <string name="accessibility_wifi_signal_full" msgid="6853561303586480376">"WiFi 訊號已滿。"</string>
+ <string name="accessibility_no_wimax" msgid="4329180129727630368">"沒有 WiMAX 訊號。"</string>
+ <string name="accessibility_wimax_one_bar" msgid="4170994299011863648">"WiMAX 訊號強度一格。"</string>
+ <string name="accessibility_wimax_two_bars" msgid="9176236858336502288">"WiMAX 訊號強度兩格。"</string>
+ <string name="accessibility_wimax_three_bars" msgid="6116551636752103927">"WiMAX 訊號強度三格。"</string>
+ <string name="accessibility_wimax_signal_full" msgid="2768089986795579558">"WiMAX 訊號滿格。"</string>
+ <string name="accessibility_no_signal" msgid="7064645320782585167">"沒有訊號。"</string>
+ <string name="accessibility_not_connected" msgid="6395326276213402883">"未連線。"</string>
+ <string name="accessibility_zero_bars" msgid="3806060224467027887">"訊號強度為零格。"</string>
+ <string name="accessibility_one_bar" msgid="1685730113192081895">"訊號強度為一格。"</string>
+ <string name="accessibility_two_bars" msgid="6437363648385206679">"訊號強度為兩格。"</string>
+ <string name="accessibility_three_bars" msgid="2648241415119396648">"訊號強度為三格。"</string>
+ <string name="accessibility_signal_full" msgid="9122922886519676839">"訊號已滿。"</string>
+ <string name="accessibility_desc_on" msgid="2385254693624345265">"開啟。"</string>
+ <string name="accessibility_desc_off" msgid="6475508157786853157">"關閉。"</string>
+ <string name="accessibility_desc_connected" msgid="8366256693719499665">"已連線。"</string>
+ <string name="accessibility_data_connection_gprs" msgid="1606477224486747751">"GPRS"</string>
+ <string name="accessibility_data_connection_1x" msgid="994133468120244018">"1 X"</string>
+ <string name="accessibility_data_connection_hspa" msgid="2032328855462645198">"HSPA"</string>
+ <string name="accessibility_data_connection_3g" msgid="8628562305003568260">"3G"</string>
+ <string name="accessibility_data_connection_3.5g" msgid="8664845609981692001">"3.5G"</string>
+ <string name="accessibility_data_connection_4g" msgid="7741000750630089612">"4G"</string>
+ <string name="accessibility_data_connection_lte" msgid="5413468808637540658">"LTE"</string>
+ <string name="accessibility_data_connection_cdma" msgid="6132648193978823023">"CDMA"</string>
+ <string name="accessibility_data_connection_roaming" msgid="5977362333466556094">"漫éŠ"</string>
+ <string name="accessibility_data_connection_edge" msgid="4477457051631979278">"Edge"</string>
+ <string name="accessibility_data_connection_wifi" msgid="2324496756590645221">"Wi-Fi"</string>
+ <string name="accessibility_no_sim" msgid="8274017118472455155">"ç„¡ SIM å¡ã€‚"</string>
+ <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"è—牙數據連線。"</string>
+ <string name="accessibility_airplane_mode" msgid="834748999790763092">"飛航模å¼ã€‚"</string>
+ <!-- String.format failed for translation -->
+ <!-- no translation found for accessibility_battery_level (7451474187113371965) -->
+ <skip />
+ <string name="accessibility_settings_button" msgid="799583911231893380">"系統設定"</string>
+ <string name="accessibility_notifications_button" msgid="4498000369779421892">"通知。"</string>
+ <string name="accessibility_remove_notification" msgid="3603099514902182350">"清除通知。"</string>
+ <string name="accessibility_gps_enabled" msgid="3511469499240123019">"GPS 已啟用。"</string>
+ <string name="accessibility_gps_acquiring" msgid="8959333351058967158">"正在å–å¾— GPS 訊號。"</string>
+ <string name="accessibility_tty_enabled" msgid="4613200365379426561">"TeleTypewriter (TTY) 已啟用。"</string>
+ <string name="accessibility_ringer_vibrate" msgid="666585363364155055">"鈴è²éœ‡å‹•。"</string>
+ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"鈴è²éœéŸ³ã€‚"</string>
+ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"「<xliff:g id="APP">%s</xliff:g>ã€å·²é—œé–‰ã€‚"</string>
+ <string name="accessibility_notification_dismissed" msgid="854211387186306927">"通知已關閉。"</string>
+ <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"通知欄。"</string>
+ <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"快速設定。"</string>
+ <string name="accessibility_desc_recent_apps" msgid="9014032916410590027">"最近使用的應用程å¼"</string>
+ <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"用戶:<xliff:g id="USER">%s</xliff:g>。"</string>
+ <string name="accessibility_quick_settings_wifi" msgid="6099781031669728709">"<xliff:g id="SIGNAL">%1$s</xliff:g>ã€<xliff:g id="NETWORK">%2$s</xliff:g>"</string>
+ <string name="accessibility_quick_settings_mobile" msgid="4876806564086241341">"æµå‹•數據連線:<xliff:g id="SIGNAL">%1$s</xliff:g>ã€<xliff:g id="TYPE">%2$s</xliff:g>ã€<xliff:g id="NETWORK">%3$s</xliff:g>。"</string>
+ <string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"電池電é‡ï¼š<xliff:g id="STATE">%s</xliff:g>。"</string>
+ <string name="accessibility_quick_settings_airplane" msgid="4196876722090224753">"飛航模å¼ï¼š<xliff:g id="STATE">%s</xliff:g>。"</string>
+ <string name="accessibility_quick_settings_bluetooth" msgid="5749054971341882340">"è—牙:<xliff:g id="STATE">%s</xliff:g>。"</string>
+ <string name="accessibility_quick_settings_location" msgid="4577282329866813100">"å®šä½æœå‹™<xliff:g id="STATE">%s</xliff:g>。"</string>
+ <string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"鬧é˜å·²è¨­å®šç‚ºï¼š<xliff:g id="TIME">%s</xliff:g>。"</string>
+ <string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"å·²åœç”¨ 2G-3G 數據"</string>
+ <string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"å·²åœç”¨ 4G 數據"</string>
+ <string name="data_usage_disabled_dialog_mobile_title" msgid="1046047248844821202">"å·²åœç”¨æµå‹•數據"</string>
+ <string name="data_usage_disabled_dialog_title" msgid="2086815304858964954">"數據åœç”¨"</string>
+ <string name="data_usage_disabled_dialog" msgid="3853117269051806280">"æ‚¨å·²åˆ°é”æŒ‡å®šçš„æ•¸æ“šç”¨é‡ä¸Šé™ã€‚\n\nå¦‚æžœæ‚¨é‡æ–°å•Ÿç”¨æ•¸æ“šå‚³è¼¸ï¼Œæµå‹•網絡供應商å¯èƒ½æœƒå‘您收費。"</string>
+ <string name="data_usage_disabled_dialog_enable" msgid="7729772039208664606">"釿–°å•Ÿç”¨æ•¸æ“š"</string>
+ <string name="status_bar_settings_signal_meter_disconnected" msgid="1940231521274147771">"沒有互è¯ç¶²é€£ç·š"</string>
+ <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Wi-Fi 已連線"</string>
+ <string name="gps_notification_searching_text" msgid="8574247005642736060">"正在æœå°‹ GPS"</string>
+ <string name="gps_notification_found_text" msgid="4619274244146446464">"GPS 已定ä½"</string>
+ <string name="accessibility_location_active" msgid="2427290146138169014">"ä½ç½®è¦æ±‚啟動中"</string>
+ <string name="accessibility_clear_all" msgid="5235938559247164925">"清除所有通知。"</string>
+ <string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"應用程å¼è³‡è¨Š"</string>
+ <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"å±å¹•會自動旋轉。"</string>
+ <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"å±å¹•å·²éŽ–å®šç‚ºæ©«å‘æ¨¡å¼ã€‚"</string>
+ <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"å±å¹•已鎖定為垂直模å¼ã€‚"</string>
+ <string name="dessert_case" msgid="1295161776223959221">"Dessert Case"</string>
+ <string name="start_dreams" msgid="7219575858348719790">"Daydream"</string>
+ <string name="ethernet_label" msgid="7967563676324087464">"以太網"</string>
+ <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"飛行模å¼"</string>
+ <string name="quick_settings_battery_charging_label" msgid="490074774465309209">"充電中 (<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
+ <string name="quick_settings_battery_charged_label" msgid="8865413079414246081">"充電完æˆ"</string>
+ <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"è—牙"</string>
+ <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"è—牙 (<xliff:g id="NUMBER">%d</xliff:g> 部è£ç½®)"</string>
+ <string name="quick_settings_bluetooth_off_label" msgid="8159652146149219937">"è—牙關閉"</string>
+ <string name="quick_settings_brightness_label" msgid="6968372297018755815">"亮度"</string>
+ <string name="quick_settings_rotation_unlocked_label" msgid="336054930362580584">"自動旋轉"</string>
+ <string name="quick_settings_rotation_locked_label" msgid="8058646447242565486">"已鎖定å±å¹•旋轉功能"</string>
+ <string name="quick_settings_ime_label" msgid="7073463064369468429">"輸入法"</string>
+ <string name="quick_settings_location_label" msgid="5011327048748762257">"ä½ç½®"</string>
+ <string name="quick_settings_location_off_label" msgid="7464544086507331459">"ä½ç½®é—œé–‰"</string>
+ <string name="quick_settings_media_device_label" msgid="1302906836372603762">"媒體è£ç½®"</string>
+ <string name="quick_settings_rssi_label" msgid="7725671335550695589">"RSSI"</string>
+ <string name="quick_settings_rssi_emergency_only" msgid="2713774041672886750">"åªå¯æ’¥æ‰“緊急電話"</string>
+ <string name="quick_settings_settings_label" msgid="5326556592578065401">"設定"</string>
+ <string name="quick_settings_time_label" msgid="4635969182239736408">"時間"</string>
+ <string name="quick_settings_user_label" msgid="5238995632130897840">"我"</string>
+ <string name="quick_settings_wifi_label" msgid="9135344704899546041">"Wi-Fi"</string>
+ <string name="quick_settings_wifi_not_connected" msgid="7171904845345573431">"未連線"</string>
+ <string name="quick_settings_wifi_no_network" msgid="2221993077220856376">"沒有網絡"</string>
+ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi 關閉"</string>
+ <string name="quick_settings_wifi_display_label" msgid="6893592964463624333">"Wi-Fi Display"</string>
+ <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"無線顯示"</string>
+ <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"亮度"</string>
+ <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"自動"</string>
+ <string name="quick_settings_inversion_label" msgid="1666358784283020762">"色彩å轉模å¼"</string>
+ <string name="quick_settings_contrast_label" msgid="3319507551689108692">"å¢žå¼·å°æ¯”模å¼"</string>
+ <string name="quick_settings_color_space_label" msgid="853443689745584770">"色彩校準模å¼"</string>
+ <string name="ssl_ca_cert_warning" msgid="9005954106902053641">"網絡å¯èƒ½æœƒ\nå—到監控"</string>
+</resources>
diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml
index 2cfdb59..5b205e1 100644
--- a/packages/SystemUI/res/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/res/values-zh-rTW/strings.xml
@@ -61,8 +61,6 @@
<string name="usb_debugging_always" msgid="303335496705863070">"一律å…許é€éŽé€™å°é›»è…¦é€²è¡Œ"</string>
<string name="compat_mode_on" msgid="6623839244840638213">"放大為全螢幕"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"放大為全螢幕"</string>
- <string name="compat_mode_help_header" msgid="7969493989397529910">"相容性縮放"</string>
- <string name="compat_mode_help_body" msgid="4946726776359270040">"執行專為較å°èž¢å¹•è¨­è¨ˆçš„æ‡‰ç”¨ç¨‹å¼æ™‚ï¼Œç³»çµ±æœƒåœ¨æ™‚é˜æ—顯示縮放控制項。"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"正在儲存螢幕擷å–ç•«é¢â€¦"</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"正在儲存螢幕擷å–ç•«é¢â€¦"</string>
<string name="screenshot_saving_text" msgid="2419718443411738818">"正在儲存螢幕擷å–ç•«é¢ã€‚"</string>
@@ -78,6 +76,8 @@
<string name="accessibility_home" msgid="8217216074895377641">"主螢幕"</string>
<string name="accessibility_menu" msgid="316839303324695949">"é¸å–®"</string>
<string name="accessibility_recent" msgid="8571350598987952883">"最近使用的應用程å¼"</string>
+ <string name="accessibility_search_light" msgid="1103867596330271848">"æœå°‹"</string>
+ <string name="accessibility_camera_button" msgid="8064671582820358152">"相機"</string>
<string name="accessibility_ime_switch_button" msgid="5032926134740456424">"切æ›è¼¸å…¥æ³•按鈕。"</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"相容性縮放按鈕。"</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"將較å°èž¢å¹•çš„ç•«é¢æ”¾å¤§åœ¨è¼ƒå¤§èž¢å¹•上顯示。"</string>
@@ -155,6 +155,7 @@
<string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"電池電é‡ï¼š<xliff:g id="STATE">%s</xliff:g>。"</string>
<string name="accessibility_quick_settings_airplane" msgid="4196876722090224753">"飛航模å¼ï¼š<xliff:g id="STATE">%s</xliff:g>。"</string>
<string name="accessibility_quick_settings_bluetooth" msgid="5749054971341882340">"è—牙:<xliff:g id="STATE">%s</xliff:g>。"</string>
+ <string name="accessibility_quick_settings_location" msgid="4577282329866813100">"å®šä½æœå‹™<xliff:g id="STATE">%s</xliff:g>。"</string>
<string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"鬧é˜å·²è¨­å®šç‚ºï¼š<xliff:g id="TIME">%s</xliff:g>。"</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"å·²åœç”¨ 2G-3G 數據"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"å·²åœç”¨ 4G 數據"</string>
@@ -166,12 +167,13 @@
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Wi-Fi 已連線"</string>
<string name="gps_notification_searching_text" msgid="8574247005642736060">"正在æœå°‹ GPS"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"GPS 已定ä½"</string>
+ <string name="accessibility_location_active" msgid="2427290146138169014">"有ä½ç½®è³‡è¨Šè¦æ±‚"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"清除所有通知。"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"應用程å¼è³‡è¨Š"</string>
<string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"螢幕會自動旋轉。"</string>
<string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"èž¢å¹•å·²éŽ–å®šç‚ºæ©«å‘æ¨¡å¼ã€‚"</string>
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"螢幕已鎖定為垂直模å¼ã€‚"</string>
- <string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
+ <string name="dessert_case" msgid="1295161776223959221">"Dessert Case"</string>
<string name="start_dreams" msgid="7219575858348719790">"休眠模å¼"</string>
<string name="ethernet_label" msgid="7967563676324087464">"乙太網路"</string>
<string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"飛航模å¼"</string>
@@ -200,8 +202,8 @@
<string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"無線螢幕分享"</string>
<string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"亮度"</string>
<string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"自動"</string>
- <string name="status_bar_help_title" msgid="1199237744086469217">"系統會在這裡顯示通知"</string>
- <string name="status_bar_help_text" msgid="7874607155052076323">"å‘下滑動å³å¯éš¨æ™‚å­˜å–通知。\n冿¬¡å‘下滑動å³å¯ä½¿ç”¨ç³»çµ±æŽ§åˆ¶é …。"</string>
- <string name="hideybar_confirmation_message" msgid="9050869548951044371">"滑動螢幕邊緣å³å¯é¡¯ç¤ºå°Žè¦½åˆ—"</string>
- <string name="hideybar_confirmation_message_long" msgid="7117692795163620626">"從螢幕邊緣å‘內滑動å³å¯é¡¯ç¤ºå°Žè¦½åˆ—"</string>
+ <string name="quick_settings_inversion_label" msgid="1666358784283020762">"彩色å轉模å¼"</string>
+ <string name="quick_settings_contrast_label" msgid="3319507551689108692">"å¢žå¼·å°æ¯”模å¼"</string>
+ <string name="quick_settings_color_space_label" msgid="853443689745584770">"色彩校正模å¼"</string>
+ <string name="ssl_ca_cert_warning" msgid="9005954106902053641">"網路å¯èƒ½\nå—到監控"</string>
</resources>
diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml
index 007d338..131eef5 100644
--- a/packages/SystemUI/res/values-zu/strings.xml
+++ b/packages/SystemUI/res/values-zu/strings.xml
@@ -24,10 +24,10 @@
<string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Susa ohlwini"</string>
<string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Ulwazi lwensiza"</string>
<string name="status_bar_no_recent_apps" msgid="6576392951053994640">"Azikho izinhlelo zokusebenza zakamuva"</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Susa izinsiza zakamumva"</string>
+ <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Susa izinhlelo zokusebenza zakamumva"</string>
<plurals name="status_bar_accessibility_recent_apps">
<item quantity="one" msgid="5854176083865845541">"Insiza eyi-1 yakamumva"</item>
- <item quantity="other" msgid="1040784359794890744">"%d izinsiza zakamumva"</item>
+ <item quantity="other" msgid="1040784359794890744">"%d izinhlelo zokusebenza zakamumva"</item>
</plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Azikho izaziso"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Okuqhubekayo"</string>
@@ -47,11 +47,11 @@
<string name="bluetooth_tethered" msgid="7094101612161133267">"Ukusebenzisa i-Bluetooth njengemodemu"</string>
<string name="status_bar_input_method_settings_configure_input_methods" msgid="3504292471512317827">"Izilungiselelo zezindlela zokufakwayo"</string>
<string name="status_bar_use_physical_keyboard" msgid="7551903084416057810">"Ukwakheka kwekhibhodi"</string>
- <string name="usb_device_permission_prompt" msgid="834698001271562057">"Vumela insiza <xliff:g id="APPLICATION">%1$s</xliff:g> ukuthi ufinyelele ezintweni eziphuma ne-USB?"</string>
- <string name="usb_accessory_permission_prompt" msgid="5171775411178865750">"Vumela insiza <xliff:g id="APPLICATION">%1$s</xliff:g> ukuthi ufinyelele ezintweni eziphuma ne-USB?"</string>
+ <string name="usb_device_permission_prompt" msgid="834698001271562057">"Vumela uhlelo lokusebenza <xliff:g id="APPLICATION">%1$s</xliff:g> ukuthi ufinyelele ezintweni eziphuma ne-USB?"</string>
+ <string name="usb_accessory_permission_prompt" msgid="5171775411178865750">"Vumela uhlelo lokusebenza <xliff:g id="APPLICATION">%1$s</xliff:g> ukuthi ufinyelele ezintweni eziphuma ne-USB?"</string>
<string name="usb_device_confirm_prompt" msgid="5161205258635253206">"Vula <xliff:g id="ACTIVITY">%1$s</xliff:g> uma ledivayisi ye-USB ixhunyiwe?"</string>
<string name="usb_accessory_confirm_prompt" msgid="3808984931830229888">"Vula <xliff:g id="ACTIVITY">%1$s</xliff:g> uma le-accessory ye-USB ixhunyiwe"</string>
- <string name="usb_accessory_uri_prompt" msgid="513450621413733343">"Azikho izinsiza ezisebenze ngezinto ze-USB. Funda okwengeziwe ngale into kwi <xliff:g id="URL">%1$s</xliff:g>"</string>
+ <string name="usb_accessory_uri_prompt" msgid="513450621413733343">"Azikho izinhlelo zokusebenza ezisebenze ngezinto ze-USB. Funda okwengeziwe ngale into kwi <xliff:g id="URL">%1$s</xliff:g>"</string>
<string name="title_usb_accessory" msgid="4966265263465181372">"ama-accessory e-USB"</string>
<string name="label_view" msgid="6304565553218192990">"Buka"</string>
<string name="always_use_device" msgid="1450287437017315906">"Sebenzisa ngokuzenzakalelayo yale divayisi ye-USB"</string>
@@ -61,8 +61,6 @@
<string name="usb_debugging_always" msgid="303335496705863070">"Hlala uvumela njalo kusuka kule khompyutha"</string>
<string name="compat_mode_on" msgid="6623839244840638213">"Sondeza ukugcwalisa isikrini"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Nweba ukugcwalisa isikrini"</string>
- <string name="compat_mode_help_header" msgid="7969493989397529910">"Ukuhambelana Kokusondeza"</string>
- <string name="compat_mode_help_body" msgid="4946726776359270040">"Uma uhlelo lokusebenza lwenzelwe isikrini ezincane, isilawuli sokusondeza sizovela ngakuyiwashi."</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"Ilondoloz umfanekiso weskrini..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"Ilondoloz umfanekiso weskrini..."</string>
<string name="screenshot_saving_text" msgid="2419718443411738818">"Umfanekiso weskrini uyalondolozwa."</string>
@@ -73,11 +71,13 @@
<string name="usb_preference_title" msgid="6551050377388882787">"Okukhethwa kokudluliswa kwefayela ye-USB"</string>
<string name="use_mtp_button_title" msgid="4333504413563023626">"Lengisa njengesidlali semediya (MTP)"</string>
<string name="use_ptp_button_title" msgid="7517127540301625751">"Lengisa ikhamera (PTP)"</string>
- <string name="installer_cd_button_title" msgid="2312667578562201583">"Faka insiza yokudluliswa Kwefayela ye-Android kwi-Mac"</string>
+ <string name="installer_cd_button_title" msgid="2312667578562201583">"Faka uhlelo lokusebenza yokudluliswa Kwefayela ye-Android kwi-Mac"</string>
<string name="accessibility_back" msgid="567011538994429120">"Emuva"</string>
<string name="accessibility_home" msgid="8217216074895377641">"Ekhaya"</string>
<string name="accessibility_menu" msgid="316839303324695949">"Imenyu"</string>
<string name="accessibility_recent" msgid="8571350598987952883">"Izinhlelo zokusebenza zakamuva"</string>
+ <string name="accessibility_search_light" msgid="1103867596330271848">"Sesha"</string>
+ <string name="accessibility_camera_button" msgid="8064671582820358152">"Ikhamela"</string>
<string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Vula indlela yokungena yenkinobho"</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Inkinobho evumelekile yokusondeza"</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Sondeza kancane esikrinini esikhudlwana"</string>
@@ -153,6 +153,7 @@
<string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"Ibhethri <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_airplane" msgid="4196876722090224753">"Imodi yendiza <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="5749054971341882340">"I-Bluetooth <xliff:g id="STATE">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_location" msgid="4577282329866813100">"Indawo i-<xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"I-alamu isethiwe ngo-<xliff:g id="TIME">%s</xliff:g>."</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"idatha ye-2G-3G ivimbelwe"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"Idatha ye-4G ivimbelwe"</string>
@@ -164,12 +165,13 @@
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"I-Wi-Fi ixhunyiwe"</string>
<string name="gps_notification_searching_text" msgid="8574247005642736060">"Isesha i-GPS"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"Indawo ihlelwe i-GPS"</string>
+ <string name="accessibility_location_active" msgid="2427290146138169014">"Izicelo zendawo ziyasebenza"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"Susa zonke izaziso."</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Ulwazi lohlelo lokusebenza"</string>
<string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Isikrini sizophenduka ngokuzenzakalela."</string>
<string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Isikrini sikhiyelwe ngomumo we-landscape."</string>
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Isikrini sikhiyelwe ngomumo we-portrait."</string>
- <string name="jelly_bean_dream_name" msgid="5992026543636816792">"I-BeanFlinger"</string>
+ <string name="dessert_case" msgid="1295161776223959221">"Isikhwama soswidi"</string>
<string name="start_dreams" msgid="7219575858348719790">"Ukuphupha emini"</string>
<string name="ethernet_label" msgid="7967563676324087464">"I-Ethernet"</string>
<string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Isimo sendiza"</string>
@@ -198,8 +200,8 @@
<string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Ukubonisa okungenazintambo"</string>
<string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Ukugqama"</string>
<string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"OKUZENZAKALELAYO"</string>
- <string name="status_bar_help_title" msgid="1199237744086469217">"Izaziso zivela lapha"</string>
- <string name="status_bar_help_text" msgid="7874607155052076323">"Kufinyelele noma kunini ngokuswayiphela phansi.\nSwayiphela phansi futhi ngezilawuli zesistimu."</string>
- <string name="hideybar_confirmation_message" msgid="9050869548951044371">"Swayipha unqenqema wesikrini ukuze uveze ibha"</string>
- <string name="hideybar_confirmation_message_long" msgid="7117692795163620626">"Swayipha kusukela kunqenqema ukuze uveze ibha yesistimu"</string>
+ <string name="quick_settings_inversion_label" msgid="1666358784283020762">"Imodi yokuguqulwa kombala"</string>
+ <string name="quick_settings_contrast_label" msgid="3319507551689108692">"Imodi ethuthukisiwe yokugqama"</string>
+ <string name="quick_settings_color_space_label" msgid="853443689745584770">"Imodi yokulungisa umbala"</string>
+ <string name="ssl_ca_cert_warning" msgid="9005954106902053641">"Kungenzeka inethiwekhi\niqashiwe"</string>
</resources>
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index e6fcdff..556a146 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -498,6 +498,12 @@
<string name="quick_settings_brightness_dialog_title">Brightness</string>
<!-- QuickSettings: Brightness dialog auto brightness button [CHAR LIMIT=NONE] -->
<string name="quick_settings_brightness_dialog_auto_brightness_label">AUTO</string>
+ <!-- QuickSettings: Label for the toggle that controls whether display inversion is enabled. [CHAR LIMIT=NONE] -->
+ <string name="quick_settings_inversion_label">Color inversion mode</string>
+ <!-- QuickSettings: Label for the toggle that controls whether display contrast enhancement is enabled. [CHAR LIMIT=NONE] -->
+ <string name="quick_settings_contrast_label">Enhanced contrast mode</string>
+ <!-- QuickSettings: Label for the toggle that controls whether display color correction is enabled. [CHAR LIMIT=NONE] -->
+ <string name="quick_settings_color_space_label">Color correction mode</string>
<!-- Glyph to be overlaid atop the battery when the level is extremely low. Do not translate. -->
diff --git a/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java b/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java
index 4b0c2cb..c7f4828 100644
--- a/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java
+++ b/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java
@@ -471,7 +471,7 @@ public class ImageWallpaper extends WallpaperService {
checkGlError();
- if (w < 0 || h < 0) {
+ if (w > 0 || h > 0) {
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettings.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettings.java
index 37504fb..112780b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettings.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettings.java
@@ -25,6 +25,7 @@ import android.app.admin.DevicePolicyManager;
import android.bluetooth.BluetoothAdapter;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
+import android.content.ContentResolver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
@@ -84,6 +85,7 @@ class QuickSettings {
static final boolean DEBUG_GONE_TILES = false;
private static final String TAG = "QuickSettings";
public static final boolean SHOW_IME_TILE = false;
+ public static final boolean SHOW_ACCESSIBILITY_TILES = true;
public static final boolean LONG_PRESS_TOGGLES = true;
@@ -371,6 +373,35 @@ class QuickSettings {
new QuickSettingsModel.BasicRefreshCallback(settingsTile));
parent.addView(settingsTile);
mDynamicSpannedTiles.add(settingsTile);
+
+ if (SHOW_ACCESSIBILITY_TILES) {
+ // Color inversion tile
+ final SystemSettingTile inversionTile = new SystemSettingTile(mContext);
+ inversionTile.setUri(Settings.Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED,
+ SystemSettingTile.TYPE_SECURE);
+ inversionTile.setFragment("Settings$AccessibilityInversionSettingsActivity");
+ mModel.addInversionTile(inversionTile, inversionTile.getRefreshCallback());
+ parent.addView(inversionTile);
+ mDynamicSpannedTiles.add(inversionTile);
+
+ // Contrast enhancement tile
+ final SystemSettingTile contrastTile = new SystemSettingTile(mContext);
+ contrastTile.setUri(Settings.Secure.ACCESSIBILITY_DISPLAY_CONTRAST_ENABLED,
+ SystemSettingTile.TYPE_SECURE);
+ contrastTile.setFragment("Settings$AccessibilityContrastSettingsActivity");
+ mModel.addContrastTile(contrastTile, contrastTile.getRefreshCallback());
+ parent.addView(contrastTile);
+ mDynamicSpannedTiles.add(contrastTile);
+
+ // Color space adjustment tile
+ final SystemSettingTile colorSpaceTile = new SystemSettingTile(mContext);
+ colorSpaceTile.setUri(Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED,
+ SystemSettingTile.TYPE_SECURE);
+ colorSpaceTile.setFragment("Settings$AccessibilityDaltonizerSettingsActivity");
+ mModel.addColorSpaceTile(colorSpaceTile, colorSpaceTile.getRefreshCallback());
+ parent.addView(colorSpaceTile);
+ mDynamicSpannedTiles.add(colorSpaceTile);
+ }
}
private void addSystemTiles(ViewGroup parent, LayoutInflater inflater) {
@@ -916,4 +947,108 @@ class QuickSettings {
}
}
}
+
+ /**
+ * Quick Setting tile that represents a secure setting. This type of tile
+ * can toggle a URI within Settings.Secure on click and launch a Settings
+ * fragment on long-click.
+ */
+ public class SystemSettingTile extends QuickSettingsBasicTile {
+ private static final int TYPE_GLOBAL = 0;
+ private static final int TYPE_SECURE = 1;
+ private static final int TYPE_SYSTEM = 2;
+
+ private final QuickSettingsModel.BasicRefreshCallback mRefreshCallback;
+
+ private String mFragment;
+ private String mName;
+ private int mType;
+
+ public SystemSettingTile(Context context) {
+ super(context);
+
+ mRefreshCallback = new QuickSettingsModel.BasicRefreshCallback(this);
+ mRefreshCallback.setShowWhenEnabled(true);
+ }
+
+ @Override
+ public boolean performLongClick() {
+ if (mFragment != null) {
+ collapsePanels();
+
+ final Intent intent = new Intent();
+ intent.setComponent(new ComponentName(
+ "com.android.settings", "com.android.settings." + mFragment));
+ startSettingsActivity(intent);
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public boolean performClick() {
+ if (mName != null) {
+ collapsePanels();
+
+ final ContentResolver cr = mContext.getContentResolver();
+ switch (mType) {
+ case TYPE_GLOBAL: {
+ final boolean enable = Settings.Global.getInt(cr, mName, 0) == 0;
+ Settings.Global.putInt(cr, mName, enable ? 1 : 0);
+ } break;
+ case TYPE_SECURE: {
+ final boolean enable = Settings.Secure.getIntForUser(
+ cr, mName, 0, UserHandle.USER_CURRENT) == 0;
+ Settings.Secure.putIntForUser(
+ cr, mName, enable ? 1 : 0, UserHandle.USER_CURRENT);
+ } break;
+ case TYPE_SYSTEM: {
+ final boolean enable = Settings.System.getIntForUser(
+ cr, mName, 0, UserHandle.USER_CURRENT) == 0;
+ Settings.System.putIntForUser(
+ cr, mName, enable ? 1 : 0, UserHandle.USER_CURRENT);
+ } break;
+ }
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Specifies the fragment within the com.android.settings package to
+ * launch when this tile is long-clicked.
+ *
+ * @param fragment a fragment name within the com.android.settings
+ * package
+ */
+ public void setFragment(String fragment) {
+ mFragment = fragment;
+ setLongClickable(fragment != null);
+ }
+
+ /**
+ * Specifies the setting name and type to toggle when this tile is
+ * clicked.
+ *
+ * @param name a setting name
+ * @param type the type of setting, one of:
+ * <ul>
+ * <li>{@link #TYPE_GLOBAL}
+ * <li>{@link #TYPE_SECURE}
+ * <li>{@link #TYPE_SYSTEM}
+ * </ul>
+ */
+ public void setUri(String name, int type) {
+ mName = name;
+ mType = type;
+ setClickable(mName != null);
+ }
+
+ /**
+ * @return the refresh callback for this tile
+ */
+ public QuickSettingsModel.BasicRefreshCallback getRefreshCallback() {
+ return mRefreshCallback;
+ }
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettingsModel.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettingsModel.java
index 15d655c..fa97a11 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettingsModel.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettingsModel.java
@@ -29,6 +29,7 @@ import android.database.ContentObserver;
import android.graphics.drawable.Drawable;
import android.hardware.display.WifiDisplayStatus;
import android.net.ConnectivityManager;
+import android.net.Uri;
import android.os.Handler;
import android.os.UserHandle;
import android.provider.Settings;
@@ -91,6 +92,19 @@ class QuickSettingsModel implements BluetoothStateChangeCallback,
static class BrightnessState extends State {
boolean autoBrightness;
}
+ static class InversionState extends State {
+ boolean toggled;
+ int type;
+ }
+ static class ContrastState extends State {
+ boolean toggled;
+ float contrast;
+ float brightness;
+ }
+ static class ColorSpaceState extends State {
+ boolean toggled;
+ int type;
+ }
public static class BluetoothState extends State {
boolean connected = false;
String stateContentDescription;
@@ -199,12 +213,96 @@ class QuickSettingsModel implements BluetoothStateChangeCallback,
}
}
+ /** ContentObserver to watch display inversion */
+ private class DisplayInversionObserver extends ContentObserver {
+ public DisplayInversionObserver(Handler handler) {
+ super(handler);
+ }
+
+ @Override
+ public void onChange(boolean selfChange) {
+ onInversionChanged();
+ }
+
+ public void startObserving() {
+ final ContentResolver cr = mContext.getContentResolver();
+ cr.unregisterContentObserver(this);
+ cr.registerContentObserver(Settings.Secure.getUriFor(
+ Settings.Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED),
+ false, this, mUserTracker.getCurrentUserId());
+ cr.registerContentObserver(Settings.Secure.getUriFor(
+ Settings.Secure.ACCESSIBILITY_DISPLAY_INVERSION_QUICK_SETTING_ENABLED),
+ false, this, mUserTracker.getCurrentUserId());
+ cr.registerContentObserver(Settings.Secure.getUriFor(
+ Settings.Secure.ACCESSIBILITY_DISPLAY_INVERSION),
+ false, this, mUserTracker.getCurrentUserId());
+ }
+ }
+
+ /** ContentObserver to watch display contrast */
+ private class DisplayContrastObserver extends ContentObserver {
+ public DisplayContrastObserver(Handler handler) {
+ super(handler);
+ }
+
+ @Override
+ public void onChange(boolean selfChange) {
+ onContrastChanged();
+ }
+
+ public void startObserving() {
+ final ContentResolver cr = mContext.getContentResolver();
+ cr.unregisterContentObserver(this);
+ cr.registerContentObserver(Settings.Secure.getUriFor(
+ Settings.Secure.ACCESSIBILITY_DISPLAY_CONTRAST_ENABLED),
+ false, this, mUserTracker.getCurrentUserId());
+ cr.registerContentObserver(Settings.Secure.getUriFor(
+ Settings.Secure.ACCESSIBILITY_DISPLAY_CONTRAST_QUICK_SETTING_ENABLED),
+ false, this, mUserTracker.getCurrentUserId());
+ cr.registerContentObserver(Settings.Secure.getUriFor(
+ Settings.Secure.ACCESSIBILITY_DISPLAY_CONTRAST),
+ false, this, mUserTracker.getCurrentUserId());
+ cr.registerContentObserver(Settings.Secure.getUriFor(
+ Settings.Secure.ACCESSIBILITY_DISPLAY_BRIGHTNESS),
+ false, this, mUserTracker.getCurrentUserId());
+ }
+ }
+
+ /** ContentObserver to watch display color space adjustment */
+ private class DisplayColorSpaceObserver extends ContentObserver {
+ public DisplayColorSpaceObserver(Handler handler) {
+ super(handler);
+ }
+
+ @Override
+ public void onChange(boolean selfChange) {
+ onColorSpaceChanged();
+ }
+
+ public void startObserving() {
+ final ContentResolver cr = mContext.getContentResolver();
+ cr.unregisterContentObserver(this);
+ cr.registerContentObserver(Settings.Secure.getUriFor(
+ Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED),
+ false, this, mUserTracker.getCurrentUserId());
+ cr.registerContentObserver(Settings.Secure.getUriFor(
+ Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_QUICK_SETTING_ENABLED),
+ false, this, mUserTracker.getCurrentUserId());
+ cr.registerContentObserver(Settings.Secure.getUriFor(
+ Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER),
+ false, this, mUserTracker.getCurrentUserId());
+ }
+ }
+
private final Context mContext;
private final Handler mHandler;
private final CurrentUserTracker mUserTracker;
private final NextAlarmObserver mNextAlarmObserver;
private final BugreportObserver mBugreportObserver;
private final BrightnessObserver mBrightnessObserver;
+ private final DisplayInversionObserver mInversionObserver;
+ private final DisplayContrastObserver mContrastObserver;
+ private final DisplayColorSpaceObserver mColorSpaceObserver;
private final boolean mHasMobileData;
@@ -260,6 +358,18 @@ class QuickSettingsModel implements BluetoothStateChangeCallback,
private RefreshCallback mBrightnessCallback;
private BrightnessState mBrightnessState = new BrightnessState();
+ private QuickSettingsTileView mInversionTile;
+ private RefreshCallback mInversionCallback;
+ private InversionState mInversionState = new InversionState();
+
+ private QuickSettingsTileView mContrastTile;
+ private RefreshCallback mContrastCallback;
+ private ContrastState mContrastState = new ContrastState();
+
+ private QuickSettingsTileView mColorSpaceTile;
+ private RefreshCallback mColorSpaceCallback;
+ private ColorSpaceState mColorSpaceState = new ColorSpaceState();
+
private QuickSettingsTileView mBugreportTile;
private RefreshCallback mBugreportCallback;
private State mBugreportState = new State();
@@ -278,10 +388,17 @@ class QuickSettingsModel implements BluetoothStateChangeCallback,
mContext = context;
mHandler = new Handler();
mUserTracker = new CurrentUserTracker(mContext) {
+ @Override
public void onUserSwitched(int newUserId) {
mBrightnessObserver.startObserving();
+ mInversionObserver.startObserving();
+ mContrastObserver.startObserving();
+ mColorSpaceObserver.startObserving();
refreshRotationLockTile();
onBrightnessLevelChanged();
+ onInversionChanged();
+ onContrastChanged();
+ onColorSpaceChanged();
onNextAlarmChanged();
onBugreportChanged();
}
@@ -293,6 +410,12 @@ class QuickSettingsModel implements BluetoothStateChangeCallback,
mBugreportObserver.startObserving();
mBrightnessObserver = new BrightnessObserver(mHandler);
mBrightnessObserver.startObserving();
+ mInversionObserver = new DisplayInversionObserver(mHandler);
+ mInversionObserver.startObserving();
+ mContrastObserver = new DisplayContrastObserver(mHandler);
+ mContrastObserver.startObserving();
+ mColorSpaceObserver = new DisplayColorSpaceObserver(mHandler);
+ mColorSpaceObserver.startObserving();
ConnectivityManager cm = (ConnectivityManager)
context.getSystemService(Context.CONNECTIVITY_SERVICE);
@@ -779,6 +902,90 @@ class QuickSettingsModel implements BluetoothStateChangeCallback,
onBrightnessLevelChanged();
}
+ // Color inversion
+ void addInversionTile(QuickSettingsTileView view, RefreshCallback cb) {
+ mInversionTile = view;
+ mInversionCallback = cb;
+ onInversionChanged();
+ }
+ public void onInversionChanged() {
+ final Resources res = mContext.getResources();
+ final ContentResolver cr = mContext.getContentResolver();
+ final int currentUserId = mUserTracker.getCurrentUserId();
+ final boolean quickSettingEnabled = Settings.Secure.getIntForUser(
+ cr, Settings.Secure.ACCESSIBILITY_DISPLAY_INVERSION_QUICK_SETTING_ENABLED, 0,
+ currentUserId) == 1;
+ final boolean enabled = Settings.Secure.getIntForUser(
+ cr, Settings.Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED, 0, currentUserId) == 1;
+ final int type = Settings.Secure.getIntForUser(
+ cr, Settings.Secure.ACCESSIBILITY_DISPLAY_INVERSION, 0, currentUserId);
+ mInversionState.enabled = quickSettingEnabled;
+ mInversionState.toggled = enabled;
+ mInversionState.type = type;
+ // TODO: Add real icon assets.
+ mInversionState.iconId = enabled ? R.drawable.ic_qs_bluetooth_on
+ : R.drawable.ic_qs_bluetooth_off;
+ mInversionState.label = res.getString(R.string.quick_settings_inversion_label);
+ mInversionCallback.refreshView(mInversionTile, mInversionState);
+ }
+
+ // Contrast enhancement
+ void addContrastTile(QuickSettingsTileView view, RefreshCallback cb) {
+ mContrastTile = view;
+ mContrastCallback = cb;
+ onContrastChanged();
+ }
+ public void onContrastChanged() {
+ final Resources res = mContext.getResources();
+ final ContentResolver cr = mContext.getContentResolver();
+ final int currentUserId = mUserTracker.getCurrentUserId();
+ final boolean quickSettingEnabled = Settings.Secure.getIntForUser(
+ cr, Settings.Secure.ACCESSIBILITY_DISPLAY_CONTRAST_QUICK_SETTING_ENABLED, 0,
+ currentUserId) == 1;
+ final boolean enabled = Settings.Secure.getIntForUser(
+ cr, Settings.Secure.ACCESSIBILITY_DISPLAY_CONTRAST_ENABLED, 0, currentUserId) == 1;
+ final float contrast = Settings.Secure.getFloatForUser(
+ cr, Settings.Secure.ACCESSIBILITY_DISPLAY_CONTRAST, 1, currentUserId);
+ final float brightness = Settings.Secure.getFloatForUser(
+ cr, Settings.Secure.ACCESSIBILITY_DISPLAY_BRIGHTNESS, 0, currentUserId);
+ mContrastState.enabled = quickSettingEnabled;
+ mContrastState.toggled = enabled;
+ mContrastState.contrast = contrast;
+ mContrastState.brightness = brightness;
+ // TODO: Add real icon assets.
+ mContrastState.iconId = enabled ? R.drawable.ic_qs_bluetooth_on
+ : R.drawable.ic_qs_bluetooth_off;
+ mContrastState.label = res.getString(R.string.quick_settings_contrast_label);
+ mContrastCallback.refreshView(mContrastTile, mContrastState);
+ }
+
+ // Color space adjustment
+ void addColorSpaceTile(QuickSettingsTileView view, RefreshCallback cb) {
+ mColorSpaceTile = view;
+ mColorSpaceCallback = cb;
+ onColorSpaceChanged();
+ }
+ public void onColorSpaceChanged() {
+ final Resources res = mContext.getResources();
+ final ContentResolver cr = mContext.getContentResolver();
+ final int currentUserId = mUserTracker.getCurrentUserId();
+ final boolean quickSettingEnabled = Settings.Secure.getIntForUser(
+ cr, Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_QUICK_SETTING_ENABLED, 0,
+ currentUserId) == 1;
+ final boolean enabled = Settings.Secure.getIntForUser(cr,
+ Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED, 0, currentUserId) == 1;
+ final int type = Settings.Secure.getIntForUser(
+ cr, Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER, 0, currentUserId);
+ mColorSpaceState.enabled = quickSettingEnabled;
+ mColorSpaceState.toggled = enabled;
+ mColorSpaceState.type = type;
+ // TODO: Add real icon assets.
+ mColorSpaceState.iconId = enabled ? R.drawable.ic_qs_bluetooth_on
+ : R.drawable.ic_qs_bluetooth_off;
+ mColorSpaceState.label = res.getString(R.string.quick_settings_color_space_label);
+ mColorSpaceCallback.refreshView(mColorSpaceTile, mColorSpaceState);
+ }
+
// SSL CA Cert warning.
public void addSslCaCertWarningTile(QuickSettingsTileView view, RefreshCallback cb) {
mSslCaCertWarningTile = view;
diff --git a/packages/VpnDialogs/res/values-ar/strings.xml b/packages/VpnDialogs/res/values-ar/strings.xml
index 2380fa2..bf83a41 100644
--- a/packages/VpnDialogs/res/values-ar/strings.xml
+++ b/packages/VpnDialogs/res/values-ar/strings.xml
@@ -16,10 +16,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="prompt" msgid="8359175999006833462">"يحاول <xliff:g id="APP">%s</xliff:g> إنشاء اتصال شبكة ظاهرية خاصة (VPN)."</string>
+ <string name="prompt" msgid="8359175999006833462">"â€ÙŠØ­Ø§ÙˆÙ„ <xliff:g id="APP">%s</xliff:g> إنشاء اتصال شبكة ظاهرية خاصة (VPN)."</string>
<string name="warning" msgid="5470743576660160079">"تعد المتابعة بمثابة إذن للتطبيق باعتراض جميع حركات مرور البيانات عبر الشبكة. "<b>"\"لا\" تواÙÙ‚ إلا إذا كنت تثق ÙÙŠ التطبيق."</b>" وإلا Ùقد تتعرض بياناتك لخطورة الاختراق بواسطة برامج ضارة."</string>
<string name="accept" msgid="2889226408765810173">"أثق ÙÙŠ هذا التطبيق."</string>
- <string name="legacy_title" msgid="192936250066580964">"VPN متصلة"</string>
+ <string name="legacy_title" msgid="192936250066580964">"â€VPN متصلة"</string>
<string name="configure" msgid="4905518375574791375">"تهيئة"</string>
<string name="disconnect" msgid="971412338304200056">"قطع الاتصال"</string>
<string name="session" msgid="6470628549473641030">"الجلسة"</string>
diff --git a/packages/VpnDialogs/res/values-az-rAZ/strings.xml b/packages/VpnDialogs/res/values-az-rAZ/strings.xml
new file mode 100644
index 0000000..fdeb06f
--- /dev/null
+++ b/packages/VpnDialogs/res/values-az-rAZ/strings.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="prompt" msgid="8359175999006833462">"VPN bağlantısı yaratmaq üçün <xliff:g id="APP">%s</xliff:g> cəhdləri."</string>
+ <string name="warning" msgid="5470743576660160079">"Bunu hÉ™yata keçirmÉ™klÉ™, siz tÉ™tbiqÉ™ bütün ÅŸÉ™bÉ™kÉ™ hÉ™rÉ™kÉ™tinÉ™ qarışmaÄŸa icazÉ™ verirsiniz. "<b>" TÉ™tbiqÉ™ güvÉ™nmirsizsÉ™ qÉ™bul etmÉ™yin. "</b>" Æks halda, datanızın tÉ™hlükÉ™li proqramlar tÉ™rÉ™findÉ™n É™lÉ™ keçirilmÉ™ riskini alırsınız."</string>
+ <string name="accept" msgid="2889226408765810173">"Bu tətbiqə güvənirəm."</string>
+ <string name="legacy_title" msgid="192936250066580964">"VPN qoÅŸuludur"</string>
+ <string name="configure" msgid="4905518375574791375">"Konfiqurasiya edin"</string>
+ <string name="disconnect" msgid="971412338304200056">"ÆlaqÉ™ni kÉ™s"</string>
+ <string name="session" msgid="6470628549473641030">"Sessiya:"</string>
+ <string name="duration" msgid="3584782459928719435">"Müddət:"</string>
+ <string name="data_transmitted" msgid="7988167672982199061">"Göndərilən:"</string>
+ <string name="data_received" msgid="4062776929376067820">"Qəbul edilən:"</string>
+ <string name="data_value_format" msgid="2192466557826897580">"<xliff:g id="NUMBER_0">%1$s</xliff:g> bayt / <xliff:g id="NUMBER_1">%2$s</xliff:g> paket"</string>
+</resources>
diff --git a/packages/VpnDialogs/res/values-az/strings.xml b/packages/VpnDialogs/res/values-az/strings.xml
new file mode 100644
index 0000000..fdeb06f
--- /dev/null
+++ b/packages/VpnDialogs/res/values-az/strings.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="prompt" msgid="8359175999006833462">"VPN bağlantısı yaratmaq üçün <xliff:g id="APP">%s</xliff:g> cəhdləri."</string>
+ <string name="warning" msgid="5470743576660160079">"Bunu hÉ™yata keçirmÉ™klÉ™, siz tÉ™tbiqÉ™ bütün ÅŸÉ™bÉ™kÉ™ hÉ™rÉ™kÉ™tinÉ™ qarışmaÄŸa icazÉ™ verirsiniz. "<b>" TÉ™tbiqÉ™ güvÉ™nmirsizsÉ™ qÉ™bul etmÉ™yin. "</b>" Æks halda, datanızın tÉ™hlükÉ™li proqramlar tÉ™rÉ™findÉ™n É™lÉ™ keçirilmÉ™ riskini alırsınız."</string>
+ <string name="accept" msgid="2889226408765810173">"Bu tətbiqə güvənirəm."</string>
+ <string name="legacy_title" msgid="192936250066580964">"VPN qoÅŸuludur"</string>
+ <string name="configure" msgid="4905518375574791375">"Konfiqurasiya edin"</string>
+ <string name="disconnect" msgid="971412338304200056">"ÆlaqÉ™ni kÉ™s"</string>
+ <string name="session" msgid="6470628549473641030">"Sessiya:"</string>
+ <string name="duration" msgid="3584782459928719435">"Müddət:"</string>
+ <string name="data_transmitted" msgid="7988167672982199061">"Göndərilən:"</string>
+ <string name="data_received" msgid="4062776929376067820">"Qəbul edilən:"</string>
+ <string name="data_value_format" msgid="2192466557826897580">"<xliff:g id="NUMBER_0">%1$s</xliff:g> bayt / <xliff:g id="NUMBER_1">%2$s</xliff:g> paket"</string>
+</resources>
diff --git a/packages/VpnDialogs/res/values-en-rIN/strings.xml b/packages/VpnDialogs/res/values-en-rIN/strings.xml
new file mode 100644
index 0000000..afc46d8
--- /dev/null
+++ b/packages/VpnDialogs/res/values-en-rIN/strings.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="prompt" msgid="8359175999006833462">"<xliff:g id="APP">%s</xliff:g> attempts to create a VPN connection."</string>
+ <string name="warning" msgid="5470743576660160079">"By proceeding, you are giving the application permission to intercept all network traffic. "<b>"Do NOT accept unless you trust the application."</b>" Otherwise, you run the risk of having your data compromised by malicious software."</string>
+ <string name="accept" msgid="2889226408765810173">"I trust this application."</string>
+ <string name="legacy_title" msgid="192936250066580964">"VPN is connected"</string>
+ <string name="configure" msgid="4905518375574791375">"Configure"</string>
+ <string name="disconnect" msgid="971412338304200056">"Disconnect"</string>
+ <string name="session" msgid="6470628549473641030">"Session:"</string>
+ <string name="duration" msgid="3584782459928719435">"Duration:"</string>
+ <string name="data_transmitted" msgid="7988167672982199061">"Sent:"</string>
+ <string name="data_received" msgid="4062776929376067820">"Received:"</string>
+ <string name="data_value_format" msgid="2192466557826897580">"<xliff:g id="NUMBER_0">%1$s</xliff:g> bytes / <xliff:g id="NUMBER_1">%2$s</xliff:g> packets"</string>
+</resources>
diff --git a/packages/VpnDialogs/res/values-et-rEE/strings.xml b/packages/VpnDialogs/res/values-et-rEE/strings.xml
new file mode 100644
index 0000000..c016eb0
--- /dev/null
+++ b/packages/VpnDialogs/res/values-et-rEE/strings.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="prompt" msgid="8359175999006833462">"Rakenduse <xliff:g id="APP">%s</xliff:g> katsed luua VPN-ühendust."</string>
+ <string name="warning" msgid="5470743576660160079">"Jätkates annate rakendusele loa jälgida kogu võrguliiklust. "<b>"ÄRGE nõustuge, kui te seda rakendust ei usalda."</b>" Vastasel juhul on oht, et pahavara võib kahjustada teie andmeid."</string>
+ <string name="accept" msgid="2889226408765810173">"Usaldan seda rakendust."</string>
+ <string name="legacy_title" msgid="192936250066580964">"VPN on ühendatud"</string>
+ <string name="configure" msgid="4905518375574791375">"Seadistamine"</string>
+ <string name="disconnect" msgid="971412338304200056">"Katkesta ühendus"</string>
+ <string name="session" msgid="6470628549473641030">"Seansid"</string>
+ <string name="duration" msgid="3584782459928719435">"Kestus:"</string>
+ <string name="data_transmitted" msgid="7988167672982199061">"Saadetud:"</string>
+ <string name="data_received" msgid="4062776929376067820">"Vastu on võetud:"</string>
+ <string name="data_value_format" msgid="2192466557826897580">"<xliff:g id="NUMBER_0">%1$s</xliff:g> baiti / <xliff:g id="NUMBER_1">%2$s</xliff:g> paketti"</string>
+</resources>
diff --git a/packages/VpnDialogs/res/values-fa/strings.xml b/packages/VpnDialogs/res/values-fa/strings.xml
index ec163af..7c0aafe 100644
--- a/packages/VpnDialogs/res/values-fa/strings.xml
+++ b/packages/VpnDialogs/res/values-fa/strings.xml
@@ -16,10 +16,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="prompt" msgid="8359175999006833462">"<xliff:g id="APP">%s</xliff:g> تلاش می‌کند یک اتصال VPN ایجاد کند."</string>
+ <string name="prompt" msgid="8359175999006833462">"â€<xliff:g id="APP">%s</xliff:g> تلاش می‌کند یک اتصال VPN ایجاد کند."</string>
<string name="warning" msgid="5470743576660160079">"با ادامه دادن، به برنامهٔ کاربردی اجازه می‌دهید تمام تراÙیک شبکه را رهگیری کند. "<b>"تا به برنامه اعتماد نکردید آن را قبول نکنید."</b>" در غیر این صورت، این ریسک را قبول می‌کنید Ú©Ù‡ داده‌های شما توسط یک Ù†Ø±Ù…â€ŒØ§ÙØ²Ø§Ø± مخرب به خطر Ø¨ÛŒÙØªØ¯."</string>
<string name="accept" msgid="2889226408765810173">"من به این برنامه اعتماد دارم."</string>
- <string name="legacy_title" msgid="192936250066580964">"VPN متصل است"</string>
+ <string name="legacy_title" msgid="192936250066580964">"â€VPN متصل است"</string>
<string name="configure" msgid="4905518375574791375">"پیکربندی"</string>
<string name="disconnect" msgid="971412338304200056">"قطع اتصال"</string>
<string name="session" msgid="6470628549473641030">"جلسه:"</string>
diff --git a/packages/VpnDialogs/res/values-fr-rCA/strings.xml b/packages/VpnDialogs/res/values-fr-rCA/strings.xml
new file mode 100644
index 0000000..1028f83
--- /dev/null
+++ b/packages/VpnDialogs/res/values-fr-rCA/strings.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="prompt" msgid="8359175999006833462">"<xliff:g id="APP">%s</xliff:g> tente de créer une connexion VPN."</string>
+ <string name="warning" msgid="5470743576660160079">"En continuant, vous autorisez l\'application à intercepter l\'ensemble du trafic réseau. "<b>"N\'acceptez PAS, sauf si vous avez confiance en l\'application."</b>"Sinon, vos données risquent d\'être piratées par un logiciel malveillant."</string>
+ <string name="accept" msgid="2889226408765810173">"J\'ai confiance en cette application."</string>
+ <string name="legacy_title" msgid="192936250066580964">"VPN connecté"</string>
+ <string name="configure" msgid="4905518375574791375">"Configurer"</string>
+ <string name="disconnect" msgid="971412338304200056">"Déconnecter"</string>
+ <string name="session" msgid="6470628549473641030">"Session :"</string>
+ <string name="duration" msgid="3584782459928719435">"Durée :"</string>
+ <string name="data_transmitted" msgid="7988167672982199061">"Date d\'envoi :"</string>
+ <string name="data_received" msgid="4062776929376067820">"Reçu le :"</string>
+ <string name="data_value_format" msgid="2192466557826897580">"<xliff:g id="NUMBER_0">%1$s</xliff:g> octets / <xliff:g id="NUMBER_1">%2$s</xliff:g> paquets"</string>
+</resources>
diff --git a/packages/VpnDialogs/res/values-hi/strings.xml b/packages/VpnDialogs/res/values-hi/strings.xml
index e2cb51a..b570a6d 100644
--- a/packages/VpnDialogs/res/values-hi/strings.xml
+++ b/packages/VpnDialogs/res/values-hi/strings.xml
@@ -17,8 +17,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="prompt" msgid="8359175999006833462">"<xliff:g id="APP">%s</xliff:g> à¤à¤• VPN कनेकà¥â€à¤¶à¤¨ बनाने का पà¥à¤°à¤¯à¤¾à¤¸ करता है."</string>
- <string name="warning" msgid="5470743576660160079">"जारी रखकर, आप à¤à¤ªà¥à¤²à¤¿à¤•ेशन को सभी नेटवरà¥à¤• टà¥à¤°à¥ˆà¤«à¤¼à¤¿à¤• अवरोधित करने की अनà¥à¤®à¤¤à¤¿ देते हैं. "<b>"जब तक आपको à¤à¤ªà¥à¤²à¤¿à¤•ेशन पर विशà¥à¤µà¤¾à¤¸ न हो सà¥â€à¤µà¥€à¤•ार न करें."</b>" अनà¥â€à¤¯à¤¥à¤¾, आपको अपने डेटा के साथ किसी दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ सॉफ़à¥à¤Ÿà¤µà¥‡à¤¯à¤° दà¥à¤µà¤¾à¤°à¤¾ छेड़छाड़ किठजाने का जोखिम हो सकता है."</string>
- <string name="accept" msgid="2889226408765810173">"मà¥à¤à¥‡ इस à¤à¤ªà¥à¤²à¤¿à¤•ेशन पर विशà¥à¤µà¤¾à¤¸ है."</string>
+ <string name="warning" msgid="5470743576660160079">"जारी रखकर, आप à¤à¤ªà¥à¤¸ को सभी नेटवरà¥à¤• टà¥à¤°à¥ˆà¤«à¤¼à¤¿à¤• अवरोधित करने की अनà¥à¤®à¤¤à¤¿ देते हैं. "<b>"जब तक आपको à¤à¤ªà¥à¤¸ पर विशà¥à¤µà¤¾à¤¸ न हो सà¥â€à¤µà¥€à¤•ार न करें."</b>" अनà¥â€à¤¯à¤¥à¤¾, आपको अपने डेटा के साथ किसी दà¥à¤°à¥à¤­à¤¾à¤µà¤¨à¤¾à¤ªà¥‚रà¥à¤£ सॉफ़à¥à¤Ÿà¤µà¥‡à¤¯à¤° दà¥à¤µà¤¾à¤°à¤¾ छेड़छाड़ किठजाने का जोखिम हो सकता है."</string>
+ <string name="accept" msgid="2889226408765810173">"मà¥à¤à¥‡ इस à¤à¤ªà¥à¤¸ पर विशà¥à¤µà¤¾à¤¸ है."</string>
<string name="legacy_title" msgid="192936250066580964">"VPN कनेकà¥â€à¤Ÿ है"</string>
<string name="configure" msgid="4905518375574791375">"कॉनà¥à¤«à¤¼à¤¿à¤—र करें"</string>
<string name="disconnect" msgid="971412338304200056">"डिसà¥â€à¤•नेकà¥â€à¤Ÿ करें"</string>
diff --git a/packages/VpnDialogs/res/values-hy-rAM/strings.xml b/packages/VpnDialogs/res/values-hy-rAM/strings.xml
new file mode 100644
index 0000000..85db579
--- /dev/null
+++ b/packages/VpnDialogs/res/values-hy-rAM/strings.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="prompt" msgid="8359175999006833462">"<xliff:g id="APP">%s</xliff:g>-Õ¨ ÖƒÕ¸Ö€Õ±Õ¸Ö‚Õ´ Õ§ Õ½Õ¿Õ¥Õ²Õ®Õ¥Õ¬ VPN Õ¯Õ¡Õº:"</string>
+ <string name="warning" msgid="5470743576660160079">"Õ‡Õ¡Ö€Õ¸Ö‚Õ¶Õ¡Õ¯Õ¥Õ¬Õ¸Õ¾` Õ¤Õ¸Ö‚Ö„ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ©Õ¸Ö‚ÕµÕ¬Õ¡Õ¿Ö€Õ¸Ö‚Õ´ Õ¥Ö„ Õ¯Õ¡Õ¶Õ£Õ¶Õ¥ÖÕ¶Õ¥Õ¬ Õ¡Õ´Õ¢Õ¸Õ²Õ» ÖÕ¡Õ¶ÖÕ¡ÕµÕ«Õ¶ Õ·Õ¡Ö€ÕªÕ¨: "<b>"Õ„Õ« Õ¨Õ¶Õ¤Õ¸Ö‚Õ¶Õ¥Ö„, Õ¥Õ©Õ¥ Õ¹Õ¥Ö„ Õ¾Õ½Õ¿Õ¡Õ°Õ¸Ö‚Õ´ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶:"</b>" Ô±ÕµÕ¬Õ¡ÕºÕ¥Õ½ Õ¼Õ«Õ½Õ¯ Õ¯Õ¡ Õ±Õ¥Ö€ Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨ Õ¾Õ¿Õ¡Õ¶Õ£Õ¥Õ¬Õ¸Ö‚ Õ¾Õ¶Õ¡Õ½Õ¡Ö€Õ¡Ö€ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ« Õ¯Õ¸Õ²Õ´Õ«Ö:"</string>
+ <string name="accept" msgid="2889226408765810173">"ÔµÕ½ Õ¾Õ½Õ¿Õ¡Õ°Õ¸Ö‚Õ´ Õ¥Õ´ Õ¡ÕµÕ½ Õ®Ö€Õ¡Õ£Ö€Õ«Õ¶:"</string>
+ <string name="legacy_title" msgid="192936250066580964">"VPN-Õ¨ Õ¯Õ¡ÕºÕ¡Õ¯ÖÕ¾Õ¡Õ® Õ§"</string>
+ <string name="configure" msgid="4905518375574791375">"Ô¿Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¥Õ¬"</string>
+ <string name="disconnect" msgid="971412338304200056">"Ô±Õ¶Õ»Õ¡Õ¿Õ¥Õ¬"</string>
+ <string name="session" msgid="6470628549473641030">"Ô±Õ·Õ­Õ¡Õ¿Õ¡Õ·Ö€Õ»Õ¡Õ¶`"</string>
+ <string name="duration" msgid="3584782459928719435">"ÕÖ‡Õ¸Õ²Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨Õ"</string>
+ <string name="data_transmitted" msgid="7988167672982199061">"ÕˆÖ‚Õ²Õ¡Ö€Õ¯Õ¾Õ¥Õ¬ Õ§Õ"</string>
+ <string name="data_received" msgid="4062776929376067820">"ÕÕ¿Õ¡ÖÕ¾Õ¥Õ¬ Õ§Õ"</string>
+ <string name="data_value_format" msgid="2192466557826897580">"<xliff:g id="NUMBER_0">%1$s</xliff:g> Õ¢Õ¡ÕµÕ© / <xliff:g id="NUMBER_1">%2$s</xliff:g> ÖƒÕ¡Õ©Õ¥Õ©"</string>
+</resources>
diff --git a/packages/VpnDialogs/res/values-hy/strings.xml b/packages/VpnDialogs/res/values-hy/strings.xml
new file mode 100644
index 0000000..85db579
--- /dev/null
+++ b/packages/VpnDialogs/res/values-hy/strings.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="prompt" msgid="8359175999006833462">"<xliff:g id="APP">%s</xliff:g>-Õ¨ ÖƒÕ¸Ö€Õ±Õ¸Ö‚Õ´ Õ§ Õ½Õ¿Õ¥Õ²Õ®Õ¥Õ¬ VPN Õ¯Õ¡Õº:"</string>
+ <string name="warning" msgid="5470743576660160079">"Õ‡Õ¡Ö€Õ¸Ö‚Õ¶Õ¡Õ¯Õ¥Õ¬Õ¸Õ¾` Õ¤Õ¸Ö‚Ö„ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶ Õ©Õ¸Ö‚ÕµÕ¬Õ¡Õ¿Ö€Õ¸Ö‚Õ´ Õ¥Ö„ Õ¯Õ¡Õ¶Õ£Õ¶Õ¥ÖÕ¶Õ¥Õ¬ Õ¡Õ´Õ¢Õ¸Õ²Õ» ÖÕ¡Õ¶ÖÕ¡ÕµÕ«Õ¶ Õ·Õ¡Ö€ÕªÕ¨: "<b>"Õ„Õ« Õ¨Õ¶Õ¤Õ¸Ö‚Õ¶Õ¥Ö„, Õ¥Õ©Õ¥ Õ¹Õ¥Ö„ Õ¾Õ½Õ¿Õ¡Õ°Õ¸Ö‚Õ´ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ«Õ¶:"</b>" Ô±ÕµÕ¬Õ¡ÕºÕ¥Õ½ Õ¼Õ«Õ½Õ¯ Õ¯Õ¡ Õ±Õ¥Ö€ Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨ Õ¾Õ¿Õ¡Õ¶Õ£Õ¥Õ¬Õ¸Ö‚ Õ¾Õ¶Õ¡Õ½Õ¡Ö€Õ¡Ö€ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ« Õ¯Õ¸Õ²Õ´Õ«Ö:"</string>
+ <string name="accept" msgid="2889226408765810173">"ÔµÕ½ Õ¾Õ½Õ¿Õ¡Õ°Õ¸Ö‚Õ´ Õ¥Õ´ Õ¡ÕµÕ½ Õ®Ö€Õ¡Õ£Ö€Õ«Õ¶:"</string>
+ <string name="legacy_title" msgid="192936250066580964">"VPN-Õ¨ Õ¯Õ¡ÕºÕ¡Õ¯ÖÕ¾Õ¡Õ® Õ§"</string>
+ <string name="configure" msgid="4905518375574791375">"Ô¿Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¥Õ¬"</string>
+ <string name="disconnect" msgid="971412338304200056">"Ô±Õ¶Õ»Õ¡Õ¿Õ¥Õ¬"</string>
+ <string name="session" msgid="6470628549473641030">"Ô±Õ·Õ­Õ¡Õ¿Õ¡Õ·Ö€Õ»Õ¡Õ¶`"</string>
+ <string name="duration" msgid="3584782459928719435">"ÕÖ‡Õ¸Õ²Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨Õ"</string>
+ <string name="data_transmitted" msgid="7988167672982199061">"ÕˆÖ‚Õ²Õ¡Ö€Õ¯Õ¾Õ¥Õ¬ Õ§Õ"</string>
+ <string name="data_received" msgid="4062776929376067820">"ÕÕ¿Õ¡ÖÕ¾Õ¥Õ¬ Õ§Õ"</string>
+ <string name="data_value_format" msgid="2192466557826897580">"<xliff:g id="NUMBER_0">%1$s</xliff:g> Õ¢Õ¡ÕµÕ© / <xliff:g id="NUMBER_1">%2$s</xliff:g> ÖƒÕ¡Õ©Õ¥Õ©"</string>
+</resources>
diff --git a/packages/VpnDialogs/res/values-iw/strings.xml b/packages/VpnDialogs/res/values-iw/strings.xml
index bb845ee..335f5e4 100644
--- a/packages/VpnDialogs/res/values-iw/strings.xml
+++ b/packages/VpnDialogs/res/values-iw/strings.xml
@@ -16,10 +16,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="prompt" msgid="8359175999006833462">"<xliff:g id="APP">%s</xliff:g> מנסה ליצור חיבור VPN."</string>
- <string name="warning" msgid="5470743576660160079">"×× ×ª×ž×©×™×š, ×תה מעניק ×œ×™×™×©×•× ×”×¨×©××” לעכב ×ת כל התנועה ברשת. "<b>" ×ל תקבל ××œ× ×× ×›×Ÿ ×תה סומך על היישו×. "</b>" ×חרת, ×תה חושף ×ת ×”× ×ª×•× ×™× ×©×œ×š לסכנה של פגיעה על-ידי תוכנה זדונית."</string>
- <string name="accept" msgid="2889226408765810173">"×× ×™ סומך על ×™×™×©×•× ×–×”."</string>
- <string name="legacy_title" msgid="192936250066580964">"VPN מחובר"</string>
+ <string name="prompt" msgid="8359175999006833462">"â€<xliff:g id="APP">%s</xliff:g> מנסה ליצור חיבור VPN."</string>
+ <string name="warning" msgid="5470743576660160079">"×× ×ª×ž×©×™×š, ×תה מעניק ל×פליקציה הרש××” לעכב ×ת כל התנועה ברשת. "<b>" ×ל תקבל ××œ× ×× ×›×Ÿ ×תה סומך על ×”×פליקציה. "</b>" ×חרת, ×תה חושף ×ת ×”× ×ª×•× ×™× ×©×œ×š לסכנה של פגיעה על-ידי תוכנה זדונית."</string>
+ <string name="accept" msgid="2889226408765810173">"×× ×™ סומך על ×פליקציה זו."</string>
+ <string name="legacy_title" msgid="192936250066580964">"â€VPN מחובר"</string>
<string name="configure" msgid="4905518375574791375">"הגדר"</string>
<string name="disconnect" msgid="971412338304200056">"נתק"</string>
<string name="session" msgid="6470628549473641030">"הפעלה"</string>
diff --git a/packages/VpnDialogs/res/values-ka-rGE/strings.xml b/packages/VpnDialogs/res/values-ka-rGE/strings.xml
new file mode 100644
index 0000000..960d3f6
--- /dev/null
+++ b/packages/VpnDialogs/res/values-ka-rGE/strings.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="prompt" msgid="8359175999006833462">"<xliff:g id="APP">%s</xliff:g> ცდილáƒáƒ‘ს VPN კáƒáƒ•შირის შექმნáƒáƒ¡."</string>
+ <string name="warning" msgid="5470743576660160079">"გáƒáƒ’რძელების შემთხვევáƒáƒ¨áƒ˜, áƒáƒžáƒšáƒ˜áƒ™áƒáƒªáƒ˜áƒáƒ¡ ექნებრქსელში გáƒáƒ“áƒáƒªáƒ”მული მáƒáƒœáƒáƒªáƒ”მების მáƒáƒžáƒáƒ•ების სáƒáƒ¨áƒ£áƒáƒšáƒ”ბáƒ. "<b>"áƒáƒ  გáƒáƒœáƒáƒ’რძáƒáƒ—, თუ áƒáƒ  ენდáƒáƒ‘ით áƒáƒžáƒšáƒ˜áƒ™áƒáƒªáƒ˜áƒáƒ¡."</b>" წინáƒáƒáƒ¦áƒ›áƒ“ეგ შემთვევáƒáƒ¨áƒ˜ შესáƒáƒ«áƒšáƒáƒ მáƒáƒ•ნე პრáƒáƒ’რáƒáƒ›áƒáƒ¡ თქვენ მáƒáƒœáƒáƒªáƒ”მებთáƒáƒœ წვდáƒáƒ›áƒ˜áƒ¡ სáƒáƒ¨áƒ£áƒáƒšáƒ”ბრმიეცეს."</string>
+ <string name="accept" msgid="2889226408765810173">"ვენდáƒáƒ‘ი áƒáƒ› áƒáƒžáƒšáƒ˜áƒ™áƒáƒªáƒ˜áƒáƒ¡."</string>
+ <string name="legacy_title" msgid="192936250066580964">"VPN დáƒáƒ™áƒáƒ•შირებულიáƒ"</string>
+ <string name="configure" msgid="4905518375574791375">"კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ"</string>
+ <string name="disconnect" msgid="971412338304200056">"კáƒáƒ•შირის გáƒáƒ¬áƒ§áƒ•ეტáƒ"</string>
+ <string name="session" msgid="6470628549473641030">"სესიáƒ:"</string>
+ <string name="duration" msgid="3584782459928719435">"ხáƒáƒœáƒ’რძლივáƒáƒ‘áƒ:"</string>
+ <string name="data_transmitted" msgid="7988167672982199061">"გáƒáƒ’ზáƒáƒ•ნილი:"</string>
+ <string name="data_received" msgid="4062776929376067820">"მიღებული:"</string>
+ <string name="data_value_format" msgid="2192466557826897580">"<xliff:g id="NUMBER_0">%1$s</xliff:g> ბáƒáƒ˜áƒ¢áƒ˜ / <xliff:g id="NUMBER_1">%2$s</xliff:g> პáƒáƒ™áƒ”ტი"</string>
+</resources>
diff --git a/packages/VpnDialogs/res/values-ka/strings.xml b/packages/VpnDialogs/res/values-ka/strings.xml
new file mode 100644
index 0000000..960d3f6
--- /dev/null
+++ b/packages/VpnDialogs/res/values-ka/strings.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="prompt" msgid="8359175999006833462">"<xliff:g id="APP">%s</xliff:g> ცდილáƒáƒ‘ს VPN კáƒáƒ•შირის შექმნáƒáƒ¡."</string>
+ <string name="warning" msgid="5470743576660160079">"გáƒáƒ’რძელების შემთხვევáƒáƒ¨áƒ˜, áƒáƒžáƒšáƒ˜áƒ™áƒáƒªáƒ˜áƒáƒ¡ ექნებრქსელში გáƒáƒ“áƒáƒªáƒ”მული მáƒáƒœáƒáƒªáƒ”მების მáƒáƒžáƒáƒ•ების სáƒáƒ¨áƒ£áƒáƒšáƒ”ბáƒ. "<b>"áƒáƒ  გáƒáƒœáƒáƒ’რძáƒáƒ—, თუ áƒáƒ  ენდáƒáƒ‘ით áƒáƒžáƒšáƒ˜áƒ™áƒáƒªáƒ˜áƒáƒ¡."</b>" წინáƒáƒáƒ¦áƒ›áƒ“ეგ შემთვევáƒáƒ¨áƒ˜ შესáƒáƒ«áƒšáƒáƒ მáƒáƒ•ნე პრáƒáƒ’რáƒáƒ›áƒáƒ¡ თქვენ მáƒáƒœáƒáƒªáƒ”მებთáƒáƒœ წვდáƒáƒ›áƒ˜áƒ¡ სáƒáƒ¨áƒ£áƒáƒšáƒ”ბრმიეცეს."</string>
+ <string name="accept" msgid="2889226408765810173">"ვენდáƒáƒ‘ი áƒáƒ› áƒáƒžáƒšáƒ˜áƒ™áƒáƒªáƒ˜áƒáƒ¡."</string>
+ <string name="legacy_title" msgid="192936250066580964">"VPN დáƒáƒ™áƒáƒ•შირებულიáƒ"</string>
+ <string name="configure" msgid="4905518375574791375">"კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ"</string>
+ <string name="disconnect" msgid="971412338304200056">"კáƒáƒ•შირის გáƒáƒ¬áƒ§áƒ•ეტáƒ"</string>
+ <string name="session" msgid="6470628549473641030">"სესიáƒ:"</string>
+ <string name="duration" msgid="3584782459928719435">"ხáƒáƒœáƒ’რძლივáƒáƒ‘áƒ:"</string>
+ <string name="data_transmitted" msgid="7988167672982199061">"გáƒáƒ’ზáƒáƒ•ნილი:"</string>
+ <string name="data_received" msgid="4062776929376067820">"მიღებული:"</string>
+ <string name="data_value_format" msgid="2192466557826897580">"<xliff:g id="NUMBER_0">%1$s</xliff:g> ბáƒáƒ˜áƒ¢áƒ˜ / <xliff:g id="NUMBER_1">%2$s</xliff:g> პáƒáƒ™áƒ”ტი"</string>
+</resources>
diff --git a/packages/VpnDialogs/res/values-km-rKH/strings.xml b/packages/VpnDialogs/res/values-km-rKH/strings.xml
new file mode 100644
index 0000000..2c79e26
--- /dev/null
+++ b/packages/VpnDialogs/res/values-km-rKH/strings.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="prompt" msgid="8359175999006833462">"<xliff:g id="APP">%s</xliff:g> ព្យាយាម​បង្កើážâ€‹áž€áž¶ážšâ€‹ážáž—្ជាប់ VPN ។"</string>
+ <string name="warning" msgid="5470743576660160079">"ដោយ​បន្ហអ្នក​កំពុង​ផ្ដល់​សិទ្ធិ​ឲ្យ​កម្មវិធី​ទប់ស្កាážáŸ‹â€‹áž…រាចរណáŸâ€‹áž”ណ្ដាញ។ "<b>"កុំ​ទទួល​ លុះ​ážáŸ’រា​ážáŸ‚​អ្នក​ទុក​ចិážáŸ’ážâ€‹áž€áž˜áŸ’មវិធី។"</b>" បើ​មិន​ដូច្នáŸáŸ‡â€‹áž‘០អ្នក​ដំណើរការ​ប្រឈម​នឹង​គ្រោះážáŸ’នាក់ ដោយ​ទិន្ននáŸáž™â€‹ážšáž”ស់​អ្នក​បាន​សម្របសម្រួល​ដោយ​កម្មវិធី​ព្យាបាទ។"</string>
+ <string name="accept" msgid="2889226408765810173">"ážáŸ’ញុំ​ទុកចិážáŸ’ážâ€‹â€‹â€‹áž€áž˜áŸ’មវិធី​នáŸáŸ‡â€‹áŸ”"</string>
+ <string name="legacy_title" msgid="192936250066580964">"បា​ន​ភ្ជាប់ VPN"</string>
+ <string name="configure" msgid="4905518375574791375">"កំណážáŸ‹â€‹ážšáž…នាសម្ពáŸáž“្ធ"</string>
+ <string name="disconnect" msgid="971412338304200056">"ផ្ដាច់"</string>
+ <string name="session" msgid="6470628549473641030">"សមáŸáž™áŸ–"</string>
+ <string name="duration" msgid="3584782459928719435">"ážáž·ážšážœáŸáž›áž¶áŸ–"</string>
+ <string name="data_transmitted" msgid="7988167672982199061">"បាន​ផ្ញើ៖"</string>
+ <string name="data_received" msgid="4062776929376067820">"បាន​ទទួល៖"</string>
+ <string name="data_value_format" msgid="2192466557826897580">"<xliff:g id="NUMBER_0">%1$s</xliff:g> បៃ / <xliff:g id="NUMBER_1">%2$s</xliff:g> កញ្ចប់​ពáŸážáŸŒáž˜áž¶áž“"</string>
+</resources>
diff --git a/packages/VpnDialogs/res/values-km/strings.xml b/packages/VpnDialogs/res/values-km/strings.xml
new file mode 100644
index 0000000..2c79e26
--- /dev/null
+++ b/packages/VpnDialogs/res/values-km/strings.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="prompt" msgid="8359175999006833462">"<xliff:g id="APP">%s</xliff:g> ព្យាយាម​បង្កើážâ€‹áž€áž¶ážšâ€‹ážáž—្ជាប់ VPN ។"</string>
+ <string name="warning" msgid="5470743576660160079">"ដោយ​បន្ហអ្នក​កំពុង​ផ្ដល់​សិទ្ធិ​ឲ្យ​កម្មវិធី​ទប់ស្កាážáŸ‹â€‹áž…រាចរណáŸâ€‹áž”ណ្ដាញ។ "<b>"កុំ​ទទួល​ លុះ​ážáŸ’រា​ážáŸ‚​អ្នក​ទុក​ចិážáŸ’ážâ€‹áž€áž˜áŸ’មវិធី។"</b>" បើ​មិន​ដូច្នáŸáŸ‡â€‹áž‘០អ្នក​ដំណើរការ​ប្រឈម​នឹង​គ្រោះážáŸ’នាក់ ដោយ​ទិន្ននáŸáž™â€‹ážšáž”ស់​អ្នក​បាន​សម្របសម្រួល​ដោយ​កម្មវិធី​ព្យាបាទ។"</string>
+ <string name="accept" msgid="2889226408765810173">"ážáŸ’ញុំ​ទុកចិážáŸ’ážâ€‹â€‹â€‹áž€áž˜áŸ’មវិធី​នáŸáŸ‡â€‹áŸ”"</string>
+ <string name="legacy_title" msgid="192936250066580964">"បា​ន​ភ្ជាប់ VPN"</string>
+ <string name="configure" msgid="4905518375574791375">"កំណážáŸ‹â€‹ážšáž…នាសម្ពáŸáž“្ធ"</string>
+ <string name="disconnect" msgid="971412338304200056">"ផ្ដាច់"</string>
+ <string name="session" msgid="6470628549473641030">"សមáŸáž™áŸ–"</string>
+ <string name="duration" msgid="3584782459928719435">"ážáž·ážšážœáŸáž›áž¶áŸ–"</string>
+ <string name="data_transmitted" msgid="7988167672982199061">"បាន​ផ្ញើ៖"</string>
+ <string name="data_received" msgid="4062776929376067820">"បាន​ទទួល៖"</string>
+ <string name="data_value_format" msgid="2192466557826897580">"<xliff:g id="NUMBER_0">%1$s</xliff:g> បៃ / <xliff:g id="NUMBER_1">%2$s</xliff:g> កញ្ចប់​ពáŸážáŸŒáž˜áž¶áž“"</string>
+</resources>
diff --git a/packages/VpnDialogs/res/values-lo-rLA/strings.xml b/packages/VpnDialogs/res/values-lo-rLA/strings.xml
new file mode 100644
index 0000000..9f5216b
--- /dev/null
+++ b/packages/VpnDialogs/res/values-lo-rLA/strings.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="prompt" msgid="8359175999006833462">"<xliff:g id="APP">%s</xliff:g> ພະàºàº²àºàº²àº¡àºªà»‰àº²àº‡àºàº²àº™à»€àºŠàº·à»ˆàº­àº¡àº•à»à»ˆ VPN."</string>
+ <string name="warning" msgid="5470743576660160079">"ຖ້າດຳເນີນຕà»à»ˆ, à»àº¡à»ˆàº™àº—່ານàºàº³àº¥àº±àº‡àºˆàº°à»ƒàº«à»‰àºªàº´àº”à»àºà»ˆà»àº­àº±àºšàºžàº¥àº´à»€àº„ຊັນ ໃນàºàº²àº™àº”ັàºàº‚à»à»‰àº¡àº¹àº™àºˆàº°àº¥àº²àºˆàº­àº™à»ƒàº™à»€àº„ືອຂ່າàºàº—ັງà»àº»àº”. "<b>"ຢ່າàºàº­àº¡àº®àº±àºš ນອàºàºˆàº²àºàº§à»ˆàº²àº—່ານຈະເຊື່ອໃຈà»àº­àº±àºšàºžàº¥àº´à»€àº„ຊັນດັ່ງàºà»ˆàº²àº§."</b>" ຖ້າບà»à»ˆàº”ັ່ງນັ້ນ, ທ່ານຈະຕົàºàº¢àº¹à»ˆà»ƒàº™àº„ວາມສ່ຽງ ທີ່ຂà»à»‰àº¡àº¹àº™àº‚ອງທ່ານຈະຖືàºàº„ຸàºàº„າມໂດàºàºŠàº­àºšà»àº§àº—ີ່ເປັນອັນຕະລາàº."</string>
+ <string name="accept" msgid="2889226408765810173">"ຂ້ອàºà»€àºŠàº·à»ˆàº­à»àº­àº±àºšàºžàº¥àº´à»€àº„ຊັນນີ້."</string>
+ <string name="legacy_title" msgid="192936250066580964">"ເຊື່ອມຕà»à»ˆ VPN à»àº¥à»‰àº§"</string>
+ <string name="configure" msgid="4905518375574791375">"ປັບຄ່າ"</string>
+ <string name="disconnect" msgid="971412338304200056">"ຕັດàºàº²àº™à»€àºŠàº·à»ˆàº­àº¡àº•à»à»ˆ"</string>
+ <string name="session" msgid="6470628549473641030">"ເຊສຊັນ:"</string>
+ <string name="duration" msgid="3584782459928719435">"ໄລàºàº°à»€àº§àº¥àº²:"</string>
+ <string name="data_transmitted" msgid="7988167672982199061">"ສົ່ງ:"</string>
+ <string name="data_received" msgid="4062776929376067820">"ຮັບ:"</string>
+ <string name="data_value_format" msgid="2192466557826897580">"<xliff:g id="NUMBER_0">%1$s</xliff:g> ໄບ / <xliff:g id="NUMBER_1">%2$s</xliff:g> à»àºžàº±àºà»€àºàº±àº”"</string>
+</resources>
diff --git a/packages/VpnDialogs/res/values-lo/strings.xml b/packages/VpnDialogs/res/values-lo/strings.xml
new file mode 100644
index 0000000..9f5216b
--- /dev/null
+++ b/packages/VpnDialogs/res/values-lo/strings.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="prompt" msgid="8359175999006833462">"<xliff:g id="APP">%s</xliff:g> ພະàºàº²àºàº²àº¡àºªà»‰àº²àº‡àºàº²àº™à»€àºŠàº·à»ˆàº­àº¡àº•à»à»ˆ VPN."</string>
+ <string name="warning" msgid="5470743576660160079">"ຖ້າດຳເນີນຕà»à»ˆ, à»àº¡à»ˆàº™àº—່ານàºàº³àº¥àº±àº‡àºˆàº°à»ƒàº«à»‰àºªàº´àº”à»àºà»ˆà»àº­àº±àºšàºžàº¥àº´à»€àº„ຊັນ ໃນàºàº²àº™àº”ັàºàº‚à»à»‰àº¡àº¹àº™àºˆàº°àº¥àº²àºˆàº­àº™à»ƒàº™à»€àº„ືອຂ່າàºàº—ັງà»àº»àº”. "<b>"ຢ່າàºàº­àº¡àº®àº±àºš ນອàºàºˆàº²àºàº§à»ˆàº²àº—່ານຈະເຊື່ອໃຈà»àº­àº±àºšàºžàº¥àº´à»€àº„ຊັນດັ່ງàºà»ˆàº²àº§."</b>" ຖ້າບà»à»ˆàº”ັ່ງນັ້ນ, ທ່ານຈະຕົàºàº¢àº¹à»ˆà»ƒàº™àº„ວາມສ່ຽງ ທີ່ຂà»à»‰àº¡àº¹àº™àº‚ອງທ່ານຈະຖືàºàº„ຸàºàº„າມໂດàºàºŠàº­àºšà»àº§àº—ີ່ເປັນອັນຕະລາàº."</string>
+ <string name="accept" msgid="2889226408765810173">"ຂ້ອàºà»€àºŠàº·à»ˆàº­à»àº­àº±àºšàºžàº¥àº´à»€àº„ຊັນນີ້."</string>
+ <string name="legacy_title" msgid="192936250066580964">"ເຊື່ອມຕà»à»ˆ VPN à»àº¥à»‰àº§"</string>
+ <string name="configure" msgid="4905518375574791375">"ປັບຄ່າ"</string>
+ <string name="disconnect" msgid="971412338304200056">"ຕັດàºàº²àº™à»€àºŠàº·à»ˆàº­àº¡àº•à»à»ˆ"</string>
+ <string name="session" msgid="6470628549473641030">"ເຊສຊັນ:"</string>
+ <string name="duration" msgid="3584782459928719435">"ໄລàºàº°à»€àº§àº¥àº²:"</string>
+ <string name="data_transmitted" msgid="7988167672982199061">"ສົ່ງ:"</string>
+ <string name="data_received" msgid="4062776929376067820">"ຮັບ:"</string>
+ <string name="data_value_format" msgid="2192466557826897580">"<xliff:g id="NUMBER_0">%1$s</xliff:g> ໄບ / <xliff:g id="NUMBER_1">%2$s</xliff:g> à»àºžàº±àºà»€àºàº±àº”"</string>
+</resources>
diff --git a/packages/VpnDialogs/res/values-mn-rMN/strings.xml b/packages/VpnDialogs/res/values-mn-rMN/strings.xml
new file mode 100644
index 0000000..887bb73
--- /dev/null
+++ b/packages/VpnDialogs/res/values-mn-rMN/strings.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="prompt" msgid="8359175999006833462">"<xliff:g id="APP">%s</xliff:g> VPN холболтыг Ò¯Ò¯ÑгÑÑ… гÑж байна."</string>
+ <string name="warning" msgid="5470743576660160079">"ҮргÑлжлүүлÑÑнÑÑр та аппликешнд бүх ÑүлжÑÑний урÑгалыг таÑлах зөвшөөрлийг өгөх болно. "<b>"Ðппикешн баталгаагүй гÑж үзÑÑн тохиолдолд л зөвшөөрч болорхгүй."</b>" БуÑад тохиолдолд та өөрийн датаг хортой Ñофтверийн аюулд өртөх ÑÑ€ÑдÑлийг Ò¯Ò¯ÑгÑж байна."</string>
+ <string name="accept" msgid="2889226408765810173">"Би ÑÐ½Ñ Ð°Ð¿Ð¿Ð»Ð¸ÐºÐµÑˆÐ½Ð´ итгÑж байна."</string>
+ <string name="legacy_title" msgid="192936250066580964">"VPN холбогдов"</string>
+ <string name="configure" msgid="4905518375574791375">"Тохируулах"</string>
+ <string name="disconnect" msgid="971412338304200056">"Салгах"</string>
+ <string name="session" msgid="6470628549473641030">"Сешн:"</string>
+ <string name="duration" msgid="3584782459928719435">"ҮргÑлжлÑÑ… хугацаа:"</string>
+ <string name="data_transmitted" msgid="7988167672982199061">"ИлгÑÑÑÑн:"</string>
+ <string name="data_received" msgid="4062776929376067820">"ХүлÑÑн авÑан:"</string>
+ <string name="data_value_format" msgid="2192466557826897580">"<xliff:g id="NUMBER_0">%1$s</xliff:g> байт/ <xliff:g id="NUMBER_1">%2$s</xliff:g> пакет"</string>
+</resources>
diff --git a/packages/VpnDialogs/res/values-mn/strings.xml b/packages/VpnDialogs/res/values-mn/strings.xml
new file mode 100644
index 0000000..887bb73
--- /dev/null
+++ b/packages/VpnDialogs/res/values-mn/strings.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="prompt" msgid="8359175999006833462">"<xliff:g id="APP">%s</xliff:g> VPN холболтыг Ò¯Ò¯ÑгÑÑ… гÑж байна."</string>
+ <string name="warning" msgid="5470743576660160079">"ҮргÑлжлүүлÑÑнÑÑр та аппликешнд бүх ÑүлжÑÑний урÑгалыг таÑлах зөвшөөрлийг өгөх болно. "<b>"Ðппикешн баталгаагүй гÑж үзÑÑн тохиолдолд л зөвшөөрч болорхгүй."</b>" БуÑад тохиолдолд та өөрийн датаг хортой Ñофтверийн аюулд өртөх ÑÑ€ÑдÑлийг Ò¯Ò¯ÑгÑж байна."</string>
+ <string name="accept" msgid="2889226408765810173">"Би ÑÐ½Ñ Ð°Ð¿Ð¿Ð»Ð¸ÐºÐµÑˆÐ½Ð´ итгÑж байна."</string>
+ <string name="legacy_title" msgid="192936250066580964">"VPN холбогдов"</string>
+ <string name="configure" msgid="4905518375574791375">"Тохируулах"</string>
+ <string name="disconnect" msgid="971412338304200056">"Салгах"</string>
+ <string name="session" msgid="6470628549473641030">"Сешн:"</string>
+ <string name="duration" msgid="3584782459928719435">"ҮргÑлжлÑÑ… хугацаа:"</string>
+ <string name="data_transmitted" msgid="7988167672982199061">"ИлгÑÑÑÑн:"</string>
+ <string name="data_received" msgid="4062776929376067820">"ХүлÑÑн авÑан:"</string>
+ <string name="data_value_format" msgid="2192466557826897580">"<xliff:g id="NUMBER_0">%1$s</xliff:g> байт/ <xliff:g id="NUMBER_1">%2$s</xliff:g> пакет"</string>
+</resources>
diff --git a/packages/VpnDialogs/res/values-ms-rMY/strings.xml b/packages/VpnDialogs/res/values-ms-rMY/strings.xml
new file mode 100644
index 0000000..417fbae
--- /dev/null
+++ b/packages/VpnDialogs/res/values-ms-rMY/strings.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="prompt" msgid="8359175999006833462">"<xliff:g id="APP">%s</xliff:g> percubaan untuk membuat sambungan VPN."</string>
+ <string name="warning" msgid="5470743576660160079">"Dengan meneruskan, anda memberi keizinan kepada aplikasi untuk memintas semua trafik rangkaian. "<b>"JANGAN terima melainkan anda mempercayai aplikasi itu."</b>" Jika tidak, anda akan mengalami risiko data terjejas oleh perisian berniat jahat."</string>
+ <string name="accept" msgid="2889226408765810173">"Saya percayai aplikasi ini."</string>
+ <string name="legacy_title" msgid="192936250066580964">"VPN telah disambungkan"</string>
+ <string name="configure" msgid="4905518375574791375">"Konfigurasikan"</string>
+ <string name="disconnect" msgid="971412338304200056">"Putuskan sambungan"</string>
+ <string name="session" msgid="6470628549473641030">"Sesi:"</string>
+ <string name="duration" msgid="3584782459928719435">"Tempoh:"</string>
+ <string name="data_transmitted" msgid="7988167672982199061">"Dihantar:"</string>
+ <string name="data_received" msgid="4062776929376067820">"Diterima:"</string>
+ <string name="data_value_format" msgid="2192466557826897580">"<xliff:g id="NUMBER_0">%1$s</xliff:g> bait / <xliff:g id="NUMBER_1">%2$s</xliff:g> bingkisan"</string>
+</resources>
diff --git a/packages/VpnDialogs/res/values-nb/strings.xml b/packages/VpnDialogs/res/values-nb/strings.xml
index f716422..6bffc98 100644
--- a/packages/VpnDialogs/res/values-nb/strings.xml
+++ b/packages/VpnDialogs/res/values-nb/strings.xml
@@ -17,8 +17,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="prompt" msgid="8359175999006833462">"<xliff:g id="APP">%s</xliff:g> forsøker å etablere en VPN-tilkobling."</string>
- <string name="warning" msgid="5470743576660160079">"Ved å fortsette gir du applikasjonen tillatelse til å fange opp all nettverkstrafikk. "<b>"IKKE godta med mindre du stoler på applikasjonen."</b>" Ellers risikerer du at dataene dine kompromitteres av en ondsinnet programvare."</string>
- <string name="accept" msgid="2889226408765810173">"Jeg stoler på denne applikasjonen."</string>
+ <string name="warning" msgid="5470743576660160079">"Ved å fortsette gir du appen tillatelse til å fange opp all nettverkstrafikk. "<b>"IKKE godta med mindre du stoler på appen."</b>" Ellers risikerer du at dataene dine kompromitteres av en ondsinnet programvare."</string>
+ <string name="accept" msgid="2889226408765810173">"Jeg stoler på denne appen."</string>
<string name="legacy_title" msgid="192936250066580964">"VPN er tilkoblet"</string>
<string name="configure" msgid="4905518375574791375">"Konfigurer"</string>
<string name="disconnect" msgid="971412338304200056">"Koble fra"</string>
diff --git a/packages/VpnDialogs/res/values-ne-rNP/strings.xml b/packages/VpnDialogs/res/values-ne-rNP/strings.xml
new file mode 100644
index 0000000..03211cb
--- /dev/null
+++ b/packages/VpnDialogs/res/values-ne-rNP/strings.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="prompt" msgid="8359175999006833462">"<xliff:g id="APP">%s</xliff:g> à¤à¤‰à¤Ÿà¤¾ VPN जडान सिरà¥à¤œà¤¨à¤¾ गरà¥à¤¨à¥‡ पà¥à¤°à¤¯à¤¾à¤¸à¤¹à¤°à¥‚।"</string>
+ <string name="warning" msgid="5470743576660160079">"अगाडी बढेर, तपाईà¤à¤²à¥‡ यस अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई सबै नेटवरà¥à¤•को टà¥à¤°à¤¾à¤«à¤¿à¤• अवरोध गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनॠहà¥à¤à¤¦à¥ˆà¤›à¥¤ "<b>"तपाईà¤à¤²à¤¾à¤ˆ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—को विशà¥à¤µà¤¾à¤¸ नलागेसमà¥à¤® यसलाई सà¥à¤µà¥€à¤•ार नगरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</b>" अनà¥à¤¯à¤¥à¤¾, तपाईठआफà¥à¤¨à¥‹ डेटा खराब सफà¥à¤Ÿà¤µà¥‡à¤°à¤¦à¥à¤µà¤¾à¤°à¤¾ जोखिममा परà¥à¤¨à¥ हà¥à¤¨à¥‡à¤›à¥¤"</string>
+ <string name="accept" msgid="2889226408765810173">"म यस अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई विशà¥à¤µà¤¾à¤¸ गरà¥à¤›à¥à¥¤"</string>
+ <string name="legacy_title" msgid="192936250066580964">"VPN जोडिà¤à¤•ो छ"</string>
+ <string name="configure" msgid="4905518375574791375">"कनà¥à¤«à¤¿à¤—र गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="disconnect" msgid="971412338304200056">"विचà¥à¤›à¥‡à¤¦à¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="session" msgid="6470628549473641030">"सतà¥à¤°:"</string>
+ <string name="duration" msgid="3584782459928719435">"अवधि:"</string>
+ <string name="data_transmitted" msgid="7988167672982199061">"पठाइयो:"</string>
+ <string name="data_received" msgid="4062776929376067820">"पà¥à¤°à¤¾à¤ªà¥à¤¤ भयो:"</string>
+ <string name="data_value_format" msgid="2192466557826897580">"<xliff:g id="NUMBER_0">%1$s</xliff:g> बाइटहरू / <xliff:g id="NUMBER_1">%2$s</xliff:g> पà¥à¤¯à¤¾à¤•ेटहरू"</string>
+</resources>
diff --git a/packages/VpnDialogs/res/values-ne/strings.xml b/packages/VpnDialogs/res/values-ne/strings.xml
new file mode 100644
index 0000000..03211cb
--- /dev/null
+++ b/packages/VpnDialogs/res/values-ne/strings.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="prompt" msgid="8359175999006833462">"<xliff:g id="APP">%s</xliff:g> à¤à¤‰à¤Ÿà¤¾ VPN जडान सिरà¥à¤œà¤¨à¤¾ गरà¥à¤¨à¥‡ पà¥à¤°à¤¯à¤¾à¤¸à¤¹à¤°à¥‚।"</string>
+ <string name="warning" msgid="5470743576660160079">"अगाडी बढेर, तपाईà¤à¤²à¥‡ यस अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई सबै नेटवरà¥à¤•को टà¥à¤°à¤¾à¤«à¤¿à¤• अवरोध गरà¥à¤¨ अनà¥à¤®à¤¤à¤¿ दिनॠहà¥à¤à¤¦à¥ˆà¤›à¥¤ "<b>"तपाईà¤à¤²à¤¾à¤ˆ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—को विशà¥à¤µà¤¾à¤¸ नलागेसमà¥à¤® यसलाई सà¥à¤µà¥€à¤•ार नगरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</b>" अनà¥à¤¯à¤¥à¤¾, तपाईठआफà¥à¤¨à¥‹ डेटा खराब सफà¥à¤Ÿà¤µà¥‡à¤°à¤¦à¥à¤µà¤¾à¤°à¤¾ जोखिममा परà¥à¤¨à¥ हà¥à¤¨à¥‡à¤›à¥¤"</string>
+ <string name="accept" msgid="2889226408765810173">"म यस अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—लाई विशà¥à¤µà¤¾à¤¸ गरà¥à¤›à¥à¥¤"</string>
+ <string name="legacy_title" msgid="192936250066580964">"VPN जोडिà¤à¤•ो छ"</string>
+ <string name="configure" msgid="4905518375574791375">"कनà¥à¤«à¤¿à¤—र गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="disconnect" msgid="971412338304200056">"विचà¥à¤›à¥‡à¤¦à¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"</string>
+ <string name="session" msgid="6470628549473641030">"सतà¥à¤°:"</string>
+ <string name="duration" msgid="3584782459928719435">"अवधि:"</string>
+ <string name="data_transmitted" msgid="7988167672982199061">"पठाइयो:"</string>
+ <string name="data_received" msgid="4062776929376067820">"पà¥à¤°à¤¾à¤ªà¥à¤¤ भयो:"</string>
+ <string name="data_value_format" msgid="2192466557826897580">"<xliff:g id="NUMBER_0">%1$s</xliff:g> बाइटहरू / <xliff:g id="NUMBER_1">%2$s</xliff:g> पà¥à¤¯à¤¾à¤•ेटहरू"</string>
+</resources>
diff --git a/packages/VpnDialogs/res/values-si-rLK/strings.xml b/packages/VpnDialogs/res/values-si-rLK/strings.xml
new file mode 100644
index 0000000..67e0ed6
--- /dev/null
+++ b/packages/VpnDialogs/res/values-si-rLK/strings.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="prompt" msgid="8359175999006833462">"VPN සම්බන්ධතà·à·€à¶ºà¶šà·Š à·ƒà·à¶¯à·“මට <xliff:g id="APP">%s</xliff:g> à¶‹à¶­à·Šà·ƒà·à·„ කරයි."</string>
+ <string name="warning" msgid="5470743576660160079">"ඉදිරියට යà·à¶¸à·™à¶±à·Š, සියලු à¶¢à·à¶½ තදබදය මගදී අල්ල෠ගà·à¶±à·“මට ඔබ යෙදුමට අවසර දෙයි. "<b>"ඔබ යෙදුම විà·à·Šà·€à·à·ƒ නොකරයි නම් පිළිගන්න à¶‘à¶´à·"</b>" à¶±à·à¶­à·„ොත්, අනිෂ්ට මෘදුකà·à¶‚ගයක් මඟින් ඔබගේ දත්ත නිරà·à·€à¶»à¶«à¶º වීමේ අවදà·à¶±à¶¸à¶šà·Š ඔබට ඇත."</string>
+ <string name="accept" msgid="2889226408765810173">"මෙම යෙදුම මට විà·à·Šà·€à·à·ƒà¶ºà·’."</string>
+ <string name="legacy_title" msgid="192936250066580964">"VPN සම්බන්ධිතයි"</string>
+ <string name="configure" msgid="4905518375574791375">"වින්â€à¶ºà·à·ƒ කිරීම"</string>
+ <string name="disconnect" msgid="971412338304200056">"විසන්ධි කරන්න"</string>
+ <string name="session" msgid="6470628549473641030">"à·ƒà·à·ƒà·’ය:"</string>
+ <string name="duration" msgid="3584782459928719435">"à¶šà·à¶½ සීමà·à·€:"</string>
+ <string name="data_transmitted" msgid="7988167672982199061">"යවන ලද:"</string>
+ <string name="data_received" msgid="4062776929376067820">"à¶½à·à¶¶à·’à¶«à·’:"</string>
+ <string name="data_value_format" msgid="2192466557826897580">"බයිට <xliff:g id="NUMBER_0">%1$s</xliff:g> / à¶´à·à¶šà·à¶§à·Šà¶§à·” <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
+</resources>
diff --git a/packages/VpnDialogs/res/values-si/strings.xml b/packages/VpnDialogs/res/values-si/strings.xml
new file mode 100644
index 0000000..67e0ed6
--- /dev/null
+++ b/packages/VpnDialogs/res/values-si/strings.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="prompt" msgid="8359175999006833462">"VPN සම්බන්ධතà·à·€à¶ºà¶šà·Š à·ƒà·à¶¯à·“මට <xliff:g id="APP">%s</xliff:g> à¶‹à¶­à·Šà·ƒà·à·„ කරයි."</string>
+ <string name="warning" msgid="5470743576660160079">"ඉදිරියට යà·à¶¸à·™à¶±à·Š, සියලු à¶¢à·à¶½ තදබදය මගදී අල්ල෠ගà·à¶±à·“මට ඔබ යෙදුමට අවසර දෙයි. "<b>"ඔබ යෙදුම විà·à·Šà·€à·à·ƒ නොකරයි නම් පිළිගන්න à¶‘à¶´à·"</b>" à¶±à·à¶­à·„ොත්, අනිෂ්ට මෘදුකà·à¶‚ගයක් මඟින් ඔබගේ දත්ත නිරà·à·€à¶»à¶«à¶º වීමේ අවදà·à¶±à¶¸à¶šà·Š ඔබට ඇත."</string>
+ <string name="accept" msgid="2889226408765810173">"මෙම යෙදුම මට විà·à·Šà·€à·à·ƒà¶ºà·’."</string>
+ <string name="legacy_title" msgid="192936250066580964">"VPN සම්බන්ධිතයි"</string>
+ <string name="configure" msgid="4905518375574791375">"වින්â€à¶ºà·à·ƒ කිරීම"</string>
+ <string name="disconnect" msgid="971412338304200056">"විසන්ධි කරන්න"</string>
+ <string name="session" msgid="6470628549473641030">"à·ƒà·à·ƒà·’ය:"</string>
+ <string name="duration" msgid="3584782459928719435">"à¶šà·à¶½ සීමà·à·€:"</string>
+ <string name="data_transmitted" msgid="7988167672982199061">"යවන ලද:"</string>
+ <string name="data_received" msgid="4062776929376067820">"à¶½à·à¶¶à·’à¶«à·’:"</string>
+ <string name="data_value_format" msgid="2192466557826897580">"බයිට <xliff:g id="NUMBER_0">%1$s</xliff:g> / à¶´à·à¶šà·à¶§à·Šà¶§à·” <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
+</resources>
diff --git a/packages/VpnDialogs/res/values-zh-rHK/strings.xml b/packages/VpnDialogs/res/values-zh-rHK/strings.xml
new file mode 100644
index 0000000..8b25d41
--- /dev/null
+++ b/packages/VpnDialogs/res/values-zh-rHK/strings.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="prompt" msgid="8359175999006833462">"<xliff:g id="APP">%s</xliff:g> 嘗試建立 VPN 連線。"</string>
+ <string name="warning" msgid="5470743576660160079">"如果繼續進行,å³è¡¨ç¤ºæ‚¨å…è¨±è©²æ‡‰ç”¨ç¨‹å¼æ””截所有網絡æµé‡ã€‚"<b>"é™¤éžæ‚¨ä¿¡ä»»è©²æ‡‰ç”¨ç¨‹å¼ï¼Œå¦å‰‡ä¸æ‡‰æŽ¥å—。"</b>"ä¸ç„¶å°±æœƒè®“æ‚¨çš„è³‡æ–™é™·æ–¼é­æƒ¡æ„程å¼å…¥ä¾µçš„風險。"</string>
+ <string name="accept" msgid="2889226408765810173">"我信任這個應用程å¼ã€‚"</string>
+ <string name="legacy_title" msgid="192936250066580964">"VPN 已連線"</string>
+ <string name="configure" msgid="4905518375574791375">"設定"</string>
+ <string name="disconnect" msgid="971412338304200056">"中斷連線"</string>
+ <string name="session" msgid="6470628549473641030">"時段:"</string>
+ <string name="duration" msgid="3584782459928719435">"æŒçºŒæ™‚間︰"</string>
+ <string name="data_transmitted" msgid="7988167672982199061">"已傳é€ï¼š"</string>
+ <string name="data_received" msgid="4062776929376067820">"已接收:"</string>
+ <string name="data_value_format" msgid="2192466557826897580">"<xliff:g id="NUMBER_0">%1$s</xliff:g> ä½å…ƒçµ„ / <xliff:g id="NUMBER_1">%2$s</xliff:g> å°åŒ…"</string>
+</resources>
diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
index faca949..d653920 100644
--- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
+++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
@@ -222,6 +222,9 @@ public class PhoneWindowManager implements WindowManagerPolicy {
// Vibrator pattern for a short vibration.
long[] mKeyboardTapVibePattern;
+ // Vibrator pattern for a short vibration when tapping on an hour/minute tick of a Clock.
+ long[] mClockTickVibePattern;
+
// Vibrator pattern for haptic feedback during boot when safe mode is disabled.
long[] mSafeModeDisabledVibePattern;
@@ -966,6 +969,8 @@ public class PhoneWindowManager implements WindowManagerPolicy {
com.android.internal.R.array.config_virtualKeyVibePattern);
mKeyboardTapVibePattern = getLongIntArray(mContext.getResources(),
com.android.internal.R.array.config_keyboardTapVibePattern);
+ mClockTickVibePattern = getLongIntArray(mContext.getResources(),
+ com.android.internal.R.array.config_clockTickVibePattern);
mSafeModeDisabledVibePattern = getLongIntArray(mContext.getResources(),
com.android.internal.R.array.config_safeModeDisabledVibePattern);
mSafeModeEnabledVibePattern = getLongIntArray(mContext.getResources(),
@@ -5021,6 +5026,9 @@ public class PhoneWindowManager implements WindowManagerPolicy {
case HapticFeedbackConstants.KEYBOARD_TAP:
pattern = mKeyboardTapVibePattern;
break;
+ case HapticFeedbackConstants.CLOCK_TICK:
+ pattern = mClockTickVibePattern;
+ break;
case HapticFeedbackConstants.SAFE_MODE_DISABLED:
pattern = mSafeModeDisabledVibePattern;
break;
@@ -5222,6 +5230,11 @@ public class PhoneWindowManager implements WindowManagerPolicy {
}
@Override
+ public int getInputMethodWindowVisibleHeightLw() {
+ return mDockBottom - mCurBottom;
+ }
+
+ @Override
public void setCurrentUserLw(int newUserId) {
mCurrentUserId = newUserId;
if (mKeyguardDelegate != null) {
diff --git a/services/input/Android.mk b/services/input/Android.mk
index 6e944ef..eb2bebe 100644
--- a/services/input/Android.mk
+++ b/services/input/Android.mk
@@ -42,6 +42,8 @@ LOCAL_SHARED_LIBRARIES := \
LOCAL_C_INCLUDES := \
external/skia/include/core
+LOCAL_CFLAGS += -Wno-unused-parameter
+
LOCAL_MODULE:= libinputservice
LOCAL_MODULE_TAGS := optional
diff --git a/services/input/EventHub.cpp b/services/input/EventHub.cpp
index 4d70d5f..e67c64c 100644
--- a/services/input/EventHub.cpp
+++ b/services/input/EventHub.cpp
@@ -49,6 +49,7 @@
#include <sys/ioctl.h>
#include <sys/limits.h>
#include <sys/sha1.h>
+#include <sys/utsname.h>
/* this macro is used to tell if "bit" is set in "array"
* it selects a byte from the array, and does a boolean AND
@@ -93,6 +94,14 @@ static String8 sha1(const String8& in) {
return out;
}
+static void getLinuxRelease(int* major, int* minor) {
+ struct utsname info;
+ if (uname(&info) || sscanf(info.release, "%d.%d", major, minor) <= 0) {
+ *major = 0, *minor = 0;
+ ALOGE("Could not get linux version: %s", strerror(errno));
+ }
+}
+
static void setDescriptor(InputDeviceIdentifier& identifier) {
// Compute a device descriptor that uniquely identifies the device.
// The descriptor is assumed to be a stable identifier. Its value should not
@@ -236,6 +245,11 @@ EventHub::EventHub(void) :
result = epoll_ctl(mEpollFd, EPOLL_CTL_ADD, mWakeReadPipeFd, &eventItem);
LOG_ALWAYS_FATAL_IF(result != 0, "Could not add wake read pipe to epoll instance. errno=%d",
errno);
+
+ int major, minor;
+ getLinuxRelease(&major, &minor);
+ // EPOLLWAKEUP was introduced in kernel 3.5
+ mUsingEpollWakeup = major > 3 || (major == 3 && minor >= 5);
}
EventHub::~EventHub(void) {
@@ -509,8 +523,9 @@ bool EventHub::hasScanCode(int32_t deviceId, int32_t scanCode) const {
bool EventHub::hasLed(int32_t deviceId, int32_t led) const {
AutoMutex _l(mLock);
Device* device = getDeviceLocked(deviceId);
- if (device && led >= 0 && led <= LED_MAX) {
- if (test_bit(led, device->ledBitmask)) {
+ int32_t sc;
+ if (device && mapLed(device, led, &sc) == NO_ERROR) {
+ if (test_bit(sc, device->ledBitmask)) {
return true;
}
}
@@ -520,12 +535,17 @@ bool EventHub::hasLed(int32_t deviceId, int32_t led) const {
void EventHub::setLedState(int32_t deviceId, int32_t led, bool on) {
AutoMutex _l(mLock);
Device* device = getDeviceLocked(deviceId);
- if (device && !device->isVirtual() && led >= 0 && led <= LED_MAX) {
+ setLedStateLocked(device, led, on);
+}
+
+void EventHub::setLedStateLocked(Device* device, int32_t led, bool on) {
+ int32_t sc;
+ if (device && !device->isVirtual() && mapLed(device, led, &sc) != NAME_NOT_FOUND) {
struct input_event ev;
ev.time.tv_sec = 0;
ev.time.tv_usec = 0;
ev.type = EV_LED;
- ev.code = led;
+ ev.code = sc;
ev.value = on ? 1 : 0;
ssize_t nWrite;
@@ -1239,12 +1259,13 @@ status_t EventHub::openDeviceLocked(const char *devicePath) {
if (device->classes & (INPUT_DEVICE_CLASS_JOYSTICK | INPUT_DEVICE_CLASS_GAMEPAD)) {
device->controllerNumber = getNextControllerNumberLocked(device);
+ setLedForController(device);
}
// Register with epoll.
struct epoll_event eventItem;
memset(&eventItem, 0, sizeof(eventItem));
- eventItem.events = EPOLLIN;
+ eventItem.events = mUsingEpollWakeup ? EPOLLIN : EPOLLIN | EPOLLWAKEUP;
eventItem.data.u32 = deviceId;
if (epoll_ctl(mEpollFd, EPOLL_CTL_ADD, fd, &eventItem)) {
ALOGE("Could not add device fd to epoll instance. errno=%d", errno);
@@ -1252,9 +1273,14 @@ status_t EventHub::openDeviceLocked(const char *devicePath) {
return -1;
}
- // Enable wake-lock behavior on kernels that support it.
- // TODO: Only need this for devices that can really wake the system.
- bool usingSuspendBlockIoctl = !ioctl(fd, EVIOCSSUSPENDBLOCK, 1);
+ String8 wakeMechanism("EPOLLWAKEUP");
+ if (!mUsingEpollWakeup) {
+ if (ioctl(fd, EVIOCSSUSPENDBLOCK, 1)) {
+ wakeMechanism = "<none>";
+ } else {
+ wakeMechanism = "EVIOCSSUSPENDBLOCK";
+ }
+ }
// Tell the kernel that we want to use the monotonic clock for reporting timestamps
// associated with input events. This is important because the input system
@@ -1276,14 +1302,14 @@ status_t EventHub::openDeviceLocked(const char *devicePath) {
ALOGI("New device: id=%d, fd=%d, path='%s', name='%s', classes=0x%x, "
"configuration='%s', keyLayout='%s', keyCharacterMap='%s', builtinKeyboard=%s, "
- "usingSuspendBlockIoctl=%s, usingClockIoctl=%s",
+ "wakeMechanism=%s, usingClockIoctl=%s",
deviceId, fd, devicePath, device->identifier.name.string(),
device->classes,
device->configurationFile.string(),
device->keyMap.keyLayoutFile.string(),
device->keyMap.keyCharacterMapFile.string(),
toString(mBuiltInKeyboardId == deviceId),
- toString(usingSuspendBlockIoctl), toString(usingClockIoctl));
+ wakeMechanism.string(), toString(usingClockIoctl));
addDeviceLocked(device);
return 0;
@@ -1372,6 +1398,11 @@ void EventHub::releaseControllerNumberLocked(Device* device) {
mControllerNumbers.clearBit(static_cast<uint32_t>(num - 1));
}
+void EventHub::setLedForController(Device* device) {
+ for (int i = 0; i < MAX_CONTROLLER_LEDS; i++) {
+ setLedStateLocked(device, ALED_CONTROLLER_1 + i, device->controllerNumber == i + 1);
+ }
+}
bool EventHub::hasKeycodeLocked(Device* device, int keycode) const {
if (!device->keyMap.haveKeyLayout() || !device->keyBitmask) {
@@ -1391,6 +1422,21 @@ bool EventHub::hasKeycodeLocked(Device* device, int keycode) const {
return false;
}
+status_t EventHub::mapLed(Device* device, int32_t led, int32_t* outScanCode) const {
+ if (!device->keyMap.haveKeyLayout() || !device->ledBitmask) {
+ return NAME_NOT_FOUND;
+ }
+
+ int32_t scanCode;
+ if(device->keyMap.keyLayoutMap->findScanCodeForLed(led, &scanCode) != NAME_NOT_FOUND) {
+ if(scanCode >= 0 && scanCode <= LED_MAX && test_bit(scanCode, device->ledBitmask)) {
+ *outScanCode = scanCode;
+ return NO_ERROR;
+ }
+ }
+ return NAME_NOT_FOUND;
+}
+
status_t EventHub::closeDeviceByPathLocked(const char *devicePath) {
Device* device = getDeviceByPathLocked(devicePath);
if (device) {
diff --git a/services/input/EventHub.h b/services/input/EventHub.h
index ae28f01..a9a28d2 100644
--- a/services/input/EventHub.h
+++ b/services/input/EventHub.h
@@ -231,6 +231,8 @@ public:
uint8_t* outFlags) const = 0;
virtual bool hasScanCode(int32_t deviceId, int32_t scanCode) const = 0;
+
+ /* LED related functions expect Android LED constants, not scan codes or HID usages */
virtual bool hasLed(int32_t deviceId, int32_t led) const = 0;
virtual void setLedState(int32_t deviceId, int32_t led, bool on) = 0;
@@ -393,6 +395,10 @@ private:
int32_t getNextControllerNumberLocked(Device* device);
void releaseControllerNumberLocked(Device* device);
+ void setLedForController(Device* device);
+
+ status_t mapLed(Device* device, int32_t led, int32_t* outScanCode) const;
+ void setLedStateLocked(Device* device, int32_t led, bool on);
// Protect all internal state.
mutable Mutex mLock;
@@ -440,6 +446,8 @@ private:
size_t mPendingEventCount;
size_t mPendingEventIndex;
bool mPendingINotify;
+
+ bool mUsingEpollWakeup;
};
}; // namespace android
diff --git a/services/input/InputReader.cpp b/services/input/InputReader.cpp
index 03852a5..a683c4b 100644
--- a/services/input/InputReader.cpp
+++ b/services/input/InputReader.cpp
@@ -2197,9 +2197,9 @@ int32_t KeyboardInputMapper::getMetaState() {
}
void KeyboardInputMapper::resetLedState() {
- initializeLedState(mCapsLockLedState, LED_CAPSL);
- initializeLedState(mNumLockLedState, LED_NUML);
- initializeLedState(mScrollLockLedState, LED_SCROLLL);
+ initializeLedState(mCapsLockLedState, ALED_CAPS_LOCK);
+ initializeLedState(mNumLockLedState, ALED_NUM_LOCK);
+ initializeLedState(mScrollLockLedState, ALED_SCROLL_LOCK);
updateLedState(true);
}
@@ -2210,11 +2210,11 @@ void KeyboardInputMapper::initializeLedState(LedState& ledState, int32_t led) {
}
void KeyboardInputMapper::updateLedState(bool reset) {
- updateLedStateForModifier(mCapsLockLedState, LED_CAPSL,
+ updateLedStateForModifier(mCapsLockLedState, ALED_CAPS_LOCK,
AMETA_CAPS_LOCK_ON, reset);
- updateLedStateForModifier(mNumLockLedState, LED_NUML,
+ updateLedStateForModifier(mNumLockLedState, ALED_NUM_LOCK,
AMETA_NUM_LOCK_ON, reset);
- updateLedStateForModifier(mScrollLockLedState, LED_SCROLLL,
+ updateLedStateForModifier(mScrollLockLedState, ALED_SCROLL_LOCK,
AMETA_SCROLL_LOCK_ON, reset);
}
@@ -6283,7 +6283,7 @@ void JoystickInputMapper::configure(nsecs_t when,
// To eliminate noise while the joystick is at rest, filter out small variations
// in axis values up front.
- axis.filter = axis.flat * 0.25f;
+ axis.filter = axis.fuzz ? axis.fuzz : axis.flat * 0.25f;
mAxes.add(abs, axis);
}
diff --git a/services/input/InputReader.h b/services/input/InputReader.h
index a8bb636..e6f45b6 100644
--- a/services/input/InputReader.h
+++ b/services/input/InputReader.h
@@ -574,8 +574,8 @@ public:
private:
InputReaderContext* mContext;
int32_t mId;
- int32_t mControllerNumber;
int32_t mGeneration;
+ int32_t mControllerNumber;
InputDeviceIdentifier mIdentifier;
String8 mAlias;
uint32_t mClasses;
diff --git a/services/input/SpriteController.cpp b/services/input/SpriteController.cpp
index fd9c66b..2667a72 100644
--- a/services/input/SpriteController.cpp
+++ b/services/input/SpriteController.cpp
@@ -216,12 +216,12 @@ void SpriteController::doUpdateSprites() {
paint.setXfermodeMode(SkXfermode::kSrc_Mode);
surfaceCanvas.drawBitmap(update.state.icon.bitmap, 0, 0, &paint);
- if (outBuffer.width > uint32_t(update.state.icon.bitmap.width())) {
+ if (outBuffer.width > update.state.icon.bitmap.width()) {
paint.setColor(0); // transparent fill color
surfaceCanvas.drawRectCoords(update.state.icon.bitmap.width(), 0,
outBuffer.width, update.state.icon.bitmap.height(), paint);
}
- if (outBuffer.height > uint32_t(update.state.icon.bitmap.height())) {
+ if (outBuffer.height > update.state.icon.bitmap.height()) {
paint.setColor(0); // transparent fill color
surfaceCanvas.drawRectCoords(0, update.state.icon.bitmap.height(),
outBuffer.width, outBuffer.height, paint);
diff --git a/services/java/com/android/server/BackupManagerService.java b/services/java/com/android/server/BackupManagerService.java
index a04ee14..455d5e9 100644
--- a/services/java/com/android/server/BackupManagerService.java
+++ b/services/java/com/android/server/BackupManagerService.java
@@ -2117,6 +2117,7 @@ class BackupManagerService extends IBackupManager.Stub {
mSavedStateName = new File(mStateDir, packageName);
mBackupDataName = new File(mDataDir, packageName + ".data");
mNewStateName = new File(mStateDir, packageName + ".new");
+ if (MORE_DEBUG) Slog.d(TAG, "data file: " + mBackupDataName);
mSavedState = null;
mBackupData = null;
diff --git a/services/java/com/android/server/BatteryService.java b/services/java/com/android/server/BatteryService.java
index 5f3f894..b234a4e 100644
--- a/services/java/com/android/server/BatteryService.java
+++ b/services/java/com/android/server/BatteryService.java
@@ -160,7 +160,7 @@ public final class BatteryService extends Binder {
mBatteryPropertiesListener = new BatteryListener();
- IBinder b = ServiceManager.getService("batterypropreg");
+ IBinder b = ServiceManager.getService("batteryproperties");
mBatteryPropertiesRegistrar = IBatteryPropertiesRegistrar.Stub.asInterface(b);
try {
@@ -314,8 +314,6 @@ public final class BatteryService extends Binder {
+ ", batteryLevel=" + mBatteryProps.batteryLevel
+ ", batteryTechnology=" + mBatteryProps.batteryTechnology
+ ", batteryVoltage=" + mBatteryProps.batteryVoltage
- + ", batteryCurrentNow=" + mBatteryProps.batteryCurrentNow
- + ", batteryChargeCounter=" + mBatteryProps.batteryChargeCounter
+ ", batteryTemperature=" + mBatteryProps.batteryTemperature
+ ", mBatteryLevelCritical=" + mBatteryLevelCritical
+ ", mPlugType=" + mPlugType);
@@ -616,15 +614,6 @@ public final class BatteryService extends Binder {
pw.println(" level: " + mBatteryProps.batteryLevel);
pw.println(" scale: " + BATTERY_SCALE);
pw.println(" voltage: " + mBatteryProps.batteryVoltage);
-
- if (mBatteryProps.batteryCurrentNow != Integer.MIN_VALUE) {
- pw.println(" current now: " + mBatteryProps.batteryCurrentNow);
- }
-
- if (mBatteryProps.batteryChargeCounter != Integer.MIN_VALUE) {
- pw.println(" charge counter: " + mBatteryProps.batteryChargeCounter);
- }
-
pw.println(" temperature: " + mBatteryProps.batteryTemperature);
pw.println(" technology: " + mBatteryProps.batteryTechnology);
} else if (args.length == 3 && "set".equals(args[0])) {
diff --git a/services/java/com/android/server/ConnectivityService.java b/services/java/com/android/server/ConnectivityService.java
index 594f683..571724d 100644
--- a/services/java/com/android/server/ConnectivityService.java
+++ b/services/java/com/android/server/ConnectivityService.java
@@ -112,6 +112,7 @@ import com.android.internal.net.VpnProfile;
import com.android.internal.telephony.DctConstants;
import com.android.internal.telephony.Phone;
import com.android.internal.telephony.PhoneConstants;
+import com.android.internal.telephony.TelephonyIntents;
import com.android.internal.util.IndentingPrintWriter;
import com.android.internal.util.XmlUtils;
import com.android.server.am.BatteryStatsService;
@@ -2322,36 +2323,6 @@ public class ConnectivityService extends IConnectivityManager.Stub {
}
}
- private void handleCaptivePortalTrackerCheck(NetworkInfo info) {
- if (DBG) log("Captive portal check " + info);
- int type = info.getType();
- final NetworkStateTracker thisNet = mNetTrackers[type];
- if (mNetConfigs[type].isDefault()) {
- if (mActiveDefaultNetwork != -1 && mActiveDefaultNetwork != type) {
- if (isNewNetTypePreferredOverCurrentNetType(type)) {
- if (DBG) log("Captive check on " + info.getTypeName());
- mCaptivePortalTracker.detectCaptivePortal(new NetworkInfo(info));
- return;
- } else {
- if (DBG) log("Tear down low priority net " + info.getTypeName());
- teardown(thisNet);
- return;
- }
- }
- }
-
- if (DBG) log("handleCaptivePortalTrackerCheck: call captivePortalCheckComplete ni=" + info);
- thisNet.captivePortalCheckComplete();
- }
-
- /** @hide */
- @Override
- public void captivePortalCheckComplete(NetworkInfo info) {
- enforceConnectivityInternalPermission();
- if (DBG) log("captivePortalCheckComplete: ni=" + info);
- mNetTrackers[info.getType()].captivePortalCheckComplete();
- }
-
/** @hide */
@Override
public void captivePortalCheckCompleted(NetworkInfo info, boolean isCaptivePortal) {
@@ -2978,9 +2949,6 @@ public class ConnectivityService extends IConnectivityManager.Stub {
if (info.getDetailedState() ==
NetworkInfo.DetailedState.FAILED) {
handleConnectionFailure(info);
- } else if (info.getDetailedState() ==
- DetailedState.CAPTIVE_PORTAL_CHECK) {
- handleCaptivePortalTrackerCheck(info);
} else if (info.isConnectedToProvisioningNetwork()) {
/**
* TODO: Create ConnectivityManager.TYPE_MOBILE_PROVISIONING
@@ -4546,15 +4514,27 @@ public class ConnectivityService extends IConnectivityManager.Stub {
mdst.enableMobileProvisioning(url);
} else {
if (DBG) log("handleMobileProvisioningAction: on default network");
- Intent newIntent = Intent.makeMainSelectorActivity(Intent.ACTION_MAIN,
- Intent.CATEGORY_APP_BROWSER);
- newIntent.setData(Uri.parse(url));
- newIntent.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT |
- Intent.FLAG_ACTIVITY_NEW_TASK);
- try {
- mContext.startActivity(newIntent);
- } catch (ActivityNotFoundException e) {
- loge("handleMobileProvisioningAction: startActivity failed" + e);
+ // Check for apps that can handle provisioning first
+ Intent provisioningIntent = new Intent(TelephonyIntents.ACTION_CARRIER_SETUP);
+ provisioningIntent.addCategory(TelephonyIntents.CATEGORY_MCCMNC_PREFIX
+ + mTelephonyManager.getSimOperator());
+ if (mContext.getPackageManager().resolveActivity(provisioningIntent, 0 /* flags */)
+ != null) {
+ provisioningIntent.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT |
+ Intent.FLAG_ACTIVITY_NEW_TASK);
+ mContext.startActivity(provisioningIntent);
+ } else {
+ // If no apps exist, use standard URL ACTION_VIEW method
+ Intent newIntent = Intent.makeMainSelectorActivity(Intent.ACTION_MAIN,
+ Intent.CATEGORY_APP_BROWSER);
+ newIntent.setData(Uri.parse(url));
+ newIntent.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT |
+ Intent.FLAG_ACTIVITY_NEW_TASK);
+ try {
+ mContext.startActivity(newIntent);
+ } catch (ActivityNotFoundException e) {
+ loge("handleMobileProvisioningAction: startActivity failed" + e);
+ }
}
}
}
diff --git a/services/java/com/android/server/InputMethodManagerService.java b/services/java/com/android/server/InputMethodManagerService.java
index a996dbd..f061149 100644
--- a/services/java/com/android/server/InputMethodManagerService.java
+++ b/services/java/com/android/server/InputMethodManagerService.java
@@ -16,6 +16,8 @@
package com.android.server;
import com.android.internal.content.PackageMonitor;
+import com.android.internal.inputmethod.InputMethodSubtypeSwitchingController;
+import com.android.internal.inputmethod.InputMethodSubtypeSwitchingController.ImeSubtypeListItem;
import com.android.internal.inputmethod.InputMethodUtils;
import com.android.internal.inputmethod.InputMethodUtils.InputMethodSettings;
import com.android.internal.os.HandlerCaller;
@@ -114,12 +116,9 @@ import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Collections;
-import java.util.Comparator;
import java.util.HashMap;
-import java.util.HashSet;
import java.util.List;
import java.util.Locale;
-import java.util.TreeMap;
/**
* This class provides a system service that manages input methods.
@@ -150,7 +149,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
static final int MSG_HARD_KEYBOARD_SWITCH_CHANGED = 4000;
- static final long TIME_TO_RECONNECT = 10*1000;
+ static final long TIME_TO_RECONNECT = 3 * 1000;
static final int SECURE_SUGGESTION_SPANS_MAX_SIZE = 20;
@@ -167,7 +166,6 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
final HandlerCaller mCaller;
final boolean mHasFeature;
private InputMethodFileManager mFileManager;
- private InputMethodAndSubtypeListManager mImListManager;
private final HardKeyboardListener mHardKeyboardListener;
private final WindowManagerService mWindowManagerService;
@@ -179,6 +177,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
final HashMap<String, InputMethodInfo> mMethodMap = new HashMap<String, InputMethodInfo>();
private final LruCache<SuggestionSpan, InputMethodInfo> mSecureSuggestionSpans =
new LruCache<SuggestionSpan, InputMethodInfo>(SECURE_SUGGESTION_SPANS_MAX_SIZE);
+ private final InputMethodSubtypeSwitchingController mSwitchingController;
// Used to bring IME service up to visible adjustment while it is being shown.
final ServiceConnection mVisibleConnection = new ServiceConnection() {
@@ -677,7 +676,8 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
mSettings = new InputMethodSettings(
mRes, context.getContentResolver(), mMethodMap, mMethodList, userId);
mFileManager = new InputMethodFileManager(mMethodMap, userId);
- mImListManager = new InputMethodAndSubtypeListManager(context, this);
+ mSwitchingController = new InputMethodSubtypeSwitchingController(mSettings);
+ mSwitchingController.resetCircularListLocked(context);
// Just checking if defaultImiId is empty or not
final String defaultImiId = mSettings.getSelectedInputMethod();
@@ -757,8 +757,8 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
if (DEBUG) {
Slog.i(TAG, "Locale has been changed to " + newLocale);
}
- // InputMethodAndSubtypeListManager should be reset when the locale is changed.
- mImListManager = new InputMethodAndSubtypeListManager(mContext, this);
+ // CircularList should be reset when the locale is changed.
+ mSwitchingController.resetCircularListLocked(mContext);
buildInputMethodListLocked(mMethodList, mMethodMap, resetDefaultEnabledIme);
if (!updateOnlyWhenLocaleChanged) {
final String selectedImiId = mSettings.getSelectedInputMethod();
@@ -960,17 +960,6 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
}
}
- private HashMap<InputMethodInfo, List<InputMethodSubtype>>
- getExplicitlyOrImplicitlyEnabledInputMethodsAndSubtypeListLocked() {
- HashMap<InputMethodInfo, List<InputMethodSubtype>> enabledInputMethodAndSubtypes =
- new HashMap<InputMethodInfo, List<InputMethodSubtype>>();
- for (InputMethodInfo imi: mSettings.getEnabledInputMethodListLocked()) {
- enabledInputMethodAndSubtypes.put(
- imi, mSettings.getEnabledInputMethodSubtypeListLocked(mContext, imi, true));
- }
- return enabledInputMethodAndSubtypes;
- }
-
/**
* @param imiId if null, returns enabled subtypes for the current imi
* @return enabled subtypes of the specified imi
@@ -2153,7 +2142,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
return false;
}
synchronized (mMethodMap) {
- final ImeSubtypeListItem nextSubtype = mImListManager.getNextInputMethod(
+ final ImeSubtypeListItem nextSubtype = mSwitchingController.getNextInputMethod(
onlyCurrentIme, mMethodMap.get(mCurMethodId), mCurrentSubtype);
if (nextSubtype == null) {
return false;
@@ -2169,7 +2158,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
return false;
}
synchronized (mMethodMap) {
- final ImeSubtypeListItem nextSubtype = mImListManager.getNextInputMethod(
+ final ImeSubtypeListItem nextSubtype = mSwitchingController.getNextInputMethod(
false /* onlyCurrentIme */, mMethodMap.get(mCurMethodId), mCurrentSubtype);
if (nextSubtype == null) {
return false;
@@ -2242,6 +2231,22 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
return;
}
+ @Override
+ public int getInputMethodWindowVisibleHeight() {
+ return mWindowManagerService.getInputMethodWindowVisibleHeight();
+ }
+
+ @Override
+ public void notifyTextCommitted() {
+ if (DEBUG) {
+ Slog.d(TAG, "Got the notification of commitText");
+ }
+ final InputMethodInfo imi = mMethodMap.get(mCurMethodId);
+ if (imi != null) {
+ mSwitchingController.onCommitText(imi, mCurrentSubtype);
+ }
+ }
+
private void setInputMethodWithSubtypeId(IBinder token, String id, int subtypeId) {
synchronized (mMethodMap) {
if (token == null) {
@@ -2620,7 +2625,8 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
synchronized (mMethodMap) {
final HashMap<InputMethodInfo, List<InputMethodSubtype>> immis =
- getExplicitlyOrImplicitlyEnabledInputMethodsAndSubtypeListLocked();
+ mSettings.getExplicitlyOrImplicitlyEnabledInputMethodsAndSubtypeListLocked(
+ mContext);
if (immis == null || immis.size() == 0) {
return;
}
@@ -2628,7 +2634,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
hideInputMethodMenuLocked();
final List<ImeSubtypeListItem> imList =
- mImListManager.getSortedInputMethodAndSubtypeList(
+ mSwitchingController.getSortedInputMethodAndSubtypeList(
showSubtypes, mInputShown, isScreenLocked);
if (lastInputMethodSubtypeId == NOT_A_SUBTYPE_ID) {
@@ -2747,66 +2753,6 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
}
}
- private static class ImeSubtypeListItem implements Comparable<ImeSubtypeListItem> {
- public final CharSequence mImeName;
- public final CharSequence mSubtypeName;
- public final InputMethodInfo mImi;
- public final int mSubtypeId;
- private final boolean mIsSystemLocale;
- private final boolean mIsSystemLanguage;
-
- public ImeSubtypeListItem(CharSequence imeName, CharSequence subtypeName,
- InputMethodInfo imi, int subtypeId, String subtypeLocale, String systemLocale) {
- mImeName = imeName;
- mSubtypeName = subtypeName;
- mImi = imi;
- mSubtypeId = subtypeId;
- if (TextUtils.isEmpty(subtypeLocale)) {
- mIsSystemLocale = false;
- mIsSystemLanguage = false;
- } else {
- mIsSystemLocale = subtypeLocale.equals(systemLocale);
- mIsSystemLanguage = mIsSystemLocale
- || subtypeLocale.startsWith(systemLocale.substring(0, 2));
- }
- }
-
- @Override
- public int compareTo(ImeSubtypeListItem other) {
- if (TextUtils.isEmpty(mImeName)) {
- return 1;
- }
- if (TextUtils.isEmpty(other.mImeName)) {
- return -1;
- }
- if (!TextUtils.equals(mImeName, other.mImeName)) {
- return mImeName.toString().compareTo(other.mImeName.toString());
- }
- if (TextUtils.equals(mSubtypeName, other.mSubtypeName)) {
- return 0;
- }
- if (mIsSystemLocale) {
- return -1;
- }
- if (other.mIsSystemLocale) {
- return 1;
- }
- if (mIsSystemLanguage) {
- return -1;
- }
- if (other.mIsSystemLanguage) {
- return 1;
- }
- if (TextUtils.isEmpty(mSubtypeName)) {
- return 1;
- }
- if (TextUtils.isEmpty(other.mSubtypeName)) {
- return -1;
- }
- return mSubtypeName.toString().compareTo(other.mSubtypeName.toString());
- }
- }
-
private static class ImeSubtypeListAdapter extends ArrayAdapter<ImeSubtypeListItem> {
private final LayoutInflater mInflater;
private final int mTextViewResourceId;
@@ -3178,123 +3124,6 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
}
}
- private static class InputMethodAndSubtypeListManager {
- private final Context mContext;
- // Used to load label
- private final PackageManager mPm;
- private final InputMethodManagerService mImms;
- private final String mSystemLocaleStr;
- public InputMethodAndSubtypeListManager(Context context, InputMethodManagerService imms) {
- mContext = context;
- mPm = context.getPackageManager();
- mImms = imms;
- final Locale locale = context.getResources().getConfiguration().locale;
- mSystemLocaleStr = locale != null ? locale.toString() : "";
- }
-
- private final TreeMap<InputMethodInfo, List<InputMethodSubtype>> mSortedImmis =
- new TreeMap<InputMethodInfo, List<InputMethodSubtype>>(
- new Comparator<InputMethodInfo>() {
- @Override
- public int compare(InputMethodInfo imi1, InputMethodInfo imi2) {
- if (imi2 == null) return 0;
- if (imi1 == null) return 1;
- if (mPm == null) {
- return imi1.getId().compareTo(imi2.getId());
- }
- CharSequence imiId1 = imi1.loadLabel(mPm) + "/" + imi1.getId();
- CharSequence imiId2 = imi2.loadLabel(mPm) + "/" + imi2.getId();
- return imiId1.toString().compareTo(imiId2.toString());
- }
- });
-
- public ImeSubtypeListItem getNextInputMethod(
- boolean onlyCurrentIme, InputMethodInfo imi, InputMethodSubtype subtype) {
- if (imi == null) {
- return null;
- }
- final List<ImeSubtypeListItem> imList = getSortedInputMethodAndSubtypeList();
- if (imList.size() <= 1) {
- return null;
- }
- final int N = imList.size();
- final int currentSubtypeId = subtype != null
- ? InputMethodUtils.getSubtypeIdFromHashCode(imi, subtype.hashCode())
- : NOT_A_SUBTYPE_ID;
- for (int i = 0; i < N; ++i) {
- final ImeSubtypeListItem isli = imList.get(i);
- if (isli.mImi.equals(imi) && isli.mSubtypeId == currentSubtypeId) {
- if (!onlyCurrentIme) {
- return imList.get((i + 1) % N);
- }
- for (int j = 0; j < N - 1; ++j) {
- final ImeSubtypeListItem candidate = imList.get((i + j + 1) % N);
- if (candidate.mImi.equals(imi)) {
- return candidate;
- }
- }
- return null;
- }
- }
- return null;
- }
-
- public List<ImeSubtypeListItem> getSortedInputMethodAndSubtypeList() {
- return getSortedInputMethodAndSubtypeList(true, false, false);
- }
-
- public List<ImeSubtypeListItem> getSortedInputMethodAndSubtypeList(boolean showSubtypes,
- boolean inputShown, boolean isScreenLocked) {
- final ArrayList<ImeSubtypeListItem> imList = new ArrayList<ImeSubtypeListItem>();
- final HashMap<InputMethodInfo, List<InputMethodSubtype>> immis =
- mImms.getExplicitlyOrImplicitlyEnabledInputMethodsAndSubtypeListLocked();
- if (immis == null || immis.size() == 0) {
- return Collections.emptyList();
- }
- mSortedImmis.clear();
- mSortedImmis.putAll(immis);
- for (InputMethodInfo imi : mSortedImmis.keySet()) {
- if (imi == null) continue;
- List<InputMethodSubtype> explicitlyOrImplicitlyEnabledSubtypeList = immis.get(imi);
- HashSet<String> enabledSubtypeSet = new HashSet<String>();
- for (InputMethodSubtype subtype: explicitlyOrImplicitlyEnabledSubtypeList) {
- enabledSubtypeSet.add(String.valueOf(subtype.hashCode()));
- }
- final CharSequence imeLabel = imi.loadLabel(mPm);
- if (showSubtypes && enabledSubtypeSet.size() > 0) {
- final int subtypeCount = imi.getSubtypeCount();
- if (DEBUG) {
- Slog.v(TAG, "Add subtypes: " + subtypeCount + ", " + imi.getId());
- }
- for (int j = 0; j < subtypeCount; ++j) {
- final InputMethodSubtype subtype = imi.getSubtypeAt(j);
- final String subtypeHashCode = String.valueOf(subtype.hashCode());
- // We show all enabled IMEs and subtypes when an IME is shown.
- if (enabledSubtypeSet.contains(subtypeHashCode)
- && ((inputShown && !isScreenLocked) || !subtype.isAuxiliary())) {
- final CharSequence subtypeLabel =
- subtype.overridesImplicitlyEnabledSubtype() ? null
- : subtype.getDisplayName(mContext, imi.getPackageName(),
- imi.getServiceInfo().applicationInfo);
- imList.add(new ImeSubtypeListItem(imeLabel, subtypeLabel, imi, j,
- subtype.getLocale(), mSystemLocaleStr));
-
- // Removing this subtype from enabledSubtypeSet because we no longer
- // need to add an entry of this subtype to imList to avoid duplicated
- // entries.
- enabledSubtypeSet.remove(subtypeHashCode);
- }
- }
- } else {
- imList.add(new ImeSubtypeListItem(imeLabel, null, imi, NOT_A_SUBTYPE_ID,
- null, mSystemLocaleStr));
- }
- }
- Collections.sort(imList);
- return imList;
- }
- }
-
// TODO: Cache the state for each user and reset when the cached user is removed.
private static class InputMethodFileManager {
private static final String SYSTEM_PATH = "system";
diff --git a/services/java/com/android/server/NetworkManagementService.java b/services/java/com/android/server/NetworkManagementService.java
index 92f99c2..9a0d648 100644
--- a/services/java/com/android/server/NetworkManagementService.java
+++ b/services/java/com/android/server/NetworkManagementService.java
@@ -455,6 +455,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub
@Override
public boolean onEvent(int code, String raw, String[] cooked) {
+ String errorMessage = String.format("Invalid event from daemon (%s)", raw);
switch (code) {
case NetdResponseCode.InterfaceChange:
/*
@@ -465,8 +466,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub
* "NNN Iface linkstatus <name> <up/down>"
*/
if (cooked.length < 4 || !cooked[1].equals("Iface")) {
- throw new IllegalStateException(
- String.format("Invalid event from daemon (%s)", raw));
+ throw new IllegalStateException(errorMessage);
}
if (cooked[2].equals("added")) {
notifyInterfaceAdded(cooked[3]);
@@ -481,8 +481,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub
notifyInterfaceLinkStateChanged(cooked[3], cooked[4].equals("up"));
return true;
}
- throw new IllegalStateException(
- String.format("Invalid event from daemon (%s)", raw));
+ throw new IllegalStateException(errorMessage);
// break;
case NetdResponseCode.BandwidthControl:
/*
@@ -490,15 +489,13 @@ public class NetworkManagementService extends INetworkManagementService.Stub
* Format: "NNN limit alert <alertName> <ifaceName>"
*/
if (cooked.length < 5 || !cooked[1].equals("limit")) {
- throw new IllegalStateException(
- String.format("Invalid event from daemon (%s)", raw));
+ throw new IllegalStateException(errorMessage);
}
if (cooked[2].equals("alert")) {
notifyLimitReached(cooked[3], cooked[4]);
return true;
}
- throw new IllegalStateException(
- String.format("Invalid event from daemon (%s)", raw));
+ throw new IllegalStateException(errorMessage);
// break;
case NetdResponseCode.InterfaceClassActivity:
/*
@@ -506,8 +503,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub
* Format: "NNN IfaceClass <active/idle> <label>"
*/
if (cooked.length < 4 || !cooked[1].equals("IfaceClass")) {
- throw new IllegalStateException(
- String.format("Invalid event from daemon (%s)", raw));
+ throw new IllegalStateException(errorMessage);
}
boolean isActive = cooked[2].equals("active");
notifyInterfaceClassActivity(cooked[3], isActive);
@@ -519,9 +515,8 @@ public class NetworkManagementService extends INetworkManagementService.Stub
* Format: "NNN Address updated <addr> <iface> <flags> <scope>"
* "NNN Address removed <addr> <iface> <flags> <scope>"
*/
- String msg = String.format("Invalid event from daemon (%s)", raw);
- if (cooked.length < 6 || !cooked[1].equals("Address")) {
- throw new IllegalStateException(msg);
+ if (cooked.length < 7 || !cooked[1].equals("Address")) {
+ throw new IllegalStateException(errorMessage);
}
int flags;
@@ -530,7 +525,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub
flags = Integer.parseInt(cooked[5]);
scope = Integer.parseInt(cooked[6]);
} catch(NumberFormatException e) {
- throw new IllegalStateException(msg);
+ throw new IllegalStateException(errorMessage);
}
if (cooked[2].equals("updated")) {
diff --git a/services/java/com/android/server/WallpaperManagerService.java b/services/java/com/android/server/WallpaperManagerService.java
index 6957bac..205ce71 100644
--- a/services/java/com/android/server/WallpaperManagerService.java
+++ b/services/java/com/android/server/WallpaperManagerService.java
@@ -85,7 +85,7 @@ import com.android.internal.util.FastXmlSerializer;
import com.android.internal.util.JournaledFile;
class WallpaperManagerService extends IWallpaperManager.Stub {
- static final String TAG = "WallpaperService";
+ static final String TAG = "WallpaperManagerService";
static final boolean DEBUG = false;
final Object mLock = new Object[0];
diff --git a/services/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/java/com/android/server/accessibility/AccessibilityManagerService.java
index ccac0d3..5e10d26 100644
--- a/services/java/com/android/server/accessibility/AccessibilityManagerService.java
+++ b/services/java/com/android/server/accessibility/AccessibilityManagerService.java
@@ -44,6 +44,7 @@ import android.graphics.Rect;
import android.hardware.display.DisplayManager;
import android.hardware.input.InputManager;
import android.net.Uri;
+import android.opengl.Matrix;
import android.os.Binder;
import android.os.Build;
import android.os.Bundle;
@@ -51,6 +52,7 @@ import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
import android.os.Message;
+import android.os.Parcel;
import android.os.Process;
import android.os.RemoteCallbackList;
import android.os.RemoteException;
@@ -139,6 +141,51 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
private static final int MAX_POOL_SIZE = 10;
+ /** Matrix and offset used for converting color to grayscale. */
+ private static final float[] GRAYSCALE_MATRIX = new float[] {
+ .2126f, .2126f, .2126f, 0,
+ .7152f, .7152f, .7152f, 0,
+ .0722f, .0722f, .0722f, 0,
+ 0, 0, 0, 1
+ };
+
+ /** Matrix and offset used for standard display inversion. */
+ private static final float[] INVERSION_MATRIX_STANDARD = new float[] {
+ -1, 0, 0, 0,
+ 0, -1, 0, 0,
+ 0, 0, -1, 0,
+ 1, 1, 1, 1
+ };
+
+ /** Matrix and offset used for hue-only display inversion. */
+ private static final float[] INVERSION_MATRIX_HUE_ONLY = new float[] {
+ 0, .5f, .5f, 0,
+ .5f, 0, .5f, 0,
+ .5f, .5f, 0, 0,
+ 0, 0, 0, 1
+ };
+
+ /** Matrix and offset used for value-only display inversion. */
+ private static final float[] INVERSION_MATRIX_VALUE_ONLY = new float[] {
+ 0, -.5f, -.5f, 0,
+ -.5f, 0, -.5f, 0,
+ -.5f, -.5f, 0, 0,
+ 1, 1, 1, 1
+ };
+
+ /** Default contrast for display contrast enhancement. */
+ private static final float DEFAULT_DISPLAY_CONTRAST = 2;
+
+ /** Default brightness for display contrast enhancement. */
+ private static final float DEFAULT_DISPLAY_BRIGHTNESS = 0;
+
+ /** Default inversion mode for display color inversion. */
+ private static final int DEFAULT_DISPLAY_INVERSION = AccessibilityManager.INVERSION_STANDARD;
+
+ /** Default inversion mode for display color correction. */
+ private static final int DEFAULT_DISPLAY_DALTONIZER =
+ AccessibilityManager.DALTONIZER_CORRECT_DEUTERANOMALY;
+
private static int sIdCounter = 0;
private static int sNextWindowId;
@@ -1297,6 +1344,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
updateFilterKeyEventsLocked(userState);
updateTouchExplorationLocked(userState);
updateEnhancedWebAccessibilityLocked(userState);
+ updateDisplayColorAdjustmentSettingsLocked(userState);
scheduleUpdateInputFilter(userState);
scheduleUpdateClientsIfNeededLocked(userState);
}
@@ -1355,6 +1403,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
somthingChanged |= readTouchExplorationEnabledSettingLocked(userState);
somthingChanged |= readEnhancedWebAccessibilityEnabledChangedLocked(userState);
somthingChanged |= readDisplayMagnificationEnabledSettingLocked(userState);
+ somthingChanged |= readDisplayColorAdjustmentSettingsLocked(userState);
return somthingChanged;
}
@@ -1403,6 +1452,124 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
return false;
}
+ private boolean readDisplayColorAdjustmentSettingsLocked(UserState userState) {
+ final ContentResolver cr = mContext.getContentResolver();
+ final int userId = userState.mUserId;
+
+ boolean hasColorTransform = Settings.Secure.getIntForUser(
+ cr, Settings.Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED, 0, userId) == 1;
+
+ if (!hasColorTransform) {
+ hasColorTransform |= Settings.Secure.getIntForUser(
+ cr, Settings.Secure.ACCESSIBILITY_DISPLAY_CONTRAST_ENABLED, 0, userId) == 1;
+ }
+
+ if (!hasColorTransform) {
+ hasColorTransform |= Settings.Secure.getIntForUser(
+ cr, Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED, 0, userId) == 1;
+ }
+
+ if (userState.mHasDisplayColorAdjustment != hasColorTransform) {
+ userState.mHasDisplayColorAdjustment = hasColorTransform;
+ return true;
+ }
+
+ // If adjustment is enabled, always assume there was a transform change.
+ return hasColorTransform;
+ }
+
+ private void updateDisplayColorAdjustmentSettingsLocked(UserState userState) {
+ final ContentResolver cr = mContext.getContentResolver();
+ final int userId = userState.mUserId;
+ float[] colorMatrix = new float[16];
+ float[] outputMatrix = new float[16];
+ boolean hasColorTransform = false;
+
+ Matrix.setIdentityM(colorMatrix, 0);
+
+ final boolean inversionEnabled = Settings.Secure.getIntForUser(
+ cr, Settings.Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED, 0, userId) == 1;
+ if (inversionEnabled) {
+ final int inversionMode = Settings.Secure.getIntForUser(cr,
+ Settings.Secure.ACCESSIBILITY_DISPLAY_INVERSION, DEFAULT_DISPLAY_INVERSION,
+ userId);
+ final float[] inversionMatrix;
+ switch (inversionMode) {
+ case AccessibilityManager.INVERSION_HUE_ONLY:
+ inversionMatrix = INVERSION_MATRIX_HUE_ONLY;
+ break;
+ case AccessibilityManager.INVERSION_VALUE_ONLY:
+ inversionMatrix = INVERSION_MATRIX_VALUE_ONLY;
+ break;
+ default:
+ inversionMatrix = INVERSION_MATRIX_STANDARD;
+ }
+
+ Matrix.multiplyMM(outputMatrix, 0, colorMatrix, 0, inversionMatrix, 0);
+
+ final float[] temp = colorMatrix;
+ colorMatrix = outputMatrix;
+ outputMatrix = colorMatrix;
+
+ hasColorTransform = true;
+ }
+
+ final boolean contrastEnabled = Settings.Secure.getIntForUser(
+ cr, Settings.Secure.ACCESSIBILITY_DISPLAY_CONTRAST_ENABLED, 0, userId) == 1;
+ if (contrastEnabled) {
+ final float contrast = Settings.Secure.getFloatForUser(cr,
+ Settings.Secure.ACCESSIBILITY_DISPLAY_CONTRAST, DEFAULT_DISPLAY_CONTRAST,
+ userId);
+ final float brightness = Settings.Secure.getFloatForUser(cr,
+ Settings.Secure.ACCESSIBILITY_DISPLAY_BRIGHTNESS, DEFAULT_DISPLAY_BRIGHTNESS,
+ userId);
+ final float off = brightness * contrast - 0.5f * contrast + 0.5f;
+ final float[] contrastMatrix = {
+ contrast, 0, 0, 0,
+ 0, contrast, 0, 0,
+ 0, 0, contrast, 0,
+ off, off, off, 1
+ };
+
+ Matrix.multiplyMM(outputMatrix, 0, colorMatrix, 0, contrastMatrix, 0);
+
+ final float[] temp = colorMatrix;
+ colorMatrix = outputMatrix;
+ outputMatrix = colorMatrix;
+
+ hasColorTransform = true;
+ }
+
+ final boolean daltonizerEnabled = Settings.Secure.getIntForUser(
+ cr, Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED, 0, userId) != 0;
+ if (daltonizerEnabled) {
+ final int daltonizerMode = Settings.Secure.getIntForUser(cr,
+ Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER, DEFAULT_DISPLAY_DALTONIZER,
+ userId);
+ // Monochromacy isn't supported by the native Daltonizer.
+ if (daltonizerMode == AccessibilityManager.DALTONIZER_SIMULATE_MONOCHROMACY) {
+ Matrix.multiplyMM(outputMatrix, 0, colorMatrix, 0, GRAYSCALE_MATRIX, 0);
+
+ final float[] temp = colorMatrix;
+ colorMatrix = outputMatrix;
+ outputMatrix = temp;
+
+ hasColorTransform = true;
+ nativeSetDaltonizerMode(AccessibilityManager.DALTONIZER_DISABLED);
+ } else {
+ nativeSetDaltonizerMode(daltonizerMode);
+ }
+ } else {
+ nativeSetDaltonizerMode(AccessibilityManager.DALTONIZER_DISABLED);
+ }
+
+ if (hasColorTransform) {
+ nativeSetColorTransform(colorMatrix);
+ } else {
+ nativeSetColorTransform(null);
+ }
+ }
+
private void updateTouchExplorationLocked(UserState userState) {
boolean enabled = false;
final int serviceCount = userState.mBoundServices.size();
@@ -1529,6 +1696,56 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
}
}
+ /**
+ * Sets the surface flinger's Daltonization mode. This adjusts the color
+ * space to correct for or simulate various types of color blindness.
+ *
+ * @param mode new Daltonization mode
+ */
+ private static void nativeSetDaltonizerMode(int mode) {
+ try {
+ final IBinder flinger = ServiceManager.getService("SurfaceFlinger");
+ if (flinger != null) {
+ final Parcel data = Parcel.obtain();
+ data.writeInterfaceToken("android.ui.ISurfaceComposer");
+ data.writeInt(mode);
+ flinger.transact(1014, data, null, 0);
+ data.recycle();
+ }
+ } catch (RemoteException ex) {
+ Slog.e(LOG_TAG, "Failed to set Daltonizer mode", ex);
+ }
+ }
+
+ /**
+ * Sets the surface flinger's color transformation as a 4x4 matrix. If the
+ * matrix is null, color transformations are disabled.
+ *
+ * @param m the float array that holds the transformation matrix, or null to
+ * disable transformation
+ */
+ private static void nativeSetColorTransform(float[] m) {
+ try {
+ final IBinder flinger = ServiceManager.getService("SurfaceFlinger");
+ if (flinger != null) {
+ final Parcel data = Parcel.obtain();
+ data.writeInterfaceToken("android.ui.ISurfaceComposer");
+ if (m != null) {
+ data.writeInt(1);
+ for (int i = 0; i < 16; i++) {
+ data.writeFloat(m[i]);
+ }
+ } else {
+ data.writeInt(0);
+ }
+ flinger.transact(1015, data, null, 0);
+ data.recycle();
+ }
+ } catch (RemoteException ex) {
+ Slog.e(LOG_TAG, "Failed to set color transform", ex);
+ }
+ }
+
private class AccessibilityConnectionWrapper implements DeathRecipient {
private final int mWindowId;
private final int mUserId;
@@ -2952,6 +3169,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
public boolean mIsEnhancedWebAccessibilityEnabled;
public boolean mIsDisplayMagnificationEnabled;
public boolean mIsFilterKeyEventsEnabled;
+ public boolean mHasDisplayColorAdjustment;
private Service mUiAutomationService;
private IAccessibilityServiceClient mUiAutomationServiceClient;
@@ -3043,6 +3261,23 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
private final Uri mEnhancedWebAccessibilityUri = Settings.Secure
.getUriFor(Settings.Secure.ACCESSIBILITY_SCRIPT_INJECTION);
+ private final Uri mDisplayContrastEnabledUri = Settings.Secure.getUriFor(
+ Settings.Secure.ACCESSIBILITY_DISPLAY_CONTRAST_ENABLED);
+ private final Uri mDisplayContrastUri = Settings.Secure.getUriFor(
+ Settings.Secure.ACCESSIBILITY_DISPLAY_CONTRAST);
+ private final Uri mDisplayBrightnessUri = Settings.Secure.getUriFor(
+ Settings.Secure.ACCESSIBILITY_DISPLAY_BRIGHTNESS);
+
+ private final Uri mDisplayInversionEnabledUri = Settings.Secure.getUriFor(
+ Settings.Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED);
+ private final Uri mDisplayInversionUri = Settings.Secure.getUriFor(
+ Settings.Secure.ACCESSIBILITY_DISPLAY_INVERSION);
+
+ private final Uri mDisplayDaltonizerEnabledUri = Settings.Secure.getUriFor(
+ Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED);
+ private final Uri mDisplayDaltonizerUri = Settings.Secure.getUriFor(
+ Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER);
+
public AccessibilityContentObserver(Handler handler) {
super(handler);
}
@@ -3061,6 +3296,20 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
false, this, UserHandle.USER_ALL);
contentResolver.registerContentObserver(mEnhancedWebAccessibilityUri,
false, this, UserHandle.USER_ALL);
+ contentResolver.registerContentObserver(
+ mDisplayContrastEnabledUri, false, this, UserHandle.USER_ALL);
+ contentResolver.registerContentObserver(
+ mDisplayContrastUri, false, this, UserHandle.USER_ALL);
+ contentResolver.registerContentObserver(
+ mDisplayBrightnessUri, false, this, UserHandle.USER_ALL);
+ contentResolver.registerContentObserver(
+ mDisplayInversionEnabledUri, false, this, UserHandle.USER_ALL);
+ contentResolver.registerContentObserver(
+ mDisplayInversionUri, false, this, UserHandle.USER_ALL);
+ contentResolver.registerContentObserver(
+ mDisplayDaltonizerEnabledUri, false, this, UserHandle.USER_ALL);
+ contentResolver.registerContentObserver(
+ mDisplayDaltonizerUri, false, this, UserHandle.USER_ALL);
}
@Override
@@ -3125,6 +3374,22 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
}
}
}
+ } else if (mDisplayContrastEnabledUri.equals(uri)
+ || mDisplayInversionEnabledUri.equals(uri)
+ || mDisplayDaltonizerEnabledUri.equals(uri)
+ || mDisplayContrastUri.equals(uri)
+ || mDisplayBrightnessUri.equals(uri)
+ || mDisplayInversionUri.equals(uri)
+ || mDisplayDaltonizerUri.equals(uri)) {
+ synchronized (mLock) {
+ // We will update when the automation service dies.
+ UserState userState = getCurrentUserStateLocked();
+ if (userState.mUiAutomationService == null) {
+ if (readDisplayColorAdjustmentSettingsLocked(userState)) {
+ updateDisplayColorAdjustmentSettingsLocked(userState);
+ }
+ }
+ }
}
}
}
diff --git a/services/java/com/android/server/am/ActivityManagerService.java b/services/java/com/android/server/am/ActivityManagerService.java
index 0507e60..b521ee7 100644
--- a/services/java/com/android/server/am/ActivityManagerService.java
+++ b/services/java/com/android/server/am/ActivityManagerService.java
@@ -3585,9 +3585,13 @@ public final class ActivityManagerService extends ActivityManagerNative
*/
private final void handleAppDiedLocked(ProcessRecord app,
boolean restarting, boolean allowRestart) {
+ int pid = app.pid;
cleanUpApplicationRecordLocked(app, restarting, allowRestart, -1);
if (!restarting) {
removeLruProcessLocked(app);
+ if (pid > 0) {
+ ProcessList.remove(pid);
+ }
}
if (mProfileProc == app) {
@@ -12336,6 +12340,7 @@ public final class ActivityManagerService extends ActivityManagerNative
boolean restarting, boolean allowRestart, int index) {
if (index >= 0) {
removeLruProcessLocked(app);
+ ProcessList.remove(app.pid);
}
mProcessesToGc.remove(app);
@@ -15198,16 +15203,13 @@ public final class ActivityManagerService extends ActivityManagerNative
}
if (app.curAdj != app.setAdj) {
- if (Process.setOomAdj(app.pid, app.curAdj)) {
- if (DEBUG_SWITCH || DEBUG_OOM_ADJ) Slog.v(
- TAG, "Set " + app.pid + " " + app.processName +
- " adj " + app.curAdj + ": " + app.adjType);
- app.setAdj = app.curAdj;
- } else {
- success = false;
- Slog.w(TAG, "Failed setting oom adj of " + app + " to " + app.curAdj);
- }
+ ProcessList.setOomAdj(app.pid, app.curAdj);
+ if (DEBUG_SWITCH || DEBUG_OOM_ADJ) Slog.v(
+ TAG, "Set " + app.pid + " " + app.processName +
+ " adj " + app.curAdj + ": " + app.adjType);
+ app.setAdj = app.curAdj;
}
+
if (app.setSchedGroup != app.curSchedGroup) {
app.setSchedGroup = app.curSchedGroup;
if (DEBUG_SWITCH || DEBUG_OOM_ADJ) Slog.v(TAG,
diff --git a/services/java/com/android/server/am/ActivityRecord.java b/services/java/com/android/server/am/ActivityRecord.java
index 49f29fe..5776181 100644
--- a/services/java/com/android/server/am/ActivityRecord.java
+++ b/services/java/com/android/server/am/ActivityRecord.java
@@ -143,6 +143,7 @@ final class ActivityRecord {
private boolean inHistory; // are we in the history stack?
final ActivityStackSupervisor mStackSupervisor;
+ boolean mStartingWindowShown = false;
void dump(PrintWriter pw, String prefix) {
final long now = SystemClock.uptimeMillis();
diff --git a/services/java/com/android/server/am/ActivityStack.java b/services/java/com/android/server/am/ActivityStack.java
index e87bc52..2312d41 100644
--- a/services/java/com/android/server/am/ActivityStack.java
+++ b/services/java/com/android/server/am/ActivityStack.java
@@ -120,8 +120,7 @@ final class ActivityStack {
// convertToTranslucent().
static final long TRANSLUCENT_CONVERSION_TIMEOUT = 2000;
- static final boolean SCREENSHOT_FORCE_565 = ActivityManager
- .isLowRamDeviceStatic() ? true : false;
+ static final boolean SCREENSHOT_FORCE_565 = ActivityManager.isLowRamDeviceStatic();
enum ActivityState {
INITIALIZING,
@@ -397,8 +396,9 @@ final class ActivityStack {
// be simplified once we stop storing tasks with empty mActivities lists.
for (int taskNdx = mTaskHistory.size() - 1; taskNdx >= 0; --taskNdx) {
ArrayList<ActivityRecord> activities = mTaskHistory.get(taskNdx).mActivities;
- for (int activityNdx = activities.size() - 1; activityNdx >= 0; --activityNdx) {
- return activities.get(activityNdx);
+ final int topActivityNdx = activities.size() - 1;
+ if (topActivityNdx >= 0) {
+ return activities.get(topActivityNdx);
}
}
return null;
@@ -435,25 +435,6 @@ final class ActivityStack {
return null;
}
- boolean containsApp(ProcessRecord app) {
- if (app == null) {
- return false;
- }
- for (int taskNdx = mTaskHistory.size() - 1; taskNdx >= 0; --taskNdx) {
- final ArrayList<ActivityRecord> activities = mTaskHistory.get(taskNdx).mActivities;
- for (int activityNdx = activities.size() - 1; activityNdx >= 0; --activityNdx) {
- final ActivityRecord r = activities.get(activityNdx);
- if (r.finishing) {
- continue;
- }
- if (r.app == app) {
- return true;
- }
- }
- }
- return false;
- }
-
final boolean updateLRUListLocked(ActivityRecord r) {
final boolean hadit = mLRUActivities.remove(r);
mLRUActivities.add(r);
@@ -1230,6 +1211,32 @@ final class ActivityStack {
}
}
+ /** If any activities below the top running one are in the INITIALIZING state and they have a
+ * starting window displayed then remove that starting window. It is possible that the activity
+ * in this state will never resumed in which case that starting window will be orphaned. */
+ void cancelInitializingActivities() {
+ final ActivityRecord topActivity = topRunningActivityLocked(null);
+ boolean aboveTop = true;
+ for (int taskNdx = mTaskHistory.size() - 1; taskNdx >= 0; --taskNdx) {
+ final ArrayList<ActivityRecord> activities = mTaskHistory.get(taskNdx).mActivities;
+ for (int activityNdx = activities.size() - 1; activityNdx >= 0; --activityNdx) {
+ final ActivityRecord r = activities.get(activityNdx);
+ if (aboveTop) {
+ if (r == topActivity) {
+ aboveTop = false;
+ }
+ continue;
+ }
+
+ if (r.state == ActivityState.INITIALIZING && r.mStartingWindowShown) {
+ if (DEBUG_VISBILITY) Slog.w(TAG, "Found orphaned starting window " + r);
+ r.mStartingWindowShown = false;
+ mWindowManager.removeAppStartingWindow(r.appToken);
+ }
+ }
+ }
+ }
+
/**
* Ensure that the top activity in the stack is resumed.
*
@@ -1246,6 +1253,8 @@ final class ActivityStack {
final boolean resumeTopActivityLocked(ActivityRecord prev, Bundle options) {
if (ActivityManagerService.DEBUG_LOCKSCREEN) mService.logLockScreen("");
+ cancelInitializingActivities();
+
// Find the first activity that is not finishing.
ActivityRecord next = topRunningActivityLocked(null);
@@ -1811,6 +1820,7 @@ final class ActivityStack {
r.info.applicationInfo), r.nonLocalizedLabel,
r.labelRes, r.icon, r.logo, r.windowFlags,
prev != null ? prev.appToken : null, showStartingIcon);
+ r.mStartingWindowShown = true;
}
} else {
// If this is the first activity, don't do any fancy animations,
diff --git a/services/java/com/android/server/am/ProcessList.java b/services/java/com/android/server/am/ProcessList.java
index d3777c7..f5920c8 100644
--- a/services/java/com/android/server/am/ProcessList.java
+++ b/services/java/com/android/server/am/ProcessList.java
@@ -18,6 +18,8 @@ package com.android.server.am;
import java.io.FileOutputStream;
import java.io.IOException;
+import java.io.OutputStream;
+import java.nio.ByteBuffer;
import android.app.ActivityManager;
import com.android.internal.util.MemInfoReader;
@@ -26,6 +28,8 @@ import com.android.server.wm.WindowManagerService;
import android.content.res.Resources;
import android.graphics.Point;
import android.os.SystemProperties;
+import android.net.LocalSocketAddress;
+import android.net.LocalSocket;
import android.util.Slog;
import android.view.Display;
@@ -141,6 +145,16 @@ final class ProcessList {
// Threshold of number of cached+empty where we consider memory critical.
static final int TRIM_LOW_THRESHOLD = 5;
+ // Low Memory Killer Daemon command codes.
+ // These must be kept in sync with the definitions in lmkd.c
+ //
+ // LMK_TARGET <minfree> <minkillprio> ... (up to 6 pairs)
+ // LMK_PROCPRIO <pid> <prio>
+ // LMK_PROCREMOVE <pid>
+ static final byte LMK_TARGET = 0;
+ static final byte LMK_PROCPRIO = 1;
+ static final byte LMK_PROCREMOVE = 2;
+
// These are the various interesting memory levels that we will give to
// the OOM killer. Note that the OOM killer only supports 6 slots, so we
// can't give it a different value for every possible kind of process.
@@ -150,18 +164,18 @@ final class ProcessList {
};
// These are the low-end OOM level limits. This is appropriate for an
// HVGA or smaller phone with less than 512MB. Values are in KB.
- private final long[] mOomMinFreeLow = new long[] {
+ private final int[] mOomMinFreeLow = new int[] {
8192, 12288, 16384,
24576, 28672, 32768
};
// These are the high-end OOM level limits. This is appropriate for a
// 1280x800 or larger screen with around 1GB RAM. Values are in KB.
- private final long[] mOomMinFreeHigh = new long[] {
+ private final int[] mOomMinFreeHigh = new int[] {
49152, 61440, 73728,
86016, 98304, 122880
};
// The actual OOM killer memory levels we are using.
- private final long[] mOomMinFree = new long[mOomAdj.length];
+ private final int[] mOomMinFree = new int[mOomAdj.length];
private final long mTotalMemMb;
@@ -169,6 +183,9 @@ final class ProcessList {
private boolean mHaveDisplaySize;
+ private static LocalSocket sLmkdSocket;
+ private static OutputStream sLmkdOutputStream;
+
ProcessList() {
MemInfoReader minfo = new MemInfoReader();
minfo.readMemInfo();
@@ -202,9 +219,6 @@ final class ProcessList {
+ " dh=" + displayHeight);
}
- StringBuilder adjString = new StringBuilder();
- StringBuilder memString = new StringBuilder();
-
float scale = scaleMem > scaleDisp ? scaleMem : scaleDisp;
if (scale < 0) scale = 0;
else if (scale > 1) scale = 1;
@@ -217,20 +231,20 @@ final class ProcessList {
}
for (int i=0; i<mOomAdj.length; i++) {
- long low = mOomMinFreeLow[i];
- long high = mOomMinFreeHigh[i];
- mOomMinFree[i] = (long)(low + ((high-low)*scale));
+ int low = mOomMinFreeLow[i];
+ int high = mOomMinFreeHigh[i];
+ mOomMinFree[i] = (int)(low + ((high-low)*scale));
}
if (minfree_abs >= 0) {
for (int i=0; i<mOomAdj.length; i++) {
- mOomMinFree[i] = (long)((float)minfree_abs * mOomMinFree[i] / mOomMinFree[mOomAdj.length - 1]);
+ mOomMinFree[i] = (int)((float)minfree_abs * mOomMinFree[i] / mOomMinFree[mOomAdj.length - 1]);
}
}
if (minfree_adj != 0) {
for (int i=0; i<mOomAdj.length; i++) {
- mOomMinFree[i] += (long)((float)minfree_adj * mOomMinFree[i] / mOomMinFree[mOomAdj.length - 1]);
+ mOomMinFree[i] += (int)((float)minfree_adj * mOomMinFree[i] / mOomMinFree[mOomAdj.length - 1]);
if (mOomMinFree[i] < 0) {
mOomMinFree[i] = 0;
}
@@ -242,15 +256,6 @@ final class ProcessList {
// before killing background processes.
mCachedRestoreLevel = (getMemLevel(ProcessList.CACHED_APP_MAX_ADJ)/1024) / 3;
- for (int i=0; i<mOomAdj.length; i++) {
- if (i > 0) {
- adjString.append(',');
- memString.append(',');
- }
- adjString.append(mOomAdj[i]);
- memString.append((mOomMinFree[i]*1024)/PAGE_SIZE);
- }
-
// Ask the kernel to try to keep enough memory free to allocate 3 full
// screen 32bpp buffers without entering direct reclaim.
int reserve = displayWidth * displayHeight * 4 * 3 / 1024;
@@ -268,10 +273,15 @@ final class ProcessList {
}
}
- //Slog.i("XXXXXXX", "******************************* MINFREE: " + memString);
if (write) {
- writeFile("/sys/module/lowmemorykiller/parameters/adj", adjString.toString());
- writeFile("/sys/module/lowmemorykiller/parameters/minfree", memString.toString());
+ ByteBuffer buf = ByteBuffer.allocate(4 * (2*mOomAdj.length + 1));
+ buf.putInt(LMK_TARGET);
+ for (int i=0; i<mOomAdj.length; i++) {
+ buf.putInt((mOomMinFree[i]*1024)/PAGE_SIZE);
+ buf.putInt(mOomAdj[i]);
+ }
+
+ writeLmkd(buf);
SystemProperties.set("sys.sysctl.extra_free_kbytes", Integer.toString(reserve));
}
// GB: 2048,3072,4096,6144,7168,8192
@@ -506,19 +516,78 @@ final class ProcessList {
return mCachedRestoreLevel;
}
- private void writeFile(String path, String data) {
- FileOutputStream fos = null;
+ /**
+ * Set the out-of-memory badness adjustment for a process.
+ *
+ * @param pid The process identifier to set.
+ * @param amt Adjustment value -- lmkd allows -16 to +15.
+ *
+ * {@hide}
+ */
+ public static final void setOomAdj(int pid, int amt) {
+ if (amt == UNKNOWN_ADJ)
+ return;
+
+ ByteBuffer buf = ByteBuffer.allocate(4 * 3);
+ buf.putInt(LMK_PROCPRIO);
+ buf.putInt(pid);
+ buf.putInt(amt);
+ writeLmkd(buf);
+ }
+
+ /*
+ * {@hide}
+ */
+ public static final void remove(int pid) {
+ ByteBuffer buf = ByteBuffer.allocate(4 * 2);
+ buf.putInt(LMK_PROCREMOVE);
+ buf.putInt(pid);
+ writeLmkd(buf);
+ }
+
+ private static boolean openLmkdSocket() {
try {
- fos = new FileOutputStream(path);
- fos.write(data.getBytes());
- } catch (IOException e) {
- Slog.w(ActivityManagerService.TAG, "Unable to write " + path);
- } finally {
- if (fos != null) {
+ sLmkdSocket = new LocalSocket(LocalSocket.SOCKET_SEQPACKET);
+ sLmkdSocket.connect(
+ new LocalSocketAddress("lmkd",
+ LocalSocketAddress.Namespace.RESERVED));
+ sLmkdOutputStream = sLmkdSocket.getOutputStream();
+ } catch (IOException ex) {
+ Slog.w(ActivityManagerService.TAG,
+ "lowmemorykiller daemon socket open failed");
+ sLmkdSocket = null;
+ return false;
+ }
+
+ return true;
+ }
+
+ private static void writeLmkd(ByteBuffer buf) {
+
+ for (int i = 0; i < 3; i++) {
+ if (sLmkdSocket == null) {
+ if (openLmkdSocket() == false) {
+ try {
+ Thread.sleep(1000);
+ } catch (InterruptedException ie) {
+ }
+ continue;
+ }
+ }
+
+ try {
+ sLmkdOutputStream.write(buf.array(), 0, buf.position());
+ return;
+ } catch (IOException ex) {
+ Slog.w(ActivityManagerService.TAG,
+ "Error writing to lowmemorykiller socket");
+
try {
- fos.close();
- } catch (IOException e) {
+ sLmkdSocket.close();
+ } catch (IOException ex2) {
}
+
+ sLmkdSocket = null;
}
}
}
diff --git a/services/java/com/android/server/connectivity/Tethering.java b/services/java/com/android/server/connectivity/Tethering.java
index 231a40a..adf1dfc 100644
--- a/services/java/com/android/server/connectivity/Tethering.java
+++ b/services/java/com/android/server/connectivity/Tethering.java
@@ -51,6 +51,7 @@ import com.android.internal.util.IState;
import com.android.internal.util.State;
import com.android.internal.util.StateMachine;
import com.android.server.IoThread;
+import com.android.server.net.BaseNetworkObserver;
import com.google.android.collect.Lists;
import java.io.FileDescriptor;
@@ -70,7 +71,7 @@ import java.util.Set;
*
* TODO - look for parent classes and code sharing
*/
-public class Tethering extends INetworkManagementEventObserver.Stub {
+public class Tethering extends BaseNetworkObserver {
private Context mContext;
private final static String TAG = "Tethering";
@@ -315,14 +316,6 @@ public class Tethering extends INetworkManagementEventObserver.Stub {
}
}
- public void addressUpdated(String address, String iface, int flags, int scope) {}
-
- public void addressRemoved(String address, String iface, int flags, int scope) {}
-
- public void limitReached(String limitName, String iface) {}
-
- public void interfaceClassDataActivityChanged(String label, boolean active) {}
-
public int tether(String iface) {
if (DBG) Log.d(TAG, "Tethering " + iface);
TetherInterfaceSM sm = null;
diff --git a/services/java/com/android/server/content/ContentService.java b/services/java/com/android/server/content/ContentService.java
index cb35ef1..11c3fa0 100644
--- a/services/java/com/android/server/content/ContentService.java
+++ b/services/java/com/android/server/content/ContentService.java
@@ -19,11 +19,14 @@ package com.android.server.content;
import android.Manifest;
import android.accounts.Account;
import android.app.ActivityManager;
+import android.content.ComponentName;
import android.content.ContentResolver;
import android.content.Context;
import android.content.IContentService;
import android.content.ISyncStatusObserver;
import android.content.PeriodicSync;
+import android.content.pm.PackageManager;
+import android.content.pm.ServiceInfo;
import android.content.SyncAdapterType;
import android.content.SyncInfo;
import android.content.SyncRequest;
@@ -315,7 +318,6 @@ public final class ContentService extends IContentService.Stub {
}
}
- @Override
public void requestSync(Account account, String authority, Bundle extras) {
ContentResolver.validateSyncExtrasBundle(extras);
int userId = UserHandle.getCallingUserId();
@@ -345,46 +347,56 @@ public final class ContentService extends IContentService.Stub {
* Depending on the request, we enqueue to suit in the SyncManager.
* @param request The request object. Validation of this object is done by its builder.
*/
- @Override
public void sync(SyncRequest request) {
- Bundle extras = request.getBundle();
- long flextime = request.getSyncFlexTime();
- long runAtTime = request.getSyncRunTime();
int userId = UserHandle.getCallingUserId();
- int uId = Binder.getCallingUid();
-
+ int callerUid = Binder.getCallingUid();
// This makes it so that future permission checks will be in the context of this
// process rather than the caller's process. We will restore this before returning.
long identityToken = clearCallingIdentity();
try {
SyncManager syncManager = getSyncManager();
- if (syncManager != null) {
+ if (syncManager == null) {
+ return;
+ }
+
+ Bundle extras = request.getBundle();
+ long flextime = request.getSyncFlexTime();
+ long runAtTime = request.getSyncRunTime();
+ if (request.isPeriodic()) {
+ mContext.enforceCallingOrSelfPermission(
+ Manifest.permission.WRITE_SYNC_SETTINGS,
+ "no permission to write the sync settings");
+ SyncStorageEngine.EndPoint info;
+ if (!request.hasAuthority()) {
+ // Extra permissions checking for sync service.
+ verifySignatureForPackage(callerUid,
+ request.getService().getPackageName(), "sync");
+ info = new SyncStorageEngine.EndPoint(request.getService(), userId);
+ } else {
+ info = new SyncStorageEngine.EndPoint(
+ request.getAccount(), request.getProvider(), userId);
+ }
+ if (runAtTime < 60) {
+ Slog.w(TAG, "Requested poll frequency of " + runAtTime
+ + " seconds being rounded up to 60 seconds.");
+ runAtTime = 60;
+ }
+ // Schedule periodic sync.
+ getSyncManager().getSyncStorageEngine()
+ .updateOrAddPeriodicSync(info, runAtTime, flextime, extras);
+ } else {
+ long beforeRuntimeMillis = (flextime) * 1000;
+ long runtimeMillis = runAtTime * 1000;
if (request.hasAuthority()) {
- // Sync Adapter registered with the system - old API.
- final Account account = request.getAccount();
- final String provider = request.getProvider();
- if (request.isPeriodic()) {
- mContext.enforceCallingOrSelfPermission(
- Manifest.permission.WRITE_SYNC_SETTINGS,
- "no permission to write the sync settings");
- if (runAtTime < 60) {
- Slog.w(TAG, "Requested poll frequency of " + runAtTime
- + " seconds being rounded up to 60 seconds.");
- runAtTime = 60;
- }
- PeriodicSync syncToAdd =
- new PeriodicSync(account, provider, extras, runAtTime, flextime);
- getSyncManager().getSyncStorageEngine().addPeriodicSync(syncToAdd, userId);
- } else {
- long beforeRuntimeMillis = (flextime) * 1000;
- long runtimeMillis = runAtTime * 1000;
- syncManager.scheduleSync(
- account, userId, uId, provider, extras,
- beforeRuntimeMillis, runtimeMillis,
- false /* onlyThoseWithUnknownSyncableState */);
- }
+ syncManager.scheduleSync(
+ request.getAccount(), userId, callerUid, request.getProvider(), extras,
+ beforeRuntimeMillis, runtimeMillis,
+ false /* onlyThoseWithUnknownSyncableState */);
} else {
- Log.w(TAG, "Unrecognised sync parameters, doing nothing.");
+ syncManager.scheduleSync(
+ request.getService(), userId, callerUid, extras,
+ beforeRuntimeMillis,
+ runtimeMillis); // Empty function.
}
}
} finally {
@@ -395,11 +407,14 @@ public final class ContentService extends IContentService.Stub {
/**
* Clear all scheduled sync operations that match the uri and cancel the active sync
* if they match the authority and account, if they are present.
- * @param account filter the pending and active syncs to cancel using this account
- * @param authority filter the pending and active syncs to cancel using this authority
+ *
+ * @param account filter the pending and active syncs to cancel using this account, or null.
+ * @param authority filter the pending and active syncs to cancel using this authority, or
+ * null.
+ * @param cname cancel syncs running on this service, or null for provider/account.
*/
@Override
- public void cancelSync(Account account, String authority) {
+ public void cancelSync(Account account, String authority, ComponentName cname) {
if (authority != null && authority.length() == 0) {
throw new IllegalArgumentException("Authority must be non-empty");
}
@@ -411,9 +426,49 @@ public final class ContentService extends IContentService.Stub {
try {
SyncManager syncManager = getSyncManager();
if (syncManager != null) {
- syncManager.clearScheduledSyncOperations(account, userId, authority);
- syncManager.cancelActiveSync(account, userId, authority);
+ SyncStorageEngine.EndPoint info;
+ if (cname == null) {
+ info = new SyncStorageEngine.EndPoint(account, authority, userId);
+ } else {
+ info = new SyncStorageEngine.EndPoint(cname, userId);
+ }
+ syncManager.clearScheduledSyncOperations(info);
+ syncManager.cancelActiveSync(info, null /* all syncs for this adapter */);
+ }
+ } finally {
+ restoreCallingIdentity(identityToken);
+ }
+ }
+
+ public void cancelRequest(SyncRequest request) {
+ SyncManager syncManager = getSyncManager();
+ if (syncManager == null) return;
+ int userId = UserHandle.getCallingUserId();
+ int callerUid = Binder.getCallingUid();
+
+ long identityToken = clearCallingIdentity();
+ try {
+ SyncStorageEngine.EndPoint info;
+ Bundle extras = new Bundle(request.getBundle());
+ if (request.hasAuthority()) {
+ Account account = request.getAccount();
+ String provider = request.getProvider();
+ info = new SyncStorageEngine.EndPoint(account, provider, userId);
+ } else {
+ // Only allowed to manipulate syncs for a service which you own.
+ ComponentName service = request.getService();
+ verifySignatureForPackage(callerUid, service.getPackageName(), "cancel");
+ info = new SyncStorageEngine.EndPoint(service, userId);
}
+ if (request.isPeriodic()) {
+ // Remove periodic sync.
+ mContext.enforceCallingOrSelfPermission(Manifest.permission.WRITE_SYNC_SETTINGS,
+ "no permission to write the sync settings");
+ getSyncManager().getSyncStorageEngine().removePeriodicSync(info, extras);
+ }
+ // Cancel active syncs and clear pending syncs from the queue.
+ syncManager.cancelScheduledSyncOperation(info, extras);
+ syncManager.cancelActiveSync(info, extras);
} finally {
restoreCallingIdentity(identityToken);
}
@@ -447,8 +502,8 @@ public final class ContentService extends IContentService.Stub {
try {
SyncManager syncManager = getSyncManager();
if (syncManager != null) {
- return syncManager.getSyncStorageEngine().getSyncAutomatically(
- account, userId, providerName);
+ return syncManager.getSyncStorageEngine()
+ .getSyncAutomatically(account, userId, providerName);
}
} finally {
restoreCallingIdentity(identityToken);
@@ -469,8 +524,8 @@ public final class ContentService extends IContentService.Stub {
try {
SyncManager syncManager = getSyncManager();
if (syncManager != null) {
- syncManager.getSyncStorageEngine().setSyncAutomatically(
- account, userId, providerName, sync);
+ syncManager.getSyncStorageEngine()
+ .setSyncAutomatically(account, userId, providerName, sync);
}
} finally {
restoreCallingIdentity(identityToken);
@@ -496,21 +551,22 @@ public final class ContentService extends IContentService.Stub {
+ " seconds being rounded up to 60 seconds.");
pollFrequency = 60;
}
+ long defaultFlex = SyncStorageEngine.calculateDefaultFlexTime(pollFrequency);
long identityToken = clearCallingIdentity();
try {
- // Add default flex time to this sync.
- PeriodicSync syncToAdd =
- new PeriodicSync(account, authority, extras,
- pollFrequency,
- SyncStorageEngine.calculateDefaultFlexTime(pollFrequency));
- getSyncManager().getSyncStorageEngine().addPeriodicSync(syncToAdd, userId);
+ SyncStorageEngine.EndPoint info =
+ new SyncStorageEngine.EndPoint(account, authority, userId);
+ getSyncManager().getSyncStorageEngine()
+ .updateOrAddPeriodicSync(info,
+ pollFrequency,
+ defaultFlex,
+ extras);
} finally {
restoreCallingIdentity(identityToken);
}
}
- @Override
public void removePeriodicSync(Account account, String authority, Bundle extras) {
if (account == null) {
throw new IllegalArgumentException("Account must not be null");
@@ -524,24 +580,18 @@ public final class ContentService extends IContentService.Stub {
int userId = UserHandle.getCallingUserId();
long identityToken = clearCallingIdentity();
try {
- PeriodicSync syncToRemove = new PeriodicSync(account, authority, extras,
- 0 /* Not read for removal */, 0 /* Not read for removal */);
- getSyncManager().getSyncStorageEngine().removePeriodicSync(syncToRemove, userId);
+ getSyncManager().getSyncStorageEngine()
+ .removePeriodicSync(
+ new SyncStorageEngine.EndPoint(account, authority, userId),
+ extras);
} finally {
restoreCallingIdentity(identityToken);
}
}
- /**
- * TODO: Implement.
- * @param request Sync to remove.
- */
- public void removeSync(SyncRequest request) {
- }
-
- @Override
- public List<PeriodicSync> getPeriodicSyncs(Account account, String providerName) {
+ public List<PeriodicSync> getPeriodicSyncs(Account account, String providerName,
+ ComponentName cname) {
if (account == null) {
throw new IllegalArgumentException("Account must not be null");
}
@@ -551,11 +601,20 @@ public final class ContentService extends IContentService.Stub {
mContext.enforceCallingOrSelfPermission(Manifest.permission.READ_SYNC_SETTINGS,
"no permission to read the sync settings");
+ int callerUid = Binder.getCallingUid();
int userId = UserHandle.getCallingUserId();
long identityToken = clearCallingIdentity();
try {
- return getSyncManager().getSyncStorageEngine().getPeriodicSyncs(
- account, userId, providerName);
+ if (cname == null) {
+ return getSyncManager().getSyncStorageEngine().getPeriodicSyncs(
+ new SyncStorageEngine.EndPoint(account, providerName, userId));
+ } else if (account == null && providerName == null) {
+ verifySignatureForPackage(callerUid, cname.getPackageName(), "getPeriodicSyncs");
+ return getSyncManager().getSyncStorageEngine().getPeriodicSyncs(
+ new SyncStorageEngine.EndPoint(cname, userId));
+ } else {
+ throw new IllegalArgumentException("Invalid authority specified");
+ }
} finally {
restoreCallingIdentity(identityToken);
}
@@ -579,7 +638,6 @@ public final class ContentService extends IContentService.Stub {
return -1;
}
- @Override
public void setIsSyncable(Account account, String providerName, int syncable) {
if (TextUtils.isEmpty(providerName)) {
throw new IllegalArgumentException("Authority must not be empty");
@@ -600,6 +658,45 @@ public final class ContentService extends IContentService.Stub {
}
}
+ public void setServiceActive(ComponentName cname, boolean active) {
+ mContext.enforceCallingOrSelfPermission(Manifest.permission.WRITE_SYNC_SETTINGS,
+ "no permission to write the sync settings");
+ verifySignatureForPackage(Binder.getCallingUid(), cname.getPackageName(),
+ "setServiceActive");
+
+ int userId = UserHandle.getCallingUserId();
+ long identityToken = clearCallingIdentity();
+ try {
+ SyncManager syncManager = getSyncManager();
+ if (syncManager != null) {
+ syncManager.getSyncStorageEngine().setIsTargetServiceActive(
+ cname, userId, active);
+ }
+ } finally {
+ restoreCallingIdentity(identityToken);
+ }
+ }
+
+ public boolean isServiceActive(ComponentName cname) {
+ mContext.enforceCallingOrSelfPermission(Manifest.permission.READ_SYNC_SETTINGS,
+ "no permission to read the sync settings");
+ verifySignatureForPackage(Binder.getCallingUid(), cname.getPackageName(),
+ "isServiceActive");
+
+ int userId = UserHandle.getCallingUserId();
+ long identityToken = clearCallingIdentity();
+ try {
+ SyncManager syncManager = getSyncManager();
+ if (syncManager != null) {
+ return syncManager.getSyncStorageEngine()
+ .getIsTargetServiceActive(cname, userId);
+ }
+ } finally {
+ restoreCallingIdentity(identityToken);
+ }
+ return false;
+ }
+
@Override
public boolean getMasterSyncAutomatically() {
mContext.enforceCallingOrSelfPermission(Manifest.permission.READ_SYNC_SETTINGS,
@@ -635,17 +732,24 @@ public final class ContentService extends IContentService.Stub {
}
}
- public boolean isSyncActive(Account account, String authority) {
+ public boolean isSyncActive(Account account, String authority, ComponentName cname) {
mContext.enforceCallingOrSelfPermission(Manifest.permission.READ_SYNC_STATS,
"no permission to read the sync stats");
int userId = UserHandle.getCallingUserId();
-
+ int callingUid = Binder.getCallingUid();
long identityToken = clearCallingIdentity();
try {
SyncManager syncManager = getSyncManager();
- if (syncManager != null) {
+ if (syncManager == null) {
+ return false;
+ }
+ if (cname == null) {
return syncManager.getSyncStorageEngine().isSyncActive(
- account, userId, authority);
+ new SyncStorageEngine.EndPoint(account, authority, userId));
+ } else if (account == null && authority == null) {
+ verifySignatureForPackage(callingUid, cname.getPackageName(), "isSyncActive");
+ return syncManager.getSyncStorageEngine().isSyncActive(
+ new SyncStorageEngine.EndPoint(cname, userId));
}
} finally {
restoreCallingIdentity(identityToken);
@@ -666,7 +770,7 @@ public final class ContentService extends IContentService.Stub {
}
}
- public SyncStatusInfo getSyncStatus(Account account, String authority) {
+ public SyncStatusInfo getSyncStatus(Account account, String authority, ComponentName cname) {
if (TextUtils.isEmpty(authority)) {
throw new IllegalArgumentException("Authority must not be empty");
}
@@ -674,34 +778,52 @@ public final class ContentService extends IContentService.Stub {
"no permission to read the sync stats");
int userId = UserHandle.getCallingUserId();
+ int callerUid = Binder.getCallingUid();
long identityToken = clearCallingIdentity();
try {
SyncManager syncManager = getSyncManager();
- if (syncManager != null) {
- return syncManager.getSyncStorageEngine().getStatusByAccountAndAuthority(
- account, userId, authority);
+ if (syncManager == null) {
+ return null;
}
+ SyncStorageEngine.EndPoint info;
+ if (cname == null) {
+ info = new SyncStorageEngine.EndPoint(account, authority, userId);
+ } else if (account == null && authority == null) {
+ verifySignatureForPackage(callerUid, cname.getPackageName(), "getSyncStatus");
+ info = new SyncStorageEngine.EndPoint(cname, userId);
+ } else {
+ throw new IllegalArgumentException("Must call sync status with valid authority");
+ }
+ return syncManager.getSyncStorageEngine().getStatusByAuthority(info);
} finally {
restoreCallingIdentity(identityToken);
}
- return null;
}
- public boolean isSyncPending(Account account, String authority) {
+ public boolean isSyncPending(Account account, String authority, ComponentName cname) {
mContext.enforceCallingOrSelfPermission(Manifest.permission.READ_SYNC_STATS,
"no permission to read the sync stats");
+ int callerUid = Binder.getCallingUid();
int userId = UserHandle.getCallingUserId();
long identityToken = clearCallingIdentity();
+ SyncManager syncManager = getSyncManager();
+ if (syncManager == null) return false;
+
try {
- SyncManager syncManager = getSyncManager();
- if (syncManager != null) {
- return syncManager.getSyncStorageEngine().isSyncPending(account, userId, authority);
+ SyncStorageEngine.EndPoint info;
+ if (cname == null) {
+ info = new SyncStorageEngine.EndPoint(account, authority, userId);
+ } else if (account == null && authority == null) {
+ verifySignatureForPackage(callerUid, cname.getPackageName(), "isSyncPending");
+ info = new SyncStorageEngine.EndPoint(cname, userId);
+ } else {
+ throw new IllegalArgumentException("Invalid authority specified");
}
+ return syncManager.getSyncStorageEngine().isSyncPending(info);
} finally {
restoreCallingIdentity(identityToken);
}
- return false;
}
public void addStatusChangeListener(int mask, ISyncStatusObserver callback) {
@@ -735,6 +857,30 @@ public final class ContentService extends IContentService.Stub {
}
/**
+ * Helper to verify that the provided package name shares the same cert as the caller.
+ * @param callerUid uid of the calling process.
+ * @param packageName package to verify against package of calling application.
+ * @param tag a tag to use when throwing an exception if the signatures don't
+ * match. Cannot be null.
+ * @return true if the calling application and the provided package are signed with the same
+ * certificate.
+ */
+ private boolean verifySignatureForPackage(int callerUid, String packageName, String tag) {
+ PackageManager pm = mContext.getPackageManager();
+ try {
+ int serviceUid = pm.getApplicationInfo(packageName, 0).uid;
+ if (pm.checkSignatures(callerUid, serviceUid) == PackageManager.SIGNATURE_MATCH) {
+ return true;
+ } else {
+ throw new SecurityException(tag + ": Caller certificate does not match that for - "
+ + packageName);
+ }
+ } catch (PackageManager.NameNotFoundException e) {
+ throw new IllegalArgumentException(tag + ": " + packageName + " package not found.");
+ }
+ }
+
+ /**
* Hide this class since it is not part of api,
* but current unittest framework requires it to be public
* @hide
diff --git a/services/java/com/android/server/content/SyncManager.java b/services/java/com/android/server/content/SyncManager.java
index 71d8d99..18bf115 100644
--- a/services/java/com/android/server/content/SyncManager.java
+++ b/services/java/com/android/server/content/SyncManager.java
@@ -31,6 +31,7 @@ import android.content.ContentResolver;
import android.content.Context;
import android.content.ISyncAdapter;
import android.content.ISyncContext;
+import android.content.ISyncServiceAdapter;
import android.content.ISyncStatusObserver;
import android.content.Intent;
import android.content.IntentFilter;
@@ -88,7 +89,6 @@ import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
-import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
@@ -99,7 +99,6 @@ import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.Set;
-import java.util.concurrent.CountDownLatch;
/**
* @hide
@@ -202,8 +201,9 @@ public class SyncManager {
Log.v(TAG, "Internal storage is low.");
}
mStorageIsLow = true;
- cancelActiveSync(null /* any account */, UserHandle.USER_ALL,
- null /* any authority */);
+ cancelActiveSync(
+ SyncStorageEngine.EndPoint.USER_ALL_PROVIDER_ALL_ACCOUNTS_ALL,
+ null /* any sync */);
} else if (Intent.ACTION_DEVICE_STORAGE_OK.equals(action)) {
if (Log.isLoggable(TAG, Log.VERBOSE)) {
Log.v(TAG, "Internal storage is ok.");
@@ -221,19 +221,6 @@ public class SyncManager {
}
};
- private BroadcastReceiver mBackgroundDataSettingChanged = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- if (getConnectivityManager().getBackgroundDataSetting()) {
- scheduleSync(null /* account */, UserHandle.USER_ALL,
- SyncOperation.REASON_BACKGROUND_DATA_SETTINGS_CHANGED,
- null /* authority */,
- new Bundle(), 0 /* delay */, 0 /* delay */,
- false /* onlyThoseWithUnknownSyncableState */);
- }
- }
- };
-
private BroadcastReceiver mAccountsUpdatedReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
@@ -278,16 +265,16 @@ public class SyncManager {
doDatabaseCleanup();
}
+ AccountAndUser[] accounts = mRunningAccounts;
for (ActiveSyncContext currentSyncContext : mActiveSyncContexts) {
- if (!containsAccountAndUser(mRunningAccounts,
- currentSyncContext.mSyncOperation.account,
- currentSyncContext.mSyncOperation.userId)) {
+ if (!containsAccountAndUser(accounts,
+ currentSyncContext.mSyncOperation.target.account,
+ currentSyncContext.mSyncOperation.target.userId)) {
Log.d(TAG, "canceling sync since the account is no longer running");
sendSyncFinishedOrCanceledMessage(currentSyncContext,
null /* no result since this is a cancel */);
}
}
-
// we must do this since we don't bother scheduling alarms when
// the accounts are not set yet
sendCheckAlarmsMessage();
@@ -316,9 +303,7 @@ public class SyncManager {
if (Log.isLoggable(TAG, Log.VERBOSE)) {
Log.v(TAG, "Reconnection detected: clearing all backoffs");
}
- synchronized(mSyncQueue) {
- mSyncStorageEngine.clearAllBackoffsLocked(mSyncQueue);
- }
+ mSyncStorageEngine.clearAllBackoffs(mSyncQueue);
}
sendCheckAlarmsMessage();
}
@@ -384,12 +369,17 @@ public class SyncManager {
mSyncStorageEngine = SyncStorageEngine.getSingleton();
mSyncStorageEngine.setOnSyncRequestListener(new OnSyncRequestListener() {
@Override
- public void onSyncRequest(Account account, int userId, int reason, String authority,
- Bundle extras) {
- scheduleSync(account, userId, reason, authority, extras,
- 0 /* no delay */,
- 0 /* no delay */,
- false);
+ public void onSyncRequest(SyncStorageEngine.EndPoint info, int reason, Bundle extras) {
+ if (info.target_provider) {
+ scheduleSync(info.account, info.userId, reason, info.provider, extras,
+ 0 /* no flex */,
+ 0 /* run immediately */,
+ false);
+ } else if (info.target_service) {
+ scheduleSync(info.service, info.userId, reason, extras,
+ 0 /* no flex */,
+ 0 /* run immediately */);
+ }
}
});
@@ -421,9 +411,6 @@ public class SyncManager {
context.registerReceiver(mBootCompletedReceiver, intentFilter);
}
- intentFilter = new IntentFilter(ConnectivityManager.ACTION_BACKGROUND_DATA_SETTING_CHANGED);
- context.registerReceiver(mBackgroundDataSettingChanged, intentFilter);
-
intentFilter = new IntentFilter(Intent.ACTION_DEVICE_STORAGE_LOW);
intentFilter.addAction(Intent.ACTION_DEVICE_STORAGE_OK);
context.registerReceiver(mStorageIntentReceiver, intentFilter);
@@ -538,8 +525,75 @@ public class SyncManager {
private void ensureAlarmService() {
if (mAlarmService == null) {
- mAlarmService = (AlarmManager)mContext.getSystemService(Context.ALARM_SERVICE);
+ mAlarmService = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
+ }
+ }
+
+ /**
+ * Initiate a sync using the new anonymous service API.
+ * @param cname SyncService component bound to in order to perform the sync.
+ * @param userId the id of the user whose accounts are to be synced. If userId is USER_ALL,
+ * then all users' accounts are considered.
+ * @param uid Linux uid of the application that is performing the sync.
+ * @param extras a Map of SyncAdapter-specific information to control
+ * syncs of a specific provider. Cannot be null.
+ * @param beforeRunTimeMillis milliseconds before <code>runtimeMillis</code> that this sync may
+ * be run.
+ * @param runtimeMillis milliseconds from now by which this sync must be run.
+ */
+ public void scheduleSync(ComponentName cname, int userId, int uid, Bundle extras,
+ long beforeRunTimeMillis, long runtimeMillis) {
+ boolean isLoggable = Log.isLoggable(TAG, Log.VERBOSE);
+ if (isLoggable) {
+ Log.d(TAG, "one off sync for: " + cname + " " + extras.toString());
+ }
+
+ Boolean expedited = extras.getBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, false);
+ if (expedited) {
+ runtimeMillis = -1; // this means schedule at the front of the queue
+ }
+
+ final boolean ignoreSettings =
+ extras.getBoolean(ContentResolver.SYNC_EXTRAS_IGNORE_SETTINGS, false);
+ int source = SyncStorageEngine.SOURCE_SERVICE;
+ boolean isEnabled = mSyncStorageEngine.getIsTargetServiceActive(cname, userId);
+ // Only schedule this sync if
+ // - we've explicitly been told to ignore settings.
+ // - global sync is enabled for this user.
+ boolean syncAllowed =
+ ignoreSettings
+ || mSyncStorageEngine.getMasterSyncAutomatically(userId);
+ if (!syncAllowed) {
+ if (isLoggable) {
+ Log.d(TAG, "scheduleSync: sync of " + cname + " not allowed, dropping request.");
+ }
+ return;
+ }
+ if (!isEnabled) {
+ if (isLoggable) {
+ Log.d(TAG, "scheduleSync: " + cname + " is not enabled, dropping request");
+ }
+ return;
}
+ SyncStorageEngine.EndPoint info = new SyncStorageEngine.EndPoint(cname, userId);
+ Pair<Long, Long> backoff = mSyncStorageEngine.getBackoff(info);
+ long delayUntil = mSyncStorageEngine.getDelayUntilTime(info);
+ final long backoffTime = backoff != null ? backoff.first : 0;
+ if (isLoggable) {
+ Log.v(TAG, "schedule Sync:"
+ + ", delay until " + delayUntil
+ + ", run by " + runtimeMillis
+ + ", flex " + beforeRunTimeMillis
+ + ", source " + source
+ + ", sync service " + cname
+ + ", extras " + extras);
+ }
+ scheduleSyncOperation(
+ new SyncOperation(cname, userId, uid, source, extras,
+ runtimeMillis /* runtime */,
+ beforeRunTimeMillis /* flextime */,
+ backoffTime,
+ delayUntil));
}
/**
@@ -588,9 +642,6 @@ public class SyncManager {
long runtimeMillis, boolean onlyThoseWithUnkownSyncableState) {
boolean isLoggable = Log.isLoggable(TAG, Log.VERBOSE);
- final boolean backgroundDataUsageAllowed = !mBootCompleted ||
- getConnectivityManager().getBackgroundDataSetting();
-
if (extras == null) {
extras = new Bundle();
}
@@ -607,8 +658,6 @@ public class SyncManager {
if (requestedAccount != null && userId != UserHandle.USER_ALL) {
accounts = new AccountAndUser[] { new AccountAndUser(requestedAccount, userId) };
} else {
- // if the accounts aren't configured yet then we can't support an account-less
- // sync request
accounts = mRunningAccounts;
if (accounts.length == 0) {
if (isLoggable) {
@@ -683,12 +732,10 @@ public class SyncManager {
continue;
}
- // always allow if the isSyncable state is unknown
boolean syncAllowed =
- (isSyncable < 0)
+ (isSyncable < 0) // always allow if the isSyncable state is unknown
|| ignoreSettings
- || (backgroundDataUsageAllowed
- && mSyncStorageEngine.getMasterSyncAutomatically(account.userId)
+ || (mSyncStorageEngine.getMasterSyncAutomatically(account.userId)
&& mSyncStorageEngine.getSyncAutomatically(account.account,
account.userId, authority));
if (!syncAllowed) {
@@ -698,11 +745,12 @@ public class SyncManager {
}
continue;
}
-
- Pair<Long, Long> backoff = mSyncStorageEngine
- .getBackoff(account.account, account.userId, authority);
- long delayUntil = mSyncStorageEngine.getDelayUntilTime(account.account,
- account.userId, authority);
+ SyncStorageEngine.EndPoint info =
+ new SyncStorageEngine.EndPoint(
+ account.account, authority, account.userId);
+ Pair<Long, Long> backoff = mSyncStorageEngine.getBackoff(info);
+ long delayUntil =
+ mSyncStorageEngine.getDelayUntilTime(info);
final long backoffTime = backoff != null ? backoff.first : 0;
if (isSyncable < 0) {
// Initialisation sync.
@@ -712,6 +760,7 @@ public class SyncManager {
Log.v(TAG, "schedule initialisation Sync:"
+ ", delay until " + delayUntil
+ ", run by " + 0
+ + ", flex " + 0
+ ", source " + source
+ ", account " + account
+ ", authority " + authority
@@ -787,13 +836,12 @@ public class SyncManager {
mSyncHandler.sendMessage(msg);
}
- private void sendCancelSyncsMessage(final Account account, final int userId,
- final String authority) {
+ private void sendCancelSyncsMessage(final SyncStorageEngine.EndPoint info, Bundle extras) {
if (Log.isLoggable(TAG, Log.VERBOSE)) Log.v(TAG, "sending MESSAGE_CANCEL");
Message msg = mSyncHandler.obtainMessage();
msg.what = SyncHandler.MESSAGE_CANCEL;
- msg.obj = Pair.create(account, authority);
- msg.arg1 = userId;
+ msg.setData(extras);
+ msg.obj = info;
mSyncHandler.sendMessage(msg);
}
@@ -816,10 +864,11 @@ public class SyncManager {
}
private void clearBackoffSetting(SyncOperation op) {
- mSyncStorageEngine.setBackoff(op.account, op.userId, op.authority,
- SyncStorageEngine.NOT_IN_BACKOFF_MODE, SyncStorageEngine.NOT_IN_BACKOFF_MODE);
+ mSyncStorageEngine.setBackoff(op.target,
+ SyncStorageEngine.NOT_IN_BACKOFF_MODE,
+ SyncStorageEngine.NOT_IN_BACKOFF_MODE);
synchronized (mSyncQueue) {
- mSyncQueue.onBackoffChanged(op.account, op.userId, op.authority, 0);
+ mSyncQueue.onBackoffChanged(op.target, 0);
}
}
@@ -829,7 +878,7 @@ public class SyncManager {
final long now = SystemClock.elapsedRealtime();
final Pair<Long, Long> previousSettings =
- mSyncStorageEngine.getBackoff(op.account, op.userId, op.authority);
+ mSyncStorageEngine.getBackoff(op.target);
long newDelayInMs = -1;
if (previousSettings != null) {
// don't increase backoff before current backoff is expired. This will happen for op's
@@ -860,14 +909,12 @@ public class SyncManager {
final long backoff = now + newDelayInMs;
- mSyncStorageEngine.setBackoff(op.account, op.userId, op.authority,
- backoff, newDelayInMs);
-
+ mSyncStorageEngine.setBackoff(op.target, backoff, newDelayInMs);
op.backoff = backoff;
op.updateEffectiveRunTime();
synchronized (mSyncQueue) {
- mSyncQueue.onBackoffChanged(op.account, op.userId, op.authority, backoff);
+ mSyncQueue.onBackoffChanged(op.target, backoff);
}
}
@@ -880,20 +927,20 @@ public class SyncManager {
} else {
newDelayUntilTime = 0;
}
- mSyncStorageEngine
- .setDelayUntilTime(op.account, op.userId, op.authority, newDelayUntilTime);
+ mSyncStorageEngine.setDelayUntilTime(op.target, newDelayUntilTime);
synchronized (mSyncQueue) {
- mSyncQueue.onDelayUntilTimeChanged(op.account, op.authority, newDelayUntilTime);
+ mSyncQueue.onDelayUntilTimeChanged(op.target, newDelayUntilTime);
}
}
/**
- * Cancel the active sync if it matches the authority and account.
- * @param account limit the cancelations to syncs with this account, if non-null
- * @param authority limit the cancelations to syncs with this authority, if non-null
+ * Cancel the active sync if it matches the target.
+ * @param info object containing info about which syncs to cancel. The target can
+ * have null account/provider info to specify all accounts/providers.
+ * @param extras if non-null, specifies the exact sync to remove.
*/
- public void cancelActiveSync(Account account, int userId, String authority) {
- sendCancelSyncsMessage(account, userId, authority);
+ public void cancelActiveSync(SyncStorageEngine.EndPoint info, Bundle extras) {
+ sendCancelSyncsMessage(info, extras);
}
/**
@@ -922,24 +969,40 @@ public class SyncManager {
/**
* Remove scheduled sync operations.
- * @param account limit the removals to operations with this account, if non-null
- * @param authority limit the removals to operations with this authority, if non-null
+ * @param info limit the removals to operations that match this target. The target can
+ * have null account/provider info to specify all accounts/providers.
*/
- public void clearScheduledSyncOperations(Account account, int userId, String authority) {
+ public void clearScheduledSyncOperations(SyncStorageEngine.EndPoint info) {
synchronized (mSyncQueue) {
- mSyncQueue.remove(account, userId, authority);
+ mSyncQueue.remove(info, null /* all operations */);
}
- mSyncStorageEngine.setBackoff(account, userId, authority,
+ mSyncStorageEngine.setBackoff(info,
SyncStorageEngine.NOT_IN_BACKOFF_MODE, SyncStorageEngine.NOT_IN_BACKOFF_MODE);
}
+ /**
+ * Remove a specified sync, if it exists.
+ * @param info Authority for which the sync is to be removed.
+ * @param extras extras bundle to uniquely identify sync.
+ */
+ public void cancelScheduledSyncOperation(SyncStorageEngine.EndPoint info, Bundle extras) {
+ synchronized (mSyncQueue) {
+ mSyncQueue.remove(info, extras);
+ }
+ // Reset the back-off if there are no more syncs pending.
+ if (!mSyncStorageEngine.isSyncPending(info)) {
+ mSyncStorageEngine.setBackoff(info,
+ SyncStorageEngine.NOT_IN_BACKOFF_MODE, SyncStorageEngine.NOT_IN_BACKOFF_MODE);
+ }
+ }
+
void maybeRescheduleSync(SyncResult syncResult, SyncOperation operation) {
boolean isLoggable = Log.isLoggable(TAG, Log.DEBUG);
if (isLoggable) {
Log.d(TAG, "encountered error(s) during the sync: " + syncResult + ", " + operation);
}
- operation = new SyncOperation(operation);
+ operation = new SyncOperation(operation, 0L /* newRunTimeFromNow */);
// The SYNC_EXTRAS_IGNORE_BACKOFF only applies to the first attempt to sync a given
// request. Retries of the request will always honor the backoff, so clear the
@@ -948,25 +1011,29 @@ public class SyncManager {
operation.extras.remove(ContentResolver.SYNC_EXTRAS_IGNORE_BACKOFF);
}
- // If this sync aborted because the internal sync loop retried too many times then
- // don't reschedule. Otherwise we risk getting into a retry loop.
- // If the operation succeeded to some extent then retry immediately.
- // If this was a two-way sync then retry soft errors with an exponential backoff.
- // If this was an upward sync then schedule a two-way sync immediately.
- // Otherwise do not reschedule.
if (operation.extras.getBoolean(ContentResolver.SYNC_EXTRAS_DO_NOT_RETRY, false)) {
- Log.d(TAG, "not retrying sync operation because SYNC_EXTRAS_DO_NOT_RETRY was specified "
- + operation);
+ if (isLoggable) {
+ Log.d(TAG, "not retrying sync operation because SYNC_EXTRAS_DO_NOT_RETRY was specified "
+ + operation);
+ }
} else if (operation.extras.getBoolean(ContentResolver.SYNC_EXTRAS_UPLOAD, false)
&& !syncResult.syncAlreadyInProgress) {
+ // If this was an upward sync then schedule a two-way sync immediately.
operation.extras.remove(ContentResolver.SYNC_EXTRAS_UPLOAD);
- Log.d(TAG, "retrying sync operation as a two-way sync because an upload-only sync "
- + "encountered an error: " + operation);
+ if (isLoggable) {
+ Log.d(TAG, "retrying sync operation as a two-way sync because an upload-only sync "
+ + "encountered an error: " + operation);
+ }
scheduleSyncOperation(operation);
} else if (syncResult.tooManyRetries) {
- Log.d(TAG, "not retrying sync operation because it retried too many times: "
- + operation);
+ // If this sync aborted because the internal sync loop retried too many times then
+ // don't reschedule. Otherwise we risk getting into a retry loop.
+ if (isLoggable) {
+ Log.d(TAG, "not retrying sync operation because it retried too many times: "
+ + operation);
+ }
} else if (syncResult.madeSomeProgress()) {
+ // If the operation succeeded to some extent then retry immediately.
if (isLoggable) {
Log.d(TAG, "retrying sync operation because even though it had an error "
+ "it achieved some success");
@@ -979,19 +1046,18 @@ public class SyncManager {
}
scheduleSyncOperation(
new SyncOperation(
- operation.account, operation.userId,
- operation.reason,
- operation.syncSource,
- operation.authority, operation.extras,
- DELAY_RETRY_SYNC_IN_PROGRESS_IN_SECONDS * 1000, operation.flexTime,
- operation.backoff, operation.delayUntil, operation.allowParallelSyncs));
+ operation,
+ DELAY_RETRY_SYNC_IN_PROGRESS_IN_SECONDS * 1000 /* newRunTimeFromNow */)
+ );
} else if (syncResult.hasSoftError()) {
+ // If this was a two-way sync then retry soft errors with an exponential backoff.
if (isLoggable) {
Log.d(TAG, "retrying sync operation because it encountered a soft error: "
+ operation);
}
scheduleSyncOperation(operation);
} else {
+ // Otherwise do not reschedule.
Log.d(TAG, "not retrying sync operation because the error is a hard error: "
+ operation);
}
@@ -1024,9 +1090,12 @@ public class SyncManager {
updateRunningAccounts();
cancelActiveSync(
- null /* any account */,
- userId,
- null /* any authority */);
+ new SyncStorageEngine.EndPoint(
+ null /* any account */,
+ null /* any authority */,
+ userId),
+ null /* any sync. */
+ );
}
private void onUserRemoved(int userId) {
@@ -1035,7 +1104,7 @@ public class SyncManager {
// Clean up the storage engine database
mSyncStorageEngine.doDatabaseCleanup(new Account[0], userId);
synchronized (mSyncQueue) {
- mSyncQueue.removeUser(userId);
+ mSyncQueue.removeUserLocked(userId);
}
}
@@ -1047,6 +1116,7 @@ public class SyncManager {
final SyncOperation mSyncOperation;
final long mHistoryRowId;
ISyncAdapter mSyncAdapter;
+ ISyncServiceAdapter mSyncServiceAdapter;
final long mStartTime;
long mTimeoutStartTime;
boolean mBound;
@@ -1072,10 +1142,10 @@ public class SyncManager {
mSyncOperation = syncOperation;
mHistoryRowId = historyRowId;
mSyncAdapter = null;
+ mSyncServiceAdapter = null;
mStartTime = SystemClock.elapsedRealtime();
mTimeoutStartTime = mStartTime;
- mSyncWakeLock = mSyncHandler.getSyncWakeLock(
- mSyncOperation.account, mSyncOperation.authority);
+ mSyncWakeLock = mSyncHandler.getSyncWakeLock(mSyncOperation);
mSyncWakeLock.setWorkSource(new WorkSource(syncAdapterUid));
mSyncWakeLock.acquire();
}
@@ -1102,7 +1172,7 @@ public class SyncManager {
public void onServiceConnected(ComponentName name, IBinder service) {
Message msg = mSyncHandler.obtainMessage();
msg.what = SyncHandler.MESSAGE_SERVICE_CONNECTED;
- msg.obj = new ServiceConnectionData(this, ISyncAdapter.Stub.asInterface(service));
+ msg.obj = new ServiceConnectionData(this, service);
mSyncHandler.sendMessage(msg);
}
@@ -1113,13 +1183,13 @@ public class SyncManager {
mSyncHandler.sendMessage(msg);
}
- boolean bindToSyncAdapter(RegisteredServicesCache.ServiceInfo info, int userId) {
+ boolean bindToSyncAdapter(ComponentName serviceComponent, int userId) {
if (Log.isLoggable(TAG, Log.VERBOSE)) {
- Log.d(TAG, "bindToSyncAdapter: " + info.componentName + ", connection " + this);
+ Log.d(TAG, "bindToSyncAdapter: " + serviceComponent + ", connection " + this);
}
Intent intent = new Intent();
intent.setAction("android.content.SyncAdapter");
- intent.setComponent(info.componentName);
+ intent.setComponent(serviceComponent);
intent.putExtra(Intent.EXTRA_CLIENT_LABEL,
com.android.internal.R.string.sync_binding_label);
intent.putExtra(Intent.EXTRA_CLIENT_INTENT, PendingIntent.getActivityAsUser(
@@ -1129,7 +1199,7 @@ public class SyncManager {
final boolean bindResult = mContext.bindServiceAsUser(intent, this,
Context.BIND_AUTO_CREATE | Context.BIND_NOT_FOREGROUND
| Context.BIND_ALLOW_OOM_MANAGEMENT,
- new UserHandle(mSyncOperation.userId));
+ new UserHandle(mSyncOperation.target.userId));
if (!bindResult) {
mBound = false;
}
@@ -1152,7 +1222,6 @@ public class SyncManager {
mSyncWakeLock.setWorkSource(null);
}
- @Override
public String toString() {
StringBuilder sb = new StringBuilder();
toString(sb);
@@ -1291,11 +1360,13 @@ public class SyncManager {
int row = table.getNumRows();
Pair<AuthorityInfo, SyncStatusInfo> syncAuthoritySyncStatus =
mSyncStorageEngine.getCopyOfAuthorityWithSyncStatus(
- account.account, account.userId, syncAdapterType.type.authority);
+ new SyncStorageEngine.EndPoint(
+ account.account,
+ syncAdapterType.type.authority,
+ account.userId));
SyncStorageEngine.AuthorityInfo settings = syncAuthoritySyncStatus.first;
SyncStatusInfo status = syncAuthoritySyncStatus.second;
-
- String authority = settings.authority;
+ String authority = settings.target.provider;
if (authority.length() > 50) {
authority = authority.substring(authority.length() - 50);
}
@@ -1416,14 +1487,25 @@ public class SyncManager {
int maxAuthority = 0;
int maxAccount = 0;
for (SyncStorageEngine.SyncHistoryItem item : items) {
- SyncStorageEngine.AuthorityInfo authority
+ SyncStorageEngine.AuthorityInfo authorityInfo
= mSyncStorageEngine.getAuthority(item.authorityId);
final String authorityName;
final String accountKey;
- if (authority != null) {
- authorityName = authority.authority;
- accountKey = authority.account.name + "/" + authority.account.type
- + " u" + authority.userId;
+ if (authorityInfo != null) {
+ if (authorityInfo.target.target_provider) {
+ authorityName = authorityInfo.target.provider;
+ accountKey = authorityInfo.target.account.name + "/"
+ + authorityInfo.target.account.type
+ + " u" + authorityInfo.target.userId;
+ } else if (authorityInfo.target.target_service) {
+ authorityName = authorityInfo.target.service.getPackageName() + "/"
+ + authorityInfo.target.service.getClassName()
+ + " u" + authorityInfo.target.userId;
+ accountKey = "no account";
+ } else {
+ authorityName = "Unknown";
+ accountKey = "Unknown";
+ }
} else {
authorityName = "Unknown";
accountKey = "Unknown";
@@ -1544,14 +1626,25 @@ public class SyncManager {
final PackageManager pm = mContext.getPackageManager();
for (int i = 0; i < N; i++) {
SyncStorageEngine.SyncHistoryItem item = items.get(i);
- SyncStorageEngine.AuthorityInfo authority
+ SyncStorageEngine.AuthorityInfo authorityInfo
= mSyncStorageEngine.getAuthority(item.authorityId);
final String authorityName;
final String accountKey;
- if (authority != null) {
- authorityName = authority.authority;
- accountKey = authority.account.name + "/" + authority.account.type
- + " u" + authority.userId;
+ if (authorityInfo != null) {
+ if (authorityInfo.target.target_provider) {
+ authorityName = authorityInfo.target.provider;
+ accountKey = authorityInfo.target.account.name + "/"
+ + authorityInfo.target.account.type
+ + " u" + authorityInfo.target.userId;
+ } else if (authorityInfo.target.target_service) {
+ authorityName = authorityInfo.target.service.getPackageName() + "/"
+ + authorityInfo.target.service.getClassName()
+ + " u" + authorityInfo.target.userId;
+ accountKey = "none";
+ } else {
+ authorityName = "Unknown";
+ accountKey = "Unknown";
+ }
} else {
authorityName = "Unknown";
accountKey = "Unknown";
@@ -1610,14 +1703,25 @@ public class SyncManager {
if (extras == null || extras.size() == 0) {
continue;
}
- final SyncStorageEngine.AuthorityInfo authority
+ final SyncStorageEngine.AuthorityInfo authorityInfo
= mSyncStorageEngine.getAuthority(item.authorityId);
final String authorityName;
final String accountKey;
- if (authority != null) {
- authorityName = authority.authority;
- accountKey = authority.account.name + "/" + authority.account.type
- + " u" + authority.userId;
+ if (authorityInfo != null) {
+ if (authorityInfo.target.target_provider) {
+ authorityName = authorityInfo.target.provider;
+ accountKey = authorityInfo.target.account.name + "/"
+ + authorityInfo.target.account.type
+ + " u" + authorityInfo.target.userId;
+ } else if (authorityInfo.target.target_service) {
+ authorityName = authorityInfo.target.service.getPackageName() + "/"
+ + authorityInfo.target.service.getClassName()
+ + " u" + authorityInfo.target.userId;
+ accountKey = "none";
+ } else {
+ authorityName = "Unknown";
+ accountKey = "Unknown";
+ }
} else {
authorityName = "Unknown";
accountKey = "Unknown";
@@ -1761,10 +1865,11 @@ public class SyncManager {
class ServiceConnectionData {
public final ActiveSyncContext activeSyncContext;
- public final ISyncAdapter syncAdapter;
- ServiceConnectionData(ActiveSyncContext activeSyncContext, ISyncAdapter syncAdapter) {
+ public final IBinder adapter;
+
+ ServiceConnectionData(ActiveSyncContext activeSyncContext, IBinder adapter) {
this.activeSyncContext = activeSyncContext;
- this.syncAdapter = syncAdapter;
+ this.adapter = adapter;
}
}
@@ -1784,11 +1889,11 @@ public class SyncManager {
public final SyncNotificationInfo mSyncNotificationInfo = new SyncNotificationInfo();
private Long mAlarmScheduleTime = null;
public final SyncTimeTracker mSyncTimeTracker = new SyncTimeTracker();
- private final HashMap<Pair<Account, String>, PowerManager.WakeLock> mWakeLocks =
- Maps.newHashMap();
+ private final HashMap<String, PowerManager.WakeLock> mWakeLocks = Maps.newHashMap();
+
private List<Message> mBootQueue = new ArrayList<Message>();
- public void onBootCompleted() {
+ public void onBootCompleted() {
if (Log.isLoggable(TAG, Log.VERBOSE)) {
Log.v(TAG, "Boot completed, clearing boot queue.");
}
@@ -1803,12 +1908,11 @@ public class SyncManager {
}
}
- private PowerManager.WakeLock getSyncWakeLock(Account account, String authority) {
- final Pair<Account, String> wakeLockKey = Pair.create(account, authority);
+ private PowerManager.WakeLock getSyncWakeLock(SyncOperation operation) {
+ final String wakeLockKey = operation.wakeLockKey();
PowerManager.WakeLock wakeLock = mWakeLocks.get(wakeLockKey);
if (wakeLock == null) {
- final String name = SYNC_WAKE_LOCK_PREFIX + "/" + authority + "/" + account.type
- + "/" + account.name;
+ final String name = SYNC_WAKE_LOCK_PREFIX + operation.wakeLockName();
wakeLock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, name);
wakeLock.setReferenceCounted(false);
mWakeLocks.put(wakeLockKey, wakeLock);
@@ -1861,7 +1965,6 @@ public class SyncManager {
super(looper);
}
- @Override
public void handleMessage(Message msg) {
if (tryEnqueueMessageUntilReadyToRun(msg)) {
return;
@@ -1881,12 +1984,13 @@ public class SyncManager {
earliestFuturePollTime = scheduleReadyPeriodicSyncs();
switch (msg.what) {
case SyncHandler.MESSAGE_CANCEL: {
- Pair<Account, String> payload = (Pair<Account, String>) msg.obj;
+ SyncStorageEngine.EndPoint payload = (SyncStorageEngine.EndPoint) msg.obj;
+ Bundle extras = msg.peekData();
if (Log.isLoggable(TAG, Log.VERBOSE)) {
Log.d(TAG, "handleSyncHandlerMessage: MESSAGE_SERVICE_CANCEL: "
- + payload.first + ", " + payload.second);
+ + payload + " bundle: " + extras);
}
- cancelActiveSyncLocked(payload.first, msg.arg1, payload.second);
+ cancelActiveSyncLocked(payload, extras);
nextPendingSyncTime = maybeStartNextSyncLocked();
break;
}
@@ -1895,35 +1999,38 @@ public class SyncManager {
if (Log.isLoggable(TAG, Log.VERBOSE)) {
Log.v(TAG, "handleSyncHandlerMessage: MESSAGE_SYNC_FINISHED");
}
- SyncHandlerMessagePayload payload = (SyncHandlerMessagePayload)msg.obj;
+ SyncHandlerMessagePayload payload = (SyncHandlerMessagePayload) msg.obj;
if (!isSyncStillActive(payload.activeSyncContext)) {
Log.d(TAG, "handleSyncHandlerMessage: dropping since the "
+ "sync is no longer active: "
+ payload.activeSyncContext);
break;
}
- runSyncFinishedOrCanceledLocked(payload.syncResult, payload.activeSyncContext);
+ runSyncFinishedOrCanceledLocked(payload.syncResult,
+ payload.activeSyncContext);
// since a sync just finished check if it is time to start a new sync
nextPendingSyncTime = maybeStartNextSyncLocked();
break;
case SyncHandler.MESSAGE_SERVICE_CONNECTED: {
- ServiceConnectionData msgData = (ServiceConnectionData)msg.obj;
+ ServiceConnectionData msgData = (ServiceConnectionData) msg.obj;
if (Log.isLoggable(TAG, Log.VERBOSE)) {
Log.d(TAG, "handleSyncHandlerMessage: MESSAGE_SERVICE_CONNECTED: "
+ msgData.activeSyncContext);
}
// check that this isn't an old message
if (isSyncStillActive(msgData.activeSyncContext)) {
- runBoundToSyncAdapter(msgData.activeSyncContext, msgData.syncAdapter);
+ runBoundToAdapter(
+ msgData.activeSyncContext,
+ msgData.adapter);
}
break;
}
case SyncHandler.MESSAGE_SERVICE_DISCONNECTED: {
final ActiveSyncContext currentSyncContext =
- ((ServiceConnectionData)msg.obj).activeSyncContext;
+ ((ServiceConnectionData) msg.obj).activeSyncContext;
if (Log.isLoggable(TAG, Log.VERBOSE)) {
Log.d(TAG, "handleSyncHandlerMessage: MESSAGE_SERVICE_DISCONNECTED: "
+ currentSyncContext);
@@ -1932,12 +2039,15 @@ public class SyncManager {
if (isSyncStillActive(currentSyncContext)) {
// cancel the sync if we have a syncadapter, which means one is
// outstanding
- if (currentSyncContext.mSyncAdapter != null) {
- try {
+ try {
+ if (currentSyncContext.mSyncAdapter != null) {
currentSyncContext.mSyncAdapter.cancelSync(currentSyncContext);
- } catch (RemoteException e) {
- // we don't need to retry this in this case
+ } else if (currentSyncContext.mSyncServiceAdapter != null) {
+ currentSyncContext.mSyncServiceAdapter
+ .cancelSync(currentSyncContext);
}
+ } catch (RemoteException e) {
+ // We don't need to retry this in this case.
}
// pretend that the sync failed with an IOException,
@@ -1982,9 +2092,46 @@ public class SyncManager {
}
}
+ private boolean isDispatchable(SyncStorageEngine.EndPoint target) {
+ final boolean isLoggable = Log.isLoggable(TAG, Log.VERBOSE);
+ if (target.target_provider) {
+ // skip the sync if the account of this operation no longer exists
+ AccountAndUser[] accounts = mRunningAccounts;
+ if (!containsAccountAndUser(
+ accounts, target.account, target.userId)) {
+ return false;
+ }
+ if (!mSyncStorageEngine.getMasterSyncAutomatically(target.userId)
+ || !mSyncStorageEngine.getSyncAutomatically(
+ target.account,
+ target.userId,
+ target.provider)) {
+ if (isLoggable) {
+ Log.v(TAG, " Not scheduling periodic operation: sync turned off.");
+ }
+ return false;
+ }
+ if (getIsSyncable(target.account, target.userId, target.provider)
+ == 0) {
+ if (isLoggable) {
+ Log.v(TAG, " Not scheduling periodic operation: isSyncable == 0.");
+ }
+ return false;
+ }
+ } else if (target.target_service) {
+ if (mSyncStorageEngine.getIsTargetServiceActive(target.service, target.userId)) {
+ if (isLoggable) {
+ Log.v(TAG, " Not scheduling periodic operation: isEnabled == 0.");
+ }
+ return false;
+ }
+ }
+ return true;
+ }
+
/**
* Turn any periodic sync operations that are ready to run into pending sync operations.
- * @return the desired start time of the earliest future periodic sync operation,
+ * @return the desired start time of the earliest future periodic sync operation,
* in milliseconds since boot
*/
private long scheduleReadyPeriodicSyncs() {
@@ -1992,14 +2139,7 @@ public class SyncManager {
if (isLoggable) {
Log.v(TAG, "scheduleReadyPeriodicSyncs");
}
- final boolean backgroundDataUsageAllowed =
- getConnectivityManager().getBackgroundDataSetting();
long earliestFuturePollTime = Long.MAX_VALUE;
- if (!backgroundDataUsageAllowed) {
- return earliestFuturePollTime;
- }
-
- AccountAndUser[] accounts = mRunningAccounts;
final long nowAbsolute = System.currentTimeMillis();
final long shiftedNowAbsolute = (0 < nowAbsolute - mSyncRandomOffsetMillis)
@@ -2010,40 +2150,31 @@ public class SyncManager {
for (Pair<AuthorityInfo, SyncStatusInfo> info : infos) {
final AuthorityInfo authorityInfo = info.first;
final SyncStatusInfo status = info.second;
- if (TextUtils.isEmpty(authorityInfo.authority)) {
- Log.e(TAG, "Got an empty provider string. Skipping: " + authorityInfo);
- continue;
- }
- // skip the sync if the account of this operation no longer exists
- if (!containsAccountAndUser(
- accounts, authorityInfo.account, authorityInfo.userId)) {
- continue;
- }
- if (!mSyncStorageEngine.getMasterSyncAutomatically(authorityInfo.userId)
- || !mSyncStorageEngine.getSyncAutomatically(
- authorityInfo.account, authorityInfo.userId,
- authorityInfo.authority)) {
+ if (TextUtils.isEmpty(authorityInfo.target.provider)) {
+ Log.e(TAG, "Got an empty provider string. Skipping: "
+ + authorityInfo.target.provider);
continue;
}
- if (getIsSyncable(
- authorityInfo.account, authorityInfo.userId, authorityInfo.authority)
- == 0) {
+ if (!isDispatchable(authorityInfo.target)) {
continue;
}
for (int i = 0, N = authorityInfo.periodicSyncs.size(); i < N; i++) {
final PeriodicSync sync = authorityInfo.periodicSyncs.get(i);
final Bundle extras = sync.extras;
- final long periodInMillis = sync.period * 1000;
- final long flexInMillis = sync.flexTime * 1000;
+ final Long periodInMillis = sync.period * 1000;
+ final Long flexInMillis = sync.flexTime * 1000;
// Skip if the period is invalid.
if (periodInMillis <= 0) {
continue;
}
// Find when this periodic sync was last scheduled to run.
final long lastPollTimeAbsolute = status.getPeriodicSyncTime(i);
+ final long shiftedLastPollTimeAbsolute =
+ (0 < lastPollTimeAbsolute - mSyncRandomOffsetMillis) ?
+ (lastPollTimeAbsolute - mSyncRandomOffsetMillis) : 0;
long remainingMillis
= periodInMillis - (shiftedNowAbsolute % periodInMillis);
long timeSinceLastRunMillis
@@ -2054,12 +2185,13 @@ public class SyncManager {
boolean runEarly = remainingMillis <= flexInMillis
&& timeSinceLastRunMillis > periodInMillis - flexInMillis;
if (isLoggable) {
- Log.v(TAG, "sync: " + i + " for " + authorityInfo.authority + "."
+ Log.v(TAG, "sync: " + i + " for " + authorityInfo.target + "."
+ " period: " + (periodInMillis)
+ " flex: " + (flexInMillis)
+ " remaining: " + (remainingMillis)
+ " time_since_last: " + timeSinceLastRunMillis
+ " last poll absol: " + lastPollTimeAbsolute
+ + " last poll shifed: " + shiftedLastPollTimeAbsolute
+ " shifted now: " + shiftedNowAbsolute
+ " run_early: " + runEarly);
}
@@ -2073,41 +2205,49 @@ public class SyncManager {
* future, sync now and reinitialize. This can happen for
* example if the user changed the time, synced and changed
* back.
- * Case 3: If we failed to sync at the last scheduled
- * time.
+ * Case 3: If we failed to sync at the last scheduled time.
* Case 4: This sync is close enough to the time that we can schedule it.
*/
- if (runEarly // Case 4
- || remainingMillis == periodInMillis // Case 1
+ if (remainingMillis == periodInMillis // Case 1
|| lastPollTimeAbsolute > nowAbsolute // Case 2
- || timeSinceLastRunMillis >= periodInMillis) { // Case 3
+ || timeSinceLastRunMillis >= periodInMillis // Case 3
+ || runEarly) { // Case 4
// Sync now
-
- final Pair<Long, Long> backoff = mSyncStorageEngine.getBackoff(
- authorityInfo.account, authorityInfo.userId,
- authorityInfo.authority);
- final RegisteredServicesCache.ServiceInfo<SyncAdapterType> syncAdapterInfo;
- syncAdapterInfo = mSyncAdapters.getServiceInfo(
- SyncAdapterType.newKey(
- authorityInfo.authority, authorityInfo.account.type),
- authorityInfo.userId);
- if (syncAdapterInfo == null) {
- continue;
- }
+ SyncStorageEngine.EndPoint target = authorityInfo.target;
+ final Pair<Long, Long> backoff =
+ mSyncStorageEngine.getBackoff(target);
mSyncStorageEngine.setPeriodicSyncTime(authorityInfo.ident,
authorityInfo.periodicSyncs.get(i), nowAbsolute);
- scheduleSyncOperation(
- new SyncOperation(authorityInfo.account, authorityInfo.userId,
- SyncOperation.REASON_PERIODIC,
- SyncStorageEngine.SOURCE_PERIODIC,
- authorityInfo.authority, extras,
- 0 /* runtime */, 0 /* flex */,
- backoff != null ? backoff.first : 0,
- mSyncStorageEngine.getDelayUntilTime(
- authorityInfo.account, authorityInfo.userId,
- authorityInfo.authority),
- syncAdapterInfo.type.allowParallelSyncs()));
-
+
+ if (target.target_provider) {
+ final RegisteredServicesCache.ServiceInfo<SyncAdapterType>
+ syncAdapterInfo = mSyncAdapters.getServiceInfo(
+ SyncAdapterType.newKey(
+ target.provider, target.account.type),
+ target.userId);
+ if (syncAdapterInfo == null) {
+ continue;
+ }
+ scheduleSyncOperation(
+ new SyncOperation(target.account, target.userId,
+ SyncOperation.REASON_PERIODIC,
+ SyncStorageEngine.SOURCE_PERIODIC,
+ target.provider, extras,
+ 0 /* runtime */, 0 /* flex */,
+ backoff != null ? backoff.first : 0,
+ mSyncStorageEngine.getDelayUntilTime(target),
+ syncAdapterInfo.type.allowParallelSyncs()));
+ } else if (target.target_service) {
+ scheduleSyncOperation(
+ new SyncOperation(target.service, target.userId,
+ SyncOperation.REASON_PERIODIC,
+ SyncStorageEngine.SOURCE_PERIODIC,
+ extras,
+ 0 /* runtime */,
+ 0 /* flex */,
+ backoff != null ? backoff.first : 0,
+ mSyncStorageEngine.getDelayUntilTime(target)));
+ }
}
// Compute when this periodic sync should next run.
long nextPollTimeAbsolute;
@@ -2154,8 +2294,7 @@ public class SyncManager {
// If the accounts aren't known yet then we aren't ready to run. We will be kicked
// when the account lookup request does complete.
- AccountAndUser[] accounts = mRunningAccounts;
- if (accounts == INITIAL_ACCOUNTS_ARRAY) {
+ if (mRunningAccounts == INITIAL_ACCOUNTS_ARRAY) {
if (isLoggable) {
Log.v(TAG, "maybeStartNextSync: accounts not known, skipping");
}
@@ -2165,9 +2304,6 @@ public class SyncManager {
// Otherwise consume SyncOperations from the head of the SyncQueue until one is
// found that is runnable (not disabled, etc). If that one is ready to run then
// start it, otherwise just get out.
- final boolean backgroundDataUsageAllowed =
- getConnectivityManager().getBackgroundDataSetting();
-
final long now = SystemClock.elapsedRealtime();
// will be set to the next time that a sync should be considered for running
@@ -2189,40 +2325,23 @@ public class SyncManager {
while (operationIterator.hasNext()) {
final SyncOperation op = operationIterator.next();
- // Drop the sync if the account of this operation no longer exists.
- if (!containsAccountAndUser(accounts, op.account, op.userId)) {
- operationIterator.remove();
- mSyncStorageEngine.deleteFromPending(op.pendingOperation);
+ // If the user is not running, skip the request.
+ if (!activityManager.isUserRunning(op.target.userId)) {
+ final UserInfo userInfo = mUserManager.getUserInfo(op.target.userId);
+ if (userInfo == null) {
+ removedUsers.add(op.target.userId);
+ }
if (isLoggable) {
- Log.v(TAG, " Dropping sync operation: account doesn't exist.");
+ Log.v(TAG, " Dropping all sync operations for + "
+ + op.target.userId + ": user not running.");
}
continue;
}
-
- // Drop this sync request if it isn't syncable.
- int syncableState = getIsSyncable(
- op.account, op.userId, op.authority);
- if (syncableState == 0) {
+ if (!isOperationValidLocked(op)) {
operationIterator.remove();
mSyncStorageEngine.deleteFromPending(op.pendingOperation);
- if (isLoggable) {
- Log.v(TAG, " Dropping sync operation: isSyncable == 0.");
- }
- continue;
- }
-
- // If the user is not running, drop the request.
- if (!activityManager.isUserRunning(op.userId)) {
- final UserInfo userInfo = mUserManager.getUserInfo(op.userId);
- if (userInfo == null) {
- removedUsers.add(op.userId);
- }
- if (isLoggable) {
- Log.v(TAG, " Dropping sync operation: user not running.");
- }
continue;
}
-
// If the next run time is in the future, even given the flexible scheduling,
// return the time.
if (op.effectiveRunTime - op.flexTime > now) {
@@ -2230,51 +2349,16 @@ public class SyncManager {
nextReadyToRunTime = op.effectiveRunTime;
}
if (isLoggable) {
- Log.v(TAG, " Dropping sync operation: Sync too far in future.");
+ Log.v(TAG, " Not running sync operation: Sync too far in future."
+ + "effective: " + op.effectiveRunTime + " flex: " + op.flexTime
+ + " now: " + now);
}
continue;
}
-
- // If the op isn't allowed on metered networks and we're on one, drop it.
- if (getConnectivityManager().isActiveNetworkMetered()
- && op.isMeteredDisallowed()) {
- operationIterator.remove();
- mSyncStorageEngine.deleteFromPending(op.pendingOperation);
- continue;
- }
-
- // TODO: change this behaviour for non-registered syncs.
- final RegisteredServicesCache.ServiceInfo<SyncAdapterType> syncAdapterInfo;
- syncAdapterInfo = mSyncAdapters.getServiceInfo(
- SyncAdapterType.newKey(op.authority, op.account.type), op.userId);
-
- // only proceed if network is connected for requesting UID
- final boolean uidNetworkConnected;
- if (syncAdapterInfo != null) {
- final NetworkInfo networkInfo = getConnectivityManager()
- .getActiveNetworkInfoForUid(syncAdapterInfo.uid);
- uidNetworkConnected = networkInfo != null && networkInfo.isConnected();
- } else {
- uidNetworkConnected = false;
- }
-
- // skip the sync if it isn't manual, and auto sync or
- // background data usage is disabled or network is
- // disconnected for the target UID.
- if (!op.extras.getBoolean(ContentResolver.SYNC_EXTRAS_IGNORE_SETTINGS, false)
- && (syncableState > 0)
- && (!mSyncStorageEngine.getMasterSyncAutomatically(op.userId)
- || !backgroundDataUsageAllowed
- || !uidNetworkConnected
- || !mSyncStorageEngine.getSyncAutomatically(
- op.account, op.userId, op.authority))) {
- operationIterator.remove();
- mSyncStorageEngine.deleteFromPending(op.pendingOperation);
- continue;
- }
-
+ // Add this sync to be run.
operations.add(op);
}
+
for (Integer user : removedUsers) {
// if it's still removed
if (mUserManager.getUserInfo(user) == null) {
@@ -2316,13 +2400,9 @@ public class SyncManager {
}
}
}
- if (activeOp.account.type.equals(candidate.account.type)
- && activeOp.authority.equals(candidate.authority)
- && activeOp.userId == candidate.userId
- && (!activeOp.allowParallelSyncs
- || activeOp.account.name.equals(candidate.account.name))) {
+ if (activeOp.isConflict(candidate)) {
conflict = activeSyncContext;
- // don't break out since we want to do a full count of the varieties
+ // don't break out since we want to do a full count of the varieties.
} else {
if (candidateIsInitialization == activeOp.isInitialization()
&& activeSyncContext.mStartTime + MAX_TIME_PER_SYNC < now) {
@@ -2372,8 +2452,8 @@ public class SyncManager {
// is null. Reschedule the active sync and start the candidate.
toReschedule = oldestNonExpeditedRegular;
if (Log.isLoggable(TAG, Log.VERBOSE)) {
- Log.v(TAG, "canceling and rescheduling sync since an expedited is ready to run, "
- + oldestNonExpeditedRegular);
+ Log.v(TAG, "canceling and rescheduling sync since an expedited is ready to"
+ + " run, " + oldestNonExpeditedRegular);
}
} else if (longRunning != null
&& (candidateIsInitialization
@@ -2402,7 +2482,114 @@ public class SyncManager {
}
return nextReadyToRunTime;
- }
+ }
+
+ /**
+ * Determine if a sync is no longer valid and should be dropped from the sync queue and its
+ * pending op deleted.
+ * @param op operation for which the sync is to be scheduled.
+ */
+ private boolean isOperationValidLocked(SyncOperation op) {
+ final boolean isLoggable = Log.isLoggable(TAG, Log.VERBOSE);
+ int targetUid;
+ int state;
+ final SyncStorageEngine.EndPoint target = op.target;
+ boolean syncEnabled = mSyncStorageEngine.getMasterSyncAutomatically(target.userId);
+ if (target.target_provider) {
+ // Drop the sync if the account of this operation no longer exists.
+ AccountAndUser[] accounts = mRunningAccounts;
+ if (!containsAccountAndUser(accounts, target.account, target.userId)) {
+ if (isLoggable) {
+ Log.v(TAG, " Dropping sync operation: account doesn't exist.");
+ }
+ return false;
+ }
+ // Drop this sync request if it isn't syncable.
+ state = getIsSyncable(target.account, target.userId, target.provider);
+ if (state == 0) {
+ if (isLoggable) {
+ Log.v(TAG, " Dropping sync operation: isSyncable == 0.");
+ }
+ return false;
+ }
+ syncEnabled = syncEnabled && mSyncStorageEngine.getSyncAutomatically(
+ target.account, target.userId, target.provider);
+
+ final RegisteredServicesCache.ServiceInfo<SyncAdapterType> syncAdapterInfo;
+ syncAdapterInfo = mSyncAdapters.getServiceInfo(
+ SyncAdapterType.newKey(
+ target.provider, target.account.type), target.userId);
+ if (syncAdapterInfo != null) {
+ targetUid = syncAdapterInfo.uid;
+ } else {
+ if (isLoggable) {
+ Log.v(TAG, " Dropping sync operation: No sync adapter registered"
+ + "for: " + target);
+ }
+ return false;
+ }
+ } else if (target.target_service) {
+ state = mSyncStorageEngine.getIsTargetServiceActive(target.service, target.userId)
+ ? 1 : 0;
+ if (state == 0) {
+ // TODO: Change this to not drop disabled syncs - keep them in the pending queue.
+ if (isLoggable) {
+ Log.v(TAG, " Dropping sync operation: isActive == 0.");
+ }
+ return false;
+ }
+ try {
+ targetUid = mContext.getPackageManager()
+ .getServiceInfo(target.service, 0)
+ .applicationInfo
+ .uid;
+ } catch (PackageManager.NameNotFoundException e) {
+ if (isLoggable) {
+ Log.v(TAG, " Dropping sync operation: No service registered for: "
+ + target.service);
+ }
+ return false;
+ }
+ } else {
+ Log.e(TAG, "Unknown target for Sync Op: " + target);
+ return false;
+ }
+
+ // We ignore system settings that specify the sync is invalid if:
+ // 1) It's manual - we try it anyway. When/if it fails it will be rescheduled.
+ // or
+ // 2) it's an initialisation sync - we just need to connect to it.
+ final boolean ignoreSystemConfiguration =
+ op.extras.getBoolean(ContentResolver.SYNC_EXTRAS_IGNORE_SETTINGS, false)
+ || (state < 0);
+
+ // Sync not enabled.
+ if (!syncEnabled && !ignoreSystemConfiguration) {
+ if (isLoggable) {
+ Log.v(TAG, " Dropping sync operation: disallowed by settings/network.");
+ }
+ return false;
+ }
+ // Network down.
+ final NetworkInfo networkInfo = getConnectivityManager()
+ .getActiveNetworkInfoForUid(targetUid);
+ final boolean uidNetworkConnected = networkInfo != null && networkInfo.isConnected();
+ if (!uidNetworkConnected && !ignoreSystemConfiguration) {
+ if (isLoggable) {
+ Log.v(TAG, " Dropping sync operation: disallowed by settings/network.");
+ }
+ return false;
+ }
+ // Metered network.
+ if (op.isNotAllowedOnMetered() && getConnectivityManager().isActiveNetworkMetered()
+ && !ignoreSystemConfiguration) {
+ if (isLoggable) {
+ Log.v(TAG, " Dropping sync operation: not allowed on metered network.");
+ }
+ return false;
+ }
+ return true;
+ }
private boolean dispatchSyncOperation(SyncOperation op) {
if (Log.isLoggable(TAG, Log.VERBOSE)) {
@@ -2412,27 +2599,48 @@ public class SyncManager {
Log.v(TAG, syncContext.toString());
}
}
-
- // connect to the sync adapter
- SyncAdapterType syncAdapterType = SyncAdapterType.newKey(op.authority, op.account.type);
- final RegisteredServicesCache.ServiceInfo<SyncAdapterType> syncAdapterInfo;
- syncAdapterInfo = mSyncAdapters.getServiceInfo(syncAdapterType, op.userId);
- if (syncAdapterInfo == null) {
- Log.d(TAG, "can't find a sync adapter for " + syncAdapterType
- + ", removing settings for it");
- mSyncStorageEngine.removeAuthority(op.account, op.userId, op.authority);
- return false;
+ // Connect to the sync adapter.
+ int targetUid;
+ ComponentName targetComponent;
+ final SyncStorageEngine.EndPoint info = op.target;
+ if (info.target_provider) {
+ SyncAdapterType syncAdapterType =
+ SyncAdapterType.newKey(info.provider, info.account.type);
+ final RegisteredServicesCache.ServiceInfo<SyncAdapterType> syncAdapterInfo;
+ syncAdapterInfo = mSyncAdapters.getServiceInfo(syncAdapterType, info.userId);
+ if (syncAdapterInfo == null) {
+ Log.d(TAG, "can't find a sync adapter for " + syncAdapterType
+ + ", removing settings for it");
+ mSyncStorageEngine.removeAuthority(info);
+ return false;
+ }
+ targetUid = syncAdapterInfo.uid;
+ targetComponent = syncAdapterInfo.componentName;
+ } else {
+ // TODO: Store the uid of the service as part of the authority info in order to
+ // avoid this call?
+ try {
+ targetUid = mContext.getPackageManager()
+ .getServiceInfo(info.service, 0)
+ .applicationInfo
+ .uid;
+ targetComponent = info.service;
+ } catch(PackageManager.NameNotFoundException e) {
+ Log.d(TAG, "Can't find a service for " + info.service
+ + ", removing settings for it");
+ mSyncStorageEngine.removeAuthority(info);
+ return false;
+ }
}
-
ActiveSyncContext activeSyncContext =
- new ActiveSyncContext(op, insertStartSyncEvent(op), syncAdapterInfo.uid);
+ new ActiveSyncContext(op, insertStartSyncEvent(op), targetUid);
activeSyncContext.mSyncInfo = mSyncStorageEngine.addActiveSync(activeSyncContext);
mActiveSyncContexts.add(activeSyncContext);
if (Log.isLoggable(TAG, Log.VERBOSE)) {
Log.v(TAG, "dispatchSyncOperation: starting " + activeSyncContext);
}
- if (!activeSyncContext.bindToSyncAdapter(syncAdapterInfo, op.userId)) {
- Log.e(TAG, "Bind attempt failed to " + syncAdapterInfo);
+ if (!activeSyncContext.bindToSyncAdapter(targetComponent, info.userId)) {
+ Log.e(TAG, "Bind attempt failed - target: " + targetComponent);
closeActiveSyncContext(activeSyncContext);
return false;
}
@@ -2440,47 +2648,54 @@ public class SyncManager {
return true;
}
- private void runBoundToSyncAdapter(final ActiveSyncContext activeSyncContext,
- ISyncAdapter syncAdapter) {
- activeSyncContext.mSyncAdapter = syncAdapter;
+ private void runBoundToAdapter(final ActiveSyncContext activeSyncContext,
+ IBinder syncAdapter) {
final SyncOperation syncOperation = activeSyncContext.mSyncOperation;
try {
activeSyncContext.mIsLinkedToDeath = true;
- syncAdapter.asBinder().linkToDeath(activeSyncContext, 0);
-
- syncAdapter.startSync(activeSyncContext, syncOperation.authority,
- syncOperation.account, syncOperation.extras);
+ syncAdapter.linkToDeath(activeSyncContext, 0);
+
+ if (syncOperation.target.target_provider) {
+ activeSyncContext.mSyncAdapter = ISyncAdapter.Stub.asInterface(syncAdapter);
+ activeSyncContext.mSyncAdapter
+ .startSync(activeSyncContext, syncOperation.target.provider,
+ syncOperation.target.account, syncOperation.extras);
+ } else if (syncOperation.target.target_service) {
+ activeSyncContext.mSyncServiceAdapter =
+ ISyncServiceAdapter.Stub.asInterface(syncAdapter);
+ activeSyncContext.mSyncServiceAdapter
+ .startSync(activeSyncContext, syncOperation.extras);
+ }
} catch (RemoteException remoteExc) {
Log.d(TAG, "maybeStartNextSync: caught a RemoteException, rescheduling", remoteExc);
closeActiveSyncContext(activeSyncContext);
increaseBackoffSetting(syncOperation);
- scheduleSyncOperation(new SyncOperation(syncOperation));
+ scheduleSyncOperation(
+ new SyncOperation(syncOperation, 0L /* newRunTimeFromNow */));
} catch (RuntimeException exc) {
closeActiveSyncContext(activeSyncContext);
Log.e(TAG, "Caught RuntimeException while starting the sync " + syncOperation, exc);
}
}
- private void cancelActiveSyncLocked(Account account, int userId, String authority) {
+ /**
+ * Cancel the sync for the provided target that matches the given bundle.
+ * @param info can have null fields to indicate all the active syncs for that field.
+ */
+ private void cancelActiveSyncLocked(SyncStorageEngine.EndPoint info, Bundle extras) {
ArrayList<ActiveSyncContext> activeSyncs =
new ArrayList<ActiveSyncContext>(mActiveSyncContexts);
for (ActiveSyncContext activeSyncContext : activeSyncs) {
if (activeSyncContext != null) {
- // if an account was specified then only cancel the sync if it matches
- if (account != null) {
- if (!account.equals(activeSyncContext.mSyncOperation.account)) {
- continue;
- }
- }
- // if an authority was specified then only cancel the sync if it matches
- if (authority != null) {
- if (!authority.equals(activeSyncContext.mSyncOperation.authority)) {
- continue;
- }
+ final SyncStorageEngine.EndPoint opInfo =
+ activeSyncContext.mSyncOperation.target;
+ if (!opInfo.matchesSpec(info)) {
+ continue;
}
- // check if the userid matches
- if (userId != UserHandle.USER_ALL
- && userId != activeSyncContext.mSyncOperation.userId) {
+ if (extras != null &&
+ !syncExtrasEquals(activeSyncContext.mSyncOperation.extras,
+ extras,
+ false /* no config settings */)) {
continue;
}
runSyncFinishedOrCanceledLocked(null /* no result since this is a cancel */,
@@ -2493,16 +2708,20 @@ public class SyncManager {
ActiveSyncContext activeSyncContext) {
boolean isLoggable = Log.isLoggable(TAG, Log.VERBOSE);
+ final SyncOperation syncOperation = activeSyncContext.mSyncOperation;
+ final SyncStorageEngine.EndPoint info = syncOperation.target;
+
if (activeSyncContext.mIsLinkedToDeath) {
- activeSyncContext.mSyncAdapter.asBinder().unlinkToDeath(activeSyncContext, 0);
+ if (info.target_provider) {
+ activeSyncContext.mSyncAdapter.asBinder().unlinkToDeath(activeSyncContext, 0);
+ } else {
+ activeSyncContext.mSyncServiceAdapter.asBinder()
+ .unlinkToDeath(activeSyncContext, 0);
+ }
activeSyncContext.mIsLinkedToDeath = false;
}
closeActiveSyncContext(activeSyncContext);
-
- final SyncOperation syncOperation = activeSyncContext.mSyncOperation;
-
final long elapsedTime = SystemClock.elapsedRealtime() - activeSyncContext.mStartTime;
-
String historyMessage;
int downstreamActivity;
int upstreamActivity;
@@ -2544,6 +2763,12 @@ public class SyncManager {
} catch (RemoteException e) {
// we don't need to retry this in this case
}
+ } else if (activeSyncContext.mSyncServiceAdapter != null) {
+ try {
+ activeSyncContext.mSyncServiceAdapter.cancelSync(activeSyncContext);
+ } catch (RemoteException e) {
+ // we don't need to retry this in this case
+ }
}
historyMessage = SyncStorageEngine.MESG_CANCELED;
downstreamActivity = 0;
@@ -2553,24 +2778,35 @@ public class SyncManager {
stopSyncEvent(activeSyncContext.mHistoryRowId, syncOperation, historyMessage,
upstreamActivity, downstreamActivity, elapsedTime);
- if (syncResult != null && syncResult.tooManyDeletions) {
- installHandleTooManyDeletesNotification(syncOperation.account,
- syncOperation.authority, syncResult.stats.numDeletes,
- syncOperation.userId);
+ // Check for full-resync and schedule it after closing off the last sync.
+ if (info.target_provider) {
+ if (syncResult != null && syncResult.tooManyDeletions) {
+ installHandleTooManyDeletesNotification(info.account,
+ info.provider, syncResult.stats.numDeletes,
+ info.userId);
+ } else {
+ mNotificationMgr.cancelAsUser(null,
+ info.account.hashCode() ^ info.provider.hashCode(),
+ new UserHandle(info.userId));
+ }
+ if (syncResult != null && syncResult.fullSyncRequested) {
+ scheduleSyncOperation(
+ new SyncOperation(info.account, info.userId,
+ syncOperation.reason,
+ syncOperation.syncSource, info.provider, new Bundle(),
+ 0 /* delay */, 0 /* flex */,
+ syncOperation.backoff, syncOperation.delayUntil,
+ syncOperation.allowParallelSyncs));
+ }
} else {
- mNotificationMgr.cancelAsUser(null,
- syncOperation.account.hashCode() ^ syncOperation.authority.hashCode(),
- new UserHandle(syncOperation.userId));
- }
-
- if (syncResult != null && syncResult.fullSyncRequested) {
- scheduleSyncOperation(
- new SyncOperation(syncOperation.account, syncOperation.userId,
- syncOperation.reason,
- syncOperation.syncSource, syncOperation.authority, new Bundle(),
- 0 /* delay */, 0 /* flex */,
- syncOperation.backoff, syncOperation.delayUntil,
- syncOperation.allowParallelSyncs));
+ if (syncResult != null && syncResult.fullSyncRequested) {
+ scheduleSyncOperation(
+ new SyncOperation(info.service, info.userId,
+ syncOperation.reason,
+ syncOperation.syncSource, new Bundle(),
+ 0 /* delay */, 0 /* flex */,
+ syncOperation.backoff, syncOperation.delayUntil));
+ }
}
// no need to schedule an alarm, as that will be done by our caller.
}
@@ -2579,7 +2815,7 @@ public class SyncManager {
activeSyncContext.close();
mActiveSyncContexts.remove(activeSyncContext);
mSyncStorageEngine.removeActiveSync(activeSyncContext.mSyncInfo,
- activeSyncContext.mSyncOperation.userId);
+ activeSyncContext.mSyncOperation.target.userId);
}
/**
@@ -2842,26 +3078,16 @@ public class SyncManager {
}
public long insertStartSyncEvent(SyncOperation syncOperation) {
- final int source = syncOperation.syncSource;
final long now = System.currentTimeMillis();
-
- EventLog.writeEvent(2720, syncOperation.authority,
- SyncStorageEngine.EVENT_START, source,
- syncOperation.account.name.hashCode());
-
- return mSyncStorageEngine.insertStartSyncEvent(
- syncOperation.account, syncOperation.userId, syncOperation.reason,
- syncOperation.authority,
- now, source, syncOperation.isInitialization(), syncOperation.extras
- );
+ EventLog.writeEvent(2720,
+ syncOperation.toEventLog(SyncStorageEngine.EVENT_START));
+ return mSyncStorageEngine.insertStartSyncEvent(syncOperation, now);
}
public void stopSyncEvent(long rowId, SyncOperation syncOperation, String resultMessage,
int upstreamActivity, int downstreamActivity, long elapsedTime) {
- EventLog.writeEvent(2720, syncOperation.authority,
- SyncStorageEngine.EVENT_STOP, syncOperation.syncSource,
- syncOperation.account.name.hashCode());
-
+ EventLog.writeEvent(2720,
+ syncOperation.toEventLog(SyncStorageEngine.EVENT_STOP));
mSyncStorageEngine.stopSyncEvent(rowId, elapsedTime,
resultMessage, downstreamActivity, upstreamActivity);
}
@@ -2876,6 +3102,83 @@ public class SyncManager {
return false;
}
+ /**
+ * Sync extra comparison function.
+ * @param b1 bundle to compare
+ * @param b2 other bundle to compare
+ * @param includeSyncSettings if false, ignore system settings in bundle.
+ */
+ public static boolean syncExtrasEquals(Bundle b1, Bundle b2, boolean includeSyncSettings) {
+ if (b1 == b2) {
+ return true;
+ }
+ // Exit early if we can.
+ if (includeSyncSettings && b1.size() != b2.size()) {
+ return false;
+ }
+ Bundle bigger = b1.size() > b2.size() ? b1 : b2;
+ Bundle smaller = b1.size() > b2.size() ? b2 : b1;
+ for (String key : bigger.keySet()) {
+ if (!includeSyncSettings && isSyncSetting(key)) {
+ continue;
+ }
+ if (!smaller.containsKey(key)) {
+ return false;
+ }
+ if (!bigger.get(key).equals(smaller.get(key))) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * TODO: Get rid of this when we separate sync settings extras from dev specified extras.
+ * @return true if the provided key is used by the SyncManager in scheduling the sync.
+ */
+ private static boolean isSyncSetting(String key) {
+ if (key.equals(ContentResolver.SYNC_EXTRAS_EXPEDITED)) {
+ return true;
+ }
+ if (key.equals(ContentResolver.SYNC_EXTRAS_IGNORE_SETTINGS)) {
+ return true;
+ }
+ if (key.equals(ContentResolver.SYNC_EXTRAS_IGNORE_BACKOFF)) {
+ return true;
+ }
+ if (key.equals(ContentResolver.SYNC_EXTRAS_DO_NOT_RETRY)) {
+ return true;
+ }
+ if (key.equals(ContentResolver.SYNC_EXTRAS_MANUAL)) {
+ return true;
+ }
+ if (key.equals(ContentResolver.SYNC_EXTRAS_UPLOAD)) {
+ return true;
+ }
+ if (key.equals(ContentResolver.SYNC_EXTRAS_OVERRIDE_TOO_MANY_DELETIONS)) {
+ return true;
+ }
+ if (key.equals(ContentResolver.SYNC_EXTRAS_DISCARD_LOCAL_DELETIONS)) {
+ return true;
+ }
+ if (key.equals(ContentResolver.SYNC_EXTRAS_EXPECTED_UPLOAD)) {
+ return true;
+ }
+ if (key.equals(ContentResolver.SYNC_EXTRAS_EXPECTED_DOWNLOAD)) {
+ return true;
+ }
+ if (key.equals(ContentResolver.SYNC_EXTRAS_PRIORITY)) {
+ return true;
+ }
+ if (key.equals(ContentResolver.SYNC_EXTRAS_DISALLOW_METERED)) {
+ return true;
+ }
+ if (key.equals(ContentResolver.SYNC_EXTRAS_INITIALIZE)) {
+ return true;
+ }
+ return false;
+ }
+
static class PrintTable {
private ArrayList<Object[]> mTable = Lists.newArrayList();
private final int mCols;
diff --git a/services/java/com/android/server/content/SyncOperation.java b/services/java/com/android/server/content/SyncOperation.java
index 4856747..036b21f 100644
--- a/services/java/com/android/server/content/SyncOperation.java
+++ b/services/java/com/android/server/content/SyncOperation.java
@@ -20,10 +20,9 @@ import android.accounts.Account;
import android.content.pm.PackageManager;
import android.content.ComponentName;
import android.content.ContentResolver;
-import android.content.SyncRequest;
import android.os.Bundle;
import android.os.SystemClock;
-import android.util.Pair;
+import android.util.Log;
/**
* Value type that represents a sync operation.
@@ -32,10 +31,13 @@ import android.util.Pair;
* {@hide}
*/
public class SyncOperation implements Comparable {
+ public static final String TAG = "SyncManager";
+
public static final int REASON_BACKGROUND_DATA_SETTINGS_CHANGED = -1;
public static final int REASON_ACCOUNTS_UPDATED = -2;
public static final int REASON_SERVICE_CHANGED = -3;
public static final int REASON_PERIODIC = -4;
+ /** Sync started because it has just been set to isSyncable. */
public static final int REASON_IS_SYNCABLE = -5;
/** Sync started because it has just been set to sync automatically. */
public static final int REASON_SYNC_AUTO = -6;
@@ -54,19 +56,21 @@ public class SyncOperation implements Comparable {
"UserStart",
};
- /** Account info to identify a SyncAdapter registered with the system. */
- public final Account account;
- /** Authority info to identify a SyncAdapter registered with the system. */
- public final String authority;
- /** Service to which this operation will bind to perform the sync. */
- public final ComponentName service;
- public final int userId;
+ public static final int SYNC_TARGET_UNKNOWN = 0;
+ public static final int SYNC_TARGET_ADAPTER = 1;
+ public static final int SYNC_TARGET_SERVICE = 2;
+
+ /** Identifying info for the target for this operation. */
+ public final SyncStorageEngine.EndPoint target;
+ /** Why this sync was kicked off. {@link #REASON_NAMES} */
public final int reason;
+ /** Where this sync was initiated. */
public int syncSource;
public final boolean allowParallelSyncs;
public Bundle extras;
public final String key;
public boolean expedited;
+ /** Bare-bones version of this operation that is persisted across reboots. */
public SyncStorageEngine.PendingOperation pendingOperation;
/** Elapsed real time in millis at which to run this sync. */
public long latestRunTime;
@@ -79,25 +83,56 @@ public class SyncOperation implements Comparable {
* Depends on max(backoff, latestRunTime, and delayUntil).
*/
public long effectiveRunTime;
- /** Amount of time before {@link effectiveRunTime} from which this sync can run. */
+ /** Amount of time before {@link #effectiveRunTime} from which this sync can run. */
public long flexTime;
- public SyncOperation(Account account, int userId, int reason, int source, String authority,
+ public SyncOperation(Account account, int userId, int reason, int source, String provider,
Bundle extras, long runTimeFromNow, long flexTime, long backoff,
long delayUntil, boolean allowParallelSyncs) {
- this.service = null;
- this.account = account;
- this.authority = authority;
- this.userId = userId;
+ this.target = new SyncStorageEngine.EndPoint(account, provider, userId);
this.reason = reason;
- this.syncSource = source;
this.allowParallelSyncs = allowParallelSyncs;
+ this.key = initialiseOperation(this.target, source, extras, runTimeFromNow, flexTime,
+ backoff, delayUntil);
+ }
+
+ public SyncOperation(ComponentName service, int userId, int reason, int source,
+ Bundle extras, long runTimeFromNow, long flexTime, long backoff,
+ long delayUntil) {
+ this.target = new SyncStorageEngine.EndPoint(service, userId);
+ // Default to true for sync service. The service itself decides how to handle this.
+ this.allowParallelSyncs = true;
+ this.reason = reason;
+ this.key =
+ initialiseOperation(this.target,
+ source, extras, runTimeFromNow, flexTime, backoff, delayUntil);
+ }
+
+ /** Used to reschedule a sync at a new point in time. */
+ SyncOperation(SyncOperation other, long newRunTimeFromNow) {
+ this.target = other.target;
+ this.reason = other.reason;
+ this.expedited = other.expedited;
+ this.allowParallelSyncs = other.allowParallelSyncs;
+ // re-use old flex, but only
+ long newFlexTime = Math.min(other.flexTime, newRunTimeFromNow);
+ this.key =
+ initialiseOperation(this.target,
+ other.syncSource, other.extras,
+ newRunTimeFromNow /* runTimeFromNow*/,
+ newFlexTime /* flexTime */,
+ other.backoff,
+ 0L /* delayUntil */);
+ }
+
+ private String initialiseOperation(SyncStorageEngine.EndPoint info, int source, Bundle extras,
+ long runTimeFromNow, long flexTime, long backoff, long delayUntil) {
+ this.syncSource = source;
this.extras = new Bundle(extras);
cleanBundle(this.extras);
this.delayUntil = delayUntil;
this.backoff = backoff;
final long now = SystemClock.elapsedRealtime();
- // Checks the extras bundle. Must occur after we set the internal bundle.
if (runTimeFromNow < 0 || isExpedited()) {
this.expedited = true;
this.latestRunTime = now;
@@ -108,7 +143,11 @@ public class SyncOperation implements Comparable {
this.flexTime = flexTime;
}
updateEffectiveRunTime();
- this.key = toKey();
+ return toKey(info, this.extras);
+ }
+
+ public boolean matchesAuthority(SyncOperation other) {
+ return this.target.matchesSpec(other.target);
}
/**
@@ -126,10 +165,6 @@ public class SyncOperation implements Comparable {
removeFalseExtra(bundle, ContentResolver.SYNC_EXTRAS_EXPEDITED);
removeFalseExtra(bundle, ContentResolver.SYNC_EXTRAS_OVERRIDE_TOO_MANY_DELETIONS);
removeFalseExtra(bundle, ContentResolver.SYNC_EXTRAS_DISALLOW_METERED);
-
- // Remove Config data.
- bundle.remove(ContentResolver.SYNC_EXTRAS_EXPECTED_UPLOAD);
- bundle.remove(ContentResolver.SYNC_EXTRAS_EXPECTED_DOWNLOAD);
}
private void removeFalseExtra(Bundle bundle, String extraName) {
@@ -138,22 +173,24 @@ public class SyncOperation implements Comparable {
}
}
- /** Only used to immediately reschedule a sync. */
- SyncOperation(SyncOperation other) {
- this.service = other.service;
- this.account = other.account;
- this.authority = other.authority;
- this.userId = other.userId;
- this.reason = other.reason;
- this.syncSource = other.syncSource;
- this.extras = new Bundle(other.extras);
- this.expedited = other.expedited;
- this.latestRunTime = SystemClock.elapsedRealtime();
- this.flexTime = 0L;
- this.backoff = other.backoff;
- this.allowParallelSyncs = other.allowParallelSyncs;
- this.updateEffectiveRunTime();
- this.key = toKey();
+ /**
+ * Determine whether if this sync operation is running, the provided operation would conflict
+ * with it.
+ * Parallel syncs allow multiple accounts to be synced at the same time.
+ */
+ public boolean isConflict(SyncOperation toRun) {
+ final SyncStorageEngine.EndPoint other = toRun.target;
+ if (target.target_provider) {
+ return target.account.type.equals(other.account.type)
+ && target.provider.equals(other.provider)
+ && target.userId == other.userId
+ && (!allowParallelSyncs
+ || target.account.name.equals(other.account.name));
+ } else {
+ // Ops that target a service default to allow parallel syncs, which is handled by the
+ // service returning SYNC_IN_PROGRESS if they don't.
+ return target.service.equals(other.service) && !allowParallelSyncs;
+ }
}
@Override
@@ -162,18 +199,26 @@ public class SyncOperation implements Comparable {
}
public String dump(PackageManager pm, boolean useOneLine) {
- StringBuilder sb = new StringBuilder()
- .append(account.name)
+ StringBuilder sb = new StringBuilder();
+ if (target.target_provider) {
+ sb.append(target.account.name)
.append(" u")
- .append(userId).append(" (")
- .append(account.type)
+ .append(target.userId).append(" (")
+ .append(target.account.type)
.append(")")
.append(", ")
- .append(authority)
- .append(", ")
- .append(SyncStorageEngine.SOURCES[syncSource])
- .append(", latestRunTime ")
- .append(latestRunTime);
+ .append(target.provider)
+ .append(", ");
+ } else if (target.target_service) {
+ sb.append(target.service.getPackageName())
+ .append(" u")
+ .append(target.userId).append(" (")
+ .append(target.service.getClassName()).append(")")
+ .append(", ");
+ }
+ sb.append(SyncStorageEngine.SOURCES[syncSource])
+ .append(", currentRunTime ")
+ .append(effectiveRunTime);
if (expedited) {
sb.append(", EXPEDITED");
}
@@ -211,10 +256,6 @@ public class SyncOperation implements Comparable {
}
}
- public boolean isMeteredDisallowed() {
- return extras.getBoolean(ContentResolver.SYNC_EXTRAS_DISALLOW_METERED, false);
- }
-
public boolean isInitialization() {
return extras.getBoolean(ContentResolver.SYNC_EXTRAS_INITIALIZE, false);
}
@@ -227,28 +268,39 @@ public class SyncOperation implements Comparable {
return extras.getBoolean(ContentResolver.SYNC_EXTRAS_IGNORE_BACKOFF, false);
}
+ public boolean isNotAllowedOnMetered() {
+ return extras.getBoolean(ContentResolver.SYNC_EXTRAS_DISALLOW_METERED, false);
+ }
+
/** Changed in V3. */
- private String toKey() {
+ public static String toKey(SyncStorageEngine.EndPoint info, Bundle extras) {
StringBuilder sb = new StringBuilder();
- if (service == null) {
- sb.append("authority: ").append(authority);
- sb.append(" account {name=" + account.name + ", user=" + userId + ", type=" + account.type
+ if (info.target_provider) {
+ sb.append("provider: ").append(info.provider);
+ sb.append(" account {name=" + info.account.name
+ + ", user="
+ + info.userId
+ + ", type="
+ + info.account.type
+ "}");
- } else {
+ } else if (info.target_service) {
sb.append("service {package=" )
- .append(service.getPackageName())
+ .append(info.service.getPackageName())
.append(" user=")
- .append(userId)
+ .append(info.userId)
.append(", class=")
- .append(service.getClassName())
+ .append(info.service.getClassName())
.append("}");
+ } else {
+ Log.v(TAG, "Converting SyncOperaton to key, invalid target: " + info.toString());
+ return "";
}
sb.append(" extras: ");
extrasToStringBuilder(extras, sb);
return sb.toString();
}
- public static void extrasToStringBuilder(Bundle bundle, StringBuilder sb) {
+ private static void extrasToStringBuilder(Bundle bundle, StringBuilder sb) {
sb.append("[");
for (String key : bundle.keySet()) {
sb.append(key).append("=").append(bundle.get(key)).append(" ");
@@ -256,6 +308,31 @@ public class SyncOperation implements Comparable {
sb.append("]");
}
+ public String wakeLockKey() {
+ if (target.target_provider) {
+ return target.account.name + "/" + target.account.type + ":" + target.provider;
+ } else if (target.target_service) {
+ return target.service.getPackageName() + "/" + target.service.getClassName();
+ } else {
+ Log.wtf(TAG, "Invalid target getting wakelock for operation - " + key);
+ return null;
+ }
+ }
+
+ public String wakeLockName() {
+ if (target.target_provider) {
+ return "/" + target.provider
+ + "/" + target.account.type
+ + "/" + target.account.name;
+ } else if (target.target_service) {
+ return "/" + target.service.getPackageName()
+ + "/" + target.service.getClassName();
+ } else {
+ Log.wtf(TAG, "Invalid target getting wakelock name for operation - " + key);
+ return null;
+ }
+ }
+
/**
* Update the effective run time of this Operation based on latestRunTime (specified at
* creation time of sync), delayUntil (specified by SyncAdapter), or backoff (specified by
@@ -291,4 +368,21 @@ public class SyncOperation implements Comparable {
return 0;
}
}
+
+ // TODO: Test this to make sure that casting to object doesn't lose the type info for EventLog.
+ public Object[] toEventLog(int event) {
+ Object[] logArray = new Object[4];
+ logArray[1] = event;
+ logArray[2] = syncSource;
+ if (target.target_provider) {
+ logArray[0] = target.provider;
+ logArray[3] = target.account.name.hashCode();
+ } else if (target.target_service) {
+ logArray[0] = target.service.getPackageName();
+ logArray[3] = target.service.hashCode();
+ } else {
+ Log.wtf(TAG, "sync op with invalid target: " + key);
+ }
+ return logArray;
+ }
}
diff --git a/services/java/com/android/server/content/SyncQueue.java b/services/java/com/android/server/content/SyncQueue.java
index 6f3fe6e..5d93882 100644
--- a/services/java/com/android/server/content/SyncQueue.java
+++ b/services/java/com/android/server/content/SyncQueue.java
@@ -16,12 +16,11 @@
package com.android.server.content;
-import android.accounts.Account;
import android.content.pm.PackageManager;
-import android.content.pm.RegisteredServicesCache;
import android.content.SyncAdapterType;
import android.content.SyncAdaptersCache;
import android.content.pm.RegisteredServicesCache.ServiceInfo;
+import android.os.Bundle;
import android.os.SystemClock;
import android.text.format.DateUtils;
import android.util.Log;
@@ -60,25 +59,51 @@ public class SyncQueue {
public void addPendingOperations(int userId) {
for (SyncStorageEngine.PendingOperation op : mSyncStorageEngine.getPendingOperations()) {
- if (op.userId != userId) continue;
-
- final Pair<Long, Long> backoff = mSyncStorageEngine.getBackoff(
- op.account, op.userId, op.authority);
- final ServiceInfo<SyncAdapterType> syncAdapterInfo = mSyncAdapters.getServiceInfo(
- SyncAdapterType.newKey(op.authority, op.account.type), op.userId);
- if (syncAdapterInfo == null) {
- Log.w(TAG, "Missing sync adapter info for authority " + op.authority + ", userId "
- + op.userId);
- continue;
+ final SyncStorageEngine.EndPoint info = op.target;
+ if (info.userId != userId) continue;
+
+ final Pair<Long, Long> backoff = mSyncStorageEngine.getBackoff(info);
+ SyncOperation operationToAdd;
+ if (info.target_provider) {
+ final ServiceInfo<SyncAdapterType> syncAdapterInfo = mSyncAdapters.getServiceInfo(
+ SyncAdapterType.newKey(info.provider, info.account.type), info.userId);
+ if (syncAdapterInfo == null) {
+ if (Log.isLoggable(TAG, Log.VERBOSE)) {
+ Log.v(TAG, "Missing sync adapter info for authority " + op.target);
+ }
+ continue;
+ }
+ operationToAdd = new SyncOperation(
+ info.account, info.userId, op.reason, op.syncSource, info.provider,
+ op.extras,
+ 0 /* delay */,
+ 0 /* flex */,
+ backoff != null ? backoff.first : 0,
+ mSyncStorageEngine.getDelayUntilTime(info),
+ syncAdapterInfo.type.allowParallelSyncs());
+ operationToAdd.expedited = op.expedited;
+ operationToAdd.pendingOperation = op;
+ add(operationToAdd, op);
+ } else if (info.target_service) {
+ try {
+ mPackageManager.getServiceInfo(info.service, 0);
+ } catch (PackageManager.NameNotFoundException e) {
+ if (Log.isLoggable(TAG, Log.VERBOSE)) {
+ Log.w(TAG, "Missing sync service for authority " + op.target);
+ }
+ continue;
+ }
+ operationToAdd = new SyncOperation(
+ info.service, info.userId, op.reason, op.syncSource,
+ op.extras,
+ 0 /* delay */,
+ 0 /* flex */,
+ backoff != null ? backoff.first : 0,
+ mSyncStorageEngine.getDelayUntilTime(info));
+ operationToAdd.expedited = op.expedited;
+ operationToAdd.pendingOperation = op;
+ add(operationToAdd, op);
}
- SyncOperation syncOperation = new SyncOperation(
- op.account, op.userId, op.reason, op.syncSource, op.authority, op.extras,
- 0 /* delay */, 0 /* flex */, backoff != null ? backoff.first : 0,
- mSyncStorageEngine.getDelayUntilTime(op.account, op.userId, op.authority),
- syncAdapterInfo.type.allowParallelSyncs());
- syncOperation.expedited = op.expedited;
- syncOperation.pendingOperation = op;
- add(syncOperation, op);
}
}
@@ -119,12 +144,8 @@ public class SyncQueue {
operation.pendingOperation = pop;
// Don't update the PendingOp if one already exists. This really is just a placeholder,
// no actual scheduling info is placed here.
- // TODO: Change this to support service components.
if (operation.pendingOperation == null) {
- pop = new SyncStorageEngine.PendingOperation(
- operation.account, operation.userId, operation.reason, operation.syncSource,
- operation.authority, operation.extras, operation.expedited);
- pop = mSyncStorageEngine.insertIntoPending(pop);
+ pop = mSyncStorageEngine.insertIntoPending(operation);
if (pop == null) {
throw new IllegalStateException("error adding pending sync operation "
+ operation);
@@ -136,17 +157,16 @@ public class SyncQueue {
return true;
}
- public void removeUser(int userId) {
+ public void removeUserLocked(int userId) {
ArrayList<SyncOperation> opsToRemove = new ArrayList<SyncOperation>();
for (SyncOperation op : mOperationsMap.values()) {
- if (op.userId == userId) {
+ if (op.target.userId == userId) {
opsToRemove.add(op);
}
}
-
- for (SyncOperation op : opsToRemove) {
- remove(op);
- }
+ for (SyncOperation op : opsToRemove) {
+ remove(op);
+ }
}
/**
@@ -154,8 +174,15 @@ public class SyncQueue {
* @param operation the operation to remove
*/
public void remove(SyncOperation operation) {
+ boolean isLoggable = Log.isLoggable(TAG, Log.VERBOSE);
SyncOperation operationToRemove = mOperationsMap.remove(operation.key);
+ if (isLoggable) {
+ Log.v(TAG, "Attempting to remove: " + operation.key);
+ }
if (operationToRemove == null) {
+ if (isLoggable) {
+ Log.v(TAG, "Could not find: " + operation.key);
+ }
return;
}
if (!mSyncStorageEngine.deleteFromPending(operationToRemove.pendingOperation)) {
@@ -164,41 +191,58 @@ public class SyncQueue {
}
}
- public void onBackoffChanged(Account account, int userId, String providerName, long backoff) {
- // for each op that matches the account and provider update its
+ /** Reset backoffs for all operations in the queue. */
+ public void clearBackoffs() {
+ for (SyncOperation op : mOperationsMap.values()) {
+ op.backoff = 0L;
+ op.updateEffectiveRunTime();
+ }
+ }
+
+ public void onBackoffChanged(SyncStorageEngine.EndPoint target, long backoff) {
+ // For each op that matches the target of the changed op, update its
// backoff and effectiveStartTime
for (SyncOperation op : mOperationsMap.values()) {
- if (op.account.equals(account) && op.authority.equals(providerName)
- && op.userId == userId) {
+ if (op.target.matchesSpec(target)) {
op.backoff = backoff;
op.updateEffectiveRunTime();
}
}
}
- public void onDelayUntilTimeChanged(Account account, String providerName, long delayUntil) {
- // for each op that matches the account and provider update its
- // delayUntilTime and effectiveStartTime
+ public void onDelayUntilTimeChanged(SyncStorageEngine.EndPoint target, long delayUntil) {
+ // for each op that matches the target info of the provided op, change the delay time.
for (SyncOperation op : mOperationsMap.values()) {
- if (op.account.equals(account) && op.authority.equals(providerName)) {
+ if (op.target.matchesSpec(target)) {
op.delayUntil = delayUntil;
op.updateEffectiveRunTime();
}
}
}
- public void remove(Account account, int userId, String authority) {
+ /**
+ * Remove all of the SyncOperations associated with a given target.
+ *
+ * @param info target object provided here can have null Account/provider. This is the case
+ * where you want to remove all ops associated with a provider (null Account) or all ops
+ * associated with an account (null provider).
+ * @param extras option bundle to include to further specify which operation to remove. If this
+ * bundle contains sync settings flags, they are ignored.
+ */
+ public void remove(final SyncStorageEngine.EndPoint info, Bundle extras) {
Iterator<Map.Entry<String, SyncOperation>> entries = mOperationsMap.entrySet().iterator();
while (entries.hasNext()) {
Map.Entry<String, SyncOperation> entry = entries.next();
SyncOperation syncOperation = entry.getValue();
- if (account != null && !syncOperation.account.equals(account)) {
- continue;
- }
- if (authority != null && !syncOperation.authority.equals(authority)) {
+ final SyncStorageEngine.EndPoint opInfo = syncOperation.target;
+ if (!opInfo.matchesSpec(info)) {
continue;
}
- if (userId != syncOperation.userId) {
+ if (extras != null
+ && !SyncManager.syncExtrasEquals(
+ syncOperation.extras,
+ extras,
+ false /* no config flags*/)) {
continue;
}
entries.remove();
diff --git a/services/java/com/android/server/content/SyncStorageEngine.java b/services/java/com/android/server/content/SyncStorageEngine.java
index 41ef229..e99adc5 100644
--- a/services/java/com/android/server/content/SyncStorageEngine.java
+++ b/services/java/com/android/server/content/SyncStorageEngine.java
@@ -24,6 +24,7 @@ import android.content.Context;
import android.content.ISyncStatusObserver;
import android.content.PeriodicSync;
import android.content.SyncInfo;
+import android.content.SyncRequest;
import android.content.SyncStatusInfo;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
@@ -36,10 +37,12 @@ import android.os.Message;
import android.os.Parcel;
import android.os.RemoteCallbackList;
import android.os.RemoteException;
+import android.os.UserHandle;
import android.util.AtomicFile;
import android.util.Log;
import android.util.Pair;
import android.util.SparseArray;
+import android.util.ArrayMap;
import android.util.Xml;
import com.android.internal.annotations.VisibleForTesting;
@@ -71,7 +74,6 @@ import java.util.TimeZone;
public class SyncStorageEngine extends Handler {
private static final String TAG = "SyncManager";
- private static final boolean DEBUG = false;
private static final String TAG_FILE = "SyncManagerFile";
private static final String XML_ATTR_NEXT_AUTHORITY_ID = "nextAuthorityId";
@@ -108,10 +110,7 @@ public class SyncStorageEngine extends Handler {
/** Enum value for a local-initiated sync. */
public static final int SOURCE_LOCAL = 1;
- /**
- * Enum value for a poll-based sync (e.g., upon connection to
- * network)
- */
+ /** Enum value for a poll-based sync (e.g., upon connection to network) */
public static final int SOURCE_POLL = 2;
/** Enum value for a user-initiated sync. */
@@ -119,6 +118,9 @@ public class SyncStorageEngine extends Handler {
/** Enum value for a periodic sync. */
public static final int SOURCE_PERIODIC = 4;
+
+ /** Enum value for a sync started for a service. */
+ public static final int SOURCE_SERVICE = 5;
public static final long NOT_IN_BACKOFF_MODE = -1;
@@ -128,7 +130,8 @@ public class SyncStorageEngine extends Handler {
"LOCAL",
"POLL",
"USER",
- "PERIODIC" };
+ "PERIODIC",
+ "SERVICE"};
// The MESG column will contain one of these or one of the Error types.
public static final String MESG_SUCCESS = "success";
@@ -156,41 +159,54 @@ public class SyncStorageEngine extends Handler {
}
public static class PendingOperation {
- final Account account;
- final int userId;
+ final EndPoint target;
final int reason;
final int syncSource;
- final String authority;
final Bundle extras; // note: read-only.
- final ComponentName serviceName;
final boolean expedited;
- int authorityId;
+ final int authorityId;
+ // No longer used.
+ // Keep around for sake up updating from pending.bin to pending.xml
byte[] flatExtras;
- PendingOperation(Account account, int userId, int reason, int source,
- String authority, Bundle extras, boolean expedited) {
- this.account = account;
- this.userId = userId;
+ PendingOperation(AuthorityInfo authority, int reason, int source,
+ Bundle extras, boolean expedited) {
+ this.target = authority.target;
this.syncSource = source;
this.reason = reason;
- this.authority = authority;
this.extras = extras != null ? new Bundle(extras) : extras;
this.expedited = expedited;
- this.authorityId = -1;
- this.serviceName = null;
+ this.authorityId = authority.ident;
}
PendingOperation(PendingOperation other) {
- this.account = other.account;
- this.userId = other.userId;
this.reason = other.reason;
this.syncSource = other.syncSource;
- this.authority = other.authority;
+ this.target = other.target;
this.extras = other.extras;
this.authorityId = other.authorityId;
this.expedited = other.expedited;
- this.serviceName = other.serviceName;
+ }
+
+ /**
+ * Considered equal if they target the same sync adapter (A
+ * {@link android.content.SyncService}
+ * is considered an adapter), for the same userId.
+ * @param other PendingOperation to compare.
+ * @return true if the two pending ops are the same.
+ */
+ public boolean equals(PendingOperation other) {
+ return target.matchesSpec(other.target);
+ }
+
+ public String toString() {
+ return "service=" + target.service
+ + " user=" + target.userId
+ + " auth=" + target
+ + " account=" + target.account
+ + " src=" + syncSource
+ + " extras=" + extras;
}
}
@@ -204,17 +220,96 @@ public class SyncStorageEngine extends Handler {
}
}
- public static class AuthorityInfo {
+ /** Bare bones representation of a sync target. */
+ public static class EndPoint {
+ public final static EndPoint USER_ALL_PROVIDER_ALL_ACCOUNTS_ALL =
+ new EndPoint(null, null, UserHandle.USER_ALL);
final ComponentName service;
final Account account;
final int userId;
- final String authority;
+ final String provider;
+ final boolean target_service;
+ final boolean target_provider;
+
+ public EndPoint(ComponentName service, int userId) {
+ this.service = service;
+ this.userId = userId;
+ this.account = null;
+ this.provider = null;
+ this.target_service = true;
+ this.target_provider = false;
+ }
+
+ public EndPoint(Account account, String provider, int userId) {
+ this.account = account;
+ this.provider = provider;
+ this.userId = userId;
+ this.service = null;
+ this.target_service = false;
+ this.target_provider = true;
+ }
+
+ /**
+ * An Endpoint for a sync matches if it targets the same sync adapter for the same user.
+ *
+ * @param spec the Endpoint to match. If the spec has null fields, they indicate a wildcard
+ * and match any.
+ */
+ public boolean matchesSpec(EndPoint spec) {
+ if (userId != spec.userId
+ && userId != UserHandle.USER_ALL
+ && spec.userId != UserHandle.USER_ALL) {
+ return false;
+ }
+ if (target_service && spec.target_service) {
+ return service.equals(spec.service);
+ } else if (target_provider && spec.target_provider) {
+ boolean accountsMatch;
+ if (spec.account == null) {
+ accountsMatch = true;
+ } else {
+ accountsMatch = account.equals(spec.account);
+ }
+ boolean providersMatch;
+ if (spec.provider == null) {
+ providersMatch = true;
+ } else {
+ providersMatch = provider.equals(spec.provider);
+ }
+ return accountsMatch && providersMatch;
+ }
+ return false;
+ }
+
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ if (target_provider) {
+ sb.append(account == null ? "ALL ACCS" : account.name)
+ .append("/")
+ .append(provider == null ? "ALL PDRS" : provider);
+ } else if (target_service) {
+ sb.append(service.getPackageName() + "/")
+ .append(service.getClassName());
+ } else {
+ sb.append("invalid target");
+ }
+ sb.append(":u" + userId);
+ return sb.toString();
+ }
+ }
+
+ public static class AuthorityInfo {
+ final EndPoint target;
final int ident;
boolean enabled;
int syncable;
+ /** Time at which this sync will run, taking into account backoff. */
long backoffTime;
+ /** Amount of delay due to backoff. */
long backoffDelay;
+ /** Time offset to add to any requests coming to this target. */
long delayUntil;
+
final ArrayList<PeriodicSync> periodicSyncs;
/**
@@ -224,10 +319,7 @@ public class SyncStorageEngine extends Handler {
* @param toCopy AuthorityInfo to be copied.
*/
AuthorityInfo(AuthorityInfo toCopy) {
- account = toCopy.account;
- userId = toCopy.userId;
- authority = toCopy.authority;
- service = toCopy.service;
+ target = toCopy.target;
ident = toCopy.ident;
enabled = toCopy.enabled;
syncable = toCopy.syncable;
@@ -241,56 +333,40 @@ public class SyncStorageEngine extends Handler {
}
}
- /**
- * Create an authority with one periodic sync scheduled with an empty bundle and syncing
- * every day. An empty bundle is considered equal to any other bundle see
- * {@link PeriodicSync.syncExtrasEquals}.
- * @param account Account that this authority syncs.
- * @param userId which user this sync is registered for.
- * @param userId user for which this authority is registered.
- * @param ident id of this authority.
- */
- AuthorityInfo(Account account, int userId, String authority, int ident) {
- this.account = account;
- this.userId = userId;
- this.authority = authority;
- this.service = null;
- this.ident = ident;
- enabled = SYNC_ENABLED_DEFAULT;
- syncable = -1; // default to "unknown"
- backoffTime = -1; // if < 0 then we aren't in backoff mode
- backoffDelay = -1; // if < 0 then we aren't in backoff mode
+ AuthorityInfo(EndPoint info, int id) {
+ target = info;
+ ident = id;
+ enabled = info.target_provider ?
+ SYNC_ENABLED_DEFAULT : true;
+ // Service is active by default,
+ if (info.target_service) {
+ this.syncable = 1;
+ }
periodicSyncs = new ArrayList<PeriodicSync>();
- // Old version adds one periodic sync a day.
- periodicSyncs.add(new PeriodicSync(account, authority,
- new Bundle(),
- DEFAULT_POLL_FREQUENCY_SECONDS,
- calculateDefaultFlexTime(DEFAULT_POLL_FREQUENCY_SECONDS)));
+ defaultInitialisation();
}
- /**
- * Create an authority with one periodic sync scheduled with an empty bundle and syncing
- * every day using a sync service.
- * @param cname sync service identifier.
- * @param userId user for which this authority is registered.
- * @param ident id of this authority.
- */
- AuthorityInfo(ComponentName cname, int userId, int ident) {
- this.account = null;
- this.userId = userId;
- this.authority = null;
- this.service = cname;
- this.ident = ident;
- // Sync service is always enabled.
- enabled = true;
+ private void defaultInitialisation() {
syncable = -1; // default to "unknown"
backoffTime = -1; // if < 0 then we aren't in backoff mode
backoffDelay = -1; // if < 0 then we aren't in backoff mode
- periodicSyncs = new ArrayList<PeriodicSync>();
- periodicSyncs.add(new PeriodicSync(account, authority,
- new Bundle(),
- DEFAULT_POLL_FREQUENCY_SECONDS,
- calculateDefaultFlexTime(DEFAULT_POLL_FREQUENCY_SECONDS)));
+ PeriodicSync defaultSync;
+ // Old version is one sync a day. Empty bundle gets replaced by any addPeriodicSync()
+ // call.
+ if (target.target_provider) {
+ defaultSync =
+ new PeriodicSync(target.account, target.provider,
+ new Bundle(),
+ DEFAULT_POLL_FREQUENCY_SECONDS,
+ calculateDefaultFlexTime(DEFAULT_POLL_FREQUENCY_SECONDS));
+ periodicSyncs.add(defaultSync);
+ }
+ }
+
+ @Override
+ public String toString() {
+ return target + ", enabled=" + enabled + ", syncable=" + syncable + ", backoff="
+ + backoffTime + ", delay=" + delayUntil;
}
}
@@ -322,16 +398,9 @@ public class SyncStorageEngine extends Handler {
}
interface OnSyncRequestListener {
- /**
- * Called when a sync is needed on an account(s) due to some change in state.
- * @param account
- * @param userId
- * @param reason
- * @param authority
- * @param extras
- */
- public void onSyncRequest(Account account, int userId, int reason, String authority,
- Bundle extras);
+
+ /** Called when a sync is needed on an account(s) due to some change in state. */
+ public void onSyncRequest(EndPoint info, int reason, Bundle extras);
}
// Primary list of all syncable authorities. Also our global lock.
@@ -356,9 +425,9 @@ public class SyncStorageEngine extends Handler {
private final RemoteCallbackList<ISyncStatusObserver> mChangeListeners
= new RemoteCallbackList<ISyncStatusObserver>();
- /** Reverse mapping for component name -> <userid -> authority id>. */
- private final HashMap<ComponentName, SparseArray<AuthorityInfo>> mServices =
- new HashMap<ComponentName, SparseArray<AuthorityInfo>>();
+ /** Reverse mapping for component name -> <userid -> target id>. */
+ private final ArrayMap<ComponentName, SparseArray<AuthorityInfo>> mServices =
+ new ArrayMap<ComponentName, SparseArray<AuthorityInfo>>();
private int mNextAuthorityId = 0;
@@ -501,7 +570,7 @@ public class SyncStorageEngine extends Handler {
* @return amount of seconds before syncTimeSeconds that the sync can occur.
* I.e.
* earliest_sync_time = syncTimeSeconds - calculateDefaultFlexTime(syncTimeSeconds)
- * The flex time is capped at a percentage of the {@link DEFAULT_POLL_FREQUENCY_SECONDS}.
+ * The flex time is capped at a percentage of the {@link #DEFAULT_POLL_FREQUENCY_SECONDS}.
*/
public static long calculateDefaultFlexTime(long syncTimeSeconds) {
if (syncTimeSeconds < DEFAULT_MIN_FLEX_ALLOWED_SECS) {
@@ -535,7 +604,7 @@ public class SyncStorageEngine extends Handler {
mChangeListeners.finishBroadcast();
}
- if (DEBUG) {
+ if (Log.isLoggable(TAG, Log.VERBOSE)) {
Log.v(TAG, "reportChange " + which + " to: " + reports);
}
@@ -555,7 +624,8 @@ public class SyncStorageEngine extends Handler {
public boolean getSyncAutomatically(Account account, int userId, String providerName) {
synchronized (mAuthorities) {
if (account != null) {
- AuthorityInfo authority = getAuthorityLocked(account, userId, providerName,
+ AuthorityInfo authority = getAuthorityLocked(
+ new EndPoint(account, providerName, userId),
"getSyncAutomatically");
return authority != null && authority.enabled;
}
@@ -563,10 +633,9 @@ public class SyncStorageEngine extends Handler {
int i = mAuthorities.size();
while (i > 0) {
i--;
- AuthorityInfo authority = mAuthorities.valueAt(i);
- if (authority.authority.equals(providerName)
- && authority.userId == userId
- && authority.enabled) {
+ AuthorityInfo authorityInfo = mAuthorities.valueAt(i);
+ if (authorityInfo.target.matchesSpec(new EndPoint(account, providerName, userId))
+ && authorityInfo.enabled) {
return true;
}
}
@@ -576,15 +645,18 @@ public class SyncStorageEngine extends Handler {
public void setSyncAutomatically(Account account, int userId, String providerName,
boolean sync) {
- if (DEBUG) {
+ if (Log.isLoggable(TAG, Log.VERBOSE)) {
Log.d(TAG, "setSyncAutomatically: " + /* account + */" provider " + providerName
+ ", user " + userId + " -> " + sync);
}
synchronized (mAuthorities) {
- AuthorityInfo authority = getOrCreateAuthorityLocked(account, userId, providerName, -1,
- false);
+ AuthorityInfo authority =
+ getOrCreateAuthorityLocked(
+ new EndPoint(account, providerName, userId),
+ -1 /* ident */,
+ false);
if (authority.enabled == sync) {
- if (DEBUG) {
+ if (Log.isLoggable(TAG, Log.VERBOSE)) {
Log.d(TAG, "setSyncAutomatically: already set to " + sync + ", doing nothing");
}
return;
@@ -603,8 +675,9 @@ public class SyncStorageEngine extends Handler {
public int getIsSyncable(Account account, int userId, String providerName) {
synchronized (mAuthorities) {
if (account != null) {
- AuthorityInfo authority = getAuthorityLocked(account, userId, providerName,
- "getIsSyncable");
+ AuthorityInfo authority = getAuthorityLocked(
+ new EndPoint(account, providerName, userId),
+ "get authority syncable");
if (authority == null) {
return -1;
}
@@ -614,9 +687,10 @@ public class SyncStorageEngine extends Handler {
int i = mAuthorities.size();
while (i > 0) {
i--;
- AuthorityInfo authority = mAuthorities.valueAt(i);
- if (authority.authority.equals(providerName)) {
- return authority.syncable;
+ AuthorityInfo authorityInfo = mAuthorities.valueAt(i);
+ if (authorityInfo.target != null
+ && authorityInfo.target.provider.equals(providerName)) {
+ return authorityInfo.syncable;
}
}
return -1;
@@ -624,119 +698,178 @@ public class SyncStorageEngine extends Handler {
}
public void setIsSyncable(Account account, int userId, String providerName, int syncable) {
- if (syncable > 1) {
- syncable = 1;
- } else if (syncable < -1) {
- syncable = -1;
- }
- if (DEBUG) {
- Log.d(TAG, "setIsSyncable: " + account + ", provider " + providerName
- + ", user " + userId + " -> " + syncable);
+ setSyncableStateForEndPoint(new EndPoint(account, providerName, userId), syncable);
+ }
+
+ public boolean getIsTargetServiceActive(ComponentName cname, int userId) {
+ synchronized (mAuthorities) {
+ if (cname != null) {
+ AuthorityInfo authority = getAuthorityLocked(
+ new EndPoint(cname, userId),
+ "get service active");
+ if (authority == null) {
+ return false;
+ }
+ return (authority.syncable == 1);
+ }
+ return false;
}
+ }
+
+ public void setIsTargetServiceActive(ComponentName cname, int userId, boolean active) {
+ setSyncableStateForEndPoint(new EndPoint(cname, userId), active ? 1 : 0);
+ }
+
+ /**
+ * An enabled sync service and a syncable provider's adapter both get resolved to the same
+ * persisted variable - namely the "syncable" attribute for an AuthorityInfo in accounts.xml.
+ * @param target target to set value for.
+ * @param syncable 0 indicates unsyncable, <0 unknown, >0 is active/syncable.
+ */
+ private void setSyncableStateForEndPoint(EndPoint target, int syncable) {
+ AuthorityInfo aInfo;
synchronized (mAuthorities) {
- AuthorityInfo authority =
- getOrCreateAuthorityLocked(account, userId, providerName, -1, false);
- if (authority.syncable == syncable) {
- if (DEBUG) {
+ aInfo = getOrCreateAuthorityLocked(target, -1, false);
+ if (syncable > 1) {
+ syncable = 1;
+ } else if (syncable < -1) {
+ syncable = -1;
+ }
+ if (Log.isLoggable(TAG, Log.VERBOSE)) {
+ Log.d(TAG, "setIsSyncable: " + aInfo.toString() + " -> " + syncable);
+ }
+ if (aInfo.syncable == syncable) {
+ if (Log.isLoggable(TAG, Log.VERBOSE)) {
Log.d(TAG, "setIsSyncable: already set to " + syncable + ", doing nothing");
}
return;
}
- authority.syncable = syncable;
+ aInfo.syncable = syncable;
writeAccountInfoLocked();
}
-
if (syncable > 0) {
- requestSync(account, userId, SyncOperation.REASON_IS_SYNCABLE, providerName,
- new Bundle());
+ requestSync(aInfo, SyncOperation.REASON_IS_SYNCABLE, new Bundle());
}
reportChange(ContentResolver.SYNC_OBSERVER_TYPE_SETTINGS);
}
- public Pair<Long, Long> getBackoff(Account account, int userId, String providerName) {
+ public Pair<Long, Long> getBackoff(EndPoint info) {
synchronized (mAuthorities) {
- AuthorityInfo authority = getAuthorityLocked(account, userId, providerName,
- "getBackoff");
- if (authority == null || authority.backoffTime < 0) {
- return null;
+ AuthorityInfo authority = getAuthorityLocked(info, "getBackoff");
+ if (authority != null) {
+ return Pair.create(authority.backoffTime, authority.backoffDelay);
}
- return Pair.create(authority.backoffTime, authority.backoffDelay);
+ return null;
}
}
- public void setBackoff(Account account, int userId, String providerName,
- long nextSyncTime, long nextDelay) {
- if (DEBUG) {
- Log.v(TAG, "setBackoff: " + account + ", provider " + providerName
- + ", user " + userId
+ /**
+ * Update the backoff for the given endpoint. The endpoint may be for a provider/account and
+ * the account or provider info be null, which signifies all accounts or providers.
+ */
+ public void setBackoff(EndPoint info, long nextSyncTime, long nextDelay) {
+ if (Log.isLoggable(TAG, Log.VERBOSE)) {
+ Log.v(TAG, "setBackoff: " + info
+ " -> nextSyncTime " + nextSyncTime + ", nextDelay " + nextDelay);
}
- boolean changed = false;
+ boolean changed;
synchronized (mAuthorities) {
- if (account == null || providerName == null) {
- for (AccountInfo accountInfo : mAccounts.values()) {
- if (account != null && !account.equals(accountInfo.accountAndUser.account)
- && userId != accountInfo.accountAndUser.userId) {
- continue;
- }
- for (AuthorityInfo authorityInfo : accountInfo.authorities.values()) {
- if (providerName != null
- && !providerName.equals(authorityInfo.authority)) {
- continue;
- }
- if (authorityInfo.backoffTime != nextSyncTime
- || authorityInfo.backoffDelay != nextDelay) {
- authorityInfo.backoffTime = nextSyncTime;
- authorityInfo.backoffDelay = nextDelay;
- changed = true;
- }
- }
- }
+ if (info.target_provider
+ && (info.account == null || info.provider == null)) {
+ // Do more work for a provider sync if the provided info has specified all
+ // accounts/providers.
+ changed = setBackoffLocked(
+ info.account /* may be null */,
+ info.userId,
+ info.provider /* may be null */,
+ nextSyncTime, nextDelay);
} else {
- AuthorityInfo authority =
- getOrCreateAuthorityLocked(account, userId, providerName, -1 /* ident */,
- true);
- if (authority.backoffTime == nextSyncTime && authority.backoffDelay == nextDelay) {
- return;
+ AuthorityInfo authorityInfo =
+ getOrCreateAuthorityLocked(info, -1 /* ident */, true);
+ if (authorityInfo.backoffTime == nextSyncTime
+ && authorityInfo.backoffDelay == nextDelay) {
+ changed = false;
+ } else {
+ authorityInfo.backoffTime = nextSyncTime;
+ authorityInfo.backoffDelay = nextDelay;
+ changed = true;
}
- authority.backoffTime = nextSyncTime;
- authority.backoffDelay = nextDelay;
- changed = true;
}
}
-
if (changed) {
reportChange(ContentResolver.SYNC_OBSERVER_TYPE_SETTINGS);
}
}
/**
- * Callers of this function need to hold a lock for syncQueue object passed in. Bear in mind
- * this function grabs the lock for {@link #mAuthorities}
- * @param syncQueue queue containing pending sync operations.
+ * Either set backoff for a specific authority, or set backoff for all the
+ * accounts on a specific adapter/all adapters.
+ *
+ * @param account account for which to set backoff. Null to specify all accounts.
+ * @param userId id of the user making this request.
+ * @param providerName provider for which to set backoff. Null to specify all providers.
+ * @return true if a change occured.
*/
- public void clearAllBackoffsLocked(SyncQueue syncQueue) {
+ private boolean setBackoffLocked(Account account, int userId, String providerName,
+ long nextSyncTime, long nextDelay) {
+ boolean changed = false;
+ for (AccountInfo accountInfo : mAccounts.values()) {
+ if (account != null && !account.equals(accountInfo.accountAndUser.account)
+ && userId != accountInfo.accountAndUser.userId) {
+ continue;
+ }
+ for (AuthorityInfo authorityInfo : accountInfo.authorities.values()) {
+ if (providerName != null
+ && !providerName.equals(authorityInfo.target.provider)) {
+ continue;
+ }
+ if (authorityInfo.backoffTime != nextSyncTime
+ || authorityInfo.backoffDelay != nextDelay) {
+ authorityInfo.backoffTime = nextSyncTime;
+ authorityInfo.backoffDelay = nextDelay;
+ changed = true;
+ }
+ }
+ }
+ return changed;
+ }
+
+ public void clearAllBackoffs(SyncQueue syncQueue) {
boolean changed = false;
synchronized (mAuthorities) {
- for (AccountInfo accountInfo : mAccounts.values()) {
- for (AuthorityInfo authorityInfo : accountInfo.authorities.values()) {
- if (authorityInfo.backoffTime != NOT_IN_BACKOFF_MODE
- || authorityInfo.backoffDelay != NOT_IN_BACKOFF_MODE) {
- if (DEBUG) {
- Log.v(TAG, "clearAllBackoffs:"
- + " authority:" + authorityInfo.authority
- + " account:" + accountInfo.accountAndUser.account.name
- + " user:" + accountInfo.accountAndUser.userId
- + " backoffTime was: " + authorityInfo.backoffTime
- + " backoffDelay was: " + authorityInfo.backoffDelay);
+ synchronized (syncQueue) {
+ // Clear backoff for all sync adapters.
+ for (AccountInfo accountInfo : mAccounts.values()) {
+ for (AuthorityInfo authorityInfo : accountInfo.authorities.values()) {
+ if (authorityInfo.backoffTime != NOT_IN_BACKOFF_MODE
+ || authorityInfo.backoffDelay != NOT_IN_BACKOFF_MODE) {
+ if (Log.isLoggable(TAG, Log.VERBOSE)) {
+ Log.v(TAG, "clearAllBackoffs:"
+ + " authority:" + authorityInfo.target
+ + " account:" + accountInfo.accountAndUser.account.name
+ + " user:" + accountInfo.accountAndUser.userId
+ + " backoffTime was: " + authorityInfo.backoffTime
+ + " backoffDelay was: " + authorityInfo.backoffDelay);
+ }
+ authorityInfo.backoffTime = NOT_IN_BACKOFF_MODE;
+ authorityInfo.backoffDelay = NOT_IN_BACKOFF_MODE;
+ changed = true;
}
- authorityInfo.backoffTime = NOT_IN_BACKOFF_MODE;
- authorityInfo.backoffDelay = NOT_IN_BACKOFF_MODE;
- syncQueue.onBackoffChanged(accountInfo.accountAndUser.account,
- accountInfo.accountAndUser.userId, authorityInfo.authority, 0);
- changed = true;
}
}
+ // Clear backoff for all sync services.
+ for (ComponentName service : mServices.keySet()) {
+ SparseArray<AuthorityInfo> aInfos = mServices.get(service);
+ for (int i = 0; i < aInfos.size(); i++) {
+ AuthorityInfo authorityInfo = aInfos.valueAt(i);
+ if (authorityInfo.backoffTime != NOT_IN_BACKOFF_MODE
+ || authorityInfo.backoffDelay != NOT_IN_BACKOFF_MODE) {
+ authorityInfo.backoffTime = NOT_IN_BACKOFF_MODE;
+ authorityInfo.backoffDelay = NOT_IN_BACKOFF_MODE;
+ }
+ }
+ }
+ syncQueue.clearBackoffs();
}
}
@@ -745,142 +878,157 @@ public class SyncStorageEngine extends Handler {
}
}
- public void setDelayUntilTime(Account account, int userId, String providerName,
- long delayUntil) {
- if (DEBUG) {
- Log.v(TAG, "setDelayUntil: " + account + ", provider " + providerName
- + ", user " + userId + " -> delayUntil " + delayUntil);
- }
+ public long getDelayUntilTime(EndPoint info) {
synchronized (mAuthorities) {
- AuthorityInfo authority = getOrCreateAuthorityLocked(
- account, userId, providerName, -1 /* ident */, true);
- if (authority.delayUntil == delayUntil) {
- return;
+ AuthorityInfo authority = getAuthorityLocked(info, "getDelayUntil");
+ if (authority == null) {
+ return 0;
}
- authority.delayUntil = delayUntil;
+ return authority.delayUntil;
}
-
- reportChange(ContentResolver.SYNC_OBSERVER_TYPE_SETTINGS);
}
- public long getDelayUntilTime(Account account, int userId, String providerName) {
+ public void setDelayUntilTime(EndPoint info, long delayUntil) {
+ if (Log.isLoggable(TAG, Log.VERBOSE)) {
+ Log.v(TAG, "setDelayUntil: " + info
+ + " -> delayUntil " + delayUntil);
+ }
synchronized (mAuthorities) {
- AuthorityInfo authority = getAuthorityLocked(account, userId, providerName,
- "getDelayUntil");
- if (authority == null) {
- return 0;
+ AuthorityInfo authority = getOrCreateAuthorityLocked(info, -1, true);
+ if (authority.delayUntil == delayUntil) {
+ return;
}
- return authority.delayUntil;
+ authority.delayUntil = delayUntil;
}
+ reportChange(ContentResolver.SYNC_OBSERVER_TYPE_SETTINGS);
}
- private void updateOrRemovePeriodicSync(PeriodicSync toUpdate, int userId, boolean add) {
- if (DEBUG) {
- Log.v(TAG, "addOrRemovePeriodicSync: " + toUpdate.account + ", user " + userId
- + ", provider " + toUpdate.authority
- + " -> period " + toUpdate.period + ", extras " + toUpdate.extras);
+ public void updateOrAddPeriodicSync(EndPoint info, long period, long flextime, Bundle extras) {
+ if (Log.isLoggable(TAG, Log.VERBOSE)) {
+ Log.v(TAG, "addPeriodicSync: " + info
+ + " -> period " + period + ", flex " + flextime + ", extras "
+ + extras.toString());
}
synchronized (mAuthorities) {
- if (toUpdate.period <= 0 && add) {
- Log.e(TAG, "period < 0, should never happen in updateOrRemovePeriodicSync: add-"
- + add);
+ if (period <= 0) {
+ Log.e(TAG, "period < 0, should never happen in updateOrAddPeriodicSync");
}
- if (toUpdate.extras == null) {
- Log.e(TAG, "null extras, should never happen in updateOrRemovePeriodicSync: add-"
- + add);
+ if (extras == null) {
+ Log.e(TAG, "null extras, should never happen in updateOrAddPeriodicSync:");
}
try {
+ PeriodicSync toUpdate;
+ if (info.target_provider) {
+ toUpdate = new PeriodicSync(info.account,
+ info.provider,
+ extras,
+ period,
+ flextime);
+ } else {
+ toUpdate = new PeriodicSync(info.service,
+ extras,
+ period,
+ flextime);
+ }
AuthorityInfo authority =
- getOrCreateAuthorityLocked(toUpdate.account, userId, toUpdate.authority,
- -1, false);
- if (add) {
- // add this periodic sync if an equivalent periodic doesn't already exist.
- boolean alreadyPresent = false;
- for (int i = 0, N = authority.periodicSyncs.size(); i < N; i++) {
- PeriodicSync syncInfo = authority.periodicSyncs.get(i);
- if (PeriodicSync.syncExtrasEquals(
- toUpdate.extras,
- syncInfo.extras)) {
- if (toUpdate.period == syncInfo.period &&
- toUpdate.flexTime == syncInfo.flexTime) {
- // Absolutely the same.
- return;
- }
- authority.periodicSyncs.set(i, new PeriodicSync(toUpdate));
- alreadyPresent = true;
- break;
+ getOrCreateAuthorityLocked(info, -1, false);
+ // add this periodic sync if an equivalent periodic doesn't already exist.
+ boolean alreadyPresent = false;
+ for (int i = 0, N = authority.periodicSyncs.size(); i < N; i++) {
+ PeriodicSync syncInfo = authority.periodicSyncs.get(i);
+ if (SyncManager.syncExtrasEquals(syncInfo.extras,
+ extras,
+ true /* includeSyncSettings*/)) {
+ if (period == syncInfo.period &&
+ flextime == syncInfo.flexTime) {
+ // Absolutely the same.
+ return;
}
+ authority.periodicSyncs.set(i, toUpdate);
+ alreadyPresent = true;
+ break;
}
- // If we added an entry to the periodicSyncs array also add an entry to
- // the periodic syncs status to correspond to it.
- if (!alreadyPresent) {
- authority.periodicSyncs.add(new PeriodicSync(toUpdate));
- SyncStatusInfo status = getOrCreateSyncStatusLocked(authority.ident);
- status.setPeriodicSyncTime(authority.periodicSyncs.size() - 1, 0L);
- }
- } else {
- // Remove any periodic syncs that match the authority and extras.
- SyncStatusInfo status = mSyncStatus.get(authority.ident);
- boolean changed = false;
- Iterator<PeriodicSync> iterator = authority.periodicSyncs.iterator();
- int i = 0;
- while (iterator.hasNext()) {
- PeriodicSync syncInfo = iterator.next();
- if (PeriodicSync.syncExtrasEquals(syncInfo.extras, toUpdate.extras)) {
- iterator.remove();
- changed = true;
- // If we removed an entry from the periodicSyncs array also
- // remove the corresponding entry from the status
- if (status != null) {
- status.removePeriodicSyncTime(i);
- } else {
- Log.e(TAG, "Tried removing sync status on remove periodic sync but"
- + "did not find it.");
- }
+ }
+ // If we added an entry to the periodicSyncs array also add an entry to
+ // the periodic syncs status to correspond to it.
+ if (!alreadyPresent) {
+ authority.periodicSyncs.add(toUpdate);
+ SyncStatusInfo status = getOrCreateSyncStatusLocked(authority.ident);
+ // A new periodic sync is initialised as already having been run.
+ status.setPeriodicSyncTime(
+ authority.periodicSyncs.size() - 1,
+ System.currentTimeMillis());
+ }
+ } finally {
+ writeAccountInfoLocked();
+ writeStatusLocked();
+ }
+ }
+ reportChange(ContentResolver.SYNC_OBSERVER_TYPE_SETTINGS);
+ }
+
+ public void removePeriodicSync(EndPoint info, Bundle extras) {
+ synchronized(mAuthorities) {
+ try {
+ AuthorityInfo authority =
+ getOrCreateAuthorityLocked(info, -1, false);
+ // Remove any periodic syncs that match the target and extras.
+ SyncStatusInfo status = mSyncStatus.get(authority.ident);
+ boolean changed = false;
+ Iterator<PeriodicSync> iterator = authority.periodicSyncs.iterator();
+ int i = 0;
+ while (iterator.hasNext()) {
+ PeriodicSync syncInfo = iterator.next();
+ if (SyncManager.syncExtrasEquals(syncInfo.extras,
+ extras,
+ true /* includeSyncSettings */)) {
+ iterator.remove();
+ changed = true;
+ // If we removed an entry from the periodicSyncs array also
+ // remove the corresponding entry from the status
+ if (status != null) {
+ status.removePeriodicSyncTime(i);
} else {
- i++;
+ Log.e(TAG, "Tried removing sync status on remove periodic sync but"
+ + " did not find it.");
}
+ } else {
+ i++;
}
- if (!changed) {
- return;
- }
+ }
+ if (!changed) {
+ return;
}
} finally {
writeAccountInfoLocked();
writeStatusLocked();
}
}
-
reportChange(ContentResolver.SYNC_OBSERVER_TYPE_SETTINGS);
}
- public void addPeriodicSync(PeriodicSync toAdd, int userId) {
- updateOrRemovePeriodicSync(toAdd, userId, true /* add */);
- }
-
- public void removePeriodicSync(PeriodicSync toRemove, int userId) {
- updateOrRemovePeriodicSync(toRemove, userId, false /* remove */);
- }
-
- public List<PeriodicSync> getPeriodicSyncs(Account account, int userId, String providerName) {
- ArrayList<PeriodicSync> syncs = new ArrayList<PeriodicSync>();
+ /**
+ * @return list of periodic syncs for a target. Never null. If no such syncs exist, returns an
+ * empty list.
+ */
+ public List<PeriodicSync> getPeriodicSyncs(EndPoint info) {
synchronized (mAuthorities) {
- AuthorityInfo authority = getAuthorityLocked(account, userId, providerName,
- "getPeriodicSyncs");
- if (authority != null) {
- for (PeriodicSync item : authority.periodicSyncs) {
+ AuthorityInfo authorityInfo = getAuthorityLocked(info, "getPeriodicSyncs");
+ ArrayList<PeriodicSync> syncs = new ArrayList<PeriodicSync>();
+ if (authorityInfo != null) {
+ for (PeriodicSync item : authorityInfo.periodicSyncs) {
// Copy and send out. Necessary for thread-safety although it's parceled.
syncs.add(new PeriodicSync(item));
}
}
+ return syncs;
}
- return syncs;
}
public void setMasterSyncAutomatically(boolean flag, int userId) {
synchronized (mAuthorities) {
Boolean auto = mMasterSyncAutomatically.get(userId);
- if (auto != null && (boolean) auto == flag) {
+ if (auto != null && auto.equals(flag)) {
return;
}
mMasterSyncAutomatically.put(userId, flag);
@@ -901,12 +1049,6 @@ public class SyncStorageEngine extends Handler {
}
}
- public void removeAuthority(Account account, int userId, String authority) {
- synchronized (mAuthorities) {
- removeAuthorityLocked(account, userId, authority, true /* doWrite */);
- }
- }
-
public AuthorityInfo getAuthority(int authorityId) {
synchronized (mAuthorities) {
return mAuthorities.get(authorityId);
@@ -914,72 +1056,60 @@ public class SyncStorageEngine extends Handler {
}
/**
- * Returns true if there is currently a sync operation for the given
- * account or authority actively being processed.
+ * Returns true if there is currently a sync operation being actively processed for the given
+ * target.
*/
- public boolean isSyncActive(Account account, int userId, String authority) {
+ public boolean isSyncActive(EndPoint info) {
synchronized (mAuthorities) {
- for (SyncInfo syncInfo : getCurrentSyncs(userId)) {
+ for (SyncInfo syncInfo : getCurrentSyncs(info.userId)) {
AuthorityInfo ainfo = getAuthority(syncInfo.authorityId);
- if (ainfo != null && ainfo.account.equals(account)
- && ainfo.authority.equals(authority)
- && ainfo.userId == userId) {
+ if (ainfo != null && ainfo.target.matchesSpec(info)) {
return true;
}
}
}
-
return false;
}
- public PendingOperation insertIntoPending(PendingOperation op) {
+ public PendingOperation insertIntoPending(SyncOperation op) {
+ PendingOperation pop;
synchronized (mAuthorities) {
- if (DEBUG) {
- Log.v(TAG, "insertIntoPending: account=" + op.account
- + " user=" + op.userId
- + " auth=" + op.authority
- + " src=" + op.syncSource
+ if (Log.isLoggable(TAG, Log.VERBOSE)) {
+ Log.v(TAG, "insertIntoPending: authority=" + op.target
+ " extras=" + op.extras);
}
-
- AuthorityInfo authority = getOrCreateAuthorityLocked(op.account, op.userId,
- op.authority,
- -1 /* desired identifier */,
- true /* write accounts to storage */);
+ final EndPoint info = op.target;
+ AuthorityInfo authority =
+ getOrCreateAuthorityLocked(info,
+ -1 /* desired identifier */,
+ true /* write accounts to storage */);
if (authority == null) {
return null;
}
- op = new PendingOperation(op);
- op.authorityId = authority.ident;
- mPendingOperations.add(op);
- appendPendingOperationLocked(op);
+ pop = new PendingOperation(authority, op.reason, op.syncSource, op.extras,
+ op.expedited);
+ mPendingOperations.add(pop);
+ appendPendingOperationLocked(pop);
SyncStatusInfo status = getOrCreateSyncStatusLocked(authority.ident);
status.pending = true;
}
-
reportChange(ContentResolver.SYNC_OBSERVER_TYPE_PENDING);
- return op;
+ return pop;
}
/**
* Remove from list of pending operations. If successful, search through list for matching
- * authorities. If there are no more pending syncs for the same authority/account/userid,
- * update the SyncStatusInfo for that authority(authority here is the internal representation
- * of a 'sync operation'.
- * @param op
- * @return
+ * authorities. If there are no more pending syncs for the same target,
+ * update the SyncStatusInfo for that target.
+ * @param op Pending op to delete.
*/
public boolean deleteFromPending(PendingOperation op) {
boolean res = false;
synchronized (mAuthorities) {
- if (DEBUG) {
- Log.v(TAG, "deleteFromPending: account=" + op.account
- + " user=" + op.userId
- + " auth=" + op.authority
- + " src=" + op.syncSource
- + " extras=" + op.extras);
+ if (Log.isLoggable(TAG, Log.VERBOSE)) {
+ Log.v(TAG, "deleteFromPending: account=" + op.toString());
}
if (mPendingOperations.remove(op)) {
if (mPendingOperations.size() == 0
@@ -989,30 +1119,27 @@ public class SyncStorageEngine extends Handler {
} else {
mNumPendingFinished++;
}
-
- AuthorityInfo authority = getAuthorityLocked(op.account, op.userId, op.authority,
- "deleteFromPending");
+ AuthorityInfo authority = getAuthorityLocked(op.target, "deleteFromPending");
if (authority != null) {
- if (DEBUG) Log.v(TAG, "removing - " + authority.toString());
+ if (Log.isLoggable(TAG, Log.VERBOSE)) {
+ Log.v(TAG, "removing - " + authority.toString());
+ }
final int N = mPendingOperations.size();
boolean morePending = false;
- for (int i=0; i<N; i++) {
+ for (int i = 0; i < N; i++) {
PendingOperation cur = mPendingOperations.get(i);
- if (cur.account.equals(op.account)
- && cur.authority.equals(op.authority)
- && cur.userId == op.userId) {
+ if (cur.equals(op)) {
morePending = true;
break;
}
}
if (!morePending) {
- if (DEBUG) Log.v(TAG, "no more pending!");
+ if (Log.isLoggable(TAG, Log.VERBOSE)) Log.v(TAG, "no more pending!");
SyncStatusInfo status = getOrCreateSyncStatusLocked(authority.ident);
status.pending = false;
}
}
-
res = true;
}
}
@@ -1047,7 +1174,9 @@ public class SyncStorageEngine extends Handler {
*/
public void doDatabaseCleanup(Account[] accounts, int userId) {
synchronized (mAuthorities) {
- if (DEBUG) Log.v(TAG, "Updating for new accounts...");
+ if (Log.isLoggable(TAG, Log.VERBOSE)) {
+ Log.v(TAG, "Updating for new accounts...");
+ }
SparseArray<AuthorityInfo> removing = new SparseArray<AuthorityInfo>();
Iterator<AccountInfo> accIt = mAccounts.values().iterator();
while (accIt.hasNext()) {
@@ -1055,7 +1184,7 @@ public class SyncStorageEngine extends Handler {
if (!ArrayUtils.contains(accounts, acc.accountAndUser.account)
&& acc.accountAndUser.userId == userId) {
// This account no longer exists...
- if (DEBUG) {
+ if (Log.isLoggable(TAG, Log.VERBOSE)) {
Log.v(TAG, "Account removed: " + acc.accountAndUser);
}
for (AuthorityInfo auth : acc.authorities.values()) {
@@ -1102,25 +1231,25 @@ public class SyncStorageEngine extends Handler {
public SyncInfo addActiveSync(SyncManager.ActiveSyncContext activeSyncContext) {
final SyncInfo syncInfo;
synchronized (mAuthorities) {
- if (DEBUG) {
+ if (Log.isLoggable(TAG, Log.VERBOSE)) {
Log.v(TAG, "setActiveSync: account="
- + activeSyncContext.mSyncOperation.account
- + " auth=" + activeSyncContext.mSyncOperation.authority
+ + " auth=" + activeSyncContext.mSyncOperation.target
+ " src=" + activeSyncContext.mSyncOperation.syncSource
+ " extras=" + activeSyncContext.mSyncOperation.extras);
}
- AuthorityInfo authority = getOrCreateAuthorityLocked(
- activeSyncContext.mSyncOperation.account,
- activeSyncContext.mSyncOperation.userId,
- activeSyncContext.mSyncOperation.authority,
- -1 /* assign a new identifier if creating a new authority */,
+ final EndPoint info = activeSyncContext.mSyncOperation.target;
+ AuthorityInfo authorityInfo = getOrCreateAuthorityLocked(
+ info,
+ -1 /* assign a new identifier if creating a new target */,
true /* write to storage if this results in a change */);
- syncInfo = new SyncInfo(authority.ident,
- authority.account, authority.authority,
+ syncInfo = new SyncInfo(
+ authorityInfo.ident,
+ authorityInfo.target.account,
+ authorityInfo.target.provider,
+ authorityInfo.target.service,
activeSyncContext.mStartTime);
- getCurrentSyncs(authority.userId).add(syncInfo);
+ getCurrentSyncs(authorityInfo.target.userId).add(syncInfo);
}
-
reportActiveChange();
return syncInfo;
}
@@ -1130,10 +1259,11 @@ public class SyncStorageEngine extends Handler {
*/
public void removeActiveSync(SyncInfo syncInfo, int userId) {
synchronized (mAuthorities) {
- if (DEBUG) {
+ if (Log.isLoggable(TAG, Log.VERBOSE)) {
Log.v(TAG, "removeActiveSync: account=" + syncInfo.account
+ " user=" + userId
- + " auth=" + syncInfo.authority);
+ + " auth=" + syncInfo.authority
+ + " service=" + syncInfo.service);
}
getCurrentSyncs(userId).remove(syncInfo);
}
@@ -1149,37 +1279,34 @@ public class SyncStorageEngine extends Handler {
}
/**
- * Note that sync has started for the given account and authority.
+ * Note that sync has started for the given operation.
*/
- public long insertStartSyncEvent(Account accountName, int userId, int reason,
- String authorityName, long now, int source, boolean initialization, Bundle extras) {
+ public long insertStartSyncEvent(SyncOperation op, long now) {
long id;
synchronized (mAuthorities) {
- if (DEBUG) {
- Log.v(TAG, "insertStartSyncEvent: account=" + accountName + "user=" + userId
- + " auth=" + authorityName + " source=" + source);
+ if (Log.isLoggable(TAG, Log.VERBOSE)) {
+ Log.v(TAG, "insertStartSyncEvent: " + op);
}
- AuthorityInfo authority = getAuthorityLocked(accountName, userId, authorityName,
- "insertStartSyncEvent");
+ AuthorityInfo authority = getAuthorityLocked(op.target, "insertStartSyncEvent");
if (authority == null) {
return -1;
}
SyncHistoryItem item = new SyncHistoryItem();
- item.initialization = initialization;
+ item.initialization = op.isInitialization();
item.authorityId = authority.ident;
item.historyId = mNextHistoryId++;
if (mNextHistoryId < 0) mNextHistoryId = 0;
item.eventTime = now;
- item.source = source;
- item.reason = reason;
- item.extras = extras;
+ item.source = op.syncSource;
+ item.reason = op.reason;
+ item.extras = op.extras;
item.event = EVENT_START;
mSyncHistory.add(0, item);
while (mSyncHistory.size() > MAX_HISTORY) {
mSyncHistory.remove(mSyncHistory.size()-1);
}
id = item.historyId;
- if (DEBUG) Log.v(TAG, "returning historyId " + id);
+ if (Log.isLoggable(TAG, Log.VERBOSE)) Log.v(TAG, "returning historyId " + id);
}
reportChange(ContentResolver.SYNC_OBSERVER_TYPE_STATUS);
@@ -1189,7 +1316,7 @@ public class SyncStorageEngine extends Handler {
public void stopSyncEvent(long historyId, long elapsedTime, String resultMessage,
long downstreamActivity, long upstreamActivity) {
synchronized (mAuthorities) {
- if (DEBUG) {
+ if (Log.isLoggable(TAG, Log.VERBOSE)) {
Log.v(TAG, "stopSyncEvent: historyId=" + historyId);
}
SyncHistoryItem item = null;
@@ -1326,13 +1453,12 @@ public class SyncStorageEngine extends Handler {
}
/**
- * Return a copy of the specified authority with the corresponding sync status
+ * Return a copy of the specified target with the corresponding sync status
*/
- public Pair<AuthorityInfo, SyncStatusInfo> getCopyOfAuthorityWithSyncStatus(
- Account account, int userId, String authority) {
+ public Pair<AuthorityInfo, SyncStatusInfo> getCopyOfAuthorityWithSyncStatus(EndPoint info) {
synchronized (mAuthorities) {
- AuthorityInfo authorityInfo = getOrCreateAuthorityLocked(account, userId, authority,
- -1 /* assign a new identifier if creating a new authority */,
+ AuthorityInfo authorityInfo = getOrCreateAuthorityLocked(info,
+ -1 /* assign a new identifier if creating a new target */,
true /* write to storage if this results in a change */);
return createCopyPairOfAuthorityWithSyncStatusLocked(authorityInfo);
}
@@ -1353,26 +1479,24 @@ public class SyncStorageEngine extends Handler {
}
/**
- * Returns the status that matches the authority and account.
+ * Returns the status that matches the target.
*
- * @param account the account we want to check
- * @param authority the authority whose row should be selected
- * @return the SyncStatusInfo for the authority or null if none found.
+ * @param info the endpoint target we are querying status info for.
+ * @return the SyncStatusInfo for the endpoint.
*/
- public SyncStatusInfo getStatusByAccountAndAuthority(Account account, int userId,
- String authority) {
- if (account == null || authority == null) {
- return null;
+ public SyncStatusInfo getStatusByAuthority(EndPoint info) {
+ if (info.target_provider && (info.account == null || info.provider == null)) {
+ return null;
+ } else if (info.target_service && info.service == null) {
+ return null;
}
synchronized (mAuthorities) {
final int N = mSyncStatus.size();
- for (int i=0; i<N; i++) {
+ for (int i = 0; i < N; i++) {
SyncStatusInfo cur = mSyncStatus.valueAt(i);
AuthorityInfo ainfo = mAuthorities.get(cur.authorityId);
-
- if (ainfo != null && ainfo.authority.equals(authority)
- && ainfo.userId == userId
- && account.equals(ainfo.account)) {
+ if (ainfo != null
+ && ainfo.target.matchesSpec(info)) {
return cur;
}
}
@@ -1380,25 +1504,20 @@ public class SyncStorageEngine extends Handler {
}
}
- /**
- * Return true if the pending status is true of any matching authorities.
- */
- public boolean isSyncPending(Account account, int userId, String authority) {
+ /** Return true if the pending status is true of any matching authorities. */
+ public boolean isSyncPending(EndPoint info) {
synchronized (mAuthorities) {
final int N = mSyncStatus.size();
- for (int i=0; i<N; i++) {
+ for (int i = 0; i < N; i++) {
SyncStatusInfo cur = mSyncStatus.valueAt(i);
AuthorityInfo ainfo = mAuthorities.get(cur.authorityId);
if (ainfo == null) {
continue;
}
- if (userId != ainfo.userId) {
+ if (!ainfo.target.matchesSpec(info)) {
continue;
}
- if (account != null && !ainfo.account.equals(account)) {
- continue;
- }
- if (ainfo.authority.equals(authority) && cur.pending) {
+ if (cur.pending) {
return true;
}
}
@@ -1454,128 +1573,133 @@ public class SyncStorageEngine extends Handler {
}
/**
- * Retrieve an authority, returning null if one does not exist.
+ * Retrieve a target's full info, returning null if one does not exist.
*
- * @param accountName The name of the account for the authority.
- * @param authorityName The name of the authority itself.
+ * @param info info of the target to look up.
* @param tag If non-null, this will be used in a log message if the
- * requested authority does not exist.
+ * requested target does not exist.
*/
- private AuthorityInfo getAuthorityLocked(Account accountName, int userId, String authorityName,
- String tag) {
- AccountAndUser au = new AccountAndUser(accountName, userId);
- AccountInfo accountInfo = mAccounts.get(au);
- if (accountInfo == null) {
- if (tag != null) {
- if (DEBUG) {
- Log.v(TAG, tag + ": unknown account " + au);
+ private AuthorityInfo getAuthorityLocked(EndPoint info, String tag) {
+ if (info.target_service) {
+ SparseArray<AuthorityInfo> aInfo = mServices.get(info.service);
+ AuthorityInfo authority = null;
+ if (aInfo != null) {
+ authority = aInfo.get(info.userId);
+ }
+ if (authority == null) {
+ if (tag != null) {
+ if (Log.isLoggable(TAG, Log.VERBOSE)) {
+ Log.v(TAG, tag + " No authority info found for " + info.service + " for"
+ + " user " + info.userId);
+ }
}
+ return null;
}
- return null;
- }
- AuthorityInfo authority = accountInfo.authorities.get(authorityName);
- if (authority == null) {
- if (tag != null) {
- if (DEBUG) {
- Log.v(TAG, tag + ": unknown authority " + authorityName);
+ return authority;
+ } else if (info.target_provider){
+ AccountAndUser au = new AccountAndUser(info.account, info.userId);
+ AccountInfo accountInfo = mAccounts.get(au);
+ if (accountInfo == null) {
+ if (tag != null) {
+ if (Log.isLoggable(TAG, Log.VERBOSE)) {
+ Log.v(TAG, tag + ": unknown account " + au);
+ }
}
+ return null;
}
- return null;
- }
-
- return authority;
- }
-
- /**
- * Retrieve an authority, returning null if one does not exist.
- *
- * @param service The service name used for this sync.
- * @param userId The user for whom this sync is scheduled.
- * @param tag If non-null, this will be used in a log message if the
- * requested authority does not exist.
- */
- private AuthorityInfo getAuthorityLocked(ComponentName service, int userId, String tag) {
- AuthorityInfo authority = mServices.get(service).get(userId);
- if (authority == null) {
- if (tag != null) {
- if (DEBUG) {
- Log.v(TAG, tag + " No authority info found for " + service + " for user "
- + userId);
+ AuthorityInfo authority = accountInfo.authorities.get(info.provider);
+ if (authority == null) {
+ if (tag != null) {
+ if (Log.isLoggable(TAG, Log.VERBOSE)) {
+ Log.v(TAG, tag + ": unknown provider " + info.provider);
+ }
}
+ return null;
}
+ return authority;
+ } else {
+ Log.e(TAG, tag + " Authority : " + info + ", invalid target");
return null;
}
- return authority;
}
/**
- * @param cname identifier for the service.
- * @param userId for the syncs corresponding to this authority.
- * @param ident unique identifier for authority. -1 for none.
+ * @param info info identifying target.
+ * @param ident unique identifier for target. -1 for none.
* @param doWrite if true, update the accounts.xml file on the disk.
- * @return the authority that corresponds to the provided sync service, creating it if none
+ * @return the authority that corresponds to the provided sync target, creating it if none
* exists.
*/
- private AuthorityInfo getOrCreateAuthorityLocked(ComponentName cname, int userId, int ident,
- boolean doWrite) {
- SparseArray<AuthorityInfo> aInfo = mServices.get(cname);
- if (aInfo == null) {
- aInfo = new SparseArray<AuthorityInfo>();
- mServices.put(cname, aInfo);
- }
- AuthorityInfo authority = aInfo.get(userId);
- if (authority == null) {
- if (ident < 0) {
- ident = mNextAuthorityId;
- mNextAuthorityId++;
- doWrite = true;
- }
- if (DEBUG) {
- Log.v(TAG, "created a new AuthorityInfo for " + cname.getPackageName()
- + ", " + cname.getClassName()
- + ", user: " + userId);
- }
- authority = new AuthorityInfo(cname, userId, ident);
- aInfo.put(userId, authority);
- mAuthorities.put(ident, authority);
- if (doWrite) {
- writeAccountInfoLocked();
+ private AuthorityInfo getOrCreateAuthorityLocked(EndPoint info, int ident, boolean doWrite) {
+ AuthorityInfo authority = null;
+ if (info.target_service) {
+ SparseArray<AuthorityInfo> aInfo = mServices.get(info.service);
+ if (aInfo == null) {
+ aInfo = new SparseArray<AuthorityInfo>();
+ mServices.put(info.service, aInfo);
+ }
+ authority = aInfo.get(info.userId);
+ if (authority == null) {
+ authority = createAuthorityLocked(info, ident, doWrite);
+ aInfo.put(info.userId, authority);
+ }
+ } else if (info.target_provider) {
+ AccountAndUser au = new AccountAndUser(info.account, info.userId);
+ AccountInfo account = mAccounts.get(au);
+ if (account == null) {
+ account = new AccountInfo(au);
+ mAccounts.put(au, account);
+ }
+ authority = account.authorities.get(info.provider);
+ if (authority == null) {
+ authority = createAuthorityLocked(info, ident, doWrite);
+ account.authorities.put(info.provider, authority);
}
}
return authority;
}
- private AuthorityInfo getOrCreateAuthorityLocked(Account accountName, int userId,
- String authorityName, int ident, boolean doWrite) {
- AccountAndUser au = new AccountAndUser(accountName, userId);
- AccountInfo account = mAccounts.get(au);
- if (account == null) {
- account = new AccountInfo(au);
- mAccounts.put(au, account);
- }
- AuthorityInfo authority = account.authorities.get(authorityName);
- if (authority == null) {
- if (ident < 0) {
- ident = mNextAuthorityId;
- mNextAuthorityId++;
- doWrite = true;
- }
- if (DEBUG) {
- Log.v(TAG, "created a new AuthorityInfo for " + accountName
- + ", user " + userId
- + ", provider " + authorityName);
- }
- authority = new AuthorityInfo(accountName, userId, authorityName, ident);
- account.authorities.put(authorityName, authority);
- mAuthorities.put(ident, authority);
- if (doWrite) {
- writeAccountInfoLocked();
- }
+ private AuthorityInfo createAuthorityLocked(EndPoint info, int ident, boolean doWrite) {
+ AuthorityInfo authority;
+ if (ident < 0) {
+ ident = mNextAuthorityId;
+ mNextAuthorityId++;
+ doWrite = true;
+ }
+ if (Log.isLoggable(TAG, Log.VERBOSE)) {
+ Log.v(TAG, "created a new AuthorityInfo for " + info);
+ }
+ authority = new AuthorityInfo(info, ident);
+ mAuthorities.put(ident, authority);
+ if (doWrite) {
+ writeAccountInfoLocked();
}
-
return authority;
}
+ public void removeAuthority(EndPoint info) {
+ synchronized (mAuthorities) {
+ if (info.target_provider) {
+ removeAuthorityLocked(info.account, info.userId, info.provider, true /* doWrite */);
+ } else {
+ SparseArray<AuthorityInfo> aInfos = mServices.get(info.service);
+ if (aInfos != null) {
+ AuthorityInfo authorityInfo = aInfos.get(info.userId);
+ if (authorityInfo != null) {
+ mAuthorities.remove(authorityInfo.ident);
+ aInfos.delete(info.userId);
+ writeAccountInfoLocked();
+ }
+ }
+
+ }
+ }
+ }
+
+ /**
+ * Remove an authority associated with a provider. Needs to be a standalone function for
+ * backward compatibility.
+ */
private void removeAuthorityLocked(Account account, int userId, String authorityName,
boolean doWrite) {
AccountInfo accountInfo = mAccounts.get(new AccountAndUser(account, userId));
@@ -1592,10 +1716,9 @@ public class SyncStorageEngine extends Handler {
/**
* Updates (in a synchronized way) the periodic sync time of the specified
- * authority id and target periodic sync
+ * target id and target periodic sync
*/
- public void setPeriodicSyncTime(
- int authorityId, PeriodicSync targetPeriodicSync, long when) {
+ public void setPeriodicSyncTime(int authorityId, PeriodicSync targetPeriodicSync, long when) {
boolean found = false;
final AuthorityInfo authorityInfo;
synchronized (mAuthorities) {
@@ -1611,7 +1734,7 @@ public class SyncStorageEngine extends Handler {
}
if (!found) {
Log.w(TAG, "Ignoring setPeriodicSyncTime request for a sync that does not exist. " +
- "Authority: " + authorityInfo.authority);
+ "Authority: " + authorityInfo.target);
}
}
@@ -1672,7 +1795,7 @@ public class SyncStorageEngine extends Handler {
try {
fis = mAccountInfoFile.openRead();
if (Log.isLoggable(TAG_FILE, Log.VERBOSE)) {
- Log.v(TAG, "Reading " + mAccountInfoFile.getBaseFile());
+ Log.v(TAG_FILE, "Reading " + mAccountInfoFile.getBaseFile());
}
XmlPullParser parser = Xml.newPullParser();
parser.setInput(fis, null);
@@ -1780,10 +1903,14 @@ public class SyncStorageEngine extends Handler {
ArrayList<AuthorityInfo> authoritiesToRemove = new ArrayList<AuthorityInfo>();
final int N = mAuthorities.size();
- for (int i=0; i<N; i++) {
+ for (int i = 0; i < N; i++) {
AuthorityInfo authority = mAuthorities.valueAt(i);
+ // skip this authority if it doesn't target a provider
+ if (authority.target.target_service) {
+ continue;
+ }
// skip this authority if it isn't one of the renamed ones
- final String newAuthorityName = sAuthorityRenames.get(authority.authority);
+ final String newAuthorityName = sAuthorityRenames.get(authority.target.provider);
if (newAuthorityName == null) {
continue;
}
@@ -1799,20 +1926,26 @@ public class SyncStorageEngine extends Handler {
}
// if we already have a record of this new authority then don't copy over the settings
- if (getAuthorityLocked(authority.account, authority.userId, newAuthorityName, "cleanup")
- != null) {
+ EndPoint newInfo =
+ new EndPoint(authority.target.account,
+ newAuthorityName,
+ authority.target.userId);
+ if (getAuthorityLocked(newInfo, "cleanup") != null) {
continue;
}
- AuthorityInfo newAuthority = getOrCreateAuthorityLocked(authority.account,
- authority.userId, newAuthorityName, -1 /* ident */, false /* doWrite */);
+ AuthorityInfo newAuthority =
+ getOrCreateAuthorityLocked(newInfo, -1 /* ident */, false /* doWrite */);
newAuthority.enabled = true;
writeNeeded = true;
}
for (AuthorityInfo authorityInfo : authoritiesToRemove) {
- removeAuthorityLocked(authorityInfo.account, authorityInfo.userId,
- authorityInfo.authority, false /* doWrite */);
+ removeAuthorityLocked(
+ authorityInfo.target.account,
+ authorityInfo.target.userId,
+ authorityInfo.target.provider,
+ false /* doWrite */);
writeNeeded = true;
}
@@ -1854,30 +1987,37 @@ public class SyncStorageEngine extends Handler {
String packageName = parser.getAttributeValue(null, "package");
String className = parser.getAttributeValue(null, "class");
int userId = user == null ? 0 : Integer.parseInt(user);
- if (accountType == null) {
+ if (accountType == null && packageName == null) {
accountType = "com.google";
syncable = "unknown";
}
authority = mAuthorities.get(id);
if (Log.isLoggable(TAG_FILE, Log.VERBOSE)) {
- Log.v(TAG, "Adding authority: account="
- + accountName + " auth=" + authorityName
+ Log.v(TAG_FILE, "Adding authority:"
+ + " account=" + accountName
+ + " accountType=" + accountType
+ + " auth=" + authorityName
+ + " package=" + packageName
+ + " class=" + className
+ " user=" + userId
+ " enabled=" + enabled
+ " syncable=" + syncable);
}
if (authority == null) {
if (Log.isLoggable(TAG_FILE, Log.VERBOSE)) {
- Log.v(TAG, "Creating entry");
+ Log.v(TAG_FILE, "Creating authority entry");
}
- if (accountName != null && accountType != null) {
- authority = getOrCreateAuthorityLocked(
- new Account(accountName, accountType), userId, authorityName, id,
- false);
+ EndPoint info;
+ if (accountName != null && authorityName != null) {
+ info = new EndPoint(
+ new Account(accountName, accountType),
+ authorityName, userId);
} else {
- authority = getOrCreateAuthorityLocked(
- new ComponentName(packageName, className), userId, id, false);
+ info = new EndPoint(
+ new ComponentName(packageName, className),
+ userId);
}
+ authority = getOrCreateAuthorityLocked(info, id, false);
// If the version is 0 then we are upgrading from a file format that did not
// know about periodic syncs. In that case don't clear the list since we
// want the default, which is a daily periodic sync.
@@ -1908,7 +2048,7 @@ public class SyncStorageEngine extends Handler {
/**
* Parse a periodic sync from accounts.xml. Sets the bundle to be empty.
*/
- private PeriodicSync parsePeriodicSync(XmlPullParser parser, AuthorityInfo authority) {
+ private PeriodicSync parsePeriodicSync(XmlPullParser parser, AuthorityInfo authorityInfo) {
Bundle extras = new Bundle(); // Gets filled in later.
String periodValue = parser.getAttributeValue(null, "period");
String flexValue = parser.getAttributeValue(null, "flex");
@@ -1926,17 +2066,31 @@ public class SyncStorageEngine extends Handler {
try {
flextime = Long.parseLong(flexValue);
} catch (NumberFormatException e) {
- Log.e(TAG, "Error formatting value parsed for periodic sync flex: " + flexValue);
flextime = calculateDefaultFlexTime(period);
+ Log.e(TAG, "Error formatting value parsed for periodic sync flex: " + flexValue
+ + ", using default: "
+ + flextime);
} catch (NullPointerException expected) {
flextime = calculateDefaultFlexTime(period);
Log.d(TAG, "No flex time specified for this sync, using a default. period: "
+ period + " flex: " + flextime);
}
- final PeriodicSync periodicSync =
- new PeriodicSync(authority.account, authority.authority, extras,
+ PeriodicSync periodicSync;
+ if (authorityInfo.target.target_provider) {
+ periodicSync =
+ new PeriodicSync(authorityInfo.target.account,
+ authorityInfo.target.provider,
+ extras,
period, flextime);
- authority.periodicSyncs.add(periodicSync);
+ } else {
+ periodicSync =
+ new PeriodicSync(
+ authorityInfo.target.service,
+ extras,
+ period,
+ flextime);
+ }
+ authorityInfo.periodicSyncs.add(periodicSync);
return periodicSync;
}
@@ -1974,7 +2128,7 @@ public class SyncStorageEngine extends Handler {
*/
private void writeAccountInfoLocked() {
if (Log.isLoggable(TAG_FILE, Log.VERBOSE)) {
- Log.v(TAG, "Writing new " + mAccountInfoFile.getBaseFile());
+ Log.v(TAG_FILE, "Writing new " + mAccountInfoFile.getBaseFile());
}
FileOutputStream fos = null;
@@ -2004,17 +2158,18 @@ public class SyncStorageEngine extends Handler {
final int N = mAuthorities.size();
for (int i = 0; i < N; i++) {
AuthorityInfo authority = mAuthorities.valueAt(i);
+ EndPoint info = authority.target;
out.startTag(null, "authority");
out.attribute(null, "id", Integer.toString(authority.ident));
- out.attribute(null, XML_ATTR_USER, Integer.toString(authority.userId));
+ out.attribute(null, XML_ATTR_USER, Integer.toString(info.userId));
out.attribute(null, XML_ATTR_ENABLED, Boolean.toString(authority.enabled));
- if (authority.service == null) {
- out.attribute(null, "account", authority.account.name);
- out.attribute(null, "type", authority.account.type);
- out.attribute(null, "authority", authority.authority);
+ if (info.service == null) {
+ out.attribute(null, "account", info.account.name);
+ out.attribute(null, "type", info.account.type);
+ out.attribute(null, "authority", info.provider);
} else {
- out.attribute(null, "package", authority.service.getPackageName());
- out.attribute(null, "class", authority.service.getClassName());
+ out.attribute(null, "package", info.service.getPackageName());
+ out.attribute(null, "class", info.service.getClassName());
}
if (authority.syncable < 0) {
out.attribute(null, "syncable", "unknown");
@@ -2074,7 +2229,7 @@ public class SyncStorageEngine extends Handler {
// Copy in all of the status information, as well as accounts.
if (Log.isLoggable(TAG_FILE, Log.VERBOSE)) {
- Log.v(TAG, "Reading legacy sync accounts db");
+ Log.v(TAG_FILE, "Reading legacy sync accounts db");
}
SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
qb.setTables("stats, status");
@@ -2108,9 +2263,13 @@ public class SyncStorageEngine extends Handler {
accountType = "com.google";
}
String authorityName = c.getString(c.getColumnIndex("authority"));
- AuthorityInfo authority = this.getOrCreateAuthorityLocked(
- new Account(accountName, accountType), 0 /* legacy is single-user */,
- authorityName, -1, false);
+ AuthorityInfo authority =
+ this.getOrCreateAuthorityLocked(
+ new EndPoint(new Account(accountName, accountType),
+ authorityName,
+ 0 /* legacy is single-user */)
+ , -1,
+ false);
if (authority != null) {
int i = mSyncStatus.size();
boolean found = false;
@@ -2162,7 +2321,7 @@ public class SyncStorageEngine extends Handler {
while (i > 0) {
i--;
AuthorityInfo authority = mAuthorities.valueAt(i);
- if (authority.authority.equals(provider)) {
+ if (authority.target.provider.equals(provider)) {
authority.enabled = value == null || Boolean.parseBoolean(value);
authority.syncable = 1;
}
@@ -2186,7 +2345,7 @@ public class SyncStorageEngine extends Handler {
*/
private void readStatusLocked() {
if (Log.isLoggable(TAG_FILE, Log.VERBOSE)) {
- Log.v(TAG, "Reading " + mStatusFile.getBaseFile());
+ Log.v(TAG_FILE, "Reading " + mStatusFile.getBaseFile());
}
try {
byte[] data = mStatusFile.readFully();
@@ -2200,8 +2359,7 @@ public class SyncStorageEngine extends Handler {
if (mAuthorities.indexOfKey(status.authorityId) >= 0) {
status.pending = false;
if (Log.isLoggable(TAG_FILE, Log.VERBOSE)) {
- Log.v(TAG, "Adding status for id "
- + status.authorityId);
+ Log.v(TAG_FILE, "Adding status for id " + status.authorityId);
}
mSyncStatus.put(status.authorityId, status);
}
@@ -2221,7 +2379,7 @@ public class SyncStorageEngine extends Handler {
*/
private void writeStatusLocked() {
if (Log.isLoggable(TAG_FILE, Log.VERBOSE)) {
- Log.v(TAG, "Writing new " + mStatusFile.getBaseFile());
+ Log.v(TAG_FILE, "Writing new " + mStatusFile.getBaseFile());
}
// The file is being written, so we don't need to have a scheduled
@@ -2264,6 +2422,9 @@ public class SyncStorageEngine extends Handler {
}
try {
fis = mPendingFile.openRead();
+ if (Log.isLoggable(TAG_FILE, Log.VERBOSE)) {
+ Log.v(TAG_FILE, "Reading " + mPendingFile.getBaseFile());
+ }
XmlPullParser parser;
parser = Xml.newPullParser();
parser.setInput(fis, null);
@@ -2275,12 +2436,11 @@ public class SyncStorageEngine extends Handler {
}
if (eventType == XmlPullParser.END_DOCUMENT) return; // Nothing to read.
- String tagName = parser.getName();
do {
PendingOperation pop = null;
if (eventType == XmlPullParser.START_TAG) {
try {
- tagName = parser.getName();
+ String tagName = parser.getName();
if (parser.getDepth() == 1 && "op".equals(tagName)) {
// Verify version.
String versionString =
@@ -2305,18 +2465,16 @@ public class SyncStorageEngine extends Handler {
}
if (authority != null) {
pop = new PendingOperation(
- authority.account, authority.userId, reason,
- syncSource, authority.authority, new Bundle(),
- expedited);
+ authority, reason, syncSource, new Bundle(), expedited);
pop.flatExtras = null; // No longer used.
mPendingOperations.add(pop);
if (Log.isLoggable(TAG_FILE, Log.VERBOSE)) {
Log.v(TAG_FILE, "Adding pending op: "
- + pop.authority
+ + pop.target
+ " src=" + pop.syncSource
+ " reason=" + pop.reason
+ " expedited=" + pop.expedited);
- }
+ }
} else {
// Skip non-existent authority.
pop = null;
@@ -2351,11 +2509,40 @@ public class SyncStorageEngine extends Handler {
}
}
+ static private byte[] flattenBundle(Bundle bundle) {
+ byte[] flatData = null;
+ Parcel parcel = Parcel.obtain();
+ try {
+ bundle.writeToParcel(parcel, 0);
+ flatData = parcel.marshall();
+ } finally {
+ parcel.recycle();
+ }
+ return flatData;
+ }
+
+ static private Bundle unflattenBundle(byte[] flatData) {
+ Bundle bundle;
+ Parcel parcel = Parcel.obtain();
+ try {
+ parcel.unmarshall(flatData, 0, flatData.length);
+ parcel.setDataPosition(0);
+ bundle = parcel.readBundle();
+ } catch (RuntimeException e) {
+ // A RuntimeException is thrown if we were unable to parse the parcel.
+ // Create an empty parcel in this case.
+ bundle = new Bundle();
+ } finally {
+ parcel.recycle();
+ }
+ return bundle;
+ }
+
+ private static final String XML_ATTR_VERSION = "version";
private static final String XML_ATTR_AUTHORITYID = "authority_id";
private static final String XML_ATTR_SOURCE = "source";
private static final String XML_ATTR_EXPEDITED = "expedited";
private static final String XML_ATTR_REASON = "reason";
- private static final String XML_ATTR_VERSION = "version";
/**
* Write all currently pending ops to the pending ops file.
@@ -2365,14 +2552,14 @@ public class SyncStorageEngine extends Handler {
FileOutputStream fos = null;
try {
if (N == 0) {
- if (Log.isLoggable(TAG_FILE, Log.VERBOSE)) {
- Log.v(TAG_FILE, "Truncating " + mPendingFile.getBaseFile());
+ if (Log.isLoggable(TAG_FILE, Log.VERBOSE)){
+ Log.v(TAG, "Truncating " + mPendingFile.getBaseFile());
}
mPendingFile.truncate();
return;
}
if (Log.isLoggable(TAG_FILE, Log.VERBOSE)) {
- Log.v(TAG_FILE, "Writing new " + mPendingFile.getBaseFile());
+ Log.v(TAG, "Writing new " + mPendingFile.getBaseFile());
}
fos = mPendingFile.startWrite();
XmlSerializer out = new FastXmlSerializer();
@@ -2381,9 +2568,9 @@ public class SyncStorageEngine extends Handler {
for (int i = 0; i < N; i++) {
PendingOperation pop = mPendingOperations.get(i);
writePendingOperationLocked(pop, out);
- }
- out.endDocument();
- mPendingFile.finishWrite(fos);
+ }
+ out.endDocument();
+ mPendingFile.finishWrite(fos);
} catch (java.io.IOException e1) {
Log.w(TAG, "Error writing pending operations", e1);
if (fos != null) {
@@ -2443,35 +2630,6 @@ public class SyncStorageEngine extends Handler {
}
}
- static private byte[] flattenBundle(Bundle bundle) {
- byte[] flatData = null;
- Parcel parcel = Parcel.obtain();
- try {
- bundle.writeToParcel(parcel, 0);
- flatData = parcel.marshall();
- } finally {
- parcel.recycle();
- }
- return flatData;
- }
-
- static private Bundle unflattenBundle(byte[] flatData) {
- Bundle bundle;
- Parcel parcel = Parcel.obtain();
- try {
- parcel.unmarshall(flatData, 0, flatData.length);
- parcel.setDataPosition(0);
- bundle = parcel.readBundle();
- } catch (RuntimeException e) {
- // A RuntimeException is thrown if we were unable to parse the parcel.
- // Create an empty parcel in this case.
- bundle = new Bundle();
- } finally {
- parcel.recycle();
- }
- return bundle;
- }
-
private void extrasToXml(XmlSerializer out, Bundle extras) throws java.io.IOException {
for (String key : extras.keySet()) {
out.startTag(null, "extra");
@@ -2504,6 +2662,24 @@ public class SyncStorageEngine extends Handler {
}
}
+ private void requestSync(AuthorityInfo authorityInfo, int reason, Bundle extras) {
+ if (android.os.Process.myUid() == android.os.Process.SYSTEM_UID
+ && mSyncRequestListener != null) {
+ mSyncRequestListener.onSyncRequest(authorityInfo.target, reason, extras);
+ } else {
+ SyncRequest.Builder req =
+ new SyncRequest.Builder()
+ .syncOnce()
+ .setExtras(extras);
+ if (authorityInfo.target.target_provider) {
+ req.setSyncAdapter(authorityInfo.target.account, authorityInfo.target.provider);
+ } else {
+ req.setSyncAdapter(authorityInfo.target.service);
+ }
+ ContentResolver.requestSync(req.build());
+ }
+ }
+
private void requestSync(Account account, int userId, int reason, String authority,
Bundle extras) {
// If this is happening in the system process, then call the syncrequest listener
@@ -2512,7 +2688,10 @@ public class SyncStorageEngine extends Handler {
// which will know which userId to apply based on the Binder id.
if (android.os.Process.myUid() == android.os.Process.SYSTEM_UID
&& mSyncRequestListener != null) {
- mSyncRequestListener.onSyncRequest(account, userId, reason, authority, extras);
+ mSyncRequestListener.onSyncRequest(
+ new EndPoint(account, authority, userId),
+ reason,
+ extras);
} else {
ContentResolver.requestSync(account, authority, extras);
}
@@ -2608,10 +2787,8 @@ public class SyncStorageEngine extends Handler {
public void dumpPendingOperations(StringBuilder sb) {
sb.append("Pending Ops: ").append(mPendingOperations.size()).append(" operation(s)\n");
for (PendingOperation pop : mPendingOperations) {
- sb.append("(" + pop.account)
- .append(", u" + pop.userId)
- .append(", " + pop.authority)
- .append(", " + pop.extras)
+ sb.append("(info: " + pop.target.toString())
+ .append(", extras: " + pop.extras)
.append(")\n");
}
}
diff --git a/services/java/com/android/server/display/LocalDisplayAdapter.java b/services/java/com/android/server/display/LocalDisplayAdapter.java
index cb8f3e2..d92c5d6 100644
--- a/services/java/com/android/server/display/LocalDisplayAdapter.java
+++ b/services/java/com/android/server/display/LocalDisplayAdapter.java
@@ -166,6 +166,12 @@ final class LocalDisplayAdapter extends DisplayAdapter {
if ("portrait".equals(SystemProperties.get("persist.demo.hdmirotation"))) {
mInfo.rotation = Surface.ROTATION_270;
}
+
+ // For demonstration purposes, allow rotation of the external display
+ // to follow the built-in display.
+ if (SystemProperties.getBoolean("persist.demo.hdmirotates", false)) {
+ mInfo.flags |= DisplayDeviceInfo.FLAG_ROTATES_WITH_CONTENT;
+ }
}
}
return mInfo;
diff --git a/services/java/com/android/server/display/LogicalDisplay.java b/services/java/com/android/server/display/LogicalDisplay.java
index 7e357c0..c26c438 100644
--- a/services/java/com/android/server/display/LogicalDisplay.java
+++ b/services/java/com/android/server/display/LogicalDisplay.java
@@ -258,8 +258,7 @@ final class LogicalDisplay {
// The orientation specifies how the physical coordinate system of the display
// is rotated when the contents of the logical display are rendered.
int orientation = Surface.ROTATION_0;
- if (device == mPrimaryDisplayDevice
- && (displayDeviceInfo.flags & DisplayDeviceInfo.FLAG_ROTATES_WITH_CONTENT) != 0) {
+ if ((displayDeviceInfo.flags & DisplayDeviceInfo.FLAG_ROTATES_WITH_CONTENT) != 0) {
orientation = displayInfo.rotation;
}
diff --git a/services/java/com/android/server/firewall/IntentFirewall.java b/services/java/com/android/server/firewall/IntentFirewall.java
index aaa0b58..6df1dbd 100644
--- a/services/java/com/android/server/firewall/IntentFirewall.java
+++ b/services/java/com/android/server/firewall/IntentFirewall.java
@@ -268,11 +268,13 @@ public class IntentFirewall {
}
File[] files = rulesDir.listFiles();
- for (int i=0; i<files.length; i++) {
- File file = files[i];
+ if (files != null) {
+ for (int i=0; i<files.length; i++) {
+ File file = files[i];
- if (file.getName().endsWith(".xml")) {
- readRules(file, resolvers);
+ if (file.getName().endsWith(".xml")) {
+ readRules(file, resolvers);
+ }
}
}
diff --git a/services/java/com/android/server/wifi/WifiService.java b/services/java/com/android/server/wifi/WifiService.java
index d471b57..b7a6c5f 100644
--- a/services/java/com/android/server/wifi/WifiService.java
+++ b/services/java/com/android/server/wifi/WifiService.java
@@ -945,11 +945,6 @@ public final class WifiService extends IWifiManager.Stub {
mWifiStateMachine.reconnectCommand();
}
- public void captivePortalCheckComplete() {
- enforceConnectivityInternalPermission();
- mWifiStateMachine.captivePortalCheckComplete();
- }
-
/**
* see {@link android.net.wifi.WifiManager#stopWifi}
*
diff --git a/services/java/com/android/server/wm/WindowManagerService.java b/services/java/com/android/server/wm/WindowManagerService.java
index a645c01..f24afc1 100644
--- a/services/java/com/android/server/wm/WindowManagerService.java
+++ b/services/java/com/android/server/wm/WindowManagerService.java
@@ -256,9 +256,6 @@ public class WindowManagerService extends IWindowManager.Stub
/** Amount of time (in milliseconds) to delay before declaring a window freeze timeout. */
static final int WINDOW_FREEZE_TIMEOUT_DURATION = 2000;
- /** Amount of time (in milliseconds) to delay before declaring a starting window leaked. */
- static final int STARTING_WINDOW_TIMEOUT_DURATION = 10000;
-
/**
* If true, the window manager will do its own custom freezing and general
* management of the screen during rotation.
@@ -2268,8 +2265,6 @@ public class WindowManagerService extends IWindowManager.Stub
token.appWindowToken.startingWindow = win;
if (DEBUG_STARTING_WINDOW) Slog.v (TAG, "addWindow: " + token.appWindowToken
+ " startingWindow=" + win);
- Message m = mH.obtainMessage(H.REMOVE_STARTING_TIMEOUT, token.appWindowToken);
- mH.sendMessageDelayed(m, STARTING_WINDOW_TIMEOUT_DURATION);
}
boolean imMayMove = true;
@@ -2372,7 +2367,6 @@ public class WindowManagerService extends IWindowManager.Stub
public void removeWindowLocked(Session session, WindowState win) {
if (win.mAttrs.type == TYPE_APPLICATION_STARTING) {
if (DEBUG_STARTING_WINDOW) Slog.d(TAG, "Starting window removed " + win);
- removeStartingWindowTimeout(win.mAppToken);
}
if (localLOGV || DEBUG_FOCUS || DEBUG_FOCUS_LIGHT && win==mCurrentFocus) Slog.v(
@@ -2516,7 +2510,6 @@ public class WindowManagerService extends IWindowManager.Stub
if (atoken != null) {
if (atoken.startingWindow == win) {
if (DEBUG_STARTING_WINDOW) Slog.v(TAG, "Nulling startingWindow " + win);
- removeStartingWindowTimeout(atoken);
atoken.startingWindow = null;
} else if (atoken.allAppWindows.size() == 0 && atoken.startingData != null) {
// If this is the last window and we had requested a starting
@@ -3983,7 +3976,6 @@ public class WindowManagerService extends IWindowManager.Stub
if (DEBUG_WINDOW_MOVEMENT || DEBUG_ADD_REMOVE || DEBUG_STARTING_WINDOW) {
Slog.v(TAG, "Removing starting window: " + startingWindow);
}
- removeStartingWindowTimeout(ttoken);
startingWindow.getWindowList().remove(startingWindow);
mWindowsChanged = true;
if (DEBUG_ADD_REMOVE) Slog.v(TAG,
@@ -4130,6 +4122,15 @@ public class WindowManagerService extends IWindowManager.Stub
}
}
+ public void removeAppStartingWindow(IBinder token) {
+ synchronized (mWindowMap) {
+ AppWindowToken wtoken = mTokenMap.get(token).appWindowToken;
+ if (wtoken.startingWindow != null) {
+ scheduleRemoveStartingWindow(wtoken);
+ }
+ }
+ }
+
@Override
public void setAppWillBeHidden(IBinder token) {
if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
@@ -4551,21 +4552,11 @@ public class WindowManagerService extends IWindowManager.Stub
scheduleRemoveStartingWindow(startingToken);
}
- void removeStartingWindowTimeout(AppWindowToken wtoken) {
- if (wtoken != null) {
- if (DEBUG_STARTING_WINDOW) Slog.v(TAG, Debug.getCallers(1) +
- ": Remove starting window timeout " + wtoken + (wtoken != null ?
- " startingWindow=" + wtoken.startingWindow : ""));
- mH.removeMessages(H.REMOVE_STARTING_TIMEOUT, wtoken);
- }
- }
-
void scheduleRemoveStartingWindow(AppWindowToken wtoken) {
if (wtoken != null && wtoken.startingWindow != null) {
if (DEBUG_STARTING_WINDOW) Slog.v(TAG, Debug.getCallers(1) +
": Schedule remove starting " + wtoken + (wtoken != null ?
" startingWindow=" + wtoken.startingWindow : ""));
- removeStartingWindowTimeout(wtoken);
Message m = mH.obtainMessage(H.REMOVE_STARTING, wtoken);
mH.sendMessage(m);
}
@@ -7072,8 +7063,6 @@ public class WindowManagerService extends IWindowManager.Stub
public static final int TAP_OUTSIDE_STACK = 31;
public static final int NOTIFY_ACTIVITY_DRAWN = 32;
- public static final int REMOVE_STARTING_TIMEOUT = 33;
-
@Override
public void handleMessage(Message msg) {
if (DEBUG_WINDOW_TRACE) {
@@ -7172,7 +7161,6 @@ public class WindowManagerService extends IWindowManager.Stub
"Aborted starting " + wtoken
+ ": removed=" + wtoken.removed
+ " startingData=" + wtoken.startingData);
- removeStartingWindowTimeout(wtoken);
wtoken.startingWindow = null;
wtoken.startingData = null;
abort = true;
@@ -7197,11 +7185,6 @@ public class WindowManagerService extends IWindowManager.Stub
}
} break;
- case REMOVE_STARTING_TIMEOUT: {
- final AppWindowToken wtoken = (AppWindowToken)msg.obj;
- Slog.e(TAG, "Starting window " + wtoken + " timed out");
- // Fall through.
- }
case REMOVE_STARTING: {
final AppWindowToken wtoken = (AppWindowToken)msg.obj;
IBinder token = null;
@@ -10182,6 +10165,12 @@ public class WindowManagerService extends IWindowManager.Stub
}
}
+ public int getInputMethodWindowVisibleHeight() {
+ synchronized (mWindowMap) {
+ return mPolicy.getInputMethodWindowVisibleHeightLw();
+ }
+ }
+
@Override
public boolean hasNavigationBar() {
return mPolicy.hasNavigationBar();
diff --git a/services/tests/servicestests/src/com/android/server/NetworkManagementServiceTest.java b/services/tests/servicestests/src/com/android/server/NetworkManagementServiceTest.java
index 56dd7c4..30d4eff 100644
--- a/services/tests/servicestests/src/com/android/server/NetworkManagementServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/NetworkManagementServiceTest.java
@@ -166,6 +166,9 @@ public class NetworkManagementServiceTest extends AndroidTestCase {
sendMessage("614 Address removed 2001:db8::1/64 wlan0 1 0");
expectSoon(observer).addressRemoved("2001:db8::1/64", "wlan0", 1, 0);
+ sendMessage("614 Address removed 2001:db8::1/64 wlan0 1");
+ // Not enough arguments.
+
sendMessage("666 Address added 2001:db8::1/64 wlan0 1 0");
// Invalid code.
diff --git a/services/tests/servicestests/src/com/android/server/content/SyncStorageEngineTest.java b/services/tests/servicestests/src/com/android/server/content/SyncStorageEngineTest.java
index f870e4c..70fd810 100644
--- a/services/tests/servicestests/src/com/android/server/content/SyncStorageEngineTest.java
+++ b/services/tests/servicestests/src/com/android/server/content/SyncStorageEngineTest.java
@@ -17,6 +17,7 @@
package com.android.server.content;
import android.accounts.Account;
+import android.content.ComponentName;
import android.content.ContentResolver;
import android.content.Context;
import android.content.ContextWrapper;
@@ -32,22 +33,34 @@ import android.test.suitebuilder.annotation.LargeTest;
import android.test.suitebuilder.annotation.MediumTest;
import android.test.suitebuilder.annotation.SmallTest;
+import com.android.server.content.SyncStorageEngine.EndPoint;
+
import com.android.internal.os.AtomicFile;
import java.io.File;
import java.io.FileOutputStream;
import java.util.List;
+import com.android.server.content.SyncStorageEngine.EndPoint;
+
public class SyncStorageEngineTest extends AndroidTestCase {
protected Account account1;
+ protected Account account2;
+ protected ComponentName syncService1;
protected String authority1 = "testprovider";
protected Bundle defaultBundle;
protected final int DEFAULT_USER = 0;
-
+
+ /* Some default poll frequencies. */
+ final long dayPoll = (60 * 60 * 24);
+ final long dayFuzz = 60;
+ final long thousandSecs = 1000;
+ final long thousandSecsFuzz = 100;
+
MockContentResolver mockResolver;
SyncStorageEngine engine;
-
+
private File getSyncDir() {
return new File(new File(getContext().getFilesDir(), "system"), "sync");
}
@@ -55,6 +68,8 @@ public class SyncStorageEngineTest extends AndroidTestCase {
@Override
public void setUp() {
account1 = new Account("a@example.com", "example.type");
+ account2 = new Account("b@example.com", "example.type");
+ syncService1 = new ComponentName("com.example", "SyncService");
// Default bundle.
defaultBundle = new Bundle();
defaultBundle.putInt("int_key", 0);
@@ -80,11 +95,13 @@ public class SyncStorageEngineTest extends AndroidTestCase {
SyncStorageEngine engine = SyncStorageEngine.newTestInstance(
new TestContext(mockResolver, getContext()));
-
long time0 = 1000;
- long historyId = engine.insertStartSyncEvent(
- account, 0, SyncOperation.REASON_PERIODIC, authority, time0,
- SyncStorageEngine.SOURCE_LOCAL, false /* initialization */, null /* extras */);
+ SyncOperation op = new SyncOperation(account, 0,
+ SyncOperation.REASON_PERIODIC,
+ SyncStorageEngine.SOURCE_LOCAL,
+ authority,
+ Bundle.EMPTY, time0, 0 /* flex*/, 0, 0, true);
+ long historyId = engine.insertStartSyncEvent(op, time0);
long time1 = time0 + SyncStorageEngine.MILLIS_IN_4WEEKS * 2;
engine.stopSyncEvent(historyId, time1 - time0, "yay", 0, 0);
}
@@ -93,28 +110,100 @@ public class SyncStorageEngineTest extends AndroidTestCase {
* Test persistence of pending operations.
*/
@MediumTest
- public void testPending() throws Exception {
- SyncStorageEngine.PendingOperation pop =
- new SyncStorageEngine.PendingOperation(account1, DEFAULT_USER,
- SyncOperation.REASON_PERIODIC, SyncStorageEngine.SOURCE_LOCAL,
- authority1, defaultBundle, false);
-
- engine.insertIntoPending(pop);
+ public void testAppendPending() throws Exception {
+ SyncOperation sop = new SyncOperation(account1,
+ DEFAULT_USER,
+ SyncOperation.REASON_PERIODIC,
+ SyncStorageEngine.SOURCE_LOCAL, authority1, Bundle.EMPTY,
+ 0 /* runtime */, 0 /* flex */, 0 /* backoff */, 0 /* delayuntil */,
+ true /* expedited */);
+ engine.insertIntoPending(sop);
+
// Force engine to read from disk.
engine.clearAndReadState();
- assert(engine.getPendingOperationCount() == 1);
+ assertTrue(engine.getPendingOperationCount() == 1);
List<SyncStorageEngine.PendingOperation> pops = engine.getPendingOperations();
SyncStorageEngine.PendingOperation popRetrieved = pops.get(0);
- assertEquals(pop.account, popRetrieved.account);
- assertEquals(pop.reason, popRetrieved.reason);
- assertEquals(pop.userId, popRetrieved.userId);
- assertEquals(pop.syncSource, popRetrieved.syncSource);
- assertEquals(pop.authority, popRetrieved.authority);
- assertEquals(pop.expedited, popRetrieved.expedited);
- assertEquals(pop.serviceName, popRetrieved.serviceName);
- assert(android.content.PeriodicSync.syncExtrasEquals(pop.extras, popRetrieved.extras));
+ assertEquals(sop.target.account, popRetrieved.target.account);
+ assertEquals(sop.target.provider, popRetrieved.target.provider);
+ assertEquals(sop.target.service, popRetrieved.target.service);
+ assertEquals(sop.target.userId, popRetrieved.target.userId);
+ assertEquals(sop.reason, popRetrieved.reason);
+ assertEquals(sop.syncSource, popRetrieved.syncSource);
+ assertEquals(sop.expedited, popRetrieved.expedited);
+ assert(android.content.PeriodicSync.syncExtrasEquals(sop.extras, popRetrieved.extras));
+ }
+ /**
+ * Verify {@link com.android.server.content.SyncStorageEngine#writePendingOperationsLocked()}
+ */
+ public void testWritePendingOperationsLocked() throws Exception {
+ SyncOperation sop = new SyncOperation(account1,
+ DEFAULT_USER,
+ SyncOperation.REASON_IS_SYNCABLE,
+ SyncStorageEngine.SOURCE_LOCAL, authority1, Bundle.EMPTY,
+ 1000L /* runtime */, 57L /* flex */, 0 /* backoff */, 0 /* delayuntil */,
+ true /* expedited */);
+ SyncOperation sop1 = new SyncOperation(account2,
+ DEFAULT_USER,
+ SyncOperation.REASON_PERIODIC,
+ SyncStorageEngine.SOURCE_LOCAL, authority1, defaultBundle,
+ 0 /* runtime */, 0 /* flex */, 20L /* backoff */, 100L /* delayuntil */,
+ false /* expedited */);
+ SyncOperation deleted = new SyncOperation(account2,
+ DEFAULT_USER,
+ SyncOperation.REASON_SYNC_AUTO,
+ SyncStorageEngine.SOURCE_LOCAL, authority1, Bundle.EMPTY,
+ 0 /* runtime */, 0 /* flex */, 20L /* backoff */, 100L /* delayuntil */,
+ false /* expedited */);
+ engine.insertIntoPending(sop);
+ engine.insertIntoPending(sop1);
+ engine.insertIntoPending(deleted);
+
+ SyncStorageEngine.PendingOperation popDeleted = engine.getPendingOperations().get(2);
+ // Free verifying, going to delete it anyway.
+ assertEquals(deleted.target.account, popDeleted.target.account);
+ assertEquals(deleted.target.provider, popDeleted.target.provider);
+ assertEquals(deleted.target.service, popDeleted.target.service);
+ assertEquals(deleted.target.userId, popDeleted.target.userId);
+ assertEquals(deleted.reason, popDeleted.reason);
+ assertEquals(deleted.syncSource, popDeleted.syncSource);
+ assertEquals(deleted.expedited, popDeleted.expedited);
+ assert(android.content.PeriodicSync.syncExtrasEquals(deleted.extras, popDeleted.extras));
+ // Delete one to force write-all
+ engine.deleteFromPending(popDeleted);
+ assertEquals("Delete of pending op failed.", 2, engine.getPendingOperationCount());
+ // If there's dirty pending data (which there is because we deleted a pending op) this
+ // re-writes the entire file.
+ engine.writeAllState();
+
+ engine.clearAndReadState();
+
+ // Validate state read back out.
+ assertEquals("Delete of pending op failed.", 2, engine.getPendingOperationCount());
+
+ List<SyncStorageEngine.PendingOperation> pops = engine.getPendingOperations();
+
+ SyncStorageEngine.PendingOperation popRetrieved = pops.get(0);
+ assertEquals(sop.target.account, popRetrieved.target.account);
+ assertEquals(sop.target.provider, popRetrieved.target.provider);
+ assertEquals(sop.target.service, popRetrieved.target.service);
+ assertEquals(sop.target.userId, popRetrieved.target.userId);
+ assertEquals(sop.reason, popRetrieved.reason);
+ assertEquals(sop.syncSource, popRetrieved.syncSource);
+ assertEquals(sop.expedited, popRetrieved.expedited);
+ assert(android.content.PeriodicSync.syncExtrasEquals(sop.extras, popRetrieved.extras));
+
+ popRetrieved = pops.get(1);
+ assertEquals(sop1.target.account, popRetrieved.target.account);
+ assertEquals(sop1.target.provider, popRetrieved.target.provider);
+ assertEquals(sop1.target.service, popRetrieved.target.service);
+ assertEquals(sop1.target.userId, popRetrieved.target.userId);
+ assertEquals(sop1.reason, popRetrieved.reason);
+ assertEquals(sop1.syncSource, popRetrieved.syncSource);
+ assertEquals(sop1.expedited, popRetrieved.expedited);
+ assert(android.content.PeriodicSync.syncExtrasEquals(sop1.extras, popRetrieved.extras));
}
/**
@@ -134,42 +223,44 @@ public class SyncStorageEngineTest extends AndroidTestCase {
final int period2 = 1000;
PeriodicSync sync1 = new PeriodicSync(account1, authority, extras1, period1);
+ EndPoint end1 = new EndPoint(account1, authority, 0);
+
PeriodicSync sync2 = new PeriodicSync(account1, authority, extras2, period1);
PeriodicSync sync3 = new PeriodicSync(account1, authority, extras2, period2);
PeriodicSync sync4 = new PeriodicSync(account2, authority, extras2, period2);
-
+
removePeriodicSyncs(engine, account1, 0, authority);
removePeriodicSyncs(engine, account2, 0, authority);
removePeriodicSyncs(engine, account1, 1, authority);
// this should add two distinct periodic syncs for account1 and one for account2
- engine.addPeriodicSync(sync1, 0);
- engine.addPeriodicSync(sync2, 0);
- engine.addPeriodicSync(sync3, 0);
- engine.addPeriodicSync(sync4, 0);
+ engine.updateOrAddPeriodicSync(new EndPoint(account1, authority, 0), period1, 0, extras1);
+ engine.updateOrAddPeriodicSync(new EndPoint(account1, authority, 0), period1, 0, extras2);
+ engine.updateOrAddPeriodicSync(new EndPoint(account1, authority, 0), period2, 0, extras2);
+ engine.updateOrAddPeriodicSync(new EndPoint(account2, authority, 0), period2, 0, extras2);
// add a second user
- engine.addPeriodicSync(sync2, 1);
+ engine.updateOrAddPeriodicSync(new EndPoint(account1, authority, 1), period1, 0, extras2);
- List<PeriodicSync> syncs = engine.getPeriodicSyncs(account1, 0, authority);
+ List<PeriodicSync> syncs = engine.getPeriodicSyncs(new EndPoint(account1, authority, 0));
assertEquals(2, syncs.size());
assertEquals(sync1, syncs.get(0));
assertEquals(sync3, syncs.get(1));
- engine.removePeriodicSync(sync1, 0);
+ engine.removePeriodicSync(new EndPoint(account1, authority, 0), extras1);
- syncs = engine.getPeriodicSyncs(account1, 0, authority);
+ syncs = engine.getPeriodicSyncs(new EndPoint(account1, authority, 0));
assertEquals(1, syncs.size());
assertEquals(sync3, syncs.get(0));
- syncs = engine.getPeriodicSyncs(account2, 0, authority);
+ syncs = engine.getPeriodicSyncs(new EndPoint(account2, authority, 0));
assertEquals(1, syncs.size());
assertEquals(sync4, syncs.get(0));
- syncs = engine.getPeriodicSyncs(sync2.account, 1, sync2.authority);
+ syncs = engine.getPeriodicSyncs(new EndPoint(sync2.account, sync2.authority, 1));
assertEquals(1, syncs.size());
assertEquals(sync2, syncs.get(0));
}
@@ -190,12 +281,19 @@ public class SyncStorageEngineTest extends AndroidTestCase {
final int period2 = 1000;
final int flex1 = 10;
final int flex2 = 100;
+ EndPoint point1 = new EndPoint(account1, authority, 0);
+ EndPoint point2 = new EndPoint(account2, authority, 0);
+ EndPoint point1User2 = new EndPoint(account1, authority, 1);
PeriodicSync sync1 = new PeriodicSync(account1, authority, extras1, period1, flex1);
PeriodicSync sync2 = new PeriodicSync(account1, authority, extras2, period1, flex1);
PeriodicSync sync3 = new PeriodicSync(account1, authority, extras2, period2, flex2);
PeriodicSync sync4 = new PeriodicSync(account2, authority, extras2, period2, flex2);
+ EndPoint target1 = new EndPoint(account1, authority, 0);
+ EndPoint target2 = new EndPoint(account2, authority, 0);
+ EndPoint target1UserB = new EndPoint(account1, authority, 1);
+
MockContentResolver mockResolver = new MockContentResolver();
SyncStorageEngine engine = SyncStorageEngine.newTestInstance(
@@ -206,40 +304,42 @@ public class SyncStorageEngineTest extends AndroidTestCase {
removePeriodicSyncs(engine, account1, 1, authority);
// This should add two distinct periodic syncs for account1 and one for account2
- engine.addPeriodicSync(sync1, 0);
- engine.addPeriodicSync(sync2, 0);
- engine.addPeriodicSync(sync3, 0); // Should edit sync2 and update the period.
- engine.addPeriodicSync(sync4, 0);
- // add a second user
- engine.addPeriodicSync(sync2, 1);
+ engine.updateOrAddPeriodicSync(target1, period1, flex1, extras1);
+ engine.updateOrAddPeriodicSync(target1, period1, flex1, extras2);
+ // Edit existing sync and update the period and flex.
+ engine.updateOrAddPeriodicSync(target1, period2, flex2, extras2);
+ engine.updateOrAddPeriodicSync(target2, period2, flex2, extras2);
+ // add a target for a second user.
+ engine.updateOrAddPeriodicSync(target1UserB, period1, flex1, extras2);
- List<PeriodicSync> syncs = engine.getPeriodicSyncs(account1, 0, authority);
+ List<PeriodicSync> syncs = engine.getPeriodicSyncs(target1);
assertEquals(2, syncs.size());
assertEquals(sync1, syncs.get(0));
assertEquals(sync3, syncs.get(1));
- engine.removePeriodicSync(sync1, 0);
+ engine.removePeriodicSync(target1, extras1);
- syncs = engine.getPeriodicSyncs(account1, 0, authority);
+ syncs = engine.getPeriodicSyncs(target1);
assertEquals(1, syncs.size());
assertEquals(sync3, syncs.get(0));
- syncs = engine.getPeriodicSyncs(account2, 0, authority);
+ syncs = engine.getPeriodicSyncs(target2);
assertEquals(1, syncs.size());
assertEquals(sync4, syncs.get(0));
- syncs = engine.getPeriodicSyncs(sync2.account, 1, sync2.authority);
+ syncs = engine.getPeriodicSyncs(target1UserB);
assertEquals(1, syncs.size());
assertEquals(sync2, syncs.get(0));
}
private void removePeriodicSyncs(SyncStorageEngine engine, Account account, int userId, String authority) {
- engine.setIsSyncable(account, userId, authority, engine.getIsSyncable(account, 0, authority));
- List<PeriodicSync> syncs = engine.getPeriodicSyncs(account, userId, authority);
+ EndPoint target = new EndPoint(account, authority, userId);
+ engine.setIsSyncable(account, userId, authority, engine.getIsSyncable(account, userId, authority));
+ List<PeriodicSync> syncs = engine.getPeriodicSyncs(target);
for (PeriodicSync sync : syncs) {
- engine.removePeriodicSync(sync, userId);
+ engine.removePeriodicSync(target, sync.extras);
}
}
@@ -264,16 +364,19 @@ public class SyncStorageEngineTest extends AndroidTestCase {
final int flex1 = 10;
final int flex2 = 100;
+ EndPoint point1 = new EndPoint(account1, authority1, 0);
+ EndPoint point2 = new EndPoint(account1, authority2, 0);
+ EndPoint point3 = new EndPoint(account2, authority1, 0);
+
PeriodicSync sync1 = new PeriodicSync(account1, authority1, extras1, period1, flex1);
PeriodicSync sync2 = new PeriodicSync(account1, authority1, extras2, period1, flex1);
PeriodicSync sync3 = new PeriodicSync(account1, authority2, extras1, period1, flex1);
PeriodicSync sync4 = new PeriodicSync(account1, authority2, extras2, period2, flex2);
PeriodicSync sync5 = new PeriodicSync(account2, authority1, extras1, period1, flex1);
- MockContentResolver mockResolver = new MockContentResolver();
-
- SyncStorageEngine engine = SyncStorageEngine.newTestInstance(
- new TestContext(mockResolver, getContext()));
+ EndPoint target1 = new EndPoint(account1, authority1, 0);
+ EndPoint target2 = new EndPoint(account1, authority2, 0);
+ EndPoint target3 = new EndPoint(account2, authority1, 0);
removePeriodicSyncs(engine, account1, 0, authority1);
removePeriodicSyncs(engine, account2, 0, authority1);
@@ -294,26 +397,26 @@ public class SyncStorageEngineTest extends AndroidTestCase {
engine.setIsSyncable(account2, 0, authority2, 0);
engine.setSyncAutomatically(account2, 0, authority2, true);
- engine.addPeriodicSync(sync1, 0);
- engine.addPeriodicSync(sync2, 0);
- engine.addPeriodicSync(sync3, 0);
- engine.addPeriodicSync(sync4, 0);
- engine.addPeriodicSync(sync5, 0);
+ engine.updateOrAddPeriodicSync(target1, period1, flex1, extras1);
+ engine.updateOrAddPeriodicSync(target1, period1, flex1, extras2);
+ engine.updateOrAddPeriodicSync(target2, period1, flex1, extras1);
+ engine.updateOrAddPeriodicSync(target2, period2, flex2, extras2);
+ engine.updateOrAddPeriodicSync(target3, period1, flex1, extras1);
engine.writeAllState();
engine.clearAndReadState();
- List<PeriodicSync> syncs = engine.getPeriodicSyncs(account1, 0, authority1);
+ List<PeriodicSync> syncs = engine.getPeriodicSyncs(target1);
assertEquals(2, syncs.size());
assertEquals(sync1, syncs.get(0));
assertEquals(sync2, syncs.get(1));
- syncs = engine.getPeriodicSyncs(account1, 0, authority2);
+ syncs = engine.getPeriodicSyncs(target2);
assertEquals(2, syncs.size());
assertEquals(sync3, syncs.get(0));
assertEquals(sync4, syncs.get(1));
- syncs = engine.getPeriodicSyncs(account2, 0, authority1);
+ syncs = engine.getPeriodicSyncs(target3);
assertEquals(1, syncs.size());
assertEquals(sync5, syncs.get(0));
@@ -328,6 +431,50 @@ public class SyncStorageEngineTest extends AndroidTestCase {
assertEquals(0, engine.getIsSyncable(account2, 0, authority2));
}
+ @SmallTest
+ public void testComponentParsing() throws Exception {
+
+ byte[] accountsFileData = ("<?xml version='1.0' encoding='utf-8' standalone='yes' ?>\n"
+ + "<accounts version=\"2\" >\n"
+ + "<authority id=\"0\" user=\"0\" package=\"" + syncService1.getPackageName() + "\""
+ + " class=\"" + syncService1.getClassName() + "\" syncable=\"true\">"
+ + "\n<periodicSync period=\"" + dayPoll + "\" flex=\"" + dayFuzz + "\"/>"
+ + "\n</authority>"
+ + "</accounts>").getBytes();
+
+ File syncDir = getSyncDir();
+ syncDir.mkdirs();
+ AtomicFile accountInfoFile = new AtomicFile(new File(syncDir, "accounts.xml"));
+ FileOutputStream fos = accountInfoFile.startWrite();
+ fos.write(accountsFileData);
+ accountInfoFile.finishWrite(fos);
+
+ engine.clearAndReadState();
+
+ SyncStorageEngine.AuthorityInfo aInfo = engine.getAuthority(0);
+ assertNotNull(aInfo);
+
+ // Test service component read
+ List<PeriodicSync> syncs = engine.getPeriodicSyncs(
+ new SyncStorageEngine.EndPoint(syncService1, 0));
+ assertEquals(1, syncs.size());
+ assertEquals(true, engine.getIsTargetServiceActive(syncService1, 0));
+ }
+
+ @SmallTest
+ public void testComponentSettings() throws Exception {
+ EndPoint target1 = new EndPoint(syncService1, 0);
+ engine.updateOrAddPeriodicSync(target1, dayPoll, dayFuzz, Bundle.EMPTY);
+
+ engine.setIsTargetServiceActive(target1.service, 0, true);
+ boolean active = engine.getIsTargetServiceActive(target1.service, 0);
+ assert(active);
+
+ engine.setIsTargetServiceActive(target1.service, 1, false);
+ active = engine.getIsTargetServiceActive(target1.service, 1);
+ assert(!active);
+ }
+
@MediumTest
/**
* V2 introduces flex time as well as service components.
@@ -339,20 +486,20 @@ public class SyncStorageEngineTest extends AndroidTestCase {
final String authority2 = "auth2";
final String authority3 = "auth3";
- final long dayPoll = (60 * 60 * 24);
- final long dayFuzz = 60;
- final long thousandSecs = 1000;
- final long thousandSecsFuzz = 100;
- final Bundle extras = new Bundle();
- PeriodicSync sync1 = new PeriodicSync(account, authority1, extras, dayPoll, dayFuzz);
- PeriodicSync sync2 = new PeriodicSync(account, authority2, extras, dayPoll, dayFuzz);
- PeriodicSync sync3 = new PeriodicSync(account, authority3, extras, dayPoll, dayFuzz);
- PeriodicSync sync1s = new PeriodicSync(account, authority1, extras, thousandSecs, thousandSecsFuzz);
- PeriodicSync sync2s = new PeriodicSync(account, authority2, extras, thousandSecs, thousandSecsFuzz);
- PeriodicSync sync3s = new PeriodicSync(account, authority3, extras, thousandSecs, thousandSecsFuzz);
- MockContentResolver mockResolver = new MockContentResolver();
-
- final TestContext testContext = new TestContext(mockResolver, getContext());
+ EndPoint target1 = new EndPoint(account, authority1, 0);
+ EndPoint target2 = new EndPoint(account, authority2, 0);
+ EndPoint target3 = new EndPoint(account, authority3, 0);
+ EndPoint target4 = new EndPoint(account, authority3, 1);
+
+ PeriodicSync sync1 = new PeriodicSync(account, authority1, Bundle.EMPTY, dayPoll, dayFuzz);
+ PeriodicSync sync2 = new PeriodicSync(account, authority2, Bundle.EMPTY, dayPoll, dayFuzz);
+ PeriodicSync sync3 = new PeriodicSync(account, authority3, Bundle.EMPTY, dayPoll, dayFuzz);
+ PeriodicSync sync1s = new PeriodicSync(account, authority1, Bundle.EMPTY, thousandSecs,
+ thousandSecsFuzz);
+ PeriodicSync sync2s = new PeriodicSync(account, authority2, Bundle.EMPTY, thousandSecs,
+ thousandSecsFuzz);
+ PeriodicSync sync3s = new PeriodicSync(account, authority3, Bundle.EMPTY, thousandSecs,
+ thousandSecsFuzz);
byte[] accountsFileData = ("<?xml version='1.0' encoding='utf-8' standalone='yes' ?>\n"
+ "<accounts version=\"2\" >\n"
@@ -378,21 +525,22 @@ public class SyncStorageEngineTest extends AndroidTestCase {
fos.write(accountsFileData);
accountInfoFile.finishWrite(fos);
- SyncStorageEngine engine = SyncStorageEngine.newTestInstance(testContext);
+ engine.clearAndReadState();
- List<PeriodicSync> syncs = engine.getPeriodicSyncs(account, 0, authority1);
+ List<PeriodicSync> syncs = engine.getPeriodicSyncs(target1);
assertEquals("Got incorrect # of syncs", 1, syncs.size());
assertEquals(sync1, syncs.get(0));
- syncs = engine.getPeriodicSyncs(account, 0, authority2);
+ syncs = engine.getPeriodicSyncs(target2);
assertEquals(1, syncs.size());
assertEquals(sync2, syncs.get(0));
- syncs = engine.getPeriodicSyncs(account, 0, authority3);
+ syncs = engine.getPeriodicSyncs(target3);
assertEquals(1, syncs.size());
assertEquals(sync3, syncs.get(0));
- syncs = engine.getPeriodicSyncs(account, 1, authority3);
+ syncs = engine.getPeriodicSyncs(target4);
+
assertEquals(1, syncs.size());
assertEquals(sync3, syncs.get(0));
@@ -411,13 +559,13 @@ public class SyncStorageEngineTest extends AndroidTestCase {
engine.clearAndReadState();
- syncs = engine.getPeriodicSyncs(account, 0, authority1);
+ syncs = engine.getPeriodicSyncs(target1);
assertEquals(0, syncs.size());
- syncs = engine.getPeriodicSyncs(account, 0, authority2);
+ syncs = engine.getPeriodicSyncs(target2);
assertEquals(0, syncs.size());
- syncs = engine.getPeriodicSyncs(account, 0, authority3);
+ syncs = engine.getPeriodicSyncs(target3);
assertEquals(0, syncs.size());
accountsFileData = ("<?xml version='1.0' encoding='utf-8' standalone='yes' ?>\n"
@@ -440,15 +588,15 @@ public class SyncStorageEngineTest extends AndroidTestCase {
engine.clearAndReadState();
- syncs = engine.getPeriodicSyncs(account, 0, authority1);
+ syncs = engine.getPeriodicSyncs(target1);
assertEquals(1, syncs.size());
assertEquals(sync1s, syncs.get(0));
- syncs = engine.getPeriodicSyncs(account, 0, authority2);
+ syncs = engine.getPeriodicSyncs(target2);
assertEquals(1, syncs.size());
assertEquals(sync2s, syncs.get(0));
- syncs = engine.getPeriodicSyncs(account, 0, authority3);
+ syncs = engine.getPeriodicSyncs(target3);
assertEquals(1, syncs.size());
assertEquals(sync3s, syncs.get(0));
}
@@ -460,6 +608,12 @@ public class SyncStorageEngineTest extends AndroidTestCase {
final String authority2 = "auth2";
final String authority3 = "auth3";
final Bundle extras = new Bundle();
+
+ EndPoint target1 = new EndPoint(account, authority1, 0);
+ EndPoint target2 = new EndPoint(account, authority2, 0);
+ EndPoint target3 = new EndPoint(account, authority3, 0);
+ EndPoint target4 = new EndPoint(account, authority3, 1);
+
PeriodicSync sync1 = new PeriodicSync(account, authority1, extras, (long) (60 * 60 * 24));
PeriodicSync sync2 = new PeriodicSync(account, authority2, extras, (long) (60 * 60 * 24));
PeriodicSync sync3 = new PeriodicSync(account, authority3, extras, (long) (60 * 60 * 24));
@@ -488,19 +642,20 @@ public class SyncStorageEngineTest extends AndroidTestCase {
SyncStorageEngine engine = SyncStorageEngine.newTestInstance(testContext);
- List<PeriodicSync> syncs = engine.getPeriodicSyncs(account, 0, authority1);
+ List<PeriodicSync> syncs = engine.getPeriodicSyncs(target1);
assertEquals(1, syncs.size());
assertEquals("expected sync1: " + sync1.toString() + " == sync 2" + syncs.get(0).toString(), sync1, syncs.get(0));
- syncs = engine.getPeriodicSyncs(account, 0, authority2);
+ syncs = engine.getPeriodicSyncs(target2);
assertEquals(1, syncs.size());
assertEquals(sync2, syncs.get(0));
- syncs = engine.getPeriodicSyncs(account, 0, authority3);
+ syncs = engine.getPeriodicSyncs(target3);
assertEquals(1, syncs.size());
assertEquals(sync3, syncs.get(0));
+ syncs = engine.getPeriodicSyncs(target4);
+
- syncs = engine.getPeriodicSyncs(account, 1, authority3);
assertEquals(1, syncs.size());
assertEquals(sync3, syncs.get(0));
@@ -518,13 +673,13 @@ public class SyncStorageEngineTest extends AndroidTestCase {
engine.clearAndReadState();
- syncs = engine.getPeriodicSyncs(account, 0, authority1);
+ syncs = engine.getPeriodicSyncs(target1);
assertEquals(0, syncs.size());
- syncs = engine.getPeriodicSyncs(account, 0, authority2);
+ syncs = engine.getPeriodicSyncs(target2);
assertEquals(0, syncs.size());
- syncs = engine.getPeriodicSyncs(account, 0, authority3);
+ syncs = engine.getPeriodicSyncs(target3);
assertEquals(0, syncs.size());
accountsFileData = ("<?xml version='1.0' encoding='utf-8' standalone='yes' ?>\n"
@@ -547,15 +702,15 @@ public class SyncStorageEngineTest extends AndroidTestCase {
engine.clearAndReadState();
- syncs = engine.getPeriodicSyncs(account, 0, authority1);
+ syncs = engine.getPeriodicSyncs(target1);
assertEquals(1, syncs.size());
assertEquals(sync1s, syncs.get(0));
- syncs = engine.getPeriodicSyncs(account, 0, authority2);
+ syncs = engine.getPeriodicSyncs(target2);
assertEquals(1, syncs.size());
assertEquals(sync2s, syncs.get(0));
- syncs = engine.getPeriodicSyncs(account, 0, authority3);
+ syncs = engine.getPeriodicSyncs(target3);
assertEquals(1, syncs.size());
assertEquals(sync3s, syncs.get(0));
}
diff --git a/test-runner/src/android/test/ServiceTestCase.java b/test-runner/src/android/test/ServiceTestCase.java
index d8ced38..ad90fc6 100644
--- a/test-runner/src/android/test/ServiceTestCase.java
+++ b/test-runner/src/android/test/ServiceTestCase.java
@@ -263,6 +263,7 @@ public abstract class ServiceTestCase<T extends Service> extends AndroidTestCase
}
if (mServiceCreated) {
mService.onDestroy();
+ mServiceCreated = false;
}
}
diff --git a/tests/BiDiTests/src/com/android/bidi/BiDiTestGridLayoutCodeLtr.java b/tests/BiDiTests/src/com/android/bidi/BiDiTestGridLayoutCodeLtr.java
index 2b5e674..ea08a6a 100644
--- a/tests/BiDiTests/src/com/android/bidi/BiDiTestGridLayoutCodeLtr.java
+++ b/tests/BiDiTests/src/com/android/bidi/BiDiTestGridLayoutCodeLtr.java
@@ -22,11 +22,25 @@ import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.FrameLayout;
import android.widget.GridLayout;
-import android.widget.*;
+import android.widget.Space;
+import android.widget.TextView;
-import static android.text.InputType.*;
-import static android.widget.GridLayout.*;
+import static android.text.InputType.TYPE_CLASS_TEXT;
+import static android.text.InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS;
+import static android.text.InputType.TYPE_TEXT_VARIATION_PASSWORD;
+import static android.widget.GridLayout.ALIGN_BOUNDS;
+import static android.widget.GridLayout.BASELINE;
+import static android.widget.GridLayout.CENTER;
+import static android.widget.GridLayout.FILL;
+import static android.widget.GridLayout.LEFT;
+import static android.widget.GridLayout.RIGHT;
+import static android.widget.GridLayout.START;
+import static android.widget.GridLayout.Spec;
+import static android.widget.GridLayout.spec;
public class BiDiTestGridLayoutCodeLtr extends Fragment {
diff --git a/tests/BiDiTests/src/com/android/bidi/BiDiTestGridLayoutCodeRtl.java b/tests/BiDiTests/src/com/android/bidi/BiDiTestGridLayoutCodeRtl.java
index 3a03c6c..fc3a92c 100644
--- a/tests/BiDiTests/src/com/android/bidi/BiDiTestGridLayoutCodeRtl.java
+++ b/tests/BiDiTests/src/com/android/bidi/BiDiTestGridLayoutCodeRtl.java
@@ -22,11 +22,25 @@ import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.FrameLayout;
import android.widget.GridLayout;
-import android.widget.*;
+import android.widget.Space;
+import android.widget.TextView;
-import static android.text.InputType.*;
-import static android.widget.GridLayout.*;
+import static android.text.InputType.TYPE_CLASS_TEXT;
+import static android.text.InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS;
+import static android.text.InputType.TYPE_TEXT_VARIATION_PASSWORD;
+import static android.widget.GridLayout.ALIGN_BOUNDS;
+import static android.widget.GridLayout.BASELINE;
+import static android.widget.GridLayout.CENTER;
+import static android.widget.GridLayout.FILL;
+import static android.widget.GridLayout.LEFT;
+import static android.widget.GridLayout.RIGHT;
+import static android.widget.GridLayout.START;
+import static android.widget.GridLayout.Spec;
+import static android.widget.GridLayout.spec;
public class BiDiTestGridLayoutCodeRtl extends Fragment {
diff --git a/tests/GridLayoutTest/src/com/android/test/layout/AbstractLayoutTest.java b/tests/GridLayoutTest/src/com/android/test/layout/AbstractLayoutTest.java
index 4d3a843..196a5c1 100644
--- a/tests/GridLayoutTest/src/com/android/test/layout/AbstractLayoutTest.java
+++ b/tests/GridLayoutTest/src/com/android/test/layout/AbstractLayoutTest.java
@@ -24,7 +24,13 @@ import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
-import static android.view.Gravity.*;
+import static android.view.Gravity.BOTTOM;
+import static android.view.Gravity.CENTER;
+import static android.view.Gravity.FILL;
+import static android.view.Gravity.LEFT;
+import static android.view.Gravity.NO_GRAVITY;
+import static android.view.Gravity.RIGHT;
+import static android.view.Gravity.TOP;
public abstract class AbstractLayoutTest extends Activity {
diff --git a/tests/GridLayoutTest/src/com/android/test/layout/AlignmentTest.java b/tests/GridLayoutTest/src/com/android/test/layout/AlignmentTest.java
index b1c4486..5559707 100644
--- a/tests/GridLayoutTest/src/com/android/test/layout/AlignmentTest.java
+++ b/tests/GridLayoutTest/src/com/android/test/layout/AlignmentTest.java
@@ -20,15 +20,25 @@ import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
+import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.GridLayout;
+import android.widget.GridLayout.Alignment;
+import android.widget.GridLayout.LayoutParams;
import android.widget.TextView;
-import static android.widget.GridLayout.*;
+import static android.widget.GridLayout.BASELINE;
+import static android.widget.GridLayout.BOTTOM;
+import static android.widget.GridLayout.CENTER;
+import static android.widget.GridLayout.FILL;
+import static android.widget.GridLayout.LEFT;
+import static android.widget.GridLayout.RIGHT;
+import static android.widget.GridLayout.TOP;
+import static android.widget.GridLayout.spec;
-public class AlignmentTest extends Activity {
+public class AlignmentTest extends Activity {
public static final String[] HORIZONTAL_NAMES = {"LEFT", "center", "east", "fill"};
public static final Alignment[] HORIZONTAL_ALIGNMENTS = {LEFT, CENTER, RIGHT, FILL};
diff --git a/tests/GridLayoutTest/src/com/android/test/layout/GridLayoutTest.java b/tests/GridLayoutTest/src/com/android/test/layout/GridLayoutTest.java
index 4ce449a..8047c5f 100644
--- a/tests/GridLayoutTest/src/com/android/test/layout/GridLayoutTest.java
+++ b/tests/GridLayoutTest/src/com/android/test/layout/GridLayoutTest.java
@@ -21,7 +21,10 @@ import android.view.View;
import android.view.ViewGroup;
import android.widget.GridLayout;
-import static android.widget.GridLayout.*;
+import static android.widget.GridLayout.Spec;
+import static android.widget.GridLayout.UNDEFINED;
+import static android.widget.GridLayout.VERTICAL;
+import static android.widget.GridLayout.spec;
public class GridLayoutTest extends AbstractLayoutTest {
public ViewGroup create(Context context) {
diff --git a/tests/GridLayoutTest/src/com/android/test/layout/LinearLayoutTest.java b/tests/GridLayoutTest/src/com/android/test/layout/LinearLayoutTest.java
index c7f4665..dc5b12c 100644
--- a/tests/GridLayoutTest/src/com/android/test/layout/LinearLayoutTest.java
+++ b/tests/GridLayoutTest/src/com/android/test/layout/LinearLayoutTest.java
@@ -20,9 +20,9 @@ import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
+import android.widget.LinearLayout.LayoutParams;
-import static android.widget.LinearLayout.*;
-import static android.widget.LinearLayout.LayoutParams.*;
+import static android.widget.LinearLayout.LayoutParams.WRAP_CONTENT;
public class LinearLayoutTest extends AbstractLayoutTest {
public ViewGroup create(Context context) {
diff --git a/tests/HwAccelerationTest/AndroidManifest.xml b/tests/HwAccelerationTest/AndroidManifest.xml
index 1bb0db0..6f774f8 100644
--- a/tests/HwAccelerationTest/AndroidManifest.xml
+++ b/tests/HwAccelerationTest/AndroidManifest.xml
@@ -706,6 +706,15 @@
</activity>
<activity
+ android:name="ColorFiltersMutateActivity"
+ android:label="ColorFilters/Mutate Filters">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="com.android.test.hwui.TEST" />
+ </intent-filter>
+ </activity>
+
+ <activity
android:name="LinesActivity"
android:label="Draw/Lines">
<intent-filter>
diff --git a/tests/HwAccelerationTest/src/com/android/test/hwui/ColorFiltersMutateActivity.java b/tests/HwAccelerationTest/src/com/android/test/hwui/ColorFiltersMutateActivity.java
new file mode 100644
index 0000000..808b5d3
--- /dev/null
+++ b/tests/HwAccelerationTest/src/com/android/test/hwui/ColorFiltersMutateActivity.java
@@ -0,0 +1,180 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.test.hwui;
+
+import android.animation.ArgbEvaluator;
+import android.animation.ObjectAnimator;
+import android.app.Activity;
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.Canvas;
+import android.graphics.ColorMatrix;
+import android.graphics.ColorMatrixColorFilter;
+import android.graphics.LightingColorFilter;
+import android.graphics.Paint;
+import android.graphics.PorterDuff;
+import android.graphics.PorterDuffColorFilter;
+import android.os.Bundle;
+import android.view.View;
+
+@SuppressWarnings({"UnusedDeclaration"})
+public class ColorFiltersMutateActivity extends Activity {
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ final BitmapsView view = new BitmapsView(this);
+ setContentView(view);
+ }
+
+ static class BitmapsView extends View {
+ private final Bitmap mBitmap1;
+ private final Bitmap mBitmap2;
+ private final Paint mColorMatrixPaint;
+ private final Paint mLightingPaint;
+ private final Paint mBlendPaint;
+
+ private float mSaturation = 0.0f;
+ private int mLightAdd = 0;
+ private int mLightMul = 0;
+ private int mPorterDuffColor = 0;
+
+ BitmapsView(Context c) {
+ super(c);
+
+ mBitmap1 = BitmapFactory.decodeResource(c.getResources(), R.drawable.sunset1);
+ mBitmap2 = BitmapFactory.decodeResource(c.getResources(), R.drawable.sunset2);
+
+ mColorMatrixPaint = new Paint();
+ final ColorMatrix colorMatrix = new ColorMatrix();
+ colorMatrix.setSaturation(0);
+ mColorMatrixPaint.setColorFilter(new ColorMatrixColorFilter(colorMatrix));
+
+ mLightingPaint = new Paint();
+ mLightingPaint.setColorFilter(new LightingColorFilter(0, 0));
+
+ mBlendPaint = new Paint();
+ mBlendPaint.setColorFilter(new PorterDuffColorFilter(0, PorterDuff.Mode.SRC_OVER));
+
+ ObjectAnimator sat = ObjectAnimator.ofFloat(this, "saturation", 1.0f);
+ sat.setDuration(1000);
+ sat.setRepeatCount(ObjectAnimator.INFINITE);
+ sat.setRepeatMode(ObjectAnimator.REVERSE);
+ sat.start();
+
+ ObjectAnimator light = ObjectAnimator.ofInt(this, "lightAdd", 0x00101030);
+ light.setEvaluator(new ArgbEvaluator());
+ light.setDuration(1000);
+ light.setRepeatCount(ObjectAnimator.INFINITE);
+ light.setRepeatMode(ObjectAnimator.REVERSE);
+ light.start();
+
+ ObjectAnimator mult = ObjectAnimator.ofInt(this, "lightMul", 0x0060ffff);
+ mult.setEvaluator(new ArgbEvaluator());
+ mult.setDuration(1000);
+ mult.setRepeatCount(ObjectAnimator.INFINITE);
+ mult.setRepeatMode(ObjectAnimator.REVERSE);
+ mult.start();
+
+ ObjectAnimator color = ObjectAnimator.ofInt(this, "porterDuffColor", 0x7f990040);
+ color.setEvaluator(new ArgbEvaluator());
+ color.setDuration(1000);
+ color.setRepeatCount(ObjectAnimator.INFINITE);
+ color.setRepeatMode(ObjectAnimator.REVERSE);
+ color.start();
+ }
+
+ public int getPorterDuffColor() {
+ return mPorterDuffColor;
+ }
+
+ public void setPorterDuffColor(int porterDuffColor) {
+ mPorterDuffColor = porterDuffColor;
+ final PorterDuffColorFilter filter =
+ (PorterDuffColorFilter) mBlendPaint.getColorFilter();
+ filter.setColor(mPorterDuffColor);
+ invalidate();
+ }
+
+ public int getLightAdd() {
+ return mLightAdd;
+ }
+
+ public void setLightAdd(int lightAdd) {
+ mLightAdd = lightAdd;
+ final LightingColorFilter filter =
+ (LightingColorFilter) mLightingPaint.getColorFilter();
+ filter.setColorAdd(lightAdd);
+ invalidate();
+ }
+
+ public int getLightMul() {
+ return mLightAdd;
+ }
+
+ public void setLightMul(int lightMul) {
+ mLightMul = lightMul;
+ final LightingColorFilter filter =
+ (LightingColorFilter) mLightingPaint.getColorFilter();
+ filter.setColorMultiply(lightMul);
+ invalidate();
+ }
+
+ public void setSaturation(float saturation) {
+ mSaturation = saturation;
+ final ColorMatrixColorFilter filter =
+ (ColorMatrixColorFilter) mColorMatrixPaint.getColorFilter();
+ final ColorMatrix m = filter.getColorMatrix();
+ m.setSaturation(saturation);
+ filter.setColorMatrix(m);
+ invalidate();
+ }
+
+ public float getSaturation() {
+ return mSaturation;
+ }
+
+ @Override
+ protected void onDraw(Canvas canvas) {
+ super.onDraw(canvas);
+
+ canvas.drawARGB(255, 255, 255, 255);
+
+ canvas.save();
+ canvas.translate(120.0f, 50.0f);
+ canvas.drawBitmap(mBitmap1, 0.0f, 0.0f, mColorMatrixPaint);
+
+ canvas.translate(0.0f, 50.0f + mBitmap1.getHeight());
+ canvas.drawBitmap(mBitmap1, 0.0f, 0.0f, mLightingPaint);
+
+ canvas.translate(0.0f, 50.0f + mBitmap1.getHeight());
+ canvas.drawBitmap(mBitmap1, 0.0f, 0.0f, mBlendPaint);
+ canvas.restore();
+
+ canvas.save();
+ canvas.translate(120.0f + mBitmap1.getWidth() + 120.0f, 50.0f);
+ canvas.drawBitmap(mBitmap2, 0.0f, 0.0f, mColorMatrixPaint);
+
+ canvas.translate(0.0f, 50.0f + mBitmap2.getHeight());
+ canvas.drawBitmap(mBitmap2, 0.0f, 0.0f, mLightingPaint);
+
+ canvas.translate(0.0f, 50.0f + mBitmap2.getHeight());
+ canvas.drawBitmap(mBitmap2, 0.0f, 0.0f, mBlendPaint);
+ canvas.restore();
+ }
+ }
+}
diff --git a/tools/aapt/AaptAssets.cpp b/tools/aapt/AaptAssets.cpp
deleted file mode 100644
index d8e113a..0000000
--- a/tools/aapt/AaptAssets.cpp
+++ /dev/null
@@ -1,2726 +0,0 @@
-//
-// Copyright 2006 The Android Open Source Project
-//
-
-#include "AaptAssets.h"
-#include "ResourceFilter.h"
-#include "Main.h"
-
-#include <utils/misc.h>
-#include <utils/SortedVector.h>
-
-#include <ctype.h>
-#include <dirent.h>
-#include <errno.h>
-
-static const char* kDefaultLocale = "default";
-static const char* kWildcardName = "any";
-static const char* kAssetDir = "assets";
-static const char* kResourceDir = "res";
-static const char* kValuesDir = "values";
-static const char* kMipmapDir = "mipmap";
-static const char* kInvalidChars = "/\\:";
-static const size_t kMaxAssetFileName = 100;
-
-static const String8 kResString(kResourceDir);
-
-/*
- * Names of asset files must meet the following criteria:
- *
- * - the filename length must be less than kMaxAssetFileName bytes long
- * (and can't be empty)
- * - all characters must be 7-bit printable ASCII
- * - none of { '/' '\\' ':' }
- *
- * Pass in just the filename, not the full path.
- */
-static bool validateFileName(const char* fileName)
-{
- const char* cp = fileName;
- size_t len = 0;
-
- while (*cp != '\0') {
- if ((*cp & 0x80) != 0)
- return false; // reject high ASCII
- if (*cp < 0x20 || *cp >= 0x7f)
- return false; // reject control chars and 0x7f
- if (strchr(kInvalidChars, *cp) != NULL)
- return false; // reject path sep chars
- cp++;
- len++;
- }
-
- if (len < 1 || len > kMaxAssetFileName)
- return false; // reject empty or too long
-
- return true;
-}
-
-// The default to use if no other ignore pattern is defined.
-const char * const gDefaultIgnoreAssets =
- "!.svn:!.git:!.ds_store:!*.scc:.*:<dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~";
-// The ignore pattern that can be passed via --ignore-assets in Main.cpp
-const char * gUserIgnoreAssets = NULL;
-
-static bool isHidden(const char *root, const char *path)
-{
- // Patterns syntax:
- // - Delimiter is :
- // - Entry can start with the flag ! to avoid printing a warning
- // about the file being ignored.
- // - Entry can have the flag "<dir>" to match only directories
- // or <file> to match only files. Default is to match both.
- // - Entry can be a simplified glob "<prefix>*" or "*<suffix>"
- // where prefix/suffix must have at least 1 character (so that
- // we don't match a '*' catch-all pattern.)
- // - The special filenames "." and ".." are always ignored.
- // - Otherwise the full string is matched.
- // - match is not case-sensitive.
-
- if (strcmp(path, ".") == 0 || strcmp(path, "..") == 0) {
- return true;
- }
-
- const char *delim = ":";
- const char *p = gUserIgnoreAssets;
- if (!p || !p[0]) {
- p = getenv("ANDROID_AAPT_IGNORE");
- }
- if (!p || !p[0]) {
- p = gDefaultIgnoreAssets;
- }
- char *patterns = strdup(p);
-
- bool ignore = false;
- bool chatty = true;
- char *matchedPattern = NULL;
-
- String8 fullPath(root);
- fullPath.appendPath(path);
- FileType type = getFileType(fullPath);
-
- int plen = strlen(path);
-
- // Note: we don't have strtok_r under mingw.
- for(char *token = strtok(patterns, delim);
- !ignore && token != NULL;
- token = strtok(NULL, delim)) {
- chatty = token[0] != '!';
- if (!chatty) token++; // skip !
- if (strncasecmp(token, "<dir>" , 5) == 0) {
- if (type != kFileTypeDirectory) continue;
- token += 5;
- }
- if (strncasecmp(token, "<file>", 6) == 0) {
- if (type != kFileTypeRegular) continue;
- token += 6;
- }
-
- matchedPattern = token;
- int n = strlen(token);
-
- if (token[0] == '*') {
- // Match *suffix
- token++;
- n--;
- if (n <= plen) {
- ignore = strncasecmp(token, path + plen - n, n) == 0;
- }
- } else if (n > 1 && token[n - 1] == '*') {
- // Match prefix*
- ignore = strncasecmp(token, path, n - 1) == 0;
- } else {
- ignore = strcasecmp(token, path) == 0;
- }
- }
-
- if (ignore && chatty) {
- fprintf(stderr, " (skipping %s '%s' due to ANDROID_AAPT_IGNORE pattern '%s')\n",
- type == kFileTypeDirectory ? "dir" : "file",
- path,
- matchedPattern ? matchedPattern : "");
- }
-
- free(patterns);
- return ignore;
-}
-
-// =========================================================================
-// =========================================================================
-// =========================================================================
-
-status_t
-AaptGroupEntry::parseNamePart(const String8& part, int* axis, uint32_t* value)
-{
- ResTable_config config;
-
- // IMSI - MCC
- if (getMccName(part.string(), &config)) {
- *axis = AXIS_MCC;
- *value = config.mcc;
- return 0;
- }
-
- // IMSI - MNC
- if (getMncName(part.string(), &config)) {
- *axis = AXIS_MNC;
- *value = config.mnc;
- return 0;
- }
-
- // locale - language
- if (part.length() == 2 && isalpha(part[0]) && isalpha(part[1])) {
- *axis = AXIS_LANGUAGE;
- *value = part[1] << 8 | part[0];
- return 0;
- }
-
- // locale - language_REGION
- if (part.length() == 5 && isalpha(part[0]) && isalpha(part[1])
- && part[2] == '_' && isalpha(part[3]) && isalpha(part[4])) {
- *axis = AXIS_LANGUAGE;
- *value = (part[4] << 24) | (part[3] << 16) | (part[1] << 8) | (part[0]);
- return 0;
- }
-
- // layout direction
- if (getLayoutDirectionName(part.string(), &config)) {
- *axis = AXIS_LAYOUTDIR;
- *value = (config.screenLayout&ResTable_config::MASK_LAYOUTDIR);
- return 0;
- }
-
- // smallest screen dp width
- if (getSmallestScreenWidthDpName(part.string(), &config)) {
- *axis = AXIS_SMALLESTSCREENWIDTHDP;
- *value = config.smallestScreenWidthDp;
- return 0;
- }
-
- // screen dp width
- if (getScreenWidthDpName(part.string(), &config)) {
- *axis = AXIS_SCREENWIDTHDP;
- *value = config.screenWidthDp;
- return 0;
- }
-
- // screen dp height
- if (getScreenHeightDpName(part.string(), &config)) {
- *axis = AXIS_SCREENHEIGHTDP;
- *value = config.screenHeightDp;
- return 0;
- }
-
- // screen layout size
- if (getScreenLayoutSizeName(part.string(), &config)) {
- *axis = AXIS_SCREENLAYOUTSIZE;
- *value = (config.screenLayout&ResTable_config::MASK_SCREENSIZE);
- return 0;
- }
-
- // screen layout long
- if (getScreenLayoutLongName(part.string(), &config)) {
- *axis = AXIS_SCREENLAYOUTLONG;
- *value = (config.screenLayout&ResTable_config::MASK_SCREENLONG);
- return 0;
- }
-
- // orientation
- if (getOrientationName(part.string(), &config)) {
- *axis = AXIS_ORIENTATION;
- *value = config.orientation;
- return 0;
- }
-
- // ui mode type
- if (getUiModeTypeName(part.string(), &config)) {
- *axis = AXIS_UIMODETYPE;
- *value = (config.uiMode&ResTable_config::MASK_UI_MODE_TYPE);
- return 0;
- }
-
- // ui mode night
- if (getUiModeNightName(part.string(), &config)) {
- *axis = AXIS_UIMODENIGHT;
- *value = (config.uiMode&ResTable_config::MASK_UI_MODE_NIGHT);
- return 0;
- }
-
- // density
- if (getDensityName(part.string(), &config)) {
- *axis = AXIS_DENSITY;
- *value = config.density;
- return 0;
- }
-
- // touchscreen
- if (getTouchscreenName(part.string(), &config)) {
- *axis = AXIS_TOUCHSCREEN;
- *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 hidden
- if (getNavHiddenName(part.string(), &config)) {
- *axis = AXIS_NAVHIDDEN;
- *value = config.inputFlags;
- 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;
- *value = config.screenSize;
- return 0;
- }
-
- // version
- if (getVersionName(part.string(), &config)) {
- *axis = AXIS_VERSION;
- *value = config.version;
- return 0;
- }
-
- return 1;
-}
-
-uint32_t
-AaptGroupEntry::getConfigValueForAxis(const ResTable_config& config, int axis)
-{
- switch (axis) {
- case AXIS_MCC:
- return config.mcc;
- case AXIS_MNC:
- return config.mnc;
- case AXIS_LANGUAGE:
- return (((uint32_t)config.country[1]) << 24) | (((uint32_t)config.country[0]) << 16)
- | (((uint32_t)config.language[1]) << 8) | (config.language[0]);
- case AXIS_LAYOUTDIR:
- return config.screenLayout&ResTable_config::MASK_LAYOUTDIR;
- case AXIS_SCREENLAYOUTSIZE:
- return config.screenLayout&ResTable_config::MASK_SCREENSIZE;
- case AXIS_ORIENTATION:
- return config.orientation;
- case AXIS_UIMODETYPE:
- return (config.uiMode&ResTable_config::MASK_UI_MODE_TYPE);
- case AXIS_UIMODENIGHT:
- return (config.uiMode&ResTable_config::MASK_UI_MODE_NIGHT);
- case AXIS_DENSITY:
- return config.density;
- case AXIS_TOUCHSCREEN:
- return config.touchscreen;
- case AXIS_KEYSHIDDEN:
- return config.inputFlags;
- case AXIS_KEYBOARD:
- return config.keyboard;
- case AXIS_NAVIGATION:
- return config.navigation;
- case AXIS_SCREENSIZE:
- return config.screenSize;
- case AXIS_SMALLESTSCREENWIDTHDP:
- return config.smallestScreenWidthDp;
- case AXIS_SCREENWIDTHDP:
- return config.screenWidthDp;
- case AXIS_SCREENHEIGHTDP:
- return config.screenHeightDp;
- case AXIS_VERSION:
- return config.version;
- }
- return 0;
-}
-
-bool
-AaptGroupEntry::configSameExcept(const ResTable_config& config,
- const ResTable_config& otherConfig, int axis)
-{
- for (int i=AXIS_START; i<=AXIS_END; i++) {
- if (i == axis) {
- continue;
- }
- if (getConfigValueForAxis(config, i) != getConfigValueForAxis(otherConfig, i)) {
- return false;
- }
- }
- return true;
-}
-
-bool
-AaptGroupEntry::initFromDirName(const char* dir, String8* resType)
-{
- mParamsChanged = true;
-
- Vector<String8> parts;
-
- String8 mcc, mnc, loc, layoutsize, layoutlong, orient, den;
- String8 touch, key, keysHidden, nav, navHidden, size, layoutDir, vers;
- String8 uiModeType, uiModeNight, smallestwidthdp, widthdp, heightdp;
-
- const char *p = dir;
- const char *q;
- while (NULL != (q = strchr(p, '-'))) {
- String8 val(p, q-p);
- val.toLower();
- parts.add(val);
- //printf("part: %s\n", parts[parts.size()-1].string());
- p = q+1;
- }
- String8 val(p);
- val.toLower();
- parts.add(val);
- //printf("part: %s\n", parts[parts.size()-1].string());
-
- const int N = parts.size();
- int index = 0;
- String8 part = parts[index];
-
- // resource type
- if (!isValidResourceType(part)) {
- return false;
- }
- *resType = part;
-
- index++;
- if (index == N) {
- goto success;
- }
- part = parts[index];
-
- // imsi - mcc
- if (getMccName(part.string())) {
- mcc = part;
-
- index++;
- if (index == N) {
- goto success;
- }
- part = parts[index];
- } else {
- //printf("not mcc: %s\n", part.string());
- }
-
- // imsi - mnc
- if (getMncName(part.string())) {
- mnc = part;
-
- index++;
- if (index == N) {
- goto success;
- }
- part = parts[index];
- } else {
- //printf("not mcc: %s\n", part.string());
- }
-
- // locale - language
- if (part.length() == 2 && isalpha(part[0]) && isalpha(part[1])) {
- loc = part;
-
- index++;
- if (index == N) {
- goto success;
- }
- part = parts[index];
- } else {
- //printf("not language: %s\n", part.string());
- }
-
- // locale - region
- if (loc.length() > 0
- && part.length() == 3 && part[0] == 'r' && part[0] && part[1]) {
- loc += "-";
- part.toUpper();
- loc += part.string() + 1;
-
- index++;
- if (index == N) {
- goto success;
- }
- part = parts[index];
- } else {
- //printf("not region: %s\n", part.string());
- }
-
- if (getLayoutDirectionName(part.string())) {
- layoutDir = part;
-
- index++;
- if (index == N) {
- goto success;
- }
- part = parts[index];
- } else {
- //printf("not layout direction: %s\n", part.string());
- }
-
- if (getSmallestScreenWidthDpName(part.string())) {
- smallestwidthdp = part;
-
- index++;
- if (index == N) {
- goto success;
- }
- part = parts[index];
- } else {
- //printf("not smallest screen width dp: %s\n", part.string());
- }
-
- if (getScreenWidthDpName(part.string())) {
- widthdp = part;
-
- index++;
- if (index == N) {
- goto success;
- }
- part = parts[index];
- } else {
- //printf("not screen width dp: %s\n", part.string());
- }
-
- if (getScreenHeightDpName(part.string())) {
- heightdp = part;
-
- index++;
- if (index == N) {
- goto success;
- }
- part = parts[index];
- } else {
- //printf("not screen height dp: %s\n", part.string());
- }
-
- if (getScreenLayoutSizeName(part.string())) {
- layoutsize = part;
-
- index++;
- if (index == N) {
- goto success;
- }
- part = parts[index];
- } else {
- //printf("not screen layout size: %s\n", part.string());
- }
-
- if (getScreenLayoutLongName(part.string())) {
- layoutlong = part;
-
- index++;
- if (index == N) {
- goto success;
- }
- part = parts[index];
- } else {
- //printf("not screen layout long: %s\n", part.string());
- }
-
- // orientation
- if (getOrientationName(part.string())) {
- orient = part;
-
- index++;
- if (index == N) {
- goto success;
- }
- part = parts[index];
- } else {
- //printf("not orientation: %s\n", part.string());
- }
-
- // ui mode type
- if (getUiModeTypeName(part.string())) {
- uiModeType = part;
-
- index++;
- if (index == N) {
- goto success;
- }
- part = parts[index];
- } else {
- //printf("not ui mode type: %s\n", part.string());
- }
-
- // ui mode night
- if (getUiModeNightName(part.string())) {
- uiModeNight = part;
-
- index++;
- if (index == N) {
- goto success;
- }
- part = parts[index];
- } else {
- //printf("not ui mode night: %s\n", part.string());
- }
-
- // density
- if (getDensityName(part.string())) {
- den = part;
-
- index++;
- if (index == N) {
- goto success;
- }
- part = parts[index];
- } else {
- //printf("not density: %s\n", part.string());
- }
-
- // touchscreen
- if (getTouchscreenName(part.string())) {
- touch = part;
-
- index++;
- if (index == N) {
- goto success;
- }
- part = parts[index];
- } else {
- //printf("not touchscreen: %s\n", part.string());
- }
-
- // keyboard hidden
- if (getKeysHiddenName(part.string())) {
- keysHidden = part;
-
- index++;
- if (index == N) {
- goto success;
- }
- part = parts[index];
- } else {
- //printf("not keysHidden: %s\n", part.string());
- }
-
- // keyboard
- if (getKeyboardName(part.string())) {
- key = part;
-
- index++;
- if (index == N) {
- goto success;
- }
- part = parts[index];
- } else {
- //printf("not keyboard: %s\n", part.string());
- }
-
- // navigation hidden
- if (getNavHiddenName(part.string())) {
- navHidden = part;
-
- index++;
- if (index == N) {
- goto success;
- }
- part = parts[index];
- } else {
- //printf("not navHidden: %s\n", part.string());
- }
-
- if (getNavigationName(part.string())) {
- nav = part;
-
- index++;
- if (index == N) {
- goto success;
- }
- part = parts[index];
- } else {
- //printf("not navigation: %s\n", part.string());
- }
-
- if (getScreenSizeName(part.string())) {
- size = part;
-
- index++;
- if (index == N) {
- goto success;
- }
- part = parts[index];
- } else {
- //printf("not screen size: %s\n", part.string());
- }
-
- if (getVersionName(part.string())) {
- vers = part;
-
- index++;
- if (index == N) {
- goto success;
- }
- part = parts[index];
- } else {
- //printf("not version: %s\n", part.string());
- }
-
- // if there are extra parts, it doesn't match
- return false;
-
-success:
- this->mcc = mcc;
- this->mnc = mnc;
- this->locale = loc;
- this->screenLayoutSize = layoutsize;
- this->screenLayoutLong = layoutlong;
- this->smallestScreenWidthDp = smallestwidthdp;
- this->screenWidthDp = widthdp;
- this->screenHeightDp = heightdp;
- this->orientation = orient;
- this->uiModeType = uiModeType;
- this->uiModeNight = uiModeNight;
- this->density = den;
- this->touchscreen = touch;
- this->keysHidden = keysHidden;
- this->keyboard = key;
- this->navHidden = navHidden;
- this->navigation = nav;
- this->screenSize = size;
- this->layoutDirection = layoutDir;
- this->version = vers;
-
- // what is this anyway?
- this->vendor = "";
-
- return true;
-}
-
-String8
-AaptGroupEntry::toString() const
-{
- String8 s = this->mcc;
- s += ",";
- s += this->mnc;
- s += ",";
- s += this->locale;
- s += ",";
- s += layoutDirection;
- s += ",";
- s += smallestScreenWidthDp;
- s += ",";
- s += screenWidthDp;
- s += ",";
- s += screenHeightDp;
- s += ",";
- s += screenLayoutSize;
- s += ",";
- s += screenLayoutLong;
- s += ",";
- s += this->orientation;
- s += ",";
- s += uiModeType;
- s += ",";
- s += uiModeNight;
- s += ",";
- s += density;
- s += ",";
- s += touchscreen;
- s += ",";
- s += keysHidden;
- s += ",";
- s += keyboard;
- s += ",";
- s += navHidden;
- s += ",";
- s += navigation;
- s += ",";
- s += screenSize;
- s += ",";
- s += version;
- return s;
-}
-
-String8
-AaptGroupEntry::toDirName(const String8& resType) const
-{
- String8 s = resType;
- if (this->mcc != "") {
- if (s.length() > 0) {
- s += "-";
- }
- s += mcc;
- }
- if (this->mnc != "") {
- if (s.length() > 0) {
- s += "-";
- }
- s += mnc;
- }
- if (this->locale != "") {
- if (s.length() > 0) {
- s += "-";
- }
- s += locale;
- }
- if (this->layoutDirection != "") {
- if (s.length() > 0) {
- s += "-";
- }
- s += layoutDirection;
- }
- if (this->smallestScreenWidthDp != "") {
- if (s.length() > 0) {
- s += "-";
- }
- s += smallestScreenWidthDp;
- }
- if (this->screenWidthDp != "") {
- if (s.length() > 0) {
- s += "-";
- }
- s += screenWidthDp;
- }
- if (this->screenHeightDp != "") {
- if (s.length() > 0) {
- s += "-";
- }
- s += screenHeightDp;
- }
- if (this->screenLayoutSize != "") {
- if (s.length() > 0) {
- s += "-";
- }
- s += screenLayoutSize;
- }
- if (this->screenLayoutLong != "") {
- if (s.length() > 0) {
- s += "-";
- }
- s += screenLayoutLong;
- }
- if (this->orientation != "") {
- if (s.length() > 0) {
- s += "-";
- }
- s += orientation;
- }
- if (this->uiModeType != "") {
- if (s.length() > 0) {
- s += "-";
- }
- s += uiModeType;
- }
- if (this->uiModeNight != "") {
- if (s.length() > 0) {
- s += "-";
- }
- s += uiModeNight;
- }
- if (this->density != "") {
- if (s.length() > 0) {
- s += "-";
- }
- s += density;
- }
- if (this->touchscreen != "") {
- if (s.length() > 0) {
- s += "-";
- }
- s += touchscreen;
- }
- if (this->keysHidden != "") {
- if (s.length() > 0) {
- s += "-";
- }
- s += keysHidden;
- }
- if (this->keyboard != "") {
- if (s.length() > 0) {
- s += "-";
- }
- s += keyboard;
- }
- if (this->navHidden != "") {
- if (s.length() > 0) {
- s += "-";
- }
- s += navHidden;
- }
- if (this->navigation != "") {
- if (s.length() > 0) {
- s += "-";
- }
- s += navigation;
- }
- if (this->screenSize != "") {
- if (s.length() > 0) {
- s += "-";
- }
- s += screenSize;
- }
- if (this->version != "") {
- if (s.length() > 0) {
- s += "-";
- }
- s += version;
- }
-
- return s;
-}
-
-bool AaptGroupEntry::getMccName(const char* name,
- ResTable_config* out)
-{
- if (strcmp(name, kWildcardName) == 0) {
- if (out) out->mcc = 0;
- return true;
- }
- const char* c = name;
- if (tolower(*c) != 'm') return false;
- c++;
- if (tolower(*c) != 'c') return false;
- c++;
- if (tolower(*c) != 'c') return false;
- c++;
-
- const char* val = c;
-
- while (*c >= '0' && *c <= '9') {
- c++;
- }
- if (*c != 0) return false;
- if (c-val != 3) return false;
-
- int d = atoi(val);
- if (d != 0) {
- if (out) out->mcc = d;
- return true;
- }
-
- return false;
-}
-
-bool AaptGroupEntry::getMncName(const char* name,
- ResTable_config* out)
-{
- if (strcmp(name, kWildcardName) == 0) {
- if (out) out->mcc = 0;
- return true;
- }
- const char* c = name;
- if (tolower(*c) != 'm') return false;
- c++;
- if (tolower(*c) != 'n') return false;
- c++;
- if (tolower(*c) != 'c') return false;
- c++;
-
- const char* val = c;
-
- while (*c >= '0' && *c <= '9') {
- c++;
- }
- if (*c != 0) return false;
- if (c-val == 0 || c-val > 3) return false;
-
- if (out) {
- out->mnc = atoi(val);
- if (out->mnc == 0) {
- out->mnc = ACONFIGURATION_MNC_ZERO;
- }
- }
-
- return true;
-}
-
-/*
- * Does this directory name fit the pattern of a locale dir ("en-rUS" or
- * "default")?
- *
- * TODO: Should insist that the first two letters are lower case, and the
- * second two are upper.
- */
-bool AaptGroupEntry::getLocaleName(const char* fileName,
- ResTable_config* out)
-{
- if (strcmp(fileName, kWildcardName) == 0
- || strcmp(fileName, kDefaultLocale) == 0) {
- if (out) {
- out->language[0] = 0;
- out->language[1] = 0;
- out->country[0] = 0;
- out->country[1] = 0;
- }
- return true;
- }
-
- if (strlen(fileName) == 2 && isalpha(fileName[0]) && isalpha(fileName[1])) {
- if (out) {
- out->language[0] = fileName[0];
- out->language[1] = fileName[1];
- out->country[0] = 0;
- out->country[1] = 0;
- }
- return true;
- }
-
- if (strlen(fileName) == 5 &&
- isalpha(fileName[0]) &&
- isalpha(fileName[1]) &&
- fileName[2] == '-' &&
- isalpha(fileName[3]) &&
- isalpha(fileName[4])) {
- if (out) {
- out->language[0] = fileName[0];
- out->language[1] = fileName[1];
- out->country[0] = fileName[3];
- out->country[1] = fileName[4];
- }
- return true;
- }
-
- return false;
-}
-
-bool AaptGroupEntry::getLayoutDirectionName(const char* name, ResTable_config* out)
-{
- if (strcmp(name, kWildcardName) == 0) {
- if (out) out->screenLayout =
- (out->screenLayout&~ResTable_config::MASK_LAYOUTDIR)
- | ResTable_config::LAYOUTDIR_ANY;
- return true;
- } else if (strcmp(name, "ldltr") == 0) {
- if (out) out->screenLayout =
- (out->screenLayout&~ResTable_config::MASK_LAYOUTDIR)
- | ResTable_config::LAYOUTDIR_LTR;
- return true;
- } else if (strcmp(name, "ldrtl") == 0) {
- if (out) out->screenLayout =
- (out->screenLayout&~ResTable_config::MASK_LAYOUTDIR)
- | ResTable_config::LAYOUTDIR_RTL;
- return true;
- }
-
- return false;
-}
-
-bool AaptGroupEntry::getScreenLayoutSizeName(const char* name,
- ResTable_config* out)
-{
- if (strcmp(name, kWildcardName) == 0) {
- if (out) out->screenLayout =
- (out->screenLayout&~ResTable_config::MASK_SCREENSIZE)
- | ResTable_config::SCREENSIZE_ANY;
- return true;
- } else if (strcmp(name, "small") == 0) {
- if (out) out->screenLayout =
- (out->screenLayout&~ResTable_config::MASK_SCREENSIZE)
- | ResTable_config::SCREENSIZE_SMALL;
- return true;
- } else if (strcmp(name, "normal") == 0) {
- if (out) out->screenLayout =
- (out->screenLayout&~ResTable_config::MASK_SCREENSIZE)
- | ResTable_config::SCREENSIZE_NORMAL;
- return true;
- } else if (strcmp(name, "large") == 0) {
- if (out) out->screenLayout =
- (out->screenLayout&~ResTable_config::MASK_SCREENSIZE)
- | ResTable_config::SCREENSIZE_LARGE;
- return true;
- } else if (strcmp(name, "xlarge") == 0) {
- if (out) out->screenLayout =
- (out->screenLayout&~ResTable_config::MASK_SCREENSIZE)
- | ResTable_config::SCREENSIZE_XLARGE;
- return true;
- }
-
- return false;
-}
-
-bool AaptGroupEntry::getScreenLayoutLongName(const char* name,
- ResTable_config* out)
-{
- if (strcmp(name, kWildcardName) == 0) {
- if (out) out->screenLayout =
- (out->screenLayout&~ResTable_config::MASK_SCREENLONG)
- | ResTable_config::SCREENLONG_ANY;
- return true;
- } else if (strcmp(name, "long") == 0) {
- if (out) out->screenLayout =
- (out->screenLayout&~ResTable_config::MASK_SCREENLONG)
- | ResTable_config::SCREENLONG_YES;
- return true;
- } else if (strcmp(name, "notlong") == 0) {
- if (out) out->screenLayout =
- (out->screenLayout&~ResTable_config::MASK_SCREENLONG)
- | ResTable_config::SCREENLONG_NO;
- return true;
- }
-
- return false;
-}
-
-bool AaptGroupEntry::getOrientationName(const char* name,
- ResTable_config* out)
-{
- if (strcmp(name, kWildcardName) == 0) {
- if (out) out->orientation = out->ORIENTATION_ANY;
- return true;
- } else if (strcmp(name, "port") == 0) {
- if (out) out->orientation = out->ORIENTATION_PORT;
- return true;
- } else if (strcmp(name, "land") == 0) {
- if (out) out->orientation = out->ORIENTATION_LAND;
- return true;
- } else if (strcmp(name, "square") == 0) {
- if (out) out->orientation = out->ORIENTATION_SQUARE;
- return true;
- }
-
- return false;
-}
-
-bool AaptGroupEntry::getUiModeTypeName(const char* name,
- ResTable_config* out)
-{
- if (strcmp(name, kWildcardName) == 0) {
- if (out) out->uiMode =
- (out->uiMode&~ResTable_config::MASK_UI_MODE_TYPE)
- | ResTable_config::UI_MODE_TYPE_ANY;
- return true;
- } else if (strcmp(name, "desk") == 0) {
- if (out) out->uiMode =
- (out->uiMode&~ResTable_config::MASK_UI_MODE_TYPE)
- | ResTable_config::UI_MODE_TYPE_DESK;
- return true;
- } else if (strcmp(name, "car") == 0) {
- if (out) out->uiMode =
- (out->uiMode&~ResTable_config::MASK_UI_MODE_TYPE)
- | ResTable_config::UI_MODE_TYPE_CAR;
- return true;
- } else if (strcmp(name, "television") == 0) {
- if (out) out->uiMode =
- (out->uiMode&~ResTable_config::MASK_UI_MODE_TYPE)
- | ResTable_config::UI_MODE_TYPE_TELEVISION;
- return true;
- } else if (strcmp(name, "appliance") == 0) {
- if (out) out->uiMode =
- (out->uiMode&~ResTable_config::MASK_UI_MODE_TYPE)
- | ResTable_config::UI_MODE_TYPE_APPLIANCE;
- return true;
- }
-
- return false;
-}
-
-bool AaptGroupEntry::getUiModeNightName(const char* name,
- ResTable_config* out)
-{
- if (strcmp(name, kWildcardName) == 0) {
- if (out) out->uiMode =
- (out->uiMode&~ResTable_config::MASK_UI_MODE_NIGHT)
- | ResTable_config::UI_MODE_NIGHT_ANY;
- return true;
- } else if (strcmp(name, "night") == 0) {
- if (out) out->uiMode =
- (out->uiMode&~ResTable_config::MASK_UI_MODE_NIGHT)
- | ResTable_config::UI_MODE_NIGHT_YES;
- return true;
- } else if (strcmp(name, "notnight") == 0) {
- if (out) out->uiMode =
- (out->uiMode&~ResTable_config::MASK_UI_MODE_NIGHT)
- | ResTable_config::UI_MODE_NIGHT_NO;
- return true;
- }
-
- return false;
-}
-
-bool AaptGroupEntry::getDensityName(const char* name,
- ResTable_config* out)
-{
- if (strcmp(name, kWildcardName) == 0) {
- if (out) out->density = ResTable_config::DENSITY_DEFAULT;
- return true;
- }
-
- if (strcmp(name, "nodpi") == 0) {
- if (out) out->density = ResTable_config::DENSITY_NONE;
- return true;
- }
-
- if (strcmp(name, "ldpi") == 0) {
- if (out) out->density = ResTable_config::DENSITY_LOW;
- return true;
- }
-
- if (strcmp(name, "mdpi") == 0) {
- if (out) out->density = ResTable_config::DENSITY_MEDIUM;
- return true;
- }
-
- if (strcmp(name, "tvdpi") == 0) {
- if (out) out->density = ResTable_config::DENSITY_TV;
- return true;
- }
-
- if (strcmp(name, "hdpi") == 0) {
- if (out) out->density = ResTable_config::DENSITY_HIGH;
- return true;
- }
-
- if (strcmp(name, "xhdpi") == 0) {
- if (out) out->density = ResTable_config::DENSITY_XHIGH;
- return true;
- }
-
- if (strcmp(name, "xxhdpi") == 0) {
- if (out) out->density = ResTable_config::DENSITY_XXHIGH;
- return true;
- }
-
- if (strcmp(name, "xxxhdpi") == 0) {
- if (out) out->density = ResTable_config::DENSITY_XXXHIGH;
- return true;
- }
-
- char* c = (char*)name;
- while (*c >= '0' && *c <= '9') {
- c++;
- }
-
- // check that we have 'dpi' after the last digit.
- if (toupper(c[0]) != 'D' ||
- toupper(c[1]) != 'P' ||
- toupper(c[2]) != 'I' ||
- c[3] != 0) {
- return false;
- }
-
- // temporarily replace the first letter with \0 to
- // use atoi.
- char tmp = c[0];
- c[0] = '\0';
-
- int d = atoi(name);
- c[0] = tmp;
-
- if (d != 0) {
- if (out) out->density = d;
- return true;
- }
-
- return false;
-}
-
-bool AaptGroupEntry::getTouchscreenName(const char* name,
- ResTable_config* out)
-{
- if (strcmp(name, kWildcardName) == 0) {
- if (out) out->touchscreen = out->TOUCHSCREEN_ANY;
- return true;
- } else if (strcmp(name, "notouch") == 0) {
- if (out) out->touchscreen = out->TOUCHSCREEN_NOTOUCH;
- return true;
- } else if (strcmp(name, "stylus") == 0) {
- if (out) out->touchscreen = out->TOUCHSCREEN_STYLUS;
- return true;
- } else if (strcmp(name, "finger") == 0) {
- if (out) out->touchscreen = out->TOUCHSCREEN_FINGER;
- return true;
- }
-
- return false;
-}
-
-bool AaptGroupEntry::getKeysHiddenName(const char* name,
- ResTable_config* out)
-{
- uint8_t mask = 0;
- uint8_t value = 0;
- if (strcmp(name, kWildcardName) == 0) {
- mask = ResTable_config::MASK_KEYSHIDDEN;
- value = ResTable_config::KEYSHIDDEN_ANY;
- } else if (strcmp(name, "keysexposed") == 0) {
- mask = ResTable_config::MASK_KEYSHIDDEN;
- value = ResTable_config::KEYSHIDDEN_NO;
- } else if (strcmp(name, "keyshidden") == 0) {
- mask = ResTable_config::MASK_KEYSHIDDEN;
- value = ResTable_config::KEYSHIDDEN_YES;
- } else if (strcmp(name, "keyssoft") == 0) {
- mask = ResTable_config::MASK_KEYSHIDDEN;
- value = ResTable_config::KEYSHIDDEN_SOFT;
- }
-
- if (mask != 0) {
- if (out) out->inputFlags = (out->inputFlags&~mask) | value;
- return true;
- }
-
- return false;
-}
-
-bool AaptGroupEntry::getKeyboardName(const char* name,
- ResTable_config* out)
-{
- if (strcmp(name, kWildcardName) == 0) {
- if (out) out->keyboard = out->KEYBOARD_ANY;
- return true;
- } else if (strcmp(name, "nokeys") == 0) {
- if (out) out->keyboard = out->KEYBOARD_NOKEYS;
- return true;
- } else if (strcmp(name, "qwerty") == 0) {
- if (out) out->keyboard = out->KEYBOARD_QWERTY;
- return true;
- } else if (strcmp(name, "12key") == 0) {
- if (out) out->keyboard = out->KEYBOARD_12KEY;
- return true;
- }
-
- return false;
-}
-
-bool AaptGroupEntry::getNavHiddenName(const char* name,
- ResTable_config* out)
-{
- uint8_t mask = 0;
- uint8_t value = 0;
- if (strcmp(name, kWildcardName) == 0) {
- mask = ResTable_config::MASK_NAVHIDDEN;
- value = ResTable_config::NAVHIDDEN_ANY;
- } else if (strcmp(name, "navexposed") == 0) {
- mask = ResTable_config::MASK_NAVHIDDEN;
- value = ResTable_config::NAVHIDDEN_NO;
- } else if (strcmp(name, "navhidden") == 0) {
- mask = ResTable_config::MASK_NAVHIDDEN;
- value = ResTable_config::NAVHIDDEN_YES;
- }
-
- if (mask != 0) {
- if (out) out->inputFlags = (out->inputFlags&~mask) | value;
- return true;
- }
-
- return false;
-}
-
-bool AaptGroupEntry::getNavigationName(const char* name,
- ResTable_config* out)
-{
- if (strcmp(name, kWildcardName) == 0) {
- if (out) out->navigation = out->NAVIGATION_ANY;
- return true;
- } else if (strcmp(name, "nonav") == 0) {
- if (out) out->navigation = out->NAVIGATION_NONAV;
- return true;
- } else if (strcmp(name, "dpad") == 0) {
- if (out) out->navigation = out->NAVIGATION_DPAD;
- return true;
- } else if (strcmp(name, "trackball") == 0) {
- if (out) out->navigation = out->NAVIGATION_TRACKBALL;
- return true;
- } else if (strcmp(name, "wheel") == 0) {
- if (out) out->navigation = out->NAVIGATION_WHEEL;
- return true;
- }
-
- return false;
-}
-
-bool AaptGroupEntry::getScreenSizeName(const char* name, ResTable_config* out)
-{
- if (strcmp(name, kWildcardName) == 0) {
- if (out) {
- out->screenWidth = out->SCREENWIDTH_ANY;
- out->screenHeight = out->SCREENHEIGHT_ANY;
- }
- 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;
-}
-
-bool AaptGroupEntry::getSmallestScreenWidthDpName(const char* name, ResTable_config* out)
-{
- if (strcmp(name, kWildcardName) == 0) {
- if (out) {
- out->smallestScreenWidthDp = out->SCREENWIDTH_ANY;
- }
- return true;
- }
-
- if (*name != 's') return false;
- name++;
- if (*name != 'w') return false;
- name++;
- const char* x = name;
- while (*x >= '0' && *x <= '9') x++;
- if (x == name || x[0] != 'd' || x[1] != 'p' || x[2] != 0) return false;
- String8 xName(name, x-name);
-
- if (out) {
- out->smallestScreenWidthDp = (uint16_t)atoi(xName.string());
- }
-
- return true;
-}
-
-bool AaptGroupEntry::getScreenWidthDpName(const char* name, ResTable_config* out)
-{
- if (strcmp(name, kWildcardName) == 0) {
- if (out) {
- out->screenWidthDp = out->SCREENWIDTH_ANY;
- }
- return true;
- }
-
- if (*name != 'w') return false;
- name++;
- const char* x = name;
- while (*x >= '0' && *x <= '9') x++;
- if (x == name || x[0] != 'd' || x[1] != 'p' || x[2] != 0) return false;
- String8 xName(name, x-name);
-
- if (out) {
- out->screenWidthDp = (uint16_t)atoi(xName.string());
- }
-
- return true;
-}
-
-bool AaptGroupEntry::getScreenHeightDpName(const char* name, ResTable_config* out)
-{
- if (strcmp(name, kWildcardName) == 0) {
- if (out) {
- out->screenHeightDp = out->SCREENWIDTH_ANY;
- }
- return true;
- }
-
- if (*name != 'h') return false;
- name++;
- const char* x = name;
- while (*x >= '0' && *x <= '9') x++;
- if (x == name || x[0] != 'd' || x[1] != 'p' || x[2] != 0) return false;
- String8 xName(name, x-name);
-
- if (out) {
- out->screenHeightDp = (uint16_t)atoi(xName.string());
- }
-
- return true;
-}
-
-bool AaptGroupEntry::getVersionName(const char* name, ResTable_config* out)
-{
- if (strcmp(name, kWildcardName) == 0) {
- if (out) {
- out->sdkVersion = out->SDKVERSION_ANY;
- out->minorVersion = out->MINORVERSION_ANY;
- }
- 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;
-}
-
-int AaptGroupEntry::compare(const AaptGroupEntry& o) const
-{
- int v = mcc.compare(o.mcc);
- if (v == 0) v = mnc.compare(o.mnc);
- if (v == 0) v = locale.compare(o.locale);
- if (v == 0) v = layoutDirection.compare(o.layoutDirection);
- if (v == 0) v = vendor.compare(o.vendor);
- if (v == 0) v = smallestScreenWidthDp.compare(o.smallestScreenWidthDp);
- if (v == 0) v = screenWidthDp.compare(o.screenWidthDp);
- if (v == 0) v = screenHeightDp.compare(o.screenHeightDp);
- if (v == 0) v = screenLayoutSize.compare(o.screenLayoutSize);
- if (v == 0) v = screenLayoutLong.compare(o.screenLayoutLong);
- if (v == 0) v = orientation.compare(o.orientation);
- if (v == 0) v = uiModeType.compare(o.uiModeType);
- if (v == 0) v = uiModeNight.compare(o.uiModeNight);
- if (v == 0) v = density.compare(o.density);
- if (v == 0) v = touchscreen.compare(o.touchscreen);
- if (v == 0) v = keysHidden.compare(o.keysHidden);
- if (v == 0) v = keyboard.compare(o.keyboard);
- if (v == 0) v = navHidden.compare(o.navHidden);
- if (v == 0) v = navigation.compare(o.navigation);
- if (v == 0) v = screenSize.compare(o.screenSize);
- if (v == 0) v = version.compare(o.version);
- return v;
-}
-
-const ResTable_config& AaptGroupEntry::toParams() const
-{
- if (!mParamsChanged) {
- return mParams;
- }
-
- mParamsChanged = false;
- ResTable_config& params(mParams);
- memset(&params, 0, sizeof(params));
- getMccName(mcc.string(), &params);
- getMncName(mnc.string(), &params);
- getLocaleName(locale.string(), &params);
- getLayoutDirectionName(layoutDirection.string(), &params);
- getSmallestScreenWidthDpName(smallestScreenWidthDp.string(), &params);
- getScreenWidthDpName(screenWidthDp.string(), &params);
- getScreenHeightDpName(screenHeightDp.string(), &params);
- getScreenLayoutSizeName(screenLayoutSize.string(), &params);
- getScreenLayoutLongName(screenLayoutLong.string(), &params);
- getOrientationName(orientation.string(), &params);
- getUiModeTypeName(uiModeType.string(), &params);
- getUiModeNightName(uiModeNight.string(), &params);
- getDensityName(density.string(), &params);
- getTouchscreenName(touchscreen.string(), &params);
- getKeysHiddenName(keysHidden.string(), &params);
- getKeyboardName(keyboard.string(), &params);
- getNavHiddenName(navHidden.string(), &params);
- getNavigationName(navigation.string(), &params);
- getScreenSizeName(screenSize.string(), &params);
- getVersionName(version.string(), &params);
-
- // Fix up version number based on specified parameters.
- int minSdk = 0;
- if (params.smallestScreenWidthDp != ResTable_config::SCREENWIDTH_ANY
- || params.screenWidthDp != ResTable_config::SCREENWIDTH_ANY
- || params.screenHeightDp != ResTable_config::SCREENHEIGHT_ANY) {
- minSdk = SDK_HONEYCOMB_MR2;
- } else if ((params.uiMode&ResTable_config::MASK_UI_MODE_TYPE)
- != ResTable_config::UI_MODE_TYPE_ANY
- || (params.uiMode&ResTable_config::MASK_UI_MODE_NIGHT)
- != ResTable_config::UI_MODE_NIGHT_ANY) {
- minSdk = SDK_FROYO;
- } else if ((params.screenLayout&ResTable_config::MASK_SCREENSIZE)
- != ResTable_config::SCREENSIZE_ANY
- || (params.screenLayout&ResTable_config::MASK_SCREENLONG)
- != ResTable_config::SCREENLONG_ANY
- || params.density != ResTable_config::DENSITY_DEFAULT) {
- minSdk = SDK_DONUT;
- }
-
- if (minSdk > params.sdkVersion) {
- params.sdkVersion = minSdk;
- }
-
- return params;
-}
-
-// =========================================================================
-// =========================================================================
-// =========================================================================
-
-void* AaptFile::editData(size_t size)
-{
- if (size <= mBufferSize) {
- mDataSize = size;
- return mData;
- }
- size_t allocSize = (size*3)/2;
- void* buf = realloc(mData, allocSize);
- if (buf == NULL) {
- return NULL;
- }
- mData = buf;
- mDataSize = size;
- mBufferSize = allocSize;
- return buf;
-}
-
-void* AaptFile::editData(size_t* outSize)
-{
- if (outSize) {
- *outSize = mDataSize;
- }
- return mData;
-}
-
-void* AaptFile::padData(size_t wordSize)
-{
- const size_t extra = mDataSize%wordSize;
- if (extra == 0) {
- return mData;
- }
-
- size_t initial = mDataSize;
- void* data = editData(initial+(wordSize-extra));
- if (data != NULL) {
- memset(((uint8_t*)data) + initial, 0, wordSize-extra);
- }
- return data;
-}
-
-status_t AaptFile::writeData(const void* data, size_t size)
-{
- size_t end = mDataSize;
- size_t total = size + end;
- void* buf = editData(total);
- if (buf == NULL) {
- return UNKNOWN_ERROR;
- }
- memcpy(((char*)buf)+end, data, size);
- return NO_ERROR;
-}
-
-void AaptFile::clearData()
-{
- if (mData != NULL) free(mData);
- mData = NULL;
- mDataSize = 0;
- mBufferSize = 0;
-}
-
-String8 AaptFile::getPrintableSource() const
-{
- if (hasData()) {
- String8 name(mGroupEntry.toDirName(String8()));
- name.appendPath(mPath);
- name.append(" #generated");
- return name;
- }
- return mSourceFile;
-}
-
-// =========================================================================
-// =========================================================================
-// =========================================================================
-
-status_t AaptGroup::addFile(const sp<AaptFile>& file)
-{
- if (mFiles.indexOfKey(file->getGroupEntry()) < 0) {
- file->mPath = mPath;
- mFiles.add(file->getGroupEntry(), file);
- return NO_ERROR;
- }
-
-#if 0
- printf("Error adding file %s: group %s already exists in leaf=%s path=%s\n",
- file->getSourceFile().string(),
- file->getGroupEntry().toDirName(String8()).string(),
- mLeaf.string(), mPath.string());
-#endif
-
- SourcePos(file->getSourceFile(), -1).error("Duplicate file.\n%s: Original is here.",
- getPrintableSource().string());
- return UNKNOWN_ERROR;
-}
-
-void AaptGroup::removeFile(size_t index)
-{
- mFiles.removeItemsAt(index);
-}
-
-void AaptGroup::print(const String8& prefix) const
-{
- printf("%s%s\n", prefix.string(), getPath().string());
- const size_t N=mFiles.size();
- size_t i;
- for (i=0; i<N; i++) {
- sp<AaptFile> file = mFiles.valueAt(i);
- const AaptGroupEntry& e = file->getGroupEntry();
- if (file->hasData()) {
- printf("%s Gen: (%s) %d bytes\n", prefix.string(), e.toDirName(String8()).string(),
- (int)file->getSize());
- } else {
- printf("%s Src: (%s) %s\n", prefix.string(), e.toDirName(String8()).string(),
- file->getPrintableSource().string());
- }
- //printf("%s File Group Entry: %s\n", prefix.string(),
- // file->getGroupEntry().toDirName(String8()).string());
- }
-}
-
-String8 AaptGroup::getPrintableSource() const
-{
- if (mFiles.size() > 0) {
- // Arbitrarily pull the first source file out of the list.
- return mFiles.valueAt(0)->getPrintableSource();
- }
-
- // Should never hit this case, but to be safe...
- return getPath();
-
-}
-
-// =========================================================================
-// =========================================================================
-// =========================================================================
-
-status_t AaptDir::addFile(const String8& name, const sp<AaptGroup>& file)
-{
- if (mFiles.indexOfKey(name) >= 0) {
- return ALREADY_EXISTS;
- }
- mFiles.add(name, file);
- return NO_ERROR;
-}
-
-status_t AaptDir::addDir(const String8& name, const sp<AaptDir>& dir)
-{
- if (mDirs.indexOfKey(name) >= 0) {
- return ALREADY_EXISTS;
- }
- mDirs.add(name, dir);
- return NO_ERROR;
-}
-
-sp<AaptDir> AaptDir::makeDir(const String8& path)
-{
- String8 name;
- String8 remain = path;
-
- sp<AaptDir> subdir = this;
- while (name = remain.walkPath(&remain), remain != "") {
- subdir = subdir->makeDir(name);
- }
-
- ssize_t i = subdir->mDirs.indexOfKey(name);
- if (i >= 0) {
- return subdir->mDirs.valueAt(i);
- }
- sp<AaptDir> dir = new AaptDir(name, subdir->mPath.appendPathCopy(name));
- subdir->mDirs.add(name, dir);
- return dir;
-}
-
-void AaptDir::removeFile(const String8& name)
-{
- mFiles.removeItem(name);
-}
-
-void AaptDir::removeDir(const String8& name)
-{
- mDirs.removeItem(name);
-}
-
-status_t AaptDir::addLeafFile(const String8& leafName, const sp<AaptFile>& file)
-{
- sp<AaptGroup> group;
- if (mFiles.indexOfKey(leafName) >= 0) {
- group = mFiles.valueFor(leafName);
- } else {
- group = new AaptGroup(leafName, mPath.appendPathCopy(leafName));
- mFiles.add(leafName, group);
- }
-
- return group->addFile(file);
-}
-
-ssize_t AaptDir::slurpFullTree(Bundle* bundle, const String8& srcDir,
- const AaptGroupEntry& kind, const String8& resType,
- sp<FilePathStore>& fullResPaths)
-{
- Vector<String8> fileNames;
- {
- 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;
-
- String8 name(entry->d_name);
- fileNames.add(name);
- // Add fully qualified path for dependency purposes
- // if we're collecting them
- if (fullResPaths != NULL) {
- fullResPaths->add(srcDir.appendPathCopy(name));
- }
- }
- closedir(dir);
- }
-
- ssize_t count = 0;
-
- /*
- * Stash away the files and recursively descend into subdirectories.
- */
- const size_t N = fileNames.size();
- size_t i;
- for (i = 0; i < N; i++) {
- String8 pathName(srcDir);
- FileType type;
-
- pathName.appendPath(fileNames[i].string());
- type = getFileType(pathName.string());
- if (type == kFileTypeDirectory) {
- sp<AaptDir> subdir;
- bool notAdded = false;
- if (mDirs.indexOfKey(fileNames[i]) >= 0) {
- subdir = mDirs.valueFor(fileNames[i]);
- } else {
- subdir = new AaptDir(fileNames[i], mPath.appendPathCopy(fileNames[i]));
- notAdded = true;
- }
- ssize_t res = subdir->slurpFullTree(bundle, pathName, kind,
- resType, fullResPaths);
- if (res < NO_ERROR) {
- return res;
- }
- if (res > 0 && notAdded) {
- mDirs.add(fileNames[i], subdir);
- }
- count += res;
- } else if (type == kFileTypeRegular) {
- sp<AaptFile> file = new AaptFile(pathName, kind, resType);
- status_t err = addLeafFile(fileNames[i], file);
- if (err != NO_ERROR) {
- return err;
- }
-
- count++;
-
- } else {
- if (bundle->getVerbose())
- printf(" (ignoring non-file/dir '%s')\n", pathName.string());
- }
- }
-
- return count;
-}
-
-status_t AaptDir::validate() const
-{
- const size_t NF = mFiles.size();
- const size_t ND = mDirs.size();
- size_t i;
- for (i = 0; i < NF; i++) {
- if (!validateFileName(mFiles.valueAt(i)->getLeaf().string())) {
- SourcePos(mFiles.valueAt(i)->getPrintableSource(), -1).error(
- "Invalid filename. Unable to add.");
- return UNKNOWN_ERROR;
- }
-
- size_t j;
- for (j = i+1; j < NF; j++) {
- if (strcasecmp(mFiles.valueAt(i)->getLeaf().string(),
- mFiles.valueAt(j)->getLeaf().string()) == 0) {
- SourcePos(mFiles.valueAt(i)->getPrintableSource(), -1).error(
- "File is case-insensitive equivalent to: %s",
- mFiles.valueAt(j)->getPrintableSource().string());
- return UNKNOWN_ERROR;
- }
-
- // TODO: if ".gz", check for non-.gz; if non-, check for ".gz"
- // (this is mostly caught by the "marked" stuff, below)
- }
-
- for (j = 0; j < ND; j++) {
- if (strcasecmp(mFiles.valueAt(i)->getLeaf().string(),
- mDirs.valueAt(j)->getLeaf().string()) == 0) {
- SourcePos(mFiles.valueAt(i)->getPrintableSource(), -1).error(
- "File conflicts with dir from: %s",
- mDirs.valueAt(j)->getPrintableSource().string());
- return UNKNOWN_ERROR;
- }
- }
- }
-
- for (i = 0; i < ND; i++) {
- if (!validateFileName(mDirs.valueAt(i)->getLeaf().string())) {
- SourcePos(mDirs.valueAt(i)->getPrintableSource(), -1).error(
- "Invalid directory name, unable to add.");
- return UNKNOWN_ERROR;
- }
-
- size_t j;
- for (j = i+1; j < ND; j++) {
- if (strcasecmp(mDirs.valueAt(i)->getLeaf().string(),
- mDirs.valueAt(j)->getLeaf().string()) == 0) {
- SourcePos(mDirs.valueAt(i)->getPrintableSource(), -1).error(
- "Directory is case-insensitive equivalent to: %s",
- mDirs.valueAt(j)->getPrintableSource().string());
- return UNKNOWN_ERROR;
- }
- }
-
- status_t err = mDirs.valueAt(i)->validate();
- if (err != NO_ERROR) {
- return err;
- }
- }
-
- return NO_ERROR;
-}
-
-void AaptDir::print(const String8& prefix) const
-{
- const size_t ND=getDirs().size();
- size_t i;
- for (i=0; i<ND; i++) {
- getDirs().valueAt(i)->print(prefix);
- }
-
- const size_t NF=getFiles().size();
- for (i=0; i<NF; i++) {
- getFiles().valueAt(i)->print(prefix);
- }
-}
-
-String8 AaptDir::getPrintableSource() const
-{
- if (mFiles.size() > 0) {
- // Arbitrarily pull the first file out of the list as the source dir.
- return mFiles.valueAt(0)->getPrintableSource().getPathDir();
- }
- if (mDirs.size() > 0) {
- // Or arbitrarily pull the first dir out of the list as the source dir.
- return mDirs.valueAt(0)->getPrintableSource().getPathDir();
- }
-
- // Should never hit this case, but to be safe...
- return mPath;
-
-}
-
-// =========================================================================
-// =========================================================================
-// =========================================================================
-
-status_t AaptSymbols::applyJavaSymbols(const sp<AaptSymbols>& javaSymbols)
-{
- status_t err = NO_ERROR;
- size_t N = javaSymbols->mSymbols.size();
- for (size_t i=0; i<N; i++) {
- const String8& name = javaSymbols->mSymbols.keyAt(i);
- const AaptSymbolEntry& entry = javaSymbols->mSymbols.valueAt(i);
- ssize_t pos = mSymbols.indexOfKey(name);
- if (pos < 0) {
- entry.sourcePos.error("Symbol '%s' declared with <java-symbol> not defined\n", name.string());
- err = UNKNOWN_ERROR;
- continue;
- }
- //printf("**** setting symbol #%d/%d %s to isJavaSymbol=%d\n",
- // i, N, name.string(), entry.isJavaSymbol ? 1 : 0);
- mSymbols.editValueAt(pos).isJavaSymbol = entry.isJavaSymbol;
- }
-
- N = javaSymbols->mNestedSymbols.size();
- for (size_t i=0; i<N; i++) {
- const String8& name = javaSymbols->mNestedSymbols.keyAt(i);
- const sp<AaptSymbols>& symbols = javaSymbols->mNestedSymbols.valueAt(i);
- ssize_t pos = mNestedSymbols.indexOfKey(name);
- if (pos < 0) {
- SourcePos pos;
- pos.error("Java symbol dir %s not defined\n", name.string());
- err = UNKNOWN_ERROR;
- continue;
- }
- //printf("**** applying java symbols in dir %s\n", name.string());
- status_t myerr = mNestedSymbols.valueAt(pos)->applyJavaSymbols(symbols);
- if (myerr != NO_ERROR) {
- err = myerr;
- }
- }
-
- return err;
-}
-
-// =========================================================================
-// =========================================================================
-// =========================================================================
-
-AaptAssets::AaptAssets()
- : AaptDir(String8(), String8()),
- mChanged(false), mHaveIncludedAssets(false), mRes(NULL)
-{
-}
-
-const SortedVector<AaptGroupEntry>& AaptAssets::getGroupEntries() const {
- if (mChanged) {
- }
- return mGroupEntries;
-}
-
-status_t AaptAssets::addFile(const String8& name, const sp<AaptGroup>& file)
-{
- mChanged = true;
- return AaptDir::addFile(name, file);
-}
-
-sp<AaptFile> AaptAssets::addFile(
- const String8& filePath, const AaptGroupEntry& entry,
- const String8& srcDir, sp<AaptGroup>* outGroup,
- const String8& resType)
-{
- sp<AaptDir> dir = this;
- sp<AaptGroup> group;
- sp<AaptFile> file;
- String8 root, remain(filePath), partialPath;
- while (remain.length() > 0) {
- root = remain.walkPath(&remain);
- partialPath.appendPath(root);
-
- const String8 rootStr(root);
-
- if (remain.length() == 0) {
- ssize_t i = dir->getFiles().indexOfKey(rootStr);
- if (i >= 0) {
- group = dir->getFiles().valueAt(i);
- } else {
- group = new AaptGroup(rootStr, filePath);
- status_t res = dir->addFile(rootStr, group);
- if (res != NO_ERROR) {
- return NULL;
- }
- }
- file = new AaptFile(srcDir.appendPathCopy(filePath), entry, resType);
- status_t res = group->addFile(file);
- if (res != NO_ERROR) {
- return NULL;
- }
- break;
-
- } else {
- ssize_t i = dir->getDirs().indexOfKey(rootStr);
- if (i >= 0) {
- dir = dir->getDirs().valueAt(i);
- } else {
- sp<AaptDir> subdir = new AaptDir(rootStr, partialPath);
- status_t res = dir->addDir(rootStr, subdir);
- if (res != NO_ERROR) {
- return NULL;
- }
- dir = subdir;
- }
- }
- }
-
- mGroupEntries.add(entry);
- if (outGroup) *outGroup = group;
- return file;
-}
-
-void AaptAssets::addResource(const String8& leafName, const String8& path,
- const sp<AaptFile>& file, const String8& resType)
-{
- sp<AaptDir> res = AaptDir::makeDir(kResString);
- String8 dirname = file->getGroupEntry().toDirName(resType);
- sp<AaptDir> subdir = res->makeDir(dirname);
- sp<AaptGroup> grr = new AaptGroup(leafName, path);
- grr->addFile(file);
-
- subdir->addFile(leafName, grr);
-}
-
-
-ssize_t AaptAssets::slurpFromArgs(Bundle* bundle)
-{
- int count;
- int totalCount = 0;
- FileType type;
- const Vector<const char *>& resDirs = bundle->getResourceSourceDirs();
- const size_t dirCount =resDirs.size();
- sp<AaptAssets> current = this;
-
- const int N = bundle->getFileSpecCount();
-
- /*
- * If a package manifest was specified, include that first.
- */
- if (bundle->getAndroidManifestFile() != NULL) {
- // place at root of zip.
- String8 srcFile(bundle->getAndroidManifestFile());
- addFile(srcFile.getPathLeaf(), AaptGroupEntry(), srcFile.getPathDir(),
- NULL, String8());
- totalCount++;
- }
-
- /*
- * If a directory of custom assets was supplied, slurp 'em up.
- */
- if (bundle->getAssetSourceDir()) {
- const char* assetDir = bundle->getAssetSourceDir();
-
- FileType type = getFileType(assetDir);
- if (type == kFileTypeNonexistent) {
- fprintf(stderr, "ERROR: asset directory '%s' does not exist\n", assetDir);
- return UNKNOWN_ERROR;
- }
- if (type != kFileTypeDirectory) {
- fprintf(stderr, "ERROR: '%s' is not a directory\n", assetDir);
- return UNKNOWN_ERROR;
- }
-
- String8 assetRoot(assetDir);
- sp<AaptDir> assetAaptDir = makeDir(String8(kAssetDir));
- AaptGroupEntry group;
- count = assetAaptDir->slurpFullTree(bundle, assetRoot, group,
- String8(), mFullAssetPaths);
- if (count < 0) {
- totalCount = count;
- goto bail;
- }
- if (count > 0) {
- mGroupEntries.add(group);
- }
- totalCount += count;
-
- if (bundle->getVerbose())
- printf("Found %d custom asset file%s in %s\n",
- count, (count==1) ? "" : "s", assetDir);
- }
-
- /*
- * If a directory of resource-specific assets was supplied, slurp 'em up.
- */
- 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;
- current->setFullResPaths(mFullResPaths);
- }
- count = current->slurpResourceTree(bundle, String8(res));
-
- if (count < 0) {
- totalCount = count;
- goto bail;
- }
- totalCount += count;
- }
- else {
- fprintf(stderr, "ERROR: '%s' is not a directory\n", res);
- return UNKNOWN_ERROR;
- }
- }
-
- }
- /*
- * Now do any additional raw files.
- */
- for (int arg=0; arg<N; arg++) {
- const char* assetDir = bundle->getFileSpecEntry(arg);
-
- FileType type = getFileType(assetDir);
- if (type == kFileTypeNonexistent) {
- fprintf(stderr, "ERROR: input directory '%s' does not exist\n", assetDir);
- return UNKNOWN_ERROR;
- }
- if (type != kFileTypeDirectory) {
- fprintf(stderr, "ERROR: '%s' is not a directory\n", assetDir);
- return UNKNOWN_ERROR;
- }
-
- String8 assetRoot(assetDir);
-
- if (bundle->getVerbose())
- printf("Processing raw dir '%s'\n", (const char*) assetDir);
-
- /*
- * Do a recursive traversal of subdir tree. We don't make any
- * guarantees about ordering, so we're okay with an inorder search
- * using whatever order the OS happens to hand back to us.
- */
- count = slurpFullTree(bundle, assetRoot, AaptGroupEntry(), String8(), mFullAssetPaths);
- if (count < 0) {
- /* failure; report error and remove archive */
- totalCount = count;
- goto bail;
- }
- totalCount += count;
-
- if (bundle->getVerbose())
- printf("Found %d asset file%s in %s\n",
- count, (count==1) ? "" : "s", assetDir);
- }
-
- count = validate();
- if (count != NO_ERROR) {
- totalCount = count;
- goto bail;
- }
-
- count = filter(bundle);
- if (count != NO_ERROR) {
- totalCount = count;
- goto bail;
- }
-
-bail:
- return totalCount;
-}
-
-ssize_t AaptAssets::slurpFullTree(Bundle* bundle, const String8& srcDir,
- const AaptGroupEntry& kind,
- const String8& resType,
- sp<FilePathStore>& fullResPaths)
-{
- ssize_t res = AaptDir::slurpFullTree(bundle, srcDir, kind, resType, fullResPaths);
- if (res > 0) {
- mGroupEntries.add(kind);
- }
-
- return res;
-}
-
-ssize_t AaptAssets::slurpResourceTree(Bundle* bundle, const String8& srcDir)
-{
- ssize_t err = 0;
-
- DIR* dir = opendir(srcDir.string());
- if (dir == NULL) {
- fprintf(stderr, "ERROR: opendir(%s): %s\n", srcDir.string(), strerror(errno));
- return UNKNOWN_ERROR;
- }
-
- status_t count = 0;
-
- /*
- * Run through the directory, looking for dirs that match the
- * expected pattern.
- */
- while (1) {
- struct dirent* entry = readdir(dir);
- if (entry == NULL) {
- break;
- }
-
- if (isHidden(srcDir.string(), entry->d_name)) {
- continue;
- }
-
- String8 subdirName(srcDir);
- subdirName.appendPath(entry->d_name);
-
- AaptGroupEntry group;
- String8 resType;
- bool b = group.initFromDirName(entry->d_name, &resType);
- if (!b) {
- fprintf(stderr, "invalid resource directory name: %s/%s\n", srcDir.string(),
- entry->d_name);
- err = -1;
- continue;
- }
-
- if (bundle->getMaxResVersion() != NULL && group.getVersionString().length() != 0) {
- int maxResInt = atoi(bundle->getMaxResVersion());
- const char *verString = group.getVersionString().string();
- int dirVersionInt = atoi(verString + 1); // skip 'v' in version name
- if (dirVersionInt > maxResInt) {
- fprintf(stderr, "max res %d, skipping %s\n", maxResInt, entry->d_name);
- continue;
- }
- }
-
- FileType type = getFileType(subdirName.string());
-
- if (type == kFileTypeDirectory) {
- sp<AaptDir> dir = makeDir(resType);
- ssize_t res = dir->slurpFullTree(bundle, subdirName, group,
- resType, mFullResPaths);
- if (res < 0) {
- count = res;
- goto bail;
- }
- if (res > 0) {
- mGroupEntries.add(group);
- count += res;
- }
-
- // Only add this directory if we don't already have a resource dir
- // for the current type. This ensures that we only add the dir once
- // for all configs.
- sp<AaptDir> rdir = resDir(resType);
- if (rdir == NULL) {
- mResDirs.add(dir);
- }
- } else {
- if (bundle->getVerbose()) {
- fprintf(stderr, " (ignoring file '%s')\n", subdirName.string());
- }
- }
- }
-
-bail:
- closedir(dir);
- dir = NULL;
-
- if (err != 0) {
- return err;
- }
- return count;
-}
-
-ssize_t
-AaptAssets::slurpResourceZip(Bundle* bundle, const char* filename)
-{
- int count = 0;
- SortedVector<AaptGroupEntry> entries;
-
- ZipFile* zip = new ZipFile;
- status_t err = zip->open(filename, ZipFile::kOpenReadOnly);
- if (err != NO_ERROR) {
- fprintf(stderr, "error opening zip file %s\n", filename);
- count = err;
- delete zip;
- return -1;
- }
-
- const int N = zip->getNumEntries();
- for (int i=0; i<N; i++) {
- ZipEntry* entry = zip->getEntryByIndex(i);
- if (entry->getDeleted()) {
- continue;
- }
-
- String8 entryName(entry->getFileName());
-
- String8 dirName = entryName.getPathDir();
- sp<AaptDir> dir = dirName == "" ? this : makeDir(dirName);
-
- String8 resType;
- AaptGroupEntry kind;
-
- String8 remain;
- if (entryName.walkPath(&remain) == kResourceDir) {
- // these are the resources, pull their type out of the directory name
- kind.initFromDirName(remain.walkPath().string(), &resType);
- } else {
- // these are untyped and don't have an AaptGroupEntry
- }
- if (entries.indexOf(kind) < 0) {
- entries.add(kind);
- mGroupEntries.add(kind);
- }
-
- // use the one from the zip file if they both exist.
- dir->removeFile(entryName.getPathLeaf());
-
- sp<AaptFile> file = new AaptFile(entryName, kind, resType);
- status_t err = dir->addLeafFile(entryName.getPathLeaf(), file);
- if (err != NO_ERROR) {
- fprintf(stderr, "err=%s entryName=%s\n", strerror(err), entryName.string());
- count = err;
- goto bail;
- }
- file->setCompressionMethod(entry->getCompressionMethod());
-
-#if 0
- if (entryName == "AndroidManifest.xml") {
- printf("AndroidManifest.xml\n");
- }
- printf("\n\nfile: %s\n", entryName.string());
-#endif
-
- size_t len = entry->getUncompressedLen();
- void* data = zip->uncompress(entry);
- void* buf = file->editData(len);
- memcpy(buf, data, len);
-
-#if 0
- const int OFF = 0;
- const unsigned char* p = (unsigned char*)data;
- const unsigned char* end = p+len;
- p += OFF;
- for (int i=0; i<32 && p < end; i++) {
- printf("0x%03x ", i*0x10 + OFF);
- for (int j=0; j<0x10 && p < end; j++) {
- printf(" %02x", *p);
- p++;
- }
- printf("\n");
- }
-#endif
-
- free(data);
-
- count++;
- }
-
-bail:
- delete zip;
- return count;
-}
-
-status_t AaptAssets::filter(Bundle* bundle)
-{
- ResourceFilter reqFilter;
- status_t err = reqFilter.parse(bundle->getConfigurations());
- if (err != NO_ERROR) {
- return err;
- }
-
- ResourceFilter prefFilter;
- err = prefFilter.parse(bundle->getPreferredConfigurations());
- if (err != NO_ERROR) {
- return err;
- }
-
- if (reqFilter.isEmpty() && prefFilter.isEmpty()) {
- return NO_ERROR;
- }
-
- if (bundle->getVerbose()) {
- if (!reqFilter.isEmpty()) {
- printf("Applying required filter: %s\n",
- bundle->getConfigurations());
- }
- if (!prefFilter.isEmpty()) {
- printf("Applying preferred filter: %s\n",
- bundle->getPreferredConfigurations());
- }
- }
-
- const Vector<sp<AaptDir> >& resdirs = mResDirs;
- const size_t ND = resdirs.size();
- for (size_t i=0; i<ND; i++) {
- const sp<AaptDir>& dir = resdirs.itemAt(i);
- if (dir->getLeaf() == kValuesDir) {
- // The "value" dir is special since a single file defines
- // multiple resources, so we can not do filtering on the
- // files themselves.
- continue;
- }
- if (dir->getLeaf() == kMipmapDir) {
- // We also skip the "mipmap" directory, since the point of this
- // is to include all densities without stripping. If you put
- // other configurations in here as well they won't be stripped
- // either... So don't do that. Seriously. What is wrong with you?
- continue;
- }
-
- const size_t NG = dir->getFiles().size();
- for (size_t j=0; j<NG; j++) {
- sp<AaptGroup> grp = dir->getFiles().valueAt(j);
-
- // First remove any configurations we know we don't need.
- for (size_t k=0; k<grp->getFiles().size(); k++) {
- sp<AaptFile> file = grp->getFiles().valueAt(k);
- if (k == 0 && grp->getFiles().size() == 1) {
- // If this is the only file left, we need to keep it.
- // Otherwise the resource IDs we are using will be inconsistent
- // with what we get when not stripping. Sucky, but at least
- // for now we can rely on the back-end doing another filtering
- // pass to take this out and leave us with this resource name
- // containing no entries.
- continue;
- }
- if (file->getPath().getPathExtension() == ".xml") {
- // We can't remove .xml files at this point, because when
- // we parse them they may add identifier resources, so
- // removing them can cause our resource identifiers to
- // become inconsistent.
- continue;
- }
- const ResTable_config& config(file->getGroupEntry().toParams());
- if (!reqFilter.match(config)) {
- if (bundle->getVerbose()) {
- printf("Pruning unneeded resource: %s\n",
- file->getPrintableSource().string());
- }
- grp->removeFile(k);
- k--;
- }
- }
-
- // Quick check: no preferred filters, nothing more to do.
- if (prefFilter.isEmpty()) {
- continue;
- }
-
- // Get the preferred density if there is one. We do not match exactly for density.
- // If our preferred density is hdpi but we only have mdpi and xhdpi resources, we
- // pick xhdpi.
- uint32_t preferredDensity = 0;
- const SortedVector<uint32_t>* preferredConfigs = prefFilter.configsForAxis(AXIS_DENSITY);
- if (preferredConfigs != NULL && preferredConfigs->size() > 0) {
- preferredDensity = (*preferredConfigs)[0];
- }
-
- // Now deal with preferred configurations.
- for (int axis=AXIS_START; axis<=AXIS_END; axis++) {
- for (size_t k=0; k<grp->getFiles().size(); k++) {
- sp<AaptFile> file = grp->getFiles().valueAt(k);
- if (k == 0 && grp->getFiles().size() == 1) {
- // If this is the only file left, we need to keep it.
- // Otherwise the resource IDs we are using will be inconsistent
- // with what we get when not stripping. Sucky, but at least
- // for now we can rely on the back-end doing another filtering
- // pass to take this out and leave us with this resource name
- // containing no entries.
- continue;
- }
- if (file->getPath().getPathExtension() == ".xml") {
- // We can't remove .xml files at this point, because when
- // we parse them they may add identifier resources, so
- // removing them can cause our resource identifiers to
- // become inconsistent.
- continue;
- }
- const ResTable_config& config(file->getGroupEntry().toParams());
- if (!prefFilter.match(axis, config)) {
- // This is a resource we would prefer not to have. Check
- // to see if have a similar variation that we would like
- // to have and, if so, we can drop it.
-
- uint32_t bestDensity = config.density;
-
- for (size_t m=0; m<grp->getFiles().size(); m++) {
- if (m == k) continue;
- sp<AaptFile> mfile = grp->getFiles().valueAt(m);
- const ResTable_config& mconfig(mfile->getGroupEntry().toParams());
- if (AaptGroupEntry::configSameExcept(config, mconfig, axis)) {
- if (axis == AXIS_DENSITY && preferredDensity > 0) {
- // See if there is a better density resource
- if (mconfig.density < bestDensity &&
- mconfig.density > preferredDensity &&
- bestDensity > preferredDensity) {
- // This density is between our best density and
- // the preferred density, therefore it is better.
- bestDensity = mconfig.density;
- } else if (mconfig.density > bestDensity &&
- bestDensity < preferredDensity) {
- // This density is better than our best density and
- // our best density was smaller than our preferred
- // density, so it is better.
- bestDensity = mconfig.density;
- }
- } else if (prefFilter.match(axis, mconfig)) {
- if (bundle->getVerbose()) {
- printf("Pruning unneeded resource: %s\n",
- file->getPrintableSource().string());
- }
- grp->removeFile(k);
- k--;
- break;
- }
- }
- }
-
- if (axis == AXIS_DENSITY && preferredDensity > 0 &&
- bestDensity != config.density) {
- if (bundle->getVerbose()) {
- printf("Pruning unneeded resource: %s\n",
- file->getPrintableSource().string());
- }
- grp->removeFile(k);
- k--;
- }
- }
- }
- }
- }
- }
-
- return NO_ERROR;
-}
-
-sp<AaptSymbols> AaptAssets::getSymbolsFor(const String8& name)
-{
- sp<AaptSymbols> sym = mSymbols.valueFor(name);
- if (sym == NULL) {
- sym = new AaptSymbols();
- mSymbols.add(name, sym);
- }
- return sym;
-}
-
-sp<AaptSymbols> AaptAssets::getJavaSymbolsFor(const String8& name)
-{
- sp<AaptSymbols> sym = mJavaSymbols.valueFor(name);
- if (sym == NULL) {
- sym = new AaptSymbols();
- mJavaSymbols.add(name, sym);
- }
- return sym;
-}
-
-status_t AaptAssets::applyJavaSymbols()
-{
- size_t N = mJavaSymbols.size();
- for (size_t i=0; i<N; i++) {
- const String8& name = mJavaSymbols.keyAt(i);
- const sp<AaptSymbols>& symbols = mJavaSymbols.valueAt(i);
- ssize_t pos = mSymbols.indexOfKey(name);
- if (pos < 0) {
- SourcePos pos;
- pos.error("Java symbol dir %s not defined\n", name.string());
- return UNKNOWN_ERROR;
- }
- //printf("**** applying java symbols in dir %s\n", name.string());
- status_t err = mSymbols.valueAt(pos)->applyJavaSymbols(symbols);
- if (err != NO_ERROR) {
- return err;
- }
- }
-
- return NO_ERROR;
-}
-
-bool AaptAssets::isJavaSymbol(const AaptSymbolEntry& sym, bool includePrivate) const {
- //printf("isJavaSymbol %s: public=%d, includePrivate=%d, isJavaSymbol=%d\n",
- // sym.name.string(), sym.isPublic ? 1 : 0, includePrivate ? 1 : 0,
- // sym.isJavaSymbol ? 1 : 0);
- if (!mHavePrivateSymbols) return true;
- if (sym.isPublic) return true;
- if (includePrivate && sym.isJavaSymbol) return true;
- return false;
-}
-
-status_t AaptAssets::buildIncludedResources(Bundle* bundle)
-{
- if (!mHaveIncludedAssets) {
- // Add in all includes.
- const Vector<const char*>& incl = bundle->getPackageIncludes();
- const size_t N=incl.size();
- for (size_t i=0; i<N; i++) {
- if (bundle->getVerbose())
- printf("Including resources from package: %s\n", incl[i]);
- if (!mIncludedAssets.addAssetPath(String8(incl[i]), NULL)) {
- fprintf(stderr, "ERROR: Asset package include '%s' not found.\n",
- incl[i]);
- return UNKNOWN_ERROR;
- }
- }
- mHaveIncludedAssets = true;
- }
-
- return NO_ERROR;
-}
-
-status_t AaptAssets::addIncludedResources(const sp<AaptFile>& file)
-{
- const ResTable& res = getIncludedResources();
- // XXX dirty!
- return const_cast<ResTable&>(res).add(file->getData(), file->getSize(), NULL);
-}
-
-const ResTable& AaptAssets::getIncludedResources() const
-{
- return mIncludedAssets.getResources(false);
-}
-
-void AaptAssets::print(const String8& prefix) const
-{
- String8 innerPrefix(prefix);
- innerPrefix.append(" ");
- String8 innerInnerPrefix(innerPrefix);
- innerInnerPrefix.append(" ");
- printf("%sConfigurations:\n", prefix.string());
- const size_t N=mGroupEntries.size();
- for (size_t i=0; i<N; i++) {
- String8 cname = mGroupEntries.itemAt(i).toDirName(String8());
- printf("%s %s\n", prefix.string(),
- cname != "" ? cname.string() : "(default)");
- }
-
- printf("\n%sFiles:\n", prefix.string());
- AaptDir::print(innerPrefix);
-
- printf("\n%sResource Dirs:\n", prefix.string());
- const Vector<sp<AaptDir> >& resdirs = mResDirs;
- const size_t NR = resdirs.size();
- for (size_t i=0; i<NR; i++) {
- const sp<AaptDir>& d = resdirs.itemAt(i);
- printf("%s Type %s\n", prefix.string(), d->getLeaf().string());
- d->print(innerInnerPrefix);
- }
-}
-
-sp<AaptDir> AaptAssets::resDir(const String8& name) const
-{
- const Vector<sp<AaptDir> >& resdirs = mResDirs;
- const size_t N = resdirs.size();
- for (size_t i=0; i<N; i++) {
- const sp<AaptDir>& d = resdirs.itemAt(i);
- if (d->getLeaf() == name) {
- return d;
- }
- }
- return NULL;
-}
-
-bool
-valid_symbol_name(const String8& symbol)
-{
- static char const * const KEYWORDS[] = {
- "abstract", "assert", "boolean", "break",
- "byte", "case", "catch", "char", "class", "const", "continue",
- "default", "do", "double", "else", "enum", "extends", "final",
- "finally", "float", "for", "goto", "if", "implements", "import",
- "instanceof", "int", "interface", "long", "native", "new", "package",
- "private", "protected", "public", "return", "short", "static",
- "strictfp", "super", "switch", "synchronized", "this", "throw",
- "throws", "transient", "try", "void", "volatile", "while",
- "true", "false", "null",
- NULL
- };
- const char*const* k = KEYWORDS;
- const char*const s = symbol.string();
- while (*k) {
- if (0 == strcmp(s, *k)) {
- return false;
- }
- k++;
- }
- return true;
-}
diff --git a/tools/aapt/AaptAssets.h b/tools/aapt/AaptAssets.h
deleted file mode 100644
index 5cfa913..0000000
--- a/tools/aapt/AaptAssets.h
+++ /dev/null
@@ -1,633 +0,0 @@
-//
-// Copyright 2006 The Android Open Source Project
-//
-// Information about assets being operated on.
-//
-#ifndef __AAPT_ASSETS_H
-#define __AAPT_ASSETS_H
-
-#include <stdlib.h>
-#include <androidfw/AssetManager.h>
-#include <androidfw/ResourceTypes.h>
-#include <utils/KeyedVector.h>
-#include <utils/RefBase.h>
-#include <utils/SortedVector.h>
-#include <utils/String8.h>
-#include <utils/String8.h>
-#include <utils/Vector.h>
-#include "ZipFile.h"
-
-#include "Bundle.h"
-#include "SourcePos.h"
-
-using namespace android;
-
-
-extern const char * const gDefaultIgnoreAssets;
-extern const char * gUserIgnoreAssets;
-
-bool valid_symbol_name(const String8& str);
-
-class AaptAssets;
-
-enum {
- AXIS_NONE = 0,
- AXIS_MCC = 1,
- AXIS_MNC,
- AXIS_LANGUAGE,
- AXIS_REGION,
- AXIS_SCREENLAYOUTSIZE,
- AXIS_SCREENLAYOUTLONG,
- AXIS_ORIENTATION,
- AXIS_UIMODETYPE,
- AXIS_UIMODENIGHT,
- AXIS_DENSITY,
- AXIS_TOUCHSCREEN,
- AXIS_KEYSHIDDEN,
- AXIS_KEYBOARD,
- AXIS_NAVHIDDEN,
- AXIS_NAVIGATION,
- AXIS_SCREENSIZE,
- AXIS_SMALLESTSCREENWIDTHDP,
- AXIS_SCREENWIDTHDP,
- AXIS_SCREENHEIGHTDP,
- AXIS_LAYOUTDIR,
- AXIS_VERSION,
-
- AXIS_START = AXIS_MCC,
- AXIS_END = AXIS_VERSION,
-};
-
-/**
- * This structure contains a specific variation of a single file out
- * of all the variations it can have that we can have.
- */
-struct AaptGroupEntry
-{
-public:
- AaptGroupEntry() : mParamsChanged(true) { }
- AaptGroupEntry(const String8& _locale, const String8& _vendor)
- : locale(_locale), vendor(_vendor), mParamsChanged(true) { }
-
- bool initFromDirName(const char* dir, String8* resType);
-
- static status_t parseNamePart(const String8& part, int* axis, uint32_t* value);
-
- static uint32_t getConfigValueForAxis(const ResTable_config& config, int axis);
-
- static bool configSameExcept(const ResTable_config& config,
- const ResTable_config& otherConfig, int axis);
-
- static bool getMccName(const char* name, ResTable_config* out = NULL);
- static bool getMncName(const char* name, ResTable_config* out = NULL);
- static bool getLocaleName(const char* name, ResTable_config* out = NULL);
- static bool getScreenLayoutSizeName(const char* name, ResTable_config* out = NULL);
- static bool getScreenLayoutLongName(const char* name, ResTable_config* out = NULL);
- static bool getOrientationName(const char* name, ResTable_config* out = NULL);
- static bool getUiModeTypeName(const char* name, ResTable_config* out = NULL);
- static bool getUiModeNightName(const char* name, ResTable_config* out = NULL);
- static bool getDensityName(const char* name, ResTable_config* out = NULL);
- static bool getTouchscreenName(const char* name, ResTable_config* out = NULL);
- static bool getKeysHiddenName(const char* name, ResTable_config* out = NULL);
- static bool getKeyboardName(const char* name, ResTable_config* out = NULL);
- static bool getNavigationName(const char* name, ResTable_config* out = NULL);
- static bool getNavHiddenName(const char* name, ResTable_config* out = NULL);
- static bool getScreenSizeName(const char* name, ResTable_config* out = NULL);
- static bool getSmallestScreenWidthDpName(const char* name, ResTable_config* out = NULL);
- static bool getScreenWidthDpName(const char* name, ResTable_config* out = NULL);
- static bool getScreenHeightDpName(const char* name, ResTable_config* out = NULL);
- static bool getLayoutDirectionName(const char* name, ResTable_config* out = NULL);
- static bool getVersionName(const char* name, ResTable_config* out = NULL);
-
- int compare(const AaptGroupEntry& o) const;
-
- const ResTable_config& toParams() const;
-
- inline bool operator<(const AaptGroupEntry& o) const { return compare(o) < 0; }
- inline bool operator<=(const AaptGroupEntry& o) const { return compare(o) <= 0; }
- inline bool operator==(const AaptGroupEntry& o) const { return compare(o) == 0; }
- inline bool operator!=(const AaptGroupEntry& o) const { return compare(o) != 0; }
- inline bool operator>=(const AaptGroupEntry& o) const { return compare(o) >= 0; }
- inline bool operator>(const AaptGroupEntry& o) const { return compare(o) > 0; }
-
- String8 toString() const;
- String8 toDirName(const String8& resType) const;
-
- const String8& getVersionString() const { return version; }
-
-private:
- String8 mcc;
- String8 mnc;
- String8 locale;
- String8 vendor;
- String8 smallestScreenWidthDp;
- String8 screenWidthDp;
- String8 screenHeightDp;
- String8 screenLayoutSize;
- String8 screenLayoutLong;
- String8 orientation;
- String8 uiModeType;
- String8 uiModeNight;
- String8 density;
- String8 touchscreen;
- String8 keysHidden;
- String8 keyboard;
- String8 navHidden;
- String8 navigation;
- String8 screenSize;
- String8 layoutDirection;
- String8 version;
-
- mutable bool mParamsChanged;
- mutable ResTable_config mParams;
-};
-
-inline int compare_type(const AaptGroupEntry& lhs, const AaptGroupEntry& rhs)
-{
- return lhs.compare(rhs);
-}
-
-inline int strictly_order_type(const AaptGroupEntry& lhs, const AaptGroupEntry& rhs)
-{
- return compare_type(lhs, rhs) < 0;
-}
-
-class AaptGroup;
-class FilePathStore;
-
-/**
- * A single asset file we know about.
- */
-class AaptFile : public RefBase
-{
-public:
- AaptFile(const String8& sourceFile, const AaptGroupEntry& groupEntry,
- const String8& resType)
- : mGroupEntry(groupEntry)
- , mResourceType(resType)
- , mSourceFile(sourceFile)
- , mData(NULL)
- , mDataSize(0)
- , mBufferSize(0)
- , mCompression(ZipEntry::kCompressStored)
- {
- //printf("new AaptFile created %s\n", (const char*)sourceFile);
- }
- virtual ~AaptFile() {
- free(mData);
- }
-
- const String8& getPath() const { return mPath; }
- const AaptGroupEntry& getGroupEntry() const { return mGroupEntry; }
-
- // Data API. If there is data attached to the file,
- // getSourceFile() is not used.
- bool hasData() const { return mData != NULL; }
- const void* getData() const { return mData; }
- size_t getSize() const { return mDataSize; }
- void* editData(size_t size);
- void* editData(size_t* outSize = NULL);
- void* padData(size_t wordSize);
- status_t writeData(const void* data, size_t size);
- void clearData();
-
- const String8& getResourceType() const { return mResourceType; }
-
- // File API. If the file does not hold raw data, this is
- // a full path to a file on the filesystem that holds its data.
- const String8& getSourceFile() const { return mSourceFile; }
-
- String8 getPrintableSource() const;
-
- // Desired compression method, as per utils/ZipEntry.h. For example,
- // no compression is ZipEntry::kCompressStored.
- int getCompressionMethod() const { return mCompression; }
- void setCompressionMethod(int c) { mCompression = c; }
-private:
- friend class AaptGroup;
-
- String8 mPath;
- AaptGroupEntry mGroupEntry;
- String8 mResourceType;
- String8 mSourceFile;
- void* mData;
- size_t mDataSize;
- size_t mBufferSize;
- int mCompression;
-};
-
-/**
- * A group of related files (the same file, with different
- * vendor/locale variations).
- */
-class AaptGroup : public RefBase
-{
-public:
- AaptGroup(const String8& leaf, const String8& path)
- : mLeaf(leaf), mPath(path) { }
- virtual ~AaptGroup() { }
-
- const String8& getLeaf() const { return mLeaf; }
-
- // Returns the relative path after the AaptGroupEntry dirs.
- const String8& getPath() const { return mPath; }
-
- const DefaultKeyedVector<AaptGroupEntry, sp<AaptFile> >& getFiles() const
- { return mFiles; }
-
- status_t addFile(const sp<AaptFile>& file);
- void removeFile(size_t index);
-
- void print(const String8& prefix) const;
-
- String8 getPrintableSource() const;
-
-private:
- String8 mLeaf;
- String8 mPath;
-
- DefaultKeyedVector<AaptGroupEntry, sp<AaptFile> > mFiles;
-};
-
-/**
- * A single directory of assets, which can contain files and other
- * sub-directories.
- */
-class AaptDir : public RefBase
-{
-public:
- AaptDir(const String8& leaf, const String8& path)
- : mLeaf(leaf), mPath(path) { }
- virtual ~AaptDir() { }
-
- const String8& getLeaf() const { return mLeaf; }
-
- const String8& getPath() const { return mPath; }
-
- const DefaultKeyedVector<String8, sp<AaptGroup> >& getFiles() const { return mFiles; }
- const DefaultKeyedVector<String8, sp<AaptDir> >& getDirs() const { return mDirs; }
-
- virtual status_t addFile(const String8& name, const sp<AaptGroup>& file);
-
- void removeFile(const String8& name);
- void removeDir(const String8& name);
-
- /*
- * Perform some sanity checks on the names of files and directories here.
- * In particular:
- * - Check for illegal chars in filenames.
- * - Check filename length.
- * - Check for presence of ".gz" and non-".gz" copies of same file.
- * - Check for multiple files whose names match in a case-insensitive
- * fashion (problematic for some systems).
- *
- * Comparing names against all other names is O(n^2). We could speed
- * it up some by sorting the entries and being smarter about what we
- * compare against, but I'm not expecting to have enough files in a
- * single directory to make a noticeable difference in speed.
- *
- * Note that sorting here is not enough to guarantee that the package
- * contents are sorted -- subsequent updates can rearrange things.
- */
- status_t validate() const;
-
- void print(const String8& prefix) const;
-
- String8 getPrintableSource() const;
-
-private:
- friend class AaptAssets;
-
- status_t addDir(const String8& name, const sp<AaptDir>& dir);
- sp<AaptDir> makeDir(const String8& name);
- status_t addLeafFile(const String8& leafName,
- const sp<AaptFile>& file);
- virtual ssize_t slurpFullTree(Bundle* bundle,
- const String8& srcDir,
- const AaptGroupEntry& kind,
- const String8& resType,
- sp<FilePathStore>& fullResPaths);
-
- String8 mLeaf;
- String8 mPath;
-
- DefaultKeyedVector<String8, sp<AaptGroup> > mFiles;
- DefaultKeyedVector<String8, sp<AaptDir> > mDirs;
-};
-
-/**
- * All information we know about a particular symbol.
- */
-class AaptSymbolEntry
-{
-public:
- AaptSymbolEntry()
- : isPublic(false), isJavaSymbol(false), typeCode(TYPE_UNKNOWN)
- {
- }
- AaptSymbolEntry(const String8& _name)
- : name(_name), isPublic(false), isJavaSymbol(false), typeCode(TYPE_UNKNOWN)
- {
- }
- AaptSymbolEntry(const AaptSymbolEntry& o)
- : name(o.name), sourcePos(o.sourcePos), isPublic(o.isPublic)
- , isJavaSymbol(o.isJavaSymbol), comment(o.comment), typeComment(o.typeComment)
- , typeCode(o.typeCode), int32Val(o.int32Val), stringVal(o.stringVal)
- {
- }
- AaptSymbolEntry operator=(const AaptSymbolEntry& o)
- {
- sourcePos = o.sourcePos;
- isPublic = o.isPublic;
- isJavaSymbol = o.isJavaSymbol;
- comment = o.comment;
- typeComment = o.typeComment;
- typeCode = o.typeCode;
- int32Val = o.int32Val;
- stringVal = o.stringVal;
- return *this;
- }
-
- const String8 name;
-
- SourcePos sourcePos;
- bool isPublic;
- bool isJavaSymbol;
-
- String16 comment;
- String16 typeComment;
-
- enum {
- TYPE_UNKNOWN = 0,
- TYPE_INT32,
- TYPE_STRING
- };
-
- int typeCode;
-
- // Value. May be one of these.
- int32_t int32Val;
- String8 stringVal;
-};
-
-/**
- * A group of related symbols (such as indices into a string block)
- * that have been generated from the assets.
- */
-class AaptSymbols : public RefBase
-{
-public:
- AaptSymbols() { }
- virtual ~AaptSymbols() { }
-
- status_t addSymbol(const String8& name, int32_t value, const SourcePos& pos) {
- if (!check_valid_symbol_name(name, pos, "symbol")) {
- return BAD_VALUE;
- }
- AaptSymbolEntry& sym = edit_symbol(name, &pos);
- sym.typeCode = AaptSymbolEntry::TYPE_INT32;
- sym.int32Val = value;
- return NO_ERROR;
- }
-
- status_t addStringSymbol(const String8& name, const String8& value,
- const SourcePos& pos) {
- if (!check_valid_symbol_name(name, pos, "symbol")) {
- return BAD_VALUE;
- }
- AaptSymbolEntry& sym = edit_symbol(name, &pos);
- sym.typeCode = AaptSymbolEntry::TYPE_STRING;
- sym.stringVal = value;
- return NO_ERROR;
- }
-
- status_t makeSymbolPublic(const String8& name, const SourcePos& pos) {
- if (!check_valid_symbol_name(name, pos, "symbol")) {
- return BAD_VALUE;
- }
- AaptSymbolEntry& sym = edit_symbol(name, &pos);
- sym.isPublic = true;
- return NO_ERROR;
- }
-
- status_t makeSymbolJavaSymbol(const String8& name, const SourcePos& pos) {
- if (!check_valid_symbol_name(name, pos, "symbol")) {
- return BAD_VALUE;
- }
- AaptSymbolEntry& sym = edit_symbol(name, &pos);
- sym.isJavaSymbol = true;
- return NO_ERROR;
- }
-
- void appendComment(const String8& name, const String16& comment, const SourcePos& pos) {
- if (comment.size() <= 0) {
- return;
- }
- AaptSymbolEntry& sym = edit_symbol(name, &pos);
- if (sym.comment.size() == 0) {
- sym.comment = comment;
- } else {
- sym.comment.append(String16("\n"));
- sym.comment.append(comment);
- }
- }
-
- void appendTypeComment(const String8& name, const String16& comment) {
- if (comment.size() <= 0) {
- return;
- }
- AaptSymbolEntry& sym = edit_symbol(name, NULL);
- if (sym.typeComment.size() == 0) {
- sym.typeComment = comment;
- } else {
- sym.typeComment.append(String16("\n"));
- sym.typeComment.append(comment);
- }
- }
-
- sp<AaptSymbols> addNestedSymbol(const String8& name, const SourcePos& pos) {
- if (!check_valid_symbol_name(name, pos, "nested symbol")) {
- return NULL;
- }
-
- sp<AaptSymbols> sym = mNestedSymbols.valueFor(name);
- if (sym == NULL) {
- sym = new AaptSymbols();
- mNestedSymbols.add(name, sym);
- }
-
- return sym;
- }
-
- status_t applyJavaSymbols(const sp<AaptSymbols>& javaSymbols);
-
- const KeyedVector<String8, AaptSymbolEntry>& getSymbols() const
- { return mSymbols; }
- const DefaultKeyedVector<String8, sp<AaptSymbols> >& getNestedSymbols() const
- { return mNestedSymbols; }
-
- const String16& getComment(const String8& name) const
- { return get_symbol(name).comment; }
- const String16& getTypeComment(const String8& name) const
- { return get_symbol(name).typeComment; }
-
-private:
- bool check_valid_symbol_name(const String8& symbol, const SourcePos& pos, const char* label) {
- if (valid_symbol_name(symbol)) {
- return true;
- }
- pos.error("invalid %s: '%s'\n", label, symbol.string());
- return false;
- }
- AaptSymbolEntry& edit_symbol(const String8& symbol, const SourcePos* pos) {
- ssize_t i = mSymbols.indexOfKey(symbol);
- if (i < 0) {
- i = mSymbols.add(symbol, AaptSymbolEntry(symbol));
- }
- AaptSymbolEntry& sym = mSymbols.editValueAt(i);
- if (pos != NULL && sym.sourcePos.line < 0) {
- sym.sourcePos = *pos;
- }
- return sym;
- }
- const AaptSymbolEntry& get_symbol(const String8& symbol) const {
- ssize_t i = mSymbols.indexOfKey(symbol);
- if (i >= 0) {
- return mSymbols.valueAt(i);
- }
- return mDefSymbol;
- }
-
- KeyedVector<String8, AaptSymbolEntry> mSymbols;
- DefaultKeyedVector<String8, sp<AaptSymbols> > mNestedSymbols;
- AaptSymbolEntry mDefSymbol;
-};
-
-class ResourceTypeSet : public RefBase,
- public KeyedVector<String8,sp<AaptGroup> >
-{
-public:
- ResourceTypeSet();
-};
-
-// Storage for lists of fully qualified paths for
-// resources encountered during slurping.
-class FilePathStore : public RefBase,
- public Vector<String8>
-{
-public:
- FilePathStore();
-};
-
-/**
- * Asset hierarchy being operated on.
- */
-class AaptAssets : public AaptDir
-{
-public:
- AaptAssets();
- virtual ~AaptAssets() { delete mRes; }
-
- const String8& getPackage() const { return mPackage; }
- void setPackage(const String8& package) {
- mPackage = package;
- mSymbolsPrivatePackage = package;
- mHavePrivateSymbols = false;
- }
-
- const SortedVector<AaptGroupEntry>& getGroupEntries() const;
-
- virtual status_t addFile(const String8& name, const sp<AaptGroup>& file);
-
- sp<AaptFile> addFile(const String8& filePath,
- const AaptGroupEntry& entry,
- const String8& srcDir,
- sp<AaptGroup>* outGroup,
- const String8& resType);
-
- void addResource(const String8& leafName,
- const String8& path,
- const sp<AaptFile>& file,
- const String8& resType);
-
- void addGroupEntry(const AaptGroupEntry& entry) { mGroupEntries.add(entry); }
-
- ssize_t slurpFromArgs(Bundle* bundle);
-
- sp<AaptSymbols> getSymbolsFor(const String8& name);
-
- sp<AaptSymbols> getJavaSymbolsFor(const String8& name);
-
- status_t applyJavaSymbols();
-
- const DefaultKeyedVector<String8, sp<AaptSymbols> >& getSymbols() const { return mSymbols; }
-
- String8 getSymbolsPrivatePackage() const { return mSymbolsPrivatePackage; }
- void setSymbolsPrivatePackage(const String8& pkg) {
- mSymbolsPrivatePackage = pkg;
- mHavePrivateSymbols = mSymbolsPrivatePackage != mPackage;
- }
-
- bool havePrivateSymbols() const { return mHavePrivateSymbols; }
-
- bool isJavaSymbol(const AaptSymbolEntry& sym, bool includePrivate) const;
-
- status_t buildIncludedResources(Bundle* bundle);
- status_t addIncludedResources(const sp<AaptFile>& file);
- const ResTable& getIncludedResources() const;
-
- void print(const String8& prefix) const;
-
- inline const Vector<sp<AaptDir> >& resDirs() const { return mResDirs; }
- sp<AaptDir> resDir(const String8& name) const;
-
- 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) { delete mRes; mRes = res; }
-
- inline sp<FilePathStore>& getFullResPaths() { return mFullResPaths; }
- inline void
- setFullResPaths(sp<FilePathStore>& res) { mFullResPaths = res; }
-
- inline sp<FilePathStore>& getFullAssetPaths() { return mFullAssetPaths; }
- inline void
- setFullAssetPaths(sp<FilePathStore>& res) { mFullAssetPaths = res; }
-
-private:
- virtual ssize_t slurpFullTree(Bundle* bundle,
- const String8& srcDir,
- const AaptGroupEntry& kind,
- const String8& resType,
- sp<FilePathStore>& fullResPaths);
-
- ssize_t slurpResourceTree(Bundle* bundle, const String8& srcDir);
- ssize_t slurpResourceZip(Bundle* bundle, const char* filename);
-
- status_t filter(Bundle* bundle);
-
- String8 mPackage;
- SortedVector<AaptGroupEntry> mGroupEntries;
- DefaultKeyedVector<String8, sp<AaptSymbols> > mSymbols;
- DefaultKeyedVector<String8, sp<AaptSymbols> > mJavaSymbols;
- String8 mSymbolsPrivatePackage;
- bool mHavePrivateSymbols;
-
- Vector<sp<AaptDir> > mResDirs;
-
- bool mChanged;
-
- bool mHaveIncludedAssets;
- AssetManager mIncludedAssets;
-
- sp<AaptAssets> mOverlay;
- KeyedVector<String8, sp<ResourceTypeSet> >* mRes;
-
- sp<FilePathStore> mFullResPaths;
- sp<FilePathStore> mFullAssetPaths;
-};
-
-#endif // __AAPT_ASSETS_H
-
diff --git a/tools/aapt/Android.mk b/tools/aapt/Android.mk
deleted file mode 100644
index 452c60a..0000000
--- a/tools/aapt/Android.mk
+++ /dev/null
@@ -1,103 +0,0 @@
-#
-# Copyright 2006 The Android Open Source Project
-#
-# Android Asset Packaging Tool
-#
-
-# This tool is prebuilt if we're doing an app-only build.
-ifeq ($(TARGET_BUILD_APPS),)
-
-
-aapt_src_files := \
- AaptAssets.cpp \
- Command.cpp \
- CrunchCache.cpp \
- FileFinder.cpp \
- Main.cpp \
- Package.cpp \
- StringPool.cpp \
- XMLNode.cpp \
- ResourceFilter.cpp \
- ResourceIdCache.cpp \
- ResourceTable.cpp \
- Images.cpp \
- Resource.cpp \
- pseudolocalize.cpp \
- SourcePos.cpp \
- WorkQueue.cpp \
- ZipEntry.cpp \
- ZipFile.cpp \
- qsort_r_compat.c
-
-LOCAL_PATH:= $(call my-dir)
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := $(aapt_src_files)
-
-LOCAL_CFLAGS += -Wno-format-y2k
-ifeq (darwin,$(HOST_OS))
-LOCAL_CFLAGS += -D_DARWIN_UNLIMITED_STREAMS
-endif
-
-LOCAL_CFLAGS += -DSTATIC_ANDROIDFW_FOR_TOOLS
-
-LOCAL_C_INCLUDES += external/libpng
-LOCAL_C_INCLUDES += external/zlib
-
-LOCAL_STATIC_LIBRARIES := \
- libandroidfw \
- libutils \
- libcutils \
- libexpat \
- libpng \
- liblog
-
-ifeq ($(HOST_OS),linux)
-LOCAL_LDLIBS += -lrt -ldl -lpthread
-endif
-
-# Statically link libz for MinGW (Win SDK under Linux),
-# and dynamically link for all others.
-ifneq ($(strip $(USE_MINGW)),)
- LOCAL_STATIC_LIBRARIES += libz
-else
- LOCAL_LDLIBS += -lz
-endif
-
-LOCAL_MODULE := aapt
-
-include $(BUILD_HOST_EXECUTABLE)
-
-# aapt for running on the device
-# =========================================================
-ifneq ($(SDK_ONLY),true)
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := $(aapt_src_files)
-
-LOCAL_MODULE := aapt
-
-LOCAL_C_INCLUDES += bionic
-LOCAL_C_INCLUDES += bionic/libstdc++/include
-LOCAL_C_INCLUDES += external/stlport/stlport
-LOCAL_C_INCLUDES += external/libpng
-LOCAL_C_INCLUDES += external/zlib
-
-LOCAL_CFLAGS += -Wno-non-virtual-dtor
-
-LOCAL_SHARED_LIBRARIES := \
- libandroidfw \
- libutils \
- libcutils \
- libpng \
- liblog \
- libz
-
-LOCAL_STATIC_LIBRARIES := \
- libstlport_static \
- libexpat_static
-
-include $(BUILD_EXECUTABLE)
-endif
-
-endif # TARGET_BUILD_APPS
diff --git a/tools/aapt/Bundle.h b/tools/aapt/Bundle.h
deleted file mode 100644
index 5089b9d..0000000
--- a/tools/aapt/Bundle.h
+++ /dev/null
@@ -1,306 +0,0 @@
-//
-// Copyright 2006 The Android Open Source Project
-//
-// State bundle. Used to pass around stuff like command-line args.
-//
-#ifndef __BUNDLE_H
-#define __BUNDLE_H
-
-#include <stdlib.h>
-#include <utils/Log.h>
-#include <utils/threads.h>
-#include <utils/List.h>
-#include <utils/Errors.h>
-#include <utils/String8.h>
-#include <utils/Vector.h>
-
-enum {
- SDK_CUPCAKE = 3,
- SDK_DONUT = 4,
- SDK_ECLAIR = 5,
- SDK_ECLAIR_0_1 = 6,
- SDK_MR1 = 7,
- SDK_FROYO = 8,
- SDK_HONEYCOMB_MR2 = 13,
- SDK_ICE_CREAM_SANDWICH = 14,
- SDK_ICE_CREAM_SANDWICH_MR1 = 15,
-};
-
-/*
- * Things we can do.
- */
-typedef enum Command {
- kCommandUnknown = 0,
- kCommandVersion,
- kCommandList,
- kCommandDump,
- kCommandAdd,
- kCommandRemove,
- kCommandPackage,
- kCommandCrunch,
- kCommandSingleCrunch,
-} Command;
-
-/*
- * Bundle of goodies, including everything specified on the command line.
- */
-class Bundle {
-public:
- Bundle(void)
- : mCmd(kCommandUnknown), mVerbose(false), mAndroidList(false),
- mForce(false), mGrayscaleTolerance(0), mMakePackageDirs(false),
- mUpdate(false), mExtending(false),
- mRequireLocalization(false), mPseudolocalize(false),
- mWantUTF16(false), mValues(false),
- mCompressionMethod(0), mJunkPath(false), mOutputAPKFile(NULL),
- mManifestPackageNameOverride(NULL), mInstrumentationPackageNameOverride(NULL),
- mAutoAddOverlay(false), mGenDependencies(false),
- mAssetSourceDir(NULL),
- mCrunchedOutputDir(NULL), mProguardFile(NULL),
- mAndroidManifestFile(NULL), mPublicOutputFile(NULL),
- mRClassDir(NULL), mResourceIntermediatesDir(NULL), mManifestMinSdkVersion(NULL),
- mMinSdkVersion(NULL), mTargetSdkVersion(NULL), mMaxSdkVersion(NULL),
- mVersionCode(NULL), mVersionName(NULL), mCustomPackage(NULL), mExtraPackages(NULL),
- mMaxResVersion(NULL), mDebugMode(false), mNonConstantId(false), mProduct(NULL),
- mUseCrunchCache(false), mErrorOnFailedInsert(false), mOutputTextSymbols(NULL),
- mSingleCrunchInputFile(NULL), mSingleCrunchOutputFile(NULL),
- mArgc(0), mArgv(NULL)
- {}
- ~Bundle(void) {}
-
- /*
- * Set the command value. Returns "false" if it was previously set.
- */
- Command getCommand(void) const { return mCmd; }
- void setCommand(Command cmd) { mCmd = cmd; }
-
- /*
- * Command modifiers. Not all modifiers are appropriate for all
- * commands.
- */
- bool getVerbose(void) const { return mVerbose; }
- void setVerbose(bool val) { mVerbose = val; }
- bool getAndroidList(void) const { return mAndroidList; }
- 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() const { return mGrayscaleTolerance; }
- bool getMakePackageDirs(void) const { return mMakePackageDirs; }
- void setMakePackageDirs(bool val) { mMakePackageDirs = val; }
- bool getUpdate(void) const { return mUpdate; }
- void setUpdate(bool val) { mUpdate = val; }
- bool getExtending(void) const { return mExtending; }
- void setExtending(bool val) { mExtending = val; }
- bool getRequireLocalization(void) const { return mRequireLocalization; }
- void setRequireLocalization(bool val) { mRequireLocalization = val; }
- bool getPseudolocalize(void) const { return mPseudolocalize; }
- void setPseudolocalize(bool val) { mPseudolocalize = val; }
- void setWantUTF16(bool val) { mWantUTF16 = val; }
- bool getValues(void) const { return mValues; }
- void setValues(bool val) { mValues = val; }
- int getCompressionMethod(void) const { return mCompressionMethod; }
- void setCompressionMethod(int val) { mCompressionMethod = val; }
- bool getJunkPath(void) const { return mJunkPath; }
- void setJunkPath(bool val) { mJunkPath = val; }
- const char* getOutputAPKFile() const { return mOutputAPKFile; }
- void setOutputAPKFile(const char* val) { mOutputAPKFile = val; }
- const char* getManifestPackageNameOverride() const { return mManifestPackageNameOverride; }
- void setManifestPackageNameOverride(const char * val) { mManifestPackageNameOverride = val; }
- const char* getInstrumentationPackageNameOverride() const { return mInstrumentationPackageNameOverride; }
- void setInstrumentationPackageNameOverride(const char * val) { mInstrumentationPackageNameOverride = val; }
- bool getAutoAddOverlay() { return mAutoAddOverlay; }
- void setAutoAddOverlay(bool val) { mAutoAddOverlay = val; }
- bool getGenDependencies() { return mGenDependencies; }
- void setGenDependencies(bool val) { mGenDependencies = val; }
- bool getErrorOnFailedInsert() { return mErrorOnFailedInsert; }
- void setErrorOnFailedInsert(bool val) { mErrorOnFailedInsert = val; }
-
- bool getUTF16StringsOption() {
- return mWantUTF16 || !isMinSdkAtLeast(SDK_FROYO);
- }
-
- /*
- * Input options.
- */
- const char* getAssetSourceDir() const { return mAssetSourceDir; }
- void setAssetSourceDir(const char* dir) { mAssetSourceDir = dir; }
- const char* getCrunchedOutputDir() const { return mCrunchedOutputDir; }
- void setCrunchedOutputDir(const char* dir) { mCrunchedOutputDir = dir; }
- const char* getProguardFile() const { return mProguardFile; }
- void setProguardFile(const char* file) { mProguardFile = file; }
- 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; }
- void setPublicOutputFile(const char* file) { mPublicOutputFile = file; }
- const char* getRClassDir() const { return mRClassDir; }
- void setRClassDir(const char* dir) { mRClassDir = dir; }
- const char* getConfigurations() const { return mConfigurations.size() > 0 ? mConfigurations.string() : NULL; }
- void addConfigurations(const char* val) { if (mConfigurations.size() > 0) { mConfigurations.append(","); mConfigurations.append(val); } else { mConfigurations = val; } }
- const char* getPreferredConfigurations() const { return mPreferredConfigurations.size() > 0 ? mPreferredConfigurations.string() : NULL; }
- void addPreferredConfigurations(const char* val) { if (mPreferredConfigurations.size() > 0) { mPreferredConfigurations.append(","); mPreferredConfigurations.append(val); } else { mPreferredConfigurations = val; } }
- const char* getResourceIntermediatesDir() const { return mResourceIntermediatesDir; }
- void setResourceIntermediatesDir(const char* dir) { mResourceIntermediatesDir = dir; }
- const android::Vector<const char*>& getPackageIncludes() const { return mPackageIncludes; }
- void addPackageInclude(const char* file) { mPackageIncludes.add(file); }
- const android::Vector<const char*>& getJarFiles() const { return mJarFiles; }
- void addJarFile(const char* file) { mJarFiles.add(file); }
- const android::Vector<const char*>& getNoCompressExtensions() const { return mNoCompressExtensions; }
- void addNoCompressExtension(const char* ext) { mNoCompressExtensions.add(ext); }
-
- const char* getManifestMinSdkVersion() const { return mManifestMinSdkVersion; }
- void setManifestMinSdkVersion(const char* val) { mManifestMinSdkVersion = val; }
- const char* getMinSdkVersion() const { return mMinSdkVersion; }
- void setMinSdkVersion(const char* val) { mMinSdkVersion = val; }
- const char* getTargetSdkVersion() const { return mTargetSdkVersion; }
- void setTargetSdkVersion(const char* val) { mTargetSdkVersion = val; }
- const char* getMaxSdkVersion() const { return mMaxSdkVersion; }
- void setMaxSdkVersion(const char* val) { mMaxSdkVersion = val; }
- const char* getVersionCode() const { return mVersionCode; }
- void setVersionCode(const char* val) { mVersionCode = val; }
- const char* getVersionName() const { return mVersionName; }
- void setVersionName(const char* val) { mVersionName = val; }
- const char* getCustomPackage() const { return mCustomPackage; }
- void setCustomPackage(const char* val) { mCustomPackage = val; }
- const char* getExtraPackages() const { return mExtraPackages; }
- void setExtraPackages(const char* val) { mExtraPackages = val; }
- const char* getMaxResVersion() const { return mMaxResVersion; }
- void setMaxResVersion(const char * val) { mMaxResVersion = val; }
- bool getDebugMode() const { return mDebugMode; }
- void setDebugMode(bool val) { mDebugMode = val; }
- bool getNonConstantId() const { return mNonConstantId; }
- void setNonConstantId(bool val) { mNonConstantId = val; }
- const char* getProduct() const { return mProduct; }
- void setProduct(const char * val) { mProduct = val; }
- void setUseCrunchCache(bool val) { mUseCrunchCache = val; }
- bool getUseCrunchCache() const { return mUseCrunchCache; }
- const char* getOutputTextSymbols() const { return mOutputTextSymbols; }
- void setOutputTextSymbols(const char* val) { mOutputTextSymbols = val; }
- const char* getSingleCrunchInputFile() const { return mSingleCrunchInputFile; }
- void setSingleCrunchInputFile(const char* val) { mSingleCrunchInputFile = val; }
- const char* getSingleCrunchOutputFile() const { return mSingleCrunchOutputFile; }
- void setSingleCrunchOutputFile(const char* val) { mSingleCrunchOutputFile = val; }
-
- /*
- * Set and get the file specification.
- *
- * Note this does NOT make a copy of argv.
- */
- void setFileSpec(char* const argv[], int argc) {
- mArgc = argc;
- mArgv = argv;
- }
- int getFileSpecCount(void) const { return mArgc; }
- const char* getFileSpecEntry(int idx) const { return mArgv[idx]; }
- void eatArgs(int n) {
- if (n > mArgc) n = mArgc;
- mArgv += n;
- mArgc -= n;
- }
-
-#if 0
- /*
- * Package count. Nothing to do with anything else here; this is
- * just a convenient place to stuff it so we don't have to pass it
- * around everywhere.
- */
- int getPackageCount(void) const { return mPackageCount; }
- void setPackageCount(int val) { mPackageCount = val; }
-#endif
-
- /* Certain features may only be available on a specific SDK level or
- * above. SDK levels that have a non-numeric identifier are assumed
- * to be newer than any SDK level that has a number designated.
- */
- bool isMinSdkAtLeast(int desired) {
- /* If the application specifies a minSdkVersion in the manifest
- * then use that. Otherwise, check what the user specified on
- * the command line. If neither, it's not available since
- * the minimum SDK version is assumed to be 1.
- */
- const char *minVer;
- if (mManifestMinSdkVersion != NULL) {
- minVer = mManifestMinSdkVersion;
- } else if (mMinSdkVersion != NULL) {
- minVer = mMinSdkVersion;
- } else {
- return false;
- }
-
- char *end;
- int minSdkNum = (int)strtol(minVer, &end, 0);
- if (*end == '\0') {
- if (minSdkNum < desired) {
- return false;
- }
- }
- return true;
- }
-
-private:
- /* commands & modifiers */
- Command mCmd;
- bool mVerbose;
- bool mAndroidList;
- bool mForce;
- int mGrayscaleTolerance;
- bool mMakePackageDirs;
- bool mUpdate;
- bool mExtending;
- bool mRequireLocalization;
- bool mPseudolocalize;
- bool mWantUTF16;
- bool mValues;
- int mCompressionMethod;
- bool mJunkPath;
- const char* mOutputAPKFile;
- const char* mManifestPackageNameOverride;
- const char* mInstrumentationPackageNameOverride;
- bool mAutoAddOverlay;
- bool mGenDependencies;
- const char* mAssetSourceDir;
- const char* mCrunchedOutputDir;
- const char* mProguardFile;
- const char* mAndroidManifestFile;
- const char* mPublicOutputFile;
- const char* mRClassDir;
- const char* mResourceIntermediatesDir;
- android::String8 mConfigurations;
- android::String8 mPreferredConfigurations;
- android::Vector<const char*> mPackageIncludes;
- android::Vector<const char*> mJarFiles;
- android::Vector<const char*> mNoCompressExtensions;
- android::Vector<const char*> mResourceSourceDirs;
-
- const char* mManifestMinSdkVersion;
- const char* mMinSdkVersion;
- const char* mTargetSdkVersion;
- const char* mMaxSdkVersion;
- const char* mVersionCode;
- const char* mVersionName;
- const char* mCustomPackage;
- const char* mExtraPackages;
- const char* mMaxResVersion;
- bool mDebugMode;
- bool mNonConstantId;
- const char* mProduct;
- bool mUseCrunchCache;
- bool mErrorOnFailedInsert;
- const char* mOutputTextSymbols;
- const char* mSingleCrunchInputFile;
- const char* mSingleCrunchOutputFile;
-
- /* file specification */
- int mArgc;
- char* const* mArgv;
-
-#if 0
- /* misc stuff */
- int mPackageCount;
-#endif
-
-};
-
-#endif // __BUNDLE_H
diff --git a/tools/aapt/CacheUpdater.h b/tools/aapt/CacheUpdater.h
deleted file mode 100644
index 0e65589..0000000
--- a/tools/aapt/CacheUpdater.h
+++ /dev/null
@@ -1,107 +0,0 @@
-//
-// Copyright 2011 The Android Open Source Project
-//
-// Abstraction of calls to system to make directories and delete files and
-// wrapper to image processing.
-
-#ifndef CACHE_UPDATER_H
-#define CACHE_UPDATER_H
-
-#include <utils/String8.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <stdio.h>
-#include "Images.h"
-
-using namespace android;
-
-/** CacheUpdater
- * This is a pure virtual class that declares abstractions of functions useful
- * for managing a cache files. This manager is set up to be used in a
- * mirror cache where the source tree is duplicated and filled with processed
- * images. This class is abstracted to allow for dependency injection during
- * unit testing.
- * Usage:
- * To update/add a file to the cache, call processImage
- * To remove a file from the cache, call deleteFile
- */
-class CacheUpdater {
-public:
- // Make sure all the directories along this path exist
- virtual void ensureDirectoriesExist(String8 path) = 0;
-
- // Delete a file
- virtual void deleteFile(String8 path) = 0;
-
- // Process an image from source out to dest
- virtual void processImage(String8 source, String8 dest) = 0;
-private:
-};
-
-/** SystemCacheUpdater
- * This is an implementation of the above virtual cache updater specification.
- * This implementations hits the filesystem to manage a cache and calls out to
- * the PNG crunching in images.h to process images out to its cache components.
- */
-class SystemCacheUpdater : public CacheUpdater {
-public:
- // Constructor to set bundle to pass to preProcessImage
- SystemCacheUpdater (Bundle* b)
- : bundle(b) { };
-
- // Make sure all the directories along this path exist
- virtual void ensureDirectoriesExist(String8 path)
- {
- // Check to see if we're dealing with a fully qualified path
- String8 existsPath;
- String8 toCreate;
- String8 remains;
- struct stat s;
-
- // Check optomistically to see if all directories exist.
- // If something in the path doesn't exist, then walk the path backwards
- // and find the place to start creating directories forward.
- if (stat(path.string(),&s) == -1) {
- // Walk backwards to find place to start creating directories
- existsPath = path;
- do {
- // As we remove the end of existsPath add it to
- // the string of paths to create.
- toCreate = existsPath.getPathLeaf().appendPath(toCreate);
- existsPath = existsPath.getPathDir();
- } while (stat(existsPath.string(),&s) == -1);
-
- // Walk forwards and build directories as we go
- do {
- // Advance to the next segment of the path
- existsPath.appendPath(toCreate.walkPath(&remains));
- toCreate = remains;
-#ifdef HAVE_MS_C_RUNTIME
- _mkdir(existsPath.string());
-#else
- mkdir(existsPath.string(), S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IXGRP);
-#endif
- } while (remains.length() > 0);
- } //if
- };
-
- // Delete a file
- virtual void deleteFile(String8 path)
- {
- if (remove(path.string()) != 0)
- fprintf(stderr,"ERROR DELETING %s\n",path.string());
- };
-
- // Process an image from source out to dest
- virtual void processImage(String8 source, String8 dest)
- {
- // Make sure we're trying to write to a directory that is extant
- ensureDirectoriesExist(dest.getPathDir());
-
- preProcessImageToCache(bundle, source, dest);
- };
-private:
- Bundle* bundle;
-};
-
-#endif // CACHE_UPDATER_H \ No newline at end of file
diff --git a/tools/aapt/Command.cpp b/tools/aapt/Command.cpp
deleted file mode 100644
index 632efe0..0000000
--- a/tools/aapt/Command.cpp
+++ /dev/null
@@ -1,2269 +0,0 @@
-//
-// Copyright 2006 The Android Open Source Project
-//
-// Android Asset Packaging Tool main entry point.
-//
-#include "Main.h"
-#include "Bundle.h"
-#include "ResourceFilter.h"
-#include "ResourceTable.h"
-#include "Images.h"
-#include "XMLNode.h"
-
-#include <utils/Log.h>
-#include <utils/threads.h>
-#include <utils/List.h>
-#include <utils/Errors.h>
-
-#include <fcntl.h>
-#include <errno.h>
-
-using namespace android;
-
-/*
- * Show version info. All the cool kids do it.
- */
-int doVersion(Bundle* bundle)
-{
- if (bundle->getFileSpecCount() != 0)
- printf("(ignoring extra arguments)\n");
- printf("Android Asset Packaging Tool, v0.2\n");
-
- return 0;
-}
-
-
-/*
- * Open the file read only. The call fails if the file doesn't exist.
- *
- * Returns NULL on failure.
- */
-ZipFile* openReadOnly(const char* fileName)
-{
- ZipFile* zip;
- status_t result;
-
- zip = new ZipFile;
- result = zip->open(fileName, ZipFile::kOpenReadOnly);
- if (result != NO_ERROR) {
- if (result == NAME_NOT_FOUND)
- fprintf(stderr, "ERROR: '%s' not found\n", fileName);
- else if (result == PERMISSION_DENIED)
- fprintf(stderr, "ERROR: '%s' access denied\n", fileName);
- else
- fprintf(stderr, "ERROR: failed opening '%s' as Zip file\n",
- fileName);
- delete zip;
- return NULL;
- }
-
- return zip;
-}
-
-/*
- * Open the file read-write. The file will be created if it doesn't
- * already exist and "okayToCreate" is set.
- *
- * Returns NULL on failure.
- */
-ZipFile* openReadWrite(const char* fileName, bool okayToCreate)
-{
- ZipFile* zip = NULL;
- status_t result;
- int flags;
-
- flags = ZipFile::kOpenReadWrite;
- if (okayToCreate)
- flags |= ZipFile::kOpenCreate;
-
- zip = new ZipFile;
- result = zip->open(fileName, flags);
- if (result != NO_ERROR) {
- delete zip;
- zip = NULL;
- goto bail;
- }
-
-bail:
- return zip;
-}
-
-
-/*
- * Return a short string describing the compression method.
- */
-const char* compressionName(int method)
-{
- if (method == ZipEntry::kCompressStored)
- return "Stored";
- else if (method == ZipEntry::kCompressDeflated)
- return "Deflated";
- else
- return "Unknown";
-}
-
-/*
- * Return the percent reduction in size (0% == no compression).
- */
-int calcPercent(long uncompressedLen, long compressedLen)
-{
- if (!uncompressedLen)
- return 0;
- else
- return (int) (100.0 - (compressedLen * 100.0) / uncompressedLen + 0.5);
-}
-
-/*
- * Handle the "list" command, which can be a simple file dump or
- * a verbose listing.
- *
- * The verbose listing closely matches the output of the Info-ZIP "unzip"
- * command.
- */
-int doList(Bundle* bundle)
-{
- int result = 1;
- ZipFile* zip = NULL;
- const ZipEntry* entry;
- long totalUncLen, totalCompLen;
- const char* zipFileName;
-
- if (bundle->getFileSpecCount() != 1) {
- fprintf(stderr, "ERROR: specify zip file name (only)\n");
- goto bail;
- }
- zipFileName = bundle->getFileSpecEntry(0);
-
- zip = openReadOnly(zipFileName);
- if (zip == NULL)
- goto bail;
-
- int count, i;
-
- if (bundle->getVerbose()) {
- printf("Archive: %s\n", zipFileName);
- printf(
- " Length Method Size Ratio Offset Date Time CRC-32 Name\n");
- printf(
- "-------- ------ ------- ----- ------- ---- ---- ------ ----\n");
- }
-
- totalUncLen = totalCompLen = 0;
-
- count = zip->getNumEntries();
- for (i = 0; i < count; i++) {
- entry = zip->getEntryByIndex(i);
- if (bundle->getVerbose()) {
- char dateBuf[32];
- time_t when;
-
- when = entry->getModWhen();
- strftime(dateBuf, sizeof(dateBuf), "%m-%d-%y %H:%M",
- localtime(&when));
-
- printf("%8ld %-7.7s %7ld %3d%% %8zd %s %08lx %s\n",
- (long) entry->getUncompressedLen(),
- compressionName(entry->getCompressionMethod()),
- (long) entry->getCompressedLen(),
- calcPercent(entry->getUncompressedLen(),
- entry->getCompressedLen()),
- (size_t) entry->getLFHOffset(),
- dateBuf,
- entry->getCRC32(),
- entry->getFileName());
- } else {
- printf("%s\n", entry->getFileName());
- }
-
- totalUncLen += entry->getUncompressedLen();
- totalCompLen += entry->getCompressedLen();
- }
-
- if (bundle->getVerbose()) {
- printf(
- "-------- ------- --- -------\n");
- printf("%8ld %7ld %2d%% %d files\n",
- totalUncLen,
- totalCompLen,
- calcPercent(totalUncLen, totalCompLen),
- zip->getNumEntries());
- }
-
- if (bundle->getAndroidList()) {
- AssetManager assets;
- if (!assets.addAssetPath(String8(zipFileName), NULL)) {
- fprintf(stderr, "ERROR: list -a failed because assets could not be loaded\n");
- goto bail;
- }
-
- const ResTable& res = assets.getResources(false);
- if (&res == NULL) {
- printf("\nNo resource table found.\n");
- } else {
-#ifndef HAVE_ANDROID_OS
- printf("\nResource table:\n");
- res.print(false);
-#endif
- }
-
- Asset* manifestAsset = assets.openNonAsset("AndroidManifest.xml",
- Asset::ACCESS_BUFFER);
- if (manifestAsset == NULL) {
- printf("\nNo AndroidManifest.xml found.\n");
- } else {
- printf("\nAndroid manifest:\n");
- ResXMLTree tree;
- tree.setTo(manifestAsset->getBuffer(true),
- manifestAsset->getLength());
- printXMLBlock(&tree);
- }
- delete manifestAsset;
- }
-
- result = 0;
-
-bail:
- delete zip;
- return result;
-}
-
-static ssize_t indexOfAttribute(const ResXMLTree& tree, uint32_t attrRes)
-{
- size_t N = tree.getAttributeCount();
- for (size_t i=0; i<N; i++) {
- if (tree.getAttributeNameResID(i) == attrRes) {
- return (ssize_t)i;
- }
- }
- return -1;
-}
-
-String8 getAttribute(const ResXMLTree& tree, const char* ns,
- const char* attr, String8* outError)
-{
- ssize_t idx = tree.indexOfAttribute(ns, attr);
- if (idx < 0) {
- return String8();
- }
- Res_value value;
- if (tree.getAttributeValue(idx, &value) != NO_ERROR) {
- if (value.dataType != Res_value::TYPE_STRING) {
- if (outError != NULL) *outError = "attribute is not a string value";
- return String8();
- }
- }
- size_t len;
- const uint16_t* str = tree.getAttributeStringValue(idx, &len);
- return str ? String8(str, len) : String8();
-}
-
-static String8 getAttribute(const ResXMLTree& tree, uint32_t attrRes, String8* outError)
-{
- ssize_t idx = indexOfAttribute(tree, attrRes);
- if (idx < 0) {
- return String8();
- }
- Res_value value;
- if (tree.getAttributeValue(idx, &value) != NO_ERROR) {
- if (value.dataType != Res_value::TYPE_STRING) {
- if (outError != NULL) *outError = "attribute is not a string value";
- return String8();
- }
- }
- size_t len;
- const uint16_t* str = tree.getAttributeStringValue(idx, &len);
- return str ? String8(str, len) : String8();
-}
-
-static int32_t getIntegerAttribute(const ResXMLTree& tree, uint32_t attrRes,
- String8* outError, int32_t defValue = -1)
-{
- ssize_t idx = indexOfAttribute(tree, attrRes);
- if (idx < 0) {
- return defValue;
- }
- Res_value value;
- if (tree.getAttributeValue(idx, &value) != NO_ERROR) {
- if (value.dataType < Res_value::TYPE_FIRST_INT
- || value.dataType > Res_value::TYPE_LAST_INT) {
- if (outError != NULL) *outError = "attribute is not an integer value";
- return defValue;
- }
- }
- return value.data;
-}
-
-static int32_t getResolvedIntegerAttribute(const ResTable* resTable, const ResXMLTree& tree,
- uint32_t attrRes, String8* outError, int32_t defValue = -1)
-{
- ssize_t idx = indexOfAttribute(tree, attrRes);
- if (idx < 0) {
- return defValue;
- }
- Res_value value;
- if (tree.getAttributeValue(idx, &value) != NO_ERROR) {
- if (value.dataType == Res_value::TYPE_REFERENCE) {
- resTable->resolveReference(&value, 0);
- }
- if (value.dataType < Res_value::TYPE_FIRST_INT
- || value.dataType > Res_value::TYPE_LAST_INT) {
- if (outError != NULL) *outError = "attribute is not an integer value";
- return defValue;
- }
- }
- return value.data;
-}
-
-static String8 getResolvedAttribute(const ResTable* resTable, const ResXMLTree& tree,
- uint32_t attrRes, String8* outError)
-{
- ssize_t idx = indexOfAttribute(tree, attrRes);
- if (idx < 0) {
- return String8();
- }
- Res_value value;
- if (tree.getAttributeValue(idx, &value) != NO_ERROR) {
- if (value.dataType == Res_value::TYPE_STRING) {
- size_t len;
- const uint16_t* str = tree.getAttributeStringValue(idx, &len);
- return str ? String8(str, len) : String8();
- }
- resTable->resolveReference(&value, 0);
- if (value.dataType != Res_value::TYPE_STRING) {
- if (outError != NULL) *outError = "attribute is not a string value";
- return String8();
- }
- }
- size_t len;
- const Res_value* value2 = &value;
- const char16_t* str = const_cast<ResTable*>(resTable)->valueToString(value2, 0, NULL, &len);
- return str ? String8(str, len) : String8();
-}
-
-// These are attribute resource constants for the platform, as found
-// in android.R.attr
-enum {
- LABEL_ATTR = 0x01010001,
- ICON_ATTR = 0x01010002,
- NAME_ATTR = 0x01010003,
- PERMISSION_ATTR = 0x01010006,
- RESOURCE_ATTR = 0x01010025,
- DEBUGGABLE_ATTR = 0x0101000f,
- VERSION_CODE_ATTR = 0x0101021b,
- VERSION_NAME_ATTR = 0x0101021c,
- SCREEN_ORIENTATION_ATTR = 0x0101001e,
- MIN_SDK_VERSION_ATTR = 0x0101020c,
- MAX_SDK_VERSION_ATTR = 0x01010271,
- REQ_TOUCH_SCREEN_ATTR = 0x01010227,
- REQ_KEYBOARD_TYPE_ATTR = 0x01010228,
- REQ_HARD_KEYBOARD_ATTR = 0x01010229,
- REQ_NAVIGATION_ATTR = 0x0101022a,
- REQ_FIVE_WAY_NAV_ATTR = 0x01010232,
- TARGET_SDK_VERSION_ATTR = 0x01010270,
- TEST_ONLY_ATTR = 0x01010272,
- ANY_DENSITY_ATTR = 0x0101026c,
- GL_ES_VERSION_ATTR = 0x01010281,
- SMALL_SCREEN_ATTR = 0x01010284,
- NORMAL_SCREEN_ATTR = 0x01010285,
- LARGE_SCREEN_ATTR = 0x01010286,
- XLARGE_SCREEN_ATTR = 0x010102bf,
- REQUIRED_ATTR = 0x0101028e,
- SCREEN_SIZE_ATTR = 0x010102ca,
- SCREEN_DENSITY_ATTR = 0x010102cb,
- REQUIRES_SMALLEST_WIDTH_DP_ATTR = 0x01010364,
- COMPATIBLE_WIDTH_LIMIT_DP_ATTR = 0x01010365,
- LARGEST_WIDTH_LIMIT_DP_ATTR = 0x01010366,
- PUBLIC_KEY_ATTR = 0x010103a6,
- CATEGORY_ATTR = 0x010103e8,
-};
-
-const char *getComponentName(String8 &pkgName, String8 &componentName) {
- ssize_t idx = componentName.find(".");
- String8 retStr(pkgName);
- if (idx == 0) {
- retStr += componentName;
- } else if (idx < 0) {
- retStr += ".";
- retStr += componentName;
- } else {
- return componentName.string();
- }
- return retStr.string();
-}
-
-static void printCompatibleScreens(ResXMLTree& tree) {
- size_t len;
- ResXMLTree::event_code_t code;
- int depth = 0;
- bool first = true;
- printf("compatible-screens:");
- while ((code=tree.next()) != ResXMLTree::END_DOCUMENT && code != ResXMLTree::BAD_DOCUMENT) {
- if (code == ResXMLTree::END_TAG) {
- depth--;
- if (depth < 0) {
- break;
- }
- continue;
- }
- if (code != ResXMLTree::START_TAG) {
- continue;
- }
- depth++;
- String8 tag(tree.getElementName(&len));
- if (tag == "screen") {
- int32_t screenSize = getIntegerAttribute(tree,
- SCREEN_SIZE_ATTR, NULL, -1);
- int32_t screenDensity = getIntegerAttribute(tree,
- SCREEN_DENSITY_ATTR, NULL, -1);
- if (screenSize > 0 && screenDensity > 0) {
- if (!first) {
- printf(",");
- }
- first = false;
- printf("'%d/%d'", screenSize, screenDensity);
- }
- }
- }
- printf("\n");
-}
-
-Vector<String8> getNfcAidCategories(AssetManager& assets, String8 xmlPath, bool offHost,
- String8 *outError = NULL)
-{
- Asset* aidAsset = assets.openNonAsset(xmlPath, Asset::ACCESS_BUFFER);
- if (aidAsset == NULL) {
- if (outError != NULL) *outError = "xml resource does not exist";
- return Vector<String8>();
- }
-
- const String8 serviceTagName(offHost ? "offhost-apdu-service" : "host-apdu-service");
-
- bool withinApduService = false;
- Vector<String8> categories;
-
- String8 error;
- ResXMLTree tree;
- tree.setTo(aidAsset->getBuffer(true), aidAsset->getLength());
-
- size_t len;
- int depth = 0;
- ResXMLTree::event_code_t code;
- while ((code=tree.next()) != ResXMLTree::END_DOCUMENT && code != ResXMLTree::BAD_DOCUMENT) {
- if (code == ResXMLTree::END_TAG) {
- depth--;
- String8 tag(tree.getElementName(&len));
-
- if (depth == 0 && tag == serviceTagName) {
- withinApduService = false;
- }
-
- } else if (code == ResXMLTree::START_TAG) {
- depth++;
- String8 tag(tree.getElementName(&len));
-
- if (depth == 1) {
- if (tag == serviceTagName) {
- withinApduService = true;
- }
- } else if (depth == 2 && withinApduService) {
- if (tag == "aid-group") {
- String8 category = getAttribute(tree, CATEGORY_ATTR, &error);
- if (error != "") {
- if (outError != NULL) *outError = error;
- return Vector<String8>();
- }
-
- categories.add(category);
- }
- }
- }
- }
- aidAsset->close();
- return categories;
-}
-
-/*
- * Handle the "dump" command, to extract select data from an archive.
- */
-extern char CONSOLE_DATA[2925]; // see EOF
-int doDump(Bundle* bundle)
-{
- status_t result = UNKNOWN_ERROR;
- Asset* asset = NULL;
-
- if (bundle->getFileSpecCount() < 1) {
- fprintf(stderr, "ERROR: no dump option specified\n");
- return 1;
- }
-
- if (bundle->getFileSpecCount() < 2) {
- fprintf(stderr, "ERROR: no dump file specified\n");
- return 1;
- }
-
- const char* option = bundle->getFileSpecEntry(0);
- const char* filename = bundle->getFileSpecEntry(1);
-
- AssetManager assets;
- void* assetsCookie;
- if (!assets.addAssetPath(String8(filename), &assetsCookie)) {
- fprintf(stderr, "ERROR: dump failed because assets could not be loaded\n");
- return 1;
- }
-
- // Make a dummy config for retrieving resources... we need to supply
- // non-default values for some configs so that we can retrieve resources
- // in the app that don't have a default. The most important of these is
- // the API version because key resources like icons will have an implicit
- // version if they are using newer config types like density.
- ResTable_config config;
- config.language[0] = 'e';
- config.language[1] = 'n';
- config.country[0] = 'U';
- config.country[1] = 'S';
- config.orientation = ResTable_config::ORIENTATION_PORT;
- config.density = ResTable_config::DENSITY_MEDIUM;
- config.sdkVersion = 10000; // Very high.
- config.screenWidthDp = 320;
- config.screenHeightDp = 480;
- config.smallestScreenWidthDp = 320;
- assets.setConfiguration(config);
-
- const ResTable& res = assets.getResources(false);
- if (&res == NULL) {
- fprintf(stderr, "ERROR: dump failed because no resource table was found\n");
- goto bail;
- }
-
- if (strcmp("resources", option) == 0) {
-#ifndef HAVE_ANDROID_OS
- res.print(bundle->getValues());
-#endif
-
- } else if (strcmp("strings", option) == 0) {
- const ResStringPool* pool = res.getTableStringBlock(0);
- printStringPool(pool);
-
- } else if (strcmp("xmltree", option) == 0) {
- if (bundle->getFileSpecCount() < 3) {
- fprintf(stderr, "ERROR: no dump xmltree resource file specified\n");
- goto bail;
- }
-
- for (int i=2; i<bundle->getFileSpecCount(); i++) {
- const char* resname = bundle->getFileSpecEntry(i);
- ResXMLTree tree;
- asset = assets.openNonAsset(resname, Asset::ACCESS_BUFFER);
- if (asset == NULL) {
- fprintf(stderr, "ERROR: dump failed because resource %s found\n", resname);
- goto bail;
- }
-
- if (tree.setTo(asset->getBuffer(true),
- asset->getLength()) != NO_ERROR) {
- fprintf(stderr, "ERROR: Resource %s is corrupt\n", resname);
- goto bail;
- }
- tree.restart();
- printXMLBlock(&tree);
- tree.uninit();
- delete asset;
- asset = NULL;
- }
-
- } else if (strcmp("xmlstrings", option) == 0) {
- if (bundle->getFileSpecCount() < 3) {
- fprintf(stderr, "ERROR: no dump xmltree resource file specified\n");
- goto bail;
- }
-
- for (int i=2; i<bundle->getFileSpecCount(); i++) {
- const char* resname = bundle->getFileSpecEntry(i);
- ResXMLTree tree;
- asset = assets.openNonAsset(resname, Asset::ACCESS_BUFFER);
- if (asset == NULL) {
- fprintf(stderr, "ERROR: dump failed because resource %s found\n", resname);
- goto bail;
- }
-
- if (tree.setTo(asset->getBuffer(true),
- asset->getLength()) != NO_ERROR) {
- fprintf(stderr, "ERROR: Resource %s is corrupt\n", resname);
- goto bail;
- }
- printStringPool(&tree.getStrings());
- delete asset;
- asset = NULL;
- }
-
- } else {
- ResXMLTree tree;
- asset = assets.openNonAsset("AndroidManifest.xml",
- Asset::ACCESS_BUFFER);
- if (asset == NULL) {
- fprintf(stderr, "ERROR: dump failed because no AndroidManifest.xml found\n");
- goto bail;
- }
-
- if (tree.setTo(asset->getBuffer(true),
- asset->getLength()) != NO_ERROR) {
- fprintf(stderr, "ERROR: AndroidManifest.xml is corrupt\n");
- goto bail;
- }
- tree.restart();
-
- if (strcmp("permissions", option) == 0) {
- size_t len;
- ResXMLTree::event_code_t code;
- int depth = 0;
- while ((code=tree.next()) != ResXMLTree::END_DOCUMENT && code != ResXMLTree::BAD_DOCUMENT) {
- if (code == ResXMLTree::END_TAG) {
- depth--;
- continue;
- }
- if (code != ResXMLTree::START_TAG) {
- continue;
- }
- depth++;
- String8 tag(tree.getElementName(&len));
- //printf("Depth %d tag %s\n", depth, tag.string());
- if (depth == 1) {
- if (tag != "manifest") {
- fprintf(stderr, "ERROR: manifest does not start with <manifest> tag\n");
- goto bail;
- }
- String8 pkg = getAttribute(tree, NULL, "package", NULL);
- printf("package: %s\n", pkg.string());
- } else if (depth == 2 && tag == "permission") {
- String8 error;
- String8 name = getAttribute(tree, NAME_ATTR, &error);
- if (error != "") {
- fprintf(stderr, "ERROR: %s\n", error.string());
- goto bail;
- }
- printf("permission: %s\n", name.string());
- } else if (depth == 2 && tag == "uses-permission") {
- String8 error;
- String8 name = getAttribute(tree, NAME_ATTR, &error);
- if (error != "") {
- fprintf(stderr, "ERROR: %s\n", error.string());
- goto bail;
- }
- printf("uses-permission: %s\n", name.string());
- int req = getIntegerAttribute(tree, REQUIRED_ATTR, NULL, 1);
- if (!req) {
- printf("optional-permission: %s\n", name.string());
- }
- }
- }
- } else if (strcmp("badging", option) == 0) {
- Vector<String8> locales;
- res.getLocales(&locales);
-
- Vector<ResTable_config> configs;
- res.getConfigurations(&configs);
- SortedVector<int> densities;
- const size_t NC = configs.size();
- for (size_t i=0; i<NC; i++) {
- int dens = configs[i].density;
- if (dens == 0) dens = 160;
- densities.add(dens);
- }
-
- size_t len;
- ResXMLTree::event_code_t code;
- int depth = 0;
- String8 error;
- bool withinActivity = false;
- bool isMainActivity = false;
- bool isLauncherActivity = false;
- bool isSearchable = false;
- bool withinApplication = false;
- bool withinSupportsInput = false;
- bool withinReceiver = false;
- bool withinService = false;
- bool withinIntentFilter = false;
- bool hasMainActivity = false;
- bool hasOtherActivities = false;
- bool hasOtherReceivers = false;
- bool hasOtherServices = false;
- bool hasWallpaperService = false;
- bool hasImeService = false;
- bool hasAccessibilityService = false;
- bool hasPrintService = false;
- bool hasWidgetReceivers = false;
- bool hasDeviceAdminReceiver = false;
- bool hasIntentFilter = false;
- bool hasPaymentService = false;
- bool actMainActivity = false;
- bool actWidgetReceivers = false;
- bool actDeviceAdminEnabled = false;
- bool actImeService = false;
- bool actWallpaperService = false;
- bool actAccessibilityService = false;
- bool actPrintService = false;
- bool actHostApduService = false;
- bool actOffHostApduService = false;
- bool hasMetaHostPaymentCategory = false;
- bool hasMetaOffHostPaymentCategory = false;
-
- // These permissions are required by services implementing services
- // the system binds to (IME, Accessibility, PrintServices, etc.)
- bool hasBindDeviceAdminPermission = false;
- bool hasBindInputMethodPermission = false;
- bool hasBindAccessibilityServicePermission = false;
- bool hasBindPrintServicePermission = false;
- bool hasBindNfcServicePermission = false;
-
- // These two implement the implicit permissions that are granted
- // to pre-1.6 applications.
- bool hasWriteExternalStoragePermission = false;
- bool hasReadPhoneStatePermission = false;
-
- // If an app requests write storage, they will also get read storage.
- bool hasReadExternalStoragePermission = false;
-
- // Implement transition to read and write call log.
- bool hasReadContactsPermission = false;
- bool hasWriteContactsPermission = false;
- bool hasReadCallLogPermission = false;
- bool hasWriteCallLogPermission = false;
-
- // This next group of variables is used to implement a group of
- // backward-compatibility heuristics necessitated by the addition of
- // some new uses-feature constants in 2.1 and 2.2. In most cases, the
- // heuristic is "if an app requests a permission but doesn't explicitly
- // request the corresponding <uses-feature>, presume it's there anyway".
- bool specCameraFeature = false; // camera-related
- bool specCameraAutofocusFeature = false;
- bool reqCameraAutofocusFeature = false;
- bool reqCameraFlashFeature = false;
- bool hasCameraPermission = false;
- bool specLocationFeature = false; // location-related
- bool specNetworkLocFeature = false;
- bool reqNetworkLocFeature = false;
- bool specGpsFeature = false;
- bool reqGpsFeature = false;
- bool hasMockLocPermission = false;
- bool hasCoarseLocPermission = false;
- bool hasGpsPermission = false;
- bool hasGeneralLocPermission = false;
- bool specBluetoothFeature = false; // Bluetooth API-related
- bool hasBluetoothPermission = false;
- bool specMicrophoneFeature = false; // microphone-related
- bool hasRecordAudioPermission = false;
- bool specWiFiFeature = false;
- bool hasWiFiPermission = false;
- bool specTelephonyFeature = false; // telephony-related
- bool reqTelephonySubFeature = false;
- bool hasTelephonyPermission = false;
- bool specTouchscreenFeature = false; // touchscreen-related
- bool specMultitouchFeature = false;
- bool reqDistinctMultitouchFeature = false;
- bool specScreenPortraitFeature = false;
- bool specScreenLandscapeFeature = false;
- bool reqScreenPortraitFeature = false;
- bool reqScreenLandscapeFeature = false;
- // 2.2 also added some other features that apps can request, but that
- // have no corresponding permission, so we cannot implement any
- // back-compatibility heuristic for them. The below are thus unnecessary
- // (but are retained here for documentary purposes.)
- //bool specCompassFeature = false;
- //bool specAccelerometerFeature = false;
- //bool specProximityFeature = false;
- //bool specAmbientLightFeature = false;
- //bool specLiveWallpaperFeature = false;
-
- int targetSdk = 0;
- int smallScreen = 1;
- int normalScreen = 1;
- int largeScreen = 1;
- int xlargeScreen = 1;
- int anyDensity = 1;
- int requiresSmallestWidthDp = 0;
- int compatibleWidthLimitDp = 0;
- int largestWidthLimitDp = 0;
- String8 pkg;
- String8 activityName;
- String8 activityLabel;
- String8 activityIcon;
- String8 receiverName;
- String8 serviceName;
- Vector<String8> supportedInput;
- while ((code=tree.next()) != ResXMLTree::END_DOCUMENT && code != ResXMLTree::BAD_DOCUMENT) {
- if (code == ResXMLTree::END_TAG) {
- depth--;
- if (depth < 2) {
- if (withinSupportsInput && !supportedInput.isEmpty()) {
- printf("supports-input: '");
- const size_t N = supportedInput.size();
- for (size_t i=0; i<N; i++) {
- printf("%s", supportedInput[i].string());
- if (i != N - 1) {
- printf("' '");
- } else {
- printf("'\n");
- }
- }
- supportedInput.clear();
- }
- withinApplication = false;
- withinSupportsInput = false;
- } else if (depth < 3) {
- if (withinActivity && isMainActivity && isLauncherActivity) {
- const char *aName = getComponentName(pkg, activityName);
- printf("launchable-activity:");
- if (aName != NULL) {
- printf(" name='%s' ", aName);
- }
- printf(" label='%s' icon='%s'\n",
- activityLabel.string(),
- activityIcon.string());
- }
- if (!hasIntentFilter) {
- hasOtherActivities |= withinActivity;
- hasOtherReceivers |= withinReceiver;
- hasOtherServices |= withinService;
- } else {
- if (withinService) {
- hasPaymentService |= (actHostApduService && hasMetaHostPaymentCategory &&
- hasBindNfcServicePermission);
- hasPaymentService |= (actOffHostApduService && hasMetaOffHostPaymentCategory &&
- hasBindNfcServicePermission);
- }
- }
- withinActivity = false;
- withinService = false;
- withinReceiver = false;
- hasIntentFilter = false;
- isMainActivity = isLauncherActivity = false;
- } else if (depth < 4) {
- if (withinIntentFilter) {
- if (withinActivity) {
- hasMainActivity |= actMainActivity;
- hasOtherActivities |= !actMainActivity;
- } else if (withinReceiver) {
- hasWidgetReceivers |= actWidgetReceivers;
- hasDeviceAdminReceiver |= (actDeviceAdminEnabled &&
- hasBindDeviceAdminPermission);
- hasOtherReceivers |= (!actWidgetReceivers && !actDeviceAdminEnabled);
- } else if (withinService) {
- hasImeService |= actImeService;
- hasWallpaperService |= actWallpaperService;
- hasAccessibilityService |= (actAccessibilityService &&
- hasBindAccessibilityServicePermission);
- hasPrintService |= (actPrintService && hasBindPrintServicePermission);
- hasOtherServices |= (!actImeService && !actWallpaperService &&
- !actAccessibilityService && !actPrintService &&
- !actHostApduService && !actOffHostApduService);
- }
- }
- withinIntentFilter = false;
- }
- continue;
- }
- if (code != ResXMLTree::START_TAG) {
- continue;
- }
- depth++;
- String8 tag(tree.getElementName(&len));
- //printf("Depth %d, %s\n", depth, tag.string());
- if (depth == 1) {
- if (tag != "manifest") {
- fprintf(stderr, "ERROR: manifest does not start with <manifest> tag\n");
- goto bail;
- }
- pkg = getAttribute(tree, NULL, "package", NULL);
- printf("package: name='%s' ", pkg.string());
- int32_t versionCode = getIntegerAttribute(tree, VERSION_CODE_ATTR, &error);
- if (error != "") {
- fprintf(stderr, "ERROR getting 'android:versionCode' attribute: %s\n", error.string());
- goto bail;
- }
- if (versionCode > 0) {
- printf("versionCode='%d' ", versionCode);
- } else {
- printf("versionCode='' ");
- }
- String8 versionName = getResolvedAttribute(&res, tree, VERSION_NAME_ATTR, &error);
- if (error != "") {
- fprintf(stderr, "ERROR getting 'android:versionName' attribute: %s\n", error.string());
- goto bail;
- }
- printf("versionName='%s'\n", versionName.string());
- } else if (depth == 2) {
- withinApplication = false;
- if (tag == "application") {
- withinApplication = true;
-
- String8 label;
- const size_t NL = locales.size();
- for (size_t i=0; i<NL; i++) {
- const char* localeStr = locales[i].string();
- assets.setLocale(localeStr != NULL ? localeStr : "");
- String8 llabel = getResolvedAttribute(&res, tree, LABEL_ATTR, &error);
- if (llabel != "") {
- if (localeStr == NULL || strlen(localeStr) == 0) {
- label = llabel;
- printf("application-label:'%s'\n", llabel.string());
- } else {
- if (label == "") {
- label = llabel;
- }
- printf("application-label-%s:'%s'\n", localeStr,
- llabel.string());
- }
- }
- }
-
- ResTable_config tmpConfig = config;
- const size_t ND = densities.size();
- for (size_t i=0; i<ND; i++) {
- tmpConfig.density = densities[i];
- assets.setConfiguration(tmpConfig);
- String8 icon = getResolvedAttribute(&res, tree, ICON_ATTR, &error);
- if (icon != "") {
- printf("application-icon-%d:'%s'\n", densities[i], icon.string());
- }
- }
- assets.setConfiguration(config);
-
- String8 icon = getResolvedAttribute(&res, tree, ICON_ATTR, &error);
- if (error != "") {
- fprintf(stderr, "ERROR getting 'android:icon' attribute: %s\n", error.string());
- goto bail;
- }
- int32_t testOnly = getIntegerAttribute(tree, TEST_ONLY_ATTR, &error, 0);
- if (error != "") {
- fprintf(stderr, "ERROR getting 'android:testOnly' attribute: %s\n", error.string());
- goto bail;
- }
- printf("application: label='%s' ", label.string());
- printf("icon='%s'\n", icon.string());
- if (testOnly != 0) {
- printf("testOnly='%d'\n", testOnly);
- }
-
- int32_t debuggable = getResolvedIntegerAttribute(&res, tree, DEBUGGABLE_ATTR, &error, 0);
- if (error != "") {
- fprintf(stderr, "ERROR getting 'android:debuggable' attribute: %s\n", error.string());
- goto bail;
- }
- if (debuggable != 0) {
- printf("application-debuggable\n");
- }
- } else if (tag == "uses-sdk") {
- int32_t code = getIntegerAttribute(tree, MIN_SDK_VERSION_ATTR, &error);
- if (error != "") {
- error = "";
- String8 name = getResolvedAttribute(&res, tree, MIN_SDK_VERSION_ATTR, &error);
- if (error != "") {
- fprintf(stderr, "ERROR getting 'android:minSdkVersion' attribute: %s\n",
- error.string());
- goto bail;
- }
- if (name == "Donut") targetSdk = 4;
- printf("sdkVersion:'%s'\n", name.string());
- } else if (code != -1) {
- targetSdk = code;
- printf("sdkVersion:'%d'\n", code);
- }
- code = getIntegerAttribute(tree, MAX_SDK_VERSION_ATTR, NULL, -1);
- if (code != -1) {
- printf("maxSdkVersion:'%d'\n", code);
- }
- code = getIntegerAttribute(tree, TARGET_SDK_VERSION_ATTR, &error);
- if (error != "") {
- error = "";
- String8 name = getResolvedAttribute(&res, tree, TARGET_SDK_VERSION_ATTR, &error);
- if (error != "") {
- fprintf(stderr, "ERROR getting 'android:targetSdkVersion' attribute: %s\n",
- error.string());
- goto bail;
- }
- if (name == "Donut" && targetSdk < 4) targetSdk = 4;
- printf("targetSdkVersion:'%s'\n", name.string());
- } else if (code != -1) {
- if (targetSdk < code) {
- targetSdk = code;
- }
- printf("targetSdkVersion:'%d'\n", code);
- }
- } else if (tag == "uses-configuration") {
- int32_t reqTouchScreen = getIntegerAttribute(tree,
- REQ_TOUCH_SCREEN_ATTR, NULL, 0);
- int32_t reqKeyboardType = getIntegerAttribute(tree,
- REQ_KEYBOARD_TYPE_ATTR, NULL, 0);
- int32_t reqHardKeyboard = getIntegerAttribute(tree,
- REQ_HARD_KEYBOARD_ATTR, NULL, 0);
- int32_t reqNavigation = getIntegerAttribute(tree,
- REQ_NAVIGATION_ATTR, NULL, 0);
- int32_t reqFiveWayNav = getIntegerAttribute(tree,
- REQ_FIVE_WAY_NAV_ATTR, NULL, 0);
- printf("uses-configuration:");
- if (reqTouchScreen != 0) {
- printf(" reqTouchScreen='%d'", reqTouchScreen);
- }
- if (reqKeyboardType != 0) {
- printf(" reqKeyboardType='%d'", reqKeyboardType);
- }
- if (reqHardKeyboard != 0) {
- printf(" reqHardKeyboard='%d'", reqHardKeyboard);
- }
- if (reqNavigation != 0) {
- printf(" reqNavigation='%d'", reqNavigation);
- }
- if (reqFiveWayNav != 0) {
- printf(" reqFiveWayNav='%d'", reqFiveWayNav);
- }
- printf("\n");
- } else if (tag == "supports-input") {
- withinSupportsInput = true;
- } else if (tag == "supports-screens") {
- smallScreen = getIntegerAttribute(tree,
- SMALL_SCREEN_ATTR, NULL, 1);
- normalScreen = getIntegerAttribute(tree,
- NORMAL_SCREEN_ATTR, NULL, 1);
- largeScreen = getIntegerAttribute(tree,
- LARGE_SCREEN_ATTR, NULL, 1);
- xlargeScreen = getIntegerAttribute(tree,
- XLARGE_SCREEN_ATTR, NULL, 1);
- anyDensity = getIntegerAttribute(tree,
- ANY_DENSITY_ATTR, NULL, 1);
- requiresSmallestWidthDp = getIntegerAttribute(tree,
- REQUIRES_SMALLEST_WIDTH_DP_ATTR, NULL, 0);
- compatibleWidthLimitDp = getIntegerAttribute(tree,
- COMPATIBLE_WIDTH_LIMIT_DP_ATTR, NULL, 0);
- largestWidthLimitDp = getIntegerAttribute(tree,
- LARGEST_WIDTH_LIMIT_DP_ATTR, NULL, 0);
- } else if (tag == "uses-feature") {
- String8 name = getAttribute(tree, NAME_ATTR, &error);
-
- if (name != "" && error == "") {
- int req = getIntegerAttribute(tree,
- REQUIRED_ATTR, NULL, 1);
-
- if (name == "android.hardware.camera") {
- specCameraFeature = true;
- } else if (name == "android.hardware.camera.autofocus") {
- // these have no corresponding permission to check for,
- // but should imply the foundational camera permission
- reqCameraAutofocusFeature = reqCameraAutofocusFeature || req;
- specCameraAutofocusFeature = true;
- } else if (req && (name == "android.hardware.camera.flash")) {
- // these have no corresponding permission to check for,
- // but should imply the foundational camera permission
- reqCameraFlashFeature = true;
- } else if (name == "android.hardware.location") {
- specLocationFeature = true;
- } else if (name == "android.hardware.location.network") {
- specNetworkLocFeature = true;
- reqNetworkLocFeature = reqNetworkLocFeature || req;
- } else if (name == "android.hardware.location.gps") {
- specGpsFeature = true;
- reqGpsFeature = reqGpsFeature || req;
- } else if (name == "android.hardware.bluetooth") {
- specBluetoothFeature = true;
- } else if (name == "android.hardware.touchscreen") {
- specTouchscreenFeature = true;
- } else if (name == "android.hardware.touchscreen.multitouch") {
- specMultitouchFeature = true;
- } else if (name == "android.hardware.touchscreen.multitouch.distinct") {
- reqDistinctMultitouchFeature = reqDistinctMultitouchFeature || req;
- } else if (name == "android.hardware.microphone") {
- specMicrophoneFeature = true;
- } else if (name == "android.hardware.wifi") {
- specWiFiFeature = true;
- } else if (name == "android.hardware.telephony") {
- specTelephonyFeature = true;
- } else if (req && (name == "android.hardware.telephony.gsm" ||
- name == "android.hardware.telephony.cdma")) {
- // these have no corresponding permission to check for,
- // but should imply the foundational telephony permission
- reqTelephonySubFeature = true;
- } else if (name == "android.hardware.screen.portrait") {
- specScreenPortraitFeature = true;
- } else if (name == "android.hardware.screen.landscape") {
- specScreenLandscapeFeature = true;
- }
- printf("uses-feature%s:'%s'\n",
- req ? "" : "-not-required", name.string());
- } else {
- int vers = getIntegerAttribute(tree,
- GL_ES_VERSION_ATTR, &error);
- if (error == "") {
- printf("uses-gl-es:'0x%x'\n", vers);
- }
- }
- } else if (tag == "uses-permission") {
- String8 name = getAttribute(tree, NAME_ATTR, &error);
- if (name != "" && error == "") {
- if (name == "android.permission.CAMERA") {
- hasCameraPermission = true;
- } else if (name == "android.permission.ACCESS_FINE_LOCATION") {
- hasGpsPermission = true;
- } else if (name == "android.permission.ACCESS_MOCK_LOCATION") {
- hasMockLocPermission = true;
- } else if (name == "android.permission.ACCESS_COARSE_LOCATION") {
- hasCoarseLocPermission = true;
- } else if (name == "android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" ||
- name == "android.permission.INSTALL_LOCATION_PROVIDER") {
- hasGeneralLocPermission = true;
- } else if (name == "android.permission.BLUETOOTH" ||
- name == "android.permission.BLUETOOTH_ADMIN") {
- hasBluetoothPermission = true;
- } else if (name == "android.permission.RECORD_AUDIO") {
- hasRecordAudioPermission = true;
- } else if (name == "android.permission.ACCESS_WIFI_STATE" ||
- name == "android.permission.CHANGE_WIFI_STATE" ||
- name == "android.permission.CHANGE_WIFI_MULTICAST_STATE") {
- hasWiFiPermission = true;
- } else if (name == "android.permission.CALL_PHONE" ||
- name == "android.permission.CALL_PRIVILEGED" ||
- name == "android.permission.MODIFY_PHONE_STATE" ||
- name == "android.permission.PROCESS_OUTGOING_CALLS" ||
- name == "android.permission.READ_SMS" ||
- name == "android.permission.RECEIVE_SMS" ||
- name == "android.permission.RECEIVE_MMS" ||
- name == "android.permission.RECEIVE_WAP_PUSH" ||
- name == "android.permission.SEND_SMS" ||
- name == "android.permission.WRITE_APN_SETTINGS" ||
- name == "android.permission.WRITE_SMS") {
- hasTelephonyPermission = true;
- } else if (name == "android.permission.WRITE_EXTERNAL_STORAGE") {
- hasWriteExternalStoragePermission = true;
- } else if (name == "android.permission.READ_EXTERNAL_STORAGE") {
- hasReadExternalStoragePermission = true;
- } else if (name == "android.permission.READ_PHONE_STATE") {
- hasReadPhoneStatePermission = true;
- } else if (name == "android.permission.READ_CONTACTS") {
- hasReadContactsPermission = true;
- } else if (name == "android.permission.WRITE_CONTACTS") {
- hasWriteContactsPermission = true;
- } else if (name == "android.permission.READ_CALL_LOG") {
- hasReadCallLogPermission = true;
- } else if (name == "android.permission.WRITE_CALL_LOG") {
- hasWriteCallLogPermission = true;
- }
- printf("uses-permission:'%s'\n", name.string());
- int req = getIntegerAttribute(tree, REQUIRED_ATTR, NULL, 1);
- if (!req) {
- printf("optional-permission:'%s'\n", name.string());
- }
- } else {
- fprintf(stderr, "ERROR getting 'android:name' attribute: %s\n",
- error.string());
- goto bail;
- }
- } else if (tag == "uses-package") {
- String8 name = getAttribute(tree, NAME_ATTR, &error);
- if (name != "" && error == "") {
- printf("uses-package:'%s'\n", name.string());
- } else {
- fprintf(stderr, "ERROR getting 'android:name' attribute: %s\n",
- error.string());
- goto bail;
- }
- } else if (tag == "original-package") {
- String8 name = getAttribute(tree, NAME_ATTR, &error);
- if (name != "" && error == "") {
- printf("original-package:'%s'\n", name.string());
- } else {
- fprintf(stderr, "ERROR getting 'android:name' attribute: %s\n",
- error.string());
- goto bail;
- }
- } else if (tag == "supports-gl-texture") {
- String8 name = getAttribute(tree, NAME_ATTR, &error);
- if (name != "" && error == "") {
- printf("supports-gl-texture:'%s'\n", name.string());
- } else {
- fprintf(stderr, "ERROR getting 'android:name' attribute: %s\n",
- error.string());
- goto bail;
- }
- } else if (tag == "compatible-screens") {
- printCompatibleScreens(tree);
- depth--;
- } else if (tag == "package-verifier") {
- String8 name = getAttribute(tree, NAME_ATTR, &error);
- if (name != "" && error == "") {
- String8 publicKey = getAttribute(tree, PUBLIC_KEY_ATTR, &error);
- if (publicKey != "" && error == "") {
- printf("package-verifier: name='%s' publicKey='%s'\n",
- name.string(), publicKey.string());
- }
- }
- }
- } else if (depth == 3) {
- withinActivity = false;
- withinReceiver = false;
- withinService = false;
- hasIntentFilter = false;
- hasMetaHostPaymentCategory = false;
- hasMetaOffHostPaymentCategory = false;
- hasBindDeviceAdminPermission = false;
- hasBindInputMethodPermission = false;
- hasBindAccessibilityServicePermission = false;
- hasBindPrintServicePermission = false;
- hasBindNfcServicePermission = false;
- if (withinApplication) {
- if(tag == "activity") {
- withinActivity = true;
- activityName = getAttribute(tree, NAME_ATTR, &error);
- if (error != "") {
- fprintf(stderr, "ERROR getting 'android:name' attribute: %s\n",
- error.string());
- goto bail;
- }
-
- activityLabel = getResolvedAttribute(&res, tree, LABEL_ATTR, &error);
- if (error != "") {
- fprintf(stderr, "ERROR getting 'android:label' attribute: %s\n",
- error.string());
- goto bail;
- }
-
- activityIcon = getResolvedAttribute(&res, tree, ICON_ATTR, &error);
- if (error != "") {
- fprintf(stderr, "ERROR getting 'android:icon' attribute: %s\n",
- error.string());
- goto bail;
- }
-
- int32_t orien = getResolvedIntegerAttribute(&res, tree,
- SCREEN_ORIENTATION_ATTR, &error);
- if (error == "") {
- if (orien == 0 || orien == 6 || orien == 8) {
- // Requests landscape, sensorLandscape, or reverseLandscape.
- reqScreenLandscapeFeature = true;
- } else if (orien == 1 || orien == 7 || orien == 9) {
- // Requests portrait, sensorPortrait, or reversePortrait.
- reqScreenPortraitFeature = true;
- }
- }
- } else if (tag == "uses-library") {
- String8 libraryName = getAttribute(tree, NAME_ATTR, &error);
- if (error != "") {
- fprintf(stderr,
- "ERROR getting 'android:name' attribute for uses-library"
- " %s\n", error.string());
- goto bail;
- }
- int req = getIntegerAttribute(tree,
- REQUIRED_ATTR, NULL, 1);
- printf("uses-library%s:'%s'\n",
- req ? "" : "-not-required", libraryName.string());
- } else if (tag == "receiver") {
- withinReceiver = true;
- receiverName = getAttribute(tree, NAME_ATTR, &error);
-
- if (error != "") {
- fprintf(stderr,
- "ERROR getting 'android:name' attribute for receiver:"
- " %s\n", error.string());
- goto bail;
- }
-
- String8 permission = getAttribute(tree, PERMISSION_ATTR, &error);
- if (error == "") {
- if (permission == "android.permission.BIND_DEVICE_ADMIN") {
- hasBindDeviceAdminPermission = true;
- }
- } else {
- fprintf(stderr, "ERROR getting 'android:permission' attribute for"
- " receiver '%s': %s\n", receiverName.string(), error.string());
- }
- } else if (tag == "service") {
- withinService = true;
- serviceName = getAttribute(tree, NAME_ATTR, &error);
-
- if (error != "") {
- fprintf(stderr, "ERROR getting 'android:name' attribute for"
- " service: %s\n", error.string());
- goto bail;
- }
-
- String8 permission = getAttribute(tree, PERMISSION_ATTR, &error);
- if (error == "") {
- if (permission == "android.permission.BIND_INPUT_METHOD") {
- hasBindInputMethodPermission = true;
- } else if (permission == "android.permission.BIND_ACCESSIBILITY_SERVICE") {
- hasBindAccessibilityServicePermission = true;
- } else if (permission == "android.permission.BIND_PRINT_SERVICE") {
- hasBindPrintServicePermission = true;
- } else if (permission == "android.permission.BIND_NFC_SERVICE") {
- hasBindNfcServicePermission = true;
- }
- } else {
- fprintf(stderr, "ERROR getting 'android:permission' attribute for"
- " service '%s': %s\n", serviceName.string(), error.string());
- }
- }
- } else if (withinSupportsInput && tag == "input-type") {
- String8 name = getAttribute(tree, NAME_ATTR, &error);
- if (name != "" && error == "") {
- supportedInput.add(name);
- } else {
- fprintf(stderr, "ERROR getting 'android:name' attribute: %s\n",
- error.string());
- goto bail;
- }
- }
- } else if (depth == 4) {
- if (tag == "intent-filter") {
- hasIntentFilter = true;
- withinIntentFilter = true;
- actMainActivity = false;
- actWidgetReceivers = false;
- actImeService = false;
- actWallpaperService = false;
- actAccessibilityService = false;
- actPrintService = false;
- actDeviceAdminEnabled = false;
- actHostApduService = false;
- actOffHostApduService = false;
- } else if (withinService && tag == "meta-data") {
- String8 name = getAttribute(tree, NAME_ATTR, &error);
- if (error != "") {
- fprintf(stderr, "ERROR getting 'android:name' attribute for"
- " meta-data tag in service '%s': %s\n", serviceName.string(), error.string());
- goto bail;
- }
-
- if (name == "android.nfc.cardemulation.host_apdu_service" ||
- name == "android.nfc.cardemulation.off_host_apdu_service") {
- bool offHost = true;
- if (name == "android.nfc.cardemulation.host_apdu_service") {
- offHost = false;
- }
-
- String8 xmlPath = getResolvedAttribute(&res, tree, RESOURCE_ATTR, &error);
- if (error != "") {
- fprintf(stderr, "ERROR getting 'android:resource' attribute for"
- " meta-data tag in service '%s': %s\n", serviceName.string(), error.string());
- goto bail;
- }
-
- Vector<String8> categories = getNfcAidCategories(assets, xmlPath,
- offHost, &error);
- if (error != "") {
- fprintf(stderr, "ERROR getting AID category for service '%s'\n",
- serviceName.string());
- goto bail;
- }
-
- const size_t catLen = categories.size();
- for (size_t i = 0; i < catLen; i++) {
- bool paymentCategory = (categories[i] == "payment");
- if (offHost) {
- hasMetaOffHostPaymentCategory |= paymentCategory;
- } else {
- hasMetaHostPaymentCategory |= paymentCategory;
- }
- }
- }
- }
- } else if ((depth == 5) && withinIntentFilter){
- String8 action;
- if (tag == "action") {
- action = getAttribute(tree, NAME_ATTR, &error);
- if (error != "") {
- fprintf(stderr, "ERROR getting 'android:name' attribute: %s\n", error.string());
- goto bail;
- }
- if (withinActivity) {
- if (action == "android.intent.action.MAIN") {
- isMainActivity = true;
- actMainActivity = true;
- }
- } else if (withinReceiver) {
- if (action == "android.appwidget.action.APPWIDGET_UPDATE") {
- actWidgetReceivers = true;
- } else if (action == "android.app.action.DEVICE_ADMIN_ENABLED") {
- actDeviceAdminEnabled = true;
- }
- } else if (withinService) {
- if (action == "android.view.InputMethod") {
- actImeService = true;
- } else if (action == "android.service.wallpaper.WallpaperService") {
- actWallpaperService = true;
- } else if (action == "android.accessibilityservice.AccessibilityService") {
- actAccessibilityService = true;
- } else if (action == "android.printservice.PrintService") {
- actPrintService = true;
- } else if (action == "android.nfc.cardemulation.action.HOST_APDU_SERVICE") {
- actHostApduService = true;
- } else if (action == "android.nfc.cardemulation.action.OFF_HOST_APDU_SERVICE") {
- actOffHostApduService = true;
- }
- }
- if (action == "android.intent.action.SEARCH") {
- isSearchable = true;
- }
- }
-
- if (tag == "category") {
- String8 category = getAttribute(tree, NAME_ATTR, &error);
- if (error != "") {
- fprintf(stderr, "ERROR getting 'name' attribute: %s\n", error.string());
- goto bail;
- }
- if (withinActivity) {
- if (category == "android.intent.category.LAUNCHER") {
- isLauncherActivity = true;
- }
- }
- }
- }
- }
-
- // Pre-1.6 implicitly granted permission compatibility logic
- if (targetSdk < 4) {
- if (!hasWriteExternalStoragePermission) {
- printf("uses-permission:'android.permission.WRITE_EXTERNAL_STORAGE'\n");
- printf("uses-implied-permission:'android.permission.WRITE_EXTERNAL_STORAGE'," \
- "'targetSdkVersion < 4'\n");
- hasWriteExternalStoragePermission = true;
- }
- if (!hasReadPhoneStatePermission) {
- printf("uses-permission:'android.permission.READ_PHONE_STATE'\n");
- printf("uses-implied-permission:'android.permission.READ_PHONE_STATE'," \
- "'targetSdkVersion < 4'\n");
- }
- }
-
- // If the application has requested WRITE_EXTERNAL_STORAGE, we will
- // force them to always take READ_EXTERNAL_STORAGE as well. We always
- // do this (regardless of target API version) because we can't have
- // an app with write permission but not read permission.
- if (!hasReadExternalStoragePermission && hasWriteExternalStoragePermission) {
- printf("uses-permission:'android.permission.READ_EXTERNAL_STORAGE'\n");
- printf("uses-implied-permission:'android.permission.READ_EXTERNAL_STORAGE'," \
- "'requested WRITE_EXTERNAL_STORAGE'\n");
- }
-
- // Pre-JellyBean call log permission compatibility.
- if (targetSdk < 16) {
- if (!hasReadCallLogPermission && hasReadContactsPermission) {
- printf("uses-permission:'android.permission.READ_CALL_LOG'\n");
- printf("uses-implied-permission:'android.permission.READ_CALL_LOG'," \
- "'targetSdkVersion < 16 and requested READ_CONTACTS'\n");
- }
- if (!hasWriteCallLogPermission && hasWriteContactsPermission) {
- printf("uses-permission:'android.permission.WRITE_CALL_LOG'\n");
- printf("uses-implied-permission:'android.permission.WRITE_CALL_LOG'," \
- "'targetSdkVersion < 16 and requested WRITE_CONTACTS'\n");
- }
- }
-
- /* The following blocks handle printing "inferred" uses-features, based
- * on whether related features or permissions are used by the app.
- * Note that the various spec*Feature variables denote whether the
- * relevant tag was *present* in the AndroidManfest, not that it was
- * present and set to true.
- */
- // Camera-related back-compatibility logic
- if (!specCameraFeature) {
- if (reqCameraFlashFeature) {
- // if app requested a sub-feature (autofocus or flash) and didn't
- // request the base camera feature, we infer that it meant to
- printf("uses-feature:'android.hardware.camera'\n");
- printf("uses-implied-feature:'android.hardware.camera'," \
- "'requested android.hardware.camera.flash feature'\n");
- } else if (reqCameraAutofocusFeature) {
- // if app requested a sub-feature (autofocus or flash) and didn't
- // request the base camera feature, we infer that it meant to
- printf("uses-feature:'android.hardware.camera'\n");
- printf("uses-implied-feature:'android.hardware.camera'," \
- "'requested android.hardware.camera.autofocus feature'\n");
- } else if (hasCameraPermission) {
- // if app wants to use camera but didn't request the feature, we infer
- // that it meant to, and further that it wants autofocus
- // (which was the 1.0 - 1.5 behavior)
- printf("uses-feature:'android.hardware.camera'\n");
- if (!specCameraAutofocusFeature) {
- printf("uses-feature:'android.hardware.camera.autofocus'\n");
- printf("uses-implied-feature:'android.hardware.camera.autofocus'," \
- "'requested android.permission.CAMERA permission'\n");
- }
- }
- }
-
- // Location-related back-compatibility logic
- if (!specLocationFeature &&
- (hasMockLocPermission || hasCoarseLocPermission || hasGpsPermission ||
- hasGeneralLocPermission || reqNetworkLocFeature || reqGpsFeature)) {
- // if app either takes a location-related permission or requests one of the
- // sub-features, we infer that it also meant to request the base location feature
- printf("uses-feature:'android.hardware.location'\n");
- printf("uses-implied-feature:'android.hardware.location'," \
- "'requested a location access permission'\n");
- }
- if (!specGpsFeature && hasGpsPermission) {
- // if app takes GPS (FINE location) perm but does not request the GPS
- // feature, we infer that it meant to
- printf("uses-feature:'android.hardware.location.gps'\n");
- printf("uses-implied-feature:'android.hardware.location.gps'," \
- "'requested android.permission.ACCESS_FINE_LOCATION permission'\n");
- }
- if (!specNetworkLocFeature && hasCoarseLocPermission) {
- // if app takes Network location (COARSE location) perm but does not request the
- // network location feature, we infer that it meant to
- printf("uses-feature:'android.hardware.location.network'\n");
- printf("uses-implied-feature:'android.hardware.location.network'," \
- "'requested android.permission.ACCESS_COARSE_LOCATION permission'\n");
- }
-
- // Bluetooth-related compatibility logic
- if (!specBluetoothFeature && hasBluetoothPermission && (targetSdk > 4)) {
- // if app takes a Bluetooth permission but does not request the Bluetooth
- // feature, we infer that it meant to
- printf("uses-feature:'android.hardware.bluetooth'\n");
- printf("uses-implied-feature:'android.hardware.bluetooth'," \
- "'requested android.permission.BLUETOOTH or android.permission.BLUETOOTH_ADMIN " \
- "permission and targetSdkVersion > 4'\n");
- }
-
- // Microphone-related compatibility logic
- if (!specMicrophoneFeature && hasRecordAudioPermission) {
- // if app takes the record-audio permission but does not request the microphone
- // feature, we infer that it meant to
- printf("uses-feature:'android.hardware.microphone'\n");
- printf("uses-implied-feature:'android.hardware.microphone'," \
- "'requested android.permission.RECORD_AUDIO permission'\n");
- }
-
- // WiFi-related compatibility logic
- if (!specWiFiFeature && hasWiFiPermission) {
- // if app takes one of the WiFi permissions but does not request the WiFi
- // feature, we infer that it meant to
- printf("uses-feature:'android.hardware.wifi'\n");
- printf("uses-implied-feature:'android.hardware.wifi'," \
- "'requested android.permission.ACCESS_WIFI_STATE, " \
- "android.permission.CHANGE_WIFI_STATE, or " \
- "android.permission.CHANGE_WIFI_MULTICAST_STATE permission'\n");
- }
-
- // Telephony-related compatibility logic
- if (!specTelephonyFeature && (hasTelephonyPermission || reqTelephonySubFeature)) {
- // if app takes one of the telephony permissions or requests a sub-feature but
- // does not request the base telephony feature, we infer that it meant to
- printf("uses-feature:'android.hardware.telephony'\n");
- printf("uses-implied-feature:'android.hardware.telephony'," \
- "'requested a telephony-related permission or feature'\n");
- }
-
- // Touchscreen-related back-compatibility logic
- if (!specTouchscreenFeature) { // not a typo!
- // all apps are presumed to require a touchscreen, unless they explicitly say
- // <uses-feature android:name="android.hardware.touchscreen" android:required="false"/>
- // Note that specTouchscreenFeature is true if the tag is present, regardless
- // of whether its value is true or false, so this is safe
- printf("uses-feature:'android.hardware.touchscreen'\n");
- printf("uses-implied-feature:'android.hardware.touchscreen'," \
- "'assumed you require a touch screen unless explicitly made optional'\n");
- }
- if (!specMultitouchFeature && reqDistinctMultitouchFeature) {
- // if app takes one of the telephony permissions or requests a sub-feature but
- // does not request the base telephony feature, we infer that it meant to
- printf("uses-feature:'android.hardware.touchscreen.multitouch'\n");
- printf("uses-implied-feature:'android.hardware.touchscreen.multitouch'," \
- "'requested android.hardware.touchscreen.multitouch.distinct feature'\n");
- }
-
- // Landscape/portrait-related compatibility logic
- if (!specScreenLandscapeFeature && !specScreenPortraitFeature) {
- // If the app has specified any activities in its manifest
- // that request a specific orientation, then assume that
- // orientation is required.
- if (reqScreenLandscapeFeature) {
- printf("uses-feature:'android.hardware.screen.landscape'\n");
- printf("uses-implied-feature:'android.hardware.screen.landscape'," \
- "'one or more activities have specified a landscape orientation'\n");
- }
- if (reqScreenPortraitFeature) {
- printf("uses-feature:'android.hardware.screen.portrait'\n");
- printf("uses-implied-feature:'android.hardware.screen.portrait'," \
- "'one or more activities have specified a portrait orientation'\n");
- }
- }
-
- if (hasMainActivity) {
- printf("main\n");
- }
- if (hasWidgetReceivers) {
- printf("app-widget\n");
- }
- if (hasDeviceAdminReceiver) {
- printf("device-admin\n");
- }
- if (hasImeService) {
- printf("ime\n");
- }
- if (hasWallpaperService) {
- printf("wallpaper\n");
- }
- if (hasAccessibilityService) {
- printf("accessibility\n");
- }
- if (hasPrintService) {
- printf("print\n");
- }
- if (hasPaymentService) {
- printf("payment\n");
- }
- if (hasOtherActivities) {
- printf("other-activities\n");
- }
- if (isSearchable) {
- printf("search\n");
- }
- if (hasOtherReceivers) {
- printf("other-receivers\n");
- }
- if (hasOtherServices) {
- printf("other-services\n");
- }
-
- // For modern apps, if screen size buckets haven't been specified
- // but the new width ranges have, then infer the buckets from them.
- if (smallScreen > 0 && normalScreen > 0 && largeScreen > 0 && xlargeScreen > 0
- && requiresSmallestWidthDp > 0) {
- int compatWidth = compatibleWidthLimitDp;
- if (compatWidth <= 0) compatWidth = requiresSmallestWidthDp;
- if (requiresSmallestWidthDp <= 240 && compatWidth >= 240) {
- smallScreen = -1;
- } else {
- smallScreen = 0;
- }
- if (requiresSmallestWidthDp <= 320 && compatWidth >= 320) {
- normalScreen = -1;
- } else {
- normalScreen = 0;
- }
- if (requiresSmallestWidthDp <= 480 && compatWidth >= 480) {
- largeScreen = -1;
- } else {
- largeScreen = 0;
- }
- if (requiresSmallestWidthDp <= 720 && compatWidth >= 720) {
- xlargeScreen = -1;
- } else {
- xlargeScreen = 0;
- }
- }
-
- // Determine default values for any unspecified screen sizes,
- // based on the target SDK of the package. As of 4 (donut)
- // the screen size support was introduced, so all default to
- // enabled.
- if (smallScreen > 0) {
- smallScreen = targetSdk >= 4 ? -1 : 0;
- }
- if (normalScreen > 0) {
- normalScreen = -1;
- }
- if (largeScreen > 0) {
- largeScreen = targetSdk >= 4 ? -1 : 0;
- }
- if (xlargeScreen > 0) {
- // Introduced in Gingerbread.
- xlargeScreen = targetSdk >= 9 ? -1 : 0;
- }
- if (anyDensity > 0) {
- anyDensity = (targetSdk >= 4 || requiresSmallestWidthDp > 0
- || compatibleWidthLimitDp > 0) ? -1 : 0;
- }
- printf("supports-screens:");
- if (smallScreen != 0) printf(" 'small'");
- if (normalScreen != 0) printf(" 'normal'");
- if (largeScreen != 0) printf(" 'large'");
- if (xlargeScreen != 0) printf(" 'xlarge'");
- printf("\n");
- printf("supports-any-density: '%s'\n", anyDensity ? "true" : "false");
- if (requiresSmallestWidthDp > 0) {
- printf("requires-smallest-width:'%d'\n", requiresSmallestWidthDp);
- }
- if (compatibleWidthLimitDp > 0) {
- printf("compatible-width-limit:'%d'\n", compatibleWidthLimitDp);
- }
- if (largestWidthLimitDp > 0) {
- printf("largest-width-limit:'%d'\n", largestWidthLimitDp);
- }
-
- printf("locales:");
- const size_t NL = locales.size();
- for (size_t i=0; i<NL; i++) {
- const char* localeStr = locales[i].string();
- if (localeStr == NULL || strlen(localeStr) == 0) {
- localeStr = "--_--";
- }
- printf(" '%s'", localeStr);
- }
- printf("\n");
-
- printf("densities:");
- const size_t ND = densities.size();
- for (size_t i=0; i<ND; i++) {
- printf(" '%d'", densities[i]);
- }
- printf("\n");
-
- AssetDir* dir = assets.openNonAssetDir(assetsCookie, "lib");
- if (dir != NULL) {
- if (dir->getFileCount() > 0) {
- printf("native-code:");
- for (size_t i=0; i<dir->getFileCount(); i++) {
- printf(" '%s'", dir->getFileName(i).string());
- }
- printf("\n");
- }
- delete dir;
- }
- } else if (strcmp("badger", option) == 0) {
- printf("%s", CONSOLE_DATA);
- } else if (strcmp("configurations", option) == 0) {
- Vector<ResTable_config> configs;
- res.getConfigurations(&configs);
- const size_t N = configs.size();
- for (size_t i=0; i<N; i++) {
- printf("%s\n", configs[i].toString().string());
- }
- } else {
- fprintf(stderr, "ERROR: unknown dump option '%s'\n", option);
- goto bail;
- }
- }
-
- result = NO_ERROR;
-
-bail:
- if (asset) {
- delete asset;
- }
- return (result != NO_ERROR);
-}
-
-
-/*
- * Handle the "add" command, which wants to add files to a new or
- * pre-existing archive.
- */
-int doAdd(Bundle* bundle)
-{
- ZipFile* zip = NULL;
- status_t result = UNKNOWN_ERROR;
- const char* zipFileName;
-
- if (bundle->getUpdate()) {
- /* avoid confusion */
- fprintf(stderr, "ERROR: can't use '-u' with add\n");
- goto bail;
- }
-
- if (bundle->getFileSpecCount() < 1) {
- fprintf(stderr, "ERROR: must specify zip file name\n");
- goto bail;
- }
- zipFileName = bundle->getFileSpecEntry(0);
-
- if (bundle->getFileSpecCount() < 2) {
- fprintf(stderr, "NOTE: nothing to do\n");
- goto bail;
- }
-
- zip = openReadWrite(zipFileName, true);
- if (zip == NULL) {
- fprintf(stderr, "ERROR: failed opening/creating '%s' as Zip file\n", zipFileName);
- goto bail;
- }
-
- for (int i = 1; i < bundle->getFileSpecCount(); i++) {
- const char* fileName = bundle->getFileSpecEntry(i);
-
- if (strcasecmp(String8(fileName).getPathExtension().string(), ".gz") == 0) {
- printf(" '%s'... (from gzip)\n", fileName);
- result = zip->addGzip(fileName, String8(fileName).getBasePath().string(), NULL);
- } else {
- if (bundle->getJunkPath()) {
- String8 storageName = String8(fileName).getPathLeaf();
- printf(" '%s' as '%s'...\n", fileName, storageName.string());
- result = zip->add(fileName, storageName.string(),
- bundle->getCompressionMethod(), NULL);
- } else {
- printf(" '%s'...\n", fileName);
- result = zip->add(fileName, bundle->getCompressionMethod(), NULL);
- }
- }
- if (result != NO_ERROR) {
- fprintf(stderr, "Unable to add '%s' to '%s'", bundle->getFileSpecEntry(i), zipFileName);
- if (result == NAME_NOT_FOUND)
- fprintf(stderr, ": file not found\n");
- else if (result == ALREADY_EXISTS)
- fprintf(stderr, ": already exists in archive\n");
- else
- fprintf(stderr, "\n");
- goto bail;
- }
- }
-
- result = NO_ERROR;
-
-bail:
- delete zip;
- return (result != NO_ERROR);
-}
-
-
-/*
- * Delete files from an existing archive.
- */
-int doRemove(Bundle* bundle)
-{
- ZipFile* zip = NULL;
- status_t result = UNKNOWN_ERROR;
- const char* zipFileName;
-
- if (bundle->getFileSpecCount() < 1) {
- fprintf(stderr, "ERROR: must specify zip file name\n");
- goto bail;
- }
- zipFileName = bundle->getFileSpecEntry(0);
-
- if (bundle->getFileSpecCount() < 2) {
- fprintf(stderr, "NOTE: nothing to do\n");
- goto bail;
- }
-
- zip = openReadWrite(zipFileName, false);
- if (zip == NULL) {
- fprintf(stderr, "ERROR: failed opening Zip archive '%s'\n",
- zipFileName);
- goto bail;
- }
-
- for (int i = 1; i < bundle->getFileSpecCount(); i++) {
- const char* fileName = bundle->getFileSpecEntry(i);
- ZipEntry* entry;
-
- entry = zip->getEntryByName(fileName);
- if (entry == NULL) {
- printf(" '%s' NOT FOUND\n", fileName);
- continue;
- }
-
- result = zip->remove(entry);
-
- if (result != NO_ERROR) {
- fprintf(stderr, "Unable to delete '%s' from '%s'\n",
- bundle->getFileSpecEntry(i), zipFileName);
- goto bail;
- }
- }
-
- /* update the archive */
- zip->flush();
-
-bail:
- delete zip;
- return (result != NO_ERROR);
-}
-
-
-/*
- * Package up an asset directory and associated application files.
- */
-int doPackage(Bundle* bundle)
-{
- const char* outputAPKFile;
- int retVal = 1;
- status_t err;
- sp<AaptAssets> assets;
- int N;
- FILE* fp;
- String8 dependencyFile;
-
- // -c zz_ZZ means do pseudolocalization
- ResourceFilter filter;
- err = filter.parse(bundle->getConfigurations());
- if (err != NO_ERROR) {
- goto bail;
- }
- if (filter.containsPseudo()) {
- bundle->setPseudolocalize(true);
- }
-
- N = bundle->getFileSpecCount();
- 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;
- }
-
- outputAPKFile = bundle->getOutputAPKFile();
-
- // Make sure the filenames provided exist and are of the appropriate type.
- if (outputAPKFile) {
- FileType type;
- type = getFileType(outputAPKFile);
- if (type != kFileTypeNonexistent && type != kFileTypeRegular) {
- fprintf(stderr,
- "ERROR: output file '%s' exists but is not regular file\n",
- outputAPKFile);
- goto bail;
- }
- }
-
- // Load the assets.
- assets = new AaptAssets();
-
- // Set up the resource gathering in assets if we're going to generate
- // dependency files. Every time we encounter a resource while slurping
- // the tree, we'll add it to these stores so we have full resource paths
- // to write to a dependency file.
- if (bundle->getGenDependencies()) {
- sp<FilePathStore> resPathStore = new FilePathStore;
- assets->setFullResPaths(resPathStore);
- sp<FilePathStore> assetPathStore = new FilePathStore;
- assets->setFullAssetPaths(assetPathStore);
- }
-
- err = assets->slurpFromArgs(bundle);
- if (err < 0) {
- goto bail;
- }
-
- if (bundle->getVerbose()) {
- assets->print(String8());
- }
-
- // If they asked for any fileAs that need to be compiled, do so.
- if (bundle->getResourceSourceDirs().size() || bundle->getAndroidManifestFile()) {
- err = buildResources(bundle, assets);
- if (err != 0) {
- goto bail;
- }
- }
-
- // At this point we've read everything and processed everything. From here
- // on out it's just writing output files.
- if (SourcePos::hasErrors()) {
- goto bail;
- }
-
- // Update symbols with information about which ones are needed as Java symbols.
- assets->applyJavaSymbols();
- if (SourcePos::hasErrors()) {
- goto bail;
- }
-
- // If we've been asked to generate a dependency file, do that here
- if (bundle->getGenDependencies()) {
- // If this is the packaging step, generate the dependency file next to
- // the output apk (e.g. bin/resources.ap_.d)
- if (outputAPKFile) {
- dependencyFile = String8(outputAPKFile);
- // Add the .d extension to the dependency file.
- dependencyFile.append(".d");
- } else {
- // Else if this is the R.java dependency generation step,
- // generate the dependency file in the R.java package subdirectory
- // e.g. gen/com/foo/app/R.java.d
- dependencyFile = String8(bundle->getRClassDir());
- dependencyFile.appendPath("R.java.d");
- }
- // Make sure we have a clean dependency file to start with
- fp = fopen(dependencyFile, "w");
- fclose(fp);
- }
-
- // Write out R.java constants
- if (!assets->havePrivateSymbols()) {
- if (bundle->getCustomPackage() == NULL) {
- // Write the R.java file into the appropriate class directory
- // e.g. gen/com/foo/app/R.java
- err = writeResourceSymbols(bundle, assets, assets->getPackage(), true);
- } else {
- const String8 customPkg(bundle->getCustomPackage());
- err = writeResourceSymbols(bundle, assets, customPkg, true);
- }
- if (err < 0) {
- goto bail;
- }
- // If we have library files, we're going to write our R.java file into
- // the appropriate class directory for those libraries as well.
- // e.g. gen/com/foo/app/lib/R.java
- if (bundle->getExtraPackages() != NULL) {
- // Split on colon
- String8 libs(bundle->getExtraPackages());
- char* packageString = strtok(libs.lockBuffer(libs.length()), ":");
- while (packageString != NULL) {
- // Write the R.java file out with the correct package name
- err = writeResourceSymbols(bundle, assets, String8(packageString), true);
- if (err < 0) {
- goto bail;
- }
- packageString = strtok(NULL, ":");
- }
- libs.unlockBuffer();
- }
- } else {
- err = writeResourceSymbols(bundle, assets, assets->getPackage(), false);
- if (err < 0) {
- goto bail;
- }
- err = writeResourceSymbols(bundle, assets, assets->getSymbolsPrivatePackage(), true);
- if (err < 0) {
- goto bail;
- }
- }
-
- // Write out the ProGuard file
- err = writeProguardFile(bundle, assets);
- if (err < 0) {
- goto bail;
- }
-
- // Write the apk
- if (outputAPKFile) {
- err = writeAPK(bundle, assets, String8(outputAPKFile));
- if (err != NO_ERROR) {
- fprintf(stderr, "ERROR: packaging of '%s' failed\n", outputAPKFile);
- goto bail;
- }
- }
-
- // If we've been asked to generate a dependency file, we need to finish up here.
- // the writeResourceSymbols and writeAPK functions have already written the target
- // half of the dependency file, now we need to write the prerequisites. (files that
- // the R.java file or .ap_ file depend on)
- if (bundle->getGenDependencies()) {
- // Now that writeResourceSymbols or writeAPK has taken care of writing
- // the targets to our dependency file, we'll write the prereqs
- fp = fopen(dependencyFile, "a+");
- fprintf(fp, " : ");
- bool includeRaw = (outputAPKFile != NULL);
- err = writeDependencyPreReqs(bundle, assets, fp, includeRaw);
- // Also manually add the AndroidManifeset since it's not under res/ or assets/
- // and therefore was not added to our pathstores during slurping
- fprintf(fp, "%s \\\n", bundle->getAndroidManifestFile());
- fclose(fp);
- }
-
- retVal = 0;
-bail:
- if (SourcePos::hasErrors()) {
- SourcePos::printErrors(stderr);
- }
- return retVal;
-}
-
-/*
- * Do PNG Crunching
- * PRECONDITIONS
- * -S flag points to a source directory containing drawable* folders
- * -C flag points to destination directory. The folder structure in the
- * source directory will be mirrored to the destination (cache) directory
- *
- * POSTCONDITIONS
- * Destination directory will be updated to match the PNG files in
- * the source directory.
- */
-int doCrunch(Bundle* bundle)
-{
- fprintf(stdout, "Crunching PNG Files in ");
- fprintf(stdout, "source dir: %s\n", bundle->getResourceSourceDirs()[0]);
- fprintf(stdout, "To destination dir: %s\n", bundle->getCrunchedOutputDir());
-
- updatePreProcessedCache(bundle);
-
- return NO_ERROR;
-}
-
-/*
- * Do PNG Crunching on a single flag
- * -i points to a single png file
- * -o points to a single png output file
- */
-int doSingleCrunch(Bundle* bundle)
-{
- fprintf(stdout, "Crunching single PNG file: %s\n", bundle->getSingleCrunchInputFile());
- fprintf(stdout, "\tOutput file: %s\n", bundle->getSingleCrunchOutputFile());
-
- String8 input(bundle->getSingleCrunchInputFile());
- String8 output(bundle->getSingleCrunchOutputFile());
-
- if (preProcessImageToCache(bundle, input, output) != NO_ERROR) {
- // we can't return the status_t as it gets truncate to the lower 8 bits.
- return 42;
- }
-
- return NO_ERROR;
-}
-
-char CONSOLE_DATA[2925] = {
- 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 95, 46, 32, 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 10, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 61, 63,
- 86, 35, 40, 46, 46, 95, 95, 95, 95, 97, 97, 44, 32, 46, 124, 42, 33, 83,
- 62, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 58, 46, 58, 59, 61, 59, 61, 81,
- 81, 81, 81, 66, 96, 61, 61, 58, 46, 46, 46, 58, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 10, 32, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 46, 61, 59, 59, 59, 58, 106, 81, 81, 81, 81, 102, 59, 61, 59,
- 59, 61, 61, 61, 58, 46, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 61, 59, 59,
- 59, 58, 109, 81, 81, 81, 81, 61, 59, 59, 59, 59, 59, 58, 59, 59, 46, 32,
- 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
- 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 46, 61, 59, 59, 59, 60, 81, 81, 81, 81, 87,
- 58, 59, 59, 59, 59, 59, 59, 61, 119, 44, 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 10, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 46,
- 47, 61, 59, 59, 58, 100, 81, 81, 81, 81, 35, 58, 59, 59, 59, 59, 59, 58,
- 121, 81, 91, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 46, 109, 58, 59, 59, 61, 81, 81,
- 81, 81, 81, 109, 58, 59, 59, 59, 59, 61, 109, 81, 81, 76, 46, 32, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 10, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 41, 87, 59, 61, 59, 41, 81, 81, 81, 81, 81, 81, 59, 61, 59,
- 59, 58, 109, 81, 81, 87, 39, 46, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 60, 81, 91, 59,
- 59, 61, 81, 81, 81, 81, 81, 87, 43, 59, 58, 59, 60, 81, 81, 81, 76, 32,
- 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 32, 52, 91, 58, 45, 59, 87, 81, 81, 81, 81,
- 70, 58, 58, 58, 59, 106, 81, 81, 81, 91, 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 10, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 93, 40, 32, 46, 59, 100, 81, 81, 81, 81, 40, 58, 46, 46, 58, 100, 81,
- 81, 68, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 46, 46, 46, 32, 46, 46, 46, 32, 46, 32, 46, 45, 91, 59, 61, 58, 109,
- 81, 81, 81, 87, 46, 58, 61, 59, 60, 81, 81, 80, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 10, 32,
- 32, 32, 32, 32, 32, 32, 32, 46, 46, 61, 59, 61, 61, 61, 59, 61, 61, 59,
- 59, 59, 58, 58, 46, 46, 41, 58, 59, 58, 81, 81, 81, 81, 69, 58, 59, 59,
- 60, 81, 81, 68, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 32, 32, 10, 32, 32, 32, 32, 32, 32, 58, 59,
- 61, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 61, 61, 46,
- 61, 59, 93, 81, 81, 81, 81, 107, 58, 59, 58, 109, 87, 68, 96, 32, 32, 32,
- 46, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 10, 32, 32, 32, 46, 60, 61, 61, 59, 59, 59, 59, 59, 59, 59, 59,
- 59, 59, 59, 59, 59, 59, 59, 59, 59, 58, 58, 58, 115, 109, 68, 41, 36, 81,
- 109, 46, 61, 61, 81, 69, 96, 46, 58, 58, 46, 58, 46, 46, 32, 32, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 10, 46, 32, 95, 81,
- 67, 61, 61, 58, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
- 59, 59, 59, 59, 58, 68, 39, 61, 105, 61, 63, 81, 119, 58, 106, 80, 32, 58,
- 61, 59, 59, 61, 59, 61, 59, 61, 46, 95, 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 32, 32, 10, 32, 32, 36, 81, 109, 105, 59, 61, 59, 59, 59,
- 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 46, 58, 37,
- 73, 108, 108, 62, 52, 81, 109, 34, 32, 61, 59, 59, 59, 59, 59, 59, 59, 59,
- 59, 61, 59, 61, 61, 46, 46, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 10,
- 32, 46, 45, 57, 101, 43, 43, 61, 61, 59, 59, 59, 59, 59, 59, 61, 59, 59,
- 59, 59, 59, 59, 59, 59, 59, 58, 97, 46, 61, 108, 62, 126, 58, 106, 80, 96,
- 46, 61, 61, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 61, 61,
- 97, 103, 97, 32, 32, 32, 32, 32, 32, 32, 10, 32, 32, 32, 32, 45, 46, 32,
- 46, 32, 32, 32, 32, 32, 32, 32, 32, 45, 45, 45, 58, 59, 59, 59, 59, 61,
- 119, 81, 97, 124, 105, 124, 124, 39, 126, 95, 119, 58, 61, 58, 59, 59, 59,
- 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 61, 119, 81, 81, 99, 32, 32,
- 32, 32, 32, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 58, 59, 59, 58, 106, 81, 81, 81, 109, 119,
- 119, 119, 109, 109, 81, 81, 122, 58, 59, 59, 59, 59, 59, 59, 59, 59, 59,
- 59, 59, 59, 59, 59, 58, 115, 81, 87, 81, 102, 32, 32, 32, 32, 32, 32, 10,
- 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 61, 58, 59, 61, 81, 81, 81, 81, 81, 81, 87, 87, 81, 81, 81, 81,
- 81, 58, 59, 59, 59, 59, 59, 59, 59, 59, 58, 45, 45, 45, 59, 59, 59, 41,
- 87, 66, 33, 32, 32, 32, 32, 32, 32, 32, 10, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 58, 59, 59, 93, 81,
- 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 40, 58, 59, 59, 59, 58,
- 45, 32, 46, 32, 32, 32, 32, 32, 46, 32, 126, 96, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 32, 32, 58, 61, 59, 58, 81, 81, 81, 81, 81, 81, 81, 81,
- 81, 81, 81, 81, 81, 40, 58, 59, 59, 59, 58, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 10, 32, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 58,
- 59, 59, 58, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 40, 58,
- 59, 59, 59, 46, 46, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 58, 61, 59, 60, 81, 81, 81, 81,
- 81, 81, 81, 81, 81, 81, 81, 81, 81, 59, 61, 59, 59, 61, 32, 32, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
- 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 58, 59, 59, 93, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
- 81, 81, 40, 59, 59, 59, 59, 32, 46, 32, 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 10, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 58, 61, 58, 106,
- 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 76, 58, 59, 59, 59,
- 32, 46, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 61, 58, 58, 81, 81, 81, 81, 81, 81, 81, 81,
- 81, 81, 81, 81, 81, 87, 58, 59, 59, 59, 59, 32, 46, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 10, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
- 58, 59, 61, 41, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 87, 59,
- 61, 58, 59, 59, 46, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 58, 61, 58, 61, 81, 81, 81,
- 81, 81, 81, 81, 81, 81, 81, 81, 81, 107, 58, 59, 59, 59, 59, 58, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 58, 59, 59, 58, 51, 81, 81, 81, 81, 81, 81, 81, 81, 81,
- 81, 102, 94, 59, 59, 59, 59, 59, 61, 32, 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 10, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 58, 61, 59,
- 59, 59, 43, 63, 36, 81, 81, 81, 87, 64, 86, 102, 58, 59, 59, 59, 59, 59,
- 59, 59, 46, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 46, 61, 59, 59, 59, 59, 59, 59, 59, 43, 33,
- 58, 126, 126, 58, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 32, 46, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 10, 32,
- 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 46,
- 61, 59, 59, 59, 58, 45, 58, 61, 59, 58, 58, 58, 61, 59, 59, 59, 59, 59,
- 59, 59, 59, 59, 59, 59, 59, 58, 32, 46, 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 32, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 32, 32, 46, 61, 59, 59, 59, 59, 59, 58, 95,
- 32, 45, 61, 59, 61, 59, 59, 59, 59, 59, 59, 59, 45, 58, 59, 59, 59, 59,
- 61, 58, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 58, 61, 59, 59, 59, 59, 59, 61, 59, 61, 46, 46, 32, 45, 45, 45,
- 59, 58, 45, 45, 46, 58, 59, 59, 59, 59, 59, 59, 61, 46, 32, 32, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 10, 32, 32, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 46, 58, 59, 59, 59, 59,
- 59, 59, 59, 59, 59, 61, 59, 46, 32, 32, 46, 32, 46, 32, 58, 61, 59, 59,
- 59, 59, 59, 59, 59, 59, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 32, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 45, 59, 59, 59, 59, 59, 59, 59, 59, 58, 32,
- 32, 32, 32, 32, 32, 32, 32, 32, 61, 59, 59, 59, 59, 59, 59, 59, 58, 32,
- 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 10,
- 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
- 46, 61, 59, 59, 59, 59, 59, 59, 59, 32, 46, 32, 32, 32, 32, 32, 32, 61,
- 46, 61, 59, 59, 59, 59, 59, 59, 58, 32, 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 10, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 61, 59, 59, 59, 59, 59, 59,
- 59, 59, 32, 46, 32, 32, 32, 32, 32, 32, 32, 46, 61, 58, 59, 59, 59, 59,
- 59, 58, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 58, 59, 59, 59, 59, 59, 59, 59, 59, 46, 46, 32, 32, 32,
- 32, 32, 32, 32, 61, 59, 59, 59, 59, 59, 59, 59, 45, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 10, 32, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 46, 32, 45, 61,
- 59, 59, 59, 59, 59, 58, 32, 46, 32, 32, 32, 32, 32, 32, 32, 58, 59, 59,
- 59, 59, 59, 58, 45, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 45, 45, 45, 45, 32, 46, 32,
- 32, 32, 32, 32, 32, 32, 32, 32, 32, 45, 61, 59, 58, 45, 45, 32, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
- 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 46, 32, 32, 46, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 10
- };
diff --git a/tools/aapt/CrunchCache.cpp b/tools/aapt/CrunchCache.cpp
deleted file mode 100644
index c4cf6bc..0000000
--- a/tools/aapt/CrunchCache.cpp
+++ /dev/null
@@ -1,104 +0,0 @@
-//
-// Copyright 2011 The Android Open Source Project
-//
-// Implementation file for CrunchCache
-// This file defines functions laid out and documented in
-// CrunchCache.h
-
-#include <utils/Vector.h>
-#include <utils/String8.h>
-
-#include "DirectoryWalker.h"
-#include "FileFinder.h"
-#include "CacheUpdater.h"
-#include "CrunchCache.h"
-
-using namespace android;
-
-CrunchCache::CrunchCache(String8 sourcePath, String8 destPath, FileFinder* ff)
- : mSourcePath(sourcePath), mDestPath(destPath), mSourceFiles(0), mDestFiles(0), mFileFinder(ff)
-{
- // We initialize the default value to return to 0 so if a file doesn't exist
- // then all files are automatically "newer" than it.
-
- // Set file extensions to look for. Right now just pngs.
- mExtensions.push(String8(".png"));
-
- // Load files into our data members
- loadFiles();
-}
-
-size_t CrunchCache::crunch(CacheUpdater* cu, bool forceOverwrite)
-{
- size_t numFilesUpdated = 0;
-
- // Iterate through the source files and compare to cache.
- // After processing a file, remove it from the source files and
- // from the dest files.
- // We're done when we're out of files in source.
- String8 relativePath;
- while (mSourceFiles.size() > 0) {
- // Get the full path to the source file, then convert to a c-string
- // and offset our beginning pointer to the length of the sourcePath
- // This efficiently strips the source directory prefix from our path.
- // Also, String8 doesn't have a substring method so this is what we've
- // got to work with.
- const char* rPathPtr = mSourceFiles.keyAt(0).string()+mSourcePath.length();
- // Strip leading slash if present
- int offset = 0;
- if (rPathPtr[0] == OS_PATH_SEPARATOR)
- offset = 1;
- relativePath = String8(rPathPtr + offset);
-
- if (forceOverwrite || needsUpdating(relativePath)) {
- cu->processImage(mSourcePath.appendPathCopy(relativePath),
- mDestPath.appendPathCopy(relativePath));
- numFilesUpdated++;
- // crunchFile(relativePath);
- }
- // Delete this file from the source files and (if it exists) from the
- // dest files.
- mSourceFiles.removeItemsAt(0);
- mDestFiles.removeItem(mDestPath.appendPathCopy(relativePath));
- }
-
- // Iterate through what's left of destFiles and delete leftovers
- while (mDestFiles.size() > 0) {
- cu->deleteFile(mDestFiles.keyAt(0));
- mDestFiles.removeItemsAt(0);
- }
-
- // Update our knowledge of the files cache
- // both source and dest should be empty by now.
- loadFiles();
-
- return numFilesUpdated;
-}
-
-void CrunchCache::loadFiles()
-{
- // Clear out our data structures to avoid putting in duplicates
- mSourceFiles.clear();
- mDestFiles.clear();
-
- // Make a directory walker that points to the system.
- DirectoryWalker* dw = new SystemDirectoryWalker();
-
- // Load files in the source directory
- mFileFinder->findFiles(mSourcePath, mExtensions, mSourceFiles,dw);
-
- // Load files in the destination directory
- mFileFinder->findFiles(mDestPath,mExtensions,mDestFiles,dw);
-
- delete dw;
-}
-
-bool CrunchCache::needsUpdating(String8 relativePath) const
-{
- // Retrieve modification dates for this file entry under the source and
- // cache directory trees. The vectors will return a modification date of 0
- // if the file doesn't exist.
- time_t sourceDate = mSourceFiles.valueFor(mSourcePath.appendPathCopy(relativePath));
- time_t destDate = mDestFiles.valueFor(mDestPath.appendPathCopy(relativePath));
- return sourceDate > destDate;
-} \ No newline at end of file
diff --git a/tools/aapt/CrunchCache.h b/tools/aapt/CrunchCache.h
deleted file mode 100644
index be3da5c..0000000
--- a/tools/aapt/CrunchCache.h
+++ /dev/null
@@ -1,102 +0,0 @@
-//
-// Copyright 2011 The Android Open Source Project
-//
-// Cache manager for pre-processed PNG files.
-// Contains code for managing which PNG files get processed
-// at build time.
-//
-
-#ifndef CRUNCHCACHE_H
-#define CRUNCHCACHE_H
-
-#include <utils/KeyedVector.h>
-#include <utils/String8.h>
-#include "FileFinder.h"
-#include "CacheUpdater.h"
-
-using namespace android;
-
-/** CrunchCache
- * This class is a cache manager which can pre-process PNG files and store
- * them in a mirror-cache. It's capable of doing incremental updates to its
- * cache.
- *
- * Usage:
- * Create an instance initialized with the root of the source tree, the
- * root location to store the cache files, and an instance of a file finder.
- * Then update the cache by calling crunch.
- */
-class CrunchCache {
-public:
- // Constructor
- CrunchCache(String8 sourcePath, String8 destPath, FileFinder* ff);
-
- // Nobody should be calling the default constructor
- // So this space is intentionally left blank
-
- // Default Copy Constructor and Destructor are fine
-
- /** crunch is the workhorse of this class.
- * It goes through all the files found in the sourcePath and compares
- * them to the cached versions in the destPath. If the optional
- * argument forceOverwrite is set to true, then all source files are
- * re-crunched even if they have not been modified recently. Otherwise,
- * source files are only crunched when they needUpdating. Afterwards,
- * we delete any leftover files in the cache that are no longer present
- * in source.
- *
- * PRECONDITIONS:
- * No setup besides construction is needed
- * POSTCONDITIONS:
- * The cache is updated to fully reflect all changes in source.
- * The function then returns the number of files changed in cache
- * (counting deletions).
- */
- size_t crunch(CacheUpdater* cu, bool forceOverwrite=false);
-
-private:
- /** loadFiles is a wrapper to the FileFinder that places matching
- * files into mSourceFiles and mDestFiles.
- *
- * POSTCONDITIONS
- * mDestFiles and mSourceFiles are refreshed to reflect the current
- * state of the files in the source and dest directories.
- * Any previous contents of mSourceFiles and mDestFiles are cleared.
- */
- void loadFiles();
-
- /** needsUpdating takes a file path
- * and returns true if the file represented by this path is newer in the
- * sourceFiles than in the cache (mDestFiles).
- *
- * PRECONDITIONS:
- * mSourceFiles and mDestFiles must be initialized and filled.
- * POSTCONDITIONS:
- * returns true if and only if source file's modification time
- * is greater than the cached file's mod-time. Otherwise returns false.
- *
- * USAGE:
- * Should be used something like the following:
- * if (needsUpdating(filePath))
- * // Recrunch sourceFile out to destFile.
- *
- */
- bool needsUpdating(String8 relativePath) const;
-
- // DATA MEMBERS ====================================================
-
- String8 mSourcePath;
- String8 mDestPath;
-
- Vector<String8> mExtensions;
-
- // Each vector of paths contains one entry per PNG file encountered.
- // Each entry consists of a path pointing to that PNG.
- DefaultKeyedVector<String8,time_t> mSourceFiles;
- DefaultKeyedVector<String8,time_t> mDestFiles;
-
- // Pointer to a FileFinder to use
- FileFinder* mFileFinder;
-};
-
-#endif // CRUNCHCACHE_H
diff --git a/tools/aapt/DirectoryWalker.h b/tools/aapt/DirectoryWalker.h
deleted file mode 100644
index 88031d0..0000000
--- a/tools/aapt/DirectoryWalker.h
+++ /dev/null
@@ -1,98 +0,0 @@
-//
-// Copyright 2011 The Android Open Source Project
-//
-// Defines an abstraction for opening a directory on the filesystem and
-// iterating through it.
-
-#ifndef DIRECTORYWALKER_H
-#define DIRECTORYWALKER_H
-
-#include <dirent.h>
-#include <sys/types.h>
-#include <sys/param.h>
-#include <sys/stat.h>
-#include <unistd.h>
-#include <utils/String8.h>
-
-#include <stdio.h>
-
-using namespace android;
-
-// Directory Walker
-// This is an abstraction for walking through a directory and getting files
-// and descriptions.
-
-class DirectoryWalker {
-public:
- virtual ~DirectoryWalker() {};
- virtual bool openDir(String8 path) = 0;
- virtual bool openDir(const char* path) = 0;
- // Advance to next directory entry
- virtual struct dirent* nextEntry() = 0;
- // Get the stats for the current entry
- virtual struct stat* entryStats() = 0;
- // Clean Up
- virtual void closeDir() = 0;
- // This class is able to replicate itself on the heap
- virtual DirectoryWalker* clone() = 0;
-
- // DATA MEMBERS
- // Current directory entry
- struct dirent mEntry;
- // Stats for that directory entry
- struct stat mStats;
- // Base path
- String8 mBasePath;
-};
-
-// System Directory Walker
-// This is an implementation of the above abstraction that calls
-// real system calls and is fully functional.
-// functions are inlined since they're very short and simple
-
-class SystemDirectoryWalker : public DirectoryWalker {
-
- // Default constructor, copy constructor, and destructor are fine
-public:
- virtual bool openDir(String8 path) {
- mBasePath = path;
- dir = NULL;
- dir = opendir(mBasePath.string() );
-
- if (dir == NULL)
- return false;
-
- return true;
- };
- virtual bool openDir(const char* path) {
- String8 p(path);
- openDir(p);
- return true;
- };
- // Advance to next directory entry
- virtual struct dirent* nextEntry() {
- struct dirent* entryPtr = readdir(dir);
- if (entryPtr == NULL)
- return NULL;
-
- mEntry = *entryPtr;
- // Get stats
- String8 fullPath = mBasePath.appendPathCopy(mEntry.d_name);
- stat(fullPath.string(),&mStats);
- return &mEntry;
- };
- // Get the stats for the current entry
- virtual struct stat* entryStats() {
- return &mStats;
- };
- virtual void closeDir() {
- closedir(dir);
- };
- virtual DirectoryWalker* clone() {
- return new SystemDirectoryWalker(*this);
- };
-private:
- DIR* dir;
-};
-
-#endif // DIRECTORYWALKER_H
diff --git a/tools/aapt/FileFinder.cpp b/tools/aapt/FileFinder.cpp
deleted file mode 100644
index 18775c0..0000000
--- a/tools/aapt/FileFinder.cpp
+++ /dev/null
@@ -1,98 +0,0 @@
-//
-// Copyright 2011 The Android Open Source Project
-//
-
-// File Finder implementation.
-// Implementation for the functions declared and documented in FileFinder.h
-
-#include <utils/Vector.h>
-#include <utils/String8.h>
-#include <utils/KeyedVector.h>
-
-#include <dirent.h>
-#include <sys/stat.h>
-
-#include "DirectoryWalker.h"
-#include "FileFinder.h"
-
-//#define DEBUG
-
-using android::String8;
-
-// Private function to check whether a file is a directory or not
-bool isDirectory(const char* filename) {
- struct stat fileStat;
- if (stat(filename, &fileStat) == -1) {
- return false;
- }
- return(S_ISDIR(fileStat.st_mode));
-}
-
-
-// Private function to check whether a file is a regular file or not
-bool isFile(const char* filename) {
- struct stat fileStat;
- if (stat(filename, &fileStat) == -1) {
- return false;
- }
- return(S_ISREG(fileStat.st_mode));
-}
-
-bool SystemFileFinder::findFiles(String8 basePath, Vector<String8>& extensions,
- KeyedVector<String8,time_t>& fileStore,
- DirectoryWalker* dw)
-{
- // Scan the directory pointed to by basePath
- // check files and recurse into subdirectories.
- if (!dw->openDir(basePath)) {
- return false;
- }
- /*
- * Go through all directory entries. Check each file using checkAndAddFile
- * and recurse into sub-directories.
- */
- struct dirent* entry;
- while ((entry = dw->nextEntry()) != NULL) {
- String8 entryName(entry->d_name);
- if (entry->d_name[0] == '.') // Skip hidden files and directories
- continue;
-
- String8 fullPath = basePath.appendPathCopy(entryName);
- // If this entry is a directory we'll recurse into it
- if (isDirectory(fullPath.string()) ) {
- DirectoryWalker* copy = dw->clone();
- findFiles(fullPath, extensions, fileStore,copy);
- delete copy;
- }
-
- // If this entry is a file, we'll pass it over to checkAndAddFile
- if (isFile(fullPath.string()) ) {
- checkAndAddFile(fullPath,dw->entryStats(),extensions,fileStore);
- }
- }
-
- // Clean up
- dw->closeDir();
-
- return true;
-}
-
-void SystemFileFinder::checkAndAddFile(String8 path, const struct stat* stats,
- Vector<String8>& extensions,
- KeyedVector<String8,time_t>& fileStore)
-{
- // Loop over the extensions, checking for a match
- bool done = false;
- String8 ext(path.getPathExtension());
- ext.toLower();
- for (size_t i = 0; i < extensions.size() && !done; ++i) {
- String8 ext2 = extensions[i].getPathExtension();
- ext2.toLower();
- // Compare the extensions. If a match is found, add to storage.
- if (ext == ext2) {
- done = true;
- fileStore.add(path,stats->st_mtime);
- }
- }
-}
-
diff --git a/tools/aapt/FileFinder.h b/tools/aapt/FileFinder.h
deleted file mode 100644
index 6974aee..0000000
--- a/tools/aapt/FileFinder.h
+++ /dev/null
@@ -1,80 +0,0 @@
-//
-// Copyright 2011 The Android Open Source Project
-//
-
-// File Finder.
-// This is a collection of useful functions for finding paths and modification
-// times of files that match an extension pattern in a directory tree.
-// and finding files in it.
-
-#ifndef FILEFINDER_H
-#define FILEFINDER_H
-
-#include <utils/Vector.h>
-#include <utils/KeyedVector.h>
-#include <utils/String8.h>
-
-#include "DirectoryWalker.h"
-
-using namespace android;
-
-// Abstraction to allow for dependency injection. See MockFileFinder.h
-// for the testing implementation.
-class FileFinder {
-public:
- virtual bool findFiles(String8 basePath, Vector<String8>& extensions,
- KeyedVector<String8,time_t>& fileStore,
- DirectoryWalker* dw) = 0;
-
- virtual ~FileFinder() {};
-};
-
-class SystemFileFinder : public FileFinder {
-public:
-
- /* findFiles takes a path, a Vector of extensions, and a destination KeyedVector
- * and places path/modification date key/values pointing to
- * all files with matching extensions found into the KeyedVector
- * PRECONDITIONS
- * path is a valid system path
- * extensions should include leading "."
- * This is not necessary, but the comparison directly
- * compares the end of the path string so if the "."
- * is excluded there is a small chance you could have
- * a false positive match. (For example: extension "png"
- * would match a file called "blahblahpng")
- *
- * POSTCONDITIONS
- * fileStore contains (in no guaranteed order) paths to all
- * matching files encountered in subdirectories of path
- * as keys in the KeyedVector. Each key has the modification time
- * of the file as its value.
- *
- * Calls checkAndAddFile on each file encountered in the directory tree
- * Recursively descends into subdirectories.
- */
- virtual bool findFiles(String8 basePath, Vector<String8>& extensions,
- KeyedVector<String8,time_t>& fileStore,
- DirectoryWalker* dw);
-
-private:
- /**
- * checkAndAddFile looks at a single file path and stat combo
- * to determine whether it is a matching file (by looking at
- * the extension)
- *
- * PRECONDITIONS
- * no setup is needed
- *
- * POSTCONDITIONS
- * If the given file has a matching extension then a new entry
- * is added to the KeyedVector with the path as the key and the modification
- * time as the value.
- *
- */
- static void checkAndAddFile(String8 path, const struct stat* stats,
- Vector<String8>& extensions,
- KeyedVector<String8,time_t>& fileStore);
-
-};
-#endif // FILEFINDER_H
diff --git a/tools/aapt/Images.cpp b/tools/aapt/Images.cpp
deleted file mode 100644
index 25a948d..0000000
--- a/tools/aapt/Images.cpp
+++ /dev/null
@@ -1,1386 +0,0 @@
-//
-// Copyright 2006 The Android Open Source Project
-//
-// Build resource files from raw assets.
-//
-
-#define PNG_INTERNAL
-
-#include "Images.h"
-
-#include <androidfw/ResourceTypes.h>
-#include <utils/ByteOrder.h>
-
-#include <png.h>
-#include <zlib.h>
-
-#define NOISY(x) //x
-
-static void
-png_write_aapt_file(png_structp png_ptr, png_bytep data, png_size_t length)
-{
- AaptFile* aaptfile = (AaptFile*) png_get_io_ptr(png_ptr);
- status_t err = aaptfile->writeData(data, length);
- if (err != NO_ERROR) {
- png_error(png_ptr, "Write Error");
- }
-}
-
-
-static void
-png_flush_aapt_file(png_structp png_ptr)
-{
-}
-
-// This holds an image as 8bpp RGBA.
-struct image_info
-{
- image_info() : rows(NULL), is9Patch(false), allocRows(NULL) { }
- ~image_info() {
- if (rows && rows != allocRows) {
- free(rows);
- }
- if (allocRows) {
- for (int i=0; i<(int)allocHeight; i++) {
- free(allocRows[i]);
- }
- free(allocRows);
- }
- free(info9Patch.xDivs);
- free(info9Patch.yDivs);
- free(info9Patch.colors);
- }
-
- png_uint_32 width;
- png_uint_32 height;
- png_bytepp rows;
-
- // 9-patch info.
- bool is9Patch;
- Res_png_9patch info9Patch;
-
- // Layout padding, if relevant
- bool haveLayoutBounds;
- int32_t layoutBoundsLeft;
- int32_t layoutBoundsTop;
- int32_t layoutBoundsRight;
- int32_t layoutBoundsBottom;
-
- png_uint_32 allocHeight;
- png_bytepp allocRows;
-};
-
-static void read_png(const char* imageName,
- png_structp read_ptr, png_infop read_info,
- image_info* outImageInfo)
-{
- int color_type;
- int bit_depth, interlace_type, compression_type;
- int i;
-
- png_read_info(read_ptr, read_info);
-
- png_get_IHDR(read_ptr, read_info, &outImageInfo->width,
- &outImageInfo->height, &bit_depth, &color_type,
- &interlace_type, &compression_type, NULL);
-
- //printf("Image %s:\n", imageName);
- //printf("color_type=%d, bit_depth=%d, interlace_type=%d, compression_type=%d\n",
- // color_type, bit_depth, interlace_type, compression_type);
-
- if (color_type == PNG_COLOR_TYPE_PALETTE)
- png_set_palette_to_rgb(read_ptr);
-
- if (color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8)
- png_set_expand_gray_1_2_4_to_8(read_ptr);
-
- if (png_get_valid(read_ptr, read_info, PNG_INFO_tRNS)) {
- //printf("Has PNG_INFO_tRNS!\n");
- png_set_tRNS_to_alpha(read_ptr);
- }
-
- if (bit_depth == 16)
- png_set_strip_16(read_ptr);
-
- if ((color_type&PNG_COLOR_MASK_ALPHA) == 0)
- png_set_add_alpha(read_ptr, 0xFF, PNG_FILLER_AFTER);
-
- if (color_type == PNG_COLOR_TYPE_GRAY || color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
- png_set_gray_to_rgb(read_ptr);
-
- png_read_update_info(read_ptr, read_info);
-
- outImageInfo->rows = (png_bytepp)malloc(
- outImageInfo->height * sizeof(png_bytep));
- outImageInfo->allocHeight = outImageInfo->height;
- outImageInfo->allocRows = outImageInfo->rows;
-
- png_set_rows(read_ptr, read_info, outImageInfo->rows);
-
- for (i = 0; i < (int)outImageInfo->height; i++)
- {
- outImageInfo->rows[i] = (png_bytep)
- malloc(png_get_rowbytes(read_ptr, read_info));
- }
-
- png_read_image(read_ptr, outImageInfo->rows);
-
- png_read_end(read_ptr, read_info);
-
- NOISY(printf("Image %s: w=%d, h=%d, d=%d, colors=%d, inter=%d, comp=%d\n",
- imageName,
- (int)outImageInfo->width, (int)outImageInfo->height,
- bit_depth, color_type,
- interlace_type, compression_type));
-
- png_get_IHDR(read_ptr, read_info, &outImageInfo->width,
- &outImageInfo->height, &bit_depth, &color_type,
- &interlace_type, &compression_type, NULL);
-}
-
-#define COLOR_TRANSPARENT 0
-#define COLOR_WHITE 0xFFFFFFFF
-#define COLOR_TICK 0xFF000000
-#define COLOR_LAYOUT_BOUNDS_TICK 0xFF0000FF
-
-enum {
- TICK_TYPE_NONE,
- TICK_TYPE_TICK,
- TICK_TYPE_LAYOUT_BOUNDS,
- TICK_TYPE_BOTH
-};
-
-static int tick_type(png_bytep p, bool transparent, const char** outError)
-{
- png_uint_32 color = p[0] | (p[1] << 8) | (p[2] << 16) | (p[3] << 24);
-
- if (transparent) {
- if (p[3] == 0) {
- return TICK_TYPE_NONE;
- }
- if (color == COLOR_LAYOUT_BOUNDS_TICK) {
- return TICK_TYPE_LAYOUT_BOUNDS;
- }
- if (color == COLOR_TICK) {
- return TICK_TYPE_TICK;
- }
-
- // Error cases
- if (p[3] != 0xff) {
- *outError = "Frame pixels must be either solid or transparent (not intermediate alphas)";
- return TICK_TYPE_NONE;
- }
- if (p[0] != 0 || p[1] != 0 || p[2] != 0) {
- *outError = "Ticks in transparent frame must be black or red";
- }
- return TICK_TYPE_TICK;
- }
-
- if (p[3] != 0xFF) {
- *outError = "White frame must be a solid color (no alpha)";
- }
- if (color == COLOR_WHITE) {
- return TICK_TYPE_NONE;
- }
- if (color == COLOR_TICK) {
- return TICK_TYPE_TICK;
- }
- if (color == COLOR_LAYOUT_BOUNDS_TICK) {
- return TICK_TYPE_LAYOUT_BOUNDS;
- }
-
- if (p[0] != 0 || p[1] != 0 || p[2] != 0) {
- *outError = "Ticks in white frame must be black or red";
- return TICK_TYPE_NONE;
- }
- return TICK_TYPE_TICK;
-}
-
-enum {
- TICK_START,
- TICK_INSIDE_1,
- TICK_OUTSIDE_1
-};
-
-static status_t get_horizontal_ticks(
- png_bytep row, int width, bool transparent, bool required,
- int32_t* outLeft, int32_t* outRight, const char** outError,
- uint8_t* outDivs, bool multipleAllowed)
-{
- int i;
- *outLeft = *outRight = -1;
- int state = TICK_START;
- bool found = false;
-
- for (i=1; i<width-1; i++) {
- if (TICK_TYPE_TICK == tick_type(row+i*4, transparent, outError)) {
- if (state == TICK_START ||
- (state == TICK_OUTSIDE_1 && multipleAllowed)) {
- *outLeft = i-1;
- *outRight = width-2;
- found = true;
- if (outDivs != NULL) {
- *outDivs += 2;
- }
- state = TICK_INSIDE_1;
- } else if (state == TICK_OUTSIDE_1) {
- *outError = "Can't have more than one marked region along edge";
- *outLeft = i;
- return UNKNOWN_ERROR;
- }
- } else if (*outError == NULL) {
- if (state == TICK_INSIDE_1) {
- // We're done with this div. Move on to the next.
- *outRight = i-1;
- outRight += 2;
- outLeft += 2;
- state = TICK_OUTSIDE_1;
- }
- } else {
- *outLeft = i;
- return UNKNOWN_ERROR;
- }
- }
-
- if (required && !found) {
- *outError = "No marked region found along edge";
- *outLeft = -1;
- return UNKNOWN_ERROR;
- }
-
- return NO_ERROR;
-}
-
-static status_t get_vertical_ticks(
- png_bytepp rows, int offset, int height, bool transparent, bool required,
- int32_t* outTop, int32_t* outBottom, const char** outError,
- uint8_t* outDivs, bool multipleAllowed)
-{
- int i;
- *outTop = *outBottom = -1;
- int state = TICK_START;
- bool found = false;
-
- for (i=1; i<height-1; i++) {
- if (TICK_TYPE_TICK == tick_type(rows[i]+offset, transparent, outError)) {
- if (state == TICK_START ||
- (state == TICK_OUTSIDE_1 && multipleAllowed)) {
- *outTop = i-1;
- *outBottom = height-2;
- found = true;
- if (outDivs != NULL) {
- *outDivs += 2;
- }
- state = TICK_INSIDE_1;
- } else if (state == TICK_OUTSIDE_1) {
- *outError = "Can't have more than one marked region along edge";
- *outTop = i;
- return UNKNOWN_ERROR;
- }
- } else if (*outError == NULL) {
- if (state == TICK_INSIDE_1) {
- // We're done with this div. Move on to the next.
- *outBottom = i-1;
- outTop += 2;
- outBottom += 2;
- state = TICK_OUTSIDE_1;
- }
- } else {
- *outTop = i;
- return UNKNOWN_ERROR;
- }
- }
-
- if (required && !found) {
- *outError = "No marked region found along edge";
- *outTop = -1;
- return UNKNOWN_ERROR;
- }
-
- return NO_ERROR;
-}
-
-static status_t get_horizontal_layout_bounds_ticks(
- png_bytep row, int width, bool transparent, bool required,
- int32_t* outLeft, int32_t* outRight, const char** outError)
-{
- int i;
- *outLeft = *outRight = 0;
-
- // Look for left tick
- if (TICK_TYPE_LAYOUT_BOUNDS == tick_type(row + 4, transparent, outError)) {
- // Starting with a layout padding tick
- i = 1;
- while (i < width - 1) {
- (*outLeft)++;
- i++;
- int tick = tick_type(row + i * 4, transparent, outError);
- if (tick != TICK_TYPE_LAYOUT_BOUNDS) {
- break;
- }
- }
- }
-
- // Look for right tick
- if (TICK_TYPE_LAYOUT_BOUNDS == tick_type(row + (width - 2) * 4, transparent, outError)) {
- // Ending with a layout padding tick
- i = width - 2;
- while (i > 1) {
- (*outRight)++;
- i--;
- int tick = tick_type(row+i*4, transparent, outError);
- if (tick != TICK_TYPE_LAYOUT_BOUNDS) {
- break;
- }
- }
- }
-
- return NO_ERROR;
-}
-
-static status_t get_vertical_layout_bounds_ticks(
- png_bytepp rows, int offset, int height, bool transparent, bool required,
- int32_t* outTop, int32_t* outBottom, const char** outError)
-{
- int i;
- *outTop = *outBottom = 0;
-
- // Look for top tick
- if (TICK_TYPE_LAYOUT_BOUNDS == tick_type(rows[1] + offset, transparent, outError)) {
- // Starting with a layout padding tick
- i = 1;
- while (i < height - 1) {
- (*outTop)++;
- i++;
- int tick = tick_type(rows[i] + offset, transparent, outError);
- if (tick != TICK_TYPE_LAYOUT_BOUNDS) {
- break;
- }
- }
- }
-
- // Look for bottom tick
- if (TICK_TYPE_LAYOUT_BOUNDS == tick_type(rows[height - 2] + offset, transparent, outError)) {
- // Ending with a layout padding tick
- i = height - 2;
- while (i > 1) {
- (*outBottom)++;
- i--;
- int tick = tick_type(rows[i] + offset, transparent, outError);
- if (tick != TICK_TYPE_LAYOUT_BOUNDS) {
- break;
- }
- }
- }
-
- return NO_ERROR;
-}
-
-
-static uint32_t get_color(
- png_bytepp rows, int left, int top, int right, int bottom)
-{
- png_bytep color = rows[top] + left*4;
-
- if (left > right || top > bottom) {
- return Res_png_9patch::TRANSPARENT_COLOR;
- }
-
- while (top <= bottom) {
- for (int i = left; i <= right; i++) {
- png_bytep p = rows[top]+i*4;
- if (color[3] == 0) {
- if (p[3] != 0) {
- return Res_png_9patch::NO_COLOR;
- }
- } else if (p[0] != color[0] || p[1] != color[1]
- || p[2] != color[2] || p[3] != color[3]) {
- return Res_png_9patch::NO_COLOR;
- }
- }
- top++;
- }
-
- if (color[3] == 0) {
- return Res_png_9patch::TRANSPARENT_COLOR;
- }
- return (color[3]<<24) | (color[0]<<16) | (color[1]<<8) | color[2];
-}
-
-static void select_patch(
- int which, int front, int back, int size, int* start, int* end)
-{
- switch (which) {
- case 0:
- *start = 0;
- *end = front-1;
- break;
- case 1:
- *start = front;
- *end = back-1;
- break;
- case 2:
- *start = back;
- *end = size-1;
- break;
- }
-}
-
-static uint32_t get_color(image_info* image, int hpatch, int vpatch)
-{
- int left, right, top, bottom;
- select_patch(
- hpatch, image->info9Patch.xDivs[0], image->info9Patch.xDivs[1],
- image->width, &left, &right);
- select_patch(
- vpatch, image->info9Patch.yDivs[0], image->info9Patch.yDivs[1],
- image->height, &top, &bottom);
- //printf("Selecting h=%d v=%d: (%d,%d)-(%d,%d)\n",
- // hpatch, vpatch, left, top, right, bottom);
- const uint32_t c = get_color(image->rows, left, top, right, bottom);
- NOISY(printf("Color in (%d,%d)-(%d,%d): #%08x\n", left, top, right, bottom, c));
- return c;
-}
-
-static status_t do_9patch(const char* imageName, image_info* image)
-{
- image->is9Patch = true;
-
- int W = image->width;
- int H = image->height;
- int i, j;
-
- int maxSizeXDivs = W * sizeof(int32_t);
- int maxSizeYDivs = H * sizeof(int32_t);
- int32_t* xDivs = image->info9Patch.xDivs = (int32_t*) malloc(maxSizeXDivs);
- int32_t* yDivs = image->info9Patch.yDivs = (int32_t*) malloc(maxSizeYDivs);
- uint8_t numXDivs = 0;
- uint8_t numYDivs = 0;
-
- int8_t numColors;
- int numRows;
- int numCols;
- int top;
- int left;
- int right;
- int bottom;
- memset(xDivs, -1, maxSizeXDivs);
- memset(yDivs, -1, maxSizeYDivs);
- image->info9Patch.paddingLeft = image->info9Patch.paddingRight =
- image->info9Patch.paddingTop = image->info9Patch.paddingBottom = -1;
-
- image->layoutBoundsLeft = image->layoutBoundsRight =
- image->layoutBoundsTop = image->layoutBoundsBottom = 0;
-
- png_bytep p = image->rows[0];
- bool transparent = p[3] == 0;
- bool hasColor = false;
-
- const char* errorMsg = NULL;
- int errorPixel = -1;
- const char* errorEdge = NULL;
-
- int colorIndex = 0;
-
- // Validate size...
- if (W < 3 || H < 3) {
- errorMsg = "Image must be at least 3x3 (1x1 without frame) pixels";
- goto getout;
- }
-
- // Validate frame...
- if (!transparent &&
- (p[0] != 0xFF || p[1] != 0xFF || p[2] != 0xFF || p[3] != 0xFF)) {
- errorMsg = "Must have one-pixel frame that is either transparent or white";
- goto getout;
- }
-
- // Find left and right of sizing areas...
- if (get_horizontal_ticks(p, W, transparent, true, &xDivs[0],
- &xDivs[1], &errorMsg, &numXDivs, true) != NO_ERROR) {
- errorPixel = xDivs[0];
- errorEdge = "top";
- goto getout;
- }
-
- // Find top and bottom of sizing areas...
- if (get_vertical_ticks(image->rows, 0, H, transparent, true, &yDivs[0],
- &yDivs[1], &errorMsg, &numYDivs, true) != NO_ERROR) {
- errorPixel = yDivs[0];
- errorEdge = "left";
- goto getout;
- }
-
- // Copy patch size data into image...
- image->info9Patch.numXDivs = numXDivs;
- image->info9Patch.numYDivs = numYDivs;
-
- // Find left and right of padding area...
- if (get_horizontal_ticks(image->rows[H-1], W, transparent, false, &image->info9Patch.paddingLeft,
- &image->info9Patch.paddingRight, &errorMsg, NULL, false) != NO_ERROR) {
- errorPixel = image->info9Patch.paddingLeft;
- errorEdge = "bottom";
- goto getout;
- }
-
- // Find top and bottom of padding area...
- if (get_vertical_ticks(image->rows, (W-1)*4, H, transparent, false, &image->info9Patch.paddingTop,
- &image->info9Patch.paddingBottom, &errorMsg, NULL, false) != NO_ERROR) {
- errorPixel = image->info9Patch.paddingTop;
- errorEdge = "right";
- goto getout;
- }
-
- // Find left and right of layout padding...
- get_horizontal_layout_bounds_ticks(image->rows[H-1], W, transparent, false,
- &image->layoutBoundsLeft,
- &image->layoutBoundsRight, &errorMsg);
-
- get_vertical_layout_bounds_ticks(image->rows, (W-1)*4, H, transparent, false,
- &image->layoutBoundsTop,
- &image->layoutBoundsBottom, &errorMsg);
-
- image->haveLayoutBounds = image->layoutBoundsLeft != 0
- || image->layoutBoundsRight != 0
- || image->layoutBoundsTop != 0
- || image->layoutBoundsBottom != 0;
-
- if (image->haveLayoutBounds) {
- NOISY(printf("layoutBounds=%d %d %d %d\n", image->layoutBoundsLeft, image->layoutBoundsTop,
- image->layoutBoundsRight, image->layoutBoundsBottom));
- }
-
- // If padding is not yet specified, take values from size.
- if (image->info9Patch.paddingLeft < 0) {
- image->info9Patch.paddingLeft = xDivs[0];
- image->info9Patch.paddingRight = W - 2 - xDivs[1];
- } else {
- // Adjust value to be correct!
- image->info9Patch.paddingRight = W - 2 - image->info9Patch.paddingRight;
- }
- if (image->info9Patch.paddingTop < 0) {
- image->info9Patch.paddingTop = yDivs[0];
- image->info9Patch.paddingBottom = H - 2 - yDivs[1];
- } else {
- // Adjust value to be correct!
- image->info9Patch.paddingBottom = H - 2 - image->info9Patch.paddingBottom;
- }
-
- NOISY(printf("Size ticks for %s: x0=%d, x1=%d, y0=%d, y1=%d\n", imageName,
- image->info9Patch.xDivs[0], image->info9Patch.xDivs[1],
- image->info9Patch.yDivs[0], image->info9Patch.yDivs[1]));
- NOISY(printf("padding ticks for %s: l=%d, r=%d, t=%d, b=%d\n", imageName,
- image->info9Patch.paddingLeft, image->info9Patch.paddingRight,
- image->info9Patch.paddingTop, image->info9Patch.paddingBottom));
-
- // Remove frame from image.
- image->rows = (png_bytepp)malloc((H-2) * sizeof(png_bytep));
- for (i=0; i<(H-2); i++) {
- image->rows[i] = image->allocRows[i+1];
- memmove(image->rows[i], image->rows[i]+4, (W-2)*4);
- }
- image->width -= 2;
- W = image->width;
- image->height -= 2;
- H = image->height;
-
- // Figure out the number of rows and columns in the N-patch
- numCols = numXDivs + 1;
- if (xDivs[0] == 0) { // Column 1 is strechable
- numCols--;
- }
- if (xDivs[numXDivs - 1] == W) {
- numCols--;
- }
- numRows = numYDivs + 1;
- if (yDivs[0] == 0) { // Row 1 is strechable
- numRows--;
- }
- if (yDivs[numYDivs - 1] == H) {
- numRows--;
- }
-
- // Make sure the amount of rows and columns will fit in the number of
- // colors we can use in the 9-patch format.
- if (numRows * numCols > 0x7F) {
- errorMsg = "Too many rows and columns in 9-patch perimeter";
- goto getout;
- }
-
- numColors = numRows * numCols;
- image->info9Patch.numColors = numColors;
- image->info9Patch.colors = (uint32_t*)malloc(numColors * sizeof(uint32_t));
-
- // Fill in color information for each patch.
-
- uint32_t c;
- top = 0;
-
- // The first row always starts with the top being at y=0 and the bottom
- // being either yDivs[1] (if yDivs[0]=0) of yDivs[0]. In the former case
- // the first row is stretchable along the Y axis, otherwise it is fixed.
- // The last row always ends with the bottom being bitmap.height and the top
- // being either yDivs[numYDivs-2] (if yDivs[numYDivs-1]=bitmap.height) or
- // yDivs[numYDivs-1]. In the former case the last row is stretchable along
- // the Y axis, otherwise it is fixed.
- //
- // The first and last columns are similarly treated with respect to the X
- // axis.
- //
- // The above is to help explain some of the special casing that goes on the
- // code below.
-
- // The initial yDiv and whether the first row is considered stretchable or
- // not depends on whether yDiv[0] was zero or not.
- for (j = (yDivs[0] == 0 ? 1 : 0);
- j <= numYDivs && top < H;
- j++) {
- if (j == numYDivs) {
- bottom = H;
- } else {
- bottom = yDivs[j];
- }
- left = 0;
- // The initial xDiv and whether the first column is considered
- // stretchable or not depends on whether xDiv[0] was zero or not.
- for (i = xDivs[0] == 0 ? 1 : 0;
- i <= numXDivs && left < W;
- i++) {
- if (i == numXDivs) {
- right = W;
- } else {
- right = xDivs[i];
- }
- c = get_color(image->rows, left, top, right - 1, bottom - 1);
- image->info9Patch.colors[colorIndex++] = c;
- NOISY(if (c != Res_png_9patch::NO_COLOR) hasColor = true);
- left = right;
- }
- top = bottom;
- }
-
- assert(colorIndex == numColors);
-
- for (i=0; i<numColors; i++) {
- if (hasColor) {
- if (i == 0) printf("Colors in %s:\n ", imageName);
- printf(" #%08x", image->info9Patch.colors[i]);
- if (i == numColors - 1) printf("\n");
- }
- }
-
- image->is9Patch = true;
- image->info9Patch.deviceToFile();
-
-getout:
- if (errorMsg) {
- fprintf(stderr,
- "ERROR: 9-patch image %s malformed.\n"
- " %s.\n", imageName, errorMsg);
- if (errorEdge != NULL) {
- if (errorPixel >= 0) {
- fprintf(stderr,
- " Found at pixel #%d along %s edge.\n", errorPixel, errorEdge);
- } else {
- fprintf(stderr,
- " Found along %s edge.\n", errorEdge);
- }
- }
- return UNKNOWN_ERROR;
- }
- return NO_ERROR;
-}
-
-static void checkNinePatchSerialization(Res_png_9patch* inPatch, void * data)
-{
- if (sizeof(void*) != sizeof(int32_t)) {
- // can't deserialize on a non-32 bit system
- return;
- }
- size_t patchSize = inPatch->serializedSize();
- void * newData = malloc(patchSize);
- memcpy(newData, data, patchSize);
- Res_png_9patch* outPatch = inPatch->deserialize(newData);
- // deserialization is done in place, so outPatch == newData
- assert(outPatch == newData);
- assert(outPatch->numXDivs == inPatch->numXDivs);
- assert(outPatch->numYDivs == inPatch->numYDivs);
- assert(outPatch->paddingLeft == inPatch->paddingLeft);
- assert(outPatch->paddingRight == inPatch->paddingRight);
- assert(outPatch->paddingTop == inPatch->paddingTop);
- assert(outPatch->paddingBottom == inPatch->paddingBottom);
- for (int i = 0; i < outPatch->numXDivs; i++) {
- assert(outPatch->xDivs[i] == inPatch->xDivs[i]);
- }
- for (int i = 0; i < outPatch->numYDivs; i++) {
- assert(outPatch->yDivs[i] == inPatch->yDivs[i]);
- }
- for (int i = 0; i < outPatch->numColors; i++) {
- assert(outPatch->colors[i] == inPatch->colors[i]);
- }
- free(newData);
-}
-
-static bool patch_equals(Res_png_9patch& patch1, Res_png_9patch& patch2) {
- if (!(patch1.numXDivs == patch2.numXDivs &&
- patch1.numYDivs == patch2.numYDivs &&
- patch1.numColors == patch2.numColors &&
- patch1.paddingLeft == patch2.paddingLeft &&
- patch1.paddingRight == patch2.paddingRight &&
- patch1.paddingTop == patch2.paddingTop &&
- patch1.paddingBottom == patch2.paddingBottom)) {
- return false;
- }
- for (int i = 0; i < patch1.numColors; i++) {
- if (patch1.colors[i] != patch2.colors[i]) {
- return false;
- }
- }
- for (int i = 0; i < patch1.numXDivs; i++) {
- if (patch1.xDivs[i] != patch2.xDivs[i]) {
- return false;
- }
- }
- for (int i = 0; i < patch1.numYDivs; i++) {
- if (patch1.yDivs[i] != patch2.yDivs[i]) {
- return false;
- }
- }
- return true;
-}
-
-static void dump_image(int w, int h, png_bytepp rows, int color_type)
-{
- int i, j, rr, gg, bb, aa;
-
- 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 || color_type == PNG_COLOR_TYPE_RGB_ALPHA) {
- // We use a padding byte even when there is no alpha
- bpp = 4;
- } else {
- printf("Unknown color type %d.\n", color_type);
- }
-
- 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(const char *imageName, 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;
- 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;
- bool isGrayscale = true;
-
- // Scan the entire image and determine if:
- // 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, PNG_COLOR_TYPE_RGB_ALPHA);
-
- for (j = 0; j < h; j++) {
- png_bytep row = imageInfo.rows[j];
- png_bytep out = outRows[j];
- for (i = 0; i < w; i++) {
- rr = *row++;
- gg = *row++;
- bb = *row++;
- aa = *row++;
-
- 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) {
- 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) {
- 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
- if (isPalette) {
- col = (uint32_t) ((rr << 24) | (gg << 16) | (bb << 8) | aa);
- bool match = false;
- for (idx = 0; idx < num_colors; idx++) {
- if (colors[idx] == col) {
- match = true;
- break;
- }
- }
-
- // Write the palette index for the pixel to outRows optimistically
- // We might overwrite it later if we decide to encode as gray or
- // gray + alpha
- *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;
- }
- }
- }
- }
- }
-
- *paletteEntries = 0;
- *hasTransparency = !isOpaque;
- 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
- // is sufficiently small, otherwise use COLOR_TYPE_GRAY_ALPHA
- // 3. RGB(A) - use COLOR_TYPE_PALETTE if the number of distinct colors is sufficiently
- // small, otherwise use COLOR_TYPE_RGB{_ALPHA}
- if (isGrayscale) {
- if (isOpaque) {
- *colorType = PNG_COLOR_TYPE_GRAY; // 1 byte/pixel
- } else {
- // Use a simple heuristic to determine whether using a palette will
- // save space versus using gray + alpha for each pixel.
- // This doesn't take into account chunk overhead, filtering, LZ
- // compression, etc.
- if (isPalette && (paletteSize < 2 * w * h)) {
- *colorType = PNG_COLOR_TYPE_PALETTE; // 1 byte/pixel + 4 bytes/color
- } else {
- *colorType = PNG_COLOR_TYPE_GRAY_ALPHA; // 2 bytes per pixel
- }
- }
- } else if (isPalette && (paletteSize < bpp * w * h)) {
- *colorType = PNG_COLOR_TYPE_PALETTE;
- } else {
- if (maxGrayDeviation <= grayscaleTolerance) {
- printf("%s: forcing image to gray (max deviation = %d)\n", imageName, 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
- // color type chosen
-
- if (*colorType == PNG_COLOR_TYPE_PALETTE) {
- // Create separate RGB and Alpha palettes and set the number of colors
- *paletteEntries = num_colors;
-
- // Create the RGB and alpha palettes
- for (int idx = 0; idx < num_colors; idx++) {
- col = colors[idx];
- rgbPalette[idx].red = (png_byte) ((col >> 24) & 0xff);
- rgbPalette[idx].green = (png_byte) ((col >> 16) & 0xff);
- rgbPalette[idx].blue = (png_byte) ((col >> 8) & 0xff);
- alphaPalette[idx] = (png_byte) (col & 0xff);
- }
- } else if (*colorType == PNG_COLOR_TYPE_GRAY || *colorType == PNG_COLOR_TYPE_GRAY_ALPHA) {
- // If the image is gray or gray + alpha, compact the pixels into outRows
- for (j = 0; j < h; j++) {
- png_bytep row = imageInfo.rows[j];
- png_bytep out = outRows[j];
- for (i = 0; i < w; i++) {
- rr = *row++;
- gg = *row++;
- bb = *row++;
- aa = *row++;
-
- if (isGrayscale) {
- *out++ = rr;
- } else {
- *out++ = (png_byte) (rr * 0.2126f + gg * 0.7152f + bb * 0.0722f);
- }
- if (!isOpaque) {
- *out++ = aa;
- }
- }
- }
- }
-}
-
-
-static void write_png(const char* imageName,
- png_structp write_ptr, png_infop write_info,
- image_info& imageInfo, int grayscaleTolerance)
-{
- bool optimize = true;
- png_uint_32 width, height;
- int color_type;
- int bit_depth, interlace_type, compression_type;
- int i;
-
- png_unknown_chunk unknowns[2];
- unknowns[0].data = NULL;
- unknowns[1].data = NULL;
-
- png_bytepp outRows = (png_bytepp) malloc((int) imageInfo.height * sizeof(png_bytep));
- if (outRows == (png_bytepp) 0) {
- printf("Can't allocate output buffer!\n");
- exit(1);
- }
- for (i = 0; i < (int) imageInfo.height; i++) {
- outRows[i] = (png_bytep) malloc(2 * (int) imageInfo.width);
- if (outRows[i] == (png_bytep) 0) {
- printf("Can't allocate output buffer!\n");
- exit(1);
- }
- }
-
- png_set_compression_level(write_ptr, Z_BEST_COMPRESSION);
-
- 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;
-
- analyze_image(imageName, imageInfo, grayscaleTolerance, rgbPalette, alphaPalette,
- &paletteEntries, &hasTransparency, &color_type, outRows);
-
- // If the image is a 9-patch, we need to preserve it as a ARGB file to make
- // sure the pixels will not be pre-dithered/clamped until we decide they are
- if (imageInfo.is9Patch && (color_type == PNG_COLOR_TYPE_RGB ||
- color_type == PNG_COLOR_TYPE_GRAY || color_type == PNG_COLOR_TYPE_PALETTE)) {
- color_type = PNG_COLOR_TYPE_RGB_ALPHA;
- }
-
- 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,
- 8, color_type, PNG_INTERLACE_NONE,
- PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
-
- if (color_type == PNG_COLOR_TYPE_PALETTE) {
- png_set_PLTE(write_ptr, write_info, rgbPalette, paletteEntries);
- if (hasTransparency) {
- png_set_tRNS(write_ptr, write_info, alphaPalette, paletteEntries, (png_color_16p) 0);
- }
- png_set_filter(write_ptr, 0, PNG_NO_FILTERS);
- } else {
- png_set_filter(write_ptr, 0, PNG_ALL_FILTERS);
- }
-
- if (imageInfo.is9Patch) {
- int chunk_count = 1 + (imageInfo.haveLayoutBounds ? 1 : 0);
- int p_index = imageInfo.haveLayoutBounds ? 1 : 0;
- int b_index = 0;
- png_byte *chunk_names = imageInfo.haveLayoutBounds
- ? (png_byte*)"npLb\0npTc\0"
- : (png_byte*)"npTc";
- NOISY(printf("Adding 9-patch info...\n"));
- strcpy((char*)unknowns[p_index].name, "npTc");
- unknowns[p_index].data = (png_byte*)imageInfo.info9Patch.serialize();
- unknowns[p_index].size = imageInfo.info9Patch.serializedSize();
- // TODO: remove the check below when everything works
- checkNinePatchSerialization(&imageInfo.info9Patch, unknowns[p_index].data);
-
- if (imageInfo.haveLayoutBounds) {
- int chunk_size = sizeof(png_uint_32) * 4;
- strcpy((char*)unknowns[b_index].name, "npLb");
- unknowns[b_index].data = (png_byte*) calloc(chunk_size, 1);
- memcpy(unknowns[b_index].data, &imageInfo.layoutBoundsLeft, chunk_size);
- unknowns[b_index].size = chunk_size;
- }
-
- for (int i = 0; i < chunk_count; i++) {
- unknowns[i].location = PNG_HAVE_PLTE;
- }
- png_set_keep_unknown_chunks(write_ptr, PNG_HANDLE_CHUNK_ALWAYS,
- chunk_names, chunk_count);
- png_set_unknown_chunks(write_ptr, write_info, unknowns, chunk_count);
-#if PNG_LIBPNG_VER < 10600
- /* Deal with unknown chunk location bug in 1.5.x and earlier */
- png_set_unknown_chunk_location(write_ptr, write_info, 0, PNG_HAVE_PLTE);
- if (imageInfo.haveLayoutBounds) {
- png_set_unknown_chunk_location(write_ptr, write_info, 1, PNG_HAVE_PLTE);
- }
-#endif
- }
-
-
- png_write_info(write_ptr, write_info);
-
- png_bytepp rows;
- if (color_type == PNG_COLOR_TYPE_RGB || color_type == PNG_COLOR_TYPE_RGB_ALPHA) {
- if (color_type == PNG_COLOR_TYPE_RGB) {
- png_set_filler(write_ptr, 0, PNG_FILLER_AFTER);
- }
- rows = imageInfo.rows;
- } else {
- rows = outRows;
- }
- png_write_image(write_ptr, rows);
-
-// NOISY(printf("Final image data:\n"));
-// dump_image(imageInfo.width, imageInfo.height, rows, color_type);
-
- png_write_end(write_ptr, write_info);
-
- for (i = 0; i < (int) imageInfo.height; i++) {
- free(outRows[i]);
- }
- free(outRows);
- free(unknowns[0].data);
- free(unknowns[1].data);
-
- png_get_IHDR(write_ptr, write_info, &width, &height,
- &bit_depth, &color_type, &interlace_type,
- &compression_type, NULL);
-
- NOISY(printf("Image written: w=%d, h=%d, d=%d, colors=%d, inter=%d, comp=%d\n",
- (int)width, (int)height, bit_depth, color_type, interlace_type,
- compression_type));
-}
-
-status_t preProcessImage(const Bundle* bundle, const sp<AaptAssets>& assets,
- const sp<AaptFile>& file, String8* outNewLeafName)
-{
- String8 ext(file->getPath().getPathExtension());
-
- // We currently only process PNG images.
- if (strcmp(ext.string(), ".png") != 0) {
- return NO_ERROR;
- }
-
- // Example of renaming a file:
- //*outNewLeafName = file->getPath().getBasePath().getFileName();
- //outNewLeafName->append(".nupng");
-
- String8 printableName(file->getPrintableSource());
-
- if (bundle->getVerbose()) {
- printf("Processing image: %s\n", printableName.string());
- }
-
- png_structp read_ptr = NULL;
- png_infop read_info = NULL;
- FILE* fp;
-
- image_info imageInfo;
-
- png_structp write_ptr = NULL;
- png_infop write_info = NULL;
-
- status_t error = UNKNOWN_ERROR;
-
- const size_t nameLen = file->getPath().length();
-
- fp = fopen(file->getSourceFile().string(), "rb");
- if (fp == NULL) {
- fprintf(stderr, "%s: ERROR: Unable to open PNG file\n", printableName.string());
- goto bail;
- }
-
- read_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, 0, (png_error_ptr)NULL,
- (png_error_ptr)NULL);
- if (!read_ptr) {
- goto bail;
- }
-
- read_info = png_create_info_struct(read_ptr);
- if (!read_info) {
- goto bail;
- }
-
- if (setjmp(png_jmpbuf(read_ptr))) {
- goto bail;
- }
-
- png_init_io(read_ptr, fp);
-
- read_png(printableName.string(), read_ptr, read_info, &imageInfo);
-
- if (nameLen > 6) {
- const char* name = file->getPath().string();
- if (name[nameLen-5] == '9' && name[nameLen-6] == '.') {
- if (do_9patch(printableName.string(), &imageInfo) != NO_ERROR) {
- goto bail;
- }
- }
- }
-
- write_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, 0, (png_error_ptr)NULL,
- (png_error_ptr)NULL);
- if (!write_ptr)
- {
- goto bail;
- }
-
- write_info = png_create_info_struct(write_ptr);
- if (!write_info)
- {
- goto bail;
- }
-
- png_set_write_fn(write_ptr, (void*)file.get(),
- png_write_aapt_file, png_flush_aapt_file);
-
- if (setjmp(png_jmpbuf(write_ptr)))
- {
- goto bail;
- }
-
- write_png(printableName.string(), write_ptr, write_info, imageInfo,
- bundle->getGrayscaleTolerance());
-
- error = NO_ERROR;
-
- if (bundle->getVerbose()) {
- fseek(fp, 0, SEEK_END);
- size_t oldSize = (size_t)ftell(fp);
- size_t newSize = file->getSize();
- float factor = ((float)newSize)/oldSize;
- int percent = (int)(factor*100);
- printf(" (processed image %s: %d%% size of source)\n", printableName.string(), percent);
- }
-
-bail:
- if (read_ptr) {
- png_destroy_read_struct(&read_ptr, &read_info, (png_infopp)NULL);
- }
- if (fp) {
- fclose(fp);
- }
- if (write_ptr) {
- png_destroy_write_struct(&write_ptr, &write_info);
- }
-
- if (error != NO_ERROR) {
- fprintf(stderr, "ERROR: Failure processing PNG image %s\n",
- file->getPrintableSource().string());
- }
- return error;
-}
-
-status_t preProcessImageToCache(const Bundle* bundle, const String8& source, const String8& dest)
-{
- png_structp read_ptr = NULL;
- png_infop read_info = NULL;
-
- FILE* fp;
-
- image_info imageInfo;
-
- png_structp write_ptr = NULL;
- png_infop write_info = NULL;
-
- status_t error = UNKNOWN_ERROR;
-
- if (bundle->getVerbose()) {
- printf("Processing image to cache: %s => %s\n", source.string(), dest.string());
- }
-
- // Get a file handler to read from
- fp = fopen(source.string(),"rb");
- if (fp == NULL) {
- fprintf(stderr, "%s ERROR: Unable to open PNG file\n", source.string());
- return error;
- }
-
- // Call libpng to get a struct to read image data into
- read_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
- if (!read_ptr) {
- fclose(fp);
- png_destroy_read_struct(&read_ptr, &read_info,NULL);
- return error;
- }
-
- // Call libpng to get a struct to read image info into
- read_info = png_create_info_struct(read_ptr);
- if (!read_info) {
- fclose(fp);
- png_destroy_read_struct(&read_ptr, &read_info,NULL);
- return error;
- }
-
- // Set a jump point for libpng to long jump back to on error
- if (setjmp(png_jmpbuf(read_ptr))) {
- fclose(fp);
- png_destroy_read_struct(&read_ptr, &read_info,NULL);
- return error;
- }
-
- // Set up libpng to read from our file.
- png_init_io(read_ptr,fp);
-
- // Actually read data from the file
- read_png(source.string(), read_ptr, read_info, &imageInfo);
-
- // We're done reading so we can clean up
- // Find old file size before releasing handle
- fseek(fp, 0, SEEK_END);
- size_t oldSize = (size_t)ftell(fp);
- fclose(fp);
- png_destroy_read_struct(&read_ptr, &read_info,NULL);
-
- // Check to see if we're dealing with a 9-patch
- // If we are, process appropriately
- if (source.getBasePath().getPathExtension() == ".9") {
- if (do_9patch(source.string(), &imageInfo) != NO_ERROR) {
- return error;
- }
- }
-
- // Call libpng to create a structure to hold the processed image data
- // that can be written to disk
- write_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
- if (!write_ptr) {
- png_destroy_write_struct(&write_ptr, &write_info);
- return error;
- }
-
- // Call libpng to create a structure to hold processed image info that can
- // be written to disk
- write_info = png_create_info_struct(write_ptr);
- if (!write_info) {
- png_destroy_write_struct(&write_ptr, &write_info);
- return error;
- }
-
- // Open up our destination file for writing
- fp = fopen(dest.string(), "wb");
- if (!fp) {
- fprintf(stderr, "%s ERROR: Unable to open PNG file\n", dest.string());
- png_destroy_write_struct(&write_ptr, &write_info);
- return error;
- }
-
- // Set up libpng to write to our file
- png_init_io(write_ptr, fp);
-
- // Set up a jump for libpng to long jump back on on errors
- if (setjmp(png_jmpbuf(write_ptr))) {
- fclose(fp);
- png_destroy_write_struct(&write_ptr, &write_info);
- return error;
- }
-
- // Actually write out to the new png
- write_png(dest.string(), write_ptr, write_info, imageInfo,
- bundle->getGrayscaleTolerance());
-
- if (bundle->getVerbose()) {
- // Find the size of our new file
- FILE* reader = fopen(dest.string(), "rb");
- fseek(reader, 0, SEEK_END);
- size_t newSize = (size_t)ftell(reader);
- fclose(reader);
-
- float factor = ((float)newSize)/oldSize;
- int percent = (int)(factor*100);
- printf(" (processed image to cache entry %s: %d%% size of source)\n",
- dest.string(), percent);
- }
-
- //Clean up
- fclose(fp);
- png_destroy_write_struct(&write_ptr, &write_info);
-
- return NO_ERROR;
-}
-
-status_t postProcessImage(const sp<AaptAssets>& assets,
- ResourceTable* table, const sp<AaptFile>& file)
-{
- String8 ext(file->getPath().getPathExtension());
-
- // At this point, now that we have all the resource data, all we need to
- // do is compile XML files.
- if (strcmp(ext.string(), ".xml") == 0) {
- return compileXmlFile(assets, file, table);
- }
-
- return NO_ERROR;
-}
diff --git a/tools/aapt/Images.h b/tools/aapt/Images.h
deleted file mode 100644
index 91b6554..0000000
--- a/tools/aapt/Images.h
+++ /dev/null
@@ -1,26 +0,0 @@
-//
-// Copyright 2006 The Android Open Source Project
-//
-// Build resource files from raw assets.
-//
-
-#ifndef IMAGES_H
-#define IMAGES_H
-
-#include "ResourceTable.h"
-#include "Bundle.h"
-
-#include <utils/String8.h>
-#include <utils/RefBase.h>
-
-using android::String8;
-
-status_t preProcessImage(const Bundle* bundle, const sp<AaptAssets>& assets,
- const sp<AaptFile>& file, String8* outNewLeafName);
-
-status_t preProcessImageToCache(const Bundle* bundle, const String8& source, const String8& dest);
-
-status_t postProcessImage(const sp<AaptAssets>& assets,
- ResourceTable* table, const sp<AaptFile>& file);
-
-#endif
diff --git a/tools/aapt/Main.cpp b/tools/aapt/Main.cpp
deleted file mode 100644
index 977226b..0000000
--- a/tools/aapt/Main.cpp
+++ /dev/null
@@ -1,651 +0,0 @@
-//
-// Copyright 2006 The Android Open Source Project
-//
-// Android Asset Packaging Tool main entry point.
-//
-#include "Main.h"
-#include "Bundle.h"
-
-#include <utils/Log.h>
-#include <utils/threads.h>
-#include <utils/List.h>
-#include <utils/Errors.h>
-
-#include <stdlib.h>
-#include <getopt.h>
-#include <assert.h>
-
-using namespace android;
-
-static const char* gProgName = "aapt";
-
-/*
- * When running under Cygwin on Windows, this will convert slash-based
- * paths into back-slash-based ones. Otherwise the ApptAssets file comparisons
- * fail later as they use back-slash separators under Windows.
- *
- * This operates in-place on the path string.
- */
-void convertPath(char *path) {
- if (path != NULL && OS_PATH_SEPARATOR != '/') {
- for (; *path; path++) {
- if (*path == '/') {
- *path = OS_PATH_SEPARATOR;
- }
- }
- }
-}
-
-/*
- * Print usage info.
- */
-void usage(void)
-{
- fprintf(stderr, "Android Asset Packaging Tool\n\n");
- fprintf(stderr, "Usage:\n");
- fprintf(stderr,
- " %s l[ist] [-v] [-a] file.{zip,jar,apk}\n"
- " List contents of Zip-compatible archive.\n\n", gProgName);
- fprintf(stderr,
- " %s d[ump] [--values] WHAT file.{apk} [asset [asset ...]]\n"
- " strings Print the contents of the resource table string pool in the APK.\n"
- " badging Print the label and icon for the app declared in APK.\n"
- " permissions Print the permissions from the APK.\n"
- " resources Print the resource table from the APK.\n"
- " configurations Print the configurations in the APK.\n"
- " 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] [-d][-f][-m][-u][-v][-x][-z][-M AndroidManifest.xml] \\\n"
- " [-0 extension [-0 extension ...]] [-g tolerance] [-j jarfile] \\\n"
- " [--debug-mode] [--min-sdk-version VAL] [--target-sdk-version VAL] \\\n"
- " [--app-version VAL] [--app-version-name TEXT] [--custom-package VAL] \\\n"
- " [--rename-manifest-package PACKAGE] \\\n"
- " [--rename-instrumentation-target-package PACKAGE] \\\n"
- " [--utf16] [--auto-add-overlay] \\\n"
- " [--max-res-version VAL] \\\n"
- " [-I base-package [-I base-package ...]] \\\n"
- " [-A asset-source-dir] [-G class-list-file] [-P public-definitions-file] \\\n"
- " [-S resource-sources [-S resource-sources ...]] \\\n"
- " [-F apk-file] [-J R-file-dir] \\\n"
- " [--product product1,product2,...] \\\n"
- " [-c CONFIGS] [--preferred-configurations CONFIGS] \\\n"
- " [raw-files-dir [raw-files-dir] ...] \\\n"
- " [--output-text-symbols DIR]\n"
- "\n"
- " Package the android resources. It will read assets and resources that are\n"
- " supplied with the -M -A -S or raw-files-dir arguments. The -J -P -F and -R\n"
- " options control which files are output.\n\n"
- , gProgName);
- fprintf(stderr,
- " %s r[emove] [-v] file.{zip,jar,apk} file1 [file2 ...]\n"
- " Delete specified files from Zip-compatible archive.\n\n",
- gProgName);
- fprintf(stderr,
- " %s a[dd] [-v] file.{zip,jar,apk} file1 [file2 ...]\n"
- " Add specified files to Zip-compatible archive.\n\n", gProgName);
- fprintf(stderr,
- " %s c[runch] [-v] -S resource-sources ... -C output-folder ...\n"
- " Do PNG preprocessing on one or several resource folders\n"
- " and store the results in the output folder.\n\n", gProgName);
- fprintf(stderr,
- " %s s[ingleCrunch] [-v] -i input-file -o outputfile\n"
- " Do PNG preprocessing on a single file.\n\n", gProgName);
- fprintf(stderr,
- " %s v[ersion]\n"
- " Print program version.\n\n", gProgName);
- fprintf(stderr,
- " Modifiers:\n"
- " -a print Android-specific data (resources, manifest) when listing\n"
- " -c specify which configurations to include. The default is all\n"
- " configurations. The value of the parameter should be a comma\n"
- " separated list of configuration values. Locales should be specified\n"
- " as either a language or language-region pair. Some examples:\n"
- " en\n"
- " port,en\n"
- " port,land,en_US\n"
- " If you put the special locale, zz_ZZ on the list, it will perform\n"
- " pseudolocalization on the default locale, modifying all of the\n"
- " strings so you can look for strings that missed the\n"
- " internationalization process. For example:\n"
- " 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"
- " -k junk path of file(s) added\n"
- " -m make package directories under location specified by -J\n"
-#if 0
- " -p pseudolocalize the default configuration\n"
-#endif
- " -u update existing packages (add new, replace older, remove deleted files)\n"
- " -v verbose output\n"
- " -x create extending (non-application) resource IDs\n"
- " -z require localization of resource attributes marked with\n"
- " localization=\"suggested\"\n"
- " -A additional directory in which to find raw asset files\n"
- " -G A file to output proguard options into.\n"
- " -F specify the apk file to output\n"
- " -I add an existing package to base include set\n"
- " -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. Multiple directories will be scanned\n"
- " and the first match found (left to right) will take precedence.\n"
- " -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"
- " --debug-mode\n"
- " inserts android:debuggable=\"true\" in to the application node of the\n"
- " manifest, making the application debuggable even on production devices.\n"
- " --min-sdk-version\n"
- " inserts android:minSdkVersion in to manifest. If the version is 7 or\n"
- " higher, the default encoding for resources will be in UTF-8.\n"
- " --target-sdk-version\n"
- " inserts android:targetSdkVersion in to manifest.\n"
- " --max-res-version\n"
- " ignores versioned resource directories above the given value.\n"
- " --values\n"
- " when used with \"dump resources\" also includes resource values.\n"
- " --version-code\n"
- " inserts android:versionCode in to manifest.\n"
- " --version-name\n"
- " inserts android:versionName in to manifest.\n"
- " --custom-package\n"
- " generates R.java into a different package.\n"
- " --extra-packages\n"
- " generate R.java for libraries. Separate libraries with ':'.\n"
- " --generate-dependencies\n"
- " generate dependency files in the same directories for R.java and resource package\n"
- " --auto-add-overlay\n"
- " Automatically add resources that are only in overlays.\n"
- " --preferred-configurations\n"
- " Like the -c option for filtering out unneeded configurations, but\n"
- " only expresses a preference. If there is no resource available with\n"
- " the preferred configuration then it will not be stripped.\n"
- " --rename-manifest-package\n"
- " Rewrite the manifest so that its package name is the package name\n"
- " given here. Relative class names (for example .Foo) will be\n"
- " changed to absolute names with the old package so that the code\n"
- " does not need to change.\n"
- " --rename-instrumentation-target-package\n"
- " Rewrite the manifest so that all of its instrumentation\n"
- " components target the given package. Useful when used in\n"
- " conjunction with --rename-manifest-package to fix tests against\n"
- " a package that has been renamed.\n"
- " --product\n"
- " Specifies which variant to choose for strings that have\n"
- " product variants\n"
- " --utf16\n"
- " changes default encoding for resources to UTF-16. Only useful when API\n"
- " level is set to 7 or higher where the default encoding is UTF-8.\n"
- " --non-constant-id\n"
- " Make the resources ID non constant. This is required to make an R java class\n"
- " that does not contain the final value but is used to make reusable compiled\n"
- " libraries that need to access resources.\n"
- " --error-on-failed-insert\n"
- " Forces aapt to return an error if it fails to insert values into the manifest\n"
- " with --debug-mode, --min-sdk-version, --target-sdk-version --version-code\n"
- " and --version-name.\n"
- " Insertion typically fails if the manifest already defines the attribute.\n"
- " --output-text-symbols\n"
- " Generates a text file containing the resource symbols of the R class in the\n"
- " specified folder.\n"
- " --ignore-assets\n"
- " Assets to be ignored. Default pattern is:\n"
- " %s\n",
- gDefaultIgnoreAssets);
-}
-
-/*
- * Dispatch the command.
- */
-int handleCommand(Bundle* bundle)
-{
- //printf("--- command %d (verbose=%d force=%d):\n",
- // bundle->getCommand(), bundle->getVerbose(), bundle->getForce());
- //for (int i = 0; i < bundle->getFileSpecCount(); i++)
- // printf(" %d: '%s'\n", i, bundle->getFileSpecEntry(i));
-
- switch (bundle->getCommand()) {
- case kCommandVersion: return doVersion(bundle);
- case kCommandList: return doList(bundle);
- case kCommandDump: return doDump(bundle);
- case kCommandAdd: return doAdd(bundle);
- case kCommandRemove: return doRemove(bundle);
- case kCommandPackage: return doPackage(bundle);
- case kCommandCrunch: return doCrunch(bundle);
- case kCommandSingleCrunch: return doSingleCrunch(bundle);
- default:
- fprintf(stderr, "%s: requested command not yet supported\n", gProgName);
- return 1;
- }
-}
-
-/*
- * Parse args.
- */
-int main(int argc, char* const argv[])
-{
- char *prog = argv[0];
- Bundle bundle;
- bool wantUsage = false;
- int result = 1; // pessimistically assume an error.
- int tolerance = 0;
-
- /* default to compression */
- bundle.setCompressionMethod(ZipEntry::kCompressDeflated);
-
- if (argc < 2) {
- wantUsage = true;
- goto bail;
- }
-
- if (argv[1][0] == 'v')
- bundle.setCommand(kCommandVersion);
- else if (argv[1][0] == 'd')
- bundle.setCommand(kCommandDump);
- else if (argv[1][0] == 'l')
- bundle.setCommand(kCommandList);
- else if (argv[1][0] == 'a')
- bundle.setCommand(kCommandAdd);
- else if (argv[1][0] == 'r')
- bundle.setCommand(kCommandRemove);
- else if (argv[1][0] == 'p')
- bundle.setCommand(kCommandPackage);
- else if (argv[1][0] == 'c')
- bundle.setCommand(kCommandCrunch);
- else if (argv[1][0] == 's')
- bundle.setCommand(kCommandSingleCrunch);
- else {
- fprintf(stderr, "ERROR: Unknown command '%s'\n", argv[1]);
- wantUsage = true;
- goto bail;
- }
- argc -= 2;
- argv += 2;
-
- /*
- * Pull out flags. We support "-fv" and "-f -v".
- */
- while (argc && argv[0][0] == '-') {
- /* flag(s) found */
- const char* cp = argv[0] +1;
-
- while (*cp != '\0') {
- switch (*cp) {
- case 'v':
- bundle.setVerbose(true);
- break;
- case 'a':
- bundle.setAndroidList(true);
- break;
- case 'c':
- argc--;
- argv++;
- if (!argc) {
- fprintf(stderr, "ERROR: No argument supplied for '-c' option\n");
- wantUsage = true;
- goto bail;
- }
- bundle.addConfigurations(argv[0]);
- break;
- 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;
- }
- tolerance = atoi(argv[0]);
- bundle.setGrayscaleTolerance(tolerance);
- printf("%s: Images with deviation <= %d will be forced to grayscale.\n", prog, tolerance);
- break;
- case 'k':
- bundle.setJunkPath(true);
- break;
- case 'm':
- bundle.setMakePackageDirs(true);
- break;
-#if 0
- case 'p':
- bundle.setPseudolocalize(true);
- break;
-#endif
- case 'u':
- bundle.setUpdate(true);
- break;
- case 'x':
- bundle.setExtending(true);
- break;
- case 'z':
- bundle.setRequireLocalization(true);
- break;
- case 'j':
- argc--;
- argv++;
- if (!argc) {
- fprintf(stderr, "ERROR: No argument supplied for '-j' option\n");
- wantUsage = true;
- goto bail;
- }
- convertPath(argv[0]);
- bundle.addJarFile(argv[0]);
- break;
- case 'A':
- argc--;
- argv++;
- if (!argc) {
- fprintf(stderr, "ERROR: No argument supplied for '-A' option\n");
- wantUsage = true;
- goto bail;
- }
- convertPath(argv[0]);
- bundle.setAssetSourceDir(argv[0]);
- break;
- case 'G':
- argc--;
- argv++;
- if (!argc) {
- fprintf(stderr, "ERROR: No argument supplied for '-G' option\n");
- wantUsage = true;
- goto bail;
- }
- convertPath(argv[0]);
- bundle.setProguardFile(argv[0]);
- break;
- case 'I':
- argc--;
- argv++;
- if (!argc) {
- fprintf(stderr, "ERROR: No argument supplied for '-I' option\n");
- wantUsage = true;
- goto bail;
- }
- convertPath(argv[0]);
- bundle.addPackageInclude(argv[0]);
- break;
- case 'F':
- argc--;
- argv++;
- if (!argc) {
- fprintf(stderr, "ERROR: No argument supplied for '-F' option\n");
- wantUsage = true;
- goto bail;
- }
- convertPath(argv[0]);
- bundle.setOutputAPKFile(argv[0]);
- break;
- case 'J':
- argc--;
- argv++;
- if (!argc) {
- fprintf(stderr, "ERROR: No argument supplied for '-J' option\n");
- wantUsage = true;
- goto bail;
- }
- convertPath(argv[0]);
- bundle.setRClassDir(argv[0]);
- break;
- case 'M':
- argc--;
- argv++;
- if (!argc) {
- fprintf(stderr, "ERROR: No argument supplied for '-M' option\n");
- wantUsage = true;
- goto bail;
- }
- convertPath(argv[0]);
- bundle.setAndroidManifestFile(argv[0]);
- break;
- case 'P':
- argc--;
- argv++;
- if (!argc) {
- fprintf(stderr, "ERROR: No argument supplied for '-P' option\n");
- wantUsage = true;
- goto bail;
- }
- convertPath(argv[0]);
- bundle.setPublicOutputFile(argv[0]);
- break;
- case 'S':
- argc--;
- argv++;
- if (!argc) {
- fprintf(stderr, "ERROR: No argument supplied for '-S' option\n");
- wantUsage = true;
- goto bail;
- }
- convertPath(argv[0]);
- bundle.addResourceSourceDir(argv[0]);
- break;
- case 'C':
- argc--;
- argv++;
- if (!argc) {
- fprintf(stderr, "ERROR: No argument supplied for '-C' option\n");
- wantUsage = true;
- goto bail;
- }
- convertPath(argv[0]);
- bundle.setCrunchedOutputDir(argv[0]);
- break;
- case 'i':
- argc--;
- argv++;
- if (!argc) {
- fprintf(stderr, "ERROR: No argument supplied for '-i' option\n");
- wantUsage = true;
- goto bail;
- }
- convertPath(argv[0]);
- bundle.setSingleCrunchInputFile(argv[0]);
- break;
- case 'o':
- argc--;
- argv++;
- if (!argc) {
- fprintf(stderr, "ERROR: No argument supplied for '-o' option\n");
- wantUsage = true;
- goto bail;
- }
- convertPath(argv[0]);
- bundle.setSingleCrunchOutputFile(argv[0]);
- break;
- case '0':
- argc--;
- argv++;
- if (!argc) {
- fprintf(stderr, "ERROR: No argument supplied for '-e' option\n");
- wantUsage = true;
- goto bail;
- }
- if (argv[0][0] != 0) {
- bundle.addNoCompressExtension(argv[0]);
- } else {
- bundle.setCompressionMethod(ZipEntry::kCompressStored);
- }
- break;
- case '-':
- if (strcmp(cp, "-debug-mode") == 0) {
- bundle.setDebugMode(true);
- } else if (strcmp(cp, "-min-sdk-version") == 0) {
- argc--;
- argv++;
- if (!argc) {
- fprintf(stderr, "ERROR: No argument supplied for '--min-sdk-version' option\n");
- wantUsage = true;
- goto bail;
- }
- bundle.setMinSdkVersion(argv[0]);
- } else if (strcmp(cp, "-target-sdk-version") == 0) {
- argc--;
- argv++;
- if (!argc) {
- fprintf(stderr, "ERROR: No argument supplied for '--target-sdk-version' option\n");
- wantUsage = true;
- goto bail;
- }
- bundle.setTargetSdkVersion(argv[0]);
- } else if (strcmp(cp, "-max-sdk-version") == 0) {
- argc--;
- argv++;
- if (!argc) {
- fprintf(stderr, "ERROR: No argument supplied for '--max-sdk-version' option\n");
- wantUsage = true;
- goto bail;
- }
- bundle.setMaxSdkVersion(argv[0]);
- } else if (strcmp(cp, "-max-res-version") == 0) {
- argc--;
- argv++;
- if (!argc) {
- fprintf(stderr, "ERROR: No argument supplied for '--max-res-version' option\n");
- wantUsage = true;
- goto bail;
- }
- bundle.setMaxResVersion(argv[0]);
- } else if (strcmp(cp, "-version-code") == 0) {
- argc--;
- argv++;
- if (!argc) {
- fprintf(stderr, "ERROR: No argument supplied for '--version-code' option\n");
- wantUsage = true;
- goto bail;
- }
- bundle.setVersionCode(argv[0]);
- } else if (strcmp(cp, "-version-name") == 0) {
- argc--;
- argv++;
- if (!argc) {
- fprintf(stderr, "ERROR: No argument supplied for '--version-name' option\n");
- wantUsage = true;
- goto bail;
- }
- bundle.setVersionName(argv[0]);
- } else if (strcmp(cp, "-values") == 0) {
- bundle.setValues(true);
- } else if (strcmp(cp, "-custom-package") == 0) {
- argc--;
- argv++;
- if (!argc) {
- fprintf(stderr, "ERROR: No argument supplied for '--custom-package' option\n");
- wantUsage = true;
- goto bail;
- }
- bundle.setCustomPackage(argv[0]);
- } else if (strcmp(cp, "-extra-packages") == 0) {
- argc--;
- argv++;
- if (!argc) {
- fprintf(stderr, "ERROR: No argument supplied for '--extra-packages' option\n");
- wantUsage = true;
- goto bail;
- }
- bundle.setExtraPackages(argv[0]);
- } else if (strcmp(cp, "-generate-dependencies") == 0) {
- bundle.setGenDependencies(true);
- } else if (strcmp(cp, "-utf16") == 0) {
- bundle.setWantUTF16(true);
- } else if (strcmp(cp, "-preferred-configurations") == 0) {
- argc--;
- argv++;
- if (!argc) {
- fprintf(stderr, "ERROR: No argument supplied for '--preferred-configurations' option\n");
- wantUsage = true;
- goto bail;
- }
- bundle.addPreferredConfigurations(argv[0]);
- } else if (strcmp(cp, "-rename-manifest-package") == 0) {
- argc--;
- argv++;
- if (!argc) {
- fprintf(stderr, "ERROR: No argument supplied for '--rename-manifest-package' option\n");
- wantUsage = true;
- goto bail;
- }
- bundle.setManifestPackageNameOverride(argv[0]);
- } else if (strcmp(cp, "-rename-instrumentation-target-package") == 0) {
- argc--;
- argv++;
- if (!argc) {
- fprintf(stderr, "ERROR: No argument supplied for '--rename-instrumentation-target-package' option\n");
- wantUsage = true;
- goto bail;
- }
- bundle.setInstrumentationPackageNameOverride(argv[0]);
- } else if (strcmp(cp, "-auto-add-overlay") == 0) {
- bundle.setAutoAddOverlay(true);
- } else if (strcmp(cp, "-error-on-failed-insert") == 0) {
- bundle.setErrorOnFailedInsert(true);
- } else if (strcmp(cp, "-output-text-symbols") == 0) {
- argc--;
- argv++;
- if (!argc) {
- fprintf(stderr, "ERROR: No argument supplied for '-output-text-symbols' option\n");
- wantUsage = true;
- goto bail;
- }
- bundle.setOutputTextSymbols(argv[0]);
- } else if (strcmp(cp, "-product") == 0) {
- argc--;
- argv++;
- if (!argc) {
- fprintf(stderr, "ERROR: No argument supplied for '--product' option\n");
- wantUsage = true;
- goto bail;
- }
- bundle.setProduct(argv[0]);
- } else if (strcmp(cp, "-non-constant-id") == 0) {
- bundle.setNonConstantId(true);
- } else if (strcmp(cp, "-no-crunch") == 0) {
- bundle.setUseCrunchCache(true);
- } else if (strcmp(cp, "-ignore-assets") == 0) {
- argc--;
- argv++;
- if (!argc) {
- fprintf(stderr, "ERROR: No argument supplied for '--ignore-assets' option\n");
- wantUsage = true;
- goto bail;
- }
- gUserIgnoreAssets = argv[0];
- } else {
- fprintf(stderr, "ERROR: Unknown option '-%s'\n", cp);
- wantUsage = true;
- goto bail;
- }
- cp += strlen(cp) - 1;
- break;
- default:
- fprintf(stderr, "ERROR: Unknown flag '-%c'\n", *cp);
- wantUsage = true;
- goto bail;
- }
-
- cp++;
- }
- argc--;
- argv++;
- }
-
- /*
- * We're past the flags. The rest all goes straight in.
- */
- bundle.setFileSpec(argv, argc);
-
- result = handleCommand(&bundle);
-
-bail:
- if (wantUsage) {
- usage();
- result = 2;
- }
-
- //printf("--> returning %d\n", result);
- return result;
-}
diff --git a/tools/aapt/Main.h b/tools/aapt/Main.h
deleted file mode 100644
index a6b39ac..0000000
--- a/tools/aapt/Main.h
+++ /dev/null
@@ -1,63 +0,0 @@
-//
-// Copyright 2006 The Android Open Source Project
-//
-// Some global defines that don't really merit their own header.
-//
-#ifndef __MAIN_H
-#define __MAIN_H
-
-#include <utils/Log.h>
-#include <utils/threads.h>
-#include <utils/List.h>
-#include <utils/Errors.h>
-#include "Bundle.h"
-#include "AaptAssets.h"
-#include "ZipFile.h"
-
-
-/* Benchmarking Flag */
-//#define BENCHMARK 1
-
-#if BENCHMARK
- #include <time.h>
-#endif /* BENCHMARK */
-
-extern int doVersion(Bundle* bundle);
-extern int doList(Bundle* bundle);
-extern int doDump(Bundle* bundle);
-extern int doAdd(Bundle* bundle);
-extern int doRemove(Bundle* bundle);
-extern int doPackage(Bundle* bundle);
-extern int doCrunch(Bundle* bundle);
-extern int doSingleCrunch(Bundle* bundle);
-
-extern int calcPercent(long uncompressedLen, long compressedLen);
-
-extern android::status_t writeAPK(Bundle* bundle,
- const sp<AaptAssets>& assets,
- const android::String8& outputFile);
-
-extern android::status_t updatePreProcessedCache(Bundle* bundle);
-
-extern android::status_t buildResources(Bundle* bundle,
- const sp<AaptAssets>& assets);
-
-extern android::status_t writeResourceSymbols(Bundle* bundle,
- const sp<AaptAssets>& assets, const String8& pkgName, bool includePrivate);
-
-extern android::status_t writeProguardFile(Bundle* bundle, const sp<AaptAssets>& assets);
-
-extern bool isValidResourceType(const String8& type);
-
-ssize_t processAssets(Bundle* bundle, ZipFile* zip, const sp<AaptAssets>& assets);
-
-extern status_t filterResources(Bundle* bundle, const sp<AaptAssets>& assets);
-
-int dumpResources(Bundle* bundle);
-
-String8 getAttribute(const ResXMLTree& tree, const char* ns,
- const char* attr, String8* outError);
-
-status_t writeDependencyPreReqs(Bundle* bundle, const sp<AaptAssets>& assets,
- FILE* fp, bool includeRaw);
-#endif // __MAIN_H
diff --git a/tools/aapt/NOTICE b/tools/aapt/NOTICE
deleted file mode 100644
index c5b1efa..0000000
--- a/tools/aapt/NOTICE
+++ /dev/null
@@ -1,190 +0,0 @@
-
- Copyright (c) 2005-2008, The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-
-
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
diff --git a/tools/aapt/Package.cpp b/tools/aapt/Package.cpp
deleted file mode 100644
index 872d95c..0000000
--- a/tools/aapt/Package.cpp
+++ /dev/null
@@ -1,505 +0,0 @@
-//
-// Copyright 2006 The Android Open Source Project
-//
-// Package assets into Zip files.
-//
-#include "Main.h"
-#include "AaptAssets.h"
-#include "ResourceTable.h"
-#include "ResourceFilter.h"
-
-#include <androidfw/misc.h>
-
-#include <utils/Log.h>
-#include <utils/threads.h>
-#include <utils/List.h>
-#include <utils/Errors.h>
-#include <utils/misc.h>
-
-#include <sys/types.h>
-#include <dirent.h>
-#include <ctype.h>
-#include <errno.h>
-
-using namespace android;
-
-static const char* kExcludeExtension = ".EXCLUDE";
-
-/* these formats are already compressed, or don't compress well */
-static const char* kNoCompressExt[] = {
- ".jpg", ".jpeg", ".png", ".gif",
- ".wav", ".mp2", ".mp3", ".ogg", ".aac",
- ".mpg", ".mpeg", ".mid", ".midi", ".smf", ".jet",
- ".rtttl", ".imy", ".xmf", ".mp4", ".m4a",
- ".m4v", ".3gp", ".3gpp", ".3g2", ".3gpp2",
- ".amr", ".awb", ".wma", ".wmv"
-};
-
-/* fwd decls, so I can write this downward */
-ssize_t processAssets(Bundle* bundle, ZipFile* zip, const sp<AaptAssets>& assets);
-ssize_t processAssets(Bundle* bundle, ZipFile* zip, const sp<AaptDir>& dir,
- const AaptGroupEntry& ge, const ResourceFilter* filter);
-bool processFile(Bundle* bundle, ZipFile* zip,
- const sp<AaptGroup>& group, const sp<AaptFile>& file);
-bool okayToCompress(Bundle* bundle, const String8& pathName);
-ssize_t processJarFiles(Bundle* bundle, ZipFile* zip);
-
-/*
- * The directory hierarchy looks like this:
- * "outputDir" and "assetRoot" are existing directories.
- *
- * On success, "bundle->numPackages" will be the number of Zip packages
- * we created.
- */
-status_t writeAPK(Bundle* bundle, const sp<AaptAssets>& assets,
- const String8& outputFile)
-{
- #if BENCHMARK
- fprintf(stdout, "BENCHMARK: Starting APK Bundling \n");
- long startAPKTime = clock();
- #endif /* BENCHMARK */
-
- status_t result = NO_ERROR;
- ZipFile* zip = NULL;
- int count;
-
- //bundle->setPackageCount(0);
-
- /*
- * Prep the Zip archive.
- *
- * If the file already exists, fail unless "update" or "force" is set.
- * If "update" is set, update the contents of the existing archive.
- * Else, if "force" is set, remove the existing archive.
- */
- FileType fileType = getFileType(outputFile.string());
- if (fileType == kFileTypeNonexistent) {
- // okay, create it below
- } else if (fileType == kFileTypeRegular) {
- if (bundle->getUpdate()) {
- // okay, open it below
- } else if (bundle->getForce()) {
- if (unlink(outputFile.string()) != 0) {
- fprintf(stderr, "ERROR: unable to remove '%s': %s\n", outputFile.string(),
- strerror(errno));
- goto bail;
- }
- } else {
- fprintf(stderr, "ERROR: '%s' exists (use '-f' to force overwrite)\n",
- outputFile.string());
- goto bail;
- }
- } else {
- fprintf(stderr, "ERROR: '%s' exists and is not a regular file\n", outputFile.string());
- goto bail;
- }
-
- if (bundle->getVerbose()) {
- printf("%s '%s'\n", (fileType == kFileTypeNonexistent) ? "Creating" : "Opening",
- outputFile.string());
- }
-
- status_t status;
- zip = new ZipFile;
- status = zip->open(outputFile.string(), ZipFile::kOpenReadWrite | ZipFile::kOpenCreate);
- if (status != NO_ERROR) {
- fprintf(stderr, "ERROR: unable to open '%s' as Zip file for writing\n",
- outputFile.string());
- goto bail;
- }
-
- if (bundle->getVerbose()) {
- printf("Writing all files...\n");
- }
-
- count = processAssets(bundle, zip, assets);
- if (count < 0) {
- fprintf(stderr, "ERROR: unable to process assets while packaging '%s'\n",
- outputFile.string());
- result = count;
- goto bail;
- }
-
- if (bundle->getVerbose()) {
- printf("Generated %d file%s\n", count, (count==1) ? "" : "s");
- }
-
- count = processJarFiles(bundle, zip);
- if (count < 0) {
- fprintf(stderr, "ERROR: unable to process jar files while packaging '%s'\n",
- outputFile.string());
- result = count;
- goto bail;
- }
-
- if (bundle->getVerbose())
- printf("Included %d file%s from jar/zip files.\n", count, (count==1) ? "" : "s");
-
- result = NO_ERROR;
-
- /*
- * Check for cruft. We set the "marked" flag on all entries we created
- * or decided not to update. If the entry isn't already slated for
- * deletion, remove it now.
- */
- {
- if (bundle->getVerbose())
- printf("Checking for deleted files\n");
- int i, removed = 0;
- for (i = 0; i < zip->getNumEntries(); i++) {
- ZipEntry* entry = zip->getEntryByIndex(i);
-
- if (!entry->getMarked() && entry->getDeleted()) {
- if (bundle->getVerbose()) {
- printf(" (removing crufty '%s')\n",
- entry->getFileName());
- }
- zip->remove(entry);
- removed++;
- }
- }
- if (bundle->getVerbose() && removed > 0)
- printf("Removed %d file%s\n", removed, (removed==1) ? "" : "s");
- }
-
- /* tell Zip lib to process deletions and other pending changes */
- result = zip->flush();
- if (result != NO_ERROR) {
- fprintf(stderr, "ERROR: Zip flush failed, archive may be hosed\n");
- goto bail;
- }
-
- /* anything here? */
- if (zip->getNumEntries() == 0) {
- if (bundle->getVerbose()) {
- printf("Archive is empty -- removing %s\n", outputFile.getPathLeaf().string());
- }
- delete zip; // close the file so we can remove it in Win32
- zip = NULL;
- if (unlink(outputFile.string()) != 0) {
- fprintf(stderr, "warning: could not unlink '%s'\n", outputFile.string());
- }
- }
-
- // If we've been asked to generate a dependency file for the .ap_ package,
- // do so here
- if (bundle->getGenDependencies()) {
- // The dependency file gets output to the same directory
- // as the specified output file with an additional .d extension.
- // e.g. bin/resources.ap_.d
- String8 dependencyFile = outputFile;
- dependencyFile.append(".d");
-
- FILE* fp = fopen(dependencyFile.string(), "a");
- // Add this file to the dependency file
- fprintf(fp, "%s \\\n", outputFile.string());
- fclose(fp);
- }
-
- assert(result == NO_ERROR);
-
-bail:
- delete zip; // must close before remove in Win32
- if (result != NO_ERROR) {
- if (bundle->getVerbose()) {
- printf("Removing %s due to earlier failures\n", outputFile.string());
- }
- if (unlink(outputFile.string()) != 0) {
- fprintf(stderr, "warning: could not unlink '%s'\n", outputFile.string());
- }
- }
-
- if (result == NO_ERROR && bundle->getVerbose())
- printf("Done!\n");
-
- #if BENCHMARK
- fprintf(stdout, "BENCHMARK: End APK Bundling. Time Elapsed: %f ms \n",(clock() - startAPKTime)/1000.0);
- #endif /* BENCHMARK */
- return result;
-}
-
-ssize_t processAssets(Bundle* bundle, ZipFile* zip,
- const sp<AaptAssets>& assets)
-{
- ResourceFilter filter;
- status_t status = filter.parse(bundle->getConfigurations());
- if (status != NO_ERROR) {
- return -1;
- }
-
- ssize_t count = 0;
-
- const size_t N = assets->getGroupEntries().size();
- for (size_t i=0; i<N; i++) {
- const AaptGroupEntry& ge = assets->getGroupEntries()[i];
-
- ssize_t res = processAssets(bundle, zip, assets, ge, &filter);
- if (res < 0) {
- return res;
- }
-
- count += res;
- }
-
- return count;
-}
-
-ssize_t processAssets(Bundle* bundle, ZipFile* zip, const sp<AaptDir>& dir,
- const AaptGroupEntry& ge, const ResourceFilter* filter)
-{
- ssize_t count = 0;
-
- const size_t ND = dir->getDirs().size();
- size_t i;
- for (i=0; i<ND; i++) {
- const sp<AaptDir>& subDir = dir->getDirs().valueAt(i);
-
- const bool filterable = filter != NULL && subDir->getLeaf().find("mipmap-") != 0;
-
- if (filterable && subDir->getLeaf() != subDir->getPath() && !filter->match(ge.toParams())) {
- continue;
- }
-
- ssize_t res = processAssets(bundle, zip, subDir, ge, filterable ? filter : NULL);
- if (res < 0) {
- return res;
- }
- count += res;
- }
-
- if (filter != NULL && !filter->match(ge.toParams())) {
- return count;
- }
-
- const size_t NF = dir->getFiles().size();
- for (i=0; i<NF; i++) {
- sp<AaptGroup> gp = dir->getFiles().valueAt(i);
- ssize_t fi = gp->getFiles().indexOfKey(ge);
- if (fi >= 0) {
- sp<AaptFile> fl = gp->getFiles().valueAt(fi);
- if (!processFile(bundle, zip, gp, fl)) {
- return UNKNOWN_ERROR;
- }
- count++;
- }
- }
-
- return count;
-}
-
-/*
- * Process a regular file, adding it to the archive if appropriate.
- *
- * If we're in "update" mode, and the file already exists in the archive,
- * delete the existing entry before adding the new one.
- */
-bool processFile(Bundle* bundle, ZipFile* zip,
- const sp<AaptGroup>& group, const sp<AaptFile>& file)
-{
- const bool hasData = file->hasData();
-
- String8 storageName(group->getPath());
- storageName.convertToResPath();
- ZipEntry* entry;
- bool fromGzip = false;
- status_t result;
-
- /*
- * See if the filename ends in ".EXCLUDE". We can't use
- * String8::getPathExtension() because the length of what it considers
- * to be an extension is capped.
- *
- * The Asset Manager doesn't check for ".EXCLUDE" in Zip archives,
- * so there's no value in adding them (and it makes life easier on
- * the AssetManager lib if we don't).
- *
- * NOTE: this restriction has been removed. If you're in this code, you
- * should clean this up, but I'm in here getting rid of Path Name, and I
- * don't want to make other potentially breaking changes --joeo
- */
- int fileNameLen = storageName.length();
- int excludeExtensionLen = strlen(kExcludeExtension);
- if (fileNameLen > excludeExtensionLen
- && (0 == strcmp(storageName.string() + (fileNameLen - excludeExtensionLen),
- kExcludeExtension))) {
- fprintf(stderr, "warning: '%s' not added to Zip\n", storageName.string());
- return true;
- }
-
- if (strcasecmp(storageName.getPathExtension().string(), ".gz") == 0) {
- fromGzip = true;
- storageName = storageName.getBasePath();
- }
-
- if (bundle->getUpdate()) {
- entry = zip->getEntryByName(storageName.string());
- if (entry != NULL) {
- /* file already exists in archive; there can be only one */
- if (entry->getMarked()) {
- fprintf(stderr,
- "ERROR: '%s' exists twice (check for with & w/o '.gz'?)\n",
- file->getPrintableSource().string());
- return false;
- }
- if (!hasData) {
- const String8& srcName = file->getSourceFile();
- time_t fileModWhen;
- fileModWhen = getFileModDate(srcName.string());
- if (fileModWhen == (time_t) -1) { // file existence tested earlier,
- return false; // not expecting an error here
- }
-
- if (fileModWhen > entry->getModWhen()) {
- // mark as deleted so add() will succeed
- if (bundle->getVerbose()) {
- printf(" (removing old '%s')\n", storageName.string());
- }
-
- zip->remove(entry);
- } else {
- // version in archive is newer
- if (bundle->getVerbose()) {
- printf(" (not updating '%s')\n", storageName.string());
- }
- entry->setMarked(true);
- return true;
- }
- } else {
- // Generated files are always replaced.
- zip->remove(entry);
- }
- }
- }
-
- //android_setMinPriority(NULL, ANDROID_LOG_VERBOSE);
-
- if (fromGzip) {
- result = zip->addGzip(file->getSourceFile().string(), storageName.string(), &entry);
- } else if (!hasData) {
- /* don't compress certain files, e.g. PNGs */
- int compressionMethod = bundle->getCompressionMethod();
- if (!okayToCompress(bundle, storageName)) {
- compressionMethod = ZipEntry::kCompressStored;
- }
- result = zip->add(file->getSourceFile().string(), storageName.string(), compressionMethod,
- &entry);
- } else {
- result = zip->add(file->getData(), file->getSize(), storageName.string(),
- file->getCompressionMethod(), &entry);
- }
- if (result == NO_ERROR) {
- if (bundle->getVerbose()) {
- printf(" '%s'%s", storageName.string(), fromGzip ? " (from .gz)" : "");
- if (entry->getCompressionMethod() == ZipEntry::kCompressStored) {
- printf(" (not compressed)\n");
- } else {
- printf(" (compressed %d%%)\n", calcPercent(entry->getUncompressedLen(),
- entry->getCompressedLen()));
- }
- }
- entry->setMarked(true);
- } else {
- if (result == ALREADY_EXISTS) {
- fprintf(stderr, " Unable to add '%s': file already in archive (try '-u'?)\n",
- file->getPrintableSource().string());
- } else {
- fprintf(stderr, " Unable to add '%s': Zip add failed\n",
- file->getPrintableSource().string());
- }
- return false;
- }
-
- return true;
-}
-
-/*
- * Determine whether or not we want to try to compress this file based
- * on the file extension.
- */
-bool okayToCompress(Bundle* bundle, const String8& pathName)
-{
- String8 ext = pathName.getPathExtension();
- int i;
-
- if (ext.length() == 0)
- return true;
-
- for (i = 0; i < NELEM(kNoCompressExt); i++) {
- if (strcasecmp(ext.string(), kNoCompressExt[i]) == 0)
- return false;
- }
-
- const android::Vector<const char*>& others(bundle->getNoCompressExtensions());
- for (i = 0; i < (int)others.size(); i++) {
- const char* str = others[i];
- int pos = pathName.length() - strlen(str);
- if (pos < 0) {
- continue;
- }
- const char* path = pathName.string();
- if (strcasecmp(path + pos, str) == 0) {
- return false;
- }
- }
-
- return true;
-}
-
-bool endsWith(const char* haystack, const char* needle)
-{
- size_t a = strlen(haystack);
- size_t b = strlen(needle);
- if (a < b) return false;
- return strcasecmp(haystack+(a-b), needle) == 0;
-}
-
-ssize_t processJarFile(ZipFile* jar, ZipFile* out)
-{
- status_t err;
- size_t N = jar->getNumEntries();
- size_t count = 0;
- for (size_t i=0; i<N; i++) {
- ZipEntry* entry = jar->getEntryByIndex(i);
- const char* storageName = entry->getFileName();
- if (endsWith(storageName, ".class")) {
- int compressionMethod = entry->getCompressionMethod();
- size_t size = entry->getUncompressedLen();
- const void* data = jar->uncompress(entry);
- if (data == NULL) {
- fprintf(stderr, "ERROR: unable to uncompress entry '%s'\n",
- storageName);
- return -1;
- }
- out->add(data, size, storageName, compressionMethod, NULL);
- free((void*)data);
- }
- count++;
- }
- return count;
-}
-
-ssize_t processJarFiles(Bundle* bundle, ZipFile* zip)
-{
- status_t err;
- ssize_t count = 0;
- const android::Vector<const char*>& jars = bundle->getJarFiles();
-
- size_t N = jars.size();
- for (size_t i=0; i<N; i++) {
- ZipFile jar;
- err = jar.open(jars[i], ZipFile::kOpenReadOnly);
- if (err != 0) {
- fprintf(stderr, "ERROR: unable to open '%s' as a zip file: %d\n",
- jars[i], err);
- return err;
- }
- err += processJarFile(&jar, zip);
- if (err < 0) {
- fprintf(stderr, "ERROR: unable to process '%s'\n", jars[i]);
- return err;
- }
- count += err;
- }
-
- return count;
-}
diff --git a/tools/aapt/Resource.cpp b/tools/aapt/Resource.cpp
deleted file mode 100644
index 386888b..0000000
--- a/tools/aapt/Resource.cpp
+++ /dev/null
@@ -1,2651 +0,0 @@
-//
-// Copyright 2006 The Android Open Source Project
-//
-// Build resource files from raw assets.
-//
-#include "Main.h"
-#include "AaptAssets.h"
-#include "StringPool.h"
-#include "XMLNode.h"
-#include "ResourceTable.h"
-#include "Images.h"
-
-#include "CrunchCache.h"
-#include "FileFinder.h"
-#include "CacheUpdater.h"
-
-#include "WorkQueue.h"
-
-#if HAVE_PRINTF_ZD
-# define ZD "%zd"
-# define ZD_TYPE ssize_t
-#else
-# define ZD "%ld"
-# define ZD_TYPE long
-#endif
-
-#define NOISY(x) // x
-
-// Number of threads to use for preprocessing images.
-static const size_t MAX_THREADS = 4;
-
-// ==========================================================================
-// ==========================================================================
-// ==========================================================================
-
-class PackageInfo
-{
-public:
- PackageInfo()
- {
- }
- ~PackageInfo()
- {
- }
-
- status_t parsePackage(const sp<AaptGroup>& grp);
-};
-
-// ==========================================================================
-// ==========================================================================
-// ==========================================================================
-
-static String8 parseResourceName(const String8& leaf)
-{
- const char* firstDot = strchr(leaf.string(), '.');
- const char* str = leaf.string();
-
- if (firstDot) {
- return String8(str, firstDot-str);
- } else {
- return String8(str);
- }
-}
-
-ResourceTypeSet::ResourceTypeSet()
- :RefBase(),
- KeyedVector<String8,sp<AaptGroup> >()
-{
-}
-
-FilePathStore::FilePathStore()
- :RefBase(),
- Vector<String8>()
-{
-}
-
-class ResourceDirIterator
-{
-public:
- ResourceDirIterator(const sp<ResourceTypeSet>& set, const String8& resType)
- : mResType(resType), mSet(set), mSetPos(0), mGroupPos(0)
- {
- }
-
- inline const sp<AaptGroup>& getGroup() const { return mGroup; }
- inline const sp<AaptFile>& getFile() const { return mFile; }
-
- inline const String8& getBaseName() const { return mBaseName; }
- inline const String8& getLeafName() const { return mLeafName; }
- inline String8 getPath() const { return mPath; }
- inline const ResTable_config& getParams() const { return mParams; }
-
- enum {
- EOD = 1
- };
-
- ssize_t next()
- {
- while (true) {
- sp<AaptGroup> group;
- sp<AaptFile> file;
-
- // Try to get next file in this current group.
- if (mGroup != NULL && mGroupPos < mGroup->getFiles().size()) {
- group = mGroup;
- file = group->getFiles().valueAt(mGroupPos++);
-
- // Try to get the next group/file in this directory
- } else if (mSetPos < mSet->size()) {
- mGroup = group = mSet->valueAt(mSetPos++);
- if (group->getFiles().size() < 1) {
- continue;
- }
- file = group->getFiles().valueAt(0);
- mGroupPos = 1;
-
- // All done!
- } else {
- return EOD;
- }
-
- mFile = file;
-
- String8 leaf(group->getLeaf());
- mLeafName = String8(leaf);
- mParams = file->getGroupEntry().toParams();
- NOISY(printf("Dir %s: mcc=%d mnc=%d lang=%c%c cnt=%c%c orient=%d ui=%d density=%d touch=%d key=%d inp=%d nav=%d\n",
- group->getPath().string(), mParams.mcc, mParams.mnc,
- mParams.language[0] ? mParams.language[0] : '-',
- mParams.language[1] ? mParams.language[1] : '-',
- mParams.country[0] ? mParams.country[0] : '-',
- mParams.country[1] ? mParams.country[1] : '-',
- mParams.orientation, mParams.uiMode,
- mParams.density, mParams.touchscreen, mParams.keyboard,
- mParams.inputFlags, mParams.navigation));
- mPath = "res";
- mPath.appendPath(file->getGroupEntry().toDirName(mResType));
- mPath.appendPath(leaf);
- mBaseName = parseResourceName(leaf);
- if (mBaseName == "") {
- fprintf(stderr, "Error: malformed resource filename %s\n",
- file->getPrintableSource().string());
- return UNKNOWN_ERROR;
- }
-
- NOISY(printf("file name=%s\n", mBaseName.string()));
-
- return NO_ERROR;
- }
- }
-
-private:
- String8 mResType;
-
- const sp<ResourceTypeSet> mSet;
- size_t mSetPos;
-
- sp<AaptGroup> mGroup;
- size_t mGroupPos;
-
- sp<AaptFile> mFile;
- String8 mBaseName;
- String8 mLeafName;
- String8 mPath;
- ResTable_config mParams;
-};
-
-// ==========================================================================
-// ==========================================================================
-// ==========================================================================
-
-bool isValidResourceType(const String8& type)
-{
- return type == "anim" || type == "animator" || type == "interpolator"
- || type == "transition"
- || type == "drawable" || type == "layout"
- || type == "values" || type == "xml" || type == "raw"
- || type == "color" || type == "menu" || type == "mipmap";
-}
-
-static sp<AaptFile> getResourceFile(const sp<AaptAssets>& assets, bool makeIfNecessary=true)
-{
- sp<AaptGroup> group = assets->getFiles().valueFor(String8("resources.arsc"));
- sp<AaptFile> file;
- if (group != NULL) {
- file = group->getFiles().valueFor(AaptGroupEntry());
- if (file != NULL) {
- return file;
- }
- }
-
- if (!makeIfNecessary) {
- return NULL;
- }
- return assets->addFile(String8("resources.arsc"), AaptGroupEntry(), String8(),
- NULL, String8());
-}
-
-static status_t parsePackage(Bundle* bundle, const sp<AaptAssets>& assets,
- const sp<AaptGroup>& grp)
-{
- if (grp->getFiles().size() != 1) {
- fprintf(stderr, "warning: Multiple AndroidManifest.xml files found, using %s\n",
- grp->getFiles().valueAt(0)->getPrintableSource().string());
- }
-
- sp<AaptFile> file = grp->getFiles().valueAt(0);
-
- ResXMLTree block;
- status_t err = parseXMLResource(file, &block);
- if (err != NO_ERROR) {
- return err;
- }
- //printXMLBlock(&block);
-
- ResXMLTree::event_code_t code;
- while ((code=block.next()) != ResXMLTree::START_TAG
- && code != ResXMLTree::END_DOCUMENT
- && code != ResXMLTree::BAD_DOCUMENT) {
- }
-
- size_t len;
- if (code != ResXMLTree::START_TAG) {
- fprintf(stderr, "%s:%d: No start tag found\n",
- file->getPrintableSource().string(), block.getLineNumber());
- return UNKNOWN_ERROR;
- }
- if (strcmp16(block.getElementName(&len), String16("manifest").string()) != 0) {
- fprintf(stderr, "%s:%d: Invalid start tag %s, expected <manifest>\n",
- file->getPrintableSource().string(), block.getLineNumber(),
- String8(block.getElementName(&len)).string());
- return UNKNOWN_ERROR;
- }
-
- ssize_t nameIndex = block.indexOfAttribute(NULL, "package");
- if (nameIndex < 0) {
- fprintf(stderr, "%s:%d: <manifest> does not have package attribute.\n",
- file->getPrintableSource().string(), block.getLineNumber());
- return UNKNOWN_ERROR;
- }
-
- assets->setPackage(String8(block.getAttributeStringValue(nameIndex, &len)));
-
- String16 uses_sdk16("uses-sdk");
- while ((code=block.next()) != ResXMLTree::END_DOCUMENT
- && code != ResXMLTree::BAD_DOCUMENT) {
- if (code == ResXMLTree::START_TAG) {
- if (strcmp16(block.getElementName(&len), uses_sdk16.string()) == 0) {
- ssize_t minSdkIndex = block.indexOfAttribute(RESOURCES_ANDROID_NAMESPACE,
- "minSdkVersion");
- if (minSdkIndex >= 0) {
- const uint16_t* minSdk16 = block.getAttributeStringValue(minSdkIndex, &len);
- const char* minSdk8 = strdup(String8(minSdk16).string());
- bundle->setManifestMinSdkVersion(minSdk8);
- }
- }
- }
- }
-
- return NO_ERROR;
-}
-
-// ==========================================================================
-// ==========================================================================
-// ==========================================================================
-
-static status_t makeFileResources(Bundle* bundle, const sp<AaptAssets>& assets,
- ResourceTable* table,
- const sp<ResourceTypeSet>& set,
- const char* resType)
-{
- String8 type8(resType);
- String16 type16(resType);
-
- bool hasErrors = false;
-
- ResourceDirIterator it(set, String8(resType));
- ssize_t res;
- while ((res=it.next()) == NO_ERROR) {
- if (bundle->getVerbose()) {
- printf(" (new resource id %s from %s)\n",
- it.getBaseName().string(), it.getFile()->getPrintableSource().string());
- }
- String16 baseName(it.getBaseName());
- const char16_t* str = baseName.string();
- const char16_t* const end = str + baseName.size();
- while (str < end) {
- if (!((*str >= 'a' && *str <= 'z')
- || (*str >= '0' && *str <= '9')
- || *str == '_' || *str == '.')) {
- fprintf(stderr, "%s: Invalid file name: must contain only [a-z0-9_.]\n",
- it.getPath().string());
- hasErrors = true;
- }
- str++;
- }
- String8 resPath = it.getPath();
- resPath.convertToResPath();
- table->addEntry(SourcePos(it.getPath(), 0), String16(assets->getPackage()),
- type16,
- baseName,
- String16(resPath),
- NULL,
- &it.getParams());
- assets->addResource(it.getLeafName(), resPath, it.getFile(), type8);
- }
-
- return hasErrors ? UNKNOWN_ERROR : NO_ERROR;
-}
-
-class PreProcessImageWorkUnit : public WorkQueue::WorkUnit {
-public:
- PreProcessImageWorkUnit(const Bundle* bundle, const sp<AaptAssets>& assets,
- const sp<AaptFile>& file, volatile bool* hasErrors) :
- mBundle(bundle), mAssets(assets), mFile(file), mHasErrors(hasErrors) {
- }
-
- virtual bool run() {
- status_t status = preProcessImage(mBundle, mAssets, mFile, NULL);
- if (status) {
- *mHasErrors = true;
- }
- return true; // continue even if there are errors
- }
-
-private:
- const Bundle* mBundle;
- sp<AaptAssets> mAssets;
- sp<AaptFile> mFile;
- volatile bool* mHasErrors;
-};
-
-static status_t preProcessImages(const Bundle* bundle, const sp<AaptAssets>& assets,
- const sp<ResourceTypeSet>& set, const char* type)
-{
- volatile bool hasErrors = false;
- ssize_t res = NO_ERROR;
- if (bundle->getUseCrunchCache() == false) {
- WorkQueue wq(MAX_THREADS, false);
- ResourceDirIterator it(set, String8(type));
- while ((res=it.next()) == NO_ERROR) {
- PreProcessImageWorkUnit* w = new PreProcessImageWorkUnit(
- bundle, assets, it.getFile(), &hasErrors);
- status_t status = wq.schedule(w);
- if (status) {
- fprintf(stderr, "preProcessImages failed: schedule() returned %d\n", status);
- hasErrors = true;
- delete w;
- break;
- }
- }
- status_t status = wq.finish();
- if (status) {
- fprintf(stderr, "preProcessImages failed: finish() returned %d\n", status);
- hasErrors = true;
- }
- }
- return (hasErrors || (res < NO_ERROR)) ? UNKNOWN_ERROR : NO_ERROR;
-}
-
-status_t postProcessImages(const sp<AaptAssets>& assets,
- ResourceTable* table,
- const sp<ResourceTypeSet>& set)
-{
- ResourceDirIterator it(set, String8("drawable"));
- bool hasErrors = false;
- ssize_t res;
- while ((res=it.next()) == NO_ERROR) {
- res = postProcessImage(assets, table, it.getFile());
- if (res < NO_ERROR) {
- hasErrors = true;
- }
- }
-
- return (hasErrors || (res < NO_ERROR)) ? UNKNOWN_ERROR : NO_ERROR;
-}
-
-static void collect_files(const sp<AaptDir>& dir,
- KeyedVector<String8, sp<ResourceTypeSet> >* resources)
-{
- const DefaultKeyedVector<String8, sp<AaptGroup> >& groups = dir->getFiles();
- int N = groups.size();
- for (int i=0; i<N; i++) {
- String8 leafName = groups.keyAt(i);
- const sp<AaptGroup>& group = groups.valueAt(i);
-
- const DefaultKeyedVector<AaptGroupEntry, sp<AaptFile> >& files
- = group->getFiles();
-
- if (files.size() == 0) {
- continue;
- }
-
- String8 resType = files.valueAt(0)->getResourceType();
-
- ssize_t index = resources->indexOfKey(resType);
-
- if (index < 0) {
- sp<ResourceTypeSet> set = new ResourceTypeSet();
- NOISY(printf("Creating new resource type set for leaf %s with group %s (%p)\n",
- leafName.string(), group->getPath().string(), group.get()));
- set->add(leafName, group);
- resources->add(resType, set);
- } else {
- sp<ResourceTypeSet> set = resources->valueAt(index);
- index = set->indexOfKey(leafName);
- if (index < 0) {
- NOISY(printf("Adding to resource type set for leaf %s group %s (%p)\n",
- leafName.string(), group->getPath().string(), group.get()));
- set->add(leafName, group);
- } else {
- sp<AaptGroup> existingGroup = set->valueAt(index);
- NOISY(printf("Extending to resource type set for leaf %s group %s (%p)\n",
- leafName.string(), group->getPath().string(), group.get()));
- for (size_t j=0; j<files.size(); j++) {
- NOISY(printf("Adding file %s in group %s resType %s\n",
- files.valueAt(j)->getSourceFile().string(),
- files.keyAt(j).toDirName(String8()).string(),
- resType.string()));
- status_t err = existingGroup->addFile(files.valueAt(j));
- }
- }
- }
- }
-}
-
-static void collect_files(const sp<AaptAssets>& ass,
- KeyedVector<String8, sp<ResourceTypeSet> >* resources)
-{
- const Vector<sp<AaptDir> >& dirs = ass->resDirs();
- int N = dirs.size();
-
- for (int i=0; i<N; i++) {
- sp<AaptDir> d = dirs.itemAt(i);
- NOISY(printf("Collecting dir #%d %p: %s, leaf %s\n", i, d.get(), d->getPath().string(),
- d->getLeaf().string()));
- collect_files(d, resources);
-
- // don't try to include the res dir
- NOISY(printf("Removing dir leaf %s\n", d->getLeaf().string()));
- ass->removeDir(d->getLeaf());
- }
-}
-
-enum {
- ATTR_OKAY = -1,
- ATTR_NOT_FOUND = -2,
- ATTR_LEADING_SPACES = -3,
- ATTR_TRAILING_SPACES = -4
-};
-static int validateAttr(const String8& path, const ResTable& table,
- const ResXMLParser& parser,
- const char* ns, const char* attr, const char* validChars, bool required)
-{
- size_t len;
-
- ssize_t index = parser.indexOfAttribute(ns, attr);
- const uint16_t* str;
- Res_value value;
- if (index >= 0 && parser.getAttributeValue(index, &value) >= 0) {
- const ResStringPool* pool = &parser.getStrings();
- if (value.dataType == Res_value::TYPE_REFERENCE) {
- uint32_t specFlags = 0;
- int strIdx;
- if ((strIdx=table.resolveReference(&value, 0x10000000, NULL, &specFlags)) < 0) {
- fprintf(stderr, "%s:%d: Tag <%s> attribute %s references unknown resid 0x%08x.\n",
- path.string(), parser.getLineNumber(),
- String8(parser.getElementName(&len)).string(), attr,
- value.data);
- return ATTR_NOT_FOUND;
- }
-
- pool = table.getTableStringBlock(strIdx);
- #if 0
- if (pool != NULL) {
- str = pool->stringAt(value.data, &len);
- }
- printf("***** RES ATTR: %s specFlags=0x%x strIdx=%d: %s\n", attr,
- specFlags, strIdx, str != NULL ? String8(str).string() : "???");
- #endif
- if ((specFlags&~ResTable_typeSpec::SPEC_PUBLIC) != 0 && false) {
- fprintf(stderr, "%s:%d: Tag <%s> attribute %s varies by configurations 0x%x.\n",
- path.string(), parser.getLineNumber(),
- String8(parser.getElementName(&len)).string(), attr,
- specFlags);
- return ATTR_NOT_FOUND;
- }
- }
- if (value.dataType == Res_value::TYPE_STRING) {
- if (pool == NULL) {
- fprintf(stderr, "%s:%d: Tag <%s> attribute %s has no string block.\n",
- path.string(), parser.getLineNumber(),
- String8(parser.getElementName(&len)).string(), attr);
- return ATTR_NOT_FOUND;
- }
- if ((str=pool->stringAt(value.data, &len)) == NULL) {
- fprintf(stderr, "%s:%d: Tag <%s> attribute %s has corrupt string value.\n",
- path.string(), parser.getLineNumber(),
- String8(parser.getElementName(&len)).string(), attr);
- return ATTR_NOT_FOUND;
- }
- } else {
- fprintf(stderr, "%s:%d: Tag <%s> attribute %s has invalid type %d.\n",
- path.string(), parser.getLineNumber(),
- String8(parser.getElementName(&len)).string(), attr,
- value.dataType);
- return ATTR_NOT_FOUND;
- }
- if (validChars) {
- for (size_t i=0; i<len; i++) {
- uint16_t c = str[i];
- const char* p = validChars;
- bool okay = false;
- while (*p) {
- if (c == *p) {
- okay = true;
- break;
- }
- p++;
- }
- if (!okay) {
- fprintf(stderr, "%s:%d: Tag <%s> attribute %s has invalid character '%c'.\n",
- path.string(), parser.getLineNumber(),
- String8(parser.getElementName(&len)).string(), attr, (char)str[i]);
- return (int)i;
- }
- }
- }
- if (*str == ' ') {
- fprintf(stderr, "%s:%d: Tag <%s> attribute %s can not start with a space.\n",
- path.string(), parser.getLineNumber(),
- String8(parser.getElementName(&len)).string(), attr);
- return ATTR_LEADING_SPACES;
- }
- if (str[len-1] == ' ') {
- fprintf(stderr, "%s:%d: Tag <%s> attribute %s can not end with a space.\n",
- path.string(), parser.getLineNumber(),
- String8(parser.getElementName(&len)).string(), attr);
- return ATTR_TRAILING_SPACES;
- }
- return ATTR_OKAY;
- }
- if (required) {
- fprintf(stderr, "%s:%d: Tag <%s> missing required attribute %s.\n",
- path.string(), parser.getLineNumber(),
- String8(parser.getElementName(&len)).string(), attr);
- return ATTR_NOT_FOUND;
- }
- return ATTR_OKAY;
-}
-
-static void checkForIds(const String8& path, ResXMLParser& parser)
-{
- ResXMLTree::event_code_t code;
- while ((code=parser.next()) != ResXMLTree::END_DOCUMENT
- && code > ResXMLTree::BAD_DOCUMENT) {
- if (code == ResXMLTree::START_TAG) {
- ssize_t index = parser.indexOfAttribute(NULL, "id");
- if (index >= 0) {
- fprintf(stderr, "%s:%d: warning: found plain 'id' attribute; did you mean the new 'android:id' name?\n",
- path.string(), parser.getLineNumber());
- }
- }
- }
-}
-
-static bool applyFileOverlay(Bundle *bundle,
- const sp<AaptAssets>& assets,
- sp<ResourceTypeSet> *baseSet,
- const char *resType)
-{
- if (bundle->getVerbose()) {
- printf("applyFileOverlay for %s\n", 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++) {
- if (bundle->getVerbose()) {
- printf("trying overlaySet Key=%s\n",overlaySet->keyAt(overlayIndex).string());
- }
- size_t baseIndex = UNKNOWN_ERROR;
- if (baseSet->get() != NULL) {
- 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> > overlayFiles =
- overlayGroup->getFiles();
- if (bundle->getVerbose()) {
- DefaultKeyedVector<AaptGroupEntry, sp<AaptFile> > baseFiles =
- baseGroup->getFiles();
- for (size_t i=0; i < baseFiles.size(); i++) {
- printf("baseFile " ZD " has flavor %s\n", (ZD_TYPE) i,
- baseFiles.keyAt(i).toString().string());
- }
- for (size_t i=0; i < overlayFiles.size(); i++) {
- printf("overlayFile " ZD " has flavor %s\n", (ZD_TYPE) i,
- overlayFiles.keyAt(i).toString().string());
- }
- }
-
- size_t overlayGroupSize = overlayFiles.size();
- for (size_t overlayGroupIndex = 0;
- overlayGroupIndex<overlayGroupSize;
- overlayGroupIndex++) {
- size_t baseFileIndex =
- baseGroup->getFiles().indexOfKey(overlayFiles.
- keyAt(overlayGroupIndex));
- if (baseFileIndex < UNKNOWN_ERROR) {
- if (bundle->getVerbose()) {
- printf("found a match (" ZD ") for overlay file %s, for flavor %s\n",
- (ZD_TYPE) baseFileIndex,
- overlayGroup->getLeaf().string(),
- overlayFiles.keyAt(overlayGroupIndex).toString().string());
- }
- baseGroup->removeFile(baseFileIndex);
- } else {
- // didn't find a match fall through and add it..
- if (true || bundle->getVerbose()) {
- printf("nothing matches overlay file %s, for flavor %s\n",
- overlayGroup->getLeaf().string(),
- overlayFiles.keyAt(overlayGroupIndex).toString().string());
- }
- }
- baseGroup->addFile(overlayFiles.valueAt(overlayGroupIndex));
- assets->addGroupEntry(overlayFiles.keyAt(overlayGroupIndex));
- }
- } else {
- if (baseSet->get() == NULL) {
- *baseSet = new ResourceTypeSet();
- assets->getResources()->add(String8(resType), *baseSet);
- }
- // this group doesn't exist (a file that's only in the overlay)
- (*baseSet)->add(overlaySet->keyAt(overlayIndex),
- overlaySet->valueAt(overlayIndex));
- // make sure all flavors are defined in the resources.
- sp<AaptGroup> overlayGroup = overlaySet->valueAt(overlayIndex);
- DefaultKeyedVector<AaptGroupEntry, sp<AaptFile> > overlayFiles =
- overlayGroup->getFiles();
- size_t overlayGroupSize = overlayFiles.size();
- for (size_t overlayGroupIndex = 0;
- overlayGroupIndex<overlayGroupSize;
- overlayGroupIndex++) {
- assets->addGroupEntry(overlayFiles.keyAt(overlayGroupIndex));
- }
- }
- }
- // this overlay didn't have resources for this type
- }
- // try next overlay
- overlay = overlay->getOverlay();
- }
- return true;
-}
-
-/*
- * Inserts an attribute in a given node, only if the attribute does not
- * exist.
- * If errorOnFailedInsert is true, and the attribute already exists, returns false.
- * Returns true otherwise, even if the attribute already exists.
- */
-bool addTagAttribute(const sp<XMLNode>& node, const char* ns8,
- const char* attr8, const char* value, bool errorOnFailedInsert)
-{
- if (value == NULL) {
- return true;
- }
-
- const String16 ns(ns8);
- const String16 attr(attr8);
-
- if (node->getAttribute(ns, attr) != NULL) {
- if (errorOnFailedInsert) {
- fprintf(stderr, "Error: AndroidManifest.xml already defines %s (in %s);"
- " cannot insert new value %s.\n",
- String8(attr).string(), String8(ns).string(), value);
- return false;
- }
-
- fprintf(stderr, "Warning: AndroidManifest.xml already defines %s (in %s);"
- " using existing value in manifest.\n",
- String8(attr).string(), String8(ns).string());
-
- // don't stop the build.
- return true;
- }
-
- node->addAttribute(ns, attr, String16(value));
- return true;
-}
-
-static void fullyQualifyClassName(const String8& package, sp<XMLNode> node,
- const String16& attrName) {
- XMLNode::attribute_entry* attr = node->editAttribute(
- String16("http://schemas.android.com/apk/res/android"), attrName);
- if (attr != NULL) {
- String8 name(attr->string);
-
- // asdf --> package.asdf
- // .asdf .a.b --> package.asdf package.a.b
- // asdf.adsf --> asdf.asdf
- String8 className;
- const char* p = name.string();
- const char* q = strchr(p, '.');
- if (p == q) {
- className += package;
- className += name;
- } else if (q == NULL) {
- className += package;
- className += ".";
- className += name;
- } else {
- className += name;
- }
- NOISY(printf("Qualifying class '%s' to '%s'", name.string(), className.string()));
- attr->string.setTo(String16(className));
- }
-}
-
-status_t massageManifest(Bundle* bundle, sp<XMLNode> root)
-{
- root = root->searchElement(String16(), String16("manifest"));
- if (root == NULL) {
- fprintf(stderr, "No <manifest> tag.\n");
- return UNKNOWN_ERROR;
- }
-
- bool errorOnFailedInsert = bundle->getErrorOnFailedInsert();
-
- if (!addTagAttribute(root, RESOURCES_ANDROID_NAMESPACE, "versionCode",
- bundle->getVersionCode(), errorOnFailedInsert)) {
- return UNKNOWN_ERROR;
- }
- if (!addTagAttribute(root, RESOURCES_ANDROID_NAMESPACE, "versionName",
- bundle->getVersionName(), errorOnFailedInsert)) {
- return UNKNOWN_ERROR;
- }
-
- if (bundle->getMinSdkVersion() != NULL
- || bundle->getTargetSdkVersion() != NULL
- || bundle->getMaxSdkVersion() != NULL) {
- sp<XMLNode> vers = root->getChildElement(String16(), String16("uses-sdk"));
- if (vers == NULL) {
- vers = XMLNode::newElement(root->getFilename(), String16(), String16("uses-sdk"));
- root->insertChildAt(vers, 0);
- }
-
- if (!addTagAttribute(vers, RESOURCES_ANDROID_NAMESPACE, "minSdkVersion",
- bundle->getMinSdkVersion(), errorOnFailedInsert)) {
- return UNKNOWN_ERROR;
- }
- if (!addTagAttribute(vers, RESOURCES_ANDROID_NAMESPACE, "targetSdkVersion",
- bundle->getTargetSdkVersion(), errorOnFailedInsert)) {
- return UNKNOWN_ERROR;
- }
- if (!addTagAttribute(vers, RESOURCES_ANDROID_NAMESPACE, "maxSdkVersion",
- bundle->getMaxSdkVersion(), errorOnFailedInsert)) {
- return UNKNOWN_ERROR;
- }
- }
-
- if (bundle->getDebugMode()) {
- sp<XMLNode> application = root->getChildElement(String16(), String16("application"));
- if (application != NULL) {
- if (!addTagAttribute(application, RESOURCES_ANDROID_NAMESPACE, "debuggable", "true",
- errorOnFailedInsert)) {
- return UNKNOWN_ERROR;
- }
- }
- }
-
- // Deal with manifest package name overrides
- const char* manifestPackageNameOverride = bundle->getManifestPackageNameOverride();
- if (manifestPackageNameOverride != NULL) {
- // Update the actual package name
- XMLNode::attribute_entry* attr = root->editAttribute(String16(), String16("package"));
- if (attr == NULL) {
- fprintf(stderr, "package name is required with --rename-manifest-package.\n");
- return UNKNOWN_ERROR;
- }
- String8 origPackage(attr->string);
- attr->string.setTo(String16(manifestPackageNameOverride));
- NOISY(printf("Overriding package '%s' to be '%s'\n", origPackage.string(), manifestPackageNameOverride));
-
- // Make class names fully qualified
- sp<XMLNode> application = root->getChildElement(String16(), String16("application"));
- if (application != NULL) {
- fullyQualifyClassName(origPackage, application, String16("name"));
- fullyQualifyClassName(origPackage, application, String16("backupAgent"));
-
- Vector<sp<XMLNode> >& children = const_cast<Vector<sp<XMLNode> >&>(application->getChildren());
- for (size_t i = 0; i < children.size(); i++) {
- sp<XMLNode> child = children.editItemAt(i);
- String8 tag(child->getElementName());
- if (tag == "activity" || tag == "service" || tag == "receiver" || tag == "provider") {
- fullyQualifyClassName(origPackage, child, String16("name"));
- } else if (tag == "activity-alias") {
- fullyQualifyClassName(origPackage, child, String16("name"));
- fullyQualifyClassName(origPackage, child, String16("targetActivity"));
- }
- }
- }
- }
-
- // Deal with manifest package name overrides
- const char* instrumentationPackageNameOverride = bundle->getInstrumentationPackageNameOverride();
- if (instrumentationPackageNameOverride != NULL) {
- // Fix up instrumentation targets.
- Vector<sp<XMLNode> >& children = const_cast<Vector<sp<XMLNode> >&>(root->getChildren());
- for (size_t i = 0; i < children.size(); i++) {
- sp<XMLNode> child = children.editItemAt(i);
- String8 tag(child->getElementName());
- if (tag == "instrumentation") {
- XMLNode::attribute_entry* attr = child->editAttribute(
- String16("http://schemas.android.com/apk/res/android"), String16("targetPackage"));
- if (attr != NULL) {
- attr->string.setTo(String16(instrumentationPackageNameOverride));
- }
- }
- }
- }
-
- return NO_ERROR;
-}
-
-#define ASSIGN_IT(n) \
- do { \
- ssize_t index = resources->indexOfKey(String8(#n)); \
- if (index >= 0) { \
- n ## s = resources->valueAt(index); \
- } \
- } while (0)
-
-status_t updatePreProcessedCache(Bundle* bundle)
-{
- #if BENCHMARK
- fprintf(stdout, "BENCHMARK: Starting PNG PreProcessing \n");
- long startPNGTime = clock();
- #endif /* BENCHMARK */
-
- String8 source(bundle->getResourceSourceDirs()[0]);
- String8 dest(bundle->getCrunchedOutputDir());
-
- FileFinder* ff = new SystemFileFinder();
- CrunchCache cc(source,dest,ff);
-
- CacheUpdater* cu = new SystemCacheUpdater(bundle);
- size_t numFiles = cc.crunch(cu);
-
- if (bundle->getVerbose())
- fprintf(stdout, "Crunched %d PNG files to update cache\n", (int)numFiles);
-
- delete ff;
- delete cu;
-
- #if BENCHMARK
- fprintf(stdout, "BENCHMARK: End PNG PreProcessing. Time Elapsed: %f ms \n"
- ,(clock() - startPNGTime)/1000.0);
- #endif /* BENCHMARK */
- return 0;
-}
-
-status_t buildResources(Bundle* bundle, const sp<AaptAssets>& assets)
-{
- // First, look for a package file to parse. This is required to
- // be able to generate the resource information.
- sp<AaptGroup> androidManifestFile =
- assets->getFiles().valueFor(String8("AndroidManifest.xml"));
- if (androidManifestFile == NULL) {
- fprintf(stderr, "ERROR: No AndroidManifest.xml file found.\n");
- return UNKNOWN_ERROR;
- }
-
- status_t err = parsePackage(bundle, assets, androidManifestFile);
- if (err != NO_ERROR) {
- return err;
- }
-
- NOISY(printf("Creating resources for package %s\n",
- assets->getPackage().string()));
-
- ResourceTable table(bundle, String16(assets->getPackage()));
- err = table.addIncludedResources(bundle, assets);
- if (err != NO_ERROR) {
- return err;
- }
-
- NOISY(printf("Found %d included resource packages\n", (int)table.size()));
-
- // Standard flags for compiled XML and optional UTF-8 encoding
- int xmlFlags = XML_COMPILE_STANDARD_RESOURCE;
-
- /* Only enable UTF-8 if the caller of aapt didn't specifically
- * request UTF-16 encoding and the parameters of this package
- * allow UTF-8 to be used.
- */
- if (!bundle->getUTF16StringsOption()) {
- xmlFlags |= XML_COMPILE_UTF8;
- }
-
- // --------------------------------------------------------------
- // First, gather all resource information.
- // --------------------------------------------------------------
-
- // resType -> leafName -> group
- KeyedVector<String8, sp<ResourceTypeSet> > *resources =
- new KeyedVector<String8, sp<ResourceTypeSet> >;
- collect_files(assets, resources);
-
- sp<ResourceTypeSet> drawables;
- sp<ResourceTypeSet> layouts;
- sp<ResourceTypeSet> anims;
- sp<ResourceTypeSet> animators;
- sp<ResourceTypeSet> interpolators;
- sp<ResourceTypeSet> transitions;
- sp<ResourceTypeSet> xmls;
- sp<ResourceTypeSet> raws;
- sp<ResourceTypeSet> colors;
- sp<ResourceTypeSet> menus;
- sp<ResourceTypeSet> mipmaps;
-
- ASSIGN_IT(drawable);
- ASSIGN_IT(layout);
- ASSIGN_IT(anim);
- ASSIGN_IT(animator);
- ASSIGN_IT(interpolator);
- ASSIGN_IT(transition);
- ASSIGN_IT(xml);
- ASSIGN_IT(raw);
- ASSIGN_IT(color);
- ASSIGN_IT(menu);
- ASSIGN_IT(mipmap);
-
- 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
- if (!applyFileOverlay(bundle, assets, &drawables, "drawable") ||
- !applyFileOverlay(bundle, assets, &layouts, "layout") ||
- !applyFileOverlay(bundle, assets, &anims, "anim") ||
- !applyFileOverlay(bundle, assets, &animators, "animator") ||
- !applyFileOverlay(bundle, assets, &interpolators, "interpolator") ||
- !applyFileOverlay(bundle, assets, &transitions, "transition") ||
- !applyFileOverlay(bundle, assets, &xmls, "xml") ||
- !applyFileOverlay(bundle, assets, &raws, "raw") ||
- !applyFileOverlay(bundle, assets, &colors, "color") ||
- !applyFileOverlay(bundle, assets, &menus, "menu") ||
- !applyFileOverlay(bundle, assets, &mipmaps, "mipmap")) {
- return UNKNOWN_ERROR;
- }
-
- bool hasErrors = false;
-
- if (drawables != NULL) {
- if (bundle->getOutputAPKFile() != NULL) {
- err = preProcessImages(bundle, assets, drawables, "drawable");
- }
- if (err == NO_ERROR) {
- err = makeFileResources(bundle, assets, &table, drawables, "drawable");
- if (err != NO_ERROR) {
- hasErrors = true;
- }
- } else {
- hasErrors = true;
- }
- }
-
- if (mipmaps != NULL) {
- if (bundle->getOutputAPKFile() != NULL) {
- err = preProcessImages(bundle, assets, mipmaps, "mipmap");
- }
- if (err == NO_ERROR) {
- err = makeFileResources(bundle, assets, &table, mipmaps, "mipmap");
- if (err != NO_ERROR) {
- hasErrors = true;
- }
- } else {
- hasErrors = true;
- }
- }
-
- if (layouts != NULL) {
- err = makeFileResources(bundle, assets, &table, layouts, "layout");
- if (err != NO_ERROR) {
- hasErrors = true;
- }
- }
-
- if (anims != NULL) {
- err = makeFileResources(bundle, assets, &table, anims, "anim");
- if (err != NO_ERROR) {
- hasErrors = true;
- }
- }
-
- if (animators != NULL) {
- err = makeFileResources(bundle, assets, &table, animators, "animator");
- if (err != NO_ERROR) {
- hasErrors = true;
- }
- }
-
- if (transitions != NULL) {
- err = makeFileResources(bundle, assets, &table, transitions, "transition");
- if (err != NO_ERROR) {
- hasErrors = true;
- }
- }
-
- if (interpolators != NULL) {
- err = makeFileResources(bundle, assets, &table, interpolators, "interpolator");
- if (err != NO_ERROR) {
- hasErrors = true;
- }
- }
-
- if (xmls != NULL) {
- err = makeFileResources(bundle, assets, &table, xmls, "xml");
- if (err != NO_ERROR) {
- hasErrors = true;
- }
- }
-
- if (raws != NULL) {
- err = makeFileResources(bundle, assets, &table, raws, "raw");
- if (err != 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) {
- err = makeFileResources(bundle, assets, &table, colors, "color");
- if (err != NO_ERROR) {
- hasErrors = true;
- }
- }
-
- if (menus != NULL) {
- err = makeFileResources(bundle, assets, &table, menus, "menu");
- if (err != NO_ERROR) {
- hasErrors = true;
- }
- }
-
- // --------------------------------------------------------------------
- // Assignment of resource IDs and initial generation of resource table.
- // --------------------------------------------------------------------
-
- if (table.hasResources()) {
- sp<AaptFile> resFile(getResourceFile(assets));
- if (resFile == NULL) {
- fprintf(stderr, "Error: unable to generate entry for resource data\n");
- return UNKNOWN_ERROR;
- }
-
- err = table.assignResourceIds();
- if (err < NO_ERROR) {
- return err;
- }
- }
-
- // --------------------------------------------------------------
- // Finally, we can now we can compile XML files, which may reference
- // resources.
- // --------------------------------------------------------------
-
- if (layouts != NULL) {
- ResourceDirIterator it(layouts, String8("layout"));
- while ((err=it.next()) == NO_ERROR) {
- String8 src = it.getFile()->getPrintableSource();
- err = compileXmlFile(assets, it.getFile(), &table, xmlFlags);
- if (err == NO_ERROR) {
- ResXMLTree block;
- block.setTo(it.getFile()->getData(), it.getFile()->getSize(), true);
- checkForIds(src, block);
- } else {
- hasErrors = true;
- }
- }
-
- if (err < NO_ERROR) {
- hasErrors = true;
- }
- err = NO_ERROR;
- }
-
- if (anims != NULL) {
- ResourceDirIterator it(anims, String8("anim"));
- while ((err=it.next()) == NO_ERROR) {
- err = compileXmlFile(assets, it.getFile(), &table, xmlFlags);
- if (err != NO_ERROR) {
- hasErrors = true;
- }
- }
-
- if (err < NO_ERROR) {
- hasErrors = true;
- }
- err = NO_ERROR;
- }
-
- if (animators != NULL) {
- ResourceDirIterator it(animators, String8("animator"));
- while ((err=it.next()) == NO_ERROR) {
- err = compileXmlFile(assets, it.getFile(), &table, xmlFlags);
- if (err != NO_ERROR) {
- hasErrors = true;
- }
- }
-
- if (err < NO_ERROR) {
- hasErrors = true;
- }
- err = NO_ERROR;
- }
-
- if (interpolators != NULL) {
- ResourceDirIterator it(interpolators, String8("interpolator"));
- while ((err=it.next()) == NO_ERROR) {
- err = compileXmlFile(assets, it.getFile(), &table, xmlFlags);
- if (err != NO_ERROR) {
- hasErrors = true;
- }
- }
-
- if (err < NO_ERROR) {
- hasErrors = true;
- }
- err = NO_ERROR;
- }
-
- if (transitions != NULL) {
- ResourceDirIterator it(transitions, String8("transition"));
- while ((err=it.next()) == NO_ERROR) {
- err = compileXmlFile(assets, it.getFile(), &table, xmlFlags);
- if (err != NO_ERROR) {
- hasErrors = true;
- }
- }
-
- if (err < NO_ERROR) {
- hasErrors = true;
- }
- err = NO_ERROR;
- }
-
- if (xmls != NULL) {
- ResourceDirIterator it(xmls, String8("xml"));
- while ((err=it.next()) == NO_ERROR) {
- err = compileXmlFile(assets, it.getFile(), &table, xmlFlags);
- if (err != NO_ERROR) {
- hasErrors = true;
- }
- }
-
- if (err < NO_ERROR) {
- hasErrors = true;
- }
- err = NO_ERROR;
- }
-
- if (drawables != NULL) {
- err = postProcessImages(assets, &table, drawables);
- if (err != NO_ERROR) {
- hasErrors = true;
- }
- }
-
- if (colors != NULL) {
- ResourceDirIterator it(colors, String8("color"));
- while ((err=it.next()) == NO_ERROR) {
- err = compileXmlFile(assets, it.getFile(), &table, xmlFlags);
- if (err != NO_ERROR) {
- hasErrors = true;
- }
- }
-
- if (err < NO_ERROR) {
- hasErrors = true;
- }
- err = NO_ERROR;
- }
-
- if (menus != NULL) {
- ResourceDirIterator it(menus, String8("menu"));
- while ((err=it.next()) == NO_ERROR) {
- String8 src = it.getFile()->getPrintableSource();
- err = compileXmlFile(assets, it.getFile(), &table, xmlFlags);
- if (err != NO_ERROR) {
- hasErrors = true;
- }
- ResXMLTree block;
- block.setTo(it.getFile()->getData(), it.getFile()->getSize(), true);
- checkForIds(src, block);
- }
-
- if (err < NO_ERROR) {
- hasErrors = true;
- }
- err = NO_ERROR;
- }
-
- if (table.validateLocalizations()) {
- hasErrors = true;
- }
-
- if (hasErrors) {
- return UNKNOWN_ERROR;
- }
-
- const sp<AaptFile> manifestFile(androidManifestFile->getFiles().valueAt(0));
- String8 manifestPath(manifestFile->getPrintableSource());
-
- // Generate final compiled manifest file.
- manifestFile->clearData();
- sp<XMLNode> manifestTree = XMLNode::parse(manifestFile);
- if (manifestTree == NULL) {
- return UNKNOWN_ERROR;
- }
- err = massageManifest(bundle, manifestTree);
- if (err < NO_ERROR) {
- return err;
- }
- err = compileXmlFile(assets, manifestTree, manifestFile, &table);
- if (err < NO_ERROR) {
- return err;
- }
-
- //block.restart();
- //printXMLBlock(&block);
-
- // --------------------------------------------------------------
- // Generate the final resource table.
- // Re-flatten because we may have added new resource IDs
- // --------------------------------------------------------------
-
- ResTable finalResTable;
- sp<AaptFile> resFile;
-
- if (table.hasResources()) {
- sp<AaptSymbols> symbols = assets->getSymbolsFor(String8("R"));
- err = table.addSymbols(symbols);
- if (err < NO_ERROR) {
- return err;
- }
-
- resFile = getResourceFile(assets);
- if (resFile == NULL) {
- fprintf(stderr, "Error: unable to generate entry for resource data\n");
- return UNKNOWN_ERROR;
- }
-
- err = table.flatten(bundle, resFile);
- if (err < NO_ERROR) {
- return err;
- }
-
- if (bundle->getPublicOutputFile()) {
- FILE* fp = fopen(bundle->getPublicOutputFile(), "w+");
- if (fp == NULL) {
- fprintf(stderr, "ERROR: Unable to open public definitions output file %s: %s\n",
- (const char*)bundle->getPublicOutputFile(), strerror(errno));
- return UNKNOWN_ERROR;
- }
- if (bundle->getVerbose()) {
- printf(" Writing public definitions to %s.\n", bundle->getPublicOutputFile());
- }
- table.writePublicDefinitions(String16(assets->getPackage()), fp);
- fclose(fp);
- }
-
- // Read resources back in,
- finalResTable.add(resFile->getData(), resFile->getSize(), NULL);
-
-#if 0
- NOISY(
- printf("Generated resources:\n");
- finalResTable.print();
- )
-#endif
- }
-
- // Perform a basic validation of the manifest file. This time we
- // parse it with the comments intact, so that we can use them to
- // generate java docs... so we are not going to write this one
- // back out to the final manifest data.
- sp<AaptFile> outManifestFile = new AaptFile(manifestFile->getSourceFile(),
- manifestFile->getGroupEntry(),
- manifestFile->getResourceType());
- err = compileXmlFile(assets, manifestFile,
- outManifestFile, &table,
- XML_COMPILE_ASSIGN_ATTRIBUTE_IDS
- | XML_COMPILE_STRIP_WHITESPACE | XML_COMPILE_STRIP_RAW_VALUES);
- if (err < NO_ERROR) {
- return err;
- }
- ResXMLTree block;
- block.setTo(outManifestFile->getData(), outManifestFile->getSize(), true);
- String16 manifest16("manifest");
- String16 permission16("permission");
- String16 permission_group16("permission-group");
- String16 uses_permission16("uses-permission");
- String16 instrumentation16("instrumentation");
- String16 application16("application");
- String16 provider16("provider");
- String16 service16("service");
- String16 receiver16("receiver");
- String16 activity16("activity");
- String16 action16("action");
- String16 category16("category");
- String16 data16("scheme");
- const char* packageIdentChars = "abcdefghijklmnopqrstuvwxyz"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZ._0123456789";
- const char* packageIdentCharsWithTheStupid = "abcdefghijklmnopqrstuvwxyz"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZ._0123456789-";
- const char* classIdentChars = "abcdefghijklmnopqrstuvwxyz"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZ._0123456789$";
- const char* processIdentChars = "abcdefghijklmnopqrstuvwxyz"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZ._0123456789:";
- const char* authoritiesIdentChars = "abcdefghijklmnopqrstuvwxyz"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZ._0123456789-:;";
- const char* typeIdentChars = "abcdefghijklmnopqrstuvwxyz"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZ._0123456789:-/*+";
- const char* schemeIdentChars = "abcdefghijklmnopqrstuvwxyz"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZ._0123456789-";
- ResXMLTree::event_code_t code;
- sp<AaptSymbols> permissionSymbols;
- sp<AaptSymbols> permissionGroupSymbols;
- while ((code=block.next()) != ResXMLTree::END_DOCUMENT
- && code > ResXMLTree::BAD_DOCUMENT) {
- if (code == ResXMLTree::START_TAG) {
- size_t len;
- if (block.getElementNamespace(&len) != NULL) {
- continue;
- }
- if (strcmp16(block.getElementName(&len), manifest16.string()) == 0) {
- if (validateAttr(manifestPath, finalResTable, block, NULL, "package",
- packageIdentChars, true) != ATTR_OKAY) {
- hasErrors = true;
- }
- if (validateAttr(manifestPath, finalResTable, block, RESOURCES_ANDROID_NAMESPACE,
- "sharedUserId", packageIdentChars, false) != ATTR_OKAY) {
- hasErrors = true;
- }
- } else if (strcmp16(block.getElementName(&len), permission16.string()) == 0
- || strcmp16(block.getElementName(&len), permission_group16.string()) == 0) {
- const bool isGroup = strcmp16(block.getElementName(&len),
- permission_group16.string()) == 0;
- if (validateAttr(manifestPath, finalResTable, block, RESOURCES_ANDROID_NAMESPACE,
- "name", isGroup ? packageIdentCharsWithTheStupid
- : packageIdentChars, true) != ATTR_OKAY) {
- hasErrors = true;
- }
- SourcePos srcPos(manifestPath, block.getLineNumber());
- sp<AaptSymbols> syms;
- if (!isGroup) {
- syms = permissionSymbols;
- if (syms == NULL) {
- sp<AaptSymbols> symbols =
- assets->getSymbolsFor(String8("Manifest"));
- syms = permissionSymbols = symbols->addNestedSymbol(
- String8("permission"), srcPos);
- }
- } else {
- syms = permissionGroupSymbols;
- if (syms == NULL) {
- sp<AaptSymbols> symbols =
- assets->getSymbolsFor(String8("Manifest"));
- syms = permissionGroupSymbols = symbols->addNestedSymbol(
- String8("permission_group"), srcPos);
- }
- }
- size_t len;
- ssize_t index = block.indexOfAttribute(RESOURCES_ANDROID_NAMESPACE, "name");
- const uint16_t* id = block.getAttributeStringValue(index, &len);
- if (id == NULL) {
- fprintf(stderr, "%s:%d: missing name attribute in element <%s>.\n",
- manifestPath.string(), block.getLineNumber(),
- String8(block.getElementName(&len)).string());
- hasErrors = true;
- break;
- }
- String8 idStr(id);
- char* p = idStr.lockBuffer(idStr.size());
- char* e = p + idStr.size();
- bool begins_with_digit = true; // init to true so an empty string fails
- while (e > p) {
- e--;
- if (*e >= '0' && *e <= '9') {
- begins_with_digit = true;
- continue;
- }
- if ((*e >= 'a' && *e <= 'z') ||
- (*e >= 'A' && *e <= 'Z') ||
- (*e == '_')) {
- begins_with_digit = false;
- continue;
- }
- if (isGroup && (*e == '-')) {
- *e = '_';
- begins_with_digit = false;
- continue;
- }
- e++;
- break;
- }
- idStr.unlockBuffer();
- // verify that we stopped because we hit a period or
- // the beginning of the string, and that the
- // identifier didn't begin with a digit.
- if (begins_with_digit || (e != p && *(e-1) != '.')) {
- fprintf(stderr,
- "%s:%d: Permission name <%s> is not a valid Java symbol\n",
- manifestPath.string(), block.getLineNumber(), idStr.string());
- hasErrors = true;
- }
- syms->addStringSymbol(String8(e), idStr, srcPos);
- const uint16_t* cmt = block.getComment(&len);
- if (cmt != NULL && *cmt != 0) {
- //printf("Comment of %s: %s\n", String8(e).string(),
- // String8(cmt).string());
- syms->appendComment(String8(e), String16(cmt), srcPos);
- } else {
- //printf("No comment for %s\n", String8(e).string());
- }
- syms->makeSymbolPublic(String8(e), srcPos);
- } else if (strcmp16(block.getElementName(&len), uses_permission16.string()) == 0) {
- if (validateAttr(manifestPath, finalResTable, block, RESOURCES_ANDROID_NAMESPACE,
- "name", packageIdentChars, true) != ATTR_OKAY) {
- hasErrors = true;
- }
- } else if (strcmp16(block.getElementName(&len), instrumentation16.string()) == 0) {
- if (validateAttr(manifestPath, finalResTable, block, RESOURCES_ANDROID_NAMESPACE,
- "name", classIdentChars, true) != ATTR_OKAY) {
- hasErrors = true;
- }
- if (validateAttr(manifestPath, finalResTable, block,
- RESOURCES_ANDROID_NAMESPACE, "targetPackage",
- packageIdentChars, true) != ATTR_OKAY) {
- hasErrors = true;
- }
- } else if (strcmp16(block.getElementName(&len), application16.string()) == 0) {
- if (validateAttr(manifestPath, finalResTable, block, RESOURCES_ANDROID_NAMESPACE,
- "name", classIdentChars, false) != ATTR_OKAY) {
- hasErrors = true;
- }
- if (validateAttr(manifestPath, finalResTable, block,
- RESOURCES_ANDROID_NAMESPACE, "permission",
- packageIdentChars, false) != ATTR_OKAY) {
- hasErrors = true;
- }
- if (validateAttr(manifestPath, finalResTable, block,
- RESOURCES_ANDROID_NAMESPACE, "process",
- processIdentChars, false) != ATTR_OKAY) {
- hasErrors = true;
- }
- if (validateAttr(manifestPath, finalResTable, block,
- RESOURCES_ANDROID_NAMESPACE, "taskAffinity",
- processIdentChars, false) != ATTR_OKAY) {
- hasErrors = true;
- }
- } else if (strcmp16(block.getElementName(&len), provider16.string()) == 0) {
- if (validateAttr(manifestPath, finalResTable, block, RESOURCES_ANDROID_NAMESPACE,
- "name", classIdentChars, true) != ATTR_OKAY) {
- hasErrors = true;
- }
- if (validateAttr(manifestPath, finalResTable, block,
- RESOURCES_ANDROID_NAMESPACE, "authorities",
- authoritiesIdentChars, true) != ATTR_OKAY) {
- hasErrors = true;
- }
- if (validateAttr(manifestPath, finalResTable, block,
- RESOURCES_ANDROID_NAMESPACE, "permission",
- packageIdentChars, false) != ATTR_OKAY) {
- hasErrors = true;
- }
- if (validateAttr(manifestPath, finalResTable, block,
- RESOURCES_ANDROID_NAMESPACE, "process",
- processIdentChars, false) != ATTR_OKAY) {
- hasErrors = true;
- }
- } else if (strcmp16(block.getElementName(&len), service16.string()) == 0
- || strcmp16(block.getElementName(&len), receiver16.string()) == 0
- || strcmp16(block.getElementName(&len), activity16.string()) == 0) {
- if (validateAttr(manifestPath, finalResTable, block, RESOURCES_ANDROID_NAMESPACE,
- "name", classIdentChars, true) != ATTR_OKAY) {
- hasErrors = true;
- }
- if (validateAttr(manifestPath, finalResTable, block,
- RESOURCES_ANDROID_NAMESPACE, "permission",
- packageIdentChars, false) != ATTR_OKAY) {
- hasErrors = true;
- }
- if (validateAttr(manifestPath, finalResTable, block,
- RESOURCES_ANDROID_NAMESPACE, "process",
- processIdentChars, false) != ATTR_OKAY) {
- hasErrors = true;
- }
- if (validateAttr(manifestPath, finalResTable, block,
- RESOURCES_ANDROID_NAMESPACE, "taskAffinity",
- processIdentChars, false) != ATTR_OKAY) {
- hasErrors = true;
- }
- } else if (strcmp16(block.getElementName(&len), action16.string()) == 0
- || strcmp16(block.getElementName(&len), category16.string()) == 0) {
- if (validateAttr(manifestPath, finalResTable, block,
- RESOURCES_ANDROID_NAMESPACE, "name",
- packageIdentChars, true) != ATTR_OKAY) {
- hasErrors = true;
- }
- } else if (strcmp16(block.getElementName(&len), data16.string()) == 0) {
- if (validateAttr(manifestPath, finalResTable, block,
- RESOURCES_ANDROID_NAMESPACE, "mimeType",
- typeIdentChars, true) != ATTR_OKAY) {
- hasErrors = true;
- }
- if (validateAttr(manifestPath, finalResTable, block,
- RESOURCES_ANDROID_NAMESPACE, "scheme",
- schemeIdentChars, true) != ATTR_OKAY) {
- hasErrors = true;
- }
- }
- }
- }
-
- if (resFile != NULL) {
- // These resources are now considered to be a part of the included
- // resources, for others to reference.
- err = assets->addIncludedResources(resFile);
- if (err < NO_ERROR) {
- fprintf(stderr, "ERROR: Unable to parse generated resources, aborting.\n");
- return err;
- }
- }
-
- return err;
-}
-
-static const char* getIndentSpace(int indent)
-{
-static const char whitespace[] =
-" ";
-
- return whitespace + sizeof(whitespace) - 1 - indent*4;
-}
-
-static String8 flattenSymbol(const String8& symbol) {
- String8 result(symbol);
- ssize_t first;
- if ((first = symbol.find(":", 0)) >= 0
- || (first = symbol.find(".", 0)) >= 0) {
- size_t size = symbol.size();
- char* buf = result.lockBuffer(size);
- for (size_t i = first; i < size; i++) {
- if (buf[i] == ':' || buf[i] == '.') {
- buf[i] = '_';
- }
- }
- result.unlockBuffer(size);
- }
- return result;
-}
-
-static String8 getSymbolPackage(const String8& symbol, const sp<AaptAssets>& assets, bool pub) {
- ssize_t colon = symbol.find(":", 0);
- if (colon >= 0) {
- return String8(symbol.string(), colon);
- }
- return pub ? assets->getPackage() : assets->getSymbolsPrivatePackage();
-}
-
-static String8 getSymbolName(const String8& symbol) {
- ssize_t colon = symbol.find(":", 0);
- if (colon >= 0) {
- return String8(symbol.string() + colon + 1);
- }
- return symbol;
-}
-
-static String16 getAttributeComment(const sp<AaptAssets>& assets,
- const String8& name,
- String16* outTypeComment = NULL)
-{
- sp<AaptSymbols> asym = assets->getSymbolsFor(String8("R"));
- if (asym != NULL) {
- //printf("Got R symbols!\n");
- asym = asym->getNestedSymbols().valueFor(String8("attr"));
- if (asym != NULL) {
- //printf("Got attrs symbols! comment %s=%s\n",
- // name.string(), String8(asym->getComment(name)).string());
- if (outTypeComment != NULL) {
- *outTypeComment = asym->getTypeComment(name);
- }
- return asym->getComment(name);
- }
- }
- return String16();
-}
-
-static status_t writeLayoutClasses(
- FILE* fp, const sp<AaptAssets>& assets,
- const sp<AaptSymbols>& symbols, int indent, bool includePrivate)
-{
- const char* indentStr = getIndentSpace(indent);
- if (!includePrivate) {
- fprintf(fp, "%s/** @doconly */\n", indentStr);
- }
- fprintf(fp, "%spublic static final class styleable {\n", indentStr);
- indent++;
-
- String16 attr16("attr");
- String16 package16(assets->getPackage());
-
- indentStr = getIndentSpace(indent);
- bool hasErrors = false;
-
- size_t i;
- size_t N = symbols->getNestedSymbols().size();
- for (i=0; i<N; i++) {
- sp<AaptSymbols> nsymbols = symbols->getNestedSymbols().valueAt(i);
- String8 realClassName(symbols->getNestedSymbols().keyAt(i));
- String8 nclassName(flattenSymbol(realClassName));
-
- SortedVector<uint32_t> idents;
- Vector<uint32_t> origOrder;
- Vector<bool> publicFlags;
-
- size_t a;
- size_t NA = nsymbols->getSymbols().size();
- for (a=0; a<NA; a++) {
- const AaptSymbolEntry& sym(nsymbols->getSymbols().valueAt(a));
- int32_t code = sym.typeCode == AaptSymbolEntry::TYPE_INT32
- ? sym.int32Val : 0;
- bool isPublic = true;
- if (code == 0) {
- String16 name16(sym.name);
- uint32_t typeSpecFlags;
- code = assets->getIncludedResources().identifierForName(
- name16.string(), name16.size(),
- attr16.string(), attr16.size(),
- package16.string(), package16.size(), &typeSpecFlags);
- if (code == 0) {
- fprintf(stderr, "ERROR: In <declare-styleable> %s, unable to find attribute %s\n",
- nclassName.string(), sym.name.string());
- hasErrors = true;
- }
- isPublic = (typeSpecFlags&ResTable_typeSpec::SPEC_PUBLIC) != 0;
- }
- idents.add(code);
- origOrder.add(code);
- publicFlags.add(isPublic);
- }
-
- NA = idents.size();
-
- bool deprecated = false;
-
- String16 comment = symbols->getComment(realClassName);
- fprintf(fp, "%s/** ", indentStr);
- if (comment.size() > 0) {
- String8 cmt(comment);
- fprintf(fp, "%s\n", cmt.string());
- if (strstr(cmt.string(), "@deprecated") != NULL) {
- deprecated = true;
- }
- } else {
- fprintf(fp, "Attributes that can be used with a %s.\n", nclassName.string());
- }
- bool hasTable = false;
- for (a=0; a<NA; a++) {
- ssize_t pos = idents.indexOf(origOrder.itemAt(a));
- if (pos >= 0) {
- if (!hasTable) {
- hasTable = true;
- fprintf(fp,
- "%s <p>Includes the following attributes:</p>\n"
- "%s <table>\n"
- "%s <colgroup align=\"left\" />\n"
- "%s <colgroup align=\"left\" />\n"
- "%s <tr><th>Attribute</th><th>Description</th></tr>\n",
- indentStr,
- indentStr,
- indentStr,
- indentStr,
- indentStr);
- }
- const AaptSymbolEntry& sym = nsymbols->getSymbols().valueAt(a);
- if (!publicFlags.itemAt(a) && !includePrivate) {
- continue;
- }
- String8 name8(sym.name);
- String16 comment(sym.comment);
- if (comment.size() <= 0) {
- comment = getAttributeComment(assets, name8);
- }
- if (comment.size() > 0) {
- const char16_t* p = comment.string();
- while (*p != 0 && *p != '.') {
- if (*p == '{') {
- while (*p != 0 && *p != '}') {
- p++;
- }
- } else {
- p++;
- }
- }
- if (*p == '.') {
- p++;
- }
- comment = String16(comment.string(), p-comment.string());
- }
- fprintf(fp, "%s <tr><td><code>{@link #%s_%s %s:%s}</code></td><td>%s</td></tr>\n",
- indentStr, nclassName.string(),
- flattenSymbol(name8).string(),
- getSymbolPackage(name8, assets, true).string(),
- getSymbolName(name8).string(),
- String8(comment).string());
- }
- }
- if (hasTable) {
- fprintf(fp, "%s </table>\n", indentStr);
- }
- for (a=0; a<NA; a++) {
- ssize_t pos = idents.indexOf(origOrder.itemAt(a));
- if (pos >= 0) {
- const AaptSymbolEntry& sym = nsymbols->getSymbols().valueAt(a);
- if (!publicFlags.itemAt(a) && !includePrivate) {
- continue;
- }
- fprintf(fp, "%s @see #%s_%s\n",
- indentStr, nclassName.string(),
- flattenSymbol(sym.name).string());
- }
- }
- fprintf(fp, "%s */\n", getIndentSpace(indent));
-
- if (deprecated) {
- fprintf(fp, "%s@Deprecated\n", indentStr);
- }
-
- fprintf(fp,
- "%spublic static final int[] %s = {\n"
- "%s",
- indentStr, nclassName.string(),
- getIndentSpace(indent+1));
-
- for (a=0; a<NA; a++) {
- if (a != 0) {
- if ((a&3) == 0) {
- fprintf(fp, ",\n%s", getIndentSpace(indent+1));
- } else {
- fprintf(fp, ", ");
- }
- }
- fprintf(fp, "0x%08x", idents[a]);
- }
-
- fprintf(fp, "\n%s};\n", indentStr);
-
- for (a=0; a<NA; a++) {
- ssize_t pos = idents.indexOf(origOrder.itemAt(a));
- if (pos >= 0) {
- const AaptSymbolEntry& sym = nsymbols->getSymbols().valueAt(a);
- if (!publicFlags.itemAt(a) && !includePrivate) {
- continue;
- }
- String8 name8(sym.name);
- String16 comment(sym.comment);
- String16 typeComment;
- if (comment.size() <= 0) {
- comment = getAttributeComment(assets, name8, &typeComment);
- } else {
- getAttributeComment(assets, name8, &typeComment);
- }
-
- uint32_t typeSpecFlags = 0;
- String16 name16(sym.name);
- assets->getIncludedResources().identifierForName(
- name16.string(), name16.size(),
- attr16.string(), attr16.size(),
- package16.string(), package16.size(), &typeSpecFlags);
- //printf("%s:%s/%s: 0x%08x\n", String8(package16).string(),
- // String8(attr16).string(), String8(name16).string(), typeSpecFlags);
- const bool pub = (typeSpecFlags&ResTable_typeSpec::SPEC_PUBLIC) != 0;
-
- bool deprecated = false;
-
- fprintf(fp, "%s/**\n", indentStr);
- if (comment.size() > 0) {
- String8 cmt(comment);
- fprintf(fp, "%s <p>\n%s @attr description\n", indentStr, indentStr);
- fprintf(fp, "%s %s\n", indentStr, cmt.string());
- if (strstr(cmt.string(), "@deprecated") != NULL) {
- deprecated = true;
- }
- } else {
- fprintf(fp,
- "%s <p>This symbol is the offset where the {@link %s.R.attr#%s}\n"
- "%s attribute's value can be found in the {@link #%s} array.\n",
- indentStr,
- getSymbolPackage(name8, assets, pub).string(),
- getSymbolName(name8).string(),
- indentStr, nclassName.string());
- }
- if (typeComment.size() > 0) {
- String8 cmt(typeComment);
- fprintf(fp, "\n\n%s %s\n", indentStr, cmt.string());
- if (strstr(cmt.string(), "@deprecated") != NULL) {
- deprecated = true;
- }
- }
- if (comment.size() > 0) {
- if (pub) {
- fprintf(fp,
- "%s <p>This corresponds to the global attribute\n"
- "%s resource symbol {@link %s.R.attr#%s}.\n",
- indentStr, indentStr,
- getSymbolPackage(name8, assets, true).string(),
- getSymbolName(name8).string());
- } else {
- fprintf(fp,
- "%s <p>This is a private symbol.\n", indentStr);
- }
- }
- fprintf(fp, "%s @attr name %s:%s\n", indentStr,
- getSymbolPackage(name8, assets, pub).string(),
- getSymbolName(name8).string());
- fprintf(fp, "%s*/\n", indentStr);
- if (deprecated) {
- fprintf(fp, "%s@Deprecated\n", indentStr);
- }
- fprintf(fp,
- "%spublic static final int %s_%s = %d;\n",
- indentStr, nclassName.string(),
- flattenSymbol(name8).string(), (int)pos);
- }
- }
- }
-
- indent--;
- fprintf(fp, "%s};\n", getIndentSpace(indent));
- return hasErrors ? UNKNOWN_ERROR : NO_ERROR;
-}
-
-static status_t writeTextLayoutClasses(
- FILE* fp, const sp<AaptAssets>& assets,
- const sp<AaptSymbols>& symbols, bool includePrivate)
-{
- String16 attr16("attr");
- String16 package16(assets->getPackage());
-
- bool hasErrors = false;
-
- size_t i;
- size_t N = symbols->getNestedSymbols().size();
- for (i=0; i<N; i++) {
- sp<AaptSymbols> nsymbols = symbols->getNestedSymbols().valueAt(i);
- String8 realClassName(symbols->getNestedSymbols().keyAt(i));
- String8 nclassName(flattenSymbol(realClassName));
-
- SortedVector<uint32_t> idents;
- Vector<uint32_t> origOrder;
- Vector<bool> publicFlags;
-
- size_t a;
- size_t NA = nsymbols->getSymbols().size();
- for (a=0; a<NA; a++) {
- const AaptSymbolEntry& sym(nsymbols->getSymbols().valueAt(a));
- int32_t code = sym.typeCode == AaptSymbolEntry::TYPE_INT32
- ? sym.int32Val : 0;
- bool isPublic = true;
- if (code == 0) {
- String16 name16(sym.name);
- uint32_t typeSpecFlags;
- code = assets->getIncludedResources().identifierForName(
- name16.string(), name16.size(),
- attr16.string(), attr16.size(),
- package16.string(), package16.size(), &typeSpecFlags);
- if (code == 0) {
- fprintf(stderr, "ERROR: In <declare-styleable> %s, unable to find attribute %s\n",
- nclassName.string(), sym.name.string());
- hasErrors = true;
- }
- isPublic = (typeSpecFlags&ResTable_typeSpec::SPEC_PUBLIC) != 0;
- }
- idents.add(code);
- origOrder.add(code);
- publicFlags.add(isPublic);
- }
-
- NA = idents.size();
-
- fprintf(fp, "int[] styleable %s {", nclassName.string());
-
- for (a=0; a<NA; a++) {
- if (a != 0) {
- fprintf(fp, ",");
- }
- fprintf(fp, " 0x%08x", idents[a]);
- }
-
- fprintf(fp, " }\n");
-
- for (a=0; a<NA; a++) {
- ssize_t pos = idents.indexOf(origOrder.itemAt(a));
- if (pos >= 0) {
- const AaptSymbolEntry& sym = nsymbols->getSymbols().valueAt(a);
- if (!publicFlags.itemAt(a) && !includePrivate) {
- continue;
- }
- String8 name8(sym.name);
- String16 comment(sym.comment);
- String16 typeComment;
- if (comment.size() <= 0) {
- comment = getAttributeComment(assets, name8, &typeComment);
- } else {
- getAttributeComment(assets, name8, &typeComment);
- }
-
- uint32_t typeSpecFlags = 0;
- String16 name16(sym.name);
- assets->getIncludedResources().identifierForName(
- name16.string(), name16.size(),
- attr16.string(), attr16.size(),
- package16.string(), package16.size(), &typeSpecFlags);
- //printf("%s:%s/%s: 0x%08x\n", String8(package16).string(),
- // String8(attr16).string(), String8(name16).string(), typeSpecFlags);
- const bool pub = (typeSpecFlags&ResTable_typeSpec::SPEC_PUBLIC) != 0;
-
- fprintf(fp,
- "int styleable %s_%s %d\n",
- nclassName.string(),
- flattenSymbol(name8).string(), (int)pos);
- }
- }
- }
-
- return hasErrors ? UNKNOWN_ERROR : NO_ERROR;
-}
-
-static status_t writeSymbolClass(
- FILE* fp, const sp<AaptAssets>& assets, bool includePrivate,
- const sp<AaptSymbols>& symbols, const String8& className, int indent,
- bool nonConstantId)
-{
- fprintf(fp, "%spublic %sfinal class %s {\n",
- getIndentSpace(indent),
- indent != 0 ? "static " : "", className.string());
- indent++;
-
- size_t i;
- status_t err = NO_ERROR;
-
- const char * id_format = nonConstantId ?
- "%spublic static int %s=0x%08x;\n" :
- "%spublic static final int %s=0x%08x;\n";
-
- size_t N = symbols->getSymbols().size();
- for (i=0; i<N; i++) {
- const AaptSymbolEntry& sym = symbols->getSymbols().valueAt(i);
- if (sym.typeCode != AaptSymbolEntry::TYPE_INT32) {
- continue;
- }
- if (!assets->isJavaSymbol(sym, includePrivate)) {
- continue;
- }
- String8 name8(sym.name);
- String16 comment(sym.comment);
- bool haveComment = false;
- bool deprecated = false;
- if (comment.size() > 0) {
- haveComment = true;
- String8 cmt(comment);
- fprintf(fp,
- "%s/** %s\n",
- getIndentSpace(indent), cmt.string());
- if (strstr(cmt.string(), "@deprecated") != NULL) {
- deprecated = true;
- }
- } else if (sym.isPublic && !includePrivate) {
- sym.sourcePos.warning("No comment for public symbol %s:%s/%s",
- assets->getPackage().string(), className.string(),
- String8(sym.name).string());
- }
- String16 typeComment(sym.typeComment);
- if (typeComment.size() > 0) {
- String8 cmt(typeComment);
- if (!haveComment) {
- haveComment = true;
- fprintf(fp,
- "%s/** %s\n", getIndentSpace(indent), cmt.string());
- } else {
- fprintf(fp,
- "%s %s\n", getIndentSpace(indent), cmt.string());
- }
- if (strstr(cmt.string(), "@deprecated") != NULL) {
- deprecated = true;
- }
- }
- if (haveComment) {
- fprintf(fp,"%s */\n", getIndentSpace(indent));
- }
- if (deprecated) {
- fprintf(fp, "%s@Deprecated\n", getIndentSpace(indent));
- }
- fprintf(fp, id_format,
- getIndentSpace(indent),
- flattenSymbol(name8).string(), (int)sym.int32Val);
- }
-
- for (i=0; i<N; i++) {
- const AaptSymbolEntry& sym = symbols->getSymbols().valueAt(i);
- if (sym.typeCode != AaptSymbolEntry::TYPE_STRING) {
- continue;
- }
- if (!assets->isJavaSymbol(sym, includePrivate)) {
- continue;
- }
- String8 name8(sym.name);
- String16 comment(sym.comment);
- bool deprecated = false;
- if (comment.size() > 0) {
- String8 cmt(comment);
- fprintf(fp,
- "%s/** %s\n"
- "%s */\n",
- getIndentSpace(indent), cmt.string(),
- getIndentSpace(indent));
- if (strstr(cmt.string(), "@deprecated") != NULL) {
- deprecated = true;
- }
- } else if (sym.isPublic && !includePrivate) {
- sym.sourcePos.warning("No comment for public symbol %s:%s/%s",
- assets->getPackage().string(), className.string(),
- String8(sym.name).string());
- }
- if (deprecated) {
- fprintf(fp, "%s@Deprecated\n", getIndentSpace(indent));
- }
- fprintf(fp, "%spublic static final String %s=\"%s\";\n",
- getIndentSpace(indent),
- flattenSymbol(name8).string(), sym.stringVal.string());
- }
-
- sp<AaptSymbols> styleableSymbols;
-
- N = symbols->getNestedSymbols().size();
- for (i=0; i<N; i++) {
- sp<AaptSymbols> nsymbols = symbols->getNestedSymbols().valueAt(i);
- String8 nclassName(symbols->getNestedSymbols().keyAt(i));
- if (nclassName == "styleable") {
- styleableSymbols = nsymbols;
- } else {
- err = writeSymbolClass(fp, assets, includePrivate, nsymbols, nclassName, indent, nonConstantId);
- }
- if (err != NO_ERROR) {
- return err;
- }
- }
-
- if (styleableSymbols != NULL) {
- err = writeLayoutClasses(fp, assets, styleableSymbols, indent, includePrivate);
- if (err != NO_ERROR) {
- return err;
- }
- }
-
- indent--;
- fprintf(fp, "%s}\n", getIndentSpace(indent));
- return NO_ERROR;
-}
-
-static status_t writeTextSymbolClass(
- FILE* fp, const sp<AaptAssets>& assets, bool includePrivate,
- const sp<AaptSymbols>& symbols, const String8& className)
-{
- size_t i;
- status_t err = NO_ERROR;
-
- size_t N = symbols->getSymbols().size();
- for (i=0; i<N; i++) {
- const AaptSymbolEntry& sym = symbols->getSymbols().valueAt(i);
- if (sym.typeCode != AaptSymbolEntry::TYPE_INT32) {
- continue;
- }
-
- if (!assets->isJavaSymbol(sym, includePrivate)) {
- continue;
- }
-
- String8 name8(sym.name);
- fprintf(fp, "int %s %s 0x%08x\n",
- className.string(),
- flattenSymbol(name8).string(), (int)sym.int32Val);
- }
-
- N = symbols->getNestedSymbols().size();
- for (i=0; i<N; i++) {
- sp<AaptSymbols> nsymbols = symbols->getNestedSymbols().valueAt(i);
- String8 nclassName(symbols->getNestedSymbols().keyAt(i));
- if (nclassName == "styleable") {
- err = writeTextLayoutClasses(fp, assets, nsymbols, includePrivate);
- } else {
- err = writeTextSymbolClass(fp, assets, includePrivate, nsymbols, nclassName);
- }
- if (err != NO_ERROR) {
- return err;
- }
- }
-
- return NO_ERROR;
-}
-
-status_t writeResourceSymbols(Bundle* bundle, const sp<AaptAssets>& assets,
- const String8& package, bool includePrivate)
-{
- if (!bundle->getRClassDir()) {
- return NO_ERROR;
- }
-
- const char* textSymbolsDest = bundle->getOutputTextSymbols();
-
- String8 R("R");
- const size_t N = assets->getSymbols().size();
- for (size_t i=0; i<N; i++) {
- sp<AaptSymbols> symbols = assets->getSymbols().valueAt(i);
- String8 className(assets->getSymbols().keyAt(i));
- String8 dest(bundle->getRClassDir());
-
- if (bundle->getMakePackageDirs()) {
- String8 pkg(package);
- const char* last = pkg.string();
- const char* s = last-1;
- do {
- s++;
- if (s > last && (*s == '.' || *s == 0)) {
- String8 part(last, s-last);
- dest.appendPath(part);
-#ifdef HAVE_MS_C_RUNTIME
- _mkdir(dest.string());
-#else
- mkdir(dest.string(), S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IXGRP);
-#endif
- last = s+1;
- }
- } while (*s);
- }
- dest.appendPath(className);
- dest.append(".java");
- FILE* fp = fopen(dest.string(), "w+");
- if (fp == NULL) {
- fprintf(stderr, "ERROR: Unable to open class file %s: %s\n",
- dest.string(), strerror(errno));
- return UNKNOWN_ERROR;
- }
- if (bundle->getVerbose()) {
- printf(" Writing symbols for class %s.\n", className.string());
- }
-
- fprintf(fp,
- "/* AUTO-GENERATED FILE. DO NOT MODIFY.\n"
- " *\n"
- " * This class was automatically generated by the\n"
- " * aapt tool from the resource data it found. It\n"
- " * should not be modified by hand.\n"
- " */\n"
- "\n"
- "package %s;\n\n", package.string());
-
- status_t err = writeSymbolClass(fp, assets, includePrivate, symbols,
- className, 0, bundle->getNonConstantId());
- fclose(fp);
- if (err != NO_ERROR) {
- return err;
- }
-
- if (textSymbolsDest != NULL && R == className) {
- String8 textDest(textSymbolsDest);
- textDest.appendPath(className);
- textDest.append(".txt");
-
- FILE* fp = fopen(textDest.string(), "w+");
- if (fp == NULL) {
- fprintf(stderr, "ERROR: Unable to open text symbol file %s: %s\n",
- textDest.string(), strerror(errno));
- return UNKNOWN_ERROR;
- }
- if (bundle->getVerbose()) {
- printf(" Writing text symbols for class %s.\n", className.string());
- }
-
- status_t err = writeTextSymbolClass(fp, assets, includePrivate, symbols,
- className);
- fclose(fp);
- if (err != NO_ERROR) {
- return err;
- }
- }
-
- // If we were asked to generate a dependency file, we'll go ahead and add this R.java
- // as a target in the dependency file right next to it.
- if (bundle->getGenDependencies() && R == className) {
- // Add this R.java to the dependency file
- String8 dependencyFile(bundle->getRClassDir());
- dependencyFile.appendPath("R.java.d");
-
- FILE *fp = fopen(dependencyFile.string(), "a");
- fprintf(fp,"%s \\\n", dest.string());
- fclose(fp);
- }
- }
-
- return NO_ERROR;
-}
-
-
-class ProguardKeepSet
-{
-public:
- // { rule --> { file locations } }
- KeyedVector<String8, SortedVector<String8> > rules;
-
- void add(const String8& rule, const String8& where);
-};
-
-void ProguardKeepSet::add(const String8& rule, const String8& where)
-{
- ssize_t index = rules.indexOfKey(rule);
- if (index < 0) {
- index = rules.add(rule, SortedVector<String8>());
- }
- rules.editValueAt(index).add(where);
-}
-
-void
-addProguardKeepRule(ProguardKeepSet* keep, const String8& inClassName,
- const char* pkg, const String8& srcName, int line)
-{
- String8 className(inClassName);
- if (pkg != NULL) {
- // asdf --> package.asdf
- // .asdf .a.b --> package.asdf package.a.b
- // asdf.adsf --> asdf.asdf
- const char* p = className.string();
- const char* q = strchr(p, '.');
- if (p == q) {
- className = pkg;
- className.append(inClassName);
- } else if (q == NULL) {
- className = pkg;
- className.append(".");
- className.append(inClassName);
- }
- }
-
- String8 rule("-keep class ");
- rule += className;
- rule += " { <init>(...); }";
-
- String8 location("view ");
- location += srcName;
- char lineno[20];
- sprintf(lineno, ":%d", line);
- location += lineno;
-
- keep->add(rule, location);
-}
-
-void
-addProguardKeepMethodRule(ProguardKeepSet* keep, const String8& memberName,
- const char* pkg, const String8& srcName, int line)
-{
- String8 rule("-keepclassmembers class * { *** ");
- rule += memberName;
- rule += "(...); }";
-
- String8 location("onClick ");
- location += srcName;
- char lineno[20];
- sprintf(lineno, ":%d", line);
- location += lineno;
-
- keep->add(rule, location);
-}
-
-status_t
-writeProguardForAndroidManifest(ProguardKeepSet* keep, const sp<AaptAssets>& assets)
-{
- status_t err;
- ResXMLTree tree;
- size_t len;
- ResXMLTree::event_code_t code;
- int depth = 0;
- bool inApplication = false;
- String8 error;
- sp<AaptGroup> assGroup;
- sp<AaptFile> assFile;
- String8 pkg;
-
- // First, look for a package file to parse. This is required to
- // be able to generate the resource information.
- assGroup = assets->getFiles().valueFor(String8("AndroidManifest.xml"));
- if (assGroup == NULL) {
- fprintf(stderr, "ERROR: No AndroidManifest.xml file found.\n");
- return -1;
- }
-
- if (assGroup->getFiles().size() != 1) {
- fprintf(stderr, "warning: Multiple AndroidManifest.xml files found, using %s\n",
- assGroup->getFiles().valueAt(0)->getPrintableSource().string());
- }
-
- assFile = assGroup->getFiles().valueAt(0);
-
- err = parseXMLResource(assFile, &tree);
- if (err != NO_ERROR) {
- return err;
- }
-
- tree.restart();
-
- while ((code=tree.next()) != ResXMLTree::END_DOCUMENT && code != ResXMLTree::BAD_DOCUMENT) {
- if (code == ResXMLTree::END_TAG) {
- if (/* name == "Application" && */ depth == 2) {
- inApplication = false;
- }
- depth--;
- continue;
- }
- if (code != ResXMLTree::START_TAG) {
- continue;
- }
- depth++;
- String8 tag(tree.getElementName(&len));
- // printf("Depth %d tag %s\n", depth, tag.string());
- bool keepTag = false;
- if (depth == 1) {
- if (tag != "manifest") {
- fprintf(stderr, "ERROR: manifest does not start with <manifest> tag\n");
- return -1;
- }
- pkg = getAttribute(tree, NULL, "package", NULL);
- } else if (depth == 2) {
- if (tag == "application") {
- inApplication = true;
- keepTag = true;
-
- String8 agent = getAttribute(tree, "http://schemas.android.com/apk/res/android",
- "backupAgent", &error);
- if (agent.length() > 0) {
- addProguardKeepRule(keep, agent, pkg.string(),
- assFile->getPrintableSource(), tree.getLineNumber());
- }
- } else if (tag == "instrumentation") {
- keepTag = true;
- }
- }
- if (!keepTag && inApplication && depth == 3) {
- if (tag == "activity" || tag == "service" || tag == "receiver" || tag == "provider") {
- keepTag = true;
- }
- }
- if (keepTag) {
- String8 name = getAttribute(tree, "http://schemas.android.com/apk/res/android",
- "name", &error);
- if (error != "") {
- fprintf(stderr, "ERROR: %s\n", error.string());
- return -1;
- }
- if (name.length() > 0) {
- addProguardKeepRule(keep, name, pkg.string(),
- assFile->getPrintableSource(), tree.getLineNumber());
- }
- }
- }
-
- return NO_ERROR;
-}
-
-struct NamespaceAttributePair {
- const char* ns;
- const char* attr;
-
- NamespaceAttributePair(const char* n, const char* a) : ns(n), attr(a) {}
- NamespaceAttributePair() : ns(NULL), attr(NULL) {}
-};
-
-status_t
-writeProguardForXml(ProguardKeepSet* keep, const sp<AaptFile>& layoutFile,
- const char* startTag, const KeyedVector<String8, Vector<NamespaceAttributePair> >* tagAttrPairs)
-{
- status_t err;
- ResXMLTree tree;
- size_t len;
- ResXMLTree::event_code_t code;
-
- err = parseXMLResource(layoutFile, &tree);
- if (err != NO_ERROR) {
- return err;
- }
-
- tree.restart();
-
- if (startTag != NULL) {
- bool haveStart = false;
- while ((code=tree.next()) != ResXMLTree::END_DOCUMENT && code != ResXMLTree::BAD_DOCUMENT) {
- if (code != ResXMLTree::START_TAG) {
- continue;
- }
- String8 tag(tree.getElementName(&len));
- if (tag == startTag) {
- haveStart = true;
- }
- break;
- }
- if (!haveStart) {
- return NO_ERROR;
- }
- }
-
- while ((code=tree.next()) != ResXMLTree::END_DOCUMENT && code != ResXMLTree::BAD_DOCUMENT) {
- if (code != ResXMLTree::START_TAG) {
- continue;
- }
- String8 tag(tree.getElementName(&len));
-
- // If there is no '.', we'll assume that it's one of the built in names.
- if (strchr(tag.string(), '.')) {
- addProguardKeepRule(keep, tag, NULL,
- layoutFile->getPrintableSource(), tree.getLineNumber());
- } else if (tagAttrPairs != NULL) {
- ssize_t tagIndex = tagAttrPairs->indexOfKey(tag);
- if (tagIndex >= 0) {
- const Vector<NamespaceAttributePair>& nsAttrVector = tagAttrPairs->valueAt(tagIndex);
- for (size_t i = 0; i < nsAttrVector.size(); i++) {
- const NamespaceAttributePair& nsAttr = nsAttrVector[i];
-
- ssize_t attrIndex = tree.indexOfAttribute(nsAttr.ns, nsAttr.attr);
- if (attrIndex < 0) {
- // fprintf(stderr, "%s:%d: <%s> does not have attribute %s:%s.\n",
- // layoutFile->getPrintableSource().string(), tree.getLineNumber(),
- // tag.string(), nsAttr.ns, nsAttr.attr);
- } else {
- size_t len;
- addProguardKeepRule(keep,
- String8(tree.getAttributeStringValue(attrIndex, &len)), NULL,
- layoutFile->getPrintableSource(), tree.getLineNumber());
- }
- }
- }
- }
- ssize_t attrIndex = tree.indexOfAttribute(RESOURCES_ANDROID_NAMESPACE, "onClick");
- if (attrIndex >= 0) {
- size_t len;
- addProguardKeepMethodRule(keep,
- String8(tree.getAttributeStringValue(attrIndex, &len)), NULL,
- layoutFile->getPrintableSource(), tree.getLineNumber());
- }
- }
-
- return NO_ERROR;
-}
-
-static void addTagAttrPair(KeyedVector<String8, Vector<NamespaceAttributePair> >* dest,
- const char* tag, const char* ns, const char* attr) {
- String8 tagStr(tag);
- ssize_t index = dest->indexOfKey(tagStr);
-
- if (index < 0) {
- Vector<NamespaceAttributePair> vector;
- vector.add(NamespaceAttributePair(ns, attr));
- dest->add(tagStr, vector);
- } else {
- dest->editValueAt(index).add(NamespaceAttributePair(ns, attr));
- }
-}
-
-status_t
-writeProguardForLayouts(ProguardKeepSet* keep, const sp<AaptAssets>& assets)
-{
- status_t err;
-
- // tag:attribute pairs that should be checked in layout files.
- KeyedVector<String8, Vector<NamespaceAttributePair> > kLayoutTagAttrPairs;
- addTagAttrPair(&kLayoutTagAttrPairs, "view", NULL, "class");
- addTagAttrPair(&kLayoutTagAttrPairs, "fragment", NULL, "class");
- addTagAttrPair(&kLayoutTagAttrPairs, "fragment", RESOURCES_ANDROID_NAMESPACE, "name");
-
- // tag:attribute pairs that should be checked in xml files.
- KeyedVector<String8, Vector<NamespaceAttributePair> > kXmlTagAttrPairs;
- addTagAttrPair(&kXmlTagAttrPairs, "PreferenceScreen", RESOURCES_ANDROID_NAMESPACE, "fragment");
- addTagAttrPair(&kXmlTagAttrPairs, "header", RESOURCES_ANDROID_NAMESPACE, "fragment");
-
- const Vector<sp<AaptDir> >& dirs = assets->resDirs();
- const size_t K = dirs.size();
- for (size_t k=0; k<K; k++) {
- const sp<AaptDir>& d = dirs.itemAt(k);
- const String8& dirName = d->getLeaf();
- const char* startTag = NULL;
- const KeyedVector<String8, Vector<NamespaceAttributePair> >* tagAttrPairs = NULL;
- if ((dirName == String8("layout")) || (strncmp(dirName.string(), "layout-", 7) == 0)) {
- tagAttrPairs = &kLayoutTagAttrPairs;
- } else if ((dirName == String8("xml")) || (strncmp(dirName.string(), "xml-", 4) == 0)) {
- startTag = "PreferenceScreen";
- tagAttrPairs = &kXmlTagAttrPairs;
- } else if ((dirName == String8("menu")) || (strncmp(dirName.string(), "menu-", 5) == 0)) {
- startTag = "menu";
- tagAttrPairs = NULL;
- } else {
- continue;
- }
-
- const KeyedVector<String8,sp<AaptGroup> > groups = d->getFiles();
- const size_t N = groups.size();
- for (size_t i=0; i<N; i++) {
- const sp<AaptGroup>& group = groups.valueAt(i);
- const DefaultKeyedVector<AaptGroupEntry, sp<AaptFile> >& files = group->getFiles();
- const size_t M = files.size();
- for (size_t j=0; j<M; j++) {
- err = writeProguardForXml(keep, files.valueAt(j), startTag, tagAttrPairs);
- if (err < 0) {
- return err;
- }
- }
- }
- }
- // Handle the overlays
- sp<AaptAssets> overlay = assets->getOverlay();
- if (overlay.get()) {
- return writeProguardForLayouts(keep, overlay);
- }
-
- return NO_ERROR;
-}
-
-status_t
-writeProguardFile(Bundle* bundle, const sp<AaptAssets>& assets)
-{
- status_t err = -1;
-
- if (!bundle->getProguardFile()) {
- return NO_ERROR;
- }
-
- ProguardKeepSet keep;
-
- err = writeProguardForAndroidManifest(&keep, assets);
- if (err < 0) {
- return err;
- }
-
- err = writeProguardForLayouts(&keep, assets);
- if (err < 0) {
- return err;
- }
-
- FILE* fp = fopen(bundle->getProguardFile(), "w+");
- if (fp == NULL) {
- fprintf(stderr, "ERROR: Unable to open class file %s: %s\n",
- bundle->getProguardFile(), strerror(errno));
- return UNKNOWN_ERROR;
- }
-
- const KeyedVector<String8, SortedVector<String8> >& rules = keep.rules;
- const size_t N = rules.size();
- for (size_t i=0; i<N; i++) {
- const SortedVector<String8>& locations = rules.valueAt(i);
- const size_t M = locations.size();
- for (size_t j=0; j<M; j++) {
- fprintf(fp, "# %s\n", locations.itemAt(j).string());
- }
- fprintf(fp, "%s\n\n", rules.keyAt(i).string());
- }
- fclose(fp);
-
- return err;
-}
-
-// Loops through the string paths and writes them to the file pointer
-// Each file path is written on its own line with a terminating backslash.
-status_t writePathsToFile(const sp<FilePathStore>& files, FILE* fp)
-{
- status_t deps = -1;
- for (size_t file_i = 0; file_i < files->size(); ++file_i) {
- // Add the full file path to the dependency file
- fprintf(fp, "%s \\\n", files->itemAt(file_i).string());
- deps++;
- }
- return deps;
-}
-
-status_t
-writeDependencyPreReqs(Bundle* bundle, const sp<AaptAssets>& assets, FILE* fp, bool includeRaw)
-{
- status_t deps = -1;
- deps += writePathsToFile(assets->getFullResPaths(), fp);
- if (includeRaw) {
- deps += writePathsToFile(assets->getFullAssetPaths(), fp);
- }
- return deps;
-}
diff --git a/tools/aapt/ResourceFilter.cpp b/tools/aapt/ResourceFilter.cpp
deleted file mode 100644
index 8cfd2a5..0000000
--- a/tools/aapt/ResourceFilter.cpp
+++ /dev/null
@@ -1,112 +0,0 @@
-//
-// Copyright 2011 The Android Open Source Project
-//
-// Build resource files from raw assets.
-//
-
-#include "ResourceFilter.h"
-
-status_t
-ResourceFilter::parse(const char* arg)
-{
- if (arg == NULL) {
- return 0;
- }
-
- const char* p = arg;
- const char* q;
-
- while (true) {
- q = strchr(p, ',');
- if (q == NULL) {
- q = p + strlen(p);
- }
-
- String8 part(p, q-p);
-
- if (part == "zz_ZZ") {
- mContainsPseudo = true;
- }
- int axis;
- uint32_t value;
- if (AaptGroupEntry::parseNamePart(part, &axis, &value)) {
- fprintf(stderr, "Invalid configuration: %s\n", arg);
- fprintf(stderr, " ");
- for (int i=0; i<p-arg; i++) {
- fprintf(stderr, " ");
- }
- for (int i=0; i<q-p; i++) {
- fprintf(stderr, "^");
- }
- fprintf(stderr, "\n");
- return 1;
- }
-
- ssize_t index = mData.indexOfKey(axis);
- if (index < 0) {
- mData.add(axis, SortedVector<uint32_t>());
- }
- SortedVector<uint32_t>& sv = mData.editValueFor(axis);
- sv.add(value);
- // if it's a locale with a region, also match an unmodified locale of the
- // same language
- if (axis == AXIS_LANGUAGE) {
- if (value & 0xffff0000) {
- sv.add(value & 0x0000ffff);
- }
- }
- p = q;
- if (!*p) break;
- p++;
- }
-
- return NO_ERROR;
-}
-
-bool
-ResourceFilter::isEmpty() const
-{
- return mData.size() == 0;
-}
-
-bool
-ResourceFilter::match(int axis, uint32_t value) const
-{
- if (value == 0) {
- // they didn't specify anything so take everything
- return true;
- }
- ssize_t index = mData.indexOfKey(axis);
- if (index < 0) {
- // we didn't request anything on this axis so take everything
- return true;
- }
- const SortedVector<uint32_t>& sv = mData.valueAt(index);
- return sv.indexOf(value) >= 0;
-}
-
-bool
-ResourceFilter::match(int axis, const ResTable_config& config) const
-{
- return match(axis, AaptGroupEntry::getConfigValueForAxis(config, axis));
-}
-
-bool
-ResourceFilter::match(const ResTable_config& config) const
-{
- for (int i=AXIS_START; i<=AXIS_END; i++) {
- if (!match(i, AaptGroupEntry::getConfigValueForAxis(config, i))) {
- return false;
- }
- }
- return true;
-}
-
-const SortedVector<uint32_t>* ResourceFilter::configsForAxis(int axis) const
-{
- ssize_t index = mData.indexOfKey(axis);
- if (index < 0) {
- return NULL;
- }
- return &mData.valueAt(index);
-}
diff --git a/tools/aapt/ResourceFilter.h b/tools/aapt/ResourceFilter.h
deleted file mode 100644
index 647b7bb..0000000
--- a/tools/aapt/ResourceFilter.h
+++ /dev/null
@@ -1,33 +0,0 @@
-//
-// Copyright 2011 The Android Open Source Project
-//
-// Build resource files from raw assets.
-//
-
-#ifndef RESOURCE_FILTER_H
-#define RESOURCE_FILTER_H
-
-#include "AaptAssets.h"
-
-/**
- * Implements logic for parsing and handling "-c" and "--preferred-configurations"
- * options.
- */
-class ResourceFilter
-{
-public:
- ResourceFilter() : mData(), mContainsPseudo(false) {}
- status_t parse(const char* arg);
- bool isEmpty() const;
- bool match(int axis, uint32_t value) const;
- bool match(int axis, const ResTable_config& config) const;
- bool match(const ResTable_config& config) const;
- const SortedVector<uint32_t>* configsForAxis(int axis) const;
- inline bool containsPseudo() const { return mContainsPseudo; }
-
-private:
- KeyedVector<int,SortedVector<uint32_t> > mData;
- bool mContainsPseudo;
-};
-
-#endif
diff --git a/tools/aapt/ResourceIdCache.cpp b/tools/aapt/ResourceIdCache.cpp
deleted file mode 100644
index e03f4f6..0000000
--- a/tools/aapt/ResourceIdCache.cpp
+++ /dev/null
@@ -1,107 +0,0 @@
-//
-// Copyright 2012 The Android Open Source Project
-//
-// Manage a resource ID cache.
-
-#define LOG_TAG "ResourceIdCache"
-
-#include <utils/String16.h>
-#include <utils/Log.h>
-#include "ResourceIdCache.h"
-#include <map>
-using namespace std;
-
-
-static size_t mHits = 0;
-static size_t mMisses = 0;
-static size_t mCollisions = 0;
-
-static const size_t MAX_CACHE_ENTRIES = 2048;
-static const android::String16 TRUE16("1");
-static const android::String16 FALSE16("0");
-
-struct CacheEntry {
- // concatenation of the relevant strings into a single instance
- android::String16 hashedName;
- uint32_t id;
-
- CacheEntry() {}
- CacheEntry(const android::String16& name, uint32_t resId) : hashedName(name), id(resId) { }
-};
-
-static map< uint32_t, CacheEntry > mIdMap;
-
-
-// djb2; reasonable choice for strings when collisions aren't particularly important
-static inline uint32_t hashround(uint32_t hash, int c) {
- return ((hash << 5) + hash) + c; /* hash * 33 + c */
-}
-
-static uint32_t hash(const android::String16& hashableString) {
- uint32_t hash = 5381;
- const char16_t* str = hashableString.string();
- while (int c = *str++) hash = hashround(hash, c);
- return hash;
-}
-
-namespace android {
-
-static inline String16 makeHashableName(const android::String16& package,
- const android::String16& type,
- const android::String16& name,
- bool onlyPublic) {
- String16 hashable = String16(name);
- hashable += type;
- hashable += package;
- hashable += (onlyPublic ? TRUE16 : FALSE16);
- return hashable;
-}
-
-uint32_t ResourceIdCache::lookup(const android::String16& package,
- const android::String16& type,
- const android::String16& name,
- bool onlyPublic) {
- const String16 hashedName = makeHashableName(package, type, name, onlyPublic);
- const uint32_t hashcode = hash(hashedName);
- map<uint32_t, CacheEntry>::iterator item = mIdMap.find(hashcode);
- if (item == mIdMap.end()) {
- // cache miss
- mMisses++;
- return 0;
- }
-
- // legit match?
- if (hashedName == (*item).second.hashedName) {
- mHits++;
- return (*item).second.id;
- }
-
- // collision
- mCollisions++;
- mIdMap.erase(hashcode);
- return 0;
-}
-
-// returns the resource ID being stored, for callsite convenience
-uint32_t ResourceIdCache::store(const android::String16& package,
- const android::String16& type,
- const android::String16& name,
- bool onlyPublic,
- uint32_t resId) {
- if (mIdMap.size() < MAX_CACHE_ENTRIES) {
- const String16 hashedName = makeHashableName(package, type, name, onlyPublic);
- const uint32_t hashcode = hash(hashedName);
- mIdMap[hashcode] = CacheEntry(hashedName, resId);
- }
- return resId;
-}
-
-void ResourceIdCache::dump() {
- printf("ResourceIdCache dump:\n");
- printf("Size: %ld\n", mIdMap.size());
- printf("Hits: %ld\n", mHits);
- printf("Misses: %ld\n", mMisses);
- printf("(Collisions: %ld)\n", mCollisions);
-}
-
-}
diff --git a/tools/aapt/ResourceIdCache.h b/tools/aapt/ResourceIdCache.h
deleted file mode 100644
index 65f7781..0000000
--- a/tools/aapt/ResourceIdCache.h
+++ /dev/null
@@ -1,30 +0,0 @@
-//
-// Copyright 2012 The Android Open Source Project
-//
-// Manage a resource ID cache.
-
-#ifndef RESOURCE_ID_CACHE_H
-#define RESOURCE_ID_CACHE_H
-
-namespace android {
-class android::String16;
-
-class ResourceIdCache {
-public:
- static uint32_t lookup(const android::String16& package,
- const android::String16& type,
- const android::String16& name,
- bool onlyPublic);
-
- static uint32_t store(const android::String16& package,
- const android::String16& type,
- const android::String16& name,
- bool onlyPublic,
- uint32_t resId);
-
- static void dump(void);
-};
-
-}
-
-#endif
diff --git a/tools/aapt/ResourceTable.cpp b/tools/aapt/ResourceTable.cpp
deleted file mode 100644
index f2e5254..0000000
--- a/tools/aapt/ResourceTable.cpp
+++ /dev/null
@@ -1,3966 +0,0 @@
-//
-// Copyright 2006 The Android Open Source Project
-//
-// Build resource files from raw assets.
-//
-
-#include "ResourceTable.h"
-
-#include "XMLNode.h"
-#include "ResourceFilter.h"
-#include "ResourceIdCache.h"
-
-#include <androidfw/ResourceTypes.h>
-#include <utils/ByteOrder.h>
-#include <stdarg.h>
-
-#define NOISY(x) //x
-
-status_t compileXmlFile(const sp<AaptAssets>& assets,
- const sp<AaptFile>& target,
- ResourceTable* table,
- int options)
-{
- sp<XMLNode> root = XMLNode::parse(target);
- if (root == NULL) {
- return UNKNOWN_ERROR;
- }
-
- return compileXmlFile(assets, root, target, table, options);
-}
-
-status_t compileXmlFile(const sp<AaptAssets>& assets,
- const sp<AaptFile>& target,
- const sp<AaptFile>& outTarget,
- ResourceTable* table,
- int options)
-{
- sp<XMLNode> root = XMLNode::parse(target);
- if (root == NULL) {
- return UNKNOWN_ERROR;
- }
-
- return compileXmlFile(assets, root, outTarget, table, options);
-}
-
-status_t compileXmlFile(const sp<AaptAssets>& assets,
- const sp<XMLNode>& root,
- const sp<AaptFile>& target,
- ResourceTable* table,
- int options)
-{
- if ((options&XML_COMPILE_STRIP_WHITESPACE) != 0) {
- root->removeWhitespace(true, NULL);
- } else if ((options&XML_COMPILE_COMPACT_WHITESPACE) != 0) {
- root->removeWhitespace(false, NULL);
- }
-
- if ((options&XML_COMPILE_UTF8) != 0) {
- root->setUTF8(true);
- }
-
- bool hasErrors = false;
-
- if ((options&XML_COMPILE_ASSIGN_ATTRIBUTE_IDS) != 0) {
- status_t err = root->assignResourceIds(assets, table);
- if (err != NO_ERROR) {
- hasErrors = true;
- }
- }
-
- status_t err = root->parseValues(assets, table);
- if (err != NO_ERROR) {
- hasErrors = true;
- }
-
- if (hasErrors) {
- return UNKNOWN_ERROR;
- }
-
- NOISY(printf("Input XML Resource:\n"));
- NOISY(root->print());
- err = root->flatten(target,
- (options&XML_COMPILE_STRIP_COMMENTS) != 0,
- (options&XML_COMPILE_STRIP_RAW_VALUES) != 0);
- if (err != NO_ERROR) {
- return err;
- }
-
- NOISY(printf("Output XML Resource:\n"));
- NOISY(ResXMLTree tree;
- tree.setTo(target->getData(), target->getSize());
- printXMLBlock(&tree));
-
- target->setCompressionMethod(ZipEntry::kCompressDeflated);
-
- return err;
-}
-
-#undef NOISY
-#define NOISY(x) //x
-
-struct flag_entry
-{
- const char16_t* name;
- size_t nameLen;
- uint32_t value;
- const char* description;
-};
-
-static const char16_t referenceArray[] =
- { 'r', 'e', 'f', 'e', 'r', 'e', 'n', 'c', 'e' };
-static const char16_t stringArray[] =
- { 's', 't', 'r', 'i', 'n', 'g' };
-static const char16_t integerArray[] =
- { 'i', 'n', 't', 'e', 'g', 'e', 'r' };
-static const char16_t booleanArray[] =
- { 'b', 'o', 'o', 'l', 'e', 'a', 'n' };
-static const char16_t colorArray[] =
- { 'c', 'o', 'l', 'o', 'r' };
-static const char16_t floatArray[] =
- { 'f', 'l', 'o', 'a', 't' };
-static const char16_t dimensionArray[] =
- { 'd', 'i', 'm', 'e', 'n', 's', 'i', 'o', 'n' };
-static const char16_t fractionArray[] =
- { 'f', 'r', 'a', 'c', 't', 'i', 'o', 'n' };
-static const char16_t enumArray[] =
- { 'e', 'n', 'u', 'm' };
-static const char16_t flagsArray[] =
- { 'f', 'l', 'a', 'g', 's' };
-
-static const flag_entry gFormatFlags[] = {
- { referenceArray, sizeof(referenceArray)/2, ResTable_map::TYPE_REFERENCE,
- "a reference to another resource, in the form \"<code>@[+][<i>package</i>:]<i>type</i>:<i>name</i></code>\"\n"
- "or to a theme attribute in the form \"<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>\"."},
- { stringArray, sizeof(stringArray)/2, ResTable_map::TYPE_STRING,
- "a string value, using '\\\\;' to escape characters such as '\\\\n' or '\\\\uxxxx' for a unicode character." },
- { integerArray, sizeof(integerArray)/2, ResTable_map::TYPE_INTEGER,
- "an integer value, such as \"<code>100</code>\"." },
- { booleanArray, sizeof(booleanArray)/2, ResTable_map::TYPE_BOOLEAN,
- "a boolean value, either \"<code>true</code>\" or \"<code>false</code>\"." },
- { colorArray, sizeof(colorArray)/2, ResTable_map::TYPE_COLOR,
- "a color value, in the form of \"<code>#<i>rgb</i></code>\", \"<code>#<i>argb</i></code>\",\n"
- "\"<code>#<i>rrggbb</i></code>\", or \"<code>#<i>aarrggbb</i></code>\"." },
- { floatArray, sizeof(floatArray)/2, ResTable_map::TYPE_FLOAT,
- "a floating point value, such as \"<code>1.2</code>\"."},
- { dimensionArray, sizeof(dimensionArray)/2, ResTable_map::TYPE_DIMENSION,
- "a dimension value, which is a floating point number appended with a unit such as \"<code>14.5sp</code>\".\n"
- "Available units are: px (pixels), dp (density-independent pixels), sp (scaled pixels based on preferred font size),\n"
- "in (inches), mm (millimeters)." },
- { fractionArray, sizeof(fractionArray)/2, ResTable_map::TYPE_FRACTION,
- "a fractional value, which is a floating point number appended with either % or %p, such as \"<code>14.5%</code>\".\n"
- "The % suffix always means a percentage of the base size; the optional %p suffix provides a size relative to\n"
- "some parent container." },
- { enumArray, sizeof(enumArray)/2, ResTable_map::TYPE_ENUM, NULL },
- { flagsArray, sizeof(flagsArray)/2, ResTable_map::TYPE_FLAGS, NULL },
- { NULL, 0, 0, NULL }
-};
-
-static const char16_t suggestedArray[] = { 's', 'u', 'g', 'g', 'e', 's', 't', 'e', 'd' };
-
-static const flag_entry l10nRequiredFlags[] = {
- { suggestedArray, sizeof(suggestedArray)/2, ResTable_map::L10N_SUGGESTED, NULL },
- { NULL, 0, 0, NULL }
-};
-
-static const char16_t nulStr[] = { 0 };
-
-static uint32_t parse_flags(const char16_t* str, size_t len,
- const flag_entry* flags, bool* outError = NULL)
-{
- while (len > 0 && isspace(*str)) {
- str++;
- len--;
- }
- while (len > 0 && isspace(str[len-1])) {
- len--;
- }
-
- const char16_t* const end = str + len;
- uint32_t value = 0;
-
- while (str < end) {
- const char16_t* div = str;
- while (div < end && *div != '|') {
- div++;
- }
-
- const flag_entry* cur = flags;
- while (cur->name) {
- if (strzcmp16(cur->name, cur->nameLen, str, div-str) == 0) {
- value |= cur->value;
- break;
- }
- cur++;
- }
-
- if (!cur->name) {
- if (outError) *outError = true;
- return 0;
- }
-
- str = div < end ? div+1 : div;
- }
-
- if (outError) *outError = false;
- return value;
-}
-
-static String16 mayOrMust(int type, int flags)
-{
- if ((type&(~flags)) == 0) {
- return String16("<p>Must");
- }
-
- return String16("<p>May");
-}
-
-static void appendTypeInfo(ResourceTable* outTable, const String16& pkg,
- const String16& typeName, const String16& ident, int type,
- const flag_entry* flags)
-{
- bool hadType = false;
- while (flags->name) {
- if ((type&flags->value) != 0 && flags->description != NULL) {
- String16 fullMsg(mayOrMust(type, flags->value));
- fullMsg.append(String16(" be "));
- fullMsg.append(String16(flags->description));
- outTable->appendTypeComment(pkg, typeName, ident, fullMsg);
- hadType = true;
- }
- flags++;
- }
- if (hadType && (type&ResTable_map::TYPE_REFERENCE) == 0) {
- outTable->appendTypeComment(pkg, typeName, ident,
- String16("<p>This may also be a reference to a resource (in the form\n"
- "\"<code>@[<i>package</i>:]<i>type</i>:<i>name</i></code>\") or\n"
- "theme attribute (in the form\n"
- "\"<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>\")\n"
- "containing a value of this type."));
- }
-}
-
-struct PendingAttribute
-{
- const String16 myPackage;
- const SourcePos sourcePos;
- const bool appendComment;
- int32_t type;
- String16 ident;
- String16 comment;
- bool hasErrors;
- bool added;
-
- PendingAttribute(String16 _package, const sp<AaptFile>& in,
- ResXMLTree& block, bool _appendComment)
- : myPackage(_package)
- , sourcePos(in->getPrintableSource(), block.getLineNumber())
- , appendComment(_appendComment)
- , type(ResTable_map::TYPE_ANY)
- , hasErrors(false)
- , added(false)
- {
- }
-
- status_t createIfNeeded(ResourceTable* outTable)
- {
- if (added || hasErrors) {
- return NO_ERROR;
- }
- added = true;
-
- String16 attr16("attr");
-
- if (outTable->hasBagOrEntry(myPackage, attr16, ident)) {
- sourcePos.error("Attribute \"%s\" has already been defined\n",
- String8(ident).string());
- hasErrors = true;
- return UNKNOWN_ERROR;
- }
-
- char numberStr[16];
- sprintf(numberStr, "%d", type);
- status_t err = outTable->addBag(sourcePos, myPackage,
- attr16, ident, String16(""),
- String16("^type"),
- String16(numberStr), NULL, NULL);
- if (err != NO_ERROR) {
- hasErrors = true;
- return err;
- }
- outTable->appendComment(myPackage, attr16, ident, comment, appendComment);
- //printf("Attribute %s comment: %s\n", String8(ident).string(),
- // String8(comment).string());
- return err;
- }
-};
-
-static status_t compileAttribute(const sp<AaptFile>& in,
- ResXMLTree& block,
- const String16& myPackage,
- ResourceTable* outTable,
- String16* outIdent = NULL,
- bool inStyleable = false)
-{
- PendingAttribute attr(myPackage, in, block, inStyleable);
-
- const String16 attr16("attr");
- const String16 id16("id");
-
- // Attribute type constants.
- const String16 enum16("enum");
- const String16 flag16("flag");
-
- ResXMLTree::event_code_t code;
- size_t len;
- status_t err;
-
- ssize_t identIdx = block.indexOfAttribute(NULL, "name");
- if (identIdx >= 0) {
- attr.ident = String16(block.getAttributeStringValue(identIdx, &len));
- if (outIdent) {
- *outIdent = attr.ident;
- }
- } else {
- attr.sourcePos.error("A 'name' attribute is required for <attr>\n");
- attr.hasErrors = true;
- }
-
- attr.comment = String16(
- block.getComment(&len) ? block.getComment(&len) : nulStr);
-
- ssize_t typeIdx = block.indexOfAttribute(NULL, "format");
- if (typeIdx >= 0) {
- String16 typeStr = String16(block.getAttributeStringValue(typeIdx, &len));
- attr.type = parse_flags(typeStr.string(), typeStr.size(), gFormatFlags);
- if (attr.type == 0) {
- attr.sourcePos.error("Tag <attr> 'format' attribute value \"%s\" not valid\n",
- String8(typeStr).string());
- attr.hasErrors = true;
- }
- attr.createIfNeeded(outTable);
- } else if (!inStyleable) {
- // Attribute definitions outside of styleables always define the
- // attribute as a generic value.
- attr.createIfNeeded(outTable);
- }
-
- //printf("Attribute %s: type=0x%08x\n", String8(attr.ident).string(), attr.type);
-
- ssize_t minIdx = block.indexOfAttribute(NULL, "min");
- if (minIdx >= 0) {
- String16 val = String16(block.getAttributeStringValue(minIdx, &len));
- if (!ResTable::stringToInt(val.string(), val.size(), NULL)) {
- attr.sourcePos.error("Tag <attr> 'min' attribute must be a number, not \"%s\"\n",
- String8(val).string());
- attr.hasErrors = true;
- }
- attr.createIfNeeded(outTable);
- if (!attr.hasErrors) {
- err = outTable->addBag(attr.sourcePos, myPackage, attr16, attr.ident,
- String16(""), String16("^min"), String16(val), NULL, NULL);
- if (err != NO_ERROR) {
- attr.hasErrors = true;
- }
- }
- }
-
- ssize_t maxIdx = block.indexOfAttribute(NULL, "max");
- if (maxIdx >= 0) {
- String16 val = String16(block.getAttributeStringValue(maxIdx, &len));
- if (!ResTable::stringToInt(val.string(), val.size(), NULL)) {
- attr.sourcePos.error("Tag <attr> 'max' attribute must be a number, not \"%s\"\n",
- String8(val).string());
- attr.hasErrors = true;
- }
- attr.createIfNeeded(outTable);
- if (!attr.hasErrors) {
- err = outTable->addBag(attr.sourcePos, myPackage, attr16, attr.ident,
- String16(""), String16("^max"), String16(val), NULL, NULL);
- attr.hasErrors = true;
- }
- }
-
- if ((minIdx >= 0 || maxIdx >= 0) && (attr.type&ResTable_map::TYPE_INTEGER) == 0) {
- attr.sourcePos.error("Tag <attr> must have format=integer attribute if using max or min\n");
- attr.hasErrors = true;
- }
-
- ssize_t l10nIdx = block.indexOfAttribute(NULL, "localization");
- if (l10nIdx >= 0) {
- const uint16_t* str = block.getAttributeStringValue(l10nIdx, &len);
- bool error;
- uint32_t l10n_required = parse_flags(str, len, l10nRequiredFlags, &error);
- if (error) {
- attr.sourcePos.error("Tag <attr> 'localization' attribute value \"%s\" not valid\n",
- String8(str).string());
- attr.hasErrors = true;
- }
- attr.createIfNeeded(outTable);
- if (!attr.hasErrors) {
- char buf[11];
- sprintf(buf, "%d", l10n_required);
- err = outTable->addBag(attr.sourcePos, myPackage, attr16, attr.ident,
- String16(""), String16("^l10n"), String16(buf), NULL, NULL);
- if (err != NO_ERROR) {
- attr.hasErrors = true;
- }
- }
- }
-
- String16 enumOrFlagsComment;
-
- while ((code=block.next()) != ResXMLTree::END_DOCUMENT && code != ResXMLTree::BAD_DOCUMENT) {
- if (code == ResXMLTree::START_TAG) {
- uint32_t localType = 0;
- if (strcmp16(block.getElementName(&len), enum16.string()) == 0) {
- localType = ResTable_map::TYPE_ENUM;
- } else if (strcmp16(block.getElementName(&len), flag16.string()) == 0) {
- localType = ResTable_map::TYPE_FLAGS;
- } else {
- SourcePos(in->getPrintableSource(), block.getLineNumber())
- .error("Tag <%s> can not appear inside <attr>, only <enum> or <flag>\n",
- String8(block.getElementName(&len)).string());
- return UNKNOWN_ERROR;
- }
-
- attr.createIfNeeded(outTable);
-
- if (attr.type == ResTable_map::TYPE_ANY) {
- // No type was explicitly stated, so supplying enum tags
- // implicitly creates an enum or flag.
- attr.type = 0;
- }
-
- if ((attr.type&(ResTable_map::TYPE_ENUM|ResTable_map::TYPE_FLAGS)) == 0) {
- // Wasn't originally specified as an enum, so update its type.
- attr.type |= localType;
- if (!attr.hasErrors) {
- char numberStr[16];
- sprintf(numberStr, "%d", attr.type);
- err = outTable->addBag(SourcePos(in->getPrintableSource(), block.getLineNumber()),
- myPackage, attr16, attr.ident, String16(""),
- String16("^type"), String16(numberStr), NULL, NULL, true);
- if (err != NO_ERROR) {
- attr.hasErrors = true;
- }
- }
- } else if ((uint32_t)(attr.type&(ResTable_map::TYPE_ENUM|ResTable_map::TYPE_FLAGS)) != localType) {
- if (localType == ResTable_map::TYPE_ENUM) {
- SourcePos(in->getPrintableSource(), block.getLineNumber())
- .error("<enum> attribute can not be used inside a flags format\n");
- attr.hasErrors = true;
- } else {
- SourcePos(in->getPrintableSource(), block.getLineNumber())
- .error("<flag> attribute can not be used inside a enum format\n");
- attr.hasErrors = true;
- }
- }
-
- String16 itemIdent;
- ssize_t itemIdentIdx = block.indexOfAttribute(NULL, "name");
- if (itemIdentIdx >= 0) {
- itemIdent = String16(block.getAttributeStringValue(itemIdentIdx, &len));
- } else {
- SourcePos(in->getPrintableSource(), block.getLineNumber())
- .error("A 'name' attribute is required for <enum> or <flag>\n");
- attr.hasErrors = true;
- }
-
- String16 value;
- ssize_t valueIdx = block.indexOfAttribute(NULL, "value");
- if (valueIdx >= 0) {
- value = String16(block.getAttributeStringValue(valueIdx, &len));
- } else {
- SourcePos(in->getPrintableSource(), block.getLineNumber())
- .error("A 'value' attribute is required for <enum> or <flag>\n");
- attr.hasErrors = true;
- }
- if (!attr.hasErrors && !ResTable::stringToInt(value.string(), value.size(), NULL)) {
- SourcePos(in->getPrintableSource(), block.getLineNumber())
- .error("Tag <enum> or <flag> 'value' attribute must be a number,"
- " not \"%s\"\n",
- String8(value).string());
- attr.hasErrors = true;
- }
-
- // Make sure an id is defined for this enum/flag identifier...
- if (!attr.hasErrors && !outTable->hasBagOrEntry(itemIdent, &id16, &myPackage)) {
- err = outTable->startBag(SourcePos(in->getPrintableSource(), block.getLineNumber()),
- myPackage, id16, itemIdent, String16(), NULL);
- if (err != NO_ERROR) {
- attr.hasErrors = true;
- }
- }
-
- if (!attr.hasErrors) {
- if (enumOrFlagsComment.size() == 0) {
- enumOrFlagsComment.append(mayOrMust(attr.type,
- ResTable_map::TYPE_ENUM|ResTable_map::TYPE_FLAGS));
- enumOrFlagsComment.append((attr.type&ResTable_map::TYPE_ENUM)
- ? String16(" be one of the following constant values.")
- : String16(" be one or more (separated by '|') of the following constant values."));
- enumOrFlagsComment.append(String16("</p>\n<table>\n"
- "<colgroup align=\"left\" />\n"
- "<colgroup align=\"left\" />\n"
- "<colgroup align=\"left\" />\n"
- "<tr><th>Constant</th><th>Value</th><th>Description</th></tr>"));
- }
-
- enumOrFlagsComment.append(String16("\n<tr><td><code>"));
- enumOrFlagsComment.append(itemIdent);
- enumOrFlagsComment.append(String16("</code></td><td>"));
- enumOrFlagsComment.append(value);
- enumOrFlagsComment.append(String16("</td><td>"));
- if (block.getComment(&len)) {
- enumOrFlagsComment.append(String16(block.getComment(&len)));
- }
- enumOrFlagsComment.append(String16("</td></tr>"));
-
- err = outTable->addBag(SourcePos(in->getPrintableSource(), block.getLineNumber()),
- myPackage,
- attr16, attr.ident, String16(""),
- itemIdent, value, NULL, NULL, false, true);
- if (err != NO_ERROR) {
- attr.hasErrors = true;
- }
- }
- } else if (code == ResXMLTree::END_TAG) {
- if (strcmp16(block.getElementName(&len), attr16.string()) == 0) {
- break;
- }
- if ((attr.type&ResTable_map::TYPE_ENUM) != 0) {
- if (strcmp16(block.getElementName(&len), enum16.string()) != 0) {
- SourcePos(in->getPrintableSource(), block.getLineNumber())
- .error("Found tag </%s> where </enum> is expected\n",
- String8(block.getElementName(&len)).string());
- return UNKNOWN_ERROR;
- }
- } else {
- if (strcmp16(block.getElementName(&len), flag16.string()) != 0) {
- SourcePos(in->getPrintableSource(), block.getLineNumber())
- .error("Found tag </%s> where </flag> is expected\n",
- String8(block.getElementName(&len)).string());
- return UNKNOWN_ERROR;
- }
- }
- }
- }
-
- if (!attr.hasErrors && attr.added) {
- appendTypeInfo(outTable, myPackage, attr16, attr.ident, attr.type, gFormatFlags);
- }
-
- if (!attr.hasErrors && enumOrFlagsComment.size() > 0) {
- enumOrFlagsComment.append(String16("\n</table>"));
- outTable->appendTypeComment(myPackage, attr16, attr.ident, enumOrFlagsComment);
- }
-
-
- return NO_ERROR;
-}
-
-bool localeIsDefined(const ResTable_config& config)
-{
- return config.locale == 0;
-}
-
-status_t parseAndAddBag(Bundle* bundle,
- const sp<AaptFile>& in,
- ResXMLTree* block,
- const ResTable_config& config,
- const String16& myPackage,
- const String16& curType,
- const String16& ident,
- const String16& parentIdent,
- const String16& itemIdent,
- int32_t curFormat,
- bool isFormatted,
- const String16& product,
- bool pseudolocalize,
- const bool overwrite,
- ResourceTable* outTable)
-{
- status_t err;
- const String16 item16("item");
-
- String16 str;
- Vector<StringPool::entry_style_span> spans;
- err = parseStyledString(bundle, in->getPrintableSource().string(),
- block, item16, &str, &spans, isFormatted,
- pseudolocalize);
- if (err != NO_ERROR) {
- return err;
- }
-
- NOISY(printf("Adding resource bag entry l=%c%c c=%c%c orien=%d d=%d "
- " pid=%s, bag=%s, id=%s: %s\n",
- config.language[0], config.language[1],
- config.country[0], config.country[1],
- config.orientation, config.density,
- String8(parentIdent).string(),
- String8(ident).string(),
- String8(itemIdent).string(),
- String8(str).string()));
-
- err = outTable->addBag(SourcePos(in->getPrintableSource(), block->getLineNumber()),
- myPackage, curType, ident, parentIdent, itemIdent, str,
- &spans, &config, overwrite, false, curFormat);
- return err;
-}
-
-/*
- * Returns true if needle is one of the elements in the comma-separated list
- * haystack, false otherwise.
- */
-bool isInProductList(const String16& needle, const String16& haystack) {
- const char16_t *needle2 = needle.string();
- const char16_t *haystack2 = haystack.string();
- size_t needlesize = needle.size();
-
- while (*haystack2 != '\0') {
- if (strncmp16(haystack2, needle2, needlesize) == 0) {
- if (haystack2[needlesize] == '\0' || haystack2[needlesize] == ',') {
- return true;
- }
- }
-
- while (*haystack2 != '\0' && *haystack2 != ',') {
- haystack2++;
- }
- if (*haystack2 == ',') {
- haystack2++;
- }
- }
-
- return false;
-}
-
-/*
- * A simple container that holds a resource type and name. It is ordered first by type then
- * by name.
- */
-struct type_ident_pair_t {
- String16 type;
- String16 ident;
-
- type_ident_pair_t() { };
- type_ident_pair_t(const String16& t, const String16& i) : type(t), ident(i) { }
- type_ident_pair_t(const type_ident_pair_t& o) : type(o.type), ident(o.ident) { }
- inline bool operator < (const type_ident_pair_t& o) const {
- int cmp = compare_type(type, o.type);
- if (cmp < 0) {
- return true;
- } else if (cmp > 0) {
- return false;
- } else {
- return strictly_order_type(ident, o.ident);
- }
- }
-};
-
-
-status_t parseAndAddEntry(Bundle* bundle,
- const sp<AaptFile>& in,
- ResXMLTree* block,
- const ResTable_config& config,
- const String16& myPackage,
- const String16& curType,
- const String16& ident,
- const String16& curTag,
- bool curIsStyled,
- int32_t curFormat,
- bool isFormatted,
- const String16& product,
- bool pseudolocalize,
- const bool overwrite,
- KeyedVector<type_ident_pair_t, bool>* skippedResourceNames,
- ResourceTable* outTable)
-{
- status_t err;
-
- String16 str;
- Vector<StringPool::entry_style_span> spans;
- err = parseStyledString(bundle, in->getPrintableSource().string(), block,
- curTag, &str, curIsStyled ? &spans : NULL,
- isFormatted, pseudolocalize);
-
- if (err < NO_ERROR) {
- return err;
- }
-
- /*
- * If a product type was specified on the command line
- * and also in the string, and the two are not the same,
- * return without adding the string.
- */
-
- const char *bundleProduct = bundle->getProduct();
- if (bundleProduct == NULL) {
- bundleProduct = "";
- }
-
- if (product.size() != 0) {
- /*
- * If the command-line-specified product is empty, only "default"
- * matches. Other variants are skipped. This is so generation
- * of the R.java file when the product is not known is predictable.
- */
-
- if (bundleProduct[0] == '\0') {
- if (strcmp16(String16("default").string(), product.string()) != 0) {
- /*
- * This string has a product other than 'default'. Do not add it,
- * but record it so that if we do not see the same string with
- * product 'default' or no product, then report an error.
- */
- skippedResourceNames->replaceValueFor(
- type_ident_pair_t(curType, ident), true);
- return NO_ERROR;
- }
- } else {
- /*
- * The command-line product is not empty.
- * If the product for this string is on the command-line list,
- * it matches. "default" also matches, but only if nothing
- * else has matched already.
- */
-
- if (isInProductList(product, String16(bundleProduct))) {
- ;
- } else if (strcmp16(String16("default").string(), product.string()) == 0 &&
- !outTable->hasBagOrEntry(myPackage, curType, ident, config)) {
- ;
- } else {
- return NO_ERROR;
- }
- }
- }
-
- NOISY(printf("Adding resource entry l=%c%c c=%c%c orien=%d d=%d id=%s: %s\n",
- config.language[0], config.language[1],
- config.country[0], config.country[1],
- config.orientation, config.density,
- String8(ident).string(), String8(str).string()));
-
- err = outTable->addEntry(SourcePos(in->getPrintableSource(), block->getLineNumber()),
- myPackage, curType, ident, str, &spans, &config,
- false, curFormat, overwrite);
-
- return err;
-}
-
-status_t compileResourceFile(Bundle* bundle,
- const sp<AaptAssets>& assets,
- const sp<AaptFile>& in,
- const ResTable_config& defParams,
- const bool overwrite,
- ResourceTable* outTable)
-{
- ResXMLTree block;
- status_t err = parseXMLResource(in, &block, false, true);
- if (err != NO_ERROR) {
- return err;
- }
-
- // Top-level tag.
- const String16 resources16("resources");
-
- // Identifier declaration tags.
- const String16 declare_styleable16("declare-styleable");
- const String16 attr16("attr");
-
- // Data creation organizational tags.
- const String16 string16("string");
- const String16 drawable16("drawable");
- const String16 color16("color");
- const String16 bool16("bool");
- const String16 integer16("integer");
- const String16 dimen16("dimen");
- const String16 fraction16("fraction");
- const String16 style16("style");
- const String16 plurals16("plurals");
- const String16 array16("array");
- const String16 string_array16("string-array");
- const String16 integer_array16("integer-array");
- const String16 public16("public");
- const String16 public_padding16("public-padding");
- const String16 private_symbols16("private-symbols");
- const String16 java_symbol16("java-symbol");
- const String16 add_resource16("add-resource");
- const String16 skip16("skip");
- const String16 eat_comment16("eat-comment");
-
- // Data creation tags.
- const String16 bag16("bag");
- const String16 item16("item");
-
- // Attribute type constants.
- const String16 enum16("enum");
-
- // plural values
- const String16 other16("other");
- const String16 quantityOther16("^other");
- const String16 zero16("zero");
- const String16 quantityZero16("^zero");
- const String16 one16("one");
- const String16 quantityOne16("^one");
- const String16 two16("two");
- const String16 quantityTwo16("^two");
- const String16 few16("few");
- const String16 quantityFew16("^few");
- const String16 many16("many");
- const String16 quantityMany16("^many");
-
- // useful attribute names and special values
- const String16 name16("name");
- const String16 translatable16("translatable");
- const String16 formatted16("formatted");
- const String16 false16("false");
-
- const String16 myPackage(assets->getPackage());
-
- bool hasErrors = false;
-
- bool fileIsTranslatable = true;
- if (strstr(in->getPrintableSource().string(), "donottranslate") != NULL) {
- fileIsTranslatable = false;
- }
-
- DefaultKeyedVector<String16, uint32_t> nextPublicId(0);
-
- // Stores the resource names that were skipped. Typically this happens when
- // AAPT is invoked without a product specified and a resource has no
- // 'default' product attribute.
- KeyedVector<type_ident_pair_t, bool> skippedResourceNames;
-
- ResXMLTree::event_code_t code;
- do {
- code = block.next();
- } while (code == ResXMLTree::START_NAMESPACE);
-
- size_t len;
- if (code != ResXMLTree::START_TAG) {
- SourcePos(in->getPrintableSource(), block.getLineNumber()).error(
- "No start tag found\n");
- return UNKNOWN_ERROR;
- }
- if (strcmp16(block.getElementName(&len), resources16.string()) != 0) {
- SourcePos(in->getPrintableSource(), block.getLineNumber()).error(
- "Invalid start tag %s\n", String8(block.getElementName(&len)).string());
- return UNKNOWN_ERROR;
- }
-
- ResTable_config curParams(defParams);
-
- ResTable_config pseudoParams(curParams);
- pseudoParams.language[0] = 'z';
- pseudoParams.language[1] = 'z';
- pseudoParams.country[0] = 'Z';
- pseudoParams.country[1] = 'Z';
-
- while ((code=block.next()) != ResXMLTree::END_DOCUMENT && code != ResXMLTree::BAD_DOCUMENT) {
- if (code == ResXMLTree::START_TAG) {
- const String16* curTag = NULL;
- String16 curType;
- int32_t curFormat = ResTable_map::TYPE_ANY;
- bool curIsBag = false;
- bool curIsBagReplaceOnOverwrite = false;
- bool curIsStyled = false;
- bool curIsPseudolocalizable = false;
- bool curIsFormatted = fileIsTranslatable;
- bool localHasErrors = false;
-
- if (strcmp16(block.getElementName(&len), skip16.string()) == 0) {
- while ((code=block.next()) != ResXMLTree::END_DOCUMENT
- && code != ResXMLTree::BAD_DOCUMENT) {
- if (code == ResXMLTree::END_TAG) {
- if (strcmp16(block.getElementName(&len), skip16.string()) == 0) {
- break;
- }
- }
- }
- continue;
-
- } else if (strcmp16(block.getElementName(&len), eat_comment16.string()) == 0) {
- while ((code=block.next()) != ResXMLTree::END_DOCUMENT
- && code != ResXMLTree::BAD_DOCUMENT) {
- if (code == ResXMLTree::END_TAG) {
- if (strcmp16(block.getElementName(&len), eat_comment16.string()) == 0) {
- break;
- }
- }
- }
- continue;
-
- } else if (strcmp16(block.getElementName(&len), public16.string()) == 0) {
- SourcePos srcPos(in->getPrintableSource(), block.getLineNumber());
-
- String16 type;
- ssize_t typeIdx = block.indexOfAttribute(NULL, "type");
- if (typeIdx < 0) {
- srcPos.error("A 'type' attribute is required for <public>\n");
- hasErrors = localHasErrors = true;
- }
- type = String16(block.getAttributeStringValue(typeIdx, &len));
-
- String16 name;
- ssize_t nameIdx = block.indexOfAttribute(NULL, "name");
- if (nameIdx < 0) {
- srcPos.error("A 'name' attribute is required for <public>\n");
- hasErrors = localHasErrors = true;
- }
- name = String16(block.getAttributeStringValue(nameIdx, &len));
-
- uint32_t ident = 0;
- ssize_t identIdx = block.indexOfAttribute(NULL, "id");
- if (identIdx >= 0) {
- const char16_t* identStr = block.getAttributeStringValue(identIdx, &len);
- Res_value identValue;
- if (!ResTable::stringToInt(identStr, len, &identValue)) {
- srcPos.error("Given 'id' attribute is not an integer: %s\n",
- String8(block.getAttributeStringValue(identIdx, &len)).string());
- hasErrors = localHasErrors = true;
- } else {
- ident = identValue.data;
- nextPublicId.replaceValueFor(type, ident+1);
- }
- } else if (nextPublicId.indexOfKey(type) < 0) {
- srcPos.error("No 'id' attribute supplied <public>,"
- " and no previous id defined in this file.\n");
- hasErrors = localHasErrors = true;
- } else if (!localHasErrors) {
- ident = nextPublicId.valueFor(type);
- nextPublicId.replaceValueFor(type, ident+1);
- }
-
- if (!localHasErrors) {
- err = outTable->addPublic(srcPos, myPackage, type, name, ident);
- if (err < NO_ERROR) {
- hasErrors = localHasErrors = true;
- }
- }
- if (!localHasErrors) {
- sp<AaptSymbols> symbols = assets->getSymbolsFor(String8("R"));
- if (symbols != NULL) {
- symbols = symbols->addNestedSymbol(String8(type), srcPos);
- }
- if (symbols != NULL) {
- symbols->makeSymbolPublic(String8(name), srcPos);
- String16 comment(
- block.getComment(&len) ? block.getComment(&len) : nulStr);
- symbols->appendComment(String8(name), comment, srcPos);
- } else {
- srcPos.error("Unable to create symbols!\n");
- hasErrors = localHasErrors = true;
- }
- }
-
- while ((code=block.next()) != ResXMLTree::END_DOCUMENT && code != ResXMLTree::BAD_DOCUMENT) {
- if (code == ResXMLTree::END_TAG) {
- if (strcmp16(block.getElementName(&len), public16.string()) == 0) {
- break;
- }
- }
- }
- continue;
-
- } else if (strcmp16(block.getElementName(&len), public_padding16.string()) == 0) {
- SourcePos srcPos(in->getPrintableSource(), block.getLineNumber());
-
- String16 type;
- ssize_t typeIdx = block.indexOfAttribute(NULL, "type");
- if (typeIdx < 0) {
- srcPos.error("A 'type' attribute is required for <public-padding>\n");
- hasErrors = localHasErrors = true;
- }
- type = String16(block.getAttributeStringValue(typeIdx, &len));
-
- String16 name;
- ssize_t nameIdx = block.indexOfAttribute(NULL, "name");
- if (nameIdx < 0) {
- srcPos.error("A 'name' attribute is required for <public-padding>\n");
- hasErrors = localHasErrors = true;
- }
- name = String16(block.getAttributeStringValue(nameIdx, &len));
-
- uint32_t start = 0;
- ssize_t startIdx = block.indexOfAttribute(NULL, "start");
- if (startIdx >= 0) {
- const char16_t* startStr = block.getAttributeStringValue(startIdx, &len);
- Res_value startValue;
- if (!ResTable::stringToInt(startStr, len, &startValue)) {
- srcPos.error("Given 'start' attribute is not an integer: %s\n",
- String8(block.getAttributeStringValue(startIdx, &len)).string());
- hasErrors = localHasErrors = true;
- } else {
- start = startValue.data;
- }
- } else if (nextPublicId.indexOfKey(type) < 0) {
- srcPos.error("No 'start' attribute supplied <public-padding>,"
- " and no previous id defined in this file.\n");
- hasErrors = localHasErrors = true;
- } else if (!localHasErrors) {
- start = nextPublicId.valueFor(type);
- }
-
- uint32_t end = 0;
- ssize_t endIdx = block.indexOfAttribute(NULL, "end");
- if (endIdx >= 0) {
- const char16_t* endStr = block.getAttributeStringValue(endIdx, &len);
- Res_value endValue;
- if (!ResTable::stringToInt(endStr, len, &endValue)) {
- srcPos.error("Given 'end' attribute is not an integer: %s\n",
- String8(block.getAttributeStringValue(endIdx, &len)).string());
- hasErrors = localHasErrors = true;
- } else {
- end = endValue.data;
- }
- } else {
- srcPos.error("No 'end' attribute supplied <public-padding>\n");
- hasErrors = localHasErrors = true;
- }
-
- if (end >= start) {
- nextPublicId.replaceValueFor(type, end+1);
- } else {
- srcPos.error("Padding start '%ul' is after end '%ul'\n",
- start, end);
- hasErrors = localHasErrors = true;
- }
-
- String16 comment(
- block.getComment(&len) ? block.getComment(&len) : nulStr);
- for (uint32_t curIdent=start; curIdent<=end; curIdent++) {
- if (localHasErrors) {
- break;
- }
- String16 curName(name);
- char buf[64];
- sprintf(buf, "%d", (int)(end-curIdent+1));
- curName.append(String16(buf));
-
- err = outTable->addEntry(srcPos, myPackage, type, curName,
- String16("padding"), NULL, &curParams, false,
- ResTable_map::TYPE_STRING, overwrite);
- if (err < NO_ERROR) {
- hasErrors = localHasErrors = true;
- break;
- }
- err = outTable->addPublic(srcPos, myPackage, type,
- curName, curIdent);
- if (err < NO_ERROR) {
- hasErrors = localHasErrors = true;
- break;
- }
- sp<AaptSymbols> symbols = assets->getSymbolsFor(String8("R"));
- if (symbols != NULL) {
- symbols = symbols->addNestedSymbol(String8(type), srcPos);
- }
- if (symbols != NULL) {
- symbols->makeSymbolPublic(String8(curName), srcPos);
- symbols->appendComment(String8(curName), comment, srcPos);
- } else {
- srcPos.error("Unable to create symbols!\n");
- hasErrors = localHasErrors = true;
- }
- }
-
- while ((code=block.next()) != ResXMLTree::END_DOCUMENT && code != ResXMLTree::BAD_DOCUMENT) {
- if (code == ResXMLTree::END_TAG) {
- if (strcmp16(block.getElementName(&len), public_padding16.string()) == 0) {
- break;
- }
- }
- }
- continue;
-
- } else if (strcmp16(block.getElementName(&len), private_symbols16.string()) == 0) {
- String16 pkg;
- ssize_t pkgIdx = block.indexOfAttribute(NULL, "package");
- if (pkgIdx < 0) {
- SourcePos(in->getPrintableSource(), block.getLineNumber()).error(
- "A 'package' attribute is required for <private-symbols>\n");
- hasErrors = localHasErrors = true;
- }
- pkg = String16(block.getAttributeStringValue(pkgIdx, &len));
- if (!localHasErrors) {
- assets->setSymbolsPrivatePackage(String8(pkg));
- }
-
- while ((code=block.next()) != ResXMLTree::END_DOCUMENT && code != ResXMLTree::BAD_DOCUMENT) {
- if (code == ResXMLTree::END_TAG) {
- if (strcmp16(block.getElementName(&len), private_symbols16.string()) == 0) {
- break;
- }
- }
- }
- continue;
-
- } else if (strcmp16(block.getElementName(&len), java_symbol16.string()) == 0) {
- SourcePos srcPos(in->getPrintableSource(), block.getLineNumber());
-
- String16 type;
- ssize_t typeIdx = block.indexOfAttribute(NULL, "type");
- if (typeIdx < 0) {
- srcPos.error("A 'type' attribute is required for <public>\n");
- hasErrors = localHasErrors = true;
- }
- type = String16(block.getAttributeStringValue(typeIdx, &len));
-
- String16 name;
- ssize_t nameIdx = block.indexOfAttribute(NULL, "name");
- if (nameIdx < 0) {
- srcPos.error("A 'name' attribute is required for <public>\n");
- hasErrors = localHasErrors = true;
- }
- name = String16(block.getAttributeStringValue(nameIdx, &len));
-
- sp<AaptSymbols> symbols = assets->getJavaSymbolsFor(String8("R"));
- if (symbols != NULL) {
- symbols = symbols->addNestedSymbol(String8(type), srcPos);
- }
- if (symbols != NULL) {
- symbols->makeSymbolJavaSymbol(String8(name), srcPos);
- String16 comment(
- block.getComment(&len) ? block.getComment(&len) : nulStr);
- symbols->appendComment(String8(name), comment, srcPos);
- } else {
- srcPos.error("Unable to create symbols!\n");
- hasErrors = localHasErrors = true;
- }
-
- while ((code=block.next()) != ResXMLTree::END_DOCUMENT && code != ResXMLTree::BAD_DOCUMENT) {
- if (code == ResXMLTree::END_TAG) {
- if (strcmp16(block.getElementName(&len), java_symbol16.string()) == 0) {
- break;
- }
- }
- }
- continue;
-
-
- } else if (strcmp16(block.getElementName(&len), add_resource16.string()) == 0) {
- SourcePos srcPos(in->getPrintableSource(), block.getLineNumber());
-
- String16 typeName;
- ssize_t typeIdx = block.indexOfAttribute(NULL, "type");
- if (typeIdx < 0) {
- srcPos.error("A 'type' attribute is required for <add-resource>\n");
- hasErrors = localHasErrors = true;
- }
- typeName = String16(block.getAttributeStringValue(typeIdx, &len));
-
- String16 name;
- ssize_t nameIdx = block.indexOfAttribute(NULL, "name");
- if (nameIdx < 0) {
- srcPos.error("A 'name' attribute is required for <add-resource>\n");
- hasErrors = localHasErrors = true;
- }
- name = String16(block.getAttributeStringValue(nameIdx, &len));
-
- outTable->canAddEntry(srcPos, myPackage, typeName, name);
-
- while ((code=block.next()) != ResXMLTree::END_DOCUMENT && code != ResXMLTree::BAD_DOCUMENT) {
- if (code == ResXMLTree::END_TAG) {
- if (strcmp16(block.getElementName(&len), add_resource16.string()) == 0) {
- break;
- }
- }
- }
- continue;
-
- } else if (strcmp16(block.getElementName(&len), declare_styleable16.string()) == 0) {
- SourcePos srcPos(in->getPrintableSource(), block.getLineNumber());
-
- String16 ident;
- ssize_t identIdx = block.indexOfAttribute(NULL, "name");
- if (identIdx < 0) {
- srcPos.error("A 'name' attribute is required for <declare-styleable>\n");
- hasErrors = localHasErrors = true;
- }
- ident = String16(block.getAttributeStringValue(identIdx, &len));
-
- sp<AaptSymbols> symbols = assets->getSymbolsFor(String8("R"));
- if (!localHasErrors) {
- if (symbols != NULL) {
- symbols = symbols->addNestedSymbol(String8("styleable"), srcPos);
- }
- sp<AaptSymbols> styleSymbols = symbols;
- if (symbols != NULL) {
- symbols = symbols->addNestedSymbol(String8(ident), srcPos);
- }
- if (symbols == NULL) {
- srcPos.error("Unable to create symbols!\n");
- return UNKNOWN_ERROR;
- }
-
- String16 comment(
- block.getComment(&len) ? block.getComment(&len) : nulStr);
- styleSymbols->appendComment(String8(ident), comment, srcPos);
- } else {
- symbols = NULL;
- }
-
- while ((code=block.next()) != ResXMLTree::END_DOCUMENT && code != ResXMLTree::BAD_DOCUMENT) {
- if (code == ResXMLTree::START_TAG) {
- if (strcmp16(block.getElementName(&len), skip16.string()) == 0) {
- while ((code=block.next()) != ResXMLTree::END_DOCUMENT
- && code != ResXMLTree::BAD_DOCUMENT) {
- if (code == ResXMLTree::END_TAG) {
- if (strcmp16(block.getElementName(&len), skip16.string()) == 0) {
- break;
- }
- }
- }
- continue;
- } else if (strcmp16(block.getElementName(&len), eat_comment16.string()) == 0) {
- while ((code=block.next()) != ResXMLTree::END_DOCUMENT
- && code != ResXMLTree::BAD_DOCUMENT) {
- if (code == ResXMLTree::END_TAG) {
- if (strcmp16(block.getElementName(&len), eat_comment16.string()) == 0) {
- break;
- }
- }
- }
- continue;
- } else if (strcmp16(block.getElementName(&len), attr16.string()) != 0) {
- SourcePos(in->getPrintableSource(), block.getLineNumber()).error(
- "Tag <%s> can not appear inside <declare-styleable>, only <attr>\n",
- String8(block.getElementName(&len)).string());
- return UNKNOWN_ERROR;
- }
-
- String16 comment(
- block.getComment(&len) ? block.getComment(&len) : nulStr);
- String16 itemIdent;
- err = compileAttribute(in, block, myPackage, outTable, &itemIdent, true);
- if (err != NO_ERROR) {
- hasErrors = localHasErrors = true;
- }
-
- if (symbols != NULL) {
- SourcePos srcPos(String8(in->getPrintableSource()), block.getLineNumber());
- symbols->addSymbol(String8(itemIdent), 0, srcPos);
- symbols->appendComment(String8(itemIdent), comment, srcPos);
- //printf("Attribute %s comment: %s\n", String8(itemIdent).string(),
- // String8(comment).string());
- }
- } else if (code == ResXMLTree::END_TAG) {
- if (strcmp16(block.getElementName(&len), declare_styleable16.string()) == 0) {
- break;
- }
-
- SourcePos(in->getPrintableSource(), block.getLineNumber()).error(
- "Found tag </%s> where </attr> is expected\n",
- String8(block.getElementName(&len)).string());
- return UNKNOWN_ERROR;
- }
- }
- continue;
-
- } else if (strcmp16(block.getElementName(&len), attr16.string()) == 0) {
- err = compileAttribute(in, block, myPackage, outTable, NULL);
- if (err != NO_ERROR) {
- hasErrors = true;
- }
- continue;
-
- } else if (strcmp16(block.getElementName(&len), item16.string()) == 0) {
- curTag = &item16;
- ssize_t attri = block.indexOfAttribute(NULL, "type");
- if (attri >= 0) {
- curType = String16(block.getAttributeStringValue(attri, &len));
- ssize_t formatIdx = block.indexOfAttribute(NULL, "format");
- if (formatIdx >= 0) {
- String16 formatStr = String16(block.getAttributeStringValue(
- formatIdx, &len));
- curFormat = parse_flags(formatStr.string(), formatStr.size(),
- gFormatFlags);
- if (curFormat == 0) {
- SourcePos(in->getPrintableSource(), block.getLineNumber()).error(
- "Tag <item> 'format' attribute value \"%s\" not valid\n",
- String8(formatStr).string());
- hasErrors = localHasErrors = true;
- }
- }
- } else {
- SourcePos(in->getPrintableSource(), block.getLineNumber()).error(
- "A 'type' attribute is required for <item>\n");
- hasErrors = localHasErrors = true;
- }
- curIsStyled = true;
- } else if (strcmp16(block.getElementName(&len), string16.string()) == 0) {
- // Note the existence and locale of every string we process
- char rawLocale[16];
- curParams.getLocale(rawLocale);
- String8 locale(rawLocale);
- String16 name;
- String16 translatable;
- String16 formatted;
-
- size_t n = block.getAttributeCount();
- for (size_t i = 0; i < n; i++) {
- size_t length;
- const uint16_t* attr = block.getAttributeName(i, &length);
- if (strcmp16(attr, name16.string()) == 0) {
- name.setTo(block.getAttributeStringValue(i, &length));
- } else if (strcmp16(attr, translatable16.string()) == 0) {
- translatable.setTo(block.getAttributeStringValue(i, &length));
- } else if (strcmp16(attr, formatted16.string()) == 0) {
- formatted.setTo(block.getAttributeStringValue(i, &length));
- }
- }
-
- if (name.size() > 0) {
- if (translatable == false16) {
- curIsFormatted = false;
- // Untranslatable strings must only exist in the default [empty] locale
- if (locale.size() > 0) {
- fprintf(stderr, "aapt: warning: string '%s' in %s marked untranslatable but exists"
- " in locale '%s'\n", String8(name).string(),
- bundle->getResourceSourceDirs()[0],
- locale.string());
- // hasErrors = localHasErrors = true;
- } else {
- // Intentionally empty block:
- //
- // Don't add untranslatable strings to the localization table; that
- // way if we later see localizations of them, they'll be flagged as
- // having no default translation.
- }
- } else {
- outTable->addLocalization(name, locale);
- }
-
- if (formatted == false16) {
- curIsFormatted = false;
- }
- }
-
- curTag = &string16;
- curType = string16;
- curFormat = ResTable_map::TYPE_REFERENCE|ResTable_map::TYPE_STRING;
- curIsStyled = true;
- curIsPseudolocalizable = true;
- } else if (strcmp16(block.getElementName(&len), drawable16.string()) == 0) {
- curTag = &drawable16;
- curType = drawable16;
- curFormat = ResTable_map::TYPE_REFERENCE|ResTable_map::TYPE_COLOR;
- } else if (strcmp16(block.getElementName(&len), color16.string()) == 0) {
- curTag = &color16;
- curType = color16;
- curFormat = ResTable_map::TYPE_REFERENCE|ResTable_map::TYPE_COLOR;
- } else if (strcmp16(block.getElementName(&len), bool16.string()) == 0) {
- curTag = &bool16;
- curType = bool16;
- curFormat = ResTable_map::TYPE_REFERENCE|ResTable_map::TYPE_BOOLEAN;
- } else if (strcmp16(block.getElementName(&len), integer16.string()) == 0) {
- curTag = &integer16;
- curType = integer16;
- curFormat = ResTable_map::TYPE_REFERENCE|ResTable_map::TYPE_INTEGER;
- } else if (strcmp16(block.getElementName(&len), dimen16.string()) == 0) {
- curTag = &dimen16;
- curType = dimen16;
- curFormat = ResTable_map::TYPE_REFERENCE|ResTable_map::TYPE_DIMENSION;
- } else if (strcmp16(block.getElementName(&len), fraction16.string()) == 0) {
- curTag = &fraction16;
- curType = fraction16;
- curFormat = ResTable_map::TYPE_REFERENCE|ResTable_map::TYPE_FRACTION;
- } else if (strcmp16(block.getElementName(&len), bag16.string()) == 0) {
- curTag = &bag16;
- curIsBag = true;
- ssize_t attri = block.indexOfAttribute(NULL, "type");
- if (attri >= 0) {
- curType = String16(block.getAttributeStringValue(attri, &len));
- } else {
- SourcePos(in->getPrintableSource(), block.getLineNumber()).error(
- "A 'type' attribute is required for <bag>\n");
- hasErrors = localHasErrors = true;
- }
- } else if (strcmp16(block.getElementName(&len), style16.string()) == 0) {
- curTag = &style16;
- curType = style16;
- curIsBag = true;
- } else if (strcmp16(block.getElementName(&len), plurals16.string()) == 0) {
- curTag = &plurals16;
- curType = plurals16;
- curIsBag = true;
- } else if (strcmp16(block.getElementName(&len), array16.string()) == 0) {
- curTag = &array16;
- curType = array16;
- curIsBag = true;
- curIsBagReplaceOnOverwrite = true;
- ssize_t formatIdx = block.indexOfAttribute(NULL, "format");
- if (formatIdx >= 0) {
- String16 formatStr = String16(block.getAttributeStringValue(
- formatIdx, &len));
- curFormat = parse_flags(formatStr.string(), formatStr.size(),
- gFormatFlags);
- if (curFormat == 0) {
- SourcePos(in->getPrintableSource(), block.getLineNumber()).error(
- "Tag <array> 'format' attribute value \"%s\" not valid\n",
- String8(formatStr).string());
- hasErrors = localHasErrors = true;
- }
- }
- } else if (strcmp16(block.getElementName(&len), string_array16.string()) == 0) {
- // Check whether these strings need valid formats.
- // (simplified form of what string16 does above)
- size_t n = block.getAttributeCount();
- for (size_t i = 0; i < n; i++) {
- size_t length;
- const uint16_t* attr = block.getAttributeName(i, &length);
- if (strcmp16(attr, translatable16.string()) == 0
- || strcmp16(attr, formatted16.string()) == 0) {
- const uint16_t* value = block.getAttributeStringValue(i, &length);
- if (strcmp16(value, false16.string()) == 0) {
- curIsFormatted = false;
- break;
- }
- }
- }
-
- curTag = &string_array16;
- curType = array16;
- curFormat = ResTable_map::TYPE_REFERENCE|ResTable_map::TYPE_STRING;
- curIsBag = true;
- curIsBagReplaceOnOverwrite = true;
- curIsPseudolocalizable = true;
- } else if (strcmp16(block.getElementName(&len), integer_array16.string()) == 0) {
- curTag = &integer_array16;
- curType = array16;
- curFormat = ResTable_map::TYPE_REFERENCE|ResTable_map::TYPE_INTEGER;
- curIsBag = true;
- curIsBagReplaceOnOverwrite = true;
- } else {
- SourcePos(in->getPrintableSource(), block.getLineNumber()).error(
- "Found tag %s where item is expected\n",
- String8(block.getElementName(&len)).string());
- return UNKNOWN_ERROR;
- }
-
- String16 ident;
- ssize_t identIdx = block.indexOfAttribute(NULL, "name");
- if (identIdx >= 0) {
- ident = String16(block.getAttributeStringValue(identIdx, &len));
- } else {
- SourcePos(in->getPrintableSource(), block.getLineNumber()).error(
- "A 'name' attribute is required for <%s>\n",
- String8(*curTag).string());
- hasErrors = localHasErrors = true;
- }
-
- String16 product;
- identIdx = block.indexOfAttribute(NULL, "product");
- if (identIdx >= 0) {
- product = String16(block.getAttributeStringValue(identIdx, &len));
- }
-
- String16 comment(block.getComment(&len) ? block.getComment(&len) : nulStr);
-
- if (curIsBag) {
- // Figure out the parent of this bag...
- String16 parentIdent;
- ssize_t parentIdentIdx = block.indexOfAttribute(NULL, "parent");
- if (parentIdentIdx >= 0) {
- parentIdent = String16(block.getAttributeStringValue(parentIdentIdx, &len));
- } else {
- ssize_t sep = ident.findLast('.');
- if (sep >= 0) {
- parentIdent.setTo(ident, sep);
- }
- }
-
- if (!localHasErrors) {
- err = outTable->startBag(SourcePos(in->getPrintableSource(),
- block.getLineNumber()), myPackage, curType, ident,
- parentIdent, &curParams,
- overwrite, curIsBagReplaceOnOverwrite);
- if (err != NO_ERROR) {
- hasErrors = localHasErrors = true;
- }
- }
-
- ssize_t elmIndex = 0;
- char elmIndexStr[14];
- while ((code=block.next()) != ResXMLTree::END_DOCUMENT
- && code != ResXMLTree::BAD_DOCUMENT) {
-
- if (code == ResXMLTree::START_TAG) {
- if (strcmp16(block.getElementName(&len), item16.string()) != 0) {
- SourcePos(in->getPrintableSource(), block.getLineNumber()).error(
- "Tag <%s> can not appear inside <%s>, only <item>\n",
- String8(block.getElementName(&len)).string(),
- String8(*curTag).string());
- return UNKNOWN_ERROR;
- }
-
- String16 itemIdent;
- if (curType == array16) {
- sprintf(elmIndexStr, "^index_%d", (int)elmIndex++);
- itemIdent = String16(elmIndexStr);
- } else if (curType == plurals16) {
- ssize_t itemIdentIdx = block.indexOfAttribute(NULL, "quantity");
- if (itemIdentIdx >= 0) {
- String16 quantity16(block.getAttributeStringValue(itemIdentIdx, &len));
- if (quantity16 == other16) {
- itemIdent = quantityOther16;
- }
- else if (quantity16 == zero16) {
- itemIdent = quantityZero16;
- }
- else if (quantity16 == one16) {
- itemIdent = quantityOne16;
- }
- else if (quantity16 == two16) {
- itemIdent = quantityTwo16;
- }
- else if (quantity16 == few16) {
- itemIdent = quantityFew16;
- }
- else if (quantity16 == many16) {
- itemIdent = quantityMany16;
- }
- else {
- SourcePos(in->getPrintableSource(), block.getLineNumber()).error(
- "Illegal 'quantity' attribute is <item> inside <plurals>\n");
- hasErrors = localHasErrors = true;
- }
- } else {
- SourcePos(in->getPrintableSource(), block.getLineNumber()).error(
- "A 'quantity' attribute is required for <item> inside <plurals>\n");
- hasErrors = localHasErrors = true;
- }
- } else {
- ssize_t itemIdentIdx = block.indexOfAttribute(NULL, "name");
- if (itemIdentIdx >= 0) {
- itemIdent = String16(block.getAttributeStringValue(itemIdentIdx, &len));
- } else {
- SourcePos(in->getPrintableSource(), block.getLineNumber()).error(
- "A 'name' attribute is required for <item>\n");
- hasErrors = localHasErrors = true;
- }
- }
-
- ResXMLParser::ResXMLPosition parserPosition;
- block.getPosition(&parserPosition);
-
- err = parseAndAddBag(bundle, in, &block, curParams, myPackage, curType,
- ident, parentIdent, itemIdent, curFormat, curIsFormatted,
- product, false, overwrite, outTable);
- if (err == NO_ERROR) {
- if (curIsPseudolocalizable && localeIsDefined(curParams)
- && bundle->getPseudolocalize()) {
- // pseudolocalize here
-#if 1
- block.setPosition(parserPosition);
- err = parseAndAddBag(bundle, in, &block, pseudoParams, myPackage,
- curType, ident, parentIdent, itemIdent, curFormat,
- curIsFormatted, product, true, overwrite, outTable);
-#endif
- }
- }
- if (err != NO_ERROR) {
- hasErrors = localHasErrors = true;
- }
- } else if (code == ResXMLTree::END_TAG) {
- if (strcmp16(block.getElementName(&len), curTag->string()) != 0) {
- SourcePos(in->getPrintableSource(), block.getLineNumber()).error(
- "Found tag </%s> where </%s> is expected\n",
- String8(block.getElementName(&len)).string(),
- String8(*curTag).string());
- return UNKNOWN_ERROR;
- }
- break;
- }
- }
- } else {
- ResXMLParser::ResXMLPosition parserPosition;
- block.getPosition(&parserPosition);
-
- err = parseAndAddEntry(bundle, in, &block, curParams, myPackage, curType, ident,
- *curTag, curIsStyled, curFormat, curIsFormatted,
- product, false, overwrite, &skippedResourceNames, outTable);
-
- if (err < NO_ERROR) { // Why err < NO_ERROR instead of err != NO_ERROR?
- hasErrors = localHasErrors = true;
- }
- else if (err == NO_ERROR) {
- if (curIsPseudolocalizable && localeIsDefined(curParams)
- && bundle->getPseudolocalize()) {
- // pseudolocalize here
- block.setPosition(parserPosition);
- err = parseAndAddEntry(bundle, in, &block, pseudoParams, myPackage, curType,
- ident, *curTag, curIsStyled, curFormat,
- curIsFormatted, product,
- true, overwrite, &skippedResourceNames, outTable);
- if (err != NO_ERROR) {
- hasErrors = localHasErrors = true;
- }
- }
- }
- }
-
-#if 0
- if (comment.size() > 0) {
- printf("Comment for @%s:%s/%s: %s\n", String8(myPackage).string(),
- String8(curType).string(), String8(ident).string(),
- String8(comment).string());
- }
-#endif
- if (!localHasErrors) {
- outTable->appendComment(myPackage, curType, ident, comment, false);
- }
- }
- else if (code == ResXMLTree::END_TAG) {
- if (strcmp16(block.getElementName(&len), resources16.string()) != 0) {
- SourcePos(in->getPrintableSource(), block.getLineNumber()).error(
- "Unexpected end tag %s\n", String8(block.getElementName(&len)).string());
- return UNKNOWN_ERROR;
- }
- }
- else if (code == ResXMLTree::START_NAMESPACE || code == ResXMLTree::END_NAMESPACE) {
- }
- else if (code == ResXMLTree::TEXT) {
- if (isWhitespace(block.getText(&len))) {
- continue;
- }
- SourcePos(in->getPrintableSource(), block.getLineNumber()).error(
- "Found text \"%s\" where item tag is expected\n",
- String8(block.getText(&len)).string());
- return UNKNOWN_ERROR;
- }
- }
-
- // For every resource defined, there must be exist one variant with a product attribute
- // set to 'default' (or no product attribute at all).
- // We check to see that for every resource that was ignored because of a mismatched
- // product attribute, some product variant of that resource was processed.
- for (size_t i = 0; i < skippedResourceNames.size(); i++) {
- if (skippedResourceNames[i]) {
- const type_ident_pair_t& p = skippedResourceNames.keyAt(i);
- if (!outTable->hasBagOrEntry(myPackage, p.type, p.ident)) {
- const char* bundleProduct =
- (bundle->getProduct() == NULL) ? "" : bundle->getProduct();
- fprintf(stderr, "In resource file %s: %s\n",
- in->getPrintableSource().string(),
- curParams.toString().string());
-
- fprintf(stderr, "\t%s '%s' does not match product %s.\n"
- "\tYou may have forgotten to include a 'default' product variant"
- " of the resource.\n",
- String8(p.type).string(), String8(p.ident).string(),
- bundleProduct[0] == 0 ? "default" : bundleProduct);
- return UNKNOWN_ERROR;
- }
- }
- }
-
- return hasErrors ? UNKNOWN_ERROR : NO_ERROR;
-}
-
-ResourceTable::ResourceTable(Bundle* bundle, const String16& assetsPackage)
- : mAssetsPackage(assetsPackage), mNextPackageId(1), mHaveAppPackage(false),
- mIsAppPackage(!bundle->getExtending()),
- mNumLocal(0),
- mBundle(bundle)
-{
-}
-
-status_t ResourceTable::addIncludedResources(Bundle* bundle, const sp<AaptAssets>& assets)
-{
- status_t err = assets->buildIncludedResources(bundle);
- if (err != NO_ERROR) {
- return err;
- }
-
- // For future reference to included resources.
- mAssets = assets;
-
- const ResTable& incl = assets->getIncludedResources();
-
- // Retrieve all the packages.
- const size_t N = incl.getBasePackageCount();
- for (size_t phase=0; phase<2; phase++) {
- for (size_t i=0; i<N; i++) {
- String16 name(incl.getBasePackageName(i));
- uint32_t id = incl.getBasePackageId(i);
- // First time through: only add base packages (id
- // is not 0); second time through add the other
- // packages.
- if (phase != 0) {
- if (id != 0) {
- // Skip base packages -- already one.
- id = 0;
- } else {
- // Assign a dynamic id.
- id = mNextPackageId;
- }
- } else if (id != 0) {
- if (id == 127) {
- if (mHaveAppPackage) {
- fprintf(stderr, "Included resources have two application packages!\n");
- return UNKNOWN_ERROR;
- }
- mHaveAppPackage = true;
- }
- if (mNextPackageId > id) {
- fprintf(stderr, "Included base package ID %d already in use!\n", id);
- return UNKNOWN_ERROR;
- }
- }
- if (id != 0) {
- NOISY(printf("Including package %s with ID=%d\n",
- String8(name).string(), id));
- sp<Package> p = new Package(name, id);
- mPackages.add(name, p);
- mOrderedPackages.add(p);
-
- if (id >= mNextPackageId) {
- mNextPackageId = id+1;
- }
- }
- }
- }
-
- // Every resource table always has one first entry, the bag attributes.
- const SourcePos unknown(String8("????"), 0);
- sp<Type> attr = getType(mAssetsPackage, String16("attr"), unknown);
-
- return NO_ERROR;
-}
-
-status_t ResourceTable::addPublic(const SourcePos& sourcePos,
- const String16& package,
- const String16& type,
- const String16& name,
- const uint32_t ident)
-{
- uint32_t rid = mAssets->getIncludedResources()
- .identifierForName(name.string(), name.size(),
- type.string(), type.size(),
- package.string(), package.size());
- if (rid != 0) {
- sourcePos.error("Error declaring public resource %s/%s for included package %s\n",
- String8(type).string(), String8(name).string(),
- String8(package).string());
- return UNKNOWN_ERROR;
- }
-
- sp<Type> t = getType(package, type, sourcePos);
- if (t == NULL) {
- return UNKNOWN_ERROR;
- }
- return t->addPublic(sourcePos, name, ident);
-}
-
-status_t ResourceTable::addEntry(const SourcePos& sourcePos,
- const String16& package,
- const String16& type,
- const String16& name,
- const String16& value,
- const Vector<StringPool::entry_style_span>* style,
- const ResTable_config* params,
- const bool doSetIndex,
- 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.
- uint32_t rid = mAssets->getIncludedResources()
- .identifierForName(name.string(), name.size(),
- type.string(), type.size(),
- package.string(), package.size());
- if (rid != 0) {
- return NO_ERROR;
- }
-
-#if 0
- if (name == String16("left")) {
- printf("Adding entry left: file=%s, line=%d, type=%s, value=%s\n",
- sourcePos.file.string(), sourcePos.line, String8(type).string(),
- String8(value).string());
- }
-#endif
-
- sp<Entry> e = getEntry(package, type, name, sourcePos, overwrite,
- params, doSetIndex);
- if (e == NULL) {
- return UNKNOWN_ERROR;
- }
- status_t err = e->setItem(sourcePos, value, style, format, overwrite);
- if (err == NO_ERROR) {
- mNumLocal++;
- }
- return err;
-}
-
-status_t ResourceTable::startBag(const SourcePos& sourcePos,
- const String16& package,
- const String16& type,
- const String16& name,
- const String16& bagParent,
- const ResTable_config* params,
- bool overlay,
- bool replace, bool isId)
-{
- status_t result = NO_ERROR;
-
- // Check for adding entries in other packages... for now we do
- // nothing. We need to do the right thing here to support skinning.
- uint32_t rid = mAssets->getIncludedResources()
- .identifierForName(name.string(), name.size(),
- type.string(), type.size(),
- package.string(), package.size());
- if (rid != 0) {
- return NO_ERROR;
- }
-
-#if 0
- if (name == String16("left")) {
- printf("Adding bag left: file=%s, line=%d, type=%s\n",
- sourcePos.file.striing(), sourcePos.line, String8(type).string());
- }
-#endif
- if (overlay && !mBundle->getAutoAddOverlay() && !hasBagOrEntry(package, type, name)) {
- bool canAdd = false;
- sp<Package> p = mPackages.valueFor(package);
- if (p != NULL) {
- sp<Type> t = p->getTypes().valueFor(type);
- if (t != NULL) {
- if (t->getCanAddEntries().indexOf(name) >= 0) {
- canAdd = true;
- }
- }
- }
- if (!canAdd) {
- sourcePos.error("Resource does not already exist in overlay at '%s'; use <add-resource> to add.\n",
- String8(name).string());
- return UNKNOWN_ERROR;
- }
- }
- sp<Entry> e = getEntry(package, type, name, sourcePos, overlay, params);
- if (e == NULL) {
- return UNKNOWN_ERROR;
- }
-
- // If a parent is explicitly specified, set it.
- if (bagParent.size() > 0) {
- e->setParent(bagParent);
- }
-
- if ((result = e->makeItABag(sourcePos)) != NO_ERROR) {
- return result;
- }
-
- if (overlay && replace) {
- return e->emptyBag(sourcePos);
- }
- return result;
-}
-
-status_t ResourceTable::addBag(const SourcePos& sourcePos,
- const String16& package,
- const String16& type,
- const String16& name,
- const String16& bagParent,
- const String16& bagKey,
- const String16& value,
- const Vector<StringPool::entry_style_span>* style,
- const ResTable_config* params,
- bool replace, bool isId, const int32_t format)
-{
- // Check for adding entries in other packages... for now we do
- // nothing. We need to do the right thing here to support skinning.
- uint32_t rid = mAssets->getIncludedResources()
- .identifierForName(name.string(), name.size(),
- type.string(), type.size(),
- package.string(), package.size());
- if (rid != 0) {
- return NO_ERROR;
- }
-
-#if 0
- if (name == String16("left")) {
- printf("Adding bag left: file=%s, line=%d, type=%s\n",
- sourcePos.file.striing(), sourcePos.line, String8(type).string());
- }
-#endif
- sp<Entry> e = getEntry(package, type, name, sourcePos, replace, params);
- if (e == NULL) {
- return UNKNOWN_ERROR;
- }
-
- // If a parent is explicitly specified, set it.
- if (bagParent.size() > 0) {
- e->setParent(bagParent);
- }
-
- const bool first = e->getBag().indexOfKey(bagKey) < 0;
- status_t err = e->addToBag(sourcePos, bagKey, value, style, replace, isId, format);
- if (err == NO_ERROR && first) {
- mNumLocal++;
- }
- return err;
-}
-
-bool ResourceTable::hasBagOrEntry(const String16& package,
- const String16& type,
- const String16& name) const
-{
- // First look for this in the included resources...
- uint32_t rid = mAssets->getIncludedResources()
- .identifierForName(name.string(), name.size(),
- type.string(), type.size(),
- package.string(), package.size());
- if (rid != 0) {
- return true;
- }
-
- sp<Package> p = mPackages.valueFor(package);
- if (p != NULL) {
- sp<Type> t = p->getTypes().valueFor(type);
- if (t != NULL) {
- sp<ConfigList> c = t->getConfigs().valueFor(name);
- if (c != NULL) return true;
- }
- }
-
- return false;
-}
-
-bool ResourceTable::hasBagOrEntry(const String16& package,
- const String16& type,
- const String16& name,
- const ResTable_config& config) const
-{
- // First look for this in the included resources...
- uint32_t rid = mAssets->getIncludedResources()
- .identifierForName(name.string(), name.size(),
- type.string(), type.size(),
- package.string(), package.size());
- if (rid != 0) {
- return true;
- }
-
- sp<Package> p = mPackages.valueFor(package);
- if (p != NULL) {
- sp<Type> t = p->getTypes().valueFor(type);
- if (t != NULL) {
- sp<ConfigList> c = t->getConfigs().valueFor(name);
- if (c != NULL) {
- sp<Entry> e = c->getEntries().valueFor(config);
- if (e != NULL) {
- return true;
- }
- }
- }
- }
-
- return false;
-}
-
-bool ResourceTable::hasBagOrEntry(const String16& ref,
- const String16* defType,
- const String16* defPackage)
-{
- String16 package, type, name;
- if (!ResTable::expandResourceRef(ref.string(), ref.size(), &package, &type, &name,
- defType, defPackage ? defPackage:&mAssetsPackage, NULL)) {
- return false;
- }
- return hasBagOrEntry(package, type, name);
-}
-
-bool ResourceTable::appendComment(const String16& package,
- const String16& type,
- const String16& name,
- const String16& comment,
- bool onlyIfEmpty)
-{
- if (comment.size() <= 0) {
- return true;
- }
-
- sp<Package> p = mPackages.valueFor(package);
- if (p != NULL) {
- sp<Type> t = p->getTypes().valueFor(type);
- if (t != NULL) {
- sp<ConfigList> c = t->getConfigs().valueFor(name);
- if (c != NULL) {
- c->appendComment(comment, onlyIfEmpty);
- return true;
- }
- }
- }
- return false;
-}
-
-bool ResourceTable::appendTypeComment(const String16& package,
- const String16& type,
- const String16& name,
- const String16& comment)
-{
- if (comment.size() <= 0) {
- return true;
- }
-
- sp<Package> p = mPackages.valueFor(package);
- if (p != NULL) {
- sp<Type> t = p->getTypes().valueFor(type);
- if (t != NULL) {
- sp<ConfigList> c = t->getConfigs().valueFor(name);
- if (c != NULL) {
- c->appendTypeComment(comment);
- return true;
- }
- }
- }
- return false;
-}
-
-void ResourceTable::canAddEntry(const SourcePos& pos,
- const String16& package, const String16& type, const String16& name)
-{
- sp<Type> t = getType(package, type, pos);
- if (t != NULL) {
- t->canAddEntry(name);
- }
-}
-
-size_t ResourceTable::size() const {
- return mPackages.size();
-}
-
-size_t ResourceTable::numLocalResources() const {
- return mNumLocal;
-}
-
-bool ResourceTable::hasResources() const {
- return mNumLocal > 0;
-}
-
-sp<AaptFile> ResourceTable::flatten(Bundle* bundle)
-{
- sp<AaptFile> data = new AaptFile(String8(), AaptGroupEntry(), String8());
- status_t err = flatten(bundle, data);
- return err == NO_ERROR ? data : NULL;
-}
-
-inline uint32_t ResourceTable::getResId(const sp<Package>& p,
- const sp<Type>& t,
- uint32_t nameId)
-{
- return makeResId(p->getAssignedId(), t->getIndex(), nameId);
-}
-
-uint32_t ResourceTable::getResId(const String16& package,
- const String16& type,
- const String16& name,
- bool onlyPublic) const
-{
- uint32_t id = ResourceIdCache::lookup(package, type, name, onlyPublic);
- if (id != 0) return id; // cache hit
-
- sp<Package> p = mPackages.valueFor(package);
- if (p == NULL) return 0;
-
- // First look for this in the included resources...
- uint32_t specFlags = 0;
- uint32_t rid = mAssets->getIncludedResources()
- .identifierForName(name.string(), name.size(),
- type.string(), type.size(),
- package.string(), package.size(),
- &specFlags);
- if (rid != 0) {
- if (onlyPublic) {
- if ((specFlags & ResTable_typeSpec::SPEC_PUBLIC) == 0) {
- return 0;
- }
- }
-
- if (Res_INTERNALID(rid)) {
- return ResourceIdCache::store(package, type, name, onlyPublic, rid);
- }
- return ResourceIdCache::store(package, type, name, onlyPublic,
- Res_MAKEID(p->getAssignedId()-1, Res_GETTYPE(rid), Res_GETENTRY(rid)));
- }
-
- sp<Type> t = p->getTypes().valueFor(type);
- if (t == NULL) return 0;
- sp<ConfigList> c = t->getConfigs().valueFor(name);
- if (c == NULL) return 0;
- int32_t ei = c->getEntryIndex();
- if (ei < 0) return 0;
-
- return ResourceIdCache::store(package, type, name, onlyPublic,
- getResId(p, t, ei));
-}
-
-uint32_t ResourceTable::getResId(const String16& ref,
- const String16* defType,
- const String16* defPackage,
- const char** outErrorMsg,
- bool onlyPublic) const
-{
- String16 package, type, name;
- bool refOnlyPublic = true;
- if (!ResTable::expandResourceRef(
- ref.string(), ref.size(), &package, &type, &name,
- defType, defPackage ? defPackage:&mAssetsPackage,
- outErrorMsg, &refOnlyPublic)) {
- NOISY(printf("Expanding resource: ref=%s\n",
- String8(ref).string()));
- NOISY(printf("Expanding resource: defType=%s\n",
- defType ? String8(*defType).string() : "NULL"));
- NOISY(printf("Expanding resource: defPackage=%s\n",
- defPackage ? String8(*defPackage).string() : "NULL"));
- NOISY(printf("Expanding resource: ref=%s\n", String8(ref).string()));
- NOISY(printf("Expanded resource: p=%s, t=%s, n=%s, res=0\n",
- String8(package).string(), String8(type).string(),
- String8(name).string()));
- return 0;
- }
- uint32_t res = getResId(package, type, name, onlyPublic && refOnlyPublic);
- NOISY(printf("Expanded resource: p=%s, t=%s, n=%s, res=%d\n",
- String8(package).string(), String8(type).string(),
- String8(name).string(), res));
- if (res == 0) {
- if (outErrorMsg)
- *outErrorMsg = "No resource found that matches the given name";
- }
- return res;
-}
-
-bool ResourceTable::isValidResourceName(const String16& s)
-{
- const char16_t* p = s.string();
- bool first = true;
- while (*p) {
- if ((*p >= 'a' && *p <= 'z')
- || (*p >= 'A' && *p <= 'Z')
- || *p == '_'
- || (!first && *p >= '0' && *p <= '9')) {
- first = false;
- p++;
- continue;
- }
- return false;
- }
- return true;
-}
-
-bool ResourceTable::stringToValue(Res_value* outValue, StringPool* pool,
- const String16& str,
- bool preserveSpaces, bool coerceType,
- uint32_t attrID,
- const Vector<StringPool::entry_style_span>* style,
- String16* outStr, void* accessorCookie,
- uint32_t attrType, const String8* configTypeName,
- const ConfigDescription* config)
-{
- String16 finalStr;
-
- bool res = true;
- if (style == NULL || style->size() == 0) {
- // Text is not styled so it can be any type... let's figure it out.
- res = mAssets->getIncludedResources()
- .stringToValue(outValue, &finalStr, str.string(), str.size(), preserveSpaces,
- coerceType, attrID, NULL, &mAssetsPackage, this,
- accessorCookie, attrType);
- } else {
- // Styled text can only be a string, and while collecting the style
- // information we have already processed that string!
- outValue->size = sizeof(Res_value);
- outValue->res0 = 0;
- outValue->dataType = outValue->TYPE_STRING;
- outValue->data = 0;
- finalStr = str;
- }
-
- if (!res) {
- return false;
- }
-
- if (outValue->dataType == outValue->TYPE_STRING) {
- // Should do better merging styles.
- if (pool) {
- String8 configStr;
- if (config != NULL) {
- configStr = config->toString();
- } else {
- configStr = "(null)";
- }
- NOISY(printf("Adding to pool string style #%d config %s: %s\n",
- style != NULL ? style->size() : 0,
- configStr.string(), String8(finalStr).string()));
- if (style != NULL && style->size() > 0) {
- outValue->data = pool->add(finalStr, *style, configTypeName, config);
- } else {
- outValue->data = pool->add(finalStr, true, configTypeName, config);
- }
- } else {
- // Caller will fill this in later.
- outValue->data = 0;
- }
-
- if (outStr) {
- *outStr = finalStr;
- }
-
- }
-
- return true;
-}
-
-uint32_t ResourceTable::getCustomResource(
- const String16& package, const String16& type, const String16& name) const
-{
- //printf("getCustomResource: %s %s %s\n", String8(package).string(),
- // String8(type).string(), String8(name).string());
- sp<Package> p = mPackages.valueFor(package);
- if (p == NULL) return 0;
- sp<Type> t = p->getTypes().valueFor(type);
- if (t == NULL) return 0;
- sp<ConfigList> c = t->getConfigs().valueFor(name);
- if (c == NULL) return 0;
- int32_t ei = c->getEntryIndex();
- if (ei < 0) return 0;
- return getResId(p, t, ei);
-}
-
-uint32_t ResourceTable::getCustomResourceWithCreation(
- const String16& package, const String16& type, const String16& name,
- const bool createIfNotFound)
-{
- uint32_t resId = getCustomResource(package, type, name);
- if (resId != 0 || !createIfNotFound) {
- return resId;
- }
- String16 value("false");
-
- status_t status = addEntry(mCurrentXmlPos, package, type, name, value, NULL, NULL, true);
- if (status == NO_ERROR) {
- resId = getResId(package, type, name);
- return resId;
- }
- return 0;
-}
-
-uint32_t ResourceTable::getRemappedPackage(uint32_t origPackage) const
-{
- return origPackage;
-}
-
-bool ResourceTable::getAttributeType(uint32_t attrID, uint32_t* outType)
-{
- //printf("getAttributeType #%08x\n", attrID);
- Res_value value;
- if (getItemValue(attrID, ResTable_map::ATTR_TYPE, &value)) {
- //printf("getAttributeType #%08x (%s): #%08x\n", attrID,
- // String8(getEntry(attrID)->getName()).string(), value.data);
- *outType = value.data;
- return true;
- }
- return false;
-}
-
-bool ResourceTable::getAttributeMin(uint32_t attrID, uint32_t* outMin)
-{
- //printf("getAttributeMin #%08x\n", attrID);
- Res_value value;
- if (getItemValue(attrID, ResTable_map::ATTR_MIN, &value)) {
- *outMin = value.data;
- return true;
- }
- return false;
-}
-
-bool ResourceTable::getAttributeMax(uint32_t attrID, uint32_t* outMax)
-{
- //printf("getAttributeMax #%08x\n", attrID);
- Res_value value;
- if (getItemValue(attrID, ResTable_map::ATTR_MAX, &value)) {
- *outMax = value.data;
- return true;
- }
- return false;
-}
-
-uint32_t ResourceTable::getAttributeL10N(uint32_t attrID)
-{
- //printf("getAttributeL10N #%08x\n", attrID);
- Res_value value;
- if (getItemValue(attrID, ResTable_map::ATTR_L10N, &value)) {
- return value.data;
- }
- return ResTable_map::L10N_NOT_REQUIRED;
-}
-
-bool ResourceTable::getLocalizationSetting()
-{
- return mBundle->getRequireLocalization();
-}
-
-void ResourceTable::reportError(void* accessorCookie, const char* fmt, ...)
-{
- if (accessorCookie != NULL && fmt != NULL) {
- AccessorCookie* ac = (AccessorCookie*)accessorCookie;
- int retval=0;
- char buf[1024];
- va_list ap;
- va_start(ap, fmt);
- retval = vsnprintf(buf, sizeof(buf), fmt, ap);
- va_end(ap);
- ac->sourcePos.error("Error: %s (at '%s' with value '%s').\n",
- buf, ac->attr.string(), ac->value.string());
- }
-}
-
-bool ResourceTable::getAttributeKeys(
- uint32_t attrID, Vector<String16>* outKeys)
-{
- sp<const Entry> e = getEntry(attrID);
- if (e != NULL) {
- const size_t N = e->getBag().size();
- for (size_t i=0; i<N; i++) {
- const String16& key = e->getBag().keyAt(i);
- if (key.size() > 0 && key.string()[0] != '^') {
- outKeys->add(key);
- }
- }
- return true;
- }
- return false;
-}
-
-bool ResourceTable::getAttributeEnum(
- uint32_t attrID, const char16_t* name, size_t nameLen,
- Res_value* outValue)
-{
- //printf("getAttributeEnum #%08x %s\n", attrID, String8(name, nameLen).string());
- String16 nameStr(name, nameLen);
- sp<const Entry> e = getEntry(attrID);
- if (e != NULL) {
- const size_t N = e->getBag().size();
- for (size_t i=0; i<N; i++) {
- //printf("Comparing %s to %s\n", String8(name, nameLen).string(),
- // String8(e->getBag().keyAt(i)).string());
- if (e->getBag().keyAt(i) == nameStr) {
- return getItemValue(attrID, e->getBag().valueAt(i).bagKeyId, outValue);
- }
- }
- }
- return false;
-}
-
-bool ResourceTable::getAttributeFlags(
- uint32_t attrID, const char16_t* name, size_t nameLen,
- Res_value* outValue)
-{
- outValue->dataType = Res_value::TYPE_INT_HEX;
- outValue->data = 0;
-
- //printf("getAttributeFlags #%08x %s\n", attrID, String8(name, nameLen).string());
- String16 nameStr(name, nameLen);
- sp<const Entry> e = getEntry(attrID);
- if (e != NULL) {
- const size_t N = e->getBag().size();
-
- const char16_t* end = name + nameLen;
- const char16_t* pos = name;
- while (pos < end) {
- const char16_t* start = pos;
- while (pos < end && *pos != '|') {
- pos++;
- }
-
- String16 nameStr(start, pos-start);
- size_t i;
- for (i=0; i<N; i++) {
- //printf("Comparing \"%s\" to \"%s\"\n", String8(nameStr).string(),
- // String8(e->getBag().keyAt(i)).string());
- if (e->getBag().keyAt(i) == nameStr) {
- Res_value val;
- bool got = getItemValue(attrID, e->getBag().valueAt(i).bagKeyId, &val);
- if (!got) {
- return false;
- }
- //printf("Got value: 0x%08x\n", val.data);
- outValue->data |= val.data;
- break;
- }
- }
-
- if (i >= N) {
- // Didn't find this flag identifier.
- return false;
- }
- pos++;
- }
-
- return true;
- }
- return false;
-}
-
-status_t ResourceTable::assignResourceIds()
-{
- const size_t N = mOrderedPackages.size();
- size_t pi;
- status_t firstError = NO_ERROR;
-
- // First generate all bag attributes and assign indices.
- for (pi=0; pi<N; pi++) {
- sp<Package> p = mOrderedPackages.itemAt(pi);
- if (p == NULL || p->getTypes().size() == 0) {
- // Empty, skip!
- continue;
- }
-
- status_t err = p->applyPublicTypeOrder();
- if (err != NO_ERROR && firstError == NO_ERROR) {
- firstError = err;
- }
-
- // Generate attributes...
- const size_t N = p->getOrderedTypes().size();
- size_t ti;
- for (ti=0; ti<N; ti++) {
- sp<Type> t = p->getOrderedTypes().itemAt(ti);
- if (t == NULL) {
- continue;
- }
- const size_t N = t->getOrderedConfigs().size();
- for (size_t ci=0; ci<N; ci++) {
- sp<ConfigList> c = t->getOrderedConfigs().itemAt(ci);
- if (c == NULL) {
- continue;
- }
- const size_t N = c->getEntries().size();
- for (size_t ei=0; ei<N; ei++) {
- sp<Entry> e = c->getEntries().valueAt(ei);
- if (e == NULL) {
- continue;
- }
- status_t err = e->generateAttributes(this, p->getName());
- if (err != NO_ERROR && firstError == NO_ERROR) {
- firstError = err;
- }
- }
- }
- }
-
- const SourcePos unknown(String8("????"), 0);
- sp<Type> attr = p->getType(String16("attr"), unknown);
-
- // Assign indices...
- for (ti=0; ti<N; ti++) {
- sp<Type> t = p->getOrderedTypes().itemAt(ti);
- if (t == NULL) {
- continue;
- }
- err = t->applyPublicEntryOrder();
- if (err != NO_ERROR && firstError == NO_ERROR) {
- firstError = err;
- }
-
- const size_t N = t->getOrderedConfigs().size();
- t->setIndex(ti+1);
-
- LOG_ALWAYS_FATAL_IF(ti == 0 && attr != t,
- "First type is not attr!");
-
- for (size_t ei=0; ei<N; ei++) {
- sp<ConfigList> c = t->getOrderedConfigs().itemAt(ei);
- if (c == NULL) {
- continue;
- }
- c->setEntryIndex(ei);
- }
- }
-
- // Assign resource IDs to keys in bags...
- for (ti=0; ti<N; ti++) {
- sp<Type> t = p->getOrderedTypes().itemAt(ti);
- if (t == NULL) {
- continue;
- }
- const size_t N = t->getOrderedConfigs().size();
- for (size_t ci=0; ci<N; ci++) {
- sp<ConfigList> c = t->getOrderedConfigs().itemAt(ci);
- //printf("Ordered config #%d: %p\n", ci, c.get());
- const size_t N = c->getEntries().size();
- for (size_t ei=0; ei<N; ei++) {
- sp<Entry> e = c->getEntries().valueAt(ei);
- if (e == NULL) {
- continue;
- }
- status_t err = e->assignResourceIds(this, p->getName());
- if (err != NO_ERROR && firstError == NO_ERROR) {
- firstError = err;
- }
- }
- }
- }
- }
- return firstError;
-}
-
-status_t ResourceTable::addSymbols(const sp<AaptSymbols>& outSymbols) {
- const size_t N = mOrderedPackages.size();
- size_t pi;
-
- for (pi=0; pi<N; pi++) {
- sp<Package> p = mOrderedPackages.itemAt(pi);
- if (p->getTypes().size() == 0) {
- // Empty, skip!
- continue;
- }
-
- const size_t N = p->getOrderedTypes().size();
- size_t ti;
-
- for (ti=0; ti<N; ti++) {
- sp<Type> t = p->getOrderedTypes().itemAt(ti);
- if (t == NULL) {
- continue;
- }
- const size_t N = t->getOrderedConfigs().size();
- sp<AaptSymbols> typeSymbols;
- typeSymbols = outSymbols->addNestedSymbol(String8(t->getName()), t->getPos());
- for (size_t ci=0; ci<N; ci++) {
- sp<ConfigList> c = t->getOrderedConfigs().itemAt(ci);
- if (c == NULL) {
- continue;
- }
- uint32_t rid = getResId(p, t, ci);
- if (rid == 0) {
- return UNKNOWN_ERROR;
- }
- if (Res_GETPACKAGE(rid) == (size_t)(p->getAssignedId()-1)) {
- typeSymbols->addSymbol(String8(c->getName()), rid, c->getPos());
-
- String16 comment(c->getComment());
- typeSymbols->appendComment(String8(c->getName()), comment, c->getPos());
- //printf("Type symbol [%08x] %s comment: %s\n", rid,
- // String8(c->getName()).string(), String8(comment).string());
- comment = c->getTypeComment();
- typeSymbols->appendTypeComment(String8(c->getName()), comment);
- } else {
-#if 0
- printf("**** NO MATCH: 0x%08x vs 0x%08x\n",
- Res_GETPACKAGE(rid), p->getAssignedId());
-#endif
- }
- }
- }
- }
- return NO_ERROR;
-}
-
-
-void
-ResourceTable::addLocalization(const String16& name, const String8& locale)
-{
- mLocalizations[name].insert(locale);
-}
-
-
-/*!
- * Flag various sorts of localization problems. '+' indicates checks already implemented;
- * '-' indicates checks that will be implemented in the future.
- *
- * + A localized string for which no default-locale version exists => warning
- * + A string for which no version in an explicitly-requested locale exists => warning
- * + A localized translation of an translateable="false" string => warning
- * - A localized string not provided in every locale used by the table
- */
-status_t
-ResourceTable::validateLocalizations(void)
-{
- status_t err = NO_ERROR;
- const String8 defaultLocale;
-
- // For all strings...
- for (map<String16, set<String8> >::iterator nameIter = mLocalizations.begin();
- nameIter != mLocalizations.end();
- nameIter++) {
- const set<String8>& configSet = nameIter->second; // naming convenience
-
- // 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->getResourceSourceDirs()[0]);
- for (set<String8>::const_iterator locales = configSet.begin();
- locales != configSet.end();
- locales++) {
- fprintf(stdout, " %s", (*locales).string());
- }
- fprintf(stdout, "\n");
- // !!! TODO: throw an error here in some circumstances
- }
-
- // Check that all requested localizations are present for this string
- if (mBundle->getConfigurations() != NULL && mBundle->getRequireLocalization()) {
- const char* allConfigs = mBundle->getConfigurations();
- const char* start = allConfigs;
- const char* comma;
-
- do {
- String8 config;
- comma = strchr(start, ',');
- if (comma != NULL) {
- config.setTo(start, comma - start);
- start = comma + 1;
- } else {
- config.setTo(start);
- }
-
- // don't bother with the pseudolocale "zz_ZZ"
- if (config != "zz_ZZ") {
- if (configSet.find(config) == configSet.end()) {
- // okay, no specific localization found. it's possible that we are
- // requiring a specific regional localization [e.g. de_DE] but there is an
- // available string in the generic language localization [e.g. de];
- // consider that string to have fulfilled the localization requirement.
- String8 region(config.string(), 2);
- if (configSet.find(region) == configSet.end()) {
- if (configSet.count(defaultLocale) == 0) {
- fprintf(stdout, "aapt: warning: "
- "**** string '%s' has no default or required localization "
- "for '%s' in %s\n",
- String8(nameIter->first).string(),
- config.string(),
- mBundle->getResourceSourceDirs()[0]);
- }
- }
- }
- }
- } while (comma != NULL);
- }
- }
-
- return err;
-}
-
-status_t ResourceTable::flatten(Bundle* bundle, const sp<AaptFile>& dest)
-{
- ResourceFilter filter;
- status_t err = filter.parse(bundle->getConfigurations());
- if (err != NO_ERROR) {
- return err;
- }
-
- const ConfigDescription nullConfig;
-
- const size_t N = mOrderedPackages.size();
- size_t pi;
-
- const static String16 mipmap16("mipmap");
-
- bool useUTF8 = !bundle->getUTF16StringsOption();
-
- // Iterate through all data, collecting all values (strings,
- // references, etc).
- StringPool valueStrings(useUTF8);
- Vector<sp<Entry> > allEntries;
- for (pi=0; pi<N; pi++) {
- sp<Package> p = mOrderedPackages.itemAt(pi);
- if (p->getTypes().size() == 0) {
- // Empty, skip!
- continue;
- }
-
- StringPool typeStrings(useUTF8);
- StringPool keyStrings(useUTF8);
-
- const size_t N = p->getOrderedTypes().size();
- for (size_t ti=0; ti<N; ti++) {
- sp<Type> t = p->getOrderedTypes().itemAt(ti);
- if (t == NULL) {
- typeStrings.add(String16("<empty>"), false);
- continue;
- }
- const String16 typeName(t->getName());
- typeStrings.add(typeName, false);
-
- // This is a hack to tweak the sorting order of the final strings,
- // to put stuff that is generally not language-specific first.
- String8 configTypeName(typeName);
- if (configTypeName == "drawable" || configTypeName == "layout"
- || configTypeName == "color" || configTypeName == "anim"
- || configTypeName == "interpolator" || configTypeName == "animator"
- || configTypeName == "xml" || configTypeName == "menu"
- || configTypeName == "mipmap" || configTypeName == "raw") {
- configTypeName = "1complex";
- } else {
- configTypeName = "2value";
- }
-
- const bool filterable = (typeName != mipmap16);
-
- const size_t N = t->getOrderedConfigs().size();
- for (size_t ci=0; ci<N; ci++) {
- sp<ConfigList> c = t->getOrderedConfigs().itemAt(ci);
- if (c == NULL) {
- continue;
- }
- const size_t N = c->getEntries().size();
- for (size_t ei=0; ei<N; ei++) {
- ConfigDescription config = c->getEntries().keyAt(ei);
- if (filterable && !filter.match(config)) {
- continue;
- }
- sp<Entry> e = c->getEntries().valueAt(ei);
- if (e == NULL) {
- continue;
- }
- e->setNameIndex(keyStrings.add(e->getName(), true));
-
- // If this entry has no values for other configs,
- // and is the default config, then it is special. Otherwise
- // we want to add it with the config info.
- ConfigDescription* valueConfig = NULL;
- if (N != 1 || config == nullConfig) {
- valueConfig = &config;
- }
-
- status_t err = e->prepareFlatten(&valueStrings, this,
- &configTypeName, &config);
- if (err != NO_ERROR) {
- return err;
- }
- allEntries.add(e);
- }
- }
- }
-
- p->setTypeStrings(typeStrings.createStringBlock());
- p->setKeyStrings(keyStrings.createStringBlock());
- }
-
- if (bundle->getOutputAPKFile() != NULL) {
- // Now we want to sort the value strings for better locality. This will
- // cause the positions of the strings to change, so we need to go back
- // through out resource entries and update them accordingly. Only need
- // to do this if actually writing the output file.
- valueStrings.sortByConfig();
- for (pi=0; pi<allEntries.size(); pi++) {
- allEntries[pi]->remapStringValue(&valueStrings);
- }
- }
-
- ssize_t strAmt = 0;
-
- // Now build the array of package chunks.
- Vector<sp<AaptFile> > flatPackages;
- for (pi=0; pi<N; pi++) {
- sp<Package> p = mOrderedPackages.itemAt(pi);
- if (p->getTypes().size() == 0) {
- // Empty, skip!
- continue;
- }
-
- const size_t N = p->getTypeStrings().size();
-
- const size_t baseSize = sizeof(ResTable_package);
-
- // Start the package data.
- sp<AaptFile> data = new AaptFile(String8(), AaptGroupEntry(), String8());
- ResTable_package* header = (ResTable_package*)data->editData(baseSize);
- if (header == NULL) {
- fprintf(stderr, "ERROR: out of memory creating ResTable_package\n");
- return NO_MEMORY;
- }
- memset(header, 0, sizeof(*header));
- header->header.type = htods(RES_TABLE_PACKAGE_TYPE);
- header->header.headerSize = htods(sizeof(*header));
- header->id = htodl(p->getAssignedId());
- strcpy16_htod(header->name, p->getName().string());
-
- // Write the string blocks.
- const size_t typeStringsStart = data->getSize();
- sp<AaptFile> strFile = p->getTypeStringsData();
- ssize_t amt = data->writeData(strFile->getData(), strFile->getSize());
- #if PRINT_STRING_METRICS
- fprintf(stderr, "**** type strings: %d\n", amt);
- #endif
- strAmt += amt;
- if (amt < 0) {
- return amt;
- }
- const size_t keyStringsStart = data->getSize();
- strFile = p->getKeyStringsData();
- amt = data->writeData(strFile->getData(), strFile->getSize());
- #if PRINT_STRING_METRICS
- fprintf(stderr, "**** key strings: %d\n", amt);
- #endif
- strAmt += amt;
- if (amt < 0) {
- return amt;
- }
-
- // Build the type chunks inside of this package.
- for (size_t ti=0; ti<N; ti++) {
- // Retrieve them in the same order as the type string block.
- size_t len;
- String16 typeName(p->getTypeStrings().stringAt(ti, &len));
- sp<Type> t = p->getTypes().valueFor(typeName);
- LOG_ALWAYS_FATAL_IF(t == NULL && typeName != String16("<empty>"),
- "Type name %s not found",
- String8(typeName).string());
-
- const bool filterable = (typeName != mipmap16);
-
- const size_t N = t != NULL ? t->getOrderedConfigs().size() : 0;
-
- // Until a non-NO_ENTRY value has been written for a resource,
- // that resource is invalid; validResources[i] represents
- // the item at t->getOrderedConfigs().itemAt(i).
- Vector<bool> validResources;
- validResources.insertAt(false, 0, N);
-
- // First write the typeSpec chunk, containing information about
- // each resource entry in this type.
- {
- const size_t typeSpecSize = sizeof(ResTable_typeSpec) + sizeof(uint32_t)*N;
- const size_t typeSpecStart = data->getSize();
- ResTable_typeSpec* tsHeader = (ResTable_typeSpec*)
- (((uint8_t*)data->editData(typeSpecStart+typeSpecSize)) + typeSpecStart);
- if (tsHeader == NULL) {
- fprintf(stderr, "ERROR: out of memory creating ResTable_typeSpec\n");
- return NO_MEMORY;
- }
- memset(tsHeader, 0, sizeof(*tsHeader));
- tsHeader->header.type = htods(RES_TABLE_TYPE_SPEC_TYPE);
- tsHeader->header.headerSize = htods(sizeof(*tsHeader));
- tsHeader->header.size = htodl(typeSpecSize);
- tsHeader->id = ti+1;
- tsHeader->entryCount = htodl(N);
-
- uint32_t* typeSpecFlags = (uint32_t*)
- (((uint8_t*)data->editData())
- + typeSpecStart + sizeof(ResTable_typeSpec));
- memset(typeSpecFlags, 0, sizeof(uint32_t)*N);
-
- for (size_t ei=0; ei<N; ei++) {
- sp<ConfigList> cl = t->getOrderedConfigs().itemAt(ei);
- if (cl->getPublic()) {
- typeSpecFlags[ei] |= htodl(ResTable_typeSpec::SPEC_PUBLIC);
- }
- const size_t CN = cl->getEntries().size();
- for (size_t ci=0; ci<CN; ci++) {
- if (filterable && !filter.match(cl->getEntries().keyAt(ci))) {
- continue;
- }
- for (size_t cj=ci+1; cj<CN; cj++) {
- if (filterable && !filter.match(cl->getEntries().keyAt(cj))) {
- continue;
- }
- typeSpecFlags[ei] |= htodl(
- cl->getEntries().keyAt(ci).diff(cl->getEntries().keyAt(cj)));
- }
- }
- }
- }
-
- // We need to write one type chunk for each configuration for
- // which we have entries in this type.
- const size_t NC = t->getUniqueConfigs().size();
-
- const size_t typeSize = sizeof(ResTable_type) + sizeof(uint32_t)*N;
-
- for (size_t ci=0; ci<NC; ci++) {
- ConfigDescription config = t->getUniqueConfigs().itemAt(ci);
-
- NOISY(printf("Writing config %d config: imsi:%d/%d lang:%c%c cnt:%c%c "
- "orien:%d ui:%d touch:%d density:%d key:%d inp:%d nav:%d sz:%dx%d "
- "sw%ddp w%ddp h%ddp dir:%d\n",
- ti+1,
- config.mcc, config.mnc,
- config.language[0] ? config.language[0] : '-',
- config.language[1] ? config.language[1] : '-',
- config.country[0] ? config.country[0] : '-',
- config.country[1] ? config.country[1] : '-',
- config.orientation,
- config.uiMode,
- config.touchscreen,
- config.density,
- config.keyboard,
- config.inputFlags,
- config.navigation,
- config.screenWidth,
- config.screenHeight,
- config.smallestScreenWidthDp,
- config.screenWidthDp,
- config.screenHeightDp,
- config.layoutDirection));
-
- if (filterable && !filter.match(config)) {
- continue;
- }
-
- const size_t typeStart = data->getSize();
-
- ResTable_type* tHeader = (ResTable_type*)
- (((uint8_t*)data->editData(typeStart+typeSize)) + typeStart);
- if (tHeader == NULL) {
- fprintf(stderr, "ERROR: out of memory creating ResTable_type\n");
- return NO_MEMORY;
- }
-
- memset(tHeader, 0, sizeof(*tHeader));
- tHeader->header.type = htods(RES_TABLE_TYPE_TYPE);
- tHeader->header.headerSize = htods(sizeof(*tHeader));
- tHeader->id = ti+1;
- tHeader->entryCount = htodl(N);
- tHeader->entriesStart = htodl(typeSize);
- tHeader->config = config;
- NOISY(printf("Writing type %d config: imsi:%d/%d lang:%c%c cnt:%c%c "
- "orien:%d ui:%d touch:%d density:%d key:%d inp:%d nav:%d sz:%dx%d "
- "sw%ddp w%ddp h%ddp dir:%d\n",
- ti+1,
- tHeader->config.mcc, tHeader->config.mnc,
- tHeader->config.language[0] ? tHeader->config.language[0] : '-',
- tHeader->config.language[1] ? tHeader->config.language[1] : '-',
- tHeader->config.country[0] ? tHeader->config.country[0] : '-',
- tHeader->config.country[1] ? tHeader->config.country[1] : '-',
- tHeader->config.orientation,
- tHeader->config.uiMode,
- tHeader->config.touchscreen,
- tHeader->config.density,
- tHeader->config.keyboard,
- tHeader->config.inputFlags,
- tHeader->config.navigation,
- tHeader->config.screenWidth,
- tHeader->config.screenHeight,
- tHeader->config.smallestScreenWidthDp,
- tHeader->config.screenWidthDp,
- tHeader->config.screenHeightDp,
- tHeader->config.layoutDirection));
- tHeader->config.swapHtoD();
-
- // Build the entries inside of this type.
- for (size_t ei=0; ei<N; ei++) {
- sp<ConfigList> cl = t->getOrderedConfigs().itemAt(ei);
- sp<Entry> e = cl->getEntries().valueFor(config);
-
- // Set the offset for this entry in its type.
- uint32_t* index = (uint32_t*)
- (((uint8_t*)data->editData())
- + typeStart + sizeof(ResTable_type));
- if (e != NULL) {
- index[ei] = htodl(data->getSize()-typeStart-typeSize);
-
- // Create the entry.
- ssize_t amt = e->flatten(bundle, data, cl->getPublic());
- if (amt < 0) {
- return amt;
- }
- validResources.editItemAt(ei) = true;
- } else {
- index[ei] = htodl(ResTable_type::NO_ENTRY);
- }
- }
-
- // Fill in the rest of the type information.
- tHeader = (ResTable_type*)
- (((uint8_t*)data->editData()) + typeStart);
- tHeader->header.size = htodl(data->getSize()-typeStart);
- }
-
- for (size_t i = 0; i < N; ++i) {
- if (!validResources[i]) {
- sp<ConfigList> c = t->getOrderedConfigs().itemAt(i);
- fprintf(stderr, "warning: no entries written for %s/%s\n",
- String8(typeName).string(), String8(c->getName()).string());
- }
- }
- }
-
- // Fill in the rest of the package information.
- header = (ResTable_package*)data->editData();
- header->header.size = htodl(data->getSize());
- header->typeStrings = htodl(typeStringsStart);
- header->lastPublicType = htodl(p->getTypeStrings().size());
- header->keyStrings = htodl(keyStringsStart);
- header->lastPublicKey = htodl(p->getKeyStrings().size());
-
- flatPackages.add(data);
- }
-
- // And now write out the final chunks.
- const size_t dataStart = dest->getSize();
-
- {
- // blah
- ResTable_header header;
- memset(&header, 0, sizeof(header));
- header.header.type = htods(RES_TABLE_TYPE);
- header.header.headerSize = htods(sizeof(header));
- header.packageCount = htodl(flatPackages.size());
- status_t err = dest->writeData(&header, sizeof(header));
- if (err != NO_ERROR) {
- fprintf(stderr, "ERROR: out of memory creating ResTable_header\n");
- return err;
- }
- }
-
- ssize_t strStart = dest->getSize();
- err = valueStrings.writeStringBlock(dest);
- if (err != NO_ERROR) {
- return err;
- }
-
- ssize_t amt = (dest->getSize()-strStart);
- strAmt += amt;
- #if PRINT_STRING_METRICS
- fprintf(stderr, "**** value strings: %d\n", amt);
- fprintf(stderr, "**** total strings: %d\n", strAmt);
- #endif
-
- for (pi=0; pi<flatPackages.size(); pi++) {
- err = dest->writeData(flatPackages[pi]->getData(),
- flatPackages[pi]->getSize());
- if (err != NO_ERROR) {
- fprintf(stderr, "ERROR: out of memory creating package chunk for ResTable_header\n");
- return err;
- }
- }
-
- ResTable_header* header = (ResTable_header*)
- (((uint8_t*)dest->getData()) + dataStart);
- header->header.size = htodl(dest->getSize() - dataStart);
-
- NOISY(aout << "Resource table:"
- << HexDump(dest->getData(), dest->getSize()) << endl);
-
- #if PRINT_STRING_METRICS
- fprintf(stderr, "**** total resource table size: %d / %d%% strings\n",
- dest->getSize(), (strAmt*100)/dest->getSize());
- #endif
-
- return NO_ERROR;
-}
-
-void ResourceTable::writePublicDefinitions(const String16& package, FILE* fp)
-{
- fprintf(fp,
- "<!-- This file contains <public> resource definitions for all\n"
- " resources that were generated from the source data. -->\n"
- "\n"
- "<resources>\n");
-
- writePublicDefinitions(package, fp, true);
- writePublicDefinitions(package, fp, false);
-
- fprintf(fp,
- "\n"
- "</resources>\n");
-}
-
-void ResourceTable::writePublicDefinitions(const String16& package, FILE* fp, bool pub)
-{
- bool didHeader = false;
-
- sp<Package> pkg = mPackages.valueFor(package);
- if (pkg != NULL) {
- const size_t NT = pkg->getOrderedTypes().size();
- for (size_t i=0; i<NT; i++) {
- sp<Type> t = pkg->getOrderedTypes().itemAt(i);
- if (t == NULL) {
- continue;
- }
-
- bool didType = false;
-
- const size_t NC = t->getOrderedConfigs().size();
- for (size_t j=0; j<NC; j++) {
- sp<ConfigList> c = t->getOrderedConfigs().itemAt(j);
- if (c == NULL) {
- continue;
- }
-
- if (c->getPublic() != pub) {
- continue;
- }
-
- if (!didType) {
- fprintf(fp, "\n");
- didType = true;
- }
- if (!didHeader) {
- if (pub) {
- fprintf(fp," <!-- PUBLIC SECTION. These resources have been declared public.\n");
- fprintf(fp," Changes to these definitions will break binary compatibility. -->\n\n");
- } else {
- fprintf(fp," <!-- PRIVATE SECTION. These resources have not been declared public.\n");
- fprintf(fp," You can make them public my moving these lines into a file in res/values. -->\n\n");
- }
- didHeader = true;
- }
- if (!pub) {
- const size_t NE = c->getEntries().size();
- for (size_t k=0; k<NE; k++) {
- const SourcePos& pos = c->getEntries().valueAt(k)->getPos();
- if (pos.file != "") {
- fprintf(fp," <!-- Declared at %s:%d -->\n",
- pos.file.string(), pos.line);
- }
- }
- }
- fprintf(fp, " <public type=\"%s\" name=\"%s\" id=\"0x%08x\" />\n",
- String8(t->getName()).string(),
- String8(c->getName()).string(),
- getResId(pkg, t, c->getEntryIndex()));
- }
- }
- }
-}
-
-ResourceTable::Item::Item(const SourcePos& _sourcePos,
- bool _isId,
- const String16& _value,
- const Vector<StringPool::entry_style_span>* _style,
- int32_t _format)
- : sourcePos(_sourcePos)
- , isId(_isId)
- , value(_value)
- , format(_format)
- , bagKeyId(0)
- , evaluating(false)
-{
- if (_style) {
- style = *_style;
- }
-}
-
-status_t ResourceTable::Entry::makeItABag(const SourcePos& sourcePos)
-{
- if (mType == TYPE_BAG) {
- return NO_ERROR;
- }
- if (mType == TYPE_UNKNOWN) {
- mType = TYPE_BAG;
- return NO_ERROR;
- }
- sourcePos.error("Resource entry %s is already defined as a single item.\n"
- "%s:%d: Originally defined here.\n",
- String8(mName).string(),
- mItem.sourcePos.file.string(), mItem.sourcePos.line);
- return UNKNOWN_ERROR;
-}
-
-status_t ResourceTable::Entry::setItem(const SourcePos& sourcePos,
- const String16& value,
- const Vector<StringPool::entry_style_span>* style,
- int32_t format,
- const bool overwrite)
-{
- Item item(sourcePos, false, value, style);
-
- if (mType == TYPE_BAG) {
- const Item& item(mBag.valueAt(0));
- sourcePos.error("Resource entry %s is already defined as a bag.\n"
- "%s:%d: Originally defined here.\n",
- String8(mName).string(),
- item.sourcePos.file.string(), item.sourcePos.line);
- return UNKNOWN_ERROR;
- }
- if ( (mType != TYPE_UNKNOWN) && (overwrite == false) ) {
- sourcePos.error("Resource entry %s is already defined.\n"
- "%s:%d: Originally defined here.\n",
- String8(mName).string(),
- mItem.sourcePos.file.string(), mItem.sourcePos.line);
- return UNKNOWN_ERROR;
- }
-
- mType = TYPE_ITEM;
- mItem = item;
- mItemFormat = format;
- return NO_ERROR;
-}
-
-status_t ResourceTable::Entry::addToBag(const SourcePos& sourcePos,
- const String16& key, const String16& value,
- const Vector<StringPool::entry_style_span>* style,
- bool replace, bool isId, int32_t format)
-{
- status_t err = makeItABag(sourcePos);
- if (err != NO_ERROR) {
- return err;
- }
-
- Item item(sourcePos, isId, value, style, format);
-
- // XXX NOTE: there is an error if you try to have a bag with two keys,
- // one an attr and one an id, with the same name. Not something we
- // currently ever have to worry about.
- ssize_t origKey = mBag.indexOfKey(key);
- if (origKey >= 0) {
- if (!replace) {
- const Item& item(mBag.valueAt(origKey));
- sourcePos.error("Resource entry %s already has bag item %s.\n"
- "%s:%d: Originally defined here.\n",
- String8(mName).string(), String8(key).string(),
- item.sourcePos.file.string(), item.sourcePos.line);
- return UNKNOWN_ERROR;
- }
- //printf("Replacing %s with %s\n",
- // String8(mBag.valueFor(key).value).string(), String8(value).string());
- mBag.replaceValueFor(key, item);
- }
-
- mBag.add(key, item);
- return NO_ERROR;
-}
-
-status_t ResourceTable::Entry::emptyBag(const SourcePos& sourcePos)
-{
- status_t err = makeItABag(sourcePos);
- if (err != NO_ERROR) {
- return err;
- }
-
- mBag.clear();
- return NO_ERROR;
-}
-
-status_t ResourceTable::Entry::generateAttributes(ResourceTable* table,
- const String16& package)
-{
- const String16 attr16("attr");
- const String16 id16("id");
- const size_t N = mBag.size();
- for (size_t i=0; i<N; i++) {
- const String16& key = mBag.keyAt(i);
- const Item& it = mBag.valueAt(i);
- if (it.isId) {
- if (!table->hasBagOrEntry(key, &id16, &package)) {
- String16 value("false");
- status_t err = table->addEntry(SourcePos(String8("<generated>"), 0), package,
- id16, key, value);
- if (err != NO_ERROR) {
- return err;
- }
- }
- } else if (!table->hasBagOrEntry(key, &attr16, &package)) {
-
-#if 1
-// fprintf(stderr, "ERROR: Bag attribute '%s' has not been defined.\n",
-// String8(key).string());
-// const Item& item(mBag.valueAt(i));
-// fprintf(stderr, "Referenced from file %s line %d\n",
-// item.sourcePos.file.string(), item.sourcePos.line);
-// return UNKNOWN_ERROR;
-#else
- char numberStr[16];
- sprintf(numberStr, "%d", ResTable_map::TYPE_ANY);
- status_t err = table->addBag(SourcePos("<generated>", 0), package,
- attr16, key, String16(""),
- String16("^type"),
- String16(numberStr), NULL, NULL);
- if (err != NO_ERROR) {
- return err;
- }
-#endif
- }
- }
- return NO_ERROR;
-}
-
-status_t ResourceTable::Entry::assignResourceIds(ResourceTable* table,
- const String16& package)
-{
- bool hasErrors = false;
-
- if (mType == TYPE_BAG) {
- const char* errorMsg;
- const String16 style16("style");
- const String16 attr16("attr");
- const String16 id16("id");
- mParentId = 0;
- if (mParent.size() > 0) {
- mParentId = table->getResId(mParent, &style16, NULL, &errorMsg);
- if (mParentId == 0) {
- mPos.error("Error retrieving parent for item: %s '%s'.\n",
- errorMsg, String8(mParent).string());
- hasErrors = true;
- }
- }
- const size_t N = mBag.size();
- for (size_t i=0; i<N; i++) {
- const String16& key = mBag.keyAt(i);
- Item& it = mBag.editValueAt(i);
- it.bagKeyId = table->getResId(key,
- it.isId ? &id16 : &attr16, NULL, &errorMsg);
- //printf("Bag key of %s: #%08x\n", String8(key).string(), it.bagKeyId);
- if (it.bagKeyId == 0) {
- it.sourcePos.error("Error: %s: %s '%s'.\n", errorMsg,
- String8(it.isId ? id16 : attr16).string(),
- String8(key).string());
- hasErrors = true;
- }
- }
- }
- return hasErrors ? UNKNOWN_ERROR : NO_ERROR;
-}
-
-status_t ResourceTable::Entry::prepareFlatten(StringPool* strings, ResourceTable* table,
- const String8* configTypeName, const ConfigDescription* config)
-{
- if (mType == TYPE_ITEM) {
- Item& it = mItem;
- AccessorCookie ac(it.sourcePos, String8(mName), String8(it.value));
- if (!table->stringToValue(&it.parsedValue, strings,
- it.value, false, true, 0,
- &it.style, NULL, &ac, mItemFormat,
- configTypeName, config)) {
- return UNKNOWN_ERROR;
- }
- } else if (mType == TYPE_BAG) {
- const size_t N = mBag.size();
- for (size_t i=0; i<N; i++) {
- const String16& key = mBag.keyAt(i);
- Item& it = mBag.editValueAt(i);
- AccessorCookie ac(it.sourcePos, String8(key), String8(it.value));
- if (!table->stringToValue(&it.parsedValue, strings,
- it.value, false, true, it.bagKeyId,
- &it.style, NULL, &ac, it.format,
- configTypeName, config)) {
- return UNKNOWN_ERROR;
- }
- }
- } else {
- mPos.error("Error: entry %s is not a single item or a bag.\n",
- String8(mName).string());
- return UNKNOWN_ERROR;
- }
- return NO_ERROR;
-}
-
-status_t ResourceTable::Entry::remapStringValue(StringPool* strings)
-{
- if (mType == TYPE_ITEM) {
- Item& it = mItem;
- if (it.parsedValue.dataType == Res_value::TYPE_STRING) {
- it.parsedValue.data = strings->mapOriginalPosToNewPos(it.parsedValue.data);
- }
- } else if (mType == TYPE_BAG) {
- const size_t N = mBag.size();
- for (size_t i=0; i<N; i++) {
- Item& it = mBag.editValueAt(i);
- if (it.parsedValue.dataType == Res_value::TYPE_STRING) {
- it.parsedValue.data = strings->mapOriginalPosToNewPos(it.parsedValue.data);
- }
- }
- } else {
- mPos.error("Error: entry %s is not a single item or a bag.\n",
- String8(mName).string());
- return UNKNOWN_ERROR;
- }
- return NO_ERROR;
-}
-
-ssize_t ResourceTable::Entry::flatten(Bundle* bundle, const sp<AaptFile>& data, bool isPublic)
-{
- size_t amt = 0;
- ResTable_entry header;
- memset(&header, 0, sizeof(header));
- header.size = htods(sizeof(header));
- const type ty = this != NULL ? mType : TYPE_ITEM;
- if (this != NULL) {
- if (ty == TYPE_BAG) {
- header.flags |= htods(header.FLAG_COMPLEX);
- }
- if (isPublic) {
- header.flags |= htods(header.FLAG_PUBLIC);
- }
- header.key.index = htodl(mNameIndex);
- }
- if (ty != TYPE_BAG) {
- status_t err = data->writeData(&header, sizeof(header));
- if (err != NO_ERROR) {
- fprintf(stderr, "ERROR: out of memory creating ResTable_entry\n");
- return err;
- }
-
- const Item& it = mItem;
- Res_value par;
- memset(&par, 0, sizeof(par));
- par.size = htods(it.parsedValue.size);
- par.dataType = it.parsedValue.dataType;
- par.res0 = it.parsedValue.res0;
- par.data = htodl(it.parsedValue.data);
- #if 0
- printf("Writing item (%s): type=%d, data=0x%x, res0=0x%x\n",
- String8(mName).string(), it.parsedValue.dataType,
- it.parsedValue.data, par.res0);
- #endif
- err = data->writeData(&par, it.parsedValue.size);
- if (err != NO_ERROR) {
- fprintf(stderr, "ERROR: out of memory creating Res_value\n");
- return err;
- }
- amt += it.parsedValue.size;
- } else {
- size_t N = mBag.size();
- size_t i;
- // Create correct ordering of items.
- KeyedVector<uint32_t, const Item*> items;
- for (i=0; i<N; i++) {
- const Item& it = mBag.valueAt(i);
- items.add(it.bagKeyId, &it);
- }
- N = items.size();
-
- ResTable_map_entry mapHeader;
- memcpy(&mapHeader, &header, sizeof(header));
- mapHeader.size = htods(sizeof(mapHeader));
- mapHeader.parent.ident = htodl(mParentId);
- mapHeader.count = htodl(N);
- status_t err = data->writeData(&mapHeader, sizeof(mapHeader));
- if (err != NO_ERROR) {
- fprintf(stderr, "ERROR: out of memory creating ResTable_entry\n");
- return err;
- }
-
- for (i=0; i<N; i++) {
- const Item& it = *items.valueAt(i);
- ResTable_map map;
- map.name.ident = htodl(it.bagKeyId);
- map.value.size = htods(it.parsedValue.size);
- map.value.dataType = it.parsedValue.dataType;
- map.value.res0 = it.parsedValue.res0;
- map.value.data = htodl(it.parsedValue.data);
- err = data->writeData(&map, sizeof(map));
- if (err != NO_ERROR) {
- fprintf(stderr, "ERROR: out of memory creating Res_value\n");
- return err;
- }
- amt += sizeof(map);
- }
- }
- return amt;
-}
-
-void ResourceTable::ConfigList::appendComment(const String16& comment,
- bool onlyIfEmpty)
-{
- if (comment.size() <= 0) {
- return;
- }
- if (onlyIfEmpty && mComment.size() > 0) {
- return;
- }
- if (mComment.size() > 0) {
- mComment.append(String16("\n"));
- }
- mComment.append(comment);
-}
-
-void ResourceTable::ConfigList::appendTypeComment(const String16& comment)
-{
- if (comment.size() <= 0) {
- return;
- }
- if (mTypeComment.size() > 0) {
- mTypeComment.append(String16("\n"));
- }
- mTypeComment.append(comment);
-}
-
-status_t ResourceTable::Type::addPublic(const SourcePos& sourcePos,
- const String16& name,
- const uint32_t ident)
-{
- #if 0
- int32_t entryIdx = Res_GETENTRY(ident);
- if (entryIdx < 0) {
- sourcePos.error("Public resource %s/%s has an invalid 0 identifier (0x%08x).\n",
- String8(mName).string(), String8(name).string(), ident);
- return UNKNOWN_ERROR;
- }
- #endif
-
- int32_t typeIdx = Res_GETTYPE(ident);
- if (typeIdx >= 0) {
- typeIdx++;
- if (mPublicIndex > 0 && mPublicIndex != typeIdx) {
- sourcePos.error("Public resource %s/%s has conflicting type codes for its"
- " public identifiers (0x%x vs 0x%x).\n",
- String8(mName).string(), String8(name).string(),
- mPublicIndex, typeIdx);
- return UNKNOWN_ERROR;
- }
- mPublicIndex = typeIdx;
- }
-
- if (mFirstPublicSourcePos == NULL) {
- mFirstPublicSourcePos = new SourcePos(sourcePos);
- }
-
- if (mPublic.indexOfKey(name) < 0) {
- mPublic.add(name, Public(sourcePos, String16(), ident));
- } else {
- Public& p = mPublic.editValueFor(name);
- if (p.ident != ident) {
- sourcePos.error("Public resource %s/%s has conflicting public identifiers"
- " (0x%08x vs 0x%08x).\n"
- "%s:%d: Originally defined here.\n",
- String8(mName).string(), String8(name).string(), p.ident, ident,
- p.sourcePos.file.string(), p.sourcePos.line);
- return UNKNOWN_ERROR;
- }
- }
-
- return NO_ERROR;
-}
-
-void ResourceTable::Type::canAddEntry(const String16& name)
-{
- mCanAddEntries.add(name);
-}
-
-sp<ResourceTable::Entry> ResourceTable::Type::getEntry(const String16& entry,
- const SourcePos& sourcePos,
- const ResTable_config* config,
- bool doSetIndex,
- bool overlay,
- bool autoAddOverlay)
-{
- int pos = -1;
- sp<ConfigList> c = mConfigs.valueFor(entry);
- if (c == NULL) {
- if (overlay && !autoAddOverlay && mCanAddEntries.indexOf(entry) < 0) {
- sourcePos.error("Resource at %s appears in overlay but not"
- " in the base package; use <add-resource> to add.\n",
- String8(entry).string());
- return NULL;
- }
- c = new ConfigList(entry, sourcePos);
- mConfigs.add(entry, c);
- pos = (int)mOrderedConfigs.size();
- mOrderedConfigs.add(c);
- if (doSetIndex) {
- c->setEntryIndex(pos);
- }
- }
-
- ConfigDescription cdesc;
- if (config) cdesc = *config;
-
- sp<Entry> e = c->getEntries().valueFor(cdesc);
- if (e == NULL) {
- if (config != NULL) {
- NOISY(printf("New entry at %s:%d: imsi:%d/%d lang:%c%c cnt:%c%c "
- "orien:%d touch:%d density:%d key:%d inp:%d nav:%d sz:%dx%d "
- "sw%ddp w%ddp h%ddp dir:%d\n",
- sourcePos.file.string(), sourcePos.line,
- config->mcc, config->mnc,
- config->language[0] ? config->language[0] : '-',
- config->language[1] ? config->language[1] : '-',
- config->country[0] ? config->country[0] : '-',
- config->country[1] ? config->country[1] : '-',
- config->orientation,
- config->touchscreen,
- config->density,
- config->keyboard,
- config->inputFlags,
- config->navigation,
- config->screenWidth,
- config->screenHeight,
- config->smallestScreenWidthDp,
- config->screenWidthDp,
- config->screenHeightDp,
- config->layoutDirection));
- } else {
- NOISY(printf("New entry at %s:%d: NULL config\n",
- sourcePos.file.string(), sourcePos.line));
- }
- e = new Entry(entry, sourcePos);
- c->addEntry(cdesc, e);
- /*
- if (doSetIndex) {
- if (pos < 0) {
- for (pos=0; pos<(int)mOrderedConfigs.size(); pos++) {
- if (mOrderedConfigs[pos] == c) {
- break;
- }
- }
- if (pos >= (int)mOrderedConfigs.size()) {
- sourcePos.error("Internal error: config not found in mOrderedConfigs when adding entry");
- return NULL;
- }
- }
- e->setEntryIndex(pos);
- }
- */
- }
-
- mUniqueConfigs.add(cdesc);
-
- return e;
-}
-
-status_t ResourceTable::Type::applyPublicEntryOrder()
-{
- size_t N = mOrderedConfigs.size();
- Vector<sp<ConfigList> > origOrder(mOrderedConfigs);
- bool hasError = false;
-
- size_t i;
- for (i=0; i<N; i++) {
- mOrderedConfigs.replaceAt(NULL, i);
- }
-
- const size_t NP = mPublic.size();
- //printf("Ordering %d configs from %d public defs\n", N, NP);
- size_t j;
- for (j=0; j<NP; j++) {
- const String16& name = mPublic.keyAt(j);
- const Public& p = mPublic.valueAt(j);
- int32_t idx = Res_GETENTRY(p.ident);
- //printf("Looking for entry \"%s\"/\"%s\" (0x%08x) in %d...\n",
- // String8(mName).string(), String8(name).string(), p.ident, N);
- bool found = false;
- for (i=0; i<N; i++) {
- sp<ConfigList> e = origOrder.itemAt(i);
- //printf("#%d: \"%s\"\n", i, String8(e->getName()).string());
- if (e->getName() == name) {
- if (idx >= (int32_t)mOrderedConfigs.size()) {
- p.sourcePos.error("Public entry identifier 0x%x entry index "
- "is larger than available symbols (index %d, total symbols %d).\n",
- p.ident, idx, mOrderedConfigs.size());
- hasError = true;
- } else if (mOrderedConfigs.itemAt(idx) == NULL) {
- e->setPublic(true);
- e->setPublicSourcePos(p.sourcePos);
- mOrderedConfigs.replaceAt(e, idx);
- origOrder.removeAt(i);
- N--;
- found = true;
- break;
- } else {
- sp<ConfigList> oe = mOrderedConfigs.itemAt(idx);
-
- p.sourcePos.error("Multiple entry names declared for public entry"
- " identifier 0x%x in type %s (%s vs %s).\n"
- "%s:%d: Originally defined here.",
- idx+1, String8(mName).string(),
- String8(oe->getName()).string(),
- String8(name).string(),
- oe->getPublicSourcePos().file.string(),
- oe->getPublicSourcePos().line);
- hasError = true;
- }
- }
- }
-
- if (!found) {
- p.sourcePos.error("Public symbol %s/%s declared here is not defined.",
- String8(mName).string(), String8(name).string());
- hasError = true;
- }
- }
-
- //printf("Copying back in %d non-public configs, have %d\n", N, origOrder.size());
-
- if (N != origOrder.size()) {
- printf("Internal error: remaining private symbol count mismatch\n");
- N = origOrder.size();
- }
-
- j = 0;
- for (i=0; i<N; i++) {
- sp<ConfigList> e = origOrder.itemAt(i);
- // There will always be enough room for the remaining entries.
- while (mOrderedConfigs.itemAt(j) != NULL) {
- j++;
- }
- mOrderedConfigs.replaceAt(e, j);
- j++;
- }
-
- return hasError ? UNKNOWN_ERROR : NO_ERROR;
-}
-
-ResourceTable::Package::Package(const String16& name, ssize_t includedId)
- : mName(name), mIncludedId(includedId),
- mTypeStringsMapping(0xffffffff),
- mKeyStringsMapping(0xffffffff)
-{
-}
-
-sp<ResourceTable::Type> ResourceTable::Package::getType(const String16& type,
- const SourcePos& sourcePos,
- bool doSetIndex)
-{
- sp<Type> t = mTypes.valueFor(type);
- if (t == NULL) {
- t = new Type(type, sourcePos);
- mTypes.add(type, t);
- mOrderedTypes.add(t);
- if (doSetIndex) {
- // For some reason the type's index is set to one plus the index
- // in the mOrderedTypes list, rather than just the index.
- t->setIndex(mOrderedTypes.size());
- }
- }
- return t;
-}
-
-status_t ResourceTable::Package::setTypeStrings(const sp<AaptFile>& data)
-{
- mTypeStringsData = data;
- status_t err = setStrings(data, &mTypeStrings, &mTypeStringsMapping);
- if (err != NO_ERROR) {
- fprintf(stderr, "ERROR: Type string data is corrupt!\n");
- }
- return err;
-}
-
-status_t ResourceTable::Package::setKeyStrings(const sp<AaptFile>& data)
-{
- mKeyStringsData = data;
- status_t err = setStrings(data, &mKeyStrings, &mKeyStringsMapping);
- if (err != NO_ERROR) {
- fprintf(stderr, "ERROR: Key string data is corrupt!\n");
- }
- return err;
-}
-
-status_t ResourceTable::Package::setStrings(const sp<AaptFile>& data,
- ResStringPool* strings,
- DefaultKeyedVector<String16, uint32_t>* mappings)
-{
- if (data->getData() == NULL) {
- return UNKNOWN_ERROR;
- }
-
- NOISY(aout << "Setting restable string pool: "
- << HexDump(data->getData(), data->getSize()) << endl);
-
- status_t err = strings->setTo(data->getData(), data->getSize());
- if (err == NO_ERROR) {
- const size_t N = strings->size();
- for (size_t i=0; i<N; i++) {
- size_t len;
- mappings->add(String16(strings->stringAt(i, &len)), i);
- }
- }
- return err;
-}
-
-status_t ResourceTable::Package::applyPublicTypeOrder()
-{
- size_t N = mOrderedTypes.size();
- Vector<sp<Type> > origOrder(mOrderedTypes);
-
- size_t i;
- for (i=0; i<N; i++) {
- mOrderedTypes.replaceAt(NULL, i);
- }
-
- for (i=0; i<N; i++) {
- sp<Type> t = origOrder.itemAt(i);
- int32_t idx = t->getPublicIndex();
- if (idx > 0) {
- idx--;
- while (idx >= (int32_t)mOrderedTypes.size()) {
- mOrderedTypes.add();
- }
- if (mOrderedTypes.itemAt(idx) != NULL) {
- sp<Type> ot = mOrderedTypes.itemAt(idx);
- t->getFirstPublicSourcePos().error("Multiple type names declared for public type"
- " identifier 0x%x (%s vs %s).\n"
- "%s:%d: Originally defined here.",
- idx, String8(ot->getName()).string(),
- String8(t->getName()).string(),
- ot->getFirstPublicSourcePos().file.string(),
- ot->getFirstPublicSourcePos().line);
- return UNKNOWN_ERROR;
- }
- mOrderedTypes.replaceAt(t, idx);
- origOrder.removeAt(i);
- i--;
- N--;
- }
- }
-
- size_t j=0;
- for (i=0; i<N; i++) {
- sp<Type> t = origOrder.itemAt(i);
- // There will always be enough room for the remaining types.
- while (mOrderedTypes.itemAt(j) != NULL) {
- j++;
- }
- mOrderedTypes.replaceAt(t, j);
- }
-
- return NO_ERROR;
-}
-
-sp<ResourceTable::Package> ResourceTable::getPackage(const String16& package)
-{
- sp<Package> p = mPackages.valueFor(package);
- if (p == NULL) {
- if (mIsAppPackage) {
- if (mHaveAppPackage) {
- fprintf(stderr, "Adding multiple application package resources; only one is allowed.\n"
- "Use -x to create extended resources.\n");
- return NULL;
- }
- mHaveAppPackage = true;
- p = new Package(package, 127);
- } else {
- p = new Package(package, mNextPackageId);
- }
- //printf("*** NEW PACKAGE: \"%s\" id=%d\n",
- // String8(package).string(), p->getAssignedId());
- mPackages.add(package, p);
- mOrderedPackages.add(p);
- mNextPackageId++;
- }
- return p;
-}
-
-sp<ResourceTable::Type> ResourceTable::getType(const String16& package,
- const String16& type,
- const SourcePos& sourcePos,
- bool doSetIndex)
-{
- sp<Package> p = getPackage(package);
- if (p == NULL) {
- return NULL;
- }
- return p->getType(type, sourcePos, doSetIndex);
-}
-
-sp<ResourceTable::Entry> ResourceTable::getEntry(const String16& package,
- const String16& type,
- const String16& name,
- const SourcePos& sourcePos,
- bool overlay,
- const ResTable_config* config,
- bool doSetIndex)
-{
- sp<Type> t = getType(package, type, sourcePos, doSetIndex);
- if (t == NULL) {
- return NULL;
- }
- return t->getEntry(name, sourcePos, config, doSetIndex, overlay, mBundle->getAutoAddOverlay());
-}
-
-sp<const ResourceTable::Entry> ResourceTable::getEntry(uint32_t resID,
- const ResTable_config* config) const
-{
- int pid = Res_GETPACKAGE(resID)+1;
- const size_t N = mOrderedPackages.size();
- size_t i;
- sp<Package> p;
- for (i=0; i<N; i++) {
- sp<Package> check = mOrderedPackages[i];
- if (check->getAssignedId() == pid) {
- p = check;
- break;
- }
-
- }
- if (p == NULL) {
- fprintf(stderr, "warning: Package not found for resource #%08x\n", resID);
- return NULL;
- }
-
- int tid = Res_GETTYPE(resID);
- if (tid < 0 || tid >= (int)p->getOrderedTypes().size()) {
- fprintf(stderr, "warning: Type not found for resource #%08x\n", resID);
- return NULL;
- }
- sp<Type> t = p->getOrderedTypes()[tid];
-
- int eid = Res_GETENTRY(resID);
- if (eid < 0 || eid >= (int)t->getOrderedConfigs().size()) {
- fprintf(stderr, "warning: Entry not found for resource #%08x\n", resID);
- return NULL;
- }
-
- sp<ConfigList> c = t->getOrderedConfigs()[eid];
- if (c == NULL) {
- fprintf(stderr, "warning: Entry not found for resource #%08x\n", resID);
- return NULL;
- }
-
- ConfigDescription cdesc;
- if (config) cdesc = *config;
- sp<Entry> e = c->getEntries().valueFor(cdesc);
- if (c == NULL) {
- fprintf(stderr, "warning: Entry configuration not found for resource #%08x\n", resID);
- return NULL;
- }
-
- return e;
-}
-
-const ResourceTable::Item* ResourceTable::getItem(uint32_t resID, uint32_t attrID) const
-{
- sp<const Entry> e = getEntry(resID);
- if (e == NULL) {
- return NULL;
- }
-
- const size_t N = e->getBag().size();
- for (size_t i=0; i<N; i++) {
- const Item& it = e->getBag().valueAt(i);
- if (it.bagKeyId == 0) {
- fprintf(stderr, "warning: ID not yet assigned to '%s' in bag '%s'\n",
- String8(e->getName()).string(),
- String8(e->getBag().keyAt(i)).string());
- }
- if (it.bagKeyId == attrID) {
- return &it;
- }
- }
-
- return NULL;
-}
-
-bool ResourceTable::getItemValue(
- uint32_t resID, uint32_t attrID, Res_value* outValue)
-{
- const Item* item = getItem(resID, attrID);
-
- bool res = false;
- if (item != NULL) {
- if (item->evaluating) {
- sp<const Entry> e = getEntry(resID);
- const size_t N = e->getBag().size();
- size_t i;
- for (i=0; i<N; i++) {
- if (&e->getBag().valueAt(i) == item) {
- break;
- }
- }
- fprintf(stderr, "warning: Circular reference detected in key '%s' of bag '%s'\n",
- String8(e->getName()).string(),
- String8(e->getBag().keyAt(i)).string());
- return false;
- }
- item->evaluating = true;
- res = stringToValue(outValue, NULL, item->value, false, false, item->bagKeyId);
- NOISY(
- if (res) {
- printf("getItemValue of #%08x[#%08x] (%s): type=#%08x, data=#%08x\n",
- resID, attrID, String8(getEntry(resID)->getName()).string(),
- outValue->dataType, outValue->data);
- } else {
- printf("getItemValue of #%08x[#%08x]: failed\n",
- resID, attrID);
- }
- );
- item->evaluating = false;
- }
- return res;
-}
diff --git a/tools/aapt/ResourceTable.h b/tools/aapt/ResourceTable.h
deleted file mode 100644
index a3e0666..0000000
--- a/tools/aapt/ResourceTable.h
+++ /dev/null
@@ -1,557 +0,0 @@
-//
-// Copyright 2006 The Android Open Source Project
-//
-// Build resource files from raw assets.
-//
-
-#ifndef RESOURCE_TABLE_H
-#define RESOURCE_TABLE_H
-
-#include "StringPool.h"
-#include "SourcePos.h"
-
-#include <set>
-#include <map>
-
-using namespace std;
-
-class XMLNode;
-class ResourceTable;
-
-enum {
- XML_COMPILE_STRIP_COMMENTS = 1<<0,
- XML_COMPILE_ASSIGN_ATTRIBUTE_IDS = 1<<1,
- XML_COMPILE_COMPACT_WHITESPACE = 1<<2,
- XML_COMPILE_STRIP_WHITESPACE = 1<<3,
- XML_COMPILE_STRIP_RAW_VALUES = 1<<4,
- XML_COMPILE_UTF8 = 1<<5,
-
- XML_COMPILE_STANDARD_RESOURCE =
- XML_COMPILE_STRIP_COMMENTS | XML_COMPILE_ASSIGN_ATTRIBUTE_IDS
- | XML_COMPILE_STRIP_WHITESPACE | XML_COMPILE_STRIP_RAW_VALUES
-};
-
-status_t compileXmlFile(const sp<AaptAssets>& assets,
- const sp<AaptFile>& target,
- ResourceTable* table,
- int options = XML_COMPILE_STANDARD_RESOURCE);
-
-status_t compileXmlFile(const sp<AaptAssets>& assets,
- const sp<AaptFile>& target,
- const sp<AaptFile>& outTarget,
- ResourceTable* table,
- int options = XML_COMPILE_STANDARD_RESOURCE);
-
-status_t compileXmlFile(const sp<AaptAssets>& assets,
- const sp<XMLNode>& xmlTree,
- const sp<AaptFile>& target,
- ResourceTable* table,
- int options = XML_COMPILE_STANDARD_RESOURCE);
-
-status_t compileResourceFile(Bundle* bundle,
- const sp<AaptAssets>& assets,
- const sp<AaptFile>& in,
- const ResTable_config& defParams,
- const bool overwrite,
- ResourceTable* outTable);
-
-struct AccessorCookie
-{
- SourcePos sourcePos;
- String8 attr;
- String8 value;
-
- AccessorCookie(const SourcePos&p, const String8& a, const String8& v)
- :sourcePos(p),
- attr(a),
- value(v)
- {
- }
-};
-
-class ResourceTable : public ResTable::Accessor
-{
-public:
- class Package;
- class Type;
- class Entry;
-
- struct ConfigDescription : public ResTable_config {
- ConfigDescription() {
- memset(this, 0, sizeof(*this));
- size = sizeof(ResTable_config);
- }
- ConfigDescription(const ResTable_config&o) {
- *static_cast<ResTable_config*>(this) = o;
- size = sizeof(ResTable_config);
- }
- ConfigDescription(const ConfigDescription&o) {
- *static_cast<ResTable_config*>(this) = o;
- }
-
- ConfigDescription& operator=(const ResTable_config& o) {
- *static_cast<ResTable_config*>(this) = o;
- size = sizeof(ResTable_config);
- return *this;
- }
- ConfigDescription& operator=(const ConfigDescription& o) {
- *static_cast<ResTable_config*>(this) = o;
- return *this;
- }
-
- inline bool operator<(const ConfigDescription& o) const { return compare(o) < 0; }
- inline bool operator<=(const ConfigDescription& o) const { return compare(o) <= 0; }
- inline bool operator==(const ConfigDescription& o) const { return compare(o) == 0; }
- inline bool operator!=(const ConfigDescription& o) const { return compare(o) != 0; }
- inline bool operator>=(const ConfigDescription& o) const { return compare(o) >= 0; }
- inline bool operator>(const ConfigDescription& o) const { return compare(o) > 0; }
- };
-
- ResourceTable(Bundle* bundle, const String16& assetsPackage);
-
- status_t addIncludedResources(Bundle* bundle, const sp<AaptAssets>& assets);
-
- status_t addPublic(const SourcePos& pos,
- const String16& package,
- const String16& type,
- const String16& name,
- const uint32_t ident);
-
- status_t addEntry(const SourcePos& pos,
- const String16& package,
- const String16& type,
- const String16& name,
- const String16& value,
- 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 bool overwrite = false);
-
- status_t startBag(const SourcePos& pos,
- const String16& package,
- const String16& type,
- const String16& name,
- const String16& bagParent,
- const ResTable_config* params = NULL,
- bool overlay = false,
- bool replace = false,
- bool isId = false);
-
- status_t addBag(const SourcePos& pos,
- const String16& package,
- const String16& type,
- const String16& name,
- const String16& bagParent,
- const String16& bagKey,
- const String16& value,
- const Vector<StringPool::entry_style_span>* style = NULL,
- const ResTable_config* params = NULL,
- bool replace = false,
- bool isId = false,
- const int32_t format = ResTable_map::TYPE_ANY);
-
- bool hasBagOrEntry(const String16& package,
- const String16& type,
- const String16& name) const;
-
- bool hasBagOrEntry(const String16& package,
- const String16& type,
- const String16& name,
- const ResTable_config& config) const;
-
- bool hasBagOrEntry(const String16& ref,
- const String16* defType = NULL,
- const String16* defPackage = NULL);
-
- bool appendComment(const String16& package,
- const String16& type,
- const String16& name,
- const String16& comment,
- bool onlyIfEmpty = false);
-
- bool appendTypeComment(const String16& package,
- const String16& type,
- const String16& name,
- const String16& comment);
-
- void canAddEntry(const SourcePos& pos,
- const String16& package, const String16& type, const String16& name);
-
- size_t size() const;
- size_t numLocalResources() const;
- bool hasResources() const;
-
- sp<AaptFile> flatten(Bundle*);
-
- static inline uint32_t makeResId(uint32_t packageId,
- uint32_t typeId,
- uint32_t nameId)
- {
- return nameId | (typeId<<16) | (packageId<<24);
- }
-
- static inline uint32_t getResId(const sp<Package>& p,
- const sp<Type>& t,
- uint32_t nameId);
-
- uint32_t getResId(const String16& package,
- const String16& type,
- const String16& name,
- bool onlyPublic = true) const;
-
- uint32_t getResId(const String16& ref,
- const String16* defType = NULL,
- const String16* defPackage = NULL,
- const char** outErrorMsg = NULL,
- bool onlyPublic = true) const;
-
- static bool isValidResourceName(const String16& s);
-
- bool stringToValue(Res_value* outValue, StringPool* pool,
- const String16& str,
- bool preserveSpaces, bool coerceType,
- uint32_t attrID,
- const Vector<StringPool::entry_style_span>* style = NULL,
- String16* outStr = NULL, void* accessorCookie = NULL,
- uint32_t attrType = ResTable_map::TYPE_ANY,
- const String8* configTypeName = NULL,
- const ConfigDescription* config = NULL);
-
- status_t assignResourceIds();
- status_t addSymbols(const sp<AaptSymbols>& outSymbols = NULL);
- void addLocalization(const String16& name, const String8& locale);
- status_t validateLocalizations(void);
-
- status_t flatten(Bundle*, const sp<AaptFile>& dest);
-
- void writePublicDefinitions(const String16& package, FILE* fp);
-
- virtual uint32_t getCustomResource(const String16& package,
- const String16& type,
- const String16& name) const;
- virtual uint32_t getCustomResourceWithCreation(const String16& package,
- const String16& type,
- const String16& name,
- const bool createIfNeeded);
- virtual uint32_t getRemappedPackage(uint32_t origPackage) const;
- virtual bool getAttributeType(uint32_t attrID, uint32_t* outType);
- virtual bool getAttributeMin(uint32_t attrID, uint32_t* outMin);
- virtual bool getAttributeMax(uint32_t attrID, uint32_t* outMax);
- virtual bool getAttributeKeys(uint32_t attrID, Vector<String16>* outKeys);
- virtual bool getAttributeEnum(uint32_t attrID,
- const char16_t* name, size_t nameLen,
- Res_value* outValue);
- virtual bool getAttributeFlags(uint32_t attrID,
- const char16_t* name, size_t nameLen,
- Res_value* outValue);
- virtual uint32_t getAttributeL10N(uint32_t attrID);
-
- virtual bool getLocalizationSetting();
- virtual void reportError(void* accessorCookie, const char* fmt, ...);
-
- void setCurrentXmlPos(const SourcePos& pos) { mCurrentXmlPos = pos; }
-
- class Item {
- public:
- Item() : isId(false), format(ResTable_map::TYPE_ANY), bagKeyId(0), evaluating(false)
- { memset(&parsedValue, 0, sizeof(parsedValue)); }
- Item(const SourcePos& pos,
- bool _isId,
- const String16& _value,
- const Vector<StringPool::entry_style_span>* _style = NULL,
- int32_t format = ResTable_map::TYPE_ANY);
- Item(const Item& o) : sourcePos(o.sourcePos),
- isId(o.isId), value(o.value), style(o.style),
- format(o.format), bagKeyId(o.bagKeyId), evaluating(false) {
- memset(&parsedValue, 0, sizeof(parsedValue));
- }
- ~Item() { }
-
- Item& operator=(const Item& o) {
- sourcePos = o.sourcePos;
- isId = o.isId;
- value = o.value;
- style = o.style;
- format = o.format;
- bagKeyId = o.bagKeyId;
- parsedValue = o.parsedValue;
- return *this;
- }
-
- SourcePos sourcePos;
- mutable bool isId;
- String16 value;
- Vector<StringPool::entry_style_span> style;
- int32_t format;
- uint32_t bagKeyId;
- mutable bool evaluating;
- Res_value parsedValue;
- };
-
- class Entry : public RefBase {
- public:
- Entry(const String16& name, const SourcePos& pos)
- : mName(name), mType(TYPE_UNKNOWN),
- mItemFormat(ResTable_map::TYPE_ANY), mNameIndex(-1), mPos(pos)
- { }
- virtual ~Entry() { }
-
- enum type {
- TYPE_UNKNOWN = 0,
- TYPE_ITEM,
- TYPE_BAG
- };
-
- String16 getName() const { return mName; }
- type getType() const { return mType; }
-
- void setParent(const String16& parent) { mParent = parent; }
- String16 getParent() const { return mParent; }
-
- status_t makeItABag(const SourcePos& sourcePos);
-
- status_t emptyBag(const SourcePos& sourcePos);
-
- status_t setItem(const SourcePos& pos,
- const String16& value,
- const Vector<StringPool::entry_style_span>* style = NULL,
- int32_t format = ResTable_map::TYPE_ANY,
- const bool overwrite = false);
-
- status_t addToBag(const SourcePos& pos,
- const String16& key, const String16& value,
- const Vector<StringPool::entry_style_span>* style = NULL,
- bool replace=false, bool isId = false,
- int32_t format = ResTable_map::TYPE_ANY);
-
- // Index of the entry's name string in the key pool.
- int32_t getNameIndex() const { return mNameIndex; }
- void setNameIndex(int32_t index) { mNameIndex = index; }
-
- const Item* getItem() const { return mType == TYPE_ITEM ? &mItem : NULL; }
- const KeyedVector<String16, Item>& getBag() const { return mBag; }
-
- status_t generateAttributes(ResourceTable* table,
- const String16& package);
-
- status_t assignResourceIds(ResourceTable* table,
- const String16& package);
-
- status_t prepareFlatten(StringPool* strings, ResourceTable* table,
- const String8* configTypeName, const ConfigDescription* config);
-
- status_t remapStringValue(StringPool* strings);
-
- ssize_t flatten(Bundle*, const sp<AaptFile>& data, bool isPublic);
-
- const SourcePos& getPos() const { return mPos; }
-
- private:
- String16 mName;
- String16 mParent;
- type mType;
- Item mItem;
- int32_t mItemFormat;
- KeyedVector<String16, Item> mBag;
- int32_t mNameIndex;
- uint32_t mParentId;
- SourcePos mPos;
- };
-
- class ConfigList : public RefBase {
- public:
- ConfigList(const String16& name, const SourcePos& pos)
- : mName(name), mPos(pos), mPublic(false), mEntryIndex(-1) { }
- virtual ~ConfigList() { }
-
- String16 getName() const { return mName; }
- const SourcePos& getPos() const { return mPos; }
-
- void appendComment(const String16& comment, bool onlyIfEmpty = false);
- const String16& getComment() const { return mComment; }
-
- void appendTypeComment(const String16& comment);
- const String16& getTypeComment() const { return mTypeComment; }
-
- // Index of this entry in its Type.
- int32_t getEntryIndex() const { return mEntryIndex; }
- void setEntryIndex(int32_t index) { mEntryIndex = index; }
-
- void setPublic(bool pub) { mPublic = pub; }
- bool getPublic() const { return mPublic; }
- void setPublicSourcePos(const SourcePos& pos) { mPublicSourcePos = pos; }
- const SourcePos& getPublicSourcePos() { return mPublicSourcePos; }
-
- void addEntry(const ResTable_config& config, const sp<Entry>& entry) {
- mEntries.add(config, entry);
- }
-
- const DefaultKeyedVector<ConfigDescription, sp<Entry> >& getEntries() const { return mEntries; }
- private:
- const String16 mName;
- const SourcePos mPos;
- String16 mComment;
- String16 mTypeComment;
- bool mPublic;
- SourcePos mPublicSourcePos;
- int32_t mEntryIndex;
- DefaultKeyedVector<ConfigDescription, sp<Entry> > mEntries;
- };
-
- class Public {
- public:
- Public() : sourcePos(), ident(0) { }
- Public(const SourcePos& pos,
- const String16& _comment,
- uint32_t _ident)
- : sourcePos(pos),
- comment(_comment), ident(_ident) { }
- Public(const Public& o) : sourcePos(o.sourcePos),
- comment(o.comment), ident(o.ident) { }
- ~Public() { }
-
- Public& operator=(const Public& o) {
- sourcePos = o.sourcePos;
- comment = o.comment;
- ident = o.ident;
- return *this;
- }
-
- SourcePos sourcePos;
- String16 comment;
- uint32_t ident;
- };
-
- class Type : public RefBase {
- public:
- Type(const String16& name, const SourcePos& pos)
- : mName(name), mFirstPublicSourcePos(NULL), mPublicIndex(-1), mIndex(-1), mPos(pos)
- { }
- virtual ~Type() { delete mFirstPublicSourcePos; }
-
- status_t addPublic(const SourcePos& pos,
- const String16& name,
- const uint32_t ident);
-
- void canAddEntry(const String16& name);
-
- String16 getName() const { return mName; }
- sp<Entry> getEntry(const String16& entry,
- const SourcePos& pos,
- const ResTable_config* config = NULL,
- bool doSetIndex = false,
- bool overlay = false,
- bool autoAddOverlay = false);
-
- const SourcePos& getFirstPublicSourcePos() const { return *mFirstPublicSourcePos; }
-
- int32_t getPublicIndex() const { return mPublicIndex; }
-
- int32_t getIndex() const { return mIndex; }
- void setIndex(int32_t index) { mIndex = index; }
-
- status_t applyPublicEntryOrder();
-
- const SortedVector<ConfigDescription>& getUniqueConfigs() const { return mUniqueConfigs; }
-
- const DefaultKeyedVector<String16, sp<ConfigList> >& getConfigs() const { return mConfigs; }
- const Vector<sp<ConfigList> >& getOrderedConfigs() const { return mOrderedConfigs; }
-
- const SortedVector<String16>& getCanAddEntries() const { return mCanAddEntries; }
-
- const SourcePos& getPos() const { return mPos; }
- private:
- String16 mName;
- SourcePos* mFirstPublicSourcePos;
- DefaultKeyedVector<String16, Public> mPublic;
- SortedVector<ConfigDescription> mUniqueConfigs;
- DefaultKeyedVector<String16, sp<ConfigList> > mConfigs;
- Vector<sp<ConfigList> > mOrderedConfigs;
- SortedVector<String16> mCanAddEntries;
- int32_t mPublicIndex;
- int32_t mIndex;
- SourcePos mPos;
- };
-
- class Package : public RefBase {
- public:
- Package(const String16& name, ssize_t includedId=-1);
- virtual ~Package() { }
-
- String16 getName() const { return mName; }
- sp<Type> getType(const String16& type,
- const SourcePos& pos,
- bool doSetIndex = false);
-
- ssize_t getAssignedId() const { return mIncludedId; }
-
- const ResStringPool& getTypeStrings() const { return mTypeStrings; }
- uint32_t indexOfTypeString(const String16& s) const { return mTypeStringsMapping.valueFor(s); }
- const sp<AaptFile> getTypeStringsData() const { return mTypeStringsData; }
- status_t setTypeStrings(const sp<AaptFile>& data);
-
- const ResStringPool& getKeyStrings() const { return mKeyStrings; }
- uint32_t indexOfKeyString(const String16& s) const { return mKeyStringsMapping.valueFor(s); }
- const sp<AaptFile> getKeyStringsData() const { return mKeyStringsData; }
- status_t setKeyStrings(const sp<AaptFile>& data);
-
- status_t applyPublicTypeOrder();
-
- const DefaultKeyedVector<String16, sp<Type> >& getTypes() const { return mTypes; }
- const Vector<sp<Type> >& getOrderedTypes() const { return mOrderedTypes; }
-
- private:
- status_t setStrings(const sp<AaptFile>& data,
- ResStringPool* strings,
- DefaultKeyedVector<String16, uint32_t>* mappings);
-
- const String16 mName;
- const ssize_t mIncludedId;
- DefaultKeyedVector<String16, sp<Type> > mTypes;
- Vector<sp<Type> > mOrderedTypes;
- sp<AaptFile> mTypeStringsData;
- sp<AaptFile> mKeyStringsData;
- ResStringPool mTypeStrings;
- ResStringPool mKeyStrings;
- DefaultKeyedVector<String16, uint32_t> mTypeStringsMapping;
- DefaultKeyedVector<String16, uint32_t> mKeyStringsMapping;
- };
-
-private:
- void writePublicDefinitions(const String16& package, FILE* fp, bool pub);
- sp<Package> getPackage(const String16& package);
- sp<Type> getType(const String16& package,
- const String16& type,
- const SourcePos& pos,
- bool doSetIndex = false);
- sp<Entry> getEntry(const String16& package,
- const String16& type,
- const String16& name,
- const SourcePos& pos,
- bool overlay,
- const ResTable_config* config = NULL,
- bool doSetIndex = false);
- sp<const Entry> getEntry(uint32_t resID,
- const ResTable_config* config = NULL) const;
- const Item* getItem(uint32_t resID, uint32_t attrID) const;
- bool getItemValue(uint32_t resID, uint32_t attrID,
- Res_value* outValue);
-
-
- String16 mAssetsPackage;
- sp<AaptAssets> mAssets;
- DefaultKeyedVector<String16, sp<Package> > mPackages;
- Vector<sp<Package> > mOrderedPackages;
- uint32_t mNextPackageId;
- bool mHaveAppPackage;
- bool mIsAppPackage;
- size_t mNumLocal;
- SourcePos mCurrentXmlPos;
- Bundle* mBundle;
-
- // key = string resource name, value = set of locales in which that name is defined
- map<String16, set<String8> > mLocalizations;
-};
-
-#endif
diff --git a/tools/aapt/SourcePos.cpp b/tools/aapt/SourcePos.cpp
deleted file mode 100644
index e2a921c..0000000
--- a/tools/aapt/SourcePos.cpp
+++ /dev/null
@@ -1,171 +0,0 @@
-#include "SourcePos.h"
-
-#include <stdarg.h>
-#include <vector>
-
-using namespace std;
-
-
-// ErrorPos
-// =============================================================================
-struct ErrorPos
-{
- String8 file;
- int line;
- String8 error;
- bool fatal;
-
- ErrorPos();
- ErrorPos(const ErrorPos& that);
- ErrorPos(const String8& file, int line, const String8& error, bool fatal);
- ~ErrorPos();
- bool operator<(const ErrorPos& rhs) const;
- bool operator==(const ErrorPos& rhs) const;
- ErrorPos& operator=(const ErrorPos& rhs);
-
- void print(FILE* to) const;
-};
-
-static vector<ErrorPos> g_errors;
-
-ErrorPos::ErrorPos()
- :line(-1), fatal(false)
-{
-}
-
-ErrorPos::ErrorPos(const ErrorPos& that)
- :file(that.file),
- line(that.line),
- error(that.error),
- fatal(that.fatal)
-{
-}
-
-ErrorPos::ErrorPos(const String8& f, int l, const String8& e, bool fat)
- :file(f),
- line(l),
- error(e),
- fatal(fat)
-{
-}
-
-ErrorPos::~ErrorPos()
-{
-}
-
-bool
-ErrorPos::operator<(const ErrorPos& rhs) const
-{
- if (this->file < rhs.file) return true;
- if (this->file == rhs.file) {
- if (this->line < rhs.line) return true;
- if (this->line == rhs.line) {
- if (this->error < rhs.error) return true;
- }
- }
- return false;
-}
-
-bool
-ErrorPos::operator==(const ErrorPos& rhs) const
-{
- return this->file == rhs.file
- && this->line == rhs.line
- && this->error == rhs.error;
-}
-
-ErrorPos&
-ErrorPos::operator=(const ErrorPos& rhs)
-{
- this->file = rhs.file;
- this->line = rhs.line;
- this->error = rhs.error;
- return *this;
-}
-
-void
-ErrorPos::print(FILE* to) const
-{
- const char* type = fatal ? "error:" : "warning:";
-
- if (this->line >= 0) {
- fprintf(to, "%s:%d: %s %s\n", this->file.string(), this->line, type, this->error.string());
- } else {
- fprintf(to, "%s: %s %s\n", this->file.string(), type, this->error.string());
- }
-}
-
-// SourcePos
-// =============================================================================
-SourcePos::SourcePos(const String8& f, int l)
- : file(f), line(l)
-{
-}
-
-SourcePos::SourcePos(const SourcePos& that)
- : file(that.file), line(that.line)
-{
-}
-
-SourcePos::SourcePos()
- : file("???", 0), line(-1)
-{
-}
-
-SourcePos::~SourcePos()
-{
-}
-
-int
-SourcePos::error(const char* fmt, ...) const
-{
- int retval=0;
- char buf[1024];
- va_list ap;
- va_start(ap, fmt);
- retval = vsnprintf(buf, sizeof(buf), fmt, ap);
- va_end(ap);
- char* p = buf + retval - 1;
- while (p > buf && *p == '\n') {
- *p = '\0';
- p--;
- }
- g_errors.push_back(ErrorPos(this->file, this->line, String8(buf), true));
- return retval;
-}
-
-int
-SourcePos::warning(const char* fmt, ...) const
-{
- int retval=0;
- char buf[1024];
- va_list ap;
- va_start(ap, fmt);
- retval = vsnprintf(buf, sizeof(buf), fmt, ap);
- va_end(ap);
- char* p = buf + retval - 1;
- while (p > buf && *p == '\n') {
- *p = '\0';
- p--;
- }
- ErrorPos(this->file, this->line, String8(buf), false).print(stderr);
- return retval;
-}
-
-bool
-SourcePos::hasErrors()
-{
- return g_errors.size() > 0;
-}
-
-void
-SourcePos::printErrors(FILE* to)
-{
- vector<ErrorPos>::const_iterator it;
- for (it=g_errors.begin(); it!=g_errors.end(); it++) {
- it->print(to);
- }
-}
-
-
-
diff --git a/tools/aapt/SourcePos.h b/tools/aapt/SourcePos.h
deleted file mode 100644
index 33f72a9..0000000
--- a/tools/aapt/SourcePos.h
+++ /dev/null
@@ -1,28 +0,0 @@
-#ifndef SOURCEPOS_H
-#define SOURCEPOS_H
-
-#include <utils/String8.h>
-#include <stdio.h>
-
-using namespace android;
-
-class SourcePos
-{
-public:
- String8 file;
- int line;
-
- SourcePos(const String8& f, int l);
- SourcePos(const SourcePos& that);
- SourcePos();
- ~SourcePos();
-
- int error(const char* fmt, ...) const;
- int warning(const char* fmt, ...) const;
-
- static bool hasErrors();
- static void printErrors(FILE* to);
-};
-
-
-#endif // SOURCEPOS_H
diff --git a/tools/aapt/StringPool.cpp b/tools/aapt/StringPool.cpp
deleted file mode 100644
index 158b391..0000000
--- a/tools/aapt/StringPool.cpp
+++ /dev/null
@@ -1,574 +0,0 @@
-//
-// Copyright 2006 The Android Open Source Project
-//
-// Build resource files from raw assets.
-//
-
-#include "StringPool.h"
-#include "ResourceTable.h"
-
-#include <utils/ByteOrder.h>
-#include <utils/SortedVector.h>
-#include "qsort_r_compat.h"
-
-#if HAVE_PRINTF_ZD
-# define ZD "%zd"
-# define ZD_TYPE ssize_t
-#else
-# define ZD "%ld"
-# define ZD_TYPE long
-#endif
-
-#define NOISY(x) //x
-
-void strcpy16_htod(uint16_t* dst, const uint16_t* src)
-{
- while (*src) {
- char16_t s = htods(*src);
- *dst++ = s;
- src++;
- }
- *dst = 0;
-}
-
-void printStringPool(const ResStringPool* pool)
-{
- SortedVector<const void*> uniqueStrings;
- const size_t N = pool->size();
- for (size_t i=0; i<N; i++) {
- size_t len;
- if (pool->isUTF8()) {
- uniqueStrings.add(pool->string8At(i, &len));
- } else {
- uniqueStrings.add(pool->stringAt(i, &len));
- }
- }
-
- printf("String pool of " ZD " unique %s %s strings, " ZD " entries and "
- ZD " styles using " ZD " bytes:\n",
- (ZD_TYPE)uniqueStrings.size(), pool->isUTF8() ? "UTF-8" : "UTF-16",
- pool->isSorted() ? "sorted" : "non-sorted",
- (ZD_TYPE)N, (ZD_TYPE)pool->styleCount(), (ZD_TYPE)pool->bytes());
-
- const size_t NS = pool->size();
- for (size_t s=0; s<NS; s++) {
- String8 str = pool->string8ObjectAt(s);
- printf("String #" ZD ": %s\n", (ZD_TYPE) s, str.string());
- }
-}
-
-String8 StringPool::entry::makeConfigsString() const {
- String8 configStr(configTypeName);
- if (configStr.size() > 0) configStr.append(" ");
- if (configs.size() > 0) {
- for (size_t j=0; j<configs.size(); j++) {
- if (j > 0) configStr.append(", ");
- configStr.append(configs[j].toString());
- }
- } else {
- configStr = "(none)";
- }
- return configStr;
-}
-
-int StringPool::entry::compare(const entry& o) const {
- // Strings with styles go first, to reduce the size of the styles array.
- // We don't care about the relative order of these strings.
- if (hasStyles) {
- return o.hasStyles ? 0 : -1;
- }
- if (o.hasStyles) {
- return 1;
- }
-
- // Sort unstyled strings by type, then by logical configuration.
- int comp = configTypeName.compare(o.configTypeName);
- if (comp != 0) {
- return comp;
- }
- const size_t LHN = configs.size();
- const size_t RHN = o.configs.size();
- size_t i=0;
- while (i < LHN && i < RHN) {
- comp = configs[i].compareLogical(o.configs[i]);
- if (comp != 0) {
- return comp;
- }
- i++;
- }
- if (LHN < RHN) return -1;
- else if (LHN > RHN) return 1;
- return 0;
-}
-
-StringPool::StringPool(bool utf8) :
- mUTF8(utf8), mValues(-1)
-{
-}
-
-ssize_t StringPool::add(const String16& value, const Vector<entry_style_span>& spans,
- const String8* configTypeName, const ResTable_config* config)
-{
- ssize_t res = add(value, false, configTypeName, config);
- if (res >= 0) {
- addStyleSpans(res, spans);
- }
- return res;
-}
-
-ssize_t StringPool::add(const String16& value,
- bool mergeDuplicates, const String8* configTypeName, const ResTable_config* config)
-{
- ssize_t vidx = mValues.indexOfKey(value);
- ssize_t pos = vidx >= 0 ? mValues.valueAt(vidx) : -1;
- ssize_t eidx = pos >= 0 ? mEntryArray.itemAt(pos) : -1;
- if (eidx < 0) {
- eidx = mEntries.add(entry(value));
- if (eidx < 0) {
- fprintf(stderr, "Failure adding string %s\n", String8(value).string());
- return eidx;
- }
- }
-
- if (configTypeName != NULL) {
- entry& ent = mEntries.editItemAt(eidx);
- NOISY(printf("*** adding config type name %s, was %s\n",
- configTypeName->string(), ent.configTypeName.string()));
- if (ent.configTypeName.size() <= 0) {
- ent.configTypeName = *configTypeName;
- } else if (ent.configTypeName != *configTypeName) {
- ent.configTypeName = " ";
- }
- }
-
- if (config != NULL) {
- // Add this to the set of configs associated with the string.
- entry& ent = mEntries.editItemAt(eidx);
- size_t addPos;
- for (addPos=0; addPos<ent.configs.size(); addPos++) {
- int cmp = ent.configs.itemAt(addPos).compareLogical(*config);
- if (cmp >= 0) {
- if (cmp > 0) {
- NOISY(printf("*** inserting config: %s\n", config->toString().string()));
- ent.configs.insertAt(*config, addPos);
- }
- break;
- }
- }
- if (addPos >= ent.configs.size()) {
- NOISY(printf("*** adding config: %s\n", config->toString().string()));
- ent.configs.add(*config);
- }
- }
-
- const bool first = vidx < 0;
- const bool styled = (pos >= 0 && (size_t)pos < mEntryStyleArray.size()) ?
- mEntryStyleArray[pos].spans.size() : 0;
- if (first || styled || !mergeDuplicates) {
- pos = mEntryArray.add(eidx);
- if (first) {
- vidx = mValues.add(value, pos);
- }
- entry& ent = mEntries.editItemAt(eidx);
- ent.indices.add(pos);
- }
-
- NOISY(printf("Adding string %s to pool: pos=%d eidx=%d vidx=%d\n",
- String8(value).string(), pos, eidx, vidx));
-
- return pos;
-}
-
-status_t StringPool::addStyleSpan(size_t idx, const String16& name,
- uint32_t start, uint32_t end)
-{
- entry_style_span span;
- span.name = name;
- span.span.firstChar = start;
- span.span.lastChar = end;
- return addStyleSpan(idx, span);
-}
-
-status_t StringPool::addStyleSpans(size_t idx, const Vector<entry_style_span>& spans)
-{
- const size_t N=spans.size();
- for (size_t i=0; i<N; i++) {
- status_t err = addStyleSpan(idx, spans[i]);
- if (err != NO_ERROR) {
- return err;
- }
- }
- return NO_ERROR;
-}
-
-status_t StringPool::addStyleSpan(size_t idx, const entry_style_span& span)
-{
- // Place blank entries in the span array up to this index.
- while (mEntryStyleArray.size() <= idx) {
- mEntryStyleArray.add();
- }
-
- entry_style& style = mEntryStyleArray.editItemAt(idx);
- style.spans.add(span);
- mEntries.editItemAt(mEntryArray[idx]).hasStyles = true;
- return NO_ERROR;
-}
-
-int StringPool::config_sort(void* state, const void* lhs, const void* rhs)
-{
- StringPool* pool = (StringPool*)state;
- const entry& lhe = pool->mEntries[pool->mEntryArray[*static_cast<const size_t*>(lhs)]];
- const entry& rhe = pool->mEntries[pool->mEntryArray[*static_cast<const size_t*>(rhs)]];
- return lhe.compare(rhe);
-}
-
-void StringPool::sortByConfig()
-{
- LOG_ALWAYS_FATAL_IF(mOriginalPosToNewPos.size() > 0, "Can't sort string pool after already sorted.");
-
- const size_t N = mEntryArray.size();
-
- // This is a vector that starts out with a 1:1 mapping to entries
- // in the array, which we will sort to come up with the desired order.
- // At that point it maps from the new position in the array to the
- // original position the entry appeared.
- Vector<size_t> newPosToOriginalPos;
- newPosToOriginalPos.setCapacity(N);
- for (size_t i=0; i < N; i++) {
- newPosToOriginalPos.add(i);
- }
-
- // Sort the array.
- NOISY(printf("SORTING STRINGS BY CONFIGURATION...\n"));
- // Vector::sort uses insertion sort, which is very slow for this data set.
- // Use quicksort instead because we don't need a stable sort here.
- qsort_r_compat(newPosToOriginalPos.editArray(), N, sizeof(size_t), this, config_sort);
- //newPosToOriginalPos.sort(config_sort, this);
- NOISY(printf("DONE SORTING STRINGS BY CONFIGURATION.\n"));
-
- // Create the reverse mapping from the original position in the array
- // to the new position where it appears in the sorted array. This is
- // so that clients can re-map any positions they had previously stored.
- mOriginalPosToNewPos = newPosToOriginalPos;
- for (size_t i=0; i<N; i++) {
- mOriginalPosToNewPos.editItemAt(newPosToOriginalPos[i]) = i;
- }
-
-#if 0
- SortedVector<entry> entries;
-
- for (size_t i=0; i<N; i++) {
- printf("#%d was %d: %s\n", i, newPosToOriginalPos[i],
- mEntries[mEntryArray[newPosToOriginalPos[i]]].makeConfigsString().string());
- entries.add(mEntries[mEntryArray[i]]);
- }
-
- for (size_t i=0; i<entries.size(); i++) {
- printf("Sorted config #%d: %s\n", i,
- entries[i].makeConfigsString().string());
- }
-#endif
-
- // Now we rebuild the arrays.
- Vector<entry> newEntries;
- Vector<size_t> newEntryArray;
- Vector<entry_style> newEntryStyleArray;
- DefaultKeyedVector<size_t, size_t> origOffsetToNewOffset;
-
- for (size_t i=0; i<N; i++) {
- // We are filling in new offset 'i'; oldI is where we can find it
- // in the original data structure.
- size_t oldI = newPosToOriginalPos[i];
- // This is the actual entry associated with the old offset.
- const entry& oldEnt = mEntries[mEntryArray[oldI]];
- // This is the same entry the last time we added it to the
- // new entry array, if any.
- ssize_t newIndexOfOffset = origOffsetToNewOffset.indexOfKey(oldI);
- size_t newOffset;
- if (newIndexOfOffset < 0) {
- // This is the first time we have seen the entry, so add
- // it.
- newOffset = newEntries.add(oldEnt);
- newEntries.editItemAt(newOffset).indices.clear();
- } else {
- // We have seen this entry before, use the existing one
- // instead of adding it again.
- newOffset = origOffsetToNewOffset.valueAt(newIndexOfOffset);
- }
- // Update the indices to include this new position.
- newEntries.editItemAt(newOffset).indices.add(i);
- // And add the offset of the entry to the new entry array.
- newEntryArray.add(newOffset);
- // Add any old style to the new style array.
- if (mEntryStyleArray.size() > 0) {
- if (oldI < mEntryStyleArray.size()) {
- newEntryStyleArray.add(mEntryStyleArray[oldI]);
- } else {
- newEntryStyleArray.add(entry_style());
- }
- }
- }
-
- // Now trim any entries at the end of the new style array that are
- // not needed.
- for (ssize_t i=newEntryStyleArray.size()-1; i>=0; i--) {
- const entry_style& style = newEntryStyleArray[i];
- if (style.spans.size() > 0) {
- // That's it.
- break;
- }
- // This one is not needed; remove.
- newEntryStyleArray.removeAt(i);
- }
-
- // All done, install the new data structures and upate mValues with
- // the new positions.
- mEntries = newEntries;
- mEntryArray = newEntryArray;
- mEntryStyleArray = newEntryStyleArray;
- mValues.clear();
- for (size_t i=0; i<mEntries.size(); i++) {
- const entry& ent = mEntries[i];
- mValues.add(ent.value, ent.indices[0]);
- }
-
-#if 0
- printf("FINAL SORTED STRING CONFIGS:\n");
- for (size_t i=0; i<mEntries.size(); i++) {
- const entry& ent = mEntries[i];
- printf("#" ZD " %s: %s\n", (ZD_TYPE)i, ent.makeConfigsString().string(),
- String8(ent.value).string());
- }
-#endif
-}
-
-sp<AaptFile> StringPool::createStringBlock()
-{
- sp<AaptFile> pool = new AaptFile(String8(), AaptGroupEntry(),
- String8());
- status_t err = writeStringBlock(pool);
- return err == NO_ERROR ? pool : NULL;
-}
-
-#define ENCODE_LENGTH(str, chrsz, strSize) \
-{ \
- size_t maxMask = 1 << ((chrsz*8)-1); \
- size_t maxSize = maxMask-1; \
- if (strSize > maxSize) { \
- *str++ = maxMask | ((strSize>>(chrsz*8))&maxSize); \
- } \
- *str++ = strSize; \
-}
-
-status_t StringPool::writeStringBlock(const sp<AaptFile>& pool)
-{
- // Allow appending. Sorry this is a little wacky.
- if (pool->getSize() > 0) {
- sp<AaptFile> block = createStringBlock();
- if (block == NULL) {
- return UNKNOWN_ERROR;
- }
- ssize_t res = pool->writeData(block->getData(), block->getSize());
- return (res >= 0) ? (status_t)NO_ERROR : res;
- }
-
- // First we need to add all style span names to the string pool.
- // We do this now (instead of when the span is added) so that these
- // will appear at the end of the pool, not disrupting the order
- // our client placed their own strings in it.
-
- const size_t STYLES = mEntryStyleArray.size();
- size_t i;
-
- for (i=0; i<STYLES; i++) {
- entry_style& style = mEntryStyleArray.editItemAt(i);
- const size_t N = style.spans.size();
- for (size_t i=0; i<N; i++) {
- entry_style_span& span = style.spans.editItemAt(i);
- ssize_t idx = add(span.name, true);
- if (idx < 0) {
- fprintf(stderr, "Error adding span for style tag '%s'\n",
- String8(span.name).string());
- return idx;
- }
- span.span.name.index = (uint32_t)idx;
- }
- }
-
- const size_t ENTRIES = mEntryArray.size();
-
- // Now build the pool of unique strings.
-
- const size_t STRINGS = mEntries.size();
- const size_t preSize = sizeof(ResStringPool_header)
- + (sizeof(uint32_t)*ENTRIES)
- + (sizeof(uint32_t)*STYLES);
- if (pool->editData(preSize) == NULL) {
- fprintf(stderr, "ERROR: Out of memory for string pool\n");
- return NO_MEMORY;
- }
-
- const size_t charSize = mUTF8 ? sizeof(uint8_t) : sizeof(char16_t);
-
- size_t strPos = 0;
- for (i=0; i<STRINGS; i++) {
- entry& ent = mEntries.editItemAt(i);
- const size_t strSize = (ent.value.size());
- const size_t lenSize = strSize > (size_t)(1<<((charSize*8)-1))-1 ?
- charSize*2 : charSize;
-
- String8 encStr;
- if (mUTF8) {
- encStr = String8(ent.value);
- }
-
- const size_t encSize = mUTF8 ? encStr.size() : 0;
- const size_t encLenSize = mUTF8 ?
- (encSize > (size_t)(1<<((charSize*8)-1))-1 ?
- charSize*2 : charSize) : 0;
-
- ent.offset = strPos;
-
- const size_t totalSize = lenSize + encLenSize +
- ((mUTF8 ? encSize : strSize)+1)*charSize;
-
- void* dat = (void*)pool->editData(preSize + strPos + totalSize);
- if (dat == NULL) {
- fprintf(stderr, "ERROR: Out of memory for string pool\n");
- return NO_MEMORY;
- }
- dat = (uint8_t*)dat + preSize + strPos;
- if (mUTF8) {
- uint8_t* strings = (uint8_t*)dat;
-
- ENCODE_LENGTH(strings, sizeof(uint8_t), strSize)
-
- ENCODE_LENGTH(strings, sizeof(uint8_t), encSize)
-
- strncpy((char*)strings, encStr, encSize+1);
- } else {
- uint16_t* strings = (uint16_t*)dat;
-
- ENCODE_LENGTH(strings, sizeof(uint16_t), strSize)
-
- strcpy16_htod(strings, ent.value);
- }
-
- strPos += totalSize;
- }
-
- // Pad ending string position up to a uint32_t boundary.
-
- if (strPos&0x3) {
- size_t padPos = ((strPos+3)&~0x3);
- uint8_t* dat = (uint8_t*)pool->editData(preSize + padPos);
- if (dat == NULL) {
- fprintf(stderr, "ERROR: Out of memory padding string pool\n");
- return NO_MEMORY;
- }
- memset(dat+preSize+strPos, 0, padPos-strPos);
- strPos = padPos;
- }
-
- // Build the pool of style spans.
-
- size_t styPos = strPos;
- for (i=0; i<STYLES; i++) {
- entry_style& ent = mEntryStyleArray.editItemAt(i);
- const size_t N = ent.spans.size();
- const size_t totalSize = (N*sizeof(ResStringPool_span))
- + sizeof(ResStringPool_ref);
-
- ent.offset = styPos-strPos;
- uint8_t* dat = (uint8_t*)pool->editData(preSize + styPos + totalSize);
- if (dat == NULL) {
- fprintf(stderr, "ERROR: Out of memory for string styles\n");
- return NO_MEMORY;
- }
- ResStringPool_span* span = (ResStringPool_span*)(dat+preSize+styPos);
- for (size_t i=0; i<N; i++) {
- span->name.index = htodl(ent.spans[i].span.name.index);
- span->firstChar = htodl(ent.spans[i].span.firstChar);
- span->lastChar = htodl(ent.spans[i].span.lastChar);
- span++;
- }
- span->name.index = htodl(ResStringPool_span::END);
-
- styPos += totalSize;
- }
-
- if (STYLES > 0) {
- // Add full terminator at the end (when reading we validate that
- // the end of the pool is fully terminated to simplify error
- // checking).
- size_t extra = sizeof(ResStringPool_span)-sizeof(ResStringPool_ref);
- uint8_t* dat = (uint8_t*)pool->editData(preSize + styPos + extra);
- if (dat == NULL) {
- fprintf(stderr, "ERROR: Out of memory for string styles\n");
- return NO_MEMORY;
- }
- uint32_t* p = (uint32_t*)(dat+preSize+styPos);
- while (extra > 0) {
- *p++ = htodl(ResStringPool_span::END);
- extra -= sizeof(uint32_t);
- }
- styPos += extra;
- }
-
- // Write header.
-
- ResStringPool_header* header =
- (ResStringPool_header*)pool->padData(sizeof(uint32_t));
- if (header == NULL) {
- fprintf(stderr, "ERROR: Out of memory for string pool\n");
- return NO_MEMORY;
- }
- memset(header, 0, sizeof(*header));
- header->header.type = htods(RES_STRING_POOL_TYPE);
- header->header.headerSize = htods(sizeof(*header));
- header->header.size = htodl(pool->getSize());
- header->stringCount = htodl(ENTRIES);
- header->styleCount = htodl(STYLES);
- if (mUTF8) {
- header->flags |= htodl(ResStringPool_header::UTF8_FLAG);
- }
- header->stringsStart = htodl(preSize);
- header->stylesStart = htodl(STYLES > 0 ? (preSize+strPos) : 0);
-
- // Write string index array.
-
- uint32_t* index = (uint32_t*)(header+1);
- for (i=0; i<ENTRIES; i++) {
- entry& ent = mEntries.editItemAt(mEntryArray[i]);
- *index++ = htodl(ent.offset);
- NOISY(printf("Writing entry #%d: \"%s\" ent=%d off=%d\n", i,
- String8(ent.value).string(),
- mEntryArray[i], ent.offset));
- }
-
- // Write style index array.
-
- for (i=0; i<STYLES; i++) {
- *index++ = htodl(mEntryStyleArray[i].offset);
- }
-
- return NO_ERROR;
-}
-
-ssize_t StringPool::offsetForString(const String16& val) const
-{
- const Vector<size_t>* indices = offsetsForString(val);
- ssize_t res = indices != NULL && indices->size() > 0 ? indices->itemAt(0) : -1;
- NOISY(printf("Offset for string %s: %d (%s)\n", String8(val).string(), res,
- res >= 0 ? String8(mEntries[mEntryArray[res]].value).string() : String8()));
- return res;
-}
-
-const Vector<size_t>* StringPool::offsetsForString(const String16& val) const
-{
- ssize_t pos = mValues.valueFor(val);
- if (pos < 0) {
- return NULL;
- }
- return &mEntries[mEntryArray[pos]].indices;
-}
diff --git a/tools/aapt/StringPool.h b/tools/aapt/StringPool.h
deleted file mode 100644
index 1b3abfd..0000000
--- a/tools/aapt/StringPool.h
+++ /dev/null
@@ -1,183 +0,0 @@
-//
-// Copyright 2006 The Android Open Source Project
-//
-// Build resource files from raw assets.
-//
-
-#ifndef STRING_POOL_H
-#define STRING_POOL_H
-
-#include "Main.h"
-#include "AaptAssets.h"
-
-#include <androidfw/ResourceTypes.h>
-#include <utils/String16.h>
-#include <utils/TypeHelpers.h>
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <ctype.h>
-#include <errno.h>
-
-#include <libexpat/expat.h>
-
-using namespace android;
-
-#define PRINT_STRING_METRICS 0
-
-void strcpy16_htod(uint16_t* dst, const uint16_t* src);
-
-void printStringPool(const ResStringPool* pool);
-
-/**
- * The StringPool class is used as an intermediate representation for
- * generating the string pool resource data structure that can be parsed with
- * ResStringPool in include/utils/ResourceTypes.h.
- */
-class StringPool
-{
-public:
- struct entry {
- entry() : offset(0) { }
- entry(const String16& _value) : value(_value), offset(0), hasStyles(false) { }
- entry(const entry& o) : value(o.value), offset(o.offset),
- hasStyles(o.hasStyles), indices(o.indices),
- configTypeName(o.configTypeName), configs(o.configs) { }
-
- String16 value;
- size_t offset;
- bool hasStyles;
- Vector<size_t> indices;
- String8 configTypeName;
- Vector<ResTable_config> configs;
-
- String8 makeConfigsString() const;
-
- int compare(const entry& o) const;
-
- inline bool operator<(const entry& o) const { return compare(o) < 0; }
- inline bool operator<=(const entry& o) const { return compare(o) <= 0; }
- inline bool operator==(const entry& o) const { return compare(o) == 0; }
- inline bool operator!=(const entry& o) const { return compare(o) != 0; }
- inline bool operator>=(const entry& o) const { return compare(o) >= 0; }
- inline bool operator>(const entry& o) const { return compare(o) > 0; }
- };
-
- struct entry_style_span {
- String16 name;
- ResStringPool_span span;
- };
-
- struct entry_style {
- entry_style() : offset(0) { }
-
- entry_style(const entry_style& o) : offset(o.offset), spans(o.spans) { }
-
- size_t offset;
- Vector<entry_style_span> spans;
- };
-
- /**
- * If 'utf8' is true, strings will be encoded with UTF-8 instead of
- * left in Java's native UTF-16.
- */
- explicit StringPool(bool utf8 = false);
-
- /**
- * Add a new string to the pool. If mergeDuplicates is true, thenif
- * the string already exists the existing entry for it will be used;
- * otherwise, or if the value doesn't already exist, a new entry is
- * created.
- *
- * Returns the index in the entry array of the new string entry.
- */
- ssize_t add(const String16& value, bool mergeDuplicates = false,
- const String8* configTypeName = NULL, const ResTable_config* config = NULL);
-
- ssize_t add(const String16& value, const Vector<entry_style_span>& spans,
- const String8* configTypeName = NULL, const ResTable_config* config = NULL);
-
- status_t addStyleSpan(size_t idx, const String16& name,
- uint32_t start, uint32_t end);
- status_t addStyleSpans(size_t idx, const Vector<entry_style_span>& spans);
- status_t addStyleSpan(size_t idx, const entry_style_span& span);
-
- // Sort the contents of the string block by the configuration associated
- // with each item. After doing this you can use mapOriginalPosToNewPos()
- // to find out the new position given the position originally returned by
- // add().
- void sortByConfig();
-
- // For use after sortByConfig() to map from the original position of
- // a string to its new sorted position.
- size_t mapOriginalPosToNewPos(size_t originalPos) const {
- return mOriginalPosToNewPos.itemAt(originalPos);
- }
-
- sp<AaptFile> createStringBlock();
-
- status_t writeStringBlock(const sp<AaptFile>& pool);
-
- /**
- * Find out an offset in the pool for a particular string. If the string
- * pool is sorted, this can not be called until after createStringBlock()
- * or writeStringBlock() has been called
- * (which determines the offsets). In the case of a string that appears
- * multiple times in the pool, the first offset will be returned. Returns
- * -1 if the string does not exist.
- */
- ssize_t offsetForString(const String16& val) const;
-
- /**
- * Find all of the offsets in the pool for a particular string. If the
- * string pool is sorted, this can not be called until after
- * createStringBlock() or writeStringBlock() has been called
- * (which determines the offsets). Returns NULL if the string does not exist.
- */
- const Vector<size_t>* offsetsForString(const String16& val) const;
-
-private:
- static int config_sort(void* state, const void* lhs, const void* rhs);
-
- const bool mUTF8;
-
- // The following data structures represent the actual structures
- // that will be generated for the final string pool.
-
- // Raw array of unique strings, in some arbitrary order. This is the
- // actual strings that appear in the final string pool, in the order
- // that they will be written.
- Vector<entry> mEntries;
- // Array of indices into mEntries, in the order they were
- // added to the pool. This can be different than mEntries
- // if the same string was added multiple times (it will appear
- // once in mEntries, with multiple occurrences in this array).
- // This is the lookup array that will be written for finding
- // the string for each offset/position in the string pool.
- Vector<size_t> mEntryArray;
- // Optional style span information associated with each index of
- // mEntryArray.
- Vector<entry_style> mEntryStyleArray;
-
- // The following data structures are used for book-keeping as the
- // string pool is constructed.
-
- // Unique set of all the strings added to the pool, mapped to
- // the first index of mEntryArray where the value was added.
- DefaultKeyedVector<String16, ssize_t> mValues;
- // This array maps from the original position a string was placed at
- // in mEntryArray to its new position after being sorted with sortByConfig().
- Vector<size_t> mOriginalPosToNewPos;
-};
-
-// The entry types are trivially movable because all fields they contain, including
-// the vectors and strings, are trivially movable.
-namespace android {
- ANDROID_TRIVIAL_MOVE_TRAIT(StringPool::entry);
- ANDROID_TRIVIAL_MOVE_TRAIT(StringPool::entry_style_span);
- ANDROID_TRIVIAL_MOVE_TRAIT(StringPool::entry_style);
-};
-
-#endif
-
diff --git a/tools/aapt/WorkQueue.cpp b/tools/aapt/WorkQueue.cpp
deleted file mode 100644
index 24a962f..0000000
--- a/tools/aapt/WorkQueue.cpp
+++ /dev/null
@@ -1,171 +0,0 @@
-/*
- * Copyright (C) 2012 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.
- */
-
-// #define LOG_NDEBUG 0
-#define LOG_TAG "WorkQueue"
-
-#include <utils/Log.h>
-#include "WorkQueue.h"
-
-namespace android {
-
-// --- WorkQueue ---
-
-WorkQueue::WorkQueue(size_t maxThreads, bool canCallJava) :
- mMaxThreads(maxThreads), mCanCallJava(canCallJava),
- mCanceled(false), mFinished(false), mIdleThreads(0) {
-}
-
-WorkQueue::~WorkQueue() {
- if (!cancel()) {
- finish();
- }
-}
-
-status_t WorkQueue::schedule(WorkUnit* workUnit, size_t backlog) {
- AutoMutex _l(mLock);
-
- if (mFinished || mCanceled) {
- return INVALID_OPERATION;
- }
-
- if (mWorkThreads.size() < mMaxThreads
- && mIdleThreads < mWorkUnits.size() + 1) {
- sp<WorkThread> workThread = new WorkThread(this, mCanCallJava);
- status_t status = workThread->run("WorkQueue::WorkThread");
- if (status) {
- return status;
- }
- mWorkThreads.add(workThread);
- mIdleThreads += 1;
- } else if (backlog) {
- while (mWorkUnits.size() >= mMaxThreads * backlog) {
- mWorkDequeuedCondition.wait(mLock);
- if (mFinished || mCanceled) {
- return INVALID_OPERATION;
- }
- }
- }
-
- mWorkUnits.add(workUnit);
- mWorkChangedCondition.broadcast();
- return OK;
-}
-
-status_t WorkQueue::cancel() {
- AutoMutex _l(mLock);
-
- return cancelLocked();
-}
-
-status_t WorkQueue::cancelLocked() {
- if (mFinished) {
- return INVALID_OPERATION;
- }
-
- if (!mCanceled) {
- mCanceled = true;
-
- size_t count = mWorkUnits.size();
- for (size_t i = 0; i < count; i++) {
- delete mWorkUnits.itemAt(i);
- }
- mWorkUnits.clear();
- mWorkChangedCondition.broadcast();
- mWorkDequeuedCondition.broadcast();
- }
- return OK;
-}
-
-status_t WorkQueue::finish() {
- { // acquire lock
- AutoMutex _l(mLock);
-
- if (mFinished) {
- return INVALID_OPERATION;
- }
-
- mFinished = true;
- mWorkChangedCondition.broadcast();
- } // release lock
-
- // It is not possible for the list of work threads to change once the mFinished
- // flag has been set, so we can access mWorkThreads outside of the lock here.
- size_t count = mWorkThreads.size();
- for (size_t i = 0; i < count; i++) {
- mWorkThreads.itemAt(i)->join();
- }
- mWorkThreads.clear();
- return OK;
-}
-
-bool WorkQueue::threadLoop() {
- WorkUnit* workUnit;
- { // acquire lock
- AutoMutex _l(mLock);
-
- for (;;) {
- if (mCanceled) {
- return false;
- }
-
- if (!mWorkUnits.isEmpty()) {
- workUnit = mWorkUnits.itemAt(0);
- mWorkUnits.removeAt(0);
- mIdleThreads -= 1;
- mWorkDequeuedCondition.broadcast();
- break;
- }
-
- if (mFinished) {
- return false;
- }
-
- mWorkChangedCondition.wait(mLock);
- }
- } // release lock
-
- bool shouldContinue = workUnit->run();
- delete workUnit;
-
- { // acquire lock
- AutoMutex _l(mLock);
-
- mIdleThreads += 1;
-
- if (!shouldContinue) {
- cancelLocked();
- return false;
- }
- } // release lock
-
- return true;
-}
-
-// --- WorkQueue::WorkThread ---
-
-WorkQueue::WorkThread::WorkThread(WorkQueue* workQueue, bool canCallJava) :
- Thread(canCallJava), mWorkQueue(workQueue) {
-}
-
-WorkQueue::WorkThread::~WorkThread() {
-}
-
-bool WorkQueue::WorkThread::threadLoop() {
- return mWorkQueue->threadLoop();
-}
-
-}; // namespace android
diff --git a/tools/aapt/WorkQueue.h b/tools/aapt/WorkQueue.h
deleted file mode 100644
index d38f05d..0000000
--- a/tools/aapt/WorkQueue.h
+++ /dev/null
@@ -1,119 +0,0 @@
-/*]
- * Copyright (C) 2012 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.
- */
-
-#ifndef AAPT_WORK_QUEUE_H
-#define AAPT_WORK_QUEUE_H
-
-#include <utils/Errors.h>
-#include <utils/Vector.h>
-#include <utils/threads.h>
-
-namespace android {
-
-/*
- * A threaded work queue.
- *
- * This class is designed to make it easy to run a bunch of isolated work
- * units in parallel, using up to the specified number of threads.
- * To use it, write a loop to post work units to the work queue, then synchronize
- * on the queue at the end.
- */
-class WorkQueue {
-public:
- class WorkUnit {
- public:
- WorkUnit() { }
- virtual ~WorkUnit() { }
-
- /*
- * Runs the work unit.
- * If the result is 'true' then the work queue continues scheduling work as usual.
- * If the result is 'false' then the work queue is canceled.
- */
- virtual bool run() = 0;
- };
-
- /* Creates a work queue with the specified maximum number of work threads. */
- WorkQueue(size_t maxThreads, bool canCallJava = true);
-
- /* Destroys the work queue.
- * Cancels pending work and waits for all remaining threads to complete.
- */
- ~WorkQueue();
-
- /* Posts a work unit to run later.
- * If the work queue has been canceled or is already finished, returns INVALID_OPERATION
- * and does not take ownership of the work unit (caller must destroy it itself).
- * Otherwise, returns OK and takes ownership of the work unit (the work queue will
- * destroy it automatically).
- *
- * For flow control, this method blocks when the size of the pending work queue is more
- * 'backlog' times the number of threads. This condition reduces the rate of entry into
- * the pending work queue and prevents it from growing much more rapidly than the
- * work threads can actually handle.
- *
- * If 'backlog' is 0, then no throttle is applied.
- */
- status_t schedule(WorkUnit* workUnit, size_t backlog = 2);
-
- /* Cancels all pending work.
- * If the work queue is already finished, returns INVALID_OPERATION.
- * If the work queue is already canceled, returns OK and does nothing else.
- * Otherwise, returns OK, discards all pending work units and prevents additional
- * work units from being scheduled.
- *
- * Call finish() after cancel() to wait for all remaining work to complete.
- */
- status_t cancel();
-
- /* Waits for all work to complete.
- * If the work queue is already finished, returns INVALID_OPERATION.
- * Otherwise, waits for all work to complete and returns OK.
- */
- status_t finish();
-
-private:
- class WorkThread : public Thread {
- public:
- WorkThread(WorkQueue* workQueue, bool canCallJava);
- virtual ~WorkThread();
-
- private:
- virtual bool threadLoop();
-
- WorkQueue* const mWorkQueue;
- };
-
- status_t cancelLocked();
- bool threadLoop(); // called from each work thread
-
- const size_t mMaxThreads;
- const bool mCanCallJava;
-
- Mutex mLock;
- Condition mWorkChangedCondition;
- Condition mWorkDequeuedCondition;
-
- bool mCanceled;
- bool mFinished;
- size_t mIdleThreads;
- Vector<sp<WorkThread> > mWorkThreads;
- Vector<WorkUnit*> mWorkUnits;
-};
-
-}; // namespace android
-
-#endif // AAPT_WORK_QUEUE_H
diff --git a/tools/aapt/XMLNode.cpp b/tools/aapt/XMLNode.cpp
deleted file mode 100644
index a663ad5..0000000
--- a/tools/aapt/XMLNode.cpp
+++ /dev/null
@@ -1,1510 +0,0 @@
-//
-// Copyright 2006 The Android Open Source Project
-//
-// Build resource files from raw assets.
-//
-
-#include "XMLNode.h"
-#include "ResourceTable.h"
-#include "pseudolocalize.h"
-
-#include <utils/ByteOrder.h>
-#include <errno.h>
-#include <string.h>
-
-#ifndef HAVE_MS_C_RUNTIME
-#define O_BINARY 0
-#endif
-
-#define NOISY(x) //x
-#define NOISY_PARSE(x) //x
-
-const char* const RESOURCES_ROOT_NAMESPACE = "http://schemas.android.com/apk/res/";
-const char* const RESOURCES_ANDROID_NAMESPACE = "http://schemas.android.com/apk/res/android";
-const char* const RESOURCES_AUTO_PACKAGE_NAMESPACE = "http://schemas.android.com/apk/res-auto";
-const char* const RESOURCES_ROOT_PRV_NAMESPACE = "http://schemas.android.com/apk/prv/res/";
-
-const char* const XLIFF_XMLNS = "urn:oasis:names:tc:xliff:document:1.2";
-const char* const ALLOWED_XLIFF_ELEMENTS[] = {
- "bpt",
- "ept",
- "it",
- "ph",
- "g",
- "bx",
- "ex",
- "x"
- };
-
-bool isWhitespace(const char16_t* str)
-{
- while (*str != 0 && *str < 128 && isspace(*str)) {
- str++;
- }
- return *str == 0;
-}
-
-static const String16 RESOURCES_PREFIX(RESOURCES_ROOT_NAMESPACE);
-static const String16 RESOURCES_PREFIX_AUTO_PACKAGE(RESOURCES_AUTO_PACKAGE_NAMESPACE);
-static const String16 RESOURCES_PRV_PREFIX(RESOURCES_ROOT_PRV_NAMESPACE);
-static const String16 RESOURCES_TOOLS_NAMESPACE("http://schemas.android.com/tools");
-
-String16 getNamespaceResourcePackage(String16 appPackage, String16 namespaceUri, bool* outIsPublic)
-{
- //printf("%s starts with %s?\n", String8(namespaceUri).string(),
- // String8(RESOURCES_PREFIX).string());
- size_t prefixSize;
- bool isPublic = true;
- if(namespaceUri.startsWith(RESOURCES_PREFIX_AUTO_PACKAGE)) {
- NOISY(printf("Using default application package: %s -> %s\n", String8(namespaceUri).string(), String8(appPackage).string()));
- isPublic = true;
- return appPackage;
- } else if (namespaceUri.startsWith(RESOURCES_PREFIX)) {
- prefixSize = RESOURCES_PREFIX.size();
- } else if (namespaceUri.startsWith(RESOURCES_PRV_PREFIX)) {
- isPublic = false;
- prefixSize = RESOURCES_PRV_PREFIX.size();
- } else {
- if (outIsPublic) *outIsPublic = isPublic; // = true
- return String16();
- }
-
- //printf("YES!\n");
- //printf("namespace: %s\n", String8(String16(namespaceUri, namespaceUri.size()-prefixSize, prefixSize)).string());
- if (outIsPublic) *outIsPublic = isPublic;
- return String16(namespaceUri, namespaceUri.size()-prefixSize, prefixSize);
-}
-
-status_t hasSubstitutionErrors(const char* fileName,
- ResXMLTree* inXml,
- String16 str16)
-{
- const char16_t* str = str16.string();
- const char16_t* p = str;
- const char16_t* end = str + str16.size();
-
- bool nonpositional = false;
- int argCount = 0;
-
- while (p < end) {
- /*
- * Look for the start of a Java-style substitution sequence.
- */
- if (*p == '%' && p + 1 < end) {
- p++;
-
- // A literal percent sign represented by %%
- if (*p == '%') {
- p++;
- continue;
- }
-
- argCount++;
-
- if (*p >= '0' && *p <= '9') {
- do {
- p++;
- } while (*p >= '0' && *p <= '9');
- if (*p != '$') {
- // This must be a size specification instead of position.
- nonpositional = true;
- }
- } else if (*p == '<') {
- // Reusing last argument; bad idea since it can be re-arranged.
- nonpositional = true;
- p++;
-
- // Optionally '$' can be specified at the end.
- if (p < end && *p == '$') {
- p++;
- }
- } else {
- nonpositional = true;
- }
-
- // Ignore flags and widths
- while (p < end && (*p == '-' ||
- *p == '#' ||
- *p == '+' ||
- *p == ' ' ||
- *p == ',' ||
- *p == '(' ||
- (*p >= '0' && *p <= '9'))) {
- p++;
- }
-
- /*
- * This is a shortcut to detect strings that are going to Time.format()
- * instead of String.format()
- *
- * Comparison of String.format() and Time.format() args:
- *
- * String: ABC E GH ST X abcdefgh nost x
- * Time: DEFGHKMS W Za d hkm s w yz
- *
- * Therefore we know it's definitely Time if we have:
- * DFKMWZkmwyz
- */
- if (p < end) {
- switch (*p) {
- case 'D':
- case 'F':
- case 'K':
- case 'M':
- case 'W':
- case 'Z':
- case 'k':
- case 'm':
- case 'w':
- case 'y':
- case 'z':
- return NO_ERROR;
- }
- }
- }
-
- p++;
- }
-
- /*
- * If we have more than one substitution in this string and any of them
- * are not in positional form, give the user an error.
- */
- if (argCount > 1 && nonpositional) {
- SourcePos(String8(fileName), inXml->getLineNumber()).error(
- "Multiple substitutions specified in non-positional format; "
- "did you mean to add the formatted=\"false\" attribute?\n");
- return NOT_ENOUGH_DATA;
- }
-
- return NO_ERROR;
-}
-
-status_t parseStyledString(Bundle* bundle,
- const char* fileName,
- ResXMLTree* inXml,
- const String16& endTag,
- String16* outString,
- Vector<StringPool::entry_style_span>* outSpans,
- bool isFormatted,
- bool pseudolocalize)
-{
- Vector<StringPool::entry_style_span> spanStack;
- String16 curString;
- String16 rawString;
- const char* errorMsg;
- int xliffDepth = 0;
- bool firstTime = true;
-
- size_t len;
- ResXMLTree::event_code_t code;
- while ((code=inXml->next()) != ResXMLTree::END_DOCUMENT && code != ResXMLTree::BAD_DOCUMENT) {
-
- if (code == ResXMLTree::TEXT) {
- String16 text(inXml->getText(&len));
- if (firstTime && text.size() > 0) {
- firstTime = false;
- if (text.string()[0] == '@') {
- // If this is a resource reference, don't do the pseudoloc.
- pseudolocalize = false;
- }
- }
- if (xliffDepth == 0 && pseudolocalize) {
- std::string orig(String8(text).string());
- std::string pseudo = pseudolocalize_string(orig);
- curString.append(String16(String8(pseudo.c_str())));
- } else {
- if (isFormatted && hasSubstitutionErrors(fileName, inXml, text) != NO_ERROR) {
- return UNKNOWN_ERROR;
- } else {
- curString.append(text);
- }
- }
- } else if (code == ResXMLTree::START_TAG) {
- const String16 element16(inXml->getElementName(&len));
- const String8 element8(element16);
-
- size_t nslen;
- const uint16_t* ns = inXml->getElementNamespace(&nslen);
- if (ns == NULL) {
- ns = (const uint16_t*)"\0\0";
- nslen = 0;
- }
- const String8 nspace(String16(ns, nslen));
- if (nspace == XLIFF_XMLNS) {
- const int N = sizeof(ALLOWED_XLIFF_ELEMENTS)/sizeof(ALLOWED_XLIFF_ELEMENTS[0]);
- for (int i=0; i<N; i++) {
- if (element8 == ALLOWED_XLIFF_ELEMENTS[i]) {
- xliffDepth++;
- // in this case, treat it like it was just text, in other words, do nothing
- // here and silently drop this element
- goto moveon;
- }
- }
- {
- SourcePos(String8(fileName), inXml->getLineNumber()).error(
- "Found unsupported XLIFF tag <%s>\n",
- element8.string());
- return UNKNOWN_ERROR;
- }
-moveon:
- continue;
- }
-
- if (outSpans == NULL) {
- SourcePos(String8(fileName), inXml->getLineNumber()).error(
- "Found style tag <%s> where styles are not allowed\n", element8.string());
- return UNKNOWN_ERROR;
- }
-
- if (!ResTable::collectString(outString, curString.string(),
- curString.size(), false, &errorMsg, true)) {
- SourcePos(String8(fileName), inXml->getLineNumber()).error("%s (in %s)\n",
- errorMsg, String8(curString).string());
- return UNKNOWN_ERROR;
- }
- rawString.append(curString);
- curString = String16();
-
- StringPool::entry_style_span span;
- span.name = element16;
- for (size_t ai=0; ai<inXml->getAttributeCount(); ai++) {
- span.name.append(String16(";"));
- const char16_t* str = inXml->getAttributeName(ai, &len);
- span.name.append(str, len);
- span.name.append(String16("="));
- str = inXml->getAttributeStringValue(ai, &len);
- span.name.append(str, len);
- }
- //printf("Span: %s\n", String8(span.name).string());
- span.span.firstChar = span.span.lastChar = outString->size();
- spanStack.push(span);
-
- } else if (code == ResXMLTree::END_TAG) {
- size_t nslen;
- const uint16_t* ns = inXml->getElementNamespace(&nslen);
- if (ns == NULL) {
- ns = (const uint16_t*)"\0\0";
- nslen = 0;
- }
- const String8 nspace(String16(ns, nslen));
- if (nspace == XLIFF_XMLNS) {
- xliffDepth--;
- continue;
- }
- if (!ResTable::collectString(outString, curString.string(),
- curString.size(), false, &errorMsg, true)) {
- SourcePos(String8(fileName), inXml->getLineNumber()).error("%s (in %s)\n",
- errorMsg, String8(curString).string());
- return UNKNOWN_ERROR;
- }
- rawString.append(curString);
- curString = String16();
-
- if (spanStack.size() == 0) {
- if (strcmp16(inXml->getElementName(&len), endTag.string()) != 0) {
- SourcePos(String8(fileName), inXml->getLineNumber()).error(
- "Found tag %s where <%s> close is expected\n",
- String8(inXml->getElementName(&len)).string(),
- String8(endTag).string());
- return UNKNOWN_ERROR;
- }
- break;
- }
- StringPool::entry_style_span span = spanStack.top();
- String16 spanTag;
- ssize_t semi = span.name.findFirst(';');
- if (semi >= 0) {
- spanTag.setTo(span.name.string(), semi);
- } else {
- spanTag.setTo(span.name);
- }
- if (strcmp16(inXml->getElementName(&len), spanTag.string()) != 0) {
- SourcePos(String8(fileName), inXml->getLineNumber()).error(
- "Found close tag %s where close tag %s is expected\n",
- String8(inXml->getElementName(&len)).string(),
- String8(spanTag).string());
- return UNKNOWN_ERROR;
- }
- bool empty = true;
- if (outString->size() > 0) {
- span.span.lastChar = outString->size()-1;
- if (span.span.lastChar >= span.span.firstChar) {
- empty = false;
- outSpans->add(span);
- }
- }
- spanStack.pop();
-
- /*
- * This warning seems to be just an irritation to most people,
- * since it is typically introduced by translators who then never
- * see the warning.
- */
- if (0 && empty) {
- fprintf(stderr, "%s:%d: warning: empty '%s' span found in text '%s'\n",
- fileName, inXml->getLineNumber(),
- String8(spanTag).string(), String8(*outString).string());
-
- }
- } else if (code == ResXMLTree::START_NAMESPACE) {
- // nothing
- }
- }
-
- if (code == ResXMLTree::BAD_DOCUMENT) {
- SourcePos(String8(fileName), inXml->getLineNumber()).error(
- "Error parsing XML\n");
- }
-
- if (outSpans != NULL && outSpans->size() > 0) {
- if (curString.size() > 0) {
- if (!ResTable::collectString(outString, curString.string(),
- curString.size(), false, &errorMsg, true)) {
- SourcePos(String8(fileName), inXml->getLineNumber()).error(
- "%s (in %s)\n",
- errorMsg, String8(curString).string());
- return UNKNOWN_ERROR;
- }
- }
- } else {
- // There is no style information, so string processing will happen
- // later as part of the overall type conversion. Return to the
- // client the raw unprocessed text.
- rawString.append(curString);
- outString->setTo(rawString);
- }
-
- return NO_ERROR;
-}
-
-struct namespace_entry {
- String8 prefix;
- String8 uri;
-};
-
-static String8 make_prefix(int depth)
-{
- String8 prefix;
- int i;
- for (i=0; i<depth; i++) {
- prefix.append(" ");
- }
- return prefix;
-}
-
-static String8 build_namespace(const Vector<namespace_entry>& namespaces,
- const uint16_t* ns)
-{
- String8 str;
- if (ns != NULL) {
- str = String8(ns);
- const size_t N = namespaces.size();
- for (size_t i=0; i<N; i++) {
- const namespace_entry& ne = namespaces.itemAt(i);
- if (ne.uri == str) {
- str = ne.prefix;
- break;
- }
- }
- str.append(":");
- }
- return str;
-}
-
-void printXMLBlock(ResXMLTree* block)
-{
- block->restart();
-
- Vector<namespace_entry> namespaces;
-
- ResXMLTree::event_code_t code;
- int depth = 0;
- while ((code=block->next()) != ResXMLTree::END_DOCUMENT && code != ResXMLTree::BAD_DOCUMENT) {
- String8 prefix = make_prefix(depth);
- int i;
- if (code == ResXMLTree::START_TAG) {
- size_t len;
- const uint16_t* ns16 = block->getElementNamespace(&len);
- String8 elemNs = build_namespace(namespaces, ns16);
- const uint16_t* com16 = block->getComment(&len);
- if (com16) {
- printf("%s <!-- %s -->\n", prefix.string(), String8(com16).string());
- }
- printf("%sE: %s%s (line=%d)\n", prefix.string(), elemNs.string(),
- String8(block->getElementName(&len)).string(),
- block->getLineNumber());
- int N = block->getAttributeCount();
- depth++;
- prefix = make_prefix(depth);
- for (i=0; i<N; i++) {
- uint32_t res = block->getAttributeNameResID(i);
- ns16 = block->getAttributeNamespace(i, &len);
- String8 ns = build_namespace(namespaces, ns16);
- String8 name(block->getAttributeName(i, &len));
- printf("%sA: ", prefix.string());
- if (res) {
- printf("%s%s(0x%08x)", ns.string(), name.string(), res);
- } else {
- printf("%s%s", ns.string(), name.string());
- }
- Res_value value;
- block->getAttributeValue(i, &value);
- if (value.dataType == Res_value::TYPE_NULL) {
- printf("=(null)");
- } else if (value.dataType == Res_value::TYPE_REFERENCE) {
- printf("=@0x%x", (int)value.data);
- } else if (value.dataType == Res_value::TYPE_ATTRIBUTE) {
- printf("=?0x%x", (int)value.data);
- } else if (value.dataType == Res_value::TYPE_STRING) {
- printf("=\"%s\"",
- ResTable::normalizeForOutput(String8(block->getAttributeStringValue(i,
- &len)).string()).string());
- } else {
- printf("=(type 0x%x)0x%x", (int)value.dataType, (int)value.data);
- }
- const char16_t* val = block->getAttributeStringValue(i, &len);
- if (val != NULL) {
- printf(" (Raw: \"%s\")", ResTable::normalizeForOutput(String8(val).string()).
- string());
- }
- printf("\n");
- }
- } else if (code == ResXMLTree::END_TAG) {
- depth--;
- } else if (code == ResXMLTree::START_NAMESPACE) {
- namespace_entry ns;
- size_t len;
- const uint16_t* prefix16 = block->getNamespacePrefix(&len);
- if (prefix16) {
- ns.prefix = String8(prefix16);
- } else {
- ns.prefix = "<DEF>";
- }
- ns.uri = String8(block->getNamespaceUri(&len));
- namespaces.push(ns);
- printf("%sN: %s=%s\n", prefix.string(), ns.prefix.string(),
- ns.uri.string());
- depth++;
- } else if (code == ResXMLTree::END_NAMESPACE) {
- depth--;
- const namespace_entry& ns = namespaces.top();
- size_t len;
- const uint16_t* prefix16 = block->getNamespacePrefix(&len);
- String8 pr;
- if (prefix16) {
- pr = String8(prefix16);
- } else {
- pr = "<DEF>";
- }
- if (ns.prefix != pr) {
- prefix = make_prefix(depth);
- printf("%s*** BAD END NS PREFIX: found=%s, expected=%s\n",
- prefix.string(), pr.string(), ns.prefix.string());
- }
- String8 uri = String8(block->getNamespaceUri(&len));
- if (ns.uri != uri) {
- prefix = make_prefix(depth);
- printf("%s *** BAD END NS URI: found=%s, expected=%s\n",
- prefix.string(), uri.string(), ns.uri.string());
- }
- namespaces.pop();
- } else if (code == ResXMLTree::TEXT) {
- size_t len;
- printf("%sC: \"%s\"\n", prefix.string(),
- ResTable::normalizeForOutput(String8(block->getText(&len)).string()).string());
- }
- }
-
- block->restart();
-}
-
-status_t parseXMLResource(const sp<AaptFile>& file, ResXMLTree* outTree,
- bool stripAll, bool keepComments,
- const char** cDataTags)
-{
- sp<XMLNode> root = XMLNode::parse(file);
- if (root == NULL) {
- return UNKNOWN_ERROR;
- }
- root->removeWhitespace(stripAll, cDataTags);
-
- NOISY(printf("Input XML from %s:\n", (const char*)file->getPrintableSource()));
- NOISY(root->print());
- sp<AaptFile> rsc = new AaptFile(String8(), AaptGroupEntry(), String8());
- status_t err = root->flatten(rsc, !keepComments, false);
- if (err != NO_ERROR) {
- return err;
- }
- err = outTree->setTo(rsc->getData(), rsc->getSize(), true);
- if (err != NO_ERROR) {
- return err;
- }
-
- NOISY(printf("Output XML:\n"));
- NOISY(printXMLBlock(outTree));
-
- return NO_ERROR;
-}
-
-sp<XMLNode> XMLNode::parse(const sp<AaptFile>& file)
-{
- char buf[16384];
- int fd = open(file->getSourceFile().string(), O_RDONLY | O_BINARY);
- if (fd < 0) {
- SourcePos(file->getSourceFile(), -1).error("Unable to open file for read: %s",
- strerror(errno));
- return NULL;
- }
-
- XML_Parser parser = XML_ParserCreateNS(NULL, 1);
- ParseState state;
- state.filename = file->getPrintableSource();
- state.parser = parser;
- XML_SetUserData(parser, &state);
- XML_SetElementHandler(parser, startElement, endElement);
- XML_SetNamespaceDeclHandler(parser, startNamespace, endNamespace);
- XML_SetCharacterDataHandler(parser, characterData);
- XML_SetCommentHandler(parser, commentData);
-
- ssize_t len;
- bool done;
- do {
- len = read(fd, buf, sizeof(buf));
- done = len < (ssize_t)sizeof(buf);
- if (len < 0) {
- SourcePos(file->getSourceFile(), -1).error("Error reading file: %s\n", strerror(errno));
- close(fd);
- return NULL;
- }
- if (XML_Parse(parser, buf, len, done) == XML_STATUS_ERROR) {
- SourcePos(file->getSourceFile(), (int)XML_GetCurrentLineNumber(parser)).error(
- "Error parsing XML: %s\n", XML_ErrorString(XML_GetErrorCode(parser)));
- close(fd);
- return NULL;
- }
- } while (!done);
-
- XML_ParserFree(parser);
- if (state.root == NULL) {
- SourcePos(file->getSourceFile(), -1).error("No XML data generated when parsing");
- }
- close(fd);
- return state.root;
-}
-
-XMLNode::XMLNode(const String8& filename, const String16& s1, const String16& s2, bool isNamespace)
- : mNextAttributeIndex(0x80000000)
- , mFilename(filename)
- , mStartLineNumber(0)
- , mEndLineNumber(0)
- , mUTF8(false)
-{
- if (isNamespace) {
- mNamespacePrefix = s1;
- mNamespaceUri = s2;
- } else {
- mNamespaceUri = s1;
- mElementName = s2;
- }
-}
-
-XMLNode::XMLNode(const String8& filename)
- : mFilename(filename)
-{
- memset(&mCharsValue, 0, sizeof(mCharsValue));
-}
-
-XMLNode::type XMLNode::getType() const
-{
- if (mElementName.size() != 0) {
- return TYPE_ELEMENT;
- }
- if (mNamespaceUri.size() != 0) {
- return TYPE_NAMESPACE;
- }
- return TYPE_CDATA;
-}
-
-const String16& XMLNode::getNamespacePrefix() const
-{
- return mNamespacePrefix;
-}
-
-const String16& XMLNode::getNamespaceUri() const
-{
- return mNamespaceUri;
-}
-
-const String16& XMLNode::getElementNamespace() const
-{
- return mNamespaceUri;
-}
-
-const String16& XMLNode::getElementName() const
-{
- return mElementName;
-}
-
-const Vector<sp<XMLNode> >& XMLNode::getChildren() const
-{
- return mChildren;
-}
-
-const String8& XMLNode::getFilename() const
-{
- return mFilename;
-}
-
-const Vector<XMLNode::attribute_entry>&
- XMLNode::getAttributes() const
-{
- return mAttributes;
-}
-
-const XMLNode::attribute_entry* XMLNode::getAttribute(const String16& ns,
- const String16& name) const
-{
- for (size_t i=0; i<mAttributes.size(); i++) {
- const attribute_entry& ae(mAttributes.itemAt(i));
- if (ae.ns == ns && ae.name == name) {
- return &ae;
- }
- }
-
- return NULL;
-}
-
-XMLNode::attribute_entry* XMLNode::editAttribute(const String16& ns,
- const String16& name)
-{
- for (size_t i=0; i<mAttributes.size(); i++) {
- attribute_entry * ae = &mAttributes.editItemAt(i);
- if (ae->ns == ns && ae->name == name) {
- return ae;
- }
- }
-
- return NULL;
-}
-
-const String16& XMLNode::getCData() const
-{
- return mChars;
-}
-
-const String16& XMLNode::getComment() const
-{
- return mComment;
-}
-
-int32_t XMLNode::getStartLineNumber() const
-{
- return mStartLineNumber;
-}
-
-int32_t XMLNode::getEndLineNumber() const
-{
- return mEndLineNumber;
-}
-
-sp<XMLNode> XMLNode::searchElement(const String16& tagNamespace, const String16& tagName)
-{
- if (getType() == XMLNode::TYPE_ELEMENT
- && mNamespaceUri == tagNamespace
- && mElementName == tagName) {
- return this;
- }
-
- for (size_t i=0; i<mChildren.size(); i++) {
- sp<XMLNode> found = mChildren.itemAt(i)->searchElement(tagNamespace, tagName);
- if (found != NULL) {
- return found;
- }
- }
-
- return NULL;
-}
-
-sp<XMLNode> XMLNode::getChildElement(const String16& tagNamespace, const String16& tagName)
-{
- for (size_t i=0; i<mChildren.size(); i++) {
- sp<XMLNode> child = mChildren.itemAt(i);
- if (child->getType() == XMLNode::TYPE_ELEMENT
- && child->mNamespaceUri == tagNamespace
- && child->mElementName == tagName) {
- return child;
- }
- }
-
- return NULL;
-}
-
-status_t XMLNode::addChild(const sp<XMLNode>& child)
-{
- if (getType() == TYPE_CDATA) {
- SourcePos(mFilename, child->getStartLineNumber()).error("Child to CDATA node.");
- return UNKNOWN_ERROR;
- }
- //printf("Adding child %p to parent %p\n", child.get(), this);
- mChildren.add(child);
- return NO_ERROR;
-}
-
-status_t XMLNode::insertChildAt(const sp<XMLNode>& child, size_t index)
-{
- if (getType() == TYPE_CDATA) {
- SourcePos(mFilename, child->getStartLineNumber()).error("Child to CDATA node.");
- return UNKNOWN_ERROR;
- }
- //printf("Adding child %p to parent %p\n", child.get(), this);
- mChildren.insertAt(child, index);
- return NO_ERROR;
-}
-
-status_t XMLNode::addAttribute(const String16& ns, const String16& name,
- const String16& value)
-{
- if (getType() == TYPE_CDATA) {
- SourcePos(mFilename, getStartLineNumber()).error("Child to CDATA node.");
- return UNKNOWN_ERROR;
- }
-
- if (ns != RESOURCES_TOOLS_NAMESPACE) {
- attribute_entry e;
- e.index = mNextAttributeIndex++;
- e.ns = ns;
- e.name = name;
- e.string = value;
- mAttributes.add(e);
- mAttributeOrder.add(e.index, mAttributes.size()-1);
- }
- return NO_ERROR;
-}
-
-void XMLNode::setAttributeResID(size_t attrIdx, uint32_t resId)
-{
- attribute_entry& e = mAttributes.editItemAt(attrIdx);
- if (e.nameResId) {
- mAttributeOrder.removeItem(e.nameResId);
- } else {
- mAttributeOrder.removeItem(e.index);
- }
- NOISY(printf("Elem %s %s=\"%s\": set res id = 0x%08x\n",
- String8(getElementName()).string(),
- String8(mAttributes.itemAt(attrIdx).name).string(),
- String8(mAttributes.itemAt(attrIdx).string).string(),
- resId));
- mAttributes.editItemAt(attrIdx).nameResId = resId;
- mAttributeOrder.add(resId, attrIdx);
-}
-
-status_t XMLNode::appendChars(const String16& chars)
-{
- if (getType() != TYPE_CDATA) {
- SourcePos(mFilename, getStartLineNumber()).error("Adding characters to element node.");
- return UNKNOWN_ERROR;
- }
- mChars.append(chars);
- return NO_ERROR;
-}
-
-status_t XMLNode::appendComment(const String16& comment)
-{
- if (mComment.size() > 0) {
- mComment.append(String16("\n"));
- }
- mComment.append(comment);
- return NO_ERROR;
-}
-
-void XMLNode::setStartLineNumber(int32_t line)
-{
- mStartLineNumber = line;
-}
-
-void XMLNode::setEndLineNumber(int32_t line)
-{
- mEndLineNumber = line;
-}
-
-void XMLNode::removeWhitespace(bool stripAll, const char** cDataTags)
-{
- //printf("Removing whitespace in %s\n", String8(mElementName).string());
- size_t N = mChildren.size();
- if (cDataTags) {
- String8 tag(mElementName);
- const char** p = cDataTags;
- while (*p) {
- if (tag == *p) {
- stripAll = false;
- break;
- }
- }
- }
- for (size_t i=0; i<N; i++) {
- sp<XMLNode> node = mChildren.itemAt(i);
- if (node->getType() == TYPE_CDATA) {
- // This is a CDATA node...
- const char16_t* p = node->mChars.string();
- while (*p != 0 && *p < 128 && isspace(*p)) {
- p++;
- }
- //printf("Space ends at %d in \"%s\"\n",
- // (int)(p-node->mChars.string()),
- // String8(node->mChars).string());
- if (*p == 0) {
- if (stripAll) {
- // Remove this node!
- mChildren.removeAt(i);
- N--;
- i--;
- } else {
- node->mChars = String16(" ");
- }
- } else {
- // Compact leading/trailing whitespace.
- const char16_t* e = node->mChars.string()+node->mChars.size()-1;
- while (e > p && *e < 128 && isspace(*e)) {
- e--;
- }
- if (p > node->mChars.string()) {
- p--;
- }
- if (e < (node->mChars.string()+node->mChars.size()-1)) {
- e++;
- }
- if (p > node->mChars.string() ||
- e < (node->mChars.string()+node->mChars.size()-1)) {
- String16 tmp(p, e-p+1);
- node->mChars = tmp;
- }
- }
- } else {
- node->removeWhitespace(stripAll, cDataTags);
- }
- }
-}
-
-status_t XMLNode::parseValues(const sp<AaptAssets>& assets,
- ResourceTable* table)
-{
- bool hasErrors = false;
-
- if (getType() == TYPE_ELEMENT) {
- const size_t N = mAttributes.size();
- String16 defPackage(assets->getPackage());
- for (size_t i=0; i<N; i++) {
- attribute_entry& e = mAttributes.editItemAt(i);
- AccessorCookie ac(SourcePos(mFilename, getStartLineNumber()), String8(e.name),
- String8(e.string));
- table->setCurrentXmlPos(SourcePos(mFilename, getStartLineNumber()));
- if (!assets->getIncludedResources()
- .stringToValue(&e.value, &e.string,
- e.string.string(), e.string.size(), true, true,
- e.nameResId, NULL, &defPackage, table, &ac)) {
- hasErrors = true;
- }
- NOISY(printf("Attr %s: type=0x%x, str=%s\n",
- String8(e.name).string(), e.value.dataType,
- String8(e.string).string()));
- }
- }
- const size_t N = mChildren.size();
- for (size_t i=0; i<N; i++) {
- status_t err = mChildren.itemAt(i)->parseValues(assets, table);
- if (err != NO_ERROR) {
- hasErrors = true;
- }
- }
- return hasErrors ? UNKNOWN_ERROR : NO_ERROR;
-}
-
-status_t XMLNode::assignResourceIds(const sp<AaptAssets>& assets,
- const ResourceTable* table)
-{
- bool hasErrors = false;
-
- if (getType() == TYPE_ELEMENT) {
- String16 attr("attr");
- const char* errorMsg;
- const size_t N = mAttributes.size();
- for (size_t i=0; i<N; i++) {
- const attribute_entry& e = mAttributes.itemAt(i);
- if (e.ns.size() <= 0) continue;
- bool nsIsPublic;
- String16 pkg(getNamespaceResourcePackage(String16(assets->getPackage()), e.ns, &nsIsPublic));
- NOISY(printf("Elem %s %s=\"%s\": namespace(%s) %s ===> %s\n",
- String8(getElementName()).string(),
- String8(e.name).string(),
- String8(e.string).string(),
- String8(e.ns).string(),
- (nsIsPublic) ? "public" : "private",
- String8(pkg).string()));
- if (pkg.size() <= 0) continue;
- uint32_t res = table != NULL
- ? table->getResId(e.name, &attr, &pkg, &errorMsg, nsIsPublic)
- : assets->getIncludedResources().
- identifierForName(e.name.string(), e.name.size(),
- attr.string(), attr.size(),
- pkg.string(), pkg.size());
- if (res != 0) {
- NOISY(printf("XML attribute name %s: resid=0x%08x\n",
- String8(e.name).string(), res));
- setAttributeResID(i, res);
- } else {
- SourcePos(mFilename, getStartLineNumber()).error(
- "No resource identifier found for attribute '%s' in package '%s'\n",
- String8(e.name).string(), String8(pkg).string());
- hasErrors = true;
- }
- }
- }
- const size_t N = mChildren.size();
- for (size_t i=0; i<N; i++) {
- status_t err = mChildren.itemAt(i)->assignResourceIds(assets, table);
- if (err < NO_ERROR) {
- hasErrors = true;
- }
- }
-
- return hasErrors ? UNKNOWN_ERROR : NO_ERROR;
-}
-
-status_t XMLNode::flatten(const sp<AaptFile>& dest,
- bool stripComments, bool stripRawValues) const
-{
- StringPool strings(mUTF8);
- Vector<uint32_t> resids;
-
- // First collect just the strings for attribute names that have a
- // resource ID assigned to them. This ensures that the resource ID
- // array is compact, and makes it easier to deal with attribute names
- // in different namespaces (and thus with different resource IDs).
- collect_resid_strings(&strings, &resids);
-
- // Next collect all remainibng strings.
- collect_strings(&strings, &resids, stripComments, stripRawValues);
-
-#if 0 // No longer compiles
- NOISY(printf("Found strings:\n");
- const size_t N = strings.size();
- for (size_t i=0; i<N; i++) {
- printf("%s\n", String8(strings.entryAt(i).string).string());
- }
- );
-#endif
-
- sp<AaptFile> stringPool = strings.createStringBlock();
- NOISY(aout << "String pool:"
- << HexDump(stringPool->getData(), stringPool->getSize()) << endl);
-
- ResXMLTree_header header;
- memset(&header, 0, sizeof(header));
- header.header.type = htods(RES_XML_TYPE);
- header.header.headerSize = htods(sizeof(header));
-
- const size_t basePos = dest->getSize();
- dest->writeData(&header, sizeof(header));
- dest->writeData(stringPool->getData(), stringPool->getSize());
-
- // If we have resource IDs, write them.
- if (resids.size() > 0) {
- const size_t resIdsPos = dest->getSize();
- const size_t resIdsSize =
- sizeof(ResChunk_header)+(sizeof(uint32_t)*resids.size());
- ResChunk_header* idsHeader = (ResChunk_header*)
- (((const uint8_t*)dest->editData(resIdsPos+resIdsSize))+resIdsPos);
- idsHeader->type = htods(RES_XML_RESOURCE_MAP_TYPE);
- idsHeader->headerSize = htods(sizeof(*idsHeader));
- idsHeader->size = htodl(resIdsSize);
- uint32_t* ids = (uint32_t*)(idsHeader+1);
- for (size_t i=0; i<resids.size(); i++) {
- *ids++ = htodl(resids[i]);
- }
- }
-
- flatten_node(strings, dest, stripComments, stripRawValues);
-
- void* data = dest->editData();
- ResXMLTree_header* hd = (ResXMLTree_header*)(((uint8_t*)data)+basePos);
- size_t size = dest->getSize()-basePos;
- hd->header.size = htodl(dest->getSize()-basePos);
-
- NOISY(aout << "XML resource:"
- << HexDump(dest->getData(), dest->getSize()) << endl);
-
- #if PRINT_STRING_METRICS
- fprintf(stderr, "**** total xml size: %d / %d%% strings (in %s)\n",
- dest->getSize(), (stringPool->getSize()*100)/dest->getSize(),
- dest->getPath().string());
- #endif
-
- return NO_ERROR;
-}
-
-void XMLNode::print(int indent)
-{
- String8 prefix;
- int i;
- for (i=0; i<indent; i++) {
- prefix.append(" ");
- }
- if (getType() == TYPE_ELEMENT) {
- String8 elemNs(getNamespaceUri());
- if (elemNs.size() > 0) {
- elemNs.append(":");
- }
- printf("%s E: %s%s", prefix.string(),
- elemNs.string(), String8(getElementName()).string());
- int N = mAttributes.size();
- for (i=0; i<N; i++) {
- ssize_t idx = mAttributeOrder.valueAt(i);
- if (i == 0) {
- printf(" / ");
- } else {
- printf(", ");
- }
- const attribute_entry& attr = mAttributes.itemAt(idx);
- String8 attrNs(attr.ns);
- if (attrNs.size() > 0) {
- attrNs.append(":");
- }
- if (attr.nameResId) {
- printf("%s%s(0x%08x)", attrNs.string(),
- String8(attr.name).string(), attr.nameResId);
- } else {
- printf("%s%s", attrNs.string(), String8(attr.name).string());
- }
- printf("=%s", String8(attr.string).string());
- }
- printf("\n");
- } else if (getType() == TYPE_NAMESPACE) {
- printf("%s N: %s=%s\n", prefix.string(),
- getNamespacePrefix().size() > 0
- ? String8(getNamespacePrefix()).string() : "<DEF>",
- String8(getNamespaceUri()).string());
- } else {
- printf("%s C: \"%s\"\n", prefix.string(), String8(getCData()).string());
- }
- int N = mChildren.size();
- for (i=0; i<N; i++) {
- mChildren.itemAt(i)->print(indent+1);
- }
-}
-
-static void splitName(const char* name, String16* outNs, String16* outName)
-{
- const char* p = name;
- while (*p != 0 && *p != 1) {
- p++;
- }
- if (*p == 0) {
- *outNs = String16();
- *outName = String16(name);
- } else {
- *outNs = String16(name, (p-name));
- *outName = String16(p+1);
- }
-}
-
-void XMLCALL
-XMLNode::startNamespace(void *userData, const char *prefix, const char *uri)
-{
- NOISY_PARSE(printf("Start Namespace: %s %s\n", prefix, uri));
- ParseState* st = (ParseState*)userData;
- sp<XMLNode> node = XMLNode::newNamespace(st->filename,
- String16(prefix != NULL ? prefix : ""), String16(uri));
- node->setStartLineNumber(XML_GetCurrentLineNumber(st->parser));
- if (st->stack.size() > 0) {
- st->stack.itemAt(st->stack.size()-1)->addChild(node);
- } else {
- st->root = node;
- }
- st->stack.push(node);
-}
-
-void XMLCALL
-XMLNode::startElement(void *userData, const char *name, const char **atts)
-{
- NOISY_PARSE(printf("Start Element: %s\n", name));
- ParseState* st = (ParseState*)userData;
- String16 ns16, name16;
- splitName(name, &ns16, &name16);
- sp<XMLNode> node = XMLNode::newElement(st->filename, ns16, name16);
- node->setStartLineNumber(XML_GetCurrentLineNumber(st->parser));
- if (st->pendingComment.size() > 0) {
- node->appendComment(st->pendingComment);
- st->pendingComment = String16();
- }
- if (st->stack.size() > 0) {
- st->stack.itemAt(st->stack.size()-1)->addChild(node);
- } else {
- st->root = node;
- }
- st->stack.push(node);
-
- for (int i = 0; atts[i]; i += 2) {
- splitName(atts[i], &ns16, &name16);
- node->addAttribute(ns16, name16, String16(atts[i+1]));
- }
-}
-
-void XMLCALL
-XMLNode::characterData(void *userData, const XML_Char *s, int len)
-{
- NOISY_PARSE(printf("CDATA: \"%s\"\n", String8(s, len).string()));
- ParseState* st = (ParseState*)userData;
- sp<XMLNode> node = NULL;
- if (st->stack.size() == 0) {
- return;
- }
- sp<XMLNode> parent = st->stack.itemAt(st->stack.size()-1);
- if (parent != NULL && parent->getChildren().size() > 0) {
- node = parent->getChildren()[parent->getChildren().size()-1];
- if (node->getType() != TYPE_CDATA) {
- // Last node is not CDATA, need to make a new node.
- node = NULL;
- }
- }
-
- if (node == NULL) {
- node = XMLNode::newCData(st->filename);
- node->setStartLineNumber(XML_GetCurrentLineNumber(st->parser));
- parent->addChild(node);
- }
-
- node->appendChars(String16(s, len));
-}
-
-void XMLCALL
-XMLNode::endElement(void *userData, const char *name)
-{
- NOISY_PARSE(printf("End Element: %s\n", name));
- ParseState* st = (ParseState*)userData;
- sp<XMLNode> node = st->stack.itemAt(st->stack.size()-1);
- node->setEndLineNumber(XML_GetCurrentLineNumber(st->parser));
- if (st->pendingComment.size() > 0) {
- node->appendComment(st->pendingComment);
- st->pendingComment = String16();
- }
- String16 ns16, name16;
- splitName(name, &ns16, &name16);
- LOG_ALWAYS_FATAL_IF(node->getElementNamespace() != ns16
- || node->getElementName() != name16,
- "Bad end element %s", name);
- st->stack.pop();
-}
-
-void XMLCALL
-XMLNode::endNamespace(void *userData, const char *prefix)
-{
- const char* nonNullPrefix = prefix != NULL ? prefix : "";
- NOISY_PARSE(printf("End Namespace: %s\n", prefix));
- ParseState* st = (ParseState*)userData;
- sp<XMLNode> node = st->stack.itemAt(st->stack.size()-1);
- node->setEndLineNumber(XML_GetCurrentLineNumber(st->parser));
- LOG_ALWAYS_FATAL_IF(node->getNamespacePrefix() != String16(nonNullPrefix),
- "Bad end namespace %s", prefix);
- st->stack.pop();
-}
-
-void XMLCALL
-XMLNode::commentData(void *userData, const char *comment)
-{
- NOISY_PARSE(printf("Comment: %s\n", comment));
- ParseState* st = (ParseState*)userData;
- if (st->pendingComment.size() > 0) {
- st->pendingComment.append(String16("\n"));
- }
- st->pendingComment.append(String16(comment));
-}
-
-status_t XMLNode::collect_strings(StringPool* dest, Vector<uint32_t>* outResIds,
- bool stripComments, bool stripRawValues) const
-{
- collect_attr_strings(dest, outResIds, true);
-
- int i;
- if (RESOURCES_TOOLS_NAMESPACE != mNamespaceUri) {
- if (mNamespacePrefix.size() > 0) {
- dest->add(mNamespacePrefix, true);
- }
- if (mNamespaceUri.size() > 0) {
- dest->add(mNamespaceUri, true);
- }
- }
- if (mElementName.size() > 0) {
- dest->add(mElementName, true);
- }
-
- if (!stripComments && mComment.size() > 0) {
- dest->add(mComment, true);
- }
-
- const int NA = mAttributes.size();
-
- for (i=0; i<NA; i++) {
- const attribute_entry& ae = mAttributes.itemAt(i);
- if (ae.ns.size() > 0) {
- dest->add(ae.ns, true);
- }
- if (!stripRawValues || ae.needStringValue()) {
- dest->add(ae.string, true);
- }
- /*
- if (ae.value.dataType == Res_value::TYPE_NULL
- || ae.value.dataType == Res_value::TYPE_STRING) {
- dest->add(ae.string, true);
- }
- */
- }
-
- if (mElementName.size() == 0) {
- // If not an element, include the CDATA, even if it is empty.
- dest->add(mChars, true);
- }
-
- const int NC = mChildren.size();
-
- for (i=0; i<NC; i++) {
- mChildren.itemAt(i)->collect_strings(dest, outResIds,
- stripComments, stripRawValues);
- }
-
- return NO_ERROR;
-}
-
-status_t XMLNode::collect_attr_strings(StringPool* outPool,
- Vector<uint32_t>* outResIds, bool allAttrs) const {
- const int NA = mAttributes.size();
-
- for (int i=0; i<NA; i++) {
- const attribute_entry& attr = mAttributes.itemAt(i);
- uint32_t id = attr.nameResId;
- if (id || allAttrs) {
- // See if we have already assigned this resource ID to a pooled
- // string...
- const Vector<size_t>* indices = outPool->offsetsForString(attr.name);
- ssize_t idx = -1;
- if (indices != NULL) {
- const int NJ = indices->size();
- const size_t NR = outResIds->size();
- for (int j=0; j<NJ; j++) {
- size_t strIdx = indices->itemAt(j);
- if (strIdx >= NR) {
- if (id == 0) {
- // We don't need to assign a resource ID for this one.
- idx = strIdx;
- break;
- }
- // Just ignore strings that are out of range of
- // the currently assigned resource IDs... we add
- // strings as we assign the first ID.
- } else if (outResIds->itemAt(strIdx) == id) {
- idx = strIdx;
- break;
- }
- }
- }
- if (idx < 0) {
- idx = outPool->add(attr.name);
- NOISY(printf("Adding attr %s (resid 0x%08x) to pool: idx=%d\n",
- String8(attr.name).string(), id, idx));
- if (id != 0) {
- while ((ssize_t)outResIds->size() <= idx) {
- outResIds->add(0);
- }
- outResIds->replaceAt(id, idx);
- }
- }
- attr.namePoolIdx = idx;
- NOISY(printf("String %s offset=0x%08x\n",
- String8(attr.name).string(), idx));
- }
- }
-
- return NO_ERROR;
-}
-
-status_t XMLNode::collect_resid_strings(StringPool* outPool,
- Vector<uint32_t>* outResIds) const
-{
- collect_attr_strings(outPool, outResIds, false);
-
- const int NC = mChildren.size();
-
- for (int i=0; i<NC; i++) {
- mChildren.itemAt(i)->collect_resid_strings(outPool, outResIds);
- }
-
- return NO_ERROR;
-}
-
-status_t XMLNode::flatten_node(const StringPool& strings, const sp<AaptFile>& dest,
- bool stripComments, bool stripRawValues) const
-{
- ResXMLTree_node node;
- ResXMLTree_cdataExt cdataExt;
- ResXMLTree_namespaceExt namespaceExt;
- ResXMLTree_attrExt attrExt;
- const void* extData = NULL;
- size_t extSize = 0;
- ResXMLTree_attribute attr;
- bool writeCurrentNode = true;
-
- const size_t NA = mAttributes.size();
- const size_t NC = mChildren.size();
- size_t i;
-
- LOG_ALWAYS_FATAL_IF(NA != mAttributeOrder.size(), "Attributes messed up!");
-
- const String16 id16("id");
- const String16 class16("class");
- const String16 style16("style");
-
- const type type = getType();
-
- memset(&node, 0, sizeof(node));
- memset(&attr, 0, sizeof(attr));
- node.header.headerSize = htods(sizeof(node));
- node.lineNumber = htodl(getStartLineNumber());
- if (!stripComments) {
- node.comment.index = htodl(
- mComment.size() > 0 ? strings.offsetForString(mComment) : -1);
- //if (mComment.size() > 0) {
- // printf("Flattening comment: %s\n", String8(mComment).string());
- //}
- } else {
- node.comment.index = htodl((uint32_t)-1);
- }
- if (type == TYPE_ELEMENT) {
- node.header.type = htods(RES_XML_START_ELEMENT_TYPE);
- extData = &attrExt;
- extSize = sizeof(attrExt);
- memset(&attrExt, 0, sizeof(attrExt));
- if (mNamespaceUri.size() > 0) {
- attrExt.ns.index = htodl(strings.offsetForString(mNamespaceUri));
- } else {
- attrExt.ns.index = htodl((uint32_t)-1);
- }
- attrExt.name.index = htodl(strings.offsetForString(mElementName));
- attrExt.attributeStart = htods(sizeof(attrExt));
- attrExt.attributeSize = htods(sizeof(attr));
- attrExt.attributeCount = htods(NA);
- attrExt.idIndex = htods(0);
- attrExt.classIndex = htods(0);
- attrExt.styleIndex = htods(0);
- for (i=0; i<NA; i++) {
- ssize_t idx = mAttributeOrder.valueAt(i);
- const attribute_entry& ae = mAttributes.itemAt(idx);
- if (ae.ns.size() == 0) {
- if (ae.name == id16) {
- attrExt.idIndex = htods(i+1);
- } else if (ae.name == class16) {
- attrExt.classIndex = htods(i+1);
- } else if (ae.name == style16) {
- attrExt.styleIndex = htods(i+1);
- }
- }
- }
- } else if (type == TYPE_NAMESPACE) {
- if (mNamespaceUri == RESOURCES_TOOLS_NAMESPACE) {
- writeCurrentNode = false;
- } else {
- node.header.type = htods(RES_XML_START_NAMESPACE_TYPE);
- extData = &namespaceExt;
- extSize = sizeof(namespaceExt);
- memset(&namespaceExt, 0, sizeof(namespaceExt));
- if (mNamespacePrefix.size() > 0) {
- namespaceExt.prefix.index = htodl(strings.offsetForString(mNamespacePrefix));
- } else {
- namespaceExt.prefix.index = htodl((uint32_t)-1);
- }
- namespaceExt.prefix.index = htodl(strings.offsetForString(mNamespacePrefix));
- namespaceExt.uri.index = htodl(strings.offsetForString(mNamespaceUri));
- }
- LOG_ALWAYS_FATAL_IF(NA != 0, "Namespace nodes can't have attributes!");
- } else if (type == TYPE_CDATA) {
- node.header.type = htods(RES_XML_CDATA_TYPE);
- extData = &cdataExt;
- extSize = sizeof(cdataExt);
- memset(&cdataExt, 0, sizeof(cdataExt));
- cdataExt.data.index = htodl(strings.offsetForString(mChars));
- cdataExt.typedData.size = htods(sizeof(cdataExt.typedData));
- cdataExt.typedData.res0 = 0;
- cdataExt.typedData.dataType = mCharsValue.dataType;
- cdataExt.typedData.data = htodl(mCharsValue.data);
- LOG_ALWAYS_FATAL_IF(NA != 0, "CDATA nodes can't have attributes!");
- }
-
- node.header.size = htodl(sizeof(node) + extSize + (sizeof(attr)*NA));
-
- if (writeCurrentNode) {
- dest->writeData(&node, sizeof(node));
- if (extSize > 0) {
- dest->writeData(extData, extSize);
- }
- }
-
- for (i=0; i<NA; i++) {
- ssize_t idx = mAttributeOrder.valueAt(i);
- const attribute_entry& ae = mAttributes.itemAt(idx);
- if (ae.ns.size() > 0) {
- attr.ns.index = htodl(strings.offsetForString(ae.ns));
- } else {
- attr.ns.index = htodl((uint32_t)-1);
- }
- attr.name.index = htodl(ae.namePoolIdx);
-
- if (!stripRawValues || ae.needStringValue()) {
- attr.rawValue.index = htodl(strings.offsetForString(ae.string));
- } else {
- attr.rawValue.index = htodl((uint32_t)-1);
- }
- attr.typedValue.size = htods(sizeof(attr.typedValue));
- if (ae.value.dataType == Res_value::TYPE_NULL
- || ae.value.dataType == Res_value::TYPE_STRING) {
- attr.typedValue.res0 = 0;
- attr.typedValue.dataType = Res_value::TYPE_STRING;
- attr.typedValue.data = htodl(strings.offsetForString(ae.string));
- } else {
- attr.typedValue.res0 = 0;
- attr.typedValue.dataType = ae.value.dataType;
- attr.typedValue.data = htodl(ae.value.data);
- }
- dest->writeData(&attr, sizeof(attr));
- }
-
- for (i=0; i<NC; i++) {
- status_t err = mChildren.itemAt(i)->flatten_node(strings, dest,
- stripComments, stripRawValues);
- if (err != NO_ERROR) {
- return err;
- }
- }
-
- if (type == TYPE_ELEMENT) {
- ResXMLTree_endElementExt endElementExt;
- memset(&endElementExt, 0, sizeof(endElementExt));
- node.header.type = htods(RES_XML_END_ELEMENT_TYPE);
- node.header.size = htodl(sizeof(node)+sizeof(endElementExt));
- node.lineNumber = htodl(getEndLineNumber());
- node.comment.index = htodl((uint32_t)-1);
- endElementExt.ns.index = attrExt.ns.index;
- endElementExt.name.index = attrExt.name.index;
- dest->writeData(&node, sizeof(node));
- dest->writeData(&endElementExt, sizeof(endElementExt));
- } else if (type == TYPE_NAMESPACE) {
- if (writeCurrentNode) {
- node.header.type = htods(RES_XML_END_NAMESPACE_TYPE);
- node.lineNumber = htodl(getEndLineNumber());
- node.comment.index = htodl((uint32_t)-1);
- node.header.size = htodl(sizeof(node)+extSize);
- dest->writeData(&node, sizeof(node));
- dest->writeData(extData, extSize);
- }
- }
-
- return NO_ERROR;
-}
diff --git a/tools/aapt/XMLNode.h b/tools/aapt/XMLNode.h
deleted file mode 100644
index 05624b7..0000000
--- a/tools/aapt/XMLNode.h
+++ /dev/null
@@ -1,202 +0,0 @@
-//
-// Copyright 2006 The Android Open Source Project
-//
-// Build resource files from raw assets.
-//
-
-#ifndef XML_NODE_H
-#define XML_NODE_H
-
-#include "StringPool.h"
-#include "ResourceTable.h"
-
-class XMLNode;
-
-extern const char* const RESOURCES_ROOT_NAMESPACE;
-extern const char* const RESOURCES_ANDROID_NAMESPACE;
-
-bool isWhitespace(const char16_t* str);
-
-String16 getNamespaceResourcePackage(String16 namespaceUri, bool* outIsPublic = NULL);
-
-status_t parseStyledString(Bundle* bundle,
- const char* fileName,
- ResXMLTree* inXml,
- const String16& endTag,
- String16* outString,
- Vector<StringPool::entry_style_span>* outSpans,
- bool isFormatted,
- bool isPseudolocalizable);
-
-void printXMLBlock(ResXMLTree* block);
-
-status_t parseXMLResource(const sp<AaptFile>& file, ResXMLTree* outTree,
- bool stripAll=true, bool keepComments=false,
- const char** cDataTags=NULL);
-
-class XMLNode : public RefBase
-{
-public:
- static sp<XMLNode> parse(const sp<AaptFile>& file);
-
- static inline
- sp<XMLNode> newNamespace(const String8& filename, const String16& prefix, const String16& uri) {
- return new XMLNode(filename, prefix, uri, true);
- }
-
- static inline
- sp<XMLNode> newElement(const String8& filename, const String16& ns, const String16& name) {
- return new XMLNode(filename, ns, name, false);
- }
-
- static inline
- sp<XMLNode> newCData(const String8& filename) {
- return new XMLNode(filename);
- }
-
- enum type {
- TYPE_NAMESPACE,
- TYPE_ELEMENT,
- TYPE_CDATA
- };
-
- type getType() const;
-
- const String16& getNamespacePrefix() const;
- const String16& getNamespaceUri() const;
-
- const String16& getElementNamespace() const;
- const String16& getElementName() const;
- const Vector<sp<XMLNode> >& getChildren() const;
-
- const String8& getFilename() const;
-
- struct attribute_entry {
- attribute_entry() : index(~(uint32_t)0), nameResId(0)
- {
- value.dataType = Res_value::TYPE_NULL;
- }
-
- bool needStringValue() const {
- return nameResId == 0
- || value.dataType == Res_value::TYPE_NULL
- || value.dataType == Res_value::TYPE_STRING;
- }
-
- String16 ns;
- String16 name;
- String16 string;
- Res_value value;
- uint32_t index;
- uint32_t nameResId;
- mutable uint32_t namePoolIdx;
- };
-
- const Vector<attribute_entry>& getAttributes() const;
-
- const attribute_entry* getAttribute(const String16& ns, const String16& name) const;
-
- attribute_entry* editAttribute(const String16& ns, const String16& name);
-
- const String16& getCData() const;
-
- const String16& getComment() const;
-
- int32_t getStartLineNumber() const;
- int32_t getEndLineNumber() const;
-
- sp<XMLNode> searchElement(const String16& tagNamespace, const String16& tagName);
-
- sp<XMLNode> getChildElement(const String16& tagNamespace, const String16& tagName);
-
- status_t addChild(const sp<XMLNode>& child);
-
- status_t insertChildAt(const sp<XMLNode>& child, size_t index);
-
- status_t addAttribute(const String16& ns, const String16& name,
- const String16& value);
-
- void setAttributeResID(size_t attrIdx, uint32_t resId);
-
- status_t appendChars(const String16& chars);
-
- status_t appendComment(const String16& comment);
-
- void setStartLineNumber(int32_t line);
- void setEndLineNumber(int32_t line);
-
- void removeWhitespace(bool stripAll=true, const char** cDataTags=NULL);
-
- void setUTF8(bool val) { mUTF8 = val; }
-
- status_t parseValues(const sp<AaptAssets>& assets, ResourceTable* table);
-
- status_t assignResourceIds(const sp<AaptAssets>& assets,
- const ResourceTable* table = NULL);
-
- status_t flatten(const sp<AaptFile>& dest, bool stripComments,
- bool stripRawValues) const;
-
- void print(int indent=0);
-
-private:
- struct ParseState
- {
- String8 filename;
- XML_Parser parser;
- sp<XMLNode> root;
- Vector<sp<XMLNode> > stack;
- String16 pendingComment;
- };
-
- static void XMLCALL
- startNamespace(void *userData, const char *prefix, const char *uri);
- static void XMLCALL
- startElement(void *userData, const char *name, const char **atts);
- static void XMLCALL
- characterData(void *userData, const XML_Char *s, int len);
- static void XMLCALL
- endElement(void *userData, const char *name);
- static void XMLCALL
- endNamespace(void *userData, const char *prefix);
-
- static void XMLCALL
- commentData(void *userData, const char *comment);
-
- // Creating an element node.
- XMLNode(const String8& filename, const String16& s1, const String16& s2, bool isNamespace);
-
- // Creating a CDATA node.
- XMLNode(const String8& filename);
-
- status_t collect_strings(StringPool* dest, Vector<uint32_t>* outResIds,
- bool stripComments, bool stripRawValues) const;
-
- status_t collect_attr_strings(StringPool* outPool,
- Vector<uint32_t>* outResIds, bool allAttrs) const;
-
- status_t collect_resid_strings(StringPool* outPool,
- Vector<uint32_t>* outResIds) const;
-
- status_t flatten_node(const StringPool& strings, const sp<AaptFile>& dest,
- bool stripComments, bool stripRawValues) const;
-
- String16 mNamespacePrefix;
- String16 mNamespaceUri;
- String16 mElementName;
- Vector<sp<XMLNode> > mChildren;
- Vector<attribute_entry> mAttributes;
- KeyedVector<uint32_t, uint32_t> mAttributeOrder;
- uint32_t mNextAttributeIndex;
- String16 mChars;
- Res_value mCharsValue;
- String16 mComment;
- String8 mFilename;
- int32_t mStartLineNumber;
- int32_t mEndLineNumber;
-
- // Encode compiled XML with UTF-8 StringPools?
- bool mUTF8;
-};
-
-#endif
diff --git a/tools/aapt/ZipEntry.cpp b/tools/aapt/ZipEntry.cpp
deleted file mode 100644
index b575988..0000000
--- a/tools/aapt/ZipEntry.cpp
+++ /dev/null
@@ -1,696 +0,0 @@
-/*
- * Copyright (C) 2006 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-//
-// Access to entries in a Zip archive.
-//
-
-#define LOG_TAG "zip"
-
-#include "ZipEntry.h"
-#include <utils/Log.h>
-
-#include <stdio.h>
-#include <string.h>
-#include <assert.h>
-
-using namespace android;
-
-/*
- * Initialize a new ZipEntry structure from a FILE* positioned at a
- * CentralDirectoryEntry.
- *
- * On exit, the file pointer will be at the start of the next CDE or
- * at the EOCD.
- */
-status_t ZipEntry::initFromCDE(FILE* fp)
-{
- status_t result;
- long posn;
- bool hasDD;
-
- //ALOGV("initFromCDE ---\n");
-
- /* read the CDE */
- result = mCDE.read(fp);
- if (result != NO_ERROR) {
- ALOGD("mCDE.read failed\n");
- return result;
- }
-
- //mCDE.dump();
-
- /* using the info in the CDE, go load up the LFH */
- posn = ftell(fp);
- if (fseek(fp, mCDE.mLocalHeaderRelOffset, SEEK_SET) != 0) {
- ALOGD("local header seek failed (%ld)\n",
- mCDE.mLocalHeaderRelOffset);
- return UNKNOWN_ERROR;
- }
-
- result = mLFH.read(fp);
- if (result != NO_ERROR) {
- ALOGD("mLFH.read failed\n");
- return result;
- }
-
- if (fseek(fp, posn, SEEK_SET) != 0)
- return UNKNOWN_ERROR;
-
- //mLFH.dump();
-
- /*
- * We *might* need to read the Data Descriptor at this point and
- * integrate it into the LFH. If this bit is set, the CRC-32,
- * compressed size, and uncompressed size will be zero. In practice
- * these seem to be rare.
- */
- hasDD = (mLFH.mGPBitFlag & kUsesDataDescr) != 0;
- if (hasDD) {
- // do something clever
- //ALOGD("+++ has data descriptor\n");
- }
-
- /*
- * Sanity-check the LFH. Note that this will fail if the "kUsesDataDescr"
- * flag is set, because the LFH is incomplete. (Not a problem, since we
- * prefer the CDE values.)
- */
- if (!hasDD && !compareHeaders()) {
- ALOGW("warning: header mismatch\n");
- // keep going?
- }
-
- /*
- * If the mVersionToExtract is greater than 20, we may have an
- * issue unpacking the record -- could be encrypted, compressed
- * with something we don't support, or use Zip64 extensions. We
- * can defer worrying about that to when we're extracting data.
- */
-
- return NO_ERROR;
-}
-
-/*
- * Initialize a new entry. Pass in the file name and an optional comment.
- *
- * Initializes the CDE and the LFH.
- */
-void ZipEntry::initNew(const char* fileName, const char* comment)
-{
- assert(fileName != NULL && *fileName != '\0'); // name required
-
- /* most fields are properly initialized by constructor */
- mCDE.mVersionMadeBy = kDefaultMadeBy;
- mCDE.mVersionToExtract = kDefaultVersion;
- mCDE.mCompressionMethod = kCompressStored;
- mCDE.mFileNameLength = strlen(fileName);
- if (comment != NULL)
- mCDE.mFileCommentLength = strlen(comment);
- mCDE.mExternalAttrs = 0x81b60020; // matches what WinZip does
-
- if (mCDE.mFileNameLength > 0) {
- mCDE.mFileName = new unsigned char[mCDE.mFileNameLength+1];
- strcpy((char*) mCDE.mFileName, fileName);
- }
- if (mCDE.mFileCommentLength > 0) {
- /* TODO: stop assuming null-terminated ASCII here? */
- mCDE.mFileComment = new unsigned char[mCDE.mFileCommentLength+1];
- strcpy((char*) mCDE.mFileComment, comment);
- }
-
- copyCDEtoLFH();
-}
-
-/*
- * Initialize a new entry, starting with the ZipEntry from a different
- * archive.
- *
- * Initializes the CDE and the LFH.
- */
-status_t ZipEntry::initFromExternal(const ZipFile* pZipFile,
- const ZipEntry* pEntry)
-{
- /*
- * Copy everything in the CDE over, then fix up the hairy bits.
- */
- memcpy(&mCDE, &pEntry->mCDE, sizeof(mCDE));
-
- if (mCDE.mFileNameLength > 0) {
- mCDE.mFileName = new unsigned char[mCDE.mFileNameLength+1];
- if (mCDE.mFileName == NULL)
- return NO_MEMORY;
- strcpy((char*) mCDE.mFileName, (char*)pEntry->mCDE.mFileName);
- }
- if (mCDE.mFileCommentLength > 0) {
- mCDE.mFileComment = new unsigned char[mCDE.mFileCommentLength+1];
- if (mCDE.mFileComment == NULL)
- return NO_MEMORY;
- strcpy((char*) mCDE.mFileComment, (char*)pEntry->mCDE.mFileComment);
- }
- if (mCDE.mExtraFieldLength > 0) {
- /* we null-terminate this, though it may not be a string */
- mCDE.mExtraField = new unsigned char[mCDE.mExtraFieldLength+1];
- if (mCDE.mExtraField == NULL)
- return NO_MEMORY;
- memcpy(mCDE.mExtraField, pEntry->mCDE.mExtraField,
- mCDE.mExtraFieldLength+1);
- }
-
- /* construct the LFH from the CDE */
- copyCDEtoLFH();
-
- /*
- * The LFH "extra" field is independent of the CDE "extra", so we
- * handle it here.
- */
- assert(mLFH.mExtraField == NULL);
- mLFH.mExtraFieldLength = pEntry->mLFH.mExtraFieldLength;
- if (mLFH.mExtraFieldLength > 0) {
- mLFH.mExtraField = new unsigned char[mLFH.mExtraFieldLength+1];
- if (mLFH.mExtraField == NULL)
- return NO_MEMORY;
- memcpy(mLFH.mExtraField, pEntry->mLFH.mExtraField,
- mLFH.mExtraFieldLength+1);
- }
-
- return NO_ERROR;
-}
-
-/*
- * Insert pad bytes in the LFH by tweaking the "extra" field. This will
- * potentially confuse something that put "extra" data in here earlier,
- * but I can't find an actual problem.
- */
-status_t ZipEntry::addPadding(int padding)
-{
- if (padding <= 0)
- return INVALID_OPERATION;
-
- //ALOGI("HEY: adding %d pad bytes to existing %d in %s\n",
- // padding, mLFH.mExtraFieldLength, mCDE.mFileName);
-
- if (mLFH.mExtraFieldLength > 0) {
- /* extend existing field */
- unsigned char* newExtra;
-
- newExtra = new unsigned char[mLFH.mExtraFieldLength + padding];
- if (newExtra == NULL)
- return NO_MEMORY;
- memset(newExtra + mLFH.mExtraFieldLength, 0, padding);
- memcpy(newExtra, mLFH.mExtraField, mLFH.mExtraFieldLength);
-
- delete[] mLFH.mExtraField;
- mLFH.mExtraField = newExtra;
- mLFH.mExtraFieldLength += padding;
- } else {
- /* create new field */
- mLFH.mExtraField = new unsigned char[padding];
- memset(mLFH.mExtraField, 0, padding);
- mLFH.mExtraFieldLength = padding;
- }
-
- return NO_ERROR;
-}
-
-/*
- * Set the fields in the LFH equal to the corresponding fields in the CDE.
- *
- * This does not touch the LFH "extra" field.
- */
-void ZipEntry::copyCDEtoLFH(void)
-{
- mLFH.mVersionToExtract = mCDE.mVersionToExtract;
- mLFH.mGPBitFlag = mCDE.mGPBitFlag;
- mLFH.mCompressionMethod = mCDE.mCompressionMethod;
- mLFH.mLastModFileTime = mCDE.mLastModFileTime;
- mLFH.mLastModFileDate = mCDE.mLastModFileDate;
- mLFH.mCRC32 = mCDE.mCRC32;
- mLFH.mCompressedSize = mCDE.mCompressedSize;
- mLFH.mUncompressedSize = mCDE.mUncompressedSize;
- mLFH.mFileNameLength = mCDE.mFileNameLength;
- // the "extra field" is independent
-
- delete[] mLFH.mFileName;
- if (mLFH.mFileNameLength > 0) {
- mLFH.mFileName = new unsigned char[mLFH.mFileNameLength+1];
- strcpy((char*) mLFH.mFileName, (const char*) mCDE.mFileName);
- } else {
- mLFH.mFileName = NULL;
- }
-}
-
-/*
- * Set some information about a file after we add it.
- */
-void ZipEntry::setDataInfo(long uncompLen, long compLen, unsigned long crc32,
- int compressionMethod)
-{
- mCDE.mCompressionMethod = compressionMethod;
- mCDE.mCRC32 = crc32;
- mCDE.mCompressedSize = compLen;
- mCDE.mUncompressedSize = uncompLen;
- mCDE.mCompressionMethod = compressionMethod;
- if (compressionMethod == kCompressDeflated) {
- mCDE.mGPBitFlag |= 0x0002; // indicates maximum compression used
- }
- copyCDEtoLFH();
-}
-
-/*
- * See if the data in mCDE and mLFH match up. This is mostly useful for
- * debugging these classes, but it can be used to identify damaged
- * archives.
- *
- * Returns "false" if they differ.
- */
-bool ZipEntry::compareHeaders(void) const
-{
- if (mCDE.mVersionToExtract != mLFH.mVersionToExtract) {
- ALOGV("cmp: VersionToExtract\n");
- return false;
- }
- if (mCDE.mGPBitFlag != mLFH.mGPBitFlag) {
- ALOGV("cmp: GPBitFlag\n");
- return false;
- }
- if (mCDE.mCompressionMethod != mLFH.mCompressionMethod) {
- ALOGV("cmp: CompressionMethod\n");
- return false;
- }
- if (mCDE.mLastModFileTime != mLFH.mLastModFileTime) {
- ALOGV("cmp: LastModFileTime\n");
- return false;
- }
- if (mCDE.mLastModFileDate != mLFH.mLastModFileDate) {
- ALOGV("cmp: LastModFileDate\n");
- return false;
- }
- if (mCDE.mCRC32 != mLFH.mCRC32) {
- ALOGV("cmp: CRC32\n");
- return false;
- }
- if (mCDE.mCompressedSize != mLFH.mCompressedSize) {
- ALOGV("cmp: CompressedSize\n");
- return false;
- }
- if (mCDE.mUncompressedSize != mLFH.mUncompressedSize) {
- ALOGV("cmp: UncompressedSize\n");
- return false;
- }
- if (mCDE.mFileNameLength != mLFH.mFileNameLength) {
- ALOGV("cmp: FileNameLength\n");
- return false;
- }
-#if 0 // this seems to be used for padding, not real data
- if (mCDE.mExtraFieldLength != mLFH.mExtraFieldLength) {
- ALOGV("cmp: ExtraFieldLength\n");
- return false;
- }
-#endif
- if (mCDE.mFileName != NULL) {
- if (strcmp((char*) mCDE.mFileName, (char*) mLFH.mFileName) != 0) {
- ALOGV("cmp: FileName\n");
- return false;
- }
- }
-
- return true;
-}
-
-
-/*
- * Convert the DOS date/time stamp into a UNIX time stamp.
- */
-time_t ZipEntry::getModWhen(void) const
-{
- struct tm parts;
-
- parts.tm_sec = (mCDE.mLastModFileTime & 0x001f) << 1;
- parts.tm_min = (mCDE.mLastModFileTime & 0x07e0) >> 5;
- parts.tm_hour = (mCDE.mLastModFileTime & 0xf800) >> 11;
- parts.tm_mday = (mCDE.mLastModFileDate & 0x001f);
- parts.tm_mon = ((mCDE.mLastModFileDate & 0x01e0) >> 5) -1;
- parts.tm_year = ((mCDE.mLastModFileDate & 0xfe00) >> 9) + 80;
- parts.tm_wday = parts.tm_yday = 0;
- parts.tm_isdst = -1; // DST info "not available"
-
- return mktime(&parts);
-}
-
-/*
- * Set the CDE/LFH timestamp from UNIX time.
- */
-void ZipEntry::setModWhen(time_t when)
-{
-#ifdef HAVE_LOCALTIME_R
- struct tm tmResult;
-#endif
- time_t even;
- unsigned short zdate, ztime;
-
- struct tm* ptm;
-
- /* round up to an even number of seconds */
- even = (time_t)(((unsigned long)(when) + 1) & (~1));
-
- /* expand */
-#ifdef HAVE_LOCALTIME_R
- ptm = localtime_r(&even, &tmResult);
-#else
- ptm = localtime(&even);
-#endif
-
- int year;
- year = ptm->tm_year;
- if (year < 80)
- year = 80;
-
- zdate = (year - 80) << 9 | (ptm->tm_mon+1) << 5 | ptm->tm_mday;
- ztime = ptm->tm_hour << 11 | ptm->tm_min << 5 | ptm->tm_sec >> 1;
-
- mCDE.mLastModFileTime = mLFH.mLastModFileTime = ztime;
- mCDE.mLastModFileDate = mLFH.mLastModFileDate = zdate;
-}
-
-
-/*
- * ===========================================================================
- * ZipEntry::LocalFileHeader
- * ===========================================================================
- */
-
-/*
- * Read a local file header.
- *
- * On entry, "fp" points to the signature at the start of the header.
- * On exit, "fp" points to the start of data.
- */
-status_t ZipEntry::LocalFileHeader::read(FILE* fp)
-{
- status_t result = NO_ERROR;
- unsigned char buf[kLFHLen];
-
- assert(mFileName == NULL);
- assert(mExtraField == NULL);
-
- if (fread(buf, 1, kLFHLen, fp) != kLFHLen) {
- result = UNKNOWN_ERROR;
- goto bail;
- }
-
- if (ZipEntry::getLongLE(&buf[0x00]) != kSignature) {
- ALOGD("whoops: didn't find expected signature\n");
- result = UNKNOWN_ERROR;
- goto bail;
- }
-
- mVersionToExtract = ZipEntry::getShortLE(&buf[0x04]);
- mGPBitFlag = ZipEntry::getShortLE(&buf[0x06]);
- mCompressionMethod = ZipEntry::getShortLE(&buf[0x08]);
- mLastModFileTime = ZipEntry::getShortLE(&buf[0x0a]);
- mLastModFileDate = ZipEntry::getShortLE(&buf[0x0c]);
- mCRC32 = ZipEntry::getLongLE(&buf[0x0e]);
- mCompressedSize = ZipEntry::getLongLE(&buf[0x12]);
- mUncompressedSize = ZipEntry::getLongLE(&buf[0x16]);
- mFileNameLength = ZipEntry::getShortLE(&buf[0x1a]);
- mExtraFieldLength = ZipEntry::getShortLE(&buf[0x1c]);
-
- // TODO: validate sizes
-
- /* grab filename */
- if (mFileNameLength != 0) {
- mFileName = new unsigned char[mFileNameLength+1];
- if (mFileName == NULL) {
- result = NO_MEMORY;
- goto bail;
- }
- if (fread(mFileName, 1, mFileNameLength, fp) != mFileNameLength) {
- result = UNKNOWN_ERROR;
- goto bail;
- }
- mFileName[mFileNameLength] = '\0';
- }
-
- /* grab extra field */
- if (mExtraFieldLength != 0) {
- mExtraField = new unsigned char[mExtraFieldLength+1];
- if (mExtraField == NULL) {
- result = NO_MEMORY;
- goto bail;
- }
- if (fread(mExtraField, 1, mExtraFieldLength, fp) != mExtraFieldLength) {
- result = UNKNOWN_ERROR;
- goto bail;
- }
- mExtraField[mExtraFieldLength] = '\0';
- }
-
-bail:
- return result;
-}
-
-/*
- * Write a local file header.
- */
-status_t ZipEntry::LocalFileHeader::write(FILE* fp)
-{
- unsigned char buf[kLFHLen];
-
- ZipEntry::putLongLE(&buf[0x00], kSignature);
- ZipEntry::putShortLE(&buf[0x04], mVersionToExtract);
- ZipEntry::putShortLE(&buf[0x06], mGPBitFlag);
- ZipEntry::putShortLE(&buf[0x08], mCompressionMethod);
- ZipEntry::putShortLE(&buf[0x0a], mLastModFileTime);
- ZipEntry::putShortLE(&buf[0x0c], mLastModFileDate);
- ZipEntry::putLongLE(&buf[0x0e], mCRC32);
- ZipEntry::putLongLE(&buf[0x12], mCompressedSize);
- ZipEntry::putLongLE(&buf[0x16], mUncompressedSize);
- ZipEntry::putShortLE(&buf[0x1a], mFileNameLength);
- ZipEntry::putShortLE(&buf[0x1c], mExtraFieldLength);
-
- if (fwrite(buf, 1, kLFHLen, fp) != kLFHLen)
- return UNKNOWN_ERROR;
-
- /* write filename */
- if (mFileNameLength != 0) {
- if (fwrite(mFileName, 1, mFileNameLength, fp) != mFileNameLength)
- return UNKNOWN_ERROR;
- }
-
- /* write "extra field" */
- if (mExtraFieldLength != 0) {
- if (fwrite(mExtraField, 1, mExtraFieldLength, fp) != mExtraFieldLength)
- return UNKNOWN_ERROR;
- }
-
- return NO_ERROR;
-}
-
-
-/*
- * Dump the contents of a LocalFileHeader object.
- */
-void ZipEntry::LocalFileHeader::dump(void) const
-{
- ALOGD(" LocalFileHeader contents:\n");
- ALOGD(" versToExt=%u gpBits=0x%04x compression=%u\n",
- mVersionToExtract, mGPBitFlag, mCompressionMethod);
- ALOGD(" modTime=0x%04x modDate=0x%04x crc32=0x%08lx\n",
- mLastModFileTime, mLastModFileDate, mCRC32);
- ALOGD(" compressedSize=%lu uncompressedSize=%lu\n",
- mCompressedSize, mUncompressedSize);
- ALOGD(" filenameLen=%u extraLen=%u\n",
- mFileNameLength, mExtraFieldLength);
- if (mFileName != NULL)
- ALOGD(" filename: '%s'\n", mFileName);
-}
-
-
-/*
- * ===========================================================================
- * ZipEntry::CentralDirEntry
- * ===========================================================================
- */
-
-/*
- * Read the central dir entry that appears next in the file.
- *
- * On entry, "fp" should be positioned on the signature bytes for the
- * entry. On exit, "fp" will point at the signature word for the next
- * entry or for the EOCD.
- */
-status_t ZipEntry::CentralDirEntry::read(FILE* fp)
-{
- status_t result = NO_ERROR;
- unsigned char buf[kCDELen];
-
- /* no re-use */
- assert(mFileName == NULL);
- assert(mExtraField == NULL);
- assert(mFileComment == NULL);
-
- if (fread(buf, 1, kCDELen, fp) != kCDELen) {
- result = UNKNOWN_ERROR;
- goto bail;
- }
-
- if (ZipEntry::getLongLE(&buf[0x00]) != kSignature) {
- ALOGD("Whoops: didn't find expected signature\n");
- result = UNKNOWN_ERROR;
- goto bail;
- }
-
- mVersionMadeBy = ZipEntry::getShortLE(&buf[0x04]);
- mVersionToExtract = ZipEntry::getShortLE(&buf[0x06]);
- mGPBitFlag = ZipEntry::getShortLE(&buf[0x08]);
- mCompressionMethod = ZipEntry::getShortLE(&buf[0x0a]);
- mLastModFileTime = ZipEntry::getShortLE(&buf[0x0c]);
- mLastModFileDate = ZipEntry::getShortLE(&buf[0x0e]);
- mCRC32 = ZipEntry::getLongLE(&buf[0x10]);
- mCompressedSize = ZipEntry::getLongLE(&buf[0x14]);
- mUncompressedSize = ZipEntry::getLongLE(&buf[0x18]);
- mFileNameLength = ZipEntry::getShortLE(&buf[0x1c]);
- mExtraFieldLength = ZipEntry::getShortLE(&buf[0x1e]);
- mFileCommentLength = ZipEntry::getShortLE(&buf[0x20]);
- mDiskNumberStart = ZipEntry::getShortLE(&buf[0x22]);
- mInternalAttrs = ZipEntry::getShortLE(&buf[0x24]);
- mExternalAttrs = ZipEntry::getLongLE(&buf[0x26]);
- mLocalHeaderRelOffset = ZipEntry::getLongLE(&buf[0x2a]);
-
- // TODO: validate sizes and offsets
-
- /* grab filename */
- if (mFileNameLength != 0) {
- mFileName = new unsigned char[mFileNameLength+1];
- if (mFileName == NULL) {
- result = NO_MEMORY;
- goto bail;
- }
- if (fread(mFileName, 1, mFileNameLength, fp) != mFileNameLength) {
- result = UNKNOWN_ERROR;
- goto bail;
- }
- mFileName[mFileNameLength] = '\0';
- }
-
- /* read "extra field" */
- if (mExtraFieldLength != 0) {
- mExtraField = new unsigned char[mExtraFieldLength+1];
- if (mExtraField == NULL) {
- result = NO_MEMORY;
- goto bail;
- }
- if (fread(mExtraField, 1, mExtraFieldLength, fp) != mExtraFieldLength) {
- result = UNKNOWN_ERROR;
- goto bail;
- }
- mExtraField[mExtraFieldLength] = '\0';
- }
-
-
- /* grab comment, if any */
- if (mFileCommentLength != 0) {
- mFileComment = new unsigned char[mFileCommentLength+1];
- if (mFileComment == NULL) {
- result = NO_MEMORY;
- goto bail;
- }
- if (fread(mFileComment, 1, mFileCommentLength, fp) != mFileCommentLength)
- {
- result = UNKNOWN_ERROR;
- goto bail;
- }
- mFileComment[mFileCommentLength] = '\0';
- }
-
-bail:
- return result;
-}
-
-/*
- * Write a central dir entry.
- */
-status_t ZipEntry::CentralDirEntry::write(FILE* fp)
-{
- unsigned char buf[kCDELen];
-
- ZipEntry::putLongLE(&buf[0x00], kSignature);
- ZipEntry::putShortLE(&buf[0x04], mVersionMadeBy);
- ZipEntry::putShortLE(&buf[0x06], mVersionToExtract);
- ZipEntry::putShortLE(&buf[0x08], mGPBitFlag);
- ZipEntry::putShortLE(&buf[0x0a], mCompressionMethod);
- ZipEntry::putShortLE(&buf[0x0c], mLastModFileTime);
- ZipEntry::putShortLE(&buf[0x0e], mLastModFileDate);
- ZipEntry::putLongLE(&buf[0x10], mCRC32);
- ZipEntry::putLongLE(&buf[0x14], mCompressedSize);
- ZipEntry::putLongLE(&buf[0x18], mUncompressedSize);
- ZipEntry::putShortLE(&buf[0x1c], mFileNameLength);
- ZipEntry::putShortLE(&buf[0x1e], mExtraFieldLength);
- ZipEntry::putShortLE(&buf[0x20], mFileCommentLength);
- ZipEntry::putShortLE(&buf[0x22], mDiskNumberStart);
- ZipEntry::putShortLE(&buf[0x24], mInternalAttrs);
- ZipEntry::putLongLE(&buf[0x26], mExternalAttrs);
- ZipEntry::putLongLE(&buf[0x2a], mLocalHeaderRelOffset);
-
- if (fwrite(buf, 1, kCDELen, fp) != kCDELen)
- return UNKNOWN_ERROR;
-
- /* write filename */
- if (mFileNameLength != 0) {
- if (fwrite(mFileName, 1, mFileNameLength, fp) != mFileNameLength)
- return UNKNOWN_ERROR;
- }
-
- /* write "extra field" */
- if (mExtraFieldLength != 0) {
- if (fwrite(mExtraField, 1, mExtraFieldLength, fp) != mExtraFieldLength)
- return UNKNOWN_ERROR;
- }
-
- /* write comment */
- if (mFileCommentLength != 0) {
- if (fwrite(mFileComment, 1, mFileCommentLength, fp) != mFileCommentLength)
- return UNKNOWN_ERROR;
- }
-
- return NO_ERROR;
-}
-
-/*
- * Dump the contents of a CentralDirEntry object.
- */
-void ZipEntry::CentralDirEntry::dump(void) const
-{
- ALOGD(" CentralDirEntry contents:\n");
- ALOGD(" versMadeBy=%u versToExt=%u gpBits=0x%04x compression=%u\n",
- mVersionMadeBy, mVersionToExtract, mGPBitFlag, mCompressionMethod);
- ALOGD(" modTime=0x%04x modDate=0x%04x crc32=0x%08lx\n",
- mLastModFileTime, mLastModFileDate, mCRC32);
- ALOGD(" compressedSize=%lu uncompressedSize=%lu\n",
- mCompressedSize, mUncompressedSize);
- ALOGD(" filenameLen=%u extraLen=%u commentLen=%u\n",
- mFileNameLength, mExtraFieldLength, mFileCommentLength);
- ALOGD(" diskNumStart=%u intAttr=0x%04x extAttr=0x%08lx relOffset=%lu\n",
- mDiskNumberStart, mInternalAttrs, mExternalAttrs,
- mLocalHeaderRelOffset);
-
- if (mFileName != NULL)
- ALOGD(" filename: '%s'\n", mFileName);
- if (mFileComment != NULL)
- ALOGD(" comment: '%s'\n", mFileComment);
-}
-
diff --git a/tools/aapt/ZipEntry.h b/tools/aapt/ZipEntry.h
deleted file mode 100644
index c2f3227..0000000
--- a/tools/aapt/ZipEntry.h
+++ /dev/null
@@ -1,345 +0,0 @@
-/*
- * Copyright (C) 2006 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-//
-// Zip archive entries.
-//
-// The ZipEntry class is tightly meshed with the ZipFile class.
-//
-#ifndef __LIBS_ZIPENTRY_H
-#define __LIBS_ZIPENTRY_H
-
-#include <utils/Errors.h>
-
-#include <stdlib.h>
-#include <stdio.h>
-
-namespace android {
-
-class ZipFile;
-
-/*
- * ZipEntry objects represent a single entry in a Zip archive.
- *
- * You can use one of these to get or set information about an entry, but
- * there are no functions here for accessing the data itself. (We could
- * tuck a pointer to the ZipFile in here for convenience, but that raises
- * the likelihood of using ZipEntry objects after discarding the ZipFile.)
- *
- * File information is stored in two places: next to the file data (the Local
- * File Header, and possibly a Data Descriptor), and at the end of the file
- * (the Central Directory Entry). The two must be kept in sync.
- */
-class ZipEntry {
-public:
- friend class ZipFile;
-
- ZipEntry(void)
- : mDeleted(false), mMarked(false)
- {}
- ~ZipEntry(void) {}
-
- /*
- * Returns "true" if the data is compressed.
- */
- bool isCompressed(void) const {
- return mCDE.mCompressionMethod != kCompressStored;
- }
- int getCompressionMethod(void) const { return mCDE.mCompressionMethod; }
-
- /*
- * Return the uncompressed length.
- */
- off_t getUncompressedLen(void) const { return mCDE.mUncompressedSize; }
-
- /*
- * Return the compressed length. For uncompressed data, this returns
- * the same thing as getUncompresesdLen().
- */
- off_t getCompressedLen(void) const { return mCDE.mCompressedSize; }
-
- /*
- * Return the offset of the local file header.
- */
- off_t getLFHOffset(void) const { return mCDE.mLocalHeaderRelOffset; }
-
- /*
- * Return the absolute file offset of the start of the compressed or
- * uncompressed data.
- */
- off_t getFileOffset(void) const {
- return mCDE.mLocalHeaderRelOffset +
- LocalFileHeader::kLFHLen +
- mLFH.mFileNameLength +
- mLFH.mExtraFieldLength;
- }
-
- /*
- * Return the data CRC.
- */
- unsigned long getCRC32(void) const { return mCDE.mCRC32; }
-
- /*
- * Return file modification time in UNIX seconds-since-epoch.
- */
- time_t getModWhen(void) const;
-
- /*
- * Return the archived file name.
- */
- const char* getFileName(void) const { return (const char*) mCDE.mFileName; }
-
- /*
- * Application-defined "mark". Can be useful when synchronizing the
- * contents of an archive with contents on disk.
- */
- bool getMarked(void) const { return mMarked; }
- void setMarked(bool val) { mMarked = val; }
-
- /*
- * Some basic functions for raw data manipulation. "LE" means
- * Little Endian.
- */
- static inline unsigned short getShortLE(const unsigned char* buf) {
- return buf[0] | (buf[1] << 8);
- }
- static inline unsigned long getLongLE(const unsigned char* buf) {
- return buf[0] | (buf[1] << 8) | (buf[2] << 16) | (buf[3] << 24);
- }
- static inline void putShortLE(unsigned char* buf, short val) {
- buf[0] = (unsigned char) val;
- buf[1] = (unsigned char) (val >> 8);
- }
- static inline void putLongLE(unsigned char* buf, long val) {
- buf[0] = (unsigned char) val;
- buf[1] = (unsigned char) (val >> 8);
- buf[2] = (unsigned char) (val >> 16);
- buf[3] = (unsigned char) (val >> 24);
- }
-
- /* defined for Zip archives */
- enum {
- kCompressStored = 0, // no compression
- // shrunk = 1,
- // reduced 1 = 2,
- // reduced 2 = 3,
- // reduced 3 = 4,
- // reduced 4 = 5,
- // imploded = 6,
- // tokenized = 7,
- kCompressDeflated = 8, // standard deflate
- // Deflate64 = 9,
- // lib imploded = 10,
- // reserved = 11,
- // bzip2 = 12,
- };
-
- /*
- * Deletion flag. If set, the entry will be removed on the next
- * call to "flush".
- */
- bool getDeleted(void) const { return mDeleted; }
-
-protected:
- /*
- * Initialize the structure from the file, which is pointing at
- * our Central Directory entry.
- */
- status_t initFromCDE(FILE* fp);
-
- /*
- * Initialize the structure for a new file. We need the filename
- * and comment so that we can properly size the LFH area. The
- * filename is mandatory, the comment is optional.
- */
- void initNew(const char* fileName, const char* comment);
-
- /*
- * Initialize the structure with the contents of a ZipEntry from
- * another file.
- */
- status_t initFromExternal(const ZipFile* pZipFile, const ZipEntry* pEntry);
-
- /*
- * Add some pad bytes to the LFH. We do this by adding or resizing
- * the "extra" field.
- */
- status_t addPadding(int padding);
-
- /*
- * Set information about the data for this entry.
- */
- void setDataInfo(long uncompLen, long compLen, unsigned long crc32,
- int compressionMethod);
-
- /*
- * Set the modification date.
- */
- void setModWhen(time_t when);
-
- /*
- * Set the offset of the local file header, relative to the start of
- * the current file.
- */
- void setLFHOffset(off_t offset) {
- mCDE.mLocalHeaderRelOffset = (long) offset;
- }
-
- /* mark for deletion; used by ZipFile::remove() */
- void setDeleted(void) { mDeleted = true; }
-
-private:
- /* these are private and not defined */
- ZipEntry(const ZipEntry& src);
- ZipEntry& operator=(const ZipEntry& src);
-
- /* returns "true" if the CDE and the LFH agree */
- bool compareHeaders(void) const;
- void copyCDEtoLFH(void);
-
- bool mDeleted; // set if entry is pending deletion
- bool mMarked; // app-defined marker
-
- /*
- * Every entry in the Zip archive starts off with one of these.
- */
- class LocalFileHeader {
- public:
- LocalFileHeader(void) :
- mVersionToExtract(0),
- mGPBitFlag(0),
- mCompressionMethod(0),
- mLastModFileTime(0),
- mLastModFileDate(0),
- mCRC32(0),
- mCompressedSize(0),
- mUncompressedSize(0),
- mFileNameLength(0),
- mExtraFieldLength(0),
- mFileName(NULL),
- mExtraField(NULL)
- {}
- virtual ~LocalFileHeader(void) {
- delete[] mFileName;
- delete[] mExtraField;
- }
-
- status_t read(FILE* fp);
- status_t write(FILE* fp);
-
- // unsigned long mSignature;
- unsigned short mVersionToExtract;
- unsigned short mGPBitFlag;
- unsigned short mCompressionMethod;
- unsigned short mLastModFileTime;
- unsigned short mLastModFileDate;
- unsigned long mCRC32;
- unsigned long mCompressedSize;
- unsigned long mUncompressedSize;
- unsigned short mFileNameLength;
- unsigned short mExtraFieldLength;
- unsigned char* mFileName;
- unsigned char* mExtraField;
-
- enum {
- kSignature = 0x04034b50,
- kLFHLen = 30, // LocalFileHdr len, excl. var fields
- };
-
- void dump(void) const;
- };
-
- /*
- * Every entry in the Zip archive has one of these in the "central
- * directory" at the end of the file.
- */
- class CentralDirEntry {
- public:
- CentralDirEntry(void) :
- mVersionMadeBy(0),
- mVersionToExtract(0),
- mGPBitFlag(0),
- mCompressionMethod(0),
- mLastModFileTime(0),
- mLastModFileDate(0),
- mCRC32(0),
- mCompressedSize(0),
- mUncompressedSize(0),
- mFileNameLength(0),
- mExtraFieldLength(0),
- mFileCommentLength(0),
- mDiskNumberStart(0),
- mInternalAttrs(0),
- mExternalAttrs(0),
- mLocalHeaderRelOffset(0),
- mFileName(NULL),
- mExtraField(NULL),
- mFileComment(NULL)
- {}
- virtual ~CentralDirEntry(void) {
- delete[] mFileName;
- delete[] mExtraField;
- delete[] mFileComment;
- }
-
- status_t read(FILE* fp);
- status_t write(FILE* fp);
-
- // unsigned long mSignature;
- unsigned short mVersionMadeBy;
- unsigned short mVersionToExtract;
- unsigned short mGPBitFlag;
- unsigned short mCompressionMethod;
- unsigned short mLastModFileTime;
- unsigned short mLastModFileDate;
- unsigned long mCRC32;
- unsigned long mCompressedSize;
- unsigned long mUncompressedSize;
- unsigned short mFileNameLength;
- unsigned short mExtraFieldLength;
- unsigned short mFileCommentLength;
- unsigned short mDiskNumberStart;
- unsigned short mInternalAttrs;
- unsigned long mExternalAttrs;
- unsigned long mLocalHeaderRelOffset;
- unsigned char* mFileName;
- unsigned char* mExtraField;
- unsigned char* mFileComment;
-
- void dump(void) const;
-
- enum {
- kSignature = 0x02014b50,
- kCDELen = 46, // CentralDirEnt len, excl. var fields
- };
- };
-
- enum {
- //kDataDescriptorSignature = 0x08074b50, // currently unused
- kDataDescriptorLen = 16, // four 32-bit fields
-
- kDefaultVersion = 20, // need deflate, nothing much else
- kDefaultMadeBy = 0x0317, // 03=UNIX, 17=spec v2.3
- kUsesDataDescr = 0x0008, // GPBitFlag bit 3
- };
-
- LocalFileHeader mLFH;
- CentralDirEntry mCDE;
-};
-
-}; // namespace android
-
-#endif // __LIBS_ZIPENTRY_H
diff --git a/tools/aapt/ZipFile.cpp b/tools/aapt/ZipFile.cpp
deleted file mode 100644
index 8057068..0000000
--- a/tools/aapt/ZipFile.cpp
+++ /dev/null
@@ -1,1297 +0,0 @@
-/*
- * Copyright (C) 2006 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-//
-// Access to Zip archives.
-//
-
-#define LOG_TAG "zip"
-
-#include <androidfw/ZipUtils.h>
-#include <utils/Log.h>
-
-#include "ZipFile.h"
-
-#include <zlib.h>
-#define DEF_MEM_LEVEL 8 // normally in zutil.h?
-
-#include <memory.h>
-#include <sys/stat.h>
-#include <errno.h>
-#include <assert.h>
-
-using namespace android;
-
-/*
- * Some environments require the "b", some choke on it.
- */
-#define FILE_OPEN_RO "rb"
-#define FILE_OPEN_RW "r+b"
-#define FILE_OPEN_RW_CREATE "w+b"
-
-/* should live somewhere else? */
-static status_t errnoToStatus(int err)
-{
- if (err == ENOENT)
- return NAME_NOT_FOUND;
- else if (err == EACCES)
- return PERMISSION_DENIED;
- else
- return UNKNOWN_ERROR;
-}
-
-/*
- * Open a file and parse its guts.
- */
-status_t ZipFile::open(const char* zipFileName, int flags)
-{
- bool newArchive = false;
-
- assert(mZipFp == NULL); // no reopen
-
- if ((flags & kOpenTruncate))
- flags |= kOpenCreate; // trunc implies create
-
- if ((flags & kOpenReadOnly) && (flags & kOpenReadWrite))
- return INVALID_OPERATION; // not both
- if (!((flags & kOpenReadOnly) || (flags & kOpenReadWrite)))
- return INVALID_OPERATION; // not neither
- if ((flags & kOpenCreate) && !(flags & kOpenReadWrite))
- return INVALID_OPERATION; // create requires write
-
- if (flags & kOpenTruncate) {
- newArchive = true;
- } else {
- newArchive = (access(zipFileName, F_OK) != 0);
- if (!(flags & kOpenCreate) && newArchive) {
- /* not creating, must already exist */
- ALOGD("File %s does not exist", zipFileName);
- return NAME_NOT_FOUND;
- }
- }
-
- /* open the file */
- const char* openflags;
- if (flags & kOpenReadWrite) {
- if (newArchive)
- openflags = FILE_OPEN_RW_CREATE;
- else
- openflags = FILE_OPEN_RW;
- } else {
- openflags = FILE_OPEN_RO;
- }
- mZipFp = fopen(zipFileName, openflags);
- if (mZipFp == NULL) {
- int err = errno;
- ALOGD("fopen failed: %d\n", err);
- return errnoToStatus(err);
- }
-
- status_t result;
- if (!newArchive) {
- /*
- * Load the central directory. If that fails, then this probably
- * isn't a Zip archive.
- */
- result = readCentralDir();
- } else {
- /*
- * Newly-created. The EndOfCentralDir constructor actually
- * sets everything to be the way we want it (all zeroes). We
- * set mNeedCDRewrite so that we create *something* if the
- * caller doesn't add any files. (We could also just unlink
- * the file if it's brand new and nothing was added, but that's
- * probably doing more than we really should -- the user might
- * have a need for empty zip files.)
- */
- mNeedCDRewrite = true;
- result = NO_ERROR;
- }
-
- if (flags & kOpenReadOnly)
- mReadOnly = true;
- else
- assert(!mReadOnly);
-
- return result;
-}
-
-/*
- * Return the Nth entry in the archive.
- */
-ZipEntry* ZipFile::getEntryByIndex(int idx) const
-{
- if (idx < 0 || idx >= (int) mEntries.size())
- return NULL;
-
- return mEntries[idx];
-}
-
-/*
- * Find an entry by name.
- */
-ZipEntry* ZipFile::getEntryByName(const char* fileName) const
-{
- /*
- * Do a stupid linear string-compare search.
- *
- * There are various ways to speed this up, especially since it's rare
- * to intermingle changes to the archive with "get by name" calls. We
- * don't want to sort the mEntries vector itself, however, because
- * it's used to recreate the Central Directory.
- *
- * (Hash table works, parallel list of pointers in sorted order is good.)
- */
- int idx;
-
- for (idx = mEntries.size()-1; idx >= 0; idx--) {
- ZipEntry* pEntry = mEntries[idx];
- if (!pEntry->getDeleted() &&
- strcmp(fileName, pEntry->getFileName()) == 0)
- {
- return pEntry;
- }
- }
-
- return NULL;
-}
-
-/*
- * Empty the mEntries vector.
- */
-void ZipFile::discardEntries(void)
-{
- int count = mEntries.size();
-
- while (--count >= 0)
- delete mEntries[count];
-
- mEntries.clear();
-}
-
-
-/*
- * Find the central directory and read the contents.
- *
- * The fun thing about ZIP archives is that they may or may not be
- * readable from start to end. In some cases, notably for archives
- * that were written to stdout, the only length information is in the
- * central directory at the end of the file.
- *
- * Of course, the central directory can be followed by a variable-length
- * comment field, so we have to scan through it backwards. The comment
- * is at most 64K, plus we have 18 bytes for the end-of-central-dir stuff
- * itself, plus apparently sometimes people throw random junk on the end
- * just for the fun of it.
- *
- * This is all a little wobbly. If the wrong value ends up in the EOCD
- * area, we're hosed. This appears to be the way that everbody handles
- * it though, so we're in pretty good company if this fails.
- */
-status_t ZipFile::readCentralDir(void)
-{
- status_t result = NO_ERROR;
- unsigned char* buf = NULL;
- off_t fileLength, seekStart;
- long readAmount;
- int i;
-
- fseek(mZipFp, 0, SEEK_END);
- fileLength = ftell(mZipFp);
- rewind(mZipFp);
-
- /* too small to be a ZIP archive? */
- if (fileLength < EndOfCentralDir::kEOCDLen) {
- ALOGD("Length is %ld -- too small\n", (long)fileLength);
- result = INVALID_OPERATION;
- goto bail;
- }
-
- buf = new unsigned char[EndOfCentralDir::kMaxEOCDSearch];
- if (buf == NULL) {
- ALOGD("Failure allocating %d bytes for EOCD search",
- EndOfCentralDir::kMaxEOCDSearch);
- result = NO_MEMORY;
- goto bail;
- }
-
- if (fileLength > EndOfCentralDir::kMaxEOCDSearch) {
- seekStart = fileLength - EndOfCentralDir::kMaxEOCDSearch;
- readAmount = EndOfCentralDir::kMaxEOCDSearch;
- } else {
- seekStart = 0;
- readAmount = (long) fileLength;
- }
- if (fseek(mZipFp, seekStart, SEEK_SET) != 0) {
- ALOGD("Failure seeking to end of zip at %ld", (long) seekStart);
- result = UNKNOWN_ERROR;
- goto bail;
- }
-
- /* read the last part of the file into the buffer */
- if (fread(buf, 1, readAmount, mZipFp) != (size_t) readAmount) {
- ALOGD("short file? wanted %ld\n", readAmount);
- result = UNKNOWN_ERROR;
- goto bail;
- }
-
- /* find the end-of-central-dir magic */
- for (i = readAmount - 4; i >= 0; i--) {
- if (buf[i] == 0x50 &&
- ZipEntry::getLongLE(&buf[i]) == EndOfCentralDir::kSignature)
- {
- ALOGV("+++ Found EOCD at buf+%d\n", i);
- break;
- }
- }
- if (i < 0) {
- ALOGD("EOCD not found, not Zip\n");
- result = INVALID_OPERATION;
- goto bail;
- }
-
- /* extract eocd values */
- result = mEOCD.readBuf(buf + i, readAmount - i);
- if (result != NO_ERROR) {
- ALOGD("Failure reading %ld bytes of EOCD values", readAmount - i);
- goto bail;
- }
- //mEOCD.dump();
-
- if (mEOCD.mDiskNumber != 0 || mEOCD.mDiskWithCentralDir != 0 ||
- mEOCD.mNumEntries != mEOCD.mTotalNumEntries)
- {
- ALOGD("Archive spanning not supported\n");
- result = INVALID_OPERATION;
- goto bail;
- }
-
- /*
- * So far so good. "mCentralDirSize" is the size in bytes of the
- * central directory, so we can just seek back that far to find it.
- * We can also seek forward mCentralDirOffset bytes from the
- * start of the file.
- *
- * We're not guaranteed to have the rest of the central dir in the
- * buffer, nor are we guaranteed that the central dir will have any
- * sort of convenient size. We need to skip to the start of it and
- * read the header, then the other goodies.
- *
- * The only thing we really need right now is the file comment, which
- * we're hoping to preserve.
- */
- if (fseek(mZipFp, mEOCD.mCentralDirOffset, SEEK_SET) != 0) {
- ALOGD("Failure seeking to central dir offset %ld\n",
- mEOCD.mCentralDirOffset);
- result = UNKNOWN_ERROR;
- goto bail;
- }
-
- /*
- * Loop through and read the central dir entries.
- */
- ALOGV("Scanning %d entries...\n", mEOCD.mTotalNumEntries);
- int entry;
- for (entry = 0; entry < mEOCD.mTotalNumEntries; entry++) {
- ZipEntry* pEntry = new ZipEntry;
-
- result = pEntry->initFromCDE(mZipFp);
- if (result != NO_ERROR) {
- ALOGD("initFromCDE failed\n");
- delete pEntry;
- goto bail;
- }
-
- mEntries.add(pEntry);
- }
-
-
- /*
- * If all went well, we should now be back at the EOCD.
- */
- {
- unsigned char checkBuf[4];
- if (fread(checkBuf, 1, 4, mZipFp) != 4) {
- ALOGD("EOCD check read failed\n");
- result = INVALID_OPERATION;
- goto bail;
- }
- if (ZipEntry::getLongLE(checkBuf) != EndOfCentralDir::kSignature) {
- ALOGD("EOCD read check failed\n");
- result = UNKNOWN_ERROR;
- goto bail;
- }
- ALOGV("+++ EOCD read check passed\n");
- }
-
-bail:
- delete[] buf;
- return result;
-}
-
-
-/*
- * Add a new file to the archive.
- *
- * This requires creating and populating a ZipEntry structure, and copying
- * the data into the file at the appropriate position. The "appropriate
- * position" is the current location of the central directory, which we
- * casually overwrite (we can put it back later).
- *
- * If we were concerned about safety, we would want to make all changes
- * in a temp file and then overwrite the original after everything was
- * safely written. Not really a concern for us.
- */
-status_t ZipFile::addCommon(const char* fileName, const void* data, size_t size,
- const char* storageName, int sourceType, int compressionMethod,
- ZipEntry** ppEntry)
-{
- ZipEntry* pEntry = NULL;
- status_t result = NO_ERROR;
- long lfhPosn, startPosn, endPosn, uncompressedLen;
- FILE* inputFp = NULL;
- unsigned long crc;
- time_t modWhen;
-
- if (mReadOnly)
- return INVALID_OPERATION;
-
- assert(compressionMethod == ZipEntry::kCompressDeflated ||
- compressionMethod == ZipEntry::kCompressStored);
-
- /* make sure we're in a reasonable state */
- assert(mZipFp != NULL);
- assert(mEntries.size() == mEOCD.mTotalNumEntries);
-
- /* make sure it doesn't already exist */
- if (getEntryByName(storageName) != NULL)
- return ALREADY_EXISTS;
-
- if (!data) {
- inputFp = fopen(fileName, FILE_OPEN_RO);
- if (inputFp == NULL)
- return errnoToStatus(errno);
- }
-
- if (fseek(mZipFp, mEOCD.mCentralDirOffset, SEEK_SET) != 0) {
- result = UNKNOWN_ERROR;
- goto bail;
- }
-
- pEntry = new ZipEntry;
- pEntry->initNew(storageName, NULL);
-
- /*
- * From here on out, failures are more interesting.
- */
- mNeedCDRewrite = true;
-
- /*
- * Write the LFH, even though it's still mostly blank. We need it
- * as a place-holder. In theory the LFH isn't necessary, but in
- * practice some utilities demand it.
- */
- lfhPosn = ftell(mZipFp);
- pEntry->mLFH.write(mZipFp);
- startPosn = ftell(mZipFp);
-
- /*
- * Copy the data in, possibly compressing it as we go.
- */
- if (sourceType == ZipEntry::kCompressStored) {
- if (compressionMethod == ZipEntry::kCompressDeflated) {
- bool failed = false;
- result = compressFpToFp(mZipFp, inputFp, data, size, &crc);
- if (result != NO_ERROR) {
- ALOGD("compression failed, storing\n");
- failed = true;
- } else {
- /*
- * Make sure it has compressed "enough". This probably ought
- * to be set through an API call, but I don't expect our
- * criteria to change over time.
- */
- long src = inputFp ? ftell(inputFp) : size;
- long dst = ftell(mZipFp) - startPosn;
- if (dst + (dst / 10) > src) {
- ALOGD("insufficient compression (src=%ld dst=%ld), storing\n",
- src, dst);
- failed = true;
- }
- }
-
- if (failed) {
- compressionMethod = ZipEntry::kCompressStored;
- if (inputFp) rewind(inputFp);
- fseek(mZipFp, startPosn, SEEK_SET);
- /* fall through to kCompressStored case */
- }
- }
- /* handle "no compression" request, or failed compression from above */
- if (compressionMethod == ZipEntry::kCompressStored) {
- if (inputFp) {
- result = copyFpToFp(mZipFp, inputFp, &crc);
- } else {
- result = copyDataToFp(mZipFp, data, size, &crc);
- }
- if (result != NO_ERROR) {
- // don't need to truncate; happens in CDE rewrite
- ALOGD("failed copying data in\n");
- goto bail;
- }
- }
-
- // currently seeked to end of file
- uncompressedLen = inputFp ? ftell(inputFp) : size;
- } else if (sourceType == ZipEntry::kCompressDeflated) {
- /* we should support uncompressed-from-compressed, but it's not
- * important right now */
- assert(compressionMethod == ZipEntry::kCompressDeflated);
-
- bool scanResult;
- int method;
- long compressedLen;
-
- scanResult = ZipUtils::examineGzip(inputFp, &method, &uncompressedLen,
- &compressedLen, &crc);
- if (!scanResult || method != ZipEntry::kCompressDeflated) {
- ALOGD("this isn't a deflated gzip file?");
- result = UNKNOWN_ERROR;
- goto bail;
- }
-
- result = copyPartialFpToFp(mZipFp, inputFp, compressedLen, NULL);
- if (result != NO_ERROR) {
- ALOGD("failed copying gzip data in\n");
- goto bail;
- }
- } else {
- assert(false);
- result = UNKNOWN_ERROR;
- goto bail;
- }
-
- /*
- * We could write the "Data Descriptor", but there doesn't seem to
- * be any point since we're going to go back and write the LFH.
- *
- * Update file offsets.
- */
- endPosn = ftell(mZipFp); // seeked to end of compressed data
-
- /*
- * Success! Fill out new values.
- */
- pEntry->setDataInfo(uncompressedLen, endPosn - startPosn, crc,
- compressionMethod);
- modWhen = getModTime(inputFp ? fileno(inputFp) : fileno(mZipFp));
- pEntry->setModWhen(modWhen);
- pEntry->setLFHOffset(lfhPosn);
- mEOCD.mNumEntries++;
- mEOCD.mTotalNumEntries++;
- mEOCD.mCentralDirSize = 0; // mark invalid; set by flush()
- mEOCD.mCentralDirOffset = endPosn;
-
- /*
- * Go back and write the LFH.
- */
- if (fseek(mZipFp, lfhPosn, SEEK_SET) != 0) {
- result = UNKNOWN_ERROR;
- goto bail;
- }
- pEntry->mLFH.write(mZipFp);
-
- /*
- * Add pEntry to the list.
- */
- mEntries.add(pEntry);
- if (ppEntry != NULL)
- *ppEntry = pEntry;
- pEntry = NULL;
-
-bail:
- if (inputFp != NULL)
- fclose(inputFp);
- delete pEntry;
- return result;
-}
-
-/*
- * Add an entry by copying it from another zip file. If "padding" is
- * nonzero, the specified number of bytes will be added to the "extra"
- * field in the header.
- *
- * If "ppEntry" is non-NULL, a pointer to the new entry will be returned.
- */
-status_t ZipFile::add(const ZipFile* pSourceZip, const ZipEntry* pSourceEntry,
- int padding, ZipEntry** ppEntry)
-{
- ZipEntry* pEntry = NULL;
- status_t result;
- long lfhPosn, endPosn;
-
- if (mReadOnly)
- return INVALID_OPERATION;
-
- /* make sure we're in a reasonable state */
- assert(mZipFp != NULL);
- assert(mEntries.size() == mEOCD.mTotalNumEntries);
-
- if (fseek(mZipFp, mEOCD.mCentralDirOffset, SEEK_SET) != 0) {
- result = UNKNOWN_ERROR;
- goto bail;
- }
-
- pEntry = new ZipEntry;
- if (pEntry == NULL) {
- result = NO_MEMORY;
- goto bail;
- }
-
- result = pEntry->initFromExternal(pSourceZip, pSourceEntry);
- if (result != NO_ERROR)
- goto bail;
- if (padding != 0) {
- result = pEntry->addPadding(padding);
- if (result != NO_ERROR)
- goto bail;
- }
-
- /*
- * From here on out, failures are more interesting.
- */
- mNeedCDRewrite = true;
-
- /*
- * Write the LFH. Since we're not recompressing the data, we already
- * have all of the fields filled out.
- */
- lfhPosn = ftell(mZipFp);
- pEntry->mLFH.write(mZipFp);
-
- /*
- * Copy the data over.
- *
- * If the "has data descriptor" flag is set, we want to copy the DD
- * fields as well. This is a fixed-size area immediately following
- * the data.
- */
- if (fseek(pSourceZip->mZipFp, pSourceEntry->getFileOffset(), SEEK_SET) != 0)
- {
- result = UNKNOWN_ERROR;
- goto bail;
- }
-
- off_t copyLen;
- copyLen = pSourceEntry->getCompressedLen();
- if ((pSourceEntry->mLFH.mGPBitFlag & ZipEntry::kUsesDataDescr) != 0)
- copyLen += ZipEntry::kDataDescriptorLen;
-
- if (copyPartialFpToFp(mZipFp, pSourceZip->mZipFp, copyLen, NULL)
- != NO_ERROR)
- {
- ALOGW("copy of '%s' failed\n", pEntry->mCDE.mFileName);
- result = UNKNOWN_ERROR;
- goto bail;
- }
-
- /*
- * Update file offsets.
- */
- endPosn = ftell(mZipFp);
-
- /*
- * Success! Fill out new values.
- */
- pEntry->setLFHOffset(lfhPosn); // sets mCDE.mLocalHeaderRelOffset
- mEOCD.mNumEntries++;
- mEOCD.mTotalNumEntries++;
- mEOCD.mCentralDirSize = 0; // mark invalid; set by flush()
- mEOCD.mCentralDirOffset = endPosn;
-
- /*
- * Add pEntry to the list.
- */
- mEntries.add(pEntry);
- if (ppEntry != NULL)
- *ppEntry = pEntry;
- pEntry = NULL;
-
- result = NO_ERROR;
-
-bail:
- delete pEntry;
- return result;
-}
-
-/*
- * Copy all of the bytes in "src" to "dst".
- *
- * On exit, "srcFp" will be seeked to the end of the file, and "dstFp"
- * will be seeked immediately past the data.
- */
-status_t ZipFile::copyFpToFp(FILE* dstFp, FILE* srcFp, unsigned long* pCRC32)
-{
- unsigned char tmpBuf[32768];
- size_t count;
-
- *pCRC32 = crc32(0L, Z_NULL, 0);
-
- while (1) {
- count = fread(tmpBuf, 1, sizeof(tmpBuf), srcFp);
- if (ferror(srcFp) || ferror(dstFp))
- return errnoToStatus(errno);
- if (count == 0)
- break;
-
- *pCRC32 = crc32(*pCRC32, tmpBuf, count);
-
- if (fwrite(tmpBuf, 1, count, dstFp) != count) {
- ALOGD("fwrite %d bytes failed\n", (int) count);
- return UNKNOWN_ERROR;
- }
- }
-
- return NO_ERROR;
-}
-
-/*
- * Copy all of the bytes in "src" to "dst".
- *
- * On exit, "dstFp" will be seeked immediately past the data.
- */
-status_t ZipFile::copyDataToFp(FILE* dstFp,
- const void* data, size_t size, unsigned long* pCRC32)
-{
- size_t count;
-
- *pCRC32 = crc32(0L, Z_NULL, 0);
- if (size > 0) {
- *pCRC32 = crc32(*pCRC32, (const unsigned char*)data, size);
- if (fwrite(data, 1, size, dstFp) != size) {
- ALOGD("fwrite %d bytes failed\n", (int) size);
- return UNKNOWN_ERROR;
- }
- }
-
- return NO_ERROR;
-}
-
-/*
- * Copy some of the bytes in "src" to "dst".
- *
- * If "pCRC32" is NULL, the CRC will not be computed.
- *
- * On exit, "srcFp" will be seeked to the end of the file, and "dstFp"
- * will be seeked immediately past the data just written.
- */
-status_t ZipFile::copyPartialFpToFp(FILE* dstFp, FILE* srcFp, long length,
- unsigned long* pCRC32)
-{
- unsigned char tmpBuf[32768];
- size_t count;
-
- if (pCRC32 != NULL)
- *pCRC32 = crc32(0L, Z_NULL, 0);
-
- while (length) {
- long readSize;
-
- readSize = sizeof(tmpBuf);
- if (readSize > length)
- readSize = length;
-
- count = fread(tmpBuf, 1, readSize, srcFp);
- if ((long) count != readSize) { // error or unexpected EOF
- ALOGD("fread %d bytes failed\n", (int) readSize);
- return UNKNOWN_ERROR;
- }
-
- if (pCRC32 != NULL)
- *pCRC32 = crc32(*pCRC32, tmpBuf, count);
-
- if (fwrite(tmpBuf, 1, count, dstFp) != count) {
- ALOGD("fwrite %d bytes failed\n", (int) count);
- return UNKNOWN_ERROR;
- }
-
- length -= readSize;
- }
-
- return NO_ERROR;
-}
-
-/*
- * Compress all of the data in "srcFp" and write it to "dstFp".
- *
- * On exit, "srcFp" will be seeked to the end of the file, and "dstFp"
- * will be seeked immediately past the compressed data.
- */
-status_t ZipFile::compressFpToFp(FILE* dstFp, FILE* srcFp,
- const void* data, size_t size, unsigned long* pCRC32)
-{
- status_t result = NO_ERROR;
- const size_t kBufSize = 32768;
- unsigned char* inBuf = NULL;
- unsigned char* outBuf = NULL;
- z_stream zstream;
- bool atEof = false; // no feof() aviailable yet
- unsigned long crc;
- int zerr;
-
- /*
- * Create an input buffer and an output buffer.
- */
- inBuf = new unsigned char[kBufSize];
- outBuf = new unsigned char[kBufSize];
- if (inBuf == NULL || outBuf == NULL) {
- result = NO_MEMORY;
- goto bail;
- }
-
- /*
- * Initialize the zlib stream.
- */
- memset(&zstream, 0, sizeof(zstream));
- zstream.zalloc = Z_NULL;
- zstream.zfree = Z_NULL;
- zstream.opaque = Z_NULL;
- zstream.next_in = NULL;
- zstream.avail_in = 0;
- zstream.next_out = outBuf;
- zstream.avail_out = kBufSize;
- zstream.data_type = Z_UNKNOWN;
-
- zerr = deflateInit2(&zstream, Z_BEST_COMPRESSION,
- Z_DEFLATED, -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY);
- if (zerr != Z_OK) {
- result = UNKNOWN_ERROR;
- if (zerr == Z_VERSION_ERROR) {
- ALOGE("Installed zlib is not compatible with linked version (%s)\n",
- ZLIB_VERSION);
- } else {
- ALOGD("Call to deflateInit2 failed (zerr=%d)\n", zerr);
- }
- goto bail;
- }
-
- crc = crc32(0L, Z_NULL, 0);
-
- /*
- * Loop while we have data.
- */
- do {
- size_t getSize;
- int flush;
-
- /* only read if the input buffer is empty */
- if (zstream.avail_in == 0 && !atEof) {
- ALOGV("+++ reading %d bytes\n", (int)kBufSize);
- if (data) {
- getSize = size > kBufSize ? kBufSize : size;
- memcpy(inBuf, data, getSize);
- data = ((const char*)data) + getSize;
- size -= getSize;
- } else {
- getSize = fread(inBuf, 1, kBufSize, srcFp);
- if (ferror(srcFp)) {
- ALOGD("deflate read failed (errno=%d)\n", errno);
- goto z_bail;
- }
- }
- if (getSize < kBufSize) {
- ALOGV("+++ got %d bytes, EOF reached\n",
- (int)getSize);
- atEof = true;
- }
-
- crc = crc32(crc, inBuf, getSize);
-
- zstream.next_in = inBuf;
- zstream.avail_in = getSize;
- }
-
- if (atEof)
- flush = Z_FINISH; /* tell zlib that we're done */
- else
- flush = Z_NO_FLUSH; /* more to come! */
-
- zerr = deflate(&zstream, flush);
- if (zerr != Z_OK && zerr != Z_STREAM_END) {
- ALOGD("zlib deflate call failed (zerr=%d)\n", zerr);
- result = UNKNOWN_ERROR;
- goto z_bail;
- }
-
- /* write when we're full or when we're done */
- if (zstream.avail_out == 0 ||
- (zerr == Z_STREAM_END && zstream.avail_out != (uInt) kBufSize))
- {
- ALOGV("+++ writing %d bytes\n", (int) (zstream.next_out - outBuf));
- if (fwrite(outBuf, 1, zstream.next_out - outBuf, dstFp) !=
- (size_t)(zstream.next_out - outBuf))
- {
- ALOGD("write %d failed in deflate\n",
- (int) (zstream.next_out - outBuf));
- goto z_bail;
- }
-
- zstream.next_out = outBuf;
- zstream.avail_out = kBufSize;
- }
- } while (zerr == Z_OK);
-
- assert(zerr == Z_STREAM_END); /* other errors should've been caught */
-
- *pCRC32 = crc;
-
-z_bail:
- deflateEnd(&zstream); /* free up any allocated structures */
-
-bail:
- delete[] inBuf;
- delete[] outBuf;
-
- return result;
-}
-
-/*
- * Mark an entry as deleted.
- *
- * We will eventually need to crunch the file down, but if several files
- * are being removed (perhaps as part of an "update" process) we can make
- * things considerably faster by deferring the removal to "flush" time.
- */
-status_t ZipFile::remove(ZipEntry* pEntry)
-{
- /*
- * Should verify that pEntry is actually part of this archive, and
- * not some stray ZipEntry from a different file.
- */
-
- /* mark entry as deleted, and mark archive as dirty */
- pEntry->setDeleted();
- mNeedCDRewrite = true;
- return NO_ERROR;
-}
-
-/*
- * Flush any pending writes.
- *
- * In particular, this will crunch out deleted entries, and write the
- * Central Directory and EOCD if we have stomped on them.
- */
-status_t ZipFile::flush(void)
-{
- status_t result = NO_ERROR;
- long eocdPosn;
- int i, count;
-
- if (mReadOnly)
- return INVALID_OPERATION;
- if (!mNeedCDRewrite)
- return NO_ERROR;
-
- assert(mZipFp != NULL);
-
- result = crunchArchive();
- if (result != NO_ERROR)
- return result;
-
- if (fseek(mZipFp, mEOCD.mCentralDirOffset, SEEK_SET) != 0)
- return UNKNOWN_ERROR;
-
- count = mEntries.size();
- for (i = 0; i < count; i++) {
- ZipEntry* pEntry = mEntries[i];
- pEntry->mCDE.write(mZipFp);
- }
-
- eocdPosn = ftell(mZipFp);
- mEOCD.mCentralDirSize = eocdPosn - mEOCD.mCentralDirOffset;
-
- mEOCD.write(mZipFp);
-
- /*
- * If we had some stuff bloat up during compression and get replaced
- * with plain files, or if we deleted some entries, there's a lot
- * of wasted space at the end of the file. Remove it now.
- */
- if (ftruncate(fileno(mZipFp), ftell(mZipFp)) != 0) {
- ALOGW("ftruncate failed %ld: %s\n", ftell(mZipFp), strerror(errno));
- // not fatal
- }
-
- /* should we clear the "newly added" flag in all entries now? */
-
- mNeedCDRewrite = false;
- return NO_ERROR;
-}
-
-/*
- * Crunch deleted files out of an archive by shifting the later files down.
- *
- * Because we're not using a temp file, we do the operation inside the
- * current file.
- */
-status_t ZipFile::crunchArchive(void)
-{
- status_t result = NO_ERROR;
- int i, count;
- long delCount, adjust;
-
-#if 0
- printf("CONTENTS:\n");
- for (i = 0; i < (int) mEntries.size(); i++) {
- printf(" %d: lfhOff=%ld del=%d\n",
- i, mEntries[i]->getLFHOffset(), mEntries[i]->getDeleted());
- }
- printf(" END is %ld\n", (long) mEOCD.mCentralDirOffset);
-#endif
-
- /*
- * Roll through the set of files, shifting them as appropriate. We
- * could probably get a slight performance improvement by sliding
- * multiple files down at once (because we could use larger reads
- * when operating on batches of small files), but it's not that useful.
- */
- count = mEntries.size();
- delCount = adjust = 0;
- for (i = 0; i < count; i++) {
- ZipEntry* pEntry = mEntries[i];
- long span;
-
- if (pEntry->getLFHOffset() != 0) {
- long nextOffset;
-
- /* Get the length of this entry by finding the offset
- * of the next entry. Directory entries don't have
- * file offsets, so we need to find the next non-directory
- * entry.
- */
- nextOffset = 0;
- for (int ii = i+1; nextOffset == 0 && ii < count; ii++)
- nextOffset = mEntries[ii]->getLFHOffset();
- if (nextOffset == 0)
- nextOffset = mEOCD.mCentralDirOffset;
- span = nextOffset - pEntry->getLFHOffset();
-
- assert(span >= ZipEntry::LocalFileHeader::kLFHLen);
- } else {
- /* This is a directory entry. It doesn't have
- * any actual file contents, so there's no need to
- * move anything.
- */
- span = 0;
- }
-
- //printf("+++ %d: off=%ld span=%ld del=%d [count=%d]\n",
- // i, pEntry->getLFHOffset(), span, pEntry->getDeleted(), count);
-
- if (pEntry->getDeleted()) {
- adjust += span;
- delCount++;
-
- delete pEntry;
- mEntries.removeAt(i);
-
- /* adjust loop control */
- count--;
- i--;
- } else if (span != 0 && adjust > 0) {
- /* shuffle this entry back */
- //printf("+++ Shuffling '%s' back %ld\n",
- // pEntry->getFileName(), adjust);
- result = filemove(mZipFp, pEntry->getLFHOffset() - adjust,
- pEntry->getLFHOffset(), span);
- if (result != NO_ERROR) {
- /* this is why you use a temp file */
- ALOGE("error during crunch - archive is toast\n");
- return result;
- }
-
- pEntry->setLFHOffset(pEntry->getLFHOffset() - adjust);
- }
- }
-
- /*
- * Fix EOCD info. We have to wait until the end to do some of this
- * because we use mCentralDirOffset to determine "span" for the
- * last entry.
- */
- mEOCD.mCentralDirOffset -= adjust;
- mEOCD.mNumEntries -= delCount;
- mEOCD.mTotalNumEntries -= delCount;
- mEOCD.mCentralDirSize = 0; // mark invalid; set by flush()
-
- assert(mEOCD.mNumEntries == mEOCD.mTotalNumEntries);
- assert(mEOCD.mNumEntries == count);
-
- return result;
-}
-
-/*
- * Works like memmove(), but on pieces of a file.
- */
-status_t ZipFile::filemove(FILE* fp, off_t dst, off_t src, size_t n)
-{
- if (dst == src || n <= 0)
- return NO_ERROR;
-
- unsigned char readBuf[32768];
-
- if (dst < src) {
- /* shift stuff toward start of file; must read from start */
- while (n != 0) {
- size_t getSize = sizeof(readBuf);
- if (getSize > n)
- getSize = n;
-
- if (fseek(fp, (long) src, SEEK_SET) != 0) {
- ALOGD("filemove src seek %ld failed\n", (long) src);
- return UNKNOWN_ERROR;
- }
-
- if (fread(readBuf, 1, getSize, fp) != getSize) {
- ALOGD("filemove read %ld off=%ld failed\n",
- (long) getSize, (long) src);
- return UNKNOWN_ERROR;
- }
-
- if (fseek(fp, (long) dst, SEEK_SET) != 0) {
- ALOGD("filemove dst seek %ld failed\n", (long) dst);
- return UNKNOWN_ERROR;
- }
-
- if (fwrite(readBuf, 1, getSize, fp) != getSize) {
- ALOGD("filemove write %ld off=%ld failed\n",
- (long) getSize, (long) dst);
- return UNKNOWN_ERROR;
- }
-
- src += getSize;
- dst += getSize;
- n -= getSize;
- }
- } else {
- /* shift stuff toward end of file; must read from end */
- assert(false); // write this someday, maybe
- return UNKNOWN_ERROR;
- }
-
- return NO_ERROR;
-}
-
-
-/*
- * Get the modification time from a file descriptor.
- */
-time_t ZipFile::getModTime(int fd)
-{
- struct stat sb;
-
- if (fstat(fd, &sb) < 0) {
- ALOGD("HEY: fstat on fd %d failed\n", fd);
- return (time_t) -1;
- }
-
- return sb.st_mtime;
-}
-
-
-#if 0 /* this is a bad idea */
-/*
- * Get a copy of the Zip file descriptor.
- *
- * We don't allow this if the file was opened read-write because we tend
- * to leave the file contents in an uncertain state between calls to
- * flush(). The duplicated file descriptor should only be valid for reads.
- */
-int ZipFile::getZipFd(void) const
-{
- if (!mReadOnly)
- return INVALID_OPERATION;
- assert(mZipFp != NULL);
-
- int fd;
- fd = dup(fileno(mZipFp));
- if (fd < 0) {
- ALOGD("didn't work, errno=%d\n", errno);
- }
-
- return fd;
-}
-#endif
-
-
-#if 0
-/*
- * Expand data.
- */
-bool ZipFile::uncompress(const ZipEntry* pEntry, void* buf) const
-{
- return false;
-}
-#endif
-
-// free the memory when you're done
-void* ZipFile::uncompress(const ZipEntry* entry)
-{
- size_t unlen = entry->getUncompressedLen();
- size_t clen = entry->getCompressedLen();
-
- void* buf = malloc(unlen);
- if (buf == NULL) {
- return NULL;
- }
-
- fseek(mZipFp, 0, SEEK_SET);
-
- off_t offset = entry->getFileOffset();
- if (fseek(mZipFp, offset, SEEK_SET) != 0) {
- goto bail;
- }
-
- switch (entry->getCompressionMethod())
- {
- case ZipEntry::kCompressStored: {
- ssize_t amt = fread(buf, 1, unlen, mZipFp);
- if (amt != (ssize_t)unlen) {
- goto bail;
- }
-#if 0
- printf("data...\n");
- const unsigned char* p = (unsigned char*)buf;
- const unsigned char* end = p+unlen;
- for (int i=0; i<32 && p < end; i++) {
- printf("0x%08x ", (int)(offset+(i*0x10)));
- for (int j=0; j<0x10 && p < end; j++) {
- printf(" %02x", *p);
- p++;
- }
- printf("\n");
- }
-#endif
-
- }
- break;
- case ZipEntry::kCompressDeflated: {
- if (!ZipUtils::inflateToBuffer(mZipFp, buf, unlen, clen)) {
- goto bail;
- }
- }
- break;
- default:
- goto bail;
- }
- return buf;
-
-bail:
- free(buf);
- return NULL;
-}
-
-
-/*
- * ===========================================================================
- * ZipFile::EndOfCentralDir
- * ===========================================================================
- */
-
-/*
- * Read the end-of-central-dir fields.
- *
- * "buf" should be positioned at the EOCD signature, and should contain
- * the entire EOCD area including the comment.
- */
-status_t ZipFile::EndOfCentralDir::readBuf(const unsigned char* buf, int len)
-{
- /* don't allow re-use */
- assert(mComment == NULL);
-
- if (len < kEOCDLen) {
- /* looks like ZIP file got truncated */
- ALOGD(" Zip EOCD: expected >= %d bytes, found %d\n",
- kEOCDLen, len);
- return INVALID_OPERATION;
- }
-
- /* this should probably be an assert() */
- if (ZipEntry::getLongLE(&buf[0x00]) != kSignature)
- return UNKNOWN_ERROR;
-
- mDiskNumber = ZipEntry::getShortLE(&buf[0x04]);
- mDiskWithCentralDir = ZipEntry::getShortLE(&buf[0x06]);
- mNumEntries = ZipEntry::getShortLE(&buf[0x08]);
- mTotalNumEntries = ZipEntry::getShortLE(&buf[0x0a]);
- mCentralDirSize = ZipEntry::getLongLE(&buf[0x0c]);
- mCentralDirOffset = ZipEntry::getLongLE(&buf[0x10]);
- mCommentLen = ZipEntry::getShortLE(&buf[0x14]);
-
- // TODO: validate mCentralDirOffset
-
- if (mCommentLen > 0) {
- if (kEOCDLen + mCommentLen > len) {
- ALOGD("EOCD(%d) + comment(%d) exceeds len (%d)\n",
- kEOCDLen, mCommentLen, len);
- return UNKNOWN_ERROR;
- }
- mComment = new unsigned char[mCommentLen];
- memcpy(mComment, buf + kEOCDLen, mCommentLen);
- }
-
- return NO_ERROR;
-}
-
-/*
- * Write an end-of-central-directory section.
- */
-status_t ZipFile::EndOfCentralDir::write(FILE* fp)
-{
- unsigned char buf[kEOCDLen];
-
- ZipEntry::putLongLE(&buf[0x00], kSignature);
- ZipEntry::putShortLE(&buf[0x04], mDiskNumber);
- ZipEntry::putShortLE(&buf[0x06], mDiskWithCentralDir);
- ZipEntry::putShortLE(&buf[0x08], mNumEntries);
- ZipEntry::putShortLE(&buf[0x0a], mTotalNumEntries);
- ZipEntry::putLongLE(&buf[0x0c], mCentralDirSize);
- ZipEntry::putLongLE(&buf[0x10], mCentralDirOffset);
- ZipEntry::putShortLE(&buf[0x14], mCommentLen);
-
- if (fwrite(buf, 1, kEOCDLen, fp) != kEOCDLen)
- return UNKNOWN_ERROR;
- if (mCommentLen > 0) {
- assert(mComment != NULL);
- if (fwrite(mComment, mCommentLen, 1, fp) != mCommentLen)
- return UNKNOWN_ERROR;
- }
-
- return NO_ERROR;
-}
-
-/*
- * Dump the contents of an EndOfCentralDir object.
- */
-void ZipFile::EndOfCentralDir::dump(void) const
-{
- ALOGD(" EndOfCentralDir contents:\n");
- ALOGD(" diskNum=%u diskWCD=%u numEnt=%u totalNumEnt=%u\n",
- mDiskNumber, mDiskWithCentralDir, mNumEntries, mTotalNumEntries);
- ALOGD(" centDirSize=%lu centDirOff=%lu commentLen=%u\n",
- mCentralDirSize, mCentralDirOffset, mCommentLen);
-}
-
diff --git a/tools/aapt/ZipFile.h b/tools/aapt/ZipFile.h
deleted file mode 100644
index 7877550..0000000
--- a/tools/aapt/ZipFile.h
+++ /dev/null
@@ -1,270 +0,0 @@
-/*
- * Copyright (C) 2006 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-//
-// General-purpose Zip archive access. This class allows both reading and
-// writing to Zip archives, including deletion of existing entries.
-//
-#ifndef __LIBS_ZIPFILE_H
-#define __LIBS_ZIPFILE_H
-
-#include <utils/Vector.h>
-#include <utils/Errors.h>
-#include <stdio.h>
-
-#include "ZipEntry.h"
-
-namespace android {
-
-/*
- * Manipulate a Zip archive.
- *
- * Some changes will not be visible in the until until "flush" is called.
- *
- * The correct way to update a file archive is to make all changes to a
- * copy of the archive in a temporary file, and then unlink/rename over
- * the original after everything completes. Because we're only interested
- * in using this for packaging, we don't worry about such things. Crashing
- * after making changes and before flush() completes could leave us with
- * an unusable Zip archive.
- */
-class ZipFile {
-public:
- ZipFile(void)
- : mZipFp(NULL), mReadOnly(false), mNeedCDRewrite(false)
- {}
- ~ZipFile(void) {
- if (!mReadOnly)
- flush();
- if (mZipFp != NULL)
- fclose(mZipFp);
- discardEntries();
- }
-
- /*
- * Open a new or existing archive.
- */
- enum {
- kOpenReadOnly = 0x01,
- kOpenReadWrite = 0x02,
- kOpenCreate = 0x04, // create if it doesn't exist
- kOpenTruncate = 0x08, // if it exists, empty it
- };
- status_t open(const char* zipFileName, int flags);
-
- /*
- * Add a file to the end of the archive. Specify whether you want the
- * library to try to store it compressed.
- *
- * If "storageName" is specified, the archive will use that instead
- * of "fileName".
- *
- * If there is already an entry with the same name, the call fails.
- * Existing entries with the same name must be removed first.
- *
- * If "ppEntry" is non-NULL, a pointer to the new entry will be returned.
- */
- status_t add(const char* fileName, int compressionMethod,
- ZipEntry** ppEntry)
- {
- return add(fileName, fileName, compressionMethod, ppEntry);
- }
- status_t add(const char* fileName, const char* storageName,
- int compressionMethod, ZipEntry** ppEntry)
- {
- return addCommon(fileName, NULL, 0, storageName,
- ZipEntry::kCompressStored,
- compressionMethod, ppEntry);
- }
-
- /*
- * Add a file that is already compressed with gzip.
- *
- * If "ppEntry" is non-NULL, a pointer to the new entry will be returned.
- */
- status_t addGzip(const char* fileName, const char* storageName,
- ZipEntry** ppEntry)
- {
- return addCommon(fileName, NULL, 0, storageName,
- ZipEntry::kCompressDeflated,
- ZipEntry::kCompressDeflated, ppEntry);
- }
-
- /*
- * Add a file from an in-memory data buffer.
- *
- * If "ppEntry" is non-NULL, a pointer to the new entry will be returned.
- */
- status_t add(const void* data, size_t size, const char* storageName,
- int compressionMethod, ZipEntry** ppEntry)
- {
- return addCommon(NULL, data, size, storageName,
- ZipEntry::kCompressStored,
- compressionMethod, ppEntry);
- }
-
- /*
- * Add an entry by copying it from another zip file. If "padding" is
- * nonzero, the specified number of bytes will be added to the "extra"
- * field in the header.
- *
- * If "ppEntry" is non-NULL, a pointer to the new entry will be returned.
- */
- status_t add(const ZipFile* pSourceZip, const ZipEntry* pSourceEntry,
- int padding, ZipEntry** ppEntry);
-
- /*
- * Mark an entry as having been removed. It is not actually deleted
- * from the archive or our internal data structures until flush() is
- * called.
- */
- status_t remove(ZipEntry* pEntry);
-
- /*
- * Flush changes. If mNeedCDRewrite is set, this writes the central dir.
- */
- status_t flush(void);
-
- /*
- * Expand the data into the buffer provided. The buffer must hold
- * at least <uncompressed len> bytes. Variation expands directly
- * to a file.
- *
- * Returns "false" if an error was encountered in the compressed data.
- */
- //bool uncompress(const ZipEntry* pEntry, void* buf) const;
- //bool uncompress(const ZipEntry* pEntry, FILE* fp) const;
- void* uncompress(const ZipEntry* pEntry);
-
- /*
- * Get an entry, by name. Returns NULL if not found.
- *
- * Does not return entries pending deletion.
- */
- ZipEntry* getEntryByName(const char* fileName) const;
-
- /*
- * Get the Nth entry in the archive.
- *
- * This will return an entry that is pending deletion.
- */
- int getNumEntries(void) const { return mEntries.size(); }
- ZipEntry* getEntryByIndex(int idx) const;
-
-private:
- /* these are private and not defined */
- ZipFile(const ZipFile& src);
- ZipFile& operator=(const ZipFile& src);
-
- class EndOfCentralDir {
- public:
- EndOfCentralDir(void) :
- mDiskNumber(0),
- mDiskWithCentralDir(0),
- mNumEntries(0),
- mTotalNumEntries(0),
- mCentralDirSize(0),
- mCentralDirOffset(0),
- mCommentLen(0),
- mComment(NULL)
- {}
- virtual ~EndOfCentralDir(void) {
- delete[] mComment;
- }
-
- status_t readBuf(const unsigned char* buf, int len);
- status_t write(FILE* fp);
-
- //unsigned long mSignature;
- unsigned short mDiskNumber;
- unsigned short mDiskWithCentralDir;
- unsigned short mNumEntries;
- unsigned short mTotalNumEntries;
- unsigned long mCentralDirSize;
- unsigned long mCentralDirOffset; // offset from first disk
- unsigned short mCommentLen;
- unsigned char* mComment;
-
- enum {
- kSignature = 0x06054b50,
- kEOCDLen = 22, // EndOfCentralDir len, excl. comment
-
- kMaxCommentLen = 65535, // longest possible in ushort
- kMaxEOCDSearch = kMaxCommentLen + EndOfCentralDir::kEOCDLen,
-
- };
-
- void dump(void) const;
- };
-
-
- /* read all entries in the central dir */
- status_t readCentralDir(void);
-
- /* crunch deleted entries out */
- status_t crunchArchive(void);
-
- /* clean up mEntries */
- void discardEntries(void);
-
- /* common handler for all "add" functions */
- status_t addCommon(const char* fileName, const void* data, size_t size,
- const char* storageName, int sourceType, int compressionMethod,
- ZipEntry** ppEntry);
-
- /* copy all of "srcFp" into "dstFp" */
- status_t copyFpToFp(FILE* dstFp, FILE* srcFp, unsigned long* pCRC32);
- /* copy all of "data" into "dstFp" */
- status_t copyDataToFp(FILE* dstFp,
- const void* data, size_t size, unsigned long* pCRC32);
- /* copy some of "srcFp" into "dstFp" */
- status_t copyPartialFpToFp(FILE* dstFp, FILE* srcFp, long length,
- unsigned long* pCRC32);
- /* like memmove(), but on parts of a single file */
- status_t filemove(FILE* fp, off_t dest, off_t src, size_t n);
- /* compress all of "srcFp" into "dstFp", using Deflate */
- status_t compressFpToFp(FILE* dstFp, FILE* srcFp,
- const void* data, size_t size, unsigned long* pCRC32);
-
- /* get modification date from a file descriptor */
- time_t getModTime(int fd);
-
- /*
- * We use stdio FILE*, which gives us buffering but makes dealing
- * with files >2GB awkward. Until we support Zip64, we're fine.
- */
- FILE* mZipFp; // Zip file pointer
-
- /* one of these per file */
- EndOfCentralDir mEOCD;
-
- /* did we open this read-only? */
- bool mReadOnly;
-
- /* set this when we trash the central dir */
- bool mNeedCDRewrite;
-
- /*
- * One ZipEntry per entry in the zip file. I'm using pointers instead
- * of objects because it's easier than making operator= work for the
- * classes and sub-classes.
- */
- Vector<ZipEntry*> mEntries;
-};
-
-}; // namespace android
-
-#endif // __LIBS_ZIPFILE_H
diff --git a/tools/aapt/printapk.cpp b/tools/aapt/printapk.cpp
deleted file mode 100644
index 4cf73d8..0000000
--- a/tools/aapt/printapk.cpp
+++ /dev/null
@@ -1,127 +0,0 @@
-#include <utils/ResourceTypes.h>
-#include <utils/String8.h>
-#include <utils/String16.h>
-#include <zipfile/zipfile.h>
-#include <stdio.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <stdlib.h>
-
-using namespace android;
-
-static int
-usage()
-{
- fprintf(stderr,
- "usage: apk APKFILE\n"
- "\n"
- "APKFILE an android packge file produced by aapt.\n"
- );
- return 1;
-}
-
-
-int
-main(int argc, char** argv)
-{
- const char* filename;
- int fd;
- ssize_t amt;
- off_t size;
- void* buf;
- zipfile_t zip;
- zipentry_t entry;
- void* cookie;
- void* resfile;
- int bufsize;
- int err;
-
- if (argc != 2) {
- return usage();
- }
-
- filename = argv[1];
- fd = open(filename, O_RDONLY);
- if (fd == -1) {
- fprintf(stderr, "apk: couldn't open file for read: %s\n", filename);
- return 1;
- }
-
- size = lseek(fd, 0, SEEK_END);
- amt = lseek(fd, 0, SEEK_SET);
-
- if (size < 0 || amt < 0) {
- fprintf(stderr, "apk: error determining file size: %s\n", filename);
- return 1;
- }
-
- buf = malloc(size);
- if (buf == NULL) {
- fprintf(stderr, "apk: file too big: %s\n", filename);
- return 1;
- }
-
- amt = read(fd, buf, size);
- if (amt != size) {
- fprintf(stderr, "apk: error reading file: %s\n", filename);
- return 1;
- }
-
- close(fd);
-
- zip = init_zipfile(buf, size);
- if (zip == NULL) {
- fprintf(stderr, "apk: file doesn't seem to be a zip file: %s\n",
- filename);
- return 1;
- }
-
- printf("files:\n");
- cookie = NULL;
- while ((entry = iterate_zipfile(zip, &cookie))) {
- char* name = get_zipentry_name(entry);
- printf(" %s\n", name);
- free(name);
- }
-
- entry = lookup_zipentry(zip, "resources.arsc");
- if (entry != NULL) {
- size = get_zipentry_size(entry);
- bufsize = size + (size / 1000) + 1;
- resfile = malloc(bufsize);
-
- err = decompress_zipentry(entry, resfile, bufsize);
- if (err != 0) {
- fprintf(stderr, "apk: error decompressing resources.arsc");
- return 1;
- }
-
- ResTable res(resfile, size, resfile);
- res.print();
-#if 0
- size_t tableCount = res.getTableCount();
- printf("Tables: %d\n", (int)tableCount);
- for (size_t tableIndex=0; tableIndex<tableCount; tableIndex++) {
- const ResStringPool* strings = res.getTableStringBlock(tableIndex);
- size_t stringCount = strings->size();
- for (size_t stringIndex=0; stringIndex<stringCount; stringIndex++) {
- size_t len;
- const char16_t* ch = strings->stringAt(stringIndex, &len);
- String8 s(String16(ch, len));
- printf(" [%3d] %s\n", (int)stringIndex, s.string());
- }
- }
-
- size_t basePackageCount = res.getBasePackageCount();
- printf("Base Packages: %d\n", (int)basePackageCount);
- for (size_t bpIndex=0; bpIndex<basePackageCount; bpIndex++) {
- const char16_t* ch = res.getBasePackageName(bpIndex);
- String8 s = String8(String16(ch));
- printf(" [%3d] %s\n", (int)bpIndex, s.string());
- }
-#endif
- }
-
-
- return 0;
-}
diff --git a/tools/aapt/pseudolocalize.cpp b/tools/aapt/pseudolocalize.cpp
deleted file mode 100644
index 9e50c5a..0000000
--- a/tools/aapt/pseudolocalize.cpp
+++ /dev/null
@@ -1,119 +0,0 @@
-#include "pseudolocalize.h"
-
-using namespace std;
-
-static const char*
-pseudolocalize_char(char c)
-{
- switch (c) {
- case 'a': return "\xc4\x83";
- case 'b': return "\xcf\x84";
- case 'c': return "\xc4\x8b";
- case 'd': return "\xc4\x8f";
- case 'e': return "\xc4\x99";
- case 'f': return "\xc6\x92";
- case 'g': return "\xc4\x9d";
- case 'h': return "\xd1\x9b";
- case 'i': return "\xcf\x8a";
- case 'j': return "\xc4\xb5";
- case 'k': return "\xc4\xb8";
- case 'l': return "\xc4\xba";
- case 'm': return "\xe1\xb8\xbf";
- case 'n': return "\xd0\xb8";
- case 'o': return "\xcf\x8c";
- case 'p': return "\xcf\x81";
- case 'q': return "\x51";
- case 'r': return "\xd2\x91";
- case 's': return "\xc5\xa1";
- case 't': return "\xd1\x82";
- case 'u': return "\xce\xb0";
- case 'v': return "\x56";
- case 'w': return "\xe1\xba\x85";
- case 'x': return "\xd1\x85";
- case 'y': return "\xe1\xbb\xb3";
- case 'z': return "\xc5\xba";
- case 'A': return "\xc3\x85";
- case 'B': return "\xce\xb2";
- case 'C': return "\xc4\x88";
- case 'D': return "\xc4\x90";
- case 'E': return "\xd0\x84";
- case 'F': return "\xce\x93";
- case 'G': return "\xc4\x9e";
- case 'H': return "\xc4\xa6";
- case 'I': return "\xd0\x87";
- case 'J': return "\xc4\xb5";
- case 'K': return "\xc4\xb6";
- case 'L': return "\xc5\x81";
- case 'M': return "\xe1\xb8\xbe";
- case 'N': return "\xc5\x83";
- case 'O': return "\xce\x98";
- case 'P': return "\xcf\x81";
- case 'Q': return "\x71";
- case 'R': return "\xd0\xaf";
- case 'S': return "\xc8\x98";
- case 'T': return "\xc5\xa6";
- case 'U': return "\xc5\xa8";
- case 'V': return "\xce\xbd";
- case 'W': return "\xe1\xba\x84";
- case 'X': return "\xc3\x97";
- case 'Y': return "\xc2\xa5";
- case 'Z': return "\xc5\xbd";
- default: return NULL;
- }
-}
-
-/**
- * Converts characters so they look like they've been localized.
- *
- * Note: This leaves escape sequences untouched so they can later be
- * processed by ResTable::collectString in the normal way.
- */
-string
-pseudolocalize_string(const string& source)
-{
- const char* s = source.c_str();
- string result;
- const size_t I = source.length();
- for (size_t i=0; i<I; i++) {
- char c = s[i];
- if (c == '\\') {
- if (i<I-1) {
- result += '\\';
- i++;
- c = s[i];
- switch (c) {
- case 'u':
- // this one takes up 5 chars
- result += string(s+i, 5);
- i += 4;
- break;
- case 't':
- case 'n':
- case '#':
- case '@':
- case '?':
- case '"':
- case '\'':
- case '\\':
- default:
- result += c;
- break;
- }
- } else {
- result += c;
- }
- } else {
- const char* p = pseudolocalize_char(c);
- if (p != NULL) {
- result += p;
- } else {
- result += c;
- }
- }
- }
-
- //printf("result=\'%s\'\n", result.c_str());
- return result;
-}
-
-
diff --git a/tools/aapt/pseudolocalize.h b/tools/aapt/pseudolocalize.h
deleted file mode 100644
index 94cb034..0000000
--- a/tools/aapt/pseudolocalize.h
+++ /dev/null
@@ -1,9 +0,0 @@
-#ifndef HOST_PSEUDOLOCALIZE_H
-#define HOST_PSEUDOLOCALIZE_H
-
-#include <string>
-
-std::string pseudolocalize_string(const std::string& source);
-
-#endif // HOST_PSEUDOLOCALIZE_H
-
diff --git a/tools/aapt/qsort_r_compat.c b/tools/aapt/qsort_r_compat.c
deleted file mode 100644
index 2a8dbe8..0000000
--- a/tools/aapt/qsort_r_compat.c
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Copyright (C) 2012 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.
- */
-
-#include <stdlib.h>
-#include "qsort_r_compat.h"
-
-/*
- * Note: This code is only used on the host, and is primarily here for
- * Mac OS compatibility. Apparently, glibc and Apple's libc disagree on
- * the parameter order for qsort_r.
- */
-
-#if HAVE_BSD_QSORT_R
-
-/*
- * BSD qsort_r parameter order is as we have defined here.
- */
-
-void qsort_r_compat(void* base, size_t nel, size_t width, void* thunk,
- int (*compar)(void*, const void* , const void*)) {
- qsort_r(base, nel, width, thunk, compar);
-}
-
-#elif HAVE_GNU_QSORT_R
-
-/*
- * GNU qsort_r parameter order places the thunk parameter last.
- */
-
-struct compar_data {
- void* thunk;
- int (*compar)(void*, const void* , const void*);
-};
-
-static int compar_wrapper(const void* a, const void* b, void* data) {
- struct compar_data* compar_data = (struct compar_data*)data;
- return compar_data->compar(compar_data->thunk, a, b);
-}
-
-void qsort_r_compat(void* base, size_t nel, size_t width, void* thunk,
- int (*compar)(void*, const void* , const void*)) {
- struct compar_data compar_data;
- compar_data.thunk = thunk;
- compar_data.compar = compar;
- qsort_r(base, nel, width, compar_wrapper, &compar_data);
-}
-
-#else
-
-/*
- * Emulate qsort_r using thread local storage to access the thunk data.
- */
-
-#include <cutils/threads.h>
-
-static thread_store_t compar_data_key = THREAD_STORE_INITIALIZER;
-
-struct compar_data {
- void* thunk;
- int (*compar)(void*, const void* , const void*);
-};
-
-static int compar_wrapper(const void* a, const void* b) {
- struct compar_data* compar_data = (struct compar_data*)thread_store_get(&compar_data_key);
- return compar_data->compar(compar_data->thunk, a, b);
-}
-
-void qsort_r_compat(void* base, size_t nel, size_t width, void* thunk,
- int (*compar)(void*, const void* , const void*)) {
- struct compar_data compar_data;
- compar_data.thunk = thunk;
- compar_data.compar = compar;
- thread_store_set(&compar_data_key, &compar_data, NULL);
- qsort(base, nel, width, compar_wrapper);
-}
-
-#endif
diff --git a/tools/aapt/qsort_r_compat.h b/tools/aapt/qsort_r_compat.h
deleted file mode 100644
index e14f999..0000000
--- a/tools/aapt/qsort_r_compat.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright (C) 2012 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.
- */
-
-/*
- * Provides a portable version of qsort_r, called qsort_r_compat, which is a
- * reentrant variant of qsort that passes a user data pointer to its comparator.
- * This implementation follows the BSD parameter convention.
- */
-
-#ifndef ___QSORT_R_COMPAT_H
-#define ___QSORT_R_COMPAT_H
-
-#include <stdlib.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-void qsort_r_compat(void* base, size_t nel, size_t width, void* thunk,
- int (*compar)(void*, const void* , const void* ));
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // ___QSORT_R_COMPAT_H
diff --git a/tools/aapt/tests/CrunchCache_test.cpp b/tools/aapt/tests/CrunchCache_test.cpp
deleted file mode 100644
index 20b5022..0000000
--- a/tools/aapt/tests/CrunchCache_test.cpp
+++ /dev/null
@@ -1,97 +0,0 @@
-//
-// Copyright 2011 The Android Open Source Project
-//
-#include <utils/String8.h>
-#include <iostream>
-#include <errno.h>
-
-#include "CrunchCache.h"
-#include "FileFinder.h"
-#include "MockFileFinder.h"
-#include "CacheUpdater.h"
-#include "MockCacheUpdater.h"
-
-using namespace android;
-using std::cout;
-using std::endl;
-
-void expectEqual(int got, int expected, const char* desc) {
- cout << "Checking " << desc << ": ";
- cout << "Got " << got << ", expected " << expected << "...";
- cout << ( (got == expected) ? "PASSED" : "FAILED") << endl;
- errno += ((got == expected) ? 0 : 1);
-}
-
-int main() {
-
- errno = 0;
-
- String8 source("res");
- String8 dest("res2");
-
- // Create data for MockFileFinder to feed to the cache
- KeyedVector<String8, time_t> sourceData;
- // This shouldn't be updated
- sourceData.add(String8("res/drawable/hello.png"),3);
- // This should be updated
- sourceData.add(String8("res/drawable/world.png"),5);
- // This should cause make directory to be called
- sourceData.add(String8("res/drawable-cool/hello.png"),3);
-
- KeyedVector<String8, time_t> destData;
- destData.add(String8("res2/drawable/hello.png"),3);
- destData.add(String8("res2/drawable/world.png"),3);
- // this should call delete
- destData.add(String8("res2/drawable/dead.png"),3);
-
- // Package up data and create mock file finder
- KeyedVector<String8, KeyedVector<String8,time_t> > data;
- data.add(source,sourceData);
- data.add(dest,destData);
- FileFinder* ff = new MockFileFinder(data);
- CrunchCache cc(source,dest,ff);
-
- MockCacheUpdater* mcu = new MockCacheUpdater();
- CacheUpdater* cu(mcu);
-
- cout << "Running Crunch...";
- int result = cc.crunch(cu);
- cout << ((result > 0) ? "PASSED" : "FAILED") << endl;
- errno += ((result > 0) ? 0 : 1);
-
- const int EXPECTED_RESULT = 2;
- expectEqual(result, EXPECTED_RESULT, "number of files touched");
-
- cout << "Checking calls to deleteFile and processImage:" << endl;
- const int EXPECTED_DELETES = 1;
- const int EXPECTED_PROCESSED = 2;
- // Deletes
- expectEqual(mcu->deleteCount, EXPECTED_DELETES, "deleteFile");
- // processImage
- expectEqual(mcu->processCount, EXPECTED_PROCESSED, "processImage");
-
- const int EXPECTED_OVERWRITES = 3;
- result = cc.crunch(cu, true);
- expectEqual(result, EXPECTED_OVERWRITES, "number of files touched with overwrite");
- \
-
- if (errno == 0)
- cout << "ALL TESTS PASSED!" << endl;
- else
- cout << errno << " TESTS FAILED" << endl;
-
- delete ff;
- delete cu;
-
- // TESTS BELOW WILL GO AWAY SOON
-
- String8 source2("ApiDemos/res");
- String8 dest2("ApiDemos/res2");
-
- FileFinder* sff = new SystemFileFinder();
- CacheUpdater* scu = new SystemCacheUpdater();
-
- CrunchCache scc(source2,dest2,sff);
-
- scc.crunch(scu);
-} \ No newline at end of file
diff --git a/tools/aapt/tests/FileFinder_test.cpp b/tools/aapt/tests/FileFinder_test.cpp
deleted file mode 100644
index 07bd665..0000000
--- a/tools/aapt/tests/FileFinder_test.cpp
+++ /dev/null
@@ -1,101 +0,0 @@
-//
-// Copyright 2011 The Android Open Source Project
-//
-#include <utils/Vector.h>
-#include <utils/KeyedVector.h>
-#include <iostream>
-#include <cassert>
-#include <utils/String8.h>
-#include <utility>
-
-#include "DirectoryWalker.h"
-#include "MockDirectoryWalker.h"
-#include "FileFinder.h"
-
-using namespace android;
-
-using std::pair;
-using std::cout;
-using std::endl;
-
-
-
-int main()
-{
-
- cout << "\n\n STARTING FILE FINDER TESTS" << endl;
- String8 path("ApiDemos");
-
- // Storage to pass to findFiles()
- KeyedVector<String8,time_t> testStorage;
-
- // Mock Directory Walker initialization. First data, then sdw
- Vector< pair<String8,time_t> > data;
- data.push( pair<String8,time_t>(String8("hello.png"),3) );
- data.push( pair<String8,time_t>(String8("world.PNG"),3) );
- data.push( pair<String8,time_t>(String8("foo.pNg"),3) );
- // Neither of these should be found
- data.push( pair<String8,time_t>(String8("hello.jpg"),3) );
- data.push( pair<String8,time_t>(String8(".hidden.png"),3));
-
- DirectoryWalker* sdw = new StringDirectoryWalker(path,data);
-
- // Extensions to look for
- Vector<String8> exts;
- exts.push(String8(".png"));
-
- errno = 0;
-
- // Make sure we get a valid mock directory walker
- // Make sure we finish without errors
- cout << "Checking DirectoryWalker...";
- assert(sdw != NULL);
- cout << "PASSED" << endl;
-
- // Make sure we finish without errors
- cout << "Running findFiles()...";
- bool findStatus = FileFinder::findFiles(path,exts, testStorage, sdw);
- assert(findStatus);
- cout << "PASSED" << endl;
-
- const size_t SIZE_EXPECTED = 3;
- // Check to make sure we have the right number of things in our storage
- cout << "Running size comparison: Size is " << testStorage.size() << ", ";
- cout << "Expected " << SIZE_EXPECTED << "...";
- if(testStorage.size() == SIZE_EXPECTED)
- cout << "PASSED" << endl;
- else {
- cout << "FAILED" << endl;
- errno++;
- }
-
- // Check to make sure that each of our found items has the right extension
- cout << "Checking Returned Extensions...";
- bool extsOkay = true;
- String8 wrongExts;
- for (size_t i = 0; i < SIZE_EXPECTED; ++i) {
- String8 testExt(testStorage.keyAt(i).getPathExtension());
- testExt.toLower();
- if (testExt != ".png") {
- wrongExts += testStorage.keyAt(i);
- wrongExts += "\n";
- extsOkay = false;
- }
- }
- if (extsOkay)
- cout << "PASSED" << endl;
- else {
- cout << "FAILED" << endl;
- cout << "The following extensions didn't check out" << endl << wrongExts;
- }
-
- // Clean up
- delete sdw;
-
- if(errno == 0) {
- cout << "ALL TESTS PASSED" << endl;
- } else {
- cout << errno << " TESTS FAILED" << endl;
- }
- return errno;
-} \ No newline at end of file
diff --git a/tools/aapt/tests/MockCacheUpdater.h b/tools/aapt/tests/MockCacheUpdater.h
deleted file mode 100644
index c7f4bd7..0000000
--- a/tools/aapt/tests/MockCacheUpdater.h
+++ /dev/null
@@ -1,40 +0,0 @@
-//
-// Copyright 2011 The Android Open Source Project
-//
-#ifndef MOCKCACHEUPDATER_H
-#define MOCKCACHEUPDATER_H
-
-#include <utils/String8.h>
-#include "CacheUpdater.h"
-
-using namespace android;
-
-class MockCacheUpdater : public CacheUpdater {
-public:
-
- MockCacheUpdater()
- : deleteCount(0), processCount(0) { };
-
- // Make sure all the directories along this path exist
- virtual void ensureDirectoriesExist(String8 path)
- {
- // Nothing to do
- };
-
- // Delete a file
- virtual void deleteFile(String8 path) {
- deleteCount++;
- };
-
- // Process an image from source out to dest
- virtual void processImage(String8 source, String8 dest) {
- processCount++;
- };
-
- // DATA MEMBERS
- int deleteCount;
- int processCount;
-private:
-};
-
-#endif // MOCKCACHEUPDATER_H \ No newline at end of file
diff --git a/tools/aapt/tests/MockDirectoryWalker.h b/tools/aapt/tests/MockDirectoryWalker.h
deleted file mode 100644
index 5900cf3..0000000
--- a/tools/aapt/tests/MockDirectoryWalker.h
+++ /dev/null
@@ -1,85 +0,0 @@
-//
-// Copyright 2011 The Android Open Source Project
-//
-#ifndef MOCKDIRECTORYWALKER_H
-#define MOCKDIRECTORYWALKER_H
-
-#include <utils/Vector.h>
-#include <utils/String8.h>
-#include <utility>
-#include "DirectoryWalker.h"
-
-using namespace android;
-using std::pair;
-
-// String8 Directory Walker
-// This is an implementation of the Directory Walker abstraction that is built
-// for testing.
-// Instead of system calls it queries a private data structure for the directory
-// entries. It takes a path and a map of filenames and their modification times.
-// functions are inlined since they are short and simple
-
-class StringDirectoryWalker : public DirectoryWalker {
-public:
- StringDirectoryWalker(String8& path, Vector< pair<String8,time_t> >& data)
- : mPos(0), mBasePath(path), mData(data) {
- //fprintf(stdout,"StringDW built to mimic %s with %d files\n",
- // mBasePath.string());
- };
- // Default copy constructor, and destructor are fine
-
- virtual bool openDir(String8 path) {
- // If the user is trying to query the "directory" that this
- // walker was initialized with, then return success. Else fail.
- return path == mBasePath;
- };
- virtual bool openDir(const char* path) {
- String8 p(path);
- openDir(p);
- return true;
- };
- // Advance to next entry in the Vector
- virtual struct dirent* nextEntry() {
- // Advance position and check to see if we're done
- if (mPos >= mData.size())
- return NULL;
-
- // Place data in the entry descriptor. This class only returns files.
- mEntry.d_type = DT_REG;
- mEntry.d_ino = mPos;
- // Copy chars from the string name to the entry name
- size_t i = 0;
- for (i; i < mData[mPos].first.size(); ++i)
- mEntry.d_name[i] = mData[mPos].first[i];
- mEntry.d_name[i] = '\0';
-
- // Place data in stats
- mStats.st_ino = mPos;
- mStats.st_mtime = mData[mPos].second;
-
- // Get ready to move to the next entry
- mPos++;
-
- return &mEntry;
- };
- // Get the stats for the current entry
- virtual struct stat* entryStats() {
- return &mStats;
- };
- // Nothing to do in clean up
- virtual void closeDir() {
- // Nothing to do
- };
- virtual DirectoryWalker* clone() {
- return new StringDirectoryWalker(*this);
- };
-private:
- // Current position in the Vector
- size_t mPos;
- // Base path
- String8 mBasePath;
- // Data to simulate a directory full of files.
- Vector< pair<String8,time_t> > mData;
-};
-
-#endif // MOCKDIRECTORYWALKER_H \ No newline at end of file
diff --git a/tools/aapt/tests/MockFileFinder.h b/tools/aapt/tests/MockFileFinder.h
deleted file mode 100644
index da5ea4f..0000000
--- a/tools/aapt/tests/MockFileFinder.h
+++ /dev/null
@@ -1,55 +0,0 @@
-//
-// Copyright 2011 The Android Open Source Project
-//
-
-#ifndef MOCKFILEFINDER_H
-#define MOCKFILEFINDER_H
-
-#include <utils/Vector.h>
-#include <utils/KeyedVector.h>
-#include <utils/String8.h>
-
-#include "DirectoryWalker.h"
-
-using namespace android;
-
-class MockFileFinder : public FileFinder {
-public:
- MockFileFinder (KeyedVector<String8, KeyedVector<String8,time_t> >& files)
- : mFiles(files)
- {
- // Nothing left to do
- };
-
- /**
- * findFiles implementation for the abstraction.
- * PRECONDITIONS:
- * No checking is done, so there MUST be an entry in mFiles with
- * path matching basePath.
- *
- * POSTCONDITIONS:
- * fileStore is filled with a copy of the data in mFiles corresponding
- * to the basePath.
- */
-
- virtual bool findFiles(String8 basePath, Vector<String8>& extensions,
- KeyedVector<String8,time_t>& fileStore,
- DirectoryWalker* dw)
- {
- const KeyedVector<String8,time_t>* payload(&mFiles.valueFor(basePath));
- // Since KeyedVector doesn't implement swap
- // (who doesn't use swap??) we loop and add one at a time.
- for (size_t i = 0; i < payload->size(); ++i) {
- fileStore.add(payload->keyAt(i),payload->valueAt(i));
- }
- return true;
- }
-
-private:
- // Virtual mapping between "directories" and the "files" contained
- // in them
- KeyedVector<String8, KeyedVector<String8,time_t> > mFiles;
-};
-
-
-#endif // MOCKFILEFINDER_H \ No newline at end of file
diff --git a/tools/aapt/tests/plurals/AndroidManifest.xml b/tools/aapt/tests/plurals/AndroidManifest.xml
deleted file mode 100644
index c721dee..0000000
--- a/tools/aapt/tests/plurals/AndroidManifest.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.android.aapt.test.plurals">
-
-</manifest>
diff --git a/tools/aapt/tests/plurals/res/values/strings.xml b/tools/aapt/tests/plurals/res/values/strings.xml
deleted file mode 100644
index 1c1fc19..0000000
--- a/tools/aapt/tests/plurals/res/values/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="ok">OK</string>
- <plurals name="a_plural">
- <item quantity="one">A dog</item>
- <item quantity="other">Some dogs</item>
- </plurals>
-</resources>
diff --git a/tools/aapt/tests/plurals/run.sh b/tools/aapt/tests/plurals/run.sh
deleted file mode 100755
index 4d39e10..0000000
--- a/tools/aapt/tests/plurals/run.sh
+++ /dev/null
@@ -1,16 +0,0 @@
-TEST_DIR=tools/aapt/tests/plurals
-TEST_OUT_DIR=out/plurals_test
-
-rm -rf $TEST_OUT_DIR
-mkdir -p $TEST_OUT_DIR
-mkdir -p $TEST_OUT_DIR/java
-
-#gdb --args \
-aapt package -v -x -m -z -J $TEST_OUT_DIR/java -M $TEST_DIR/AndroidManifest.xml \
- -I out/target/common/obj/APPS/framework-res_intermediates/package-export.apk \
- -P $TEST_OUT_DIR/public_resources.xml \
- -S $TEST_DIR/res
-
-echo
-echo "==================== FILES CREATED ==================== "
-find $TEST_OUT_DIR -type f
diff --git a/tools/aidl/AST.cpp b/tools/aidl/AST.cpp
deleted file mode 100644
index bfa6765..0000000
--- a/tools/aidl/AST.cpp
+++ /dev/null
@@ -1,912 +0,0 @@
-#include "AST.h"
-#include "Type.h"
-
-void
-WriteModifiers(FILE* to, int mod, int mask)
-{
- int m = mod & mask;
-
- if (m & OVERRIDE) {
- fprintf(to, "@Override ");
- }
-
- if ((m & SCOPE_MASK) == PUBLIC) {
- fprintf(to, "public ");
- }
- else if ((m & SCOPE_MASK) == PRIVATE) {
- fprintf(to, "private ");
- }
- else if ((m & SCOPE_MASK) == PROTECTED) {
- fprintf(to, "protected ");
- }
-
- if (m & STATIC) {
- fprintf(to, "static ");
- }
-
- if (m & FINAL) {
- fprintf(to, "final ");
- }
-
- if (m & ABSTRACT) {
- fprintf(to, "abstract ");
- }
-}
-
-void
-WriteArgumentList(FILE* to, const vector<Expression*>& arguments)
-{
- size_t N = arguments.size();
- for (size_t i=0; i<N; i++) {
- arguments[i]->Write(to);
- if (i != N-1) {
- fprintf(to, ", ");
- }
- }
-}
-
-ClassElement::ClassElement()
-{
-}
-
-ClassElement::~ClassElement()
-{
-}
-
-Field::Field()
- :ClassElement(),
- modifiers(0),
- variable(NULL)
-{
-}
-
-Field::Field(int m, Variable* v)
- :ClassElement(),
- modifiers(m),
- variable(v)
-{
-}
-
-Field::~Field()
-{
-}
-
-void
-Field::GatherTypes(set<Type*>* types) const
-{
- types->insert(this->variable->type);
-}
-
-void
-Field::Write(FILE* to)
-{
- if (this->comment.length() != 0) {
- fprintf(to, "%s\n", this->comment.c_str());
- }
- WriteModifiers(to, this->modifiers, SCOPE_MASK | STATIC | FINAL | OVERRIDE);
- fprintf(to, "%s %s", this->variable->type->QualifiedName().c_str(),
- this->variable->name.c_str());
- if (this->value.length() != 0) {
- fprintf(to, " = %s", this->value.c_str());
- }
- fprintf(to, ";\n");
-}
-
-Expression::~Expression()
-{
-}
-
-LiteralExpression::LiteralExpression(const string& v)
- :value(v)
-{
-}
-
-LiteralExpression::~LiteralExpression()
-{
-}
-
-void
-LiteralExpression::Write(FILE* to)
-{
- fprintf(to, "%s", this->value.c_str());
-}
-
-StringLiteralExpression::StringLiteralExpression(const string& v)
- :value(v)
-{
-}
-
-StringLiteralExpression::~StringLiteralExpression()
-{
-}
-
-void
-StringLiteralExpression::Write(FILE* to)
-{
- fprintf(to, "\"%s\"", this->value.c_str());
-}
-
-Variable::Variable()
- :type(NULL),
- name(),
- dimension(0)
-{
-}
-
-Variable::Variable(Type* t, const string& n)
- :type(t),
- name(n),
- dimension(0)
-{
-}
-
-Variable::Variable(Type* t, const string& n, int d)
- :type(t),
- name(n),
- dimension(d)
-{
-}
-
-Variable::~Variable()
-{
-}
-
-void
-Variable::GatherTypes(set<Type*>* types) const
-{
- types->insert(this->type);
-}
-
-void
-Variable::WriteDeclaration(FILE* to)
-{
- string dim;
- for (int i=0; i<this->dimension; i++) {
- dim += "[]";
- }
- fprintf(to, "%s%s %s", this->type->QualifiedName().c_str(), dim.c_str(),
- this->name.c_str());
-}
-
-void
-Variable::Write(FILE* to)
-{
- fprintf(to, "%s", name.c_str());
-}
-
-FieldVariable::FieldVariable(Expression* o, const string& n)
- :object(o),
- clazz(NULL),
- name(n)
-{
-}
-
-FieldVariable::FieldVariable(Type* c, const string& n)
- :object(NULL),
- clazz(c),
- name(n)
-{
-}
-
-FieldVariable::~FieldVariable()
-{
-}
-
-void
-FieldVariable::Write(FILE* to)
-{
- if (this->object != NULL) {
- this->object->Write(to);
- }
- else if (this->clazz != NULL) {
- fprintf(to, "%s", this->clazz->QualifiedName().c_str());
- }
- fprintf(to, ".%s", name.c_str());
-}
-
-
-Statement::~Statement()
-{
-}
-
-StatementBlock::StatementBlock()
-{
-}
-
-StatementBlock::~StatementBlock()
-{
-}
-
-void
-StatementBlock::Write(FILE* to)
-{
- fprintf(to, "{\n");
- int N = this->statements.size();
- for (int i=0; i<N; i++) {
- this->statements[i]->Write(to);
- }
- fprintf(to, "}\n");
-}
-
-void
-StatementBlock::Add(Statement* statement)
-{
- this->statements.push_back(statement);
-}
-
-void
-StatementBlock::Add(Expression* expression)
-{
- this->statements.push_back(new ExpressionStatement(expression));
-}
-
-ExpressionStatement::ExpressionStatement(Expression* e)
- :expression(e)
-{
-}
-
-ExpressionStatement::~ExpressionStatement()
-{
-}
-
-void
-ExpressionStatement::Write(FILE* to)
-{
- this->expression->Write(to);
- fprintf(to, ";\n");
-}
-
-Assignment::Assignment(Variable* l, Expression* r)
- :lvalue(l),
- rvalue(r),
- cast(NULL)
-{
-}
-
-Assignment::Assignment(Variable* l, Expression* r, Type* c)
- :lvalue(l),
- rvalue(r),
- cast(c)
-{
-}
-
-Assignment::~Assignment()
-{
-}
-
-void
-Assignment::Write(FILE* to)
-{
- this->lvalue->Write(to);
- fprintf(to, " = ");
- if (this->cast != NULL) {
- fprintf(to, "(%s)", this->cast->QualifiedName().c_str());
- }
- this->rvalue->Write(to);
-}
-
-MethodCall::MethodCall(const string& n)
- :obj(NULL),
- clazz(NULL),
- name(n)
-{
-}
-
-MethodCall::MethodCall(const string& n, int argc = 0, ...)
- :obj(NULL),
- clazz(NULL),
- name(n)
-{
- va_list args;
- va_start(args, argc);
- init(argc, args);
- va_end(args);
-}
-
-MethodCall::MethodCall(Expression* o, const string& n)
- :obj(o),
- clazz(NULL),
- name(n)
-{
-}
-
-MethodCall::MethodCall(Type* t, const string& n)
- :obj(NULL),
- clazz(t),
- name(n)
-{
-}
-
-MethodCall::MethodCall(Expression* o, const string& n, int argc = 0, ...)
- :obj(o),
- clazz(NULL),
- name(n)
-{
- va_list args;
- va_start(args, argc);
- init(argc, args);
- va_end(args);
-}
-
-MethodCall::MethodCall(Type* t, const string& n, int argc = 0, ...)
- :obj(NULL),
- clazz(t),
- name(n)
-{
- va_list args;
- va_start(args, argc);
- init(argc, args);
- va_end(args);
-}
-
-MethodCall::~MethodCall()
-{
-}
-
-void
-MethodCall::init(int n, va_list args)
-{
- for (int i=0; i<n; i++) {
- Expression* expression = (Expression*)va_arg(args, void*);
- this->arguments.push_back(expression);
- }
-}
-
-void
-MethodCall::Write(FILE* to)
-{
- if (this->obj != NULL) {
- this->obj->Write(to);
- fprintf(to, ".");
- }
- else if (this->clazz != NULL) {
- fprintf(to, "%s.", this->clazz->QualifiedName().c_str());
- }
- fprintf(to, "%s(", this->name.c_str());
- WriteArgumentList(to, this->arguments);
- fprintf(to, ")");
-}
-
-Comparison::Comparison(Expression* l, const string& o, Expression* r)
- :lvalue(l),
- op(o),
- rvalue(r)
-{
-}
-
-Comparison::~Comparison()
-{
-}
-
-void
-Comparison::Write(FILE* to)
-{
- fprintf(to, "(");
- this->lvalue->Write(to);
- fprintf(to, "%s", this->op.c_str());
- this->rvalue->Write(to);
- fprintf(to, ")");
-}
-
-NewExpression::NewExpression(Type* t)
- :type(t)
-{
-}
-
-NewExpression::NewExpression(Type* t, int argc = 0, ...)
- :type(t)
-{
- va_list args;
- va_start(args, argc);
- init(argc, args);
- va_end(args);
-}
-
-NewExpression::~NewExpression()
-{
-}
-
-void
-NewExpression::init(int n, va_list args)
-{
- for (int i=0; i<n; i++) {
- Expression* expression = (Expression*)va_arg(args, void*);
- this->arguments.push_back(expression);
- }
-}
-
-void
-NewExpression::Write(FILE* to)
-{
- fprintf(to, "new %s(", this->type->InstantiableName().c_str());
- WriteArgumentList(to, this->arguments);
- fprintf(to, ")");
-}
-
-NewArrayExpression::NewArrayExpression(Type* t, Expression* s)
- :type(t),
- size(s)
-{
-}
-
-NewArrayExpression::~NewArrayExpression()
-{
-}
-
-void
-NewArrayExpression::Write(FILE* to)
-{
- fprintf(to, "new %s[", this->type->QualifiedName().c_str());
- size->Write(to);
- fprintf(to, "]");
-}
-
-Ternary::Ternary()
- :condition(NULL),
- ifpart(NULL),
- elsepart(NULL)
-{
-}
-
-Ternary::Ternary(Expression* a, Expression* b, Expression* c)
- :condition(a),
- ifpart(b),
- elsepart(c)
-{
-}
-
-Ternary::~Ternary()
-{
-}
-
-void
-Ternary::Write(FILE* to)
-{
- fprintf(to, "((");
- this->condition->Write(to);
- fprintf(to, ")?(");
- this->ifpart->Write(to);
- fprintf(to, "):(");
- this->elsepart->Write(to);
- fprintf(to, "))");
-}
-
-Cast::Cast()
- :type(NULL),
- expression(NULL)
-{
-}
-
-Cast::Cast(Type* t, Expression* e)
- :type(t),
- expression(e)
-{
-}
-
-Cast::~Cast()
-{
-}
-
-void
-Cast::Write(FILE* to)
-{
- fprintf(to, "((%s)", this->type->QualifiedName().c_str());
- expression->Write(to);
- fprintf(to, ")");
-}
-
-VariableDeclaration::VariableDeclaration(Variable* l, Expression* r, Type* c)
- :lvalue(l),
- cast(c),
- rvalue(r)
-{
-}
-
-VariableDeclaration::VariableDeclaration(Variable* l)
- :lvalue(l),
- cast(NULL),
- rvalue(NULL)
-{
-}
-
-VariableDeclaration::~VariableDeclaration()
-{
-}
-
-void
-VariableDeclaration::Write(FILE* to)
-{
- this->lvalue->WriteDeclaration(to);
- if (this->rvalue != NULL) {
- fprintf(to, " = ");
- if (this->cast != NULL) {
- fprintf(to, "(%s)", this->cast->QualifiedName().c_str());
- }
- this->rvalue->Write(to);
- }
- fprintf(to, ";\n");
-}
-
-IfStatement::IfStatement()
- :expression(NULL),
- statements(new StatementBlock),
- elseif(NULL)
-{
-}
-
-IfStatement::~IfStatement()
-{
-}
-
-void
-IfStatement::Write(FILE* to)
-{
- if (this->expression != NULL) {
- fprintf(to, "if (");
- this->expression->Write(to);
- fprintf(to, ") ");
- }
- this->statements->Write(to);
- if (this->elseif != NULL) {
- fprintf(to, "else ");
- this->elseif->Write(to);
- }
-}
-
-ReturnStatement::ReturnStatement(Expression* e)
- :expression(e)
-{
-}
-
-ReturnStatement::~ReturnStatement()
-{
-}
-
-void
-ReturnStatement::Write(FILE* to)
-{
- fprintf(to, "return ");
- this->expression->Write(to);
- fprintf(to, ";\n");
-}
-
-TryStatement::TryStatement()
- :statements(new StatementBlock)
-{
-}
-
-TryStatement::~TryStatement()
-{
-}
-
-void
-TryStatement::Write(FILE* to)
-{
- fprintf(to, "try ");
- this->statements->Write(to);
-}
-
-CatchStatement::CatchStatement(Variable* e)
- :statements(new StatementBlock),
- exception(e)
-{
-}
-
-CatchStatement::~CatchStatement()
-{
-}
-
-void
-CatchStatement::Write(FILE* to)
-{
- fprintf(to, "catch ");
- if (this->exception != NULL) {
- fprintf(to, "(");
- this->exception->WriteDeclaration(to);
- fprintf(to, ") ");
- }
- this->statements->Write(to);
-}
-
-FinallyStatement::FinallyStatement()
- :statements(new StatementBlock)
-{
-}
-
-FinallyStatement::~FinallyStatement()
-{
-}
-
-void
-FinallyStatement::Write(FILE* to)
-{
- fprintf(to, "finally ");
- this->statements->Write(to);
-}
-
-Case::Case()
- :statements(new StatementBlock)
-{
-}
-
-Case::Case(const string& c)
- :statements(new StatementBlock)
-{
- cases.push_back(c);
-}
-
-Case::~Case()
-{
-}
-
-void
-Case::Write(FILE* to)
-{
- int N = this->cases.size();
- if (N > 0) {
- for (int i=0; i<N; i++) {
- string s = this->cases[i];
- if (s.length() != 0) {
- fprintf(to, "case %s:\n", s.c_str());
- } else {
- fprintf(to, "default:\n");
- }
- }
- } else {
- fprintf(to, "default:\n");
- }
- statements->Write(to);
-}
-
-SwitchStatement::SwitchStatement(Expression* e)
- :expression(e)
-{
-}
-
-SwitchStatement::~SwitchStatement()
-{
-}
-
-void
-SwitchStatement::Write(FILE* to)
-{
- fprintf(to, "switch (");
- this->expression->Write(to);
- fprintf(to, ")\n{\n");
- int N = this->cases.size();
- for (int i=0; i<N; i++) {
- this->cases[i]->Write(to);
- }
- fprintf(to, "}\n");
-}
-
-Break::Break()
-{
-}
-
-Break::~Break()
-{
-}
-
-void
-Break::Write(FILE* to)
-{
- fprintf(to, "break;\n");
-}
-
-Method::Method()
- :ClassElement(),
- modifiers(0),
- returnType(NULL), // (NULL means constructor)
- returnTypeDimension(0),
- statements(NULL)
-{
-}
-
-Method::~Method()
-{
-}
-
-void
-Method::GatherTypes(set<Type*>* types) const
-{
- size_t N, i;
-
- if (this->returnType) {
- types->insert(this->returnType);
- }
-
- N = this->parameters.size();
- for (i=0; i<N; i++) {
- this->parameters[i]->GatherTypes(types);
- }
-
- N = this->exceptions.size();
- for (i=0; i<N; i++) {
- types->insert(this->exceptions[i]);
- }
-}
-
-void
-Method::Write(FILE* to)
-{
- size_t N, i;
-
- if (this->comment.length() != 0) {
- fprintf(to, "%s\n", this->comment.c_str());
- }
-
- WriteModifiers(to, this->modifiers, SCOPE_MASK | STATIC | ABSTRACT | FINAL | OVERRIDE);
-
- if (this->returnType != NULL) {
- string dim;
- for (i=0; i<this->returnTypeDimension; i++) {
- dim += "[]";
- }
- fprintf(to, "%s%s ", this->returnType->QualifiedName().c_str(),
- dim.c_str());
- }
-
- fprintf(to, "%s(", this->name.c_str());
-
- N = this->parameters.size();
- for (i=0; i<N; i++) {
- this->parameters[i]->WriteDeclaration(to);
- if (i != N-1) {
- fprintf(to, ", ");
- }
- }
-
- fprintf(to, ")");
-
- N = this->exceptions.size();
- for (i=0; i<N; i++) {
- if (i == 0) {
- fprintf(to, " throws ");
- } else {
- fprintf(to, ", ");
- }
- fprintf(to, "%s", this->exceptions[i]->QualifiedName().c_str());
- }
-
- if (this->statements == NULL) {
- fprintf(to, ";\n");
- } else {
- fprintf(to, "\n");
- this->statements->Write(to);
- }
-}
-
-Class::Class()
- :modifiers(0),
- what(CLASS),
- type(NULL),
- extends(NULL)
-{
-}
-
-Class::~Class()
-{
-}
-
-void
-Class::GatherTypes(set<Type*>* types) const
-{
- int N, i;
-
- types->insert(this->type);
- if (this->extends != NULL) {
- types->insert(this->extends);
- }
-
- N = this->interfaces.size();
- for (i=0; i<N; i++) {
- types->insert(this->interfaces[i]);
- }
-
- N = this->elements.size();
- for (i=0; i<N; i++) {
- this->elements[i]->GatherTypes(types);
- }
-}
-
-void
-Class::Write(FILE* to)
-{
- size_t N, i;
-
- if (this->comment.length() != 0) {
- fprintf(to, "%s\n", this->comment.c_str());
- }
-
- WriteModifiers(to, this->modifiers, ALL_MODIFIERS);
-
- if (this->what == Class::CLASS) {
- fprintf(to, "class ");
- } else {
- fprintf(to, "interface ");
- }
-
- string name = this->type->Name();
- size_t pos = name.rfind('.');
- if (pos != string::npos) {
- name = name.c_str() + pos + 1;
- }
-
- fprintf(to, "%s", name.c_str());
-
- if (this->extends != NULL) {
- fprintf(to, " extends %s", this->extends->QualifiedName().c_str());
- }
-
- N = this->interfaces.size();
- if (N != 0) {
- if (this->what == Class::CLASS) {
- fprintf(to, " implements");
- } else {
- fprintf(to, " extends");
- }
- for (i=0; i<N; i++) {
- fprintf(to, " %s", this->interfaces[i]->QualifiedName().c_str());
- }
- }
-
- fprintf(to, "\n");
- fprintf(to, "{\n");
-
- N = this->elements.size();
- for (i=0; i<N; i++) {
- this->elements[i]->Write(to);
- }
-
- fprintf(to, "}\n");
-
-}
-
-Document::Document()
-{
-}
-
-Document::~Document()
-{
-}
-
-static string
-escape_backslashes(const string& str)
-{
- string result;
- const size_t I=str.length();
- for (size_t i=0; i<I; i++) {
- char c = str[i];
- if (c == '\\') {
- result += "\\\\";
- } else {
- result += c;
- }
- }
- return result;
-}
-
-void
-Document::Write(FILE* to)
-{
- size_t N, i;
-
- if (this->comment.length() != 0) {
- fprintf(to, "%s\n", this->comment.c_str());
- }
- fprintf(to, "/*\n"
- " * This file is auto-generated. DO NOT MODIFY.\n"
- " * Original file: %s\n"
- " */\n", escape_backslashes(this->originalSrc).c_str());
- if (this->package.length() != 0) {
- fprintf(to, "package %s;\n", this->package.c_str());
- }
-
- N = this->classes.size();
- for (i=0; i<N; i++) {
- Class* c = this->classes[i];
- c->Write(to);
- }
-}
-
diff --git a/tools/aidl/AST.h b/tools/aidl/AST.h
deleted file mode 100644
index ead5e7a..0000000
--- a/tools/aidl/AST.h
+++ /dev/null
@@ -1,371 +0,0 @@
-#ifndef AIDL_AST_H
-#define AIDL_AST_H
-
-#include <string>
-#include <vector>
-#include <set>
-#include <stdarg.h>
-#include <stdio.h>
-
-using namespace std;
-
-class Type;
-
-enum {
- PACKAGE_PRIVATE = 0x00000000,
- PUBLIC = 0x00000001,
- PRIVATE = 0x00000002,
- PROTECTED = 0x00000003,
- SCOPE_MASK = 0x00000003,
-
- STATIC = 0x00000010,
- FINAL = 0x00000020,
- ABSTRACT = 0x00000040,
-
- OVERRIDE = 0x00000100,
-
- ALL_MODIFIERS = 0xffffffff
-};
-
-// Write the modifiers that are set in both mod and mask
-void WriteModifiers(FILE* to, int mod, int mask);
-
-struct ClassElement
-{
- ClassElement();
- virtual ~ClassElement();
-
- virtual void GatherTypes(set<Type*>* types) const = 0;
- virtual void Write(FILE* to) = 0;
-};
-
-struct Expression
-{
- virtual ~Expression();
- virtual void Write(FILE* to) = 0;
-};
-
-struct LiteralExpression : public Expression
-{
- string value;
-
- LiteralExpression(const string& value);
- virtual ~LiteralExpression();
- virtual void Write(FILE* to);
-};
-
-// TODO: also escape the contents. not needed for now
-struct StringLiteralExpression : public Expression
-{
- string value;
-
- StringLiteralExpression(const string& value);
- virtual ~StringLiteralExpression();
- virtual void Write(FILE* to);
-};
-
-struct Variable : public Expression
-{
- Type* type;
- string name;
- int dimension;
-
- Variable();
- Variable(Type* type, const string& name);
- Variable(Type* type, const string& name, int dimension);
- virtual ~Variable();
-
- virtual void GatherTypes(set<Type*>* types) const;
- void WriteDeclaration(FILE* to);
- void Write(FILE* to);
-};
-
-struct FieldVariable : public Expression
-{
- Expression* object;
- Type* clazz;
- string name;
-
- FieldVariable(Expression* object, const string& name);
- FieldVariable(Type* clazz, const string& name);
- virtual ~FieldVariable();
-
- void Write(FILE* to);
-};
-
-struct Field : public ClassElement
-{
- string comment;
- int modifiers;
- Variable *variable;
- string value;
-
- Field();
- Field(int modifiers, Variable* variable);
- virtual ~Field();
-
- virtual void GatherTypes(set<Type*>* types) const;
- virtual void Write(FILE* to);
-};
-
-struct Statement
-{
- virtual ~Statement();
- virtual void Write(FILE* to) = 0;
-};
-
-struct StatementBlock : public Statement
-{
- vector<Statement*> statements;
-
- StatementBlock();
- virtual ~StatementBlock();
- virtual void Write(FILE* to);
-
- void Add(Statement* statement);
- void Add(Expression* expression);
-};
-
-struct ExpressionStatement : public Statement
-{
- Expression* expression;
-
- ExpressionStatement(Expression* expression);
- virtual ~ExpressionStatement();
- virtual void Write(FILE* to);
-};
-
-struct Assignment : public Expression
-{
- Variable* lvalue;
- Expression* rvalue;
- Type* cast;
-
- Assignment(Variable* lvalue, Expression* rvalue);
- Assignment(Variable* lvalue, Expression* rvalue, Type* cast);
- virtual ~Assignment();
- virtual void Write(FILE* to);
-};
-
-struct MethodCall : public Expression
-{
- Expression* obj;
- Type* clazz;
- string name;
- vector<Expression*> arguments;
- vector<string> exceptions;
-
- MethodCall(const string& name);
- MethodCall(const string& name, int argc, ...);
- MethodCall(Expression* obj, const string& name);
- MethodCall(Type* clazz, const string& name);
- MethodCall(Expression* obj, const string& name, int argc, ...);
- MethodCall(Type* clazz, const string& name, int argc, ...);
- virtual ~MethodCall();
- virtual void Write(FILE* to);
-
-private:
- void init(int n, va_list args);
-};
-
-struct Comparison : public Expression
-{
- Expression* lvalue;
- string op;
- Expression* rvalue;
-
- Comparison(Expression* lvalue, const string& op, Expression* rvalue);
- virtual ~Comparison();
- virtual void Write(FILE* to);
-};
-
-struct NewExpression : public Expression
-{
- Type* type;
- vector<Expression*> arguments;
-
- NewExpression(Type* type);
- NewExpression(Type* type, int argc, ...);
- virtual ~NewExpression();
- virtual void Write(FILE* to);
-
-private:
- void init(int n, va_list args);
-};
-
-struct NewArrayExpression : public Expression
-{
- Type* type;
- Expression* size;
-
- NewArrayExpression(Type* type, Expression* size);
- virtual ~NewArrayExpression();
- virtual void Write(FILE* to);
-};
-
-struct Ternary : public Expression
-{
- Expression* condition;
- Expression* ifpart;
- Expression* elsepart;
-
- Ternary();
- Ternary(Expression* condition, Expression* ifpart, Expression* elsepart);
- virtual ~Ternary();
- virtual void Write(FILE* to);
-};
-
-struct Cast : public Expression
-{
- Type* type;
- Expression* expression;
-
- Cast();
- Cast(Type* type, Expression* expression);
- virtual ~Cast();
- virtual void Write(FILE* to);
-};
-
-struct VariableDeclaration : public Statement
-{
- Variable* lvalue;
- Type* cast;
- Expression* rvalue;
-
- VariableDeclaration(Variable* lvalue);
- VariableDeclaration(Variable* lvalue, Expression* rvalue, Type* cast = NULL);
- virtual ~VariableDeclaration();
- virtual void Write(FILE* to);
-};
-
-struct IfStatement : public Statement
-{
- Expression* expression;
- StatementBlock* statements;
- IfStatement* elseif;
-
- IfStatement();
- virtual ~IfStatement();
- virtual void Write(FILE* to);
-};
-
-struct ReturnStatement : public Statement
-{
- Expression* expression;
-
- ReturnStatement(Expression* expression);
- virtual ~ReturnStatement();
- virtual void Write(FILE* to);
-};
-
-struct TryStatement : public Statement
-{
- StatementBlock* statements;
-
- TryStatement();
- virtual ~TryStatement();
- virtual void Write(FILE* to);
-};
-
-struct CatchStatement : public Statement
-{
- StatementBlock* statements;
- Variable* exception;
-
- CatchStatement(Variable* exception);
- virtual ~CatchStatement();
- virtual void Write(FILE* to);
-};
-
-struct FinallyStatement : public Statement
-{
- StatementBlock* statements;
-
- FinallyStatement();
- virtual ~FinallyStatement();
- virtual void Write(FILE* to);
-};
-
-struct Case
-{
- vector<string> cases;
- StatementBlock* statements;
-
- Case();
- Case(const string& c);
- virtual ~Case();
- virtual void Write(FILE* to);
-};
-
-struct SwitchStatement : public Statement
-{
- Expression* expression;
- vector<Case*> cases;
-
- SwitchStatement(Expression* expression);
- virtual ~SwitchStatement();
- virtual void Write(FILE* to);
-};
-
-struct Break : public Statement
-{
- Break();
- virtual ~Break();
- virtual void Write(FILE* to);
-};
-
-struct Method : public ClassElement
-{
- string comment;
- int modifiers;
- Type* returnType;
- size_t returnTypeDimension;
- string name;
- vector<Variable*> parameters;
- vector<Type*> exceptions;
- StatementBlock* statements;
-
- Method();
- virtual ~Method();
-
- virtual void GatherTypes(set<Type*>* types) const;
- virtual void Write(FILE* to);
-};
-
-struct Class : public ClassElement
-{
- enum {
- CLASS,
- INTERFACE
- };
-
- string comment;
- int modifiers;
- int what; // CLASS or INTERFACE
- Type* type;
- Type* extends;
- vector<Type*> interfaces;
- vector<ClassElement*> elements;
-
- Class();
- virtual ~Class();
-
- virtual void GatherTypes(set<Type*>* types) const;
- virtual void Write(FILE* to);
-};
-
-struct Document
-{
- string comment;
- string package;
- string originalSrc;
- set<Type*> imports;
- vector<Class*> classes;
-
- Document();
- virtual ~Document();
-
- virtual void Write(FILE* to);
-};
-
-#endif // AIDL_AST_H
diff --git a/tools/aidl/Android.mk b/tools/aidl/Android.mk
deleted file mode 100644
index 77d46ab..0000000
--- a/tools/aidl/Android.mk
+++ /dev/null
@@ -1,29 +0,0 @@
-# Copyright 2007 The Android Open Source Project
-#
-# Copies files into the directory structure described by a manifest
-
-# This tool is prebuilt if we're doing an app-only build.
-ifeq ($(TARGET_BUILD_APPS),)
-
-LOCAL_PATH:= $(call my-dir)
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := \
- aidl_language_l.l \
- aidl_language_y.y \
- aidl.cpp \
- aidl_language.cpp \
- options.cpp \
- search_path.cpp \
- AST.cpp \
- Type.cpp \
- generate_java.cpp \
- generate_java_binder.cpp \
- generate_java_rpc.cpp
-
-LOCAL_CFLAGS := -g
-LOCAL_MODULE := aidl
-
-include $(BUILD_HOST_EXECUTABLE)
-
-endif # TARGET_BUILD_APPS
diff --git a/tools/aidl/NOTICE b/tools/aidl/NOTICE
deleted file mode 100644
index c5b1efa..0000000
--- a/tools/aidl/NOTICE
+++ /dev/null
@@ -1,190 +0,0 @@
-
- Copyright (c) 2005-2008, The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-
-
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
diff --git a/tools/aidl/Type.cpp b/tools/aidl/Type.cpp
deleted file mode 100644
index d572af6..0000000
--- a/tools/aidl/Type.cpp
+++ /dev/null
@@ -1,1440 +0,0 @@
-#include "Type.h"
-
-Namespace NAMES;
-
-Type* VOID_TYPE;
-Type* BOOLEAN_TYPE;
-Type* BYTE_TYPE;
-Type* CHAR_TYPE;
-Type* INT_TYPE;
-Type* LONG_TYPE;
-Type* FLOAT_TYPE;
-Type* DOUBLE_TYPE;
-Type* STRING_TYPE;
-Type* OBJECT_TYPE;
-Type* CHAR_SEQUENCE_TYPE;
-Type* TEXT_UTILS_TYPE;
-Type* REMOTE_EXCEPTION_TYPE;
-Type* RUNTIME_EXCEPTION_TYPE;
-Type* IBINDER_TYPE;
-Type* IINTERFACE_TYPE;
-Type* BINDER_NATIVE_TYPE;
-Type* BINDER_PROXY_TYPE;
-Type* PARCEL_TYPE;
-Type* PARCELABLE_INTERFACE_TYPE;
-Type* CONTEXT_TYPE;
-Type* MAP_TYPE;
-Type* LIST_TYPE;
-Type* CLASSLOADER_TYPE;
-Type* RPC_DATA_TYPE;
-Type* RPC_ERROR_TYPE;
-Type* EVENT_FAKE_TYPE;
-
-Expression* NULL_VALUE;
-Expression* THIS_VALUE;
-Expression* SUPER_VALUE;
-Expression* TRUE_VALUE;
-Expression* FALSE_VALUE;
-
-void
-register_base_types()
-{
- VOID_TYPE = new BasicType("void",
- "XXX", "XXX", "XXX", "XXX", "XXX",
- "XXX", "XXX", "XXX", "XXX", "XXX");
- NAMES.Add(VOID_TYPE);
-
- BOOLEAN_TYPE = new BooleanType();
- NAMES.Add(BOOLEAN_TYPE);
-
- BYTE_TYPE = new BasicType("byte",
- "writeByte", "readByte", "writeByteArray", "createByteArray", "readByteArray",
- "putByte", "getByte", "putByteArray", "createByteArray", "getByteArray");
- NAMES.Add(BYTE_TYPE);
-
- CHAR_TYPE = new CharType();
- NAMES.Add(CHAR_TYPE);
-
- INT_TYPE = new BasicType("int",
- "writeInt", "readInt", "writeIntArray", "createIntArray", "readIntArray",
- "putInteger", "getInteger", "putIntegerArray", "createIntegerArray", "getIntegerArray");
- NAMES.Add(INT_TYPE);
-
- LONG_TYPE = new BasicType("long",
- "writeLong", "readLong", "writeLongArray", "createLongArray", "readLongArray",
- "putLong", "getLong", "putLongArray", "createLongArray", "getLongArray");
- NAMES.Add(LONG_TYPE);
-
- FLOAT_TYPE = new BasicType("float",
- "writeFloat", "readFloat", "writeFloatArray", "createFloatArray", "readFloatArray",
- "putFloat", "getFloat", "putFloatArray", "createFloatArray", "getFloatArray");
- NAMES.Add(FLOAT_TYPE);
-
- DOUBLE_TYPE = new BasicType("double",
- "writeDouble", "readDouble", "writeDoubleArray", "createDoubleArray", "readDoubleArray",
- "putDouble", "getDouble", "putDoubleArray", "createDoubleArray", "getDoubleArray");
- NAMES.Add(DOUBLE_TYPE);
-
- STRING_TYPE = new StringType();
- NAMES.Add(STRING_TYPE);
-
- OBJECT_TYPE = new Type("java.lang", "Object", Type::BUILT_IN, false, false, false);
- NAMES.Add(OBJECT_TYPE);
-
- CHAR_SEQUENCE_TYPE = new CharSequenceType();
- NAMES.Add(CHAR_SEQUENCE_TYPE);
-
- MAP_TYPE = new MapType();
- NAMES.Add(MAP_TYPE);
-
- LIST_TYPE = new ListType();
- NAMES.Add(LIST_TYPE);
-
- TEXT_UTILS_TYPE = new Type("android.text", "TextUtils", Type::BUILT_IN, false, false, false);
- NAMES.Add(TEXT_UTILS_TYPE);
-
- REMOTE_EXCEPTION_TYPE = new RemoteExceptionType();
- NAMES.Add(REMOTE_EXCEPTION_TYPE);
-
- RUNTIME_EXCEPTION_TYPE = new RuntimeExceptionType();
- NAMES.Add(RUNTIME_EXCEPTION_TYPE);
-
- IBINDER_TYPE = new IBinderType();
- NAMES.Add(IBINDER_TYPE);
-
- IINTERFACE_TYPE = new IInterfaceType();
- NAMES.Add(IINTERFACE_TYPE);
-
- BINDER_NATIVE_TYPE = new BinderType();
- NAMES.Add(BINDER_NATIVE_TYPE);
-
- BINDER_PROXY_TYPE = new BinderProxyType();
- NAMES.Add(BINDER_PROXY_TYPE);
-
- PARCEL_TYPE = new ParcelType();
- NAMES.Add(PARCEL_TYPE);
-
- PARCELABLE_INTERFACE_TYPE = new ParcelableInterfaceType();
- NAMES.Add(PARCELABLE_INTERFACE_TYPE);
-
- CONTEXT_TYPE = new Type("android.content", "Context", Type::BUILT_IN, false, false, false);
- NAMES.Add(CONTEXT_TYPE);
-
- RPC_DATA_TYPE = new RpcDataType();
- NAMES.Add(RPC_DATA_TYPE);
-
- RPC_ERROR_TYPE = new UserDataType("android.support.place.rpc", "RpcError",
- true, __FILE__, __LINE__);
- NAMES.Add(RPC_ERROR_TYPE);
-
- EVENT_FAKE_TYPE = new Type("event", Type::BUILT_IN, false, false, false);
- NAMES.Add(EVENT_FAKE_TYPE);
-
- CLASSLOADER_TYPE = new ClassLoaderType();
- NAMES.Add(CLASSLOADER_TYPE);
-
- NULL_VALUE = new LiteralExpression("null");
- THIS_VALUE = new LiteralExpression("this");
- SUPER_VALUE = new LiteralExpression("super");
- TRUE_VALUE = new LiteralExpression("true");
- FALSE_VALUE = new LiteralExpression("false");
-
- NAMES.AddGenericType("java.util", "List", 1);
- NAMES.AddGenericType("java.util", "Map", 2);
-}
-
-static Type*
-make_generic_type(const string& package, const string& name,
- const vector<Type*>& args)
-{
- if (package == "java.util" && name == "List") {
- return new GenericListType("java.util", "List", args);
- }
- return NULL;
- //return new GenericType(package, name, args);
-}
-
-// ================================================================
-
-Type::Type(const string& name, int kind, bool canWriteToParcel, bool canWriteToRpcData,
- bool canBeOut)
- :m_package(),
- m_name(name),
- m_declFile(""),
- m_declLine(-1),
- m_kind(kind),
- m_canWriteToParcel(canWriteToParcel),
- m_canWriteToRpcData(canWriteToRpcData),
- m_canBeOut(canBeOut)
-{
- m_qualifiedName = name;
-}
-
-Type::Type(const string& package, const string& name,
- int kind, bool canWriteToParcel, bool canWriteToRpcData,
- bool canBeOut, const string& declFile, int declLine)
- :m_package(package),
- m_name(name),
- m_declFile(declFile),
- m_declLine(declLine),
- m_kind(kind),
- m_canWriteToParcel(canWriteToParcel),
- m_canWriteToRpcData(canWriteToRpcData),
- m_canBeOut(canBeOut)
-{
- if (package.length() > 0) {
- m_qualifiedName = package;
- m_qualifiedName += '.';
- }
- m_qualifiedName += name;
-}
-
-Type::~Type()
-{
-}
-
-bool
-Type::CanBeArray() const
-{
- return false;
-}
-
-string
-Type::ImportType() const
-{
- return m_qualifiedName;
-}
-
-string
-Type::CreatorName() const
-{
- return "";
-}
-
-string
-Type::RpcCreatorName() const
-{
- return "";
-}
-
-string
-Type::InstantiableName() const
-{
- return QualifiedName();
-}
-
-
-void
-Type::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags)
-{
- fprintf(stderr, "aidl:internal error %s:%d qualifiedName=%sn",
- __FILE__, __LINE__, m_qualifiedName.c_str());
- addTo->Add(new LiteralExpression("/* WriteToParcel error "
- + m_qualifiedName + " */"));
-}
-
-void
-Type::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**)
-{
- fprintf(stderr, "aidl:internal error %s:%d qualifiedName=%s\n",
- __FILE__, __LINE__, m_qualifiedName.c_str());
- addTo->Add(new LiteralExpression("/* CreateFromParcel error "
- + m_qualifiedName + " */"));
-}
-
-void
-Type::ReadFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**)
-{
- fprintf(stderr, "aidl:internal error %s:%d qualifiedName=%s\n",
- __FILE__, __LINE__, m_qualifiedName.c_str());
- addTo->Add(new LiteralExpression("/* ReadFromParcel error "
- + m_qualifiedName + " */"));
-}
-
-void
-Type::WriteArrayToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags)
-{
- fprintf(stderr, "aidl:internal error %s:%d qualifiedName=%s\n",
- __FILE__, __LINE__, m_qualifiedName.c_str());
- addTo->Add(new LiteralExpression("/* WriteArrayToParcel error "
- + m_qualifiedName + " */"));
-}
-
-void
-Type::CreateArrayFromParcel(StatementBlock* addTo, Variable* v,
- Variable* parcel, Variable**)
-{
- fprintf(stderr, "aidl:internal error %s:%d qualifiedName=%s\n",
- __FILE__, __LINE__, m_qualifiedName.c_str());
- addTo->Add(new LiteralExpression("/* CreateArrayFromParcel error "
- + m_qualifiedName + " */"));
-}
-
-void
-Type::ReadArrayFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**)
-{
- fprintf(stderr, "aidl:internal error %s:%d qualifiedName=%s\n",
- __FILE__, __LINE__, m_qualifiedName.c_str());
- addTo->Add(new LiteralExpression("/* ReadArrayFromParcel error "
- + m_qualifiedName + " */"));
-}
-
-void
-Type::WriteToRpcData(StatementBlock* addTo, Expression* k, Variable* v,
- Variable* data, int flags)
-{
- fprintf(stderr, "aidl:internal error %s:%d qualifiedName=%s\n",
- __FILE__, __LINE__, m_qualifiedName.c_str());
- addTo->Add(new LiteralExpression("/* WriteToRpcData error "
- + m_qualifiedName + " */"));
-}
-
-void
-Type::CreateFromRpcData(StatementBlock* addTo, Expression* k, Variable* v, Variable* data,
- Variable** cl)
-{
- fprintf(stderr, "aidl:internal error %s:%d qualifiedName=%s\n",
- __FILE__, __LINE__, m_qualifiedName.c_str());
- addTo->Add(new LiteralExpression("/* ReadFromRpcData error "
- + m_qualifiedName + " */"));
-}
-
-void
-Type::SetQualifiedName(const string& qualified)
-{
- m_qualifiedName = qualified;
-}
-
-Expression*
-Type::BuildWriteToParcelFlags(int flags)
-{
- if (flags == 0) {
- return new LiteralExpression("0");
- }
- if ((flags&PARCELABLE_WRITE_RETURN_VALUE) != 0) {
- return new FieldVariable(PARCELABLE_INTERFACE_TYPE,
- "PARCELABLE_WRITE_RETURN_VALUE");
- }
- return new LiteralExpression("0");
-}
-
-// ================================================================
-
-BasicType::BasicType(const string& name, const string& marshallParcel,
- const string& unmarshallParcel, const string& writeArrayParcel,
- const string& createArrayParcel, const string& readArrayParcel,
- const string& marshallRpc, const string& unmarshallRpc,
- const string& writeArrayRpc, const string& createArrayRpc, const string& readArrayRpc)
- :Type(name, BUILT_IN, true, true, false),
- m_marshallParcel(marshallParcel),
- m_unmarshallParcel(unmarshallParcel),
- m_writeArrayParcel(writeArrayParcel),
- m_createArrayParcel(createArrayParcel),
- m_readArrayParcel(readArrayParcel),
- m_marshallRpc(marshallRpc),
- m_unmarshallRpc(unmarshallRpc),
- m_writeArrayRpc(writeArrayRpc),
- m_createArrayRpc(createArrayRpc),
- m_readArrayRpc(readArrayRpc)
-{
-}
-
-void
-BasicType::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags)
-{
- addTo->Add(new MethodCall(parcel, m_marshallParcel, 1, v));
-}
-
-void
-BasicType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**)
-{
- addTo->Add(new Assignment(v, new MethodCall(parcel, m_unmarshallParcel)));
-}
-
-bool
-BasicType::CanBeArray() const
-{
- return true;
-}
-
-void
-BasicType::WriteArrayToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags)
-{
- addTo->Add(new MethodCall(parcel, m_writeArrayParcel, 1, v));
-}
-
-void
-BasicType::CreateArrayFromParcel(StatementBlock* addTo, Variable* v,
- Variable* parcel, Variable**)
-{
- addTo->Add(new Assignment(v, new MethodCall(parcel, m_createArrayParcel)));
-}
-
-void
-BasicType::ReadArrayFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**)
-{
- addTo->Add(new MethodCall(parcel, m_readArrayParcel, 1, v));
-}
-
-void
-BasicType::WriteToRpcData(StatementBlock* addTo, Expression* k, Variable* v,
- Variable* data, int flags)
-{
- addTo->Add(new MethodCall(data, m_marshallRpc, 2, k, v));
-}
-
-void
-BasicType::CreateFromRpcData(StatementBlock* addTo, Expression* k, Variable* v, Variable* data,
- Variable** cl)
-{
- addTo->Add(new Assignment(v, new MethodCall(data, m_unmarshallRpc, 1, k)));
-}
-
-// ================================================================
-
-BooleanType::BooleanType()
- :Type("boolean", BUILT_IN, true, true, false)
-{
-}
-
-void
-BooleanType::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags)
-{
- addTo->Add(new MethodCall(parcel, "writeInt", 1,
- new Ternary(v, new LiteralExpression("1"),
- new LiteralExpression("0"))));
-}
-
-void
-BooleanType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**)
-{
- addTo->Add(new Assignment(v, new Comparison(new LiteralExpression("0"),
- "!=", new MethodCall(parcel, "readInt"))));
-}
-
-bool
-BooleanType::CanBeArray() const
-{
- return true;
-}
-
-void
-BooleanType::WriteArrayToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags)
-{
- addTo->Add(new MethodCall(parcel, "writeBooleanArray", 1, v));
-}
-
-void
-BooleanType::CreateArrayFromParcel(StatementBlock* addTo, Variable* v,
- Variable* parcel, Variable**)
-{
- addTo->Add(new Assignment(v, new MethodCall(parcel, "createBooleanArray")));
-}
-
-void
-BooleanType::ReadArrayFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**)
-{
- addTo->Add(new MethodCall(parcel, "readBooleanArray", 1, v));
-}
-
-void
-BooleanType::WriteToRpcData(StatementBlock* addTo, Expression* k, Variable* v,
- Variable* data, int flags)
-{
- addTo->Add(new MethodCall(data, "putBoolean", 2, k, v));
-}
-
-void
-BooleanType::CreateFromRpcData(StatementBlock* addTo, Expression* k, Variable* v, Variable* data,
- Variable** cl)
-{
- addTo->Add(new Assignment(v, new MethodCall(data, "getBoolean", 1, k)));
-}
-
-// ================================================================
-
-CharType::CharType()
- :Type("char", BUILT_IN, true, true, false)
-{
-}
-
-void
-CharType::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags)
-{
- addTo->Add(new MethodCall(parcel, "writeInt", 1,
- new Cast(INT_TYPE, v)));
-}
-
-void
-CharType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**)
-{
- addTo->Add(new Assignment(v, new MethodCall(parcel, "readInt"), this));
-}
-
-bool
-CharType::CanBeArray() const
-{
- return true;
-}
-
-void
-CharType::WriteArrayToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags)
-{
- addTo->Add(new MethodCall(parcel, "writeCharArray", 1, v));
-}
-
-void
-CharType::CreateArrayFromParcel(StatementBlock* addTo, Variable* v,
- Variable* parcel, Variable**)
-{
- addTo->Add(new Assignment(v, new MethodCall(parcel, "createCharArray")));
-}
-
-void
-CharType::ReadArrayFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**)
-{
- addTo->Add(new MethodCall(parcel, "readCharArray", 1, v));
-}
-
-void
-CharType::WriteToRpcData(StatementBlock* addTo, Expression* k, Variable* v,
- Variable* data, int flags)
-{
- addTo->Add(new MethodCall(data, "putChar", 2, k, v));
-}
-
-void
-CharType::CreateFromRpcData(StatementBlock* addTo, Expression* k, Variable* v, Variable* data,
- Variable** cl)
-{
- addTo->Add(new Assignment(v, new MethodCall(data, "getChar", 1, k)));
-}
-
-// ================================================================
-
-StringType::StringType()
- :Type("java.lang", "String", BUILT_IN, true, true, false)
-{
-}
-
-string
-StringType::CreatorName() const
-{
- return "android.os.Parcel.STRING_CREATOR";
-}
-
-void
-StringType::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags)
-{
- addTo->Add(new MethodCall(parcel, "writeString", 1, v));
-}
-
-void
-StringType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**)
-{
- addTo->Add(new Assignment(v, new MethodCall(parcel, "readString")));
-}
-
-bool
-StringType::CanBeArray() const
-{
- return true;
-}
-
-void
-StringType::WriteArrayToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags)
-{
- addTo->Add(new MethodCall(parcel, "writeStringArray", 1, v));
-}
-
-void
-StringType::CreateArrayFromParcel(StatementBlock* addTo, Variable* v,
- Variable* parcel, Variable**)
-{
- addTo->Add(new Assignment(v, new MethodCall(parcel, "createStringArray")));
-}
-
-void
-StringType::ReadArrayFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**)
-{
- addTo->Add(new MethodCall(parcel, "readStringArray", 1, v));
-}
-
-void
-StringType::WriteToRpcData(StatementBlock* addTo, Expression* k, Variable* v,
- Variable* data, int flags)
-{
- addTo->Add(new MethodCall(data, "putString", 2, k, v));
-}
-
-void
-StringType::CreateFromRpcData(StatementBlock* addTo, Expression* k, Variable* v,
- Variable* data, Variable**)
-{
- addTo->Add(new Assignment(v, new MethodCall(data, "getString", 1, k)));
-}
-
-// ================================================================
-
-CharSequenceType::CharSequenceType()
- :Type("java.lang", "CharSequence", BUILT_IN, true, true, false)
-{
-}
-
-string
-CharSequenceType::CreatorName() const
-{
- return "android.os.Parcel.STRING_CREATOR";
-}
-
-void
-CharSequenceType::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags)
-{
- // if (v != null) {
- // parcel.writeInt(1);
- // v.writeToParcel(parcel);
- // } else {
- // parcel.writeInt(0);
- // }
- IfStatement* elsepart = new IfStatement();
- elsepart->statements->Add(new MethodCall(parcel, "writeInt", 1,
- new LiteralExpression("0")));
- IfStatement* ifpart = new IfStatement;
- ifpart->expression = new Comparison(v, "!=", NULL_VALUE);
- ifpart->elseif = elsepart;
- ifpart->statements->Add(new MethodCall(parcel, "writeInt", 1,
- new LiteralExpression("1")));
- ifpart->statements->Add(new MethodCall(TEXT_UTILS_TYPE, "writeToParcel",
- 3, v, parcel, BuildWriteToParcelFlags(flags)));
-
- addTo->Add(ifpart);
-}
-
-void
-CharSequenceType::CreateFromParcel(StatementBlock* addTo, Variable* v,
- Variable* parcel, Variable**)
-{
- // if (0 != parcel.readInt()) {
- // v = TextUtils.createFromParcel(parcel)
- // } else {
- // v = null;
- // }
- IfStatement* elsepart = new IfStatement();
- elsepart->statements->Add(new Assignment(v, NULL_VALUE));
-
- IfStatement* ifpart = new IfStatement();
- ifpart->expression = new Comparison(new LiteralExpression("0"), "!=",
- new MethodCall(parcel, "readInt"));
- ifpart->elseif = elsepart;
- ifpart->statements->Add(new Assignment(v,
- new MethodCall(TEXT_UTILS_TYPE,
- "CHAR_SEQUENCE_CREATOR.createFromParcel", 1, parcel)));
-
- addTo->Add(ifpart);
-}
-
-
-// ================================================================
-
-RemoteExceptionType::RemoteExceptionType()
- :Type("android.os", "RemoteException", BUILT_IN, false, false, false)
-{
-}
-
-void
-RemoteExceptionType::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags)
-{
- fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
-}
-
-void
-RemoteExceptionType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**)
-{
- fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
-}
-
-// ================================================================
-
-RuntimeExceptionType::RuntimeExceptionType()
- :Type("java.lang", "RuntimeException", BUILT_IN, false, false, false)
-{
-}
-
-void
-RuntimeExceptionType::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags)
-{
- fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
-}
-
-void
-RuntimeExceptionType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**)
-{
- fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
-}
-
-
-// ================================================================
-
-IBinderType::IBinderType()
- :Type("android.os", "IBinder", BUILT_IN, true, false, false)
-{
-}
-
-void
-IBinderType::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags)
-{
- addTo->Add(new MethodCall(parcel, "writeStrongBinder", 1, v));
-}
-
-void
-IBinderType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**)
-{
- addTo->Add(new Assignment(v, new MethodCall(parcel, "readStrongBinder")));
-}
-
-void
-IBinderType::WriteArrayToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags)
-{
- addTo->Add(new MethodCall(parcel, "writeBinderArray", 1, v));
-}
-
-void
-IBinderType::CreateArrayFromParcel(StatementBlock* addTo, Variable* v,
- Variable* parcel, Variable**)
-{
- addTo->Add(new Assignment(v, new MethodCall(parcel, "createBinderArray")));
-}
-
-void
-IBinderType::ReadArrayFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**)
-{
- addTo->Add(new MethodCall(parcel, "readBinderArray", 1, v));
-}
-
-
-// ================================================================
-
-IInterfaceType::IInterfaceType()
- :Type("android.os", "IInterface", BUILT_IN, false, false, false)
-{
-}
-
-void
-IInterfaceType::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags)
-{
- fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
-}
-
-void
-IInterfaceType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**)
-{
- fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
-}
-
-
-// ================================================================
-
-BinderType::BinderType()
- :Type("android.os", "Binder", BUILT_IN, false, false, false)
-{
-}
-
-void
-BinderType::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags)
-{
- fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
-}
-
-void
-BinderType::CreateFromParcel(StatementBlock* addTo, Variable* v,
- Variable* parcel, Variable**)
-{
- fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
-}
-
-
-// ================================================================
-
-BinderProxyType::BinderProxyType()
- :Type("android.os", "BinderProxy", BUILT_IN, false, false, false)
-{
-}
-
-void
-BinderProxyType::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags)
-{
- fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
-}
-
-void
-BinderProxyType::CreateFromParcel(StatementBlock* addTo, Variable* v,
- Variable* parcel, Variable**)
-{
- fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
-}
-
-
-// ================================================================
-
-ParcelType::ParcelType()
- :Type("android.os", "Parcel", BUILT_IN, false, false, false)
-{
-}
-
-void
-ParcelType::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags)
-{
- fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
-}
-
-void
-ParcelType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**)
-{
- fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
-}
-
-// ================================================================
-
-ParcelableInterfaceType::ParcelableInterfaceType()
- :Type("android.os", "Parcelable", BUILT_IN, false, false, false)
-{
-}
-
-void
-ParcelableInterfaceType::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags)
-{
- fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
-}
-
-void
-ParcelableInterfaceType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**)
-{
- fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, __LINE__);
-}
-
-// ================================================================
-
-MapType::MapType()
- :Type("java.util", "Map", BUILT_IN, true, false, true)
-{
-}
-
-void
-MapType::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags)
-{
- addTo->Add(new MethodCall(parcel, "writeMap", 1, v));
-}
-
-static void EnsureClassLoader(StatementBlock* addTo, Variable** cl)
-{
- // We don't want to look up the class loader once for every
- // collection argument, so ensure we do it at most once per method.
- if (*cl == NULL) {
- *cl = new Variable(CLASSLOADER_TYPE, "cl");
- addTo->Add(new VariableDeclaration(*cl,
- new LiteralExpression("this.getClass().getClassLoader()"),
- CLASSLOADER_TYPE));
- }
-}
-
-void
-MapType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable** cl)
-{
- EnsureClassLoader(addTo, cl);
- addTo->Add(new Assignment(v, new MethodCall(parcel, "readHashMap", 1, *cl)));
-}
-
-void
-MapType::ReadFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable** cl)
-{
- EnsureClassLoader(addTo, cl);
- addTo->Add(new MethodCall(parcel, "readMap", 2, v, *cl));
-}
-
-
-// ================================================================
-
-ListType::ListType()
- :Type("java.util", "List", BUILT_IN, true, true, true)
-{
-}
-
-string
-ListType::InstantiableName() const
-{
- return "java.util.ArrayList";
-}
-
-void
-ListType::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags)
-{
- addTo->Add(new MethodCall(parcel, "writeList", 1, v));
-}
-
-void
-ListType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable** cl)
-{
- EnsureClassLoader(addTo, cl);
- addTo->Add(new Assignment(v, new MethodCall(parcel, "readArrayList", 1, *cl)));
-}
-
-void
-ListType::ReadFromParcel(StatementBlock* addTo, Variable* v,
- Variable* parcel, Variable** cl)
-{
- EnsureClassLoader(addTo, cl);
- addTo->Add(new MethodCall(parcel, "readList", 2, v, *cl));
-}
-
-void
-ListType::WriteToRpcData(StatementBlock* addTo, Expression* k, Variable* v,
- Variable* data, int flags)
-{
- addTo->Add(new MethodCall(data, "putList", 2, k, v));
-}
-
-void
-ListType::CreateFromRpcData(StatementBlock* addTo, Expression* k, Variable* v, Variable* data,
- Variable** cl)
-{
- addTo->Add(new Assignment(v, new MethodCall(data, "getList", 1, k)));
-}
-
-// ================================================================
-
-UserDataType::UserDataType(const string& package, const string& name,
- bool builtIn, bool canWriteToParcel, bool canWriteToRpcData,
- const string& declFile, int declLine)
- :Type(package, name, builtIn ? BUILT_IN : USERDATA, canWriteToParcel, canWriteToRpcData,
- true, declFile, declLine)
-{
-}
-
-string
-UserDataType::CreatorName() const
-{
- return QualifiedName() + ".CREATOR";
-}
-
-string
-UserDataType::RpcCreatorName() const
-{
- return QualifiedName() + ".RPC_CREATOR";
-}
-
-void
-UserDataType::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags)
-{
- // if (v != null) {
- // parcel.writeInt(1);
- // v.writeToParcel(parcel);
- // } else {
- // parcel.writeInt(0);
- // }
- IfStatement* elsepart = new IfStatement();
- elsepart->statements->Add(new MethodCall(parcel, "writeInt", 1,
- new LiteralExpression("0")));
- IfStatement* ifpart = new IfStatement;
- ifpart->expression = new Comparison(v, "!=", NULL_VALUE);
- ifpart->elseif = elsepart;
- ifpart->statements->Add(new MethodCall(parcel, "writeInt", 1,
- new LiteralExpression("1")));
- ifpart->statements->Add(new MethodCall(v, "writeToParcel", 2,
- parcel, BuildWriteToParcelFlags(flags)));
-
- addTo->Add(ifpart);
-}
-
-void
-UserDataType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**)
-{
- // if (0 != parcel.readInt()) {
- // v = CLASS.CREATOR.createFromParcel(parcel)
- // } else {
- // v = null;
- // }
- IfStatement* elsepart = new IfStatement();
- elsepart->statements->Add(new Assignment(v, NULL_VALUE));
-
- IfStatement* ifpart = new IfStatement();
- ifpart->expression = new Comparison(new LiteralExpression("0"), "!=",
- new MethodCall(parcel, "readInt"));
- ifpart->elseif = elsepart;
- ifpart->statements->Add(new Assignment(v,
- new MethodCall(v->type, "CREATOR.createFromParcel", 1, parcel)));
-
- addTo->Add(ifpart);
-}
-
-void
-UserDataType::ReadFromParcel(StatementBlock* addTo, Variable* v,
- Variable* parcel, Variable**)
-{
- // TODO: really, we don't need to have this extra check, but we
- // don't have two separate marshalling code paths
- // if (0 != parcel.readInt()) {
- // v.readFromParcel(parcel)
- // }
- IfStatement* ifpart = new IfStatement();
- ifpart->expression = new Comparison(new LiteralExpression("0"), "!=",
- new MethodCall(parcel, "readInt"));
- ifpart->statements->Add(new MethodCall(v, "readFromParcel", 1, parcel));
- addTo->Add(ifpart);
-}
-
-bool
-UserDataType::CanBeArray() const
-{
- return true;
-}
-
-void
-UserDataType::WriteArrayToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags)
-{
- addTo->Add(new MethodCall(parcel, "writeTypedArray", 2, v,
- BuildWriteToParcelFlags(flags)));
-}
-
-void
-UserDataType::CreateArrayFromParcel(StatementBlock* addTo, Variable* v,
- Variable* parcel, Variable**)
-{
- string creator = v->type->QualifiedName() + ".CREATOR";
- addTo->Add(new Assignment(v, new MethodCall(parcel,
- "createTypedArray", 1, new LiteralExpression(creator))));
-}
-
-void
-UserDataType::ReadArrayFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**)
-{
- string creator = v->type->QualifiedName() + ".CREATOR";
- addTo->Add(new MethodCall(parcel, "readTypedArray", 2,
- v, new LiteralExpression(creator)));
-}
-
-void
-UserDataType::WriteToRpcData(StatementBlock* addTo, Expression* k, Variable* v,
- Variable* data, int flags)
-{
- // data.putFlattenable(k, v);
- addTo->Add(new MethodCall(data, "putFlattenable", 2, k, v));
-}
-
-void
-UserDataType::CreateFromRpcData(StatementBlock* addTo, Expression* k, Variable* v,
- Variable* data, Variable** cl)
-{
- // data.getFlattenable(k, CLASS.RPC_CREATOR);
- addTo->Add(new Assignment(v, new MethodCall(data, "getFlattenable", 2, k,
- new FieldVariable(v->type, "RPC_CREATOR"))));
-}
-
-// ================================================================
-
-InterfaceType::InterfaceType(const string& package, const string& name,
- bool builtIn, bool oneway,
- const string& declFile, int declLine)
- :Type(package, name, builtIn ? BUILT_IN : INTERFACE, true, false, false,
- declFile, declLine)
- ,m_oneway(oneway)
-{
-}
-
-bool
-InterfaceType::OneWay() const
-{
- return m_oneway;
-}
-
-void
-InterfaceType::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags)
-{
- // parcel.writeStrongBinder(v != null ? v.asBinder() : null);
- addTo->Add(new MethodCall(parcel, "writeStrongBinder", 1,
- new Ternary(
- new Comparison(v, "!=", NULL_VALUE),
- new MethodCall(v, "asBinder"),
- NULL_VALUE)));
-}
-
-void
-InterfaceType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**)
-{
- // v = Interface.asInterface(parcel.readStrongBinder());
- string type = v->type->QualifiedName();
- type += ".Stub";
- addTo->Add(new Assignment(v,
- new MethodCall( NAMES.Find(type), "asInterface", 1,
- new MethodCall(parcel, "readStrongBinder"))));
-}
-
-
-// ================================================================
-
-GenericType::GenericType(const string& package, const string& name,
- const vector<Type*>& args)
- :Type(package, name, BUILT_IN, true, true, true)
-{
- m_args = args;
-
- m_importName = package + '.' + name;
-
- string gen = "<";
- int N = args.size();
- for (int i=0; i<N; i++) {
- Type* t = args[i];
- gen += t->QualifiedName();
- if (i != N-1) {
- gen += ',';
- }
- }
- gen += '>';
- m_genericArguments = gen;
- SetQualifiedName(m_importName + gen);
-}
-
-const vector<Type*>&
-GenericType::GenericArgumentTypes() const
-{
- return m_args;
-}
-
-string
-GenericType::GenericArguments() const
-{
- return m_genericArguments;
-}
-
-string
-GenericType::ImportType() const
-{
- return m_importName;
-}
-
-void
-GenericType::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags)
-{
- fprintf(stderr, "implement GenericType::WriteToParcel\n");
-}
-
-void
-GenericType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**)
-{
- fprintf(stderr, "implement GenericType::CreateFromParcel\n");
-}
-
-void
-GenericType::ReadFromParcel(StatementBlock* addTo, Variable* v,
- Variable* parcel, Variable**)
-{
- fprintf(stderr, "implement GenericType::ReadFromParcel\n");
-}
-
-
-// ================================================================
-
-GenericListType::GenericListType(const string& package, const string& name,
- const vector<Type*>& args)
- :GenericType(package, name, args),
- m_creator(args[0]->CreatorName())
-{
-}
-
-string
-GenericListType::CreatorName() const
-{
- return "android.os.Parcel.arrayListCreator";
-}
-
-string
-GenericListType::InstantiableName() const
-{
- return "java.util.ArrayList" + GenericArguments();
-}
-
-void
-GenericListType::WriteToParcel(StatementBlock* addTo, Variable* v, Variable* parcel, int flags)
-{
- if (m_creator == STRING_TYPE->CreatorName()) {
- addTo->Add(new MethodCall(parcel, "writeStringList", 1, v));
- } else if (m_creator == IBINDER_TYPE->CreatorName()) {
- addTo->Add(new MethodCall(parcel, "writeBinderList", 1, v));
- } else {
- // parcel.writeTypedListXX(arg);
- addTo->Add(new MethodCall(parcel, "writeTypedList", 1, v));
- }
-}
-
-void
-GenericListType::CreateFromParcel(StatementBlock* addTo, Variable* v, Variable* parcel, Variable**)
-{
- if (m_creator == STRING_TYPE->CreatorName()) {
- addTo->Add(new Assignment(v,
- new MethodCall(parcel, "createStringArrayList", 0)));
- } else if (m_creator == IBINDER_TYPE->CreatorName()) {
- addTo->Add(new Assignment(v,
- new MethodCall(parcel, "createBinderArrayList", 0)));
- } else {
- // v = _data.readTypedArrayList(XXX.creator);
- addTo->Add(new Assignment(v,
- new MethodCall(parcel, "createTypedArrayList", 1,
- new LiteralExpression(m_creator))));
- }
-}
-
-void
-GenericListType::ReadFromParcel(StatementBlock* addTo, Variable* v,
- Variable* parcel, Variable**)
-{
- if (m_creator == STRING_TYPE->CreatorName()) {
- addTo->Add(new MethodCall(parcel, "readStringList", 1, v));
- } else if (m_creator == IBINDER_TYPE->CreatorName()) {
- addTo->Add(new MethodCall(parcel, "readBinderList", 1, v));
- } else {
- // v = _data.readTypedList(v, XXX.creator);
- addTo->Add(new MethodCall(parcel, "readTypedList", 2,
- v,
- new LiteralExpression(m_creator)));
- }
-}
-
-void
-GenericListType::WriteToRpcData(StatementBlock* addTo, Expression* k, Variable* v,
- Variable* data, int flags)
-{
- Type* generic = GenericArgumentTypes()[0];
- if (generic == RPC_DATA_TYPE) {
- addTo->Add(new MethodCall(data, "putRpcDataList", 2, k, v));
- } else if (generic->RpcCreatorName() != "") {
- addTo->Add(new MethodCall(data, "putFlattenableList", 2, k, v));
- } else {
- addTo->Add(new MethodCall(data, "putList", 2, k, v));
- }
-}
-
-void
-GenericListType::CreateFromRpcData(StatementBlock* addTo, Expression* k, Variable* v,
- Variable* data, Variable** cl)
-{
- Type* generic = GenericArgumentTypes()[0];
- if (generic == RPC_DATA_TYPE) {
- addTo->Add(new Assignment(v, new MethodCall(data, "getRpcDataList", 2, k)));
- } else if (generic->RpcCreatorName() != "") {
- addTo->Add(new Assignment(v, new MethodCall(data, "getFlattenableList", 2, k,
- new LiteralExpression(generic->RpcCreatorName()))));
- } else {
- string classArg = GenericArgumentTypes()[0]->QualifiedName();
- classArg += ".class";
- addTo->Add(new Assignment(v, new MethodCall(data, "getList", 2, k,
- new LiteralExpression(classArg))));
- }
-}
-
-
-// ================================================================
-
-RpcDataType::RpcDataType()
- :UserDataType("android.support.place.rpc", "RpcData", true, true, true)
-{
-}
-
-void
-RpcDataType::WriteToRpcData(StatementBlock* addTo, Expression* k, Variable* v,
- Variable* data, int flags)
-{
- addTo->Add(new MethodCall(data, "putRpcData", 2, k, v));
-}
-
-void
-RpcDataType::CreateFromRpcData(StatementBlock* addTo, Expression* k, Variable* v, Variable* data,
- Variable** cl)
-{
- addTo->Add(new Assignment(v, new MethodCall(data, "getRpcData", 1, k)));
-}
-
-
-// ================================================================
-
-ClassLoaderType::ClassLoaderType()
- :Type("java.lang", "ClassLoader", BUILT_IN, false, false, false)
-{
-}
-
-
-// ================================================================
-
-Namespace::Namespace()
-{
-}
-
-Namespace::~Namespace()
-{
- int N = m_types.size();
- for (int i=0; i<N; i++) {
- delete m_types[i];
- }
-}
-
-void
-Namespace::Add(Type* type)
-{
- Type* t = Find(type->QualifiedName());
- if (t == NULL) {
- m_types.push_back(type);
- }
-}
-
-void
-Namespace::AddGenericType(const string& package, const string& name, int args)
-{
- Generic g;
- g.package = package;
- g.name = name;
- g.qualified = package + '.' + name;
- g.args = args;
- m_generics.push_back(g);
-}
-
-Type*
-Namespace::Find(const string& name) const
-{
- int N = m_types.size();
- for (int i=0; i<N; i++) {
- if (m_types[i]->QualifiedName() == name) {
- return m_types[i];
- }
- }
- return NULL;
-}
-
-Type*
-Namespace::Find(const char* package, const char* name) const
-{
- string s;
- if (package != NULL) {
- s += package;
- s += '.';
- }
- s += name;
- return Find(s);
-}
-
-static string
-normalize_generic(const string& s)
-{
- string r;
- int N = s.size();
- for (int i=0; i<N; i++) {
- char c = s[i];
- if (!isspace(c)) {
- r += c;
- }
- }
- return r;
-}
-
-Type*
-Namespace::Search(const string& name)
-{
- // an exact match wins
- Type* result = Find(name);
- if (result != NULL) {
- return result;
- }
-
- // try the class names
- // our language doesn't allow you to not specify outer classes
- // when referencing an inner class. that could be changed, and this
- // would be the place to do it, but I don't think the complexity in
- // scoping rules is worth it.
- int N = m_types.size();
- for (int i=0; i<N; i++) {
- if (m_types[i]->Name() == name) {
- return m_types[i];
- }
- }
-
- // we got to here and it's not a generic, give up
- if (name.find('<') == name.npos) {
- return NULL;
- }
-
- // remove any whitespace
- string normalized = normalize_generic(name);
-
- // find the part before the '<', find a generic for it
- ssize_t baseIndex = normalized.find('<');
- string base(normalized.c_str(), baseIndex);
- const Generic* g = search_generic(base);
- if (g == NULL) {
- return NULL;
- }
-
- // For each of the args, do a recursive search on it. We don't allow
- // generics within generics like Java does, because we're really limiting
- // them to just built-in container classes, at least for now. Our syntax
- // ensures this right now as well.
- vector<Type*> args;
- size_t start = baseIndex + 1;
- size_t end = start;
- while (normalized[start] != '\0') {
- end = normalized.find(',', start);
- if (end == normalized.npos) {
- end = normalized.find('>', start);
- }
- string s(normalized.c_str()+start, end-start);
- Type* t = this->Search(s);
- if (t == NULL) {
- // maybe we should print a warning here?
- return NULL;
- }
- args.push_back(t);
- start = end+1;
- }
-
- // construct a GenericType, add it to our name set so they always get
- // the same object, and return it.
- result = make_generic_type(g->package, g->name, args);
- if (result == NULL) {
- return NULL;
- }
-
- this->Add(result);
- return this->Find(result->QualifiedName());
-}
-
-const Namespace::Generic*
-Namespace::search_generic(const string& name) const
-{
- int N = m_generics.size();
-
- // first exact match
- for (int i=0; i<N; i++) {
- const Generic& g = m_generics[i];
- if (g.qualified == name) {
- return &g;
- }
- }
-
- // then name match
- for (int i=0; i<N; i++) {
- const Generic& g = m_generics[i];
- if (g.name == name) {
- return &g;
- }
- }
-
- return NULL;
-}
-
-void
-Namespace::Dump() const
-{
- int n = m_types.size();
- for (int i=0; i<n; i++) {
- Type* t = m_types[i];
- printf("type: package=%s name=%s qualifiedName=%s\n",
- t->Package().c_str(), t->Name().c_str(),
- t->QualifiedName().c_str());
- }
-}
diff --git a/tools/aidl/Type.h b/tools/aidl/Type.h
deleted file mode 100644
index ae12720..0000000
--- a/tools/aidl/Type.h
+++ /dev/null
@@ -1,542 +0,0 @@
-#ifndef AIDL_TYPE_H
-#define AIDL_TYPE_H
-
-#include "AST.h"
-#include <string>
-#include <vector>
-
-using namespace std;
-
-class Type
-{
-public:
- // kinds
- enum {
- BUILT_IN,
- USERDATA,
- INTERFACE,
- GENERATED
- };
-
- // WriteToParcel flags
- enum {
- PARCELABLE_WRITE_RETURN_VALUE = 0x0001
- };
-
- Type(const string& name, int kind, bool canWriteToParcel,
- bool canWriteToRpcData, bool canBeOut);
- Type(const string& package, const string& name,
- int kind, bool canWriteToParcel, bool canWriteToRpcData, bool canBeOut,
- const string& declFile = "", int declLine = -1);
- virtual ~Type();
-
- inline string Package() const { return m_package; }
- inline string Name() const { return m_name; }
- inline string QualifiedName() const { return m_qualifiedName; }
- inline int Kind() const { return m_kind; }
- inline string DeclFile() const { return m_declFile; }
- inline int DeclLine() const { return m_declLine; }
- inline bool CanWriteToParcel() const { return m_canWriteToParcel; }
- inline bool CanWriteToRpcData() const { return m_canWriteToRpcData; }
- inline bool CanBeOutParameter() const { return m_canBeOut; }
-
- virtual string ImportType() const;
- virtual string CreatorName() const;
- virtual string RpcCreatorName() const;
- virtual string InstantiableName() const;
-
- virtual void WriteToParcel(StatementBlock* addTo, Variable* v,
- Variable* parcel, int flags);
- virtual void CreateFromParcel(StatementBlock* addTo, Variable* v,
- Variable* parcel, Variable** cl);
- virtual void ReadFromParcel(StatementBlock* addTo, Variable* v,
- Variable* parcel, Variable** cl);
-
- virtual bool CanBeArray() const;
-
- virtual void WriteArrayToParcel(StatementBlock* addTo, Variable* v,
- Variable* parcel, int flags);
- virtual void CreateArrayFromParcel(StatementBlock* addTo, Variable* v,
- Variable* parcel, Variable** cl);
- virtual void ReadArrayFromParcel(StatementBlock* addTo, Variable* v,
- Variable* parcel, Variable** cl);
-
- virtual void WriteToRpcData(StatementBlock* addTo, Expression* k, Variable* v,
- Variable* data, int flags);
- virtual void CreateFromRpcData(StatementBlock* addTo, Expression* k, Variable* v,
- Variable* data, Variable** cl);
-
-protected:
- void SetQualifiedName(const string& qualified);
- Expression* BuildWriteToParcelFlags(int flags);
-
-private:
- Type();
- Type(const Type&);
-
- string m_package;
- string m_name;
- string m_qualifiedName;
- string m_declFile;
- int m_declLine;
- int m_kind;
- bool m_canWriteToParcel;
- bool m_canWriteToRpcData;
- bool m_canBeOut;
-};
-
-class BasicType : public Type
-{
-public:
- BasicType(const string& name,
- const string& marshallParcel,
- const string& unmarshallParcel,
- const string& writeArrayParcel,
- const string& createArrayParcel,
- const string& readArrayParcel,
- const string& marshallRpc,
- const string& unmarshallRpc,
- const string& writeArrayRpc,
- const string& createArrayRpc,
- const string& readArrayRpc);
-
- virtual void WriteToParcel(StatementBlock* addTo, Variable* v,
- Variable* parcel, int flags);
- virtual void CreateFromParcel(StatementBlock* addTo, Variable* v,
- Variable* parcel, Variable** cl);
-
- virtual bool CanBeArray() const;
-
- virtual void WriteArrayToParcel(StatementBlock* addTo, Variable* v,
- Variable* parcel, int flags);
- virtual void CreateArrayFromParcel(StatementBlock* addTo, Variable* v,
- Variable* parcel, Variable** cl);
- virtual void ReadArrayFromParcel(StatementBlock* addTo, Variable* v,
- Variable* parcel, Variable** cl);
-
- virtual void WriteToRpcData(StatementBlock* addTo, Expression* k, Variable* v,
- Variable* data, int flags);
- virtual void CreateFromRpcData(StatementBlock* addTo, Expression* k, Variable* v,
- Variable* data, Variable** cl);
-
-private:
- string m_marshallParcel;
- string m_unmarshallParcel;
- string m_writeArrayParcel;
- string m_createArrayParcel;
- string m_readArrayParcel;
- string m_marshallRpc;
- string m_unmarshallRpc;
- string m_writeArrayRpc;
- string m_createArrayRpc;
- string m_readArrayRpc;
-};
-
-class BooleanType : public Type
-{
-public:
- BooleanType();
-
- virtual void WriteToParcel(StatementBlock* addTo, Variable* v,
- Variable* parcel, int flags);
- virtual void CreateFromParcel(StatementBlock* addTo, Variable* v,
- Variable* parcel, Variable** cl);
-
- virtual bool CanBeArray() const;
-
- virtual void WriteArrayToParcel(StatementBlock* addTo, Variable* v,
- Variable* parcel, int flags);
- virtual void CreateArrayFromParcel(StatementBlock* addTo, Variable* v,
- Variable* parcel, Variable** cl);
- virtual void ReadArrayFromParcel(StatementBlock* addTo, Variable* v,
- Variable* parcel, Variable** cl);
-
- virtual void WriteToRpcData(StatementBlock* addTo, Expression* k, Variable* v,
- Variable* data, int flags);
- virtual void CreateFromRpcData(StatementBlock* addTo, Expression* k, Variable* v,
- Variable* data, Variable** cl);
-};
-
-class CharType : public Type
-{
-public:
- CharType();
-
- virtual void WriteToParcel(StatementBlock* addTo, Variable* v,
- Variable* parcel, int flags);
- virtual void CreateFromParcel(StatementBlock* addTo, Variable* v,
- Variable* parcel, Variable** cl);
-
- virtual bool CanBeArray() const;
-
- virtual void WriteArrayToParcel(StatementBlock* addTo, Variable* v,
- Variable* parcel, int flags);
- virtual void CreateArrayFromParcel(StatementBlock* addTo, Variable* v,
- Variable* parcel, Variable** cl);
- virtual void ReadArrayFromParcel(StatementBlock* addTo, Variable* v,
- Variable* parcel, Variable** cl);
-
- virtual void WriteToRpcData(StatementBlock* addTo, Expression* k, Variable* v,
- Variable* data, int flags);
- virtual void CreateFromRpcData(StatementBlock* addTo, Expression* k, Variable* v,
- Variable* data, Variable** cl);
-};
-
-
-class StringType : public Type
-{
-public:
- StringType();
-
- virtual string CreatorName() const;
-
- virtual void WriteToParcel(StatementBlock* addTo, Variable* v,
- Variable* parcel, int flags);
- virtual void CreateFromParcel(StatementBlock* addTo, Variable* v,
- Variable* parcel, Variable** cl);
-
- virtual bool CanBeArray() const;
-
- virtual void WriteArrayToParcel(StatementBlock* addTo, Variable* v,
- Variable* parcel, int flags);
- virtual void CreateArrayFromParcel(StatementBlock* addTo, Variable* v,
- Variable* parcel, Variable** cl);
- virtual void ReadArrayFromParcel(StatementBlock* addTo, Variable* v,
- Variable* parcel, Variable** cl);
-
- virtual void WriteToRpcData(StatementBlock* addTo, Expression* k, Variable* v,
- Variable* data, int flags);
- virtual void CreateFromRpcData(StatementBlock* addTo, Expression* k, Variable* v,
- Variable* data, Variable** cl);
-};
-
-class CharSequenceType : public Type
-{
-public:
- CharSequenceType();
-
- virtual string CreatorName() const;
-
- virtual void WriteToParcel(StatementBlock* addTo, Variable* v,
- Variable* parcel, int flags);
- virtual void CreateFromParcel(StatementBlock* addTo, Variable* v,
- Variable* parcel, Variable** cl);
-};
-
-class RemoteExceptionType : public Type
-{
-public:
- RemoteExceptionType();
-
- virtual void WriteToParcel(StatementBlock* addTo, Variable* v,
- Variable* parcel, int flags);
- virtual void CreateFromParcel(StatementBlock* addTo, Variable* v,
- Variable* parcel, Variable** cl);
-};
-
-class RuntimeExceptionType : public Type
-{
-public:
- RuntimeExceptionType();
-
- virtual void WriteToParcel(StatementBlock* addTo, Variable* v,
- Variable* parcel, int flags);
- virtual void CreateFromParcel(StatementBlock* addTo, Variable* v,
- Variable* parcel, Variable** cl);
-};
-
-class IBinderType : public Type
-{
-public:
- IBinderType();
-
- virtual void WriteToParcel(StatementBlock* addTo, Variable* v,
- Variable* parcel, int flags);
- virtual void CreateFromParcel(StatementBlock* addTo, Variable* v,
- Variable* parcel, Variable** cl);
-
- virtual void WriteArrayToParcel(StatementBlock* addTo, Variable* v,
- Variable* parcel, int flags);
- virtual void CreateArrayFromParcel(StatementBlock* addTo, Variable* v,
- Variable* parcel, Variable** cl);
- virtual void ReadArrayFromParcel(StatementBlock* addTo, Variable* v,
- Variable* parcel, Variable** cl);
-};
-
-class IInterfaceType : public Type
-{
-public:
- IInterfaceType();
-
- virtual void WriteToParcel(StatementBlock* addTo, Variable* v,
- Variable* parcel, int flags);
- virtual void CreateFromParcel(StatementBlock* addTo, Variable* v,
- Variable* parcel, Variable** cl);
-};
-
-class BinderType : public Type
-{
-public:
- BinderType();
-
- virtual void WriteToParcel(StatementBlock* addTo, Variable* v,
- Variable* parcel, int flags);
- virtual void CreateFromParcel(StatementBlock* addTo, Variable* v,
- Variable* parcel, Variable** cl);
-};
-
-class BinderProxyType : public Type
-{
-public:
- BinderProxyType();
-
- virtual void WriteToParcel(StatementBlock* addTo, Variable* v,
- Variable* parcel, int flags);
- virtual void CreateFromParcel(StatementBlock* addTo, Variable* v,
- Variable* parcel, Variable** cl);
-};
-
-class ParcelType : public Type
-{
-public:
- ParcelType();
-
- virtual void WriteToParcel(StatementBlock* addTo, Variable* v,
- Variable* parcel, int flags);
- virtual void CreateFromParcel(StatementBlock* addTo, Variable* v,
- Variable* parcel, Variable** cl);
-};
-
-class ParcelableInterfaceType : public Type
-{
-public:
- ParcelableInterfaceType();
-
- virtual void WriteToParcel(StatementBlock* addTo, Variable* v,
- Variable* parcel, int flags);
- virtual void CreateFromParcel(StatementBlock* addTo, Variable* v,
- Variable* parcel, Variable** cl);
-};
-
-class MapType : public Type
-{
-public:
- MapType();
-
- virtual void WriteToParcel(StatementBlock* addTo, Variable* v,
- Variable* parcel, int flags);
- virtual void CreateFromParcel(StatementBlock* addTo, Variable* v,
- Variable* parcel, Variable** cl);
- virtual void ReadFromParcel(StatementBlock* addTo, Variable* v,
- Variable* parcel, Variable** cl);
-};
-
-class ListType : public Type
-{
-public:
- ListType();
-
- virtual string InstantiableName() const;
-
- virtual void WriteToParcel(StatementBlock* addTo, Variable* v,
- Variable* parcel, int flags);
- virtual void CreateFromParcel(StatementBlock* addTo, Variable* v,
- Variable* parcel, Variable** cl);
- virtual void ReadFromParcel(StatementBlock* addTo, Variable* v,
- Variable* parcel, Variable** cl);
-
- virtual void WriteToRpcData(StatementBlock* addTo, Expression* k, Variable* v,
- Variable* data, int flags);
- virtual void CreateFromRpcData(StatementBlock* addTo, Expression* k, Variable* v,
- Variable* data, Variable** cl);
-};
-
-class UserDataType : public Type
-{
-public:
- UserDataType(const string& package, const string& name,
- bool builtIn, bool canWriteToParcel, bool canWriteToRpcData,
- const string& declFile = "", int declLine = -1);
-
- virtual string CreatorName() const;
- virtual string RpcCreatorName() const;
-
- virtual void WriteToParcel(StatementBlock* addTo, Variable* v,
- Variable* parcel, int flags);
- virtual void CreateFromParcel(StatementBlock* addTo, Variable* v,
- Variable* parcel, Variable** cl);
- virtual void ReadFromParcel(StatementBlock* addTo, Variable* v,
- Variable* parcel, Variable** cl);
-
- virtual bool CanBeArray() const;
-
- virtual void WriteArrayToParcel(StatementBlock* addTo, Variable* v,
- Variable* parcel, int flags);
- virtual void CreateArrayFromParcel(StatementBlock* addTo, Variable* v,
- Variable* parcel, Variable** cl);
- virtual void ReadArrayFromParcel(StatementBlock* addTo, Variable* v,
- Variable* parcel, Variable** cl);
-
- virtual void WriteToRpcData(StatementBlock* addTo, Expression* k, Variable* v,
- Variable* data, int flags);
- virtual void CreateFromRpcData(StatementBlock* addTo, Expression* k, Variable* v,
- Variable* data, Variable** cl);
-};
-
-class InterfaceType : public Type
-{
-public:
- InterfaceType(const string& package, const string& name,
- bool builtIn, bool oneway,
- const string& declFile, int declLine);
-
- bool OneWay() const;
-
- virtual void WriteToParcel(StatementBlock* addTo, Variable* v,
- Variable* parcel, int flags);
- virtual void CreateFromParcel(StatementBlock* addTo, Variable* v,
- Variable* parcel, Variable** cl);
-
-private:
- bool m_oneway;
-};
-
-
-class GenericType : public Type
-{
-public:
- GenericType(const string& package, const string& name,
- const vector<Type*>& args);
-
- const vector<Type*>& GenericArgumentTypes() const;
- string GenericArguments() const;
-
- virtual string ImportType() const;
-
- virtual void WriteToParcel(StatementBlock* addTo, Variable* v,
- Variable* parcel, int flags);
- virtual void CreateFromParcel(StatementBlock* addTo, Variable* v,
- Variable* parcel, Variable** cl);
- virtual void ReadFromParcel(StatementBlock* addTo, Variable* v,
- Variable* parcel, Variable** cl);
-
-private:
- string m_genericArguments;
- string m_importName;
- vector<Type*> m_args;
-};
-
-class RpcDataType : public UserDataType
-{
-public:
- RpcDataType();
-
- virtual void WriteToRpcData(StatementBlock* addTo, Expression* k, Variable* v,
- Variable* data, int flags);
- virtual void CreateFromRpcData(StatementBlock* addTo, Expression* k, Variable* v,
- Variable* data, Variable** cl);
-};
-
-class ClassLoaderType : public Type
-{
-public:
- ClassLoaderType();
-};
-
-class GenericListType : public GenericType
-{
-public:
- GenericListType(const string& package, const string& name,
- const vector<Type*>& args);
-
- virtual string CreatorName() const;
- virtual string InstantiableName() const;
-
- virtual void WriteToParcel(StatementBlock* addTo, Variable* v,
- Variable* parcel, int flags);
- virtual void CreateFromParcel(StatementBlock* addTo, Variable* v,
- Variable* parcel, Variable** cl);
- virtual void ReadFromParcel(StatementBlock* addTo, Variable* v,
- Variable* parcel, Variable** cl);
-
- virtual void WriteToRpcData(StatementBlock* addTo, Expression* k, Variable* v,
- Variable* data, int flags);
- virtual void CreateFromRpcData(StatementBlock* addTo, Expression* k, Variable* v,
- Variable* data, Variable** cl);
-
-private:
- string m_creator;
-};
-
-class Namespace
-{
-public:
- Namespace();
- ~Namespace();
- void Add(Type* type);
-
- // args is the number of template types (what is this called?)
- void AddGenericType(const string& package, const string& name, int args);
-
- // lookup a specific class name
- Type* Find(const string& name) const;
- Type* Find(const char* package, const char* name) const;
-
- // try to search by either a full name or a partial name
- Type* Search(const string& name);
-
- void Dump() const;
-
-private:
- struct Generic {
- string package;
- string name;
- string qualified;
- int args;
- };
-
- const Generic* search_generic(const string& name) const;
-
- vector<Type*> m_types;
- vector<Generic> m_generics;
-};
-
-extern Namespace NAMES;
-
-extern Type* VOID_TYPE;
-extern Type* BOOLEAN_TYPE;
-extern Type* BYTE_TYPE;
-extern Type* CHAR_TYPE;
-extern Type* INT_TYPE;
-extern Type* LONG_TYPE;
-extern Type* FLOAT_TYPE;
-extern Type* DOUBLE_TYPE;
-extern Type* OBJECT_TYPE;
-extern Type* STRING_TYPE;
-extern Type* CHAR_SEQUENCE_TYPE;
-extern Type* TEXT_UTILS_TYPE;
-extern Type* REMOTE_EXCEPTION_TYPE;
-extern Type* RUNTIME_EXCEPTION_TYPE;
-extern Type* IBINDER_TYPE;
-extern Type* IINTERFACE_TYPE;
-extern Type* BINDER_NATIVE_TYPE;
-extern Type* BINDER_PROXY_TYPE;
-extern Type* PARCEL_TYPE;
-extern Type* PARCELABLE_INTERFACE_TYPE;
-
-extern Type* CONTEXT_TYPE;
-
-extern Type* RPC_DATA_TYPE;
-extern Type* RPC_ERROR_TYPE;
-extern Type* RPC_CONTEXT_TYPE;
-extern Type* EVENT_FAKE_TYPE;
-
-extern Expression* NULL_VALUE;
-extern Expression* THIS_VALUE;
-extern Expression* SUPER_VALUE;
-extern Expression* TRUE_VALUE;
-extern Expression* FALSE_VALUE;
-
-void register_base_types();
-
-#endif // AIDL_TYPE_H
diff --git a/tools/aidl/aidl.cpp b/tools/aidl/aidl.cpp
deleted file mode 100644
index a84d743..0000000
--- a/tools/aidl/aidl.cpp
+++ /dev/null
@@ -1,1156 +0,0 @@
-
-#include "aidl_language.h"
-#include "options.h"
-#include "search_path.h"
-#include "Type.h"
-#include "generate_java.h"
-#include <unistd.h>
-#include <fcntl.h>
-#include <sys/param.h>
-#include <sys/stat.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <map>
-
-#ifdef HAVE_MS_C_RUNTIME
-#include <io.h>
-#include <sys/stat.h>
-#endif
-
-#ifndef O_BINARY
-# define O_BINARY 0
-#endif
-
-// The following are gotten as the offset from the allowable id's between
-// android.os.IBinder.FIRST_CALL_TRANSACTION=1 and
-// android.os.IBinder.LAST_CALL_TRANSACTION=16777215
-#define MIN_USER_SET_METHOD_ID 0
-#define MAX_USER_SET_METHOD_ID 16777214
-
-using namespace std;
-
-static void
-test_document(document_item_type* d)
-{
- while (d) {
- if (d->item_type == INTERFACE_TYPE_BINDER) {
- interface_type* c = (interface_type*)d;
- printf("interface %s %s {\n", c->package, c->name.data);
- interface_item_type *q = (interface_item_type*)c->interface_items;
- while (q) {
- if (q->item_type == METHOD_TYPE) {
- method_type *m = (method_type*)q;
- printf(" %s %s(", m->type.type.data, m->name.data);
- arg_type *p = m->args;
- while (p) {
- printf("%s %s",p->type.type.data,p->name.data);
- if (p->next) printf(", ");
- p=p->next;
- }
- printf(")");
- printf(";\n");
- }
- q=q->next;
- }
- printf("}\n");
- }
- else if (d->item_type == USER_DATA_TYPE) {
- user_data_type* b = (user_data_type*)d;
- if ((b->flattening_methods & PARCELABLE_DATA) != 0) {
- printf("parcelable %s %s;\n", b->package, b->name.data);
- }
- if ((b->flattening_methods & RPC_DATA) != 0) {
- printf("flattenable %s %s;\n", b->package, b->name.data);
- }
- }
- else {
- printf("UNKNOWN d=0x%08lx d->item_type=%d\n", (long)d, d->item_type);
- }
- d = d->next;
- }
-}
-
-// ==========================================================
-int
-convert_direction(const char* direction)
-{
- if (direction == NULL) {
- return IN_PARAMETER;
- }
- if (0 == strcmp(direction, "in")) {
- return IN_PARAMETER;
- }
- if (0 == strcmp(direction, "out")) {
- return OUT_PARAMETER;
- }
- return INOUT_PARAMETER;
-}
-
-// ==========================================================
-struct import_info {
- const char* from;
- const char* filename;
- buffer_type statement;
- const char* neededClass;
- document_item_type* doc;
- struct import_info* next;
-};
-
-document_item_type* g_document = NULL;
-import_info* g_imports = NULL;
-
-static void
-main_document_parsed(document_item_type* d)
-{
- g_document = d;
-}
-
-static void
-main_import_parsed(buffer_type* statement)
-{
- import_info* import = (import_info*)malloc(sizeof(import_info));
- memset(import, 0, sizeof(import_info));
- import->from = strdup(g_currentFilename);
- import->statement.lineno = statement->lineno;
- import->statement.data = strdup(statement->data);
- import->statement.extra = NULL;
- import->next = g_imports;
- import->neededClass = parse_import_statement(statement->data);
- g_imports = import;
-}
-
-static ParserCallbacks g_mainCallbacks = {
- &main_document_parsed,
- &main_import_parsed
-};
-
-char*
-parse_import_statement(const char* text)
-{
- const char* end;
- int len;
-
- while (isspace(*text)) {
- text++;
- }
- while (!isspace(*text)) {
- text++;
- }
- while (isspace(*text)) {
- text++;
- }
- end = text;
- while (!isspace(*end) && *end != ';') {
- end++;
- }
- len = end-text;
-
- char* rv = (char*)malloc(len+1);
- memcpy(rv, text, len);
- rv[len] = '\0';
-
- return rv;
-}
-
-// ==========================================================
-static void
-import_import_parsed(buffer_type* statement)
-{
-}
-
-static ParserCallbacks g_importCallbacks = {
- &main_document_parsed,
- &import_import_parsed
-};
-
-// ==========================================================
-static int
-check_filename(const char* filename, const char* package, buffer_type* name)
-{
- const char* p;
- string expected;
- string fn;
- size_t len;
- char cwd[MAXPATHLEN];
- bool valid = false;
-
-#ifdef HAVE_WINDOWS_PATHS
- if (isalpha(filename[0]) && filename[1] == ':'
- && filename[2] == OS_PATH_SEPARATOR) {
-#else
- if (filename[0] == OS_PATH_SEPARATOR) {
-#endif
- fn = filename;
- } else {
- fn = getcwd(cwd, sizeof(cwd));
- len = fn.length();
- if (fn[len-1] != OS_PATH_SEPARATOR) {
- fn += OS_PATH_SEPARATOR;
- }
- fn += filename;
- }
-
- if (package) {
- expected = package;
- expected += '.';
- }
-
- len = expected.length();
- for (size_t i=0; i<len; i++) {
- if (expected[i] == '.') {
- expected[i] = OS_PATH_SEPARATOR;
- }
- }
-
- p = strchr(name->data, '.');
- len = p ? p-name->data : strlen(name->data);
- expected.append(name->data, len);
-
- expected += ".aidl";
-
- len = fn.length();
- valid = (len >= expected.length());
-
- if (valid) {
- p = fn.c_str() + (len - expected.length());
-
-#ifdef HAVE_WINDOWS_PATHS
- if (OS_PATH_SEPARATOR != '/') {
- // Input filename under cygwin most likely has / separators
- // whereas the expected string uses \\ separators. Adjust
- // them accordingly.
- for (char *c = const_cast<char *>(p); *c; ++c) {
- if (*c == '/') *c = OS_PATH_SEPARATOR;
- }
- }
-#endif
-
-#ifdef OS_CASE_SENSITIVE
- valid = (expected == p);
-#else
- valid = !strcasecmp(expected.c_str(), p);
-#endif
- }
-
- if (!valid) {
- fprintf(stderr, "%s:%d interface %s should be declared in a file"
- " called %s.\n",
- filename, name->lineno, name->data, expected.c_str());
- return 1;
- }
-
- return 0;
-}
-
-static int
-check_filenames(const char* filename, document_item_type* items)
-{
- int err = 0;
- while (items) {
- if (items->item_type == USER_DATA_TYPE) {
- user_data_type* p = (user_data_type*)items;
- err |= check_filename(filename, p->package, &p->name);
- }
- else if (items->item_type == INTERFACE_TYPE_BINDER
- || items->item_type == INTERFACE_TYPE_RPC) {
- interface_type* c = (interface_type*)items;
- err |= check_filename(filename, c->package, &c->name);
- }
- else {
- fprintf(stderr, "aidl: internal error unkown document type %d.\n",
- items->item_type);
- return 1;
- }
- items = items->next;
- }
- return err;
-}
-
-// ==========================================================
-static const char*
-kind_to_string(int kind)
-{
- switch (kind)
- {
- case Type::INTERFACE:
- return "an interface";
- case Type::USERDATA:
- return "a user data";
- default:
- return "ERROR";
- }
-}
-
-static char*
-rfind(char* str, char c)
-{
- char* p = str + strlen(str) - 1;
- while (p >= str) {
- if (*p == c) {
- return p;
- }
- p--;
- }
- return NULL;
-}
-
-static int
-gather_types(const char* filename, document_item_type* items)
-{
- int err = 0;
- while (items) {
- Type* type;
- if (items->item_type == USER_DATA_TYPE) {
- user_data_type* p = (user_data_type*)items;
- type = new UserDataType(p->package ? p->package : "", p->name.data,
- false, ((p->flattening_methods & PARCELABLE_DATA) != 0),
- ((p->flattening_methods & RPC_DATA) != 0), filename, p->name.lineno);
- }
- else if (items->item_type == INTERFACE_TYPE_BINDER
- || items->item_type == INTERFACE_TYPE_RPC) {
- interface_type* c = (interface_type*)items;
- type = new InterfaceType(c->package ? c->package : "",
- c->name.data, false, c->oneway,
- filename, c->name.lineno);
- }
- else {
- fprintf(stderr, "aidl: internal error %s:%d\n", __FILE__, __LINE__);
- return 1;
- }
-
- Type* old = NAMES.Find(type->QualifiedName());
- if (old == NULL) {
- NAMES.Add(type);
-
- if (items->item_type == INTERFACE_TYPE_BINDER) {
- // for interfaces, also add the stub and proxy types, we don't
- // bother checking these for duplicates, because the parser
- // won't let us do it.
- interface_type* c = (interface_type*)items;
-
- string name = c->name.data;
- name += ".Stub";
- Type* stub = new Type(c->package ? c->package : "",
- name, Type::GENERATED, false, false, false,
- filename, c->name.lineno);
- NAMES.Add(stub);
-
- name = c->name.data;
- name += ".Stub.Proxy";
- Type* proxy = new Type(c->package ? c->package : "",
- name, Type::GENERATED, false, false, false,
- filename, c->name.lineno);
- NAMES.Add(proxy);
- }
- else if (items->item_type == INTERFACE_TYPE_RPC) {
- // for interfaces, also add the service base type, we don't
- // bother checking these for duplicates, because the parser
- // won't let us do it.
- interface_type* c = (interface_type*)items;
-
- string name = c->name.data;
- name += ".ServiceBase";
- Type* base = new Type(c->package ? c->package : "",
- name, Type::GENERATED, false, false, false,
- filename, c->name.lineno);
- NAMES.Add(base);
- }
- } else {
- if (old->Kind() == Type::BUILT_IN) {
- fprintf(stderr, "%s:%d attempt to redefine built in class %s\n",
- filename, type->DeclLine(),
- type->QualifiedName().c_str());
- err = 1;
- }
- else if (type->Kind() != old->Kind()) {
- const char* oldKind = kind_to_string(old->Kind());
- const char* newKind = kind_to_string(type->Kind());
-
- fprintf(stderr, "%s:%d attempt to redefine %s as %s,\n",
- filename, type->DeclLine(),
- type->QualifiedName().c_str(), newKind);
- fprintf(stderr, "%s:%d previously defined here as %s.\n",
- old->DeclFile().c_str(), old->DeclLine(), oldKind);
- err = 1;
- }
- }
-
- items = items->next;
- }
- return err;
-}
-
-// ==========================================================
-static bool
-matches_keyword(const char* str)
-{
- static const char* KEYWORDS[] = { "abstract", "assert", "boolean", "break",
- "byte", "case", "catch", "char", "class", "const", "continue",
- "default", "do", "double", "else", "enum", "extends", "final",
- "finally", "float", "for", "goto", "if", "implements", "import",
- "instanceof", "int", "interface", "long", "native", "new", "package",
- "private", "protected", "public", "return", "short", "static",
- "strictfp", "super", "switch", "synchronized", "this", "throw",
- "throws", "transient", "try", "void", "volatile", "while",
- "true", "false", "null",
- NULL
- };
- const char** k = KEYWORDS;
- while (*k) {
- if (0 == strcmp(str, *k)) {
- return true;
- }
- k++;
- }
- return false;
-}
-
-static int
-check_method(const char* filename, int kind, method_type* m)
-{
- int err = 0;
-
- // return type
- Type* returnType = NAMES.Search(m->type.type.data);
- if (returnType == NULL) {
- fprintf(stderr, "%s:%d unknown return type %s\n", filename,
- m->type.type.lineno, m->type.type.data);
- err = 1;
- return err;
- }
-
- if (returnType == EVENT_FAKE_TYPE) {
- if (kind != INTERFACE_TYPE_RPC) {
- fprintf(stderr, "%s:%d event methods only supported for rpc interfaces\n",
- filename, m->type.type.lineno);
- err = 1;
- }
- } else {
- if (!(kind == INTERFACE_TYPE_BINDER ? returnType->CanWriteToParcel()
- : returnType->CanWriteToRpcData())) {
- fprintf(stderr, "%s:%d return type %s can't be marshalled.\n", filename,
- m->type.type.lineno, m->type.type.data);
- err = 1;
- }
- }
-
- if (m->type.dimension > 0 && !returnType->CanBeArray()) {
- fprintf(stderr, "%s:%d return type %s%s can't be an array.\n", filename,
- m->type.array_token.lineno, m->type.type.data,
- m->type.array_token.data);
- err = 1;
- }
-
- if (m->type.dimension > 1) {
- fprintf(stderr, "%s:%d return type %s%s only one"
- " dimensional arrays are supported\n", filename,
- m->type.array_token.lineno, m->type.type.data,
- m->type.array_token.data);
- err = 1;
- }
-
- int index = 1;
-
- arg_type* arg = m->args;
- while (arg) {
- Type* t = NAMES.Search(arg->type.type.data);
-
- // check the arg type
- if (t == NULL) {
- fprintf(stderr, "%s:%d parameter %s (%d) unknown type %s\n",
- filename, m->type.type.lineno, arg->name.data, index,
- arg->type.type.data);
- err = 1;
- goto next;
- }
-
- if (t == EVENT_FAKE_TYPE) {
- fprintf(stderr, "%s:%d parameter %s (%d) event can not be used as a parameter %s\n",
- filename, m->type.type.lineno, arg->name.data, index,
- arg->type.type.data);
- err = 1;
- goto next;
- }
-
- if (!(kind == INTERFACE_TYPE_BINDER ? t->CanWriteToParcel() : t->CanWriteToRpcData())) {
- fprintf(stderr, "%s:%d parameter %d: '%s %s' can't be marshalled.\n",
- filename, m->type.type.lineno, index,
- arg->type.type.data, arg->name.data);
- err = 1;
- }
-
- if (returnType == EVENT_FAKE_TYPE
- && convert_direction(arg->direction.data) != IN_PARAMETER) {
- fprintf(stderr, "%s:%d parameter %d: '%s %s' All paremeters on events must be 'in'.\n",
- filename, m->type.type.lineno, index,
- arg->type.type.data, arg->name.data);
- err = 1;
- goto next;
- }
-
- if (arg->direction.data == NULL
- && (arg->type.dimension != 0 || t->CanBeOutParameter())) {
- fprintf(stderr, "%s:%d parameter %d: '%s %s' can be an out"
- " parameter, so you must declare it as in,"
- " out or inout.\n",
- filename, m->type.type.lineno, index,
- arg->type.type.data, arg->name.data);
- err = 1;
- }
-
- if (convert_direction(arg->direction.data) != IN_PARAMETER
- && !t->CanBeOutParameter()
- && arg->type.dimension == 0) {
- fprintf(stderr, "%s:%d parameter %d: '%s %s %s' can only be an in"
- " parameter.\n",
- filename, m->type.type.lineno, index,
- arg->direction.data, arg->type.type.data,
- arg->name.data);
- err = 1;
- }
-
- if (arg->type.dimension > 0 && !t->CanBeArray()) {
- fprintf(stderr, "%s:%d parameter %d: '%s %s%s %s' can't be an"
- " array.\n", filename,
- m->type.array_token.lineno, index, arg->direction.data,
- arg->type.type.data, arg->type.array_token.data,
- arg->name.data);
- err = 1;
- }
-
- if (arg->type.dimension > 1) {
- fprintf(stderr, "%s:%d parameter %d: '%s %s%s %s' only one"
- " dimensional arrays are supported\n", filename,
- m->type.array_token.lineno, index, arg->direction.data,
- arg->type.type.data, arg->type.array_token.data,
- arg->name.data);
- err = 1;
- }
-
- // check that the name doesn't match a keyword
- if (matches_keyword(arg->name.data)) {
- fprintf(stderr, "%s:%d parameter %d %s is named the same as a"
- " Java or aidl keyword\n",
- filename, m->name.lineno, index, arg->name.data);
- err = 1;
- }
-
-next:
- index++;
- arg = arg->next;
- }
-
- return err;
-}
-
-static int
-check_types(const char* filename, document_item_type* items)
-{
- int err = 0;
- while (items) {
- // (nothing to check for USER_DATA_TYPE)
- if (items->item_type == INTERFACE_TYPE_BINDER
- || items->item_type == INTERFACE_TYPE_RPC) {
- map<string,method_type*> methodNames;
- interface_type* c = (interface_type*)items;
-
- interface_item_type* member = c->interface_items;
- while (member) {
- if (member->item_type == METHOD_TYPE) {
- method_type* m = (method_type*)member;
-
- err |= check_method(filename, items->item_type, m);
-
- // prevent duplicate methods
- if (methodNames.find(m->name.data) == methodNames.end()) {
- methodNames[m->name.data] = m;
- } else {
- fprintf(stderr,"%s:%d attempt to redefine method %s,\n",
- filename, m->name.lineno, m->name.data);
- method_type* old = methodNames[m->name.data];
- fprintf(stderr, "%s:%d previously defined here.\n",
- filename, old->name.lineno);
- err = 1;
- }
- }
- member = member->next;
- }
- }
-
- items = items->next;
- }
- return err;
-}
-
-// ==========================================================
-static int
-exactly_one_interface(const char* filename, const document_item_type* items, const Options& options,
- bool* onlyParcelable)
-{
- if (items == NULL) {
- fprintf(stderr, "%s: file does not contain any interfaces\n",
- filename);
- return 1;
- }
-
- const document_item_type* next = items->next;
- // Allow parcelables to skip the "one-only" rule.
- if (items->next != NULL && next->item_type != USER_DATA_TYPE) {
- int lineno = -1;
- if (next->item_type == INTERFACE_TYPE_BINDER) {
- lineno = ((interface_type*)next)->interface_token.lineno;
- }
- else if (next->item_type == INTERFACE_TYPE_RPC) {
- lineno = ((interface_type*)next)->interface_token.lineno;
- }
- fprintf(stderr, "%s:%d aidl can only handle one interface per file\n",
- filename, lineno);
- return 1;
- }
-
- if (items->item_type == USER_DATA_TYPE) {
- *onlyParcelable = true;
- if (options.failOnParcelable) {
- fprintf(stderr, "%s:%d aidl can only generate code for interfaces, not"
- " parcelables or flattenables,\n", filename,
- ((user_data_type*)items)->keyword_token.lineno);
- fprintf(stderr, "%s:%d .aidl files that only declare parcelables or flattenables"
- "may not go in the Makefile.\n", filename,
- ((user_data_type*)items)->keyword_token.lineno);
- return 1;
- }
- } else {
- *onlyParcelable = false;
- }
-
- return 0;
-}
-
-// ==========================================================
-void
-generate_dep_file(const Options& options, const document_item_type* items)
-{
- /* we open the file in binary mode to ensure that the same output is
- * generated on all platforms !!
- */
- FILE* to = NULL;
- if (options.autoDepFile) {
- string fileName = options.outputFileName + ".d";
- to = fopen(fileName.c_str(), "wb");
- } else {
- to = fopen(options.depFileName.c_str(), "wb");
- }
-
- if (to == NULL) {
- return;
- }
-
- const char* slash = "\\";
- import_info* import = g_imports;
- if (import == NULL) {
- slash = "";
- }
-
- if (items->item_type == INTERFACE_TYPE_BINDER || items->item_type == INTERFACE_TYPE_RPC) {
- fprintf(to, "%s: \\\n", options.outputFileName.c_str());
- } else {
- // parcelable: there's no output file.
- fprintf(to, " : \\\n");
- }
- fprintf(to, " %s %s\n", options.inputFileName.c_str(), slash);
-
- while (import) {
- if (import->next == NULL) {
- slash = "";
- }
- if (import->filename) {
- fprintf(to, " %s %s\n", import->filename, slash);
- }
- import = import->next;
- }
-
- fprintf(to, "\n");
-
- // Output "<imported_file>: " so make won't fail if the imported file has
- // been deleted, moved or renamed in incremental build.
- import = g_imports;
- while (import) {
- if (import->filename) {
- fprintf(to, "%s :\n", import->filename);
- }
- import = import->next;
- }
-
- fclose(to);
-}
-
-// ==========================================================
-static string
-generate_outputFileName2(const Options& options, const buffer_type& name, const char* package)
-{
- string result;
-
- // create the path to the destination folder based on the
- // interface package name
- result = options.outputBaseFolder;
- result += OS_PATH_SEPARATOR;
-
- string packageStr = package;
- size_t len = packageStr.length();
- for (size_t i=0; i<len; i++) {
- if (packageStr[i] == '.') {
- packageStr[i] = OS_PATH_SEPARATOR;
- }
- }
-
- result += packageStr;
-
- // add the filename by replacing the .aidl extension to .java
- const char* p = strchr(name.data, '.');
- len = p ? p-name.data : strlen(name.data);
-
- result += OS_PATH_SEPARATOR;
- result.append(name.data, len);
- result += ".java";
-
- return result;
-}
-
-// ==========================================================
-static string
-generate_outputFileName(const Options& options, const document_item_type* items)
-{
- // items has already been checked to have only one interface.
- if (items->item_type == INTERFACE_TYPE_BINDER || items->item_type == INTERFACE_TYPE_RPC) {
- interface_type* type = (interface_type*)items;
-
- return generate_outputFileName2(options, type->name, type->package);
- } else if (items->item_type == USER_DATA_TYPE) {
- user_data_type* type = (user_data_type*)items;
- return generate_outputFileName2(options, type->name, type->package);
- }
-
- // I don't think we can come here, but safer than returning NULL.
- string result;
- return result;
-}
-
-
-
-// ==========================================================
-static void
-check_outputFilePath(const string& path) {
- size_t len = path.length();
- for (size_t i=0; i<len ; i++) {
- if (path[i] == OS_PATH_SEPARATOR) {
- string p = path.substr(0, i);
- if (access(path.data(), F_OK) != 0) {
-#ifdef HAVE_MS_C_RUNTIME
- _mkdir(p.data());
-#else
- mkdir(p.data(), S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IXGRP);
-#endif
- }
- }
- }
-}
-
-
-// ==========================================================
-static int
-parse_preprocessed_file(const string& filename)
-{
- int err;
-
- FILE* f = fopen(filename.c_str(), "rb");
- if (f == NULL) {
- fprintf(stderr, "aidl: can't open preprocessed file: %s\n",
- filename.c_str());
- return 1;
- }
-
- int lineno = 1;
- char line[1024];
- char type[1024];
- char fullname[1024];
- while (fgets(line, sizeof(line), f)) {
- // skip comments and empty lines
- if (!line[0] || strncmp(line, "//", 2) == 0) {
- continue;
- }
-
- sscanf(line, "%s %[^; \r\n\t];", type, fullname);
-
- char* packagename;
- char* classname = rfind(fullname, '.');
- if (classname != NULL) {
- *classname = '\0';
- classname++;
- packagename = fullname;
- } else {
- classname = fullname;
- packagename = NULL;
- }
-
- //printf("%s:%d:...%s...%s...%s...\n", filename.c_str(), lineno,
- // type, packagename, classname);
- document_item_type* doc;
-
- if (0 == strcmp("parcelable", type)) {
- user_data_type* parcl = (user_data_type*)malloc(
- sizeof(user_data_type));
- memset(parcl, 0, sizeof(user_data_type));
- parcl->document_item.item_type = USER_DATA_TYPE;
- parcl->keyword_token.lineno = lineno;
- parcl->keyword_token.data = strdup(type);
- parcl->package = packagename ? strdup(packagename) : NULL;
- parcl->name.lineno = lineno;
- parcl->name.data = strdup(classname);
- parcl->semicolon_token.lineno = lineno;
- parcl->semicolon_token.data = strdup(";");
- parcl->flattening_methods = PARCELABLE_DATA;
- doc = (document_item_type*)parcl;
- }
- else if (0 == strcmp("flattenable", type)) {
- user_data_type* parcl = (user_data_type*)malloc(
- sizeof(user_data_type));
- memset(parcl, 0, sizeof(user_data_type));
- parcl->document_item.item_type = USER_DATA_TYPE;
- parcl->keyword_token.lineno = lineno;
- parcl->keyword_token.data = strdup(type);
- parcl->package = packagename ? strdup(packagename) : NULL;
- parcl->name.lineno = lineno;
- parcl->name.data = strdup(classname);
- parcl->semicolon_token.lineno = lineno;
- parcl->semicolon_token.data = strdup(";");
- parcl->flattening_methods = RPC_DATA;
- doc = (document_item_type*)parcl;
- }
- else if (0 == strcmp("interface", type)) {
- interface_type* iface = (interface_type*)malloc(
- sizeof(interface_type));
- memset(iface, 0, sizeof(interface_type));
- iface->document_item.item_type = INTERFACE_TYPE_BINDER;
- iface->interface_token.lineno = lineno;
- iface->interface_token.data = strdup(type);
- iface->package = packagename ? strdup(packagename) : NULL;
- iface->name.lineno = lineno;
- iface->name.data = strdup(classname);
- iface->open_brace_token.lineno = lineno;
- iface->open_brace_token.data = strdup("{");
- iface->close_brace_token.lineno = lineno;
- iface->close_brace_token.data = strdup("}");
- doc = (document_item_type*)iface;
- }
- else {
- fprintf(stderr, "%s:%d: bad type in line: %s\n",
- filename.c_str(), lineno, line);
- fclose(f);
- return 1;
- }
- err = gather_types(filename.c_str(), doc);
- lineno++;
- }
-
- if (!feof(f)) {
- fprintf(stderr, "%s:%d: error reading file, line to long.\n",
- filename.c_str(), lineno);
- return 1;
- }
-
- fclose(f);
- return 0;
-}
-
-static int
-check_and_assign_method_ids(const char * filename, interface_item_type* first_item)
-{
- // Check whether there are any methods with manually assigned id's and any that are not.
- // Either all method id's must be manually assigned or all of them must not.
- // Also, check for duplicates of user set id's and that the id's are within the proper bounds.
- set<int> usedIds;
- interface_item_type* item = first_item;
- bool hasUnassignedIds = false;
- bool hasAssignedIds = false;
- while (item != NULL) {
- if (item->item_type == METHOD_TYPE) {
- method_type* method_item = (method_type*)item;
- if (method_item->hasId) {
- hasAssignedIds = true;
- method_item->assigned_id = atoi(method_item->id.data);
- // Ensure that the user set id is not duplicated.
- if (usedIds.find(method_item->assigned_id) != usedIds.end()) {
- // We found a duplicate id, so throw an error.
- fprintf(stderr,
- "%s:%d Found duplicate method id (%d) for method: %s\n",
- filename, method_item->id.lineno,
- method_item->assigned_id, method_item->name.data);
- return 1;
- }
- // Ensure that the user set id is within the appropriate limits
- if (method_item->assigned_id < MIN_USER_SET_METHOD_ID ||
- method_item->assigned_id > MAX_USER_SET_METHOD_ID) {
- fprintf(stderr, "%s:%d Found out of bounds id (%d) for method: %s\n",
- filename, method_item->id.lineno,
- method_item->assigned_id, method_item->name.data);
- fprintf(stderr, " Value for id must be between %d and %d inclusive.\n",
- MIN_USER_SET_METHOD_ID, MAX_USER_SET_METHOD_ID);
- return 1;
- }
- usedIds.insert(method_item->assigned_id);
- } else {
- hasUnassignedIds = true;
- }
- if (hasAssignedIds && hasUnassignedIds) {
- fprintf(stderr,
- "%s: You must either assign id's to all methods or to none of them.\n",
- filename);
- return 1;
- }
- }
- item = item->next;
- }
-
- // In the case that all methods have unassigned id's, set a unique id for them.
- if (hasUnassignedIds) {
- int newId = 0;
- item = first_item;
- while (item != NULL) {
- if (item->item_type == METHOD_TYPE) {
- method_type* method_item = (method_type*)item;
- method_item->assigned_id = newId++;
- }
- item = item->next;
- }
- }
-
- // success
- return 0;
-}
-
-// ==========================================================
-static int
-compile_aidl(Options& options)
-{
- int err = 0, N;
-
- set_import_paths(options.importPaths);
-
- register_base_types();
-
- // import the preprocessed file
- N = options.preprocessedFiles.size();
- for (int i=0; i<N; i++) {
- const string& s = options.preprocessedFiles[i];
- err |= parse_preprocessed_file(s);
- }
- if (err != 0) {
- return err;
- }
-
- // parse the main file
- g_callbacks = &g_mainCallbacks;
- err = parse_aidl(options.inputFileName.c_str());
- document_item_type* mainDoc = g_document;
- g_document = NULL;
-
- // parse the imports
- g_callbacks = &g_mainCallbacks;
- import_info* import = g_imports;
- while (import) {
- if (NAMES.Find(import->neededClass) == NULL) {
- import->filename = find_import_file(import->neededClass);
- if (!import->filename) {
- fprintf(stderr, "%s:%d: couldn't find import for class %s\n",
- import->from, import->statement.lineno,
- import->neededClass);
- err |= 1;
- } else {
- err |= parse_aidl(import->filename);
- import->doc = g_document;
- if (import->doc == NULL) {
- err |= 1;
- }
- }
- }
- import = import->next;
- }
- // bail out now if parsing wasn't successful
- if (err != 0 || mainDoc == NULL) {
- //fprintf(stderr, "aidl: parsing failed, stopping.\n");
- return 1;
- }
-
- // complain about ones that aren't in the right files
- err |= check_filenames(options.inputFileName.c_str(), mainDoc);
- import = g_imports;
- while (import) {
- err |= check_filenames(import->filename, import->doc);
- import = import->next;
- }
-
- // gather the types that have been declared
- err |= gather_types(options.inputFileName.c_str(), mainDoc);
- import = g_imports;
- while (import) {
- err |= gather_types(import->filename, import->doc);
- import = import->next;
- }
-
-#if 0
- printf("---- main doc ----\n");
- test_document(mainDoc);
-
- import = g_imports;
- while (import) {
- printf("---- import doc ----\n");
- test_document(import->doc);
- import = import->next;
- }
- NAMES.Dump();
-#endif
-
- // check the referenced types in mainDoc to make sure we've imported them
- err |= check_types(options.inputFileName.c_str(), mainDoc);
-
- // finally, there really only needs to be one thing in mainDoc, and it
- // needs to be an interface.
- bool onlyParcelable = false;
- err |= exactly_one_interface(options.inputFileName.c_str(), mainDoc, options, &onlyParcelable);
-
- // If this includes an interface definition, then assign method ids and validate.
- if (!onlyParcelable) {
- err |= check_and_assign_method_ids(options.inputFileName.c_str(),
- ((interface_type*)mainDoc)->interface_items);
- }
-
- // after this, there shouldn't be any more errors because of the
- // input.
- if (err != 0 || mainDoc == NULL) {
- return 1;
- }
-
- // if needed, generate the outputFileName from the outputBaseFolder
- if (options.outputFileName.length() == 0 &&
- options.outputBaseFolder.length() > 0) {
- options.outputFileName = generate_outputFileName(options, mainDoc);
- }
-
- // if we were asked to, generate a make dependency file
- // unless it's a parcelable *and* it's supposed to fail on parcelable
- if ((options.autoDepFile || options.depFileName != "") &&
- !(onlyParcelable && options.failOnParcelable)) {
- // make sure the folders of the output file all exists
- check_outputFilePath(options.outputFileName);
- generate_dep_file(options, mainDoc);
- }
-
- // they didn't ask to fail on parcelables, so just exit quietly.
- if (onlyParcelable && !options.failOnParcelable) {
- return 0;
- }
-
- // make sure the folders of the output file all exists
- check_outputFilePath(options.outputFileName);
-
- err = generate_java(options.outputFileName, options.inputFileName.c_str(),
- (interface_type*)mainDoc);
-
- return err;
-}
-
-static int
-preprocess_aidl(const Options& options)
-{
- vector<string> lines;
- int err;
-
- // read files
- int N = options.filesToPreprocess.size();
- for (int i=0; i<N; i++) {
- g_callbacks = &g_mainCallbacks;
- err = parse_aidl(options.filesToPreprocess[i].c_str());
- if (err != 0) {
- return err;
- }
- document_item_type* doc = g_document;
- string line;
- if (doc->item_type == USER_DATA_TYPE) {
- user_data_type* parcelable = (user_data_type*)doc;
- if ((parcelable->flattening_methods & PARCELABLE_DATA) != 0) {
- line = "parcelable ";
- }
- if ((parcelable->flattening_methods & RPC_DATA) != 0) {
- line = "flattenable ";
- }
- if (parcelable->package) {
- line += parcelable->package;
- line += '.';
- }
- line += parcelable->name.data;
- } else {
- line = "interface ";
- interface_type* iface = (interface_type*)doc;
- if (iface->package) {
- line += iface->package;
- line += '.';
- }
- line += iface->name.data;
- }
- line += ";\n";
- lines.push_back(line);
- }
-
- // write preprocessed file
- int fd = open( options.outputFileName.c_str(),
- O_RDWR|O_CREAT|O_TRUNC|O_BINARY,
-#ifdef HAVE_MS_C_RUNTIME
- _S_IREAD|_S_IWRITE);
-#else
- S_IRUSR|S_IWUSR|S_IRGRP);
-#endif
- if (fd == -1) {
- fprintf(stderr, "aidl: could not open file for write: %s\n",
- options.outputFileName.c_str());
- return 1;
- }
-
- N = lines.size();
- for (int i=0; i<N; i++) {
- const string& s = lines[i];
- int len = s.length();
- if (len != write(fd, s.c_str(), len)) {
- fprintf(stderr, "aidl: error writing to file %s\n",
- options.outputFileName.c_str());
- close(fd);
- unlink(options.outputFileName.c_str());
- return 1;
- }
- }
-
- close(fd);
- return 0;
-}
-
-// ==========================================================
-int
-main(int argc, const char **argv)
-{
- Options options;
- int result = parse_options(argc, argv, &options);
- if (result) {
- return result;
- }
-
- switch (options.task)
- {
- case COMPILE_AIDL:
- return compile_aidl(options);
- case PREPROCESS_AIDL:
- return preprocess_aidl(options);
- }
- fprintf(stderr, "aidl: internal error\n");
- return 1;
-}
diff --git a/tools/aidl/aidl_language.cpp b/tools/aidl/aidl_language.cpp
deleted file mode 100644
index cd6a3bd..0000000
--- a/tools/aidl/aidl_language.cpp
+++ /dev/null
@@ -1,20 +0,0 @@
-#include "aidl_language.h"
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-
-#ifdef HAVE_MS_C_RUNTIME
-int isatty(int fd)
-{
- return (fd == 0);
-}
-#endif
-
-#if 0
-ParserCallbacks k_parserCallbacks = {
- NULL
-};
-#endif
-
-ParserCallbacks* g_callbacks = NULL; // &k_parserCallbacks;
-
diff --git a/tools/aidl/aidl_language.h b/tools/aidl/aidl_language.h
deleted file mode 100644
index de1370c..0000000
--- a/tools/aidl/aidl_language.h
+++ /dev/null
@@ -1,172 +0,0 @@
-#ifndef DEVICE_TOOLS_AIDL_AIDL_LANGUAGE_H
-#define DEVICE_TOOLS_AIDL_AIDL_LANGUAGE_H
-
-
-typedef enum {
- NO_EXTRA_TEXT = 0,
- SHORT_COMMENT,
- LONG_COMMENT,
- COPY_TEXT,
- WHITESPACE
-} which_extra_text;
-
-typedef struct extra_text_type {
- unsigned lineno;
- which_extra_text which;
- char* data;
- unsigned len;
- struct extra_text_type* next;
-} extra_text_type;
-
-typedef struct buffer_type {
- unsigned lineno;
- unsigned token;
- char *data;
- extra_text_type* extra;
-} buffer_type;
-
-typedef struct type_type {
- buffer_type type;
- buffer_type array_token;
- int dimension;
-} type_type;
-
-typedef struct arg_type {
- buffer_type comma_token; // empty in the first one in the list
- buffer_type direction;
- type_type type;
- buffer_type name;
- struct arg_type *next;
-} arg_type;
-
-enum {
- METHOD_TYPE
-};
-
-typedef struct interface_item_type {
- unsigned item_type;
- struct interface_item_type* next;
-} interface_item_type;
-
-typedef struct method_type {
- interface_item_type interface_item;
- type_type type;
- bool oneway;
- buffer_type oneway_token;
- buffer_type name;
- buffer_type open_paren_token;
- arg_type* args;
- buffer_type close_paren_token;
- bool hasId;
- buffer_type equals_token;
- buffer_type id;
- // XXX missing comments/copy text here
- buffer_type semicolon_token;
- buffer_type* comments_token; // points into this structure, DO NOT DELETE
- int assigned_id;
-} method_type;
-
-enum {
- USER_DATA_TYPE = 12,
- INTERFACE_TYPE_BINDER,
- INTERFACE_TYPE_RPC
-};
-
-typedef struct document_item_type {
- unsigned item_type;
- struct document_item_type* next;
-} document_item_type;
-
-
-// for user_data_type.flattening_methods
-enum {
- PARCELABLE_DATA = 0x1,
- RPC_DATA = 0x2
-};
-
-typedef struct user_data_type {
- document_item_type document_item;
- buffer_type keyword_token; // only the first one
- char* package;
- buffer_type name;
- buffer_type semicolon_token;
- int flattening_methods;
-} user_data_type;
-
-typedef struct interface_type {
- document_item_type document_item;
- buffer_type interface_token;
- bool oneway;
- buffer_type oneway_token;
- char* package;
- buffer_type name;
- buffer_type open_brace_token;
- interface_item_type* interface_items;
- buffer_type close_brace_token;
- buffer_type* comments_token; // points into this structure, DO NOT DELETE
-} interface_type;
-
-typedef union lexer_type {
- buffer_type buffer;
- type_type type;
- arg_type *arg;
- method_type* method;
- interface_item_type* interface_item;
- interface_type* interface_obj;
- user_data_type* user_data;
- document_item_type* document_item;
-} lexer_type;
-
-
-#define YYSTYPE lexer_type
-
-#if __cplusplus
-extern "C" {
-#endif
-
-int parse_aidl(char const *);
-
-// strips off the leading whitespace, the "import" text
-// also returns whether it's a local or system import
-// we rely on the input matching the import regex from below
-char* parse_import_statement(const char* text);
-
-// in, out or inout
-enum {
- IN_PARAMETER = 1,
- OUT_PARAMETER = 2,
- INOUT_PARAMETER = 3
-};
-int convert_direction(const char* direction);
-
-// callbacks from within the parser
-// these functions all take ownership of the strings
-typedef struct ParserCallbacks {
- void (*document)(document_item_type* items);
- void (*import)(buffer_type* statement);
-} ParserCallbacks;
-
-extern ParserCallbacks* g_callbacks;
-
-// true if there was an error parsing, false otherwise
-extern int g_error;
-
-// the name of the file we're currently parsing
-extern char const* g_currentFilename;
-
-// the package name for our current file
-extern char const* g_currentPackage;
-
-typedef enum {
- STATEMENT_INSIDE_INTERFACE
-} error_type;
-
-void init_buffer_type(buffer_type* buf, int lineno);
-
-
-#if __cplusplus
-}
-#endif
-
-
-#endif // DEVICE_TOOLS_AIDL_AIDL_LANGUAGE_H
diff --git a/tools/aidl/aidl_language_l.l b/tools/aidl/aidl_language_l.l
deleted file mode 100644
index 3d33e7a..0000000
--- a/tools/aidl/aidl_language_l.l
+++ /dev/null
@@ -1,214 +0,0 @@
-%{
-#include "aidl_language.h"
-#include "aidl_language_y.h"
-#include "search_path.h"
-#include <string.h>
-#include <stdlib.h>
-
-extern YYSTYPE yylval;
-
-// comment and whitespace handling
-// these functions save a copy of the buffer
-static void begin_extra_text(unsigned lineno, which_extra_text which);
-static void append_extra_text(char* text);
-static extra_text_type* get_extra_text(void); // you now own the object
- // this returns
-static void drop_extra_text(void);
-
-// package handling
-static void do_package_statement(const char* importText);
-
-#define SET_BUFFER(t) \
- do { \
- yylval.buffer.lineno = yylineno; \
- yylval.buffer.token = (t); \
- yylval.buffer.data = strdup(yytext); \
- yylval.buffer.extra = get_extra_text(); \
- } while(0)
-
-%}
-
-%option yylineno
-%option noyywrap
-
-%x COPYING LONG_COMMENT
-
-identifier [_a-zA-Z][_a-zA-Z0-9\.]*
-whitespace ([ \t\n\r]+)
-brackets \[{whitespace}?\]
-idvalue (0|[1-9][0-9]*)
-
-%%
-
-
-\%\%\{ { begin_extra_text(yylineno, COPY_TEXT); BEGIN(COPYING); }
-<COPYING>\}\%\% { BEGIN(INITIAL); }
-<COPYING>.*\n { append_extra_text(yytext); }
-<COPYING>.* { append_extra_text(yytext); }
-<COPYING>\n+ { append_extra_text(yytext); }
-
-
-\/\* { begin_extra_text(yylineno, (which_extra_text)LONG_COMMENT);
- BEGIN(LONG_COMMENT); }
-<LONG_COMMENT>[^*]* { append_extra_text(yytext); }
-<LONG_COMMENT>\*+[^/] { append_extra_text(yytext); }
-<LONG_COMMENT>\n { append_extra_text(yytext); }
-<LONG_COMMENT>\**\/ { BEGIN(INITIAL); }
-
-^{whitespace}?import{whitespace}[^ \t\r\n]+{whitespace}?; {
- SET_BUFFER(IMPORT);
- return IMPORT;
- }
-^{whitespace}?package{whitespace}[^ \t\r\n]+{whitespace}?; {
- do_package_statement(yytext);
- SET_BUFFER(PACKAGE);
- return PACKAGE;
- }
-<<EOF>> { yyterminate(); }
-
-\/\/.*\n { begin_extra_text(yylineno, SHORT_COMMENT);
- append_extra_text(yytext); }
-
-{whitespace} { /* begin_extra_text(yylineno, WHITESPACE);
- append_extra_text(yytext); */ }
-
-; { SET_BUFFER(';'); return ';'; }
-\{ { SET_BUFFER('{'); return '{'; }
-\} { SET_BUFFER('}'); return '}'; }
-\( { SET_BUFFER('('); return '('; }
-\) { SET_BUFFER(')'); return ')'; }
-, { SET_BUFFER(','); return ','; }
-= { SET_BUFFER('='); return '='; }
-
- /* keywords */
-parcelable { SET_BUFFER(PARCELABLE); return PARCELABLE; }
-interface { SET_BUFFER(INTERFACE); return INTERFACE; }
-flattenable { SET_BUFFER(FLATTENABLE); return FLATTENABLE; }
-rpc { SET_BUFFER(INTERFACE); return RPC; }
-in { SET_BUFFER(IN); return IN; }
-out { SET_BUFFER(OUT); return OUT; }
-inout { SET_BUFFER(INOUT); return INOUT; }
-oneway { SET_BUFFER(ONEWAY); return ONEWAY; }
-
-{brackets}+ { SET_BUFFER(ARRAY); return ARRAY; }
-{idvalue} { SET_BUFFER(IDVALUE); return IDVALUE; }
-{identifier} { SET_BUFFER(IDENTIFIER); return IDENTIFIER; }
-{identifier}\<{whitespace}*{identifier}({whitespace}*,{whitespace}*{identifier})*{whitespace}*\> {
- SET_BUFFER(GENERIC); return GENERIC; }
-
- /* syntax error! */
-. { printf("UNKNOWN(%s)", yytext);
- yylval.buffer.lineno = yylineno;
- yylval.buffer.token = IDENTIFIER;
- yylval.buffer.data = strdup(yytext);
- return IDENTIFIER;
- }
-
-%%
-
-// comment and whitespace handling
-// ================================================
-extra_text_type* g_extraText = NULL;
-extra_text_type* g_nextExtraText = NULL;
-
-void begin_extra_text(unsigned lineno, which_extra_text which)
-{
- extra_text_type* text = (extra_text_type*)malloc(sizeof(extra_text_type));
- text->lineno = lineno;
- text->which = which;
- text->data = NULL;
- text->len = 0;
- text->next = NULL;
- if (g_nextExtraText == NULL) {
- g_extraText = text;
- } else {
- g_nextExtraText->next = text;
- }
- g_nextExtraText = text;
-}
-
-void append_extra_text(char* text)
-{
- if (g_nextExtraText->data == NULL) {
- g_nextExtraText->data = strdup(text);
- g_nextExtraText->len = strlen(text);
- } else {
- char* orig = g_nextExtraText->data;
- unsigned oldLen = g_nextExtraText->len;
- unsigned len = strlen(text);
- g_nextExtraText->len += len;
- g_nextExtraText->data = (char*)malloc(g_nextExtraText->len+1);
- memcpy(g_nextExtraText->data, orig, oldLen);
- memcpy(g_nextExtraText->data+oldLen, text, len);
- g_nextExtraText->data[g_nextExtraText->len] = '\0';
- free(orig);
- }
-}
-
-extra_text_type*
-get_extra_text(void)
-{
- extra_text_type* result = g_extraText;
- g_extraText = NULL;
- g_nextExtraText = NULL;
- return result;
-}
-
-void drop_extra_text(void)
-{
- extra_text_type* p = g_extraText;
- while (p) {
- extra_text_type* next = p->next;
- free(p->data);
- free(p);
- free(next);
- }
- g_extraText = NULL;
- g_nextExtraText = NULL;
-}
-
-
-// package handling
-// ================================================
-void do_package_statement(const char* importText)
-{
- if (g_currentPackage) free((void*)g_currentPackage);
- g_currentPackage = parse_import_statement(importText);
-}
-
-
-// main parse function
-// ================================================
-char const* g_currentFilename = NULL;
-char const* g_currentPackage = NULL;
-
-int yyparse(void);
-
-int parse_aidl(char const *filename)
-{
- yyin = fopen(filename, "r");
- if (yyin) {
- char const* oldFilename = g_currentFilename;
- char const* oldPackage = g_currentPackage;
- g_currentFilename = strdup(filename);
-
- g_error = 0;
- yylineno = 1;
- int rv = yyparse();
- if (g_error != 0) {
- rv = g_error;
- }
-
- free((void*)g_currentFilename);
- g_currentFilename = oldFilename;
-
- if (g_currentPackage) free((void*)g_currentPackage);
- g_currentPackage = oldPackage;
-
- return rv;
- } else {
- fprintf(stderr, "aidl: unable to open file for read: %s\n", filename);
- return 1;
- }
-}
-
diff --git a/tools/aidl/aidl_language_y.y b/tools/aidl/aidl_language_y.y
deleted file mode 100644
index 9b40d28..0000000
--- a/tools/aidl/aidl_language_y.y
+++ /dev/null
@@ -1,373 +0,0 @@
-%{
-#include "aidl_language.h"
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-int yyerror(char* errstr);
-int yylex(void);
-extern int yylineno;
-
-static int count_brackets(const char*);
-
-%}
-
-%token IMPORT
-%token PACKAGE
-%token IDENTIFIER
-%token IDVALUE
-%token GENERIC
-%token ARRAY
-%token PARCELABLE
-%token INTERFACE
-%token FLATTENABLE
-%token RPC
-%token IN
-%token OUT
-%token INOUT
-%token ONEWAY
-
-%%
-document:
- document_items { g_callbacks->document($1.document_item); }
- | headers document_items { g_callbacks->document($2.document_item); }
- ;
-
-headers:
- package { }
- | imports { }
- | package imports { }
- ;
-
-package:
- PACKAGE { }
- ;
-
-imports:
- IMPORT { g_callbacks->import(&($1.buffer)); }
- | IMPORT imports { g_callbacks->import(&($1.buffer)); }
- ;
-
-document_items:
- { $$.document_item = NULL; }
- | document_items declaration {
- if ($2.document_item == NULL) {
- // error cases only
- $$ = $1;
- } else {
- document_item_type* p = $1.document_item;
- while (p && p->next) {
- p=p->next;
- }
- if (p) {
- p->next = (document_item_type*)$2.document_item;
- $$ = $1;
- } else {
- $$.document_item = (document_item_type*)$2.document_item;
- }
- }
- }
- | document_items error {
- fprintf(stderr, "%s:%d: syntax error don't know what to do with \"%s\"\n", g_currentFilename,
- $2.buffer.lineno, $2.buffer.data);
- $$ = $1;
- }
- ;
-
-declaration:
- parcelable_decl { $$.document_item = (document_item_type*)$1.user_data; }
- | interface_decl { $$.document_item = (document_item_type*)$1.interface_item; }
- ;
-
-parcelable_decl:
- PARCELABLE IDENTIFIER ';' {
- user_data_type* b = (user_data_type*)malloc(sizeof(user_data_type));
- b->document_item.item_type = USER_DATA_TYPE;
- b->document_item.next = NULL;
- b->keyword_token = $1.buffer;
- b->name = $2.buffer;
- b->package = g_currentPackage ? strdup(g_currentPackage) : NULL;
- b->semicolon_token = $3.buffer;
- b->flattening_methods = PARCELABLE_DATA;
- $$.user_data = b;
- }
- | PARCELABLE ';' {
- fprintf(stderr, "%s:%d syntax error in parcelable declaration. Expected type name.\n",
- g_currentFilename, $1.buffer.lineno);
- $$.user_data = NULL;
- }
- | PARCELABLE error ';' {
- fprintf(stderr, "%s:%d syntax error in parcelable declaration. Expected type name, saw \"%s\".\n",
- g_currentFilename, $2.buffer.lineno, $2.buffer.data);
- $$.user_data = NULL;
- }
- | FLATTENABLE IDENTIFIER ';' {
- user_data_type* b = (user_data_type*)malloc(sizeof(user_data_type));
- b->document_item.item_type = USER_DATA_TYPE;
- b->document_item.next = NULL;
- b->keyword_token = $1.buffer;
- b->name = $2.buffer;
- b->package = g_currentPackage ? strdup(g_currentPackage) : NULL;
- b->semicolon_token = $3.buffer;
- b->flattening_methods = PARCELABLE_DATA | RPC_DATA;
- $$.user_data = b;
- }
- | FLATTENABLE ';' {
- fprintf(stderr, "%s:%d syntax error in flattenable declaration. Expected type name.\n",
- g_currentFilename, $1.buffer.lineno);
- $$.user_data = NULL;
- }
- | FLATTENABLE error ';' {
- fprintf(stderr, "%s:%d syntax error in flattenable declaration. Expected type name, saw \"%s\".\n",
- g_currentFilename, $2.buffer.lineno, $2.buffer.data);
- $$.user_data = NULL;
- }
-
- ;
-
-interface_header:
- INTERFACE {
- interface_type* c = (interface_type*)malloc(sizeof(interface_type));
- c->document_item.item_type = INTERFACE_TYPE_BINDER;
- c->document_item.next = NULL;
- c->interface_token = $1.buffer;
- c->oneway = false;
- memset(&c->oneway_token, 0, sizeof(buffer_type));
- c->comments_token = &c->interface_token;
- $$.interface_obj = c;
- }
- | ONEWAY INTERFACE {
- interface_type* c = (interface_type*)malloc(sizeof(interface_type));
- c->document_item.item_type = INTERFACE_TYPE_BINDER;
- c->document_item.next = NULL;
- c->interface_token = $2.buffer;
- c->oneway = true;
- c->oneway_token = $1.buffer;
- c->comments_token = &c->oneway_token;
- $$.interface_obj = c;
- }
- | RPC {
- interface_type* c = (interface_type*)malloc(sizeof(interface_type));
- c->document_item.item_type = INTERFACE_TYPE_RPC;
- c->document_item.next = NULL;
- c->interface_token = $1.buffer;
- c->oneway = false;
- memset(&c->oneway_token, 0, sizeof(buffer_type));
- c->comments_token = &c->interface_token;
- $$.interface_obj = c;
- }
- ;
-
-interface_keywords:
- INTERFACE
- | RPC
- ;
-
-interface_decl:
- interface_header IDENTIFIER '{' interface_items '}' {
- interface_type* c = $1.interface_obj;
- c->name = $2.buffer;
- c->package = g_currentPackage ? strdup(g_currentPackage) : NULL;
- c->open_brace_token = $3.buffer;
- c->interface_items = $4.interface_item;
- c->close_brace_token = $5.buffer;
- $$.interface_obj = c;
- }
- | interface_keywords error '{' interface_items '}' {
- fprintf(stderr, "%s:%d: syntax error in interface declaration. Expected type name, saw \"%s\"\n",
- g_currentFilename, $2.buffer.lineno, $2.buffer.data);
- $$.document_item = NULL;
- }
- | interface_keywords error '}' {
- fprintf(stderr, "%s:%d: syntax error in interface declaration. Expected type name, saw \"%s\"\n",
- g_currentFilename, $2.buffer.lineno, $2.buffer.data);
- $$.document_item = NULL;
- }
-
- ;
-
-interface_items:
- { $$.interface_item = NULL; }
- | interface_items method_decl {
- interface_item_type* p=$1.interface_item;
- while (p && p->next) {
- p=p->next;
- }
- if (p) {
- p->next = (interface_item_type*)$2.method;
- $$ = $1;
- } else {
- $$.interface_item = (interface_item_type*)$2.method;
- }
- }
- | interface_items error ';' {
- fprintf(stderr, "%s:%d: syntax error before ';' (expected method declaration)\n",
- g_currentFilename, $3.buffer.lineno);
- $$ = $1;
- }
- ;
-
-method_decl:
- type IDENTIFIER '(' arg_list ')' ';' {
- method_type *method = (method_type*)malloc(sizeof(method_type));
- method->interface_item.item_type = METHOD_TYPE;
- method->interface_item.next = NULL;
- method->oneway = false;
- method->type = $1.type;
- memset(&method->oneway_token, 0, sizeof(buffer_type));
- method->name = $2.buffer;
- method->open_paren_token = $3.buffer;
- method->args = $4.arg;
- method->close_paren_token = $5.buffer;
- method->hasId = false;
- memset(&method->equals_token, 0, sizeof(buffer_type));
- memset(&method->id, 0, sizeof(buffer_type));
- method->semicolon_token = $6.buffer;
- method->comments_token = &method->type.type;
- $$.method = method;
- }
- | ONEWAY type IDENTIFIER '(' arg_list ')' ';' {
- method_type *method = (method_type*)malloc(sizeof(method_type));
- method->interface_item.item_type = METHOD_TYPE;
- method->interface_item.next = NULL;
- method->oneway = true;
- method->oneway_token = $1.buffer;
- method->type = $2.type;
- method->name = $3.buffer;
- method->open_paren_token = $4.buffer;
- method->args = $5.arg;
- method->close_paren_token = $6.buffer;
- method->hasId = false;
- memset(&method->equals_token, 0, sizeof(buffer_type));
- memset(&method->id, 0, sizeof(buffer_type));
- method->semicolon_token = $7.buffer;
- method->comments_token = &method->oneway_token;
- $$.method = method;
- }
- | type IDENTIFIER '(' arg_list ')' '=' IDVALUE ';' {
- method_type *method = (method_type*)malloc(sizeof(method_type));
- method->interface_item.item_type = METHOD_TYPE;
- method->interface_item.next = NULL;
- method->oneway = false;
- memset(&method->oneway_token, 0, sizeof(buffer_type));
- method->type = $1.type;
- method->name = $2.buffer;
- method->open_paren_token = $3.buffer;
- method->args = $4.arg;
- method->close_paren_token = $5.buffer;
- method->hasId = true;
- method->equals_token = $6.buffer;
- method->id = $7.buffer;
- method->semicolon_token = $8.buffer;
- method->comments_token = &method->type.type;
- $$.method = method;
- }
- | ONEWAY type IDENTIFIER '(' arg_list ')' '=' IDVALUE ';' {
- method_type *method = (method_type*)malloc(sizeof(method_type));
- method->interface_item.item_type = METHOD_TYPE;
- method->interface_item.next = NULL;
- method->oneway = true;
- method->oneway_token = $1.buffer;
- method->type = $2.type;
- method->name = $3.buffer;
- method->open_paren_token = $4.buffer;
- method->args = $5.arg;
- method->close_paren_token = $6.buffer;
- method->hasId = true;
- method->equals_token = $7.buffer;
- method->id = $8.buffer;
- method->semicolon_token = $9.buffer;
- method->comments_token = &method->oneway_token;
- $$.method = method;
- }
- ;
-
-arg_list:
- { $$.arg = NULL; }
- | arg { $$ = $1; }
- | arg_list ',' arg {
- if ($$.arg != NULL) {
- // only NULL on error
- $$ = $1;
- arg_type *p = $1.arg;
- while (p && p->next) {
- p=p->next;
- }
- $3.arg->comma_token = $2.buffer;
- p->next = $3.arg;
- }
- }
- | error {
- fprintf(stderr, "%s:%d: syntax error in parameter list\n", g_currentFilename, $1.buffer.lineno);
- $$.arg = NULL;
- }
- ;
-
-arg:
- direction type IDENTIFIER {
- arg_type* arg = (arg_type*)malloc(sizeof(arg_type));
- memset(&arg->comma_token, 0, sizeof(buffer_type));
- arg->direction = $1.buffer;
- arg->type = $2.type;
- arg->name = $3.buffer;
- arg->next = NULL;
- $$.arg = arg;
- }
- ;
-
-type:
- IDENTIFIER {
- $$.type.type = $1.buffer;
- init_buffer_type(&$$.type.array_token, yylineno);
- $$.type.dimension = 0;
- }
- | IDENTIFIER ARRAY {
- $$.type.type = $1.buffer;
- $$.type.array_token = $2.buffer;
- $$.type.dimension = count_brackets($2.buffer.data);
- }
- | GENERIC {
- $$.type.type = $1.buffer;
- init_buffer_type(&$$.type.array_token, yylineno);
- $$.type.dimension = 0;
- }
- ;
-
-direction:
- { init_buffer_type(&$$.buffer, yylineno); }
- | IN { $$.buffer = $1.buffer; }
- | OUT { $$.buffer = $1.buffer; }
- | INOUT { $$.buffer = $1.buffer; }
- ;
-
-%%
-
-#include <ctype.h>
-#include <stdio.h>
-
-int g_error = 0;
-
-int yyerror(char* errstr)
-{
- fprintf(stderr, "%s:%d: %s\n", g_currentFilename, yylineno, errstr);
- g_error = 1;
- return 1;
-}
-
-void init_buffer_type(buffer_type* buf, int lineno)
-{
- buf->lineno = lineno;
- buf->token = 0;
- buf->data = NULL;
- buf->extra = NULL;
-}
-
-static int count_brackets(const char* s)
-{
- int n=0;
- while (*s) {
- if (*s == '[') n++;
- s++;
- }
- return n;
-}
diff --git a/tools/aidl/generate_java.cpp b/tools/aidl/generate_java.cpp
deleted file mode 100644
index 9e57407..0000000
--- a/tools/aidl/generate_java.cpp
+++ /dev/null
@@ -1,99 +0,0 @@
-#include "generate_java.h"
-#include "Type.h"
-#include <string.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-// =================================================
-VariableFactory::VariableFactory(const string& base)
- :m_base(base),
- m_index(0)
-{
-}
-
-Variable*
-VariableFactory::Get(Type* type)
-{
- char name[100];
- sprintf(name, "%s%d", m_base.c_str(), m_index);
- m_index++;
- Variable* v = new Variable(type, name);
- m_vars.push_back(v);
- return v;
-}
-
-Variable*
-VariableFactory::Get(int index)
-{
- return m_vars[index];
-}
-
-// =================================================
-string
-gather_comments(extra_text_type* extra)
-{
- string s;
- while (extra) {
- if (extra->which == SHORT_COMMENT) {
- s += extra->data;
- }
- else if (extra->which == LONG_COMMENT) {
- s += "/*";
- s += extra->data;
- s += "*/";
- }
- extra = extra->next;
- }
- return s;
-}
-
-string
-append(const char* a, const char* b)
-{
- string s = a;
- s += b;
- return s;
-}
-
-// =================================================
-int
-generate_java(const string& filename, const string& originalSrc,
- interface_type* iface)
-{
- Class* cl;
-
- if (iface->document_item.item_type == INTERFACE_TYPE_BINDER) {
- cl = generate_binder_interface_class(iface);
- }
- else if (iface->document_item.item_type == INTERFACE_TYPE_RPC) {
- cl = generate_rpc_interface_class(iface);
- }
-
- Document* document = new Document;
- document->comment = "";
- if (iface->package) document->package = iface->package;
- document->originalSrc = originalSrc;
- document->classes.push_back(cl);
-
-// printf("outputting... filename=%s\n", filename.c_str());
- FILE* to;
- if (filename == "-") {
- to = stdout;
- } else {
- /* open file in binary mode to ensure that the tool produces the
- * same output on all platforms !!
- */
- to = fopen(filename.c_str(), "wb");
- if (to == NULL) {
- fprintf(stderr, "unable to open %s for write\n", filename.c_str());
- return 1;
- }
- }
-
- document->Write(to);
-
- fclose(to);
- return 0;
-}
-
diff --git a/tools/aidl/generate_java.h b/tools/aidl/generate_java.h
deleted file mode 100644
index 4bfcfeb..0000000
--- a/tools/aidl/generate_java.h
+++ /dev/null
@@ -1,33 +0,0 @@
-#ifndef GENERATE_JAVA_H
-#define GENERATE_JAVA_H
-
-#include "aidl_language.h"
-#include "AST.h"
-
-#include <string>
-
-using namespace std;
-
-int generate_java(const string& filename, const string& originalSrc,
- interface_type* iface);
-
-Class* generate_binder_interface_class(const interface_type* iface);
-Class* generate_rpc_interface_class(const interface_type* iface);
-
-string gather_comments(extra_text_type* extra);
-string append(const char* a, const char* b);
-
-class VariableFactory
-{
-public:
- VariableFactory(const string& base); // base must be short
- Variable* Get(Type* type);
- Variable* Get(int index);
-private:
- vector<Variable*> m_vars;
- string m_base;
- int m_index;
-};
-
-#endif // GENERATE_JAVA_H
-
diff --git a/tools/aidl/generate_java_binder.cpp b/tools/aidl/generate_java_binder.cpp
deleted file mode 100644
index f291ceb..0000000
--- a/tools/aidl/generate_java_binder.cpp
+++ /dev/null
@@ -1,560 +0,0 @@
-#include "generate_java.h"
-#include "Type.h"
-#include <string.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-// =================================================
-class StubClass : public Class
-{
-public:
- StubClass(Type* type, Type* interfaceType);
- virtual ~StubClass();
-
- Variable* transact_code;
- Variable* transact_data;
- Variable* transact_reply;
- Variable* transact_flags;
- SwitchStatement* transact_switch;
-private:
- void make_as_interface(Type* interfaceType);
-};
-
-StubClass::StubClass(Type* type, Type* interfaceType)
- :Class()
-{
- this->comment = "/** Local-side IPC implementation stub class. */";
- this->modifiers = PUBLIC | ABSTRACT | STATIC;
- this->what = Class::CLASS;
- this->type = type;
- this->extends = BINDER_NATIVE_TYPE;
- this->interfaces.push_back(interfaceType);
-
- // descriptor
- Field* descriptor = new Field(STATIC | FINAL | PRIVATE,
- new Variable(STRING_TYPE, "DESCRIPTOR"));
- descriptor->value = "\"" + interfaceType->QualifiedName() + "\"";
- this->elements.push_back(descriptor);
-
- // ctor
- Method* ctor = new Method;
- ctor->modifiers = PUBLIC;
- ctor->comment = "/** Construct the stub at attach it to the "
- "interface. */";
- ctor->name = "Stub";
- ctor->statements = new StatementBlock;
- MethodCall* attach = new MethodCall(THIS_VALUE, "attachInterface",
- 2, THIS_VALUE, new LiteralExpression("DESCRIPTOR"));
- ctor->statements->Add(attach);
- this->elements.push_back(ctor);
-
- // asInterface
- make_as_interface(interfaceType);
-
- // asBinder
- Method* asBinder = new Method;
- asBinder->modifiers = PUBLIC | OVERRIDE;
- asBinder->returnType = IBINDER_TYPE;
- asBinder->name = "asBinder";
- asBinder->statements = new StatementBlock;
- asBinder->statements->Add(new ReturnStatement(THIS_VALUE));
- this->elements.push_back(asBinder);
-
- // onTransact
- this->transact_code = new Variable(INT_TYPE, "code");
- this->transact_data = new Variable(PARCEL_TYPE, "data");
- this->transact_reply = new Variable(PARCEL_TYPE, "reply");
- this->transact_flags = new Variable(INT_TYPE, "flags");
- Method* onTransact = new Method;
- onTransact->modifiers = PUBLIC | OVERRIDE;
- onTransact->returnType = BOOLEAN_TYPE;
- onTransact->name = "onTransact";
- onTransact->parameters.push_back(this->transact_code);
- onTransact->parameters.push_back(this->transact_data);
- onTransact->parameters.push_back(this->transact_reply);
- onTransact->parameters.push_back(this->transact_flags);
- onTransact->statements = new StatementBlock;
- onTransact->exceptions.push_back(REMOTE_EXCEPTION_TYPE);
- this->elements.push_back(onTransact);
- this->transact_switch = new SwitchStatement(this->transact_code);
-
- onTransact->statements->Add(this->transact_switch);
- MethodCall* superCall = new MethodCall(SUPER_VALUE, "onTransact", 4,
- this->transact_code, this->transact_data,
- this->transact_reply, this->transact_flags);
- onTransact->statements->Add(new ReturnStatement(superCall));
-}
-
-StubClass::~StubClass()
-{
-}
-
-void
-StubClass::make_as_interface(Type *interfaceType)
-{
- Variable* obj = new Variable(IBINDER_TYPE, "obj");
-
- Method* m = new Method;
- m->comment = "/**\n * Cast an IBinder object into an ";
- m->comment += interfaceType->QualifiedName();
- m->comment += " interface,\n";
- m->comment += " * generating a proxy if needed.\n */";
- m->modifiers = PUBLIC | STATIC;
- m->returnType = interfaceType;
- m->name = "asInterface";
- m->parameters.push_back(obj);
- m->statements = new StatementBlock;
-
- IfStatement* ifstatement = new IfStatement();
- ifstatement->expression = new Comparison(obj, "==", NULL_VALUE);
- ifstatement->statements = new StatementBlock;
- ifstatement->statements->Add(new ReturnStatement(NULL_VALUE));
- m->statements->Add(ifstatement);
-
- // IInterface iin = obj.queryLocalInterface(DESCRIPTOR)
- MethodCall* queryLocalInterface = new MethodCall(obj, "queryLocalInterface");
- queryLocalInterface->arguments.push_back(new LiteralExpression("DESCRIPTOR"));
- IInterfaceType* iinType = new IInterfaceType();
- Variable *iin = new Variable(iinType, "iin");
- VariableDeclaration* iinVd = new VariableDeclaration(iin, queryLocalInterface, NULL);
- m->statements->Add(iinVd);
-
- // Ensure the instance type of the local object is as expected.
- // One scenario where this is needed is if another package (with a
- // different class loader) runs in the same process as the service.
-
- // if (iin != null && iin instanceof <interfaceType>) return (<interfaceType>) iin;
- Comparison* iinNotNull = new Comparison(iin, "!=", NULL_VALUE);
- Comparison* instOfCheck = new Comparison(iin, " instanceof ",
- new LiteralExpression(interfaceType->QualifiedName()));
- IfStatement* instOfStatement = new IfStatement();
- instOfStatement->expression = new Comparison(iinNotNull, "&&", instOfCheck);
- instOfStatement->statements = new StatementBlock;
- instOfStatement->statements->Add(new ReturnStatement(new Cast(interfaceType, iin)));
- m->statements->Add(instOfStatement);
-
- string proxyType = interfaceType->QualifiedName();
- proxyType += ".Stub.Proxy";
- NewExpression* ne = new NewExpression(NAMES.Find(proxyType));
- ne->arguments.push_back(obj);
- m->statements->Add(new ReturnStatement(ne));
-
- this->elements.push_back(m);
-}
-
-
-
-// =================================================
-class ProxyClass : public Class
-{
-public:
- ProxyClass(Type* type, InterfaceType* interfaceType);
- virtual ~ProxyClass();
-
- Variable* mRemote;
- bool mOneWay;
-};
-
-ProxyClass::ProxyClass(Type* type, InterfaceType* interfaceType)
- :Class()
-{
- this->modifiers = PRIVATE | STATIC;
- this->what = Class::CLASS;
- this->type = type;
- this->interfaces.push_back(interfaceType);
-
- mOneWay = interfaceType->OneWay();
-
- // IBinder mRemote
- mRemote = new Variable(IBINDER_TYPE, "mRemote");
- this->elements.push_back(new Field(PRIVATE, mRemote));
-
- // Proxy()
- Variable* remote = new Variable(IBINDER_TYPE, "remote");
- Method* ctor = new Method;
- ctor->name = "Proxy";
- ctor->statements = new StatementBlock;
- ctor->parameters.push_back(remote);
- ctor->statements->Add(new Assignment(mRemote, remote));
- this->elements.push_back(ctor);
-
- // IBinder asBinder()
- Method* asBinder = new Method;
- asBinder->modifiers = PUBLIC | OVERRIDE;
- asBinder->returnType = IBINDER_TYPE;
- asBinder->name = "asBinder";
- asBinder->statements = new StatementBlock;
- asBinder->statements->Add(new ReturnStatement(mRemote));
- this->elements.push_back(asBinder);
-}
-
-ProxyClass::~ProxyClass()
-{
-}
-
-// =================================================
-static void
-generate_new_array(Type* t, StatementBlock* addTo, Variable* v,
- Variable* parcel)
-{
- Variable* len = new Variable(INT_TYPE, v->name + "_length");
- addTo->Add(new VariableDeclaration(len, new MethodCall(parcel, "readInt")));
- IfStatement* lencheck = new IfStatement();
- lencheck->expression = new Comparison(len, "<", new LiteralExpression("0"));
- lencheck->statements->Add(new Assignment(v, NULL_VALUE));
- lencheck->elseif = new IfStatement();
- lencheck->elseif->statements->Add(new Assignment(v,
- new NewArrayExpression(t, len)));
- addTo->Add(lencheck);
-}
-
-static void
-generate_write_to_parcel(Type* t, StatementBlock* addTo, Variable* v,
- Variable* parcel, int flags)
-{
- if (v->dimension == 0) {
- t->WriteToParcel(addTo, v, parcel, flags);
- }
- if (v->dimension == 1) {
- t->WriteArrayToParcel(addTo, v, parcel, flags);
- }
-}
-
-static void
-generate_create_from_parcel(Type* t, StatementBlock* addTo, Variable* v,
- Variable* parcel, Variable** cl)
-{
- if (v->dimension == 0) {
- t->CreateFromParcel(addTo, v, parcel, cl);
- }
- if (v->dimension == 1) {
- t->CreateArrayFromParcel(addTo, v, parcel, cl);
- }
-}
-
-static void
-generate_read_from_parcel(Type* t, StatementBlock* addTo, Variable* v,
- Variable* parcel, Variable** cl)
-{
- if (v->dimension == 0) {
- t->ReadFromParcel(addTo, v, parcel, cl);
- }
- if (v->dimension == 1) {
- t->ReadArrayFromParcel(addTo, v, parcel, cl);
- }
-}
-
-
-static void
-generate_method(const method_type* method, Class* interface,
- StubClass* stubClass, ProxyClass* proxyClass, int index)
-{
- arg_type* arg;
- int i;
- bool hasOutParams = false;
-
- const bool oneway = proxyClass->mOneWay || method->oneway;
-
- // == the TRANSACT_ constant =============================================
- string transactCodeName = "TRANSACTION_";
- transactCodeName += method->name.data;
-
- char transactCodeValue[60];
- sprintf(transactCodeValue, "(android.os.IBinder.FIRST_CALL_TRANSACTION + %d)", index);
-
- Field* transactCode = new Field(STATIC | FINAL,
- new Variable(INT_TYPE, transactCodeName));
- transactCode->value = transactCodeValue;
- stubClass->elements.push_back(transactCode);
-
- // == the declaration in the interface ===================================
- Method* decl = new Method;
- decl->comment = gather_comments(method->comments_token->extra);
- decl->modifiers = PUBLIC;
- decl->returnType = NAMES.Search(method->type.type.data);
- decl->returnTypeDimension = method->type.dimension;
- decl->name = method->name.data;
-
- arg = method->args;
- while (arg != NULL) {
- decl->parameters.push_back(new Variable(
- NAMES.Search(arg->type.type.data), arg->name.data,
- arg->type.dimension));
- arg = arg->next;
- }
-
- decl->exceptions.push_back(REMOTE_EXCEPTION_TYPE);
-
- interface->elements.push_back(decl);
-
- // == the stub method ====================================================
-
- Case* c = new Case(transactCodeName);
-
- MethodCall* realCall = new MethodCall(THIS_VALUE, method->name.data);
-
- // interface token validation is the very first thing we do
- c->statements->Add(new MethodCall(stubClass->transact_data,
- "enforceInterface", 1, new LiteralExpression("DESCRIPTOR")));
-
- // args
- Variable* cl = NULL;
- VariableFactory stubArgs("_arg");
- arg = method->args;
- while (arg != NULL) {
- Type* t = NAMES.Search(arg->type.type.data);
- Variable* v = stubArgs.Get(t);
- v->dimension = arg->type.dimension;
-
- c->statements->Add(new VariableDeclaration(v));
-
- if (convert_direction(arg->direction.data) & IN_PARAMETER) {
- generate_create_from_parcel(t, c->statements, v,
- stubClass->transact_data, &cl);
- } else {
- if (arg->type.dimension == 0) {
- c->statements->Add(new Assignment(v, new NewExpression(v->type)));
- }
- else if (arg->type.dimension == 1) {
- generate_new_array(v->type, c->statements, v,
- stubClass->transact_data);
- }
- else {
- fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__,
- __LINE__);
- }
- }
-
- realCall->arguments.push_back(v);
-
- arg = arg->next;
- }
-
- // the real call
- Variable* _result = NULL;
- if (0 == strcmp(method->type.type.data, "void")) {
- c->statements->Add(realCall);
-
- if (!oneway) {
- // report that there were no exceptions
- MethodCall* ex = new MethodCall(stubClass->transact_reply,
- "writeNoException", 0);
- c->statements->Add(ex);
- }
- } else {
- _result = new Variable(decl->returnType, "_result",
- decl->returnTypeDimension);
- c->statements->Add(new VariableDeclaration(_result, realCall));
-
- if (!oneway) {
- // report that there were no exceptions
- MethodCall* ex = new MethodCall(stubClass->transact_reply,
- "writeNoException", 0);
- c->statements->Add(ex);
- }
-
- // marshall the return value
- generate_write_to_parcel(decl->returnType, c->statements, _result,
- stubClass->transact_reply,
- Type::PARCELABLE_WRITE_RETURN_VALUE);
- }
-
- // out parameters
- i = 0;
- arg = method->args;
- while (arg != NULL) {
- Type* t = NAMES.Search(arg->type.type.data);
- Variable* v = stubArgs.Get(i++);
-
- if (convert_direction(arg->direction.data) & OUT_PARAMETER) {
- generate_write_to_parcel(t, c->statements, v,
- stubClass->transact_reply,
- Type::PARCELABLE_WRITE_RETURN_VALUE);
- hasOutParams = true;
- }
-
- arg = arg->next;
- }
-
- // return true
- c->statements->Add(new ReturnStatement(TRUE_VALUE));
- stubClass->transact_switch->cases.push_back(c);
-
- // == the proxy method ===================================================
- Method* proxy = new Method;
- proxy->comment = gather_comments(method->comments_token->extra);
- proxy->modifiers = PUBLIC | OVERRIDE;
- proxy->returnType = NAMES.Search(method->type.type.data);
- proxy->returnTypeDimension = method->type.dimension;
- proxy->name = method->name.data;
- proxy->statements = new StatementBlock;
- arg = method->args;
- while (arg != NULL) {
- proxy->parameters.push_back(new Variable(
- NAMES.Search(arg->type.type.data), arg->name.data,
- arg->type.dimension));
- arg = arg->next;
- }
- proxy->exceptions.push_back(REMOTE_EXCEPTION_TYPE);
- proxyClass->elements.push_back(proxy);
-
- // the parcels
- Variable* _data = new Variable(PARCEL_TYPE, "_data");
- proxy->statements->Add(new VariableDeclaration(_data,
- new MethodCall(PARCEL_TYPE, "obtain")));
- Variable* _reply = NULL;
- if (!oneway) {
- _reply = new Variable(PARCEL_TYPE, "_reply");
- proxy->statements->Add(new VariableDeclaration(_reply,
- new MethodCall(PARCEL_TYPE, "obtain")));
- }
-
- // the return value
- _result = NULL;
- if (0 != strcmp(method->type.type.data, "void")) {
- _result = new Variable(proxy->returnType, "_result",
- method->type.dimension);
- proxy->statements->Add(new VariableDeclaration(_result));
- }
-
- // try and finally
- TryStatement* tryStatement = new TryStatement();
- proxy->statements->Add(tryStatement);
- FinallyStatement* finallyStatement = new FinallyStatement();
- proxy->statements->Add(finallyStatement);
-
- // the interface identifier token: the DESCRIPTOR constant, marshalled as a string
- tryStatement->statements->Add(new MethodCall(_data, "writeInterfaceToken",
- 1, new LiteralExpression("DESCRIPTOR")));
-
- // the parameters
- arg = method->args;
- while (arg != NULL) {
- Type* t = NAMES.Search(arg->type.type.data);
- Variable* v = new Variable(t, arg->name.data, arg->type.dimension);
- int dir = convert_direction(arg->direction.data);
- if (dir == OUT_PARAMETER && arg->type.dimension != 0) {
- IfStatement* checklen = new IfStatement();
- checklen->expression = new Comparison(v, "==", NULL_VALUE);
- checklen->statements->Add(new MethodCall(_data, "writeInt", 1,
- new LiteralExpression("-1")));
- checklen->elseif = new IfStatement();
- checklen->elseif->statements->Add(new MethodCall(_data, "writeInt",
- 1, new FieldVariable(v, "length")));
- tryStatement->statements->Add(checklen);
- }
- else if (dir & IN_PARAMETER) {
- generate_write_to_parcel(t, tryStatement->statements, v, _data, 0);
- }
- arg = arg->next;
- }
-
- // the transact call
- MethodCall* call = new MethodCall(proxyClass->mRemote, "transact", 4,
- new LiteralExpression("Stub." + transactCodeName),
- _data, _reply ? _reply : NULL_VALUE,
- new LiteralExpression(
- oneway ? "android.os.IBinder.FLAG_ONEWAY" : "0"));
- tryStatement->statements->Add(call);
-
- // throw back exceptions.
- if (_reply) {
- MethodCall* ex = new MethodCall(_reply, "readException", 0);
- tryStatement->statements->Add(ex);
- }
-
- // returning and cleanup
- if (_reply != NULL) {
- if (_result != NULL) {
- generate_create_from_parcel(proxy->returnType,
- tryStatement->statements, _result, _reply, &cl);
- }
-
- // the out/inout parameters
- arg = method->args;
- while (arg != NULL) {
- Type* t = NAMES.Search(arg->type.type.data);
- Variable* v = new Variable(t, arg->name.data, arg->type.dimension);
- if (convert_direction(arg->direction.data) & OUT_PARAMETER) {
- generate_read_from_parcel(t, tryStatement->statements,
- v, _reply, &cl);
- }
- arg = arg->next;
- }
-
- finallyStatement->statements->Add(new MethodCall(_reply, "recycle"));
- }
- finallyStatement->statements->Add(new MethodCall(_data, "recycle"));
-
- if (_result != NULL) {
- proxy->statements->Add(new ReturnStatement(_result));
- }
-}
-
-static void
-generate_interface_descriptors(StubClass* stub, ProxyClass* proxy)
-{
- // the interface descriptor transaction handler
- Case* c = new Case("INTERFACE_TRANSACTION");
- c->statements->Add(new MethodCall(stub->transact_reply, "writeString",
- 1, new LiteralExpression("DESCRIPTOR")));
- c->statements->Add(new ReturnStatement(TRUE_VALUE));
- stub->transact_switch->cases.push_back(c);
-
- // and the proxy-side method returning the descriptor directly
- Method* getDesc = new Method;
- getDesc->modifiers = PUBLIC;
- getDesc->returnType = STRING_TYPE;
- getDesc->returnTypeDimension = 0;
- getDesc->name = "getInterfaceDescriptor";
- getDesc->statements = new StatementBlock;
- getDesc->statements->Add(new ReturnStatement(new LiteralExpression("DESCRIPTOR")));
- proxy->elements.push_back(getDesc);
-}
-
-Class*
-generate_binder_interface_class(const interface_type* iface)
-{
- InterfaceType* interfaceType = static_cast<InterfaceType*>(
- NAMES.Find(iface->package, iface->name.data));
-
- // the interface class
- Class* interface = new Class;
- interface->comment = gather_comments(iface->comments_token->extra);
- interface->modifiers = PUBLIC;
- interface->what = Class::INTERFACE;
- interface->type = interfaceType;
- interface->interfaces.push_back(IINTERFACE_TYPE);
-
- // the stub inner class
- StubClass* stub = new StubClass(
- NAMES.Find(iface->package, append(iface->name.data, ".Stub").c_str()),
- interfaceType);
- interface->elements.push_back(stub);
-
- // the proxy inner class
- ProxyClass* proxy = new ProxyClass(
- NAMES.Find(iface->package,
- append(iface->name.data, ".Stub.Proxy").c_str()),
- interfaceType);
- stub->elements.push_back(proxy);
-
- // stub and proxy support for getInterfaceDescriptor()
- generate_interface_descriptors(stub, proxy);
-
- // all the declared methods of the interface
- int index = 0;
- interface_item_type* item = iface->interface_items;
- while (item != NULL) {
- if (item->item_type == METHOD_TYPE) {
- method_type * method_item = (method_type*) item;
- generate_method(method_item, interface, stub, proxy, method_item->assigned_id);
- }
- item = item->next;
- index++;
- }
-
- return interface;
-}
-
diff --git a/tools/aidl/generate_java_rpc.cpp b/tools/aidl/generate_java_rpc.cpp
deleted file mode 100644
index 5e4dacc..0000000
--- a/tools/aidl/generate_java_rpc.cpp
+++ /dev/null
@@ -1,1001 +0,0 @@
-#include "generate_java.h"
-#include "Type.h"
-#include <string.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-Type* SERVICE_CONTEXT_TYPE = new Type("android.content",
- "Context", Type::BUILT_IN, false, false, false);
-Type* PRESENTER_BASE_TYPE = new Type("android.support.place.connector",
- "EventListener", Type::BUILT_IN, false, false, false);
-Type* PRESENTER_LISTENER_BASE_TYPE = new Type("android.support.place.connector",
- "EventListener.Listener", Type::BUILT_IN, false, false, false);
-Type* RPC_BROKER_TYPE = new Type("android.support.place.connector", "Broker",
- Type::BUILT_IN, false, false, false);
-Type* RPC_CONTAINER_TYPE = new Type("com.android.athome.connector", "ConnectorContainer",
- Type::BUILT_IN, false, false, false);
-Type* PLACE_INFO_TYPE = new Type("android.support.place.connector", "PlaceInfo",
- Type::BUILT_IN, false, false, false);
-// TODO: Just use Endpoint, so this works for all endpoints.
-Type* RPC_CONNECTOR_TYPE = new Type("android.support.place.connector", "Connector",
- Type::BUILT_IN, false, false, false);
-Type* RPC_ENDPOINT_INFO_TYPE = new UserDataType("android.support.place.rpc",
- "EndpointInfo", true, __FILE__, __LINE__);
-Type* RPC_RESULT_HANDLER_TYPE = new UserDataType("android.support.place.rpc", "RpcResultHandler",
- true, __FILE__, __LINE__);
-Type* RPC_ERROR_LISTENER_TYPE = new Type("android.support.place.rpc", "RpcErrorHandler",
- Type::BUILT_IN, false, false, false);
-Type* RPC_CONTEXT_TYPE = new UserDataType("android.support.place.rpc", "RpcContext", true,
- __FILE__, __LINE__);
-
-static void generate_create_from_data(Type* t, StatementBlock* addTo, const string& key,
- Variable* v, Variable* data, Variable** cl);
-static void generate_new_array(Type* t, StatementBlock* addTo, Variable* v, Variable* from);
-static void generate_write_to_data(Type* t, StatementBlock* addTo, Expression* k, Variable* v,
- Variable* data);
-
-static string
-format_int(int n)
-{
- char str[20];
- sprintf(str, "%d", n);
- return string(str);
-}
-
-static string
-class_name_leaf(const string& str)
-{
- string::size_type pos = str.rfind('.');
- if (pos == string::npos) {
- return str;
- } else {
- return string(str, pos+1);
- }
-}
-
-static string
-results_class_name(const string& n)
-{
- string str = n;
- str[0] = toupper(str[0]);
- str.insert(0, "On");
- return str;
-}
-
-static string
-results_method_name(const string& n)
-{
- string str = n;
- str[0] = toupper(str[0]);
- str.insert(0, "on");
- return str;
-}
-
-static string
-push_method_name(const string& n)
-{
- string str = n;
- str[0] = toupper(str[0]);
- str.insert(0, "push");
- return str;
-}
-
-// =================================================
-class DispatcherClass : public Class
-{
-public:
- DispatcherClass(const interface_type* iface, Expression* target);
- virtual ~DispatcherClass();
-
- void AddMethod(const method_type* method);
- void DoneWithMethods();
-
- Method* processMethod;
- Variable* actionParam;
- Variable* requestParam;
- Variable* rpcContextParam;
- Variable* errorParam;
- Variable* requestData;
- Variable* resultData;
- IfStatement* dispatchIfStatement;
- Expression* targetExpression;
-
-private:
- void generate_process();
-};
-
-DispatcherClass::DispatcherClass(const interface_type* iface, Expression* target)
- :Class(),
- dispatchIfStatement(NULL),
- targetExpression(target)
-{
- generate_process();
-}
-
-DispatcherClass::~DispatcherClass()
-{
-}
-
-void
-DispatcherClass::generate_process()
-{
- // byte[] process(String action, byte[] params, RpcContext context, RpcError status)
- this->processMethod = new Method;
- this->processMethod->modifiers = PUBLIC;
- this->processMethod->returnType = BYTE_TYPE;
- this->processMethod->returnTypeDimension = 1;
- this->processMethod->name = "process";
- this->processMethod->statements = new StatementBlock;
-
- this->actionParam = new Variable(STRING_TYPE, "action");
- this->processMethod->parameters.push_back(this->actionParam);
-
- this->requestParam = new Variable(BYTE_TYPE, "requestParam", 1);
- this->processMethod->parameters.push_back(this->requestParam);
-
- this->rpcContextParam = new Variable(RPC_CONTEXT_TYPE, "context", 0);
- this->processMethod->parameters.push_back(this->rpcContextParam);
-
- this->errorParam = new Variable(RPC_ERROR_TYPE, "errorParam", 0);
- this->processMethod->parameters.push_back(this->errorParam);
-
- this->requestData = new Variable(RPC_DATA_TYPE, "request");
- this->processMethod->statements->Add(new VariableDeclaration(requestData,
- new NewExpression(RPC_DATA_TYPE, 1, this->requestParam)));
-
- this->resultData = new Variable(RPC_DATA_TYPE, "resultData");
- this->processMethod->statements->Add(new VariableDeclaration(this->resultData,
- NULL_VALUE));
-}
-
-void
-DispatcherClass::AddMethod(const method_type* method)
-{
- arg_type* arg;
-
- // The if/switch statement
- IfStatement* ifs = new IfStatement();
- ifs->expression = new MethodCall(new StringLiteralExpression(method->name.data), "equals",
- 1, this->actionParam);
- StatementBlock* block = ifs->statements = new StatementBlock;
- if (this->dispatchIfStatement == NULL) {
- this->dispatchIfStatement = ifs;
- this->processMethod->statements->Add(dispatchIfStatement);
- } else {
- this->dispatchIfStatement->elseif = ifs;
- this->dispatchIfStatement = ifs;
- }
-
- // The call to decl (from above)
- MethodCall* realCall = new MethodCall(this->targetExpression, method->name.data);
-
- // args
- Variable* classLoader = NULL;
- VariableFactory stubArgs("_arg");
- arg = method->args;
- while (arg != NULL) {
- Type* t = NAMES.Search(arg->type.type.data);
- Variable* v = stubArgs.Get(t);
- v->dimension = arg->type.dimension;
-
- // Unmarshall the parameter
- block->Add(new VariableDeclaration(v));
- if (convert_direction(arg->direction.data) & IN_PARAMETER) {
- generate_create_from_data(t, block, arg->name.data, v,
- this->requestData, &classLoader);
- } else {
- if (arg->type.dimension == 0) {
- block->Add(new Assignment(v, new NewExpression(v->type)));
- }
- else if (arg->type.dimension == 1) {
- generate_new_array(v->type, block, v, this->requestData);
- }
- else {
- fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__,
- __LINE__);
- }
- }
-
- // Add that parameter to the method call
- realCall->arguments.push_back(v);
-
- arg = arg->next;
- }
-
- // Add a final parameter: RpcContext. Contains data about
- // incoming request (e.g., certificate)
- realCall->arguments.push_back(new Variable(RPC_CONTEXT_TYPE, "context", 0));
-
- Type* returnType = NAMES.Search(method->type.type.data);
- if (returnType == EVENT_FAKE_TYPE) {
- returnType = VOID_TYPE;
- }
-
- // the real call
- bool first = true;
- Variable* _result = NULL;
- if (returnType == VOID_TYPE) {
- block->Add(realCall);
- } else {
- _result = new Variable(returnType, "_result",
- method->type.dimension);
- block->Add(new VariableDeclaration(_result, realCall));
-
- // need the result RpcData
- if (first) {
- block->Add(new Assignment(this->resultData,
- new NewExpression(RPC_DATA_TYPE)));
- first = false;
- }
-
- // marshall the return value
- generate_write_to_data(returnType, block,
- new StringLiteralExpression("_result"), _result, this->resultData);
- }
-
- // out parameters
- int i = 0;
- arg = method->args;
- while (arg != NULL) {
- Type* t = NAMES.Search(arg->type.type.data);
- Variable* v = stubArgs.Get(i++);
-
- if (convert_direction(arg->direction.data) & OUT_PARAMETER) {
- // need the result RpcData
- if (first) {
- block->Add(new Assignment(this->resultData, new NewExpression(RPC_DATA_TYPE)));
- first = false;
- }
-
- generate_write_to_data(t, block, new StringLiteralExpression(arg->name.data),
- v, this->resultData);
- }
-
- arg = arg->next;
- }
-}
-
-void
-DispatcherClass::DoneWithMethods()
-{
- if (this->dispatchIfStatement == NULL) {
- return;
- }
-
- this->elements.push_back(this->processMethod);
-
- IfStatement* fallthrough = new IfStatement();
- fallthrough->statements = new StatementBlock;
- fallthrough->statements->Add(new ReturnStatement(
- new MethodCall(SUPER_VALUE, "process", 4,
- this->actionParam, this->requestParam,
- this->rpcContextParam,
- this->errorParam)));
- this->dispatchIfStatement->elseif = fallthrough;
- IfStatement* s = new IfStatement;
- s->statements = new StatementBlock;
- this->processMethod->statements->Add(s);
- s->expression = new Comparison(this->resultData, "!=", NULL_VALUE);
- s->statements->Add(new ReturnStatement(new MethodCall(this->resultData, "serialize")));
- s->elseif = new IfStatement;
- s = s->elseif;
- s->statements->Add(new ReturnStatement(NULL_VALUE));
-}
-
-// =================================================
-class RpcProxyClass : public Class
-{
-public:
- RpcProxyClass(const interface_type* iface, InterfaceType* interfaceType);
- virtual ~RpcProxyClass();
-
- Variable* endpoint;
- Variable* broker;
-
-private:
- void generate_ctor();
- void generate_get_endpoint_info();
-};
-
-RpcProxyClass::RpcProxyClass(const interface_type* iface, InterfaceType* interfaceType)
- :Class()
-{
- this->comment = gather_comments(iface->comments_token->extra);
- this->modifiers = PUBLIC;
- this->what = Class::CLASS;
- this->type = interfaceType;
-
- // broker
- this->broker = new Variable(RPC_BROKER_TYPE, "_broker");
- this->elements.push_back(new Field(PRIVATE, this->broker));
- // endpoint
- this->endpoint = new Variable(RPC_ENDPOINT_INFO_TYPE, "_endpoint");
- this->elements.push_back(new Field(PRIVATE, this->endpoint));
-
- // methods
- generate_ctor();
- generate_get_endpoint_info();
-}
-
-RpcProxyClass::~RpcProxyClass()
-{
-}
-
-void
-RpcProxyClass::generate_ctor()
-{
- Variable* broker = new Variable(RPC_BROKER_TYPE, "broker");
- Variable* endpoint = new Variable(RPC_ENDPOINT_INFO_TYPE, "endpoint");
- Method* ctor = new Method;
- ctor->modifiers = PUBLIC;
- ctor->name = class_name_leaf(this->type->Name());
- ctor->statements = new StatementBlock;
- ctor->parameters.push_back(broker);
- ctor->parameters.push_back(endpoint);
- this->elements.push_back(ctor);
-
- ctor->statements->Add(new Assignment(this->broker, broker));
- ctor->statements->Add(new Assignment(this->endpoint, endpoint));
-}
-
-void
-RpcProxyClass::generate_get_endpoint_info()
-{
- Method* get = new Method;
- get->modifiers = PUBLIC;
- get->returnType = RPC_ENDPOINT_INFO_TYPE;
- get->name = "getEndpointInfo";
- get->statements = new StatementBlock;
- this->elements.push_back(get);
-
- get->statements->Add(new ReturnStatement(this->endpoint));
-}
-
-// =================================================
-class EventListenerClass : public DispatcherClass
-{
-public:
- EventListenerClass(const interface_type* iface, Type* listenerType);
- virtual ~EventListenerClass();
-
- Variable* _listener;
-
-private:
- void generate_ctor();
-};
-
-Expression*
-generate_get_listener_expression(Type* cast)
-{
- return new Cast(cast, new MethodCall(THIS_VALUE, "getView"));
-}
-
-EventListenerClass::EventListenerClass(const interface_type* iface, Type* listenerType)
- :DispatcherClass(iface, new FieldVariable(THIS_VALUE, "_listener"))
-{
- this->modifiers = PRIVATE;
- this->what = Class::CLASS;
- this->type = new Type(iface->package ? iface->package : "",
- append(iface->name.data, ".Presenter"),
- Type::GENERATED, false, false, false);
- this->extends = PRESENTER_BASE_TYPE;
-
- this->_listener = new Variable(listenerType, "_listener");
- this->elements.push_back(new Field(PRIVATE, this->_listener));
-
- // methods
- generate_ctor();
-}
-
-EventListenerClass::~EventListenerClass()
-{
-}
-
-void
-EventListenerClass::generate_ctor()
-{
- Variable* broker = new Variable(RPC_BROKER_TYPE, "broker");
- Variable* listener = new Variable(this->_listener->type, "listener");
- Method* ctor = new Method;
- ctor->modifiers = PUBLIC;
- ctor->name = class_name_leaf(this->type->Name());
- ctor->statements = new StatementBlock;
- ctor->parameters.push_back(broker);
- ctor->parameters.push_back(listener);
- this->elements.push_back(ctor);
-
- ctor->statements->Add(new MethodCall("super", 2, broker, listener));
- ctor->statements->Add(new Assignment(this->_listener, listener));
-}
-
-// =================================================
-class ListenerClass : public Class
-{
-public:
- ListenerClass(const interface_type* iface);
- virtual ~ListenerClass();
-
- bool needed;
-
-private:
- void generate_ctor();
-};
-
-ListenerClass::ListenerClass(const interface_type* iface)
- :Class(),
- needed(false)
-{
- this->comment = "/** Extend this to listen to the events from this class. */";
- this->modifiers = STATIC | PUBLIC ;
- this->what = Class::CLASS;
- this->type = new Type(iface->package ? iface->package : "",
- append(iface->name.data, ".Listener"),
- Type::GENERATED, false, false, false);
- this->extends = PRESENTER_LISTENER_BASE_TYPE;
-}
-
-ListenerClass::~ListenerClass()
-{
-}
-
-// =================================================
-class EndpointBaseClass : public DispatcherClass
-{
-public:
- EndpointBaseClass(const interface_type* iface);
- virtual ~EndpointBaseClass();
-
- bool needed;
-
-private:
- void generate_ctor();
-};
-
-EndpointBaseClass::EndpointBaseClass(const interface_type* iface)
- :DispatcherClass(iface, THIS_VALUE),
- needed(false)
-{
- this->comment = "/** Extend this to implement a link service. */";
- this->modifiers = STATIC | PUBLIC | ABSTRACT;
- this->what = Class::CLASS;
- this->type = new Type(iface->package ? iface->package : "",
- append(iface->name.data, ".EndpointBase"),
- Type::GENERATED, false, false, false);
- this->extends = RPC_CONNECTOR_TYPE;
-
- // methods
- generate_ctor();
-}
-
-EndpointBaseClass::~EndpointBaseClass()
-{
-}
-
-void
-EndpointBaseClass::generate_ctor()
-{
- Variable* container = new Variable(RPC_CONTAINER_TYPE, "container");
- Variable* broker = new Variable(RPC_BROKER_TYPE, "broker");
- Variable* place = new Variable(PLACE_INFO_TYPE, "placeInfo");
- Method* ctor = new Method;
- ctor->modifiers = PUBLIC;
- ctor->name = class_name_leaf(this->type->Name());
- ctor->statements = new StatementBlock;
- ctor->parameters.push_back(container);
- ctor->parameters.push_back(broker);
- ctor->parameters.push_back(place);
- this->elements.push_back(ctor);
-
- ctor->statements->Add(new MethodCall("super", 3, container, broker, place));
-}
-
-// =================================================
-class ResultDispatcherClass : public Class
-{
-public:
- ResultDispatcherClass();
- virtual ~ResultDispatcherClass();
-
- void AddMethod(int index, const string& name, Method** method, Variable** param);
-
- bool needed;
- Variable* methodId;
- Variable* callback;
- Method* onResultMethod;
- Variable* resultParam;
- SwitchStatement* methodSwitch;
-
-private:
- void generate_ctor();
- void generate_onResult();
-};
-
-ResultDispatcherClass::ResultDispatcherClass()
- :Class(),
- needed(false)
-{
- this->modifiers = PRIVATE | FINAL;
- this->what = Class::CLASS;
- this->type = new Type("_ResultDispatcher", Type::GENERATED, false, false, false);
- this->interfaces.push_back(RPC_RESULT_HANDLER_TYPE);
-
- // methodId
- this->methodId = new Variable(INT_TYPE, "methodId");
- this->elements.push_back(new Field(PRIVATE, this->methodId));
- this->callback = new Variable(OBJECT_TYPE, "callback");
- this->elements.push_back(new Field(PRIVATE, this->callback));
-
- // methods
- generate_ctor();
- generate_onResult();
-}
-
-ResultDispatcherClass::~ResultDispatcherClass()
-{
-}
-
-void
-ResultDispatcherClass::generate_ctor()
-{
- Variable* methodIdParam = new Variable(INT_TYPE, "methId");
- Variable* callbackParam = new Variable(OBJECT_TYPE, "cbObj");
- Method* ctor = new Method;
- ctor->modifiers = PUBLIC;
- ctor->name = class_name_leaf(this->type->Name());
- ctor->statements = new StatementBlock;
- ctor->parameters.push_back(methodIdParam);
- ctor->parameters.push_back(callbackParam);
- this->elements.push_back(ctor);
-
- ctor->statements->Add(new Assignment(this->methodId, methodIdParam));
- ctor->statements->Add(new Assignment(this->callback, callbackParam));
-}
-
-void
-ResultDispatcherClass::generate_onResult()
-{
- this->onResultMethod = new Method;
- this->onResultMethod->modifiers = PUBLIC;
- this->onResultMethod->returnType = VOID_TYPE;
- this->onResultMethod->returnTypeDimension = 0;
- this->onResultMethod->name = "onResult";
- this->onResultMethod->statements = new StatementBlock;
- this->elements.push_back(this->onResultMethod);
-
- this->resultParam = new Variable(BYTE_TYPE, "result", 1);
- this->onResultMethod->parameters.push_back(this->resultParam);
-
- this->methodSwitch = new SwitchStatement(this->methodId);
- this->onResultMethod->statements->Add(this->methodSwitch);
-}
-
-void
-ResultDispatcherClass::AddMethod(int index, const string& name, Method** method, Variable** param)
-{
- Method* m = new Method;
- m->modifiers = PUBLIC;
- m->returnType = VOID_TYPE;
- m->returnTypeDimension = 0;
- m->name = name;
- m->statements = new StatementBlock;
- *param = new Variable(BYTE_TYPE, "result", 1);
- m->parameters.push_back(*param);
- this->elements.push_back(m);
- *method = m;
-
- Case* c = new Case(format_int(index));
- c->statements->Add(new MethodCall(new LiteralExpression("this"), name, 1, this->resultParam));
- c->statements->Add(new Break());
-
- this->methodSwitch->cases.push_back(c);
-}
-
-// =================================================
-static void
-generate_new_array(Type* t, StatementBlock* addTo, Variable* v, Variable* from)
-{
- fprintf(stderr, "aidl: implement generate_new_array %s:%d\n", __FILE__, __LINE__);
- exit(1);
-}
-
-static void
-generate_create_from_data(Type* t, StatementBlock* addTo, const string& key, Variable* v,
- Variable* data, Variable** cl)
-{
- Expression* k = new StringLiteralExpression(key);
- if (v->dimension == 0) {
- t->CreateFromRpcData(addTo, k, v, data, cl);
- }
- if (v->dimension == 1) {
- //t->ReadArrayFromRpcData(addTo, v, data, cl);
- fprintf(stderr, "aidl: implement generate_create_from_data for arrays%s:%d\n",
- __FILE__, __LINE__);
- }
-}
-
-static void
-generate_write_to_data(Type* t, StatementBlock* addTo, Expression* k, Variable* v, Variable* data)
-{
- if (v->dimension == 0) {
- t->WriteToRpcData(addTo, k, v, data, 0);
- }
- if (v->dimension == 1) {
- //t->WriteArrayToParcel(addTo, v, data);
- fprintf(stderr, "aidl: implement generate_write_to_data for arrays%s:%d\n",
- __FILE__, __LINE__);
- }
-}
-
-// =================================================
-static Type*
-generate_results_method(const method_type* method, RpcProxyClass* proxyClass)
-{
- arg_type* arg;
-
- string resultsMethodName = results_method_name(method->name.data);
- Type* resultsInterfaceType = new Type(results_class_name(method->name.data),
- Type::GENERATED, false, false, false);
-
- if (!method->oneway) {
- Class* resultsClass = new Class;
- resultsClass->modifiers = STATIC | PUBLIC;
- resultsClass->what = Class::INTERFACE;
- resultsClass->type = resultsInterfaceType;
-
- Method* resultMethod = new Method;
- resultMethod->comment = gather_comments(method->comments_token->extra);
- resultMethod->modifiers = PUBLIC;
- resultMethod->returnType = VOID_TYPE;
- resultMethod->returnTypeDimension = 0;
- resultMethod->name = resultsMethodName;
- if (0 != strcmp("void", method->type.type.data)) {
- resultMethod->parameters.push_back(new Variable(NAMES.Search(method->type.type.data),
- "_result", method->type.dimension));
- }
- arg = method->args;
- while (arg != NULL) {
- if (convert_direction(arg->direction.data) & OUT_PARAMETER) {
- resultMethod->parameters.push_back(new Variable(
- NAMES.Search(arg->type.type.data), arg->name.data,
- arg->type.dimension));
- }
- arg = arg->next;
- }
- resultsClass->elements.push_back(resultMethod);
-
- if (resultMethod->parameters.size() > 0) {
- proxyClass->elements.push_back(resultsClass);
- return resultsInterfaceType;
- }
- }
- //delete resultsInterfaceType;
- return NULL;
-}
-
-static void
-generate_proxy_method(const method_type* method, RpcProxyClass* proxyClass,
- ResultDispatcherClass* resultsDispatcherClass, Type* resultsInterfaceType, int index)
-{
- arg_type* arg;
- Method* proxyMethod = new Method;
- proxyMethod->comment = gather_comments(method->comments_token->extra);
- proxyMethod->modifiers = PUBLIC;
- proxyMethod->returnType = VOID_TYPE;
- proxyMethod->returnTypeDimension = 0;
- proxyMethod->name = method->name.data;
- proxyMethod->statements = new StatementBlock;
- proxyClass->elements.push_back(proxyMethod);
-
- // The local variables
- Variable* _data = new Variable(RPC_DATA_TYPE, "_data");
- proxyMethod->statements->Add(new VariableDeclaration(_data, new NewExpression(RPC_DATA_TYPE)));
-
- // Add the arguments
- arg = method->args;
- while (arg != NULL) {
- if (convert_direction(arg->direction.data) & IN_PARAMETER) {
- // Function signature
- Type* t = NAMES.Search(arg->type.type.data);
- Variable* v = new Variable(t, arg->name.data, arg->type.dimension);
- proxyMethod->parameters.push_back(v);
-
- // Input parameter marshalling
- generate_write_to_data(t, proxyMethod->statements,
- new StringLiteralExpression(arg->name.data), v, _data);
- }
- arg = arg->next;
- }
-
- // If there is a results interface for this class
- Expression* resultParameter;
- if (resultsInterfaceType != NULL) {
- // Result interface parameter
- Variable* resultListener = new Variable(resultsInterfaceType, "_result");
- proxyMethod->parameters.push_back(resultListener);
-
- // Add the results dispatcher callback
- resultsDispatcherClass->needed = true;
- resultParameter = new NewExpression(resultsDispatcherClass->type, 2,
- new LiteralExpression(format_int(index)), resultListener);
- } else {
- resultParameter = NULL_VALUE;
- }
-
- // All proxy methods take an error parameter
- Variable* errorListener = new Variable(RPC_ERROR_LISTENER_TYPE, "_errors");
- proxyMethod->parameters.push_back(errorListener);
-
- // Call the broker
- proxyMethod->statements->Add(new MethodCall(new FieldVariable(THIS_VALUE, "_broker"),
- "sendRpc", 5,
- proxyClass->endpoint,
- new StringLiteralExpression(method->name.data),
- new MethodCall(_data, "serialize"),
- resultParameter,
- errorListener));
-}
-
-static void
-generate_result_dispatcher_method(const method_type* method,
- ResultDispatcherClass* resultsDispatcherClass, Type* resultsInterfaceType, int index)
-{
- arg_type* arg;
- Method* dispatchMethod;
- Variable* dispatchParam;
- resultsDispatcherClass->AddMethod(index, method->name.data, &dispatchMethod, &dispatchParam);
-
- Variable* classLoader = NULL;
- Variable* resultData = new Variable(RPC_DATA_TYPE, "resultData");
- dispatchMethod->statements->Add(new VariableDeclaration(resultData,
- new NewExpression(RPC_DATA_TYPE, 1, dispatchParam)));
-
- // The callback method itself
- MethodCall* realCall = new MethodCall(
- new Cast(resultsInterfaceType, new FieldVariable(THIS_VALUE, "callback")),
- results_method_name(method->name.data));
-
- // The return value
- {
- Type* t = NAMES.Search(method->type.type.data);
- if (t != VOID_TYPE) {
- Variable* rv = new Variable(t, "rv");
- dispatchMethod->statements->Add(new VariableDeclaration(rv));
- generate_create_from_data(t, dispatchMethod->statements, "_result", rv,
- resultData, &classLoader);
- realCall->arguments.push_back(rv);
- }
- }
-
- VariableFactory stubArgs("arg");
- arg = method->args;
- while (arg != NULL) {
- if (convert_direction(arg->direction.data) & OUT_PARAMETER) {
- // Unmarshall the results
- Type* t = NAMES.Search(arg->type.type.data);
- Variable* v = stubArgs.Get(t);
- dispatchMethod->statements->Add(new VariableDeclaration(v));
-
- generate_create_from_data(t, dispatchMethod->statements, arg->name.data, v,
- resultData, &classLoader);
-
- // Add the argument to the callback
- realCall->arguments.push_back(v);
- }
- arg = arg->next;
- }
-
- // Call the callback method
- IfStatement* ifst = new IfStatement;
- ifst->expression = new Comparison(new FieldVariable(THIS_VALUE, "callback"), "!=", NULL_VALUE);
- dispatchMethod->statements->Add(ifst);
- ifst->statements->Add(realCall);
-}
-
-static void
-generate_regular_method(const method_type* method, RpcProxyClass* proxyClass,
- EndpointBaseClass* serviceBaseClass, ResultDispatcherClass* resultsDispatcherClass,
- int index)
-{
- arg_type* arg;
-
- // == the callback interface for results ================================
- // the service base class
- Type* resultsInterfaceType = generate_results_method(method, proxyClass);
-
- // == the method in the proxy class =====================================
- generate_proxy_method(method, proxyClass, resultsDispatcherClass, resultsInterfaceType, index);
-
- // == the method in the result dispatcher class =========================
- if (resultsInterfaceType != NULL) {
- generate_result_dispatcher_method(method, resultsDispatcherClass, resultsInterfaceType,
- index);
- }
-
- // == The abstract method that the service developers implement ==========
- Method* decl = new Method;
- decl->comment = gather_comments(method->comments_token->extra);
- decl->modifiers = PUBLIC | ABSTRACT;
- decl->returnType = NAMES.Search(method->type.type.data);
- decl->returnTypeDimension = method->type.dimension;
- decl->name = method->name.data;
- arg = method->args;
- while (arg != NULL) {
- decl->parameters.push_back(new Variable(
- NAMES.Search(arg->type.type.data), arg->name.data,
- arg->type.dimension));
- arg = arg->next;
- }
-
- // Add the default RpcContext param to all methods
- decl->parameters.push_back(new Variable(RPC_CONTEXT_TYPE, "context", 0));
-
- serviceBaseClass->elements.push_back(decl);
-
-
- // == the dispatch method in the service base class ======================
- serviceBaseClass->AddMethod(method);
-}
-
-static void
-generate_event_method(const method_type* method, RpcProxyClass* proxyClass,
- EndpointBaseClass* serviceBaseClass, ListenerClass* listenerClass,
- EventListenerClass* presenterClass, int index)
-{
- arg_type* arg;
- listenerClass->needed = true;
-
- // == the push method in the service base class =========================
- Method* push = new Method;
- push->modifiers = PUBLIC;
- push->name = push_method_name(method->name.data);
- push->statements = new StatementBlock;
- push->returnType = VOID_TYPE;
- serviceBaseClass->elements.push_back(push);
-
- // The local variables
- Variable* _data = new Variable(RPC_DATA_TYPE, "_data");
- push->statements->Add(new VariableDeclaration(_data, new NewExpression(RPC_DATA_TYPE)));
-
- // Add the arguments
- arg = method->args;
- while (arg != NULL) {
- // Function signature
- Type* t = NAMES.Search(arg->type.type.data);
- Variable* v = new Variable(t, arg->name.data, arg->type.dimension);
- push->parameters.push_back(v);
-
- // Input parameter marshalling
- generate_write_to_data(t, push->statements,
- new StringLiteralExpression(arg->name.data), v, _data);
-
- arg = arg->next;
- }
-
- // Send the notifications
- push->statements->Add(new MethodCall("pushEvent", 2,
- new StringLiteralExpression(method->name.data),
- new MethodCall(_data, "serialize")));
-
- // == the event callback dispatcher method ====================================
- presenterClass->AddMethod(method);
-
- // == the event method in the listener base class =====================
- Method* event = new Method;
- event->modifiers = PUBLIC;
- event->name = method->name.data;
- event->statements = new StatementBlock;
- event->returnType = VOID_TYPE;
- listenerClass->elements.push_back(event);
- arg = method->args;
- while (arg != NULL) {
- event->parameters.push_back(new Variable(
- NAMES.Search(arg->type.type.data), arg->name.data,
- arg->type.dimension));
- arg = arg->next;
- }
-
- // Add a final parameter: RpcContext. Contains data about
- // incoming request (e.g., certificate)
- event->parameters.push_back(new Variable(RPC_CONTEXT_TYPE, "context", 0));
-}
-
-static void
-generate_listener_methods(RpcProxyClass* proxyClass, Type* presenterType, Type* listenerType)
-{
- // AndroidAtHomePresenter _presenter;
- // void startListening(Listener listener) {
- // stopListening();
- // _presenter = new Presenter(_broker, listener);
- // _presenter.startListening(_endpoint);
- // }
- // void stopListening() {
- // if (_presenter != null) {
- // _presenter.stopListening();
- // }
- // }
-
- Variable* _presenter = new Variable(presenterType, "_presenter");
- proxyClass->elements.push_back(new Field(PRIVATE, _presenter));
-
- Variable* listener = new Variable(listenerType, "listener");
-
- Method* startListeningMethod = new Method;
- startListeningMethod->modifiers = PUBLIC;
- startListeningMethod->returnType = VOID_TYPE;
- startListeningMethod->name = "startListening";
- startListeningMethod->statements = new StatementBlock;
- startListeningMethod->parameters.push_back(listener);
- proxyClass->elements.push_back(startListeningMethod);
-
- startListeningMethod->statements->Add(new MethodCall(THIS_VALUE, "stopListening"));
- startListeningMethod->statements->Add(new Assignment(_presenter,
- new NewExpression(presenterType, 2, proxyClass->broker, listener)));
- startListeningMethod->statements->Add(new MethodCall(_presenter,
- "startListening", 1, proxyClass->endpoint));
-
- Method* stopListeningMethod = new Method;
- stopListeningMethod->modifiers = PUBLIC;
- stopListeningMethod->returnType = VOID_TYPE;
- stopListeningMethod->name = "stopListening";
- stopListeningMethod->statements = new StatementBlock;
- proxyClass->elements.push_back(stopListeningMethod);
-
- IfStatement* ifst = new IfStatement;
- ifst->expression = new Comparison(_presenter, "!=", NULL_VALUE);
- stopListeningMethod->statements->Add(ifst);
-
- ifst->statements->Add(new MethodCall(_presenter, "stopListening"));
- ifst->statements->Add(new Assignment(_presenter, NULL_VALUE));
-}
-
-Class*
-generate_rpc_interface_class(const interface_type* iface)
-{
- // the proxy class
- InterfaceType* interfaceType = static_cast<InterfaceType*>(
- NAMES.Find(iface->package, iface->name.data));
- RpcProxyClass* proxy = new RpcProxyClass(iface, interfaceType);
-
- // the listener class
- ListenerClass* listener = new ListenerClass(iface);
-
- // the presenter class
- EventListenerClass* presenter = new EventListenerClass(iface, listener->type);
-
- // the service base class
- EndpointBaseClass* base = new EndpointBaseClass(iface);
- proxy->elements.push_back(base);
-
- // the result dispatcher
- ResultDispatcherClass* results = new ResultDispatcherClass();
-
- // all the declared methods of the proxy
- int index = 0;
- interface_item_type* item = iface->interface_items;
- while (item != NULL) {
- if (item->item_type == METHOD_TYPE) {
- if (NAMES.Search(((method_type*)item)->type.type.data) == EVENT_FAKE_TYPE) {
- generate_event_method((method_type*)item, proxy, base, listener, presenter, index);
- } else {
- generate_regular_method((method_type*)item, proxy, base, results, index);
- }
- }
- item = item->next;
- index++;
- }
- presenter->DoneWithMethods();
- base->DoneWithMethods();
-
- // only add this if there are methods with results / out parameters
- if (results->needed) {
- proxy->elements.push_back(results);
- }
- if (listener->needed) {
- proxy->elements.push_back(listener);
- proxy->elements.push_back(presenter);
- generate_listener_methods(proxy, presenter->type, listener->type);
- }
-
- return proxy;
-}
diff --git a/tools/aidl/options.cpp b/tools/aidl/options.cpp
deleted file mode 100644
index 7b2daeb..0000000
--- a/tools/aidl/options.cpp
+++ /dev/null
@@ -1,154 +0,0 @@
-
-#include "options.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-static int
-usage()
-{
- fprintf(stderr,
- "usage: aidl OPTIONS INPUT [OUTPUT]\n"
- " aidl --preprocess OUTPUT INPUT...\n"
- "\n"
- "OPTIONS:\n"
- " -I<DIR> search path for import statements.\n"
- " -d<FILE> generate dependency file.\n"
- " -a generate dependency file next to the output file with the name based on the input file.\n"
- " -p<FILE> file created by --preprocess to import.\n"
- " -o<FOLDER> base output folder for generated files.\n"
- " -b fail when trying to compile a parcelable.\n"
- "\n"
- "INPUT:\n"
- " An aidl interface file.\n"
- "\n"
- "OUTPUT:\n"
- " The generated interface files.\n"
- " If omitted and the -o option is not used, the input filename is used, with the .aidl extension changed to a .java extension.\n"
- " If the -o option is used, the generated files will be placed in the base output folder, under their package folder\n"
- );
- return 1;
-}
-
-int
-parse_options(int argc, const char* const* argv, Options *options)
-{
- int i = 1;
-
- if (argc >= 2 && 0 == strcmp(argv[1], "--preprocess")) {
- if (argc < 4) {
- return usage();
- }
- options->outputFileName = argv[2];
- for (int i=3; i<argc; i++) {
- options->filesToPreprocess.push_back(argv[i]);
- }
- options->task = PREPROCESS_AIDL;
- return 0;
- }
-
- options->task = COMPILE_AIDL;
- options->failOnParcelable = false;
- options->autoDepFile = false;
-
- // OPTIONS
- while (i < argc) {
- const char* s = argv[i];
- int len = strlen(s);
- if (s[0] == '-') {
- if (len > 1) {
- // -I<system-import-path>
- if (s[1] == 'I') {
- if (len > 2) {
- options->importPaths.push_back(s+2);
- } else {
- fprintf(stderr, "-I option (%d) requires a path.\n", i);
- return usage();
- }
- }
- else if (s[1] == 'd') {
- if (len > 2) {
- options->depFileName = s+2;
- } else {
- fprintf(stderr, "-d option (%d) requires a file.\n", i);
- return usage();
- }
- }
- else if (s[1] == 'a') {
- options->autoDepFile = true;
- }
- else if (s[1] == 'p') {
- if (len > 2) {
- options->preprocessedFiles.push_back(s+2);
- } else {
- fprintf(stderr, "-p option (%d) requires a file.\n", i);
- return usage();
- }
- }
- else if (s[1] == 'o') {
- if (len > 2) {
- options->outputBaseFolder = s+2;
- } else {
- fprintf(stderr, "-o option (%d) requires a path.\n", i);
- return usage();
- }
- }
- else if (len == 2 && s[1] == 'b') {
- options->failOnParcelable = true;
- }
- else {
- // s[1] is not known
- fprintf(stderr, "unknown option (%d): %s\n", i, s);
- return usage();
- }
- } else {
- // len <= 1
- fprintf(stderr, "unknown option (%d): %s\n", i, s);
- return usage();
- }
- } else {
- // s[0] != '-'
- break;
- }
- i++;
- }
-
- // INPUT
- if (i < argc) {
- options->inputFileName = argv[i];
- i++;
- } else {
- fprintf(stderr, "INPUT required\n");
- return usage();
- }
-
- // OUTPUT
- if (i < argc) {
- options->outputFileName = argv[i];
- i++;
- } else if (options->outputBaseFolder.length() == 0) {
- // copy input into output and change the extension from .aidl to .java
- options->outputFileName = options->inputFileName;
- string::size_type pos = options->outputFileName.size()-5;
- if (options->outputFileName.compare(pos, 5, ".aidl") == 0) { // 5 = strlen(".aidl")
- options->outputFileName.replace(pos, 5, ".java"); // 5 = strlen(".aidl")
- } else {
- fprintf(stderr, "INPUT is not an .aidl file.\n");
- return usage();
- }
- }
-
- // anything remaining?
- if (i != argc) {
- fprintf(stderr, "unknown option%s:", (i==argc-1?(const char*)"":(const char*)"s"));
- for (; i<argc-1; i++) {
- fprintf(stderr, " %s", argv[i]);
- }
- fprintf(stderr, "\n");
- return usage();
- }
-
- return 0;
-}
-
diff --git a/tools/aidl/options.h b/tools/aidl/options.h
deleted file mode 100644
index 387e37d..0000000
--- a/tools/aidl/options.h
+++ /dev/null
@@ -1,36 +0,0 @@
-#ifndef DEVICE_TOOLS_AIDL_H
-#define DEVICE_TOOLS_AIDL_H
-
-#include <string.h>
-#include <string>
-#include <vector>
-
-using namespace std;
-
-enum {
- COMPILE_AIDL,
- PREPROCESS_AIDL
-};
-
-// This struct is the parsed version of the command line options
-struct Options
-{
- int task;
- bool failOnParcelable;
- vector<string> importPaths;
- vector<string> preprocessedFiles;
- string inputFileName;
- string outputFileName;
- string outputBaseFolder;
- string depFileName;
- bool autoDepFile;
-
- vector<string> filesToPreprocess;
-};
-
-// takes the inputs from the command line and fills in the Options struct
-// Returns 0 on success, and nonzero on failure.
-// It also prints the usage statement on failure.
-int parse_options(int argc, const char* const* argv, Options *options);
-
-#endif // DEVICE_TOOLS_AIDL_H
diff --git a/tools/aidl/options_test.cpp b/tools/aidl/options_test.cpp
deleted file mode 100644
index bd106ce..0000000
--- a/tools/aidl/options_test.cpp
+++ /dev/null
@@ -1,291 +0,0 @@
-#include <iostream>
-#include "options.h"
-
-const bool VERBOSE = false;
-
-using namespace std;
-
-struct Answer {
- const char* argv[8];
- int result;
- const char* systemSearchPath[8];
- const char* localSearchPath[8];
- const char* inputFileName;
- language_t nativeLanguage;
- const char* outputH;
- const char* outputCPP;
- const char* outputJava;
-};
-
-bool
-match_arrays(const char* const*expected, const vector<string> &got)
-{
- int count = 0;
- while (expected[count] != NULL) {
- count++;
- }
- if (got.size() != count) {
- return false;
- }
- for (int i=0; i<count; i++) {
- if (got[i] != expected[i]) {
- return false;
- }
- }
- return true;
-}
-
-void
-print_array(const char* prefix, const char* const*expected)
-{
- while (*expected) {
- cout << prefix << *expected << endl;
- expected++;
- }
-}
-
-void
-print_array(const char* prefix, const vector<string> &got)
-{
- size_t count = got.size();
- for (size_t i=0; i<count; i++) {
- cout << prefix << got[i] << endl;
- }
-}
-
-static int
-test(const Answer& answer)
-{
- int argc = 0;
- while (answer.argv[argc]) {
- argc++;
- }
-
- int err = 0;
-
- Options options;
- int result = parse_options(argc, answer.argv, &options);
-
- // result
- if (((bool)result) != ((bool)answer.result)) {
- cout << "mismatch: result: got " << result << " expected " <<
- answer.result << endl;
- err = 1;
- }
-
- if (result != 0) {
- // if it failed, everything is invalid
- return err;
- }
-
- // systemSearchPath
- if (!match_arrays(answer.systemSearchPath, options.systemSearchPath)) {
- cout << "mismatch: systemSearchPath: got" << endl;
- print_array(" ", options.systemSearchPath);
- cout << " expected" << endl;
- print_array(" ", answer.systemSearchPath);
- err = 1;
- }
-
- // localSearchPath
- if (!match_arrays(answer.localSearchPath, options.localSearchPath)) {
- cout << "mismatch: localSearchPath: got" << endl;
- print_array(" ", options.localSearchPath);
- cout << " expected" << endl;
- print_array(" ", answer.localSearchPath);
- err = 1;
- }
-
- // inputFileName
- if (answer.inputFileName != options.inputFileName) {
- cout << "mismatch: inputFileName: got " << options.inputFileName
- << " expected " << answer.inputFileName << endl;
- err = 1;
- }
-
- // nativeLanguage
- if (answer.nativeLanguage != options.nativeLanguage) {
- cout << "mismatch: nativeLanguage: got " << options.nativeLanguage
- << " expected " << answer.nativeLanguage << endl;
- err = 1;
- }
-
- // outputH
- if (answer.outputH != options.outputH) {
- cout << "mismatch: outputH: got " << options.outputH
- << " expected " << answer.outputH << endl;
- err = 1;
- }
-
- // outputCPP
- if (answer.outputCPP != options.outputCPP) {
- cout << "mismatch: outputCPP: got " << options.outputCPP
- << " expected " << answer.outputCPP << endl;
- err = 1;
- }
-
- // outputJava
- if (answer.outputJava != options.outputJava) {
- cout << "mismatch: outputJava: got " << options.outputJava
- << " expected " << answer.outputJava << endl;
- err = 1;
- }
-
- return err;
-}
-
-const Answer g_tests[] = {
-
- {
- /* argv */ { "test", "-i/moof", "-I/blah", "-Ibleh", "-imoo", "inputFileName.aidl_cpp", NULL, NULL },
- /* result */ 0,
- /* systemSearchPath */ { "/blah", "bleh", NULL, NULL, NULL, NULL, NULL, NULL },
- /* localSearchPath */ { "/moof", "moo", NULL, NULL, NULL, NULL, NULL, NULL },
- /* inputFileName */ "inputFileName.aidl_cpp",
- /* nativeLanguage */ CPP,
- /* outputH */ "",
- /* outputCPP */ "",
- /* outputJava */ ""
- },
-
- {
- /* argv */ { "test", "inputFileName.aidl_cpp", "-oh", "outputH", NULL, NULL, NULL, NULL },
- /* result */ 0,
- /* systemSearchPath */ { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL },
- /* localSearchPath */ { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL },
- /* inputFileName */ "inputFileName.aidl_cpp",
- /* nativeLanguage */ CPP,
- /* outputH */ "outputH",
- /* outputCPP */ "",
- /* outputJava */ ""
- },
-
- {
- /* argv */ { "test", "inputFileName.aidl_cpp", "-ocpp", "outputCPP", NULL, NULL, NULL, NULL },
- /* result */ 0,
- /* systemSearchPath */ { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL },
- /* localSearchPath */ { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL },
- /* inputFileName */ "inputFileName.aidl_cpp",
- /* nativeLanguage */ CPP,
- /* outputH */ "",
- /* outputCPP */ "outputCPP",
- /* outputJava */ ""
- },
-
- {
- /* argv */ { "test", "inputFileName.aidl_cpp", "-ojava", "outputJava", NULL, NULL, NULL, NULL },
- /* result */ 0,
- /* systemSearchPath */ { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL },
- /* localSearchPath */ { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL },
- /* inputFileName */ "inputFileName.aidl_cpp",
- /* nativeLanguage */ CPP,
- /* outputH */ "",
- /* outputCPP */ "",
- /* outputJava */ "outputJava"
- },
-
- {
- /* argv */ { "test", "inputFileName.aidl_cpp", "-oh", "outputH", "-ocpp", "outputCPP", "-ojava", "outputJava" },
- /* result */ 0,
- /* systemSearchPath */ { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL },
- /* localSearchPath */ { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL },
- /* inputFileName */ "inputFileName.aidl_cpp",
- /* nativeLanguage */ CPP,
- /* outputH */ "outputH",
- /* outputCPP */ "outputCPP",
- /* outputJava */ "outputJava"
- },
-
- {
- /* argv */ { "test", "inputFileName.aidl_cpp", "-oh", "outputH", "-oh", "outputH1", NULL, NULL },
- /* result */ 1,
- /* systemSearchPath */ { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL },
- /* localSearchPath */ { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL },
- /* inputFileName */ "",
- /* nativeLanguage */ CPP,
- /* outputH */ "",
- /* outputCPP */ "",
- /* outputJava */ ""
- },
-
- {
- /* argv */ { "test", "inputFileName.aidl_cpp", "-ocpp", "outputCPP", "-ocpp", "outputCPP1", NULL, NULL },
- /* result */ 1,
- /* systemSearchPath */ { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL },
- /* localSearchPath */ { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL },
- /* inputFileName */ "",
- /* nativeLanguage */ CPP,
- /* outputH */ "",
- /* outputCPP */ "",
- /* outputJava */ ""
- },
-
- {
- /* argv */ { "test", "inputFileName.aidl_cpp", "-ojava", "outputJava", "-ojava", "outputJava1", NULL, NULL },
- /* result */ 1,
- /* systemSearchPath */ { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL },
- /* localSearchPath */ { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL },
- /* inputFileName */ "",
- /* nativeLanguage */ CPP,
- /* outputH */ "",
- /* outputCPP */ "",
- /* outputJava */ ""
- },
-
-};
-
-int
-main(int argc, const char** argv)
-{
- const int count = sizeof(g_tests)/sizeof(g_tests[0]);
- int matches[count];
-
- int result = 0;
- for (int i=0; i<count; i++) {
- if (VERBOSE) {
- cout << endl;
- cout << "---------------------------------------------" << endl;
- const char* const* p = g_tests[i].argv;
- while (*p) {
- cout << " " << *p;
- p++;
- }
- cout << endl;
- cout << "---------------------------------------------" << endl;
- }
- matches[i] = test(g_tests[i]);
- if (VERBOSE) {
- if (0 == matches[i]) {
- cout << "passed" << endl;
- } else {
- cout << "failed" << endl;
- }
- result |= matches[i];
- }
- }
-
- cout << endl;
- cout << "=============================================" << endl;
- cout << "options_test summary" << endl;
- cout << "=============================================" << endl;
-
- if (!result) {
- cout << "passed" << endl;
- } else {
- cout << "failed the following tests:" << endl;
- for (int i=0; i<count; i++) {
- if (matches[i]) {
- cout << " ";
- const char* const* p = g_tests[i].argv;
- while (*p) {
- cout << " " << *p;
- p++;
- }
- cout << endl;
- }
- }
- }
-
- return result;
-}
-
diff --git a/tools/aidl/search_path.cpp b/tools/aidl/search_path.cpp
deleted file mode 100644
index ffb6cb2..0000000
--- a/tools/aidl/search_path.cpp
+++ /dev/null
@@ -1,57 +0,0 @@
-#include <unistd.h>
-#include "search_path.h"
-#include "options.h"
-#include <string.h>
-
-#ifdef HAVE_MS_C_RUNTIME
-#include <io.h>
-#endif
-
-static vector<string> g_importPaths;
-
-void
-set_import_paths(const vector<string>& importPaths)
-{
- g_importPaths = importPaths;
-}
-
-char*
-find_import_file(const char* given)
-{
- string expected = given;
-
- int N = expected.length();
- for (int i=0; i<N; i++) {
- char c = expected[i];
- if (c == '.') {
- expected[i] = OS_PATH_SEPARATOR;
- }
- }
- expected += ".aidl";
-
- vector<string>& paths = g_importPaths;
- for (vector<string>::iterator it=paths.begin(); it!=paths.end(); it++) {
- string f = *it;
- if (f.size() == 0) {
- f = ".";
- f += OS_PATH_SEPARATOR;
- }
- else if (f[f.size()-1] != OS_PATH_SEPARATOR) {
- f += OS_PATH_SEPARATOR;
- }
- f.append(expected);
-
-#ifdef HAVE_MS_C_RUNTIME
- /* check that the file exists and is not write-only */
- if (0 == _access(f.c_str(), 0) && /* mode 0=exist */
- 0 == _access(f.c_str(), 4) ) { /* mode 4=readable */
-#else
- if (0 == access(f.c_str(), R_OK)) {
-#endif
- return strdup(f.c_str());
- }
- }
-
- return NULL;
-}
-
diff --git a/tools/aidl/search_path.h b/tools/aidl/search_path.h
deleted file mode 100644
index 2bf94b1..0000000
--- a/tools/aidl/search_path.h
+++ /dev/null
@@ -1,23 +0,0 @@
-#ifndef DEVICE_TOOLS_AIDL_SEARCH_PATH_H
-#define DEVICE_TOOLS_AIDL_SEARCH_PATH_H
-
-#include <stdio.h>
-
-#if __cplusplus
-#include <vector>
-#include <string>
-using namespace std;
-extern "C" {
-#endif
-
-// returns a FILE* and the char* for the file that it found
-// given is the class name we're looking for
-char* find_import_file(const char* given);
-
-#if __cplusplus
-}; // extern "C"
-void set_import_paths(const vector<string>& importPaths);
-#endif
-
-#endif // DEVICE_TOOLS_AIDL_SEARCH_PATH_H
-
diff --git a/tools/layoutlib/.gitignore b/tools/layoutlib/.gitignore
deleted file mode 100644
index c5e82d7..0000000
--- a/tools/layoutlib/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-bin \ No newline at end of file
diff --git a/tools/layoutlib/Android.mk b/tools/layoutlib/Android.mk
deleted file mode 100644
index 4e73568..0000000
--- a/tools/layoutlib/Android.mk
+++ /dev/null
@@ -1,65 +0,0 @@
-#
-# 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.
-#
-LOCAL_PATH := $(my-dir)
-include $(CLEAR_VARS)
-
-#
-# Define rules to build temp_layoutlib.jar, which contains a subset of
-# the classes in framework.jar. The layoutlib_create tool is used to
-# transform the framework jar into the temp_layoutlib jar.
-#
-
-# We need to process the framework classes.jar file, but we can't
-# depend directly on it (private vars won't be inherited correctly).
-# So, we depend on framework's BUILT file.
-built_framework_dep := $(call java-lib-deps,framework-base)
-built_framework_classes := $(call java-lib-files,framework-base)
-
-built_core_dep := $(call java-lib-deps,core)
-built_core_classes := $(call java-lib-files,core)
-
-built_layoutlib_create_jar := $(call intermediates-dir-for, \
- JAVA_LIBRARIES,layoutlib_create,HOST)/javalib.jar
-
-# This is mostly a copy of config/host_java_library.mk
-LOCAL_MODULE := temp_layoutlib
-LOCAL_MODULE_CLASS := JAVA_LIBRARIES
-LOCAL_MODULE_SUFFIX := $(COMMON_JAVA_PACKAGE_SUFFIX)
-LOCAL_IS_HOST_MODULE := true
-LOCAL_BUILT_MODULE_STEM := javalib.jar
-
-#######################################
-include $(BUILD_SYSTEM)/base_rules.mk
-#######################################
-
-$(LOCAL_BUILT_MODULE): $(built_core_dep) \
- $(built_framework_dep) \
- $(built_layoutlib_create_jar)
- $(hide) echo "host layoutlib_create: $@"
- $(hide) mkdir -p $(dir $@)
- $(hide) rm -f $@
- $(hide) ls -l $(built_framework_classes)
- $(hide) java -jar $(built_layoutlib_create_jar) \
- $@ \
- $(built_core_classes) \
- $(built_framework_classes)
- $(hide) ls -l $(built_framework_classes)
-
-
-#
-# Include the subdir makefiles.
-#
-include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/tools/layoutlib/README b/tools/layoutlib/README
deleted file mode 100644
index 0fea9bd..0000000
--- a/tools/layoutlib/README
+++ /dev/null
@@ -1,4 +0,0 @@
-Layoutlib is a custom version of the android View framework designed to run inside Eclipse.
-The goal of the library is to provide layout rendering in Eclipse that are very very close to their rendering on devices.
-
-None of the com.android.* or android.* classes in layoutlib run on devices. \ No newline at end of file
diff --git a/tools/layoutlib/bridge/.classpath b/tools/layoutlib/bridge/.classpath
deleted file mode 100644
index 2e4274d..0000000
--- a/tools/layoutlib/bridge/.classpath
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
- <classpathentry excluding="org/kxml2/io/" kind="src" path="src"/>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
- <classpathentry kind="var" path="ANDROID_PLAT_SRC/prebuilts/misc/common/layoutlib_api/layoutlib_api-prebuilt.jar"/>
- <classpathentry kind="var" path="ANDROID_PLAT_SRC/prebuilts/misc/common/kxml2/kxml2-2.3.0.jar" sourcepath="/ANDROID_PLAT_SRC/dalvik/libcore/xml/src/main/java"/>
- <classpathentry kind="var" path="ANDROID_PLAT_SRC/out/host/common/obj/JAVA_LIBRARIES/temp_layoutlib_intermediates/javalib.jar" sourcepath="/ANDROID_PLAT_SRC/frameworks/base"/>
- <classpathentry kind="var" path="ANDROID_PLAT_SRC/prebuilts/misc/common/ninepatch/ninepatch-prebuilt.jar"/>
- <classpathentry kind="var" path="ANDROID_PLAT_SRC/prebuilts/misc/common/tools-common/tools-common-prebuilt.jar"/>
- <classpathentry kind="var" path="ANDROID_PLAT_SRC/prebuilts/misc/common/icu4j/icu4j.jar"/>
- <classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/tools/layoutlib/bridge/.project b/tools/layoutlib/bridge/.project
deleted file mode 100644
index e36e71b..0000000
--- a/tools/layoutlib/bridge/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
- <name>layoutlib_bridge</name>
- <comment></comment>
- <projects>
- </projects>
- <buildSpec>
- <buildCommand>
- <name>org.eclipse.jdt.core.javabuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
- </buildSpec>
- <natures>
- <nature>org.eclipse.jdt.core.javanature</nature>
- </natures>
-</projectDescription>
diff --git a/tools/layoutlib/bridge/.settings/README.txt b/tools/layoutlib/bridge/.settings/README.txt
deleted file mode 100644
index 9120b20..0000000
--- a/tools/layoutlib/bridge/.settings/README.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-Copy this in eclipse project as a .settings folder at the root.
-This ensure proper compilation compliance and warning/error levels. \ No newline at end of file
diff --git a/tools/layoutlib/bridge/.settings/org.eclipse.jdt.core.prefs b/tools/layoutlib/bridge/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 5381a0e..0000000
--- a/tools/layoutlib/bridge/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,93 +0,0 @@
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.annotation.nonnull=com.android.annotations.NonNull
-org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=com.android.annotations.NonNullByDefault
-org.eclipse.jdt.core.compiler.annotation.nonnullisdefault=disabled
-org.eclipse.jdt.core.compiler.annotation.nullable=com.android.annotations.Nullable
-org.eclipse.jdt.core.compiler.annotation.nullanalysis=enabled
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.6
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
-org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
-org.eclipse.jdt.core.compiler.problem.deadCode=warning
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=enabled
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=warning
-org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=warning
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=error
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
-org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
-org.eclipse.jdt.core.compiler.problem.nullReference=error
-org.eclipse.jdt.core.compiler.problem.nullSpecInsufficientInfo=warning
-org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
-org.eclipse.jdt.core.compiler.problem.potentialNullSpecViolation=error
-org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=warning
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning
-org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
-org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
-org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.unclosedCloseable=error
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=warning
-org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
-org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
-org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.6
diff --git a/tools/layoutlib/bridge/Android.mk b/tools/layoutlib/bridge/Android.mk
deleted file mode 100644
index e3d48fc..0000000
--- a/tools/layoutlib/bridge/Android.mk
+++ /dev/null
@@ -1,39 +0,0 @@
-#
-# 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.
-#
-LOCAL_PATH := $(call my-dir)
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := $(call all-java-files-under,src)
-LOCAL_JAVA_RESOURCE_DIRS := resources
-
-
-LOCAL_JAVA_LIBRARIES := \
- kxml2-2.3.0 \
- icu4j \
- layoutlib_api-prebuilt \
- tools-common-prebuilt
-
-LOCAL_STATIC_JAVA_LIBRARIES := \
- temp_layoutlib \
- ninepatch-prebuilt
-
-LOCAL_MODULE := layoutlib
-
-include $(BUILD_HOST_JAVA_LIBRARY)
-
-# Build all sub-directories
-include $(call all-makefiles-under,$(LOCAL_PATH))
-
diff --git a/tools/layoutlib/bridge/resources/bars/action_bar.xml b/tools/layoutlib/bridge/resources/bars/action_bar.xml
deleted file mode 100644
index 7adc5af..0000000
--- a/tools/layoutlib/bridge/resources/bars/action_bar.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<merge xmlns:android="http://schemas.android.com/apk/res/android">
- <include layout="@android:layout/action_bar_home" />
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"/>
-</merge>
diff --git a/tools/layoutlib/bridge/resources/bars/hdpi/ic_sysbar_back.png b/tools/layoutlib/bridge/resources/bars/hdpi/ic_sysbar_back.png
deleted file mode 100644
index 84e6bc8..0000000
--- a/tools/layoutlib/bridge/resources/bars/hdpi/ic_sysbar_back.png
+++ /dev/null
Binary files differ
diff --git a/tools/layoutlib/bridge/resources/bars/hdpi/ic_sysbar_home.png b/tools/layoutlib/bridge/resources/bars/hdpi/ic_sysbar_home.png
deleted file mode 100644
index 38e4f45..0000000
--- a/tools/layoutlib/bridge/resources/bars/hdpi/ic_sysbar_home.png
+++ /dev/null
Binary files differ
diff --git a/tools/layoutlib/bridge/resources/bars/hdpi/ic_sysbar_recent.png b/tools/layoutlib/bridge/resources/bars/hdpi/ic_sysbar_recent.png
deleted file mode 100644
index bf9f300..0000000
--- a/tools/layoutlib/bridge/resources/bars/hdpi/ic_sysbar_recent.png
+++ /dev/null
Binary files differ
diff --git a/tools/layoutlib/bridge/resources/bars/hdpi/stat_sys_battery_charge_anim100.png b/tools/layoutlib/bridge/resources/bars/hdpi/stat_sys_battery_charge_anim100.png
deleted file mode 100644
index 829378e..0000000
--- a/tools/layoutlib/bridge/resources/bars/hdpi/stat_sys_battery_charge_anim100.png
+++ /dev/null
Binary files differ
diff --git a/tools/layoutlib/bridge/resources/bars/hdpi/stat_sys_wifi_signal_4_fully.png b/tools/layoutlib/bridge/resources/bars/hdpi/stat_sys_wifi_signal_4_fully.png
deleted file mode 100644
index 931daed..0000000
--- a/tools/layoutlib/bridge/resources/bars/hdpi/stat_sys_wifi_signal_4_fully.png
+++ /dev/null
Binary files differ
diff --git a/tools/layoutlib/bridge/resources/bars/hdpi/status_bar_background.9.png b/tools/layoutlib/bridge/resources/bars/hdpi/status_bar_background.9.png
deleted file mode 100644
index a4be298..0000000
--- a/tools/layoutlib/bridge/resources/bars/hdpi/status_bar_background.9.png
+++ /dev/null
Binary files differ
diff --git a/tools/layoutlib/bridge/resources/bars/ldrtl-hdpi/ic_sysbar_back.png b/tools/layoutlib/bridge/resources/bars/ldrtl-hdpi/ic_sysbar_back.png
deleted file mode 100644
index 782ebfe..0000000
--- a/tools/layoutlib/bridge/resources/bars/ldrtl-hdpi/ic_sysbar_back.png
+++ /dev/null
Binary files differ
diff --git a/tools/layoutlib/bridge/resources/bars/ldrtl-hdpi/ic_sysbar_recent.png b/tools/layoutlib/bridge/resources/bars/ldrtl-hdpi/ic_sysbar_recent.png
deleted file mode 100644
index 677b471..0000000
--- a/tools/layoutlib/bridge/resources/bars/ldrtl-hdpi/ic_sysbar_recent.png
+++ /dev/null
Binary files differ
diff --git a/tools/layoutlib/bridge/resources/bars/ldrtl-mdpi/ic_sysbar_back.png b/tools/layoutlib/bridge/resources/bars/ldrtl-mdpi/ic_sysbar_back.png
deleted file mode 100644
index a1b8062..0000000
--- a/tools/layoutlib/bridge/resources/bars/ldrtl-mdpi/ic_sysbar_back.png
+++ /dev/null
Binary files differ
diff --git a/tools/layoutlib/bridge/resources/bars/ldrtl-mdpi/ic_sysbar_recent.png b/tools/layoutlib/bridge/resources/bars/ldrtl-mdpi/ic_sysbar_recent.png
deleted file mode 100644
index fcdbefe..0000000
--- a/tools/layoutlib/bridge/resources/bars/ldrtl-mdpi/ic_sysbar_recent.png
+++ /dev/null
Binary files differ
diff --git a/tools/layoutlib/bridge/resources/bars/ldrtl-xhdpi/ic_sysbar_back.png b/tools/layoutlib/bridge/resources/bars/ldrtl-xhdpi/ic_sysbar_back.png
deleted file mode 100644
index 633d864..0000000
--- a/tools/layoutlib/bridge/resources/bars/ldrtl-xhdpi/ic_sysbar_back.png
+++ /dev/null
Binary files differ
diff --git a/tools/layoutlib/bridge/resources/bars/ldrtl-xhdpi/ic_sysbar_recent.png b/tools/layoutlib/bridge/resources/bars/ldrtl-xhdpi/ic_sysbar_recent.png
deleted file mode 100644
index 4665e2a..0000000
--- a/tools/layoutlib/bridge/resources/bars/ldrtl-xhdpi/ic_sysbar_recent.png
+++ /dev/null
Binary files differ
diff --git a/tools/layoutlib/bridge/resources/bars/mdpi/ic_sysbar_back.png b/tools/layoutlib/bridge/resources/bars/mdpi/ic_sysbar_back.png
deleted file mode 100644
index a00bc5b..0000000
--- a/tools/layoutlib/bridge/resources/bars/mdpi/ic_sysbar_back.png
+++ /dev/null
Binary files differ
diff --git a/tools/layoutlib/bridge/resources/bars/mdpi/ic_sysbar_home.png b/tools/layoutlib/bridge/resources/bars/mdpi/ic_sysbar_home.png
deleted file mode 100644
index dc3183b..0000000
--- a/tools/layoutlib/bridge/resources/bars/mdpi/ic_sysbar_home.png
+++ /dev/null
Binary files differ
diff --git a/tools/layoutlib/bridge/resources/bars/mdpi/ic_sysbar_recent.png b/tools/layoutlib/bridge/resources/bars/mdpi/ic_sysbar_recent.png
deleted file mode 100644
index b07f611..0000000
--- a/tools/layoutlib/bridge/resources/bars/mdpi/ic_sysbar_recent.png
+++ /dev/null
Binary files differ
diff --git a/tools/layoutlib/bridge/resources/bars/mdpi/stat_sys_battery_charge_anim100.png b/tools/layoutlib/bridge/resources/bars/mdpi/stat_sys_battery_charge_anim100.png
deleted file mode 100644
index 2773a70..0000000
--- a/tools/layoutlib/bridge/resources/bars/mdpi/stat_sys_battery_charge_anim100.png
+++ /dev/null
Binary files differ
diff --git a/tools/layoutlib/bridge/resources/bars/mdpi/stat_sys_wifi_signal_4_fully.png b/tools/layoutlib/bridge/resources/bars/mdpi/stat_sys_wifi_signal_4_fully.png
deleted file mode 100644
index 6e1ac91..0000000
--- a/tools/layoutlib/bridge/resources/bars/mdpi/stat_sys_wifi_signal_4_fully.png
+++ /dev/null
Binary files differ
diff --git a/tools/layoutlib/bridge/resources/bars/mdpi/status_bar_background.9.png b/tools/layoutlib/bridge/resources/bars/mdpi/status_bar_background.9.png
deleted file mode 100644
index eb7c1a4..0000000
--- a/tools/layoutlib/bridge/resources/bars/mdpi/status_bar_background.9.png
+++ /dev/null
Binary files differ
diff --git a/tools/layoutlib/bridge/resources/bars/navigation_bar.xml b/tools/layoutlib/bridge/resources/bars/navigation_bar.xml
deleted file mode 100644
index 599ca08..0000000
--- a/tools/layoutlib/bridge/resources/bars/navigation_bar.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<merge xmlns:android="http://schemas.android.com/apk/res/android">
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_weight="1"/>
- <ImageView
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"/>
- <ImageView
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"/>
- <ImageView
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"/>
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_weight="1"/>
-</merge>
diff --git a/tools/layoutlib/bridge/resources/bars/status_bar.xml b/tools/layoutlib/bridge/resources/bars/status_bar.xml
deleted file mode 100644
index 51b474d..0000000
--- a/tools/layoutlib/bridge/resources/bars/status_bar.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<merge xmlns:android="http://schemas.android.com/apk/res/android">
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_weight="1"/>
- <ImageView
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:layout_marginTop="1dp"/>
- <ImageView
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:layout_marginLeft="3dp"
- android:layout_marginRight="5dp"
- android:layout_marginTop="1dp"/>
-</merge>
diff --git a/tools/layoutlib/bridge/resources/bars/title_bar.xml b/tools/layoutlib/bridge/resources/bars/title_bar.xml
deleted file mode 100644
index 76d78d9..0000000
--- a/tools/layoutlib/bridge/resources/bars/title_bar.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<merge xmlns:android="http://schemas.android.com/apk/res/android">
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"/>
-</merge>
diff --git a/tools/layoutlib/bridge/resources/bars/xhdpi/ic_sysbar_back.png b/tools/layoutlib/bridge/resources/bars/xhdpi/ic_sysbar_back.png
deleted file mode 100644
index bd60cd6..0000000
--- a/tools/layoutlib/bridge/resources/bars/xhdpi/ic_sysbar_back.png
+++ /dev/null
Binary files differ
diff --git a/tools/layoutlib/bridge/resources/bars/xhdpi/ic_sysbar_home.png b/tools/layoutlib/bridge/resources/bars/xhdpi/ic_sysbar_home.png
deleted file mode 100644
index c5bc5c9..0000000
--- a/tools/layoutlib/bridge/resources/bars/xhdpi/ic_sysbar_home.png
+++ /dev/null
Binary files differ
diff --git a/tools/layoutlib/bridge/resources/bars/xhdpi/ic_sysbar_recent.png b/tools/layoutlib/bridge/resources/bars/xhdpi/ic_sysbar_recent.png
deleted file mode 100644
index f621d9c..0000000
--- a/tools/layoutlib/bridge/resources/bars/xhdpi/ic_sysbar_recent.png
+++ /dev/null
Binary files differ
diff --git a/tools/layoutlib/bridge/resources/bars/xhdpi/stat_sys_battery_charge_anim100.png b/tools/layoutlib/bridge/resources/bars/xhdpi/stat_sys_battery_charge_anim100.png
deleted file mode 100644
index c7fd719..0000000
--- a/tools/layoutlib/bridge/resources/bars/xhdpi/stat_sys_battery_charge_anim100.png
+++ /dev/null
Binary files differ
diff --git a/tools/layoutlib/bridge/resources/bars/xhdpi/stat_sys_wifi_signal_4_fully.png b/tools/layoutlib/bridge/resources/bars/xhdpi/stat_sys_wifi_signal_4_fully.png
deleted file mode 100644
index 625c61d..0000000
--- a/tools/layoutlib/bridge/resources/bars/xhdpi/stat_sys_wifi_signal_4_fully.png
+++ /dev/null
Binary files differ
diff --git a/tools/layoutlib/bridge/src/android/animation/AnimationThread.java b/tools/layoutlib/bridge/src/android/animation/AnimationThread.java
deleted file mode 100644
index b10ec9f..0000000
--- a/tools/layoutlib/bridge/src/android/animation/AnimationThread.java
+++ /dev/null
@@ -1,177 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.animation;
-
-import com.android.ide.common.rendering.api.IAnimationListener;
-import com.android.ide.common.rendering.api.RenderSession;
-import com.android.ide.common.rendering.api.Result;
-import com.android.ide.common.rendering.api.Result.Status;
-import com.android.layoutlib.bridge.Bridge;
-import com.android.layoutlib.bridge.impl.RenderSessionImpl;
-
-import android.os.Handler;
-import android.os.Handler_Delegate;
-import android.os.Handler_Delegate.IHandlerCallback;
-import android.os.Message;
-
-import java.util.PriorityQueue;
-import java.util.Queue;
-
-/**
- * Abstract animation thread.
- * <p/>
- * This does not actually start an animation, instead it fakes a looper that will play whatever
- * animation is sending messages to its own {@link Handler}.
- * <p/>
- * Classes should implement {@link #preAnimation()} and {@link #postAnimation()}.
- * <p/>
- * If {@link #preAnimation()} does not start an animation somehow then the thread doesn't do
- * anything.
- *
- */
-public abstract class AnimationThread extends Thread {
-
- private static class MessageBundle implements Comparable<MessageBundle> {
- final Handler mTarget;
- final Message mMessage;
- final long mUptimeMillis;
-
- MessageBundle(Handler target, Message message, long uptimeMillis) {
- mTarget = target;
- mMessage = message;
- mUptimeMillis = uptimeMillis;
- }
-
- @Override
- public int compareTo(MessageBundle bundle) {
- if (mUptimeMillis < bundle.mUptimeMillis) {
- return -1;
- }
- return 1;
- }
- }
-
- private final RenderSessionImpl mSession;
-
- private Queue<MessageBundle> mQueue = new PriorityQueue<MessageBundle>();
- private final IAnimationListener mListener;
-
- public AnimationThread(RenderSessionImpl scene, String threadName,
- IAnimationListener listener) {
- super(threadName);
- mSession = scene;
- mListener = listener;
- }
-
- public abstract Result preAnimation();
- public abstract void postAnimation();
-
- @Override
- public void run() {
- Bridge.prepareThread();
- try {
- /* FIXME: The ANIMATION_FRAME message no longer exists. Instead, the
- * animation timing loop is completely based on a Choreographer objects
- * that schedules animation and drawing frames. The animation handler is
- * no longer even a handler; it is just a Runnable enqueued on the Choreographer.
- Handler_Delegate.setCallback(new IHandlerCallback() {
- @Override
- public void sendMessageAtTime(Handler handler, Message msg, long uptimeMillis) {
- if (msg.what == ValueAnimator.ANIMATION_START ||
- msg.what == ValueAnimator.ANIMATION_FRAME) {
- mQueue.add(new MessageBundle(handler, msg, uptimeMillis));
- } else {
- // just ignore.
- }
- }
- });
- */
-
- // call out to the pre-animation work, which should start an animation or more.
- Result result = preAnimation();
- if (result.isSuccess() == false) {
- mListener.done(result);
- }
-
- // loop the animation
- RenderSession session = mSession.getSession();
- do {
- // check early.
- if (mListener.isCanceled()) {
- break;
- }
-
- // get the next message.
- MessageBundle bundle = mQueue.poll();
- if (bundle == null) {
- break;
- }
-
- // sleep enough for this bundle to be on time
- long currentTime = System.currentTimeMillis();
- if (currentTime < bundle.mUptimeMillis) {
- try {
- sleep(bundle.mUptimeMillis - currentTime);
- } catch (InterruptedException e) {
- // FIXME log/do something/sleep again?
- e.printStackTrace();
- }
- }
-
- // check after sleeping.
- if (mListener.isCanceled()) {
- break;
- }
-
- // ready to do the work, acquire the scene.
- result = mSession.acquire(250);
- if (result.isSuccess() == false) {
- mListener.done(result);
- return;
- }
-
- // process the bundle. If the animation is not finished, this will enqueue
- // the next message, so mQueue will have another one.
- try {
- // check after acquiring in case it took a while.
- if (mListener.isCanceled()) {
- break;
- }
-
- bundle.mTarget.handleMessage(bundle.mMessage);
- if (mSession.render(false /*freshRender*/).isSuccess()) {
- mListener.onNewFrame(session);
- }
- } finally {
- mSession.release();
- }
- } while (mListener.isCanceled() == false && mQueue.size() > 0);
-
- mListener.done(Status.SUCCESS.createResult());
-
- } catch (Throwable throwable) {
- // can't use Bridge.getLog() as the exception might be thrown outside
- // of an acquire/release block.
- mListener.done(Status.ERROR_UNKNOWN.createResult("Error playing animation", throwable));
-
- } finally {
- postAnimation();
- Handler_Delegate.setCallback(null);
- Bridge.cleanupThread();
- }
- }
-}
diff --git a/tools/layoutlib/bridge/src/android/animation/PropertyValuesHolder_Delegate.java b/tools/layoutlib/bridge/src/android/animation/PropertyValuesHolder_Delegate.java
deleted file mode 100644
index 7b444aa..0000000
--- a/tools/layoutlib/bridge/src/android/animation/PropertyValuesHolder_Delegate.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.animation;
-
-import com.android.layoutlib.bridge.impl.DelegateManager;
-import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
-
-/**
- * Delegate implementing the native methods of android.animation.PropertyValuesHolder
- *
- * Through the layoutlib_create tool, the original native methods of PropertyValuesHolder have been
- * replaced by calls to methods of the same name in this delegate class.
- *
- * Because it's a stateless class to start with, there's no need to keep a {@link DelegateManager}
- * around to map int to instance of the delegate.
- *
- * The main goal of this class' methods are to provide a native way to access setters and getters
- * on some object. In this case we want to default to using Java reflection instead so the native
- * methods do nothing.
- *
- */
-/*package*/ class PropertyValuesHolder_Delegate {
-
- @LayoutlibDelegate
- /*package*/ static int nGetIntMethod(Class<?> targetClass, String methodName) {
- // return 0 to force PropertyValuesHolder to use Java reflection.
- return 0;
- }
-
- @LayoutlibDelegate
- /*package*/ static int nGetFloatMethod(Class<?> targetClass, String methodName) {
- // return 0 to force PropertyValuesHolder to use Java reflection.
- return 0;
- }
-
- @LayoutlibDelegate
- /*package*/ static void nCallIntMethod(Object target, int methodID, int arg) {
- // do nothing
- }
-
- @LayoutlibDelegate
- /*package*/ static void nCallFloatMethod(Object target, int methodID, float arg) {
- // do nothing
- }
-}
diff --git a/tools/layoutlib/bridge/src/android/app/Fragment_Delegate.java b/tools/layoutlib/bridge/src/android/app/Fragment_Delegate.java
deleted file mode 100644
index aabd3f1..0000000
--- a/tools/layoutlib/bridge/src/android/app/Fragment_Delegate.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.app;
-
-import com.android.ide.common.rendering.api.IProjectCallback;
-import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
-
-import android.content.Context;
-import android.os.Bundle;
-
-/**
- * Delegate used to provide new implementation of a select few methods of {@link Fragment}
- *
- * Through the layoutlib_create tool, the original methods of Fragment have been replaced
- * by calls to methods of the same name in this delegate class.
- *
- * The methods being re-implemented are the ones responsible for instantiating Fragment objects.
- * Because the classes of these objects are found in the project, these methods need access to
- * {@link IProjectCallback} object. They are however static methods, so the callback is set
- * before the inflation through {@link #setProjectCallback(IProjectCallback)}.
- */
-public class Fragment_Delegate {
-
- private static IProjectCallback sProjectCallback;
-
- /**
- * Sets the current {@link IProjectCallback} to be used to instantiate classes coming
- * from the project being rendered.
- */
- public static void setProjectCallback(IProjectCallback projectCallback) {
- sProjectCallback = projectCallback;
- }
-
- /**
- * Like {@link #instantiate(Context, String, Bundle)} but with a null
- * argument Bundle.
- */
- @LayoutlibDelegate
- /*package*/ static Fragment instantiate(Context context, String fname) {
- return instantiate(context, fname, null);
- }
-
- /**
- * Create a new instance of a Fragment with the given class name. This is
- * the same as calling its empty constructor.
- *
- * @param context The calling context being used to instantiate the fragment.
- * This is currently just used to get its ClassLoader.
- * @param fname The class name of the fragment to instantiate.
- * @param args Bundle of arguments to supply to the fragment, which it
- * can retrieve with {@link #getArguments()}. May be null.
- * @return Returns a new fragment instance.
- * @throws InstantiationException If there is a failure in instantiating
- * the given fragment class. This is a runtime exception; it is not
- * normally expected to happen.
- */
- @LayoutlibDelegate
- /*package*/ static Fragment instantiate(Context context, String fname, Bundle args) {
- try {
- if (sProjectCallback != null) {
- Fragment f = (Fragment) sProjectCallback.loadView(fname,
- new Class[0], new Object[0]);
-
- if (args != null) {
- args.setClassLoader(f.getClass().getClassLoader());
- f.mArguments = args;
- }
- return f;
- }
-
- return null;
- } catch (ClassNotFoundException e) {
- throw new Fragment.InstantiationException("Unable to instantiate fragment " + fname
- + ": make sure class name exists, is public, and has an"
- + " empty constructor that is public", e);
- } catch (java.lang.InstantiationException e) {
- throw new Fragment.InstantiationException("Unable to instantiate fragment " + fname
- + ": make sure class name exists, is public, and has an"
- + " empty constructor that is public", e);
- } catch (IllegalAccessException e) {
- throw new Fragment.InstantiationException("Unable to instantiate fragment " + fname
- + ": make sure class name exists, is public, and has an"
- + " empty constructor that is public", e);
- } catch (Exception e) {
- throw new Fragment.InstantiationException("Unable to instantiate fragment " + fname
- + ": make sure class name exists, is public, and has an"
- + " empty constructor that is public", e);
- }
- }
-}
diff --git a/tools/layoutlib/bridge/src/android/content/res/BridgeAssetManager.java b/tools/layoutlib/bridge/src/android/content/res/BridgeAssetManager.java
deleted file mode 100644
index a953918..0000000
--- a/tools/layoutlib/bridge/src/android/content/res/BridgeAssetManager.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * 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.content.res;
-
-import com.android.layoutlib.bridge.Bridge;
-
-import android.content.res.AssetManager;
-
-public class BridgeAssetManager extends AssetManager {
-
- /**
- * This initializes the static field {@link AssetManager#mSystem} which is used
- * by methods who get a global asset manager using {@link AssetManager#getSystem()}.
- * <p/>
- * They will end up using our bridge asset manager.
- * <p/>
- * {@link Bridge} calls this method after setting up a new bridge.
- */
- public static AssetManager initSystem() {
- if (!(AssetManager.sSystem instanceof BridgeAssetManager)) {
- // Note that AssetManager() creates a system AssetManager and we override it
- // with our BridgeAssetManager.
- AssetManager.sSystem = new BridgeAssetManager();
- AssetManager.sSystem.makeStringBlocks(false);
- }
- return AssetManager.sSystem;
- }
-
- /**
- * Clears the static {@link AssetManager#sSystem} to make sure we don't leave objects
- * around that would prevent us from unloading the library.
- */
- public static void clearSystem() {
- AssetManager.sSystem = null;
- }
-
- private BridgeAssetManager() {
- }
-}
diff --git a/tools/layoutlib/bridge/src/android/content/res/BridgeResources.java b/tools/layoutlib/bridge/src/android/content/res/BridgeResources.java
deleted file mode 100644
index 8794452..0000000
--- a/tools/layoutlib/bridge/src/android/content/res/BridgeResources.java
+++ /dev/null
@@ -1,695 +0,0 @@
-/*
- * 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.content.res;
-
-import com.android.ide.common.rendering.api.IProjectCallback;
-import com.android.ide.common.rendering.api.LayoutLog;
-import com.android.ide.common.rendering.api.ResourceValue;
-import com.android.layoutlib.bridge.Bridge;
-import com.android.layoutlib.bridge.BridgeConstants;
-import com.android.layoutlib.bridge.android.BridgeContext;
-import com.android.layoutlib.bridge.android.BridgeXmlBlockParser;
-import com.android.layoutlib.bridge.impl.ParserFactory;
-import com.android.layoutlib.bridge.impl.ResourceHelper;
-import com.android.ninepatch.NinePatch;
-import com.android.resources.ResourceType;
-import com.android.util.Pair;
-
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-
-import android.graphics.drawable.Drawable;
-import android.util.AttributeSet;
-import android.util.DisplayMetrics;
-import android.util.TypedValue;
-import android.view.ViewGroup.LayoutParams;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.InputStream;
-
-/**
- *
- */
-public final class BridgeResources extends Resources {
-
- private BridgeContext mContext;
- private IProjectCallback mProjectCallback;
- private boolean[] mPlatformResourceFlag = new boolean[1];
-
- /**
- * Simpler wrapper around FileInputStream. This is used when the input stream represent
- * not a normal bitmap but a nine patch.
- * This is useful when the InputStream is created in a method but used in another that needs
- * to know whether this is 9-patch or not, such as BitmapFactory.
- */
- public class NinePatchInputStream extends FileInputStream {
- private boolean mFakeMarkSupport = true;
- public NinePatchInputStream(File file) throws FileNotFoundException {
- super(file);
- }
-
- @Override
- public boolean markSupported() {
- if (mFakeMarkSupport) {
- // this is needed so that BitmapFactory doesn't wrap this in a BufferedInputStream.
- return true;
- }
-
- return super.markSupported();
- }
-
- public void disableFakeMarkSupport() {
- // disable fake mark support so that in case codec actually try to use them
- // we don't lie to them.
- mFakeMarkSupport = false;
- }
- }
-
- /**
- * This initializes the static field {@link Resources#mSystem} which is used
- * by methods who get global resources using {@link Resources#getSystem()}.
- * <p/>
- * They will end up using our bridge resources.
- * <p/>
- * {@link Bridge} calls this method after setting up a new bridge.
- */
- public static Resources initSystem(BridgeContext context,
- AssetManager assets,
- DisplayMetrics metrics,
- Configuration config,
- IProjectCallback projectCallback) {
- return Resources.mSystem = new BridgeResources(context,
- assets,
- metrics,
- config,
- projectCallback);
- }
-
- /**
- * Disposes the static {@link Resources#mSystem} to make sure we don't leave objects
- * around that would prevent us from unloading the library.
- */
- public static void disposeSystem() {
- if (Resources.mSystem instanceof BridgeResources) {
- ((BridgeResources)(Resources.mSystem)).mContext = null;
- ((BridgeResources)(Resources.mSystem)).mProjectCallback = null;
- }
- Resources.mSystem = null;
- }
-
- private BridgeResources(BridgeContext context, AssetManager assets, DisplayMetrics metrics,
- Configuration config, IProjectCallback projectCallback) {
- super(assets, metrics, config);
- mContext = context;
- mProjectCallback = projectCallback;
- }
-
- public BridgeTypedArray newTypeArray(int numEntries, boolean platformFile) {
- return new BridgeTypedArray(this, mContext, numEntries, platformFile);
- }
-
- private Pair<String, ResourceValue> getResourceValue(int id, boolean[] platformResFlag_out) {
- // first get the String related to this id in the framework
- Pair<ResourceType, String> resourceInfo = Bridge.resolveResourceId(id);
-
- if (resourceInfo != null) {
- platformResFlag_out[0] = true;
- String attributeName = resourceInfo.getSecond();
-
- return Pair.of(attributeName, mContext.getRenderResources().getFrameworkResource(
- resourceInfo.getFirst(), attributeName));
- }
-
- // didn't find a match in the framework? look in the project.
- if (mProjectCallback != null) {
- resourceInfo = mProjectCallback.resolveResourceId(id);
-
- if (resourceInfo != null) {
- platformResFlag_out[0] = false;
- String attributeName = resourceInfo.getSecond();
-
- return Pair.of(attributeName, mContext.getRenderResources().getProjectResource(
- resourceInfo.getFirst(), attributeName));
- }
- }
-
- return null;
- }
-
- @Override
- public Drawable getDrawable(int id) throws NotFoundException {
- Pair<String, ResourceValue> value = getResourceValue(id, mPlatformResourceFlag);
-
- if (value != null) {
- return ResourceHelper.getDrawable(value.getSecond(), mContext);
- }
-
- // id was not found or not resolved. Throw a NotFoundException.
- throwException(id);
-
- // this is not used since the method above always throws
- return null;
- }
-
- @Override
- public int getColor(int id) throws NotFoundException {
- Pair<String, ResourceValue> value = getResourceValue(id, mPlatformResourceFlag);
-
- if (value != null) {
- try {
- return ResourceHelper.getColor(value.getSecond().getValue());
- } catch (NumberFormatException e) {
- Bridge.getLog().error(LayoutLog.TAG_RESOURCES_FORMAT, e.getMessage(), e,
- null /*data*/);
- return 0;
- }
- }
-
- // id was not found or not resolved. Throw a NotFoundException.
- throwException(id);
-
- // this is not used since the method above always throws
- return 0;
- }
-
- @Override
- public ColorStateList getColorStateList(int id) throws NotFoundException {
- Pair<String, ResourceValue> resValue = getResourceValue(id, mPlatformResourceFlag);
-
- if (resValue != null) {
- ColorStateList stateList = ResourceHelper.getColorStateList(resValue.getSecond(),
- mContext);
- if (stateList != null) {
- return stateList;
- }
- }
-
- // id was not found or not resolved. Throw a NotFoundException.
- throwException(id);
-
- // this is not used since the method above always throws
- return null;
- }
-
- @Override
- public CharSequence getText(int id) throws NotFoundException {
- Pair<String, ResourceValue> value = getResourceValue(id, mPlatformResourceFlag);
-
- if (value != null) {
- ResourceValue resValue = value.getSecond();
-
- assert resValue != null;
- if (resValue != null) {
- String v = resValue.getValue();
- if (v != null) {
- return v;
- }
- }
- }
-
- // id was not found or not resolved. Throw a NotFoundException.
- throwException(id);
-
- // this is not used since the method above always throws
- return null;
- }
-
- @Override
- public XmlResourceParser getLayout(int id) throws NotFoundException {
- Pair<String, ResourceValue> v = getResourceValue(id, mPlatformResourceFlag);
-
- if (v != null) {
- ResourceValue value = v.getSecond();
- XmlPullParser parser = null;
-
- try {
- // check if the current parser can provide us with a custom parser.
- if (mPlatformResourceFlag[0] == false) {
- parser = mProjectCallback.getParser(value);
- }
-
- // create a new one manually if needed.
- if (parser == null) {
- File xml = new File(value.getValue());
- if (xml.isFile()) {
- // we need to create a pull parser around the layout XML file, and then
- // give that to our XmlBlockParser
- parser = ParserFactory.create(xml);
- }
- }
-
- if (parser != null) {
- return new BridgeXmlBlockParser(parser, mContext, mPlatformResourceFlag[0]);
- }
- } catch (XmlPullParserException e) {
- Bridge.getLog().error(LayoutLog.TAG_BROKEN,
- "Failed to configure parser for " + value.getValue(), e, null /*data*/);
- // we'll return null below.
- } catch (FileNotFoundException e) {
- // this shouldn't happen since we check above.
- }
-
- }
-
- // id was not found or not resolved. Throw a NotFoundException.
- throwException(id);
-
- // this is not used since the method above always throws
- return null;
- }
-
- @Override
- public XmlResourceParser getAnimation(int id) throws NotFoundException {
- Pair<String, ResourceValue> v = getResourceValue(id, mPlatformResourceFlag);
-
- if (v != null) {
- ResourceValue value = v.getSecond();
- XmlPullParser parser = null;
-
- try {
- File xml = new File(value.getValue());
- if (xml.isFile()) {
- // we need to create a pull parser around the layout XML file, and then
- // give that to our XmlBlockParser
- parser = ParserFactory.create(xml);
-
- return new BridgeXmlBlockParser(parser, mContext, mPlatformResourceFlag[0]);
- }
- } catch (XmlPullParserException e) {
- Bridge.getLog().error(LayoutLog.TAG_BROKEN,
- "Failed to configure parser for " + value.getValue(), e, null /*data*/);
- // we'll return null below.
- } catch (FileNotFoundException e) {
- // this shouldn't happen since we check above.
- }
-
- }
-
- // id was not found or not resolved. Throw a NotFoundException.
- throwException(id);
-
- // this is not used since the method above always throws
- return null;
- }
-
- @Override
- public TypedArray obtainAttributes(AttributeSet set, int[] attrs) {
- return mContext.obtainStyledAttributes(set, attrs);
- }
-
- @Override
- public TypedArray obtainTypedArray(int id) throws NotFoundException {
- throw new UnsupportedOperationException();
- }
-
-
- @Override
- public float getDimension(int id) throws NotFoundException {
- Pair<String, ResourceValue> value = getResourceValue(id, mPlatformResourceFlag);
-
- if (value != null) {
- ResourceValue resValue = value.getSecond();
-
- assert resValue != null;
- if (resValue != null) {
- String v = resValue.getValue();
- if (v != null) {
- if (v.equals(BridgeConstants.MATCH_PARENT) ||
- v.equals(BridgeConstants.FILL_PARENT)) {
- return LayoutParams.MATCH_PARENT;
- } else if (v.equals(BridgeConstants.WRAP_CONTENT)) {
- return LayoutParams.WRAP_CONTENT;
- }
-
- if (ResourceHelper.parseFloatAttribute(
- value.getFirst(), v, mTmpValue, true /*requireUnit*/) &&
- mTmpValue.type == TypedValue.TYPE_DIMENSION) {
- return mTmpValue.getDimension(getDisplayMetrics());
- }
- }
- }
- }
-
- // id was not found or not resolved. Throw a NotFoundException.
- throwException(id);
-
- // this is not used since the method above always throws
- return 0;
- }
-
- @Override
- public int getDimensionPixelOffset(int id) throws NotFoundException {
- Pair<String, ResourceValue> value = getResourceValue(id, mPlatformResourceFlag);
-
- if (value != null) {
- ResourceValue resValue = value.getSecond();
-
- assert resValue != null;
- if (resValue != null) {
- String v = resValue.getValue();
- if (v != null) {
- if (ResourceHelper.parseFloatAttribute(
- value.getFirst(), v, mTmpValue, true /*requireUnit*/) &&
- mTmpValue.type == TypedValue.TYPE_DIMENSION) {
- return TypedValue.complexToDimensionPixelOffset(mTmpValue.data,
- getDisplayMetrics());
- }
- }
- }
- }
-
- // id was not found or not resolved. Throw a NotFoundException.
- throwException(id);
-
- // this is not used since the method above always throws
- return 0;
- }
-
- @Override
- public int getDimensionPixelSize(int id) throws NotFoundException {
- Pair<String, ResourceValue> value = getResourceValue(id, mPlatformResourceFlag);
-
- if (value != null) {
- ResourceValue resValue = value.getSecond();
-
- assert resValue != null;
- if (resValue != null) {
- String v = resValue.getValue();
- if (v != null) {
- if (ResourceHelper.parseFloatAttribute(
- value.getFirst(), v, mTmpValue, true /*requireUnit*/) &&
- mTmpValue.type == TypedValue.TYPE_DIMENSION) {
- return TypedValue.complexToDimensionPixelSize(mTmpValue.data,
- getDisplayMetrics());
- }
- }
- }
- }
-
- // id was not found or not resolved. Throw a NotFoundException.
- throwException(id);
-
- // this is not used since the method above always throws
- return 0;
- }
-
- @Override
- public int getInteger(int id) throws NotFoundException {
- Pair<String, ResourceValue> value = getResourceValue(id, mPlatformResourceFlag);
-
- if (value != null) {
- ResourceValue resValue = value.getSecond();
-
- assert resValue != null;
- if (resValue != null) {
- String v = resValue.getValue();
- if (v != null) {
- int radix = 10;
- if (v.startsWith("0x")) {
- v = v.substring(2);
- radix = 16;
- }
- try {
- return Integer.parseInt(v, radix);
- } catch (NumberFormatException e) {
- // return exception below
- }
- }
- }
- }
-
- // id was not found or not resolved. Throw a NotFoundException.
- throwException(id);
-
- // this is not used since the method above always throws
- return 0;
- }
-
- @Override
- public boolean getBoolean(int id) throws NotFoundException {
- Pair<String, ResourceValue> value = getResourceValue(id, mPlatformResourceFlag);
-
- if (value != null) {
- ResourceValue resValue = value.getSecond();
-
- assert resValue != null;
- if (resValue != null) {
- String v = resValue.getValue();
- if (v != null) {
- return Boolean.parseBoolean(v);
- }
- }
- }
-
- // id was not found or not resolved. Throw a NotFoundException.
- throwException(id);
-
- // this is not used since the method above always throws
- return false;
- }
-
- @Override
- public String getResourceEntryName(int resid) throws NotFoundException {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public String getResourceName(int resid) throws NotFoundException {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public String getResourceTypeName(int resid) throws NotFoundException {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public String getString(int id, Object... formatArgs) throws NotFoundException {
- String s = getString(id);
- if (s != null) {
- return String.format(s, formatArgs);
-
- }
-
- // id was not found or not resolved. Throw a NotFoundException.
- throwException(id);
-
- // this is not used since the method above always throws
- return null;
- }
-
- @Override
- public String getString(int id) throws NotFoundException {
- Pair<String, ResourceValue> value = getResourceValue(id, mPlatformResourceFlag);
-
- if (value != null && value.getSecond().getValue() != null) {
- return value.getSecond().getValue();
- }
-
- // id was not found or not resolved. Throw a NotFoundException.
- throwException(id);
-
- // this is not used since the method above always throws
- return null;
- }
-
- @Override
- public void getValue(int id, TypedValue outValue, boolean resolveRefs)
- throws NotFoundException {
- Pair<String, ResourceValue> value = getResourceValue(id, mPlatformResourceFlag);
-
- if (value != null) {
- String v = value.getSecond().getValue();
-
- if (v != null) {
- if (ResourceHelper.parseFloatAttribute(value.getFirst(), v, outValue,
- false /*requireUnit*/)) {
- return;
- }
-
- // else it's a string
- outValue.type = TypedValue.TYPE_STRING;
- outValue.string = v;
- return;
- }
- }
-
- // id was not found or not resolved. Throw a NotFoundException.
- throwException(id);
- }
-
- @Override
- public void getValue(String name, TypedValue outValue, boolean resolveRefs)
- throws NotFoundException {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public XmlResourceParser getXml(int id) throws NotFoundException {
- Pair<String, ResourceValue> value = getResourceValue(id, mPlatformResourceFlag);
-
- if (value != null) {
- String v = value.getSecond().getValue();
-
- if (v != null) {
- // check this is a file
- File f = new File(v);
- if (f.isFile()) {
- try {
- XmlPullParser parser = ParserFactory.create(f);
-
- return new BridgeXmlBlockParser(parser, mContext, mPlatformResourceFlag[0]);
- } catch (XmlPullParserException e) {
- NotFoundException newE = new NotFoundException();
- newE.initCause(e);
- throw newE;
- } catch (FileNotFoundException e) {
- NotFoundException newE = new NotFoundException();
- newE.initCause(e);
- throw newE;
- }
- }
- }
- }
-
- // id was not found or not resolved. Throw a NotFoundException.
- throwException(id);
-
- // this is not used since the method above always throws
- return null;
- }
-
- @Override
- public XmlResourceParser loadXmlResourceParser(String file, int id,
- int assetCookie, String type) throws NotFoundException {
- // even though we know the XML file to load directly, we still need to resolve the
- // id so that we can know if it's a platform or project resource.
- // (mPlatformResouceFlag will get the result and will be used later).
- getResourceValue(id, mPlatformResourceFlag);
-
- File f = new File(file);
- try {
- XmlPullParser parser = ParserFactory.create(f);
-
- return new BridgeXmlBlockParser(parser, mContext, mPlatformResourceFlag[0]);
- } catch (XmlPullParserException e) {
- NotFoundException newE = new NotFoundException();
- newE.initCause(e);
- throw newE;
- } catch (FileNotFoundException e) {
- NotFoundException newE = new NotFoundException();
- newE.initCause(e);
- throw newE;
- }
- }
-
-
- @Override
- public InputStream openRawResource(int id) throws NotFoundException {
- Pair<String, ResourceValue> value = getResourceValue(id, mPlatformResourceFlag);
-
- if (value != null) {
- String path = value.getSecond().getValue();
-
- if (path != null) {
- // check this is a file
- File f = new File(path);
- if (f.isFile()) {
- try {
- // if it's a nine-patch return a custom input stream so that
- // other methods (mainly bitmap factory) can detect it's a 9-patch
- // and actually load it as a 9-patch instead of a normal bitmap
- if (path.toLowerCase().endsWith(NinePatch.EXTENSION_9PATCH)) {
- return new NinePatchInputStream(f);
- }
- return new FileInputStream(f);
- } catch (FileNotFoundException e) {
- NotFoundException newE = new NotFoundException();
- newE.initCause(e);
- throw newE;
- }
- }
- }
- }
-
- // id was not found or not resolved. Throw a NotFoundException.
- throwException(id);
-
- // this is not used since the method above always throws
- return null;
- }
-
- @Override
- public InputStream openRawResource(int id, TypedValue value) throws NotFoundException {
- getValue(id, value, true);
-
- String path = value.string.toString();
-
- File f = new File(path);
- if (f.isFile()) {
- try {
- // if it's a nine-patch return a custom input stream so that
- // other methods (mainly bitmap factory) can detect it's a 9-patch
- // and actually load it as a 9-patch instead of a normal bitmap
- if (path.toLowerCase().endsWith(NinePatch.EXTENSION_9PATCH)) {
- return new NinePatchInputStream(f);
- }
- return new FileInputStream(f);
- } catch (FileNotFoundException e) {
- NotFoundException exception = new NotFoundException();
- exception.initCause(e);
- throw exception;
- }
- }
-
- throw new NotFoundException();
- }
-
- @Override
- public AssetFileDescriptor openRawResourceFd(int id) throws NotFoundException {
- throw new UnsupportedOperationException();
- }
-
- /**
- * Builds and throws a {@link Resources.NotFoundException} based on a resource id and a resource type.
- * @param id the id of the resource
- * @throws NotFoundException
- */
- private void throwException(int id) throws NotFoundException {
- // first get the String related to this id in the framework
- Pair<ResourceType, String> resourceInfo = Bridge.resolveResourceId(id);
-
- // if the name is unknown in the framework, get it from the custom view loader.
- if (resourceInfo == null && mProjectCallback != null) {
- resourceInfo = mProjectCallback.resolveResourceId(id);
- }
-
- String message = null;
- if (resourceInfo != null) {
- message = String.format(
- "Could not find %1$s resource matching value 0x%2$X (resolved name: %3$s) in current configuration.",
- resourceInfo.getFirst(), id, resourceInfo.getSecond());
- } else {
- message = String.format(
- "Could not resolve resource value: 0x%1$X.", id);
- }
-
- throw new NotFoundException(message);
- }
-}
diff --git a/tools/layoutlib/bridge/src/android/content/res/BridgeTypedArray.java b/tools/layoutlib/bridge/src/android/content/res/BridgeTypedArray.java
deleted file mode 100644
index 446d139..0000000
--- a/tools/layoutlib/bridge/src/android/content/res/BridgeTypedArray.java
+++ /dev/null
@@ -1,908 +0,0 @@
-/*
- * 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.content.res;
-
-import com.android.ide.common.rendering.api.AttrResourceValue;
-import com.android.ide.common.rendering.api.LayoutLog;
-import com.android.ide.common.rendering.api.RenderResources;
-import com.android.ide.common.rendering.api.ResourceValue;
-import com.android.ide.common.rendering.api.StyleResourceValue;
-import com.android.internal.util.XmlUtils;
-import com.android.layoutlib.bridge.Bridge;
-import com.android.layoutlib.bridge.BridgeConstants;
-import com.android.layoutlib.bridge.android.BridgeContext;
-import com.android.layoutlib.bridge.android.BridgeXmlBlockParser;
-import com.android.layoutlib.bridge.impl.ParserFactory;
-import com.android.layoutlib.bridge.impl.ResourceHelper;
-import com.android.resources.ResourceType;
-
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-
-import android.graphics.drawable.Drawable;
-import android.util.DisplayMetrics;
-import android.util.TypedValue;
-import android.view.LayoutInflater_Delegate;
-import android.view.ViewGroup.LayoutParams;
-
-import java.io.File;
-import java.util.Arrays;
-import java.util.Map;
-
-/**
- * Custom implementation of TypedArray to handle non compiled resources.
- */
-public final class BridgeTypedArray extends TypedArray {
-
- private final BridgeResources mBridgeResources;
- private final BridgeContext mContext;
- private final boolean mPlatformFile;
-
- private ResourceValue[] mResourceData;
- private String[] mNames;
- private boolean[] mIsFramework;
-
- public BridgeTypedArray(BridgeResources resources, BridgeContext context, int len,
- boolean platformFile) {
- super(null, null, null, 0);
- mBridgeResources = resources;
- mContext = context;
- mPlatformFile = platformFile;
- mResourceData = new ResourceValue[len];
- mNames = new String[len];
- mIsFramework = new boolean[len];
- }
-
- /**
- * A bridge-specific method that sets a value in the type array
- * @param index the index of the value in the TypedArray
- * @param name the name of the attribute
- * @param isFramework whether the attribute is in the android namespace.
- * @param value the value of the attribute
- */
- public void bridgeSetValue(int index, String name, boolean isFramework, ResourceValue value) {
- mResourceData[index] = value;
- mNames[index] = name;
- mIsFramework[index] = isFramework;
- }
-
- /**
- * Seals the array after all calls to {@link #bridgeSetValue(int, String, ResourceValue)} have
- * been done.
- * <p/>This allows to compute the list of non default values, permitting
- * {@link #getIndexCount()} to return the proper value.
- */
- public void sealArray() {
- // fills TypedArray.mIndices which is used to implement getIndexCount/getIndexAt
- // first count the array size
- int count = 0;
- for (ResourceValue data : mResourceData) {
- if (data != null) {
- count++;
- }
- }
-
- // allocate the table with an extra to store the size
- mIndices = new int[count+1];
- mIndices[0] = count;
-
- // fill the array with the indices.
- int index = 1;
- for (int i = 0 ; i < mResourceData.length ; i++) {
- if (mResourceData[i] != null) {
- mIndices[index++] = i;
- }
- }
- }
-
- /**
- * Return the number of values in this array.
- */
- @Override
- public int length() {
- return mResourceData.length;
- }
-
- /**
- * Return the Resources object this array was loaded from.
- */
- @Override
- public Resources getResources() {
- return mBridgeResources;
- }
-
- /**
- * Retrieve the styled string value for the attribute at <var>index</var>.
- *
- * @param index Index of attribute to retrieve.
- *
- * @return CharSequence holding string data. May be styled. Returns
- * null if the attribute is not defined.
- */
- @Override
- public CharSequence getText(int index) {
- if (index < 0 || index >= mResourceData.length) {
- return null;
- }
-
- if (mResourceData[index] != null) {
- // FIXME: handle styled strings!
- return mResourceData[index].getValue();
- }
-
- return null;
- }
-
- /**
- * Retrieve the string value for the attribute at <var>index</var>.
- *
- * @param index Index of attribute to retrieve.
- *
- * @return String holding string data. Any styling information is
- * removed. Returns null if the attribute is not defined.
- */
- @Override
- public String getString(int index) {
- if (index < 0 || index >= mResourceData.length) {
- return null;
- }
-
- if (mResourceData[index] != null) {
- return mResourceData[index].getValue();
- }
-
- return null;
- }
-
- /**
- * Retrieve the boolean value for the attribute at <var>index</var>.
- *
- * @param index Index of attribute to retrieve.
- * @param defValue Value to return if the attribute is not defined.
- *
- * @return Attribute boolean value, or defValue if not defined.
- */
- @Override
- public boolean getBoolean(int index, boolean defValue) {
- if (index < 0 || index >= mResourceData.length) {
- return defValue;
- }
-
- if (mResourceData[index] == null) {
- return defValue;
- }
-
- String s = mResourceData[index].getValue();
- if (s != null) {
- return XmlUtils.convertValueToBoolean(s, defValue);
- }
-
- return defValue;
- }
-
- /**
- * Retrieve the integer value for the attribute at <var>index</var>.
- *
- * @param index Index of attribute to retrieve.
- * @param defValue Value to return if the attribute is not defined.
- *
- * @return Attribute int value, or defValue if not defined.
- */
- @Override
- public int getInt(int index, int defValue) {
- if (index < 0 || index >= mResourceData.length) {
- return defValue;
- }
-
- if (mResourceData[index] == null) {
- return defValue;
- }
-
- String s = mResourceData[index].getValue();
-
- if (RenderResources.REFERENCE_NULL.equals(s)) {
- return defValue;
- }
-
- if (s == null || s.length() == 0) {
- return defValue;
- }
-
- try {
- return XmlUtils.convertValueToInt(s, defValue);
- } catch (NumberFormatException e) {
- // pass
- }
-
- // Field is not null and is not an integer.
- // Check for possible constants and try to find them.
- // Get the map of attribute-constant -> IntegerValue
- Map<String, Integer> map = null;
- if (mIsFramework[index]) {
- map = Bridge.getEnumValues(mNames[index]);
- } else {
- // get the styleable matching the resolved name
- RenderResources res = mContext.getRenderResources();
- ResourceValue attr = res.getProjectResource(ResourceType.ATTR, mNames[index]);
- if (attr instanceof AttrResourceValue) {
- map = ((AttrResourceValue) attr).getAttributeValues();
- }
- }
-
- if (map != null) {
- // accumulator to store the value of the 1+ constants.
- int result = 0;
-
- // split the value in case this is a mix of several flags.
- String[] keywords = s.split("\\|");
- for (String keyword : keywords) {
- Integer i = map.get(keyword.trim());
- if (i != null) {
- result |= i.intValue();
- } else {
- Bridge.getLog().warning(LayoutLog.TAG_RESOURCES_FORMAT,
- String.format(
- "\"%s\" in attribute \"%2$s\" is not a valid value",
- keyword, mNames[index]), null /*data*/);
- }
- }
- return result;
- }
-
- return defValue;
- }
-
- /**
- * Retrieve the float value for the attribute at <var>index</var>.
- *
- * @param index Index of attribute to retrieve.
- *
- * @return Attribute float value, or defValue if not defined..
- */
- @Override
- public float getFloat(int index, float defValue) {
- if (index < 0 || index >= mResourceData.length) {
- return defValue;
- }
-
- if (mResourceData[index] == null) {
- return defValue;
- }
-
- String s = mResourceData[index].getValue();
-
- if (s != null) {
- try {
- return Float.parseFloat(s);
- } catch (NumberFormatException e) {
- Bridge.getLog().warning(LayoutLog.TAG_RESOURCES_FORMAT,
- String.format(
- "\"%s\" in attribute \"%2$s\" cannot be converted to float.",
- s, mNames[index]), null /*data*/);
-
- // we'll return the default value below.
- }
- }
- return defValue;
- }
-
- /**
- * Retrieve the color value for the attribute at <var>index</var>. If
- * the attribute references a color resource holding a complex
- * {@link android.content.res.ColorStateList}, then the default color from
- * the set is returned.
- *
- * @param index Index of attribute to retrieve.
- * @param defValue Value to return if the attribute is not defined or
- * not a resource.
- *
- * @return Attribute color value, or defValue if not defined.
- */
- @Override
- public int getColor(int index, int defValue) {
- if (index < 0 || index >= mResourceData.length) {
- return defValue;
- }
-
- if (mResourceData[index] == null) {
- return defValue;
- }
-
- ColorStateList colorStateList = ResourceHelper.getColorStateList(
- mResourceData[index], mContext);
- if (colorStateList != null) {
- return colorStateList.getDefaultColor();
- }
-
- return defValue;
- }
-
- /**
- * Retrieve the ColorStateList for the attribute at <var>index</var>.
- * The value may be either a single solid color or a reference to
- * a color or complex {@link android.content.res.ColorStateList} description.
- *
- * @param index Index of attribute to retrieve.
- *
- * @return ColorStateList for the attribute, or null if not defined.
- */
- @Override
- public ColorStateList getColorStateList(int index) {
- if (index < 0 || index >= mResourceData.length) {
- return null;
- }
-
- if (mResourceData[index] == null) {
- return null;
- }
-
- ResourceValue resValue = mResourceData[index];
- String value = resValue.getValue();
-
- if (value == null) {
- return null;
- }
-
- if (RenderResources.REFERENCE_NULL.equals(value)) {
- return null;
- }
-
- // let the framework inflate the ColorStateList from the XML file.
- File f = new File(value);
- if (f.isFile()) {
- try {
- XmlPullParser parser = ParserFactory.create(f);
-
- BridgeXmlBlockParser blockParser = new BridgeXmlBlockParser(
- parser, mContext, resValue.isFramework());
- try {
- return ColorStateList.createFromXml(mContext.getResources(), blockParser);
- } finally {
- blockParser.ensurePopped();
- }
- } catch (XmlPullParserException e) {
- Bridge.getLog().error(LayoutLog.TAG_BROKEN,
- "Failed to configure parser for " + value, e, null /*data*/);
- return null;
- } catch (Exception e) {
- // this is an error and not warning since the file existence is checked before
- // attempting to parse it.
- Bridge.getLog().error(LayoutLog.TAG_RESOURCES_READ,
- "Failed to parse file " + value, e, null /*data*/);
-
- return null;
- }
- }
-
- try {
- int color = ResourceHelper.getColor(value);
- return ColorStateList.valueOf(color);
- } catch (NumberFormatException e) {
- Bridge.getLog().error(LayoutLog.TAG_RESOURCES_FORMAT, e.getMessage(), e, null /*data*/);
- }
-
- return null;
- }
-
- /**
- * Retrieve the integer value for the attribute at <var>index</var>.
- *
- * @param index Index of attribute to retrieve.
- * @param defValue Value to return if the attribute is not defined or
- * not a resource.
- *
- * @return Attribute integer value, or defValue if not defined.
- */
- @Override
- public int getInteger(int index, int defValue) {
- return getInt(index, defValue);
- }
-
- /**
- * Retrieve a dimensional unit attribute at <var>index</var>. Unit
- * conversions are based on the current {@link DisplayMetrics}
- * associated with the resources this {@link TypedArray} object
- * came from.
- *
- * @param index Index of attribute to retrieve.
- * @param defValue Value to return if the attribute is not defined or
- * not a resource.
- *
- * @return Attribute dimension value multiplied by the appropriate
- * metric, or defValue if not defined.
- *
- * @see #getDimensionPixelOffset
- * @see #getDimensionPixelSize
- */
- @Override
- public float getDimension(int index, float defValue) {
- if (index < 0 || index >= mResourceData.length) {
- return defValue;
- }
-
- if (mResourceData[index] == null) {
- return defValue;
- }
-
- String s = mResourceData[index].getValue();
-
- if (s == null) {
- return defValue;
- } else if (s.equals(BridgeConstants.MATCH_PARENT) ||
- s.equals(BridgeConstants.FILL_PARENT)) {
- return LayoutParams.MATCH_PARENT;
- } else if (s.equals(BridgeConstants.WRAP_CONTENT)) {
- return LayoutParams.WRAP_CONTENT;
- } else if (RenderResources.REFERENCE_NULL.equals(s)) {
- return defValue;
- }
-
- if (ResourceHelper.parseFloatAttribute(mNames[index], s, mValue, true /*requireUnit*/)) {
- return mValue.getDimension(mBridgeResources.getDisplayMetrics());
- }
-
- // looks like we were unable to resolve the dimension value
- Bridge.getLog().warning(LayoutLog.TAG_RESOURCES_FORMAT,
- String.format(
- "\"%1$s\" in attribute \"%2$s\" is not a valid format.",
- s, mNames[index]), null /*data*/);
-
- return defValue;
- }
-
- /**
- * Retrieve a dimensional unit attribute at <var>index</var> for use
- * as an offset in raw pixels. This is the same as
- * {@link #getDimension}, except the returned value is converted to
- * integer pixels for you. An offset conversion involves simply
- * truncating the base value to an integer.
- *
- * @param index Index of attribute to retrieve.
- * @param defValue Value to return if the attribute is not defined or
- * not a resource.
- *
- * @return Attribute dimension value multiplied by the appropriate
- * metric and truncated to integer pixels, or defValue if not defined.
- *
- * @see #getDimension
- * @see #getDimensionPixelSize
- */
- @Override
- public int getDimensionPixelOffset(int index, int defValue) {
- return (int) getDimension(index, defValue);
- }
-
- /**
- * Retrieve a dimensional unit attribute at <var>index</var> for use
- * as a size in raw pixels. This is the same as
- * {@link #getDimension}, except the returned value is converted to
- * integer pixels for use as a size. A size conversion involves
- * rounding the base value, and ensuring that a non-zero base value
- * is at least one pixel in size.
- *
- * @param index Index of attribute to retrieve.
- * @param defValue Value to return if the attribute is not defined or
- * not a resource.
- *
- * @return Attribute dimension value multiplied by the appropriate
- * metric and truncated to integer pixels, or defValue if not defined.
- *
- * @see #getDimension
- * @see #getDimensionPixelOffset
- */
- @Override
- public int getDimensionPixelSize(int index, int defValue) {
- try {
- return getDimension(index);
- } catch (RuntimeException e) {
- if (mResourceData[index] != null) {
- String s = mResourceData[index].getValue();
-
- if (s != null) {
- // looks like we were unable to resolve the dimension value
- Bridge.getLog().warning(LayoutLog.TAG_RESOURCES_FORMAT,
- String.format(
- "\"%1$s\" in attribute \"%2$s\" is not a valid format.",
- s, mNames[index]), null /*data*/);
- }
- }
-
- return defValue;
- }
- }
-
- /**
- * Special version of {@link #getDimensionPixelSize} for retrieving
- * {@link android.view.ViewGroup}'s layout_width and layout_height
- * attributes. This is only here for performance reasons; applications
- * should use {@link #getDimensionPixelSize}.
- *
- * @param index Index of the attribute to retrieve.
- * @param name Textual name of attribute for error reporting.
- *
- * @return Attribute dimension value multiplied by the appropriate
- * metric and truncated to integer pixels.
- */
- @Override
- public int getLayoutDimension(int index, String name) {
- try {
- // this will throw an exception
- return getDimension(index);
- } catch (RuntimeException e) {
-
- if (LayoutInflater_Delegate.sIsInInclude) {
- throw new RuntimeException();
- }
-
- Bridge.getLog().warning(LayoutLog.TAG_RESOURCES_FORMAT,
- "You must supply a " + name + " attribute.", null);
-
- return 0;
- }
- }
-
- @Override
- public int getLayoutDimension(int index, int defValue) {
- return getDimensionPixelSize(index, defValue);
- }
-
- private int getDimension(int index) {
- if (mResourceData[index] == null) {
- throw new RuntimeException();
- }
-
- String s = mResourceData[index].getValue();
-
- if (s == null) {
- throw new RuntimeException();
- } else if (s.equals(BridgeConstants.MATCH_PARENT) ||
- s.equals(BridgeConstants.FILL_PARENT)) {
- return LayoutParams.MATCH_PARENT;
- } else if (s.equals(BridgeConstants.WRAP_CONTENT)) {
- return LayoutParams.WRAP_CONTENT;
- } else if (RenderResources.REFERENCE_NULL.equals(s)) {
- throw new RuntimeException();
- }
-
- if (ResourceHelper.parseFloatAttribute(mNames[index], s, mValue, true /*requireUnit*/)) {
- float f = mValue.getDimension(mBridgeResources.getDisplayMetrics());
-
- final int res = (int)(f+0.5f);
- if (res != 0) return res;
- if (f == 0) return 0;
- if (f > 0) return 1;
- }
-
- throw new RuntimeException();
- }
-
- /**
- * Retrieve a fractional unit attribute at <var>index</var>.
- *
- * @param index Index of attribute to retrieve.
- * @param base The base value of this fraction. In other words, a
- * standard fraction is multiplied by this value.
- * @param pbase The parent base value of this fraction. In other
- * words, a parent fraction (nn%p) is multiplied by this
- * value.
- * @param defValue Value to return if the attribute is not defined or
- * not a resource.
- *
- * @return Attribute fractional value multiplied by the appropriate
- * base value, or defValue if not defined.
- */
- @Override
- public float getFraction(int index, int base, int pbase, float defValue) {
- if (index < 0 || index >= mResourceData.length) {
- return defValue;
- }
-
- if (mResourceData[index] == null) {
- return defValue;
- }
-
- String value = mResourceData[index].getValue();
- if (value == null) {
- return defValue;
- }
-
- if (ResourceHelper.parseFloatAttribute(mNames[index], value, mValue,
- false /*requireUnit*/)) {
- return mValue.getFraction(base, pbase);
- }
-
- // looks like we were unable to resolve the fraction value
- Bridge.getLog().warning(LayoutLog.TAG_RESOURCES_FORMAT,
- String.format(
- "\"%1$s\" in attribute \"%2$s\" cannot be converted to a fraction.",
- value, mNames[index]), null /*data*/);
-
- return defValue;
- }
-
- /**
- * Retrieve the resource identifier for the attribute at
- * <var>index</var>. Note that attribute resource as resolved when
- * the overall {@link TypedArray} object is retrieved. As a
- * result, this function will return the resource identifier of the
- * final resource value that was found, <em>not</em> necessarily the
- * original resource that was specified by the attribute.
- *
- * @param index Index of attribute to retrieve.
- * @param defValue Value to return if the attribute is not defined or
- * not a resource.
- *
- * @return Attribute resource identifier, or defValue if not defined.
- */
- @Override
- public int getResourceId(int index, int defValue) {
- if (index < 0 || index >= mResourceData.length) {
- return defValue;
- }
-
- // get the Resource for this index
- ResourceValue resValue = mResourceData[index];
-
- // no data, return the default value.
- if (resValue == null) {
- return defValue;
- }
-
- // check if this is a style resource
- if (resValue instanceof StyleResourceValue) {
- // get the id that will represent this style.
- return mContext.getDynamicIdByStyle((StyleResourceValue)resValue);
- }
-
- if (RenderResources.REFERENCE_NULL.equals(resValue.getValue())) {
- return defValue;
- }
-
- // if the attribute was a reference to a resource, and not a declaration of an id (@+id),
- // then the xml attribute value was "resolved" which leads us to a ResourceValue with a
- // valid getType() and getName() returning a resource name.
- // (and getValue() returning null!). We need to handle this!
- if (resValue.getResourceType() != null) {
- // if this is a framework id
- if (mPlatformFile || resValue.isFramework()) {
- // look for idName in the android R classes
- return mContext.getFrameworkResourceValue(
- resValue.getResourceType(), resValue.getName(), defValue);
- }
-
- // look for idName in the project R class.
- return mContext.getProjectResourceValue(
- resValue.getResourceType(), resValue.getName(), defValue);
- }
-
- // else, try to get the value, and resolve it somehow.
- String value = resValue.getValue();
- if (value == null) {
- return defValue;
- }
-
- // if the value is just an integer, return it.
- try {
- int i = Integer.parseInt(value);
- if (Integer.toString(i).equals(value)) {
- return i;
- }
- } catch (NumberFormatException e) {
- // pass
- }
-
- // Handle the @id/<name>, @+id/<name> and @android:id/<name>
- // We need to return the exact value that was compiled (from the various R classes),
- // as these values can be reused internally with calls to findViewById().
- // There's a trick with platform layouts that not use "android:" but their IDs are in
- // fact in the android.R and com.android.internal.R classes.
- // The field mPlatformFile will indicate that all IDs are to be looked up in the android R
- // classes exclusively.
-
- // if this is a reference to an id, find it.
- if (value.startsWith("@id/") || value.startsWith("@+") ||
- value.startsWith("@android:id/")) {
-
- int pos = value.indexOf('/');
- String idName = value.substring(pos + 1);
-
- // if this is a framework id
- if (mPlatformFile || value.startsWith("@android") || value.startsWith("@+android")) {
- // look for idName in the android R classes
- return mContext.getFrameworkResourceValue(ResourceType.ID, idName, defValue);
- }
-
- // look for idName in the project R class.
- return mContext.getProjectResourceValue(ResourceType.ID, idName, defValue);
- }
-
- // not a direct id valid reference? resolve it
- Integer idValue = null;
-
- if (resValue.isFramework()) {
- idValue = Bridge.getResourceId(resValue.getResourceType(),
- resValue.getName());
- } else {
- idValue = mContext.getProjectCallback().getResourceId(
- resValue.getResourceType(), resValue.getName());
- }
-
- if (idValue != null) {
- return idValue.intValue();
- }
-
- Bridge.getLog().warning(LayoutLog.TAG_RESOURCES_RESOLVE,
- String.format(
- "Unable to resolve id \"%1$s\" for attribute \"%2$s\"", value, mNames[index]),
- resValue);
-
- return defValue;
- }
-
- /**
- * Retrieve the Drawable for the attribute at <var>index</var>. This
- * gets the resource ID of the selected attribute, and uses
- * {@link Resources#getDrawable Resources.getDrawable} of the owning
- * Resources object to retrieve its Drawable.
- *
- * @param index Index of attribute to retrieve.
- *
- * @return Drawable for the attribute, or null if not defined.
- */
- @Override
- public Drawable getDrawable(int index) {
- if (index < 0 || index >= mResourceData.length) {
- return null;
- }
-
- if (mResourceData[index] == null) {
- return null;
- }
-
- ResourceValue value = mResourceData[index];
- String stringValue = value.getValue();
- if (stringValue == null || RenderResources.REFERENCE_NULL.equals(stringValue)) {
- return null;
- }
-
- return ResourceHelper.getDrawable(value, mContext);
- }
-
-
- /**
- * Retrieve the CharSequence[] for the attribute at <var>index</var>.
- * This gets the resource ID of the selected attribute, and uses
- * {@link Resources#getTextArray Resources.getTextArray} of the owning
- * Resources object to retrieve its String[].
- *
- * @param index Index of attribute to retrieve.
- *
- * @return CharSequence[] for the attribute, or null if not defined.
- */
- @Override
- public CharSequence[] getTextArray(int index) {
- if (index < 0 || index >= mResourceData.length) {
- return null;
- }
-
- if (mResourceData[index] == null) {
- return null;
- }
-
- String value = mResourceData[index].getValue();
- if (value != null) {
- if (RenderResources.REFERENCE_NULL.equals(value)) {
- return null;
- }
-
- return new CharSequence[] { value };
- }
-
- Bridge.getLog().warning(LayoutLog.TAG_RESOURCES_FORMAT,
- String.format(
- String.format("Unknown value for getTextArray(%d) => %s", //DEBUG
- index, mResourceData[index].getName())), null /*data*/);
-
- return null;
- }
-
- /**
- * Retrieve the raw TypedValue for the attribute at <var>index</var>.
- *
- * @param index Index of attribute to retrieve.
- * @param outValue TypedValue object in which to place the attribute's
- * data.
- *
- * @return Returns true if the value was retrieved, else false.
- */
- @Override
- public boolean getValue(int index, TypedValue outValue) {
- if (index < 0 || index >= mResourceData.length) {
- return false;
- }
-
- if (mResourceData[index] == null) {
- return false;
- }
-
- String s = mResourceData[index].getValue();
-
- return ResourceHelper.parseFloatAttribute(mNames[index], s, outValue,
- false /*requireUnit*/);
- }
-
- /**
- * Determines whether there is an attribute at <var>index</var>.
- *
- * @param index Index of attribute to retrieve.
- *
- * @return True if the attribute has a value, false otherwise.
- */
- @Override
- public boolean hasValue(int index) {
- if (index < 0 || index >= mResourceData.length) {
- return false;
- }
-
- return mResourceData[index] != null;
- }
-
- /**
- * Retrieve the raw TypedValue for the attribute at <var>index</var>
- * and return a temporary object holding its data. This object is only
- * valid until the next call on to {@link TypedArray}.
- *
- * @param index Index of attribute to retrieve.
- *
- * @return Returns a TypedValue object if the attribute is defined,
- * containing its data; otherwise returns null. (You will not
- * receive a TypedValue whose type is TYPE_NULL.)
- */
- @Override
- public TypedValue peekValue(int index) {
- if (index < 0 || index >= mResourceData.length) {
- return null;
- }
-
- if (getValue(index, mValue)) {
- return mValue;
- }
-
- return null;
- }
-
- /**
- * Returns a message about the parser state suitable for printing error messages.
- */
- @Override
- public String getPositionDescription() {
- return "<internal -- stub if needed>";
- }
-
- /**
- * Give back a previously retrieved TypedArray, for later re-use.
- */
- @Override
- public void recycle() {
- // pass
- }
-
- @Override
- public String toString() {
- return Arrays.toString(mResourceData);
- }
- }
diff --git a/tools/layoutlib/bridge/src/android/content/res/Resources_Theme_Delegate.java b/tools/layoutlib/bridge/src/android/content/res/Resources_Theme_Delegate.java
deleted file mode 100644
index c9d615c..0000000
--- a/tools/layoutlib/bridge/src/android/content/res/Resources_Theme_Delegate.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright (C) 2011 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.content.res;
-
-import com.android.layoutlib.bridge.impl.RenderSessionImpl;
-import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
-
-import android.content.res.Resources.NotFoundException;
-import android.content.res.Resources.Theme;
-import android.util.AttributeSet;
-import android.util.TypedValue;
-
-/**
- * Delegate used to provide new implementation of a select few methods of {@link Resources$Theme}
- *
- * Through the layoutlib_create tool, the original methods of Theme have been replaced
- * by calls to methods of the same name in this delegate class.
- *
- */
-public class Resources_Theme_Delegate {
-
- @LayoutlibDelegate
- /*package*/ static TypedArray obtainStyledAttributes(
- Resources thisResources, Theme thisTheme,
- int[] attrs) {
- return RenderSessionImpl.getCurrentContext().obtainStyledAttributes(attrs);
- }
-
- @LayoutlibDelegate
- /*package*/ static TypedArray obtainStyledAttributes(
- Resources thisResources, Theme thisTheme,
- int resid, int[] attrs)
- throws NotFoundException {
- return RenderSessionImpl.getCurrentContext().obtainStyledAttributes(resid, attrs);
- }
-
- @LayoutlibDelegate
- /*package*/ static TypedArray obtainStyledAttributes(
- Resources thisResources, Theme thisTheme,
- AttributeSet set, int[] attrs, int defStyleAttr, int defStyleRes) {
- return RenderSessionImpl.getCurrentContext().obtainStyledAttributes(
- set, attrs, defStyleAttr, defStyleRes);
- }
-
- @LayoutlibDelegate
- /*package*/ static boolean resolveAttribute(
- Resources thisResources, Theme thisTheme,
- int resid, TypedValue outValue,
- boolean resolveRefs) {
- return RenderSessionImpl.getCurrentContext().resolveThemeAttribute(
- resid, outValue, resolveRefs);
- }
-}
diff --git a/tools/layoutlib/bridge/src/android/content/res/TypedArray_Delegate.java b/tools/layoutlib/bridge/src/android/content/res/TypedArray_Delegate.java
deleted file mode 100644
index 0a7899a..0000000
--- a/tools/layoutlib/bridge/src/android/content/res/TypedArray_Delegate.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (C) 2011 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.content.res;
-
-import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
-
-import android.util.TypedValue;
-
-public class TypedArray_Delegate {
-
- @LayoutlibDelegate
- public static boolean getValueAt(TypedArray theTypedArray, int index, TypedValue outValue) {
- // pass
- return false;
- }
-}
diff --git a/tools/layoutlib/bridge/src/android/graphics/AvoidXfermode_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/AvoidXfermode_Delegate.java
deleted file mode 100644
index a50a2bd..0000000
--- a/tools/layoutlib/bridge/src/android/graphics/AvoidXfermode_Delegate.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.graphics;
-
-import com.android.layoutlib.bridge.impl.DelegateManager;
-import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
-
-import java.awt.Composite;
-
-/**
- * Delegate implementing the native methods of android.graphics.AvoidXfermode
- *
- * Through the layoutlib_create tool, the original native methods of AvoidXfermode have been
- * replaced by calls to methods of the same name in this delegate class.
- *
- * This class behaves like the original native implementation, but in Java, keeping previously
- * native data into its own objects and mapping them to int that are sent back and forth between
- * it and the original AvoidXfermode class.
- *
- * Because this extends {@link Xfermode_Delegate}, there's no need to use a
- * {@link DelegateManager}, as all the PathEffect classes will be added to the manager owned by
- * {@link Xfermode_Delegate}.
- *
- */
-public class AvoidXfermode_Delegate extends Xfermode_Delegate {
-
- // ---- delegate data ----
-
- // ---- Public Helper methods ----
-
- @Override
- public Composite getComposite(int alpha) {
- // FIXME
- return null;
- }
-
- @Override
- public boolean isSupported() {
- return false;
- }
-
- @Override
- public String getSupportMessage() {
- return "Avoid Xfermodes are not supported in Layout Preview mode.";
- }
-
- // ---- native methods ----
-
- @LayoutlibDelegate
- /*package*/ static int nativeCreate(int opColor, int tolerance, int nativeMode) {
- AvoidXfermode_Delegate newDelegate = new AvoidXfermode_Delegate();
- return sManager.addNewDelegate(newDelegate);
- }
-
- // ---- Private delegate/helper methods ----
-}
diff --git a/tools/layoutlib/bridge/src/android/graphics/BidiRenderer.java b/tools/layoutlib/bridge/src/android/graphics/BidiRenderer.java
deleted file mode 100644
index 62d0a0d..0000000
--- a/tools/layoutlib/bridge/src/android/graphics/BidiRenderer.java
+++ /dev/null
@@ -1,215 +0,0 @@
-/*
- * Copyright (C) 2013 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.graphics;
-
-import java.awt.Font;
-import java.awt.Graphics2D;
-import java.awt.font.FontRenderContext;
-import java.awt.font.GlyphVector;
-import java.util.LinkedList;
-import java.util.List;
-
-import com.ibm.icu.lang.UScript;
-import com.ibm.icu.lang.UScriptRun;
-
-import android.graphics.Paint_Delegate.FontInfo;
-
-/**
- * Render the text by breaking it into various scripts and using the right font for each script.
- * Can be used to measure the text without actually drawing it.
- */
-@SuppressWarnings("deprecation")
-public class BidiRenderer {
-
- /* package */ static class ScriptRun {
- int start;
- int limit;
- boolean isRtl;
- int scriptCode;
- FontInfo font;
-
- public ScriptRun(int start, int limit, boolean isRtl) {
- this.start = start;
- this.limit = limit;
- this.isRtl = isRtl;
- this.scriptCode = UScript.INVALID_CODE;
- }
- }
-
- /* package */ Graphics2D graphics;
- /* package */ Paint_Delegate paint;
- /* package */ char[] text;
-
- /**
- * @param graphics May be null.
- * @param paint The Paint to use to get the fonts. Should not be null.
- * @param text Unidirectional text. Should not be null.
- */
- /* package */ BidiRenderer(Graphics2D graphics, Paint_Delegate paint, char[] text) {
- assert (paint != null);
- this.graphics = graphics;
- this.paint = paint;
- this.text = text;
- }
-
- /**
- * Render unidirectional text.
- *
- * This method can also be used to measure the width of the text without actually drawing it.
- *
- * @param start index of the first character
- * @param limit index of the first character that should not be rendered.
- * @param isRtl is the text right-to-left
- * @param advances If not null, then advances for each character to be rendered are returned
- * here.
- * @param advancesIndex index into advances from where the advances need to be filled.
- * @param draw If true and {@link graphics} is not null, draw the rendered text on the graphics
- * at the given co-ordinates
- * @param x The x-coordinate of the left edge of where the text should be drawn on the given
- * graphics.
- * @param y The y-coordinate at which to draw the text on the given graphics.
- * @return The x-coordinate of the right edge of the drawn text. In other words,
- * x + the width of the text.
- */
- /* package */ float renderText(int start, int limit, boolean isRtl, float advances[],
- int advancesIndex, boolean draw, float x, float y) {
- // We break the text into scripts and then select font based on it and then render each of
- // the script runs.
- for (ScriptRun run : getScriptRuns(text, start, limit, isRtl, paint.getFonts())) {
- int flag = Font.LAYOUT_NO_LIMIT_CONTEXT | Font.LAYOUT_NO_START_CONTEXT;
- flag |= isRtl ? Font.LAYOUT_RIGHT_TO_LEFT : Font.LAYOUT_LEFT_TO_RIGHT;
- x = renderScript(run.start, run.limit, run.font, flag, advances, advancesIndex, draw,
- x, y);
- advancesIndex += run.limit - run.start;
- }
- return x;
- }
-
- /**
- * Render a script run. Use the preferred font to render as much as possible. This also
- * implements a fallback mechanism to render characters that cannot be drawn using the
- * preferred font.
- *
- * @return x + width of the text drawn.
- */
- private float renderScript(int start, int limit, FontInfo preferredFont, int flag,
- float advances[], int advancesIndex, boolean draw, float x, float y) {
- List<FontInfo> fonts = paint.getFonts();
- if (fonts == null || preferredFont == null) {
- return x;
- }
-
- while (start < limit) {
- boolean foundFont = false;
- int canDisplayUpTo = preferredFont.mFont.canDisplayUpTo(text, start, limit);
- if (canDisplayUpTo == -1) {
- return render(start, limit, preferredFont, flag, advances, advancesIndex, draw,
- x, y);
- } else if (canDisplayUpTo > start) { // can draw something
- x = render(start, canDisplayUpTo, preferredFont, flag, advances, advancesIndex,
- draw, x, y);
- advancesIndex += canDisplayUpTo - start;
- start = canDisplayUpTo;
- }
-
- int charCount = Character.isHighSurrogate(text[start]) ? 2 : 1;
- for (FontInfo font : fonts) {
- canDisplayUpTo = font.mFont.canDisplayUpTo(text, start, start + charCount);
- if (canDisplayUpTo == -1) {
- x = render(start, start+charCount, font, flag, advances, advancesIndex, draw,
- x, y);
- start += charCount;
- advancesIndex += charCount;
- foundFont = true;
- break;
- }
- }
- if (!foundFont) {
- // No font can display this char. Use the preferred font. The char will most
- // probably appear as a box or a blank space. We could, probably, use some
- // heuristics and break the character into the base character and diacritics and
- // then draw it, but it's probably not worth the effort.
- x = render(start, start + charCount, preferredFont, flag, advances, advancesIndex,
- draw, x, y);
- start += charCount;
- advancesIndex += charCount;
- }
- }
- return x;
- }
-
- /**
- * Render the text with the given font.
- */
- private float render(int start, int limit, FontInfo font, int flag, float advances[],
- int advancesIndex, boolean draw, float x, float y) {
-
- float totalAdvance = 0;
- // Since the metrics don't have anti-aliasing set, we create a new FontRenderContext with
- // the anti-aliasing set.
- FontRenderContext f = font.mMetrics.getFontRenderContext();
- FontRenderContext frc = new FontRenderContext(f.getTransform(), paint.isAntiAliased(),
- f.usesFractionalMetrics());
- GlyphVector gv = font.mFont.layoutGlyphVector(frc, text, start, limit, flag);
- int ng = gv.getNumGlyphs();
- int[] ci = gv.getGlyphCharIndices(0, ng, null);
- for (int i = 0; i < ng; i++) {
- float adv = gv.getGlyphMetrics(i).getAdvanceX();
- if (advances != null) {
- int adv_idx = advancesIndex + ci[i];
- advances[adv_idx] += adv;
- }
- totalAdvance += adv;
- }
- if (draw && graphics != null) {
- graphics.drawGlyphVector(gv, x, y);
- }
- return x + totalAdvance;
- }
-
- // --- Static helper methods ---
-
- /* package */ static List<ScriptRun> getScriptRuns(char[] text, int start, int limit,
- boolean isRtl, List<FontInfo> fonts) {
- LinkedList<ScriptRun> scriptRuns = new LinkedList<ScriptRun>();
-
- int count = limit - start;
- UScriptRun uScriptRun = new UScriptRun(text, start, count);
- while (uScriptRun.next()) {
- int scriptStart = uScriptRun.getScriptStart();
- int scriptLimit = uScriptRun.getScriptLimit();
- ScriptRun run = new ScriptRun(scriptStart, scriptLimit, isRtl);
- run.scriptCode = uScriptRun.getScriptCode();
- setScriptFont(text, run, fonts);
- scriptRuns.add(run);
- }
-
- return scriptRuns;
- }
-
- // TODO: Replace this method with one which returns the font based on the scriptCode.
- private static void setScriptFont(char[] text, ScriptRun run,
- List<FontInfo> fonts) {
- for (FontInfo fontInfo : fonts) {
- if (fontInfo.mFont.canDisplayUpTo(text, run.start, run.limit) == -1) {
- run.font = fontInfo;
- return;
- }
- }
- run.font = fonts.get(0);
- }
-}
diff --git a/tools/layoutlib/bridge/src/android/graphics/BitmapFactory_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/BitmapFactory_Delegate.java
deleted file mode 100644
index 04ce9d0..0000000
--- a/tools/layoutlib/bridge/src/android/graphics/BitmapFactory_Delegate.java
+++ /dev/null
@@ -1,184 +0,0 @@
-/*
- * Copyright (C) 2011 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.graphics;
-
-import com.android.layoutlib.bridge.Bridge;
-import com.android.layoutlib.bridge.impl.DelegateManager;
-import com.android.ninepatch.NinePatchChunk;
-import com.android.resources.Density;
-import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
-
-import android.content.res.BridgeResources.NinePatchInputStream;
-import android.graphics.BitmapFactory.Options;
-import android.graphics.Bitmap_Delegate.BitmapCreateFlags;
-
-import java.io.FileDescriptor;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.EnumSet;
-import java.util.Set;
-
-/**
- * Delegate implementing the native methods of android.graphics.BitmapFactory
- *
- * Through the layoutlib_create tool, the original native methods of BitmapFactory have been
- * replaced by calls to methods of the same name in this delegate class.
- *
- * Because it's a stateless class to start with, there's no need to keep a {@link DelegateManager}
- * around to map int to instance of the delegate.
- *
- */
-/*package*/ class BitmapFactory_Delegate {
-
- // ------ Java delegates ------
-
- @LayoutlibDelegate
- /*package*/ static Bitmap finishDecode(Bitmap bm, Rect outPadding, Options opts) {
- if (bm == null || opts == null) {
- return bm;
- }
-
- final int density = opts.inDensity;
- if (density == 0) {
- return bm;
- }
-
- bm.setDensity(density);
- final int targetDensity = opts.inTargetDensity;
- if (targetDensity == 0 || density == targetDensity || density == opts.inScreenDensity) {
- return bm;
- }
-
- byte[] np = bm.getNinePatchChunk();
- final boolean isNinePatch = np != null && NinePatch.isNinePatchChunk(np);
- // DELEGATE CHANGE: never scale 9-patch
- if (opts.inScaled && isNinePatch == false) {
- float scale = targetDensity / (float)density;
- // TODO: This is very inefficient and should be done in native by Skia
- final Bitmap oldBitmap = bm;
- bm = Bitmap.createScaledBitmap(oldBitmap, (int) (bm.getWidth() * scale + 0.5f),
- (int) (bm.getHeight() * scale + 0.5f), true);
- oldBitmap.recycle();
-
- if (isNinePatch) {
- np = nativeScaleNinePatch(np, scale, outPadding);
- bm.setNinePatchChunk(np);
- }
- bm.setDensity(targetDensity);
- }
-
- return bm;
- }
-
-
- // ------ Native Delegates ------
-
- @LayoutlibDelegate
- /*package*/ static Bitmap nativeDecodeStream(InputStream is, byte[] storage,
- Rect padding, Options opts) {
- return nativeDecodeStream(is, storage, padding, opts, false, 1.f);
- }
-
- @LayoutlibDelegate
- /*package*/ static Bitmap nativeDecodeStream(InputStream is, byte[] storage,
- Rect padding, Options opts, boolean applyScale, float scale) {
- Bitmap bm = null;
-
- //TODO support rescaling
-
- Density density = Density.MEDIUM;
- Set<BitmapCreateFlags> bitmapCreateFlags = EnumSet.of(BitmapCreateFlags.MUTABLE);
- if (opts != null) {
- density = Density.getEnum(opts.inDensity);
- if (opts.inPremultiplied) {
- bitmapCreateFlags.add(BitmapCreateFlags.PREMULTIPLIED);
- }
- }
-
- try {
- if (is instanceof NinePatchInputStream) {
- NinePatchInputStream npis = (NinePatchInputStream) is;
- npis.disableFakeMarkSupport();
-
- // load the bitmap as a nine patch
- com.android.ninepatch.NinePatch ninePatch = com.android.ninepatch.NinePatch.load(
- npis, true /*is9Patch*/, false /*convert*/);
-
- // get the bitmap and chunk objects.
- bm = Bitmap_Delegate.createBitmap(ninePatch.getImage(), bitmapCreateFlags,
- density);
- NinePatchChunk chunk = ninePatch.getChunk();
-
- // put the chunk in the bitmap
- bm.setNinePatchChunk(NinePatch_Delegate.serialize(chunk));
-
- // read the padding
- int[] paddingarray = chunk.getPadding();
- padding.left = paddingarray[0];
- padding.top = paddingarray[1];
- padding.right = paddingarray[2];
- padding.bottom = paddingarray[3];
- } else {
- // load the bitmap directly.
- bm = Bitmap_Delegate.createBitmap(is, bitmapCreateFlags, density);
- }
- } catch (IOException e) {
- Bridge.getLog().error(null,"Failed to load image" , e, null);
- }
-
- return bm;
- }
-
- @LayoutlibDelegate
- /*package*/ static Bitmap nativeDecodeFileDescriptor(FileDescriptor fd,
- Rect padding, Options opts) {
- opts.inBitmap = null;
- return null;
- }
-
- @LayoutlibDelegate
- /*package*/ static Bitmap nativeDecodeAsset(int asset, Rect padding, Options opts) {
- opts.inBitmap = null;
- return null;
- }
-
- @LayoutlibDelegate
- /*package*/ static Bitmap nativeDecodeAsset(int asset, Rect padding, Options opts,
- boolean applyScale, float scale) {
- opts.inBitmap = null;
- return null;
- }
-
- @LayoutlibDelegate
- /*package*/ static Bitmap nativeDecodeByteArray(byte[] data, int offset,
- int length, Options opts) {
- opts.inBitmap = null;
- return null;
- }
-
- @LayoutlibDelegate
- /*package*/ static byte[] nativeScaleNinePatch(byte[] chunk, float scale, Rect pad) {
- // don't scale for now. This should not be called anyway since we re-implement
- // BitmapFactory.finishDecode();
- return chunk;
- }
-
- @LayoutlibDelegate
- /*package*/ static boolean nativeIsSeekable(FileDescriptor fd) {
- return true;
- }
-}
diff --git a/tools/layoutlib/bridge/src/android/graphics/BitmapShader_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/BitmapShader_Delegate.java
deleted file mode 100644
index 65a75b0..0000000
--- a/tools/layoutlib/bridge/src/android/graphics/BitmapShader_Delegate.java
+++ /dev/null
@@ -1,252 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.graphics;
-
-import com.android.ide.common.rendering.api.LayoutLog;
-import com.android.layoutlib.bridge.Bridge;
-import com.android.layoutlib.bridge.impl.DelegateManager;
-import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
-
-import android.graphics.Shader.TileMode;
-
-/**
- * Delegate implementing the native methods of android.graphics.BitmapShader
- *
- * Through the layoutlib_create tool, the original native methods of BitmapShader have been
- * replaced by calls to methods of the same name in this delegate class.
- *
- * This class behaves like the original native implementation, but in Java, keeping previously
- * native data into its own objects and mapping them to int that are sent back and forth between
- * it and the original BitmapShader class.
- *
- * Because this extends {@link Shader_Delegate}, there's no need to use a {@link DelegateManager},
- * as all the Shader classes will be added to the manager owned by {@link Shader_Delegate}.
- *
- * @see Shader_Delegate
- *
- */
-public class BitmapShader_Delegate extends Shader_Delegate {
-
- // ---- delegate data ----
- private java.awt.Paint mJavaPaint;
-
- // ---- Public Helper methods ----
-
- @Override
- public java.awt.Paint getJavaPaint() {
- return mJavaPaint;
- }
-
- @Override
- public boolean isSupported() {
- return true;
- }
-
- @Override
- public String getSupportMessage() {
- // no message since isSupported returns true;
- return null;
- }
-
- // ---- native methods ----
-
- @LayoutlibDelegate
- /*package*/ static int nativeCreate(int native_bitmap, int shaderTileModeX,
- int shaderTileModeY) {
- Bitmap_Delegate bitmap = Bitmap_Delegate.getDelegate(native_bitmap);
- if (bitmap == null) {
- return 0;
- }
-
- BitmapShader_Delegate newDelegate = new BitmapShader_Delegate(
- bitmap.getImage(),
- Shader_Delegate.getTileMode(shaderTileModeX),
- Shader_Delegate.getTileMode(shaderTileModeY));
- return sManager.addNewDelegate(newDelegate);
- }
-
- @LayoutlibDelegate
- /*package*/ static int nativePostCreate(int native_shader, int native_bitmap,
- int shaderTileModeX, int shaderTileModeY) {
- // pass, not needed.
- return 0;
- }
-
- // ---- Private delegate/helper methods ----
-
- private BitmapShader_Delegate(java.awt.image.BufferedImage image,
- TileMode tileModeX, TileMode tileModeY) {
- mJavaPaint = new BitmapShaderPaint(image, tileModeX, tileModeY);
- }
-
- private class BitmapShaderPaint implements java.awt.Paint {
- private final java.awt.image.BufferedImage mImage;
- private final TileMode mTileModeX;
- private final TileMode mTileModeY;
-
- BitmapShaderPaint(java.awt.image.BufferedImage image,
- TileMode tileModeX, TileMode tileModeY) {
- mImage = image;
- mTileModeX = tileModeX;
- mTileModeY = tileModeY;
- }
-
- @Override
- public java.awt.PaintContext createContext(
- java.awt.image.ColorModel colorModel,
- java.awt.Rectangle deviceBounds,
- java.awt.geom.Rectangle2D userBounds,
- java.awt.geom.AffineTransform xform,
- java.awt.RenderingHints hints) {
-
- java.awt.geom.AffineTransform canvasMatrix;
- try {
- canvasMatrix = xform.createInverse();
- } catch (java.awt.geom.NoninvertibleTransformException e) {
- Bridge.getLog().fidelityWarning(LayoutLog.TAG_MATRIX_INVERSE,
- "Unable to inverse matrix in BitmapShader", e, null /*data*/);
- canvasMatrix = new java.awt.geom.AffineTransform();
- }
-
- java.awt.geom.AffineTransform localMatrix = getLocalMatrix();
- try {
- localMatrix = localMatrix.createInverse();
- } catch (java.awt.geom.NoninvertibleTransformException e) {
- Bridge.getLog().fidelityWarning(LayoutLog.TAG_MATRIX_INVERSE,
- "Unable to inverse matrix in BitmapShader", e, null /*data*/);
- localMatrix = new java.awt.geom.AffineTransform();
- }
-
- return new BitmapShaderContext(canvasMatrix, localMatrix, colorModel);
- }
-
- private class BitmapShaderContext implements java.awt.PaintContext {
-
- private final java.awt.geom.AffineTransform mCanvasMatrix;
- private final java.awt.geom.AffineTransform mLocalMatrix;
- private final java.awt.image.ColorModel mColorModel;
-
- public BitmapShaderContext(
- java.awt.geom.AffineTransform canvasMatrix,
- java.awt.geom.AffineTransform localMatrix,
- java.awt.image.ColorModel colorModel) {
- mCanvasMatrix = canvasMatrix;
- mLocalMatrix = localMatrix;
- mColorModel = colorModel;
- }
-
- @Override
- public void dispose() {
- }
-
- @Override
- public java.awt.image.ColorModel getColorModel() {
- return mColorModel;
- }
-
- @Override
- public java.awt.image.Raster getRaster(int x, int y, int w, int h) {
- java.awt.image.BufferedImage image = new java.awt.image.BufferedImage(w, h,
- java.awt.image.BufferedImage.TYPE_INT_ARGB);
-
- int[] data = new int[w*h];
-
- int index = 0;
- float[] pt1 = new float[2];
- float[] pt2 = new float[2];
- for (int iy = 0 ; iy < h ; iy++) {
- for (int ix = 0 ; ix < w ; ix++) {
- // handle the canvas transform
- pt1[0] = x + ix;
- pt1[1] = y + iy;
- mCanvasMatrix.transform(pt1, 0, pt2, 0, 1);
-
- // handle the local matrix.
- pt1[0] = pt2[0];
- pt1[1] = pt2[1];
- mLocalMatrix.transform(pt1, 0, pt2, 0, 1);
-
- data[index++] = getColor(pt2[0], pt2[1]);
- }
- }
-
- image.setRGB(0 /*startX*/, 0 /*startY*/, w, h, data, 0 /*offset*/, w /*scansize*/);
-
- return image.getRaster();
- }
- }
-
- /**
- * Returns a color for an arbitrary point.
- */
- private int getColor(float fx, float fy) {
- int x = getCoordinate(Math.round(fx), mImage.getWidth(), mTileModeX);
- int y = getCoordinate(Math.round(fy), mImage.getHeight(), mTileModeY);
-
- return mImage.getRGB(x, y);
- }
-
- private int getCoordinate(int i, int size, TileMode mode) {
- if (i < 0) {
- switch (mode) {
- case CLAMP:
- i = 0;
- break;
- case REPEAT:
- i = size - 1 - (-i % size);
- break;
- case MIRROR:
- // this is the same as the positive side, just make the value positive
- // first.
- i = -i;
- int count = i / size;
- i = i % size;
-
- if ((count % 2) == 1) {
- i = size - 1 - i;
- }
- break;
- }
- } else if (i >= size) {
- switch (mode) {
- case CLAMP:
- i = size - 1;
- break;
- case REPEAT:
- i = i % size;
- break;
- case MIRROR:
- int count = i / size;
- i = i % size;
-
- if ((count % 2) == 1) {
- i = size - 1 - i;
- }
- break;
- }
- }
-
- return i;
- }
-
-
- @Override
- public int getTransparency() {
- return java.awt.Paint.TRANSLUCENT;
- }
- }
-}
diff --git a/tools/layoutlib/bridge/src/android/graphics/Bitmap_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/Bitmap_Delegate.java
deleted file mode 100644
index ec284ac..0000000
--- a/tools/layoutlib/bridge/src/android/graphics/Bitmap_Delegate.java
+++ /dev/null
@@ -1,659 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.graphics;
-
-import com.android.ide.common.rendering.api.LayoutLog;
-import com.android.layoutlib.bridge.Bridge;
-import com.android.layoutlib.bridge.impl.DelegateManager;
-import com.android.resources.Density;
-import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
-
-import android.graphics.Bitmap.Config;
-import android.os.Parcel;
-
-import java.awt.Graphics2D;
-import java.awt.image.BufferedImage;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.nio.Buffer;
-import java.util.Arrays;
-import java.util.EnumSet;
-import java.util.Set;
-
-import javax.imageio.ImageIO;
-
-/**
- * Delegate implementing the native methods of android.graphics.Bitmap
- *
- * Through the layoutlib_create tool, the original native methods of Bitmap have been replaced
- * by calls to methods of the same name in this delegate class.
- *
- * This class behaves like the original native implementation, but in Java, keeping previously
- * native data into its own objects and mapping them to int that are sent back and forth between
- * it and the original Bitmap class.
- *
- * @see DelegateManager
- *
- */
-public final class Bitmap_Delegate {
-
- public enum BitmapCreateFlags {
- PREMULTIPLIED, MUTABLE
- }
-
- // ---- delegate manager ----
- private static final DelegateManager<Bitmap_Delegate> sManager =
- new DelegateManager<Bitmap_Delegate>(Bitmap_Delegate.class);
-
- // ---- delegate helper data ----
-
- // ---- delegate data ----
- private final Config mConfig;
- private BufferedImage mImage;
- private boolean mHasAlpha = true;
- private boolean mHasMipMap = false; // TODO: check the default.
- private int mGenerationId = 0;
-
-
- // ---- Public Helper methods ----
-
- /**
- * Returns the native delegate associated to a given {@link Bitmap_Delegate} object.
- */
- public static Bitmap_Delegate getDelegate(Bitmap bitmap) {
- return sManager.getDelegate(bitmap.mNativeBitmap);
- }
-
- /**
- * Returns the native delegate associated to a given an int referencing a {@link Bitmap} object.
- */
- public static Bitmap_Delegate getDelegate(int native_bitmap) {
- return sManager.getDelegate(native_bitmap);
- }
-
- /**
- * Creates and returns a {@link Bitmap} initialized with the given file content.
- *
- * @param input the file from which to read the bitmap content
- * @param isMutable whether the bitmap is mutable
- * @param density the density associated with the bitmap
- *
- * @see Bitmap#isMutable()
- * @see Bitmap#getDensity()
- */
- public static Bitmap createBitmap(File input, boolean isMutable, Density density)
- throws IOException {
- return createBitmap(input, getPremultipliedBitmapCreateFlags(isMutable), density);
- }
-
- /**
- * Creates and returns a {@link Bitmap} initialized with the given file content.
- *
- * @param input the file from which to read the bitmap content
- * @param density the density associated with the bitmap
- *
- * @see Bitmap#isPremultiplied()
- * @see Bitmap#isMutable()
- * @see Bitmap#getDensity()
- */
- public static Bitmap createBitmap(File input, Set<BitmapCreateFlags> createFlags,
- Density density) throws IOException {
- // create a delegate with the content of the file.
- Bitmap_Delegate delegate = new Bitmap_Delegate(ImageIO.read(input), Config.ARGB_8888);
-
- return createBitmap(delegate, createFlags, density.getDpiValue());
- }
-
- /**
- * Creates and returns a {@link Bitmap} initialized with the given stream content.
- *
- * @param input the stream from which to read the bitmap content
- * @param isMutable whether the bitmap is mutable
- * @param density the density associated with the bitmap
- *
- * @see Bitmap#isMutable()
- * @see Bitmap#getDensity()
- */
- public static Bitmap createBitmap(InputStream input, boolean isMutable, Density density)
- throws IOException {
- return createBitmap(input, getPremultipliedBitmapCreateFlags(isMutable), density);
- }
-
- /**
- * Creates and returns a {@link Bitmap} initialized with the given stream content.
- *
- * @param input the stream from which to read the bitmap content
- * @param createFlags
- * @param density the density associated with the bitmap
- *
- * @see Bitmap#isPremultiplied()
- * @see Bitmap#isMutable()
- * @see Bitmap#getDensity()
- */
- public static Bitmap createBitmap(InputStream input, Set<BitmapCreateFlags> createFlags,
- Density density) throws IOException {
- // create a delegate with the content of the stream.
- Bitmap_Delegate delegate = new Bitmap_Delegate(ImageIO.read(input), Config.ARGB_8888);
-
- return createBitmap(delegate, createFlags, density.getDpiValue());
- }
-
- /**
- * Creates and returns a {@link Bitmap} initialized with the given {@link BufferedImage}
- *
- * @param image the bitmap content
- * @param isMutable whether the bitmap is mutable
- * @param density the density associated with the bitmap
- *
- * @see Bitmap#isMutable()
- * @see Bitmap#getDensity()
- */
- public static Bitmap createBitmap(BufferedImage image, boolean isMutable,
- Density density) throws IOException {
- return createBitmap(image, getPremultipliedBitmapCreateFlags(isMutable), density);
- }
-
- /**
- * Creates and returns a {@link Bitmap} initialized with the given {@link BufferedImage}
- *
- * @param image the bitmap content
- * @param createFlags
- * @param density the density associated with the bitmap
- *
- * @see Bitmap#isPremultiplied()
- * @see Bitmap#isMutable()
- * @see Bitmap#getDensity()
- */
- public static Bitmap createBitmap(BufferedImage image, Set<BitmapCreateFlags> createFlags,
- Density density) throws IOException {
- // create a delegate with the given image.
- Bitmap_Delegate delegate = new Bitmap_Delegate(image, Config.ARGB_8888);
-
- return createBitmap(delegate, createFlags, density.getDpiValue());
- }
-
- /**
- * Returns the {@link BufferedImage} used by the delegate of the given {@link Bitmap}.
- */
- public static BufferedImage getImage(Bitmap bitmap) {
- // get the delegate from the native int.
- Bitmap_Delegate delegate = sManager.getDelegate(bitmap.mNativeBitmap);
- if (delegate == null) {
- return null;
- }
-
- return delegate.mImage;
- }
-
- public static int getBufferedImageType(int nativeBitmapConfig) {
- switch (Config.nativeToConfig(nativeBitmapConfig)) {
- case ALPHA_8:
- return BufferedImage.TYPE_INT_ARGB;
- case RGB_565:
- return BufferedImage.TYPE_INT_ARGB;
- case ARGB_4444:
- return BufferedImage.TYPE_INT_ARGB;
- case ARGB_8888:
- return BufferedImage.TYPE_INT_ARGB;
- }
-
- return BufferedImage.TYPE_INT_ARGB;
- }
-
- /**
- * Returns the {@link BufferedImage} used by the delegate of the given {@link Bitmap}.
- */
- public BufferedImage getImage() {
- return mImage;
- }
-
- /**
- * Returns the Android bitmap config. Note that this not the config of the underlying
- * Java2D bitmap.
- */
- public Config getConfig() {
- return mConfig;
- }
-
- /**
- * Returns the hasAlpha rendering hint
- * @return true if the bitmap alpha should be used at render time
- */
- public boolean hasAlpha() {
- return mHasAlpha && mConfig != Config.RGB_565;
- }
-
- public boolean hasMipMap() {
- // TODO: check if more checks are required as in hasAlpha.
- return mHasMipMap;
- }
- /**
- * Update the generationId.
- *
- * @see Bitmap#getGenerationId()
- */
- public void change() {
- mGenerationId++;
- }
-
- // ---- native methods ----
-
- @LayoutlibDelegate
- /*package*/ static Bitmap nativeCreate(int[] colors, int offset, int stride, int width,
- int height, int nativeConfig, boolean isMutable) {
- int imageType = getBufferedImageType(nativeConfig);
-
- // create the image
- BufferedImage image = new BufferedImage(width, height, imageType);
-
- if (colors != null) {
- image.setRGB(0, 0, width, height, colors, offset, stride);
- }
-
- // create a delegate with the content of the stream.
- Bitmap_Delegate delegate = new Bitmap_Delegate(image, Config.nativeToConfig(nativeConfig));
-
- return createBitmap(delegate, getPremultipliedBitmapCreateFlags(isMutable),
- Bitmap.getDefaultDensity());
- }
-
- @LayoutlibDelegate
- /*package*/ static Bitmap nativeCopy(int srcBitmap, int nativeConfig, boolean isMutable) {
- Bitmap_Delegate srcBmpDelegate = sManager.getDelegate(srcBitmap);
- if (srcBmpDelegate == null) {
- return null;
- }
-
- BufferedImage srcImage = srcBmpDelegate.getImage();
-
- int width = srcImage.getWidth();
- int height = srcImage.getHeight();
-
- int imageType = getBufferedImageType(nativeConfig);
-
- // create the image
- BufferedImage image = new BufferedImage(width, height, imageType);
-
- // copy the source image into the image.
- int[] argb = new int[width * height];
- srcImage.getRGB(0, 0, width, height, argb, 0, width);
- image.setRGB(0, 0, width, height, argb, 0, width);
-
- // create a delegate with the content of the stream.
- Bitmap_Delegate delegate = new Bitmap_Delegate(image, Config.nativeToConfig(nativeConfig));
-
- return createBitmap(delegate, getPremultipliedBitmapCreateFlags(isMutable),
- Bitmap.getDefaultDensity());
- }
-
- @LayoutlibDelegate
- /*package*/ static void nativeDestructor(int nativeBitmap) {
- sManager.removeJavaReferenceFor(nativeBitmap);
- }
-
- @LayoutlibDelegate
- /*package*/ static void nativeRecycle(int nativeBitmap) {
- sManager.removeJavaReferenceFor(nativeBitmap);
- }
-
- @LayoutlibDelegate
- /*package*/ static boolean nativeCompress(int nativeBitmap, int format, int quality,
- OutputStream stream, byte[] tempStorage) {
- Bridge.getLog().error(LayoutLog.TAG_UNSUPPORTED,
- "Bitmap.compress() is not supported", null /*data*/);
- return true;
- }
-
- @LayoutlibDelegate
- /*package*/ static void nativeErase(int nativeBitmap, int color) {
- // get the delegate from the native int.
- Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap);
- if (delegate == null) {
- return;
- }
-
- BufferedImage image = delegate.mImage;
-
- Graphics2D g = image.createGraphics();
- try {
- g.setColor(new java.awt.Color(color, true));
-
- g.fillRect(0, 0, image.getWidth(), image.getHeight());
- } finally {
- g.dispose();
- }
- }
-
- @LayoutlibDelegate
- /*package*/ static int nativeWidth(int nativeBitmap) {
- // get the delegate from the native int.
- Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap);
- if (delegate == null) {
- return 0;
- }
-
- return delegate.mImage.getWidth();
- }
-
- @LayoutlibDelegate
- /*package*/ static int nativeHeight(int nativeBitmap) {
- // get the delegate from the native int.
- Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap);
- if (delegate == null) {
- return 0;
- }
-
- return delegate.mImage.getHeight();
- }
-
- @LayoutlibDelegate
- /*package*/ static int nativeRowBytes(int nativeBitmap) {
- // get the delegate from the native int.
- Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap);
- if (delegate == null) {
- return 0;
- }
-
- return delegate.mImage.getWidth();
- }
-
- @LayoutlibDelegate
- /*package*/ static int nativeConfig(int nativeBitmap) {
- // get the delegate from the native int.
- Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap);
- if (delegate == null) {
- return 0;
- }
-
- return delegate.mConfig.nativeInt;
- }
-
- @LayoutlibDelegate
- /*package*/ static boolean nativeHasAlpha(int nativeBitmap) {
- // get the delegate from the native int.
- Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap);
- if (delegate == null) {
- return true;
- }
-
- return delegate.mHasAlpha;
- }
-
- @LayoutlibDelegate
- /*package*/ static boolean nativeHasMipMap(int nativeBitmap) {
- // get the delegate from the native int.
- Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap);
- if (delegate == null) {
- return true;
- }
-
- return delegate.mHasMipMap;
- }
-
- @LayoutlibDelegate
- /*package*/ static int nativeGetPixel(int nativeBitmap, int x, int y) {
- // get the delegate from the native int.
- Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap);
- if (delegate == null) {
- return 0;
- }
-
- return delegate.mImage.getRGB(x, y);
- }
-
- @LayoutlibDelegate
- /*package*/ static void nativeGetPixels(int nativeBitmap, int[] pixels, int offset,
- int stride, int x, int y, int width, int height) {
- Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap);
- if (delegate == null) {
- return;
- }
-
- delegate.getImage().getRGB(x, y, width, height, pixels, offset, stride);
- }
-
-
- @LayoutlibDelegate
- /*package*/ static void nativeSetPixel(int nativeBitmap, int x, int y, int color) {
- Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap);
- if (delegate == null) {
- return;
- }
-
- delegate.getImage().setRGB(x, y, color);
- }
-
- @LayoutlibDelegate
- /*package*/ static void nativeSetPixels(int nativeBitmap, int[] colors, int offset,
- int stride, int x, int y, int width, int height) {
- Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap);
- if (delegate == null) {
- return;
- }
-
- delegate.getImage().setRGB(x, y, width, height, colors, offset, stride);
- }
-
- @LayoutlibDelegate
- /*package*/ static void nativeCopyPixelsToBuffer(int nativeBitmap, Buffer dst) {
- // FIXME implement native delegate
- Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED,
- "Bitmap.copyPixelsToBuffer is not supported.", null, null /*data*/);
- }
-
- @LayoutlibDelegate
- /*package*/ static void nativeCopyPixelsFromBuffer(int nb, Buffer src) {
- // FIXME implement native delegate
- Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED,
- "Bitmap.copyPixelsFromBuffer is not supported.", null, null /*data*/);
- }
-
- @LayoutlibDelegate
- /*package*/ static int nativeGenerationId(int nativeBitmap) {
- Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap);
- if (delegate == null) {
- return 0;
- }
-
- return delegate.mGenerationId;
- }
-
- @LayoutlibDelegate
- /*package*/ static Bitmap nativeCreateFromParcel(Parcel p) {
- // This is only called by Bitmap.CREATOR (Parcelable.Creator<Bitmap>), which is only
- // used during aidl call so really this should not be called.
- Bridge.getLog().error(LayoutLog.TAG_UNSUPPORTED,
- "AIDL is not suppored, and therefore Bitmaps cannot be created from parcels.",
- null /*data*/);
- return null;
- }
-
- @LayoutlibDelegate
- /*package*/ static boolean nativeWriteToParcel(int nativeBitmap, boolean isMutable,
- int density, Parcel p) {
- // This is only called when sending a bitmap through aidl, so really this should not
- // be called.
- Bridge.getLog().error(LayoutLog.TAG_UNSUPPORTED,
- "AIDL is not suppored, and therefore Bitmaps cannot be written to parcels.",
- null /*data*/);
- return false;
- }
-
- @LayoutlibDelegate
- /*package*/ static Bitmap nativeExtractAlpha(int nativeBitmap, int nativePaint,
- int[] offsetXY) {
- Bitmap_Delegate bitmap = sManager.getDelegate(nativeBitmap);
- if (bitmap == null) {
- return null;
- }
-
- // get the paint which can be null if nativePaint is 0.
- Paint_Delegate paint = Paint_Delegate.getDelegate(nativePaint);
-
- if (paint != null && paint.getMaskFilter() != null) {
- Bridge.getLog().fidelityWarning(LayoutLog.TAG_MASKFILTER,
- "MaskFilter not supported in Bitmap.extractAlpha",
- null, null /*data*/);
- }
-
- int alpha = paint != null ? paint.getAlpha() : 0xFF;
- BufferedImage image = createCopy(bitmap.getImage(), BufferedImage.TYPE_INT_ARGB, alpha);
-
- // create the delegate. The actual Bitmap config is only an alpha channel
- Bitmap_Delegate delegate = new Bitmap_Delegate(image, Config.ALPHA_8);
-
- // the density doesn't matter, it's set by the Java method.
- return createBitmap(delegate, EnumSet.of(BitmapCreateFlags.MUTABLE),
- Density.DEFAULT_DENSITY /*density*/);
- }
-
- @LayoutlibDelegate
- /*package*/ static void nativePrepareToDraw(int nativeBitmap) {
- // nothing to be done here.
- }
-
- @LayoutlibDelegate
- /*package*/ static void nativeSetHasAlpha(int nativeBitmap, boolean hasAlpha) {
- // get the delegate from the native int.
- Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap);
- if (delegate == null) {
- return;
- }
-
- delegate.mHasAlpha = hasAlpha;
- }
-
- @LayoutlibDelegate
- /*package*/ static void nativeSetHasMipMap(int nativeBitmap, boolean hasMipMap) {
- // get the delegate from the native int.
- Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap);
- if (delegate == null) {
- return;
- }
-
- delegate.mHasMipMap = hasMipMap;
- }
-
- @LayoutlibDelegate
- /*package*/ static boolean nativeSameAs(int nb0, int nb1) {
- Bitmap_Delegate delegate1 = sManager.getDelegate(nb0);
- if (delegate1 == null) {
- return false;
- }
-
- Bitmap_Delegate delegate2 = sManager.getDelegate(nb1);
- if (delegate2 == null) {
- return false;
- }
-
- BufferedImage image1 = delegate1.getImage();
- BufferedImage image2 = delegate2.getImage();
- if (delegate1.mConfig != delegate2.mConfig ||
- image1.getWidth() != image2.getWidth() ||
- image1.getHeight() != image2.getHeight()) {
- return false;
- }
-
- // get the internal data
- int w = image1.getWidth();
- int h = image2.getHeight();
- int[] argb1 = new int[w*h];
- int[] argb2 = new int[w*h];
-
- image1.getRGB(0, 0, w, h, argb1, 0, w);
- image2.getRGB(0, 0, w, h, argb2, 0, w);
-
- // compares
- if (delegate1.mConfig == Config.ALPHA_8) {
- // in this case we have to manually compare the alpha channel as the rest is garbage.
- final int length = w*h;
- for (int i = 0 ; i < length ; i++) {
- if ((argb1[i] & 0xFF000000) != (argb2[i] & 0xFF000000)) {
- return false;
- }
- }
- return true;
- }
-
- return Arrays.equals(argb1, argb2);
- }
-
- // ---- Private delegate/helper methods ----
-
- private Bitmap_Delegate(BufferedImage image, Config config) {
- mImage = image;
- mConfig = config;
- }
-
- private static Bitmap createBitmap(Bitmap_Delegate delegate,
- Set<BitmapCreateFlags> createFlags, int density) {
- // get its native_int
- int nativeInt = sManager.addNewDelegate(delegate);
-
- int width = delegate.mImage.getWidth();
- int height = delegate.mImage.getHeight();
- boolean isMutable = createFlags.contains(BitmapCreateFlags.MUTABLE);
- boolean isPremultiplied = createFlags.contains(BitmapCreateFlags.PREMULTIPLIED);
-
- // and create/return a new Bitmap with it
- return new Bitmap(nativeInt, null /* buffer */, width, height, density, isMutable,
- isPremultiplied, null /*ninePatchChunk*/, null /* layoutBounds */);
- }
-
- private static Set<BitmapCreateFlags> getPremultipliedBitmapCreateFlags(boolean isMutable) {
- Set<BitmapCreateFlags> createFlags = EnumSet.of(BitmapCreateFlags.PREMULTIPLIED);
- if (isMutable) {
- createFlags.add(BitmapCreateFlags.MUTABLE);
- }
- return createFlags;
- }
-
- /**
- * Creates and returns a copy of a given BufferedImage.
- * <p/>
- * if alpha is different than 255, then it is applied to the alpha channel of each pixel.
- *
- * @param image the image to copy
- * @param imageType the type of the new image
- * @param alpha an optional alpha modifier
- * @return a new BufferedImage
- */
- /*package*/ static BufferedImage createCopy(BufferedImage image, int imageType, int alpha) {
- int w = image.getWidth();
- int h = image.getHeight();
-
- BufferedImage result = new BufferedImage(w, h, imageType);
-
- int[] argb = new int[w * h];
- image.getRGB(0, 0, image.getWidth(), image.getHeight(), argb, 0, image.getWidth());
-
- if (alpha != 255) {
- final int length = argb.length;
- for (int i = 0 ; i < length; i++) {
- int a = (argb[i] >>> 24 * alpha) / 255;
- argb[i] = (a << 24) | (argb[i] & 0x00FFFFFF);
- }
- }
-
- result.setRGB(0, 0, w, h, argb, 0, w);
-
- return result;
- }
-
-}
diff --git a/tools/layoutlib/bridge/src/android/graphics/BlurMaskFilter_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/BlurMaskFilter_Delegate.java
deleted file mode 100644
index 4becba1..0000000
--- a/tools/layoutlib/bridge/src/android/graphics/BlurMaskFilter_Delegate.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.graphics;
-
-import com.android.layoutlib.bridge.impl.DelegateManager;
-import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
-
-/**
- * Delegate implementing the native methods of android.graphics.BlurMaskFilter
- *
- * Through the layoutlib_create tool, the original native methods of BlurMaskFilter have
- * been replaced by calls to methods of the same name in this delegate class.
- *
- * This class behaves like the original native implementation, but in Java, keeping previously
- * native data into its own objects and mapping them to int that are sent back and forth between
- * it and the original BlurMaskFilter class.
- *
- * Because this extends {@link MaskFilter_Delegate}, there's no need to use a
- * {@link DelegateManager}, as all the Shader classes will be added to the manager
- * owned by {@link MaskFilter_Delegate}.
- *
- * @see MaskFilter_Delegate
- *
- */
-public class BlurMaskFilter_Delegate extends MaskFilter_Delegate {
-
- // ---- delegate data ----
-
- // ---- Public Helper methods ----
-
- @Override
- public boolean isSupported() {
- return false;
- }
-
- @Override
- public String getSupportMessage() {
- return "Blur Mask Filters are not supported.";
- }
-
- // ---- native methods ----
-
- @LayoutlibDelegate
- /*package*/ static int nativeConstructor(float radius, int style) {
- BlurMaskFilter_Delegate newDelegate = new BlurMaskFilter_Delegate();
- return sManager.addNewDelegate(newDelegate);
- }
-
- // ---- Private delegate/helper methods ----
-}
diff --git a/tools/layoutlib/bridge/src/android/graphics/Canvas_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/Canvas_Delegate.java
deleted file mode 100644
index 62b47bd..0000000
--- a/tools/layoutlib/bridge/src/android/graphics/Canvas_Delegate.java
+++ /dev/null
@@ -1,1289 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.graphics;
-
-import com.android.ide.common.rendering.api.LayoutLog;
-import com.android.layoutlib.bridge.Bridge;
-import com.android.layoutlib.bridge.impl.DelegateManager;
-import com.android.layoutlib.bridge.impl.GcSnapshot;
-import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
-
-import android.graphics.Bitmap.Config;
-import android.text.TextUtils;
-
-import java.awt.Color;
-import java.awt.Composite;
-import java.awt.Graphics2D;
-import java.awt.Rectangle;
-import java.awt.RenderingHints;
-import java.awt.Shape;
-import java.awt.geom.AffineTransform;
-import java.awt.geom.Arc2D;
-import java.awt.image.BufferedImage;
-
-
-/**
- * Delegate implementing the native methods of android.graphics.Canvas
- *
- * Through the layoutlib_create tool, the original native methods of Canvas have been replaced
- * by calls to methods of the same name in this delegate class.
- *
- * This class behaves like the original native implementation, but in Java, keeping previously
- * native data into its own objects and mapping them to int that are sent back and forth between
- * it and the original Canvas class.
- *
- * @see DelegateManager
- *
- */
-public final class Canvas_Delegate {
-
- // ---- delegate manager ----
- private static final DelegateManager<Canvas_Delegate> sManager =
- new DelegateManager<Canvas_Delegate>(Canvas_Delegate.class);
-
- // ---- delegate helper data ----
-
- private final static boolean[] sBoolOut = new boolean[1];
-
- // ---- delegate data ----
- private Bitmap_Delegate mBitmap;
- private GcSnapshot mSnapshot;
-
- private DrawFilter_Delegate mDrawFilter = null;
-
- // ---- Public Helper methods ----
-
- /**
- * Returns the native delegate associated to a given {@link Canvas} object.
- */
- public static Canvas_Delegate getDelegate(Canvas canvas) {
- return sManager.getDelegate(canvas.mNativeCanvas);
- }
-
- /**
- * Returns the native delegate associated to a given an int referencing a {@link Canvas} object.
- */
- public static Canvas_Delegate getDelegate(int native_canvas) {
- return sManager.getDelegate(native_canvas);
- }
-
- /**
- * Returns the current {@link Graphics2D} used to draw.
- */
- public GcSnapshot getSnapshot() {
- return mSnapshot;
- }
-
- /**
- * Returns the {@link DrawFilter} delegate or null if none have been set.
- *
- * @return the delegate or null.
- */
- public DrawFilter_Delegate getDrawFilter() {
- return mDrawFilter;
- }
-
- // ---- native methods ----
-
- @LayoutlibDelegate
- /*package*/ static boolean isOpaque(Canvas thisCanvas) {
- // get the delegate from the native int.
- Canvas_Delegate canvasDelegate = sManager.getDelegate(thisCanvas.mNativeCanvas);
- if (canvasDelegate == null) {
- return false;
- }
-
- return canvasDelegate.mBitmap.getConfig() == Config.RGB_565;
- }
-
- @LayoutlibDelegate
- /*package*/ static int getWidth(Canvas thisCanvas) {
- // get the delegate from the native int.
- Canvas_Delegate canvasDelegate = sManager.getDelegate(thisCanvas.mNativeCanvas);
- if (canvasDelegate == null) {
- return 0;
- }
-
- return canvasDelegate.mBitmap.getImage().getWidth();
- }
-
- @LayoutlibDelegate
- /*package*/ static int getHeight(Canvas thisCanvas) {
- // get the delegate from the native int.
- Canvas_Delegate canvasDelegate = sManager.getDelegate(thisCanvas.mNativeCanvas);
- if (canvasDelegate == null) {
- return 0;
- }
-
- return canvasDelegate.mBitmap.getImage().getHeight();
- }
-
- @LayoutlibDelegate
- /*package*/ static void translate(Canvas thisCanvas, float dx, float dy) {
- // get the delegate from the native int.
- Canvas_Delegate canvasDelegate = sManager.getDelegate(thisCanvas.mNativeCanvas);
- if (canvasDelegate == null) {
- return;
- }
-
- canvasDelegate.getSnapshot().translate(dx, dy);
- }
-
- @LayoutlibDelegate
- /*package*/ static void rotate(Canvas thisCanvas, float degrees) {
- // get the delegate from the native int.
- Canvas_Delegate canvasDelegate = sManager.getDelegate(thisCanvas.mNativeCanvas);
- if (canvasDelegate == null) {
- return;
- }
-
- canvasDelegate.getSnapshot().rotate(Math.toRadians(degrees));
- }
-
- @LayoutlibDelegate
- /*package*/ static void scale(Canvas thisCanvas, float sx, float sy) {
- // get the delegate from the native int.
- Canvas_Delegate canvasDelegate = sManager.getDelegate(thisCanvas.mNativeCanvas);
- if (canvasDelegate == null) {
- return;
- }
-
- canvasDelegate.getSnapshot().scale(sx, sy);
- }
-
- @LayoutlibDelegate
- /*package*/ static void skew(Canvas thisCanvas, float kx, float ky) {
- // get the delegate from the native int.
- Canvas_Delegate canvasDelegate = sManager.getDelegate(thisCanvas.mNativeCanvas);
- if (canvasDelegate == null) {
- return;
- }
-
- // get the current top graphics2D object.
- GcSnapshot g = canvasDelegate.getSnapshot();
-
- // get its current matrix
- AffineTransform currentTx = g.getTransform();
- // get the AffineTransform for the given skew.
- float[] mtx = Matrix_Delegate.getSkew(kx, ky);
- AffineTransform matrixTx = Matrix_Delegate.getAffineTransform(mtx);
-
- // combine them so that the given matrix is applied after.
- currentTx.preConcatenate(matrixTx);
-
- // give it to the graphics2D as a new matrix replacing all previous transform
- g.setTransform(currentTx);
- }
-
- @LayoutlibDelegate
- /*package*/ static boolean clipRect(Canvas thisCanvas, RectF rect) {
- return clipRect(thisCanvas, rect.left, rect.top, rect.right, rect.bottom);
- }
-
- @LayoutlibDelegate
- /*package*/ static boolean clipRect(Canvas thisCanvas, Rect rect) {
- return clipRect(thisCanvas, (float) rect.left, (float) rect.top,
- (float) rect.right, (float) rect.bottom);
- }
-
- @LayoutlibDelegate
- /*package*/ static boolean clipRect(Canvas thisCanvas, float left, float top, float right,
- float bottom) {
- // get the delegate from the native int.
- Canvas_Delegate canvasDelegate = sManager.getDelegate(thisCanvas.mNativeCanvas);
- if (canvasDelegate == null) {
- return false;
- }
-
- return canvasDelegate.clipRect(left, top, right, bottom, Region.Op.INTERSECT.nativeInt);
- }
-
- @LayoutlibDelegate
- /*package*/ static boolean clipRect(Canvas thisCanvas, int left, int top, int right,
- int bottom) {
-
- return clipRect(thisCanvas, (float) left, (float) top, (float) right, (float) bottom);
- }
-
- @LayoutlibDelegate
- /*package*/ static int save(Canvas thisCanvas) {
- return save(thisCanvas, Canvas.MATRIX_SAVE_FLAG | Canvas.CLIP_SAVE_FLAG);
- }
-
- @LayoutlibDelegate
- /*package*/ static int save(Canvas thisCanvas, int saveFlags) {
- // get the delegate from the native int.
- Canvas_Delegate canvasDelegate = sManager.getDelegate(thisCanvas.mNativeCanvas);
- if (canvasDelegate == null) {
- return 0;
- }
-
- return canvasDelegate.save(saveFlags);
- }
-
- @LayoutlibDelegate
- /*package*/ static void restore(Canvas thisCanvas) {
- // get the delegate from the native int.
- Canvas_Delegate canvasDelegate = sManager.getDelegate(thisCanvas.mNativeCanvas);
- if (canvasDelegate == null) {
- return;
- }
-
- canvasDelegate.restore();
- }
-
- @LayoutlibDelegate
- /*package*/ static int getSaveCount(Canvas thisCanvas) {
- // get the delegate from the native int.
- Canvas_Delegate canvasDelegate = sManager.getDelegate(thisCanvas.mNativeCanvas);
- if (canvasDelegate == null) {
- return 0;
- }
-
- return canvasDelegate.getSnapshot().size();
- }
-
- @LayoutlibDelegate
- /*package*/ static void restoreToCount(Canvas thisCanvas, int saveCount) {
- // get the delegate from the native int.
- Canvas_Delegate canvasDelegate = sManager.getDelegate(thisCanvas.mNativeCanvas);
- if (canvasDelegate == null) {
- return;
- }
-
- canvasDelegate.restoreTo(saveCount);
- }
-
- @LayoutlibDelegate
- /*package*/ static void drawPoints(Canvas thisCanvas, float[] pts, int offset, int count,
- Paint paint) {
- // FIXME
- Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED,
- "Canvas.drawPoint is not supported.", null, null /*data*/);
- }
-
- @LayoutlibDelegate
- /*package*/ static void drawPoint(Canvas thisCanvas, float x, float y, Paint paint) {
- // FIXME
- Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED,
- "Canvas.drawPoint is not supported.", null, null /*data*/);
- }
-
- @LayoutlibDelegate
- /*package*/ static void drawLines(Canvas thisCanvas,
- final float[] pts, final int offset, final int count,
- Paint paint) {
- draw(thisCanvas.mNativeCanvas, paint.mNativePaint, false /*compositeOnly*/,
- false /*forceSrcMode*/, new GcSnapshot.Drawable() {
- @Override
- public void draw(Graphics2D graphics, Paint_Delegate paintDelegate) {
- for (int i = 0 ; i < count ; i += 4) {
- graphics.drawLine((int)pts[i + offset], (int)pts[i + offset + 1],
- (int)pts[i + offset + 2], (int)pts[i + offset + 3]);
- }
- }
- });
- }
-
- @LayoutlibDelegate
- /*package*/ static void freeCaches() {
- // nothing to be done here.
- }
-
- @LayoutlibDelegate
- /*package*/ static void freeTextLayoutCaches() {
- // nothing to be done here yet.
- }
-
- @LayoutlibDelegate
- /*package*/ static int initRaster(int nativeBitmapOrZero) {
- if (nativeBitmapOrZero > 0) {
- // get the Bitmap from the int
- Bitmap_Delegate bitmapDelegate = Bitmap_Delegate.getDelegate(nativeBitmapOrZero);
-
- // create a new Canvas_Delegate with the given bitmap and return its new native int.
- Canvas_Delegate newDelegate = new Canvas_Delegate(bitmapDelegate);
-
- return sManager.addNewDelegate(newDelegate);
- }
-
- // create a new Canvas_Delegate and return its new native int.
- Canvas_Delegate newDelegate = new Canvas_Delegate();
-
- return sManager.addNewDelegate(newDelegate);
- }
-
- @LayoutlibDelegate
- /*package*/ static void copyNativeCanvasState(int srcCanvas, int dstCanvas) {
- // get the delegate from the native int.
- Canvas_Delegate srcCanvasDelegate = sManager.getDelegate(srcCanvas);
- if (srcCanvasDelegate == null) {
- return;
- }
-
- // get the delegate from the native int.
- Canvas_Delegate dstCanvasDelegate = sManager.getDelegate(dstCanvas);
- if (dstCanvasDelegate == null) {
- return;
- }
- // TODO: actually copy the canvas state.
- }
-
- @LayoutlibDelegate
- /*package*/ static int native_saveLayer(int nativeCanvas, RectF bounds,
- int paint, int layerFlags) {
- // get the delegate from the native int.
- Canvas_Delegate canvasDelegate = sManager.getDelegate(nativeCanvas);
- if (canvasDelegate == null) {
- return 0;
- }
-
- Paint_Delegate paintDelegate = Paint_Delegate.getDelegate(paint);
- if (paintDelegate == null) {
- return 0;
- }
-
- return canvasDelegate.saveLayer(bounds, paintDelegate, layerFlags);
- }
-
- @LayoutlibDelegate
- /*package*/ static int native_saveLayer(int nativeCanvas, float l,
- float t, float r, float b,
- int paint, int layerFlags) {
- // get the delegate from the native int.
- Canvas_Delegate canvasDelegate = sManager.getDelegate(nativeCanvas);
- if (canvasDelegate == null) {
- return 0;
- }
-
- Paint_Delegate paintDelegate = Paint_Delegate.getDelegate(paint);
- if (paintDelegate == null) {
- return 0;
- }
-
- return canvasDelegate.saveLayer(new RectF(l, t, r, b),
- paintDelegate, layerFlags);
- }
-
- @LayoutlibDelegate
- /*package*/ static int native_saveLayerAlpha(int nativeCanvas,
- RectF bounds, int alpha,
- int layerFlags) {
- // get the delegate from the native int.
- Canvas_Delegate canvasDelegate = sManager.getDelegate(nativeCanvas);
- if (canvasDelegate == null) {
- return 0;
- }
-
- return canvasDelegate.saveLayerAlpha(bounds, alpha, layerFlags);
- }
-
- @LayoutlibDelegate
- /*package*/ static int native_saveLayerAlpha(int nativeCanvas, float l,
- float t, float r, float b,
- int alpha, int layerFlags) {
- // get the delegate from the native int.
- Canvas_Delegate canvasDelegate = sManager.getDelegate(nativeCanvas);
- if (canvasDelegate == null) {
- return 0;
- }
-
- return canvasDelegate.saveLayerAlpha(new RectF(l, t, r, b), alpha, layerFlags);
- }
-
-
- @LayoutlibDelegate
- /*package*/ static void native_concat(int nCanvas, int nMatrix) {
- // get the delegate from the native int.
- Canvas_Delegate canvasDelegate = sManager.getDelegate(nCanvas);
- if (canvasDelegate == null) {
- return;
- }
-
- Matrix_Delegate matrixDelegate = Matrix_Delegate.getDelegate(nMatrix);
- if (matrixDelegate == null) {
- return;
- }
-
- // get the current top graphics2D object.
- GcSnapshot snapshot = canvasDelegate.getSnapshot();
-
- // get its current matrix
- AffineTransform currentTx = snapshot.getTransform();
- // get the AffineTransform of the given matrix
- AffineTransform matrixTx = matrixDelegate.getAffineTransform();
-
- // combine them so that the given matrix is applied after.
- currentTx.concatenate(matrixTx);
-
- // give it to the graphics2D as a new matrix replacing all previous transform
- snapshot.setTransform(currentTx);
- }
-
- @LayoutlibDelegate
- /*package*/ static void native_setMatrix(int nCanvas, int nMatrix) {
- // get the delegate from the native int.
- Canvas_Delegate canvasDelegate = sManager.getDelegate(nCanvas);
- if (canvasDelegate == null) {
- return;
- }
-
- Matrix_Delegate matrixDelegate = Matrix_Delegate.getDelegate(nMatrix);
- if (matrixDelegate == null) {
- return;
- }
-
- // get the current top graphics2D object.
- GcSnapshot snapshot = canvasDelegate.getSnapshot();
-
- // get the AffineTransform of the given matrix
- AffineTransform matrixTx = matrixDelegate.getAffineTransform();
-
- // give it to the graphics2D as a new matrix replacing all previous transform
- snapshot.setTransform(matrixTx);
-
- if (matrixDelegate.hasPerspective()) {
- assert false;
- Bridge.getLog().fidelityWarning(LayoutLog.TAG_MATRIX_AFFINE,
- "android.graphics.Canvas#setMatrix(android.graphics.Matrix) only " +
- "supports affine transformations.", null, null /*data*/);
- }
- }
-
- @LayoutlibDelegate
- /*package*/ static boolean native_clipRect(int nCanvas,
- float left, float top,
- float right, float bottom,
- int regionOp) {
-
- // get the delegate from the native int.
- Canvas_Delegate canvasDelegate = sManager.getDelegate(nCanvas);
- if (canvasDelegate == null) {
- return false;
- }
-
- return canvasDelegate.clipRect(left, top, right, bottom, regionOp);
- }
-
- @LayoutlibDelegate
- /*package*/ static boolean native_clipPath(int nativeCanvas,
- int nativePath,
- int regionOp) {
- Canvas_Delegate canvasDelegate = sManager.getDelegate(nativeCanvas);
- if (canvasDelegate == null) {
- return true;
- }
-
- Path_Delegate pathDelegate = Path_Delegate.getDelegate(nativePath);
- if (pathDelegate == null) {
- return true;
- }
-
- return canvasDelegate.mSnapshot.clip(pathDelegate.getJavaShape(), regionOp);
- }
-
- @LayoutlibDelegate
- /*package*/ static boolean native_clipRegion(int nativeCanvas,
- int nativeRegion,
- int regionOp) {
- Canvas_Delegate canvasDelegate = sManager.getDelegate(nativeCanvas);
- if (canvasDelegate == null) {
- return true;
- }
-
- Region_Delegate region = Region_Delegate.getDelegate(nativeRegion);
- if (region == null) {
- return true;
- }
-
- return canvasDelegate.mSnapshot.clip(region.getJavaArea(), regionOp);
- }
-
- @LayoutlibDelegate
- /*package*/ static void nativeSetDrawFilter(int nativeCanvas, int nativeFilter) {
- Canvas_Delegate canvasDelegate = sManager.getDelegate(nativeCanvas);
- if (canvasDelegate == null) {
- return;
- }
-
- canvasDelegate.mDrawFilter = DrawFilter_Delegate.getDelegate(nativeFilter);
-
- if (canvasDelegate.mDrawFilter != null &&
- canvasDelegate.mDrawFilter.isSupported() == false) {
- Bridge.getLog().fidelityWarning(LayoutLog.TAG_DRAWFILTER,
- canvasDelegate.mDrawFilter.getSupportMessage(), null, null /*data*/);
- }
- }
-
- @LayoutlibDelegate
- /*package*/ static boolean native_getClipBounds(int nativeCanvas,
- Rect bounds) {
- // get the delegate from the native int.
- Canvas_Delegate canvasDelegate = sManager.getDelegate(nativeCanvas);
- if (canvasDelegate == null) {
- return false;
- }
-
- Rectangle rect = canvasDelegate.getSnapshot().getClip().getBounds();
- if (rect != null && rect.isEmpty() == false) {
- bounds.left = rect.x;
- bounds.top = rect.y;
- bounds.right = rect.x + rect.width;
- bounds.bottom = rect.y + rect.height;
- return true;
- }
-
- return false;
- }
-
- @LayoutlibDelegate
- /*package*/ static void native_getCTM(int canvas, int matrix) {
- // get the delegate from the native int.
- Canvas_Delegate canvasDelegate = sManager.getDelegate(canvas);
- if (canvasDelegate == null) {
- return;
- }
-
- Matrix_Delegate matrixDelegate = Matrix_Delegate.getDelegate(matrix);
- if (matrixDelegate == null) {
- return;
- }
-
- AffineTransform transform = canvasDelegate.getSnapshot().getTransform();
- matrixDelegate.set(Matrix_Delegate.makeValues(transform));
- }
-
- @LayoutlibDelegate
- /*package*/ static boolean native_quickReject(int nativeCanvas,
- RectF rect) {
- // FIXME properly implement quickReject
- return false;
- }
-
- @LayoutlibDelegate
- /*package*/ static boolean native_quickReject(int nativeCanvas,
- int path) {
- // FIXME properly implement quickReject
- return false;
- }
-
- @LayoutlibDelegate
- /*package*/ static boolean native_quickReject(int nativeCanvas,
- float left, float top,
- float right, float bottom) {
- // FIXME properly implement quickReject
- return false;
- }
-
- @LayoutlibDelegate
- /*package*/ static void native_drawRGB(int nativeCanvas, int r, int g, int b) {
- native_drawColor(nativeCanvas, 0xFF000000 | r << 16 | (g&0xFF) << 8 | (b&0xFF),
- PorterDuff.Mode.SRC_OVER.nativeInt);
-
- }
-
- @LayoutlibDelegate
- /*package*/ static void native_drawARGB(int nativeCanvas, int a, int r, int g, int b) {
- native_drawColor(nativeCanvas, a << 24 | (r&0xFF) << 16 | (g&0xFF) << 8 | (b&0xFF),
- PorterDuff.Mode.SRC_OVER.nativeInt);
- }
-
- @LayoutlibDelegate
- /*package*/ static void native_drawColor(int nativeCanvas, int color) {
- native_drawColor(nativeCanvas, color, PorterDuff.Mode.SRC_OVER.nativeInt);
- }
-
- @LayoutlibDelegate
- /*package*/ static void native_drawColor(int nativeCanvas, final int color, final int mode) {
- // get the delegate from the native int.
- Canvas_Delegate canvasDelegate = sManager.getDelegate(nativeCanvas);
- if (canvasDelegate == null) {
- return;
- }
-
- final int w = canvasDelegate.mBitmap.getImage().getWidth();
- final int h = canvasDelegate.mBitmap.getImage().getHeight();
- draw(nativeCanvas, new GcSnapshot.Drawable() {
-
- @Override
- public void draw(Graphics2D graphics, Paint_Delegate paint) {
- // reset its transform just in case
- graphics.setTransform(new AffineTransform());
-
- // set the color
- graphics.setColor(new Color(color, true /*alpha*/));
-
- Composite composite = PorterDuffXfermode_Delegate.getComposite(
- PorterDuffXfermode_Delegate.getPorterDuffMode(mode), 0xFF);
- if (composite != null) {
- graphics.setComposite(composite);
- }
-
- graphics.fillRect(0, 0, w, h);
- }
- });
- }
-
- @LayoutlibDelegate
- /*package*/ static void native_drawPaint(int nativeCanvas, int paint) {
- // FIXME
- Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED,
- "Canvas.drawPaint is not supported.", null, null /*data*/);
- }
-
- @LayoutlibDelegate
- /*package*/ static void native_drawLine(int nativeCanvas,
- final float startX, final float startY, final float stopX, final float stopY,
- int paint) {
-
- draw(nativeCanvas, paint, false /*compositeOnly*/, false /*forceSrcMode*/,
- new GcSnapshot.Drawable() {
- @Override
- public void draw(Graphics2D graphics, Paint_Delegate paintDelegate) {
- graphics.drawLine((int)startX, (int)startY, (int)stopX, (int)stopY);
- }
- });
- }
-
- @LayoutlibDelegate
- /*package*/ static void native_drawRect(int nativeCanvas, RectF rect,
- int paint) {
- native_drawRect(nativeCanvas, rect.left, rect.top, rect.right, rect.bottom, paint);
- }
-
- @LayoutlibDelegate
- /*package*/ static void native_drawRect(int nativeCanvas,
- final float left, final float top, final float right, final float bottom, int paint) {
-
- draw(nativeCanvas, paint, false /*compositeOnly*/, false /*forceSrcMode*/,
- new GcSnapshot.Drawable() {
- @Override
- public void draw(Graphics2D graphics, Paint_Delegate paintDelegate) {
- int style = paintDelegate.getStyle();
-
- // draw
- if (style == Paint.Style.FILL.nativeInt ||
- style == Paint.Style.FILL_AND_STROKE.nativeInt) {
- graphics.fillRect((int)left, (int)top,
- (int)(right-left), (int)(bottom-top));
- }
-
- if (style == Paint.Style.STROKE.nativeInt ||
- style == Paint.Style.FILL_AND_STROKE.nativeInt) {
- graphics.drawRect((int)left, (int)top,
- (int)(right-left), (int)(bottom-top));
- }
- }
- });
- }
-
- @LayoutlibDelegate
- /*package*/ static void native_drawOval(int nativeCanvas, final RectF oval, int paint) {
- if (oval.right > oval.left && oval.bottom > oval.top) {
- draw(nativeCanvas, paint, false /*compositeOnly*/, false /*forceSrcMode*/,
- new GcSnapshot.Drawable() {
- @Override
- public void draw(Graphics2D graphics, Paint_Delegate paintDelegate) {
- int style = paintDelegate.getStyle();
-
- // draw
- if (style == Paint.Style.FILL.nativeInt ||
- style == Paint.Style.FILL_AND_STROKE.nativeInt) {
- graphics.fillOval((int)oval.left, (int)oval.top,
- (int)oval.width(), (int)oval.height());
- }
-
- if (style == Paint.Style.STROKE.nativeInt ||
- style == Paint.Style.FILL_AND_STROKE.nativeInt) {
- graphics.drawOval((int)oval.left, (int)oval.top,
- (int)oval.width(), (int)oval.height());
- }
- }
- });
- }
- }
-
- @LayoutlibDelegate
- /*package*/ static void native_drawCircle(int nativeCanvas,
- float cx, float cy, float radius, int paint) {
- native_drawOval(nativeCanvas,
- new RectF(cx - radius, cy - radius, cx + radius, cy + radius),
- paint);
- }
-
- @LayoutlibDelegate
- /*package*/ static void native_drawArc(int nativeCanvas,
- final RectF oval, final float startAngle, final float sweep,
- final boolean useCenter, int paint) {
- if (oval.right > oval.left && oval.bottom > oval.top) {
- draw(nativeCanvas, paint, false /*compositeOnly*/, false /*forceSrcMode*/,
- new GcSnapshot.Drawable() {
- @Override
- public void draw(Graphics2D graphics, Paint_Delegate paintDelegate) {
- int style = paintDelegate.getStyle();
-
- Arc2D.Float arc = new Arc2D.Float(
- oval.left, oval.top, oval.width(), oval.height(),
- -startAngle, -sweep,
- useCenter ? Arc2D.PIE : Arc2D.OPEN);
-
- // draw
- if (style == Paint.Style.FILL.nativeInt ||
- style == Paint.Style.FILL_AND_STROKE.nativeInt) {
- graphics.fill(arc);
- }
-
- if (style == Paint.Style.STROKE.nativeInt ||
- style == Paint.Style.FILL_AND_STROKE.nativeInt) {
- graphics.draw(arc);
- }
- }
- });
- }
- }
-
- @LayoutlibDelegate
- /*package*/ static void native_drawRoundRect(int nativeCanvas,
- final RectF rect, final float rx, final float ry, int paint) {
-
- draw(nativeCanvas, paint, false /*compositeOnly*/, false /*forceSrcMode*/,
- new GcSnapshot.Drawable() {
- @Override
- public void draw(Graphics2D graphics, Paint_Delegate paintDelegate) {
- int style = paintDelegate.getStyle();
-
- // draw
- if (style == Paint.Style.FILL.nativeInt ||
- style == Paint.Style.FILL_AND_STROKE.nativeInt) {
- graphics.fillRoundRect(
- (int)rect.left, (int)rect.top,
- (int)rect.width(), (int)rect.height(),
- (int)rx, (int)ry);
- }
-
- if (style == Paint.Style.STROKE.nativeInt ||
- style == Paint.Style.FILL_AND_STROKE.nativeInt) {
- graphics.drawRoundRect(
- (int)rect.left, (int)rect.top,
- (int)rect.width(), (int)rect.height(),
- (int)rx, (int)ry);
- }
- }
- });
- }
-
- @LayoutlibDelegate
- /*package*/ static void native_drawPath(int nativeCanvas, int path, int paint) {
- final Path_Delegate pathDelegate = Path_Delegate.getDelegate(path);
- if (pathDelegate == null) {
- return;
- }
-
- draw(nativeCanvas, paint, false /*compositeOnly*/, false /*forceSrcMode*/,
- new GcSnapshot.Drawable() {
- @Override
- public void draw(Graphics2D graphics, Paint_Delegate paintDelegate) {
- Shape shape = pathDelegate.getJavaShape();
- int style = paintDelegate.getStyle();
-
- if (style == Paint.Style.FILL.nativeInt ||
- style == Paint.Style.FILL_AND_STROKE.nativeInt) {
- graphics.fill(shape);
- }
-
- if (style == Paint.Style.STROKE.nativeInt ||
- style == Paint.Style.FILL_AND_STROKE.nativeInt) {
- graphics.draw(shape);
- }
- }
- });
- }
-
- @LayoutlibDelegate
- /*package*/ static void native_drawBitmap(Canvas thisCanvas, int nativeCanvas, int bitmap,
- float left, float top,
- int nativePaintOrZero,
- int canvasDensity,
- int screenDensity,
- int bitmapDensity) {
- // get the delegate from the native int.
- Bitmap_Delegate bitmapDelegate = Bitmap_Delegate.getDelegate(bitmap);
- if (bitmapDelegate == null) {
- return;
- }
-
- BufferedImage image = bitmapDelegate.getImage();
- float right = left + image.getWidth();
- float bottom = top + image.getHeight();
-
- drawBitmap(nativeCanvas, bitmapDelegate, nativePaintOrZero,
- 0, 0, image.getWidth(), image.getHeight(),
- (int)left, (int)top, (int)right, (int)bottom);
- }
-
- @LayoutlibDelegate
- /*package*/ static void native_drawBitmap(Canvas thisCanvas, int nativeCanvas, int bitmap,
- Rect src, RectF dst,
- int nativePaintOrZero,
- int screenDensity,
- int bitmapDensity) {
- // get the delegate from the native int.
- Bitmap_Delegate bitmapDelegate = Bitmap_Delegate.getDelegate(bitmap);
- if (bitmapDelegate == null) {
- return;
- }
-
- BufferedImage image = bitmapDelegate.getImage();
-
- if (src == null) {
- drawBitmap(nativeCanvas, bitmapDelegate, nativePaintOrZero,
- 0, 0, image.getWidth(), image.getHeight(),
- (int)dst.left, (int)dst.top, (int)dst.right, (int)dst.bottom);
- } else {
- drawBitmap(nativeCanvas, bitmapDelegate, nativePaintOrZero,
- src.left, src.top, src.width(), src.height(),
- (int)dst.left, (int)dst.top, (int)dst.right, (int)dst.bottom);
- }
- }
-
- @LayoutlibDelegate
- /*package*/ static void native_drawBitmap(int nativeCanvas, int bitmap,
- Rect src, Rect dst,
- int nativePaintOrZero,
- int screenDensity,
- int bitmapDensity) {
- // get the delegate from the native int.
- Bitmap_Delegate bitmapDelegate = Bitmap_Delegate.getDelegate(bitmap);
- if (bitmapDelegate == null) {
- return;
- }
-
- BufferedImage image = bitmapDelegate.getImage();
-
- if (src == null) {
- drawBitmap(nativeCanvas, bitmapDelegate, nativePaintOrZero,
- 0, 0, image.getWidth(), image.getHeight(),
- dst.left, dst.top, dst.right, dst.bottom);
- } else {
- drawBitmap(nativeCanvas, bitmapDelegate, nativePaintOrZero,
- src.left, src.top, src.width(), src.height(),
- dst.left, dst.top, dst.right, dst.bottom);
- }
- }
-
- @LayoutlibDelegate
- /*package*/ static void native_drawBitmap(int nativeCanvas, int[] colors,
- int offset, int stride, final float x,
- final float y, int width, int height,
- boolean hasAlpha,
- int nativePaintOrZero) {
-
- // create a temp BufferedImage containing the content.
- final BufferedImage image = new BufferedImage(width, height,
- hasAlpha ? BufferedImage.TYPE_INT_ARGB : BufferedImage.TYPE_INT_RGB);
- image.setRGB(0, 0, width, height, colors, offset, stride);
-
- draw(nativeCanvas, nativePaintOrZero, true /*compositeOnly*/, false /*forceSrcMode*/,
- new GcSnapshot.Drawable() {
- @Override
- public void draw(Graphics2D graphics, Paint_Delegate paint) {
- if (paint != null && paint.isFilterBitmap()) {
- graphics.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
- RenderingHints.VALUE_INTERPOLATION_BILINEAR);
- }
-
- graphics.drawImage(image, (int) x, (int) y, null);
- }
- });
- }
-
- @LayoutlibDelegate
- /*package*/ static void nativeDrawBitmapMatrix(int nCanvas, int nBitmap,
- int nMatrix, int nPaint) {
- // get the delegate from the native int.
- Canvas_Delegate canvasDelegate = sManager.getDelegate(nCanvas);
- if (canvasDelegate == null) {
- return;
- }
-
- // get the delegate from the native int, which can be null
- Paint_Delegate paintDelegate = Paint_Delegate.getDelegate(nPaint);
-
- // get the delegate from the native int.
- Bitmap_Delegate bitmapDelegate = Bitmap_Delegate.getDelegate(nBitmap);
- if (bitmapDelegate == null) {
- return;
- }
-
- final BufferedImage image = getImageToDraw(bitmapDelegate, paintDelegate, sBoolOut);
-
- Matrix_Delegate matrixDelegate = Matrix_Delegate.getDelegate(nMatrix);
- if (matrixDelegate == null) {
- return;
- }
-
- final AffineTransform mtx = matrixDelegate.getAffineTransform();
-
- canvasDelegate.getSnapshot().draw(new GcSnapshot.Drawable() {
- @Override
- public void draw(Graphics2D graphics, Paint_Delegate paint) {
- if (paint != null && paint.isFilterBitmap()) {
- graphics.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
- RenderingHints.VALUE_INTERPOLATION_BILINEAR);
- }
-
- //FIXME add support for canvas, screen and bitmap densities.
- graphics.drawImage(image, mtx, null);
- }
- }, paintDelegate, true /*compositeOnly*/, false /*forceSrcMode*/);
- }
-
- @LayoutlibDelegate
- /*package*/ static void nativeDrawBitmapMesh(int nCanvas, int nBitmap,
- int meshWidth, int meshHeight, float[] verts, int vertOffset, int[] colors,
- int colorOffset, int nPaint) {
- // FIXME
- Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED,
- "Canvas.drawBitmapMesh is not supported.", null, null /*data*/);
- }
-
- @LayoutlibDelegate
- /*package*/ static void nativeDrawVertices(int nCanvas, int mode, int n,
- float[] verts, int vertOffset,
- float[] texs, int texOffset,
- int[] colors, int colorOffset,
- short[] indices, int indexOffset,
- int indexCount, int nPaint) {
- // FIXME
- Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED,
- "Canvas.drawVertices is not supported.", null, null /*data*/);
- }
-
- @LayoutlibDelegate
- /*package*/ static void native_drawText(int nativeCanvas,
- final char[] text, final int index, final int count,
- final float startX, final float startY, final int flags, int paint) {
-
- draw(nativeCanvas, paint, false /*compositeOnly*/, false /*forceSrcMode*/,
- new GcSnapshot.Drawable() {
- @Override
- public void draw(Graphics2D graphics, Paint_Delegate paintDelegate) {
- // WARNING: the logic in this method is similar to Paint_Delegate.measureText.
- // Any change to this method should be reflected in Paint.measureText
- // Paint.TextAlign indicates how the text is positioned relative to X.
- // LEFT is the default and there's nothing to do.
- float x = startX;
- int limit = index + count;
- boolean isRtl = flags == Canvas.DIRECTION_RTL;
- if (paintDelegate.getTextAlign() != Paint.Align.LEFT.nativeInt) {
- float m = paintDelegate.measureText(text, index, count, isRtl);
- if (paintDelegate.getTextAlign() == Paint.Align.CENTER.nativeInt) {
- x -= m / 2;
- } else if (paintDelegate.getTextAlign() == Paint.Align.RIGHT.nativeInt) {
- x -= m;
- }
- }
-
- new BidiRenderer(graphics, paintDelegate, text).renderText(
- index, limit, isRtl, null, 0, true, x, startY);
- }
- });
- }
-
- @LayoutlibDelegate
- /*package*/ static void native_drawText(int nativeCanvas, String text,
- int start, int end, float x, float y, final int flags, int paint) {
- int count = end - start;
- char[] buffer = TemporaryBuffer.obtain(count);
- TextUtils.getChars(text, start, end, buffer, 0);
-
- native_drawText(nativeCanvas, buffer, 0, count, x, y, flags, paint);
- }
-
- @LayoutlibDelegate
- /*package*/ static void native_drawTextRun(int nativeCanvas, String text,
- int start, int end, int contextStart, int contextEnd,
- float x, float y, int flags, int paint) {
- int count = end - start;
- char[] buffer = TemporaryBuffer.obtain(count);
- TextUtils.getChars(text, start, end, buffer, 0);
-
- native_drawText(nativeCanvas, buffer, 0, count, x, y, flags, paint);
- }
-
- @LayoutlibDelegate
- /*package*/ static void native_drawTextRun(int nativeCanvas, char[] text,
- int start, int count, int contextStart, int contextCount,
- float x, float y, int flags, int paint) {
- native_drawText(nativeCanvas, text, start, count, x, y, flags, paint);
- }
-
- @LayoutlibDelegate
- /*package*/ static void native_drawPosText(int nativeCanvas,
- char[] text, int index,
- int count, float[] pos,
- int paint) {
- // FIXME
- Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED,
- "Canvas.drawPosText is not supported.", null, null /*data*/);
- }
-
- @LayoutlibDelegate
- /*package*/ static void native_drawPosText(int nativeCanvas,
- String text, float[] pos,
- int paint) {
- // FIXME
- Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED,
- "Canvas.drawPosText is not supported.", null, null /*data*/);
- }
-
- @LayoutlibDelegate
- /*package*/ static void native_drawTextOnPath(int nativeCanvas,
- char[] text, int index,
- int count, int path,
- float hOffset,
- float vOffset, int bidiFlags,
- int paint) {
- // FIXME
- Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED,
- "Canvas.drawTextOnPath is not supported.", null, null /*data*/);
- }
-
- @LayoutlibDelegate
- /*package*/ static void native_drawTextOnPath(int nativeCanvas,
- String text, int path,
- float hOffset,
- float vOffset,
- int flags, int paint) {
- // FIXME
- Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED,
- "Canvas.drawTextOnPath is not supported.", null, null /*data*/);
- }
-
- @LayoutlibDelegate
- /*package*/ static void finalizer(int nativeCanvas) {
- // get the delegate from the native int so that it can be disposed.
- Canvas_Delegate canvasDelegate = sManager.getDelegate(nativeCanvas);
- if (canvasDelegate == null) {
- return;
- }
-
- canvasDelegate.dispose();
-
- // remove it from the manager.
- sManager.removeJavaReferenceFor(nativeCanvas);
- }
-
- // ---- Private delegate/helper methods ----
-
- /**
- * Executes a {@link GcSnapshot.Drawable} with a given canvas and paint.
- * <p>Note that the drawable may actually be executed several times if there are
- * layers involved (see {@link #saveLayer(RectF, int, int)}.
- */
- private static void draw(int nCanvas, int nPaint, boolean compositeOnly, boolean forceSrcMode,
- GcSnapshot.Drawable drawable) {
- // get the delegate from the native int.
- Canvas_Delegate canvasDelegate = sManager.getDelegate(nCanvas);
- if (canvasDelegate == null) {
- return;
- }
-
- // get the paint which can be null if nPaint is 0;
- Paint_Delegate paintDelegate = Paint_Delegate.getDelegate(nPaint);
-
- canvasDelegate.getSnapshot().draw(drawable, paintDelegate, compositeOnly, forceSrcMode);
- }
-
- /**
- * Executes a {@link GcSnapshot.Drawable} with a given canvas. No paint object will be provided
- * to {@link GcSnapshot.Drawable#draw(Graphics2D, Paint_Delegate)}.
- * <p>Note that the drawable may actually be executed several times if there are
- * layers involved (see {@link #saveLayer(RectF, int, int)}.
- */
- private static void draw(int nCanvas, GcSnapshot.Drawable drawable) {
- // get the delegate from the native int.
- Canvas_Delegate canvasDelegate = sManager.getDelegate(nCanvas);
- if (canvasDelegate == null) {
- return;
- }
-
- canvasDelegate.mSnapshot.draw(drawable);
- }
-
- private Canvas_Delegate(Bitmap_Delegate bitmap) {
- mSnapshot = GcSnapshot.createDefaultSnapshot(mBitmap = bitmap);
- }
-
- private Canvas_Delegate() {
- mSnapshot = GcSnapshot.createDefaultSnapshot(null /*image*/);
- }
-
- /**
- * Disposes of the {@link Graphics2D} stack.
- */
- private void dispose() {
- mSnapshot.dispose();
- }
-
- private int save(int saveFlags) {
- // get the current save count
- int count = mSnapshot.size();
-
- mSnapshot = mSnapshot.save(saveFlags);
-
- // return the old save count
- return count;
- }
-
- private int saveLayerAlpha(RectF rect, int alpha, int saveFlags) {
- Paint_Delegate paint = new Paint_Delegate();
- paint.setAlpha(alpha);
- return saveLayer(rect, paint, saveFlags);
- }
-
- private int saveLayer(RectF rect, Paint_Delegate paint, int saveFlags) {
- // get the current save count
- int count = mSnapshot.size();
-
- mSnapshot = mSnapshot.saveLayer(rect, paint, saveFlags);
-
- // return the old save count
- return count;
- }
-
- /**
- * Restores the {@link GcSnapshot} to <var>saveCount</var>
- * @param saveCount the saveCount
- */
- private void restoreTo(int saveCount) {
- mSnapshot = mSnapshot.restoreTo(saveCount);
- }
-
- /**
- * Restores the {@link GcSnapshot} to <var>saveCount</var>
- * @param saveCount the saveCount
- */
- private void restore() {
- mSnapshot = mSnapshot.restore();
- }
-
- private boolean clipRect(float left, float top, float right, float bottom, int regionOp) {
- return mSnapshot.clipRect(left, top, right, bottom, regionOp);
- }
-
- private void setBitmap(Bitmap_Delegate bitmap) {
- mBitmap = bitmap;
- assert mSnapshot.size() == 1;
- mSnapshot.setBitmap(mBitmap);
- }
-
- private static void drawBitmap(
- int nativeCanvas,
- Bitmap_Delegate bitmap,
- int nativePaintOrZero,
- final int sleft, final int stop, final int sright, final int sbottom,
- final int dleft, final int dtop, final int dright, final int dbottom) {
- // get the delegate from the native int.
- Canvas_Delegate canvasDelegate = sManager.getDelegate(nativeCanvas);
- if (canvasDelegate == null) {
- return;
- }
-
- // get the paint, which could be null if the int is 0
- Paint_Delegate paintDelegate = Paint_Delegate.getDelegate(nativePaintOrZero);
-
- final BufferedImage image = getImageToDraw(bitmap, paintDelegate, sBoolOut);
-
- draw(nativeCanvas, nativePaintOrZero, true /*compositeOnly*/, sBoolOut[0],
- new GcSnapshot.Drawable() {
- @Override
- public void draw(Graphics2D graphics, Paint_Delegate paint) {
- if (paint != null && paint.isFilterBitmap()) {
- graphics.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
- RenderingHints.VALUE_INTERPOLATION_BILINEAR);
- }
-
- //FIXME add support for canvas, screen and bitmap densities.
- graphics.drawImage(image, dleft, dtop, dright, dbottom,
- sleft, stop, sright, sbottom, null);
- }
- });
- }
-
-
- /**
- * Returns a BufferedImage ready for drawing, based on the bitmap and paint delegate.
- * The image returns, through a 1-size boolean array, whether the drawing code should
- * use a SRC composite no matter what the paint says.
- *
- * @param bitmap the bitmap
- * @param paint the paint that will be used to draw
- * @param forceSrcMode whether the composite will have to be SRC
- * @return the image to draw
- */
- private static BufferedImage getImageToDraw(Bitmap_Delegate bitmap, Paint_Delegate paint,
- boolean[] forceSrcMode) {
- BufferedImage image = bitmap.getImage();
- forceSrcMode[0] = false;
-
- // if the bitmap config is alpha_8, then we erase all color value from it
- // before drawing it.
- if (bitmap.getConfig() == Bitmap.Config.ALPHA_8) {
- fixAlpha8Bitmap(image);
- } else if (bitmap.hasAlpha() == false) {
- // hasAlpha is merely a rendering hint. There can in fact be alpha values
- // in the bitmap but it should be ignored at drawing time.
- // There is two ways to do this:
- // - override the composite to be SRC. This can only be used if the composite
- // was going to be SRC or SRC_OVER in the first place
- // - Create a different bitmap to draw in which all the alpha channel values is set
- // to 0xFF.
- if (paint != null) {
- Xfermode_Delegate xfermodeDelegate = paint.getXfermode();
- if (xfermodeDelegate instanceof PorterDuffXfermode_Delegate) {
- PorterDuff.Mode mode =
- ((PorterDuffXfermode_Delegate)xfermodeDelegate).getMode();
-
- forceSrcMode[0] = mode == PorterDuff.Mode.SRC_OVER ||
- mode == PorterDuff.Mode.SRC;
- }
- }
-
- // if we can't force SRC mode, then create a temp bitmap of TYPE_RGB
- if (forceSrcMode[0] == false) {
- image = Bitmap_Delegate.createCopy(image, BufferedImage.TYPE_INT_RGB, 0xFF);
- }
- }
-
- return image;
- }
-
- private static void fixAlpha8Bitmap(final BufferedImage image) {
- int w = image.getWidth();
- int h = image.getHeight();
- int[] argb = new int[w * h];
- image.getRGB(0, 0, image.getWidth(), image.getHeight(), argb, 0, image.getWidth());
-
- final int length = argb.length;
- for (int i = 0 ; i < length; i++) {
- argb[i] &= 0xFF000000;
- }
- image.setRGB(0, 0, w, h, argb, 0, w);
- }
-}
-
diff --git a/tools/layoutlib/bridge/src/android/graphics/ColorFilter_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/ColorFilter_Delegate.java
deleted file mode 100644
index e5a7ab6..0000000
--- a/tools/layoutlib/bridge/src/android/graphics/ColorFilter_Delegate.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.graphics;
-
-import com.android.layoutlib.bridge.impl.DelegateManager;
-import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
-
-/**
- * Delegate implementing the native methods of android.graphics.ColorFilter
- *
- * Through the layoutlib_create tool, the original native methods of ColorFilter have been replaced
- * by calls to methods of the same name in this delegate class.
- *
- * This class behaves like the original native implementation, but in Java, keeping previously
- * native data into its own objects and mapping them to int that are sent back and forth between
- * it and the original ColorFilter class.
- *
- * This also serve as a base class for all ColorFilter delegate classes.
- *
- * @see DelegateManager
- *
- */
-public abstract class ColorFilter_Delegate {
-
- // ---- delegate manager ----
- protected static final DelegateManager<ColorFilter_Delegate> sManager =
- new DelegateManager<ColorFilter_Delegate>(ColorFilter_Delegate.class);
-
- // ---- delegate helper data ----
-
- // ---- delegate data ----
-
- // ---- Public Helper methods ----
-
- public static ColorFilter_Delegate getDelegate(int nativeShader) {
- return sManager.getDelegate(nativeShader);
- }
-
- public abstract boolean isSupported();
- public abstract String getSupportMessage();
-
- // ---- native methods ----
-
- @LayoutlibDelegate
- /*package*/ static void finalizer(int native_instance, int nativeColorFilter) {
- sManager.removeJavaReferenceFor(native_instance);
- }
-
- // ---- Private delegate/helper methods ----
-}
diff --git a/tools/layoutlib/bridge/src/android/graphics/ColorMatrixColorFilter_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/ColorMatrixColorFilter_Delegate.java
deleted file mode 100644
index 2de344b..0000000
--- a/tools/layoutlib/bridge/src/android/graphics/ColorMatrixColorFilter_Delegate.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.graphics;
-
-import com.android.layoutlib.bridge.impl.DelegateManager;
-import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
-
-/**
- * Delegate implementing the native methods of android.graphics.ColorMatrixColorFilter
- *
- * Through the layoutlib_create tool, the original native methods of ColorMatrixColorFilter have
- * been replaced by calls to methods of the same name in this delegate class.
- *
- * This class behaves like the original native implementation, but in Java, keeping previously
- * native data into its own objects and mapping them to int that are sent back and forth between
- * it and the original ColorMatrixColorFilter class.
- *
- * Because this extends {@link ColorFilter_Delegate}, there's no need to use a
- * {@link DelegateManager}, as all the Shader classes will be added to the manager
- * owned by {@link ColorFilter_Delegate}.
- *
- * @see ColorFilter_Delegate
- *
- */
-public class ColorMatrixColorFilter_Delegate extends ColorFilter_Delegate {
-
- // ---- delegate data ----
-
- // ---- Public Helper methods ----
-
- @Override
- public boolean isSupported() {
- return false;
- }
-
- @Override
- public String getSupportMessage() {
- return "ColorMatrix Color Filters are not supported.";
- }
-
- // ---- native methods ----
-
- @LayoutlibDelegate
- /*package*/ static int nativeColorMatrixFilter(float[] array) {
- ColorMatrixColorFilter_Delegate newDelegate = new ColorMatrixColorFilter_Delegate();
- return sManager.addNewDelegate(newDelegate);
- }
-
- @LayoutlibDelegate
- /*package*/ static int nColorMatrixFilter(int nativeFilter, float[] array) {
- // pass
- return 0;
- }
-
- // ---- Private delegate/helper methods ----
-}
diff --git a/tools/layoutlib/bridge/src/android/graphics/ComposePathEffect_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/ComposePathEffect_Delegate.java
deleted file mode 100644
index 7c04a87..0000000
--- a/tools/layoutlib/bridge/src/android/graphics/ComposePathEffect_Delegate.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.graphics;
-
-import com.android.layoutlib.bridge.impl.DelegateManager;
-import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
-
-import java.awt.Stroke;
-
-/**
- * Delegate implementing the native methods of android.graphics.ComposePathEffect
- *
- * Through the layoutlib_create tool, the original native methods of ComposePathEffect have been
- * replaced by calls to methods of the same name in this delegate class.
- *
- * This class behaves like the original native implementation, but in Java, keeping previously
- * native data into its own objects and mapping them to int that are sent back and forth between
- * it and the original ComposePathEffect class.
- *
- * Because this extends {@link PathEffect_Delegate}, there's no need to use a {@link DelegateManager},
- * as all the Shader classes will be added to the manager owned by {@link PathEffect_Delegate}.
- *
- * @see PathEffect_Delegate
- *
- */
-public class ComposePathEffect_Delegate extends PathEffect_Delegate {
-
- // ---- delegate data ----
-
- // ---- Public Helper methods ----
-
- @Override
- public Stroke getStroke(Paint_Delegate paint) {
- // FIXME
- return null;
- }
-
- @Override
- public boolean isSupported() {
- return false;
- }
-
- @Override
- public String getSupportMessage() {
- return "Compose Path Effects are not supported in Layout Preview mode.";
- }
-
- // ---- native methods ----
-
- @LayoutlibDelegate
- /*package*/ static int nativeCreate(int outerpe, int innerpe) {
- ComposePathEffect_Delegate newDelegate = new ComposePathEffect_Delegate();
- return sManager.addNewDelegate(newDelegate);
- }
-
- // ---- Private delegate/helper methods ----
-}
diff --git a/tools/layoutlib/bridge/src/android/graphics/ComposeShader_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/ComposeShader_Delegate.java
deleted file mode 100644
index f6e1d00..0000000
--- a/tools/layoutlib/bridge/src/android/graphics/ComposeShader_Delegate.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.graphics;
-
-import com.android.layoutlib.bridge.impl.DelegateManager;
-import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
-
-import java.awt.Paint;
-
-/**
- * Delegate implementing the native methods of android.graphics.ComposeShader
- *
- * Through the layoutlib_create tool, the original native methods of ComposeShader have been
- * replaced by calls to methods of the same name in this delegate class.
- *
- * This class behaves like the original native implementation, but in Java, keeping previously
- * native data into its own objects and mapping them to int that are sent back and forth between
- * it and the original ComposeShader class.
- *
- * Because this extends {@link Shader_Delegate}, there's no need to use a {@link DelegateManager},
- * as all the Shader classes will be added to the manager owned by {@link Shader_Delegate}.
- *
- * @see Shader_Delegate
- *
- */
-public class ComposeShader_Delegate extends Shader_Delegate {
-
- // ---- delegate data ----
-
- // ---- Public Helper methods ----
-
- @Override
- public Paint getJavaPaint() {
- // FIXME
- return null;
- }
-
- @Override
- public boolean isSupported() {
- return false;
- }
-
- @Override
- public String getSupportMessage() {
- return "Compose Shaders are not supported in Layout Preview mode.";
- }
-
-
- // ---- native methods ----
-
- @LayoutlibDelegate
- /*package*/ static int nativeCreate1(int native_shaderA, int native_shaderB,
- int native_mode) {
- // FIXME not supported yet.
- ComposeShader_Delegate newDelegate = new ComposeShader_Delegate();
- return sManager.addNewDelegate(newDelegate);
- }
-
- @LayoutlibDelegate
- /*package*/ static int nativeCreate2(int native_shaderA, int native_shaderB,
- int porterDuffMode) {
- // FIXME not supported yet.
- ComposeShader_Delegate newDelegate = new ComposeShader_Delegate();
- return sManager.addNewDelegate(newDelegate);
- }
-
- @LayoutlibDelegate
- /*package*/ static int nativePostCreate1(int native_shader, int native_skiaShaderA,
- int native_skiaShaderB, int native_mode) {
- // pass, not needed.
- return 0;
- }
-
- @LayoutlibDelegate
- /*package*/ static int nativePostCreate2(int native_shader, int native_skiaShaderA,
- int native_skiaShaderB, int porterDuffMode) {
- // pass, not needed.
- return 0;
- }
-
- // ---- Private delegate/helper methods ----
-
-}
diff --git a/tools/layoutlib/bridge/src/android/graphics/CornerPathEffect_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/CornerPathEffect_Delegate.java
deleted file mode 100644
index b0f8168..0000000
--- a/tools/layoutlib/bridge/src/android/graphics/CornerPathEffect_Delegate.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.graphics;
-
-import com.android.layoutlib.bridge.impl.DelegateManager;
-import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
-
-import java.awt.Stroke;
-
-/**
- * Delegate implementing the native methods of android.graphics.CornerPathEffect
- *
- * Through the layoutlib_create tool, the original native methods of CornerPathEffect have been
- * replaced by calls to methods of the same name in this delegate class.
- *
- * This class behaves like the original native implementation, but in Java, keeping previously
- * native data into its own objects and mapping them to int that are sent back and forth between
- * it and the original CornerPathEffect class.
- *
- * Because this extends {@link PathEffect_Delegate}, there's no need to use a {@link DelegateManager},
- * as all the Shader classes will be added to the manager owned by {@link PathEffect_Delegate}.
- *
- * @see PathEffect_Delegate
- *
- */
-public class CornerPathEffect_Delegate extends PathEffect_Delegate {
-
- // ---- delegate data ----
-
- // ---- Public Helper methods ----
-
- @Override
- public Stroke getStroke(Paint_Delegate paint) {
- // FIXME
- return null;
- }
-
- @Override
- public boolean isSupported() {
- return false;
- }
-
- @Override
- public String getSupportMessage() {
- return "Corner Path Effects are not supported in Layout Preview mode.";
- }
-
- // ---- native methods ----
-
- @LayoutlibDelegate
- /*package*/ static int nativeCreate(float radius) {
- CornerPathEffect_Delegate newDelegate = new CornerPathEffect_Delegate();
- return sManager.addNewDelegate(newDelegate);
- }
-
- // ---- Private delegate/helper methods ----
-}
diff --git a/tools/layoutlib/bridge/src/android/graphics/DashPathEffect_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/DashPathEffect_Delegate.java
deleted file mode 100644
index d97c2ec..0000000
--- a/tools/layoutlib/bridge/src/android/graphics/DashPathEffect_Delegate.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.graphics;
-
-import com.android.layoutlib.bridge.impl.DelegateManager;
-import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
-
-import java.awt.BasicStroke;
-import java.awt.Stroke;
-
-/**
- * Delegate implementing the native methods of android.graphics.DashPathEffect
- *
- * Through the layoutlib_create tool, the original native methods of DashPathEffect have been
- * replaced by calls to methods of the same name in this delegate class.
- *
- * This class behaves like the original native implementation, but in Java, keeping previously
- * native data into its own objects and mapping them to int that are sent back and forth between
- * it and the original DashPathEffect class.
- *
- * Because this extends {@link PathEffect_Delegate}, there's no need to use a
- * {@link DelegateManager}, as all the PathEffect classes will be added to the manager owned by
- * {@link PathEffect_Delegate}.
- *
- * @see PathEffect_Delegate
- *
- */
-public final class DashPathEffect_Delegate extends PathEffect_Delegate {
-
- // ---- delegate data ----
-
- private final float[] mIntervals;
- private final float mPhase;
-
- // ---- Public Helper methods ----
-
- @Override
- public Stroke getStroke(Paint_Delegate paint) {
- return new BasicStroke(
- paint.getStrokeWidth(),
- paint.getJavaCap(),
- paint.getJavaJoin(),
- paint.getJavaStrokeMiter(),
- mIntervals,
- mPhase);
- }
-
- @Override
- public boolean isSupported() {
- return true;
- }
-
- @Override
- public String getSupportMessage() {
- // no message since isSupported returns true;
- return null;
- }
-
- // ---- native methods ----
-
- @LayoutlibDelegate
- /*package*/ static int nativeCreate(float intervals[], float phase) {
- DashPathEffect_Delegate newDelegate = new DashPathEffect_Delegate(intervals, phase);
- return sManager.addNewDelegate(newDelegate);
- }
-
- // ---- Private delegate/helper methods ----
-
- private DashPathEffect_Delegate(float intervals[], float phase) {
- mIntervals = new float[intervals.length];
- System.arraycopy(intervals, 0, mIntervals, 0, intervals.length);
- mPhase = phase;
- }
-}
-
diff --git a/tools/layoutlib/bridge/src/android/graphics/DiscretePathEffect_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/DiscretePathEffect_Delegate.java
deleted file mode 100644
index ec4a810..0000000
--- a/tools/layoutlib/bridge/src/android/graphics/DiscretePathEffect_Delegate.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.graphics;
-
-import com.android.layoutlib.bridge.impl.DelegateManager;
-import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
-
-import java.awt.Stroke;
-
-/**
- * Delegate implementing the native methods of android.graphics.DiscretePathEffect
- *
- * Through the layoutlib_create tool, the original native methods of DiscretePathEffect have been
- * replaced by calls to methods of the same name in this delegate class.
- *
- * This class behaves like the original native implementation, but in Java, keeping previously
- * native data into its own objects and mapping them to int that are sent back and forth between
- * it and the original DiscretePathEffect class.
- *
- * Because this extends {@link PathEffect_Delegate}, there's no need to use a {@link DelegateManager},
- * as all the Shader classes will be added to the manager owned by {@link PathEffect_Delegate}.
- *
- * @see PathEffect_Delegate
- *
- */
-public class DiscretePathEffect_Delegate extends PathEffect_Delegate {
-
- // ---- delegate data ----
-
- // ---- Public Helper methods ----
-
- @Override
- public Stroke getStroke(Paint_Delegate paint) {
- // FIXME
- return null;
- }
-
- @Override
- public boolean isSupported() {
- return false;
- }
-
- @Override
- public String getSupportMessage() {
- return "Discrete Path Effects are not supported in Layout Preview mode.";
- }
-
- // ---- native methods ----
-
- @LayoutlibDelegate
- /*package*/ static int nativeCreate(float length, float deviation) {
- DiscretePathEffect_Delegate newDelegate = new DiscretePathEffect_Delegate();
- return sManager.addNewDelegate(newDelegate);
- }
-
- // ---- Private delegate/helper methods ----
-}
diff --git a/tools/layoutlib/bridge/src/android/graphics/DrawFilter_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/DrawFilter_Delegate.java
deleted file mode 100644
index 870c46b..0000000
--- a/tools/layoutlib/bridge/src/android/graphics/DrawFilter_Delegate.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.graphics;
-
-import com.android.layoutlib.bridge.impl.DelegateManager;
-import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
-
-/**
- * Delegate implementing the native methods of android.graphics.DrawFilter
- *
- * Through the layoutlib_create tool, the original native methods of DrawFilter have been replaced
- * by calls to methods of the same name in this delegate class.
- *
- * This class behaves like the original native implementation, but in Java, keeping previously
- * native data into its own objects and mapping them to int that are sent back and forth between
- * it and the original DrawFilter class.
- *
- * This also serve as a base class for all DrawFilter delegate classes.
- *
- * @see DelegateManager
- *
- */
-public abstract class DrawFilter_Delegate {
-
- // ---- delegate manager ----
- protected static final DelegateManager<DrawFilter_Delegate> sManager =
- new DelegateManager<DrawFilter_Delegate>(DrawFilter_Delegate.class);
-
- // ---- delegate helper data ----
-
- // ---- delegate data ----
-
- // ---- Public Helper methods ----
-
- public static DrawFilter_Delegate getDelegate(int nativeDrawFilter) {
- return sManager.getDelegate(nativeDrawFilter);
- }
-
- public abstract boolean isSupported();
- public abstract String getSupportMessage();
-
- // ---- native methods ----
-
- @LayoutlibDelegate
- /*package*/ static void nativeDestructor(int nativeDrawFilter) {
- sManager.removeJavaReferenceFor(nativeDrawFilter);
- }
-
- // ---- Private delegate/helper methods ----
-}
diff --git a/tools/layoutlib/bridge/src/android/graphics/EmbossMaskFilter_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/EmbossMaskFilter_Delegate.java
deleted file mode 100644
index ebc1c1d..0000000
--- a/tools/layoutlib/bridge/src/android/graphics/EmbossMaskFilter_Delegate.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.graphics;
-
-import com.android.layoutlib.bridge.impl.DelegateManager;
-import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
-
-/**
- * Delegate implementing the native methods of android.graphics.EmbossMaskFilter
- *
- * Through the layoutlib_create tool, the original native methods of EmbossMaskFilter have
- * been replaced by calls to methods of the same name in this delegate class.
- *
- * This class behaves like the original native implementation, but in Java, keeping previously
- * native data into its own objects and mapping them to int that are sent back and forth between
- * it and the original EmbossMaskFilter class.
- *
- * Because this extends {@link MaskFilter_Delegate}, there's no need to use a
- * {@link DelegateManager}, as all the Shader classes will be added to the manager
- * owned by {@link MaskFilter_Delegate}.
- *
- * @see MaskFilter_Delegate
- *
- */
-public class EmbossMaskFilter_Delegate extends MaskFilter_Delegate {
-
- // ---- delegate data ----
-
- // ---- Public Helper methods ----
-
- @Override
- public boolean isSupported() {
- return false;
- }
-
- @Override
- public String getSupportMessage() {
- return "Emboss Mask Filters are not supported.";
- }
-
- // ---- native methods ----
-
- @LayoutlibDelegate
- /*package*/ static int nativeConstructor(float[] direction, float ambient,
- float specular, float blurRadius) {
- EmbossMaskFilter_Delegate newDelegate = new EmbossMaskFilter_Delegate();
- return sManager.addNewDelegate(newDelegate);
- }
-
- // ---- Private delegate/helper methods ----
-}
diff --git a/tools/layoutlib/bridge/src/android/graphics/Gradient_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/Gradient_Delegate.java
deleted file mode 100644
index 7475c22..0000000
--- a/tools/layoutlib/bridge/src/android/graphics/Gradient_Delegate.java
+++ /dev/null
@@ -1,212 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.graphics;
-
-import android.graphics.Shader.TileMode;
-
-/**
- * Base class for true Gradient shader delegate.
- */
-public abstract class Gradient_Delegate extends Shader_Delegate {
-
- protected final int[] mColors;
- protected final float[] mPositions;
-
- @Override
- public boolean isSupported() {
- // all gradient shaders are supported.
- return true;
- }
-
- @Override
- public String getSupportMessage() {
- // all gradient shaders are supported, no need for a gradient support
- return null;
- }
-
- /**
- * Creates the base shader and do some basic test on the parameters.
- *
- * @param colors The colors to be distributed along the gradient line
- * @param positions May be null. The relative positions [0..1] of each
- * corresponding color in the colors array. If this is null, the
- * the colors are distributed evenly along the gradient line.
- */
- protected Gradient_Delegate(int colors[], float positions[]) {
- if (colors.length < 2) {
- throw new IllegalArgumentException("needs >= 2 number of colors");
- }
- if (positions != null && colors.length != positions.length) {
- throw new IllegalArgumentException("color and position arrays must be of equal length");
- }
-
- if (positions == null) {
- float spacing = 1.f / (colors.length - 1);
- positions = new float[colors.length];
- positions[0] = 0.f;
- positions[colors.length-1] = 1.f;
- for (int i = 1; i < colors.length - 1 ; i++) {
- positions[i] = spacing * i;
- }
- }
-
- mColors = colors;
- mPositions = positions;
- }
-
- /**
- * Base class for (Java) Gradient Paints. This handles computing the gradient colors based
- * on the color and position lists, as well as the {@link TileMode}
- *
- */
- protected abstract static class GradientPaint implements java.awt.Paint {
- private final static int GRADIENT_SIZE = 100;
-
- private final int[] mColors;
- private final float[] mPositions;
- private final TileMode mTileMode;
- private int[] mGradient;
-
- protected GradientPaint(int[] colors, float[] positions, TileMode tileMode) {
- mColors = colors;
- mPositions = positions;
- mTileMode = tileMode;
- }
-
- @Override
- public int getTransparency() {
- return java.awt.Paint.TRANSLUCENT;
- }
-
- /**
- * Pre-computes the colors for the gradient. This must be called once before any call
- * to {@link #getGradientColor(float)}
- */
- protected void precomputeGradientColors() {
- if (mGradient == null) {
- // actually create an array with an extra size, so that we can really go
- // from 0 to SIZE (100%), or currentPos in the loop below will never equal 1.0
- mGradient = new int[GRADIENT_SIZE+1];
-
- int prevPos = 0;
- int nextPos = 1;
- for (int i = 0 ; i <= GRADIENT_SIZE ; i++) {
- // compute current position
- float currentPos = (float)i/GRADIENT_SIZE;
- while (currentPos > mPositions[nextPos]) {
- prevPos = nextPos++;
- }
-
- float percent = (currentPos - mPositions[prevPos]) /
- (mPositions[nextPos] - mPositions[prevPos]);
-
- mGradient[i] = computeColor(mColors[prevPos], mColors[nextPos], percent);
- }
- }
- }
-
- /**
- * Returns the color based on the position in the gradient.
- * <var>pos</var> can be anything, even &lt; 0 or &gt; > 1, as the gradient
- * will use {@link TileMode} value to convert it into a [0,1] value.
- */
- protected int getGradientColor(float pos) {
- if (pos < 0.f) {
- if (mTileMode != null) {
- switch (mTileMode) {
- case CLAMP:
- pos = 0.f;
- break;
- case REPEAT:
- // remove the integer part to stay in the [0,1] range.
- // we also need to invert the value from [-1,0] to [0, 1]
- pos = pos - (float)Math.floor(pos);
- break;
- case MIRROR:
- // this is the same as the positive side, just make the value positive
- // first.
- pos = Math.abs(pos);
-
- // get the integer and the decimal part
- int intPart = (int)Math.floor(pos);
- pos = pos - intPart;
- // 0 -> 1 : normal order
- // 1 -> 2: mirrored
- // etc..
- // this means if the intpart is odd we invert
- if ((intPart % 2) == 1) {
- pos = 1.f - pos;
- }
- break;
- }
- } else {
- pos = 0.0f;
- }
- } else if (pos > 1f) {
- if (mTileMode != null) {
- switch (mTileMode) {
- case CLAMP:
- pos = 1.f;
- break;
- case REPEAT:
- // remove the integer part to stay in the [0,1] range
- pos = pos - (float)Math.floor(pos);
- break;
- case MIRROR:
- // get the integer and the decimal part
- int intPart = (int)Math.floor(pos);
- pos = pos - intPart;
- // 0 -> 1 : normal order
- // 1 -> 2: mirrored
- // etc..
- // this means if the intpart is odd we invert
- if ((intPart % 2) == 1) {
- pos = 1.f - pos;
- }
- break;
- }
- } else {
- pos = 1.0f;
- }
- }
-
- int index = (int)((pos * GRADIENT_SIZE) + .5);
-
- return mGradient[index];
- }
-
- /**
- * Returns the color between c1, and c2, based on the percent of the distance
- * between c1 and c2.
- */
- private int computeColor(int c1, int c2, float percent) {
- int a = computeChannel((c1 >> 24) & 0xFF, (c2 >> 24) & 0xFF, percent);
- int r = computeChannel((c1 >> 16) & 0xFF, (c2 >> 16) & 0xFF, percent);
- int g = computeChannel((c1 >> 8) & 0xFF, (c2 >> 8) & 0xFF, percent);
- int b = computeChannel((c1 ) & 0xFF, (c2 ) & 0xFF, percent);
- return a << 24 | r << 16 | g << 8 | b;
- }
-
- /**
- * Returns the channel value between 2 values based on the percent of the distance between
- * the 2 values..
- */
- private int computeChannel(int c1, int c2, float percent) {
- return c1 + (int)((percent * (c2-c1)) + .5);
- }
- }
-}
diff --git a/tools/layoutlib/bridge/src/android/graphics/LayerRasterizer_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/LayerRasterizer_Delegate.java
deleted file mode 100644
index 51e0576..0000000
--- a/tools/layoutlib/bridge/src/android/graphics/LayerRasterizer_Delegate.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.graphics;
-
-import com.android.layoutlib.bridge.impl.DelegateManager;
-import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
-
-/**
- * Delegate implementing the native methods of android.graphics.LayerRasterizer
- *
- * Through the layoutlib_create tool, the original native methods of LayerRasterizer have
- * been replaced by calls to methods of the same name in this delegate class.
- *
- * This class behaves like the original native implementation, but in Java, keeping previously
- * native data into its own objects and mapping them to int that are sent back and forth between
- * it and the original LayerRasterizer class.
- *
- * Because this extends {@link Rasterizer_Delegate}, there's no need to use a
- * {@link DelegateManager}, as all the Shader classes will be added to the manager
- * owned by {@link Rasterizer_Delegate}.
- *
- * @see Rasterizer_Delegate
- *
- */
-public class LayerRasterizer_Delegate extends Rasterizer_Delegate {
-
- // ---- delegate data ----
-
- // ---- Public Helper methods ----
-
- @Override
- public boolean isSupported() {
- return false;
- }
-
- @Override
- public String getSupportMessage() {
- return "Layer Rasterizers are not supported.";
- }
-
- // ---- native methods ----
-
- @LayoutlibDelegate
- /*package*/ static int nativeConstructor() {
- LayerRasterizer_Delegate newDelegate = new LayerRasterizer_Delegate();
- return sManager.addNewDelegate(newDelegate);
- }
-
- @LayoutlibDelegate
- /*package*/ static void nativeAddLayer(int native_layer, int native_paint, float dx, float dy) {
-
- }
-
- // ---- Private delegate/helper methods ----
-}
diff --git a/tools/layoutlib/bridge/src/android/graphics/LightingColorFilter_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/LightingColorFilter_Delegate.java
deleted file mode 100644
index 0ee883d..0000000
--- a/tools/layoutlib/bridge/src/android/graphics/LightingColorFilter_Delegate.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.graphics;
-
-import com.android.layoutlib.bridge.impl.DelegateManager;
-import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
-
-/**
- * Delegate implementing the native methods of android.graphics.LightingColorFilter
- *
- * Through the layoutlib_create tool, the original native methods of LightingColorFilter have
- * been replaced by calls to methods of the same name in this delegate class.
- *
- * This class behaves like the original native implementation, but in Java, keeping previously
- * native data into its own objects and mapping them to int that are sent back and forth between
- * it and the original LightingColorFilter class.
- *
- * Because this extends {@link ColorFilter_Delegate}, there's no need to use a
- * {@link DelegateManager}, as all the Shader classes will be added to the manager
- * owned by {@link ColorFilter_Delegate}.
- *
- * @see ColorFilter_Delegate
- *
- */
-public class LightingColorFilter_Delegate extends ColorFilter_Delegate {
-
- // ---- delegate data ----
-
- // ---- Public Helper methods ----
-
- @Override
- public boolean isSupported() {
- return false;
- }
-
- @Override
- public String getSupportMessage() {
- return "Lighting Color Filters are not supported.";
- }
-
- // ---- native methods ----
-
- @LayoutlibDelegate
- /*package*/ static int native_CreateLightingFilter(int mul, int add) {
- LightingColorFilter_Delegate newDelegate = new LightingColorFilter_Delegate();
- return sManager.addNewDelegate(newDelegate);
- }
-
- @LayoutlibDelegate
- /*package*/ static int nCreateLightingFilter(int nativeFilter, int mul, int add) {
- // pass
- return 0;
- }
-
- // ---- Private delegate/helper methods ----
-}
diff --git a/tools/layoutlib/bridge/src/android/graphics/LinearGradient_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/LinearGradient_Delegate.java
deleted file mode 100644
index f117fca..0000000
--- a/tools/layoutlib/bridge/src/android/graphics/LinearGradient_Delegate.java
+++ /dev/null
@@ -1,240 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.graphics;
-
-import com.android.ide.common.rendering.api.LayoutLog;
-import com.android.layoutlib.bridge.Bridge;
-import com.android.layoutlib.bridge.impl.DelegateManager;
-import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
-
-import android.graphics.Shader.TileMode;
-
-/**
- * Delegate implementing the native methods of android.graphics.LinearGradient
- *
- * Through the layoutlib_create tool, the original native methods of LinearGradient have been
- * replaced by calls to methods of the same name in this delegate class.
- *
- * This class behaves like the original native implementation, but in Java, keeping previously
- * native data into its own objects and mapping them to int that are sent back and forth between
- * it and the original LinearGradient class.
- *
- * Because this extends {@link Shader_Delegate}, there's no need to use a {@link DelegateManager},
- * as all the Shader classes will be added to the manager owned by {@link Shader_Delegate}.
- *
- * @see Shader_Delegate
- *
- */
-public final class LinearGradient_Delegate extends Gradient_Delegate {
-
- // ---- delegate data ----
- private java.awt.Paint mJavaPaint;
-
- // ---- Public Helper methods ----
-
- @Override
- public java.awt.Paint getJavaPaint() {
- return mJavaPaint;
- }
-
- // ---- native methods ----
-
- @LayoutlibDelegate
- /*package*/ static int nativeCreate1(LinearGradient thisGradient,
- float x0, float y0, float x1, float y1,
- int colors[], float positions[], int tileMode) {
- LinearGradient_Delegate newDelegate = new LinearGradient_Delegate(x0, y0, x1, y1,
- colors, positions, Shader_Delegate.getTileMode(tileMode));
- return sManager.addNewDelegate(newDelegate);
- }
-
- @LayoutlibDelegate
- /*package*/ static int nativeCreate2(LinearGradient thisGradient,
- float x0, float y0, float x1, float y1,
- int color0, int color1, int tileMode) {
- return nativeCreate1(thisGradient,
- x0, y0, x1, y1, new int[] { color0, color1}, null /*positions*/,
- tileMode);
- }
-
- @LayoutlibDelegate
- /*package*/ static int nativePostCreate1(LinearGradient thisGradient,
- int native_shader, float x0, float y0, float x1, float y1,
- int colors[], float positions[], int tileMode) {
- // nothing to be done here.
- return 0;
- }
-
- @LayoutlibDelegate
- /*package*/ static int nativePostCreate2(LinearGradient thisGradient,
- int native_shader, float x0, float y0, float x1, float y1,
- int color0, int color1, int tileMode) {
- // nothing to be done here.
- return 0;
- }
-
- // ---- Private delegate/helper methods ----
-
- /**
- * Create a shader that draws a linear gradient along a line.
- *
- * @param x0 The x-coordinate for the start of the gradient line
- * @param y0 The y-coordinate for the start of the gradient line
- * @param x1 The x-coordinate for the end of the gradient line
- * @param y1 The y-coordinate for the end of the gradient line
- * @param colors The colors to be distributed along the gradient line
- * @param positions May be null. The relative positions [0..1] of each
- * corresponding color in the colors array. If this is null, the
- * the colors are distributed evenly along the gradient line.
- * @param tile The Shader tiling mode
- */
- private LinearGradient_Delegate(float x0, float y0, float x1, float y1,
- int colors[], float positions[], TileMode tile) {
- super(colors, positions);
- mJavaPaint = new LinearGradientPaint(x0, y0, x1, y1, mColors, mPositions, tile);
- }
-
- // ---- Custom Java Paint ----
- /**
- * Linear Gradient (Java) Paint able to handle more than 2 points, as
- * {@link java.awt.GradientPaint} only supports 2 points and does not support Android's tile
- * modes.
- */
- private class LinearGradientPaint extends GradientPaint {
-
- private final float mX0;
- private final float mY0;
- private final float mDx;
- private final float mDy;
- private final float mDSize2;
-
- public LinearGradientPaint(float x0, float y0, float x1, float y1, int colors[],
- float positions[], TileMode tile) {
- super(colors, positions, tile);
- mX0 = x0;
- mY0 = y0;
- mDx = x1 - x0;
- mDy = y1 - y0;
- mDSize2 = mDx * mDx + mDy * mDy;
- }
-
- @Override
- public java.awt.PaintContext createContext(
- java.awt.image.ColorModel colorModel,
- java.awt.Rectangle deviceBounds,
- java.awt.geom.Rectangle2D userBounds,
- java.awt.geom.AffineTransform xform,
- java.awt.RenderingHints hints) {
- precomputeGradientColors();
-
- java.awt.geom.AffineTransform canvasMatrix;
- try {
- canvasMatrix = xform.createInverse();
- } catch (java.awt.geom.NoninvertibleTransformException e) {
- Bridge.getLog().fidelityWarning(LayoutLog.TAG_MATRIX_INVERSE,
- "Unable to inverse matrix in LinearGradient", e, null /*data*/);
- canvasMatrix = new java.awt.geom.AffineTransform();
- }
-
- java.awt.geom.AffineTransform localMatrix = getLocalMatrix();
- try {
- localMatrix = localMatrix.createInverse();
- } catch (java.awt.geom.NoninvertibleTransformException e) {
- Bridge.getLog().fidelityWarning(LayoutLog.TAG_MATRIX_INVERSE,
- "Unable to inverse matrix in LinearGradient", e, null /*data*/);
- localMatrix = new java.awt.geom.AffineTransform();
- }
-
- return new LinearGradientPaintContext(canvasMatrix, localMatrix, colorModel);
- }
-
- private class LinearGradientPaintContext implements java.awt.PaintContext {
-
- private final java.awt.geom.AffineTransform mCanvasMatrix;
- private final java.awt.geom.AffineTransform mLocalMatrix;
- private final java.awt.image.ColorModel mColorModel;
-
- private LinearGradientPaintContext(
- java.awt.geom.AffineTransform canvasMatrix,
- java.awt.geom.AffineTransform localMatrix,
- java.awt.image.ColorModel colorModel) {
- mCanvasMatrix = canvasMatrix;
- mLocalMatrix = localMatrix;
- mColorModel = colorModel;
- }
-
- @Override
- public void dispose() {
- }
-
- @Override
- public java.awt.image.ColorModel getColorModel() {
- return mColorModel;
- }
-
- @Override
- public java.awt.image.Raster getRaster(int x, int y, int w, int h) {
- java.awt.image.BufferedImage image = new java.awt.image.BufferedImage(w, h,
- java.awt.image.BufferedImage.TYPE_INT_ARGB);
-
- int[] data = new int[w*h];
-
- int index = 0;
- float[] pt1 = new float[2];
- float[] pt2 = new float[2];
- for (int iy = 0 ; iy < h ; iy++) {
- for (int ix = 0 ; ix < w ; ix++) {
- // handle the canvas transform
- pt1[0] = x + ix;
- pt1[1] = y + iy;
- mCanvasMatrix.transform(pt1, 0, pt2, 0, 1);
-
- // handle the local matrix.
- pt1[0] = pt2[0];
- pt1[1] = pt2[1];
- mLocalMatrix.transform(pt1, 0, pt2, 0, 1);
-
- data[index++] = getColor(pt2[0], pt2[1]);
- }
- }
-
- image.setRGB(0 /*startX*/, 0 /*startY*/, w, h, data, 0 /*offset*/, w /*scansize*/);
-
- return image.getRaster();
- }
- }
-
- /**
- * Returns a color for an arbitrary point.
- */
- private int getColor(float x, float y) {
- float pos;
- if (mDx == 0) {
- pos = (y - mY0) / mDy;
- } else if (mDy == 0) {
- pos = (x - mX0) / mDx;
- } else {
- // find the x position on the gradient vector.
- float _x = (mDx*mDy*(y-mY0) + mDy*mDy*mX0 + mDx*mDx*x) / mDSize2;
- // from it get the position relative to the vector
- pos = (_x - mX0) / mDx;
- }
-
- return getGradientColor(pos);
- }
- }
-}
diff --git a/tools/layoutlib/bridge/src/android/graphics/MaskFilter_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/MaskFilter_Delegate.java
deleted file mode 100644
index c2f27e4..0000000
--- a/tools/layoutlib/bridge/src/android/graphics/MaskFilter_Delegate.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.graphics;
-
-import com.android.layoutlib.bridge.impl.DelegateManager;
-import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
-
-/**
- * Delegate implementing the native methods of android.graphics.MaskFilter
- *
- * Through the layoutlib_create tool, the original native methods of MaskFilter have been replaced
- * by calls to methods of the same name in this delegate class.
- *
- * This class behaves like the original native implementation, but in Java, keeping previously
- * native data into its own objects and mapping them to int that are sent back and forth between
- * it and the original MaskFilter class.
- *
- * This also serve as a base class for all MaskFilter delegate classes.
- *
- * @see DelegateManager
- *
- */
-public abstract class MaskFilter_Delegate {
-
- // ---- delegate manager ----
- protected static final DelegateManager<MaskFilter_Delegate> sManager =
- new DelegateManager<MaskFilter_Delegate>(MaskFilter_Delegate.class);
-
- // ---- delegate helper data ----
-
- // ---- delegate data ----
-
- // ---- Public Helper methods ----
-
- public static MaskFilter_Delegate getDelegate(int nativeShader) {
- return sManager.getDelegate(nativeShader);
- }
-
- public abstract boolean isSupported();
- public abstract String getSupportMessage();
-
- // ---- native methods ----
-
- @LayoutlibDelegate
- /*package*/ static void nativeDestructor(int native_filter) {
- sManager.removeJavaReferenceFor(native_filter);
- }
-
- // ---- Private delegate/helper methods ----
-}
diff --git a/tools/layoutlib/bridge/src/android/graphics/Matrix_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/Matrix_Delegate.java
deleted file mode 100644
index 5df2a21..0000000
--- a/tools/layoutlib/bridge/src/android/graphics/Matrix_Delegate.java
+++ /dev/null
@@ -1,1129 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.graphics;
-
-
-import com.android.ide.common.rendering.api.LayoutLog;
-import com.android.layoutlib.bridge.Bridge;
-import com.android.layoutlib.bridge.impl.DelegateManager;
-import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
-
-import android.graphics.Matrix.ScaleToFit;
-
-import java.awt.geom.AffineTransform;
-import java.awt.geom.NoninvertibleTransformException;
-
-/**
- * Delegate implementing the native methods of android.graphics.Matrix
- *
- * Through the layoutlib_create tool, the original native methods of Matrix have been replaced
- * by calls to methods of the same name in this delegate class.
- *
- * This class behaves like the original native implementation, but in Java, keeping previously
- * native data into its own objects and mapping them to int that are sent back and forth between
- * it and the original Matrix class.
- *
- * @see DelegateManager
- *
- */
-public final class Matrix_Delegate {
-
- private final static int MATRIX_SIZE = 9;
-
- // ---- delegate manager ----
- private static final DelegateManager<Matrix_Delegate> sManager =
- new DelegateManager<Matrix_Delegate>(Matrix_Delegate.class);
-
- // ---- delegate data ----
- private float mValues[] = new float[MATRIX_SIZE];
-
- // ---- Public Helper methods ----
-
- public static Matrix_Delegate getDelegate(int native_instance) {
- return sManager.getDelegate(native_instance);
- }
-
- /**
- * Returns an {@link AffineTransform} matching the given Matrix.
- */
- public static AffineTransform getAffineTransform(Matrix m) {
- Matrix_Delegate delegate = sManager.getDelegate(m.native_instance);
- if (delegate == null) {
- return null;
- }
-
- return delegate.getAffineTransform();
- }
-
- public static boolean hasPerspective(Matrix m) {
- Matrix_Delegate delegate = sManager.getDelegate(m.native_instance);
- if (delegate == null) {
- return false;
- }
-
- return delegate.hasPerspective();
- }
-
- /**
- * Sets the content of the matrix with the content of another matrix.
- */
- public void set(Matrix_Delegate matrix) {
- System.arraycopy(matrix.mValues, 0, mValues, 0, MATRIX_SIZE);
- }
-
- /**
- * Sets the content of the matrix with the content of another matrix represented as an array
- * of values.
- */
- public void set(float[] values) {
- System.arraycopy(values, 0, mValues, 0, MATRIX_SIZE);
- }
-
- /**
- * Resets the matrix to be the identity matrix.
- */
- public void reset() {
- reset(mValues);
- }
-
- /**
- * Returns whether or not the matrix is identity.
- */
- public boolean isIdentity() {
- for (int i = 0, k = 0; i < 3; i++) {
- for (int j = 0; j < 3; j++, k++) {
- if (mValues[k] != ((i==j) ? 1 : 0)) {
- return false;
- }
- }
- }
-
- return true;
- }
-
- public static float[] makeValues(AffineTransform matrix) {
- float[] values = new float[MATRIX_SIZE];
- values[0] = (float) matrix.getScaleX();
- values[1] = (float) matrix.getShearX();
- values[2] = (float) matrix.getTranslateX();
- values[3] = (float) matrix.getShearY();
- values[4] = (float) matrix.getScaleY();
- values[5] = (float) matrix.getTranslateY();
- values[6] = 0.f;
- values[7] = 0.f;
- values[8] = 1.f;
-
- return values;
- }
-
- public static Matrix_Delegate make(AffineTransform matrix) {
- return new Matrix_Delegate(makeValues(matrix));
- }
-
- public boolean mapRect(RectF dst, RectF src) {
- // array with 4 corners
- float[] corners = new float[] {
- src.left, src.top,
- src.right, src.top,
- src.right, src.bottom,
- src.left, src.bottom,
- };
-
- // apply the transform to them.
- mapPoints(corners);
-
- // now put the result in the rect. We take the min/max of Xs and min/max of Ys
- dst.left = Math.min(Math.min(corners[0], corners[2]), Math.min(corners[4], corners[6]));
- dst.right = Math.max(Math.max(corners[0], corners[2]), Math.max(corners[4], corners[6]));
-
- dst.top = Math.min(Math.min(corners[1], corners[3]), Math.min(corners[5], corners[7]));
- dst.bottom = Math.max(Math.max(corners[1], corners[3]), Math.max(corners[5], corners[7]));
-
-
- return (computeTypeMask() & kRectStaysRect_Mask) != 0;
- }
-
-
- /**
- * Returns an {@link AffineTransform} matching the matrix.
- */
- public AffineTransform getAffineTransform() {
- return getAffineTransform(mValues);
- }
-
- public boolean hasPerspective() {
- return (mValues[6] != 0 || mValues[7] != 0 || mValues[8] != 1);
- }
-
-
-
- // ---- native methods ----
-
- @LayoutlibDelegate
- /*package*/ static int native_create(int native_src_or_zero) {
- // create the delegate
- Matrix_Delegate newDelegate = new Matrix_Delegate();
-
- // copy from values if needed.
- if (native_src_or_zero > 0) {
- Matrix_Delegate oldDelegate = sManager.getDelegate(native_src_or_zero);
- if (oldDelegate != null) {
- System.arraycopy(
- oldDelegate.mValues, 0,
- newDelegate.mValues, 0,
- MATRIX_SIZE);
- }
- }
-
- return sManager.addNewDelegate(newDelegate);
- }
-
- @LayoutlibDelegate
- /*package*/ static boolean native_isIdentity(int native_object) {
- Matrix_Delegate d = sManager.getDelegate(native_object);
- if (d == null) {
- return false;
- }
-
- return d.isIdentity();
- }
-
- @LayoutlibDelegate
- /*package*/ static boolean native_rectStaysRect(int native_object) {
- Matrix_Delegate d = sManager.getDelegate(native_object);
- if (d == null) {
- return true;
- }
-
- return (d.computeTypeMask() & kRectStaysRect_Mask) != 0;
- }
-
- @LayoutlibDelegate
- /*package*/ static void native_reset(int native_object) {
- Matrix_Delegate d = sManager.getDelegate(native_object);
- if (d == null) {
- return;
- }
-
- reset(d.mValues);
- }
-
- @LayoutlibDelegate
- /*package*/ static void native_set(int native_object, int other) {
- Matrix_Delegate d = sManager.getDelegate(native_object);
- if (d == null) {
- return;
- }
-
- Matrix_Delegate src = sManager.getDelegate(other);
- if (src == null) {
- return;
- }
-
- System.arraycopy(src.mValues, 0, d.mValues, 0, MATRIX_SIZE);
- }
-
- @LayoutlibDelegate
- /*package*/ static void native_setTranslate(int native_object, float dx, float dy) {
- Matrix_Delegate d = sManager.getDelegate(native_object);
- if (d == null) {
- return;
- }
-
- setTranslate(d.mValues, dx, dy);
- }
-
- @LayoutlibDelegate
- /*package*/ static void native_setScale(int native_object, float sx, float sy,
- float px, float py) {
- Matrix_Delegate d = sManager.getDelegate(native_object);
- if (d == null) {
- return;
- }
-
- d.mValues = getScale(sx, sy, px, py);
- }
-
- @LayoutlibDelegate
- /*package*/ static void native_setScale(int native_object, float sx, float sy) {
- Matrix_Delegate d = sManager.getDelegate(native_object);
- if (d == null) {
- return;
- }
-
- d.mValues[0] = sx;
- d.mValues[1] = 0;
- d.mValues[2] = 0;
- d.mValues[3] = 0;
- d.mValues[4] = sy;
- d.mValues[5] = 0;
- d.mValues[6] = 0;
- d.mValues[7] = 0;
- d.mValues[8] = 1;
- }
-
- @LayoutlibDelegate
- /*package*/ static void native_setRotate(int native_object, float degrees, float px, float py) {
- Matrix_Delegate d = sManager.getDelegate(native_object);
- if (d == null) {
- return;
- }
-
- d.mValues = getRotate(degrees, px, py);
- }
-
- @LayoutlibDelegate
- /*package*/ static void native_setRotate(int native_object, float degrees) {
- Matrix_Delegate d = sManager.getDelegate(native_object);
- if (d == null) {
- return;
- }
-
- setRotate(d.mValues, degrees);
- }
-
- @LayoutlibDelegate
- /*package*/ static void native_setSinCos(int native_object, float sinValue, float cosValue,
- float px, float py) {
- Matrix_Delegate d = sManager.getDelegate(native_object);
- if (d == null) {
- return;
- }
-
- // TODO: do it in one pass
-
- // translate so that the pivot is in 0,0
- setTranslate(d.mValues, -px, -py);
-
- // scale
- d.postTransform(getRotate(sinValue, cosValue));
- // translate back the pivot
- d.postTransform(getTranslate(px, py));
- }
-
- @LayoutlibDelegate
- /*package*/ static void native_setSinCos(int native_object, float sinValue, float cosValue) {
- Matrix_Delegate d = sManager.getDelegate(native_object);
- if (d == null) {
- return;
- }
-
- setRotate(d.mValues, sinValue, cosValue);
- }
-
- @LayoutlibDelegate
- /*package*/ static void native_setSkew(int native_object, float kx, float ky,
- float px, float py) {
- Matrix_Delegate d = sManager.getDelegate(native_object);
- if (d == null) {
- return;
- }
-
- d.mValues = getSkew(kx, ky, px, py);
- }
-
- @LayoutlibDelegate
- /*package*/ static void native_setSkew(int native_object, float kx, float ky) {
- Matrix_Delegate d = sManager.getDelegate(native_object);
- if (d == null) {
- return;
- }
-
- d.mValues[0] = 1;
- d.mValues[1] = kx;
- d.mValues[2] = -0;
- d.mValues[3] = ky;
- d.mValues[4] = 1;
- d.mValues[5] = 0;
- d.mValues[6] = 0;
- d.mValues[7] = 0;
- d.mValues[8] = 1;
- }
-
- @LayoutlibDelegate
- /*package*/ static boolean native_setConcat(int native_object, int a, int b) {
- if (a == native_object) {
- return native_preConcat(native_object, b);
- } else if (b == native_object) {
- return native_postConcat(native_object, a);
- }
-
- Matrix_Delegate d = sManager.getDelegate(native_object);
- if (d == null) {
- return false;
- }
-
- Matrix_Delegate a_mtx = sManager.getDelegate(a);
- if (a_mtx == null) {
- return false;
- }
-
- Matrix_Delegate b_mtx = sManager.getDelegate(b);
- if (b_mtx == null) {
- return false;
- }
-
- multiply(d.mValues, a_mtx.mValues, b_mtx.mValues);
-
- return true;
- }
-
- @LayoutlibDelegate
- /*package*/ static boolean native_preTranslate(int native_object, float dx, float dy) {
- Matrix_Delegate d = sManager.getDelegate(native_object);
- if (d == null) {
- return false;
- }
-
- d.preTransform(getTranslate(dx, dy));
- return true;
- }
-
- @LayoutlibDelegate
- /*package*/ static boolean native_preScale(int native_object, float sx, float sy,
- float px, float py) {
- Matrix_Delegate d = sManager.getDelegate(native_object);
- if (d == null) {
- return false;
- }
-
- d.preTransform(getScale(sx, sy, px, py));
- return true;
- }
-
- @LayoutlibDelegate
- /*package*/ static boolean native_preScale(int native_object, float sx, float sy) {
- Matrix_Delegate d = sManager.getDelegate(native_object);
- if (d == null) {
- return false;
- }
-
- d.preTransform(getScale(sx, sy));
- return true;
- }
-
- @LayoutlibDelegate
- /*package*/ static boolean native_preRotate(int native_object, float degrees,
- float px, float py) {
- Matrix_Delegate d = sManager.getDelegate(native_object);
- if (d == null) {
- return false;
- }
-
- d.preTransform(getRotate(degrees, px, py));
- return true;
- }
-
- @LayoutlibDelegate
- /*package*/ static boolean native_preRotate(int native_object, float degrees) {
- Matrix_Delegate d = sManager.getDelegate(native_object);
- if (d == null) {
- return false;
- }
-
- double rad = Math.toRadians(degrees);
- float sin = (float)Math.sin(rad);
- float cos = (float)Math.cos(rad);
-
- d.preTransform(getRotate(sin, cos));
- return true;
- }
-
- @LayoutlibDelegate
- /*package*/ static boolean native_preSkew(int native_object, float kx, float ky,
- float px, float py) {
- Matrix_Delegate d = sManager.getDelegate(native_object);
- if (d == null) {
- return false;
- }
-
- d.preTransform(getSkew(kx, ky, px, py));
- return true;
- }
-
- @LayoutlibDelegate
- /*package*/ static boolean native_preSkew(int native_object, float kx, float ky) {
- Matrix_Delegate d = sManager.getDelegate(native_object);
- if (d == null) {
- return false;
- }
-
- d.preTransform(getSkew(kx, ky));
- return true;
- }
-
- @LayoutlibDelegate
- /*package*/ static boolean native_preConcat(int native_object, int other_matrix) {
- Matrix_Delegate d = sManager.getDelegate(native_object);
- if (d == null) {
- return false;
- }
-
- Matrix_Delegate other = sManager.getDelegate(other_matrix);
- if (other == null) {
- return false;
- }
-
- d.preTransform(other.mValues);
- return true;
- }
-
- @LayoutlibDelegate
- /*package*/ static boolean native_postTranslate(int native_object, float dx, float dy) {
- Matrix_Delegate d = sManager.getDelegate(native_object);
- if (d == null) {
- return false;
- }
-
- d.postTransform(getTranslate(dx, dy));
- return true;
- }
-
- @LayoutlibDelegate
- /*package*/ static boolean native_postScale(int native_object, float sx, float sy,
- float px, float py) {
- Matrix_Delegate d = sManager.getDelegate(native_object);
- if (d == null) {
- return false;
- }
-
- d.postTransform(getScale(sx, sy, px, py));
- return true;
- }
-
- @LayoutlibDelegate
- /*package*/ static boolean native_postScale(int native_object, float sx, float sy) {
- Matrix_Delegate d = sManager.getDelegate(native_object);
- if (d == null) {
- return false;
- }
-
- d.postTransform(getScale(sx, sy));
- return true;
- }
-
- @LayoutlibDelegate
- /*package*/ static boolean native_postRotate(int native_object, float degrees,
- float px, float py) {
- Matrix_Delegate d = sManager.getDelegate(native_object);
- if (d == null) {
- return false;
- }
-
- d.postTransform(getRotate(degrees, px, py));
- return true;
- }
-
- @LayoutlibDelegate
- /*package*/ static boolean native_postRotate(int native_object, float degrees) {
- Matrix_Delegate d = sManager.getDelegate(native_object);
- if (d == null) {
- return false;
- }
-
- d.postTransform(getRotate(degrees));
- return true;
- }
-
- @LayoutlibDelegate
- /*package*/ static boolean native_postSkew(int native_object, float kx, float ky,
- float px, float py) {
- Matrix_Delegate d = sManager.getDelegate(native_object);
- if (d == null) {
- return false;
- }
-
- d.postTransform(getSkew(kx, ky, px, py));
- return true;
- }
-
- @LayoutlibDelegate
- /*package*/ static boolean native_postSkew(int native_object, float kx, float ky) {
- Matrix_Delegate d = sManager.getDelegate(native_object);
- if (d == null) {
- return false;
- }
-
- d.postTransform(getSkew(kx, ky));
- return true;
- }
-
- @LayoutlibDelegate
- /*package*/ static boolean native_postConcat(int native_object, int other_matrix) {
- Matrix_Delegate d = sManager.getDelegate(native_object);
- if (d == null) {
- return false;
- }
-
- Matrix_Delegate other = sManager.getDelegate(other_matrix);
- if (other == null) {
- return false;
- }
-
- d.postTransform(other.mValues);
- return true;
- }
-
- @LayoutlibDelegate
- /*package*/ static boolean native_setRectToRect(int native_object, RectF src,
- RectF dst, int stf) {
- Matrix_Delegate d = sManager.getDelegate(native_object);
- if (d == null) {
- return false;
- }
-
- if (src.isEmpty()) {
- reset(d.mValues);
- return false;
- }
-
- if (dst.isEmpty()) {
- d.mValues[0] = d.mValues[1] = d.mValues[2] = d.mValues[3] = d.mValues[4] = d.mValues[5]
- = d.mValues[6] = d.mValues[7] = 0;
- d.mValues[8] = 1;
- } else {
- float tx, sx = dst.width() / src.width();
- float ty, sy = dst.height() / src.height();
- boolean xLarger = false;
-
- if (stf != ScaleToFit.FILL.nativeInt) {
- if (sx > sy) {
- xLarger = true;
- sx = sy;
- } else {
- sy = sx;
- }
- }
-
- tx = dst.left - src.left * sx;
- ty = dst.top - src.top * sy;
- if (stf == ScaleToFit.CENTER.nativeInt || stf == ScaleToFit.END.nativeInt) {
- float diff;
-
- if (xLarger) {
- diff = dst.width() - src.width() * sy;
- } else {
- diff = dst.height() - src.height() * sy;
- }
-
- if (stf == ScaleToFit.CENTER.nativeInt) {
- diff = diff / 2;
- }
-
- if (xLarger) {
- tx += diff;
- } else {
- ty += diff;
- }
- }
-
- d.mValues[0] = sx;
- d.mValues[4] = sy;
- d.mValues[2] = tx;
- d.mValues[5] = ty;
- d.mValues[1] = d.mValues[3] = d.mValues[6] = d.mValues[7] = 0;
-
- }
- // shared cleanup
- d.mValues[8] = 1;
- return true;
- }
-
- @LayoutlibDelegate
- /*package*/ static boolean native_setPolyToPoly(int native_object, float[] src, int srcIndex,
- float[] dst, int dstIndex, int pointCount) {
- // FIXME
- Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED,
- "Matrix.setPolyToPoly is not supported.",
- null, null /*data*/);
- return false;
- }
-
- @LayoutlibDelegate
- /*package*/ static boolean native_invert(int native_object, int inverse) {
- Matrix_Delegate d = sManager.getDelegate(native_object);
- if (d == null) {
- return false;
- }
-
- Matrix_Delegate inv_mtx = sManager.getDelegate(inverse);
- if (inv_mtx == null) {
- return false;
- }
-
- try {
- AffineTransform affineTransform = d.getAffineTransform();
- AffineTransform inverseTransform = affineTransform.createInverse();
- inv_mtx.mValues[0] = (float)inverseTransform.getScaleX();
- inv_mtx.mValues[1] = (float)inverseTransform.getShearX();
- inv_mtx.mValues[2] = (float)inverseTransform.getTranslateX();
- inv_mtx.mValues[3] = (float)inverseTransform.getScaleX();
- inv_mtx.mValues[4] = (float)inverseTransform.getShearY();
- inv_mtx.mValues[5] = (float)inverseTransform.getTranslateY();
-
- return true;
- } catch (NoninvertibleTransformException e) {
- return false;
- }
- }
-
- @LayoutlibDelegate
- /*package*/ static void native_mapPoints(int native_object, float[] dst, int dstIndex,
- float[] src, int srcIndex, int ptCount, boolean isPts) {
- Matrix_Delegate d = sManager.getDelegate(native_object);
- if (d == null) {
- return;
- }
-
- if (isPts) {
- d.mapPoints(dst, dstIndex, src, srcIndex, ptCount);
- } else {
- d.mapVectors(dst, dstIndex, src, srcIndex, ptCount);
- }
- }
-
- @LayoutlibDelegate
- /*package*/ static boolean native_mapRect(int native_object, RectF dst, RectF src) {
- Matrix_Delegate d = sManager.getDelegate(native_object);
- if (d == null) {
- return false;
- }
-
- return d.mapRect(dst, src);
- }
-
- @LayoutlibDelegate
- /*package*/ static float native_mapRadius(int native_object, float radius) {
- Matrix_Delegate d = sManager.getDelegate(native_object);
- if (d == null) {
- return 0.f;
- }
-
- float[] src = new float[] { radius, 0.f, 0.f, radius };
- d.mapVectors(src, 0, src, 0, 2);
-
- float l1 = getPointLength(src, 0);
- float l2 = getPointLength(src, 2);
-
- return (float) Math.sqrt(l1 * l2);
- }
-
- @LayoutlibDelegate
- /*package*/ static void native_getValues(int native_object, float[] values) {
- Matrix_Delegate d = sManager.getDelegate(native_object);
- if (d == null) {
- return;
- }
-
- System.arraycopy(d.mValues, 0, d.mValues, 0, MATRIX_SIZE);
- }
-
- @LayoutlibDelegate
- /*package*/ static void native_setValues(int native_object, float[] values) {
- Matrix_Delegate d = sManager.getDelegate(native_object);
- if (d == null) {
- return;
- }
-
- System.arraycopy(values, 0, d.mValues, 0, MATRIX_SIZE);
- }
-
- @LayoutlibDelegate
- /*package*/ static boolean native_equals(int native_a, int native_b) {
- Matrix_Delegate a = sManager.getDelegate(native_a);
- if (a == null) {
- return false;
- }
-
- Matrix_Delegate b = sManager.getDelegate(native_b);
- if (b == null) {
- return false;
- }
-
- for (int i = 0 ; i < MATRIX_SIZE ; i++) {
- if (a.mValues[i] != b.mValues[i]) {
- return false;
- }
- }
-
- return true;
- }
-
- @LayoutlibDelegate
- /*package*/ static void finalizer(int native_instance) {
- sManager.removeJavaReferenceFor(native_instance);
- }
-
- // ---- Private helper methods ----
-
- /*package*/ static AffineTransform getAffineTransform(float[] matrix) {
- // the AffineTransform constructor takes the value in a different order
- // for a matrix [ 0 1 2 ]
- // [ 3 4 5 ]
- // the order is 0, 3, 1, 4, 2, 5...
- return new AffineTransform(
- matrix[0], matrix[3], matrix[1],
- matrix[4], matrix[2], matrix[5]);
- }
-
- /**
- * Reset a matrix to the identity
- */
- private static void reset(float[] mtx) {
- for (int i = 0, k = 0; i < 3; i++) {
- for (int j = 0; j < 3; j++, k++) {
- mtx[k] = ((i==j) ? 1 : 0);
- }
- }
- }
-
- @SuppressWarnings("unused")
- private final static int kIdentity_Mask = 0;
- private final static int kTranslate_Mask = 0x01; //!< set if the matrix has translation
- private final static int kScale_Mask = 0x02; //!< set if the matrix has X or Y scale
- private final static int kAffine_Mask = 0x04; //!< set if the matrix skews or rotates
- private final static int kPerspective_Mask = 0x08; //!< set if the matrix is in perspective
- private final static int kRectStaysRect_Mask = 0x10;
- @SuppressWarnings("unused")
- private final static int kUnknown_Mask = 0x80;
-
- @SuppressWarnings("unused")
- private final static int kAllMasks = kTranslate_Mask |
- kScale_Mask |
- kAffine_Mask |
- kPerspective_Mask |
- kRectStaysRect_Mask;
-
- // these guys align with the masks, so we can compute a mask from a variable 0/1
- @SuppressWarnings("unused")
- private final static int kTranslate_Shift = 0;
- @SuppressWarnings("unused")
- private final static int kScale_Shift = 1;
- @SuppressWarnings("unused")
- private final static int kAffine_Shift = 2;
- @SuppressWarnings("unused")
- private final static int kPerspective_Shift = 3;
- private final static int kRectStaysRect_Shift = 4;
-
- private int computeTypeMask() {
- int mask = 0;
-
- if (mValues[6] != 0. || mValues[7] != 0. || mValues[8] != 1.) {
- mask |= kPerspective_Mask;
- }
-
- if (mValues[2] != 0. || mValues[5] != 0.) {
- mask |= kTranslate_Mask;
- }
-
- float m00 = mValues[0];
- float m01 = mValues[1];
- float m10 = mValues[3];
- float m11 = mValues[4];
-
- if (m01 != 0. || m10 != 0.) {
- mask |= kAffine_Mask;
- }
-
- if (m00 != 1. || m11 != 1.) {
- mask |= kScale_Mask;
- }
-
- if ((mask & kPerspective_Mask) == 0) {
- // map non-zero to 1
- int im00 = m00 != 0 ? 1 : 0;
- int im01 = m01 != 0 ? 1 : 0;
- int im10 = m10 != 0 ? 1 : 0;
- int im11 = m11 != 0 ? 1 : 0;
-
- // record if the (p)rimary and (s)econdary diagonals are all 0 or
- // all non-zero (answer is 0 or 1)
- int dp0 = (im00 | im11) ^ 1; // true if both are 0
- int dp1 = im00 & im11; // true if both are 1
- int ds0 = (im01 | im10) ^ 1; // true if both are 0
- int ds1 = im01 & im10; // true if both are 1
-
- // return 1 if primary is 1 and secondary is 0 or
- // primary is 0 and secondary is 1
- mask |= ((dp0 & ds1) | (dp1 & ds0)) << kRectStaysRect_Shift;
- }
-
- return mask;
- }
-
- private Matrix_Delegate() {
- reset();
- }
-
- private Matrix_Delegate(float[] values) {
- System.arraycopy(values, 0, mValues, 0, MATRIX_SIZE);
- }
-
- /**
- * Adds the given transformation to the current Matrix
- * <p/>This in effect does this = this*matrix
- * @param matrix
- */
- private void postTransform(float[] matrix) {
- float[] tmp = new float[9];
- multiply(tmp, mValues, matrix);
- mValues = tmp;
- }
-
- /**
- * Adds the given transformation to the current Matrix
- * <p/>This in effect does this = matrix*this
- * @param matrix
- */
- private void preTransform(float[] matrix) {
- float[] tmp = new float[9];
- multiply(tmp, matrix, mValues);
- mValues = tmp;
- }
-
- /**
- * Apply this matrix to the array of 2D points specified by src, and write
- * the transformed points into the array of points specified by dst. The
- * two arrays represent their "points" as pairs of floats [x, y].
- *
- * @param dst The array of dst points (x,y pairs)
- * @param dstIndex The index of the first [x,y] pair of dst floats
- * @param src The array of src points (x,y pairs)
- * @param srcIndex The index of the first [x,y] pair of src floats
- * @param pointCount The number of points (x,y pairs) to transform
- */
-
- private void mapPoints(float[] dst, int dstIndex, float[] src, int srcIndex,
- int pointCount) {
- final int count = pointCount * 2;
-
- float[] tmpDest = dst;
- boolean inPlace = dst == src;
- if (inPlace) {
- tmpDest = new float[dstIndex + count];
- }
-
- for (int i = 0 ; i < count ; i += 2) {
- // just in case we are doing in place, we better put this in temp vars
- float x = mValues[0] * src[i + srcIndex] +
- mValues[1] * src[i + srcIndex + 1] +
- mValues[2];
- float y = mValues[3] * src[i + srcIndex] +
- mValues[4] * src[i + srcIndex + 1] +
- mValues[5];
-
- tmpDest[i + dstIndex] = x;
- tmpDest[i + dstIndex + 1] = y;
- }
-
- if (inPlace) {
- System.arraycopy(tmpDest, dstIndex, dst, dstIndex, count);
- }
- }
-
- /**
- * Apply this matrix to the array of 2D points, and write the transformed
- * points back into the array
- *
- * @param pts The array [x0, y0, x1, y1, ...] of points to transform.
- */
-
- private void mapPoints(float[] pts) {
- mapPoints(pts, 0, pts, 0, pts.length >> 1);
- }
-
- private void mapVectors(float[] dst, int dstIndex, float[] src, int srcIndex, int ptCount) {
- if (hasPerspective()) {
- // transform the (0,0) point
- float[] origin = new float[] { 0.f, 0.f};
- mapPoints(origin);
-
- // translate the vector data as points
- mapPoints(dst, dstIndex, src, srcIndex, ptCount);
-
- // then substract the transformed origin.
- final int count = ptCount * 2;
- for (int i = 0 ; i < count ; i += 2) {
- dst[dstIndex + i] = dst[dstIndex + i] - origin[0];
- dst[dstIndex + i + 1] = dst[dstIndex + i + 1] - origin[1];
- }
- } else {
- // make a copy of the matrix
- Matrix_Delegate copy = new Matrix_Delegate(mValues);
-
- // remove the translation
- setTranslate(copy.mValues, 0, 0);
-
- // map the content as points.
- copy.mapPoints(dst, dstIndex, src, srcIndex, ptCount);
- }
- }
-
- private static float getPointLength(float[] src, int index) {
- return (float) Math.sqrt(src[index] * src[index] + src[index + 1] * src[index + 1]);
- }
-
- /**
- * multiply two matrices and store them in a 3rd.
- * <p/>This in effect does dest = a*b
- * dest cannot be the same as a or b.
- */
- /*package*/ static void multiply(float dest[], float[] a, float[] b) {
- // first row
- dest[0] = b[0] * a[0] + b[1] * a[3] + b[2] * a[6];
- dest[1] = b[0] * a[1] + b[1] * a[4] + b[2] * a[7];
- dest[2] = b[0] * a[2] + b[1] * a[5] + b[2] * a[8];
-
- // 2nd row
- dest[3] = b[3] * a[0] + b[4] * a[3] + b[5] * a[6];
- dest[4] = b[3] * a[1] + b[4] * a[4] + b[5] * a[7];
- dest[5] = b[3] * a[2] + b[4] * a[5] + b[5] * a[8];
-
- // 3rd row
- dest[6] = b[6] * a[0] + b[7] * a[3] + b[8] * a[6];
- dest[7] = b[6] * a[1] + b[7] * a[4] + b[8] * a[7];
- dest[8] = b[6] * a[2] + b[7] * a[5] + b[8] * a[8];
- }
-
- /**
- * Returns a matrix that represents a given translate
- * @param dx
- * @param dy
- * @return
- */
- /*package*/ static float[] getTranslate(float dx, float dy) {
- return setTranslate(new float[9], dx, dy);
- }
-
- /*package*/ static float[] setTranslate(float[] dest, float dx, float dy) {
- dest[0] = 1;
- dest[1] = 0;
- dest[2] = dx;
- dest[3] = 0;
- dest[4] = 1;
- dest[5] = dy;
- dest[6] = 0;
- dest[7] = 0;
- dest[8] = 1;
- return dest;
- }
-
- /*package*/ static float[] getScale(float sx, float sy) {
- return new float[] { sx, 0, 0, 0, sy, 0, 0, 0, 1 };
- }
-
- /**
- * Returns a matrix that represents the given scale info.
- * @param sx
- * @param sy
- * @param px
- * @param py
- */
- /*package*/ static float[] getScale(float sx, float sy, float px, float py) {
- float[] tmp = new float[9];
- float[] tmp2 = new float[9];
-
- // TODO: do it in one pass
-
- // translate tmp so that the pivot is in 0,0
- setTranslate(tmp, -px, -py);
-
- // scale into tmp2
- multiply(tmp2, tmp, getScale(sx, sy));
-
- // translate back the pivot back into tmp
- multiply(tmp, tmp2, getTranslate(px, py));
-
- return tmp;
- }
-
-
- /*package*/ static float[] getRotate(float degrees) {
- double rad = Math.toRadians(degrees);
- float sin = (float)Math.sin(rad);
- float cos = (float)Math.cos(rad);
-
- return getRotate(sin, cos);
- }
-
- /*package*/ static float[] getRotate(float sin, float cos) {
- return setRotate(new float[9], sin, cos);
- }
-
- /*package*/ static float[] setRotate(float[] dest, float degrees) {
- double rad = Math.toRadians(degrees);
- float sin = (float)Math.sin(rad);
- float cos = (float)Math.cos(rad);
-
- return setRotate(dest, sin, cos);
- }
-
- /*package*/ static float[] setRotate(float[] dest, float sin, float cos) {
- dest[0] = cos;
- dest[1] = -sin;
- dest[2] = 0;
- dest[3] = sin;
- dest[4] = cos;
- dest[5] = 0;
- dest[6] = 0;
- dest[7] = 0;
- dest[8] = 1;
- return dest;
- }
-
- /*package*/ static float[] getRotate(float degrees, float px, float py) {
- float[] tmp = new float[9];
- float[] tmp2 = new float[9];
-
- // TODO: do it in one pass
-
- // translate so that the pivot is in 0,0
- setTranslate(tmp, -px, -py);
-
- // rotate into tmp2
- double rad = Math.toRadians(degrees);
- float cos = (float)Math.cos(rad);
- float sin = (float)Math.sin(rad);
- multiply(tmp2, tmp, getRotate(sin, cos));
-
- // translate back the pivot back into tmp
- multiply(tmp, tmp2, getTranslate(px, py));
-
- return tmp;
- }
-
- /*package*/ static float[] getSkew(float kx, float ky) {
- return new float[] { 1, kx, 0, ky, 1, 0, 0, 0, 1 };
- }
-
- /*package*/ static float[] getSkew(float kx, float ky, float px, float py) {
- float[] tmp = new float[9];
- float[] tmp2 = new float[9];
-
- // TODO: do it in one pass
-
- // translate so that the pivot is in 0,0
- setTranslate(tmp, -px, -py);
-
- // skew into tmp2
- multiply(tmp2, tmp, new float[] { 1, kx, 0, ky, 1, 0, 0, 0, 1 });
- // translate back the pivot back into tmp
- multiply(tmp, tmp2, getTranslate(px, py));
-
- return tmp;
- }
-}
diff --git a/tools/layoutlib/bridge/src/android/graphics/NinePatch_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/NinePatch_Delegate.java
deleted file mode 100644
index fa68796..0000000
--- a/tools/layoutlib/bridge/src/android/graphics/NinePatch_Delegate.java
+++ /dev/null
@@ -1,247 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.graphics;
-
-import com.android.ide.common.rendering.api.LayoutLog;
-import com.android.layoutlib.bridge.Bridge;
-import com.android.layoutlib.bridge.impl.DelegateManager;
-import com.android.layoutlib.bridge.impl.GcSnapshot;
-import com.android.ninepatch.NinePatchChunk;
-import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
-
-import android.graphics.drawable.NinePatchDrawable;
-
-import java.awt.Graphics2D;
-import java.awt.image.BufferedImage;
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.lang.ref.SoftReference;
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * Delegate implementing the native methods of android.graphics.NinePatch
- *
- * Through the layoutlib_create tool, the original native methods of NinePatch have been replaced
- * by calls to methods of the same name in this delegate class.
- *
- * Because it's a stateless class to start with, there's no need to keep a {@link DelegateManager}
- * around to map int to instance of the delegate.
- *
- */
-public final class NinePatch_Delegate {
-
- // ---- delegate manager ----
- private static final DelegateManager<NinePatch_Delegate> sManager =
- new DelegateManager<NinePatch_Delegate>(NinePatch_Delegate.class);
-
- // ---- delegate helper data ----
- /**
- * Cache map for {@link NinePatchChunk}.
- * When the chunks are created they are serialized into a byte[], and both are put
- * in the cache, using a {@link SoftReference} for the chunk. The default Java classes
- * for {@link NinePatch} and {@link NinePatchDrawable} only reference to the byte[] data, and
- * provide this for drawing.
- * Using the cache map allows us to not have to deserialize the byte[] back into a
- * {@link NinePatchChunk} every time a rendering is done.
- */
- private final static Map<byte[], SoftReference<NinePatchChunk>> sChunkCache =
- new HashMap<byte[], SoftReference<NinePatchChunk>>();
-
- // ---- delegate data ----
- private byte[] chunk;
-
-
- // ---- Public Helper methods ----
-
- /**
- * Serializes the given chunk.
- *
- * @return the serialized data for the chunk.
- */
- public static byte[] serialize(NinePatchChunk chunk) {
- // serialize the chunk to get a byte[]
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- ObjectOutputStream oos = null;
- try {
- oos = new ObjectOutputStream(baos);
- oos.writeObject(chunk);
- } catch (IOException e) {
- Bridge.getLog().error(null, "Failed to serialize NinePatchChunk.", e, null /*data*/);
- return null;
- } finally {
- if (oos != null) {
- try {
- oos.close();
- } catch (IOException e) {
- }
- }
- }
-
- // get the array and add it to the cache
- byte[] array = baos.toByteArray();
- sChunkCache.put(array, new SoftReference<NinePatchChunk>(chunk));
- return array;
- }
-
- /**
- * Returns a {@link NinePatchChunk} object for the given serialized representation.
- *
- * If the chunk is present in the cache then the object from the cache is returned, otherwise
- * the array is deserialized into a {@link NinePatchChunk} object.
- *
- * @param array the serialized representation of the chunk.
- * @return the NinePatchChunk or null if deserialization failed.
- */
- public static NinePatchChunk getChunk(byte[] array) {
- SoftReference<NinePatchChunk> chunkRef = sChunkCache.get(array);
- NinePatchChunk chunk = chunkRef.get();
- if (chunk == null) {
- ByteArrayInputStream bais = new ByteArrayInputStream(array);
- ObjectInputStream ois = null;
- try {
- ois = new ObjectInputStream(bais);
- chunk = (NinePatchChunk) ois.readObject();
-
- // put back the chunk in the cache
- if (chunk != null) {
- sChunkCache.put(array, new SoftReference<NinePatchChunk>(chunk));
- }
- } catch (IOException e) {
- Bridge.getLog().error(LayoutLog.TAG_BROKEN,
- "Failed to deserialize NinePatchChunk content.", e, null /*data*/);
- return null;
- } catch (ClassNotFoundException e) {
- Bridge.getLog().error(LayoutLog.TAG_BROKEN,
- "Failed to deserialize NinePatchChunk class.", e, null /*data*/);
- return null;
- } finally {
- if (ois != null) {
- try {
- ois.close();
- } catch (IOException e) {
- }
- }
- }
- }
-
- return chunk;
- }
-
- // ---- native methods ----
-
- @LayoutlibDelegate
- /*package*/ static boolean isNinePatchChunk(byte[] chunk) {
- NinePatchChunk chunkObject = getChunk(chunk);
- if (chunkObject != null) {
- return true;
- }
-
- return false;
- }
-
- @LayoutlibDelegate
- /*package*/ static int validateNinePatchChunk(int bitmap, byte[] chunk) {
- // the default JNI implementation only checks that the byte[] has the same
- // size as the C struct it represent. Since we cannot do the same check (serialization
- // will return different size depending on content), we do nothing.
- NinePatch_Delegate newDelegate = new NinePatch_Delegate();
- newDelegate.chunk = chunk;
- return sManager.addNewDelegate(newDelegate);
- }
-
- /*package*/ static void nativeFinalize(int chunk) {
- sManager.removeJavaReferenceFor(chunk);
- }
-
- @LayoutlibDelegate
- /*package*/ static void nativeDraw(int canvas_instance, RectF loc, int bitmap_instance,
- int chunk, int paint_instance_or_null, int destDensity, int srcDensity) {
- draw(canvas_instance,
- (int) loc.left, (int) loc.top, (int) loc.width(), (int) loc.height(),
- bitmap_instance, chunk, paint_instance_or_null,
- destDensity, srcDensity);
- }
-
- @LayoutlibDelegate
- /*package*/ static void nativeDraw(int canvas_instance, Rect loc, int bitmap_instance,
- int chunk, int paint_instance_or_null, int destDensity, int srcDensity) {
- draw(canvas_instance,
- loc.left, loc.top, loc.width(), loc.height(),
- bitmap_instance, chunk, paint_instance_or_null,
- destDensity, srcDensity);
- }
-
- @LayoutlibDelegate
- /*package*/ static int nativeGetTransparentRegion(int bitmap, int chunk, Rect location) {
- return 0;
- }
-
- // ---- Private Helper methods ----
-
- private static void draw(int canvas_instance,
- final int left, final int top, final int right, final int bottom,
- int bitmap_instance, int chunk, int paint_instance_or_null,
- final int destDensity, final int srcDensity) {
- // get the delegate from the native int.
- final Bitmap_Delegate bitmap_delegate = Bitmap_Delegate.getDelegate(bitmap_instance);
- if (bitmap_delegate == null) {
- return;
- }
-
- byte[] c = null;
- NinePatch_Delegate delegate = sManager.getDelegate(chunk);
- if (delegate != null) {
- c = delegate.chunk;
- }
- if (c == null) {
- // not a 9-patch?
- BufferedImage image = bitmap_delegate.getImage();
- Canvas_Delegate.native_drawBitmap(canvas_instance, bitmap_instance,
- new Rect(0, 0, image.getWidth(), image.getHeight()),
- new Rect(left, top, right, bottom),
- paint_instance_or_null, destDensity, srcDensity);
- return;
- }
-
- final NinePatchChunk chunkObject = getChunk(c);
- assert chunkObject != null;
- if (chunkObject == null) {
- return;
- }
-
- Canvas_Delegate canvas_delegate = Canvas_Delegate.getDelegate(canvas_instance);
- if (canvas_delegate == null) {
- return;
- }
-
- // this one can be null
- Paint_Delegate paint_delegate = Paint_Delegate.getDelegate(paint_instance_or_null);
-
- canvas_delegate.getSnapshot().draw(new GcSnapshot.Drawable() {
- @Override
- public void draw(Graphics2D graphics, Paint_Delegate paint) {
- chunkObject.draw(bitmap_delegate.getImage(), graphics,
- left, top, right - left, bottom - top, destDensity, srcDensity);
- }
- }, paint_delegate, true /*compositeOnly*/, false /*forceSrcMode*/);
-
- }
-}
diff --git a/tools/layoutlib/bridge/src/android/graphics/PaintFlagsDrawFilter_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/PaintFlagsDrawFilter_Delegate.java
deleted file mode 100644
index 71d346a..0000000
--- a/tools/layoutlib/bridge/src/android/graphics/PaintFlagsDrawFilter_Delegate.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.graphics;
-
-import com.android.layoutlib.bridge.impl.DelegateManager;
-import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
-
-/**
- * Delegate implementing the native methods of android.graphics.PaintFlagsDrawFilter
- *
- * Through the layoutlib_create tool, the original native methods of PaintFlagsDrawFilter have been
- * replaced by calls to methods of the same name in this delegate class.
- *
- * This class behaves like the original native implementation, but in Java, keeping previously
- * native data into its own objects and mapping them to int that are sent back and forth between
- * it and the original PaintFlagsDrawFilter class.
- *
- * Because this extends {@link DrawFilter_Delegate}, there's no need to use a
- * {@link DelegateManager}, as all the DrawFilter classes will be added to the manager owned by
- * {@link DrawFilter_Delegate}.
- *
- * @see DrawFilter_Delegate
- *
- */
-public class PaintFlagsDrawFilter_Delegate extends DrawFilter_Delegate {
-
- // ---- delegate data ----
-
- // ---- Public Helper methods ----
-
- @Override
- public boolean isSupported() {
- return false;
- }
-
- @Override
- public String getSupportMessage() {
- return "Paint Flags Draw Filters are not supported.";
- }
-
- // ---- native methods ----
-
- @LayoutlibDelegate
- /*package*/ static int nativeConstructor(int clearBits, int setBits) {
- PaintFlagsDrawFilter_Delegate newDelegate = new PaintFlagsDrawFilter_Delegate();
- return sManager.addNewDelegate(newDelegate);
- }
-
- // ---- Private delegate/helper methods ----
-}
diff --git a/tools/layoutlib/bridge/src/android/graphics/Paint_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/Paint_Delegate.java
deleted file mode 100644
index 41953ed..0000000
--- a/tools/layoutlib/bridge/src/android/graphics/Paint_Delegate.java
+++ /dev/null
@@ -1,1208 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.graphics;
-
-import com.android.ide.common.rendering.api.LayoutLog;
-import com.android.layoutlib.bridge.Bridge;
-import com.android.layoutlib.bridge.impl.DelegateManager;
-import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
-
-import android.graphics.Paint.FontMetrics;
-import android.graphics.Paint.FontMetricsInt;
-import android.text.TextUtils;
-
-import java.awt.BasicStroke;
-import java.awt.Font;
-import java.awt.Shape;
-import java.awt.Stroke;
-import java.awt.Toolkit;
-import java.awt.font.FontRenderContext;
-import java.awt.geom.AffineTransform;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Locale;
-
-/**
- * Delegate implementing the native methods of android.graphics.Paint
- *
- * Through the layoutlib_create tool, the original native methods of Paint have been replaced
- * by calls to methods of the same name in this delegate class.
- *
- * This class behaves like the original native implementation, but in Java, keeping previously
- * native data into its own objects and mapping them to int that are sent back and forth between
- * it and the original Paint class.
- *
- * @see DelegateManager
- *
- */
-public class Paint_Delegate {
-
- /**
- * Class associating a {@link Font} and it's {@link java.awt.FontMetrics}.
- */
- /*package*/ static final class FontInfo {
- Font mFont;
- java.awt.FontMetrics mMetrics;
- }
-
- // ---- delegate manager ----
- private static final DelegateManager<Paint_Delegate> sManager =
- new DelegateManager<Paint_Delegate>(Paint_Delegate.class);
-
- // ---- delegate helper data ----
- private List<FontInfo> mFonts;
- private final FontRenderContext mFontContext = new FontRenderContext(
- new AffineTransform(), true, true);
-
- // ---- delegate data ----
- private int mFlags;
- private int mColor;
- private int mStyle;
- private int mCap;
- private int mJoin;
- private int mTextAlign;
- private Typeface_Delegate mTypeface;
- private float mStrokeWidth;
- private float mStrokeMiter;
- private float mTextSize;
- private float mTextScaleX;
- private float mTextSkewX;
- private int mHintingMode = Paint.HINTING_ON;
-
- private Xfermode_Delegate mXfermode;
- private ColorFilter_Delegate mColorFilter;
- private Shader_Delegate mShader;
- private PathEffect_Delegate mPathEffect;
- private MaskFilter_Delegate mMaskFilter;
- private Rasterizer_Delegate mRasterizer;
-
- private Locale mLocale = Locale.getDefault();
-
-
- // ---- Public Helper methods ----
-
- public static Paint_Delegate getDelegate(int native_paint) {
- return sManager.getDelegate(native_paint);
- }
-
- /**
- * Returns the list of {@link Font} objects. The first item is the main font, the rest
- * are fall backs for characters not present in the main font.
- */
- public List<FontInfo> getFonts() {
- return mFonts;
- }
-
- public boolean isAntiAliased() {
- return (mFlags & Paint.ANTI_ALIAS_FLAG) != 0;
- }
-
- public boolean isFilterBitmap() {
- return (mFlags & Paint.FILTER_BITMAP_FLAG) != 0;
- }
-
- public int getStyle() {
- return mStyle;
- }
-
- public int getColor() {
- return mColor;
- }
-
- public int getAlpha() {
- return mColor >>> 24;
- }
-
- public void setAlpha(int alpha) {
- mColor = (alpha << 24) | (mColor & 0x00FFFFFF);
- }
-
- public int getTextAlign() {
- return mTextAlign;
- }
-
- public float getStrokeWidth() {
- return mStrokeWidth;
- }
-
- /**
- * returns the value of stroke miter needed by the java api.
- */
- public float getJavaStrokeMiter() {
- float miter = mStrokeMiter * mStrokeWidth;
- if (miter < 1.f) {
- miter = 1.f;
- }
- return miter;
- }
-
- public int getJavaCap() {
- switch (Paint.sCapArray[mCap]) {
- case BUTT:
- return BasicStroke.CAP_BUTT;
- case ROUND:
- return BasicStroke.CAP_ROUND;
- default:
- case SQUARE:
- return BasicStroke.CAP_SQUARE;
- }
- }
-
- public int getJavaJoin() {
- switch (Paint.sJoinArray[mJoin]) {
- default:
- case MITER:
- return BasicStroke.JOIN_MITER;
- case ROUND:
- return BasicStroke.JOIN_ROUND;
- case BEVEL:
- return BasicStroke.JOIN_BEVEL;
- }
- }
-
- public Stroke getJavaStroke() {
- if (mPathEffect != null) {
- if (mPathEffect.isSupported()) {
- Stroke stroke = mPathEffect.getStroke(this);
- assert stroke != null;
- if (stroke != null) {
- return stroke;
- }
- } else {
- Bridge.getLog().fidelityWarning(LayoutLog.TAG_PATHEFFECT,
- mPathEffect.getSupportMessage(),
- null, null /*data*/);
- }
- }
-
- // if no custom stroke as been set, set the default one.
- return new BasicStroke(
- getStrokeWidth(),
- getJavaCap(),
- getJavaJoin(),
- getJavaStrokeMiter());
- }
-
- /**
- * Returns the {@link Xfermode} delegate or null if none have been set
- *
- * @return the delegate or null.
- */
- public Xfermode_Delegate getXfermode() {
- return mXfermode;
- }
-
- /**
- * Returns the {@link ColorFilter} delegate or null if none have been set
- *
- * @return the delegate or null.
- */
- public ColorFilter_Delegate getColorFilter() {
- return mColorFilter;
- }
-
- /**
- * Returns the {@link Shader} delegate or null if none have been set
- *
- * @return the delegate or null.
- */
- public Shader_Delegate getShader() {
- return mShader;
- }
-
- /**
- * Returns the {@link MaskFilter} delegate or null if none have been set
- *
- * @return the delegate or null.
- */
- public MaskFilter_Delegate getMaskFilter() {
- return mMaskFilter;
- }
-
- /**
- * Returns the {@link Rasterizer} delegate or null if none have been set
- *
- * @return the delegate or null.
- */
- public Rasterizer_Delegate getRasterizer() {
- return mRasterizer;
- }
-
- // ---- native methods ----
-
- @LayoutlibDelegate
- /*package*/ static int getFlags(Paint thisPaint) {
- // get the delegate from the native int.
- Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
- if (delegate == null) {
- return 0;
- }
-
- return delegate.mFlags;
- }
-
-
-
- @LayoutlibDelegate
- /*package*/ static void setFlags(Paint thisPaint, int flags) {
- // get the delegate from the native int.
- Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
- if (delegate == null) {
- return;
- }
-
- delegate.mFlags = flags;
- }
-
- @LayoutlibDelegate
- /*package*/ static void setFilterBitmap(Paint thisPaint, boolean filter) {
- setFlag(thisPaint, Paint.FILTER_BITMAP_FLAG, filter);
- }
-
- @LayoutlibDelegate
- /*package*/ static int getHinting(Paint thisPaint) {
- // get the delegate from the native int.
- Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
- if (delegate == null) {
- return Paint.HINTING_ON;
- }
-
- return delegate.mHintingMode;
- }
-
- @LayoutlibDelegate
- /*package*/ static void setHinting(Paint thisPaint, int mode) {
- // get the delegate from the native int.
- Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
- if (delegate == null) {
- return;
- }
-
- delegate.mHintingMode = mode;
- }
-
- @LayoutlibDelegate
- /*package*/ static void setAntiAlias(Paint thisPaint, boolean aa) {
- setFlag(thisPaint, Paint.ANTI_ALIAS_FLAG, aa);
- }
-
- @LayoutlibDelegate
- /*package*/ static void setSubpixelText(Paint thisPaint, boolean subpixelText) {
- setFlag(thisPaint, Paint.SUBPIXEL_TEXT_FLAG, subpixelText);
- }
-
- @LayoutlibDelegate
- /*package*/ static void setUnderlineText(Paint thisPaint, boolean underlineText) {
- setFlag(thisPaint, Paint.UNDERLINE_TEXT_FLAG, underlineText);
- }
-
- @LayoutlibDelegate
- /*package*/ static void setStrikeThruText(Paint thisPaint, boolean strikeThruText) {
- setFlag(thisPaint, Paint.STRIKE_THRU_TEXT_FLAG, strikeThruText);
- }
-
- @LayoutlibDelegate
- /*package*/ static void setFakeBoldText(Paint thisPaint, boolean fakeBoldText) {
- setFlag(thisPaint, Paint.FAKE_BOLD_TEXT_FLAG, fakeBoldText);
- }
-
- @LayoutlibDelegate
- /*package*/ static void setDither(Paint thisPaint, boolean dither) {
- setFlag(thisPaint, Paint.DITHER_FLAG, dither);
- }
-
- @LayoutlibDelegate
- /*package*/ static void setLinearText(Paint thisPaint, boolean linearText) {
- setFlag(thisPaint, Paint.LINEAR_TEXT_FLAG, linearText);
- }
-
- @LayoutlibDelegate
- /*package*/ static int getColor(Paint thisPaint) {
- // get the delegate from the native int.
- Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
- if (delegate == null) {
- return 0;
- }
-
- return delegate.mColor;
- }
-
- @LayoutlibDelegate
- /*package*/ static void setColor(Paint thisPaint, int color) {
- // get the delegate from the native int.
- Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
- if (delegate == null) {
- return;
- }
-
- delegate.mColor = color;
- }
-
- @LayoutlibDelegate
- /*package*/ static int getAlpha(Paint thisPaint) {
- // get the delegate from the native int.
- Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
- if (delegate == null) {
- return 0;
- }
-
- return delegate.getAlpha();
- }
-
- @LayoutlibDelegate
- /*package*/ static void setAlpha(Paint thisPaint, int a) {
- // get the delegate from the native int.
- Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
- if (delegate == null) {
- return;
- }
-
- delegate.setAlpha(a);
- }
-
- @LayoutlibDelegate
- /*package*/ static float getStrokeWidth(Paint thisPaint) {
- // get the delegate from the native int.
- Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
- if (delegate == null) {
- return 1.f;
- }
-
- return delegate.mStrokeWidth;
- }
-
- @LayoutlibDelegate
- /*package*/ static void setStrokeWidth(Paint thisPaint, float width) {
- // get the delegate from the native int.
- Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
- if (delegate == null) {
- return;
- }
-
- delegate.mStrokeWidth = width;
- }
-
- @LayoutlibDelegate
- /*package*/ static float getStrokeMiter(Paint thisPaint) {
- // get the delegate from the native int.
- Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
- if (delegate == null) {
- return 1.f;
- }
-
- return delegate.mStrokeMiter;
- }
-
- @LayoutlibDelegate
- /*package*/ static void setStrokeMiter(Paint thisPaint, float miter) {
- // get the delegate from the native int.
- Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
- if (delegate == null) {
- return;
- }
-
- delegate.mStrokeMiter = miter;
- }
-
- @LayoutlibDelegate
- /*package*/ static void nSetShadowLayer(Paint thisPaint, float radius, float dx, float dy,
- int color) {
- // FIXME
- Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED,
- "Paint.setShadowLayer is not supported.", null, null /*data*/);
- }
-
- @LayoutlibDelegate
- /*package*/ static float getTextSize(Paint thisPaint) {
- // get the delegate from the native int.
- Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
- if (delegate == null) {
- return 1.f;
- }
-
- return delegate.mTextSize;
- }
-
- @LayoutlibDelegate
- /*package*/ static void setTextSize(Paint thisPaint, float textSize) {
- // get the delegate from the native int.
- Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
- if (delegate == null) {
- return;
- }
-
- delegate.mTextSize = textSize;
- delegate.updateFontObject();
- }
-
- @LayoutlibDelegate
- /*package*/ static float getTextScaleX(Paint thisPaint) {
- // get the delegate from the native int.
- Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
- if (delegate == null) {
- return 1.f;
- }
-
- return delegate.mTextScaleX;
- }
-
- @LayoutlibDelegate
- /*package*/ static void setTextScaleX(Paint thisPaint, float scaleX) {
- // get the delegate from the native int.
- Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
- if (delegate == null) {
- return;
- }
-
- delegate.mTextScaleX = scaleX;
- delegate.updateFontObject();
- }
-
- @LayoutlibDelegate
- /*package*/ static float getTextSkewX(Paint thisPaint) {
- // get the delegate from the native int.
- Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
- if (delegate == null) {
- return 1.f;
- }
-
- return delegate.mTextSkewX;
- }
-
- @LayoutlibDelegate
- /*package*/ static void setTextSkewX(Paint thisPaint, float skewX) {
- // get the delegate from the native int.
- Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
- if (delegate == null) {
- return;
- }
-
- delegate.mTextSkewX = skewX;
- delegate.updateFontObject();
- }
-
- @LayoutlibDelegate
- /*package*/ static float ascent(Paint thisPaint) {
- // get the delegate
- Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
- if (delegate == null) {
- return 0;
- }
-
- if (delegate.mFonts.size() > 0) {
- java.awt.FontMetrics javaMetrics = delegate.mFonts.get(0).mMetrics;
- // Android expects negative ascent so we invert the value from Java.
- return - javaMetrics.getAscent();
- }
-
- return 0;
- }
-
- @LayoutlibDelegate
- /*package*/ static float descent(Paint thisPaint) {
- // get the delegate
- Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
- if (delegate == null) {
- return 0;
- }
-
- if (delegate.mFonts.size() > 0) {
- java.awt.FontMetrics javaMetrics = delegate.mFonts.get(0).mMetrics;
- return javaMetrics.getDescent();
- }
-
- return 0;
-
- }
-
- @LayoutlibDelegate
- /*package*/ static float getFontMetrics(Paint thisPaint, FontMetrics metrics) {
- // get the delegate
- Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
- if (delegate == null) {
- return 0;
- }
-
- return delegate.getFontMetrics(metrics);
- }
-
- @LayoutlibDelegate
- /*package*/ static int getFontMetricsInt(Paint thisPaint, FontMetricsInt fmi) {
- // get the delegate
- Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
- if (delegate == null) {
- return 0;
- }
-
- if (delegate.mFonts.size() > 0) {
- java.awt.FontMetrics javaMetrics = delegate.mFonts.get(0).mMetrics;
- if (fmi != null) {
- // Android expects negative ascent so we invert the value from Java.
- fmi.top = - javaMetrics.getMaxAscent();
- fmi.ascent = - javaMetrics.getAscent();
- fmi.descent = javaMetrics.getDescent();
- fmi.bottom = javaMetrics.getMaxDescent();
- fmi.leading = javaMetrics.getLeading();
- }
-
- return javaMetrics.getHeight();
- }
-
- return 0;
- }
-
- @LayoutlibDelegate
- /*package*/ static float native_measureText(Paint thisPaint, char[] text, int index,
- int count, int bidiFlags) {
- // get the delegate
- Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
- if (delegate == null) {
- return 0;
- }
-
- return delegate.measureText(text, index, count, isRtl(bidiFlags));
- }
-
- @LayoutlibDelegate
- /*package*/ static float native_measureText(Paint thisPaint, String text, int start, int end,
- int bidiFlags) {
- return native_measureText(thisPaint, text.toCharArray(), start, end - start, bidiFlags);
- }
-
- @LayoutlibDelegate
- /*package*/ static float native_measureText(Paint thisPaint, String text, int bidiFlags) {
- return native_measureText(thisPaint, text.toCharArray(), 0, text.length(), bidiFlags);
- }
-
- @LayoutlibDelegate
- /*package*/ static int native_breakText(Paint thisPaint, char[] text, int index, int count,
- float maxWidth, int bidiFlags, float[] measuredWidth) {
-
- // get the delegate
- Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
- if (delegate == null) {
- return 0;
- }
-
- int inc = count > 0 ? 1 : -1;
-
- int measureIndex = 0;
- float measureAcc = 0;
- for (int i = index; i != index + count; i += inc, measureIndex++) {
- int start, end;
- if (i < index) {
- start = i;
- end = index;
- } else {
- start = index;
- end = i;
- }
-
- // measure from start to end
- float res = delegate.measureText(text, start, end - start + 1, isRtl(bidiFlags));
-
- if (measuredWidth != null) {
- measuredWidth[measureIndex] = res;
- }
-
- measureAcc += res;
- if (res > maxWidth) {
- // we should not return this char index, but since it's 0-based
- // and we need to return a count, we simply return measureIndex;
- return measureIndex;
- }
-
- }
-
- return measureIndex;
- }
-
- @LayoutlibDelegate
- /*package*/ static int native_breakText(Paint thisPaint, String text, boolean measureForwards,
- float maxWidth, int bidiFlags, float[] measuredWidth) {
- return native_breakText(thisPaint, text.toCharArray(), 0, text.length(), maxWidth,
- bidiFlags, measuredWidth);
- }
-
- @LayoutlibDelegate
- /*package*/ static int native_init() {
- Paint_Delegate newDelegate = new Paint_Delegate();
- return sManager.addNewDelegate(newDelegate);
- }
-
- @LayoutlibDelegate
- /*package*/ static int native_initWithPaint(int paint) {
- // get the delegate from the native int.
- Paint_Delegate delegate = sManager.getDelegate(paint);
- if (delegate == null) {
- return 0;
- }
-
- Paint_Delegate newDelegate = new Paint_Delegate(delegate);
- return sManager.addNewDelegate(newDelegate);
- }
-
- @LayoutlibDelegate
- /*package*/ static void native_reset(int native_object) {
- // get the delegate from the native int.
- Paint_Delegate delegate = sManager.getDelegate(native_object);
- if (delegate == null) {
- return;
- }
-
- delegate.reset();
- }
-
- @LayoutlibDelegate
- /*package*/ static void native_set(int native_dst, int native_src) {
- // get the delegate from the native int.
- Paint_Delegate delegate_dst = sManager.getDelegate(native_dst);
- if (delegate_dst == null) {
- return;
- }
-
- // get the delegate from the native int.
- Paint_Delegate delegate_src = sManager.getDelegate(native_src);
- if (delegate_src == null) {
- return;
- }
-
- delegate_dst.set(delegate_src);
- }
-
- @LayoutlibDelegate
- /*package*/ static int native_getStyle(int native_object) {
- // get the delegate from the native int.
- Paint_Delegate delegate = sManager.getDelegate(native_object);
- if (delegate == null) {
- return 0;
- }
-
- return delegate.mStyle;
- }
-
- @LayoutlibDelegate
- /*package*/ static void native_setStyle(int native_object, int style) {
- // get the delegate from the native int.
- Paint_Delegate delegate = sManager.getDelegate(native_object);
- if (delegate == null) {
- return;
- }
-
- delegate.mStyle = style;
- }
-
- @LayoutlibDelegate
- /*package*/ static int native_getStrokeCap(int native_object) {
- // get the delegate from the native int.
- Paint_Delegate delegate = sManager.getDelegate(native_object);
- if (delegate == null) {
- return 0;
- }
-
- return delegate.mCap;
- }
-
- @LayoutlibDelegate
- /*package*/ static void native_setStrokeCap(int native_object, int cap) {
- // get the delegate from the native int.
- Paint_Delegate delegate = sManager.getDelegate(native_object);
- if (delegate == null) {
- return;
- }
-
- delegate.mCap = cap;
- }
-
- @LayoutlibDelegate
- /*package*/ static int native_getStrokeJoin(int native_object) {
- // get the delegate from the native int.
- Paint_Delegate delegate = sManager.getDelegate(native_object);
- if (delegate == null) {
- return 0;
- }
-
- return delegate.mJoin;
- }
-
- @LayoutlibDelegate
- /*package*/ static void native_setStrokeJoin(int native_object, int join) {
- // get the delegate from the native int.
- Paint_Delegate delegate = sManager.getDelegate(native_object);
- if (delegate == null) {
- return;
- }
-
- delegate.mJoin = join;
- }
-
- @LayoutlibDelegate
- /*package*/ static boolean native_getFillPath(int native_object, int src, int dst) {
- Paint_Delegate paint = sManager.getDelegate(native_object);
- if (paint == null) {
- return false;
- }
-
- Path_Delegate srcPath = Path_Delegate.getDelegate(src);
- if (srcPath == null) {
- return true;
- }
-
- Path_Delegate dstPath = Path_Delegate.getDelegate(dst);
- if (dstPath == null) {
- return true;
- }
-
- Stroke stroke = paint.getJavaStroke();
- Shape strokeShape = stroke.createStrokedShape(srcPath.getJavaShape());
-
- dstPath.setJavaShape(strokeShape);
-
- // FIXME figure out the return value?
- return true;
- }
-
- @LayoutlibDelegate
- /*package*/ static int native_setShader(int native_object, int shader) {
- // get the delegate from the native int.
- Paint_Delegate delegate = sManager.getDelegate(native_object);
- if (delegate == null) {
- return shader;
- }
-
- delegate.mShader = Shader_Delegate.getDelegate(shader);
-
- return shader;
- }
-
- @LayoutlibDelegate
- /*package*/ static int native_setColorFilter(int native_object, int filter) {
- // get the delegate from the native int.
- Paint_Delegate delegate = sManager.getDelegate(native_object);
- if (delegate == null) {
- return filter;
- }
-
- delegate.mColorFilter = ColorFilter_Delegate.getDelegate(filter);;
-
- // since none of those are supported, display a fidelity warning right away
- if (delegate.mColorFilter != null && delegate.mColorFilter.isSupported() == false) {
- Bridge.getLog().fidelityWarning(LayoutLog.TAG_COLORFILTER,
- delegate.mColorFilter.getSupportMessage(), null, null /*data*/);
- }
-
- return filter;
- }
-
- @LayoutlibDelegate
- /*package*/ static int native_setXfermode(int native_object, int xfermode) {
- // get the delegate from the native int.
- Paint_Delegate delegate = sManager.getDelegate(native_object);
- if (delegate == null) {
- return xfermode;
- }
-
- delegate.mXfermode = Xfermode_Delegate.getDelegate(xfermode);
-
- return xfermode;
- }
-
- @LayoutlibDelegate
- /*package*/ static int native_setPathEffect(int native_object, int effect) {
- // get the delegate from the native int.
- Paint_Delegate delegate = sManager.getDelegate(native_object);
- if (delegate == null) {
- return effect;
- }
-
- delegate.mPathEffect = PathEffect_Delegate.getDelegate(effect);
-
- return effect;
- }
-
- @LayoutlibDelegate
- /*package*/ static int native_setMaskFilter(int native_object, int maskfilter) {
- // get the delegate from the native int.
- Paint_Delegate delegate = sManager.getDelegate(native_object);
- if (delegate == null) {
- return maskfilter;
- }
-
- delegate.mMaskFilter = MaskFilter_Delegate.getDelegate(maskfilter);
-
- // since none of those are supported, display a fidelity warning right away
- if (delegate.mMaskFilter != null && delegate.mMaskFilter.isSupported() == false) {
- Bridge.getLog().fidelityWarning(LayoutLog.TAG_MASKFILTER,
- delegate.mMaskFilter.getSupportMessage(), null, null /*data*/);
- }
-
- return maskfilter;
- }
-
- @LayoutlibDelegate
- /*package*/ static int native_setTypeface(int native_object, int typeface) {
- // get the delegate from the native int.
- Paint_Delegate delegate = sManager.getDelegate(native_object);
- if (delegate == null) {
- return 0;
- }
-
- delegate.mTypeface = Typeface_Delegate.getDelegate(typeface);
- delegate.updateFontObject();
- return typeface;
- }
-
- @LayoutlibDelegate
- /*package*/ static int native_setRasterizer(int native_object, int rasterizer) {
- // get the delegate from the native int.
- Paint_Delegate delegate = sManager.getDelegate(native_object);
- if (delegate == null) {
- return rasterizer;
- }
-
- delegate.mRasterizer = Rasterizer_Delegate.getDelegate(rasterizer);
-
- // since none of those are supported, display a fidelity warning right away
- if (delegate.mRasterizer != null && delegate.mRasterizer.isSupported() == false) {
- Bridge.getLog().fidelityWarning(LayoutLog.TAG_RASTERIZER,
- delegate.mRasterizer.getSupportMessage(), null, null /*data*/);
- }
-
- return rasterizer;
- }
-
- @LayoutlibDelegate
- /*package*/ static int native_getTextAlign(int native_object) {
- // get the delegate from the native int.
- Paint_Delegate delegate = sManager.getDelegate(native_object);
- if (delegate == null) {
- return 0;
- }
-
- return delegate.mTextAlign;
- }
-
- @LayoutlibDelegate
- /*package*/ static void native_setTextAlign(int native_object, int align) {
- // get the delegate from the native int.
- Paint_Delegate delegate = sManager.getDelegate(native_object);
- if (delegate == null) {
- return;
- }
-
- delegate.mTextAlign = align;
- }
-
- @LayoutlibDelegate
- /*package*/ static void native_setTextLocale(int native_object, String locale) {
- // get the delegate from the native int.
- Paint_Delegate delegate = sManager.getDelegate(native_object);
- if (delegate == null) {
- return;
- }
-
- delegate.setTextLocale(locale);
- }
-
- @LayoutlibDelegate
- /*package*/ static int native_getTextWidths(int native_object, char[] text, int index,
- int count, int bidiFlags, float[] widths) {
- // get the delegate from the native int.
- Paint_Delegate delegate = sManager.getDelegate(native_object);
- if (delegate == null) {
- return 0;
- }
-
- if (delegate.mFonts.size() > 0) {
- // FIXME: handle multi-char characters (see measureText)
- float totalAdvance = 0;
- for (int i = 0; i < count; i++) {
- char c = text[i + index];
- boolean found = false;
- for (FontInfo info : delegate.mFonts) {
- if (info.mFont.canDisplay(c)) {
- float adv = info.mMetrics.charWidth(c);
- totalAdvance += adv;
- if (widths != null) {
- widths[i] = adv;
- }
-
- found = true;
- break;
- }
- }
-
- if (found == false) {
- // no advance for this char.
- if (widths != null) {
- widths[i] = 0.f;
- }
- }
- }
-
- return (int) totalAdvance;
- }
-
- return 0;
- }
-
- @LayoutlibDelegate
- /*package*/ static int native_getTextWidths(int native_object, String text, int start,
- int end, int bidiFlags, float[] widths) {
- return native_getTextWidths(native_object, text.toCharArray(), start, end - start,
- bidiFlags, widths);
- }
-
- @LayoutlibDelegate
- /* package */static int native_getTextGlyphs(int native_object, String text, int start,
- int end, int contextStart, int contextEnd, int flags, char[] glyphs) {
- // FIXME
- return 0;
- }
-
- @LayoutlibDelegate
- /*package*/ static float native_getTextRunAdvances(int native_object,
- char[] text, int index, int count, int contextIndex, int contextCount,
- int flags, float[] advances, int advancesIndex) {
-
- if (advances != null)
- for (int i = advancesIndex; i< advancesIndex+count; i++)
- advances[i]=0;
- // get the delegate from the native int.
- Paint_Delegate delegate = sManager.getDelegate(native_object);
- if (delegate == null || delegate.mFonts == null || delegate.mFonts.size() == 0) {
- return 0.f;
- }
- boolean isRtl = isRtl(flags);
-
- int limit = index + count;
- return new BidiRenderer(null, delegate, text).renderText(
- index, limit, isRtl, advances, advancesIndex, false, 0, 0);
- }
-
- @LayoutlibDelegate
- /*package*/ static float native_getTextRunAdvances(int native_object,
- String text, int start, int end, int contextStart, int contextEnd,
- int flags, float[] advances, int advancesIndex) {
- // FIXME: support contextStart and contextEnd
- int count = end - start;
- char[] buffer = TemporaryBuffer.obtain(count);
- TextUtils.getChars(text, start, end, buffer, 0);
-
- return native_getTextRunAdvances(native_object, buffer, 0, count, contextStart,
- contextEnd - contextStart, flags, advances, advancesIndex);
- }
-
- @LayoutlibDelegate
- /*package*/ static int native_getTextRunCursor(Paint thisPaint, int native_object, char[] text,
- int contextStart, int contextLength, int flags, int offset, int cursorOpt) {
- // FIXME
- Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED,
- "Paint.getTextRunCursor is not supported.", null, null /*data*/);
- return 0;
- }
-
- @LayoutlibDelegate
- /*package*/ static int native_getTextRunCursor(Paint thisPaint, int native_object, String text,
- int contextStart, int contextEnd, int flags, int offset, int cursorOpt) {
- // FIXME
- Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED,
- "Paint.getTextRunCursor is not supported.", null, null /*data*/);
- return 0;
- }
-
- @LayoutlibDelegate
- /*package*/ static void native_getTextPath(int native_object, int bidiFlags,
- char[] text, int index, int count, float x, float y, int path) {
- // FIXME
- Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED,
- "Paint.getTextPath is not supported.", null, null /*data*/);
- }
-
- @LayoutlibDelegate
- /*package*/ static void native_getTextPath(int native_object, int bidiFlags,
- String text, int start, int end, float x, float y, int path) {
- // FIXME
- Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED,
- "Paint.getTextPath is not supported.", null, null /*data*/);
- }
-
- @LayoutlibDelegate
- /*package*/ static void nativeGetStringBounds(int nativePaint, String text, int start,
- int end, int bidiFlags, Rect bounds) {
- nativeGetCharArrayBounds(nativePaint, text.toCharArray(), start, end - start, bidiFlags,
- bounds);
- }
-
- @LayoutlibDelegate
- /*package*/ static void nativeGetCharArrayBounds(int nativePaint, char[] text, int index,
- int count, int bidiFlags, Rect bounds) {
-
- // get the delegate from the native int.
- Paint_Delegate delegate = sManager.getDelegate(nativePaint);
- if (delegate == null || delegate.mFonts == null || delegate.mFonts.size() == 0) {
- return;
- }
- int w = (int) delegate.measureText(text, index, count, isRtl(bidiFlags));
- int h= delegate.getFonts().get(0).mMetrics.getHeight();
- bounds.set(0, 0, w, h);
- }
-
- @LayoutlibDelegate
- /*package*/ static void finalizer(int nativePaint) {
- sManager.removeJavaReferenceFor(nativePaint);
- }
-
- // ---- Private delegate/helper methods ----
-
- /*package*/ Paint_Delegate() {
- reset();
- }
-
- private Paint_Delegate(Paint_Delegate paint) {
- set(paint);
- }
-
- private void set(Paint_Delegate paint) {
- mFlags = paint.mFlags;
- mColor = paint.mColor;
- mStyle = paint.mStyle;
- mCap = paint.mCap;
- mJoin = paint.mJoin;
- mTextAlign = paint.mTextAlign;
- mTypeface = paint.mTypeface;
- mStrokeWidth = paint.mStrokeWidth;
- mStrokeMiter = paint.mStrokeMiter;
- mTextSize = paint.mTextSize;
- mTextScaleX = paint.mTextScaleX;
- mTextSkewX = paint.mTextSkewX;
- mXfermode = paint.mXfermode;
- mColorFilter = paint.mColorFilter;
- mShader = paint.mShader;
- mPathEffect = paint.mPathEffect;
- mMaskFilter = paint.mMaskFilter;
- mRasterizer = paint.mRasterizer;
- mHintingMode = paint.mHintingMode;
- updateFontObject();
- }
-
- private void reset() {
- mFlags = Paint.DEFAULT_PAINT_FLAGS;
- mColor = 0xFF000000;
- mStyle = Paint.Style.FILL.nativeInt;
- mCap = Paint.Cap.BUTT.nativeInt;
- mJoin = Paint.Join.MITER.nativeInt;
- mTextAlign = 0;
- mTypeface = Typeface_Delegate.getDelegate(Typeface.sDefaults[0].native_instance);
- mStrokeWidth = 1.f;
- mStrokeMiter = 4.f;
- mTextSize = 20.f;
- mTextScaleX = 1.f;
- mTextSkewX = 0.f;
- mXfermode = null;
- mColorFilter = null;
- mShader = null;
- mPathEffect = null;
- mMaskFilter = null;
- mRasterizer = null;
- updateFontObject();
- mHintingMode = Paint.HINTING_ON;
- }
-
- /**
- * Update the {@link Font} object from the typeface, text size and scaling
- */
- @SuppressWarnings("deprecation")
- private void updateFontObject() {
- if (mTypeface != null) {
- // Get the fonts from the TypeFace object.
- List<Font> fonts = mTypeface.getFonts();
-
- // create new font objects as well as FontMetrics, based on the current text size
- // and skew info.
- ArrayList<FontInfo> infoList = new ArrayList<FontInfo>(fonts.size());
- for (Font font : fonts) {
- FontInfo info = new FontInfo();
- info.mFont = font.deriveFont(mTextSize);
- if (mTextScaleX != 1.0 || mTextSkewX != 0) {
- // TODO: support skew
- info.mFont = info.mFont.deriveFont(new AffineTransform(
- mTextScaleX, mTextSkewX, 0, 1, 0, 0));
- }
- // The metrics here don't have anti-aliasing set.
- info.mMetrics = Toolkit.getDefaultToolkit().getFontMetrics(info.mFont);
-
- infoList.add(info);
- }
-
- mFonts = Collections.unmodifiableList(infoList);
- }
- }
-
- /*package*/ float measureText(char[] text, int index, int count, boolean isRtl) {
- return new BidiRenderer(null, this, text).renderText(
- index, index + count, isRtl, null, 0, false, 0, 0);
- }
-
- private float getFontMetrics(FontMetrics metrics) {
- if (mFonts.size() > 0) {
- java.awt.FontMetrics javaMetrics = mFonts.get(0).mMetrics;
- if (metrics != null) {
- // Android expects negative ascent so we invert the value from Java.
- metrics.top = - javaMetrics.getMaxAscent();
- metrics.ascent = - javaMetrics.getAscent();
- metrics.descent = javaMetrics.getDescent();
- metrics.bottom = javaMetrics.getMaxDescent();
- metrics.leading = javaMetrics.getLeading();
- }
-
- return javaMetrics.getHeight();
- }
-
- return 0;
- }
-
- private void setTextLocale(String locale) {
- mLocale = new Locale(locale);
- }
-
- private static void setFlag(Paint thisPaint, int flagMask, boolean flagValue) {
- // get the delegate from the native int.
- Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
- if (delegate == null) {
- return;
- }
-
- if (flagValue) {
- delegate.mFlags |= flagMask;
- } else {
- delegate.mFlags &= ~flagMask;
- }
- }
-
- private static boolean isRtl(int flag) {
- switch(flag) {
- case Paint.BIDI_RTL:
- case Paint.BIDI_FORCE_RTL:
- case Paint.BIDI_DEFAULT_RTL:
- return true;
- default:
- return false;
- }
- }
-}
diff --git a/tools/layoutlib/bridge/src/android/graphics/PathDashPathEffect_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/PathDashPathEffect_Delegate.java
deleted file mode 100644
index c448f0e..0000000
--- a/tools/layoutlib/bridge/src/android/graphics/PathDashPathEffect_Delegate.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.graphics;
-
-import com.android.layoutlib.bridge.impl.DelegateManager;
-import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
-
-import java.awt.Stroke;
-
-/**
- * Delegate implementing the native methods of android.graphics.PathDashPathEffect
- *
- * Through the layoutlib_create tool, the original native methods of PathDashPathEffect have been
- * replaced by calls to methods of the same name in this delegate class.
- *
- * This class behaves like the original native implementation, but in Java, keeping previously
- * native data into its own objects and mapping them to int that are sent back and forth between
- * it and the original PathDashPathEffect class.
- *
- * Because this extends {@link PathEffect_Delegate}, there's no need to use a {@link DelegateManager},
- * as all the Shader classes will be added to the manager owned by {@link PathEffect_Delegate}.
- *
- * @see PathEffect_Delegate
- *
- */
-public class PathDashPathEffect_Delegate extends PathEffect_Delegate {
-
- // ---- delegate data ----
-
- // ---- Public Helper methods ----
-
- @Override
- public Stroke getStroke(Paint_Delegate paint) {
- // FIXME
- return null;
- }
-
- @Override
- public boolean isSupported() {
- return false;
- }
-
- @Override
- public String getSupportMessage() {
- return "Path Dash Path Effects are not supported in Layout Preview mode.";
- }
-
- // ---- native methods ----
-
- @LayoutlibDelegate
- /*package*/ static int nativeCreate(int native_path, float advance, float phase,
- int native_style) {
- PathDashPathEffect_Delegate newDelegate = new PathDashPathEffect_Delegate();
- return sManager.addNewDelegate(newDelegate);
- }
-
- // ---- Private delegate/helper methods ----
-}
diff --git a/tools/layoutlib/bridge/src/android/graphics/PathEffect_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/PathEffect_Delegate.java
deleted file mode 100644
index bd2b6de..0000000
--- a/tools/layoutlib/bridge/src/android/graphics/PathEffect_Delegate.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.graphics;
-
-import com.android.layoutlib.bridge.impl.DelegateManager;
-import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
-
-import java.awt.Stroke;
-
-/**
- * Delegate implementing the native methods of android.graphics.PathEffect
- *
- * Through the layoutlib_create tool, the original native methods of PathEffect have been replaced
- * by calls to methods of the same name in this delegate class.
- *
- * This class behaves like the original native implementation, but in Java, keeping previously
- * native data into its own objects and mapping them to int that are sent back and forth between
- * it and the original PathEffect class.
- *
- * This also serve as a base class for all PathEffect delegate classes.
- *
- * @see DelegateManager
- *
- */
-public abstract class PathEffect_Delegate {
-
- // ---- delegate manager ----
- protected static final DelegateManager<PathEffect_Delegate> sManager =
- new DelegateManager<PathEffect_Delegate>(PathEffect_Delegate.class);
-
- // ---- delegate helper data ----
-
- // ---- delegate data ----
-
- // ---- Public Helper methods ----
-
- public static PathEffect_Delegate getDelegate(int nativeShader) {
- return sManager.getDelegate(nativeShader);
- }
-
- public abstract Stroke getStroke(Paint_Delegate paint);
- public abstract boolean isSupported();
- public abstract String getSupportMessage();
-
-
- // ---- native methods ----
-
- @LayoutlibDelegate
- /*package*/ static void nativeDestructor(int native_patheffect) {
- sManager.removeJavaReferenceFor(native_patheffect);
- }
-
- // ---- Private delegate/helper methods ----
-
-}
diff --git a/tools/layoutlib/bridge/src/android/graphics/Path_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/Path_Delegate.java
deleted file mode 100644
index 64f19d3..0000000
--- a/tools/layoutlib/bridge/src/android/graphics/Path_Delegate.java
+++ /dev/null
@@ -1,815 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.graphics;
-
-import com.android.ide.common.rendering.api.LayoutLog;
-import com.android.layoutlib.bridge.Bridge;
-import com.android.layoutlib.bridge.impl.DelegateManager;
-import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
-
-import android.graphics.Path.Direction;
-import android.graphics.Path.FillType;
-
-import java.awt.Shape;
-import java.awt.geom.AffineTransform;
-import java.awt.geom.Arc2D;
-import java.awt.geom.Area;
-import java.awt.geom.Ellipse2D;
-import java.awt.geom.GeneralPath;
-import java.awt.geom.PathIterator;
-import java.awt.geom.Point2D;
-import java.awt.geom.Rectangle2D;
-import java.awt.geom.RoundRectangle2D;
-
-/**
- * Delegate implementing the native methods of android.graphics.Path
- *
- * Through the layoutlib_create tool, the original native methods of Path have been replaced
- * by calls to methods of the same name in this delegate class.
- *
- * This class behaves like the original native implementation, but in Java, keeping previously
- * native data into its own objects and mapping them to int that are sent back and forth between
- * it and the original Path class.
- *
- * @see DelegateManager
- *
- */
-public final class Path_Delegate {
-
- // ---- delegate manager ----
- private static final DelegateManager<Path_Delegate> sManager =
- new DelegateManager<Path_Delegate>(Path_Delegate.class);
-
- // ---- delegate data ----
- private FillType mFillType = FillType.WINDING;
- private GeneralPath mPath = new GeneralPath();
-
- private float mLastX = 0;
- private float mLastY = 0;
-
- // ---- Public Helper methods ----
-
- public static Path_Delegate getDelegate(int nPath) {
- return sManager.getDelegate(nPath);
- }
-
- public Shape getJavaShape() {
- return mPath;
- }
-
- public void setJavaShape(Shape shape) {
- mPath.reset();
- mPath.append(shape, false /*connect*/);
- }
-
- public void reset() {
- mPath.reset();
- }
-
- public void setPathIterator(PathIterator iterator) {
- mPath.reset();
- mPath.append(iterator, false /*connect*/);
- }
-
- // ---- native methods ----
-
- @LayoutlibDelegate
- /*package*/ static int init1() {
- // create the delegate
- Path_Delegate newDelegate = new Path_Delegate();
-
- return sManager.addNewDelegate(newDelegate);
- }
-
- @LayoutlibDelegate
- /*package*/ static int init2(int nPath) {
- // create the delegate
- Path_Delegate newDelegate = new Path_Delegate();
-
- // get the delegate to copy, which could be null if nPath is 0
- Path_Delegate pathDelegate = sManager.getDelegate(nPath);
- if (pathDelegate != null) {
- newDelegate.set(pathDelegate);
- }
-
- return sManager.addNewDelegate(newDelegate);
- }
-
- @LayoutlibDelegate
- /*package*/ static void native_reset(int nPath) {
- Path_Delegate pathDelegate = sManager.getDelegate(nPath);
- if (pathDelegate == null) {
- return;
- }
-
- pathDelegate.mPath.reset();
- }
-
- @LayoutlibDelegate
- /*package*/ static void native_rewind(int nPath) {
- // call out to reset since there's nothing to optimize in
- // terms of data structs.
- native_reset(nPath);
- }
-
- @LayoutlibDelegate
- /*package*/ static void native_set(int native_dst, int native_src) {
- Path_Delegate pathDstDelegate = sManager.getDelegate(native_dst);
- if (pathDstDelegate == null) {
- return;
- }
-
- Path_Delegate pathSrcDelegate = sManager.getDelegate(native_src);
- if (pathSrcDelegate == null) {
- return;
- }
-
- pathDstDelegate.set(pathSrcDelegate);
- }
-
- @LayoutlibDelegate
- /*package*/ static int native_getFillType(int nPath) {
- Path_Delegate pathDelegate = sManager.getDelegate(nPath);
- if (pathDelegate == null) {
- return 0;
- }
-
- return pathDelegate.mFillType.nativeInt;
- }
-
- @LayoutlibDelegate
- /*package*/ static void native_setFillType(int nPath, int ft) {
- Path_Delegate pathDelegate = sManager.getDelegate(nPath);
- if (pathDelegate == null) {
- return;
- }
-
- pathDelegate.mFillType = Path.sFillTypeArray[ft];
- }
-
- @LayoutlibDelegate
- /*package*/ static boolean native_isEmpty(int nPath) {
- Path_Delegate pathDelegate = sManager.getDelegate(nPath);
- if (pathDelegate == null) {
- return true;
- }
-
- return pathDelegate.isEmpty();
- }
-
- @LayoutlibDelegate
- /*package*/ static boolean native_isRect(int nPath, RectF rect) {
- Path_Delegate pathDelegate = sManager.getDelegate(nPath);
- if (pathDelegate == null) {
- return false;
- }
-
- // create an Area that can test if the path is a rect
- Area area = new Area(pathDelegate.mPath);
- if (area.isRectangular()) {
- if (rect != null) {
- pathDelegate.fillBounds(rect);
- }
-
- return true;
- }
-
- return false;
- }
-
- @LayoutlibDelegate
- /*package*/ static void native_computeBounds(int nPath, RectF bounds) {
- Path_Delegate pathDelegate = sManager.getDelegate(nPath);
- if (pathDelegate == null) {
- return;
- }
-
- pathDelegate.fillBounds(bounds);
- }
-
- @LayoutlibDelegate
- /*package*/ static void native_incReserve(int nPath, int extraPtCount) {
- // since we use a java2D path, there's no way to pre-allocate new points,
- // so we do nothing.
- }
-
- @LayoutlibDelegate
- /*package*/ static void native_moveTo(int nPath, float x, float y) {
- Path_Delegate pathDelegate = sManager.getDelegate(nPath);
- if (pathDelegate == null) {
- return;
- }
-
- pathDelegate.moveTo(x, y);
- }
-
- @LayoutlibDelegate
- /*package*/ static void native_rMoveTo(int nPath, float dx, float dy) {
- Path_Delegate pathDelegate = sManager.getDelegate(nPath);
- if (pathDelegate == null) {
- return;
- }
-
- pathDelegate.rMoveTo(dx, dy);
- }
-
- @LayoutlibDelegate
- /*package*/ static void native_lineTo(int nPath, float x, float y) {
- Path_Delegate pathDelegate = sManager.getDelegate(nPath);
- if (pathDelegate == null) {
- return;
- }
-
- pathDelegate.lineTo(x, y);
- }
-
- @LayoutlibDelegate
- /*package*/ static void native_rLineTo(int nPath, float dx, float dy) {
- Path_Delegate pathDelegate = sManager.getDelegate(nPath);
- if (pathDelegate == null) {
- return;
- }
-
- pathDelegate.rLineTo(dx, dy);
- }
-
- @LayoutlibDelegate
- /*package*/ static void native_quadTo(int nPath, float x1, float y1, float x2, float y2) {
- Path_Delegate pathDelegate = sManager.getDelegate(nPath);
- if (pathDelegate == null) {
- return;
- }
-
- pathDelegate.quadTo(x1, y1, x2, y2);
- }
-
- @LayoutlibDelegate
- /*package*/ static void native_rQuadTo(int nPath, float dx1, float dy1, float dx2, float dy2) {
- Path_Delegate pathDelegate = sManager.getDelegate(nPath);
- if (pathDelegate == null) {
- return;
- }
-
- pathDelegate.rQuadTo(dx1, dy1, dx2, dy2);
- }
-
- @LayoutlibDelegate
- /*package*/ static void native_cubicTo(int nPath, float x1, float y1,
- float x2, float y2, float x3, float y3) {
- Path_Delegate pathDelegate = sManager.getDelegate(nPath);
- if (pathDelegate == null) {
- return;
- }
-
- pathDelegate.cubicTo(x1, y1, x2, y2, x3, y3);
- }
-
- @LayoutlibDelegate
- /*package*/ static void native_rCubicTo(int nPath, float x1, float y1,
- float x2, float y2, float x3, float y3) {
- Path_Delegate pathDelegate = sManager.getDelegate(nPath);
- if (pathDelegate == null) {
- return;
- }
-
- pathDelegate.rCubicTo(x1, y1, x2, y2, x3, y3);
- }
-
- @LayoutlibDelegate
- /*package*/ static void native_arcTo(int nPath, RectF oval,
- float startAngle, float sweepAngle, boolean forceMoveTo) {
- Path_Delegate pathDelegate = sManager.getDelegate(nPath);
- if (pathDelegate == null) {
- return;
- }
-
- pathDelegate.arcTo(oval, startAngle, sweepAngle, forceMoveTo);
- }
-
- @LayoutlibDelegate
- /*package*/ static void native_close(int nPath) {
- Path_Delegate pathDelegate = sManager.getDelegate(nPath);
- if (pathDelegate == null) {
- return;
- }
-
- pathDelegate.close();
- }
-
- @LayoutlibDelegate
- /*package*/ static void native_addRect(int nPath, RectF rect, int dir) {
- Path_Delegate pathDelegate = sManager.getDelegate(nPath);
- if (pathDelegate == null) {
- return;
- }
-
- pathDelegate.addRect(rect.left, rect.top, rect.right, rect.bottom, dir);
- }
-
- @LayoutlibDelegate
- /*package*/ static void native_addRect(int nPath,
- float left, float top, float right, float bottom, int dir) {
- Path_Delegate pathDelegate = sManager.getDelegate(nPath);
- if (pathDelegate == null) {
- return;
- }
-
- pathDelegate.addRect(left, top, right, bottom, dir);
- }
-
- @LayoutlibDelegate
- /*package*/ static void native_addOval(int nPath, RectF oval, int dir) {
- Path_Delegate pathDelegate = sManager.getDelegate(nPath);
- if (pathDelegate == null) {
- return;
- }
-
- pathDelegate.mPath.append(new Ellipse2D.Float(
- oval.left, oval.top, oval.width(), oval.height()), false);
- }
-
- @LayoutlibDelegate
- /*package*/ static void native_addCircle(int nPath, float x, float y, float radius, int dir) {
- Path_Delegate pathDelegate = sManager.getDelegate(nPath);
- if (pathDelegate == null) {
- return;
- }
-
- // because x/y is the center of the circle, need to offset this by the radius
- pathDelegate.mPath.append(new Ellipse2D.Float(
- x - radius, y - radius, radius * 2, radius * 2), false);
- }
-
- @LayoutlibDelegate
- /*package*/ static void native_addArc(int nPath, RectF oval,
- float startAngle, float sweepAngle) {
- Path_Delegate pathDelegate = sManager.getDelegate(nPath);
- if (pathDelegate == null) {
- return;
- }
-
- // because x/y is the center of the circle, need to offset this by the radius
- pathDelegate.mPath.append(new Arc2D.Float(
- oval.left, oval.top, oval.width(), oval.height(),
- -startAngle, -sweepAngle, Arc2D.OPEN), false);
- }
-
- @LayoutlibDelegate
- /*package*/ static void native_addRoundRect(
- int nPath, RectF rect, float rx, float ry, int dir) {
-
- Path_Delegate pathDelegate = sManager.getDelegate(nPath);
- if (pathDelegate == null) {
- return;
- }
-
- pathDelegate.mPath.append(new RoundRectangle2D.Float(
- rect.left, rect.top, rect.width(), rect.height(), rx * 2, ry * 2), false);
- }
-
- @LayoutlibDelegate
- /*package*/ static void native_addRoundRect(int nPath, RectF rect, float[] radii, int dir) {
- // Java2D doesn't support different rounded corners in each corner, so just use the
- // first value.
- native_addRoundRect(nPath, rect, radii[0], radii[1], dir);
-
- // there can be a case where this API is used but with similar values for all corners, so
- // in that case we don't warn.
- // we only care if 2 corners are different so just compare to the next one.
- for (int i = 0 ; i < 3 ; i++) {
- if (radii[i * 2] != radii[(i + 1) * 2] || radii[i * 2 + 1] != radii[(i + 1) * 2 + 1]) {
- Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED,
- "Different corner sizes are not supported in Path.addRoundRect.",
- null, null /*data*/);
- break;
- }
- }
- }
-
- @LayoutlibDelegate
- /*package*/ static void native_addPath(int nPath, int src, float dx, float dy) {
- addPath(nPath, src, AffineTransform.getTranslateInstance(dx, dy));
- }
-
- @LayoutlibDelegate
- /*package*/ static void native_addPath(int nPath, int src) {
- addPath(nPath, src, null /*transform*/);
- }
-
- @LayoutlibDelegate
- /*package*/ static void native_addPath(int nPath, int src, int matrix) {
- Matrix_Delegate matrixDelegate = Matrix_Delegate.getDelegate(matrix);
- if (matrixDelegate == null) {
- return;
- }
-
- addPath(nPath, src, matrixDelegate.getAffineTransform());
- }
-
- @LayoutlibDelegate
- /*package*/ static void native_offset(int nPath, float dx, float dy, int dst_path) {
- Path_Delegate pathDelegate = sManager.getDelegate(nPath);
- if (pathDelegate == null) {
- return;
- }
-
- // could be null if the int is 0;
- Path_Delegate dstDelegate = sManager.getDelegate(dst_path);
-
- pathDelegate.offset(dx, dy, dstDelegate);
- }
-
- @LayoutlibDelegate
- /*package*/ static void native_offset(int nPath, float dx, float dy) {
- native_offset(nPath, dx, dy, 0);
- }
-
- @LayoutlibDelegate
- /*package*/ static void native_setLastPoint(int nPath, float dx, float dy) {
- Path_Delegate pathDelegate = sManager.getDelegate(nPath);
- if (pathDelegate == null) {
- return;
- }
-
- pathDelegate.mLastX = dx;
- pathDelegate.mLastY = dy;
- }
-
- @LayoutlibDelegate
- /*package*/ static void native_transform(int nPath, int matrix,
- int dst_path) {
- Path_Delegate pathDelegate = sManager.getDelegate(nPath);
- if (pathDelegate == null) {
- return;
- }
-
- Matrix_Delegate matrixDelegate = Matrix_Delegate.getDelegate(matrix);
- if (matrixDelegate == null) {
- return;
- }
-
- // this can be null if dst_path is 0
- Path_Delegate dstDelegate = sManager.getDelegate(dst_path);
-
- pathDelegate.transform(matrixDelegate, dstDelegate);
- }
-
- @LayoutlibDelegate
- /*package*/ static void native_transform(int nPath, int matrix) {
- native_transform(nPath, matrix, 0);
- }
-
- @LayoutlibDelegate
- /*package*/ static void finalizer(int nPath) {
- sManager.removeJavaReferenceFor(nPath);
- }
-
-
- // ---- Private helper methods ----
-
- private void set(Path_Delegate delegate) {
- mPath.reset();
- setFillType(delegate.mFillType);
- mPath.append(delegate.mPath, false /*connect*/);
- }
-
- private void setFillType(FillType fillType) {
- mFillType = fillType;
- mPath.setWindingRule(getWindingRule(fillType));
- }
-
- /**
- * Returns the Java2D winding rules matching a given Android {@link FillType}.
- * @param type the android fill type
- * @return the matching java2d winding rule.
- */
- private static int getWindingRule(FillType type) {
- switch (type) {
- case WINDING:
- case INVERSE_WINDING:
- return GeneralPath.WIND_NON_ZERO;
- case EVEN_ODD:
- case INVERSE_EVEN_ODD:
- return GeneralPath.WIND_EVEN_ODD;
- }
-
- assert false;
- throw new IllegalArgumentException();
- }
-
- private static Direction getDirection(int direction) {
- for (Direction d : Direction.values()) {
- if (direction == d.nativeInt) {
- return d;
- }
- }
-
- assert false;
- return null;
- }
-
- private static void addPath(int destPath, int srcPath, AffineTransform transform) {
- Path_Delegate destPathDelegate = sManager.getDelegate(destPath);
- if (destPathDelegate == null) {
- return;
- }
-
- Path_Delegate srcPathDelegate = sManager.getDelegate(srcPath);
- if (srcPathDelegate == null) {
- return;
- }
-
- if (transform != null) {
- destPathDelegate.mPath.append(
- srcPathDelegate.mPath.getPathIterator(transform), false);
- } else {
- destPathDelegate.mPath.append(srcPathDelegate.mPath, false);
- }
- }
-
-
- /**
- * Returns whether the path is empty.
- * @return true if the path is empty.
- */
- private boolean isEmpty() {
- return mPath.getCurrentPoint() == null;
- }
-
- /**
- * Fills the given {@link RectF} with the path bounds.
- * @param bounds the RectF to be filled.
- */
- private void fillBounds(RectF bounds) {
- Rectangle2D rect = mPath.getBounds2D();
- bounds.left = (float)rect.getMinX();
- bounds.right = (float)rect.getMaxX();
- bounds.top = (float)rect.getMinY();
- bounds.bottom = (float)rect.getMaxY();
- }
-
- /**
- * Set the beginning of the next contour to the point (x,y).
- *
- * @param x The x-coordinate of the start of a new contour
- * @param y The y-coordinate of the start of a new contour
- */
- private void moveTo(float x, float y) {
- mPath.moveTo(mLastX = x, mLastY = y);
- }
-
- /**
- * Set the beginning of the next contour relative to the last point on the
- * previous contour. If there is no previous contour, this is treated the
- * same as moveTo().
- *
- * @param dx The amount to add to the x-coordinate of the end of the
- * previous contour, to specify the start of a new contour
- * @param dy The amount to add to the y-coordinate of the end of the
- * previous contour, to specify the start of a new contour
- */
- private void rMoveTo(float dx, float dy) {
- dx += mLastX;
- dy += mLastY;
- mPath.moveTo(mLastX = dx, mLastY = dy);
- }
-
- /**
- * Add a line from the last point to the specified point (x,y).
- * If no moveTo() call has been made for this contour, the first point is
- * automatically set to (0,0).
- *
- * @param x The x-coordinate of the end of a line
- * @param y The y-coordinate of the end of a line
- */
- private void lineTo(float x, float y) {
- mPath.lineTo(mLastX = x, mLastY = y);
- }
-
- /**
- * Same as lineTo, but the coordinates are considered relative to the last
- * point on this contour. If there is no previous point, then a moveTo(0,0)
- * is inserted automatically.
- *
- * @param dx The amount to add to the x-coordinate of the previous point on
- * this contour, to specify a line
- * @param dy The amount to add to the y-coordinate of the previous point on
- * this contour, to specify a line
- */
- private void rLineTo(float dx, float dy) {
- if (isEmpty()) {
- mPath.moveTo(mLastX = 0, mLastY = 0);
- }
- dx += mLastX;
- dy += mLastY;
- mPath.lineTo(mLastX = dx, mLastY = dy);
- }
-
- /**
- * Add a quadratic bezier from the last point, approaching control point
- * (x1,y1), and ending at (x2,y2). If no moveTo() call has been made for
- * this contour, the first point is automatically set to (0,0).
- *
- * @param x1 The x-coordinate of the control point on a quadratic curve
- * @param y1 The y-coordinate of the control point on a quadratic curve
- * @param x2 The x-coordinate of the end point on a quadratic curve
- * @param y2 The y-coordinate of the end point on a quadratic curve
- */
- private void quadTo(float x1, float y1, float x2, float y2) {
- mPath.quadTo(x1, y1, mLastX = x2, mLastY = y2);
- }
-
- /**
- * Same as quadTo, but the coordinates are considered relative to the last
- * point on this contour. If there is no previous point, then a moveTo(0,0)
- * is inserted automatically.
- *
- * @param dx1 The amount to add to the x-coordinate of the last point on
- * this contour, for the control point of a quadratic curve
- * @param dy1 The amount to add to the y-coordinate of the last point on
- * this contour, for the control point of a quadratic curve
- * @param dx2 The amount to add to the x-coordinate of the last point on
- * this contour, for the end point of a quadratic curve
- * @param dy2 The amount to add to the y-coordinate of the last point on
- * this contour, for the end point of a quadratic curve
- */
- private void rQuadTo(float dx1, float dy1, float dx2, float dy2) {
- if (isEmpty()) {
- mPath.moveTo(mLastX = 0, mLastY = 0);
- }
- dx1 += mLastX;
- dy1 += mLastY;
- dx2 += mLastX;
- dy2 += mLastY;
- mPath.quadTo(dx1, dy1, mLastX = dx2, mLastY = dy2);
- }
-
- /**
- * Add a cubic bezier from the last point, approaching control points
- * (x1,y1) and (x2,y2), and ending at (x3,y3). If no moveTo() call has been
- * made for this contour, the first point is automatically set to (0,0).
- *
- * @param x1 The x-coordinate of the 1st control point on a cubic curve
- * @param y1 The y-coordinate of the 1st control point on a cubic curve
- * @param x2 The x-coordinate of the 2nd control point on a cubic curve
- * @param y2 The y-coordinate of the 2nd control point on a cubic curve
- * @param x3 The x-coordinate of the end point on a cubic curve
- * @param y3 The y-coordinate of the end point on a cubic curve
- */
- private void cubicTo(float x1, float y1, float x2, float y2,
- float x3, float y3) {
- mPath.curveTo(x1, y1, x2, y2, mLastX = x3, mLastY = y3);
- }
-
- /**
- * Same as cubicTo, but the coordinates are considered relative to the
- * current point on this contour. If there is no previous point, then a
- * moveTo(0,0) is inserted automatically.
- */
- private void rCubicTo(float dx1, float dy1, float dx2, float dy2,
- float dx3, float dy3) {
- if (isEmpty()) {
- mPath.moveTo(mLastX = 0, mLastY = 0);
- }
- dx1 += mLastX;
- dy1 += mLastY;
- dx2 += mLastX;
- dy2 += mLastY;
- dx3 += mLastX;
- dy3 += mLastY;
- mPath.curveTo(dx1, dy1, dx2, dy2, mLastX = dx3, mLastY = dy3);
- }
-
- /**
- * Append the specified arc to the path as a new contour. If the start of
- * the path is different from the path's current last point, then an
- * automatic lineTo() is added to connect the current contour to the
- * start of the arc. However, if the path is empty, then we call moveTo()
- * with the first point of the arc. The sweep angle is tread mod 360.
- *
- * @param oval The bounds of oval defining shape and size of the arc
- * @param startAngle Starting angle (in degrees) where the arc begins
- * @param sweepAngle Sweep angle (in degrees) measured clockwise, treated
- * mod 360.
- * @param forceMoveTo If true, always begin a new contour with the arc
- */
- private void arcTo(RectF oval, float startAngle, float sweepAngle, boolean forceMoveTo) {
- Arc2D arc = new Arc2D.Float(oval.left, oval.top, oval.width(), oval.height(), -startAngle,
- -sweepAngle, Arc2D.OPEN);
- mPath.append(arc, true /*connect*/);
-
- resetLastPointFromPath();
- }
-
- /**
- * Close the current contour. If the current point is not equal to the
- * first point of the contour, a line segment is automatically added.
- */
- private void close() {
- mPath.closePath();
- }
-
- private void resetLastPointFromPath() {
- Point2D last = mPath.getCurrentPoint();
- mLastX = (float) last.getX();
- mLastY = (float) last.getY();
- }
-
- /**
- * Add a closed rectangle contour to the path
- *
- * @param left The left side of a rectangle to add to the path
- * @param top The top of a rectangle to add to the path
- * @param right The right side of a rectangle to add to the path
- * @param bottom The bottom of a rectangle to add to the path
- * @param dir The direction to wind the rectangle's contour
- */
- private void addRect(float left, float top, float right, float bottom,
- int dir) {
- moveTo(left, top);
-
- Direction direction = getDirection(dir);
-
- switch (direction) {
- case CW:
- lineTo(right, top);
- lineTo(right, bottom);
- lineTo(left, bottom);
- break;
- case CCW:
- lineTo(left, bottom);
- lineTo(right, bottom);
- lineTo(right, top);
- break;
- }
-
- close();
-
- resetLastPointFromPath();
- }
-
- /**
- * Offset the path by (dx,dy), returning true on success
- *
- * @param dx The amount in the X direction to offset the entire path
- * @param dy The amount in the Y direction to offset the entire path
- * @param dst The translated path is written here. If this is null, then
- * the original path is modified.
- */
- public void offset(float dx, float dy, Path_Delegate dst) {
- GeneralPath newPath = new GeneralPath();
-
- PathIterator iterator = mPath.getPathIterator(new AffineTransform(0, 0, dx, 0, 0, dy));
-
- newPath.append(iterator, false /*connect*/);
-
- if (dst != null) {
- dst.mPath = newPath;
- } else {
- mPath = newPath;
- }
- }
-
- /**
- * Transform the points in this path by matrix, and write the answer
- * into dst. If dst is null, then the the original path is modified.
- *
- * @param matrix The matrix to apply to the path
- * @param dst The transformed path is written here. If dst is null,
- * then the the original path is modified
- */
- public void transform(Matrix_Delegate matrix, Path_Delegate dst) {
- if (matrix.hasPerspective()) {
- assert false;
- Bridge.getLog().fidelityWarning(LayoutLog.TAG_MATRIX_AFFINE,
- "android.graphics.Path#transform() only " +
- "supports affine transformations.", null, null /*data*/);
- }
-
- GeneralPath newPath = new GeneralPath();
-
- PathIterator iterator = mPath.getPathIterator(matrix.getAffineTransform());
-
- newPath.append(iterator, false /*connect*/);
-
- if (dst != null) {
- dst.mPath = newPath;
- } else {
- mPath = newPath;
- }
- }
-}
diff --git a/tools/layoutlib/bridge/src/android/graphics/PixelXorXfermode_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/PixelXorXfermode_Delegate.java
deleted file mode 100644
index 4ab044b..0000000
--- a/tools/layoutlib/bridge/src/android/graphics/PixelXorXfermode_Delegate.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.graphics;
-
-import com.android.layoutlib.bridge.impl.DelegateManager;
-import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
-
-import java.awt.Composite;
-
-/**
- * Delegate implementing the native methods of android.graphics.PixelXorXfermode
- *
- * Through the layoutlib_create tool, the original native methods of PixelXorXfermode have been
- * replaced by calls to methods of the same name in this delegate class.
- *
- * This class behaves like the original native implementation, but in Java, keeping previously
- * native data into its own objects and mapping them to int that are sent back and forth between
- * it and the original PixelXorXfermode class.
- *
- * Because this extends {@link Xfermode_Delegate}, there's no need to use a
- * {@link DelegateManager}, as all the PathEffect classes will be added to the manager owned by
- * {@link Xfermode_Delegate}.
- *
- * @see Xfermode_Delegate
- */
-public class PixelXorXfermode_Delegate extends Xfermode_Delegate {
- // ---- delegate data ----
-
- // ---- Public Helper methods ----
-
- @Override
- public Composite getComposite(int alpha) {
- // FIXME
- return null;
- }
-
- @Override
- public boolean isSupported() {
- return false;
- }
-
- @Override
- public String getSupportMessage() {
- return "Pixel XOR Xfermodes are not supported in Layout Preview mode.";
- }
-
- // ---- native methods ----
-
- @LayoutlibDelegate
- /*package*/ static int nativeCreate(int opColor) {
- PixelXorXfermode_Delegate newDelegate = new PixelXorXfermode_Delegate();
- return sManager.addNewDelegate(newDelegate);
- }
-
- // ---- Private delegate/helper methods ----
-}
diff --git a/tools/layoutlib/bridge/src/android/graphics/PorterDuffColorFilter_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/PorterDuffColorFilter_Delegate.java
deleted file mode 100644
index c45dbaa..0000000
--- a/tools/layoutlib/bridge/src/android/graphics/PorterDuffColorFilter_Delegate.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.graphics;
-
-import com.android.layoutlib.bridge.impl.DelegateManager;
-import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
-
-/**
- * Delegate implementing the native methods of android.graphics.PorterDuffColorFilter
- *
- * Through the layoutlib_create tool, the original native methods of PorterDuffColorFilter have
- * been replaced by calls to methods of the same name in this delegate class.
- *
- * This class behaves like the original native implementation, but in Java, keeping previously
- * native data into its own objects and mapping them to int that are sent back and forth between
- * it and the original PorterDuffColorFilter class.
- *
- * Because this extends {@link ColorFilter_Delegate}, there's no need to use a
- * {@link DelegateManager}, as all the Shader classes will be added to the manager
- * owned by {@link ColorFilter_Delegate}.
- *
- * @see ColorFilter_Delegate
- *
- */
-public class PorterDuffColorFilter_Delegate extends ColorFilter_Delegate {
-
- // ---- delegate data ----
-
- // ---- Public Helper methods ----
-
- @Override
- public boolean isSupported() {
- return false;
- }
-
- @Override
- public String getSupportMessage() {
- return "PorterDuff Color Filters are not supported.";
- }
-
- // ---- native methods ----
-
- @LayoutlibDelegate
- /*package*/ static int native_CreatePorterDuffFilter(int srcColor, int porterDuffMode) {
- PorterDuffColorFilter_Delegate newDelegate = new PorterDuffColorFilter_Delegate();
- return sManager.addNewDelegate(newDelegate);
- }
-
- @LayoutlibDelegate
- /*package*/ static int nCreatePorterDuffFilter(int nativeFilter, int srcColor,
- int porterDuffMode) {
- // pass
- return 0;
- }
-
- // ---- Private delegate/helper methods ----
-}
diff --git a/tools/layoutlib/bridge/src/android/graphics/PorterDuffXfermode_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/PorterDuffXfermode_Delegate.java
deleted file mode 100644
index 4301c1a..0000000
--- a/tools/layoutlib/bridge/src/android/graphics/PorterDuffXfermode_Delegate.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.graphics;
-
-import com.android.ide.common.rendering.api.LayoutLog;
-import com.android.layoutlib.bridge.Bridge;
-import com.android.layoutlib.bridge.impl.DelegateManager;
-import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
-
-import java.awt.AlphaComposite;
-import java.awt.Composite;
-
-/**
- * Delegate implementing the native methods of android.graphics.PorterDuffXfermode
- *
- * Through the layoutlib_create tool, the original native methods of PorterDuffXfermode have been
- * replaced by calls to methods of the same name in this delegate class.
- *
- * This class behaves like the original native implementation, but in Java, keeping previously
- * native data into its own objects and mapping them to int that are sent back and forth between
- * it and the original PorterDuffXfermode class.
- *
- * Because this extends {@link Xfermode_Delegate}, there's no need to use a
- * {@link DelegateManager}, as all the PathEffect classes will be added to the manager owned by
- * {@link Xfermode_Delegate}.
- *
- */
-public class PorterDuffXfermode_Delegate extends Xfermode_Delegate {
-
- // ---- delegate data ----
-
- private final int mMode;
-
- // ---- Public Helper methods ----
-
- public PorterDuff.Mode getMode() {
- return getPorterDuffMode(mMode);
- }
-
- @Override
- public Composite getComposite(int alpha) {
- return getComposite(getPorterDuffMode(mMode), alpha);
- }
-
- @Override
- public boolean isSupported() {
- return true;
- }
-
- @Override
- public String getSupportMessage() {
- // no message since isSupported returns true;
- return null;
- }
-
- public static PorterDuff.Mode getPorterDuffMode(int mode) {
- for (PorterDuff.Mode m : PorterDuff.Mode.values()) {
- if (m.nativeInt == mode) {
- return m;
- }
- }
-
- Bridge.getLog().error(LayoutLog.TAG_BROKEN,
- String.format("Unknown PorterDuff.Mode: %d", mode), null /*data*/);
- assert false;
- return PorterDuff.Mode.SRC_OVER;
- }
-
- public static Composite getComposite(PorterDuff.Mode mode, int alpha) {
- float falpha = alpha != 0xFF ? (float)alpha / 255.f : 1.f;
- switch (mode) {
- case CLEAR:
- return AlphaComposite.getInstance(AlphaComposite.CLEAR, falpha);
- case DARKEN:
- break;
- case DST:
- return AlphaComposite.getInstance(AlphaComposite.DST, falpha);
- case DST_ATOP:
- return AlphaComposite.getInstance(AlphaComposite.DST_ATOP, falpha);
- case DST_IN:
- return AlphaComposite.getInstance(AlphaComposite.DST_IN, falpha);
- case DST_OUT:
- return AlphaComposite.getInstance(AlphaComposite.DST_OUT, falpha);
- case DST_OVER:
- return AlphaComposite.getInstance(AlphaComposite.DST_OVER, falpha);
- case LIGHTEN:
- break;
- case MULTIPLY:
- break;
- case SCREEN:
- break;
- case SRC:
- return AlphaComposite.getInstance(AlphaComposite.SRC, falpha);
- case SRC_ATOP:
- return AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, falpha);
- case SRC_IN:
- return AlphaComposite.getInstance(AlphaComposite.SRC_IN, falpha);
- case SRC_OUT:
- return AlphaComposite.getInstance(AlphaComposite.SRC_OUT, falpha);
- case SRC_OVER:
- return AlphaComposite.getInstance(AlphaComposite.SRC_OVER, falpha);
- case XOR:
- return AlphaComposite.getInstance(AlphaComposite.XOR, falpha);
- }
-
- Bridge.getLog().fidelityWarning(LayoutLog.TAG_BROKEN,
- String.format("Unsupported PorterDuff Mode: %s", mode.name()),
- null, null /*data*/);
-
- return AlphaComposite.getInstance(AlphaComposite.SRC_OVER, falpha);
- }
-
- // ---- native methods ----
-
- @LayoutlibDelegate
- /*package*/ static int nativeCreateXfermode(int mode) {
- PorterDuffXfermode_Delegate newDelegate = new PorterDuffXfermode_Delegate(mode);
- return sManager.addNewDelegate(newDelegate);
- }
-
- // ---- Private delegate/helper methods ----
-
- private PorterDuffXfermode_Delegate(int mode) {
- mMode = mode;
- }
-}
diff --git a/tools/layoutlib/bridge/src/android/graphics/RadialGradient_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/RadialGradient_Delegate.java
deleted file mode 100644
index 3fe45fa..0000000
--- a/tools/layoutlib/bridge/src/android/graphics/RadialGradient_Delegate.java
+++ /dev/null
@@ -1,215 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.graphics;
-
-import com.android.ide.common.rendering.api.LayoutLog;
-import com.android.layoutlib.bridge.Bridge;
-import com.android.layoutlib.bridge.impl.DelegateManager;
-import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
-
-import android.graphics.Shader.TileMode;
-
-/**
- * Delegate implementing the native methods of android.graphics.RadialGradient
- *
- * Through the layoutlib_create tool, the original native methods of RadialGradient have been
- * replaced by calls to methods of the same name in this delegate class.
- *
- * This class behaves like the original native implementation, but in Java, keeping previously
- * native data into its own objects and mapping them to int that are sent back and forth between
- * it and the original RadialGradient class.
- *
- * Because this extends {@link Shader_Delegate}, there's no need to use a {@link DelegateManager},
- * as all the Shader classes will be added to the manager owned by {@link Shader_Delegate}.
- *
- * @see Shader_Delegate
- *
- */
-public class RadialGradient_Delegate extends Gradient_Delegate {
-
- // ---- delegate data ----
- private java.awt.Paint mJavaPaint;
-
- // ---- Public Helper methods ----
-
- @Override
- public java.awt.Paint getJavaPaint() {
- return mJavaPaint;
- }
-
- // ---- native methods ----
-
- @LayoutlibDelegate
- /*package*/ static int nativeCreate1(float x, float y, float radius,
- int colors[], float positions[], int tileMode) {
- RadialGradient_Delegate newDelegate = new RadialGradient_Delegate(x, y, radius,
- colors, positions, Shader_Delegate.getTileMode(tileMode));
- return sManager.addNewDelegate(newDelegate);
- }
-
- @LayoutlibDelegate
- /*package*/ static int nativeCreate2(float x, float y, float radius,
- int color0, int color1, int tileMode) {
- return nativeCreate1(x, y, radius, new int[] { color0, color1 }, null /*positions*/,
- tileMode);
- }
-
- @LayoutlibDelegate
- /*package*/ static int nativePostCreate1(int native_shader, float x, float y, float radius,
- int colors[], float positions[], int tileMode) {
- // nothing to be done here.
- return 0;
- }
-
- @LayoutlibDelegate
- /*package*/ static int nativePostCreate2(int native_shader, float x, float y, float radius,
- int color0, int color1, int tileMode) {
- // nothing to be done here.
- return 0;
- }
-
- // ---- Private delegate/helper methods ----
-
- /**
- * Create a shader that draws a radial gradient given the center and radius.
- *
- * @param x The x-coordinate of the center of the radius
- * @param y The y-coordinate of the center of the radius
- * @param radius Must be positive. The radius of the circle for this
- * gradient
- * @param colors The colors to be distributed between the center and edge of
- * the circle
- * @param positions May be NULL. The relative position of each corresponding
- * color in the colors array. If this is NULL, the the colors are
- * distributed evenly between the center and edge of the circle.
- * @param tile The Shader tiling mode
- */
- private RadialGradient_Delegate(float x, float y, float radius, int colors[], float positions[],
- TileMode tile) {
- super(colors, positions);
- mJavaPaint = new RadialGradientPaint(x, y, radius, mColors, mPositions, tile);
- }
-
- private class RadialGradientPaint extends GradientPaint {
-
- private final float mX;
- private final float mY;
- private final float mRadius;
-
- public RadialGradientPaint(float x, float y, float radius,
- int[] colors, float[] positions, TileMode mode) {
- super(colors, positions, mode);
- mX = x;
- mY = y;
- mRadius = radius;
- }
-
- @Override
- public java.awt.PaintContext createContext(
- java.awt.image.ColorModel colorModel,
- java.awt.Rectangle deviceBounds,
- java.awt.geom.Rectangle2D userBounds,
- java.awt.geom.AffineTransform xform,
- java.awt.RenderingHints hints) {
- precomputeGradientColors();
-
- java.awt.geom.AffineTransform canvasMatrix;
- try {
- canvasMatrix = xform.createInverse();
- } catch (java.awt.geom.NoninvertibleTransformException e) {
- Bridge.getLog().fidelityWarning(LayoutLog.TAG_MATRIX_INVERSE,
- "Unable to inverse matrix in RadialGradient", e, null /*data*/);
- canvasMatrix = new java.awt.geom.AffineTransform();
- }
-
- java.awt.geom.AffineTransform localMatrix = getLocalMatrix();
- try {
- localMatrix = localMatrix.createInverse();
- } catch (java.awt.geom.NoninvertibleTransformException e) {
- Bridge.getLog().fidelityWarning(LayoutLog.TAG_MATRIX_INVERSE,
- "Unable to inverse matrix in RadialGradient", e, null /*data*/);
- localMatrix = new java.awt.geom.AffineTransform();
- }
-
- return new RadialGradientPaintContext(canvasMatrix, localMatrix, colorModel);
- }
-
- private class RadialGradientPaintContext implements java.awt.PaintContext {
-
- private final java.awt.geom.AffineTransform mCanvasMatrix;
- private final java.awt.geom.AffineTransform mLocalMatrix;
- private final java.awt.image.ColorModel mColorModel;
-
- public RadialGradientPaintContext(
- java.awt.geom.AffineTransform canvasMatrix,
- java.awt.geom.AffineTransform localMatrix,
- java.awt.image.ColorModel colorModel) {
- mCanvasMatrix = canvasMatrix;
- mLocalMatrix = localMatrix;
- mColorModel = colorModel;
- }
-
- @Override
- public void dispose() {
- }
-
- @Override
- public java.awt.image.ColorModel getColorModel() {
- return mColorModel;
- }
-
- @Override
- public java.awt.image.Raster getRaster(int x, int y, int w, int h) {
- java.awt.image.BufferedImage image = new java.awt.image.BufferedImage(w, h,
- java.awt.image.BufferedImage.TYPE_INT_ARGB);
-
- int[] data = new int[w*h];
-
- // compute distance from each point to the center, and figure out the distance from
- // it.
- int index = 0;
- float[] pt1 = new float[2];
- float[] pt2 = new float[2];
- for (int iy = 0 ; iy < h ; iy++) {
- for (int ix = 0 ; ix < w ; ix++) {
- // handle the canvas transform
- pt1[0] = x + ix;
- pt1[1] = y + iy;
- mCanvasMatrix.transform(pt1, 0, pt2, 0, 1);
-
- // handle the local matrix
- pt1[0] = pt2[0] - mX;
- pt1[1] = pt2[1] - mY;
- mLocalMatrix.transform(pt1, 0, pt2, 0, 1);
-
- float _x = pt2[0];
- float _y = pt2[1];
- float distance = (float) Math.sqrt(_x * _x + _y * _y);
-
- data[index++] = getGradientColor(distance / mRadius);
- }
- }
-
- image.setRGB(0 /*startX*/, 0 /*startY*/, w, h, data, 0 /*offset*/, w /*scansize*/);
-
- return image.getRaster();
- }
-
- }
- }
-
-}
diff --git a/tools/layoutlib/bridge/src/android/graphics/Rasterizer_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/Rasterizer_Delegate.java
deleted file mode 100644
index 2812b6b..0000000
--- a/tools/layoutlib/bridge/src/android/graphics/Rasterizer_Delegate.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.graphics;
-
-import com.android.layoutlib.bridge.impl.DelegateManager;
-import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
-
-/**
- * Delegate implementing the native methods of android.graphics.Rasterizer
- *
- * Through the layoutlib_create tool, the original native methods of Rasterizer have been replaced
- * by calls to methods of the same name in this delegate class.
- *
- * This class behaves like the original native implementation, but in Java, keeping previously
- * native data into its own objects and mapping them to int that are sent back and forth between
- * it and the original Rasterizer class.
- *
- * This also serve as a base class for all Rasterizer delegate classes.
- *
- * @see DelegateManager
- *
- */
-public abstract class Rasterizer_Delegate {
-
- // ---- delegate manager ----
- protected static final DelegateManager<Rasterizer_Delegate> sManager =
- new DelegateManager<Rasterizer_Delegate>(Rasterizer_Delegate.class);
-
- // ---- delegate helper data ----
-
- // ---- delegate data ----
-
- // ---- Public Helper methods ----
-
- public static Rasterizer_Delegate getDelegate(int nativeShader) {
- return sManager.getDelegate(nativeShader);
- }
-
- public abstract boolean isSupported();
- public abstract String getSupportMessage();
-
- // ---- native methods ----
-
- @LayoutlibDelegate
- /*package*/ static void finalizer(int native_instance) {
- sManager.removeJavaReferenceFor(native_instance);
- }
-
- // ---- Private delegate/helper methods ----
-}
diff --git a/tools/layoutlib/bridge/src/android/graphics/Region_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/Region_Delegate.java
deleted file mode 100644
index cb31b8f..0000000
--- a/tools/layoutlib/bridge/src/android/graphics/Region_Delegate.java
+++ /dev/null
@@ -1,484 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.graphics;
-
-import com.android.ide.common.rendering.api.LayoutLog;
-import com.android.layoutlib.bridge.Bridge;
-import com.android.layoutlib.bridge.impl.DelegateManager;
-import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
-
-import android.os.Parcel;
-
-import java.awt.Rectangle;
-import java.awt.Shape;
-import java.awt.geom.AffineTransform;
-import java.awt.geom.Area;
-import java.awt.geom.Rectangle2D;
-
-/**
- * Delegate implementing the native methods of android.graphics.Region
- *
- * Through the layoutlib_create tool, the original native methods of Region have been replaced
- * by calls to methods of the same name in this delegate class.
- *
- * This class behaves like the original native implementation, but in Java, keeping previously
- * native data into its own objects and mapping them to int that are sent back and forth between
- * it and the original Region class.
- *
- * This also serve as a base class for all Region delegate classes.
- *
- * @see DelegateManager
- *
- */
-public class Region_Delegate {
-
- // ---- delegate manager ----
- protected static final DelegateManager<Region_Delegate> sManager =
- new DelegateManager<Region_Delegate>(Region_Delegate.class);
-
- // ---- delegate helper data ----
-
- // ---- delegate data ----
- private Area mArea = new Area();
-
- // ---- Public Helper methods ----
-
- public static Region_Delegate getDelegate(int nativeShader) {
- return sManager.getDelegate(nativeShader);
- }
-
- public Area getJavaArea() {
- return mArea;
- }
-
- /**
- * Combines two {@link Shape} into another one (actually an {@link Area}), according
- * to the given {@link Region.Op}.
- *
- * If the Op is not one that combines two shapes, then this return null
- *
- * @param shape1 the firt shape to combine which can be null if there's no original clip.
- * @param shape2 the 2nd shape to combine
- * @param regionOp the operande for the combine
- * @return a new area or null.
- */
- public static Area combineShapes(Shape shape1, Shape shape2, int regionOp) {
- if (regionOp == Region.Op.DIFFERENCE.nativeInt) {
- // if shape1 is null (empty), then the result is null.
- if (shape1 == null) {
- return null;
- }
-
- // result is always a new area.
- Area result = new Area(shape1);
- result.subtract(shape2 instanceof Area ? (Area) shape2 : new Area(shape2));
- return result;
-
- } else if (regionOp == Region.Op.INTERSECT.nativeInt) {
- // if shape1 is null, then the result is simply shape2.
- if (shape1 == null) {
- return new Area(shape2);
- }
-
- // result is always a new area.
- Area result = new Area(shape1);
- result.intersect(shape2 instanceof Area ? (Area) shape2 : new Area(shape2));
- return result;
-
- } else if (regionOp == Region.Op.UNION.nativeInt) {
- // if shape1 is null, then the result is simply shape2.
- if (shape1 == null) {
- return new Area(shape2);
- }
-
- // result is always a new area.
- Area result = new Area(shape1);
- result.add(shape2 instanceof Area ? (Area) shape2 : new Area(shape2));
- return result;
-
- } else if (regionOp == Region.Op.XOR.nativeInt) {
- // if shape1 is null, then the result is simply shape2
- if (shape1 == null) {
- return new Area(shape2);
- }
-
- // result is always a new area.
- Area result = new Area(shape1);
- result.exclusiveOr(shape2 instanceof Area ? (Area) shape2 : new Area(shape2));
- return result;
-
- } else if (regionOp == Region.Op.REVERSE_DIFFERENCE.nativeInt) {
- // result is always a new area.
- Area result = new Area(shape2);
-
- if (shape1 != null) {
- result.subtract(shape1 instanceof Area ? (Area) shape1 : new Area(shape1));
- }
-
- return result;
- }
-
- return null;
- }
-
- // ---- native methods ----
-
- @LayoutlibDelegate
- /*package*/ static boolean isEmpty(Region thisRegion) {
- Region_Delegate regionDelegate = sManager.getDelegate(thisRegion.mNativeRegion);
- if (regionDelegate == null) {
- return true;
- }
-
- return regionDelegate.mArea.isEmpty();
- }
-
- @LayoutlibDelegate
- /*package*/ static boolean isRect(Region thisRegion) {
- Region_Delegate regionDelegate = sManager.getDelegate(thisRegion.mNativeRegion);
- if (regionDelegate == null) {
- return true;
- }
-
- return regionDelegate.mArea.isRectangular();
- }
-
- @LayoutlibDelegate
- /*package*/ static boolean isComplex(Region thisRegion) {
- Region_Delegate regionDelegate = sManager.getDelegate(thisRegion.mNativeRegion);
- if (regionDelegate == null) {
- return true;
- }
-
- return regionDelegate.mArea.isSingular() == false;
- }
-
- @LayoutlibDelegate
- /*package*/ static boolean contains(Region thisRegion, int x, int y) {
- Region_Delegate regionDelegate = sManager.getDelegate(thisRegion.mNativeRegion);
- if (regionDelegate == null) {
- return false;
- }
-
- return regionDelegate.mArea.contains(x, y);
- }
-
- @LayoutlibDelegate
- /*package*/ static boolean quickContains(Region thisRegion,
- int left, int top, int right, int bottom) {
- Region_Delegate regionDelegate = sManager.getDelegate(thisRegion.mNativeRegion);
- if (regionDelegate == null) {
- return false;
- }
-
- return regionDelegate.mArea.isRectangular() &&
- regionDelegate.mArea.contains(left, top, right - left, bottom - top);
- }
-
- @LayoutlibDelegate
- /*package*/ static boolean quickReject(Region thisRegion,
- int left, int top, int right, int bottom) {
- Region_Delegate regionDelegate = sManager.getDelegate(thisRegion.mNativeRegion);
- if (regionDelegate == null) {
- return false;
- }
-
- return regionDelegate.mArea.isEmpty() ||
- regionDelegate.mArea.intersects(left, top, right - left, bottom - top) == false;
- }
-
- @LayoutlibDelegate
- /*package*/ static boolean quickReject(Region thisRegion, Region rgn) {
- Region_Delegate regionDelegate = sManager.getDelegate(thisRegion.mNativeRegion);
- if (regionDelegate == null) {
- return false;
- }
-
- Region_Delegate targetRegionDelegate = sManager.getDelegate(rgn.mNativeRegion);
- if (targetRegionDelegate == null) {
- return false;
- }
-
- return regionDelegate.mArea.isEmpty() ||
- regionDelegate.mArea.getBounds().intersects(
- targetRegionDelegate.mArea.getBounds()) == false;
-
- }
-
- @LayoutlibDelegate
- /*package*/ static void translate(Region thisRegion, int dx, int dy, Region dst) {
- Region_Delegate regionDelegate = sManager.getDelegate(thisRegion.mNativeRegion);
- if (regionDelegate == null) {
- return;
- }
-
- Region_Delegate targetRegionDelegate = sManager.getDelegate(dst.mNativeRegion);
- if (targetRegionDelegate == null) {
- return;
- }
-
- if (regionDelegate.mArea.isEmpty()) {
- targetRegionDelegate.mArea = new Area();
- } else {
- targetRegionDelegate.mArea = new Area(regionDelegate.mArea);
- AffineTransform mtx = new AffineTransform();
- mtx.translate(dx, dy);
- targetRegionDelegate.mArea.transform(mtx);
- }
- }
-
- @LayoutlibDelegate
- /*package*/ static void scale(Region thisRegion, float scale, Region dst) {
- Region_Delegate regionDelegate = sManager.getDelegate(thisRegion.mNativeRegion);
- if (regionDelegate == null) {
- return;
- }
-
- Region_Delegate targetRegionDelegate = sManager.getDelegate(dst.mNativeRegion);
- if (targetRegionDelegate == null) {
- return;
- }
-
- if (regionDelegate.mArea.isEmpty()) {
- targetRegionDelegate.mArea = new Area();
- } else {
- targetRegionDelegate.mArea = new Area(regionDelegate.mArea);
- AffineTransform mtx = new AffineTransform();
- mtx.scale(scale, scale);
- targetRegionDelegate.mArea.transform(mtx);
- }
- }
-
- @LayoutlibDelegate
- /*package*/ static int nativeConstructor() {
- Region_Delegate newDelegate = new Region_Delegate();
- return sManager.addNewDelegate(newDelegate);
- }
-
- @LayoutlibDelegate
- /*package*/ static void nativeDestructor(int native_region) {
- sManager.removeJavaReferenceFor(native_region);
- }
-
- @LayoutlibDelegate
- /*package*/ static boolean nativeSetRegion(int native_dst, int native_src) {
- Region_Delegate dstRegion = sManager.getDelegate(native_dst);
- if (dstRegion == null) {
- return true;
- }
-
- Region_Delegate srcRegion = sManager.getDelegate(native_src);
- if (srcRegion == null) {
- return true;
- }
-
- dstRegion.mArea.reset();
- dstRegion.mArea.add(srcRegion.mArea);
-
- return true;
- }
-
- @LayoutlibDelegate
- /*package*/ static boolean nativeSetRect(int native_dst,
- int left, int top, int right, int bottom) {
- Region_Delegate dstRegion = sManager.getDelegate(native_dst);
- if (dstRegion == null) {
- return true;
- }
-
- dstRegion.mArea = new Area(new Rectangle2D.Float(left, top, right - left, bottom - top));
- return dstRegion.mArea.getBounds().isEmpty() == false;
- }
-
- @LayoutlibDelegate
- /*package*/ static boolean nativeSetPath(int native_dst, int native_path, int native_clip) {
- Region_Delegate dstRegion = sManager.getDelegate(native_dst);
- if (dstRegion == null) {
- return true;
- }
-
- Path_Delegate path = Path_Delegate.getDelegate(native_path);
- if (path == null) {
- return true;
- }
-
- dstRegion.mArea = new Area(path.getJavaShape());
-
- Region_Delegate clip = sManager.getDelegate(native_clip);
- if (clip != null) {
- dstRegion.mArea.subtract(clip.getJavaArea());
- }
-
- return dstRegion.mArea.getBounds().isEmpty() == false;
- }
-
- @LayoutlibDelegate
- /*package*/ static boolean nativeGetBounds(int native_region, Rect rect) {
- Region_Delegate region = sManager.getDelegate(native_region);
- if (region == null) {
- return true;
- }
-
- Rectangle bounds = region.mArea.getBounds();
- if (bounds.isEmpty()) {
- rect.left = rect.top = rect.right = rect.bottom = 0;
- return false;
- }
-
- rect.left = bounds.x;
- rect.top = bounds.y;
- rect.right = bounds.x + bounds.width;
- rect.bottom = bounds.y + bounds.height;
- return true;
- }
-
- @LayoutlibDelegate
- /*package*/ static boolean nativeGetBoundaryPath(int native_region, int native_path) {
- Region_Delegate region = sManager.getDelegate(native_region);
- if (region == null) {
- return false;
- }
-
- Path_Delegate path = Path_Delegate.getDelegate(native_path);
- if (path == null) {
- return false;
- }
-
- if (region.mArea.isEmpty()) {
- path.reset();
- return false;
- }
-
- path.setPathIterator(region.mArea.getPathIterator(new AffineTransform()));
- return true;
- }
-
- @LayoutlibDelegate
- /*package*/ static boolean nativeOp(int native_dst,
- int left, int top, int right, int bottom, int op) {
- Region_Delegate region = sManager.getDelegate(native_dst);
- if (region == null) {
- return false;
- }
-
- region.mArea = combineShapes(region.mArea,
- new Rectangle2D.Float(left, top, right - left, bottom - top), op);
-
- assert region.mArea != null;
- if (region.mArea != null) {
- region.mArea = new Area();
- }
-
- return region.mArea.getBounds().isEmpty() == false;
- }
-
- @LayoutlibDelegate
- /*package*/ static boolean nativeOp(int native_dst, Rect rect, int native_region, int op) {
- Region_Delegate region = sManager.getDelegate(native_dst);
- if (region == null) {
- return false;
- }
-
- region.mArea = combineShapes(region.mArea,
- new Rectangle2D.Float(rect.left, rect.top, rect.width(), rect.height()), op);
-
- assert region.mArea != null;
- if (region.mArea != null) {
- region.mArea = new Area();
- }
-
- return region.mArea.getBounds().isEmpty() == false;
- }
-
- @LayoutlibDelegate
- /*package*/ static boolean nativeOp(int native_dst,
- int native_region1, int native_region2, int op) {
- Region_Delegate dstRegion = sManager.getDelegate(native_dst);
- if (dstRegion == null) {
- return true;
- }
-
- Region_Delegate region1 = sManager.getDelegate(native_region1);
- if (region1 == null) {
- return false;
- }
-
- Region_Delegate region2 = sManager.getDelegate(native_region2);
- if (region2 == null) {
- return false;
- }
-
- dstRegion.mArea = combineShapes(region1.mArea, region2.mArea, op);
-
- assert dstRegion.mArea != null;
- if (dstRegion.mArea != null) {
- dstRegion.mArea = new Area();
- }
-
- return dstRegion.mArea.getBounds().isEmpty() == false;
-
- }
-
- @LayoutlibDelegate
- /*package*/ static int nativeCreateFromParcel(Parcel p) {
- // This is only called by Region.CREATOR (Parcelable.Creator<Region>), which is only
- // used during aidl call so really this should not be called.
- Bridge.getLog().error(LayoutLog.TAG_UNSUPPORTED,
- "AIDL is not suppored, and therefore Regions cannot be created from parcels.",
- null /*data*/);
- return 0;
- }
-
- @LayoutlibDelegate
- /*package*/ static boolean nativeWriteToParcel(int native_region,
- Parcel p) {
- // This is only called when sending a region through aidl, so really this should not
- // be called.
- Bridge.getLog().error(LayoutLog.TAG_UNSUPPORTED,
- "AIDL is not suppored, and therefore Regions cannot be written to parcels.",
- null /*data*/);
- return false;
- }
-
- @LayoutlibDelegate
- /*package*/ static boolean nativeEquals(int native_r1, int native_r2) {
- Region_Delegate region1 = sManager.getDelegate(native_r1);
- if (region1 == null) {
- return false;
- }
-
- Region_Delegate region2 = sManager.getDelegate(native_r2);
- if (region2 == null) {
- return false;
- }
-
- return region1.mArea.equals(region2.mArea);
- }
-
- @LayoutlibDelegate
- /*package*/ static String nativeToString(int native_region) {
- Region_Delegate region = sManager.getDelegate(native_region);
- if (region == null) {
- return "not found";
- }
-
- return region.mArea.toString();
- }
-
- // ---- Private delegate/helper methods ----
-
-}
diff --git a/tools/layoutlib/bridge/src/android/graphics/Shader_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/Shader_Delegate.java
deleted file mode 100644
index 368c0384..0000000
--- a/tools/layoutlib/bridge/src/android/graphics/Shader_Delegate.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.graphics;
-
-import com.android.layoutlib.bridge.impl.DelegateManager;
-import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
-
-import android.graphics.Shader.TileMode;
-
-/**
- * Delegate implementing the native methods of android.graphics.Shader
- *
- * Through the layoutlib_create tool, the original native methods of Shader have been replaced
- * by calls to methods of the same name in this delegate class.
- *
- * This class behaves like the original native implementation, but in Java, keeping previously
- * native data into its own objects and mapping them to int that are sent back and forth between
- * it and the original Shader class.
- *
- * This also serve as a base class for all Shader delegate classes.
- *
- * @see DelegateManager
- *
- */
-public abstract class Shader_Delegate {
-
- // ---- delegate manager ----
- protected static final DelegateManager<Shader_Delegate> sManager =
- new DelegateManager<Shader_Delegate>(Shader_Delegate.class);
-
- // ---- delegate helper data ----
-
- // ---- delegate data ----
- private Matrix_Delegate mLocalMatrix = null;
-
- // ---- Public Helper methods ----
-
- public static Shader_Delegate getDelegate(int nativeShader) {
- return sManager.getDelegate(nativeShader);
- }
-
- /**
- * Returns the {@link TileMode} matching the given int.
- * @param tileMode the tile mode int value
- * @return the TileMode enum.
- */
- public static TileMode getTileMode(int tileMode) {
- for (TileMode tm : TileMode.values()) {
- if (tm.nativeInt == tileMode) {
- return tm;
- }
- }
-
- assert false;
- return TileMode.CLAMP;
- }
-
- public abstract java.awt.Paint getJavaPaint();
- public abstract boolean isSupported();
- public abstract String getSupportMessage();
-
- // ---- native methods ----
-
- @LayoutlibDelegate
- /*package*/ static void nativeDestructor(int native_shader, int native_skiaShader) {
- sManager.removeJavaReferenceFor(native_shader);
- }
-
- @LayoutlibDelegate
- /*package*/ static void nativeSetLocalMatrix(int native_shader, int native_skiaShader,
- int matrix_instance) {
- // get the delegate from the native int.
- Shader_Delegate shaderDelegate = sManager.getDelegate(native_shader);
- if (shaderDelegate == null) {
- return;
- }
-
- shaderDelegate.mLocalMatrix = Matrix_Delegate.getDelegate(matrix_instance);
- }
-
- // ---- Private delegate/helper methods ----
-
- protected java.awt.geom.AffineTransform getLocalMatrix() {
- if (mLocalMatrix != null) {
- return mLocalMatrix.getAffineTransform();
- }
-
- return new java.awt.geom.AffineTransform();
- }
-
-}
diff --git a/tools/layoutlib/bridge/src/android/graphics/SumPathEffect_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/SumPathEffect_Delegate.java
deleted file mode 100644
index 410df0c..0000000
--- a/tools/layoutlib/bridge/src/android/graphics/SumPathEffect_Delegate.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.graphics;
-
-import com.android.layoutlib.bridge.impl.DelegateManager;
-import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
-
-import java.awt.Stroke;
-
-/**
- * Delegate implementing the native methods of android.graphics.SumPathEffect
- *
- * Through the layoutlib_create tool, the original native methods of SumPathEffect have been
- * replaced by calls to methods of the same name in this delegate class.
- *
- * This class behaves like the original native implementation, but in Java, keeping previously
- * native data into its own objects and mapping them to int that are sent back and forth between
- * it and the original SumPathEffect class.
- *
- * Because this extends {@link PathEffect_Delegate}, there's no need to use a {@link DelegateManager},
- * as all the Shader classes will be added to the manager owned by {@link PathEffect_Delegate}.
- *
- * @see PathEffect_Delegate
- *
- */
-public class SumPathEffect_Delegate extends PathEffect_Delegate {
-
- // ---- delegate data ----
-
- // ---- Public Helper methods ----
-
- @Override
- public Stroke getStroke(Paint_Delegate paint) {
- // FIXME
- return null;
- }
-
- @Override
- public boolean isSupported() {
- return false;
- }
-
- @Override
- public String getSupportMessage() {
- return "Sum Path Effects are not supported in Layout Preview mode.";
- }
-
- // ---- native methods ----
-
- @LayoutlibDelegate
- /*package*/ static int nativeCreate(int first, int second) {
- SumPathEffect_Delegate newDelegate = new SumPathEffect_Delegate();
- return sManager.addNewDelegate(newDelegate);
- }
-
- // ---- Private delegate/helper methods ----
-}
diff --git a/tools/layoutlib/bridge/src/android/graphics/SweepGradient_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/SweepGradient_Delegate.java
deleted file mode 100644
index 13ae12e..0000000
--- a/tools/layoutlib/bridge/src/android/graphics/SweepGradient_Delegate.java
+++ /dev/null
@@ -1,222 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.graphics;
-
-import com.android.ide.common.rendering.api.LayoutLog;
-import com.android.layoutlib.bridge.Bridge;
-import com.android.layoutlib.bridge.impl.DelegateManager;
-import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
-
-/**
- * Delegate implementing the native methods of android.graphics.SweepGradient
- *
- * Through the layoutlib_create tool, the original native methods of SweepGradient have been
- * replaced by calls to methods of the same name in this delegate class.
- *
- * This class behaves like the original native implementation, but in Java, keeping previously
- * native data into its own objects and mapping them to int that are sent back and forth between
- * it and the original SweepGradient class.
- *
- * Because this extends {@link Shader_Delegate}, there's no need to use a {@link DelegateManager},
- * as all the Shader classes will be added to the manager owned by {@link Shader_Delegate}.
- *
- * @see Shader_Delegate
- *
- */
-public class SweepGradient_Delegate extends Gradient_Delegate {
-
- // ---- delegate data ----
- private java.awt.Paint mJavaPaint;
-
- // ---- Public Helper methods ----
-
- @Override
- public java.awt.Paint getJavaPaint() {
- return mJavaPaint;
- }
-
- // ---- native methods ----
-
- @LayoutlibDelegate
- /*package*/ static int nativeCreate1(float x, float y, int colors[], float positions[]) {
- SweepGradient_Delegate newDelegate = new SweepGradient_Delegate(x, y, colors, positions);
- return sManager.addNewDelegate(newDelegate);
- }
-
- @LayoutlibDelegate
- /*package*/ static int nativeCreate2(float x, float y, int color0, int color1) {
- return nativeCreate1(x, y, new int[] { color0, color1 }, null /*positions*/);
- }
-
- @LayoutlibDelegate
- /*package*/ static int nativePostCreate1(int native_shader, float cx, float cy,
- int[] colors, float[] positions) {
- // nothing to be done here.
- return 0;
- }
-
- @LayoutlibDelegate
- /*package*/ static int nativePostCreate2(int native_shader, float cx, float cy,
- int color0, int color1) {
- // nothing to be done here.
- return 0;
- }
-
- // ---- Private delegate/helper methods ----
-
- /**
- * A subclass of Shader that draws a sweep gradient around a center point.
- *
- * @param cx The x-coordinate of the center
- * @param cy The y-coordinate of the center
- * @param colors The colors to be distributed between around the center.
- * There must be at least 2 colors in the array.
- * @param positions May be NULL. The relative position of
- * each corresponding color in the colors array, beginning
- * with 0 and ending with 1.0. If the values are not
- * monotonic, the drawing may produce unexpected results.
- * If positions is NULL, then the colors are automatically
- * spaced evenly.
- */
- private SweepGradient_Delegate(float cx, float cy,
- int colors[], float positions[]) {
- super(colors, positions);
- mJavaPaint = new SweepGradientPaint(cx, cy, mColors, mPositions);
- }
-
- private class SweepGradientPaint extends GradientPaint {
-
- private final float mCx;
- private final float mCy;
-
- public SweepGradientPaint(float cx, float cy, int[] colors,
- float[] positions) {
- super(colors, positions, null /*tileMode*/);
- mCx = cx;
- mCy = cy;
- }
-
- @Override
- public java.awt.PaintContext createContext(
- java.awt.image.ColorModel colorModel,
- java.awt.Rectangle deviceBounds,
- java.awt.geom.Rectangle2D userBounds,
- java.awt.geom.AffineTransform xform,
- java.awt.RenderingHints hints) {
- precomputeGradientColors();
-
- java.awt.geom.AffineTransform canvasMatrix;
- try {
- canvasMatrix = xform.createInverse();
- } catch (java.awt.geom.NoninvertibleTransformException e) {
- Bridge.getLog().fidelityWarning(LayoutLog.TAG_MATRIX_INVERSE,
- "Unable to inverse matrix in SweepGradient", e, null /*data*/);
- canvasMatrix = new java.awt.geom.AffineTransform();
- }
-
- java.awt.geom.AffineTransform localMatrix = getLocalMatrix();
- try {
- localMatrix = localMatrix.createInverse();
- } catch (java.awt.geom.NoninvertibleTransformException e) {
- Bridge.getLog().fidelityWarning(LayoutLog.TAG_MATRIX_INVERSE,
- "Unable to inverse matrix in SweepGradient", e, null /*data*/);
- localMatrix = new java.awt.geom.AffineTransform();
- }
-
- return new SweepGradientPaintContext(canvasMatrix, localMatrix, colorModel);
- }
-
- private class SweepGradientPaintContext implements java.awt.PaintContext {
-
- private final java.awt.geom.AffineTransform mCanvasMatrix;
- private final java.awt.geom.AffineTransform mLocalMatrix;
- private final java.awt.image.ColorModel mColorModel;
-
- public SweepGradientPaintContext(
- java.awt.geom.AffineTransform canvasMatrix,
- java.awt.geom.AffineTransform localMatrix,
- java.awt.image.ColorModel colorModel) {
- mCanvasMatrix = canvasMatrix;
- mLocalMatrix = localMatrix;
- mColorModel = colorModel;
- }
-
- @Override
- public void dispose() {
- }
-
- @Override
- public java.awt.image.ColorModel getColorModel() {
- return mColorModel;
- }
-
- @Override
- public java.awt.image.Raster getRaster(int x, int y, int w, int h) {
- java.awt.image.BufferedImage image = new java.awt.image.BufferedImage(w, h,
- java.awt.image.BufferedImage.TYPE_INT_ARGB);
-
- int[] data = new int[w*h];
-
- // compute angle from each point to the center, and figure out the distance from
- // it.
- int index = 0;
- float[] pt1 = new float[2];
- float[] pt2 = new float[2];
- for (int iy = 0 ; iy < h ; iy++) {
- for (int ix = 0 ; ix < w ; ix++) {
- // handle the canvas transform
- pt1[0] = x + ix;
- pt1[1] = y + iy;
- mCanvasMatrix.transform(pt1, 0, pt2, 0, 1);
-
- // handle the local matrix
- pt1[0] = pt2[0] - mCx;
- pt1[1] = pt2[1] - mCy;
- mLocalMatrix.transform(pt1, 0, pt2, 0, 1);
-
- float dx = pt2[0];
- float dy = pt2[1];
-
- float angle;
- if (dx == 0) {
- angle = (float) (dy < 0 ? 3 * Math.PI / 2 : Math.PI / 2);
- } else if (dy == 0) {
- angle = (float) (dx < 0 ? Math.PI : 0);
- } else {
- angle = (float) Math.atan(dy / dx);
- if (dx > 0) {
- if (dy < 0) {
- angle += Math.PI * 2;
- }
- } else {
- angle += Math.PI;
- }
- }
-
- // convert to 0-1. value and get color
- data[index++] = getGradientColor((float) (angle / (2 * Math.PI)));
- }
- }
-
- image.setRGB(0 /*startX*/, 0 /*startY*/, w, h, data, 0 /*offset*/, w /*scansize*/);
-
- return image.getRaster();
- }
-
- }
- }
-}
diff --git a/tools/layoutlib/bridge/src/android/graphics/Typeface_Accessor.java b/tools/layoutlib/bridge/src/android/graphics/Typeface_Accessor.java
deleted file mode 100644
index adad2ac..0000000
--- a/tools/layoutlib/bridge/src/android/graphics/Typeface_Accessor.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (C) 2011 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.graphics;
-
-/**
- * Class allowing access to package-protected methods/fields.
- */
-public class Typeface_Accessor {
-
- public static void resetDefaults() {
- Typeface.sDefaults = null;
- }
-}
diff --git a/tools/layoutlib/bridge/src/android/graphics/Typeface_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/Typeface_Delegate.java
deleted file mode 100644
index 8701cc8..0000000
--- a/tools/layoutlib/bridge/src/android/graphics/Typeface_Delegate.java
+++ /dev/null
@@ -1,211 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.graphics;
-
-import com.android.ide.common.rendering.api.LayoutLog;
-import com.android.layoutlib.bridge.Bridge;
-import com.android.layoutlib.bridge.impl.DelegateManager;
-import com.android.layoutlib.bridge.impl.FontLoader;
-import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
-
-import android.content.res.AssetManager;
-
-import java.awt.Font;
-import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Delegate implementing the native methods of android.graphics.Typeface
- *
- * Through the layoutlib_create tool, the original native methods of Typeface have been replaced
- * by calls to methods of the same name in this delegate class.
- *
- * This class behaves like the original native implementation, but in Java, keeping previously
- * native data into its own objects and mapping them to int that are sent back and forth between
- * it and the original Typeface class.
- *
- * @see DelegateManager
- *
- */
-public final class Typeface_Delegate {
-
- private static final String SYSTEM_FONTS = "/system/fonts/";
-
- // ---- delegate manager ----
- private static final DelegateManager<Typeface_Delegate> sManager =
- new DelegateManager<Typeface_Delegate>(Typeface_Delegate.class);
-
- // ---- delegate helper data ----
- private static final String DEFAULT_FAMILY = "sans-serif";
-
- private static FontLoader sFontLoader;
- private static final List<Typeface_Delegate> sPostInitDelegate =
- new ArrayList<Typeface_Delegate>();
-
- // ---- delegate data ----
-
- private final String mFamily;
- private int mStyle;
- private List<Font> mFonts;
-
-
- // ---- Public Helper methods ----
-
- public static synchronized void init(FontLoader fontLoader) {
- sFontLoader = fontLoader;
-
- for (Typeface_Delegate delegate : sPostInitDelegate) {
- delegate.init();
- }
- sPostInitDelegate.clear();
- }
-
- public static Typeface_Delegate getDelegate(int nativeTypeface) {
- return sManager.getDelegate(nativeTypeface);
- }
-
- public static List<Font> getFonts(Typeface typeface) {
- return getFonts(typeface.native_instance);
- }
-
- public static List<Font> getFonts(int native_int) {
- Typeface_Delegate delegate = sManager.getDelegate(native_int);
- if (delegate == null) {
- return null;
- }
-
- return delegate.getFonts();
- }
-
- public List<Font> getFonts() {
- return mFonts;
- }
-
- // ---- native methods ----
-
- @LayoutlibDelegate
- /*package*/ static synchronized int nativeCreate(String familyName, int style) {
- if (familyName == null) {
- familyName = DEFAULT_FAMILY;
- }
-
- Typeface_Delegate newDelegate = new Typeface_Delegate(familyName, style);
- if (sFontLoader != null) {
- newDelegate.init();
- } else {
- // font loader has not been initialized yet, add the delegate to a list of delegates
- // to init when the font loader is initialized.
- // There won't be any rendering before this happens anyway.
- sPostInitDelegate.add(newDelegate);
- }
-
- return sManager.addNewDelegate(newDelegate);
- }
-
- @LayoutlibDelegate
- /*package*/ static synchronized int nativeCreateFromTypeface(int native_instance, int style) {
- Typeface_Delegate delegate = sManager.getDelegate(native_instance);
- if (delegate == null) {
- return 0;
- }
-
- Typeface_Delegate newDelegate = new Typeface_Delegate(delegate.mFamily, style);
- if (sFontLoader != null) {
- newDelegate.init();
- } else {
- // font loader has not been initialized yet, add the delegate to a list of delegates
- // to init when the font loader is initialized.
- // There won't be any rendering before this happens anyway.
- sPostInitDelegate.add(newDelegate);
- }
-
- return sManager.addNewDelegate(newDelegate);
- }
-
- @LayoutlibDelegate
- /*package*/ static synchronized int nativeCreateFromAsset(AssetManager mgr, String path) {
- Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED,
- "Typeface.createFromAsset() is not supported.", null /*throwable*/, null /*data*/);
- return 0;
- }
-
- @LayoutlibDelegate
- /*package*/ static synchronized int nativeCreateFromFile(String path) {
- if (path.startsWith(SYSTEM_FONTS) ) {
- String relativePath = path.substring(SYSTEM_FONTS.length());
- File f = new File(sFontLoader.getOsFontsLocation(), relativePath);
-
- try {
- Font font = Font.createFont(Font.TRUETYPE_FONT, f);
- if (font != null) {
- Typeface_Delegate newDelegate = new Typeface_Delegate(font);
- return sManager.addNewDelegate(newDelegate);
- }
- } catch (Exception e) {
- Bridge.getLog().fidelityWarning(LayoutLog.TAG_BROKEN,
- String.format("Unable to load font %1$s", relativePath),
- null /*throwable*/, null /*data*/);
- }
- } else {
- Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED,
- "Typeface.createFromFile() can only work with platform fonts located in " +
- SYSTEM_FONTS,
- null /*throwable*/, null /*data*/);
- }
-
-
- // return a copy of the base font
- return nativeCreate(null, 0);
- }
-
- @LayoutlibDelegate
- /*package*/ static void nativeUnref(int native_instance) {
- sManager.removeJavaReferenceFor(native_instance);
- }
-
- @LayoutlibDelegate
- /*package*/ static int nativeGetStyle(int native_instance) {
- Typeface_Delegate delegate = sManager.getDelegate(native_instance);
- if (delegate == null) {
- return 0;
- }
-
- return delegate.mStyle;
- }
-
- // ---- Private delegate/helper methods ----
-
- private Typeface_Delegate(String family, int style) {
- mFamily = family;
- mStyle = style;
- }
-
- private Typeface_Delegate(Font font) {
- mFamily = font.getFamily();
- mStyle = Typeface.NORMAL;
-
- mFonts = sFontLoader.getFallbackFonts(mStyle);
-
- // insert the font glyph first.
- mFonts.add(0, font);
- }
-
- private void init() {
- mFonts = sFontLoader.getFont(mFamily, mStyle);
- }
-}
diff --git a/tools/layoutlib/bridge/src/android/graphics/Xfermode_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/Xfermode_Delegate.java
deleted file mode 100644
index 962d69c..0000000
--- a/tools/layoutlib/bridge/src/android/graphics/Xfermode_Delegate.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.graphics;
-
-import com.android.layoutlib.bridge.impl.DelegateManager;
-import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
-
-import java.awt.Composite;
-
-/**
- * Delegate implementing the native methods of android.graphics.Xfermode
- *
- * Through the layoutlib_create tool, the original native methods of Xfermode have been replaced
- * by calls to methods of the same name in this delegate class.
- *
- * This class behaves like the original native implementation, but in Java, keeping previously
- * native data into its own objects and mapping them to int that are sent back and forth between
- * it and the original Xfermode class.
- *
- * This also serve as a base class for all Xfermode delegate classes.
- *
- * @see DelegateManager
- *
- */
-public abstract class Xfermode_Delegate {
-
- // ---- delegate manager ----
- protected static final DelegateManager<Xfermode_Delegate> sManager =
- new DelegateManager<Xfermode_Delegate>(Xfermode_Delegate.class);
-
- // ---- delegate helper data ----
-
- // ---- delegate data ----
-
- // ---- Public Helper methods ----
-
- public static Xfermode_Delegate getDelegate(int native_instance) {
- return sManager.getDelegate(native_instance);
- }
-
- public abstract Composite getComposite(int alpha);
- public abstract boolean isSupported();
- public abstract String getSupportMessage();
-
-
- // ---- native methods ----
-
- @LayoutlibDelegate
- /*package*/ static void finalizer(int native_instance) {
- sManager.removeJavaReferenceFor(native_instance);
- }
-
- // ---- Private delegate/helper methods ----
-
-}
diff --git a/tools/layoutlib/bridge/src/android/os/Build_Delegate.java b/tools/layoutlib/bridge/src/android/os/Build_Delegate.java
deleted file mode 100644
index ff82a5e..0000000
--- a/tools/layoutlib/bridge/src/android/os/Build_Delegate.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright (C) 2011 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.os;
-
-import com.android.layoutlib.bridge.Bridge;
-import com.android.layoutlib.bridge.impl.DelegateManager;
-import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
-
-import java.util.Map;
-
-/**
- * Delegate implementing the native methods of android.os.Build
- *
- * Through the layoutlib_create tool, the original native methods of Build have been replaced
- * by calls to methods of the same name in this delegate class.
- *
- * Because it's a stateless class to start with, there's no need to keep a {@link DelegateManager}
- * around to map int to instance of the delegate.
- *
- */
-public class Build_Delegate {
-
- @LayoutlibDelegate
- /*package*/ static String getString(String property) {
- Map<String, String> properties = Bridge.getPlatformProperties();
- String value = properties.get(property);
- if (value != null) {
- return value;
- }
-
- return Build.UNKNOWN;
- }
-
-}
diff --git a/tools/layoutlib/bridge/src/android/os/HandlerThread_Delegate.java b/tools/layoutlib/bridge/src/android/os/HandlerThread_Delegate.java
deleted file mode 100644
index afbe97c..0000000
--- a/tools/layoutlib/bridge/src/android/os/HandlerThread_Delegate.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright (C) 2011 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.os;
-
-import com.android.layoutlib.bridge.android.BridgeContext;
-import com.android.layoutlib.bridge.impl.RenderAction;
-import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Delegate overriding selected methods of android.os.HandlerThread
- *
- * Through the layoutlib_create tool, selected methods of Handler have been replaced
- * by calls to methods of the same name in this delegate class.
- *
- *
- */
-public class HandlerThread_Delegate {
-
- private static Map<BridgeContext, List<HandlerThread>> sThreads =
- new HashMap<BridgeContext, List<HandlerThread>>();
-
- public static void cleanUp(BridgeContext context) {
- List<HandlerThread> list = sThreads.get(context);
- if (list != null) {
- for (HandlerThread thread : list) {
- thread.quit();
- }
-
- list.clear();
- sThreads.remove(context);
- }
- }
-
- // -------- Delegate methods
-
- @LayoutlibDelegate
- /*package*/ static void run(HandlerThread theThread) {
- // record the thread so that it can be quit() on clean up.
- BridgeContext context = RenderAction.getCurrentContext();
- List<HandlerThread> list = sThreads.get(context);
- if (list == null) {
- list = new ArrayList<HandlerThread>();
- sThreads.put(context, list);
- }
-
- list.add(theThread);
-
- // ---- START DEFAULT IMPLEMENTATION.
-
- theThread.mTid = Process.myTid();
- Looper.prepare();
- synchronized (theThread) {
- theThread.mLooper = Looper.myLooper();
- theThread.notifyAll();
- }
- Process.setThreadPriority(theThread.mPriority);
- theThread.onLooperPrepared();
- Looper.loop();
- theThread.mTid = -1;
- }
-}
diff --git a/tools/layoutlib/bridge/src/android/os/Handler_Delegate.java b/tools/layoutlib/bridge/src/android/os/Handler_Delegate.java
deleted file mode 100644
index 2152c8a..0000000
--- a/tools/layoutlib/bridge/src/android/os/Handler_Delegate.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.os;
-
-import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
-
-
-/**
- * Delegate overriding selected methods of android.os.Handler
- *
- * Through the layoutlib_create tool, selected methods of Handler have been replaced
- * by calls to methods of the same name in this delegate class.
- *
- *
- */
-public class Handler_Delegate {
-
- // -------- Delegate methods
-
- @LayoutlibDelegate
- /*package*/ static boolean sendMessageAtTime(Handler handler, Message msg, long uptimeMillis) {
- // get the callback
- IHandlerCallback callback = sCallbacks.get();
- if (callback != null) {
- callback.sendMessageAtTime(handler, msg, uptimeMillis);
- }
- return true;
- }
-
- // -------- Delegate implementation
-
- public interface IHandlerCallback {
- void sendMessageAtTime(Handler handler, Message msg, long uptimeMillis);
- }
-
- private final static ThreadLocal<IHandlerCallback> sCallbacks =
- new ThreadLocal<IHandlerCallback>();
-
- public static void setCallback(IHandlerCallback callback) {
- sCallbacks.set(callback);
- }
-
-}
diff --git a/tools/layoutlib/bridge/src/android/os/Looper_Accessor.java b/tools/layoutlib/bridge/src/android/os/Looper_Accessor.java
deleted file mode 100644
index 09f3e47..0000000
--- a/tools/layoutlib/bridge/src/android/os/Looper_Accessor.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (C) 2011 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.os;
-
-import java.lang.reflect.Field;
-
-/**
- * Class allowing access to package-protected methods/fields.
- */
-public class Looper_Accessor {
-
- public static void cleanupThread() {
- // clean up the looper
- Looper.sThreadLocal.remove();
- try {
- Field sMainLooper = Looper.class.getDeclaredField("sMainLooper");
- sMainLooper.setAccessible(true);
- sMainLooper.set(null, null);
- } catch (SecurityException e) {
- catchReflectionException();
- } catch (IllegalArgumentException e) {
- catchReflectionException();
- } catch (NoSuchFieldException e) {
- catchReflectionException();
- } catch (IllegalAccessException e) {
- catchReflectionException();
- }
-
- }
-
- private static void catchReflectionException() {
- assert(false);
- }
-}
diff --git a/tools/layoutlib/bridge/src/android/os/ServiceManager.java b/tools/layoutlib/bridge/src/android/os/ServiceManager.java
deleted file mode 100644
index 6a68ee2..0000000
--- a/tools/layoutlib/bridge/src/android/os/ServiceManager.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * 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.os;
-
-import java.util.Map;
-
-public final class ServiceManager {
-
- /**
- * Returns a reference to a service with the given name.
- *
- * @param name the name of the service to get
- * @return a reference to the service, or <code>null</code> if the service doesn't exist
- */
- public static IBinder getService(String name) {
- return null;
- }
-
- /**
- * Place a new @a service called @a name into the service
- * manager.
- *
- * @param name the name of the new service
- * @param service the service object
- */
- public static void addService(String name, IBinder service) {
- // pass
- }
-
- /**
- * Retrieve an existing service called @a name from the
- * service manager. Non-blocking.
- */
- public static IBinder checkService(String name) {
- return null;
- }
-
- /**
- * Return a list of all currently running services.
- */
- public static String[] listServices() throws RemoteException {
- // actual implementation returns null sometimes, so it's ok
- // to return null instead of an empty list.
- return null;
- }
-
- /**
- * This is only intended to be called when the process is first being brought
- * up and bound by the activity manager. There is only one thread in the process
- * at that time, so no locking is done.
- *
- * @param cache the cache of service references
- * @hide
- */
- public static void initServiceCache(Map<String, IBinder> cache) {
- // pass
- }
-}
diff --git a/tools/layoutlib/bridge/src/android/os/SystemClock_Delegate.java b/tools/layoutlib/bridge/src/android/os/SystemClock_Delegate.java
deleted file mode 100644
index fd594f7..0000000
--- a/tools/layoutlib/bridge/src/android/os/SystemClock_Delegate.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.os;
-
-import com.android.layoutlib.bridge.impl.DelegateManager;
-import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
-
-/**
- * Delegate implementing the native methods of android.os.SystemClock
- *
- * Through the layoutlib_create tool, the original native methods of SystemClock have been replaced
- * by calls to methods of the same name in this delegate class.
- *
- * Because it's a stateless class to start with, there's no need to keep a {@link DelegateManager}
- * around to map int to instance of the delegate.
- *
- */
-public class SystemClock_Delegate {
- private static long sBootTime = System.currentTimeMillis();
- private static long sBootTimeNano = System.nanoTime();
-
- @LayoutlibDelegate
- /*package*/ static boolean setCurrentTimeMillis(long millis) {
- return true;
- }
-
- /**
- * Returns milliseconds since boot, not counting time spent in deep sleep.
- * <b>Note:</b> This value may get reset occasionally (before it would
- * otherwise wrap around).
- *
- * @return milliseconds of non-sleep uptime since boot.
- */
- @LayoutlibDelegate
- /*package*/ static long uptimeMillis() {
- return System.currentTimeMillis() - sBootTime;
- }
-
- /**
- * Returns milliseconds since boot, including time spent in sleep.
- *
- * @return elapsed milliseconds since boot.
- */
- @LayoutlibDelegate
- /*package*/ static long elapsedRealtime() {
- return System.currentTimeMillis() - sBootTime;
- }
-
- /**
- * Returns nanoseconds since boot, including time spent in sleep.
- *
- * @return elapsed nanoseconds since boot.
- */
- @LayoutlibDelegate
- /*package*/ static long elapsedRealtimeNanos() {
- return System.nanoTime() - sBootTimeNano;
- }
-
- /**
- * Returns milliseconds running in the current thread.
- *
- * @return elapsed milliseconds in the thread
- */
- @LayoutlibDelegate
- /*package*/ static long currentThreadTimeMillis() {
- return System.currentTimeMillis();
- }
-
- /**
- * Returns microseconds running in the current thread.
- *
- * @return elapsed microseconds in the thread
- *
- * @hide
- */
- @LayoutlibDelegate
- /*package*/ static long currentThreadTimeMicro() {
- return System.currentTimeMillis() * 1000;
- }
-
- /**
- * Returns current wall time in microseconds.
- *
- * @return elapsed microseconds in wall time
- *
- * @hide
- */
- @LayoutlibDelegate
- /*package*/ static long currentTimeMicro() {
- return elapsedRealtime() * 1000;
- }
-}
diff --git a/tools/layoutlib/bridge/src/android/text/AndroidBidi_Delegate.java b/tools/layoutlib/bridge/src/android/text/AndroidBidi_Delegate.java
deleted file mode 100644
index 973fa0e..0000000
--- a/tools/layoutlib/bridge/src/android/text/AndroidBidi_Delegate.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright (C) 2011 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.text;
-
-import com.android.ide.common.rendering.api.LayoutLog;
-import com.android.layoutlib.bridge.Bridge;
-import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
-import com.ibm.icu.text.Bidi;
-
-
-/**
- * Delegate used to provide new implementation for the native methods of {@link AndroidBidi}
- *
- * Through the layoutlib_create tool, the original methods of AndroidBidi have been replaced
- * by calls to methods of the same name in this delegate class.
- *
- */
-public class AndroidBidi_Delegate {
-
- @LayoutlibDelegate
- /*package*/ static int runBidi(int dir, char[] chars, byte[] charInfo, int count,
- boolean haveInfo) {
-
- switch (dir) {
- case 0: // Layout.DIR_REQUEST_LTR
- case 1: // Layout.DIR_REQUEST_RTL
- break; // No change.
- case -1:
- dir = Bidi.LEVEL_DEFAULT_LTR;
- break;
- case -2:
- dir = Bidi.LEVEL_DEFAULT_RTL;
- break;
- default:
- // Invalid code. Log error, assume LEVEL_DEFAULT_LTR and continue.
- Bridge.getLog().error(LayoutLog.TAG_BROKEN, "Invalid direction flag", null);
- dir = Bidi.LEVEL_DEFAULT_LTR;
- }
- Bidi bidi = new Bidi(chars, 0, null, 0, count, dir);
- if (charInfo != null) {
- for (int i = 0; i < count; ++i)
- charInfo[i] = bidi.getLevelAt(i);
- }
- return bidi.getParaLevel();
- }
-}
diff --git a/tools/layoutlib/bridge/src/android/text/format/DateFormat_Delegate.java b/tools/layoutlib/bridge/src/android/text/format/DateFormat_Delegate.java
deleted file mode 100644
index 8cd1a69..0000000
--- a/tools/layoutlib/bridge/src/android/text/format/DateFormat_Delegate.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2013 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.text.format;
-
-import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
-
-import android.content.Context;
-
-
-/**
- * Delegate used to provide new implementation for the native methods of {@link DateFormat}
- *
- * Through the layoutlib_create tool, the original methods of DateFormat have been replaced
- * by calls to methods of the same name in this delegate class.
- *
- */
-public class DateFormat_Delegate {
-
- @LayoutlibDelegate
- /*package*/ static boolean is24HourFormat(Context context) {
- return false;
- }
-}
diff --git a/tools/layoutlib/bridge/src/android/text/format/Time_Delegate.java b/tools/layoutlib/bridge/src/android/text/format/Time_Delegate.java
deleted file mode 100644
index 15cd687..0000000
--- a/tools/layoutlib/bridge/src/android/text/format/Time_Delegate.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Copyright (C) 2013 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.text.format;
-
-import java.util.Calendar;
-import java.util.UnknownFormatConversionException;
-import java.util.regex.Pattern;
-
-import com.android.ide.common.rendering.api.LayoutLog;
-import com.android.layoutlib.bridge.Bridge;
-import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
-
-/**
- * Delegate used to provide new implementation for native methods of {@link Time}
- *
- * Through the layoutlib_create tool, some native methods of Time have been replaced by calls to
- * methods of the same name in this delegate class.
- */
-public class Time_Delegate {
-
- // Regex to match odd number of '%'.
- private static final Pattern p = Pattern.compile("(?<!%)(%%)*%(?!%)");
-
- @LayoutlibDelegate
- /*package*/ static String format1(Time thisTime, String format) {
-
- try {
- // Change the format by adding changing '%' to "%1$t". This is required to tell the
- // formatter which argument to use from the argument list. '%%' is left as is. In the
- // replacement string, $0 refers to matched pattern. \\1 means '1', written this way to
- // separate it from 0. \\$ means '$', written this way to suppress the special meaning
- // of $.
- return String.format(
- p.matcher(format).replaceAll("$0\\1\\$t"),
- timeToCalendar(thisTime, Calendar.getInstance()));
- } catch (UnknownFormatConversionException e) {
- Bridge.getLog().fidelityWarning(LayoutLog.TAG_STRFTIME, "Unrecognized format", e, format);
- return format;
- }
- }
-
- private static Calendar timeToCalendar(Time time, Calendar calendar) {
- calendar.set(time.year, time.month, time.monthDay, time.hour, time.minute, time.second);
- return calendar;
- }
-
-}
diff --git a/tools/layoutlib/bridge/src/android/util/BridgeXmlPullAttributes.java b/tools/layoutlib/bridge/src/android/util/BridgeXmlPullAttributes.java
deleted file mode 100644
index 6ac5b02..0000000
--- a/tools/layoutlib/bridge/src/android/util/BridgeXmlPullAttributes.java
+++ /dev/null
@@ -1,283 +0,0 @@
-/*
- * 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.util;
-
-import com.android.ide.common.rendering.api.RenderResources;
-import com.android.ide.common.rendering.api.ResourceValue;
-import com.android.internal.util.XmlUtils;
-import com.android.layoutlib.bridge.Bridge;
-import com.android.layoutlib.bridge.BridgeConstants;
-import com.android.layoutlib.bridge.android.BridgeContext;
-import com.android.resources.ResourceType;
-
-import org.xmlpull.v1.XmlPullParser;
-
-/**
- * A correct implementation of the {@link AttributeSet} interface on top of a XmlPullParser
- */
-public class BridgeXmlPullAttributes extends XmlPullAttributes {
-
- private final BridgeContext mContext;
- private final boolean mPlatformFile;
-
- public BridgeXmlPullAttributes(XmlPullParser parser, BridgeContext context,
- boolean platformFile) {
- super(parser);
- mContext = context;
- mPlatformFile = platformFile;
- }
-
- /*
- * (non-Javadoc)
- * @see android.util.XmlPullAttributes#getAttributeNameResource(int)
- *
- * This methods must return com.android.internal.R.attr.<name> matching
- * the name of the attribute.
- * It returns 0 if it doesn't find anything.
- */
- @Override
- public int getAttributeNameResource(int index) {
- // get the attribute name.
- String name = getAttributeName(index);
-
- // get the attribute namespace
- String ns = mParser.getAttributeNamespace(index);
-
- if (BridgeConstants.NS_RESOURCES.equals(ns)) {
- Integer v = Bridge.getResourceId(ResourceType.ATTR, name);
- if (v != null) {
- return v.intValue();
- }
-
- return 0;
- }
-
- // this is not an attribute in the android namespace, we query the customviewloader, if
- // the namespaces match.
- if (mContext.getProjectCallback().getNamespace().equals(ns)) {
- Integer v = mContext.getProjectCallback().getResourceId(ResourceType.ATTR, name);
- if (v != null) {
- return v.intValue();
- }
- }
-
- return 0;
- }
-
- @Override
- public int getAttributeListValue(String namespace, String attribute,
- String[] options, int defaultValue) {
- String value = getAttributeValue(namespace, attribute);
- if (value != null) {
- ResourceValue r = getResourceValue(value);
-
- if (r != null) {
- value = r.getValue();
- }
-
- return XmlUtils.convertValueToList(value, options, defaultValue);
- }
-
- return defaultValue;
- }
-
- @Override
- public boolean getAttributeBooleanValue(String namespace, String attribute,
- boolean defaultValue) {
- String value = getAttributeValue(namespace, attribute);
- if (value != null) {
- ResourceValue r = getResourceValue(value);
-
- if (r != null) {
- value = r.getValue();
- }
-
- return XmlUtils.convertValueToBoolean(value, defaultValue);
- }
-
- return defaultValue;
- }
-
- @Override
- public int getAttributeResourceValue(String namespace, String attribute, int defaultValue) {
- String value = getAttributeValue(namespace, attribute);
-
- return resolveResourceValue(value, defaultValue);
- }
-
- @Override
- public int getAttributeIntValue(String namespace, String attribute,
- int defaultValue) {
- String value = getAttributeValue(namespace, attribute);
- if (value != null) {
- ResourceValue r = getResourceValue(value);
-
- if (r != null) {
- value = r.getValue();
- }
-
- return XmlUtils.convertValueToInt(value, defaultValue);
- }
-
- return defaultValue;
- }
-
- @Override
- public int getAttributeUnsignedIntValue(String namespace, String attribute,
- int defaultValue) {
- String value = getAttributeValue(namespace, attribute);
- if (value != null) {
- ResourceValue r = getResourceValue(value);
-
- if (r != null) {
- value = r.getValue();
- }
-
- return XmlUtils.convertValueToUnsignedInt(value, defaultValue);
- }
-
- return defaultValue;
- }
-
- @Override
- public float getAttributeFloatValue(String namespace, String attribute,
- float defaultValue) {
- String s = getAttributeValue(namespace, attribute);
- if (s != null) {
- ResourceValue r = getResourceValue(s);
-
- if (r != null) {
- s = r.getValue();
- }
-
- return Float.parseFloat(s);
- }
-
- return defaultValue;
- }
-
- @Override
- public int getAttributeListValue(int index,
- String[] options, int defaultValue) {
- return XmlUtils.convertValueToList(
- getAttributeValue(index), options, defaultValue);
- }
-
- @Override
- public boolean getAttributeBooleanValue(int index, boolean defaultValue) {
- String value = getAttributeValue(index);
- if (value != null) {
- ResourceValue r = getResourceValue(value);
-
- if (r != null) {
- value = r.getValue();
- }
-
- return XmlUtils.convertValueToBoolean(value, defaultValue);
- }
-
- return defaultValue;
- }
-
- @Override
- public int getAttributeResourceValue(int index, int defaultValue) {
- String value = getAttributeValue(index);
-
- return resolveResourceValue(value, defaultValue);
- }
-
- @Override
- public int getAttributeIntValue(int index, int defaultValue) {
- String value = getAttributeValue(index);
- if (value != null) {
- ResourceValue r = getResourceValue(value);
-
- if (r != null) {
- value = r.getValue();
- }
-
- return XmlUtils.convertValueToInt(value, defaultValue);
- }
-
- return defaultValue;
- }
-
- @Override
- public int getAttributeUnsignedIntValue(int index, int defaultValue) {
- String value = getAttributeValue(index);
- if (value != null) {
- ResourceValue r = getResourceValue(value);
-
- if (r != null) {
- value = r.getValue();
- }
-
- return XmlUtils.convertValueToUnsignedInt(value, defaultValue);
- }
-
- return defaultValue;
- }
-
- @Override
- public float getAttributeFloatValue(int index, float defaultValue) {
- String s = getAttributeValue(index);
- if (s != null) {
- ResourceValue r = getResourceValue(s);
-
- if (r != null) {
- s = r.getValue();
- }
-
- return Float.parseFloat(s);
- }
-
- return defaultValue;
- }
-
- // -- private helper methods
-
- /**
- * Returns a resolved {@link ResourceValue} from a given value.
- */
- private ResourceValue getResourceValue(String value) {
- // now look for this particular value
- RenderResources resources = mContext.getRenderResources();
- return resources.resolveResValue(resources.findResValue(value, mPlatformFile));
- }
-
- /**
- * Resolves and return a value to its associated integer.
- */
- private int resolveResourceValue(String value, int defaultValue) {
- ResourceValue resource = getResourceValue(value);
- if (resource != null) {
- Integer id = null;
- if (mPlatformFile || resource.isFramework()) {
- id = Bridge.getResourceId(resource.getResourceType(), resource.getName());
- } else {
- id = mContext.getProjectCallback().getResourceId(
- resource.getResourceType(), resource.getName());
- }
-
- if (id != null) {
- return id;
- }
- }
-
- return defaultValue;
- }
-}
diff --git a/tools/layoutlib/bridge/src/android/util/FloatMath_Delegate.java b/tools/layoutlib/bridge/src/android/util/FloatMath_Delegate.java
deleted file mode 100644
index 8b4c60b..0000000
--- a/tools/layoutlib/bridge/src/android/util/FloatMath_Delegate.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * 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 android.util;
-
-import com.android.layoutlib.bridge.impl.DelegateManager;
-import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
-
-/**
- * Delegate implementing the native methods of android.util.FloatMath
- *
- * Through the layoutlib_create tool, the original native methods of FloatMath have been replaced
- * by calls to methods of the same name in this delegate class.
- *
- * Because it's a stateless class to start with, there's no need to keep a {@link DelegateManager}
- * around to map int to instance of the delegate.
- *
- */
-/*package*/ final class FloatMath_Delegate {
-
- /** Prevents instantiation. */
- private FloatMath_Delegate() {}
-
- /**
- * Returns the float conversion of the most positive (i.e. closest to
- * positive infinity) integer value which is less than the argument.
- *
- * @param value to be converted
- * @return the floor of value
- */
- @LayoutlibDelegate
- /*package*/ static float floor(float value) {
- return (float)Math.floor(value);
- }
-
- /**
- * Returns the float conversion of the most negative (i.e. closest to
- * negative infinity) integer value which is greater than the argument.
- *
- * @param value to be converted
- * @return the ceiling of value
- */
- @LayoutlibDelegate
- /*package*/ static float ceil(float value) {
- return (float)Math.ceil(value);
- }
-
- /**
- * Returns the closest float approximation of the sine of the argument.
- *
- * @param angle to compute the cosine of, in radians
- * @return the sine of angle
- */
- @LayoutlibDelegate
- /*package*/ static float sin(float angle) {
- return (float)Math.sin(angle);
- }
-
- /**
- * Returns the closest float approximation of the cosine of the argument.
- *
- * @param angle to compute the cosine of, in radians
- * @return the cosine of angle
- */
- @LayoutlibDelegate
- /*package*/ static float cos(float angle) {
- return (float)Math.cos(angle);
- }
-
- /**
- * Returns the closest float approximation of the square root of the
- * argument.
- *
- * @param value to compute sqrt of
- * @return the square root of value
- */
- @LayoutlibDelegate
- /*package*/ static float sqrt(float value) {
- return (float)Math.sqrt(value);
- }
-
- /**
- * Returns the closest float approximation of the raising "e" to the power
- * of the argument.
- *
- * @param value to compute the exponential of
- * @return the exponential of value
- */
- @LayoutlibDelegate
- /*package*/ static float exp(float value) {
- return (float)Math.exp(value);
- }
-
- /**
- * Returns the closest float approximation of the result of raising {@code
- * x} to the power of {@code y}.
- *
- * @param x the base of the operation.
- * @param y the exponent of the operation.
- * @return {@code x} to the power of {@code y}.
- */
- @LayoutlibDelegate
- /*package*/ static float pow(float x, float y) {
- return (float)Math.pow(x, y);
- }
-
- /**
- * Returns {@code sqrt(}<i>{@code x}</i><sup>{@code 2}</sup>{@code +} <i>
- * {@code y}</i><sup>{@code 2}</sup>{@code )}.
- *
- * @param x a float number
- * @param y a float number
- * @return the hypotenuse
- */
- @LayoutlibDelegate
- /*package*/ static float hypot(float x, float y) {
- return (float)Math.sqrt(x*x + y*y);
- }
-}
diff --git a/tools/layoutlib/bridge/src/android/util/Log_Delegate.java b/tools/layoutlib/bridge/src/android/util/Log_Delegate.java
deleted file mode 100644
index 7f432ab..0000000
--- a/tools/layoutlib/bridge/src/android/util/Log_Delegate.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright (C) 2011 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.util;
-
-import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
-
-class Log_Delegate {
- // to replicate prefix visible when using 'adb logcat'
- private static char priorityChar(int priority) {
- switch (priority) {
- case Log.VERBOSE:
- return 'V';
- case Log.DEBUG:
- return 'D';
- case Log.INFO:
- return 'I';
- case Log.WARN:
- return 'W';
- case Log.ERROR:
- return 'E';
- case Log.ASSERT:
- return 'A';
- default:
- return '?';
- }
- }
-
- @LayoutlibDelegate
- static int println_native(int bufID, int priority, String tag, String msgs) {
- String prefix = priorityChar(priority) + "/" + tag + ": ";
- for (String msg: msgs.split("\n")) {
- System.out.println(prefix + msg);
- }
- return 0;
- }
-
-}
diff --git a/tools/layoutlib/bridge/src/android/util/LruCache.java b/tools/layoutlib/bridge/src/android/util/LruCache.java
deleted file mode 100644
index 5208606..0000000
--- a/tools/layoutlib/bridge/src/android/util/LruCache.java
+++ /dev/null
@@ -1,391 +0,0 @@
-/*
- * Copyright (C) 2011 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.util;
-
-import java.util.LinkedHashMap;
-import java.util.Map;
-
-/**
- * BEGIN LAYOUTLIB CHANGE
- * This is a custom version that doesn't use the non standard LinkedHashMap#eldest.
- * END LAYOUTLIB CHANGE
- *
- * A cache that holds strong references to a limited number of values. Each time
- * a value is accessed, it is moved to the head of a queue. When a value is
- * added to a full cache, the value at the end of that queue is evicted and may
- * become eligible for garbage collection.
- *
- * <p>If your cached values hold resources that need to be explicitly released,
- * override {@link #entryRemoved}.
- *
- * <p>If a cache miss should be computed on demand for the corresponding keys,
- * override {@link #create}. This simplifies the calling code, allowing it to
- * assume a value will always be returned, even when there's a cache miss.
- *
- * <p>By default, the cache size is measured in the number of entries. Override
- * {@link #sizeOf} to size the cache in different units. For example, this cache
- * is limited to 4MiB of bitmaps:
- * <pre> {@code
- * int cacheSize = 4 * 1024 * 1024; // 4MiB
- * LruCache<String, Bitmap> bitmapCache = new LruCache<String, Bitmap>(cacheSize) {
- * protected int sizeOf(String key, Bitmap value) {
- * return value.getByteCount();
- * }
- * }}</pre>
- *
- * <p>This class is thread-safe. Perform multiple cache operations atomically by
- * synchronizing on the cache: <pre> {@code
- * synchronized (cache) {
- * if (cache.get(key) == null) {
- * cache.put(key, value);
- * }
- * }}</pre>
- *
- * <p>This class does not allow null to be used as a key or value. A return
- * value of null from {@link #get}, {@link #put} or {@link #remove} is
- * unambiguous: the key was not in the cache.
- *
- * <p>This class appeared in Android 3.1 (Honeycomb MR1); it's available as part
- * of <a href="http://developer.android.com/sdk/compatibility-library.html">Android's
- * Support Package</a> for earlier releases.
- */
-public class LruCache<K, V> {
- private final LinkedHashMap<K, V> map;
-
- /** Size of this cache in units. Not necessarily the number of elements. */
- private int size;
- private int maxSize;
-
- private int putCount;
- private int createCount;
- private int evictionCount;
- private int hitCount;
- private int missCount;
-
- /**
- * @param maxSize for caches that do not override {@link #sizeOf}, this is
- * the maximum number of entries in the cache. For all other caches,
- * this is the maximum sum of the sizes of the entries in this cache.
- */
- public LruCache(int maxSize) {
- if (maxSize <= 0) {
- throw new IllegalArgumentException("maxSize <= 0");
- }
- this.maxSize = maxSize;
- this.map = new LinkedHashMap<K, V>(0, 0.75f, true);
- }
-
- /**
- * Sets the size of the cache.
- * @param maxSize The new maximum size.
- *
- * @hide
- */
- public void resize(int maxSize) {
- if (maxSize <= 0) {
- throw new IllegalArgumentException("maxSize <= 0");
- }
-
- synchronized (this) {
- this.maxSize = maxSize;
- }
- trimToSize(maxSize);
- }
-
- /**
- * Returns the value for {@code key} if it exists in the cache or can be
- * created by {@code #create}. If a value was returned, it is moved to the
- * head of the queue. This returns null if a value is not cached and cannot
- * be created.
- */
- public final V get(K key) {
- if (key == null) {
- throw new NullPointerException("key == null");
- }
-
- V mapValue;
- synchronized (this) {
- mapValue = map.get(key);
- if (mapValue != null) {
- hitCount++;
- return mapValue;
- }
- missCount++;
- }
-
- /*
- * Attempt to create a value. This may take a long time, and the map
- * may be different when create() returns. If a conflicting value was
- * added to the map while create() was working, we leave that value in
- * the map and release the created value.
- */
-
- V createdValue = create(key);
- if (createdValue == null) {
- return null;
- }
-
- synchronized (this) {
- createCount++;
- mapValue = map.put(key, createdValue);
-
- if (mapValue != null) {
- // There was a conflict so undo that last put
- map.put(key, mapValue);
- } else {
- size += safeSizeOf(key, createdValue);
- }
- }
-
- if (mapValue != null) {
- entryRemoved(false, key, createdValue, mapValue);
- return mapValue;
- } else {
- trimToSize(maxSize);
- return createdValue;
- }
- }
-
- /**
- * Caches {@code value} for {@code key}. The value is moved to the head of
- * the queue.
- *
- * @return the previous value mapped by {@code key}.
- */
- public final V put(K key, V value) {
- if (key == null || value == null) {
- throw new NullPointerException("key == null || value == null");
- }
-
- V previous;
- synchronized (this) {
- putCount++;
- size += safeSizeOf(key, value);
- previous = map.put(key, value);
- if (previous != null) {
- size -= safeSizeOf(key, previous);
- }
- }
-
- if (previous != null) {
- entryRemoved(false, key, previous, value);
- }
-
- trimToSize(maxSize);
- return previous;
- }
-
- /**
- * @param maxSize the maximum size of the cache before returning. May be -1
- * to evict even 0-sized elements.
- */
- private void trimToSize(int maxSize) {
- while (true) {
- K key;
- V value;
- synchronized (this) {
- if (size < 0 || (map.isEmpty() && size != 0)) {
- throw new IllegalStateException(getClass().getName()
- + ".sizeOf() is reporting inconsistent results!");
- }
-
- if (size <= maxSize) {
- break;
- }
-
- // BEGIN LAYOUTLIB CHANGE
- // get the last item in the linked list.
- // This is not efficient, the goal here is to minimize the changes
- // compared to the platform version.
- Map.Entry<K, V> toEvict = null;
- for (Map.Entry<K, V> entry : map.entrySet()) {
- toEvict = entry;
- }
- // END LAYOUTLIB CHANGE
-
- if (toEvict == null) {
- break;
- }
-
- key = toEvict.getKey();
- value = toEvict.getValue();
- map.remove(key);
- size -= safeSizeOf(key, value);
- evictionCount++;
- }
-
- entryRemoved(true, key, value, null);
- }
- }
-
- /**
- * Removes the entry for {@code key} if it exists.
- *
- * @return the previous value mapped by {@code key}.
- */
- public final V remove(K key) {
- if (key == null) {
- throw new NullPointerException("key == null");
- }
-
- V previous;
- synchronized (this) {
- previous = map.remove(key);
- if (previous != null) {
- size -= safeSizeOf(key, previous);
- }
- }
-
- if (previous != null) {
- entryRemoved(false, key, previous, null);
- }
-
- return previous;
- }
-
- /**
- * Called for entries that have been evicted or removed. This method is
- * invoked when a value is evicted to make space, removed by a call to
- * {@link #remove}, or replaced by a call to {@link #put}. The default
- * implementation does nothing.
- *
- * <p>The method is called without synchronization: other threads may
- * access the cache while this method is executing.
- *
- * @param evicted true if the entry is being removed to make space, false
- * if the removal was caused by a {@link #put} or {@link #remove}.
- * @param newValue the new value for {@code key}, if it exists. If non-null,
- * this removal was caused by a {@link #put}. Otherwise it was caused by
- * an eviction or a {@link #remove}.
- */
- protected void entryRemoved(boolean evicted, K key, V oldValue, V newValue) {}
-
- /**
- * Called after a cache miss to compute a value for the corresponding key.
- * Returns the computed value or null if no value can be computed. The
- * default implementation returns null.
- *
- * <p>The method is called without synchronization: other threads may
- * access the cache while this method is executing.
- *
- * <p>If a value for {@code key} exists in the cache when this method
- * returns, the created value will be released with {@link #entryRemoved}
- * and discarded. This can occur when multiple threads request the same key
- * at the same time (causing multiple values to be created), or when one
- * thread calls {@link #put} while another is creating a value for the same
- * key.
- */
- protected V create(K key) {
- return null;
- }
-
- private int safeSizeOf(K key, V value) {
- int result = sizeOf(key, value);
- if (result < 0) {
- throw new IllegalStateException("Negative size: " + key + "=" + value);
- }
- return result;
- }
-
- /**
- * Returns the size of the entry for {@code key} and {@code value} in
- * user-defined units. The default implementation returns 1 so that size
- * is the number of entries and max size is the maximum number of entries.
- *
- * <p>An entry's size must not change while it is in the cache.
- */
- protected int sizeOf(K key, V value) {
- return 1;
- }
-
- /**
- * Clear the cache, calling {@link #entryRemoved} on each removed entry.
- */
- public final void evictAll() {
- trimToSize(-1); // -1 will evict 0-sized elements
- }
-
- /**
- * For caches that do not override {@link #sizeOf}, this returns the number
- * of entries in the cache. For all other caches, this returns the sum of
- * the sizes of the entries in this cache.
- */
- public synchronized final int size() {
- return size;
- }
-
- /**
- * For caches that do not override {@link #sizeOf}, this returns the maximum
- * number of entries in the cache. For all other caches, this returns the
- * maximum sum of the sizes of the entries in this cache.
- */
- public synchronized final int maxSize() {
- return maxSize;
- }
-
- /**
- * Returns the number of times {@link #get} returned a value that was
- * already present in the cache.
- */
- public synchronized final int hitCount() {
- return hitCount;
- }
-
- /**
- * Returns the number of times {@link #get} returned null or required a new
- * value to be created.
- */
- public synchronized final int missCount() {
- return missCount;
- }
-
- /**
- * Returns the number of times {@link #create(Object)} returned a value.
- */
- public synchronized final int createCount() {
- return createCount;
- }
-
- /**
- * Returns the number of times {@link #put} was called.
- */
- public synchronized final int putCount() {
- return putCount;
- }
-
- /**
- * Returns the number of values that have been evicted.
- */
- public synchronized final int evictionCount() {
- return evictionCount;
- }
-
- /**
- * Returns a copy of the current contents of the cache, ordered from least
- * recently accessed to most recently accessed.
- */
- public synchronized final Map<K, V> snapshot() {
- return new LinkedHashMap<K, V>(map);
- }
-
- @Override public synchronized final String toString() {
- int accesses = hitCount + missCount;
- int hitPercent = accesses != 0 ? (100 * hitCount / accesses) : 0;
- return String.format("LruCache[maxSize=%d,hits=%d,misses=%d,hitRate=%d%%]",
- maxSize, hitCount, missCount, hitPercent);
- }
-}
diff --git a/tools/layoutlib/bridge/src/android/view/AttachInfo_Accessor.java b/tools/layoutlib/bridge/src/android/view/AttachInfo_Accessor.java
deleted file mode 100644
index 4901f72..0000000
--- a/tools/layoutlib/bridge/src/android/view/AttachInfo_Accessor.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright (C) 2011 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.view;
-
-import com.android.layoutlib.bridge.android.BridgeWindow;
-import com.android.layoutlib.bridge.android.BridgeWindowSession;
-
-import android.content.Context;
-import android.os.Handler;
-import android.view.View.AttachInfo;
-
-/**
- * Class allowing access to package-protected methods/fields.
- */
-public class AttachInfo_Accessor {
-
- public static void setAttachInfo(View view) {
- Context context = view.getContext();
- WindowManager wm = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE);
- Display display = wm.getDefaultDisplay();
- ViewRootImpl root = new ViewRootImpl(context, display);
- AttachInfo info = new AttachInfo(new BridgeWindowSession(), new BridgeWindow(),
- display, root, new Handler(), null);
- info.mHasWindowFocus = true;
- info.mWindowVisibility = View.VISIBLE;
- info.mInTouchMode = false; // this is so that we can display selections.
- info.mHardwareAccelerated = false;
- view.dispatchAttachedToWindow(info, 0);
- }
-
- public static void dispatchOnPreDraw(View view) {
- view.mAttachInfo.mTreeObserver.dispatchOnPreDraw();
- }
-}
diff --git a/tools/layoutlib/bridge/src/android/view/BridgeInflater.java b/tools/layoutlib/bridge/src/android/view/BridgeInflater.java
deleted file mode 100644
index 941f1ce6..0000000
--- a/tools/layoutlib/bridge/src/android/view/BridgeInflater.java
+++ /dev/null
@@ -1,272 +0,0 @@
-/*
- * 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.view;
-
-import com.android.ide.common.rendering.api.IProjectCallback;
-import com.android.ide.common.rendering.api.LayoutLog;
-import com.android.ide.common.rendering.api.MergeCookie;
-import com.android.ide.common.rendering.api.ResourceReference;
-import com.android.ide.common.rendering.api.ResourceValue;
-import com.android.layoutlib.bridge.Bridge;
-import com.android.layoutlib.bridge.android.BridgeContext;
-import com.android.layoutlib.bridge.android.BridgeXmlBlockParser;
-import com.android.layoutlib.bridge.impl.ParserFactory;
-import com.android.resources.ResourceType;
-import com.android.util.Pair;
-
-import org.xmlpull.v1.XmlPullParser;
-
-import android.content.Context;
-import android.util.AttributeSet;
-import android.view.InflateException;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-
-import java.io.File;
-
-/**
- * Custom implementation of {@link LayoutInflater} to handle custom views.
- */
-public final class BridgeInflater extends LayoutInflater {
-
- private final IProjectCallback mProjectCallback;
- private boolean mIsInMerge = false;
- private ResourceReference mResourceReference;
-
- /**
- * List of class prefixes which are tried first by default.
- * <p/>
- * This should match the list in com.android.internal.policy.impl.PhoneLayoutInflater.
- */
- private static final String[] sClassPrefixList = {
- "android.widget.",
- "android.webkit."
- };
-
- protected BridgeInflater(LayoutInflater original, Context newContext) {
- super(original, newContext);
- mProjectCallback = null;
- }
-
- /**
- * Instantiate a new BridgeInflater with an {@link IProjectCallback} object.
- *
- * @param context The Android application context.
- * @param projectCallback the {@link IProjectCallback} object.
- */
- public BridgeInflater(Context context, IProjectCallback projectCallback) {
- super(context);
- mProjectCallback = projectCallback;
- mConstructorArgs[0] = context;
- }
-
- @Override
- public View onCreateView(String name, AttributeSet attrs) throws ClassNotFoundException {
- View view = null;
-
- try {
- // First try to find a class using the default Android prefixes
- for (String prefix : sClassPrefixList) {
- try {
- view = createView(name, prefix, attrs);
- if (view != null) {
- break;
- }
- } catch (ClassNotFoundException e) {
- // Ignore. We'll try again using the base class below.
- }
- }
-
- // Next try using the parent loader. This will most likely only work for
- // fully-qualified class names.
- try {
- if (view == null) {
- view = super.onCreateView(name, attrs);
- }
- } catch (ClassNotFoundException e) {
- // Ignore. We'll try again using the custom view loader below.
- }
-
- // Finally try again using the custom view loader
- try {
- if (view == null) {
- view = loadCustomView(name, attrs);
- }
- } catch (ClassNotFoundException e) {
- // If the class was not found, we throw the exception directly, because this
- // method is already expected to throw it.
- throw e;
- }
- } catch (Exception e) {
- // Wrap the real exception in a ClassNotFoundException, so that the calling method
- // can deal with it.
- ClassNotFoundException exception = new ClassNotFoundException("onCreateView", e);
- throw exception;
- }
-
- setupViewInContext(view, attrs);
-
- return view;
- }
-
- @Override
- public View createViewFromTag(View parent, String name, AttributeSet attrs) {
- View view = null;
- try {
- view = super.createViewFromTag(parent, name, attrs);
- } catch (InflateException e) {
- // try to load the class from using the custom view loader
- try {
- view = loadCustomView(name, attrs);
- } catch (Exception e2) {
- // Wrap the real exception in an InflateException so that the calling
- // method can deal with it.
- InflateException exception = new InflateException();
- if (e2.getClass().equals(ClassNotFoundException.class) == false) {
- exception.initCause(e2);
- } else {
- exception.initCause(e);
- }
- throw exception;
- }
- }
-
- setupViewInContext(view, attrs);
-
- return view;
- }
-
- @Override
- public View inflate(int resource, ViewGroup root) {
- Context context = getContext();
- if (context instanceof BridgeContext) {
- BridgeContext bridgeContext = (BridgeContext)context;
-
- ResourceValue value = null;
-
- Pair<ResourceType, String> layoutInfo = Bridge.resolveResourceId(resource);
- if (layoutInfo != null) {
- value = bridgeContext.getRenderResources().getFrameworkResource(
- ResourceType.LAYOUT, layoutInfo.getSecond());
- } else {
- layoutInfo = mProjectCallback.resolveResourceId(resource);
-
- if (layoutInfo != null) {
- value = bridgeContext.getRenderResources().getProjectResource(
- ResourceType.LAYOUT, layoutInfo.getSecond());
- }
- }
-
- if (value != null) {
- File f = new File(value.getValue());
- if (f.isFile()) {
- try {
- XmlPullParser parser = ParserFactory.create(f);
-
- BridgeXmlBlockParser bridgeParser = new BridgeXmlBlockParser(
- parser, bridgeContext, false);
-
- return inflate(bridgeParser, root);
- } catch (Exception e) {
- Bridge.getLog().error(LayoutLog.TAG_RESOURCES_READ,
- "Failed to parse file " + f.getAbsolutePath(), e, null /*data*/);
-
- return null;
- }
- }
- }
- }
- return null;
- }
-
- private View loadCustomView(String name, AttributeSet attrs) throws ClassNotFoundException,
- Exception{
- if (mProjectCallback != null) {
- // first get the classname in case it's not the node name
- if (name.equals("view")) {
- name = attrs.getAttributeValue(null, "class");
- }
-
- mConstructorArgs[1] = attrs;
-
- Object customView = mProjectCallback.loadView(name, mConstructorSignature,
- mConstructorArgs);
-
- if (customView instanceof View) {
- return (View)customView;
- }
- }
-
- return null;
- }
-
- private void setupViewInContext(View view, AttributeSet attrs) {
- if (getContext() instanceof BridgeContext) {
- BridgeContext bc = (BridgeContext) getContext();
- if (attrs instanceof BridgeXmlBlockParser) {
- BridgeXmlBlockParser parser = (BridgeXmlBlockParser) attrs;
-
- // get the view key
- Object viewKey = parser.getViewCookie();
-
- if (viewKey == null) {
- int currentDepth = parser.getDepth();
-
- // test whether we are in an included file or in a adapter binding view.
- BridgeXmlBlockParser previousParser = bc.getPreviousParser();
- if (previousParser != null) {
- // looks like we inside an embedded layout.
- // only apply the cookie of the calling node (<include>) if we are at the
- // top level of the embedded layout. If there is a merge tag, then
- // skip it and look for the 2nd level
- int testDepth = mIsInMerge ? 2 : 1;
- if (currentDepth == testDepth) {
- viewKey = previousParser.getViewCookie();
- // if we are in a merge, wrap the cookie in a MergeCookie.
- if (viewKey != null && mIsInMerge) {
- viewKey = new MergeCookie(viewKey);
- }
- }
- } else if (mResourceReference != null && currentDepth == 1) {
- // else if there's a resource reference, this means we are in an adapter
- // binding case. Set the resource ref as the view cookie only for the top
- // level view.
- viewKey = mResourceReference;
- }
- }
-
- if (viewKey != null) {
- bc.addViewKey(view, viewKey);
- }
- }
- }
- }
-
- public void setIsInMerge(boolean isInMerge) {
- mIsInMerge = isInMerge;
- }
-
- public void setResourceReference(ResourceReference reference) {
- mResourceReference = reference;
- }
-
- @Override
- public LayoutInflater cloneInContext(Context newContext) {
- return new BridgeInflater(this, newContext);
- }
-}
diff --git a/tools/layoutlib/bridge/src/android/view/Choreographer_Delegate.java b/tools/layoutlib/bridge/src/android/view/Choreographer_Delegate.java
deleted file mode 100644
index f75ee50..0000000
--- a/tools/layoutlib/bridge/src/android/view/Choreographer_Delegate.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (C) 2012 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.view;
-
-import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
-
-/**
- * Delegate used to provide new implementation of a select few methods of {@link Choreographer}
- *
- * Through the layoutlib_create tool, the original methods of Choreographer have been
- * replaced by calls to methods of the same name in this delegate class.
- *
- */
-public class Choreographer_Delegate {
-
- @LayoutlibDelegate
- public static float getRefreshRate() {
- return 60.f;
- }
-}
diff --git a/tools/layoutlib/bridge/src/android/view/Display_Delegate.java b/tools/layoutlib/bridge/src/android/view/Display_Delegate.java
deleted file mode 100644
index 53dc821..0000000
--- a/tools/layoutlib/bridge/src/android/view/Display_Delegate.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright (C) 2011 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.view;
-
-import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
-
-
-/**
- * Delegate used to provide new implementation of a select few methods of {@link Display}
- *
- * Through the layoutlib_create tool, the original methods of Display have been replaced
- * by calls to methods of the same name in this delegate class.
- *
- */
-public class Display_Delegate {
-
- @LayoutlibDelegate
- static void updateDisplayInfoLocked(Display theDisplay) {
- // do nothing
- }
-
-}
diff --git a/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java b/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java
deleted file mode 100644
index fd153af..0000000
--- a/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java
+++ /dev/null
@@ -1,501 +0,0 @@
-/*
- * Copyright (C) 2011 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.view;
-
-import android.graphics.Point;
-import com.android.internal.view.IInputContext;
-import com.android.internal.view.IInputMethodClient;
-
-import android.content.res.CompatibilityInfo;
-import android.content.res.Configuration;
-import android.graphics.Bitmap;
-import android.graphics.Rect;
-import android.os.Bundle;
-import android.os.IBinder;
-import android.os.IRemoteCallback;
-import android.os.RemoteException;
-import android.util.DisplayMetrics;
-import android.view.Display;
-import android.view.Gravity;
-import android.view.IApplicationToken;
-import android.view.IInputFilter;
-import android.view.IOnKeyguardExitResult;
-import android.view.IRotationWatcher;
-import android.view.IWindowManager;
-import android.view.IWindowSession;
-
-import java.util.List;
-
-/**
- * Basic implementation of {@link IWindowManager} so that {@link Display} (and
- * {@link Display_Delegate}) can return a valid instance.
- */
-public class IWindowManagerImpl implements IWindowManager {
-
- private final Configuration mConfig;
- private final DisplayMetrics mMetrics;
- private final int mRotation;
- private final boolean mHasNavigationBar;
-
- public IWindowManagerImpl(Configuration config, DisplayMetrics metrics, int rotation,
- boolean hasNavigationBar) {
- mConfig = config;
- mMetrics = metrics;
- mRotation = rotation;
- mHasNavigationBar = hasNavigationBar;
- }
-
- // custom API.
-
- public DisplayMetrics getMetrics() {
- return mMetrics;
- }
-
- // ---- implementation of IWindowManager that we care about ----
-
- @Override
- public int getRotation() throws RemoteException {
- return mRotation;
- }
-
- @Override
- public boolean hasNavigationBar() {
- return mHasNavigationBar;
- }
-
- // ---- unused implementation of IWindowManager ----
-
- @Override
- public void addAppToken(int arg0, IApplicationToken arg1, int arg2, int arg3, int arg4,
- boolean arg5, boolean arg6, int arg7)
- throws RemoteException {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public void addWindowToken(IBinder arg0, int arg1) throws RemoteException {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public void clearForcedDisplaySize(int displayId) throws RemoteException {
- // TODO Auto-generated method stub
- }
-
- @Override
- public void clearForcedDisplayDensity(int displayId) throws RemoteException {
- // TODO Auto-generated method stub
- }
-
- @Override
- public void setOverscan(int displayId, int left, int top, int right, int bottom)
- throws RemoteException {
- // TODO Auto-generated method stub
- }
-
- @Override
- public void closeSystemDialogs(String arg0) throws RemoteException {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public void startFreezingScreen(int exitAnim, int enterAnim) {
- // TODO Auto-generated method stub
- }
-
- @Override
- public void stopFreezingScreen() {
- // TODO Auto-generated method stub
- }
-
- @Override
- public void disableKeyguard(IBinder arg0, String arg1) throws RemoteException {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public void executeAppTransition() throws RemoteException {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public void exitKeyguardSecurely(IOnKeyguardExitResult arg0) throws RemoteException {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public void freezeRotation(int arg0) throws RemoteException {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public float getAnimationScale(int arg0) throws RemoteException {
- // TODO Auto-generated method stub
- return 0;
- }
-
- @Override
- public float[] getAnimationScales() throws RemoteException {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public int getAppOrientation(IApplicationToken arg0) throws RemoteException {
- // TODO Auto-generated method stub
- return 0;
- }
-
- @Override
- public int getPendingAppTransition() throws RemoteException {
- // TODO Auto-generated method stub
- return 0;
- }
-
- @Override
- public boolean inKeyguardRestrictedInputMode() throws RemoteException {
- // TODO Auto-generated method stub
- return false;
- }
-
- @Override
- public boolean inputMethodClientHasFocus(IInputMethodClient arg0) throws RemoteException {
- // TODO Auto-generated method stub
- return false;
- }
-
- @Override
- public boolean isKeyguardLocked() throws RemoteException {
- // TODO Auto-generated method stub
- return false;
- }
-
- @Override
- public boolean isKeyguardSecure() throws RemoteException {
- // TODO Auto-generated method stub
- return false;
- }
-
- @Override
- public boolean isViewServerRunning() throws RemoteException {
- // TODO Auto-generated method stub
- return false;
- }
-
- @Override
- public IWindowSession openSession(IInputMethodClient arg0, IInputContext arg1)
- throws RemoteException {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public void overridePendingAppTransition(String arg0, int arg1, int arg2,
- IRemoteCallback startedCallback) throws RemoteException {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public void overridePendingAppTransitionScaleUp(int startX, int startY, int startWidth,
- int startHeight) throws RemoteException {
- // TODO Auto-generated method stub
- }
-
- @Override
- public void overridePendingAppTransitionThumb(Bitmap srcThumb, int startX, int startY,
- IRemoteCallback startedCallback, boolean scaleUp) throws RemoteException {
- // TODO Auto-generated method stub
- }
-
- @Override
- public void pauseKeyDispatching(IBinder arg0) throws RemoteException {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public void prepareAppTransition(int arg0, boolean arg1) throws RemoteException {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public void reenableKeyguard(IBinder arg0) throws RemoteException {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public void removeAppToken(IBinder arg0) throws RemoteException {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public void removeWindowToken(IBinder arg0) throws RemoteException {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public void resumeKeyDispatching(IBinder arg0) throws RemoteException {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public Bitmap screenshotApplications(IBinder arg0, int displayId, int arg1,
- int arg2, boolean arg3) throws RemoteException {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public void setAnimationScale(int arg0, float arg1) throws RemoteException {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public void setAnimationScales(float[] arg0) throws RemoteException {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public void setAppGroupId(IBinder arg0, int arg1) throws RemoteException {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public void setAppOrientation(IApplicationToken arg0, int arg1) throws RemoteException {
- // TODO Auto-generated method stub
- }
-
- @Override
- public void setAppStartingWindow(IBinder arg0, String arg1, int arg2, CompatibilityInfo arg3,
- CharSequence arg4, int arg5, int arg6, int arg7, int arg8, IBinder arg9, boolean arg10)
- throws RemoteException {
- // TODO Auto-generated method stub
- }
-
- @Override
- public void setAppVisibility(IBinder arg0, boolean arg1) throws RemoteException {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public void setAppWillBeHidden(IBinder arg0) throws RemoteException {
- // TODO Auto-generated method stub
- }
-
- @Override
- public void setEventDispatching(boolean arg0) throws RemoteException {
- // TODO Auto-generated method stub
- }
-
- @Override
- public void setFocusedApp(IBinder arg0, boolean arg1) throws RemoteException {
- // TODO Auto-generated method stub
- }
-
- @Override
- public void getInitialDisplaySize(int displayId, Point size) {
- // TODO Auto-generated method stub
- }
-
- @Override
- public void getBaseDisplaySize(int displayId, Point size) {
- // TODO Auto-generated method stub
- }
-
- @Override
- public void setForcedDisplaySize(int displayId, int arg0, int arg1) throws RemoteException {
- // TODO Auto-generated method stub
- }
-
- @Override
- public int getInitialDisplayDensity(int displayId) {
- return -1;
- }
-
- @Override
- public int getBaseDisplayDensity(int displayId) {
- return -1;
- }
-
- @Override
- public void setForcedDisplayDensity(int displayId, int density) throws RemoteException {
- // TODO Auto-generated method stub
- }
-
- @Override
- public void setInTouchMode(boolean arg0) throws RemoteException {
- // TODO Auto-generated method stub
- }
-
- @Override
- public void setNewConfiguration(Configuration arg0) throws RemoteException {
- // TODO Auto-generated method stub
- }
-
- @Override
- public void updateRotation(boolean arg0, boolean arg1) throws RemoteException {
- // TODO Auto-generated method stub
- }
-
- @Override
- public void setStrictModeVisualIndicatorPreference(String arg0) throws RemoteException {
- // TODO Auto-generated method stub
- }
-
- @Override
- public void showStrictModeViolation(boolean arg0) throws RemoteException {
- // TODO Auto-generated method stub
- }
-
- @Override
- public void startAppFreezingScreen(IBinder arg0, int arg1) throws RemoteException {
- // TODO Auto-generated method stub
- }
-
- @Override
- public boolean startViewServer(int arg0) throws RemoteException {
- // TODO Auto-generated method stub
- return false;
- }
-
- @Override
- public void statusBarVisibilityChanged(int arg0) throws RemoteException {
- // TODO Auto-generated method stub
- }
-
- @Override
- public void stopAppFreezingScreen(IBinder arg0, boolean arg1) throws RemoteException {
- // TODO Auto-generated method stub
- }
-
- @Override
- public boolean stopViewServer() throws RemoteException {
- // TODO Auto-generated method stub
- return false;
- }
-
- @Override
- public void thawRotation() throws RemoteException {
- // TODO Auto-generated method stub
- }
-
- @Override
- public Configuration updateOrientationFromAppTokens(Configuration arg0, IBinder arg1)
- throws RemoteException {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public int watchRotation(IRotationWatcher arg0) throws RemoteException {
- // TODO Auto-generated method stub
- return 0;
- }
-
- @Override
- public void removeRotationWatcher(IRotationWatcher arg0) throws RemoteException {
- }
-
- @Override
- public boolean waitForWindowDrawn(IBinder token, IRemoteCallback callback) {
- return false;
- }
-
- @Override
- public IBinder asBinder() {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public int getPreferredOptionsPanelGravity() throws RemoteException {
- return Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM;
- }
-
- @Override
- public void dismissKeyguard() {
- }
-
- @Override
- public void lockNow(Bundle options) {
- // TODO Auto-generated method stub
- }
-
- @Override
- public boolean isSafeModeEnabled() {
- return false;
- }
-
- @Override
- public IBinder getFocusedWindowToken() {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public void setInputFilter(IInputFilter filter) throws RemoteException {
- // TODO Auto-generated method stub
- }
-
- @Override
- public void getWindowFrame(IBinder token, Rect outFrame) {
- // TODO Auto-generated method stub
- }
-
- @Override
- public void setMagnificationCallbacks(IMagnificationCallbacks callbacks) {
- // TODO Auto-generated method stub
- }
-
- @Override
- public void setMagnificationSpec(MagnificationSpec spec) {
- // TODO Auto-generated method stub
- }
-
- @Override
- public MagnificationSpec getCompatibleMagnificationSpecForWindow(IBinder windowToken) {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public boolean isRotationFrozen() throws RemoteException {
- // TODO Auto-generated method stub
- return false;
- }
-
- @Override
- public void setTouchExplorationEnabled(boolean enabled) {
- }
-}
diff --git a/tools/layoutlib/bridge/src/android/view/LayoutInflater_Delegate.java b/tools/layoutlib/bridge/src/android/view/LayoutInflater_Delegate.java
deleted file mode 100644
index 3db3a1b..0000000
--- a/tools/layoutlib/bridge/src/android/view/LayoutInflater_Delegate.java
+++ /dev/null
@@ -1,199 +0,0 @@
-/*
- * Copyright (C) 2011 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.view;
-
-import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
-
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-
-import android.content.res.TypedArray;
-import android.content.res.XmlResourceParser;
-import android.util.AttributeSet;
-import android.util.Xml;
-
-import java.io.IOException;
-
-/**
- * Delegate used to provide new implementation of a select few methods of {@link LayoutInflater}
- *
- * Through the layoutlib_create tool, the original methods of LayoutInflater have been replaced
- * by calls to methods of the same name in this delegate class.
- *
- */
-public class LayoutInflater_Delegate {
-
- private static final String TAG_MERGE = "merge";
-
- public static boolean sIsInInclude = false;
-
- /**
- * Recursive method used to descend down the xml hierarchy and instantiate
- * views, instantiate their children, and then call onFinishInflate().
- *
- * This implementation just records the merge status before calling the default implementation.
- */
- @LayoutlibDelegate
- /*package*/ static void rInflate(LayoutInflater thisInflater,
- XmlPullParser parser, View parent, final AttributeSet attrs,
- boolean finishInflate) throws XmlPullParserException, IOException {
-
- if (finishInflate == false) {
- // this is a merge rInflate!
- if (thisInflater instanceof BridgeInflater) {
- ((BridgeInflater) thisInflater).setIsInMerge(true);
- }
- }
-
- // ---- START DEFAULT IMPLEMENTATION.
-
- thisInflater.rInflate_Original(parser, parent, attrs, finishInflate);
-
- // ---- END DEFAULT IMPLEMENTATION.
-
- if (finishInflate == false) {
- // this is a merge rInflate!
- if (thisInflater instanceof BridgeInflater) {
- ((BridgeInflater) thisInflater).setIsInMerge(false);
- }
- }
- }
-
- @LayoutlibDelegate
- public static void parseInclude(
- LayoutInflater thisInflater,
- XmlPullParser parser, View parent, AttributeSet attrs)
- throws XmlPullParserException, IOException {
-
- int type;
-
- if (parent instanceof ViewGroup) {
- final int layout = attrs.getAttributeResourceValue(null, "layout", 0);
- if (layout == 0) {
- final String value = attrs.getAttributeValue(null, "layout");
- if (value == null) {
- throw new InflateException("You must specifiy a layout in the"
- + " include tag: <include layout=\"@layout/layoutID\" />");
- } else {
- throw new InflateException("You must specifiy a valid layout "
- + "reference. The layout ID " + value + " is not valid.");
- }
- } else {
- final XmlResourceParser childParser =
- thisInflater.getContext().getResources().getLayout(layout);
-
- try {
- final AttributeSet childAttrs = Xml.asAttributeSet(childParser);
-
- while ((type = childParser.next()) != XmlPullParser.START_TAG &&
- type != XmlPullParser.END_DOCUMENT) {
- // Empty.
- }
-
- if (type != XmlPullParser.START_TAG) {
- throw new InflateException(childParser.getPositionDescription() +
- ": No start tag found!");
- }
-
- final String childName = childParser.getName();
-
- if (TAG_MERGE.equals(childName)) {
- // Inflate all children.
- thisInflater.rInflate(childParser, parent, childAttrs, false);
- } else {
- final View view = thisInflater.createViewFromTag(parent, childName, childAttrs);
- final ViewGroup group = (ViewGroup) parent;
-
- // We try to load the layout params set in the <include /> tag. If
- // they don't exist, we will rely on the layout params set in the
- // included XML file.
- // During a layoutparams generation, a runtime exception is thrown
- // if either layout_width or layout_height is missing. We catch
- // this exception and set localParams accordingly: true means we
- // successfully loaded layout params from the <include /> tag,
- // false means we need to rely on the included layout params.
- ViewGroup.LayoutParams params = null;
- try {
- // ---- START CHANGES
- sIsInInclude = true;
- // ---- END CHANGES
-
- params = group.generateLayoutParams(attrs);
-
- } catch (RuntimeException e) {
- // ---- START CHANGES
- sIsInInclude = false;
- // ---- END CHANGES
-
- params = group.generateLayoutParams(childAttrs);
- } finally {
- // ---- START CHANGES
- sIsInInclude = false;
- // ---- END CHANGES
-
- if (params != null) {
- view.setLayoutParams(params);
- }
- }
-
- // Inflate all children.
- thisInflater.rInflate(childParser, view, childAttrs, true);
-
- // Attempt to override the included layout's android:id with the
- // one set on the <include /> tag itself.
- TypedArray a = thisInflater.mContext.obtainStyledAttributes(attrs,
- com.android.internal.R.styleable.View, 0, 0);
- int id = a.getResourceId(com.android.internal.R.styleable.View_id, View.NO_ID);
- // While we're at it, let's try to override android:visibility.
- int visibility = a.getInt(com.android.internal.R.styleable.View_visibility, -1);
- a.recycle();
-
- if (id != View.NO_ID) {
- view.setId(id);
- }
-
- switch (visibility) {
- case 0:
- view.setVisibility(View.VISIBLE);
- break;
- case 1:
- view.setVisibility(View.INVISIBLE);
- break;
- case 2:
- view.setVisibility(View.GONE);
- break;
- }
-
- group.addView(view);
- }
- } finally {
- childParser.close();
- }
- }
- } else {
- throw new InflateException("<include /> can only be used inside of a ViewGroup");
- }
-
- final int currentDepth = parser.getDepth();
- while (((type = parser.next()) != XmlPullParser.END_TAG ||
- parser.getDepth() > currentDepth) && type != XmlPullParser.END_DOCUMENT) {
- // Empty
- }
- }
-
-
-}
diff --git a/tools/layoutlib/bridge/src/android/view/SurfaceView.java b/tools/layoutlib/bridge/src/android/view/SurfaceView.java
deleted file mode 100644
index 6aa4b3b..0000000
--- a/tools/layoutlib/bridge/src/android/view/SurfaceView.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Copyright (C) 2006 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.view;
-
-import com.android.layoutlib.bridge.MockView;
-
-import android.content.Context;
-import android.graphics.Canvas;
-import android.graphics.Rect;
-import android.util.AttributeSet;
-
-/**
- * Mock version of the SurfaceView.
- * Only non override public methods from the real SurfaceView have been added in there.
- * Methods that take an unknown class as parameter or as return object, have been removed for now.
- *
- * TODO: generate automatically.
- *
- */
-public class SurfaceView extends MockView {
-
- public SurfaceView(Context context) {
- this(context, null);
- }
-
- public SurfaceView(Context context, AttributeSet attrs) {
- this(context, attrs , 0);
- }
-
- public SurfaceView(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
- }
-
- public SurfaceHolder getHolder() {
- return mSurfaceHolder;
- }
-
- private SurfaceHolder mSurfaceHolder = new SurfaceHolder() {
-
- @Override
- public boolean isCreating() {
- return false;
- }
-
- @Override
- public void addCallback(Callback callback) {
- }
-
- @Override
- public void removeCallback(Callback callback) {
- }
-
- @Override
- public void setFixedSize(int width, int height) {
- }
-
- @Override
- public void setSizeFromLayout() {
- }
-
- @Override
- public void setFormat(int format) {
- }
-
- @Override
- public void setType(int type) {
- }
-
- @Override
- public void setKeepScreenOn(boolean screenOn) {
- }
-
- @Override
- public Canvas lockCanvas() {
- return null;
- }
-
- @Override
- public Canvas lockCanvas(Rect dirty) {
- return null;
- }
-
- @Override
- public void unlockCanvasAndPost(Canvas canvas) {
- }
-
- @Override
- public Surface getSurface() {
- return null;
- }
-
- @Override
- public Rect getSurfaceFrame() {
- return null;
- }
- };
-}
-
diff --git a/tools/layoutlib/bridge/src/android/view/ViewConfiguration_Accessor.java b/tools/layoutlib/bridge/src/android/view/ViewConfiguration_Accessor.java
deleted file mode 100644
index c3533e0..0000000
--- a/tools/layoutlib/bridge/src/android/view/ViewConfiguration_Accessor.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (C) 2011 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.view;
-
-/**
- * Class allowing access to package-protected methods/fields.
- */
-public class ViewConfiguration_Accessor {
-
- public static void clearConfigurations() {
- // clear the stored ViewConfiguration since the map is per density and not per context.
- ViewConfiguration.sConfigurations.clear();
- }
-
-}
diff --git a/tools/layoutlib/bridge/src/android/view/ViewRootImpl_Delegate.java b/tools/layoutlib/bridge/src/android/view/ViewRootImpl_Delegate.java
deleted file mode 100644
index 14b84ef..0000000
--- a/tools/layoutlib/bridge/src/android/view/ViewRootImpl_Delegate.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (C) 2012 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.view;
-
-import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
-
-/**
- * Delegate used to provide new implementation of a select few methods of {@link ViewRootImpl}
- *
- * Through the layoutlib_create tool, the original methods of ViewRootImpl have been replaced
- * by calls to methods of the same name in this delegate class.
- *
- */
-public class ViewRootImpl_Delegate {
-
- @LayoutlibDelegate
- /*package*/ static boolean isInTouchMode() {
- return false; // this allows displaying selection.
- }
-}
diff --git a/tools/layoutlib/bridge/src/android/view/View_Delegate.java b/tools/layoutlib/bridge/src/android/view/View_Delegate.java
deleted file mode 100644
index 8215f7c..0000000
--- a/tools/layoutlib/bridge/src/android/view/View_Delegate.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.view;
-
-import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
-
-/**
- * Delegate used to provide new implementation of a select few methods of {@link View}
- *
- * Through the layoutlib_create tool, the original methods of View have been replaced
- * by calls to methods of the same name in this delegate class.
- *
- */
-public class View_Delegate {
-
- @LayoutlibDelegate
- /*package*/ static boolean isInEditMode(View thisView) {
- return true;
- }
-}
diff --git a/tools/layoutlib/bridge/src/android/view/WindowManagerGlobal_Delegate.java b/tools/layoutlib/bridge/src/android/view/WindowManagerGlobal_Delegate.java
deleted file mode 100644
index 2606e55..0000000
--- a/tools/layoutlib/bridge/src/android/view/WindowManagerGlobal_Delegate.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright (C) 2012 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.view;
-
-import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
-
-/**
- * Delegate used to provide new implementation of a select few methods of
- * {@link WindowManagerGlobal}
- *
- * Through the layoutlib_create tool, the original methods of WindowManagerGlobal have been
- * replaced by calls to methods of the same name in this delegate class.
- *
- */
-public class WindowManagerGlobal_Delegate {
-
- private static IWindowManager sService;
-
- @LayoutlibDelegate
- public static IWindowManager getWindowManagerService() {
- return sService;
- }
-
- // ---- internal implementation stuff ----
-
- public static void setWindowManagerService(IWindowManager service) {
- sService = service;
- }
-}
diff --git a/tools/layoutlib/bridge/src/android/view/accessibility/AccessibilityManager.java b/tools/layoutlib/bridge/src/android/view/accessibility/AccessibilityManager.java
deleted file mode 100644
index 1fd7836..0000000
--- a/tools/layoutlib/bridge/src/android/view/accessibility/AccessibilityManager.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- * 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.view.accessibility;
-
-import android.accessibilityservice.AccessibilityServiceInfo;
-import android.content.Context;
-import android.content.pm.ServiceInfo;
-import android.view.IWindow;
-import android.view.View;
-
-import java.util.Collections;
-import java.util.List;
-
-/**
- * System level service that serves as an event dispatch for {@link AccessibilityEvent}s.
- * Such events are generated when something notable happens in the user interface,
- * for example an {@link android.app.Activity} starts, the focus or selection of a
- * {@link android.view.View} changes etc. Parties interested in handling accessibility
- * events implement and register an accessibility service which extends
- * {@link android.accessibilityservice.AccessibilityService}.
- *
- * @see AccessibilityEvent
- * @see android.accessibilityservice.AccessibilityService
- * @see android.content.Context#getSystemService
- */
-public final class AccessibilityManager {
- private static AccessibilityManager sInstance = new AccessibilityManager();
-
- /**
- * Listener for the accessibility state.
- */
- public interface AccessibilityStateChangeListener {
-
- /**
- * Called back on change in the accessibility state.
- *
- * @param enabled Whether accessibility is enabled.
- */
- public void onAccessibilityStateChanged(boolean enabled);
- }
-
- /**
- * Get an AccessibilityManager instance (create one if necessary).
- *
- * @hide
- */
- public static AccessibilityManager getInstance(Context context) {
- return sInstance;
- }
-
- /**
- * Create an instance.
- *
- * @param context A {@link Context}.
- */
- private AccessibilityManager() {
- }
-
- /**
- * Returns if the {@link AccessibilityManager} is enabled.
- *
- * @return True if this {@link AccessibilityManager} is enabled, false otherwise.
- */
- public boolean isEnabled() {
- return false;
- }
-
- /**
- * Sends an {@link AccessibilityEvent}. If this {@link AccessibilityManager} is not
- * enabled the call is a NOOP.
- *
- * @param event The {@link AccessibilityEvent}.
- *
- * @throws IllegalStateException if a client tries to send an {@link AccessibilityEvent}
- * while accessibility is not enabled.
- */
- public void sendAccessibilityEvent(AccessibilityEvent event) {
- }
-
- /**
- * Requests interruption of the accessibility feedback from all accessibility services.
- */
- public void interrupt() {
- }
-
- /**
- * Returns the {@link ServiceInfo}s of the installed accessibility services.
- *
- * @return An unmodifiable list with {@link ServiceInfo}s.
- */
- public List<ServiceInfo> getAccessibilityServiceList() {
- // normal implementation does this in some case, so let's do the same
- // (unmodifiableList wrapped around null).
- List<ServiceInfo> services = null;
- return Collections.unmodifiableList(services);
- }
-
- public List<AccessibilityServiceInfo> getInstalledAccessibilityServiceList() {
- // normal implementation does this in some case, so let's do the same
- // (unmodifiableList wrapped around null).
- List<AccessibilityServiceInfo> services = null;
- return Collections.unmodifiableList(services);
- }
-
- public boolean addAccessibilityStateChangeListener(
- AccessibilityStateChangeListener listener) {
- return true;
- }
-
- public boolean removeAccessibilityStateChangeListener(
- AccessibilityStateChangeListener listener) {
- return true;
- }
-
- public int addAccessibilityInteractionConnection(IWindow windowToken,
- IAccessibilityInteractionConnection connection) {
- return View.NO_ID;
- }
-
- public void removeAccessibilityInteractionConnection(IWindow windowToken) {
- }
-
-}
diff --git a/tools/layoutlib/bridge/src/android/view/inputmethod/InputMethodManager_Accessor.java b/tools/layoutlib/bridge/src/android/view/inputmethod/InputMethodManager_Accessor.java
deleted file mode 100644
index dc4f9c8..0000000
--- a/tools/layoutlib/bridge/src/android/view/inputmethod/InputMethodManager_Accessor.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (C) 2011 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.view.inputmethod;
-
-/**
- * Class allowing access to package-protected methods/fields.
- */
-public class InputMethodManager_Accessor {
-
- public static void resetInstance() {
- InputMethodManager.sInstance = null;
- }
-}
diff --git a/tools/layoutlib/bridge/src/android/view/inputmethod/InputMethodManager_Delegate.java b/tools/layoutlib/bridge/src/android/view/inputmethod/InputMethodManager_Delegate.java
deleted file mode 100644
index 7c98847..0000000
--- a/tools/layoutlib/bridge/src/android/view/inputmethod/InputMethodManager_Delegate.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (C) 2011 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.view.inputmethod;
-
-import com.android.layoutlib.bridge.android.BridgeIInputMethodManager;
-import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
-
-import android.content.Context;
-import android.os.Looper;
-
-
-/**
- * Delegate used to provide new implementation of a select few methods of {@link InputMethodManager}
- *
- * Through the layoutlib_create tool, the original methods of InputMethodManager have been replaced
- * by calls to methods of the same name in this delegate class.
- *
- */
-public class InputMethodManager_Delegate {
-
- // ---- Overridden methods ----
-
- @LayoutlibDelegate
- /*package*/ static InputMethodManager getInstance() {
- synchronized (InputMethodManager.class) {
- InputMethodManager imm = InputMethodManager.peekInstance();
- if (imm == null) {
- imm = new InputMethodManager(
- new BridgeIInputMethodManager(), Looper.getMainLooper());
- InputMethodManager.sInstance = imm;
- }
- return imm;
- }
- }
-}
diff --git a/tools/layoutlib/bridge/src/android/webkit/WebView.java b/tools/layoutlib/bridge/src/android/webkit/WebView.java
deleted file mode 100644
index 202f204..0000000
--- a/tools/layoutlib/bridge/src/android/webkit/WebView.java
+++ /dev/null
@@ -1,238 +0,0 @@
-/*
- * 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.webkit;
-
-import com.android.layoutlib.bridge.MockView;
-
-import android.content.Context;
-import android.graphics.Bitmap;
-import android.graphics.Picture;
-import android.os.Bundle;
-import android.os.Message;
-import android.util.AttributeSet;
-import android.view.View;
-
-/**
- * Mock version of the WebView.
- * Only non override public methods from the real WebView have been added in there.
- * Methods that take an unknown class as parameter or as return object, have been removed for now.
- *
- * TODO: generate automatically.
- *
- */
-public class WebView extends MockView {
-
- /**
- * Construct a new WebView with a Context object.
- * @param context A Context object used to access application assets.
- */
- public WebView(Context context) {
- this(context, null);
- }
-
- /**
- * Construct a new WebView with layout parameters.
- * @param context A Context object used to access application assets.
- * @param attrs An AttributeSet passed to our parent.
- */
- public WebView(Context context, AttributeSet attrs) {
- this(context, attrs, com.android.internal.R.attr.webViewStyle);
- }
-
- /**
- * Construct a new WebView with layout parameters and a default style.
- * @param context A Context object used to access application assets.
- * @param attrs An AttributeSet passed to our parent.
- * @param defStyle The default style resource ID.
- */
- public WebView(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
- }
-
- // START FAKE PUBLIC METHODS
-
- public void setHorizontalScrollbarOverlay(boolean overlay) {
- }
-
- public void setVerticalScrollbarOverlay(boolean overlay) {
- }
-
- public boolean overlayHorizontalScrollbar() {
- return false;
- }
-
- public boolean overlayVerticalScrollbar() {
- return false;
- }
-
- public void savePassword(String host, String username, String password) {
- }
-
- public void setHttpAuthUsernamePassword(String host, String realm,
- String username, String password) {
- }
-
- public String[] getHttpAuthUsernamePassword(String host, String realm) {
- return null;
- }
-
- public void destroy() {
- }
-
- public static void enablePlatformNotifications() {
- }
-
- public static void disablePlatformNotifications() {
- }
-
- public void loadUrl(String url) {
- }
-
- public void loadData(String data, String mimeType, String encoding) {
- }
-
- public void loadDataWithBaseURL(String baseUrl, String data,
- String mimeType, String encoding, String failUrl) {
- }
-
- public void stopLoading() {
- }
-
- public void reload() {
- }
-
- public boolean canGoBack() {
- return false;
- }
-
- public void goBack() {
- }
-
- public boolean canGoForward() {
- return false;
- }
-
- public void goForward() {
- }
-
- public boolean canGoBackOrForward(int steps) {
- return false;
- }
-
- public void goBackOrForward(int steps) {
- }
-
- public boolean pageUp(boolean top) {
- return false;
- }
-
- public boolean pageDown(boolean bottom) {
- return false;
- }
-
- public void clearView() {
- }
-
- public Picture capturePicture() {
- return null;
- }
-
- public float getScale() {
- return 0;
- }
-
- public void setInitialScale(int scaleInPercent) {
- }
-
- public void invokeZoomPicker() {
- }
-
- public void requestFocusNodeHref(Message hrefMsg) {
- }
-
- public void requestImageRef(Message msg) {
- }
-
- public String getUrl() {
- return null;
- }
-
- public String getTitle() {
- return null;
- }
-
- public Bitmap getFavicon() {
- return null;
- }
-
- public int getProgress() {
- return 0;
- }
-
- public int getContentHeight() {
- return 0;
- }
-
- public void pauseTimers() {
- }
-
- public void resumeTimers() {
- }
-
- public void clearCache() {
- }
-
- public void clearFormData() {
- }
-
- public void clearHistory() {
- }
-
- public void clearSslPreferences() {
- }
-
- public static String findAddress(String addr) {
- return null;
- }
-
- public void documentHasImages(Message response) {
- }
-
- public void setWebViewClient(WebViewClient client) {
- }
-
- public void setDownloadListener(DownloadListener listener) {
- }
-
- public void setWebChromeClient(WebChromeClient client) {
- }
-
- public void addJavascriptInterface(Object obj, String interfaceName) {
- }
-
- public View getZoomControls() {
- return null;
- }
-
- public boolean zoomIn() {
- return false;
- }
-
- public boolean zoomOut() {
- return false;
- }
-}
diff --git a/tools/layoutlib/bridge/src/com/android/internal/policy/PolicyManager.java b/tools/layoutlib/bridge/src/com/android/internal/policy/PolicyManager.java
deleted file mode 100644
index 0100dc5..0000000
--- a/tools/layoutlib/bridge/src/com/android/internal/policy/PolicyManager.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Copyright (C) 2012 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.internal.policy;
-
-import com.android.ide.common.rendering.api.LayoutLog;
-import com.android.layoutlib.bridge.Bridge;
-import com.android.layoutlib.bridge.impl.RenderAction;
-
-import android.content.Context;
-import android.view.BridgeInflater;
-import android.view.FallbackEventHandler;
-import android.view.KeyEvent;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.Window;
-import android.view.WindowManagerPolicy;
-
-/**
- * Custom implementation of PolicyManager that does nothing to run in LayoutLib.
- *
- */
-public class PolicyManager {
-
- public static Window makeNewWindow(Context context) {
- // this will likely crash somewhere beyond so we log it.
- Bridge.getLog().error(LayoutLog.TAG_UNSUPPORTED,
- "Call to PolicyManager.makeNewWindow is not supported", null);
- return null;
- }
-
- public static LayoutInflater makeNewLayoutInflater(Context context) {
- return new BridgeInflater(context, RenderAction.getCurrentContext().getProjectCallback());
- }
-
- public static WindowManagerPolicy makeNewWindowManager() {
- // this will likely crash somewhere beyond so we log it.
- Bridge.getLog().error(LayoutLog.TAG_UNSUPPORTED,
- "Call to PolicyManager.makeNewWindowManager is not supported", null);
- return null;
- }
-
- public static FallbackEventHandler makeNewFallbackEventHandler(Context context) {
- return new FallbackEventHandler() {
- @Override
- public void setView(View v) {
- }
-
- @Override
- public void preDispatchKeyEvent(KeyEvent event) {
- }
-
- @Override
- public boolean dispatchKeyEvent(KeyEvent event) {
- return false;
- }
- };
- }
-}
diff --git a/tools/layoutlib/bridge/src/com/android/internal/textservice/ITextServicesManager_Stub_Delegate.java b/tools/layoutlib/bridge/src/com/android/internal/textservice/ITextServicesManager_Stub_Delegate.java
deleted file mode 100644
index 3017292..0000000
--- a/tools/layoutlib/bridge/src/com/android/internal/textservice/ITextServicesManager_Stub_Delegate.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Copyright (C) 2011 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.internal.textservice;
-
-import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
-
-import android.os.Bundle;
-import android.os.IBinder;
-import android.os.RemoteException;
-import android.view.textservice.SpellCheckerInfo;
-import android.view.textservice.SpellCheckerSubtype;
-
-
-/**
- * Delegate used to provide new implementation of a select few methods of
- * {@link ITextServicesManager$Stub}
- *
- * Through the layoutlib_create tool, the original methods of Stub have been replaced
- * by calls to methods of the same name in this delegate class.
- *
- */
-public class ITextServicesManager_Stub_Delegate {
-
- @LayoutlibDelegate
- public static ITextServicesManager asInterface(IBinder obj) {
- // ignore the obj and return a fake interface implementation
- return new FakeTextServicesManager();
- }
-
- private static class FakeTextServicesManager implements ITextServicesManager {
-
- @Override
- public void finishSpellCheckerService(ISpellCheckerSessionListener arg0)
- throws RemoteException {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public SpellCheckerInfo getCurrentSpellChecker(String arg0) throws RemoteException {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public SpellCheckerSubtype getCurrentSpellCheckerSubtype(String arg0, boolean arg1)
- throws RemoteException {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public SpellCheckerInfo[] getEnabledSpellCheckers() throws RemoteException {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public void getSpellCheckerService(String arg0, String arg1,
- ITextServicesSessionListener arg2, ISpellCheckerSessionListener arg3, Bundle arg4)
- throws RemoteException {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public boolean isSpellCheckerEnabled() throws RemoteException {
- // TODO Auto-generated method stub
- return false;
- }
-
- @Override
- public void setCurrentSpellChecker(String arg0, String arg1) throws RemoteException {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public void setCurrentSpellCheckerSubtype(String arg0, int arg1) throws RemoteException {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public void setSpellCheckerEnabled(boolean arg0) throws RemoteException {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public IBinder asBinder() {
- // TODO Auto-generated method stub
- return null;
- }
-
- }
- }
diff --git a/tools/layoutlib/bridge/src/com/android/internal/util/XmlUtils_Delegate.java b/tools/layoutlib/bridge/src/com/android/internal/util/XmlUtils_Delegate.java
deleted file mode 100644
index bf998b8..0000000
--- a/tools/layoutlib/bridge/src/com/android/internal/util/XmlUtils_Delegate.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright (C) 2011 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.internal.util;
-
-import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
-
-
-/**
- * Delegate used to provide new implementation of a select few methods of {@link XmlUtils}
- *
- * Through the layoutlib_create tool, the original methods of XmlUtils have been replaced
- * by calls to methods of the same name in this delegate class.
- *
- */
-public class XmlUtils_Delegate {
-
- @LayoutlibDelegate
- /*package*/ static final int convertValueToInt(CharSequence charSeq, int defaultValue) {
- if (null == charSeq)
- return defaultValue;
-
- String nm = charSeq.toString();
-
- // This code is copied from the original implementation. The issue is that
- // The Dalvik libraries are able to handle Integer.parse("XXXXXXXX", 16) where XXXXXXX
- // is > 80000000 but the Java VM cannot.
-
- int sign = 1;
- int index = 0;
- int len = nm.length();
- int base = 10;
-
- if ('-' == nm.charAt(0)) {
- sign = -1;
- index++;
- }
-
- if ('0' == nm.charAt(index)) {
- // Quick check for a zero by itself
- if (index == (len - 1))
- return 0;
-
- char c = nm.charAt(index + 1);
-
- if ('x' == c || 'X' == c) {
- index += 2;
- base = 16;
- } else {
- index++;
- base = 8;
- }
- }
- else if ('#' == nm.charAt(index)) {
- index++;
- base = 16;
- }
-
- return ((int)Long.parseLong(nm.substring(index), base)) * sign;
- }
-}
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/Bridge.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/Bridge.java
deleted file mode 100644
index ab4be71..0000000
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/Bridge.java
+++ /dev/null
@@ -1,639 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.layoutlib.bridge;
-
-import static com.android.ide.common.rendering.api.Result.Status.ERROR_UNKNOWN;
-import static com.android.ide.common.rendering.api.Result.Status.SUCCESS;
-
-import com.android.ide.common.rendering.api.Capability;
-import com.android.ide.common.rendering.api.DrawableParams;
-import com.android.ide.common.rendering.api.LayoutLog;
-import com.android.ide.common.rendering.api.RenderSession;
-import com.android.ide.common.rendering.api.Result;
-import com.android.ide.common.rendering.api.Result.Status;
-import com.android.ide.common.rendering.api.SessionParams;
-import com.android.layoutlib.bridge.impl.FontLoader;
-import com.android.layoutlib.bridge.impl.RenderDrawable;
-import com.android.layoutlib.bridge.impl.RenderSessionImpl;
-import com.android.layoutlib.bridge.util.DynamicIdMap;
-import com.android.ninepatch.NinePatchChunk;
-import com.android.resources.ResourceType;
-import com.android.tools.layoutlib.create.MethodAdapter;
-import com.android.tools.layoutlib.create.OverrideMethod;
-import com.android.util.Pair;
-import com.ibm.icu.util.ULocale;
-
-import android.content.res.BridgeAssetManager;
-import android.graphics.Bitmap;
-import android.graphics.Typeface_Accessor;
-import android.graphics.Typeface_Delegate;
-import android.os.Looper;
-import android.os.Looper_Accessor;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.ViewParent;
-
-import java.io.File;
-import java.lang.ref.SoftReference;
-import java.lang.reflect.Field;
-import java.lang.reflect.Modifier;
-import java.util.Arrays;
-import java.util.EnumMap;
-import java.util.EnumSet;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.concurrent.locks.ReentrantLock;
-
-/**
- * Main entry point of the LayoutLib Bridge.
- * <p/>To use this bridge, simply instantiate an object of type {@link Bridge} and call
- * {@link #createScene(SceneParams)}
- */
-public final class Bridge extends com.android.ide.common.rendering.api.Bridge {
-
- private static final String ICU_LOCALE_DIRECTION_RTL = "right-to-left";
-
- public static class StaticMethodNotImplementedException extends RuntimeException {
- private static final long serialVersionUID = 1L;
-
- public StaticMethodNotImplementedException(String msg) {
- super(msg);
- }
- }
-
- /**
- * Lock to ensure only one rendering/inflating happens at a time.
- * This is due to some singleton in the Android framework.
- */
- private final static ReentrantLock sLock = new ReentrantLock();
-
- /**
- * Maps from id to resource type/name. This is for com.android.internal.R
- */
- private final static Map<Integer, Pair<ResourceType, String>> sRMap =
- new HashMap<Integer, Pair<ResourceType, String>>();
-
- /**
- * Same as sRMap except for int[] instead of int resources. This is for android.R only.
- */
- private final static Map<IntArray, String> sRArrayMap = new HashMap<IntArray, String>();
- /**
- * Reverse map compared to sRMap, resource type -> (resource name -> id).
- * This is for com.android.internal.R.
- */
- private final static Map<ResourceType, Map<String, Integer>> sRevRMap =
- new EnumMap<ResourceType, Map<String,Integer>>(ResourceType.class);
-
- // framework resources are defined as 0x01XX#### where XX is the resource type (layout,
- // drawable, etc...). Using FF as the type allows for 255 resource types before we get a
- // collision which should be fine.
- private final static int DYNAMIC_ID_SEED_START = 0x01ff0000;
- private final static DynamicIdMap sDynamicIds = new DynamicIdMap(DYNAMIC_ID_SEED_START);
-
- private final static Map<Object, Map<String, SoftReference<Bitmap>>> sProjectBitmapCache =
- new HashMap<Object, Map<String, SoftReference<Bitmap>>>();
- private final static Map<Object, Map<String, SoftReference<NinePatchChunk>>> sProject9PatchCache =
- new HashMap<Object, Map<String, SoftReference<NinePatchChunk>>>();
-
- private final static Map<String, SoftReference<Bitmap>> sFrameworkBitmapCache =
- new HashMap<String, SoftReference<Bitmap>>();
- private final static Map<String, SoftReference<NinePatchChunk>> sFramework9PatchCache =
- new HashMap<String, SoftReference<NinePatchChunk>>();
-
- private static Map<String, Map<String, Integer>> sEnumValueMap;
- private static Map<String, String> sPlatformProperties;
-
- /**
- * int[] wrapper to use as keys in maps.
- */
- private final static class IntArray {
- private int[] mArray;
-
- private IntArray() {
- // do nothing
- }
-
- private IntArray(int[] a) {
- mArray = a;
- }
-
- private void set(int[] a) {
- mArray = a;
- }
-
- @Override
- public int hashCode() {
- return Arrays.hashCode(mArray);
- }
-
- @Override
- public boolean equals(Object obj) {
- if (this == obj) return true;
- if (obj == null) return false;
- if (getClass() != obj.getClass()) return false;
-
- IntArray other = (IntArray) obj;
- if (!Arrays.equals(mArray, other.mArray)) return false;
- return true;
- }
- }
-
- /** Instance of IntArrayWrapper to be reused in {@link #resolveResourceId(int[])}. */
- private final static IntArray sIntArrayWrapper = new IntArray();
-
- /**
- * A default log than prints to stdout/stderr.
- */
- private final static LayoutLog sDefaultLog = new LayoutLog() {
- @Override
- public void error(String tag, String message, Object data) {
- System.err.println(message);
- }
-
- @Override
- public void error(String tag, String message, Throwable throwable, Object data) {
- System.err.println(message);
- }
-
- @Override
- public void warning(String tag, String message, Object data) {
- System.out.println(message);
- }
- };
-
- /**
- * Current log.
- */
- private static LayoutLog sCurrentLog = sDefaultLog;
-
- private EnumSet<Capability> mCapabilities;
-
- @Override
- public int getApiLevel() {
- return com.android.ide.common.rendering.api.Bridge.API_CURRENT;
- }
-
- @Override
- public EnumSet<Capability> getCapabilities() {
- return mCapabilities;
- }
-
- @Override
- public boolean init(Map<String,String> platformProperties,
- File fontLocation,
- Map<String, Map<String, Integer>> enumValueMap,
- LayoutLog log) {
- sPlatformProperties = platformProperties;
- sEnumValueMap = enumValueMap;
-
- // don't use EnumSet.allOf(), because the bridge doesn't come with its specific version
- // of layoutlib_api. It is provided by the client which could have a more recent version
- // with newer, unsupported capabilities.
- mCapabilities = EnumSet.of(
- Capability.UNBOUND_RENDERING,
- Capability.CUSTOM_BACKGROUND_COLOR,
- Capability.RENDER,
- Capability.LAYOUT_ONLY,
- Capability.EMBEDDED_LAYOUT,
- Capability.VIEW_MANIPULATION,
- Capability.PLAY_ANIMATION,
- Capability.ANIMATED_VIEW_MANIPULATION,
- Capability.ADAPTER_BINDING,
- Capability.EXTENDED_VIEWINFO,
- Capability.FIXED_SCALABLE_NINE_PATCH,
- Capability.RTL);
-
-
- BridgeAssetManager.initSystem();
-
- // When DEBUG_LAYOUT is set and is not 0 or false, setup a default listener
- // on static (native) methods which prints the signature on the console and
- // throws an exception.
- // This is useful when testing the rendering in ADT to identify static native
- // methods that are ignored -- layoutlib_create makes them returns 0/false/null
- // which is generally OK yet might be a problem, so this is how you'd find out.
- //
- // Currently layoutlib_create only overrides static native method.
- // Static non-natives are not overridden and thus do not get here.
- final String debug = System.getenv("DEBUG_LAYOUT");
- if (debug != null && !debug.equals("0") && !debug.equals("false")) {
-
- OverrideMethod.setDefaultListener(new MethodAdapter() {
- @Override
- public void onInvokeV(String signature, boolean isNative, Object caller) {
- sDefaultLog.error(null, "Missing Stub: " + signature +
- (isNative ? " (native)" : ""), null /*data*/);
-
- if (debug.equalsIgnoreCase("throw")) {
- // Throwing this exception doesn't seem that useful. It breaks
- // the layout editor yet doesn't display anything meaningful to the
- // user. Having the error in the console is just as useful. We'll
- // throw it only if the environment variable is "throw" or "THROW".
- throw new StaticMethodNotImplementedException(signature);
- }
- }
- });
- }
-
- // load the fonts.
- FontLoader fontLoader = FontLoader.create(fontLocation.getAbsolutePath());
- if (fontLoader != null) {
- Typeface_Delegate.init(fontLoader);
- } else {
- log.error(LayoutLog.TAG_BROKEN,
- "Failed create FontLoader in layout lib.", null);
- return false;
- }
-
- // now parse com.android.internal.R (and only this one as android.R is a subset of
- // the internal version), and put the content in the maps.
- try {
- Class<?> r = com.android.internal.R.class;
-
- for (Class<?> inner : r.getDeclaredClasses()) {
- String resTypeName = inner.getSimpleName();
- ResourceType resType = ResourceType.getEnum(resTypeName);
- if (resType != null) {
- Map<String, Integer> fullMap = new HashMap<String, Integer>();
- sRevRMap.put(resType, fullMap);
-
- for (Field f : inner.getDeclaredFields()) {
- // only process static final fields. Since the final attribute may have
- // been altered by layoutlib_create, we only check static
- int modifiers = f.getModifiers();
- if (Modifier.isStatic(modifiers)) {
- Class<?> type = f.getType();
- if (type.isArray() && type.getComponentType() == int.class) {
- // if the object is an int[] we put it in sRArrayMap using an IntArray
- // wrapper that properly implements equals and hashcode for the array
- // objects, as required by the map contract.
- sRArrayMap.put(new IntArray((int[]) f.get(null)), f.getName());
- } else if (type == int.class) {
- Integer value = (Integer) f.get(null);
- sRMap.put(value, Pair.of(resType, f.getName()));
- fullMap.put(f.getName(), value);
- } else {
- assert false;
- }
- }
- }
- }
- }
- } catch (Throwable throwable) {
- if (log != null) {
- log.error(LayoutLog.TAG_BROKEN,
- "Failed to load com.android.internal.R from the layout library jar",
- throwable);
- }
- return false;
- }
-
- return true;
- }
-
- @Override
- public boolean dispose() {
- BridgeAssetManager.clearSystem();
-
- // dispose of the default typeface.
- Typeface_Accessor.resetDefaults();
-
- return true;
- }
-
- /**
- * Starts a layout session by inflating and rendering it. The method returns a
- * {@link RenderSession} on which further actions can be taken.
- *
- * @param params the {@link SessionParams} object with all the information necessary to create
- * the scene.
- * @return a new {@link RenderSession} object that contains the result of the layout.
- * @since 5
- */
- @Override
- public RenderSession createSession(SessionParams params) {
- try {
- Result lastResult = SUCCESS.createResult();
- RenderSessionImpl scene = new RenderSessionImpl(params);
- try {
- prepareThread();
- lastResult = scene.init(params.getTimeout());
- if (lastResult.isSuccess()) {
- lastResult = scene.inflate();
- if (lastResult.isSuccess()) {
- lastResult = scene.render(true /*freshRender*/);
- }
- }
- } finally {
- scene.release();
- cleanupThread();
- }
-
- return new BridgeRenderSession(scene, lastResult);
- } catch (Throwable t) {
- // get the real cause of the exception.
- Throwable t2 = t;
- while (t2.getCause() != null) {
- t2 = t.getCause();
- }
- return new BridgeRenderSession(null,
- ERROR_UNKNOWN.createResult(t2.getMessage(), t));
- }
- }
-
- @Override
- public Result renderDrawable(DrawableParams params) {
- try {
- Result lastResult = SUCCESS.createResult();
- RenderDrawable action = new RenderDrawable(params);
- try {
- prepareThread();
- lastResult = action.init(params.getTimeout());
- if (lastResult.isSuccess()) {
- lastResult = action.render();
- }
- } finally {
- action.release();
- cleanupThread();
- }
-
- return lastResult;
- } catch (Throwable t) {
- // get the real cause of the exception.
- Throwable t2 = t;
- while (t2.getCause() != null) {
- t2 = t.getCause();
- }
- return ERROR_UNKNOWN.createResult(t2.getMessage(), t);
- }
- }
-
- @Override
- public void clearCaches(Object projectKey) {
- if (projectKey != null) {
- sProjectBitmapCache.remove(projectKey);
- sProject9PatchCache.remove(projectKey);
- }
- }
-
- @Override
- public Result getViewParent(Object viewObject) {
- if (viewObject instanceof View) {
- return Status.SUCCESS.createResult(((View)viewObject).getParent());
- }
-
- throw new IllegalArgumentException("viewObject is not a View");
- }
-
- @Override
- public Result getViewIndex(Object viewObject) {
- if (viewObject instanceof View) {
- View view = (View) viewObject;
- ViewParent parentView = view.getParent();
-
- if (parentView instanceof ViewGroup) {
- Status.SUCCESS.createResult(((ViewGroup) parentView).indexOfChild(view));
- }
-
- return Status.SUCCESS.createResult();
- }
-
- throw new IllegalArgumentException("viewObject is not a View");
- }
-
- @Override
- public boolean isRtl(String locale) {
- return isLocaleRtl(locale);
- }
-
- public static boolean isLocaleRtl(String locale) {
- if (locale == null) {
- locale = "";
- }
- ULocale uLocale = new ULocale(locale);
- return uLocale.getCharacterOrientation().equals(ICU_LOCALE_DIRECTION_RTL) ?
- true : false;
- }
-
- /**
- * Returns the lock for the bridge
- */
- public static ReentrantLock getLock() {
- return sLock;
- }
-
- /**
- * Prepares the current thread for rendering.
- *
- * Note that while this can be called several time, the first call to {@link #cleanupThread()}
- * will do the clean-up, and make the thread unable to do further scene actions.
- */
- public static void prepareThread() {
- // we need to make sure the Looper has been initialized for this thread.
- // this is required for View that creates Handler objects.
- if (Looper.myLooper() == null) {
- Looper.prepareMainLooper();
- }
- }
-
- /**
- * Cleans up thread-specific data. After this, the thread cannot be used for scene actions.
- * <p>
- * Note that it doesn't matter how many times {@link #prepareThread()} was called, a single
- * call to this will prevent the thread from doing further scene actions
- */
- public static void cleanupThread() {
- // clean up the looper
- Looper_Accessor.cleanupThread();
- }
-
- public static LayoutLog getLog() {
- return sCurrentLog;
- }
-
- public static void setLog(LayoutLog log) {
- // check only the thread currently owning the lock can do this.
- if (sLock.isHeldByCurrentThread() == false) {
- throw new IllegalStateException("scene must be acquired first. see #acquire(long)");
- }
-
- if (log != null) {
- sCurrentLog = log;
- } else {
- sCurrentLog = sDefaultLog;
- }
- }
-
- /**
- * Returns details of a framework resource from its integer value.
- * @param value the integer value
- * @return a Pair containing the resource type and name, or null if the id
- * does not match any resource.
- */
- public static Pair<ResourceType, String> resolveResourceId(int value) {
- Pair<ResourceType, String> pair = sRMap.get(value);
- if (pair == null) {
- pair = sDynamicIds.resolveId(value);
- if (pair == null) {
- //System.out.println(String.format("Missing id: %1$08X (%1$d)", value));
- }
- }
- return pair;
- }
-
- /**
- * Returns the name of a framework resource whose value is an int array.
- * @param array
- */
- public static String resolveResourceId(int[] array) {
- sIntArrayWrapper.set(array);
- return sRArrayMap.get(sIntArrayWrapper);
- }
-
- /**
- * Returns the integer id of a framework resource, from a given resource type and resource name.
- * @param type the type of the resource
- * @param name the name of the resource.
- * @return an {@link Integer} containing the resource id, or null if no resource were found.
- */
- public static Integer getResourceId(ResourceType type, String name) {
- Map<String, Integer> map = sRevRMap.get(type);
- Integer value = null;
- if (map != null) {
- value = map.get(name);
- }
-
- if (value == null) {
- value = sDynamicIds.getId(type, name);
- }
-
- return value;
- }
-
- /**
- * Returns the list of possible enums for a given attribute name.
- */
- public static Map<String, Integer> getEnumValues(String attributeName) {
- if (sEnumValueMap != null) {
- return sEnumValueMap.get(attributeName);
- }
-
- return null;
- }
-
- /**
- * Returns the platform build properties.
- */
- public static Map<String, String> getPlatformProperties() {
- return sPlatformProperties;
- }
-
- /**
- * Returns the bitmap for a specific path, from a specific project cache, or from the
- * framework cache.
- * @param value the path of the bitmap
- * @param projectKey the key of the project, or null to query the framework cache.
- * @return the cached Bitmap or null if not found.
- */
- public static Bitmap getCachedBitmap(String value, Object projectKey) {
- if (projectKey != null) {
- Map<String, SoftReference<Bitmap>> map = sProjectBitmapCache.get(projectKey);
- if (map != null) {
- SoftReference<Bitmap> ref = map.get(value);
- if (ref != null) {
- return ref.get();
- }
- }
- } else {
- SoftReference<Bitmap> ref = sFrameworkBitmapCache.get(value);
- if (ref != null) {
- return ref.get();
- }
- }
-
- return null;
- }
-
- /**
- * Sets a bitmap in a project cache or in the framework cache.
- * @param value the path of the bitmap
- * @param bmp the Bitmap object
- * @param projectKey the key of the project, or null to put the bitmap in the framework cache.
- */
- public static void setCachedBitmap(String value, Bitmap bmp, Object projectKey) {
- if (projectKey != null) {
- Map<String, SoftReference<Bitmap>> map = sProjectBitmapCache.get(projectKey);
-
- if (map == null) {
- map = new HashMap<String, SoftReference<Bitmap>>();
- sProjectBitmapCache.put(projectKey, map);
- }
-
- map.put(value, new SoftReference<Bitmap>(bmp));
- } else {
- sFrameworkBitmapCache.put(value, new SoftReference<Bitmap>(bmp));
- }
- }
-
- /**
- * Returns the 9 patch chunk for a specific path, from a specific project cache, or from the
- * framework cache.
- * @param value the path of the 9 patch
- * @param projectKey the key of the project, or null to query the framework cache.
- * @return the cached 9 patch or null if not found.
- */
- public static NinePatchChunk getCached9Patch(String value, Object projectKey) {
- if (projectKey != null) {
- Map<String, SoftReference<NinePatchChunk>> map = sProject9PatchCache.get(projectKey);
-
- if (map != null) {
- SoftReference<NinePatchChunk> ref = map.get(value);
- if (ref != null) {
- return ref.get();
- }
- }
- } else {
- SoftReference<NinePatchChunk> ref = sFramework9PatchCache.get(value);
- if (ref != null) {
- return ref.get();
- }
- }
-
- return null;
- }
-
- /**
- * Sets a 9 patch chunk in a project cache or in the framework cache.
- * @param value the path of the 9 patch
- * @param ninePatch the 9 patch object
- * @param projectKey the key of the project, or null to put the bitmap in the framework cache.
- */
- public static void setCached9Patch(String value, NinePatchChunk ninePatch, Object projectKey) {
- if (projectKey != null) {
- Map<String, SoftReference<NinePatchChunk>> map = sProject9PatchCache.get(projectKey);
-
- if (map == null) {
- map = new HashMap<String, SoftReference<NinePatchChunk>>();
- sProject9PatchCache.put(projectKey, map);
- }
-
- map.put(value, new SoftReference<NinePatchChunk>(ninePatch));
- } else {
- sFramework9PatchCache.put(value, new SoftReference<NinePatchChunk>(ninePatch));
- }
- }
-}
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeConstants.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeConstants.java
deleted file mode 100644
index eb9e7f1..0000000
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeConstants.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.layoutlib.bridge;
-
-/**
- * Constant definition class.<br>
- * <br>
- * Most constants have a prefix defining the content.
- * <ul>
- * <li><code>WS_</code> Workspace path constant. Those are absolute paths,
- * from the project root.</li>
- * <li><code>OS_</code> OS path constant. These paths are different depending on the platform.</li>
- * <li><code>FN_</code> File name constant.</li>
- * <li><code>FD_</code> Folder name constant.</li>
- * <li><code>EXT_</code> File extension constant. This does NOT include a dot.</li>
- * <li><code>DOT_</code> File extension constant. This start with a dot.</li>
- * <li><code>RE_</code> Regexp constant.</li>
- * <li><code>NS_</code> Namespace constant.</li>
- * <li><code>CLASS_</code> Fully qualified class name.</li>
- * </ul>
- *
- */
-public class BridgeConstants {
-
- /** Namespace for the resource XML */
- public final static String NS_RESOURCES = "http://schemas.android.com/apk/res/android";
-
- /** App auto namespace */
- public final static String NS_APP_RES_AUTO = "http://schemas.android.com/apk/res-auto";
-
- public final static String R = "com.android.internal.R";
-
-
- public final static String MATCH_PARENT = "match_parent";
- public final static String FILL_PARENT = "fill_parent";
- public final static String WRAP_CONTENT = "wrap_content";
-}
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeRenderSession.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeRenderSession.java
deleted file mode 100644
index f9f4b3a..0000000
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeRenderSession.java
+++ /dev/null
@@ -1,196 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.layoutlib.bridge;
-
-import com.android.ide.common.rendering.api.IAnimationListener;
-import com.android.ide.common.rendering.api.ILayoutPullParser;
-import com.android.ide.common.rendering.api.RenderParams;
-import com.android.ide.common.rendering.api.RenderSession;
-import com.android.ide.common.rendering.api.Result;
-import com.android.ide.common.rendering.api.ViewInfo;
-import com.android.layoutlib.bridge.impl.RenderSessionImpl;
-
-import android.view.View;
-import android.view.ViewGroup;
-
-import java.awt.image.BufferedImage;
-import java.util.List;
-import java.util.Map;
-
-/**
- * An implementation of {@link RenderSession}.
- *
- * This is a pretty basic class that does almost nothing. All of the work is done in
- * {@link RenderSessionImpl}.
- *
- */
-public class BridgeRenderSession extends RenderSession {
-
- private final RenderSessionImpl mSession;
- private Result mLastResult;
-
- @Override
- public Result getResult() {
- return mLastResult;
- }
-
- @Override
- public BufferedImage getImage() {
- return mSession.getImage();
- }
-
- @Override
- public boolean isAlphaChannelImage() {
- return mSession.isAlphaChannelImage();
- }
-
- @Override
- public List<ViewInfo> getRootViews() {
- return mSession.getViewInfos();
- }
-
- @Override
- public Map<String, String> getDefaultProperties(Object viewObject) {
- return mSession.getDefaultProperties(viewObject);
- }
-
- @Override
- public Result getProperty(Object objectView, String propertyName) {
- // pass
- return super.getProperty(objectView, propertyName);
- }
-
- @Override
- public Result setProperty(Object objectView, String propertyName, String propertyValue) {
- // pass
- return super.setProperty(objectView, propertyName, propertyValue);
- }
-
- @Override
- public Result render(long timeout) {
- try {
- Bridge.prepareThread();
- mLastResult = mSession.acquire(timeout);
- if (mLastResult.isSuccess()) {
- mLastResult = mSession.render(false /*freshRender*/);
- }
- } finally {
- mSession.release();
- Bridge.cleanupThread();
- }
-
- return mLastResult;
- }
-
- @Override
- public Result animate(Object targetObject, String animationName,
- boolean isFrameworkAnimation, IAnimationListener listener) {
- try {
- Bridge.prepareThread();
- mLastResult = mSession.acquire(RenderParams.DEFAULT_TIMEOUT);
- if (mLastResult.isSuccess()) {
- mLastResult = mSession.animate(targetObject, animationName, isFrameworkAnimation,
- listener);
- }
- } finally {
- mSession.release();
- Bridge.cleanupThread();
- }
-
- return mLastResult;
- }
-
- @Override
- public Result insertChild(Object parentView, ILayoutPullParser childXml, int index,
- IAnimationListener listener) {
- if (parentView instanceof ViewGroup == false) {
- throw new IllegalArgumentException("parentView is not a ViewGroup");
- }
-
- try {
- Bridge.prepareThread();
- mLastResult = mSession.acquire(RenderParams.DEFAULT_TIMEOUT);
- if (mLastResult.isSuccess()) {
- mLastResult = mSession.insertChild((ViewGroup) parentView, childXml, index,
- listener);
- }
- } finally {
- mSession.release();
- Bridge.cleanupThread();
- }
-
- return mLastResult;
- }
-
-
- @Override
- public Result moveChild(Object parentView, Object childView, int index,
- Map<String, String> layoutParams, IAnimationListener listener) {
- if (parentView instanceof ViewGroup == false) {
- throw new IllegalArgumentException("parentView is not a ViewGroup");
- }
- if (childView instanceof View == false) {
- throw new IllegalArgumentException("childView is not a View");
- }
-
- try {
- Bridge.prepareThread();
- mLastResult = mSession.acquire(RenderParams.DEFAULT_TIMEOUT);
- if (mLastResult.isSuccess()) {
- mLastResult = mSession.moveChild((ViewGroup) parentView, (View) childView, index,
- layoutParams, listener);
- }
- } finally {
- mSession.release();
- Bridge.cleanupThread();
- }
-
- return mLastResult;
- }
-
- @Override
- public Result removeChild(Object childView, IAnimationListener listener) {
- if (childView instanceof View == false) {
- throw new IllegalArgumentException("childView is not a View");
- }
-
- try {
- Bridge.prepareThread();
- mLastResult = mSession.acquire(RenderParams.DEFAULT_TIMEOUT);
- if (mLastResult.isSuccess()) {
- mLastResult = mSession.removeChild((View) childView, listener);
- }
- } finally {
- mSession.release();
- Bridge.cleanupThread();
- }
-
- return mLastResult;
- }
-
- @Override
- public void dispose() {
- }
-
- /*package*/ BridgeRenderSession(RenderSessionImpl scene, Result lastResult) {
- mSession = scene;
- if (scene != null) {
- mSession.setScene(this);
- }
- mLastResult = lastResult;
- }
-}
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/MockView.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/MockView.java
deleted file mode 100644
index 3d50b2a..0000000
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/MockView.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.layoutlib.bridge;
-
-import android.content.Context;
-import android.graphics.Canvas;
-import android.util.AttributeSet;
-import android.view.Gravity;
-import android.widget.TextView;
-
-/**
- * Base class for mocked views.
- *
- * TODO: implement onDraw and draw a rectangle in a random color with the name of the class
- * (or better the id of the view).
- */
-public class MockView extends TextView {
-
- public MockView(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
-
- setText(this.getClass().getSimpleName());
- setTextColor(0xFF000000);
- setGravity(Gravity.CENTER);
- }
-
- @Override
- public void onDraw(Canvas canvas) {
- canvas.drawARGB(0xFF, 0x7F, 0x7F, 0x7F);
-
- super.onDraw(canvas);
- }
-}
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContentProvider.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContentProvider.java
deleted file mode 100644
index 01740b1..0000000
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContentProvider.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.layoutlib.bridge.android;
-
-import android.content.ContentProviderOperation;
-import android.content.ContentProviderResult;
-import android.content.ContentValues;
-import android.content.IContentProvider;
-import android.content.OperationApplicationException;
-import android.content.res.AssetFileDescriptor;
-import android.database.Cursor;
-import android.net.Uri;
-import android.os.Bundle;
-import android.os.IBinder;
-import android.os.ICancellationSignal;
-import android.os.ParcelFileDescriptor;
-import android.os.RemoteException;
-
-import java.io.FileNotFoundException;
-import java.util.ArrayList;
-
-/**
- * Mock implementation of {@link IContentProvider}.
- *
- * TODO: never return null when the method is not supposed to. Return fake data instead.
- */
-public final class BridgeContentProvider implements IContentProvider {
- @Override
- public ContentProviderResult[] applyBatch(String callingPackage,
- ArrayList<ContentProviderOperation> arg0)
- throws RemoteException, OperationApplicationException {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public int bulkInsert(String callingPackage, Uri arg0, ContentValues[] arg1)
- throws RemoteException {
- // TODO Auto-generated method stub
- return 0;
- }
-
- @Override
- public Bundle call(String callingPackage, String arg0, String arg1, Bundle arg2)
- throws RemoteException {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public int delete(String callingPackage, Uri arg0, String arg1, String[] arg2)
- throws RemoteException {
- // TODO Auto-generated method stub
- return 0;
- }
-
- @Override
- public String getType(Uri arg0) throws RemoteException {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public Uri insert(String callingPackage, Uri arg0, ContentValues arg1) throws RemoteException {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public AssetFileDescriptor openAssetFile(
- String callingPackage, Uri arg0, String arg1, ICancellationSignal signal)
- throws RemoteException, FileNotFoundException {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public ParcelFileDescriptor openFile(
- String callingPackage, Uri arg0, String arg1, ICancellationSignal signal)
- throws RemoteException, FileNotFoundException {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public Cursor query(String callingPackage, Uri arg0, String[] arg1, String arg2, String[] arg3,
- String arg4, ICancellationSignal arg5) throws RemoteException {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public int update(String callingPackage, Uri arg0, ContentValues arg1, String arg2,
- String[] arg3) throws RemoteException {
- // TODO Auto-generated method stub
- return 0;
- }
-
- @Override
- public IBinder asBinder() {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public String[] getStreamTypes(Uri arg0, String arg1) throws RemoteException {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public AssetFileDescriptor openTypedAssetFile(String callingPackage, Uri arg0, String arg1,
- Bundle arg2, ICancellationSignal signal) throws RemoteException, FileNotFoundException {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public ICancellationSignal createCancellationSignal() throws RemoteException {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public Uri canonicalize(String callingPkg, Uri uri) throws RemoteException {
- return null;
- }
-
- @Override
- public Uri uncanonicalize(String callingPkg, Uri uri) throws RemoteException {
- return null;
- }
-}
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContentResolver.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContentResolver.java
deleted file mode 100644
index 8d259d7..0000000
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContentResolver.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.layoutlib.bridge.android;
-
-import android.content.ContentResolver;
-import android.content.Context;
-import android.content.IContentProvider;
-import android.database.ContentObserver;
-import android.net.Uri;
-import android.os.Bundle;
-
-/**
- * A mock content resolver for the LayoutLib Bridge.
- * <p/>
- * It won't serve any actual data but it's good enough for all
- * the widgets which expect to have a content resolver available via
- * {@link BridgeContext#getContentResolver()}.
- */
-public class BridgeContentResolver extends ContentResolver {
-
- private BridgeContentProvider mProvider = null;
-
- public BridgeContentResolver(Context context) {
- super(context);
- }
-
- @Override
- public IContentProvider acquireProvider(Context c, String name) {
- if (mProvider == null) {
- mProvider = new BridgeContentProvider();
- }
-
- return mProvider;
- }
-
- @Override
- public IContentProvider acquireExistingProvider(Context c, String name) {
- if (mProvider == null) {
- mProvider = new BridgeContentProvider();
- }
-
- return mProvider;
- }
-
- @Override
- public boolean releaseProvider(IContentProvider icp) {
- // ignore
- return false;
- }
-
- @Override
- protected IContentProvider acquireUnstableProvider(Context c, String name) {
- return acquireProvider(c, name);
- }
-
- @Override
- public boolean releaseUnstableProvider(IContentProvider icp) {
- return releaseProvider(icp);
- }
-
- /** @hide */
- @Override
- public void unstableProviderDied(IContentProvider icp) {
- }
-
- /**
- * Stub for the layoutlib bridge content resolver.
- */
- @Override
- public void registerContentObserver(Uri uri, boolean notifyForDescendents,
- ContentObserver observer) {
- // pass
- }
-
- /**
- * Stub for the layoutlib bridge content resolver.
- */
- @Override
- public void unregisterContentObserver(ContentObserver observer) {
- // pass
- }
-
- /**
- * Stub for the layoutlib bridge content resolver.
- */
- @Override
- public void notifyChange(Uri uri, ContentObserver observer, boolean syncToNetwork) {
- // pass
- }
-
- /**
- * Stub for the layoutlib bridge content resolver.
- */
- @Override
- public void startSync(Uri uri, Bundle extras) {
- // pass
- }
-
- /**
- * Stub for the layoutlib bridge content resolver.
- */
- @Override
- public void cancelSync(Uri uri) {
- // pass
- }
-}
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java
deleted file mode 100644
index b9294ab..0000000
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java
+++ /dev/null
@@ -1,1437 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.layoutlib.bridge.android;
-
-import com.android.ide.common.rendering.api.ILayoutPullParser;
-import com.android.ide.common.rendering.api.IProjectCallback;
-import com.android.ide.common.rendering.api.LayoutLog;
-import com.android.ide.common.rendering.api.RenderResources;
-import com.android.ide.common.rendering.api.ResourceReference;
-import com.android.ide.common.rendering.api.ResourceValue;
-import com.android.ide.common.rendering.api.StyleResourceValue;
-import com.android.layoutlib.bridge.Bridge;
-import com.android.layoutlib.bridge.BridgeConstants;
-import com.android.layoutlib.bridge.android.view.WindowManagerImpl;
-import com.android.layoutlib.bridge.impl.ParserFactory;
-import com.android.layoutlib.bridge.impl.Stack;
-import com.android.resources.ResourceType;
-import com.android.util.Pair;
-
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-
-import android.content.BroadcastReceiver;
-import android.content.ComponentName;
-import android.content.ContentResolver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.IntentSender;
-import android.content.ServiceConnection;
-import android.content.SharedPreferences;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageManager;
-import android.content.res.AssetManager;
-import android.content.res.BridgeResources;
-import android.content.res.BridgeTypedArray;
-import android.content.res.Configuration;
-import android.content.res.Resources;
-import android.content.res.Resources.Theme;
-import android.content.res.TypedArray;
-import android.database.DatabaseErrorHandler;
-import android.database.sqlite.SQLiteDatabase;
-import android.database.sqlite.SQLiteDatabase.CursorFactory;
-import android.graphics.Bitmap;
-import android.graphics.drawable.Drawable;
-import android.net.Uri;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.Looper;
-import android.os.PowerManager;
-import android.os.UserHandle;
-import android.util.AttributeSet;
-import android.util.DisplayMetrics;
-import android.util.TypedValue;
-import android.view.BridgeInflater;
-import android.view.Display;
-import android.view.DisplayAdjustments;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.WindowManager;
-import android.view.textservice.TextServicesManager;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.IdentityHashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Custom implementation of Context/Activity to handle non compiled resources.
- */
-public final class BridgeContext extends Context {
-
- private Resources mSystemResources;
- private final HashMap<View, Object> mViewKeyMap = new HashMap<View, Object>();
- private final Object mProjectKey;
- private final DisplayMetrics mMetrics;
- private final RenderResources mRenderResources;
- private final Configuration mConfig;
- private final ApplicationInfo mApplicationInfo;
- private final IProjectCallback mProjectCallback;
- private final WindowManager mWindowManager;
-
- private Resources.Theme mTheme;
-
- private final Map<Object, Map<String, String>> mDefaultPropMaps =
- new IdentityHashMap<Object, Map<String,String>>();
-
- // maps for dynamically generated id representing style objects (StyleResourceValue)
- private Map<Integer, StyleResourceValue> mDynamicIdToStyleMap;
- private Map<StyleResourceValue, Integer> mStyleToDynamicIdMap;
- private int mDynamicIdGenerator = 0x01030000; // Base id for framework R.style
-
- // cache for TypedArray generated from IStyleResourceValue object
- private Map<int[], Map<Integer, TypedArray>> mTypedArrayCache;
- private BridgeInflater mBridgeInflater;
-
- private BridgeContentResolver mContentResolver;
-
- private final Stack<BridgeXmlBlockParser> mParserStack = new Stack<BridgeXmlBlockParser>();
-
- /**
- * @param projectKey An Object identifying the project. This is used for the cache mechanism.
- * @param metrics the {@link DisplayMetrics}.
- * @param renderResources the configured resources (both framework and projects) for this
- * render.
- * @param projectCallback
- * @param config the Configuration object for this render.
- * @param targetSdkVersion the targetSdkVersion of the application.
- */
- public BridgeContext(Object projectKey, DisplayMetrics metrics,
- RenderResources renderResources,
- IProjectCallback projectCallback,
- Configuration config,
- int targetSdkVersion,
- boolean hasRtlSupport) {
- mProjectKey = projectKey;
- mMetrics = metrics;
- mProjectCallback = projectCallback;
-
- mRenderResources = renderResources;
- mConfig = config;
-
- mApplicationInfo = new ApplicationInfo();
- mApplicationInfo.targetSdkVersion = targetSdkVersion;
- if (hasRtlSupport) {
- mApplicationInfo.flags = mApplicationInfo.flags | ApplicationInfo.FLAG_SUPPORTS_RTL;
- }
-
- mWindowManager = new WindowManagerImpl(mMetrics);
- }
-
- /**
- * Initializes the {@link Resources} singleton to be linked to this {@link Context}, its
- * {@link DisplayMetrics}, {@link Configuration}, and {@link IProjectCallback}.
- *
- * @see #disposeResources()
- */
- public void initResources() {
- AssetManager assetManager = AssetManager.getSystem();
-
- mSystemResources = BridgeResources.initSystem(
- this,
- assetManager,
- mMetrics,
- mConfig,
- mProjectCallback);
- mTheme = mSystemResources.newTheme();
- }
-
- /**
- * Disposes the {@link Resources} singleton.
- */
- public void disposeResources() {
- BridgeResources.disposeSystem();
- }
-
- public void setBridgeInflater(BridgeInflater inflater) {
- mBridgeInflater = inflater;
- }
-
- public void addViewKey(View view, Object viewKey) {
- mViewKeyMap.put(view, viewKey);
- }
-
- public Object getViewKey(View view) {
- return mViewKeyMap.get(view);
- }
-
- public Object getProjectKey() {
- return mProjectKey;
- }
-
- public DisplayMetrics getMetrics() {
- return mMetrics;
- }
-
- public IProjectCallback getProjectCallback() {
- return mProjectCallback;
- }
-
- public RenderResources getRenderResources() {
- return mRenderResources;
- }
-
- public Map<String, String> getDefaultPropMap(Object key) {
- return mDefaultPropMaps.get(key);
- }
-
- public Configuration getConfiguration() {
- return mConfig;
- }
-
- /**
- * Adds a parser to the stack.
- * @param parser the parser to add.
- */
- public void pushParser(BridgeXmlBlockParser parser) {
- if (ParserFactory.LOG_PARSER) {
- System.out.println("PUSH " + parser.getParser().toString());
- }
- mParserStack.push(parser);
- }
-
- /**
- * Removes the parser at the top of the stack
- */
- public void popParser() {
- BridgeXmlBlockParser parser = mParserStack.pop();
- if (ParserFactory.LOG_PARSER) {
- System.out.println("POPD " + parser.getParser().toString());
- }
- }
-
- /**
- * Returns the current parser at the top the of the stack.
- * @return a parser or null.
- */
- public BridgeXmlBlockParser getCurrentParser() {
- return mParserStack.peek();
- }
-
- /**
- * Returns the previous parser.
- * @return a parser or null if there isn't any previous parser
- */
- public BridgeXmlBlockParser getPreviousParser() {
- if (mParserStack.size() < 2) {
- return null;
- }
- return mParserStack.get(mParserStack.size() - 2);
- }
-
- public boolean resolveThemeAttribute(int resid, TypedValue outValue, boolean resolveRefs) {
- Pair<ResourceType, String> resourceInfo = Bridge.resolveResourceId(resid);
- boolean isFrameworkRes = true;
- if (resourceInfo == null) {
- resourceInfo = mProjectCallback.resolveResourceId(resid);
- isFrameworkRes = false;
- }
-
- if (resourceInfo == null) {
- return false;
- }
-
- ResourceValue value = mRenderResources.findItemInTheme(resourceInfo.getSecond(),
- isFrameworkRes);
- if (resolveRefs) {
- value = mRenderResources.resolveResValue(value);
- }
-
- // check if this is a style resource
- if (value instanceof StyleResourceValue) {
- // get the id that will represent this style.
- outValue.resourceId = getDynamicIdByStyle((StyleResourceValue)value);
- return true;
- }
-
-
- int a;
- // if this is a framework value.
- if (value.isFramework()) {
- // look for idName in the android R classes.
- // use 0 a default res value as it's not a valid id value.
- a = getFrameworkResourceValue(value.getResourceType(), value.getName(), 0 /*defValue*/);
- } else {
- // look for idName in the project R class.
- // use 0 a default res value as it's not a valid id value.
- a = getProjectResourceValue(value.getResourceType(), value.getName(), 0 /*defValue*/);
- }
-
- if (a != 0) {
- outValue.resourceId = a;
- return true;
- }
-
- return false;
- }
-
-
- public ResourceReference resolveId(int id) {
- // first get the String related to this id in the framework
- Pair<ResourceType, String> resourceInfo = Bridge.resolveResourceId(id);
-
- if (resourceInfo != null) {
- return new ResourceReference(resourceInfo.getSecond(), true);
- }
-
- // didn't find a match in the framework? look in the project.
- if (mProjectCallback != null) {
- resourceInfo = mProjectCallback.resolveResourceId(id);
-
- if (resourceInfo != null) {
- return new ResourceReference(resourceInfo.getSecond(), false);
- }
- }
-
- return null;
- }
-
- public Pair<View, Boolean> inflateView(ResourceReference resource, ViewGroup parent,
- boolean attachToRoot, boolean skipCallbackParser) {
- boolean isPlatformLayout = resource.isFramework();
-
- if (isPlatformLayout == false && skipCallbackParser == false) {
- // check if the project callback can provide us with a custom parser.
- ILayoutPullParser parser = getParser(resource);
-
- if (parser != null) {
- BridgeXmlBlockParser blockParser = new BridgeXmlBlockParser(parser,
- this, resource.isFramework());
- try {
- pushParser(blockParser);
- return Pair.of(
- mBridgeInflater.inflate(blockParser, parent, attachToRoot),
- true);
- } finally {
- popParser();
- }
- }
- }
-
- ResourceValue resValue;
- if (resource instanceof ResourceValue) {
- resValue = (ResourceValue) resource;
- } else {
- if (isPlatformLayout) {
- resValue = mRenderResources.getFrameworkResource(ResourceType.LAYOUT,
- resource.getName());
- } else {
- resValue = mRenderResources.getProjectResource(ResourceType.LAYOUT,
- resource.getName());
- }
- }
-
- if (resValue != null) {
-
- File xml = new File(resValue.getValue());
- if (xml.isFile()) {
- // we need to create a pull parser around the layout XML file, and then
- // give that to our XmlBlockParser
- try {
- XmlPullParser parser = ParserFactory.create(xml);
-
- // set the resource ref to have correct view cookies
- mBridgeInflater.setResourceReference(resource);
-
- BridgeXmlBlockParser blockParser = new BridgeXmlBlockParser(parser,
- this, resource.isFramework());
- try {
- pushParser(blockParser);
- return Pair.of(
- mBridgeInflater.inflate(blockParser, parent, attachToRoot),
- false);
- } finally {
- popParser();
- }
- } catch (XmlPullParserException e) {
- Bridge.getLog().error(LayoutLog.TAG_BROKEN,
- "Failed to configure parser for " + xml, e, null /*data*/);
- // we'll return null below.
- } catch (FileNotFoundException e) {
- // this shouldn't happen since we check above.
- } finally {
- mBridgeInflater.setResourceReference(null);
- }
- } else {
- Bridge.getLog().error(LayoutLog.TAG_BROKEN,
- String.format("File %s is missing!", xml), null);
- }
- } else {
- Bridge.getLog().error(LayoutLog.TAG_BROKEN,
- String.format("Layout %s%s does not exist.", isPlatformLayout ? "android:" : "",
- resource.getName()), null);
- }
-
- return Pair.of(null, false);
- }
-
- @SuppressWarnings("deprecation")
- private ILayoutPullParser getParser(ResourceReference resource) {
- ILayoutPullParser parser;
- if (resource instanceof ResourceValue) {
- parser = mProjectCallback.getParser((ResourceValue) resource);
- } else {
- parser = mProjectCallback.getParser(resource.getName());
- }
- return parser;
- }
-
- // ------------ Context methods
-
- @Override
- public Resources getResources() {
- return mSystemResources;
- }
-
- @Override
- public Theme getTheme() {
- return mTheme;
- }
-
- @Override
- public ClassLoader getClassLoader() {
- return this.getClass().getClassLoader();
- }
-
- @Override
- public Object getSystemService(String service) {
- if (LAYOUT_INFLATER_SERVICE.equals(service)) {
- return mBridgeInflater;
- }
-
- if (TEXT_SERVICES_MANAGER_SERVICE.equals(service)) {
- // we need to return a valid service to avoid NPE
- return TextServicesManager.getInstance();
- }
-
- if (WINDOW_SERVICE.equals(service)) {
- return mWindowManager;
- }
-
- // needed by SearchView
- if (INPUT_METHOD_SERVICE.equals(service)) {
- return null;
- }
-
- if (POWER_SERVICE.equals(service)) {
- return new PowerManager(this, new BridgePowerManager(), new Handler());
- }
-
- throw new UnsupportedOperationException("Unsupported Service: " + service);
- }
-
-
- @Override
- public final TypedArray obtainStyledAttributes(int[] attrs) {
- return createStyleBasedTypedArray(mRenderResources.getCurrentTheme(), attrs);
- }
-
- @Override
- public final TypedArray obtainStyledAttributes(int resid, int[] attrs)
- throws Resources.NotFoundException {
- // get the StyleResourceValue based on the resId;
- StyleResourceValue style = getStyleByDynamicId(resid);
-
- if (style == null) {
- throw new Resources.NotFoundException();
- }
-
- if (mTypedArrayCache == null) {
- mTypedArrayCache = new HashMap<int[], Map<Integer,TypedArray>>();
-
- Map<Integer, TypedArray> map = new HashMap<Integer, TypedArray>();
- mTypedArrayCache.put(attrs, map);
-
- BridgeTypedArray ta = createStyleBasedTypedArray(style, attrs);
- map.put(resid, ta);
-
- return ta;
- }
-
- // get the 2nd map
- Map<Integer, TypedArray> map = mTypedArrayCache.get(attrs);
- if (map == null) {
- map = new HashMap<Integer, TypedArray>();
- mTypedArrayCache.put(attrs, map);
- }
-
- // get the array from the 2nd map
- TypedArray ta = map.get(resid);
-
- if (ta == null) {
- ta = createStyleBasedTypedArray(style, attrs);
- map.put(resid, ta);
- }
-
- return ta;
- }
-
- @Override
- public final TypedArray obtainStyledAttributes(AttributeSet set, int[] attrs) {
- return obtainStyledAttributes(set, attrs, 0, 0);
- }
-
- @Override
- public TypedArray obtainStyledAttributes(AttributeSet set, int[] attrs,
- int defStyleAttr, int defStyleRes) {
-
- Map<String, String> defaultPropMap = null;
- boolean isPlatformFile = true;
-
- // Hint: for XmlPullParser, attach source //DEVICE_SRC/dalvik/libcore/xml/src/java
- if (set instanceof BridgeXmlBlockParser) {
- BridgeXmlBlockParser parser = null;
- parser = (BridgeXmlBlockParser)set;
-
- isPlatformFile = parser.isPlatformFile();
-
- Object key = parser.getViewCookie();
- if (key != null) {
- defaultPropMap = mDefaultPropMaps.get(key);
- if (defaultPropMap == null) {
- defaultPropMap = new HashMap<String, String>();
- mDefaultPropMaps.put(key, defaultPropMap);
- }
- }
-
- } else if (set instanceof BridgeLayoutParamsMapAttributes) {
- // this is only for temp layout params generated dynamically, so this is never
- // platform content.
- isPlatformFile = false;
- } else if (set != null) { // null parser is ok
- // really this should not be happening since its instantiated in Bridge
- Bridge.getLog().error(LayoutLog.TAG_BROKEN,
- "Parser is not a BridgeXmlBlockParser!", null /*data*/);
- return null;
- }
-
- List<Pair<String, Boolean>> attributeList = searchAttrs(attrs);
-
- BridgeTypedArray ta = ((BridgeResources) mSystemResources).newTypeArray(attrs.length,
- isPlatformFile);
-
- // look for a custom style.
- String customStyle = null;
- if (set != null) {
- customStyle = set.getAttributeValue(null /* namespace*/, "style");
- }
-
- StyleResourceValue customStyleValues = null;
- if (customStyle != null) {
- ResourceValue item = mRenderResources.findResValue(customStyle,
- false /*forceFrameworkOnly*/);
-
- // resolve it in case it links to something else
- item = mRenderResources.resolveResValue(item);
-
- if (item instanceof StyleResourceValue) {
- customStyleValues = (StyleResourceValue)item;
- }
- }
-
- // resolve the defStyleAttr value into a IStyleResourceValue
- StyleResourceValue defStyleValues = null;
-
- if (defStyleAttr != 0) {
- // get the name from the int.
- Pair<String, Boolean> defStyleAttribute = searchAttr(defStyleAttr);
-
- if (defaultPropMap != null) {
- String defStyleName = defStyleAttribute.getFirst();
- if (defStyleAttribute.getSecond()) {
- defStyleName = "android:" + defStyleName;
- }
- defaultPropMap.put("style", defStyleName);
- }
-
- // look for the style in the current theme, and its parent:
- ResourceValue item = mRenderResources.findItemInTheme(defStyleAttribute.getFirst(),
- defStyleAttribute.getSecond());
-
- if (item != null) {
- // item is a reference to a style entry. Search for it.
- item = mRenderResources.findResValue(item.getValue(),
- false /*forceFrameworkOnly*/);
-
- if (item instanceof StyleResourceValue) {
- defStyleValues = (StyleResourceValue)item;
- }
- } else {
- Bridge.getLog().error(LayoutLog.TAG_RESOURCES_RESOLVE_THEME_ATTR,
- String.format(
- "Failed to find style '%s' in current theme",
- defStyleAttribute.getFirst()),
- null /*data*/);
- }
- } else if (defStyleRes != 0) {
- boolean isFrameworkRes = true;
- Pair<ResourceType, String> value = Bridge.resolveResourceId(defStyleRes);
- if (value == null) {
- value = mProjectCallback.resolveResourceId(defStyleRes);
- isFrameworkRes = false;
- }
-
- if (value != null) {
- if (value.getFirst() == ResourceType.STYLE) {
- // look for the style in the current theme, and its parent:
- ResourceValue item = mRenderResources.findItemInTheme(value.getSecond(),
- isFrameworkRes);
- if (item != null) {
- if (item instanceof StyleResourceValue) {
- if (defaultPropMap != null) {
- defaultPropMap.put("style", item.getName());
- }
-
- defStyleValues = (StyleResourceValue)item;
- }
- } else {
- Bridge.getLog().error(null,
- String.format(
- "Style with id 0x%x (resolved to '%s') does not exist.",
- defStyleRes, value.getSecond()),
- null /*data*/);
- }
- } else {
- Bridge.getLog().error(null,
- String.format(
- "Resouce id 0x%x is not of type STYLE (instead %s)",
- defStyleRes, value.getFirst().toString()),
- null /*data*/);
- }
- } else {
- Bridge.getLog().error(null,
- String.format(
- "Failed to find style with id 0x%x in current theme",
- defStyleRes),
- null /*data*/);
- }
- }
-
- String appNamespace = mProjectCallback.getNamespace();
-
- if (attributeList != null) {
- for (int index = 0 ; index < attributeList.size() ; index++) {
- Pair<String, Boolean> attribute = attributeList.get(index);
-
- if (attribute == null) {
- continue;
- }
-
- String attrName = attribute.getFirst();
- boolean frameworkAttr = attribute.getSecond().booleanValue();
- String value = null;
- if (set != null) {
- value = set.getAttributeValue(
- frameworkAttr ? BridgeConstants.NS_RESOURCES : appNamespace,
- attrName);
-
- // if this is an app attribute, and the first get fails, try with the
- // new res-auto namespace as well
- if (frameworkAttr == false && value == null) {
- value = set.getAttributeValue(BridgeConstants.NS_APP_RES_AUTO, attrName);
- }
- }
-
- // if there's no direct value for this attribute in the XML, we look for default
- // values in the widget defStyle, and then in the theme.
- if (value == null) {
- ResourceValue resValue = null;
-
- // look for the value in the custom style first (and its parent if needed)
- if (customStyleValues != null) {
- resValue = mRenderResources.findItemInStyle(customStyleValues,
- attrName, frameworkAttr);
- }
-
- // then look for the value in the default Style (and its parent if needed)
- if (resValue == null && defStyleValues != null) {
- resValue = mRenderResources.findItemInStyle(defStyleValues,
- attrName, frameworkAttr);
- }
-
- // if the item is not present in the defStyle, we look in the main theme (and
- // its parent themes)
- if (resValue == null) {
- resValue = mRenderResources.findItemInTheme(attrName, frameworkAttr);
- }
-
- // if we found a value, we make sure this doesn't reference another value.
- // So we resolve it.
- if (resValue != null) {
- // put the first default value, before the resolution.
- if (defaultPropMap != null) {
- defaultPropMap.put(attrName, resValue.getValue());
- }
-
- resValue = mRenderResources.resolveResValue(resValue);
- }
-
- ta.bridgeSetValue(index, attrName, frameworkAttr, resValue);
- } else {
- // there is a value in the XML, but we need to resolve it in case it's
- // referencing another resource or a theme value.
- ta.bridgeSetValue(index, attrName, frameworkAttr,
- mRenderResources.resolveValue(null, attrName, value, isPlatformFile));
- }
- }
- }
-
- ta.sealArray();
-
- return ta;
- }
-
- @Override
- public Looper getMainLooper() {
- return Looper.myLooper();
- }
-
-
- // ------------- private new methods
-
- /**
- * Creates a {@link BridgeTypedArray} by filling the values defined by the int[] with the
- * values found in the given style.
- * @see #obtainStyledAttributes(int, int[])
- */
- private BridgeTypedArray createStyleBasedTypedArray(StyleResourceValue style, int[] attrs)
- throws Resources.NotFoundException {
-
- List<Pair<String, Boolean>> attributes = searchAttrs(attrs);
-
- BridgeTypedArray ta = ((BridgeResources) mSystemResources).newTypeArray(attrs.length,
- false);
-
- // for each attribute, get its name so that we can search it in the style
- for (int i = 0 ; i < attrs.length ; i++) {
- Pair<String, Boolean> attribute = attributes.get(i);
-
- if (attribute != null) {
- // look for the value in the given style
- ResourceValue resValue = mRenderResources.findItemInStyle(style,
- attribute.getFirst(), attribute.getSecond());
-
- if (resValue != null) {
- // resolve it to make sure there are no references left.
- ta.bridgeSetValue(i, attribute.getFirst(), attribute.getSecond(),
- mRenderResources.resolveResValue(resValue));
- }
- }
- }
-
- ta.sealArray();
-
- return ta;
- }
-
-
- /**
- * The input int[] attrs is a list of attributes. The returns a list of information about
- * each attributes. The information is (name, isFramework)
- * <p/>
- *
- * @param attrs An attribute array reference given to obtainStyledAttributes.
- * @return List of attribute information.
- */
- private List<Pair<String, Boolean>> searchAttrs(int[] attrs) {
- List<Pair<String, Boolean>> results = new ArrayList<Pair<String, Boolean>>(attrs.length);
-
- // for each attribute, get its name so that we can search it in the style
- for (int i = 0 ; i < attrs.length ; i++) {
- Pair<ResourceType, String> resolvedResource = Bridge.resolveResourceId(attrs[i]);
- boolean isFramework = false;
- if (resolvedResource != null) {
- isFramework = true;
- } else {
- resolvedResource = mProjectCallback.resolveResourceId(attrs[i]);
- }
-
- if (resolvedResource != null) {
- results.add(Pair.of(resolvedResource.getSecond(), isFramework));
- } else {
- results.add(null);
- }
- }
-
- return results;
- }
-
- /**
- * Searches for the attribute referenced by its internal id.
- *
- * @param attr An attribute reference given to obtainStyledAttributes such as defStyle.
- * @return A (name, isFramework) pair describing the attribute if found. Returns null
- * if nothing is found.
- */
- public Pair<String, Boolean> searchAttr(int attr) {
- Pair<ResourceType, String> info = Bridge.resolveResourceId(attr);
- if (info != null) {
- return Pair.of(info.getSecond(), Boolean.TRUE);
- }
-
- info = mProjectCallback.resolveResourceId(attr);
- if (info != null) {
- return Pair.of(info.getSecond(), Boolean.FALSE);
- }
-
- return null;
- }
-
- public int getDynamicIdByStyle(StyleResourceValue resValue) {
- if (mDynamicIdToStyleMap == null) {
- // create the maps.
- mDynamicIdToStyleMap = new HashMap<Integer, StyleResourceValue>();
- mStyleToDynamicIdMap = new HashMap<StyleResourceValue, Integer>();
- }
-
- // look for an existing id
- Integer id = mStyleToDynamicIdMap.get(resValue);
-
- if (id == null) {
- // generate a new id
- id = Integer.valueOf(++mDynamicIdGenerator);
-
- // and add it to the maps.
- mDynamicIdToStyleMap.put(id, resValue);
- mStyleToDynamicIdMap.put(resValue, id);
- }
-
- return id;
- }
-
- private StyleResourceValue getStyleByDynamicId(int i) {
- if (mDynamicIdToStyleMap != null) {
- return mDynamicIdToStyleMap.get(i);
- }
-
- return null;
- }
-
- public int getFrameworkResourceValue(ResourceType resType, String resName, int defValue) {
- Integer value = Bridge.getResourceId(resType, resName);
- if (value != null) {
- return value.intValue();
- }
-
- return defValue;
- }
-
- public int getProjectResourceValue(ResourceType resType, String resName, int defValue) {
- if (mProjectCallback != null) {
- Integer value = mProjectCallback.getResourceId(resType, resName);
- if (value != null) {
- return value.intValue();
- }
- }
-
- return defValue;
- }
-
- //------------ NOT OVERRIDEN --------------------
-
- @Override
- public boolean bindService(Intent arg0, ServiceConnection arg1, int arg2) {
- // pass
- return false;
- }
-
- @Override
- public int checkCallingOrSelfPermission(String arg0) {
- // pass
- return 0;
- }
-
- @Override
- public int checkCallingOrSelfUriPermission(Uri arg0, int arg1) {
- // pass
- return 0;
- }
-
- @Override
- public int checkCallingPermission(String arg0) {
- // pass
- return 0;
- }
-
- @Override
- public int checkCallingUriPermission(Uri arg0, int arg1) {
- // pass
- return 0;
- }
-
- @Override
- public int checkPermission(String arg0, int arg1, int arg2) {
- // pass
- return 0;
- }
-
- @Override
- public int checkUriPermission(Uri arg0, int arg1, int arg2, int arg3) {
- // pass
- return 0;
- }
-
- @Override
- public int checkUriPermission(Uri arg0, String arg1, String arg2, int arg3,
- int arg4, int arg5) {
- // pass
- return 0;
- }
-
- @Override
- public void clearWallpaper() {
- // pass
-
- }
-
- @Override
- public Context createPackageContext(String arg0, int arg1) {
- // pass
- return null;
- }
-
- @Override
- public Context createPackageContextAsUser(String arg0, int arg1, UserHandle user) {
- // pass
- return null;
- }
-
- @Override
- public Context createConfigurationContext(Configuration overrideConfiguration) {
- // pass
- return null;
- }
-
- @Override
- public Context createDisplayContext(Display display) {
- // pass
- return null;
- }
-
- @Override
- public String[] databaseList() {
- // pass
- return null;
- }
-
- @Override
- public boolean deleteDatabase(String arg0) {
- // pass
- return false;
- }
-
- @Override
- public boolean deleteFile(String arg0) {
- // pass
- return false;
- }
-
- @Override
- public void enforceCallingOrSelfPermission(String arg0, String arg1) {
- // pass
-
- }
-
- @Override
- public void enforceCallingOrSelfUriPermission(Uri arg0, int arg1,
- String arg2) {
- // pass
-
- }
-
- @Override
- public void enforceCallingPermission(String arg0, String arg1) {
- // pass
-
- }
-
- @Override
- public void enforceCallingUriPermission(Uri arg0, int arg1, String arg2) {
- // pass
-
- }
-
- @Override
- public void enforcePermission(String arg0, int arg1, int arg2, String arg3) {
- // pass
-
- }
-
- @Override
- public void enforceUriPermission(Uri arg0, int arg1, int arg2, int arg3,
- String arg4) {
- // pass
-
- }
-
- @Override
- public void enforceUriPermission(Uri arg0, String arg1, String arg2,
- int arg3, int arg4, int arg5, String arg6) {
- // pass
-
- }
-
- @Override
- public String[] fileList() {
- // pass
- return null;
- }
-
- @Override
- public AssetManager getAssets() {
- // pass
- return null;
- }
-
- @Override
- public File getCacheDir() {
- // pass
- return null;
- }
-
- @Override
- public File getExternalCacheDir() {
- // pass
- return null;
- }
-
- @Override
- public ContentResolver getContentResolver() {
- if (mContentResolver == null) {
- mContentResolver = new BridgeContentResolver(this);
- }
- return mContentResolver;
- }
-
- @Override
- public File getDatabasePath(String arg0) {
- // pass
- return null;
- }
-
- @Override
- public File getDir(String arg0, int arg1) {
- // pass
- return null;
- }
-
- @Override
- public File getFileStreamPath(String arg0) {
- // pass
- return null;
- }
-
- @Override
- public File getFilesDir() {
- // pass
- return null;
- }
-
- @Override
- public File getExternalFilesDir(String type) {
- // pass
- return null;
- }
-
- @Override
- public String getPackageCodePath() {
- // pass
- return null;
- }
-
- @Override
- public PackageManager getPackageManager() {
- // pass
- return null;
- }
-
- @Override
- public String getPackageName() {
- // pass
- return null;
- }
-
- @Override
- public String getBasePackageName() {
- // pass
- return null;
- }
-
- @Override
- public String getOpPackageName() {
- // pass
- return null;
- }
-
- @Override
- public ApplicationInfo getApplicationInfo() {
- return mApplicationInfo;
- }
-
- @Override
- public String getPackageResourcePath() {
- // pass
- return null;
- }
-
- @Override
- public File getSharedPrefsFile(String name) {
- // pass
- return null;
- }
-
- @Override
- public SharedPreferences getSharedPreferences(String arg0, int arg1) {
- // pass
- return null;
- }
-
- @Override
- public Drawable getWallpaper() {
- // pass
- return null;
- }
-
- @Override
- public int getWallpaperDesiredMinimumWidth() {
- return -1;
- }
-
- @Override
- public int getWallpaperDesiredMinimumHeight() {
- return -1;
- }
-
- @Override
- public void grantUriPermission(String arg0, Uri arg1, int arg2) {
- // pass
-
- }
-
- @Override
- public FileInputStream openFileInput(String arg0) throws FileNotFoundException {
- // pass
- return null;
- }
-
- @Override
- public FileOutputStream openFileOutput(String arg0, int arg1) throws FileNotFoundException {
- // pass
- return null;
- }
-
- @Override
- public SQLiteDatabase openOrCreateDatabase(String arg0, int arg1, CursorFactory arg2) {
- // pass
- return null;
- }
-
- @Override
- public SQLiteDatabase openOrCreateDatabase(String arg0, int arg1,
- CursorFactory arg2, DatabaseErrorHandler arg3) {
- // pass
- return null;
- }
-
- @Override
- public Drawable peekWallpaper() {
- // pass
- return null;
- }
-
- @Override
- public Intent registerReceiver(BroadcastReceiver arg0, IntentFilter arg1) {
- // pass
- return null;
- }
-
- @Override
- public Intent registerReceiver(BroadcastReceiver arg0, IntentFilter arg1,
- String arg2, Handler arg3) {
- // pass
- return null;
- }
-
- @Override
- public Intent registerReceiverAsUser(BroadcastReceiver arg0, UserHandle arg0p5,
- IntentFilter arg1, String arg2, Handler arg3) {
- // pass
- return null;
- }
-
- @Override
- public void removeStickyBroadcast(Intent arg0) {
- // pass
-
- }
-
- @Override
- public void revokeUriPermission(Uri arg0, int arg1) {
- // pass
-
- }
-
- @Override
- public void sendBroadcast(Intent arg0) {
- // pass
-
- }
-
- @Override
- public void sendBroadcast(Intent arg0, String arg1) {
- // pass
-
- }
-
- @Override
- public void sendBroadcast(Intent intent, String receiverPermission, int appOp) {
- // pass
- }
-
- @Override
- public void sendOrderedBroadcast(Intent arg0, String arg1) {
- // pass
-
- }
-
- @Override
- public void sendOrderedBroadcast(Intent arg0, String arg1,
- BroadcastReceiver arg2, Handler arg3, int arg4, String arg5,
- Bundle arg6) {
- // pass
-
- }
-
- @Override
- public void sendOrderedBroadcast(Intent intent, String receiverPermission, int appOp,
- BroadcastReceiver resultReceiver, Handler scheduler, int initialCode,
- String initialData, Bundle initialExtras) {
- // pass
- }
-
- @Override
- public void sendBroadcastAsUser(Intent intent, UserHandle user) {
- // pass
- }
-
- @Override
- public void sendBroadcastAsUser(Intent intent, UserHandle user,
- String receiverPermission) {
- // pass
- }
-
- @Override
- public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user,
- String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler,
- int initialCode, String initialData, Bundle initialExtras) {
- // pass
- }
-
- @Override
- public void sendStickyBroadcast(Intent arg0) {
- // pass
-
- }
-
- @Override
- public void sendStickyOrderedBroadcast(Intent intent,
- BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData,
- Bundle initialExtras) {
- // pass
- }
-
- @Override
- public void sendStickyBroadcastAsUser(Intent intent, UserHandle user) {
- // pass
- }
-
- @Override
- public void sendStickyOrderedBroadcastAsUser(Intent intent,
- UserHandle user, BroadcastReceiver resultReceiver,
- Handler scheduler, int initialCode, String initialData,
- Bundle initialExtras) {
- // pass
- }
-
- @Override
- public void removeStickyBroadcastAsUser(Intent intent, UserHandle user) {
- // pass
- }
-
- @Override
- public void setTheme(int arg0) {
- // pass
-
- }
-
- @Override
- public void setWallpaper(Bitmap arg0) throws IOException {
- // pass
-
- }
-
- @Override
- public void setWallpaper(InputStream arg0) throws IOException {
- // pass
-
- }
-
- @Override
- public void startActivity(Intent arg0) {
- // pass
- }
-
- @Override
- public void startActivity(Intent arg0, Bundle arg1) {
- // pass
- }
-
- @Override
- public void startIntentSender(IntentSender intent,
- Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags)
- throws IntentSender.SendIntentException {
- // pass
- }
-
- @Override
- public void startIntentSender(IntentSender intent,
- Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags,
- Bundle options) throws IntentSender.SendIntentException {
- // pass
- }
-
- @Override
- public boolean startInstrumentation(ComponentName arg0, String arg1,
- Bundle arg2) {
- // pass
- return false;
- }
-
- @Override
- public ComponentName startService(Intent arg0) {
- // pass
- return null;
- }
-
- @Override
- public boolean stopService(Intent arg0) {
- // pass
- return false;
- }
-
- @Override
- public ComponentName startServiceAsUser(Intent arg0, UserHandle arg1) {
- // pass
- return null;
- }
-
- @Override
- public boolean stopServiceAsUser(Intent arg0, UserHandle arg1) {
- // pass
- return false;
- }
-
- @Override
- public void unbindService(ServiceConnection arg0) {
- // pass
-
- }
-
- @Override
- public void unregisterReceiver(BroadcastReceiver arg0) {
- // pass
-
- }
-
- @Override
- public Context getApplicationContext() {
- return this;
- }
-
- @Override
- public void startActivities(Intent[] arg0) {
- // pass
-
- }
-
- @Override
- public void startActivities(Intent[] arg0, Bundle arg1) {
- // pass
-
- }
-
- @Override
- public boolean isRestricted() {
- return false;
- }
-
- @Override
- public File getObbDir() {
- Bridge.getLog().error(LayoutLog.TAG_UNSUPPORTED, "OBB not supported", null);
- return null;
- }
-
- @Override
- public DisplayAdjustments getDisplayAdjustments(int displayId) {
- // pass
- return null;
- }
-
- /**
- * @hide
- */
- @Override
- public int getUserId() {
- return 0; // not used
- }
-
- @Override
- public File[] getExternalFilesDirs(String type) {
- // pass
- return new File[0];
- }
-
- @Override
- public File[] getObbDirs() {
- // pass
- return new File[0];
- }
-
- @Override
- public File[] getExternalCacheDirs() {
- // pass
- return new File[0];
- }
-}
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeIInputMethodManager.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeIInputMethodManager.java
deleted file mode 100644
index 3cf5ed5..0000000
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeIInputMethodManager.java
+++ /dev/null
@@ -1,230 +0,0 @@
-/*
- * Copyright (C) 2011 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.layoutlib.bridge.android;
-
-import com.android.internal.view.IInputContext;
-import com.android.internal.view.IInputMethodClient;
-import com.android.internal.view.IInputMethodManager;
-import com.android.internal.view.InputBindResult;
-
-import android.os.IBinder;
-import android.os.RemoteException;
-import android.os.ResultReceiver;
-import android.text.style.SuggestionSpan;
-import android.view.inputmethod.EditorInfo;
-import android.view.inputmethod.InputMethodInfo;
-import android.view.inputmethod.InputMethodSubtype;
-
-import java.util.List;
-
-/**
- * Basic implementation of IInputMethodManager that does nothing.
- *
- */
-public class BridgeIInputMethodManager implements IInputMethodManager {
-
- @Override
- public void addClient(IInputMethodClient arg0, IInputContext arg1, int arg2, int arg3)
- throws RemoteException {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public void finishInput(IInputMethodClient arg0) throws RemoteException {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public InputMethodSubtype getCurrentInputMethodSubtype() throws RemoteException {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public List<InputMethodInfo> getEnabledInputMethodList() throws RemoteException {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public List<InputMethodSubtype> getEnabledInputMethodSubtypeList(String arg0,
- boolean arg1) throws RemoteException {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public List<InputMethodInfo> getInputMethodList() throws RemoteException {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public InputMethodSubtype getLastInputMethodSubtype() throws RemoteException {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public List getShortcutInputMethodsAndSubtypes() throws RemoteException {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public void hideMySoftInput(IBinder arg0, int arg1) throws RemoteException {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public boolean hideSoftInput(IInputMethodClient arg0, int arg1, ResultReceiver arg2)
- throws RemoteException {
- // TODO Auto-generated method stub
- return false;
- }
-
- @Override
- public boolean notifySuggestionPicked(SuggestionSpan arg0, String arg1, int arg2)
- throws RemoteException {
- // TODO Auto-generated method stub
- return false;
- }
-
- @Override
- public void registerSuggestionSpansForNotification(SuggestionSpan[] arg0)
- throws RemoteException {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public void removeClient(IInputMethodClient arg0) throws RemoteException {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public void setAdditionalInputMethodSubtypes(String arg0, InputMethodSubtype[] arg1)
- throws RemoteException {
- // TODO Auto-generated method stub
- }
-
- @Override
- public boolean setCurrentInputMethodSubtype(InputMethodSubtype arg0) throws RemoteException {
- // TODO Auto-generated method stub
- return false;
- }
-
- @Override
- public void setImeWindowStatus(IBinder arg0, int arg1, int arg2) throws RemoteException {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public void setInputMethod(IBinder arg0, String arg1) throws RemoteException {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public void setInputMethodAndSubtype(IBinder arg0, String arg1, InputMethodSubtype arg2)
- throws RemoteException {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public boolean setInputMethodEnabled(String arg0, boolean arg1) throws RemoteException {
- // TODO Auto-generated method stub
- return false;
- }
-
- @Override
- public void showInputMethodAndSubtypeEnablerFromClient(IInputMethodClient arg0, String arg1)
- throws RemoteException {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public void showInputMethodPickerFromClient(IInputMethodClient arg0) throws RemoteException {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public void showMySoftInput(IBinder arg0, int arg1) throws RemoteException {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public boolean showSoftInput(IInputMethodClient arg0, int arg1, ResultReceiver arg2)
- throws RemoteException {
- // TODO Auto-generated method stub
- return false;
- }
-
- @Override
- public InputBindResult startInput(IInputMethodClient client, IInputContext inputContext,
- EditorInfo attribute, int controlFlags) throws RemoteException {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public boolean switchToLastInputMethod(IBinder arg0) throws RemoteException {
- // TODO Auto-generated method stub
- return false;
- }
-
- @Override
- public boolean switchToNextInputMethod(IBinder arg0, boolean arg1) throws RemoteException {
- // TODO Auto-generated method stub
- return false;
- }
-
- @Override
- public boolean shouldOfferSwitchingToNextInputMethod(IBinder arg0) throws RemoteException {
- // TODO Auto-generated method stub
- return false;
- }
-
- @Override
- public void updateStatusIcon(IBinder arg0, String arg1, int arg2) throws RemoteException {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public InputBindResult windowGainedFocus(IInputMethodClient client, IBinder windowToken,
- int controlFlags, int softInputMode, int windowFlags, EditorInfo attribute,
- IInputContext inputContext) throws RemoteException {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public IBinder asBinder() {
- // TODO Auto-generated method stub
- return null;
- }
-}
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeLayoutParamsMapAttributes.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeLayoutParamsMapAttributes.java
deleted file mode 100644
index f5912e7..0000000
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeLayoutParamsMapAttributes.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.layoutlib.bridge.android;
-
-import com.android.layoutlib.bridge.BridgeConstants;
-
-import android.util.AttributeSet;
-
-import java.util.Map;
-
-/**
- * An implementation of the {@link AttributeSet} interface on top of a map of attribute in the form
- * of (name, value).
- *
- * This is meant to be called only from {@link BridgeContext#obtainStyledAttributes(AttributeSet, int[], int, int)}
- * in the case of LayoutParams and therefore isn't a full implementation.
- */
-public class BridgeLayoutParamsMapAttributes implements AttributeSet {
-
- private final Map<String, String> mAttributes;
-
- public BridgeLayoutParamsMapAttributes(Map<String, String> attributes) {
- mAttributes = attributes;
- }
-
- @Override
- public String getAttributeValue(String namespace, String name) {
- if (BridgeConstants.NS_RESOURCES.equals(namespace)) {
- return mAttributes.get(name);
- }
-
- return null;
- }
-
- // ---- the following methods are not called from
- // BridgeContext#obtainStyledAttributes(AttributeSet, int[], int, int)
- // Should they ever be called, we'll just implement them on a need basis.
-
- @Override
- public int getAttributeCount() {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public String getAttributeName(int index) {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public String getAttributeValue(int index) {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public String getPositionDescription() {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public int getAttributeNameResource(int index) {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public int getAttributeListValue(String namespace, String attribute,
- String[] options, int defaultValue) {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public boolean getAttributeBooleanValue(String namespace, String attribute,
- boolean defaultValue) {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public int getAttributeResourceValue(String namespace, String attribute,
- int defaultValue) {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public int getAttributeIntValue(String namespace, String attribute,
- int defaultValue) {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public int getAttributeUnsignedIntValue(String namespace, String attribute,
- int defaultValue) {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public float getAttributeFloatValue(String namespace, String attribute,
- float defaultValue) {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public int getAttributeListValue(int index,
- String[] options, int defaultValue) {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public boolean getAttributeBooleanValue(int index, boolean defaultValue) {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public int getAttributeResourceValue(int index, int defaultValue) {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public int getAttributeIntValue(int index, int defaultValue) {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public int getAttributeUnsignedIntValue(int index, int defaultValue) {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public float getAttributeFloatValue(int index, float defaultValue) {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public String getIdAttribute() {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public String getClassAttribute() {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public int getIdAttributeResourceValue(int defaultValue) {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public int getStyleAttribute() {
- throw new UnsupportedOperationException();
- }
-}
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgePowerManager.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgePowerManager.java
deleted file mode 100644
index 281337c..0000000
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgePowerManager.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * Copyright (C) 2012 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.layoutlib.bridge.android;
-
-import android.os.IBinder;
-import android.os.IPowerManager;
-import android.os.RemoteException;
-import android.os.WorkSource;
-
-/**
- * Fake implementation of IPowerManager.
- *
- */
-public class BridgePowerManager implements IPowerManager {
-
- @Override
- public boolean isScreenOn() throws RemoteException {
- return true;
- }
-
- @Override
- public IBinder asBinder() {
- // pass for now.
- return null;
- }
-
- @Override
- public void acquireWakeLock(IBinder arg0, int arg1, String arg2, String arg2_5, WorkSource arg3)
- throws RemoteException {
- // pass for now.
- }
-
- @Override
- public void acquireWakeLockWithUid(IBinder arg0, int arg1, String arg2, String arg2_5, int arg3)
- throws RemoteException {
- // pass for now.
- }
-
- @Override
- public void crash(String arg0) throws RemoteException {
- // pass for now.
- }
-
- @Override
- public void goToSleep(long arg0, int arg1) throws RemoteException {
- // pass for now.
- }
-
- @Override
- public void nap(long arg0) throws RemoteException {
- // pass for now.
- }
-
- @Override
- public void reboot(boolean confirm, String reason, boolean wait) {
- // pass for now.
- }
-
- @Override
- public void shutdown(boolean confirm, boolean wait) {
- // pass for now.
- }
-
- @Override
- public void releaseWakeLock(IBinder arg0, int arg1) throws RemoteException {
- // pass for now.
- }
-
- @Override
- public void updateWakeLockUids(IBinder arg0, int[] arg1) throws RemoteException {
- // pass for now.
- }
-
- @Override
- public void setAttentionLight(boolean arg0, int arg1) throws RemoteException {
- // pass for now.
- }
-
- @Override
- public void setTemporaryScreenAutoBrightnessAdjustmentSettingOverride(float arg0) throws RemoteException {
- // pass for now.
- }
-
- @Override
- public void setTemporaryScreenBrightnessSettingOverride(int arg0) throws RemoteException {
- // pass for now.
- }
-
- @Override
- public void setMaximumScreenOffTimeoutFromDeviceAdmin(int arg0) throws RemoteException {
- // pass for now.
- }
-
- @Override
- public void setStayOnSetting(int arg0) throws RemoteException {
- // pass for now.
- }
-
- @Override
- public void updateWakeLockWorkSource(IBinder arg0, WorkSource arg1) throws RemoteException {
- // pass for now.
- }
-
- @Override
- public boolean isWakeLockLevelSupported(int level) throws RemoteException {
- // pass for now.
- return true;
- }
-
- @Override
- public void userActivity(long time, int event, int flags) throws RemoteException {
- // pass for now.
- }
-
- @Override
- public void wakeUp(long time) throws RemoteException {
- // pass for now.
- }
-}
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindow.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindow.java
deleted file mode 100644
index df576d2..0000000
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindow.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.layoutlib.bridge.android;
-
-import android.content.res.Configuration;
-import android.graphics.Rect;
-import android.os.Bundle;
-import android.os.IBinder;
-import android.os.ParcelFileDescriptor;
-import android.os.RemoteException;
-import android.view.DragEvent;
-import android.view.IWindow;
-
-/**
- * Implementation of {@link IWindow} to pass to the AttachInfo.
- */
-public final class BridgeWindow implements IWindow {
-
- @Override
- public void dispatchAppVisibility(boolean arg0) throws RemoteException {
- // pass for now.
- }
-
- @Override
- public void dispatchGetNewSurface() throws RemoteException {
- // pass for now.
- }
-
- @Override
- public void executeCommand(String arg0, String arg1, ParcelFileDescriptor arg2)
- throws RemoteException {
- // pass for now.
- }
-
- @Override
- public void resized(Rect arg1, Rect arg1p5, Rect arg2, Rect arg3,
- boolean arg4, Configuration arg5) throws RemoteException {
- // pass for now.
- }
-
- @Override
- public void moved(int arg0, int arg1) throws RemoteException {
- // pass for now.
- }
-
- @Override
- public void dispatchScreenState(boolean on) throws RemoteException {
- // pass for now.
- }
-
- @Override
- public void windowFocusChanged(boolean arg0, boolean arg1) throws RemoteException {
- // pass for now.
- }
-
- @Override
- public void dispatchWallpaperOffsets(float x, float y, float xStep, float yStep,
- boolean sync) {
- // pass for now.
- }
-
- @Override
- public void dispatchWallpaperCommand(String action, int x, int y,
- int z, Bundle extras, boolean sync) {
- // pass for now.
- }
-
- @Override
- public void closeSystemDialogs(String reason) {
- // pass for now.
- }
-
- @Override
- public void dispatchDragEvent(DragEvent event) {
- // pass for now.
- }
-
- @Override
- public void dispatchSystemUiVisibilityChanged(int seq, int globalUi,
- int localValue, int localChanges) {
- // pass for now.
- }
-
- @Override
- public void doneAnimating() {
- }
-
- @Override
- public IBinder asBinder() {
- // pass for now.
- return null;
- }
-}
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindowSession.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindowSession.java
deleted file mode 100644
index 09e6878..0000000
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindowSession.java
+++ /dev/null
@@ -1,209 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.layoutlib.bridge.android;
-
-import android.content.ClipData;
-import android.content.res.Configuration;
-import android.graphics.Rect;
-import android.graphics.Region;
-import android.os.Bundle;
-import android.os.IBinder;
-import android.os.RemoteException;
-import android.view.IWindow;
-import android.view.IWindowId;
-import android.view.IWindowSession;
-import android.view.InputChannel;
-import android.view.Surface;
-import android.view.SurfaceView;
-import android.view.WindowManager.LayoutParams;
-
-/**
- * Implementation of {@link IWindowSession} so that mSession is not null in
- * the {@link SurfaceView}.
- */
-public final class BridgeWindowSession implements IWindowSession {
-
- @Override
- public int add(IWindow arg0, int seq, LayoutParams arg1, int arg2, Rect arg3,
- InputChannel outInputchannel)
- throws RemoteException {
- // pass for now.
- return 0;
- }
-
- @Override
- public int addToDisplay(IWindow arg0, int seq, LayoutParams arg1, int arg2, int displayId,
- Rect arg3, InputChannel outInputchannel)
- throws RemoteException {
- // pass for now.
- return 0;
- }
-
- @Override
- public int addWithoutInputChannel(IWindow arg0, int seq, LayoutParams arg1, int arg2,
- Rect arg3)
- throws RemoteException {
- // pass for now.
- return 0;
- }
-
- @Override
- public int addToDisplayWithoutInputChannel(IWindow arg0, int seq, LayoutParams arg1, int arg2,
- int displayId, Rect arg3)
- throws RemoteException {
- // pass for now.
- return 0;
- }
-
- @Override
- public void finishDrawing(IWindow arg0) throws RemoteException {
- // pass for now.
- }
-
- @Override
- public boolean getInTouchMode() throws RemoteException {
- // pass for now.
- return false;
- }
-
- @Override
- public boolean performHapticFeedback(IWindow window, int effectId, boolean always) {
- // pass for now.
- return false;
- }
- @Override
- public int relayout(IWindow arg0, int seq, LayoutParams arg1, int arg2, int arg3, int arg4,
- int arg4_5, Rect arg5Z, Rect arg5, Rect arg6, Rect arg7, Configuration arg7b,
- Surface arg8) throws RemoteException {
- // pass for now.
- return 0;
- }
-
- @Override
- public void performDeferredDestroy(IWindow window) {
- // pass for now.
- }
-
- @Override
- public boolean outOfMemory(IWindow window) throws RemoteException {
- return false;
- }
-
- @Override
- public void getDisplayFrame(IWindow window, Rect outDisplayFrame) {
- // pass for now.
- }
-
- @Override
- public void remove(IWindow arg0) throws RemoteException {
- // pass for now.
- }
-
- @Override
- public void setInTouchMode(boolean arg0) throws RemoteException {
- // pass for now.
- }
-
- @Override
- public void setTransparentRegion(IWindow arg0, Region arg1) throws RemoteException {
- // pass for now.
- }
-
- @Override
- public void setInsets(IWindow window, int touchable, Rect contentInsets,
- Rect visibleInsets, Region touchableRegion) {
- // pass for now.
- }
-
- @Override
- public IBinder prepareDrag(IWindow window, int flags,
- int thumbnailWidth, int thumbnailHeight, Surface outSurface)
- throws RemoteException {
- // pass for now
- return null;
- }
-
- @Override
- public boolean performDrag(IWindow window, IBinder dragToken,
- float touchX, float touchY, float thumbCenterX, float thumbCenterY,
- ClipData data)
- throws RemoteException {
- // pass for now
- return false;
- }
-
- @Override
- public void reportDropResult(IWindow window, boolean consumed) throws RemoteException {
- // pass for now
- }
-
- @Override
- public void dragRecipientEntered(IWindow window) throws RemoteException {
- // pass for now
- }
-
- @Override
- public void dragRecipientExited(IWindow window) throws RemoteException {
- // pass for now
- }
-
- @Override
- public void setWallpaperPosition(IBinder window, float x, float y,
- float xStep, float yStep) {
- // pass for now.
- }
-
- @Override
- public void wallpaperOffsetsComplete(IBinder window) {
- // pass for now.
- }
-
- @Override
- public Bundle sendWallpaperCommand(IBinder window, String action, int x, int y,
- int z, Bundle extras, boolean sync) {
- // pass for now.
- return null;
- }
-
- @Override
- public void wallpaperCommandComplete(IBinder window, Bundle result) {
- // pass for now.
- }
-
- @Override
- public void setUniverseTransform(IBinder window, float alpha, float offx, float offy,
- float dsdx, float dtdx, float dsdy, float dtdy) {
- // pass for now.
- }
-
- @Override
- public IBinder asBinder() {
- // pass for now.
- return null;
- }
-
- @Override
- public void onRectangleOnScreenRequested(IBinder window, Rect rectangle, boolean immediate) {
- // pass for now.
- }
-
- @Override
- public IWindowId getWindowId(IBinder window) throws RemoteException {
- // pass for now.
- return null;
- }
-}
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeXmlBlockParser.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeXmlBlockParser.java
deleted file mode 100644
index ac8712e..0000000
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeXmlBlockParser.java
+++ /dev/null
@@ -1,494 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.layoutlib.bridge.android;
-
-
-import com.android.ide.common.rendering.api.ILayoutPullParser;
-import com.android.layoutlib.bridge.impl.ParserFactory;
-
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-
-import android.content.res.XmlResourceParser;
-import android.util.AttributeSet;
-import android.util.BridgeXmlPullAttributes;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.Reader;
-
-/**
- * {@link BridgeXmlBlockParser} reimplements most of android.xml.XmlBlock.Parser.
- * It delegates to both an instance of {@link XmlPullParser} and an instance of
- * XmlPullAttributes (for the {@link AttributeSet} part).
- */
-public class BridgeXmlBlockParser implements XmlResourceParser {
-
- private final XmlPullParser mParser;
- private final BridgeXmlPullAttributes mAttrib;
- private final BridgeContext mContext;
- private final boolean mPlatformFile;
-
- private boolean mStarted = false;
- private int mEventType = START_DOCUMENT;
-
- private boolean mPopped = true; // default to true in case it's not pushed.
-
- /**
- * Builds a {@link BridgeXmlBlockParser}.
- * @param parser The XmlPullParser to get the content from.
- * @param context the Context.
- * @param platformFile Indicates whether the the file is a platform file or not.
- */
- public BridgeXmlBlockParser(XmlPullParser parser, BridgeContext context, boolean platformFile) {
- if (ParserFactory.LOG_PARSER) {
- System.out.println("CRTE " + parser.toString());
- }
-
- mParser = parser;
- mContext = context;
- mPlatformFile = platformFile;
- mAttrib = new BridgeXmlPullAttributes(parser, context, mPlatformFile);
-
- if (mContext != null) {
- mContext.pushParser(this);
- mPopped = false;
- }
- }
-
- public XmlPullParser getParser() {
- return mParser;
- }
-
- public boolean isPlatformFile() {
- return mPlatformFile;
- }
-
- public Object getViewCookie() {
- if (mParser instanceof ILayoutPullParser) {
- return ((ILayoutPullParser)mParser).getViewCookie();
- }
-
- return null;
- }
-
- public void ensurePopped() {
- if (mContext != null && mPopped == false) {
- mContext.popParser();
- mPopped = true;
- }
- }
-
- // ------- XmlResourceParser implementation
-
- @Override
- public void setFeature(String name, boolean state)
- throws XmlPullParserException {
- if (FEATURE_PROCESS_NAMESPACES.equals(name) && state) {
- return;
- }
- if (FEATURE_REPORT_NAMESPACE_ATTRIBUTES.equals(name) && state) {
- return;
- }
- throw new XmlPullParserException("Unsupported feature: " + name);
- }
-
- @Override
- public boolean getFeature(String name) {
- if (FEATURE_PROCESS_NAMESPACES.equals(name)) {
- return true;
- }
- if (FEATURE_REPORT_NAMESPACE_ATTRIBUTES.equals(name)) {
- return true;
- }
- return false;
- }
-
- @Override
- public void setProperty(String name, Object value) throws XmlPullParserException {
- throw new XmlPullParserException("setProperty() not supported");
- }
-
- @Override
- public Object getProperty(String name) {
- return null;
- }
-
- @Override
- public void setInput(Reader in) throws XmlPullParserException {
- mParser.setInput(in);
- }
-
- @Override
- public void setInput(InputStream inputStream, String inputEncoding)
- throws XmlPullParserException {
- mParser.setInput(inputStream, inputEncoding);
- }
-
- @Override
- public void defineEntityReplacementText(String entityName,
- String replacementText) throws XmlPullParserException {
- throw new XmlPullParserException(
- "defineEntityReplacementText() not supported");
- }
-
- @Override
- public String getNamespacePrefix(int pos) throws XmlPullParserException {
- throw new XmlPullParserException("getNamespacePrefix() not supported");
- }
-
- @Override
- public String getInputEncoding() {
- return null;
- }
-
- @Override
- public String getNamespace(String prefix) {
- throw new RuntimeException("getNamespace() not supported");
- }
-
- @Override
- public int getNamespaceCount(int depth) throws XmlPullParserException {
- throw new XmlPullParserException("getNamespaceCount() not supported");
- }
-
- @Override
- public String getPositionDescription() {
- return "Binary XML file line #" + getLineNumber();
- }
-
- @Override
- public String getNamespaceUri(int pos) throws XmlPullParserException {
- throw new XmlPullParserException("getNamespaceUri() not supported");
- }
-
- @Override
- public int getColumnNumber() {
- return -1;
- }
-
- @Override
- public int getDepth() {
- return mParser.getDepth();
- }
-
- @Override
- public String getText() {
- return mParser.getText();
- }
-
- @Override
- public int getLineNumber() {
- return mParser.getLineNumber();
- }
-
- @Override
- public int getEventType() {
- return mEventType;
- }
-
- @Override
- public boolean isWhitespace() throws XmlPullParserException {
- // Original comment: whitespace was stripped by aapt.
- return mParser.isWhitespace();
- }
-
- @Override
- public String getPrefix() {
- throw new RuntimeException("getPrefix not supported");
- }
-
- @Override
- public char[] getTextCharacters(int[] holderForStartAndLength) {
- String txt = getText();
- char[] chars = null;
- if (txt != null) {
- holderForStartAndLength[0] = 0;
- holderForStartAndLength[1] = txt.length();
- chars = new char[txt.length()];
- txt.getChars(0, txt.length(), chars, 0);
- }
- return chars;
- }
-
- @Override
- public String getNamespace() {
- return mParser.getNamespace();
- }
-
- @Override
- public String getName() {
- return mParser.getName();
- }
-
- @Override
- public String getAttributeNamespace(int index) {
- return mParser.getAttributeNamespace(index);
- }
-
- @Override
- public String getAttributeName(int index) {
- return mParser.getAttributeName(index);
- }
-
- @Override
- public String getAttributePrefix(int index) {
- throw new RuntimeException("getAttributePrefix not supported");
- }
-
- @Override
- public boolean isEmptyElementTag() {
- // XXX Need to detect this.
- return false;
- }
-
- @Override
- public int getAttributeCount() {
- return mParser.getAttributeCount();
- }
-
- @Override
- public String getAttributeValue(int index) {
- return mParser.getAttributeValue(index);
- }
-
- @Override
- public String getAttributeType(int index) {
- return "CDATA";
- }
-
- @Override
- public boolean isAttributeDefault(int index) {
- return false;
- }
-
- @Override
- public int nextToken() throws XmlPullParserException, IOException {
- return next();
- }
-
- @Override
- public String getAttributeValue(String namespace, String name) {
- return mParser.getAttributeValue(namespace, name);
- }
-
- @Override
- public int next() throws XmlPullParserException, IOException {
- if (!mStarted) {
- mStarted = true;
-
- if (ParserFactory.LOG_PARSER) {
- System.out.println("STRT " + mParser.toString());
- }
-
- return START_DOCUMENT;
- }
-
- int ev = mParser.next();
-
- if (ParserFactory.LOG_PARSER) {
- System.out.println("NEXT " + mParser.toString() + " " +
- eventTypeToString(mEventType) + " -> " + eventTypeToString(ev));
- }
-
- if (ev == END_TAG && mParser.getDepth() == 1) {
- // done with parser remove it from the context stack.
- ensurePopped();
-
- if (ParserFactory.LOG_PARSER) {
- System.out.println("");
- }
- }
-
- mEventType = ev;
- return ev;
- }
-
- public static String eventTypeToString(int eventType) {
- switch (eventType) {
- case START_DOCUMENT:
- return "START_DOC";
- case END_DOCUMENT:
- return "END_DOC";
- case START_TAG:
- return "START_TAG";
- case END_TAG:
- return "END_TAG";
- case TEXT:
- return "TEXT";
- case CDSECT:
- return "CDSECT";
- case ENTITY_REF:
- return "ENTITY_REF";
- case IGNORABLE_WHITESPACE:
- return "IGNORABLE_WHITESPACE";
- case PROCESSING_INSTRUCTION:
- return "PROCESSING_INSTRUCTION";
- case COMMENT:
- return "COMMENT";
- case DOCDECL:
- return "DOCDECL";
- }
-
- return "????";
- }
-
- @Override
- public void require(int type, String namespace, String name)
- throws XmlPullParserException {
- if (type != getEventType()
- || (namespace != null && !namespace.equals(getNamespace()))
- || (name != null && !name.equals(getName())))
- throw new XmlPullParserException("expected " + TYPES[type]
- + getPositionDescription());
- }
-
- @Override
- public String nextText() throws XmlPullParserException, IOException {
- if (getEventType() != START_TAG) {
- throw new XmlPullParserException(getPositionDescription()
- + ": parser must be on START_TAG to read next text", this,
- null);
- }
- int eventType = next();
- if (eventType == TEXT) {
- String result = getText();
- eventType = next();
- if (eventType != END_TAG) {
- throw new XmlPullParserException(
- getPositionDescription()
- + ": event TEXT it must be immediately followed by END_TAG",
- this, null);
- }
- return result;
- } else if (eventType == END_TAG) {
- return "";
- } else {
- throw new XmlPullParserException(getPositionDescription()
- + ": parser must be on START_TAG or TEXT to read text",
- this, null);
- }
- }
-
- @Override
- public int nextTag() throws XmlPullParserException, IOException {
- int eventType = next();
- if (eventType == TEXT && isWhitespace()) { // skip whitespace
- eventType = next();
- }
- if (eventType != START_TAG && eventType != END_TAG) {
- throw new XmlPullParserException(getPositionDescription()
- + ": expected start or end tag", this, null);
- }
- return eventType;
- }
-
- // AttributeSet implementation
-
-
- @Override
- public void close() {
- // pass
- }
-
- @Override
- public boolean getAttributeBooleanValue(int index, boolean defaultValue) {
- return mAttrib.getAttributeBooleanValue(index, defaultValue);
- }
-
- @Override
- public boolean getAttributeBooleanValue(String namespace, String attribute,
- boolean defaultValue) {
- return mAttrib.getAttributeBooleanValue(namespace, attribute, defaultValue);
- }
-
- @Override
- public float getAttributeFloatValue(int index, float defaultValue) {
- return mAttrib.getAttributeFloatValue(index, defaultValue);
- }
-
- @Override
- public float getAttributeFloatValue(String namespace, String attribute, float defaultValue) {
- return mAttrib.getAttributeFloatValue(namespace, attribute, defaultValue);
- }
-
- @Override
- public int getAttributeIntValue(int index, int defaultValue) {
- return mAttrib.getAttributeIntValue(index, defaultValue);
- }
-
- @Override
- public int getAttributeIntValue(String namespace, String attribute, int defaultValue) {
- return mAttrib.getAttributeIntValue(namespace, attribute, defaultValue);
- }
-
- @Override
- public int getAttributeListValue(int index, String[] options, int defaultValue) {
- return mAttrib.getAttributeListValue(index, options, defaultValue);
- }
-
- @Override
- public int getAttributeListValue(String namespace, String attribute,
- String[] options, int defaultValue) {
- return mAttrib.getAttributeListValue(namespace, attribute, options, defaultValue);
- }
-
- @Override
- public int getAttributeNameResource(int index) {
- return mAttrib.getAttributeNameResource(index);
- }
-
- @Override
- public int getAttributeResourceValue(int index, int defaultValue) {
- return mAttrib.getAttributeResourceValue(index, defaultValue);
- }
-
- @Override
- public int getAttributeResourceValue(String namespace, String attribute, int defaultValue) {
- return mAttrib.getAttributeResourceValue(namespace, attribute, defaultValue);
- }
-
- @Override
- public int getAttributeUnsignedIntValue(int index, int defaultValue) {
- return mAttrib.getAttributeUnsignedIntValue(index, defaultValue);
- }
-
- @Override
- public int getAttributeUnsignedIntValue(String namespace, String attribute, int defaultValue) {
- return mAttrib.getAttributeUnsignedIntValue(namespace, attribute, defaultValue);
- }
-
- @Override
- public String getClassAttribute() {
- return mAttrib.getClassAttribute();
- }
-
- @Override
- public String getIdAttribute() {
- return mAttrib.getIdAttribute();
- }
-
- @Override
- public int getIdAttributeResourceValue(int defaultValue) {
- return mAttrib.getIdAttributeResourceValue(defaultValue);
- }
-
- @Override
- public int getStyleAttribute() {
- return mAttrib.getStyleAttribute();
- }
-}
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/view/WindowManagerImpl.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/view/WindowManagerImpl.java
deleted file mode 100644
index 7e5ae8d..0000000
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/view/WindowManagerImpl.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright (C) 2012 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.layoutlib.bridge.android.view;
-
-import android.util.DisplayMetrics;
-import android.view.Display;
-import android.view.DisplayAdjustments;
-import android.view.DisplayInfo;
-import android.view.View;
-import android.view.WindowManager;
-
-public class WindowManagerImpl implements WindowManager {
-
- private final DisplayMetrics mMetrics;
- private final Display mDisplay;
-
- public WindowManagerImpl(DisplayMetrics metrics) {
- mMetrics = metrics;
-
- DisplayInfo info = new DisplayInfo();
- info.logicalHeight = mMetrics.heightPixels;
- info.logicalWidth = mMetrics.widthPixels;
- mDisplay = new Display(null, Display.DEFAULT_DISPLAY, info,
- DisplayAdjustments.DEFAULT_DISPLAY_ADJUSTMENTS);
- }
-
- @Override
- public Display getDefaultDisplay() {
- return mDisplay;
- }
-
-
- @Override
- public void addView(View arg0, android.view.ViewGroup.LayoutParams arg1) {
- // pass
- }
-
- @Override
- public void removeView(View arg0) {
- // pass
- }
-
- @Override
- public void updateViewLayout(View arg0, android.view.ViewGroup.LayoutParams arg1) {
- // pass
- }
-
-
- @Override
- public void removeViewImmediate(View arg0) {
- // pass
- }
-}
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/CustomBar.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/CustomBar.java
deleted file mode 100644
index 17b0eb6..0000000
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/CustomBar.java
+++ /dev/null
@@ -1,323 +0,0 @@
-/*
- * Copyright (C) 2011 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.layoutlib.bridge.bars;
-
-import com.android.ide.common.rendering.api.RenderResources;
-import com.android.ide.common.rendering.api.ResourceValue;
-import com.android.ide.common.rendering.api.StyleResourceValue;
-import com.android.layoutlib.bridge.Bridge;
-import com.android.layoutlib.bridge.android.BridgeContext;
-import com.android.layoutlib.bridge.android.BridgeXmlBlockParser;
-import com.android.layoutlib.bridge.impl.ParserFactory;
-import com.android.layoutlib.bridge.impl.ResourceHelper;
-import com.android.resources.Density;
-import com.android.resources.LayoutDirection;
-import com.android.resources.ResourceType;
-
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-
-import android.content.Context;
-import android.content.res.ColorStateList;
-import android.graphics.Bitmap;
-import android.graphics.Bitmap_Delegate;
-import android.graphics.drawable.BitmapDrawable;
-import android.graphics.drawable.Drawable;
-import android.util.TypedValue;
-import android.view.Gravity;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.widget.ImageView;
-import android.widget.LinearLayout;
-import android.widget.TextView;
-
-import java.io.IOException;
-import java.io.InputStream;
-
-/**
- * Base "bar" class for the window decor around the the edited layout.
- * This is basically an horizontal layout that loads a given layout on creation (it is read
- * through {@link Class#getResourceAsStream(String)}).
- *
- * The given layout should be a merge layout so that all the children belong to this class directly.
- *
- * It also provides a few utility methods to configure the content of the layout.
- */
-abstract class CustomBar extends LinearLayout {
-
- protected abstract TextView getStyleableTextView();
-
- protected CustomBar(Context context, Density density, int orientation, String layoutPath,
- String name) throws XmlPullParserException {
- super(context);
- setOrientation(orientation);
- if (orientation == LinearLayout.HORIZONTAL) {
- setGravity(Gravity.CENTER_VERTICAL);
- } else {
- setGravity(Gravity.CENTER_HORIZONTAL);
- }
-
- LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(
- Context.LAYOUT_INFLATER_SERVICE);
-
- XmlPullParser parser = ParserFactory.create(getClass().getResourceAsStream(layoutPath),
- name);
-
- BridgeXmlBlockParser bridgeParser = new BridgeXmlBlockParser(
- parser, (BridgeContext) context, false /*platformFile*/);
-
- try {
- inflater.inflate(bridgeParser, this, true);
- } finally {
- bridgeParser.ensurePopped();
- }
- }
-
- private InputStream getIcon(String iconName, Density[] densityInOut, LayoutDirection direction,
- String[] pathOut, boolean tryOtherDensities) {
- // current density
- Density density = densityInOut[0];
-
- // bitmap url relative to this class
- if (direction != null) {
- pathOut[0] = "/bars/" + direction.getResourceValue() + "-" + density.getResourceValue()
- + "/" + iconName;
- } else {
- pathOut[0] = "/bars/" + density.getResourceValue() + "/" + iconName;
- }
-
- InputStream stream = getClass().getResourceAsStream(pathOut[0]);
- if (stream == null && tryOtherDensities) {
- for (Density d : Density.values()) {
- if (d != density) {
- densityInOut[0] = d;
- stream = getIcon(iconName, densityInOut, direction, pathOut,
- false /*tryOtherDensities*/);
- if (stream != null) {
- return stream;
- }
- }
- }
- // couldn't find resource with direction qualifier. try without.
- if (direction != null) {
- return getIcon(iconName, densityInOut, null, pathOut, true);
- }
- }
-
- return stream;
- }
-
- protected void loadIcon(int index, String iconName, Density density) {
- loadIcon(index, iconName, density, false);
- }
-
- protected void loadIcon(int index, String iconName, Density density, boolean isRtl) {
- View child = getChildAt(index);
- if (child instanceof ImageView) {
- ImageView imageView = (ImageView) child;
-
- String[] pathOut = new String[1];
- Density[] densityInOut = new Density[] { density };
- LayoutDirection dir = isRtl ? LayoutDirection.RTL : LayoutDirection.LTR;
- InputStream stream = getIcon(iconName, densityInOut, dir, pathOut,
- true /*tryOtherDensities*/);
- density = densityInOut[0];
-
- if (stream != null) {
- // look for a cached bitmap
- Bitmap bitmap = Bridge.getCachedBitmap(pathOut[0], true /*isFramework*/);
- if (bitmap == null) {
- try {
- bitmap = Bitmap_Delegate.createBitmap(stream, false /*isMutable*/, density);
- Bridge.setCachedBitmap(pathOut[0], bitmap, true /*isFramework*/);
- } catch (IOException e) {
- return;
- }
- }
-
- if (bitmap != null) {
- BitmapDrawable drawable = new BitmapDrawable(getContext().getResources(),
- bitmap);
- imageView.setImageDrawable(drawable);
- }
- }
- }
- }
-
- protected void loadIcon(int index, String iconReference) {
- ResourceValue value = getResourceValue(iconReference);
- if (value != null) {
- loadIcon(index, value);
- }
- }
-
- protected void loadIconById(int id, String iconReference) {
- ResourceValue value = getResourceValue(iconReference);
- if (value != null) {
- loadIconById(id, value);
- }
- }
-
-
- protected Drawable loadIcon(int index, ResourceType type, String name) {
- BridgeContext bridgeContext = (BridgeContext) mContext;
- RenderResources res = bridgeContext.getRenderResources();
-
- // find the resource
- ResourceValue value = res.getFrameworkResource(type, name);
-
- // resolve it if needed
- value = res.resolveResValue(value);
- return loadIcon(index, value);
- }
-
- private Drawable loadIcon(int index, ResourceValue value) {
- View child = getChildAt(index);
- if (child instanceof ImageView) {
- ImageView imageView = (ImageView) child;
-
- return loadIcon(imageView, value);
- }
-
- return null;
- }
-
- private Drawable loadIconById(int id, ResourceValue value) {
- View child = findViewById(id);
- if (child instanceof ImageView) {
- ImageView imageView = (ImageView) child;
-
- return loadIcon(imageView, value);
- }
-
- return null;
- }
-
-
- private Drawable loadIcon(ImageView imageView, ResourceValue value) {
- Drawable drawable = ResourceHelper.getDrawable(value, (BridgeContext) mContext);
- if (drawable != null) {
- imageView.setImageDrawable(drawable);
- }
-
- return drawable;
- }
-
- protected TextView setText(int index, String stringReference) {
- View child = getChildAt(index);
- if (child instanceof TextView) {
- TextView textView = (TextView) child;
- setText(textView, stringReference);
- return textView;
- }
-
- return null;
- }
-
- protected TextView setTextById(int id, String stringReference) {
- View child = findViewById(id);
- if (child instanceof TextView) {
- TextView textView = (TextView) child;
- setText(textView, stringReference);
- return textView;
- }
-
- return null;
- }
-
- private void setText(TextView textView, String stringReference) {
- ResourceValue value = getResourceValue(stringReference);
- if (value != null) {
- textView.setText(value.getValue());
- } else {
- textView.setText(stringReference);
- }
- }
-
- protected void setStyle(String themeEntryName) {
-
- BridgeContext bridgeContext = (BridgeContext) mContext;
- RenderResources res = bridgeContext.getRenderResources();
-
- ResourceValue value = res.findItemInTheme(themeEntryName, true /*isFrameworkAttr*/);
- value = res.resolveResValue(value);
-
- if (value instanceof StyleResourceValue == false) {
- return;
- }
-
- StyleResourceValue style = (StyleResourceValue) value;
-
- // get the background
- ResourceValue backgroundValue = res.findItemInStyle(style, "background",
- true /*isFrameworkAttr*/);
- backgroundValue = res.resolveResValue(backgroundValue);
- if (backgroundValue != null) {
- Drawable d = ResourceHelper.getDrawable(backgroundValue, bridgeContext);
- if (d != null) {
- setBackground(d);
- }
- }
-
- TextView textView = getStyleableTextView();
- if (textView != null) {
- // get the text style
- ResourceValue textStyleValue = res.findItemInStyle(style, "titleTextStyle",
- true /*isFrameworkAttr*/);
- textStyleValue = res.resolveResValue(textStyleValue);
- if (textStyleValue instanceof StyleResourceValue) {
- StyleResourceValue textStyle = (StyleResourceValue) textStyleValue;
-
- ResourceValue textSize = res.findItemInStyle(textStyle, "textSize",
- true /*isFrameworkAttr*/);
- textSize = res.resolveResValue(textSize);
-
- if (textSize != null) {
- TypedValue out = new TypedValue();
- if (ResourceHelper.parseFloatAttribute("textSize", textSize.getValue(), out,
- true /*requireUnit*/)) {
- textView.setTextSize(
- out.getDimension(bridgeContext.getResources().getDisplayMetrics()));
- }
- }
-
-
- ResourceValue textColor = res.findItemInStyle(textStyle, "textColor",
- true /*isFrameworkAttr*/);
- textColor = res.resolveResValue(textColor);
- if (textColor != null) {
- ColorStateList stateList = ResourceHelper.getColorStateList(
- textColor, bridgeContext);
- if (stateList != null) {
- textView.setTextColor(stateList);
- }
- }
- }
- }
- }
-
- private ResourceValue getResourceValue(String reference) {
- BridgeContext bridgeContext = (BridgeContext) mContext;
- RenderResources res = bridgeContext.getRenderResources();
-
- // find the resource
- ResourceValue value = res.findResValue(reference, false /*isFramework*/);
-
- // resolve it if needed
- return res.resolveResValue(value);
- }
-}
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/FakeActionBar.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/FakeActionBar.java
deleted file mode 100644
index 226649d..0000000
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/FakeActionBar.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright (C) 2011 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.layoutlib.bridge.bars;
-
-import com.android.resources.Density;
-
-import org.xmlpull.v1.XmlPullParserException;
-
-import android.content.Context;
-import android.widget.LinearLayout;
-import android.widget.TextView;
-
-public class FakeActionBar extends CustomBar {
-
- private TextView mTextView;
-
- public FakeActionBar(Context context, Density density, String label, String icon)
- throws XmlPullParserException {
- super(context, density, LinearLayout.HORIZONTAL, "/bars/action_bar.xml", "action_bar.xml");
-
- // Cannot access the inside items through id because no R.id values have been
- // created for them.
- // We do know the order though.
- loadIconById(android.R.id.home, icon);
- mTextView = setText(1, label);
-
- setStyle("actionBarStyle");
- }
-
- @Override
- protected TextView getStyleableTextView() {
- return mTextView;
- }
-}
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/NavigationBar.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/NavigationBar.java
deleted file mode 100644
index 84e676e..0000000
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/NavigationBar.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright (C) 2011 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.layoutlib.bridge.bars;
-
-import com.android.resources.Density;
-import com.android.layoutlib.bridge.Bridge;
-
-import org.xmlpull.v1.XmlPullParserException;
-
-import android.content.Context;
-import android.widget.LinearLayout;
-import android.widget.TextView;
-
-public class NavigationBar extends CustomBar {
-
- public NavigationBar(Context context, Density density, int orientation, boolean isRtl,
- boolean rtlEnabled) throws XmlPullParserException {
- super(context, density, orientation, "/bars/navigation_bar.xml", "navigation_bar.xml");
-
- setBackgroundColor(0xFF000000);
-
- // Cannot access the inside items through id because no R.id values have been
- // created for them.
- // We do know the order though.
- // 0 is a spacer.
- int back = 1;
- int recent = 3;
- if (orientation == LinearLayout.VERTICAL || (isRtl && !rtlEnabled)) {
- // If RTL is enabled, then layoutlib mirrors the layout for us.
- back = 3;
- recent = 1;
- }
-
- loadIcon(back, "ic_sysbar_back.png", density, isRtl);
- loadIcon(2, "ic_sysbar_home.png", density, isRtl);
- loadIcon(recent, "ic_sysbar_recent.png", density, isRtl);
- }
-
- @Override
- protected TextView getStyleableTextView() {
- return null;
- }
-}
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/StatusBar.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/StatusBar.java
deleted file mode 100644
index 3692d96..0000000
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/StatusBar.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright (C) 2011 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.layoutlib.bridge.bars;
-
-import com.android.resources.Density;
-import com.android.resources.ResourceType;
-
-import org.xmlpull.v1.XmlPullParserException;
-
-import android.content.Context;
-import android.graphics.drawable.Drawable;
-import android.graphics.drawable.LevelListDrawable;
-import android.view.Gravity;
-import android.widget.LinearLayout;
-import android.widget.TextView;
-
-public class StatusBar extends CustomBar {
-
- public StatusBar(Context context, Density density, int direction, boolean RtlEnabled)
- throws XmlPullParserException {
- // FIXME: if direction is RTL but it's not enabled in application manifest, mirror this bar.
-
- super(context, density, LinearLayout.HORIZONTAL, "/bars/status_bar.xml", "status_bar.xml");
-
- // FIXME: use FILL_H?
- setGravity(Gravity.START | Gravity.TOP | Gravity.RIGHT);
- setBackgroundColor(0xFF000000);
-
- // Cannot access the inside items through id because no R.id values have been
- // created for them.
- // We do know the order though.
- // 0 is the spacer
- loadIcon(1, "stat_sys_wifi_signal_4_fully.png", density);
- loadIcon(2, "stat_sys_battery_charge_anim100.png", density);
- }
-
- @Override
- protected TextView getStyleableTextView() {
- return null;
- }
-}
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/TitleBar.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/TitleBar.java
deleted file mode 100644
index c27859f..0000000
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/TitleBar.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (C) 2011 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.layoutlib.bridge.bars;
-
-import com.android.resources.Density;
-
-import org.xmlpull.v1.XmlPullParserException;
-
-import android.content.Context;
-import android.widget.LinearLayout;
-import android.widget.TextView;
-
-public class TitleBar extends CustomBar {
-
- private TextView mTextView;
-
- public TitleBar(Context context, Density density, String label)
- throws XmlPullParserException {
- super(context, density, LinearLayout.HORIZONTAL, "/bars/title_bar.xml", "title_bar.xml");
-
- // Cannot access the inside items through id because no R.id values have been
- // created for them.
- // We do know the order though.
- mTextView = setText(0, label);
-
- setStyle("windowTitleBackgroundStyle");
- }
-
- @Override
- protected TextView getStyleableTextView() {
- return mTextView;
- }
-}
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/DelegateManager.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/DelegateManager.java
deleted file mode 100644
index ae1217d..0000000
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/DelegateManager.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.layoutlib.bridge.impl;
-
-import com.android.layoutlib.bridge.util.Debug;
-import com.android.layoutlib.bridge.util.SparseWeakArray;
-
-import android.util.SparseArray;
-
-import java.lang.ref.WeakReference;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Manages native delegates.
- *
- * This is used in conjunction with layoublib_create: certain Android java classes are mere
- * wrappers around a heavily native based implementation, and we need a way to run these classes
- * in our Eclipse rendering framework without bringing all the native code from the Android
- * platform.
- *
- * Thus we instruct layoutlib_create to modify the bytecode of these classes to replace their
- * native methods by "delegate calls".
- *
- * For example, a native method android.graphics.Matrix.init(...) will actually become
- * a call to android.graphics.Matrix_Delegate.init(...).
- *
- * The Android java classes that use native code uses an int (Java side) to reference native
- * objects. This int is generally directly the pointer to the C structure counterpart.
- * Typically a creation method will return such an int, and then this int will be passed later
- * to a Java method to identify the C object to manipulate.
- *
- * Since we cannot use the Java object reference as the int directly, DelegateManager manages the
- * int -> Delegate class link.
- *
- * Native methods usually always have the int as parameters. The first thing the delegate method
- * will do is call {@link #getDelegate(int)} to get the Java object matching the int.
- *
- * Typical native init methods are returning a new int back to the Java class, so
- * {@link #addNewDelegate(Object)} does the same.
- *
- * The JNI references are counted, so we do the same through a {@link WeakReference}. Because
- * the Java object needs to count as a reference (even though it only holds an int), we use the
- * following mechanism:
- *
- * - {@link #addNewDelegate(Object)} and {@link #removeJavaReferenceFor(int)} adds and removes
- * the delegate to/from a list. This list hold the reference and prevents the GC from reclaiming
- * the delegate.
- *
- * - {@link #addNewDelegate(Object)} also adds the delegate to a {@link SparseArray} that holds a
- * {@link WeakReference} to the delegate. This allows the delegate to be deleted automatically
- * when nothing references it. This means that any class that holds a delegate (except for the
- * Java main class) must not use the int but the Delegate class instead. The integers must
- * only be used in the API between the main Java class and the Delegate.
- *
- * @param <T> the delegate class to manage
- */
-public final class DelegateManager<T> {
- private final Class<T> mClass;
- private final SparseWeakArray<T> mDelegates = new SparseWeakArray<T>();
- /** list used to store delegates when their main object holds a reference to them.
- * This is to ensure that the WeakReference in the SparseWeakArray doesn't get GC'ed
- * @see #addNewDelegate(Object)
- * @see #removeJavaReferenceFor(int)
- */
- private final List<T> mJavaReferences = new ArrayList<T>();
- private int mDelegateCounter = 0;
-
- public DelegateManager(Class<T> theClass) {
- mClass = theClass;
- }
-
- /**
- * Returns the delegate from the given native int.
- * <p>
- * If the int is zero, then this will always return null.
- * <p>
- * If the int is non zero and the delegate is not found, this will throw an assert.
- *
- * @param native_object the native int.
- * @return the delegate or null if not found.
- */
- public T getDelegate(int native_object) {
- if (native_object > 0) {
- T delegate = mDelegates.get(native_object);
-
- if (Debug.DEBUG) {
- if (delegate == null) {
- System.out.println("Unknown " + mClass.getSimpleName() + " with int " +
- native_object);
- }
- }
-
- assert delegate != null;
- return delegate;
- }
- return null;
- }
-
- /**
- * Adds a delegate to the manager and returns the native int used to identify it.
- * @param newDelegate the delegate to add
- * @return a unique native int to identify the delegate
- */
- public int addNewDelegate(T newDelegate) {
- int native_object = ++mDelegateCounter;
- mDelegates.put(native_object, newDelegate);
- assert !mJavaReferences.contains(newDelegate);
- mJavaReferences.add(newDelegate);
-
- if (Debug.DEBUG) {
- System.out.println("New " + mClass.getSimpleName() + " with int " + native_object);
- }
-
- return native_object;
- }
-
- /**
- * Removes the main reference on the given delegate.
- * @param native_object the native integer representing the delegate.
- */
- public void removeJavaReferenceFor(int native_object) {
- T delegate = getDelegate(native_object);
-
- if (Debug.DEBUG) {
- System.out.println("Removing main Java ref on " + mClass.getSimpleName() +
- " with int " + native_object);
- }
-
- mJavaReferences.remove(delegate);
- }
-}
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/FontLoader.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/FontLoader.java
deleted file mode 100644
index 108b651..0000000
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/FontLoader.java
+++ /dev/null
@@ -1,396 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.layoutlib.bridge.impl;
-
-import org.xml.sax.Attributes;
-import org.xml.sax.SAXException;
-import org.xml.sax.helpers.DefaultHandler;
-
-import android.graphics.Typeface;
-
-import java.awt.Font;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.parsers.SAXParser;
-import javax.xml.parsers.SAXParserFactory;
-
-/**
- * Provides {@link Font} object to the layout lib.
- * <p/>
- * The fonts are loaded from the SDK directory. Family/style mapping is done by parsing the
- * fonts.xml file located alongside the ttf files.
- */
-public final class FontLoader {
- private static final String FONTS_SYSTEM = "system_fonts.xml";
- private static final String FONTS_VENDOR = "vendor_fonts.xml";
- private static final String FONTS_FALLBACK = "fallback_fonts.xml";
-
- private static final String NODE_FAMILYSET = "familyset";
- private static final String NODE_FAMILY = "family";
- private static final String NODE_NAME = "name";
- private static final String NODE_FILE = "file";
-
- private static final String ATTRIBUTE_VARIANT = "variant";
- private static final String ATTRIBUTE_VALUE_ELEGANT = "elegant";
- private static final String FONT_SUFFIX_NONE = ".ttf";
- private static final String FONT_SUFFIX_REGULAR = "-Regular.ttf";
- private static final String FONT_SUFFIX_BOLD = "-Bold.ttf";
- private static final String FONT_SUFFIX_ITALIC = "-Italic.ttf";
- private static final String FONT_SUFFIX_BOLDITALIC = "-BoldItalic.ttf";
-
- // This must match the values of Typeface styles so that we can use them for indices in this
- // array.
- private static final int[] AWT_STYLES = new int[] {
- Font.PLAIN,
- Font.BOLD,
- Font.ITALIC,
- Font.BOLD | Font.ITALIC
- };
- private static int[] DERIVE_BOLD_ITALIC = new int[] {
- Typeface.ITALIC, Typeface.BOLD, Typeface.NORMAL
- };
- private static int[] DERIVE_ITALIC = new int[] { Typeface.NORMAL };
- private static int[] DERIVE_BOLD = new int[] { Typeface.NORMAL };
-
- private static final List<FontInfo> mMainFonts = new ArrayList<FontInfo>();
- private static final List<FontInfo> mFallbackFonts = new ArrayList<FontInfo>();
-
- private final String mOsFontsLocation;
-
- public static FontLoader create(String fontOsLocation) {
- try {
- SAXParserFactory parserFactory = SAXParserFactory.newInstance();
- parserFactory.setNamespaceAware(true);
-
- // parse the system fonts
- FontHandler handler = parseFontFile(parserFactory, fontOsLocation, FONTS_SYSTEM);
- List<FontInfo> systemFonts = handler.getFontList();
-
-
- // parse the fallback fonts
- handler = parseFontFile(parserFactory, fontOsLocation, FONTS_FALLBACK);
- List<FontInfo> fallbackFonts = handler.getFontList();
-
- return new FontLoader(fontOsLocation, systemFonts, fallbackFonts);
- } catch (ParserConfigurationException e) {
- // return null below
- } catch (SAXException e) {
- // return null below
- } catch (FileNotFoundException e) {
- // return null below
- } catch (IOException e) {
- // return null below
- }
-
- return null;
- }
-
- private static FontHandler parseFontFile(SAXParserFactory parserFactory,
- String fontOsLocation, String fontFileName)
- throws ParserConfigurationException, SAXException, IOException, FileNotFoundException {
-
- SAXParser parser = parserFactory.newSAXParser();
- File f = new File(fontOsLocation, fontFileName);
-
- FontHandler definitionParser = new FontHandler(
- fontOsLocation + File.separator);
- parser.parse(new FileInputStream(f), definitionParser);
- return definitionParser;
- }
-
- private FontLoader(String fontOsLocation,
- List<FontInfo> fontList, List<FontInfo> fallBackList) {
- mOsFontsLocation = fontOsLocation;
- mMainFonts.addAll(fontList);
- mFallbackFonts.addAll(fallBackList);
- }
-
-
- public String getOsFontsLocation() {
- return mOsFontsLocation;
- }
-
- /**
- * Returns a {@link Font} object given a family name and a style value (constant in
- * {@link Typeface}).
- * @param family the family name
- * @param style a 1-item array containing the requested style. Based on the font being read
- * the actual style may be different. The array contains the actual style after
- * the method returns.
- * @return the font object or null if no match could be found.
- */
- public synchronized List<Font> getFont(String family, int style) {
- List<Font> result = new ArrayList<Font>();
-
- if (family == null) {
- return result;
- }
-
-
- // get the font objects from the main list based on family.
- for (FontInfo info : mMainFonts) {
- if (info.families.contains(family)) {
- result.add(info.font[style]);
- break;
- }
- }
-
- // add all the fallback fonts for the given style
- for (FontInfo info : mFallbackFonts) {
- result.add(info.font[style]);
- }
-
- return result;
- }
-
-
- public synchronized List<Font> getFallbackFonts(int style) {
- List<Font> result = new ArrayList<Font>();
- // add all the fallback fonts
- for (FontInfo info : mFallbackFonts) {
- result.add(info.font[style]);
- }
- return result;
- }
-
-
- private final static class FontInfo {
- final Font[] font = new Font[4]; // Matches the 4 type-face styles.
- final Set<String> families;
-
- FontInfo() {
- families = new HashSet<String>();
- }
- }
-
- private final static class FontHandler extends DefaultHandler {
- private final String mOsFontsLocation;
-
- private FontInfo mFontInfo = null;
- private final StringBuilder mBuilder = new StringBuilder();
- private List<FontInfo> mFontList = new ArrayList<FontInfo>();
- private boolean isCompactFont = true;
-
- private FontHandler(String osFontsLocation) {
- super();
- mOsFontsLocation = osFontsLocation;
- }
-
- public List<FontInfo> getFontList() {
- return mFontList;
- }
-
- /* (non-Javadoc)
- * @see org.xml.sax.helpers.DefaultHandler#startElement(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
- */
- @Override
- public void startElement(String uri, String localName, String name, Attributes attributes)
- throws SAXException {
- if (NODE_FAMILYSET.equals(localName)) {
- mFontList = new ArrayList<FontInfo>();
- } else if (NODE_FAMILY.equals(localName)) {
- if (mFontList != null) {
- mFontInfo = null;
- }
- } else if (NODE_NAME.equals(localName)) {
- if (mFontList != null && mFontInfo == null) {
- mFontInfo = new FontInfo();
- }
- } else if (NODE_FILE.equals(localName)) {
- if (mFontList != null && mFontInfo == null) {
- mFontInfo = new FontInfo();
- }
- if (ATTRIBUTE_VALUE_ELEGANT.equals(attributes.getValue(ATTRIBUTE_VARIANT))) {
- isCompactFont = false;
- } else {
- isCompactFont = true;
- }
- }
-
- mBuilder.setLength(0);
-
- super.startElement(uri, localName, name, attributes);
- }
-
- /* (non-Javadoc)
- * @see org.xml.sax.helpers.DefaultHandler#characters(char[], int, int)
- */
- @Override
- public void characters(char[] ch, int start, int length) throws SAXException {
- if (isCompactFont) {
- mBuilder.append(ch, start, length);
- }
- }
-
- /* (non-Javadoc)
- * @see org.xml.sax.helpers.DefaultHandler#endElement(java.lang.String, java.lang.String, java.lang.String)
- */
- @Override
- public void endElement(String uri, String localName, String name) throws SAXException {
- if (NODE_FAMILY.equals(localName)) {
- if (mFontInfo != null) {
- // if has a normal font file, add to the list
- if (mFontInfo.font[Typeface.NORMAL] != null) {
- mFontList.add(mFontInfo);
-
- // create missing font styles, order is important.
- if (mFontInfo.font[Typeface.BOLD_ITALIC] == null) {
- computeDerivedFont(Typeface.BOLD_ITALIC, DERIVE_BOLD_ITALIC);
- }
- if (mFontInfo.font[Typeface.ITALIC] == null) {
- computeDerivedFont(Typeface.ITALIC, DERIVE_ITALIC);
- }
- if (mFontInfo.font[Typeface.BOLD] == null) {
- computeDerivedFont(Typeface.BOLD, DERIVE_BOLD);
- }
- }
-
- mFontInfo = null;
- }
- } else if (NODE_NAME.equals(localName)) {
- // handle a new name for an existing Font Info
- if (mFontInfo != null) {
- String family = trimXmlWhitespaces(mBuilder.toString());
- mFontInfo.families.add(family);
- }
- } else if (NODE_FILE.equals(localName)) {
- // handle a new file for an existing Font Info
- if (isCompactFont && mFontInfo != null) {
- String fileName = trimXmlWhitespaces(mBuilder.toString());
- Font font = getFont(fileName);
- if (font != null) {
- if (fileName.endsWith(FONT_SUFFIX_REGULAR)) {
- mFontInfo.font[Typeface.NORMAL] = font;
- } else if (fileName.endsWith(FONT_SUFFIX_BOLD)) {
- mFontInfo.font[Typeface.BOLD] = font;
- } else if (fileName.endsWith(FONT_SUFFIX_ITALIC)) {
- mFontInfo.font[Typeface.ITALIC] = font;
- } else if (fileName.endsWith(FONT_SUFFIX_BOLDITALIC)) {
- mFontInfo.font[Typeface.BOLD_ITALIC] = font;
- } else if (fileName.endsWith(FONT_SUFFIX_NONE)) {
- mFontInfo.font[Typeface.NORMAL] = font;
- }
- }
- }
- }
- }
-
- private Font getFont(String fileName) {
- try {
- File file = new File(mOsFontsLocation, fileName);
- if (file.exists()) {
- return Font.createFont(Font.TRUETYPE_FONT, file);
- }
- } catch (Exception e) {
-
- }
-
- return null;
- }
-
- private void computeDerivedFont( int toCompute, int[] basedOnList) {
- for (int basedOn : basedOnList) {
- if (mFontInfo.font[basedOn] != null) {
- mFontInfo.font[toCompute] =
- mFontInfo.font[basedOn].deriveFont(AWT_STYLES[toCompute]);
- return;
- }
- }
-
- // we really shouldn't stop there. This means we don't have a NORMAL font...
- assert false;
- }
-
- private String trimXmlWhitespaces(String value) {
- if (value == null) {
- return null;
- }
-
- // look for carriage return and replace all whitespace around it by just 1 space.
- int index;
-
- while ((index = value.indexOf('\n')) != -1) {
- // look for whitespace on each side
- int left = index - 1;
- while (left >= 0) {
- if (Character.isWhitespace(value.charAt(left))) {
- left--;
- } else {
- break;
- }
- }
-
- int right = index + 1;
- int count = value.length();
- while (right < count) {
- if (Character.isWhitespace(value.charAt(right))) {
- right++;
- } else {
- break;
- }
- }
-
- // remove all between left and right (non inclusive) and replace by a single space.
- String leftString = null;
- if (left >= 0) {
- leftString = value.substring(0, left + 1);
- }
- String rightString = null;
- if (right < count) {
- rightString = value.substring(right);
- }
-
- if (leftString != null) {
- value = leftString;
- if (rightString != null) {
- value += " " + rightString;
- }
- } else {
- value = rightString != null ? rightString : "";
- }
- }
-
- // now we un-escape the string
- int length = value.length();
- char[] buffer = value.toCharArray();
-
- for (int i = 0 ; i < length ; i++) {
- if (buffer[i] == '\\') {
- if (buffer[i+1] == 'n') {
- // replace the char with \n
- buffer[i+1] = '\n';
- }
-
- // offset the rest of the buffer since we go from 2 to 1 char
- System.arraycopy(buffer, i+1, buffer, i, length - i - 1);
- length--;
- }
- }
-
- return new String(buffer, 0, length);
- }
-
- }
-}
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/GcSnapshot.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/GcSnapshot.java
deleted file mode 100644
index 21d6b1a..0000000
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/GcSnapshot.java
+++ /dev/null
@@ -1,803 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.layoutlib.bridge.impl;
-
-import com.android.ide.common.rendering.api.LayoutLog;
-import com.android.layoutlib.bridge.Bridge;
-
-import android.graphics.Bitmap_Delegate;
-import android.graphics.Canvas;
-import android.graphics.Paint;
-import android.graphics.Paint_Delegate;
-import android.graphics.Rect;
-import android.graphics.RectF;
-import android.graphics.Region;
-import android.graphics.Region_Delegate;
-import android.graphics.Shader_Delegate;
-import android.graphics.Xfermode_Delegate;
-
-import java.awt.AlphaComposite;
-import java.awt.Color;
-import java.awt.Composite;
-import java.awt.Graphics2D;
-import java.awt.RenderingHints;
-import java.awt.Shape;
-import java.awt.geom.AffineTransform;
-import java.awt.geom.Area;
-import java.awt.geom.Rectangle2D;
-import java.awt.image.BufferedImage;
-import java.util.ArrayList;
-
-/**
- * Class representing a graphics context snapshot, as well as a context stack as a linked list.
- * <p>
- * This is based on top of {@link Graphics2D} but can operate independently if none are available
- * yet when setting transforms and clip information.
- * <p>
- * This allows for drawing through {@link #draw(Drawable, Paint_Delegate)} and
- * {@link #draw(Drawable, Paint_Delegate)}
- *
- * Handling of layers (created with {@link Canvas#saveLayer(RectF, Paint, int)}) is handled through
- * a list of Graphics2D for each layers. The class actually maintains a list of {@link Layer}
- * for each layer. Doing a save() will duplicate this list so that each graphics2D object
- * ({@link Layer#getGraphics()}) is configured only for the new snapshot.
- */
-public class GcSnapshot {
-
- private final GcSnapshot mPrevious;
- private final int mFlags;
-
- /** list of layers. The first item in the list is always the */
- private final ArrayList<Layer> mLayers = new ArrayList<Layer>();
-
- /** temp transform in case transformation are set before a Graphics2D exists */
- private AffineTransform mTransform = null;
- /** temp clip in case clipping is set before a Graphics2D exists */
- private Area mClip = null;
-
- // local layer data
- /** a local layer created with {@link Canvas#saveLayer(RectF, Paint, int)}.
- * If this is null, this does not mean there's no layer, just that the snapshot is not the
- * one that created the layer.
- * @see #getLayerSnapshot()
- */
- private final Layer mLocalLayer;
- private final Paint_Delegate mLocalLayerPaint;
- private final Rect mLayerBounds;
-
- public interface Drawable {
- void draw(Graphics2D graphics, Paint_Delegate paint);
- }
-
- /**
- * Class containing information about a layer.
- *
- * This contains graphics, bitmap and layer information.
- */
- private static class Layer {
- private final Graphics2D mGraphics;
- private final Bitmap_Delegate mBitmap;
- private final BufferedImage mImage;
- /** the flags that were used to configure the layer. This is never changed, and passed
- * as is when {@link #makeCopy()} is called */
- private final int mFlags;
- /** the original content of the layer when the next object was created. This is not
- * passed in {@link #makeCopy()} and instead is recreated when a new layer is added
- * (depending on its flags) */
- private BufferedImage mOriginalCopy;
-
- /**
- * Creates a layer with a graphics and a bitmap. This is only used to create
- * the base layer.
- *
- * @param graphics the graphics
- * @param bitmap the bitmap
- */
- Layer(Graphics2D graphics, Bitmap_Delegate bitmap) {
- mGraphics = graphics;
- mBitmap = bitmap;
- mImage = mBitmap.getImage();
- mFlags = 0;
- }
-
- /**
- * Creates a layer with a graphics and an image. If the image belongs to a
- * {@link Bitmap_Delegate} (case of the base layer), then
- * {@link Layer#Layer(Graphics2D, Bitmap_Delegate)} should be used.
- *
- * @param graphics the graphics the new graphics for this layer
- * @param image the image the image from which the graphics came
- * @param flags the flags that were used to save this layer
- */
- Layer(Graphics2D graphics, BufferedImage image, int flags) {
- mGraphics = graphics;
- mBitmap = null;
- mImage = image;
- mFlags = flags;
- }
-
- /** The Graphics2D, guaranteed to be non null */
- Graphics2D getGraphics() {
- return mGraphics;
- }
-
- /** The BufferedImage, guaranteed to be non null */
- BufferedImage getImage() {
- return mImage;
- }
-
- /** Returns the layer save flags. This is only valid for additional layers.
- * For the base layer this will always return 0;
- * For a given layer, all further copies of this {@link Layer} object in new snapshots
- * will always return the same value.
- */
- int getFlags() {
- return mFlags;
- }
-
- Layer makeCopy() {
- if (mBitmap != null) {
- return new Layer((Graphics2D) mGraphics.create(), mBitmap);
- }
-
- return new Layer((Graphics2D) mGraphics.create(), mImage, mFlags);
- }
-
- /** sets an optional copy of the original content to be used during restore */
- void setOriginalCopy(BufferedImage image) {
- mOriginalCopy = image;
- }
-
- BufferedImage getOriginalCopy() {
- return mOriginalCopy;
- }
-
- void change() {
- if (mBitmap != null) {
- mBitmap.change();
- }
- }
-
- /**
- * Sets the clip for the graphics2D object associated with the layer.
- * This should be used over the normal Graphics2D setClip method.
- *
- * @param clipShape the shape to use a the clip shape.
- */
- void setClip(Shape clipShape) {
- // because setClip is only guaranteed to work with rectangle shape,
- // first reset the clip to max and then intersect the current (empty)
- // clip with the shap.
- mGraphics.setClip(null);
- mGraphics.clip(clipShape);
- }
-
- /**
- * Clips the layer with the given shape. This performs an intersect between the current
- * clip shape and the given shape.
- * @param shape the new clip shape.
- */
- public void clip(Shape shape) {
- mGraphics.clip(shape);
- }
- }
-
- /**
- * Creates the root snapshot associating it with a given bitmap.
- * <p>
- * If <var>bitmap</var> is null, then {@link GcSnapshot#setBitmap(Bitmap_Delegate)} must be
- * called before the snapshot can be used to draw. Transform and clip operations are permitted
- * before.
- *
- * @param image the image to associate to the snapshot or null.
- * @return the root snapshot
- */
- public static GcSnapshot createDefaultSnapshot(Bitmap_Delegate bitmap) {
- GcSnapshot snapshot = new GcSnapshot();
- if (bitmap != null) {
- snapshot.setBitmap(bitmap);
- }
-
- return snapshot;
- }
-
- /**
- * Saves the current state according to the given flags and returns the new current snapshot.
- * <p/>
- * This is the equivalent of {@link Canvas#save(int)}
- *
- * @param flags the save flags.
- * @return the new snapshot
- *
- * @see Canvas#save(int)
- */
- public GcSnapshot save(int flags) {
- return new GcSnapshot(this, null /*layerbounds*/, null /*paint*/, flags);
- }
-
- /**
- * Saves the current state and creates a new layer, and returns the new current snapshot.
- * <p/>
- * This is the equivalent of {@link Canvas#saveLayer(RectF, Paint, int)}
- *
- * @param layerBounds the layer bounds
- * @param paint the Paint information used to blit the layer back into the layers underneath
- * upon restore
- * @param flags the save flags.
- * @return the new snapshot
- *
- * @see Canvas#saveLayer(RectF, Paint, int)
- */
- public GcSnapshot saveLayer(RectF layerBounds, Paint_Delegate paint, int flags) {
- return new GcSnapshot(this, layerBounds, paint, flags);
- }
-
- /**
- * Creates the root snapshot.
- * {@link #setGraphics2D(Graphics2D)} will have to be called on it when possible.
- */
- private GcSnapshot() {
- mPrevious = null;
- mFlags = 0;
- mLocalLayer = null;
- mLocalLayerPaint = null;
- mLayerBounds = null;
- }
-
- /**
- * Creates a new {@link GcSnapshot} on top of another one, with a layer data to be restored
- * into the main graphics when {@link #restore()} is called.
- *
- * @param previous the previous snapshot head.
- * @param layerBounds the region of the layer. Optional, if null, this is a normal save()
- * @param paint the Paint information used to blit the layer back into the layers underneath
- * upon restore
- * @param flags the flags regarding what should be saved.
- */
- private GcSnapshot(GcSnapshot previous, RectF layerBounds, Paint_Delegate paint, int flags) {
- assert previous != null;
- mPrevious = previous;
- mFlags = flags;
-
- // make a copy of the current layers before adding the new one.
- // This keeps the same BufferedImage reference but creates new Graphics2D for this
- // snapshot.
- // It does not copy whatever original copy the layers have, as they will be done
- // only if the new layer doesn't clip drawing to itself.
- for (Layer layer : mPrevious.mLayers) {
- mLayers.add(layer.makeCopy());
- }
-
- if (layerBounds != null) {
- // get the current transform
- AffineTransform matrix = mLayers.get(0).getGraphics().getTransform();
-
- // transform the layerBounds with the current transform and stores it into a int rect
- RectF rect2 = new RectF();
- mapRect(matrix, rect2, layerBounds);
- mLayerBounds = new Rect();
- rect2.round(mLayerBounds);
-
- // get the base layer (always at index 0)
- Layer baseLayer = mLayers.get(0);
-
- // create the image for the layer
- BufferedImage layerImage = new BufferedImage(
- baseLayer.getImage().getWidth(),
- baseLayer.getImage().getHeight(),
- (mFlags & Canvas.HAS_ALPHA_LAYER_SAVE_FLAG) != 0 ?
- BufferedImage.TYPE_INT_ARGB :
- BufferedImage.TYPE_INT_RGB);
-
- // create a graphics for it so that drawing can be done.
- Graphics2D layerGraphics = layerImage.createGraphics();
-
- // because this layer inherits the current context for transform and clip,
- // set them to one from the base layer.
- AffineTransform currentMtx = baseLayer.getGraphics().getTransform();
- layerGraphics.setTransform(currentMtx);
-
- // create a new layer for this new layer and add it to the list at the end.
- mLayers.add(mLocalLayer = new Layer(layerGraphics, layerImage, flags));
-
- // set the clip on it.
- Shape currentClip = baseLayer.getGraphics().getClip();
- mLocalLayer.setClip(currentClip);
-
- // if the drawing is not clipped to the local layer only, we save the current content
- // of all other layers. We are only interested in the part that will actually
- // be drawn, so we create as small bitmaps as we can.
- // This is so that we can erase the drawing that goes in the layers below that will
- // be coming from the layer itself.
- if ((mFlags & Canvas.CLIP_TO_LAYER_SAVE_FLAG) == 0) {
- int w = mLayerBounds.width();
- int h = mLayerBounds.height();
- for (int i = 0 ; i < mLayers.size() - 1 ; i++) {
- Layer layer = mLayers.get(i);
- BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
- Graphics2D graphics = image.createGraphics();
- graphics.drawImage(layer.getImage(),
- 0, 0, w, h,
- mLayerBounds.left, mLayerBounds.top,
- mLayerBounds.right, mLayerBounds.bottom,
- null);
- graphics.dispose();
- layer.setOriginalCopy(image);
- }
- }
- } else {
- mLocalLayer = null;
- mLayerBounds = null;
- }
-
- mLocalLayerPaint = paint;
- }
-
- public void dispose() {
- for (Layer layer : mLayers) {
- layer.getGraphics().dispose();
- }
-
- if (mPrevious != null) {
- mPrevious.dispose();
- }
- }
-
- /**
- * Restores the top {@link GcSnapshot}, and returns the next one.
- */
- public GcSnapshot restore() {
- return doRestore();
- }
-
- /**
- * Restores the {@link GcSnapshot} to <var>saveCount</var>.
- * @param saveCount the saveCount or -1 to only restore 1.
- *
- * @return the new head of the Gc snapshot stack.
- */
- public GcSnapshot restoreTo(int saveCount) {
- return doRestoreTo(size(), saveCount);
- }
-
- public int size() {
- if (mPrevious != null) {
- return mPrevious.size() + 1;
- }
-
- return 1;
- }
-
- /**
- * Link the snapshot to a Bitmap_Delegate.
- * <p/>
- * This is only for the case where the snapshot was created with a null image when calling
- * {@link #createDefaultSnapshot(Bitmap_Delegate)}, and is therefore not yet linked to
- * a previous snapshot.
- * <p/>
- * If any transform or clip information was set before, they are put into the Graphics object.
- * @param bitmap the bitmap to link to.
- */
- public void setBitmap(Bitmap_Delegate bitmap) {
- // create a new Layer for the bitmap. This will be the base layer.
- Graphics2D graphics2D = bitmap.getImage().createGraphics();
- Layer baseLayer = new Layer(graphics2D, bitmap);
-
- // Set the current transform and clip which can either come from mTransform/mClip if they
- // were set when there was no bitmap/layers or from the current base layers if there is
- // one already.
-
- graphics2D.setTransform(getTransform());
- // reset mTransform in case there was one.
- mTransform = null;
-
- baseLayer.setClip(getClip());
- // reset mClip in case there was one.
- mClip = null;
-
- // replace whatever current layers we have with this.
- mLayers.clear();
- mLayers.add(baseLayer);
-
- }
-
- public void translate(float dx, float dy) {
- if (mLayers.size() > 0) {
- for (Layer layer : mLayers) {
- layer.getGraphics().translate(dx, dy);
- }
- } else {
- if (mTransform == null) {
- mTransform = new AffineTransform();
- }
- mTransform.translate(dx, dy);
- }
- }
-
- public void rotate(double radians) {
- if (mLayers.size() > 0) {
- for (Layer layer : mLayers) {
- layer.getGraphics().rotate(radians);
- }
- } else {
- if (mTransform == null) {
- mTransform = new AffineTransform();
- }
- mTransform.rotate(radians);
- }
- }
-
- public void scale(float sx, float sy) {
- if (mLayers.size() > 0) {
- for (Layer layer : mLayers) {
- layer.getGraphics().scale(sx, sy);
- }
- } else {
- if (mTransform == null) {
- mTransform = new AffineTransform();
- }
- mTransform.scale(sx, sy);
- }
- }
-
- public AffineTransform getTransform() {
- if (mLayers.size() > 0) {
- // all graphics2D in the list have the same transform
- return mLayers.get(0).getGraphics().getTransform();
- } else {
- if (mTransform == null) {
- mTransform = new AffineTransform();
- }
- return mTransform;
- }
- }
-
- public void setTransform(AffineTransform transform) {
- if (mLayers.size() > 0) {
- for (Layer layer : mLayers) {
- layer.getGraphics().setTransform(transform);
- }
- } else {
- if (mTransform == null) {
- mTransform = new AffineTransform();
- }
- mTransform.setTransform(transform);
- }
- }
-
- public boolean clip(Shape shape, int regionOp) {
- // Simple case of intersect with existing layers.
- // Because Graphics2D#setClip works a bit peculiarly, we optimize
- // the case of clipping by intersection, as it's supported natively.
- if (regionOp == Region.Op.INTERSECT.nativeInt && mLayers.size() > 0) {
- for (Layer layer : mLayers) {
- layer.clip(shape);
- }
-
- Shape currentClip = getClip();
- return currentClip != null && currentClip.getBounds().isEmpty() == false;
- }
-
- Area area = null;
-
- if (regionOp == Region.Op.REPLACE.nativeInt) {
- area = new Area(shape);
- } else {
- area = Region_Delegate.combineShapes(getClip(), shape, regionOp);
- }
-
- assert area != null;
-
- if (mLayers.size() > 0) {
- if (area != null) {
- for (Layer layer : mLayers) {
- layer.setClip(area);
- }
- }
-
- Shape currentClip = getClip();
- return currentClip != null && currentClip.getBounds().isEmpty() == false;
- } else {
- if (area != null) {
- mClip = area;
- } else {
- mClip = new Area();
- }
-
- return mClip.getBounds().isEmpty() == false;
- }
- }
-
- public boolean clipRect(float left, float top, float right, float bottom, int regionOp) {
- return clip(new Rectangle2D.Float(left, top, right - left, bottom - top), regionOp);
- }
-
- /**
- * Returns the current clip, or null if none have been setup.
- */
- public Shape getClip() {
- if (mLayers.size() > 0) {
- // they all have the same clip
- return mLayers.get(0).getGraphics().getClip();
- } else {
- return mClip;
- }
- }
-
- private GcSnapshot doRestoreTo(int size, int saveCount) {
- if (size <= saveCount) {
- return this;
- }
-
- // restore the current one first.
- GcSnapshot previous = doRestore();
-
- if (size == saveCount + 1) { // this was the only one that needed restore.
- return previous;
- } else {
- return previous.doRestoreTo(size - 1, saveCount);
- }
- }
-
- /**
- * Executes the Drawable's draw method, with a null paint delegate.
- * <p/>
- * Note that the method can be called several times if there are more than one active layer.
- * @param drawable
- */
- public void draw(Drawable drawable) {
- draw(drawable, null, false /*compositeOnly*/, false /*forceSrcMode*/);
- }
-
- /**
- * Executes the Drawable's draw method.
- * <p/>
- * Note that the method can be called several times if there are more than one active layer.
- * @param drawable
- * @param paint
- * @param compositeOnly whether the paint is used for composite only. This is typically
- * the case for bitmaps.
- * @param forceSrcMode if true, this overrides the composite to be SRC
- */
- public void draw(Drawable drawable, Paint_Delegate paint, boolean compositeOnly,
- boolean forceSrcMode) {
- // the current snapshot may not have a mLocalLayer (ie it was created on save() instead
- // of saveLayer(), but that doesn't mean there's no layer.
- // mLayers however saves all the information we need (flags).
- if (mLayers.size() == 1) {
- // no layer, only base layer. easy case.
- drawInLayer(mLayers.get(0), drawable, paint, compositeOnly, forceSrcMode);
- } else {
- // draw in all the layers until the layer save flags tells us to stop (ie drawing
- // in that layer is limited to the layer itself.
- int flags;
- int i = mLayers.size() - 1;
-
- do {
- Layer layer = mLayers.get(i);
-
- drawInLayer(layer, drawable, paint, compositeOnly, forceSrcMode);
-
- // then go to previous layer, only if there are any left, and its flags
- // doesn't restrict drawing to the layer itself.
- i--;
- flags = layer.getFlags();
- } while (i >= 0 && (flags & Canvas.CLIP_TO_LAYER_SAVE_FLAG) == 0);
- }
- }
-
- private void drawInLayer(Layer layer, Drawable drawable, Paint_Delegate paint,
- boolean compositeOnly, boolean forceSrcMode) {
- Graphics2D originalGraphics = layer.getGraphics();
- // get a Graphics2D object configured with the drawing parameters.
- Graphics2D configuredGraphics2D =
- paint != null ?
- createCustomGraphics(originalGraphics, paint, compositeOnly, forceSrcMode) :
- (Graphics2D) originalGraphics.create();
-
- try {
- drawable.draw(configuredGraphics2D, paint);
- layer.change();
- } finally {
- // dispose Graphics2D object
- configuredGraphics2D.dispose();
- }
- }
-
- private GcSnapshot doRestore() {
- if (mPrevious != null) {
- if (mLocalLayer != null) {
- // prepare to blit the layers in which we have draw, in the layer beneath
- // them, starting with the top one (which is the current local layer).
- int i = mLayers.size() - 1;
- int flags;
- do {
- Layer dstLayer = mLayers.get(i - 1);
-
- restoreLayer(dstLayer);
-
- flags = dstLayer.getFlags();
- i--;
- } while (i > 0 && (flags & Canvas.CLIP_TO_LAYER_SAVE_FLAG) == 0);
- }
-
- // if this snapshot does not save everything, then set the previous snapshot
- // to this snapshot content
-
- // didn't save the matrix? set the current matrix on the previous snapshot
- if ((mFlags & Canvas.MATRIX_SAVE_FLAG) == 0) {
- AffineTransform mtx = getTransform();
- for (Layer layer : mPrevious.mLayers) {
- layer.getGraphics().setTransform(mtx);
- }
- }
-
- // didn't save the clip? set the current clip on the previous snapshot
- if ((mFlags & Canvas.CLIP_SAVE_FLAG) == 0) {
- Shape clip = getClip();
- for (Layer layer : mPrevious.mLayers) {
- layer.setClip(clip);
- }
- }
- }
-
- for (Layer layer : mLayers) {
- layer.getGraphics().dispose();
- }
-
- return mPrevious;
- }
-
- private void restoreLayer(Layer dstLayer) {
-
- Graphics2D baseGfx = dstLayer.getImage().createGraphics();
-
- // if the layer contains an original copy this means the flags
- // didn't restrict drawing to the local layer and we need to make sure the
- // layer bounds in the layer beneath didn't receive any drawing.
- // so we use the originalCopy to erase the new drawings in there.
- BufferedImage originalCopy = dstLayer.getOriginalCopy();
- if (originalCopy != null) {
- Graphics2D g = (Graphics2D) baseGfx.create();
- g.setComposite(AlphaComposite.Src);
-
- g.drawImage(originalCopy,
- mLayerBounds.left, mLayerBounds.top, mLayerBounds.right, mLayerBounds.bottom,
- 0, 0, mLayerBounds.width(), mLayerBounds.height(),
- null);
- g.dispose();
- }
-
- // now draw put the content of the local layer onto the layer,
- // using the paint information
- Graphics2D g = createCustomGraphics(baseGfx, mLocalLayerPaint,
- true /*alphaOnly*/, false /*forceSrcMode*/);
-
- g.drawImage(mLocalLayer.getImage(),
- mLayerBounds.left, mLayerBounds.top, mLayerBounds.right, mLayerBounds.bottom,
- mLayerBounds.left, mLayerBounds.top, mLayerBounds.right, mLayerBounds.bottom,
- null);
- g.dispose();
-
- baseGfx.dispose();
- }
-
- /**
- * Creates a new {@link Graphics2D} based on the {@link Paint} parameters.
- * <p/>The object must be disposed ({@link Graphics2D#dispose()}) after being used.
- */
- private Graphics2D createCustomGraphics(Graphics2D original, Paint_Delegate paint,
- boolean compositeOnly, boolean forceSrcMode) {
- // make new one graphics
- Graphics2D g = (Graphics2D) original.create();
-
- // configure it
-
- if (paint.isAntiAliased()) {
- g.setRenderingHint(
- RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
- g.setRenderingHint(
- RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
- }
-
- boolean customShader = false;
-
- // get the shader first, as it'll replace the color if it can be used it.
- if (compositeOnly == false) {
- Shader_Delegate shaderDelegate = paint.getShader();
- if (shaderDelegate != null) {
- if (shaderDelegate.isSupported()) {
- java.awt.Paint shaderPaint = shaderDelegate.getJavaPaint();
- assert shaderPaint != null;
- if (shaderPaint != null) {
- g.setPaint(shaderPaint);
- customShader = true;
- }
- } else {
- Bridge.getLog().fidelityWarning(LayoutLog.TAG_SHADER,
- shaderDelegate.getSupportMessage(),
- null /*throwable*/, null /*data*/);
- }
- }
-
- // if no shader, use the paint color
- if (customShader == false) {
- g.setColor(new Color(paint.getColor(), true /*hasAlpha*/));
- }
-
- // set the stroke
- g.setStroke(paint.getJavaStroke());
- }
-
- // the alpha for the composite. Always opaque if the normal paint color is used since
- // it contains the alpha
- int alpha = (compositeOnly || customShader) ? paint.getAlpha() : 0xFF;
-
- if (forceSrcMode) {
- g.setComposite(AlphaComposite.getInstance(
- AlphaComposite.SRC, (float) alpha / 255.f));
- } else {
- boolean customXfermode = false;
- Xfermode_Delegate xfermodeDelegate = paint.getXfermode();
- if (xfermodeDelegate != null) {
- if (xfermodeDelegate.isSupported()) {
- Composite composite = xfermodeDelegate.getComposite(alpha);
- assert composite != null;
- if (composite != null) {
- g.setComposite(composite);
- customXfermode = true;
- }
- } else {
- Bridge.getLog().fidelityWarning(LayoutLog.TAG_XFERMODE,
- xfermodeDelegate.getSupportMessage(),
- null /*throwable*/, null /*data*/);
- }
- }
-
- // if there was no custom xfermode, but we have alpha (due to a shader and a non
- // opaque alpha channel in the paint color), then we create an AlphaComposite anyway
- // that will handle the alpha.
- if (customXfermode == false && alpha != 0xFF) {
- g.setComposite(AlphaComposite.getInstance(
- AlphaComposite.SRC_OVER, (float) alpha / 255.f));
- }
- }
-
- return g;
- }
-
- private void mapRect(AffineTransform matrix, RectF dst, RectF src) {
- // array with 4 corners
- float[] corners = new float[] {
- src.left, src.top,
- src.right, src.top,
- src.right, src.bottom,
- src.left, src.bottom,
- };
-
- // apply the transform to them.
- matrix.transform(corners, 0, corners, 0, 4);
-
- // now put the result in the rect. We take the min/max of Xs and min/max of Ys
- dst.left = Math.min(Math.min(corners[0], corners[2]), Math.min(corners[4], corners[6]));
- dst.right = Math.max(Math.max(corners[0], corners[2]), Math.max(corners[4], corners[6]));
-
- dst.top = Math.min(Math.min(corners[1], corners[3]), Math.min(corners[5], corners[7]));
- dst.bottom = Math.max(Math.max(corners[1], corners[3]), Math.max(corners[5], corners[7]));
- }
-
-}
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/ParserFactory.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/ParserFactory.java
deleted file mode 100644
index 803849f..0000000
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/ParserFactory.java
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * Copyright (C) 2011 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.layoutlib.bridge.impl;
-
-
-import org.kxml2.io.KXmlParser;
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-
-import java.io.BufferedInputStream;
-import java.io.ByteArrayInputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-
-/**
- * A factory for {@link XmlPullParser}.
- *
- */
-public class ParserFactory {
-
- private final static String ENCODING = "UTF-8"; //$NON-NLS-1$
-
- public final static boolean LOG_PARSER = false;
-
- public static XmlPullParser create(File f)
- throws XmlPullParserException, FileNotFoundException {
- InputStream stream = new FileInputStream(f);
- return create(stream, f.getName(), f.length());
- }
-
- public static XmlPullParser create(InputStream stream, String name)
- throws XmlPullParserException {
- return create(stream, name, -1);
- }
-
- private static XmlPullParser create(InputStream stream, String name, long size)
- throws XmlPullParserException {
- KXmlParser parser = instantiateParser(name);
-
- stream = readAndClose(stream, name, size);
-
- parser.setInput(stream, ENCODING);
- return parser;
- }
-
- private static KXmlParser instantiateParser(String name) throws XmlPullParserException {
- KXmlParser parser;
- if (name != null) {
- parser = new CustomParser(name);
- } else {
- parser = new KXmlParser();
- }
- parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
- return parser;
- }
-
- private static InputStream readAndClose(InputStream stream, String name, long size)
- throws XmlPullParserException {
- // just a sanity check. It's doubtful we'll have such big files!
- if (size > Integer.MAX_VALUE) {
- throw new XmlPullParserException("File " + name + " is too big to be parsed");
- }
- int intSize = (int) size;
-
- // create a buffered reader to facilitate reading.
- BufferedInputStream bufferedStream = new BufferedInputStream(stream);
- try {
- int avail;
- if (intSize != -1) {
- avail = intSize;
- } else {
- // get the size to read.
- avail = bufferedStream.available();
- }
-
- // create the initial buffer and read it.
- byte[] buffer = new byte[avail];
- int read = stream.read(buffer);
-
- // this is the easy case.
- if (read == intSize) {
- return new ByteArrayInputStream(buffer);
- }
-
- // check if there is more to read (read() does not necessarily read all that
- // available() returned!)
- while ((avail = bufferedStream.available()) > 0) {
- if (read + avail > buffer.length) {
- // just allocate what is needed. We're mostly reading small files
- // so it shouldn't be too problematic.
- byte[] moreBuffer = new byte[read + avail];
- System.arraycopy(buffer, 0, moreBuffer, 0, read);
- buffer = moreBuffer;
- }
-
- read += stream.read(buffer, read, avail);
- }
-
- // return a new stream encapsulating this buffer.
- return new ByteArrayInputStream(buffer);
-
- } catch (IOException e) {
- throw new XmlPullParserException("Failed to read " + name, null, e);
- } finally {
- try {
- bufferedStream.close();
- } catch (IOException e) {
- }
- }
- }
-
- private static class CustomParser extends KXmlParser {
- private final String mName;
-
- CustomParser(String name) {
- super();
- mName = name;
- }
-
- @Override
- public String toString() {
- return mName;
- }
- }
-}
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/PlayAnimationThread.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/PlayAnimationThread.java
deleted file mode 100644
index 7b70180..0000000
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/PlayAnimationThread.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.layoutlib.bridge.impl;
-
-import com.android.ide.common.rendering.api.IAnimationListener;
-import com.android.ide.common.rendering.api.Result;
-import com.android.ide.common.rendering.api.Result.Status;
-
-import android.animation.AnimationThread;
-import android.animation.Animator;
-
-public class PlayAnimationThread extends AnimationThread {
-
- private final Animator mAnimator;
-
- public PlayAnimationThread(Animator animator, RenderSessionImpl scene, String animName,
- IAnimationListener listener) {
- super(scene, animName, listener);
- mAnimator = animator;
- }
-
- @Override
- public Result preAnimation() {
- // start the animation. This will send a message to the handler right away, so
- // the queue is filled when this method returns.
- mAnimator.start();
-
- return Status.SUCCESS.createResult();
- }
-
- @Override
- public void postAnimation() {
- // nothing to be done.
- }
-}
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderAction.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderAction.java
deleted file mode 100644
index 23d08e3..0000000
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderAction.java
+++ /dev/null
@@ -1,390 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.layoutlib.bridge.impl;
-
-import static com.android.ide.common.rendering.api.Result.Status.ERROR_LOCK_INTERRUPTED;
-import static com.android.ide.common.rendering.api.Result.Status.ERROR_TIMEOUT;
-import static com.android.ide.common.rendering.api.Result.Status.SUCCESS;
-
-import com.android.ide.common.rendering.api.HardwareConfig;
-import com.android.ide.common.rendering.api.LayoutLog;
-import com.android.ide.common.rendering.api.RenderParams;
-import com.android.ide.common.rendering.api.RenderResources;
-import com.android.ide.common.rendering.api.RenderResources.FrameworkResourceIdProvider;
-import com.android.ide.common.rendering.api.Result;
-import com.android.layoutlib.bridge.Bridge;
-import com.android.layoutlib.bridge.android.BridgeContext;
-import com.android.resources.Density;
-import com.android.resources.ResourceType;
-import com.android.resources.ScreenOrientation;
-import com.android.resources.ScreenSize;
-
-import android.content.res.Configuration;
-import android.os.HandlerThread_Delegate;
-import android.os.Looper;
-import android.util.DisplayMetrics;
-import android.view.ViewConfiguration_Accessor;
-import android.view.inputmethod.InputMethodManager;
-import android.view.inputmethod.InputMethodManager_Accessor;
-
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.locks.ReentrantLock;
-
-/**
- * Base class for rendering action.
- *
- * It provides life-cycle methods to init and stop the rendering.
- * The most important methods are:
- * {@link #init(long)} and {@link #acquire(long)} to start a rendering and {@link #release()}
- * after the rendering.
- *
- *
- * @param <T> the {@link RenderParams} implementation
- *
- */
-public abstract class RenderAction<T extends RenderParams> extends FrameworkResourceIdProvider {
-
- /**
- * The current context being rendered. This is set through {@link #acquire(long)} and
- * {@link #init(long)}, and unset in {@link #release()}.
- */
- private static BridgeContext sCurrentContext = null;
-
- private final T mParams;
-
- private BridgeContext mContext;
-
- /**
- * Creates a renderAction.
- * <p>
- * This <b>must</b> be followed by a call to {@link RenderAction#init()}, which act as a
- * call to {@link RenderAction#acquire(long)}
- *
- * @param params the RenderParams. This must be a copy that the action can keep
- *
- */
- protected RenderAction(T params) {
- mParams = params;
- }
-
- /**
- * Initializes and acquires the scene, creating various Android objects such as context,
- * inflater, and parser.
- *
- * @param timeout the time to wait if another rendering is happening.
- *
- * @return whether the scene was prepared
- *
- * @see #acquire(long)
- * @see #release()
- */
- public Result init(long timeout) {
- // acquire the lock. if the result is null, lock was just acquired, otherwise, return
- // the result.
- Result result = acquireLock(timeout);
- if (result != null) {
- return result;
- }
-
- HardwareConfig hardwareConfig = mParams.getHardwareConfig();
-
- // setup the display Metrics.
- DisplayMetrics metrics = new DisplayMetrics();
- metrics.densityDpi = metrics.noncompatDensityDpi =
- hardwareConfig.getDensity().getDpiValue();
-
- metrics.density = metrics.noncompatDensity =
- metrics.densityDpi / (float) DisplayMetrics.DENSITY_DEFAULT;
-
- metrics.scaledDensity = metrics.noncompatScaledDensity = metrics.density;
-
- metrics.widthPixels = metrics.noncompatWidthPixels = hardwareConfig.getScreenWidth();
- metrics.heightPixels = metrics.noncompatHeightPixels = hardwareConfig.getScreenHeight();
- metrics.xdpi = metrics.noncompatXdpi = hardwareConfig.getXdpi();
- metrics.ydpi = metrics.noncompatYdpi = hardwareConfig.getYdpi();
-
- RenderResources resources = mParams.getResources();
-
- // build the context
- mContext = new BridgeContext(mParams.getProjectKey(), metrics, resources,
- mParams.getProjectCallback(), getConfiguration(), mParams.getTargetSdkVersion(),
- mParams.isRtlSupported());
-
- setUp();
-
- return SUCCESS.createResult();
- }
-
-
- /**
- * Prepares the scene for action.
- * <p>
- * This call is blocking if another rendering/inflating is currently happening, and will return
- * whether the preparation worked.
- *
- * The preparation can fail if another rendering took too long and the timeout was elapsed.
- *
- * More than one call to this from the same thread will have no effect and will return
- * {@link Result#SUCCESS}.
- *
- * After scene actions have taken place, only one call to {@link #release()} must be
- * done.
- *
- * @param timeout the time to wait if another rendering is happening.
- *
- * @return whether the scene was prepared
- *
- * @see #release()
- *
- * @throws IllegalStateException if {@link #init(long)} was never called.
- */
- public Result acquire(long timeout) {
- if (mContext == null) {
- throw new IllegalStateException("After scene creation, #init() must be called");
- }
-
- // acquire the lock. if the result is null, lock was just acquired, otherwise, return
- // the result.
- Result result = acquireLock(timeout);
- if (result != null) {
- return result;
- }
-
- setUp();
-
- return SUCCESS.createResult();
- }
-
- /**
- * Acquire the lock so that the scene can be acted upon.
- * <p>
- * This returns null if the lock was just acquired, otherwise it returns
- * {@link Result#SUCCESS} if the lock already belonged to that thread, or another
- * instance (see {@link Result#getStatus()}) if an error occurred.
- *
- * @param timeout the time to wait if another rendering is happening.
- * @return null if the lock was just acquire or another result depending on the state.
- *
- * @throws IllegalStateException if the current context is different than the one owned by
- * the scene.
- */
- private Result acquireLock(long timeout) {
- ReentrantLock lock = Bridge.getLock();
- if (lock.isHeldByCurrentThread() == false) {
- try {
- boolean acquired = lock.tryLock(timeout, TimeUnit.MILLISECONDS);
-
- if (acquired == false) {
- return ERROR_TIMEOUT.createResult();
- }
- } catch (InterruptedException e) {
- return ERROR_LOCK_INTERRUPTED.createResult();
- }
- } else {
- // This thread holds the lock already. Checks that this wasn't for a different context.
- // If this is called by init, mContext will be null and so should sCurrentContext
- // anyway
- if (mContext != sCurrentContext) {
- throw new IllegalStateException("Acquiring different scenes from same thread without releases");
- }
- return SUCCESS.createResult();
- }
-
- return null;
- }
-
- /**
- * Cleans up the scene after an action.
- */
- public void release() {
- ReentrantLock lock = Bridge.getLock();
-
- // with the use of finally blocks, it is possible to find ourself calling this
- // without a successful call to prepareScene. This test makes sure that unlock() will
- // not throw IllegalMonitorStateException.
- if (lock.isHeldByCurrentThread()) {
- tearDown();
- lock.unlock();
- }
- }
-
- /**
- * Sets up the session for rendering.
- * <p/>
- * The counterpart is {@link #tearDown()}.
- */
- private void setUp() {
- // make sure the Resources object references the context (and other objects) for this
- // scene
- mContext.initResources();
- sCurrentContext = mContext;
-
- // create an InputMethodManager
- InputMethodManager.getInstance();
-
- LayoutLog currentLog = mParams.getLog();
- Bridge.setLog(currentLog);
- mContext.getRenderResources().setFrameworkResourceIdProvider(this);
- mContext.getRenderResources().setLogger(currentLog);
- }
-
- /**
- * Tear down the session after rendering.
- * <p/>
- * The counterpart is {@link #setUp()}.
- */
- private void tearDown() {
- // The context may be null, if there was an error during init().
- if (mContext != null) {
- // Make sure to remove static references, otherwise we could not unload the lib
- mContext.disposeResources();
- }
-
- if (sCurrentContext != null) {
- // quit HandlerThread created during this session.
- HandlerThread_Delegate.cleanUp(sCurrentContext);
- }
-
- // clear the stored ViewConfiguration since the map is per density and not per context.
- ViewConfiguration_Accessor.clearConfigurations();
-
- // remove the InputMethodManager
- InputMethodManager_Accessor.resetInstance();
-
- sCurrentContext = null;
-
- Bridge.setLog(null);
- if (mContext != null) {
- mContext.getRenderResources().setFrameworkResourceIdProvider(null);
- mContext.getRenderResources().setLogger(null);
- }
-
- mContext = null;
- }
-
- public static BridgeContext getCurrentContext() {
- return sCurrentContext;
- }
-
- protected T getParams() {
- return mParams;
- }
-
- protected BridgeContext getContext() {
- return mContext;
- }
-
- /**
- * Returns the log associated with the session.
- * @return the log or null if there are none.
- */
- public LayoutLog getLog() {
- if (mParams != null) {
- return mParams.getLog();
- }
-
- return null;
- }
-
- /**
- * Checks that the lock is owned by the current thread and that the current context is the one
- * from this scene.
- *
- * @throws IllegalStateException if the current context is different than the one owned by
- * the scene, or if {@link #acquire(long)} was not called.
- */
- protected void checkLock() {
- ReentrantLock lock = Bridge.getLock();
- if (lock.isHeldByCurrentThread() == false) {
- throw new IllegalStateException("scene must be acquired first. see #acquire(long)");
- }
- if (sCurrentContext != mContext) {
- throw new IllegalStateException("Thread acquired a scene but is rendering a different one");
- }
- }
-
- private Configuration getConfiguration() {
- Configuration config = new Configuration();
-
- HardwareConfig hardwareConfig = mParams.getHardwareConfig();
-
- ScreenSize screenSize = hardwareConfig.getScreenSize();
- if (screenSize != null) {
- switch (screenSize) {
- case SMALL:
- config.screenLayout |= Configuration.SCREENLAYOUT_SIZE_SMALL;
- break;
- case NORMAL:
- config.screenLayout |= Configuration.SCREENLAYOUT_SIZE_NORMAL;
- break;
- case LARGE:
- config.screenLayout |= Configuration.SCREENLAYOUT_SIZE_LARGE;
- break;
- case XLARGE:
- config.screenLayout |= Configuration.SCREENLAYOUT_SIZE_XLARGE;
- break;
- }
- }
-
- Density density = hardwareConfig.getDensity();
- if (density == null) {
- density = Density.MEDIUM;
- }
-
- config.screenWidthDp = hardwareConfig.getScreenWidth() / density.getDpiValue();
- config.screenHeightDp = hardwareConfig.getScreenHeight() / density.getDpiValue();
- if (config.screenHeightDp < config.screenWidthDp) {
- config.smallestScreenWidthDp = config.screenHeightDp;
- } else {
- config.smallestScreenWidthDp = config.screenWidthDp;
- }
- config.densityDpi = density.getDpiValue();
-
- // never run in compat mode:
- config.compatScreenWidthDp = config.screenWidthDp;
- config.compatScreenHeightDp = config.screenHeightDp;
-
- ScreenOrientation orientation = hardwareConfig.getOrientation();
- if (orientation != null) {
- switch (orientation) {
- case PORTRAIT:
- config.orientation = Configuration.ORIENTATION_PORTRAIT;
- break;
- case LANDSCAPE:
- config.orientation = Configuration.ORIENTATION_LANDSCAPE;
- break;
- case SQUARE:
- config.orientation = Configuration.ORIENTATION_SQUARE;
- break;
- }
- } else {
- config.orientation = Configuration.ORIENTATION_UNDEFINED;
- }
-
- // TODO: fill in more config info.
-
- return config;
- }
-
-
- // --- FrameworkResourceIdProvider methods
-
- @Override
- public Integer getId(ResourceType resType, String resName) {
- return Bridge.getResourceId(resType, resName);
- }
-}
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderDrawable.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderDrawable.java
deleted file mode 100644
index b677131..0000000
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderDrawable.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * Copyright (C) 2011 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.layoutlib.bridge.impl;
-
-import static com.android.ide.common.rendering.api.Result.Status.ERROR_UNKNOWN;
-
-import com.android.ide.common.rendering.api.DrawableParams;
-import com.android.ide.common.rendering.api.HardwareConfig;
-import com.android.ide.common.rendering.api.ResourceValue;
-import com.android.ide.common.rendering.api.Result;
-import com.android.ide.common.rendering.api.Result.Status;
-import com.android.layoutlib.bridge.android.BridgeContext;
-import com.android.resources.ResourceType;
-
-import android.graphics.Bitmap;
-import android.graphics.Bitmap_Delegate;
-import android.graphics.Canvas;
-import android.graphics.drawable.Drawable;
-import android.view.AttachInfo_Accessor;
-import android.view.View.MeasureSpec;
-import android.widget.FrameLayout;
-
-import java.awt.AlphaComposite;
-import java.awt.Color;
-import java.awt.Graphics2D;
-import java.awt.image.BufferedImage;
-import java.io.IOException;
-
-/**
- * Action to render a given Drawable provided through {@link DrawableParams#getDrawable()}.
- *
- * The class only provides a simple {@link #render()} method, but the full life-cycle of the
- * action must be respected.
- *
- * @see RenderAction
- *
- */
-public class RenderDrawable extends RenderAction<DrawableParams> {
-
- public RenderDrawable(DrawableParams params) {
- super(new DrawableParams(params));
- }
-
- public Result render() {
- checkLock();
- try {
- // get the drawable resource value
- DrawableParams params = getParams();
- HardwareConfig hardwareConfig = params.getHardwareConfig();
- ResourceValue drawableResource = params.getDrawable();
-
- // resolve it
- BridgeContext context = getContext();
- drawableResource = context.getRenderResources().resolveResValue(drawableResource);
-
- if (drawableResource == null ||
- drawableResource.getResourceType() != ResourceType.DRAWABLE) {
- return Status.ERROR_NOT_A_DRAWABLE.createResult();
- }
-
- // create a simple FrameLayout
- FrameLayout content = new FrameLayout(context);
-
- // get the actual Drawable object to draw
- Drawable d = ResourceHelper.getDrawable(drawableResource, context);
- content.setBackground(d);
-
- // set the AttachInfo on the root view.
- AttachInfo_Accessor.setAttachInfo(content);
-
-
- // measure
- int w = hardwareConfig.getScreenWidth();
- int h = hardwareConfig.getScreenHeight();
- int w_spec = MeasureSpec.makeMeasureSpec(w, MeasureSpec.EXACTLY);
- int h_spec = MeasureSpec.makeMeasureSpec(h, MeasureSpec.EXACTLY);
- content.measure(w_spec, h_spec);
-
- // now do the layout.
- content.layout(0, 0, w, h);
-
- // preDraw setup
- AttachInfo_Accessor.dispatchOnPreDraw(content);
-
- // draw into a new image
- BufferedImage image = getImage(w, h);
-
- // create an Android bitmap around the BufferedImage
- Bitmap bitmap = Bitmap_Delegate.createBitmap(image,
- true /*isMutable*/, hardwareConfig.getDensity());
-
- // create a Canvas around the Android bitmap
- Canvas canvas = new Canvas(bitmap);
- canvas.setDensity(hardwareConfig.getDensity().getDpiValue());
-
- // and draw
- content.draw(canvas);
-
- return Status.SUCCESS.createResult(image);
- } catch (IOException e) {
- return ERROR_UNKNOWN.createResult(e.getMessage(), e);
- }
- }
-
- protected BufferedImage getImage(int w, int h) {
- BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
- Graphics2D gc = image.createGraphics();
- gc.setComposite(AlphaComposite.Src);
-
- gc.setColor(new Color(0x00000000, true));
- gc.fillRect(0, 0, w, h);
-
- // done
- gc.dispose();
-
- return image;
- }
-
-}
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderSessionImpl.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderSessionImpl.java
deleted file mode 100644
index 57771e3..0000000
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderSessionImpl.java
+++ /dev/null
@@ -1,1486 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.layoutlib.bridge.impl;
-
-import static com.android.ide.common.rendering.api.Result.Status.ERROR_ANIM_NOT_FOUND;
-import static com.android.ide.common.rendering.api.Result.Status.ERROR_INFLATION;
-import static com.android.ide.common.rendering.api.Result.Status.ERROR_NOT_INFLATED;
-import static com.android.ide.common.rendering.api.Result.Status.ERROR_UNKNOWN;
-import static com.android.ide.common.rendering.api.Result.Status.ERROR_VIEWGROUP_NO_CHILDREN;
-import static com.android.ide.common.rendering.api.Result.Status.SUCCESS;
-
-import com.android.ide.common.rendering.api.AdapterBinding;
-import com.android.ide.common.rendering.api.HardwareConfig;
-import com.android.ide.common.rendering.api.IAnimationListener;
-import com.android.ide.common.rendering.api.ILayoutPullParser;
-import com.android.ide.common.rendering.api.IProjectCallback;
-import com.android.ide.common.rendering.api.RenderParams;
-import com.android.ide.common.rendering.api.RenderResources;
-import com.android.ide.common.rendering.api.RenderSession;
-import com.android.ide.common.rendering.api.ResourceReference;
-import com.android.ide.common.rendering.api.ResourceValue;
-import com.android.ide.common.rendering.api.Result;
-import com.android.ide.common.rendering.api.Result.Status;
-import com.android.ide.common.rendering.api.SessionParams;
-import com.android.ide.common.rendering.api.SessionParams.RenderingMode;
-import com.android.ide.common.rendering.api.ViewInfo;
-import com.android.internal.util.XmlUtils;
-import com.android.layoutlib.bridge.Bridge;
-import com.android.layoutlib.bridge.android.BridgeContext;
-import com.android.layoutlib.bridge.android.BridgeLayoutParamsMapAttributes;
-import com.android.layoutlib.bridge.android.BridgeXmlBlockParser;
-import com.android.layoutlib.bridge.bars.FakeActionBar;
-import com.android.layoutlib.bridge.bars.NavigationBar;
-import com.android.layoutlib.bridge.bars.StatusBar;
-import com.android.layoutlib.bridge.bars.TitleBar;
-import com.android.layoutlib.bridge.impl.binding.FakeAdapter;
-import com.android.layoutlib.bridge.impl.binding.FakeExpandableAdapter;
-import com.android.resources.ResourceType;
-import com.android.resources.ScreenOrientation;
-import com.android.util.Pair;
-
-import org.xmlpull.v1.XmlPullParserException;
-
-import android.animation.AnimationThread;
-import android.animation.Animator;
-import android.animation.AnimatorInflater;
-import android.animation.LayoutTransition;
-import android.animation.LayoutTransition.TransitionListener;
-import android.app.Fragment_Delegate;
-import android.graphics.Bitmap;
-import android.graphics.Bitmap_Delegate;
-import android.graphics.Canvas;
-import android.graphics.drawable.Drawable;
-import android.util.DisplayMetrics;
-import android.util.TypedValue;
-import android.view.AttachInfo_Accessor;
-import android.view.BridgeInflater;
-import android.view.IWindowManager;
-import android.view.IWindowManagerImpl;
-import android.view.Surface;
-import android.view.View;
-import android.view.View.MeasureSpec;
-import android.view.ViewGroup;
-import android.view.ViewGroup.LayoutParams;
-import android.view.ViewGroup.MarginLayoutParams;
-import android.view.WindowManagerGlobal_Delegate;
-import android.widget.AbsListView;
-import android.widget.AbsSpinner;
-import android.widget.AdapterView;
-import android.widget.ExpandableListView;
-import android.widget.FrameLayout;
-import android.widget.LinearLayout;
-import android.widget.ListView;
-import android.widget.QuickContactBadge;
-import android.widget.TabHost;
-import android.widget.TabHost.TabSpec;
-import android.widget.TabWidget;
-
-import java.awt.AlphaComposite;
-import java.awt.Color;
-import java.awt.Graphics2D;
-import java.awt.image.BufferedImage;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Class implementing the render session.
- *
- * A session is a stateful representation of a layout file. It is initialized with data coming
- * through the {@link Bridge} API to inflate the layout. Further actions and rendering can then
- * be done on the layout.
- *
- */
-public class RenderSessionImpl extends RenderAction<SessionParams> {
-
- private static final int DEFAULT_TITLE_BAR_HEIGHT = 25;
- private static final int DEFAULT_STATUS_BAR_HEIGHT = 25;
-
- // scene state
- private RenderSession mScene;
- private BridgeXmlBlockParser mBlockParser;
- private BridgeInflater mInflater;
- private ResourceValue mWindowBackground;
- private ViewGroup mViewRoot;
- private FrameLayout mContentRoot;
- private Canvas mCanvas;
- private int mMeasuredScreenWidth = -1;
- private int mMeasuredScreenHeight = -1;
- private boolean mIsAlphaChannelImage;
- private boolean mWindowIsFloating;
-
- private int mStatusBarSize;
- private int mNavigationBarSize;
- private int mNavigationBarOrientation = LinearLayout.HORIZONTAL;
- private int mTitleBarSize;
- private int mActionBarSize;
-
-
- // information being returned through the API
- private BufferedImage mImage;
- private List<ViewInfo> mViewInfoList;
-
- private static final class PostInflateException extends Exception {
- private static final long serialVersionUID = 1L;
-
- public PostInflateException(String message) {
- super(message);
- }
- }
-
- /**
- * Creates a layout scene with all the information coming from the layout bridge API.
- * <p>
- * This <b>must</b> be followed by a call to {@link RenderSessionImpl#init()}, which act as a
- * call to {@link RenderSessionImpl#acquire(long)}
- *
- * @see LayoutBridge#createScene(com.android.layoutlib.api.SceneParams)
- */
- public RenderSessionImpl(SessionParams params) {
- super(new SessionParams(params));
- }
-
- /**
- * Initializes and acquires the scene, creating various Android objects such as context,
- * inflater, and parser.
- *
- * @param timeout the time to wait if another rendering is happening.
- *
- * @return whether the scene was prepared
- *
- * @see #acquire(long)
- * @see #release()
- */
- @Override
- public Result init(long timeout) {
- Result result = super.init(timeout);
- if (result.isSuccess() == false) {
- return result;
- }
-
- SessionParams params = getParams();
- BridgeContext context = getContext();
-
- RenderResources resources = getParams().getResources();
- DisplayMetrics metrics = getContext().getMetrics();
-
- // use default of true in case it's not found to use alpha by default
- mIsAlphaChannelImage = getBooleanThemeValue(resources,
- "windowIsFloating", true /*defaultValue*/);
-
- mWindowIsFloating = getBooleanThemeValue(resources, "windowIsFloating",
- true /*defaultValue*/);
-
- findBackground(resources);
- findStatusBar(resources, metrics);
- findActionBar(resources, metrics);
- findNavigationBar(resources, metrics);
-
- // FIXME: find those out, and possibly add them to the render params
- boolean hasNavigationBar = true;
- IWindowManager iwm = new IWindowManagerImpl(getContext().getConfiguration(),
- metrics, Surface.ROTATION_0,
- hasNavigationBar);
- WindowManagerGlobal_Delegate.setWindowManagerService(iwm);
-
- // build the inflater and parser.
- mInflater = new BridgeInflater(context, params.getProjectCallback());
- context.setBridgeInflater(mInflater);
-
- mBlockParser = new BridgeXmlBlockParser(
- params.getLayoutDescription(), context, false /* platformResourceFlag */);
-
- return SUCCESS.createResult();
- }
-
- /**
- * Inflates the layout.
- * <p>
- * {@link #acquire(long)} must have been called before this.
- *
- * @throws IllegalStateException if the current context is different than the one owned by
- * the scene, or if {@link #init(long)} was not called.
- */
- public Result inflate() {
- checkLock();
-
- try {
-
- SessionParams params = getParams();
- HardwareConfig hardwareConfig = params.getHardwareConfig();
- BridgeContext context = getContext();
- boolean isRtl = Bridge.isLocaleRtl(params.getLocale());
- int direction = isRtl ? View.LAYOUT_DIRECTION_RTL : View.LAYOUT_DIRECTION_LTR;
-
- // the view group that receives the window background.
- ViewGroup backgroundView = null;
-
- if (mWindowIsFloating || params.isForceNoDecor()) {
- backgroundView = mViewRoot = mContentRoot = new FrameLayout(context);
- mViewRoot.setLayoutDirection(direction);
- } else {
- if (hasSoftwareButtons() && mNavigationBarOrientation == LinearLayout.VERTICAL) {
- /*
- * This is a special case where the navigation bar is on the right.
- +-------------------------------------------------+---+
- | Status bar (always) | |
- +-------------------------------------------------+ |
- | (Layout with background drawable) | |
- | +---------------------------------------------+ | |
- | | Title/Action bar (optional) | | |
- | +---------------------------------------------+ | |
- | | Content, vertical extending | | |
- | | | | |
- | +---------------------------------------------+ | |
- +-------------------------------------------------+---+
-
- So we create a horizontal layout, with the nav bar on the right,
- and the left part is the normal layout below without the nav bar at
- the bottom
- */
- LinearLayout topLayout = new LinearLayout(context);
- topLayout.setLayoutDirection(direction);
- mViewRoot = topLayout;
- topLayout.setOrientation(LinearLayout.HORIZONTAL);
-
- try {
- NavigationBar navigationBar = new NavigationBar(context,
- hardwareConfig.getDensity(), LinearLayout.VERTICAL, isRtl,
- params.isRtlSupported());
- navigationBar.setLayoutParams(
- new LinearLayout.LayoutParams(
- mNavigationBarSize,
- LayoutParams.MATCH_PARENT));
- topLayout.addView(navigationBar);
- } catch (XmlPullParserException e) {
-
- }
- }
-
- /*
- * we're creating the following layout
- *
- +-------------------------------------------------+
- | Status bar (always) |
- +-------------------------------------------------+
- | (Layout with background drawable) |
- | +---------------------------------------------+ |
- | | Title/Action bar (optional) | |
- | +---------------------------------------------+ |
- | | Content, vertical extending | |
- | | | |
- | +---------------------------------------------+ |
- +-------------------------------------------------+
- | Navigation bar for soft buttons, maybe see above|
- +-------------------------------------------------+
-
- */
-
- LinearLayout topLayout = new LinearLayout(context);
- topLayout.setOrientation(LinearLayout.VERTICAL);
- topLayout.setLayoutDirection(direction);
- // if we don't already have a view root this is it
- if (mViewRoot == null) {
- mViewRoot = topLayout;
- } else {
- LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
- LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);
- layoutParams.weight = 1;
- topLayout.setLayoutParams(layoutParams);
-
- // this is the case of soft buttons + vertical bar.
- // this top layout is the first layout in the horizontal layout. see above)
- if (isRtl && params.isRtlSupported()) {
- // If RTL is enabled, layoutlib will mirror the layouts. So, add the
- // topLayout to the right of Navigation Bar and layoutlib will draw it
- // to the left.
- mViewRoot.addView(topLayout);
- } else {
- // Add the top layout to the left of the Navigation Bar.
- mViewRoot.addView(topLayout, 0);
- }
- }
-
- if (mStatusBarSize > 0) {
- // system bar
- try {
- StatusBar systemBar = new StatusBar(context, hardwareConfig.getDensity(),
- direction, params.isRtlSupported());
- systemBar.setLayoutParams(
- new LinearLayout.LayoutParams(
- LayoutParams.MATCH_PARENT, mStatusBarSize));
- topLayout.addView(systemBar);
- } catch (XmlPullParserException e) {
-
- }
- }
-
- LinearLayout backgroundLayout = new LinearLayout(context);
- backgroundView = backgroundLayout;
- backgroundLayout.setOrientation(LinearLayout.VERTICAL);
- LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
- LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
- layoutParams.weight = 1;
- backgroundLayout.setLayoutParams(layoutParams);
- topLayout.addView(backgroundLayout);
-
-
- // if the theme says no title/action bar, then the size will be 0
- if (mActionBarSize > 0) {
- try {
- FakeActionBar actionBar = new FakeActionBar(context,
- hardwareConfig.getDensity(),
- params.getAppLabel(), params.getAppIcon());
- actionBar.setLayoutParams(
- new LinearLayout.LayoutParams(
- LayoutParams.MATCH_PARENT, mActionBarSize));
- backgroundLayout.addView(actionBar);
- } catch (XmlPullParserException e) {
-
- }
- } else if (mTitleBarSize > 0) {
- try {
- TitleBar titleBar = new TitleBar(context,
- hardwareConfig.getDensity(), params.getAppLabel());
- titleBar.setLayoutParams(
- new LinearLayout.LayoutParams(
- LayoutParams.MATCH_PARENT, mTitleBarSize));
- backgroundLayout.addView(titleBar);
- } catch (XmlPullParserException e) {
-
- }
- }
-
- // content frame
- mContentRoot = new FrameLayout(context);
- layoutParams = new LinearLayout.LayoutParams(
- LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
- layoutParams.weight = 1;
- mContentRoot.setLayoutParams(layoutParams);
- backgroundLayout.addView(mContentRoot);
-
- if (mNavigationBarOrientation == LinearLayout.HORIZONTAL &&
- mNavigationBarSize > 0) {
- // system bar
- try {
- NavigationBar navigationBar = new NavigationBar(context,
- hardwareConfig.getDensity(), LinearLayout.HORIZONTAL, isRtl,
- params.isRtlSupported());
- navigationBar.setLayoutParams(
- new LinearLayout.LayoutParams(
- LayoutParams.MATCH_PARENT, mNavigationBarSize));
- topLayout.addView(navigationBar);
- } catch (XmlPullParserException e) {
-
- }
- }
- }
-
-
- // Sets the project callback (custom view loader) to the fragment delegate so that
- // it can instantiate the custom Fragment.
- Fragment_Delegate.setProjectCallback(params.getProjectCallback());
-
- View view = mInflater.inflate(mBlockParser, mContentRoot);
-
- // done with the parser, pop it.
- context.popParser();
-
- Fragment_Delegate.setProjectCallback(null);
-
- // set the AttachInfo on the root view.
- AttachInfo_Accessor.setAttachInfo(mViewRoot);
-
- // post-inflate process. For now this supports TabHost/TabWidget
- postInflateProcess(view, params.getProjectCallback());
-
- // get the background drawable
- if (mWindowBackground != null && backgroundView != null) {
- Drawable d = ResourceHelper.getDrawable(mWindowBackground, context);
- backgroundView.setBackground(d);
- }
-
- return SUCCESS.createResult();
- } catch (PostInflateException e) {
- return ERROR_INFLATION.createResult(e.getMessage(), e);
- } catch (Throwable e) {
- // get the real cause of the exception.
- Throwable t = e;
- while (t.getCause() != null) {
- t = t.getCause();
- }
-
- return ERROR_INFLATION.createResult(t.getMessage(), t);
- }
- }
-
- /**
- * Renders the scene.
- * <p>
- * {@link #acquire(long)} must have been called before this.
- *
- * @param freshRender whether the render is a new one and should erase the existing bitmap (in
- * the case where bitmaps are reused). This is typically needed when not playing
- * animations.)
- *
- * @throws IllegalStateException if the current context is different than the one owned by
- * the scene, or if {@link #acquire(long)} was not called.
- *
- * @see RenderParams#getRenderingMode()
- * @see RenderSession#render(long)
- */
- public Result render(boolean freshRender) {
- checkLock();
-
- SessionParams params = getParams();
-
- try {
- if (mViewRoot == null) {
- return ERROR_NOT_INFLATED.createResult();
- }
-
- RenderingMode renderingMode = params.getRenderingMode();
- HardwareConfig hardwareConfig = params.getHardwareConfig();
-
- // only do the screen measure when needed.
- boolean newRenderSize = false;
- if (mMeasuredScreenWidth == -1) {
- newRenderSize = true;
- mMeasuredScreenWidth = hardwareConfig.getScreenWidth();
- mMeasuredScreenHeight = hardwareConfig.getScreenHeight();
-
- if (renderingMode != RenderingMode.NORMAL) {
- int widthMeasureSpecMode = renderingMode.isHorizExpand() ?
- MeasureSpec.UNSPECIFIED // this lets us know the actual needed size
- : MeasureSpec.EXACTLY;
- int heightMeasureSpecMode = renderingMode.isVertExpand() ?
- MeasureSpec.UNSPECIFIED // this lets us know the actual needed size
- : MeasureSpec.EXACTLY;
-
- // We used to compare the measured size of the content to the screen size but
- // this does not work anymore due to the 2 following issues:
- // - If the content is in a decor (system bar, title/action bar), the root view
- // will not resize even with the UNSPECIFIED because of the embedded layout.
- // - If there is no decor, but a dialog frame, then the dialog padding prevents
- // comparing the size of the content to the screen frame (as it would not
- // take into account the dialog padding).
-
- // The solution is to first get the content size in a normal rendering, inside
- // the decor or the dialog padding.
- // Then measure only the content with UNSPECIFIED to see the size difference
- // and apply this to the screen size.
-
- // first measure the full layout, with EXACTLY to get the size of the
- // content as it is inside the decor/dialog
- Pair<Integer, Integer> exactMeasure = measureView(
- mViewRoot, mContentRoot.getChildAt(0),
- mMeasuredScreenWidth, MeasureSpec.EXACTLY,
- mMeasuredScreenHeight, MeasureSpec.EXACTLY);
-
- // now measure the content only using UNSPECIFIED (where applicable, based on
- // the rendering mode). This will give us the size the content needs.
- Pair<Integer, Integer> result = measureView(
- mContentRoot, mContentRoot.getChildAt(0),
- mMeasuredScreenWidth, widthMeasureSpecMode,
- mMeasuredScreenHeight, heightMeasureSpecMode);
-
- // now look at the difference and add what is needed.
- if (renderingMode.isHorizExpand()) {
- int measuredWidth = exactMeasure.getFirst();
- int neededWidth = result.getFirst();
- if (neededWidth > measuredWidth) {
- mMeasuredScreenWidth += neededWidth - measuredWidth;
- }
- }
-
- if (renderingMode.isVertExpand()) {
- int measuredHeight = exactMeasure.getSecond();
- int neededHeight = result.getSecond();
- if (neededHeight > measuredHeight) {
- mMeasuredScreenHeight += neededHeight - measuredHeight;
- }
- }
- }
- }
-
- // measure again with the size we need
- // This must always be done before the call to layout
- measureView(mViewRoot, null /*measuredView*/,
- mMeasuredScreenWidth, MeasureSpec.EXACTLY,
- mMeasuredScreenHeight, MeasureSpec.EXACTLY);
-
- // now do the layout.
- mViewRoot.layout(0, 0, mMeasuredScreenWidth, mMeasuredScreenHeight);
-
- if (params.isLayoutOnly()) {
- // delete the canvas and image to reset them on the next full rendering
- mImage = null;
- mCanvas = null;
- } else {
- AttachInfo_Accessor.dispatchOnPreDraw(mViewRoot);
-
- // draw the views
- // create the BufferedImage into which the layout will be rendered.
- boolean newImage = false;
- if (newRenderSize || mCanvas == null) {
- if (params.getImageFactory() != null) {
- mImage = params.getImageFactory().getImage(
- mMeasuredScreenWidth,
- mMeasuredScreenHeight);
- } else {
- mImage = new BufferedImage(
- mMeasuredScreenWidth,
- mMeasuredScreenHeight,
- BufferedImage.TYPE_INT_ARGB);
- newImage = true;
- }
-
- if (params.isBgColorOverridden()) {
- // since we override the content, it's the same as if it was a new image.
- newImage = true;
- Graphics2D gc = mImage.createGraphics();
- gc.setColor(new Color(params.getOverrideBgColor(), true));
- gc.setComposite(AlphaComposite.Src);
- gc.fillRect(0, 0, mMeasuredScreenWidth, mMeasuredScreenHeight);
- gc.dispose();
- }
-
- // create an Android bitmap around the BufferedImage
- Bitmap bitmap = Bitmap_Delegate.createBitmap(mImage,
- true /*isMutable*/, hardwareConfig.getDensity());
-
- // create a Canvas around the Android bitmap
- mCanvas = new Canvas(bitmap);
- mCanvas.setDensity(hardwareConfig.getDensity().getDpiValue());
- }
-
- if (freshRender && newImage == false) {
- Graphics2D gc = mImage.createGraphics();
- gc.setComposite(AlphaComposite.Src);
-
- gc.setColor(new Color(0x00000000, true));
- gc.fillRect(0, 0,
- mMeasuredScreenWidth, mMeasuredScreenHeight);
-
- // done
- gc.dispose();
- }
-
- mViewRoot.draw(mCanvas);
- }
-
- mViewInfoList = startVisitingViews(mViewRoot, 0, params.getExtendedViewInfoMode());
-
- // success!
- return SUCCESS.createResult();
- } catch (Throwable e) {
- // get the real cause of the exception.
- Throwable t = e;
- while (t.getCause() != null) {
- t = t.getCause();
- }
-
- return ERROR_UNKNOWN.createResult(t.getMessage(), t);
- }
- }
-
- /**
- * Executes {@link View#measure(int, int)} on a given view with the given parameters (used
- * to create measure specs with {@link MeasureSpec#makeMeasureSpec(int, int)}.
- *
- * if <var>measuredView</var> is non null, the method returns a {@link Pair} of (width, height)
- * for the view (using {@link View#getMeasuredWidth()} and {@link View#getMeasuredHeight()}).
- *
- * @param viewToMeasure the view on which to execute measure().
- * @param measuredView if non null, the view to query for its measured width/height.
- * @param width the width to use in the MeasureSpec.
- * @param widthMode the MeasureSpec mode to use for the width.
- * @param height the height to use in the MeasureSpec.
- * @param heightMode the MeasureSpec mode to use for the height.
- * @return the measured width/height if measuredView is non-null, null otherwise.
- */
- private Pair<Integer, Integer> measureView(ViewGroup viewToMeasure, View measuredView,
- int width, int widthMode, int height, int heightMode) {
- int w_spec = MeasureSpec.makeMeasureSpec(width, widthMode);
- int h_spec = MeasureSpec.makeMeasureSpec(height, heightMode);
- viewToMeasure.measure(w_spec, h_spec);
-
- if (measuredView != null) {
- return Pair.of(measuredView.getMeasuredWidth(), measuredView.getMeasuredHeight());
- }
-
- return null;
- }
-
- /**
- * Animate an object
- * <p>
- * {@link #acquire(long)} must have been called before this.
- *
- * @throws IllegalStateException if the current context is different than the one owned by
- * the scene, or if {@link #acquire(long)} was not called.
- *
- * @see RenderSession#animate(Object, String, boolean, IAnimationListener)
- */
- public Result animate(Object targetObject, String animationName,
- boolean isFrameworkAnimation, IAnimationListener listener) {
- checkLock();
-
- BridgeContext context = getContext();
-
- // find the animation file.
- ResourceValue animationResource = null;
- int animationId = 0;
- if (isFrameworkAnimation) {
- animationResource = context.getRenderResources().getFrameworkResource(
- ResourceType.ANIMATOR, animationName);
- if (animationResource != null) {
- animationId = Bridge.getResourceId(ResourceType.ANIMATOR, animationName);
- }
- } else {
- animationResource = context.getRenderResources().getProjectResource(
- ResourceType.ANIMATOR, animationName);
- if (animationResource != null) {
- animationId = context.getProjectCallback().getResourceId(
- ResourceType.ANIMATOR, animationName);
- }
- }
-
- if (animationResource != null) {
- try {
- Animator anim = AnimatorInflater.loadAnimator(context, animationId);
- if (anim != null) {
- anim.setTarget(targetObject);
-
- new PlayAnimationThread(anim, this, animationName, listener).start();
-
- return SUCCESS.createResult();
- }
- } catch (Exception e) {
- // get the real cause of the exception.
- Throwable t = e;
- while (t.getCause() != null) {
- t = t.getCause();
- }
-
- return ERROR_UNKNOWN.createResult(t.getMessage(), t);
- }
- }
-
- return ERROR_ANIM_NOT_FOUND.createResult();
- }
-
- /**
- * Insert a new child into an existing parent.
- * <p>
- * {@link #acquire(long)} must have been called before this.
- *
- * @throws IllegalStateException if the current context is different than the one owned by
- * the scene, or if {@link #acquire(long)} was not called.
- *
- * @see RenderSession#insertChild(Object, ILayoutPullParser, int, IAnimationListener)
- */
- public Result insertChild(final ViewGroup parentView, ILayoutPullParser childXml,
- final int index, IAnimationListener listener) {
- checkLock();
-
- BridgeContext context = getContext();
-
- // create a block parser for the XML
- BridgeXmlBlockParser blockParser = new BridgeXmlBlockParser(
- childXml, context, false /* platformResourceFlag */);
-
- // inflate the child without adding it to the root since we want to control where it'll
- // get added. We do pass the parentView however to ensure that the layoutParams will
- // be created correctly.
- final View child = mInflater.inflate(blockParser, parentView, false /*attachToRoot*/);
- blockParser.ensurePopped();
-
- invalidateRenderingSize();
-
- if (listener != null) {
- new AnimationThread(this, "insertChild", listener) {
-
- @Override
- public Result preAnimation() {
- parentView.setLayoutTransition(new LayoutTransition());
- return addView(parentView, child, index);
- }
-
- @Override
- public void postAnimation() {
- parentView.setLayoutTransition(null);
- }
- }.start();
-
- // always return success since the real status will come through the listener.
- return SUCCESS.createResult(child);
- }
-
- // add it to the parentView in the correct location
- Result result = addView(parentView, child, index);
- if (result.isSuccess() == false) {
- return result;
- }
-
- result = render(false /*freshRender*/);
- if (result.isSuccess()) {
- result = result.getCopyWithData(child);
- }
-
- return result;
- }
-
- /**
- * Adds a given view to a given parent at a given index.
- *
- * @param parent the parent to receive the view
- * @param view the view to add to the parent
- * @param index the index where to do the add.
- *
- * @return a Result with {@link Status#SUCCESS} or
- * {@link Status#ERROR_VIEWGROUP_NO_CHILDREN} if the given parent doesn't support
- * adding views.
- */
- private Result addView(ViewGroup parent, View view, int index) {
- try {
- parent.addView(view, index);
- return SUCCESS.createResult();
- } catch (UnsupportedOperationException e) {
- // looks like this is a view class that doesn't support children manipulation!
- return ERROR_VIEWGROUP_NO_CHILDREN.createResult();
- }
- }
-
- /**
- * Moves a view to a new parent at a given location
- * <p>
- * {@link #acquire(long)} must have been called before this.
- *
- * @throws IllegalStateException if the current context is different than the one owned by
- * the scene, or if {@link #acquire(long)} was not called.
- *
- * @see RenderSession#moveChild(Object, Object, int, Map, IAnimationListener)
- */
- public Result moveChild(final ViewGroup newParentView, final View childView, final int index,
- Map<String, String> layoutParamsMap, final IAnimationListener listener) {
- checkLock();
-
- invalidateRenderingSize();
-
- LayoutParams layoutParams = null;
- if (layoutParamsMap != null) {
- // need to create a new LayoutParams object for the new parent.
- layoutParams = newParentView.generateLayoutParams(
- new BridgeLayoutParamsMapAttributes(layoutParamsMap));
- }
-
- // get the current parent of the view that needs to be moved.
- final ViewGroup previousParent = (ViewGroup) childView.getParent();
-
- if (listener != null) {
- final LayoutParams params = layoutParams;
-
- // there is no support for animating views across layouts, so in case the new and old
- // parent views are different we fake the animation through a no animation thread.
- if (previousParent != newParentView) {
- new Thread("not animated moveChild") {
- @Override
- public void run() {
- Result result = moveView(previousParent, newParentView, childView, index,
- params);
- if (result.isSuccess() == false) {
- listener.done(result);
- }
-
- // ready to do the work, acquire the scene.
- result = acquire(250);
- if (result.isSuccess() == false) {
- listener.done(result);
- return;
- }
-
- try {
- result = render(false /*freshRender*/);
- if (result.isSuccess()) {
- listener.onNewFrame(RenderSessionImpl.this.getSession());
- }
- } finally {
- release();
- }
-
- listener.done(result);
- }
- }.start();
- } else {
- new AnimationThread(this, "moveChild", listener) {
-
- @Override
- public Result preAnimation() {
- // set up the transition for the parent.
- LayoutTransition transition = new LayoutTransition();
- previousParent.setLayoutTransition(transition);
-
- // tweak the animation durations and start delays (to match the duration of
- // animation playing just before).
- // Note: Cannot user Animation.setDuration() directly. Have to set it
- // on the LayoutTransition.
- transition.setDuration(LayoutTransition.DISAPPEARING, 100);
- // CHANGE_DISAPPEARING plays after DISAPPEARING
- transition.setStartDelay(LayoutTransition.CHANGE_DISAPPEARING, 100);
-
- transition.setDuration(LayoutTransition.CHANGE_DISAPPEARING, 100);
-
- transition.setDuration(LayoutTransition.CHANGE_APPEARING, 100);
- // CHANGE_APPEARING plays after CHANGE_APPEARING
- transition.setStartDelay(LayoutTransition.APPEARING, 100);
-
- transition.setDuration(LayoutTransition.APPEARING, 100);
-
- return moveView(previousParent, newParentView, childView, index, params);
- }
-
- @Override
- public void postAnimation() {
- previousParent.setLayoutTransition(null);
- newParentView.setLayoutTransition(null);
- }
- }.start();
- }
-
- // always return success since the real status will come through the listener.
- return SUCCESS.createResult(layoutParams);
- }
-
- Result result = moveView(previousParent, newParentView, childView, index, layoutParams);
- if (result.isSuccess() == false) {
- return result;
- }
-
- result = render(false /*freshRender*/);
- if (layoutParams != null && result.isSuccess()) {
- result = result.getCopyWithData(layoutParams);
- }
-
- return result;
- }
-
- /**
- * Moves a View from its current parent to a new given parent at a new given location, with
- * an optional new {@link LayoutParams} instance
- *
- * @param previousParent the previous parent, still owning the child at the time of the call.
- * @param newParent the new parent
- * @param movedView the view to move
- * @param index the new location in the new parent
- * @param params an option (can be null) {@link LayoutParams} instance.
- *
- * @return a Result with {@link Status#SUCCESS} or
- * {@link Status#ERROR_VIEWGROUP_NO_CHILDREN} if the given parent doesn't support
- * adding views.
- */
- private Result moveView(ViewGroup previousParent, final ViewGroup newParent,
- final View movedView, final int index, final LayoutParams params) {
- try {
- // check if there is a transition on the previousParent.
- LayoutTransition previousTransition = previousParent.getLayoutTransition();
- if (previousTransition != null) {
- // in this case there is an animation. This means we have to wait for the child's
- // parent reference to be null'ed out so that we can add it to the new parent.
- // It is technically removed right before the DISAPPEARING animation is done (if
- // the animation of this type is not null, otherwise it's after which is impossible
- // to handle).
- // Because there is no move animation, if the new parent is the same as the old
- // parent, we need to wait until the CHANGE_DISAPPEARING animation is done before
- // adding the child or the child will appear in its new location before the
- // other children have made room for it.
-
- // add a listener to the transition to be notified of the actual removal.
- previousTransition.addTransitionListener(new TransitionListener() {
- private int mChangeDisappearingCount = 0;
-
- @Override
- public void startTransition(LayoutTransition transition, ViewGroup container,
- View view, int transitionType) {
- if (transitionType == LayoutTransition.CHANGE_DISAPPEARING) {
- mChangeDisappearingCount++;
- }
- }
-
- @Override
- public void endTransition(LayoutTransition transition, ViewGroup container,
- View view, int transitionType) {
- if (transitionType == LayoutTransition.CHANGE_DISAPPEARING) {
- mChangeDisappearingCount--;
- }
-
- if (transitionType == LayoutTransition.CHANGE_DISAPPEARING &&
- mChangeDisappearingCount == 0) {
- // add it to the parentView in the correct location
- if (params != null) {
- newParent.addView(movedView, index, params);
- } else {
- newParent.addView(movedView, index);
- }
- }
- }
- });
-
- // remove the view from the current parent.
- previousParent.removeView(movedView);
-
- // and return since adding the view to the new parent is done in the listener.
- return SUCCESS.createResult();
- } else {
- // standard code with no animation. pretty simple.
- previousParent.removeView(movedView);
-
- // add it to the parentView in the correct location
- if (params != null) {
- newParent.addView(movedView, index, params);
- } else {
- newParent.addView(movedView, index);
- }
-
- return SUCCESS.createResult();
- }
- } catch (UnsupportedOperationException e) {
- // looks like this is a view class that doesn't support children manipulation!
- return ERROR_VIEWGROUP_NO_CHILDREN.createResult();
- }
- }
-
- /**
- * Removes a child from its current parent.
- * <p>
- * {@link #acquire(long)} must have been called before this.
- *
- * @throws IllegalStateException if the current context is different than the one owned by
- * the scene, or if {@link #acquire(long)} was not called.
- *
- * @see RenderSession#removeChild(Object, IAnimationListener)
- */
- public Result removeChild(final View childView, IAnimationListener listener) {
- checkLock();
-
- invalidateRenderingSize();
-
- final ViewGroup parent = (ViewGroup) childView.getParent();
-
- if (listener != null) {
- new AnimationThread(this, "moveChild", listener) {
-
- @Override
- public Result preAnimation() {
- parent.setLayoutTransition(new LayoutTransition());
- return removeView(parent, childView);
- }
-
- @Override
- public void postAnimation() {
- parent.setLayoutTransition(null);
- }
- }.start();
-
- // always return success since the real status will come through the listener.
- return SUCCESS.createResult();
- }
-
- Result result = removeView(parent, childView);
- if (result.isSuccess() == false) {
- return result;
- }
-
- return render(false /*freshRender*/);
- }
-
- /**
- * Removes a given view from its current parent.
- *
- * @param view the view to remove from its parent
- *
- * @return a Result with {@link Status#SUCCESS} or
- * {@link Status#ERROR_VIEWGROUP_NO_CHILDREN} if the given parent doesn't support
- * adding views.
- */
- private Result removeView(ViewGroup parent, View view) {
- try {
- parent.removeView(view);
- return SUCCESS.createResult();
- } catch (UnsupportedOperationException e) {
- // looks like this is a view class that doesn't support children manipulation!
- return ERROR_VIEWGROUP_NO_CHILDREN.createResult();
- }
- }
-
-
- private void findBackground(RenderResources resources) {
- if (getParams().isBgColorOverridden() == false) {
- mWindowBackground = resources.findItemInTheme("windowBackground",
- true /*isFrameworkAttr*/);
- if (mWindowBackground != null) {
- mWindowBackground = resources.resolveResValue(mWindowBackground);
- }
- }
- }
-
- private boolean hasSoftwareButtons() {
- return getParams().getHardwareConfig().hasSoftwareButtons();
- }
-
- private void findStatusBar(RenderResources resources, DisplayMetrics metrics) {
- boolean windowFullscreen = getBooleanThemeValue(resources,
- "windowFullscreen", false /*defaultValue*/);
-
- if (windowFullscreen == false && mWindowIsFloating == false) {
- // default value
- mStatusBarSize = DEFAULT_STATUS_BAR_HEIGHT;
-
- // get the real value
- ResourceValue value = resources.getFrameworkResource(ResourceType.DIMEN,
- "status_bar_height");
-
- if (value != null) {
- TypedValue typedValue = ResourceHelper.getValue("status_bar_height",
- value.getValue(), true /*requireUnit*/);
- if (typedValue != null) {
- // compute the pixel value based on the display metrics
- mStatusBarSize = (int)typedValue.getDimension(metrics);
- }
- }
- }
- }
-
- private void findActionBar(RenderResources resources, DisplayMetrics metrics) {
- if (mWindowIsFloating) {
- return;
- }
-
- boolean windowActionBar = getBooleanThemeValue(resources,
- "windowActionBar", true /*defaultValue*/);
-
- // if there's a value and it's false (default is true)
- if (windowActionBar) {
-
- // default size of the window title bar
- mActionBarSize = DEFAULT_TITLE_BAR_HEIGHT;
-
- // get value from the theme.
- ResourceValue value = resources.findItemInTheme("actionBarSize",
- true /*isFrameworkAttr*/);
-
- // resolve it
- value = resources.resolveResValue(value);
-
- if (value != null) {
- // get the numerical value, if available
- TypedValue typedValue = ResourceHelper.getValue("actionBarSize", value.getValue(),
- true /*requireUnit*/);
- if (typedValue != null) {
- // compute the pixel value based on the display metrics
- mActionBarSize = (int)typedValue.getDimension(metrics);
- }
- }
- } else {
- // action bar overrides title bar so only look for this one if action bar is hidden
- boolean windowNoTitle = getBooleanThemeValue(resources,
- "windowNoTitle", false /*defaultValue*/);
-
- if (windowNoTitle == false) {
-
- // default size of the window title bar
- mTitleBarSize = DEFAULT_TITLE_BAR_HEIGHT;
-
- // get value from the theme.
- ResourceValue value = resources.findItemInTheme("windowTitleSize",
- true /*isFrameworkAttr*/);
-
- // resolve it
- value = resources.resolveResValue(value);
-
- if (value != null) {
- // get the numerical value, if available
- TypedValue typedValue = ResourceHelper.getValue("windowTitleSize",
- value.getValue(), true /*requireUnit*/);
- if (typedValue != null) {
- // compute the pixel value based on the display metrics
- mTitleBarSize = (int)typedValue.getDimension(metrics);
- }
- }
- }
-
- }
- }
-
- private void findNavigationBar(RenderResources resources, DisplayMetrics metrics) {
- if (hasSoftwareButtons() && mWindowIsFloating == false) {
-
- // default value
- mNavigationBarSize = 48; // ??
-
- HardwareConfig hardwareConfig = getParams().getHardwareConfig();
-
- boolean barOnBottom = true;
-
- if (hardwareConfig.getOrientation() == ScreenOrientation.LANDSCAPE) {
- // compute the dp of the screen.
- int shortSize = hardwareConfig.getScreenHeight();
-
- // compute in dp
- int shortSizeDp = shortSize * DisplayMetrics.DENSITY_DEFAULT / hardwareConfig.getDensity().getDpiValue();
-
- if (shortSizeDp < 600) {
- // 0-599dp: "phone" UI with bar on the side
- barOnBottom = false;
- } else {
- // 600+dp: "tablet" UI with bar on the bottom
- barOnBottom = true;
- }
- }
-
- if (barOnBottom) {
- mNavigationBarOrientation = LinearLayout.HORIZONTAL;
- } else {
- mNavigationBarOrientation = LinearLayout.VERTICAL;
- }
-
- // get the real value
- ResourceValue value = resources.getFrameworkResource(ResourceType.DIMEN,
- barOnBottom ? "navigation_bar_height" : "navigation_bar_width");
-
- if (value != null) {
- TypedValue typedValue = ResourceHelper.getValue("navigation_bar_height",
- value.getValue(), true /*requireUnit*/);
- if (typedValue != null) {
- // compute the pixel value based on the display metrics
- mNavigationBarSize = (int)typedValue.getDimension(metrics);
- }
- }
- }
- }
-
- /**
- * Looks for a attribute in the current theme. The attribute is in the android
- * namespace.
- *
- * @param resources the render resources
- * @param name the name of the attribute
- * @param defaultValue the default value.
- * @return the value of the attribute or the default one if not found.
- */
- private boolean getBooleanThemeValue(RenderResources resources,
- String name, boolean defaultValue) {
-
- // get the title bar flag from the current theme.
- ResourceValue value = resources.findItemInTheme(name, true /*isFrameworkAttr*/);
-
- // because it may reference something else, we resolve it.
- value = resources.resolveResValue(value);
-
- // if there's no value, return the default.
- if (value == null || value.getValue() == null) {
- return defaultValue;
- }
-
- return XmlUtils.convertValueToBoolean(value.getValue(), defaultValue);
- }
-
- /**
- * Post process on a view hierachy that was just inflated.
- * <p/>At the moment this only support TabHost: If {@link TabHost} is detected, look for the
- * {@link TabWidget}, and the corresponding {@link FrameLayout} and make new tabs automatically
- * based on the content of the {@link FrameLayout}.
- * @param view the root view to process.
- * @param projectCallback callback to the project.
- */
- private void postInflateProcess(View view, IProjectCallback projectCallback)
- throws PostInflateException {
- if (view instanceof TabHost) {
- setupTabHost((TabHost)view, projectCallback);
- } else if (view instanceof QuickContactBadge) {
- QuickContactBadge badge = (QuickContactBadge) view;
- badge.setImageToDefault();
- } else if (view instanceof AdapterView<?>) {
- // get the view ID.
- int id = view.getId();
-
- BridgeContext context = getContext();
-
- // get a ResourceReference from the integer ID.
- ResourceReference listRef = context.resolveId(id);
-
- if (listRef != null) {
- SessionParams params = getParams();
- AdapterBinding binding = params.getAdapterBindings().get(listRef);
-
- // if there was no adapter binding, trying to get it from the call back.
- if (binding == null) {
- binding = params.getProjectCallback().getAdapterBinding(listRef,
- context.getViewKey(view), view);
- }
-
- if (binding != null) {
-
- if (view instanceof AbsListView) {
- if ((binding.getFooterCount() > 0 || binding.getHeaderCount() > 0) &&
- view instanceof ListView) {
- ListView list = (ListView) view;
-
- boolean skipCallbackParser = false;
-
- int count = binding.getHeaderCount();
- for (int i = 0 ; i < count ; i++) {
- Pair<View, Boolean> pair = context.inflateView(
- binding.getHeaderAt(i),
- list, false /*attachToRoot*/, skipCallbackParser);
- if (pair.getFirst() != null) {
- list.addHeaderView(pair.getFirst());
- }
-
- skipCallbackParser |= pair.getSecond();
- }
-
- count = binding.getFooterCount();
- for (int i = 0 ; i < count ; i++) {
- Pair<View, Boolean> pair = context.inflateView(
- binding.getFooterAt(i),
- list, false /*attachToRoot*/, skipCallbackParser);
- if (pair.getFirst() != null) {
- list.addFooterView(pair.getFirst());
- }
-
- skipCallbackParser |= pair.getSecond();
- }
- }
-
- if (view instanceof ExpandableListView) {
- ((ExpandableListView) view).setAdapter(
- new FakeExpandableAdapter(
- listRef, binding, params.getProjectCallback()));
- } else {
- ((AbsListView) view).setAdapter(
- new FakeAdapter(
- listRef, binding, params.getProjectCallback()));
- }
- } else if (view instanceof AbsSpinner) {
- ((AbsSpinner) view).setAdapter(
- new FakeAdapter(
- listRef, binding, params.getProjectCallback()));
- }
- }
- }
- } else if (view instanceof ViewGroup) {
- ViewGroup group = (ViewGroup)view;
- final int count = group.getChildCount();
- for (int c = 0 ; c < count ; c++) {
- View child = group.getChildAt(c);
- postInflateProcess(child, projectCallback);
- }
- }
- }
-
- /**
- * Sets up a {@link TabHost} object.
- * @param tabHost the TabHost to setup.
- * @param projectCallback The project callback object to access the project R class.
- * @throws PostInflateException
- */
- private void setupTabHost(TabHost tabHost, IProjectCallback projectCallback)
- throws PostInflateException {
- // look for the TabWidget, and the FrameLayout. They have their own specific names
- View v = tabHost.findViewById(android.R.id.tabs);
-
- if (v == null) {
- throw new PostInflateException(
- "TabHost requires a TabWidget with id \"android:id/tabs\".\n");
- }
-
- if ((v instanceof TabWidget) == false) {
- throw new PostInflateException(String.format(
- "TabHost requires a TabWidget with id \"android:id/tabs\".\n" +
- "View found with id 'tabs' is '%s'", v.getClass().getCanonicalName()));
- }
-
- v = tabHost.findViewById(android.R.id.tabcontent);
-
- if (v == null) {
- // TODO: see if we can fake tabs even without the FrameLayout (same below when the framelayout is empty)
- throw new PostInflateException(
- "TabHost requires a FrameLayout with id \"android:id/tabcontent\".");
- }
-
- if ((v instanceof FrameLayout) == false) {
- throw new PostInflateException(String.format(
- "TabHost requires a FrameLayout with id \"android:id/tabcontent\".\n" +
- "View found with id 'tabcontent' is '%s'", v.getClass().getCanonicalName()));
- }
-
- FrameLayout content = (FrameLayout)v;
-
- // now process the content of the framelayout and dynamically create tabs for it.
- final int count = content.getChildCount();
-
- // this must be called before addTab() so that the TabHost searches its TabWidget
- // and FrameLayout.
- tabHost.setup();
-
- if (count == 0) {
- // Create a dummy child to get a single tab
- TabSpec spec = tabHost.newTabSpec("tag").setIndicator("Tab Label",
- tabHost.getResources().getDrawable(android.R.drawable.ic_menu_info_details))
- .setContent(new TabHost.TabContentFactory() {
- @Override
- public View createTabContent(String tag) {
- return new LinearLayout(getContext());
- }
- });
- tabHost.addTab(spec);
- return;
- } else {
- // for each child of the framelayout, add a new TabSpec
- for (int i = 0 ; i < count ; i++) {
- View child = content.getChildAt(i);
- String tabSpec = String.format("tab_spec%d", i+1);
- int id = child.getId();
- Pair<ResourceType, String> resource = projectCallback.resolveResourceId(id);
- String name;
- if (resource != null) {
- name = resource.getSecond();
- } else {
- name = String.format("Tab %d", i+1); // default name if id is unresolved.
- }
- tabHost.addTab(tabHost.newTabSpec(tabSpec).setIndicator(name).setContent(id));
- }
- }
- }
-
- private List<ViewInfo> startVisitingViews(View view, int offset, boolean setExtendedInfo) {
- if (view == null) {
- return null;
- }
-
- // adjust the offset to this view.
- offset += view.getTop();
-
- if (view == mContentRoot) {
- return visitAllChildren(mContentRoot, offset, setExtendedInfo);
- }
-
- // otherwise, look for mContentRoot in the children
- if (view instanceof ViewGroup) {
- ViewGroup group = ((ViewGroup) view);
-
- for (int i = 0; i < group.getChildCount(); i++) {
- List<ViewInfo> list = startVisitingViews(group.getChildAt(i), offset,
- setExtendedInfo);
- if (list != null) {
- return list;
- }
- }
- }
-
- return null;
- }
-
- /**
- * Visits a View and its children and generate a {@link ViewInfo} containing the
- * bounds of all the views.
- * @param view the root View
- * @param offset an offset for the view bounds.
- * @param setExtendedInfo whether to set the extended view info in the {@link ViewInfo} object.
- */
- private ViewInfo visit(View view, int offset, boolean setExtendedInfo) {
- if (view == null) {
- return null;
- }
-
- ViewInfo result = new ViewInfo(view.getClass().getName(),
- getContext().getViewKey(view),
- view.getLeft(), view.getTop() + offset, view.getRight(), view.getBottom() + offset,
- view, view.getLayoutParams());
-
- if (setExtendedInfo) {
- MarginLayoutParams marginParams = null;
- LayoutParams params = view.getLayoutParams();
- if (params instanceof MarginLayoutParams) {
- marginParams = (MarginLayoutParams) params;
- }
- result.setExtendedInfo(view.getBaseline(),
- marginParams != null ? marginParams.leftMargin : 0,
- marginParams != null ? marginParams.topMargin : 0,
- marginParams != null ? marginParams.rightMargin : 0,
- marginParams != null ? marginParams.bottomMargin : 0);
- }
-
- if (view instanceof ViewGroup) {
- ViewGroup group = ((ViewGroup) view);
- result.setChildren(visitAllChildren(group, 0 /*offset*/, setExtendedInfo));
- }
-
- return result;
- }
-
- /**
- * Visits all the children of a given ViewGroup generate a list of {@link ViewInfo}
- * containing the bounds of all the views.
- * @param view the root View
- * @param offset an offset for the view bounds.
- * @param setExtendedInfo whether to set the extended view info in the {@link ViewInfo} object.
- */
- private List<ViewInfo> visitAllChildren(ViewGroup viewGroup, int offset,
- boolean setExtendedInfo) {
- if (viewGroup == null) {
- return null;
- }
-
- List<ViewInfo> children = new ArrayList<ViewInfo>();
- for (int i = 0; i < viewGroup.getChildCount(); i++) {
- children.add(visit(viewGroup.getChildAt(i), offset, setExtendedInfo));
- }
- return children;
- }
-
-
- private void invalidateRenderingSize() {
- mMeasuredScreenWidth = mMeasuredScreenHeight = -1;
- }
-
- public BufferedImage getImage() {
- return mImage;
- }
-
- public boolean isAlphaChannelImage() {
- return mIsAlphaChannelImage;
- }
-
- public List<ViewInfo> getViewInfos() {
- return mViewInfoList;
- }
-
- public Map<String, String> getDefaultProperties(Object viewObject) {
- return getContext().getDefaultPropMap(viewObject);
- }
-
- public void setScene(RenderSession session) {
- mScene = session;
- }
-
- public RenderSession getSession() {
- return mScene;
- }
-}
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/ResourceHelper.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/ResourceHelper.java
deleted file mode 100644
index 6dcb693..0000000
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/ResourceHelper.java
+++ /dev/null
@@ -1,493 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.layoutlib.bridge.impl;
-
-import com.android.ide.common.rendering.api.DensityBasedResourceValue;
-import com.android.ide.common.rendering.api.LayoutLog;
-import com.android.ide.common.rendering.api.RenderResources;
-import com.android.ide.common.rendering.api.ResourceValue;
-import com.android.layoutlib.bridge.Bridge;
-import com.android.layoutlib.bridge.android.BridgeContext;
-import com.android.layoutlib.bridge.android.BridgeXmlBlockParser;
-import com.android.ninepatch.NinePatch;
-import com.android.ninepatch.NinePatchChunk;
-import com.android.resources.Density;
-
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-
-import android.content.res.ColorStateList;
-import android.graphics.Bitmap;
-import android.graphics.Bitmap_Delegate;
-import android.graphics.NinePatch_Delegate;
-import android.graphics.Rect;
-import android.graphics.drawable.BitmapDrawable;
-import android.graphics.drawable.ColorDrawable;
-import android.graphics.drawable.Drawable;
-import android.graphics.drawable.NinePatchDrawable;
-import android.util.TypedValue;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.MalformedURLException;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * Helper class to provide various conversion method used in handling android resources.
- */
-public final class ResourceHelper {
-
- private final static Pattern sFloatPattern = Pattern.compile("(-?[0-9]+(?:\\.[0-9]+)?)(.*)");
- private final static float[] sFloatOut = new float[1];
-
- private final static TypedValue mValue = new TypedValue();
-
- /**
- * Returns the color value represented by the given string value
- * @param value the color value
- * @return the color as an int
- * @throw NumberFormatException if the conversion failed.
- */
- public static int getColor(String value) {
- if (value != null) {
- if (value.startsWith("#") == false) {
- throw new NumberFormatException(
- String.format("Color value '%s' must start with #", value));
- }
-
- value = value.substring(1);
-
- // make sure it's not longer than 32bit
- if (value.length() > 8) {
- throw new NumberFormatException(String.format(
- "Color value '%s' is too long. Format is either" +
- "#AARRGGBB, #RRGGBB, #RGB, or #ARGB",
- value));
- }
-
- if (value.length() == 3) { // RGB format
- char[] color = new char[8];
- color[0] = color[1] = 'F';
- color[2] = color[3] = value.charAt(0);
- color[4] = color[5] = value.charAt(1);
- color[6] = color[7] = value.charAt(2);
- value = new String(color);
- } else if (value.length() == 4) { // ARGB format
- char[] color = new char[8];
- color[0] = color[1] = value.charAt(0);
- color[2] = color[3] = value.charAt(1);
- color[4] = color[5] = value.charAt(2);
- color[6] = color[7] = value.charAt(3);
- value = new String(color);
- } else if (value.length() == 6) {
- value = "FF" + value;
- }
-
- // this is a RRGGBB or AARRGGBB value
-
- // Integer.parseInt will fail to parse strings like "ff191919", so we use
- // a Long, but cast the result back into an int, since we know that we're only
- // dealing with 32 bit values.
- return (int)Long.parseLong(value, 16);
- }
-
- throw new NumberFormatException();
- }
-
- public static ColorStateList getColorStateList(ResourceValue resValue, BridgeContext context) {
- String value = resValue.getValue();
- if (value != null && RenderResources.REFERENCE_NULL.equals(value) == false) {
- // first check if the value is a file (xml most likely)
- File f = new File(value);
- if (f.isFile()) {
- try {
- // let the framework inflate the ColorStateList from the XML file, by
- // providing an XmlPullParser
- XmlPullParser parser = ParserFactory.create(f);
-
- BridgeXmlBlockParser blockParser = new BridgeXmlBlockParser(
- parser, context, resValue.isFramework());
- try {
- return ColorStateList.createFromXml(context.getResources(), blockParser);
- } finally {
- blockParser.ensurePopped();
- }
- } catch (XmlPullParserException e) {
- Bridge.getLog().error(LayoutLog.TAG_BROKEN,
- "Failed to configure parser for " + value, e, null /*data*/);
- // we'll return null below.
- } catch (Exception e) {
- // this is an error and not warning since the file existence is
- // checked before attempting to parse it.
- Bridge.getLog().error(LayoutLog.TAG_RESOURCES_READ,
- "Failed to parse file " + value, e, null /*data*/);
-
- return null;
- }
- } else {
- // try to load the color state list from an int
- try {
- int color = ResourceHelper.getColor(value);
- return ColorStateList.valueOf(color);
- } catch (NumberFormatException e) {
- Bridge.getLog().error(LayoutLog.TAG_RESOURCES_FORMAT,
- "Failed to convert " + value + " into a ColorStateList", e,
- null /*data*/);
- return null;
- }
- }
- }
-
- return null;
- }
-
- /**
- * Returns a drawable from the given value.
- * @param value The value that contains a path to a 9 patch, a bitmap or a xml based drawable,
- * or an hexadecimal color
- * @param context the current context
- */
- public static Drawable getDrawable(ResourceValue value, BridgeContext context) {
- String stringValue = value.getValue();
- if (RenderResources.REFERENCE_NULL.equals(stringValue)) {
- return null;
- }
-
- String lowerCaseValue = stringValue.toLowerCase();
-
- Density density = Density.MEDIUM;
- if (value instanceof DensityBasedResourceValue) {
- density =
- ((DensityBasedResourceValue)value).getResourceDensity();
- }
-
-
- if (lowerCaseValue.endsWith(NinePatch.EXTENSION_9PATCH)) {
- File file = new File(stringValue);
- if (file.isFile()) {
- try {
- return getNinePatchDrawable(
- new FileInputStream(file), density, value.isFramework(),
- stringValue, context);
- } catch (IOException e) {
- // failed to read the file, we'll return null below.
- Bridge.getLog().error(LayoutLog.TAG_RESOURCES_READ,
- "Failed lot load " + file.getAbsolutePath(), e, null /*data*/);
- }
- }
-
- return null;
- } else if (lowerCaseValue.endsWith(".xml")) {
- // create a block parser for the file
- File f = new File(stringValue);
- if (f.isFile()) {
- try {
- // let the framework inflate the Drawable from the XML file.
- XmlPullParser parser = ParserFactory.create(f);
-
- BridgeXmlBlockParser blockParser = new BridgeXmlBlockParser(
- parser, context, value.isFramework());
- try {
- return Drawable.createFromXml(context.getResources(), blockParser);
- } finally {
- blockParser.ensurePopped();
- }
- } catch (Exception e) {
- // this is an error and not warning since the file existence is checked before
- // attempting to parse it.
- Bridge.getLog().error(null, "Failed to parse file " + stringValue,
- e, null /*data*/);
- }
- } else {
- Bridge.getLog().error(LayoutLog.TAG_BROKEN,
- String.format("File %s does not exist (or is not a file)", stringValue),
- null /*data*/);
- }
-
- return null;
- } else {
- File bmpFile = new File(stringValue);
- if (bmpFile.isFile()) {
- try {
- Bitmap bitmap = Bridge.getCachedBitmap(stringValue,
- value.isFramework() ? null : context.getProjectKey());
-
- if (bitmap == null) {
- bitmap = Bitmap_Delegate.createBitmap(bmpFile, false /*isMutable*/,
- density);
- Bridge.setCachedBitmap(stringValue, bitmap,
- value.isFramework() ? null : context.getProjectKey());
- }
-
- return new BitmapDrawable(context.getResources(), bitmap);
- } catch (IOException e) {
- // we'll return null below
- Bridge.getLog().error(LayoutLog.TAG_RESOURCES_READ,
- "Failed lot load " + bmpFile.getAbsolutePath(), e, null /*data*/);
- }
- } else {
- // attempt to get a color from the value
- try {
- int color = getColor(stringValue);
- return new ColorDrawable(color);
- } catch (NumberFormatException e) {
- // we'll return null below.
- Bridge.getLog().error(LayoutLog.TAG_RESOURCES_FORMAT,
- "Failed to convert " + stringValue + " into a drawable", e,
- null /*data*/);
- }
- }
- }
-
- return null;
- }
-
- private static Drawable getNinePatchDrawable(InputStream inputStream, Density density,
- boolean isFramework, String cacheKey, BridgeContext context) throws IOException {
- // see if we still have both the chunk and the bitmap in the caches
- NinePatchChunk chunk = Bridge.getCached9Patch(cacheKey,
- isFramework ? null : context.getProjectKey());
- Bitmap bitmap = Bridge.getCachedBitmap(cacheKey,
- isFramework ? null : context.getProjectKey());
-
- // if either chunk or bitmap is null, then we reload the 9-patch file.
- if (chunk == null || bitmap == null) {
- try {
- NinePatch ninePatch = NinePatch.load(inputStream, true /*is9Patch*/,
- false /* convert */);
- if (ninePatch != null) {
- if (chunk == null) {
- chunk = ninePatch.getChunk();
-
- Bridge.setCached9Patch(cacheKey, chunk,
- isFramework ? null : context.getProjectKey());
- }
-
- if (bitmap == null) {
- bitmap = Bitmap_Delegate.createBitmap(ninePatch.getImage(),
- false /*isMutable*/,
- density);
-
- Bridge.setCachedBitmap(cacheKey, bitmap,
- isFramework ? null : context.getProjectKey());
- }
- }
- } catch (MalformedURLException e) {
- // URL is wrong, we'll return null below
- }
- }
-
- if (chunk != null && bitmap != null) {
- int[] padding = chunk.getPadding();
- Rect paddingRect = new Rect(padding[0], padding[1], padding[2], padding[3]);
-
- return new NinePatchDrawable(context.getResources(), bitmap,
- NinePatch_Delegate.serialize(chunk),
- paddingRect, null);
- }
-
- return null;
- }
-
- // ------- TypedValue stuff
- // This is taken from //device/libs/utils/ResourceTypes.cpp
-
- private static final class UnitEntry {
- String name;
- int type;
- int unit;
- float scale;
-
- UnitEntry(String name, int type, int unit, float scale) {
- this.name = name;
- this.type = type;
- this.unit = unit;
- this.scale = scale;
- }
- }
-
- private final static UnitEntry[] sUnitNames = new UnitEntry[] {
- new UnitEntry("px", TypedValue.TYPE_DIMENSION, TypedValue.COMPLEX_UNIT_PX, 1.0f),
- new UnitEntry("dip", TypedValue.TYPE_DIMENSION, TypedValue.COMPLEX_UNIT_DIP, 1.0f),
- new UnitEntry("dp", TypedValue.TYPE_DIMENSION, TypedValue.COMPLEX_UNIT_DIP, 1.0f),
- new UnitEntry("sp", TypedValue.TYPE_DIMENSION, TypedValue.COMPLEX_UNIT_SP, 1.0f),
- new UnitEntry("pt", TypedValue.TYPE_DIMENSION, TypedValue.COMPLEX_UNIT_PT, 1.0f),
- new UnitEntry("in", TypedValue.TYPE_DIMENSION, TypedValue.COMPLEX_UNIT_IN, 1.0f),
- new UnitEntry("mm", TypedValue.TYPE_DIMENSION, TypedValue.COMPLEX_UNIT_MM, 1.0f),
- new UnitEntry("%", TypedValue.TYPE_FRACTION, TypedValue.COMPLEX_UNIT_FRACTION, 1.0f/100),
- new UnitEntry("%p", TypedValue.TYPE_FRACTION, TypedValue.COMPLEX_UNIT_FRACTION_PARENT, 1.0f/100),
- };
-
- /**
- * Returns the raw value from the given attribute float-type value string.
- * This object is only valid until the next call on to {@link ResourceHelper}.
- */
- public static TypedValue getValue(String attribute, String value, boolean requireUnit) {
- if (parseFloatAttribute(attribute, value, mValue, requireUnit)) {
- return mValue;
- }
-
- return null;
- }
-
- /**
- * Parse a float attribute and return the parsed value into a given TypedValue.
- * @param attribute the name of the attribute. Can be null if <var>requireUnit</var> is false.
- * @param value the string value of the attribute
- * @param outValue the TypedValue to receive the parsed value
- * @param requireUnit whether the value is expected to contain a unit.
- * @return true if success.
- */
- public static boolean parseFloatAttribute(String attribute, String value,
- TypedValue outValue, boolean requireUnit) {
- assert requireUnit == false || attribute != null;
-
- // remove the space before and after
- value = value.trim();
- int len = value.length();
-
- if (len <= 0) {
- return false;
- }
-
- // check that there's no non ascii characters.
- char[] buf = value.toCharArray();
- for (int i = 0 ; i < len ; i++) {
- if (buf[i] > 255) {
- return false;
- }
- }
-
- // check the first character
- if (buf[0] < '0' && buf[0] > '9' && buf[0] != '.' && buf[0] != '-') {
- return false;
- }
-
- // now look for the string that is after the float...
- Matcher m = sFloatPattern.matcher(value);
- if (m.matches()) {
- String f_str = m.group(1);
- String end = m.group(2);
-
- float f;
- try {
- f = Float.parseFloat(f_str);
- } catch (NumberFormatException e) {
- // this shouldn't happen with the regexp above.
- return false;
- }
-
- if (end.length() > 0 && end.charAt(0) != ' ') {
- // Might be a unit...
- if (parseUnit(end, outValue, sFloatOut)) {
- computeTypedValue(outValue, f, sFloatOut[0]);
- return true;
- }
- return false;
- }
-
- // make sure it's only spaces at the end.
- end = end.trim();
-
- if (end.length() == 0) {
- if (outValue != null) {
- if (requireUnit == false) {
- outValue.type = TypedValue.TYPE_FLOAT;
- outValue.data = Float.floatToIntBits(f);
- } else {
- // no unit when required? Use dp and out an error.
- applyUnit(sUnitNames[1], outValue, sFloatOut);
- computeTypedValue(outValue, f, sFloatOut[0]);
-
- Bridge.getLog().error(LayoutLog.TAG_RESOURCES_RESOLVE,
- String.format(
- "Dimension \"%1$s\" in attribute \"%2$s\" is missing unit!",
- value, attribute),
- null);
- }
- return true;
- }
- }
- }
-
- return false;
- }
-
- private static void computeTypedValue(TypedValue outValue, float value, float scale) {
- value *= scale;
- boolean neg = value < 0;
- if (neg) {
- value = -value;
- }
- long bits = (long)(value*(1<<23)+.5f);
- int radix;
- int shift;
- if ((bits&0x7fffff) == 0) {
- // Always use 23p0 if there is no fraction, just to make
- // things easier to read.
- radix = TypedValue.COMPLEX_RADIX_23p0;
- shift = 23;
- } else if ((bits&0xffffffffff800000L) == 0) {
- // Magnitude is zero -- can fit in 0 bits of precision.
- radix = TypedValue.COMPLEX_RADIX_0p23;
- shift = 0;
- } else if ((bits&0xffffffff80000000L) == 0) {
- // Magnitude can fit in 8 bits of precision.
- radix = TypedValue.COMPLEX_RADIX_8p15;
- shift = 8;
- } else if ((bits&0xffffff8000000000L) == 0) {
- // Magnitude can fit in 16 bits of precision.
- radix = TypedValue.COMPLEX_RADIX_16p7;
- shift = 16;
- } else {
- // Magnitude needs entire range, so no fractional part.
- radix = TypedValue.COMPLEX_RADIX_23p0;
- shift = 23;
- }
- int mantissa = (int)(
- (bits>>shift) & TypedValue.COMPLEX_MANTISSA_MASK);
- if (neg) {
- mantissa = (-mantissa) & TypedValue.COMPLEX_MANTISSA_MASK;
- }
- outValue.data |=
- (radix<<TypedValue.COMPLEX_RADIX_SHIFT)
- | (mantissa<<TypedValue.COMPLEX_MANTISSA_SHIFT);
- }
-
- private static boolean parseUnit(String str, TypedValue outValue, float[] outScale) {
- str = str.trim();
-
- for (UnitEntry unit : sUnitNames) {
- if (unit.name.equals(str)) {
- applyUnit(unit, outValue, outScale);
- return true;
- }
- }
-
- return false;
- }
-
- private static void applyUnit(UnitEntry unit, TypedValue outValue, float[] outScale) {
- outValue.type = unit.type;
- outValue.data = unit.unit << TypedValue.COMPLEX_UNIT_SHIFT;
- outScale[0] = unit.scale;
- }
-}
-
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/Stack.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/Stack.java
deleted file mode 100644
index 9bd0015..0000000
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/Stack.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.layoutlib.bridge.impl;
-
-import java.util.ArrayList;
-
-/**
- * Custom Stack implementation on top of an {@link ArrayList} instead of
- * using {@link java.util.Stack} which is on top of a vector.
- *
- * @param <T>
- */
-public class Stack<T> extends ArrayList<T> {
-
- private static final long serialVersionUID = 1L;
-
- public Stack() {
- super();
- }
-
- public Stack(int size) {
- super(size);
- }
-
- /**
- * Pushes the given object to the stack
- * @param object the object to push
- */
- public void push(T object) {
- add(object);
- }
-
- /**
- * Remove the object at the top of the stack and returns it.
- * @return the removed object or null if the stack was empty.
- */
- public T pop() {
- if (size() > 0) {
- return remove(size() - 1);
- }
-
- return null;
- }
-
- /**
- * Returns the object at the top of the stack.
- * @return the object at the top or null if the stack is empty.
- */
- public T peek() {
- if (size() > 0) {
- return get(size() - 1);
- }
-
- return null;
- }
-}
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/binding/AdapterHelper.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/binding/AdapterHelper.java
deleted file mode 100644
index 6c998af..0000000
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/binding/AdapterHelper.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Copyright (C) 2013 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.layoutlib.bridge.impl.binding;
-
-import com.android.ide.common.rendering.api.DataBindingItem;
-import com.android.ide.common.rendering.api.IProjectCallback;
-import com.android.ide.common.rendering.api.LayoutLog;
-import com.android.ide.common.rendering.api.ResourceReference;
-import com.android.ide.common.rendering.api.IProjectCallback.ViewAttribute;
-import com.android.layoutlib.bridge.Bridge;
-import com.android.layoutlib.bridge.android.BridgeContext;
-import com.android.layoutlib.bridge.impl.RenderAction;
-import com.android.util.Pair;
-
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.AdapterView;
-import android.widget.Checkable;
-import android.widget.ImageView;
-import android.widget.TextView;
-
-/**
- * A Helper class to do fake data binding in {@link AdapterView} objects.
- */
-@SuppressWarnings("deprecation")
-public class AdapterHelper {
-
- static Pair<View, Boolean> getView(AdapterItem item, AdapterItem parentItem, ViewGroup parent,
- IProjectCallback callback, ResourceReference adapterRef, boolean skipCallbackParser) {
- // we don't care about recycling here because we never scroll.
- DataBindingItem dataBindingItem = item.getDataBindingItem();
-
- BridgeContext context = RenderAction.getCurrentContext();
-
- Pair<View, Boolean> pair = context.inflateView(dataBindingItem.getViewReference(),
- parent, false /*attachToRoot*/, skipCallbackParser);
-
- View view = pair.getFirst();
- skipCallbackParser |= pair.getSecond();
-
- if (view != null) {
- fillView(context, view, item, parentItem, callback, adapterRef);
- } else {
- // create a text view to display an error.
- TextView tv = new TextView(context);
- tv.setText("Unable to find layout: " + dataBindingItem.getViewReference().getName());
- view = tv;
- }
-
- return Pair.of(view, skipCallbackParser);
- }
-
- private static void fillView(BridgeContext context, View view, AdapterItem item,
- AdapterItem parentItem, IProjectCallback callback, ResourceReference adapterRef) {
- if (view instanceof ViewGroup) {
- ViewGroup group = (ViewGroup) view;
- final int count = group.getChildCount();
- for (int i = 0 ; i < count ; i++) {
- fillView(context, group.getChildAt(i), item, parentItem, callback, adapterRef);
- }
- } else {
- int id = view.getId();
- if (id != 0) {
- ResourceReference resolvedRef = context.resolveId(id);
- if (resolvedRef != null) {
- int fullPosition = item.getFullPosition();
- int positionPerType = item.getPositionPerType();
- int fullParentPosition = parentItem != null ? parentItem.getFullPosition() : 0;
- int parentPositionPerType = parentItem != null ?
- parentItem.getPositionPerType() : 0;
-
- if (view instanceof TextView) {
- TextView tv = (TextView) view;
- Object value = callback.getAdapterItemValue(
- adapterRef, context.getViewKey(view),
- item.getDataBindingItem().getViewReference(),
- fullPosition, positionPerType,
- fullParentPosition, parentPositionPerType,
- resolvedRef, ViewAttribute.TEXT, tv.getText().toString());
- if (value != null) {
- if (value.getClass() != ViewAttribute.TEXT.getAttributeClass()) {
- Bridge.getLog().error(LayoutLog.TAG_BROKEN, String.format(
- "Wrong Adapter Item value class for TEXT. Expected String, got %s",
- value.getClass().getName()), null);
- } else {
- tv.setText((String) value);
- }
- }
- }
-
- if (view instanceof Checkable) {
- Checkable cb = (Checkable) view;
-
- Object value = callback.getAdapterItemValue(
- adapterRef, context.getViewKey(view),
- item.getDataBindingItem().getViewReference(),
- fullPosition, positionPerType,
- fullParentPosition, parentPositionPerType,
- resolvedRef, ViewAttribute.IS_CHECKED, cb.isChecked());
- if (value != null) {
- if (value.getClass() != ViewAttribute.IS_CHECKED.getAttributeClass()) {
- Bridge.getLog().error(LayoutLog.TAG_BROKEN, String.format(
- "Wrong Adapter Item value class for TEXT. Expected Boolean, got %s",
- value.getClass().getName()), null);
- } else {
- cb.setChecked((Boolean) value);
- }
- }
- }
-
- if (view instanceof ImageView) {
- ImageView iv = (ImageView) view;
-
- Object value = callback.getAdapterItemValue(
- adapterRef, context.getViewKey(view),
- item.getDataBindingItem().getViewReference(),
- fullPosition, positionPerType,
- fullParentPosition, parentPositionPerType,
- resolvedRef, ViewAttribute.SRC, iv.getDrawable());
- if (value != null) {
- if (value.getClass() != ViewAttribute.SRC.getAttributeClass()) {
- Bridge.getLog().error(LayoutLog.TAG_BROKEN, String.format(
- "Wrong Adapter Item value class for TEXT. Expected Boolean, got %s",
- value.getClass().getName()), null);
- } else {
- // FIXME
- }
- }
- }
- }
- }
- }
- }
-}
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/binding/AdapterItem.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/binding/AdapterItem.java
deleted file mode 100644
index 8e28dba..0000000
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/binding/AdapterItem.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright (C) 2013 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.layoutlib.bridge.impl.binding;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import com.android.ide.common.rendering.api.DataBindingItem;
-
-/**
- * This is the items provided by the adapter. They are dynamically generated.
- */
-final class AdapterItem {
- private final DataBindingItem mItem;
- private final int mType;
- private final int mFullPosition;
- private final int mPositionPerType;
- private List<AdapterItem> mChildren;
-
- protected AdapterItem(DataBindingItem item, int type, int fullPosition,
- int positionPerType) {
- mItem = item;
- mType = type;
- mFullPosition = fullPosition;
- mPositionPerType = positionPerType;
- }
-
- void addChild(AdapterItem child) {
- if (mChildren == null) {
- mChildren = new ArrayList<AdapterItem>();
- }
-
- mChildren.add(child);
- }
-
- List<AdapterItem> getChildren() {
- if (mChildren != null) {
- return mChildren;
- }
-
- return Collections.emptyList();
- }
-
- int getType() {
- return mType;
- }
-
- int getFullPosition() {
- return mFullPosition;
- }
-
- int getPositionPerType() {
- return mPositionPerType;
- }
-
- DataBindingItem getDataBindingItem() {
- return mItem;
- }
-}
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/binding/FakeAdapter.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/binding/FakeAdapter.java
deleted file mode 100644
index 9a13f5a..0000000
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/binding/FakeAdapter.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * Copyright (C) 2011 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.layoutlib.bridge.impl.binding;
-
-import com.android.ide.common.rendering.api.AdapterBinding;
-import com.android.ide.common.rendering.api.DataBindingItem;
-import com.android.ide.common.rendering.api.IProjectCallback;
-import com.android.ide.common.rendering.api.ResourceReference;
-import com.android.util.Pair;
-
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.AdapterView;
-import android.widget.BaseAdapter;
-import android.widget.ListAdapter;
-import android.widget.SpinnerAdapter;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Fake adapter to do fake data binding in {@link AdapterView} objects for {@link ListAdapter}
- * and {@link SpinnerAdapter}.
- *
- */
-@SuppressWarnings("deprecation")
-public class FakeAdapter extends BaseAdapter {
-
- // don't use a set because the order is important.
- private final List<ResourceReference> mTypes = new ArrayList<ResourceReference>();
- private final IProjectCallback mCallback;
- private final ResourceReference mAdapterRef;
- private final List<AdapterItem> mItems = new ArrayList<AdapterItem>();
- private boolean mSkipCallbackParser = false;
-
- public FakeAdapter(ResourceReference adapterRef, AdapterBinding binding,
- IProjectCallback callback) {
- mAdapterRef = adapterRef;
- mCallback = callback;
-
- final int repeatCount = binding.getRepeatCount();
- final int itemCount = binding.getItemCount();
-
- // Need an array to count for each type.
- // This is likely too big, but is the max it can be.
- int[] typeCount = new int[itemCount];
-
- // We put several repeating sets.
- for (int r = 0 ; r < repeatCount ; r++) {
- // loop on the type of list items, and add however many for each type.
- for (DataBindingItem dataBindingItem : binding) {
- ResourceReference viewRef = dataBindingItem.getViewReference();
- int typeIndex = mTypes.indexOf(viewRef);
- if (typeIndex == -1) {
- typeIndex = mTypes.size();
- mTypes.add(viewRef);
- }
-
- int count = dataBindingItem.getCount();
-
- int index = typeCount[typeIndex];
- typeCount[typeIndex] += count;
-
- for (int k = 0 ; k < count ; k++) {
- mItems.add(new AdapterItem(dataBindingItem, typeIndex, mItems.size(), index++));
- }
- }
- }
- }
-
- @Override
- public boolean isEnabled(int position) {
- return true;
- }
-
- @Override
- public int getCount() {
- return mItems.size();
- }
-
- @Override
- public Object getItem(int position) {
- return mItems.get(position);
- }
-
- @Override
- public long getItemId(int position) {
- return position;
- }
-
- @Override
- public int getItemViewType(int position) {
- return mItems.get(position).getType();
- }
-
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- // we don't care about recycling here because we never scroll.
- AdapterItem item = mItems.get(position);
- Pair<View, Boolean> pair = AdapterHelper.getView(item, null /*parentGroup*/, parent,
- mCallback, mAdapterRef, mSkipCallbackParser);
- mSkipCallbackParser = pair.getSecond();
- return pair.getFirst();
-
- }
-
- @Override
- public int getViewTypeCount() {
- return mTypes.size();
- }
-
- // ---- SpinnerAdapter
-
- @Override
- public View getDropDownView(int position, View convertView, ViewGroup parent) {
- // pass
- return null;
- }
-}
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/binding/FakeExpandableAdapter.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/binding/FakeExpandableAdapter.java
deleted file mode 100644
index e539579..0000000
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/binding/FakeExpandableAdapter.java
+++ /dev/null
@@ -1,236 +0,0 @@
-/*
- * Copyright (C) 2011 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.layoutlib.bridge.impl.binding;
-
-import com.android.ide.common.rendering.api.AdapterBinding;
-import com.android.ide.common.rendering.api.DataBindingItem;
-import com.android.ide.common.rendering.api.IProjectCallback;
-import com.android.ide.common.rendering.api.ResourceReference;
-import com.android.util.Pair;
-
-import android.database.DataSetObserver;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.ExpandableListAdapter;
-import android.widget.HeterogeneousExpandableList;
-
-import java.util.ArrayList;
-import java.util.List;
-
-@SuppressWarnings("deprecation")
-public class FakeExpandableAdapter implements ExpandableListAdapter, HeterogeneousExpandableList {
-
- private final IProjectCallback mCallback;
- private final ResourceReference mAdapterRef;
- private boolean mSkipCallbackParser = false;
-
- protected final List<AdapterItem> mItems = new ArrayList<AdapterItem>();
-
- // don't use a set because the order is important.
- private final List<ResourceReference> mGroupTypes = new ArrayList<ResourceReference>();
- private final List<ResourceReference> mChildrenTypes = new ArrayList<ResourceReference>();
-
- public FakeExpandableAdapter(ResourceReference adapterRef, AdapterBinding binding,
- IProjectCallback callback) {
- mAdapterRef = adapterRef;
- mCallback = callback;
-
- createItems(binding, binding.getItemCount(), binding.getRepeatCount(), mGroupTypes, 1);
- }
-
- private void createItems(Iterable<DataBindingItem> iterable, final int itemCount,
- final int repeatCount, List<ResourceReference> types, int depth) {
- // Need an array to count for each type.
- // This is likely too big, but is the max it can be.
- int[] typeCount = new int[itemCount];
-
- // we put several repeating sets.
- for (int r = 0 ; r < repeatCount ; r++) {
- // loop on the type of list items, and add however many for each type.
- for (DataBindingItem dataBindingItem : iterable) {
- ResourceReference viewRef = dataBindingItem.getViewReference();
- int typeIndex = types.indexOf(viewRef);
- if (typeIndex == -1) {
- typeIndex = types.size();
- types.add(viewRef);
- }
-
- List<DataBindingItem> children = dataBindingItem.getChildren();
- int count = dataBindingItem.getCount();
-
- // if there are children, we use the count as a repeat count for the children.
- if (children.size() > 0) {
- count = 1;
- }
-
- int index = typeCount[typeIndex];
- typeCount[typeIndex] += count;
-
- for (int k = 0 ; k < count ; k++) {
- AdapterItem item = new AdapterItem(dataBindingItem, typeIndex, mItems.size(),
- index++);
- mItems.add(item);
-
- if (children.size() > 0) {
- createItems(dataBindingItem, depth + 1);
- }
- }
- }
- }
- }
-
- private void createItems(DataBindingItem item, int depth) {
- if (depth == 2) {
- createItems(item, item.getChildren().size(), item.getCount(), mChildrenTypes, depth);
- }
- }
-
- private AdapterItem getChildItem(int groupPosition, int childPosition) {
- AdapterItem item = mItems.get(groupPosition);
-
- List<AdapterItem> children = item.getChildren();
- return children.get(childPosition);
- }
-
- // ---- ExpandableListAdapter
-
- @Override
- public int getGroupCount() {
- return mItems.size();
- }
-
- @Override
- public int getChildrenCount(int groupPosition) {
- AdapterItem item = mItems.get(groupPosition);
- return item.getChildren().size();
- }
-
- @Override
- public Object getGroup(int groupPosition) {
- return mItems.get(groupPosition);
- }
-
- @Override
- public Object getChild(int groupPosition, int childPosition) {
- return getChildItem(groupPosition, childPosition);
- }
-
- @Override
- public View getGroupView(int groupPosition, boolean isExpanded, View convertView,
- ViewGroup parent) {
- // we don't care about recycling here because we never scroll.
- AdapterItem item = mItems.get(groupPosition);
- Pair<View, Boolean> pair = AdapterHelper.getView(item, null /*parentItem*/, parent,
- mCallback, mAdapterRef, mSkipCallbackParser);
- mSkipCallbackParser = pair.getSecond();
- return pair.getFirst();
- }
-
- @Override
- public View getChildView(int groupPosition, int childPosition, boolean isLastChild,
- View convertView, ViewGroup parent) {
- // we don't care about recycling here because we never scroll.
- AdapterItem parentItem = mItems.get(groupPosition);
- AdapterItem item = getChildItem(groupPosition, childPosition);
- Pair<View, Boolean> pair = AdapterHelper.getView(item, parentItem, parent, mCallback,
- mAdapterRef, mSkipCallbackParser);
- mSkipCallbackParser = pair.getSecond();
- return pair.getFirst();
- }
-
- @Override
- public long getGroupId(int groupPosition) {
- return groupPosition;
- }
-
- @Override
- public long getChildId(int groupPosition, int childPosition) {
- return childPosition;
- }
-
- @Override
- public long getCombinedGroupId(long groupId) {
- return groupId << 16 | 0x0000FFFF;
- }
-
- @Override
- public long getCombinedChildId(long groupId, long childId) {
- return groupId << 16 | childId;
- }
-
- @Override
- public boolean isChildSelectable(int groupPosition, int childPosition) {
- return true;
- }
-
- @Override
- public void onGroupCollapsed(int groupPosition) {
- // pass
- }
-
- @Override
- public void onGroupExpanded(int groupPosition) {
- // pass
- }
-
- @Override
- public void registerDataSetObserver(DataSetObserver observer) {
- // pass
- }
-
- @Override
- public void unregisterDataSetObserver(DataSetObserver observer) {
- // pass
- }
-
- @Override
- public boolean hasStableIds() {
- return true;
- }
-
- @Override
- public boolean areAllItemsEnabled() {
- return true;
- }
-
- @Override
- public boolean isEmpty() {
- return mItems.isEmpty();
- }
-
- // ---- HeterogeneousExpandableList
-
- @Override
- public int getChildType(int groupPosition, int childPosition) {
- return getChildItem(groupPosition, childPosition).getType();
- }
-
- @Override
- public int getChildTypeCount() {
- return mChildrenTypes.size();
- }
-
- @Override
- public int getGroupType(int groupPosition) {
- return mItems.get(groupPosition).getType();
- }
-
- @Override
- public int getGroupTypeCount() {
- return mGroupTypes.size();
- }
-}
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/util/Debug.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/util/Debug.java
deleted file mode 100644
index 82eab85..0000000
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/util/Debug.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2011 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.layoutlib.bridge.util;
-
-public class Debug {
-
- public final static boolean DEBUG = false;
-
-}
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/util/DynamicIdMap.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/util/DynamicIdMap.java
deleted file mode 100644
index a1fae95..0000000
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/util/DynamicIdMap.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Copyright (C) 2012 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.layoutlib.bridge.util;
-
-import com.android.resources.ResourceType;
-import com.android.util.Pair;
-
-import android.util.SparseArray;
-
-import java.util.HashMap;
-import java.util.Map;
-
-public class DynamicIdMap {
-
- private final Map<Pair<ResourceType, String>, Integer> mDynamicIds = new HashMap<Pair<ResourceType, String>, Integer>();
- private final SparseArray<Pair<ResourceType, String>> mRevDynamicIds = new SparseArray<Pair<ResourceType, String>>();
- private int mDynamicSeed;
-
- public DynamicIdMap(int seed) {
- mDynamicSeed = seed;
- }
-
- public void reset(int seed) {
- mDynamicIds.clear();
- mRevDynamicIds.clear();
- mDynamicSeed = seed;
- }
-
- /**
- * Returns a dynamic integer for the given resource type/name, creating it if it doesn't
- * already exist.
- *
- * @param type the type of the resource
- * @param name the name of the resource
- * @return an integer.
- */
- public Integer getId(ResourceType type, String name) {
- return getId(Pair.of(type, name));
- }
-
- /**
- * Returns a dynamic integer for the given resource type/name, creating it if it doesn't
- * already exist.
- *
- * @param resource the type/name of the resource
- * @return an integer.
- */
- public Integer getId(Pair<ResourceType, String> resource) {
- Integer value = mDynamicIds.get(resource);
- if (value == null) {
- value = Integer.valueOf(++mDynamicSeed);
- mDynamicIds.put(resource, value);
- mRevDynamicIds.put(value, resource);
- }
-
- return value;
- }
-
- public Pair<ResourceType, String> resolveId(int id) {
- return mRevDynamicIds.get(id);
- }
-}
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/util/SparseWeakArray.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/util/SparseWeakArray.java
deleted file mode 100644
index 4d0c9ce..0000000
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/util/SparseWeakArray.java
+++ /dev/null
@@ -1,376 +0,0 @@
-/*
- * Copyright (C) 2011 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.layoutlib.bridge.util;
-
-
-import com.android.internal.util.ArrayUtils;
-
-import android.util.SparseArray;
-
-import java.lang.ref.WeakReference;
-
-/**
- * This is a custom {@link SparseArray} that uses {@link WeakReference} around the objects added
- * to it. When the array is compacted, not only deleted indices but also empty references
- * are removed, making the array efficient at removing references that were reclaimed.
- *
- * The code is taken from {@link SparseArray} directly and adapted to use weak references.
- *
- * Because our usage means that we never actually call {@link #remove(int)} or {@link #delete(int)},
- * we must manually check if there are reclaimed references to trigger an internal compact step
- * (which is normally only triggered when an item is manually removed).
- *
- * SparseArrays map integers to Objects. Unlike a normal array of Objects,
- * there can be gaps in the indices. It is intended to be more efficient
- * than using a HashMap to map Integers to Objects.
- */
-@SuppressWarnings("unchecked")
-public class SparseWeakArray<E> {
-
- private static final Object DELETED_REF = new Object();
- private static final WeakReference<?> DELETED = new WeakReference(DELETED_REF);
- private boolean mGarbage = false;
-
- /**
- * Creates a new SparseArray containing no mappings.
- */
- public SparseWeakArray() {
- this(10);
- }
-
- /**
- * Creates a new SparseArray containing no mappings that will not
- * require any additional memory allocation to store the specified
- * number of mappings.
- */
- public SparseWeakArray(int initialCapacity) {
- initialCapacity = ArrayUtils.idealIntArraySize(initialCapacity);
-
- mKeys = new int[initialCapacity];
- mValues = new WeakReference[initialCapacity];
- mSize = 0;
- }
-
- /**
- * Gets the Object mapped from the specified key, or <code>null</code>
- * if no such mapping has been made.
- */
- public E get(int key) {
- return get(key, null);
- }
-
- /**
- * Gets the Object mapped from the specified key, or the specified Object
- * if no such mapping has been made.
- */
- public E get(int key, E valueIfKeyNotFound) {
- int i = binarySearch(mKeys, 0, mSize, key);
-
- if (i < 0 || mValues[i] == DELETED || mValues[i].get() == null) {
- return valueIfKeyNotFound;
- } else {
- return (E) mValues[i].get();
- }
- }
-
- /**
- * Removes the mapping from the specified key, if there was any.
- */
- public void delete(int key) {
- int i = binarySearch(mKeys, 0, mSize, key);
-
- if (i >= 0) {
- if (mValues[i] != DELETED) {
- mValues[i] = DELETED;
- mGarbage = true;
- }
- }
- }
-
- /**
- * Alias for {@link #delete(int)}.
- */
- public void remove(int key) {
- delete(key);
- }
-
- /**
- * Removes the mapping at the specified index.
- */
- public void removeAt(int index) {
- if (mValues[index] != DELETED) {
- mValues[index] = DELETED;
- mGarbage = true;
- }
- }
-
- private void gc() {
- int n = mSize;
- int o = 0;
- int[] keys = mKeys;
- WeakReference<?>[] values = mValues;
-
- for (int i = 0; i < n; i++) {
- WeakReference<?> val = values[i];
-
- // Don't keep any non DELETED values, but only the one that still have a valid
- // reference.
- if (val != DELETED && val.get() != null) {
- if (i != o) {
- keys[o] = keys[i];
- values[o] = val;
- }
-
- o++;
- }
- }
-
- mGarbage = false;
- mSize = o;
-
- int newSize = ArrayUtils.idealIntArraySize(mSize);
- if (newSize < mKeys.length) {
- int[] nkeys = new int[newSize];
- WeakReference<?>[] nvalues = new WeakReference[newSize];
-
- System.arraycopy(mKeys, 0, nkeys, 0, newSize);
- System.arraycopy(mValues, 0, nvalues, 0, newSize);
-
- mKeys = nkeys;
- mValues = nvalues;
- }
- }
-
- /**
- * Adds a mapping from the specified key to the specified value,
- * replacing the previous mapping from the specified key if there
- * was one.
- */
- public void put(int key, E value) {
- int i = binarySearch(mKeys, 0, mSize, key);
-
- if (i >= 0) {
- mValues[i] = new WeakReference(value);
- } else {
- i = ~i;
-
- if (i < mSize && (mValues[i] == DELETED || mValues[i].get() == null)) {
- mKeys[i] = key;
- mValues[i] = new WeakReference(value);
- return;
- }
-
- if (mSize >= mKeys.length && (mGarbage || hasReclaimedRefs())) {
- gc();
-
- // Search again because indices may have changed.
- i = ~binarySearch(mKeys, 0, mSize, key);
- }
-
- if (mSize >= mKeys.length) {
- int n = ArrayUtils.idealIntArraySize(mSize + 1);
-
- int[] nkeys = new int[n];
- WeakReference<?>[] nvalues = new WeakReference[n];
-
- // Log.e("SparseArray", "grow " + mKeys.length + " to " + n);
- System.arraycopy(mKeys, 0, nkeys, 0, mKeys.length);
- System.arraycopy(mValues, 0, nvalues, 0, mValues.length);
-
- mKeys = nkeys;
- mValues = nvalues;
- }
-
- if (mSize - i != 0) {
- // Log.e("SparseArray", "move " + (mSize - i));
- System.arraycopy(mKeys, i, mKeys, i + 1, mSize - i);
- System.arraycopy(mValues, i, mValues, i + 1, mSize - i);
- }
-
- mKeys[i] = key;
- mValues[i] = new WeakReference(value);
- mSize++;
- }
- }
-
- /**
- * Returns the number of key-value mappings that this SparseArray
- * currently stores.
- */
- public int size() {
- if (mGarbage) {
- gc();
- }
-
- return mSize;
- }
-
- /**
- * Given an index in the range <code>0...size()-1</code>, returns
- * the key from the <code>index</code>th key-value mapping that this
- * SparseArray stores.
- */
- public int keyAt(int index) {
- if (mGarbage) {
- gc();
- }
-
- return mKeys[index];
- }
-
- /**
- * Given an index in the range <code>0...size()-1</code>, returns
- * the value from the <code>index</code>th key-value mapping that this
- * SparseArray stores.
- */
- public E valueAt(int index) {
- if (mGarbage) {
- gc();
- }
-
- return (E) mValues[index].get();
- }
-
- /**
- * Given an index in the range <code>0...size()-1</code>, sets a new
- * value for the <code>index</code>th key-value mapping that this
- * SparseArray stores.
- */
- public void setValueAt(int index, E value) {
- if (mGarbage) {
- gc();
- }
-
- mValues[index] = new WeakReference(value);
- }
-
- /**
- * Returns the index for which {@link #keyAt} would return the
- * specified key, or a negative number if the specified
- * key is not mapped.
- */
- public int indexOfKey(int key) {
- if (mGarbage) {
- gc();
- }
-
- return binarySearch(mKeys, 0, mSize, key);
- }
-
- /**
- * Returns an index for which {@link #valueAt} would return the
- * specified key, or a negative number if no keys map to the
- * specified value.
- * Beware that this is a linear search, unlike lookups by key,
- * and that multiple keys can map to the same value and this will
- * find only one of them.
- */
- public int indexOfValue(E value) {
- if (mGarbage) {
- gc();
- }
-
- for (int i = 0; i < mSize; i++)
- if (mValues[i].get() == value)
- return i;
-
- return -1;
- }
-
- /**
- * Removes all key-value mappings from this SparseArray.
- */
- public void clear() {
- int n = mSize;
- WeakReference<?>[] values = mValues;
-
- for (int i = 0; i < n; i++) {
- values[i] = null;
- }
-
- mSize = 0;
- mGarbage = false;
- }
-
- /**
- * Puts a key/value pair into the array, optimizing for the case where
- * the key is greater than all existing keys in the array.
- */
- public void append(int key, E value) {
- if (mSize != 0 && key <= mKeys[mSize - 1]) {
- put(key, value);
- return;
- }
-
- if (mSize >= mKeys.length && (mGarbage || hasReclaimedRefs())) {
- gc();
- }
-
- int pos = mSize;
- if (pos >= mKeys.length) {
- int n = ArrayUtils.idealIntArraySize(pos + 1);
-
- int[] nkeys = new int[n];
- WeakReference<?>[] nvalues = new WeakReference[n];
-
- // Log.e("SparseArray", "grow " + mKeys.length + " to " + n);
- System.arraycopy(mKeys, 0, nkeys, 0, mKeys.length);
- System.arraycopy(mValues, 0, nvalues, 0, mValues.length);
-
- mKeys = nkeys;
- mValues = nvalues;
- }
-
- mKeys[pos] = key;
- mValues[pos] = new WeakReference(value);
- mSize = pos + 1;
- }
-
- private boolean hasReclaimedRefs() {
- for (int i = 0 ; i < mSize ; i++) {
- if (mValues[i].get() == null) { // DELETED.get() never returns null.
- return true;
- }
- }
-
- return false;
- }
-
- private static int binarySearch(int[] a, int start, int len, int key) {
- int high = start + len, low = start - 1, guess;
-
- while (high - low > 1) {
- guess = (high + low) / 2;
-
- if (a[guess] < key)
- low = guess;
- else
- high = guess;
- }
-
- if (high == start + len)
- return ~(start + len);
- else if (a[high] == key)
- return high;
- else
- return ~high;
- }
-
- private int[] mKeys;
- private WeakReference<?>[] mValues;
- private int mSize;
-}
diff --git a/tools/layoutlib/bridge/src/com/google/android/maps/MapView.java b/tools/layoutlib/bridge/src/com/google/android/maps/MapView.java
deleted file mode 100644
index 6d013bb..0000000
--- a/tools/layoutlib/bridge/src/com/google/android/maps/MapView.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.google.android.maps;
-
-import com.android.layoutlib.bridge.MockView;
-
-import android.content.Context;
-import android.os.Bundle;
-import android.util.AttributeSet;
-import android.view.View;
-
-/**
- * Mock version of the MapView.
- * Only non override public methods from the real MapView have been added in there.
- * Methods that take an unknown class as parameter or as return object, have been removed for now.
- *
- * TODO: generate automatically.
- *
- */
-public class MapView extends MockView {
-
- /**
- * Construct a new WebView with a Context object.
- * @param context A Context object used to access application assets.
- */
- public MapView(Context context) {
- this(context, null);
- }
-
- /**
- * Construct a new WebView with layout parameters.
- * @param context A Context object used to access application assets.
- * @param attrs An AttributeSet passed to our parent.
- */
- public MapView(Context context, AttributeSet attrs) {
- this(context, attrs, com.android.internal.R.attr.mapViewStyle);
- }
-
- /**
- * Construct a new WebView with layout parameters and a default style.
- * @param context A Context object used to access application assets.
- * @param attrs An AttributeSet passed to our parent.
- * @param defStyle The default style resource ID.
- */
- public MapView(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
- }
-
- // START FAKE PUBLIC METHODS
-
- public void displayZoomControls(boolean takeFocus) {
- }
-
- public boolean canCoverCenter() {
- return false;
- }
-
- public void preLoad() {
- }
-
- public int getZoomLevel() {
- return 0;
- }
-
- public void setSatellite(boolean on) {
- }
-
- public boolean isSatellite() {
- return false;
- }
-
- public void setTraffic(boolean on) {
- }
-
- public boolean isTraffic() {
- return false;
- }
-
- public void setStreetView(boolean on) {
- }
-
- public boolean isStreetView() {
- return false;
- }
-
- public int getLatitudeSpan() {
- return 0;
- }
-
- public int getLongitudeSpan() {
- return 0;
- }
-
- public int getMaxZoomLevel() {
- return 0;
- }
-
- public void onSaveInstanceState(Bundle state) {
- }
-
- public void onRestoreInstanceState(Bundle state) {
- }
-
- public View getZoomControls() {
- return null;
- }
-}
diff --git a/tools/layoutlib/bridge/src/libcore/icu/DateIntervalFormat_Delegate.java b/tools/layoutlib/bridge/src/libcore/icu/DateIntervalFormat_Delegate.java
deleted file mode 100644
index a773d93..0000000
--- a/tools/layoutlib/bridge/src/libcore/icu/DateIntervalFormat_Delegate.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright (C) 2013 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 libcore.icu;
-
-import java.text.FieldPosition;
-
-import com.android.ide.common.rendering.api.LayoutLog;
-import com.android.layoutlib.bridge.Bridge;
-import com.android.layoutlib.bridge.impl.DelegateManager;
-import com.ibm.icu.text.DateIntervalFormat;
-import com.ibm.icu.util.DateInterval;
-import com.ibm.icu.util.TimeZone;
-import com.ibm.icu.util.ULocale;
-
-public class DateIntervalFormat_Delegate {
-
- // ---- delegate manager ----
- private static final DelegateManager<DateIntervalFormat_Delegate> sManager =
- new DelegateManager<DateIntervalFormat_Delegate>(DateIntervalFormat_Delegate.class);
-
- // ---- delegate data ----
- private DateIntervalFormat mFormat;
-
-
- // ---- native methods ----
-
- /*package*/static String formatDateInterval(long address, long fromDate, long toDate) {
- DateIntervalFormat_Delegate delegate = sManager.getDelegate((int)address);
- if (delegate == null) {
- Bridge.getLog().error(LayoutLog.TAG_BROKEN,
- "Unable for find native DateIntervalFormat", null);
- return null;
- }
- DateInterval interval = new DateInterval(fromDate, toDate);
- StringBuffer sb = new StringBuffer();
- FieldPosition pos = new FieldPosition(0);
- delegate.mFormat.format(interval, sb, pos);
- return sb.toString();
- }
-
- /*package*/ static long createDateIntervalFormat(String skeleton, String localeName,
- String tzName) {
- TimeZone prevDefaultTz = TimeZone.getDefault();
- TimeZone.setDefault(TimeZone.getTimeZone(tzName));
- DateIntervalFormat_Delegate newDelegate = new DateIntervalFormat_Delegate();
- newDelegate.mFormat =
- DateIntervalFormat.getInstance(skeleton, new ULocale(localeName));
- TimeZone.setDefault(prevDefaultTz);
- return sManager.addNewDelegate(newDelegate);
- }
-
- /*package*/ static void destroyDateIntervalFormat(long address) {
- sManager.removeJavaReferenceFor((int)address);
- }
-
-}
diff --git a/tools/layoutlib/bridge/src/libcore/icu/ICU_Delegate.java b/tools/layoutlib/bridge/src/libcore/icu/ICU_Delegate.java
deleted file mode 100644
index 06ae804..0000000
--- a/tools/layoutlib/bridge/src/libcore/icu/ICU_Delegate.java
+++ /dev/null
@@ -1,234 +0,0 @@
-/*
- * Copyright (C) 2011 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 libcore.icu;
-
-import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
-import com.ibm.icu.text.DateTimePatternGenerator;
-import com.ibm.icu.util.ULocale;
-
-import java.util.Locale;
-
-/**
- * Delegate implementing the native methods of libcore.icu.ICU
- *
- * Through the layoutlib_create tool, the original native methods of ICU have been replaced
- * by calls to methods of the same name in this delegate class.
- *
- */
-public class ICU_Delegate {
-
- // --- Java delegates
-
- @LayoutlibDelegate
- /*package*/ static String toLowerCase(String s, String localeName) {
- return s.toLowerCase();
- }
-
- @LayoutlibDelegate
- /*package*/ static String toUpperCase(String s, String localeName) {
- return s.toUpperCase();
- }
-
- // --- Native methods accessing ICU's database.
-
- @LayoutlibDelegate
- /*package*/ static String getBestDateTimePattern(String skeleton, String localeName) {
- return DateTimePatternGenerator.getInstance(new ULocale(localeName))
- .getBestPattern(skeleton);
- }
-
- @LayoutlibDelegate
- /*package*/ static String getCldrVersion() {
- return "22.1.1"; // TODO: check what the right value should be.
- }
-
- @LayoutlibDelegate
- /*package*/ static String getIcuVersion() {
- return "unknown_layoutlib";
- }
-
- @LayoutlibDelegate
- /*package*/ static String getUnicodeVersion() {
- return "5.2";
- }
-
- @LayoutlibDelegate
- /*package*/ static String[] getAvailableBreakIteratorLocalesNative() {
- return new String[0];
- }
-
- @LayoutlibDelegate
- /*package*/ static String[] getAvailableCalendarLocalesNative() {
- return new String[0];
- }
-
- @LayoutlibDelegate
- /*package*/ static String[] getAvailableCollatorLocalesNative() {
- return new String[0];
- }
-
- @LayoutlibDelegate
- /*package*/ static String[] getAvailableDateFormatLocalesNative() {
- return new String[0];
- }
-
- @LayoutlibDelegate
- /*package*/ static String[] getAvailableLocalesNative() {
- return new String[0];
- }
-
- @LayoutlibDelegate
- /*package*/ static String[] getAvailableNumberFormatLocalesNative() {
- return new String[0];
- }
-
- @LayoutlibDelegate
- /*package*/ static String[] getAvailableCurrencyCodes() {
- return new String[0];
- }
-
- @LayoutlibDelegate
- /*package*/ static String getCurrencyCode(String locale) {
- return "";
- }
-
- @LayoutlibDelegate
- /*package*/ static String getCurrencyDisplayName(String locale, String currencyCode) {
- return "";
- }
-
- @LayoutlibDelegate
- /*package*/ static int getCurrencyFractionDigits(String currencyCode) {
- return 0;
- }
-
- @LayoutlibDelegate
- /*package*/ static String getCurrencySymbol(String locale, String currencyCode) {
- return "";
- }
-
- @LayoutlibDelegate
- /*package*/ static String getDisplayCountryNative(String countryCode, String locale) {
- return "";
- }
-
- @LayoutlibDelegate
- /*package*/ static String getDisplayLanguageNative(String languageCode, String locale) {
- return "";
- }
-
- @LayoutlibDelegate
- /*package*/ static String getDisplayVariantNative(String variantCode, String locale) {
- return "";
- }
-
- @LayoutlibDelegate
- /*package*/ static String getISO3CountryNative(String locale) {
- return "";
- }
-
- @LayoutlibDelegate
- /*package*/ static String getISO3LanguageNative(String locale) {
- return "";
- }
-
- @LayoutlibDelegate
- /*package*/ static String addLikelySubtags(String locale) {
- return "";
- }
-
- @LayoutlibDelegate
- /*package*/ static String getScript(String locale) {
- return "";
- }
-
- @LayoutlibDelegate
- /*package*/ static String[] getISOLanguagesNative() {
- return Locale.getISOLanguages();
- }
-
- @LayoutlibDelegate
- /*package*/ static String[] getISOCountriesNative() {
- return Locale.getISOCountries();
- }
-
- @LayoutlibDelegate
- /*package*/ static boolean initLocaleDataImpl(String locale, LocaleData result) {
-
- // Used by Calendar.
- result.firstDayOfWeek = Integer.valueOf(1);
- result.minimalDaysInFirstWeek = Integer.valueOf(1);
-
- // Used by DateFormatSymbols.
- result.amPm = new String[] { "AM", "PM" };
- result.eras = new String[] { "BC", "AD" };
-
- result.longMonthNames = new String[] { "January", "February", "March", "April", "May",
- "June", "July", "August", "September", "October", "November", "December" };
- result.shortMonthNames = new String[] { "Jan", "Feb", "Mar", "Apr", "May",
- "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
- result.longStandAloneMonthNames = result.longMonthNames;
- result.shortStandAloneMonthNames = result.shortMonthNames;
-
- // The platform code expects this to begin at index 1, rather than 0. It maps it directly to
- // the constants from java.util.Calendar.<weekday>
- result.longWeekdayNames = new String[] {
- "", "Sunday", "Monday" ,"Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" };
- result.shortWeekdayNames = new String[] {
- "", "Sun", "Mon" ,"Tue", "Wed", "Thu", "Fri", "Sat" };
- result.tinyWeekdayNames = new String[] {
- "", "S", "M", "T", "W", "T", "F", "S" };
-
- result.longStandAloneWeekdayNames = result.longWeekdayNames;
- result.shortStandAloneWeekdayNames = result.shortWeekdayNames;
- result.tinyStandAloneWeekdayNames = result.tinyWeekdayNames;
-
- result.fullTimeFormat = "";
- result.longTimeFormat = "";
- result.mediumTimeFormat = "";
- result.shortTimeFormat = "";
-
- result.fullDateFormat = "";
- result.longDateFormat = "";
- result.mediumDateFormat = "";
- result.shortDateFormat = "";
-
- // Used by DecimalFormatSymbols.
- result.zeroDigit = '0';
- result.decimalSeparator = '.';
- result.groupingSeparator = ',';
- result.patternSeparator = ' ';
- result.percent = '%';
- result.perMill = '\u2030';
- result.monetarySeparator = ' ';
- result.minusSign = '-';
- result.exponentSeparator = "e";
- result.infinity = "\u221E";
- result.NaN = "NaN";
- // Also used by Currency.
- result.currencySymbol = "$";
- result.internationalCurrencySymbol = "USD";
-
- // Used by DecimalFormat and NumberFormat.
- result.numberPattern = "%f";
- result.integerPattern = "%d";
- result.currencyPattern = "%s";
- result.percentPattern = "%f";
-
- return true;
- }
-}
diff --git a/tools/layoutlib/bridge/tests/.classpath b/tools/layoutlib/bridge/tests/.classpath
deleted file mode 100644
index 2b32e09..0000000
--- a/tools/layoutlib/bridge/tests/.classpath
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
- <classpathentry kind="src" path="src"/>
- <classpathentry kind="src" path="res"/>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
- <classpathentry combineaccessrules="false" kind="src" path="/layoutlib_bridge"/>
- <classpathentry kind="var" path="ANDROID_PLAT_SRC/prebuilts/misc/common/kxml2/kxml2-2.3.0.jar" sourcepath="/ANDROID_PLAT_SRC/dalvik/libcore/xml/src/main/java"/>
- <classpathentry kind="var" path="ANDROID_PLAT_SRC/out/host/common/obj/JAVA_LIBRARIES/temp_layoutlib_intermediates/javalib.jar" sourcepath="/ANDROID_PLAT_SRC/frameworks/base"/>
- <classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/3"/>
- <classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/tools/layoutlib/bridge/tests/.project b/tools/layoutlib/bridge/tests/.project
deleted file mode 100644
index 2325eed..0000000
--- a/tools/layoutlib/bridge/tests/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
- <name>layoutlib_bridge-tests</name>
- <comment></comment>
- <projects>
- </projects>
- <buildSpec>
- <buildCommand>
- <name>org.eclipse.jdt.core.javabuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
- </buildSpec>
- <natures>
- <nature>org.eclipse.jdt.core.javanature</nature>
- </natures>
-</projectDescription>
diff --git a/tools/layoutlib/bridge/tests/Android.mk b/tools/layoutlib/bridge/tests/Android.mk
deleted file mode 100644
index 98cade9..0000000
--- a/tools/layoutlib/bridge/tests/Android.mk
+++ /dev/null
@@ -1,32 +0,0 @@
-# Copyright (C) 2011 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.
-
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-
-# Only compile source java files in this lib.
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
-
-LOCAL_JAVA_RESOURCE_DIRS := res
-
-LOCAL_MODULE := layoutlib-tests
-LOCAL_MODULE_TAGS := optional
-
-LOCAL_JAVA_LIBRARIES := layoutlib kxml2-2.3.0 junit
-
-include $(BUILD_HOST_JAVA_LIBRARY)
-
-# Build all sub-directories
-include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/tools/layoutlib/bridge/tests/res/com/android/layoutlib/testdata/layout1.xml b/tools/layoutlib/bridge/tests/res/com/android/layoutlib/testdata/layout1.xml
deleted file mode 100644
index b8fc947..0000000
--- a/tools/layoutlib/bridge/tests/res/com/android/layoutlib/testdata/layout1.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<!--
- Copyright (C) 2008 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical"
->
- <Button
- android:id="@+id/bouton"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:text="My Button Text"
- >
- </Button>
- <View
- android:id="@+id/surface"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout_weight="2"
- />
- <TextView
- android:id="@+id/status"
- android:paddingLeft="2dip"
- android:layout_weight="0"
- android:background="@drawable/black"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:lines="1"
- android:gravity="center_vertical|center_horizontal"
- android:text="My TextView Text"
- />
-</LinearLayout>
diff --git a/tools/layoutlib/bridge/tests/src/android/graphics/Matrix_DelegateTest.java b/tools/layoutlib/bridge/tests/src/android/graphics/Matrix_DelegateTest.java
deleted file mode 100644
index ec4edac..0000000
--- a/tools/layoutlib/bridge/tests/src/android/graphics/Matrix_DelegateTest.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * 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.graphics;
-
-import junit.framework.TestCase;
-
-/**
- *
- */
-public class Matrix_DelegateTest extends TestCase {
-
- @Override
- protected void setUp() throws Exception {
- super.setUp();
- }
-
- @Override
- protected void tearDown() throws Exception {
- super.tearDown();
- }
-
- public void testIdentity() {
- Matrix m1 = new Matrix();
-
- assertTrue(m1.isIdentity());
-
- m1.setValues(new float[] { 1,0,0, 0,1,0, 0,0,1 });
- assertTrue(m1.isIdentity());
- }
-
- public void testCopyConstructor() {
- Matrix m1 = new Matrix();
- Matrix m2 = new Matrix(m1);
-
- float[] v1 = new float[9];
- float[] v2 = new float[9];
- m1.getValues(v1);
- m2.getValues(v2);
-
- for (int i = 0 ; i < 9; i++) {
- assertEquals(v1[i], v2[i]);
- }
- }
-}
diff --git a/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/TestDelegates.java b/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/TestDelegates.java
deleted file mode 100644
index d3218db..0000000
--- a/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/TestDelegates.java
+++ /dev/null
@@ -1,197 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.layoutlib.bridge;
-
-import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
-import com.android.tools.layoutlib.create.CreateInfo;
-
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
-import java.util.ArrayList;
-import java.util.List;
-
-import junit.framework.TestCase;
-
-/**
- * Tests that native delegate classes implement all the required methods.
- *
- * This looks at {@link CreateInfo#DELEGATE_CLASS_NATIVES} to get the list of classes that
- * have their native methods reimplemented through a delegate.
- *
- * Since the reimplemented methods are not native anymore, we look for the annotation
- * {@link LayoutlibDelegate}, and look for a matching method in the delegate (named the same
- * as the modified class with _Delegate added as a suffix).
- * If the original native method is not static, then we make sure the delegate method also
- * include the original class as first parameter (to access "this").
- *
- */
-public class TestDelegates extends TestCase {
-
- public void testNativeDelegates() {
-
- final String[] classes = CreateInfo.DELEGATE_CLASS_NATIVES;
- final int count = classes.length;
- for (int i = 0 ; i < count ; i++) {
- loadAndCompareClasses(classes[i], classes[i] + "_Delegate");
- }
- }
-
- public void testMethodDelegates() {
- final String[] methods = CreateInfo.DELEGATE_METHODS;
- final int count = methods.length;
- for (int i = 0 ; i < count ; i++) {
- String methodName = methods[i];
-
- // extract the class name
- String className = methodName.substring(0, methodName.indexOf('#'));
- String targetClassName = className.replace('$', '_') + "_Delegate";
-
- loadAndCompareClasses(className, targetClassName);
- }
- }
-
- private void loadAndCompareClasses(String originalClassName, String delegateClassName) {
- // load the classes
- try {
- ClassLoader classLoader = TestDelegates.class.getClassLoader();
- Class<?> originalClass = classLoader.loadClass(originalClassName);
- Class<?> delegateClass = classLoader.loadClass(delegateClassName);
-
- compare(originalClass, delegateClass);
- } catch (ClassNotFoundException e) {
- fail("Failed to load class: " + e.getMessage());
- } catch (SecurityException e) {
- fail("Failed to load class: " + e.getMessage());
- }
- }
-
- private void compare(Class<?> originalClass, Class<?> delegateClass) throws SecurityException {
- List<Method> checkedDelegateMethods = new ArrayList<Method>();
-
- // loop on the methods of the original class, and for the ones that are annotated
- // with @LayoutlibDelegate, look for a matching method in the delegate class.
- // The annotation is automatically added by layoutlib_create when it replace a method
- // by a call to a delegate
- Method[] originalMethods = originalClass.getDeclaredMethods();
- for (Method originalMethod : originalMethods) {
- // look for methods that are delegated: they have the LayoutlibDelegate annotation
- if (originalMethod.getAnnotation(LayoutlibDelegate.class) == null) {
- continue;
- }
-
- // get the signature.
- Class<?>[] parameters = originalMethod.getParameterTypes();
-
- // if the method is not static, then the class is added as the first parameter
- // (for "this")
- if ((originalMethod.getModifiers() & Modifier.STATIC) == 0) {
-
- Class<?>[] newParameters = new Class<?>[parameters.length + 1];
- newParameters[0] = originalClass;
- System.arraycopy(parameters, 0, newParameters, 1, parameters.length);
- parameters = newParameters;
- }
-
- // if the original class is an inner class that's not static, then
- // we add this on the enclosing class at the beginning
- if (originalClass.getEnclosingClass() != null &&
- (originalClass.getModifiers() & Modifier.STATIC) == 0) {
- Class<?>[] newParameters = new Class<?>[parameters.length + 1];
- newParameters[0] = originalClass.getEnclosingClass();
- System.arraycopy(parameters, 0, newParameters, 1, parameters.length);
- parameters = newParameters;
- }
-
- try {
- // try to load the method with the given parameter types.
- Method delegateMethod = delegateClass.getDeclaredMethod(originalMethod.getName(),
- parameters);
-
- // check that the method has the annotation
- assertNotNull(
- String.format(
- "Delegate method %1$s for class %2$s does not have the @LayoutlibDelegate annotation",
- delegateMethod.getName(),
- originalClass.getName()),
- delegateMethod.getAnnotation(LayoutlibDelegate.class));
-
- // check that the method is static
- assertTrue(
- String.format(
- "Delegate method %1$s for class %2$s is not static",
- delegateMethod.getName(),
- originalClass.getName()),
- (delegateMethod.getModifiers() & Modifier.STATIC) == Modifier.STATIC);
-
- // add the method as checked.
- checkedDelegateMethods.add(delegateMethod);
- } catch (NoSuchMethodException e) {
- String name = getMethodName(originalMethod, parameters);
- fail(String.format("Missing %1$s.%2$s", delegateClass.getName(), name));
- }
- }
-
- // look for dead (delegate) code.
- // This looks for all methods in the delegate class, and if they have the
- // @LayoutlibDelegate annotation, make sure they have been previously found as a
- // match for a method in the original class.
- // If not, this means the method is a delegate for a method that either doesn't exist
- // anymore or is not delegated anymore.
- Method[] delegateMethods = delegateClass.getDeclaredMethods();
- for (Method delegateMethod : delegateMethods) {
- // look for methods that are delegates: they have the LayoutlibDelegate annotation
- if (delegateMethod.getAnnotation(LayoutlibDelegate.class) == null) {
- continue;
- }
-
- assertTrue(
- String.format(
- "Delegate method %1$s.%2$s is not used anymore and must be removed",
- delegateClass.getName(),
- getMethodName(delegateMethod)),
- checkedDelegateMethods.contains(delegateMethod));
- }
-
- }
-
- private String getMethodName(Method method) {
- return getMethodName(method, method.getParameterTypes());
- }
-
- private String getMethodName(Method method, Class<?>[] parameters) {
- // compute a full class name that's long but not too long.
- StringBuilder sb = new StringBuilder(method.getName() + "(");
- for (int j = 0; j < parameters.length; j++) {
- Class<?> theClass = parameters[j];
- sb.append(theClass.getName());
- int dimensions = 0;
- while (theClass.isArray()) {
- dimensions++;
- theClass = theClass.getComponentType();
- }
- for (int i = 0; i < dimensions; i++) {
- sb.append("[]");
- }
- if (j < (parameters.length - 1)) {
- sb.append(",");
- }
- }
- sb.append(")");
-
- return sb.toString();
- }
-}
diff --git a/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/android/BridgeXmlBlockParserTest.java b/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/android/BridgeXmlBlockParserTest.java
deleted file mode 100644
index 865a008..0000000
--- a/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/android/BridgeXmlBlockParserTest.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.layoutlib.bridge.android;
-
-import com.android.layoutlib.bridge.impl.ParserFactory;
-
-import org.w3c.dom.Node;
-import org.xmlpull.v1.XmlPullParser;
-
-import junit.framework.TestCase;
-
-public class BridgeXmlBlockParserTest extends TestCase {
-
- @Override
- protected void setUp() throws Exception {
- super.setUp();
- }
-
- @Override
- protected void tearDown() throws Exception {
- super.tearDown();
- }
-
- public void testXmlBlockParser() throws Exception {
-
- XmlPullParser parser = ParserFactory.create(
- getClass().getResourceAsStream("/com/android/layoutlib/testdata/layout1.xml"),
- "layout1.xml");
-
- parser = new BridgeXmlBlockParser(parser, null, false /* platformResourceFlag */);
-
- assertEquals(XmlPullParser.START_DOCUMENT, parser.next());
-
- assertEquals(XmlPullParser.START_TAG, parser.next());
- assertEquals("LinearLayout", parser.getName());
-
- assertEquals(XmlPullParser.TEXT, parser.next());
-
- assertEquals(XmlPullParser.START_TAG, parser.next());
- assertEquals("Button", parser.getName());
- assertEquals(XmlPullParser.TEXT, parser.next());
- assertEquals(XmlPullParser.END_TAG, parser.next());
-
- assertEquals(XmlPullParser.TEXT, parser.next());
-
- assertEquals(XmlPullParser.START_TAG, parser.next());
- assertEquals("View", parser.getName());
- assertEquals(XmlPullParser.END_TAG, parser.next());
-
- assertEquals(XmlPullParser.TEXT, parser.next());
-
- assertEquals(XmlPullParser.START_TAG, parser.next());
- assertEquals("TextView", parser.getName());
- assertEquals(XmlPullParser.END_TAG, parser.next());
-
- assertEquals(XmlPullParser.TEXT, parser.next());
-
- assertEquals(XmlPullParser.END_TAG, parser.next());
- assertEquals(XmlPullParser.END_DOCUMENT, parser.next());
- }
-
- //------------
-
- /**
- * Quick'n'dirty debug helper that dumps an XML structure to stdout.
- */
- @SuppressWarnings("unused")
- private void dump(Node node, String prefix) {
- Node n;
-
- String[] types = {
- "unknown",
- "ELEMENT_NODE",
- "ATTRIBUTE_NODE",
- "TEXT_NODE",
- "CDATA_SECTION_NODE",
- "ENTITY_REFERENCE_NODE",
- "ENTITY_NODE",
- "PROCESSING_INSTRUCTION_NODE",
- "COMMENT_NODE",
- "DOCUMENT_NODE",
- "DOCUMENT_TYPE_NODE",
- "DOCUMENT_FRAGMENT_NODE",
- "NOTATION_NODE"
- };
-
- String s = String.format("%s<%s> %s %s",
- prefix,
- types[node.getNodeType()],
- node.getNodeName(),
- node.getNodeValue() == null ? "" : node.getNodeValue().trim());
-
- System.out.println(s);
-
- n = node.getFirstChild();
- if (n != null) {
- dump(n, prefix + "- ");
- }
-
- n = node.getNextSibling();
- if (n != null) {
- dump(n, prefix);
- }
-
- }
-
-}
diff --git a/tools/layoutlib/create/.classpath b/tools/layoutlib/create/.classpath
deleted file mode 100644
index cd8bb0d..0000000
--- a/tools/layoutlib/create/.classpath
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
- <classpathentry kind="src" path="src"/>
- <classpathentry excluding="mock_data/" kind="src" path="tests"/>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
- <classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
- <classpathentry kind="var" path="ANDROID_SRC/prebuilts/tools/common/asm-tools/asm-4.0.jar" sourcepath="/ANDROID_PLAT/prebuilts/tools/common/asm-tools/src-4.0.zip"/>
- <classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/tools/layoutlib/create/.project b/tools/layoutlib/create/.project
deleted file mode 100644
index e100d17..0000000
--- a/tools/layoutlib/create/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
- <name>layoutlib_create</name>
- <comment></comment>
- <projects>
- </projects>
- <buildSpec>
- <buildCommand>
- <name>org.eclipse.jdt.core.javabuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
- </buildSpec>
- <natures>
- <nature>org.eclipse.jdt.core.javanature</nature>
- </natures>
-</projectDescription>
diff --git a/tools/layoutlib/create/.settings/README.txt b/tools/layoutlib/create/.settings/README.txt
deleted file mode 100644
index 9120b20..0000000
--- a/tools/layoutlib/create/.settings/README.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-Copy this in eclipse project as a .settings folder at the root.
-This ensure proper compilation compliance and warning/error levels. \ No newline at end of file
diff --git a/tools/layoutlib/create/.settings/org.eclipse.jdt.core.prefs b/tools/layoutlib/create/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 5381a0e..0000000
--- a/tools/layoutlib/create/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,93 +0,0 @@
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.annotation.nonnull=com.android.annotations.NonNull
-org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=com.android.annotations.NonNullByDefault
-org.eclipse.jdt.core.compiler.annotation.nonnullisdefault=disabled
-org.eclipse.jdt.core.compiler.annotation.nullable=com.android.annotations.Nullable
-org.eclipse.jdt.core.compiler.annotation.nullanalysis=enabled
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.6
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
-org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
-org.eclipse.jdt.core.compiler.problem.deadCode=warning
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=enabled
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=warning
-org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=warning
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=error
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
-org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
-org.eclipse.jdt.core.compiler.problem.nullReference=error
-org.eclipse.jdt.core.compiler.problem.nullSpecInsufficientInfo=warning
-org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
-org.eclipse.jdt.core.compiler.problem.potentialNullSpecViolation=error
-org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=warning
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning
-org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
-org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
-org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.unclosedCloseable=error
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=warning
-org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
-org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
-org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.6
diff --git a/tools/layoutlib/create/Android.mk b/tools/layoutlib/create/Android.mk
deleted file mode 100644
index 9bd48ab..0000000
--- a/tools/layoutlib/create/Android.mk
+++ /dev/null
@@ -1,28 +0,0 @@
-#
-# 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.
-#
-LOCAL_PATH := $(call my-dir)
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := $(call all-java-files-under,src)
-
-LOCAL_JAR_MANIFEST := manifest.txt
-LOCAL_STATIC_JAVA_LIBRARIES := \
- asm-4.0
-
-LOCAL_MODULE := layoutlib_create
-
-include $(BUILD_HOST_JAVA_LIBRARY)
-
diff --git a/tools/layoutlib/create/README.txt b/tools/layoutlib/create/README.txt
deleted file mode 100644
index ef2b185..0000000
--- a/tools/layoutlib/create/README.txt
+++ /dev/null
@@ -1,271 +0,0 @@
-# Copyright (C) 2008 The Android Open Source Project
-
-
-- Description -
----------------
-
-Layoutlib_create generates a JAR library used by the Eclipse graphical layout editor
-to perform layout.
-
-
-- Usage -
----------
-
- ./layoutlib_create path/to/android.jar destination.jar
-
-
-- Design Overview -
--------------------
-
-Layoutlib_create uses the "android.jar" containing all the Java code used by Android
-as generated by the Android build, right before the classes are converted to a DEX format.
-
-The Android JAR can't be used directly in Eclipse:
-- it contains references to native code (which we want to avoid in Eclipse),
-- some classes need to be overridden, for example all the drawing code that is
- replaced by Java 2D calls in Eclipse.
-- some of the classes that need to be changed are final and/or we need access
- to their private internal state.
-
-Consequently this tool:
-- parses the input JAR,
-- modifies some of the classes directly using some bytecode manipulation,
-- filters some packages and removes those we don't want in the output JAR,
-- injects some new classes,
-- generates a modified JAR file that is suitable for the Android plugin
- for Eclipse to perform rendering.
-
-The ASM library is used to do the bytecode modification using its visitor pattern API.
-
-The layoutlib_create is *NOT* generic. There is no configuration file. Instead all the
-configuration is done in the main() method and the CreateInfo structure is expected to
-change with the Android platform as new classes are added, changed or removed.
-
-The resulting JAR is used by layoutlib_bridge (a.k.a. "the bridge"), also part of the
-platform, that provides all the necessary missing implementation for rendering graphics
-in Eclipse.
-
-
-
-- Implementation Notes -
-------------------------
-
-The tool works in two phases:
-- first analyze the input jar (AsmAnalyzer class)
-- then generate the output jar (AsmGenerator class),
-
-
-- Analyzer
-----------
-
-The goal of the analyzer is to create a graph of all the classes from the input JAR
-with their dependencies and then only keep the ones we want.
-
-To do that, the analyzer is created with a list of base classes to keep -- everything
-that derives from these is kept. Currently the one such class is android.view.View:
-since we want to render layouts, anything that is sort of a view needs to be kept.
-
-The analyzer is also given a list of class names to keep in the output.
-This is done using shell-like glob patterns that filter on the fully-qualified
-class names, for example "android.*.R**" ("*" does not matches dots whilst "**" does,
-and "." and "$" are interpreted as-is).
-In practice we almost but not quite request the inclusion of full packages.
-
-The analyzer is also given a list of classes to exclude. A fake implementation of these
-classes is injected by the Generator.
-
-With this information, the analyzer parses the input zip to find all the classes.
-All classes deriving from the requested bases classes are kept.
-All classes which name matched the glob pattern are kept.
-The analysis then finds all the dependencies of the classes that are to be kept
-using an ASM visitor on the class, the field types, the method types and annotations types.
-Classes that belong to the current JRE are excluded.
-
-The output of the analyzer is a set of ASM ClassReader instances which are then
-fed to the generator.
-
-
-- Generator
------------
-
-The generator is constructed from a CreateInfo struct that acts as a config file
-and lists:
-- the classes to inject in the output JAR -- these classes are directly implemented
- in layoutlib_create and will be used to interface with the renderer in Eclipse.
-- specific methods to override (see method stubs details below).
-- specific methods for which to delegate calls.
-- specific methods to remove based on their return type.
-- specific classes to rename.
-- specific classes to refactor.
-
-Each of these are specific strategies we use to be able to modify the Android code
-to fit within the Eclipse renderer. These strategies are explained beow.
-
-The core method of the generator is transform(): it takes an input ASM ClassReader
-and modifies it to produce a byte array suitable for the final JAR file.
-
-The first step of the transformation is to implement the method delegates.
-
-The TransformClassAdapter is then used to process the potentially renamed class.
-All protected or private classes are market as public.
-All classes are made non-final.
-Interfaces are left as-is.
-
-If a method has a return type that must be erased, the whole method is skipped.
-Methods are also changed from protected/private to public.
-The code of the methods is then kept as-is, except for native methods which are
-replaced by a stub. Methods that are to be overridden are also replaced by a stub.
-
-Finally fields are also visited and changed from protected/private to public.
-
-The next step of the transformation is changing the name of the class in case
-we requested the class to be renamed. This uses the RenameClassAdapter to also rename
-all inner classes and references in methods and types. Note that other classes are
-not transformed and keep referencing the original name.
-
-The class is then fed to RefactorClassAdapter which is like RenameClassAdapter but
-updates the references in all classes. This is used to update the references of classes
-in the java package that were added in the Dalvik VM but are not a part of the standard
-JVM. The existing classes are modified to update all references to these non-standard
-classes. An alternate implementation of these (com.android.tools.layoutlib.java.*) is
-injected.
-
-The ClassAdapters are chained together to achieve the desired output. (Look at section
-2.2.7 Transformation chains in the asm user guide, link in the References.) The order of
-execution of these is:
-ClassReader -> [DelegateClassAdapter] -> TransformClassAdapter -> [RenameClassAdapter] ->
-RefactorClassAdapter -> ClassWriter
-
-- Method stubs
---------------
-
-As indicated above, all native and overridden methods are replaced by a stub.
-We don't have the code to replace with in layoutlib_create.
-Instead the StubMethodAdapter replaces the code of the method by a call to
-OverrideMethod.invokeX(). When using the final JAR, the bridge can register
-listeners from these overridden method calls based on the method signatures.
-
-The listeners are currently pretty basic: we only pass the signature of the
-method being called, its caller object and a flag indicating whether the
-method was native. We do not currently provide the parameters. The listener
-can however specify the return value of the overridden method.
-
-This strategy is now obsolete and replaced by the method delegates.
-
-
-- Strategies
-------------
-
-We currently have 6 strategies to deal with overriding the rendering code
-and make it run in Eclipse. Most of these strategies are implemented hand-in-hand
-by the bridge (which runs in Eclipse) and the generator.
-
-
-1- Class Injection
-
-This is the easiest: we currently inject the following classes:
-- OverrideMethod and its associated MethodListener and MethodAdapter are used
- to intercept calls to some specific methods that are stubbed out and change
- their return value.
-- CreateInfo class, which configured the generator. Not used yet, but could
- in theory help us track what the generator changed.
-- AutoCloseable and Objects are part of Java 7. To enable us to still run on Java 6, new
- classes are injected. The implementation for these classes has been taken from
- Android's libcore (platform/libcore/luni/src/main/java/java/...).
-- Charsets, IntegralToString and UnsafeByteSequence are not part of the standard JAVA VM.
- They are added to the Dalvik VM for performance reasons. An implementation that is very
- close to the original (which is at platform/libcore/luni/src/main/java/...) is injected.
- Since these classees were in part of the java package, where we can't inject classes,
- all references to these have been updated (See strategy 4- Refactoring Classes).
-
-
-2- Overriding methods
-
-As explained earlier, the creator doesn't have any replacement code for
-methods to override. Instead it removes the original code and replaces it
-by a call to a specific OveriddeMethod.invokeX(). The bridge then registers
-a listener on the method signature and can provide an implementation.
-
-This strategy is now obsolete and replaced by the method delegates.
-See strategy 5 below.
-
-
-3- Renaming classes
-
-This simply changes the name of a class in its definition, as well as all its
-references in internal inner classes and methods.
-Calls from other classes are not modified -- they keep referencing the original
-class name. This allows the bridge to literally replace an implementation.
-
-An example will make this easier: android.graphics.Paint is the main drawing
-class that we need to replace. To do so, the generator renames Paint to _original_Paint.
-Later the bridge provides its own replacement version of Paint which will be used
-by the rest of the Android stack. The replacement version of Paint can still use
-(either by inheritance or delegation) all the original non-native code of _original_Paint
-if it so desires.
-
-Some of the Android classes are basically wrappers over native objects and since
-we don't have the native code in Eclipse, we need to provide a full alternate
-implementation. Sub-classing doesn't work as some native methods are static and
-we don't control object creation.
-
-This won't rename/replace the inner static methods of a given class.
-
-
-4- Refactoring classes
-
-This is very similar to the Renaming classes except that it also updates the reference in
-all classes. This is done for classes which are added to the Dalvik VM for performance
-reasons but are not present in the Standard Java VM. An implementation for these classes
-is also injected.
-
-
-5- Method erasure based on return type
-
-This is mostly an implementation detail of the bridge: in the Paint class
-mentioned above, some inner static classes are used to pass around
-attributes (e.g. FontMetrics, or the Style enum) and all the original implementation
-is native.
-
-In this case we have a strategy that tells the generator that anything returning, for
-example, the inner class Paint$Style in the Paint class should be discarded and the
-bridge will provide its own implementation.
-
-
-6- Method Delegates
-
-This strategy is used to override method implementations.
-Given a method SomeClass.MethodName(), 1 or 2 methods are generated:
-a- A copy of the original method named SomeClass.MethodName_Original().
- The content is the original method as-is from the reader.
- This step is omitted if the method is native, since it has no Java implementation.
-b- A brand new implementation of SomeClass.MethodName() which calls to a
- non-existing static method named SomeClass_Delegate.MethodName().
- The implementation of this 'delegate' method is done in layoutlib_brigde.
-
-The delegate method is a static method.
-If the original method is non-static, the delegate method receives the original 'this'
-as its first argument. If the original method is an inner non-static method, it also
-receives the inner 'this' as the second argument.
-
-
-
-- References -
---------------
-
-
-The JVM Specification 2nd edition:
- http://java.sun.com/docs/books/jvms/second_edition/html/VMSpecTOC.doc.html
-
-Understanding bytecode:
- http://www.ibm.com/developerworks/ibm/library/it-haggar_bytecode/
-
-Bytecode opcode list:
- http://en.wikipedia.org/wiki/Java_bytecode_instruction_listings
-
-ASM user guide:
- http://download.forge.objectweb.org/asm/asm4-guide.pdf
-
-
---
-end
diff --git a/tools/layoutlib/create/manifest.txt b/tools/layoutlib/create/manifest.txt
deleted file mode 100644
index 238e7f9..0000000
--- a/tools/layoutlib/create/manifest.txt
+++ /dev/null
@@ -1 +0,0 @@
-Main-Class: com.android.tools.layoutlib.create.Main
diff --git a/tools/layoutlib/create/src/com/android/tools/layoutlib/annotations/LayoutlibDelegate.java b/tools/layoutlib/create/src/com/android/tools/layoutlib/annotations/LayoutlibDelegate.java
deleted file mode 100644
index 9a48ea6..0000000
--- a/tools/layoutlib/create/src/com/android/tools/layoutlib/annotations/LayoutlibDelegate.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.tools.layoutlib.annotations;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-/**
- * Denotes a method that has been converted to a delegate by layoutlib_create.
- */
-@Retention(RetentionPolicy.RUNTIME)
-public @interface LayoutlibDelegate {
-}
diff --git a/tools/layoutlib/create/src/com/android/tools/layoutlib/annotations/Nullable.java b/tools/layoutlib/create/src/com/android/tools/layoutlib/annotations/Nullable.java
deleted file mode 100644
index 0689c92..0000000
--- a/tools/layoutlib/create/src/com/android/tools/layoutlib/annotations/Nullable.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.tools.layoutlib.annotations;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-/**
- * Denotes a parameter or field can be null.
- * <p/>
- * When decorating a method call parameter, this denotes the parameter can
- * legitimately be null and the method will gracefully deal with it. Typically used
- * on optional parameters.
- * <p/>
- * When decorating a method, this denotes the method might legitimately return null.
- * <p/>
- * This is a marker annotation and it has no specific attributes.
- */
-@Retention(RetentionPolicy.SOURCE)
-public @interface Nullable {
-}
diff --git a/tools/layoutlib/create/src/com/android/tools/layoutlib/annotations/VisibleForTesting.java b/tools/layoutlib/create/src/com/android/tools/layoutlib/annotations/VisibleForTesting.java
deleted file mode 100644
index e4e016b..0000000
--- a/tools/layoutlib/create/src/com/android/tools/layoutlib/annotations/VisibleForTesting.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.tools.layoutlib.annotations;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-/**
- * Denotes that the class, method or field has its visibility relaxed so
- * that unit tests can access it.
- * <p/>
- * The <code>visibility</code> argument can be used to specific what the original
- * visibility should have been if it had not been made public or package-private for testing.
- * The default is to consider the element private.
- */
-@Retention(RetentionPolicy.SOURCE)
-public @interface VisibleForTesting {
- /**
- * Intended visibility if the element had not been made public or package-private for
- * testing.
- */
- enum Visibility {
- /** The element should be considered protected. */
- PROTECTED,
- /** The element should be considered package-private. */
- PACKAGE,
- /** The element should be considered private. */
- PRIVATE
- }
-
- /**
- * Intended visibility if the element had not been made public or package-private for testing.
- * If not specified, one should assume the element originally intended to be private.
- */
- Visibility visibility() default Visibility.PRIVATE;
-}
diff --git a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/AbstractClassAdapter.java b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/AbstractClassAdapter.java
deleted file mode 100644
index b2caa25..0000000
--- a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/AbstractClassAdapter.java
+++ /dev/null
@@ -1,418 +0,0 @@
-/*
- * Copyright (C) 2013 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.tools.layoutlib.create;
-
-import org.objectweb.asm.AnnotationVisitor;
-import org.objectweb.asm.ClassVisitor;
-import org.objectweb.asm.FieldVisitor;
-import org.objectweb.asm.Label;
-import org.objectweb.asm.MethodVisitor;
-import org.objectweb.asm.Opcodes;
-import org.objectweb.asm.Type;
-import org.objectweb.asm.signature.SignatureReader;
-import org.objectweb.asm.signature.SignatureVisitor;
-import org.objectweb.asm.signature.SignatureWriter;
-
-/**
- * Provides the common code for RenameClassAdapter and RefactorClassAdapter. It
- * goes through the complete class and finds references to other classes. It
- * then calls {@link #renameInternalType(String)} to convert the className to
- * the new value, if need be.
- */
-public abstract class AbstractClassAdapter extends ClassVisitor {
-
- /**
- * Returns the new FQCN for the class, if the reference to this class needs
- * to be updated. Else, it returns the same string.
- * @param name Old FQCN
- * @return New FQCN if it needs to be renamed, else the old FQCN
- */
- abstract String renameInternalType(String name);
-
- public AbstractClassAdapter(ClassVisitor cv) {
- super(Opcodes.ASM4, cv);
- }
-
- /**
- * Renames a type descriptor, e.g. "Lcom.package.MyClass;"
- * If the type doesn't need to be renamed, returns the input string as-is.
- */
- String renameTypeDesc(String desc) {
- if (desc == null) {
- return null;
- }
-
- return renameType(Type.getType(desc));
- }
-
- /**
- * Renames an object type, e.g. "Lcom.package.MyClass;" or an array type that has an
- * object element, e.g. "[Lcom.package.MyClass;"
- * If the type doesn't need to be renamed, returns the internal name of the input type.
- */
- String renameType(Type type) {
- if (type == null) {
- return null;
- }
-
- if (type.getSort() == Type.OBJECT) {
- String in = type.getInternalName();
- return "L" + renameInternalType(in) + ";";
- } else if (type.getSort() == Type.ARRAY) {
- StringBuilder sb = new StringBuilder();
- for (int n = type.getDimensions(); n > 0; n--) {
- sb.append('[');
- }
- sb.append(renameType(type.getElementType()));
- return sb.toString();
- }
- return type.getDescriptor();
- }
-
- /**
- * Renames an object type, e.g. "Lcom.package.MyClass;" or an array type that has an
- * object element, e.g. "[Lcom.package.MyClass;".
- * This is like renameType() except that it returns a Type object.
- * If the type doesn't need to be renamed, returns the input type object.
- */
- Type renameTypeAsType(Type type) {
- if (type == null) {
- return null;
- }
-
- if (type.getSort() == Type.OBJECT) {
- String in = type.getInternalName();
- String newIn = renameInternalType(in);
- if (newIn != in) {
- return Type.getType("L" + newIn + ";");
- }
- } else if (type.getSort() == Type.ARRAY) {
- StringBuilder sb = new StringBuilder();
- for (int n = type.getDimensions(); n > 0; n--) {
- sb.append('[');
- }
- sb.append(renameType(type.getElementType()));
- return Type.getType(sb.toString());
- }
- return type;
- }
-
- /**
- * Renames a method descriptor, i.e. applies renameType to all arguments and to the
- * return value.
- */
- String renameMethodDesc(String desc) {
- if (desc == null) {
- return null;
- }
-
- Type[] args = Type.getArgumentTypes(desc);
-
- StringBuilder sb = new StringBuilder("(");
- for (Type arg : args) {
- String name = renameType(arg);
- sb.append(name);
- }
- sb.append(')');
-
- Type ret = Type.getReturnType(desc);
- String name = renameType(ret);
- sb.append(name);
-
- return sb.toString();
- }
-
-
- /**
- * Renames the ClassSignature handled by ClassVisitor.visit
- * or the MethodTypeSignature handled by ClassVisitor.visitMethod.
- */
- String renameTypeSignature(String sig) {
- if (sig == null) {
- return null;
- }
- SignatureReader reader = new SignatureReader(sig);
- SignatureWriter writer = new SignatureWriter();
- reader.accept(new RenameSignatureAdapter(writer));
- sig = writer.toString();
- return sig;
- }
-
-
- /**
- * Renames the FieldTypeSignature handled by ClassVisitor.visitField
- * or MethodVisitor.visitLocalVariable.
- */
- String renameFieldSignature(String sig) {
- return renameTypeSignature(sig);
- }
-
-
- //----------------------------------
- // Methods from the ClassAdapter
-
- @Override
- public void visit(int version, int access, String name, String signature,
- String superName, String[] interfaces) {
- name = renameInternalType(name);
- superName = renameInternalType(superName);
- signature = renameTypeSignature(signature);
- if (interfaces != null) {
- for (int i = 0; i < interfaces.length; ++i) {
- interfaces[i] = renameInternalType(interfaces[i]);
- }
- }
-
- super.visit(version, access, name, signature, superName, interfaces);
- }
-
- @Override
- public void visitInnerClass(String name, String outerName, String innerName, int access) {
- name = renameInternalType(name);
- outerName = renameInternalType(outerName);
- super.visitInnerClass(name, outerName, innerName, access);
- }
-
- @Override
- public void visitOuterClass(String owner, String name, String desc) {
- super.visitOuterClass(renameInternalType(owner), name, renameTypeDesc(desc));
- }
-
- @Override
- public MethodVisitor visitMethod(int access, String name, String desc,
- String signature, String[] exceptions) {
- desc = renameMethodDesc(desc);
- signature = renameTypeSignature(signature);
- MethodVisitor mw = super.visitMethod(access, name, desc, signature, exceptions);
- return new RenameMethodAdapter(mw);
- }
-
- @Override
- public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
- desc = renameTypeDesc(desc);
- return super.visitAnnotation(desc, visible);
- }
-
- @Override
- public FieldVisitor visitField(int access, String name, String desc,
- String signature, Object value) {
- desc = renameTypeDesc(desc);
- return super.visitField(access, name, desc, signature, value);
- }
-
-
- //----------------------------------
-
- /**
- * A method visitor that renames all references from an old class name to a new class name.
- */
- public class RenameMethodAdapter extends MethodVisitor {
-
- /**
- * Creates a method visitor that renames all references from a given old name to a given new
- * name. The method visitor will also rename all inner classes.
- * The names must be full qualified internal ASM names (e.g. com/blah/MyClass$InnerClass).
- */
- public RenameMethodAdapter(MethodVisitor mv) {
- super(Opcodes.ASM4, mv);
- }
-
- @Override
- public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
- desc = renameTypeDesc(desc);
-
- return super.visitAnnotation(desc, visible);
- }
-
- @Override
- public AnnotationVisitor visitParameterAnnotation(int parameter, String desc, boolean visible) {
- desc = renameTypeDesc(desc);
-
- return super.visitParameterAnnotation(parameter, desc, visible);
- }
-
- @Override
- public void visitTypeInsn(int opcode, String type) {
- // The type sometimes turns out to be a type descriptor. We try to detect it and fix.
- if (type.indexOf(';') > 0) {
- type = renameTypeDesc(type);
- } else {
- type = renameInternalType(type);
- }
- super.visitTypeInsn(opcode, type);
- }
-
- @Override
- public void visitFieldInsn(int opcode, String owner, String name, String desc) {
- owner = renameInternalType(owner);
- desc = renameTypeDesc(desc);
-
- super.visitFieldInsn(opcode, owner, name, desc);
- }
-
- @Override
- public void visitMethodInsn(int opcode, String owner, String name, String desc) {
- // The owner sometimes turns out to be a type descriptor. We try to detect it and fix.
- if (owner.indexOf(';') > 0) {
- owner = renameTypeDesc(owner);
- } else {
- owner = renameInternalType(owner);
- }
- desc = renameMethodDesc(desc);
-
- super.visitMethodInsn(opcode, owner, name, desc);
- }
-
- @Override
- public void visitLdcInsn(Object cst) {
- // If cst is a Type, this means the code is trying to pull the .class constant
- // for this class, so it needs to be renamed too.
- if (cst instanceof Type) {
- cst = renameTypeAsType((Type) cst);
- }
- super.visitLdcInsn(cst);
- }
-
- @Override
- public void visitMultiANewArrayInsn(String desc, int dims) {
- desc = renameTypeDesc(desc);
-
- super.visitMultiANewArrayInsn(desc, dims);
- }
-
- @Override
- public void visitTryCatchBlock(Label start, Label end, Label handler, String type) {
- type = renameInternalType(type);
-
- super.visitTryCatchBlock(start, end, handler, type);
- }
-
- @Override
- public void visitLocalVariable(String name, String desc, String signature,
- Label start, Label end, int index) {
- desc = renameTypeDesc(desc);
- signature = renameFieldSignature(signature);
-
- super.visitLocalVariable(name, desc, signature, start, end, index);
- }
-
- }
-
- //----------------------------------
-
- public class RenameSignatureAdapter extends SignatureVisitor {
-
- private final SignatureVisitor mSv;
-
- public RenameSignatureAdapter(SignatureVisitor sv) {
- super(Opcodes.ASM4);
- mSv = sv;
- }
-
- @Override
- public void visitClassType(String name) {
- name = renameInternalType(name);
- mSv.visitClassType(name);
- }
-
- @Override
- public void visitInnerClassType(String name) {
- name = renameInternalType(name);
- mSv.visitInnerClassType(name);
- }
-
- @Override
- public SignatureVisitor visitArrayType() {
- SignatureVisitor sv = mSv.visitArrayType();
- return new RenameSignatureAdapter(sv);
- }
-
- @Override
- public void visitBaseType(char descriptor) {
- mSv.visitBaseType(descriptor);
- }
-
- @Override
- public SignatureVisitor visitClassBound() {
- SignatureVisitor sv = mSv.visitClassBound();
- return new RenameSignatureAdapter(sv);
- }
-
- @Override
- public void visitEnd() {
- mSv.visitEnd();
- }
-
- @Override
- public SignatureVisitor visitExceptionType() {
- SignatureVisitor sv = mSv.visitExceptionType();
- return new RenameSignatureAdapter(sv);
- }
-
- @Override
- public void visitFormalTypeParameter(String name) {
- mSv.visitFormalTypeParameter(name);
- }
-
- @Override
- public SignatureVisitor visitInterface() {
- SignatureVisitor sv = mSv.visitInterface();
- return new RenameSignatureAdapter(sv);
- }
-
- @Override
- public SignatureVisitor visitInterfaceBound() {
- SignatureVisitor sv = mSv.visitInterfaceBound();
- return new RenameSignatureAdapter(sv);
- }
-
- @Override
- public SignatureVisitor visitParameterType() {
- SignatureVisitor sv = mSv.visitParameterType();
- return new RenameSignatureAdapter(sv);
- }
-
- @Override
- public SignatureVisitor visitReturnType() {
- SignatureVisitor sv = mSv.visitReturnType();
- return new RenameSignatureAdapter(sv);
- }
-
- @Override
- public SignatureVisitor visitSuperclass() {
- SignatureVisitor sv = mSv.visitSuperclass();
- return new RenameSignatureAdapter(sv);
- }
-
- @Override
- public void visitTypeArgument() {
- mSv.visitTypeArgument();
- }
-
- @Override
- public SignatureVisitor visitTypeArgument(char wildcard) {
- SignatureVisitor sv = mSv.visitTypeArgument(wildcard);
- return new RenameSignatureAdapter(sv);
- }
-
- @Override
- public void visitTypeVariable(String name) {
- mSv.visitTypeVariable(name);
- }
-
- }
-}
diff --git a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/AsmAnalyzer.java b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/AsmAnalyzer.java
deleted file mode 100644
index 1572a40..0000000
--- a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/AsmAnalyzer.java
+++ /dev/null
@@ -1,854 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.tools.layoutlib.create;
-
-import org.objectweb.asm.AnnotationVisitor;
-import org.objectweb.asm.Attribute;
-import org.objectweb.asm.ClassReader;
-import org.objectweb.asm.ClassVisitor;
-import org.objectweb.asm.FieldVisitor;
-import org.objectweb.asm.Label;
-import org.objectweb.asm.MethodVisitor;
-import org.objectweb.asm.Opcodes;
-import org.objectweb.asm.Type;
-import org.objectweb.asm.signature.SignatureReader;
-import org.objectweb.asm.signature.SignatureVisitor;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Enumeration;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
-import java.util.TreeMap;
-import java.util.regex.Pattern;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipFile;
-
-/**
- * Analyzes the input JAR using the ASM java bytecode manipulation library
- * to list the desired classes and their dependencies.
- */
-public class AsmAnalyzer {
-
- // Note: a bunch of stuff has package-level access for unit tests. Consider it private.
-
- /** Output logger. */
- private final Log mLog;
- /** The input source JAR to parse. */
- private final List<String> mOsSourceJar;
- /** The generator to fill with the class list and dependency list. */
- private final AsmGenerator mGen;
- /** Keep all classes that derive from these one (these included). */
- private final String[] mDeriveFrom;
- /** Glob patterns of classes to keep, e.g. "com.foo.*" */
- private final String[] mIncludeGlobs;
- /** The set of classes to exclude.*/
- private final Set<String> mExcludedClasses;
-
- /**
- * Creates a new analyzer.
- *
- * @param log The log output.
- * @param osJarPath The input source JARs to parse.
- * @param gen The generator to fill with the class list and dependency list.
- * @param deriveFrom Keep all classes that derive from these one (these included).
- * @param includeGlobs Glob patterns of classes to keep, e.g. "com.foo.*"
- * ("*" does not matches dots whilst "**" does, "." and "$" are interpreted as-is)
- */
- public AsmAnalyzer(Log log, List<String> osJarPath, AsmGenerator gen,
- String[] deriveFrom, String[] includeGlobs, Set<String> excludeClasses) {
- mLog = log;
- mGen = gen;
- mOsSourceJar = osJarPath != null ? osJarPath : new ArrayList<String>();
- mDeriveFrom = deriveFrom != null ? deriveFrom : new String[0];
- mIncludeGlobs = includeGlobs != null ? includeGlobs : new String[0];
- mExcludedClasses = excludeClasses;
- }
-
- /**
- * Starts the analysis using parameters from the constructor.
- * Fills the generator with classes & dependencies found.
- */
- public void analyze() throws IOException, LogAbortException {
- Map<String, ClassReader> zipClasses = parseZip(mOsSourceJar);
- mLog.info("Found %d classes in input JAR%s.", zipClasses.size(),
- mOsSourceJar.size() > 1 ? "s" : "");
-
- Map<String, ClassReader> found = findIncludes(zipClasses);
- Map<String, ClassReader> deps = findDeps(zipClasses, found);
-
- if (mGen != null) {
- mGen.setKeep(found);
- mGen.setDeps(deps);
- }
- }
-
- /**
- * Parses a JAR file and returns a list of all classes founds using a map
- * class name => ASM ClassReader. Class names are in the form "android.view.View".
- */
- Map<String,ClassReader> parseZip(List<String> jarPathList) throws IOException {
- TreeMap<String, ClassReader> classes = new TreeMap<String, ClassReader>();
-
- for (String jarPath : jarPathList) {
- ZipFile zip = new ZipFile(jarPath);
- Enumeration<? extends ZipEntry> entries = zip.entries();
- ZipEntry entry;
- while (entries.hasMoreElements()) {
- entry = entries.nextElement();
- if (entry.getName().endsWith(".class")) {
- ClassReader cr = new ClassReader(zip.getInputStream(entry));
- String className = classReaderToClassName(cr);
- classes.put(className, cr);
- }
- }
- }
-
- return classes;
- }
-
- /**
- * Utility that returns the fully qualified binary class name for a ClassReader.
- * E.g. it returns something like android.view.View.
- */
- static String classReaderToClassName(ClassReader classReader) {
- if (classReader == null) {
- return null;
- } else {
- return classReader.getClassName().replace('/', '.');
- }
- }
-
- /**
- * Utility that returns the fully qualified binary class name from a path-like FQCN.
- * E.g. it returns android.view.View from android/view/View.
- */
- static String internalToBinaryClassName(String className) {
- if (className == null) {
- return null;
- } else {
- return className.replace('/', '.');
- }
- }
-
- /**
- * Process the "includes" arrays.
- * <p/>
- * This updates the in_out_found map.
- */
- Map<String, ClassReader> findIncludes(Map<String, ClassReader> zipClasses)
- throws LogAbortException {
- TreeMap<String, ClassReader> found = new TreeMap<String, ClassReader>();
-
- mLog.debug("Find classes to include.");
-
- for (String s : mIncludeGlobs) {
- findGlobs(s, zipClasses, found);
- }
- for (String s : mDeriveFrom) {
- findClassesDerivingFrom(s, zipClasses, found);
- }
-
- return found;
- }
-
-
- /**
- * Uses ASM to find the class reader for the given FQCN class name.
- * If found, insert it in the in_out_found map.
- * Returns the class reader object.
- */
- ClassReader findClass(String className, Map<String, ClassReader> zipClasses,
- Map<String, ClassReader> inOutFound) throws LogAbortException {
- ClassReader classReader = zipClasses.get(className);
- if (classReader == null) {
- throw new LogAbortException("Class %s not found by ASM in %s",
- className, mOsSourceJar);
- }
-
- inOutFound.put(className, classReader);
- return classReader;
- }
-
- /**
- * Insert in the inOutFound map all classes found in zipClasses that match the
- * given glob pattern.
- * <p/>
- * The glob pattern is not a regexp. It only accepts the "*" keyword to mean
- * "anything but a period". The "." and "$" characters match themselves.
- * The "**" keyword means everything including ".".
- * <p/>
- * Examples:
- * <ul>
- * <li>com.foo.* matches all classes in the package com.foo but NOT sub-packages.
- * <li>com.foo*.*$Event matches all internal Event classes in a com.foo*.* class.
- * </ul>
- */
- void findGlobs(String globPattern, Map<String, ClassReader> zipClasses,
- Map<String, ClassReader> inOutFound) throws LogAbortException {
- // transforms the glob pattern in a regexp:
- // - escape "." with "\."
- // - replace "*" by "[^.]*"
- // - escape "$" with "\$"
- // - add end-of-line match $
- globPattern = globPattern.replaceAll("\\$", "\\\\\\$");
- globPattern = globPattern.replaceAll("\\.", "\\\\.");
- // prevent ** from being altered by the next rule, then process the * rule and finally
- // the real ** rule (which is now @)
- globPattern = globPattern.replaceAll("\\*\\*", "@");
- globPattern = globPattern.replaceAll("\\*", "[^.]*");
- globPattern = globPattern.replaceAll("@", ".*");
- globPattern += "$";
-
- Pattern regexp = Pattern.compile(globPattern);
-
- for (Entry<String, ClassReader> entry : zipClasses.entrySet()) {
- String class_name = entry.getKey();
- if (regexp.matcher(class_name).matches()) {
- findClass(class_name, zipClasses, inOutFound);
- }
- }
- }
-
- /**
- * Checks all the classes defined in the JarClassName instance and uses BCEL to
- * determine if they are derived from the given FQCN super class name.
- * Inserts the super class and all the class objects found in the map.
- */
- void findClassesDerivingFrom(String super_name, Map<String, ClassReader> zipClasses,
- Map<String, ClassReader> inOutFound) throws LogAbortException {
- findClass(super_name, zipClasses, inOutFound);
-
- for (Entry<String, ClassReader> entry : zipClasses.entrySet()) {
- String className = entry.getKey();
- if (super_name.equals(className)) {
- continue;
- }
- ClassReader classReader = entry.getValue();
- ClassReader parent_cr = classReader;
- while (parent_cr != null) {
- String parent_name = internalToBinaryClassName(parent_cr.getSuperName());
- if (parent_name == null) {
- // not found
- break;
- } else if (super_name.equals(parent_name)) {
- inOutFound.put(className, classReader);
- break;
- }
- parent_cr = zipClasses.get(parent_name);
- }
- }
- }
-
- /**
- * Instantiates a new DependencyVisitor. Useful for unit tests.
- */
- DependencyVisitor getVisitor(Map<String, ClassReader> zipClasses,
- Map<String, ClassReader> inKeep,
- Map<String, ClassReader> outKeep,
- Map<String, ClassReader> inDeps,
- Map<String, ClassReader> outDeps) {
- return new DependencyVisitor(zipClasses, inKeep, outKeep, inDeps, outDeps);
- }
-
- /**
- * Finds all dependencies for all classes in keepClasses which are also
- * listed in zipClasses. Returns a map of all the dependencies found.
- */
- Map<String, ClassReader> findDeps(Map<String, ClassReader> zipClasses,
- Map<String, ClassReader> inOutKeepClasses) {
-
- TreeMap<String, ClassReader> deps = new TreeMap<String, ClassReader>();
- TreeMap<String, ClassReader> new_deps = new TreeMap<String, ClassReader>();
- TreeMap<String, ClassReader> new_keep = new TreeMap<String, ClassReader>();
- TreeMap<String, ClassReader> temp = new TreeMap<String, ClassReader>();
-
- DependencyVisitor visitor = getVisitor(zipClasses,
- inOutKeepClasses, new_keep,
- deps, new_deps);
-
- for (ClassReader cr : inOutKeepClasses.values()) {
- cr.accept(visitor, 0 /* flags */);
- }
-
- while (new_deps.size() > 0 || new_keep.size() > 0) {
- deps.putAll(new_deps);
- inOutKeepClasses.putAll(new_keep);
-
- temp.clear();
- temp.putAll(new_deps);
- temp.putAll(new_keep);
- new_deps.clear();
- new_keep.clear();
- mLog.debug("Found %1$d to keep, %2$d dependencies.",
- inOutKeepClasses.size(), deps.size());
-
- for (ClassReader cr : temp.values()) {
- cr.accept(visitor, 0 /* flags */);
- }
- }
-
- mLog.info("Found %1$d classes to keep, %2$d class dependencies.",
- inOutKeepClasses.size(), deps.size());
-
- return deps;
- }
-
-
-
- // ----------------------------------
-
- /**
- * Visitor to collect all the type dependencies from a class.
- */
- public class DependencyVisitor extends ClassVisitor {
-
- /** All classes found in the source JAR. */
- private final Map<String, ClassReader> mZipClasses;
- /** Classes from which dependencies are to be found. */
- private final Map<String, ClassReader> mInKeep;
- /** Dependencies already known. */
- private final Map<String, ClassReader> mInDeps;
- /** New dependencies found by this visitor. */
- private final Map<String, ClassReader> mOutDeps;
- /** New classes to keep as-is found by this visitor. */
- private final Map<String, ClassReader> mOutKeep;
-
- /**
- * Creates a new visitor that will find all the dependencies for the visited class.
- * Types which are already in the zipClasses, keepClasses or inDeps are not marked.
- * New dependencies are marked in outDeps.
- *
- * @param zipClasses All classes found in the source JAR.
- * @param inKeep Classes from which dependencies are to be found.
- * @param inDeps Dependencies already known.
- * @param outDeps New dependencies found by this visitor.
- */
- public DependencyVisitor(Map<String, ClassReader> zipClasses,
- Map<String, ClassReader> inKeep,
- Map<String, ClassReader> outKeep,
- Map<String,ClassReader> inDeps,
- Map<String,ClassReader> outDeps) {
- super(Opcodes.ASM4);
- mZipClasses = zipClasses;
- mInKeep = inKeep;
- mOutKeep = outKeep;
- mInDeps = inDeps;
- mOutDeps = outDeps;
- }
-
- /**
- * Considers the given class name as a dependency.
- * If it does, add to the mOutDeps map.
- */
- public void considerName(String className) {
- if (className == null) {
- return;
- }
-
- className = internalToBinaryClassName(className);
-
- // exclude classes that have already been found or are marked to be excluded
- if (mInKeep.containsKey(className) ||
- mOutKeep.containsKey(className) ||
- mInDeps.containsKey(className) ||
- mOutDeps.containsKey(className) ||
- mExcludedClasses.contains(getBaseName(className))) {
- return;
- }
-
- // exclude classes that are not part of the JAR file being examined
- ClassReader cr = mZipClasses.get(className);
- if (cr == null) {
- return;
- }
-
- try {
- // exclude classes that are part of the default JRE (the one executing this program)
- if (getClass().getClassLoader().loadClass(className) != null) {
- return;
- }
- } catch (ClassNotFoundException e) {
- // ignore
- }
-
- // accept this class:
- // - android classes are added to dependencies
- // - non-android classes are added to the list of classes to keep as-is (they don't need
- // to be stubbed).
- if (className.indexOf("android") >= 0) { // TODO make configurable
- mOutDeps.put(className, cr);
- } else {
- mOutKeep.put(className, cr);
- }
- }
-
- /**
- * Considers this array of names using considerName().
- */
- public void considerNames(String[] classNames) {
- if (classNames != null) {
- for (String className : classNames) {
- considerName(className);
- }
- }
- }
-
- /**
- * Considers this signature or type signature by invoking the {@link SignatureVisitor}
- * on it.
- */
- public void considerSignature(String signature) {
- if (signature != null) {
- SignatureReader sr = new SignatureReader(signature);
- // SignatureReader.accept will call accessType so we don't really have
- // to differentiate where the signature comes from.
- sr.accept(new MySignatureVisitor());
- }
- }
-
- /**
- * Considers this {@link Type}. For arrays, the element type is considered.
- * If the type is an object, it's internal name is considered.
- */
- public void considerType(Type t) {
- if (t != null) {
- if (t.getSort() == Type.ARRAY) {
- t = t.getElementType();
- }
- if (t.getSort() == Type.OBJECT) {
- considerName(t.getInternalName());
- }
- }
- }
-
- /**
- * Considers a descriptor string. The descriptor is converted to a {@link Type}
- * and then considerType() is invoked.
- */
- public void considerDesc(String desc) {
- if (desc != null) {
- try {
- Type t = Type.getType(desc);
- considerType(t);
- } catch (ArrayIndexOutOfBoundsException e) {
- // ignore, not a valid type.
- }
- }
- }
-
- private String getBaseName(String className) {
- int pos = className.indexOf('$');
- if (pos > 0) {
- return className.substring(0, pos);
- }
- return className;
- }
-
- // ---------------------------------------------------
- // --- ClassVisitor, FieldVisitor
- // ---------------------------------------------------
-
- // Visits a class header
- @Override
- public void visit(int version, int access, String name,
- String signature, String superName, String[] interfaces) {
- // signature is the signature of this class. May be null if the class is not a generic
- // one, and does not extend or implement generic classes or interfaces.
-
- if (signature != null) {
- considerSignature(signature);
- }
-
- // superName is the internal of name of the super class (see getInternalName).
- // For interfaces, the super class is Object. May be null but only for the Object class.
- considerName(superName);
-
- // interfaces is the internal names of the class's interfaces (see getInternalName).
- // May be null.
- considerNames(interfaces);
- }
-
-
- @Override
- public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
- // desc is the class descriptor of the annotation class.
- considerDesc(desc);
- return new MyAnnotationVisitor();
- }
-
- @Override
- public void visitAttribute(Attribute attr) {
- // pass
- }
-
- // Visits the end of a class
- @Override
- public void visitEnd() {
- // pass
- }
-
- private class MyFieldVisitor extends FieldVisitor {
-
- public MyFieldVisitor() {
- super(Opcodes.ASM4);
- }
-
- @Override
- public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
- // desc is the class descriptor of the annotation class.
- considerDesc(desc);
- return new MyAnnotationVisitor();
- }
-
- @Override
- public void visitAttribute(Attribute attr) {
- // pass
- }
-
- // Visits the end of a class
- @Override
- public void visitEnd() {
- // pass
- }
- }
-
- @Override
- public FieldVisitor visitField(int access, String name, String desc,
- String signature, Object value) {
- // desc is the field's descriptor (see Type).
- considerDesc(desc);
-
- // signature is the field's signature. May be null if the field's type does not use
- // generic types.
- considerSignature(signature);
-
- return new MyFieldVisitor();
- }
-
- @Override
- public void visitInnerClass(String name, String outerName, String innerName, int access) {
- // name is the internal name of an inner class (see getInternalName).
- considerName(name);
- }
-
- @Override
- public MethodVisitor visitMethod(int access, String name, String desc,
- String signature, String[] exceptions) {
- // desc is the method's descriptor (see Type).
- considerDesc(desc);
- // signature is the method's signature. May be null if the method parameters, return
- // type and exceptions do not use generic types.
- considerSignature(signature);
-
- return new MyMethodVisitor();
- }
-
- @Override
- public void visitOuterClass(String owner, String name, String desc) {
- // pass
- }
-
- @Override
- public void visitSource(String source, String debug) {
- // pass
- }
-
-
- // ---------------------------------------------------
- // --- MethodVisitor
- // ---------------------------------------------------
-
- private class MyMethodVisitor extends MethodVisitor {
-
- public MyMethodVisitor() {
- super(Opcodes.ASM4);
- }
-
-
- @Override
- public AnnotationVisitor visitAnnotationDefault() {
- return new MyAnnotationVisitor();
- }
-
- @Override
- public void visitCode() {
- // pass
- }
-
- // field instruction
- @Override
- public void visitFieldInsn(int opcode, String owner, String name, String desc) {
- // name is the field's name.
- considerName(name);
- // desc is the field's descriptor (see Type).
- considerDesc(desc);
- }
-
- @Override
- public void visitFrame(int type, int local, Object[] local2, int stack, Object[] stack2) {
- // pass
- }
-
- @Override
- public void visitIincInsn(int var, int increment) {
- // pass -- an IINC instruction
- }
-
- @Override
- public void visitInsn(int opcode) {
- // pass -- a zero operand instruction
- }
-
- @Override
- public void visitIntInsn(int opcode, int operand) {
- // pass -- a single int operand instruction
- }
-
- @Override
- public void visitJumpInsn(int opcode, Label label) {
- // pass -- a jump instruction
- }
-
- @Override
- public void visitLabel(Label label) {
- // pass -- a label target
- }
-
- // instruction to load a constant from the stack
- @Override
- public void visitLdcInsn(Object cst) {
- if (cst instanceof Type) {
- considerType((Type) cst);
- }
- }
-
- @Override
- public void visitLineNumber(int line, Label start) {
- // pass
- }
-
- @Override
- public void visitLocalVariable(String name, String desc,
- String signature, Label start, Label end, int index) {
- // desc is the type descriptor of this local variable.
- considerDesc(desc);
- // signature is the type signature of this local variable. May be null if the local
- // variable type does not use generic types.
- considerSignature(signature);
- }
-
- @Override
- public void visitLookupSwitchInsn(Label dflt, int[] keys, Label[] labels) {
- // pass -- a lookup switch instruction
- }
-
- @Override
- public void visitMaxs(int maxStack, int maxLocals) {
- // pass
- }
-
- // instruction that invokes a method
- @Override
- public void visitMethodInsn(int opcode, String owner, String name, String desc) {
-
- // owner is the internal name of the method's owner class
- considerName(owner);
- // desc is the method's descriptor (see Type).
- considerDesc(desc);
- }
-
- // instruction multianewarray, whatever that is
- @Override
- public void visitMultiANewArrayInsn(String desc, int dims) {
-
- // desc an array type descriptor.
- considerDesc(desc);
- }
-
- @Override
- public AnnotationVisitor visitParameterAnnotation(int parameter, String desc,
- boolean visible) {
- // desc is the class descriptor of the annotation class.
- considerDesc(desc);
- return new MyAnnotationVisitor();
- }
-
- @Override
- public void visitTableSwitchInsn(int min, int max, Label dflt, Label... labels) {
- // pass -- table switch instruction
-
- }
-
- @Override
- public void visitTryCatchBlock(Label start, Label end, Label handler, String type) {
- // type is the internal name of the type of exceptions handled by the handler,
- // or null to catch any exceptions (for "finally" blocks).
- considerName(type);
- }
-
- // type instruction
- @Override
- public void visitTypeInsn(int opcode, String type) {
- // type is the operand of the instruction to be visited. This operand must be the
- // internal name of an object or array class.
- considerName(type);
- }
-
- @Override
- public void visitVarInsn(int opcode, int var) {
- // pass -- local variable instruction
- }
- }
-
- private class MySignatureVisitor extends SignatureVisitor {
-
- public MySignatureVisitor() {
- super(Opcodes.ASM4);
- }
-
- // ---------------------------------------------------
- // --- SignatureVisitor
- // ---------------------------------------------------
-
- private String mCurrentSignatureClass = null;
-
- // Starts the visit of a signature corresponding to a class or interface type
- @Override
- public void visitClassType(String name) {
- mCurrentSignatureClass = name;
- considerName(name);
- }
-
- // Visits an inner class
- @Override
- public void visitInnerClassType(String name) {
- if (mCurrentSignatureClass != null) {
- mCurrentSignatureClass += "$" + name;
- considerName(mCurrentSignatureClass);
- }
- }
-
- @Override
- public SignatureVisitor visitArrayType() {
- return new MySignatureVisitor();
- }
-
- @Override
- public void visitBaseType(char descriptor) {
- // pass -- a primitive type, ignored
- }
-
- @Override
- public SignatureVisitor visitClassBound() {
- return new MySignatureVisitor();
- }
-
- @Override
- public SignatureVisitor visitExceptionType() {
- return new MySignatureVisitor();
- }
-
- @Override
- public void visitFormalTypeParameter(String name) {
- // pass
- }
-
- @Override
- public SignatureVisitor visitInterface() {
- return new MySignatureVisitor();
- }
-
- @Override
- public SignatureVisitor visitInterfaceBound() {
- return new MySignatureVisitor();
- }
-
- @Override
- public SignatureVisitor visitParameterType() {
- return new MySignatureVisitor();
- }
-
- @Override
- public SignatureVisitor visitReturnType() {
- return new MySignatureVisitor();
- }
-
- @Override
- public SignatureVisitor visitSuperclass() {
- return new MySignatureVisitor();
- }
-
- @Override
- public SignatureVisitor visitTypeArgument(char wildcard) {
- return new MySignatureVisitor();
- }
-
- @Override
- public void visitTypeVariable(String name) {
- // pass
- }
-
- @Override
- public void visitTypeArgument() {
- // pass
- }
- }
-
-
- // ---------------------------------------------------
- // --- AnnotationVisitor
- // ---------------------------------------------------
-
- private class MyAnnotationVisitor extends AnnotationVisitor {
-
- public MyAnnotationVisitor() {
- super(Opcodes.ASM4);
- }
-
- // Visits a primitive value of an annotation
- @Override
- public void visit(String name, Object value) {
- // value is the actual value, whose type must be Byte, Boolean, Character, Short,
- // Integer, Long, Float, Double, String or Type
- if (value instanceof Type) {
- considerType((Type) value);
- }
- }
-
- @Override
- public AnnotationVisitor visitAnnotation(String name, String desc) {
- // desc is the class descriptor of the nested annotation class.
- considerDesc(desc);
- return new MyAnnotationVisitor();
- }
-
- @Override
- public AnnotationVisitor visitArray(String name) {
- return new MyAnnotationVisitor();
- }
-
- @Override
- public void visitEnum(String name, String desc, String value) {
- // desc is the class descriptor of the enumeration class.
- considerDesc(desc);
- }
- }
- }
-}
diff --git a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/AsmGenerator.java b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/AsmGenerator.java
deleted file mode 100644
index b102561..0000000
--- a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/AsmGenerator.java
+++ /dev/null
@@ -1,384 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.tools.layoutlib.create;
-
-import org.objectweb.asm.ClassReader;
-import org.objectweb.asm.ClassVisitor;
-import org.objectweb.asm.ClassWriter;
-
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
-import java.util.TreeMap;
-import java.util.jar.JarEntry;
-import java.util.jar.JarOutputStream;
-
-/**
- * Class that generates a new JAR from a list of classes, some of which are to be kept as-is
- * and some of which are to be stubbed partially or totally.
- */
-public class AsmGenerator {
-
- /** Output logger. */
- private final Log mLog;
- /** The path of the destination JAR to create. */
- private final String mOsDestJar;
- /** List of classes to inject in the final JAR from _this_ archive. */
- private final Class<?>[] mInjectClasses;
- /** The set of methods to stub out. */
- private final Set<String> mStubMethods;
- /** All classes to output as-is, except if they have native methods. */
- private Map<String, ClassReader> mKeep;
- /** All dependencies that must be completely stubbed. */
- private Map<String, ClassReader> mDeps;
- /** Counter of number of classes renamed during transform. */
- private int mRenameCount;
- /** FQCN Names of the classes to rename: map old-FQCN => new-FQCN */
- private final HashMap<String, String> mRenameClasses;
- /** FQCN Names of "old" classes that were NOT renamed. This starts with the full list of
- * old-FQCN to rename and they get erased as they get renamed. At the end, classes still
- * left here are not in the code base anymore and thus were not renamed. */
- private HashSet<String> mClassesNotRenamed;
- /** A map { FQCN => set { list of return types to delete from the FQCN } }. */
- private HashMap<String, Set<String>> mDeleteReturns;
- /** A map { FQCN => set { method names } } of methods to rewrite as delegates.
- * The special name {@link DelegateClassAdapter#ALL_NATIVES} can be used as in internal set. */
- private final HashMap<String, Set<String>> mDelegateMethods;
- /** FQCN Names of classes to refactor. All reference to old-FQCN will be updated to new-FQCN.
- * map old-FQCN => new-FQCN */
- private final HashMap<String, String> mRefactorClasses;
-
- /**
- * Creates a new generator that can generate the output JAR with the stubbed classes.
- *
- * @param log Output logger.
- * @param osDestJar The path of the destination JAR to create.
- * @param createInfo Creation parameters. Must not be null.
- */
- public AsmGenerator(Log log, String osDestJar, ICreateInfo createInfo) {
- mLog = log;
- mOsDestJar = osDestJar;
- mInjectClasses = createInfo.getInjectedClasses();
- mStubMethods = new HashSet<String>(Arrays.asList(createInfo.getOverriddenMethods()));
-
- // Create the map/set of methods to change to delegates
- mDelegateMethods = new HashMap<String, Set<String>>();
- for (String signature : createInfo.getDelegateMethods()) {
- int pos = signature.indexOf('#');
- if (pos <= 0 || pos >= signature.length() - 1) {
- continue;
- }
- String className = binaryToInternalClassName(signature.substring(0, pos));
- String methodName = signature.substring(pos + 1);
- Set<String> methods = mDelegateMethods.get(className);
- if (methods == null) {
- methods = new HashSet<String>();
- mDelegateMethods.put(className, methods);
- }
- methods.add(methodName);
- }
- for (String className : createInfo.getDelegateClassNatives()) {
- className = binaryToInternalClassName(className);
- Set<String> methods = mDelegateMethods.get(className);
- if (methods == null) {
- methods = new HashSet<String>();
- mDelegateMethods.put(className, methods);
- }
- methods.add(DelegateClassAdapter.ALL_NATIVES);
- }
-
- // Create the map of classes to rename.
- mRenameClasses = new HashMap<String, String>();
- mClassesNotRenamed = new HashSet<String>();
- String[] renameClasses = createInfo.getRenamedClasses();
- int n = renameClasses.length;
- for (int i = 0; i < n; i += 2) {
- assert i + 1 < n;
- // The ASM class names uses "/" separators, whereas regular FQCN use "."
- String oldFqcn = binaryToInternalClassName(renameClasses[i]);
- String newFqcn = binaryToInternalClassName(renameClasses[i + 1]);
- mRenameClasses.put(oldFqcn, newFqcn);
- mClassesNotRenamed.add(oldFqcn);
- }
-
- // Create a map of classes to be refactored.
- mRefactorClasses = new HashMap<String, String>();
- String[] refactorClasses = createInfo.getJavaPkgClasses();
- n = refactorClasses.length;
- for (int i = 0; i < n; i += 2) {
- assert i + 1 < n;
- String oldFqcn = binaryToInternalClassName(refactorClasses[i]);
- String newFqcn = binaryToInternalClassName(refactorClasses[i + 1]);
- mRefactorClasses.put(oldFqcn, newFqcn);;
- }
-
- // create the map of renamed class -> return type of method to delete.
- mDeleteReturns = new HashMap<String, Set<String>>();
- String[] deleteReturns = createInfo.getDeleteReturns();
- Set<String> returnTypes = null;
- String renamedClass = null;
- for (String className : deleteReturns) {
- // if we reach the end of a section, add it to the main map
- if (className == null) {
- if (returnTypes != null) {
- mDeleteReturns.put(renamedClass, returnTypes);
- }
-
- renamedClass = null;
- continue;
- }
-
- // if the renamed class is null, this is the beginning of a section
- if (renamedClass == null) {
- renamedClass = binaryToInternalClassName(className);
- continue;
- }
-
- // just a standard return type, we add it to the list.
- if (returnTypes == null) {
- returnTypes = new HashSet<String>();
- }
- returnTypes.add(binaryToInternalClassName(className));
- }
- }
-
- /**
- * Returns the list of classes that have not been renamed yet.
- * <p/>
- * The names are "internal class names" rather than FQCN, i.e. they use "/" instead "."
- * as package separators.
- */
- public Set<String> getClassesNotRenamed() {
- return mClassesNotRenamed;
- }
-
- /**
- * Utility that returns the internal ASM class name from a fully qualified binary class
- * name. E.g. it returns android/view/View from android.view.View.
- */
- String binaryToInternalClassName(String className) {
- if (className == null) {
- return null;
- } else {
- return className.replace('.', '/');
- }
- }
-
- /** Sets the map of classes to output as-is, except if they have native methods */
- public void setKeep(Map<String, ClassReader> keep) {
- mKeep = keep;
- }
-
- /** Sets the map of dependencies that must be completely stubbed */
- public void setDeps(Map<String, ClassReader> deps) {
- mDeps = deps;
- }
-
- /** Gets the map of classes to output as-is, except if they have native methods */
- public Map<String, ClassReader> getKeep() {
- return mKeep;
- }
-
- /** Gets the map of dependencies that must be completely stubbed */
- public Map<String, ClassReader> getDeps() {
- return mDeps;
- }
-
- /** Generates the final JAR */
- public void generate() throws FileNotFoundException, IOException {
- TreeMap<String, byte[]> all = new TreeMap<String, byte[]>();
-
- for (Class<?> clazz : mInjectClasses) {
- String name = classToEntryPath(clazz);
- InputStream is = ClassLoader.getSystemResourceAsStream(name);
- ClassReader cr = new ClassReader(is);
- byte[] b = transform(cr, true /* stubNativesOnly */);
- name = classNameToEntryPath(transformName(cr.getClassName()));
- all.put(name, b);
- }
-
- for (Entry<String, ClassReader> entry : mDeps.entrySet()) {
- ClassReader cr = entry.getValue();
- byte[] b = transform(cr, true /* stubNativesOnly */);
- String name = classNameToEntryPath(transformName(cr.getClassName()));
- all.put(name, b);
- }
-
- for (Entry<String, ClassReader> entry : mKeep.entrySet()) {
- ClassReader cr = entry.getValue();
- byte[] b = transform(cr, true /* stubNativesOnly */);
- String name = classNameToEntryPath(transformName(cr.getClassName()));
- all.put(name, b);
- }
-
- mLog.info("# deps classes: %d", mDeps.size());
- mLog.info("# keep classes: %d", mKeep.size());
- mLog.info("# renamed : %d", mRenameCount);
-
- createJar(new FileOutputStream(mOsDestJar), all);
- mLog.info("Created JAR file %s", mOsDestJar);
- }
-
- /**
- * Writes the JAR file.
- *
- * @param outStream The file output stream were to write the JAR.
- * @param all The map of all classes to output.
- * @throws IOException if an I/O error has occurred
- */
- void createJar(FileOutputStream outStream, Map<String,byte[]> all) throws IOException {
- JarOutputStream jar = new JarOutputStream(outStream);
- for (Entry<String, byte[]> entry : all.entrySet()) {
- String name = entry.getKey();
- JarEntry jar_entry = new JarEntry(name);
- jar.putNextEntry(jar_entry);
- jar.write(entry.getValue());
- jar.closeEntry();
- }
- jar.flush();
- jar.close();
- }
-
- /**
- * Utility method that converts a fully qualified java name into a JAR entry path
- * e.g. for the input "android.view.View" it returns "android/view/View.class"
- */
- String classNameToEntryPath(String className) {
- return className.replaceAll("\\.", "/").concat(".class");
- }
-
- /**
- * Utility method to get the JAR entry path from a Class name.
- * e.g. it returns someting like "com/foo/OuterClass$InnerClass1$InnerClass2.class"
- */
- private String classToEntryPath(Class<?> clazz) {
- String name = "";
- Class<?> parent;
- while ((parent = clazz.getEnclosingClass()) != null) {
- name = "$" + clazz.getSimpleName() + name;
- clazz = parent;
- }
- return classNameToEntryPath(clazz.getCanonicalName() + name);
- }
-
- /**
- * Transforms a class.
- * <p/>
- * There are 3 kind of transformations:
- *
- * 1- For "mock" dependencies classes, we want to remove all code from methods and replace
- * by a stub. Native methods must be implemented with this stub too. Abstract methods are
- * left intact. Modified classes must be overridable (non-private, non-final).
- * Native methods must be made non-final, non-private.
- *
- * 2- For "keep" classes, we want to rewrite all native methods as indicated above.
- * If a class has native methods, it must also be made non-private, non-final.
- *
- * Note that unfortunately static methods cannot be changed to non-static (since static and
- * non-static are invoked differently.)
- */
- byte[] transform(ClassReader cr, boolean stubNativesOnly) {
-
- boolean hasNativeMethods = hasNativeMethods(cr);
-
- // Get the class name, as an internal name (e.g. com/android/SomeClass$InnerClass)
- String className = cr.getClassName();
-
- String newName = transformName(className);
- // transformName returns its input argument if there's no need to rename the class
- if (newName != className) {
- mRenameCount++;
- // This class is being renamed, so remove it from the list of classes not renamed.
- mClassesNotRenamed.remove(className);
- }
-
- mLog.debug("Transform %s%s%s%s", className,
- newName == className ? "" : " (renamed to " + newName + ")",
- hasNativeMethods ? " -- has natives" : "",
- stubNativesOnly ? " -- stub natives only" : "");
-
- // Rewrite the new class from scratch, without reusing the constant pool from the
- // original class reader.
- ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
-
- ClassVisitor cv = new RefactorClassAdapter(cw, mRefactorClasses);
- if (newName != className) {
- cv = new RenameClassAdapter(cv, className, newName);
- }
-
- cv = new TransformClassAdapter(mLog, mStubMethods,
- mDeleteReturns.get(className),
- newName, cv,
- stubNativesOnly, stubNativesOnly || hasNativeMethods);
-
- Set<String> delegateMethods = mDelegateMethods.get(className);
- if (delegateMethods != null && !delegateMethods.isEmpty()) {
- // If delegateMethods only contains one entry ALL_NATIVES and the class is
- // known to have no native methods, just skip this step.
- if (hasNativeMethods ||
- !(delegateMethods.size() == 1 &&
- delegateMethods.contains(DelegateClassAdapter.ALL_NATIVES))) {
- cv = new DelegateClassAdapter(mLog, cv, className, delegateMethods);
- }
- }
-
- cr.accept(cv, 0 /* flags */);
- return cw.toByteArray();
- }
-
- /**
- * Should this class be renamed, this returns the new name. Otherwise it returns the
- * original name.
- *
- * @param className The internal ASM name of the class that may have to be renamed
- * @return A new transformed name or the original input argument.
- */
- String transformName(String className) {
- String newName = mRenameClasses.get(className);
- if (newName != null) {
- return newName;
- }
- int pos = className.indexOf('$');
- if (pos > 0) {
- // Is this an inner class of a renamed class?
- String base = className.substring(0, pos);
- newName = mRenameClasses.get(base);
- if (newName != null) {
- return newName + className.substring(pos);
- }
- }
-
- return className;
- }
-
- /**
- * Returns true if a class has any native methods.
- */
- boolean hasNativeMethods(ClassReader cr) {
- ClassHasNativeVisitor cv = new ClassHasNativeVisitor();
- cr.accept(cv, 0 /* flags */);
- return cv.hasNativeMethods();
- }
-
-}
diff --git a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/ClassHasNativeVisitor.java b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/ClassHasNativeVisitor.java
deleted file mode 100644
index 2c955fd..0000000
--- a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/ClassHasNativeVisitor.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.tools.layoutlib.create;
-
-import com.android.tools.layoutlib.annotations.VisibleForTesting;
-import com.android.tools.layoutlib.annotations.VisibleForTesting.Visibility;
-
-import org.objectweb.asm.AnnotationVisitor;
-import org.objectweb.asm.Attribute;
-import org.objectweb.asm.ClassVisitor;
-import org.objectweb.asm.FieldVisitor;
-import org.objectweb.asm.MethodVisitor;
-import org.objectweb.asm.Opcodes;
-
-/**
- * Indicates if a class contains any native methods.
- */
-public class ClassHasNativeVisitor extends ClassVisitor {
- public ClassHasNativeVisitor() {
- super(Opcodes.ASM4);
- }
-
- private boolean mHasNativeMethods = false;
-
- public boolean hasNativeMethods() {
- return mHasNativeMethods;
- }
-
- @VisibleForTesting(visibility=Visibility.PRIVATE)
- protected void setHasNativeMethods(boolean hasNativeMethods, String methodName) {
- mHasNativeMethods = hasNativeMethods;
- }
-
- @Override
- public void visit(int version, int access, String name, String signature,
- String superName, String[] interfaces) {
- // pass
- }
-
- @Override
- public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
- // pass
- return null;
- }
-
- @Override
- public void visitAttribute(Attribute attr) {
- // pass
- }
-
- @Override
- public void visitEnd() {
- // pass
- }
-
- @Override
- public FieldVisitor visitField(int access, String name, String desc,
- String signature, Object value) {
- // pass
- return null;
- }
-
- @Override
- public void visitInnerClass(String name, String outerName,
- String innerName, int access) {
- // pass
- }
-
- @Override
- public MethodVisitor visitMethod(int access, String name, String desc,
- String signature, String[] exceptions) {
- if ((access & Opcodes.ACC_NATIVE) != 0) {
- setHasNativeMethods(true, name);
- }
- return null;
- }
-
- @Override
- public void visitOuterClass(String owner, String name, String desc) {
- // pass
- }
-
- @Override
- public void visitSource(String source, String debug) {
- // pass
- }
-
-}
diff --git a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/CreateInfo.java b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/CreateInfo.java
deleted file mode 100644
index f6779e3..0000000
--- a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/CreateInfo.java
+++ /dev/null
@@ -1,243 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.tools.layoutlib.create;
-
-import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
-import com.android.tools.layoutlib.java.AutoCloseable;
-import com.android.tools.layoutlib.java.Charsets;
-import com.android.tools.layoutlib.java.IntegralToString;
-import com.android.tools.layoutlib.java.Objects;
-import com.android.tools.layoutlib.java.UnsafeByteSequence;
-
-/**
- * Describes the work to be done by {@link AsmGenerator}.
- */
-public final class CreateInfo implements ICreateInfo {
-
- /**
- * Returns the list of class from layoutlib_create to inject in layoutlib.
- * The list can be empty but must not be null.
- */
- @Override
- public Class<?>[] getInjectedClasses() {
- return INJECTED_CLASSES;
- }
-
- /**
- * Returns the list of methods to rewrite as delegates.
- * The list can be empty but must not be null.
- */
- @Override
- public String[] getDelegateMethods() {
- return DELEGATE_METHODS;
- }
-
- /**
- * Returns the list of classes on which to delegate all native methods.
- * The list can be empty but must not be null.
- */
- @Override
- public String[] getDelegateClassNatives() {
- return DELEGATE_CLASS_NATIVES;
- }
-
- /**
- * Returns The list of methods to stub out. Each entry must be in the form
- * "package.package.OuterClass$InnerClass#MethodName".
- * The list can be empty but must not be null.
- * <p/>
- * This usage is deprecated. Please use method 'delegates' instead.
- */
- @Override
- public String[] getOverriddenMethods() {
- return OVERRIDDEN_METHODS;
- }
-
- /**
- * Returns the list of classes to rename, must be an even list: the binary FQCN
- * of class to replace followed by the new FQCN.
- * The list can be empty but must not be null.
- */
- @Override
- public String[] getRenamedClasses() {
- return RENAMED_CLASSES;
- }
-
- /**
- * Returns the list of classes for which the methods returning them should be deleted.
- * The array contains a list of null terminated section starting with the name of the class
- * to rename in which the methods are deleted, followed by a list of return types identifying
- * the methods to delete.
- * The list can be empty but must not be null.
- */
- @Override
- public String[] getDeleteReturns() {
- return DELETE_RETURNS;
- }
-
- /**
- * Returns the list of classes to refactor, must be an even list: the binary FQCN of class to
- * replace followed by the new FQCN. All references to the old class should be updated to the
- * new class. The list can be empty but must not be null.
- */
- @Override
- public String[] getJavaPkgClasses() {
- return JAVA_PKG_CLASSES;
- }
- //-----
-
- /**
- * The list of class from layoutlib_create to inject in layoutlib.
- */
- private final static Class<?>[] INJECTED_CLASSES = new Class<?>[] {
- OverrideMethod.class,
- MethodListener.class,
- MethodAdapter.class,
- ICreateInfo.class,
- CreateInfo.class,
- LayoutlibDelegate.class,
- /* Java package classes */
- AutoCloseable.class,
- Objects.class,
- IntegralToString.class,
- UnsafeByteSequence.class,
- Charsets.class,
- };
-
- /**
- * The list of methods to rewrite as delegates.
- */
- public final static String[] DELEGATE_METHODS = new String[] {
- "android.app.Fragment#instantiate", //(Landroid/content/Context;Ljava/lang/String;Landroid/os/Bundle;)Landroid/app/Fragment;",
- "android.content.res.Resources$Theme#obtainStyledAttributes",
- "android.content.res.Resources$Theme#resolveAttribute",
- "android.content.res.TypedArray#getValueAt",
- "android.graphics.BitmapFactory#finishDecode",
- "android.os.Handler#sendMessageAtTime",
- "android.os.HandlerThread#run",
- "android.os.Build#getString",
- "android.text.format.DateFormat#is24HourFormat",
- "android.text.format.Time#format1",
- "android.view.Choreographer#getRefreshRate",
- "android.view.Display#updateDisplayInfoLocked",
- "android.view.LayoutInflater#rInflate",
- "android.view.LayoutInflater#parseInclude",
- "android.view.View#isInEditMode",
- "android.view.ViewRootImpl#isInTouchMode",
- "android.view.WindowManagerGlobal#getWindowManagerService",
- "android.view.inputmethod.InputMethodManager#getInstance",
- "com.android.internal.util.XmlUtils#convertValueToInt",
- "com.android.internal.textservice.ITextServicesManager$Stub#asInterface",
- };
-
- /**
- * The list of classes on which to delegate all native methods.
- */
- public final static String[] DELEGATE_CLASS_NATIVES = new String[] {
- "android.animation.PropertyValuesHolder",
- "android.graphics.AvoidXfermode",
- "android.graphics.Bitmap",
- "android.graphics.BitmapFactory",
- "android.graphics.BitmapShader",
- "android.graphics.BlurMaskFilter",
- "android.graphics.Canvas",
- "android.graphics.ColorFilter",
- "android.graphics.ColorMatrixColorFilter",
- "android.graphics.ComposePathEffect",
- "android.graphics.ComposeShader",
- "android.graphics.CornerPathEffect",
- "android.graphics.DashPathEffect",
- "android.graphics.DiscretePathEffect",
- "android.graphics.DrawFilter",
- "android.graphics.EmbossMaskFilter",
- "android.graphics.LayerRasterizer",
- "android.graphics.LightingColorFilter",
- "android.graphics.LinearGradient",
- "android.graphics.MaskFilter",
- "android.graphics.Matrix",
- "android.graphics.NinePatch",
- "android.graphics.Paint",
- "android.graphics.PaintFlagsDrawFilter",
- "android.graphics.Path",
- "android.graphics.PathDashPathEffect",
- "android.graphics.PathEffect",
- "android.graphics.PixelXorXfermode",
- "android.graphics.PorterDuffColorFilter",
- "android.graphics.PorterDuffXfermode",
- "android.graphics.RadialGradient",
- "android.graphics.Rasterizer",
- "android.graphics.Region",
- "android.graphics.Shader",
- "android.graphics.SumPathEffect",
- "android.graphics.SweepGradient",
- "android.graphics.Typeface",
- "android.graphics.Xfermode",
- "android.os.SystemClock",
- "android.text.AndroidBidi",
- "android.util.FloatMath",
- "android.view.Display",
- "libcore.icu.DateIntervalFormat",
- "libcore.icu.ICU",
- };
-
- /**
- * The list of methods to stub out. Each entry must be in the form
- * "package.package.OuterClass$InnerClass#MethodName".
- * This usage is deprecated. Please use method 'delegates' instead.
- */
- private final static String[] OVERRIDDEN_METHODS = new String[] {
- };
-
- /**
- * The list of classes to rename, must be an even list: the binary FQCN
- * of class to replace followed by the new FQCN.
- */
- private final static String[] RENAMED_CLASSES =
- new String[] {
- "android.os.ServiceManager", "android.os._Original_ServiceManager",
- "android.util.LruCache", "android.util._Original_LruCache",
- "android.view.SurfaceView", "android.view._Original_SurfaceView",
- "android.view.accessibility.AccessibilityManager", "android.view.accessibility._Original_AccessibilityManager",
- "android.webkit.WebView", "android.webkit._Original_WebView",
- "com.android.internal.policy.PolicyManager", "com.android.internal.policy._Original_PolicyManager",
- };
-
- /**
- * The list of class references to update, must be an even list: the binary
- * FQCN of class to replace followed by the new FQCN. The classes to
- * replace are to be excluded from the output.
- */
- private final static String[] JAVA_PKG_CLASSES =
- new String[] {
- "java.lang.AutoCloseable", "com.android.tools.layoutlib.java.AutoCloseable",
- "java.util.Objects", "com.android.tools.layoutlib.java.Objects",
- "java.nio.charset.Charsets", "com.android.tools.layoutlib.java.Charsets",
- "java.lang.IntegralToString", "com.android.tools.layoutlib.java.IntegralToString",
- "java.lang.UnsafeByteSequence", "com.android.tools.layoutlib.java.UnsafeByteSequence",
- };
-
- /**
- * List of classes for which the methods returning them should be deleted.
- * The array contains a list of null terminated section starting with the name of the class
- * to rename in which the methods are deleted, followed by a list of return types identifying
- * the methods to delete.
- */
- private final static String[] DELETE_RETURNS =
- new String[] {
- null }; // separator, for next class/methods list.
-}
-
diff --git a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/DelegateClassAdapter.java b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/DelegateClassAdapter.java
deleted file mode 100644
index 927be97..0000000
--- a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/DelegateClassAdapter.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.tools.layoutlib.create;
-
-import org.objectweb.asm.ClassVisitor;
-import org.objectweb.asm.MethodVisitor;
-import org.objectweb.asm.Opcodes;
-
-import java.util.Set;
-
-/**
- * A {@link DelegateClassAdapter} can transform some methods from a class into
- * delegates that defer the call to an associated delegate class.
- * <p/>
- * This is used to override specific methods and or all native methods in classes.
- */
-public class DelegateClassAdapter extends ClassVisitor {
-
- /** Suffix added to original methods. */
- private static final String ORIGINAL_SUFFIX = "_Original";
- private static String CONSTRUCTOR = "<init>";
- private static String CLASS_INIT = "<clinit>";
-
- public final static String ALL_NATIVES = "<<all_natives>>";
-
- private final String mClassName;
- private final Set<String> mDelegateMethods;
- private final Log mLog;
-
- /**
- * Creates a new {@link DelegateClassAdapter} that can transform some methods
- * from a class into delegates that defer the call to an associated delegate class.
- * <p/>
- * This is used to override specific methods and or all native methods in classes.
- *
- * @param log The logger object. Must not be null.
- * @param cv the class visitor to which this adapter must delegate calls.
- * @param className The internal class name of the class to visit,
- * e.g. <code>com/android/SomeClass$InnerClass</code>.
- * @param delegateMethods The set of method names to modify and/or the
- * special constant {@link #ALL_NATIVES} to convert all native methods.
- */
- public DelegateClassAdapter(Log log,
- ClassVisitor cv,
- String className,
- Set<String> delegateMethods) {
- super(Opcodes.ASM4, cv);
- mLog = log;
- mClassName = className;
- mDelegateMethods = delegateMethods;
- }
-
- //----------------------------------
- // Methods from the ClassAdapter
-
- @Override
- public MethodVisitor visitMethod(int access, String name, String desc,
- String signature, String[] exceptions) {
-
- boolean isStatic = (access & Opcodes.ACC_STATIC) != 0;
- boolean isNative = (access & Opcodes.ACC_NATIVE) != 0;
-
- boolean useDelegate = (isNative && mDelegateMethods.contains(ALL_NATIVES)) ||
- mDelegateMethods.contains(name);
-
- if (!useDelegate) {
- // Not creating a delegate for this method, pass it as-is from the reader
- // to the writer.
- return super.visitMethod(access, name, desc, signature, exceptions);
- }
-
- if (useDelegate) {
- if (CONSTRUCTOR.equals(name) || CLASS_INIT.equals(name)) {
- // We don't currently support generating delegates for constructors.
- throw new UnsupportedOperationException(
- String.format(
- "Delegate doesn't support overriding constructor %1$s:%2$s(%3$s)", //$NON-NLS-1$
- mClassName, name, desc));
- }
- }
-
- if (isNative) {
- // Remove native flag
- access = access & ~Opcodes.ACC_NATIVE;
- MethodVisitor mwDelegate = super.visitMethod(access, name, desc, signature, exceptions);
-
- DelegateMethodAdapter2 a = new DelegateMethodAdapter2(
- mLog, null /*mwOriginal*/, mwDelegate, mClassName, name, desc, isStatic);
-
- // A native has no code to visit, so we need to generate it directly.
- a.generateDelegateCode();
-
- return mwDelegate;
- }
-
- // Given a non-native SomeClass.MethodName(), we want to generate 2 methods:
- // - A copy of the original method named SomeClass.MethodName_Original().
- // The content is the original method as-is from the reader.
- // - A brand new implementation of SomeClass.MethodName() which calls to a
- // non-existing method named SomeClass_Delegate.MethodName().
- // The implementation of this 'delegate' method is done in layoutlib_brigde.
-
- int accessDelegate = access;
- // change access to public for the original one
- if (Main.sOptions.generatePublicAccess) {
- access &= ~(Opcodes.ACC_PROTECTED | Opcodes.ACC_PRIVATE);
- access |= Opcodes.ACC_PUBLIC;
- }
-
- MethodVisitor mwOriginal = super.visitMethod(access, name + ORIGINAL_SUFFIX,
- desc, signature, exceptions);
- MethodVisitor mwDelegate = super.visitMethod(accessDelegate, name,
- desc, signature, exceptions);
-
- DelegateMethodAdapter2 a = new DelegateMethodAdapter2(
- mLog, mwOriginal, mwDelegate, mClassName, name, desc, isStatic);
- return a;
- }
-}
diff --git a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/DelegateMethodAdapter2.java b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/DelegateMethodAdapter2.java
deleted file mode 100644
index 0000b22..0000000
--- a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/DelegateMethodAdapter2.java
+++ /dev/null
@@ -1,461 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.tools.layoutlib.create;
-
-import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
-
-import org.objectweb.asm.AnnotationVisitor;
-import org.objectweb.asm.Attribute;
-import org.objectweb.asm.ClassReader;
-import org.objectweb.asm.ClassVisitor;
-import org.objectweb.asm.Label;
-import org.objectweb.asm.MethodVisitor;
-import org.objectweb.asm.Opcodes;
-import org.objectweb.asm.Type;
-
-import java.util.ArrayList;
-
-/**
- * This method adapter generates delegate methods.
- * <p/>
- * Given a method {@code SomeClass.MethodName()}, this generates 1 or 2 methods:
- * <ul>
- * <li> A copy of the original method named {@code SomeClass.MethodName_Original()}.
- * The content is the original method as-is from the reader.
- * This step is omitted if the method is native, since it has no Java implementation.
- * <li> A brand new implementation of {@code SomeClass.MethodName()} which calls to a
- * non-existing method named {@code SomeClass_Delegate.MethodName()}.
- * The implementation of this 'delegate' method is done in layoutlib_brigde.
- * </ul>
- * A method visitor is generally constructed to generate a single method; however
- * here we might want to generate one or two depending on the context. To achieve
- * that, the visitor here generates the 'original' method and acts as a no-op if
- * no such method exists (e.g. when the original is a native method).
- * The delegate method is generated after the {@code visitEnd} of the original method
- * or by having the class adapter <em>directly</em> call {@link #generateDelegateCode()}
- * for native methods.
- * <p/>
- * When generating the 'delegate', the implementation generates a call to a class
- * class named <code>&lt;className&gt;_Delegate</code> with static methods matching
- * the methods to be overridden here. The methods have the same return type.
- * The argument type list is the same except the "this" reference is passed first
- * for non-static methods.
- * <p/>
- * A new annotation is added to these 'delegate' methods so that we can easily find them
- * for automated testing.
- * <p/>
- * This class isn't intended to be generic or reusable.
- * It is called by {@link DelegateClassAdapter}, which takes care of properly initializing
- * the two method writers for the original and the delegate class, as needed, with their
- * expected names.
- * <p/>
- * The class adapter also takes care of calling {@link #generateDelegateCode()} directly for
- * a native and use the visitor pattern for non-natives.
- * Note that native methods have, by definition, no code so there's nothing a visitor
- * can visit.
- * <p/>
- * Instances of this class are not re-usable.
- * The class adapter creates a new instance for each method.
- */
-class DelegateMethodAdapter2 extends MethodVisitor {
-
- /** Suffix added to delegate classes. */
- public static final String DELEGATE_SUFFIX = "_Delegate";
-
- /** The parent method writer to copy of the original method.
- * Null when dealing with a native original method. */
- private MethodVisitor mOrgWriter;
- /** The parent method writer to generate the delegating method. Never null. */
- private MethodVisitor mDelWriter;
- /** The original method descriptor (return type + argument types.) */
- private String mDesc;
- /** True if the original method is static. */
- private final boolean mIsStatic;
- /** The internal class name (e.g. <code>com/android/SomeClass$InnerClass</code>.) */
- private final String mClassName;
- /** The method name. */
- private final String mMethodName;
- /** Logger object. */
- private final Log mLog;
-
- /** Array used to capture the first line number information from the original method
- * and duplicate it in the delegate. */
- private Object[] mDelegateLineNumber;
-
- /**
- * Creates a new {@link DelegateMethodAdapter2} that will transform this method
- * into a delegate call.
- * <p/>
- * See {@link DelegateMethodAdapter2} for more details.
- *
- * @param log The logger object. Must not be null.
- * @param mvOriginal The parent method writer to copy of the original method.
- * Must be {@code null} when dealing with a native original method.
- * @param mvDelegate The parent method writer to generate the delegating method.
- * Must never be null.
- * @param className The internal class name of the class to visit,
- * e.g. <code>com/android/SomeClass$InnerClass</code>.
- * @param methodName The simple name of the method.
- * @param desc A method descriptor (c.f. {@link Type#getReturnType(String)} +
- * {@link Type#getArgumentTypes(String)})
- * @param isStatic True if the method is declared static.
- */
- public DelegateMethodAdapter2(Log log,
- MethodVisitor mvOriginal,
- MethodVisitor mvDelegate,
- String className,
- String methodName,
- String desc,
- boolean isStatic) {
- super(Opcodes.ASM4);
- mLog = log;
- mOrgWriter = mvOriginal;
- mDelWriter = mvDelegate;
- mClassName = className;
- mMethodName = methodName;
- mDesc = desc;
- mIsStatic = isStatic;
- }
-
- /**
- * Generates the new code for the method.
- * <p/>
- * For native methods, this must be invoked directly by {@link DelegateClassAdapter}
- * (since they have no code to visit).
- * <p/>
- * Otherwise for non-native methods the {@link DelegateClassAdapter} simply needs to
- * return this instance of {@link DelegateMethodAdapter2} and let the normal visitor pattern
- * invoke it as part of the {@link ClassReader#accept(ClassVisitor, int)} workflow and then
- * this method will be invoked from {@link MethodVisitor#visitEnd()}.
- */
- public void generateDelegateCode() {
- /*
- * The goal is to generate a call to a static delegate method.
- * If this method is non-static, the first parameter will be 'this'.
- * All the parameters must be passed and then the eventual return type returned.
- *
- * Example, let's say we have a method such as
- * public void myMethod(int a, Object b, ArrayList<String> c) { ... }
- *
- * We'll want to create a body that calls a delegate method like this:
- * TheClass_Delegate.myMethod(this, a, b, c);
- *
- * If the method is non-static and the class name is an inner class (e.g. has $ in its
- * last segment), we want to push the 'this' of the outer class first:
- * OuterClass_InnerClass_Delegate.myMethod(
- * OuterClass.this,
- * OuterClass$InnerClass.this,
- * a, b, c);
- *
- * Only one level of inner class is supported right now, for simplicity and because
- * we don't need more.
- *
- * The generated class name is the current class name with "_Delegate" appended to it.
- * One thing to realize is that we don't care about generics -- since generic types
- * are erased at build time, they have no influence on the method name being called.
- */
-
- // Add our annotation
- AnnotationVisitor aw = mDelWriter.visitAnnotation(
- Type.getObjectType(Type.getInternalName(LayoutlibDelegate.class)).toString(),
- true); // visible at runtime
- if (aw != null) {
- aw.visitEnd();
- }
-
- mDelWriter.visitCode();
-
- if (mDelegateLineNumber != null) {
- Object[] p = mDelegateLineNumber;
- mDelWriter.visitLineNumber((Integer) p[0], (Label) p[1]);
- }
-
- ArrayList<Type> paramTypes = new ArrayList<Type>();
- String delegateClassName = mClassName + DELEGATE_SUFFIX;
- boolean pushedArg0 = false;
- int maxStack = 0;
-
- // Check if the last segment of the class name has inner an class.
- // Right now we only support one level of inner classes.
- Type outerType = null;
- int slash = mClassName.lastIndexOf('/');
- int dol = mClassName.lastIndexOf('$');
- if (dol != -1 && dol > slash && dol == mClassName.indexOf('$')) {
- String outerClass = mClassName.substring(0, dol);
- outerType = Type.getObjectType(outerClass);
-
- // Change a delegate class name to "com/foo/Outer_Inner_Delegate"
- delegateClassName = delegateClassName.replace('$', '_');
- }
-
- // For an instance method (e.g. non-static), push the 'this' preceded
- // by the 'this' of any outer class, if any.
- if (!mIsStatic) {
-
- if (outerType != null) {
- // The first-level inner class has a package-protected member called 'this$0'
- // that points to the outer class.
-
- // Push this.getField("this$0") on the call stack.
- mDelWriter.visitVarInsn(Opcodes.ALOAD, 0); // var 0 = this
- mDelWriter.visitFieldInsn(Opcodes.GETFIELD,
- mClassName, // class where the field is defined
- "this$0", // field name
- outerType.getDescriptor()); // type of the field
- maxStack++;
- paramTypes.add(outerType);
-
- }
-
- // Push "this" for the instance method, which is always ALOAD 0
- mDelWriter.visitVarInsn(Opcodes.ALOAD, 0);
- maxStack++;
- pushedArg0 = true;
- paramTypes.add(Type.getObjectType(mClassName));
- }
-
- // Push all other arguments. Start at arg 1 if we already pushed 'this' above.
- Type[] argTypes = Type.getArgumentTypes(mDesc);
- int maxLocals = pushedArg0 ? 1 : 0;
- for (Type t : argTypes) {
- int size = t.getSize();
- mDelWriter.visitVarInsn(t.getOpcode(Opcodes.ILOAD), maxLocals);
- maxLocals += size;
- maxStack += size;
- paramTypes.add(t);
- }
-
- // Construct the descriptor of the delegate based on the parameters
- // we pushed on the call stack. The return type remains unchanged.
- String desc = Type.getMethodDescriptor(
- Type.getReturnType(mDesc),
- paramTypes.toArray(new Type[paramTypes.size()]));
-
- // Invoke the static delegate
- mDelWriter.visitMethodInsn(Opcodes.INVOKESTATIC,
- delegateClassName,
- mMethodName,
- desc);
-
- Type returnType = Type.getReturnType(mDesc);
- mDelWriter.visitInsn(returnType.getOpcode(Opcodes.IRETURN));
-
- mDelWriter.visitMaxs(maxStack, maxLocals);
- mDelWriter.visitEnd();
-
- // For debugging now. Maybe we should collect these and store them in
- // a text file for helping create the delegates. We could also compare
- // the text file to a golden and break the build on unsupported changes
- // or regressions. Even better we could fancy-print something that looks
- // like the expected Java method declaration.
- mLog.debug("Delegate: %1$s # %2$s %3$s", delegateClassName, mMethodName, desc);
- }
-
- /* Pass down to visitor writer. In this implementation, either do nothing. */
- @Override
- public void visitCode() {
- if (mOrgWriter != null) {
- mOrgWriter.visitCode();
- }
- }
-
- /*
- * visitMaxs is called just before visitEnd if there was any code to rewrite.
- */
- @Override
- public void visitMaxs(int maxStack, int maxLocals) {
- if (mOrgWriter != null) {
- mOrgWriter.visitMaxs(maxStack, maxLocals);
- }
- }
-
- /** End of visiting. Generate the delegating code. */
- @Override
- public void visitEnd() {
- if (mOrgWriter != null) {
- mOrgWriter.visitEnd();
- }
- generateDelegateCode();
- }
-
- /* Writes all annotation from the original method. */
- @Override
- public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
- if (mOrgWriter != null) {
- return mOrgWriter.visitAnnotation(desc, visible);
- } else {
- return null;
- }
- }
-
- /* Writes all annotation default values from the original method. */
- @Override
- public AnnotationVisitor visitAnnotationDefault() {
- if (mOrgWriter != null) {
- return mOrgWriter.visitAnnotationDefault();
- } else {
- return null;
- }
- }
-
- @Override
- public AnnotationVisitor visitParameterAnnotation(int parameter, String desc,
- boolean visible) {
- if (mOrgWriter != null) {
- return mOrgWriter.visitParameterAnnotation(parameter, desc, visible);
- } else {
- return null;
- }
- }
-
- /* Writes all attributes from the original method. */
- @Override
- public void visitAttribute(Attribute attr) {
- if (mOrgWriter != null) {
- mOrgWriter.visitAttribute(attr);
- }
- }
-
- /*
- * Only writes the first line number present in the original code so that source
- * viewers can direct to the correct method, even if the content doesn't match.
- */
- @Override
- public void visitLineNumber(int line, Label start) {
- // Capture the first line values for the new delegate method
- if (mDelegateLineNumber == null) {
- mDelegateLineNumber = new Object[] { line, start };
- }
- if (mOrgWriter != null) {
- mOrgWriter.visitLineNumber(line, start);
- }
- }
-
- @Override
- public void visitInsn(int opcode) {
- if (mOrgWriter != null) {
- mOrgWriter.visitInsn(opcode);
- }
- }
-
- @Override
- public void visitLabel(Label label) {
- if (mOrgWriter != null) {
- mOrgWriter.visitLabel(label);
- }
- }
-
- @Override
- public void visitTryCatchBlock(Label start, Label end, Label handler, String type) {
- if (mOrgWriter != null) {
- mOrgWriter.visitTryCatchBlock(start, end, handler, type);
- }
- }
-
- @Override
- public void visitMethodInsn(int opcode, String owner, String name, String desc) {
- if (mOrgWriter != null) {
- mOrgWriter.visitMethodInsn(opcode, owner, name, desc);
- }
- }
-
- @Override
- public void visitFieldInsn(int opcode, String owner, String name, String desc) {
- if (mOrgWriter != null) {
- mOrgWriter.visitFieldInsn(opcode, owner, name, desc);
- }
- }
-
- @Override
- public void visitFrame(int type, int nLocal, Object[] local, int nStack, Object[] stack) {
- if (mOrgWriter != null) {
- mOrgWriter.visitFrame(type, nLocal, local, nStack, stack);
- }
- }
-
- @Override
- public void visitIincInsn(int var, int increment) {
- if (mOrgWriter != null) {
- mOrgWriter.visitIincInsn(var, increment);
- }
- }
-
- @Override
- public void visitIntInsn(int opcode, int operand) {
- if (mOrgWriter != null) {
- mOrgWriter.visitIntInsn(opcode, operand);
- }
- }
-
- @Override
- public void visitJumpInsn(int opcode, Label label) {
- if (mOrgWriter != null) {
- mOrgWriter.visitJumpInsn(opcode, label);
- }
- }
-
- @Override
- public void visitLdcInsn(Object cst) {
- if (mOrgWriter != null) {
- mOrgWriter.visitLdcInsn(cst);
- }
- }
-
- @Override
- public void visitLocalVariable(String name, String desc, String signature,
- Label start, Label end, int index) {
- if (mOrgWriter != null) {
- mOrgWriter.visitLocalVariable(name, desc, signature, start, end, index);
- }
- }
-
- @Override
- public void visitLookupSwitchInsn(Label dflt, int[] keys, Label[] labels) {
- if (mOrgWriter != null) {
- mOrgWriter.visitLookupSwitchInsn(dflt, keys, labels);
- }
- }
-
- @Override
- public void visitMultiANewArrayInsn(String desc, int dims) {
- if (mOrgWriter != null) {
- mOrgWriter.visitMultiANewArrayInsn(desc, dims);
- }
- }
-
- @Override
- public void visitTableSwitchInsn(int min, int max, Label dflt, Label[] labels) {
- if (mOrgWriter != null) {
- mOrgWriter.visitTableSwitchInsn(min, max, dflt, labels);
- }
- }
-
- @Override
- public void visitTypeInsn(int opcode, String type) {
- if (mOrgWriter != null) {
- mOrgWriter.visitTypeInsn(opcode, type);
- }
- }
-
- @Override
- public void visitVarInsn(int opcode, int var) {
- if (mOrgWriter != null) {
- mOrgWriter.visitVarInsn(opcode, var);
- }
- }
-
-}
diff --git a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/DependencyFinder.java b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/DependencyFinder.java
deleted file mode 100644
index c988c70..0000000
--- a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/DependencyFinder.java
+++ /dev/null
@@ -1,787 +0,0 @@
-/*
- * Copyright (C) 2012 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.tools.layoutlib.create;
-
-import com.android.tools.layoutlib.annotations.VisibleForTesting;
-import com.android.tools.layoutlib.annotations.VisibleForTesting.Visibility;
-
-import org.objectweb.asm.AnnotationVisitor;
-import org.objectweb.asm.Attribute;
-import org.objectweb.asm.ClassReader;
-import org.objectweb.asm.ClassVisitor;
-import org.objectweb.asm.FieldVisitor;
-import org.objectweb.asm.Label;
-import org.objectweb.asm.MethodVisitor;
-import org.objectweb.asm.Opcodes;
-import org.objectweb.asm.Type;
-import org.objectweb.asm.signature.SignatureReader;
-import org.objectweb.asm.signature.SignatureVisitor;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Enumeration;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
-import java.util.TreeMap;
-import java.util.TreeSet;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipFile;
-
-/**
- * Analyzes the input JAR using the ASM java bytecode manipulation library
- * to list the classes and their dependencies. A "dependency" is a class
- * used by another class.
- */
-public class DependencyFinder {
-
- // Note: a bunch of stuff has package-level access for unit tests. Consider it private.
-
- /** Output logger. */
- private final Log mLog;
-
- /**
- * Creates a new analyzer.
- *
- * @param log The log output.
- */
- public DependencyFinder(Log log) {
- mLog = log;
- }
-
- /**
- * Starts the analysis using parameters from the constructor.
- *
- * @param osJarPath The input source JARs to parse.
- * @return A pair: [0]: map { class FQCN => set of FQCN class dependencies }.
- * [1]: map { missing class FQCN => set of FQCN class that uses it. }
- */
- public List<Map<String, Set<String>>> findDeps(List<String> osJarPath) throws IOException {
-
- Map<String, ClassReader> zipClasses = parseZip(osJarPath);
- mLog.info("Found %d classes in input JAR%s.",
- zipClasses.size(),
- osJarPath.size() > 1 ? "s" : "");
-
- Map<String, Set<String>> deps = findClassesDeps(zipClasses);
-
- Map<String, Set<String>> missing = findMissingClasses(deps, zipClasses.keySet());
-
- List<Map<String, Set<String>>> result = new ArrayList<Map<String,Set<String>>>(2);
- result.add(deps);
- result.add(missing);
- return result;
- }
-
- /**
- * Prints dependencies to the current logger, found stuff and missing stuff.
- */
- public void printAllDeps(List<Map<String, Set<String>>> result) {
- assert result.size() == 2;
- Map<String, Set<String>> deps = result.get(0);
- Map<String, Set<String>> missing = result.get(1);
-
- // Print all dependences found in the format:
- // +Found: <FQCN from zip>
- // uses: FQCN
-
- mLog.info("++++++ %d Entries found in source JARs", deps.size());
- mLog.info("");
-
- for (Entry<String, Set<String>> entry : deps.entrySet()) {
- mLog.info( "+Found : %s", entry.getKey());
- for (String dep : entry.getValue()) {
- mLog.info(" uses: %s", dep);
- }
-
- mLog.info("");
- }
-
-
- // Now print all missing dependences in the format:
- // -Missing <FQCN>:
- // used by: <FQCN>
-
- mLog.info("");
- mLog.info("------ %d Entries missing from source JARs", missing.size());
- mLog.info("");
-
- for (Entry<String, Set<String>> entry : missing.entrySet()) {
- mLog.info( "-Missing : %s", entry.getKey());
- for (String dep : entry.getValue()) {
- mLog.info(" used by: %s", dep);
- }
-
- mLog.info("");
- }
- }
-
- /**
- * Prints only a summary of the missing dependencies to the current logger.
- */
- public void printMissingDeps(List<Map<String, Set<String>>> result) {
- assert result.size() == 2;
- @SuppressWarnings("unused") Map<String, Set<String>> deps = result.get(0);
- Map<String, Set<String>> missing = result.get(1);
-
- for (String fqcn : missing.keySet()) {
- mLog.info("%s", fqcn);
- }
- }
-
- // ----------------
-
- /**
- * Parses a JAR file and returns a list of all classes founds using a map
- * class name => ASM ClassReader. Class names are in the form "android.view.View".
- */
- Map<String,ClassReader> parseZip(List<String> jarPathList) throws IOException {
- TreeMap<String, ClassReader> classes = new TreeMap<String, ClassReader>();
-
- for (String jarPath : jarPathList) {
- ZipFile zip = new ZipFile(jarPath);
- Enumeration<? extends ZipEntry> entries = zip.entries();
- ZipEntry entry;
- while (entries.hasMoreElements()) {
- entry = entries.nextElement();
- if (entry.getName().endsWith(".class")) {
- ClassReader cr = new ClassReader(zip.getInputStream(entry));
- String className = classReaderToClassName(cr);
- classes.put(className, cr);
- }
- }
- }
-
- return classes;
- }
-
- /**
- * Utility that returns the fully qualified binary class name for a ClassReader.
- * E.g. it returns something like android.view.View.
- */
- static String classReaderToClassName(ClassReader classReader) {
- if (classReader == null) {
- return null;
- } else {
- return classReader.getClassName().replace('/', '.');
- }
- }
-
- /**
- * Utility that returns the fully qualified binary class name from a path-like FQCN.
- * E.g. it returns android.view.View from android/view/View.
- */
- static String internalToBinaryClassName(String className) {
- if (className == null) {
- return null;
- } else {
- return className.replace('/', '.');
- }
- }
-
- /**
- * Finds all dependencies for all classes in keepClasses which are also
- * listed in zipClasses. Returns a map of all the dependencies found.
- */
- Map<String, Set<String>> findClassesDeps(Map<String, ClassReader> zipClasses) {
-
- // The dependencies that we'll collect.
- // It's a map Class name => uses class names.
- Map<String, Set<String>> dependencyMap = new TreeMap<String, Set<String>>();
-
- DependencyVisitor visitor = getVisitor();
-
- int count = 0;
- try {
- for (Entry<String, ClassReader> entry : zipClasses.entrySet()) {
- String name = entry.getKey();
-
- TreeSet<String> set = new TreeSet<String>();
- dependencyMap.put(name, set);
- visitor.setDependencySet(set);
-
- ClassReader cr = entry.getValue();
- cr.accept(visitor, 0 /* flags */);
-
- visitor.setDependencySet(null);
-
- mLog.debugNoln("Visited %d classes\r", ++count);
- }
- } finally {
- mLog.debugNoln("\n");
- }
-
- return dependencyMap;
- }
-
- /**
- * Computes which classes FQCN were found as dependencies that are NOT listed
- * in the original JAR classes.
- *
- * @param deps The map { FQCN => dependencies[] } returned by {@link #findClassesDeps(Map)}.
- * @param zipClasses The set of all classes FQCN found in the JAR files.
- * @return A map { FQCN not found in the zipClasses => classes using it }
- */
- private Map<String, Set<String>> findMissingClasses(
- Map<String, Set<String>> deps,
- Set<String> zipClasses) {
- Map<String, Set<String>> missing = new TreeMap<String, Set<String>>();
-
- for (Entry<String, Set<String>> entry : deps.entrySet()) {
- String name = entry.getKey();
-
- for (String dep : entry.getValue()) {
- if (!zipClasses.contains(dep)) {
- // This dependency doesn't exist in the zip classes.
- Set<String> set = missing.get(dep);
- if (set == null) {
- set = new TreeSet<String>();
- missing.put(dep, set);
- }
- set.add(name);
- }
- }
-
- }
-
- return missing;
- }
-
-
- // ----------------------------------
-
- /**
- * Instantiates a new DependencyVisitor. Useful for unit tests.
- */
- @VisibleForTesting(visibility=Visibility.PRIVATE)
- DependencyVisitor getVisitor() {
- return new DependencyVisitor();
- }
-
- /**
- * Visitor to collect all the type dependencies from a class.
- */
- public class DependencyVisitor extends ClassVisitor {
-
- private Set<String> mCurrentDepSet;
-
- /**
- * Creates a new visitor that will find all the dependencies for the visited class.
- */
- public DependencyVisitor() {
- super(Opcodes.ASM4);
- }
-
- /**
- * Sets the {@link Set} where to record direct dependencies for this class.
- * This will change before each {@link ClassReader#accept(ClassVisitor, int)} call.
- */
- public void setDependencySet(Set<String> set) {
- mCurrentDepSet = set;
- }
-
- /**
- * Considers the given class name as a dependency.
- */
- public void considerName(String className) {
- if (className == null) {
- return;
- }
-
- className = internalToBinaryClassName(className);
-
- try {
- // exclude classes that are part of the default JRE (the one executing this program)
- if (getClass().getClassLoader().loadClass(className) != null) {
- return;
- }
- } catch (ClassNotFoundException e) {
- // ignore
- }
-
- // Add it to the dependency set for the currently visited class, as needed.
- assert mCurrentDepSet != null;
- if (mCurrentDepSet != null) {
- mCurrentDepSet.add(className);
- }
- }
-
- /**
- * Considers this array of names using considerName().
- */
- public void considerNames(String[] classNames) {
- if (classNames != null) {
- for (String className : classNames) {
- considerName(className);
- }
- }
- }
-
- /**
- * Considers this signature or type signature by invoking the {@link SignatureVisitor}
- * on it.
- */
- public void considerSignature(String signature) {
- if (signature != null) {
- SignatureReader sr = new SignatureReader(signature);
- // SignatureReader.accept will call accessType so we don't really have
- // to differentiate where the signature comes from.
- sr.accept(new MySignatureVisitor());
- }
- }
-
- /**
- * Considers this {@link Type}. For arrays, the element type is considered.
- * If the type is an object, it's internal name is considered.
- */
- public void considerType(Type t) {
- if (t != null) {
- if (t.getSort() == Type.ARRAY) {
- t = t.getElementType();
- }
- if (t.getSort() == Type.OBJECT) {
- considerName(t.getInternalName());
- }
- }
- }
-
- /**
- * Considers a descriptor string. The descriptor is converted to a {@link Type}
- * and then considerType() is invoked.
- */
- public boolean considerDesc(String desc) {
- if (desc != null) {
- try {
- if (desc.length() > 0 && desc.charAt(0) == '(') {
- // This is a method descriptor with arguments and a return type.
- Type t = Type.getReturnType(desc);
- considerType(t);
-
- for (Type arg : Type.getArgumentTypes(desc)) {
- considerType(arg);
- }
-
- } else {
- Type t = Type.getType(desc);
- considerType(t);
- }
- return true;
- } catch (ArrayIndexOutOfBoundsException e) {
- // ignore, not a valid type.
- }
- }
- return false;
- }
-
-
- // ---------------------------------------------------
- // --- ClassVisitor, FieldVisitor
- // ---------------------------------------------------
-
- // Visits a class header
- @Override
- public void visit(int version, int access, String name,
- String signature, String superName, String[] interfaces) {
- // signature is the signature of this class. May be null if the class is not a generic
- // one, and does not extend or implement generic classes or interfaces.
-
- if (signature != null) {
- considerSignature(signature);
- }
-
- // superName is the internal of name of the super class (see getInternalName).
- // For interfaces, the super class is Object. May be null but only for the Object class.
- considerName(superName);
-
- // interfaces is the internal names of the class's interfaces (see getInternalName).
- // May be null.
- considerNames(interfaces);
- }
-
-
- @Override
- public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
- // desc is the class descriptor of the annotation class.
- considerDesc(desc);
- return new MyAnnotationVisitor();
- }
-
- @Override
- public void visitAttribute(Attribute attr) {
- // pass
- }
-
- // Visits the end of a class
- @Override
- public void visitEnd() {
- // pass
- }
-
- private class MyFieldVisitor extends FieldVisitor {
-
- public MyFieldVisitor() {
- super(Opcodes.ASM4);
- }
-
- @Override
- public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
- // desc is the class descriptor of the annotation class.
- considerDesc(desc);
- return new MyAnnotationVisitor();
- }
-
- @Override
- public void visitAttribute(Attribute attr) {
- // pass
- }
-
- // Visits the end of a class
- @Override
- public void visitEnd() {
- // pass
- }
- }
-
- @Override
- public FieldVisitor visitField(int access, String name, String desc,
- String signature, Object value) {
- // desc is the field's descriptor (see Type).
- considerDesc(desc);
-
- // signature is the field's signature. May be null if the field's type does not use
- // generic types.
- considerSignature(signature);
-
- return new MyFieldVisitor();
- }
-
- @Override
- public void visitInnerClass(String name, String outerName, String innerName, int access) {
- // name is the internal name of an inner class (see getInternalName).
- // Note: outerName/innerName seems to be null when we're reading the
- // _Original_ClassName classes generated by layoutlib_create.
- if (outerName != null) {
- considerName(name);
- }
- }
-
- @Override
- public MethodVisitor visitMethod(int access, String name, String desc,
- String signature, String[] exceptions) {
- // desc is the method's descriptor (see Type).
- considerDesc(desc);
- // signature is the method's signature. May be null if the method parameters, return
- // type and exceptions do not use generic types.
- considerSignature(signature);
-
- return new MyMethodVisitor();
- }
-
- @Override
- public void visitOuterClass(String owner, String name, String desc) {
- // pass
- }
-
- @Override
- public void visitSource(String source, String debug) {
- // pass
- }
-
-
- // ---------------------------------------------------
- // --- MethodVisitor
- // ---------------------------------------------------
-
- private class MyMethodVisitor extends MethodVisitor {
-
- public MyMethodVisitor() {
- super(Opcodes.ASM4);
- }
-
-
- @Override
- public AnnotationVisitor visitAnnotationDefault() {
- return new MyAnnotationVisitor();
- }
-
- @Override
- public void visitCode() {
- // pass
- }
-
- // field instruction
- @Override
- public void visitFieldInsn(int opcode, String owner, String name, String desc) {
- // name is the field's name.
- // desc is the field's descriptor (see Type).
- considerDesc(desc);
- }
-
- @Override
- public void visitFrame(int type, int local, Object[] local2, int stack, Object[] stack2) {
- // pass
- }
-
- @Override
- public void visitIincInsn(int var, int increment) {
- // pass -- an IINC instruction
- }
-
- @Override
- public void visitInsn(int opcode) {
- // pass -- a zero operand instruction
- }
-
- @Override
- public void visitIntInsn(int opcode, int operand) {
- // pass -- a single int operand instruction
- }
-
- @Override
- public void visitJumpInsn(int opcode, Label label) {
- // pass -- a jump instruction
- }
-
- @Override
- public void visitLabel(Label label) {
- // pass -- a label target
- }
-
- // instruction to load a constant from the stack
- @Override
- public void visitLdcInsn(Object cst) {
- if (cst instanceof Type) {
- considerType((Type) cst);
- }
- }
-
- @Override
- public void visitLineNumber(int line, Label start) {
- // pass
- }
-
- @Override
- public void visitLocalVariable(String name, String desc,
- String signature, Label start, Label end, int index) {
- // desc is the type descriptor of this local variable.
- considerDesc(desc);
- // signature is the type signature of this local variable. May be null if the local
- // variable type does not use generic types.
- considerSignature(signature);
- }
-
- @Override
- public void visitLookupSwitchInsn(Label dflt, int[] keys, Label[] labels) {
- // pass -- a lookup switch instruction
- }
-
- @Override
- public void visitMaxs(int maxStack, int maxLocals) {
- // pass
- }
-
- // instruction that invokes a method
- @Override
- public void visitMethodInsn(int opcode, String owner, String name, String desc) {
-
- // owner is the internal name of the method's owner class
- if (!considerDesc(owner) && owner.indexOf('/') != -1) {
- considerName(owner);
- }
- // desc is the method's descriptor (see Type).
- considerDesc(desc);
- }
-
- // instruction multianewarray, whatever that is
- @Override
- public void visitMultiANewArrayInsn(String desc, int dims) {
-
- // desc an array type descriptor.
- considerDesc(desc);
- }
-
- @Override
- public AnnotationVisitor visitParameterAnnotation(int parameter, String desc,
- boolean visible) {
- // desc is the class descriptor of the annotation class.
- considerDesc(desc);
- return new MyAnnotationVisitor();
- }
-
- @Override
- public void visitTableSwitchInsn(int min, int max, Label dflt, Label[] labels) {
- // pass -- table switch instruction
-
- }
-
- @Override
- public void visitTryCatchBlock(Label start, Label end, Label handler, String type) {
- // type is the internal name of the type of exceptions handled by the handler,
- // or null to catch any exceptions (for "finally" blocks).
- considerName(type);
- }
-
- // type instruction
- @Override
- public void visitTypeInsn(int opcode, String type) {
- // type is the operand of the instruction to be visited. This operand must be the
- // internal name of an object or array class.
- considerName(type);
- }
-
- @Override
- public void visitVarInsn(int opcode, int var) {
- // pass -- local variable instruction
- }
- }
-
- private class MySignatureVisitor extends SignatureVisitor {
-
- public MySignatureVisitor() {
- super(Opcodes.ASM4);
- }
-
- // ---------------------------------------------------
- // --- SignatureVisitor
- // ---------------------------------------------------
-
- private String mCurrentSignatureClass = null;
-
- // Starts the visit of a signature corresponding to a class or interface type
- @Override
- public void visitClassType(String name) {
- mCurrentSignatureClass = name;
- considerName(name);
- }
-
- // Visits an inner class
- @Override
- public void visitInnerClassType(String name) {
- if (mCurrentSignatureClass != null) {
- mCurrentSignatureClass += "$" + name;
- considerName(mCurrentSignatureClass);
- }
- }
-
- @Override
- public SignatureVisitor visitArrayType() {
- return new MySignatureVisitor();
- }
-
- @Override
- public void visitBaseType(char descriptor) {
- // pass -- a primitive type, ignored
- }
-
- @Override
- public SignatureVisitor visitClassBound() {
- return new MySignatureVisitor();
- }
-
- @Override
- public SignatureVisitor visitExceptionType() {
- return new MySignatureVisitor();
- }
-
- @Override
- public void visitFormalTypeParameter(String name) {
- // pass
- }
-
- @Override
- public SignatureVisitor visitInterface() {
- return new MySignatureVisitor();
- }
-
- @Override
- public SignatureVisitor visitInterfaceBound() {
- return new MySignatureVisitor();
- }
-
- @Override
- public SignatureVisitor visitParameterType() {
- return new MySignatureVisitor();
- }
-
- @Override
- public SignatureVisitor visitReturnType() {
- return new MySignatureVisitor();
- }
-
- @Override
- public SignatureVisitor visitSuperclass() {
- return new MySignatureVisitor();
- }
-
- @Override
- public SignatureVisitor visitTypeArgument(char wildcard) {
- return new MySignatureVisitor();
- }
-
- @Override
- public void visitTypeVariable(String name) {
- // pass
- }
-
- @Override
- public void visitTypeArgument() {
- // pass
- }
- }
-
-
- // ---------------------------------------------------
- // --- AnnotationVisitor
- // ---------------------------------------------------
-
- private class MyAnnotationVisitor extends AnnotationVisitor {
-
- public MyAnnotationVisitor() {
- super(Opcodes.ASM4);
- }
-
- // Visits a primitive value of an annotation
- @Override
- public void visit(String name, Object value) {
- // value is the actual value, whose type must be Byte, Boolean, Character, Short,
- // Integer, Long, Float, Double, String or Type
- if (value instanceof Type) {
- considerType((Type) value);
- }
- }
-
- @Override
- public AnnotationVisitor visitAnnotation(String name, String desc) {
- // desc is the class descriptor of the nested annotation class.
- considerDesc(desc);
- return new MyAnnotationVisitor();
- }
-
- @Override
- public AnnotationVisitor visitArray(String name) {
- return new MyAnnotationVisitor();
- }
-
- @Override
- public void visitEnum(String name, String desc, String value) {
- // desc is the class descriptor of the enumeration class.
- considerDesc(desc);
- }
- }
- }
-}
diff --git a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/ICreateInfo.java b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/ICreateInfo.java
deleted file mode 100644
index 9387814..0000000
--- a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/ICreateInfo.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.tools.layoutlib.create;
-
-/**
- * Interface describing the work to be done by {@link AsmGenerator}.
- */
-public interface ICreateInfo {
-
- /**
- * Returns the list of class from layoutlib_create to inject in layoutlib.
- * The list can be empty but must not be null.
- */
- public abstract Class<?>[] getInjectedClasses();
-
- /**
- * Returns the list of methods to rewrite as delegates.
- * The list can be empty but must not be null.
- */
- public abstract String[] getDelegateMethods();
-
- /**
- * Returns the list of classes on which to delegate all native methods.
- * The list can be empty but must not be null.
- */
- public abstract String[] getDelegateClassNatives();
-
- /**
- * Returns The list of methods to stub out. Each entry must be in the form
- * "package.package.OuterClass$InnerClass#MethodName".
- * The list can be empty but must not be null.
- */
- public abstract String[] getOverriddenMethods();
-
- /**
- * Returns the list of classes to rename, must be an even list: the binary FQCN
- * of class to replace followed by the new FQCN.
- * The list can be empty but must not be null.
- */
- public abstract String[] getRenamedClasses();
-
- /**
- * Returns the list of classes for which the methods returning them should be deleted.
- * The array contains a list of null terminated section starting with the name of the class
- * to rename in which the methods are deleted, followed by a list of return types identifying
- * the methods to delete.
- * The list can be empty but must not be null.
- */
- public abstract String[] getDeleteReturns();
-
- /**
- * Returns the list of classes to refactor, must be an even list: the
- * binary FQCN of class to replace followed by the new FQCN. All references
- * to the old class should be updated to the new class.
- * The list can be empty but must not be null.
- */
- public abstract String[] getJavaPkgClasses();
-}
diff --git a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/Log.java b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/Log.java
deleted file mode 100644
index c3ba591..0000000
--- a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/Log.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.tools.layoutlib.create;
-
-import java.io.PrintWriter;
-import java.io.StringWriter;
-
-public class Log {
-
- private boolean mVerbose = false;
-
- public void setVerbose(boolean verbose) {
- mVerbose = verbose;
- }
-
- public void debug(String format, Object... args) {
- if (mVerbose) {
- info(format, args);
- }
- }
-
- /** Similar to debug() but doesn't do a \n automatically. */
- public void debugNoln(String format, Object... args) {
- if (mVerbose) {
- String s = String.format(format, args);
- System.out.print(s);
- }
- }
-
- public void info(String format, Object... args) {
- String s = String.format(format, args);
- outPrintln(s);
- }
-
- public void error(String format, Object... args) {
- String s = String.format(format, args);
- errPrintln(s);
- }
-
- public void exception(Throwable t, String format, Object... args) {
- StringWriter sw = new StringWriter();
- PrintWriter pw = new PrintWriter(sw);
- t.printStackTrace(pw);
- pw.flush();
- error(format + "\n" + sw.toString(), args);
- }
-
- /** for unit testing */
- protected void errPrintln(String msg) {
- System.err.println(msg);
- }
-
- /** for unit testing */
- protected void outPrintln(String msg) {
- System.out.println(msg);
- }
-
-}
diff --git a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/LogAbortException.java b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/LogAbortException.java
deleted file mode 100644
index dc4b4a7..0000000
--- a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/LogAbortException.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.tools.layoutlib.create;
-
-public class LogAbortException extends Exception {
-
- private final String mFormat;
- private final Object[] mArgs;
-
- public LogAbortException(String format, Object... args) {
- mFormat = format;
- mArgs = args;
- }
-
- public void error(Log log) {
- log.error(mFormat, mArgs);
- }
-}
diff --git a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/Main.java b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/Main.java
deleted file mode 100644
index ba23048..0000000
--- a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/Main.java
+++ /dev/null
@@ -1,226 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.tools.layoutlib.create;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-
-/**
- * Entry point for the layoutlib_create tool.
- * <p/>
- * The tool does not currently rely on any external configuration file.
- * Instead the configuration is mostly done via the {@link CreateInfo} class.
- * <p/>
- * For a complete description of the tool and its implementation, please refer to
- * the "README.txt" file at the root of this project.
- * <p/>
- * For a quick test, invoke this as follows:
- * <pre>
- * $ make layoutlib
- * </pre>
- * which does:
- * <pre>
- * $ make layoutlib_create &lt;bunch of framework jars&gt;
- * $ java -jar out/host/linux-x86/framework/layoutlib_create.jar \
- * out/host/common/obj/JAVA_LIBRARIES/temp_layoutlib_intermediates/javalib.jar \
- * out/target/common/obj/JAVA_LIBRARIES/core_intermediates/classes.jar \
- * out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar
- * </pre>
- */
-public class Main {
-
- public static class Options {
- public boolean generatePublicAccess = true;
- public boolean listAllDeps = false;
- public boolean listOnlyMissingDeps = false;
- }
-
- public static final Options sOptions = new Options();
-
- public static void main(String[] args) {
-
- Log log = new Log();
-
- ArrayList<String> osJarPath = new ArrayList<String>();
- String[] osDestJar = { null };
-
- if (!processArgs(log, args, osJarPath, osDestJar)) {
- log.error("Usage: layoutlib_create [-v] [-p] output.jar input.jar ...");
- log.error("Usage: layoutlib_create [-v] [--list-deps|--missing-deps] input.jar ...");
- System.exit(1);
- }
-
- if (sOptions.listAllDeps || sOptions.listOnlyMissingDeps) {
- System.exit(listDeps(osJarPath, log));
-
- } else {
- System.exit(createLayoutLib(osDestJar[0], osJarPath, log));
- }
-
-
- System.exit(1);
- }
-
- private static int createLayoutLib(String osDestJar, ArrayList<String> osJarPath, Log log) {
- log.info("Output: %1$s", osDestJar);
- for (String path : osJarPath) {
- log.info("Input : %1$s", path);
- }
-
- try {
- CreateInfo info = new CreateInfo();
- Set<String> excludeClasses = getExcludedClasses(info);
- AsmGenerator agen = new AsmGenerator(log, osDestJar, info);
-
- AsmAnalyzer aa = new AsmAnalyzer(log, osJarPath, agen,
- new String[] { // derived from
- "android.view.View",
- "android.app.Fragment"
- },
- new String[] { // include classes
- "android.*", // for android.R
- "android.util.*",
- "com.android.internal.util.*",
- "android.view.*",
- "android.widget.*",
- "com.android.internal.widget.*",
- "android.text.**",
- "android.graphics.*",
- "android.graphics.drawable.*",
- "android.content.*",
- "android.content.res.*",
- "org.apache.harmony.xml.*",
- "com.android.internal.R**",
- "android.pim.*", // for datepicker
- "android.os.*", // for android.os.Handler
- "android.database.ContentObserver", // for Digital clock
- },
- excludeClasses);
- aa.analyze();
- agen.generate();
-
- // Throw an error if any class failed to get renamed by the generator
- //
- // IMPORTANT: if you're building the platform and you get this error message,
- // it means the renameClasses[] array in AsmGenerator needs to be updated: some
- // class should have been renamed but it was not found in the input JAR files.
- Set<String> notRenamed = agen.getClassesNotRenamed();
- if (notRenamed.size() > 0) {
- // (80-column guide below for error formatting)
- // 01234567890123456789012345678901234567890123456789012345678901234567890123456789
- log.error(
- "ERROR when running layoutlib_create: the following classes are referenced\n" +
- "by tools/layoutlib/create but were not actually found in the input JAR files.\n" +
- "This may be due to some platform classes having been renamed.");
- for (String fqcn : notRenamed) {
- log.error("- Class not found: %s", fqcn.replace('/', '.'));
- }
- for (String path : osJarPath) {
- log.info("- Input JAR : %1$s", path);
- }
- return 1;
- }
-
- return 0;
- } catch (IOException e) {
- log.exception(e, "Failed to load jar");
- } catch (LogAbortException e) {
- e.error(log);
- }
-
- return 1;
- }
-
- private static Set<String> getExcludedClasses(CreateInfo info) {
- String[] refactoredClasses = info.getJavaPkgClasses();
- Set<String> excludedClasses = new HashSet<String>(refactoredClasses.length);
- for (int i = 0; i < refactoredClasses.length; i+=2) {
- excludedClasses.add(refactoredClasses[i]);
- }
- return excludedClasses;
-
- }
-
- private static int listDeps(ArrayList<String> osJarPath, Log log) {
- DependencyFinder df = new DependencyFinder(log);
- try {
- List<Map<String, Set<String>>> result = df.findDeps(osJarPath);
- if (sOptions.listAllDeps) {
- df.printAllDeps(result);
- } else if (sOptions.listOnlyMissingDeps) {
- df.printMissingDeps(result);
- }
- } catch (IOException e) {
- log.exception(e, "Failed to load jar");
- }
-
- return 0;
- }
-
- /**
- * Returns true if args where properly parsed.
- * Returns false if program should exit with command-line usage.
- * <p/>
- * Note: the String[0] is an output parameter wrapped in an array, since there is no
- * "out" parameter support.
- */
- private static boolean processArgs(Log log, String[] args,
- ArrayList<String> osJarPath, String[] osDestJar) {
- boolean needs_dest = true;
- for (int i = 0; i < args.length; i++) {
- String s = args[i];
- if (s.equals("-v")) {
- log.setVerbose(true);
- } else if (s.equals("-p")) {
- sOptions.generatePublicAccess = false;
- } else if (s.equals("--list-deps")) {
- sOptions.listAllDeps = true;
- needs_dest = false;
- } else if (s.equals("--missing-deps")) {
- sOptions.listOnlyMissingDeps = true;
- needs_dest = false;
- } else if (!s.startsWith("-")) {
- if (needs_dest && osDestJar[0] == null) {
- osDestJar[0] = s;
- } else {
- osJarPath.add(s);
- }
- } else {
- log.error("Unknow argument: %s", s);
- return false;
- }
- }
-
- if (osJarPath.isEmpty()) {
- log.error("Missing parameter: path to input jar");
- return false;
- }
- if (needs_dest && osDestJar[0] == null) {
- log.error("Missing parameter: path to output jar");
- return false;
- }
-
- sOptions.generatePublicAccess = false;
-
- return true;
- }
-}
diff --git a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/MethodAdapter.java b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/MethodAdapter.java
deleted file mode 100644
index 7d1e4cf..0000000
--- a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/MethodAdapter.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.tools.layoutlib.create;
-
-
-/**
- * An adapter to make it easier to use {@link MethodListener}.
- * <p/>
- * The adapter calls the void {@link #onInvokeV(String, boolean, Object)} listener
- * for all types (I, L, F, D and A), returning 0 or null as appropriate.
- */
-public class MethodAdapter implements MethodListener {
- /**
- * A stub method is being invoked.
- * <p/>
- * Known limitation: caller arguments are not available.
- *
- * @param signature The signature of the method being invoked, composed of the
- * binary class name followed by the method descriptor (aka argument
- * types). Example: "com/foo/MyClass/InnerClass/printInt(I)V".
- * @param isNative True if the method was a native method.
- * @param caller The calling object. Null for static methods, "this" for instance methods.
- */
- @Override
- public void onInvokeV(String signature, boolean isNative, Object caller) {
- }
-
- /**
- * Same as {@link #onInvokeV(String, boolean, Object)} but returns an integer or similar.
- * @see #onInvokeV(String, boolean, Object)
- * @return an integer, or a boolean, or a short or a byte.
- */
- @Override
- public int onInvokeI(String signature, boolean isNative, Object caller) {
- onInvokeV(signature, isNative, caller);
- return 0;
- }
-
- /**
- * Same as {@link #onInvokeV(String, boolean, Object)} but returns a long.
- * @see #onInvokeV(String, boolean, Object)
- * @return a long.
- */
- @Override
- public long onInvokeL(String signature, boolean isNative, Object caller) {
- onInvokeV(signature, isNative, caller);
- return 0;
- }
-
- /**
- * Same as {@link #onInvokeV(String, boolean, Object)} but returns a float.
- * @see #onInvokeV(String, boolean, Object)
- * @return a float.
- */
- @Override
- public float onInvokeF(String signature, boolean isNative, Object caller) {
- onInvokeV(signature, isNative, caller);
- return 0;
- }
-
- /**
- * Same as {@link #onInvokeV(String, boolean, Object)} but returns a double.
- * @see #onInvokeV(String, boolean, Object)
- * @return a double.
- */
- @Override
- public double onInvokeD(String signature, boolean isNative, Object caller) {
- onInvokeV(signature, isNative, caller);
- return 0;
- }
-
- /**
- * Same as {@link #onInvokeV(String, boolean, Object)} but returns an object.
- * @see #onInvokeV(String, boolean, Object)
- * @return an object.
- */
- @Override
- public Object onInvokeA(String signature, boolean isNative, Object caller) {
- onInvokeV(signature, isNative, caller);
- return null;
- }
-}
-
diff --git a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/MethodListener.java b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/MethodListener.java
deleted file mode 100644
index 6fc2b24..0000000
--- a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/MethodListener.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.tools.layoutlib.create;
-
-
-/**
- * Interface to allow a method invocation to be listened upon.
- * <p/>
- * This is used by {@link OverrideMethod} to register a listener for methods that
- * have been stubbed by the {@link AsmGenerator}. At runtime the stub will call either a
- * default global listener or a specific listener based on the method signature.
- */
-public interface MethodListener {
- /**
- * A stub method is being invoked.
- * <p/>
- * Known limitation: caller arguments are not available.
- *
- * @param signature The signature of the method being invoked, composed of the
- * binary class name followed by the method descriptor (aka argument
- * types). Example: "com/foo/MyClass/InnerClass/printInt(I)V".
- * @param isNative True if the method was a native method.
- * @param caller The calling object. Null for static methods, "this" for instance methods.
- */
- public void onInvokeV(String signature, boolean isNative, Object caller);
-
- /**
- * Same as {@link #onInvokeV(String, boolean, Object)} but returns an integer or similar.
- * @see #onInvokeV(String, boolean, Object)
- * @return an integer, or a boolean, or a short or a byte.
- */
- public int onInvokeI(String signature, boolean isNative, Object caller);
-
- /**
- * Same as {@link #onInvokeV(String, boolean, Object)} but returns a long.
- * @see #onInvokeV(String, boolean, Object)
- * @return a long.
- */
- public long onInvokeL(String signature, boolean isNative, Object caller);
-
- /**
- * Same as {@link #onInvokeV(String, boolean, Object)} but returns a float.
- * @see #onInvokeV(String, boolean, Object)
- * @return a float.
- */
- public float onInvokeF(String signature, boolean isNative, Object caller);
-
- /**
- * Same as {@link #onInvokeV(String, boolean, Object)} but returns a double.
- * @see #onInvokeV(String, boolean, Object)
- * @return a double.
- */
- public double onInvokeD(String signature, boolean isNative, Object caller);
-
- /**
- * Same as {@link #onInvokeV(String, boolean, Object)} but returns an object.
- * @see #onInvokeV(String, boolean, Object)
- * @return an object.
- */
- public Object onInvokeA(String signature, boolean isNative, Object caller);
-}
-
diff --git a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/OverrideMethod.java b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/OverrideMethod.java
deleted file mode 100644
index a6aff99..0000000
--- a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/OverrideMethod.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.tools.layoutlib.create;
-
-import java.util.HashMap;
-
-/**
- * Allows stub methods from LayoutLib to be overriden at runtime.
- * <p/>
- * Implementation note: all types required by this class(inner/outer classes & interfaces)
- * must be referenced by the injectClass argument to {@link AsmGenerator} in Main.java;
- * Otherwise they won't be accessible in layoutlib.jar at runtime.
- */
-public final class OverrideMethod {
-
- /** Map of method overridden. */
- private static HashMap<String, MethodListener> sMethods = new HashMap<String, MethodListener>();
- /** Default listener for all method not listed in sMethods. Nothing if null. */
- private static MethodListener sDefaultListener = null;
-
- /**
- * Sets the default listener for all methods not specifically handled.
- * Null means to do nothing.
- */
- public static void setDefaultListener(MethodListener listener) {
- sDefaultListener = listener;
- }
-
- /**
- * Defines or reset a listener for the given method signature.
- *
- * @param signature The signature of the method being invoked, composed of the
- * binary class name followed by the method descriptor (aka argument
- * types). Example: "com/foo/MyClass/InnerClass/printInt(I)V"
- * @param listener The new listener. Removes it if null.
- */
- public static void setMethodListener(String signature, MethodListener listener) {
- if (listener == null) {
- sMethods.remove(signature);
- } else {
- sMethods.put(signature, listener);
- }
- }
-
- /**
- * Invokes the specific listener for the given signature or the default one if defined.
- * <p/>
- * This version invokes the method listener for the void return type.
- * <p/>
- * Note: this is not intended to be used by the LayoutLib Bridge. It is intended to be called
- * by the stubbed methods generated by the LayoutLib_create tool.
- *
- * @param signature The signature of the method being invoked, composed of the
- * binary class name followed by the method descriptor (aka argument
- * types). Example: "com/foo/MyClass/InnerClass/printInt(I)V".
- * @param isNative True if the method was a native method.
- * @param caller The calling object. Null for static methods, "this" for instance methods.
- */
- public static void invokeV(String signature, boolean isNative, Object caller) {
- MethodListener i = sMethods.get(signature);
- if (i != null) {
- i.onInvokeV(signature, isNative, caller);
- } else if (sDefaultListener != null) {
- sDefaultListener.onInvokeV(signature, isNative, caller);
- }
- }
-
- /**
- * Invokes the specific listener for the int return type.
- * @see #invokeV(String, boolean, Object)
- */
- public static int invokeI(String signature, boolean isNative, Object caller) {
- MethodListener i = sMethods.get(signature);
- if (i != null) {
- return i.onInvokeI(signature, isNative, caller);
- } else if (sDefaultListener != null) {
- return sDefaultListener.onInvokeI(signature, isNative, caller);
- }
- return 0;
- }
-
- /**
- * Invokes the specific listener for the long return type.
- * @see #invokeV(String, boolean, Object)
- */
- public static long invokeL(String signature, boolean isNative, Object caller) {
- MethodListener i = sMethods.get(signature);
- if (i != null) {
- return i.onInvokeL(signature, isNative, caller);
- } else if (sDefaultListener != null) {
- return sDefaultListener.onInvokeL(signature, isNative, caller);
- }
- return 0;
- }
-
- /**
- * Invokes the specific listener for the float return type.
- * @see #invokeV(String, boolean, Object)
- */
- public static float invokeF(String signature, boolean isNative, Object caller) {
- MethodListener i = sMethods.get(signature);
- if (i != null) {
- return i.onInvokeF(signature, isNative, caller);
- } else if (sDefaultListener != null) {
- return sDefaultListener.onInvokeF(signature, isNative, caller);
- }
- return 0;
- }
-
- /**
- * Invokes the specific listener for the double return type.
- * @see #invokeV(String, boolean, Object)
- */
- public static double invokeD(String signature, boolean isNative, Object caller) {
- MethodListener i = sMethods.get(signature);
- if (i != null) {
- return i.onInvokeD(signature, isNative, caller);
- } else if (sDefaultListener != null) {
- return sDefaultListener.onInvokeD(signature, isNative, caller);
- }
- return 0;
- }
-
- /**
- * Invokes the specific listener for the object return type.
- * @see #invokeV(String, boolean, Object)
- */
- public static Object invokeA(String signature, boolean isNative, Object caller) {
- MethodListener i = sMethods.get(signature);
- if (i != null) {
- return i.onInvokeA(signature, isNative, caller);
- } else if (sDefaultListener != null) {
- return sDefaultListener.onInvokeA(signature, isNative, caller);
- }
- return null;
- }
-}
diff --git a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/RefactorClassAdapter.java b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/RefactorClassAdapter.java
deleted file mode 100644
index 91161f5..0000000
--- a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/RefactorClassAdapter.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (C) 2013 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.tools.layoutlib.create;
-
-import java.util.HashMap;
-
-import org.objectweb.asm.ClassVisitor;
-
-public class RefactorClassAdapter extends AbstractClassAdapter {
-
- private final HashMap<String, String> mRefactorClasses;
-
- RefactorClassAdapter(ClassVisitor cv, HashMap<String, String> refactorClasses) {
- super(cv);
- mRefactorClasses = refactorClasses;
- }
-
- @Override
- protected String renameInternalType(String oldClassName) {
- if (oldClassName != null) {
- String newName = mRefactorClasses.get(oldClassName);
- if (newName != null) {
- return newName;
- }
- int pos = oldClassName.indexOf('$');
- if (pos > 0) {
- newName = mRefactorClasses.get(oldClassName.substring(0, pos));
- if (newName != null) {
- return newName + oldClassName.substring(pos);
- }
- }
- }
- return oldClassName;
- }
-}
diff --git a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/RenameClassAdapter.java b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/RenameClassAdapter.java
deleted file mode 100644
index 661074c..0000000
--- a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/RenameClassAdapter.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.tools.layoutlib.create;
-
-import org.objectweb.asm.ClassVisitor;
-
-/**
- * This class visitor renames a class from a given old name to a given new name.
- * The class visitor will also rename all inner classes and references in the methods.
- * <p/>
- *
- * For inner classes, this handles only the case where the outer class name changes.
- * The inner class name should remain the same.
- */
-public class RenameClassAdapter extends AbstractClassAdapter {
-
-
- private final String mOldName;
- private final String mNewName;
- private String mOldBase;
- private String mNewBase;
-
- /**
- * Creates a class visitor that renames a class from a given old name to a given new name.
- * The class visitor will also rename all inner classes and references in the methods.
- * The names must be full qualified internal ASM names (e.g. com/blah/MyClass$InnerClass).
- */
- public RenameClassAdapter(ClassVisitor cv, String oldName, String newName) {
- super(cv);
- mOldBase = mOldName = oldName;
- mNewBase = mNewName = newName;
-
- int pos = mOldName.indexOf('$');
- if (pos > 0) {
- mOldBase = mOldName.substring(0, pos);
- }
- pos = mNewName.indexOf('$');
- if (pos > 0) {
- mNewBase = mNewName.substring(0, pos);
- }
-
- assert (mOldBase == null && mNewBase == null) || (mOldBase != null && mNewBase != null);
- }
-
- /**
- * Renames an internal type name, e.g. "com.package.MyClass".
- * If the type doesn't need to be renamed, returns the input string as-is.
- * <p/>
- * The internal type of some of the MethodVisitor turns out to be a type
- descriptor sometimes so descriptors are renamed too.
- */
- @Override
- protected String renameInternalType(String type) {
- if (type == null) {
- return null;
- }
-
- if (type.equals(mOldName)) {
- return mNewName;
- }
-
- if (mOldBase != mOldName && type.equals(mOldBase)) {
- return mNewBase;
- }
-
- int pos = type.indexOf('$');
- if (pos == mOldBase.length() && type.startsWith(mOldBase)) {
- return mNewBase + type.substring(pos);
- }
- return type;
- }
-
-}
diff --git a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/StubMethodAdapter.java b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/StubMethodAdapter.java
deleted file mode 100644
index 51e7535..0000000
--- a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/StubMethodAdapter.java
+++ /dev/null
@@ -1,376 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.tools.layoutlib.create;
-
-import org.objectweb.asm.AnnotationVisitor;
-import org.objectweb.asm.Attribute;
-import org.objectweb.asm.Label;
-import org.objectweb.asm.MethodVisitor;
-import org.objectweb.asm.Opcodes;
-import org.objectweb.asm.Type;
-
-/**
- * This method adapter rewrites a method by discarding the original code and generating
- * a stub depending on the return type. Original annotations are passed along unchanged.
- */
-class StubMethodAdapter extends MethodVisitor {
-
- private static String CONSTRUCTOR = "<init>";
- private static String CLASS_INIT = "<clinit>";
-
- /** The parent method writer */
- private MethodVisitor mParentVisitor;
- /** The method return type. Can be null. */
- private Type mReturnType;
- /** Message to be printed by stub methods. */
- private String mInvokeSignature;
- /** Flag to output the first line number. */
- private boolean mOutputFirstLineNumber = true;
- /** Flag that is true when implementing a constructor, to accept all original
- * code calling the original super constructor. */
- private boolean mIsInitMethod = false;
-
- private boolean mMessageGenerated;
- private final boolean mIsStatic;
- private final boolean mIsNative;
-
- public StubMethodAdapter(MethodVisitor mv, String methodName, Type returnType,
- String invokeSignature, boolean isStatic, boolean isNative) {
- super(Opcodes.ASM4);
- mParentVisitor = mv;
- mReturnType = returnType;
- mInvokeSignature = invokeSignature;
- mIsStatic = isStatic;
- mIsNative = isNative;
-
- if (CONSTRUCTOR.equals(methodName) || CLASS_INIT.equals(methodName)) {
- mIsInitMethod = true;
- }
- }
-
- private void generateInvoke() {
- /* Generates the code:
- * OverrideMethod.invoke("signature", mIsNative ? true : false, null or this);
- */
- mParentVisitor.visitLdcInsn(mInvokeSignature);
- // push true or false
- mParentVisitor.visitInsn(mIsNative ? Opcodes.ICONST_1 : Opcodes.ICONST_0);
- // push null or this
- if (mIsStatic) {
- mParentVisitor.visitInsn(Opcodes.ACONST_NULL);
- } else {
- mParentVisitor.visitVarInsn(Opcodes.ALOAD, 0);
- }
-
- int sort = mReturnType != null ? mReturnType.getSort() : Type.VOID;
- switch(sort) {
- case Type.VOID:
- mParentVisitor.visitMethodInsn(Opcodes.INVOKESTATIC,
- "com/android/tools/layoutlib/create/OverrideMethod",
- "invokeV",
- "(Ljava/lang/String;ZLjava/lang/Object;)V");
- mParentVisitor.visitInsn(Opcodes.RETURN);
- break;
- case Type.BOOLEAN:
- case Type.CHAR:
- case Type.BYTE:
- case Type.SHORT:
- case Type.INT:
- mParentVisitor.visitMethodInsn(Opcodes.INVOKESTATIC,
- "com/android/tools/layoutlib/create/OverrideMethod",
- "invokeI",
- "(Ljava/lang/String;ZLjava/lang/Object;)I");
- switch(sort) {
- case Type.BOOLEAN:
- Label l1 = new Label();
- mParentVisitor.visitJumpInsn(Opcodes.IFEQ, l1);
- mParentVisitor.visitInsn(Opcodes.ICONST_1);
- mParentVisitor.visitInsn(Opcodes.IRETURN);
- mParentVisitor.visitLabel(l1);
- mParentVisitor.visitInsn(Opcodes.ICONST_0);
- break;
- case Type.CHAR:
- mParentVisitor.visitInsn(Opcodes.I2C);
- break;
- case Type.BYTE:
- mParentVisitor.visitInsn(Opcodes.I2B);
- break;
- case Type.SHORT:
- mParentVisitor.visitInsn(Opcodes.I2S);
- break;
- }
- mParentVisitor.visitInsn(Opcodes.IRETURN);
- break;
- case Type.LONG:
- mParentVisitor.visitMethodInsn(Opcodes.INVOKESTATIC,
- "com/android/tools/layoutlib/create/OverrideMethod",
- "invokeL",
- "(Ljava/lang/String;ZLjava/lang/Object;)J");
- mParentVisitor.visitInsn(Opcodes.LRETURN);
- break;
- case Type.FLOAT:
- mParentVisitor.visitMethodInsn(Opcodes.INVOKESTATIC,
- "com/android/tools/layoutlib/create/OverrideMethod",
- "invokeF",
- "(Ljava/lang/String;ZLjava/lang/Object;)F");
- mParentVisitor.visitInsn(Opcodes.FRETURN);
- break;
- case Type.DOUBLE:
- mParentVisitor.visitMethodInsn(Opcodes.INVOKESTATIC,
- "com/android/tools/layoutlib/create/OverrideMethod",
- "invokeD",
- "(Ljava/lang/String;ZLjava/lang/Object;)D");
- mParentVisitor.visitInsn(Opcodes.DRETURN);
- break;
- case Type.ARRAY:
- case Type.OBJECT:
- mParentVisitor.visitMethodInsn(Opcodes.INVOKESTATIC,
- "com/android/tools/layoutlib/create/OverrideMethod",
- "invokeA",
- "(Ljava/lang/String;ZLjava/lang/Object;)Ljava/lang/Object;");
- mParentVisitor.visitTypeInsn(Opcodes.CHECKCAST, mReturnType.getInternalName());
- mParentVisitor.visitInsn(Opcodes.ARETURN);
- break;
- }
-
- }
-
- private void generatePop() {
- /* Pops the stack, depending on the return type.
- */
- switch(mReturnType != null ? mReturnType.getSort() : Type.VOID) {
- case Type.VOID:
- break;
- case Type.BOOLEAN:
- case Type.CHAR:
- case Type.BYTE:
- case Type.SHORT:
- case Type.INT:
- case Type.FLOAT:
- case Type.ARRAY:
- case Type.OBJECT:
- mParentVisitor.visitInsn(Opcodes.POP);
- break;
- case Type.LONG:
- case Type.DOUBLE:
- mParentVisitor.visitInsn(Opcodes.POP2);
- break;
- }
- }
-
- /* Pass down to visitor writer. In this implementation, either do nothing. */
- @Override
- public void visitCode() {
- mParentVisitor.visitCode();
- }
-
- /*
- * visitMaxs is called just before visitEnd if there was any code to rewrite.
- * For non-constructor, generate the messaging code and the return statement
- * if it hasn't been done before.
- */
- @Override
- public void visitMaxs(int maxStack, int maxLocals) {
- if (!mIsInitMethod && !mMessageGenerated) {
- generateInvoke();
- mMessageGenerated = true;
- }
- mParentVisitor.visitMaxs(maxStack, maxLocals);
- }
-
- /**
- * End of visiting.
- * For non-constructor, generate the messaging code and the return statement
- * if it hasn't been done before.
- */
- @Override
- public void visitEnd() {
- if (!mIsInitMethod && !mMessageGenerated) {
- generateInvoke();
- mMessageGenerated = true;
- mParentVisitor.visitMaxs(1, 1);
- }
- mParentVisitor.visitEnd();
- }
-
- /* Writes all annotation from the original method. */
- @Override
- public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
- return mParentVisitor.visitAnnotation(desc, visible);
- }
-
- /* Writes all annotation default values from the original method. */
- @Override
- public AnnotationVisitor visitAnnotationDefault() {
- return mParentVisitor.visitAnnotationDefault();
- }
-
- @Override
- public AnnotationVisitor visitParameterAnnotation(int parameter, String desc,
- boolean visible) {
- return mParentVisitor.visitParameterAnnotation(parameter, desc, visible);
- }
-
- /* Writes all attributes from the original method. */
- @Override
- public void visitAttribute(Attribute attr) {
- mParentVisitor.visitAttribute(attr);
- }
-
- /*
- * Only writes the first line number present in the original code so that source
- * viewers can direct to the correct method, even if the content doesn't match.
- */
- @Override
- public void visitLineNumber(int line, Label start) {
- if (mIsInitMethod || mOutputFirstLineNumber) {
- mParentVisitor.visitLineNumber(line, start);
- mOutputFirstLineNumber = false;
- }
- }
-
- /**
- * For non-constructor, rewrite existing "return" instructions to write the message.
- */
- @Override
- public void visitInsn(int opcode) {
- if (mIsInitMethod) {
- switch (opcode) {
- case Opcodes.RETURN:
- case Opcodes.ARETURN:
- case Opcodes.DRETURN:
- case Opcodes.FRETURN:
- case Opcodes.IRETURN:
- case Opcodes.LRETURN:
- // Pop the last word from the stack since invoke will generate its own return.
- generatePop();
- generateInvoke();
- mMessageGenerated = true;
- //$FALL-THROUGH$
- default:
- mParentVisitor.visitInsn(opcode);
- }
- }
- }
-
- @Override
- public void visitLabel(Label label) {
- if (mIsInitMethod) {
- mParentVisitor.visitLabel(label);
- }
- }
-
- @Override
- public void visitTryCatchBlock(Label start, Label end, Label handler, String type) {
- if (mIsInitMethod) {
- mParentVisitor.visitTryCatchBlock(start, end, handler, type);
- }
- }
-
- @Override
- public void visitMethodInsn(int opcode, String owner, String name, String desc) {
- if (mIsInitMethod) {
- mParentVisitor.visitMethodInsn(opcode, owner, name, desc);
- }
- }
-
- @Override
- public void visitFieldInsn(int opcode, String owner, String name, String desc) {
- if (mIsInitMethod) {
- mParentVisitor.visitFieldInsn(opcode, owner, name, desc);
- }
- }
-
- @Override
- public void visitFrame(int type, int nLocal, Object[] local, int nStack, Object[] stack) {
- if (mIsInitMethod) {
- mParentVisitor.visitFrame(type, nLocal, local, nStack, stack);
- }
- }
-
- @Override
- public void visitIincInsn(int var, int increment) {
- if (mIsInitMethod) {
- mParentVisitor.visitIincInsn(var, increment);
- }
- }
-
- @Override
- public void visitIntInsn(int opcode, int operand) {
- if (mIsInitMethod) {
- mParentVisitor.visitIntInsn(opcode, operand);
- }
- }
-
- @Override
- public void visitJumpInsn(int opcode, Label label) {
- if (mIsInitMethod) {
- mParentVisitor.visitJumpInsn(opcode, label);
- }
- }
-
- @Override
- public void visitLdcInsn(Object cst) {
- if (mIsInitMethod) {
- mParentVisitor.visitLdcInsn(cst);
- }
- }
-
- @Override
- public void visitLocalVariable(String name, String desc, String signature,
- Label start, Label end, int index) {
- if (mIsInitMethod) {
- mParentVisitor.visitLocalVariable(name, desc, signature, start, end, index);
- }
- }
-
- @Override
- public void visitLookupSwitchInsn(Label dflt, int[] keys, Label[] labels) {
- if (mIsInitMethod) {
- mParentVisitor.visitLookupSwitchInsn(dflt, keys, labels);
- }
- }
-
- @Override
- public void visitMultiANewArrayInsn(String desc, int dims) {
- if (mIsInitMethod) {
- mParentVisitor.visitMultiANewArrayInsn(desc, dims);
- }
- }
-
- @Override
- public void visitTableSwitchInsn(int min, int max, Label dflt, Label[] labels) {
- if (mIsInitMethod) {
- mParentVisitor.visitTableSwitchInsn(min, max, dflt, labels);
- }
- }
-
- @Override
- public void visitTypeInsn(int opcode, String type) {
- if (mIsInitMethod) {
- mParentVisitor.visitTypeInsn(opcode, type);
- }
- }
-
- @Override
- public void visitVarInsn(int opcode, int var) {
- if (mIsInitMethod) {
- mParentVisitor.visitVarInsn(opcode, var);
- }
- }
-
-}
diff --git a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/TransformClassAdapter.java b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/TransformClassAdapter.java
deleted file mode 100644
index d45a183..0000000
--- a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/TransformClassAdapter.java
+++ /dev/null
@@ -1,183 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.tools.layoutlib.create;
-
-import org.objectweb.asm.ClassVisitor;
-import org.objectweb.asm.FieldVisitor;
-import org.objectweb.asm.MethodVisitor;
-import org.objectweb.asm.Opcodes;
-import org.objectweb.asm.Type;
-
-import java.util.Set;
-
-/**
- * Class adapter that can stub some or all of the methods of the class.
- */
-class TransformClassAdapter extends ClassVisitor {
-
- /** True if all methods should be stubbed, false if only native ones must be stubbed. */
- private final boolean mStubAll;
- /** True if the class is an interface. */
- private boolean mIsInterface;
- private final String mClassName;
- private final Log mLog;
- private final Set<String> mStubMethods;
- private Set<String> mDeleteReturns;
-
- /**
- * Creates a new class adapter that will stub some or all methods.
- * @param logger
- * @param stubMethods list of method signatures to always stub out
- * @param deleteReturns list of types that trigger the deletion of methods returning them.
- * @param className The name of the class being modified
- * @param cv The parent class writer visitor
- * @param stubNativesOnly True if only native methods should be stubbed. False if all
- * methods should be stubbed.
- * @param hasNative True if the method has natives, in which case its access should be
- * changed.
- */
- public TransformClassAdapter(Log logger, Set<String> stubMethods,
- Set<String> deleteReturns, String className, ClassVisitor cv,
- boolean stubNativesOnly, boolean hasNative) {
- super(Opcodes.ASM4, cv);
- mLog = logger;
- mStubMethods = stubMethods;
- mClassName = className;
- mStubAll = !stubNativesOnly;
- mIsInterface = false;
- mDeleteReturns = deleteReturns;
- }
-
- /* Visits the class header. */
- @Override
- public void visit(int version, int access, String name,
- String signature, String superName, String[] interfaces) {
-
- // This class might be being renamed.
- name = mClassName;
-
- // remove protected or private and set as public
- if (Main.sOptions.generatePublicAccess) {
- access = access & ~(Opcodes.ACC_PRIVATE | Opcodes.ACC_PROTECTED);
- access |= Opcodes.ACC_PUBLIC;
- }
- // remove final
- access = access & ~Opcodes.ACC_FINAL;
- // note: leave abstract classes as such
- // don't try to implement stub for interfaces
-
- mIsInterface = ((access & Opcodes.ACC_INTERFACE) != 0);
- super.visit(version, access, name, signature, superName, interfaces);
- }
-
- /* Visits the header of an inner class. */
- @Override
- public void visitInnerClass(String name, String outerName, String innerName, int access) {
- // remove protected or private and set as public
- if (Main.sOptions.generatePublicAccess) {
- access = access & ~(Opcodes.ACC_PRIVATE | Opcodes.ACC_PROTECTED);
- access |= Opcodes.ACC_PUBLIC;
- }
- // remove final
- access = access & ~Opcodes.ACC_FINAL;
- // note: leave abstract classes as such
- // don't try to implement stub for interfaces
-
- super.visitInnerClass(name, outerName, innerName, access);
- }
-
- /* Visits a method. */
- @Override
- public MethodVisitor visitMethod(int access, String name, String desc,
- String signature, String[] exceptions) {
-
- if (mDeleteReturns != null) {
- Type t = Type.getReturnType(desc);
- if (t.getSort() == Type.OBJECT) {
- String returnType = t.getInternalName();
- if (returnType != null) {
- if (mDeleteReturns.contains(returnType)) {
- return null;
- }
- }
- }
- }
-
- String methodSignature = mClassName.replace('/', '.') + "#" + name;
-
- // change access to public
- if (Main.sOptions.generatePublicAccess) {
- access &= ~(Opcodes.ACC_PROTECTED | Opcodes.ACC_PRIVATE);
- access |= Opcodes.ACC_PUBLIC;
- }
-
- // remove final
- access = access & ~Opcodes.ACC_FINAL;
-
- // stub this method if they are all to be stubbed or if it is a native method
- // and don't try to stub interfaces nor abstract non-native methods.
- if (!mIsInterface &&
- ((access & (Opcodes.ACC_ABSTRACT | Opcodes.ACC_NATIVE)) != Opcodes.ACC_ABSTRACT) &&
- (mStubAll ||
- (access & Opcodes.ACC_NATIVE) != 0) ||
- mStubMethods.contains(methodSignature)) {
-
- boolean isStatic = (access & Opcodes.ACC_STATIC) != 0;
- boolean isNative = (access & Opcodes.ACC_NATIVE) != 0;
-
- // remove abstract, final and native
- access = access & ~(Opcodes.ACC_ABSTRACT | Opcodes.ACC_FINAL | Opcodes.ACC_NATIVE);
-
- String invokeSignature = methodSignature + desc;
- mLog.debug(" Stub: %s (%s)", invokeSignature, isNative ? "native" : "");
-
- MethodVisitor mw = super.visitMethod(access, name, desc, signature, exceptions);
- return new StubMethodAdapter(mw, name, returnType(desc), invokeSignature,
- isStatic, isNative);
-
- } else {
- mLog.debug(" Keep: %s %s", name, desc);
- return super.visitMethod(access, name, desc, signature, exceptions);
- }
- }
-
- /* Visits a field. Makes it public. */
- @Override
- public FieldVisitor visitField(int access, String name, String desc, String signature,
- Object value) {
- // change access to public
- if (Main.sOptions.generatePublicAccess) {
- access &= ~(Opcodes.ACC_PROTECTED | Opcodes.ACC_PRIVATE);
- access |= Opcodes.ACC_PUBLIC;
- }
- return super.visitField(access, name, desc, signature, value);
- }
-
- /**
- * Extracts the return {@link Type} of this descriptor.
- */
- Type returnType(String desc) {
- if (desc != null) {
- try {
- return Type.getReturnType(desc);
- } catch (ArrayIndexOutOfBoundsException e) {
- // ignore, not a valid type.
- }
- }
- return null;
- }
-}
diff --git a/tools/layoutlib/create/src/com/android/tools/layoutlib/java/AutoCloseable.java b/tools/layoutlib/create/src/com/android/tools/layoutlib/java/AutoCloseable.java
deleted file mode 100644
index ed2c128..0000000
--- a/tools/layoutlib/create/src/com/android/tools/layoutlib/java/AutoCloseable.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright (C) 2013 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.tools.layoutlib.java;
-
-/**
- * Defines the same interface as the java.lang.AutoCloseable which was added in
- * Java 7. This hack makes it possible to run the Android code which uses Java 7
- * features (API 18 and beyond) to run on Java 6.
- * <p/>
- * Extracted from API level 18, file:
- * platform/libcore/luni/src/main/java/java/lang/AutoCloseable.java
- */
-public interface AutoCloseable {
- /**
- * Closes the object and release any system resources it holds.
- */
- void close() throws Exception; }
diff --git a/tools/layoutlib/create/src/com/android/tools/layoutlib/java/Charsets.java b/tools/layoutlib/create/src/com/android/tools/layoutlib/java/Charsets.java
deleted file mode 100644
index f73b06b..0000000
--- a/tools/layoutlib/create/src/com/android/tools/layoutlib/java/Charsets.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * Copyright (C) 2013 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.tools.layoutlib.java;
-
-import java.nio.CharBuffer;
-import java.nio.charset.Charset;
-
-/**
- * Defines the same class as the java.nio.charset.Charsets which was added in
- * Dalvik VM. This hack, provides a replacement for that class which can't be
- * loaded in the standard JVM since it's in the java package and standard JVM
- * doesn't have it. An implementation of the native methods in the original
- * class has been added.
- * <p/>
- * Extracted from API level 18, file:
- * platform/libcore/luni/src/main/java/java/nio/charset/Charsets
- */
-public final class Charsets {
- /**
- * A cheap and type-safe constant for the ISO-8859-1 Charset.
- */
- public static final Charset ISO_8859_1 = Charset.forName("ISO-8859-1");
-
- /**
- * A cheap and type-safe constant for the US-ASCII Charset.
- */
- public static final Charset US_ASCII = Charset.forName("US-ASCII");
-
- /**
- * A cheap and type-safe constant for the UTF-8 Charset.
- */
- public static final Charset UTF_8 = Charset.forName("UTF-8");
-
- /**
- * Returns a new byte array containing the bytes corresponding to the given characters,
- * encoded in US-ASCII. Unrepresentable characters are replaced by (byte) '?'.
- */
- public static byte[] toAsciiBytes(char[] chars, int offset, int length) {
- CharBuffer cb = CharBuffer.allocate(length);
- cb.put(chars, offset, length);
- return US_ASCII.encode(cb).array();
- }
-
- /**
- * Returns a new byte array containing the bytes corresponding to the given characters,
- * encoded in ISO-8859-1. Unrepresentable characters are replaced by (byte) '?'.
- */
- public static byte[] toIsoLatin1Bytes(char[] chars, int offset, int length) {
- CharBuffer cb = CharBuffer.allocate(length);
- cb.put(chars, offset, length);
- return ISO_8859_1.encode(cb).array();
- }
-
- /**
- * Returns a new byte array containing the bytes corresponding to the given characters,
- * encoded in UTF-8. All characters are representable in UTF-8.
- */
- public static byte[] toUtf8Bytes(char[] chars, int offset, int length) {
- CharBuffer cb = CharBuffer.allocate(length);
- cb.put(chars, offset, length);
- return UTF_8.encode(cb).array();
- }
-
- /**
- * Returns a new byte array containing the bytes corresponding to the given characters,
- * encoded in UTF-16BE. All characters are representable in UTF-16BE.
- */
- public static byte[] toBigEndianUtf16Bytes(char[] chars, int offset, int length) {
- byte[] result = new byte[length * 2];
- int end = offset + length;
- int resultIndex = 0;
- for (int i = offset; i < end; ++i) {
- char ch = chars[i];
- result[resultIndex++] = (byte) (ch >> 8);
- result[resultIndex++] = (byte) ch;
- }
- return result;
- }
-
- /**
- * Decodes the given US-ASCII bytes into the given char[]. Equivalent to but faster than:
- *
- * for (int i = 0; i < count; ++i) {
- * char ch = (char) (data[start++] & 0xff);
- * value[i] = (ch <= 0x7f) ? ch : REPLACEMENT_CHAR;
- * }
- */
- public static void asciiBytesToChars(byte[] bytes, int offset, int length, char[] chars) {
- if (bytes == null || chars == null) {
- return;
- }
- final char REPLACEMENT_CHAR = (char)0xffd;
- int start = offset;
- for (int i = 0; i < length; ++i) {
- char ch = (char) (bytes[start++] & 0xff);
- chars[i] = (ch <= 0x7f) ? ch : REPLACEMENT_CHAR;
- }
- }
-
- /**
- * Decodes the given ISO-8859-1 bytes into the given char[]. Equivalent to but faster than:
- *
- * for (int i = 0; i < count; ++i) {
- * value[i] = (char) (data[start++] & 0xff);
- * }
- */
- public static void isoLatin1BytesToChars(byte[] bytes, int offset, int length, char[] chars) {
- if (bytes == null || chars == null) {
- return;
- }
- int start = offset;
- for (int i = 0; i < length; ++i) {
- chars[i] = (char) (bytes[start++] & 0xff);
- }
- }
-
- private Charsets() {
- }
-}
diff --git a/tools/layoutlib/create/src/com/android/tools/layoutlib/java/IntegralToString.java b/tools/layoutlib/create/src/com/android/tools/layoutlib/java/IntegralToString.java
deleted file mode 100644
index e6dd00a..0000000
--- a/tools/layoutlib/create/src/com/android/tools/layoutlib/java/IntegralToString.java
+++ /dev/null
@@ -1,537 +0,0 @@
-/*
- * Copyright (C) 2013 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.tools.layoutlib.java;
-
-/**
- * Defines the same class as the java.lang.IntegralToString which was added in
- * Dalvik VM. This hack, provides a replacement for that class which can't be
- * loaded in the standard JVM since it's in the java package and standard JVM
- * doesn't have it. Since it's no longer in java.lang, access to package
- * private methods and classes has been replaced by the closes matching public
- * implementation.
- * <p/>
- * Extracted from API level 18, file:
- * platform/libcore/luni/src/main/java/java/lang/IntegralToString.java
- */
-public final class IntegralToString {
- /**
- * When appending to an AbstractStringBuilder, this thread-local char[] lets us avoid
- * allocation of a temporary array. (We can't write straight into the AbstractStringBuilder
- * because it's almost as expensive to work out the exact length of the result as it is to
- * do the formatting. We could try being conservative and "delete"-ing the unused space
- * afterwards, but then we'd need to duplicate convertInt and convertLong rather than share
- * the code.)
- */
- private static final ThreadLocal<char[]> BUFFER = new ThreadLocal<char[]>() {
- @Override protected char[] initialValue() {
- return new char[20]; // Maximum length of a base-10 long.
- }
- };
-
- /**
- * These tables are used to special-case toString computation for
- * small values. This serves three purposes: it reduces memory usage;
- * it increases performance for small values; and it decreases the
- * number of comparisons required to do the length computation.
- * Elements of this table are lazily initialized on first use.
- * No locking is necessary, i.e., we use the non-volatile, racy
- * single-check idiom.
- */
- private static final String[] SMALL_NONNEGATIVE_VALUES = new String[100];
- private static final String[] SMALL_NEGATIVE_VALUES = new String[100];
-
- /** TENS[i] contains the tens digit of the number i, 0 <= i <= 99. */
- private static final char[] TENS = {
- '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
- '1', '1', '1', '1', '1', '1', '1', '1', '1', '1',
- '2', '2', '2', '2', '2', '2', '2', '2', '2', '2',
- '3', '3', '3', '3', '3', '3', '3', '3', '3', '3',
- '4', '4', '4', '4', '4', '4', '4', '4', '4', '4',
- '5', '5', '5', '5', '5', '5', '5', '5', '5', '5',
- '6', '6', '6', '6', '6', '6', '6', '6', '6', '6',
- '7', '7', '7', '7', '7', '7', '7', '7', '7', '7',
- '8', '8', '8', '8', '8', '8', '8', '8', '8', '8',
- '9', '9', '9', '9', '9', '9', '9', '9', '9', '9'
- };
-
- /** Ones [i] contains the tens digit of the number i, 0 <= i <= 99. */
- private static final char[] ONES = {
- '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
- '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
- '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
- '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
- '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
- '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
- '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
- '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
- '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
- '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
- };
-
- /**
- * Table for MOD / DIV 10 computation described in Section 10-21
- * of Hank Warren's "Hacker's Delight" online addendum.
- * http://www.hackersdelight.org/divcMore.pdf
- */
- private static final char[] MOD_10_TABLE = {
- 0, 1, 2, 2, 3, 3, 4, 5, 5, 6, 7, 7, 8, 8, 9, 0
- };
-
- /**
- * The digits for every supported radix.
- */
- private static final char[] DIGITS = {
- '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
- 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
- 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
- 'u', 'v', 'w', 'x', 'y', 'z'
- };
-
- private static final char[] UPPER_CASE_DIGITS = {
- '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
- 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
- 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
- 'U', 'V', 'W', 'X', 'Y', 'Z'
- };
-
- private IntegralToString() {
- }
-
- /**
- * Equivalent to Integer.toString(i, radix).
- */
- public static String intToString(int i, int radix) {
- if (radix < Character.MIN_RADIX || radix > Character.MAX_RADIX) {
- radix = 10;
- }
- if (radix == 10) {
- return intToString(i);
- }
-
- /*
- * If i is positive, negate it. This is the opposite of what one might
- * expect. It is necessary because the range of the negative values is
- * strictly larger than that of the positive values: there is no
- * positive value corresponding to Integer.MIN_VALUE.
- */
- boolean negative = false;
- if (i < 0) {
- negative = true;
- } else {
- i = -i;
- }
-
- int bufLen = radix < 8 ? 33 : 12; // Max chars in result (conservative)
- char[] buf = new char[bufLen];
- int cursor = bufLen;
-
- do {
- int q = i / radix;
- buf[--cursor] = DIGITS[radix * q - i];
- i = q;
- } while (i != 0);
-
- if (negative) {
- buf[--cursor] = '-';
- }
-
- return new String(buf, cursor, bufLen - cursor);
- }
-
- /**
- * Equivalent to Integer.toString(i).
- */
- public static String intToString(int i) {
- return convertInt(null, i);
- }
-
- /**
- * Equivalent to sb.append(Integer.toString(i)).
- */
- public static void appendInt(StringBuilder sb, int i) {
- convertInt(sb, i);
- }
-
- /**
- * Returns the string representation of i and leaves sb alone if sb is null.
- * Returns null and appends the string representation of i to sb if sb is non-null.
- */
- private static String convertInt(StringBuilder sb, int i) {
- boolean negative = false;
- String quickResult = null;
- if (i < 0) {
- negative = true;
- i = -i;
- if (i < 100) {
- if (i < 0) {
- // If -n is still negative, n is Integer.MIN_VALUE
- quickResult = "-2147483648";
- } else {
- quickResult = SMALL_NEGATIVE_VALUES[i];
- if (quickResult == null) {
- SMALL_NEGATIVE_VALUES[i] = quickResult =
- i < 10 ? stringOf('-', ONES[i]) : stringOf('-', TENS[i], ONES[i]);
- }
- }
- }
- } else {
- if (i < 100) {
- quickResult = SMALL_NONNEGATIVE_VALUES[i];
- if (quickResult == null) {
- SMALL_NONNEGATIVE_VALUES[i] = quickResult =
- i < 10 ? stringOf(ONES[i]) : stringOf(TENS[i], ONES[i]);
- }
- }
- }
- if (quickResult != null) {
- if (sb != null) {
- sb.append(quickResult);
- return null;
- }
- return quickResult;
- }
-
- int bufLen = 11; // Max number of chars in result
- char[] buf = (sb != null) ? BUFFER.get() : new char[bufLen];
- int cursor = bufLen;
-
- // Calculate digits two-at-a-time till remaining digits fit in 16 bits
- while (i >= (1 << 16)) {
- // Compute q = n/100 and r = n % 100 as per "Hacker's Delight" 10-8
- int q = (int) ((0x51EB851FL * i) >>> 37);
- int r = i - 100*q;
- buf[--cursor] = ONES[r];
- buf[--cursor] = TENS[r];
- i = q;
- }
-
- // Calculate remaining digits one-at-a-time for performance
- while (i != 0) {
- // Compute q = n/10 and r = n % 10 as per "Hacker's Delight" 10-8
- int q = (0xCCCD * i) >>> 19;
- int r = i - 10*q;
- buf[--cursor] = DIGITS[r];
- i = q;
- }
-
- if (negative) {
- buf[--cursor] = '-';
- }
-
- if (sb != null) {
- sb.append(buf, cursor, bufLen - cursor);
- return null;
- } else {
- return new String(buf, cursor, bufLen - cursor);
- }
- }
-
- /**
- * Equivalent to Long.toString(v, radix).
- */
- public static String longToString(long v, int radix) {
- int i = (int) v;
- if (i == v) {
- return intToString(i, radix);
- }
-
- if (radix < Character.MIN_RADIX || radix > Character.MAX_RADIX) {
- radix = 10;
- }
- if (radix == 10) {
- return longToString(v);
- }
-
- /*
- * If v is positive, negate it. This is the opposite of what one might
- * expect. It is necessary because the range of the negative values is
- * strictly larger than that of the positive values: there is no
- * positive value corresponding to Integer.MIN_VALUE.
- */
- boolean negative = false;
- if (v < 0) {
- negative = true;
- } else {
- v = -v;
- }
-
- int bufLen = radix < 8 ? 65 : 23; // Max chars in result (conservative)
- char[] buf = new char[bufLen];
- int cursor = bufLen;
-
- do {
- long q = v / radix;
- buf[--cursor] = DIGITS[(int) (radix * q - v)];
- v = q;
- } while (v != 0);
-
- if (negative) {
- buf[--cursor] = '-';
- }
-
- return new String(buf, cursor, bufLen - cursor);
- }
-
- /**
- * Equivalent to Long.toString(l).
- */
- public static String longToString(long l) {
- return convertLong(null, l);
- }
-
- /**
- * Equivalent to sb.append(Long.toString(l)).
- */
- public static void appendLong(StringBuilder sb, long l) {
- convertLong(sb, l);
- }
-
- /**
- * Returns the string representation of n and leaves sb alone if sb is null.
- * Returns null and appends the string representation of n to sb if sb is non-null.
- */
- private static String convertLong(StringBuilder sb, long n) {
- int i = (int) n;
- if (i == n) {
- return convertInt(sb, i);
- }
-
- boolean negative = (n < 0);
- if (negative) {
- n = -n;
- if (n < 0) {
- // If -n is still negative, n is Long.MIN_VALUE
- String quickResult = "-9223372036854775808";
- if (sb != null) {
- sb.append(quickResult);
- return null;
- }
- return quickResult;
- }
- }
-
- int bufLen = 20; // Maximum number of chars in result
- char[] buf = (sb != null) ? BUFFER.get() : new char[bufLen];
-
- int low = (int) (n % 1000000000); // Extract low-order 9 digits
- int cursor = intIntoCharArray(buf, bufLen, low);
-
- // Zero-pad Low order part to 9 digits
- while (cursor != (bufLen - 9)) {
- buf[--cursor] = '0';
- }
-
- /*
- * The remaining digits are (n - low) / 1,000,000,000. This
- * "exact division" is done as per the online addendum to Hank Warren's
- * "Hacker's Delight" 10-20, http://www.hackersdelight.org/divcMore.pdf
- */
- n = ((n - low) >>> 9) * 0x8E47CE423A2E9C6DL;
-
- /*
- * If the remaining digits fit in an int, emit them using a
- * single call to intIntoCharArray. Otherwise, strip off the
- * low-order digit, put it in buf, and then call intIntoCharArray
- * on the remaining digits (which now fit in an int).
- */
- if ((n & (-1L << 32)) == 0) {
- cursor = intIntoCharArray(buf, cursor, (int) n);
- } else {
- /*
- * Set midDigit to n % 10
- */
- int lo32 = (int) n;
- int hi32 = (int) (n >>> 32);
-
- // midDigit = ((unsigned) low32) % 10, per "Hacker's Delight" 10-21
- int midDigit = MOD_10_TABLE[(0x19999999 * lo32 + (lo32 >>> 1) + (lo32 >>> 3)) >>> 28];
-
- // Adjust midDigit for hi32. (assert hi32 == 1 || hi32 == 2)
- midDigit -= hi32 << 2; // 1L << 32 == -4 MOD 10
- if (midDigit < 0) {
- midDigit += 10;
- }
- buf[--cursor] = DIGITS[midDigit];
-
- // Exact division as per Warren 10-20
- int rest = ((int) ((n - midDigit) >>> 1)) * 0xCCCCCCCD;
- cursor = intIntoCharArray(buf, cursor, rest);
- }
-
- if (negative) {
- buf[--cursor] = '-';
- }
- if (sb != null) {
- sb.append(buf, cursor, bufLen - cursor);
- return null;
- } else {
- return new String(buf, cursor, bufLen - cursor);
- }
- }
-
- /**
- * Inserts the unsigned decimal integer represented by n into the specified
- * character array starting at position cursor. Returns the index after
- * the last character inserted (i.e., the value to pass in as cursor the
- * next time this method is called). Note that n is interpreted as a large
- * positive integer (not a negative integer) if its sign bit is set.
- */
- private static int intIntoCharArray(char[] buf, int cursor, int n) {
- // Calculate digits two-at-a-time till remaining digits fit in 16 bits
- while ((n & 0xffff0000) != 0) {
- /*
- * Compute q = n/100 and r = n % 100 as per "Hacker's Delight" 10-8.
- * This computation is slightly different from the corresponding
- * computation in intToString: the shifts before and after
- * multiply can't be combined, as that would yield the wrong result
- * if n's sign bit were set.
- */
- int q = (int) ((0x51EB851FL * (n >>> 2)) >>> 35);
- int r = n - 100*q;
- buf[--cursor] = ONES[r];
- buf[--cursor] = TENS[r];
- n = q;
- }
-
- // Calculate remaining digits one-at-a-time for performance
- while (n != 0) {
- // Compute q = n / 10 and r = n % 10 as per "Hacker's Delight" 10-8
- int q = (0xCCCD * n) >>> 19;
- int r = n - 10*q;
- buf[--cursor] = DIGITS[r];
- n = q;
- }
- return cursor;
- }
-
- public static String intToBinaryString(int i) {
- int bufLen = 32; // Max number of binary digits in an int
- char[] buf = new char[bufLen];
- int cursor = bufLen;
-
- do {
- buf[--cursor] = DIGITS[i & 1];
- } while ((i >>>= 1) != 0);
-
- return new String(buf, cursor, bufLen - cursor);
- }
-
- public static String longToBinaryString(long v) {
- int i = (int) v;
- if (v >= 0 && i == v) {
- return intToBinaryString(i);
- }
-
- int bufLen = 64; // Max number of binary digits in a long
- char[] buf = new char[bufLen];
- int cursor = bufLen;
-
- do {
- buf[--cursor] = DIGITS[((int) v) & 1];
- } while ((v >>>= 1) != 0);
-
- return new String(buf, cursor, bufLen - cursor);
- }
-
- public static StringBuilder appendByteAsHex(StringBuilder sb, byte b, boolean upperCase) {
- char[] digits = upperCase ? UPPER_CASE_DIGITS : DIGITS;
- sb.append(digits[(b >> 4) & 0xf]);
- sb.append(digits[b & 0xf]);
- return sb;
- }
-
- public static String byteToHexString(byte b, boolean upperCase) {
- char[] digits = upperCase ? UPPER_CASE_DIGITS : DIGITS;
- char[] buf = new char[2]; // We always want two digits.
- buf[0] = digits[(b >> 4) & 0xf];
- buf[1] = digits[b & 0xf];
- return new String(buf, 0, 2);
- }
-
- public static String bytesToHexString(byte[] bytes, boolean upperCase) {
- char[] digits = upperCase ? UPPER_CASE_DIGITS : DIGITS;
- char[] buf = new char[bytes.length * 2];
- int c = 0;
- for (byte b : bytes) {
- buf[c++] = digits[(b >> 4) & 0xf];
- buf[c++] = digits[b & 0xf];
- }
- return new String(buf);
- }
-
- public static String intToHexString(int i, boolean upperCase, int minWidth) {
- int bufLen = 8; // Max number of hex digits in an int
- char[] buf = new char[bufLen];
- int cursor = bufLen;
-
- char[] digits = upperCase ? UPPER_CASE_DIGITS : DIGITS;
- do {
- buf[--cursor] = digits[i & 0xf];
- } while ((i >>>= 4) != 0 || (bufLen - cursor < minWidth));
-
- return new String(buf, cursor, bufLen - cursor);
- }
-
- public static String longToHexString(long v) {
- int i = (int) v;
- if (v >= 0 && i == v) {
- return intToHexString(i, false, 0);
- }
-
- int bufLen = 16; // Max number of hex digits in a long
- char[] buf = new char[bufLen];
- int cursor = bufLen;
-
- do {
- buf[--cursor] = DIGITS[((int) v) & 0xF];
- } while ((v >>>= 4) != 0);
-
- return new String(buf, cursor, bufLen - cursor);
- }
-
- public static String intToOctalString(int i) {
- int bufLen = 11; // Max number of octal digits in an int
- char[] buf = new char[bufLen];
- int cursor = bufLen;
-
- do {
- buf[--cursor] = DIGITS[i & 7];
- } while ((i >>>= 3) != 0);
-
- return new String(buf, cursor, bufLen - cursor);
- }
-
- public static String longToOctalString(long v) {
- int i = (int) v;
- if (v >= 0 && i == v) {
- return intToOctalString(i);
- }
- int bufLen = 22; // Max number of octal digits in a long
- char[] buf = new char[bufLen];
- int cursor = bufLen;
-
- do {
- buf[--cursor] = DIGITS[((int) v) & 7];
- } while ((v >>>= 3) != 0);
-
- return new String(buf, cursor, bufLen - cursor);
- }
-
- private static String stringOf(char... args) {
- return new String(args, 0, args.length);
- }
-}
diff --git a/tools/layoutlib/create/src/com/android/tools/layoutlib/java/Objects.java b/tools/layoutlib/create/src/com/android/tools/layoutlib/java/Objects.java
deleted file mode 100644
index eb1ef72..0000000
--- a/tools/layoutlib/create/src/com/android/tools/layoutlib/java/Objects.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * Copyright (C) 2013 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.tools.layoutlib.java;
-
-import java.util.Arrays;
-import java.util.Comparator;
-
-/**
- * Defines the same class as the java.util.Objects which is added in Java 7.
- * This hack makes it possible to run the Android code which uses Java 7 features
- * (API 18 and beyond) to run on Java 6.
- * <p/>
- * Extracted from API level 19, file:
- * platform/libcore/luni/src/main/java/java/util/Objects.java
- */
-public final class Objects {
- private Objects() {}
-
- /**
- * Returns 0 if {@code a == b}, or {@code c.compare(a, b)} otherwise.
- * That is, this makes {@code c} null-safe.
- */
- public static <T> int compare(T a, T b, Comparator<? super T> c) {
- if (a == b) {
- return 0;
- }
- return c.compare(a, b);
- }
-
- /**
- * Returns true if both arguments are null,
- * the result of {@link Arrays#equals} if both arguments are primitive arrays,
- * the result of {@link Arrays#deepEquals} if both arguments are arrays of reference types,
- * and the result of {@link #equals} otherwise.
- */
- public static boolean deepEquals(Object a, Object b) {
- if (a == null || b == null) {
- return a == b;
- } else if (a instanceof Object[] && b instanceof Object[]) {
- return Arrays.deepEquals((Object[]) a, (Object[]) b);
- } else if (a instanceof boolean[] && b instanceof boolean[]) {
- return Arrays.equals((boolean[]) a, (boolean[]) b);
- } else if (a instanceof byte[] && b instanceof byte[]) {
- return Arrays.equals((byte[]) a, (byte[]) b);
- } else if (a instanceof char[] && b instanceof char[]) {
- return Arrays.equals((char[]) a, (char[]) b);
- } else if (a instanceof double[] && b instanceof double[]) {
- return Arrays.equals((double[]) a, (double[]) b);
- } else if (a instanceof float[] && b instanceof float[]) {
- return Arrays.equals((float[]) a, (float[]) b);
- } else if (a instanceof int[] && b instanceof int[]) {
- return Arrays.equals((int[]) a, (int[]) b);
- } else if (a instanceof long[] && b instanceof long[]) {
- return Arrays.equals((long[]) a, (long[]) b);
- } else if (a instanceof short[] && b instanceof short[]) {
- return Arrays.equals((short[]) a, (short[]) b);
- }
- return a.equals(b);
- }
-
- /**
- * Null-safe equivalent of {@code a.equals(b)}.
- */
- public static boolean equals(Object a, Object b) {
- return (a == null) ? (b == null) : a.equals(b);
- }
-
- /**
- * Convenience wrapper for {@link Arrays#hashCode}, adding varargs.
- * This can be used to compute a hash code for an object's fields as follows:
- * {@code Objects.hash(a, b, c)}.
- */
- public static int hash(Object... values) {
- return Arrays.hashCode(values);
- }
-
- /**
- * Returns 0 for null or {@code o.hashCode()}.
- */
- public static int hashCode(Object o) {
- return (o == null) ? 0 : o.hashCode();
- }
-
- /**
- * Returns {@code o} if non-null, or throws {@code NullPointerException}.
- */
- public static <T> T requireNonNull(T o) {
- if (o == null) {
- throw new NullPointerException();
- }
- return o;
- }
-
- /**
- * Returns {@code o} if non-null, or throws {@code NullPointerException}
- * with the given detail message.
- */
- public static <T> T requireNonNull(T o, String message) {
- if (o == null) {
- throw new NullPointerException(message);
- }
- return o;
- }
-
- /**
- * Returns "null" for null or {@code o.toString()}.
- */
- public static String toString(Object o) {
- return (o == null) ? "null" : o.toString();
- }
-
- /**
- * Returns {@code nullString} for null or {@code o.toString()}.
- */
- public static String toString(Object o, String nullString) {
- return (o == null) ? nullString : o.toString();
- }
-} \ No newline at end of file
diff --git a/tools/layoutlib/create/src/com/android/tools/layoutlib/java/UnsafeByteSequence.java b/tools/layoutlib/create/src/com/android/tools/layoutlib/java/UnsafeByteSequence.java
deleted file mode 100644
index 0e09080..0000000
--- a/tools/layoutlib/create/src/com/android/tools/layoutlib/java/UnsafeByteSequence.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Copyright (C) 2013 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.tools.layoutlib.java;
-
-import java.nio.charset.Charset;
-
-/**
- * Defines the same class as the java.lang.UnsafeByteSequence which was added in
- * Dalvik VM. This hack, provides a replacement for that class which can't be
- * loaded in the standard JVM since it's in the java package and standard JVM
- * doesn't have it.
- * <p/>
- * Extracted from API level 18, file:
- * platform/libcore/luni/src/main/java/java/lang/UnsafeByteSequence.java
- */
-public class UnsafeByteSequence {
- private byte[] bytes;
- private int count;
-
- public UnsafeByteSequence(int initialCapacity) {
- this.bytes = new byte[initialCapacity];
- }
-
- public int size() {
- return count;
- }
-
- /**
- * Moves the write pointer back to the beginning of the sequence,
- * but without resizing or reallocating the buffer.
- */
- public void rewind() {
- count = 0;
- }
-
- public void write(byte[] buffer, int offset, int length) {
- if (count + length >= bytes.length) {
- byte[] newBytes = new byte[(count + length) * 2];
- System.arraycopy(bytes, 0, newBytes, 0, count);
- bytes = newBytes;
- }
- System.arraycopy(buffer, offset, bytes, count, length);
- count += length;
- }
-
- public void write(int b) {
- if (count == bytes.length) {
- byte[] newBytes = new byte[count * 2];
- System.arraycopy(bytes, 0, newBytes, 0, count);
- bytes = newBytes;
- }
- bytes[count++] = (byte) b;
- }
-
- public byte[] toByteArray() {
- if (count == bytes.length) {
- return bytes;
- }
- byte[] result = new byte[count];
- System.arraycopy(bytes, 0, result, 0, count);
- return result;
- }
-
- public String toString(Charset cs) {
- return new String(bytes, 0, count, cs);
- }
-}
diff --git a/tools/layoutlib/create/tests/com/android/tools/layoutlib/create/AsmAnalyzerTest.java b/tools/layoutlib/create/tests/com/android/tools/layoutlib/create/AsmAnalyzerTest.java
deleted file mode 100644
index 005fc9d..0000000
--- a/tools/layoutlib/create/tests/com/android/tools/layoutlib/create/AsmAnalyzerTest.java
+++ /dev/null
@@ -1,236 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-package com.android.tools.layoutlib.create;
-
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-
-import com.android.tools.layoutlib.create.AsmAnalyzer.DependencyVisitor;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.objectweb.asm.ClassReader;
-
-import java.io.IOException;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-import java.util.TreeMap;
-
-/**
- * Unit tests for some methods of {@link AsmAnalyzer}.
- */
-public class AsmAnalyzerTest {
-
- private MockLog mLog;
- private ArrayList<String> mOsJarPath;
- private AsmAnalyzer mAa;
-
- @Before
- public void setUp() throws Exception {
- mLog = new MockLog();
- URL url = this.getClass().getClassLoader().getResource("data/mock_android.jar");
-
- mOsJarPath = new ArrayList<String>();
- mOsJarPath.add(url.getFile());
-
- Set<String> excludeClasses = new HashSet<String>(1);
- excludeClasses.add("java.lang.JavaClass");
- mAa = new AsmAnalyzer(mLog, mOsJarPath, null /* gen */,
- null /* deriveFrom */, null /* includeGlobs */, excludeClasses);
- }
-
- @After
- public void tearDown() throws Exception {
- }
-
- @Test
- public void testParseZip() throws IOException {
- Map<String, ClassReader> map = mAa.parseZip(mOsJarPath);
-
- assertArrayEquals(new String[] {
- "java.lang.JavaClass",
- "mock_android.dummy.InnerTest",
- "mock_android.dummy.InnerTest$DerivingClass",
- "mock_android.dummy.InnerTest$MyGenerics1",
- "mock_android.dummy.InnerTest$MyIntEnum",
- "mock_android.dummy.InnerTest$MyStaticInnerClass",
- "mock_android.dummy.InnerTest$NotStaticInner1",
- "mock_android.dummy.InnerTest$NotStaticInner2",
- "mock_android.view.View",
- "mock_android.view.ViewGroup",
- "mock_android.view.ViewGroup$LayoutParams",
- "mock_android.view.ViewGroup$MarginLayoutParams",
- "mock_android.widget.LinearLayout",
- "mock_android.widget.LinearLayout$LayoutParams",
- "mock_android.widget.TableLayout",
- "mock_android.widget.TableLayout$LayoutParams"
- },
- map.keySet().toArray());
- }
-
- @Test
- public void testFindClass() throws IOException, LogAbortException {
- Map<String, ClassReader> zipClasses = mAa.parseZip(mOsJarPath);
- TreeMap<String, ClassReader> found = new TreeMap<String, ClassReader>();
-
- ClassReader cr = mAa.findClass("mock_android.view.ViewGroup$LayoutParams",
- zipClasses, found);
-
- assertNotNull(cr);
- assertEquals("mock_android/view/ViewGroup$LayoutParams", cr.getClassName());
- assertArrayEquals(new String[] { "mock_android.view.ViewGroup$LayoutParams" },
- found.keySet().toArray());
- assertArrayEquals(new ClassReader[] { cr }, found.values().toArray());
- }
-
- @Test
- public void testFindGlobs() throws IOException, LogAbortException {
- Map<String, ClassReader> zipClasses = mAa.parseZip(mOsJarPath);
- TreeMap<String, ClassReader> found = new TreeMap<String, ClassReader>();
-
- // this matches classes, a package match returns nothing
- found.clear();
- mAa.findGlobs("mock_android.view", zipClasses, found);
-
- assertArrayEquals(new String[] { },
- found.keySet().toArray());
-
- // a complex glob search. * is a search pattern that matches names, not dots
- mAa.findGlobs("mock_android.*.*Group$*Layout*", zipClasses, found);
-
- assertArrayEquals(new String[] {
- "mock_android.view.ViewGroup$LayoutParams",
- "mock_android.view.ViewGroup$MarginLayoutParams"
- },
- found.keySet().toArray());
-
- // a complex glob search. ** is a search pattern that matches names including dots
- mAa.findGlobs("mock_android.**Group*", zipClasses, found);
-
- assertArrayEquals(new String[] {
- "mock_android.view.ViewGroup",
- "mock_android.view.ViewGroup$LayoutParams",
- "mock_android.view.ViewGroup$MarginLayoutParams"
- },
- found.keySet().toArray());
-
- // matches a single class
- found.clear();
- mAa.findGlobs("mock_android.view.View", zipClasses, found);
-
- assertArrayEquals(new String[] {
- "mock_android.view.View"
- },
- found.keySet().toArray());
-
- // matches everyting inside the given package but not sub-packages
- found.clear();
- mAa.findGlobs("mock_android.view.*", zipClasses, found);
-
- assertArrayEquals(new String[] {
- "mock_android.view.View",
- "mock_android.view.ViewGroup",
- "mock_android.view.ViewGroup$LayoutParams",
- "mock_android.view.ViewGroup$MarginLayoutParams"
- },
- found.keySet().toArray());
-
- for (String key : found.keySet()) {
- ClassReader value = found.get(key);
- assertNotNull("No value for " + key, value);
- assertEquals(key, AsmAnalyzer.classReaderToClassName(value));
- }
- }
-
- @Test
- public void testFindClassesDerivingFrom() throws LogAbortException, IOException {
- Map<String, ClassReader> zipClasses = mAa.parseZip(mOsJarPath);
- TreeMap<String, ClassReader> found = new TreeMap<String, ClassReader>();
-
- mAa.findClassesDerivingFrom("mock_android.view.View", zipClasses, found);
-
- assertArrayEquals(new String[] {
- "mock_android.view.View",
- "mock_android.view.ViewGroup",
- "mock_android.widget.LinearLayout",
- "mock_android.widget.TableLayout",
- },
- found.keySet().toArray());
-
- for (String key : found.keySet()) {
- ClassReader value = found.get(key);
- assertNotNull("No value for " + key, value);
- assertEquals(key, AsmAnalyzer.classReaderToClassName(value));
- }
- }
-
- @Test
- public void testDependencyVisitor() throws IOException, LogAbortException {
- Map<String, ClassReader> zipClasses = mAa.parseZip(mOsJarPath);
- TreeMap<String, ClassReader> keep = new TreeMap<String, ClassReader>();
- TreeMap<String, ClassReader> new_keep = new TreeMap<String, ClassReader>();
- TreeMap<String, ClassReader> in_deps = new TreeMap<String, ClassReader>();
- TreeMap<String, ClassReader> out_deps = new TreeMap<String, ClassReader>();
-
- ClassReader cr = mAa.findClass("mock_android.widget.TableLayout", zipClasses, keep);
- DependencyVisitor visitor = mAa.getVisitor(zipClasses, keep, new_keep, in_deps, out_deps);
-
- // get first level dependencies
- cr.accept(visitor, 0 /* flags */);
-
- assertArrayEquals(new String[] {
- "mock_android.view.ViewGroup",
- "mock_android.widget.TableLayout$LayoutParams",
- },
- out_deps.keySet().toArray());
-
- in_deps.putAll(out_deps);
- out_deps.clear();
-
- // get second level dependencies
- for (ClassReader cr2 : in_deps.values()) {
- cr2.accept(visitor, 0 /* flags */);
- }
-
- assertArrayEquals(new String[] {
- "mock_android.view.View",
- "mock_android.view.ViewGroup$LayoutParams",
- "mock_android.view.ViewGroup$MarginLayoutParams",
- },
- out_deps.keySet().toArray());
-
- in_deps.putAll(out_deps);
- out_deps.clear();
-
- // get third level dependencies (there are none)
- for (ClassReader cr2 : in_deps.values()) {
- cr2.accept(visitor, 0 /* flags */);
- }
- keep.putAll(new_keep);
-
- assertArrayEquals(new String[] { }, out_deps.keySet().toArray());
- assertArrayEquals(new String[] {
- "mock_android.widget.TableLayout",
- }, keep.keySet().toArray());
- }
-}
diff --git a/tools/layoutlib/create/tests/com/android/tools/layoutlib/create/AsmGeneratorTest.java b/tools/layoutlib/create/tests/com/android/tools/layoutlib/create/AsmGeneratorTest.java
deleted file mode 100644
index 8a27173..0000000
--- a/tools/layoutlib/create/tests/com/android/tools/layoutlib/create/AsmGeneratorTest.java
+++ /dev/null
@@ -1,330 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-package com.android.tools.layoutlib.create;
-
-
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertTrue;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.objectweb.asm.ClassReader;
-import org.objectweb.asm.ClassVisitor;
-import org.objectweb.asm.FieldVisitor;
-import org.objectweb.asm.MethodVisitor;
-import org.objectweb.asm.Opcodes;
-import org.objectweb.asm.Type;
-
-import java.io.File;
-import java.io.IOException;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Enumeration;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-import java.util.TreeMap;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipFile;
-
-/**
- * Unit tests for some methods of {@link AsmGenerator}.
- */
-public class AsmGeneratorTest {
-
- private MockLog mLog;
- private ArrayList<String> mOsJarPath;
- private String mOsDestJar;
- private File mTempFile;
-
- // ASM internal name for the the class in java package that should be refactored.
- private static final String JAVA_CLASS_NAME = "java/lang/JavaClass";
-
- @Before
- public void setUp() throws Exception {
- mLog = new MockLog();
- URL url = this.getClass().getClassLoader().getResource("data/mock_android.jar");
-
- mOsJarPath = new ArrayList<String>();
- mOsJarPath.add(url.getFile());
-
- mTempFile = File.createTempFile("mock", ".jar");
- mOsDestJar = mTempFile.getAbsolutePath();
- mTempFile.deleteOnExit();
- }
-
- @After
- public void tearDown() throws Exception {
- if (mTempFile != null) {
- mTempFile.delete();
- mTempFile = null;
- }
- }
-
- @Test
- public void testClassRenaming() throws IOException, LogAbortException {
-
- ICreateInfo ci = new ICreateInfo() {
- @Override
- public Class<?>[] getInjectedClasses() {
- // classes to inject in the final JAR
- return new Class<?>[0];
- }
-
- @Override
- public String[] getDelegateMethods() {
- return new String[0];
- }
-
- @Override
- public String[] getDelegateClassNatives() {
- return new String[0];
- }
-
- @Override
- public String[] getOverriddenMethods() {
- // methods to force override
- return new String[0];
- }
-
- @Override
- public String[] getRenamedClasses() {
- // classes to rename (so that we can replace them)
- return new String[] {
- "mock_android.view.View", "mock_android.view._Original_View",
- "not.an.actual.ClassName", "anoter.fake.NewClassName",
- };
- }
-
- @Override
- public String[] getJavaPkgClasses() {
- return new String[0];
- }
-
- @Override
- public String[] getDeleteReturns() {
- // methods deleted from their return type.
- return new String[0];
- }
- };
-
- AsmGenerator agen = new AsmGenerator(mLog, mOsDestJar, ci);
-
- AsmAnalyzer aa = new AsmAnalyzer(mLog, mOsJarPath, agen,
- null, // derived from
- new String[] { // include classes
- "**"
- },
- new HashSet<String>(0) /* excluded classes */);
- aa.analyze();
- agen.generate();
-
- Set<String> notRenamed = agen.getClassesNotRenamed();
- assertArrayEquals(new String[] { "not/an/actual/ClassName" }, notRenamed.toArray());
-
- }
-
- @Test
- public void testClassRefactoring() throws IOException, LogAbortException {
- ICreateInfo ci = new ICreateInfo() {
- @Override
- public Class<?>[] getInjectedClasses() {
- // classes to inject in the final JAR
- return new Class<?>[] {
- com.android.tools.layoutlib.create.dataclass.JavaClass.class
- };
- }
-
- @Override
- public String[] getDelegateMethods() {
- return new String[0];
- }
-
- @Override
- public String[] getDelegateClassNatives() {
- return new String[0];
- }
-
- @Override
- public String[] getOverriddenMethods() {
- // methods to force override
- return new String[0];
- }
-
- @Override
- public String[] getRenamedClasses() {
- // classes to rename (so that we can replace them)
- return new String[0];
- }
-
- @Override
- public String[] getJavaPkgClasses() {
- // classes to refactor (so that we can replace them)
- return new String[] {
- "java.lang.JavaClass", "com.android.tools.layoutlib.create.dataclass.JavaClass",
- };
- }
-
- @Override
- public String[] getDeleteReturns() {
- // methods deleted from their return type.
- return new String[0];
- }
- };
-
- AsmGenerator agen = new AsmGenerator(mLog, mOsDestJar, ci);
-
- AsmAnalyzer aa = new AsmAnalyzer(mLog, mOsJarPath, agen,
- null, // derived from
- new String[] { // include classes
- "**"
- },
- new HashSet<String>(1));
- aa.analyze();
- agen.generate();
- Map<String, ClassReader> output = parseZip(mOsDestJar);
- boolean injectedClassFound = false;
- for (ClassReader cr: output.values()) {
- TestClassVisitor cv = new TestClassVisitor();
- cr.accept(cv, 0);
- injectedClassFound |= cv.mInjectedClassFound;
- }
- assertTrue(injectedClassFound);
- }
-
- private Map<String,ClassReader> parseZip(String jarPath) throws IOException {
- TreeMap<String, ClassReader> classes = new TreeMap<String, ClassReader>();
-
- ZipFile zip = new ZipFile(jarPath);
- Enumeration<? extends ZipEntry> entries = zip.entries();
- ZipEntry entry;
- while (entries.hasMoreElements()) {
- entry = entries.nextElement();
- if (entry.getName().endsWith(".class")) {
- ClassReader cr = new ClassReader(zip.getInputStream(entry));
- String className = classReaderToClassName(cr);
- classes.put(className, cr);
- }
- }
-
- return classes;
- }
-
- private String classReaderToClassName(ClassReader classReader) {
- if (classReader == null) {
- return null;
- } else {
- return classReader.getClassName().replace('/', '.');
- }
- }
-
- private class TestClassVisitor extends ClassVisitor {
-
- boolean mInjectedClassFound = false;
-
- TestClassVisitor() {
- super(Opcodes.ASM4);
- }
-
- @Override
- public void visit(int version, int access, String name, String signature,
- String superName, String[] interfaces) {
- assertTrue(!getBase(name).equals(JAVA_CLASS_NAME));
- if (name.equals("com/android/tools/layoutlib/create/dataclass/JavaClass")) {
- mInjectedClassFound = true;
- }
- super.visit(version, access, name, signature, superName, interfaces);
- }
-
- @Override
- public FieldVisitor visitField(int access, String name, String desc,
- String signature, Object value) {
- assertTrue(testType(Type.getType(desc)));
- return super.visitField(access, name, desc, signature, value);
- }
-
- @SuppressWarnings("hiding")
- @Override
- public MethodVisitor visitMethod(int access, String name, String desc,
- String signature, String[] exceptions) {
- MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions);
- return new MethodVisitor(Opcodes.ASM4, mv) {
-
- @Override
- public void visitFieldInsn(int opcode, String owner, String name,
- String desc) {
- assertTrue(!getBase(owner).equals(JAVA_CLASS_NAME));
- assertTrue(testType(Type.getType(desc)));
- super.visitFieldInsn(opcode, owner, name, desc);
- }
-
- @Override
- public void visitLdcInsn(Object cst) {
- if (cst instanceof Type) {
- assertTrue(testType((Type)cst));
- }
- super.visitLdcInsn(cst);
- }
-
- @Override
- public void visitTypeInsn(int opcode, String type) {
- assertTrue(!getBase(type).equals(JAVA_CLASS_NAME));
- super.visitTypeInsn(opcode, type);
- }
-
- @Override
- public void visitMethodInsn(int opcode, String owner, String name,
- String desc) {
- assertTrue(!getBase(owner).equals(JAVA_CLASS_NAME));
- assertTrue(testType(Type.getType(desc)));
- super.visitMethodInsn(opcode, owner, name, desc);
- }
-
- };
- }
-
- private boolean testType(Type type) {
- int sort = type.getSort();
- if (sort == Type.OBJECT) {
- assertTrue(!getBase(type.getInternalName()).equals(JAVA_CLASS_NAME));
- } else if (sort == Type.ARRAY) {
- assertTrue(!getBase(type.getElementType().getInternalName())
- .equals(JAVA_CLASS_NAME));
- } else if (sort == Type.METHOD) {
- boolean r = true;
- for (Type t : type.getArgumentTypes()) {
- r &= testType(t);
- }
- return r & testType(type.getReturnType());
- }
- return true;
- }
-
- private String getBase(String className) {
- if (className == null) {
- return null;
- }
- int pos = className.indexOf('$');
- if (pos > 0) {
- return className.substring(0, pos);
- }
- return className;
- }
- }
-}
diff --git a/tools/layoutlib/create/tests/com/android/tools/layoutlib/create/ClassHasNativeVisitorTest.java b/tools/layoutlib/create/tests/com/android/tools/layoutlib/create/ClassHasNativeVisitorTest.java
deleted file mode 100644
index 0135c40..0000000
--- a/tools/layoutlib/create/tests/com/android/tools/layoutlib/create/ClassHasNativeVisitorTest.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.tools.layoutlib.create;
-
-import static org.junit.Assert.*;
-
-import org.junit.Test;
-import org.objectweb.asm.ClassReader;
-
-import java.io.IOException;
-import java.util.ArrayList;
-
-
-/**
- * Tests {@link ClassHasNativeVisitor}.
- */
-public class ClassHasNativeVisitorTest {
-
- @Test
- public void testHasNative() throws IOException {
- MockClassHasNativeVisitor cv = new MockClassHasNativeVisitor();
- String className =
- this.getClass().getCanonicalName() + "$" + ClassWithNative.class.getSimpleName();
- ClassReader cr = new ClassReader(className);
-
- cr.accept(cv, 0 /* flags */);
- assertArrayEquals(new String[] { "native_method" }, cv.getMethodsFound());
- assertTrue(cv.hasNativeMethods());
- }
-
- @Test
- public void testHasNoNative() throws IOException {
- MockClassHasNativeVisitor cv = new MockClassHasNativeVisitor();
- String className =
- this.getClass().getCanonicalName() + "$" + ClassWithoutNative.class.getSimpleName();
- ClassReader cr = new ClassReader(className);
-
- cr.accept(cv, 0 /* flags */);
- assertArrayEquals(new String[0], cv.getMethodsFound());
- assertFalse(cv.hasNativeMethods());
- }
-
- //-------
-
- /**
- * Overrides {@link ClassHasNativeVisitor} to collec the name of the native methods found.
- */
- private static class MockClassHasNativeVisitor extends ClassHasNativeVisitor {
- private ArrayList<String> mMethodsFound = new ArrayList<String>();
-
- public String[] getMethodsFound() {
- return mMethodsFound.toArray(new String[mMethodsFound.size()]);
- }
-
- @Override
- protected void setHasNativeMethods(boolean hasNativeMethods, String methodName) {
- if (hasNativeMethods) {
- mMethodsFound.add(methodName);
- }
- super.setHasNativeMethods(hasNativeMethods, methodName);
- }
- }
-
- /**
- * Dummy test class with a native method.
- */
- public static class ClassWithNative {
- public ClassWithNative() {
- }
-
- public void callTheNativeMethod() {
- native_method();
- }
-
- private native void native_method();
- }
-
- /**
- * Dummy test class with no native method.
- */
- public static class ClassWithoutNative {
- public ClassWithoutNative() {
- }
-
- public void someMethod() {
- }
- }
-}
diff --git a/tools/layoutlib/create/tests/com/android/tools/layoutlib/create/DelegateClassAdapterTest.java b/tools/layoutlib/create/tests/com/android/tools/layoutlib/create/DelegateClassAdapterTest.java
deleted file mode 100644
index 6e120ce..0000000
--- a/tools/layoutlib/create/tests/com/android/tools/layoutlib/create/DelegateClassAdapterTest.java
+++ /dev/null
@@ -1,463 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.tools.layoutlib.create;
-
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-import com.android.tools.layoutlib.create.dataclass.ClassWithNative;
-import com.android.tools.layoutlib.create.dataclass.OuterClass;
-import com.android.tools.layoutlib.create.dataclass.OuterClass.InnerClass;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.objectweb.asm.ClassReader;
-import org.objectweb.asm.ClassVisitor;
-import org.objectweb.asm.ClassWriter;
-
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.io.StringWriter;
-import java.lang.annotation.Annotation;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
-
-public class DelegateClassAdapterTest {
-
- private MockLog mLog;
-
- private static final String NATIVE_CLASS_NAME = ClassWithNative.class.getCanonicalName();
- private static final String OUTER_CLASS_NAME = OuterClass.class.getCanonicalName();
- private static final String INNER_CLASS_NAME = OuterClass.class.getCanonicalName() + "$" +
- InnerClass.class.getSimpleName();
-
- @Before
- public void setUp() throws Exception {
- mLog = new MockLog();
- mLog.setVerbose(true); // capture debug error too
- }
-
- /**
- * Tests that a class not being modified still works.
- */
- @SuppressWarnings("unchecked")
- @Test
- public void testNoOp() throws Throwable {
- // create an instance of the class that will be modified
- // (load the class in a distinct class loader so that we can trash its definition later)
- ClassLoader cl1 = new ClassLoader(this.getClass().getClassLoader()) { };
- Class<ClassWithNative> clazz1 = (Class<ClassWithNative>) cl1.loadClass(NATIVE_CLASS_NAME);
- ClassWithNative instance1 = clazz1.newInstance();
- assertEquals(42, instance1.add(20, 22));
- try {
- instance1.callNativeInstance(10, 3.1415, new Object[0] );
- fail("Test should have failed to invoke callTheNativeMethod [1]");
- } catch (UnsatisfiedLinkError e) {
- // This is expected to fail since the native method is not implemented.
- }
-
- // Now process it but tell the delegate to not modify any method
- ClassWriter cw = new ClassWriter(0 /*flags*/);
-
- HashSet<String> delegateMethods = new HashSet<String>();
- String internalClassName = NATIVE_CLASS_NAME.replace('.', '/');
- DelegateClassAdapter cv = new DelegateClassAdapter(
- mLog, cw, internalClassName, delegateMethods);
-
- ClassReader cr = new ClassReader(NATIVE_CLASS_NAME);
- cr.accept(cv, 0 /* flags */);
-
- // Load the generated class in a different class loader and try it again
-
- ClassLoader2 cl2 = null;
- try {
- cl2 = new ClassLoader2() {
- @Override
- public void testModifiedInstance() throws Exception {
- Class<?> clazz2 = loadClass(NATIVE_CLASS_NAME);
- Object i2 = clazz2.newInstance();
- assertNotNull(i2);
- assertEquals(42, callAdd(i2, 20, 22));
-
- try {
- callCallNativeInstance(i2, 10, 3.1415, new Object[0]);
- fail("Test should have failed to invoke callTheNativeMethod [2]");
- } catch (InvocationTargetException e) {
- // This is expected to fail since the native method has NOT been
- // overridden here.
- assertEquals(UnsatisfiedLinkError.class, e.getCause().getClass());
- }
-
- // Check that the native method does NOT have the new annotation
- Method[] m = clazz2.getDeclaredMethods();
- assertEquals("native_instance", m[2].getName());
- assertTrue(Modifier.isNative(m[2].getModifiers()));
- Annotation[] a = m[2].getAnnotations();
- assertEquals(0, a.length);
- }
- };
- cl2.add(NATIVE_CLASS_NAME, cw);
- cl2.testModifiedInstance();
- } catch (Throwable t) {
- throw dumpGeneratedClass(t, cl2);
- }
- }
-
- /**
- * {@link DelegateMethodAdapter2} does not support overriding constructors yet,
- * so this should fail with an {@link UnsupportedOperationException}.
- *
- * Although not tested here, the message of the exception should contain the
- * constructor signature.
- */
- @Test(expected=UnsupportedOperationException.class)
- public void testConstructorsNotSupported() throws IOException {
- ClassWriter cw = new ClassWriter(0 /*flags*/);
-
- String internalClassName = NATIVE_CLASS_NAME.replace('.', '/');
-
- HashSet<String> delegateMethods = new HashSet<String>();
- delegateMethods.add("<init>");
- DelegateClassAdapter cv = new DelegateClassAdapter(
- mLog, cw, internalClassName, delegateMethods);
-
- ClassReader cr = new ClassReader(NATIVE_CLASS_NAME);
- cr.accept(cv, 0 /* flags */);
- }
-
- @Test
- public void testDelegateNative() throws Throwable {
- ClassWriter cw = new ClassWriter(0 /*flags*/);
- String internalClassName = NATIVE_CLASS_NAME.replace('.', '/');
-
- HashSet<String> delegateMethods = new HashSet<String>();
- delegateMethods.add(DelegateClassAdapter.ALL_NATIVES);
- DelegateClassAdapter cv = new DelegateClassAdapter(
- mLog, cw, internalClassName, delegateMethods);
-
- ClassReader cr = new ClassReader(NATIVE_CLASS_NAME);
- cr.accept(cv, 0 /* flags */);
-
- // Load the generated class in a different class loader and try it
- ClassLoader2 cl2 = null;
- try {
- cl2 = new ClassLoader2() {
- @Override
- public void testModifiedInstance() throws Exception {
- Class<?> clazz2 = loadClass(NATIVE_CLASS_NAME);
- Object i2 = clazz2.newInstance();
- assertNotNull(i2);
-
- // Use reflection to access inner methods
- assertEquals(42, callAdd(i2, 20, 22));
-
- Object[] objResult = new Object[] { null };
- int result = callCallNativeInstance(i2, 10, 3.1415, objResult);
- assertEquals((int)(10 + 3.1415), result);
- assertSame(i2, objResult[0]);
-
- // Check that the native method now has the new annotation and is not native
- Method[] m = clazz2.getDeclaredMethods();
- assertEquals("native_instance", m[2].getName());
- assertFalse(Modifier.isNative(m[2].getModifiers()));
- Annotation[] a = m[2].getAnnotations();
- assertEquals("LayoutlibDelegate", a[0].annotationType().getSimpleName());
- }
- };
- cl2.add(NATIVE_CLASS_NAME, cw);
- cl2.testModifiedInstance();
- } catch (Throwable t) {
- throw dumpGeneratedClass(t, cl2);
- }
- }
-
- @Test
- public void testDelegateInner() throws Throwable {
- // We'll delegate the "get" method of both the inner and outer class.
- HashSet<String> delegateMethods = new HashSet<String>();
- delegateMethods.add("get");
- delegateMethods.add("privateMethod");
-
- // Generate the delegate for the outer class.
- ClassWriter cwOuter = new ClassWriter(0 /*flags*/);
- String outerClassName = OUTER_CLASS_NAME.replace('.', '/');
- DelegateClassAdapter cvOuter = new DelegateClassAdapter(
- mLog, cwOuter, outerClassName, delegateMethods);
- ClassReader cr = new ClassReader(OUTER_CLASS_NAME);
- cr.accept(cvOuter, 0 /* flags */);
-
- // Generate the delegate for the inner class.
- ClassWriter cwInner = new ClassWriter(0 /*flags*/);
- String innerClassName = INNER_CLASS_NAME.replace('.', '/');
- DelegateClassAdapter cvInner = new DelegateClassAdapter(
- mLog, cwInner, innerClassName, delegateMethods);
- cr = new ClassReader(INNER_CLASS_NAME);
- cr.accept(cvInner, 0 /* flags */);
-
- // Load the generated classes in a different class loader and try them
- ClassLoader2 cl2 = null;
- try {
- cl2 = new ClassLoader2() {
- @Override
- public void testModifiedInstance() throws Exception {
-
- // Check the outer class
- Class<?> outerClazz2 = loadClass(OUTER_CLASS_NAME);
- Object o2 = outerClazz2.newInstance();
- assertNotNull(o2);
-
- // The original Outer.get returns 1+10+20,
- // but the delegate makes it return 4+10+20
- assertEquals(4+10+20, callGet(o2, 10, 20));
- assertEquals(1+10+20, callGet_Original(o2, 10, 20));
-
- // The original Outer has a private method that is
- // delegated. We should be able to call both the delegate
- // and the original (which is now public).
- assertEquals("outerPrivateMethod",
- callMethod(o2, "privateMethod_Original", false /*makePublic*/));
-
- // The original method is private, so by default we can't access it
- boolean gotIllegalAccessException = false;
- try {
- callMethod(o2, "privateMethod", false /*makePublic*/);
- } catch(IllegalAccessException e) {
- gotIllegalAccessException = true;
- }
- assertTrue(gotIllegalAccessException);
- // Try again, but now making it accessible
- assertEquals("outerPrivate_Delegate",
- callMethod(o2, "privateMethod", true /*makePublic*/));
-
- // Check the inner class. Since it's not a static inner class, we need
- // to use the hidden constructor that takes the outer class as first parameter.
- Class<?> innerClazz2 = loadClass(INNER_CLASS_NAME);
- Constructor<?> innerCons = innerClazz2.getConstructor(
- new Class<?>[] { outerClazz2 });
- Object i2 = innerCons.newInstance(new Object[] { o2 });
- assertNotNull(i2);
-
- // The original Inner.get returns 3+10+20,
- // but the delegate makes it return 6+10+20
- assertEquals(6+10+20, callGet(i2, 10, 20));
- assertEquals(3+10+20, callGet_Original(i2, 10, 20));
- }
- };
- cl2.add(OUTER_CLASS_NAME, cwOuter.toByteArray());
- cl2.add(INNER_CLASS_NAME, cwInner.toByteArray());
- cl2.testModifiedInstance();
- } catch (Throwable t) {
- throw dumpGeneratedClass(t, cl2);
- }
- }
-
- //-------
-
- /**
- * A class loader than can define and instantiate our modified classes.
- * <p/>
- * The trick here is that this class loader will test our <em>modified</em> version
- * of the classes, the one with the delegate calls.
- * <p/>
- * Trying to do so in the original class loader generates all sort of link issues because
- * there are 2 different definitions of the same class name. This class loader will
- * define and load the class when requested by name and provide helpers to access the
- * instance methods via reflection.
- */
- private abstract class ClassLoader2 extends ClassLoader {
-
- private final Map<String, byte[]> mClassDefs = new HashMap<String, byte[]>();
-
- public ClassLoader2() {
- super(null);
- }
-
- public ClassLoader2 add(String className, byte[] definition) {
- mClassDefs.put(className, definition);
- return this;
- }
-
- public ClassLoader2 add(String className, ClassWriter rewrittenClass) {
- mClassDefs.put(className, rewrittenClass.toByteArray());
- return this;
- }
-
- private Set<Entry<String, byte[]>> getByteCode() {
- return mClassDefs.entrySet();
- }
-
- @SuppressWarnings("unused")
- @Override
- protected Class<?> findClass(String name) throws ClassNotFoundException {
- try {
- return super.findClass(name);
- } catch (ClassNotFoundException e) {
-
- byte[] def = mClassDefs.get(name);
- if (def != null) {
- // Load the modified ClassWithNative from its bytes representation.
- return defineClass(name, def, 0, def.length);
- }
-
- try {
- // Load everything else from the original definition into the new class loader.
- ClassReader cr = new ClassReader(name);
- ClassWriter cw = new ClassWriter(0);
- cr.accept(cw, 0);
- byte[] bytes = cw.toByteArray();
- return defineClass(name, bytes, 0, bytes.length);
-
- } catch (IOException ioe) {
- throw new RuntimeException(ioe);
- }
- }
- }
-
- /**
- * Accesses {@link OuterClass#get} or {@link InnerClass#get}via reflection.
- */
- public int callGet(Object instance, int a, long b) throws Exception {
- Method m = instance.getClass().getMethod("get",
- new Class<?>[] { int.class, long.class } );
-
- Object result = m.invoke(instance, new Object[] { a, b });
- return ((Integer) result).intValue();
- }
-
- /**
- * Accesses the "_Original" methods for {@link OuterClass#get}
- * or {@link InnerClass#get}via reflection.
- */
- public int callGet_Original(Object instance, int a, long b) throws Exception {
- Method m = instance.getClass().getMethod("get_Original",
- new Class<?>[] { int.class, long.class } );
-
- Object result = m.invoke(instance, new Object[] { a, b });
- return ((Integer) result).intValue();
- }
-
- /**
- * Accesses the any declared method that takes no parameter via reflection.
- */
- @SuppressWarnings("unchecked")
- public <T> T callMethod(Object instance, String methodName, boolean makePublic) throws Exception {
- Method m = instance.getClass().getDeclaredMethod(methodName, (Class<?>[])null);
-
- boolean wasAccessible = m.isAccessible();
- if (makePublic && !wasAccessible) {
- m.setAccessible(true);
- }
-
- Object result = m.invoke(instance, (Object[])null);
-
- if (makePublic && !wasAccessible) {
- m.setAccessible(false);
- }
-
- return (T) result;
- }
-
- /**
- * Accesses {@link ClassWithNative#add(int, int)} via reflection.
- */
- public int callAdd(Object instance, int a, int b) throws Exception {
- Method m = instance.getClass().getMethod("add",
- new Class<?>[] { int.class, int.class });
-
- Object result = m.invoke(instance, new Object[] { a, b });
- return ((Integer) result).intValue();
- }
-
- /**
- * Accesses {@link ClassWithNative#callNativeInstance(int, double, Object[])}
- * via reflection.
- */
- public int callCallNativeInstance(Object instance, int a, double d, Object[] o)
- throws Exception {
- Method m = instance.getClass().getMethod("callNativeInstance",
- new Class<?>[] { int.class, double.class, Object[].class });
-
- Object result = m.invoke(instance, new Object[] { a, d, o });
- return ((Integer) result).intValue();
- }
-
- public abstract void testModifiedInstance() throws Exception;
- }
-
- /**
- * For debugging, it's useful to dump the content of the generated classes
- * along with the exception that was generated.
- *
- * However to make it work you need to pull in the org.objectweb.asm.util.TraceClassVisitor
- * class and associated utilities which are found in the ASM source jar. Since we don't
- * want that dependency in the source code, we only put it manually for development and
- * access the TraceClassVisitor via reflection if present.
- *
- * @param t The exception thrown by {@link ClassLoader2#testModifiedInstance()}
- * @param cl2 The {@link ClassLoader2} instance with the generated bytecode.
- * @return Either original {@code t} or a new wrapper {@link Throwable}
- */
- private Throwable dumpGeneratedClass(Throwable t, ClassLoader2 cl2) {
- try {
- // For debugging, dump the bytecode of the class in case of unexpected error
- // if we can find the TraceClassVisitor class.
- Class<?> tcvClass = Class.forName("org.objectweb.asm.util.TraceClassVisitor");
-
- StringBuilder sb = new StringBuilder();
- sb.append('\n').append(t.getClass().getCanonicalName());
- if (t.getMessage() != null) {
- sb.append(": ").append(t.getMessage());
- }
-
- for (Entry<String, byte[]> entry : cl2.getByteCode()) {
- String className = entry.getKey();
- byte[] bytes = entry.getValue();
-
- StringWriter sw = new StringWriter();
- PrintWriter pw = new PrintWriter(sw);
- // next 2 lines do: TraceClassVisitor tcv = new TraceClassVisitor(pw);
- Constructor<?> cons = tcvClass.getConstructor(new Class<?>[] { pw.getClass() });
- Object tcv = cons.newInstance(new Object[] { pw });
- ClassReader cr2 = new ClassReader(bytes);
- cr2.accept((ClassVisitor) tcv, 0 /* flags */);
-
- sb.append("\nBytecode dump: <").append(className).append(">:\n")
- .append(sw.toString());
- }
-
- // Re-throw exception with new message
- RuntimeException ex = new RuntimeException(sb.toString(), t);
- return ex;
- } catch (Throwable ignore) {
- // In case of problem, just throw the original exception as-is.
- return t;
- }
- }
-
-}
diff --git a/tools/layoutlib/create/tests/com/android/tools/layoutlib/create/LogTest.java b/tools/layoutlib/create/tests/com/android/tools/layoutlib/create/LogTest.java
deleted file mode 100644
index 1a5f653..0000000
--- a/tools/layoutlib/create/tests/com/android/tools/layoutlib/create/LogTest.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.tools.layoutlib.create;
-
-import static org.junit.Assert.*;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-public class LogTest {
-
- private MockLog mLog;
-
- @Before
- public void setUp() throws Exception {
- mLog = new MockLog();
- }
-
- @After
- public void tearDown() throws Exception {
- // pass
- }
-
- @Test
- public void testDebug() {
- assertEquals("", mLog.getOut());
- assertEquals("", mLog.getErr());
-
- mLog.setVerbose(false);
- mLog.debug("Test %d", 42);
- assertEquals("", mLog.getOut());
-
- mLog.setVerbose(true);
- mLog.debug("Test %d", 42);
-
- assertEquals("Test 42\n", mLog.getOut());
- assertEquals("", mLog.getErr());
- }
-
- @Test
- public void testInfo() {
- assertEquals("", mLog.getOut());
- assertEquals("", mLog.getErr());
-
- mLog.info("Test %d", 43);
-
- assertEquals("Test 43\n", mLog.getOut());
- assertEquals("", mLog.getErr());
- }
-
- @Test
- public void testError() {
- assertEquals("", mLog.getOut());
- assertEquals("", mLog.getErr());
-
- mLog.error("Test %d", 44);
-
- assertEquals("", mLog.getOut());
- assertEquals("Test 44\n", mLog.getErr());
- }
-
- @Test
- public void testException() {
- assertEquals("", mLog.getOut());
- assertEquals("", mLog.getErr());
-
- Exception e = new Exception("My Exception");
- mLog.exception(e, "Test %d", 44);
-
- assertEquals("", mLog.getOut());
- assertTrue(mLog.getErr().startsWith("Test 44\njava.lang.Exception: My Exception"));
- }
-}
diff --git a/tools/layoutlib/create/tests/com/android/tools/layoutlib/create/MockLog.java b/tools/layoutlib/create/tests/com/android/tools/layoutlib/create/MockLog.java
deleted file mode 100644
index de750a3..0000000
--- a/tools/layoutlib/create/tests/com/android/tools/layoutlib/create/MockLog.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.tools.layoutlib.create;
-
-
-public class MockLog extends Log {
- StringBuilder mOut = new StringBuilder();
- StringBuilder mErr = new StringBuilder();
-
- public String getOut() {
- return mOut.toString();
- }
-
- public String getErr() {
- return mErr.toString();
- }
-
- @Override
- protected void outPrintln(String msg) {
- mOut.append(msg);
- mOut.append('\n');
- }
-
- @Override
- protected void errPrintln(String msg) {
- mErr.append(msg);
- mErr.append('\n');
- }
-}
diff --git a/tools/layoutlib/create/tests/com/android/tools/layoutlib/create/RenameClassAdapterTest.java b/tools/layoutlib/create/tests/com/android/tools/layoutlib/create/RenameClassAdapterTest.java
deleted file mode 100644
index 6211e73..0000000
--- a/tools/layoutlib/create/tests/com/android/tools/layoutlib/create/RenameClassAdapterTest.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-package com.android.tools.layoutlib.create;
-
-import static org.junit.Assert.*;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- *
- */
-public class RenameClassAdapterTest {
-
- private RenameClassAdapter mOuter;
- private RenameClassAdapter mInner;
-
- @Before
- public void setUp() throws Exception {
- mOuter = new RenameClassAdapter(null, // cv
- "com.pack.Old",
- "org.blah.New");
-
- mInner = new RenameClassAdapter(null, // cv
- "com.pack.Old$Inner",
- "org.blah.New$Inner");
- }
-
- @After
- public void tearDown() throws Exception {
- }
-
- /**
- * Renames a type, e.g. "Lcom.package.My;"
- * If the type doesn't need to be renamed, returns the input string as-is.
- */
- @Test
- public void testRenameTypeDesc() {
-
- // primitive types are left untouched
- assertEquals("I", mOuter.renameTypeDesc("I"));
- assertEquals("D", mOuter.renameTypeDesc("D"));
- assertEquals("V", mOuter.renameTypeDesc("V"));
-
- // object types that need no renaming are left untouched
- assertEquals("Lcom.package.MyClass;", mOuter.renameTypeDesc("Lcom.package.MyClass;"));
- assertEquals("Lcom.package.MyClass;", mInner.renameTypeDesc("Lcom.package.MyClass;"));
-
- // object types that match the requirements
- assertEquals("Lorg.blah.New;", mOuter.renameTypeDesc("Lcom.pack.Old;"));
- assertEquals("Lorg.blah.New$Inner;", mInner.renameTypeDesc("Lcom.pack.Old$Inner;"));
- // inner classes match the base type which is being renamed
- assertEquals("Lorg.blah.New$Other;", mOuter.renameTypeDesc("Lcom.pack.Old$Other;"));
- assertEquals("Lorg.blah.New$Other;", mInner.renameTypeDesc("Lcom.pack.Old$Other;"));
-
- // arrays
- assertEquals("[Lorg.blah.New;", mOuter.renameTypeDesc("[Lcom.pack.Old;"));
- assertEquals("[[Lorg.blah.New;", mOuter.renameTypeDesc("[[Lcom.pack.Old;"));
-
- assertEquals("[Lorg.blah.New;", mInner.renameTypeDesc("[Lcom.pack.Old;"));
- assertEquals("[[Lorg.blah.New;", mInner.renameTypeDesc("[[Lcom.pack.Old;"));
- }
-
- /**
- * Renames an object type, e.g. "Lcom.package.MyClass;" or an array type that has an
- * object element, e.g. "[Lcom.package.MyClass;"
- * If the type doesn't need to be renamed, returns the internal name of the input type.
- */
- @Test
- public void testRenameType() {
- // Skip. This is actually tested by testRenameTypeDesc above.
- }
-
- /**
- * Renames an internal type name, e.g. "com.package.MyClass".
- * If the type doesn't need to be renamed, returns the input string as-is.
- */
- @Test
- public void testRenameInternalType() {
- // an actual FQCN
- assertEquals("org.blah.New", mOuter.renameInternalType("com.pack.Old"));
- assertEquals("org.blah.New$Inner", mOuter.renameInternalType("com.pack.Old$Inner"));
-
- assertEquals("org.blah.New$Other", mInner.renameInternalType("com.pack.Old$Other"));
- assertEquals("org.blah.New$Other", mInner.renameInternalType("com.pack.Old$Other"));
- }
-
- /**
- * Renames a method descriptor, i.e. applies renameType to all arguments and to the
- * return value.
- */
- @Test
- public void testRenameMethodDesc() {
- assertEquals("(IDLorg.blah.New;[Lorg.blah.New$Inner;)Lorg.blah.New$Other;",
- mOuter.renameMethodDesc("(IDLcom.pack.Old;[Lcom.pack.Old$Inner;)Lcom.pack.Old$Other;"));
- }
-
-
-
-}
diff --git a/tools/layoutlib/create/tests/com/android/tools/layoutlib/create/dataclass/ClassWithNative.java b/tools/layoutlib/create/tests/com/android/tools/layoutlib/create/dataclass/ClassWithNative.java
deleted file mode 100644
index c314853..0000000
--- a/tools/layoutlib/create/tests/com/android/tools/layoutlib/create/dataclass/ClassWithNative.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.tools.layoutlib.create.dataclass;
-
-import com.android.tools.layoutlib.create.DelegateClassAdapterTest;
-
-/**
- * Dummy test class with a native method.
- * The native method is not defined and any attempt to invoke it will
- * throw an {@link UnsatisfiedLinkError}.
- *
- * Used by {@link DelegateClassAdapterTest}.
- */
-public class ClassWithNative {
- public ClassWithNative() {
- }
-
- public int add(int a, int b) {
- return a + b;
- }
-
- // Note: it's good to have a long or double for testing parameters since they take
- // 2 slots in the stack/locals maps.
-
- public int callNativeInstance(int a, double d, Object[] o) {
- return native_instance(a, d, o);
- }
-
- private native int native_instance(int a, double d, Object[] o);
-}
-
diff --git a/tools/layoutlib/create/tests/com/android/tools/layoutlib/create/dataclass/ClassWithNative_Delegate.java b/tools/layoutlib/create/tests/com/android/tools/layoutlib/create/dataclass/ClassWithNative_Delegate.java
deleted file mode 100644
index a3d4dc6..0000000
--- a/tools/layoutlib/create/tests/com/android/tools/layoutlib/create/dataclass/ClassWithNative_Delegate.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.tools.layoutlib.create.dataclass;
-
-import com.android.tools.layoutlib.create.DelegateClassAdapterTest;
-
-/**
- * The delegate that receives the call to {@link ClassWithNative_Delegate}'s overridden methods.
- *
- * Used by {@link DelegateClassAdapterTest}.
- */
-public class ClassWithNative_Delegate {
- public static int native_instance(ClassWithNative instance, int a, double d, Object[] o) {
- if (o != null && o.length > 0) {
- o[0] = instance;
- }
- return (int)(a + d);
- }
-}
-
diff --git a/tools/layoutlib/create/tests/com/android/tools/layoutlib/create/dataclass/JavaClass.java b/tools/layoutlib/create/tests/com/android/tools/layoutlib/create/dataclass/JavaClass.java
deleted file mode 100644
index 9b5a918..0000000
--- a/tools/layoutlib/create/tests/com/android/tools/layoutlib/create/dataclass/JavaClass.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- *
- * Licensed under the Eclipse Public License, Version 1.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.eclipse.org/org/documents/epl-v10.php
- *
- * 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.tools.layoutlib.create.dataclass;
-
-public final class JavaClass {
-
- public static final String test = "test";
-}
diff --git a/tools/layoutlib/create/tests/com/android/tools/layoutlib/create/dataclass/OuterClass.java b/tools/layoutlib/create/tests/com/android/tools/layoutlib/create/dataclass/OuterClass.java
deleted file mode 100644
index f083e76..0000000
--- a/tools/layoutlib/create/tests/com/android/tools/layoutlib/create/dataclass/OuterClass.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright (C) 2011 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.tools.layoutlib.create.dataclass;
-
-import com.android.tools.layoutlib.create.DelegateClassAdapterTest;
-
-/**
- * Test class with an inner class.
- *
- * Used by {@link DelegateClassAdapterTest}.
- */
-public class OuterClass {
- private int mOuterValue = 1;
- public OuterClass() {
- }
-
- // Outer.get returns 1 + a + b
- // Note: it's good to have a long or double for testing parameters since they take
- // 2 slots in the stack/locals maps.
- public int get(int a, long b) {
- return mOuterValue + a + (int) b;
- }
-
- public class InnerClass {
- public InnerClass() {
- }
-
- // Inner.get returns 2 + 1 + a + b
- public int get(int a, long b) {
- return 2 + mOuterValue + a + (int) b;
- }
- }
-
- @SuppressWarnings("unused")
- private String privateMethod() {
- return "outerPrivateMethod";
- }
-}
-
diff --git a/tools/layoutlib/create/tests/com/android/tools/layoutlib/create/dataclass/OuterClass_Delegate.java b/tools/layoutlib/create/tests/com/android/tools/layoutlib/create/dataclass/OuterClass_Delegate.java
deleted file mode 100644
index 774be8e..0000000
--- a/tools/layoutlib/create/tests/com/android/tools/layoutlib/create/dataclass/OuterClass_Delegate.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (C) 2011 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.tools.layoutlib.create.dataclass;
-
-import com.android.tools.layoutlib.create.DelegateClassAdapterTest;
-
-/**
- * Used by {@link DelegateClassAdapterTest}.
- */
-public class OuterClass_Delegate {
- // The delegate override of Outer.get returns 4 + a + b
- public static int get(OuterClass instance, int a, long b) {
- return 4 + a + (int) b;
- }
-
- public static String privateMethod(OuterClass instance) {
- return "outerPrivate_Delegate";
- }
-}
-
diff --git a/tools/layoutlib/create/tests/com/android/tools/layoutlib/create/dataclass/OuterClass_InnerClass_Delegate.java b/tools/layoutlib/create/tests/com/android/tools/layoutlib/create/dataclass/OuterClass_InnerClass_Delegate.java
deleted file mode 100644
index b472220..0000000
--- a/tools/layoutlib/create/tests/com/android/tools/layoutlib/create/dataclass/OuterClass_InnerClass_Delegate.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (C) 2011 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.tools.layoutlib.create.dataclass;
-
-import com.android.tools.layoutlib.create.DelegateClassAdapterTest;
-import com.android.tools.layoutlib.create.dataclass.OuterClass.InnerClass;
-
-/**
- * Used by {@link DelegateClassAdapterTest}.
- */
-public class OuterClass_InnerClass_Delegate {
- // The delegate override of Inner.get return 6 + a + b
- public static int get(OuterClass outer, InnerClass inner, int a, long b) {
- return 6 + a + (int) b;
- }
-}
diff --git a/tools/layoutlib/create/tests/data/mock_android.jar b/tools/layoutlib/create/tests/data/mock_android.jar
deleted file mode 100644
index 60d8efb..0000000
--- a/tools/layoutlib/create/tests/data/mock_android.jar
+++ /dev/null
Binary files differ
diff --git a/tools/layoutlib/create/tests/mock_data/java/lang/JavaClass.java b/tools/layoutlib/create/tests/mock_data/java/lang/JavaClass.java
deleted file mode 100644
index 59612e9..0000000
--- a/tools/layoutlib/create/tests/mock_data/java/lang/JavaClass.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- *
- * Licensed under the Eclipse Public License, Version 1.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.eclipse.org/org/documents/epl-v10.php
- *
- * 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 java.lang;
-
-public class JavaClass {
-
- public static String test = "test";
-}
diff --git a/tools/layoutlib/create/tests/mock_data/mock_android/dummy/InnerTest.java b/tools/layoutlib/create/tests/mock_data/mock_android/dummy/InnerTest.java
deleted file mode 100644
index d3a1d05..0000000
--- a/tools/layoutlib/create/tests/mock_data/mock_android/dummy/InnerTest.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Eclipse Public License, Version 1.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.eclipse.org/org/documents/epl-v10.php
- *
- * 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 mock_android.dummy;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-
-public class InnerTest {
-
- private int mSomeField;
- private MyStaticInnerClass mInnerInstance;
- private MyIntEnum mTheIntEnum;
- private MyGenerics1<int[][], InnerTest, MyIntEnum, float[]> mGeneric1;
-
- public class NotStaticInner2 extends NotStaticInner1 {
-
- }
-
- public class NotStaticInner1 {
-
- public void someThing() {
- mSomeField = 2;
- mInnerInstance = null;
- }
-
- }
-
- private static class MyStaticInnerClass {
-
- }
-
- private static class DerivingClass extends InnerTest {
-
- }
-
- // enums are a kind of inner static class
- public enum MyIntEnum {
- VALUE0(0),
- VALUE1(1),
- VALUE2(2);
-
- MyIntEnum(int myInt) {
- this.myInt = myInt;
- }
- final int myInt;
- }
-
- public static class MyGenerics1<T, U, V, W> {
- public MyGenerics1() {
- int a = 1;
- }
- }
-
- public <X> void genericMethod1(X a, X[] b) {
- }
-
- public <X, Y> void genericMethod2(X a, List<Y> b) {
- }
-
- public <X, Y extends InnerTest> void genericMethod3(X a, List<Y> b) {
- }
-
- public <T extends InnerTest> void genericMethod4(T[] a, Collection<T> b, Collection<?> c) {
- Iterator<T> i = b.iterator();
- }
-
- public void someMethod(InnerTest self) {
- mSomeField = self.mSomeField;
- MyStaticInnerClass m = new MyStaticInnerClass();
- mInnerInstance = m;
- mTheIntEnum = null;
- mGeneric1 = new MyGenerics1();
- genericMethod4(new DerivingClass[0], new ArrayList<DerivingClass>(), new ArrayList<InnerTest>());
- }
-}
diff --git a/tools/layoutlib/create/tests/mock_data/mock_android/view/View.java b/tools/layoutlib/create/tests/mock_data/mock_android/view/View.java
deleted file mode 100644
index 84ec8a9..0000000
--- a/tools/layoutlib/create/tests/mock_data/mock_android/view/View.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Eclipse Public License, Version 1.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.eclipse.org/org/documents/epl-v10.php
- *
- * 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 mock_android.view;
-
-import java.lang.JavaClass;
-
-public class View {
-
- String x = JavaClass.test;
-
-}
diff --git a/tools/layoutlib/create/tests/mock_data/mock_android/view/ViewGroup.java b/tools/layoutlib/create/tests/mock_data/mock_android/view/ViewGroup.java
deleted file mode 100644
index 466470f..0000000
--- a/tools/layoutlib/create/tests/mock_data/mock_android/view/ViewGroup.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Eclipse Public License, Version 1.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.eclipse.org/org/documents/epl-v10.php
- *
- * 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 mock_android.view;
-
-public class ViewGroup extends View {
-
- public class MarginLayoutParams extends LayoutParams {
-
- }
-
- public class LayoutParams {
-
- }
-
-}
diff --git a/tools/layoutlib/create/tests/mock_data/mock_android/widget/LinearLayout.java b/tools/layoutlib/create/tests/mock_data/mock_android/widget/LinearLayout.java
deleted file mode 100644
index 3870a63..0000000
--- a/tools/layoutlib/create/tests/mock_data/mock_android/widget/LinearLayout.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Eclipse Public License, Version 1.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.eclipse.org/org/documents/epl-v10.php
- *
- * 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 mock_android.widget;
-
-import mock_android.view.ViewGroup;
-
-public class LinearLayout extends ViewGroup {
-
- public class LayoutParams extends mock_android.view.ViewGroup.LayoutParams {
-
- }
-
-}
diff --git a/tools/layoutlib/create/tests/mock_data/mock_android/widget/TableLayout.java b/tools/layoutlib/create/tests/mock_data/mock_android/widget/TableLayout.java
deleted file mode 100644
index e455e7d..0000000
--- a/tools/layoutlib/create/tests/mock_data/mock_android/widget/TableLayout.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Eclipse Public License, Version 1.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.eclipse.org/org/documents/epl-v10.php
- *
- * 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 mock_android.widget;
-
-import mock_android.view.ViewGroup;
-
-public class TableLayout extends ViewGroup {
-
- public class LayoutParams extends MarginLayoutParams {
-
- }
-
-}
diff --git a/tools/obbtool/Android.mk b/tools/obbtool/Android.mk
deleted file mode 100644
index 9ff56d6..0000000
--- a/tools/obbtool/Android.mk
+++ /dev/null
@@ -1,48 +0,0 @@
-#
-# Copyright 2010 The Android Open Source Project
-#
-# Opaque Binary Blob (OBB) Tool
-#
-
-# This tool is prebuilt if we're doing an app-only build.
-ifeq ($(TARGET_BUILD_APPS),)
-
-LOCAL_PATH:= $(call my-dir)
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := \
- Main.cpp
-
-LOCAL_CFLAGS := -Wall -Werror
-
-#LOCAL_C_INCLUDES +=
-
-LOCAL_STATIC_LIBRARIES := \
- libandroidfw \
- libutils \
- libcutils \
- liblog
-
-ifeq ($(HOST_OS),linux)
-LOCAL_LDLIBS += -ldl -lpthread
-endif
-
-LOCAL_MODULE := obbtool
-
-include $(BUILD_HOST_EXECUTABLE)
-
-#####################################################
-include $(CLEAR_VARS)
-
-LOCAL_MODULE := pbkdf2gen
-LOCAL_MODULE_TAGS := optional
-LOCAL_CFLAGS := -Wall -Werror
-LOCAL_SRC_FILES := pbkdf2gen.cpp
-LOCAL_LDLIBS += -ldl
-LOCAL_C_INCLUDES := external/openssl/include $(LOCAL_C_INCLUDES)
-LOCAL_STATIC_LIBRARIES := libcrypto_static
-
-include $(BUILD_HOST_EXECUTABLE)
-
-#######################################################
-endif # TARGET_BUILD_APPS
diff --git a/tools/obbtool/Main.cpp b/tools/obbtool/Main.cpp
deleted file mode 100644
index b2152e8..0000000
--- a/tools/obbtool/Main.cpp
+++ /dev/null
@@ -1,301 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <androidfw/ObbFile.h>
-#include <utils/String8.h>
-
-#include <getopt.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-using namespace android;
-
-static const char* gProgName = "obbtool";
-static const char* gProgVersion = "1.0";
-
-static int wantUsage = 0;
-static int wantVersion = 0;
-
-#define SALT_LEN 8
-
-#define ADD_OPTS "n:v:os:"
-static const struct option longopts[] = {
- {"help", no_argument, &wantUsage, 1},
- {"version", no_argument, &wantVersion, 1},
-
- /* Args for "add" */
- {"name", required_argument, NULL, 'n'},
- {"version", required_argument, NULL, 'v'},
- {"overlay", optional_argument, NULL, 'o'},
- {"salt", required_argument, NULL, 's'},
-
- {NULL, 0, NULL, '\0'}
-};
-
-class PackageInfo {
-public:
- PackageInfo()
- : packageName(NULL)
- , packageVersion(-1)
- , overlay(false)
- , salted(false)
- {
- memset(&salt, 0, sizeof(salt));
- }
-
- char* packageName;
- int packageVersion;
- bool overlay;
- bool salted;
- unsigned char salt[SALT_LEN];
-};
-
-/*
- * Print usage info.
- */
-void usage(void)
-{
- fprintf(stderr, "Opaque Binary Blob (OBB) Tool\n\n");
- fprintf(stderr, "Usage:\n");
- fprintf(stderr,
- " %s a[dd] [ OPTIONS ] FILENAME\n"
- " Adds an OBB signature to the file.\n\n", gProgName);
- fprintf(stderr,
- " Options:\n"
- " -n <package name> sets the OBB package name (required)\n"
- " -v <OBB version> sets the OBB version (required)\n"
- " -o sets the OBB overlay flag\n"
- " -s <8 byte hex salt> sets the crypto key salt (if encrypted)\n"
- "\n");
- fprintf(stderr,
- " %s r[emove] FILENAME\n"
- " Removes the OBB signature from the file.\n\n", gProgName);
- fprintf(stderr,
- " %s i[nfo] FILENAME\n"
- " Prints the OBB signature information of a file.\n\n", gProgName);
-}
-
-void doAdd(const char* filename, struct PackageInfo* info) {
- ObbFile *obb = new ObbFile();
- if (obb->readFrom(filename)) {
- fprintf(stderr, "ERROR: %s: OBB signature already present\n", filename);
- return;
- }
-
- obb->setPackageName(String8(info->packageName));
- obb->setVersion(info->packageVersion);
- obb->setOverlay(info->overlay);
- if (info->salted) {
- obb->setSalt(info->salt, SALT_LEN);
- }
-
- if (!obb->writeTo(filename)) {
- fprintf(stderr, "ERROR: %s: couldn't write OBB signature: %s\n",
- filename, strerror(errno));
- return;
- }
-
- fprintf(stderr, "OBB signature successfully written\n");
-}
-
-void doRemove(const char* filename) {
- ObbFile *obb = new ObbFile();
- if (!obb->readFrom(filename)) {
- fprintf(stderr, "ERROR: %s: no OBB signature present\n", filename);
- return;
- }
-
- if (!obb->removeFrom(filename)) {
- fprintf(stderr, "ERROR: %s: couldn't remove OBB signature\n", filename);
- return;
- }
-
- fprintf(stderr, "OBB signature successfully removed\n");
-}
-
-void doInfo(const char* filename) {
- ObbFile *obb = new ObbFile();
- if (!obb->readFrom(filename)) {
- fprintf(stderr, "ERROR: %s: couldn't read OBB signature\n", filename);
- return;
- }
-
- printf("OBB info for '%s':\n", filename);
- printf("Package name: %s\n", obb->getPackageName().string());
- printf(" Version: %d\n", obb->getVersion());
- printf(" Flags: 0x%08x\n", obb->getFlags());
- printf(" Overlay: %s\n", obb->isOverlay() ? "true" : "false");
- printf(" Salt: ");
-
- size_t saltLen;
- const unsigned char* salt = obb->getSalt(&saltLen);
- if (salt != NULL) {
- for (int i = 0; i < SALT_LEN; i++) {
- printf("%02x", salt[i]);
- }
- printf("\n");
- } else {
- printf("<empty>\n");
- }
-}
-
-bool fromHex(char h, unsigned char *b) {
- if (h >= '0' && h <= '9') {
- *b = h - '0';
- return true;
- } else if (h >= 'a' && h <= 'f') {
- *b = h - 'a' + 10;
- return true;
- } else if (h >= 'A' && h <= 'F') {
- *b = h - 'A' + 10;
- return true;
- }
- return false;
-}
-
-bool hexToByte(char h1, char h2, unsigned char* b) {
- unsigned char first, second;
- if (!fromHex(h1, &first)) return false;
- if (!fromHex(h2, &second)) return false;
- *b = (first << 4) | second;
- return true;
-}
-
-/*
- * Parse args.
- */
-int main(int argc, char* const argv[])
-{
- int opt;
- int option_index = 0;
- struct PackageInfo package_info;
-
- int result = 1; // pessimistically assume an error.
-
- if (argc < 2) {
- wantUsage = 1;
- goto bail;
- }
-
- while ((opt = getopt_long(argc, argv, ADD_OPTS, longopts, &option_index)) != -1) {
- switch (opt) {
- case 0:
- if (longopts[option_index].flag)
- break;
- fprintf(stderr, "'%s' requires an argument\n", longopts[option_index].name);
- wantUsage = 1;
- goto bail;
- case 'n':
- package_info.packageName = optarg;
- break;
- case 'v': {
- char* end;
- package_info.packageVersion = strtol(optarg, &end, 10);
- if (*optarg == '\0' || *end != '\0') {
- fprintf(stderr, "ERROR: invalid version; should be integer!\n\n");
- wantUsage = 1;
- goto bail;
- }
- break;
- }
- case 'o':
- package_info.overlay = true;
- break;
- case 's':
- if (strlen(optarg) != SALT_LEN * 2) {
- fprintf(stderr, "ERROR: salt must be 8 bytes in hex (e.g., ABCD65031337D00D)\n\n");
- wantUsage = 1;
- goto bail;
- }
-
- package_info.salted = true;
-
- unsigned char b;
- for (int i = 0, j = 0; i < SALT_LEN; i++, j+=2) {
- if (!hexToByte(optarg[j], optarg[j+1], &b)) {
- fprintf(stderr, "ERROR: salt must be in hex (e.g., ABCD65031337D00D)\n");
- wantUsage = 1;
- goto bail;
- }
- package_info.salt[i] = b;
- }
- break;
- case '?':
- wantUsage = 1;
- goto bail;
- }
- }
-
- if (wantVersion) {
- fprintf(stderr, "%s %s\n", gProgName, gProgVersion);
- }
-
- if (wantUsage) {
- goto bail;
- }
-
-#define CHECK_OP(name) \
- if (strncmp(op, name, opsize)) { \
- fprintf(stderr, "ERROR: unknown function '%s'!\n\n", op); \
- wantUsage = 1; \
- goto bail; \
- }
-
- if (optind < argc) {
- const char* op = argv[optind++];
- const int opsize = strlen(op);
-
- if (optind >= argc) {
- fprintf(stderr, "ERROR: filename required!\n\n");
- wantUsage = 1;
- goto bail;
- }
-
- const char* filename = argv[optind++];
-
- switch (op[0]) {
- case 'a':
- CHECK_OP("add");
- if (package_info.packageName == NULL) {
- fprintf(stderr, "ERROR: arguments required 'packageName' and 'version'\n");
- goto bail;
- }
- doAdd(filename, &package_info);
- break;
- case 'r':
- CHECK_OP("remove");
- doRemove(filename);
- break;
- case 'i':
- CHECK_OP("info");
- doInfo(filename);
- break;
- default:
- fprintf(stderr, "ERROR: unknown command '%s'!\n\n", op);
- wantUsage = 1;
- goto bail;
- }
- }
-
-bail:
- if (wantUsage) {
- usage();
- result = 2;
- }
-
- return result;
-}
diff --git a/tools/obbtool/mkobb.sh b/tools/obbtool/mkobb.sh
deleted file mode 100755
index 725250d..0000000
--- a/tools/obbtool/mkobb.sh
+++ /dev/null
@@ -1,281 +0,0 @@
-#!/bin/bash
-#
-# Copyright (C) 2010 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-# mkobb.sh - Creates OBB files on Linux machines
-
-# Directory where we should temporarily mount the OBB loopback to copy files
-MOUNTDIR=/tmp
-
-# Presets. Changing these will probably break your OBB on the device
-CRYPTO=twofish
-FS=vfat
-MKFS=mkfs.vfat
-LOSETUP=losetup
-BLOCK_SIZE=512
-SLOP=512 # Amount of filesystem slop in ${BLOCK_SIZE} blocks
-
-find_binaries() {
- MKFSBIN=`which ${MKFS}`
- LOSETUPBIN=`which ${LOSETUP}`
- MOUNTBIN=`which mount`
- UMOUNTBIN=`which umount`
- DDBIN=`which dd`
- RSYNCBIN=`which rsync`
- PBKDF2GEN=`which pbkdf2gen`
-}
-
-check_prereqs() {
- if [ "`uname -s`x" != "Linuxx" ]; then \
- echo "ERROR: This script only works on Linux!"
- exit 1
- fi
-
- if ! egrep -q "^cryptoloop " /proc/modules; then \
- echo "ERROR: Could not find cryptoloop in the kernel."
- echo "Perhaps you need to: modprobe cryptoloop"
- exit 1
- fi
-
- if ! egrep -q "name\s*:\s*${CRYPTO}$" /proc/crypto; then \
- echo "ERROR: Could not find crypto \`${CRYPTO}' in the kernel."
- echo "Perhaps you need to: modprobe ${CRYPTO}"
- exit 1
- fi
-
- if ! egrep -q "^\s*${FS}$" /proc/filesystems; then \
- echo "ERROR: Could not find filesystem \`${FS}' in the kernel."
- echo "Perhaps you need to: modprobe ${FS}"
- exit 1
- fi
-
- if [ "${MKFSBIN}x" = "x" ]; then \
- echo "ERROR: Could not find ${MKFS} in your path!"
- exit 1
- elif [ ! -x "${MKFSBIN}" ]; then \
- echo "ERROR: ${MKFSBIN} is not executable!"
- exit 1
- fi
-
- if [ "${LOSETUPBIN}x" = "x" ]; then \
- echo "ERROR: Could not find ${LOSETUP} in your path!"
- exit 1
- elif [ ! -x "${LOSETUPBIN}" ]; then \
- echo "ERROR: ${LOSETUPBIN} is not executable!"
- exit 1
- fi
-
- if [ "${PBKDF2GEN}x" = "x" ]; then \
- echo "ERROR: Could not find pbkdf2gen in your path!"
- exit 1
- fi
-}
-
-cleanup() {
- if [ "${loopdev}x" != "x" ]; then \
- ${LOSETUPBIN} -d ${loopdev}
- fi
-}
-
-hidden_prompt() {
- unset output
- prompt="$1"
- outvar="$2"
- while read -s -n 1 -p "$prompt" c; do \
- if [ "x$c" = "x" ]; then \
- break
- fi
- prompt='*'
- output="${output}${c}"
- done
- echo
- eval $outvar="$output"
- unset output
-}
-
-read_key() {
- hidden_prompt " Encryption key: " key
-
- if [ "${key}x" = "x" ]; then \
- echo "ERROR: An empty key is not allowed!"
- exit 1
- fi
-
- hidden_prompt "Encryption key (again): " key2
-
- if [ "${key}x" != "${key2}x" ]; then \
- echo "ERROR: Encryption keys do not match!"
- exit 1
- fi
-}
-
-onexit() {
- if [ "x${temp_mount}" != "x" ]; then \
- ${UMOUNTBIN} ${temp_mount}
- rmdir ${temp_mount}
- fi
- if [ "x${loop_dev}" != "x" ]; then \
- if [ ${use_crypto} -eq 1 ]; then \
- dmsetup remove -f ${loop_dev}
- ${LOSETUPBIN} -d ${old_loop_dev}
- else \
- ${LOSETUPBIN} -d ${loop_dev}
- fi
- fi
- if [ "x${tempfile}" != "x" -a -f "${tempfile}" ]; then \
- rm -f ${tempfile}
- fi
- if [ "x${keyfile}" != "x" -a -f "${keyfile}" ]; then \
- rm -f ${keyfile}
- fi
- echo "Fatal error."
- exit 1
-}
-
-usage() {
- echo "mkobb.sh -- Create OBB files for use on Android"
- echo ""
- echo " -d <directory> Use <directory> as input for OBB files"
- echo " -k <key> Use <key> to encrypt OBB file"
- echo " -K Prompt for key to encrypt OBB file"
- echo " -o <filename> Write OBB file out to <filename>"
- echo " -v Verbose mode"
- echo " -h Help; this usage screen"
-}
-
-find_binaries
-check_prereqs
-
-use_crypto=0
-
-args=`getopt -o d:hk:Ko:v -- "$@"`
-eval set -- "$args"
-
-while true; do \
- case "$1" in
- -d) directory=$2; shift 2;;
- -h) usage; exit 1;;
- -k) key=$2; use_crypto=1; shift 2;;
- -K) prompt_key=1; use_crypto=1; shift;;
- -v) verbose=1; shift;;
- -o) filename=$2; shift 2;;
- --) shift; break;;
- *) echo "ERROR: Invalid argument in option parsing! Cannot recover. Ever."; exit 1;;
- esac
-done
-
-if [ "${directory}x" = "x" -o ! -d "${directory}" ]; then \
- echo "ERROR: Must specify valid input directory"
- echo ""
- usage
- exit 1;
-fi
-
-if [ "${filename}x" = "x" ]; then \
- echo "ERROR: Must specify filename"
- echo ""
- usage
- exit 1;
-fi
-
-if [ ${use_crypto} -eq 1 -a "${key}x" = "x" -a 0${prompt_key} -eq 0 ]; then \
- echo "ERROR: Crypto desired, but no key supplied or requested to prompt for."
- exit 1
-fi
-
-if [ 0${prompt_key} -eq 1 ]; then \
- read_key
-fi
-
-outdir=`dirname ${filename}`
-if [ ! -d "${outdir}" ]; then \
- echo "ERROR: Output directory does not exist: ${outdir}"
- exit 1
-fi
-
-# Make sure we clean up any stuff we create from here on during error conditions
-trap onexit ERR
-
-tempfile=$(tempfile -d ${outdir}) || ( echo "ERROR: couldn't create temporary file in ${outdir}"; exit 1 )
-
-block_count=`du -s --apparent-size --block-size=512 ${directory} | awk '{ print $1; }'`
-if [ $? -ne 0 ]; then \
- echo "ERROR: Couldn't read size of input directory ${directory}"
- exit 1
-fi
-
-echo "Creating temporary file..."
-${DDBIN} if=/dev/zero of=${tempfile} bs=${BLOCK_SIZE} count=$((${block_count} + ${SLOP})) > /dev/null 2>&1
-if [ $? -ne 0 ]; then \
- echo "ERROR: creating temporary file: $?"
-fi
-
-loop_dev=$(${LOSETUPBIN} -f) || ( echo "ERROR: losetup wouldn't tell us the next unused device"; exit 1 )
-
-${LOSETUPBIN} ${loop_dev} ${tempfile} || ( echo "ERROR: couldn't create loopback device"; exit 1 )
-
-if [ ${use_crypto} -eq 1 ]; then \
- eval `${PBKDF2GEN} ${key}`
- unique_dm_name=`basename ${tempfile}`
- echo "0 `blockdev --getsize ${loop_dev}` crypt ${CRYPTO} ${key} 0 ${loop_dev} 0" | dmsetup create ${unique_dm_name}
- old_loop_dev=${loop_dev}
- loop_dev=/dev/mapper/${unique_dm_name}
-fi
-
-#
-# Create the filesystem
-#
-echo ""
-${MKFSBIN} -I ${loop_dev}
-echo ""
-
-#
-# Make the temporary mount point and mount it
-#
-temp_mount="${MOUNTDIR}/${RANDOM}"
-mkdir ${temp_mount}
-${MOUNTBIN} -t ${FS} -o loop ${loop_dev} ${temp_mount}
-
-#
-# rsync the files!
-#
-echo "Copying files:"
-${RSYNCBIN} -av --no-owner --no-group ${directory}/ ${temp_mount}/
-echo ""
-
-echo "Successfully created \`${filename}'"
-
-if [ ${use_crypto} -eq 1 ]; then \
- echo "salt for use with obbtool is:"
- echo "${salt}"
-fi
-
-#
-# Undo all the temporaries
-#
-umount ${temp_mount}
-rmdir ${temp_mount}
-if [ ${use_crypto} -eq 1 ]; then \
- dmsetup remove -f ${loop_dev}
- ${LOSETUPBIN} -d ${old_loop_dev}
-else \
- ${LOSETUPBIN} -d ${loop_dev}
-fi
-mv ${tempfile} ${filename}
-
-trap - ERR
-
-exit 0
diff --git a/tools/obbtool/pbkdf2gen.cpp b/tools/obbtool/pbkdf2gen.cpp
deleted file mode 100644
index 98d67c0..0000000
--- a/tools/obbtool/pbkdf2gen.cpp
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <openssl/evp.h>
-
-#include <sys/types.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-
-/**
- * Simple program to generate a key based on PBKDF2 with preset inputs.
- *
- * Will print out the salt and key in hex.
- */
-
-#define SALT_LEN 8
-#define ROUNDS 1024
-#define KEY_BITS 128
-
-int main(int argc, char* argv[])
-{
- if (argc != 2) {
- fprintf(stderr, "Usage: %s <password>\n", argv[0]);
- exit(1);
- }
-
- int fd = open("/dev/urandom", O_RDONLY);
- if (fd < 0) {
- fprintf(stderr, "Could not open /dev/urandom: %s\n", strerror(errno));
- close(fd);
- exit(1);
- }
-
- unsigned char salt[SALT_LEN];
-
- if (read(fd, &salt, SALT_LEN) != SALT_LEN) {
- fprintf(stderr, "Could not read salt from /dev/urandom: %s\n", strerror(errno));
- close(fd);
- exit(1);
- }
- close(fd);
-
- unsigned char rawKey[KEY_BITS];
-
- if (PKCS5_PBKDF2_HMAC_SHA1(argv[1], strlen(argv[1]), salt, SALT_LEN,
- ROUNDS, KEY_BITS, rawKey) != 1) {
- fprintf(stderr, "Could not generate PBKDF2 output: %s\n", strerror(errno));
- exit(1);
- }
-
- printf("salt=");
- for (int i = 0; i < SALT_LEN; i++) {
- printf("%02x", salt[i]);
- }
- printf("\n");
-
- printf("key=");
- for (int i = 0; i < (KEY_BITS / 8); i++) {
- printf("%02x", rawKey[i]);
- }
- printf("\n");
-}
diff --git a/tools/orientationplot/README.txt b/tools/orientationplot/README.txt
deleted file mode 100644
index d53f65e..0000000
--- a/tools/orientationplot/README.txt
+++ /dev/null
@@ -1,87 +0,0 @@
-This directory contains a simple python script for visualizing
-the behavior of the WindowOrientationListener.
-
-
-PREREQUISITES
--------------
-
-1. Python 2.6
-2. numpy
-3. matplotlib
-
-
-USAGE
------
-
-The tool works by scaping the debug log output from WindowOrientationListener
-for interesting data and then plotting it.
-
-1. Plug in the device. Ensure that it is the only device plugged in
- since this script is of very little brain and will get confused otherwise.
-
-2. Enable the Window Orientation Listener debugging data log.
- adb shell setprop debug.orientation.log true
- adb shell stop
- adb shell start
-
-3. Run "orientationplot.py".
-
-
-WHAT IT ALL MEANS
------------------
-
-The tool displays several time series graphs that plot the output of the
-WindowOrientationListener. Here you can see the raw accelerometer data,
-filtered accelerometer data, measured tilt and orientation angle, confidence
-intervals for the proposed orientation and accelerometer latency.
-
-Things to look for:
-
-1. Ensure the filtering is not too aggressive. If the filter cut-off frequency is
- less than about 1Hz, then the filtered accelorometer data becomes too smooth
- and the latency for orientation detection goes up. One way to observe this
- is by holding the device vertically in one orientation then sharply turning
- it 90 degrees to a different orientation. Compared the rapid changes in the
- raw accelerometer data with the smoothed out filtered data. If the filtering
- is too aggressive, the filter response may lag by hundreds of milliseconds.
-
-2. Ensure that there is an appropriate gap between adjacent orientation angles
- for hysteresis. Try holding the device in one orientation and slowly turning
- it 90 degrees. Note that the confidence intervals will all drop to 0 at some
- point in between the two orientations; that is the gap. The gap should be
- observed between all adjacent pairs of orientations when turning the device
- in either direction.
-
- Next try holding the device in one orientation and rapidly turning it end
- over end to a midpoint about 45 degrees between two opposing orientations.
- There should be no gap observed initially. The algorithm should pick one
- of the orientations and settle into it (since it is obviously quite
- different from the original orientation of the device). However, once it
- settles, the confidence values should start trending to 0 again because
- the measured orientation angle is now within the gap between the new
- orientation and the adjacent orientation.
-
- In other words, the hysteresis gap applies only when the measured orientation
- angle (say, 45 degrees) is between the current orientation's ideal angle
- (say, 0 degrees) and an adjacent orientation's ideal angle (say, 90 degrees).
-
-3. Accelerometer jitter. The accelerometer latency graph displays the interval
- between sensor events as reported by the SensorEvent.timestamp field. It
- should be a fairly constant 60ms. If the latency jumps around wildly or
- greatly exceeds 60ms then there is a problem with the accelerometer or the
- sensor manager.
-
-4. The orientation angle is not measured when the tilt is too close to 90 or -90
- degrees (refer to MAX_TILT constant). Consequently, you should expect there
- to be no data. Likewise, all dependent calculations are suppressed in this case
- so there will be no orientation proposal either.
-
-5. Each orientation has its own bound on allowable tilt angles. It's a good idea to
- verify that these limits are being enforced by gradually varying the tilt of
- the device until it is inside/outside the limit for each orientation.
-
-6. Orientation changes should be significantly harder when the device is held
- overhead. People reading on tablets in bed often have their head turned
- a little to the side, or they hold the device loosely so its orientation
- can be a bit unusual. The tilt is a good indicator of whether the device is
- overhead.
diff --git a/tools/orientationplot/orientationplot.py b/tools/orientationplot/orientationplot.py
deleted file mode 100755
index 6fc3922..0000000
--- a/tools/orientationplot/orientationplot.py
+++ /dev/null
@@ -1,457 +0,0 @@
-#!/usr/bin/env python2.6
-#
-# Copyright (C) 2011 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.
-#
-
-#
-# Plots debug log output from WindowOrientationListener.
-# See README.txt for details.
-#
-
-import numpy as np
-import matplotlib.pyplot as plot
-import subprocess
-import re
-import fcntl
-import os
-import errno
-import bisect
-from datetime import datetime, timedelta
-
-# Parameters.
-timespan = 15 # seconds total span shown
-scrolljump = 5 # seconds jump when scrolling
-timeticks = 1 # seconds between each time tick
-
-# Non-blocking stream wrapper.
-class NonBlockingStream:
- def __init__(self, stream):
- fcntl.fcntl(stream, fcntl.F_SETFL, os.O_NONBLOCK)
- self.stream = stream
- self.buffer = ''
- self.pos = 0
-
- def readline(self):
- while True:
- index = self.buffer.find('\n', self.pos)
- if index != -1:
- result = self.buffer[self.pos:index]
- self.pos = index + 1
- return result
-
- self.buffer = self.buffer[self.pos:]
- self.pos = 0
- try:
- chunk = os.read(self.stream.fileno(), 4096)
- except OSError, e:
- if e.errno == errno.EAGAIN:
- return None
- raise e
- if len(chunk) == 0:
- if len(self.buffer) == 0:
- raise(EOFError)
- else:
- result = self.buffer
- self.buffer = ''
- self.pos = 0
- return result
- self.buffer += chunk
-
-# Plotter
-class Plotter:
- def __init__(self, adbout):
- self.adbout = adbout
-
- self.fig = plot.figure(1)
- self.fig.suptitle('Window Orientation Listener', fontsize=12)
- self.fig.set_dpi(96)
- self.fig.set_size_inches(16, 12, forward=True)
-
- self.raw_acceleration_x = self._make_timeseries()
- self.raw_acceleration_y = self._make_timeseries()
- self.raw_acceleration_z = self._make_timeseries()
- self.raw_acceleration_magnitude = self._make_timeseries()
- self.raw_acceleration_axes = self._add_timeseries_axes(
- 1, 'Raw Acceleration', 'm/s^2', [-20, 20],
- yticks=range(-15, 16, 5))
- self.raw_acceleration_line_x = self._add_timeseries_line(
- self.raw_acceleration_axes, 'x', 'red')
- self.raw_acceleration_line_y = self._add_timeseries_line(
- self.raw_acceleration_axes, 'y', 'green')
- self.raw_acceleration_line_z = self._add_timeseries_line(
- self.raw_acceleration_axes, 'z', 'blue')
- self.raw_acceleration_line_magnitude = self._add_timeseries_line(
- self.raw_acceleration_axes, 'magnitude', 'orange', linewidth=2)
- self._add_timeseries_legend(self.raw_acceleration_axes)
-
- shared_axis = self.raw_acceleration_axes
-
- self.filtered_acceleration_x = self._make_timeseries()
- self.filtered_acceleration_y = self._make_timeseries()
- self.filtered_acceleration_z = self._make_timeseries()
- self.filtered_acceleration_magnitude = self._make_timeseries()
- self.filtered_acceleration_axes = self._add_timeseries_axes(
- 2, 'Filtered Acceleration', 'm/s^2', [-20, 20],
- sharex=shared_axis,
- yticks=range(-15, 16, 5))
- self.filtered_acceleration_line_x = self._add_timeseries_line(
- self.filtered_acceleration_axes, 'x', 'red')
- self.filtered_acceleration_line_y = self._add_timeseries_line(
- self.filtered_acceleration_axes, 'y', 'green')
- self.filtered_acceleration_line_z = self._add_timeseries_line(
- self.filtered_acceleration_axes, 'z', 'blue')
- self.filtered_acceleration_line_magnitude = self._add_timeseries_line(
- self.filtered_acceleration_axes, 'magnitude', 'orange', linewidth=2)
- self._add_timeseries_legend(self.filtered_acceleration_axes)
-
- self.tilt_angle = self._make_timeseries()
- self.tilt_angle_axes = self._add_timeseries_axes(
- 3, 'Tilt Angle', 'degrees', [-105, 105],
- sharex=shared_axis,
- yticks=range(-90, 91, 30))
- self.tilt_angle_line = self._add_timeseries_line(
- self.tilt_angle_axes, 'tilt', 'black')
- self._add_timeseries_legend(self.tilt_angle_axes)
-
- self.orientation_angle = self._make_timeseries()
- self.orientation_angle_axes = self._add_timeseries_axes(
- 4, 'Orientation Angle', 'degrees', [-25, 375],
- sharex=shared_axis,
- yticks=range(0, 361, 45))
- self.orientation_angle_line = self._add_timeseries_line(
- self.orientation_angle_axes, 'orientation', 'black')
- self._add_timeseries_legend(self.orientation_angle_axes)
-
- self.current_rotation = self._make_timeseries()
- self.proposed_rotation = self._make_timeseries()
- self.predicted_rotation = self._make_timeseries()
- self.orientation_axes = self._add_timeseries_axes(
- 5, 'Current / Proposed Orientation', 'rotation', [-1, 4],
- sharex=shared_axis,
- yticks=range(0, 4))
- self.current_rotation_line = self._add_timeseries_line(
- self.orientation_axes, 'current', 'black', linewidth=2)
- self.predicted_rotation_line = self._add_timeseries_line(
- self.orientation_axes, 'predicted', 'purple', linewidth=3)
- self.proposed_rotation_line = self._add_timeseries_line(
- self.orientation_axes, 'proposed', 'green', linewidth=3)
- self._add_timeseries_legend(self.orientation_axes)
-
- self.time_until_settled = self._make_timeseries()
- self.time_until_flat_delay_expired = self._make_timeseries()
- self.time_until_swing_delay_expired = self._make_timeseries()
- self.time_until_acceleration_delay_expired = self._make_timeseries()
- self.stability_axes = self._add_timeseries_axes(
- 6, 'Proposal Stability', 'ms', [-10, 600],
- sharex=shared_axis,
- yticks=range(0, 600, 100))
- self.time_until_settled_line = self._add_timeseries_line(
- self.stability_axes, 'time until settled', 'black', linewidth=2)
- self.time_until_flat_delay_expired_line = self._add_timeseries_line(
- self.stability_axes, 'time until flat delay expired', 'green')
- self.time_until_swing_delay_expired_line = self._add_timeseries_line(
- self.stability_axes, 'time until swing delay expired', 'blue')
- self.time_until_acceleration_delay_expired_line = self._add_timeseries_line(
- self.stability_axes, 'time until acceleration delay expired', 'red')
- self._add_timeseries_legend(self.stability_axes)
-
- self.sample_latency = self._make_timeseries()
- self.sample_latency_axes = self._add_timeseries_axes(
- 7, 'Accelerometer Sampling Latency', 'ms', [-10, 500],
- sharex=shared_axis,
- yticks=range(0, 500, 100))
- self.sample_latency_line = self._add_timeseries_line(
- self.sample_latency_axes, 'latency', 'black')
- self._add_timeseries_legend(self.sample_latency_axes)
-
- self.fig.canvas.mpl_connect('button_press_event', self._on_click)
- self.paused = False
-
- self.timer = self.fig.canvas.new_timer(interval=100)
- self.timer.add_callback(lambda: self.update())
- self.timer.start()
-
- self.timebase = None
- self._reset_parse_state()
-
- # Handle a click event to pause or restart the timer.
- def _on_click(self, ev):
- if not self.paused:
- self.paused = True
- self.timer.stop()
- else:
- self.paused = False
- self.timer.start()
-
- # Initialize a time series.
- def _make_timeseries(self):
- return [[], []]
-
- # Add a subplot to the figure for a time series.
- def _add_timeseries_axes(self, index, title, ylabel, ylim, yticks, sharex=None):
- num_graphs = 7
- height = 0.9 / num_graphs
- top = 0.95 - height * index
- axes = self.fig.add_axes([0.1, top, 0.8, height],
- xscale='linear',
- xlim=[0, timespan],
- ylabel=ylabel,
- yscale='linear',
- ylim=ylim,
- sharex=sharex)
- axes.text(0.02, 0.02, title, transform=axes.transAxes, fontsize=10, fontweight='bold')
- axes.set_xlabel('time (s)', fontsize=10, fontweight='bold')
- axes.set_ylabel(ylabel, fontsize=10, fontweight='bold')
- axes.set_xticks(range(0, timespan + 1, timeticks))
- axes.set_yticks(yticks)
- axes.grid(True)
-
- for label in axes.get_xticklabels():
- label.set_fontsize(9)
- for label in axes.get_yticklabels():
- label.set_fontsize(9)
-
- return axes
-
- # Add a line to the axes for a time series.
- def _add_timeseries_line(self, axes, label, color, linewidth=1):
- return axes.plot([], label=label, color=color, linewidth=linewidth)[0]
-
- # Add a legend to a time series.
- def _add_timeseries_legend(self, axes):
- axes.legend(
- loc='upper left',
- bbox_to_anchor=(1.01, 1),
- borderpad=0.1,
- borderaxespad=0.1,
- prop={'size': 10})
-
- # Resets the parse state.
- def _reset_parse_state(self):
- self.parse_raw_acceleration_x = None
- self.parse_raw_acceleration_y = None
- self.parse_raw_acceleration_z = None
- self.parse_raw_acceleration_magnitude = None
- self.parse_filtered_acceleration_x = None
- self.parse_filtered_acceleration_y = None
- self.parse_filtered_acceleration_z = None
- self.parse_filtered_acceleration_magnitude = None
- self.parse_tilt_angle = None
- self.parse_orientation_angle = None
- self.parse_current_rotation = None
- self.parse_proposed_rotation = None
- self.parse_predicted_rotation = None
- self.parse_time_until_settled = None
- self.parse_time_until_flat_delay_expired = None
- self.parse_time_until_swing_delay_expired = None
- self.parse_time_until_acceleration_delay_expired = None
- self.parse_sample_latency = None
-
- # Update samples.
- def update(self):
- timeindex = 0
- while True:
- try:
- line = self.adbout.readline()
- except EOFError:
- plot.close()
- return
- if line is None:
- break
- print line
-
- try:
- timestamp = self._parse_timestamp(line)
- except ValueError, e:
- continue
- if self.timebase is None:
- self.timebase = timestamp
- delta = timestamp - self.timebase
- timeindex = delta.seconds + delta.microseconds * 0.000001
-
- if line.find('Raw acceleration vector:') != -1:
- self.parse_raw_acceleration_x = self._get_following_number(line, 'x=')
- self.parse_raw_acceleration_y = self._get_following_number(line, 'y=')
- self.parse_raw_acceleration_z = self._get_following_number(line, 'z=')
- self.parse_raw_acceleration_magnitude = self._get_following_number(line, 'magnitude=')
-
- if line.find('Filtered acceleration vector:') != -1:
- self.parse_filtered_acceleration_x = self._get_following_number(line, 'x=')
- self.parse_filtered_acceleration_y = self._get_following_number(line, 'y=')
- self.parse_filtered_acceleration_z = self._get_following_number(line, 'z=')
- self.parse_filtered_acceleration_magnitude = self._get_following_number(line, 'magnitude=')
-
- if line.find('tiltAngle=') != -1:
- self.parse_tilt_angle = self._get_following_number(line, 'tiltAngle=')
-
- if line.find('orientationAngle=') != -1:
- self.parse_orientation_angle = self._get_following_number(line, 'orientationAngle=')
-
- if line.find('Result:') != -1:
- self.parse_current_rotation = self._get_following_number(line, 'currentRotation=')
- self.parse_proposed_rotation = self._get_following_number(line, 'proposedRotation=')
- self.parse_predicted_rotation = self._get_following_number(line, 'predictedRotation=')
- self.parse_sample_latency = self._get_following_number(line, 'timeDeltaMS=')
- self.parse_time_until_settled = self._get_following_number(line, 'timeUntilSettledMS=')
- self.parse_time_until_flat_delay_expired = self._get_following_number(line, 'timeUntilFlatDelayExpiredMS=')
- self.parse_time_until_swing_delay_expired = self._get_following_number(line, 'timeUntilSwingDelayExpiredMS=')
- self.parse_time_until_acceleration_delay_expired = self._get_following_number(line, 'timeUntilAccelerationDelayExpiredMS=')
-
- self._append(self.raw_acceleration_x, timeindex, self.parse_raw_acceleration_x)
- self._append(self.raw_acceleration_y, timeindex, self.parse_raw_acceleration_y)
- self._append(self.raw_acceleration_z, timeindex, self.parse_raw_acceleration_z)
- self._append(self.raw_acceleration_magnitude, timeindex, self.parse_raw_acceleration_magnitude)
- self._append(self.filtered_acceleration_x, timeindex, self.parse_filtered_acceleration_x)
- self._append(self.filtered_acceleration_y, timeindex, self.parse_filtered_acceleration_y)
- self._append(self.filtered_acceleration_z, timeindex, self.parse_filtered_acceleration_z)
- self._append(self.filtered_acceleration_magnitude, timeindex, self.parse_filtered_acceleration_magnitude)
- self._append(self.tilt_angle, timeindex, self.parse_tilt_angle)
- self._append(self.orientation_angle, timeindex, self.parse_orientation_angle)
- self._append(self.current_rotation, timeindex, self.parse_current_rotation)
- if self.parse_proposed_rotation >= 0:
- self._append(self.proposed_rotation, timeindex, self.parse_proposed_rotation)
- else:
- self._append(self.proposed_rotation, timeindex, None)
- if self.parse_predicted_rotation >= 0:
- self._append(self.predicted_rotation, timeindex, self.parse_predicted_rotation)
- else:
- self._append(self.predicted_rotation, timeindex, None)
- self._append(self.time_until_settled, timeindex, self.parse_time_until_settled)
- self._append(self.time_until_flat_delay_expired, timeindex, self.parse_time_until_flat_delay_expired)
- self._append(self.time_until_swing_delay_expired, timeindex, self.parse_time_until_swing_delay_expired)
- self._append(self.time_until_acceleration_delay_expired, timeindex, self.parse_time_until_acceleration_delay_expired)
- self._append(self.sample_latency, timeindex, self.parse_sample_latency)
- self._reset_parse_state()
-
- # Scroll the plots.
- if timeindex > timespan:
- bottom = int(timeindex) - timespan + scrolljump
- self.timebase += timedelta(seconds=bottom)
- self._scroll(self.raw_acceleration_x, bottom)
- self._scroll(self.raw_acceleration_y, bottom)
- self._scroll(self.raw_acceleration_z, bottom)
- self._scroll(self.raw_acceleration_magnitude, bottom)
- self._scroll(self.filtered_acceleration_x, bottom)
- self._scroll(self.filtered_acceleration_y, bottom)
- self._scroll(self.filtered_acceleration_z, bottom)
- self._scroll(self.filtered_acceleration_magnitude, bottom)
- self._scroll(self.tilt_angle, bottom)
- self._scroll(self.orientation_angle, bottom)
- self._scroll(self.current_rotation, bottom)
- self._scroll(self.proposed_rotation, bottom)
- self._scroll(self.predicted_rotation, bottom)
- self._scroll(self.time_until_settled, bottom)
- self._scroll(self.time_until_flat_delay_expired, bottom)
- self._scroll(self.time_until_swing_delay_expired, bottom)
- self._scroll(self.time_until_acceleration_delay_expired, bottom)
- self._scroll(self.sample_latency, bottom)
-
- # Redraw the plots.
- self.raw_acceleration_line_x.set_data(self.raw_acceleration_x)
- self.raw_acceleration_line_y.set_data(self.raw_acceleration_y)
- self.raw_acceleration_line_z.set_data(self.raw_acceleration_z)
- self.raw_acceleration_line_magnitude.set_data(self.raw_acceleration_magnitude)
- self.filtered_acceleration_line_x.set_data(self.filtered_acceleration_x)
- self.filtered_acceleration_line_y.set_data(self.filtered_acceleration_y)
- self.filtered_acceleration_line_z.set_data(self.filtered_acceleration_z)
- self.filtered_acceleration_line_magnitude.set_data(self.filtered_acceleration_magnitude)
- self.tilt_angle_line.set_data(self.tilt_angle)
- self.orientation_angle_line.set_data(self.orientation_angle)
- self.current_rotation_line.set_data(self.current_rotation)
- self.proposed_rotation_line.set_data(self.proposed_rotation)
- self.predicted_rotation_line.set_data(self.predicted_rotation)
- self.time_until_settled_line.set_data(self.time_until_settled)
- self.time_until_flat_delay_expired_line.set_data(self.time_until_flat_delay_expired)
- self.time_until_swing_delay_expired_line.set_data(self.time_until_swing_delay_expired)
- self.time_until_acceleration_delay_expired_line.set_data(self.time_until_acceleration_delay_expired)
- self.sample_latency_line.set_data(self.sample_latency)
-
- self.fig.canvas.draw_idle()
-
- # Scroll a time series.
- def _scroll(self, timeseries, bottom):
- bottom_index = bisect.bisect_left(timeseries[0], bottom)
- del timeseries[0][:bottom_index]
- del timeseries[1][:bottom_index]
- for i, timeindex in enumerate(timeseries[0]):
- timeseries[0][i] = timeindex - bottom
-
- # Extract a word following the specified prefix.
- def _get_following_word(self, line, prefix):
- prefix_index = line.find(prefix)
- if prefix_index == -1:
- return None
- start_index = prefix_index + len(prefix)
- delim_index = line.find(',', start_index)
- if delim_index == -1:
- return line[start_index:]
- else:
- return line[start_index:delim_index]
-
- # Extract a number following the specified prefix.
- def _get_following_number(self, line, prefix):
- word = self._get_following_word(line, prefix)
- if word is None:
- return None
- return float(word)
-
- # Extract an array of numbers following the specified prefix.
- def _get_following_array_of_numbers(self, line, prefix):
- prefix_index = line.find(prefix + '[')
- if prefix_index == -1:
- return None
- start_index = prefix_index + len(prefix) + 1
- delim_index = line.find(']', start_index)
- if delim_index == -1:
- return None
-
- result = []
- while start_index < delim_index:
- comma_index = line.find(', ', start_index, delim_index)
- if comma_index == -1:
- result.append(float(line[start_index:delim_index]))
- break;
- result.append(float(line[start_index:comma_index]))
- start_index = comma_index + 2
- return result
-
- # Add a value to a time series.
- def _append(self, timeseries, timeindex, number):
- timeseries[0].append(timeindex)
- timeseries[1].append(number)
-
- # Parse the logcat timestamp.
- # Timestamp has the form '01-21 20:42:42.930'
- def _parse_timestamp(self, line):
- return datetime.strptime(line[0:18], '%m-%d %H:%M:%S.%f')
-
-# Notice
-print "Window Orientation Listener plotting tool"
-print "-----------------------------------------\n"
-print "Please turn on the Window Orientation Listener logging in Development Settings."
-
-# Start adb.
-print "Starting adb logcat.\n"
-
-adb = subprocess.Popen(['adb', 'logcat', '-s', '-v', 'time', 'WindowOrientationListener:V'],
- stdout=subprocess.PIPE)
-adbout = NonBlockingStream(adb.stdout)
-
-# Prepare plotter.
-plotter = Plotter(adbout)
-plotter.update()
-
-# Main loop.
-plot.show()
diff --git a/tools/preload/20080522.compiled b/tools/preload/20080522.compiled
deleted file mode 100644
index a2af422..0000000
--- a/tools/preload/20080522.compiled
+++ /dev/null
Binary files differ
diff --git a/tools/preload/20090811.compiled b/tools/preload/20090811.compiled
deleted file mode 100644
index 6dbeca0..0000000
--- a/tools/preload/20090811.compiled
+++ /dev/null
Binary files differ
diff --git a/tools/preload/20100223.compiled b/tools/preload/20100223.compiled
deleted file mode 100644
index 3056388..0000000
--- a/tools/preload/20100223.compiled
+++ /dev/null
Binary files differ
diff --git a/tools/preload/Android.mk b/tools/preload/Android.mk
deleted file mode 100644
index f325870..0000000
--- a/tools/preload/Android.mk
+++ /dev/null
@@ -1,23 +0,0 @@
-LOCAL_PATH:= $(call my-dir)
-
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := \
- Compile.java \
- LoadedClass.java \
- MemoryUsage.java \
- Operation.java \
- Policy.java \
- PrintCsv.java \
- PrintHtmlDiff.java \
- PrintPsTree.java \
- Proc.java \
- Record.java \
- Root.java \
- WritePreloadedClassFile.java
-
-LOCAL_MODULE:= preload
-
-include $(BUILD_HOST_JAVA_LIBRARY)
-
-include $(call all-subdir-makefiles)
diff --git a/tools/preload/Compile.java b/tools/preload/Compile.java
deleted file mode 100644
index 67258ef..0000000
--- a/tools/preload/Compile.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * 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.
- */
-
-import java.io.BufferedReader;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Parses and analyzes a log, pulling our PRELOAD information. If you have
- * an emulator or device running in the background, this class will use it
- * to measure and record the memory usage of each class.
- *
- * TODO: Should analyze lines and select substring dynamically (instead of hardcoded 19)
- */
-public class Compile {
-
- public static void main(String[] args) throws IOException {
- if (args.length != 2) {
- System.err.println("Usage: Compile [log file] [output file]");
- System.exit(0);
- }
-
- Root root = new Root();
-
- List<Record> records = new ArrayList<Record>();
-
- BufferedReader in = new BufferedReader(new InputStreamReader(
- new FileInputStream(args[0])));
-
- String line;
- int lineNumber = 0;
- while ((line = in.readLine()) != null) {
- lineNumber++;
- if (line.startsWith("I/PRELOAD")) {
- try {
- String clipped = line.substring(19);
- records.add(new Record(clipped, lineNumber));
- } catch (RuntimeException e) {
- throw new RuntimeException(
- "Exception while recording line " + lineNumber + ": " + line, e);
- }
- }
- }
-
- for (Record record : records) {
- root.indexProcess(record);
- }
-
- for (Record record : records) {
- root.indexClassOperation(record);
- }
-
- in.close();
-
- root.toFile(args[1]);
- }
-}
diff --git a/tools/preload/LoadedClass.java b/tools/preload/LoadedClass.java
deleted file mode 100644
index 86e5dfc..0000000
--- a/tools/preload/LoadedClass.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * 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.
- */
-
-import java.io.Serializable;
-import java.util.*;
-
-/**
- * A loaded class.
- */
-class LoadedClass implements Serializable, Comparable<LoadedClass> {
-
- private static final long serialVersionUID = 0;
-
- /** Class name. */
- final String name;
-
- /** Load operations. */
- final List<Operation> loads = new ArrayList<Operation>();
-
- /** Static initialization operations. */
- final List<Operation> initializations = new ArrayList<Operation>();
-
- /** Memory usage gathered by loading only this class in its own VM. */
- MemoryUsage memoryUsage = MemoryUsage.NOT_AVAILABLE;
-
- /**
- * Whether or not this class was loaded in the system class loader.
- */
- final boolean systemClass;
-
- /** Whether or not this class will be preloaded. */
- boolean preloaded;
-
- /** Constructs a new class. */
- LoadedClass(String name, boolean systemClass) {
- this.name = name;
- this.systemClass = systemClass;
- }
-
- void measureMemoryUsage() {
- this.memoryUsage = MemoryUsage.forClass(name);
- }
-
- int mlt = -1;
-
- /** Median time to load this class. */
- int medianLoadTimeMicros() {
- if (mlt != -1) {
- return mlt;
- }
-
- return mlt = calculateMedian(loads);
- }
-
- int mit = -1;
-
- /** Median time to initialize this class. */
- int medianInitTimeMicros() {
- if (mit != -1) {
- return mit;
- }
-
- return mit = calculateMedian(initializations);
- }
-
- int medianTimeMicros() {
- return medianInitTimeMicros() + medianLoadTimeMicros();
- }
-
- /** Calculates the median duration for a list of operations. */
- private static int calculateMedian(List<Operation> operations) {
- int size = operations.size();
- if (size == 0) {
- return 0;
- }
-
- int[] times = new int[size];
- for (int i = 0; i < size; i++) {
- times[i] = operations.get(i).exclusiveTimeMicros();
- }
-
- Arrays.sort(times);
- int middle = size / 2;
- if (size % 2 == 1) {
- // Odd
- return times[middle];
- } else {
- // Even -- average the two.
- return (times[middle - 1] + times[middle]) / 2;
- }
- }
-
- /** Returns names of processes that loaded this class. */
- Set<String> processNames() {
- Set<String> names = new HashSet<String>();
- addProcessNames(loads, names);
- addProcessNames(initializations, names);
- return names;
- }
-
- private void addProcessNames(List<Operation> ops, Set<String> names) {
- for (Operation operation : ops) {
- if (operation.process.fromZygote()) {
- names.add(operation.process.name);
- }
- }
- }
-
- public int compareTo(LoadedClass o) {
- return name.compareTo(o.name);
- }
-
- @Override
- public String toString() {
- return name;
- }
-}
diff --git a/tools/preload/MemoryUsage.java b/tools/preload/MemoryUsage.java
deleted file mode 100644
index d8f95f4..0000000
--- a/tools/preload/MemoryUsage.java
+++ /dev/null
@@ -1,298 +0,0 @@
-/*
- * 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.
- */
-
-import java.io.Serializable;
-import java.io.IOException;
-import java.io.BufferedReader;
-import java.io.InputStreamReader;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.List;
-import java.util.ArrayList;
-import java.util.Arrays;
-
-/**
- * Memory usage information.
- */
-class MemoryUsage implements Serializable {
-
- private static final long serialVersionUID = 0;
-
- static final MemoryUsage NOT_AVAILABLE = new MemoryUsage();
-
- static int errorCount = 0;
-
- // These values are in 1kB increments (not 4kB like you'd expect).
- final int nativeSharedPages;
- final int javaSharedPages;
- final int otherSharedPages;
- final int nativePrivatePages;
- final int javaPrivatePages;
- final int otherPrivatePages;
-
- final int allocCount;
- final int allocSize;
- final int freedCount;
- final int freedSize;
- final long nativeHeapSize;
-
- public MemoryUsage(String line) {
- String[] parsed = line.split(",");
-
- nativeSharedPages = Integer.parseInt(parsed[1]);
- javaSharedPages = Integer.parseInt(parsed[2]);
- otherSharedPages = Integer.parseInt(parsed[3]);
- nativePrivatePages = Integer.parseInt(parsed[4]);
- javaPrivatePages = Integer.parseInt(parsed[5]);
- otherPrivatePages = Integer.parseInt(parsed[6]);
- allocCount = Integer.parseInt(parsed[7]);
- allocSize = Integer.parseInt(parsed[8]);
- freedCount = Integer.parseInt(parsed[9]);
- freedSize = Integer.parseInt(parsed[10]);
- nativeHeapSize = Long.parseLong(parsed[11]);
- }
-
- MemoryUsage() {
- nativeSharedPages = -1;
- javaSharedPages = -1;
- otherSharedPages = -1;
- nativePrivatePages = -1;
- javaPrivatePages = -1;
- otherPrivatePages = -1;
-
- allocCount = -1;
- allocSize = -1;
- freedCount = -1;
- freedSize = -1;
- nativeHeapSize = -1;
- }
-
- MemoryUsage(int nativeSharedPages,
- int javaSharedPages,
- int otherSharedPages,
- int nativePrivatePages,
- int javaPrivatePages,
- int otherPrivatePages,
- int allocCount,
- int allocSize,
- int freedCount,
- int freedSize,
- long nativeHeapSize) {
- this.nativeSharedPages = nativeSharedPages;
- this.javaSharedPages = javaSharedPages;
- this.otherSharedPages = otherSharedPages;
- this.nativePrivatePages = nativePrivatePages;
- this.javaPrivatePages = javaPrivatePages;
- this.otherPrivatePages = otherPrivatePages;
- this.allocCount = allocCount;
- this.allocSize = allocSize;
- this.freedCount = freedCount;
- this.freedSize = freedSize;
- this.nativeHeapSize = nativeHeapSize;
- }
-
- MemoryUsage subtract(MemoryUsage baseline) {
- return new MemoryUsage(
- nativeSharedPages - baseline.nativeSharedPages,
- javaSharedPages - baseline.javaSharedPages,
- otherSharedPages - baseline.otherSharedPages,
- nativePrivatePages - baseline.nativePrivatePages,
- javaPrivatePages - baseline.javaPrivatePages,
- otherPrivatePages - baseline.otherPrivatePages,
- allocCount - baseline.allocCount,
- allocSize - baseline.allocSize,
- freedCount - baseline.freedCount,
- freedSize - baseline.freedSize,
- nativeHeapSize - baseline.nativeHeapSize);
- }
-
- int javaHeapSize() {
- return allocSize - freedSize;
- }
-
- int totalHeap() {
- return javaHeapSize() + (int) nativeHeapSize;
- }
-
- int javaPagesInK() {
- return javaSharedPages + javaPrivatePages;
- }
-
- int nativePagesInK() {
- return nativeSharedPages + nativePrivatePages;
- }
- int otherPagesInK() {
- return otherSharedPages + otherPrivatePages;
- }
-
- int totalPages() {
- return javaSharedPages + javaPrivatePages + nativeSharedPages +
- nativePrivatePages + otherSharedPages + otherPrivatePages;
- }
-
- /**
- * Was this information available?
- */
- boolean isAvailable() {
- return nativeSharedPages != -1;
- }
-
- /**
- * Measures baseline memory usage.
- */
- static MemoryUsage baseline() {
- return forClass(null);
- }
-
- private static final String CLASS_PATH = "-Xbootclasspath"
- + ":/system/framework/core.jar"
- + ":/system/framework/ext.jar"
- + ":/system/framework/framework.jar"
- + ":/system/framework/framework-tests.jar"
- + ":/system/framework/services.jar"
- + ":/system/framework/loadclass.jar";
-
- private static final String[] GET_DIRTY_PAGES = {
- "adb", "shell", "dalvikvm", CLASS_PATH, "LoadClass" };
-
- /**
- * Measures memory usage for the given class.
- */
- static MemoryUsage forClass(String className) {
- MeasureWithTimeout measurer = new MeasureWithTimeout(className);
-
- new Thread(measurer).start();
-
- synchronized (measurer) {
- if (measurer.memoryUsage == null) {
- // Wait up to 10s.
- try {
- measurer.wait(30000);
- } catch (InterruptedException e) {
- System.err.println("Interrupted waiting for measurement.");
- e.printStackTrace();
- return NOT_AVAILABLE;
- }
-
- // If it's still null.
- if (measurer.memoryUsage == null) {
- System.err.println("Timed out while measuring "
- + className + ".");
- return NOT_AVAILABLE;
- }
- }
-
- System.err.println("Got memory usage for " + className + ".");
- return measurer.memoryUsage;
- }
- }
-
- static class MeasureWithTimeout implements Runnable {
-
- final String className;
- MemoryUsage memoryUsage = null;
-
- MeasureWithTimeout(String className) {
- this.className = className;
- }
-
- public void run() {
- MemoryUsage measured = measure();
-
- synchronized (this) {
- memoryUsage = measured;
- notifyAll();
- }
- }
-
- private MemoryUsage measure() {
- String[] commands = GET_DIRTY_PAGES;
- if (className != null) {
- List<String> commandList = new ArrayList<String>(
- GET_DIRTY_PAGES.length + 1);
- commandList.addAll(Arrays.asList(commands));
- commandList.add(className);
- commands = commandList.toArray(new String[commandList.size()]);
- }
-
- try {
- final Process process = Runtime.getRuntime().exec(commands);
-
- final InputStream err = process.getErrorStream();
-
- // Send error output to stderr.
- Thread errThread = new Thread() {
- @Override
- public void run() {
- copy(err, System.err);
- }
- };
- errThread.setDaemon(true);
- errThread.start();
-
- BufferedReader in = new BufferedReader(
- new InputStreamReader(process.getInputStream()));
- String line = in.readLine();
- if (line == null || !line.startsWith("DECAFBAD,")) {
- System.err.println("Got bad response for " + className
- + ": " + line + "; command was " + Arrays.toString(commands));
- errorCount += 1;
- return NOT_AVAILABLE;
- }
-
- in.close();
- err.close();
- process.destroy();
-
- return new MemoryUsage(line);
- } catch (IOException e) {
- System.err.println("Error getting stats for "
- + className + ".");
- e.printStackTrace();
- return NOT_AVAILABLE;
- }
- }
-
- }
-
- /**
- * Copies from one stream to another.
- */
- private static void copy(InputStream in, OutputStream out) {
- byte[] buffer = new byte[1024];
- int read;
- try {
- while ((read = in.read(buffer)) > -1) {
- out.write(buffer, 0, read);
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
-
- /** Measures memory usage information and stores it in the model. */
- public static void main(String[] args) throws IOException,
- ClassNotFoundException {
- Root root = Root.fromFile(args[0]);
- root.baseline = baseline();
- for (LoadedClass loadedClass : root.loadedClasses.values()) {
- if (loadedClass.systemClass) {
- loadedClass.measureMemoryUsage();
- }
- }
- root.toFile(args[0]);
- }
-}
diff --git a/tools/preload/Operation.java b/tools/preload/Operation.java
deleted file mode 100644
index 4f1938e..0000000
--- a/tools/preload/Operation.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * 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.
- */
-
-import java.util.List;
-import java.util.ArrayList;
-import java.io.Serializable;
-
-/**
- * An operation with a duration. Could represent a class load or initialization.
- */
-class Operation implements Serializable {
-
- private static final long serialVersionUID = 0;
-
- /**
- * Type of operation.
- */
- enum Type {
- LOAD, INIT
- }
-
- /** Process this operation occurred in. */
- final Proc process;
-
- /** Start time for this operation. */
- final long startTimeNanos;
-
- /** Index of this operation relative to its process. */
- final int index;
-
- /** Type of operation. */
- final Type type;
-
- /** End time for this operation. */
- long endTimeNanos = -1;
-
- /** The class that this operation loaded or initialized. */
- final LoadedClass loadedClass;
-
- /** Other operations that occurred during this one. */
- final List<Operation> subops = new ArrayList<Operation>();
-
- /** Constructs a new operation. */
- Operation(Proc process, LoadedClass loadedClass, long startTimeNanos,
- int index, Type type) {
- this.process = process;
- this.loadedClass = loadedClass;
- this.startTimeNanos = startTimeNanos;
- this.index = index;
- this.type = type;
- }
-
- /**
- * Returns how long this class initialization and all the nested class
- * initializations took.
- */
- private long inclusiveTimeNanos() {
- if (endTimeNanos == -1) {
- throw new IllegalStateException("End time hasn't been set yet: "
- + loadedClass.name);
- }
-
- return endTimeNanos - startTimeNanos;
- }
-
- /**
- * Returns how long this class initialization took.
- */
- int exclusiveTimeMicros() {
- long exclusive = inclusiveTimeNanos();
-
- for (Operation child : subops) {
- exclusive -= child.inclusiveTimeNanos();
- }
-
- if (exclusive < 0) {
- throw new AssertionError(loadedClass.name);
- }
-
- return nanosToMicros(exclusive);
- }
-
- /** Gets the median time that this operation took across all processes. */
- int medianExclusiveTimeMicros() {
- switch (type) {
- case LOAD: return loadedClass.medianLoadTimeMicros();
- case INIT: return loadedClass.medianInitTimeMicros();
- default: throw new AssertionError();
- }
- }
-
- /**
- * Converts nanoseconds to microseconds.
- *
- * @throws RuntimeException if overflow occurs
- */
- private static int nanosToMicros(long nanos) {
- long micros = nanos / 1000;
- int microsInt = (int) micros;
- if (microsInt != micros) {
- throw new RuntimeException("Integer overflow: " + nanos);
- }
- return microsInt;
- }
-
- /**
- * Primarily for debugger support
- */
- @Override
- public String toString() {
- StringBuilder sb = new StringBuilder();
- sb.append(type.toString());
- sb.append(' ');
- sb.append(loadedClass.toString());
- if (subops.size() > 0) {
- sb.append(" (");
- sb.append(subops.size());
- sb.append(" sub ops)");
- }
- return sb.toString();
- }
-
-}
diff --git a/tools/preload/Policy.java b/tools/preload/Policy.java
deleted file mode 100644
index af46820..0000000
--- a/tools/preload/Policy.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * 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.
- */
-
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.Set;
-
-/**
- * Policy that governs which classes are preloaded.
- */
-public class Policy {
-
- /**
- * No constructor - use static methods only
- */
- private Policy() {}
-
- /**
- * This location (in the build system) of the preloaded-classes file.
- */
- static final String PRELOADED_CLASS_FILE
- = "frameworks/base/preloaded-classes";
-
- /**
- * Long running services. These are restricted in their contribution to the
- * preloader because their launch time is less critical.
- */
- // TODO: Generate this automatically from package manager.
- private static final Set<String> SERVICES = new HashSet<String>(Arrays.asList(
- "system_server",
- "com.google.process.content",
- "android.process.media",
- "com.android.bluetooth",
- "com.android.calendar",
- "com.android.inputmethod.latin",
- "com.android.phone",
- "com.google.android.apps.maps.FriendService", // pre froyo
- "com.google.android.apps.maps:FriendService", // froyo
- "com.google.android.apps.maps.LocationFriendService",
- "com.google.android.deskclock",
- "com.google.process.gapps",
- "android.tts"
- ));
-
- /**
- * Classes which we shouldn't load from the Zygote.
- */
- private static final Set<String> EXCLUDED_CLASSES
- = new HashSet<String>(Arrays.asList(
- // Binders
- "android.app.AlarmManager",
- "android.app.SearchManager",
- "android.os.FileObserver",
- "com.android.server.PackageManagerService$AppDirObserver",
-
- // Threads
- "android.os.AsyncTask",
- "android.pim.ContactsAsyncHelper",
- "android.webkit.WebViewClassic$1",
- "java.lang.ProcessManager"
- ));
-
- /**
- * Returns true if the given process name is a "long running" process or
- * service.
- */
- public static boolean isService(String processName) {
- return SERVICES.contains(processName);
- }
-
- /** Reports if the given class should be preloaded. */
- public static boolean isPreloadable(LoadedClass clazz) {
- return clazz.systemClass && !EXCLUDED_CLASSES.contains(clazz.name)
- && !clazz.name.endsWith("$NoPreloadHolder");
- }
-}
diff --git a/tools/preload/PrintCsv.java b/tools/preload/PrintCsv.java
deleted file mode 100644
index 1820830..0000000
--- a/tools/preload/PrintCsv.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * 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.
- */
-
-import java.io.IOException;
-import java.io.FileInputStream;
-import java.io.ObjectInputStream;
-import java.io.BufferedInputStream;
-import java.io.Writer;
-import java.io.PrintStream;
-import java.util.Set;
-import java.util.HashSet;
-import java.util.TreeSet;
-import java.util.Iterator;
-
-/**
- * Prints raw information in CSV format.
- */
-public class PrintCsv {
-
- public static void main(String[] args)
- throws IOException, ClassNotFoundException {
- if (args.length != 1) {
- System.err.println("Usage: PrintCsv [compiled log file]");
- System.exit(0);
- }
-
- Root root = Root.fromFile(args[0]);
-
- printHeaders(System.out);
-
- MemoryUsage baseline = MemoryUsage.baseline();
-
- for (LoadedClass loadedClass : root.loadedClasses.values()) {
- if (!loadedClass.systemClass) {
- continue;
- }
-
- printRow(System.out, baseline, loadedClass);
- }
- }
-
- static void printHeaders(PrintStream out) {
- out.println("Name"
- + ",Preloaded"
- + ",Median Load Time (us)"
- + ",Median Init Time (us)"
- + ",Process Names"
- + ",Load Count"
- + ",Init Count"
- + ",Managed Heap (B)"
- + ",Native Heap (B)"
- + ",Managed Pages (kB)"
- + ",Native Pages (kB)"
- + ",Other Pages (kB)");
- }
-
- static void printRow(PrintStream out, MemoryUsage baseline,
- LoadedClass loadedClass) {
- out.print(loadedClass.name);
- out.print(',');
- out.print(loadedClass.preloaded);
- out.print(',');
- out.print(loadedClass.medianLoadTimeMicros());
- out.print(',');
- out.print(loadedClass.medianInitTimeMicros());
- out.print(',');
- out.print('"');
-
- Set<String> procNames = new TreeSet<String>();
- for (Operation op : loadedClass.loads)
- procNames.add(op.process.name);
- for (Operation op : loadedClass.initializations)
- procNames.add(op.process.name);
-
- if (procNames.size() <= 3) {
- for (String name : procNames) {
- out.print(name + "\n");
- }
- } else {
- Iterator<String> i = procNames.iterator();
- out.print(i.next() + "\n");
- out.print(i.next() + "\n");
- out.print("...and " + (procNames.size() - 2)
- + " others.");
- }
-
- out.print('"');
- out.print(',');
- out.print(loadedClass.loads.size());
- out.print(',');
- out.print(loadedClass.initializations.size());
-
- if (loadedClass.memoryUsage.isAvailable()) {
- MemoryUsage subtracted
- = loadedClass.memoryUsage.subtract(baseline);
-
- out.print(',');
- out.print(subtracted.javaHeapSize());
- out.print(',');
- out.print(subtracted.nativeHeapSize);
- out.print(',');
- out.print(subtracted.javaPagesInK());
- out.print(',');
- out.print(subtracted.nativePagesInK());
- out.print(',');
- out.print(subtracted.otherPagesInK());
-
- } else {
- out.print(",n/a,n/a,n/a,n/a,n/a");
- }
-
- out.println();
- }
-}
diff --git a/tools/preload/PrintHtmlDiff.java b/tools/preload/PrintHtmlDiff.java
deleted file mode 100644
index b101c85..0000000
--- a/tools/preload/PrintHtmlDiff.java
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * 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.
- */
-
-import java.io.IOException;
-import java.io.FileReader;
-import java.io.BufferedReader;
-import java.io.PrintStream;
-import java.util.Set;
-import java.util.TreeSet;
-import java.util.HashSet;
-import java.util.Iterator;
-
-/**
- * Prints HTML containing removed and added files.
- */
-public class PrintHtmlDiff {
-
- private static final String OLD_PRELOADED_CLASSES
- = "old-preloaded-classes";
-
- public static void main(String[] args) throws IOException,
- ClassNotFoundException {
- Root root = Root.fromFile(args[0]);
-
- BufferedReader oldClasses = new BufferedReader(
- new FileReader(OLD_PRELOADED_CLASSES));
-
- // Classes loaded implicitly by the zygote.
- Set<LoadedClass> zygote = new HashSet<LoadedClass>();
- for (Proc proc : root.processes.values()) {
- if (proc.name.equals("zygote")) {
- for (Operation op : proc.operations) {
- zygote.add(op.loadedClass);
- }
- break;
- }
- }
-
- Set<LoadedClass> removed = new TreeSet<LoadedClass>();
- Set<LoadedClass> added = new TreeSet<LoadedClass>();
-
- for (LoadedClass loadedClass : root.loadedClasses.values()) {
- if (loadedClass.preloaded && !zygote.contains(loadedClass)) {
- added.add(loadedClass);
- }
- }
-
- String line;
- while ((line = oldClasses.readLine()) != null) {
- line = line.trim();
- LoadedClass clazz = root.loadedClasses.get(line);
- if (clazz != null) {
- added.remove(clazz);
- if (!clazz.preloaded) removed.add(clazz);
- }
- }
-
- PrintStream out = System.out;
-
- out.println("<html><body>");
- out.println("<style>");
- out.println("a, th, td, h2 { font-family: arial }");
- out.println("th, td { font-size: small }");
- out.println("</style>");
- out.println("<script src=\"sorttable.js\"></script>");
- out.println("<p><a href=\"#removed\">Removed</a>");
- out.println("<a name=\"added\"/><h2>Added</h2>");
- printTable(out, root.baseline, added);
- out.println("<a name=\"removed\"/><h2>Removed</h2>");
- printTable(out, root.baseline, removed);
- out.println("</body></html>");
- }
-
- static void printTable(PrintStream out, MemoryUsage baseline,
- Iterable<LoadedClass> classes) {
- out.println("<table border=\"1\" cellpadding=\"5\""
- + " class=\"sortable\">");
-
- out.println("<thead><tr>");
- out.println("<th>Name</th>");
- out.println("<th>Load Time (us)</th>");
- out.println("<th>Loaded By</th>");
- out.println("<th>Heap (B)</th>");
- out.println("<th>Pages</th>");
- out.println("</tr></thead>");
-
- for (LoadedClass clazz : classes) {
- out.println("<tr>");
- out.println("<td>" + clazz.name + "</td>");
- out.println("<td>" + clazz.medianTimeMicros() + "</td>");
-
- out.println("<td>");
- Set<String> procNames = new TreeSet<String>();
- for (Operation op : clazz.loads) procNames.add(op.process.name);
- for (Operation op : clazz.initializations) {
- procNames.add(op.process.name);
- }
- if (procNames.size() <= 3) {
- for (String name : procNames) {
- out.print(name + "<br/>");
- }
- } else {
- Iterator<String> i = procNames.iterator();
- out.print(i.next() + "<br/>");
- out.print(i.next() + "<br/>");
- out.print("...and " + (procNames.size() - 2)
- + " others.");
- }
- out.println("</td>");
-
- if (clazz.memoryUsage.isAvailable()) {
- MemoryUsage subtracted
- = clazz.memoryUsage.subtract(baseline);
-
- out.println("<td>" + (subtracted.javaHeapSize()
- + subtracted.nativeHeapSize) + "</td>");
- out.println("<td>" + subtracted.totalPages() + "</td>");
- } else {
- for (int i = 0; i < 2; i++) {
- out.println("<td>n/a</td>");
- }
- }
-
- out.println("</tr>");
- }
-
- out.println("</table>");
- }
-}
diff --git a/tools/preload/PrintPsTree.java b/tools/preload/PrintPsTree.java
deleted file mode 100644
index 22701fa..0000000
--- a/tools/preload/PrintPsTree.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * 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.
- */
-
-import java.io.IOException;
-import java.io.FileInputStream;
-import java.io.ObjectInputStream;
-import java.io.BufferedInputStream;
-
-/**
- * Prints raw information in CSV format.
- */
-public class PrintPsTree {
-
- public static void main(String[] args)
- throws IOException, ClassNotFoundException {
- if (args.length != 1) {
- System.err.println("Usage: PrintCsv [compiled log file]");
- System.exit(0);
- }
-
- FileInputStream fin = new FileInputStream(args[0]);
- ObjectInputStream oin = new ObjectInputStream(
- new BufferedInputStream(fin));
-
- Root root = (Root) oin.readObject();
-
- for (Proc proc : root.processes.values()) {
- if (proc.parent == null) {
- proc.print();
- }
- }
- }
-}
diff --git a/tools/preload/Proc.java b/tools/preload/Proc.java
deleted file mode 100644
index 2105021..0000000
--- a/tools/preload/Proc.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/*
- * 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.
- */
-
-import java.util.List;
-import java.util.ArrayList;
-import java.util.LinkedList;
-import java.util.Map;
-import java.util.HashMap;
-import java.io.Serializable;
-
-/**
- * A Dalvik process.
- */
-class Proc implements Serializable {
-
- private static final long serialVersionUID = 0;
-
- /** Parent process. */
- final Proc parent;
-
- /** Process ID. */
- final int id;
-
- /**
- * Name of this process. We may not have the correct name at first, i.e.
- * some classes could have been loaded before the process name was set.
- */
- String name;
-
- /** Child processes. */
- final List<Proc> children = new ArrayList<Proc>();
-
- /** Maps thread ID to operation stack. */
- transient final Map<Integer, LinkedList<Operation>> stacks
- = new HashMap<Integer, LinkedList<Operation>>();
-
- /** Number of operations. */
- int operationCount;
-
- /** Sequential list of operations that happened in this process. */
- final List<Operation> operations = new ArrayList<Operation>();
-
- /** List of past process names. */
- final List<String> nameHistory = new ArrayList<String>();
-
- /** Constructs a new process. */
- Proc(Proc parent, int id) {
- this.parent = parent;
- this.id = id;
- }
-
- /** Sets name of this process. */
- void setName(String name) {
- if (!name.equals(this.name)) {
- if (this.name != null) {
- nameHistory.add(this.name);
- }
- this.name = name;
- }
- }
-
- /**
- * Returns true if this process comes from the zygote.
- */
- public boolean fromZygote() {
- return parent != null && parent.name.equals("zygote")
- && !name.equals("com.android.development");
- }
-
- /**
- * Starts an operation.
- *
- * @param threadId thread the operation started in
- * @param loadedClass class operation happened to
- * @param time the operation started
- */
- void startOperation(int threadId, LoadedClass loadedClass, long time,
- Operation.Type type) {
- Operation o = new Operation(
- this, loadedClass, time, operationCount++, type);
- operations.add(o);
-
- LinkedList<Operation> stack = stacks.get(threadId);
- if (stack == null) {
- stack = new LinkedList<Operation>();
- stacks.put(threadId, stack);
- }
-
- if (!stack.isEmpty()) {
- stack.getLast().subops.add(o);
- }
-
- stack.add(o);
- }
-
- /**
- * Ends an operation.
- *
- * @param threadId thread the operation ended in
- * @param loadedClass class operation happened to
- * @param time the operation ended
- */
- Operation endOperation(int threadId, String className,
- LoadedClass loadedClass, long time) {
- LinkedList<Operation> stack = stacks.get(threadId);
-
- if (stack == null || stack.isEmpty()) {
- didNotStart(className);
- return null;
- }
-
- Operation o = stack.getLast();
- if (loadedClass != o.loadedClass) {
- didNotStart(className);
- return null;
- }
-
- stack.removeLast();
-
- o.endTimeNanos = time;
- return o;
- }
-
- /**
- * Prints an error indicating that we saw the end of an operation but not
- * the start. A bug in the logging framework which results in dropped logs
- * causes this.
- */
- private static void didNotStart(String name) {
- System.err.println("Warning: An operation ended on " + name
- + " but it never started!");
- }
-
- /**
- * Prints this process tree to stdout.
- */
- void print() {
- print("");
- }
-
- /**
- * Prints a child proc to standard out.
- */
- private void print(String prefix) {
- System.out.println(prefix + "id=" + id + ", name=" + name);
- for (Proc child : children) {
- child.print(prefix + " ");
- }
- }
-
- @Override
- public String toString() {
- return this.name;
- }
-}
diff --git a/tools/preload/Record.java b/tools/preload/Record.java
deleted file mode 100644
index d0a2af4..0000000
--- a/tools/preload/Record.java
+++ /dev/null
@@ -1,182 +0,0 @@
-/*
- * 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.
- */
-
-/**
- * One line from the loaded-classes file.
- */
-class Record {
-
- /**
- * The delimiter character we use, {@code :}, conflicts with some other
- * names. In that case, manually replace the delimiter with something else.
- */
- private static final String[] REPLACE_CLASSES = {
- "com.google.android.apps.maps:FriendService",
- "com.google.android.apps.maps\\u003AFriendService",
- "com.google.android.apps.maps:driveabout",
- "com.google.android.apps.maps\\u003Adriveabout",
- "com.google.android.apps.maps:GoogleLocationService",
- "com.google.android.apps.maps\\u003AGoogleLocationService",
- "com.google.android.apps.maps:LocationFriendService",
- "com.google.android.apps.maps\\u003ALocationFriendService",
- "com.google.android.apps.maps:MapsBackgroundService",
- "com.google.android.apps.maps\\u003AMapsBackgroundService",
- "com.google.android.apps.maps:NetworkLocationService",
- "com.google.android.apps.maps\\u003ANetworkLocationService",
- "com.android.chrome:sandboxed_process",
- "com.android.chrome\\u003Asandboxed_process",
- "com.android.fakeoemfeatures:background",
- "com.android.fakeoemfeatures\\u003Abackground",
- "com.android.fakeoemfeatures:core",
- "com.android.fakeoemfeatures\\u003Acore",
- "com.android.launcher:wallpaper_chooser",
- "com.android.launcher\\u003Awallpaper_chooser",
- "com.android.nfc:handover",
- "com.android.nfc\\u003Ahandover",
- "com.google.android.music:main",
- "com.google.android.music\\u003Amain",
- "com.google.android.music:ui",
- "com.google.android.music\\u003Aui",
- "com.google.android.setupwarlock:broker",
- "com.google.android.setupwarlock\\u003Abroker",
- "mobi.mgeek.TunnyBrowser:DolphinNotification",
- "mobi.mgeek.TunnyBrowser\\u003ADolphinNotification",
- "com.qo.android.sp.oem:Quickword",
- "com.qo.android.sp.oem\\u003AQuickword",
- "android:ui",
- "android\\u003Aui",
- "system:ui",
- "system\\u003Aui",
- };
-
- enum Type {
- /** Start of initialization. */
- START_LOAD,
-
- /** End of initialization. */
- END_LOAD,
-
- /** Start of initialization. */
- START_INIT,
-
- /** End of initialization. */
- END_INIT
- }
-
- /** Parent process ID. */
- final int ppid;
-
- /** Process ID. */
- final int pid;
-
- /** Thread ID. */
- final int tid;
-
- /** Process name. */
- final String processName;
-
- /** Class loader pointer. */
- final int classLoader;
-
- /** Type of record. */
- final Type type;
-
- /** Name of loaded class. */
- final String className;
-
- /** Record time (ns). */
- final long time;
-
- /** Source file line# */
- int sourceLineNumber;
-
- /**
- * Parses a line from the loaded-classes file.
- */
- Record(String line, int lineNum) {
- char typeChar = line.charAt(0);
- switch (typeChar) {
- case '>': type = Type.START_LOAD; break;
- case '<': type = Type.END_LOAD; break;
- case '+': type = Type.START_INIT; break;
- case '-': type = Type.END_INIT; break;
- default: throw new AssertionError("Bad line: " + line);
- }
-
- sourceLineNumber = lineNum;
-
- for (int i = 0; i < REPLACE_CLASSES.length; i+= 2) {
- line = line.replace(REPLACE_CLASSES[i], REPLACE_CLASSES[i+1]);
- }
-
- line = line.substring(1);
- String[] parts = line.split(":");
-
- ppid = Integer.parseInt(parts[0]);
- pid = Integer.parseInt(parts[1]);
- tid = Integer.parseInt(parts[2]);
-
- processName = decode(parts[3]).intern();
-
- classLoader = Integer.parseInt(parts[4]);
- className = vmTypeToLanguage(decode(parts[5])).intern();
-
- time = Long.parseLong(parts[6]);
- }
-
- /**
- * Decode any escaping that may have been written to the log line.
- *
- * Supports unicode-style escaping: \\uXXXX = character in hex
- *
- * @param rawField the field as it was written into the log
- * @result the same field with any escaped characters replaced
- */
- String decode(String rawField) {
- String result = rawField;
- int offset = result.indexOf("\\u");
- while (offset >= 0) {
- String before = result.substring(0, offset);
- String escaped = result.substring(offset+2, offset+6);
- String after = result.substring(offset+6);
-
- result = String.format("%s%c%s", before, Integer.parseInt(escaped, 16), after);
-
- // find another but don't recurse
- offset = result.indexOf("\\u", offset + 1);
- }
- return result;
- }
-
- /**
- * Converts a VM-style name to a language-style name.
- */
- String vmTypeToLanguage(String typeName) {
- // if the typename is (null), just return it as-is. This is probably in dexopt and
- // will be discarded anyway. NOTE: This corresponds to the case in dalvik/vm/oo/Class.c
- // where dvmLinkClass() returns false and we clean up and exit.
- if ("(null)".equals(typeName)) {
- return typeName;
- }
-
- if (!typeName.startsWith("L") || !typeName.endsWith(";") ) {
- throw new AssertionError("Bad name: " + typeName + " in line " + sourceLineNumber);
- }
-
- typeName = typeName.substring(1, typeName.length() - 1);
- return typeName.replace("/", ".");
- }
-}
diff --git a/tools/preload/Root.java b/tools/preload/Root.java
deleted file mode 100644
index 0bc29bf..0000000
--- a/tools/preload/Root.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/*
- * 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.
- */
-
-import java.io.Serializable;
-import java.io.IOException;
-import java.io.Writer;
-import java.io.BufferedWriter;
-import java.io.OutputStreamWriter;
-import java.io.FileOutputStream;
-import java.io.FileInputStream;
-import java.io.ObjectInputStream;
-import java.io.BufferedInputStream;
-import java.io.ObjectOutputStream;
-import java.io.BufferedOutputStream;
-import java.util.Map;
-import java.util.HashMap;
-import java.util.Set;
-import java.util.TreeSet;
-import java.util.Arrays;
-import java.nio.charset.Charset;
-
-/**
- * Root of our data model.
- */
-public class Root implements Serializable {
-
- private static final long serialVersionUID = 0;
-
- /** pid -> Proc */
- final Map<Integer, Proc> processes = new HashMap<Integer, Proc>();
-
- /** Class name -> LoadedClass */
- final Map<String, LoadedClass> loadedClasses
- = new HashMap<String, LoadedClass>();
-
- MemoryUsage baseline = MemoryUsage.baseline();
-
- /**
- * Records class loads and initializations.
- */
- void indexClassOperation(Record record) {
- Proc process = processes.get(record.pid);
-
- // Ignore dexopt output. It loads applications classes through the
- // system class loader and messes us up.
- if (record.processName.equals("dexopt")) {
- return;
- }
-
- String name = record.className;
- LoadedClass loadedClass = loadedClasses.get(name);
- Operation o = null;
-
- switch (record.type) {
- case START_LOAD:
- case START_INIT:
- if (loadedClass == null) {
- loadedClass = new LoadedClass(
- name, record.classLoader == 0);
- if (loadedClass.systemClass) {
- // Only measure memory for classes in the boot
- // classpath.
- loadedClass.measureMemoryUsage();
- }
- loadedClasses.put(name, loadedClass);
- }
- break;
-
- case END_LOAD:
- case END_INIT:
- o = process.endOperation(record.tid, record.className,
- loadedClass, record.time);
- if (o == null) {
- return;
- }
- }
-
- switch (record.type) {
- case START_LOAD:
- process.startOperation(record.tid, loadedClass, record.time,
- Operation.Type.LOAD);
- break;
-
- case START_INIT:
- process.startOperation(record.tid, loadedClass, record.time,
- Operation.Type.INIT);
- break;
-
- case END_LOAD:
- loadedClass.loads.add(o);
- break;
-
- case END_INIT:
- loadedClass.initializations.add(o);
- break;
- }
- }
-
- /**
- * Indexes information about the process from the given record.
- */
- void indexProcess(Record record) {
- Proc proc = processes.get(record.pid);
-
- if (proc == null) {
- // Create a new process object.
- Proc parent = processes.get(record.ppid);
- proc = new Proc(parent, record.pid);
- processes.put(proc.id, proc);
- if (parent != null) {
- parent.children.add(proc);
- }
- }
-
- proc.setName(record.processName);
- }
-
- /**
- * Writes this graph to a file.
- */
- void toFile(String fileName) throws IOException {
- FileOutputStream out = new FileOutputStream(fileName);
- ObjectOutputStream oout = new ObjectOutputStream(
- new BufferedOutputStream(out));
-
- System.err.println("Writing object model...");
-
- oout.writeObject(this);
-
- oout.close();
-
- System.err.println("Done!");
- }
-
- /**
- * Reads Root from a file.
- */
- static Root fromFile(String fileName)
- throws IOException, ClassNotFoundException {
- FileInputStream fin = new FileInputStream(fileName);
- ObjectInputStream oin = new ObjectInputStream(
- new BufferedInputStream(fin));
-
- Root root = (Root) oin.readObject();
-
- oin.close();
-
- return root;
- }
-}
diff --git a/tools/preload/WritePreloadedClassFile.java b/tools/preload/WritePreloadedClassFile.java
deleted file mode 100644
index b067bc2..0000000
--- a/tools/preload/WritePreloadedClassFile.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * 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.
- */
-
-import java.io.BufferedWriter;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStreamWriter;
-import java.io.Writer;
-import java.nio.charset.Charset;
-import java.util.Set;
-import java.util.TreeSet;
-
-/**
- * Writes /frameworks/base/preloaded-classes. Also updates
- * {@link LoadedClass#preloaded} fields and writes over compiled log file.
- */
-public class WritePreloadedClassFile {
-
- /**
- * Preload any class that take longer to load than MIN_LOAD_TIME_MICROS us.
- */
- static final int MIN_LOAD_TIME_MICROS = 1250;
-
- /**
- * Preload any class that was loaded by at least MIN_PROCESSES processes.
- */
- static final int MIN_PROCESSES = 10;
-
- public static void main(String[] args) throws IOException,
- ClassNotFoundException {
- if (args.length != 1) {
- System.err.println("Usage: WritePreloadedClassFile [compiled log]");
- System.exit(-1);
- }
- String rootFile = args[0];
- Root root = Root.fromFile(rootFile);
-
- // No classes are preloaded to start.
- for (LoadedClass loadedClass : root.loadedClasses.values()) {
- loadedClass.preloaded = false;
- }
-
- // Open preloaded-classes file for output.
- Writer out = new BufferedWriter(new OutputStreamWriter(
- new FileOutputStream(Policy.PRELOADED_CLASS_FILE),
- Charset.forName("US-ASCII")));
-
- out.write("# Classes which are preloaded by"
- + " com.android.internal.os.ZygoteInit.\n");
- out.write("# Automatically generated by frameworks/base/tools/preload/"
- + WritePreloadedClassFile.class.getSimpleName() + ".java.\n");
- out.write("# MIN_LOAD_TIME_MICROS=" + MIN_LOAD_TIME_MICROS + "\n");
- out.write("# MIN_PROCESSES=" + MIN_PROCESSES + "\n");
-
- /*
- * The set of classes to preload. We preload a class if:
- *
- * a) it's loaded in the bootclasspath (i.e., is a system class)
- * b) it takes > MIN_LOAD_TIME_MICROS us to load, and
- * c) it's loaded by more than one process, or it's loaded by an
- * application (i.e., not a long running service)
- */
- Set<LoadedClass> toPreload = new TreeSet<LoadedClass>();
-
- // Preload classes that were loaded by at least 2 processes. Hopefully,
- // the memory associated with these classes will be shared.
- for (LoadedClass loadedClass : root.loadedClasses.values()) {
- Set<String> names = loadedClass.processNames();
- if (!Policy.isPreloadable(loadedClass)) {
- continue;
- }
-
- if (names.size() >= MIN_PROCESSES ||
- (loadedClass.medianTimeMicros() > MIN_LOAD_TIME_MICROS && names.size() > 1)) {
- toPreload.add(loadedClass);
- }
- }
-
- int initialSize = toPreload.size();
- System.out.println(initialSize
- + " classses were loaded by more than one app.");
-
- // Preload eligable classes from applications (not long-running
- // services).
- for (Proc proc : root.processes.values()) {
- if (proc.fromZygote() && !Policy.isService(proc.name)) {
- for (Operation operation : proc.operations) {
- LoadedClass loadedClass = operation.loadedClass;
- if (shouldPreload(loadedClass)) {
- toPreload.add(loadedClass);
- }
- }
- }
- }
-
- System.out.println("Added " + (toPreload.size() - initialSize)
- + " more to speed up applications.");
-
- System.out.println(toPreload.size()
- + " total classes will be preloaded.");
-
- // Make classes that were implicitly loaded by the zygote explicit.
- // This adds minimal overhead but avoid confusion about classes not
- // appearing in the list.
- addAllClassesFrom("zygote", root, toPreload);
-
- for (LoadedClass loadedClass : toPreload) {
- out.write(loadedClass.name + "\n");
- }
-
- out.close();
-
- // Update data to reflect LoadedClass.preloaded changes.
- for (LoadedClass loadedClass : toPreload) {
- loadedClass.preloaded = true;
- }
- root.toFile(rootFile);
- }
-
- private static void addAllClassesFrom(String processName, Root root,
- Set<LoadedClass> toPreload) {
- for (Proc proc : root.processes.values()) {
- if (proc.name.equals(processName)) {
- for (Operation operation : proc.operations) {
- boolean preloadable
- = Policy.isPreloadable(operation.loadedClass);
- if (preloadable) {
- toPreload.add(operation.loadedClass);
- }
- }
- }
- }
- }
-
- /**
- * Returns true if the class should be preloaded.
- */
- private static boolean shouldPreload(LoadedClass clazz) {
- return Policy.isPreloadable(clazz)
- && clazz.medianTimeMicros() > MIN_LOAD_TIME_MICROS;
- }
-}
diff --git a/tools/preload/loadclass/Android.mk b/tools/preload/loadclass/Android.mk
deleted file mode 100644
index 65828be..0000000
--- a/tools/preload/loadclass/Android.mk
+++ /dev/null
@@ -1,9 +0,0 @@
-LOCAL_PATH := $(call my-dir)
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := $(call all-subdir-java-files)
-LOCAL_MODULE_TAGS := tests
-
-LOCAL_MODULE := loadclass
-
-include $(BUILD_JAVA_LIBRARY)
diff --git a/tools/preload/loadclass/LoadClass.java b/tools/preload/loadclass/LoadClass.java
deleted file mode 100644
index a71b6a8..0000000
--- a/tools/preload/loadclass/LoadClass.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * 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.
- */
-
-import android.util.Log;
-import android.os.Debug;
-
-/**
- * Loads a class, runs the garbage collector, and prints showmap output.
- *
- * <p>Usage: dalvikvm LoadClass [class name]
- */
-class LoadClass {
-
- public static void main(String[] args) {
- System.loadLibrary("android_runtime");
-
- if (registerNatives() < 0) {
- throw new RuntimeException("Error registering natives.");
- }
-
- Debug.startAllocCounting();
-
- if (args.length > 0) {
- try {
- long start = System.currentTimeMillis();
- Class.forName(args[0]);
- long elapsed = System.currentTimeMillis() - start;
- Log.i("LoadClass", "Loaded " + args[0] + " in " + elapsed
- + "ms.");
- } catch (ClassNotFoundException e) {
- Log.w("LoadClass", e);
- return;
- }
- }
-
- System.gc();
-
- int allocCount = Debug.getGlobalAllocCount();
- int allocSize = Debug.getGlobalAllocSize();
- int freedCount = Debug.getGlobalFreedCount();
- int freedSize = Debug.getGlobalFreedSize();
- long nativeHeapSize = Debug.getNativeHeapSize();
-
- Debug.stopAllocCounting();
-
- StringBuilder response = new StringBuilder("DECAFBAD");
-
- int[] pages = new int[6];
- Debug.MemoryInfo memoryInfo = new Debug.MemoryInfo();
- Debug.getMemoryInfo(memoryInfo);
- response.append(',').append(memoryInfo.nativeSharedDirty);
- response.append(',').append(memoryInfo.dalvikSharedDirty);
- response.append(',').append(memoryInfo.otherSharedDirty);
- response.append(',').append(memoryInfo.nativePrivateDirty);
- response.append(',').append(memoryInfo.dalvikPrivateDirty);
- response.append(',').append(memoryInfo.otherPrivateDirty);
-
- response.append(',').append(allocCount);
- response.append(',').append(allocSize);
- response.append(',').append(freedCount);
- response.append(',').append(freedSize);
- response.append(',').append(nativeHeapSize);
-
- System.out.println(response.toString());
- }
-
- /**
- * Registers native functions. See AndroidRuntime.cpp.
- */
- static native int registerNatives();
-}
diff --git a/tools/preload/preload.iml b/tools/preload/preload.iml
deleted file mode 100644
index 2d87c55..0000000
--- a/tools/preload/preload.iml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<module relativePaths="true" type="JAVA_MODULE" version="4">
- <component name="NewModuleRootManager" inherit-compiler-output="false">
- <output url="file:///tmp/preload" />
- <output-test url="file:///tmp/preload" />
- <exclude-output />
- <content url="file://$MODULE_DIR$">
- <sourceFolder url="file://$MODULE_DIR$" isTestSource="false" />
- </content>
- <orderEntry type="inheritedJdk" />
- <orderEntry type="sourceFolder" forTests="false" />
- </component>
-</module>
-
diff --git a/tools/preload/preload.ipr b/tools/preload/preload.ipr
deleted file mode 100644
index 0c9621c..0000000
--- a/tools/preload/preload.ipr
+++ /dev/null
@@ -1,495 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project relativePaths="false" version="4">
- <component name="AntConfiguration">
- <defaultAnt bundledAnt="true" />
- </component>
- <component name="BuildJarProjectSettings">
- <option name="BUILD_JARS_ON_MAKE" value="false" />
- </component>
- <component name="ChangeBrowserSettings">
- <option name="MAIN_SPLITTER_PROPORTION" value="0.3" />
- <option name="MESSAGES_SPLITTER_PROPORTION" value="0.8" />
- <option name="USE_DATE_BEFORE_FILTER" value="false" />
- <option name="USE_DATE_AFTER_FILTER" value="false" />
- <option name="USE_CHANGE_BEFORE_FILTER" value="false" />
- <option name="USE_CHANGE_AFTER_FILTER" value="false" />
- <option name="DATE_BEFORE" value="" />
- <option name="DATE_AFTER" value="" />
- <option name="CHANGE_BEFORE" value="" />
- <option name="CHANGE_AFTER" value="" />
- <option name="USE_USER_FILTER" value="false" />
- <option name="USER" value="" />
- </component>
- <component name="CodeStyleProjectProfileManger">
- <option name="PROJECT_PROFILE" />
- <option name="USE_PROJECT_LEVEL_SETTINGS" value="false" />
- </component>
- <component name="CodeStyleSettingsManager">
- <option name="PER_PROJECT_SETTINGS">
- <value>
- <ADDITIONAL_INDENT_OPTIONS fileType="java">
- <option name="INDENT_SIZE" value="4" />
- <option name="CONTINUATION_INDENT_SIZE" value="8" />
- <option name="TAB_SIZE" value="4" />
- <option name="USE_TAB_CHARACTER" value="false" />
- <option name="SMART_TABS" value="false" />
- <option name="LABEL_INDENT_SIZE" value="0" />
- <option name="LABEL_INDENT_ABSOLUTE" value="false" />
- </ADDITIONAL_INDENT_OPTIONS>
- <ADDITIONAL_INDENT_OPTIONS fileType="xml">
- <option name="INDENT_SIZE" value="4" />
- <option name="CONTINUATION_INDENT_SIZE" value="8" />
- <option name="TAB_SIZE" value="4" />
- <option name="USE_TAB_CHARACTER" value="false" />
- <option name="SMART_TABS" value="false" />
- <option name="LABEL_INDENT_SIZE" value="0" />
- <option name="LABEL_INDENT_ABSOLUTE" value="false" />
- </ADDITIONAL_INDENT_OPTIONS>
- </value>
- </option>
- <option name="USE_PER_PROJECT_SETTINGS" value="false" />
- </component>
- <component name="CompilerConfiguration">
- <option name="DEFAULT_COMPILER" value="Javac" />
- <option name="DEPLOY_AFTER_MAKE" value="0" />
- <resourceExtensions>
- <entry name=".+\.(properties|xml|html|dtd|tld)" />
- <entry name=".+\.(gif|png|jpeg|jpg)" />
- </resourceExtensions>
- <wildcardResourcePatterns>
- <entry name="?*.properties" />
- <entry name="?*.xml" />
- <entry name="?*.gif" />
- <entry name="?*.png" />
- <entry name="?*.jpeg" />
- <entry name="?*.jpg" />
- <entry name="?*.html" />
- <entry name="?*.dtd" />
- <entry name="?*.tld" />
- </wildcardResourcePatterns>
- </component>
- <component name="Cvs2Configuration">
- <option name="PRUNE_EMPTY_DIRECTORIES" value="true" />
- <option name="MERGING_MODE" value="0" />
- <option name="MERGE_WITH_BRANCH1_NAME" value="HEAD" />
- <option name="MERGE_WITH_BRANCH2_NAME" value="HEAD" />
- <option name="RESET_STICKY" value="false" />
- <option name="CREATE_NEW_DIRECTORIES" value="true" />
- <option name="DEFAULT_TEXT_FILE_SUBSTITUTION" value="kv" />
- <option name="PROCESS_UNKNOWN_FILES" value="false" />
- <option name="PROCESS_DELETED_FILES" value="false" />
- <option name="PROCESS_IGNORED_FILES" value="false" />
- <option name="RESERVED_EDIT" value="false" />
- <option name="CHECKOUT_DATE_OR_REVISION_SETTINGS">
- <value>
- <option name="BRANCH" value="" />
- <option name="DATE" value="" />
- <option name="USE_BRANCH" value="false" />
- <option name="USE_DATE" value="false" />
- </value>
- </option>
- <option name="UPDATE_DATE_OR_REVISION_SETTINGS">
- <value>
- <option name="BRANCH" value="" />
- <option name="DATE" value="" />
- <option name="USE_BRANCH" value="false" />
- <option name="USE_DATE" value="false" />
- </value>
- </option>
- <option name="SHOW_CHANGES_REVISION_SETTINGS">
- <value>
- <option name="BRANCH" value="" />
- <option name="DATE" value="" />
- <option name="USE_BRANCH" value="false" />
- <option name="USE_DATE" value="false" />
- </value>
- </option>
- <option name="SHOW_OUTPUT" value="false" />
- <option name="ADD_WATCH_INDEX" value="0" />
- <option name="REMOVE_WATCH_INDEX" value="0" />
- <option name="UPDATE_KEYWORD_SUBSTITUTION" />
- <option name="MAKE_NEW_FILES_READONLY" value="false" />
- <option name="SHOW_CORRUPTED_PROJECT_FILES" value="0" />
- <option name="TAG_AFTER_PROJECT_COMMIT" value="false" />
- <option name="OVERRIDE_EXISTING_TAG_FOR_PROJECT" value="true" />
- <option name="TAG_AFTER_PROJECT_COMMIT_NAME" value="" />
- <option name="CLEAN_COPY" value="false" />
- </component>
- <component name="DependenciesAnalyzeManager">
- <option name="myForwardDirection" value="false" />
- </component>
- <component name="DependencyValidationManager">
- <option name="SKIP_IMPORT_STATEMENTS" value="false" />
- </component>
- <component name="EclipseCompilerSettings">
- <option name="DEBUGGING_INFO" value="true" />
- <option name="GENERATE_NO_WARNINGS" value="true" />
- <option name="DEPRECATION" value="false" />
- <option name="ADDITIONAL_OPTIONS_STRING" value="" />
- <option name="MAXIMUM_HEAP_SIZE" value="128" />
- </component>
- <component name="EclipseEmbeddedCompilerSettings">
- <option name="DEBUGGING_INFO" value="true" />
- <option name="GENERATE_NO_WARNINGS" value="true" />
- <option name="DEPRECATION" value="false" />
- <option name="ADDITIONAL_OPTIONS_STRING" value="" />
- <option name="MAXIMUM_HEAP_SIZE" value="128" />
- </component>
- <component name="Encoding" useUTFGuessing="true" native2AsciiForPropertiesFiles="false" />
- <component name="EntryPointsManager">
- <entry_points version="2.0" />
- </component>
- <component name="ExportToHTMLSettings">
- <option name="PRINT_LINE_NUMBERS" value="false" />
- <option name="OPEN_IN_BROWSER" value="false" />
- <option name="OUTPUT_DIRECTORY" />
- </component>
- <component name="IdProvider" IDEtalkID="D171F99B9178C1675593DC9A76A5CC7E" />
- <component name="InspectionProjectProfileManager">
- <option name="PROJECT_PROFILE" value="Project Default" />
- <option name="USE_PROJECT_PROFILE" value="true" />
- <version value="1.0" />
- <profiles>
- <profile version="1.0" is_locked="false">
- <option name="myName" value="Project Default" />
- <option name="myLocal" value="false" />
- <inspection_tool class="JavaDoc" enabled="false" level="WARNING" enabled_by_default="false">
- <option name="TOP_LEVEL_CLASS_OPTIONS">
- <value>
- <option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
- <option name="REQUIRED_TAGS" value="" />
- </value>
- </option>
- <option name="INNER_CLASS_OPTIONS">
- <value>
- <option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
- <option name="REQUIRED_TAGS" value="" />
- </value>
- </option>
- <option name="METHOD_OPTIONS">
- <value>
- <option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
- <option name="REQUIRED_TAGS" value="@return@param@throws or @exception" />
- </value>
- </option>
- <option name="FIELD_OPTIONS">
- <value>
- <option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
- <option name="REQUIRED_TAGS" value="" />
- </value>
- </option>
- <option name="IGNORE_DEPRECATED" value="false" />
- <option name="IGNORE_JAVADOC_PERIOD" value="true" />
- <option name="myAdditionalJavadocTags" value="" />
- </inspection_tool>
- <inspection_tool class="JavaLangImport" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="OnDemandImport" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="RedundantImport" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="SamePackageImport" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="UnusedImport" enabled="true" level="WARNING" enabled_by_default="true" />
- </profile>
- </profiles>
- <list size="4">
- <item index="0" class="java.lang.String" itemvalue="WARNING" />
- <item index="1" class="java.lang.String" itemvalue="SERVER PROBLEM" />
- <item index="2" class="java.lang.String" itemvalue="INFO" />
- <item index="3" class="java.lang.String" itemvalue="ERROR" />
- </list>
- </component>
- <component name="JavacSettings">
- <option name="DEBUGGING_INFO" value="true" />
- <option name="GENERATE_NO_WARNINGS" value="false" />
- <option name="DEPRECATION" value="true" />
- <option name="ADDITIONAL_OPTIONS_STRING" value="" />
- <option name="MAXIMUM_HEAP_SIZE" value="128" />
- </component>
- <component name="JavadocGenerationManager">
- <option name="OUTPUT_DIRECTORY" />
- <option name="OPTION_SCOPE" value="protected" />
- <option name="OPTION_HIERARCHY" value="true" />
- <option name="OPTION_NAVIGATOR" value="true" />
- <option name="OPTION_INDEX" value="true" />
- <option name="OPTION_SEPARATE_INDEX" value="true" />
- <option name="OPTION_DOCUMENT_TAG_USE" value="false" />
- <option name="OPTION_DOCUMENT_TAG_AUTHOR" value="false" />
- <option name="OPTION_DOCUMENT_TAG_VERSION" value="false" />
- <option name="OPTION_DOCUMENT_TAG_DEPRECATED" value="true" />
- <option name="OPTION_DEPRECATED_LIST" value="true" />
- <option name="OTHER_OPTIONS" value="" />
- <option name="HEAP_SIZE" />
- <option name="LOCALE" />
- <option name="OPEN_IN_BROWSER" value="true" />
- </component>
- <component name="JikesSettings">
- <option name="JIKES_PATH" value="" />
- <option name="DEBUGGING_INFO" value="true" />
- <option name="DEPRECATION" value="true" />
- <option name="GENERATE_NO_WARNINGS" value="false" />
- <option name="IS_EMACS_ERRORS_MODE" value="true" />
- <option name="ADDITIONAL_OPTIONS_STRING" value="" />
- </component>
- <component name="LogConsolePreferences">
- <option name="FILTER_ERRORS" value="false" />
- <option name="FILTER_WARNINGS" value="false" />
- <option name="FILTER_INFO" value="true" />
- <option name="CUSTOM_FILTER" />
- </component>
- <component name="Palette2">
- <group name="Swing">
- <item class="com.intellij.uiDesigner.HSpacer" tooltip-text="Horizontal Spacer" icon="/com/intellij/uiDesigner/icons/hspacer.png" removable="false" auto-create-binding="false" can-attach-label="false">
- <default-constraints vsize-policy="1" hsize-policy="6" anchor="0" fill="1" />
- </item>
- <item class="com.intellij.uiDesigner.VSpacer" tooltip-text="Vertical Spacer" icon="/com/intellij/uiDesigner/icons/vspacer.png" removable="false" auto-create-binding="false" can-attach-label="false">
- <default-constraints vsize-policy="6" hsize-policy="1" anchor="0" fill="2" />
- </item>
- <item class="javax.swing.JPanel" icon="/com/intellij/uiDesigner/icons/panel.png" removable="false" auto-create-binding="false" can-attach-label="false">
- <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3" />
- </item>
- <item class="javax.swing.JScrollPane" icon="/com/intellij/uiDesigner/icons/scrollPane.png" removable="false" auto-create-binding="false" can-attach-label="true">
- <default-constraints vsize-policy="7" hsize-policy="7" anchor="0" fill="3" />
- </item>
- <item class="javax.swing.JButton" icon="/com/intellij/uiDesigner/icons/button.png" removable="false" auto-create-binding="true" can-attach-label="false">
- <default-constraints vsize-policy="0" hsize-policy="3" anchor="0" fill="1" />
- <initial-values>
- <property name="text" value="Button" />
- </initial-values>
- </item>
- <item class="javax.swing.JRadioButton" icon="/com/intellij/uiDesigner/icons/radioButton.png" removable="false" auto-create-binding="true" can-attach-label="false">
- <default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
- <initial-values>
- <property name="text" value="RadioButton" />
- </initial-values>
- </item>
- <item class="javax.swing.JCheckBox" icon="/com/intellij/uiDesigner/icons/checkBox.png" removable="false" auto-create-binding="true" can-attach-label="false">
- <default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
- <initial-values>
- <property name="text" value="CheckBox" />
- </initial-values>
- </item>
- <item class="javax.swing.JLabel" icon="/com/intellij/uiDesigner/icons/label.png" removable="false" auto-create-binding="false" can-attach-label="false">
- <default-constraints vsize-policy="0" hsize-policy="0" anchor="8" fill="0" />
- <initial-values>
- <property name="text" value="Label" />
- </initial-values>
- </item>
- <item class="javax.swing.JTextField" icon="/com/intellij/uiDesigner/icons/textField.png" removable="false" auto-create-binding="true" can-attach-label="true">
- <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
- <preferred-size width="150" height="-1" />
- </default-constraints>
- </item>
- <item class="javax.swing.JPasswordField" icon="/com/intellij/uiDesigner/icons/passwordField.png" removable="false" auto-create-binding="true" can-attach-label="true">
- <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
- <preferred-size width="150" height="-1" />
- </default-constraints>
- </item>
- <item class="javax.swing.JFormattedTextField" icon="/com/intellij/uiDesigner/icons/formattedTextField.png" removable="false" auto-create-binding="true" can-attach-label="true">
- <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
- <preferred-size width="150" height="-1" />
- </default-constraints>
- </item>
- <item class="javax.swing.JTextArea" icon="/com/intellij/uiDesigner/icons/textArea.png" removable="false" auto-create-binding="true" can-attach-label="true">
- <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
- <preferred-size width="150" height="50" />
- </default-constraints>
- </item>
- <item class="javax.swing.JTextPane" icon="/com/intellij/uiDesigner/icons/textPane.png" removable="false" auto-create-binding="true" can-attach-label="true">
- <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
- <preferred-size width="150" height="50" />
- </default-constraints>
- </item>
- <item class="javax.swing.JEditorPane" icon="/com/intellij/uiDesigner/icons/editorPane.png" removable="false" auto-create-binding="true" can-attach-label="true">
- <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
- <preferred-size width="150" height="50" />
- </default-constraints>
- </item>
- <item class="javax.swing.JComboBox" icon="/com/intellij/uiDesigner/icons/comboBox.png" removable="false" auto-create-binding="true" can-attach-label="true">
- <default-constraints vsize-policy="0" hsize-policy="2" anchor="8" fill="1" />
- </item>
- <item class="javax.swing.JTable" icon="/com/intellij/uiDesigner/icons/table.png" removable="false" auto-create-binding="true" can-attach-label="false">
- <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
- <preferred-size width="150" height="50" />
- </default-constraints>
- </item>
- <item class="javax.swing.JList" icon="/com/intellij/uiDesigner/icons/list.png" removable="false" auto-create-binding="true" can-attach-label="false">
- <default-constraints vsize-policy="6" hsize-policy="2" anchor="0" fill="3">
- <preferred-size width="150" height="50" />
- </default-constraints>
- </item>
- <item class="javax.swing.JTree" icon="/com/intellij/uiDesigner/icons/tree.png" removable="false" auto-create-binding="true" can-attach-label="false">
- <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
- <preferred-size width="150" height="50" />
- </default-constraints>
- </item>
- <item class="javax.swing.JTabbedPane" icon="/com/intellij/uiDesigner/icons/tabbedPane.png" removable="false" auto-create-binding="true" can-attach-label="false">
- <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
- <preferred-size width="200" height="200" />
- </default-constraints>
- </item>
- <item class="javax.swing.JSplitPane" icon="/com/intellij/uiDesigner/icons/splitPane.png" removable="false" auto-create-binding="false" can-attach-label="false">
- <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
- <preferred-size width="200" height="200" />
- </default-constraints>
- </item>
- <item class="javax.swing.JSpinner" icon="/com/intellij/uiDesigner/icons/spinner.png" removable="false" auto-create-binding="true" can-attach-label="true">
- <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
- </item>
- <item class="javax.swing.JSlider" icon="/com/intellij/uiDesigner/icons/slider.png" removable="false" auto-create-binding="true" can-attach-label="false">
- <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
- </item>
- <item class="javax.swing.JSeparator" icon="/com/intellij/uiDesigner/icons/separator.png" removable="false" auto-create-binding="false" can-attach-label="false">
- <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3" />
- </item>
- <item class="javax.swing.JProgressBar" icon="/com/intellij/uiDesigner/icons/progressbar.png" removable="false" auto-create-binding="true" can-attach-label="false">
- <default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1" />
- </item>
- <item class="javax.swing.JToolBar" icon="/com/intellij/uiDesigner/icons/toolbar.png" removable="false" auto-create-binding="false" can-attach-label="false">
- <default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1">
- <preferred-size width="-1" height="20" />
- </default-constraints>
- </item>
- <item class="javax.swing.JToolBar$Separator" icon="/com/intellij/uiDesigner/icons/toolbarSeparator.png" removable="false" auto-create-binding="false" can-attach-label="false">
- <default-constraints vsize-policy="0" hsize-policy="0" anchor="0" fill="1" />
- </item>
- <item class="javax.swing.JScrollBar" icon="/com/intellij/uiDesigner/icons/scrollbar.png" removable="false" auto-create-binding="true" can-attach-label="false">
- <default-constraints vsize-policy="6" hsize-policy="0" anchor="0" fill="2" />
- </item>
- </group>
- </component>
- <component name="PerforceChangeBrowserSettings">
- <option name="USE_CLIENT_FILTER" value="true" />
- <option name="CLIENT" value="" />
- </component>
- <component name="ProjectDetails">
- <option name="projectName" value="preload" />
- </component>
- <component name="ProjectFileVersion" converted="true" />
- <component name="ProjectKey">
- <option name="state" value="project:///Volumes/Android/donut/frameworks/base/tools/preload/preload.ipr" />
- </component>
- <component name="ProjectModuleManager">
- <modules>
- <module fileurl="file://$PROJECT_DIR$/preload.iml" filepath="$PROJECT_DIR$/preload.iml" />
- </modules>
- </component>
- <component name="ProjectRootManager" version="2" languageLevel="JDK_1_5" assert-keyword="true" jdk-15="true" project-jdk-name="1.5" project-jdk-type="JavaSDK">
- <output url="file:///tmp/preload" />
- </component>
- <component name="RmicSettings">
- <option name="IS_EANABLED" value="false" />
- <option name="DEBUGGING_INFO" value="true" />
- <option name="GENERATE_NO_WARNINGS" value="false" />
- <option name="GENERATE_IIOP_STUBS" value="false" />
- <option name="ADDITIONAL_OPTIONS_STRING" value="" />
- </component>
- <component name="StarteamConfiguration">
- <option name="SERVER" value="" />
- <option name="PORT" value="49201" />
- <option name="USER" value="" />
- <option name="PASSWORD" value="" />
- <option name="PROJECT" value="" />
- <option name="VIEW" value="" />
- <option name="ALTERNATIVE_WORKING_PATH" value="" />
- <option name="LOCK_ON_CHECKOUT" value="false" />
- <option name="UNLOCK_ON_CHECKIN" value="false" />
- </component>
- <component name="Struts Assistant">
- <option name="showInputs" value="true" />
- <option name="resources">
- <value>
- <option name="strutsPath" />
- <option name="strutsHelp" />
- </value>
- </option>
- <option name="selectedTaglibs" />
- <option name="selectedTaglibs" />
- <option name="myStrutsValidationEnabled" value="true" />
- <option name="myTilesValidationEnabled" value="true" />
- <option name="myValidatorValidationEnabled" value="true" />
- <option name="myReportErrorsAsWarnings" value="true" />
- </component>
- <component name="SvnBranchConfigurationManager">
- <option name="mySupportsUserInfoFilter" value="true" />
- </component>
- <component name="SvnChangesBrowserSettings">
- <option name="USE_AUTHOR_FIELD" value="true" />
- <option name="AUTHOR" value="" />
- <option name="LOCATION" value="" />
- <option name="USE_PROJECT_SETTINGS" value="true" />
- <option name="USE_ALTERNATE_LOCATION" value="false" />
- </component>
- <component name="VCS.FileViewConfiguration">
- <option name="SELECTED_STATUSES" value="DEFAULT" />
- <option name="SELECTED_COLUMNS" value="DEFAULT" />
- <option name="SHOW_FILTERS" value="true" />
- <option name="CUSTOMIZE_VIEW" value="true" />
- <option name="SHOW_FILE_HISTORY_AS_TREE" value="true" />
- </component>
- <component name="VcsDirectoryMappings">
- <mapping directory="" vcs="Perforce" />
- <mapping directory="/Volumes/Android/donut/frameworks/base" vcs="Git" />
- </component>
- <component name="VssConfiguration">
- <option name="CLIENT_PATH" value="" />
- <option name="SRCSAFEINI_PATH" value="" />
- <option name="USER_NAME" value="" />
- <option name="PWD" value="" />
- <option name="VSS_IS_INITIALIZED" value="false" />
- <CheckoutOptions>
- <option name="COMMENT" value="" />
- <option name="DO_NOT_GET_LATEST_VERSION" value="false" />
- <option name="REPLACE_WRITABLE" value="false" />
- <option name="RECURSIVE" value="false" />
- </CheckoutOptions>
- <CheckinOptions>
- <option name="COMMENT" value="" />
- <option name="KEEP_CHECKED_OUT" value="false" />
- <option name="RECURSIVE" value="false" />
- </CheckinOptions>
- <AddOptions>
- <option name="STORE_ONLY_LATEST_VERSION" value="false" />
- <option name="CHECK_OUT_IMMEDIATELY" value="false" />
- <option name="FILE_TYPE" value="0" />
- </AddOptions>
- <UndocheckoutOptions>
- <option name="MAKE_WRITABLE" value="false" />
- <option name="REPLACE_LOCAL_COPY" value="0" />
- <option name="RECURSIVE" value="false" />
- </UndocheckoutOptions>
- <GetOptions>
- <option name="REPLACE_WRITABLE" value="0" />
- <option name="MAKE_WRITABLE" value="false" />
- <option name="ANSWER_NEGATIVELY" value="false" />
- <option name="ANSWER_POSITIVELY" value="false" />
- <option name="RECURSIVE" value="false" />
- <option name="VERSION" />
- </GetOptions>
- <VssConfigurableExcludedFilesTag />
- </component>
- <component name="antWorkspaceConfiguration">
- <option name="IS_AUTOSCROLL_TO_SOURCE" value="false" />
- <option name="FILTER_TARGETS" value="false" />
- </component>
- <component name="com.intellij.ide.util.scopeChooser.ScopeChooserConfigurable" proportions="" version="1">
- <option name="myLastEditedConfigurable" />
- </component>
- <component name="com.intellij.jsf.UserDefinedFacesConfigs">
- <option name="USER_DEFINED_CONFIGS">
- <value>
- <list size="0" />
- </value>
- </option>
- </component>
- <component name="com.intellij.openapi.roots.ui.configuration.projectRoot.ProjectRootMasterDetailsConfigurable" proportions="" version="1">
- <option name="myPlainMode" value="false" />
- <option name="myLastEditedConfigurable" />
- </component>
- <component name="com.intellij.profile.ui.ErrorOptionsConfigurable" proportions="" version="1">
- <option name="myLastEditedConfigurable" />
- </component>
- <component name="uidesigner-configuration">
- <option name="INSTRUMENT_CLASSES" value="true" />
- <option name="COPY_FORMS_RUNTIME_TO_OUTPUT" value="true" />
- <option name="DEFAULT_LAYOUT_MANAGER" value="GridLayoutManager" />
- </component>
-</project>
-
diff --git a/tools/preload/sorttable.js b/tools/preload/sorttable.js
deleted file mode 100644
index 25bccb2..0000000
--- a/tools/preload/sorttable.js
+++ /dev/null
@@ -1,493 +0,0 @@
-/*
- SortTable
- version 2
- 7th April 2007
- Stuart Langridge, http://www.kryogenix.org/code/browser/sorttable/
-
- Instructions:
- Download this file
- Add <script src="sorttable.js"></script> to your HTML
- Add class="sortable" to any table you'd like to make sortable
- Click on the headers to sort
-
- Thanks to many, many people for contributions and suggestions.
- Licenced as X11: http://www.kryogenix.org/code/browser/licence.html
- This basically means: do what you want with it.
-*/
-
-
-var stIsIE = /*@cc_on!@*/false;
-
-sorttable = {
- init: function() {
- // quit if this function has already been called
- if (arguments.callee.done) return;
- // flag this function so we don't do the same thing twice
- arguments.callee.done = true;
- // kill the timer
- if (_timer) clearInterval(_timer);
-
- if (!document.createElement || !document.getElementsByTagName) return;
-
- sorttable.DATE_RE = /^(\d\d?)[\/\.-](\d\d?)[\/\.-]((\d\d)?\d\d)$/;
-
- forEach(document.getElementsByTagName('table'), function(table) {
- if (table.className.search(/\bsortable\b/) != -1) {
- sorttable.makeSortable(table);
- }
- });
-
- },
-
- makeSortable: function(table) {
- if (table.getElementsByTagName('thead').length == 0) {
- // table doesn't have a tHead. Since it should have, create one and
- // put the first table row in it.
- the = document.createElement('thead');
- the.appendChild(table.rows[0]);
- table.insertBefore(the,table.firstChild);
- }
- // Safari doesn't support table.tHead, sigh
- if (table.tHead == null) table.tHead = table.getElementsByTagName('thead')[0];
-
- if (table.tHead.rows.length != 1) return; // can't cope with two header rows
-
- // Sorttable v1 put rows with a class of "sortbottom" at the bottom (as
- // "total" rows, for example). This is B&R, since what you're supposed
- // to do is put them in a tfoot. So, if there are sortbottom rows,
- // for backwards compatibility, move them to tfoot (creating it if needed).
- sortbottomrows = [];
- for (var i=0; i<table.rows.length; i++) {
- if (table.rows[i].className.search(/\bsortbottom\b/) != -1) {
- sortbottomrows[sortbottomrows.length] = table.rows[i];
- }
- }
- if (sortbottomrows) {
- if (table.tFoot == null) {
- // table doesn't have a tfoot. Create one.
- tfo = document.createElement('tfoot');
- table.appendChild(tfo);
- }
- for (var i=0; i<sortbottomrows.length; i++) {
- tfo.appendChild(sortbottomrows[i]);
- }
- delete sortbottomrows;
- }
-
- // work through each column and calculate its type
- headrow = table.tHead.rows[0].cells;
- for (var i=0; i<headrow.length; i++) {
- // manually override the type with a sorttable_type attribute
- if (!headrow[i].className.match(/\bsorttable_nosort\b/)) { // skip this col
- mtch = headrow[i].className.match(/\bsorttable_([a-z0-9]+)\b/);
- if (mtch) { override = mtch[1]; }
- if (mtch && typeof sorttable["sort_"+override] == 'function') {
- headrow[i].sorttable_sortfunction = sorttable["sort_"+override];
- } else {
- headrow[i].sorttable_sortfunction = sorttable.guessType(table,i);
- }
- // make it clickable to sort
- headrow[i].sorttable_columnindex = i;
- headrow[i].sorttable_tbody = table.tBodies[0];
- dean_addEvent(headrow[i],"click", function(e) {
-
- if (this.className.search(/\bsorttable_sorted\b/) != -1) {
- // if we're already sorted by this column, just
- // reverse the table, which is quicker
- sorttable.reverse(this.sorttable_tbody);
- this.className = this.className.replace('sorttable_sorted',
- 'sorttable_sorted_reverse');
- this.removeChild(document.getElementById('sorttable_sortfwdind'));
- sortrevind = document.createElement('span');
- sortrevind.id = "sorttable_sortrevind";
- sortrevind.innerHTML = stIsIE ? '&nbsp<font face="webdings">5</font>' : '&nbsp;&#x25B4;';
- this.appendChild(sortrevind);
- return;
- }
- if (this.className.search(/\bsorttable_sorted_reverse\b/) != -1) {
- // if we're already sorted by this column in reverse, just
- // re-reverse the table, which is quicker
- sorttable.reverse(this.sorttable_tbody);
- this.className = this.className.replace('sorttable_sorted_reverse',
- 'sorttable_sorted');
- this.removeChild(document.getElementById('sorttable_sortrevind'));
- sortfwdind = document.createElement('span');
- sortfwdind.id = "sorttable_sortfwdind";
- sortfwdind.innerHTML = stIsIE ? '&nbsp<font face="webdings">6</font>' : '&nbsp;&#x25BE;';
- this.appendChild(sortfwdind);
- return;
- }
-
- // remove sorttable_sorted classes
- theadrow = this.parentNode;
- forEach(theadrow.childNodes, function(cell) {
- if (cell.nodeType == 1) { // an element
- cell.className = cell.className.replace('sorttable_sorted_reverse','');
- cell.className = cell.className.replace('sorttable_sorted','');
- }
- });
- sortfwdind = document.getElementById('sorttable_sortfwdind');
- if (sortfwdind) { sortfwdind.parentNode.removeChild(sortfwdind); }
- sortrevind = document.getElementById('sorttable_sortrevind');
- if (sortrevind) { sortrevind.parentNode.removeChild(sortrevind); }
-
- this.className += ' sorttable_sorted';
- sortfwdind = document.createElement('span');
- sortfwdind.id = "sorttable_sortfwdind";
- sortfwdind.innerHTML = stIsIE ? '&nbsp<font face="webdings">6</font>' : '&nbsp;&#x25BE;';
- this.appendChild(sortfwdind);
-
- // build an array to sort. This is a Schwartzian transform thing,
- // i.e., we "decorate" each row with the actual sort key,
- // sort based on the sort keys, and then put the rows back in order
- // which is a lot faster because you only do getInnerText once per row
- row_array = [];
- col = this.sorttable_columnindex;
- rows = this.sorttable_tbody.rows;
- for (var j=0; j<rows.length; j++) {
- row_array[row_array.length] = [sorttable.getInnerText(rows[j].cells[col]), rows[j]];
- }
- /* If you want a stable sort, uncomment the following line */
- //sorttable.shaker_sort(row_array, this.sorttable_sortfunction);
- /* and comment out this one */
- row_array.sort(this.sorttable_sortfunction);
-
- tb = this.sorttable_tbody;
- for (var j=0; j<row_array.length; j++) {
- tb.appendChild(row_array[j][1]);
- }
-
- delete row_array;
- });
- }
- }
- },
-
- guessType: function(table, column) {
- // guess the type of a column based on its first non-blank row
- sortfn = sorttable.sort_alpha;
- for (var i=0; i<table.tBodies[0].rows.length; i++) {
- text = sorttable.getInnerText(table.tBodies[0].rows[i].cells[column]);
- if (text != '') {
- if (text.match(/^-?[£$¤]?[\d,.]+%?$/)) {
- return sorttable.sort_numeric;
- }
- // check for a date: dd/mm/yyyy or dd/mm/yy
- // can have / or . or - as separator
- // can be mm/dd as well
- possdate = text.match(sorttable.DATE_RE)
- if (possdate) {
- // looks like a date
- first = parseInt(possdate[1]);
- second = parseInt(possdate[2]);
- if (first > 12) {
- // definitely dd/mm
- return sorttable.sort_ddmm;
- } else if (second > 12) {
- return sorttable.sort_mmdd;
- } else {
- // looks like a date, but we can't tell which, so assume
- // that it's dd/mm (English imperialism!) and keep looking
- sortfn = sorttable.sort_ddmm;
- }
- }
- }
- }
- return sortfn;
- },
-
- getInnerText: function(node) {
- // gets the text we want to use for sorting for a cell.
- // strips leading and trailing whitespace.
- // this is *not* a generic getInnerText function; it's special to sorttable.
- // for example, you can override the cell text with a customkey attribute.
- // it also gets .value for <input> fields.
-
- hasInputs = (typeof node.getElementsByTagName == 'function') &&
- node.getElementsByTagName('input').length;
-
- if (node.getAttribute("sorttable_customkey") != null) {
- return node.getAttribute("sorttable_customkey");
- }
- else if (typeof node.textContent != 'undefined' && !hasInputs) {
- return node.textContent.replace(/^\s+|\s+$/g, '');
- }
- else if (typeof node.innerText != 'undefined' && !hasInputs) {
- return node.innerText.replace(/^\s+|\s+$/g, '');
- }
- else if (typeof node.text != 'undefined' && !hasInputs) {
- return node.text.replace(/^\s+|\s+$/g, '');
- }
- else {
- switch (node.nodeType) {
- case 3:
- if (node.nodeName.toLowerCase() == 'input') {
- return node.value.replace(/^\s+|\s+$/g, '');
- }
- case 4:
- return node.nodeValue.replace(/^\s+|\s+$/g, '');
- break;
- case 1:
- case 11:
- var innerText = '';
- for (var i = 0; i < node.childNodes.length; i++) {
- innerText += sorttable.getInnerText(node.childNodes[i]);
- }
- return innerText.replace(/^\s+|\s+$/g, '');
- break;
- default:
- return '';
- }
- }
- },
-
- reverse: function(tbody) {
- // reverse the rows in a tbody
- newrows = [];
- for (var i=0; i<tbody.rows.length; i++) {
- newrows[newrows.length] = tbody.rows[i];
- }
- for (var i=newrows.length-1; i>=0; i--) {
- tbody.appendChild(newrows[i]);
- }
- delete newrows;
- },
-
- /* sort functions
- each sort function takes two parameters, a and b
- you are comparing a[0] and b[0] */
- sort_numeric: function(a,b) {
- aa = parseFloat(a[0].replace(/[^0-9.-]/g,''));
- if (isNaN(aa)) aa = 0;
- bb = parseFloat(b[0].replace(/[^0-9.-]/g,''));
- if (isNaN(bb)) bb = 0;
- return aa-bb;
- },
- sort_alpha: function(a,b) {
- if (a[0]==b[0]) return 0;
- if (a[0]<b[0]) return -1;
- return 1;
- },
- sort_ddmm: function(a,b) {
- mtch = a[0].match(sorttable.DATE_RE);
- y = mtch[3]; m = mtch[2]; d = mtch[1];
- if (m.length == 1) m = '0'+m;
- if (d.length == 1) d = '0'+d;
- dt1 = y+m+d;
- mtch = b[0].match(sorttable.DATE_RE);
- y = mtch[3]; m = mtch[2]; d = mtch[1];
- if (m.length == 1) m = '0'+m;
- if (d.length == 1) d = '0'+d;
- dt2 = y+m+d;
- if (dt1==dt2) return 0;
- if (dt1<dt2) return -1;
- return 1;
- },
- sort_mmdd: function(a,b) {
- mtch = a[0].match(sorttable.DATE_RE);
- y = mtch[3]; d = mtch[2]; m = mtch[1];
- if (m.length == 1) m = '0'+m;
- if (d.length == 1) d = '0'+d;
- dt1 = y+m+d;
- mtch = b[0].match(sorttable.DATE_RE);
- y = mtch[3]; d = mtch[2]; m = mtch[1];
- if (m.length == 1) m = '0'+m;
- if (d.length == 1) d = '0'+d;
- dt2 = y+m+d;
- if (dt1==dt2) return 0;
- if (dt1<dt2) return -1;
- return 1;
- },
-
- shaker_sort: function(list, comp_func) {
- // A stable sort function to allow multi-level sorting of data
- // see: http://en.wikipedia.org/wiki/Cocktail_sort
- // thanks to Joseph Nahmias
- var b = 0;
- var t = list.length - 1;
- var swap = true;
-
- while(swap) {
- swap = false;
- for(var i = b; i < t; ++i) {
- if ( comp_func(list[i], list[i+1]) > 0 ) {
- var q = list[i]; list[i] = list[i+1]; list[i+1] = q;
- swap = true;
- }
- } // for
- t--;
-
- if (!swap) break;
-
- for(var i = t; i > b; --i) {
- if ( comp_func(list[i], list[i-1]) < 0 ) {
- var q = list[i]; list[i] = list[i-1]; list[i-1] = q;
- swap = true;
- }
- } // for
- b++;
-
- } // while(swap)
- }
-}
-
-/* ******************************************************************
- Supporting functions: bundled here to avoid depending on a library
- ****************************************************************** */
-
-// Dean Edwards/Matthias Miller/John Resig
-
-/* for Mozilla/Opera9 */
-if (document.addEventListener) {
- document.addEventListener("DOMContentLoaded", sorttable.init, false);
-}
-
-/* for Internet Explorer */
-/*@cc_on @*/
-/*@if (@_win32)
- document.write("<script id=__ie_onload defer src=javascript:void(0)><\/script>");
- var script = document.getElementById("__ie_onload");
- script.onreadystatechange = function() {
- if (this.readyState == "complete") {
- sorttable.init(); // call the onload handler
- }
- };
-/*@end @*/
-
-/* for Safari */
-if (/WebKit/i.test(navigator.userAgent)) { // sniff
- var _timer = setInterval(function() {
- if (/loaded|complete/.test(document.readyState)) {
- sorttable.init(); // call the onload handler
- }
- }, 10);
-}
-
-/* for other browsers */
-window.onload = sorttable.init;
-
-// written by Dean Edwards, 2005
-// with input from Tino Zijdel, Matthias Miller, Diego Perini
-
-// http://dean.edwards.name/weblog/2005/10/add-event/
-
-function dean_addEvent(element, type, handler) {
- if (element.addEventListener) {
- element.addEventListener(type, handler, false);
- } else {
- // assign each event handler a unique ID
- if (!handler.$$guid) handler.$$guid = dean_addEvent.guid++;
- // create a hash table of event types for the element
- if (!element.events) element.events = {};
- // create a hash table of event handlers for each element/event pair
- var handlers = element.events[type];
- if (!handlers) {
- handlers = element.events[type] = {};
- // store the existing event handler (if there is one)
- if (element["on" + type]) {
- handlers[0] = element["on" + type];
- }
- }
- // store the event handler in the hash table
- handlers[handler.$$guid] = handler;
- // assign a global event handler to do all the work
- element["on" + type] = handleEvent;
- }
-};
-// a counter used to create unique IDs
-dean_addEvent.guid = 1;
-
-function removeEvent(element, type, handler) {
- if (element.removeEventListener) {
- element.removeEventListener(type, handler, false);
- } else {
- // delete the event handler from the hash table
- if (element.events && element.events[type]) {
- delete element.events[type][handler.$$guid];
- }
- }
-};
-
-function handleEvent(event) {
- var returnValue = true;
- // grab the event object (IE uses a global event object)
- event = event || fixEvent(((this.ownerDocument || this.document || this).parentWindow || window).event);
- // get a reference to the hash table of event handlers
- var handlers = this.events[event.type];
- // execute each event handler
- for (var i in handlers) {
- this.$$handleEvent = handlers[i];
- if (this.$$handleEvent(event) === false) {
- returnValue = false;
- }
- }
- return returnValue;
-};
-
-function fixEvent(event) {
- // add W3C standard event methods
- event.preventDefault = fixEvent.preventDefault;
- event.stopPropagation = fixEvent.stopPropagation;
- return event;
-};
-fixEvent.preventDefault = function() {
- this.returnValue = false;
-};
-fixEvent.stopPropagation = function() {
- this.cancelBubble = true;
-}
-
-// Dean's forEach: http://dean.edwards.name/base/forEach.js
-/*
- forEach, version 1.0
- Copyright 2006, Dean Edwards
- License: http://www.opensource.org/licenses/mit-license.php
-*/
-
-// array-like enumeration
-if (!Array.forEach) { // mozilla already supports this
- Array.forEach = function(array, block, context) {
- for (var i = 0; i < array.length; i++) {
- block.call(context, array[i], i, array);
- }
- };
-}
-
-// generic enumeration
-Function.prototype.forEach = function(object, block, context) {
- for (var key in object) {
- if (typeof this.prototype[key] == "undefined") {
- block.call(context, object[key], key, object);
- }
- }
-};
-
-// character enumeration
-String.forEach = function(string, block, context) {
- Array.forEach(string.split(""), function(chr, index) {
- block.call(context, chr, index, string);
- });
-};
-
-// globally resolve forEach enumeration
-var forEach = function(object, block, context) {
- if (object) {
- var resolve = Object; // default
- if (object instanceof Function) {
- // functions have a "length" property
- resolve = Function;
- } else if (object.forEach instanceof Function) {
- // the object implements a custom forEach method so use that
- object.forEach(block, context);
- return;
- } else if (typeof object == "string") {
- // the object is a string
- resolve = String;
- } else if (typeof object.length == "number") {
- // the object is array-like
- resolve = Array;
- }
- resolve.forEach(object, block, context);
- }
-};
-
diff --git a/tools/validatekeymaps/Android.mk b/tools/validatekeymaps/Android.mk
deleted file mode 100644
index 9af721d..0000000
--- a/tools/validatekeymaps/Android.mk
+++ /dev/null
@@ -1,33 +0,0 @@
-#
-# Copyright 2010 The Android Open Source Project
-#
-# Keymap validation tool.
-#
-
-# This tool is prebuilt if we're doing an app-only build.
-ifeq ($(TARGET_BUILD_APPS),)
-
-LOCAL_PATH:= $(call my-dir)
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := \
- Main.cpp
-
-LOCAL_CFLAGS := -Wall -Werror
-
-LOCAL_STATIC_LIBRARIES := \
- libinput \
- libutils \
- libcutils \
- liblog
-
-ifeq ($(HOST_OS),linux)
-LOCAL_LDLIBS += -ldl -lpthread
-endif
-
-LOCAL_MODULE := validatekeymaps
-LOCAL_MODULE_TAGS := optional
-
-include $(BUILD_HOST_EXECUTABLE)
-
-endif # TARGET_BUILD_APPS
diff --git a/tools/validatekeymaps/Main.cpp b/tools/validatekeymaps/Main.cpp
deleted file mode 100644
index 5b45c55..0000000
--- a/tools/validatekeymaps/Main.cpp
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <input/KeyCharacterMap.h>
-#include <input/KeyLayoutMap.h>
-#include <input/VirtualKeyMap.h>
-#include <utils/PropertyMap.h>
-#include <utils/String8.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-using namespace android;
-
-static const char* gProgName = "validatekeymaps";
-
-enum FileType {
- FILETYPE_UNKNOWN,
- FILETYPE_KEYLAYOUT,
- FILETYPE_KEYCHARACTERMAP,
- FILETYPE_VIRTUALKEYDEFINITION,
- FILETYPE_INPUTDEVICECONFIGURATION,
-};
-
-
-static void usage() {
- fprintf(stderr, "Keymap Validation Tool\n\n");
- fprintf(stderr, "Usage:\n");
- fprintf(stderr,
- " %s [*.kl] [*.kcm] [*.idc] [virtualkeys.*] [...]\n"
- " Validates the specified key layouts, key character maps, \n"
- " input device configurations, or virtual key definitions.\n\n",
- gProgName);
-}
-
-static FileType getFileType(const char* filename) {
- const char *extension = strrchr(filename, '.');
- if (extension) {
- if (strcmp(extension, ".kl") == 0) {
- return FILETYPE_KEYLAYOUT;
- }
- if (strcmp(extension, ".kcm") == 0) {
- return FILETYPE_KEYCHARACTERMAP;
- }
- if (strcmp(extension, ".idc") == 0) {
- return FILETYPE_INPUTDEVICECONFIGURATION;
- }
- }
-
- if (strstr(filename, "virtualkeys.")) {
- return FILETYPE_VIRTUALKEYDEFINITION;
- }
-
- return FILETYPE_UNKNOWN;
-}
-
-static bool validateFile(const char* filename) {
- fprintf(stdout, "Validating file '%s'...\n", filename);
-
- FileType fileType = getFileType(filename);
- switch (fileType) {
- case FILETYPE_UNKNOWN:
- fprintf(stderr, "Supported file types: *.kl, *.kcm, virtualkeys.*\n\n");
- return false;
-
- case FILETYPE_KEYLAYOUT: {
- sp<KeyLayoutMap> map;
- status_t status = KeyLayoutMap::load(String8(filename), &map);
- if (status) {
- fprintf(stderr, "Error %d parsing key layout file.\n\n", status);
- return false;
- }
- break;
- }
-
- case FILETYPE_KEYCHARACTERMAP: {
- sp<KeyCharacterMap> map;
- status_t status = KeyCharacterMap::load(String8(filename),
- KeyCharacterMap::FORMAT_ANY, &map);
- if (status) {
- fprintf(stderr, "Error %d parsing key character map file.\n\n", status);
- return false;
- }
- break;
- }
-
- case FILETYPE_INPUTDEVICECONFIGURATION: {
- PropertyMap* map;
- status_t status = PropertyMap::load(String8(filename), &map);
- if (status) {
- fprintf(stderr, "Error %d parsing input device configuration file.\n\n", status);
- return false;
- }
- delete map;
- break;
- }
-
- case FILETYPE_VIRTUALKEYDEFINITION: {
- VirtualKeyMap* map;
- status_t status = VirtualKeyMap::load(String8(filename), &map);
- if (status) {
- fprintf(stderr, "Error %d parsing virtual key definition file.\n\n", status);
- return false;
- }
- delete map;
- break;
- }
- }
-
- fputs("No errors.\n\n", stdout);
- return true;
-}
-
-int main(int argc, const char** argv) {
- if (argc < 2) {
- usage();
- return 1;
- }
-
- int result = 0;
- for (int i = 1; i < argc; i++) {
- if (!validateFile(argv[i])) {
- result = 1;
- }
- }
-
- if (result) {
- fputs("Failed!\n", stderr);
- } else {
- fputs("Success.\n", stdout);
- }
- return result;
-}
diff --git a/tools/velocityplot/velocityplot.py b/tools/velocityplot/velocityplot.py
deleted file mode 100755
index 421bed4..0000000
--- a/tools/velocityplot/velocityplot.py
+++ /dev/null
@@ -1,289 +0,0 @@
-#!/usr/bin/env python2.6
-#
-# Copyright (C) 2011 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.
-#
-
-#
-# Plots debug log output from VelocityTracker.
-# Enable DEBUG_VELOCITY to print the output.
-#
-# This code supports side-by-side comparison of two algorithms.
-# The old algorithm should be modified to emit debug log messages containing
-# the word "OLD".
-#
-
-import numpy as np
-import matplotlib.pyplot as plot
-import subprocess
-import re
-import fcntl
-import os
-import errno
-import bisect
-from datetime import datetime, timedelta
-
-# Parameters.
-timespan = 15 # seconds total span shown
-scrolljump = 5 # seconds jump when scrolling
-timeticks = 1 # seconds between each time tick
-
-# Non-blocking stream wrapper.
-class NonBlockingStream:
- def __init__(self, stream):
- fcntl.fcntl(stream, fcntl.F_SETFL, os.O_NONBLOCK)
- self.stream = stream
- self.buffer = ''
- self.pos = 0
-
- def readline(self):
- while True:
- index = self.buffer.find('\n', self.pos)
- if index != -1:
- result = self.buffer[self.pos:index]
- self.pos = index + 1
- return result
-
- self.buffer = self.buffer[self.pos:]
- self.pos = 0
- try:
- chunk = os.read(self.stream.fileno(), 4096)
- except OSError, e:
- if e.errno == errno.EAGAIN:
- return None
- raise e
- if len(chunk) == 0:
- if len(self.buffer) == 0:
- raise(EOFError)
- else:
- result = self.buffer
- self.buffer = ''
- self.pos = 0
- return result
- self.buffer += chunk
-
-# Plotter
-class Plotter:
- def __init__(self, adbout):
- self.adbout = adbout
-
- self.fig = plot.figure(1)
- self.fig.suptitle('Velocity Tracker', fontsize=12)
- self.fig.set_dpi(96)
- self.fig.set_size_inches(16, 12, forward=True)
-
- self.velocity_x = self._make_timeseries()
- self.velocity_y = self._make_timeseries()
- self.velocity_magnitude = self._make_timeseries()
- self.velocity_axes = self._add_timeseries_axes(
- 1, 'Velocity', 'px/s', [-5000, 5000],
- yticks=range(-5000, 5000, 1000))
- self.velocity_line_x = self._add_timeseries_line(
- self.velocity_axes, 'vx', 'red')
- self.velocity_line_y = self._add_timeseries_line(
- self.velocity_axes, 'vy', 'green')
- self.velocity_line_magnitude = self._add_timeseries_line(
- self.velocity_axes, 'magnitude', 'blue')
- self._add_timeseries_legend(self.velocity_axes)
-
- shared_axis = self.velocity_axes
-
- self.old_velocity_x = self._make_timeseries()
- self.old_velocity_y = self._make_timeseries()
- self.old_velocity_magnitude = self._make_timeseries()
- self.old_velocity_axes = self._add_timeseries_axes(
- 2, 'Old Algorithm Velocity', 'px/s', [-5000, 5000],
- sharex=shared_axis,
- yticks=range(-5000, 5000, 1000))
- self.old_velocity_line_x = self._add_timeseries_line(
- self.old_velocity_axes, 'vx', 'red')
- self.old_velocity_line_y = self._add_timeseries_line(
- self.old_velocity_axes, 'vy', 'green')
- self.old_velocity_line_magnitude = self._add_timeseries_line(
- self.old_velocity_axes, 'magnitude', 'blue')
- self._add_timeseries_legend(self.old_velocity_axes)
-
- self.timer = self.fig.canvas.new_timer(interval=100)
- self.timer.add_callback(lambda: self.update())
- self.timer.start()
-
- self.timebase = None
- self._reset_parse_state()
-
- # Initialize a time series.
- def _make_timeseries(self):
- return [[], []]
-
- # Add a subplot to the figure for a time series.
- def _add_timeseries_axes(self, index, title, ylabel, ylim, yticks, sharex=None):
- num_graphs = 2
- height = 0.9 / num_graphs
- top = 0.95 - height * index
- axes = self.fig.add_axes([0.1, top, 0.8, height],
- xscale='linear',
- xlim=[0, timespan],
- ylabel=ylabel,
- yscale='linear',
- ylim=ylim,
- sharex=sharex)
- axes.text(0.02, 0.02, title, transform=axes.transAxes, fontsize=10, fontweight='bold')
- axes.set_xlabel('time (s)', fontsize=10, fontweight='bold')
- axes.set_ylabel(ylabel, fontsize=10, fontweight='bold')
- axes.set_xticks(range(0, timespan + 1, timeticks))
- axes.set_yticks(yticks)
- axes.grid(True)
-
- for label in axes.get_xticklabels():
- label.set_fontsize(9)
- for label in axes.get_yticklabels():
- label.set_fontsize(9)
-
- return axes
-
- # Add a line to the axes for a time series.
- def _add_timeseries_line(self, axes, label, color, linewidth=1):
- return axes.plot([], label=label, color=color, linewidth=linewidth)[0]
-
- # Add a legend to a time series.
- def _add_timeseries_legend(self, axes):
- axes.legend(
- loc='upper left',
- bbox_to_anchor=(1.01, 1),
- borderpad=0.1,
- borderaxespad=0.1,
- prop={'size': 10})
-
- # Resets the parse state.
- def _reset_parse_state(self):
- self.parse_velocity_x = None
- self.parse_velocity_y = None
- self.parse_velocity_magnitude = None
- self.parse_old_velocity_x = None
- self.parse_old_velocity_y = None
- self.parse_old_velocity_magnitude = None
-
- # Update samples.
- def update(self):
- timeindex = 0
- while True:
- try:
- line = self.adbout.readline()
- except EOFError:
- plot.close()
- return
- if line is None:
- break
- print line
-
- try:
- timestamp = self._parse_timestamp(line)
- except ValueError, e:
- continue
- if self.timebase is None:
- self.timebase = timestamp
- delta = timestamp - self.timebase
- timeindex = delta.seconds + delta.microseconds * 0.000001
-
- if line.find(': position') != -1:
- self.parse_velocity_x = self._get_following_number(line, 'vx=')
- self.parse_velocity_y = self._get_following_number(line, 'vy=')
- self.parse_velocity_magnitude = self._get_following_number(line, 'speed=')
- self._append(self.velocity_x, timeindex, self.parse_velocity_x)
- self._append(self.velocity_y, timeindex, self.parse_velocity_y)
- self._append(self.velocity_magnitude, timeindex, self.parse_velocity_magnitude)
-
- if line.find(': OLD') != -1:
- self.parse_old_velocity_x = self._get_following_number(line, 'vx=')
- self.parse_old_velocity_y = self._get_following_number(line, 'vy=')
- self.parse_old_velocity_magnitude = self._get_following_number(line, 'speed=')
- self._append(self.old_velocity_x, timeindex, self.parse_old_velocity_x)
- self._append(self.old_velocity_y, timeindex, self.parse_old_velocity_y)
- self._append(self.old_velocity_magnitude, timeindex, self.parse_old_velocity_magnitude)
-
- # Scroll the plots.
- if timeindex > timespan:
- bottom = int(timeindex) - timespan + scrolljump
- self.timebase += timedelta(seconds=bottom)
- self._scroll(self.velocity_x, bottom)
- self._scroll(self.velocity_y, bottom)
- self._scroll(self.velocity_magnitude, bottom)
- self._scroll(self.old_velocity_x, bottom)
- self._scroll(self.old_velocity_y, bottom)
- self._scroll(self.old_velocity_magnitude, bottom)
-
- # Redraw the plots.
- self.velocity_line_x.set_data(self.velocity_x)
- self.velocity_line_y.set_data(self.velocity_y)
- self.velocity_line_magnitude.set_data(self.velocity_magnitude)
- self.old_velocity_line_x.set_data(self.old_velocity_x)
- self.old_velocity_line_y.set_data(self.old_velocity_y)
- self.old_velocity_line_magnitude.set_data(self.old_velocity_magnitude)
-
- self.fig.canvas.draw_idle()
-
- # Scroll a time series.
- def _scroll(self, timeseries, bottom):
- bottom_index = bisect.bisect_left(timeseries[0], bottom)
- del timeseries[0][:bottom_index]
- del timeseries[1][:bottom_index]
- for i, timeindex in enumerate(timeseries[0]):
- timeseries[0][i] = timeindex - bottom
-
- # Extract a word following the specified prefix.
- def _get_following_word(self, line, prefix):
- prefix_index = line.find(prefix)
- if prefix_index == -1:
- return None
- start_index = prefix_index + len(prefix)
- delim_index = line.find(',', start_index)
- if delim_index == -1:
- return line[start_index:]
- else:
- return line[start_index:delim_index]
-
- # Extract a number following the specified prefix.
- def _get_following_number(self, line, prefix):
- word = self._get_following_word(line, prefix)
- if word is None:
- return None
- return float(word)
-
- # Add a value to a time series.
- def _append(self, timeseries, timeindex, number):
- timeseries[0].append(timeindex)
- timeseries[1].append(number)
-
- # Parse the logcat timestamp.
- # Timestamp has the form '01-21 20:42:42.930'
- def _parse_timestamp(self, line):
- return datetime.strptime(line[0:18], '%m-%d %H:%M:%S.%f')
-
-# Notice
-print "Velocity Tracker plotting tool"
-print "-----------------------------------------\n"
-print "Please enable debug logging and recompile the code."
-
-# Start adb.
-print "Starting adb logcat.\n"
-
-adb = subprocess.Popen(['adb', 'logcat', '-s', '-v', 'time', 'Input:*', 'VelocityTracker:*'],
- stdout=subprocess.PIPE)
-adbout = NonBlockingStream(adb.stdout)
-
-# Prepare plotter.
-plotter = Plotter(adbout)
-plotter.update()
-
-# Main loop.
-plot.show()
diff --git a/wifi/java/android/net/wifi/IWifiManager.aidl b/wifi/java/android/net/wifi/IWifiManager.aidl
index 5a1928c..bfcc208 100644
--- a/wifi/java/android/net/wifi/IWifiManager.aidl
+++ b/wifi/java/android/net/wifi/IWifiManager.aidl
@@ -111,8 +111,6 @@ interface IWifiManager
String getConfigFile();
- void captivePortalCheckComplete();
-
void enableTdls(String remoteIPAddress, boolean enable);
void enableTdlsWithMacAddress(String remoteMacAddress, boolean enable);
diff --git a/wifi/java/android/net/wifi/WifiInfo.java b/wifi/java/android/net/wifi/WifiInfo.java
index 5d130c6..dea0c6c 100644
--- a/wifi/java/android/net/wifi/WifiInfo.java
+++ b/wifi/java/android/net/wifi/WifiInfo.java
@@ -62,7 +62,6 @@ public class WifiInfo implements Parcelable {
private String mBSSID;
private WifiSsid mWifiSsid;
private int mNetworkId;
- private boolean mHiddenSSID;
/** Received Signal Strength Indicator */
private int mRssi;
@@ -86,7 +85,6 @@ public class WifiInfo implements Parcelable {
mSupplicantState = SupplicantState.UNINITIALIZED;
mRssi = -9999;
mLinkSpeed = -1;
- mHiddenSSID = false;
}
/**
@@ -99,7 +97,6 @@ public class WifiInfo implements Parcelable {
mBSSID = source.mBSSID;
mWifiSsid = source.mWifiSsid;
mNetworkId = source.mNetworkId;
- mHiddenSSID = source.mHiddenSSID;
mRssi = source.mRssi;
mLinkSpeed = source.mLinkSpeed;
mIpAddress = source.mIpAddress;
@@ -110,8 +107,6 @@ public class WifiInfo implements Parcelable {
void setSSID(WifiSsid wifiSsid) {
mWifiSsid = wifiSsid;
- // network is considered not hidden by default
- mHiddenSSID = false;
}
/**
@@ -244,12 +239,7 @@ public class WifiInfo implements Parcelable {
* SSID-specific probe request must be used for scans.
*/
public boolean getHiddenSSID() {
- return mHiddenSSID;
- }
-
- /** {@hide} */
- public void setHiddenSSID(boolean hiddenSSID) {
- mHiddenSSID = hiddenSSID;
+ return mWifiSsid.isHidden();
}
/**
diff --git a/wifi/java/android/net/wifi/WifiManager.java b/wifi/java/android/net/wifi/WifiManager.java
index 7fc8bef..1fa7e85 100644
--- a/wifi/java/android/net/wifi/WifiManager.java
+++ b/wifi/java/android/net/wifi/WifiManager.java
@@ -2157,13 +2157,6 @@ public class WifiManager {
}
}
- /** @hide */
- public void captivePortalCheckComplete() {
- try {
- mService.captivePortalCheckComplete();
- } catch (RemoteException e) {}
- }
-
protected void finalize() throws Throwable {
try {
synchronized (sThreadRefLock) {
diff --git a/wifi/java/android/net/wifi/WifiMonitor.java b/wifi/java/android/net/wifi/WifiMonitor.java
index 6817777..a18954c 100644
--- a/wifi/java/android/net/wifi/WifiMonitor.java
+++ b/wifi/java/android/net/wifi/WifiMonitor.java
@@ -20,24 +20,19 @@ import android.net.NetworkInfo;
import android.net.wifi.p2p.WifiP2pConfig;
import android.net.wifi.p2p.WifiP2pDevice;
import android.net.wifi.p2p.WifiP2pGroup;
-import android.net.wifi.p2p.WifiP2pService;
-import android.net.wifi.p2p.WifiP2pService.P2pStatus;
import android.net.wifi.p2p.WifiP2pProvDiscEvent;
+import android.net.wifi.p2p.WifiP2pService.P2pStatus;
import android.net.wifi.p2p.nsd.WifiP2pServiceResponse;
-import android.net.wifi.StateChangeResult;
import android.os.Message;
import android.util.Log;
-
import com.android.internal.util.Protocol;
import com.android.internal.util.StateMachine;
import java.util.HashMap;
-import java.util.Iterator;
import java.util.List;
-import java.util.Map;
-import java.util.regex.Pattern;
import java.util.regex.Matcher;
+import java.util.regex.Pattern;
/**
* Listens for events from the wpa_supplicant server, and passes them on
@@ -337,10 +332,6 @@ public class WifiMonitor {
/* Indicates assoc reject event */
public static final int ASSOCIATION_REJECTION_EVENT = BASE + 43;
- /**
- * This indicates the supplicant connection for the monitor is closed
- */
- private static final String MONITOR_SOCKET_CLOSED_STR = "connection closed";
/**
* This indicates a read error on the monitor socket conenction
@@ -354,56 +345,57 @@ public class WifiMonitor {
private final String mInterfaceName;
private final WifiNative mWifiNative;
- private final StateMachine mWifiStateMachine;
+ private final StateMachine mStateMachine;
private boolean mMonitoring;
+ // This is a global counter, since it's not monitor specific. However, the existing
+ // implementation forwards all "global" control events like CTRL-EVENT-TERMINATING
+ // to the p2p0 monitor. Is that expected ? It seems a bit surprising.
+ //
+ // TODO: If the p2p0 monitor isn't registered, the behaviour is even more surprising.
+ // The event will be dispatched to all monitors, and each of them will end up incrementing
+ // it in their dispatchXXX method. If we have 5 registered monitors (say), 2 consecutive
+ // recv errors will cause us to disconnect from the supplicant (instead of the intended 10).
+ //
+ // This variable is always accessed and modified under a WifiMonitorSingleton lock.
+ private static int sRecvErrors;
+
public WifiMonitor(StateMachine wifiStateMachine, WifiNative wifiNative) {
if (DBG) Log.d(TAG, "Creating WifiMonitor");
mWifiNative = wifiNative;
mInterfaceName = wifiNative.mInterfaceName;
- mWifiStateMachine = wifiStateMachine;
+ mStateMachine = wifiStateMachine;
mMonitoring = false;
- WifiMonitorSingleton.getMonitor().registerInterfaceMonitor(mInterfaceName, this);
+ WifiMonitorSingleton.sInstance.registerInterfaceMonitor(mInterfaceName, this);
}
public void startMonitoring() {
- WifiMonitorSingleton.getMonitor().startMonitoring(mInterfaceName);
+ WifiMonitorSingleton.sInstance.startMonitoring(mInterfaceName);
}
public void stopMonitoring() {
- WifiMonitorSingleton.getMonitor().stopMonitoring(mInterfaceName);
+ WifiMonitorSingleton.sInstance.stopMonitoring(mInterfaceName);
}
public void stopSupplicant() {
- WifiMonitorSingleton.getMonitor().stopSupplicant();
+ WifiMonitorSingleton.sInstance.stopSupplicant();
}
public void killSupplicant(boolean p2pSupported) {
- WifiMonitorSingleton.getMonitor().killSupplicant(p2pSupported);
+ WifiMonitorSingleton.sInstance.killSupplicant(p2pSupported);
}
private static class WifiMonitorSingleton {
- private static Object sSingletonLock = new Object();
- private static WifiMonitorSingleton sWifiMonitorSingleton = null;
- private HashMap<String, WifiMonitor> mIfaceMap = new HashMap<String, WifiMonitor>();
+ private static final WifiMonitorSingleton sInstance = new WifiMonitorSingleton();
+
+ private final HashMap<String, WifiMonitor> mIfaceMap = new HashMap<String, WifiMonitor>();
private boolean mConnected = false;
private WifiNative mWifiNative;
private WifiMonitorSingleton() {
}
- static WifiMonitorSingleton getMonitor() {
- if (DBG) Log.d(TAG, "WifiMonitorSingleton gotten");
- synchronized (sSingletonLock) {
- if (sWifiMonitorSingleton == null) {
- if (DBG) Log.d(TAG, "WifiMonitorSingleton created");
- sWifiMonitorSingleton = new WifiMonitorSingleton();
- }
- }
- return sWifiMonitorSingleton;
- }
-
public synchronized void startMonitoring(String iface) {
WifiMonitor m = mIfaceMap.get(iface);
if (m == null) {
@@ -415,14 +407,14 @@ public class WifiMonitor {
if (mConnected) {
m.mMonitoring = true;
- m.mWifiStateMachine.sendMessage(SUP_CONNECTION_EVENT);
+ m.mStateMachine.sendMessage(SUP_CONNECTION_EVENT);
} else {
if (DBG) Log.d(TAG, "connecting to supplicant");
int connectTries = 0;
while (true) {
if (mWifiNative.connectToSupplicant()) {
m.mMonitoring = true;
- m.mWifiStateMachine.sendMessage(SUP_CONNECTION_EVENT);
+ m.mStateMachine.sendMessage(SUP_CONNECTION_EVENT);
new MonitorThread(mWifiNative, this).start();
mConnected = true;
break;
@@ -434,7 +426,7 @@ public class WifiMonitor {
}
} else {
mIfaceMap.remove(iface);
- m.mWifiStateMachine.sendMessage(SUP_DISCONNECTION_EVENT);
+ m.mStateMachine.sendMessage(SUP_DISCONNECTION_EVENT);
Log.e(TAG, "startMonitoring(" + iface + ") failed!");
break;
}
@@ -444,13 +436,13 @@ public class WifiMonitor {
public synchronized void stopMonitoring(String iface) {
WifiMonitor m = mIfaceMap.get(iface);
- if (DBG) Log.d(TAG, "stopMonitoring(" + iface + ") = " + m.mWifiStateMachine);
+ if (DBG) Log.d(TAG, "stopMonitoring(" + iface + ") = " + m.mStateMachine);
m.mMonitoring = false;
- m.mWifiStateMachine.sendMessage(SUP_DISCONNECTION_EVENT);
+ m.mStateMachine.sendMessage(SUP_DISCONNECTION_EVENT);
}
public synchronized void registerInterfaceMonitor(String iface, WifiMonitor m) {
- if (DBG) Log.d(TAG, "registerInterface(" + iface + "+" + m.mWifiStateMachine + ")");
+ if (DBG) Log.d(TAG, "registerInterface(" + iface + "+" + m.mStateMachine + ")");
mIfaceMap.put(iface, m);
if (mWifiNative == null) {
mWifiNative = m.mWifiNative;
@@ -462,7 +454,7 @@ public class WifiMonitor {
// objects will remain in the mIfaceMap; and won't ever get deleted
WifiMonitor m = mIfaceMap.remove(iface);
- if (DBG) Log.d(TAG, "unregisterInterface(" + iface + "+" + m.mWifiStateMachine + ")");
+ if (DBG) Log.d(TAG, "unregisterInterface(" + iface + "+" + m.mStateMachine + ")");
}
public synchronized void stopSupplicant() {
@@ -470,26 +462,74 @@ public class WifiMonitor {
}
public synchronized void killSupplicant(boolean p2pSupported) {
- mWifiNative.killSupplicant(p2pSupported);
+ WifiNative.killSupplicant(p2pSupported);
mConnected = false;
- Iterator<Map.Entry<String, WifiMonitor>> it = mIfaceMap.entrySet().iterator();
- while (it.hasNext()) {
- Map.Entry<String, WifiMonitor> e = it.next();
- WifiMonitor m = e.getValue();
+ for (WifiMonitor m : mIfaceMap.values()) {
m.mMonitoring = false;
}
}
- private synchronized WifiMonitor getMonitor(String iface) {
- return mIfaceMap.get(iface);
+ private synchronized boolean dispatchEvent(String eventStr) {
+ String iface;
+ if (eventStr.startsWith("IFNAME=")) {
+ int space = eventStr.indexOf(' ');
+ if (space != -1) {
+ iface = eventStr.substring(7, space);
+ if (!mIfaceMap.containsKey(iface) && iface.startsWith("p2p-")) {
+ // p2p interfaces are created dynamically, but we have
+ // only one P2p state machine monitoring all of them; look
+ // for it explicitly, and send messages there ..
+ iface = "p2p0";
+ }
+ eventStr = eventStr.substring(space + 1);
+ } else {
+ // No point dispatching this event to any interface, the dispatched
+ // event string will begin with "IFNAME=" which dispatchEvent can't really
+ // do anything about.
+ Log.e(TAG, "Dropping malformed event (unparsable iface): " + eventStr);
+ return false;
+ }
+ } else {
+ // events without prefix belong to p2p0 monitor
+ iface = "p2p0";
+ }
+
+ if (DBG) Log.d(TAG, "Dispatching event to interface: " + iface);
+
+ WifiMonitor m = mIfaceMap.get(iface);
+ if (m != null) {
+ if (m.mMonitoring) {
+ if (m.dispatchEvent(eventStr)) {
+ mConnected = false;
+ return true;
+ }
+
+ return false;
+ } else {
+ if (DBG) Log.d(TAG, "Dropping event because (" + iface + ") is stopped");
+ return false;
+ }
+ } else {
+ if (DBG) Log.d(TAG, "Sending to all monitors because there's no matching iface");
+ boolean done = false;
+ for (WifiMonitor monitor : mIfaceMap.values()) {
+ if (monitor.mMonitoring && monitor.dispatchEvent(eventStr)) {
+ done = true;
+ }
+ }
+
+ if (done) {
+ mConnected = false;
+ }
+
+ return done;
+ }
}
}
private static class MonitorThread extends Thread {
private final WifiNative mWifiNative;
private final WifiMonitorSingleton mWifiMonitorSingleton;
- private int mRecvErrors = 0;
- private StateMachine mStateMachine = null;
public MonitorThread(WifiNative wifiNative, WifiMonitorSingleton wifiMonitorSingleton) {
super("WifiMonitor");
@@ -507,445 +547,390 @@ public class WifiMonitor {
Log.d(TAG, "Event [" + eventStr + "]");
}
- String iface = "p2p0";
- WifiMonitor m = null;
- mStateMachine = null;
-
- if (eventStr.startsWith("IFNAME=")) {
- int space = eventStr.indexOf(' ');
- if (space != -1) {
- iface = eventStr.substring(7,space);
- m = mWifiMonitorSingleton.getMonitor(iface);
- if (m == null && iface.startsWith("p2p-")) {
- // p2p interfaces are created dynamically, but we have
- // only one P2p state machine monitoring all of them; look
- // for it explicitly, and send messages there ..
- m = mWifiMonitorSingleton.getMonitor("p2p0");
- }
- eventStr = eventStr.substring(space + 1);
- }
- } else {
- // events without prefix belong to p2p0 monitor
- m = mWifiMonitorSingleton.getMonitor("p2p0");
- }
-
- if (m != null) {
- if (m.mMonitoring) {
- mStateMachine = m.mWifiStateMachine;
- } else {
- if (DBG) Log.d(TAG, "Dropping event because monitor (" + iface +
- ") is stopped");
- continue;
- }
- }
-
- if (mStateMachine != null) {
- if (dispatchEvent(eventStr)) {
- break;
- }
- } else {
- if (DBG) Log.d(TAG, "Sending to all monitors because there's no interface id");
- boolean done = false;
- Iterator<Map.Entry<String, WifiMonitor>> it =
- mWifiMonitorSingleton.mIfaceMap.entrySet().iterator();
- while (it.hasNext()) {
- Map.Entry<String, WifiMonitor> e = it.next();
- m = e.getValue();
- mStateMachine = m.mWifiStateMachine;
- if (dispatchEvent(eventStr)) {
- done = true;
- }
- }
-
- if (done) {
- // After this thread terminates, we'll no longer
- // be connected to the supplicant
- if (DBG) Log.d(TAG, "Disconnecting from the supplicant, no more events");
- mWifiMonitorSingleton.mConnected = false;
- break;
- }
+ if (mWifiMonitorSingleton.dispatchEvent(eventStr)) {
+ if (DBG) Log.d(TAG, "Disconnecting from the supplicant, no more events");
+ break;
}
}
}
+ }
- /* @return true if the event was supplicant disconnection */
- private boolean dispatchEvent(String eventStr) {
-
- if (!eventStr.startsWith(EVENT_PREFIX_STR)) {
- if (eventStr.startsWith(WPA_EVENT_PREFIX_STR) &&
- 0 < eventStr.indexOf(PASSWORD_MAY_BE_INCORRECT_STR)) {
- mStateMachine.sendMessage(AUTHENTICATION_FAILURE_EVENT);
- } else if (eventStr.startsWith(WPS_SUCCESS_STR)) {
- mStateMachine.sendMessage(WPS_SUCCESS_EVENT);
- } else if (eventStr.startsWith(WPS_FAIL_STR)) {
- handleWpsFailEvent(eventStr);
- } else if (eventStr.startsWith(WPS_OVERLAP_STR)) {
- mStateMachine.sendMessage(WPS_OVERLAP_EVENT);
- } else if (eventStr.startsWith(WPS_TIMEOUT_STR)) {
- mStateMachine.sendMessage(WPS_TIMEOUT_EVENT);
- } else if (eventStr.startsWith(P2P_EVENT_PREFIX_STR)) {
- handleP2pEvents(eventStr);
- } else if (eventStr.startsWith(HOST_AP_EVENT_PREFIX_STR)) {
- handleHostApEvents(eventStr);
- }
- else {
- if (DBG) Log.w(TAG, "couldn't identify event type - " + eventStr);
- }
- return false;
+ /* @return true if the event was supplicant disconnection */
+ private boolean dispatchEvent(String eventStr) {
+
+ if (!eventStr.startsWith(EVENT_PREFIX_STR)) {
+ if (eventStr.startsWith(WPA_EVENT_PREFIX_STR) &&
+ 0 < eventStr.indexOf(PASSWORD_MAY_BE_INCORRECT_STR)) {
+ mStateMachine.sendMessage(AUTHENTICATION_FAILURE_EVENT);
+ } else if (eventStr.startsWith(WPS_SUCCESS_STR)) {
+ mStateMachine.sendMessage(WPS_SUCCESS_EVENT);
+ } else if (eventStr.startsWith(WPS_FAIL_STR)) {
+ handleWpsFailEvent(eventStr);
+ } else if (eventStr.startsWith(WPS_OVERLAP_STR)) {
+ mStateMachine.sendMessage(WPS_OVERLAP_EVENT);
+ } else if (eventStr.startsWith(WPS_TIMEOUT_STR)) {
+ mStateMachine.sendMessage(WPS_TIMEOUT_EVENT);
+ } else if (eventStr.startsWith(P2P_EVENT_PREFIX_STR)) {
+ handleP2pEvents(eventStr);
+ } else if (eventStr.startsWith(HOST_AP_EVENT_PREFIX_STR)) {
+ handleHostApEvents(eventStr);
+ }
+ else {
+ if (DBG) Log.w(TAG, "couldn't identify event type - " + eventStr);
}
+ return false;
+ }
- String eventName = eventStr.substring(EVENT_PREFIX_LEN_STR);
- int nameEnd = eventName.indexOf(' ');
- if (nameEnd != -1)
- eventName = eventName.substring(0, nameEnd);
- if (eventName.length() == 0) {
- if (DBG) Log.i(TAG, "Received wpa_supplicant event with empty event name");
- return false;
+ String eventName = eventStr.substring(EVENT_PREFIX_LEN_STR);
+ int nameEnd = eventName.indexOf(' ');
+ if (nameEnd != -1)
+ eventName = eventName.substring(0, nameEnd);
+ if (eventName.length() == 0) {
+ if (DBG) Log.i(TAG, "Received wpa_supplicant event with empty event name");
+ return false;
+ }
+ /*
+ * Map event name into event enum
+ */
+ int event;
+ if (eventName.equals(CONNECTED_STR))
+ event = CONNECTED;
+ else if (eventName.equals(DISCONNECTED_STR))
+ event = DISCONNECTED;
+ else if (eventName.equals(STATE_CHANGE_STR))
+ event = STATE_CHANGE;
+ else if (eventName.equals(SCAN_RESULTS_STR))
+ event = SCAN_RESULTS;
+ else if (eventName.equals(LINK_SPEED_STR))
+ event = LINK_SPEED;
+ else if (eventName.equals(TERMINATING_STR))
+ event = TERMINATING;
+ else if (eventName.equals(DRIVER_STATE_STR))
+ event = DRIVER_STATE;
+ else if (eventName.equals(EAP_FAILURE_STR))
+ event = EAP_FAILURE;
+ else if (eventName.equals(ASSOC_REJECT_STR))
+ event = ASSOC_REJECT;
+ else
+ event = UNKNOWN;
+
+ String eventData = eventStr;
+ if (event == DRIVER_STATE || event == LINK_SPEED)
+ eventData = eventData.split(" ")[1];
+ else if (event == STATE_CHANGE || event == EAP_FAILURE) {
+ int ind = eventStr.indexOf(" ");
+ if (ind != -1) {
+ eventData = eventStr.substring(ind + 1);
}
- /*
- * Map event name into event enum
- */
- int event;
- if (eventName.equals(CONNECTED_STR))
- event = CONNECTED;
- else if (eventName.equals(DISCONNECTED_STR))
- event = DISCONNECTED;
- else if (eventName.equals(STATE_CHANGE_STR))
- event = STATE_CHANGE;
- else if (eventName.equals(SCAN_RESULTS_STR))
- event = SCAN_RESULTS;
- else if (eventName.equals(LINK_SPEED_STR))
- event = LINK_SPEED;
- else if (eventName.equals(TERMINATING_STR))
- event = TERMINATING;
- else if (eventName.equals(DRIVER_STATE_STR))
- event = DRIVER_STATE;
- else if (eventName.equals(EAP_FAILURE_STR))
- event = EAP_FAILURE;
- else if (eventName.equals(ASSOC_REJECT_STR))
- event = ASSOC_REJECT;
- else
- event = UNKNOWN;
-
- String eventData = eventStr;
- if (event == DRIVER_STATE || event == LINK_SPEED)
- eventData = eventData.split(" ")[1];
- else if (event == STATE_CHANGE || event == EAP_FAILURE) {
- int ind = eventStr.indexOf(" ");
- if (ind != -1) {
- eventData = eventStr.substring(ind + 1);
- }
- } else {
- int ind = eventStr.indexOf(" - ");
- if (ind != -1) {
- eventData = eventStr.substring(ind + 3);
- }
+ } else {
+ int ind = eventStr.indexOf(" - ");
+ if (ind != -1) {
+ eventData = eventStr.substring(ind + 3);
}
+ }
- if (event == STATE_CHANGE) {
- handleSupplicantStateChange(eventData);
- } else if (event == DRIVER_STATE) {
- handleDriverEvent(eventData);
- } else if (event == TERMINATING) {
- /**
- * Close the supplicant connection if we see
- * too many recv errors
- */
- if (eventData.startsWith(WPA_RECV_ERROR_STR)) {
- if (++mRecvErrors > MAX_RECV_ERRORS) {
- if (DBG) {
- Log.d(TAG, "too many recv errors, closing connection");
- }
- } else {
- return false;
+ if (event == STATE_CHANGE) {
+ handleSupplicantStateChange(eventData);
+ } else if (event == DRIVER_STATE) {
+ handleDriverEvent(eventData);
+ } else if (event == TERMINATING) {
+ /**
+ * Close the supplicant connection if we see
+ * too many recv errors
+ */
+ if (eventData.startsWith(WPA_RECV_ERROR_STR)) {
+ if (++sRecvErrors > MAX_RECV_ERRORS) {
+ if (DBG) {
+ Log.d(TAG, "too many recv errors, closing connection");
}
+ } else {
+ return false;
}
-
- // notify and exit
- mStateMachine.sendMessage(SUP_DISCONNECTION_EVENT);
- return true;
- } else if (event == EAP_FAILURE) {
- if (eventData.startsWith(EAP_AUTH_FAILURE_STR)) {
- mStateMachine.sendMessage(AUTHENTICATION_FAILURE_EVENT);
- }
- } else if (event == ASSOC_REJECT) {
- mStateMachine.sendMessage(ASSOCIATION_REJECTION_EVENT);
- } else {
- handleEvent(event, eventData);
}
- mRecvErrors = 0;
- return false;
- }
- private void handleDriverEvent(String state) {
- if (state == null) {
- return;
- }
- if (state.equals("HANGED")) {
- mStateMachine.sendMessage(DRIVER_HUNG_EVENT);
+ // notify and exit
+ mStateMachine.sendMessage(SUP_DISCONNECTION_EVENT);
+ return true;
+ } else if (event == EAP_FAILURE) {
+ if (eventData.startsWith(EAP_AUTH_FAILURE_STR)) {
+ mStateMachine.sendMessage(AUTHENTICATION_FAILURE_EVENT);
}
+ } else if (event == ASSOC_REJECT) {
+ mStateMachine.sendMessage(ASSOCIATION_REJECTION_EVENT);
+ } else {
+ handleEvent(event, eventData);
}
+ sRecvErrors = 0;
+ return false;
+ }
- /**
- * Handle all supplicant events except STATE-CHANGE
- * @param event the event type
- * @param remainder the rest of the string following the
- * event name and &quot;&#8195;&#8212;&#8195;&quot;
- */
- void handleEvent(int event, String remainder) {
- switch (event) {
- case DISCONNECTED:
- handleNetworkStateChange(NetworkInfo.DetailedState.DISCONNECTED, remainder);
- break;
-
- case CONNECTED:
- handleNetworkStateChange(NetworkInfo.DetailedState.CONNECTED, remainder);
- break;
-
- case SCAN_RESULTS:
- mStateMachine.sendMessage(SCAN_RESULTS_EVENT);
- break;
+ private void handleDriverEvent(String state) {
+ if (state == null) {
+ return;
+ }
+ if (state.equals("HANGED")) {
+ mStateMachine.sendMessage(DRIVER_HUNG_EVENT);
+ }
+ }
- case UNKNOWN:
- break;
- }
+ /**
+ * Handle all supplicant events except STATE-CHANGE
+ * @param event the event type
+ * @param remainder the rest of the string following the
+ * event name and &quot;&#8195;&#8212;&#8195;&quot;
+ */
+ void handleEvent(int event, String remainder) {
+ switch (event) {
+ case DISCONNECTED:
+ handleNetworkStateChange(NetworkInfo.DetailedState.DISCONNECTED, remainder);
+ break;
+
+ case CONNECTED:
+ handleNetworkStateChange(NetworkInfo.DetailedState.CONNECTED, remainder);
+ break;
+
+ case SCAN_RESULTS:
+ mStateMachine.sendMessage(SCAN_RESULTS_EVENT);
+ break;
+
+ case UNKNOWN:
+ break;
}
+ }
- private void handleWpsFailEvent(String dataString) {
- final Pattern p = Pattern.compile(WPS_FAIL_PATTERN);
- Matcher match = p.matcher(dataString);
- if (match.find()) {
- String cfgErr = match.group(1);
- String reason = match.group(2);
-
- if (reason != null) {
- switch(Integer.parseInt(reason)) {
- case REASON_TKIP_ONLY_PROHIBITED:
- mStateMachine.sendMessage(mStateMachine.obtainMessage(WPS_FAIL_EVENT,
- WifiManager.WPS_TKIP_ONLY_PROHIBITED, 0));
- return;
- case REASON_WEP_PROHIBITED:
- mStateMachine.sendMessage(mStateMachine.obtainMessage(WPS_FAIL_EVENT,
- WifiManager.WPS_WEP_PROHIBITED, 0));
- return;
- }
+ private void handleWpsFailEvent(String dataString) {
+ final Pattern p = Pattern.compile(WPS_FAIL_PATTERN);
+ Matcher match = p.matcher(dataString);
+ if (match.find()) {
+ String cfgErr = match.group(1);
+ String reason = match.group(2);
+
+ if (reason != null) {
+ switch(Integer.parseInt(reason)) {
+ case REASON_TKIP_ONLY_PROHIBITED:
+ mStateMachine.sendMessage(mStateMachine.obtainMessage(WPS_FAIL_EVENT,
+ WifiManager.WPS_TKIP_ONLY_PROHIBITED, 0));
+ return;
+ case REASON_WEP_PROHIBITED:
+ mStateMachine.sendMessage(mStateMachine.obtainMessage(WPS_FAIL_EVENT,
+ WifiManager.WPS_WEP_PROHIBITED, 0));
+ return;
}
- if (cfgErr != null) {
- switch(Integer.parseInt(cfgErr)) {
- case CONFIG_AUTH_FAILURE:
- mStateMachine.sendMessage(mStateMachine.obtainMessage(WPS_FAIL_EVENT,
- WifiManager.WPS_AUTH_FAILURE, 0));
- return;
- case CONFIG_MULTIPLE_PBC_DETECTED:
- mStateMachine.sendMessage(mStateMachine.obtainMessage(WPS_FAIL_EVENT,
- WifiManager.WPS_OVERLAP_ERROR, 0));
- return;
- }
+ }
+ if (cfgErr != null) {
+ switch(Integer.parseInt(cfgErr)) {
+ case CONFIG_AUTH_FAILURE:
+ mStateMachine.sendMessage(mStateMachine.obtainMessage(WPS_FAIL_EVENT,
+ WifiManager.WPS_AUTH_FAILURE, 0));
+ return;
+ case CONFIG_MULTIPLE_PBC_DETECTED:
+ mStateMachine.sendMessage(mStateMachine.obtainMessage(WPS_FAIL_EVENT,
+ WifiManager.WPS_OVERLAP_ERROR, 0));
+ return;
}
}
- //For all other errors, return a generic internal error
- mStateMachine.sendMessage(mStateMachine.obtainMessage(WPS_FAIL_EVENT,
- WifiManager.ERROR, 0));
}
+ //For all other errors, return a generic internal error
+ mStateMachine.sendMessage(mStateMachine.obtainMessage(WPS_FAIL_EVENT,
+ WifiManager.ERROR, 0));
+ }
- /* <event> status=<err> and the special case of <event> reason=FREQ_CONFLICT */
- private P2pStatus p2pError(String dataString) {
- P2pStatus err = P2pStatus.UNKNOWN;
- String[] tokens = dataString.split(" ");
- if (tokens.length < 2) return err;
- String[] nameValue = tokens[1].split("=");
- if (nameValue.length != 2) return err;
-
- /* Handle the special case of reason=FREQ+CONFLICT */
- if (nameValue[1].equals("FREQ_CONFLICT")) {
- return P2pStatus.NO_COMMON_CHANNEL;
- }
- try {
- err = P2pStatus.valueOf(Integer.parseInt(nameValue[1]));
- } catch (NumberFormatException e) {
- e.printStackTrace();
- }
- return err;
+ /* <event> status=<err> and the special case of <event> reason=FREQ_CONFLICT */
+ private P2pStatus p2pError(String dataString) {
+ P2pStatus err = P2pStatus.UNKNOWN;
+ String[] tokens = dataString.split(" ");
+ if (tokens.length < 2) return err;
+ String[] nameValue = tokens[1].split("=");
+ if (nameValue.length != 2) return err;
+
+ /* Handle the special case of reason=FREQ+CONFLICT */
+ if (nameValue[1].equals("FREQ_CONFLICT")) {
+ return P2pStatus.NO_COMMON_CHANNEL;
}
+ try {
+ err = P2pStatus.valueOf(Integer.parseInt(nameValue[1]));
+ } catch (NumberFormatException e) {
+ e.printStackTrace();
+ }
+ return err;
+ }
- /**
- * Handle p2p events
- */
- private void handleP2pEvents(String dataString) {
- if (dataString.startsWith(P2P_DEVICE_FOUND_STR)) {
- mStateMachine.sendMessage(P2P_DEVICE_FOUND_EVENT, new WifiP2pDevice(dataString));
- } else if (dataString.startsWith(P2P_DEVICE_LOST_STR)) {
- mStateMachine.sendMessage(P2P_DEVICE_LOST_EVENT, new WifiP2pDevice(dataString));
- } else if (dataString.startsWith(P2P_FIND_STOPPED_STR)) {
- mStateMachine.sendMessage(P2P_FIND_STOPPED_EVENT);
- } else if (dataString.startsWith(P2P_GO_NEG_REQUEST_STR)) {
- mStateMachine.sendMessage(P2P_GO_NEGOTIATION_REQUEST_EVENT,
- new WifiP2pConfig(dataString));
- } else if (dataString.startsWith(P2P_GO_NEG_SUCCESS_STR)) {
- mStateMachine.sendMessage(P2P_GO_NEGOTIATION_SUCCESS_EVENT);
- } else if (dataString.startsWith(P2P_GO_NEG_FAILURE_STR)) {
- mStateMachine.sendMessage(P2P_GO_NEGOTIATION_FAILURE_EVENT, p2pError(dataString));
- } else if (dataString.startsWith(P2P_GROUP_FORMATION_SUCCESS_STR)) {
- mStateMachine.sendMessage(P2P_GROUP_FORMATION_SUCCESS_EVENT);
- } else if (dataString.startsWith(P2P_GROUP_FORMATION_FAILURE_STR)) {
- mStateMachine.sendMessage(P2P_GROUP_FORMATION_FAILURE_EVENT, p2pError(dataString));
- } else if (dataString.startsWith(P2P_GROUP_STARTED_STR)) {
- mStateMachine.sendMessage(P2P_GROUP_STARTED_EVENT, new WifiP2pGroup(dataString));
- } else if (dataString.startsWith(P2P_GROUP_REMOVED_STR)) {
- mStateMachine.sendMessage(P2P_GROUP_REMOVED_EVENT, new WifiP2pGroup(dataString));
- } else if (dataString.startsWith(P2P_INVITATION_RECEIVED_STR)) {
- mStateMachine.sendMessage(P2P_INVITATION_RECEIVED_EVENT,
- new WifiP2pGroup(dataString));
- } else if (dataString.startsWith(P2P_INVITATION_RESULT_STR)) {
- mStateMachine.sendMessage(P2P_INVITATION_RESULT_EVENT, p2pError(dataString));
- } else if (dataString.startsWith(P2P_PROV_DISC_PBC_REQ_STR)) {
- mStateMachine.sendMessage(P2P_PROV_DISC_PBC_REQ_EVENT,
- new WifiP2pProvDiscEvent(dataString));
- } else if (dataString.startsWith(P2P_PROV_DISC_PBC_RSP_STR)) {
- mStateMachine.sendMessage(P2P_PROV_DISC_PBC_RSP_EVENT,
- new WifiP2pProvDiscEvent(dataString));
- } else if (dataString.startsWith(P2P_PROV_DISC_ENTER_PIN_STR)) {
- mStateMachine.sendMessage(P2P_PROV_DISC_ENTER_PIN_EVENT,
- new WifiP2pProvDiscEvent(dataString));
- } else if (dataString.startsWith(P2P_PROV_DISC_SHOW_PIN_STR)) {
- mStateMachine.sendMessage(P2P_PROV_DISC_SHOW_PIN_EVENT,
- new WifiP2pProvDiscEvent(dataString));
- } else if (dataString.startsWith(P2P_PROV_DISC_FAILURE_STR)) {
- mStateMachine.sendMessage(P2P_PROV_DISC_FAILURE_EVENT);
- } else if (dataString.startsWith(P2P_SERV_DISC_RESP_STR)) {
- List<WifiP2pServiceResponse> list = WifiP2pServiceResponse.newInstance(dataString);
- if (list != null) {
- mStateMachine.sendMessage(P2P_SERV_DISC_RESP_EVENT, list);
- } else {
- Log.e(TAG, "Null service resp " + dataString);
- }
+ /**
+ * Handle p2p events
+ */
+ private void handleP2pEvents(String dataString) {
+ if (dataString.startsWith(P2P_DEVICE_FOUND_STR)) {
+ mStateMachine.sendMessage(P2P_DEVICE_FOUND_EVENT, new WifiP2pDevice(dataString));
+ } else if (dataString.startsWith(P2P_DEVICE_LOST_STR)) {
+ mStateMachine.sendMessage(P2P_DEVICE_LOST_EVENT, new WifiP2pDevice(dataString));
+ } else if (dataString.startsWith(P2P_FIND_STOPPED_STR)) {
+ mStateMachine.sendMessage(P2P_FIND_STOPPED_EVENT);
+ } else if (dataString.startsWith(P2P_GO_NEG_REQUEST_STR)) {
+ mStateMachine.sendMessage(P2P_GO_NEGOTIATION_REQUEST_EVENT,
+ new WifiP2pConfig(dataString));
+ } else if (dataString.startsWith(P2P_GO_NEG_SUCCESS_STR)) {
+ mStateMachine.sendMessage(P2P_GO_NEGOTIATION_SUCCESS_EVENT);
+ } else if (dataString.startsWith(P2P_GO_NEG_FAILURE_STR)) {
+ mStateMachine.sendMessage(P2P_GO_NEGOTIATION_FAILURE_EVENT, p2pError(dataString));
+ } else if (dataString.startsWith(P2P_GROUP_FORMATION_SUCCESS_STR)) {
+ mStateMachine.sendMessage(P2P_GROUP_FORMATION_SUCCESS_EVENT);
+ } else if (dataString.startsWith(P2P_GROUP_FORMATION_FAILURE_STR)) {
+ mStateMachine.sendMessage(P2P_GROUP_FORMATION_FAILURE_EVENT, p2pError(dataString));
+ } else if (dataString.startsWith(P2P_GROUP_STARTED_STR)) {
+ mStateMachine.sendMessage(P2P_GROUP_STARTED_EVENT, new WifiP2pGroup(dataString));
+ } else if (dataString.startsWith(P2P_GROUP_REMOVED_STR)) {
+ mStateMachine.sendMessage(P2P_GROUP_REMOVED_EVENT, new WifiP2pGroup(dataString));
+ } else if (dataString.startsWith(P2P_INVITATION_RECEIVED_STR)) {
+ mStateMachine.sendMessage(P2P_INVITATION_RECEIVED_EVENT,
+ new WifiP2pGroup(dataString));
+ } else if (dataString.startsWith(P2P_INVITATION_RESULT_STR)) {
+ mStateMachine.sendMessage(P2P_INVITATION_RESULT_EVENT, p2pError(dataString));
+ } else if (dataString.startsWith(P2P_PROV_DISC_PBC_REQ_STR)) {
+ mStateMachine.sendMessage(P2P_PROV_DISC_PBC_REQ_EVENT,
+ new WifiP2pProvDiscEvent(dataString));
+ } else if (dataString.startsWith(P2P_PROV_DISC_PBC_RSP_STR)) {
+ mStateMachine.sendMessage(P2P_PROV_DISC_PBC_RSP_EVENT,
+ new WifiP2pProvDiscEvent(dataString));
+ } else if (dataString.startsWith(P2P_PROV_DISC_ENTER_PIN_STR)) {
+ mStateMachine.sendMessage(P2P_PROV_DISC_ENTER_PIN_EVENT,
+ new WifiP2pProvDiscEvent(dataString));
+ } else if (dataString.startsWith(P2P_PROV_DISC_SHOW_PIN_STR)) {
+ mStateMachine.sendMessage(P2P_PROV_DISC_SHOW_PIN_EVENT,
+ new WifiP2pProvDiscEvent(dataString));
+ } else if (dataString.startsWith(P2P_PROV_DISC_FAILURE_STR)) {
+ mStateMachine.sendMessage(P2P_PROV_DISC_FAILURE_EVENT);
+ } else if (dataString.startsWith(P2P_SERV_DISC_RESP_STR)) {
+ List<WifiP2pServiceResponse> list = WifiP2pServiceResponse.newInstance(dataString);
+ if (list != null) {
+ mStateMachine.sendMessage(P2P_SERV_DISC_RESP_EVENT, list);
+ } else {
+ Log.e(TAG, "Null service resp " + dataString);
}
}
+ }
- /**
- * Handle hostap events
- */
- private void handleHostApEvents(String dataString) {
- String[] tokens = dataString.split(" ");
- /* AP-STA-CONNECTED 42:fc:89:a8:96:09 p2p_dev_addr=02:90:4c:a0:92:54 */
- if (tokens[0].equals(AP_STA_CONNECTED_STR)) {
- mStateMachine.sendMessage(AP_STA_CONNECTED_EVENT, new WifiP2pDevice(dataString));
+ /**
+ * Handle hostap events
+ */
+ private void handleHostApEvents(String dataString) {
+ String[] tokens = dataString.split(" ");
+ /* AP-STA-CONNECTED 42:fc:89:a8:96:09 p2p_dev_addr=02:90:4c:a0:92:54 */
+ if (tokens[0].equals(AP_STA_CONNECTED_STR)) {
+ mStateMachine.sendMessage(AP_STA_CONNECTED_EVENT, new WifiP2pDevice(dataString));
/* AP-STA-DISCONNECTED 42:fc:89:a8:96:09 p2p_dev_addr=02:90:4c:a0:92:54 */
- } else if (tokens[0].equals(AP_STA_DISCONNECTED_STR)) {
- mStateMachine.sendMessage(AP_STA_DISCONNECTED_EVENT, new WifiP2pDevice(dataString));
- }
+ } else if (tokens[0].equals(AP_STA_DISCONNECTED_STR)) {
+ mStateMachine.sendMessage(AP_STA_DISCONNECTED_EVENT, new WifiP2pDevice(dataString));
}
+ }
- /**
- * Handle the supplicant STATE-CHANGE event
- * @param dataString New supplicant state string in the format:
- * id=network-id state=new-state
- */
- private void handleSupplicantStateChange(String dataString) {
- WifiSsid wifiSsid = null;
- int index = dataString.lastIndexOf("SSID=");
- if (index != -1) {
- wifiSsid = WifiSsid.createFromAsciiEncoded(
- dataString.substring(index + 5));
+ /**
+ * Handle the supplicant STATE-CHANGE event
+ * @param dataString New supplicant state string in the format:
+ * id=network-id state=new-state
+ */
+ private void handleSupplicantStateChange(String dataString) {
+ WifiSsid wifiSsid = null;
+ int index = dataString.lastIndexOf("SSID=");
+ if (index != -1) {
+ wifiSsid = WifiSsid.createFromAsciiEncoded(
+ dataString.substring(index + 5));
+ }
+ String[] dataTokens = dataString.split(" ");
+
+ String BSSID = null;
+ int networkId = -1;
+ int newState = -1;
+ for (String token : dataTokens) {
+ String[] nameValue = token.split("=");
+ if (nameValue.length != 2) {
+ continue;
}
- String[] dataTokens = dataString.split(" ");
-
- String BSSID = null;
- int networkId = -1;
- int newState = -1;
- for (String token : dataTokens) {
- String[] nameValue = token.split("=");
- if (nameValue.length != 2) {
- continue;
- }
-
- if (nameValue[0].equals("BSSID")) {
- BSSID = nameValue[1];
- continue;
- }
-
- int value;
- try {
- value = Integer.parseInt(nameValue[1]);
- } catch (NumberFormatException e) {
- continue;
- }
- if (nameValue[0].equals("id")) {
- networkId = value;
- } else if (nameValue[0].equals("state")) {
- newState = value;
- }
+ if (nameValue[0].equals("BSSID")) {
+ BSSID = nameValue[1];
+ continue;
}
- if (newState == -1) return;
-
- SupplicantState newSupplicantState = SupplicantState.INVALID;
- for (SupplicantState state : SupplicantState.values()) {
- if (state.ordinal() == newState) {
- newSupplicantState = state;
- break;
- }
+ int value;
+ try {
+ value = Integer.parseInt(nameValue[1]);
+ } catch (NumberFormatException e) {
+ continue;
}
- if (newSupplicantState == SupplicantState.INVALID) {
- Log.w(TAG, "Invalid supplicant state: " + newState);
+
+ if (nameValue[0].equals("id")) {
+ networkId = value;
+ } else if (nameValue[0].equals("state")) {
+ newState = value;
}
- notifySupplicantStateChange(networkId, wifiSsid, BSSID, newSupplicantState);
}
- private void handleNetworkStateChange(NetworkInfo.DetailedState newState, String data) {
- String BSSID = null;
- int networkId = -1;
- if (newState == NetworkInfo.DetailedState.CONNECTED) {
- Matcher match = mConnectedEventPattern.matcher(data);
- if (!match.find()) {
- if (DBG) Log.d(TAG, "Could not find BSSID in CONNECTED event string");
- } else {
- BSSID = match.group(1);
- try {
- networkId = Integer.parseInt(match.group(2));
- } catch (NumberFormatException e) {
- networkId = -1;
- }
- }
- notifyNetworkStateChange(newState, BSSID, networkId);
+ if (newState == -1) return;
+
+ SupplicantState newSupplicantState = SupplicantState.INVALID;
+ for (SupplicantState state : SupplicantState.values()) {
+ if (state.ordinal() == newState) {
+ newSupplicantState = state;
+ break;
}
}
+ if (newSupplicantState == SupplicantState.INVALID) {
+ Log.w(TAG, "Invalid supplicant state: " + newState);
+ }
+ notifySupplicantStateChange(networkId, wifiSsid, BSSID, newSupplicantState);
+ }
- /**
- * Send the state machine a notification that the state of Wifi connectivity
- * has changed.
- * @param networkId the configured network on which the state change occurred
- * @param newState the new network state
- * @param BSSID when the new state is {@link DetailedState#CONNECTED
- * NetworkInfo.DetailedState.CONNECTED},
- * this is the MAC address of the access point. Otherwise, it
- * is {@code null}.
- */
- void notifyNetworkStateChange(NetworkInfo.DetailedState newState, String BSSID, int netId) {
- if (newState == NetworkInfo.DetailedState.CONNECTED) {
- Message m = mStateMachine.obtainMessage(NETWORK_CONNECTION_EVENT,
- netId, 0, BSSID);
- mStateMachine.sendMessage(m);
+ private void handleNetworkStateChange(NetworkInfo.DetailedState newState, String data) {
+ String BSSID = null;
+ int networkId = -1;
+ if (newState == NetworkInfo.DetailedState.CONNECTED) {
+ Matcher match = mConnectedEventPattern.matcher(data);
+ if (!match.find()) {
+ if (DBG) Log.d(TAG, "Could not find BSSID in CONNECTED event string");
} else {
- Message m = mStateMachine.obtainMessage(NETWORK_DISCONNECTION_EVENT,
- netId, 0, BSSID);
- mStateMachine.sendMessage(m);
+ BSSID = match.group(1);
+ try {
+ networkId = Integer.parseInt(match.group(2));
+ } catch (NumberFormatException e) {
+ networkId = -1;
+ }
}
+ notifyNetworkStateChange(newState, BSSID, networkId);
}
+ }
- /**
- * Send the state machine a notification that the state of the supplicant
- * has changed.
- * @param networkId the configured network on which the state change occurred
- * @param wifiSsid network name
- * @param BSSID network address
- * @param newState the new {@code SupplicantState}
- */
- void notifySupplicantStateChange(int networkId, WifiSsid wifiSsid, String BSSID,
- SupplicantState newState) {
- mStateMachine.sendMessage(mStateMachine.obtainMessage(SUPPLICANT_STATE_CHANGE_EVENT,
- new StateChangeResult(networkId, wifiSsid, BSSID, newState)));
+ /**
+ * Send the state machine a notification that the state of Wifi connectivity
+ * has changed.
+ * @param newState the new network state
+ * @param BSSID when the new state is {@link NetworkInfo.DetailedState#CONNECTED},
+ * this is the MAC address of the access point. Otherwise, it
+ * is {@code null}.
+ * @param netId the configured network on which the state change occurred
+ */
+ void notifyNetworkStateChange(NetworkInfo.DetailedState newState, String BSSID, int netId) {
+ if (newState == NetworkInfo.DetailedState.CONNECTED) {
+ Message m = mStateMachine.obtainMessage(NETWORK_CONNECTION_EVENT,
+ netId, 0, BSSID);
+ mStateMachine.sendMessage(m);
+ } else {
+ Message m = mStateMachine.obtainMessage(NETWORK_DISCONNECTION_EVENT,
+ netId, 0, BSSID);
+ mStateMachine.sendMessage(m);
}
}
+
+ /**
+ * Send the state machine a notification that the state of the supplicant
+ * has changed.
+ * @param networkId the configured network on which the state change occurred
+ * @param wifiSsid network name
+ * @param BSSID network address
+ * @param newState the new {@code SupplicantState}
+ */
+ void notifySupplicantStateChange(int networkId, WifiSsid wifiSsid, String BSSID,
+ SupplicantState newState) {
+ mStateMachine.sendMessage(mStateMachine.obtainMessage(SUPPLICANT_STATE_CHANGE_EVENT,
+ new StateChangeResult(networkId, wifiSsid, BSSID, newState)));
+ }
}
diff --git a/wifi/java/android/net/wifi/WifiSsid.java b/wifi/java/android/net/wifi/WifiSsid.java
index a35a34b..f8ba95d 100644
--- a/wifi/java/android/net/wifi/WifiSsid.java
+++ b/wifi/java/android/net/wifi/WifiSsid.java
@@ -16,9 +16,8 @@
package android.net.wifi;
-import android.os.Parcelable;
import android.os.Parcel;
-import android.util.Log;
+import android.os.Parcelable;
import java.io.ByteArrayOutputStream;
import java.nio.ByteBuffer;
@@ -42,7 +41,7 @@ import java.util.Locale;
public class WifiSsid implements Parcelable {
private static final String TAG = "WifiSsid";
- public ByteArrayOutputStream octets = new ByteArrayOutputStream(32);
+ public final ByteArrayOutputStream octets = new ByteArrayOutputStream(32);
private static final int HEX_RADIX = 16;
public static final String NONE = "<unknown ssid>";
@@ -58,7 +57,6 @@ public class WifiSsid implements Parcelable {
public static WifiSsid createFromHex(String hexStr) {
WifiSsid a = new WifiSsid();
- int length = 0;
if (hexStr == null) return a;
if (hexStr.startsWith("0x") || hexStr.startsWith("0X")) {
@@ -191,8 +189,13 @@ public class WifiSsid implements Parcelable {
}
/** @hide */
+ public boolean isHidden() {
+ return isArrayAllZeroes(octets.toByteArray());
+ }
+
+ /** @hide */
public byte[] getOctets() {
- return octets.toByteArray();
+ return octets.toByteArray();
}
/** @hide */
diff --git a/wifi/java/android/net/wifi/WifiStateMachine.java b/wifi/java/android/net/wifi/WifiStateMachine.java
index 78da7e7..8c92e55 100644
--- a/wifi/java/android/net/wifi/WifiStateMachine.java
+++ b/wifi/java/android/net/wifi/WifiStateMachine.java
@@ -56,13 +56,11 @@ import android.net.wifi.WpsResult.Status;
import android.net.wifi.p2p.WifiP2pManager;
import android.net.wifi.p2p.WifiP2pService;
import android.os.BatteryStats;
-import android.os.Binder;
import android.os.IBinder;
import android.os.INetworkManagementService;
import android.os.Message;
import android.os.Messenger;
import android.os.PowerManager;
-import android.os.Process;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.SystemClock;
@@ -70,7 +68,6 @@ import android.os.SystemProperties;
import android.os.UserHandle;
import android.os.WorkSource;
import android.provider.Settings;
-import android.util.Log;
import android.util.LruCache;
import android.text.TextUtils;
@@ -86,7 +83,6 @@ import com.android.server.net.BaseNetworkObserver;
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.net.InetAddress;
-import java.net.Inet6Address;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
@@ -304,8 +300,6 @@ public class WifiStateMachine extends StateMachine {
static final int CMD_DELAYED_STOP_DRIVER = BASE + 18;
/* A delayed message sent to start driver when it fail to come up */
static final int CMD_DRIVER_START_TIMED_OUT = BASE + 19;
- /* Ready to switch to network as default */
- static final int CMD_CAPTIVE_CHECK_COMPLETE = BASE + 20;
/* Start the soft access point */
static final int CMD_START_AP = BASE + 21;
@@ -541,8 +535,6 @@ public class WifiStateMachine extends StateMachine {
private State mObtainingIpState = new ObtainingIpState();
/* Waiting for link quality verification to be complete */
private State mVerifyingLinkState = new VerifyingLinkState();
- /* Waiting for captive portal check to be complete */
- private State mCaptivePortalCheckState = new CaptivePortalCheckState();
/* Connected with IP addr */
private State mConnectedState = new ConnectedState();
/* disconnect issued, waiting for network disconnect confirmation */
@@ -779,7 +771,6 @@ public class WifiStateMachine extends StateMachine {
addState(mL2ConnectedState, mConnectModeState);
addState(mObtainingIpState, mL2ConnectedState);
addState(mVerifyingLinkState, mL2ConnectedState);
- addState(mCaptivePortalCheckState, mL2ConnectedState);
addState(mConnectedState, mL2ConnectedState);
addState(mDisconnectingState, mConnectModeState);
addState(mDisconnectedState, mConnectModeState);
@@ -1282,10 +1273,6 @@ public class WifiStateMachine extends StateMachine {
}
}
- public void captivePortalCheckComplete() {
- sendMessage(CMD_CAPTIVE_CHECK_COMPLETE);
- }
-
/**
* TODO: doc
*/
@@ -2464,7 +2451,6 @@ public class WifiStateMachine extends StateMachine {
case CMD_STOP_DRIVER:
case CMD_DELAYED_STOP_DRIVER:
case CMD_DRIVER_START_TIMED_OUT:
- case CMD_CAPTIVE_CHECK_COMPLETE:
case CMD_START_AP:
case CMD_START_AP_SUCCESS:
case CMD_START_AP_FAILURE:
@@ -3746,29 +3732,17 @@ public class WifiStateMachine extends StateMachine {
break;
case WifiWatchdogStateMachine.GOOD_LINK_DETECTED:
log(getName() + " GOOD_LINK_DETECTED: transition to captive portal check");
- transitionTo(mCaptivePortalCheckState);
- break;
- default:
- if (DBG) log(getName() + " what=" + message.what + " NOT_HANDLED");
- return NOT_HANDLED;
- }
- return HANDLED;
- }
- }
+ // Send out a broadcast with the CAPTIVE_PORTAL_CHECK to preserve
+ // existing behaviour. The captive portal check really happens after we
+ // transition into DetailedState.CONNECTED.
+ setNetworkDetailedState(DetailedState.CAPTIVE_PORTAL_CHECK);
+ mWifiConfigStore.updateStatus(mLastNetworkId,
+ DetailedState.CAPTIVE_PORTAL_CHECK);
+ sendNetworkStateChangeBroadcast(mLastBssid);
- class CaptivePortalCheckState extends State {
- @Override
- public void enter() {
- log(getName() + " enter");
- setNetworkDetailedState(DetailedState.CAPTIVE_PORTAL_CHECK);
- mWifiConfigStore.updateStatus(mLastNetworkId, DetailedState.CAPTIVE_PORTAL_CHECK);
- sendNetworkStateChangeBroadcast(mLastBssid);
- }
- @Override
- public boolean processMessage(Message message) {
- switch (message.what) {
- case CMD_CAPTIVE_CHECK_COMPLETE:
- log(getName() + " CMD_CAPTIVE_CHECK_COMPLETE");
+ // NOTE: This might look like an odd place to enable IPV6 but this is in
+ // response to transitioning into GOOD_LINK_DETECTED. Similarly, we disable
+ // ipv6 when we transition into POOR_LINK_DETECTED in mConnectedState.
try {
mNwService.enableIpv6(mInterfaceName);
} catch (RemoteException re) {
@@ -3776,12 +3750,16 @@ public class WifiStateMachine extends StateMachine {
} catch (IllegalStateException e) {
loge("Failed to enable IPv6: " + e);
}
+
+ log(getName() + " GOOD_LINK_DETECTED: transition to CONNECTED");
setNetworkDetailedState(DetailedState.CONNECTED);
mWifiConfigStore.updateStatus(mLastNetworkId, DetailedState.CONNECTED);
sendNetworkStateChangeBroadcast(mLastBssid);
transitionTo(mConnectedState);
+
break;
default:
+ if (DBG) log(getName() + " what=" + message.what + " NOT_HANDLED");
return NOT_HANDLED;
}
return HANDLED;
@@ -3813,6 +3791,7 @@ public class WifiStateMachine extends StateMachine {
}
return HANDLED;
}
+
@Override
public void exit() {
/* Request a CS wakelock during transition to mobile */
diff --git a/wifi/java/android/net/wifi/WifiStateTracker.java b/wifi/java/android/net/wifi/WifiStateTracker.java
index 615c893..7ded171 100644
--- a/wifi/java/android/net/wifi/WifiStateTracker.java
+++ b/wifi/java/android/net/wifi/WifiStateTracker.java
@@ -115,14 +115,6 @@ public class WifiStateTracker extends BaseNetworkStateTracker {
return true;
}
- /**
- * Captive check is complete, switch to network
- */
- @Override
- public void captivePortalCheckComplete() {
- mWifiManager.captivePortalCheckComplete();
- }
-
@Override
public void captivePortalCheckCompleted(boolean isCaptivePortal) {
// not implemented
diff --git a/wifi/java/android/net/wifi/p2p/WifiP2pService.java b/wifi/java/android/net/wifi/p2p/WifiP2pService.java
index 8b07208..25b2270 100644
--- a/wifi/java/android/net/wifi/p2p/WifiP2pService.java
+++ b/wifi/java/android/net/wifi/p2p/WifiP2pService.java
@@ -1092,6 +1092,7 @@ public class WifiP2pService extends IWifiP2pManager.Stub {
@Override
public void exit() {
+ sendP2pDiscoveryChangedBroadcast(false);
sendP2pStateChangedBroadcast(false);
mNetworkInfo.setIsAvailable(false);